LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTggVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KICoKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCiAqIGNvcGllcy4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAogKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCiAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgovKgogKiBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogKiB1bmRlciBwcm9wcmlldGFyeSB0ZXJtcyBiZWZvcmUgQ29weXJpZ2h0IG93bmVyc2hpcCB3YXMgYXNzaWduZWQKICogdG8gdGhlIExpbnV4IEZvdW5kYXRpb24uCiAqLwoKCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgogICAgICAgICAgICAgICAgICAgICAgIFcgTCBBIE4gXyBRIEMgVCBfIFQgTCAuIEMKCiAgT1ZFUlZJRVc6CgogIFRoaXMgc29mdHdhcmUgdW5pdCBob2xkcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdMQU4gVHJhbnNwb3J0IExheWVyLgoKICBUaGUgZnVuY3Rpb25zIGV4dGVybmFsaXplZCBieSB0aGlzIG1vZHVsZSBhcmUgdG8gYmUgY2FsbGVkIE9OTFkgYnkgb3RoZXIKICBXTEFOIG1vZHVsZXMgdGhhdCBwcm9wZXJseSByZWdpc3RlciB3aXRoIHRoZSBUcmFuc3BvcnQgTGF5ZXIgaW5pdGlhbGx5LgoKICBERVBFTkRFTkNJRVM6CgogIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgICAgICAgICAgICAgICAgICAgIEVESVQgSElTVE9SWSBGT1IgRklMRQoKCiAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIGRlc2NyaWJpbmcgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2R1bGUuCiAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KCgogICAkSGVhZGVyJCREYXRlVGltZSQkQXV0aG9yJAoKCiAgd2hlbiAgICAgICAgd2hvICAgICB3aGF0LCB3aGVyZSwgd2h5Ci0tLS0tLS0tLS0gICAgLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjIwMTMtMDgtMTkgICAgcmFqZWt1bWEgQWRkZWQgUk1DIHN1cHBvcnQKMjAxMC0wNy0xMyAgICBjX3NoaW5kZSBGaXhlZCBhbiBpc3N1ZSB3aGVyZSBXQVBJIHJla2V5aW5nIHdhcyBmYWlsaW5nIGJlY2F1c2UgCiAgICAgICAgICAgICAgICAgICAgICBXQUkgZnJhbWUgc2VudCBvdXQgZHVyaW5nIHJla2V5aW5nIGhhZCB0aGUgcHJvdGVjdGVkIGJpdAogICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIDEuCjIwMTAtMDUtMDYgICAgcm5haXIgICBDaGFuZ2VkIG5hbWUgb2YgdmFyaWFibGUgZnJvbSB1c0xsY1R5cGUgdG8gdXNFdGhlclR5cGUKICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWQgZnVuY3Rpb24gbmFtZSBmcm9tIEdldExMQ1R5cGUgdG8gR2V0RXRoZXJUeXBlCiAgICAgICAgICAgICAgICAgICAgICBGaXhlZCA4MDIuMyB0byA4MDIuMTEgZnJhbWUgdHJhbnNsYXRpb24gaXNzdWUgd2hlcmUgdHdvIAogICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgb2YgdGhlIExMQyBoZWFkZXIgd2FzIGdldHRpbmcgb3ZlcndyaXR0ZW4gaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICBub24tUW9zIHBhdGgKMjAxMC0wNS0wNiAgICBybmFpciAgIFJ4QXV0aCBwYXRoIGZpeCBmb3IgbW9kaWZ5aW5nIHRoZSBoZWFkZXIgYmVmb3JlIGV0aGVyCiAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIHJldHJlaXZlZCAoRGV0ZWN0ZWQgd2hpbGUgdGVzdGluZyByZWtleWluZwogICAgICAgICAgICAgICAgICAgICAgaW4gV0FQSSBWb2xhbnMpCjIwMTAtMDItMTkgICAgYmFkICAgICBGaXhlZCA4MDIuMTEgdG8gODAyLjMgZnQgaXNzdWVzIHdpdGggV0FQSQoyMDEwLTAyLTE5ICAgIHJuYWlyICAgV0FQSTogSWYgZnJhbWUgaXMgYSBXQUkgZnJhbWUgaW4gVHhDb25uIGFuZCBUeEF1dGgsIFRMIAogICAgICAgICAgICAgICAgICAgICAgZG9lcyBmcmFtZSB0cmFuc2xhdGlvbi4gCjIwMTAtMDItMDEgICAgcm5haXIgICBXQVBJOiBGaXhlZCBhIGJ1ZyB3aGVyZSB0aGUgdmFsdWUgb2YgdWNJc1dhcGlTdGEgd2FzIG5vdCAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHNldCBpbiB0aGUgVEwgY29udHJvbCBibG9jayBpbiB0aGUgUmVnaXN0ZXJTVEEgZnVuYy4gCjIwMTAtMDEtMDggICAgbHRpICAgICBBZGRlZCBUTCBEYXRhIENhY2hpbmcgCjIwMDktMTEtMDQgICAgcm5haXIgICBXQVBJOiBNb3ZpbmcgY29tbW9uIGZ1bmN0aW9uYWxpdHkgdG8gYSBzZXBlcmF0ZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIFdMQU5UTF9HZXRMTENUeXBlCjIwMDktMTAtMTUgICAgcm5haXIgICBXQVBJOiBGZWF0dXJpemluZyBXQVBJIGNvZGUKMjAwOS0xMC0wOSAgICBybmFpciAgIFdBUEk6IE1vZGlmaWNhdGlvbnMgdG8gYXV0aGVudGljYXRlZCBzdGF0ZSBoYW5kbGluZyBvZiBSeCBkYXRhCjIwMDktMTAtMDYgICAgcm5haXIgICBBZGRpbmcgc3VwcG9ydCBmb3IgV0FQSSAKMjAwOS0wOS0yMiAgICBsdGkgICAgIEFkZCBkZXJlZ2lzdHJhdGlvbiBBUEkgZm9yIG1hbmFnZW1lbnQgY2xpZW50CjIwMDktMDctMTYgICAgcm5haXIgICBUZW1wb3JhcnkgZml4IHRvIGxldCBUTCBmZXRjaCBwYWNrZXRzIHdoZW4gbXVsdGlwbGUgCiAgICAgICAgICAgICAgICAgICAgICBwZWVycyBleGlzdCBpbiBhbiBJQlNTCjIwMDktMDYtMTAgICAgbHRpICAgICBGaXggZm9yIGNoZWNraW5nIFRJRCB2YWx1ZSBvZiBtZXRhIGluZm8gb24gVFggLSBwcmV2ZW50CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgb3ZlcndyaXRlIAogICAgICAgICAgICAgICAgICAgICAgRml4IGZvciBwcm9wZXJseSBjaGVja2luZyB0aGUgc3RhIGlkIGZvciByZXN1bWluZyB0cmlnZ2VyCiAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBnZW5lcmF0aW9uCjIwMDktMDUtMTQgICAgbHRpICAgICBGaXggZm9yIHNlbmRpbmcgb3V0IHRyaWdnZXIgZnJhbWVzCjIwMDktMDUtMTUgICAgbHRpICAgICBBZGRyMyBmaWx0ZXJpbmcgCjIwMDktMDQtMTMgICAgbHRpICAgICBBc3NlcnQgaWYgcGFja2V0IGxhcmdlciB0aGVuIGFsbG93ZWQKICAgICAgICAgICAgICAgICAgICAgIERyb3AgcGFja2V0IHRoYXQgZmFpbHMgZmxhdHRlbgoyMDA5LTA0LTAyICAgIGx0aSAgICAgUGVyZm9ybWFuY2UgZml4ZXMgZm9yIFRMIAoyMDA5LTAyLTE5ICAgIGx0aSAgICAgQWRkZWQgZml4IGZvciBMTEMgbWFuYWdlbWVudCBvbiBSeCBDb25uZWN0IAoyMDA5LTAxLTE2ICAgIGx0aSAgICAgUmVwbGFjZWQgcGVlayBkYXRhIHdpdGggZXh0cmFjdCBkYXRhIGZvciBub24gQkQgb3BlcnRpb25zCiAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0ZWQgZnJhbWUgY29udHJvbCBpbiBUbCBhbmQgcGFzcyB0byBIQUwgZm9yIGZyYW1lIAogICAgICAgICAgICAgICAgICAgICAgdHlwZSBldmFsdWF0aW9uCjIwMDktMDItMDIgICAgc2NoICAgICBBZGQgaGFuZG9mZiBzdXBwb3J0CjIwMDgtMTItMDkgICAgbHRpICAgICBGaXhlcyBmb3IgQU1TUyBjb21waWxhdGlvbiAKICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgYXNzZXJ0IG9uIHJlY2VpdmUgd2hlbiB0aGVyZSBpcyBubyBzdGF0aW9uCjIwMDgtMTItMDIgICAgbHRpICAgICBGaXggZm8gdHJpZ2dlciBmcmFtZSBnZW5lcmF0aW9uIAoyMDA4LTEwLTMxICAgIGx0aSAgICAgRml4IGZvIFRMIHR4IHN1c3BlbmQKMjAwOC0xMC0wMSAgICBsdGkgICAgIE1lcmdlZCBpbiBmaXhlcyBmcm9tIHJlb3JkZXJpbmcKICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVkIHBhcnQgb2YgVUFQU0QgZnVuY3Rpb25hbGl0eSBpbiBUTAogICAgICAgICAgICAgICAgICAgICAgKHdpbGwgYmUgcmUtZW5hYmxlZCBvbmNlIFVBUFNEIGlzIHRlc3RlZCkKICAgICAgICAgICAgICAgICAgICAgIEZpeCBmb3IgVUFQU0QgbXVsdGlwbGUgZW5hYmxlCjIwMDgtMDgtMTAgICAgbHRpICAgICBGaXhlcyBmb2xsb3dpbmcgVUFQU0QgdGVzdGluZwogICAgICAgICAgICAgICAgICAgICAgRml4ZWQgaW5maW5pdGUgbG9vcCBvbiBtYXNrIGNvbXB1dGF0aW9uIHdoZW4gU1RBIG5vIHJlZwoyMDA4LTA4LTA2ICAgIGx0aSAgICAgRml4ZXMgYWZ0ZXIgUU9TIHVuaXQgdGVzdGluZwoyMDA4LTA4LTA2ICAgIGx0aSAgICAgQWRkZWQgUU9TIHN1cHBvcnQKMjAwOC0wNy0yMyAgICBsdGkgICAgIEZpeCBmb3Igdm9zIHBhY2tldCBkcmFpbmluZwoyMDA4LTA3LTE3ICAgIGx0aSAgICAgRml4IGZvciBkYXRhIHR5cGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGZyYW1lIHRyYW5zbGF0aW9uIGNvZGUgaW4gVEwKICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHJldHVybmluZyBmYWlsdXJlIHRvIFBFIGluIGNhc2UgcHJldmlvdXMgZnJhbWUgaXMKICAgICAgICAgICAgICAgICAgICAgIHN0aWxsIHBlbmRpbmc7IGZhaWwgcHJldmlvdXMgYW5kIGNhY2hlIG5ldyBvbmUgZm9yIHR4CiAgICAgICAgICAgICAgICAgICAgICBHZXQgZnJhbWVzIHJldHVybmluZyBib29sZWFuIHRydWUgaWYgbW9yZSBmcmFtZXMgYXJlIHBlbmRpbmcKMjAwOC0wNy0wMyAgICBsdGkgICAgIEZpeGVzIGZvbGxvd2luZyBwcmUtaW50ZWdyYXRpb24gdGVzdGluZwoyMDA4LTA2LTI2ICAgIGx0aSAgICAgRml4ZXMgZm9sbG93aW5nIHVuaXQgdGVzdGluZwogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgYWxsb2MgYW5kIGZyZWUgZm9yIFRMIGNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgIFVzaW5nIGF0b21pYyBzZXQgdTggaW5zdGVhZCBvZiB1MzIKMjAwOC0wNS0xNiAgICBsdGkgICAgIENyZWF0ZWQgbW9kdWxlCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEluY2x1ZGUgRmlsZXMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3dkYS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsaS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsaV9iYS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsX2hvc3VwcG9ydC5oIgojaW5jbHVkZSAidm9zX3R5cGVzLmgiCiNpbmNsdWRlICJ2b3NfdHJhY2UuaCIKI2luY2x1ZGUgIndsYW5fcWN0X3RsX3RyYWNlLmgiCiNpbmNsdWRlICJ0bERlYnVnLmgiCiNpbmNsdWRlICJjZmdBcGkuaCIKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCi8qSW5jbHVkZWQgdG8gYWNjZXNzIFdESV9SeEJkVHlwZSAqLwojaW5jbHVkZSAid2xhbl9xY3Rfd2RpX2JkLmgiCiNlbmRpZgovKkVuYWJsZXMgZGVidWdnaW5nIGJlaGF2aW9yIGluIFRMKi8KI2RlZmluZSBUTF9ERUJVRwovKkVuYWJsZXMgZGVidWdnaW5nIEZDIGNvbnRyb2wgZnJhbWUgaW4gVEwqLwovLyNkZWZpbmUgVExfREVCVUdfRkMKLy8jZGVmaW5lIFdMQU5fU09GVEFQX0ZMT1dDVFJMX0VOCi8vI2RlZmluZSBCVEFNUF9URVNUCiNpZmRlZiBUTF9ERUJVR19GQwojaW5jbHVkZSA8d2xhbl9xY3RfcGFsX3N0YXR1cy5oPgojaW5jbHVkZSA8d2xhbl9xY3RfcGFsX2RldmljZS5oPiAvLyB3cGFsUmVhZFJlZ2lzdGVyCiNlbmRpZgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucyBhbmQgQ29uc3RhbnRzCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKkxMQyBoZWFkZXIgdmFsdWUqLwpzdGF0aWMgdl9VOF90IFdMQU5UTF9MTENfSEVBREVSW10gPSAgezB4QUEsIDB4QUEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFCi8qQWlyb25ldCBTTkFQIGhlYWRlciB2YWx1ZSovCnN0YXRpYyB2X1U4X3QgV0xBTlRMX0FJUk9ORVRfU05BUF9IRUFERVJbXSA9ICB7MHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMCB9OwojZW5kaWYgLy9GRUFUVVJFX1dMQU5fRVNFCgovKkJULUFNUCBwYWNrZXQgTExDIE9VSSB2YWx1ZSovCmNvbnN0IHZfVThfdCBXTEFOVExfQlRfQU1QX09VSVtdID0gIHsweDAwLCAweDE5LCAweDU4IH07CgojaWZkZWYgV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMKZXh0ZXJuIGNvbnN0IHZfVThfdCAgV0xBTlRMX1RJRF8yX0FDW1dMQU5fTUFYX1RJRF07CgojZW5kaWYKCiNkZWZpbmUgV0xBTlRMX01BWF9TTlJfREFUQV9TQU1QTEVTIDIwCgojaWZkZWYgVk9MQU5TX1BFUkYKI2RlZmluZSBXTEFOVExfQkRfUERVX0lOVEVSUlVQVF9FTkFCTEVfVEhSRVNIT0xEICAxMjAKI2RlZmluZSBXTEFOVExfQkRfUERVX0lOVEVSUlVQVF9HRVRfVEhSRVNIT0xEICAxMjAKCi8qIFRMIEJEL1BEVSB0aHJlc2hvbGQgdG8gZW5hYmxlIGludGVycnVwdCAqLwppbnQgYmRQZHVJbnRlcnJ1cHRFbmFibGVUaHJlc2hvbGQgPSBXTEFOVExfQkRfUERVX0lOVEVSUlVQVF9FTkFCTEVfVEhSRVNIT0xEOwppbnQgYmRQZHVJbnRlcnJ1cHRHZXRUaHJlc2hvbGQgPSBXTEFOVExfQkRfUERVX0lOVEVSUlVQVF9HRVRfVEhSRVNIT0xEOwojZW5kaWYgLyogVk9MQU5TX1BFUkYgKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCiB8ICAgVHlwZSgyYikgICB8ICAgICBTdWItdHlwZSg0YikgICB8CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojZGVmaW5lIFdMQU5UTF9JU19EQVRBX0ZSQU1FKF90eXBlX3N1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAoIFdMQU5UTF9EQVRBX0ZSQU1FX1RZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4MzAgKSkKCiNkZWZpbmUgV0xBTlRMX0lTX1FPU19EQVRBX0ZSQU1FKF90eXBlX3N1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgKCggV0xBTlRMX0RBVEFfRlJBTUVfVFlQRSA9PSAoIChfdHlwZV9zdWIpICYgMHgzMCApKSAmJiAgICAgXAogICAgICAgICAgICAgICAgICAgICAgKCBXTEFOVExfODAyMTFfREFUQV9RT1NfU1VCVFlQRSA9PSAoIChfdHlwZV9zdWIpICYgMHhGICkpKSAKCiNkZWZpbmUgV0xBTlRMX0lTX01HTVRfRlJBTUUoX3R5cGVfc3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICggV0xBTlRMX01HTVRfRlJBTUVfVFlQRSA9PSAoIChfdHlwZV9zdWIpICYgMHgzMCApKQoKI2RlZmluZSBXTEFOVExfSVNfTUdNVF9BQ1RJT05fRlJBTUUoX3R5cGVfc3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgKCggV0xBTlRMX01HTVRfRlJBTUVfVFlQRSA9PSAoIChfdHlwZV9zdWIpICYgMHgzMCApKSAmJiAgICBcCiAgICAgKCAoIFdMQU5UTF84MDIxMV9NR01UX0FDVElPTl9TVUJUWVBFID09ICggKF90eXBlX3N1YikgJiAweEYgKSkgfHwgXAogICAgICAgKCBXTEFOVExfODAyMTFfTUdNVF9BQ1RJT05fTk9fQUNLX1NVQlRZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4RiApKSkpCgojZGVmaW5lIFdMQU5UTF9JU19QUk9CRV9SRVEoX3R5cGVfc3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICggV0xBTlRMX01HTVRfUFJPQkVfUkVRX0ZSQU1FX1RZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4M0YgKSkKCiNkZWZpbmUgV0xBTlRMX0lTX0NUUkxfRlJBTUUoX3R5cGVfc3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICggV0xBTlRMX0NUUkxfRlJBTUVfVFlQRSA9PSAoIChfdHlwZV9zdWIpICYgMHgzMCApKQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiNkZWZpbmUgV0xBTlRMX0lTX1RETFNfRlJBTUUoX2V0aF90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICggV0xBTlRMX0xMQ19URExTX1RZUEUgPT0gKCBfZXRoX3R5cGUpKQojZW5kaWYKCi8qTUFYIEFsbG93ZWQgbGVuIHByb2Nlc3NlZCBieSBUTCAtIE1BeCBNVFUgKyA4MDIuMyBoZWFkZXIgKyBCRCtEWEUrWFRMKi8KI2RlZmluZSBXTEFOVExfTUFYX0FMTE9XRURfTEVOICAgICgxNTE0ICsgMTAwKQoKI2RlZmluZSBXTEFOVExfREFUQV9GTE9XX01BU0sgMHgwRgoKLy9zb21lIGZsb3dfY29udHJvbCBkZWZpbmUKLy9MV00gbW9kZSB3aWxsIGJlIGVuYWJsZWQgZm9yIHRoaXMgc3RhdGlvbiBpZiB0aGUgZWdyZXNzL2luZ3Jlc3MgZmFsbHMgYmVsb3cgdGhpcyByYXRpbwojZGVmaW5lIFdMQU5UTF9MV01fRUdSRVNTX0lOR1JFU1NfVEhSRVNIT0xEICgwLjc1KQoKLy9HZXQgZW5vdWdoIHNhbXBsZSB0byBkbyB0aGUgTFdNIHJlbGF0ZWQgY2FsY3VsYXRpb24KI2RlZmluZSBXTEFOVExfTFdNX0lOR1JFU1NfU0FNUExFX1RIUkVTSE9MRCAoNjQpCgovL01heGltYWwgb24tZmx5IHBhY2tldCBwZXIgc3RhdGlvbiBpbiBMV00gbW9kZQojZGVmaW5lIFdMQU5UTF9TVEFfQk1VX1RIUkVTSE9MRF9NQVggKDI1NikKCiNkZWZpbmUgV0xBTlRMX0FDX01BU0sgKDB4NykKI2RlZmluZSBXTEFOVExfU1RBSURfT0ZGU0VUICgweDYpCgovKiBVSU5UMzIgdHlwZSBlbmRpYW4gc3dhcCAqLwojZGVmaW5lIFNXQVBfRU5ESUFOX1VJTlQzMihhKSAgICAgICAgICAoKGEpID0gKChhKSA+PiAweDE4ICkgfCgoKGEpICYgMHhGRjAwMDApID4+IDB4MDgpIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGEpICYgMHhGRjAwKSA8PCAweDA4KSAgfCAoKChhKSAmIDB4RkYpIDw8IDB4MTgpKQoKLyogTWF4aW11bSB2YWx1ZSBvZiBTTlIgdGhhdCBjYW4gYmUgY2FsY3VsYXRlZCBieSB0aGUgSFcgKi8KI2RlZmluZSBXTEFOVExfTUFYX0hXX1NOUiAzNQoKI2RlZmluZSBESVNBQkxFX0FSUF9UT0dHTEUgMAojZGVmaW5lIEVOQUJMRV9BUlBfVE9HR0xFICAxCiNkZWZpbmUgU0VORF9BUlBfT05fV1E1ICAgIDIKCiNkZWZpbmUgV0xBTlRMX1JBVEVfUkFUSU9fVEhSRVNIT0xEIDIKI2RlZmluZSBXTEFOVExfUEVSX1RIUkVTSE9MRCA1CiNkZWZpbmUgV0xBTlRMX1FVRVVFX1RIUkVTSE9MRCA2MAojZGVmaW5lIFdMQU5UTF9HT09EX1NUQV9XRUlHSFQgMQojZGVmaW5lIFdMQU5UTF9XRUlHSFRfVEhSRVNIT0xEIDUwCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogVHlwZSBEZWNsYXJhdGlvbnMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNkZWZpbmUgVExfTElUVExFX0JJVF9FTkRJQU4KCnR5cGVkZWYgc3RydWN0CnsKCgogICB2X1U4X3QgcHJvdFZlciA6MjsKICAgdl9VOF90IHR5cGUgOjI7CiAgIHZfVThfdCBzdWJUeXBlIDo0OwoKICAgdl9VOF90IHRvRFMgOjE7CiAgIHZfVThfdCBmcm9tRFMgOjE7CiAgIHZfVThfdCBtb3JlRnJhZyA6MTsKICAgdl9VOF90IHJldHJ5IDoxOwogICB2X1U4X3QgcG93ZXJNZ210IDoxOwogICB2X1U4X3QgbW9yZURhdGEgOjE7CiAgIHZfVThfdCB3ZXAgOjE7CiAgIHZfVThfdCBvcmRlciA6MTsKCgp9IFdMQU5UTF9NQUNGQ1R5cGU7CgovKiA4MDIuMTEgaGVhZGVyICovCnR5cGVkZWYgc3RydWN0CnsKIC8qIEZyYW1lIGNvbnRyb2wgZmllbGQgKi8KIFdMQU5UTF9NQUNGQ1R5cGUgIHdGcm1DdHJsOwoKIC8qIER1cmF0aW9uIElEICovCiB2X1UxNl90ICB1c0R1cmF0aW9uSWQ7CgogLyogQWRkcmVzcyAxIGZpZWxkICAqLwogdl9VOF90ICAgdkExW1ZPU19NQUNfQUREUl9TSVpFXTsKCiAvKiBBZGRyZXNzIDIgZmllbGQgKi8KIHZfVThfdCAgIHZBMltWT1NfTUFDX0FERFJfU0laRV07CgogLyogQWRkcmVzcyAzIGZpZWxkICovCiB2X1U4X3QgICB2QTNbVk9TX01BQ19BRERSX1NJWkVdOwoKIC8qIFNlcXVlbmNlIGNvbnRyb2wgZmllbGQgKi8KIHZfVTE2X3QgIHVzU2VxQ3RybDsKCiAvLyBGaW5kIHRoZSBzaXplIG9mIHRoZSBtYW5kYXRvcnkgaGVhZGVyIHNpemUuCiNkZWZpbmUgV0xBTjgwMjExX01BTkRBVE9SWV9IRUFERVJfU0laRSBcCiAgICAoc2l6ZW9mKFdMQU5UTF9NQUNGQ1R5cGUpICsgc2l6ZW9mKHZfVTE2X3QpICsgXAogICAgKDMgKiAoc2l6ZW9mKHZfVThfdCkgKiBWT1NfTUFDX0FERFJfU0laRSkpICArIFwKICAgIHNpemVvZih2X1UxNl90KSkKCiAvKiBPcHRpb25hbCBBNCBhZGRyZXNzICovCiB2X1U4X3QgICBvcHR2QTRbVk9TX01BQ19BRERSX1NJWkVdOwoKIC8qIE9wdGlvbmFsIFFPUyBjb250cm9sIGZpZWxkICovCiB2X1UxNl90ICB1c1Fvc0N0cmw7Cn1XTEFOVExfODAyMTFIZWFkZXJUeXBlOwoKLyogODAyLjMgaGVhZGVyICovCnR5cGVkZWYgc3RydWN0CnsKIC8qIERlc3RpbmF0aW9uIGFkZHJlc3MgZmllbGQgKi8KIHZfVThfdCAgIHZEQVtWT1NfTUFDX0FERFJfU0laRV07CgogLyogU291cmNlIGFkZHJlc3MgZmllbGQgKi8KIHZfVThfdCAgIHZTQVtWT1NfTUFDX0FERFJfU0laRV07CgogLyogTGVuZ3RoIGZpZWxkICovCiB2X1UxNl90ICB1c0xlblR5cGU7Cn1XTEFOVExfODAyM0hlYWRlclR5cGU7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNkZWZpbmUgV0xBTl9UTF9JTlZBTElEX1VfU0lHIDI1NQojZGVmaW5lIFdMQU5fVExfSU5WQUxJRF9CX1NJRyAyNTUKI2RlZmluZSBFTlRFUigpIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICJFbnRlcjolcyIsIF9fZnVuY19fKQoKI2RlZmluZSBXTEFOX1RMX0FDX0FSUkFZXzJfTUFTSyggX3BTVEEsIF91Y0FDTWFzaywgaSApIFwKICBkb1wKICB7XAogICAgX3VjQUNNYXNrID0gMDsgXAogICAgZm9yICggaSA9IDA7IGkgPCBXTEFOVExfTlVNX1RYX1FVRVVFUzsgaSsrICkgXAogICAgeyBcCiAgICAgIGlmICggMCAhPSAoX3BTVEEpLT5hdWNBQ01hc2tbaV0gKSBcCiAgICAgIHsgXAogICAgICAgIF91Y0FDTWFzayB8PSAoIDEgPDwgaSApOyBcCiAgICAgIH0gXAogICAgfSBcCiAgfSB3aGlsZSAoMCk7CgoKLyogRm9sbG93aW5nIGlzIHRoZSBjb3B5IG9mIGcxMWJSYXRlSW5mbyB0byB1bmRlcnN0YW5kIHJhdGUgaW5kZXggYXQgVEwgKi8KI2RlZmluZSBXTEFOVExfTUFYX1JBVEVfTlVNICAgICAgICAgICAgICAgMTM3CnR5cGVkZWYgc3RydWN0CnsKICAgdWludDMyIHBoeVJhdGU7ICAgLy91bml0IGluIE1lZ2EgYml0cyBwZXIgc2VjIFggMTAKICAgdWludDMyIHRwdXRSYXRlOyAgLy91bml0IGluIE1lZ2EgYml0cyBwZXIgc2VjIFggMTAKICAgdWludDMyIHRwdXRCcG1zOyAgLy91bml0IGluIEJ5dGVzIHBlciBtc2VjID0gKHRwdXRSYXRlWDEwMjR4MTAyNCkvKDh4MTBYMTAwMCkgfj0gKHRwdXRSYXRlKjEzKQogICB1aW50MzIgdHB1dEJwdXM7ICAvL3VuaXQgaW4gQnl0ZXMgcGVyIHVzZWM6IHJvdW5kIG9mZiB0byBpbnRlZ3JhbCB2YWx1ZQp9V0xBTlRMX1JhdGVJbmZvOwoKV0xBTlRMX1JhdGVJbmZvIGdUTFJhdGVJbmZvW1dMQU5UTF9NQVhfUkFURV9OVU1dICA9IHsKICAgIC8vMTFiIHJhdGVzCiAgICB7ICAxMCwgIDksICAxMTcsIDB9LCAvL2luZGV4IDAKICAgIHsgIDIwLCAgMTcsIDIyMSwgMH0sIC8vaW5kZXggMQogICAgeyAgNTUsICA0MSwgNTMzLCAwfSwgLy9pbmRleCAyCiAgICB7IDExMCwgIDY4LCA4ODQsIDB9LCAvL2luZGV4IDMKCiAgICAvLzExYiBzaG9ydCBwcmVhbWJsZQogICAgeyAgMTAsICAxMCwgIDEzMCwgMH0sIC8vaW5kZXggNAogICAgeyAgMjAsICAxOCwgIDIzNCwgMH0sIC8vaW5kZXggNQogICAgeyAgNTUsICA0NCwgIDU3MiwgMH0sIC8vaW5kZXggNgogICAgeyAxMTAsICA3NywgMTAwMSwgMH0sIC8vaW5kZXggNwoKICAgIC8vMTFhZwogICAgeyAgNjAsICA1MCwgIDY1MCwgMX0sIC8vaW5kZXggOAogICAgeyAgOTAsICA3MCwgIDkxMCwgMX0sIC8vaW5kZXggOQogICAgeyAxMjAsIDEwMCwgMTMwMCwgMX0sIC8vaW5kZXggMTAKICAgIHsgMTgwLCAxNTAsIDE5NTAsIDJ9LCAvL2luZGV4IDExCiAgICB7IDI0MCwgMTkwLCAyNDcwLCAyfSwgLy9pbmRleCAxMgogICAgeyAzNjAsIDI4MCwgMzY0MCwgNH0sIC8vaW5kZXggMTMKICAgIHsgNDgwLCAzNTAsIDQ1NTAsIDV9LCAvL2luZGV4IDE0CiAgICB7IDU0MCwgMzgwLCA0OTQwLCA2fSwgLy9pbmRleCAxNQoKICAgIC8vMTFuIFNJTU8KICAgIHsgIDY1LCAgNTQsICA3MDIsIDF9LCAvL2luZGV4IDE2CiAgICB7IDEzMCwgMTA4LCAxNDA0LCAxfSwgLy9pbmRleCAxNwogICAgeyAxOTUsIDE2MSwgMjA5MywgMn0sIC8vaW5kZXggMTgKICAgIHsgMjYwLCAyMTcsIDI4MjEsIDN9LCAvL2luZGV4IDE5CiAgICB7IDM5MCwgMzI2LCA0MjM4LCA0fSwgLy9pbmRleCAyMAogICAgeyA1MjAsIDQzNSwgNTY1NSwgNn0sIC8vaW5kZXggMjEKICAgIHsgNTg1LCA0OTIsIDYzOTYsIDZ9LCAvL2luZGV4IDIyCiAgICB7IDY1MCwgNTQ4LCA3MTI0LCA3fSwgLy9pbmRleCAyMwoKICAgIC8vMTFuIFNJTU8gU0dJCiAgICB7ICA3MiwgIDU5LCAgNzY3LCAxfSwgLy9pbmRleCAyNAogICAgeyAxNDQsIDExOCwgMTUzNCwgMn0sIC8vaW5kZXggMjUKICAgIHsgMjE3LCAxODAsIDIzNDAsIDJ9LCAvL2luZGV4IDI2CiAgICB7IDI4OSwgMjQzLCAzMTU5LCAzfSwgLy9pbmRleCAyNwogICAgeyA0MzQsIDM2MywgNDcxOSwgNX0sIC8vaW5kZXggMjgKICAgIHsgNTc4LCA0ODYsIDYzMTgsIDZ9LCAvL2luZGV4IDI5CiAgICB7IDY1MCwgNTQ4LCA3MTI0LCA3fSwgLy9pbmRleCAzMAogICAgeyA3MjIsIDYwNiwgNzg3OCwgOH0sIC8vaW5kZXggMzEKCiAgICAvLzExbiBHRiBTSU1PCiAgICB7ICA2NSwgIDU0LCAgNzAyLCAxfSwgLy9pbmRleCAzMgogICAgeyAxMzAsIDEwOCwgMTQwNCwgMX0sIC8vaW5kZXggMzMKICAgIHsgMTk1LCAxNjEsIDIwOTMsIDJ9LCAvL2luZGV4IDM0CiAgICB7IDI2MCwgMjE3LCAyODIxLCAzfSwgLy9pbmRleCAzNQogICAgeyAzOTAsIDMyNiwgNDIzOCwgNH0sIC8vaW5kZXggMzYKICAgIHsgNTIwLCA0MzUsIDU2NTUsIDZ9LCAvL2luZGV4IDM3CiAgICB7IDU4NSwgNDkyLCA2Mzk2LCA2fSwgLy9pbmRleCAzOAogICAgeyA2NTAsIDU0OCwgNzEyNCwgN30sIC8vaW5kZXggMzkKCiAgICAvLzExbiBTSU1PIENCIE1DUyAwIC0gNwogICAgeyAxMzUsICAgMTEwLCAgMTQzMCwgIDF9LCAvL2luZGV4IDQwCiAgICB7IDI3MCwgICAyMjMsICAyODk5LCAgM30sIC8vaW5kZXggNDEKICAgIHsgNDA1LCAgIDMzNywgIDQzODEsICA0fSwgLy9pbmRleCA0MgogICAgeyA1NDAsICAgNDU0LCAgNTkwMiwgIDZ9LCAvL2luZGV4IDQzCiAgICB7IDgxMCwgICA2NzksICA4ODI3LCAgOX0sIC8vaW5kZXggNDQKICAgIHsgMTA4MCwgIDkwOSwgMTE4MTcsIDEyfSwgLy9pbmRleCA0NQogICAgeyAxMjE1LCAxMDIyLCAxMzI4NiwgMTN9LCAvL2luZGV4IDQ2CiAgICB7IDEzNTAsIDExMzcsIDE0NzgxLCAxNX0sIC8vaW5kZXggNDcKCiAgICAvLzExbiBTSU1PIENCIFNHSSBNQ1MgMCAtIDcKICAgIHsgMTUwLCAgIDEyMSwgIDE1NzMsICAyfSwgLy9pbmRleCA0OAogICAgeyAzMDAsICAgMjQ5LCAgMzIzNywgIDN9LCAvL2luZGV4IDQ5CiAgICB7IDQ1MCwgICAzNzgsICA0OTE0LCAgNX0sIC8vaW5kZXggNTAKICAgIHsgNjAwLCAgIDUwMywgIDY1MzksICA3fSwgLy9pbmRleCA1MQogICAgeyA5MDAsICAgNzU4LCAgOTg1NCwgIDEwfSwgLy9pbmRleCA1MgogICAgeyAxMjAwLCAxMDEwLCAxMzEzMCwgMTN9LCAvL2luZGV4IDUzCiAgICB7IDEzNTAsIDExMzcsIDE0NzgxLCAxNX0sIC8vaW5kZXggNTQKICAgIHsgMTUwMCwgMTI2MiwgMTY0MDYsIDE2fSwgLy9pbmRleCA1NQoKICAgIC8vMTFuIFNJTU8gR0YgQ0IgTUNTIDAgLSA3CiAgICB7IDEzNSwgICAxMTAsICAgMTQzMCwgIDF9LCAvL2luZGV4IDU2CiAgICB7IDI3MCwgICAyMjMsICAgMjg5OSwgIDN9LCAvL2luZGV4IDU3CiAgICB7IDQwNSwgICAzMzcsICAgNDM4MSwgIDR9LCAvL2luZGV4IDU4CiAgICB7IDU0MCwgICA0NTQsICAgNTkwMiwgIDZ9LCAvL2luZGV4IDU5CiAgICB7IDgxMCwgICA2NzksICAgODgyNywgIDl9LCAvL2luZGV4IDYwCiAgICB7IDEwODAsICA5MDksICAxMTgxNywgMTJ9LCAvL2luZGV4IDYxCiAgICB7IDEyMTUsIDEwMjIsICAxMzI4NiwgMTN9LCAvL2luZGV4IDYyCiAgICB7IDEzNTAsIDExMzcsICAxNDc4MSwgMTV9LCAvL2luZGV4IDYzCgogICAgLy8xMUFDCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vcmVzZXJ2ZWQgNjQKICAgIHsgMTM1MCwgIDY3NSwgIDg3NzUsICA5fSwgLy9yZXNlcnZlZCA2NQogICAgeyAgIDY1LCAgIDQ1LCAgIDU4NSwgIDF9LCAvL2luZGV4IDY2CiAgICB7ICAxMzAsICAgOTEsICAxMTgzLCAgMX0sIC8vaW5kZXggNjcKICAgIHsgIDE5NSwgIDEzNiwgIDE3NjgsICAyfSwgLy9pbmRleCA2OAogICAgeyAgMjYwLCAgMTgyLCAgMjM2NiwgIDJ9LCAvL2luZGV4IDY5CiAgICB7ICAzOTAsICAyNzMsICAzNTQ5LCAgNH0sIC8vaW5kZXggNzAKICAgIHsgIDUyMCwgIDM2NCwgIDQ3MzIsICA1fSwgLy9pbmRleCA3MQogICAgeyAgNTg1LCAgNDA5LCAgNTMxNywgIDV9LCAvL2luZGV4IDcyCiAgICB7ICA2NTAsICA0NTUsICA1OTE1LCAgNn0sIC8vaW5kZXggNzMKICAgIHsgIDc4MCwgIDU0NiwgIDcwOTgsICA3fSwgLy9pbmRleCA3NAogICAgeyAxMzUwLCAgNjc1LCAgODc3NSwgIDl9LCAvL3Jlc2VydmVkIDc1CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vcmVzZXJ2ZWQgNzYKICAgIHsgMTM1MCwgIDY3NSwgIDg3NzUsICA5fSwgLy9yZXNlcnZlZCA3NwogICAgeyAxMzUwLCAgNjc1LCAgODc3NSwgIDl9LCAvL2luZGV4IDc4CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggNzkKICAgIHsgMTM1MCwgIDY3NSwgIDg3NzUsICA5fSwgLy9pbmRleCA4MAogICAgeyAxMzUwLCAgNjc1LCAgODc3NSwgIDl9LCAvL2luZGV4IDgxCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggODIKICAgIHsgMTM1MCwgIDY3NSwgIDg3NzUsICA5fSwgLy9pbmRleCA4MwogICAgeyAgNjU1LCAgNDU4LCAgNTk1NCwgIDZ9LCAvL2luZGV4IDg0CiAgICB7ICA3MjIsICA1MDUsICA2NTY1LCAgN30sIC8vaW5kZXggODUKICAgIHsgIDg2NiwgIDYwNiwgIDc4NzgsICA4fSwgLy9pbmRleCA4NgogICAgeyAxMzUwLCAgNjc1LCAgODc3NSwgIDl9LCAvL3Jlc2VydmVkIDg3CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vcmVzZXJ2ZWQgODgKICAgIHsgMTM1MCwgIDY3NSwgIDg3NzUsICA5fSwgLy9yZXNlcnZlZCA4OQogICAgeyAgMTM1LCAgIDk0LCAgMTIyMiwgIDF9LCAvL2luZGV4IDkwCiAgICB7ICAyNzAsICAxODksICAyNDU3LCAgMn0sIC8vaW5kZXggOTEKICAgIHsgIDQwNSwgIDI4MywgIDM2NzksICA0fSwgLy9pbmRleCA5MgogICAgeyAgNTQwLCAgMzc4LCAgNDkxNCwgIDV9LCAvL2luZGV4IDkzCiAgICB7ICA4MTAsICA1NjcsICA3MzcxLCAgN30sIC8vaW5kZXggOTQKICAgIHsgMTA4MCwgIDc1NiwgIDk4MjgsIDEwfSwgLy9pbmRleCA5NQogICAgeyAxMjE1LCAgODUwLCAxMTA1MCwgMTF9LCAvL2luZGV4IDk2CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggOTcKICAgIHsgMTM1MCwgIDY3NSwgIDg3NzUsICA5fSwgLy9pbmRleCA5OAogICAgeyAxNjIwLCAgODEwLCAxMDUzMCwgMTF9LCAvL2luZGV4IDk5CiAgICB7IDE4MDAsICA5MDAsIDExNzAwLCAxMn0sIC8vaW5kZXggMTAwCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vcmVzZXJ2ZWQgMTAxCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTAyCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTAzCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTA0CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTA1CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTA2CiAgICB7IDEyMDAsICA4NDAsIDEwOTIwLCAxMX0sIC8vaW5kZXggMTA3CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTA4CiAgICB7IDE1MDAsICA3NTAsICA5NzUwLCAxMH0sIC8vaW5kZXggMTA5CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTEwCiAgICB7IDE4MDAsICA5MDAsIDExNzAwLCAxMn0sIC8vaW5kZXggMTExCiAgICB7IDIwMDAsIDEwMDAsIDEzMDAwLCAxM30sIC8vaW5kZXggMTEyCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTEzCiAgICB7ICAyOTIsICAyMDQsICAyNjUyLCAgM30sIC8vaW5kZXggMTE0CiAgICB7ICA1ODUsICA0MDksICA1MzE3LCAgNX0sIC8vaW5kZXggMTE1CiAgICB7ICA4NzcsICA2MTMsICA3OTY5LCAgOH0sIC8vaW5kZXggMTE2CiAgICB7IDExNzAsICA4MTksIDEwNjQ3LCAxMX0sIC8vaW5kZXggMTE3CiAgICB7IDE3NTUsICA4NzcsIDExNDAxLCAxMX0sIC8vaW5kZXggMTE4CiAgICB7IDIzNDAsIDExNzAsIDE1MjEwLCAxNX0sIC8vaW5kZXggMTE5CiAgICB7IDI2MzIsIDEzMTYsIDE3MTA4LCAxN30sIC8vaW5kZXggMTIwCiAgICB7IDI5MjUsIDE0NjIsIDE5MDA2LCAxOX0sIC8vaW5kZXggMTIxCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTIyCiAgICB7IDM1MTAsIDE3NTUsIDIyODE1LCAyM30sIC8vaW5kZXggMTIzCiAgICB7IDM5MDAsIDE5NTAsIDI1MzUwLCAyNX0sIC8vaW5kZXggMTI0CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vcmVzZXJ2ZWQgMTI1CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTI2CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTI3CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTI4CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTI5CiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTMwCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTMxCiAgICB7IDI5MjUsIDE0NjIsIDE5MDA2LCAxOX0sIC8vaW5kZXggMTMyCiAgICB7IDMyNTAsIDE2MjUsIDIxMTI1LCAyMX0sIC8vaW5kZXggMTMzCiAgICB7IDEzNTAsICA2NzUsICA4Nzc1LCAgOX0sIC8vaW5kZXggMTM0CiAgICB7IDM5MDAsIDE5NTAsIDI1MzUwLCAyNX0sIC8vaW5kZXggMTM1CiAgICB7IDQzMzMsIDIxNjYsIDI4MTU4LCAyOH0gIC8vaW5kZXggMTM2CiB9OwoKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogU3RhdGljIFZhcmlhYmxlIERlZmluaXRpb25zCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFN0YXRpYyBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERlZmluaXRpb25zCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKc3RhdGljIFZPU19TVEFUVVMgCldMQU5UTF9HZXRFdGhlclR5cGUKKAogIHZfVThfdCAgICAgICAgICAgICAgICogYXVjQkRIZWFkZXIsCiAgdm9zX3BrdF90ICAgICAgICAgICAgKiB2b3NEYXRhQnVmZiwKICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW4sCiAgdl9VMTZfdCAgICAgICAgICAgICAgKiB1c0V0aGVyVHlwZQopOwoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBFeHRlcm5hbGl6ZWQgRnVuY3Rpb24gRGVmaW5pdGlvbnMKKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgYW5kIERvY3VtZW50YXRpb24KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgICAgIFdMQU5UTF9GcmVlQ2xpZW50TWVtb3J5CgogIERFU0NSSVBUSU9OCiAgSXQgZnJlZXMgdXAgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gYWxsIHRoZSBTVEEgY2xpZW50cyBpbiBUTENCIGJsb2NrCiAgQ2FuIGJlIGNhbGxlZCBpbnNpZGUgQ2xvc2UsIFN0b3Agb3Igd2hlbiBzb21lIEZBVUxUIG9jY3VycwoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICBJTgogIHBDbGllbnRTVEE6ICAgIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCBjbGllbnQgcG9pbnRlciBhcnJheQoKICBSRVRVUk4gVkFMVUUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdm9pZCBXTEFOVExfRnJlZUNsaWVudE1lbW9yeQooV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEFbV0xBTl9NQVhfU1RBX0NPVU5UXSkKewogICAgdl9VMzJfdCBpID0gMDsKICAgIGZvcihpID0wOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspCiAgICB7CiAgICAgICAgaWYoIE5VTEwgIT0gcENsaWVudFNUQVtpXSApCiAgICAgICAgewogICAgICAgICAgIHZvc19tZW1fZnJlZShwQ2xpZW50U1RBW2ldKTsKICAgICAgICB9CiAgICAgICAgcENsaWVudFNUQVtpXSA9IE5VTEw7CiAgICB9CiAgICByZXR1cm47Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX09wZW4KCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBIREQgYXQgZHJpdmVyIGluaXRpYWxpemF0aW9uLiBUTCB3aWxsIGluaXRpYWxpemUgYWxsIGl0cwogICAgaW50ZXJuYWwgcmVzb3VyY2VzIGFuZCB3aWxsIHdhaXQgZm9yIHRoZSBjYWxsIHRvIHN0YXJ0IHRvIHJlZ2lzdGVyCiAgICB3aXRoIHRoZSBvdGhlciBtb2R1bGVzLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHBUTENvbmZpZzogICAgICBUTCBDb25maWd1cmF0aW9uCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlCiAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX09wZW4KKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIFdMQU5UTF9Db25maWdJbmZvVHlwZSogIHBUTENvbmZpZwopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOyAKICB2X1U4X3QgICAgICAgICAgdWNJbmRleDsgCiAgdEhhbEhhbmRsZSAgICAgIHNtZUNvbnRleHQ7CiAgdl9VMzJfdCBpID0gMDsKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICBWT1NfU1RBVFVTICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwojZW5kaWYKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRU5URVIoKTsKICB2b3NfYWxsb2NfY29udGV4dCggcHZvc0dDdHgsIFZPU19NT0RVTEVfSURfVEwsIAogICAgICAgICAgICAgICAgICAgICh2b2lkKikmcFRMQ2IsIHNpemVvZihXTEFOVExfQ2JUeXBlKSk7CgogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCggTlVMTCA9PSBwVExDYiApIHx8ICggTlVMTCA9PSBwVExDb25maWcgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgICAiV0xBTiBUTDogSW52YWxpZCBpbnB1dCBwb2ludGVyIG9uIFdMQU5UTF9PcGVuIFRMICVwSyBDb25maWcgJXBLIiwgcFRMQ2IsIHBUTENvbmZpZyApKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKiBTZXQgdGhlIGRlZmF1bHQgbG9nIGxldmVsIHRvIFZPU19UUkFDRV9MRVZFTF9FUlJPUiAqLwogIHZvc190cmFjZV9zZXRMZXZlbChWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IpOwoKICBzbWVDb250ZXh0ID0gdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfU01FLCBwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHNtZUNvbnRleHQgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBzbWVDb250ZXh0IiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKiBaZXJvIG91dCB0aGUgbWVtb3J5IHNvIHdlIGFyZSBPSywgd2hlbiBDbGVhbkNCIGlzIGNhbGxlZC4qLwogIHZvc19tZW1femVybygodl9WT0lEX3QgKilwVExDYiwgc2l6ZW9mKFdMQU5UTF9DYlR5cGUpKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENsZWFuIHVwIFRMIGNvbnRyb2wgYmxvY2ssIGluaXRpYWxpemUgYWxsIHZhbHVlcwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfT3BlbiIpKTsKCiAgZm9yICggaSA9MDsgaTxXTEFOX01BWF9TVEFfQ09VTlQ7IGkrKyApCiAgewogICAgICBpZiAoIGkgPCBXTEFOX05PTjMyX1NUQV9DT1VOVCApCiAgICAgIHsKICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW2ldID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKFdMQU5UTF9TVEFDbGllbnRUeXBlKSk7CiAgICAgICAgICAvKiBBbGxvY2F0aW5nIG1lbW9yeSBmb3IgTEVHQUNZIFNUQSBDT1VOVCBzbyBhcyB0byBhdm9pZCByZWdyZXNzaW9uIGlzc3Vlcy4gICovCiAgICAgICAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSApCiAgICAgICAgIHsKICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiV0xBTiBUTDogU3RhQ2xpZW50IGFsbG9jYXRpb24gZmFpbGVkIikpOwogICAgICAgICAgICAgV0xBTlRMX0ZyZWVDbGllbnRNZW1vcnkocFRMQ2ItPmF0bFNUQUNsaWVudHMpOwogICAgICAgICAgICAgdm9zX2ZyZWVfY29udGV4dChwdm9zR0N0eCwgVk9TX01PRFVMRV9JRF9UTCwgcFRMQ2IpOwogICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgICAgICAgfQogICAgICAgICB2b3NfbWVtX3plcm8oKHZfVk9JRF90ICopIHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLCBzaXplb2YoV0xBTlRMX1NUQUNsaWVudFR5cGUpKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW2ldID0gTlVMTDsKICAgICAgfQogIH0KCiAgcFRMQ2ItPnJlb3JkZXJCdWZmZXJQb29sID0gdm9zX21lbV92bWFsbG9jKHNpemVvZihXTEFOVExfUkVPUkRFUl9CVUZGRVJfVCkgKiBXTEFOVExfTUFYX0JBX1NFU1NJT04pOwogIGlmIChOVUxMID09IHBUTENiLT5yZW9yZGVyQnVmZmVyUG9vbCkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIldMQU4gVEw6IFJlb3JkZXIgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkIikpOwogICAgV0xBTlRMX0ZyZWVDbGllbnRNZW1vcnkocFRMQ2ItPmF0bFNUQUNsaWVudHMpOwogICAgdm9zX2ZyZWVfY29udGV4dChwdm9zR0N0eCwgVk9TX01PRFVMRV9JRF9UTCwgcFRMQ2IpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHZvc19tZW1femVybygodl9WT0lEX3QgKilwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2wsIHNpemVvZihXTEFOVExfUkVPUkRFUl9CVUZGRVJfVCkgKiBXTEFOVExfTUFYX0JBX1NFU1NJT04pOwoKICBXTEFOVExfQ2xlYW5DQihwVExDYiwgMCAvKmRvIG5vdCBlbXB0eSovKTsKCiAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOVExfTlVNX1RYX1FVRVVFUyA7IHVjSW5kZXgrKykKICB7CiAgICBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3VjSW5kZXhdID0gcFRMQ29uZmlnLT51Y0FjV2VpZ2h0c1t1Y0luZGV4XTsKICB9CgogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTlRMX01BWF9BQyA7IHVjSW5kZXgrKykKICB7CiAgICBwVExDYi0+dGxDb25maWdJbmZvLnVjUmVvcmRlckFnaW5nVGltZVt1Y0luZGV4XSA9IHBUTENvbmZpZy0+dWNSZW9yZGVyQWdpbmdUaW1lW3VjSW5kZXhdOwogIH0KCiAgLy8gc2NoZWR1bGluZyBpbml0IHRvIGJlIHRoZSBsYXN0IG9uZSBvZiBwcmV2aW91cyByb3VuZAogIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfVk87CiAgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCA9IHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbcFRMQ2ItPnVDdXJTZXJ2ZWRBQ107CiAgcFRMQ2ItPnVjQ3VycmVudFNUQSA9IFdMQU5fTUFYX1NUQV9DT1VOVC0xOwoKICB2b3NfdGltZXJfaW5pdCgmcFRMQ2ItPnR4X2ZyYW1lc190aW1lciwgVk9TX1RJTUVSX1RZUEVfU1csCiAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfU2FtcGxlVHgsICh2b2lkICopcFRMQ2IpOwojaWYgMAogIC8vZmxvdyBjb250cm9sIGZpZWxkIGluaXQKICB2b3NfbWVtX3plcm8oJnBUTENiLT50bEZDSW5mbywgc2l6ZW9mKHRGY1R4UGFyYW1zX3R5cGUpKTsKICAvL2JpdCAwOiBzZXQgKEJkL3BkdSBjb3VudCkgYml0IDE6IHNldCAocmVxdWVzdCBzdGF0aW9uIFBTIGNoYW5nZSBub3RpZmljYXRpb24pCiAgcFRMQ2ItPnRsRkNJbmZvLmZjQ29uZmlnID0gMHgxOwojZW5kaWYKCiAgcFRMQ2ItPnZvc1R4RkNCdWYgPSBOVUxMOwogIHBUTENiLT50bENvbmZpZ0luZm8udU1pbkZyYW1lc1Byb2NUaHJlcyA9CiAgICAgICAgICAgICAgICBwVExDb25maWctPnVNaW5GcmFtZXNQcm9jVGhyZXM7CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBwVExDYi0+dWNUZGxzUGVlckNvdW50ID0gMDsKI2VuZGlmCgogIHBUTENiLT50bENvbmZpZ0luZm8udURlbGF5ZWRUcmlnZ2VyRnJtSW50ID0KICAgICAgICAgICAgICAgIHBUTENvbmZpZy0+dURlbGF5ZWRUcmlnZ2VyRnJtSW50OwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQWxsb2NhdGUgaW50ZXJuYWwgcmVzb3VyY2VzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX3BrdF9nZXRfcGFja2V0KCZwVExDYi0+dm9zRHVtbXlCdWYsIFZPU19QS1RfVFlQRV9SWF9SQVcsIDEsIDEsCiAgICAgICAgICAgICAgICAgICAgIDEvKnRydWUqLyxOVUxMLCBOVUxMKTsKCiAgV0xBTlRMX0luaXRCQVJlb3JkZXJCdWZmZXIocHZvc0dDdHgpOwojaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwogICAvKiBJbml0aWFsaXplIEhhbmRvZmYgc3VwcG9ydCBtb2R1ZQogICAgKiBSU1NJIG1lYXN1cmUgYW5kIFRyYWZmaWMgc3RhdGUgbW9uaXRvcmluZyAqLwogIHN0YXR1cyA9IFdMQU5UTF9IU0luaXQocHZvc0dDdHgpOwogIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiSGFuZG9mZiBzdXBwb3J0IG1vZHVsZSBpbml0IGZhaWwiKSk7CiAgICBXTEFOVExfRnJlZUNsaWVudE1lbW9yeShwVExDYi0+YXRsU1RBQ2xpZW50cyk7CiAgICB2b3NfbWVtX3ZmcmVlKHBUTENiLT5yZW9yZGVyQnVmZmVyUG9vbCk7CiAgICB2b3NfZnJlZV9jb250ZXh0KHB2b3NHQ3R4LCBWT1NfTU9EVUxFX0lEX1RMLCBwVExDYik7CiAgICByZXR1cm4gc3RhdHVzOwogIH0KI2VuZGlmCgojaWZkZWYgV0xBTl9GRUFUVVJFX1JNQwogICBzdGF0dXMgPSBXTEFOVExfUm1jSW5pdChwdm9zR0N0eCk7CiAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCiAgIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJSTUMgbW9kdWxlIGluaXQgZmFpbCIpKTsKICAgIHJldHVybiBzdGF0dXM7CiAgfQojZW5kaWYKCiAgcFRMQ2ItPmlzQk1QUyA9IFZPU19GQUxTRTsKICBwbWNSZWdpc3RlckRldmljZVN0YXRlVXBkYXRlSW5kKCBzbWVDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9Qb3dlclN0YXRlQ2hhbmdlZENCLCBwdm9zR0N0eCApOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX09wZW4gKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1N0YXJ0CgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgSEREIGFzIHBhcnQgb2YgdGhlIG92ZXJhbGwgc3RhcnQgcHJvY2VkdXJlLiBUTCB3aWxsIHVzZSB0aGlzCiAgICBjYWxsIHRvIHJlZ2lzdGVyIHdpdGggQkFMIGFzIGEgdHJhbnNwb3J0IGxheWVyIGVudGl0eS4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlCiAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICAgT3RoZXIgY29kZXMgY2FuIGJlIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGEgQkFMIGZhaWx1cmU7IHNlZSBCQUwgQVBJCiAgICBmb3IgbW9yZSBpbmZvCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1N0YXJ0CigKICB2X1BWT0lEX3QgIHB2b3NHQ3R4CikKewogIFdMQU5UTF9DYlR5cGUqICAgICAgcFRMQ2IgICAgICA9IE5VTEw7CiAgdl9VMzJfdCAgICAgICAgICAgICB1UmVzQ291bnQgPSBXREFfVExJX01JTl9SRVNfREFUQTsKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRU5URVIoKTsKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU3RhcnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlZ2lzdGVyIHdpdGggV0RBIGFzIHRyYW5zcG9ydCBsYXllciBjbGllbnQKICAgIFJlcXVlc3QgcmVzb3VyY2VzIGZvciB0eCBmcm9tIGJ1cwogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOldMQU4gVEw6V0xBTlRMX1N0YXJ0IikpOwoKICB0bFRyYWNlSW5pdCgpOwogIHZvc1N0YXR1cyA9IFdEQV9EU19SZWdpc3RlciggcHZvc0dDdHgsIAogICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9UeENvbXAsIAogICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9SeEZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfR2V0RnJhbWVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfUmVzb3VyY2VDQiwKICAgICAgICAgICAgICAgICAgICAgICAgICBXREFfVExJX01JTl9SRVNfREFUQSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHZvc0dDdHgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICZ1UmVzQ291bnQgKTsgCgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAKICAgICAgICAgICAgICAgIldMQU4gVEw6VEwgZmFpbGVkIHRvIHJlZ2lzdGVyIHdpdGggQkFML1dEQSwgRXJyOiAlZCIsCiAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qIEVuYWJsZSB0cmFuc21pc3Npb24gKi8KICB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT51Y1R4U3VzcGVuZGVkLCAwKTsKICBwVExDYi0+dVJlc0NvdW50ID0gdVJlc0NvdW50OwoKICBpZiAoSVNfRkVBVFVSRV9TVVBQT1JURURfQllfRlcoU0FQX0JVRkZfQUxMT0MpKQogICAgdm9zX3RpbWVyX3N0YXJ0KCZwVExDYi0+dHhfZnJhbWVzX3RpbWVyLCBXTEFOVExfU0FNUExFX0lOVEVSVkFMKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TdGFydCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU3RvcAoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IEhERCB0byBzdG9wIG9wZXJhdGlvbiBpbiBUTCwgYmVmb3JlIGNsb3NlLiBUTCB3aWxsIHN1c3BlbmQgYWxsCiAgICBmcmFtZSB0cmFuc2ZlciBvcGVyYXRpb24gYW5kIHdpbGwgd2FpdCBmb3IgdGhlIGNsb3NlIHJlcXVlc3QgdG8gY2xlYW4gdXAKICAgIGl0cyByZXNvdXJjZXMuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZQogICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TdG9wCigKICB2X1BWT0lEX3QgIHB2b3NHQ3R4CikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgdl9VOF90ICAgICAgdWNJbmRleDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRU5URVIoKTsKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFN0b3AgVEwgYW5kIGVtcHR5IFN0YXRpb24gbGlzdAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfU3RvcCIpKTsKCiAgLyogRGlzYWJsZSB0cmFuc21pc3Npb24gKi8KICB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT51Y1R4U3VzcGVuZGVkLCAxKTsKCiAgaWYgKCBOVUxMICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkKICB7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYpOwogICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgPSBOVUxMOwogIH0KCiAgaWYgKCBOVUxMICE9IHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKQogIHsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmKTsKICAgIHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgPSBOVUxMOwogIH0KCiNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCiAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IFdMQU5UTF9IU1N0b3AocHZvc0dDdHgpKQogIHsKICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAiSGFuZG9mZiBTdXBwb3J0IG1vZHVsZSBzdG9wIGZhaWwiKSk7CiAgfQojZW5kaWYKCiAgIGlmIChWT1NfVElNRVJfU1RBVEVfU1RPUFBFRCAhPQogICAgICAgICAgICAgICAgICB2b3NfdGltZXJfZ2V0Q3VycmVudFN0YXRlKCZwVExDYi0+dHhfZnJhbWVzX3RpbWVyKSkKICAgICAgdm9zX3RpbWVyX3N0b3AoJnBUTENiLT50eF9mcmFtZXNfdGltZXIpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENsZWFuIGNsaWVudCBzdGF0aW9ucwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgdWNJbmRleCsrKQogIHsKICAgIGlmICggTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XSApCiAgICB7CiAgICAgICAgV0xBTlRMX0NsZWFuU1RBKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdLCAxIC8qZW1wdHkgYWxsIHF1ZXVlcyovKTsKICAgIH0KICB9CgoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1N0b3AgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0Nsb3NlCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgSEREIGR1cmluZyBnZW5lcmFsIGRyaXZlciBjbG9zZSBwcm9jZWR1cmUuIFRMIHdpbGwgY2xlYW4gdXAKICAgIGFsbCB0aGUgaW50ZXJuYWwgcmVzb3VyY2VzLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfQ2xvc2UKKAogIHZfUFZPSURfdCAgcHZvc0dDdHgKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICB0SGFsSGFuZGxlIHNtZUNvbnRleHQ7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIEVOVEVSKCk7CiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIERlcmVnaXN0ZXIgZnJvbSBQTUMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBzbWVDb250ZXh0ID0gdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfU01FLCBwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHNtZUNvbnRleHQgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBzbWVDb250ZXh0IiwgX19mdW5jX18pKTsKICAgIC8vIGNvbnRpbnVlIHNvIHRoYXQgd2UgY2FuIGNsZWFudXAgYXMgbXVjaCBhcyBwb3NzaWJsZQogIH0KICBlbHNlCiAgewogICAgcG1jRGVyZWdpc3RlckRldmljZVN0YXRlVXBkYXRlSW5kKCBzbWVDb250ZXh0LCBXTEFOVExfUG93ZXJTdGF0ZUNoYW5nZWRDQiApOwogIH0KCiNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCiAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IFdMQU5UTF9IU0RlSW5pdChwdm9zR0N0eCkpCiAgewogICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICJIYW5kb2ZmIFN1cHBvcnQgbW9kdWxlIERlSW5pdCBmYWlsIikpOwogIH0KI2VuZGlmCgojaWZkZWYgV0xBTl9GRUFUVVJFX1JNQwogIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBXTEFOVExfUm1jRGVJbml0KHB2b3NHQ3R4KSkKICB7CiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgIlJNQyBtb2R1bGUgRGVJbml0IGZhaWwiKSk7CiAgfQojZW5kaWYKCiAgIGlmIChWT1NfVElNRVJfU1RBVEVfUlVOTklORyA9PQogICAgICAgICAgICAgICAgICAgICAgIHZvc190aW1lcl9nZXRDdXJyZW50U3RhdGUoJnBUTENiLT50eF9mcmFtZXNfdGltZXIpKSB7CiAgICAgICAgIHZvc190aW1lcl9zdG9wKCZwVExDYi0+dHhfZnJhbWVzX3RpbWVyKTsKICAgfQogICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfdGltZXJfZGVzdHJveSgmcFRMQ2ItPnR4X2ZyYW1lc190aW1lcikpKSB7CiAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICIlczogQ2Fubm90IGRlYWxsb2NhdGUgVFggZnJhbWVzIHNhbXBsZSB0aW1lciIsIF9fZnVuY19fKSk7CiAgIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENsZWFudXAgVEwgY29udHJvbCBibG9jay4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6IFdMQU5UTF9DbG9zZSIpKTsKICBXTEFOVExfQ2xlYW5DQihwVExDYiwgMSAvKiBlbXB0eSBxdWV1ZXMvbGlzdHMvcGt0cyBpZiBhbnkqLyk7CgogIFdMQU5UTF9GcmVlQ2xpZW50TWVtb3J5KHBUTENiLT5hdGxTVEFDbGllbnRzKTsKCiAgdm9zX21lbV92ZnJlZShwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2wpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRnJlZSBUTCBjb250ZXh0IGZyb20gVk9TUyBnbG9iYWwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NfZnJlZV9jb250ZXh0KHB2b3NHQ3R4LCBWT1NfTU9EVUxFX0lEX1RMLCBwVExDYik7CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9DbG9zZSAqLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJTlRFUkFDVElPTiBXSVRIIEhERAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ29uZmlndXJlU3dGcmFtZVRYWGxhdGlvbkZvckFsbAoKICBERVNDUklQVElPTgogICAgIEZ1bmN0aW9uIHRvIGRpc2FibGUvZW5hYmxlIGZyYW1lIHRyYW5zbGF0aW9uIGZvciBhbGwgYXNzb2NpYXRpb24gc3RhdGlvbnMuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCiAgIElOCiAgICBwdm9zR0N0eDogVk9TIGNvbnRleHQgCiAgICBFbmFibGVGcmFtZVhsYXRpb24gVFJVRSBtZWFucyBlbmFibGUgU1cgdHJhbnNsYXRpb24gZm9yIGFsbCBzdGF0aW9ucy4KICAgIC4KCiAgUkVUVVJOIFZBTFVFCgogICB2b2lkLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQKV0xBTlRMX0NvbmZpZ3VyZVN3RnJhbWVUWFhsYXRpb25Gb3JBbGwKKAogIHZfUFZPSURfdCBwdm9zR0N0eCwgCiAgdl9CT09MX3QgZW5hYmxlRnJhbWVYbGF0aW9uCikKewogIHZfVThfdCB1Y0luZGV4OwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBXTEFOVExfQ2JUeXBlKiBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiAiCiAgICAgICAgICAgIldMQU5UTF9Db25maWd1cmVTd0ZyYW1lVFhYbGF0aW9uRm9yQWxsIikpOwogICAgcmV0dXJuOwogIH0KCiAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgIldMQU5UTF9Db25maWd1cmVTd0ZyYW1lVFhYbGF0aW9uRm9yQWxsOiBDb25maWd1cmUgU1cgZnJhbWVYbGF0aW9uICVkIiwgCiAgICAgIGVuYWJsZUZyYW1lWGxhdGlvbikpOwoKICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5fTUFYX1RJRDsgdWNJbmRleCsrKSAKICB7CiAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF07CiAgICBpZiAoIE5VTEwgIT0gcENsaWVudFNUQSAmJiAwICE9IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICAgIHsKI2lmZGVmIFdMQU5fU09GVEFQX1ZTVEFfRkVBVFVSRQogICAgICAvLyBpZiB0aGlzIHN0YXRpb24gd2FzIG5vdCBhbGxvY2F0ZWQgcmVzb3VyY2VzIHRvIHBlcmZvcm0gSFctYmFzZWQKICAgICAgLy8gVFggZnJhbWUgdHJhbnNsYXRpb24gdGhlbiBmb3JjZSBTVy1iYXNlZCBUWCBmcmFtZSB0cmFuc2xhdGlvbgogICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSBmcmFtZSB0cmFuc2xhdGlvbiBzdXBwbGllZCBieSB0aGUgY2xpZW50CiAgICAgIGlmICghV0RBX0lzSHdGcmFtZVR4VHJhbnNsYXRpb25DYXBhYmxlKHB2b3NHQ3R4LCB1Y0luZGV4KSkKICAgICAgewogICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiA9IDE7CiAgICAgIH0KICAgICAgZWxzZQojZW5kaWYKICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24gPSBlbmFibGVGcmFtZVhsYXRpb247CiAgICB9CiAgfQp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU3RhcnRGb3J3YXJkaW5nCgogIERFU0NSSVBUSU9OCgogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFzayBzZXJpYWxpemF0aW9uIHRocm91Z2ggVFggdGhyZWFkIG9mIHRoZSAgIAogICAgY2FjaGVkIGZyYW1lIGZvcndhcmRpbmcgKGlmIHN0YXRhdGlvbiBoYXMgYmVlbiByZWdpc3RlcmVkIGluIHRoZSBtZWFuIHdoaWxlKSAKICAgIG9yIGZsdXNoaW5nIChpZiBzdGF0aW9uIGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZSB0aW1lKQoKICAgIEluIGNhc2Ugb2YgZm9yd2FyZGluZywgdXBwZXIgbGF5ZXIgaXMgb25seSByZXF1aXJlZCB0byBjYWxsIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCgpCiAgICBhbmQgZG9lc24ndCBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBleHBsaWNpdGx5LiBUTCB3aWxsIGhhbmRsZSB0aGlzIGluc2lkZSAKICAgIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCgpLiAKICAgIAogICAgSW4gY2FzZSBvZiBmbHVzaGluZywgdXBwZXIgbGF5ZXIgaXMgcmVxdWlyZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGV4cGxpY2l0bHkKICAgIAogIERFUEVOREVOQ0lFUwoKICAgIFRMIG11c3QgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGdldHMgY2FsbGVkLgoKICAgCiAgUEFSQU1FVEVSUwoKICAgdWNTVEFJZDogICBzdGF0aW9uIGlkIAoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgogICAgUGxlYXNlIGNoZWNrIHJldHVybiB2YWx1ZXMgb2Ygdm9zX3R4X21xX3NlcmlhbGl6ZS4KCiAgU0lERSBFRkZFQ1RTCiAgICBJZiBUTCB3YXMgYXNrZWQgdG8gcGVyZm9ybSBXTEFOVExfQ2FjaGVTVEFGcmFtZSgpIGluIFdMQU5UTF9SeEZyYW1lcygpLCAKICAgIGVpdGhlciBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQoKSBvciB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIAogICAgd2l0aGluIHJlYXNvbmFibGUgdGltZS4gT3RoZXJ3aXNlLCBUTCB3aWxsIGtlZXAgY2FjaGVkIHZvcyBidWZmZXIgdW50aWwKICAgIG9uZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgYW5kIG1heSBlbmQgdXAgd2l0aCBzeXN0ZW0gYnVmZmVyIGV4aGFzdXRpb24uIAoKICAgIEl0J3MgYW4gdXBwZXIgbGF5ZXIncyByZXNwb25zaWJpbGl0eSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gaW4gY2FzZSBvZgogICAgZmx1c2hpbmcKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKVk9TX1NUQVRVUyAKV0xBTlRMX1N0YXJ0Rm9yd2FyZGluZwooCiAgdl9VOF90IHVjU1RBSWQsCiAgdl9VOF90IHVjVWNhc3RTaWcsIAogIHZfVThfdCB1Y0JjYXN0U2lnIAopCnsKICB2b3NfbXNnX3QgICAgICBzTWVzc2FnZTsKICB2X1UzMl90ICAgICAgICB1RGF0YTsgICAgICAgICAgICAgCiAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwoKICAvKiBTaWduYWwgdGhlIE9TIHRvIHNlcmlhbGl6ZSBvdXIgZXZlbnQgKi8KICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgIlNlcmlhbGl6aW5nIFRMIFN0YXJ0IEZvcndhcmRpbmcgQ2FjaGVkIGZvciBjb250cm9sIFNUQSAlZCIsIAogICAgICAgICAgICAgIHVjU1RBSWQgKTsKCiAgdm9zX21lbV96ZXJvKCAmc01lc3NhZ2UsIHNpemVvZih2b3NfbXNnX3QpICk7CgogIHVEYXRhID0gdWNTVEFJZCB8ICh1Y1VjYXN0U2lnIDw8IDggKSB8ICh1Y0JjYXN0U2lnIDw8IDE2KTsgCiAgc01lc3NhZ2UuYm9keXZhbCA9IHVEYXRhOwogIHNNZXNzYWdlLnR5cGUgICAgPSBXTEFOVExfUlhfRldEX0NBQ0hFRDsKCiAgcmV0dXJuIHZvc19yeF9tcV9zZXJpYWxpemUoVk9TX01RX0lEX1RMLCAmc01lc3NhZ2UpOwoKfSAvKiBXTEFOVExfU3RhcnRGb3J3YXJkaW5nKCkgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9FbmFibGVDYWNoaW5nCgogIERFU0NSSVBUSU9OCgogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGVuYWJsZSBjYWNoaW5nIG9ubHkgd2hlbiBhc3NvYy9yZWFzc29jIHJlcSBpcyBzZW5kLgogICAgdGhhdCBpcyBjYWNoZSBwYWNrZXRzIG9ubHkgZm9yIHN1Y2ggU1RBIElELgoKCiAgREVQRU5ERU5DSUVTCgogICAgVEwgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCgoKICBQQVJBTUVURVJTCgogICBzdGFJZDogICBzdGF0aW9uIGlkCgogIFJFVFVSTiBWQUxVRQoKICAgbm9uZQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQgV0xBTlRMX0VuYWJsZUNhY2hpbmcodl9VOF90IHN0YUlkKQp7CiAgdl9QVk9JRF90IHB2b3NHQ3R4PSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfVEwsTlVMTCk7CiAgV0xBTlRMX0NiVHlwZSogcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiAiCiAgICAgICAgICAgIldMQU5UTF9FbmFibGVDYWNoaW5nIikpOwogICAgcmV0dXJuOwogIH0KICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFJZF0tPmVuYWJsZUNhY2hpbmcgPSAxOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQXNzb2NGYWlsZWQKCiAgREVTQ1JJUFRJT04KCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgUEUgdG8gbm90aWZ5IFRMIHRoYXQgY2FjaGUgbmVlZHMgdG8gZmx1c2hlZCcgCiAgICB3aGVuIGFzc29jaWF0aW9uIGlzIG5vdCBzdWNjZXNzZnVsbHkgY29tcGxldGVkIAoKICAgIEludGVybmFsbHksIFRMIHBvc3QgYSBtZXNzYWdlIHRvIFRYX1RocmVhZCB0byBzZXJpYWxpemUgdGhlIHJlcXVlc3QgdG8gCiAgICBrZWVwIGxvY2stZnJlZSBtZWNoYW5pc20uCgogICAKICBERVBFTkRFTkNJRVMKCiAgICBUTCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KCiAgIAogIFBBUkFNRVRFUlMKCiAgIHVjU1RBSWQ6ICAgc3RhdGlvbiBpZCAKCiAgUkVUVVJOIFZBTFVFCgogICBub25lCiAgIAogIFNJREUgRUZGRUNUUwogICBUaGVyZSBtYXkgYmUgcmFjZSBjb25kaXRpb24gdGhhdCBQRSBjYWxsIHRoaXMgQVBJIGFuZCBzZW5kIGFub3RoZXIgYXNzb2NpYXRpb24KICAgcmVxdWVzdCBpbW1lZGlhdGVseSB3aXRoIHNhbWUgc3RhSWQgYmVmb3JlIFRYX3RocmVhZCBjYW4gcHJvY2VzcyB0aGUgbWVzc2FnZS4KCiAgIFRvIGF2b2lkIHRoaXMsIHdlIG1pZ2h0IG5lZWQgUEUgdG8gd2FpdCBmb3IgVFhfdGhyZWFkIHByb2Nlc3MgdGhlIG1lc3NhZ2UsCiAgIGJ1dCB0aGlzIGlzIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuIAogICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQgV0xBTlRMX0Fzc29jRmFpbGVkKHZfVThfdCBzdGFJZCkKewogIC8vIGZsdXNoaW5nIGZyYW1lcyBhbmQgZm9yd2FyZGluZyBmcmFtZXMgdXNlcyB0aGUgc2FtZSBtZXNzYWdlCiAgLy8gdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgbWVzc2FnZSBpcyBwcm9jZXNzZWQKICAvLyBpZiB0aGUgU1RBIGV4aXN0LCB0aGUgZnJhbWVzIHdpbGwgYmUgZm9yd2FyZGVkCiAgLy8gYW5kIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoZSBmcmFtZXMgd2lsbCBiZSBmbHVzaGVkCiAgLy8gaW4gdGhpcyBjYXNlIHdlIGtub3cgaXQgd29uJ3QgZXhpc3Qgc28gdGhlIERQVSBpbmRleCBzaWduYXR1cmUgdmFsdWVzIGRvbid0IG1hdHRlcgogIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwgVFJBQ0VfQ09ERV9UTF9BU1NPQ19GQUlMRUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YUlkLCAwKSk7CgogIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoV0xBTlRMX1N0YXJ0Rm9yd2FyZGluZyhzdGFJZCwwLDApKSkKICB7CiAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgIiAlcyBmYWlscyB0byBzdGFydCBmb3J3YXJkaW5nIChzdGFJZCAlZCkiLCBfX2Z1bmNfXywgc3RhSWQpOwogIH0KfQoKICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgV0xBTlRMX0ZpbmlzaF9VTEEKCiAgREVTQ1JJUFRJT04KICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgSEREIHRvIG5vdGlmeSBUTCB0byBmaW5pc2ggVXBwZXIgbGF5ZXIgYXV0aGVudGljYXRpb24KICAgICBpbmNhc2UgdGhlIGxhc3QgRUFQT0wgcGFja2V0IGlzIHBlbmRpbmcgaW4gdGhlIFRMIHF1ZXVlLiAKICAgICBUbyBhdm9pZCB0aGUgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBzbWUgc2V0IGtleSBhbmQgdGhlIGxhc3QgRUFQT0wgcGFja2V0IAogICAgIHRoZSBIREQgbW9kdWxlIGNhbGxzIHRoaXMgZnVuY3Rpb24ganVzdCBiZWZvcmUgY2FsbGluZyB0aGUgc21lX1JvYW1TZXRLZXkuCgogIERFUEVOREVOQ0lFUwoKICAgICBUTCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgY2FsbGJhY2tSb3V0aW5lOiAgIEhERCBDYWxsYmFjayBmdW5jdGlvbi4KICAgY2FsbGJhY2tDb250ZXh0IDogSEREIHVzZXJkYXRhIGNvbnRleHQuCgogICBSRVRVUk4gVkFMVUUKCiAgIFZPU19TVEFUVVNfU1VDQ0VTUy9WT1NfU1RBVFVTX0ZBSUxVUkUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KClZPU19TVEFUVVMgV0xBTlRMX0ZpbmlzaF9VTEEoIHZvaWQgKCpjYWxsYmFja1JvdXRpbmUpICh2b2lkICpjYWxsYmFja0NvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYWxsYmFja0NvbnRleHQpCnsKICAgcmV0dXJuIFdEQV9EU19GaW5pc2hVTEEoIGNhbGxiYWNrUm91dGluZSwgY2FsbGJhY2tDb250ZXh0KTsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudAoKICBERVNDUklQVElPTgoKICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBIREQgdG8gcmVnaXN0ZXIgYXMgYSBjbGllbnQgZm9yIGRhdGEgc2VydmljZXMKICAgIHdpdGggVEwuIEhERCB3aWxsIGNhbGwgdGhpcyBBUEkgZm9yIGVhY2ggbmV3IHN0YXRpb24gdGhhdCBpdCBhZGRzLAogICAgdGh1cyBoYXZpbmcgdGhlIGZsZXhpYmlsaXR5IG9mIHJlZ2lzdGVyaW5nIGRpZmZlcmVudCBjYWxsYmFjayBmb3IgZWFjaAogICAgU1RBIGl0IHNlcnZpY2VzLgoKICBERVBFTkRFTkNJRVMKCiAgICBUTCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KCiAgICBSZXN0cmljdGlvbjoKICAgICAgTWFpbiB0aHJlYWQgd2lsbCBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGF0IFR4IGFuZCBSeCB0aHJlYWRzIHRodXMKICAgICAgZ3VhcmFudGVlaW5nIHRoYXQgYSBzdGF0aW9uIHdpbGwgYmUgYWRkZWQgYmVmb3JlIGFueSBkYXRhIGNhbiBiZQogICAgICByZWNlaXZlZCBmb3IgaXQuIChUaGlzIGVuYWJsZXMgVEwgdG8gYmUgbG9jayBmcmVlKQoKICBQQVJBTUVURVJTCgogICBwdm9zR0N0eDogICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHBmblN0QVJ4OiAgICAgICAgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgcmVjZWl2ZSBwYWNrZXQgaGFuZGxlciBmcm9tIEhERAogICBwZm5TVEFUeENvbXA6ICAgIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIHRyYW5zbWl0IGNvbXBsZXRlIGNvbmZpcm1hdGlvbgogICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgZnJvbSBIREQKICAgcGZuU1RBRmV0Y2hQa3Q6ICBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSBwYWNrZXQgcmV0cmlldmFsIHJvdXRpbmUgaW4gSERECiAgIHdTVEFEZXNjVHlwZTogICAgU1RBIERlc2NyaXB0b3IsIGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgbmV3IGFkZGVkIFNUQQoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9SZWdpc3RlclNUQUNsaWVudAooCiAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICBwdm9zR0N0eCwKICBXTEFOVExfU1RBUnhDQlR5cGUgICAgICAgIHBmblNUQVJ4LAogIFdMQU5UTF9UeENvbXBDQlR5cGUgICAgICAgcGZuU1RBVHhDb21wLAogIFdMQU5UTF9TVEFGZXRjaFBrdENCVHlwZSAgcGZuU1RBRmV0Y2hQa3QsCiAgV0xBTl9TVEFEZXNjVHlwZSogICAgICAgICBwd1NUQURlc2NUeXBlLAogIHZfUzdfdCAgICAgICAgICAgICAgICAgICAgcnNzaQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICB2X1U4X3QgICAgdWNUaWQgPSAwOy8qTG9jYWwgdmFyaWFibGUgdG8gY2xlYXIgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXJzIG9mIFNUQSBvbiBhbGwgVElEcyovCiAgdl9VMzJfdCAgIGlzdG9nZ2xlQXJwRW5iID0gMDsKICB0cEFuaVNpckdsb2JhbCBwTWFjOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRU5URVIoKTsKICBpZiAoKCBOVUxMID09IHB3U1RBRGVzY1R5cGUgKSB8fCAoIE5VTEwgPT0gcGZuU1RBUnggKSB8fAogICAgICAoIE5VTEwgPT0gcGZuU1RBRmV0Y2hQa3QgKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCBwd1NUQURlc2NUeXBlLT51Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvL0NvZGUgZm9yIGNoZWNraW5nIGFuZCBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgbmV3IFNUQQogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXSApewogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXSA9IHZvc19tZW1fbWFsbG9jKHNpemVvZihXTEFOVExfU1RBQ2xpZW50VHlwZSkpOwogICAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0gKXsKICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOiBTVEEgQ2xpZW50IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBpbiBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQiKSk7CiAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICAgIH0KICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICJXTEFOIFRMOiBTVEEgQ2xpZW50IG1lbW9yeSBhbGxvY2F0aW9uIGluIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCIpKTsKICAgICAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKSBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXSxzaXplb2YoV0xBTlRMX1NUQUNsaWVudFR5cGUpKTsKICB9CgogIC8vQXNzaWduaW5nIHRoZSBwb2ludGVyIHRvIGxvY2FsIHZhcmlhYmxlIGZvciBlYXN5IGFjY2VzcyBpbiBmdXR1cmUKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF07CiAgaWYgKCAwICE9IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICB7CiAgICBwQ2xpZW50U1RBLT51Y0V4aXN0cysrOwogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVnaXN0ZXIgc3RhdGlvbiB3aXRoIFRMCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLCBUUkFDRV9DT0RFX1RMX1JFR0lTVEVSX1NUQV9DTElFTlQsCiAgICAgICAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1NUQUlkLCAodW5zaWduZWQgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKihwd1NUQURlc2NUeXBlLT52U1RBTUFDQWRkcmVzcy5ieXRlcysyKTw8MjQgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwd1NUQURlc2NUeXBlLT52U1RBTUFDQWRkcmVzcy5ieXRlcyszKTw8MTYgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwd1NUQURlc2NUeXBlLT52U1RBTUFDQWRkcmVzcy5ieXRlcys0KTw8OCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB3U1RBRGVzY1R5cGUtPnZTVEFNQUNBZGRyZXNzLmJ5dGVzKzUpKSkpOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgU1RBIENsaWVudCBJRDogJWQiLCBwd1NUQURlc2NUeXBlLT51Y1NUQUlkICkpOwoKICBwQ2xpZW50U1RBLT5wZm5TVEFSeCAgICAgICA9IHBmblNUQVJ4OwogIHBDbGllbnRTVEEtPnBmblNUQUZldGNoUGt0ID0gcGZuU1RBRmV0Y2hQa3Q7CgogIC8qIE9ubHkgcmVnaXN0ZXIgaWYgZGlmZmVyZW50IGZyb20gTlVMTCAtIFRMIGRlZmF1bHQgVHggQ29tcCBDYiB3aWxsCiAgICByZWxlYXNlIHRoZSB2b3MgcGFja2V0ICovCiAgaWYgKCBOVUxMICE9IHBmblNUQVR4Q29tcCApCiAgewogICAgcENsaWVudFNUQS0+cGZuU1RBVHhDb21wICAgPSBwZm5TVEFUeENvbXA7CiAgfQoKICBwQ2xpZW50U1RBLT50bFN0YXRlICA9IFdMQU5UTF9TVEFfSU5JVDsKICBwQ2xpZW50U1RBLT50bFByaSAgICA9IFdMQU5UTF9TVEFfUFJJX05PUk1BTDsKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1NUQUlkICA9IHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQ7CiAgcENsaWVudFNUQS0+cHRrSW5zdGFsbGVkID0gMDsKICBwQ2xpZW50U1RBLT5kaXNhc3NvY19wcm9ncmVzcyA9IFZPU19GQUxTRTsKCiAgcE1hYyA9IHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1BFLCBwdm9zR0N0eCk7CiAgaWYgKCBOVUxMICE9IHBNYWMgKQogIHsKICAgIHdsYW5fY2ZnR2V0SW50KHBNYWMsIFdOSV9DRkdfVE9HR0xFX0FSUF9CRFJBVEVTLCAmaXN0b2dnbGVBcnBFbmIpOwogIH0KICBwQ2xpZW50U1RBLT5hcnBSYXRlID0gaXN0b2dnbGVBcnBFbmIgPyBFTkFCTEVfQVJQX1RPR0dMRSA6IERJU0FCTEVfQVJQX1RPR0dMRTsKICBwQ2xpZW50U1RBLT5hcnBPbldRNSA9IGlzdG9nZ2xlQXJwRW5iID09IFNFTkRfQVJQX09OX1dRNTsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgU1RBIENsaWVudCBJRDogJWQgd2l0aCBVQyAlZCBhbmQgQkMgJWQgdG9nZ2xlQXJwIDolaGh1IiwKICAgIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQsIHB3U1RBRGVzY1R5cGUtPnVjVWNhc3RTaWcsCiAgICBwd1NUQURlc2NUeXBlLT51Y0JjYXN0U2lnLCBwQ2xpZW50U1RBLT5hcnBSYXRlKSk7CgogIHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlID0gcHdTVEFEZXNjVHlwZS0+d1NUQVR5cGU7CgogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCA9IHB3U1RBRGVzY1R5cGUtPnVjUW9zRW5hYmxlZDsKCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNBZGRSbXZMTEMgPSBwd1NUQURlc2NUeXBlLT51Y0FkZFJtdkxMQzsKCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNQcm90ZWN0ZWRGcmFtZSA9IHB3U1RBRGVzY1R5cGUtPnVjUHJvdGVjdGVkRnJhbWU7CgojaWZkZWYgRkVBVFVSRV9XTEFOX0VTRQogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjSXNFc2VTdGEgPSBwd1NUQURlc2NUeXBlLT51Y0lzRXNlU3RhOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgU1RBIENsaWVudCBJRDogJWQgUW9TICVkIEFkZCBMTEMgJWQgUHJvdEZyYW1lICVkIEVzZVN0YSAlZCIsCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1NUQUlkLCAKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjUW9zRW5hYmxlZCwKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjQWRkUm12TExDLAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNQcm90ZWN0ZWRGcmFtZSwKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjSXNFc2VTdGEpKTsKI2Vsc2UKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlJlZ2lzdGVyaW5nIFNUQSBDbGllbnQgSUQ6ICVkIFFvUyAlZCBBZGQgTExDICVkIFByb3RGcmFtZSAlZCIsIAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNTVEFJZCwgCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1Fvc0VuYWJsZWQsCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y0FkZFJtdkxMQywKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjUHJvdGVjdGVkRnJhbWUpKTsKCiNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9FU0UKI2lmZGVmIFdMQU5fU09GVEFQX1ZTVEFfRkVBVFVSRQogIC8vIGlmIHRoaXMgc3RhdGlvbiB3YXMgbm90IGFsbG9jYXRlZCByZXNvdXJjZXMgdG8gcGVyZm9ybSBIVy1iYXNlZAogIC8vIFRYIGZyYW1lIHRyYW5zbGF0aW9uIHRoZW4gZm9yY2UgU1ctYmFzZWQgVFggZnJhbWUgdHJhbnNsYXRpb24KICAvLyBvdGhlcndpc2UgdXNlIHRoZSBmcmFtZSB0cmFuc2xhdGlvbiBzdXBwbGllZCBieSB0aGUgY2xpZW50CgogIGlmICghV0RBX0lzSHdGcmFtZVR4VHJhbnNsYXRpb25DYXBhYmxlKHB2b3NHQ3R4LCBwd1NUQURlc2NUeXBlLT51Y1NUQUlkKQogICAgICB8fCAoIFdMQU5fU1RBX0JUX0FNUCA9PSBwd1NUQURlc2NUeXBlLT53U1RBVHlwZSkpCiAgewogICAgICBwd1NUQURlc2NUeXBlLT51Y1N3RnJhbWVUWFhsYXRpb24gPSAxOwogIH0KI2VuZGlmCgogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiA9IHB3U1RBRGVzY1R5cGUtPnVjU3dGcmFtZVRYWGxhdGlvbjsKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1N3RnJhbWVSWFhsYXRpb24gPSBwd1NUQURlc2NUeXBlLT51Y1N3RnJhbWVSWFhsYXRpb247CgojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0lzV2FwaVN0YSA9IHB3U1RBRGVzY1R5cGUtPnVjSXNXYXBpU3RhOwojZW5kaWYgLyogRkVBVFVSRV9XTEFOX1dBUEkgKi8KCiAgdm9zX2NvcHlfbWFjYWRkciggJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzLCAmcHdTVEFEZXNjVHlwZS0+dlNUQU1BQ0FkZHJlc3MpOwoKICB2b3NfY29weV9tYWNhZGRyKCAmcENsaWVudFNUQS0+d1NUQURlc2MudkJTU0lEZm9ySUJTUywgJnB3U1RBRGVzY1R5cGUtPnZCU1NJRGZvcklCU1MpOwoKICB2b3NfY29weV9tYWNhZGRyKCAmcENsaWVudFNUQS0+d1NUQURlc2MudlNlbGZNQUNBZGRyZXNzLCAmcHdTVEFEZXNjVHlwZS0+dlNlbGZNQUNBZGRyZXNzKTsKCiAgLyogSW4gdm9sYW5zIHJlbGVhc2UgTCByZXBsYXkgY2hlY2sgaXMgZG9uZSBhdCBUTCAqLwogIHBDbGllbnRTVEEtPnVjSXNSZXBsYXlDaGVja1ZhbGlkID0gcHdTVEFEZXNjVHlwZS0+dWNJc1JlcGxheUNoZWNrVmFsaWQ7CiAgcENsaWVudFNUQS0+dWxUb3RhbFJlcGxheVBhY2tldHNEZXRlY3RlZCA9ICAwOwovKkNsZWFyIHJlcGxheSBjb3VudGVycyBvZiB0aGUgU1RBIG9uIGFsbCBUSURzKi8KICBmb3IodWNUaWQgPSAwOyB1Y1RpZCA8IFdMQU5UTF9NQVhfVElEIDsgdWNUaWQrKykKICB7CiAgICBwQ2xpZW50U1RBLT51bGxSZXBsYXlDb3VudGVyW3VjVGlkXSA9ICAwOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBTZXQgdGhlIEFDIGZvciB0aGUgcmVnaXN0ZXJlZCBzdGF0aW9uIHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5IEFDCiAgICAgIEV2ZW4gaWYgdGhpcyBBQyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzdGF0aW9uLCBjb3JyZWN0aW9uIHdpbGwgYmUKICAgICAgbWFkZSBpbiB0aGUgbWFpbiBUTCBsb29wIGFmdGVyIHRoZSBzdXBwb3J0ZWQgbWFzayBpcyBwcm9wZXJseQogICAgICB1cGRhdGVkIGluIHRoZSBwZW5kaW5nIHBhY2tldHMgY2FsbAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPnVjQ3VycmVudEFDICAgICA9IFdMQU5UTF9BQ19ISUdIX1BSSU87CiAgcENsaWVudFNUQS0+dWNDdXJyZW50V2VpZ2h0ID0gMDsKICBwQ2xpZW50U1RBLT51Y1NlcnZpY2VkQUMgICAgPSBXTEFOVExfQUNfQks7CiAgcENsaWVudFNUQS0+dWNFYXBvbFBrdFBlbmRpbmcgPSAwOwoKICB2b3NfbWVtX3plcm8oIHBDbGllbnRTVEEtPmF1Y0FDTWFzaywgc2l6ZW9mKHBDbGllbnRTVEEtPmF1Y0FDTWFzaykpOwoKICB2b3NfbWVtX3plcm8oICZwQ2xpZW50U1RBLT53VUFQU0RJbmZvLCBzaXplb2YocENsaWVudFNUQS0+d1VBUFNESW5mbykpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZW9yZGVyaW5nIGluZm8gYW5kIEFNU0RVIGRlLWFnZ3JlZ2F0aW9uCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX21lbV96ZXJvKCBwQ2xpZW50U1RBLT5hdGxCQVJlb3JkZXJJbmZvLAogICAgIHNpemVvZihwQ2xpZW50U1RBLT5hdGxCQVJlb3JkZXJJbmZvWzBdKSoKICAgICBXTEFOX01BWF9USUQpOwoKICB2b3NfbWVtX3plcm8oIHBDbGllbnRTVEEtPmF1Y01QRFVIZWFkZXIsCiAgICAgICAgICAgICAgICBXTEFOVExfTVBEVV9IRUFERVJfTEVOKTsKCiAgcENsaWVudFNUQS0+dWNNUERVSGVhZGVyTGVuICAgPSAwOwogIHBDbGllbnRTVEEtPnZvc0FNU0RVQ2hhaW4gICAgID0gTlVMTDsKICBwQ2xpZW50U1RBLT52b3NBTVNEVUNoYWluUm9vdCA9IE5VTEw7CgoKICAvKiBSZW9yZGVyIExPQ0sKICAgKiBEdXJpbmcgaGFuZGxlIG5vcm1hbCBSWCBmcmFtZSB3aXRoaW4gUlggdGhyZWFkLAogICAqIGlmIE1DIHRocmVhZCB0cnkgdG8gcHJlZW1wdCwgQUREQkEsIERFTEJBLCBUSU1FUgogICAqIENvbnRleHQgc2hvdWxkIGJlIHByb3RlY3RlZCBmcm9tIHJhY2UgKi8KICBmb3IgKHVjVGlkID0gMDsgdWNUaWQgPCBXTEFOX01BWF9USUQgOyB1Y1RpZCsrKQogIHsKICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKAogICAgICAgIHZvc19sb2NrX2luaXQoJnBDbGllbnRTVEEtPmF0bEJBUmVvcmRlckluZm9bdWNUaWRdLnJlb3JkZXJMb2NrKSkpCiAgICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiTG9jayBJbml0IEZhaWwiKSk7CiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICB9CiAgfQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFN0YXRzIGluZm8KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NfbWVtX3plcm8oIHBDbGllbnRTVEEtPmF1UnhDb3VudCwKICAgICAgc2l6ZW9mKHBDbGllbnRTVEEtPmF1UnhDb3VudFswXSkqCiAgICAgIFdMQU5fTUFYX1RJRCk7CgogIHZvc19tZW1femVybyggcENsaWVudFNUQS0+YXVUeENvdW50LAogICAgICBzaXplb2YocENsaWVudFNUQS0+YXVSeENvdW50WzBdKSoKICAgICAgV0xBTl9NQVhfVElEKTsKICAvKiBJbml0aWFsIFJTU0kgaXMgYWx3YXlzIHJlcG9ydGVkIGFzIHplcm8gYmVjYXVzZSBUTCBkb2VzbnQgaGF2ZSBlbm91Z2gKICAgICBkYXRhIHRvIGNhbGN1bGF0ZSBSU1NJLiBTbyB0byBhdm9pZCByZXBvcnRpbmcgemVybywgd2UgYXJlIGluaXRpYWxpemluZwogICAgIFJTU0kgd2l0aCBSU1NJIHNhdmVkIGluIEJzc0Rlc2NyaXB0aW9uIGR1cmluZyBzY2FubmluZy4gKi8KICBwQ2xpZW50U1RBLT5yc3NpQXZnID0gcnNzaTsKICBwQ2xpZW50U1RBLT5yc3NpQXZnQm1wcyA9IHJzc2k7CiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIGlmKFdMQU5fU1RBX1RETFMgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpCiAgewogICAgLyogSWYgY2xpZW50IGlzIFRETFMsIHVzZSBURExTIHNwZWNpZmljIGFscGhhICovCiAgICBwQ2xpZW50U1RBLT5yc3NpQWxwaGEgPSBXTEFOVExfSE9fVERMU19BTFBIQTsKICB9CiAgZWxzZQogIHsKICAgIHBDbGllbnRTVEEtPnJzc2lBbHBoYSA9IFdMQU5UTF9IT19ERUZBVUxUX0FMUEhBOwogIH0KI2Vsc2UKICAgIHBDbGllbnRTVEEtPnJzc2lBbHBoYSA9IFdMQU5UTF9IT19ERUZBVUxUX0FMUEhBOwojZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCiAgcENsaWVudFNUQS0+cnNzaURhdGFBbHBoYSA9IFdMQU5UTF9IT19ERUZBVUxUX0FMUEhBOwogIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbMF0uYWMgPSBXTEFOVExfQUNfQks7CiAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1sxXS5hYyA9IFdMQU5UTF9BQ19CRTsKICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzJdLmFjID0gV0xBTlRMX0FDX1ZJOwogIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbM10uYWMgPSBXTEFOVExfQUNfVk87CiNlbmRpZgoKICAvKlR4IG5vdCBzdXNwZW5kZWQgYW5kIHN0YXRpb24gZnVsbHkgcmVnaXN0ZXJlZCovCiAgdm9zX2F0b21pY19zZXRfVTgoCiAgICAgICAgJnBDbGllbnRTVEEtPnVjVHhTdXNwZW5kZWQsIDApOwoKICAvKiBVc2VkIHVudGlsIG11bHRpcGxlIHN0YXRpb24gc3VwcG9ydCB3aWxsIGJlIGFkZGVkKi8KICBwVExDYi0+dWNSZWdpc3RlcmVkU3RhSWQgPSBwd1NUQURlc2NUeXBlLT51Y1NUQUlkOwoKICAvKiBTYXZlIHRoZSBCQVAgc3RhdGlvbiBJRCBmb3IgZnV0dXJlIHVzYWdlICovCiAgaWYgKCBXTEFOX1NUQV9CVF9BTVAgPT0gcHdTVEFEZXNjVHlwZS0+d1NUQVR5cGUgKQogIHsKICAgIHBUTENiLT50bEJBUENsaWVudC51Y0JBUFNUQUlkID0gcHdTVEFEZXNjVHlwZS0+dWNTVEFJZDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTdGF0aXN0aWNzIGluZm8gCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgbWVtc2V0KCZwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljcywKICAgICAgICAgMCwgc2l6ZW9mKFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSkpOwoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFN0YXJ0IHdpdGggdGhlIHN0YXRlIHN1Z2dlc3RlZCBieSBjbGllbnQgY2FsbGVyCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcENsaWVudFNUQS0+dGxTdGF0ZSA9IHB3U1RBRGVzY1R5cGUtPnVjSW5pdFN0YXRlOwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFmdGVyIGFsbCB0aGUgaW5pdCBpcyBjb21wbGV0ZSB3ZSBjYW4gbWFyayB0aGUgZXhpc3RhbmNlIGZsYWcgCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwQ2xpZW50U1RBLT51Y0V4aXN0cysrOwoKICAvL2Zsb3cgY29udHJvbCBmaWVsZHMgaW5pdAogIHBDbGllbnRTVEEtPnVjTHdtTW9kZUVuYWJsZWQgPSBGQUxTRTsKICBwQ2xpZW50U1RBLT51Y0x3bUV2ZW50UmVwb3J0ZWQgPSBGQUxTRTsKICBwQ2xpZW50U1RBLT5ibXVNZW1Db25zdW1lZCA9IDA7CiAgcENsaWVudFNUQS0+dUluZ3Jlc3NfbGVuZ3RoID0gMDsKICBwQ2xpZW50U1RBLT51QnVmZlRocmVzaG9sZE1heCA9IFdMQU5UTF9TVEFfQk1VX1RIUkVTSE9MRF9NQVg7CgogIHBDbGllbnRTVEEtPnVMd21UaHJlc2hvbGQgPSBXTEFOVExfU1RBX0JNVV9USFJFU0hPTERfTUFYIC8gMzsKCiAgLy9AQEAgSEREU09GVEFQIGRvZXMgbm90IHF1ZXVlIHVucmVnaXN0ZXJlZCBwYWNrZXQgZm9yIG5vdwogIGlmICggV0xBTl9TVEFfU09GVEFQICE9IHB3U1RBRGVzY1R5cGUtPndTVEFUeXBlICkKICB7IAogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgRm9yd2FyZCByZWNlaXZlZCBmcmFtZXMgd2hpbGUgU1RBIHdhcyBub3QgeWV0IHJlZ2lzdGVyZWQgCiAgICAtICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MoV0xBTlRMX1N0YXJ0Rm9yd2FyZGluZyggcHdTVEFEZXNjVHlwZS0+dWNTVEFJZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjVWNhc3RTaWcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y0JjYXN0U2lnKSkpCiAgICB7CiAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICIgJXMgZmFpbHMgdG8gc3RhcnQgZm9yd2FyZGluZyIsIF9fZnVuY19fKTsKICAgIH0KI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgICBpZiggV0xBTl9TVEFfVERMUyA9PSBwd1NUQURlc2NUeXBlLT53U1RBVHlwZSApCiAgICAgICAgcFRMQ2ItPnVjVGRsc1BlZXJDb3VudCsrOwojZW5kaWYKICB9CiNpZmRlZiBXTEFOX0ZFQVRVUkVfUk1DCiAgdm9zX2xvY2tfaW5pdCgmcENsaWVudFNUQS0+bWNMb2NrKTsKI2VuZGlmIC8qIFdMQU5fRkVBVFVSRV9STUMgKi8KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0NsZWFyU1RBQ2xpZW50CgogIERFU0NSSVBUSU9OCgogICAgSEREIHdpbGwgY2FsbCB0aGlzIEFQSSB3aGVuIGl0IG5vIGxvbmdlciBuZWVkcyBkYXRhIHNlcnZpY2VzIGZvciB0aGUKICAgIHBhcnRpY3VsYXIgc3RhdGlvbi4KCiAgREVQRU5ERU5DSUVTCgogICAgQSBzdGF0aW9uIG11c3QgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjbGVhciByZWdpc3RyYXRpb24gaXMKICAgIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgcHZvc0dDdHg6ICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgIGlkZW50aWZpZXIgZm9yIHRoZSBTVEEgdG8gYmUgY2xlYXJlZAoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9DbGVhclNUQUNsaWVudAooCiAgdl9QVk9JRF90ICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgdWNTVEFJZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOyAKICB2X1U4X3QgIHVjSW5kZXg7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIEVOVEVSKCk7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9DbGVhclNUQUNsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NsZWFyU1RBQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfQ2xlYXJTVEFDbGllbnQiKSk7CiAgICAvKiBDbGVhbiBwYWNrZXRzIGNhY2hlZCBmb3IgdGhlIFNUQSAqLwogICAgV0xBTlRMX1N0YXJ0Rm9yd2FyZGluZyh1Y1NUQUlkLDAsMCk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qIERlbGV0ZSBCQSBzZXNzaW9ucyBvbiBhbGwgVElEJ3MgKi8KICBmb3IgKHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTl9NQVhfVElEIDsgdWNJbmRleCsrKQogIHsKICAgICBXTEFOVExfQmFTZXNzaW9uRGVsKHB2b3NHQ3R4LCB1Y1NUQUlkLCB1Y0luZGV4KTsKICAgICB2b3NfbG9ja19kZXN0cm95KCZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+YXRsQkFSZW9yZGVySW5mb1t1Y0luZGV4XS5yZW9yZGVyTG9jayk7CiAgfQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgLyogZGVjcmVtZW50IHVjVGRsc1BlZXJDb3VudCBvbmx5IGlmIGl0IGlzIG5vbi16ZXJvICovICAKICBpZihXTEFOX1NUQV9URExTID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT53U1RBRGVzYy53U1RBVHlwZQogICAgICAmJiBwVExDYi0+dWNUZGxzUGVlckNvdW50KQogICAgICBwVExDYi0+dWNUZGxzUGVlckNvdW50LS07CiNlbmRpZgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2xlYXIgc3RhdGlvbgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpDbGVhcmluZyBTVEEgQ2xpZW50IElEOiAlZCIsIHVjU1RBSWQgKSk7CiAgV0xBTlRMX0NsZWFuU1RBKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLCAxIC8qZW1wdHkgcGFja2V0cyovKTsKCiNpZmRlZiBXTEFOX0ZFQVRVUkVfUk1DCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRGVsZXRlIG11bHRpY2FzdCBlbnRyaWVzIGZvciBkdXBsaWNhdGUgZGV0ZWN0aW9uCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgV0xBTlRMX01jYXN0RGVsZXRlQWxsRW50cmllcyhwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSk7CgogIHZvc19sb2NrX2Rlc3Ryb3koJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5tY0xvY2spOwojZW5kaWYgLyogV0xBTl9GRUFUVVJFX1JNQyAqLwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6Q2xlYXJpbmcgU1RBIFJlc2V0IEhpc3RvcnkgUlNTSSBhbmQgUmVnaW9uIG51bWJlciIpKTsKICBwVExDYi0+aG9TdXBwb3J0LmN1cnJlbnRIT1N0YXRlLmhpc3RvcnlSU1NJID0gMDsKICBwVExDYi0+aG9TdXBwb3J0LmN1cnJlbnRIT1N0YXRlLnJlZ2lvbk51bWJlciA9IDA7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfQ2xlYXJTVEFDbGllbnQgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZQoKICBERVNDUklQVElPTgoKICAgIEhERCB3aWxsIG1ha2UgdGhpcyBub3RpZmljYXRpb24gd2hlbmV2ZXIgYSBjaGFuZ2Ugb2NjdXJzIGluIHRoZQogICAgY29ubmVjdGl2aXR5IHN0YXRlIG9mIGEgcGFydGljdWxhciBTVEEuCgogIERFUEVOREVOQ0lFUwoKICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2hhbmdlIHN0YXRlIGNhbiBiZQogICAgY2FsbGVkLgoKICAgIFJFU1RSSUNUSU9OOiBBIHN0YXRpb24gaXMgYmVpbmcgbm90aWZpZWQgYXMgYXV0aGVudGljYXRlZCBiZWZvcmUgdGhlCiAgICAgICAgICAgICAgICAga2V5cyBhcmUgaW5zdGFsbGVkIGluIEhXLiBUaGlzIHdheSBpZiBhIGZyYW1lIGlzIHJlY2VpdmVkCiAgICAgICAgICAgICAgICAgYmVmb3JlIHRoZSBrZXlzIGFyZSBpbnN0YWxsZWQgRFBVIHdpbGwgZHJvcCB0aGF0IGZyYW1lLgoKICAgIE1haW4gdGhyZWFkIGhhcyBoaWdoZXIgcHJpb3JpdHkgdGhhdCBUeCBhbmQgUnggdGhyZWFkcyB0aHVzIGd1YXJhbnRlZWluZwogICAgdGhlIGZvbGxvd2luZzoKICAgICAgICAtIGEgc3RhdGlvbiB3aWxsIGJlIGluIGFzc29jIHN0YXRlIGluIFRMIGJlZm9yZSBUTCByZWNlaXZlcyBhbnkgZGF0YQogICAgICAgICAgZm9yIGl0CgogIFBBUkFNRVRFUlMKCiAgIHB2b3NHQ3R4OiAgICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgICBpZGVudGlmaWVyIGZvciB0aGUgU1RBIHRoYXQgaXMgcGVuZGluZyB0cmFuc21pc3Npb24KICAgdGxTVEFTdGF0ZTogICAgIHRoZSBuZXcgc3RhdGUgb2YgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGdpdmVuIHN0YXRpb24KCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfQ2hhbmdlU1RBU3RhdGUKKAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKICBXTEFOVExfU1RBU3RhdGVUeXBlICAgdGxTVEFTdGF0ZQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCB0bFNUQVN0YXRlID49IFdMQU5UTF9TVEFfTUFYX1NUQVRFICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hhbmdlIFNUQSBzdGF0ZQogICAgTm8gbmVlZCB0byBsb2NrIHRoaXMgb3BlcmF0aW9uLCBzZWUgcmVzdHJpY3Rpb25zIGFib3ZlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkNoYW5naW5nIHN0YXRlIGZvciBTVEEgQ2xpZW50IElEOiAlZCBmcm9tICVkIHRvICVkIiwKICAgICAgICAgICAgIHVjU1RBSWQsIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT50bFN0YXRlLCB0bFNUQVN0YXRlKSk7CgogIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwKICAgICAgICAgICAgICAgICAgIFRSQUNFX0NPREVfVExfU1RBX1NUQVRFLCB1Y1NUQUlkLHRsU1RBU3RhdGUgKSk7CgogIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT50bFN0YXRlID0gdGxTVEFTdGF0ZTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1VwZGF0ZVRkbHNTVEFDbGllbnQKCiAgREVTQ1JJUFRJT04KCiAgICBIREQgd2lsbCBjYWxsIHRoaXMgQVBJIHdoZW4gRU5BQkxFX0xJTksgaGFwcGVucyBhbmQgIEhERCB3YW50IHRvCiAgICByZWdpc3RlciBRb1Mgb3Igb3RoZXIgcGFyYW1zIGZvciBURExTIHBlZXJzLgoKICBERVBFTkRFTkNJRVMKCiAgICBBIHN0YXRpb24gbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIFdNTS9RT1MgcmVnaXN0cmF0aW9uIGlzCiAgICBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgIHB2b3NHQ3R4OiAgICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgd1NUQURlc2NUeXBlOiAgICBTVEEgRGVzY3JpcHRvciwgY29udGFpbnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUKICAgICAgICAgICAgICAgICAgICBuZXcgYWRkZWQgU1RBCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpWT1NfU1RBVFVTCldMQU5UTF9VcGRhdGVUZGxzU1RBQ2xpZW50CigKIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgcHZvc0dDdHgsCiBXTEFOX1NUQURlc2NUeXBlKiAgICAgICAgIHB3U1RBRGVzY1R5cGUKKQp7CiAgV0xBTlRMX0NiVHlwZSogcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgfHwgKCBXTEFOX01BWF9TVEFfQ09VTlQgPD0gcHdTVEFEZXNjVHlwZS0+dWNTVEFJZCkpCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1VwZGF0ZVRkbHNTVEFDbGllbnQiKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF07CiAgaWYgKChOVUxMID09IHBDbGllbnRTVEEpIHx8IDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMpCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6U3RhdGlvbiBub3QgZXhpc3RzIikpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQgPSBwd1NUQURlc2NUeXBlLT51Y1Fvc0VuYWJsZWQ7CgogIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAiV0xBTiBUTDogJXM6IHVjUW9zRW5hYmxlZCBvZiBwd1NUQURlc2NUeXBlOiAlZCIKICAgICAgICAgICJwQ2xpZW50U1RBLT53U1RBRGVzYzogJWQiLAogICAgICAgICAgX19mdW5jX18sIHB3U1RBRGVzY1R5cGUtPnVjUW9zRW5hYmxlZCwKICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCkpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwoKfQoKVk9TX1NUQVRVUyBXTEFOVExfU2V0TW9uUnhDYmsodl9QVk9JRF90IHB2b3NHQ3R4LCBXTEFOVExfTW9uUnhDQlR5cGUgcGZuTW9uUngpCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMIDsKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBwVExDYi0+cGZuTW9uUnggPSBwZm5Nb25SeDsKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9Cgp2b2lkIFdMQU5UTF9TZXRJc0NvbnZlcnNpb25SZXEodl9QVk9JRF90IHB2b3NHQ3R4LCB2X0JPT0xfdCBpc0NvbnZlcnNpb25SZXEpCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMIDsKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQiKSk7CiAgICByZXR1cm47CiAgfQogIHBUTENiLT5pc0NvbnZlcnNpb25SZXEgPSBpc0NvbnZlcnNpb25SZXE7CiAgcmV0dXJuOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVB0a0luc3RhbGxlZAoKICBERVNDUklQVElPTgoKICAgIEhERCB3aWxsIG1ha2UgdGhpcyBub3RpZmljYXRpb24gd2hlbmV2ZXIgUFRLIGlzIGluc3RhbGxlZCBmb3IgdGhlIFNUQQoKICBERVBFTkRFTkNJRVMKCiAgICBBIHN0YXRpb24gbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGNoYW5nZSBzdGF0ZSBjYW4gYmUKICAgIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgcHZvc0dDdHg6ICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgIGlkZW50aWZpZXIgZm9yIHRoZSBTVEEgZm9yIHdoaWNoIFBhaXJ3aXNlIGtleSBpcwogICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZAoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgdG8KICAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVB0a0luc3RhbGxlZAooCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgICB1Y1NUQUlkCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgRkwoIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHgiKSkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICBGTCgiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIikpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIEZMKCJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQiKSkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+cHRrSW5zdGFsbGVkID0gMTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TVEFQdGtJbnN0YWxsZWQgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRTVEFTdGF0ZQoKICBERVNDUklQVElPTgoKICAgIFJldHVybnMgY29ubmVjdGl2aXR5IHN0YXRlIG9mIGEgcGFydGljdWxhciBTVEEuCgogIERFUEVOREVOQ0lFUwoKICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSBpdHMgc3RhdGUgY2FuIGJlIHJldHJpZXZlZC4KCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbgoKICAgIE9VVAogICAgcHRsU1RBU3RhdGU6ICAgIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBzdGF0aW9uCgoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgdG8KICAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0dldFNUQVN0YXRlCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgV0xBTlRMX1NUQVN0YXRlVHlwZSAgICpwdGxTVEFTdGF0ZQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHB0bFNUQVN0YXRlICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0dldFNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0dldFNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0dldFNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgR2V0IFNUQSBzdGF0ZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICpwdGxTVEFTdGF0ZSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT50bFN0YXRlOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0dldFNUQVN0YXRlICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICBXTEFOVExfVXBkYXRlU1RBQnNzSWRmb3JJQlNTCgogIERFU0NSSVBUSU9OCiAgICBIREQgd2lsbCBjYWxsIHRoaXMgQVBJIHRvIHVwZGF0ZSB0aGUgQlNTSUQgZm9yIHRoaXMgU3RhdGlvbi4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgSEREIFNob3VsZCByZWdpc3RlcmVkIHRoZSBzdGFJRCB3aXRoIFRMIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFdEQSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBJTgogICAgdWNTVEFJZCAgICAgICBUaGUgU3RhdGlvbiBJRCBmb3IgQnNzaWQgdG8gYmUgdXBkYXRlZAogICAgSU4KICAgIHBCc3NpZCAgICAgICAgICBCU1NJRCB0byBiZSB1cGRhdGVkCgogIFJFVFVSTiBWQUxVRQogICAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICAgIFNJREUgRUZGRUNUUwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgpWT1NfU1RBVFVTCldMQU5UTF9VcGRhdGVTVEFCc3NJZGZvcklCU1MKKAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKICB2X1U4X3QgICAgICAgICAgICAgICAqcEJzc2lkCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFVwZGF0ZSB0aGUgSUJTUyBCU1NJRAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc19tZW1fY29weSggJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT53U1RBRGVzYy52QlNTSURmb3JJQlNTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc2lkLCBzaXplb2Yodl9NQUNBRERSX3QpKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVBrdFBlbmRpbmcKCiAgREVTQ1JJUFRJT04KCiAgICBIREQgd2lsbCBjYWxsIHRoaXMgQVBJIHdoZW4gYSBwYWNrZXQgaXMgcGVuZGluZyB0cmFuc21pc3Npb24gaW4gaXRzCiAgICBxdWV1ZXMuCgogIERFUEVOREVOQ0lFUwoKICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgcGFja2V0IHBlbmRpbmcKICAgIG5vdGlmaWNhdGlvbiBjYW4gYmUgc2VudC4KCiAgICBSRVNUUklDVElPTjogVEwgd2lsbCBub3QgY291bnQgcGFja2V0cyBmb3IgcGVuZGluZyBub3RpZmljYXRpb24uCiAgICAgICAgICAgICAgICAgSEREIGlzIGV4cGVjdGVkIHRvIHNlbmQgdGhlIG5vdGlmaWNhdGlvbiBvbmx5IHdoZW4KICAgICAgICAgICAgICAgICBub24tZW1wdHkgZXZlbnQgZ2V0cyB0cmlnZ2VyZWQuIFdvcnN0IGNhc2Ugc2NlbmFyaW8KICAgICAgICAgICAgICAgICBpcyB0aGF0IFRMIG1pZ2h0IGVuZCB1cCBtYWtpbmcgYSBjYWxsIHdoZW4gSGRkcwogICAgICAgICAgICAgICAgIHF1ZXVlcyBhcmUgYWN0dWFsbHkgZW1wdHkuCgogIFBBUkFNRVRFUlMKCiAgICBwdm9zR0N0eDogICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICBpZGVudGlmaWVyIGZvciB0aGUgU1RBIHRoYXQgaXMgcGVuZGluZyB0cmFuc21pc3Npb24KCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TVEFQa3RQZW5kaW5nCigKICB2X1BWT0lEX3QgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9BQ0VudW1UeXBlICAgIHVjQWMKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICJXTEFOIFRMOlBhY2tldCBwZW5kaW5nIGluZGljYXRpb24gZm9yIFNUQTogJWQgQUM6ICVkIiwgdWNTVEFJZCwgdWNBYyk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfU1RBUGt0UGVuZGluZyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TVEFQa3RQZW5kaW5nIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfU1RBUGt0UGVuZGluZyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFRlbXBvcmFyeSBmaXggdG8gZW5hYmxlIFRMIHRvIGZldGNoIHBhY2tldHMgd2hlbiBtdWx0aXBsZSBwZWVycyBqb2luCiAgICBhbiBJQlNTLiBUbyBmaXggQ1IxNzczMDEuIE5lZWRzIHRvIGdvIGF3YXkgd2hlbiB0aGUgYWN0dWFsIGZpeCBvZgogICAgZ29pbmcgdGhyb3VnaCBhbGwgU1RBJ3MgaW4gcm91bmQgcm9iaW4gZmFzaGlvbiBnZXRzIG1lcmdlZCBpbiBmcm9tCiAgICBCVCBBTVAgYnJhbmNoLgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiLT51Y1JlZ2lzdGVyZWRTdGFJZCA9IHVjU1RBSWQ7CgogIGlmKCBXTEFOVExfU1RBX0NPTk5FQ1RFRCA9PSBwQ2xpZW50U1RBLT50bFN0YXRlICkKICB7IC8qIEVBUE9MX0hJX1BSSU9SSVRZIDogbmVlZCB0byBmaW5kIG91dCB3aGV0aGVyIEVBUE9MIGlzIHBlbmRpbmcgYmVmb3JlCiAgICAgICBXTEFOVExfRmV0Y2hQYWNrZXQoKS9XTEFOVExfVHhDb25uKCkgaXMgY2FsbGVkLgogICAgICAgY2hhbmdlIFNUQV9BVVRIRU5USUNBVEVEICE9IHRsU3RhdGUgdG8gQ09OTkVDVEVEID09IHRsU3RhdGUKICAgICAgIHRvIG1ha2Ugc3VyZSBUTCBpcyBpbmRlZWQgd2FpdGluZyBmb3IgRUFQT0wuCiAgICAgICBKdXN0IGluIHRoZSBjYXNlIHdoZW4gU1RBIGdvdCBkaXNjb25uZWN0ZWQgc2hvcnRseSBhZnRlciBjb25uZWN0ZWN0aW9uICovCiAgICBwQ2xpZW50U1RBLT51Y0VhcG9sUGt0UGVuZGluZyA9IDE7CgogICAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLAogICAgICAgICAgIFRSQUNFX0NPREVfVExfRUFQT0xfUEtUX1BFTkRJTkcsIHVjU1RBSWQsIHVjQWMpKTsKCiAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICJXTEFOIFRMOlBhY2tldCBwZW5kaW5nIGluZGljYXRpb24gZm9yIFNUQTogJWQgQUM6ICVkIFN0YXRlOiAlZCIsIAogICAgICAgICAgICAgICB1Y1NUQUlkLCB1Y0FjLCBwQ2xpZW50U1RBLT50bFN0YXRlKTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEVuYWJsZSB0aGlzIEFDIGluIHRoZSBBQyBtYXNrIGluIG9yZGVyIGZvciBUTCB0byBzdGFydCBzZXJ2aWNpbmcgaXQKICAgIFNldCBwYWNrZXQgcGVuZGluZyBmbGFnIAogICAgVG8gYXZvaWQgcmFjZSBjb25kaXRpb24sIHNlcmlhbGl6ZSB0aGUgdXBkYXRpb24gb2YgQUMgYW5kIEFDIG1hc2sgCiAgICB0aHJvdWdoIFdMQU5UTF9UWF9TVEFJRF9BQ19JTkQgbWVzc2FnZS4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgICBwQ2xpZW50U1RBLT5hdWNBQ01hc2tbdWNBY10gPSAxOwoKICAgICAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1BrdFBlbmRpbmcsIDEpOwoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBDaGVjayBpZiB0aGVyZSBhcmUgZW5vdWdoIHJlc291cmNlcyBmb3IgdHJhbnNtaXNzaW9uIGFuZCB0eCBpcyBub3QKICAgICAgICBzdXNwZW5kZWQuCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgIGlmICgoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19EQVRBICkgJiYKICAgICAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApKQogICAgICB7CgogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgIklzc3VpbmcgWG1pdCBzdGFydCByZXF1ZXN0IHRvIEJBTCIpKTsKICAgICAgICAgICBXREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgTm8gZXJyb3IgY29kZSBpcyBzZW50IGJlY2F1c2UgVEwgd2lsbCByZXN1bWUgdHggYXV0b25vbW91c2x5IGlmCiAgICAgICAgICByZXNvdXJjZXMgYmVjb21lIGF2YWlsYWJsZSBvciB0eCBnZXRzIHJlc3VtZWQKICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICJXTEFOIFRMOlJlcXVlc3QgdG8gc2VuZCBidXQgY29uZGl0aW9uIG5vdCBtZXQuIFJlczogJWQsU3VzcGVuZDogJWQiLAogICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQsIHBUTENiLT51Y1R4U3VzcGVuZGVkICk7CiAgICAgIH0KICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVBrdFBlbmRpbmcgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1NldFNUQVByaW9yaXR5CgogIERFU0NSSVBUSU9OCgogICAgVEwgZXhwb3NlcyB0aGlzIEFQSSB0byBhbGxvdyB1cHBlciBsYXllcnMgYSByb3VnaCBjb250cm9sIG92ZXIgdGhlCiAgICBwcmlvcml0eSBvZiB0cmFuc21pc3Npb24gZm9yIGEgZ2l2ZW4gc3RhdGlvbiB3aGVuIHN1cHBvcnRpbmcgbXVsdGlwbGUKICAgIGNvbm5lY3Rpb25zLgoKICBERVBFTkRFTkNJRVMKCiAgICBBIHN0YXRpb24gbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGNoYW5nZSBpbiBwcmlvcml0eSBjYW4gYmUKICAgIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgZm9yIHRoZSBTVEEgdGhhdCBoYXMgdG8gY2hhbmdlIHByaW9yaXR5CgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU2V0U1RBUHJpb3JpdHkKKAogIHZfUFZPSURfdCAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgV0xBTlRMX1NUQVByaW9yaXR5VHlwZSAgIHRsU1RBUHJpCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9TZXRTVEFQcmlvcml0eSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU2V0U1RBUHJpb3JpdHkiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9TZXRTVEFQcmlvcml0eSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlLWFuYWxpemUgaWYgbG9jayBpcyBuZWVkZWQgd2hlbiBhZGRpbmcgbXVsdGlwbGUgc3RhdGlvbnMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6Q2hhbmdpbmcgc3RhdGUgZm9yIFNUQSBQcmkgSUQ6ICVkIGZyb20gJWQgdG8gJWQiLAogICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dGxQcmksIHRsU1RBUHJpKSk7CiAgcENsaWVudFNUQS0+dGxQcmkgPSB0bFNUQVByaTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TZXRTVEFQcmlvcml0eSAqLwoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgSU5URVJBQ1RJT04gV0lUSCBCQVAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9SZWdpc3RlckJBUENsaWVudAoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFNNRSB0byByZWdpc3RlciBpdHNlbGYgYXMgY2xpZW50IGZvciBub24tZGF0YSBCVC1BTVAgcGFja2V0cy4KCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFNNRSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBwZm5UbEJBUFJ4RnJtOiAgcG9pbnRlciB0byB0aGUgcmVjZWl2ZSBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIG5vbi1kYXRhCiAgICAgICAgICAgICAgICAgICAgQlQtQU1QIHBhY2tldHMKICAgIHBmbkZsdXNoT3BDb21wbGV0ZUNiOgogICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNhbGwgYmFjayBmdW5jdGlvbiwgZm9yIHRoZSBGbHVzaCBvcGVyYXRpb24KICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uLgoKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogQkFMIGNsaWVudCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfUmVnaXN0ZXJCQVBDbGllbnQKKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgcHZvc0dDdHgsCiAgV0xBTlRMX0JBUFJ4Q0JUeXBlICAgICBwZm5UbEJBUFJ4RnJtLAogIFdMQU5UTF9GbHVzaE9wQ29tcENCVHlwZSAgcGZuRmx1c2hPcENvbXBsZXRlQ2IKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwZm5UbEJBUFJ4RnJtICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUmVnaXN0ZXJCQVBDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBOVUxMID09IHBmbkZsdXNoT3BDb21wbGV0ZUNiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJJbnZhbGlkIEZsdXNoIENvbXBsZXRlIENiIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9SZWdpc3RlckJBUENsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9SZWdpc3RlckJBUENsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgTWFrZSBzdXJlIHRoaXMgaXMgdGhlIGZpcnN0IHJlZ2lzdHJhdGlvbiBhdHRlbXB0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAwICE9IHBUTENiLT50bEJBUENsaWVudC51Y0V4aXN0cyApCiAgewogICAgcFRMQ2ItPnRsQkFQQ2xpZW50LnVjRXhpc3RzKys7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6QkFQIGNsaWVudCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVnaXN0ZXIgc3RhdGlvbiB3aXRoIFRMCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlJlZ2lzdGVyaW5nIEJBUCBDbGllbnQiICkpOwoKICBwVExDYi0+dGxCQVBDbGllbnQudWNFeGlzdHMrKzsKCiAgaWYgKCBOVUxMICE9IHBmblRsQkFQUnhGcm0gKSAKICB7CiAgICBwVExDYi0+dGxCQVBDbGllbnQucGZuVGxCQVBSeCAgICAgICAgICAgICA9IHBmblRsQkFQUnhGcm07CiAgfQoKICBwVExDYi0+dGxCQVBDbGllbnQucGZuRmx1c2hPcENvbXBsZXRlQ2IgICA9IHBmbkZsdXNoT3BDb21wbGV0ZUNiOwoKICBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICAgICA9IE5VTEw7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUmVnaXN0ZXJCQVBDbGllbnQgKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9UeEJBUEZybQoKICBERVNDUklQVElPTgogICAgQkFQIGNhbGxzIHRoaXMgd2hlbiBpdCB3YW50cyB0byBzZW5kIGEgZnJhbWUgdG8gdGhlIG1vZHVsZQoKICBERVBFTkRFTkNJRVMKICAgIEJBUCBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICAgIFJFU1RSSUNUSU9OOiBCQVAgQ0FOTk9UIHB1c2ggYW55IHBhY2tldHMgdG8gVEwgdW50aWwgaXQgZGlkIG5vdCByZWNlaXZlCiAgICAgICAgICAgICAgICAgYSB0eCBjb21wbGV0ZSBmcm9tIHRoZSBwcmV2aW91cyBwYWNrZXQsIHRoYXQgbWVhbnMgQkFQCiAgICAgICAgICAgICAgICAgc2VuZHMgb25lIHBhY2tldCwgd2FpdCBmb3IgdHggY29tcGxldGUgYW5kIHRoZW4KICAgICAgICAgICAgICAgICBzZW5kcyBhbm90aGVyIG9uZQoKICAgICAgICAgICAgICAgICBJZiBCQVAgc2VuZHMgYW5vdGhlciBwYWNrZXQgYmVmb3JlIFRMIG1hbmFnZXMgdG8gcHJvY2VzcyB0aGUKICAgICAgICAgICAgICAgICBwcmV2aW91c2x5IHNlbnQgcGFja2V0IGNhbGwgd2lsbCBlbmQgaW4gZmFpbHVyZQoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBCQVAncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgdk9TUyBidWZmZXIgY29udGFpbmluZyB0aGUgcGFja2V0IHRvIGJlCiAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXR0ZWQKICAgIHBNZXRhSW5mbzogICAgICBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYWNrZXQKICAgIHBmblRsQkFQVHhDb21wOiBwb2ludGVyIHRvIGEgdHJhbnNtaXQgY29tcGxldGUgcm91dGluZSBmb3Igbm90aWZ5aW5nCiAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIG92ZXIgdGhlIGJ1cwoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IEJBTCBjbGllbnQgd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19FX0JVU1k6ICAgVGhlIHByZXZpb3VzIEJULUFNUCBwYWNrZXQgd2FzIG5vdCB5ZXQgdHJhbnNtaXR0ZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICAgIE90aGVyIGZhaWx1cmUgbWVzc2FnZXMgbWF5IGJlIHJldHVybmVkIGZyb20gdGhlIEJEIGhlYWRlciBoYW5kbGluZwogICAgcm91dGluZXMsIHBsZWFzZSBjaGVjayBhcHJvcHJpYXRlIEFQSSBmb3IgbW9yZSBpbmZvLgoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeEJBUEZybQooCiAgdl9QVk9JRF90ICAgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdm9zX3BrdF90KiAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsCiAgV0xBTlRMX01ldGFJbmZvVHlwZSogICAgcE1ldGFJbmZvLAogIFdMQU5UTF9UeENvbXBDQlR5cGUgICAgIHBmblRsQkFQVHhDb21wCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiAgICAgID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgdm9zU3RhdHVzICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICB2X01BQ0FERFJfdCAgICAgdkRlc3RNYWNBZGRyOwogIHZfVTE2X3QgICAgICAgICB1c1BrdExlbjsKICB2X1U4X3QgICAgICAgICAgdWNTdGFJZCA9IDA7CiAgdl9VOF90ICAgICAgICAgIGV4dHJhSGVhZFNwYWNlID0gMDsKICB2X1U4X3QgICAgICAgICAgdWNXRFNFbmFibGVkID0gMDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1R4QkFQRnJtIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFbnN1cmUgdGhhdCBCQVAgY2xpZW50IHdhcyByZWdpc3RlcmVkIHByZXZpb3VzbHkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoKCAwID09IHBUTENiLT50bEJBUENsaWVudC51Y0V4aXN0cyApIHx8CiAgICAgICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKHBUTENiLT50bEJBUENsaWVudC51Y0JBUFNUQUlkKSApKQogIHsKICAgIHBUTENiLT50bEJBUENsaWVudC51Y0V4aXN0cysrOwogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpCQVAgY2xpZW50IG5vdCByZWdpc3RlciBvbiBXTEFOVExfVHhCQVBGcm0iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIENoZWNrIGlmIGFueSBCVC1BTVAgRnJtIGlzIHBlbmRpbmcKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCAhPSBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6QlQtQU1QIEZyYW1lIGFscmVhZHkgcGVuZGluZyB0eCBpbiBUTCBvbiBXTEFOVExfVHhCQVBGcm0iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0JVU1k7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2F2ZSBidWZmZXIgYW5kIG5vdGlmeSBCQUw7IG5vIGxvY2sgaXMgbmVlZGVkIGlmIHRoZSBhYm92ZSByZXN0cmljdGlvbgogICAgaXMgbWV0CiAgICBTYXZlIHRoZSB0eCBjb21wbGV0ZSBmbmN0IHBvaW50ZXIgYXMgdGwgc3BlY2lmaWMgZGF0YSBpbiB0aGUgdm9zIGJ1ZmZlcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVHJhbnNsYXRlIDgwMi4zIGZyYW1lIHRvIDgwMi4xMQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHVjU3RhSWQgPSBwVExDYi0+dGxCQVBDbGllbnQudWNCQVBTVEFJZDsKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0gKQogIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CiAgaWYgKCggMCA9PSBwTWV0YUluZm8tPnVjRGlzYWJsZUZybVh0bCApICYmIAogICAgICAoIDAgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0tPndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiApKQogIHsKICAgIHZvc1N0YXR1cyA9ICBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIoIHZvc0RhdGFCdWZmLCAmdm9zU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2IsICZ1Y1N0YUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1ldGFJbmZvLCAmdWNXRFNFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dHJhSGVhZFNwYWNlKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpFcnJvciB3aGVuIHRyYW5zbGF0aW5nIGhlYWRlciBXTEFOVExfVHhCQVBGcm0iKSk7CgogICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQoKICAgIHBNZXRhSW5mby0+dWNEaXNhYmxlRnJtWHRsID0gMTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2FsbCBIQUwgdG8gZmlsbCBCRCBoZWFkZXIKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogIC8qIEFkZGluZyBUeXBlLCBTdWJUeXBlIHdoaWNoIHdhcyBtaXNzaW5nIGZvciBFQVBPTCBmcm9tIEJBUCAqLwogIHBNZXRhSW5mby0+dWNUeXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9UWVBFIDw8IDQpOwogIHBNZXRhSW5mby0+dWNUeXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9RT1NfU1VCVFlQRSk7CgogIHZvc1N0YXR1cyA9IFdEQV9EU19CdWlsZFR4UGFja2V0SW5mbyggcHZvc0dDdHgsIHZvc0RhdGFCdWZmICwgCiAgICAgICAgICAgICAgICAgICAgJnZEZXN0TWFjQWRkciwgcE1ldGFJbmZvLT51Y0Rpc2FibGVGcm1YdGwsIAogICAgICAgICAgICAgICAgICAgICZ1c1BrdExlbiwgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0tPndTVEFEZXNjLnVjUW9zRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICB1Y1dEU0VuYWJsZWQsIGV4dHJhSGVhZFNwYWNlLCBwTWV0YUluZm8tPnVjVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXS0+d1NUQURlc2MudlNlbGZNQUNBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgIHBNZXRhSW5mby0+dWNUSUQsIDAgLyogTm8gQUNLICovLCBwTWV0YUluZm8tPnVzVGltZVN0YW1wLAogICAgICAgICAgICAgICAgICAgIHBNZXRhSW5mby0+dWNJc0VhcG9sIHx8IHBNZXRhSW5mby0+dWNJc1dhaSwgcE1ldGFJbmZvLT51Y0lzQXJwLAogICAgICAgICAgICAgICAgICAgIHBNZXRhSW5mby0+dWNVUCwgcE1ldGFJbmZvLT51Y1R4QmRUb2tlbik7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYnVpbGRpbmcgVFggaGVhZGVyICVkIiwgdm9zU3RhdHVzKSk7CiAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgaWYgKCBOVUxMICE9IHBmblRsQkFQVHhDb21wICkKICB7CiAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXBmblRsQkFQVHhDb21wKTsKICB9CiAgZWxzZQogIHsKICAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpV0xBTlRMX1R4Q29tcERlZmF1bHRDYik7CgogIH0KCiAgdm9zX2F0b21pY19zZXQoICh1aW50cHRyX3QqKSZwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgKHVpbnRwdHJfdCl2b3NEYXRhQnVmZik7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiB0aHJlIGFyZSBlbm91Z2ggcmVzb3VyY2VzIGZvciB0cmFuc21pc3Npb24gYW5kIHR4IGlzIG5vdAogICAgc3VzcGVuZGVkLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19CQVAgKSAmJgogICAgICAoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSkKICB7CiAgICBXREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKICB9CiAgZWxzZQogIHsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIE5vIGVycm9yIGNvZGUgaXMgc2VudCBiZWNhdXNlIFRMIHdpbGwgcmVzdW1lIHR4IGF1dG9ub21vdXNseSBpZgogICAgICByZXNvdXJjZXMgYmVjb21lIGF2YWlsYWJsZSBvciB0eCBnZXRzIHJlc3VtZWQKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICJXTEFOIFRMOlJlcXVlc3QgdG8gc2VuZCBmcm9tIEJBUCBidXQgY29uZGl0aW9uIG5vdCBtZXQuUmVzOiAlZCwiCiAgICAgICAgICAgICAgICAgIlN1c3BlbmQ6ICVkIiwgcFRMQ2ItPnVSZXNDb3VudCwgcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSk7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1R4QkFQRnJtICovCgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJTlRFUkFDVElPTiBXSVRIIFNNRQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFJzc2kKCiAgREVTQ1JJUFRJT04KICAgIFRMIHdpbGwgZXh0cmFjdCB0aGUgUlNTSSBpbmZvcm1hdGlvbiBmcm9tIGV2ZXJ5IGRhdGEgcGFja2V0IGZyb20gdGhlCiAgICBvbmdvaW5nIHRyYWZmaWMgYW5kIHdpbGwgc3RvcmUgaXQuIEl0IHdpbGwgcHJvdmlkZSB0aGUgcmVzdWx0IHRvIFNNRQogICAgdXBvbiByZXF1ZXN0LgoKICBERVBFTkRFTkNJRVMKCiAgICBXQVJOSU5HOiB0aGUgcmVhZCBhbmQgd3JpdGUgb2YgdGhpcyB2YWx1ZSB3aWxsIG5vdCBiZSBwcm90ZWN0ZWQKICAgICAgICAgICAgIGJ5IGxvY2tzLCB0aGVyZWZvcmUgdGhlIGluZm9ybWF0aW9uIG9idGFpbmVkIGFmdGVyIGEgcmVhZAogICAgICAgICAgICAgbWlnaHQgbm90IGFsd2F5cyBiZSBjb25zaXN0ZW50LgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZQoKICAgIE9VVAogICAgcHVSc3NpOiAgICAgICAgIHRoZSBhdmVyYWdlIHZhbHVlIG9mIHRoZSBSU1NJCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFNUQSB3YXMgbm90IHlldCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0UnNzaQooCiAgdl9QVk9JRF90ICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgIHVjU1RBSWQsCiAgdl9TN190KiAgICAgICAgICBwUnNzaQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwUnNzaSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9HZXRSc3NpIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfR2V0UnNzaSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRSc3NpIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9HZXRSc3NpIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ29weSB3aWxsIG5vdCBiZSBsb2NrZWQ7IHBsZWFzZSByZWFkIHJlc3RyaWN0aW9uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYocFRMQ2ItPmlzQk1QUyB8fCBJU19BQ1RJVkVNT0RFX09GRkxPQURfRkVBVFVSRV9FTkFCTEUpCiAgewogICAgKnBSc3NpID0gcENsaWVudFNUQS0+cnNzaUF2Z0JtcHM7CiAgICAvKiBDaGVjayBJZiBSU1NJIGlzIHplcm8gYmVjYXVzZSB3ZSBhcmUgcmVhZGluZyByc3NBdmdCbXBzIHVwZGF0ZWQgYnkgSEFMIGluIAogICAgcHJldmlvdXMgR2V0U3RhdHNSZXF1ZXN0LiBJdCBtYXkgYmUgdXBkYXRlZCBhcyB6ZXJvIGJ5IEhhbCBiZWNhdXNlIEVudGVyQm1wcyAKICAgIG1pZ2h0IG5vdCBoYXZlIGhhcHBlbmQgYnkgdGhhdCB0aW1lLiBIZW5jZSByZWFkaW5nIHRoZSBtb3N0IHJlY2VudCBSc3NpIAogICAgY2FsY2x1YXRlZCBieSBUTCovCiAgICBpZigwID09ICpwUnNzaSkKICAgIHsKICAgICAgKnBSc3NpID0gcENsaWVudFNUQS0+cnNzaUF2ZzsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgICpwUnNzaSA9IHBDbGllbnRTVEEtPnJzc2lBdmc7CiAgfQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9HZXRSc3NpIGZvciBTVEE6ICVkIFJTU0k6ICVkJXMiLAogICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsICpwUnNzaSwKICAgICAgICAgICAgICAgICAgICBwVExDYi0+aXNCTVBTID8gIiBpbiBCTVBTIiA6ICIiKSk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfR2V0UnNzaSAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfR2V0U25yCgogIERFU0NSSVBUSU9OCiAgICBUTCB3aWxsIGV4dHJhY3QgdGhlIFNOUiBpbmZvcm1hdGlvbiBmcm9tIGV2ZXJ5IGRhdGEgcGFja2V0IGZyb20gdGhlCiAgICBvbmdvaW5nIHRyYWZmaWMgYW5kIHdpbGwgc3RvcmUgaXQuIEl0IHdpbGwgcHJvdmlkZSB0aGUgcmVzdWx0IHRvIFNNRQogICAgdXBvbiByZXF1ZXN0LgoKICBERVBFTkRFTkNJRVMKCiAgICBXQVJOSU5HOiB0aGUgcmVhZCBhbmQgd3JpdGUgb2YgdGhpcyB2YWx1ZSB3aWxsIG5vdCBiZSBwcm90ZWN0ZWQKICAgICAgICAgICAgIGJ5IGxvY2tzLCB0aGVyZWZvcmUgdGhlIGluZm9ybWF0aW9uIG9idGFpbmVkIGFmdGVyIGEgcmVhZAogICAgICAgICAgICAgbWlnaHQgbm90IGFsd2F5cyBiZSBjb25zaXN0ZW50LgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZQoKICAgIE9VVAogICAgcFNucjogICAgICAgICB0aGUgYXZlcmFnZSB2YWx1ZSBvZiB0aGUgU05SCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFNUQSB3YXMgbm90IHlldCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0U25yCigKICB0QU5JX1U4ICAgICAgICAgICB1Y1NUQUlkLAogIHRBTklfUzgqICAgICAgICAgIHBTbnIKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoTlVMTCA9PSBwU25yKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKFdMQU5UTF9TVEFfSURfSU5WQUxJRCh1Y1NUQUlkKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQih2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfVEwsIE5VTEwpKTsKICBpZiAoTlVMTCA9PSBwVExDYikKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKE5VTEwgPT0gcENsaWVudFNUQSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICgwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDb3B5IHdpbGwgbm90IGJlIGxvY2tlZDsgcGxlYXNlIHJlYWQgcmVzdHJpY3Rpb24KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAocFRMQ2ItPmlzQk1QUykKICB7CiAgICAqcFNuciA9IHBDbGllbnRTVEEtPnNuckF2Z0JtcHM7CiAgfQogIGVsc2UKICB7CiAgICAvKiBTTlIgaXMgYXZlcmFnZWQgb3ZlciBXTEFOVExfTUFYX1NOUl9EQVRBX1NBTVBMRVMsIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoCiAgICAgKiBkYXRhIHNhbXBsZXMgKHNucmlkeCkgdG8gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIHRoZW4gcmV0dXJuIHRoZQogICAgICogYXZlcmFnZSBmb3IgdGhlIHdpbmRvdyBvZiBwcmV2b2l1cyAyMCBwYWNrZXRzLiBBbmQgaWYgdGhlcmUgYXJlbid0CiAgICAgKiBlbm91Z2ggc2FtcGxlcyBhbmQgdGhlIGF2ZXJhZ2UgZm9yIHByZXZpb3VzIHdpbmRvdyBvZiAyMCBwYWNrZXRzIGlzCiAgICAgKiBub3QgYXZhaWxhYmxlIHRoZW4gcmV0dXJuIGEgcHJlZGVmaW5lZCB2YWx1ZQogICAgICoKICAgICAqIE5PVEU6IHRoZSBTTlJfSEFDS19CTVBTIHZhbHVlIGlzIGRlZmluZWQgdG8gMTI3LCBkb2N1bWVudHMgZnJvbSBIVwogICAgICogdGVhbSByZXZlYWwgdGhhdCB0aGUgU05SIHZhbHVlIGhhcyBhIGNlaWxpbmcgd2VsbCBiZWxvdyAxMjcgZEJtLAogICAgICogc28gaWYgU05SIGhhcyB2YWx1ZSBvZiAxMjcgdGhlIHVzZXJzcGFjZSBhcHBsaWNhdGlvbnMgY2FuIGtub3cgdGhhdAogICAgICogdGhlIFNOUiBoYXMgbm90IGJlZW4gY29tcHV0ZWQgeWV0IGJlY2F1c2UgZW5vdWdoIGRhdGEgd2FzIG5vdAogICAgICogYXZhaWxhYmxlIGZvciBTTlIgY2FsY3VsYXRpb24KICAgICAqLwogICAgaWYgKHBDbGllbnRTVEEtPnNucklkeCA+IChXTEFOVExfTUFYX1NOUl9EQVRBX1NBTVBMRVMvMikKICAgICAgICB8fCAhKHBDbGllbnRTVEEtPnByZXZTbnJBdmcpKQogICAgewogICAgICAgKnBTbnIgPSBwQ2xpZW50U1RBLT5zbnJTdW0gLyBwQ2xpZW50U1RBLT5zbnJJZHg7CiAgICB9CiAgICBlbHNlIGlmIChwQ2xpZW50U1RBLT5wcmV2U25yQXZnKQogICAgewogICAgICAgKnBTbnIgPSBwQ2xpZW50U1RBLT5wcmV2U25yQXZnOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgKnBTbnIgPSBTTlJfSEFDS19CTVBTOwogICAgfQogIH0KCiAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9HZXRTbnIgZm9yIFNUQTogJWQgU05SOiAlZCVzIiwKICAgICAgICAgICAgdWNTVEFJZCwgKnBTbnIsCiAgICAgICAgICAgIHBUTENiLT5pc0JNUFMgPyAiIGluIEJNUFMiIDogIiIpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0dldFNuciAqLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRMaW5rUXVhbGl0eQoKICBERVNDUklQVElPTgogICAgVEwgd2lsbCBleHRyYWN0IHRoZSBTTlIgaW5mb3JtYXRpb24gZnJvbSBldmVyeSBkYXRhIHBhY2tldCBmcm9tIHRoZQogICAgb25nb2luZyB0cmFmZmljIGFuZCB3aWxsIHN0b3JlIGl0LiBJdCB3aWxsIHByb3ZpZGUgdGhlIHJlc3VsdCB0byBTTUUKICAgIHVwb24gcmVxdWVzdC4KCiAgREVQRU5ERU5DSUVTCgogICAgV0FSTklORzogdGhlIHJlYWQgYW5kIHdyaXRlIG9mIHRoaXMgdmFsdWUgd2lsbCBub3QgYmUgcHJvdGVjdGVkCiAgICAgICAgICAgICBieSBsb2NrcywgdGhlcmVmb3JlIHRoZSBpbmZvcm1hdGlvbiBvYnRhaW5lZCBhZnRlciBhIHJlYWQKICAgICAgICAgICAgIG1pZ2h0IG5vdCBhbHdheXMgYmUgY29uc2lzdGVudC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBzdGF0aW9uIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0ZWQgdmFsdWUKCiAgICBPVVQKICAgIHB1TGlua1F1YWxpdHk6ICAgICAgICAgdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIFNOUgoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTVEEgd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0dldExpbmtRdWFsaXR5CigKICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgdl9VMzJfdCogICAgICAgICAgICAgIHB1TGlua1F1YWxpdHkKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHVMaW5rUXVhbGl0eSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9HZXRMaW5rUXVhbGl0eSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0dldExpbmtRdWFsaXR5IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRMaW5rUXVhbGl0eSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9HZXRMaW5rUXVhbGl0eSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENvcHkgd2lsbCBub3QgYmUgbG9ja2VkOyBwbGVhc2UgcmVhZCByZXN0cmljdGlvbgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICpwdUxpbmtRdWFsaXR5ID0gcENsaWVudFNUQS0+dUxpbmtRdWFsaXR5QXZnOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTlRMX0dldExpbmtRdWFsaXR5IGZvciBTVEE6ICVkIExpbmtRdWFsaXR5OiAlZCIsIHVjU1RBSWQsICpwdUxpbmtRdWFsaXR5KSk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfR2V0TGlua1F1YWxpdHkgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0ZsdXNoU3RhVElECgogIERFU0NSSVBUSU9OCiAgICBUTCBwcm92aWRlcyB0aGlzIEFQSSBhcyBhbiBpbnRlcmZhY2UgdG8gU01FIChCQVApIGxheWVyLiBUTCBpbnR1cm4gcG9zdHMgYQogICAgbWVzc2FnZSB0byBIQUwuIFRoaXMgQVBJIGlzIGNhbGxlZCBieSB0aGUgU01FIGlub3JkZXIgdG8gcGVyZm9ybSBhIGZsdXNoCiAgICBvcGVyYXRpb24uCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZQogICAgdWNUaWQ6ICAgICAgICAgIFRzcGVjIElEIGZvciB0aGUgbmV3IEJBIHNlc3Npb24KCiAgICBPVVQKICAgIFRoZSByZXNwb25zZSBmb3IgdGhpcyBwb3N0IGlzIHJlY2VpdmVkIGluIHRoZSBtYWluIHRocmVhZCwgdmlhIGEgcmVzcG9uc2UKICAgIG1lc3NhZ2UgZnJvbSBIQUwgdG8gVEwuCgogIFJFVFVSTiBWQUxVRQogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfRmx1c2hTdGFUSUQKKAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKICB2X1U4X3QgICAgICAgICAgICAgICAgdWNUaWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICB0cEZsdXNoQUNSZXEgRmx1c2hBQ1JlcVB0ciA9IE5VTEw7CiAgdm9zX21zZ190IHZvc01lc3NhZ2U7CgoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0ZsdXNoU3RhVElEIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9GbHVzaFN0YVRJRCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiU3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfRmx1c2hTdGFUSUQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgV2UgbmVlZCB0byBwb3N0IGEgbWVzc2FnZSB3aXRoIHRoZSBTVEEsIFRJRCB2YWx1ZSB0byBIQUwuIEhBTCBwZXJmb3JtcyB0aGUgZmx1c2gKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIEZsdXNoQUNSZXFQdHIgPSB2b3NfbWVtX21hbGxvYyhzaXplb2YodEZsdXNoQUNSZXEpKTsKCiAgaWYgKCBOVUxMID09IEZsdXNoQUNSZXFQdHIgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDogZmF0YWwgZmFpbHVyZSwgY2Fubm90IGFsbG9jYXRlIEZsdXNoIFJlcSBzdHJ1Y3R1cmUiKSk7CiAgICBWT1NfQVNTRVJUKDApOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKICB9CgogIC8vIFN0YXJ0IGNvbnN0cnVjdGluZyB0aGUgbWVzc2FnZSBmb3IgSEFMCiAgRmx1c2hBQ1JlcVB0ci0+bWVzZ1R5cGUgICAgPSBTSVJfVExfSEFMX0ZMVVNIX0FDX1JFUTsKICBGbHVzaEFDUmVxUHRyLT5tZXNnTGVuICAgICA9IHNpemVvZih0Rmx1c2hBQ1JlcSk7CiAgRmx1c2hBQ1JlcVB0ci0+bWVzZ0xlbiAgICAgPSBzaXplb2YodEZsdXNoQUNSZXEpOwogIEZsdXNoQUNSZXFQdHItPnVjU1RBSWQgPSB1Y1NUQUlkOwogIEZsdXNoQUNSZXFQdHItPnVjVGlkID0gdWNUaWQ7CgogIHZvc01lc3NhZ2UudHlwZSAgICAgICAgICAgID0gV0RBX1RMX0ZMVVNIX0FDX1JFUTsKICB2b3NNZXNzYWdlLmJvZHlwdHIgPSAodm9pZCAqKUZsdXNoQUNSZXFQdHI7CgogIHZvc19tcV9wb3N0X21lc3NhZ2UoVk9TX01RX0lEX1dEQSwgJnZvc01lc3NhZ2UpOwogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIElOVEVSQUNUSU9OIFdJVEggUEUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX3VwZGF0ZVNwb29mTWFjQWRkcgoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IEhERCB0byB1cGRhdGUgbWFjYWRkcgoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgQVBJIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIFRMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHNwb29mTWFjQWRkcjogICAgIHNwb29mZWQgbWFjIGFkZGVyZXNzCiAgICBzZWxmTWFjQWRkcjogICAgICAgIHNlbGYgTWFjIEFkZHJlc3MKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfdXBkYXRlU3Bvb2ZNYWNBZGRyCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X01BQ0FERFJfdCogICAgICAgICAgICBzcG9vZk1hY0FkZHIsCiAgdl9NQUNBRERSX3QqICAgICAgICAgICAgc2VsZk1hY0FkZHIKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHZvc19tZW1fY29weShwVExDYi0+c3Bvb2ZNYWNBZGRyLnNlbGZNYWMuYnl0ZXMsIHNlbGZNYWNBZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfTUFDX0FERFJFU1NfTEVOKTsKICB2b3NfbWVtX2NvcHkocFRMQ2ItPnNwb29mTWFjQWRkci5zcG9vZk1hYy5ieXRlcywgc3Bvb2ZNYWNBZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfTUFDX0FERFJFU1NfTEVOKTsKCiAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAiVEw6IFNlbGZTVEEgbWFjIEFkZHIgZm9yIGN1cnJlbnQgU2NhbiAiTUFDX0FERFJFU1NfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICBNQUNfQUREUl9BUlJBWShwVExDYi0+c3Bvb2ZNYWNBZGRyLnNlbGZNYWMuYnl0ZXMpKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF91cGRhdGVTcG9vZk1hY0FkZHIgKi8KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfUmVnaXN0ZXJNZ210RnJtQ2xpZW50CgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgUEUgdG8gcmVnaXN0ZXIgYXMgYSBjbGllbnQgZm9yIG1hbmFnZW1lbnQgZnJhbWVzIGRlbGl2ZXJ5LgoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgQVBJIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIFRMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHBmblRsTWdtdEZybVJ4OiAgICAgcG9pbnRlciB0byB0aGUgcmVjZWl2ZSBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZW1lbnQgZnJhbWVzCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogTWdtdCBGcmFtZSBjbGllbnQgd2FzIGFscmVhZHkgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1JlZ2lzdGVyTWdtdEZybUNsaWVudAooCiAgdl9QVk9JRF90ICAgICAgICAgICAgICAgcHZvc0dDdHgsCiAgV0xBTlRMX01nbXRGcm1SeENCVHlwZSAgcGZuVGxNZ210RnJtUngKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwZm5UbE1nbXRGcm1SeCApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1JlZ2lzdGVyTWdtdEZybUNsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgTWFrZSBzdXJlIHRoaXMgaXMgdGhlIGZpcnN0IHJlZ2lzdHJhdGlvbiBhdHRlbXB0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAwICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMgKQogIHsKICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMrKzsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpNYW5hZ2VtZW50IGZyYW1lIGNsaWVudCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVnaXN0ZXIgc3RhdGlvbiB3aXRoIFRMCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgTWFuYWdlbWVudCBGcmFtZSBDbGllbnQiICkpOwoKICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnVjRXhpc3RzKys7CgogIGlmICggTlVMTCAhPSBwZm5UbE1nbXRGcm1SeCApCiAgewogICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC5wZm5UbE1nbXRGcm1SeCA9IHBmblRsTWdtdEZybVJ4OwogIH0KCiAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgPSBOVUxMOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1JlZ2lzdGVyTWdtdEZybUNsaWVudCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfRGVSZWdpc3Rlck1nbXRGcm1DbGllbnQKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBQRSB0byBkZXJlZ2lzdGVyIGFzIGEgY2xpZW50IGZvciBtYW5hZ2VtZW50IGZyYW1lcyBkZWxpdmVyeS4KCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIEFQSSBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0bwogICAgICAgICAgICAgICAgICAgICAgICBUTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBNZ210IEZyYW1lIGNsaWVudCB3YXMgbmV2ZXIgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0RlUmVnaXN0ZXJNZ210RnJtQ2xpZW50CigKICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgTWFrZSBzdXJlIHRoaXMgaXMgdGhlIGZpcnN0IHJlZ2lzdHJhdGlvbiBhdHRlbXB0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAwID09IHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpNYW5hZ2VtZW50IGZyYW1lIGNsaWVudCB3YXMgbmV2ZXIgcmVnaXN0ZXJlZCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENsZWFyIHJlZ2lzdHJhdGlvbiB3aXRoIFRMCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgIldMQU4gVEw6RGVyZWdpc3RlcmluZyBNYW5hZ2VtZW50IEZyYW1lIENsaWVudCIgKSk7CgogIHBUTENiLT50bE1nbXRGcm1DbGllbnQucGZuVGxNZ210RnJtUnggPSBXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiOwogIGlmICggTlVMTCAhPSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZikKICB7CiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAiV0xBTiBUTDpNYW5hZ2VtZW50IGNhY2hlIGJ1ZmZlciBub3QgZW1wdHkgb24gZGVyZWdpc3RlcmluZyIKICAgICAgICAgICAgICAgIiAtIGRyb3BwaW5nIHBhY2tldCIgKSk7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYpOwoKICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmID0gTlVMTDsgCiAgfQoKICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnVjRXhpc3RzID0gMDsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SZWdpc3Rlck1nbXRGcm1DbGllbnQgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1R4TWdtdEZybQoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFBFIHdoZW4gaXQgd2FudCB0byBzZW5kIG91dCBhIG1hbmFnZW1lbnQgZnJhbWUuCiAgICBIQUwgd2lsbCBhbHNvIHVzZSB0aGlzIEFQSSBmb3IgdGhlIGZldyBmcmFtZXMgaXQgc2VuZHMgb3V0LCB0aGV5IGFyZSBub3QKICAgIG1hbmFnZW1lbnQgZnJhbWVzIGhvd2V2ZXJlIGl0IGlzIGFjY2VwdGVkIHRoYXQgYW4gZXhjZXB0aW9uIHdpbGwgYmUKICAgIGFsbG93ZWQgT05MWSBmb3IgdGhlIHVzYWdlIG9mIEhBTC4KICAgIEdlbmVyaWMgZGF0YSBmcmFtZXMgU0hPVUxEIE5PVCB0cmF2ZWwgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLgoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgQVBJIGNhbiBiZSBjYWxsZWQuCgogICAgUkVTVFJJQ1RJT046IElmIFBFIHNlbmRzIGFub3RoZXIgcGFja2V0IGJlZm9yZSBUTCBtYW5hZ2VzIHRvIHByb2Nlc3MgdGhlCiAgICAgICAgICAgICAgICAgcHJldmlvdXNseSBzZW50IHBhY2tldCBjYWxsIHdpbGwgZW5kIGluIGZhaWx1cmUKCiAgICAgICAgICAgICAgICAgRnJhbWVzIGNvbW1pbmcgdGhyb3VnaCBoZXJlIG11c3QgYmUgODAyLjExIGZyYW1lcywgZnJhbWUKICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbiBpbiBVTUEgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRpc2FibGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7YSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB2b3NGcm1CdWY6ICAgICAgcG9pbnRlciB0byBhIHZPU1MgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG1hbmFnZW1lbnQKICAgICAgICAgICAgICAgICAgICBmcmFtZSB0byBiZSB0cmFuc21pdHRlZAogICAgdXNGcm1MZW46ICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkOyBpbmZvcm1hdGlvbgogICAgICAgICAgICAgICAgICAgIGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gdGhlIHZPU1MgYnVmZmVyCiAgICB3RnJtVHlwZTogICAgICAgdGhlIHR5cGUgb2YgdGhlIGZyYW1lIGJlaW5nIHRyYW5zbWl0dGVkCiAgICB0aWQ6ICAgICAgICAgICAgdGlkIHVzZWQgdG8gdHJhbnNtaXQgdGhpcyBmcmFtZQogICAgcGZuQ29tcFR4RnVuYzogIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIHRyYW5zbWl0IGNvbXBsZXRlIHJvdXRpbmUKICAgIHB2QkRIZWFkZXI6ICAgICBwb2ludGVyIHRvIHRoZSBCRCBoZWFkZXIsIGlmIE5VTEwgaXQgbWVhbnMgaXQgd2FzIG5vdAogICAgICAgICAgICAgICAgICAgIHlldCBjb25zdHJ1Y3RlZCBhbmQgaXQgbGllcyB3aXRoaW4gVEwncyByZXNwb25zaWJpbGl0eQogICAgICAgICAgICAgICAgICAgIHRvIGRvIHNvOyBpZiBub3QgTlVMTCBpdCBpcyBleHBlY3RlZCB0aGF0IGl0IHdhcwogICAgICAgICAgICAgICAgICAgIGFscmVhZHkgcGFja2VkIGluc2lkZSB0aGUgdm9zIHBhY2tldAogICAgdWNBY2tSZXNwb25zZTogIGZsYWcgbm90aWZ5aW5nIGl0IGFuIGludGVycnVwdCBpcyBuZWVkZWQgZm9yIHRoZQogICAgICAgICAgICAgICAgICAgIGFja25vd2xlZGdlbWVudCByZWNlaXZlZCB3aGVuIHRoZSBmcmFtZSBpcyBzZW50IG91dAogICAgICAgICAgICAgICAgICAgIHRoZSBhaXIgYW5kIDsgdGhlIGludGVycnVwdCB3aWxsIGJlIHByb2Nlc3NlZCBieSBIQUwsCiAgICAgICAgICAgICAgICAgICAgb25seSBvbmUgc3VjaCBmcmFtZSBjYW4gYmUgcGVuZGluZyBpbiB0aGUgc3lzdGVtIGF0CiAgICAgICAgICAgICAgICAgICAgb25lIHRpbWUuCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IE1nbXQgRnJhbWUgY2xpZW50IHdhcyBub3QgeWV0IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfRV9CVVNZOiAgIFRoZSBwcmV2aW91cyBNZ210IHBhY2tldCB3YXMgbm90IHlldCB0cmFuc21pdHRlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICAgT3RoZXIgZmFpbHVyZSBtZXNzYWdlcyBtYXkgYmUgcmV0dXJuZWQgZnJvbSB0aGUgQkQgaGVhZGVyIGhhbmRsaW5nCiAgICByb3V0aW5lcywgcGxlYXNlIGNoZWNrIGFwcm9wcmlhdGUgQVBJIGZvciBtb3JlIGluZm8uCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1R4TWdtdEZybQooCiAgdl9QVk9JRF90ICAgICAgICAgICAgcHZvc0dDdHgsCiAgdm9zX3BrdF90KiAgICAgICAgICAgdm9zRnJtQnVmLAogIHZfVTE2X3QgICAgICAgICAgICAgIHVzRnJtTGVuLAogIHZfVThfdCAgICAgICAgICAgICAgIHdGcm1UeXBlLAogIHZfVThfdCAgICAgICAgICAgICAgIHVjVGlkLAogIFdMQU5UTF9UeENvbXBDQlR5cGUgIHBmbkNvbXBUeEZ1bmMsCiAgdl9QVk9JRF90ICAgICAgICAgICAgcHZCREhlYWRlciwKICB2X1UzMl90ICAgICAgICAgICAgICB1Y0Fja1Jlc3BvbnNlLAogIHZfVTMyX3QgICAgICAgICAgICAgICB1Y1R4QmRUb2tlbgopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIHZfTUFDQUREUl90ICAgICB2RGVzdE1hY0FkZHI7CiAgVk9TX1NUQVRVUyAgICAgIHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICB2X1UxNl90ICAgICAgICAgdXNQa3RMZW47CiAgdl9VMzJfdCAgICAgICAgIHVzVGltZVN0YW1wID0gMDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSB2b3NGcm1CdWYgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfVHhNZ210RnJtIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9UeE1nbXRGcm0iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEVuc3VyZSB0aGF0IG1hbmFnZW1lbnQgZnJhbWUgY2xpZW50IHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIDAgPT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cyApCiAgewogICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cysrOwogICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgIldMQU4gVEw6TWFuYWdlbWVudCBGcmFtZSBjbGllbnQgbm90IHJlZ2lzdGVyIG9uIFdMQU5UTF9UeE1nbXRGcm0iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgYW55IE1nbXQgRnJtIGlzIHBlbmRpbmcKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAvL3Zvc1RlbXBCdWZmID0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmY7CiAgaWYgKCBOVUxMICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkKICB7CgogICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICJXTEFOIFRMOk1hbmFnZW1lbnQgRnJhbWUgYWxyZWFkeSBwZW5kaW5nIHR4IGluIFRMOiBmYWlsaW5nIG9sZCBvbmUiKSk7CgoKICAgIC8qRmFpbGluZyB0aGUgdHggZm9yIHRoZSBwcmV2aW91cyBwYWNrZXQgZW5xdWVkIGJ5IFBFKi8KICAgIC8vdm9zX2F0b21pY19zZXQoICh1aW50cHRyX3QqKSZwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKICAgIC8vICAgICAgICAgICAgICAgICAgICAodWludHB0cl90KU5VTEwpOwoKICAgIC8vdm9zX3BrdF9nZXRfdXNlcl9kYXRhX3B0ciggdm9zVGVtcEJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSZwZm5UeENvbXApOwoKICAgIC8qaXQgc2hvdWxkIG5ldmVyIGJlIE5VTEwgLSBkZWZhdWx0IGhhbmRsZXIgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgaWYgbm9uZSovCiAgICAvL2lmICggTlVMTCA9PSBwZm5UeENvbXAgKQogICAgLy97CiAgICAvLyAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAvLyAgICAgICAgICAgICJOVUxMIHBvaW50ZXIgdG8gVHggQ29tcGxldGUgb24gV0xBTlRMX1R4TWdtdEZybSIpOwogICAgLy8gIFZPU19BU1NFUlQoMCk7CiAgICAvLyAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIC8vfQoKICAgIC8vcGZuVHhDb21wKCBwdm9zR0N0eCwgdm9zVGVtcEJ1ZmYsIFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgKTsKICAgIC8vcmV0dXJuIFZPU19TVEFUVVNfRV9CVVNZOwoKCiAgICAvL3BmbkNvbXBUeEZ1bmMoIHB2b3NHQ3R4LCB2b3NGcm1CdWYsIFZPU19TVEFUVVNfRV9SRVNPVVJDRVMpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9SRVNPVVJDRVM7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIEJEIGhlYWRlciB3YXMgYnVpbGQsIGlmIG5vdCBjb25zdHJ1Y3QKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHZCREhlYWRlciApCiAgewogICAgIHZfTUFDQUREUl90KiAgICAgcHZBZGRyMk1hY0FkZHI7CiAgICAgdl9VOF90ICAgdVFvc0hkciA9IFZPU19GQUxTRTsKCiAgICAgLyogR2V0IGFkZHJlc3MgMiBvZiBNYW5nZW1lbnQgRnJhbWUgdG8gZ2l2ZSB0byBXTEFOSEFMX0ZpbGxUeEJkICovCiAgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEoIHZvc0ZybUJ1ZiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9NQUNfQUREUl9BTElHTigxKSArIFZPU19NQUNfQUREUl9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSZwdkFkZHIyTWFjQWRkciwgVk9TX01BQ19BRERSX1NJWkUpOwoKICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgIHsKICAgICAgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGdldCBhZGRyMiAlZCIsIHZvc1N0YXR1cykpOwogICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICB9CgogICAgLyogRVNFIElBUFAvVERMUyBGcmFtZSB3aGljaCBhcmUgZGF0YSBmcmFtZXMgYnV0IHRlY2huaWNhbGx5IHVzZWQKICAgICAqIGZvciBtYW5hZ2VtZW50IGZ1bmN0aW9uYWxpdHkgY29tZXMgdGhyb3VnaCByb3V0ZS4KICAgICAqLwogICAgaWYgKFdMQU5UTF9JU19RT1NfREFUQV9GUkFNRSh3RnJtVHlwZSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB7CiAgICAgICAgdVFvc0hkciA9IFZPU19UUlVFOwogICAgfQoKICAgIGlmIChXTEFOVExfSVNfUFJPQkVfUkVRKHdGcm1UeXBlKSkKICAgIHsKICAgICAgICBpZiAoVk9TX1RSVUUgPT0gdm9zX21lbV9jb21wYXJlKCh2X1ZPSURfdCopIHB2QWRkcjJNYWNBZGRyLAogICAgICAgICAgICAodl9WT0lEX3QqKSAmcFRMQ2ItPnNwb29mTWFjQWRkci5zcG9vZk1hYywgVk9TX01BQ19BRERSRVNTX0xFTikpCiAgICAgICAgewogICAgICAgICAgICBwdkFkZHIyTWFjQWRkciA9ICh2X1BWT0lEX3QpcFRMQ2ItPnNwb29mTWFjQWRkci5zZWxmTWFjLmJ5dGVzOwogICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAgIlRMOiB1c2luZyBzZWxmIHN0YSBhZGRyIHRvIGdldCBzdGFpZHggZm9yIHNwb29mZWQgcHJvYmUgcmVxICIKICAgICAgICAgICAgICAgICAgICBNQUNfQUREUkVTU19TVFIsIE1BQ19BRERSX0FSUkFZKHB2QWRkcjJNYWNBZGRyLT5ieXRlcykpOwogICAgICAgIH0KICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgQ2FsbCBXREEgdG8gYnVpbGQgVFggaGVhZGVyCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICB2b3NTdGF0dXMgPSBXREFfRFNfQnVpbGRUeFBhY2tldEluZm8oIHB2b3NHQ3R4LCB2b3NGcm1CdWYgLCAmdkRlc3RNYWNBZGRyLCAKICAgICAgICAgICAgICAgICAgIDEgLyogYWx3YXlzIDgwMi4xMSBmcmFtZXMqLywgJnVzUGt0TGVuLCB1UW9zSGRyIC8qcW9zIG5vdCBlbmFibGVkICEhISovLCAKICAgICAgICAgICAgICAgICAgIDAgLyogV0RTIG9mZiAqLywgMCwgd0ZybVR5cGUsIHB2QWRkcjJNYWNBZGRyLCB1Y1RpZCwKICAgICAgICAgICAgICAgICAgIHVjQWNrUmVzcG9uc2UsIHVzVGltZVN0YW1wLCAwLCAwLCAwLCB1Y1R4QmRUb2tlbik7CgoKICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpICkKICAgIHsKICAgICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gYnVpbGQgVFggaGVhZGVyICVkIiwgdm9zU3RhdHVzKSk7CiAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CiAgIH0vKiBpZiBCRCBoZWFkZXIgbm90IHByZXNlbnQgKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhdmUgYnVmZmVyIGFuZCBub3RpZnkgQkFMOyBubyBsb2NrIGlzIG5lZWRlZCBpZiB0aGUgYWJvdmUgcmVzdHJpY3Rpb24KICAgIGlzIG1ldAogICAgU2F2ZSB0aGUgdHggY29tcGxldGUgZm5jdCBwb2ludGVyIGFzIHRsIHNwZWNpZmljIGRhdGEgaW4gdGhlIHZvcyBidWZmZXIKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgIT0gcGZuQ29tcFR4RnVuYyApCiAgewogICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRnJtQnVmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpcGZuQ29tcFR4RnVuYyk7CiAgfQogIGVsc2UKICB7CiAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NGcm1CdWYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClXTEFOVExfVHhDb21wRGVmYXVsdENiKTsKCiAgfQogIHZvc19hdG9taWNfc2V0KCAodWludHB0cl90KikmcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAodWludHB0cl90KXZvc0ZybUJ1Zik7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiB0aHJlIGFyZSBlbm91Z2ggcmVzb3VyY2VzIGZvciB0cmFuc21pc3Npb24gYW5kIHR4IGlzIG5vdAogICAgc3VzcGVuZGVkLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX01GICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICJXTEFOIFRMOklzc3VpbmcgWG1pdCBzdGFydCByZXF1ZXN0IHRvIEJBTCBmb3IgTUdNVCIpKTsKICAgIHZvc1N0YXR1cyA9IFdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOwogICAgaWYoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykKICAgIHsKICAgICAgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICAiV0xBTiBUTDpXREFfRFNfU3RhcnRYbWl0IGZhaWxzLiB2b3NTdGF0dXMgJWQiLCB2b3NTdGF0dXMpKTsKICAgICAgIHZvc19hdG9taWNfc2V0KCAodWludHB0cl90KikmcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsMCk7CiAgICB9CiAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgCiAgfQogIGVsc2UKICB7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBObyBlcnJvciBjb2RlIGlzIHNlbnQgYmVjYXVzZSBUTCB3aWxsIHJlc3VtZSB0eCBhdXRvbm9tb3VzbHkgaWYKICAgICAgcmVzb3VyY2VzIGJlY29tZSBhdmFpbGFibGUgb3IgdHggZ2V0cyByZXN1bWVkCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgIldMQU4gVEw6UmVxdWVzdCB0byBzZW5kIGZvciBNZ210IEZybSBidXQgY29uZGl0aW9uIG5vdCBtZXQuIFJlczogJWQiLAogICAgICAgICAgICAgICBwVExDYi0+dVJlc0NvdW50KSk7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1R4TWdtdEZybSAqLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJTlRFUkFDVElPTiBXSVRIIEhBTAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1Jlc2V0Tm90aWZpY2F0aW9uCgogIERFU0NSSVBUSU9OCiAgICBIQUwgbm90aWZpZXMgVEwgd2hlbiB0aGUgbW9kdWxlIGlzIGJlaW5nIHJlc2V0LgogICAgQ3VycmVudGx5IG5vdCB1c2VkLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1Jlc2V0Tm90aWZpY2F0aW9uCigKICB2X1BWT0lEX3QgICBwdm9zR0N0eAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9SZXNldE5vdGlmaWNhdGlvbiIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBXTEFOVExfQ2xlYW5DQihwVExDYiwgMSAvKmVtcHR5IGFsbCBxdWV1ZXMgYW5kIHBlbmRpbmcgcGFja2V0cyovKTsKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1Jlc2V0Tm90aWZpY2F0aW9uICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TdXNwZW5kRGF0YVR4CgogIERFU0NSSVBUSU9OCiAgICBIQUwgY2FsbHMgdGhpcyBBUEkgd2hlbiBpdCB3aXNoZXMgdG8gc3VzcGVuZCB0cmFuc21pc3Npb24gZm9yIGEKICAgIHBhcnRpY3VsYXIgU1RBLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgZm9yIHdoaWNoIHRoZSByZXF1ZXN0IGlzIG1hZGUgbXVzdCBiZSBmaXJzdCByZWdpc3RlcmVkIHdpdGgKICAgIFRMIGJ5IEhERC4KCiAgICBSRVNUUklDVElPTjogIEluIGNhc2Ugb2YgYSBzdXNwZW5kLCB0aGUgZmxhZyB3cml0ZSBhbmQgcmVhZCB3aWxsIG5vdCBiZQogICAgICAgICAgICAgICAgICBsb2NrZWQ6IHdvcnN0IGNhc2Ugc2NlbmFyaW8gb25lIG1vcmUgcGFja2V0IGNhbiBnZXQKICAgICAgICAgICAgICAgICAgdGhyb3VnaCBiZWZvcmUgdGhlIGZsYWcgZ2V0cyB1cGRhdGVkICh3ZSBjYW4gbWFrZSB0aGlzCiAgICAgICAgICAgICAgICAgIHdyaXRlIGF0b21pYyBhcyB3ZWxsIHRvIGd1YXJhbnRlZSBjb25zaXN0ZW5jeSkKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHB1Y1NUQUlkOiAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyBtYWRlOwogICAgICAgICAgICAgICAgICAgIGEgdmFsdWUgb2YgTlVMTCBhc3N1bWVzIHN1c3BlbmQgb24gYWxsIGFjdGl2ZSBzdGF0aW9uCiAgICBwZm5TdXNwZW5kVHhDQjogcG9pbnRlciB0byB0aGUgc3VzcGVuZCByZXN1bHQgbm90aWZpY2F0aW9uIGluIGNhc2UgdGhlCiAgICAgICAgICAgICAgICAgICAgY2FsbCBpcyBhc3luY2hyb25vdXMKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiAgU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KClZPU19TVEFUVVMKV0xBTlRMX1N1c3BlbmREYXRhVHgKKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90KiAgICAgICAgICAgICAgICBwdWNTVEFJZCwKICBXTEFOVExfU3VzcGVuZENCVHlwZSAgIHBmblN1c3BlbmRUeAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIHZvc19tc2dfdCAgICAgICB2b3NNc2c7CgogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1N1c3BlbmREYXRhVHgiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIHRoZSB0eXBlIG9mIHJlcXVlc3Q6IGdlbmVyaWMgc3VzcGVuZCwgb3IgcGVyIHN0YXRpb24gc3VzcGVuZAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmIChOVUxMID09IHB1Y1NUQUlkKQogIHsKICAgIC8qIEdlbmVyYWwgU3VzcGVuZCBSZXF1ZXN0IHJlY2VpdmVkICovCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICJXTEFOIFRMOkdlbmVyYWwgc3VzcGVuZCByZXF1ZXN0ZWQiKSk7CiAgICB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT51Y1R4U3VzcGVuZGVkLCAxKTsKICAgIHZvc01zZy5yZXNlcnZlZCA9IFdMQU5fTUFYX1NUQV9DT1VOVDsKICB9CiAgZWxzZQogIHsKICAgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCAqcHVjU1RBSWQgKSApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCAlZCByZXF1ZXN0ZWQgb24gV0xBTlRMX1N1c3BlbmREYXRhVHgiLCAqcHVjU1RBSWQpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIH0KCiAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXSApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwVExDYi0+YXRsU1RBQ2xpZW50cyBwb2ludGVyIGZvciBTVEEgSWQgOiVkIG9uICIKICAgICAgICAgICAgIldMQU5UTF9TdXNwZW5kRGF0YVR4IiwgKnB1Y1NUQUlkKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjRXhpc3RzICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6U3RhdGlvbiAlZCB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfU3VzcGVuZERhdGFUeCIsICpwdWNTVEFJZCkpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICAgIH0KCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAiV0xBTiBUTDpTdXNwZW5kIHJlcXVlc3QgZm9yIHN0YXRpb246ICVkIiwgKnB1Y1NUQUlkKSk7CiAgICB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjVHhTdXNwZW5kZWQsIDEpOwogICAgdm9zTXNnLnJlc2VydmVkID0gKnB1Y1NUQUlkOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNlcmlhbGl6ZSByZXF1ZXN0IHRocm91Z2ggVFggdGhyZWFkCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zTXNnLnR5cGUgICAgID0gV0xBTlRMX1RYX1NJR19TVVNQRU5EOwogIHZvc01zZy5ib2R5cHRyICAgICA9ICh2X1BWT0lEX3QpcGZuU3VzcGVuZFR4OwoKICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsIFRSQUNFX0NPREVfVExfU1VTUEVORF9EQVRBX1RYLAogICAgICAgICAgICAgICAgICAgIHZvc01zZy5yZXNlcnZlZCAsIDAgKSk7CgogIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX3R4X21xX3NlcmlhbGl6ZSggVk9TX01RX0lEX1RMLCAmdm9zTXNnKSkpCiAgewogICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICIgJXMgZmFpbHMgdG8gcG9zdCBtZXNzYWdlIiwgX19mdW5jX18pOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TdXNwZW5kRGF0YVR4ICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9SZXN1bWVEYXRhVHgKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBIQUwgdG8gcmVzdW1lIGRhdGEgdHJhbnNtaXNzaW9uIGZvciBhIGdpdmVuIFNUQS4KCiAgICBXQVJOSU5HOiBJZiBhIHN0YXRpb24gd2FzIGluZGl2aWR1YWxseSBzdXNwZW5kZWQgYSBnbG9iYWwgcmVzdW1lIHdpbGwKICAgICAgICAgICAgIG5vdCByZXN1bWUgdGhhdCBzdGF0aW9uCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgcHVjU1RBSWQ6ICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gd2hpY2ggaXMgYmVpbmcgcmVzdW1lZDsgTlVMTAogICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZXMgaW50byBnbG9iYWwgcmVzdW1lCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiAgU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KClZPU19TVEFUVVMKV0xBTlRMX1Jlc3VtZURhdGFUeAooCiAgdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCiAgdl9VOF90KiAgICAgICAgcHVjU1RBSWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfUmVzdW1lRGF0YVR4IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayB0byBzZWUgdGhlIHR5cGUgb2YgcmVzdW1lCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHB1Y1NUQUlkICkKICB7CiAgICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsIFRSQUNFX0NPREVfVExfUkVTVU1FX0RBVEFfVFgsCiAgICAgICAgICAgICAgICAgICAgICA0MSAsIDAgKSk7CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAiV0xBTiBUTDpHZW5lcmFsIHJlc3VtZSByZXF1ZXN0ZWQiKSk7CiAgICB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT51Y1R4U3VzcGVuZGVkLCAwKTsKICB9CiAgZWxzZQogIHsKICAgIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwgVFJBQ0VfQ09ERV9UTF9SRVNVTUVfREFUQV9UWCwKICAgICAgICAgICAgICAgICAgICAgICpwdWNTVEFJZCAsIDAgKSk7CgogICAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoICpwdWNTVEFJZCApKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCAlZCByZXF1ZXN0ZWQgb24gV0xBTlRMX1Jlc3VtZURhdGFUeCIsICpwdWNTVEFJZCkpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfQoKICAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBUTENiLT5hdGxTVEFDbGllbnRzIHBvaW50ZXIgZm9yIFNUQSBJZCA6JWQgb24gIgogICAgICAgICAgICAiV0xBTlRMX1Jlc3VtZURhdGFUeCIsICpwdWNTVEFJZCkpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfQoKICAgIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0V4aXN0cyApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOlN0YXRpb24gJWQgd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX1Jlc3VtZURhdGFUeCIsICpwdWNTVEFJZCkpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICAgIH0KCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAiV0xBTiBUTDpSZXN1bWUgcmVxdWVzdCBmb3Igc3RhdGlvbjogJWQiLCAqcHVjU1RBSWQpKTsKICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNUeFN1c3BlbmRlZCwgMCk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVzdW1pbmcgdHJhbnNtaXNzaW9uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX01GICkgJiYKICAgICAgKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkpCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6UmVzdW1pbmcgdHJhbnNtaXNzaW9uIikpOwogICAgcmV0dXJuIFdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SZXN1bWVEYXRhVHggKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU3VzcGVuZENCCgogIERFU0NSSVBUSU9OCiAgICBDYWxsYmFjayBmdW5jdGlvbiBmb3Igc2VyaWFsaXppbmcgU3VzcGVuZCBzaWduYWwgdGhyb3VnaCBUeCB0aHJlYWQKCiAgREVQRU5ERU5DSUVTCiAgICBKdXN0IG5vdGlmeSBIQUwgdGhhdCBzdXNwZW5kIGluIFRMIGlzIGNvbXBsZXRlLgoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICBwVXNlckRhdGE6ICAgICAgdXNlciBkYXRhIHNlbnQgd2l0aCB0aGUgY2FsbGJhY2sKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1N1c3BlbmRDQgooCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIFdMQU5UTF9TdXNwZW5kQ0JUeXBlICBwZm5TdXNwZW5kQ0IsCiAgdl9VMTZfdCAgICAgICAgICAgICAgIHVzUmVzZXJ2ZWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiICAgPSBOVUxMOwogIHZfVThfdCAgICAgICAgICB1Y1NUQUlkID0gKHZfVThfdCl1c1Jlc2VydmVkOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBmblN1c3BlbmRDQiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBObyBDYWxsIGJhY2sgcHJvY2Vzc2luZyByZXF1ZXN0ZWQgV0xBTlRMX1N1c3BlbmRDQiIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1N1c3BlbmRDQiIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBwZm5TdXNwZW5kQ0IocHZvc0dDdHgsIE5VTEwsIFZPU19TVEFUVVNfU1VDQ0VTUyk7CiAgfQogIGVsc2UKICB7CiAgICBwZm5TdXNwZW5kQ0IocHZvc0dDdHgsICZ1Y1NUQUlkLCBWT1NfU1RBVFVTX1NVQ0NFU1MpOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qV0xBTlRMX1N1c3BlbmRDQiovCgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDTElFTlQgSU5ERVBFTkRFTlQgSU5URVJGQUNFCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfR2V0VHhQa3RDb3VudAoKICBERVNDUklQVElPTgogICAgVEwgd2lsbCBwcm92aWRlIHRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgcGFja2V0cyBjb3VudGVkIHBlcgogICAgU1RBIHBlciBUSUQuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24KICAgIHVjVGlkOiAgICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSB0c3BlYwoKICAgIE9VVAogICAgcHVUeFBrdENvdW50OiAgIHRoZSBudW1iZXIgb2YgcGFja2V0cyB0eCBwYWNrZXQgZm9yIHRoaXMgU1RBIGFuZCBUSUQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiAgU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0VHhQa3RDb3VudAooCiAgdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgdWNTVEFJZCwKICB2X1U4X3QgICAgICAgICB1Y1RpZCwKICB2X1UzMl90KiAgICAgICBwdVR4UGt0Q291bnQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwdVR4UGt0Q291bnQgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0VHhQa3RDb3VudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApIHx8IFdMQU5UTF9USURfSU5WQUxJRCggdWNUaWQpICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkICVkL3RpZCAlZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0dldFR4UGt0Q291bnQiLAogICAgICAgICAgICB1Y1NUQUlkLCB1Y1RpZCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGlmIHN0YXRpb24gZXhpc3RzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfR2V0VHhQa3RDb3VudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0dldFR4UGt0Q291bnQgJWQiLAogICAgIHVjU1RBSWQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJldHVybiBkYXRhCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgLy9WT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCwKICAgIC8vICAgICAgICAgIldMQU4gVEw6UmVxdWVzdGVkIHR4IHBhY2tldCBjb3VudCBmb3IgU1RBOiAlZCwgVElEOiAlZCIsIAogICAgICAvLyAgICAgICAgIHVjU1RBSWQsIHVjVGlkKTsKCiAgKnB1VHhQa3RDb3VudCA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5hdVR4Q291bnRbdWNUaWRdOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0dldFR4UGt0Q291bnQgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFJ4UGt0Q291bnQKCiAgREVTQ1JJUFRJT04KICAgIFRMIHdpbGwgcHJvdmlkZSB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIHBhY2tldHMgY291bnRlZCBwZXIKICAgIFNUQSBwZXIgVElELgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uCiAgICB1Y1RpZDogICAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgdHNwZWMKCiAgIE9VVAogICAgcHVUeFBrdENvdW50OiAgIHRoZSBudW1iZXIgb2YgcGFja2V0cyByeCBwYWNrZXQgZm9yIHRoaXMgU1RBIGFuZCBUSUQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiAgU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0UnhQa3RDb3VudAooCiAgdl9QVk9JRF90ICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgdWNTVEFJZCwKICB2X1U4X3QgICAgICAgICB1Y1RpZCwKICB2X1UzMl90KiAgICAgICBwdVJ4UGt0Q291bnQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHVSeFBrdENvdW50ICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0dldFJ4UGt0Q291bnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSB8fCBXTEFOVExfVElEX0lOVkFMSUQoIHVjVGlkKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkICVkL3RpZCAlZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0dldFJ4UGt0Q291bnQiLAogICAgICAgICAgICAgdWNTVEFJZCwgdWNUaWQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldFJ4UGt0Q291bnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0dldFJ4UGt0Q291bnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZXR1cm4gZGF0YQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX01FRCwKICAgICAgICAgICAgIldMQU4gVEw6UmVxdWVzdGVkIHJ4IHBhY2tldCBjb3VudCBmb3IgU1RBOiAlZCwgVElEOiAlZCIsCiAgICAgICAgICAgICB1Y1NUQUlkLCB1Y1RpZCkpOwoKICAqcHVSeFBrdENvdW50ID0gcENsaWVudFNUQS0+YXVSeENvdW50W3VjVGlkXTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9HZXRSeFBrdENvdW50ICovCgpWT1NfU1RBVFVTCldMQU5UTF9UeEZDRnJhbWUKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eAopOwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfSXNFQVBPTFBlbmRpbmcKCiAgREVTQ1JJUFRJT04KCiAgICBIREQgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuIGhkZF90eF90aW1lb3V0IG9jY3Vycy4gVGhpcyBjaGVja3Mgd2hldGhlcgogICAgRUFQT0wgaXMgcGVuZGluZy4KCiAgREVQRU5ERU5DSUVTCgogICAgSEREIG11c3QgaGF2ZSByZWdpc3RlcmVkIHdpdGggVEwgYXQgbGVhc3Qgb25lIFNUQSBiZWZvcmUgdGhpcyBmdW5jdGlvbgogICAgY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgU3VjY2VzcyA6IEluZGljYXRlcyBFQVBPTCBmcmFtZSBpcyBwZW5kaW5nIGFuZCBzdGEgaXMgaW4gY29ubmVjdGVkIHN0YXRlCgogICAgRmFpbHVyZSA6IEVBUE9MIGZyYW1lIGlzIG5vdCBwZW5kaW5nCgogIFNJREUgRUZGRUNUUwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfSXNFQVBPTFBlbmRpbmcKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eAopCnsKICAgV0xBTlRMX0NiVHlwZSogICAgICBwVExDYiA9IE5VTEw7CiAgIHZfVTMyX3QgICAgICAgICAgICAgaSA9IDA7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogICAgaWYgKE5VTEwgPT0gcFRMQ2IpCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZm9yIHB2b3NHQ3R4IikpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICB9CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIENoZWNrIHRvIHNlZSBpZiB0aGVyZSB3YXMgYW55IEVBUE9MIHBhY2tldCBpcyBwZW5kaW5nCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGZvciAoIGkgPSAwOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspCiAgICB7CiAgICAgICBpZiAoKE5VTEwgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0pICYmCiAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT51Y0V4aXN0cykgJiYKICAgICAgICAgICAoMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dWNUeFN1c3BlbmRlZCkgJiYKICAgICAgICAgICAoV0xBTlRMX1NUQV9DT05ORUNURUQgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnRsU3RhdGUpICYmCiAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT51Y1BrdFBlbmRpbmcpCiAgICAgICAgICAgKQogICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICB9CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgVEwgSU5URVJOQUwgQVBJIERFRklOSVRJT04KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRGcmFtZXMKCiAgREVTQ1JJUFRJT04KCiAgICBCQUwgY2FsbHMgdGhpcyBmdW5jdGlvbiBhdCB0aGUgcmVxdWVzdCBvZiB0aGUgbG93ZXIgYnVzIGludGVyZmFjZS4KICAgIFdoZW4gdGhpcyByZXF1ZXN0IGlzIGJlaW5nIHJlY2VpdmVkIFRMIHdpbGwgcmV0cmlldmUgcGFja2V0cyBmcm9tIEhERAogICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBwcmlvcml0eSBydWxlcyBhbmQgdGhlIGNvdW50IHN1cHBsaWVkIGJ5IEJBTC4KCiAgREVQRU5ERU5DSUVTCgogICAgSEREIG11c3QgaGF2ZSByZWdpc3RlcmVkIHdpdGggVEwgYXQgbGVhc3Qgb25lIFNUQSBiZWZvcmUgdGhpcyBmdW5jdGlvbgogICAgY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgQkFMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVTaXplOiAgICAgICAgICBtYXhpbXVtIHNpemUgYWNjZXB0ZWQgYnkgdGhlIGxvd2VyIGxheWVyCiAgICB1Rmxvd01hc2sgICAgICAgVFggZmxvdyBjb250cm9sIG1hc2sgZm9yIFByaW1hLiBFYWNoIGJpdCBpcyBkZWZpbmVkIGFzIAogICAgICAgICAgICAgICAgICAgIFdEQV9UWEZsb3dFbnVtVHlwZQoKICAgIE9VVAogICAgdm9zRGF0YUJ1ZmY6ICAgaXQgd2lsbCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgYnVmZmVyIHN1cHBsaWVkCiAgICAgICAgICAgICAgICAgICAgYnkgVEwsIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGFja2V0IHN1cHBsaWVkLCBUTAogICAgICAgICAgICAgICAgICAgIHdpbGwgY2hhaW4gdGhlbSB0aHJvdWdoIHZPU1MgYnVmZmVycwoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIDEgb3IgbW9yZTogbnVtYmVyIG9mIHJlcXVpcmVkIHJlc291cmNlcyBpZiB0aGVyZSBhcmUgc3RpbGwgZnJhbWVzIHRvIGZldGNoCiAgICAwIDogZXJyb3Igb3IgSEREIHF1ZXVlcyBhcmUgZHJhaW5lZAoKICBTSURFIEVGRkVDVFMKCiAgTk9URQogICAgCiAgICBGZWF0dXJpemVkIHVGbG93TWFzay4gSWYgd2Ugd2FudCB0byByZW1vdmUgZmVhdHVyaXphdGlvbiwgd2UgbmVlZCB0byBjaGFuZ2UKICAgIEJBTCBvbiBWb2xhbnMuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdl9VMzJfdApXTEFOVExfR2V0RnJhbWVzCigKICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgsCiAgdm9zX3BrdF90ICAgICAqKnBwRnJhbWVEYXRhQnVmZiwKICB2X1UzMl90ICAgICAgICAgdVNpemUsCiAgdl9VOF90ICAgICAgICAgIHVGbG93TWFzaywKICB2X0JPT0xfdCogICAgICAgcGJVcmdlbnQKKQp7CiAgIHZvc19wa3RfdCoqICAgICAgICAgcHZvc0RhdGFCdWZmID0gKHZvc19wa3RfdCoqKXBwRnJhbWVEYXRhQnVmZjsKICAgV0xBTlRMX0NiVHlwZSogICAgICBwVExDYiA9IE5VTEw7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAgdl9VMzJfdCAgICAgICAgICAgICB1UmVtYWluaW5nID0gdVNpemU7CiAgIHZvc19wa3RfdCogICAgICAgICAgdm9zUm9vdDsKICAgdm9zX3BrdF90KiAgICAgICAgICB2b3NUZW1wQnVmOwogICBXTEFOVExfU1RBRnVuY1R5cGUgIHBmblNUQUZzbTsKICAgdl9VMTZfdCAgICAgICAgICAgICB1c1BrdExlbjsKICAgdl9VMzJfdCAgICAgICAgICAgICB1UmVzTGVuOwogICB2X1U4X3QgICAgICAgICAgICAgIHVjU1RBSWQ7CiAgIHZfVThfdCAgICAgICAgICAgICAgdWNBQzsKICAgdm9zX3BrdF90KiAgICAgICAgICB2b3NEYXRhQnVmZjsKICAgdl9VMzJfdCAgICAgICAgICAgICB1VG90YWxQa3RMZW47CiAgIHZfVTMyX3QgICAgICAgICAgICAgaT0wOwogICB2X1UzMl90ICAgICAgICAgICAgIGo9MDsKICAgdl9VMzJfdCAgICAgICAgICAgICB1Y1Jlc3VsdCA9IDA7CiAgIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzOwogICBXTEFOVExfU1RBRXZlbnRUeXBlICAgd1NUQUV2ZW50OwogICB0QnNzU3lzdGVtUm9sZSAgICAgICBzeXN0ZW1Sb2xlOwogICB0cEFuaVNpckdsb2JhbCBwTWFjOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICgoIE5VTEwgPT0gcFRMQ2IgKSB8fCAoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gdWNSZXN1bHQ7CiAgfQoKICBwTWFjID0gdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfUEUsIHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcE1hYyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBNYWMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIHVjUmVzdWx0OwogIH0KCiAgdm9zRGF0YUJ1ZmYgPSBwVExDYi0+dm9zRHVtbXlCdWY7IC8qIEp1c3QgdG8gYXZvaWQgY2hlY2tpbmcgZm9yIE5VTEwgYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIGl0ZXJhdGlvbiAqLwoKICBwVExDYi0+dVJlc0NvdW50ID0gdVNpemU7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhdmUgdGhlIHJvb3QgYXMgd2Ugd2lsbCB3YWxrIHRoaXMgY2hhaW4gYXMgd2UgZmlsbCBpdAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zUm9vdCA9IHZvc0RhdGFCdWZmOwogCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVGhlcmUgaXMgc3RpbGwgZGF0YSAtIHVudGlsIEZTTSBmdW5jdGlvbiBzYXlzIG90aGVyd2lzZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2ItPmJVcmdlbnQgICAgICA9IEZBTFNFOwoKICB3aGlsZSAoKCBwVExDYi0+dGxDb25maWdJbmZvLnVNaW5GcmFtZXNQcm9jVGhyZXMgPCBwVExDYi0+dVJlc0NvdW50ICkgJiYKICAgICAgICAgKCAwIDwgdVJlbWFpbmluZyApKQogIHsKICAgIHN5c3RlbVJvbGUgPSB3ZGFHZXRHbG9iYWxTeXN0ZW1Sb2xlKHBNYWMpOwojaWZkZWYgV0xBTl9TT0ZUQVBfRkxPV0NUUkxfRU4KLyogRklYTUU6IFRoZSBjb2RlIGhhcyBiZWVuIGRpc2FibGVkIHNpbmNlIGl0IGlzIGNyZWF0aW5nIGlzc3VlcyBpbiBwb3dlciBzYXZlICovCiAgICBpZiAoZVNZU1RFTV9BUF9ST0xFID09IHN5c3RlbVJvbGUpCiAgICB7CiAgICAgICBpZiAocFRMQ2ItPmRvbmVfb25jZSA9PSAwICYmIE5VTEwgPT0gcFRMQ2ItPnZvc1R4RkNCdWYpCiAgICAgICB7CiAgICAgICAgICBXTEFOVExfVHhGQ0ZyYW1lIChwdm9zR0N0eCk7CiAgICAgICAgICBwVExDYi0+ZG9uZV9vbmNlICsrOwogICAgICAgfQogICAgfSAKICAgIGlmICggTlVMTCAhPSBwVExDYi0+dm9zVHhGQ0J1ZiApCiAgICB7CiAgICAgICAvL3RoZXJlIGlzIGZsb3cgY29udHJvbCBwYWNrZXQgd2FpdGluZyB0byBiZSBzZW50CiAgICAgICBXREFfVExJX1BST0NFU1NfRlJBTUVfTEVOKCBwVExDYi0+dm9zVHhGQ0J1ZiwgdXNQa3RMZW4sIHVSZXNMZW4sIHVUb3RhbFBrdExlbik7CiAgICAKICAgICAgIGlmICggKCBwVExDYi0+dVJlc0NvdW50ID4gdVJlc0xlbiApICYmCiAgICAgICAgICAgICggdVJlbWFpbmluZyA+IHVUb3RhbFBrdExlbiApICYmCiAgICAgICAgICAgICggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfRkMgKSApICkKICAgICAgIHsKICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDaGFpbmluZyBGQyBmcmFtZSBmaXJzdCBvbiBHZXRGcmFtZSIpKTsKCiAgICAgICAgICB2b3NfcGt0X2NoYWluX3BhY2tldCggdm9zRGF0YUJ1ZmYsIHBUTENiLT52b3NUeEZDQnVmLCAxIC8qdHJ1ZSovICk7CgogICAgICAgICAgdm9zX2F0b21pY19zZXQoICh1aW50cHRyX3QqKSZwVExDYi0+dm9zVHhGQ0J1ZiwgKHVpbnRwdHJfdCkgTlVMTCk7CgogICAgICAgICAgLypGQyBmcmFtZXMgY2Fubm90IGJlIGRlbGF5ZWQqLwogICAgICAgICAgcFRMQ2ItPmJVcmdlbnQgICAgICA9IFRSVUU7CgogICAgICAgICAgLypVcGRhdGUgcmVtYWluaW5nIGxlbiBmcm9tIFNTQyAqLwogICAgICAgICAgdVJlbWFpbmluZyAgICAgICAgLT0gKHVzUGt0TGVuICsgV0RBX0RYRV9IRUFERVJfU0laRSk7CgogICAgICAgICAgLypVcGRhdGUgcmVzb3VyY2UgY291bnQgKi8KICAgICAgICAgIHBUTENiLT51UmVzQ291bnQgLT0gdVJlc0xlbjsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgIldMQU4gVEw6c2VuZCBmYyBvdXQgb2Ygc291cmNlICVzIiwgX19mdW5jX18pKTsKICAgICAgICAgIHVjUmVzdWx0ID0gKCBwVExDYi0+dVJlc0NvdW50ID4gdVJlc0xlbiApP1ZPU19UUlVFOlZPU19GQUxTRTsKICAgICAgICAgIGJyZWFrOyAvKiBPdXQgb2YgcmVzb3VyY2VzIG9yIHJlYWNoZWQgbWF4IGxlbiAqLwogICAgICAgfQogICB9CiAgIGVsc2UgCiNlbmRpZiAvL1dMQU5fU09GVEFQX0ZMT1dDVFJMX0VOCgogICAgaWYgKCggTlVMTCAhPSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApICYmCiAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19NR01UICkgKSApCiAgICB7CiAgICAgIFdEQV9UTElfUFJPQ0VTU19GUkFNRV9MRU4oIHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVzUGt0TGVuLCB1UmVzTGVuLCB1VG90YWxQa3RMZW4pOwoKICAgICAgaWYgKHVzUGt0TGVuID4gV0xBTlRMX01BWF9BTExPV0VEX0xFTikKICAgICAgewogICAgICAgICAgdXNQa3RMZW4gPSBXTEFOVExfTUFYX0FMTE9XRURfTEVOOwogICAgICAgICAgVk9TX0FTU0VSVCgwKTsKICAgICAgfQoKICAgICAgaWYgKCAoIHBUTENiLT51UmVzQ291bnQgPiB1UmVzTGVuICkgJiYKICAgICAgICAgICAoIHVSZW1haW5pbmcgPiB1VG90YWxQa3RMZW4gKSAmJgogICAgICAgICAgICggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfTUdNVCApICkgKQogICAgICB7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNoYWluaW5nIG1hbmFnZW1lbnQgZnJhbWUgb24gR2V0RnJhbWUiKSk7CgogICAgICAgIHZvc19wa3RfY2hhaW5fcGFja2V0KCB2b3NEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyp0cnVlKi8gKTsKCiAgICAgICAgdm9zX2F0b21pY19zZXQoICh1aW50cHRyX3QqKSZwVExDYi0+dGxNZ210RnJtQ2xpZW50LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zUGVuZGluZ0RhdGFCdWZmLCAodWludHB0cl90KU5VTEwpOwoKICAgICAgICAvKm1hbmFnZW1lbnQgZnJhbWVzIGNhbm5vdCBiZSBkZWxheWVkKi8KICAgICAgICBwVExDYi0+YlVyZ2VudCAgICAgID0gVFJVRTsKCiAgICAgICAgLypVcGRhdGUgcmVtYWluaW5nIGxlbiBmcm9tIFNTQyAqLwogICAgICAgIHVSZW1haW5pbmcgICAgICAgIC09ICh1c1BrdExlbiArIFdEQV9EWEVfSEVBREVSX1NJWkUpOwoKICAgICAgICAvKlVwZGF0ZSByZXNvdXJjZSBjb3VudCAqLwogICAgICAgIHBUTENiLT51UmVzQ291bnQgLT0gdVJlc0xlbjsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICB1Y1Jlc3VsdCA9ICggcFRMQ2ItPnVSZXNDb3VudCA+IHVSZXNMZW4gKT9WT1NfVFJVRTpWT1NfRkFMU0U7CiAgICAgICAgYnJlYWs7IC8qIE91dCBvZiByZXNvdXJjZXMgb3IgcmVhY2hlZCBtYXggbGVuICovCiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKCggcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApICYmCiAgICAgICAgICAgICAoIFdEQV9UTElfTUlOX1JFU19CQVAgPD0gcFRMQ2ItPnVSZXNDb3VudCApICYmCiAgICAgICAgICAgICAoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSAgICAgICAgICApCiAgICB7CiAgICAgIFdEQV9UTElfUFJPQ0VTU19GUkFNRV9MRU4oIHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNQa3RMZW4sIHVSZXNMZW4sIHVUb3RhbFBrdExlbik7CgogICAgICBpZiAodXNQa3RMZW4gPiBXTEFOVExfTUFYX0FMTE9XRURfTEVOKQogICAgICB7CiAgICAgICAgICB1c1BrdExlbiA9IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU47CiAgICAgICAgICBWT1NfQVNTRVJUKDApOwogICAgICB9CgogICAgICBpZiAoICggcFRMQ2ItPnVSZXNDb3VudCA+ICh1UmVzTGVuICsgV0RBX1RMSV9NSU5fUkVTX01GICkgKSAmJgogICAgICAgICAgICggdVJlbWFpbmluZyA+IHVUb3RhbFBrdExlbiApKQogICAgICB7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNoYWluaW5nIEJULUFNUCBmcmFtZSBvbiBHZXRGcmFtZSIpKTsKCiAgICAgICAgdm9zX3BrdF9jaGFpbl9wYWNrZXQoIHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qdHJ1ZSovICk7CgogICAgICAgIC8qQkFQIGZyYW1lcyBjYW5ub3QgYmUgZGVsYXllZCovCiAgICAgICAgcFRMQ2ItPmJVcmdlbnQgICAgICA9IFRSVUU7CgogICAgICAgIHZvc19hdG9taWNfc2V0KCAodWludHB0cl90KikmcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnRwdHJfdCkgTlVMTCk7CgogICAgICAgIC8qVXBkYXRlIHJlbWFpbmluZyBsZW4gZnJvbSBTU0MgKi8KICAgICAgICB1UmVtYWluaW5nICAgICAgICAtPSAgKHVzUGt0TGVuICsgV0RBX0RYRV9IRUFERVJfU0laRSk7CgogICAgICAgIC8qVXBkYXRlIHJlc291cmNlIGNvdW50ICovCiAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCAgLT0gdVJlc0xlbjsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICB1Y1Jlc3VsdCA9IHVSZXNMZW4gKyBXREFfVExJX01JTl9SRVNfTUY7CiAgICAgICAgYnJlYWs7IC8qIE91dCBvZiByZXNvdXJjZXMgb3IgcmVhY2hlZCBtYXggbGVuICovCiAgICAgIH0KICAgIH0KICAgIC8qIG5vdGU6IHRoaXMgZmVhdHVyZSBpbXBsZW1lbnRlZCBvbmx5IGFmdGVyIFdMQU5fSU5HRVRSQVRFRF9TT0MgKi8KICAgIC8qIHNlYXJjaCAnRUFQT0xfSElfUFJJT1JJVFknIHdpbGwgc2hvdyBFQVBPTCBISV9QUklPUklUWSBjaGFuZ2UgaW4gVEwgYW5kIFdESQogICAgICAgYnkgZGVmYXVsdCwgRUFQT0wgd2lsbCBiZSB0cmVhdGVkIGFzIGhpZ2hlciBwcmlvcml0eSwgd2hpY2ggbWVhbnMKICAgICAgIHVzZSBtZ210X3Bvb2wgYW5kIERYRV9UWF9ISSBwcm9yaXR5IGNoYW5uZWwuCiAgICAgICB0aGlzIGlzIGludHJvZHVjZWQgdG8gYWRkcmVzcyBFQVBPTCBmYWlsdXJlIHVuZGVyIGhpZ2ggYmFja2dyb3VuZCB0cmFmZmljCiAgICAgICB3aXRoIG11bHRpLWNoYW5uZWwgY29uY3VycmVudCBtb2RlLiBCdXQgdGhpcyBjaGFuZ2Ugd29ya3MgaW4gU0NDIG9yIHN0YW5kYWxvbmUsIHRvby4KICAgICAgIHNlZSBDUiMzODcwMDkgYW5kIFdDTlNPUy04CiAgICAgKi8KICAgIGVsc2UgaWYgKCggV0RBX1RMSV9NSU5fUkVTX01GIDw9IHBUTENiLT51UmVzQ291bnQgKSYmCiAgICAgICAgICAgICAoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSAmJgogICAgICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19NR01UICkgKQogICAgICAgICAgICApCiAgICB7CiAgICAgICAgdm9zVGVtcEJ1ZiA9IE5VTEw7CiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIHdhcyBhbnkgRUFQT0wgcGFja2V0IGlzIHBlbmRpbmcKICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBmb3IgKCBpID0gMDsgaSA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICBpZiAoKE5VTEwgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0pICYmCiAgICAgICAgICAgICAgIChwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dWNFeGlzdHMpICYmCiAgICAgICAgICAgICAgICgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT51Y1R4U3VzcGVuZGVkKSAmJgogICAgICAgICAgICAgICAoV0xBTlRMX1NUQV9DT05ORUNURUQgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnRsU3RhdGUpICYmCiAgICAgICAgICAgICAgIChwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dWNQa3RQZW5kaW5nKQogICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKGkgPj0gV0xBTl9NQVhfU1RBX0NPVU5UKQogICAgICAgIHsKICAgICAgICAgICAvKiBObyBNb3JlIHRvIFNlcnZlIEV4aXQgR2V0IEZyYW1lcyAqLwogICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvKiBTZXJ2ZSBFQVBPTCBmcmFtZSB3aXRoIEhJX0ZMT1dfTUFTSyAqLwogICAgICAgIHVjU1RBSWQgPSBpOwoKICAgICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogICAgICAgIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwKICAgICAgICAgICAgICAgVFJBQ0VfQ09ERV9UTF9HRVRfRlJBTUVTX0VBUE9MLCB1Y1NUQUlkLCBwQ2xpZW50U1RBLT50bFN0YXRlKSk7CgogICAgICAgIGlmIChwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSA9PSBXTEFOX1NUQV9JTkZSQSkKICAgICAgICB7CiAgICAgICAgICAgIGlmKDAgIT0gcENsaWVudFNUQS0+YXVjQUNNYXNrW1dMQU5UTF9BQ19ISUdIX1BSSU9dKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgcENsaWVudFNUQS0+dWNDdXJyZW50QUMgPSBXTEFOVExfQUNfSElHSF9QUklPOwogICAgICAgICAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfSElHSF9QUklPOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBmb3IgKGogPSBXTEFOVExfTUFYX0FDIDsgaiA+IDA7IGotLSkKICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmICgwICE9IHBDbGllbnRTVEEtPmF1Y0FDTWFza1tqLTFdKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVjQ3VycmVudEFDID0gai0xOwogICAgICAgICAgICAgICAgcFRMQ2ItPnVDdXJTZXJ2ZWRBQyA9IGotMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgd1NUQUV2ZW50ID0gV0xBTlRMX1RYX0VWRU5UOwoKICAgICAgICBwZm5TVEFGc20gPSB0bFNUQUZzbVtwQ2xpZW50U1RBLT50bFN0YXRlXS4KICAgICAgICAgICAgICAgICAgICAgICAgcGZuU1RBVGJsW3dTVEFFdmVudF07CgogICAgICAgIGlmICggTlVMTCAhPSBwZm5TVEFGc20gKQogICAgICAgIHsKICAgICAgICAgIHBDbGllbnRTVEEtPnVjTm9Nb3JlRGF0YSA9IDA7CiAgICAgICAgICB2b3NTdGF0dXMgID0gcGZuU1RBRnNtKCBwdm9zR0N0eCwgdWNTVEFJZCwgJnZvc1RlbXBCdWYsIFZPU19GQUxTRSk7CgogICAgICAgICAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApICYmCiAgICAgICAgICAgICAgKCBOVUxMICE9IHZvc1RlbXBCdWYgKSkKICAgICAgICAgIHsKICAgICAgICAgICAgICAgcENsaWVudFNUQS0+cGZuU1RBVHhDb21wKCBwdm9zR0N0eCwgdm9zVGVtcEJ1Ziwgdm9zU3RhdHVzICk7CiAgICAgICAgICAgICAgIHZvc1RlbXBCdWYgPSBOVUxMOwogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0vKiBzdGF0dXMgc3VjY2VzcyovCiAgICAgICAgfQoKICAgICAgICBpZiAoTlVMTCAhPSB2b3NUZW1wQnVmKQogICAgICAgIHsKICAgICAgICAgICAgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggdm9zVGVtcEJ1ZiwgdXNQa3RMZW4sIHVSZXNMZW4sIHVUb3RhbFBrdExlbik7CgogICAgICAgICAgICBpZiAodXNQa3RMZW4gPiBXTEFOVExfTUFYX0FMTE9XRURfTEVOKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB1c1BrdExlbiA9IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU47CiAgICAgICAgICAgICAgICBWT1NfQVNTRVJUKDApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpSZXNvdXJjZXMgbmVlZGVkIGJ5IGZyYW1lOiAlZCIsIHVSZXNMZW4pKTsKCiAgICAgICAgICAgIGlmICggKCBwVExDYi0+dVJlc0NvdW50ID49ICh1UmVzTGVuICsgV0RBX1RMSV9NSU5fUkVTX01GICkgKSAmJgogICAgICAgICAgICAgICAoIHVSZW1haW5pbmcgPiB1VG90YWxQa3RMZW4gKQogICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDaGFpbmluZyBkYXRhIGZyYW1lIG9uIEdldEZyYW1lIikpOwoKICAgICAgICAgICAgICB2b3NfcGt0X2NoYWluX3BhY2tldCggdm9zRGF0YUJ1ZmYsIHZvc1RlbXBCdWYsIDEgLyp0cnVlKi8gKTsKCiAgICAgICAgICAgICAgLypFQVBPTCBmcmFtZSBjYW5ub3QgYmUgZGVsYXllZCovCiAgICAgICAgICAgICAgcFRMQ2ItPmJVcmdlbnQgICAgICA9IFRSVUU7CgogICAgICAgICAgICAgIHZvc1RlbXBCdWYgPSAgTlVMTDsKCiAgICAgICAgICAgICAgLypVcGRhdGUgcmVtYWluaW5nIGxlbiBmcm9tIFNTQyAqLwogICAgICAgICAgICAgIHVSZW1haW5pbmcgIC09ICh1c1BrdExlbiArIFdEQV9EWEVfSEVBREVSX1NJWkUpOwoKICAgICAgICAgICAgICAgLypVcGRhdGUgcmVzb3VyY2UgY291bnQgKi8KICAgICAgICAgICAgICBwVExDYi0+dVJlc0NvdW50ICAtPSB1UmVzTGVuOwoKICAgICAgICAgICAgICAvL2ZvdyBjb250cm9sIHVwZGF0ZQogICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVJbmdyZXNzX2xlbmd0aCArPSB1UmVzTGVuOwogICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVCdWZmVGhyZXNob2xkTWF4ID0gKHBDbGllbnRTVEEtPnVCdWZmVGhyZXNob2xkTWF4ID49IHVSZXNMZW4pID8KICAgICAgICAgICAgICAgIChwQ2xpZW50U1RBLT51QnVmZlRocmVzaG9sZE1heCAtIHVSZXNMZW4pIDogMDsKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51Y0VhcG9sUGt0UGVuZGluZyA9IDA7CiAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgIldMQU4gVEw6R2V0RnJhbWVzIFNUQTogJWQgRUFQT0xQa3RQZW5kaW5nICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsIHBDbGllbnRTVEEtPnVjRWFwb2xQa3RQZW5kaW5nKTsKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgeyAgLy8gbm8gRUFQT0wgZnJhbWVzIGV4aXQgR2V0IGZyYW1lcwogICAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpHZXRGcmFtZXMgU1RBOiAlZCwgbm8gRUFQT0wgZnJhbWUsIGNvbnRpbnVlLiIsCiAgICAgICAgICAgICAgICAgICB1Y1NUQUlkKSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICB9CgogICAgZWxzZSBpZiAoKCBXREFfVExJX01JTl9SRVNfREFUQSA8PSBwVExDYi0+dVJlc0NvdW50ICkgJiYKICAgICAgICAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApICYmCiAgICAgICAgICAgICAoIHVGbG93TWFzayAmIFdMQU5UTF9EQVRBX0ZMT1dfTUFTSykpCiAgICB7CiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIHdhcyBhbnkgcGFja2V0IGxlZnQgYmVoaW5kIHByZXZpb3VzbHkgZHVlIHRvCiAgICAgICAgc2l6ZSBjb25zdHJhaW50cwogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgdm9zVGVtcEJ1ZiA9IE5VTEw7CgogICAgICBpZiAoIE5VTEwgIT0gcFRMQ2ItPnZvc1RlbXBCdWYgKSAKICAgICAgewogICAgICAgIHZvc1RlbXBCdWYgICAgICAgICAgPSBwVExDYi0+dm9zVGVtcEJ1ZjsKICAgICAgICBwVExDYi0+dm9zVGVtcEJ1ZiAgID0gTlVMTDsKICAgICAgICB1Y1NUQUlkICAgICAgICAgICAgID0gcFRMQ2ItPnVjQ2FjaGVkU1RBSWQ7IAogICAgICAgIHVjQUMgICAgICAgICAgICAgICAgPSBwVExDYi0+dWNDYWNoZWRBQzsKCiAgICAgICAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICAgICAgICB7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y05vTW9yZURhdGEgPSAwOwogICAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNoYWluaW5nIGNhY2hlZCBkYXRhIGZyYW1lIG9uIEdldEZyYW1lIikpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIFdMQU5fVExHZXROZXh0VHhJZHMoIHB2b3NHQ3R4LCAmdWNTVEFJZCk7CiAgICAgICAgaWYgKHVjU1RBSWQgPj0gV0xBTl9NQVhfU1RBX0NPVU5UKQogICAgICAgIHsKICAgICAgICAgLyogUGFja2V0cyBzdGFydCBjb21pbmcgaW4gZXZlbiBhZnRlciBpbnNtb2QgV2l0aG91dCAqCiAgICAgICAgICAgIHN0YXJ0aW5nIEhvc3RhcGQgb3IgSW50ZXJmYWNlIGJlaW5nIHVwICAgICAgICAgICAgKgogICAgICAgICAgICBEdXJpbmcgd2hpY2ggY2FzZXMgU1RBSUQgaXMgaW52YWxlZCBhbmQgaGVuY2UgCiAgICAgICAgICAgIHRoZSBjaGVjay4gSGFsTXNnX1NjbmFDb21wbGV0ZSBUcmlnZ2VycyAqLwoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qIHVjQ3VycmVudEFDIHNob3VsZCBoYXZlIGNvcnJlY3QgQUMgdG8gYmUgc2VydmVkIGJ5IGNhbGxpbmcKICAgICAgICAgICBXTEFOX1RMR2V0TmV4dFR4SWRzICovCiAgICAgICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwogICAgICAgIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICAgICAgICB7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIHVjQUMgPSBwQ2xpZW50U1RBLT51Y0N1cnJlbnRBQzsKCiAgICAgICAgcENsaWVudFNUQS0+dWNOb01vcmVEYXRhID0gMTsKICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDogJXMgZ2V0IG9uZSBkYXRhIGZyYW1lLCBzdGF0aW9uIElEICVkICIsIF9fZnVuY19fLCB1Y1NUQUlkKSk7CiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgQ2hlY2sgdG8gc2VlIHRoYXQgU1RBIGlzIHZhbGlkIGFuZCB0eCBpcyBub3Qgc3VzcGVuZGVkCiAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIGlmICggKCAhIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkgJiYKICAgICAgICAgICAoIDAgPT0gcENsaWVudFNUQS0+dWNUeFN1c3BlbmRlZCApICYmCiAgICAgICAgICAgKCAwID09IHBDbGllbnRTVEEtPmZjU3RhVHhEaXNhYmxlZCkgKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiAlcyBzdGEgaWQgdmFsaWQgYW5kIG5vdCBzdXNwZW5kZWQgIixfX2Z1bmNfXykpOwogICAgICAgICAgd1NUQUV2ZW50ID0gV0xBTlRMX1RYX0VWRU5UOwoKICAgICAgICAgIHBmblNUQUZzbSA9IHRsU1RBRnNtW3BDbGllbnRTVEEtPnRsU3RhdGVdLgogICAgICAgICAgICAgICAgICAgICAgICBwZm5TVEFUYmxbd1NUQUV2ZW50XTsKCiAgICAgICAgICBpZiAoIE5VTEwgIT0gcGZuU1RBRnNtICkKICAgICAgICAgIHsKICAgICAgICAgICAgcENsaWVudFNUQS0+dWNOb01vcmVEYXRhID0gMDsKICAgICAgICAgICAgdm9zU3RhdHVzICA9IHBmblNUQUZzbSggcHZvc0dDdHgsIHVjU1RBSWQsICZ2b3NUZW1wQnVmLCBWT1NfRkFMU0UpOwoKICAgICAgICAgICAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApICYmCiAgICAgICAgICAgICAgICAoIE5VTEwgIT0gdm9zVGVtcEJ1ZiApKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+cGZuU1RBVHhDb21wKCBwdm9zR0N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NTdGF0dXMgKTsKICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmID0gTlVMTDsKICAgICAgICAgICAgfS8qIHN0YXR1cyBzdWNjZXNzKi8KICAgICAgICAgIH0vKk5VTEwgZnVuY3Rpb24gc3RhdGUqLwogICAgICAgIH0vKiB2YWxpZCBTVEEgaWQgYW5kICEgc3VzcGVuZGVkKi8KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgIGlmICggISBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApIAogICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Tm90IGZldGNoaW5nIGZyYW1lIGJlY2F1c2Ugc3VzcGVuZGVkIGZvciBzdGEgSUQgJWQiLCAKICAgICAgICAgICAgICAgICAgIHVjU1RBSWQpKTsKICAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LyogZGF0YSAqLwoKICAgICAgaWYgKCBOVUxMICE9IHZvc1RlbXBCdWYgKQogICAgICB7CiAgICAgICAgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggdm9zVGVtcEJ1ZiwgdXNQa3RMZW4sIHVSZXNMZW4sIHVUb3RhbFBrdExlbik7CgogICAgICAgIGlmICh1c1BrdExlbiA+IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU4pCiAgICAgICAgewogICAgICAgICAgICB1c1BrdExlbiA9IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU47CiAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgICAgfQoKICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOlJlc291cmNlcyBuZWVkZWQgYnkgZnJhbWU6ICVkIiwgdVJlc0xlbikpOwoKICAgICAgICBpZiAoICggcFRMQ2ItPnVSZXNDb3VudCA+PSAodVJlc0xlbiArIFdEQV9UTElfTUlOX1JFU19CQVAgKSApICYmCiAgICAgICAgICAgICAoIHVSZW1haW5pbmcgPiB1VG90YWxQa3RMZW4gKSAmJgogICAgICAgICAgICAgKCB1Rmxvd01hc2sgJiBXTEFOVExfREFUQV9GTE9XX01BU0sgKSApCiAgICAgICAgewogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDaGFpbmluZyBkYXRhIGZyYW1lIG9uIEdldEZyYW1lIikpOwoKICAgICAgICAgIHZvc19wa3RfY2hhaW5fcGFja2V0KCB2b3NEYXRhQnVmZiwgdm9zVGVtcEJ1ZiwgMSAvKnRydWUqLyApOwogICAgICAgICAgdm9zVGVtcEJ1ZiA9ICBOVUxMOwoKICAgICAgICAgIC8qVXBkYXRlIHJlbWFpbmluZyBsZW4gZnJvbSBTU0MgKi8KICAgICAgICAgIHVSZW1haW5pbmcgICAgICAgIC09ICh1c1BrdExlbiArIFdEQV9EWEVfSEVBREVSX1NJWkUpOwoKICAgICAgICAgICAvKlVwZGF0ZSByZXNvdXJjZSBjb3VudCAqLwogICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCAgLT0gdVJlc0xlbjsKCiAgICAgICAgICAvL2ZvdyBjb250cm9sIHVwZGF0ZQogICAgICAgICAgcENsaWVudFNUQS0+dUluZ3Jlc3NfbGVuZ3RoICs9IHVSZXNMZW47CiAgICAgICAgICBwQ2xpZW50U1RBLT51QnVmZlRocmVzaG9sZE1heCA9IChwQ2xpZW50U1RBLT51QnVmZlRocmVzaG9sZE1heCA+PSB1UmVzTGVuKSA/CiAgICAgICAgICAgIChwQ2xpZW50U1RBLT51QnVmZlRocmVzaG9sZE1heCAtIHVSZXNMZW4pIDogMDsKCiAgICAgICAgICBwQ2xpZW50U1RBLT50eF9mcmFtZXMgKys7CgogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgLyogU3RvcmUgdGhpcyBmb3IgbGF0ZXIgdHggLSBhbHJlYWR5IGZldGNoZWQgZnJvbSBIREQgKi8KICAgICAgICAgIHBUTENiLT52b3NUZW1wQnVmID0gdm9zVGVtcEJ1ZjsKICAgICAgICAgIHBUTENiLT51Y0NhY2hlZFNUQUlkID0gdWNTVEFJZDsKICAgICAgICAgIHBUTENiLT51Y0NhY2hlZEFDICAgID0gdWNBQzsKICAgICAgICAgIHVjUmVzdWx0ID0gdVJlc0xlbiArIFdEQV9UTElfTUlOX1JFU19CQVA7CiAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAibWluICVkIHJlcyByZXF1aXJlZCBieSBUTC4iLCB1Y1Jlc3VsdCApKTsKICAgICAgICAgIGJyZWFrOyAvKiBPdXQgb2YgcmVzb3VyY2VzIG9yIHJlYWNoZWQgbWF4IGxlbiAqLwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgaSsrKQogICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSAmJiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnVjRXhpc3RzKSAmJgogICAgICAgICAgICAgICAgICAocFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnVjUGt0UGVuZGluZykgJiYKICAgICAgICAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT5kaXNhc3NvY19wcm9ncmVzcyA9PSBWT1NfRkFMU0UpKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgLyogVGhlcmUgaXMgc3RhdGlvbiB0byBiZSBTZXJ2ZWQgKi8KICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgICBpZiAoaSA+PSBXTEFOX01BWF9TVEFfQ09VTlQpCiAgICAgICAgICAgewogICAgICAgICAgICAgIC8qIE5vIE1vcmUgdG8gU2VydmUgRXhpdCBHZXQgRnJhbWVzICovCiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UKICAgICAgICAgICB7CiAgICAgICAgICAgICAgLyogTW9yZSB0byBiZSBTZXJ2ZWQgKi8KICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICB9CiAgICAgICAgfSAKICAgICAgfQogICAgZWxzZQogICAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmV0dXJuaW5nIGZyb20gR2V0RnJhbWU6IHJlc291cmNlcyA9ICVkIHN1c3BlbmRlZCA9ICVkIiwKICAgICAgICAgICAgICAgICBwVExDYi0+dVJlc0NvdW50LCBwVExDYi0+dWNUeFN1c3BlbmRlZCkpOwogICAgICAvKiBUTCBpcyBzdGFydmluZyBldmVuIHdoZW4gRFhFIGlzIG5vdCBpbiBsb3cgcmVzb3VyY2UgY29uZGl0aW9uIAogICAgICAgICBSZXR1cm4gbWluIHJlc291cmNlIG51bWJlciByZXF1aXJlZCBhbmQgTGV0IERYRSBkZWNlaWRlIHdoYXQgdG8gZG8gKi8KICAgICAgaWYoKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkgJiYgCiAgICAgICAgICggdUZsb3dNYXNrICYgV0xBTlRMX0RBVEFfRkxPV19NQVNLICkgKQogICAgICB7CiAgICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAiV0xBTiBUTDpSZXR1cm5pbmcgZnJvbSBHZXRGcmFtZTogcmVzb3VyY2VzID0gJWQiLAogICAgICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQpKTsKICAgICAgICAgdWNSZXN1bHQgPSBXREFfVExJX01JTl9SRVNfREFUQTsKICAgICAgfQogICAgICAgYnJlYWs7IC8qb3V0IG9mIG1pbiBkYXRhIHJlc291cmNlcyovCiAgICB9CgogICAgcFRMQ2ItPnVzUGVuZGluZ1R4Q29tcGxldGVDb3VudCsrOwogICAgLyogTW92ZSBkYXRhIGJ1ZmZlciB1cCBvbmUgcGFja2V0ICovCiAgICB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCB2b3NEYXRhQnVmZiwgJnZvc0RhdGFCdWZmLCAwLypmYWxzZSovICk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFBhY2tldCBjaGFpbiBzdGFydHMgYXQgcm9vdCArIDEKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggdm9zUm9vdCwgJnZvc0RhdGFCdWZmLCAxLyp0cnVlKi8gKTsKCiAgKnB2b3NEYXRhQnVmZiA9IHZvc0RhdGFCdWZmOwogIGlmIChwYlVyZ2VudCkKICB7CiAgICAgICpwYlVyZ2VudCAgICAgPSBwVExDYi0+YlVyZ2VudDsKICB9CiAgZWxzZQogIHsKICAgICAgVk9TX0FTU0VSVCggcGJVcmdlbnQgKTsKICB9CiAgcmV0dXJuIHVjUmVzdWx0Owp9LyogV0xBTlRMX0dldEZyYW1lcyAqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1R4Q29tcAoKICBERVNDUklQVElPTgogICAgSXQgaXMgYmVpbmcgY2FsbGVkIGJ5IEJBTCB1cG9uIGFzeW5jaHJvbm91cyBub3RpZmljYXRpb24gb2YgdGhlIHBhY2tldAogICAgb3IgcGFja2V0cyAgYmVpbmcgc2VudCBvdmVyIHRoZSBidXMuCgogIERFUEVOREVOQ0lFUwogICAgVHggY29tcGxldGUgY2Fubm90IGJlIGNhbGxlZCB3aXRob3V0IGEgcHJldmlvdXMgdHJhbnNtaXQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIEJBTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB2b3NEYXRhQnVmZjogICBpdCB3aWxsIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBidWZmZXIgZm9yIHdoaWNoCiAgICAgICAgICAgICAgICAgICAgdGhlIEJBTCByZXBvcnQgaXMgYmVpbmcgbWFkZSwgaWYgdGhlcmUgaXMgbW9yZSB0aGVuIG9uZQogICAgICAgICAgICAgICAgICAgIHBhY2tldCB0aGV5IHdpbGwgYmUgY2hhaW5lZCB1c2luZyB2T1NTIGJ1ZmZlcnMuCiAgICB3VHhTdGF0dXM6ICAgICAgdGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0LCBzZWUgYWJvdmUgY2hhcHRlcgogICAgICAgICAgICAgICAgICAgIG9uIEhERCBpbnRlcmFjdGlvbiBmb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcwoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6ICBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeENvbXAKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QgICAgICAqcEZyYW1lRGF0YUJ1ZmYsCiAgVk9TX1NUQVRVUyAgICAgIHdUeFN0YXR1cwopCnsKICB2b3NfcGt0X3QqICAgICAgICAgICB2b3NEYXRhQnVmZiA9ICh2b3NfcGt0X3QqKXBGcmFtZURhdGFCdWZmOwogIFdMQU5UTF9DYlR5cGUqICAgICAgIHBUTENiICAgICA9IE5VTEw7CiAgV0xBTlRMX1R4Q29tcENCVHlwZSAgcGZuVHhDb21wID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgdm9zX3BrdF90KiAgICAgICAgICAgdm9zVGVtcFR4ID0gTlVMTDsKCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6RXh0cmFuZW91cyBOVUxMIGRhdGEgcG9pbnRlciBvbiBXTEFOVExfVHhDb21wIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1R4Q29tcCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICB3aGlsZSAoKDAgPCBwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50KSAmJgogICAgICAgICAoIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSB2b3NTdGF0dXMgKSAmJgogICAgICAgICAoIE5VTEwgIT0gIHZvc0RhdGFCdWZmKSkKICB7CiAgICB2b3NfcGt0X2dldF91c2VyX2RhdGFfcHRyKCAgdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcGZuVHhDb21wKTsKCiAgICAvKml0IHNob3VsZCBuZXZlciBiZSBOVUxMIC0gZGVmYXVsdCBoYW5kbGVyIHNob3VsZCBiZSByZWdpc3RlcmVkIGlmIG5vbmUqLwogICAgaWYgKCBOVUxMID09IHBmblR4Q29tcCApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOk5VTEwgcG9pbnRlciB0byBUeCBDb21wbGV0ZSBvbiBXTEFOVExfVHhDb21wIikpOwogICAgICBWT1NfQVNTRVJUKDApOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfQoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbGxpbmcgVHggY29tcGxldGUgZm9yIHBrdCAlcEsgaW4gZnVuY3Rpb24gJXBLIiwKICAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsIHBmblR4Q29tcCkpOwoKICAgIHZvc1RlbXBUeCA9IHZvc0RhdGFCdWZmOwogICAgdm9zU3RhdHVzID0gdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggdm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9zRGF0YUJ1ZmYsIDEvKnRydWUqLyk7CgogICAgcGZuVHhDb21wKCBwdm9zR0N0eCwgdm9zVGVtcFR4LCB3VHhTdGF0dXMgKTsKCiAgICBwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50LS07CiAgfQoKIAogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICJXTEFOIFRMOiBjdXJyZW50IFRMIHZhbHVlcyBhcmU6IHJlc291cmNlcyA9ICVkICIKICAgICAgICAgICAgInBUTENiLT51c1BlbmRpbmdUeENvbXBsZXRlQ291bnQgPSAlZCIsCiAgICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCwgcFRMQ2ItPnVzUGVuZGluZ1R4Q29tcGxldGVDb3VudCkpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1R4Q29tcCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ2FjaGVTVEFGcmFtZQoKICBERVNDUklQVElPTgogICAgSW50ZXJuYWwgdXRpbGl0eSBmdW5jdGlvbiBmb3IgZm9yIGNhY2hpbmcgaW5jb21pbmcgZGF0YSBmcmFtZXMgdGhhdCBkbyAKICAgIG5vdCBoYXZlIGEgcmVnaXN0ZXJlZCBzdGF0aW9uIHlldC4gCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFpbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuCiAgICBJbiBvcmRlciB0byBiZW5lZml0IGZyb20gdGhzaSBjYWNoaW5nLCB0aGUgY29tcG9uZW50cyBtdXN0IGVuc3VyZSB0aGF0CiAgICB0aGV5IHdpbGwgb25seSByZWdpc3RlciB3aXRoIFRMIGF0IHRoZSBtb21lbnQgd2hlbiB0aGV5IGFyZSBmdWxseSBzZXR1cAogICAgYW5kIHJlYWR5IHRvIHJlY2VpdmUgaW5jb21pbmcgZGF0YSAKICAgCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICAKICAgIHBUTENiOiAgICAgICAgICAgICAgICAgIFRMIGNvbnRyb2wgYmxvY2sKICAgIHVjU1RBSWQ6ICAgICAgICAgICAgICAgIHN0YXRpb24gaWQKICAgIHZvc1RlbXBCdWZmOiAgICAgICAgICAgIHRoZSBkYXRhIHBhY2tldAogICAgdURQVVNpZzogICAgICAgICAgICAgICAgRFBVIHNpZ25hdHVyZSBvZiB0aGUgaW5jb21pbmcgcGFja2V0CiAgICBiQmNhc3Q6ICAgICAgICAgICAgICAgICB0cnVlIGlmIHBhY2tldCBoYWQgdGhlIE1DL0JDIGJpdCBzZXQgCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIG9yIFNUQSBJZCBpbnZhbGlkIDsgYWNjZXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnN0YXRpYyBWT1NfU1RBVFVTCldMQU5UTF9DYWNoZVNUQUZyYW1lCigKICBXTEFOVExfQ2JUeXBlKiAgICBwVExDYiwKICB2X1U4X3QgICAgICAgICAgICB1Y1NUQUlkLAogIHZvc19wa3RfdCogICAgICAgIHZvc1RlbXBCdWZmLAogIHZfVTMyX3QgICAgICAgICAgIHVEUFVTaWcsCiAgdl9VOF90ICAgICAgICAgICAgYkJjYXN0LAogIHZfVThfdCAgICAgICAgICAgIHVjRnJtVHlwZQopCnsKICB2X1U4X3QgICAgdWNVY2FzdFNpZzsKICB2X1U4X3QgICAgdWNCY2FzdFNpZzsKICB2X0JPT0xfdCAgYk9sZFNUQVBrdDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKICAgICBTYW5pdHkgY2hlY2sgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgKCBOVUxMID09IHZvc1RlbXBCdWZmICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6IEludmFsaWQgaW5wdXQgcG9pbnRlciBvbiBXTEFOVExfQ2FjaGVTVEFGcmFtZSBUTCAlcEsiCiAgICAgICAgICAgICAgICIgUGFja2V0ICVwSyIsIHBUTENiLCB2b3NUZW1wQnVmZiApKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0NhY2hlU1RBRnJhbWUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6QXR0ZW1wdGluZyB0byBjYWNoZSBwa3QgZm9yIFNUQSAlZCwgQkQgRFBVIFNpZzogJWQgd2l0aCBzaWcgVUM6ICVkLCBCQzogJWQiLCAKICAgICAgICAgICAgIHVjU1RBSWQsIHVEUFVTaWcsCiAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnLAogICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNCY2FzdFNpZykpOwoKICBpZihXTEFOVExfSVNfQ1RSTF9GUkFNRSh1Y0ZybVR5cGUpKQogIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDogTm8gbmVlZCB0byBjYWNoZSBDVFJMIGZyYW1lLiBEcm9wcGluZyIpKTsKICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsgCiAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIHRoZSBwYWNrZXQgdGhhdCB3ZSBhcmUgdHJ5aW5nIHRvIGNhY2hlIGJlbG9uZ3MgdG8gdGhlIG9sZAogICAgcmVnaXN0ZXJlZCBzdGF0aW9uIChpZiBhbnkpIG9yIHRoZSBuZXcgKHBvdGVudGlhbGx5KXVwY29taW5nIHN0YXRpb24KICAgIAogICAgLSBJZiB0aGUgU1RBIHdpdGggdGhpcyBJZCB3YXMgbmV2ZXIgcmVnaXN0ZXJlZCB3aXRoIFRMIC0gdGhlIHNpZ25hdHVyZQogICAgd2lsbCBiZSBpbnZhbGlkOwogICAgLSBJZiB0aGUgU1RBIHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgVEwgd2lsbCBoYXZlIGNhY2hlZCB0aGUgZm9ybWVyCiAgICBzZXQgb2YgRFBVIHNpZ25hdHVyZXMKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIGJCY2FzdCApCiAgewogICAgdWNCY2FzdFNpZyA9ICh2X1U4X3QpdURQVVNpZzsKICAgIGJPbGRTVEFQa3QgPSAoKCBXTEFOX1RMX0lOVkFMSURfQl9TSUcgIT0gCiAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcgKSAmJgogICAgICAoIHVjQmNhc3RTaWcgPT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNCY2FzdFNpZyApKTsKICB9CiAgZWxzZQogIHsKICAgIHVjVWNhc3RTaWcgPSAodl9VOF90KXVEUFVTaWc7CiAgICBiT2xkU1RBUGt0ID0gKCggV0xBTl9UTF9JTlZBTElEX1VfU0lHICE9IAogICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcgKSAmJgogICAgICAgICggdWNVY2FzdFNpZyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnICkpOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIElmIHRoZSB2YWx1ZSBvZiB0aGUgRFBVIFNJRyBtYXRjaGVzIHRoZSBvbGQsIHRoaXMgcGFja2V0IHdpbGwgbm90CiAgICBiZSBjYWNoZWQgYXMgaXQgYmVsb25nZWQgdG8gdGhlIGZvcm1lciBhc3NvY2lhdGlvbgogICAgSW4gY2FzZSB0aGUgU0lHIGRvZXMgbm90IG1hdGNoIC0gdGhpcyBpcyBhIHBhY2tldCBmb3IgYSBwb3RlbnRpYWxseSBuZXcKICAgIGFzc29jaWF0ZWQgc3RhdGlvbiAKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIGJPbGRTVEFQa3QgfHwgYkJjYXN0ICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpEYXRhIHBhY2tldCBtYXRjaGVzIG9sZCBzaWcgZm9yIHNpZyBEUFU6ICVkIFVDOiAlZCwgIgogICAgICAgICAgICAgICAiQkM6ICVkIC0gZHJvcHBpbmciLCAKICAgICAgICAgICAgICAgdURQVVNpZywgCiAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcsCiAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcpKTsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7IAogIH0KICBlbHNlCiAgewogICAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEtPnZvc0JlZ0NhY2hlZEZyYW1lICkKICAgIHsKICAgICAgLyp0aGlzIGlzIHRoZSBmaXJzdCBmcmFtZSB0aGF0IHdlIGFyZSBjYWNoaW5nICovCiAgICAgIHBDbGllbnRTVEEtPnZvc0JlZ0NhY2hlZEZyYW1lID0gdm9zVGVtcEJ1ZmY7CgogICAgICBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZUluaXRUaW1lID0gdm9zX3RpbWVyX2dldF9zeXN0ZW1fdGltZSgpOwogICAgICBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZURvbmVUaW1lID0KICAgICAgICAgICAgICBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZUluaXRUaW1lOwogICAgICBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZVNpemUgPSAxOwoKICAgICAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLCBUUkFDRV9DT0RFX1RMX0NBQ0hFX0ZSQU1FLAogICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlU2l6ZSkpOwoKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgLyp0aGlzIGlzIGEgc3Vic2VxdWVudCBmcmFtZSB0aGF0IHdlIGFyZSBjYWNoaW5nOiBjaGFpbiB0byB0aGUgZW5kICovCiAgICAgIHZvc19wa3RfY2hhaW5fcGFja2V0KHBDbGllbnRTVEEtPnZvc0VuZENhY2hlZEZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZiwgVk9TX1RSVUUpOwoKICAgICAgcENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVEb25lVGltZSA9IHZvc190aW1lcl9nZXRfc3lzdGVtX3RpbWUoKTsKICAgICAgcENsaWVudFNUQS0+dGxDYWNoZUluZm8uY2FjaGVTaXplICsrOwoKICAgICAgaWYgKHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlU2l6ZSAlIFdMQU5UTF9DQUNIRV9UUkFDRV9XQVRFUk1BUksgPT0gMCkKICAgICAgewogICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICIlczogQ2FjaGUgSGlnaCB3YXRlcm1hcmsgZm9yIHN0YWlkOiVkICglZCkiLAogICAgICAgICAgICAgICAgICBfX2Z1bmNfXyx1Y1NUQUlkLCBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZVNpemUpOwogICAgICAgIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwgVFJBQ0VfQ09ERV9UTF9DQUNIRV9GUkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlU2l6ZSkpOwogICAgICB9CiAgICB9CiAgICBwQ2xpZW50U1RBLT52b3NFbmRDYWNoZWRGcmFtZSA9IHZvc1RlbXBCdWZmOwogIH0vKmVsc2UgbmV3IHBhY2tldCovCgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7IAp9LypXTEFOVExfQ2FjaGVTVEFGcmFtZSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9GbHVzaENhY2hlZEZyYW1lcwoKICBERVNDUklQVElPTgogICAgSW50ZXJuYWwgdXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IFRMIHRvIGZsdXNoIHRoZSBzdGF0aW9uIGNhY2hlCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFpbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuCiAgICAKICBQQVJBTUVURVJTCgogICAgSU4KCiAgICB2b3NEYXRhQnVmZjogICBpdCB3aWxsIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjYWNoZWQgYnVmZmVyCiAgICAgICAgICAgICAgICAgICByZWNlaXZlZCwKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgogIE5PVEUKICAgIFRoaXMgZnVuY3Rpb24gZG9lc24ndCByZS1pbml0aWFsaXplIHZvc0RhdGFCdWZmIHRvIE5VTEwuIEl0J3MgY2FsbGVyJ3MgCiAgICByZXNwb25zaWJpbGl0eSB0byBkbyBzbywgaWYgcmVxdWlyZWQsIGFmdGVyIHRoaXMgZnVuY3Rpb24gY2FsbC4KICAgIEJlY2F1c2Ugb2YgdGhpcyByZXN0cmljdGlvbiwgd2UgZGVjaWRlIHRvIG1ha2UgdGhpcyBmdW5jdGlvbiB0byBzdGF0aWMKICAgIHNvIHRoYXQgdXBwZXIgbGF5ZXIgZG9lc24ndCBuZWVkIHRvIGJlIGF3YXJlIG9mIHRoaXMgcmVzdHJpY3Rpb24uIAogICAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpzdGF0aWMgVk9TX1NUQVRVUwpXTEFOVExfRmx1c2hDYWNoZWRGcmFtZXMKKAogIHZvc19wa3RfdCogICAgICB2b3NEYXRhQnVmZgopCnsKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJldHVybiB0aGUgZW50aXJlIGNoYWluIHRvIHZvcyBpZiB0aGVyZSBhcmUgaW5kZWVkIGNhY2hlIGZyYW1lcyAKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgIT0gdm9zRGF0YUJ1ZmYgKQogIHsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOyAgCn0vKldMQU5UTF9GbHVzaENhY2hlZEZyYW1lcyovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9Gb3J3YXJkU1RBRnJhbWVzCgogIERFU0NSSVBUSU9OCiAgICBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIGZvciBlaXRoZXIgZm9yd2FyZGluZyBjYWNoZWQgZGF0YSB0byB0aGUgc3RhdGlvbiBhZnRlcgogICAgdGhlIHN0YXRpb24gaGFzIGJlZW4gcmVnaXN0ZXJlZCwgb3IgZmx1c2hpbmcgY2FjaGVkIGRhdGEgaWYgdGhlIHN0YXRpb24gaGFzIG5vdCAKICAgIGJlZW4gcmVnaXN0ZXJlZC4gCiAgICAgCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFpbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuCiAgIAogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgCiAgICBwVExDYjogICAgICAgICAgICAgICAgICBUTCBjb250cm9sIGJsb2NrCiAgICB1Y1NUQUlkOiAgICAgICAgICAgICAgICBzdGF0aW9uIGlkCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwogICAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHJlLWluaXRpYWxpemUgdm9zRGF0YUJ1ZmYgdG8gTlVMTC4gSXQncyBjYWxsZXIncyAKICAgIHJlc3BvbnNpYmlsaXR5IHRvIGRvIHNvLCBpZiByZXF1aXJlZCwgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBjYWxsLgogICAgQmVjYXVzZSBvZiB0aGlzIHJlc3RyaWN0aW9uLCB3ZSBkZWNpZGUgdG8gbWFrZSB0aGlzIGZ1bmN0aW9uIHRvIHN0YXRpYwogICAgc28gdGhhdCB1cHBlciBsYXllciBkb2Vzbid0IG5lZWQgdG8gYmUgYXdhcmUgb2YgdGhpcyByZXN0cmljdGlvbi4gCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kc3RhdGljIFZPU19TVEFUVVMKV0xBTlRMX0ZvcndhcmRTVEFGcmFtZXMKKAogIHZvaWQqICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgIHVjU1RBSWQsCiAgdl9VOF90ICAgICAgICAgICAgdWNVY2FzdFNpZywKICB2X1U4X3QgICAgICAgICAgICB1Y0JjYXN0U2lnCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKICAgICBTYW5pdHkgY2hlY2sgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOiBJbnZhbGlkIGlucHV0IHBvaW50ZXIgb24gV0xBTlRMX0ZvcndhcmRTVEFGcmFtZXMgVEwgJXBLIiwKICAgICAgICAgcFRMQ2IgKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9Gb3J3YXJkU1RBRnJhbWVzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8vV0xBTl9UTF9MT0NLX1NUQV9DQUNIRShwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSk7IAoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIENoZWNrIGlmIHN0YXRpb24gaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQgaW4gdGhlIG1lYW4gd2hpbGUKICAgICBpZiBub3QgcmVnaXN0ZXJlZCwgZmx1c2ggY2FjaGVkIGZyYW1lcy4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgIldMQU4gVEw6U3RhdGlvbiBoYXMgYmVlbiBkZWxldGVkIGZvciBTVEEgJWQgLSBmbHVzaGluZyBjYWNoZSIsIHVjU1RBSWQpKTsKICAgIE1UUkFDRSh2b3NfdHJhY2UoVk9TX01PRFVMRV9JRF9UTCwgVFJBQ0VfQ09ERV9UTF9GTFVTSF9DQUNIRURfRlJBTUVTLAogICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZVNpemUpKTsKICAgIFdMQU5UTF9GbHVzaENhY2hlZEZyYW1lcyhwQ2xpZW50U1RBLT52b3NCZWdDYWNoZWRGcmFtZSk7CiAgICBnb3RvIGRvbmU7IAogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZvcndhcmRpbmcgY2FjaGUgZnJhbWVzIHJlY2VpdmVkIHdoaWxlIHRoZSBzdGF0aW9uIHdhcyBpbiB0aGUgcHJvY2VzcyAgIAogICAgb2YgYmVpbmcgcmVnaXN0ZXJlZCB3aXRoIHRoZSByZXN0IG9mIHRoZSBTVyBjb21wb25lbnRzICAgCgogICAgQWNjZXNzIHRvIHRoZSBjYWNoZSBtdXN0IGJlIGxvY2tlZDsgc2ltaWxhcmx5IHVwZGF0aW5nIHRoZSBzaWduYXR1cmUgYW5kICAgCiAgICB0aGUgZXhpc3RlbmNlIGZsYWcgbXVzdCBiZSBzeW5jaHJvbml6ZWQgYmVjYXVzZSB0aGVzZSB2YWx1ZXMgYXJlIGNoZWNrZWQgICAKICAgIGR1cmluZyBjYWNoZWQgIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICJXTEFOIFRMOlByZXBhcmluZyB0byBmd2QgcGFja2V0cyBmb3IgU1RBICVkIiwgdWNTVEFJZCkpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYXZlIHRoZSBuZXcgc2lnbmF0dXJlIHZhbHVlcwogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZyAgPSB1Y1VjYXN0U2lnOwogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcgID0gdWNCY2FzdFNpZzsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICJXTEFOIFRMOkZ3ZC1pbmcgcGFja2V0cyBmb3IgU1RBICVkIFVDICVkIEJDICVkIiwKICAgICAgIHVjU1RBSWQsIHVjVWNhc3RTaWcsIHVjQmNhc3RTaWcpKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKICAgICBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgY2FjaGVkIGRhdGEgdG8gZm9yd2FyZCAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAogIGlmICggTlVMTCAhPSBwQ2xpZW50U1RBLT52b3NCZWdDYWNoZWRGcmFtZSApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6IEZ3ZC1pbmcgQ2FjaGVkIHBhY2tldHMgZm9yIHN0YXRpb24gJWQiLCB1Y1NUQUlkICkpOwoKICAgIFdMQU5UTF9SeENhY2hlZEZyYW1lcyggcFRMQ2IsIAogICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dm9zQmVnQ2FjaGVkRnJhbWUpOwogIH0KICBlbHNlCiAgewogICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBOTyBjYWNoZWQgcGFja2V0cyBmb3Igc3RhdGlvbiAlZCIsIHVjU1RBSWQgKSk7CiAgfQoKZG9uZToKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAogICBDbGVhciB0aGUgc3RhdGlvbiBjYWNoZSAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcENsaWVudFNUQS0+dm9zQmVnQ2FjaGVkRnJhbWUgPSBOVUxMOwogIHBDbGllbnRTVEEtPnZvc0VuZENhY2hlZEZyYW1lID0gTlVMTDsKICBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZVNpemUgPSAwOwogIHBDbGllbnRTVEEtPnRsQ2FjaGVJbmZvLmNhY2hlQ2xlYXJUaW1lID0gdm9zX3RpbWVyX2dldF9zeXN0ZW1fdGltZSgpOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFmdGVyIGFsbCB0aGUgaW5pdCBpcyBjb21wbGV0ZSB3ZSBjYW4gbWFyayB0aGUgZXhpc3RhbmNlIGZsYWcgCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwQ2xpZW50U1RBLT5lbmFibGVDYWNoaW5nID0gMDsKCiAgLy9XTEFOX1RMX1VOTE9DS19TVEFfQ0FDSEUocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0pOyAKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOyAKCn0vKldMQU5UTF9Gb3J3YXJkU1RBRnJhbWVzKi8KCgojaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEKQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9Jc0lBUFBGcmFtZQoKICBERVNDUklQVElPTgogICAgSW50ZXJuYWwgdXRpbGl0eSBmdW5jdGlvbiBmb3IgZGV0ZWN0aW5nIGluY29taW5nIEVTRSBJQVBQIGZyYW1lcwoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICAKICAgIHB2QkRIZWFkZXI6ICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIEJEIGhlYWRlcgogICAgdm9zVGVtcEJ1ZmY6ICAgICAgICAgICAgdGhlIGRhdGEgcGFja2V0CgogICAgSU4vT1VUCiAgICBwRmlyc3REYXRhUGt0QXJyaXZlZDogICBzdGF0aWMgZnJvbSBjYWxsZXIgZnVuY3Rpb247IHVzZWQgZm9yIHJzc2kgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRhdGlvbgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfVFJVRTogICBJdCBpcyBhIElBUFAgZnJhbWUKICAgIFZPU19GQUxTRTogIEl0IGlzIE5PVCBJQVBQIGZyYW1lCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZfQk9PTF90CldMQU5UTF9Jc0lBUFBGcmFtZQooCiAgdl9QVk9JRF90ICAgICAgICAgcHZCREhlYWRlciwKICB2b3NfcGt0X3QqICAgICAgICB2b3NUZW1wQnVmZgopCnsKICB2X1UxNl90ICAgICAgICAgICAgIHVzTVBEVURPZmZzZXQ7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y09mZnNldDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjU25hcEhkcltXTEFOVExfTExDX1NOQVBfU0laRV07CiAgdl9TSVpFX3QgICAgICAgICAgICB1c1NuYXBIZHJTaXplID0gV0xBTlRMX0xMQ19TTkFQX1NJWkU7CiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CgogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgT1VJIGZpZWxkIGlzIHByZXNlbnQuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBWT1NfRkFMU0UgPT0gV0RBX0lTX1JYX0xMQ19QUkVTRU5UKHB2QkRIZWFkZXIpICkKICB7CiAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDpMTEMgaGVhZGVyIHJlbW92ZWQsIGNhbm5vdCBkZXRlcm1pbmUgQlQtQU1QIHR5cGUgLSIKICAgICAgICAgICAgICAgICAgImRyb3BwaW5nIHBrdCIpKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgcmV0dXJuIFZPU19UUlVFOwogIH0KICB1c01QRFVET2Zmc2V0ID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfREFUQV9PRkZTRVQocHZCREhlYWRlcik7CiAgdWNPZmZzZXQgICAgICA9ICh2X1U4X3QpdXNNUERVRE9mZnNldCArIFdMQU5UTF9MTENfU05BUF9PRkZTRVQ7CgogIHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NUZW1wQnVmZiwgdWNPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCl1Y1NuYXBIZHIsICZ1c1NuYXBIZHJTaXplKTsKCiAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykpIAogIHsKICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgIlVuYWJsZSB0byBleHRyYWN0IFNuYXAgSGRyIG9mIGRhdGEgIHBhY2tldCAtIgogICAgICAgICAgICAgICAgImRyb3BwaW5nIHBrdCIpKTsKICAgIHJldHVybiBWT1NfRkFMU0U7CiAgfQoKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiB0aGlzIGlzIElBUFAgZnJhbWUgYnkgbWF0Y2hpbmcgQWlyb25ldCBTbmFwIGhkci4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAvLyBDb21wYXJlIHJldHVybnMgMSBpZiB2YWx1ZXMgYXJlIHNhbWUgYW5kIDAKICAvLyBpZiBub3QgdGhlIHNhbWUuCiAgaWYgKCggV0xBTlRMX0xMQ19TTkFQX1NJWkUgIT0gdXNTbmFwSGRyU2l6ZSApIHx8CiAgICAgKCAwID09IHZvc19tZW1fY29tcGFyZSh1Y1NuYXBIZHIsICh2X1BWT0lEX3QpV0xBTlRMX0FJUk9ORVRfU05BUF9IRUFERVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTExDX1NOQVBfU0laRSApICkpCiAgewogICAgcmV0dXJuIFZPU19GQUxTRTsKICB9CgogIHJldHVybiBWT1NfVFJVRTsKCn0KI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0VTRQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfUHJvY2Vzc0JBUEZyYW1lCgogIERFU0NSSVBUSU9OCiAgICBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIGluY29taW5nIEJULUFNUCBmcmFtZXMKCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIEJvdGhlIHRoZSBCVC1BTVAgc3RhdGlvbiBhbmQgdGhlIEJBUCBDdHJsIHBhdGggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSAKICAgIHJlZ2lzdGVyZWQgd2l0aCBUTC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICAKICAgIHB2QkRIZWFkZXI6ICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIEJEIGhlYWRlcgogICAgdm9zVGVtcEJ1ZmY6ICAgICAgICAgICAgdGhlIGRhdGEgcGFja2V0CiAgICBwVExDYjogICAgICAgICAgICAgICAgICBUTCBjb250cm9sIGJsb2NrCiAgICB1Y1NUQUlkOiAgICAgICAgICAgICAgICBzdGF0aW9uIGlkCgogICAgSU4vT1VUCiAgICBwRmlyc3REYXRhUGt0QXJyaXZlZDogICBzdGF0aWMgZnJvbSBjYWxsZXIgZnVuY3Rpb247IHVzZWQgZm9yIHJzc2kgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRhdGlvbgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2X0JPT0xfdApXTEFOVExfUHJvY2Vzc0JBUEZyYW1lCigKICB2X1BWT0lEX3QgICAgICAgICBwdkJESGVhZGVyLAogIHZvc19wa3RfdCogICAgICAgIHZvc1RlbXBCdWZmLAogIFdMQU5UTF9DYlR5cGUqICAgIHBUTENiLAogIHZfVThfdCogICAgICAgICAgIHBGaXJzdERhdGFQa3RBcnJpdmVkLAogIHZfVThfdCAgICAgICAgICAgIHVjU1RBSWQKKQp7CiAgdl9VMTZfdCAgICAgICAgICAgICB1c01QRFVET2Zmc2V0OwogIHZfVThfdCAgICAgICAgICAgICAgdWNPZmZzZXQ7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y09VSVtXTEFOVExfTExDX09VSV9TSVpFXTsKICB2X1NJWkVfdCAgICAgICAgICAgIHVzT1VJU2l6ZSA9IFdMQU5UTF9MTENfT1VJX1NJWkU7CiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CiAgdl9VMTZfdCAgICAgICAgICAgICB1c1R5cGU7CiAgdl9TSVpFX3QgICAgICAgICAgICB1c1R5cGVMZW4gPSBzaXplb2YodXNUeXBlKTsKICB2X1U4X3QgICAgICAgICAgICAgIHVjTVBEVUhPZmZzZXQ7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y01QRFVITGVuID0gMDsKICB2X1UxNl90ICAgICAgICAgICAgIHVzQWN0dWFsSExlbiA9IDA7CgogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBPVUkgYW5kIHR5cGUgZnJvbSBMTEMgYW5kIHZhbGlkYXRlOyBpZiBub24tZGF0YSBzZW5kIHRvIEJBUAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggVk9TX0ZBTFNFID09IFdEQV9JU19SWF9MTENfUFJFU0VOVChwdkJESGVhZGVyKSApCiAgewogICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAiV0xBTiBUTDpMTEMgaGVhZGVyIHJlbW92ZWQsIGNhbm5vdCBkZXRlcm1pbmUgQlQtQU1QIHR5cGUgLSIKICAgICAgICAgICAgICAiZHJvcHBpbmcgcGt0IikpOwogICAgLyogRHJvcCBwYWNrZXQgKi8KICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICByZXR1cm4gVk9TX1RSVUU7IAogIH0KCiAgdXNNUERVRE9mZnNldCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0RBVEFfT0ZGU0VUKHB2QkRIZWFkZXIpOwogIHVjTVBEVUhPZmZzZXQgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfT0ZGU0VUKHB2QkRIZWFkZXIpOwogIHVjTVBEVUhMZW4gICAgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfTEVOKHB2QkRIZWFkZXIpOwogIHVjT2Zmc2V0ICAgICAgPSAodl9VOF90KXVzTVBEVURPZmZzZXQgKyBXTEFOVExfTExDX09VSV9PRkZTRVQ7CgogIHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NUZW1wQnVmZiwgdWNPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCl1Y09VSSwgJnVzT1VJU2l6ZSk7CgojaWYgMAogIC8vIENvbXBhcmUgcmV0dXJucyAxIGlmIHZhbHVlcyBhcmUgc2FtZSBhbmQgMAogIC8vIGlmIG5vdCB0aGUgc2FtZS4KICBpZiAoKCBXTEFOVExfTExDX09VSV9TSVpFICE9IHVzT1VJU2l6ZSApIHx8CiAgICAgKCAwID09IHZvc19tZW1fY29tcGFyZSh1Y09VSSwgKHZfUFZPSURfdClXTEFOVExfQlRfQU1QX09VSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9MTENfT1VJX1NJWkUgKSApKQogIHsKICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgIkxMQyBoZWFkZXIgcG9pbnRzIHRvIGRpZmYgT1VJIGluIEJULUFNUCBzdGF0aW9uIC0iCiAgICAgICAgICAgICAgICAiZHJvcHBpbmcgcGt0IikpOwogICAgLyogRHJvcCBwYWNrZXQgKi8KICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICByZXR1cm4gVk9TX1RSVUU7CiAgfQojZW5kaWYKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBMTEMgT1VJIGFuZCBlbnN1cmUgdGhhdCB0aGlzIGlzIGluZGVlZCBhIEJULUFNUCBmcmFtZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NUZW1wQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNPZmZzZXQgKyBXTEFOVExfTExDX09VSV9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnVzVHlwZSwgJnVzVHlwZUxlbik7CgogIGlmICgoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpIHx8CiAgICAgICggc2l6ZW9mKHVzVHlwZSkgIT0gdXNUeXBlTGVuICkpCiAgewogICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGV4dHJhY3QgdHlwZSBvbiBpbmNvbWluZyBCQVAgcGFja2V0IC0iCiAgICAgICAgICAgICAgICAiZHJvcHBpbmcgcGt0IikpOwogICAgLyogRHJvcCBwYWNrZXQgKi8KICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICByZXR1cm4gVk9TX1RSVUU7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgdGhpcyBpcyBCVC1BTVAgZGF0YSBvciBjdHJsIHBhY2tldChSU04sIExpbmtTdmlzaW9uLCBBY3Rpdml0eVIpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdXNUeXBlID0gdm9zX2JlMTZfdG9fY3B1KHVzVHlwZSk7CgogIGlmIChXTEFOVExfQkFQX0lTX05PTl9EQVRBX1BLVF9UWVBFKHVzVHlwZSkpCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgIldMQU4gVEw6Tm9uLWRhdGEgcGFja2V0IHJlY2VpdmVkIG92ZXIgQlQtQU1QIGxpbms6ICVkLCA9PiBCQVAiLAogICAgICAgICAgICAgICB1c1R5cGUpKTsKCiAgICAvKkZsYXR0ZW4gcGFja2V0IGFzIEJBUCBleHBlY3RzIHRvIGJlIGFibGUgdG8gcGVlayovCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NfcGt0X2ZsYXR0ZW5fcnhfcGt0KCZ2b3NUZW1wQnVmZikpCiAgICB7CiAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBmbGF0dGVuIEJULUFNUCBwYWNrZXQgLSBkcm9wcGluZyIpKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgcmV0dXJuIFZPU19UUlVFOwogICAgfQoKICAgIC8qIFNlbmQgcGFja2V0IHRvIEJBUCBjbGllbnQqLwogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0RBX0RTX1RyaW1SeFBhY2tldEluZm8oIHZvc1RlbXBCdWZmICkgKQogICAgewogICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAiV0xBTiBUTDpCRCBoZWFkZXIgY29ycnVwdGVkIC0gZHJvcHBpbmcgcGFja2V0IikpOwogICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICByZXR1cm4gVk9TX1RSVUU7CiAgICB9CgogICAgaWYgKCAwID09IFdEQV9HRVRfUlhfRlRfRE9ORShwdkJESGVhZGVyKSApCiAgICB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAiTm9uLWRhdGEgcGFja2V0IHJlY2VpdmVkIG92ZXIgQlQtQU1QIGxpbms6IFNlbmRpbmcgaXQgZm9yICIKICAgICAgICAgICJmcmFtZSBUcmFuc2xhdGlvbiIpKTsKCiAgICAgIGlmICh1c01QRFVET2Zmc2V0ID4gdWNNUERVSE9mZnNldCkKICAgICAgewogICAgICAgIHVzQWN0dWFsSExlbiA9IHVzTVBEVURPZmZzZXQgLSB1Y01QRFVIT2Zmc2V0OwogICAgICB9CgogICAgICAvKiBzb2Z0d2FyZSBmcmFtZSB0cmFuc2xhdGlvbiBmb3IgQlRBTVAgV0RTLiovCiAgICAgIFdMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlciggdm9zVGVtcEJ1ZmYsICZ2b3NTdGF0dXMsIHVzQWN0dWFsSExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCBwVExDYix1Y1NUQUlkLCBWT1NfRkFMU0UpOwogICAgICAKICAgIH0KICAgIGlmIChwVExDYi0+dGxCQVBDbGllbnQucGZuVGxCQVBSeCkKICAgICAgICBwVExDYi0+dGxCQVBDbGllbnQucGZuVGxCQVBSeCggdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1RMLHBUTENiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOVExfQkFQRnJhbWVFbnVtVHlwZSl1c1R5cGUgKTsKICAgIGVsc2UKICAgIHsKICAgICAgICBWT1NfQVNTRVJUKDApOwogICAgfQoKICAgIHJldHVybiBWT1NfVFJVRTsKICB9CiAgZWxzZQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICJXTEFOIFRMOiBCQVAgREFUQSBwYWNrZXQgcmVjZWl2ZWQgb3ZlciBCVC1BTVAgbGluazogJWQsID0+IEJBUCIsCiAgICAgICAgICAgICAgIHVzVHlwZSkpOwogICAvKiEhIUZJWCBNRSEhKi8KICNpZiAwCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgRm9yIGRhdGEgcGFja2V0IGNvbGxlY3QgcGh5IHN0YXRzIFJTU0kgYW5kIExpbmsgUXVhbGl0eQogICAgIENhbGN1bGF0ZSB0aGUgUlNTSSBhdmVyYWdlIGFuZCBzYXZlIGl0LiBDb250aW51b3VzIGF2ZXJhZ2UgaXMgZG9uZS4KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmICggKnBGaXJzdERhdGFQa3RBcnJpdmVkID09IDApCiAgICB7CiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnJzc2lBdmcgPQogICAgICAgICBXTEFOSEFMX0dFVF9SU1NJX0FWRVJBR0UoIHB2QkRIZWFkZXIgKTsKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUxpbmtRdWFsaXR5QXZnID0gCiAgICAgICAgV0xBTkhBTF9SWF9CRF9HRVRfU05SKCBwdkJESGVhZGVyICk7CgogICAgICAvLyBSY3ZkIDFzdCBwa3QsIHN0YXJ0IGF2ZXJhZ2UgZnJvbSBuZXh0IHRpbWUKICAgICAgKnBGaXJzdERhdGFQa3RBcnJpdmVkID0gMTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ucnNzaUF2ZyA9CiAgICAgICAgICAoV0xBTkhBTF9HRVRfUlNTSV9BVkVSQUdFKCBwdkJESGVhZGVyICkgKyAKICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5yc3NpQXZnKS8yOwogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51TGlua1F1YWxpdHlBdmcgPQogICAgICAgICAgKFdMQU5IQUxfUlhfQkRfR0VUX1NOUiggcHZCREhlYWRlciApICsgIAogICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVMaW5rUXVhbGl0eUF2ZykvMjsKICAgIH0vKkVsc2UsIGZpcnN0IGRhdGEgcGFja2V0Ki8KICNlbmRpZgogIH0vKkJULUFNUCBkYXRhIHBhY2tldCovCgogIHJldHVybiBWT1NfRkFMU0U7IAp9LypXTEFOVExfUHJvY2Vzc0JBUEZyYW1lKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9Qcm9jZXNzRkNGcmFtZQoKICBERVNDUklQVElPTgogICAgSW50ZXJuYWwgdXRpbGl0eSBmdW5jdGlvbiBmb3IgcHJvY2Vzc2luZyBpbmNvbWluZyBGbG93IENvbnRyb2wgZnJhbWVzLiBFbmFibGUKICAgIG9yIGRpc2FibGUgTFdNIG1vZGUgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uLgoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgogICAgRlcgc2VuZHMgdXAgc3BlY2lhbCBmbG93IGNvbnRyb2wgZnJhbWUuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHggICAgICAgICAgICAgICAgcG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQKICAgIHB2QkRIZWFkZXI6ICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIEJEIGhlYWRlcgogICAgcFRMQ2I6ICAgICAgICAgICAgICAgICAgVEwgY29udHJvbCBibG9jawogICAgcHZCREhlYWRlciAgICAgICAgICAgICAgcG9pbnRlciB0byBCRCBoZWFkZXIuCgogICAgSU4vT1VUCiAgICBwRmlyc3REYXRhUGt0QXJyaXZlZDogICBzdGF0aWMgZnJvbSBjYWxsZXIgZnVuY3Rpb247IHVzZWQgZm9yIHJzc2kgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRhdGlvbgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgZnJhbWUgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCiAgICBUaGUgaW5ncmVzcyBhbmQgZWdyZXNzIG9mIGVhY2ggc3RhdGlvbiB3aWxsIGJlIHVwZGF0ZWQuIElmIG5lZWRlZCwgTFdNIG1vZGUgd2lsbAogICAgYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBiYXNlZCBvbiB0aGUgZmxvdyBjb250cm9sIGFsZ29yaXRobS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2X0JPT0xfdApXTEFOVExfUHJvY2Vzc0ZDRnJhbWUKKAogIHZfUFZPSURfdCAgICAgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCogICAgICAgIHB2b3NEYXRhQnVmZiwKICB2X1BWT0lEX3QgICAgICAgICBwdkJESGVhZGVyCikKewojaWYgMSAvL2VuYWJsZSBwcm9jZXNzaW5nIG9mIG9ubHkgZmNTdGFUeERpc2FibGVkIGJpdG1hcCBmb3Igbm93LiB0aGUgZWxzZSBwYXJ0IGlzIG9sZCBiZXR0ZXIgcW9zIGNvZGUuCiAgICAgIC8vIG5lZWQgdG8gcmV2aXNpdCB0aGUgb2xkIGNvZGUgZm9yIGZ1bGwgaW1wbGVtZW50YXRpb24uCiAgdl9VOF90ICAgICAgICAgICAgdWNTVEFJZDsKICB2X1UxNl90ICAgICAgICAgICB1Y1N0YVZhbGlkQml0bWFwOwogIHZfVTE2X3QgICAgICAgICAgIHVjU3RhVHhEaXNhYmxlZEJpdG1hcDsKICBXTEFOVExfQ2JUeXBlKiAgICBwVExDYiA9IE5VTEw7CiAgI2lmZGVmIFRMX0RFQlVHX0ZDCiAgdl9VMzJfdCAgICAgICAgICAgcnhUaW1lU3RhbXA7CiAgdl9VMzJfdCAgICAgICAgICAgY3VyVGljazsKICAjZW5kaWYKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU3VzcGVuZERhdGFUeCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHVjU3RhVmFsaWRCaXRtYXAgPSBXREFfR0VUX1JYX0ZDX1ZBTElEX1NUQV9NQVNLKHB2QkRIZWFkZXIpOwogIHVjU3RhVHhEaXNhYmxlZEJpdG1hcCA9IFdEQV9HRVRfUlhfRkNfU1RBX1RYX0RJU0FCTEVEX0JJVE1BUChwdkJESGVhZGVyKTsKI2lmZGVmIFRMX0RFQlVHX0ZDCiAgcnhUaW1lU3RhbXAgPSBXREFfR0VUX1JYX1RJTUVTVEFNUChwdkJESGVhZGVyKTsKICAvKiBoYXJkIGNvZGUgb2YgTVRVX0dMT0JBTF9USU1FUl9BRERSIHRvIGNhbGN1bGF0ZSB0aGUgdGltZSBiZXR3ZWVuIGdlbmVyYXRlZCBhbmQgcHJvY2Vzc2VkICovCiAgd3BhbFJlYWRSZWdpc3RlcigweDAzMDgxNDAwKzB4MUQ0LCAmY3VyVGljayk7CgogIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICIlbGQgKCVsZC0lbGQpOiBEaXNhYmxlZCAleCBWYWxpZCAleCIsIGN1clRpY2sgPiByeFRpbWVTdGFtcCA/IGN1clRpY2sgLSByeFRpbWVTdGFtcCA6IHJ4VGltZVN0YW1wIC0gKDB4RkZGRkZGRkYgLSBjdXJUaWNrKSwKICAgIGN1clRpY2ssIHJ4VGltZVN0YW1wLCAgdWNTdGFUeERpc2FibGVkQml0bWFwLCB1Y1N0YVZhbGlkQml0bWFwKSk7CiNlbmRpZgogIGZvcih1Y1NUQUlkID0gMDsgdWNTdGFWYWxpZEJpdG1hcCAhPSAwOyB1Y1N0YVZhbGlkQml0bWFwID4+PTEsIHVjU3RhVHhEaXNhYmxlZEJpdG1hcCA+Pj0gMSwgdWNTVEFJZCArKykKICB7CiAgICBpZiAoICgwID09ICh1Y1N0YVZhbGlkQml0bWFwICYgMHgxKSkgfHwgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICYmICgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cykpICkKICAgICAgICBjb250aW51ZTsKCiAgICBpZiAodWNTdGFUeERpc2FibGVkQml0bWFwICYgMHgxKQogICAgewogICAgICBXTEFOVExfU3VzcGVuZERhdGFUeChwdm9zR0N0eCwgJnVjU1RBSWQsIE5VTEwpOwogICAgfQogICAgZWxzZQogICAgewogICAgICBXTEFOVExfUmVzdW1lRGF0YVR4KHB2b3NHQ3R4LCAmdWNTVEFJZCk7CiAgICB9CiAgfQoKI2Vsc2UKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKICB0cEhhbEZjUnhCZCAgICAgICAgIHB2RmNSeEJkID0gTlVMTDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjQml0Q2hlY2sgPSAweDE7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y1N0YVZhbGlkID0gMDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjU1RBSWQgPSAwOwoKICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgRkMgUmVzcG9uc2UiKTsKICBpZiAoIChOVUxMID09IHBUTENiKSB8fCAoTlVMTCA9PSBwdm9zRGF0YUJ1ZmYpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBvaW50ZXIgaW4gJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEoIHB2b3NEYXRhQnVmZiwgMCwgKHZfUFZPSURfdCkmcHZGY1J4QmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRIYWxGY1J4QmQpKTsKCiAgaWYgKCAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykgfHwgKE5VTEwgPT0gcHZGY1J4QmQpICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDp3cm9uZyBGQyBSeCBwYWNrZXQiKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQogIAogIC8vIG5lZWQgdG8gc3dhcCBieXRlcyBpbiB0aGUgRkMgY29udGVudHMuICAKICBXTEFOSEFMX1N3YXBGY1J4QmQoJnB2RmNSeEJkLT5mY1NUQVR4UUxlblswXSk7CgogIC8vbG9naWMgdG8gZW5hYmxlL2Rpc2FibGUgTFdNIG1vZGUgZm9yIGVhY2ggc3RhdGlvbgogIGZvciggdWNTdGFWYWxpZCA9ICh2X1U4X3QpcHZGY1J4QmQtPmZjU1RBVmFsaWRNYXNrOyB1Y1N0YVZhbGlkOyB1Y1N0YVZhbGlkID4+PSAxLCB1Y0JpdENoZWNrIDw8PSAxLCB1Y1NUQUlkICsrKQogIHsKICAgIGlmICggKDAgPT0gKHVjU3RhVmFsaWQgJiAweDEpKSB8fCAoMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0V4aXN0cykgKQogICAgewogICAgICBjb250aW51ZTsKICAgIH0KCiAgICBpZiAoIHB2RmNSeEJkLT5mY1NUQVRocmVzaEluZE1hc2sgJiB1Y0JpdENoZWNrICkKICAgIHsKICAgICAgLy9MV00gZXZlbnQgaXMgcmVwb3J0ZWQgYnkgRlcuIEFibGUgdG8gZmV0Y2ggbW9yZSBwYWNrZXQKICAgICAgaWYoIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTHdtTW9kZUVuYWJsZWQgKQogICAgICB7CiAgICAgICAgLy9Ob3cgbWVtb3J5IHVzYWdlIGlzIGJlbG93IExXTS4gU3RhdGlvbiBjYW4gc2VuZCBtb3JlIHBhY2tldHMuCiAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21FdmVudFJlcG9ydGVkID0gVFJVRTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6IEZXIHJlcG9ydCBMV00gZXZlbnQgYnV0IHRoZSBzdGF0aW9uICVkIGlzIG5vdCBpbiBMV00gbW9kZSIsIHVjU1RBSWQpKTsKICAgICAgfQogICAgfQoKICAgIC8vY2FsY3VsYXRlIHVFZ3Jlc3NfbGVuZ3RoL3VJbmdyZXNzX2xlbmd0aCBvbmx5IGFmdGVyIHJlY2VpdmluZyBlbm91Z2ggcGFja2V0cwogICAgaWYgKFdMQU5UTF9MV01fSU5HUkVTU19TQU1QTEVfVEhSRVNIT0xEIDw9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCkKICAgIHsKICAgICAgLy9jaGVjayBtZW1vcnkgdXNhZ2UgaW5mbyB0byBzZWUgd2hldGhlciBMV00gbW9kZSBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhlIHN0YXRpb24KICAgICAgdl9VMzJfdCB1RWdyZXNzX2xlbmd0aCA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCArIAogICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmJtdU1lbUNvbnN1bWVkIC0gcHZGY1J4QmQtPmZjU1RBVHhRTGVuW3VjU1RBSWRdOwoKICAgICAgLy9pZiAoKGZsb2F0KXVFZ3Jlc3NfbGVuZ3RoLyhmbG9hdClwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGggCiAgICAgIC8vICAgICAgPD0gV0xBTlRMX0xXTV9FR1JFU1NfSU5HUkVTU19USFJFU0hPTEQpCiAgICAgIGlmICggKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCA+IHVFZ3Jlc3NfbGVuZ3RoKSAmJgogICAgICAgICAgICgocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoIC0gdUVncmVzc19sZW5ndGggKSA+PSAKICAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCA+PiAyKSkKICAgICAgICAgKQogICAgICB7ICAgCiAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6RW5hYmxlIExXTSBtb2RlIGZvciBzdGF0aW9uICVkIiwgdWNTVEFJZCkpOwogICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkID0gVFJVRTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBpZiggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21Nb2RlRW5hYmxlZCApCiAgICAgICAgewogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpEaXNhYmxlIExXTSBtb2RlIGZvciBzdGF0aW9uICVkIiwgdWNTVEFJZCkpOwogICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21Nb2RlRW5hYmxlZCA9IEZBTFNFOwogICAgICAgIH0KCiAgICAgIH0KCiAgICAgIC8vcmVtZW1iZXIgbWVtb3J5IHVzYWdlIGluIEZXIHN0YXJ0aW5nIGZyb20gdGhpcyByb3VuZAogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5ibXVNZW1Db25zdW1lZCA9IHB2RmNSeEJkLT5mY1NUQVR4UUxlblt1Y1NUQUlkXTsKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoID0gMDsKICAgIH0gLy8oV0xBTlRMX0xXTV9JTkdSRVNTX1NBTVBMRV9USFJFU0hPTEQgPD0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoKQoKICAgIGlmKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkICkKICAgIHsKICAgICAgLy9hbHdheXMgdXBkYXRlIGN1cnJlbnQgbWF4aW11bSBhbGxvd2VkIG1lbWVvcnkgdXNhZ2UKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUJ1ZmZUaHJlc2hvbGRNYXggPSAgV0xBTlRMX1NUQV9CTVVfVEhSRVNIT0xEX01BWCAtCiAgICAgICAgcHZGY1J4QmQtPmZjU1RBVHhRTGVuW3VjU1RBSWRdOwogICAgfQoKICB9CiNlbmRpZgoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgovKioKICogV0xBTlRMX0Zsb3dDb250cm9sKCkgLSBUWCBGbG93IGNvbnRyb2wKICogQHBUTENiOiBUTCBjb250ZXh0IHBvaW50ZXIKICogQHB2b3NEYXRhQnVmZjogRmlybXdhcmUgaW5kaWNhdGlvbiBkYXRhIGJ1ZmZlcgogKgogKiBUaGlzIGZ1bmN0aW9uIGltcGxlbmV0cyB0aGUgYWxnb3JpdGhtIHRvIGZsb3cgY29udHJvbCBUWCB0cmFmZmljIGluICBjYXNlCiAqIG9mIFNBUCBhbmQgU0FQICsgU1RBIGNvbmN1cnJlbmN5LgogKgogKiBBbGdvcml0aG0gZ29hbCBpcyB0byBmZXRjaCBtb3JlIHBhY2tldHMgZnJvbSBnb29kIHBlZXIgdGhhbiBiYWQgcGVlciBieQogKiBpbnRyb2R1Y2luZyB3ZWlnaHRzIGZvciBlYWNoIHN0YXRpb24gY29ubmVjdGVkLiBXZWlnaHQgb2YgZWFjaCBzdGF0aW9uIGlzCiAqIGNhbGN1dGF0ZWQgYnkgdGFraW5nIHJhdGlvIG9mIG1heCBSQSByYXRlIG9mIHRoZSBwZWVycyB0byBpdHMgcmF0ZS4gSWYgdGhlCiAqIHJhdGlvIGlzIGxlc3MgdGhhbiB0d28gYmFzZWQgb24gbnVtYmVyIG9mIHF1ZXVlZCBmcmFtZXMgaW4gdGhlIHN0YXRpb24gQlRRTQogKiB3ZWlnaHQgaXMgbW9kaWZpZWQuIElmIHRoZSBxdWV1ZWQgZnJhbWVzIHJlYWNoZXMgdGhlIGRlZmluZWQgdGhyZXNob2xkIHdlaWdodAogKiBpcyBhc3NpZ25lZCBhcyBmb3VyLiBIZXJlIHdlaWdodCBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YKICogcGFja2V0cyBmZXRjaC4KICoKICogUmV0dXJuIHRydWUgaWYgZmxvdyBjb250cm9sbGVkIG9yIGZhbHNlIG90aGVyd2lzZS4KICovCnN0YXRpYyBib29sIFdMQU5UTF9GbG93Q29udHJvbChXTEFOVExfQ2JUeXBlKiBwVExDYiwgdm9zX3BrdF90KiBwdm9zRGF0YUJ1ZmYpCnsKICAgV0xBTlRMX0Zsb3dDb250cm9sSW5mbyAqZmNfZGF0YSA9IE5VTEw7CiAgIFdMQU5UTF9QZXJTdGFGbG93Q29udHJvbFBhcmFtICpzdGFfZmNfcGFyYW1zID0gTlVMTDsKICAgdWludDhfdCBudW1fc3RhczsKICAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAgIHVpbnQxNl90IGRhdGFfbGVuOwogICB1aW50OF90ICpzdGFpZDsKICAgdWludDE2X3QgbWF4X3JhdGUgPSAwOwogICB1aW50OF90IGk7CgogICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKHB2b3NEYXRhQnVmZiwgJmRhdGFfbGVuKTsKICAgaWYgKCFkYXRhX2xlbikgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIiVzOiBOdWxsIGZ3IGluZGljYXRpb24gZGF0YSIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgfQoKICAgdm9zX3BrdF9nZXRfb3NfcGFja2V0KHB2b3NEYXRhQnVmZiwgKHZfVk9JRF90ICoqKSZza2IsIDApOwogICBmY19kYXRhID0gKFdMQU5UTF9GbG93Q29udHJvbEluZm8gKilza2ItPmRhdGE7CiAgIG51bV9zdGFzID0gZmNfZGF0YS0+bnVtX3N0YXM7CiAgIGlmICghbnVtX3N0YXMpIHsKICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICIlczogTm8gY29ubmVjdGVkIHN0YXRpb25zIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIHRydWU7CiAgIH0KCiAgIC8qIFNraXAgZmxvdyBjb250cm9sIGZvciBvbmUgY29ubmVjdGVkIHN0YXRpb24gKi8KICAgaWYgKDEgPT0gbnVtX3N0YXMpCiAgICAgIHJldHVybiB0cnVlOwoKICAgc3RhaWQgPSAodWludDhfdCAqKXZvc19tZW1fbWFsbG9jKFdMQU5fTUFYX1NUQV9DT1VOVCk7CiAgIGlmICghc3RhaWQpIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICIlczogbWVtIGFsbG9jYXRpb24gZmFpbHVyZSIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgfQogICB2b3NfbWVtX3NldCgodWludDhfdCAqKXN0YWlkLCBXTEFOX01BWF9TVEFfQ09VTlQsIDApOwoKICAgc3RhX2ZjX3BhcmFtcyA9IChXTEFOVExfUGVyU3RhRmxvd0NvbnRyb2xQYXJhbSAqKSgmZmNfZGF0YS0+bnVtX3N0YXMgKyAxKTsKCiAgIGZvcihpID0gMDsgaSA8IG51bV9zdGFzOyBpICsrLCBzdGFfZmNfcGFyYW1zICsrKSB7CiAgICAgIHN0YWlkW2ldID0gc3RhX2ZjX3BhcmFtcy0+c3RhX2lkOwoKICAgICAgaWYgKCFwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0pCiAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhaWRbaV1dLT5wZXIgPSBzdGFfZmNfcGFyYW1zLT5hdmdfcGVyOwogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPnF1ZXVlID0gc3RhX2ZjX3BhcmFtcy0+cXVldWVfbGVuOwogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPnRyYXRlID0gc3RhX2ZjX3BhcmFtcy0+cmF0ZTsKICAgICAgbWF4X3JhdGUgPSBtYXhfcmF0ZSA+IHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+dHJhdGUgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3JhdGUgOiBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPnRyYXRlOwoKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICIlczogc3RhX2lkOiVkIGluOiVkIHF1ZXVlOiVkIGF2Z19wZXI6JWQgcmF0ZTolZCIsIF9fZnVuY19fLAogICAgICAgICAgc3RhaWRbaV0sIHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+dHhfc2FtcGxlc19zdW0sCiAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPnF1ZXVlLAogICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhaWRbaV1dLT5wZXIsCiAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPnRyYXRlKSk7CiAgIH0KCiAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3RhczsgaSsrKSB7CiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+d2VpZ2h0ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfcmF0ZS9wVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPnRyYXRlOwogICAgICBpZiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhaWRbaV1dLT53ZWlnaHQgPj0KICAgICAgICAgIFdMQU5UTF9SQVRFX1JBVElPX1RIUkVTSE9MRCkgewogICAgICAgICBpZiAoIXBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+c2V0X2ZsYWcpIHsKICAgICAgICAgICAgdm9zX3NldF9oZGRfYmFkX3N0YShzdGFpZFtpXSk7CiAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+c2V0X2ZsYWcgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIC8qKgogICAgICAgICAgKiBJZiBzdGF0aW9uJ3MgbGluayBiZWNvbWVzIHZlcnkgYmFkIHJzc2kgYmVsb3cgLTkwZGJtIHRoZW4gYmVjYXVzZQogICAgICAgICAgKiBvZiBoaWdoIFBFUiByYXRlIGhpZ2ggbnVtYmVyIG9mIHBhY2tldHMgYXJlIHN0dWNrIGluIEJUUU0gd2hpY2ggaXMKICAgICAgICAgICogYWZmZWN0aW5nIHRoZSBnb29kIHBlZXJzIHRocm91Z2hwdXQuIFNvIHRocm90dGxlIGZ1cnRoZXIgdGhlIGJhZAogICAgICAgICAgKiBsaW5rIHRyYWZmaWMuCiAgICAgICAgICAqLwogICAgICAgICBpZiAoKHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+d2VpZ2h0ID4KICAgICAgICAgICAgICBXTEFOVExfV0VJR0hUX1RIUkVTSE9MRCkgJiYKICAgICAgICAgICAgIChwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPnF1ZXVlID4KICAgICAgICAgICAgICBXTEFOVExfUVVFVUVfVEhSRVNIT0xEKSkKICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhaWRbaV1dLT53ZWlnaHQgKj0gMjsKICAgICAgfQogICAgICBpZiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhaWRbaV1dLT53ZWlnaHQgPAogICAgICAgICAgV0xBTlRMX1JBVEVfUkFUSU9fVEhSRVNIT0xEKSB7CiAgICAgICAgIGlmIChwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPnBlciA+PSBXTEFOVExfUEVSX1RIUkVTSE9MRCAmJgogICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhaWRbaV1dLT5xdWV1ZSA+IFdMQU5UTF9RVUVVRV9USFJFU0hPTEQKICAgICAgICAgICAgICYmICFwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPnNldF9mbGFnKSB7CiAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+d2VpZ2h0ICo9IDI7CiAgICAgICAgICAgIHZvc19zZXRfaGRkX2JhZF9zdGEoc3RhaWRbaV0pOwogICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPnNldF9mbGFnID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFpZFtpXV0tPnNldF9mbGFnKSB7CiAgICAgICAgICAgIHZvc19yZXNldF9oZGRfYmFkX3N0YShzdGFpZFtpXSk7CiAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkW2ldXS0+c2V0X2ZsYWcgPSBmYWxzZTsKICAgICAgICAgfQogICAgICB9CiAgIH0KICAgdm9zX21lbV9mcmVlKHN0YWlkKTsKICAgcmV0dXJuIHRydWU7Cn0KCi8qKgogKiBXTEFOVExfQ2FjaGVFYXBvbCgpIC0gY2FjaGUgZWFwb2wgZnJhbWVzCiAqIEBwVExDYiA6IHBvaW50ZXIgdG8gVEwgY29udGV4dAogKiBAdm9zVGVtcEJ1ZmY6IHBvaW50ZXIgdG8gdm9zIHBhY2tldCBidWZmCiAqCiAqIFJldHVybjogTm9uZQogKgogKi8Kc3RhdGljIHZvaWQgV0xBTlRMX0NhY2hlRWFwb2woV0xBTlRMX0NiVHlwZSogcFRMQ2IsIHZvc19wa3RfdCogdm9zVGVtcEJ1ZmYpCnsKICAgaWYgKChOVUxMID09IHBUTENiKSB8fCAoTlVMTCA9PSB2b3NUZW1wQnVmZikpCiAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiJXM6IEludmFsaWQgaW5wdXQgcG9pbnRlciIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybjsKICAgfQoKICAgaWYgKE5VTEwgPT0gcFRMQ2ItPnZvc0VhcG9sQ2FjaGVkRnJhbWUpIHsKICAgICAgVExMT0cxKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICIlczogQ2FjaGUgRWFwb2wgZnJhbWUiLCBfX2Z1bmNfXykpOwogICAgICBwVExDYi0+dm9zRWFwb2xDYWNoZWRGcmFtZSA9IHZvc1RlbXBCdWZmOwogICB9CiAgIGVsc2UgewogICAgICBUTExPRzEoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgIiVzOiBEcm9wIGR1cGxpY2F0ZSBFQVBPTCBmcmFtZSIsIF9fZnVuY19fKSk7CiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgIH0KfQoKLyoqCiAqIFdMQU5UTF9TYW1wbGVSeFJTU0koKSAtIENvbGxlY3QgUlggcnNzaSBzYW1wbGVzCiAqIEBwVExDYjogVEwgY29udGV4dCBwb2ludGVyCiAqIEBwQkRIZWFkZXI6IFJYIE1ldGEgZGF0YSBwb2ludGVyCiAqIEBzdGFfaWQ6IFN0YXRpb24gSUQKICoKICogVGhpcyBmdW5jdGlvbiByZWNvcmRzIHRoZSBsYXN0IHR3ZW50eSBSWCBSU1NJIHNhbXBsZXMKICoKICogUmV0dXJuOiB2b2lkCiAqLwpzdGF0aWMgdm9pZCBXTEFOVExfU2FtcGxlUnhSU1NJKFdMQU5UTF9DYlR5cGUqIHBUTENiLCB2b2lkICogcEJESGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhX2lkKQp7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlICpwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhX2lkXTsKICAgdWludDhfdCBjb3VudCA9IHBDbGllbnRTVEEtPnJzc2lfc2FtcGxlX2NudDsKICAgdWludDhfdCBvbGRfaWR4ID0gcENsaWVudFNUQS0+cnNzaV9zdGFsZV9pZHg7CiAgIHM4IGN1cnJfUlNTSSwgY3Vycl9SU1NJMCwgY3Vycl9SU1NJMTsKCiAgIGN1cnJfUlNTSTAgPSBXTEFOVExfR0VUUlNTSTAocEJESGVhZGVyKTsKICAgY3Vycl9SU1NJMSA9IFdMQU5UTF9HRVRSU1NJMShwQkRIZWFkZXIpOwoKICAgY3Vycl9SU1NJICA9IChjdXJyX1JTU0kwID4gY3Vycl9SU1NJMSkgPyBjdXJyX1JTU0kwIDogY3Vycl9SU1NJMTsKCiAgIGlmIChjb3VudCA+PSBXTEFOVExfUlNTSV9TQU1QTEVfQ05UKSB7CiAgICAgIHBDbGllbnRTVEEtPnJzc2lfc2FtcGxlX3N1bSAtPSBwQ2xpZW50U1RBLT5yc3NpX3NhbXBsZVtvbGRfaWR4XTsKICAgICAgcENsaWVudFNUQS0+cnNzaV9zYW1wbGVbb2xkX2lkeF0gPSBjdXJyX1JTU0k7CiAgICAgIHBDbGllbnRTVEEtPnJzc2lfc2FtcGxlX3N1bSArPSBwQ2xpZW50U1RBLT5yc3NpX3NhbXBsZVtvbGRfaWR4XTsKICAgICAgb2xkX2lkeCA+PSBXTEFOVExfUlNTSV9TQU1QTEVfQ05UID8gb2xkX2lkeCA9IDAgOiBvbGRfaWR4Kys7CiAgICAgIHBDbGllbnRTVEEtPnJzc2lfc3RhbGVfaWR4ID0gb2xkX2lkeDsKICAgfSBlbHNlIHsKICAgICAgcENsaWVudFNUQS0+cnNzaV9zYW1wbGVbY291bnRdID0gY3Vycl9SU1NJOwogICAgICBwQ2xpZW50U1RBLT5yc3NpX3NhbXBsZV9zdW0gKz0gcENsaWVudFNUQS0+cnNzaV9zYW1wbGVbY291bnRdOwogICAgICBwQ2xpZW50U1RBLT5yc3NpX3NhbXBsZV9jbnQrKzsKICAgfQp9CgovKioKICogV0xBTlRMX1N0YU1vblJYIC0gU2VuZCBwYWNrZXRzIHRvIG1vbml0b3IgbW9kZQogKiBAcFRMQ2I6IFRMIGNvbnRleHQgcG9pbnRlcgogKiBAcEZyYW1lOiBSeCBidWZmZXIgcG9pbnRlcgogKiBAcEJESGVhZGVyOiBSWCBNZXRhIGRhdGEgcG9pbnRlcgogKiBAc3RhX2lkOiBTdGF0aW9uIElECiAqCiAqIFJldHVybjogdHJ1ZSBpZiBSWCBtb25pdG9yIG1vZGUgb3IgZmFsc2Ugb3RoZXJ3aXNlCiAqLwpzdGF0aWMgYm9vbCBXTEFOVExfU3RhTW9uUlgoV0xBTlRMX0NiVHlwZSogcFRMQ2IsIHZvc19wa3RfdCAqcEZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0RJX0RTX1J4TWV0YUluZm9UeXBlICpwUnhNZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhX2lkKQp7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlICpwQ2xpZW50U1RBID0gTlVMTDsKICAgdHBTaXJNYWNNZ210SGRyIHBIZHIgPSBOVUxMOwogICB2X01BQ0FERFJfdCAqcGVlck1hY0FkZHIgPSBOVUxMOwogICB1aW50OF90IGkgPSAwOwogICB1aW50OF90IGFkZHIxX2luZGV4ID0gV0RBX0dFVF9SWF9BRERSMV9JRFgocFJ4TWV0YWRhdGEpOwogICBib29sIHRwX2RhdGEgPSBmYWxzZTsKCiAgIHBIZHIgPSAodHBTaXJNYWNNZ210SGRyKXBSeE1ldGFkYXRhLT5tcGR1SGVhZGVyUHRyOwogICBwZWVyTWFjQWRkciA9ICh2X01BQ0FERFJfdCAqKXBIZHItPmRhOwoKICAgaWYgKHZvc19jaGVja19tb25pdG9yX3N0YXRlKCkgPT0gZmFsc2UpCiAgICAgICByZXR1cm4gZmFsc2U7CgogICBpZiAoKGFkZHIxX2luZGV4ID09IDI1NCkgJiYKICAgICAgIFdMQU5UTF9JU19EQVRBX0ZSQU1FKFdEQV9HRVRfUlhfVFlQRV9TVUJUWVBFKHBSeE1ldGFkYXRhKSkgJiYKICAgICAgICFwUnhNZXRhZGF0YS0+YmNhc3QpIHsKICAgICAgIHRwX2RhdGEgPSB0cnVlOwogICB9IGVsc2UgaWYgKFdMQU5UTF9TVEFfSURfTU9OSUZBQ0Uoc3RhX2lkKSA9PSAwKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgIH0KCiAgIGlmIChXTEFOVExfSVNfTUdNVF9GUkFNRShXREFfR0VUX1JYX1RZUEVfU1VCVFlQRShwUnhNZXRhZGF0YSkpIHx8IHRwX2RhdGEpIHsKCiAgICAgIGlmIChwUnhNZXRhZGF0YS0+YmNhc3QpCiAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBXTEFOX01BWF9TVEFfQ09VTlQ7IGkrKykgewogICAgICAgICBpZiAoTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGlmICgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT51Y0V4aXN0cykKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGlmIChXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnRsU3RhdGUpCiAgICAgICAgICAgIGJyZWFrOwogICAgICB9CgogICAgICBpZiAoaSA9PSBXTEFOX01BWF9TVEFfQ09VTlQpIHsKICAgICAgICAgIGlmICh0cF9kYXRhKQogICAgICAgICAgICAgIHJldHVybiB0cnVlOwoKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV07CgogICAgICBpZiAodm9zX2lzX21hY2FkZHJfZXF1YWwocGVlck1hY0FkZHIsCiAgICAgICAgICAmcENsaWVudFNUQS0+d1NUQURlc2MudlNlbGZNQUNBZGRyZXNzKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgaWYgKHZvc19pc19tYWNhZGRyX2VxdWFsKHBlZXJNYWNBZGRyLCAmcFRMQ2ItPnNwb29mTWFjQWRkci5zcG9vZk1hYykgJiYKICAgICAgICAgICF0cF9kYXRhKQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICB9CgogICByZXR1cm4gdHJ1ZTsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfUnhGcmFtZXMKCiAgREVTQ1JJUFRJT04KICAgIENhbGxiYWNrIHJlZ2lzdGVyZWQgYnkgVEwgYW5kIGNhbGxlZCBieSBCQUwgd2hlbiBhIHBhY2tldCBpcyByZWNlaXZlZAogICAgb3ZlciB0aGUgYnVzLiBVcG9uIHRoZSBjYWxsIG9mIHRoaXMgZnVuY3Rpb24gVEwgd2lsbCBtYWtlIHRoZSBuZWNlc3NhcnkKICAgIGRlY2lzaW9uIHdpdGggcmVnYXJkcyB0byB0aGUgZm9yd2FyZGluZyBvciBxdWV1aW5nIG9mIHRoaXMgcGFja2V0IGFuZAogICAgdGhlIGxheWVyIGl0IG5lZWRzIHRvIGJlIGRlbGl2ZXJlZCB0by4KCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIElmIHRoZSBmcmFtZSBjYXJyaWVkIGlzIGEgZGF0YSBmcmFtZSB0aGVuIHRoZSBzdGF0aW9uIGZvciB3aGljaCBpdCBpcwogICAgZGVzdGluZWQgdG8gbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggVEwuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIEJBTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogICAgdm9zRGF0YUJ1ZmY6ICAgaXQgd2lsbCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgYnVmZmVyIHJlY2VpdmVkLAogICAgICAgICAgICAgICAgICAgIGlmIHRoZXJlIGlzIG1vcmUgdGhlbiBvbmUgcGFja2V0IHRoZXkgd2lsbCBiZSBjaGFpbmVkCiAgICAgICAgICAgICAgICAgICAgdXNpbmcgdk9TUyBidWZmZXJzLgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfUnhGcmFtZXMKKAogIHZfUFZPSURfdCAgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCAgICAgKnBGcmFtZURhdGFCdWZmCikKewogIHZvc19wa3RfdCogICAgICAgICAgdm9zRGF0YUJ1ZmYgPSAodm9zX3BrdF90KilwRnJhbWVEYXRhQnVmZjsKICBXTEFOVExfQ2JUeXBlKiAgICAgIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgV0xBTlRMX1NUQUZ1bmNUeXBlICBwZm5TVEFGc207CiAgdm9zX3BrdF90KiAgICAgICAgICB2b3NUZW1wQnVmZjsKICB2X1U4X3QgICAgICAgICAgICAgIHVjU1RBSWQ7CiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y0ZybVR5cGU7CiAgdl9QVk9JRF90ICAgICAgICAgICBwdkJESGVhZGVyID0gTlVMTDsKICBXTEFOVExfU1RBRXZlbnRUeXBlIHdTVEFFdmVudCAgPSBXTEFOVExfUlhfRVZFTlQ7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y1RpZCAgICAgID0gMDsKICB2X0JPT0xfdCAgICAgICAgICAgIGJyb2FkY2FzdCAgPSBWT1NfRkFMU0U7CiAgdl9CT09MX3QgICAgICAgICAgICBzZWxmQmNhc3RMb29wYmFjayA9IFZPU19GQUxTRTsKICBzdGF0aWMgdl9VOF90ICAgICAgIGZpcnN0X2RhdGFfcGt0X2Fycml2ZWQ7CiAgdl9VMzJfdCAgICAgICAgICAgICB1RFBVU2lnOyAKICB2X1UxNl90ICAgICAgICAgICAgIHVzUGt0TGVuOwogIHZfQk9PTF90ICAgICAgICAgICAgYkZvcndhcmRJQVBQd2l0aExMQyA9IFZPU19GQUxTRTsKI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCiAgdl9TN190ICAgICAgICAgICAgICBjdXJyZW50QXZnUlNTSSA9IDA7CiAgdl9VOF90ICAgICAgICAgICAgICBhYzsKI2VuZGlmCiAgdWludDhfdCAgICAgICAgICAgIHVjTVBEVUhMZW47CiAgdWludDE2X3QgICAgICAgICAgIHNlcV9ubzsKICB1NjQgICAgICAgICAgICAgICAgcG5fbnVtOwogIHVpbnQxNl90ICAgICAgICAgICB1c0V0aGVyVHlwZSA9IDA7CiAgYm9vbCAgICAgICAgICAgICAgIHN0YV9tb25fZGF0YSA9IGZhbHNlOwoKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlRMIFJlY2VpdmUgRnJhbWVzIGNhbGxlZCIpKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUnhGcmFtZXMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBQb3BvbGF1dGUgdGltZXN0YW1wIGFzIHRoZSB0aW1lIHdoZW4gcGFja2V0IGFycml2ZXMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICB2b3NEYXRhQnVmZi0+dGltZXN0YW1wID0gdm9zX3RpbWVyX2dldF9zeXN0ZW1fdGlja3MoKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYXZlIHRoZSBpbml0aWFsIGJ1ZmZlciAtIHRoaXMgaXMgdGhlIGZpcnN0IHJlY2VpdmVkIGJ1ZmZlcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CgogIHdoaWxlIChOVUxMICE9IHZvc0RhdGFCdWZmKQogIHsKICAgIGJyb2FkY2FzdCA9IFZPU19GQUxTRTsKICAgIHNlbGZCY2FzdExvb3BiYWNrID0gVk9TX0ZBTFNFOyAKCiAgICB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCB2b3NEYXRhQnVmZiwgJnZvc0RhdGFCdWZmLCAxLyp0cnVlKi8gKTsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBQZWVrIGF0IEJEIGhlYWRlciAtIGRvIG5vdCByZW1vdmUKICAgICAgISEhIE9wdGltaXplIG1lOiBvbmx5IHBhcnQgb2YgaGVhZGVyIGlzIG5lZWRlZDsgbm90IGVudGlyZSBvbmUKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdm9zU3RhdHVzID0gV0RBX0RTX1BlZWtSeFBhY2tldEluZm8oIHZvc1RlbXBCdWZmLCAodl9QVk9JRF90KSZwdkJESGVhZGVyLCAxLypTd2FwIEJEKi8gKTsKCiAgICBpZiAoIE5VTEwgPT0gcHZCREhlYWRlciApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDYW5ub3QgZXh0cmFjdCBCRCBoZWFkZXIiKSk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIENoZWNrIGlmIGZyYW1lIGlzIGZvciBtb25pdG9yIGludGVyZmFjZQogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHVjU1RBSWQgPSAodl9VOF90KVdEQV9HRVRfUlhfU1RBSUQocHZCREhlYWRlcik7CgogICAgc3RhX21vbl9kYXRhID0gV0xBTlRMX1N0YU1vblJYKHBUTENiLCB2b3NUZW1wQnVmZiwgcHZCREhlYWRlciwgdWNTVEFJZCk7CgogICAgaWYgKHZvc19nZXRfY29ucGFyYW0oKSA9PSBWT1NfTU9OSVRPUl9NT0RFIHx8IHN0YV9tb25fZGF0YSkKICAgIHsKICAgICAgICBzdGFfbW9uX2RhdGEgPSBmYWxzZTsKCiAgICAgICAgaWYoIHBUTENiLT5pc0NvbnZlcnNpb25SZXEgKQogICAgICAgICAgICBXTEFOVExfTW9uVHJhbnNsYXRlODAyMTFUbzgwMjNIZWFkZXIodm9zVGVtcEJ1ZmYsIHBUTENiKTsKCiAgICAgICAgcFRMQ2ItPnBmbk1vblJ4KHB2b3NHQ3R4LCB2b3NUZW1wQnVmZiwgcFRMQ2ItPmlzQ29udmVyc2lvblJlcSk7CiAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICBjb250aW51ZTsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBDaGVjayBpZiBGQyBmcmFtZSByZXBvcnRlZCBmcm9tIEZXCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYoV0RBX0lTX1JYX0ZDKHB2QkRIZWFkZXIpKQogICAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJXTEFOIFRMOnJlY2VpdmUgb25lIEZDIGZyYW1lIikpOwoKICAgICAgV0xBTlRMX0Zsb3dDb250cm9sKHBUTENiLCB2b3NUZW1wQnVmZik7CgogICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICAvKiBBTVNEVSBIVyBidWcgZml4CiAgICAgKiBBZnRlciAybmQgQU1TRFUgc3ViZnJhbWUgSFcgY291bGQgbm90IGhhbmRsZSBCRCBjb3JyZWN0bHkKICAgICAqIEhBTCB3b3JrYXJvdW5kIGlzIG5lZWRlZCAqLwogICAgaWYoV0RBX0dFVF9SWF9BU0YocHZCREhlYWRlcikpCiAgICB7CiAgICAgIFdEQV9EU19SeEFtc2R1QmRGaXgocHZvc0dDdHgsIHB2QkRIZWFkZXIpOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIEV4dHJhY3QgZnJhbWUgY29udHJvbCBmaWVsZCBmcm9tIDgwMi4xMSBoZWFkZXIgaWYgcHJlc2VudCAKICAgICAgKGZyYW1lIHRyYW5zbGF0aW9uIG5vdCBkb25lKSAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgdm9zU3RhdHVzID0gV0RBX0RTX0dldEZyYW1lVHlwZVN1YlR5cGUoIHB2b3NHQ3R4LCB2b3NUZW1wQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgIHB2QkRIZWFkZXIsICZ1Y0ZybVR5cGUgKTsKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBleHRyYWN0IEZyYW1lIENvbnRyb2wgRmllbGQiKSk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIHZvc19wa3RfZ2V0X3BhY2tldF9sZW5ndGgodm9zVGVtcEJ1ZmYsICZ1c1BrdExlbik7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgQ2hlY2sgaWYgbWFuYWdlbWVudCBhbmQgc2VuZCB0byBQRQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiAoIFdMQU5UTF9JU19NR01UX0ZSQU1FKHVjRnJtVHlwZSkpCiAgICB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6U2VuZGluZyBwYWNrZXQgdG8gbWFuYWdlbWVudCBjbGllbnQiKSk7CiAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19wa3RfZmxhdHRlbl9yeF9wa3QoJnZvc1RlbXBCdWZmKSkKICAgICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBmbGF0dGVuIHBhY2tldCAtIGRyb3BwaW5nIikpOwogICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHVjU1RBSWQgPSAodl9VOF90KVdEQV9HRVRfUlhfU1RBSUQoIHB2QkRIZWFkZXIgKTsKICAgICAgLyogUmVhZCBSU1NJIGFuZCB1cGRhdGUgKi8KICAgICAgaWYoIVdMQU5UTF9TVEFfSURfSU5WQUxJRCh1Y1NUQUlkKSkKICAgICAgewojaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwogICAgICAgIC8qIFJlYWQgUlNTSSBhbmQgdXBkYXRlICovCiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX0hTSGFuZGxlUlhGcmFtZShwdm9zR0N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9NR01UX0ZSQU1FX1RZUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdkJESGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwojZWxzZQogICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9SZWFkUlNTSShwdm9zR0N0eCwgcHZCREhlYWRlciwgdWNTVEFJZCk7CiNlbmRpZgogICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCiAgICAgICAgewogICAgICAgICAgVExMT0dXKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhhbmRsZSBSWCBNYW5hZ2VtZW50IEZyYW1lIGZhaWwgd2l0aGluIEhhbmRvZmYgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydCBtb2R1bGUiKSk7CiAgICAgICAgICAvKiBEbyBOb3QgRHJvcCBwYWNrZXQgYXQgaGVyZQogICAgICAgICAgICogUmV2aXNpdCB3aHkgSE8gbW9kdWxlIHJldHVybiBmYWlsCiAgICAgICAgICAgKiAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICAgKiAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICAgKiAgIGNvbnRpbnVlOwogICAgICAgICAgICovCiAgICAgICAgfQogICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9SZWFkU05SKHB2b3NHQ3R4LCBwdkJESGVhZGVyLCB1Y1NUQUlkKTsKCiAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKICAgICAgICB7CiAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoIkZhaWxlZCB0byBSZWFkIFNOUiIpKSk7CiAgICAgICAgfQojaWZkZWYgV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMKICAgICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CiAgICAgICAgaWYgKCBOVUxMICE9IHBDbGllbnRTVEEpCiAgICAgICAgewogICAgICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5tZ210UngrKzsKICAgICAgICB9CiNlbmRpZgoKICAgICAgICBXTEFOVExfU2FtcGxlUnhSU1NJKHBUTENiLCBwdkJESGVhZGVyLCB1Y1NUQUlkKTsKCiAgICAgIH0KCiAgICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQucGZuVGxNZ210RnJtUngoIHB2b3NHQ3R4LCB2b3NUZW1wQnVmZik7IAogICAgfQogICAgZWxzZSAvKiBEYXRhIEZyYW1lICovCiAgICB7CiAgICAgIHVjU1RBSWQgPSAodl9VOF90KVdEQV9HRVRfUlhfU1RBSUQoIHB2QkRIZWFkZXIgKTsKICAgICAgdWNUaWQgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9USUQoIHB2QkRIZWFkZXIgKTsKICAgICAgdURQVVNpZyA9IFdEQV9HRVRfUlhfRFBVU0lHKHB2QkRIZWFkZXIpOwogICAgICB1Y01QRFVITGVuID0gKHVpbnQ4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4ocHZCREhlYWRlcik7CiAgICAgIHNlcV9ubyA9ICh1aW50MTZfdClXREFfR0VUX1JYX1JFT1JERVJfQ1VSX1BLVF9TRVFfTk8ocHZCREhlYWRlcik7CiAgICAgIHBuX251bSA9IFdEQV9HRVRfUlhfUkVQTEFZX0NPVU5UKHB2QkRIZWFkZXIpOwoKICAgICAgdm9zVGVtcEJ1ZmYtPnBuX251bSA9IHBuX251bTsKCiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6RGF0YSBwYWNrZXQgcmVjZWl2ZWQgZm9yIFNUQSAlZCIsIHVjU1RBSWQpKTsKCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgVGhpcyBzaG91bGQgYmUgY29ycmVjdGVkIHdoZW4gbXVsdGlwZSBzdGEgc3VwcG9ydCBpcyBhZGRlZCAhISEKICAgICAgICBmb3Igbm93IGJjYXN0IGZyYW1lcyB3aWxsIGJlIHNlbnQgdG8gdGhlIGxhc3QgcmVnaXN0ZXJlZCBTVEEKICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIGlmICggV0RBX0lTX1JYX0JDQVNUKHB2QkRIZWFkZXIpKQogICAgICB7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAiV0xBTiBUTDpUTCByeCBCY2FzdCBmcmFtZSAtIHNlbmRpbmcgdG8gbGFzdCByZWdpc3RlcmVkIHN0YXRpb24iKSk7CiAgICAgICAgYnJvYWRjYXN0ID0gVk9TX1RSVUU7CiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICBJZiBBZGRyMSBpcyBiL21jYXN0LCBidXQgQWRkcjMgaXMgb3VyIG93biBzZWxmIE1BQywgaXQgaXMgYSBiL21jYXN0CiAgICAgICAgICBwa3Qgd2Ugc2VudCAgbG9vcGluZyBiYWNrIHRvIHVzLiBUbyBiZSBkcm9wcGVkIGlmIHdlIGFyZSBub24gQlRBTVAgIAogICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCiAgICAgICAgaWYoIFdMQU5IQUxfUlhfQkRfQUREUjNfU0VMRl9JRFggPT0gCiAgICAgICAgICAgICh2X1U4X3QpV0RBX0dFVF9SWF9BRERSM19JRFgoIHB2QkRIZWFkZXIgKSkgCiAgICAgICAgewogICAgICAgICAgc2VsZkJjYXN0TG9vcGJhY2sgPSBWT1NfVFJVRTsgCiAgICAgICAgfQogICAgICB9LyppZiBiY2FzdCovCgogICAgICAvKiBQcmUgYXNzb2MgY2FjaGUgZWFwb2wgKi8KICAgICAgaWYgKHBUTENiLT5wcmVhc3NvY19jYWNoaW5nKQogICAgICB7CiAgICAgICAgIFdMQU5UTF9HZXRFdGhlclR5cGUocHZCREhlYWRlcix2b3NUZW1wQnVmZiwgdWNNUERVSExlbiwgJnVzRXRoZXJUeXBlKTsKICAgICAgICAgaWYgKFdMQU5UTF9MTENfODAyMVhfVFlQRSAhPSB1c0V0aGVyVHlwZSkKICAgICAgICAgewogICAgICAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IFJYIEZyYW1lIG5vdCBFQVBPTCBFdGhlclR5cGUgJWQiLAogICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHVzRXRoZXJUeXBlKTsKICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgV0xBTlRMX0NhY2hlRWFwb2wocFRMQ2IsIHZvc1RlbXBCdWZmKTsKICAgICAgICAgICAgVExMT0cxKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpUTCBwcmVhc3NvY19jYWNoaW5nIGlzIGVuYWJsZWQgc2VxIE5vOiAlZCIsIHNlcV9ubykpOwogICAgICAgICB9CgogICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgaWYgKFdMQU5UTF9TVEFfSURfSU5WQUxJRCh1Y1NUQUlkKSkKICAgICAgewogICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6U1RBSWQgJWQuIEludmFsaWQgU1RBIElEIGRyb3BwaW5nIHBrdCIsCiAgICAgICAgICAgICAgICAgICB1Y1NUQUlkKSk7CiAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIGlmIChXTEFOVExfVElEX0lOVkFMSUQoIHVjVGlkKSkgewogICAgICAgICAvKiBUaGVyZSBpcyBhIHBvc3NpYmlsaXR5IEFQIHVzZXMgd3JvbmcgVElELiBJbiB0aGF0IGNhc2UgdG8gYXZvaWQKICAgICAgICAgICAgZHJvcHBpbmcgRUFQT0wgcGFja2V0IGluIHRoZSBkcml2ZXIgdXNlIFRJRCB0byB6ZXJvLiovCiAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRpZDogJWQgRnJhbWUgdHlwZTogJWQiLCB1Y1RpZCwgdWNGcm1UeXBlKTsKICAgICAgICAgV0RBX0dFVF9SWF9USUQoIHB2QkRIZWFkZXIgKSA9IDA7CiAgICAgICAgIHVjVGlkID0gMDsKICAgICAgfQoKI2lmZGVmIFdMQU5fRkVBVFVSRV9MSU5LX0xBWUVSX1NUQVRTCiAgICAgIGFjID0gV0xBTlRMX1RJRF8yX0FDW3VjVGlkXTsKI2VuZGlmCgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBObyBuZWVkIHRvIGxvY2sgY2FjaGUgYWNjZXNzIGJlY2F1c2UgY2FjaGUgbWFuaXB1bGF0aW9uIG9ubHkgaGFwcGVucwogICAgICAgIGluIHRoZSB0cmFuc3BvcnQgdGhyZWFkL3Rhc2sgY29udGV4dAogICAgICAgIC0gVGhlc2UgZnJhbWVzIGFyZSB0byBiZSBmb3J3YXJkZWQgdG8gdGhlIHN0YXRpb24gdXBvbiByZWdpc3RyYXRpb24KICAgICAgICAgIHdoaWNoIGhhcHBlbnMgaW4gdGhlIG1haW4gdGhyZWFkIGNvbnRleHQKICAgICAgICAgIFRoZSBjYWNoaW5nIGhlcmUgY2FuIGhhcHBlbiBpbiBlaXRoZXIgVHggb3IgUnggdGhyZWFkIGRlcGVuZGluZwogICAgICAgICAgb24gdGhlIGN1cnJlbnQgU1NDIHNjaGVkdWxpbmcKICAgICAgICAtIGFsc28gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZnJhbWVzIGluIHRoZSBjYWNoZSBhcmUgZndkLWVkIHRvCiAgICAgICAgICB0aGUgc3RhdGlvbiBiZWZvcmUgdGhlIG5ldyBpbmNvbWluZyBvbmVzIAogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKICAgICAgaWYgKE5VTEwgPT0gcENsaWVudFNUQSkKICAgICAgewogICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpTVEEgbm90IGFsbG9jYXRlZCBtZW1vcnkuIERyb3BwaW5nIHBhY2tldCIpKTsKICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgY29udGludWU7CiAgICAgIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogICAgICBpZiAoKCBwQ2xpZW50U1RBLT51Y0V4aXN0cyApICYmCiAgICAgICAgICAgKFdMQU5fU1RBX1RETFMgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpICYmCiAgICAgICAgICAgKHBDbGllbnRTVEEtPnVjVHhTdXNwZW5kZWQpKQogICAgICAgICAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1R4U3VzcGVuZGVkLCAwICk7CiAgICAgIGVsc2UgaWYgKCAhYnJvYWRjYXN0ICYmIChwQ2xpZW50U1RBLT51Y0V4aXN0cyA9PSAwICkgKQogICAgICB7CiAgICAgICAgICB0cFNpck1hY01nbXRIZHIgcE1hY0hlYWRlciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUiggcHZCREhlYWRlciApOwoKICAgICAgICAgIC8qIGZyb20gdGhlIGRpcmVjdCBwZWVyIHdoaWxlIGl0IGlzIG5vdCByZWdpc3RlcmVkIHRvIFRMIHlldCAqLwogICAgICAgICAgaWYgKCAocE1hY0hlYWRlci0+ZmMuZnJvbURTID09IDApICYmCiAgICAgICAgICAgICAgIChwTWFjSGVhZGVyLT5mYy50b0RTID09IDApICkKICAgICAgICAgIHsKICAgICAgICAgICAgICB2X1U4X3QgdWNBZGRyM1NUQUlkOwoKICAgICAgICAgICAgICB1Y0FkZHIzU1RBSWQgPSBXREFfR0VUX1JYX0FERFIzX0lEWChwdkJESGVhZGVyKTsKCiAgICAgICAgICAgICAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQodWNBZGRyM1NUQUlkKSApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOlNUQSBJRCAlZCBpbnZhbGlkIC0gZHJvcHBpbmcgcGt0IiwgdWNBZGRyM1NUQUlkKSk7CiAgICAgICAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmICghKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjQWRkcjNTVEFJZF0gJiYgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNBZGRyM1NUQUlkXS0+dWNFeGlzdHMgJiYKICAgICAgICAgICAgICAgICAgKFdMQU5fU1RBX0lORlJBID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjQWRkcjNTVEFJZF0tPndTVEFEZXNjLndTVEFUeXBlKSAmJgogICAgICAgICAgICAgICAgICAoV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjQWRkcjNTVEFJZF0tPnRsU3RhdGUpKSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHN0YUlkICVkIGFkZHIzSWQgJWQgdGxTdGF0ZSAlZC4gVW5rb3duIFJlY2VpdmVyL1RyYW5zbWl0dGVyIERyb3BwaW5nIHBhY2tldCIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCB1Y0FkZHIzU1RBSWQsIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjQWRkcjNTVEFJZF0tPnRsU3RhdGUpKTsKICAgICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHN0YUlkICVkIGRvZXNuJ3QgZXhpc3QsIGJ1dCBtYXBwZWQgdG8gQVAgc3RhSWQgJWQiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgdWNBZGRyM1NUQUlkKSk7CiAgICAgICAgICAgICAgICAgIHVjU1RBSWQgPSB1Y0FkZHIzU1RBSWQ7CiAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0FkZHIzU1RBSWRdOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfQojZW5kaWYKCiAgICAgIGlmICgoIHBDbGllbnRTVEEtPmVuYWJsZUNhY2hpbmcgPT0gMSApICYmCiAgICAgICAgICAgIC8qRG9udCBidWZmZXIgQnJvYWRjYXN0L011bHRpY2FzdCBmcmFtZXMuIElmIEFQIHRyYW5zbWl0cyBidXJzdHMgb2YgQnJvYWRjYXN0L011bHRpY2FzdCBkYXRhIGZyYW1lcywgCiAgICAgICAgICAgICAqIGxpYnJhIGJ1ZmZlcnMgYWxsIEJyb2FkY2FzdC9NdWx0aWNhc3QgcGFja2V0cyBhZnRlciBhdXRoZW50aWNhdGlvbiB3aXRoIEFQLCAKICAgICAgICAgICAgICogU28gaXQgd2lsbCBsZWFkIHRvIGxvdyByZXNvdXJjZSBjb25kaXRpb24gaW4gUnggRGF0YSBQYXRoLiovCiAgICAgICAgICAoIFdEQV9JU19SWF9CQ0FTVChwdkJESGVhZGVyKSA9PSAwICkpCiAgICAgIHsKICAgICAgICBpZiggV0RBX0lzU2VsZlNUQShwdm9zR0N0eCx1Y1NUQUlkKSkKICAgICAgICB7CiAgICAgICAgICAgLy9kcm9wIHBhY2tldCBmb3IgU2VsZiBTVEEgaW5kZXgKICAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgIiVzOiBQYWNrZXQgZHJvcHBlZCBmb3IgU2VsZiBTVEEgd2l0aCBzdGFJZCAlZCAiLCBfX2Z1bmNfXywgdWNTVEFJZCApKTsKCiAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICAvKiBTdGF0aW9uIGhhcyBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCB3aXRoIFRMIC0gY2FjaGUgdGhlIGZyYW1lICovCiAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgIiVzOiBzdGFJZCAlZCBleGlzdCAlZCB0bFN0YXRlICVkIGNhY2hlIHJ4IGZyYW1lIiwgX19mdW5jX18sIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dWNFeGlzdHMsIHBDbGllbnRTVEEtPnRsU3RhdGUpKTsKICAgICAgICBXTEFOVExfQ2FjaGVTVEFGcmFtZSggcFRMQ2IsIHVjU1RBSWQsIHZvc1RlbXBCdWZmLCB1RFBVU2lnLCBicm9hZGNhc3QsIHVjRnJtVHlwZSk7CiAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FECiAgICAgIGlmICgocENsaWVudFNUQS0+d1NUQURlc2MudWNJc0VzZVN0YSl8fCBicm9hZGNhc3QpCiAgICAgIHsKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICBGaWx0ZXIgdGhlIElBUFAgZnJhbWVzIGZvciBFU0UgY29ubmVjdGlvbjsKICAgICAgICAgIGlmIGRhdGEgaXQgd2lsbCByZXR1cm4gZmFsc2UgYW5kIGl0CiAgICAgICAgICB3aWxsIGJlIHJvdXRlZCB0aHJvdWdoIHRoZSByZWd1bGFyIGRhdGEgcGF0aAogICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBpZiAoIFdMQU5UTF9Jc0lBUFBGcmFtZShwdkJESGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmKSkKICAgICAgICB7CiAgICAgICAgICAgIGJGb3J3YXJkSUFQUHdpdGhMTEMgPSBWT1NfVFJVRTsKICAgICAgICB9CiAgICAgIH0KI2VuZGlmCgojaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFKSAmJiAhZGVmaW5lZChGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCkKICAgICAgaWYgKChwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0lzRXNlU3RhKXx8IGJyb2FkY2FzdCkKICAgICAgewogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgIEZpbHRlciB0aGUgSUFQUCBmcmFtZXMgZm9yIEVTRSBjb25uZWN0aW9uOwogICAgICAgICAgaWYgZGF0YSBpdCB3aWxsIHJldHVybiBmYWxzZSBhbmQgaXQgCiAgICAgICAgICB3aWxsIGJlIHJvdXRlZCB0aHJvdWdoIHRoZSByZWd1bGFyIGRhdGEgcGF0aAogICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBpZiAoIFdMQU5UTF9Jc0lBUFBGcmFtZShwdkJESGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc19wa3RfZmxhdHRlbl9yeF9wa3QoJnZvc1RlbXBCdWZmKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBmbGF0dGVuIHBhY2tldCAtIGRyb3BwaW5nIikpOwogICAgICAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBSZWNlaXZlZCBFU0UgSUFQUCBGcmFtZSIpKTsKCiAgICAgICAgICAgICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQucGZuVGxNZ210RnJtUngoIHB2b3NHQ3R4LCB2b3NUZW1wQnVmZik7IAogICAgICAgICAgICB9CiAgICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQojZW5kaWYgIC8qIGRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRSkgJiYgIWRlZmluZWQoRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQpICovCgogICAgICBpZiAoIFdMQU5fU1RBX0JUX0FNUCA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSApCiAgICAgIHsKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICBQcm9jZXNzIHRoZSBjdHJsIEJBUCBmcmFtZTsgaWYgZGF0YSBpdCB3aWxsIHJldHVybiBmYWxzZSBhbmQgaXQgCiAgICAgICAgICB3aWxsIGJlIHJvdXRlZCB0aHJvdWdoIHRoZSByZWd1bGFyIGRhdGEgcGF0aAogICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBpZiAoIFdMQU5UTF9Qcm9jZXNzQkFQRnJhbWUoIHB2QkRIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RfZGF0YV9wa3RfYXJyaXZlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQpKQogICAgICAgIHsKICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0vKmlmIEJULUFNUCBzdGF0aW9uKi8KICAgICAgZWxzZSBpZihzZWxmQmNhc3RMb29wYmFjayA9PSBWT1NfVFJVRSkKICAgICAgeyAKICAgICAgICAvKiBEcm9wIHBhY2tldCAqLyAKICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOyAKICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOyAKICAgICAgICBjb250aW51ZTsgCiAgICAgIH0gCiAgICAgIAogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIERhdGEgcGFja2V0IHJlY2VpdmVkLCBzZW5kIHRvIHN0YXRlIG1hY2hpbmUKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgd1NUQUV2ZW50ID0gV0xBTlRMX1JYX0VWRU5UOwoKICAgICAgcGZuU1RBRnNtID0gdGxTVEFGc21bcENsaWVudFNUQS0+dGxTdGF0ZV0uCiAgICAgICAgICAgICAgICAgICAgICBwZm5TVEFUYmxbd1NUQUV2ZW50XTsKCiAgICAgIGlmICggTlVMTCAhPSBwZm5TVEFGc20gKQogICAgICB7CiNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCiAgICAgICAgLyogUmVhZCBSU1NJIGFuZCB1cGRhdGUgKi8KICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfSFNIYW5kbGVSWEZyYW1lKHB2b3NHQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0RBVEFfRlJBTUVfVFlQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2QkRIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYpOwogICAgICAgIGJyb2FkY2FzdCA9IFZPU19GQUxTRTsKI2Vsc2UKICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfUmVhZFJTU0kocHZvc0dDdHgsIHB2QkRIZWFkZXIsIHVjU1RBSWQpOwojZW5kaWYKICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAiSGFuZGxlIFJYIERhdGEgRnJhbWUgZmFpbCB3aXRoaW4gSGFuZG9mZiBzdXBwb3J0IG1vZHVsZSIpKTsKICAgICAgICAgIC8qIERvIE5vdCBEcm9wIHBhY2tldCBhdCBoZXJlIAogICAgICAgICAgICogUmV2aXNpdCB3aHkgSE8gbW9kdWxlIHJldHVybiBmYWlsCiAgICAgICAgICAgKiB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgICAgICogdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgICAqIGNvbnRpbnVlOwogICAgICAgICAgICovCiAgICAgICAgfQojaWZkZWYgV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMKICAgICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CiAgICAgICAgaWYgKCBOVUxMICE9IHBDbGllbnRTVEEpCiAgICAgICAgewogICAgICAgICAgICB0cFNpck1hY01nbXRIZHIgcE1hY0hlYWRlciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUiggcHZCREhlYWRlciApOwogICAgICAgICAgICBpZiAoIUlTX0JST0FEQ0FTVF9BREQocE1hY0hlYWRlci0+ZGEpICYmIElTX01VTFRJQ0FTVF9BREQocE1hY0hlYWRlci0+ZGEpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzW2FjXS5yeE1jYXN0Kys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFdMQU5UTF9IU0dldERhdGFSU1NJKHB2b3NHQ3R4LCBwdkJESGVhZGVyLCB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICZjdXJyZW50QXZnUlNTSSk7CiAgICAgICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLnJzc2lEYXRhID0gY3VycmVudEF2Z1JTU0k7CgogICAgICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzW2FjXS5yeE1wZHUrKzsKICAgICAgICAgICAgaWYgKFdEQV9JU19SWF9BTl9BTVBEVSAocHZCREhlYWRlcikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbYWNdLnJ4QW1wZHUrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCgojZW5kaWYKICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfUmVhZFNOUihwdm9zR0N0eCwgcHZCREhlYWRlciwgdWNTVEFJZCk7CgogICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCiAgICAgICAgewogICAgICAgICAgVExMT0dXKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwoIkZhaWxlZCB0byBSZWFkIFNOUiIpKSk7CiAgICAgICAgfQoKICAgICAgICBXTEFOVExfU2FtcGxlUnhSU1NJKHBUTENiLCBwdkJESGVhZGVyLCB1Y1NUQUlkKTsKCiAgICAgICAgcGZuU1RBRnNtKCBwdm9zR0N0eCwgdWNTVEFJZCwgJnZvc1RlbXBCdWZmLCBiRm9yd2FyZElBUFB3aXRoTExDKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICJXTEFOIFRMOk5VTEwgc3RhdGUgZnVuY3Rpb24sIFNUQTolZCwgU3RhdGU6ICVkLSBkcm9wcGluZyBwYWNrZXQiLAogICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dGxTdGF0ZSkpOwogICAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgfS8qIGVsc2UgZGF0YSBmcmFtZSovCgogICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICB9Lyp3aGlsZSBjaGFpbiovCgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUnhGcmFtZXMgKi8KCiNpZmRlZiBXTEFOX0ZFQVRVUkVfTElOS19MQVlFUl9TVEFUUwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9Db2xsZWN0SW50ZXJmYWNlU3RhdHMKCiAgREVTQ1JJUFRJT04KICAgIFV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSBUTCB0byBzZW5kIHRoZSBzdGF0aXRpY3MKCiAgREVQRU5ERU5DSUVTCgoKICBQQVJBTUVURVJTCgogICAgSU4KCiAgICB1Y1NUQUlkOiAgICBzdGF0aW9uIGZvciB3aGljaCB0aGUgc3RhdGlzdGljcyBuZWVkIHRvIGNvbGxlY3RlZAoKICAgIHZvc0RhdGFCdWZmOiBpdCB3aWxsIGNvbnRhaW4gdGhlIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgICAgICAgICAgIHN0cnVjdHVyZQoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfQ29sbGVjdEludGVyZmFjZVN0YXRzCigKICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQsCiAgV0xBTlRMX0ludGVyZmFjZVN0YXRzVHlwZSAgICAqdm9zRGF0YUJ1ZmYKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0NvbGxlY3RTdGF0cyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NvbGxlY3RTdGF0cyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAiV0xBTiBUTDogY29sbGVjdCBXSUZJX1NUQVRTX0lGQUNFIHJlc3VsdHMiKSk7CgogIHZvc19tZW1fY29weSh2b3NEYXRhQnVmZiwgJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5pbnRlcmZhY2VTdGF0cywKICAgICAgICAgIHNpemVvZihXTEFOVExfSW50ZXJmYWNlU3RhdHNUeXBlKSk7CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ2xlYXJJbnRlcmZhY2VTdGF0cwoKICBERVNDUklQVElPTgogICAgVXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IFRMIHRvIGNsZWFyIHRoZSBzdGF0aXRpY3MKCiAgREVQRU5ERU5DSUVTCgoKICBQQVJBTUVURVJTCgogICAgSU4KCiAgICB1Y1NUQUlkOiAgICBzdGF0aW9uIGZvciB3aGljaCB0aGUgc3RhdGlzdGljcyBuZWVkIHRvIGNvbGxlY3RlZAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfQ2xlYXJJbnRlcmZhY2VTdGF0cwooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICB1Y1NUQUlkLAogIHZfVThfdCAgICAgICAgICBzdGF0c0NsZWFyUmVxTWFzawopCnsKICAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBTYW5pdHkgY2hlY2sKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfQ29sbGVjdFN0YXRzIikpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogICAgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9Db2xsZWN0U3RhdHMiKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIH0KCiAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CiAgICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgICB7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICB9CgogICAgaWYgKChzdGF0c0NsZWFyUmVxTWFzayAmIFdJRklfU1RBVFNfSUZBQ0VfQUMpIHx8CiAgICAgICAgICAgIChzdGF0c0NsZWFyUmVxTWFzayAmIFdJRklfU1RBVFNfSUZBQ0UpKSB7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpjbGVhcmVkIFdJRklfU1RBVFNfSUZBQ0VfQUMgcmVzdWx0cyIpKTsKICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzBdLnJ4TWNhc3QgPSAwOwogICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbMV0ucnhNY2FzdCA9IDA7CiAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1syXS5yeE1jYXN0ID0gMDsKICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzNdLnJ4TWNhc3QgPSAwOwoKICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzBdLnJ4TXBkdSA9IDA7CiAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1sxXS5yeE1wZHUgPSAwOwogICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbMl0ucnhNcGR1ID0gMDsKICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzNdLnJ4TXBkdSA9IDA7CgogICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbMF0ucnhBbXBkdSA9IDA7CiAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMuYWNjZXNzQ2F0ZWdvcnlTdGF0c1sxXS5yeEFtcGR1ID0gMDsKICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5hY2Nlc3NDYXRlZ29yeVN0YXRzWzJdLnJ4QW1wZHUgPSAwOwogICAgICAgIHBDbGllbnRTVEEtPmludGVyZmFjZVN0YXRzLmFjY2Vzc0NhdGVnb3J5U3RhdHNbM10ucnhBbXBkdSA9IDA7CiAgICB9CgogICAgaWYgKHN0YXRzQ2xlYXJSZXFNYXNrICYgV0lGSV9TVEFUU19JRkFDRSkgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Y2xlYXJlZCBXSUZJX1NUQVRTX0lGQUNFIHJlc3VsdHMiKSk7CiAgICAgICAgcENsaWVudFNUQS0+aW50ZXJmYWNlU3RhdHMubWdtdFJ4ID0gMDsKICAgICAgICBwQ2xpZW50U1RBLT5pbnRlcmZhY2VTdGF0cy5yc3NpRGF0YSA9IDA7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgIH0KCiAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgojZW5kaWYgLyogV0xBTl9GRUFUVVJFX0xJTktfTEFZRVJfU1RBVFMgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1J4Q2FjaGVkRnJhbWVzCgogIERFU0NSSVBUSU9OCiAgICBVdGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgVEwgdG8gZm9yd2FyZCB0aGUgY2FjaGVkIGZyYW1lcyB0byBhIHBhcnRpY3VsYXIKICAgIHN0YXRpb247IAoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgogICAgSWYgdGhlIGZyYW1lIGNhcnJpZWQgaXMgYSBkYXRhIGZyYW1lIHRoZW4gdGhlIHN0YXRpb24gZm9yIHdoaWNoIGl0IGlzCiAgICBkZXN0aW5lZCB0byBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCBUTC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwVExDYjogICBwb2ludGVyIHRvIFRMIGhhbmRsZSAKICAgCiAgICB1Y1NUQUlkOiAgICBzdGF0aW9uIGZvciB3aGljaCB3ZSBuZWVkIHRvIGZvcndhcmQgdGhlIHBhY2tldHMKCiAgICB2b3NEYXRhQnVmZjogICBpdCB3aWxsIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjYWNoZWQgYnVmZmVyCiAgICAgICAgICAgICAgICAgICByZWNlaXZlZCwgaWYgdGhlcmUgaXMgbW9yZSB0aGVuIG9uZSBwYWNrZXQgdGhleSB3aWxsIGJlCiAgICAgICAgICAgICAgICAgICBjaGFpbmVkIHVzaW5nIHZPU1MgYnVmZmVycy4KCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1J4Q2FjaGVkRnJhbWVzCigKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IsCiAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmCikKewogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICBXTEFOVExfU1RBRnVuY1R5cGUgIHBmblNUQUZzbTsKICB2b3NfcGt0X3QqICAgICAgICAgIHZvc1RlbXBCdWZmOwogIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzOwogIHZfUFZPSURfdCAgICAgICAgICAgcHZCREhlYWRlciA9IE5VTEw7CiAgV0xBTlRMX1NUQUV2ZW50VHlwZSB3U1RBRXZlbnQgID0gV0xBTlRMX1JYX0VWRU5UOwogIHZfVThfdCAgICAgICAgICAgICAgdWNUaWQgICAgICA9IDA7CiAgdl9CT09MX3QgICAgICAgICAgICBicm9hZGNhc3QgID0gVk9TX0ZBTFNFOwogIHZfQk9PTF90ICAgICAgICAgICAgYlNpZ01hdGNoICA9IFZPU19GQUxTRTsgCiAgdl9CT09MX3QgICAgICAgICAgICBzZWxmQmNhc3RMb29wYmFjayA9IFZPU19GQUxTRTsKICBzdGF0aWMgdl9VOF90ICAgICAgIGZpcnN0X2RhdGFfcGt0X2Fycml2ZWQ7CiAgdl9VMzJfdCAgICAgICAgICAgICB1RFBVU2lnOyAKICB2X1U4X3QgICAgICAgICAgICAgIHVjVWNhc3RTaWc7IAogIHZfVThfdCAgICAgICAgICAgICAgdWNCY2FzdFNpZzsgCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpUTCBSZWNlaXZlIENhY2hlZCBGcmFtZXMgY2FsbGVkIikpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSB2b3NEYXRhQnVmZiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9SeEZyYW1lcyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBNVFJBQ0Uodm9zX3RyYWNlKFZPU19NT0RVTEVfSURfVEwsIFRSQUNFX0NPREVfVExfRk9SV0FSRF9DQUNIRURfRlJBTUVTLAogICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgMTw8MTYgfCBwQ2xpZW50U1RBLT50bENhY2hlSW5mby5jYWNoZVNpemUpKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhdmUgdGhlIGluaXRpYWwgYnVmZmVyIC0gdGhpcyBpcyB0aGUgZmlyc3QgcmVjZWl2ZWQgYnVmZmVyCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKCiAgd2hpbGUgKCBOVUxMICE9IHZvc1RlbXBCdWZmICkKICB7CiAgICBicm9hZGNhc3QgPSBWT1NfRkFMU0U7CiAgICBzZWxmQmNhc3RMb29wYmFjayA9IFZPU19GQUxTRTsgCgogICAgdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggdm9zRGF0YUJ1ZmYsICZ2b3NEYXRhQnVmZiwgMS8qdHJ1ZSovICk7CgogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6U2VuZGluZyBuZXcgY2FjaGVkIHBhY2tldCB0byBzdGF0aW9uICVkIiwgdWNTVEFJZCkpOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgUGVlayBhdCBCRCBoZWFkZXIgLSBkbyBub3QgcmVtb3ZlCiAgICAgICEhISBPcHRpbWl6ZSBtZTogb25seSBwYXJ0IG9mIGhlYWRlciBpcyBuZWVkZWQ7IG5vdCBlbnRpcmUgb25lCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHZvc1N0YXR1cyA9IFdEQV9EU19QZWVrUnhQYWNrZXRJbmZvKCB2b3NUZW1wQnVmZiwgKHZfUFZPSURfdCkmcHZCREhlYWRlciwgMCApOwoKICAgIGlmICggTlVMTCA9PSBwdkJESGVhZGVyICkKICAgICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBleHRyYWN0IEJEIGhlYWRlciIpKTsKICAgICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICB1RFBVU2lnID0gV0RBX0dFVF9SWF9EUFVTSUcoIHB2QkRIZWFkZXIgKTsKCiAgICAvKiBBTVNEVSBIVyBidWcgZml4CiAgICAgKiBBZnRlciAybmQgQU1TRFUgc3ViZnJhbWUgSFcgY291bGQgbm90IGhhbmRsZSBCRCBjb3JyZWN0bHkKICAgICAqIEhBTCB3b3JrYXJvdW5kIGlzIG5lZWRlZCAqLwogICAgaWYoV0RBX0dFVF9SWF9BU0YocHZCREhlYWRlcikpCiAgICB7CiAgICAgIFdEQV9EU19SeEFtc2R1QmRGaXgodm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1RMLHBUTENiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2QkRIZWFkZXIpOwogICAgfQoKICAgIHVjVGlkICAgPSAodl9VOF90KVdEQV9HRVRfUlhfVElEKCBwdkJESGVhZGVyICk7CgogICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpEYXRhIHBhY2tldCBjYWNoZWQgZm9yIFNUQSAlZCIsIHVjU1RBSWQpOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIFRoaXMgc2hvdWxkIGJlIGNvcnJlY3RlZCB3aGVuIG11bHRpcGUgc3RhIHN1cHBvcnQgaXMgYWRkZWQgISEhCiAgICAgIGZvciBub3cgYmNhc3QgZnJhbWVzIHdpbGwgYmUgc2VudCB0byB0aGUgbGFzdCByZWdpc3RlcmVkIFNUQQogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAoIFdEQV9JU19SWF9CQ0FTVChwdkJESGVhZGVyKSkKICAgIHsKICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6VEwgcnggQmNhc3QgZnJhbWUgIikpOwogICAgICBicm9hZGNhc3QgPSBWT1NfVFJVRTsKCiAgICAgIC8qIElmIEFkZHIxIGlzIGIvbWNhc3QsIGJ1dCBBZGRyMyBpcyBvdXIgb3duIHNlbGYgTUFDLCBpdCBpcyBhIGIvbWNhc3QgCiAgICAgICAqIHBrdCB3ZSBzZW50IGxvb3BpbmcgYmFjayB0byB1cy4gVG8gYmUgZHJvcHBlZCBpZiB3ZSBhcmUgbm9uIEJUQU1QICAKICAgICAgICovIAogICAgICBpZiggV0xBTkhBTF9SWF9CRF9BRERSM19TRUxGX0lEWCA9PSAKICAgICAgICAgICh2X1U4X3QpV0RBX0dFVF9SWF9BRERSM19JRFgoIHB2QkRIZWFkZXIgKSkgCiAgICAgIHsKICAgICAgICBzZWxmQmNhc3RMb29wYmFjayA9IFZPU19UUlVFOyAKICAgICAgfQogICAgfS8qaWYgYmNhc3QqLwoKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgQ2hlY2sgaWYgdGhlIHBhY2tldCB0aGF0IHdlIGNhY2hlZCBtYXRjaGVzIHRoZSBEUFUgc2lnbmF0dXJlIG9mIHRoZQogICAgICBuZXdseSBhZGRlZCBzdGF0aW9uIAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogICAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgfQoKICAgIGlmICggYnJvYWRjYXN0ICkKICAgIHsKICAgICAgdWNCY2FzdFNpZyA9ICh2X1U4X3QpdURQVVNpZzsKICAgICAgYlNpZ01hdGNoID0gKCggV0xBTl9UTF9JTlZBTElEX0JfU0lHICE9IAogICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcgKSAmJgogICAgICAgICggdWNCY2FzdFNpZyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnICkpOwogICAgfQogICAgZWxzZQogICAgewogICAgICB1Y1VjYXN0U2lnID0gKHZfVThfdCl1RFBVU2lnOwogICAgICBiU2lnTWF0Y2ggPSAoKCBXTEFOX1RMX0lOVkFMSURfVV9TSUcgIT0gCiAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnICkgJiYKICAgICAgICAgICggdWNVY2FzdFNpZyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnICkpOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBJZiB0aGUgcGFja2V0IGRvZXNuJ3QgbWF0Y2ggLSBkcm9wIGl0IAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAoICFiU2lnTWF0Y2ggKQogICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19NRUQsCiAgICAgICAgIldMQU4gVEw6IENhY2hlZCBwYWNrZXQgZG9lcyBub3QgbWF0Y2ggRFBVIFNpZyBvZiB0aGUgbmV3IFNUQSAtIGRyb3AgIgogICAgICAgICIgRFBVIFNpZyAlZCAgVUMgJWQgQkMgJWQgQiAlZCIsCiAgICAgICAgdURQVVNpZywKICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnLAogICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcsCiAgICAgICAgYnJvYWRjYXN0KSk7CgogICAgICAvKiBEcm9wIHBhY2tldCAqLyAKICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsgCiAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7IAogICAgICBjb250aW51ZTsgCgogICAgfS8qaWYgc2lnbmF0dXJlIG1pc21hdGNoKi8KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBDaGVjayBpZiBCVC1BTVAgZnJhbWU6CiAgICAgIC0gYWRkaXRpb25hbCBwcm9jZXNzaW5nIG5lZWRlZCBpbiB0aGlzIGNhc2UgdG8gc2VwYXJhdGUgQlQtQU1QIGRhdGUKICAgICAgICBmcm9tIEJULUFNUCBDdHJsIHBhdGggCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYgKCBXTEFOX1NUQV9CVF9BTVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUgKQogICAgewogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgUHJvY2VzcyB0aGUgY3RybCBCQVAgZnJhbWU7IGlmIGRhdGEgaXQgd2lsbCByZXR1cm4gZmFsc2UgYW5kIGl0IAogICAgICAgIHdpbGwgYmUgcm91dGVkIHRocm91Z2ggdGhlIHJlZ3VsYXIgZGF0YSBwYXRoCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgaWYgKCBXTEFOVExfUHJvY2Vzc0JBUEZyYW1lKCBwdkJESGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0X2RhdGFfcGt0X2Fycml2ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCkpCiAgICAgIHsKICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0vKmlmIEJULUFNUCBzdGF0aW9uKi8KICAgICAgZWxzZSBpZihzZWxmQmNhc3RMb29wYmFjayA9PSBWT1NfVFJVRSkKICAgICAgeyAKICAgICAgICAvKiBEcm9wIHBhY2tldCAqLyAKICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOyAKICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOyAKICAgICAgICBjb250aW51ZTsgCiAgICAgIH0gCiAgICAgIAogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIERhdGEgcGFja2V0IHJlY2VpdmVkLCBzZW5kIHRvIHN0YXRlIG1hY2hpbmUKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgd1NUQUV2ZW50ID0gV0xBTlRMX1JYX0VWRU5UOwoKICAgICAgcGZuU1RBRnNtID0gdGxTVEFGc21bcENsaWVudFNUQS0+dGxTdGF0ZV0uCiAgICAgICAgICAgICAgICAgICAgICBwZm5TVEFUYmxbd1NUQUV2ZW50XTsKCiAgICAgIGlmICggTlVMTCAhPSBwZm5TVEFGc20gKQogICAgICB7CiNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCiAgICAgICAgLyogUmVhZCBSU1NJIGFuZCB1cGRhdGUgKi8KICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfSFNIYW5kbGVSWEZyYW1lKHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX01PRFVMRV9JRF9UTCxwVExDYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfREFUQV9GUkFNRV9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZik7CiAgICAgICAgYnJvYWRjYXN0ID0gVk9TX0ZBTFNFOwojZWxzZQogICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9SZWFkUlNTSSh2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfVEwscFRMQ2IpLCBwdkJESGVhZGVyLCB1Y1NUQUlkKTsKI2VuZGlmCiAgICAgICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiSGFuZGxlIFJYIERhdGEgRnJhbWUgZmFpbCB3aXRoaW4gSGFuZG9mZiBzdXBwb3J0IG1vZHVsZSIpKTsKICAgICAgICAgIC8qIERvIE5vdCBEcm9wIHBhY2tldCBhdCBoZXJlIAogICAgICAgICAgICogUmV2aXNpdCB3aHkgSE8gbW9kdWxlIHJldHVybiBmYWlsCiAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICovCiAgICAgICAgfQogICAgICAgIHBmblNUQUZzbSggdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1RMLHBUTENiKSwgdWNTVEFJZCwgCiAgICAgICAgICAgICAgICAgJnZvc1RlbXBCdWZmLCBWT1NfRkFMU0UpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6TlVMTCBzdGF0ZSBmdW5jdGlvbiwgU1RBOiVkLCBTdGF0ZTogJWQtIGRyb3BwaW5nIHBhY2tldCIsCiAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCBwQ2xpZW50U1RBLT50bFN0YXRlKSk7CiAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogIH0vKndoaWxlIGNoYWluKi8KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SeENhY2hlZEZyYW1lcyAqLwoKLyoqCiAqIFdMQU5UTF9Gb3J3YXJkUGt0cygpIC0gZm9yd2FyZCBjYWNoZWQgZWFwb2wgZnJhbWVzCiAqIEBwdm9zR0N0eDogcG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQKICogQGRhdGE6IHZhbHVlIHRvIGluZGljYXRlIGVpdGhlciBmb3J3YXJkIG9yIGZsdXNoCiAqCiAqIFJldHVybjogTm9uZQogKgogKi8Kc3RhdGljIFZPU19TVEFUVVMgV0xBTlRMX0ZvcndhcmRQa3RzKHZvaWQqIHB2b3NHQ3R4LCB1aW50MzJfdCBkYXRhKQp7CiAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CgogICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogICBpZiAoTlVMTCA9PSBwVExDYikgewogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICIlczogSW52YWxpZCBpbnB1dCBwb2ludGVyIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgfQoKICAgaWYgKCFkYXRhKSB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICIlczogUHJlIGFzc29jIGZhaWwgZmx1c2ggY2FjaGUiLCBfX2Z1bmNfXykpOwogICAgICBXTEFOVExfRmx1c2hDYWNoZWRGcmFtZXMocFRMQ2ItPnZvc0VhcG9sQ2FjaGVkRnJhbWUpOwogICAgICBnb3RvIGRvbmU7CiAgIH0KCiAgIC8qIGZvcndhcmQgcGFja2V0cyB0byBIREQgKi8KICAgaWYgKE5VTEwgIT0gcFRMQ2ItPnZvc0VhcG9sQ2FjaGVkRnJhbWUpIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICIlczogZm9yd2FyZCBwcmUgYXNzb2MgY2FjaGVkIGZyYW1lcyIsIF9fZnVuY19fKSk7CiAgICAgIFdMQU5UTF9Nb25UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlcihwVExDYi0+dm9zRWFwb2xDYWNoZWRGcmFtZSwgcFRMQ2IpOwogICAgICBwVExDYi0+cGZuRWFwb2xGd2QocHZvc0dDdHgsIHBUTENiLT52b3NFYXBvbENhY2hlZEZyYW1lKTsKICAgfQoKZG9uZToKICBwVExDYi0+dm9zRWFwb2xDYWNoZWRGcmFtZSA9IE5VTEw7CiAgcFRMQ2ItPnByZWFzc29jX2NhY2hpbmcgPSBmYWxzZTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9SeFByb2Nlc3NNc2cKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBWT1NTIHdoZW4gYSBtZXNzYWdlIHdhcyBzZXJpYWxpemVkIGZvciBUTCB0aHJvdWdoIHRoZQogICAgcnggdGhyZWFkL3Rhc2suCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIG1lc3NhZ2U6ICAgICAgICB0eXBlIGFuZCBjb250ZW50IG9mIHRoZSBtZXNzYWdlCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBPdGhlciB2YWx1ZXMgY2FuIGJlIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGEgZnVuY3Rpb24gY2FsbCwgcGxlYXNlIGNoZWNrCiAgY29ycmVzcG9uZGluZyBBUEkgZm9yIG1vcmUgaW5mby4KICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9SeFByb2Nlc3NNc2cKKAogIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgsCiAgdm9zX21zZ190KiAgICAgICBtZXNzYWdlCikKewogICBWT1NfU1RBVFVTICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogICB2X1UzMl90ICAgICAgICAgdURhdGE7CiAgIHZfVThfdCAgICAgICAgICB1Y1NUQUlkOwogICB2X1U4X3QgICAgICAgICAgdWNVY2FzdFNpZzsKICAgdl9VOF90ICAgICAgICAgIHVjQmNhc3RTaWc7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gbWVzc2FnZSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9SeFByb2Nlc3NNZXNzYWdlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBQcm9jZXNzIG1lc3NhZ2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmVjZWl2ZWQgbWVzc2FnZTogJWQgdGhyb3VnaCByeCBmbG93IiwgbWVzc2FnZS0+dHlwZSkpOwoKICBzd2l0Y2goIG1lc3NhZ2UtPnR5cGUgKQogIHsKCiAgY2FzZSBXTEFOVExfUlhfRldEX0NBQ0hFRDoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgVGhlIGRhdGEgc2VudCB3aXRoIHRoZSBtZXNzYWdlIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKICAgICAgIHwgMDAgfCB1Y0JjYXN0U2lnbmF0dXJlIHwgdWNVY2FzdFNpZ25hdHVyZSB8IHVjU1RBSUQgfAogICAgICAgZWFjaCBmaWVsZCBhYm92ZSBpcyBvbmUgYnl0ZQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHVEYXRhICAgICAgID0gbWVzc2FnZS0+Ym9keXZhbDsKICAgIHVjU1RBSWQgICAgID0gKCB1RGF0YSAmIDB4MDAwMDAwRkYpOwogICAgdWNVY2FzdFNpZyAgPSAoIHVEYXRhICYgMHgwMDAwRkYwMCk+Pjg7CiAgICB1Y0JjYXN0U2lnICA9ICh2X1U4X3QpKCggdURhdGEgJiAweDAwRkYwMDAwKT4+MTYpOwogICAgdm9zU3RhdHVzICAgPSBXTEFOVExfRm9yd2FyZFNUQUZyYW1lcyggcHZvc0dDdHgsIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1VjYXN0U2lnLCB1Y0JjYXN0U2lnKTsKICAgIGJyZWFrOwoKICBjYXNlIFdMQU5UTF9SWF9GV0RfUFJFX0FTU09DX0NBQ0hFRDoKICAgIHVEYXRhID0gbWVzc2FnZS0+Ym9keXZhbDsKICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9Gb3J3YXJkUGt0cyhwdm9zR0N0eCwgdURhdGEpOwogICAgYnJlYWs7CgogIGRlZmF1bHQ6CiAgICAvKm5vIHByb2Nlc3NpbmcgZm9yIG5vdyovCiAgICBicmVhazsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1Jlc291cmNlQ0IKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSB0aGUgVEwgd2hlbiBpdCBoYXMgcGFja2V0cyBhdmFpbGFibGUgZm9yIHRyYW5zbWlzc2lvbi4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggQkFMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIEJBTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1Jlc291cmNlQ0IKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eCwKICB2X1UzMl90ICAgICAgICAgdUNvdW50CikKewogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBwVExDYi0+dVJlc0NvdW50ID0gdUNvdW50OwoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVzdW1lIFR4IGlmIGVub3VnaCByZXMgYW5kIG5vdCBzdXNwZW5kZWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19NRiApICYmCiAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICJXTEFOIFRMOklzc3VpbmcgWG1pdCBzdGFydCByZXF1ZXN0IHRvIEJBTCBmb3IgYXZhaWwgcmVzIEFTWU5DIikpOwogICAgcmV0dXJuIFdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SZXNvdXJjZUNCICovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgV0xBTlRMX0lzVHhYbWl0UGVuZGluZwoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IHRoZSBXREEgd2hlbiBpdCB3YW50cyB0byBrbm93IHdoZXRoZXIgV0RBX0RTX1RYX1NUQVJUX1hNSVQgbXNnCiAgICBpcyBwZW5kaW5nIGluIFRMIG1zZyBxdWV1ZSAKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggV0RBIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFdEQSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICAwOiAgIE5vIFdEQV9EU19UWF9TVEFSVF9YTUlUIG1zZyBwZW5kaW5nIAogICAgMTogICBNc2cgV0RBX0RTX1RYX1NUQVJUX1hNSVQgYWxyZWFkeSBwZW5kaW5nIGluIFRMIG1zZyBxdWV1ZSAKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdl9CT09MX3QKV0xBTlRMX0lzVHhYbWl0UGVuZGluZwooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4CikKewoKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBpbiBXTEFOVExfSXNUeFhtaXRQZW5kaW5nICIpKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIHJldHVybiBwVExDYi0+aXNUeFRyYW5taXRNc2dQZW5kaW5nOwoKfS8qV0xBTlRMX0lzVHhYbWl0UGVuZGluZyAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgV0xBTlRMX1NldFR4WG1pdFBlbmRpbmcKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSB0aGUgV0RBIHdoZW4gaXQgd2FudHMgdG8gaW5kaWNhdGUgdGhhdCBXREFfRFNfVFhfU1RBUlRfWE1JVCBtc2cKICAgIGlzIHBlbmRpbmcgaW4gVEwgbXNnIHF1ZXVlIAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBXREEgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgV0RBJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFICAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdl9WT0lEX3QKV0xBTlRMX1NldFR4WG1pdFBlbmRpbmcKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eAopCnsKCiAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggaW4gV0xBTlRMX1NldFR4WG1pdFBlbmRpbmciKSk7CiAgICByZXR1cm47CiAgfQoKICBwVExDYi0+aXNUeFRyYW5taXRNc2dQZW5kaW5nID0gMTsKICByZXR1cm47Cgp9LypXTEFOVExfU2V0VHhYbWl0UGVuZGluZyAgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgIFdMQU5UTF9DbGVhclR4WG1pdFBlbmRpbmcKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSB0aGUgV0RBIHdoZW4gaXQgd2FudHMgdG8gaW5kaWNhdGUgdGhhdCBubyBXREFfRFNfVFhfU1RBUlRfWE1JVCBtc2cKICAgIGlzIHBlbmRpbmcgaW4gVEwgbXNnIHF1ZXVlIAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBXREEgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgV0RBJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFICAgICBOb25lCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgp2X1ZPSURfdApXTEFOVExfQ2xlYXJUeFhtaXRQZW5kaW5nCigKICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgKKQp7CgogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IGluIFdMQU5UTF9DbGVhclR4WG1pdFBlbmRpbmcgIikpOwogICAgcmV0dXJuOwogIH0KCiAgcFRMQ2ItPmlzVHhUcmFubWl0TXNnUGVuZGluZyA9IDA7CiAgcmV0dXJuOwp9LypXTEFOVExfQ2xlYXJUeFhtaXRQZW5kaW5nICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICBXTEFOVExfVHhUaHJlYWREZWJ1Z0hhbmRsZXIKCiAgREVTQ1JJUFRJT04KICAgIFByaW50aW5nIFRMIFNuYXBzaG90IGR1bXAsIHByb2Nlc3NlZCB1bmRlciBUeFRocmVhZCBjb250ZXh0LCBjdXJyZW50bHkKICAgIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgZ2xvYmFsIFRsQ2Igc3RydXR1cmUuIER1bXBzIGluZm9ybWF0aW9uIHJlbGF0ZWQKICAgIHRvIHBlciBhY3RpdmUgU1RBIGNvbm5lY3Rpb24gY3VycmVudGx5IGluIHVzZSBieSBUTC4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgV0RBJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFICAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdl9WT0lEX3QKV0xBTlRMX1R4VGhyZWFkRGVidWdIYW5kbGVyCigKIHZfUFZPSURfdCAqcFZvc0NvbnRleHQKKQp7CiAgIFdMQU5UTF9DYlR5cGUqIHBUTENiID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogICBpbnQgaSA9IDA7CiAgIHZfVThfdCB1Rmxvd01hc2s7IC8vIFRYIEZsb3dNYXNrIGZyb20gV0RBCgogICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgIldMQU4gVEw6ICVzIEVudGVyICIsIF9fZnVuY19fKSk7CgogICBwVExDYiA9IFZPU19HRVRfVExfQ0IocFZvc0NvbnRleHQpOwoKICAgaWYgKCBOVUxMID09IHBWb3NDb250ZXh0IHx8IE5VTEwgPT0gcFRMQ2IgKQogICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICJHbG9iYWwgVm9TIENvbnRleHQgb3IgVEwgQ29udGV4dCBhcmUgTlVMTCIpKTsKICAgICAgICByZXR1cm47CiAgIH0KCiAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gV0RBX0RTX0dldFR4Rmxvd01hc2socFZvc0NvbnRleHQsICZ1Rmxvd01hc2spKQogICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldEQSB1VHhGbG93TWFzazogMHgleCIsIHVGbG93TWFzaykpOwogICB9CgogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKipUTCBEVU1QIElORk9STUFUSU9OKioqKioqKioqKioqKioiKSk7CgogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJ1RGVsYXllZFRyaWdnZXJGcm1JbnQ6JWRcdHVNaW5GcmFtZXNQcm9jVGhyZXM6JWQiLAogICAgICAgICAgcFRMQ2ItPnRsQ29uZmlnSW5mby51RGVsYXllZFRyaWdnZXJGcm1JbnQsCiAgICAgICAgICBwVExDYi0+dGxDb25maWdJbmZvLnVNaW5GcmFtZXNQcm9jVGhyZXMpKTsKCiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIk1hbmFnZW1lbnQgRnJhbWUgQ2xpZW50IGV4aXN0czogJWQiLAogICAgICAgICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cykpOwogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJ1c1BlbmRpbmdUeENvbXBsZXRlQ291bnQ6ICVkXHR1Y1R4U3VzcGVuZGVkOiAlZCIsCiAgICAgICAgICBwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50LAogICAgICAgICAgcFRMQ2ItPnVjVHhTdXNwZW5kZWQpKTsKCiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgInVSZXNDb3VudDogJWQiLCBwVExDYi0+dVJlc0NvdW50KSk7CgogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJ1Y1JlZ2lzdGVyZWRTdGFJZDogJWRcdHVjQ3VycmVudFNUQTogJWQiLAogICAgICAgICAgcFRMQ2ItPnVjUmVnaXN0ZXJlZFN0YUlkLCBwVExDYi0+dWNDdXJyZW50U1RBKSk7CgogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJVcmdlbnRGcmFtZVByb2Nlc3Npbmc6ICVzXHR1RnJhbWVzUHJvY1RocmVzOiAlZCIsCiAgICAgICAgICAocFRMQ2ItPmJVcmdlbnQ/IlRydWUiOiJGYWxzZSIpLCBwVExDYi0+dUZyYW1lc1Byb2NUaHJlcykpOwoKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiaXNUeFRyYW5taXRNc2dQZW5kaW5nOiAlZFx0IGlzQk1QUzogJXMiLAogICAgICAgICAgcFRMQ2ItPmlzVHhUcmFubWl0TXNnUGVuZGluZywgcFRMQ2ItPmlzQk1QUz8iVHJ1ZSI6IkZhbHNlIikpOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIlRETFMgUGVlciBDb3VudDogJWQiLCBwVExDYi0+dWNUZGxzUGVlckNvdW50KSk7CiNlbmRpZgoKICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICIrKysrKysrKysrKysrKysrKysrK1JlZ2lzdGVyZCBDbGllbnQgSW5mb3JtYXRpb24rKysrKysrKysrIikpOwoKICAgZm9yICggaSA9MDsgaTxXTEFOX01BWF9TVEFfQ09VTlQ7IGkrKyApCiAgIHsKICAgICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV07CiAgICAgICAgaWYoIE5VTEwgPT0gcENsaWVudFNUQSB8fCAwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzKQogICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1NUQSBJbmRleDogJWQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIsaSkpOwogICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICJXTEFOX1NUQURlc2NUeXBlOiIpKTsKICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICJTVEFJZDogJWRcdCBTVEEgTUFDIEFkZHJlc3M6ICVwTSIsIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU1RBSWQsCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MuYnl0ZXMpKTsKICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICJTVEEgVHlwZTogJWRcdFByb3RlY3RlZEZyYW1lOiAlZCIsCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUsIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUHJvdGVjdGVkRnJhbWUpKTsKICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiUW9TOiAlZFx0UnhGcmFtZVRyYW5zOiAlZFx0VHhGcmFtZVRyYW5zOiAlZCIsCiAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCwgcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uLAogICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24pKTsKICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICJ1Y1VjYXN0U2lnOiAlZFx0dWNCY2FzdFNpZzogJWQiLCBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcpKTsKCiAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAiQ2xpZW50SW5kZXg6ICVkXHQgRXhpc3RzOiAlZCIsIGksIHBDbGllbnRTVEEtPnVjRXhpc3RzKSk7CiAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAiVEwgU3RhdGU6ICVkXHQgVEwgUHJpb3JpdHk6ICVkIiwgcENsaWVudFNUQS0+dGxTdGF0ZSwKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT50bFByaSkpOwogICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgInVjVHhTdXNwZW5kZWQ6ICVkXHR1Y1BrdFBlbmRpbmc6ICVkIiwgcENsaWVudFNUQS0+dWNUeFN1c3BlbmRlZCwKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51Y1BrdFBlbmRpbmcpKTsKICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICJ1Y0VBUE9MUGt0UGVuZGluZzogJWRcdHVjTm9Nb3JlRGF0YTogJWQiLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVjRWFwb2xQa3RQZW5kaW5nLCBwQ2xpZW50U1RBLT51Y05vTW9yZURhdGEpKTsKICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiZW5hYmxlQ2FjaGluZzogJWRcdCBmY1N0YVR4RGlzYWJsZWQ6ICVkIiwgcENsaWVudFNUQS0+ZW5hYmxlQ2FjaGluZywKICAgICAgICAgICAgICAgcENsaWVudFNUQS0+ZmNTdGFUeERpc2FibGVkKSk7CiAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgInVjQ3VycmVudEFDOiAlZFx0dWNTZXJ2aWNlZEFDOiAlZCIsIHBDbGllbnRTVEEtPnVjQ3VycmVudEFDLAogICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51Y1NlcnZpY2VkQUMpKTsKICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICJUSUQ6ICVkXHRhdXRUeENvdW50WzBdOiAlZFx0YXVSeENvdW50WzBdOiAlZCIsMCwgcENsaWVudFNUQS0+YXVUeENvdW50WzBdLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPmF1UnhDb3VudFswXSkpOwogICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgImF1Y0FjTWFza1swXTogJWRcdGF1Y0FjTWFza1sxXTogJWRcdGF1Y0FjTWFza1syXTogJWRcdGF1Y0FjTWFza1szXTogJWRcdCIsCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+YXVjQUNNYXNrWzBdLCBwQ2xpZW50U1RBLT5hdWNBQ01hc2tbMV0sCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+YXVjQUNNYXNrWzJdLCBwQ2xpZW50U1RBLT5hdWNBQ01hc2tbM10pKTsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKCiAgICAgICAgICAgICAgICJ1Y0N1cnJlbnRXZWlnaHQ6ICVkIiwgcENsaWVudFNUQS0+dWNDdXJyZW50V2VpZ2h0KSk7CgogICAgICAgIGlmKCBXTEFOX1NUQV9TT0ZUQVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpCiAgICAgICAgewogICAgICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAgICAiVHJhZmZpY1N0YXRpc3RpY3MgZm9yIFNPRlRBUCBTdGF0aW9uOiIpKTsKICAgICAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgICAgIlJVRj0lZFx0Uk1GPSVkXHRSQkY9JWQiLCBwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljcy5yeFVDRmNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljcy5yeE1DRmNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljcy5yeEJDRmNudCkpOwogICAgICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAgICAiUlVCPSVkXHRSTUI9JWRcdFJCQj0lZCIsIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnJ4VUNCY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnJ4TUNCY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnJ4QkNCY250KSk7CiAgICAgICAgICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAgICJUVUY9JWRcdFRNRj0lZFx0VEJGPSVkIiwgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0ZjbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhNQ0ZjbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhCQ0ZjbnQpKTsKICAgICAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgICAgIlRVQj0lZFx0VE1CPSVkXHRUQkI9JWQiLCBwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljcy50eFVDQmNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljcy50eE1DQmNudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljcy50eEJDQmNudCkpOwogICAgICAgIH0KCiAgICB9CiAgIHJldHVybjsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgV0xBTlRMX0ZhdGFsRXJyb3JIYW5kbGVyCgogIERFU0NSSVBUSU9OCiAgICBIYW5kbGUgRmF0YWwgZXJyb3JzIGRldGVjdGVkIG9uIHRoZSBUWCBwYXRoLgogICAgQ3VycmVudGx5IGlzc3VlcyBTU1IgdG8gcmVjb3ZlciBmcm9tIHRoZSBlcnJvci4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgV0RBJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFICAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2X1ZPSURfdApXTEFOVExfRmF0YWxFcnJvckhhbmRsZXIKKAogdl9QVk9JRF90ICpwVm9zQ29udGV4dAopCnsKCiAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAiV0xBTiBUTDogJXMgRW50ZXIgIiwgX19mdW5jX18pKTsKCiAgIGlmICggTlVMTCA9PSBwVm9zQ29udGV4dCApCiAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBHbG9iYWwgVm9TIENvbnRleHQgb3IgVEwgQ29udGV4dCBhcmUgTlVMTCIsCiAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuOwogICB9CgogICAvKgogICAgKiBJc3N1ZSBTU1IuIHZvc193bGFuUmVzdGFydCBoYXMgdGlnaHQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0CiAgICAqIHdlIGRvIG5vdCBzZW5kIGFuIEZJUSBpZiBwcmV2aW91cyBGSVEgaXMgbm90IHByb2Nlc3NlZAogICAgKi8KICAgdm9zX3dsYW5SZXN0YXJ0KFZPU19SRUFTT05fVU5TUEVDSUZJRUQpOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICBXTEFOVExfVExEZWJ1Z01lc3NhZ2UKCiAgREVTQ1JJUFRJT04KICAgIFBvc3QgYSBUTCBTbmFwc2hvdCByZXF1ZXN0LCBwb3N0cyBtZXNzYWdlIGluIFR4VGhyZWFkLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGdldHMgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIGRpc3BsYXlTbmFwc2hvdCBCb29sZWFuIHNob3dpbmcgd2hldGhlciB0byBkdW1wIHRoZSBzbmFwc2hvdCBvciBub3QuCgogIFJFVFVSTiBWQUxVRSAgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnZfVk9JRF90CldMQU5UTF9UTERlYnVnTWVzc2FnZQooCiB2X1UzMl90IGRlYnVnRmxhZ3MKKQp7CiAgIHZvc19tc2dfdCB2b3NNc2c7CiAgIFZPU19TVEFUVVMgc3RhdHVzOwoKICAgaWYoZGVidWdGbGFncyAmIFdMQU5UTF9ERUJVR19UWF9TTkFQU0hPVCkKICAgewogICAgICAgIHZvc01zZy5yZXNlcnZlZCA9IDA7CiAgICAgICAgdm9zTXNnLmJvZHlwdHIgID0gTlVMTDsKICAgICAgICB2b3NNc2cudHlwZSAgICAgPSBXTEFOVExfVFhfU05BUFNIT1Q7CgogICAgICAgIHN0YXR1cyA9IHZvc190eF9tcV9zZXJpYWxpemUoIFZPU19NT0RVTEVfSURfVEwsICZ2b3NNc2cpOwogICAgICAgIGlmKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIlRYIE1zZyBQb3N0aW5nIEZhaWxlZCB3aXRoIHN0YXR1czogJWQiLHN0YXR1cykpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICB9CiAgIGlmIChkZWJ1Z0ZsYWdzICYgV0xBTlRMX0RFQlVHX0ZXX0NMRUFOVVApCiAgIHsKICAgICAgICB2b3NNc2cucmVzZXJ2ZWQgPSAwOwogICAgICAgIHZvc01zZy5ib2R5cHRyICA9IE5VTEw7CiAgICAgICAgdm9zTXNnLnR5cGUgICAgID0gV0xBTlRMX1RYX0ZXX0RFQlVHOwoKICAgICAgICBzdGF0dXMgPSB2b3NfdHhfbXFfc2VyaWFsaXplKCBWT1NfTU9EVUxFX0lEX1RMLCAmdm9zTXNnKTsKICAgICAgICBpZihzdGF0dXMgIT0gVk9TX1NUQVRVU19TVUNDRVNTKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJUWCBNc2cgUG9zdGluZyBGYWlsZWQgd2l0aCBzdGF0dXM6ICVkIixzdGF0dXMpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgfQogICBpZihkZWJ1Z0ZsYWdzICYgV0xBTlRMX0RFQlVHX0tJQ0tEWEUpCiAgIHsKICAgICAgICB2b3NNc2cucmVzZXJ2ZWQgPSAwOwogICAgICAgIHZvc01zZy5ib2R5cHRyICA9IE5VTEw7CiAgICAgICAgdm9zTXNnLnR5cGUgICAgID0gV0xBTlRMX1RYX0tJQ0tEWEU7CgogICAgICAgIHN0YXR1cyA9IHZvc190eF9tcV9zZXJpYWxpemUoIFZPU19NT0RVTEVfSURfVEwsICZ2b3NNc2cpOwogICAgICAgIGlmKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIlRYIE1zZyBQb3N0aW5nIEZhaWxlZCB3aXRoIHN0YXR1czogJWQiLHN0YXR1cykpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICB9CiAgIHJldHVybjsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgV0xBTlRMX0ZhdGFsRXJyb3IKCiAgREVTQ1JJUFRJT04KICAgIEZhdGFsIGVycm9yIHJlcG9ydGVkIGluIFRYIHBhdGgsIHBvc3QgYW4gZXZlbnQgdG8gVFggVGhyZWFkIGZvciBmdXJ0aGVyCiAgICBoYW5kbGluZwoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGdldHMgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgVk9JRAoKICBSRVRVUk4gVkFMVUUgICAgICBOb25lCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgp2X1ZPSURfdApXTEFOVExfRmF0YWxFcnJvcgooCiB2X1ZPSURfdAopCnsKICAgdm9zX21zZ190IHZvc01zZzsKICAgVk9TX1NUQVRVUyBzdGF0dXM7CgogICB2b3NNc2cucmVzZXJ2ZWQgPSAwOwogICB2b3NNc2cuYm9keXB0ciAgPSBOVUxMOwogICB2b3NNc2cudHlwZSAgICAgPSBXTEFOVExfVFhfRkFUQUxfRVJST1I7CgogICBzdGF0dXMgPSB2b3NfdHhfbXFfc2VyaWFsaXplKCBWT1NfTU9EVUxFX0lEX1RMLCAmdm9zTXNnKTsKICAgaWYoc3RhdHVzICE9IFZPU19TVEFUVVNfU1VDQ0VTUykKICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICIlczogVFggTXNnIFBvc3RpbmcgRmFpbGVkIHdpdGggc3RhdHVzOiAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLHN0YXR1cykpOwogICB9CiAgIHJldHVybjsKfQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVEwgU1RBVEUgTUFDSElORQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU1RBVHhDb25uCgogIERFU0NSSVBUSU9OCiAgICBUcmFuc21pdCBpbiBjb25uZWN0ZWQgc3RhdGUgLSBvbmx5IEVBUE9MIGFuZCBXQUkgcGFja2V0cyBhbGxvd2VkCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFNUQSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgdHggdm9zIGJ1ZmZlcgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICAgT3RoZXIgcmV0dXJuIHZhbHVlcyBhcmUgcG9zc2libGUgY29taW5nIGZyb20gdGhlIGNhbGxlZCBmdW5jdGlvbnMuCiAgIFBsZWFzZSBjaGVjayBBUEkgZm9yIGFkZGl0aW9uYWwgaW5mby4KCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBVHhDb25uCigKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZiwKICB2X0JPT0xfdCAgICAgIGJGb3J3YXJkSUFQUHdpdGhMTEMKKQp7CiAgIHZfVTE2X3QgICAgICAgICAgICAgIHVzUGt0TGVuOwogICBWT1NfU1RBVFVTICAgICAgICAgICB2b3NTdGF0dXM7CiAgIHZfTUFDQUREUl90ICAgICAgICAgIHZEZXN0TWFjQWRkcjsKICAgdm9zX3BrdF90KiAgICAgICAgICAgdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICBXTEFOVExfQ2JUeXBlKiAgICAgICBwVExDYiAgICAgICA9IE5VTEw7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAgV0xBTlRMX01ldGFJbmZvVHlwZSAgdGxNZXRhSW5mbzsKICAgdl9VOF90ICAgICAgICAgICAgICAgdWNUeXBlU3VidHlwZSA9IDA7CiAgIHZfVThfdCAgICAgICAgICAgICAgIHVjVGlkOwogICB2X1U4X3QgICAgICAgICAgICAgICBleHRyYUhlYWRTcGFjZSA9IDA7CiAgIHZfVThfdCAgICAgICAgICAgICAgIHVjV0RTRW5hYmxlZCA9IDA7CiAgIHZfVThfdCAgICAgICAgICAgICAgIHVjQUMsIHVjQUNNYXNrLCBpOyAKICAgdl9VMzJfdCAgICAgICAgICAgICAgdHhGbGFnID0gSEFMX1RYX05PX0VOQ1JZUFRJT05fTUFTSzsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU1RBVHhDb25uIik7CiAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIERpc2FibGUgQUMgdGVtcG9yYXJ5IC0gaWYgc3VjY2Vzc2Z1bGwgcmV0cmlldmUgcmUtZW5hYmxlCiAgICAgIFRoZSBvcmRlciBpcyBqdXN0aWZpZWQgYmVjYXVzZSBvZiB0aGUgcG9zc2libGUgc2NlbmFyaW8KICAgICAgIC0gVEwgdHJ5ZXMgdG8gZmV0Y2ggcGFja2V0IGZvciBBQyBhbmQgaXQgcmV0dXJucyBOVUxMCiAgICAgICAtIFRMIGFuYWx5emVzIHRoZSBkYXRhIGl0IGhhcyByZWNlaXZlZCB0byBzZWUgaWYgdGhlcmUgYXJlCiAgICAgICBhbnkgbW9yZSBwa3RzIGF2YWlsYWJsZSBmb3IgQUMgLT4gaWYgbm90IFRMIHdpbGwgZGlzYWJsZSBBQwogICAgICAgLSBob3dldmVyIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2hpbGUgYW5hbHl6aW5nIHJlc3VsdHMgVEwgZ290CiAgICAgICBwcmVlbXB0ZWQgYnkgYSBwZW5kaW5nIGluZGljYXRpb24gd2hlcmUgdGhlIG1hc2sgd2FzIGFnYWluIHNldAogICAgICAgVEwgd2lsbCBub3QgY2hlY2sgYWdhaW4gYW5kIGFzIGEgcmVzdWx0IHdoZW4gaXQgcmVzdW1lcwogICAgICAgZXhlY3V0aW9uIGl0IHdpbGwgZGlzYWJsZSBBQwogICAgICAgVG8gcHJldmVudCB0aGlzIHRoZSBBQyB3aWxsIGJlIGRpc2FibGVkIGhlcmUgYW5kIGlmIHJldHJpZXZlCiAgICAgICBpcyBzdWNjZXNzZnVsbCBpdCB3aWxsIGJlIHJlLWVuYWJsZWQKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogIC8vTFRJOnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLgogIC8vTFRJOiAgIGF1Y0FDTWFza1twVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0N1cnJlbnRBQ10gPSAwOyAKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZldGNoIHBhY2tldCBmcm9tIEhERAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBpZiAoKFdMQU5fU1RBX1NPRlRBUCAhPSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkgJiYKICAgICAgISh2b3NfY29uY3VycmVudF9vcGVuX3Nlc3Npb25zX3J1bm5pbmcoKSkgJiYKICAgICAgIXBUTENiLT51Y1RkbHNQZWVyQ291bnQpCiAgewojZWxzZQogIGlmICgoV0xBTl9TVEFfU09GVEFQICE9IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlKSAmJgogICAgICAhKHZvc19jb25jdXJyZW50X29wZW5fc2Vzc2lvbnNfcnVubmluZygpKSkKICB7CiNlbmRpZgogICAgICB1Y0FDID0gcENsaWVudFNUQS0+dWNDdXJyZW50QUM7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBEaXNhYmxlIEFDIHRlbXBvcmFyeSAtIGlmIHN1Y2Nlc3NmdWxsIHJldHJpZXZlIHJlLWVuYWJsZQogICAgICBUaGUgb3JkZXIgaXMganVzdGlmaWVkIGJlY2F1c2Ugb2YgdGhlIHBvc3NpYmxlIHNjZW5hcmlvCiAgICAgICAtIFRMIHRyeWVzIHRvIGZldGNoIHBhY2tldCBmb3IgQUMgYW5kIGl0IHJldHVybnMgTlVMTAogICAgICAgLSBUTCBhbmFseXplcyB0aGUgZGF0YSBpdCBoYXMgcmVjZWl2ZWQgdG8gc2VlIGlmIHRoZXJlIGFyZQogICAgICAgYW55IG1vcmUgcGt0cyBhdmFpbGFibGUgZm9yIEFDIC0+IGlmIG5vdCBUTCB3aWxsIGRpc2FibGUgQUMKICAgICAgIC0gaG93ZXZlciBpdCBpcyBwb3NzaWJsZSB0aGF0IHdoaWxlIGFuYWx5emluZyByZXN1bHRzIFRMIGdvdAogICAgICAgcHJlZW1wdGVkIGJ5IGEgcGVuZGluZyBpbmRpY2F0aW9uIHdoZXJlIHRoZSBtYXNrIHdhcyBhZ2FpbiBzZXQKICAgICAgIFRMIHdpbGwgbm90IGNoZWNrIGFnYWluIGFuZCBhcyBhIHJlc3VsdCB3aGVuIGl0IHJlc3VtZXMKICAgICAgIGV4ZWN1dGlvbiBpdCB3aWxsIGRpc2FibGUgQUMKICAgICAgIFRvIHByZXZlbnQgdGhpcyB0aGUgQUMgd2lsbCBiZSBkaXNhYmxlZCBoZXJlIGFuZCBpZiByZXRyaWV2ZQogICAgICAgaXMgc3VjY2Vzc2Z1bGwgaXQgd2lsbCBiZSByZS1lbmFibGVkCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIHBDbGllbnRTVEEtPmF1Y0FDTWFza1t1Y0FDXSA9IDA7CiAgfQogIGVsc2UKICB7CiAgICAgIC8vc29mdGFwIGNhc2UKICAgICAgdWNBQyA9IHBUTENiLT51Q3VyU2VydmVkQUM7CiAgICAgIHBDbGllbnRTVEEtPmF1Y0FDTWFza1t1Y0FDXSA9IDA7CiAgfQoKICAgIC8qWW91IG1ha2UgYW4gaW5pdGlhbCBhc3N1bXB0aW9uIHRoYXQgSEREIGhhcyBubyBtb3JlIGRhdGEgYW5kIGlmIHRoZQogICAgICBhc3N1bXB0aW9uIHdhcyB3cm9uZyB5b3UgcmVzZXQgdGhlIGZsYWdzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlCiAgICAgVGhpcyB3aWxsIHByZXZlbnQgZnJvbSBleHBvc2luZyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gY2hlY2tpbmcgd2l0aCBIREQKICAgICBmb3IgcGFja2V0cyBhbmQgc2V0dGluZyB0aGUgZmxhZ3MgdG8gZmFsc2UqLwogIC8vTFRJOiB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjUGt0UGVuZGluZywgMCk7CiAgLy9MVEk6IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTm9Nb3JlRGF0YSA9IDE7CiAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1BrdFBlbmRpbmcsIDApOwogIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLKCBwQ2xpZW50U1RBLCB1Y0FDTWFzaywgaSk7CiAgICAvKllvdSBtYWtlIGFuIGluaXRpYWwgYXNzdW1wdGlvbiB0aGF0IEhERCBoYXMgbm8gbW9yZSBkYXRhIGFuZCBpZiB0aGUKICAgICAgICAgICBhc3N1bXB0aW9uIHdhcyB3cm9uZyB5b3UgcmVzZXQgdGhlIGZsYWdzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlCiAgICAgICAgICAgVGhpcyB3aWxsIHByZXZlbnQgZnJvbSBleHBvc2luZyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gY2hlY2tpbmcgd2l0aCBIREQKICAgICAgICAgICBmb3IgcGFja2V0cyBhbmQgc2V0dGluZyB0aGUgZmxhZ3MgdG8gZmFsc2UqLwogIGlmICggMCA9PSB1Y0FDTWFzayApCiAgewogICAgICBwQ2xpZW50U1RBLT51Y05vTW9yZURhdGEgPSAxOwogIH0KICBlbHNlCiAgewogICAgICB2b3NfYXRvbWljX3NldF9VOCggJnBDbGllbnRTVEEtPnVjUGt0UGVuZGluZywgMSk7CiAgfQoKCiAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgIldMQU4gVEw6IFdMQU5UTF9TVEFUeENvbm4gZmV0Y2hpbmcgcGFja2V0IGZyb20gSEREIGZvciBBQzogJWQgQUMgTWFzazogJWQgUGt0IFBlbmRpbmc6ICVkIiwgCiAgICAgICAgICAgICB1Y0FDLCB1Y0FDTWFzaywgcENsaWVudFNUQS0+dWNQa3RQZW5kaW5nKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZldGNoIHR4IHBhY2tldCBmcm9tIEhERAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICB2b3NTdGF0dXMgPSBwQ2xpZW50U1RBLT5wZm5TVEFGZXRjaFBrdCggcHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjQUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9zRGF0YUJ1ZmYsICZ0bE1ldGFJbmZvICk7CgogIGlmICgoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSB8fCAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYgKSkKICB7CiAgICBUTExPRzEoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgIldMQU4gVEw6Tm8gbW9yZSBkYXRhIGF0IEhERCBzdGF0dXMgJWQiLCB2b3NTdGF0dXMpKTsKICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlc2V0IEFDIGZvciB0aGUgc2VydmljZWQgc3RhdGlvbiB0byB0aGUgaGlnaGVzdCBwcmlvcml0eSBBQwogICAgLT4gZHVlIHRvIG5vIG1vcmUgZGF0YSBhdCB0aGUgc3RhdGlvbgogICAgRXZlbiBpZiB0aGlzIEFDIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHN0YXRpb24sIGNvcnJlY3Rpb24gd2lsbCBiZQogICAgbWFkZSBpbiB0aGUgbWFpbiBUTCBsb29wCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBwQ2xpZW50U1RBLT51Y0N1cnJlbnRBQyAgICAgPSBXTEFOVExfQUNfSElHSF9QUklPOwogICAgcENsaWVudFNUQS0+dWNDdXJyZW50V2VpZ2h0ID0gMDsKCiAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICJXTEFOIFRMOiBXTEFOVExfU1RBVHhDb25uIG5vIG1vcmUgcGFja2V0cyBpbiBIREQgZm9yIEFDOiAlZCBBQyBNYXNrOiAlZCIsIAogICAgICAgICAgICAgICB1Y0FDLCB1Y0FDTWFzayk7CgogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qVGhlcmUgYXJlIHN0aWxsIHBhY2tldHMgaW4gSEREIC0gc2V0IGJhY2sgdGhlIHBlbmRpbmcgcGFja2V0cyBhbmQgCiAgIHRoZSBubyBtb3JlIGRhdGEgYXNzdW1wdGlvbiovCiAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1BrdFBlbmRpbmcsIDEpOwogIHBDbGllbnRTVEEtPnVjTm9Nb3JlRGF0YSA9IDA7CiAgcENsaWVudFNUQS0+YXVjQUNNYXNrW3VjQUNdID0gMTsKCiNpZmRlZiBXTEFOX1BFUkYgCiAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX0JBTCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkwKTsKCiNlbmRpZiAvKldMQU5fUEVSRiovCgoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJZiB0aGUgcGFja2V0IGlzIG5laXRoZXIgYW4gRWFwb2wgcGFja2V0IG5vciBhIFdBSSBwYWNrZXQgdGhlbiBkcm9wIGl0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIGlmICggMCA9PSB0bE1ldGFJbmZvLnVjSXNFYXBvbCAmJiAwID09IHRsTWV0YUluZm8udWNJc1dhaSApCiAgIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgICJXTEFOIFRMOk9ubHkgRUFQT0wgb3IgV0FJIHBhY2tldHMgYWxsb3dlZCBiZWZvcmUgYXV0aGVudGljYXRpb24iKSk7CgogICAgIC8qIEZhaWwgdHggZm9yIHBhY2tldCAqLwogICAgIHBDbGllbnRTVEEtPnBmblNUQVR4Q29tcCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfU1RBVFVTX0VfQkFETVNHKTsKICAgICB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CiNlbHNlCiAgIGlmICggMCA9PSB0bE1ldGFJbmZvLnVjSXNFYXBvbCApCiAgewogICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpSZWNlaXZlZCBub24gRUFQT0wgcGFja2V0IGJlZm9yZSBhdXRoZW50aWNhdGlvbiIpKTsKCiAgICAvKiBGYWlsIHR4IGZvciBwYWNrZXQgKi8KICAgIHBDbGllbnRTVEEtPnBmblNUQVR4Q29tcCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfU1RBVFVTX0VfQkFETVNHKTsKICAgIHZvc0RhdGFCdWZmID0gTlVMTDsKICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgQ2hlY2sgVElECiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdWNUaWQgICAgID0gdGxNZXRhSW5mby51Y1RJRDsKCiAgLypNYWtlIHN1cmUgVElEIGlzIHZhbGlkKi8KICBpZiAoIFdMQU5UTF9USURfSU5WQUxJRCh1Y1RpZCkpIAogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRJRCBzZW50IGluIG1ldGEgaW5mbyAlZCAtIGRlZmF1bHRpbmcgdG8gMCAoQkUpIiwgCiAgICAgICAgICAgICB1Y1RpZCkpOwogICAgIHVjVGlkID0gMDsgCiAgfQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6QXR0YWNoaW5nIEJEIGhlYWRlciB0byBwa3Qgb24gV0xBTlRMX1NUQVR4Q29ubiIpKTsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUcmFuc2xhdGUgODAyLjMgZnJhbWUgdG8gODAyLjExIGlmIEZyYW1lIHRyYW5zbGF0aW9uIGlzIGVuYWJsZWQgb3IgaWYgCiAgICBmcmFtZSBpcyBhIFdBSSBmcmFtZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoICggMSA9PSB0bE1ldGFJbmZvLnVjSXNXYWkgKSB8fAogICAgICAgKCAwID09IHRsTWV0YUluZm8udWNEaXNhYmxlRnJtWHRsICkgKQojZWxzZQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUcmFuc2xhdGUgODAyLjMgZnJhbWUgdG8gODAyLjExIGlmIEZyYW1lIHRyYW5zbGF0aW9uIGlzIGVuYWJsZWQgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAoIDAgPT0gdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwgKSAmJgogICAgICAoIDAgIT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uKSApCiNlbmRpZiAvLyNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogIHsKICAgIHZvc1N0YXR1cyA9ICBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIoIHZvc0RhdGFCdWZmLCAmdm9zU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2IsICZ1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRsTWV0YUluZm8sICZ1Y1dEU0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0cmFIZWFkU3BhY2UpOwogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RXJyb3Igd2hlbiB0cmFuc2xhdGluZyBoZWFkZXIgV0xBTlRMX1NUQVR4Q29ubiIpKTsKCiAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CgogICAgdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwgPSAxOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDYWxsIEhBTCB0byBmaWxsIEJEIGhlYWRlcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y1R5cGVTdWJ0eXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9UWVBFIDw8IDQpOwoKICBpZiAoIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCApCiAgewogICAgdWNUeXBlU3VidHlwZSB8PSAoV0xBTlRMXzgwMjExX0RBVEFfUU9TX1NVQlRZUEUpOwogIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogIC8qIFRMIFN0YXRlIGRvZXMgbm90IHRyYW5zaXRpb24gdG8gQVVUSEVOVElDQVRFRCB0aWxsIEdUSyBpcyBpbnN0YWxsZWQsIFNvIGluCiAgICogY2FzZSBvZiBXUEEgd2hlcmUgR1RLIGhhbmRzaGFrZSBpcyBkb25lIGFmdGVyIHRoZSA0IHdheSBoYW5kc2hha2UsIHRoZQogICAqIHVuaWNhc3QgMi8yIEVBUE9MIHBhY2tldCBmcm9tIHRoZSBTVEEtPkFQIGhhcyB0byBiZSBlbmNyeXB0ZWQgZXZlbiBiZWZvcmUKICAgKiB0aGUgVEwgaXMgaW4gYXV0aGVudGljYXRlZCBzdGF0ZS4gU2luY2UgdGhlIFBUSyBoYXMgYmVlbiBpbnN0YWxsZWQKICAgKiBhbHJlYWR5IChhZnRlciB0aGUgNCB3YXkgaGFuZHNoYWtlKSB3ZSBtYWtlIHN1cmUgdGhhdCBhbGwgdHJhZmZpYwogICAqIGlzIGVuY3J5cHRlZCBoZW5jZWZvcnRoLihOb3RlOiBUTCBpcyBzdGlsbCBub3QgaW4gQVVUSEVOVElDQVRFRCBzdGF0ZSBzbwogICAqIHdlIHdpbGwgb25seSBhbGxvdyBFQVBPTCBkYXRhIG9yIFdBSSBpbiBjYXNlIG9mIFdBUEkpCiAgICovCiAgaWYgKHRsTWV0YUluZm8udWNJc0VhcG9sICYmIHBDbGllbnRTVEEtPnB0a0luc3RhbGxlZCkKICB7CiAgICB0eEZsYWcgPSAwOwogIH0KI2Vsc2UKICBpZiAocENsaWVudFNUQS0+cHRrSW5zdGFsbGVkKQogIHsKICAgIHR4RmxhZyA9IDA7CiAgfQojZW5kaWYKCiAgdm9zU3RhdHVzID0gKFZPU19TVEFUVVMpV0RBX0RTX0J1aWxkVHhQYWNrZXRJbmZvKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYgLCAmdkRlc3RNYWNBZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRsTWV0YUluZm8udWNEaXNhYmxlRnJtWHRsLCAmdXNQa3RMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNRb3NFbmFibGVkLCB1Y1dEU0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFIZWFkU3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdWNUeXBlU3VidHlwZSwgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1RpZCwgdHhGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRsTWV0YUluZm8udXNUaW1lU3RhbXAsIHRsTWV0YUluZm8udWNJc0VhcG9sIHx8IHRsTWV0YUluZm8udWNJc1dhaSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0bE1ldGFJbmZvLnVjSXNBcnAsIHRsTWV0YUluZm8udWNVUCwgdGxNZXRhSW5mby51Y1R4QmRUb2tlbik7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGZpbGwgQkQgJWQiLCB2b3NTdGF0dXMpKTsKICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFVwZGF0ZSB0eCBjb3VudGVyIGZvciBCQSBzZXNzaW9uIHF1ZXJ5IGZvciB0eCBzaWRlCiAgICAhMSAtIHNob3VsZCB0aGlzIGJlIGRvbmUgZm9yIEVBUE9MIGZyYW1lcz8KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwQ2xpZW50U1RBLT5hdVR4Q291bnRbdWNUaWRdKys7CgogIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgKHZfUFZPSURfdClwQ2xpZW50U1RBLT5wZm5TVEFUeENvbXAgKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhdmUgZGF0YSB0byBpbnB1dCBwb2ludGVyIGZvciBUTCBjb3JlCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAqcHZvc0RhdGFCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgLypzZWN1cml0eSBmcmFtZXMgY2Fubm90IGJlIGRlbGF5ZWQqLwogIHBUTENiLT5iVXJnZW50ICAgICAgPSBUUlVFOwoKICAvKiBUWCBTdGF0aXN0aWNzICovCiAgaWYgKCEodGxNZXRhSW5mby51Y0JjYXN0IHx8IHRsTWV0YUluZm8udWNNY2FzdCkpCiAgewogICAgLyogVGhpcyBpcyBUWCBVQyBmcmFtZSAqLwogICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0ZjbnQrKzsKICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4VUNCY250ICs9IHVzUGt0TGVuOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TVEFUeENvbm4gKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVR4QXV0aAoKICBERVNDUklQVElPTgogICAgVHJhbnNtaXQgaW4gYXV0aGVudGljYXRlZCBzdGF0ZSAtIGFsbCBkYXRhIGFsbG93ZWQKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgU1RBIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGJlaW5nIHByb2Nlc3NlZAogICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSB0eCB2b3MgYnVmZmVyCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICBPdGhlciByZXR1cm4gdmFsdWVzIGFyZSBwb3NzaWJsZSBjb21pbmcgZnJvbSB0aGUgY2FsbGVkIGZ1bmN0aW9ucy4KICAgUGxlYXNlIGNoZWNrIEFQSSBmb3IgYWRkaXRpb25hbCBpbmZvLgoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TVEFUeEF1dGgKKAogIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICB1Y1NUQUlkLAogIHZvc19wa3RfdCoqICAgcHZvc0RhdGFCdWZmLAogIHZfQk9PTF90ICAgICAgYkZvcndhcmRJQVBQd2l0aExMQwopCnsKICAgdl9VMTZfdCAgICAgICAgICAgICAgIHVzUGt0TGVuOwogICBWT1NfU1RBVFVTICAgICAgICAgICAgdm9zU3RhdHVzOwogICB2X01BQ0FERFJfdCAgICAgICAgICAgdkRlc3RNYWNBZGRyOwogICB2b3NfcGt0X3QqICAgICAgICAgICAgdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICBXTEFOVExfQ2JUeXBlKiAgICAgICAgcFRMQ2IgICAgICAgPSBOVUxMOwogICBXTEFOVExfTWV0YUluZm9UeXBlICAgdGxNZXRhSW5mbzsKICAgdl9VOF90ICAgICAgICAgICAgICAgIHVjVHlwZVN1YnR5cGUgPSAwOwogICBXTEFOVExfQUNFbnVtVHlwZSAgICAgdWNBQzsKICAgV0xBTlRMX0FDRW51bVR5cGUgICAgIHVjTmV4dEFDOwogICB2X1U4X3QgICAgICAgICAgICAgICAgdWNUaWQ7CiAgIHZfVThfdCAgICAgICAgICAgICAgICB1Y1N3RnJtWHRsID0gMDsKICAgdl9VOF90ICAgICAgICAgICAgICAgIGV4dHJhSGVhZFNwYWNlID0gMDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUgKnBTdGFDbGllbnQgPSBOVUxMOwogICB2X1U4X3QgICAgICAgICAgICAgICAgdWNXRFNFbmFibGVkID0gMDsKICAgdl9VMzJfdCAgICAgICAgICAgICAgIHVjVHhGbGFnICAgPSAwOwogICB2X1U4X3QgICAgICAgICAgICAgICAgdWNBQ01hc2ssIGk7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgKCBOVUxMID09IHB2b3NEYXRhQnVmZiApKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgaW5wdXQgcGFyYW1zIG9uIFdMQU5UTF9TVEFUeEF1dGggVEwgJXBLIERCICVwSyIsCiAgICAgICAgICAgICBwVExDYiwgcHZvc0RhdGFCdWZmKSk7CiAgICBpZiAoTlVMTCAhPSBwdm9zRGF0YUJ1ZmYpCiAgICB7CiAgICAgICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICB9CiAgICBpZihOVUxMICE9IHBUTENiKQogICAgewogICAgICAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgICAgIH0KICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNOb01vcmVEYXRhID0gMTsKICAgIH0KICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBTdGFDbGllbnQgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBTdGFDbGllbnQgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIHZvc19tZW1femVybygmdGxNZXRhSW5mbywgc2l6ZW9mKHRsTWV0YUluZm8pKTsKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRmV0Y2ggcGFja2V0IGZyb20gSERECiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIGlmICgoV0xBTl9TVEFfU09GVEFQICE9IHBTdGFDbGllbnQtPndTVEFEZXNjLndTVEFUeXBlKSAmJgogICAgICAoIXZvc19jb25jdXJyZW50X29wZW5fc2Vzc2lvbnNfcnVubmluZygpKSAmJgogICAgICAhcFRMQ2ItPnVjVGRsc1BlZXJDb3VudCkKICB7CiNlbHNlCiAgaWYgKChXTEFOX1NUQV9TT0ZUQVAgIT0gcFN0YUNsaWVudC0+d1NUQURlc2Mud1NUQVR5cGUpICYmCiAgICAgICghdm9zX2NvbmN1cnJlbnRfb3Blbl9zZXNzaW9uc19ydW5uaW5nKCkpKQogIHsKI2VuZGlmCiAgdWNBQyA9IHBTdGFDbGllbnQtPnVjQ3VycmVudEFDOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgRGlzYWJsZSBBQyB0ZW1wb3JhcnkgLSBpZiBzdWNjZXNzZnVsbCByZXRyaWV2ZSByZS1lbmFibGUKICAgICAgVGhlIG9yZGVyIGlzIGp1c3RpZmllZCBiZWNhdXNlIG9mIHRoZSBwb3NzaWJsZSBzY2VuYXJpbwogICAgICAgLSBUTCB0cnllcyB0byBmZXRjaCBwYWNrZXQgZm9yIEFDIGFuZCBpdCByZXR1cm5zIE5VTEwKICAgICAgIC0gVEwgYW5hbHl6ZXMgdGhlIGRhdGEgaXQgaGFzIHJlY2VpdmVkIHRvIHNlZSBpZiB0aGVyZSBhcmUKICAgICAgIGFueSBtb3JlIHBrdHMgYXZhaWxhYmxlIGZvciBBQyAtPiBpZiBub3QgVEwgd2lsbCBkaXNhYmxlIEFDCiAgICAgICAtIGhvd2V2ZXIgaXQgaXMgcG9zc2libGUgdGhhdCB3aGlsZSBhbmFseXppbmcgcmVzdWx0cyBUTCBnb3QKICAgICAgIHByZWVtcHRlZCBieSBhIHBlbmRpbmcgaW5kaWNhdGlvbiB3aGVyZSB0aGUgbWFzayB3YXMgYWdhaW4gc2V0CiAgICAgICBUTCB3aWxsIG5vdCBjaGVjayBhZ2FpbiBhbmQgYXMgYSByZXN1bHQgd2hlbiBpdCByZXN1bWVzCiAgICAgICBleGVjdXRpb24gaXQgd2lsbCBkaXNhYmxlIEFDCiAgICAgICBUbyBwcmV2ZW50IHRoaXMgdGhlIEFDIHdpbGwgYmUgZGlzYWJsZWQgaGVyZSBhbmQgaWYgcmV0cmlldmUKICAgICAgIGlzIHN1Y2Nlc3NmdWxsIGl0IHdpbGwgYmUgcmUtZW5hYmxlZAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBTdGFDbGllbnQtPmF1Y0FDTWFza1twU3RhQ2xpZW50LT51Y0N1cnJlbnRBQ10gPSAwOyAKCiAgLy8gZG9uJ3QgcmVzZXQgaXQsIGFzIG90aGVyIEFDIHF1ZXVlcyBpbiBIREQgbWF5IGhhdmUgcGFja2V0cwogIC8vdm9zX2F0b21pY19zZXRfVTgoICZwU3RhQ2xpZW50LT51Y1BrdFBlbmRpbmcsIDApOwogIH0KICBlbHNlCiAgewogICAgLy9zb2Z0YXAgY2FzZQogICAgdWNBQyA9IHBUTENiLT51Q3VyU2VydmVkQUM7CiAgICBwU3RhQ2xpZW50LT5hdWNBQ01hc2tbdWNBQ10gPSAwOyAKCiAgICAvL3Zvc19hdG9taWNfc2V0X1U4KCAmcFN0YUNsaWVudC0+dWNQa3RQZW5kaW5nLCAwKTsKICB9CgogIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLKCBwU3RhQ2xpZW50LCB1Y0FDTWFzaywgaSk7IAogICAgLypZb3UgbWFrZSBhbiBpbml0aWFsIGFzc3VtcHRpb24gdGhhdCBIREQgaGFzIG5vIG1vcmUgZGF0YSBhbmQgaWYgdGhlIAogICAgICBhc3N1bXB0aW9uIHdhcyB3cm9uZyB5b3UgcmVzZXQgdGhlIGZsYWdzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlCiAgICAgVGhpcyB3aWxsIHByZXZlbnQgZnJvbSBleHBvc2luZyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gY2hlY2tpbmcgd2l0aCBIREQgCiAgICAgZm9yIHBhY2tldHMgYW5kIHNldHRpbmcgdGhlIGZsYWdzIHRvIGZhbHNlKi8KICBpZiAoIDAgPT0gdWNBQ01hc2sgKQogIHsKICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFN0YUNsaWVudC0+dWNQa3RQZW5kaW5nLCAwKTsKICAgIHBTdGFDbGllbnQtPnVjTm9Nb3JlRGF0YSA9IDE7CiAgfQoKICB2b3NTdGF0dXMgPSBwU3RhQ2xpZW50LT5wZm5TVEFGZXRjaFBrdCggcHZvc0dDdHgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y0FDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvc0RhdGFCdWZmLCAmdGxNZXRhSW5mbyApOwoKCiAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIHx8ICggTlVMTCA9PSB2b3NEYXRhQnVmZiApKQogIHsKCiAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBmZXRjaCBwa3QgZnJvbSBIREQgUUlkOiVkIHN0YXR1czolZCIsCiAgICAgICAgICAgICAgIHVjQUMsIHZvc1N0YXR1cyk7CiAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgUmVzZXQgQUMgZm9yIHRoZSBzZXJ2aWNlZCBzdGF0aW9uIHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5IEFDCiAgICAgIC0+IGR1ZSB0byBubyBtb3JlIGRhdGEgYXQgdGhlIHN0YXRpb24KICAgICAgRXZlbiBpZiB0aGlzIEFDIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHN0YXRpb24sIGNvcnJlY3Rpb24gd2lsbCBiZQogICAgICBtYWRlIGluIHRoZSBtYWluIFRMIGxvb3AKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudEFDICAgICA9IFdMQU5UTF9BQ19ISUdIX1BSSU87CiAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQgPSAwOwoKICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICBXTEFOVExfU3RhdEhhbmRsZVRYRnJhbWUocHZvc0dDdHgsIHVjU1RBSWQsIHZvc0RhdGFCdWZmLCBOVUxMLCAmdGxNZXRhSW5mbyk7CgogIC8qVGhlcmUgYXJlIHN0aWxsIHBhY2tldHMgaW4gSEREIC0gc2V0IGJhY2sgdGhlIHBlbmRpbmcgcGFja2V0cyBhbmQgCiAgIHRoZSBubyBtb3JlIGRhdGEgYXNzdW1wdGlvbiovCiAgdm9zX2F0b21pY19zZXRfVTgoICZwU3RhQ2xpZW50LT51Y1BrdFBlbmRpbmcsIDEpOwogIHBTdGFDbGllbnQtPnVjTm9Nb3JlRGF0YSA9IDA7CgogIGlmIChXTEFOX1NUQV9TT0ZUQVAgIT0gcFN0YUNsaWVudC0+d1NUQURlc2Mud1NUQVR5cGUpCiAgewogIC8vIGRvbid0IG5lZWQgdG8gc2V0IGl0LCBhcyB3ZSBkb24ndCByZXNldCBpdCBpbiB0aGlzIGZ1bmN0aW9uLgogIC8vdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y1BrdFBlbmRpbmcsIDEpOwogIH0KCiNpZmRlZiBXTEFOX1BFUkYgCiAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9CQUwsIAogICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpMCk7CiNlbmRpZiAvKldMQU5fUEVSRiovCgogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIFRJRAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgdWNUaWQgICAgID0gdGxNZXRhSW5mby51Y1RJRDsKCiAgLypNYWtlIHN1cmUgVElEIGlzIHZhbGlkKi8KICBpZiAoIFdMQU5UTF9USURfSU5WQUxJRCh1Y1RpZCkpIAogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRJRCBzZW50IGluIG1ldGEgaW5mbyAlZCAtIGRlZmF1bHRpbmcgdG8gMCAoQkUpIiwgCiAgICAgICAgICAgICB1Y1RpZCkpOwogICAgIHVjVGlkID0gMDsgCiAgfQoKICAvKlNhdmUgZm9yIFVBUFNEIHRpbWVyIGNvbnNpZGVyYXRpb24qLwogIHBTdGFDbGllbnQtPnVjU2VydmljZWRBQyA9IHVjQUM7IAoKICBpZiAoIHVjQUMgPT0gcFN0YUNsaWVudC0+dWNDdXJyZW50QUMgKSAKICB7CiAgICBwU3RhQ2xpZW50LT5hdWNBQ01hc2tbcFN0YUNsaWVudC0+dWNDdXJyZW50QUNdID0gMTsKICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudFdlaWdodC0tOwogIH0KICBlbHNlCiAgewogICAgcFN0YUNsaWVudC0+dWNDdXJyZW50QUMgICAgID0gdWNBQzsKICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudFdlaWdodCA9IHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNBQ10gLSAxOwoKICAgIHBTdGFDbGllbnQtPmF1Y0FDTWFza1twU3RhQ2xpZW50LT51Y0N1cnJlbnRBQ10gPSAxOwoKICB9CgogIGlmIChXTEFOX1NUQV9TT0ZUQVAgIT0gcFN0YUNsaWVudC0+d1NUQURlc2Mud1NUQVR5cGUpCiAgewogIGlmICggMCA9PSBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQgKSAKICB7CiAgICBXTEFOVExfQUNFbnVtVHlwZSB0ZW1wQUMgPSB1Y0FDOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgQ2hvb3NlIG5leHQgQUMgLSAhISEgb3B0aW1pemUgbWUKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHdoaWxlICggMCAhPSB1Y0FDTWFzayApIAogICAgewogICAgICBpZih0ZW1wQUMgPT0gV0xBTlRMX0FDX0JLKQogICAgICAgICB1Y05leHRBQyA9IFdMQU5UTF9BQ19ISUdIX1BSSU87CiAgICAgIGVsc2UKICAgICAgICAgdWNOZXh0QUMgPSAodGVtcEFDIC0gMSk7CgogICAgICBpZiAoIDAgIT0gcFN0YUNsaWVudC0+YXVjQUNNYXNrW3VjTmV4dEFDXSApCiAgICAgIHsKICAgICAgICAgcFN0YUNsaWVudC0+dWNDdXJyZW50QUMgICAgID0gdWNOZXh0QUM7CiAgICAgICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudFdlaWdodCA9IHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNOZXh0QUNdOwoKICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDogQ2hhbmdpbmcgc2VydmljZWQgQUMgdG86ICVkIHdpdGggV2VpZ2h0OiAlZCIsCiAgICAgICAgICAgICAgICAgICAgcFN0YUNsaWVudC0+dWNDdXJyZW50QUMgLCAKICAgICAgICAgICAgICAgICAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQpKTsKICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdGVtcEFDID0gdWNOZXh0QUM7CiAgICB9CiAgfQogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkF0dGFjaGluZyBCRCBoZWFkZXIgdG8gcGt0IG9uIFdMQU5UTF9TVEFUeEF1dGgiKSk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUcmFuc2xhdGUgODAyLjMgZnJhbWUgdG8gODAyLjExCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAwID09IHRsTWV0YUluZm8udWNEaXNhYmxlRnJtWHRsICkKICB7CiAgICAgLyogTmVlZHMgZnJhbWUgdHJhbnNsYXRpb24gKi8KICAgICAvLyBpZiB0aGUgY2xpZW50IGhhcyBub3QgZW5hYmxlZCBTVy1vbmx5IGZyYW1lIHRyYW5zbGF0aW9uCiAgICAgLy8gYW5kIGlmIHRoZSBmcmFtZSBpcyBhIHVuaWNhc3QgZnJhbWUKICAgICAvLyAgIChIVyBmcmFtZSB0cmFuc2xhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGJyb2FkY2FzdCBkb21haW5zCiAgICAgLy8gICAgc28gd2UgdXNlIFNXIGZyYW1lIHRyYW5zbGF0aW9uIGZvciBicm9hZGNhc3QvbXVsdGljYXN0IGZyYW1lcykKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgICAgLy8gYW5kIGlmIHRoZSBmcmFtZSBpcyBub3QgYSBXQVBJIGZyYW1lCiNlbmRpZgogICAgIC8vIHRoZW4gdXNlIEhXX2Jhc2VkIGZyYW1lIHRyYW5zbGF0aW9uCgogICAgIGlmICggKCAwID09IHBTdGFDbGllbnQtPndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiApICYmCiAgICAgICAgICAoIDAgPT0gdGxNZXRhSW5mby51Y0JjYXN0ICkgJiYKICAgICAgICAgICggMCA9PSB0bE1ldGFJbmZvLnVjTWNhc3QgKQojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICAgICAgICAgICYmICggdGxNZXRhSW5mby51Y0lzV2FpICE9IDEgKQojZW5kaWYKICAgICAgICApCiAgICAgewojaWZkZWYgV0xBTl9QRVJGIAogICAgICAgIHZfVTMyX3QgdUZhc3RGd2RPSyA9IDA7CgogICAgICAgIC8qIEhXIGJhc2VkIHRyYW5zbGF0aW9uLiBTZWUgaWYgdGhlIGZyYW1lIGNvdWxkIGJlIGZhc3QgZm9yd2FyZGVkICovCiAgICAgICAgV0RBX1RMSV9GYXN0SHdGd2REYXRhRnJhbWUoIHB2b3NHQ3R4LCB2b3NEYXRhQnVmZiAsICZ2b3NTdGF0dXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1RmFzdEZ3ZE9LLCAmdGxNZXRhSW5mbywgJnBTdGFDbGllbnQtPndTVEFEZXNjKTsKCiAgICAgICAgaWYoIFZPU19TVEFUVVNfU1VDQ0VTUyA9PSB2b3NTdGF0dXMgKQogICAgICAgIHsKICAgICAgICAgICAgaWYodUZhc3RGd2RPSykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogUGFja2V0IGNvdWxkIGJlIGZhc3QgZm9yd2FyZGVkIG5vdyAqLwogICAgICAgICAgICAgICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpcFN0YUNsaWVudC0+cGZuU1RBVHhDb21wICk7CgogICAgICAgICAgICAgICAgKnB2b3NEYXRhQnVmZiA9IHZvc0RhdGFCdWZmOwoKICAgICAgICAgICAgICAgIC8qIFRPRE86IERvIHdlIHJlYWxseSBuZWVkIHRvIHVwZGF0ZSBXTEFOVExfSFNIYW5kbGVUWEZyYW1lKCkgCiAgICAgICAgICAgICAgICAgICBzdGF0cyBmb3IgZXZlcnkgcGt0PyAqLwogICAgICAgICAgICAgICAgcFN0YUNsaWVudC0+YXVUeENvdW50W3RsTWV0YUluZm8udWNUSURdKys7CiAgICAgICAgICAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogY2FuJ3QgYmUgZmFzdCBmb3J3YXJkZWQsIGZhbGwgdGhyb3VnaCBub3JtYWwgKHNsb3cpIHBhdGguICovCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CgogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmFzdEZ3ZCBCRCAlZCIsIHZvc1N0YXR1cykpOwogICAgICAgICAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICAgICB9CiNlbmRpZiAvKldMQU5fUEVSRiovCiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAgLyogU1cgYmFzZWQgdHJhbnNsYXRpb24gKi8KCiAgICAgICB2b3NTdGF0dXMgPSAgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyKCB2b3NEYXRhQnVmZiwgJnZvc1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLCAmdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bE1ldGFJbmZvLCAmdWNXRFNFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dHJhSGVhZFNwYWNlKTsKICAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICAgICB7CiAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6RXJyb3Igd2hlbiB0cmFuc2xhdGluZyBoZWFkZXIgV0xBTlRMX1NUQVR4QXV0aCIpKTsKICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgICB9CgogICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICAgICJXTEFOIFRMIHNvZnR3YXJlIHRyYW5zbGF0aW9uIHN1Y2Nlc3MiKSk7CiAgICAgICB1Y1N3RnJtWHRsID0gMTsKICAgICAgIHRsTWV0YUluZm8udWNEaXNhYmxlRnJtWHRsID0gMTsKICAgIH0KICB9CiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogICAgLypJbiBjYXNlIG9mIFRETFMsIGlmIHRoZSBwYWNrZXQgaXMgZGVzdGluZWQgdG8gVERMUyBTVEEgdWNTVEFJZCBtYXkKICAgICAgY2hhbmdlLiBzbyB1cGRhdGUgdGhlIHBTdGFDbGllbnQgYWNjb3JkaW5nbHkgKi8KICAgIHBTdGFDbGllbnQgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgICBpZiAoIE5VTEwgPT0gcFN0YUNsaWVudCApCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJwU3RhQ2xpZW50IGlzIE5VTEwgJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgIH0KI2VuZGlmCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDYWxsIEhBTCB0byBmaWxsIEJEIGhlYWRlcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y1R5cGVTdWJ0eXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9UWVBFIDw8IDQpOwoKICBpZiAoIHBTdGFDbGllbnQtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCApIAogIHsKICAgIHVjVHlwZVN1YnR5cGUgfD0gKFdMQU5UTF84MDIxMV9EQVRBX1FPU19TVUJUWVBFKTsKICB9CgogIC8qIHVjQUMgbm93IHBvaW50cyB0byBUTCBRIElEIHdpdGggYSBuZXcgcXVldWUgYWRkZWQgaW4gVEwsCiAgICogaGVuY2UgbG9vayBmb3IgdGhlIHVhcHNkIGluZm8gZm9yIHRoZSBjb3JyZWN0IEFDIHRoYXQKICAgKiB0aGlzIHBhY2tldCBiZWxvbmdzIHRvLgogICAqLwogIHVjVHhGbGFnICA9ICgwICE9IHBTdGFDbGllbnQtPndVQVBTREluZm9bdGxNZXRhSW5mby5hY10udWNTZXQpPwogICAgICAgICAgICAgIEhBTF9UUklHR0VSX0VOQUJMRURfQUNfTUFTSzowOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgaWYgKCBwU3RhQ2xpZW50LT53U1RBRGVzYy51Y0lzV2FwaVN0YSA9PSAxICkKICB7CiNpZmRlZiBMSUJSQV9XQVBJX1NVUFBPUlQKICAgIHVjVHhGbGFnID0gdWNUeEZsYWcgfCBIQUxfV0FQSV9TVEFfTUFTSzsKI2VuZGlmIC8vTElCUkFfV0FQSV9TVVBQT1JUCiAgICBpZiAoIHRsTWV0YUluZm8udWNJc1dhaSA9PSAxICkgCiAgICB7CiAgICAgIHVjVHhGbGFnID0gdWNUeEZsYWcgfCBIQUxfVFhfTk9fRU5DUllQVElPTl9NQVNLOwogICAgfQogIH0KI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIGlmICggcFN0YUNsaWVudC0+d1NUQURlc2Mud1NUQVR5cGUgPT0gV0xBTl9TVEFfVERMUyApCiAgewogICAgdWNUeEZsYWcgPSB1Y1R4RmxhZyB8IEhBTF9URExTX1BFRVJfU1RBX01BU0s7CiAgfQojZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KICBpZiggdGxNZXRhSW5mby51Y0lzQXJwICkKICB7CiAgICBpZiAocFRMQ2ItPnRyYWNrX2FycCkKICAgIHsKICAgICAgIGlmICh2b3NfY2hlY2tfYXJwX3RhcmdldF9pcCh2b3NEYXRhQnVmZikpCiAgICAgICB7CiAgICAgICAgICB1Y1R4RmxhZyB8PSBIQUxfVVNFX0ZXX0lOX1RYX1BBVEg7CiAgICAgICAgICB1Y1R4RmxhZyB8PSBIQUxfVFhDT01QX1JFUVVFU1RFRF9NQVNLOwogICAgICAgICAgdGxNZXRhSW5mby51Y1R4QmRUb2tlbiA9ICsrIHBUTENiLT50eGJkX3Rva2VuOwogICAgICAgfQogICAgfQoKICAgIGlmIChwU3RhQ2xpZW50LT5hcnBPbldRNSkKICAgIHsKICAgICAgICB1Y1R4RmxhZyB8PSBIQUxfVVNFX0ZXX0lOX1RYX1BBVEg7CiAgICB9CiAgICBpZiAocFN0YUNsaWVudC0+YXJwUmF0ZSA9PSAwKQogICAgewogICAgICAgIHVjVHhGbGFnIHw9IEhBTF9VU0VfQkRfUkFURV8xX01BU0s7CiAgICB9CiAgICBlbHNlIGlmIChwU3RhQ2xpZW50LT5hcnBSYXRlID09IDEgfHwgcFN0YUNsaWVudC0+YXJwUmF0ZSA9PSAzKQogICAgewogICAgICAgIHBTdGFDbGllbnQtPmFycFJhdGUgXj0gMHgyOwogICAgICAgIHVjVHhGbGFnIHw9IEhBTF9VU0VfQkRfUkFURV8xX01BU0s8PChwU3RhQ2xpZW50LT5hcnBSYXRlLTEpOwogICAgfQogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgImFycCBwa3Qgc2VuZGluZyBvbiBCRCByYXRlOiAlaGh1IiwgcFN0YUNsaWVudC0+YXJwUmF0ZSkpOwogIH0KCiAgdm9zU3RhdHVzID0gKFZPU19TVEFUVVMpV0RBX0RTX0J1aWxkVHhQYWNrZXRJbmZvKCBwdm9zR0N0eCwgCiAgICAgICAgICAgICAgICAgICAgIHZvc0RhdGFCdWZmICwgJnZEZXN0TWFjQWRkciwKICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwsICZ1c1BrdExlbiwKICAgICAgICAgICAgICAgICAgICAgcFN0YUNsaWVudC0+d1NUQURlc2MudWNRb3NFbmFibGVkLCB1Y1dEU0VuYWJsZWQsIAogICAgICAgICAgICAgICAgICAgICBleHRyYUhlYWRTcGFjZSwKICAgICAgICAgICAgICAgICAgICAgdWNUeXBlU3VidHlwZSwgJnBTdGFDbGllbnQtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgdWNUaWQsIHVjVHhGbGFnLCB0bE1ldGFJbmZvLnVzVGltZVN0YW1wLCAKICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51Y0lzRWFwb2wsIHRsTWV0YUluZm8udWNJc0FycCwgdGxNZXRhSW5mby51Y1VQLAogICAgICAgICAgICAgICAgICAgICB0bE1ldGFJbmZvLnVjVHhCZFRva2VuKTsKCiAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJGaWxsIFRYIEJEIEVycm9yIHN0YXR1cyAlZCIsIHZvc1N0YXR1cykpOwoKICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICAvKiBUWCBTdGF0aXN0aWNzICovCiAgaWYgKCEodGxNZXRhSW5mby51Y0JjYXN0IHx8IHRsTWV0YUluZm8udWNNY2FzdCkpCiAgewogICAgLyogVGhpcyBpcyBUWCBVQyBmcmFtZSAqLwogICAgcFN0YUNsaWVudC0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0ZjbnQrKzsKICAgIHBTdGFDbGllbnQtPnRyYWZmaWNTdGF0aXN0aWNzLnR4VUNCY250ICs9IHVzUGt0TGVuOwogIH0KCiNpZm5kZWYgRkVBVFVSRV9XTEFOX1RETFMKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBVcGRhdGUgdHggY291bnRlciBmb3IgQkEgc2Vzc2lvbiBxdWVyeSBmb3IgdHggc2lkZQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBTdGFDbGllbnQtPmF1VHhDb3VudFt1Y1RpZF0rKzsKI2Vsc2UKICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+YXVUeENvdW50W3VjVGlkXSsrOwojZW5kaWYKCiAgLyogVGhpcyBjb2RlIGlzIHRvIHNlbmQgdHJhZmZpYyB3aXRoIGxvd2VyIHByaW9yaXR5IEFDIHdoZW4gd2UgZG9lcyBub3QgCiAgICAgZ2V0IGFkbWl0dGVkIHRvIHNlbmQgaXQuIFRvZGF5IEhBTCBkb2VzIG5vdCBkb3duZ3JhZGUgQUMgc28gdGhpcyBjb2RlIAogICAgIGRvZXMgbm90IGdldCBleGVjdXRlZC4oSW4gb3RoZXIgd29yZHMsIEhBTCBkb2VzbpJ0IGNoYW5nZSB0aWQuIFRoZSBpZiAKICAgICBzdGF0ZW1lbnQgaXMgYWx3YXlzIGZhbHNlLikKICAgICBOT1RFOiBJbiB0aGUgY2FzZSBvZiBMQSBkb3duZ3JhZGUgb2NjdXJzIGluIEhERCAodGhhdCB3YXMgdGhlIGNoYW5nZSAKICAgICBQaGFuaSBtYWRlIGR1cmluZyBXTU0tQUMgcGx1Z2Zlc3QpLiBJZiBXTSAmIEJNUCBhbHNvIHRvb2sgdGhpcyBhcHByb2FjaCwgCiAgICAgdGhlbiB0aGVyZSB3aWxsIGJlIG5vIG5lZWQgZm9yIGFueSBBQyBkb3duZ3JhZGUgbG9naWMgaW4gVEwvV0RJLiAgICovCiNpZiAwCiAgaWYgKCggdWNUaWQgIT0gdGxNZXRhSW5mby51Y1RJRCApICYmCiAgICAgICggMCAhPSBwU3RhQ2xpZW50LT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQgKSAmJiAKICAgICAgKCAwICE9IHVjU3dGcm1YdGwgKSkKICB7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAhISBGSVggbWU6IE9uY2UgZG93bmdyYWRpbmcgaXMgY2xlYXIgcHV0IGluIHRoZSBwcm9wZXIgY2hhbmdlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdWNRQ09mZnNldCA9IFdMQU5IQUxfVFhfQkRfSEVBREVSX1NJWkUgKyBXTEFOVExfODAyXzExX0hFQURFUl9MRU47CgogICAgLy8hISFGaXggdGhpcyByZXBsYWNlIHBlZWsgd2l0aCBleHRyYWN0IAogICAgdm9zX3BrdF9wZWVrX2RhdGEoIHZvc0RhdGFCdWZmLCB1Y1FDT2Zmc2V0LCh2X1BWT0lEX3QpJnB1Y1Fvc0N0cmwsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpwdWNRb3NDdHJsKSk7CiAgICAqcHVjUW9zQ3RybCA9IHVjVGlkOyAvLz8gcHJvcGVyIGJ5dGUgb3JkZXIKICB9CiNlbmRpZgoKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmlsbCBCRCAlZCIsIHZvc1N0YXR1cykpOwogICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClwU3RhQ2xpZW50LT5wZm5TVEFUeENvbXAgKTsKCiAgKnB2b3NEYXRhQnVmZiA9IHZvc0RhdGFCdWZmOwoKICAvKkJFICYgQksgY2FuIGJlIGRlbGF5ZWQsIFZPIGFuZCBWSSBub3QgZnJhbWVzIGNhbm5vdCBiZSBkZWxheWVkKi8KICBpZiAoIHBTdGFDbGllbnQtPnVjU2VydmljZWRBQyA+IFdMQU5UTF9BQ19CRSApIAogIHsKICAgIHBUTENiLT5iVXJnZW50PSBUUlVFOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TVEFUeEF1dGggKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU1RBVHhEaXNjCgogIERFU0NSSVBUSU9OCiAgICBUcmFuc21pdCBpbiBkaXNjb25uZWN0ZWQgc3RhdGUgLSBubyBkYXRhIGFsbG93ZWQKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgU1RBIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGJlaW5nIHByb2Nlc3NlZAogICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSB0eCB2b3MgYnVmZmVyCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVR4RGlzYwooCiAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYsCiAgdl9CT09MX3QgICAgICBiRm9yd2FyZElBUFB3aXRoTExDCikKewogICBXTEFOVExfQ2JUeXBlKiAgICAgICAgcFRMQ2IgICAgICAgPSBOVUxMOwogICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU1RBVHhBdXRoIikpOwogICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEVycm9yCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICJXTEFOIFRMOlBhY2tldCBzaG91bGQgbm90IGJlIHRyYW5zbWl0dGVkIGluIHN0YXRlIGRpc2Nvbm5lY3RlZCBpZ25vcmluZyIKICAgICAgICAgICAgIiByZXF1ZXN0IikpOwoKICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgcENsaWVudFNUQS0+dWNOb01vcmVEYXRhID0gMTsKICAgCiAgIC8vU2hvdWxkIG5vdCBiZSBhbnl0aGluZyBwZW5kaW5nIGluIGRpc2Nvbm5lY3Qgc3RhdGUKICAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1BrdFBlbmRpbmcsIDApOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVR4RGlzYyAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFSeENvbm4KCiAgREVTQ1JJUFRJT04KICAgIFJlY2VpdmUgaW4gY29ubmVjdGVkIHN0YXRlIC0gb25seSBFQVBPTAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHR4L3J4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBUnhDb25uCigKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZiwKICB2X0JPT0xfdCAgICAgIGJGb3J3YXJkSUFQUHdpdGhMTEMKKQp7CiAgIFdMQU5UTF9DYlR5cGUqICAgICAgICAgICBwVExDYiA9IE5VTEw7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgICBwQ2xpZW50U1RBID0gTlVMTDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzRXRoZXJUeXBlID0gMDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzUGt0TGVuOwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNNUERVSE9mZnNldDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzTVBEVURPZmZzZXQ7CiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c01QRFVMZW47CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuOwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNBY3R1YWxITGVuID0gMDsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgIHZvc1N0YXR1cyAgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgIHZvc19wa3RfdCogICAgICAgICAgICAgICB2b3NEYXRhQnVmZjsKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgIGF1Y0JESGVhZGVyOwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNUaWQ7CiAgIFdMQU5UTF9SeE1ldGFJbmZvVHlwZSAgICB3UnhNZXRhSW5mbzsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkgfHwgKCBOVUxMID09ICggdm9zRGF0YUJ1ZmYgPSAqcHZvc0RhdGFCdWZmICkpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfU1RBUnhDb25uIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IEJEIGhlYWRlciBhbmQgY2hlY2sgaWYgdmFsaWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NTdGF0dXMgPSBXREFfRFNfUGVla1J4UGFja2V0SW5mbyggdm9zRGF0YUJ1ZmYsICh2X1BWT0lEX3QpJmF1Y0JESGVhZGVyLCAwLypTd2FwIEJEKi8gKTsKCiAgaWYgKCBOVUxMID09IGF1Y0JESGVhZGVyICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBleHRyYWN0IEJEIGhlYWRlciIpKTsKICAgIFZPU19BU1NFUlQoIDAgKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKCiAgdWNNUERVSE9mZnNldCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9PRkZTRVQoYXVjQkRIZWFkZXIpOwogIHVzTVBEVURPZmZzZXQgPSAodl9VMTZfdClXREFfR0VUX1JYX01QRFVfREFUQV9PRkZTRVQoYXVjQkRIZWFkZXIpOwogIHVzTVBEVUxlbiAgICAgPSAodl9VMTZfdClXREFfR0VUX1JYX01QRFVfTEVOKGF1Y0JESGVhZGVyKTsKICB1Y01QRFVITGVuICAgID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfSEVBREVSX0xFTihhdWNCREhlYWRlcik7CiAgdWNUaWQgICAgICAgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9USUQoYXVjQkRIZWFkZXIpOwoKICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKCB2b3NEYXRhQnVmZiwgJnVzUGt0TGVuKTsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciBwcm9jZXNzaW5nIGRhdGE6IEhPICVkIERPICVkIExlbiAlZCBITGVuICVkIiwKICAgICAgICAgICAgIHVjTVBEVUhPZmZzZXQsIHVzTVBEVURPZmZzZXQsIHVzTVBEVUxlbiwgdWNNUERVSExlbikpOwoKICAgIC8qSXQgd2lsbCBjdXQgb3V0IHRoZSA4MDIuMTEgaGVhZGVyIGlmIG5vdCB1c2VkKi8KICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBXREFfRFNfVHJpbVJ4UGFja2V0SW5mbyggdm9zRGF0YUJ1ZmYgKSApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIGNvcnJ1cHRlZCAtIGRyb3BwaW5nIHBhY2tldCIpKTsKICAgIC8qIERyb3AgcGFja2V0ICovCiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CgogIHZvc1N0YXR1cyA9IFdMQU5UTF9HZXRFdGhlclR5cGUoYXVjQkRIZWFkZXIsdm9zRGF0YUJ1ZmYsdWNNUERVSExlbiwmdXNFdGhlclR5cGUpOwogIAogIGlmKCBWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSApCiAgewojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICAgIC8qIElmIGZyYW1lIGlzIG5laXRoZXIgYW4gRUFQT0wgZnJhbWUgbm9yIGEgV0FJIGZyYW1lIHRoZW4gd2UgZHJvcCB0aGUgZnJhbWUqLwogICAgLyogVE9ETzogRG8gd2UgbmVlZCBhIGNoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gV0FQSSBtb2RlPyBJZiBub3QgaXMgaXQgcG9zc2libGUgKi8KICAgIC8qIHRoYXQgd2UgZ2V0IGFuIEVBUE9MIHBhY2tldCBpbiBXQVBJIG1vZGUgb3IgdmljZSB2ZXJzYT8gKi8KICAgIGlmICggV0xBTlRMX0xMQ184MDIxWF9UWVBFICAhPSB1c0V0aGVyVHlwZSAmJiBXTEFOVExfTExDX1dBSV9UWVBFICAhPSB1c0V0aGVyVHlwZSApCiAgICB7CiAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6UlggRnJhbWUgbm90IEVBUE9MIG9yIFdBSSBFdGhlclR5cGUgJWQgLSBkcm9wcGluZyIsIHVzRXRoZXJUeXBlICk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICB9CiNlbHNlCiAgICBpZiAoIFdMQU5UTF9MTENfODAyMVhfVFlQRSAgIT0gdXNFdGhlclR5cGUgKQogICAgewogICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpSWCBGcmFtZSBub3QgRUFQT0wgRXRoZXJUeXBlICVkIC0gZHJvcHBpbmciLCB1c0V0aGVyVHlwZSk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICB9CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwogICAgZWxzZSAvKiBGcmFtZSBpcyBhbiBFQVBPTCBmcmFtZSBvciBhIFdBSSBmcmFtZSovICAKICAgIHsKICAgICAgTVRSQUNFKHZvc190cmFjZShWT1NfTU9EVUxFX0lEX1RMLAogICAgICAgICAgICAgICAgICAgVFJBQ0VfQ09ERV9UTF9SWF9DT05OX0VBUE9MLCB1Y1NUQUlkLCB1c0V0aGVyVHlwZSApKTsKCiAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6UlggRnJhbWUgIEVBUE9MIEV0aGVyVHlwZSAlZCAtIHByb2Nlc3NpbmciLCB1c0V0aGVyVHlwZSk7CgogICAgICBpZiAoKCAwID09IFdEQV9HRVRfUlhfRlRfRE9ORShhdWNCREhlYWRlcikgKSAmJgogICAgICAgICAoIDAgIT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uKSkKICAgICAgewogICAgICBpZiAodXNNUERVRE9mZnNldCA+IHVjTVBEVUhPZmZzZXQpCiAgICAgIHsKICAgICAgICAgdXNBY3R1YWxITGVuID0gdXNNUERVRE9mZnNldCAtIHVjTVBEVUhPZmZzZXQ7CiAgICAgIH0KCiAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlciggdm9zRGF0YUJ1ZmYsICZ2b3NTdGF0dXMsIHVzQWN0dWFsSExlbiwgCiAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCBwVExDYiwgdWNTVEFJZCwgYkZvcndhcmRJQVBQd2l0aExMQyk7CgogICAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIAogICAgICAgIHsKICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgdG8gdHJhbnNsYXRlIGZyb20gODAyLjExIHRvIDgwMi4zIC0gZHJvcHBpbmciKSk7CiAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBJbmNyZW1lbnQgcmVjZWl2ZSBjb3VudGVyCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBpZiAoICFXTEFOVExfVElEX0lOVkFMSUQoIHVjVGlkKSApIAogICAgICB7CiAgICAgICAgcENsaWVudFNUQS0+YXVSeENvdW50W3VjVGlkXSsrOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCB0aWQgICVkIChTdGF0aW9uIElEICVkKSBvbiAlcyIsCiAgICAgICAgICAgICAgIHVjVGlkLCB1Y1NUQUlkLCBfX2Z1bmNfXykpOwogICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgICB9CgogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpTZW5kaW5nIEVBUG9MIGZyYW1lIHRvIHN0YXRpb24gJWQgQUMgJWQiLCB1Y1NUQUlkLCB1Y1RpZCkpOwoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICEhIUFzc3VtaW5nIFRJRCA9IFVQIG1hcHBpbmcgCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICB3UnhNZXRhSW5mby51Y1VQID0gdWNUaWQ7CgogICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICJXTEFOIFRMICVzOlNlbmRpbmcgZGF0YSBjaGFpbiB0byBzdGF0aW9uIiwgX19mdW5jX18pKTsKICAgICAgaWYgKCBXTEFOX1NUQV9TT0ZUQVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUgKQogICAgICB7CiAgICAgICAgd1J4TWV0YUluZm8udWNEZXNTVEFJZCA9IFdMQU5fUlhfU0FQX1NFTEZfU1RBX0lEOwogICAgICAgIHBDbGllbnRTVEEtPnBmblNUQVJ4KCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndSeE1ldGFJbmZvICk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICBwQ2xpZW50U1RBLT5wZm5TVEFSeCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLCB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3UnhNZXRhSW5mbyApOwogICAgfS8qRUFQT0wgZnJhbWUgb3IgV0FJIGZyYW1lKi8KICB9Lyp2b3Mgc3RhdHVzIHN1Y2Nlc3MqLwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVJ4Q29ubiAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9Gd2RQa3RUb0hERAoKICBERVNDUklQVElPTgogICAgRGV0ZXJtaW5lIHRoZSBEZXN0YXRpb24gU3RhdGlvbiBJRCBhbmQgcm91dGUgdGhlIEZyYW1lIHRvIFVwcGVyIExheWVyCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgcnggdm9zIGJ1ZmZlcgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKVk9TX1NUQVRVUwpXTEFOVExfRndkUGt0VG9IREQKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICBwdm9zRGF0YUJ1ZmYsCiAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQKKQp7CiAgIHZfTUFDQUREUl90ICAgICAgICAgICAgICBEZXN0TWFjQWRkcmVzczsKICAgdl9NQUNBRERSX3QgICAgICAgICAgICAgICpwRGVzdE1hY0FkZHJlc3MgPSAmRGVzdE1hY0FkZHJlc3M7CiAgIHZfU0laRV90ICAgICAgICAgICAgICAgICB1c01hY0FkZFNpemUgPSBWT1NfTUFDX0FERFJfU0laRTsKICAgV0xBTlRMX0NiVHlwZSogICAgICAgICAgIHBUTENiID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgIHBDbGllbnRTVEEgPSBOVUxMOwogICB2b3NfcGt0X3QqICAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYgOwogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogICB2X1UzMl90KiAgICAgICAgICAgICAgICAgU1RBTWV0YUluZm9QdHI7CiAgIHZvc19wa3RfdCogICAgICAgICAgICAgICB2b3NOZXh0RGF0YUJ1ZmYgOwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNEZXNTVEFJZDsKICAgV0xBTlRMX1J4TWV0YUluZm9UeXBlICAgIHdSeE1ldGFJbmZvOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggTlVMTCA9PSBwdm9zRGF0YUJ1ZmYgKSB8fCAoIE5VTEwgPT0gKCB2b3NEYXRhQnVmZiA9IHB2b3NEYXRhQnVmZiApKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfRndkUGt0VG9IZGQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0Z3ZFBrdFRvSGRkIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmKFdMQU5UTF9TVEFfSURfSU5WQUxJRCh1Y1NUQUlkKSkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsInVjU1RBSWQgJWQgaXMgbm90IHZhbGlkIiwKICAgICAgICAgICAgICAgICB1Y1NUQUlkKSk7CiAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogICAvKiBUaGlzIHRoZSBjaGFuZ2UgcmVxdWlyZWQgZm9yIFNvZnRBcCB0byBoYW5kbGUgUmVvcmRlcmVkIEJ1ZmZlci4gU2luY2UgYSBTVEEKICAgICAgbWF5IGhhdmUgcGFja2V0cyBkZXN0aW5lZCB0byBtdWx0aXBsZSBkZXN0aW5hdGlvbnMgd2UgaGF2ZSB0byBwcm9jZXNzIGVhY2ggcGFja2V0CiAgICAgIGF0IGEgdGltZSBhbmQgZGV0ZXJtaW5lIGl0cyBEZXN0aW5hdGlvbi4gU28gdGhlIFZvc2NoYWluIHByb3ZpZGVkIGJ5IFJlb3JkZXIgY29kZQogICAgICBpcyB1bmNoYWluIGFuZCBmb3J3YXJkZWQgdG8gVXBwZXIgTGF5ZXIgYWZ0ZXIgRGV0ZXJtaW5pbmcgdGhlIERlc3RpbmF0aW9uICovCgogICB2b3NEYXRhQnVmZiA9IHB2b3NEYXRhQnVmZjsKICAgd2hpbGUgKHZvc0RhdGFCdWZmICE9IE5VTEwpCiAgIHsKICAgICAgdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggdm9zRGF0YUJ1ZmYsICZ2b3NOZXh0RGF0YUJ1ZmYsIDEvKnRydWUqLyApOwogICAgICB2b3NfcGt0X2dldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QgKikmU1RBTWV0YUluZm9QdHIgKTsKICAgICAgd1J4TWV0YUluZm8udWNVUCA9ICh2X1U4X3QpKCh1aW50cHRyX3QpU1RBTWV0YUluZm9QdHIgJiBXTEFOVExfQUNfTUFTSyk7CiAgICAgIHVjRGVzU1RBSWQgPSAodl9VOF90KSgoKHVpbnRwdHJfdClTVEFNZXRhSW5mb1B0cikgPj4gV0xBTlRMX1NUQUlEX09GRlNFVCk7CiAgICAgICAKICAgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc0RhdGFCdWZmLCAwLCAodl9WT0lEX3QgKilwRGVzdE1hY0FkZHJlc3MsICZ1c01hY0FkZFNpemUpOwogICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgICB7CiAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOiByZWN2IGNvcnJ1cHRlZCBkYXRhIHBhY2tldCIpKTsKICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICAgfQoKICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICAgICAgICAic3RhdGlvbiBtYWMgIk1BQ19BRERSRVNTX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgTUFDX0FERFJfQVJSQVkocERlc3RNYWNBZGRyZXNzLT5ieXRlcykpKTsKCiAgICAgIGlmICh2b3NfaXNfbWFjYWRkcl9icm9hZGNhc3QoIHBEZXN0TWFjQWRkcmVzcyApIHx8IHZvc19pc19tYWNhZGRyX2dyb3VwKHBEZXN0TWFjQWRkcmVzcykpCiAgICAgIHsKICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIGlzIG1jL2JjIHN0YXRpb24KICAgICAgICAgIHVjRGVzU1RBSWQgPSBXTEFOX1JYX0JDTUNfU1RBX0lEOwogICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAgIiVzOiBCQy9NQyBwYWNrZXQsIGlkICVkIiwgX19mdW5jX18sIFdMQU5fUlhfQkNNQ19TVEFfSUQpKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgaWYgKHZvc19pc19tYWNhZGRyX2VxdWFsKHBEZXN0TWFjQWRkcmVzcywgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcykpCiAgICAgICAgIHsKICAgICAgICAgICAgLy8gZGVzdGluYXRpb24gaXMgQVAgaXRzZWxmCiAgICAgICAgICAgIHVjRGVzU1RBSWQgPSBXTEFOX1JYX1NBUF9TRUxGX1NUQV9JRDsKICAgICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAgICIlczogcGFja2V0IHRvIEFQIGl0c2VsZiwgaWQgJWQiLCBfX2Z1bmNfXywgV0xBTl9SWF9TQVBfU0VMRl9TVEFfSUQpKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmICgoIFdMQU5fTUFYX1NUQV9DT1VOVCA8PSB1Y0Rlc1NUQUlkICkgfHwgKE5VTEwgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNEZXNTVEFJZF0gJiYgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNEZXNTVEFJZF0tPnVjRXhpc3RzID09IDApKQogICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIHN0YXRpb24gaXMgc29tZXRoaW5nIGVsc2UKICAgICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgIiVzOiBnZXQgYW4gc3RhdGlvbiBpbmRleCBsYXJnZXIgdGhhbiBXTEFOX01BWF9TVEFfQ09VTlQgJWQiLCBfX2Z1bmNfXywgdWNEZXNTVEFJZCkpOwogICAgICAgICAgICB1Y0Rlc1NUQUlkID0gV0xBTl9SWF9TQVBfU0VMRl9TVEFfSUQ7CiAgICAgICAgIH0KCiAgICAgICAgIAogICAgICAgICAvL2xvb3BiYWNrIHVuaWNhc3Qgc3RhdGlvbiBjb21lcyBoZXJlCiAgICAgIH0KCiAgICAgIHdSeE1ldGFJbmZvLnVjVVAgPSAodl9VOF90KSgodWludHB0cl90KVNUQU1ldGFJbmZvUHRyICYgV0xBTlRMX0FDX01BU0spOwogICAgICB3UnhNZXRhSW5mby51Y0Rlc1NUQUlkID0gdWNEZXNTVEFJZDsKICAgICAKICAgICAgdm9zU3RhdHVzID0gcENsaWVudFNUQS0+cGZuU1RBUngoIHB2b3NHQ3R4LCB2b3NEYXRhQnVmZiwgdWNEZXNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd1J4TWV0YUluZm8gKTsKICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgICAgewogICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6IGZhaWxlZCB0byBzZW5kIHBrdCB0byBIREQiKSk7CiAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwoKICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgIH0KICAgICAgdm9zRGF0YUJ1ZmYgPSB2b3NOZXh0RGF0YUJ1ZmY7CiAgIH0KICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX1NDQU5fT0ZGTE9BRAp2b2lkIFdMQU5UTF9TdG9wUnhSYXRlTW9uaXRvcih2X1BWT0lEX3QgcHZvc0dDdHgpCnsKICAgV0xBTlRMX0NiVHlwZSAqcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICAgaWYgKCFwVExDYikKICAgICByZXR1cm47CiAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5ydW5uaW5nID0gZVdMQU5fUEFMX0ZBTFNFOwp9Cgp2b2lkIFdMQU5UTF9TdGFydFJ4UmF0ZU1vbml0b3Iodl9QVk9JRF90IHB2b3NHQ3R4LCB2X1U4X3Qgc3RhSWQsCiAgICAgICAgICAgICAgICAgIHZfVTE2X3QgbWluUmF0ZSwKICAgICAgICAgICAgICAgICAgdl9VMTZfdCBtYXhSYXRlLCB2X1U4X3QgbWluUGVyY2VudGFnZSwKICAgICAgICAgICAgICAgICAgdl9VMTZfdCBtaW5Qa3RSZXF1aXJlZCwgdm9pZCAqaEhhbCwKICAgICAgICAgICAgICAgICAgdl9VNjRfdCB0aW1lVG9XYWl0LAogICAgICAgICAgICAgICAgICB2b2lkICgqdHJpZ2dlclJvYW1TY2FuZm4pICh2b2lkICosIHZfVThfdCkpCnsKCiAgIFdMQU5UTF9DYlR5cGUgKnBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgIGlmICghcFRMQ2IpCiAgICAgcmV0dXJuOwoKICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLnJ1bm5pbmcgPSBlV0xBTl9QQUxfVFJVRTsKICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmluZGV4ID0gMDsKICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmxhc3RUcmlnZ2VyVGltZSA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyk7CiAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5tYXhSYXRlID0gbWF4UmF0ZTsKICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLm1pblJhdGUgPSBtaW5SYXRlOwogICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuc3RhSWQgPSBzdGFJZDsKICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLm1pblBlcmNlbnRhZ2UgPSBtaW5QZXJjZW50YWdlOwogICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMudGltZVRvV2FpdCA9IHRpbWVUb1dhaXQgKiAxMDAwOwogICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuaW50aWFsUGt0VG9TdGFydCA9IDA7CiAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5taW5Qa3RSZXF1aXJlZCA9IG1pblBrdFJlcXVpcmVkOwogICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMudHJpZ2dlclJvYW1TY2FuZm4gPSB0cmlnZ2VyUm9hbVNjYW5mbjsKICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmhIYWwgPSBoSGFsOwogICB2b3NfbWVtX3plcm8ocFRMQ2ItPmdEc1J4Um9hbVN0YXRzLnJ4Um9hbVN0YXRzLCBST0FNX01BWF9JTkRFWF9OVU0gKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihXTEFOVExfUm9hbVRyYWZmaWNTdGF0c1R5cGUpKTsKICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfV0RJLCBWT1NfVFJBQ0VfTEVWRUxfREVCVUcsCiAgICAgICAic3RhSWQ9JWQsIG1pblJhdGU9JWQgbWF4UmF0ZT0lZCBtaW5QZXJjZW50YWdlPSVkIG1pblBrdFJlcXVpcmVkPSVkIiwKICAgICAgIHN0YUlkLCBtaW5SYXRlLCBtYXhSYXRlLCBtaW5QZXJjZW50YWdlLCBtaW5Qa3RSZXF1aXJlZCk7Cn0KCnZvaWQgc3RhdGljIFdMQU5UTF9DbGVhckFsbFJvYW1TdGF0cyhXTEFOVExfQ2JUeXBlICpwVExDYikKewogICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuaW5kZXggPSAwOwogICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMudG90YWxQa3QgPSAwOwogICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMubG93UmF0ZVBrdCA9IDA7CiAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5pbnRpYWxQa3RUb1N0YXJ0ID0gMDsKICAgdm9zX21lbV96ZXJvKHBUTENiLT5nRHNSeFJvYW1TdGF0cy5yeFJvYW1TdGF0cywgUk9BTV9NQVhfSU5ERVhfTlVNICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0xBTlRMX1JvYW1UcmFmZmljU3RhdHNUeXBlKSk7Cn0KCi8qCiAqIFdMQU5UTF9DbGVhclJvYW1TdGF0c1RpbGxJbmRleCA6IFRoaXMgQVBJIHdpbGwgY2xlYXIgb2xkZXIgZGF0YQogKiBhdCB0aGUgaW5kZXhlcy4KICoKICogU2luY2UgaXRzIGEgY2lyY3VsYXIgYnVmZmVyIHdlIGRvbid0IGtub3cgaWYgd2UgYXJlIGZpbGxpbmcKICogZGF0YSBmaXJzdCB0aW1lIG9yIHNvbWUgb2xkZXIgZGF0YSB3YXMgYWxyZWFkeSBwcmVzZW50IGF0CiAqIHRoZSBpbmRleC4gSW4gdGhhdCBjYXNlIHdlIHNob3VsZCBjbGVhciB0aGUgb2xkZXIgZGF0YSBmcm9tCiAqIGN1cnJlbnQgaW5kZXggdG8gbmV3IGluZGV4IGFuZCBzdWJ0cmFjdCB0aGlzIGRhdGEgZnJvbQogKiBnbG9iYWwgY291bnQgYXMgd2VsbCBiZWZvcmUgZmlsbGluZyBuZXcgb25lLgogKi8Kc3RhdGljIGlubGluZSB2b2lkIFdMQU5UTF9DbGVhclJvYW1TdGF0c1RpbGxJbmRleChXTEFOVExfQ2JUeXBlICpwVExDYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfVThfdCBuZXdJbmRleCkKewogICB3aGlsZSAocFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmluZGV4IDwgbmV3SW5kZXgpCiAgIHsKICAgICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuaW5kZXgrKzsKICAgICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMudG90YWxQa3QgLT0KICAgICAgICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLgogICAgICAgICAgICAgcnhSb2FtU3RhdHNbcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmluZGV4XS50b3RhbFBrdFJjdmQ7CiAgICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmxvd1JhdGVQa3QgLT0KICAgICAgICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLgogICAgICAgICAgICAgcnhSb2FtU3RhdHNbcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmluZGV4XS5sb3dSYXRlUnhQYWNrZXRzUmN2ZDsKICAgICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuCiAgICAgICAgIHJ4Um9hbVN0YXRzW3BUTENiLT5nRHNSeFJvYW1TdGF0cy5pbmRleF0udG90YWxQa3RSY3ZkID0gMDsKICAgICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuCiAgICAgICAgIHJ4Um9hbVN0YXRzW3BUTENiLT5nRHNSeFJvYW1TdGF0cy5pbmRleF0ubG93UmF0ZVJ4UGFja2V0c1JjdmQgPSAwOwogICB9Cn0KCgpzdGF0aWMgdm9pZCBXTEFOVExfQ2xlYXJPbGRQRVJTdGF0cyhXTEFOVExfQ2JUeXBlICpwVExDYiwgdl9VOF90IGluY3JlbWVudENudCkKewogICB2X1U4X3QgbmV3SW5kZXg7CgogICBuZXdJbmRleCA9IChwVExDYi0+Z0RzUnhSb2FtU3RhdHMuaW5kZXggKyBpbmNyZW1lbnRDbnQpICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9BTV9NQVhfSU5ERVhfTlVNOwoKICAgLyogV2UgaGF2ZSBjcm9zc2VkIHRoZSBtYXggbGltaXQgb2YgYnVmZmVyLCBjbGVhciB0aGUgc3RhdHMKICAgICogdGlsbCBST0FNX01BWF9JTkRFWF9OVU0gYW5kIHNldCBpbmRleCBhcyAwICovCiAgIGlmICgocFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmluZGV4ICsgaW5jcmVtZW50Q250KSA+PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST0FNX01BWF9JTkRFWF9OVU0pCiAgIHsKICAgICAgIFdMQU5UTF9DbGVhclJvYW1TdGF0c1RpbGxJbmRleChwVExDYiwgUk9BTV9NQVhfSU5ERVhfTlVNIC0gMSk7CiAgICAgICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuaW5kZXggPSAtMTsKICAgfQogICAvKiBDbGVhciB0aGUgc3RhdHMgZnJvbSBjdXJyZW50IGluZGV4IHRpbGwgbmV3IGluZGV4ICovCiAgIFdMQU5UTF9DbGVhclJvYW1TdGF0c1RpbGxJbmRleChwVExDYiwgbmV3SW5kZXgpOwp9CgovKgogKiBUaGlzIEFQSSBpbXBsZW1lbnRzIGEgY2lyY3VsYXIgYnVmZmVyIHRvIHN0b3JlIHJhdGUgc3RhdHMgZm9yIGEgc3RhdGlvbiB0bwogKiB0cmlnZ2VyIFBFUiBiYXNlZCByb2FtIHNjYW4uCiAqIEFQSSB3aWxsIHN0YXJ0IG1vbml0b3Jpbmcgb25seSBpZiBEVVQgZ2V0cyBjb250aW51ZXMgcGFja2V0cyB3aGljaCBhcmUgYmVsb3cKICogY29uZmlndXJlZCByYXRlLiBJbiB0aGUgdXBwZXIgcmF0ZXMsIHRoaXMgc2hvdWxkIGhhdmUgbWluaW1hbCBlZmZlY3Qgb24gZGF0YQogKiB0aHJvdWdocHV0LgogKgogKiBUaGlzIEFQSSB3aWxsIHN0b3JlIHN0YXRzIGluIGEgY2lyY3VsYXIgYnVmZmVyIG9mIHNpemUgUk9BTV9NQVhfSU5ERVhfTlVNCiAqIHdoZXJlIGVhY2ggaW5kZXggd2lsbCBoYXZlIHRpbWUgZHVyYXRpb24gb2YgUk9BTV9QRVJfSU5ERVhfVElNRS4KICogVXNpbmcgYSBidWZmZXIgaW5zdGVhZCBvZiBjb3VudGVyIHdpbGwgaGVscCB0byBtYWludGFpbiBzdGF0cyBvZiB0aW1lCiAqIGR1cmF0aW9uIFJPQU1fUEVSX0lOREVYX1RJTUUgKiBST0FNX01BWF9JTkRFWF9OVU0uIFdoZW5ldmVyIGhvc3QgZ2V0cyBhIG5ldwogKiBwYWNrZXQsIGl0IHdpbGwgcmVtb3ZlIGxhc3QgUk9BTV9QRVJfSU5ERVhfVElNRSBkdXJhdGlvbiBvZiBwYWNrZXRzIGZyb20KICogZ2xvYmFsIGVudHJ5IGFuZCBpbmRleCBlbnRyeSBhbmQgZmlsbCBuZXcgZGF0YS4KICoKICogR2xvYmFsIHN0YXRzIG9mIGRhdGEgYWxzbyBiZSBtYWludGFpbmVkIHNvIHRoYXQgaG9zdCBuZWVkIG5vdCB0byBwYXJzZSB3aG9sZQogKiBidWZmZXIgd2hpbGUgY2hlY2tpbmcgdGhlIHRyaWdnZXIgY29uZGl0aW9uCiAqIEVhY2ggb2YgdGhlIGluZGV4IHdpbGwgYmUgaGF2aW5nIHRoZSBwYWNrZXRzIHN0YXRzIGF0IGR1cmF0aW9uIG9mCiAqIFJPQU1fUEVSX0lOREVYX1RJTUUgZnJvbSB0aGUgZmlyc3QgcGFja2V0IHdoaWNoIGFycml2ZWQgaW4gdGhhdC4KICogR2xvYmFsIGluZGV4IHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgbmV3IGluZGV4IHBvc2l0aW9uIHRvIGZpbGwgb25jZSBob3N0CiAqIGdldHMgYSBwYWNrZXQuCiAqLwpzdGF0aWMgdm9pZCBXTEFOVExfdXBkYXRlUEVSU3RhdHMoV0xBTlRMX0NiVHlwZSAqcFRMQ2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X1U4X3QgcmF0ZUluZGV4KQp7CiAgIHZfVThfdCBpbmNyZW1lbnRDbnQgPSAwOwogICB2X1U2NF90IGN1cnJlbnRUaW1lLCB0aW1lRGlmZmVyZW5jZTsKCiAgIC8qCiAgICAqIEhvc3Qgd2lsbCBzdGFydCBtb25pdG9yaW5nIFJ4IHJhdGVzIG9ubHkgaWYgaXQgZ2V0cwogICAgKiBNSU5fUEtUU19UT19TVEFSVF9NT05USU9SIG51bWJlciBvZiBwa3RzIGNvbnRpbnVvdXNseSBiZWxvdyBtaW4gcmF0ZQogICAgKiBUaGlzIHdpbGwgbWFrZSBzdXJlIHdlIG5ldmVyIGRvIHRoaXMgbXVjaCBwcm9jZXNzaW5nIGluIGhpZ2gKICAgICogcmF0ZXMvdGhyb3VnaHB1dCBjYXNlcwogICAgKi8KCiAgIGlmKHBUTENiLT5nRHNSeFJvYW1TdGF0cy5pbnRpYWxQa3RUb1N0YXJ0IDwgTUlOX1BLVFNfVE9fU1RBUlRfTU9OVElPUikKICAgewogICAgICAgaWYgKGdUTFJhdGVJbmZvW3JhdGVJbmRleF0ucGh5UmF0ZSA8IHBUTENiLT5nRHNSeFJvYW1TdGF0cy5taW5SYXRlKQogICAgICAgICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmludGlhbFBrdFRvU3RhcnQrKzsKICAgICAgIGVsc2UKICAgICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5pbnRpYWxQa3RUb1N0YXJ0ID0gMDsKICAgICAgIHJldHVybjsKICAgfQoKICAgY3VycmVudFRpbWUgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMpOwogICAvKgogICAgKiBzY2FuIHdhcyB0cmlnZ2VyZWQgaW4gbGFzdCB0aW1lVG9XYWl0IHRpbWUgZHVyYXRpb24KICAgICogV2FpdCBmb3IgdGltZVRvV2FpdCBiZWZvcmUgbW9uaXRvcmluZyBhZ2Fpbi4KICAgICovCiAgIGlmKChjdXJyZW50VGltZSAtIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5sYXN0VHJpZ2dlclRpbWUpIDwKICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy50aW1lVG9XYWl0KQogICAgICAgcmV0dXJuOwoKICAgLyogcGFrZXQgYWJvdmUgbWF4IHJhdGUsIGNsZWFyIGN1cnJlbnQgc3RhdHMgYW5kIG1vbnRpb3IgYWdhaW4gKi8KICAgaWYgKGdUTFJhdGVJbmZvW3JhdGVJbmRleF0ucGh5UmF0ZSA+PQogICAgICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5tYXhSYXRlKQogICB7CiAgICAgICBXTEFOVExfQ2xlYXJBbGxSb2FtU3RhdHMocFRMQ2IpOwogICAgICAgLyogU3RvcCBhbnkgUEVSIGJhc2VkIHNjYW4gaWYgZ29pbmcgb24gKi8KICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy4KICAgICAgICAgICAgICAgICAgdHJpZ2dlclJvYW1TY2FuZm4ocFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmhIYWwsIDApOwogICAgICAgcmV0dXJuOwogICB9CgogICB0aW1lRGlmZmVyZW5jZSA9IGN1cnJlbnRUaW1lIC0KICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5yeFJvYW1TdGF0c1twVExDYi0+Z0RzUnhSb2FtU3RhdHMuaW5kZXhdLnRpbWU7CgogICBpZiAodGltZURpZmZlcmVuY2UpCiAgICAgICBpbmNyZW1lbnRDbnQgPSBkb19kaXYodGltZURpZmZlcmVuY2UsIFJPQU1fUEVSX0lOREVYX1RJTUUpOwoKICAgLyogTW9yZSB0aGF0IFJPQU1fUEVSX0lOREVYX1RJTUUgaGFzIGVzY2xhcHNlZCwKICAgICogZmlsbCBkYXRhIGF0IG5ldyBpbmRleCAqLwogICBpZiAoaW5jcmVtZW50Q250KQogICB7CiAgICAgICBpZiAoaW5jcmVtZW50Q250ID4gUk9BTV9NQVhfSU5ERVhfTlVNKQogICAgICAgewogICAgICAgICAgIC8qCiAgICAgICAgICAgICogQ2xlYXIgYWxsIHN0YXRzLCB0aGVzZSBhcmUgb2xkZXIgdGhhbgogICAgICAgICAgICAqIFJPQU1fTUFYX0lOREVYX05VTSAqIFJPQU1fUEVSX0lOREVYX1RJTUUgKE1heCBidWZmZXIgdGltZSkKICAgICAgICAgICAgKi8KICAgICAgICAgICBXTEFOVExfQ2xlYXJBbGxSb2FtU3RhdHMocFRMQ2IpOwogICAgICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5pbmRleCA9IDA7CiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICAgICAgV0xBTlRMX0NsZWFyT2xkUEVSU3RhdHMocFRMQ2IsIGluY3JlbWVudENudCk7CgogICAgICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLnJ4Um9hbVN0YXRzCiAgICAgICAgICAgICAgICAgICAgW3BUTENiLT5nRHNSeFJvYW1TdGF0cy5pbmRleF0udGltZSA9IGN1cnJlbnRUaW1lOwogICB9CgogICAvKiBJZiBwa3QgcmF0ZSBiZWxvdyBtaW5SYXRlLCBpbmNyZW1lbnQgbG93IHBrdHMgY291bnRzICovCiAgIGlmIChnVExSYXRlSW5mb1tyYXRlSW5kZXhdLnBoeVJhdGUgPAogICAgICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5taW5SYXRlKQogICB7CiAgICAgICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuCiAgICAgICAgICAgcnhSb2FtU3RhdHNbcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmluZGV4XS4KICAgICAgICAgICAgICAgbG93UmF0ZVJ4UGFja2V0c1JjdmQrKzsKICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5sb3dSYXRlUGt0Kys7CiAgIH0KICAgLyogSW5jcmVtZW50IHRvdGFsIHBrdHMgY291bnRzICovCiAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy4KICAgICAgICAgICByeFJvYW1TdGF0c1twVExDYi0+Z0RzUnhSb2FtU3RhdHMuaW5kZXhdLnRvdGFsUGt0UmN2ZCsrOwogICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMudG90YWxQa3QrKzsKCiAgIC8qIENoZWNrIGlmIHdlIGhhdmUgcmVhY2hlZCB0aHJlc2hvbGQgdmFsdWUgdG8gdHJpZ2dlciBhIHJvYW0gc2NhbiAqLwogICBpZiAoKHBUTENiLT5nRHNSeFJvYW1TdGF0cy50b3RhbFBrdCAhPSAwKSAmJgogICAgICAgKHBUTENiLT5nRHNSeFJvYW1TdGF0cy50b3RhbFBrdCA+CiAgICAgICAgICAgICAgICBwVExDYi0+Z0RzUnhSb2FtU3RhdHMubWluUGt0UmVxdWlyZWQpJiYKICAgICAgICgocFRMQ2ItPmdEc1J4Um9hbVN0YXRzLmxvd1JhdGVQa3QgKiAxMDApID4KICAgICAgICAgICAgICAgIChwVExDYi0+Z0RzUnhSb2FtU3RhdHMudG90YWxQa3QgKgogICAgICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLm1pblBlcmNlbnRhZ2UpKSkKICAgewogICAgICAgLyogY2FsbGJhY2sgaGFuZGxlciB0byB0cmlnZ2VyIGEgcm9hbSBzY2FuICovCiAgICAgICBpZiAocFRMQ2ItPmdEc1J4Um9hbVN0YXRzLnRyaWdnZXJSb2FtU2NhbmZuKQogICAgICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy4KICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSb2FtU2NhbmZuKHBUTENiLT5nRHNSeFJvYW1TdGF0cy5oSGFsLCAxKTsKCiAgICAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0RFQlVHLAogICAgICAgICAgICJQRVIgUm9hbTogdHJpZ2dlcnJpbmcgcm9hbSBzY2FuIHRvdGFsUGt0ID0lbHUgbG93UmF0ZVBrdCAlbHUgbWluUGt0UmVxdWlyZWQgJXUgbWluUGVyY2VudGFnZSAlZCIsCiAgICAgICAgICAgKGxvbmcgdW5zaWduZWQgaW50KSBwVExDYi0+Z0RzUnhSb2FtU3RhdHMudG90YWxQa3QsCiAgICAgICAgICAgKGxvbmcgdW5zaWduZWQgaW50KSBwVExDYi0+Z0RzUnhSb2FtU3RhdHMubG93UmF0ZVBrdCwKICAgICAgICAgICAodW5zaWduZWQgaW50KSBwVExDYi0+Z0RzUnhSb2FtU3RhdHMubWluUGt0UmVxdWlyZWQsCiAgICAgICAgICAgcFRMQ2ItPmdEc1J4Um9hbVN0YXRzLm1pblBlcmNlbnRhZ2UpOwoKICAgICAgIFdMQU5UTF9DbGVhckFsbFJvYW1TdGF0cyhwVExDYik7CiAgICAgICAvKiAgc2F2ZSBjdXJyZW50IHRpbWUgYXMgbGFzdCB0cmlnZ2VyIHRpbWUgKi8KICAgICAgIHBUTENiLT5nRHNSeFJvYW1TdGF0cy5sYXN0VHJpZ2dlclRpbWUgPSBjdXJyZW50VGltZTsKICAgfQp9CiNlbmRpZgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFSeEF1dGgKCiAgREVTQ1JJUFRJT04KICAgIFJlY2VpdmUgaW4gYXV0aGVudGljYXRlZCBzdGF0ZSAtIGFsbCBkYXRhIGFsbG93ZWQKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgU1RBIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGJlaW5nIHByb2Nlc3NlZAogICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSByeCB2b3MgYnVmZmVyCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVJ4QXV0aAooCiAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYsCiAgdl9CT09MX3QgICAgICBiRm9yd2FyZElBUFB3aXRoTExDCikKewogICBXTEFOVExfQ2JUeXBlKiAgICAgICAgICAgcFRMQ2IgPSBOVUxMOwogICBXTEFOVExfU1RBQ2xpZW50VHlwZSogICAgcENsaWVudFNUQSA9IE5VTEw7CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y0FzZjsgLyogQU1TRFUgc3ViIGZyYW1lICovCiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c01QRFVET2Zmc2V0OwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNNUERVSE9mZnNldDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzTVBEVUxlbjsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW47CiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c0FjdHVhbEhMZW4gPSAwOyAgIAogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNUaWQ7CiNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9TQ0FOX09GRkxPQUQKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHJ4UmF0ZTsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHR5cGU7CiNlbmRpZgojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzRXRoZXJUeXBlID0gMDsKICAgdFNpck1hY01nbXRIZHIgICAgICAgICAgICpoZHI7CiNlbmRpZgogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNQa3RMZW47CiAgIHZvc19wa3RfdCogICAgICAgICAgICAgICB2b3NEYXRhQnVmZiA7CiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICBhdWNCREhlYWRlcjsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgIHZvc1N0YXR1czsKICAgV0xBTlRMX1J4TWV0YUluZm9UeXBlICAgIHdSeE1ldGFJbmZvOwogICBzdGF0aWMgdl9VOF90ICAgICAgICAgICAgdWNQTVBEVUhMZW47CiAgIHZfVTMyX3QqICAgICAgICAgICAgICAgICBTVEFNZXRhSW5mb1B0cjsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjRXNmPTA7IC8qIGZpcnN0IHN1YmZyYW1lIG9mIEFNU0RVIGZsYWcgKi8KICAgdl9VNjRfdCAgICAgICAgICAgICAgICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyPTA7IC8qY3VycmVudCByZXBsYXkgY291bnRlciovCiAgIHZfVTY0X3QgICAgICAgICAgICAgICAgICB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXI9MDsgLypwcmV2aW91cyByZXBsYXkgY291bnRlciovCiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1Y1VuaWNhc3RCcm9hZGNhc3RUeXBlPTA7IC8qSXQgZGVub3RlcyB3aGV0aGVyIHJlY2VpdmVkIGZyYW1lIGlzIFVDIG9yIEJDKi8KICAgc3RydWN0IF9CQVJGcm1TdHJ1Y3QgICAgICpwQmFyRnJhbWUgPSBOVUxMOwoKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkgfHwgKCBOVUxMID09ICggdm9zRGF0YUJ1ZmYgPSAqcHZvc0RhdGFCdWZmICkpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9TVEFSeEF1dGgiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1NUQVJ4QXV0aCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IEJEIGhlYWRlciBhbmQgY2hlY2sgaWYgdmFsaWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBXREFfRFNfUGVla1J4UGFja2V0SW5mbyggdm9zRGF0YUJ1ZmYsICh2X1BWT0lEX3QpJmF1Y0JESGVhZGVyLCAwICk7CgogIHVjTVBEVUhPZmZzZXQgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfT0ZGU0VUKGF1Y0JESGVhZGVyKTsKICB1c01QRFVET2Zmc2V0ID0gKHZfVTE2X3QpV0RBX0dFVF9SWF9NUERVX0RBVEFfT0ZGU0VUKGF1Y0JESGVhZGVyKTsKICB1c01QRFVMZW4gICAgID0gKHZfVTE2X3QpV0RBX0dFVF9SWF9NUERVX0xFTihhdWNCREhlYWRlcik7CiAgdWNNUERVSExlbiAgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4oYXVjQkRIZWFkZXIpOwogIHVjVGlkICAgICAgICAgPSAodl9VOF90KVdEQV9HRVRfUlhfVElEKGF1Y0JESGVhZGVyKTsKI2lmZGVmIFdMQU5fRkVBVFVSRV9ST0FNX1NDQU5fT0ZGTE9BRAogIHJ4UmF0ZSAgICAgICAgPSAodl9VOF90KVdEQV9HRVRfUlhfTUFDX1JBVEVfSURYKGF1Y0JESGVhZGVyKTsKICB0eXBlICAgICAgICAgID0gKHZfVThfdClXREFfR0VUX1JYX1RZUEUoYXVjQkRIZWFkZXIpOwojZW5kaWYKICBwQ2xpZW50U1RBLT5yYXRlX2lkeCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NQUNfUkFURV9JRFgoYXVjQkRIZWFkZXIpOwoKICAvKiBGaXggZm9yIGEgaGFyZHdhcmUgYnVnLiAKICAgKiBIL1cgZG9lcyBub3QgdXBkYXRlIHRoZSB0aWQgZmllbGQgaW4gQkQgaGVhZGVyIGZvciBCQVIgZnJhbWVzLgogICAqIEZpeCBpcyB0byByZWFkIHRoZSB0aWQgZmllbGQgZnJvbSBNQUMgaGVhZGVyIG9mIEJBUiBmcmFtZSAqLwogIGlmKCAoV0RBX0dFVF9SWF9UWVBFKGF1Y0JESGVhZGVyKSA9PSBTSVJfTUFDX0NUUkxfRlJBTUUpICYmCiAgICAgIChXREFfR0VUX1JYX1NVQlRZUEUoYXVjQkRIZWFkZXIpID09IFNJUl9NQUNfQ1RSTF9CQVIpKQogIHsKICAgICAgcEJhckZyYW1lID0gKHN0cnVjdCBfQkFSRnJtU3RydWN0ICopKFdEQV9HRVRfUlhfTUFDX0hFQURFUihhdWNCREhlYWRlcikpOwogICAgICB1Y1RpZCA9IHBCYXJGcmFtZS0+YmFyQ29udHJvbC5udW1USUQ7CiAgfQoKICAvKkhvc3QgYmFzZWQgcmVwbGF5IGNoZWNrIGlzIG5lZWRlZCBmb3IgdW5pY2FzdCBkYXRhIGZyYW1lcyovCiAgdWNVbmljYXN0QnJvYWRjYXN0VHlwZSAgPSAodl9VMTZfdClXREFfSVNfUlhfQkNBU1QoYXVjQkRIZWFkZXIpOwogIGlmKDAgIT0gdWNNUERVSExlbikKICB7CiAgICB1Y1BNUERVSExlbiA9IHVjTVBEVUhMZW47CiAgfQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIHByb2Nlc3NpbmcgZGF0YTogSE8gJWQgRE8gJWQgTGVuICVkIEhMZW4gJWQiCiAgICAgICAgICAgICAiIFRpZCAlZCBCRCAlZCIsCiAgICAgICAgICAgICB1Y01QRFVIT2Zmc2V0LCB1c01QRFVET2Zmc2V0LCB1c01QRFVMZW4sIHVjTVBEVUhMZW4sIHVjVGlkLAogICAgICAgICAgICAgV0xBTkhBTF9SWF9CRF9IRUFERVJfU0laRSkpOwoKICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKCB2b3NEYXRhQnVmZiwgJnVzUGt0TGVuKTsKCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0RBX0RTX1RyaW1SeFBhY2tldEluZm8oIHZvc0RhdGFCdWZmICkgKQogIHsKICAgIGlmKChXREFfR0VUX1JYX0FTRihhdWNCREhlYWRlcikgJiYgIVdEQV9HRVRfUlhfRVNGKGF1Y0JESGVhZGVyKSkpCiAgewogICAgLyogQU1TRFUgY2FzZSwgdWNNUERVSE9mZnNldCA9IDAKICAgICAqIGl0IHNob3VsZCBiZSBoYW5jZGxlZCBzZXBlcmF0bHkgKi8KICAgIGlmKCggdXNNUERVRE9mZnNldCA+ICB1Y01QRFVIT2Zmc2V0ICkgJiYKICAgICAgICggdXNNUERVTGVuICAgICA+PSB1Y01QRFVITGVuICkgJiYgKCB1c1BrdExlbiA+PSB1c01QRFVMZW4gKSAmJgogICAgICAgKCAhV0xBTlRMX1RJRF9JTlZBTElEKHVjVGlkKSApKQogICAgewogICAgICAgIHVjTVBEVUhPZmZzZXQgPSB1c01QRFVET2Zmc2V0IC0gV0xBTlRMX01QRFVfSEVBREVSX0xFTjsgCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpCRCBoZWFkZXIgY29ycnVwdGVkIC0gZHJvcHBpbmcgcGFja2V0IikpOwogICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogICAgfQogIH0KICBlbHNlCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAiV0xBTiBUTDpCRCBoZWFkZXIgY29ycnVwdGVkIC0gZHJvcHBpbmcgcGFja2V0IikpOwogICAgLyogRHJvcCBwYWNrZXQgKi8KICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogIH0KICB9CgojaWZkZWYgV0xBTl9GRUFUVVJFX1JNQwogIGlmIChwVExDYi0+bXVsdGljYXN0RHVwbGljYXRlRGV0ZWN0aW9uRW5hYmxlZCAmJgogICAgICAoV0xBTl9TVEFfSUJTUyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkgJiYKICAgICAgIFdMQU5UTF9JU19EQVRBX0ZSQU1FKFdEQV9HRVRfUlhfVFlQRV9TVUJUWVBFKGF1Y0JESGVhZGVyKSkpCiAgewogICAgLyoKICAgICAqIE11bHRpY2FzdCBkdXBsaWNhdGUgZGV0ZWN0aW9uIGlzIG9ubHkgZm9yIGZyYW1lcyByZWNlaXZlZCBpbgogICAgICogSUJTUyBtb2RlLgogICAgICovCiAgICBpZiAoVk9TX1RSVUUgPT0gV0xBTlRMX0lzRHVwbGljYXRlTWNhc3RGcm0ocENsaWVudFNUQSwgdm9zRGF0YUJ1ZmYpKQogICAgewogICAgICAgICBwVExDYi0+bWNhc3REdXBDbnQrKzsKICAgICAgICAgLyogRHVwbGljYXRlIG11bHRpY2FzdCBkYXRhIHBhY2tldCwgZHJvcCB0aGUgcGFja2V0ICovCiAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICB9CiAgfQojZW5kaWYgLyogV0xBTl9GRUFUVVJFX1JNQyAqLwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgaWYgKCBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0lzV2FwaVN0YSApCiAgewogICAgdm9zU3RhdHVzID0gV0xBTlRMX0dldEV0aGVyVHlwZShhdWNCREhlYWRlciwgdm9zRGF0YUJ1ZmYsIHVjTVBEVUhMZW4sICZ1c0V0aGVyVHlwZSk7CiAgICBpZiggVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykgKQogICAgewogICAgICBpZiAoIFdMQU5UTF9MTENfV0FJX1RZUEUgID09IHVzRXRoZXJUeXBlICkKICAgICAgewogICAgICAgIGhkciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUihhdWNCREhlYWRlcik7CiAgICAgICAgaWYgKCBoZHItPmZjLndlcCApCiAgICAgICAgewogICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpXQUkgZnJhbWUgd2FzIHJlY2VpdmVkIGVuY3J5cHRlZCAtIGRyb3BwaW5nIikpOwogICAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICAgIC8qVGVtcG9yYXJ5IGZpeCBhZGRlZCB0byBmaXggd2FwaSByZWtleSBpc3N1ZSovCiAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsgLy9yZXR1cm5pbmcgc3VjY2VzcwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBpZiAoICBXTEFOSEFMX1JYX0lTX1VOUFJPVEVDVEVEX1dQSV9GUkFNRShhdWNCREhlYWRlcikgKSAKICAgICAgICB7CiAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOk5vbi1XQUkgZnJhbWUgd2FzIHJlY2VpdmVkIHVuZW5jcnlwdGVkIC0gZHJvcHBpbmciKSk7CiAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsgCiAgICAgICAgICByZXR1cm4gdm9zU3RhdHVzOyAvL3JldHVybmluZyBzdWNjZXNzCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBlbHNlIC8vY291bGQgbm90IGV4dHJhY3QgRXRoZXJUeXBlIC0gdGhpcyBzaG91bGQgbm90IGhhcHBlbgogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q291bGQgbm90IGV4dHJhY3QgRXRoZXJUeXBlIikpOwogICAgICAvL1BhY2tldCBpcyBhbHJlYWR5IGZyZWVkCiAgICAgIHJldHVybiB2b3NTdGF0dXM7IC8vcmV0dXJuaW5nIGZhaWx1cmUKICAgIH0KICB9CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEluY3JlbWVudCByZWNlaXZlIGNvdW50ZXIKICAgICEhIG5vdCBzdXJlIHRoaXMgaXMgdGhlIGJlc3QgcGxhY2UgdG8gaW5jcmVhc2UgdGhpcyAtIHBrdCBtaWdodCBiZQogICAgZHJvcHBlZCBiZWxvdyBvciBkZWxheWVkIGluIFRMJ3MgcXVldWVzCiAgICAtIHdpbGwgbGVhdmUgaXQgaGVyZSBmb3Igbm93CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAhV0xBTlRMX1RJRF9JTlZBTElEKCB1Y1RpZCkgKSAKICB7CiAgICBwQ2xpZW50U1RBLT5hdVJ4Q291bnRbdWNUaWRdKys7CiAgfQogIGVsc2UKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCB0aWQgICVkIChTdGF0aW9uIElEICVkKSBvbiAlcyIsCiAgICAgICAgICAgdWNUaWQsIHVjU1RBSWQsIF9fZnVuY19fKSk7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiNpZmRlZiBXTEFOX0ZFQVRVUkVfUk9BTV9TQ0FOX09GRkxPQUQKICBpZiAocFRMQ2ItPmdEc1J4Um9hbVN0YXRzLnJ1bm5pbmcgJiYKICAgICAodWNTVEFJZCA9PSBwVExDYi0+Z0RzUnhSb2FtU3RhdHMuc3RhSWQpICYmCiAgICAgKHJ4UmF0ZSA8IFdMQU5UTF9NQVhfUkFURV9OVU0pICYmICh0eXBlID09IFNJUl9NQUNfREFUQV9GUkFNRSkpCiAgewogICAgICBXTEFOVExfdXBkYXRlUEVSU3RhdHMocFRMQ2IsIHJ4UmF0ZSk7CiAgfQojZW5kaWYKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgQU1TRFUgYW5kIHNlbmQgZm9yIHByb2Nlc3NpbmcgaWYgc28KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y0FzZiA9ICh2X1U4X3QpV0RBX0dFVF9SWF9BU0YoYXVjQkRIZWFkZXIpOwoKICBpZiAoIDAgIT0gdWNBc2YgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOlBhY2tldCBpcyBBTVNEVSBzdWIgZnJhbWUgLSBzZW5kaW5nIGZvciBjb21wbGV0aW9uIikpOwogICAgdm9zU3RhdHVzID0gV0xBTlRMX0FNU0RVUHJvY2VzcyggcHZvc0dDdHgsICZ2b3NEYXRhQnVmZiwgYXVjQkRIZWFkZXIsIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCB1c01QRFVMZW4gKTsKICAgIGlmKE5VTEwgPT0gdm9zRGF0YUJ1ZmYpCiAgICB7CiAgICAgICAvL1BhY2tldCBpcyBhbHJlYWR5IGZyZWVkCiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogICAgfQogIH0KICAvKiBBZnRlciBBTVNEVSBoZWFkZXIgaGFuZGxlZAogICAqIEFNU0RVIGZyYW1lIGp1c3Qgc2FtZSB3aXRoIG5vcm1hbCBmcmFtZXMgKi8KICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBUcmFuc2xhdGluZyBoZWFkZXIgaWYgbmVjZXNhcnkKICAgICAgICEhIEZpeCBtZTogcm12IGNvbW1lbnRzIGJlbG93CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoKCAwID09IFdEQV9HRVRfUlhfRlRfRE9ORShhdWNCREhlYWRlcikgKSAmJgogICAgICAoIDAgIT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uKSAmJgogICAgICAoIFdMQU5UTF9JU19EQVRBX0ZSQU1FKFdEQV9HRVRfUlhfVFlQRV9TVUJUWVBFKGF1Y0JESGVhZGVyKSkgKSkKICB7CiAgICBpZigwID09IHVjTVBEVUhMZW4pCiAgICB7CiAgICAgIHVjTVBEVUhMZW4gPSB1Y1BNUERVSExlbjsKICAgIH0KICAgIGlmICh1c01QRFVET2Zmc2V0ID4gdWNNUERVSE9mZnNldCkKICAgIHsKICAgICAgdXNBY3R1YWxITGVuID0gdXNNUERVRE9mZnNldCAtIHVjTVBEVUhPZmZzZXQ7CiAgICB9CiAgICB2b3NTdGF0dXMgPSBXTEFOVExfVHJhbnNsYXRlODAyMTFUbzgwMjNIZWFkZXIoIHZvc0RhdGFCdWZmLCAmdm9zU3RhdHVzLCB1c0FjdHVhbEhMZW4sIAogICAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCBwVExDYiwgdWNTVEFJZCwgYkZvcndhcmRJQVBQd2l0aExMQyk7CgogICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB0byB0cmFuc2xhdGUgZnJvbSA4MDIuMTEgdG8gODAyLjMgLSBkcm9wcGluZyIpKTsKICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICAgfQogICAgfQogICAgLyogU29mdGFwIHJlcXVpcmVzIGFkZGl0aW9uYWwgSW5mbyBzdWNoIGFzIERlc3RpbmF0aW9uIFNUQUlEIGFuZCBBY2Nlc3MKICAgICAgIENhdGVnb3J5LiBWb3NjaGFpbiBvciBCdWZmZXIgcmV0dXJuZWQgYnkgQkEgd291bGQgYmUgdW5jaGFpbiBhbmQgdGhpcwogICAgICAgTWV0YSBEYXRhIHdvdWxkIGhlbHAgaW4gcm91dGluZyB0aGUgcGFja2V0cyB0byBhcHByb3ByaWF0ZSBEZXN0aW5hdGlvbiAqLwogICAgaWYoIFdMQU5fU1RBX1NPRlRBUCA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkKICAgIHsKICAgICAgIFNUQU1ldGFJbmZvUHRyID0gKHZfVTMyX3QgKikodWludHB0cl90KSh1Y1RpZCB8IChXREFfR0VUX1JYX0FERFIzX0lEWChhdWNCREhlYWRlcikgPDwgV0xBTlRMX1NUQUlEX09GRlNFVCkpOwogICAgICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KVNUQU1ldGFJbmZvUHRyKTsKICAgIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIHRvIHNlZSBpZiByZS1vcmRlcmluZyBzZXNzaW9uIGlzIGluIHBsYWNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAwICE9IHBDbGllbnRTVEEtPmF0bEJBUmVvcmRlckluZm9bdWNUaWRdLnVjRXhpc3RzICkKICB7CiAgICBXTEFOVExfTVNEVVJlb3JkZXIoIHBUTENiLCAmdm9zRGF0YUJ1ZmYsIGF1Y0JESGVhZGVyLCB1Y1NUQUlkLCB1Y1RpZCApOwogIH0KCmlmKFdMQU5UTF9JU19EQVRBX0ZSQU1FKFdEQV9HRVRfUlhfVFlQRV9TVUJUWVBFKGF1Y0JESGVhZGVyKSkgJiYKICAgKDAgPT0gdWNVbmljYXN0QnJvYWRjYXN0VHlwZSkKI2lmZGVmIEZFQVRVUkVfT05fQ0hJUF9SRU9SREVSSU5HCiAgICYmIChXTEFOSEFMX0lzT25DaGlwUmVvcmRlcmluZ0VuYWJsZWRGb3JUSUQocHZvc0dDdHgsIHVjU1RBSWQsIHVjVGlkKSAhPSBUUlVFKQojZW5kaWYKKQp7CiAgLyogcmVwbGF5IGNoZWNrIGNvZGUgOiBjaGVjayB3aGV0aGVyIHJlcGxheSBjaGVjayBpcyBuZWVkZWQgb3Igbm90ICovCiAgaWYoVk9TX1RSVUUgPT0gcENsaWVudFNUQS0+dWNJc1JlcGxheUNoZWNrVmFsaWQpCiAgewogICAgICAvKiByZXBsYXkgY2hlY2sgaXMgbmVlZGVkIGZvciB0aGUgc3RhdGlvbiAqLwoKICAgICAgLyogY2hlY2sgd2hldGhlciBmcmFtZSBpcyBBTVNEVSBmcmFtZSAqLwogICAgICBpZiAoIDAgIT0gdWNBc2YgKQogICAgICB7CiAgICAgICAgICAvKiBTaW5jZSB2aXJnbyBjYW4ndCBzZW5kIEFNU0RVIGZyYW1lcyB0aGlzIGxlZyBvZiB0aGUgY29kZSAKICAgICAgICAgICAgIHdhcyBub3QgdGVzdGVkIHByb3Blcmx5LCBpdCBuZWVkcyB0byBiZSB0ZXN0ZWQgcHJvcGVybHkqLwogICAgICAgICAgLyogRnJhbWUgaXMgQU1TRFUgZnJhbWUuIEFzIHBlciA4MDIuMTFuIG9ubHkgZmlyc3QKICAgICAgICAgICAgIHN1YmZyYW1lIHdpbGwgaGF2ZSByZXBsYXkgY291bnRlciAqLwogICAgICAgICAgdWNFc2YgPSAgV0RBX0dFVF9SWF9FU0YoIGF1Y0JESGVhZGVyICk7CiAgICAgICAgICBpZiggMCAhPSB1Y0VzZiApCiAgICAgICAgICB7CiAgICAgICAgICAgICAgdl9CT09MX3Qgc3RhdHVzOwogICAgICAgICAgICAgIC8qIEdldHRpbmcgNDgtYml0IHJlcGxheSBjb3VudGVyIGZyb20gdGhlIFJYIEJEICovCiAgICAgICAgICAgICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSBXREFfRFNfR2V0UmVwbGF5Q291bnRlcihhdWNCREhlYWRlcik7CiAKICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiV0xBTiBUTDogQU1TRFUgY3VycmVudFJlcGxheUNvdW50ZXIgWzB4JWxsWF0iLHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKTsKICAgICAgICAgICAgICAKICAgICAgICAgICAgICAvKiBHZXR0aW5nIDQ4LWJpdCBwcmV2aW91cyByZXBsYXkgY291bnRlciBmcm9tIFRMIGNvbnRyb2wgIGJsb2NrICovCiAgICAgICAgICAgICAgdWxscHJldmlvdXNSZXBsYXlDb3VudGVyID0gcENsaWVudFNUQS0+dWxsUmVwbGF5Q291bnRlclt1Y1RpZF07CgogICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBBTVNEVSBwcmV2aW91c1JlcGxheUNvdW50ZXIgWzB4JWxsWF0iLHVsbHByZXZpb3VzUmVwbGF5Q291bnRlcik7CgogICAgICAgICAgICAgIC8qIEl0IGlzIGZpcnN0IHN1YmZyYW1lIG9mIEFNU0RVIHRodXMgaXQKICAgICAgICAgICAgICAgICBjb25hdGFpbnMgcmVwbGF5IGNvdW50ZXIgcGVyZm9ybSB0aGUKICAgICAgICAgICAgICAgICByZXBsYXkgY2hlY2sgZm9yIHRoaXMgZmlyc3Qgc3ViZnJhbWUqLwogICAgICAgICAgICAgIHN0YXR1cyA9ICBXTEFOVExfSXNSZXBsYXlQYWNrZXQoIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyLCB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIpOwogICAgICAgICAgICAgIGlmKFZPU19GQUxTRSA9PSBzdGF0dXMpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgLyogTm90IGEgcmVwbGF5IHBha2V0LCB1cGRhdGUgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXIgaW4gVEwgQ0IgKi8gICAgCiAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51bGxSZXBsYXlDb3VudGVyW3VjVGlkXSA9IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IEFNU0RVIERyb3AgdGhlIHJlcGxheSBwYWNrZXQgd2l0aCBQTiA6IFsweCVsbFhdIix1bGxjdXJyZW50UmVwbGF5Q291bnRlcik7CgogICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkKys7CiAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogQU1TRFUgdG90YWwgZHJvcHBlZCByZXBsYXkgcGFja2V0cyBvbiBTVEEgSUQgJVggaXMgWzB4JVhdIiwKICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgIHBDbGllbnRTVEEtPnVsVG90YWxSZXBsYXlQYWNrZXRzRGV0ZWN0ZWQpOwoKICAgICAgICAgICAgICAgICAgLyogRHJvcCB0aGUgcGFja2V0ICovCiAgICAgICAgICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICAgICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAgIHZfQk9PTF90IHN0YXR1czsKCiAgICAgICAgICAgLyogR2V0dGluZyA0OC1iaXQgcmVwbGF5IGNvdW50ZXIgZnJvbSB0aGUgUlggQkQgKi8KICAgICAgICAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA9IFdEQV9EU19HZXRSZXBsYXlDb3VudGVyKGF1Y0JESGVhZGVyKTsKCiAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICJXTEFOIFRMOiBOb24tQU1TRFUgY3VycmVudFJlcGxheUNvdW50ZXIgWzB4JWxsWF0iLHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKTsKCiAgICAgICAgICAgLyogR2V0dGluZyA0OC1iaXQgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXIgZnJvbSBUTCBjb250cm9sICBibG9jayAqLwogICAgICAgICAgIHVsbHByZXZpb3VzUmVwbGF5Q291bnRlciA9IHBDbGllbnRTVEEtPnVsbFJlcGxheUNvdW50ZXJbdWNUaWRdOwoKICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiV0xBTiBUTDogTm9uLUFNU0RVIHByZXZpb3VzUmVwbGF5Q291bnRlciBbMHglbGxYXSIsdWxscHJldmlvdXNSZXBsYXlDb3VudGVyKTsKCiAgICAgICAgICAgLyogSXQgaXMgbm90IEFNU0RVIGZyYW1lIHNvIHBlcmZvcm0gCiAgICAgICAgICAgICAgcmVhcGx5IGNoZWNrIGZvciBlYWNoIHBhY2tldCwgYXMKICAgICAgICAgICAgICBlYWNoIHBhY2tldCBjb250YWlucyB2YWxpZCByZXBsYXkgY291bnRlciovCiAgICAgICAgICAgaWYgKHZvc0RhdGFCdWZmICE9IE5VTEwpIHsKICAgICAgICAgICAgICBpZiAodm9zX2lzX3BrdF9jaGFpbih2b3NEYXRhQnVmZikpIHsKICAgICAgICAgICAgICAgICBXTEFOVExfUmVvcmRlclJlcGxheUNoZWNrKHBDbGllbnRTVEEsICZ2b3NEYXRhQnVmZiwgdWNUaWQpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gIFdMQU5UTF9Jc1JlcGxheVBhY2tldCh1bGxjdXJyZW50UmVwbGF5Q291bnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsbHByZXZpb3VzUmVwbGF5Q291bnRlcik7CiAgICAgICAgICAgICAgICAgaWYoVk9TX0ZBTFNFID09IHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgIC8qIE5vdCBhIHJlcGxheSBwYWtldCwgdXBkYXRlIHByZXZpb3VzIHJlcGxheSBjb3VudGVyIGluIFRMIENCICovCiAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+dWxsUmVwbGF5Q291bnRlclt1Y1RpZF0gPSB1bGxjdXJyZW50UmVwbGF5Q291bnRlcjsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IE5vbiBBTVNEVSBEcm9wIHJlcGxheSBwYWNrZXQgd2l0aCBQTjogWzB4JWxsWF0sIHByZXZQTjogWzB4JWxseF0iLAogICAgICAgICAgICAgICAgICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyLCB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIpOwoKICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkKys7CiAgICAgICAgICAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IE5vbiBBTVNEVSB0b3RhbCBkcm9wcGVkIHJlcGxheSBwYWNrZXRzIG9uIFNUQSBJRCAlWCBpcyBbMHglWF0iLAogICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsICBwQ2xpZW50U1RBLT51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkKTsKCiAgICAgICAgICAgICAgICAgICAgLyogUmVwYWx5IHBhY2tldCwgZHJvcCB0aGUgcGFja2V0ICovCiAgICAgICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0KICAgfQp9CgovKkl0IGlzIGEgYnJvYWRhc3QgcGFja2V0IERQVSBoYXMgYWxyZWFkeSBkb25lIHJlcGxheSBjaGVjayBmb3IgCiAgYnJvYWRjYXN0IHBhY2tldHMgbm8gbmVlZCB0byBkbyByZXBsYXkgY2hlY2sgb2YgdGhlc2UgcGFja2V0cyovCgogIGlmICggTlVMTCAhPSB2b3NEYXRhQnVmZiApCiAgewogICAgaWYoIFdMQU5fU1RBX1NPRlRBUCA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkKICAgIHsKICAgICAgV0xBTlRMX0Z3ZFBrdFRvSEREKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsIHVjU1RBSWQgKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgd1J4TWV0YUluZm8udWNVUCA9IHVjVGlkOwogICAgICB3UnhNZXRhSW5mby5yc3NpQXZnID0gcENsaWVudFNUQS0+cnNzaUF2ZzsKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgICAgIGlmIChXTEFOX1NUQV9URExTID09IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlKQogICAgICB7CiAgICAgICAgICB3UnhNZXRhSW5mby5pc1N0YVRkbHMgPSBUUlVFOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAgd1J4TWV0YUluZm8uaXNTdGFUZGxzID0gRkFMU0U7CiAgICAgIH0KI2VuZGlmCiAgICAgIHBDbGllbnRTVEEtPnBmblNUQVJ4KCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndSeE1ldGFJbmZvICk7CiAgICB9CiAgfS8qIGlmIG5vdCBOVUxMICovCgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU1RBUnhBdXRoICovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFSeERpc2MKCiAgREVTQ1JJUFRJT04KICAgIFJlY2VpdmUgaW4gZGlzY29ubmVjdGVkIHN0YXRlIC0gbm8gZGF0YSBhbGxvd2VkCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFNUQSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgcnggdm9zIGJ1ZmZlcgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TVEFSeERpc2MKKAogIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICB1Y1NUQUlkLAogIHZvc19wa3RfdCoqICAgcHZvc0RhdGFCdWZmLAogIHZfQk9PTF90ICAgICAgYkZvcndhcmRJQVBQd2l0aExMQwopCnsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkgfHwgKCBOVUxMID09ICAqcHZvc0RhdGFCdWZmICkpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1NUQVJ4RGlzYyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXJyb3IgLSBkcm9wIHBhY2tldAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOlBhY2tldCBzaG91bGQgbm90IGJlIHJlY2VpdmVkIGluIHN0YXRlIGRpc2Nvbm5lY3RlZCIKICAgICAgICAgICAgICIgLSBkcm9wcGluZyIpKTsKICB2b3NfcGt0X3JldHVybl9wYWNrZXQoKnB2b3NEYXRhQnVmZik7CiAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU1RBUnhEaXNjICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIFByb2Nlc3NpbmcgbWFpbiBsb29wcyBmb3IgTUFJTiBhbmQgVFggdGhyZWFkcwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfTWNQcm9jZXNzTXNnCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgVk9TUyB3aGVuIGEgbWVzc2FnZSB3YXMgc2VyaWFsaXplZCBmb3IgVEwgdGhyb3VnaCB0aGUKICAgIG1haW4gdGhyZWFkL3Rhc2suCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIG1lc3NhZ2U6ICAgICAgICB0eXBlIGFuZCBjb250ZW50IG9mIHRoZSBtZXNzYWdlCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9NY1Byb2Nlc3NNc2cKKAogIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgsCiAgdm9zX21zZ190KiAgICAgICBtZXNzYWdlCikKewogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogICB0QWRkQkFJbmQqICAgICAgcHRBZGRCYUluZCA9IE5VTEw7CiAgIHREZWxCQUluZCogICAgICBwdERlbEJhSW5kID0gTlVMTDsKICAgdEFkZEJBUnNwKiAgICAgIHB0QWRkQmFSc3AgPSBOVUxMOwogICB2b3NfbXNnX3QgICAgICAgdm9zTWVzc2FnZTsKICAgVk9TX1NUQVRVUyAgICAgIHZvc1N0YXR1czsKICAgdHBGbHVzaEFDUnNwIEZsdXNoQUNSc3BQdHI7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gbWVzc2FnZSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9Qcm9jZXNzTWFpbk1lc3NhZ2UiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1Byb2Nlc3NNYWluTWVzc2FnZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICJXTEFOIFRMOlJlY2VpdmVkIG1lc3NhZ2U6ICVkIHRocm91Z2ggbWFpbiBmbG93IiwgbWVzc2FnZS0+dHlwZSkpOwoKICBzd2l0Y2goIG1lc3NhZ2UtPnR5cGUgKQogIHsKICBjYXNlIFdEQV9UTF9GTFVTSF9BQ19SU1A6CiAgICAvLyBFeHRyYWN0IHRoZSBtZXNzYWdlIGZyb20gdGhlIG1lc3NhZ2UgYm9keQogICAgRmx1c2hBQ1JzcFB0ciA9ICh0cEZsdXNoQUNSc3ApKG1lc3NhZ2UtPmJvZHlwdHIpOwogICAgLy8gTWFrZSBzdXJlIHRoZSBjYWxsIGJhY2sgZnVuY3Rpb24gaXMgbm90IG51bGwuCiAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnBmbkZsdXNoT3BDb21wbGV0ZUNiICkKICAgIHsKICAgICAgVk9TX0FTU0VSVCgwKTsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIHBmbkZsdXNoT3BDb21wbGV0ZUNiIikpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfQoKICAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgIlJlY2VpdmVkIG1lc3NhZ2U6ICBGbHVzaCBjb21wbGV0ZSByZWNlaXZlZCBieSBUTCIpKTsKCiAgICAvLyBTaW5jZSB3ZSBoYXZlIHRoZSByZXNwb25zZSBiYWNrIGZyb20gSEFMLCBqdXN0IGNhbGwgdGhlIEJBUCBjbGllbnQKICAgIC8vIHJlZ2lzdGVyZWQgY2FsbCBiYWNrIGZyb20gVEwuIFRoZXJlIGlzIG9ubHkgMSBwb3NzaWJsZQogICAgLy8gQkFQIGNsaWVudC4gU28gZGlyZWN0bHkgcmVmZXJlbmNlIHRsQkFQQ2xpZW50CiAgICBwVExDYi0+dGxCQVBDbGllbnQucGZuRmx1c2hPcENvbXBsZXRlQ2IoIHB2b3NHQ3R4LAogICAgICAgICAgICBGbHVzaEFDUnNwUHRyLT51Y1NUQUlkLAogICAgICAgICAgICBGbHVzaEFDUnNwUHRyLT51Y1RpZCwgRmx1c2hBQ1JzcFB0ci0+c3RhdHVzICk7CgogICAgLy8gRnJlZSB0aGUgUEFMIG1lbW9yeSwgd2UgYXJlIGRvbmUgd2l0aCBpdC4KICAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAiRmx1c2ggY29tcGxldGUgcmVjZWl2ZWQgYnkgVEw6IEZyZWVpbmcgJXBLIiwgRmx1c2hBQ1JzcFB0cikpOwogICAgdm9zX21lbV9mcmVlKCh2X1ZPSURfdCAqKUZsdXNoQUNSc3BQdHIpOwogICAgYnJlYWs7CgogIGNhc2UgV0RBX0hERF9BRERCQV9SRVE6CiAgIHB0QWRkQmFJbmQgPSAodEFkZEJBSW5kKikobWVzc2FnZS0+Ym9keXB0cik7CiAgICB2b3NTdGF0dXMgPSBXTEFOVExfQmFTZXNzaW9uQWRkKCBwdm9zR0N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRBZGRCYUluZC0+YmFTZXNzaW9uLmJhU2Vzc2lvbklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRBZGRCYUluZC0+YmFTZXNzaW9uLlNUQUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRBZGRCYUluZC0+YmFTZXNzaW9uLmJhVElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9VMzJfdClwdEFkZEJhSW5kLT5iYVNlc3Npb24uYmFCdWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdEFkZEJhSW5kLT5iYVNlc3Npb24ud2luU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRBZGRCYUluZC0+YmFTZXNzaW9uLlNTTik7CiAgICBwdEFkZEJhUnNwID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKCpwdEFkZEJhUnNwKSk7CgogICAgaWYgKCBOVUxMID09IHB0QWRkQmFSc3AgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDogZmF0YWwgZmFpbHVyZSwgY2Fubm90IGFsbG9jYXRlIEJBIFJzcCBzdHJ1Y3R1cmUiKSk7CiAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CiAgICB9CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICJXTEFOIFRMOiBTZW5kaW5nIHN1Y2Nlc3MgaW5kaWNhdGlvbiB0byBIQUwgZm9yIEFERCBCQSIpKTsKICAgICAgLypTZW5kIHN1Y2Nlc3MqLwogICAgICBwdEFkZEJhUnNwLT5tZXNnVHlwZSAgICA9IFdEQV9IRERfQUREQkFfUlNQOwogICAgICB2b3NNZXNzYWdlLnR5cGUgICAgICAgICA9IFdEQV9IRERfQUREQkFfUlNQOwogICAgfQogICAgZWxzZQogICAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJXTEFOIFRMOiBTZW5kaW5nIGZhaWx1cmUgaW5kaWNhdGlvbiB0byBIQUwgZm9yIEFERCBCQSIpKTsKCiAgICAgIC8qU2VuZCBmYWlsdXJlKi8KICAgICAgcHRBZGRCYVJzcC0+bWVzZ1R5cGUgICAgPSBXREFfQkFfRkFJTF9JTkQ7CiAgICAgIHZvc01lc3NhZ2UudHlwZSAgICAgICAgID0gV0RBX0JBX0ZBSUxfSU5EOwogICAgfQoKICAgIHB0QWRkQmFSc3AtPm1lc2dMZW4gICAgID0gc2l6ZW9mKHRBZGRCQVJzcCk7CiAgICBwdEFkZEJhUnNwLT5iYVNlc3Npb25JRCA9IHB0QWRkQmFJbmQtPmJhU2Vzc2lvbi5iYVNlc3Npb25JRDsKICAgICAgLyogVGhpcyBpcyBkZWZhdWx0LCByZXBseSB3aW4gc2l6ZSBoYXMgdG8gYmUgaGFuZGxlZCBCQSBtb2R1bGUsIEZJWCBUSElTICovCiAgICAgIHB0QWRkQmFSc3AtPnJlcGx5V2luU2l6ZSA9IFdMQU5UTF9NQVhfV0lOU0laRTsKICAgIHZvc01lc3NhZ2UuYm9keXB0ciA9IHB0QWRkQmFSc3A7CgogICAgdm9zX21xX3Bvc3RfbWVzc2FnZSggVk9TX01RX0lEX1dEQSwgJnZvc01lc3NhZ2UgKTsKICAgIFdMQU5UTF9NY0ZyZWVNc2cgKHB2b3NHQ3R4LCBtZXNzYWdlKTsKICBicmVhazsKICBjYXNlIFdEQV9ERUxFVEVCQV9JTkQ6CiAgICBwdERlbEJhSW5kID0gKHREZWxCQUluZCopKG1lc3NhZ2UtPmJvZHlwdHIpOwogICAgdm9zU3RhdHVzICA9IFdMQU5UTF9CYVNlc3Npb25EZWwocHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0RGVsQmFJbmQtPnN0YUlkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHREZWxCYUluZC0+YmFUSUQpOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIGRlbCBCQSBzZXNzaW9uIFNUQTolZCBUSUQ6JWQgU3RhdHVzIDolZCIsCiAgICAgICAgICAgICAgIHB0RGVsQmFJbmQtPnN0YUlkeCwKICAgICAgICAgICAgICAgcHREZWxCYUluZC0+YmFUSUQsCiAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwogICAgfQogICAgV0xBTlRMX01jRnJlZU1zZyAocHZvc0dDdHgsIG1lc3NhZ2UpOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIC8qbm8gcHJvY2Vzc2luZyBmb3Igbm93Ki8KICAgIGJyZWFrOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9Qcm9jZXNzTWFpbk1lc3NhZ2UgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfTWNGcmVlTXNnCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgVk9TUyB0byBmcmVlIGEgZ2l2ZW4gVEwgbWVzc2FnZSBvbiB0aGUgTWFpbiB0aHJlYWQgd2hlbiB0aGVyZQogICAgYXJlIG1lc3NhZ2VzIHBlbmRpbmcgaW4gdGhlIHF1ZXVlIHdoZW4gdGhlIHdob2xlIHN5c3RlbSBpcyBiZWVuIHJlc2V0LgogICAgRm9yIG5vdywgVEwgZG9lcyBub3QgYWxsb2NhdGUgYW55IGJvZHkgc28gdGhpcyBmdW5jdGlvbiBzaG91dCB0cmFuc2xhdGUKICAgIGludG8gYSBOT09QCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIG1lc3NhZ2U6ICAgICAgICB0eXBlIGFuZCBjb250ZW50IG9mIHRoZSBtZXNzYWdlCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9NY0ZyZWVNc2cKKAogIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgsCiAgdm9zX21zZ190KiAgICAgICBtZXNzYWdlCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IG1lc3NhZ2UgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfTWNGcmVlTXNnIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9NY0ZyZWVNc2ciKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAiV0xBTiBUTDpSZWNlaXZlZCBtZXNzYWdlOiAlZCB0aHJvdWdoIG1haW4gZnJlZSIsIG1lc3NhZ2UtPnR5cGUpKTsKCiAgc3dpdGNoKCBtZXNzYWdlLT50eXBlICkKICB7CiAgY2FzZSBXREFfSEREX0FEREJBX1JFUToKICBjYXNlIFdEQV9ERUxFVEVCQV9JTkQ6CiAgICAvKnZvcyBmcmVlIGJvZHkgcG9pbnRlciovCiAgICB2b3NfbWVtX2ZyZWUobWVzc2FnZS0+Ym9keXB0cik7CiAgICBtZXNzYWdlLT5ib2R5cHRyID0gTlVMTDsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICAvKm5vIHByb2Nlc3NpbmcgZm9yIG5vdyovCiAgICBicmVhazsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKldMQU5UTF9NY0ZyZWVNc2cqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9UeFByb2Nlc3NNc2cKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBWT1NTIHdoZW4gYSBtZXNzYWdlIHdhcyBzZXJpYWxpemVkIGZvciBUTCB0aHJvdWdoIHRoZQogICAgdHggdGhyZWFkL3Rhc2suCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIG1lc3NhZ2U6ICAgICAgICB0eXBlIGFuZCBjb250ZW50IG9mIHRoZSBtZXNzYWdlCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBPdGhlciB2YWx1ZXMgY2FuIGJlIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGEgZnVuY3Rpb24gY2FsbCwgcGxlYXNlIGNoZWNrCiAgY29ycmVzcG9uZGluZyBBUEkgZm9yIG1vcmUgaW5mby4KICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeFByb2Nlc3NNc2cKKAogIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgsCiAgdm9zX21zZ190KiAgICAgICBtZXNzYWdlCikKewogICBWT1NfU1RBVFVTICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogICB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0KTsKICAgdm9pZCAqY2FsbGJhY2tDb250ZXh0OwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IG1lc3NhZ2UgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUHJvY2Vzc1R4TWVzc2FnZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUHJvY2VzcyBtZXNzYWdlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlJlY2VpdmVkIG1lc3NhZ2U6ICVkIHRocm91Z2ggdHggZmxvdyIsIG1lc3NhZ2UtPnR5cGUpKTsKCiAgc3dpdGNoKCBtZXNzYWdlLT50eXBlICkKICB7CiAgY2FzZSBXTEFOVExfVFhfU0lHX1NVU1BFTkQ6CiAgICB2b3NTdGF0dXMgPSBXTEFOVExfU3VzcGVuZENCKCBwdm9zR0N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5UTF9TdXNwZW5kQ0JUeXBlKW1lc3NhZ2UtPmJvZHlwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPnJlc2VydmVkKTsKICAgIGJyZWFrOwogIGNhc2UgV0xBTlRMX1RYX1JFU19ORUVERUQ6CiAgICB2b3NTdGF0dXMgPSBXTEFOVExfR2V0VHhSZXNvdXJjZXNDQiggcHZvc0dDdHggKTsKICAgICBicmVhazsKCiAgY2FzZSBXREFfRFNfVFhfU1RBUlRfWE1JVDoKICAgICAgV0xBTlRMX0NsZWFyVHhYbWl0UGVuZGluZyhwdm9zR0N0eCk7CiAgICAgIHZvc1N0YXR1cyA9IFdEQV9EU19UeEZyYW1lcyggcHZvc0dDdHggKTsKICAgICAgYnJlYWs7CgogIGNhc2UgV0RBX0RTX0ZJTklTSF9VTEE6CiAgICBjYWxsYmFja0NvbnRleHQgPSBtZXNzYWdlLT5ib2R5cHRyOwogICAgY2FsbGJhY2tSb3V0aW5lID0gbWVzc2FnZS0+Y2FsbGJhY2s7CiAgICBpZiAoIE5VTEwgIT0gY2FsbGJhY2tSb3V0aW5lICkKICAgIHsKICAgICAgY2FsbGJhY2tSb3V0aW5lKGNhbGxiYWNrQ29udGV4dCk7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBXTEFOVExfVFhfU05BUFNIT1Q6CiAgICAvKkR1bXBpbmcgVEwgU3RhdGUgYW5kIHRoZW4gY29udGludWluZyB0byBwcmludAogICAgICB0aGUgRFhFIER1bXAqLwogICAgV0xBTlRMX1R4VGhyZWFkRGVidWdIYW5kbGVyKHB2b3NHQ3R4KTsKICAgIFdEQV9UcmFuc3BvcnRDaGFubmVsRGVidWcoTlVMTCwgVk9TX1RSVUUsIFZPU19GQUxTRSk7CiAgICBicmVhazsKCiAgY2FzZSBXTEFOVExfVFhfRkFUQUxfRVJST1I6CiAgICBXTEFOVExfRmF0YWxFcnJvckhhbmRsZXIocHZvc0dDdHgpOwogICAgYnJlYWs7CgogIGNhc2UgV0xBTlRMX1RYX0ZXX0RFQlVHOgogICAgdm9zX2Z3RHVtcFJlcSgyNzQsIDAsIDAsIDAsIDAsIDEpOyAvL0FzeW5jIGV2ZW50CiAgICBicmVhazsKCiAgY2FzZSBXTEFOVExfVFhfS0lDS0RYRToKICAgIFdEQV9UcmFuc3BvcnRLaWNrRHhlKCk7CiAgICBicmVhazsKCiAgZGVmYXVsdDoKICAgIC8qbm8gcHJvY2Vzc2luZyBmb3Igbm93Ki8KICAgIGJyZWFrOwogIH0KCiAgcmV0dXJuIHZvc1N0YXR1czsKfS8qIFdMQU5UTF9UeFByb2Nlc3NNc2cgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfTWNGcmVlTXNnCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgVk9TUyB0byBmcmVlIGEgZ2l2ZW4gVEwgbWVzc2FnZSBvbiB0aGUgTWFpbiB0aHJlYWQgd2hlbiB0aGVyZQogICAgYXJlIG1lc3NhZ2VzIHBlbmRpbmcgaW4gdGhlIHF1ZXVlIHdoZW4gdGhlIHdob2xlIHN5c3RlbSBpcyBiZWVuIHJlc2V0LgogICAgRm9yIG5vdywgVEwgZG9lcyBub3QgYWxsb2NhdGUgYW55IGJvZHkgc28gdGhpcyBmdW5jdGlvbiBzaG91dCB0cmFuc2xhdGUKICAgIGludG8gYSBOT09QCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIG1lc3NhZ2U6ICAgICAgICB0eXBlIGFuZCBjb250ZW50IG9mIHRoZSBtZXNzYWdlCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeEZyZWVNc2cKKAogIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgsCiAgdm9zX21zZ190KiAgICAgICBtZXNzYWdlCikKewogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKk5vdGhpbmcgdG8gZG8gZm9yIG5vdyEhISovCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qV0xBTlRMX1R4RnJlZU1zZyovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9UeEZDRnJhbWUKCiAgREVTQ1JJUFRJT04KICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gdG8gc2VuZCBGQyBmcmFtZS4gRW5hYmxlCiAgICBvciBkaXNhYmxlIExXTSBtb2RlIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbi4KCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIEZXIHNlbmRzIHVwIHNwZWNpYWwgZmxvdyBjb250cm9sIGZyYW1lLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBvaW50ZXJzIGFyZSBOVUxMLgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIFNvbWV0aGluZyBpcyB3cm9uZy4KICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QuCgogIFNJREUgRUZGRUNUUwogICAgTmV3bHkgZm9ybWVkIEZDIGZyYW1lIGlzIGdlbmVyYXRlZCBhbmQgd2FpdHMgdG8gYmUgdHJhbnNtaXR0ZWQuIFByZXZpb3VzbHkgdW5zZW50IGZyYW1lIHdpbGwKICAgIGJlIHJlbGVhc2VkLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1R4RkNGcmFtZQooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4CikKewojaWYgMAogIFdMQU5UTF9DYlR5cGUqICAgICAgcFRMQ2IgPSBOVUxMOwogIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzOwogIHRwSGFsRmNUeEJkICAgICAgICAgcHZGY1R4QmQgPSBOVUxMOwogIHZvc19wa3RfdCAqICAgICAgICAgcFBhY2tldCA9IE5VTEw7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y1NUQUlkID0gMDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjQml0Q2hlY2sgPSAxOwoKICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiV0xBTiBUTDogU2VuZCBGQyBmcmFtZSAlcyIsIF9fZnVuY19fKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHZvc0dDdHggKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CgogIGlmIChOVUxMID09IHBUTENiKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBvaW50ZXIgaW4gJXMgXG4iLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CiAgCiAgLy9HZXQgb25lIHZvc3MgcGFja2V0CiAgdm9zU3RhdHVzID0gdm9zX3BrdF9nZXRfcGFja2V0KCAmcFBhY2tldCwgVk9TX1BLVF9UWVBFX1RYXzgwMl8xMV9NR01ULCBzaXplb2YodEhhbEZjVHhCZCksIDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWT1NfRkFMU0UsIE5VTEwsIE5VTEwgKTsKCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICB7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgdm9zU3RhdHVzID0gdm9zX3BrdF9yZXNlcnZlX2hlYWQoIHBQYWNrZXQsICh2b2lkICopJnB2RmNUeEJkLCBzaXplb2YodEhhbEZjVHhCZCkpOwoKICBpZiggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICIlczogZmFpbGVkIHRvIHJlc2VydmUgRkMgVFggQkQgJWRcbiIsX19mdW5jX18sIHNpemVvZih0SGFsRmNUeEJkKSkpOwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCBwUGFja2V0ICk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLy9HZW5lcmF0ZSBtb3N0IHJlY2VudCB0bEZDSW5mby4gTW9zdCBmaWVsZHMgYXJlIGNvcnJlY3QuCiAgcFRMQ2ItPnRsRkNJbmZvLmZjU1RBVGhyZXNoRW5hYmxlZE1hc2sgPSAwOwogIHBUTENiLT50bEZDSW5mby5mY1NUQVR4TW9yZURhdGFNYXNrID0gMDsKICBmb3IoIHVjU1RBSWQgPSAwLCB1Y0JpdENoZWNrID0gMSA7IHVjU1RBSWQgPCBXTEFOX01BWF9TVEFfQ09VTlQ7IHVjQml0Q2hlY2sgPDw9IDEsIHVjU1RBSWQgKyspCiAgewogICAgaWYgKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNFeGlzdHMpCiAgICB7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIGlmIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y1BrdFBlbmRpbmcpCiAgICB7CiAgICAgIHBUTENiLT50bEZDSW5mby5mY1NUQVR4TW9yZURhdGFNYXNrIHw9IHVjQml0Q2hlY2s7CiAgICB9CgogICAgaWYgKCAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21Nb2RlRW5hYmxlZCkgJiYKICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmJtdU1lbUNvbnN1bWVkID4gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUx3bVRocmVzaG9sZCkpCiAgICB7CiAgICAgIHBUTENiLT50bEZDSW5mby5mY1NUQVRocmVzaEVuYWJsZWRNYXNrIHw9IHVjQml0Q2hlY2s7CgogICAgICBwVExDYi0+dGxGQ0luZm8uZmNTVEFUaHJlc2hbdWNTVEFJZF0gPSAodEFOSV9VOClwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51THdtVGhyZXNob2xkOwoKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21FdmVudFJlcG9ydGVkID0gRkFMU0U7CiAgICB9CgogIH0KICAKICAvL3JlcXVlc3QgaW1tZWRpYXRlIGZlZWRiYWNrCiAgcFRMQ2ItPnRsRkNJbmZvLmZjQ29uZmlnIHw9IDB4NDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogIC8vZmlsbCBpbiBCRCB0byBzZW50CiAgdm9zU3RhdHVzID0gV0xBTkhBTF9GaWxsRmNUeEJkKHB2b3NHQ3R4LCAmcFRMQ2ItPnRsRkNJbmZvLCAodm9pZCAqKXB2RmNUeEJkKTsKCiAgaWYoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiJXM6IEZpbGwgRkMgVFggQkQgdW5zdWNjZXNzZnVsXG4iLCBfX2Z1bmNfXykpOwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCBwUGFja2V0ICk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKE5VTEwgIT0gcFRMQ2ItPnZvc1R4RkNCdWYpCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiJXM6IFByZXZpb3VzIEZDIFRYIEJEIG5vdCBzZW50XG4iLCBfX2Z1bmNfXykpOwogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT52b3NUeEZDQnVmKTsKICB9CgogIHBUTENiLT52b3NUeEZDQnVmID0gcFBhY2tldDsKCiAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggcFBhY2tldCwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KVdMQU5UTF9UeENvbXBEZWZhdWx0Q2IpOwogIHZvc1N0YXR1cyA9IFdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDogc2VuZCBGQyBmcmFtZSBsZWF2ZSAlcyIsIF9fZnVuY19fKSk7CiNlbmRpZgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFR4UmVzb3VyY2VzQ0IKCiAgREVTQ1JJUFRJT04KICAgIFByb2Nlc3NpbmcgZnVuY3Rpb24gZm9yIFJlc291cmNlIG5lZWRlZCBzaWduYWwuIEEgcmVxdWVzdCB3aWxsIGJlIGlzc3VlZAogICAgdG8gQkFMIHRvIGdldCBtb3JlIHR4IHJlc291cmNlcy4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgT3RoZXIgdmFsdWVzIGNhbiBiZSByZXR1cm5lZCBhcyBhIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIGNhbGwsIHBsZWFzZSBjaGVjawogIGNvcnJlc3BvbmRpbmcgQVBJIGZvciBtb3JlIGluZm8uCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0VHhSZXNvdXJjZXNDQgooCiAgdl9QVk9JRF90ICAgICAgICBwdm9zR0N0eAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgICAgICA9IE5VTEw7CiAgdl9VMzJfdCAgICAgICAgIHVSZXNDb3VudCAgPSBXREFfVExJX01JTl9SRVNfREFUQTsKICBWT1NfU1RBVFVTICAgICAgdm9zU3RhdHVzICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICB2X1U4X3QgICAgICAgICAgdWNNZ210ICAgICA9IDA7CiAgdl9VOF90ICAgICAgICAgIHVjQkFQICAgICAgPSAwOwogIHZfVThfdCAgICAgICAgICB1Y0RhdGEgICAgID0gMDsKI2lmZGVmIFdMQU5fU09GVEFQX0ZMT1dDVFJMX0VOCiAgdEJzc1N5c3RlbVJvbGUgc3lzdGVtUm9sZTsKICB0cEFuaVNpckdsb2JhbCBwTWFjOwojZW5kaWYKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24iCiAgICAgICAgICAgICAgICIgV0xBTlRMX1Byb2Nlc3NUeE1lc3NhZ2UiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEdldCB0eCByZXNvdXJjZXMgZnJvbSBCQUwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NTdGF0dXMgPSBXREFfRFNfR2V0VHhSZXNvdXJjZXMoIHB2b3NHQ3R4LCAmdVJlc0NvdW50ICk7CgogIGlmICggKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpICYmIChWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTICE9IHZvc1N0YXR1cykpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpUTCBmYWlsZWQgdG8gZ2V0IHJlc291cmNlcyBmcm9tIEJBTCwgRXJyOiAlZCIsCiAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qIEN1cnJlbnRseSBvbmx5IExpbnV4IEJBTCByZXR1cm5zIHRoZSBFX1JFU09VUkNFUyBlcnJvciBjb2RlIHdoZW4gaXQgaXMgcnVubmluZyAKICAgICBvdXQgb2YgQkQvUERVcy4gVG8gbWFrZSB1c2Ugb2YgdGhpcyBpbnRlcnJ1cHQgZm9yIHRocm91Z2hwdXQgZW5oYW5jZW1lbnQsIHNpbWlsYXIKICAgICBjaGFuZ2VzIHNob3VsZCBiZSBkb25lIGluIEJBTCBjb2RlIG9mIEFNU1MgYW5kIFdNICovCiAgaWYgKFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgPT0gdm9zU3RhdHVzKQogIHsKI2lmZGVmIFZPTEFOU19QRVJGCiAgICAgV0xBTkhBTF9FbmFibGVJZGxlQmRQZHVJbnRlcnJ1cHQocHZvc0dDdHgsICh0QU5JX1U4KWJkUGR1SW50ZXJydXB0R2V0VGhyZXNob2xkKTsKICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBFbmFibGluZyBJZGxlIEJEL1BEVSBpbnRlcnJ1cHQsIEN1cnJlbnQgcmVzb3VyY2VzID0gJWQiLCB1UmVzQ291bnQpOwojZWxzZQogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwojZW5kaWYKICB9CgogIHBUTENiLT51UmVzQ291bnQgPSB1UmVzQ291bnQ7CiAgCgojaWZkZWYgV0xBTl9TT0ZUQVBfRkxPV0NUUkxfRU4KICAvKiBGSVhNRTogZGlzYWJsZWQgc2luY2UgY3JlYXRpbmcgaXNzdWVzIGluIHBvd2VyLXNhdmUsIG5lZWRzIHRvIGJlIGFkZHJlc3NlZCAqLyAKICBwVExDYi0+c2VuZEZDRnJhbWUgKys7CiAgcE1hYyA9IHZvc19nZXRfY29udGV4dChWT1NfTU9EVUxFX0lEX1dEQSwgcHZvc0dDdHgpOwogIHN5c3RlbVJvbGUgPSB3ZGFHZXRHbG9iYWxTeXN0ZW1Sb2xlKHBNYWMpOwogIGlmIChlU1lTVEVNX0FQX1JPTEUgPT0gc3lzdGVtUm9sZSkKICB7CiAgICAgaWYgKHBUTENiLT5zZW5kRkNGcmFtZSAlIDE2ID09IDApCiAgICAgewogICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgIlRyYW5zbWl0IEZDIikpOwogICAgICAgICBXTEFOVExfVHhGQ0ZyYW1lIChwdm9zR0N0eCk7CiAgICAgfSAKICB9CiNlbmRpZiAvL1dMQU5fU09GVEFQX0ZMT1dDVFJMX0VOIAoKICB1Y0RhdGEgPSAoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19EQVRBICk7CiAgdWNCQVAgID0gKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfQkFQICkgJiYKICAgICAgICAgICAoIE5VTEwgIT0gcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApOwogIHVjTWdtdCA9ICggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX01GICkgJiYKICAgICAgICAgICAoIE5VTEwgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKTsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOiBFdmFsIFJlc3VtZSB0eCBSZXM6ICVkIERBVEE6ICVkIEJBUDogJWQgTUdNVDogJWQiLAogICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCwgdWNEYXRhLCB1Y0JBUCwgdWNNZ210KSk7CgogIGlmICgoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSAmJgogICAgICAoKCAwICE9IHVjRGF0YSApIHx8ICggMCAhPSB1Y01nbXQgKSB8fCAoIDAgIT0gdWNCQVAgKSApICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJJc3N1aW5nIFhtaXQgc3RhcnQgcmVxdWVzdCB0byBCQUwgZm9yIGF2YWlsIHJlcyBTWU5DIikpOwogICAgdm9zU3RhdHVzID1XREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKICB9CiAgcmV0dXJuIHZvc1N0YXR1czsKfS8qV0xBTlRMX0dldFR4UmVzb3VyY2VzQ0IqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBVdGlsaXR5IGZ1bmN0aW9ucwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIKCiAgREVTQ1JJUFRJT04KICAgIElubGluZSBmdW5jdGlvbiBmb3IgdHJhbnNsYXRpbmcgYW5kIDgwMi4xMSBoZWFkZXIgaW50byBhbiA4MDIuMyBoZWFkZXIuCgogIERFUEVOREVOQ0lFUwoKCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgIHBUTENiOiAgICAgICAgICAgIFRMIGNvbnRyb2wgYmxvY2sKICAgSU4vT1VUIAogICAgdWNTdGFJZDogICAgICAgICAgc3RhdGlvbiBJRC4gSW5jYXNlIG9mIFRETFMsIHRoaXMgcmV0dXJucyBhY3R1YWwgVERMUwogICAgICAgICAgICAgICAgICAgICAgc3RhdGlvbiBJRCB1c2VkCgogICBJTi9PVVQKICAgIHZvc0RhdGFCdWZmOiAgICAgIHZvcyBkYXRhIGJ1ZmZlciwgd2lsbCBjb250YWluIHRoZSBuZXcgaGVhZGVyIG9uIG91dHB1dAoKICAgT1VUCiAgICBwdm9zU3RhdHVzOiAgICAgICBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbgoKICBSRVRVUk4gVkFMVUUKCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgICBPdGhlciBlcnJvciBjb2RlcyBtaWdodCBiZSByZXR1cm5lZCBmcm9tIHRoZSB2b3MgYXBpIHVzZWQgaW4gdGhlIGZ1bmN0aW9uCiAgICBwbGVhc2UgY2hlY2sgdGhvc2UgcmV0dXJuIHZhbHVlcy4KCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIKKAogIHZvc19wa3RfdCogICAgICB2b3NEYXRhQnVmZiwKICBWT1NfU1RBVFVTKiAgICAgcHZvc1N0YXR1cywKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IsCiAgdl9VOF90ICAgICAgICAgICpwdWNTdGFJZCwKICBXTEFOVExfTWV0YUluZm9UeXBlICp0bE1ldGFJbmZvLAogIHZfVThfdCAgICAgICAgICAqdWNXRFNFbmFibGVkLAogIHZfVThfdCAgICAgICAgICAqZXh0cmFIZWFkU3BhY2UKKQp7CiAgV0xBTlRMXzgwMjNIZWFkZXJUeXBlICB3ODAyM0hlYWRlcjsKICBXTEFOVExfODAyMTFIZWFkZXJUeXBlICpwdzgwMjExSGVhZGVyOyAvLyBBbGxvY2F0ZSBhbiBhbGlnbmVkIEJEIGFuZCB0aGVuIGZpbGwgaXQuIAogIFZPU19TVEFUVVMgICAgICAgICAgICAgdm9zU3RhdHVzOwogIHZfVThfdCAgICAgICAgICAgICAgICAgTWFuZGF0b3J5dWNIZWFkZXJTaXplID0gV0xBTjgwMjExX01BTkRBVE9SWV9IRUFERVJfU0laRTsKICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjSGVhZGVyU2l6ZSA9IDA7CiAgdl9WT0lEX3QgICAgICAgICAgICAgICAqcHB2QkRIZWFkZXIgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgcENsaWVudFNUQSA9IE5VTEw7CiAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y1FvU09mZnNldCA9IFdMQU44MDIxMV9NQU5EQVRPUllfSEVBREVSX1NJWkU7CiAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y1N0YUlkOwojaWZkZWYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQKICB2X0JPT0xfdCAgICAgICAgICAgICAgIGJJQVBQVHh3aXRoTExDID0gVk9TX0ZBTFNFOwogIHZfU0laRV90ICAgICAgICAgICAgICAgd0lBUFBTbmFwU2l6ZSA9IFdMQU5UTF9MTENfSEVBREVSX0xFTjsKICB2X1U4X3QgICAgICAgICAgICAgICAgIHdJQVBQU25hcFtXTEFOVExfTExDX0hFQURFUl9MRU5dID0gezB9OwojZW5kaWYKICAqdWNXRFNFbmFibGVkID0gMDsgLy8gZGVmYXVsdCBXRFMgb2ZmLgogIHZvc1N0YXR1cyA9IHZvc19wa3RfcG9wX2hlYWQoIHZvc0RhdGFCdWZmLCAmdzgwMjNIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHc4MDIzSGVhZGVyKSk7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAiV0xBTiBUTDogUGFja2V0IHBvcCBoZWFkZXIgZmFpbHMgb24gV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyIikpOwogICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICBpZiggTlVMTCA9PSBwdWNTdGFJZCApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAiV0xBTiBUTDogSW52YWxpZCBwb2ludGVyIGZvciBTdGFJZCIpKTsKICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KICB1Y1N0YUlkID0gKnB1Y1N0YUlkOwogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKCiAgaWYgKCBXTEFOX1NUQV9JTkZSQSA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXS0+d1NUQURlc2Mud1NUQVR5cGUKICAgICAgJiYgcFRMQ2ItPnVjVGRsc1BlZXJDb3VudCApCiAgewogICAgdl9VOF90IHVjSW5kZXggPSAwOwogICAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOX01BWF9TVEFfQ09VTlQgOyB1Y0luZGV4KyspCiAgICB7CiAgICAgIGlmICggdWNJbmRleCAhPSB1Y1N0YUlkICYmIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdICYmIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdLT51Y0V4aXN0cyAmJgogICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdLT50bFN0YXRlID09IFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCkgJiYKICAgICAgICAgICghcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0tPnVjVHhTdXNwZW5kZWQpICYmCiAgICAgICAgICB2b3NfbWVtX2NvbXBhcmUoICh2b2lkKilwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XS0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MuYnl0ZXMsCiAgICAgICAgICAgICh2b2lkKil3ODAyM0hlYWRlci52REEsIDYpICkKICAgICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAiV0xBTiBUTDogR290IGEgVERMUyBzdGF0aW9uLiBVc2luZyB0aGF0IGluZGV4IikpOwogICAgICAgIHVjU3RhSWQgPSB1Y0luZGV4OwogICAgICAgICpwdWNTdGFJZCA9IHVjU3RhSWQ7CiAgICAgICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdOwogICAgICAgIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICAgICAgICB7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQojZW5kaWYKCiNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRAppZiAoKDAgPT0gdzgwMjNIZWFkZXIudXNMZW5UeXBlKSAmJiAocENsaWVudFNUQS0+d1NUQURlc2MudWNJc0VzZVN0YSkpCnsKICAgIHZvc19wa3RfZXh0cmFjdF9kYXRhKHZvc0RhdGFCdWZmLDAsJndJQVBQU25hcFswXSwmd0lBUFBTbmFwU2l6ZSk7CiAgICBpZiAodm9zX21lbV9jb21wYXJlKHdJQVBQU25hcCxXTEFOVExfQUlST05FVF9TTkFQX0hFQURFUixXTEFOVExfTExDX0hFQURFUl9MRU4pKQogICAgewogICAgICAgIC8qVGhlIFNOQVAgYW5kIHRoZSBwcm90b2NvbCB0eXBlIGFyZSBhbHJlYWR5IGluIHRoZSBkYXRhIGJ1ZmZlci4KICAgICAgICAgVGhleSBhcmUgZmlsbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAod3BhX3N1cHBsaWNhbnQpLiBTbywgU2tpcCBBZGRpbmcgTExDIGJlbG93LiovCiAgICAgICAgIGJJQVBQVHh3aXRoTExDID0gVk9TX1RSVUU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgYklBUFBUeHdpdGhMTEMgPSBWT1NfRkFMU0U7CiAgICB9Cn0KI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FEICovCgogIGlmICgoMCAhPSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0FkZFJtdkxMQykKI2lmZGVmIEZFQVRVUkVfV0xBTl9FU0VfVVBMT0FECiAgICAgICYmICghYklBUFBUeHdpdGhMTEMpCiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLwogICAgICkKICB7CiAgICAvKiBQdXNoIHRoZSBsZW5ndGggKi8KICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICZ3ODAyM0hlYWRlci51c0xlblR5cGUsIHNpemVvZih3ODAyM0hlYWRlci51c0xlblR5cGUpKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogUGFja2V0IHB1c2ggZXRoZXIgdHlwZSBmYWlscyBvbiIKICAgICAgICAgICAgICAgICAgIiBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIiKSk7CiAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQoKI2lmZGVmIEJUQU1QX1RFU1QKICAgIC8vIFRoZSBTVEEgc2lkZSB3aWxsIGV4ZWN1dGUgdGhpcywgYSBoYWNrIHRvIHRlc3QgQlRBTVAgYnkgdXNpbmcgdGhlCiAgICAvLyBpbmZyYSBzZXR1cC4gT24gcmVhbCBCVEFNUCB0aGlzIHdpbGwgY29tZSBmcm9tIEJBUCBpdHNlbGYuCiAgICB7CiAgICBzdGF0aWMgdl9VOF90IFdMQU5UTF9CVF9BTVBfTExDX0hFQURFUltdID0gIHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDE5LCAweDU4IH07CiAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3B1c2hfaGVhZCh2b3NEYXRhQnVmZiwgV0xBTlRMX0JUX0FNUF9MTENfSEVBREVSLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihXTEFOVExfQlRfQU1QX0xMQ19IRUFERVIpKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOiBQYWNrZXQgcHVzaCBMTEMgaGVhZGVyIGZhaWxzIG9uIgogICAgICAgICAgICAgICAgICAiIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciIpKTsKICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CiAgICB9CiNlbHNlCiAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3B1c2hfaGVhZCh2b3NEYXRhQnVmZiwgV0xBTlRMX0xMQ19IRUFERVIsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdMQU5UTF9MTENfSEVBREVSKSk7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDogUGFja2V0IHB1c2ggTExDIGhlYWRlciBmYWlscyBvbiIKICAgICAgICAgICAgICAgICAgIiBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIiKSk7CiAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQojZW5kaWYKICB9LypJZiBhZGQgTExDIGlzIGVuYWJsZWQqLwogIGVsc2UKICB7CiNpZmRlZiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRAogICAgICBiSUFQUFR4d2l0aExMQyA9IFZPU19GQUxTRTsgLypSZXNldCB0aGUgRmxhZyBoZXJlIHRvIHN0YXJ0IGFmcmVzaCB3aXRoIHRoZSBuZXh0IFRYIHBrdCovCiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLwogICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDogU1RBIENsaWVudCByZWdpc3RlcmVkIHRvIG5vdCByZW1vdmUgTExDIgogICAgICAgICAgICAgICAgICAiIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciIpKTsKICB9CgojaWZkZWYgQlRBTVBfVEVTVAogIHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlID0gV0xBTl9TVEFfQlRfQU1QOwojZW5kaWYKCiAgLy8gRmluZCB0aGUgc3BhY2UgcmVxdWlyZWQgZm9yIHRoZSA4MDIuMTEgaGVhZGVyIGZvcm1hdAogIC8vIGJhc2VkIG9uIHRoZSBmcmFtZSBjb250cm9sIGZpZWxkcy4KICB1Y0hlYWRlclNpemUgPSBNYW5kYXRvcnl1Y0hlYWRlclNpemU7CiAgaWYgKHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCkKICB7ICAKICAgIHVjSGVhZGVyU2l6ZSArPSBzaXplb2YocHc4MDIxMUhlYWRlci0+dXNRb3NDdHJsKTsKICB9CiAgaWYgKHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlID09IFdMQU5fU1RBX0JUX0FNUCkKICB7ICAKICAgIHVjSGVhZGVyU2l6ZSArPSBzaXplb2YocHc4MDIxMUhlYWRlci0+b3B0dkE0KTsKICAgIHVjUW9TT2Zmc2V0ICs9IHNpemVvZihwdzgwMjExSGVhZGVyLT5vcHR2QTQpOwogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgIiBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIgOiBIZWFkZXIgc2l6ZSA9ICVkICIsIHVjSGVhZGVyU2l6ZSkpOwoKICB2b3NfcGt0X3Jlc2VydmVfaGVhZCggdm9zRGF0YUJ1ZmYsICZwcHZCREhlYWRlciwgdWNIZWFkZXJTaXplICk7CiAgaWYgKCBOVUxMID09IHBwdkJESGVhZGVyICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpWT1NTIHBhY2tldCBjb3JydXB0ZWQgIikpOwogICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICByZXR1cm4gKnB2b3NTdGF0dXM7CiAgfQoKCiAgLy8gT0sgbm93IHdlIGhhdmUgdGhlIHNwYWNlLiBGaWxsIHRoZSA4MDIxMSBoZWFkZXIKICAvKiBGaWxsIEEyICovCiAgcHc4MDIxMUhlYWRlciA9IChXTEFOVExfODAyMTFIZWFkZXJUeXBlICopKHBwdkJESGVhZGVyKTsKICAvLyBvbmx5IGNsZWFyIHRoZSByZXF1aXJlZCBzcGFjZS4KICB2b3NfbWVtX3NldCggcHc4MDIxMUhlYWRlciwgdWNIZWFkZXJTaXplLCAwICk7CiAgdm9zX21lbV9jb3B5KCBwdzgwMjExSGVhZGVyLT52QTIsIHc4MDIzSGVhZGVyLnZTQSwgIFZPU19NQUNfQUREUl9TSVpFKTsKCgojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICBpZiAoKCBXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQgPT0gcENsaWVudFNUQS0+dGxTdGF0ZSB8fAogICAgICAgIHBDbGllbnRTVEEtPnB0a0luc3RhbGxlZCApICYmICh0bE1ldGFJbmZvLT51Y0lzV2FpICE9IDEpKQojZWxzZQogIGlmICggV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEID09IHBDbGllbnRTVEEtPnRsU3RhdGUgfHwKICAgICAgIHBDbGllbnRTVEEtPnB0a0luc3RhbGxlZCApCiNlbmRpZgogIHsKICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLndlcCA9CiAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNQcm90ZWN0ZWRGcmFtZTsKICB9CgogIHB3ODAyMTFIZWFkZXItPnVzRHVyYXRpb25JZCA9IDA7CiAgcHc4MDIxMUhlYWRlci0+dXNTZXFDdHJsICAgID0gMDsKCiAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwudHlwZSAgICAgPSBXTEFOVExfODAyMTFfREFUQV9UWVBFOwoKCgogIGlmKHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCkKICB7CiAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnN1YlR5cGUgID0gV0xBTlRMXzgwMjExX0RBVEFfUU9TX1NVQlRZUEU7CgogICAgICAqKCh2X1UxNl90ICopKCh2X1U4X3QgKilwcHZCREhlYWRlciArIHVjUW9TT2Zmc2V0KSkgPSB0bE1ldGFJbmZvLT51Y1VQOwoKICB9CiAgZWxzZQogIHsKICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwuc3ViVHlwZSAgPSAwOwogICAgICB0bE1ldGFJbmZvLT51Y1VQID0gMDsKICAgICAgdGxNZXRhSW5mby0+dWNUSUQgPSAwOwoKICAvLyBOTyBOTyBOTyAtIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCB0byB3cml0ZSB0aGUgUU9TIGN0cmwgIAogIC8vIGZpZWxkLCBpdCB3aWxsIG92ZXJ3cml0ZSB0aGUgZmlyc3QgMiBieXRlcyBvZiB0aGUgZGF0YSBwYWNrZXQoTExDIGhlYWRlcikKICAvLyBwdzgwMjExSGVhZGVyLT51c1Fvc0N0cmwgICAgICAgICA9IDA7CiAgfQoKCiAgc3dpdGNoKCBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSApCiAgewogICAgIGNhc2UgV0xBTl9TVEFfSUJTUzoKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC50b0RTICAgICAgICAgID0gMDsKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5mcm9tRFMgICAgICAgID0gMDsKCiAgICAgICAgdm9zX2NvcHlfbWFjYWRkciggKHZfTUFDQUREUl90KikmcHc4MDIxMUhlYWRlci0+dkExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X01BQ0FERFJfdCopJnc4MDIzSGVhZGVyLnZEQSk7CiAgICAgICAgdm9zX21lbV9jb3B5KCBwdzgwMjExSGVhZGVyLT52QTMsCiAgICAgICAgICAgICAgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZCU1NJRGZvcklCU1MgLAogICAgICAgICAgICAgIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgICBicmVhazsKCiAgICAgY2FzZSBXTEFOX1NUQV9CVF9BTVA6CiAgICAgICAgKnVjV0RTRW5hYmxlZCA9IDE7IC8vIFdEUyBvbi4KICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC50b0RTICAgICAgICAgID0gMTsKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5mcm9tRFMgICAgICAgID0gMTsKICAgICAgICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QqKSZwdzgwMjExSGVhZGVyLT52QTEsCiAgICAgICAgICAgICAgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzKTsKICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMiwKICAgICAgICAgICAgICB3ODAyM0hlYWRlci52U0EsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QqKSZwdzgwMjExSGVhZGVyLT52QTMsCiAgICAgICAgICAgICAgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzKTsKICAgICAgICAvKiBmaWxsIHRoZSBvcHRpb25hbCBBNCBoZWFkZXIgKi8KICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPm9wdHZBNCwKICAgICAgICAgICAgICB3ODAyM0hlYWRlci52U0EsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJCVEFNUCBDQVNFIE5PVyAtLS0tLS0tLS1zdGFpZD0lZCIsCiAgICAgICAgICAgICAgICAgdWNTdGFJZCkpOwogICAgICAgIGJyZWFrOwoKICAgICBjYXNlIFdMQU5fU1RBX1NPRlRBUDoKICAgICAgICAqdWNXRFNFbmFibGVkID0gMDsgLy8gV0RTIG9mZi4KICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC50b0RTICAgICAgICAgID0gMDsKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5mcm9tRFMgICAgICAgID0gMTsKICAgICAgICAvKkNvcHkgdGhlIERBIHRvIEExKi8KICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMSwgdzgwMjNIZWFkZXIudkRBICwgVk9TX01BQ19BRERSX1NJWkUpOyAgIAogICAgICAgIHZvc19jb3B5X21hY2FkZHIoICh2X01BQ0FERFJfdCopJnB3ODAyMTFIZWFkZXItPnZBMiwKICAgICAgICAgICAgICAmcENsaWVudFNUQS0+d1NUQURlc2MudlNlbGZNQUNBZGRyZXNzKTsKICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMywKICAgICAgICAgICAgICB3ODAyM0hlYWRlci52U0EsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJzdyA4MDIgdG8gODAyMTEgc29mdGFwIGNhc2UgIC0tLS0tLS0tLXN0YWlkPSVkIiwKICAgICAgICAgICAgICAgICB1Y1N0YUlkKSk7CiAgICAgICAgYnJlYWs7CiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogICAgIGNhc2UgV0xBTl9TVEFfVERMUzoKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC50b0RTICAgICAgICAgID0gMDsKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5mcm9tRFMgICAgICAgID0gMDsKICAgICAgICAvKkZpeCBtZSovCiAgICAgICAgdm9zX2NvcHlfbWFjYWRkciggKHZfTUFDQUREUl90KikmcHc4MDIxMUhlYWRlci0+dkExLAogICAgICAgICAgICAgICZwQ2xpZW50U1RBLT53U1RBRGVzYy52U1RBTUFDQWRkcmVzcyk7CiAgICAgICAgdm9zX21lbV9jb3B5KCBwdzgwMjExSGVhZGVyLT52QTMsCiAgICAgICAgICAgICAgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZCU1NJRGZvcklCU1MgLAogICAgICAgICAgICAgIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgKCJUTDpURExTIENBU0UgTk9XIC0tLS0tLS0tLXN0YWlkPSVkIiksIHVjU3RhSWQpOwogICAgICAgIGJyZWFrOwojZW5kaWYKICAgICBjYXNlIFdMQU5fU1RBX0lORlJBOgogICAgIGRlZmF1bHQ6CiAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwudG9EUyAgICAgICAgICA9IDE7CiAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwuZnJvbURTICAgICAgICA9IDA7CiAgICAgICAgdm9zX2NvcHlfbWFjYWRkciggKHZfTUFDQUREUl90KikmcHc4MDIxMUhlYWRlci0+dkExLAogICAgICAgICAgICAgICZwQ2xpZW50U1RBLT53U1RBRGVzYy52U1RBTUFDQWRkcmVzcyk7CiAgICAgICAgdm9zX21lbV9jb3B5KCBwdzgwMjExSGVhZGVyLT52QTMsIHc4MDIzSGVhZGVyLnZEQSAsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJSRUdVTEFSIElORlJBIExJTksgQ0FTRS0tLS0tLS0tLXN0YWlkPSVkIiwKICAgICAgICAgICAgICAgICB1Y1N0YUlkKSk7CiAgICAgICAgYnJlYWs7CiAgfQogIC8vIE9LIG5vdyB3ZSBoYXZlIHRoZSBzcGFjZS4gRmlsbCB0aGUgODAyMTEgaGVhZGVyCiAgLyogRmlsbCBBMiAqLwogIHB3ODAyMTFIZWFkZXIgPSAoV0xBTlRMXzgwMjExSGVhZGVyVHlwZSAqKShwcHZCREhlYWRlcik7CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIEJFR0lOIExPRyBGVU5DVElPTiAgICAhISEgUmVtb3ZlIG1lIG9yIGNsZWFuIG1lCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KI2lmIDAgLy9kZWYgV0xBTlRMX0RFQlVHCgojZGVmaW5lIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FICAgIDE2CiNkZWZpbmUgV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0JZVEUgICAgNAoKc3RhdGljIHZfVk9JRF90IFdMQU5UTF9EZWJ1Z0ZyYW1lCigKICAgdl9QVk9JRF90ICAgZGF0YVBvaW50ZXIsCiAgIHZfVTMyX3QgICAgIGRhdGFTaXplCikKewogICB2X1U4X3QgICBsaW5lQnVmZmVyW1dMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FXTsKICAgdl9VMzJfdCAgbnVtTGluZXM7CiAgIHZfVTMyX3QgIG51bUJ5dGVzOwogICB2X1UzMl90ICBpZHg7CiAgIHZfVThfdCAgICpsaW5lUG9pbnRlcjsKCiAgIG51bUxpbmVzID0gZGF0YVNpemUgLyBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORTsKICAgbnVtQnl0ZXMgPSBkYXRhU2l6ZSAlIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FOwogICBsaW5lUG9pbnRlciA9ICh2X1U4X3QgKilkYXRhUG9pbnRlcjsKCiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TQUwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIldMQU4gVEw6RnJhbWUgRGVidWcgRnJhbWUgU2l6ZSAlZCwgUG9pbnRlciAweCVwSyIsIGRhdGFTaXplLCBkYXRhUG9pbnRlcikpOwogICBmb3IoaWR4ID0gMDsgaWR4IDwgbnVtTGluZXM7IGlkeCsrKQogICB7CiAgICAgIG1lbXNldChsaW5lQnVmZmVyLCAwLCBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORSk7CiAgICAgIG1lbWNweShsaW5lQnVmZmVyLCBsaW5lUG9pbnRlciwgV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkUpOwogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfU0FMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDoweCUyeCAweCUyeCAweCUyeCAweCUyeCAweCUyeCAweCUyeCAweCUyeCAweCUyeCAweCUyeCAweCUyeCAweCUyeCAweCUyeCAweCUyeCAweCUyeCAweCUyeCAweCUyeCIsCiAgICAgICAgICAgICAgICAgbGluZUJ1ZmZlclswXSwgbGluZUJ1ZmZlclsxXSwgbGluZUJ1ZmZlclsyXSwgbGluZUJ1ZmZlclszXSwgbGluZUJ1ZmZlcls0XSwgbGluZUJ1ZmZlcls1XSwgbGluZUJ1ZmZlcls2XSwgbGluZUJ1ZmZlcls3XSwKICAgICAgICAgICAgICAgICBsaW5lQnVmZmVyWzhdLCBsaW5lQnVmZmVyWzldLCBsaW5lQnVmZmVyWzEwXSwgbGluZUJ1ZmZlclsxMV0sIGxpbmVCdWZmZXJbMTJdLCBsaW5lQnVmZmVyWzEzXSwgbGluZUJ1ZmZlclsxNF0sIGxpbmVCdWZmZXJbMTVdKSk7CiAgICAgIGxpbmVQb2ludGVyICs9IFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FOwogICB9CgogICBpZigwID09IG51bUJ5dGVzKQogICAgICByZXR1cm47CgogICBtZW1zZXQobGluZUJ1ZmZlciwgMCwgV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkUpOwogICBtZW1jcHkobGluZUJ1ZmZlciwgbGluZVBvaW50ZXIsIG51bUJ5dGVzKTsKICAgZm9yKGlkeCA9IDA7IGlkeCA8IFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FIC8gV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0JZVEU7IGlkeCsrKQogICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TQUwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIldMQU4gVEw6MHglMnggMHglMnggMHglMnggMHglMngiLAogICAgICAgICAgICAgICAgbGluZUJ1ZmZlcltpZHggKiBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURV0sIGxpbmVCdWZmZXJbMSArIGlkeCAqIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFXSwKICAgICAgICAgICAgICAgIGxpbmVCdWZmZXJbMiArIGlkeCAqIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFXSwgbGluZUJ1ZmZlclszICsgaWR4ICogV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0JZVEVdKSk7CiAgICAgIGlmKCgoaWR4ICsgMSkgKiBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURSkgPj0gbnVtQnl0ZXMpCiAgICAgICAgIGJyZWFrOwogICB9CgogICByZXR1cm47Cn0KI2VuZGlmCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIEVORCBMT0cgRlVOQ1RJT04KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlcgoKICBERVNDUklQVElPTgogICAgSW5saW5lIGZ1bmN0aW9uIGZvciB0cmFuc2xhdGluZyBhbmQgODAyLjExIGhlYWRlciBpbnRvIGFuIDgwMi4zIGhlYWRlci4KCiAgREVQRU5ERU5DSUVTCgoKICBQQVJBTUVURVJTCgogICBJTgogICAgcFRMQ2I6ICAgICAgICAgICAgVEwgY29udHJvbCBibG9jawogICAgdWNTdGFJZDogICAgICAgICAgc3RhdGlvbiBJRAogICAgdWNIZWFkZXJMZW46ICAgICAgTGVuZ3RoIG9mIHRoZSBoZWFkZXIgZnJvbSBCRAogICAgdWNBY3R1YWxITGVuOiAgICAgTGVuZ3RoIG9mIGhlYWRlciBpbmNsdWRpbmcgcGFkZGluZyBvciBhbnkgb3RoZXIgdHJhaWxlcnMKCiAgIElOL09VVAogICAgdm9zRGF0YUJ1ZmY6ICAgICAgdm9zIGRhdGEgYnVmZmVyLCB3aWxsIGNvbnRhaW4gdGhlIG5ldyBoZWFkZXIgb24gb3V0cHV0CgogICBPVVQKICAgIHB2b3NTdGF0dXM6ICAgICAgIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uCgogICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1RyYW5zbGF0ZTgwMjExVG84MDIzSGVhZGVyCigKICB2b3NfcGt0X3QqICAgICAgdm9zRGF0YUJ1ZmYsCiAgVk9TX1NUQVRVUyogICAgIHB2b3NTdGF0dXMsCiAgdl9VMTZfdCAgICAgICAgIHVzQWN0dWFsSExlbiwKICB2X1U4X3QgICAgICAgICAgdWNIZWFkZXJMZW4sCiAgV0xBTlRMX0NiVHlwZSogIHBUTENiLAogIHZfVThfdCAgICAgICAgICB1Y1NUQUlkLAogIHZfQk9PTF90ICAgICAgICBiRm9yd2FyZElBUFB3aXRoTExDCikKewogIFdMQU5UTF84MDIzSGVhZGVyVHlwZSAgdzgwMjNIZWFkZXI7CiAgV0xBTlRMXzgwMjExSGVhZGVyVHlwZSB3ODAyMTFIZWFkZXI7CiAgdl9VOF90ICAgICAgICAgICAgICAgICBhdWNMTENIZWFkZXJbV0xBTlRMX0xMQ19IRUFERVJfTEVOXTsKICBWT1NfU1RBVFVTICAgICAgICAgICAgIHZvc1N0YXR1czsKICB2X1UxNl90ICAgICAgICAgICAgICAgIHVzRGF0YVN0YXJ0T2Zmc2V0ID0gMDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgaWYgKCBzaXplb2YodzgwMjExSGVhZGVyKSA8IHVjSGVhZGVyTGVuICkKICB7CiAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICJXYXJuaW5nICE6IENoZWNrIHRoZSBoZWFkZXIgc2l6ZSBmb3IgdGhlIFJ4IGZyYW1lIHN0cnVjdHVyZT0lZCByZWNlaXZlZD0lZG4iLAogICAgICAgc2l6ZW9mKHc4MDIxMUhlYWRlciksIHVjSGVhZGVyTGVuKSk7CiAgICAgdWNIZWFkZXJMZW4gPSBzaXplb2YodzgwMjExSGVhZGVyKTsKICB9CgogIC8vIFRoaXMgd2lsbCB0YWtlIGNhcmUgb2YgaGVhZGVycyBvZiBhbGwgc2l6ZXMsIDMgYWRkcmVzcywgMyBhZGRyIFFPUywKICAvLyBXRFMgbm9uLVFPUyBhbmQgV0RTIFFvUyBldGMuIFdlIGhhdmUgc3BhY2UgZm9yIGFsbCBpbiB0aGUgODAyLjExIGhlYWRlciBzdHJ1Y3R1cmUuCiAgdm9zU3RhdHVzID0gdm9zX3BrdF9wb3BfaGVhZCggdm9zRGF0YUJ1ZmYsICZ3ODAyMTFIZWFkZXIsIHVjSGVhZGVyTGVuKTsKCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6IEZhaWxlZCB0byBwb3AgODAyMTEgaGVhZGVyIGZyb20gcGFja2V0ICVkIiwKICAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwoKICAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgc3dpdGNoICggdzgwMjExSGVhZGVyLndGcm1DdHJsLmZyb21EUyApCiAgewogIGNhc2UgMDoKICAgIGlmICggdzgwMjExSGVhZGVyLndGcm1DdHJsLnRvRFMgKQogICAgewogICAgICAvL1NvZnRBUCBBUCBtb2RlCiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudkRBLCB3ODAyMTFIZWFkZXIudkEzLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudlNBLCB3ODAyMTFIZWFkZXIudkEyLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMIFNvZnRBUDogODAyIDMgREEgJTA4eCBTQSAlMDh4IiwKICAgICAgICAgICAgICAgICAgdzgwMjNIZWFkZXIudkRBLCB3ODAyM0hlYWRlci52U0EpKTsKICAgIH0KICAgIGVsc2UgCiAgICB7CiAgICAgIC8qIElCU1MgKi8KICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52REEsIHc4MDIxMUhlYWRlci52QTEsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52U0EsIHc4MDIxMUhlYWRlci52QTIsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2UgMToKICAgIGlmICggdzgwMjExSGVhZGVyLndGcm1DdHJsLnRvRFMgKQogICAgewogICAgICAvKiBCVC1BTVAgY2FzZSAqLwogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZEQSwgdzgwMjExSGVhZGVyLnZBMSwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZTQSwgdzgwMjExSGVhZGVyLnZBMiwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgfQogICAgZWxzZQogICAgeyAvKiBJbmZyYSAqLwogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZEQSwgdzgwMjExSGVhZGVyLnZBMSwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZTQSwgdzgwMjExSGVhZGVyLnZBMywgVk9TX01BQ19BRERSX1NJWkUpOwogICAgfQogICAgYnJlYWs7CiAgfQoKICBpZiggdXNBY3R1YWxITGVuID4gdWNIZWFkZXJMZW4gKQogIHsKICAgICB1c0RhdGFTdGFydE9mZnNldCA9IHVzQWN0dWFsSExlbiAtIHVjSGVhZGVyTGVuOwogIH0KCiAgaWYgKCAwIDwgdXNEYXRhU3RhcnRPZmZzZXQgKQogIHsKICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfdHJpbV9oZWFkKCB2b3NEYXRhQnVmZiwgdXNEYXRhU3RhcnRPZmZzZXQgKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGYWlsZWQgdG8gdHJpbSBoZWFkZXIgZnJvbSBwYWNrZXQgJWQiLAogICAgICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT53U1RBRGVzYy51Y0FkZFJtdkxMQwojaWZkZWYgRkVBVFVSRV9XTEFOX0VTRV9VUExPQUQKICAgICYmICghYkZvcndhcmRJQVBQd2l0aExMQykKI2VuZGlmIC8qICBGRUFUVVJFX1dMQU5fRVNFX1VQTE9BRCAqLwogICAgICkKICB7CiAgICAvLyBFeHRyYWN0IHRoZSBMTEMgaGVhZGVyCiAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BvcF9oZWFkKCB2b3NEYXRhQnVmZiwgYXVjTExDSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0xMQ19IRUFERVJfTEVOKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGYWlsZWQgdG8gcG9wIExMQyBoZWFkZXIgZnJvbSBwYWNrZXQgJWQiLAogICAgICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKCiAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQoKICAgIC8vRXh0cmFjdCB0aGUgbGVuZ3RoCiAgICB2b3NfbWVtX2NvcHkoJnc4MDIzSGVhZGVyLnVzTGVuVHlwZSwKICAgICAgJmF1Y0xMQ0hlYWRlcltXTEFOVExfTExDX0hFQURFUl9MRU4gLSBzaXplb2YodzgwMjNIZWFkZXIudXNMZW5UeXBlKV0sCiAgICAgIHNpemVvZih3ODAyM0hlYWRlci51c0xlblR5cGUpICk7CiAgfQogIGVsc2UKICB7CiAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnc4MDIzSGVhZGVyLnVzTGVuVHlwZSk7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IEZhaWxlZCB0byBnZXQgcGFja2V0IGxlbmd0aCAlZCIsCiAgICAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwoKICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAiV0xBTiBUTDogQlRBTVAgbGVuIChldGhlcnR5cGUpIGZsZCA9ICVkIiwKICAgICAgICB3ODAyM0hlYWRlci51c0xlblR5cGUpKTsKICAgIHc4MDIzSGVhZGVyLnVzTGVuVHlwZSA9IHZvc19jcHVfdG9fYmUxNih3ODAyM0hlYWRlci51c0xlblR5cGUpOwogIH0KCiAgdm9zX3BrdF9wdXNoX2hlYWQodm9zRGF0YUJ1ZmYsICZ3ODAyM0hlYWRlciwgc2l6ZW9mKHc4MDIzSGVhZGVyKSk7CgojaWZkZWYgQlRBTVBfVEVTVAogIHsKICAvLyBBUCBzaWRlIHdpbGwgZXhlY3V0ZSB0aGlzLgogIHZfVThfdCAqdGVtcF93ODAyM0hlYWRlciA9IE5VTEw7CiAgdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEoIHZvc0RhdGFCdWZmLCAwLAogICAgJnRlbXBfdzgwMjNIZWFkZXIsIHNpemVvZih3ODAyM0hlYWRlcikgKTsKICB9CiNlbmRpZgojaWYgMCAvKlRMX0RFQlVHKi8KICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKHZvc0RhdGFCdWZmLCAmdXNMZW4pOwogIHZvc19wa3RfcG9wX2hlYWQoIHZvc0RhdGFCdWZmLCBhdWNEYXRhLCB1c0xlbik7CgogIFdMQU5UTF9EZWJ1Z0ZyYW1lKGF1Y0RhdGEsIHVzTGVuKTsKCiAgdm9zX3BrdF9wdXNoX2hlYWQodm9zRGF0YUJ1ZmYsIGF1Y0RhdGEsIHVzTGVuKTsKCiNlbmRpZgoKICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qV0xBTlRMX1RyYW5zbGF0ZTgwMjExVG84MDIzSGVhZGVyKi8KClZPU19TVEFUVVMKV0xBTlRMX01vblRyYW5zbGF0ZTgwMjExVG84MDIzSGVhZGVyCigKICB2b3NfcGt0X3QqICAgICAgdm9zRGF0YUJ1ZmYsCiAgV0xBTlRMX0NiVHlwZSogIHBUTENiCikKewogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNNUERVRE9mZnNldDsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjTVBEVUhPZmZzZXQ7CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuOwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNBY3R1YWxITGVuID0gMDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzRGF0YVN0YXJ0T2Zmc2V0ID0gMDsKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgIGF1Y0JESGVhZGVyOwogICBXTEFOVExfODAyM0hlYWRlclR5cGUgICAgdzgwMjNIZWFkZXI7CiAgIFdMQU5UTF84MDIxMUhlYWRlclR5cGUgICB3ODAyMTFIZWFkZXI7CiAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICB2b3NTdGF0dXM7CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICBhdWNMTENIZWFkZXJbV0xBTlRMX0xMQ19IRUFERVJfTEVOXTsKCiAgIFdEQV9EU19QZWVrUnhQYWNrZXRJbmZvKCB2b3NEYXRhQnVmZiwgKHZfUFZPSURfdCkmYXVjQkRIZWFkZXIsIDAgKTsKICAgdWNNUERVSE9mZnNldCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9PRkZTRVQoYXVjQkRIZWFkZXIpOwogICB1c01QRFVET2Zmc2V0ID0gKHZfVTE2X3QpV0RBX0dFVF9SWF9NUERVX0RBVEFfT0ZGU0VUKGF1Y0JESGVhZGVyKTsKICAgdWNNUERVSExlbiAgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4oYXVjQkRIZWFkZXIpOwogICBpZiAodXNNUERVRE9mZnNldCA+IHVjTVBEVUhPZmZzZXQpCiAgIHsKICAgICAgdXNBY3R1YWxITGVuID0gdXNNUERVRE9mZnNldCAtIHVjTVBEVUhPZmZzZXQ7CiAgIH0KCiAgaWYgKCBzaXplb2YodzgwMjExSGVhZGVyKSA8IHVjTVBEVUhMZW4gKQogIHsKICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgIldhcm5pbmcgITogQ2hlY2sgdGhlIGhlYWRlciBzaXplIGZvciB0aGUgUnggZnJhbWUgc3RydWN0dXJlPSVkIHJlY2VpdmVkPSVkbiIsCiAgICAgICBzaXplb2YodzgwMjExSGVhZGVyKSwgdWNNUERVSExlbikpOwogICAgIHVjTVBEVUhMZW4gPSBzaXplb2YodzgwMjExSGVhZGVyKTsKICB9CgogIHZvc1N0YXR1cyA9IHZvc19wa3RfcG9wX2hlYWQoIHZvc0RhdGFCdWZmLCAmdzgwMjExSGVhZGVyLCB1Y01QRFVITGVuKTsKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIHBvcCA4MDIxMSBoZWFkZXIgZnJvbSBwYWNrZXQgJWQiLAogICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CgogICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQogIHN3aXRjaCAoIHc4MDIxMUhlYWRlci53RnJtQ3RybC5mcm9tRFMgKQogIHsKICBjYXNlIDA6CiAgICBpZiAoIHc4MDIxMUhlYWRlci53RnJtQ3RybC50b0RTICkKICAgIHsKICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52REEsIHc4MDIxMUhlYWRlci52QTMsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52U0EsIHc4MDIxMUhlYWRlci52QTIsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgIldMQU4gVEwgU29mdEFQOiA4MDIgMyBEQSAlMDh4IFNBICUwOHgiLAogICAgICAgICAgICAgICAgICB3ODAyM0hlYWRlci52REEsIHc4MDIzSGVhZGVyLnZTQSkpOwogICAgfQogICAgZWxzZQogICAgewogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZEQSwgdzgwMjExSGVhZGVyLnZBMSwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZTQSwgdzgwMjExSGVhZGVyLnZBMiwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgfQogICAgYnJlYWs7CiAgY2FzZSAxOgogICAgaWYgKCB3ODAyMTFIZWFkZXIud0ZybUN0cmwudG9EUyApCiAgICB7CiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudkRBLCB3ODAyMTFIZWFkZXIudkExLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudlNBLCB3ODAyMTFIZWFkZXIudkEyLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudkRBLCB3ODAyMTFIZWFkZXIudkExLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudlNBLCB3ODAyMTFIZWFkZXIudkEzLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICB9CiAgICBicmVhazsKICB9CiAgaWYoIHVzQWN0dWFsSExlbiA+IHVjTVBEVUhMZW4gKQogIHsKICAgICB1c0RhdGFTdGFydE9mZnNldCA9IHVzQWN0dWFsSExlbiAtIHVjTVBEVUhMZW47CiAgfQoKICBpZiAoIDAgPCB1c0RhdGFTdGFydE9mZnNldCApCiAgewogICAgdm9zU3RhdHVzID0gdm9zX3BrdF90cmltX2hlYWQoIHZvc0RhdGFCdWZmLCB1c0RhdGFTdGFydE9mZnNldCApOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IEZhaWxlZCB0byB0cmltIGhlYWRlciBmcm9tIHBhY2tldCAlZCIsCiAgICAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwogICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQogIH0KICAgLy8gRXh0cmFjdCB0aGUgTExDIGhlYWRlcgogICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BvcF9oZWFkKCB2b3NEYXRhQnVmZiwgYXVjTExDSGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTExDX0hFQURFUl9MRU4pOwoKICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIHBvcCBMTEMgaGVhZGVyIGZyb20gcGFja2V0ICVkIiwKICAgICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKCiAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgIH0KCiAgIC8vRXh0cmFjdCB0aGUgbGVuZ3RoCiAgIHZvc19tZW1fY29weSgmdzgwMjNIZWFkZXIudXNMZW5UeXBlLAogICAgICZhdWNMTENIZWFkZXJbV0xBTlRMX0xMQ19IRUFERVJfTEVOIC0gc2l6ZW9mKHc4MDIzSGVhZGVyLnVzTGVuVHlwZSldLAogICAgIHNpemVvZih3ODAyM0hlYWRlci51c0xlblR5cGUpICk7CgogICB2b3NfcGt0X3B1c2hfaGVhZCh2b3NEYXRhQnVmZiwgJnc4MDIzSGVhZGVyLCBzaXplb2YodzgwMjNIZWFkZXIpKTsKICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjCgogIERFU0NSSVBUSU9OCiAgICBVdGlsaXR5IGZ1bmN0aW9uIHRvIGZpbmQgd2hldGhlciByZWNlaXZlZCBmcmFtZSBpcyBicm9hZGNhc3QsIG11bHRpY2FzdAogICAgb3IgdW5pY2FzdC4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgU1RBIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFRMIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHBUTENiOiAgICAgICAgICBwb2ludGVyIHRvIHRoZSBUTCdzIGNvbnRyb2wgYmxvY2sKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgICBwb2ludGVyIHRvIHRoZSB2b3MgYnVmZmVyCgogICBJTi9PVVQKICAgIHB1Y0JjTWNVYzogICAgICAgcG9pbnRlciB0byBidWZmZXIsIHdpbGwgY29udGFpbiBmcmFtZSB0eXBlIG9uIHJldHVybgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0JBRE1TRzogIGZhaWxlZCB0byBleHRyYWN0IGluZm8gZnJvbSBkYXRhIGJ1ZmZlcgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIHN1Y2Nlc3MKCiAgU0lERSBFRkZFQ1RTCiAgICBOb25lLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfRmluZEZyYW1lVHlwZUJjTWNVYwooCiAgV0xBTlRMX0NiVHlwZSAqcFRMQ2IsCiAgdl9VOF90ICAgICAgICB1Y1NUQUlkLAogIHZvc19wa3RfdCAgICAgKnZvc0RhdGFCdWZmLAogIHZfVThfdCAgICAgICAgKnB1Y0JjTWNVYwopCnsKICAgVk9TX1NUQVRVUyAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgIHZfUFZPSURfdCAgICAgYXVjQkRIZWFkZXI7CiAgIHZfUFZPSURfdCAgICAgcHZQZWVrRGF0YTsKICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIFNhbml0eSBjaGVjawogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgaWYgKChOVUxMID09IHBUTENiKSB8fCAKICAgICAgIChOVUxMID09IHZvc0RhdGFCdWZmKSB8fCAKICAgICAgIChOVUxMID09IHB1Y0JjTWNVYykpCiAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBpbiBXTEFOVExfRmluZEZyYW1lVHlwZUJjTWNVYyIpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICAgfQoKICAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICB9CgogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIEV4dHJhY3QgQkQgaGVhZGVyIGFuZCBjaGVjayBpZiB2YWxpZAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgdm9zU3RhdHVzID0gV0RBX0RTX1BlZWtSeFBhY2tldEluZm8odm9zRGF0YUJ1ZmYsICh2X1BWT0lEX3QpJmF1Y0JESGVhZGVyLCAwLypTd2FwIEJEKi8gKTsKCiAgIGlmIChOVUxMID09IGF1Y0JESGVhZGVyKQogICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6V0xBTlRMX0ZpbmRGcmFtZVR5cGVCY01jVWMgLSBDYW5ub3QgZXh0cmFjdCBCRCBoZWFkZXIiKSk7CiAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfQkFETVNHOwogICB9CgogICBpZiAoKDAgPT0gV0RBX0dFVF9SWF9GVF9ET05FKGF1Y0JESGVhZGVyKSkgJiYKICAgICAgICgwICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT53U1RBRGVzYy51Y1N3RnJhbWVSWFhsYXRpb24pKQogICB7CiAgICAgIC8qIEl0cyBhbiA4MDIuMTEgZnJhbWUsIGV4dHJhY3QgTUFDIGFkZHJlc3MgMSAqLwogICAgICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfRmluZEZyYW1lVHlwZUJjTWNVYyAtIDgwMi4xMSBmcmFtZSwgcGVla2luZyBBZGRyMSIpKTsKICAgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEodm9zRGF0YUJ1ZmYsIFdMQU5UTF9NQUNfQUREUl9BTElHTigxKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnB2UGVla0RhdGEsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgfQogICBlbHNlCiAgIHsKICAgICAgLyogSXRzIGFuIDgwMi4zIGZyYW1lLCBleHRyYWN0IERlc3RpbmF0aW9uIE1BQyBhZGRyZXNzICovCiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjIC0gODAyLjMgZnJhbWUsIHBlZWtpbmcgREEiKSk7CiAgICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKHZvc0RhdGFCdWZmLCBXTEFOVExfTUFDX0FERFJfQUxJR04oMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnB2UGVla0RhdGEsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgfQoKICAgaWYgKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpIAogICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6V0xBTlRMX0ZpbmRGcmFtZVR5cGVCY01jVWMgLSBGYWlsZWQgdG8gcGVlayBNQUMgYWRkcmVzcyIpKTsKICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgfQoKICAgaWYgKCgodEFOSV9VOCAqKXB2UGVla0RhdGEpWzBdID09IDB4ZmYpCiAgIHsKICAgICAgKnB1Y0JjTWNVYyA9IFdMQU5UTF9GUkFNRV9UWVBFX0JDQVNUOwogICB9CiAgIGVsc2UKICAgewogICAgICBpZiAoKCgodEFOSV9VOCAqKXB2UGVla0RhdGEpWzBdICYgMHgwMSkgPT0gMHgwMSkKICAgICAgICAgKnB1Y0JjTWNVYyA9IFdMQU5UTF9GUkFNRV9UWVBFX01DQVNUOwogICAgICBlbHNlCiAgICAgICAgICpwdWNCY01jVWMgPSBXTEFOVExfRlJBTUVfVFlQRV9VQ0FTVDsKICAgfQoKICAgVExMT0cyKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgIldMQU4gVEw6V0xBTlRMX0ZpbmRGcmFtZVR5cGVCY01jVWMgLSBBZGRyMUJ5dGUxIGlzOiAleCIsIAogICAgICAgICAgKCh0QU5JX1U4ICopcHZQZWVrRGF0YSlbMF0pKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKI2lmIDAKI2lmZGVmIFdMQU5fUEVSRiAKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9GYXN0SHdGd2REYXRhRnJhbWUKCiAgREVTQ1JJUFRJT04gCiAgICBGYXN0IHBhdGggZnVuY3Rpb24gdG8gcXVpY2tseSBmb3J3YXJkIGEgZGF0YSBmcmFtZSBpZiBIQUwgZGV0ZXJtaW5lcyBCRCAKICAgIHNpZ25hdHVyZSBjb21wdXRlZCBoZXJlIG1hdGNoZXMgdGhlIHNpZ25hdHVyZSBpbnNpZGUgY3VycmVudCBWT1NTIHBhY2tldC4gCiAgICBJZiB0aGVyZSBpcyBhIG1hdGNoLCBIQUwgYW5kIFRMIGZpbGxzIGluIHRoZSBzd2FwcGVkIHBhY2tldCBsZW5ndGggaW50byAKICAgIEJEIGhlYWRlciBhbmQgRHhFIGhlYWRlciwgcmVzcGVjdGl2ZWx5LiBPdGhlcndpc2UsIHBhY2tldCBnb2VzIGJhY2sgdG8gCiAgICBub3JtYWwgKHNsb3cpIHBhdGggYW5kIGEgbmV3IEJEIHNpZ25hdHVyZSB3b3VsZCBiZSB0YWdnZWQgaW50byBCRCBpbiB0aGlzCiAgICBWT1NTIHBhY2tldCBsYXRlciBieSB0aGUgV0xBTkhBTF9GaWxsVHhCZCgpIGZ1bmN0aW9uLgoKICBERVBFTkRFTkNJRVMgCiAgICAgCiAgUEFSQU1FVEVSUyAKCiAgIElOCiAgICAgICAgcHZvc0dDdHggICAgVk9TIGNvbnRleHQKICAgICAgICB2b3NEYXRhQnVmZiBQdHIgdG8gVk9TUyBwYWNrZXQKICAgICAgICBwTWV0YUluZm8gICBGb3IgZ2V0dGluZyBmcmFtZSdzIFRJRAogICAgICAgIHBTdGFJbmZvICAgIEZvciBjaGVja2luZyBTVEEgdHlwZQogICAgCiAgIE9VVAogICAgICAgIHB2b3NTdGF0dXMgIHJldHVybmVkIHN0YXR1cwogICAgICAgIHB1RmFzdEZ3ZE9LIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBmcmFtZSBjb3VsZCBiZSBmYXN0IGZvcndhcmRlZAogICAKICBSRVRVUk4gVkFMVUUKICAgIE5vIHJldHVybi4gICAKCiAgU0lERSBFRkZFQ1RTIAogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kc3RhdGljIHZvaWQKV0xBTlRMX0Zhc3RId0Z3ZERhdGFGcmFtZQooIAogIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCiAgdm9zX3BrdF90KiAgICB2b3NEYXRhQnVmZiwKICBWT1NfU1RBVFVTKiAgIHB2b3NTdGF0dXMsCiAgdl9VMzJfdCogICAgICAgcHVGYXN0RndkT0ssCiAgV0xBTlRMX01ldGFJbmZvVHlwZSogIHBNZXRhSW5mbywKICBXTEFOX1NUQURlc2NUeXBlKiAgcFN0YUluZm8KIAopCnsKICAgIHZfUFZPSURfdCAgIHB2UGVla0RhdGE7CiAgICB2X1U4X3QgICAgICB1Y0R4RUJEV0xBTkhlYWRlckxlbiA9IFdMQU5UTF9CRF9IRUFERVJfTEVOKDApICsgc2l6ZW9mKFdMQU5CQUxfc0RYRUhlYWRlclR5cGUpOyAKICAgIHZfVThfdCAgICAgIHVjSXNVbmljYXN0OwogICAgV0xBTkJBTF9zRFhFSGVhZGVyVHlwZSAgKnBEeEVIZWFkZXI7CiAgICB2X1BWT0lEX3QgICBwdkJESGVhZGVyOwogICAgdl9QVk9JRF90ICAgcHVjQnVmZlB0cjsKICAgIHZfVTE2X3QgICAgICB1c1BrdExlbjsKCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgcGFja2V0IGxlbmd0aAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIHZvc19wa3RfZ2V0X3BhY2tldF9sZW5ndGgoIHZvc0RhdGFCdWZmLCAmdXNQa3RMZW4pOwoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBNQUMgYWRkcmVzcwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgKnB2b3NTdGF0dXMgPSB2b3NfcGt0X3BlZWtfZGF0YSggdm9zRGF0YUJ1ZmYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTUFDX0FERFJfQUxJR04oMCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSZwdlBlZWtEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX01BQ19BRERSX1NJWkUgKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSAqcHZvc1N0YXR1cyApIAogICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBleHRyYWN0IE1BQyBBZGRyICVkIiwgCiAgICAgICAgICAgICAgICAgICpwdm9zU3RhdHVzKSk7CiAgICAgICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKICAgICAgIHJldHVybjsKICAgIH0KCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlc2VydmUgaGVhZCByb29tIGZvciBEeEUgaGVhZGVyLCBCRCwgYW5kIFdMQU4gaGVhZGVyCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgdm9zX3BrdF9yZXNlcnZlX2hlYWQoIHZvc0RhdGFCdWZmLCAmcHVjQnVmZlB0ciwgCiAgICAgICAgICAgICAgICAgICAgICAgIHVjRHhFQkRXTEFOSGVhZGVyTGVuICk7CiAgICBpZiAoIE5VTEwgPT0gcHVjQnVmZlB0ciApCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOk5vIGVub3VnaCBzcGFjZSBpbiBWT1NTIHBhY2tldCAlcEsgZm9yIER4RS9CRC9XTEFOIGhlYWRlciIsIHZvc0RhdGFCdWZmKSk7CiAgICAgICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBwRHhFSGVhZGVyID0gKFdMQU5CQUxfc0RYRUhlYWRlclR5cGUgICopcHVjQnVmZlB0cjsKICAgIHB2QkRIZWFkZXIgPSAodl9QVk9JRF90KSAmcER4RUhlYWRlclsxXTsKCiAgICAvKiBVTUEgVHggYWNjZWxlcmF0aW9uIGlzIGVuYWJsZWQuIAogICAgICogVU1BIHdvdWxkIGhlbHAgY29udmVydCBmcmFtZXMgdG8gODAyLjExLCBmaWxsIHBhcnRpYWwgQkQgZmllbGRzIGFuZCAKICAgICAqIGNvbnN0cnVjdCBMTEMgaGVhZGVyLiBUbyBmdXJ0aGVyIGFjY2VsZXJhdGUgdGhpcyBraW5kIG9mIGZyYW1lcywKICAgICAqIEhBTCB3b3VsZCBhdHRlbXB0IHRvIHJldXNlIHRoZSBCRCBkZXNjcmlwdG9yIGlmIHRoZSBCRCBzaWduYXR1cmUgCiAgICAgKiBtYXRjaGVzIHRvIHRoZSBzYXZlZCBCRCBkZXNjcmlwdG9yLgogICAgICovCiAgICAgaWYocFN0YUluZm8tPndTVEFUeXBlID09IFdMQU5fU1RBX0lCU1MpCiAgICAgICAgdWNJc1VuaWNhc3QgPSAhKCgodEFOSV9VOCAqKXB2UGVla0RhdGEpWzBdICYgMHgwMSk7CiAgICAgZWxzZQogICAgICAgIHVjSXNVbmljYXN0ID0gMTsKIAogICAgICpwdUZhc3RGd2RPSyA9ICh2X1UzMl90KSBXTEFOSEFMX1R4QmRGYXN0RndkKHB2b3NHQ3R4LCBwdlBlZWtEYXRhLCBwTWV0YUluZm8tPnVjVElELCB1Y0lzVW5pY2FzdCwgcHZCREhlYWRlciwgdXNQa3RMZW4gKTsKICAgIAogICAgICAvKiBDYW4ndCBiZSBmYXN0IGZvcndhcmRlZC4gVHJpbSB0aGUgVk9TIGhlYWQgYmFjayB0byBvcmlnaW5hbCBsb2NhdGlvbi4gKi8KICAgICAgaWYoISAqcHVGYXN0RndkT0spewogICAgICAgICAgdm9zX3BrdF90cmltX2hlYWQodm9zRGF0YUJ1ZmYsIHVjRHhFQkRXTEFOSGVhZGVyTGVuKTsKICAgICAgfWVsc2V7CiAgICAgICAgLyogY291bGQgYmUgZmFzdCBmb3J3YXJkZWQuIE5vdyBub3RpZnkgQkFMIER4RSBoZWFkZXIgZmlsbGluZyBjb3VsZCBiZSBjb21wbGV0ZWx5IHNraXBwZWQKICAgICAgICAgKi8KICAgICAgICB2X1UzMl90IHVQYWNrZXRTaXplID0gV0xBTlRMX0JEX0hFQURFUl9MRU4oMCkgKyB1c1BrdExlbjsKICAgICAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfQkFMLCAKICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXVQYWNrZXRTaXplKTsKICAgICAgICBwRHhFSGVhZGVyLT5zaXplICA9IFNXQVBfRU5ESUFOX1VJTlQzMih1UGFja2V0U2l6ZSk7CiAgICAgIH0KICAgICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgICAgcmV0dXJuOwp9CiNlbmRpZiAvKldMQU5fUEVSRiovCiNlbmRpZgoKI2lmIDAKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBGVU5DVElPTiAgICBXTEFOVExfUHJlcGFyZUJESGVhZGVyCgogIERFU0NSSVBUSU9OCiAgICBJbmxpbmUgZnVuY3Rpb24gZm9yIHByZXBhcmluZyBCRCBoZWFkZXIgYmVmb3JlIEhBTCBwcm9jZXNzaW5nLgoKICBERVBFTkRFTkNJRVMKICAgIEp1c3Qgbm90aWZ5IEhBTCB0aGF0IHN1c3BlbmQgaW4gVEwgaXMgY29tcGxldGUuCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgICB2b3NEYXRhQnVmZjogICAgICB2b3MgZGF0YSBidWZmZXIKICAgIHVjRGlzYWJsZUZybVh0bDogIGlzIGZyYW1lIHh0bCBkaXNhYmxlZAoKICAgT1VUCiAgICBwcHZCREhlYWRlcjogICAgICBpdCB3aWxsIGNvbnRhaW4gdGhlIEJEIGhlYWRlcgogICAgcHZEZXN0TWFjQWRkZHI6ICAgaXQgd2lsbCBjb250YWluIHRoZSBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcwogICAgcHZvc1N0YXR1czogICAgICAgc3RhdHVzIG9mIHRoZSBjb21iaW5lZCBwcm9jZXNzaW5nCiAgICBwdXNQa3RMZW46ICAgICAgICBwYWNrZXQgbGVuLgoKICBSRVRVUk4gVkFMVUUKICAgIE5vIHJldHVybi4KCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdm9pZApXTEFOVExfUHJlcGFyZUJESGVhZGVyCigKICB2b3NfcGt0X3QqICAgICAgdm9zRGF0YUJ1ZmYsCiAgdl9QVk9JRF90KiAgICAgIHBwdkJESGVhZGVyLAogIHZfTUFDQUREUl90KiAgICBwdkRlc3RNYWNBZGRkciwKICB2X1U4X3QgICAgICAgICAgdWNEaXNhYmxlRnJtWHRsLAogIFZPU19TVEFUVVMqICAgICBwdm9zU3RhdHVzLAogIHZfVTE2X3QqICAgICAgICBwdXNQa3RMZW4sCiAgdl9VOF90ICAgICAgICAgIHVjUW9zRW5hYmxlZCwKICB2X1U4X3QgICAgICAgICAgdWNXRFNFbmFibGVkLAogIHZfVThfdCAgICAgICAgICBleHRyYUhlYWRTcGFjZQopCnsKICB2X1U4X3QgICAgICB1Y0hlYWRlck9mZnNldDsKICB2X1U4X3QgICAgICB1Y0hlYWRlckxlbjsKICB2X1U4X3QgICAgICB1Y0JESGVhZGVyTGVuID0gV0xBTlRMX0JEX0hFQURFUl9MRU4odWNEaXNhYmxlRnJtWHRsKTsKCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBHZXQgaGVhZGVyIHBvaW50ZXIgZnJvbSBWT1NTCiAgICAhISEgbWFrZSBzdXJlIHJlc2VydmUgaGVhZCB6ZXJvcyBvdXQgdGhlIG1lbW9yeQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKCB2b3NEYXRhQnVmZiwgcHVzUGt0TGVuKTsKCiAgaWYgKCBXTEFOVExfTUFDX0hFQURFUl9MRU4odWNEaXNhYmxlRnJtWHRsKSA+ICpwdXNQa3RMZW4gKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6IExlbmd0aCBvZiB0aGUgcGFja2V0IHNtYWxsZXIgdGhhbiBleHBlY3RlZCBuZXR3b3JrIgogICAgICAgICAgICAgICAiIGhlYWRlciAlZCIsICpwdXNQa3RMZW4gKSk7CgogICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICByZXR1cm47CiAgfQoKICB2b3NfcGt0X3Jlc2VydmVfaGVhZCggdm9zRGF0YUJ1ZmYsIHBwdkJESGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICB1Y0JESGVhZGVyTGVuICk7CiAgaWYgKCBOVUxMID09ICpwcHZCREhlYWRlciApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6Vk9TUyBwYWNrZXQgY29ycnVwdGVkIG9uIEF0dGFjaCBCRCBoZWFkZXIiKSk7CiAgICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKICAgIHJldHVybjsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgTUFDIGFkZHJlc3MKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHsKICAgdl9TSVpFX3QgdXNNYWNBZGRyU2l6ZSA9IFZPU19NQUNfQUREUl9TSVpFOwogICAqcHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjQkRIZWFkZXJMZW4gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX01BQ19BRERSX0FMSUdOKHVjRGlzYWJsZUZybVh0bCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXB2RGVzdE1hY0FkZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzTWFjQWRkclNpemUgKTsKICB9CiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gKnB2b3NTdGF0dXMgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBleHRyYWN0IE1BQyBBZGRyICVkIiwKICAgICAgICAgICAgICAgICpwdm9zU3RhdHVzKSk7CiAgfQogIGVsc2UKICB7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIEZpbGwgTVBEVSBpbmZvIGZpZWxkczoKICAgICAgICAgIC0gTVBEVSBkYXRhIHN0YXJ0IG9mZnNldAogICAgICAgICAgLSBNUERVIGhlYWRlciBzdGFydCBvZmZzZXQKICAgICAgICAgIC0gTVBEVSBoZWFkZXIgbGVuZ3RoCiAgICAgICAgICAtIE1QRFUgbGVuZ3RoIC0gdGhpcyBpcyBhIDE2YiBmaWVsZCAtIG5lZWRzIHN3YXBwaW5nCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICB1Y0hlYWRlck9mZnNldCA9IHVjQkRIZWFkZXJMZW47CiAgICB1Y0hlYWRlckxlbiAgICA9IFdMQU5UTF9NQUNfSEVBREVSX0xFTih1Y0Rpc2FibGVGcm1YdGwpOwoKICAgIGlmICggMCAhPSB1Y0Rpc2FibGVGcm1YdGwgKQogICAgewogICAgICBpZiAoIDAgIT0gdWNRb3NFbmFibGVkICkKICAgICAgewogICAgICAgIHVjSGVhZGVyTGVuICs9IFdMQU5UTF84MDJfMTFfSEVBREVSX1FPU19DVEw7CiAgICAgIH0KCiAgICAgIC8vIFNpbWlsYXIgdG8gUW9zIHdlIG5lZWQgc29tZXRoaW5nIGZvciBXRFMgZm9ybWF0ICEKICAgICAgaWYgKCB1Y1dEU0VuYWJsZWQgIT0gMCApCiAgICAgIHsKICAgICAgICAvLyBJZiB3ZSBoYXZlIGZyYW1lIHRyYW5zbGF0aW9uIGVuYWJsZWQKICAgICAgICB1Y0hlYWRlckxlbiAgICArPSBXTEFOVExfODAyXzExX0hFQURFUl9BRERSNF9MRU47CiAgICAgIH0KICAgICAgaWYgKCBleHRyYUhlYWRTcGFjZSAhPSAwICkKICAgICAgewogICAgICAgIC8vIERlY3JlYXNlIHRoZSBwYWNrZXQgbGVuZ3RoIHdpdGggdGhlIGV4dHJhIHBhZGRpbmcgYWZ0ZXIgdGhlIGhlYWRlcgogICAgICAgICpwdXNQa3RMZW4gPSAqcHVzUGt0TGVuIC0gZXh0cmFIZWFkU3BhY2U7CiAgICAgIH0KICAgIH0KCiAgICBXTEFOSEFMX1RYX0JEX1NFVF9NUERVX0hFQURFUl9MRU4oICpwcHZCREhlYWRlciwgdWNIZWFkZXJMZW4pOwogICAgV0xBTkhBTF9UWF9CRF9TRVRfTVBEVV9IRUFERVJfT0ZGU0VUKCAqcHB2QkRIZWFkZXIsIHVjSGVhZGVyT2Zmc2V0KTsKICAgIFdMQU5IQUxfVFhfQkRfU0VUX01QRFVfREFUQV9PRkZTRVQoICpwcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNIZWFkZXJPZmZzZXQgKyB1Y0hlYWRlckxlbiArIGV4dHJhSGVhZFNwYWNlKTsKICAgIFdMQU5IQUxfVFhfQkRfU0VUX01QRFVfTEVOKCAqcHB2QkRIZWFkZXIsICpwdXNQa3RMZW4pOwoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDogVkFMVUVTIEFSRSBITGVuPSV4IEhvZmY9JXggZG9mZj0leCBsZW49JXggZXg9JWQiLAogICAgICAgICAgICAgICAgdWNIZWFkZXJMZW4sIHVjSGVhZGVyT2Zmc2V0LCAKICAgICAgICAgICAgICAgICh1Y0hlYWRlck9mZnNldCArIHVjSGVhZGVyTGVuICsgZXh0cmFIZWFkU3BhY2UpLCAKICAgICAgICAgICAgICAgICpwdXNQa3RMZW4sIGV4dHJhSGVhZFNwYWNlKSk7CiAgfS8qIGlmIHBlZWsgTUFDIHN1Y2Nlc3MqLwoKfS8qIFdMQU5UTF9QcmVwYXJlQkRIZWFkZXIgKi8KI2VuZGlmCgovL1RISVMgSVMgQSBIQUNLIEFORCBORUVEUyBUTyBCRSBGSVhFRCBGT1IgQ09OQ1VSUkVOQ1kKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5fVExHZXROZXh0VHhJZHMKCiAgREVTQ1JJUFRJT04KICAgIEdldHMgdGhlIG5leHQgc3RhdGlvbiBhbmQgbmV4dCBBQyBpbiB0aGUgbGlzdCB0aGF0IHNob3VsZCBiZSBzZXJ2ZWQgYnkgdGhlIFRMLgoKICAgIE11bHRpcGxlIFN0YXRpb24gU2NoZWR1bGluZyBhbmQgVEwgcXVldWUgbWFuYWdlbWVudC4gCgogICAgNCBIREQgQkMvTUMgZGF0YSBwYWNrZXQgcXVldWUgc3RhdHVzIGlzIHNwZWNpZmllZCBhcyBTdGF0aW9uIDAncyBzdGF0dXMuIFdlaWdodHMgdXNlZAogICAgaW4gV0ZRIGFsZ29yaXRoIGFyZSBpbml0aWFsaXplZCBpbiBXTEFOVExfT1BFTiBhbmQgY29udGFpbmVkIGluIHRsQ29uZmlnSW5mbyBmaWVsZC4KICAgIEVhY2ggc3RhdGlvbiBoYXMgZmllbGRzIG9mIHVjUGt0UGVuZGluZyBhbmQgQUMgbWFzayB0byB0ZWxsIHdoZXRoZXIgYSBBQyBoYXMgdHJhZmZpYwogICAgb3Igbm90LgogICAgICAKICAgIFN0YXRpb25zIGFyZSBzZXJ2ZWQgaW4gYSByb3VuZC1yb2JpbiBmYXNoaW9uIGZyb20gaGlnaGVzdCBwcmlvcml0eSB0byBsb3dlc3QgcHJpb3JpdHkuCiAgICBUaGUgbnVtYmVyIG9mIHJvdW5kLXJvYmluIHRpbWVzIG9mIGVhY2ggcHJpb2lydHkgZXF1YWxzIHRvIHRoZSBXRlEgd2VpZ2h0cyBhbmQgZGlmZmVyZXRpYXRlcwogICAgdGhlIHRyYWZmaWMgb2YgZGlmZmVyZW50IHByaW9pcnR5LiBBcyBzdWNoLCBzdGF0aW9ucyBjYW4gbm90IHByb3ZpZGUgbG93IHByaW9yaXR5IHBhY2tldHMgaWYKICAgIGhpZ2ggcHJpb3JpdHkgcGFja2V0cyBhcmUgYWxsIHNlcnZlZC4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHB2b3NHQ3R4OiAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgIE9VVAogICBwdWNTVEFJZDogICAgU3RhdGlvbiBJRAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZAoKICBTSURFIEVGRkVDVFMKICAgCiAgIFRMIGNvbnRleHQgY29udGFpbnMgY3VycmVudGx5IHNlcnZlZCBzdGF0aW9uIElEIGluIHVjQ3VycmVudFNUQSBmaWVsZCwgY3VycmVudGx5IHNlcnZlZCBBQwogICBpbiB1Q3VyU2VydmVkQUMgZmllbGQsIGFuZCB1bnNlcnZlZCB3ZWlnaHRzIG9mIGN1cnJlbnQgQUMgaW4gdUN1ckxlZnRXZWlnaHQuCiAgIFdoZW4gZXhpc3RpbmcgZnJvbSB0aGUgZnVuY3Rpb24sIHRoZXNlIHRocmVlIGZpZWxkcyBhcmUgY2hhbmdlZCBhY2NvcmRpbmdseS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5fVExBUEdldE5leHRUeElkcwooCiAgdl9QVk9JRF90ICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICBwdWNTVEFJZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2I7CiAgdl9VOF90ICAgICAgICAgIHVjQUNGaWx0ZXIgPSAxOwogIHZfVThfdCAgICAgICAgICB1Y05leHRTVEEsIHVjVGVtcFNUQTsKICB2X0JPT0xfdCAgICAgICAgaXNTZXJ2ZWQgPSBUUlVFOyAgLy9jdXJyZW50IHJvdW5kIGhhcyBmaW5kIGEgcGFja2V0IG9yIG5vdAogIHZfVThfdCAgICAgICAgICB1Y0FDTG9vcE51bSA9IFdMQU5UTF9BQ19ISUdIX1BSSU8gKyAxOyAvL251bWJlciBvZiBsb29wIHRvIGdvCiAgdl9VOF90ICAgICAgICAgIHVGbG93TWFzazsgLy8gVFggRmxvd01hc2sgZnJvbSBXREEKICB1aW50OCAgICAgICAgICAgdWNBQ01hc2s7IAogIHVpbnQ4ICAgICAgICAgICBpID0gMDsKICB1aW50OCAgICAgICAgICAgajsKICB1aW50OCAgICAgICAgICAgbWluV2VpZ2h0U3RhOwogIHVpbnQzMl90ICAgICAgICBzdGFfYml0bWFzayA9IDA7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgLy9FTlRFUigpOwoKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOX1RMQVBHZXROZXh0VHhJZHMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0RBX0RTX0dldFR4Rmxvd01hc2soIHB2b3NHQ3R4LCAmdUZsb3dNYXNrICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgIldMQU4gVEw6RmFpbGVkIHRvIHJldHJpZXZlIEZsb3cgY29udHJvbCBtYXNrIGZyb20gV0RBIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qIFRoZSBmbG93IG1hc2sgZG9lcyBub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGRpZmZlcmVudCBBQ3MvUXMKICAgKiBzaW5jZSB3ZSB1c2UgYSBzaW5nbGUgZHhlIGNoYW5uZWwgZm9yIGFsbCBBQ3MvUXMsIGhlbmNlIGl0IGlzCiAgICogZW5vdWdoIHRvIGNoZWNrIHRoYXQgdGhlcmUgYXJlIGR4ZSByZXNvdXJjZXMgb24gZGF0YSBjaGFubmVsCiAgICovCiAgdUZsb3dNYXNrICY9IFdMQU5UTF9EQVRBX0ZMT1dfTUFTSzsKCiAgaWYgKDAgPT0gdUZsb3dNYXNrKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDogTm8gcmVzb3VyY2VzIHRvIHNlbmQgcGFja2V0cyIpKTsKCiAgICAvLyBTZXR0aW5nIFNUQSBJZCB0byBpbnZhbGlkIGlmIG1hc2sgaXMgMAogICAgKnB1Y1NUQUlkID0gV0xBTl9NQVhfU1RBX0NPVU5UOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHVjTmV4dFNUQSA9IHBUTENiLT51Y0N1cnJlbnRTVEE7CgogICsrdWNOZXh0U1RBOwoKICBpZiAoIFdMQU5fTUFYX1NUQV9DT1VOVCA8PSB1Y05leHRTVEEgKQogICAgdWNOZXh0U1RBID0gMDsKCiAgICBpc1NlcnZlZCA9IEZBTFNFOwogICAgaWYgKCAwID09IHBUTENiLT51Y0N1ckxlZnRXZWlnaHQgKQogICAgewogICAgICAvL2N1cnJlbnQgcHJpb2lydHkgaXMgZG9uZQogICAgICBpZiAoIFdMQU5UTF9BQ19CSyA9PSAoV0xBTlRMX0FDRW51bVR5cGUpcFRMQ2ItPnVDdXJTZXJ2ZWRBQyApCiAgICAgIHsKICAgICAgICAvL2VuZCBvZiBjdXJyZW50IFZPLCBWSSwgQkUsIEJLIGxvb3AuIFJlc2V0IHByaW9yaXR5LgogICAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfSElHSF9QUklPOwogICAgICB9CiAgICAgIGVsc2UgCiAgICAgIHsKICAgICAgICBwVExDYi0+dUN1clNlcnZlZEFDIC0tOwogICAgICB9CgogICAgICBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0ID0gIHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbcFRMQ2ItPnVDdXJTZXJ2ZWRBQ107CiAKICAgIH0gLy8gKDAgPT0gcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCkKCiAgdWNUZW1wU1RBID0gdWNOZXh0U1RBOwogIG1pbldlaWdodFN0YSA9IHVjTmV4dFNUQTsKCiAgLy9kZWNpZGUgaG93IG1hbnkgbG9vcHMgdG8gZ28uIGlmIGN1cnJlbnQgbG9vcCBpcyBwYXJ0aWFsLCBkbyBvbmUgZXh0cmEgdG8gbWFrZSBzdXJlCiAgLy93ZSBjb3ZlciBldmVyeSBzdGF0aW9uCiAgaWYgKCgxID09IHBUTENiLT51Y0N1ckxlZnRXZWlnaHQpICYmICh1Y05leHRTVEEgIT0gMCkpCiAgewogICAgdWNBQ0xvb3BOdW0gKys7IC8vIG5vdyBpcyA1IGxvb3BzCiAgfQoKICAvKiBTdGFydCB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkuIHVjTmV4dFNUQSwgcFRMQ2ItPnVDdXJTZXJ2ZWRBQywgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodAogICAgIGFsbCBoYXZlIHByZXZpb3VzIHZhbHVlcy4qLwogIGZvciAoOyB1Y0FDTG9vcE51bSA+IDA7ICB1Y0FDTG9vcE51bS0tKQogIHsKCiAgICB1Y0FDRmlsdGVyID0gMSA8PCBwVExDYi0+dUN1clNlcnZlZEFDOwoKICAgIC8vIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQga2VlcHMgcHJldmlvdXMgcmVzdWx0cy4KICAgIGZvciAoOyAocFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCA+IDApIDsgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodC0tICkKICAgIHsKCiAgICAgIGZvciAoIDsgdWNOZXh0U1RBIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyB1Y05leHRTVEEgKysgKQogICAgICB7CiAgICAgICAgaWYoTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdKQogICAgICAgIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLCB1Y0FDTWFzaywgaSk7CgogICAgICAgIGlmICggKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNFeGlzdHMpIHx8CiAgICAgICAgICAgICAoKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNQa3RQZW5kaW5nKSAmJiAhKHVjQUNNYXNrKSkgfHwKICAgICAgICAgICAgICgwID09ICh1Y0FDTWFzayAmIHVjQUNGaWx0ZXIpKSApCgogICAgICAgIHsKICAgICAgICAgIC8vY3VycmVudCBzdGF0aW9uIGRvZXMgbm90IGV4aXN0IG9yIGhhdmUgYW55IHBhY2tldCB0byBzZXJ2ZS4KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKChXTEFOVExfU1RBX0FVVEhFTlRJQ0FURUQgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dGxTdGF0ZSkKICAgICAgICAgICB8fCAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+ZGlzYXNzb2NfcHJvZ3Jlc3MgPT0gVk9TX1RSVUUgKSkKICAgICAgICB7CiAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICIlcyBTdGEgJWQgbm90IGluIGF1dGggc3RhdGUgc28gc2tpcHBpbmcgaXQuIiwKICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdWNOZXh0U1RBKSk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIC8vZ28gdG8gbmV4dCBzdGF0aW9uIGlmIGN1cnJlbnQgc3RhdGlvbiBjYW4ndCBzZW5kIGR1ZSB0byBmbG93IGNvbnRyb2wKICAgICAgICAvL1N0YXRpb24gaXMgYWxsb3dlZCB0byBzZW5kIHdoZW4gaXQgaXMgbm90IGluIExXTSBtb2RlLiBXaGVuIHN0YXRpb24gaXMgaW4gTFdNIG1vZGUsCiAgICAgICAgLy9zdGF0aW9uIGlzIGFsbG93ZWQgdG8gc2VuZCBvbmx5IGFmdGVyIEZXIHJlcG9ydHMgRlcgbWVtb3J5IGlzIGJlbG93IHRocmVzaG9sZCBhbmQgb24tZmx5CiAgICAgICAgLy9wYWNrZXRzIGFyZSBsZXNzIHRoZW4gYWxsb3dlZCB2YWx1ZQogICAgICAgIGlmICggKFRSVUUgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNMd21Nb2RlRW5hYmxlZCkgJiYKICAgICAgICAgICAgICgoRkFMU0UgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dWNMd21FdmVudFJlcG9ydGVkKSB8fAogICAgICAgICAgICAgICAgICgwIDwgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+dUJ1ZmZUaHJlc2hvbGRNYXgpKQogICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogSW5pdGlhbCB3ZWlnaHQgaXMgMCBpcyBmb3IgYWxsIHRoZSBzdGF0aW9ucy4gQXMgcGFydCBvZiBGVyBUWCBzdGF0cwogICAgICAgICAqIGluZGljYXRpb24gdG8gaG9zdCwgZ29vZCBwZWVyIHdlaWdodCBpcyB1cGRhdGVkIHRvIG9uZSBhbmQgdGhlCiAgICAgICAgICogcmVtYWluaW5nIHBlZXJzIHdlaWdodCBpcyB1cGRhdGVkIGJhc2VkIG9uIHRoZWlyIFJBIHJhdGVzIGFuZCBCVFFNCiAgICAgICAgICogcXVldWVkIGZyYW1lcyBsZW5ndGguIFRMIHNraXBzIGZldGNoaW5nIHRoZSBwYWNrZXQgdW50aWwgdGhlIHN0YXRpb24KICAgICAgICAgKiBoYXMgZ290IGNoYW5jZXMgZXF1YWwgdG8gaXRzIHdlaWdodC4KICAgICAgICAgKi8KICAgICAgICBpZiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+d2VpZ2h0ID4gV0xBTlRMX0dPT0RfU1RBX1dFSUdIVCkgewogICAgICAgICAgIGlmIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT53ZWlnaHRfY291bnQgPD0KICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+d2VpZ2h0KQogICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbbWluV2VpZ2h0U3RhXS0+d2VpZ2h0IDw9IDEpCiAgICAgICAgICAgICAgICAgIG1pbldlaWdodFN0YSA9IHVjTmV4dFNUQTsKICAgICAgICAgICAgICBlbHNlIGlmIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT53ZWlnaHQgPAogICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1ttaW5XZWlnaHRTdGFdLT53ZWlnaHQpIHsKICAgICAgICAgICAgICAgICBtaW5XZWlnaHRTdGEgPSB1Y05leHRTVEE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN0YV9iaXRtYXNrIHw9ICgxIDw8IHVjTmV4dFNUQSk7CiAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+d2VpZ2h0X2NvdW50Kys7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT53ZWlnaHRfY291bnQgPSAwOwogICAgICAgIH0KCiAgICAgICAgLy8gRmluZCBhIHN0YXRpb24uIFdlaWdodCBpcyB1cGRhdGVkIGFscmVhZHkuCiAgICAgICAgKnB1Y1NUQUlkID0gdWNOZXh0U1RBOwogICAgICAgIHBUTENiLT51Y0N1cnJlbnRTVEEgPSB1Y05leHRTVEE7CiAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50QUMgPSBwVExDYi0+dUN1clNlcnZlZEFDOwogIAogICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgICIgVEwgc2VydmUgb25lIHN0YXRpb24gQUM6ICVkICBXOiAlZCBTdGFJZDogJWQiLAogICAgICAgICAgICAgICAgICAgcFRMQ2ItPnVDdXJTZXJ2ZWRBQywgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCwgcFRMQ2ItPnVjQ3VycmVudFNUQSApKTsKICAgICAgCiAgICAgICAgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodC0tOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICAgIH0gLy9TVEEgbG9vcAoKICAgICAgZm9yIChqID0gMDsgaiA8IHVjVGVtcFNUQTsgaisrKSB7CiAgICAgICAgIGlmIChOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW2pdKQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLIChwVExDYi0+YXRsU1RBQ2xpZW50c1tqXSwgdWNBQ01hc2ssIGkpOwoKICAgICAgICAgaWYgKCgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW2pdLT51Y0V4aXN0cykgfHwKICAgICAgICAgICAgICgoMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tqXS0+dWNQa3RQZW5kaW5nKSAmJiAhKHVjQUNNYXNrKSkgfHwKICAgICAgICAgICAgICgwID09ICh1Y0FDTWFzayAmIHVjQUNGaWx0ZXIpKSkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICBpZiAoKFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tqXS0+dGxTdGF0ZSkgfHwKICAgICAgICAgICAgIChwVExDYi0+YXRsU1RBQ2xpZW50c1tqXS0+ZGlzYXNzb2NfcHJvZ3Jlc3MgPT0gVk9TX1RSVUUpKSB7CiAgICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICIlcyBTdGEgJWQgbm90IGluIGF1dGggc3RhdGUgc28gc2tpcHBpbmcgaXQuIiwKICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHVjTmV4dFNUQSkpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQoKICAgICAgICAgaWYgKChUUlVFID09IHBUTENiLT5hdGxTVEFDbGllbnRzW2pdLT51Y0x3bU1vZGVFbmFibGVkKSAmJgogICAgICAgICAgICAoKEZBTFNFID09IHBUTENiLT5hdGxTVEFDbGllbnRzW2pdLT51Y0x3bUV2ZW50UmVwb3J0ZWQpIHx8CiAgICAgICAgICAgICAoMCA8IHBUTENiLT5hdGxTVEFDbGllbnRzW2pdLT51QnVmZlRocmVzaG9sZE1heCkpKQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgIGlmIChwVExDYi0+YXRsU1RBQ2xpZW50c1tqXS0+d2VpZ2h0ID4gV0xBTlRMX0dPT0RfU1RBX1dFSUdIVCkgewogICAgICAgICAgICBpZiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbal0tPndlaWdodF9jb3VudCA8PQogICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbal0tPndlaWdodCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICBpZiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbbWluV2VpZ2h0U3RhXS0+d2VpZ2h0IDw9IDEpCiAgICAgICAgICAgICAgICAgIG1pbldlaWdodFN0YSA9IGo7CiAgICAgICAgICAgICAgIGVsc2UgaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW2pdLT53ZWlnaHQgPAogICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbbWluV2VpZ2h0U3RhXS0+d2VpZ2h0KSB7CiAgICAgICAgICAgICAgICAgIG1pbldlaWdodFN0YSA9IGo7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgc3RhX2JpdG1hc2sgfD0gKDEgPDwgaik7CiAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW2pdLT53ZWlnaHRfY291bnQrKzsKICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tqXS0+d2VpZ2h0X2NvdW50ID0gMDsKICAgICAgICAgfQoKICAgICAgICAgKnB1Y1NUQUlkID0gajsKICAgICAgICAgcFRMQ2ItPnVjQ3VycmVudFNUQSA9IGo7CiAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudEFDID0gcFRMQ2ItPnVDdXJTZXJ2ZWRBQzsKCiAgICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgICAiIFRMIHNlcnZlIG9uZSBzdGF0aW9uIEFDOiAlZCAgVzogJWQgU3RhSWQ6ICVkIiwKICAgICAgICAgICAgICAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMsIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQsIHBUTENiLT51Y0N1cnJlbnRTVEEgKSk7CiAgICAgICAgIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQtLTsKICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgICAgfQoKICAgICAgLyogRmVjdGggcGFja2V0IGZyb20gdGhlIHN0YXRpb25zIHdpdGggbWluaW11bSB3ZWlnaHQgYW1vbmcgdGhlbSAqLwogICAgICBpZiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbbWluV2VpZ2h0U3RhXSAmJgogICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbbWluV2VpZ2h0U3RhXS0+dWNQa3RQZW5kaW5nKQogICAgICB7CiAgICAgICAgICpwdWNTVEFJZCA9IG1pbldlaWdodFN0YTsKICAgICAgICAgcFRMQ2ItPnVjQ3VycmVudFNUQSA9IG1pbldlaWdodFN0YTsKICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50QUMgPSBwVExDYi0+dUN1clNlcnZlZEFDOwoKICAgICAgICAgZm9yIChqID0gMDsgc3RhX2JpdG1hc2sgIT0gMDsgc3RhX2JpdG1hc2sgPj49IDEsIGorKykKICAgICAgICAgewogICAgICAgICAgICBpZiAoMCA9PSAoc3RhX2JpdG1hc2sgJiAweDEpKQogICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGlmIChtaW5XZWlnaHRTdGEgPT0gaikKICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIC8qIFRvIGVuc3VyZSBmYWlybmVzcyBiZXR3ZWVuIHN0YXRpb25zICovCiAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW2pdLT53ZWlnaHRfY291bnQgKz0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1ttaW5XZWlnaHRTdGFdLT53ZWlnaHQgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW21pbldlaWdodFN0YV0tPndlaWdodF9jb3VudDsKICAgICAgICAgfQogICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1ttaW5XZWlnaHRTdGFdLT53ZWlnaHRfY291bnQgPSAwOwoKICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICAgICIgVEwgc2VydmUgb25lIHN0YXRpb24gQUM6ICVkICBXOiAlZCBTdGFJZDogJWQiLAogICAgICAgICAgICAgICAgICAgcFRMQ2ItPnVDdXJTZXJ2ZWRBQywgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCwgcFRMQ2ItPnVjQ3VycmVudFNUQSApKTsKICAgICAgICAgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodC0tOwogICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogICAgICB9CgogICAgICB1Y05leHRTVEEgPSAwOwogICAgICBpZiAoIEZBTFNFID09IGlzU2VydmVkICkKICAgICAgewogICAgICAgIC8vY3VycmVudCBsb29wIGZpbmRzIG5vIHBhY2tldC5ubyBuZWVkIHRvIHJlcGVhdCBmb3IgdGhlIHNhbWUgcHJpb3JpdHkKICAgICAgICBicmVhazsKICAgICAgfQogICAgICAvL2N1cnJlbnQgbG9vcCBpcyBwYXJ0aWFsIGxvb3AuIGdvIGZvciBvbmUgbW9yZSBsb29wLgogICAgICBpc1NlcnZlZCA9IEZBTFNFOwoKICAgIH0gLy9XZWlnaHQgbG9vcAoKICAgIGlmIChXTEFOVExfQUNfQksgPT0gcFRMQ2ItPnVDdXJTZXJ2ZWRBQykKICAgIHsKICAgICAgcFRMQ2ItPnVDdXJTZXJ2ZWRBQyA9IFdMQU5UTF9BQ19ISUdIX1BSSU87CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMtLTsKICAgIH0KICAgIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQgPSAgcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1twVExDYi0+dUN1clNlcnZlZEFDXTsKCiAgfS8vIEFDIGxvb3AKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICIgVEwgY2FuJ3QgZmluZCBvbmUgc3RhdGlvbiB0byBzZXJ2ZSIgKSk7CgogIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfQks7CiAgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCA9IDE7CiAgLy9pbnZhbGlkIG51bWJlciB3aWxsIGJlIGNhcHR1cmVkIGJ5IGNhbGxlcgogIHBUTENiLT51Y0N1cnJlbnRTVEEgPSBXTEFOX01BWF9TVEFfQ09VTlQ7IAoKICAqcHVjU1RBSWQgPSBwVExDYi0+dWNDdXJyZW50U1RBOwogIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTl9UTEdldE5leHRUeElkcwoKICBERVNDUklQVElPTgogICAgR2V0cyB0aGUgbmV4dCBzdGF0aW9uIGFuZCBuZXh0IEFDIGluIHRoZSBsaXN0CgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogICBPVVQKICAgcHVjU1RBSWQ6ICAgIFN0YXRpb24gSUQKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTl9UTEdldE5leHRUeElkcwooCiAgdl9QVk9JRF90ICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICBwdWNTVEFJZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2I7CiAgdl9VOF90ICAgICAgICAgIHVjTmV4dEFDOwogIHZfVThfdCAgICAgICAgICB1Y05leHRTVEE7IAogIHZfVThfdCAgICAgICAgICB1Y0NvdW50OyAKICB2X1U4X3QgICAgICAgICAgdUZsb3dNYXNrOyAvLyBUWCBGbG93TWFzayBmcm9tIFdEQQogIHZfVThfdCAgICAgICAgICB1Y0FDTWFzayA9IDA7CiAgdl9VOF90ICAgICAgICAgIGkgPSAwOyAKCiAgdEJzc1N5c3RlbVJvbGUgc3lzdGVtUm9sZTsgLy9SRyBIQUNLIHRvIGJlIHJlbW92ZWQKICB0cEFuaVNpckdsb2JhbCBwTWFjOwoKICBwTWFjID0gdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfUEUsIHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcE1hYyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBNYWMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHN5c3RlbVJvbGUgPSB3ZGFHZXRHbG9iYWxTeXN0ZW1Sb2xlKHBNYWMpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOX1RMR2V0TmV4dFR4SWRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBpZiAoKGVTWVNURU1fQVBfUk9MRSA9PSBzeXN0ZW1Sb2xlKSB8fAogICAgICAoZVNZU1RFTV9TVEFfSU5fSUJTU19ST0xFID09IHN5c3RlbVJvbGUpIHx8CiAgICAgICh2b3NfY29uY3VycmVudF9vcGVuX3Nlc3Npb25zX3J1bm5pbmcoKSkgfHwgcFRMQ2ItPnVjVGRsc1BlZXJDb3VudCkKI2Vsc2UKICBpZiAoKGVTWVNURU1fQVBfUk9MRSA9PSBzeXN0ZW1Sb2xlKSB8fAogICAgICAoZVNZU1RFTV9TVEFfSU5fSUJTU19ST0xFID09IHN5c3RlbVJvbGUpIHx8CiAgICAgICh2b3NfY29uY3VycmVudF9vcGVuX3Nlc3Npb25zX3J1bm5pbmcoKSkpCiNlbmRpZgogIHsKICAgIHJldHVybiBXTEFOX1RMQVBHZXROZXh0VHhJZHMocHZvc0dDdHgscHVjU1RBSWQpOwogIH0KCgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IFdEQV9EU19HZXRUeEZsb3dNYXNrKCBwdm9zR0N0eCwgJnVGbG93TWFzayApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOkZhaWxlZCB0byByZXRyaWV2ZSBGbG93IGNvbnRyb2wgbWFzayBmcm9tIFdEQSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKiBUaGUgZmxvdyBtYXNrIGRvZXMgbm90IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBkaWZmZXJlbnQgQUNzL1FzCiAgICogc2luY2Ugd2UgdXNlIGEgc2luZ2xlIGR4ZSBjaGFubmVsIGZvciBhbGwgQUNzL1FzLCBoZW5jZSBpdCBpcwogICAqIGVub3VnaCB0byBjaGVjayB0aGF0IHRoZXJlIGFyZSBkeGUgcmVzb3VyY2VzIG9uIGRhdGEgY2hhbm5lbAogICAqLwogIHVGbG93TWFzayAmPSBXTEFOVExfREFUQV9GTE9XX01BU0s7CgogIGlmICgwID09IHVGbG93TWFzaykKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOiBObyByZXNvdXJjZXMgdG8gc2VuZCBwYWNrZXRzIikpOwoKICAgIC8vIFNldHRpbmcgU1RBIGlkIHRvIGludmFsaWQgaWYgbWFzayBpcyAwCiAgICAqcHVjU1RBSWQgPSBXTEFOX01BWF9TVEFfQ09VTlQ7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLypTVEEgaWQgLSBubyBwcmlvcml0eSB5ZXQgaW1wbGVtZW50ZWQgKi8KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaG9vc2UgdGhlIG5leHQgU1RBIGZvciB0eCAtIGZvciBub3cgZ28gaW4gYSByb3VuZCByb2JpbiBmYXNoaW9uCiAgICB0aHJvdWdoIGFsbCB0aGUgc3RhdGlvbnMgdGhhdCBoYXZlIHBlbmRpbmcgcGFja2V0cyAgICAgCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdWNOZXh0U1RBID0gcFRMQ2ItPnVjQ3VycmVudFNUQTsKICAKICBwVExDYi0+dWNDdXJyZW50U1RBID0gV0xBTl9NQVhfU1RBX0NPVU5UOyAKICBmb3IgKCB1Y0NvdW50ID0gMDsgCiAgICAgICAgdWNDb3VudCA8IFdMQU5fTUFYX1NUQV9DT1VOVDsKICAgICAgICB1Y0NvdW50KysgKQogIHsKICAgIHVjTmV4dFNUQSA9ICggKHVjTmV4dFNUQSsxKSA+PSBXTEFOX01BWF9TVEFfQ09VTlQgKT8wOih1Y05leHRTVEErMSk7CiAgICBpZihOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0pCiAgICB7CiAgICAgICAgY29udGludWU7CiAgICB9CgogICAgaWYgKChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT53ZWlnaHQgPiBXTEFOVExfR09PRF9TVEFfV0VJR0hUKSAmJgogICAgICAgIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT51Y1BrdFBlbmRpbmcpKSB7CiAgICAgICBpZiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+d2VpZ2h0X2NvdW50IDw9CiAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+d2VpZ2h0KSB7CiAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT53ZWlnaHRfY291bnQrKzsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXS0+d2VpZ2h0X2NvdW50ID0gMDsKICAgIH0KCiAgICBpZiAoKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT51Y0V4aXN0cyApICYmCiAgICAgICAgKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT51Y1BrdFBlbmRpbmcgKSkKICAgIHsKICAgICAgaWYgKFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT50bFN0YXRlKQogICAgICB7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIlNUQSBJRDogJWQgb24gV0xBTl9UTEdldE5leHRUeElkcyIsICpwdWNTVEFJZCkpOwogICAgICAgIHBUTENiLT51Y0N1cnJlbnRTVEEgPSB1Y05leHRTVEE7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIiVzIFN0YSAlZCBpcyBub3QgaW4gYXV0aCBzdGF0ZSwgc2tpcHBpbmcgdGhpcyBzdGEuIiwKICAgICAgICAgICAgICAgX19mdW5jX18sIHVjTmV4dFNUQSkpOwogICAgICB9CiAgICB9CiAgfQoKICAqcHVjU1RBSWQgPSBwVExDYi0+dWNDdXJyZW50U1RBOwoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggKnB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICJXTEFOIFRMOk5vIHN0YXRpb24gcmVnaXN0ZXJlZCB3aXRoIFRMIGF0IHRoaXMgcG9pbnQiKSk7CgogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKCiAgfQoKICAvKkNvbnZlcnQgdGhlIGFycmF5IHRvIGEgbWFzayBmb3IgZWFzaWVyIG9wZXJhdGlvbiovCiAgV0xBTl9UTF9BQ19BUlJBWV8yX01BU0soIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0sIHVjQUNNYXNrLCBpKTsKICAKICBpZiAoIDAgPT0gdWNBQ01hc2sgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgIldMQU4gVEw6IE1hc2sgMCAiCiAgICAgICJTVEEgSUQ6ICVkIG9uIFdMQU5fVExHZXROZXh0VHhJZHMiLCAqcHVjU1RBSWQpKTsKCiAgICAgLypzZXR0aW5nIFNUQSBpZCB0byBpbnZhbGlkIGlmIG1hc2sgaXMgMCovCiAgICAgKnB1Y1NUQUlkID0gV0xBTl9NQVhfU1RBX0NPVU5UOwoKICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQUMgaXMgdXBkYXRlZCB3aGVuZXZlciBhIHBhY2tldCBpcyBmZXRjaGVkIGZyb20gSEREIC0+IHRoZSBjdXJyZW50CiAgICB3ZWlnaHQgb2Ygc3VjaCBhbiBBQyBjYW5ub3QgYmUgMCAtPiBpbiB0aGlzIGNhc2UgVEwgaXMgZXhwZWN0ZWQgdG8KICAgIGV4aXQgdGhpcyBmdW5jdGlvbiBhdCB0aGlzIHBvaW50IGR1cmluZyB0aGUgbWFpbiBUeCBsb29wCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggMCA8IHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudFdlaWdodCAgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBNYWludGFpbmluZyBzZXJ2aWNlZCBBQyB0bzogJWQgZm9yIFdlaWdodDogJWQiLAogICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRBQyAsCiAgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudFdlaWdodCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBDaG9vc2UgaGlnaGVzdCBwcmlvcml0eSBBQyAtICEhISBvcHRpbWl6ZSBtZQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y05leHRBQyA9IHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudEFDOwogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJOZXh0IEFDOiAlZCIsIHVjTmV4dEFDKSk7CgogIHdoaWxlICggMCAhPSB1Y0FDTWFzayApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICIgQUMgTWFzazogJWQgTmV4dDogJWQgUmVzIDogJWQiLAogICAgICAgICAgICAgICB1Y0FDTWFzaywgKCAxIDw8IHVjTmV4dEFDICksICggdWNBQ01hc2sgJiAoIDEgPDwgdWNOZXh0QUMgKSkpKTsKCiAgICBpZiAoIDAgIT0gKCB1Y0FDTWFzayAmICggMSA8PCB1Y05leHRBQyApKSkKICAgIHsKICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudEFDICAgICA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5UTF9BQ0VudW1UeXBlKXVjTmV4dEFDOwogICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50V2VpZ2h0ID0KICAgICAgICAgICAgICAgICAgICAgICBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3VjTmV4dEFDXTsKCiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFN3aXRjaGluZyBzZXJ2aWNlZCBBQyB0bzogJWQgd2l0aCBXZWlnaHQ6ICVkIiwKICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50QUMgLAogICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRXZWlnaHQpKTsKICAgICAgIGJyZWFrOwogICAgfQoKICAgIGlmICh1Y05leHRBQyA9PSBXTEFOVExfQUNfQkspCiAgICAgICAgdWNOZXh0QUMgPSBXTEFOVExfQUNfSElHSF9QUklPOwogICAgZWxzZQogICAgICAgIHVjTmV4dEFDLS07CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIk5leHQgQUMgJWQiLCB1Y05leHRBQykpOwogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICIgQyBBQzogJWQgQyBXOiAlZCIsCiAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRBQywKICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudFdlaWdodCkpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTl9UTEdldE5leHRUeElkcyAqLwoKCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIERFRkFVTFQgSEFORExFUlM6IFJlZ2lzdGVyZWQgYXQgaW5pdGlhbGl6YXRpb24gd2l0aCBUTAogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYgoKICBERVNDUklQVElPTgogICAgRGVmYXVsdCBNZ210IEZybSByeCBjYWxsYmFjazogYXNzZXJ0cyBhbGwgdGhlIHRpbWUuIElmIHRoaXMgZnVuY3Rpb24gZ2V0cwogICAgY2FsbGVkICBpdCBtZWFucyB0aGVyZSBpcyBubyByZWdpc3RlcmVkIHJ4IGNiIHBvaW50ZXIgZm9yIE1nbXQgRnJtLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwogICAgTm90IHVzZWQuCgogIFJFVFVSTiBWQUxVRQoKICAgVk9TX1NUQVRVU19FX0ZBSUxVUkU6IEFsd2F5cyBGQUlMVVJFLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYgooCiAgdl9QVk9JRF90ICBwdm9zR0N0eCwKICB2X1BWT0lEX3QgIHZvc0J1ZmYKKQp7CiAgaWYgKCBOVUxMICE9IHZvc0J1ZmYgKQogIHsKICAgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICJXTEFOIFRMOkZhdGFsIGZhaWx1cmU6IE5vIHJlZ2lzdGVyZWQgTWdtdCBGcm0gY2xpZW50IG9uIHBrdCBSWCIpKTsKICAgIC8qIERyb3AgcGFja2V0ICovCiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQoKHZvc19wa3RfdCAqKXZvc0J1ZmYpOwogIH0KCiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6IE5vIHJlZ2lzdGVyZWQgTWdtdCBGcm0gY2xpZW50IG9uIHBrdCBSWC4gTG9hZC9VbmxvYWQgaW4gcHJvZ3Jlc3MsIElnbm9yZSIpKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwp9LypXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICBXTEFOVExfQkFQUnhEZWZhdWx0Q2IKCiAgREVTQ1JJUFRJT04KICAgIERlZmF1bHQgQkFQIHJ4IGNhbGxiYWNrOiBhc3NlcnRzIGFsbCB0aGUgdGltZS4gSWYgdGhpcyBmdW5jdGlvbiBnZXRzCiAgICBjYWxsZWQgIGl0IG1lYW5zIHRoZXJlIGlzIG5vIHJlZ2lzdGVyZWQgcnggY2IgcG9pbnRlciBmb3IgQkFQLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwogICAgTm90IHVzZWQuCgogIFJFVFVSTiBWQUxVRQoKICAgVk9TX1NUQVRVU19FX0ZBSUxVUkU6IEFsd2F5cyBGQUlMVVJFLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0JBUFJ4RGVmYXVsdENiCigKICB2X1BWT0lEX3QgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCogICAgICAgdm9zRGF0YUJ1ZmYsCiAgV0xBTlRMX0JBUEZyYW1lRW51bVR5cGUgZnJhbWVUeXBlCikKewogIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICJXTEFOIFRMOkZhdGFsIGZhaWx1cmU6IE5vIHJlZ2lzdGVyZWQgQkFQIGNsaWVudCBvbiBCQVAgcGt0IFJYIikpOwojaWZuZGVmIEJUQU1QX1RFU1QKICBWT1NfQVNTRVJUKDApOwojZW5kaWYKICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7Cn0vKldMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2IqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU1RBUnhEZWZhdWx0Q2IKCiAgREVTQ1JJUFRJT04KICAgIERlZmF1bHQgU1RBIHJ4IGNhbGxiYWNrOiBhc3NlcnRzIGFsbCB0aGUgdGltZS4gSWYgdGhpcyBmdW5jdGlvbiBnZXRzCiAgICBjYWxsZWQgIGl0IG1lYW5zIHRoZXJlIGlzIG5vIHJlZ2lzdGVyZWQgcnggY2IgcG9pbnRlciBmb3Igc3RhdGlvbi4KICAgIChNZW0gY29ycnVwdGlvbiBtb3N0IGxpa2VseSwgaXQgc2hvdWxkIG5ldmVyIGhhcHBlbikKCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKICAgIE5vdCB1c2VkLgoKICBSRVRVUk4gVkFMVUUKCiAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRTogQWx3YXlzIEZBSUxVUkUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBUnhEZWZhdWx0Q2IKKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCogICAgICAgICAgICAgIHZvc0RhdGFCdWZmLAogIHZfVThfdCAgICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgV0xBTlRMX1J4TWV0YUluZm9UeXBlKiAgcFJ4TWV0YUluZm8KKQp7CiAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgIldMQU4gVEw6IE5vIHJlZ2lzdGVyZWQgU1RBIGNsaWVudCByeCBjYiBmb3IgU1RBSUQ6ICVkIGRyb3BwaW5nIHBrdCIsCiAgICAgICAgICAgICAgIHVjU1RBSWQpKTsKICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKldMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2IqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQUZldGNoUGt0RGVmYXVsdENiCgogIERFU0NSSVBUSU9OCiAgICBEZWZhdWx0IGZldGNoIGNhbGxiYWNrOiBhc3NlcnRzIGFsbCB0aGUgdGltZS4gSWYgdGhpcyBmdW5jdGlvbiBnZXRzCiAgICBjYWxsZWQgIGl0IG1lYW5zIHRoZXJlIGlzIG5vIHJlZ2lzdGVyZWQgZmV0Y2ggY2IgcG9pbnRlciBmb3Igc3RhdGlvbi4KICAgIChNZW0gY29ycnVwdGlvbiBtb3N0IGxpa2VseSwgaXQgc2hvdWxkIG5ldmVyIGhhcHBlbikKCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKICAgIE5vdCB1c2VkLgoKICBSRVRVUk4gVkFMVUUKCiAgICBWT1NfU1RBVFVTX0VfRkFJTFVSRTogQWx3YXlzIEZBSUxVUkUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBRmV0Y2hQa3REZWZhdWx0Q2IKKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90KiAgICAgICAgICAgICAgICBwdWNTVEFJZCwKICBXTEFOVExfQUNFbnVtVHlwZSAgICAgIHVjQUMsCiAgdm9zX3BrdF90KiogICAgICAgICAgICB2b3NEYXRhQnVmZiwKICBXTEFOVExfTWV0YUluZm9UeXBlKiAgIHRsTWV0YUluZm8KKQp7CiAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgIldMQU4gVEw6RmF0YWwgZmFpbHVyZTogTm8gcmVnaXN0ZXJlZCBTVEEgY2xpZW50IG9uIGRhdGEgcGt0IFJYIikpOwogIFZPU19BU1NFUlQoMCk7CiAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwp9LypXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1R4Q29tcERlZmF1bHRDYgoKICBERVNDUklQVElPTgogICAgRGVmYXVsdCB0eCBjb21wbGV0ZSBoYW5kbGVyLiBJdCB3aWxsIHJlbGVhc2UgdGhlIGNvbXBsZXRlZCBwa3QgdG8KICAgIHByZXZlbnQgbWVtb3J5IGxlYWtzLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvCiAgICAgICAgICAgICAgICAgICAgVEwvSEFML1BFL0JBUC9IREQgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20KICAgICAgICAgICAgICAgICAgICBpdHMgY29udGV4dAogICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgVk9TUyBkYXRhIGJ1ZmZlciB0aGF0IHdhcyB0cmFuc21pdHRlZAogICAgd1R4U1RBdHVzOiAgICAgIHN0YXR1cyBvZiB0aGUgdHJhbnNtaXNzaW9uCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uOyBwbGVhc2UKICAgIGNoZWNrIHZvc19wa3RfcmV0dXJuX3BhY2tldCBmb3IgcG9zc2libGUgZXJyb3IgY29kZXMuCgogICAgUGxlYXNlIGNoZWNrICB2b3NfcGt0X3JldHVybl9wYWNrZXQgQVBJIGZvciBwb3NzaWJsZSByZXR1cm4gdmFsdWVzLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1R4Q29tcERlZmF1bHRDYgooCiB2X1BWT0lEX3QgICAgICBwdm9zR0N0eCwKIHZvc19wa3RfdCogICAgIHZvc0RhdGFCdWZmLAogVk9TX1NUQVRVUyAgICAgd1R4U1RBdHVzCikKewogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICJXTEFOIFRMOlRYQ29tcCBub3QgcmVnaXN0ZXJlZCwgcmVsZWFzaW5nIHBrdCB0byBwcmV2ZW50IG1lbSBsZWFrIikpOwogIHJldHVybiB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwp9LypXTEFOVExfVHhDb21wRGVmYXVsdENiKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIENsZWFudXAgZnVuY3Rpb25zCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ2xlYW5DQgoKICBERVNDUklQVElPTgogICAgQ2xlYW5zIFRMIGNvbnRyb2wgYmxvY2sKCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcFRMQ2I6ICAgICAgIHBvaW50ZXIgdG8gVEwncyBjb250cm9sIGJsb2NrCiAgICB1Y0VtcHR5OiAgICAgc2V0IGlmIFRMIGhhcyB0byBjbGVhbiB1cCB0aGUgcXVldWVzIGFuZCByZWxlYXNlIHBlZG5pbmcgcGt0cwoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0NsZWFuQ0IKKAogIFdMQU5UTF9DYlR5cGUqICBwVExDYiwKICB2X1U4X3QgICAgICB1Y0VtcHR5CikKewogIHZfVThfdCB1Y0luZGV4OwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfQ2xlYW5DQiIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKiBudW1iZXIgb2YgcGFja2V0cyBzZW50IHRvIEJBTCB3YWl0aW5nIGZvciB0eCBjb21wbGV0ZSBjb25maXJtYXRpb24gKi8KICBwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50ID0gMDsKCiAgLyogZ2xvYmFsIHN1c3BlbmQgZmxhZyAqLwogICB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT51Y1R4U3VzcGVuZGVkLCAxKTsKCiAgLyogcmVzb3VyY2UgZmxhZyAqLwogIHBUTENiLT51UmVzQ291bnQgPSAwOwoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDbGllbnQgc3RhdGlvbnMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOX01BWF9TVEFfQ09VTlQgOyB1Y0luZGV4KyspCiAgewogICAgaWYoTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XSkKICAgIHsKICAgICAgICBXTEFOVExfQ2xlYW5TVEEoIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdLCB1Y0VtcHR5KTsKICAgIH0KICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgTWFuYWdlbWVudCBGcmFtZSBjbGllbnQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cyA9IDA7CgogIGlmICggKCAwICE9IHVjRW1wdHkpICYmCiAgICAgICAoIE5VTEwgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKSkKICB7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYpOwogIH0KCiAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgID0gTlVMTDsKCiAgLyogc2V0IHRvIGEgZGVmYXVsdCBjYiBpbiBvcmRlciB0byBwcmV2ZW50IGNvbnN0YW50IGNoZWNraW5nIGZvciBOVUxMICovCiAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC5wZm5UbE1nbXRGcm1SeCA9IFdMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2I7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQlQgQU1QIGNsaWVudAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYi0+dGxCQVBDbGllbnQudWNFeGlzdHMgPSAwOwoKICBpZiAoKCAwICE9IHVjRW1wdHkpICYmCiAgICAgICggTlVMTCAhPSBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkpCiAgewogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYpOwogIH0KICAKICBpZiAoKCAwICE9IHVjRW1wdHkpICYmCiAgICAgICggTlVMTCAhPSBwVExDYi0+dm9zRHVtbXlCdWYgKSkKICB7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFRMQ2ItPnZvc0R1bW15QnVmKTsKICB9CgogIHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgID0gTlVMTDsKCiAgcFRMQ2ItPnZvc0R1bW15QnVmID0gTlVMTDsKICBwVExDYi0+dm9zVGVtcEJ1ZiAgPSBOVUxMOwogIHBUTENiLT51Y0NhY2hlZFNUQUlkID0gV0xBTl9NQVhfU1RBX0NPVU5UOwoKICAvKiBzZXQgdG8gYSBkZWZhdWx0IGNiIGluIG9yZGVyIHRvIHByZXZlbnQgY29uc3RhbnQgY2hlY2tpbmcgZm9yIE5VTEwgKi8KICBwVExDYi0+dGxCQVBDbGllbnQucGZuVGxCQVBSeCA9IFdMQU5UTF9CQVBSeERlZmF1bHRDYjsKCiAgcFRMQ2ItPnVjUmVnaXN0ZXJlZFN0YUlkID0gV0xBTl9NQVhfU1RBX0NPVU5UOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwoKfS8qIFdMQU5UTF9DbGVhbkNCKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0NsZWFuU1RBCgogIERFU0NSSVBUSU9OCiAgICBDbGVhbnMgYSBzdGF0aW9uIGNvbnRyb2wgYmxvY2suCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNFbXB0eTogICAgICAgIGlmIHNldCB0aGUgcXVldWVzIGFuZCBwZW5kaW5nIHBrdHMgd2lsbCBiZSBlbXB0eWVkCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0NsZWFuU1RBCigKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogIHB0bFNUQUNsaWVudCwKICB2X1U4X3QgICAgICAgICAgICAgdWNFbXB0eQopCnsKICB2X1U4X3QgIHVjSW5kZXg7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwdGxTVEFDbGllbnQgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfQ2xlYW5TVEEiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENsZWFyIHN0YXRpb24gZnJvbSBUTAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDogQ2xlYXJpbmcgU1RBIENsaWVudCBJRDogJWQsIEVtcHR5IGZsYWc6ICVkIiwKICAgICAgICAgICAgIHB0bFNUQUNsaWVudC0+d1NUQURlc2MudWNTVEFJZCwgdWNFbXB0eSApKTsKCiAgcHRsU1RBQ2xpZW50LT5wZm5TVEFSeCAgICAgICAgICA9IFdMQU5UTF9TVEFSeERlZmF1bHRDYjsKICBwdGxTVEFDbGllbnQtPnBmblNUQVR4Q29tcCAgICAgID0gV0xBTlRMX1R4Q29tcERlZmF1bHRDYjsKICBwdGxTVEFDbGllbnQtPnBmblNUQUZldGNoUGt0ICAgID0gV0xBTlRMX1NUQUZldGNoUGt0RGVmYXVsdENiOwoKICBwdGxTVEFDbGllbnQtPnRsU3RhdGUgICAgICAgICAgID0gV0xBTlRMX1NUQV9JTklUOwogIHB0bFNUQUNsaWVudC0+dGxQcmkgICAgICAgICAgICAgPSBXTEFOVExfU1RBX1BSSV9OT1JNQUw7CgogIHZvc196ZXJvX21hY2FkZHIoICZwdGxTVEFDbGllbnQtPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzICk7CiAgdm9zX3plcm9fbWFjYWRkciggJnB0bFNUQUNsaWVudC0+d1NUQURlc2MudkJTU0lEZm9ySUJTUyApOwogIHZvc196ZXJvX21hY2FkZHIoICZwdGxTVEFDbGllbnQtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcyApOwoKICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjU1RBSWQgID0gMDsKICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLndTVEFUeXBlID0gV0xBTl9TVEFfTUFYOwoKICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCAgICAgPSAwOwogIHB0bFNUQUNsaWVudC0+d1NUQURlc2MudWNBZGRSbXZMTEMgICAgICA9IDA7CiAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24gPSAwOwogIHB0bFNUQUNsaWVudC0+d1NUQURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uID0gMDsKICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjUHJvdGVjdGVkRnJhbWUgPSAwOwogIHB0bFNUQUNsaWVudC0+ZGlzYXNzb2NfcHJvZ3Jlc3MgPSBWT1NfRkFMU0U7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBBTVNEVSBpbmZvcm1hdGlvbiBmb3IgdGhlIFNUQQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoICggMCAhPSB1Y0VtcHR5ICkgJiYKICAgICAgICggTlVMTCAhPSBwdGxTVEFDbGllbnQtPnZvc0FNU0RVQ2hhaW5Sb290ICkpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgICAiV0xBTiBUTDpOb24gTlVMTCB2b3NBTVNEVUNoYWluUm9vdCBvbiBXTEFOVExfQ2xlYW5TVEEsICIKICAgICAgICAgICAgICAgInN1c3BlY3RpbmcgYSBtZW1vcnkgY29ycnVwdGlvbiIpKTsKCiAgfQoKICBwdGxTVEFDbGllbnQtPnZvc0FNU0RVQ2hhaW4gICAgID0gTlVMTDsKICBwdGxTVEFDbGllbnQtPnZvc0FNU0RVQ2hhaW5Sb290ID0gTlVMTDsKCiAgdm9zX21lbV96ZXJvKCAodl9QVk9JRF90KXB0bFNUQUNsaWVudC0+YXVjTVBEVUhlYWRlciwKICAgICAgICAgICAgICAgICBXTEFOVExfTVBEVV9IRUFERVJfTEVOKTsKICBwdGxTVEFDbGllbnQtPnVjTVBEVUhlYWRlckxlbiAgICA9IDA7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVvcmRlcmluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIFNUQQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5fTUFYX1RJRCA7IHVjSW5kZXgrKykKICB7CiAgICBpZigwID09IHB0bFNUQUNsaWVudC0+YXRsQkFSZW9yZGVySW5mb1t1Y0luZGV4XS51Y0V4aXN0cykKICAgIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZihOVUxMICE9IHB0bFNUQUNsaWVudC0+YXRsQkFSZW9yZGVySW5mb1t1Y0luZGV4XS5yZW9yZGVyQnVmZmVyKQogICAgewogICAgICBwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0ucmVvcmRlckJ1ZmZlci0+aXNBdmFpbGFibGUgPSBWT1NfVFJVRTsKICAgICAgbWVtc2V0KCZwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0ucmVvcmRlckJ1ZmZlci0+YXJyYXlCdWZmZXJbMF0sIDAsIFdMQU5UTF9NQVhfV0lOU0laRSAqIHNpemVvZih2X1BWT0lEX3QpKTsKICAgIH0KICAgIHZvc190aW1lcl9kZXN0cm95KCZwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0uYWdpbmdUaW1lcik7CiAgICBtZW1zZXQoJnB0bFNUQUNsaWVudC0+YXRsQkFSZW9yZGVySW5mb1t1Y0luZGV4XSwgMCwgc2l6ZW9mKFdMQU5UTF9CQVJlb3JkZXJUeXBlKSk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBRT1MgaW5mb3JtYXRpb24gZm9yIHRoZSBTVEEKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICBwdGxTVEFDbGllbnQtPnVjQ3VycmVudEFDICAgICA9IFdMQU5UTF9BQ19ISUdIX1BSSU87CiAgIHB0bFNUQUNsaWVudC0+dWNDdXJyZW50V2VpZ2h0ID0gMDsKICAgcHRsU1RBQ2xpZW50LT51Y1NlcnZpY2VkQUMgICAgPSBXTEFOVExfQUNfQks7CgogICB2b3NfbWVtX3plcm8oIHB0bFNUQUNsaWVudC0+YXVjQUNNYXNrLCBzaXplb2YocHRsU1RBQ2xpZW50LT5hdWNBQ01hc2spKTsKICAgdm9zX21lbV96ZXJvKCAmcHRsU1RBQ2xpZW50LT53VUFQU0RJbmZvLCBzaXplb2YocHRsU1RBQ2xpZW50LT53VUFQU0RJbmZvKSk7CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTdGF0cyBpbmZvCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIHZvc19tZW1femVybyggcHRsU1RBQ2xpZW50LT5hdVJ4Q291bnQsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0bFNUQUNsaWVudC0+YXVSeENvdW50WzBdKSogV0xBTl9NQVhfVElEKTsKICAgdm9zX21lbV96ZXJvKCBwdGxTVEFDbGllbnQtPmF1VHhDb3VudCwKICAgICAgICAgICAgICAgICBzaXplb2YocHRsU1RBQ2xpZW50LT5hdVR4Q291bnRbMF0pKiBXTEFOX01BWF9USUQpOwogICBwdGxTVEFDbGllbnQtPnJzc2lBdmcgPSAwOwoKICAgLypUeCBub3Qgc3VzcGVuZGVkIGFuZCBzdGF0aW9uIGZ1bGx5IHJlZ2lzdGVyZWQqLwogICB2b3NfYXRvbWljX3NldF9VOCggJnB0bFNUQUNsaWVudC0+dWNUeFN1c3BlbmRlZCwgMCk7CiAgIHZvc19hdG9taWNfc2V0X1U4KCAmcHRsU1RBQ2xpZW50LT51Y05vTW9yZURhdGEsIDEpOwoKICBpZiAoIDAgPT0gdWNFbXB0eSApCiAgewogICAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1VjYXN0U2lnICAgICAgID0gV0xBTl9UTF9JTlZBTElEX1VfU0lHOwogICAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y0JjYXN0U2lnICAgICAgID0gV0xBTl9UTF9JTlZBTElEX0JfU0lHOwogIH0KCiAgcHRsU1RBQ2xpZW50LT51Y0V4aXN0cyAgICAgICA9IDA7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFN0YXRpc3RpY3MgaW5mbyAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBtZW1zZXQoJnB0bFNUQUNsaWVudC0+dHJhZmZpY1N0YXRpc3RpY3MsCiAgICAgICAgIDAsCiAgICAgICAgIHNpemVvZihXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUpKTsKCiAgLypmaXggbWUhITogYWRkIG5ldyB2YWx1ZXMgZnJvbSB0aGUgVEwgQ2IgZm9yIGNsZWFudXAgKi8KICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0NsZWFuU1RBICovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9FbmFibGVVQVBTREZvckFDCgogIERFU0NSSVBUSU9OCiAgIENhbGxlZCBieSBIREQgdG8gZW5hYmxlIFVBUFNELiBUTCBpbiB0dXJuIGNhbGxzIFdEQSBBUEkgdG8gZW5hYmxlIHRoZQogICBsb2dpYyBpbiBGVy9TTE0gdG8gc3RhcnQgc2VuZGluZyB0cmlnZ2VyIGZyYW1lcy4gUHJldmlvdXNseSBUTCBoYWQgdGhlCiAgIHRyaWdnZXIgZnJhbWUgbG9naWMgd2hpY2ggbGF0ZXIgbW92ZWQgZG93biB0byBGVy4gSGVuY2UKICAgSEREIC0+IFRMIC0+IFdEQSAtPiBGVyBjYWxsIGZsb3cuCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBzdGF0aW9uIElkCiAgICB1Y0FDOiAgICAgICAgICAgQUMgZm9yIHdoaWNoIFUtQVBTRCBpcyBiZWluZyBlbmFibGVkCiAgICB1Y1RpZDogICAgICAgICAgVElEIGZvciB3aGljaCBVLUFQU0QgaXMgc2V0dXAKICAgIHVjVVA6ICAgICAgICAgICB1c2VkIHRvIHBsYWNlIGluIHRoZSB0cmlnZ2VyIGZyYW1lIGdlbmVyYXRpb24KICAgIHVjU2VydmljZUludDogICBzZXJ2aWNlIGludGVydmFsIHVzZWQgYnkgVEwgdG8gc2VuZCB0cmlnZ2VyIGZyYW1lcwogICAgdWNTdXNwZW5kSW50OiAgIHN1c3BlbmQgaW50ZXJ2YWwgdXNlZCBieSBUTCB0byBkZXRlcm1pbmUgdGhhdCBhbgogICAgICAgICAgICAgICAgICAgIGFwcCBpcyBpZGxlIGFuZCBzaG91bGQgc3RhcnQgc2VuZGluZyB0cmlnZyBmcm1zIGxlc3Mgb2Z0ZW4KICAgIHdUU0RpcjogICAgICAgICBkaXJlY3Rpb24gb2YgVFNwZWMKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfRW5hYmxlVUFQU0RGb3JBQwooCiAgdl9QVk9JRF90ICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9BQ0VudW1UeXBlICB1Y0FDLAogIHZfVThfdCAgICAgICAgICAgICB1Y1RpZCwKICB2X1U4X3QgICAgICAgICAgICAgdWNVUCwKICB2X1UzMl90ICAgICAgICAgICAgdVNlcnZpY2VJbnQsCiAgdl9VMzJfdCAgICAgICAgICAgIHVTdXNwZW5kSW50LAogIFdMQU5UTF9UU0RpclR5cGUgICB3VFNEaXIKKQp7CgogIFdMQU5UTF9DYlR5cGUqICAgICAgcFRMQ2IgICAgICA9IE5VTEw7CiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXMgICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICB0VWFwc2RJbmZvICAgICAgICAgIGhhbFVBUFNESW5mbzsgCiAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkKICAgICAgfHwgICBXTEFOVExfQUNfSU5WQUxJRCh1Y0FDKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgaW5wdXQgcGFyYW1zIG9uIFdMQU5UTF9FbmFibGVVQVBTREZvckFDIgogICAgICAgICAgICAgICAiIFRMOiAlcEsgIFNUQTogJWQgIEFDOiAlZCIsCiAgICAgICAgICAgICAgIHBUTENiLCB1Y1NUQUlkLCB1Y0FDKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICAvKlNldCB0aGlzIGZsYWcgaW4gb3JkZXIgdG8gcmVtZW1iZXIgdGhhdCB0aGlzIGlzIGEgdHJpZ2dlciBlbmFibGVkIEFDKi8KICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+d1VBUFNESW5mb1t1Y0FDXS51Y1NldCA9IDE7CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBpZihwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+d1NUQURlc2Mud1NUQVR5cGUgIT0gV0xBTl9TVEFfVERMUykKI2VuZGlmCiAgewogICAgaWYoIDAgPT0gdVNlcnZpY2VJbnQgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOklucHV0IHBhcmFtcyBvbiBXTEFOVExfRW5hYmxlVUFQU0RGb3JBQyIKICAgICAgICAgICAgICAgIiBTSTogJWQiLCB1U2VydmljZUludCApKTsKICAgIH0KCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpFbmFibGluZyBVLUFQU0QgaW4gRlcgZm9yIFNUQTogJWQgQUM6ICVkIFNJOiAlZCBTUEk6ICVkICIKICAgICAgICAgICAgICAgIkRJOiAlZCIsCiAgICAgICAgICAgICAgIHVjU1RBSWQsIHVjQUMsIHVTZXJ2aWNlSW50LCB1U3VzcGVuZEludCwKICAgICAgICAgICAgICAgcFRMQ2ItPnRsQ29uZmlnSW5mby51RGVsYXllZFRyaWdnZXJGcm1JbnQpKTsKCiAgICAvKlNhdmUgYWxsIGluZm8gZm9yIEhBTCovCiAgICBoYWxVQVBTREluZm8uc3RhaWR4ICAgICAgICAgPSB1Y1NUQUlkOwogICAgaGFsVUFQU0RJbmZvLmFjICAgICAgICAgICAgID0gdWNBQzsKICAgIGhhbFVBUFNESW5mby51cCAgICAgICAgICAgICA9IHVjVVA7CiAgICBoYWxVQVBTREluZm8uc3J2SW50ZXJ2YWwgICAgPSB1U2VydmljZUludDsKICAgIGhhbFVBUFNESW5mby5zdXNJbnRlcnZhbCAgICA9IHVTdXNwZW5kSW50OwogICAgaGFsVUFQU0RJbmZvLmRlbGF5SW50ZXJ2YWwgID0gcFRMQ2ItPnRsQ29uZmlnSW5mby51RGVsYXllZFRyaWdnZXJGcm1JbnQ7CgogICAgLypOb3RpZnkgSEFMKi8KICAgIHZvc1N0YXR1cyA9IFdEQV9FbmFibGVVYXBzZEFjUGFyYW1zKHB2b3NHQ3R4LCB1Y1NUQUlkLCAmaGFsVUFQU0RJbmZvKTsKICB9CiAgcmV0dXJuIHZvc1N0YXR1czsKCn0vKldMQU5UTF9FbmFibGVVQVBTREZvckFDKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX0Rpc2FibGVVQVBTREZvckFDCgogIERFU0NSSVBUSU9OCiAgIENhbGxlZCBieSBIREQgdG8gZGlzYWJsZSBVQVBTRC4gVEwgaW4gdHVybiBjYWxscyBXREEgQVBJIHRvIGRpc2FibGUgdGhlCiAgIGxvZ2ljIGluIEZXL1NMTSB0byBzdG9wIHNlbmRpbmcgdHJpZ2dlciBmcmFtZXMuIFByZXZpb3VzbHkgVEwgaGFkIHRoZQogICB0cmlnZ2VyIGZyYW1lIGxvZ2ljIHdoaWNoIGxhdGVyIG1vdmVkIGRvd24gdG8gRlcuIEhlbmNlCiAgIEhERCAtPiBUTCAtPiBXREEgLT4gRlcgY2FsbCBmbG93LgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgc3RhdGlvbiBJZAogICAgdWNBQzogICAgICAgICBBQyBmb3Igd2hpY2ggVS1BUFNEIGlzIGJlaW5nIGVuYWJsZWQKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0Rpc2FibGVVQVBTREZvckFDCigKICB2X1BWT0lEX3QgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgIHVjU1RBSWQsCiAgV0xBTlRMX0FDRW51bVR5cGUgIHVjQUMKKQp7CiAgV0xBTlRMX0NiVHlwZSogcFRMQ2I7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCggTlVMTCA9PSBwVExDYiApIHx8IFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApCiAgICAgIHx8ICAgV0xBTlRMX0FDX0lOVkFMSUQodWNBQykgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBpbnB1dCBwYXJhbXMgb24gV0xBTlRMX0Rpc2FibGVVQVBTREZvckFDIgogICAgICAgICAgICAgICAiIFRMOiAlcEsgIFNUQTogJWQgIEFDOiAlZCIsIHBUTENiLCB1Y1NUQUlkLCB1Y0FDICkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgLypSZXNldCB0aGlzIGZsYWcgYXMgdGhpcyBpcyBubyBsb25nZXIgYSB0cmlnZ2VyIGVuYWJsZWQgQUMqLwogIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT53VUFQU0RJbmZvW3VjQUNdLnVjU2V0ID0gMTsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkRpc2FibGluZyBVLUFQU0QgaW4gRlcgZm9yIFNUQTogJWQgQUM6ICVkICIsCiAgICAgICAgICAgICB1Y1NUQUlkLCB1Y0FDKSk7CgogIC8qTm90aWZ5IEhBTCovCiAgV0RBX0Rpc2FibGVVYXBzZEFjUGFyYW1zKHB2b3NHQ3R4LCB1Y1NUQUlkLCB1Y0FDKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9EaXNhYmxlVUFQU0RGb3JBQyAqLwoKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICBXTEFOVExfUmVnUlNTSUluZGljYXRpb25DQgoKICBERVNDUklQVElPTiAgUmVnaXN0cmF0aW9uIGZ1bmN0aW9uIHRvIGdldCBub3RpZmljYXRpb24gaWYgUlNTSSBjcm9zcwogICAgICAgICAgICAgICB0aHJlc2hvbGQuCiAgICAgICAgICAgICAgIENsaWVudCBzaG91bGQgcmVnaXN0ZXIgdGhyZXNob2xkLCBkaXJlY3Rpb24sIGFuZCBub3RpZmljYXRpb24KICAgICAgICAgICAgICAgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgoKICBERVBFTkRFTkNJRVMgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICBpbiByc3NpVmFsdWUgLSBSU1NJIHRocmVzaG9sZCB2YWx1ZQogICAgICAgICAgICAgICBpbiB0cmlnZ2VyRXZlbnQgLSBDcm9zcyBkaXJlY3Rpb24gc2hvdWxkIGJlIG5vdGlmaWVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQLCBET1dOLCBhbmQgQ1JPU1MKICAgICAgICAgICAgICAgaW4gY3Jvc3NDQkZ1bmN0aW9uIC0gTm90aWZpY2F0aW9uIENCIEZ1bmN0aW9uCiAgICAgICAgICAgICAgIGluIHVzckN0eHQgLSB1c2VyIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX1JlZ1JTU0lJbmRpY2F0aW9uQ0IKKAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAogICB2X1M3X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc2lWYWx1ZSwKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQsCiAgIFdMQU5UTF9SU1NJQ3Jvc3NUaHJlc2hvbGRDQlR5cGUgY3Jvc3NDQkZ1bmN0aW9uLAogICBWT1NfTU9EVUxFX0lEICAgICAgICAgICAgICAgICAgIG1vZHVsZUlELAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgIHVzckN0eHQKKQp7CiAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CgogICBzdGF0dXMgPSBXTEFOVExfSFNSZWdSU1NJSW5kaWNhdGlvbkNCKHBBZGFwdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc2lWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3NDQkZ1bmN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzckN0eHQpOwoKICAgcmV0dXJuIHN0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICBXTEFOVExfRGVyZWdSU1NJSW5kaWNhdGlvbkNCCgogIERFU0NSSVBUSU9OICBSZW1vdmUgc3BlY2lmaWMgdGhyZXNob2xkIGZyb20gbGlzdAoKICBERVBFTkRFTkNJRVMgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICBpbiByc3NpVmFsdWUgLSBSU1NJIHRocmVzaG9sZCB2YWx1ZQogICAgICAgICAgICAgICBpbiB0cmlnZ2VyRXZlbnQgLSBDcm9zcyBkaXJlY3Rpb24gc2hvdWxkIGJlIG5vdGlmaWVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQLCBET1dOLCBhbmQgQ1JPU1MKICAgCiAgUkVUVVJOIFZBTFVFIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX0RlcmVnUlNTSUluZGljYXRpb25DQgooCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIHZfUzdfdCAgICAgICAgICAgICAgICAgICAgICAgICAgcnNzaVZhbHVlLAogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJFdmVudCwKICAgV0xBTlRMX1JTU0lDcm9zc1RocmVzaG9sZENCVHlwZSBjcm9zc0NCRnVuY3Rpb24sCiAgIFZPU19NT0RVTEVfSUQgICAgICAgICAgICAgICAgICAgbW9kdWxlSUQKKQp7CiAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CgogICBzdGF0dXMgPSBXTEFOVExfSFNEZXJlZ1JTU0lJbmRpY2F0aW9uQ0IocEFkYXB0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc3NpVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9zc0NCRnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVJRCk7CiAgIHJldHVybiBzdGF0dXM7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgV0xBTlRMX1NldEFscGhhCgogIERFU0NSSVBUSU9OICBBTFBMQSBpcyB3ZWlnaHQgdmFsdWUgdG8gY2FsY3VsYXRlIEFWRyBSU1NJCiAgICAgICAgICAgICAgIGF2Z1JTU0kgPSAoQUxQSEEgKiBoaXN0b3J5UlNTSSkgKyAoKDEwIC0gQUxQSEEpICogbmV3UlNTSSkKICAgICAgICAgICAgICAgYXZnUlNTSSBoYXMgKEFMUEhBICogMTApJSBvZiBoaXN0b3J5IFJTU0kgd2VpZ2h0IGFuZAogICAgICAgICAgICAgICAoMTAgLSBBTFBIQSklIG9mIG5ld1JTU0kgd2VpZ2h0CiAgICAgICAgICAgICAgIFRoaXMgcG9ydGlvbiBpcyBkeW5hbWljYWxseSBjb25maWd1cmFibGUuCiAgICAgICAgICAgICAgIERlZmF1bHQgaXMgPwoKICBERVBFTkRFTkNJRVMgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICBpbiB2YWx1ZUFscGFoIC0gQUxQSEEKICAgCiAgUkVUVVJOIFZBTFVFIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX1NldEFscGhhCigKICAgdl9QVk9JRF90IHBBZGFwdGVyLAogICB2X1U4X3QgICAgdmFsdWVBbHBoYQopCnsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKCiAgIHN0YXR1cyA9IFdMQU5UTF9IU1NldEFscGhhKHBBZGFwdGVyLCB2YWx1ZUFscGhhKTsKICAgcmV0dXJuIHN0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgRlVOQ1RJT04KCiAgIERFU0NSSVBUSU9OIAogICAgCiAgIFBBUkFNRVRFUlMgCgogICBSRVRVUk4gVkFMVUUKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9CTVBTUlNTSVJlZ2lvbkNoYW5nZWROb3RpZmljYXRpb24KKAogICB2X1BWT0lEX3QgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIHRwU2lyUlNTSU5vdGlmaWNhdGlvbiBwUlNTSU5vdGlmaWNhdGlvbgopCnsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKCiAgIHN0YXR1cyA9IFdMQU5UTF9IU0JNUFNSU1NJUmVnaW9uQ2hhbmdlZE5vdGlmaWNhdGlvbihwQWRhcHRlciwgcFJTU0lOb3RpZmljYXRpb24pOwogICByZXR1cm4gc3RhdHVzOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgIFdMQU5UTF9SZWdHZXRUcmFmZmljU3RhdHVzCgogIERFU0NSSVBUSU9OICBSZWdpc3RyYXRpb24gZnVuY3Rpb24gZm9yIHRyYWZmaWMgc3RhdHVzIG1vbml0b3JpbmcKICAgICAgICAgICAgICAgRHVyaW5nIG1lYXN1cmUgcGVyaW9kIGNvdW50IGRhdGEgZnJhbWVzLgogICAgICAgICAgICAgICBJZiBmcmFtZSBjb3VudCBpcyBsYXJnZXIgdGhlbiBJRExFIHRocmVzaG9sZCBzZXQgYXMgdHJhZmZpYyBPTgogICAgICAgICAgICAgICBvciBPRkYuCiAgICAgICAgICAgICAgIEFuZCB0cmFmZmljIHN0YXR1cyBpcyBjaGFuZ2VkIHNlbmQgcmVwb3J0IHRvIGNsaWVudCB3aXRoCiAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24KCiAgREVQRU5ERU5DSUVTIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKICAgICAgICAgICAgICAgaW4gaWRsZVRocmVzaG9sZCAtIFRyYWZmaWMgb24gb3Igb2ZmIHRocmVzaG9sZAogICAgICAgICAgICAgICBpbiBtZWFzdXJlUGVyaW9kIC0gVHJhZmZpYyBzdGF0ZSBjaGVjayBwZXJpb2QKICAgICAgICAgICAgICAgaW4gdHJmZmljU3RhdHVzQ0IgLSB0cmFmZmljIHN0YXR1cyBjaGFuZ2VkIG5vdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCIGZ1bmN0aW9uCiAgICAgICAgICAgICAgIGluIHVzckN0eHQgLSB1c2VyIGNvbnRleHQKICAgCiAgUkVUVVJOIFZBTFVFIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX1JlZ0dldFRyYWZmaWNTdGF0dXMKKAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAogICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkbGVUaHJlc2hvbGQsCiAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVBlcmlvZCwKICAgV0xBTlRMX1RyYWZmaWNTdGF0dXNDaGFuZ2VkQ0JUeXBlICB0cmZmaWNTdGF0dXNDQiwKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgICAgICB1c3JDdHh0CikKewogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwoKICAgc3RhdHVzID0gV0xBTlRMX0hTUmVnR2V0VHJhZmZpY1N0YXR1cyhwQWRhcHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGxlVGhyZXNob2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVQZXJpb2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJmZmljU3RhdHVzQ0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNyQ3R4dCk7CiAgIHJldHVybiBzdGF0dXM7Cn0KI2VuZGlmCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9HZXRTdGF0aXN0aWNzCgogIERFU0NSSVBUSU9OICAgR2V0IHRyYWZmaWMgc3RhdGlzdGljcyBmb3IgaWRlbnRpZmllZCBzdGF0aW9uIAoKICBERVBFTkRFTkNJRVMgIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCiAgICAgICAgICAgICAgICBpbiBzdGF0VHlwZSAtIHNwZWNpZmljIHN0YXRpc3RpY3MgZmllbGQgdG8gcmVzZXQKICAgICAgICAgICAgICAgIG91dCBzdGF0QnVmZmVyIC0gdHJhZmZpYyBzdGF0aXN0aWNzIGJ1ZmZlcgogICAKICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVMKCiAgU0lERSBFRkZFQ1RTICBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9HZXRTdGF0aXN0aWNzCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSAgKnN0YXRCdWZmZXIsCiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgIFNUQWlkCikKewogIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAqcFRMQ2IgID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgICBwQ2xpZW50U1RBID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRpc3RpY3MgPSBOVUxMOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIG9uIFdMQU5UTF9HZXRTdGF0aXN0aWNzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tTVEFpZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZigwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6ICVkIFNUQSBJRCBkb2VzIG5vdCBleGlzdCIsIFNUQWlkKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYoTlVMTCA9PSBzdGF0QnVmZmVyKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6SW52YWxpZCBUTCBzdGF0aXN0aWNzIGJ1ZmZlciBwb2ludGVyIG9uIFdMQU5UTF9HZXRTdGF0aXN0aWNzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIHN0YXRpc3RpY3MgPSAmcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3M7CiAgdm9zX21lbV9jb3B5KHN0YXRCdWZmZXIsIHN0YXRpc3RpY3MsIHNpemVvZihXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUpKTsKCiAgcmV0dXJuIHN0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX1Jlc2V0U3RhdGlzdGljcwoKICBERVNDUklQVElPTiAgIFJlc2V0IHN0YXRpc3RpY3Mgc3RydWN0dXJlIGZvciBpZGVudGlmaWVkIHN0YXRpb24gSUQKICAgICAgICAgICAgICAgIFJlc2V0IG1lYW5zIHNldCB2YWx1ZXMgYXMgMAoKICBERVBFTkRFTkNJRVMgIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCiAgICAgICAgICAgICAgICBpbiBzdGF0VHlwZSAtIHNwZWNpZmljIHN0YXRpc3RpY3MgZmllbGQgdG8gcmVzZXQKICAgCiAgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyAgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfUmVzZXRTdGF0aXN0aWNzCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgIFNUQWlkCikKewogIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAqcFRMQ2IgID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgICBwQ2xpZW50U1RBID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRpc3RpY3MgPSBOVUxMOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKE5VTEwgPT0gcFRMQ2IpIAogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgb24gV0xBTlRMX0dldFN0YXRpc3RpY3MiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW1NUQWlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmKDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMpCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDogJWQgU1RBIElEIGRvZXMgbm90IGV4aXN0IiwgU1RBaWQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBzdGF0aXN0aWNzID0gJnBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzOwogIHZvc19tZW1femVybygodl9WT0lEX3QgKilzdGF0aXN0aWNzLCBzaXplb2YoV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFKSk7CgogIHJldHVybiBzdGF0dXM7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9HZXRTcGVjU3RhdGlzdGljCgogIERFU0NSSVBUSU9OICAgR2V0IHNwZWNpZmljIGZpZWxkIHdpdGhpbiBzdGF0aXN0aWNzIHN0cnVjdHVyZSBmb3IKICAgICAgICAgICAgICAgIGlkZW50aWZpZWQgc3RhdGlvbiBJRCAKCiAgREVQRU5ERU5DSUVTICBOT05FCgogIFBBUkFNRVRFUlMgICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCiAgICAgICAgICAgICAgICBpbiBzdGF0VHlwZSAtIHNwZWNpZmljIHN0YXRpc3RpY3MgZmllbGQgdG8gcmVzZXQKICAgICAgICAgICAgICAgIGluIFNUQWlkICAgIC0gU3RhdGlvbiBJRAogICAgICAgICAgICAgICAgb3V0IGJ1ZmZlciAgLSBTdGF0aXN0aWMgdmFsdWUKICAgCiAgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyAgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfR2V0U3BlY1N0YXRpc3RpYwooCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIFdMQU5UTF9UUkFOU0ZFUl9TVEFUSUNfVFlQRSAgc3RhdFR5cGUsCiAgIHZfVTMyX3QgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyLAogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICAgIFNUQWlkCikKewogIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAqcFRMQ2IgID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgICBwQ2xpZW50U1RBID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgKnN0YXRpc3RpY3MgPSBOVUxMOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKE5VTEwgPT0gcFRMQ2IpIAogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgb24gV0xBTlRMX0dldFN0YXRpc3RpY3MiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbU1RBaWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYoMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cykKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOiAlZCBTVEEgSUQgZG9lcyBub3QgZXhpc3QiLCBTVEFpZCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmKE5VTEwgPT0gYnVmZmVyKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6SW52YWxpZCBUTCBzdGF0aXN0aWMgYnVmZmVyIHBvaW50ZXIgb24gV0xBTlRMX0dldFN0YXRpc3RpY3MiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgc3RhdGlzdGljcyA9ICZwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljczsKICBzd2l0Y2goc3RhdFR5cGUpCiAgewogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX1VDX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eFVDRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX01DX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eE1DRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX0JDX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eEJDRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX1VDX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eFVDQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX01DX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eE1DQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX0JDX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT50eEJDQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1VDX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeFVDRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX01DX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeE1DRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDX0ZDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeEJDRmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1VDX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeFVDQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX01DX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeE1DQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeEJDQmNudDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDTlQ6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeEJjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ05UX0NSQ19PSzoKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnJ4QmNudENSQ29rOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfUkFURToKICAgICAgKmJ1ZmZlciA9IHN0YXRpc3RpY3MtPnJ4UmF0ZTsKICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgKmJ1ZmZlciA9IDA7CiAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKICAgICAgYnJlYWs7CiAgfQoKCiAgcmV0dXJuIHN0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX1Jlc2V0U3BlY1N0YXRpc3RpYwoKICBERVNDUklQVElPTiAgIFJlc2V0IHNwZWNpZmljIGZpZWxkIHdpdGhpbiBzdGF0aXN0aWNzIHN0cnVjdHVyZSBmb3IKICAgICAgICAgICAgICAgIGlkZW50aWZpZWQgc3RhdGlvbiBJRAogICAgICAgICAgICAgICAgUmVzZXQgbWVhbnMgc2V0IGFzIDAKCiAgREVQRU5ERU5DSUVTICBOT05FCiAgICAKICBQQVJBTUVURVJTICAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICAgaW4gc3RhdFR5cGUgLSBzcGVjaWZpYyBzdGF0aXN0aWNzIGZpZWxkIHRvIHJlc2V0CiAgICAgICAgICAgICAgICBpbiBTVEFpZCAgICAtIFN0YXRpb24gSUQKCiAgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyAgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfUmVzZXRTcGVjU3RhdGlzdGljCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICBwQWRhcHRlciwKICAgV0xBTlRMX1RSQU5TRkVSX1NUQVRJQ19UWVBFICBzdGF0VHlwZSwKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICBTVEFpZAopCnsKICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgKnBUTENiICA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgICAgcENsaWVudFNUQSA9IE5VTEw7CiAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICpzdGF0aXN0aWNzID0gTlVMTDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmIChOVUxMID09IHBUTENiKSAKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIG9uIFdMQU5UTF9HZXRTdGF0aXN0aWNzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tTVEFpZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZigwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6ICVkIFNUQSBJRCBkb2VzIG5vdCBleGlzdCIsIFNUQWlkKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgc3RhdGlzdGljcyA9ICZwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljczsKICBzd2l0Y2goc3RhdFR5cGUpCiAgewogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX1VDX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4VUNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX01DX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4TUNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX0JDX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4QkNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX1VDX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4VUNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX01DX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4TUNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1RYX0JDX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnR4QkNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1VDX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4VUNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX01DX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4TUNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDX0ZDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4QkNGY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1VDX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4VUNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX01DX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4TUNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4QkNCY250ID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX0JDTlQ6CiAgICAgIHN0YXRpc3RpY3MtPnJ4QmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ05UX0NSQ19PSzoKICAgICAgc3RhdGlzdGljcy0+cnhCY250Q1JDb2sgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfUkFURToKICAgICAgc3RhdGlzdGljcy0+cnhSYXRlID0gMDsKICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgICBicmVhazsKICB9CgogIHJldHVybiBzdGF0dXM7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICBGVU5DVElPTgoKICAgREVTQ1JJUFRJT04gICBSZWFkIFJTU0kgdmFsdWUgb3V0IG9mIGEgUlggQkQKICAgIAogICBQQVJBTUVURVJTOiAgQ2FsbGVyIG11c3QgdmFsaWRhdGUgYWxsIHBhcmFtZXRlcnMgCgogICBSRVRVUk4gVkFMVUUKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9SZWFkUlNTSQooCiAgIHZfUFZPSURfdCAgICAgICAgcEFkYXB0ZXIsCiAgIHZfUFZPSURfdCAgICAgICAgcEJESGVhZGVyLAogICB2X1U4X3QgICAgICAgICAgIFNUQWlkCikKewogICBXTEFOVExfQ2JUeXBlICAgKnRsQ3R4dCA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogICB2X1M3X3QgICAgICAgICAgIGN1cnJlbnRSU1NJLCBjdXJyZW50UlNTSTAsIGN1cnJlbnRSU1NJMTsKCgogICBpZihOVUxMID09IHRsQ3R4dCkKICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzIEludmFsaWQgVEwgaGFuZGxlIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICAgfQoKICAgaWYgKCBOVUxMID09IHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0gKQogICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgIH0KCiAgIGN1cnJlbnRSU1NJMCA9IFdMQU5UTF9HRVRSU1NJMChwQkRIZWFkZXIpOwogICBjdXJyZW50UlNTSTEgPSBXTEFOVExfR0VUUlNTSTEocEJESGVhZGVyKTsKICAgY3VycmVudFJTU0kgID0gKGN1cnJlbnRSU1NJMCA+IGN1cnJlbnRSU1NJMSkgPyBjdXJyZW50UlNTSTAgOiBjdXJyZW50UlNTSTE7CgogICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5yc3NpQXZnID0gY3VycmVudFJTU0k7CgogICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICBGVU5DVElPTgoKICAgREVTQ1JJUFRJT04gICBSZWFkIFNOUiB2YWx1ZSBvdXQgb2YgYSBSWCBCRAoKICAgUEFSQU1FVEVSUzogIENhbGxlciBtdXN0IHZhbGlkYXRlIGFsbCBwYXJhbWV0ZXJzCgogICBSRVRVUk4gVkFMVUUKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9SZWFkU05SCigKICAgdl9QVk9JRF90ICAgICAgICBwQWRhcHRlciwKICAgdl9QVk9JRF90ICAgICAgICBwQkRIZWFkZXIsCiAgIHZfVThfdCAgICAgICAgICAgU1RBaWQKKQp7CiAgIFdMQU5UTF9DYlR5cGUgICAqdGxDdHh0ID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgIHZfUzdfdCAgICAgICAgICAgY3VycmVudFNOUjsKCgogICBpZiAoTlVMTCA9PSB0bEN0eHQpCiAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgIiVzIEludmFsaWQgVEwgaGFuZGxlIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICAgfQoKICAgaWYgKE5VTEwgPT0gdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXSkKICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICB9CgogICBjdXJyZW50U05SID0gV0xBTlRMX0dFVFNOUihwQkRIZWFkZXIpOwoKICAgLyogU05SIHJlcG9ydGVkIGluIHRoZSBCdWZmZXIgRGVzY3JpcHRvciBpcyBzY2FsZWQgdXAgYnkgMihTTlIqMiksCiAgICAqIEdldCB0aGUgY29ycmVjdCBTTlIgdmFsdWUKICAgICovCiAgIGN1cnJlbnRTTlIgPSBjdXJyZW50U05SID4+IDE7CgogICAvKiBTTlIgcmVwb3J0ZWQgYnkgSFcgY2Fubm90IGJlIG1vcmUgdGhhbiAzNWRCIGR1ZSB0byBIVyBsaW1pdGF0aW9ucyAqLwogICBjdXJyZW50U05SID0gKFdMQU5UTF9NQVhfSFdfU05SID4gY3VycmVudFNOUiA/IGN1cnJlbnRTTlIgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9NQVhfSFdfU05SKTsKCiAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICIlczogc25yc3VtOiAlZCBzbnJpZHg6ICVkIHByZXZzbnJhdmc6ICVkIiwKICAgICAgICAgICBfX2Z1bmNfXywKICAgICAgICAgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJTdW0sCiAgICAgICAgICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25ySWR4LAogICAgICAgICAgIHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0tPnByZXZTbnJBdmcpKTsKCiAgIC8qIFRoZSBTTlIgcmV0dXJuZWQgZm9yIGFsbCBwdXJwb3NlcyBpcyB0aGUgYXZlcmFnZSBTTlIgb3ZlcgogICAgKiBXTEFOVExfTUFYX1NOUl9EQVRBX1NNQVBMRVMuV2hlbiBkYXRhIHNhbXBsZXMKICAgICogPiBXTEFOVExfTUFYX1NOUl9EQVRBX1NBTVBMRVMgYXJlIG9idGFpbmVkLAogICAgKiBzdG9yZSB0aGUgYXZlcmFnZSBvZiB0aGUgc2FtcGxlcyBpbiBwcmV2U25yQXZnCiAgICAqIGFuZCBzdGFydCBhIG5ldyBhdmVyYWdpbmcgd2luZG93LiBUaGUgcHJldlNuckF2ZyBpcyB1c2VkIHdoZW4KICAgICogZW5vdWdoIGRhdGEgc2FtcGxlcyBhcmUgbm90IGF2YWlsYWJsZSB3aGVuIGFwcGxpY2F0aW9ucwogICAgKiBhY3R1YWxseSBxdWVyeSBmb3IgU05SLgogICAgKgogICAgKiBTRUU6IFdMQU5UTF9HZXRTbnIoKQogICAgKi8KICAgaWYgKHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0tPnNucklkeCA+PSBXTEFOVExfTUFYX1NOUl9EQVRBX1NBTVBMRVMpCiAgIHsKICAgICAgIHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0tPnByZXZTbnJBdmcgPQogICAgICAgICAgICAgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJTdW0gLwogICAgICAgICAgICAgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJJZHg7CiAgICAgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJTdW0gPSAwOwogICAgICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25ySWR4ID0gMDsKICAgfQogICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJTdW0gKz0gY3VycmVudFNOUjsKICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25ySWR4ICs9IDE7CgogICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgovKgogREVTQ1JJUFRJT04gCiAgICBUTCByZXR1cm5zIHRoZSB3ZWlnaHQgY3VycmVudGx5IG1haW50YWluZWQgaW4gVEwuCiBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKCiBPVVQKICAgIHBBQ1dlaWdodHM6ICAgICBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSBmb3IgZmlsbGluZyBpbiB3ZWlnaHRzCgogUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCiovClZPU19TVEFUVVMgIApXTEFOVExfR2V0QUNXZWlnaHRzIAooIAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QqICAgICAgICAgICAgICAgcEFDV2VpZ2h0cwopCnsKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAgdl9VOF90ICAgICAgICAgIHVjSW5kZXg7IAogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBBQ1dlaWdodHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0QUNXZWlnaHRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldEFDV2VpZ2h0cyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTlRMX01BWF9BQyA7IHVjSW5kZXgrKykKICB7CiAgICBwQUNXZWlnaHRzW3VjSW5kZXhdID0gcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1t1Y0luZGV4XTsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCgoKLyoKIERFU0NSSVBUSU9OIAogICAgQ2hhbmdlIHRoZSB3ZWlnaHQgY3VycmVudGx5IG1haW50YWluZWQgYnkgVEwuCiBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncyAKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dCAKICAgIHBBQ1dlaWdodHM6ICAgICBDYWxsZXIgYWxsb2NhdGVkIG1lbW9yeSBjb250YWluIHRoZSB3ZWlnaHRzIHRvIHVzZQoKCiBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVMKKi8KVk9TX1NUQVRVUyAgCldMQU5UTF9TZXRBQ1dlaWdodHMgCiggCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICAgICAgICAgICBwQUNXZWlnaHRzCikKewogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogICB2X1U4X3QgICAgICAgICAgdWNJbmRleDsgCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcEFDV2VpZ2h0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9HZXRBQ1dlaWdodHMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfR2V0QUNXZWlnaHRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOVExfTUFYX0FDIDsgdWNJbmRleCsrKQogIHsKICAgIHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNJbmRleF0gPSBwQUNXZWlnaHRzW3VjSW5kZXhdOwogIH0KCiAgcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1tXTEFOVExfQUNfSElHSF9QUklPXSA9IHBBQ1dlaWdodHNbV0xBTlRMX0FDX1ZPXTsKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgRlVOQ1RJT04KCiAgIERFU0NSSVBUSU9OIAogICAgCiAgIFBBUkFNRVRFUlMgCgogICBSRVRVUk4gVkFMVUUKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2b2lkIFdMQU5UTF9Qb3dlclN0YXRlQ2hhbmdlZENCCigKICAgdl9QVk9JRF90IHBBZGFwdGVyLAogICB0UG1jU3RhdGUgbmV3U3RhdGUKKQp7CiAgIFdMQU5UTF9DYlR5cGUgICAgICAgICAgICAgICAgKnRsQ3R4dCA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwoKICAgaWYgKE5VTEwgPT0gdGxDdHh0KQogICB7CiAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgVEwgQ29udHJvbCBCbG9jayIsIF9fZnVuY19fICk7CiAgICAgcmV0dXJuOwogICB9CgogICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLCAiUG93ZXIgc3RhdGUgY2hhbmdlZCwgbmV3IHN0YXRlIGlzICVkIiwgbmV3U3RhdGUgKTsKICAgc3dpdGNoKG5ld1N0YXRlKQogICB7CiAgICAgIGNhc2UgRlVMTF9QT1dFUjoKICAgICAgICAgdGxDdHh0LT5pc0JNUFMgPSBWT1NfRkFMU0U7CiAgICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBCTVBTOgojaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwogICAgICAgICBXTEFOVExfU2V0RldSU1NJVGhyZXNob2xkcyhwQWRhcHRlcik7CiNlbmRpZgoKICAgICAgICAgdGxDdHh0LT5pc0JNUFMgPSBWT1NfVFJVRTsKICAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIElNUFM6CiAgICAgIGNhc2UgTE9XX1BPV0VSOgogICAgICBjYXNlIFJFUVVFU1RfQk1QUzoKICAgICAgY2FzZSBSRVFVRVNUX0ZVTExfUE9XRVI6CiAgICAgIGNhc2UgUkVRVUVTVF9JTVBTOgogICAgICBjYXNlIFNUT1BQRUQ6CiAgICAgIGNhc2UgUkVRVUVTVF9TVEFSVF9VQVBTRDoKICAgICAgY2FzZSBSRVFVRVNUX1NUT1BfVUFQU0Q6CiAgICAgIGNhc2UgVUFQU0Q6CiAgICAgIGNhc2UgUkVRVUVTVF9TVEFOREJZOgogICAgICBjYXNlIFNUQU5EQlk6CiAgICAgIGNhc2UgUkVRVUVTVF9FTlRFUl9XT1dMOgogICAgICBjYXNlIFJFUVVFU1RfRVhJVF9XT1dMOgogICAgICBjYXNlIFdPV0w6CiAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLCAiTm90IGhhbmRsZSB0aGlzIGV2ZW50cyAlZCIsIG5ld1N0YXRlICkpOwogICAgICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIk5vdCBhIHZhbGlkIGV2ZW50ICVkIiwgbmV3U3RhdGUgKSk7CiAgICAgICAgIGJyZWFrOwogICB9CgogICByZXR1cm47Cn0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldEV0aGVyVHlwZQoKICBERVNDUklQVElPTiAgIEV4dHJhY3QgRXRoZXIgdHlwZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRAoKICBERVBFTkRFTkNJRVMgIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICAgaW4gYXVjQkRIZWFkZXIgLSBCRCBoZWFkZXIKICAgICAgICAgICAgICAgIGluIHZvc0RhdGFCdWZmIC0gZGF0YSBidWZmZXIKICAgICAgICAgICAgICAgIGluIHVjTVBEVUhMZW4gIC0gTVBEVSBoZWFkZXIgbGVuZ3RoCiAgICAgICAgICAgICAgICBvdXQgcFVzRXRoZXJUeXBlIC0gcG9pbnRlciB0byBFdGhlcnR5cGUKCiAgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTX1NVQ0NFU1MgOiBpZiB0aGUgRXRoZXJUeXBlIGlzIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQKICAgICAgICAgICAgICAgIFZPU19TVEFUVVNfRkFJTFVSRSA6IGlmIHRoZSBFdGhlclR5cGUgZXh0cmFjdGlvbiBmYWlsZWQgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFja2V0IHdhcyBkcm9wcGVkCgogIFNJREUgRUZGRUNUUyAgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kc3RhdGljIFZPU19TVEFUVVMgV0xBTlRMX0dldEV0aGVyVHlwZQooCiAgIHZfVThfdCAgICAgICAgICAgICAgICogYXVjQkRIZWFkZXIsCiAgIHZvc19wa3RfdCAgICAgICAgICAgICogdm9zRGF0YUJ1ZmYsCiAgIHZfVThfdCAgICAgICAgICAgICAgICAgdWNNUERVSExlbiwKICAgdl9VMTZfdCAgICAgICAgICAgICAgKiBwVXNFdGhlclR5cGUKKQp7CiAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjT2Zmc2V0OwogIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c0V0aGVyVHlwZSA9ICpwVXNFdGhlclR5cGU7CiAgdl9TSVpFX3QgICAgICAgICAgICAgICAgIHVzTExDU2l6ZSA9IHNpemVvZih1c0V0aGVyVHlwZSk7CiAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgIHZvc1N0YXR1cyAgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIExMQyBpcyBwcmVzZW50IC0gaWYgbm90LCBUTCBpcyB1bmFibGUgdG8gZGV0ZXJtaW5lIHR5cGUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIFZPU19GQUxTRSA9PSBXREFfSVNfUlhfTExDX1BSRVNFTlQoIGF1Y0JESGVhZGVyICkgKQogIHsKICAgIHVjT2Zmc2V0ID0gV0xBTlRMXzgwMl8zX0hFQURFUl9MRU4gLSBzaXplb2YodXNFdGhlclR5cGUpOyAKICB9CiAgZWxzZQogIHsKICAgIHVjT2Zmc2V0ID0gdWNNUERVSExlbiArIFdMQU5UTF9MTENfUFJPVE9fVFlQRV9PRkZTRVQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBMTEMgdHlwZSAKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NEYXRhQnVmZiwgdWNPZmZzZXQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSZ1c0V0aGVyVHlwZSwgJnVzTExDU2l6ZSk7IAoKICBpZiAoKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkgfHwgCiAgICAgICggc2l6ZW9mKHVzRXRoZXJUeXBlKSAhPSB1c0xMQ1NpemUgKSkKICAgICAgCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpFcnJvciBleHRyYWN0aW5nIEV0aGVyIHR5cGUgZnJvbSBkYXRhIHBhY2tldCIpKTsKICAgIC8qIERyb3AgcGFja2V0ICovCiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQogIGVsc2UKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpFdGhlciB0eXBlIHJldHJpZXZlZCBiZWZvcmUgZW5kaWFuZXNzIGNvbnY6ICVkIiwgCiAgICAgICAgICAgICAgIHVzRXRoZXJUeXBlKSk7CgogICAgdXNFdGhlclR5cGUgPSB2b3NfYmUxNl90b19jcHUodXNFdGhlclR5cGUpOwogICAgKnBVc0V0aGVyVHlwZSA9IHVzRXRoZXJUeXBlOwoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkV0aGVyIHR5cGUgcmV0cmlldmVkOiAlZCIsIHVzRXRoZXJUeXBlKSk7CiAgfQogIAogIHJldHVybiB2b3NTdGF0dXM7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9HZXRTb2Z0QVBTdGF0aXN0aWNzCgogIERFU0NSSVBUSU9OICAgQ29sbGVjdCB0aGUgY3VtdWxhdGl2ZSBzdGF0aXN0aWNzIGZvciBhbGwgU29mdGFwIHN0YXRpb25zCgogIERFUEVOREVOQ0lFUyAgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgICBpbiBwdm9zR0N0eCAgLSBQb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQKICAgICAgICAgICAgICAgICAgIGJSZXNldCAgICAtIElmIHNldCBUTCBzdGF0aXN0aWNzIHdpbGwgYmUgY2xlYXJlZCBhZnRlciByZWFkaW5nCiAgICAgICAgICAgICAgICBvdXQgc3RhdHNTdW0gLSBwb2ludGVyIHRvIGNvbGxlY3RlZCBzdGF0aXN0aWNzCgogIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVU19TVUNDRVNTIDogaWYgdGhlIFN0YXRpc3RpY3MgYXJlIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQKCiAgU0lERSBFRkZFQ1RTICBOT05FCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfR2V0U29mdEFQU3RhdGlzdGljcyh2X1BWT0lEX3QgcEFkYXB0ZXIsIFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSAqc3RhdHNTdW0sIHZfQk9PTF90IGJSZXNldCkKewogICAgdl9VOF90IGkgPSAwOwogICAgVk9TX1NUQVRVUyAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogICAgV0xBTlRMX0NiVHlwZSAqcFRMQ2IgID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgICBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgc3RhdEJ1ZmZlclRlbXA7CiAgICB2b3NfbWVtX3plcm8oKHZfVk9JRF90ICopJnN0YXRCdWZmZXJUZW1wLCBzaXplb2YoV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFKSk7CiAgICB2b3NfbWVtX3plcm8oKHZfVk9JRF90ICopc3RhdHNTdW0sIHNpemVvZihXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUpKTsKCgogICAgaWYgKCBOVUxMID09IHBUTENiICkKICAgIHsKICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9IAoKICAgIC8vIFN1bSB1cCBhbGwgdGhlIHN0YXRpc3RpY3MgZm9yIHN0YXRpb25zIG9mIFNvZnQgQVAgZnJvbSBUTAogICAgZm9yIChpID0gMDsgaSA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgaSsrKQogICAgewogICAgICAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSkKICAgICAgICB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAocFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPndTVEFEZXNjLndTVEFUeXBlID09IFdMQU5fU1RBX1NPRlRBUCkKICAgICAgICB7CiAgICAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX0dldFN0YXRpc3RpY3MocEFkYXB0ZXIsICZzdGF0QnVmZmVyVGVtcCwgaSk7Ly8gQ2FuIGluY2x1ZGUgc3RhSWQgMSBiZWNhdXNlIHN0YXRpc3RpY3Mgbm90IGNvbGxlY3RlZCBmb3IgaXQKCiAgICAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKICAgICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CgogICAgICAgICAgICAvLyBBZGQgdG8gdGhlIGNvdW50ZXJzCiAgICAgICAgICAgc3RhdHNTdW0tPnR4VUNGY250ICs9IHN0YXRCdWZmZXJUZW1wLnR4VUNGY250OwogICAgICAgICAgIHN0YXRzU3VtLT50eE1DRmNudCArPSBzdGF0QnVmZmVyVGVtcC50eE1DRmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+dHhCQ0ZjbnQgKz0gc3RhdEJ1ZmZlclRlbXAudHhCQ0ZjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnR4VUNCY250ICs9IHN0YXRCdWZmZXJUZW1wLnR4VUNCY250OwogICAgICAgICAgIHN0YXRzU3VtLT50eE1DQmNudCArPSBzdGF0QnVmZmVyVGVtcC50eE1DQmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+dHhCQ0JjbnQgKz0gc3RhdEJ1ZmZlclRlbXAudHhCQ0JjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnJ4VUNGY250ICs9IHN0YXRCdWZmZXJUZW1wLnJ4VUNGY250OwogICAgICAgICAgIHN0YXRzU3VtLT5yeE1DRmNudCArPSBzdGF0QnVmZmVyVGVtcC5yeE1DRmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+cnhCQ0ZjbnQgKz0gc3RhdEJ1ZmZlclRlbXAucnhCQ0ZjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnJ4VUNCY250ICs9IHN0YXRCdWZmZXJUZW1wLnJ4VUNCY250OwogICAgICAgICAgIHN0YXRzU3VtLT5yeE1DQmNudCArPSBzdGF0QnVmZmVyVGVtcC5yeE1DQmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+cnhCQ0JjbnQgKz0gc3RhdEJ1ZmZlclRlbXAucnhCQ0JjbnQ7CgogICAgICAgICAgIGlmIChiUmVzZXQpCiAgICAgICAgICAgewogICAgICAgICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9SZXNldFN0YXRpc3RpY3MocEFkYXB0ZXIsIGkpOwogICAgICAgICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCiAgICAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOyAgICAgICAgICAgICAgIAogICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdm9zU3RhdHVzOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9Jc1JlcGxheVBhY2tldAogICAgIAogIERFU0NSSVBUSU9OICAgVGhpcyBmdW5jdGlvbiBkb2VzIHJlcGxheSBjaGVjayBmb3IgdmFsaWQgc3RhdGlvbnMKIAogIERFUEVOREVOQ0lFUyAgVmFsaWRpdHkgb2YgcmVwbGF5IGNoZWNrIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIGZ1bmN0aW9uIAogICAgICAgICAgICAgICAgaXMgY2FsbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgUEFSQU1FVEVSUyAgICBjdXJyZW50UmVwbGF5Q291bnRlciAgICBjdXJyZW50IHJlcGxheSBjb3VudGVyIHRha2VuIGZyb20gUlggQkQgCiAgICAgICAgICAgICAgICBwcmV2aW91c1JlcGxheUNvdW50ZXIgICBwcmV2aW91cyByZXBsYXkgY291bnRlciB0YWtlbiBmcm9tIFRMIENCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIFJFVFJVTiAgICAgICAgVk9TX1RSVUUgICAgcGFja2V0IGlzIGEgcmVwbGF5IHBhY2tldAogICAgICAgICAgICAgICAgVk9TX0ZBTFNFICAgcGFja2V0IGlzIG5vdCBhIHJlcGxheSBwYWNrZXQKCiAgU0lERSBFRkZFQ1RTICAgbm9uZQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZfQk9PTF90CldMQU5UTF9Jc1JlcGxheVBhY2tldAooCiAgdl9VNjRfdCAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciwKICB2X1U2NF90ICAgIHVsbHByZXZpb3VzUmVwbGF5Q291bnRlcgopCnsKICAgLyogRG8gdGhlIHJlcGxheSBjaGVjayBieSBjb21wYXJpbmcgcHJldmlvdXMgcmVjZWl2ZWQgcmVwbGF5IGNvdW50ZXIgd2l0aAogICAgICBjdXJyZW50IHJlY2VpdmVkIHJlcGxheSBjb3VudGVyKi8KICAgIGlmKHVsbHByZXZpb3VzUmVwbGF5Q291bnRlciA8IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKQogICAgewogICAgICAgIC8qIFZhbGlkIHBhY2tldCBub3QgcmVwbGF5ICovCiAgICAgICAgcmV0dXJuIFZPU19GQUxTRTsKICAgIH0KICAgIGVsc2UKICAgIHsKCiAgICAgICAgLyogQ3VycmVudCBwYWNrZXQgbnVtYmVyIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwcmV2aXVvcyByZWNlaXZlZCAKICAgICAgICAgICBwYWNrZXQgbm8sIHRoaXMgbWVhbnMgY3VycmVudCBwYWNrZXQgaXMgcmVwbGF5IHBhY2tldCAqLwogICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOiBSZXBsYXkgcGFja2V0IGZvdW5kIHdpdGggcmVwbGF5IGNvdW50ZXIgOlsweCVsbFhdIix1bGxjdXJyZW50UmVwbGF5Q291bnRlcik7CiAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIFZPU19UUlVFOwogICAgfQp9CgojaWYgMAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9HZXRSZXBsYXlDb3VudGVyRnJvbVJ4QkQKICAgICAKICBERVNDUklQVElPTiAgIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgNDgtYml0IHJlcGxheSBwYWNrZXQgbnVtYmVyIGZyb20gUlggQkQgCiAKICBERVBFTkRFTkNJRVMgIFZhbGlkaXR5IG9mIHJlcGxheSBjaGVjayBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSBmdW5jdGlvbiAKICAgICAgICAgICAgICAgIGlzIGNhbGxlZAogICAgICAgICAgICAgICAgICAgICAgICAgIAogIFBBUkFNRVRFUlMgICAgcHVjUnhIZWFkZXIgcG9pbnRlciB0byBSWCBCRCBoZWFkZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgUkVUUlVOICAgICAgICB2X1U2NF90ICAgIFBhY2tldCBudW1iZXIgZXh0YXJjdGVkIGZyb20gUlggQkQKCiAgU0lERSBFRkZFQ1RTICAgbm9uZQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZfVTY0X3QKV0xBTlRMX0dldFJlcGxheUNvdW50ZXJGcm9tUnhCRAooCiAgIHZfVThfdCAqcHVjUnhCREhlYWRlcgopCnsKLyogNDgtYml0IHJlcGxheSBjb3VudGVyIGlzIGNyZWF0ZWQgYXMgZm9sbG93cwogICBmcm9tIFJYIEJEIDYgYnl0ZSBQTUkgY29tbWFuZDoKICAgQWRkciA6IEFFUy9US0lQCiAgIDB4MzggOiBwbjMvdHNjMwogICAweDM5IDogcG4yL3RzYzIKICAgMHgzYSA6IHBuMS90c2MxCiAgIDB4M2IgOiBwbjAvdHNjMAoKICAgMHgzYyA6IHBuNS90c2M1CiAgIDB4M2QgOiBwbjQvdHNjNCAqLwoKI2lmZGVmIEFOSV9CSUdfQllURV9FTkRJQU4KICAgIHZfVTY0X3QgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSAwOwogICAgLyogR2V0dGluZyA0OC1iaXQgcmVwbGF5IGNvdW50ZXIgZnJvbSB0aGUgUlggQkQgKi8KICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyID0gV0xBTkhBTF9SWF9CRF9HRVRfUE1JQ01EXzIwVE8yMyhwdWNSeEJESGVhZGVyKTsgCiAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA8PD0gMTY7CiAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciB8PSAoKCBXTEFOSEFMX1JYX0JEX0dFVF9QTUlDTURfMjRUTzI1KHB1Y1J4QkRIZWFkZXIpICYgMHhGRkZGMDAwMCkgPj4gMTYpOwogICAgcmV0dXJuIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOwojZWxzZQogICAgdl9VNjRfdCB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA9IDA7CiAgICAvKiBHZXR0aW5nIDQ4LWJpdCByZXBsYXkgY291bnRlciBmcm9tIHRoZSBSWCBCRCAqLwogICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSAoV0xBTkhBTF9SWF9CRF9HRVRfUE1JQ01EXzI0VE8yNShwdWNSeEJESGVhZGVyKSAmIDB4MDAwMEZGRkYpOyAKICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyIDw8PSAzMjsgCiAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciB8PSBXTEFOSEFMX1JYX0JEX0dFVF9QTUlDTURfMjBUTzIzKHB1Y1J4QkRIZWFkZXIpOyAKICAgIHJldHVybiB1bGxjdXJyZW50UmVwbGF5Q291bnRlcjsKI2VuZGlmCn0KI2VuZGlmCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9Qb3N0UmVzTmVlZGVkCiAgICAgCiAgREVTQ1JJUFRJT04gICBUaGlzIGZ1bmN0aW9uIHBvc3RzIG1lc3NhZ2UgdG8gVEwgdG8gcmVzZXJ2ZSBCRC9QRFUgbWVtb3J5CiAKICBERVBFTkRFTkNJRVMgIE5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAKICBQQVJBTUVURVJTICAgIHB2b3NHQ3R4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIFJFVFVSTiAgICAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMgICBub25lCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnZvaWQgV0xBTlRMX1Bvc3RSZXNOZWVkZWQodl9QVk9JRF90IHB2b3NHQ3R4KQp7CiAgdm9zX21zZ190ICAgICAgICAgICAgdm9zTXNnOwoKICB2b3NNc2cucmVzZXJ2ZWQgPSAwOwogIHZvc01zZy5ib2R5cHRyICA9IE5VTEw7CiAgdm9zTXNnLnR5cGUgICAgID0gV0xBTlRMX1RYX1JFU19ORUVERUQ7CiAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICJXTEFOIFRMOiBCRC9QRFUgYXZhaWxhYmxlIGludGVycnVwdCByZWNlaXZlZCwgUG9zdGluZyBtZXNzYWdlIHRvIFRMIik7CiAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfdHhfbXFfc2VyaWFsaXplKCBWT1NfTVFfSURfVEwsICZ2b3NNc2cpKSkKICB7CiAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgIiAlcyBmYWlscyB0byBwb3N0IG1lc3NhZ2UiLCBfX2Z1bmNfXyk7CiAgfQp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgICBXTEFOVExfVXBkYXRlUnNzaUJtcHMKCiAgREVTQ1JJUFRJT04gICAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBUTCdzIFJTU0kgKGluIEJNUFMgbW9kZSkKCiAgREVQRU5ERU5DSUVTICAgTm9uZQoKICBQQVJBTUVURVJTCgogICAgcHZvc0dDdHggICAgICAgICBWT1MgY29udGV4dCAgICAgICAgICBWT1MgR2xvYmFsIGNvbnRleHQKICAgIHN0YUlkICAgICAgICAgICAgU3RhdGlvbiBJRCAgICAgICAgICAgU3RhdGlvbiBJRAogICAgcnNzaSAgICAgICAgICAgICBSU1NJIChCTVBTIG1vZGUpICAgICBSU1NJIGluIEJNUFMgbW9kZQoKICBSRVRVUk4gICAgICAgICBOb25lCgogIFNJREUgRUZGRUNUUyAgIG5vbmUKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdm9pZCBXTEFOVExfVXBkYXRlUnNzaUJtcHModl9QVk9JRF90IHB2b3NHQ3R4LCB2X1U4X3Qgc3RhSWQsIHZfUzdfdCByc3NpKQp7CiAgV0xBTlRMX0NiVHlwZSogcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKCiAgaWYgKE5VTEwgIT0gcFRMQ2IgJiYgTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFJZF0pCiAgewogICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhSWRdLT5yc3NpQXZnQm1wcyA9IHJzc2k7CiAgfQp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgICBXTEFOVExfVXBkYXRlU25yQm1wcwoKICBERVNDUklQVElPTiAgICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIFRMJ3MgU05SIChpbiBCTVBTIG1vZGUpCgogIERFUEVOREVOQ0lFUyAgIE5vbmUKCiAgUEFSQU1FVEVSUwoKICAgIHB2b3NHQ3R4ICAgICAgICAgVk9TIGNvbnRleHQgICAgICAgICAgVk9TIEdsb2JhbCBjb250ZXh0CiAgICBzdGFJZCAgICAgICAgICAgIFN0YXRpb24gSUQgICAgICAgICAgIFN0YXRpb24gSUQKICAgIHNuciAgICAgICAgICAgICBTTlIgKEJNUFMgbW9kZSkgICAgIFNOUiBpbiBCTVBTIG1vZGUKCiAgUkVUVVJOICAgICAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMgICBub25lCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnZvaWQgV0xBTlRMX1VwZGF0ZVNuckJtcHModl9QVk9JRF90IHB2b3NHQ3R4LCB2X1U4X3Qgc3RhSWQsIHZfUzdfdCBzbnIpCnsKICBXTEFOVExfQ2JUeXBlKiBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwoKICBpZiAoTlVMTCAhPSBwVExDYiAmJiBOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YUlkXSkKICB7CiAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFJZF0tPnNuckF2Z0JtcHMgPSBzbnI7CiAgfQp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgICBXTEFOVExfVXBkYXRlTGlua0NhcGFjaXR5CgogIERFU0NSSVBUSU9OICAgIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgU1RBJ3MgTGluayBDYXBhY2l0eSBpbiBUTAoKICBERVBFTkRFTkNJRVMgICBOb25lCgogIFBBUkFNRVRFUlMKCiAgICBwdm9zR0N0eCAgICAgICAgIFZPUyBjb250ZXh0ICAgICAgICAgIFZPUyBHbG9iYWwgY29udGV4dAogICAgc3RhSWQgICAgICAgICAgICBTdGF0aW9uIElEICAgICAgICAgICBTdGF0aW9uIElECiAgICBsaW5rQ2FwYWNpdHkgICAgIGxpbmtDYXBhY2l0eSAgICAgICAgIExpbmsgQ2FwYWNpdHkKCiAgUkVUVVJOICAgICAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMgICBub25lCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnZvaWQgV0xBTlRMX1VwZGF0ZUxpbmtDYXBhY2l0eSh2X1BWT0lEX3QgcHZvc0dDdHgsIHZfVThfdCBzdGFJZCwgdl9VMzJfdCBsaW5rQ2FwYWNpdHkpCnsKICAgIFdMQU5UTF9DYlR5cGUqIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CgogICAgaWYgKE5VTEwgIT0gcFRMQ2IgJiYgTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFJZF0pCiAgICB7CiAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhSWRdLT5saW5rQ2FwYWNpdHkgPSBsaW5rQ2FwYWNpdHk7CiAgICB9Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfR2V0U1RBTGlua0NhcGFjaXR5CgogIERFU0NSSVBUSU9OCgogICAgUmV0dXJucyBMaW5rIENhcGFjaXR5IG9mIGEgcGFydGljdWxhciBTVEEuCgogIERFUEVOREVOQ0lFUwoKICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSBpdHMgc3RhdGUgY2FuIGJlIHJldHJpZXZlZC4KCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbgoKICAgIE9VVAogICAgcGxpbmtDYXBhY2l0eTogIHRoZSBjdXJyZW50IGxpbmsgY2FwYWNpdHkgdGhlIGNvbm5lY3Rpb24gdG8KICAgICAgICAgICAgICAgICAgICB0aGUgZ2l2ZW4gc3RhdGlvbgoKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9HZXRTVEFMaW5rQ2FwYWNpdHkKKAogICAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogICAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgICB2X1UzMl90ICAgICAgICAgICAgICAgKnBsaW5rQ2FwYWNpdHkKKQp7CiAgICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgU2FuaXR5IGNoZWNrCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmICggTlVMTCA9PSBwbGlua0NhcGFjaXR5ICkKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIikpKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgfQoKICAgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgRkwoIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIikpKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogICAgewogICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIpKSk7CiAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQiKSkpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgIH0KCiAgICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzICkKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgICAgICAgRkwoIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCIpKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgR2V0IFNUQSBzdGF0ZQogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAqcGxpbmtDYXBhY2l0eSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5saW5rQ2FwYWNpdHk7CgogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9HZXRTVEFMaW5rQ2FwYWNpdHkgKi8KCi8qCiAqIFdMQU5UTF9SZXNldFJ4U1NOIC0gcmVzZXQgbGFzdCByeCBzc24KICogQHB2b3NHQ3R4OiBnbG9iYWwgdm9zIGNvbnRleHQKICogQHVjU1RBSWQ6IHN0YXRpb24gaWQKICoKICogVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGxhc3Qgc3NuIG9mIGFsbCB0aWRzIG9mIHRoZSBzdGF0aW9uCiAqIGZvciB3aG9tIEJBIHJlb3JkZXIgc2Vzc2lvbiBleGlzdHMuCiAqCiAqIFJldHVybjogbm9uZQogKi8Kdm9pZCBXTEFOVExfUmVzZXRSeFNTTih2X1BWT0lEX3QgcHZvc0dDdHgsIHVpbnQ4X3QgdWNTVEFJZCkKewogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgIHVpbnQ4X3QgaTsKCiAgaWYgKFdMQU5UTF9TVEFfSURfSU5WQUxJRCh1Y1NUQUlkKSkgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBXTEFOVExfUmVzZXRSeFNTTiIpKTsKICAgIHJldHVybjsKICB9CgogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKE5VTEwgPT0gcFRMQ2IpIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggV0xBTlRMX1Jlc2V0UnhTU04iKSk7CiAgICByZXR1cm47CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGZvciAoaSA9IDA7IGkgPCBXTEFOX01BWF9USUQgOyBpKyspIHsKICAgICBpZiAoMCA9PSBwQ2xpZW50U1RBLT5hdGxCQVJlb3JkZXJJbmZvW2ldLnVjRXhpc3RzKSB7CiAgICAgICAgY29udGludWU7CiAgICAgfQogICAgIFRMTE9HMShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgIldMQU4gVEw6IExhc3QgUnhTU04gcmVzZXQgdG8gemVybyBmb3IgdGlkICVkIiwgaSkpOwogICAgIHBDbGllbnRTVEEtPmF0bEJBUmVvcmRlckluZm9baV0uTGFzdFNOID0gMDsKICB9Cn0KCnZvaWQgV0xBTlRMX1NldERhdGFQa3RGaWx0ZXIodl9QVk9JRF90IHB2b3NHQ3R4LCB1aW50OF90IHVjU1RBSWQsIGJvb2wgZmxhZykKewogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgIHVpbnQ4X3QgaTsKCiAgIGlmIChXTEFOVExfU1RBX0lEX0lOVkFMSUQodWNTVEFJZCkpIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiJXM6IEludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm47CiAgIH0KCiAgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgIGlmIChOVUxMID09IHBUTENiKSB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICIlczogSW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHgiLCBfX2Z1bmNfXykpOwogICByZXR1cm47CiAgIH0KCiAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgIGZvciAoaSA9IDA7IGkgPCBXTEFOX01BWF9USUQgOyBpKyspIHsKICAgICAgaWYgKDAgPT0gcENsaWVudFNUQS0+YXRsQkFSZW9yZGVySW5mb1tpXS51Y0V4aXN0cykKICAgICAgICAgY29udGludWU7CgogICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAiV0xBTiBUTDogTGFzdCBSeFNTTiByZXNldCB0byB6ZXJvIGZvciB0aWQgJWQiLCBpKSk7CiAgICAgIHBDbGllbnRTVEEtPmF0bEJBUmVvcmRlckluZm9baV0uc2V0X2RhdGFfZmlsdGVyID0gZmxhZzsKICAgfQp9CgovKioKICogV0xBTlRMX1NoaWZ0QXJyQnlPbmUoKSAtIHV0aWxpdHkgZnVuY3Rpb24gdG8gc2hpZnQgYXJyYXkgYnkgb25lCiAqIEBhcnI6IHBvaW50ZXIgdG8gYXJyYXkKICogQGxlbjogbGVuZ3RoIG9mIHRoZSBhcnJheQogKgogKiBDYWxsZXIgcmVzcG9uc2liaWxpdHkgdG8gcHJvdmlkZSB0aGUgY29ycmVjdCBsZW5ndGggb2YgdGhlIGFycmF5CiAqIG90aGVyIG1heSBsZWFkcyB0byBidWdzLgogKgogKiBSZXR1cm46IHZvaWQKICovCnN0YXRpYyB2b2lkIFdMQU5UTF9TaGlmdEFyckJ5T25lKHVpbnQzMl90ICphcnIsIHVpbnQ4X3QgbGVuKQp7CiAgIGludCBpOwogICBmb3IgKGkgPSAwOyBpIDwgbGVuIC0gMTsgaSArKykKICAgICAgYXJyW2ldID0gYXJyW2kgKyAxXTsKICAgYXJyW2ldID0gMDsKfQoKLyoqCiAqIFdMQU5UTF9TYW1wbGVUeCgpIC0gY29sbGVjdCB0eCBzYW1wbGVzCiAqIEBkYXRhOiBUTCBjb250ZXh0IHBvaW50ZXIKICoKICogVGhpcyBmdW5jdGlvbiByZWNvcmRzIHRoZSBsYXN0IGZpdmUgdHggYnl0ZXMgc2VudCBzYW1wbGVzCiAqIGNvbGxlY3RlZCBhZnRlciB0eF9ieXRlc190aW1lciBleHBpcmUuCiAqCiAqIFJldHVybjogdm9pZAogKi8Kdm9pZCBXTEFOVExfU2FtcGxlVHgodm9pZCAqZGF0YSkKewogICBXTEFOVExfQ2JUeXBlKiBwVExDYiA9IChXTEFOVExfQ2JUeXBlICopZGF0YTsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogICB1aW50OF90IGNvdW50ID0gcFRMQ2ItPnNhbXBsZV9jb3VudDsKICAgdWludDhfdCBpOwoKICAgZm9yICggaSA9IDA7IGkgPCBXTEFOX01BWF9TVEFfQ09VTlQ7IGkrKykgewogICAgICAgaWYgKE5VTEwgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0gJiYKICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dWNFeGlzdHMpIHsKICAgICAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXTsKCiAgICAgICAgICBpZiAoY291bnQgPiAoV0xBTlRMX1NBTVBMRV9DT1VOVCAtIDEpKSB7CiAgICAgICAgICAgICAgY291bnQgPSBXTEFOVExfU0FNUExFX0NPVU5UIC0gMTsKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT50eF9zYW1wbGVzX3N1bSAtPSBwQ2xpZW50U1RBLT50eF9zYW1wbGVbMF07CiAgICAgICAgICAgICAgV0xBTlRMX1NoaWZ0QXJyQnlPbmUocENsaWVudFNUQS0+dHhfc2FtcGxlLCBXTEFOVExfU0FNUExFX0NPVU5UKTsKICAgICAgICAgIH0KCiAgICAgICAgICBwQ2xpZW50U1RBLT50eF9zYW1wbGVbY291bnRdID0gcENsaWVudFNUQS0+dHhfZnJhbWVzOwogICAgICAgICAgcENsaWVudFNUQS0+dHhfc2FtcGxlc19zdW0gKz0gcENsaWVudFNUQS0+dHhfc2FtcGxlW2NvdW50XTsKICAgICAgICAgIHBDbGllbnRTVEEtPnR4X2ZyYW1lcyA9IDA7CiAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgcFRMQ2ItPnNhbXBsZV9jb3VudCA9IGNvdW50OwogICAgICAgfQogICB9CgogICB2b3NfdGltZXJfc3RhcnQoJnBUTENiLT50eF9mcmFtZXNfdGltZXIsIFdMQU5UTF9TQU1QTEVfSU5URVJWQUwpOwp9CgovKioKICogV0xBTlRMX0VuYWJsZVByZUFzc29jQ2FjaGluZygpIC0gRW5hYmxlIGNhY2hpbmcgRUFQT0wgZnJhbWVzCiAqCiAqIFJldHVybjogTm9uZQogKgogKi8Kdm9pZCBXTEFOVExfRW5hYmxlUHJlQXNzb2NDYWNoaW5nKHZvaWQpCnsKICAgdl9QVk9JRF90IHB2b3NHQ3R4PSB2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfVEwsTlVMTCk7CiAgIFdMQU5UTF9DYlR5cGUqIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgIGlmIChOVUxMID09IHBUTENiICkgewogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIiVzOiBJbnZhbGlkIFRMIHBvaW50ZXIgZm9yIGdsb2JhbCBjb250ZXh0IiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuOwogICB9CgogICBwVExDYi0+dm9zRWFwb2xDYWNoZWRGcmFtZSA9IE5VTEw7CiAgIHBUTENiLT5wcmVhc3NvY19jYWNoaW5nID0gdHJ1ZTsKfQoKLyoqCiAqIFdMQU5UTF9Gb3J3YXJkUHJlQXNzb2MoKSAtIGZvcndhcmQgY2FjaGVkIGVhcG9sIGZyYW1lcwogKiBAZmxhZzogVmFsdWUgdG8gZm9yd2FyZCBvciBmbHVzaAogKgogKiBSZXR1cm46IHZvcyBzdGF0dXMKICoKICovCnN0YXRpYyBWT1NfU1RBVFVTIFdMQU5UTF9Gb3J3YXJkUHJlQXNzb2MoYm9vbCBmbGFnKQp7CiAgdm9zX21zZ190IHNNZXNzYWdlOwoKICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiIC0tLS0gU2VyaWFsaXppbmcgVEwgZm9yIGZvcndhcmRpbmcgcHJlIGFzc29jIGNhY2hlIGZyYW1lcyIpOwoKICB2b3NfbWVtX3plcm8oICZzTWVzc2FnZSwgc2l6ZW9mKHZvc19tc2dfdCkpOwogIHNNZXNzYWdlLnR5cGUgICAgPSBXTEFOVExfUlhfRldEX1BSRV9BU1NPQ19DQUNIRUQ7CiAgc01lc3NhZ2UuYm9keXZhbCA9IGZsYWc7CgogIHJldHVybiB2b3NfcnhfbXFfc2VyaWFsaXplKFZPU19NUV9JRF9UTCwgJnNNZXNzYWdlKTsKfQoKLyoqCiAqIFdMQU5UTF9QcmVBc3NvY0ZvcndhcmQoKSAtIGZvcndhcmQgY2FjaGVkIGVhcG9sIGZyYW1lcwogKiBAZmxhZzogVmFsdWUgdG8gZm9yd2FyZCBvciBmbHVzaAogKgogKiBSZXR1cm46IE5vbmUKICoKICovCnZvaWQgV0xBTlRMX1ByZUFzc29jRm9yd2FyZChib29sIGZsYWcpCnsKICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKFdMQU5UTF9Gb3J3YXJkUHJlQXNzb2MoZmxhZykpKQogIHsKICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAiICVzIGZhaWxzIHRvIGZvcndhcmQgcGFja2V0cyIsIF9fZnVuY19fKTsKICB9Cn0KCi8qKgogKiBXTEFOVExfUmVnaXN0ZXJGd2RFYXBvbCgpIC0gcmVnaXN0ZXIgY2FsbCBiYWNrIHRvIGZvcndhcmQgY2FjaGVkIGVhcG9sIGZyYW1lCiAqIEBwdm9zR0N0eCA6IHBvaW50ZXIgdG8gdm9zIGdsb2JhbCBjb250ZXh0CiAqIEBwZm5Gd2RFYXBvbDogY2FsbCBiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKICoKICogUmV0dXJuOiBOb25lCiAqCiAqLwp2b2lkIFdMQU5UTF9SZWdpc3RlckZ3ZEVhcG9sKHZfUFZPSURfdCBwdm9zR0N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfRndkRWFwb2xDQlR5cGUgcGZuRndkRWFwb2wpCnsKICAgV0xBTlRMX0NiVHlwZSogcFRMQ2IgPSBOVUxMOwogICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwoKICAgaWYgKHBUTENiKQogICAgICBwVExDYi0+cGZuRWFwb2xGd2QgPSBwZm5Gd2RFYXBvbDsKfQoKIC8qKgogKiBXTEFOVExfU2V0QVJQRldEYXRhcGF0aCgpIC0ga2VlcCBvciByZW1vdmUgRlcgaW4gZGF0YSBwYXRoIGZvciBBUlAKICoKICogQGZsYWc6IHZhbHVlIHRvIGtlZXAgb3IgcmVtb3ZlIEZXIGZyb20gZGF0YSBwYXRoCiAqCiAqIFJldHVybjogdm9pZAogKi8Kdm9pZCBXTEFOVExfU2V0QVJQRldEYXRhcGF0aCh2b2lkICogcHZvc0dDdHgsIGJvb2wgZmxhZykKewoKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKCiAgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgIGlmIChOVUxMID09IHBUTENiKSB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICIlczogSW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHgiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm47CiAgIH0KCiAgIHBUTENiLT50cmFja19hcnAgPSBmbGFnOwoKfQoKdl9VMTZfdCB3bGFuX3RsX2dldF9zdGFfcnhfcmF0ZSh2b2lkICpwdm9zR0N0eCwgdWludDhfdCB1Y1NUQUlkKQp7CglXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwoJdl9VMTZfdCByYXRlID0gMDsKCglwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwoJaWYgKE5VTEwgPT0gcFRMQ2IpIHsKCQlUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKCQkJIiVzOiBJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIsIF9fZnVuY19fKSk7CgkJcmV0dXJuIHJhdGU7Cgl9CgoJaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cykKCSAgICByYXRlID0gdm9zX2dldF9yYXRlX2Zyb21fcmF0ZWlkeCgKCQlwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+cmF0ZV9pZHgpOwoKCXJldHVybiByYXRlOwp9Cgp2b2lkIFdMQU5UTF9HZXRTQVBTdGFSU1NpKHZvaWQgKnB2b3NHQ3R4LCB1aW50OF90IHVjU1RBSWQsIHM4ICpyc3NpKQp7CiAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgIHVpbnQ4X3QgY291bnQ7CgogICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogICBpZiAoTlVMTCA9PSBwVExDYikgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiJXM6IEludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuOwogICB9CgogICBjb3VudCA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5yc3NpX3NhbXBsZV9jbnQ7CiAgIGNvdW50IDwgV0xBTlRMX1JTU0lfU0FNUExFX0NOVCA/IGNvdW50KysgOiBjb3VudDsKCiAgICpyc3NpID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnJzc2lfc2FtcGxlX3N1bSAvIGNvdW50Owp9Cgp2b2lkIFdMQU5UTF9TZXRLZXlTZXFDb3VudGVyKHZvaWQgKnB2b3NHQ3R4LCB1NjQgY291bnRlciwgdWludDhfdCBzdGFpZCkKewogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogICB1aW50OF90IGk7CgogICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogICBpZiAoTlVMTCA9PSBwVExDYikgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiJXM6IEludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuOwogICB9CgogICBpZiAoV0xBTlRMX1NUQV9JRF9JTlZBTElEKHN0YWlkKSkgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiJXM6IEludmFsaWQgU3RhIGlkIHBhc3NlZCIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybjsKICAgfQoKICAgaWYgKE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhaWRdKSB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICIlczogU3RhdGlvbiBjb250ZXh0IGlzIE5VTEwiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm47CiAgIH0KCiAgIGZvcihpID0gMDsgaSA8IFdMQU5UTF9NQVhfVElEOyBpKyspCiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YWlkXS0+dWxsUmVwbGF5Q291bnRlcltpXSA9IGNvdW50ZXI7Cn0KCiNpZmRlZiBXTEFOX0ZFQVRVUkVfUk1DClZPU19TVEFUVVMgV0xBTlRMX1JtY0luaXQKKAogICAgdl9QVk9JRF90ICAgcEFkYXB0ZXIKKQp7CiAgICBXTEFOVExfQ2JUeXBlICAgKnBUTENiID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CiAgICBWT1NfU1RBVFVTICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgIHRBTklfVTggICAgICAgICAgY291bnQ7CgogICAgLypzYW5pdHkgY2hlY2sqLwogICAgaWYgKE5VTEwgPT0gcFRMQ2IpCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJJbnZhbGlkIFRMIGhhbmRsZSIpKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgfQoKICAgIGZvciAoIGNvdW50ID0gMDsgY291bnQgPCBXTEFOVExfUk1DX0hBU0hfVEFCTEVfU0laRTsgY291bnQrKyApCiAgICB7CiAgICAgICAgcFRMQ2ItPnJtY1Nlc3Npb25bY291bnRdID0gTlVMTDsKICAgIH0KCiAgICB2b3NfbG9ja19pbml0KCZwVExDYi0+cm1jTG9jayk7CgogICAgcFRMQ2ItPm11bHRpY2FzdER1cGxpY2F0ZURldGVjdGlvbkVuYWJsZWQgPSAxOwogICAgcFRMQ2ItPnJtY0RhdGFQYXRoRW5hYmxlZCA9IDA7CgogICAgcmV0dXJuIHN0YXR1czsKfQoKClZPU19TVEFUVVMgV0xBTlRMX1JtY0RlSW5pdAooCiAgICB2X1BWT0lEX3QgICBwQWRhcHRlcgopCnsKICAgIFdMQU5UTF9DYlR5cGUgICAqcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKICAgIFZPU19TVEFUVVMgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogICAgdEFOSV9VOCAgICAgICAgICBjb3VudDsKICAgIFdMQU5UTF9STUNfU0VTU0lPTiAqcE5vZGU7CiAgICBXTEFOVExfUk1DX1NFU1NJT04gKnBQcmV2OwoKICAgIC8qc2FuaXR5IGNoZWNrKi8KICAgIGlmIChOVUxMID09IHBUTENiKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiSW52YWxpZCBUTCBoYW5kbGUiKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICAgIH0KCiAgICBmb3IgKCBjb3VudCA9IDA7IGNvdW50IDwgV0xBTlRMX1JNQ19IQVNIX1RBQkxFX1NJWkU7IGNvdW50KysgKQogICAgewogICAgICAgIHBOb2RlID0gcFRMQ2ItPnJtY1Nlc3Npb25bY291bnRdOwogICAgICAgIHdoaWxlIChwTm9kZSkKICAgICAgICB7CiAgICAgICAgICAgIHBQcmV2ID0gcE5vZGU7CiAgICAgICAgICAgIHBOb2RlID0gcE5vZGUtPm5leHQ7CiAgICAgICAgICAgIHZvc19tZW1fZnJlZSgodl9WT0lEX3QgKiApcFByZXYpOwogICAgICAgIH0KICAgIH0KCiAgICB2b3NfbG9ja19kZXN0cm95KCZwVExDYi0+cm1jTG9jayk7CgogICAgcmV0dXJuIHN0YXR1czsKfQoKCnRBTklfVTggV0xBTlRMX1JtY0hhc2hSbWNTZXNzaW9uICggdl9NQUNBRERSX3QgICAqcE1jYXN0QWRkciApCnsKICAgIHRBTklfVTMyIHN1bTsKICAgIHRBTklfVTggIGhhc2g7CgogICAgc3VtID0gKHBNY2FzdEFkZHItPmJ5dGVzWzBdICsgcE1jYXN0QWRkci0+Ynl0ZXNbMV0gKyBwTWNhc3RBZGRyLT5ieXRlc1syXSArCiAgICAgICAgICAgcE1jYXN0QWRkci0+Ynl0ZXNbM10gKyBwTWNhc3RBZGRyLT5ieXRlc1s0XSArIHBNY2FzdEFkZHItPmJ5dGVzWzVdKTsKCiAgICBoYXNoID0gKHRBTklfVTgpKHN1bSAmICgoV0xBTlRMX1JNQ19IQVNIX1RBQkxFX1NJWkUgLSAxKSkpOwoKICAgIHJldHVybiBoYXNoOwp9CgoKV0xBTlRMX1JNQ19TRVNTSU9OKiBXTEFOVExfUm1jTG9va1VwUm1jU2Vzc2lvbgooCiAgICBXTEFOVExfUk1DX1NFU1NJT04gKnJtY1Nlc3Npb25bXSwKICAgIHZfTUFDQUREUl90ICAgICAqcE1jYXN0QWRkcgopCnsKICAgIFdMQU5UTF9STUNfU0VTU0lPTiAqcE5vZGU7CiAgICB0QU5JX1U4ICAgICAgICAgICAgICAgaW5kZXg7CgogICAgLypzYW5pdHkgY2hlY2sqLwogICAgaWYgKE5VTEwgPT0gcE1jYXN0QWRkcikKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJTYW5pdHkgY2hlY2sgZmFpbGVkIHBNY2FzdEFkZHIgJXBLIiwgcE1jYXN0QWRkcikpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGluZGV4ID0gV0xBTlRMX1JtY0hhc2hSbWNTZXNzaW9uKHBNY2FzdEFkZHIpOwogICAgcE5vZGUgPSBybWNTZXNzaW9uW2luZGV4XTsKICAgIHdoaWxlICggcE5vZGUgKQogICAgewogICAgICAgIGlmICh2b3NfaXNfbWFjYWRkcl9lcXVhbCggJihwTm9kZS0+cm1jQWRkciksIHBNY2FzdEFkZHIpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHBOb2RlOwogICAgICAgIH0KICAgICAgICBwTm9kZSA9IHBOb2RlLT5uZXh0OwogICAgfQoKICAgIHJldHVybiBOVUxMOwp9CgpXTEFOVExfUk1DX1NFU1NJT04gKldMQU5UTF9SbWNBZGRSbWNTZXNzaW9uCigKICBXTEFOVExfUk1DX1NFU1NJT04gKnJtY1Nlc3Npb25bXSwKICB2X01BQ0FERFJfdCAgICpwTWNhc3RBZGRyCikKewogICAgV0xBTlRMX1JNQ19TRVNTSU9OICpwTm9kZTsKICAgIHRBTklfVTggICAgICAgICAgICAgICBpbmRleDsKCiAgICBpbmRleCA9IFdMQU5UTF9SbWNIYXNoUm1jU2Vzc2lvbihwTWNhc3RBZGRyKTsKICAgIHBOb2RlID0gV0xBTlRMX1JtY0xvb2tVcFJtY1Nlc3Npb24ocm1jU2Vzc2lvbiwgcE1jYXN0QWRkcik7CiAgICBpZiAoIE5VTEwgIT0gcE5vZGUgKQogICAgewogICAgICAgIC8qYWxyZWFkeSBleGlzdHMqLwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHBOb2RlID0gKFdMQU5UTF9STUNfU0VTU0lPTiAqKXZvc19tZW1fbWFsbG9jKHNpemVvZigqcE5vZGUpKTsKICAgICAgICBpZiAocE5vZGUpCiAgICAgICAgewogICAgICAgICAgICB2b3NfbWVtX2NvcHkoICYocE5vZGUtPnJtY0FkZHIpLCBwTWNhc3RBZGRyLAogICAgICAgICAgICAgICAgc2l6ZW9mKHBOb2RlLT5ybWNBZGRyKSApOwogICAgICAgICAgICBwTm9kZS0+bmV4dCA9IHJtY1Nlc3Npb25baW5kZXhdOwogICAgICAgICAgICBybWNTZXNzaW9uW2luZGV4XSA9IHBOb2RlOwogICAgICAgICAgICByZXR1cm4gcE5vZGU7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX0hERCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIiVzOiB2b3NfbWVtX21hbGxvYyBmYWlsZWQgY2FuJ3QgZW5hYmxlIFJNQyBzZXNzaW9uIiwKICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgfQp9Cgp0QU5JX1U4CldMQU5UTF9SbWNEZWxldGVSbWNTZXNzaW9uCigKICBXTEFOVExfUk1DX1NFU1NJT04gKnJtY1Nlc3Npb25bXSwKICB2X01BQ0FERFJfdCAgICpwTWNhc3RBZGRyCikKewogICAgV0xBTlRMX1JNQ19TRVNTSU9OICpwSGVhZDsKICAgIFdMQU5UTF9STUNfU0VTU0lPTiAqcE5vZGU7CiAgICBXTEFOVExfUk1DX1NFU1NJT04gKnBQcmV2OwogICAgdEFOSV9VOCAgICAgICAgICAgICAgIGluZGV4OwoKICAgIGluZGV4ID0gV0xBTlRMX1JtY0hhc2hSbWNTZXNzaW9uKHBNY2FzdEFkZHIpOwogICAgcEhlYWQgPSBwTm9kZSA9IHJtY1Nlc3Npb25baW5kZXhdOwogICAgd2hpbGUgKHBOb2RlKQogICAgewogICAgICAgIGlmICh2b3NfaXNfbWFjYWRkcl9lcXVhbCggJihwTm9kZS0+cm1jQWRkciksIHBNY2FzdEFkZHIpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHBIZWFkID09IHBOb2RlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBybWNTZXNzaW9uW2luZGV4XSA9IHBOb2RlLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcFByZXYtPm5leHQgPSBwTm9kZS0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2b3NfbWVtX2ZyZWUoKHZfVk9JRF90ICogKXBOb2RlKTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIHBQcmV2ID0gcE5vZGU7CiAgICAgICAgcE5vZGUgPSBwTm9kZS0+bmV4dDsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKVk9TX1NUQVRVUwpXTEFOVExfUHJvY2Vzc1JtY0NvbW1hbmQKKAogICAgV0xBTlRMX0NiVHlwZSogIHBUTENiLAogICAgdl9NQUNBRERSX3QgICAgKnBNY2FzdEFkZHIsCiAgICB0QU5JX1UzMiAgICAgICAgY29tbWFuZAopCnsKICAgIFZPU19TVEFUVVMgc3RhdHVzOwogICAgdEFOSV9VMzIgY291bnQ7CiAgICB0QU5JX1UzMiBybWNBY3RpdmU7CgogICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zX2xvY2tfYWNxdWlyZSggJihwVExDYi0+cm1jTG9jaykpKSkKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIiVzIEdldCBMb2NrIEZhaWwiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgIH0KCiAgICAvKmFkZCBvciBkZWxldGUgbm9kZSBmcm9tIGFjdGl2ZSBybWMgaGFzaCB0YWJsZSovCiAgICBpZiAoY29tbWFuZCkKICAgIHsKICAgICAgICAvKmFkZCByZXF1ZXN0ZWQgcm1jIHNlc3Npb24gaW4gYWN0aXZlIHJtYyBzZXNzaW9uIGxpc3QqLwogICAgICAgIGlmIChXTEFOVExfUm1jQWRkUm1jU2Vzc2lvbihwVExDYi0+cm1jU2Vzc2lvbiwgcE1jYXN0QWRkcikpCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIlJNQyBzZXNzaW9uICIgTUFDX0FERFJFU1NfU1RSICIgYWRkZWQgaW4gVEwgaGFzaCB0YWJsZSIsCiAgICAgICAgICAgICAgICBNQUNfQUREUl9BUlJBWShwTWNhc3RBZGRyLT5ieXRlcykgKSApOwogICAgICAgICAgICBwVExDYi0+cm1jRGF0YVBhdGhFbmFibGVkID0gVFJVRTsKICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIlJNQyBzZXNzaW9uICIgTUFDX0FERFJFU1NfU1RSICIgYWxyZWFkeSBleGlzdHMgaW4gVEwgaGFzaCIKICAgICAgICAgICAgICAgICIgdGFibGUiLCBNQUNfQUREUl9BUlJBWShwTWNhc3RBZGRyLT5ieXRlcykgKSApOwogICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLypkZWxldGUgcmVxdWVzdGVkIHJtYyBzZXNzaW9uIGZyb20gYWN0aXZlIHJtYyBzZXNzaW9uIGxpc3QqLwogICAgICAgIGlmIChXTEFOVExfUm1jRGVsZXRlUm1jU2Vzc2lvbihwVExDYi0+cm1jU2Vzc2lvbiwgcE1jYXN0QWRkcikpCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAiUk1DIHNlc3Npb24gIiBNQUNfQUREUkVTU19TVFIgIiBkZWxldGVkIGZyb20gVEwgaGFzaCB0YWJsZSIsCiAgICAgICAgICAgICAgICBNQUNfQUREUl9BUlJBWShwTWNhc3RBZGRyLT5ieXRlcykpICk7CiAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgICAgICAgICAgcm1jQWN0aXZlID0gRkFMU0U7CiAgICAgICAgICAgIGZvciAoIGNvdW50ID0gMDsgY291bnQgPCBXTEFOVExfUk1DX0hBU0hfVEFCTEVfU0laRTsgY291bnQrKyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwVExDYi0+cm1jU2Vzc2lvbltjb3VudF0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcm1jQWN0aXZlID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoVFJVRSA9PSBybWNBY3RpdmUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBUTENiLT5ybWNEYXRhUGF0aEVuYWJsZWQgPSBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcFRMQ2ItPnJtY0RhdGFQYXRoRW5hYmxlZCA9IEZBTFNFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIFRMTE9HRSggVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiUk1DIHNlc3Npb24gIiBNQUNfQUREUkVTU19TVFIgIiBkb2Vzbid0IGV4aXN0IGluIFRMIGhhc2giCiAgICAgICAgICAgICAgICAiIHRhYmxlIiwgTUFDX0FERFJfQVJSQVkocE1jYXN0QWRkci0+Ynl0ZXMpICkgKTsKICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19sb2NrX3JlbGVhc2UoJihwVExDYi0+cm1jTG9jaykpKSkKICAgIHsKICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiJXMgUmVsZWFzZSBMb2NrIEZhaWwiLCBfX2Z1bmNfXykpOwogICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICB9CgogICAgcmV0dXJuIHN0YXR1czsKfS8qIEVuZCBvZiBXTEFOVExfUHJvY2Vzc1JtY0NvbW1hbmQgKi8KClZPU19TVEFUVVMKV0xBTlRMX0VuYWJsZVJNQwooCiAgICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogICAgdl9NQUNBRERSX3QgICAqcE1jYXN0VHJhbnNtaXR0ZXJBZGRyCikKewogICAgV0xBTlRMX0NiVHlwZSogIHBUTENiOwogICAgVk9TX1NUQVRVUyBzdGF0dXM7CgogICAgLypzYW5pdHkgY2hlY2sqLwogICAgaWYgKCAoTlVMTCA9PSBwdm9zR0N0eCkgfHwgKE5VTEwgPT0gcE1jYXN0VHJhbnNtaXR0ZXJBZGRyKSApCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTCAlczogU2FuaXR5IGNoZWNrIGZhaWxlZCBwdm9zR0N0eCAlcEsgYU1jYXN0QWRkciAlcEsiLAogICAgICAgICAgICBfX2Z1bmNfXywgcHZvc0dDdHgsIHBNY2FzdFRyYW5zbWl0dGVyQWRkcikpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgIH0KCiAgICAvKnNhbml0eSBjaGVjayovCiAgICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogICAgaWYgKCBOVUxMID09IHBUTENiICkKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMICVzOiBwVExDYiBpcyBOVUxMIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICB9CgogICAgc3RhdHVzID0gV0xBTlRMX1Byb2Nlc3NSbWNDb21tYW5kKHBUTENiLCBwTWNhc3RUcmFuc21pdHRlckFkZHIgLCAxKTsKCiAgICByZXR1cm4gc3RhdHVzOwp9IC8qIEVuZCBvZiBXTEFOVExfRW5hYmxlUk1DICovCgoKVk9TX1NUQVRVUwpXTEFOVExfRGlzYWJsZVJNQwooCiAgICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogICAgdl9NQUNBRERSX3QgICAqcE1jYXN0VHJhbnNtaXR0ZXJBZGRyCikKewogICAgV0xBTlRMX0NiVHlwZSogcFRMQ2I7CiAgICBWT1NfU1RBVFVTIHN0YXR1czsKCiAgICAvKlNhbml0eSBjaGVjayovCiAgICBpZiAoKE5VTEwgPT0gcHZvc0dDdHgpIHx8IChOVUxMID09IHBNY2FzdFRyYW5zbWl0dGVyQWRkcikpCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTCAlczogU2FuaXR5IGNoZWNrIGZhaWxlZCBwdm9zR0N0eCAlcEsgYU1jYXN0QWRkciAlcEsiLAogICAgICAgICAgICAgX19mdW5jX18sIHB2b3NHQ3R4LCBwTWNhc3RUcmFuc21pdHRlckFkZHIpKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICB9CgogICAgLypTYW5pdHkgY2hlY2sqLwogICAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICAgIGlmIChOVUxMID09IHBUTENiKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEwgJXM6IHBUTENiIGlzIE5VTEwiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgIH0KCiAgICBzdGF0dXMgPSBXTEFOVExfUHJvY2Vzc1JtY0NvbW1hbmQocFRMQ2IsIHBNY2FzdFRyYW5zbWl0dGVyQWRkciwgMCk7CgogICAgcmV0dXJuIHN0YXR1czsKfSAvKiBFbmQgb2YgV0xBTlRMX0Rpc2FibGVSTUMgKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgRHVwbGljYXRlIE11bHRpY2FzdCBEZXRlY3Rpb24gRnVuY3Rpb25zCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX0lzRHVwbGljYXRlTWNhc3RGcm0KCiAgREVTQ1JJUFRJT04KICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvciBkdXBsaWNhc3QgbXVsdGljYXN0IGZyYW1lcyBhbmQgZHJvcHMgdGhlbS4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgIElOCgogICBwQ2xpZW50U1RBICA6IFBvaW50ZXIgdG8gV0xBTlRMX1NUQUNsaWVudFR5cGUKICAgYXVjQkRIZWFkZXIgOiBQb2ludGVyIHRvIEJEIGhlYWRlcgoKICBSRVRVUk4gVkFMVUUKCiAgICBWT1NfRkFMU0U6ICBUaGlzIGZyYW1lIGlzIG5vdCBhIGR1cGxpY2F0ZQoKICAgIFZPU19UUlVFOiAgIFRoaXMgZnJhbWUgaXMgYSBkdXBsaWNhdGUKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZfVThfdApXTEFOVExfSXNEdXBsaWNhdGVNY2FzdEZybQooCiAgICBXTEFOVExfU1RBQ2xpZW50VHlwZSAqcENsaWVudFNUQSwKICAgIHZvc19wa3RfdCAqdm9zRGF0YUJ1ZmYKKQp7CiAgICB2X1U4X3QgZHVwbGljYXRlID0gVk9TX0ZBTFNFOwogICAgV0xBTlRMX1JNQ19TRVNTSU9OICpwTm9kZTsKICAgIHZfVTE2X3QgICAgIHVzU2VxQ3RybDsKICAgIHZfTUFDQUREUl90IG1jYXN0QWRkcjsKICAgIFZPU19TVEFUVVMgIHZvc1N0YXR1czsKICAgIHZfUFZPSURfdCAgIHB2UGVla0RhdGE7CgogICAgLyogR2V0IGFkZHJlc3MgMSBvZiBEYXRhIEZyYW1lICovCiAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BlZWtfZGF0YSh2b3NEYXRhQnVmZiwgV0xBTlRMX01BQ19BRERSX0FMSUdOKDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcHZQZWVrRGF0YSwgVk9TX01BQ19BRERSX1NJWkUpOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6IEZhaWxlZCB0byBnZXQgQWRkciAxIG9mIDgwMjExIGhlYWRlciBmcm9tIHBhY2tldCAlZCIsCiAgICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKICAgICAgICByZXR1cm4gVk9TX0ZBTFNFOwogICAgfQoKICAgIC8qIENvcHkgYWRkcmVzcyAxIG9mIERhdGEgRnJhbWUgKi8KICAgIHZvc19tZW1fY29weSgmbWNhc3RBZGRyLmJ5dGVzLCBwdlBlZWtEYXRhLCBWT1NfTUFDX0FERFJfU0laRSk7CgogICAgLyoKICAgICAqIFdlIHBlcmZvcm0gZHVwbGljYXRlIGRldGVjdGlvbiBmb3Igb25seSBtdWx0aWNhc3QgZGF0YSBmcmFtZXMKICAgICAqLwogICAgaWYgKHZvc19pc19tYWNhZGRyX2dyb3VwKCZtY2FzdEFkZHIpICYmCiAgICAgICAgICF2b3NfaXNfbWFjYWRkcl9icm9hZGNhc3QoJm1jYXN0QWRkcikpCiAgICB7CiAgICAgICAgLyogR2V0IHNlcXVlbmNlIGNvbnRyb2wgb2YgRGF0YSBGcmFtZSAqLwogICAgICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgIChXTEFOVExfTUFDX0FERFJfQUxJR04oMSkgKyAoMyAqIFZPU19NQUNfQUREUl9TSVpFKSksCiAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSZwdlBlZWtEYXRhLCBzaXplb2Yodl9VMTZfdCkpOwoKICAgICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGYWlsZWQgdG8gZ2V0IFNlcXVlbmNlIENvbnRyb2wgZnJvbSBwYWNrZXQgJWQiLAogICAgICAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwogICAgICAgICAgICByZXR1cm4gVk9TX0ZBTFNFOwogICAgICAgIH0KCiAgICAgICAgLyogQ29weSBzZXF1ZW5jZSBjb250cm9sIGZyb20gdGhlIERhdGEgRnJhbWUgKi8KICAgICAgICB1c1NlcUN0cmwgPSAqKHZfVTE2X3QgKilwdlBlZWtEYXRhOwoKICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfbG9ja19hY3F1aXJlKCYocENsaWVudFNUQS0+bWNMb2NrKSkpKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIiVzIEdldCBMb2NrIEZhaWwiLCBfX2Z1bmNfXykpOwogICAgICAgICAgICByZXR1cm4gVk9TX0ZBTFNFOwogICAgICAgIH0KCiAgICAgICAgcE5vZGUgPSBXTEFOVExfUm1jTG9va1VwUm1jU2Vzc2lvbihwQ2xpZW50U1RBLT5tY2FzdFNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtY2FzdEFkZHIpOwogICAgICAgIGlmIChOVUxMID09IHBOb2RlKQogICAgICAgIHsKICAgICAgICAgICAgLyogSWYgdGhlIHNlc3Npb24gZG9lcyBub3QgZXhpc3QsIGFkZCBpdC4gKi8KICAgICAgICAgICAgcE5vZGUgPSBXTEFOVExfUm1jQWRkUm1jU2Vzc2lvbihwQ2xpZW50U1RBLT5tY2FzdFNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWNhc3RBZGRyKTsKICAgICAgICAgICAgLyogSWYgd2UgY291bGQgbm90IGFkZCBhIGVudHJ5LCBza2lwIGR1cGxpY2F0ZSBkZXRlY3Rpb24gKi8KICAgICAgICAgICAgaWYgKE5VTEwgPT0gcE5vZGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICIlcyBGYWlsZWQgdG8gYWRkIG11bHRpY2FzdCBzZXNzaW9uIiwgX19mdW5jX18pKTsKICAgICAgICAgICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTCiAgICAgICAgICAgICAgICAgICAgICh2b3NfbG9ja19yZWxlYXNlKCYocENsaWVudFNUQS0+bWNMb2NrKSkpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiJXMgUmVsZWFzZSBMb2NrIEZhaWwiLCBfX2Z1bmNfXykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIFZPU19GQUxTRTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBzZXF1ZW5jZSBjb250cm9sIHZhbHVlLiAqLwogICAgICAgICAgICBwTm9kZS0+bWNTZXFDdGwgPSB1c1NlcUN0cmw7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIENoZWNrIGlmIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhpcyBmcmFtZSBtYXRjaGVzIHRoZSBsYXN0CiAgICAgICAgICAgICAqIHdlIGhhdmUgc2Vlbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChwTm9kZS0+bWNTZXFDdGwgPT0gdXNTZXFDdHJsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwTm9kZS0+cnhNQ0R1cGNudCsrOwogICAgICAgICAgICAgICAgVExMT0cxKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgICAgICAgIiVzIFJ4IE11bHRpY2FzdCBEdXBsaWNhdGUgJWQgIiBNQUNfQUREUkVTU19TVFIKICAgICAgICAgICAgICAgICAgICAgIiAoU2VxICV4KSIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgICBwTm9kZS0+cnhNQ0R1cGNudCwgTUFDX0FERFJfQVJSQVkobWNhc3RBZGRyLmJ5dGVzKSwKICAgICAgICAgICAgICAgICAgICAgdXNTZXFDdHJsKSk7CiAgICAgICAgICAgICAgICBkdXBsaWNhdGUgPSBWT1NfVFJVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgbGFzdCBzZWVuIHNlcXVlbmNlIG51bWJlciAqLwogICAgICAgICAgICAgICAgcE5vZGUtPm1jU2VxQ3RsID0gdXNTZXFDdHJsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyAodm9zX2xvY2tfcmVsZWFzZSgmKHBDbGllbnRTVEEtPm1jTG9jaykpKSkKICAgICAgICB7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICIlcyBSZWxlYXNlIExvY2sgRmFpbCIsIF9fZnVuY19fKSk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBkdXBsaWNhdGU7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfTWNhc3REZWxldGVBbGxFbnRyaWVzCgogIERFU0NSSVBUSU9OCiAgICBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgYWxsIG11bHRpY2FzdCBlbnRyaWVzIHVzZWQgZm9yIGR1cGxpY2F0ZSBkZXRlY3Rpb24KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgIElOCgogICBwQ2xpZW50U1RBICA6IFBvaW50ZXIgdG8gV0xBTlRMX1NUQUNsaWVudFR5cGUKCiAgUkVUVVJOIFZBTFVFCgogICAgTm9uZQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdm9pZApXTEFOVExfTWNhc3REZWxldGVBbGxFbnRyaWVzKFdMQU5UTF9TVEFDbGllbnRUeXBlICogcENsaWVudFNUQSkKewogICAgV0xBTlRMX1JNQ19TRVNTSU9OICpwTm9kZSwgKipoZWFkOwogICAgaW50IGluZGV4OwoKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICAgICAgICAgICIlcyBEZWxldGluZyBhbGwgbXVsdGljYXN0IGVudHJpZXMiLCBfX2Z1bmNfXykpOwoKICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc19sb2NrX2FjcXVpcmUoJihwQ2xpZW50U1RBLT5tY0xvY2spKSkpCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiJXMgR2V0IExvY2sgRmFpbCIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IFdMQU5UTF9STUNfSEFTSF9UQUJMRV9TSVpFOyBpbmRleCsrKQogICAgewogICAgICAgIGhlYWQgPSAmcENsaWVudFNUQS0+bWNhc3RTZXNzaW9uW2luZGV4XTsKCiAgICAgICAgcE5vZGUgPSAqaGVhZDsKCiAgICAgICAgd2hpbGUgKHBOb2RlKQogICAgICAgIHsKICAgICAgICAgICAgKmhlYWQgPSBwTm9kZS0+bmV4dDsKICAgICAgICAgICAgLyogZnJlZSB0aGUgZ3JvdXAgZW50cnkgKi8KICAgICAgICAgICAgdm9zX21lbV9mcmVlKHBOb2RlKTsKICAgICAgICAgICAgcE5vZGUgPSAqaGVhZDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1MgKHZvc19sb2NrX3JlbGVhc2UoJihwQ2xpZW50U1RBLT5tY0xvY2spKSkpCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiJXMgUmVsZWFzZSBMb2NrIEZhaWwiLCBfX2Z1bmNfXykpOwogICAgfQp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1NldE1jYXN0RHVwbGljYXRlRGV0ZWN0aW9uCgogIERFU0NSSVBUSU9OCiAgICBUaGlzIGZ1bmN0aW9uIHNldHMgbXVsdGljYXRlIGR1cGxpY2F0ZSBkZXRlY3Rpb24gb3BlcmF0aW9uLgogICAgSWYgZW5hYmxlIGlzIDEsIHRoZSBkZXRlY3Rpb24gaXMgZW5hYmxlZCwgZWxzZSBpdCBpcyBkaXNhYmxlZC4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgIElOCgogICBwdm9zR0N0eCAgIDogUG9pbnRlciB0byBWT1MgZ2xvYmFsIGNvbnRleHQKICAgZW5hYmxlIDogQm9vbGVhbiB0byBlbmFibGUgb3IgZGlzYWJsZQoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIFNhbml0eSBjaGVjayBvbiBpbnB1dCBmYWlsZWQKCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogICBPdGhlciByZXR1cm4gdmFsdWVzIGFyZSBwb3NzaWJsZSBjb21pbmcgZnJvbSB0aGUgY2FsbGVkIGZ1bmN0aW9ucy4KICAgUGxlYXNlIGNoZWNrIEFQSSBmb3IgYWRkaXRpb25hbCBpbmZvLgoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NldE1jYXN0RHVwbGljYXRlRGV0ZWN0aW9uCigKICAgIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCiAgICB2X1U4X3QgICAgICAgIGVuYWJsZQopCnsKICAgIFdMQU5UTF9DYlR5cGUqIHBUTENiOwoKICAgIC8qU2FuaXR5IGNoZWNrKi8KICAgIGlmIChOVUxMID09IHB2b3NHQ3R4KQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEwgJXM6IFNhbml0eSBjaGVjayBmYWlsZWQgcHZvc0dDdHggJXBLIiwKICAgICAgICAgICAgIF9fZnVuY19fLCBwdm9zR0N0eCkpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgIH0KCiAgICAvKlNhbml0eSBjaGVjayovCiAgICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogICAgaWYgKE5VTEwgPT0gcFRMQ2IpCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTCAlczogcFRMQ2IgaXMgTlVMTCIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgfQoKICAgIHN3aXRjaCAoZW5hYmxlKQogICAgewogICAgZGVmYXVsdDoKICAgICAgICAvKgogICAgICAgICAqIEFueSB2YWx1ZSBvdGhlciB0aGFuIDAgb3IgMSBpcyB1c2VkIHRvIGR1bXAgdGhlCiAgICAgICAgICogZHVwbGljYXRlIGNvdW50LgogICAgICAgICAqLwogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEwgJXM6IE11bHRpY2FzdCBEdXBsaWNhdGUgQ291bnQgJWQiLAogICAgICAgICAgICAgX19mdW5jX18sIHBUTENiLT5tY2FzdER1cENudCkpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgICAgIHBUTENiLT5tdWx0aWNhc3REdXBsaWNhdGVEZXRlY3Rpb25FbmFibGVkID0gZW5hYmxlOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCiNlbmRpZiAvKiBXTEFOX0ZFQVRVUkVfUk1DICovCg==