From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rob Herring Subject: [PATCH hwc] drm_hwcomposer: Remove GL compositing support Date: Fri, 4 May 2018 14:18:33 -0500 Message-ID: <20180504191833.6967-1-robh@kernel.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-oi0-f54.google.com (mail-oi0-f54.google.com [209.85.218.54]) by gabe.freedesktop.org (Postfix) with ESMTPS id D64FD6E004 for ; Fri, 4 May 2018 19:18:38 +0000 (UTC) Received: by mail-oi0-f54.google.com with SMTP id l1-v6so20087661oii.1 for ; Fri, 04 May 2018 12:18:38 -0700 (PDT) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: Robert Foss , Alexandru-Cosmin Gheorghe , Sean Paul List-Id: dri-devel@lists.freedesktop.org VGhlIEdMIGJhc2VkIGNvbXBvc2l0aW5nIGFkZHMgYWxvdCBvZiBjb21wbGV4aXR5IGFuZCB3YXMg b25seSBldmVyIHdlbGwKdGVzdGVkIG9uIGNsb3NlZCBzdGFja3MuIEl0IGFsc28gb25seSBzdXBw b3J0cyBHTEVTMy54IGFuZCBzdGlsbCByZWxpZXMKb24gc3dfc3luYyB0aW1lbGluZSB3aGljaCBp cyBub3cgYSBkZWJ1Z2ZzIGZlYXR1cmUuIFRob3NlIGFyZSBqdXN0IHRoZQprbm93biBpc3N1ZXMu CgpSZW1vdmluZyB0aGUgR0wgY29tcG9zaXRvciBtZWFucyBldmVyeXRoaW5nIHJlbGF0ZWQgdG8g c3F1YXNoaW5nIGxheWVycwphbmQgcHJlLWNvbXBvc2l0aW5nIGNhbiBiZSByZW1vdmVkLiBUaGUg cGxhbm5lciBpcyBsZWZ0IGFzIGl0IG1heSBiZQp1c2VmdWwgd2hlbiBhZGRpbmcgYmFjayBzdXBw b3J0IGZvciBvdmVybGF5IHBsYW5lcy4gV2l0aCB0aGlzIGNoYW5nZSwKb25seSBhIHNpbmdsZSBw bGFuZSBpcyBzdXBwb3J0ZWQgdW50aWwgVmFsaWRhdGVEaXNwbGF5IGxlYXJucyB0byBkbwphdG9t aWMgbW9kZXNldHRpbmcgdGVzdCBmb3Igb3ZlcmxheSBwbGFuZXMuCgpTaWduZWQtb2ZmLWJ5OiBS b2IgSGVycmluZyA8cm9iaEBrZXJuZWwub3JnPgotLS0KSSd2ZSBsaWdodGx5IHRlc3RlZCB0aGlz IHdpdGggdmlyZ2wuIEpvaG4gdGVzdGVkIGFuIGVhcmxpZXIgdmVyc2lvbiBvbiBIaWtleS4KClRo aXMgZGVwZW5kcyBvbiByZXZlcnRpbmcgdGhlc2UgY29tbWl0czoKImRybV9od2NvbXBvc2VyOiBD bGVhbnVwIGdsIHByZWNvbXBvc2l0b3IgaW5pdCBhbmQgcHJvdmlkZSB1c2VzX0dMIGZsYWciCiJk cm1faHdjb21wb3NlcjogRmFsbCBiYWNrIHRvIGNsaWVudCBjb21wb3NpdG9uIGlmIHRoZSBnbCBw cmVjb21wb3N0aW9yIGZhaWxzIgoKIEFuZHJvaWQubWsgICAgICAgICAgICAgICAgICB8ICAgNCAt CiBhdXRvZ2wuaCAgICAgICAgICAgICAgICAgICAgfCAxMTAgLS0tLS0KIGRybWNvbXBvc2l0b3J3 b3JrZXIuY3BwICAgICB8ICA3OCAtLS0tCiBkcm1kaXNwbGF5Y29tcG9zaXRpb24uY3BwICAgfCAz MTUgKy0tLS0tLS0tLS0tLS0KIGRybWRpc3BsYXljb21wb3NpdGlvbi5oICAgICB8ICAzNCArLQog ZHJtZGlzcGxheWNvbXBvc2l0b3IuY3BwICAgIHwgNTI5ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0t CiBkcm1kaXNwbGF5Y29tcG9zaXRvci5oICAgICAgfCAgNTYgLS0tCiBkcm1od2N0d28uY3BwICAg ICAgICAgICAgICAgfCAgIDYgKy0KIGdsd29ya2VyLmNwcCAgICAgICAgICAgICAgICB8IDg0MCAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogZ2x3b3JrZXIuaCAgICAgICAgICAg ICAgICAgIHwgIDk0IC0tLS0KIGh3Y29tcG9zZXIuY3BwICAgICAgICAgICAgICB8IDg0MSAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHBsYXRmb3JtLmNwcCAgICAgICAgICAg ICAgICB8ICA5MyArLS0tCiBwbGF0Zm9ybS5oICAgICAgICAgICAgICAgICAgfCAgNDkgKy0tCiBw bGF0Zm9ybWRybWdlbmVyaWMuY3BwICAgICAgfCAgMTcgLQogcGxhdGZvcm1kcm1nZW5lcmljLmgg ICAgICAgIHwgICAxIC0KIHBsYXRmb3JtaGlzaS5jcHAgICAgICAgICAgICB8ICAyMyAtCiBwbGF0 Zm9ybWhpc2kuaCAgICAgICAgICAgICAgfCAgIDEgLQogcGxhdGZvcm1taW5pZ2JtLmNwcCAgICAg ICAgIHwgIDE2IC0KIHBsYXRmb3JtbWluaWdibS5oICAgICAgICAgICB8ICAgMSAtCiB2aXJ0dWFs Y29tcG9zaXRvcndvcmtlci5jcHAgfCAxNjggLS0tLS0tLQogdmlydHVhbGNvbXBvc2l0b3J3b3Jr ZXIuaCAgIHwgIDU2IC0tLQogMjEgZmlsZXMgY2hhbmdlZCwgMjEgaW5zZXJ0aW9ucygrKSwgMzMx MSBkZWxldGlvbnMoLSkKIGRlbGV0ZSBtb2RlIDEwMDY0NCBhdXRvZ2wuaAogZGVsZXRlIG1vZGUg MTAwNjQ0IGRybWNvbXBvc2l0b3J3b3JrZXIuY3BwCiBkZWxldGUgbW9kZSAxMDA2NDQgZ2x3b3Jr ZXIuY3BwCiBkZWxldGUgbW9kZSAxMDA2NDQgZ2x3b3JrZXIuaAogZGVsZXRlIG1vZGUgMTAwNjQ0 IGh3Y29tcG9zZXIuY3BwCiBkZWxldGUgbW9kZSAxMDA2NDQgdmlydHVhbGNvbXBvc2l0b3J3b3Jr ZXIuY3BwCiBkZWxldGUgbW9kZSAxMDA2NDQgdmlydHVhbGNvbXBvc2l0b3J3b3JrZXIuaAoKZGlm ZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IGMwYTFkMGU3Y2RjZS4uMGQw NWY5YzUyZGU1IDEwMDY0NAotLS0gYS9BbmRyb2lkLm1rCisrKyBiL0FuZHJvaWQubWsKQEAgLTM3 LDggKzM3LDYgQEAgaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBMT0NBTF9TSEFSRURfTElCUkFSSUVT IDo9IFwKIAlsaWJjdXRpbHMgXAogCWxpYmRybSBcCi0JbGliRUdMIFwKLQlsaWJHTEVTdjIgXAog CWxpYmhhcmR3YXJlIFwKIAlsaWJsb2cgXAogCWxpYnN5bmMgXApAQCAtNjMsMTIgKzYxLDEwIEBA IExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJZHJtbW9kZS5jcHAgXAogCWRybXBsYW5lLmNwcCBcCiAJ ZHJtcHJvcGVydHkuY3BwIFwKLQlnbHdvcmtlci5jcHAgXAogCWh3Y3V0aWxzLmNwcCBcCiAJcGxh dGZvcm0uY3BwIFwKIAlwbGF0Zm9ybWRybWdlbmVyaWMuY3BwIFwKIAlzZXBhcmF0ZV9yZWN0cy5j cHAgXAotCXZpcnR1YWxjb21wb3NpdG9yd29ya2VyLmNwcCBcCiAJdnN5bmN3b3JrZXIuY3BwCiAK IExPQ0FMX0NQUEZMQUdTICs9IFwKZGlmZiAtLWdpdCBhL2F1dG9nbC5oIGIvYXV0b2dsLmgKZGVs ZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzdmYjBjMWJmMC4uMDAwMDAwMDAwMDAwCi0t LSBhL2F1dG9nbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5 cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExp Y2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5z ZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3 aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNl IGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0y LjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRv IGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBp cyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVT IE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0g KiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVy bWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0j aWZuZGVmIEFORFJPSURfQVVUT19HTF9IXwotI2RlZmluZSBBTkRST0lEX0FVVE9fR0xfSF8KLQot I2luY2x1ZGUgPG1lbW9yeT4KLSNkZWZpbmUgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCi0jZGVmaW5l IEdMX0dMRVhUX1BST1RPVFlQRVMKLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxF R0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wy ZXh0Lmg+Ci0KLS8vIFRPRE8oemFjaHIpOiB1c2UgaHdjX2RybV9ibyB0byB0dXJuIGJ1ZmZlciBo YW5kbGVzIGludG8gdGV4dHVyZXMKLSNpZm5kZWYgRUdMX05BVElWRV9IQU5ETEVfQU5EUk9JRF9O VlgKLSNkZWZpbmUgRUdMX05BVElWRV9IQU5ETEVfQU5EUk9JRF9OVlggMHgzMjJBCi0jZW5kaWYK LQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0jZGVmaW5lIEFVVE9fR0xfVFlQRShuYW1lLCB0eXBl LCB6ZXJvLCBkZWxldGVyKSBcCi0gIHN0cnVjdCBuYW1lIyNEZWxldGVyIHsgICAgICAgICAgICAg ICAgICAgICAgICBcCi0gICAgdHlwZWRlZiB0eXBlIHBvaW50ZXI7ICAgICAgICAgICAgICAgICAg ICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc Ci0gICAgdm9pZCBvcGVyYXRvcigpKHBvaW50ZXIgcCkgY29uc3QgeyAgICAgICAgICBcCi0gICAg ICBpZiAocCAhPSB6ZXJvKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGRl bGV0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCi0gIHR5cGVkZWYgc3RkOjp1bmlxdWVfcHRyPHR5cGUsIG5h bWUjI0RlbGV0ZXI+IG5hbWU7Ci0KLUFVVE9fR0xfVFlQRShBdXRvR0xGcmFtZWJ1ZmZlciwgR0x1 aW50LCAwLCBnbERlbGV0ZUZyYW1lYnVmZmVycygxLCAmcCkpCi1BVVRPX0dMX1RZUEUoQXV0b0dM QnVmZmVyLCBHTHVpbnQsIDAsIGdsRGVsZXRlQnVmZmVycygxLCAmcCkpCi1BVVRPX0dMX1RZUEUo QXV0b0dMVGV4dHVyZSwgR0x1aW50LCAwLCBnbERlbGV0ZVRleHR1cmVzKDEsICZwKSkKLUFVVE9f R0xfVFlQRShBdXRvR0xTaGFkZXIsIEdMaW50LCAwLCBnbERlbGV0ZVNoYWRlcihwKSkKLUFVVE9f R0xfVFlQRShBdXRvR0xQcm9ncmFtLCBHTGludCwgMCwgZ2xEZWxldGVQcm9ncmFtKHApKQotCi1z dHJ1Y3QgQXV0b0VHTERpc3BsYXlJbWFnZSB7Ci0gIEF1dG9FR0xEaXNwbGF5SW1hZ2UoKSA9IGRl ZmF1bHQ7Ci0KLSAgQXV0b0VHTERpc3BsYXlJbWFnZShFR0xEaXNwbGF5IGRpc3BsYXksIEVHTElt YWdlS0hSIGltYWdlKQotICAgICAgOiBkaXNwbGF5XyhkaXNwbGF5KSwgaW1hZ2VfKGltYWdlKSB7 Ci0gIH0KLQotICBBdXRvRUdMRGlzcGxheUltYWdlKGNvbnN0IEF1dG9FR0xEaXNwbGF5SW1hZ2Um IHJocykgPSBkZWxldGU7Ci0gIEF1dG9FR0xEaXNwbGF5SW1hZ2UoQXV0b0VHTERpc3BsYXlJbWFn ZSYmIHJocykgewotICAgIGRpc3BsYXlfID0gcmhzLmRpc3BsYXlfOwotICAgIGltYWdlXyA9IHJo cy5pbWFnZV87Ci0gICAgcmhzLmRpc3BsYXlfID0gRUdMX05PX0RJU1BMQVk7Ci0gICAgcmhzLmlt YWdlXyA9IEVHTF9OT19JTUFHRV9LSFI7Ci0gIH0KLQotICB+QXV0b0VHTERpc3BsYXlJbWFnZSgp IHsKLSAgICBjbGVhcigpOwotICB9Ci0KLSAgQXV0b0VHTERpc3BsYXlJbWFnZSYgb3BlcmF0b3I9 KGNvbnN0IEF1dG9FR0xEaXNwbGF5SW1hZ2UmIHJocykgPSBkZWxldGU7Ci0gIEF1dG9FR0xEaXNw bGF5SW1hZ2UmIG9wZXJhdG9yPShBdXRvRUdMRGlzcGxheUltYWdlJiYgcmhzKSB7Ci0gICAgY2xl YXIoKTsKLSAgICBzdGQ6OnN3YXAoZGlzcGxheV8sIHJocy5kaXNwbGF5Xyk7Ci0gICAgc3RkOjpz d2FwKGltYWdlXywgcmhzLmltYWdlXyk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgdm9p ZCByZXNldChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTEltYWdlS0hSIGltYWdlKSB7Ci0gICAgY2xl YXIoKTsKLSAgICBkaXNwbGF5XyA9IGRpc3BsYXk7Ci0gICAgaW1hZ2VfID0gaW1hZ2U7Ci0gIH0K LQotICB2b2lkIGNsZWFyKCkgewotICAgIGlmIChpbWFnZV8gIT0gRUdMX05PX0lNQUdFX0tIUikg ewotICAgICAgZWdsRGVzdHJveUltYWdlS0hSKGRpc3BsYXlfLCBpbWFnZV8pOwotICAgICAgZGlz cGxheV8gPSBFR0xfTk9fRElTUExBWTsKLSAgICAgIGltYWdlXyA9IEVHTF9OT19JTUFHRV9LSFI7 Ci0gICAgfQotICB9Ci0KLSAgRUdMSW1hZ2VLSFIgaW1hZ2UoKSBjb25zdCB7Ci0gICAgcmV0dXJu IGltYWdlXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgRUdMRGlzcGxheSBkaXNwbGF5XyA9IEVHTF9O T19ESVNQTEFZOwotICBFR0xJbWFnZUtIUiBpbWFnZV8gPSBFR0xfTk9fSU1BR0VfS0hSOwotfTsK LQotc3RydWN0IEF1dG9FR0xJbWFnZUFuZEdMVGV4dHVyZSB7Ci0gIEF1dG9FR0xEaXNwbGF5SW1h Z2UgaW1hZ2U7Ci0gIEF1dG9HTFRleHR1cmUgdGV4dHVyZTsKLX07Ci19Ci0KLSNlbmRpZgpkaWZm IC0tZ2l0IGEvZHJtY29tcG9zaXRvcndvcmtlci5jcHAgYi9kcm1jb21wb3NpdG9yd29ya2VyLmNw cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk1ODc2ZDdhZTcwLi4wMDAwMDAwMDAw MDAKLS0tIGEvZHJtY29tcG9zaXRvcndvcmtlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OCAr MCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNl IFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNp b24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhj ZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEg Y29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3Jn L2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2Fi bGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQg dW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAq IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhw cmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFu Z3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhl IExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJod2MtZHJtLWNvbXBvc2l0b3Itd29y a2VyIgotCi0jaW5jbHVkZSAiZHJtZGlzcGxheWNvbXBvc2l0b3IuaCIKLSNpbmNsdWRlICJkcm1j b21wb3NpdG9yd29ya2VyLmgiCi0jaW5jbHVkZSAid29ya2VyLmgiCi0KLSNpbmNsdWRlIDxzdGRs aWIuaD4KLQotI2luY2x1ZGUgPGxvZy9sb2cuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2Fy ZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtTcXVh c2hXYWl0ID0gNTAwMDAwMDAwTEw7Ci0KLURybUNvbXBvc2l0b3JXb3JrZXI6OkRybUNvbXBvc2l0 b3JXb3JrZXIoRHJtRGlzcGxheUNvbXBvc2l0b3IgKmNvbXBvc2l0b3IpCi0gICAgOiBXb3JrZXIo ImRybS1jb21wb3NpdG9yIiwgSEFMX1BSSU9SSVRZX1VSR0VOVF9ESVNQTEFZKSwKLSAgICAgIGNv bXBvc2l0b3JfKGNvbXBvc2l0b3IpIHsKLX0KLQotRHJtQ29tcG9zaXRvcldvcmtlcjo6fkRybUNv bXBvc2l0b3JXb3JrZXIoKSB7Ci19Ci0KLWludCBEcm1Db21wb3NpdG9yV29ya2VyOjpJbml0KCkg ewotICByZXR1cm4gSW5pdFdvcmtlcigpOwotfQotCi12b2lkIERybUNvbXBvc2l0b3JXb3JrZXI6 OlJvdXRpbmUoKSB7Ci0gIGludCByZXQ7Ci0gIGlmICghY29tcG9zaXRvcl8tPkhhdmVRdWV1ZWRD b21wb3NpdGVzKCkpIHsKLSAgICBMb2NrKCk7Ci0KLSAgICAvLyBPbmx5IHVzZSBhIHRpbWVvdXQg aWYgd2UgZGlkbid0IGRvIGEgU3F1YXNoQWxsIGxhc3QgdGltZS4gVGhpcyB3aWxsCi0gICAgLy8g cHJldmVudCB3YWl0X3JldCA9PSAtRVRJTUVET1VUIHdoaWNoIHdvdWxkIHRyaWdnZXIgYSBTcXVh c2hBbGwgYW5kIGJlIGEKLSAgICAvLyBwb2ludGxlc3MgZHJhaW4gb24gcmVzb3VyY2VzLgotICAg IGludCB3YWl0X3JldCA9IGRpZF9zcXVhc2hfYWxsXyA/IFdhaXRGb3JTaWduYWxPckV4aXRMb2Nr ZWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFdhaXRGb3JTaWduYWxP ckV4aXRMb2NrZWQoa1NxdWFzaFdhaXQpOwotICAgIFVubG9jaygpOwotCi0gICAgc3dpdGNoICh3 YWl0X3JldCkgewotICAgICAgY2FzZSAwOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgLUVJ TlRSOgotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIC1FVElNRURPVVQ6Ci0gICAgICAgIHJl dCA9IGNvbXBvc2l0b3JfLT5TcXVhc2hBbGwoKTsKLSAgICAgICAgaWYgKHJldCkKLSAgICAgICAg ICBBTE9HRSgiRmFpbGVkIHRvIHNxdWFzaCBhbGwgJWQiLCByZXQpOwotICAgICAgICBkaWRfc3F1 YXNoX2FsbF8gPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgICBkZWZhdWx0OgotICAgICAg ICBBTE9HRSgiRmFpbGVkIHRvIHdhaXQgZm9yIHNpZ25hbCwgJWQiLCB3YWl0X3JldCk7Ci0gICAg ICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICByZXQgPSBjb21wb3NpdG9yXy0+Q29tcG9zaXRl KCk7Ci0gIGlmIChyZXQpCi0gICAgQUxPR0UoIkZhaWxlZCB0byBjb21wb3NpdGUhICVkIiwgcmV0 KTsKLSAgZGlkX3NxdWFzaF9hbGxfID0gZmFsc2U7Ci19Ci19CmRpZmYgLS1naXQgYS9kcm1kaXNw bGF5Y29tcG9zaXRpb24uY3BwIGIvZHJtZGlzcGxheWNvbXBvc2l0aW9uLmNwcAppbmRleCAyNGE4 ZTljOWEwNDMuLjc1ZTAxYTY3NTY0ZSAxMDA2NDQKLS0tIGEvZHJtZGlzcGxheWNvbXBvc2l0aW9u LmNwcAorKysgYi9kcm1kaXNwbGF5Y29tcG9zaXRpb24uY3BwCkBAIC0yOSwxOCArMjksMTIgQEAK ICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogCiAjaW5jbHVkZSA8bG9nL2xvZy5oPgotI2luY2x1 ZGUgPHN3X3N5bmMuaD4KICNpbmNsdWRlIDxzeW5jL3N5bmMuaD4KICNpbmNsdWRlIDx4Zjg2ZHJt TW9kZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLURybURpc3BsYXlDb21wb3NpdGlvbjo6 fkRybURpc3BsYXlDb21wb3NpdGlvbigpIHsKLSAgaWYgKHRpbWVsaW5lX2ZkXyA+PSAwKSB7Ci0g ICAgU2lnbmFsQ29tcG9zaXRpb25Eb25lKCk7Ci0gICAgY2xvc2UodGltZWxpbmVfZmRfKTsKLSAg fQotfQorRHJtRGlzcGxheUNvbXBvc2l0aW9uOjp+RHJtRGlzcGxheUNvbXBvc2l0aW9uKCkge30K IAogaW50IERybURpc3BsYXlDb21wb3NpdGlvbjo6SW5pdChEcm1SZXNvdXJjZXMgKmRybSwgRHJt Q3J0YyAqY3J0YywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0ZXIgKmlt cG9ydGVyLCBQbGFubmVyICpwbGFubmVyLApAQCAtNTEsMTIgKzQ1LDYgQEAgaW50IERybURpc3Bs YXlDb21wb3NpdGlvbjo6SW5pdChEcm1SZXNvdXJjZXMgKmRybSwgRHJtQ3J0YyAqY3J0YywKICAg cGxhbm5lcl8gPSBwbGFubmVyOwogICBmcmFtZV9ub18gPSBmcmFtZV9ubzsKIAotICBpbnQgcmV0 ID0gc3dfc3luY190aW1lbGluZV9jcmVhdGUoKTsKLSAgaWYgKHJldCA8IDApIHsKLSAgICBBTE9H RSgiRmFpbGVkIHRvIGNyZWF0ZSBzdyBzeW5jIHRpbWVsaW5lICVkIiwgcmV0KTsKLSAgICByZXR1 cm4gcmV0OwotICB9Ci0gIHRpbWVsaW5lX2ZkXyA9IHJldDsKICAgcmV0dXJuIDA7CiB9CiAKQEAg LTY0LDI2ICs1Miw2IEBAIGJvb2wgRHJtRGlzcGxheUNvbXBvc2l0aW9uOjp2YWxpZGF0ZV9jb21w b3NpdGlvbl90eXBlKERybUNvbXBvc2l0aW9uVHlwZSBkZXMpIHsKICAgcmV0dXJuIHR5cGVfID09 IERSTV9DT01QT1NJVElPTl9UWVBFX0VNUFRZIHx8IHR5cGVfID09IGRlczsKIH0KIAotaW50IERy bURpc3BsYXlDb21wb3NpdGlvbjo6Q3JlYXRlTmV4dFRpbWVsaW5lRmVuY2UoKSB7Ci0gICsrdGlt ZWxpbmVfOwotICByZXR1cm4gc3dfc3luY19mZW5jZV9jcmVhdGUodGltZWxpbmVfZmRfLCAiaHdj IGRybSBkaXNwbGF5IGNvbXBvc2l0aW9uIGZlbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHRpbWVsaW5lXyk7Ci19Ci0KLWludCBEcm1EaXNwbGF5Q29tcG9zaXRpb246OkluY3Jl YXNlVGltZWxpbmVUb1BvaW50KGludCBwb2ludCkgewotICBpbnQgdGltZWxpbmVfaW5jcmVhc2Ug PSBwb2ludCAtIHRpbWVsaW5lX2N1cnJlbnRfOwotICBpZiAodGltZWxpbmVfaW5jcmVhc2UgPD0g MCkKLSAgICByZXR1cm4gMDsKLQotICBpbnQgcmV0ID0gc3dfc3luY190aW1lbGluZV9pbmModGlt ZWxpbmVfZmRfLCB0aW1lbGluZV9pbmNyZWFzZSk7Ci0gIGlmIChyZXQpCi0gICAgQUxPR0UoIkZh aWxlZCB0byBpbmNyZW1lbnQgc3luYyB0aW1lbGluZSAlZCIsIHJldCk7Ci0gIGVsc2UKLSAgICB0 aW1lbGluZV9jdXJyZW50XyA9IHBvaW50OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KIGludCBEcm1E aXNwbGF5Q29tcG9zaXRpb246OlNldExheWVycyhEcm1Id2NMYXllciAqbGF5ZXJzLCBzaXplX3Qg bnVtX2xheWVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGdl b21ldHJ5X2NoYW5nZWQpIHsKICAgaWYgKCF2YWxpZGF0ZV9jb21wb3NpdGlvbl90eXBlKERSTV9D T01QT1NJVElPTl9UWVBFX0ZSQU1FKSkKQEAgLTEyMiwyNTIgKzkwLDM4IEBAIGludCBEcm1EaXNw bGF5Q29tcG9zaXRpb246OkFkZFBsYW5lRGlzYWJsZShEcm1QbGFuZSAqcGxhbmUpIHsKICAgcmV0 dXJuIDA7CiB9CiAKLXN0YXRpYyBzdGQ6OnZlY3RvcjxzaXplX3Q+IFNldEJpdHNUb1ZlY3RvcigK LSAgICB1aW50NjRfdCBpbiwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmaW5kZXhfbWFwKSB7 Ci0gIHN0ZDo6dmVjdG9yPHNpemVfdD4gb3V0OwotICBzaXplX3QgbXNiID0gc2l6ZW9mKGluKSAq IDggLSAxOwotICB1aW50NjRfdCBtYXNrID0gKHVpbnQ2NF90KTEgPDwgbXNiOwotICBmb3IgKHNp emVfdCBpID0gbXNiOyBtYXNrICE9ICh1aW50NjRfdCkwOyBpLS0sIG1hc2sgPj49IDEpCi0gICAg aWYgKGluICYgbWFzaykKLSAgICAgIG91dC5wdXNoX2JhY2soaW5kZXhfbWFwW2ldKTsKLSAgcmV0 dXJuIG91dDsKLX0KLQogaW50IERybURpc3BsYXlDb21wb3NpdGlvbjo6QWRkUGxhbmVDb21wb3Np dGlvbihEcm1Db21wb3NpdGlvblBsYW5lIHBsYW5lKSB7CiAgIGNvbXBvc2l0aW9uX3BsYW5lc18u ZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShwbGFuZSkpOwogICByZXR1cm4gMDsKIH0KIAotdm9pZCBE cm1EaXNwbGF5Q29tcG9zaXRpb246OlNlcGFyYXRlTGF5ZXJzKERybUh3Y1JlY3Q8aW50PiAqZXhj bHVkZV9yZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz aXplX3QgbnVtX2V4Y2x1ZGVfcmVjdHMpIHsKLSAgRHJtQ29tcG9zaXRpb25QbGFuZSAqY29tcCA9 IE5VTEw7Cit2b2lkIERybURpc3BsYXlDb21wb3NpdGlvbjo6U2VwYXJhdGVMYXllcnMoRHJtSHdj UmVjdDxpbnQ+ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c2l6ZV90ICkgewogICBzdGQ6OnZlY3RvcjxzaXplX3Q+IGRlZGljYXRlZF9sYXllcnM7CiAKLSAg Ly8gR28gdGhyb3VnaCB0aGUgY29tcG9zaXRpb24gYW5kIGZpbmQgdGhlIHByZWNvbXAgbGF5ZXIg YXMgd2VsbCBhcyBhbnkKLSAgLy8gbGF5ZXJzIHRoYXQgaGF2ZSBhIGRlZGljYXRlZCBwbGFuZSBs b2NhdGVkIGJlbG93IHRoZSBwcmVjb21wIGxheWVyLgorICAvLyBHbyB0aHJvdWdoIHRoZSBjb21w b3NpdGlvbiBhbmQgZmluZCB0aGUgbGF5ZXJzIHRoYXQgaGF2ZSBhIGRlZGljYXRlZCBwbGFuZS4K ICAgZm9yIChhdXRvICZpIDogY29tcG9zaXRpb25fcGxhbmVzXykgewogICAgIGlmIChpLnR5cGUo KSA9PSBEcm1Db21wb3NpdGlvblBsYW5lOjpUeXBlOjprTGF5ZXIpIHsKICAgICAgIGRlZGljYXRl ZF9sYXllcnMuaW5zZXJ0KGRlZGljYXRlZF9sYXllcnMuZW5kKCksIGkuc291cmNlX2xheWVycygp LmJlZ2luKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnNvdXJjZV9sYXllcnMo KS5lbmQoKSk7Ci0gICAgfSBlbHNlIGlmIChpLnR5cGUoKSA9PSBEcm1Db21wb3NpdGlvblBsYW5l OjpUeXBlOjprUHJlY29tcCkgewotICAgICAgY29tcCA9ICZpOwotICAgICAgYnJlYWs7Ci0gICAg fQotICB9Ci0gIGlmICghY29tcCkKLSAgICByZXR1cm47Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8 c2l6ZV90PiAmY29tcF9sYXllcnMgPSBjb21wLT5zb3VyY2VfbGF5ZXJzKCk7Ci0gIGlmIChjb21w X2xheWVycy5zaXplKCkgPiA2NCkgewotICAgIEFMT0dFKCJGYWlsZWQgdG8gc2VwYXJhdGUgbGF5 ZXJzIGJlY2F1c2UgdGhlcmUgYXJlIG1vcmUgdGhhbiA2NCIpOwotICAgIHJldHVybjsKLSAgfQot Ci0gIC8vIEluZGV4IGF0IHdoaWNoIHRoZSBhY3R1YWwgbGF5ZXJzIGJlZ2luCi0gIHNpemVfdCBs YXllcl9vZmZzZXQgPSBudW1fZXhjbHVkZV9yZWN0cyArIGRlZGljYXRlZF9sYXllcnMuc2l6ZSgp OwotICBpZiAoY29tcF9sYXllcnMuc2l6ZSgpICsgbGF5ZXJfb2Zmc2V0ID4gNjQpIHsKLSAgICBB TE9HVygKLSAgICAgICAgIkV4Y2x1c2lvbiByZWN0YW5nbGVzIGFyZSBiZWluZyB0cnVuY2F0ZWQg dG8gbWFrZSB0aGUgcmVjdGFuZ2xlIGNvdW50ICIKLSAgICAgICAgImZpdCBpbnRvIDY0Iik7Ci0g ICAgbnVtX2V4Y2x1ZGVfcmVjdHMgPSA2NCAtIGNvbXBfbGF5ZXJzLnNpemUoKSAtIGRlZGljYXRl ZF9sYXllcnMuc2l6ZSgpOwotICB9Ci0KLSAgLy8gV2UgaW5qZWN0IGFsbCB0aGUgZXhjbHVkZSBy ZWN0cyBpbnRvIHRoZSByZWN0cyBsaXN0LiBBbnkgcmVzdWx0aW5nIHJlY3QKLSAgLy8gdGhhdCBp bmNsdWRlcyBBTlkgb2YgdGhlIGZpcnN0IG51bV9leGNsdWRlX3JlY3RzIGlzIHJlamVjdGVkLiBB ZnRlciB0aGUKLSAgLy8gZXhjbHVkZSByZWN0cywgd2UgYWRkIHRoZSBsb3dlciBsYXllcnMuIFRo ZSByZWN0cyB0aGF0IGludGVyc2VjdCB3aXRoCi0gIC8vIHRoZXNlIGxheWVycyB3aWxsIGJlIGlu c3BlY3RlZCBhbmQgb25seSB0aG9zZSB3aGljaCBhcmUgdG8gYmUgY29tcG9zaXRlZAotICAvLyBh Ym92ZSB0aGUgbGF5ZXIgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgY29tcG9zaXRpb24gcmVnaW9u cy4KLSAgc3RkOjp2ZWN0b3I8RHJtSHdjUmVjdDxpbnQ+PiBsYXllcl9yZWN0cyhjb21wX2xheWVy cy5zaXplKCkgKyBsYXllcl9vZmZzZXQpOwotICBzdGQ6OmNvcHkoZXhjbHVkZV9yZWN0cywgZXhj bHVkZV9yZWN0cyArIG51bV9leGNsdWRlX3JlY3RzLAotICAgICAgICAgICAgbGF5ZXJfcmVjdHMu YmVnaW4oKSk7Ci0gIHN0ZDo6dHJhbnNmb3JtKAotICAgICAgZGVkaWNhdGVkX2xheWVycy5iZWdp bigpLCBkZWRpY2F0ZWRfbGF5ZXJzLmVuZCgpLAotICAgICAgbGF5ZXJfcmVjdHMuYmVnaW4oKSAr IG51bV9leGNsdWRlX3JlY3RzLAotICAgICAgWz1dKHNpemVfdCBsYXllcl9pbmRleCkgeyByZXR1 cm4gbGF5ZXJzX1tsYXllcl9pbmRleF0uZGlzcGxheV9mcmFtZTsgfSk7Ci0gIHN0ZDo6dHJhbnNm b3JtKGNvbXBfbGF5ZXJzLmJlZ2luKCksIGNvbXBfbGF5ZXJzLmVuZCgpLAotICAgICAgICAgICAg ICAgICBsYXllcl9yZWN0cy5iZWdpbigpICsgbGF5ZXJfb2Zmc2V0LCBbPV0oc2l6ZV90IGxheWVy X2luZGV4KSB7Ci0gICAgcmV0dXJuIGxheWVyc19bbGF5ZXJfaW5kZXhdLmRpc3BsYXlfZnJhbWU7 Ci0gIH0pOwotCi0gIHN0ZDo6dmVjdG9yPHNlcGFyYXRlX3JlY3RzOjpSZWN0U2V0PHVpbnQ2NF90 LCBpbnQ+PiBzZXBhcmF0ZV9yZWdpb25zOwotICBzZXBhcmF0ZV9yZWN0czo6c2VwYXJhdGVfcmVj dHNfNjQobGF5ZXJfcmVjdHMsICZzZXBhcmF0ZV9yZWdpb25zKTsKLSAgdWludDY0X3QgZXhjbHVk ZV9tYXNrID0gKCh1aW50NjRfdCkxIDw8IG51bV9leGNsdWRlX3JlY3RzKSAtIDE7Ci0gIHVpbnQ2 NF90IGRlZGljYXRlZF9tYXNrID0gKCgodWludDY0X3QpMSA8PCBkZWRpY2F0ZWRfbGF5ZXJzLnNp emUoKSkgLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IG51bV9leGNsdWRlX3Jl Y3RzOwotCi0gIGZvciAoc2VwYXJhdGVfcmVjdHM6OlJlY3RTZXQ8dWludDY0X3QsIGludD4gJnJl Z2lvbiA6IHNlcGFyYXRlX3JlZ2lvbnMpIHsKLSAgICBpZiAocmVnaW9uLmlkX3NldC5nZXRCaXRz KCkgJiBleGNsdWRlX21hc2spCi0gICAgICBjb250aW51ZTsKLQotICAgIC8vIElmIGEgcmVjdCBp bnRlcnNlY3RzIG9uZSBvZiB0aGUgZGVkaWNhdGVkIGxheWVycywgd2UgbmVlZCB0byByZW1vdmUg dGhlCi0gICAgLy8gbGF5ZXJzIGZyb20gdGhlIGNvbXBvc2l0aW9uIHJlZ2lvbiB3aGljaCBhcHBl YXIgKmJlbG93KiB0aGUgZGVkaWNhdGVkCi0gICAgLy8gbGF5ZXIuIFRoaXMgZWZmZWN0aXZlbHkg cHVuY2hlcyBhIGhvbGUgdGhyb3VnaCB0aGUgY29tcG9zaXRpb24gbGF5ZXIgc3VjaAotICAgIC8v IHRoYXQgdGhlIGRlZGljYXRlZCBsYXllciBjYW4gYmUgcGxhY2VkIGJlbG93IHRoZSBjb21wb3Np dGlvbiBhbmQgbm90Ci0gICAgLy8gYmUgb2NjbHVkZWQuCi0gICAgdWludDY0X3QgZGVkaWNhdGVk X2ludGVyc2VjdCA9IHJlZ2lvbi5pZF9zZXQuZ2V0Qml0cygpICYgZGVkaWNhdGVkX21hc2s7Ci0g ICAgZm9yIChzaXplX3QgaSA9IDA7IGRlZGljYXRlZF9pbnRlcnNlY3QgJiYgaSA8IGRlZGljYXRl ZF9sYXllcnMuc2l6ZSgpOwotICAgICAgICAgKytpKSB7Ci0gICAgICAvLyBPbmx5IGV4Y2x1ZGUg bGF5ZXJzIGlmIHRoZXkgaW50ZXJzZWN0IHRoaXMgcGFydGljdWxhciBkZWRpY2F0ZWQgbGF5ZXIK LSAgICAgIGlmICghKGRlZGljYXRlZF9pbnRlcnNlY3QgJiAoMSA8PCAoaSArIG51bV9leGNsdWRl X3JlY3RzKSkpKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgZm9yIChzaXplX3QgaiA9IDA7 IGogPCBjb21wX2xheWVycy5zaXplKCk7ICsraikgewotICAgICAgICBpZiAoY29tcF9sYXllcnNb al0gPCBkZWRpY2F0ZWRfbGF5ZXJzW2ldKQotICAgICAgICAgIHJlZ2lvbi5pZF9zZXQuc3VidHJh Y3QoaiArIGxheWVyX29mZnNldCk7Ci0gICAgICB9CiAgICAgfQotICAgIGlmICghKHJlZ2lvbi5p ZF9zZXQuZ2V0Qml0cygpID4+IGxheWVyX29mZnNldCkpCi0gICAgICBjb250aW51ZTsKLQotICAg IHByZV9jb21wX3JlZ2lvbnNfLmVtcGxhY2VfYmFjayhEcm1Db21wb3NpdGlvblJlZ2lvbnsKLSAg ICAgICAgcmVnaW9uLnJlY3QsCi0gICAgICAgIFNldEJpdHNUb1ZlY3RvcihyZWdpb24uaWRfc2V0 LmdldEJpdHMoKSA+PiBsYXllcl9vZmZzZXQsIGNvbXBfbGF5ZXJzKX0pOwogICB9CiB9CiAKLWlu dCBEcm1EaXNwbGF5Q29tcG9zaXRpb246OkNyZWF0ZUFuZEFzc2lnblJlbGVhc2VGZW5jZXMoKSB7 Ci0gIHN0ZDo6dW5vcmRlcmVkX3NldDxEcm1Id2NMYXllciAqPiBzcXVhc2hfbGF5ZXJzOwotICBz dGQ6OnVub3JkZXJlZF9zZXQ8RHJtSHdjTGF5ZXIgKj4gcHJlX2NvbXBfbGF5ZXJzOwotICBzdGQ6 OnVub3JkZXJlZF9zZXQ8RHJtSHdjTGF5ZXIgKj4gY29tcF9sYXllcnM7Ci0KLSAgZm9yIChjb25z dCBEcm1Db21wb3NpdGlvblJlZ2lvbiAmcmVnaW9uIDogc3F1YXNoX3JlZ2lvbnNfKSB7Ci0gICAg Zm9yIChzaXplX3Qgc291cmNlX2xheWVyX2luZGV4IDogcmVnaW9uLnNvdXJjZV9sYXllcnMpIHsK LSAgICAgIERybUh3Y0xheWVyICpzb3VyY2VfbGF5ZXIgPSAmbGF5ZXJzX1tzb3VyY2VfbGF5ZXJf aW5kZXhdOwotICAgICAgc3F1YXNoX2xheWVycy5lbXBsYWNlKHNvdXJjZV9sYXllcik7Ci0gICAg fQotICB9Ci0KLSAgZm9yIChjb25zdCBEcm1Db21wb3NpdGlvblJlZ2lvbiAmcmVnaW9uIDogcHJl X2NvbXBfcmVnaW9uc18pIHsKLSAgICBmb3IgKHNpemVfdCBzb3VyY2VfbGF5ZXJfaW5kZXggOiBy ZWdpb24uc291cmNlX2xheWVycykgewotICAgICAgRHJtSHdjTGF5ZXIgKnNvdXJjZV9sYXllciA9 ICZsYXllcnNfW3NvdXJjZV9sYXllcl9pbmRleF07Ci0gICAgICBwcmVfY29tcF9sYXllcnMuZW1w bGFjZShzb3VyY2VfbGF5ZXIpOwotICAgICAgc3F1YXNoX2xheWVycy5lcmFzZShzb3VyY2VfbGF5 ZXIpOwotICAgIH0KLSAgfQotCi0gIGZvciAoY29uc3QgRHJtQ29tcG9zaXRpb25QbGFuZSAmcGxh bmUgOiBjb21wb3NpdGlvbl9wbGFuZXNfKSB7Ci0gICAgaWYgKHBsYW5lLnR5cGUoKSA9PSBEcm1D b21wb3NpdGlvblBsYW5lOjpUeXBlOjprTGF5ZXIpIHsKLSAgICAgIGZvciAoYXV0byBpIDogcGxh bmUuc291cmNlX2xheWVycygpKSB7Ci0gICAgICAgIERybUh3Y0xheWVyICpzb3VyY2VfbGF5ZXIg PSAmbGF5ZXJzX1tpXTsKLSAgICAgICAgY29tcF9sYXllcnMuZW1wbGFjZShzb3VyY2VfbGF5ZXIp OwotICAgICAgICBwcmVfY29tcF9sYXllcnMuZXJhc2Uoc291cmNlX2xheWVyKTsKLSAgICAgIH0K LSAgICB9Ci0gIH0KLQotICBmb3IgKERybUh3Y0xheWVyICpsYXllciA6IHNxdWFzaF9sYXllcnMp IHsKLSAgICBpZiAoIWxheWVyLT5yZWxlYXNlX2ZlbmNlKQotICAgICAgY29udGludWU7Ci0gICAg aW50IHJldCA9IGxheWVyLT5yZWxlYXNlX2ZlbmNlLlNldChDcmVhdGVOZXh0VGltZWxpbmVGZW5j ZSgpKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgdGhl IHJlbGVhc2UgZmVuY2UgKHNxdWFzaCkgJWQiLCByZXQpOwotICAgICAgcmV0dXJuIHJldDsKLSAg ICB9Ci0gIH0KLSAgdGltZWxpbmVfc3F1YXNoX2RvbmVfID0gdGltZWxpbmVfOwotCi0gIGZvciAo RHJtSHdjTGF5ZXIgKmxheWVyIDogcHJlX2NvbXBfbGF5ZXJzKSB7Ci0gICAgaWYgKCFsYXllci0+ cmVsZWFzZV9mZW5jZSkKLSAgICAgIGNvbnRpbnVlOwotICAgIGludCByZXQgPSBsYXllci0+cmVs ZWFzZV9mZW5jZS5TZXQoQ3JlYXRlTmV4dFRpbWVsaW5lRmVuY2UoKSk7Ci0gICAgaWYgKHJldCA8 IDApCi0gICAgICByZXR1cm4gcmV0OwotICB9Ci0gIHRpbWVsaW5lX3ByZV9jb21wX2RvbmVfID0g dGltZWxpbmVfOwotCi0gIGZvciAoRHJtSHdjTGF5ZXIgKmxheWVyIDogY29tcF9sYXllcnMpIHsK LSAgICBpZiAoIWxheWVyLT5yZWxlYXNlX2ZlbmNlKQotICAgICAgY29udGludWU7Ci0gICAgaW50 IHJldCA9IGxheWVyLT5yZWxlYXNlX2ZlbmNlLlNldChDcmVhdGVOZXh0VGltZWxpbmVGZW5jZSgp KTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgdGhlIHJl bGVhc2UgZmVuY2UgKGNvbXApICVkIiwgcmV0KTsKLSAgICAgIHJldHVybiByZXQ7Ci0gICAgfQot ICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBEcm1EaXNwbGF5Q29tcG9zaXRpb246OlBsYW4o U3F1YXNoU3RhdGUgKnNxdWFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rk Ojp2ZWN0b3I8RHJtUGxhbmUgKj4gKnByaW1hcnlfcGxhbmVzLAoraW50IERybURpc3BsYXlDb21w b3NpdGlvbjo6UGxhbihzdGQ6OnZlY3RvcjxEcm1QbGFuZSAqPiAqcHJpbWFyeV9wbGFuZXMsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPERybVBsYW5lICo+ICpv dmVybGF5X3BsYW5lcykgewogICBpZiAodHlwZV8gIT0gRFJNX0NPTVBPU0lUSU9OX1RZUEVfRlJB TUUpCiAgICAgcmV0dXJuIDA7CiAKLSAgLy8gVXNlZCB0byB0cmFjayB3aGljaCBsYXllcnMgc2hv dWxkIGJlIHNlbnQgdG8gdGhlIHBsYW5uZXIuIFdlIGV4Y2x1ZGUgbGF5ZXJzCi0gIC8vIHRoYXQg YXJlIGVudGlyZWx5IHNxdWFzaGVkIHNvIHRoZSBwbGFubmVyIGNhbiBwcm92aXNpb24gYSBwcmVj b21wb3NpdGlvbgotICAvLyBsYXllciBhcyBhcHByb3ByaWF0ZSAoZXg6IGlmIDUgbGF5ZXJzIGFy ZSBzcXVhc2hlZCBhbmQgMSBpcyBub3QsIHdlIGRvbid0Ci0gIC8vIHdhbnQgdG8gcGxhbiBhIHBy ZWNvbXBvc2l0aW9uIGxheWVyIHRoYXQgd2lsbCBiZSBjb21wcmlzZWQgb2YgdGhlIGFscmVhZHkK LSAgLy8gc3F1YXNoZWQgbGF5ZXJzKS4KICAgc3RkOjptYXA8c2l6ZV90LCBEcm1Id2NMYXllciAq PiB0b19jb21wb3NpdGU7CiAKLSAgYm9vbCB1c2Vfc3F1YXNoX2ZyYW1lYnVmZmVyID0gZmFsc2U7 Ci0gIC8vIFVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIGxheWVycyB3ZXJlIGVudGlyZWx5IHNxdWFz aGVkCi0gIHN0ZDo6dmVjdG9yPGludD4gbGF5ZXJfc3F1YXNoX2FyZWEobGF5ZXJzXy5zaXplKCks IDApOwotICAvLyBVc2VkIHRvIGF2b2lkIHJlcmVuZGVyaW5nIHJlZ2lvbnMgdGhhdCB3ZXJlIHNx dWFzaGVkCi0gIHN0ZDo6dmVjdG9yPERybUh3Y1JlY3Q8aW50Pj4gZXhjbHVkZV9yZWN0czsKLSAg aWYgKHNxdWFzaCAhPSBOVUxMKSB7Ci0gICAgaWYgKGdlb21ldHJ5X2NoYW5nZWRfKSB7Ci0gICAg ICBzcXVhc2gtPkluaXQobGF5ZXJzXy5kYXRhKCksIGxheWVyc18uc2l6ZSgpKTsKLSAgICB9IGVs c2UgewotICAgICAgc3RkOjp2ZWN0b3I8Ym9vbD4gY2hhbmdlZF9yZWdpb25zOwotICAgICAgc3F1 YXNoLT5HZW5lcmF0ZUhpc3RvcnkobGF5ZXJzXy5kYXRhKCksIGxheWVyc18uc2l6ZSgpLCBjaGFu Z2VkX3JlZ2lvbnMpOwotCi0gICAgICBzdGQ6OnZlY3Rvcjxib29sPiBzdGFibGVfcmVnaW9uczsK LSAgICAgIHNxdWFzaC0+U3RhYmxlUmVnaW9uc1dpdGhNYXJnaW5hbEhpc3RvcnkoY2hhbmdlZF9y ZWdpb25zLCBzdGFibGVfcmVnaW9ucyk7Ci0KLSAgICAgIC8vIE9ubHkgaWYgU09NRSByZWdpb24g aXMgc3RhYmxlCi0gICAgICB1c2Vfc3F1YXNoX2ZyYW1lYnVmZmVyID0KLSAgICAgICAgICBzdGQ6 OmZpbmQoc3RhYmxlX3JlZ2lvbnMuYmVnaW4oKSwgc3RhYmxlX3JlZ2lvbnMuZW5kKCksIHRydWUp ICE9Ci0gICAgICAgICAgc3RhYmxlX3JlZ2lvbnMuZW5kKCk7Ci0KLSAgICAgIHNxdWFzaC0+UmVj b3JkSGlzdG9yeShsYXllcnNfLmRhdGEoKSwgbGF5ZXJzXy5zaXplKCksIGNoYW5nZWRfcmVnaW9u cyk7Ci0KLSAgICAgIC8vIENoYW5nZXMgaW4gd2hpY2ggcmVnaW9ucyBhcmUgc3F1YXNoZWQgdHJp Z2dlcnMgYSByZXJlbmRlciB2aWEKLSAgICAgIC8vIHNxdWFzaF9yZWdpb25zLgotICAgICAgYm9v bCByZW5kZXJfc3F1YXNoID0gc3F1YXNoLT5SZWNvcmRBbmRDb21wYXJlU3F1YXNoZWQoc3RhYmxl X3JlZ2lvbnMpOwotCi0gICAgICBmb3IgKHNpemVfdCByZWdpb25faW5kZXggPSAwOyByZWdpb25f aW5kZXggPCBzdGFibGVfcmVnaW9ucy5zaXplKCk7Ci0gICAgICAgICAgIHJlZ2lvbl9pbmRleCsr KSB7Ci0gICAgICAgIGNvbnN0IFNxdWFzaFN0YXRlOjpSZWdpb24gJnJlZ2lvbiA9IHNxdWFzaC0+ cmVnaW9ucygpW3JlZ2lvbl9pbmRleF07Ci0gICAgICAgIGlmICghc3RhYmxlX3JlZ2lvbnNbcmVn aW9uX2luZGV4XSkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBleGNsdWRlX3JlY3Rz LmVtcGxhY2VfYmFjayhyZWdpb24ucmVjdCk7Ci0KLSAgICAgICAgaWYgKHJlbmRlcl9zcXVhc2gp IHsKLSAgICAgICAgICBzcXVhc2hfcmVnaW9uc18uZW1wbGFjZV9iYWNrKCk7Ci0gICAgICAgICAg c3F1YXNoX3JlZ2lvbnNfLmJhY2soKS5mcmFtZSA9IHJlZ2lvbi5yZWN0OwotICAgICAgICB9Ci0K LSAgICAgICAgaW50IGZyYW1lX2FyZWEgPSByZWdpb24ucmVjdC5hcmVhKCk7Ci0gICAgICAgIC8v IFNvdXJjZSBsYXllcnMgYXJlIHNvcnRlZCBmcm9udCB0byBiYWNrIGkuZS4gdG9wIGxheWVyIGhh cyBsb3dlc3QKLSAgICAgICAgLy8gaW5kZXguCi0gICAgICAgIGZvciAoc2l6ZV90IGxheWVyX2lu ZGV4ID0gbGF5ZXJzXy5zaXplKCk7Ci0gICAgICAgICAgICAgbGF5ZXJfaW5kZXgtLSA+IDA7ICAv LyBZZXMsIEkgZG91YmxlIGNoZWNrZWQgdGhpcwotICAgICAgICAgICAgIC8qIFNlZSBjb25kaXRp b24gKi8pIHsKLSAgICAgICAgICBpZiAoIXJlZ2lvbi5sYXllcl9yZWZzW2xheWVyX2luZGV4XSkK LSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGxheWVyX3NxdWFzaF9hcmVhW2xheWVy X2luZGV4XSArPSBmcmFtZV9hcmVhOwotICAgICAgICAgIGlmIChyZW5kZXJfc3F1YXNoKQotICAg ICAgICAgICAgc3F1YXNoX3JlZ2lvbnNfLmJhY2soKS5zb3VyY2VfbGF5ZXJzLnB1c2hfYmFjayhs YXllcl9pbmRleCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKHNpemVf dCBpID0gMDsgaSA8IGxheWVyc18uc2l6ZSgpOyArK2kpIHsKLSAgICAgIGlmIChsYXllcl9zcXVh c2hfYXJlYVtpXSA8IGxheWVyc19baV0uZGlzcGxheV9mcmFtZS5hcmVhKCkpCi0gICAgICAgIHRv X2NvbXBvc2l0ZS5lbXBsYWNlKHN0ZDo6bWFrZV9wYWlyKGksICZsYXllcnNfW2ldKSk7Ci0gICAg fQotICB9IGVsc2UgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGF5ZXJzXy5zaXplKCk7 ICsraSkKLSAgICAgIHRvX2NvbXBvc2l0ZS5lbXBsYWNlKHN0ZDo6bWFrZV9wYWlyKGksICZsYXll cnNfW2ldKSk7Ci0gIH0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsYXllcnNfLnNpemUoKTsg KytpKQorICAgIHRvX2NvbXBvc2l0ZS5lbXBsYWNlKHN0ZDo6bWFrZV9wYWlyKGksICZsYXllcnNf W2ldKSk7CiAKICAgaW50IHJldDsKICAgc3RkOjp2ZWN0b3I8RHJtQ29tcG9zaXRpb25QbGFuZT4g cGxhbjsKICAgc3RkOjp0aWUocmV0LCBjb21wb3NpdGlvbl9wbGFuZXNfKSA9Ci0gICAgICBwbGFu bmVyXy0+UHJvdmlzaW9uUGxhbmVzKHRvX2NvbXBvc2l0ZSwgdXNlX3NxdWFzaF9mcmFtZWJ1ZmZl ciwgY3J0Y18sCisgICAgICBwbGFubmVyXy0+UHJvdmlzaW9uUGxhbmVzKHRvX2NvbXBvc2l0ZSwg Y3J0Y18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlfcGxhbmVzLCBv dmVybGF5X3BsYW5lcyk7CiAgIGlmIChyZXQpIHsKICAgICBBTE9HRSgiUGxhbm5lciBmYWlsZWQg cHJvdmlzaW9uaW5nIHBsYW5lcyByZXQ9JWQiLCByZXQpOwpAQCAtMzk2LDE3ICsxNTAsNyBAQCBp bnQgRHJtRGlzcGxheUNvbXBvc2l0aW9uOjpQbGFuKFNxdWFzaFN0YXRlICpzcXVhc2gsCiAgICAg fQogICB9CiAKLSAgcmV0dXJuIEZpbmFsaXplQ29tcG9zaXRpb24oZXhjbHVkZV9yZWN0cy5kYXRh KCksIGV4Y2x1ZGVfcmVjdHMuc2l6ZSgpKTsKLX0KLQotaW50IERybURpc3BsYXlDb21wb3NpdGlv bjo6RmluYWxpemVDb21wb3NpdGlvbigpIHsKLSAgcmV0dXJuIEZpbmFsaXplQ29tcG9zaXRpb24o TlVMTCwgMCk7Ci19Ci0KLWludCBEcm1EaXNwbGF5Q29tcG9zaXRpb246OkZpbmFsaXplQ29tcG9z aXRpb24oRHJtSHdjUmVjdDxpbnQ+ICpleGNsdWRlX3JlY3RzLAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2V4Y2x1ZGVfcmVjdHMpIHsK LSAgU2VwYXJhdGVMYXllcnMoZXhjbHVkZV9yZWN0cywgbnVtX2V4Y2x1ZGVfcmVjdHMpOwotICBy ZXR1cm4gQ3JlYXRlQW5kQXNzaWduUmVsZWFzZUZlbmNlcygpOworICByZXR1cm4gMDsKIH0KIAog c3RhdGljIGNvbnN0IGNoYXIgKkRybUNvbXBvc2l0aW9uVHlwZVRvU3RyaW5nKERybUNvbXBvc2l0 aW9uVHlwZSB0eXBlKSB7CkBAIC01MDYsMjMgKzI1MCw2IEBAIHN0YXRpYyBjb25zdCBjaGFyICpC bGVuZGluZ1RvU3RyaW5nKERybUh3Y0JsZW5kaW5nIGJsZW5kaW5nKSB7CiAgIH0KIH0KIAotc3Rh dGljIHZvaWQgRHVtcFJlZ2lvbihjb25zdCBEcm1Db21wb3NpdGlvblJlZ2lvbiAmcmVnaW9uLAot ICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gKm91dCkgewotICAqb3V0 IDw8ICJmcmFtZSI7Ci0gIHJlZ2lvbi5mcmFtZS5EdW1wKG91dCk7Ci0gICpvdXQgPDwgIiBzb3Vy Y2VfbGF5ZXJzPSgiOwotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJnNvdXJjZV9sYXll cnMgPSByZWdpb24uc291cmNlX2xheWVyczsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzb3Vy Y2VfbGF5ZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgKm91dCA8PCBzb3VyY2VfbGF5ZXJzW2ldOwot ICAgIGlmIChpIDwgc291cmNlX2xheWVycy5zaXplKCkgLSAxKSB7Ci0gICAgICAqb3V0IDw8ICIg IjsKLSAgICB9Ci0gIH0KLQotICAqb3V0IDw8ICIpIjsKLX0KLQogdm9pZCBEcm1EaXNwbGF5Q29t cG9zaXRpb246OkR1bXAoc3RkOjpvc3RyaW5nc3RyZWFtICpvdXQpIGNvbnN0IHsKICAgKm91dCA8 PCAiLS0tLURybURpc3BsYXlDb21wb3NpdGlvbiIKICAgICAgICA8PCAiIGNydGM9IiA8PCAoY3J0 Y18gPyBjcnRjXy0+aWQoKSA6IC0xKQpAQCAtNTQwLDEwICsyNjcsNiBAQCB2b2lkIERybURpc3Bs YXlDb21wb3NpdGlvbjo6RHVtcChzdGQ6Om9zdHJpbmdzdHJlYW0gKm91dCkgY29uc3QgewogICAg ICAgYnJlYWs7CiAgIH0KIAotICAqb3V0IDw8ICIgdGltZWxpbmVbY3VycmVudC9zcXVhc2gvcHJl LWNvbXAvZG9uZV09IiA8PCB0aW1lbGluZV9jdXJyZW50XyA8PCAiLyIKLSAgICAgICA8PCB0aW1l bGluZV9zcXVhc2hfZG9uZV8gPDwgIi8iIDw8IHRpbWVsaW5lX3ByZV9jb21wX2RvbmVfIDw8ICIv IgotICAgICAgIDw8IHRpbWVsaW5lXyA8PCAiXG4iOwotCiAgICpvdXQgPDwgIiAgICBMYXllcnM6 IGNvdW50PSIgPDwgbGF5ZXJzXy5zaXplKCkgPDwgIlxuIjsKICAgZm9yIChzaXplX3QgaSA9IDA7 IGkgPCBsYXllcnNfLnNpemUoKTsgaSsrKSB7CiAgICAgY29uc3QgRHJtSHdjTGF5ZXIgJmxheWVy ID0gbGF5ZXJzX1tpXTsKQEAgLTU3OCwxMiArMzAxLDYgQEAgdm9pZCBEcm1EaXNwbGF5Q29tcG9z aXRpb246OkR1bXAoc3RkOjpvc3RyaW5nc3RyZWFtICpvdXQpIGNvbnN0IHsKICAgICAgIGNhc2Ug RHJtQ29tcG9zaXRpb25QbGFuZTo6VHlwZTo6a0xheWVyOgogICAgICAgICAqb3V0IDw8ICJMQVlF UiI7CiAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBEcm1Db21wb3NpdGlvblBsYW5lOjpUeXBl OjprUHJlY29tcDoKLSAgICAgICAgKm91dCA8PCAiUFJFQ09NUCI7Ci0gICAgICAgIGJyZWFrOwot ICAgICAgY2FzZSBEcm1Db21wb3NpdGlvblBsYW5lOjpUeXBlOjprU3F1YXNoOgotICAgICAgICAq b3V0IDw8ICJTUVVBU0giOwotICAgICAgICBicmVhazsKICAgICAgIGRlZmF1bHQ6CiAgICAgICAg ICpvdXQgPDwgIjxpbnZhbGlkPiI7CiAgICAgICAgIGJyZWFrOwpAQCAtNTk1LDE5ICszMTIsNSBA QCB2b2lkIERybURpc3BsYXlDb21wb3NpdGlvbjo6RHVtcChzdGQ6Om9zdHJpbmdzdHJlYW0gKm91 dCkgY29uc3QgewogICAgIH0KICAgICAqb3V0IDw8ICJcbiI7CiAgIH0KLQotICAqb3V0IDw8ICIg ICAgU3F1YXNoIFJlZ2lvbnM6IGNvdW50PSIgPDwgc3F1YXNoX3JlZ2lvbnNfLnNpemUoKSA8PCAi XG4iOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNxdWFzaF9yZWdpb25zXy5zaXplKCk7IGkr KykgewotICAgICpvdXQgPDwgIiAgICAgIFsiIDw8IGkgPDwgIl0gIjsKLSAgICBEdW1wUmVnaW9u KHNxdWFzaF9yZWdpb25zX1tpXSwgb3V0KTsKLSAgICAqb3V0IDw8ICJcbiI7Ci0gIH0KLQotICAq b3V0IDw8ICIgICAgUHJlLUNvbXAgUmVnaW9uczogY291bnQ9IiA8PCBwcmVfY29tcF9yZWdpb25z Xy5zaXplKCkgPDwgIlxuIjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcmVfY29tcF9yZWdp b25zXy5zaXplKCk7IGkrKykgewotICAgICpvdXQgPDwgIiAgICAgIFsiIDw8IGkgPDwgIl0gIjsK LSAgICBEdW1wUmVnaW9uKHByZV9jb21wX3JlZ2lvbnNfW2ldLCBvdXQpOwotICAgICpvdXQgPDwg IlxuIjsKLSAgfQogfQogfQpkaWZmIC0tZ2l0IGEvZHJtZGlzcGxheWNvbXBvc2l0aW9uLmggYi9k cm1kaXNwbGF5Y29tcG9zaXRpb24uaAppbmRleCA5MTgzOTI1Nzg3NTMuLmI3ZmNjYjljZDI4MyAx MDA2NDQKLS0tIGEvZHJtZGlzcGxheWNvbXBvc2l0aW9uLmgKKysrIGIvZHJtZGlzcGxheWNvbXBv c2l0aW9uLmgKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlICJkcm1jcnRjLmgiCiAjaW5jbHVk ZSAiZHJtaHdjb21wb3Nlci5oIgogI2luY2x1ZGUgImRybXBsYW5lLmgiCi0jaW5jbHVkZSAiZ2x3 b3JrZXIuaCIKIAogI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8dmVjdG9yPgpAQCAtNjIs OCArNjEsNiBAQCBjbGFzcyBEcm1Db21wb3NpdGlvblBsYW5lIHsKICAgZW51bSBjbGFzcyBUeXBl IDogaW50MzJfdCB7CiAgICAga0Rpc2FibGUsCiAgICAga0xheWVyLAotICAgIGtQcmVjb21wLAot ICAgIGtTcXVhc2gsCiAgIH07CiAKICAgRHJtQ29tcG9zaXRpb25QbGFuZSgpID0gZGVmYXVsdDsK QEAgLTEyNSwzNCArMTIyLDE1IEBAIGNsYXNzIERybURpc3BsYXlDb21wb3NpdGlvbiB7CiAgIGlu dCBTZXREcG1zTW9kZSh1aW50MzJfdCBkcG1zX21vZGUpOwogICBpbnQgU2V0RGlzcGxheU1vZGUo Y29uc3QgRHJtTW9kZSAmZGlzcGxheV9tb2RlKTsKIAotICBpbnQgUGxhbihTcXVhc2hTdGF0ZSAq c3F1YXNoLCBzdGQ6OnZlY3RvcjxEcm1QbGFuZSAqPiAqcHJpbWFyeV9wbGFuZXMsCisgIGludCBQ bGFuKHN0ZDo6dmVjdG9yPERybVBsYW5lICo+ICpwcmltYXJ5X3BsYW5lcywKICAgICAgICAgICAg c3RkOjp2ZWN0b3I8RHJtUGxhbmUgKj4gKm92ZXJsYXlfcGxhbmVzKTsKIAogICBpbnQgRmluYWxp emVDb21wb3NpdGlvbigpOwogCi0gIGludCBDcmVhdGVOZXh0VGltZWxpbmVGZW5jZSgpOwotICBp bnQgU2lnbmFsU3F1YXNoRG9uZSgpIHsKLSAgICByZXR1cm4gSW5jcmVhc2VUaW1lbGluZVRvUG9p bnQodGltZWxpbmVfc3F1YXNoX2RvbmVfKTsKLSAgfQotICBpbnQgU2lnbmFsUHJlQ29tcERvbmUo KSB7Ci0gICAgcmV0dXJuIEluY3JlYXNlVGltZWxpbmVUb1BvaW50KHRpbWVsaW5lX3ByZV9jb21w X2RvbmVfKTsKLSAgfQotICBpbnQgU2lnbmFsQ29tcG9zaXRpb25Eb25lKCkgewotICAgIHJldHVy biBJbmNyZWFzZVRpbWVsaW5lVG9Qb2ludCh0aW1lbGluZV8pOwotICB9Ci0KICAgc3RkOjp2ZWN0 b3I8RHJtSHdjTGF5ZXI+ICZsYXllcnMoKSB7CiAgICAgcmV0dXJuIGxheWVyc187CiAgIH0KIAot ICBzdGQ6OnZlY3RvcjxEcm1Db21wb3NpdGlvblJlZ2lvbj4gJnNxdWFzaF9yZWdpb25zKCkgewot ICAgIHJldHVybiBzcXVhc2hfcmVnaW9uc187Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxEcm1Db21w b3NpdGlvblJlZ2lvbj4gJnByZV9jb21wX3JlZ2lvbnMoKSB7Ci0gICAgcmV0dXJuIHByZV9jb21w X3JlZ2lvbnNfOwotICB9Ci0KICAgc3RkOjp2ZWN0b3I8RHJtQ29tcG9zaXRpb25QbGFuZT4gJmNv bXBvc2l0aW9uX3BsYW5lcygpIHsKICAgICByZXR1cm4gY29tcG9zaXRpb25fcGxhbmVzXzsKICAg fQpAQCAtMjAyLDEyICsxODAsOSBAQCBjbGFzcyBEcm1EaXNwbGF5Q29tcG9zaXRpb24gewogIHBy aXZhdGU6CiAgIGJvb2wgdmFsaWRhdGVfY29tcG9zaXRpb25fdHlwZShEcm1Db21wb3NpdGlvblR5 cGUgZGVzaXJlZCk7CiAKLSAgaW50IEluY3JlYXNlVGltZWxpbmVUb1BvaW50KGludCBwb2ludCk7 Ci0KICAgaW50IEZpbmFsaXplQ29tcG9zaXRpb24oRHJtSHdjUmVjdDxpbnQ+ICpleGNsdWRlX3Jl Y3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2V4Y2x1ZGVfcmVjdHMp OwogICB2b2lkIFNlcGFyYXRlTGF5ZXJzKERybUh3Y1JlY3Q8aW50PiAqZXhjbHVkZV9yZWN0cywg c2l6ZV90IG51bV9leGNsdWRlX3JlY3RzKTsKLSAgaW50IENyZWF0ZUFuZEFzc2lnblJlbGVhc2VG ZW5jZXMoKTsKIAogICBEcm1SZXNvdXJjZXMgKmRybV8gPSBOVUxMOwogICBEcm1DcnRjICpjcnRj XyA9IE5VTEw7CkBAIC0yMTgsMTcgKzE5MywxMCBAQCBjbGFzcyBEcm1EaXNwbGF5Q29tcG9zaXRp b24gewogICB1aW50MzJfdCBkcG1zX21vZGVfID0gRFJNX01PREVfRFBNU19PTjsKICAgRHJtTW9k ZSBkaXNwbGF5X21vZGVfOwogCi0gIGludCB0aW1lbGluZV9mZF8gPSAtMTsKLSAgaW50IHRpbWVs aW5lXyA9IDA7Ci0gIGludCB0aW1lbGluZV9jdXJyZW50XyA9IDA7Ci0gIGludCB0aW1lbGluZV9z cXVhc2hfZG9uZV8gPSAwOwotICBpbnQgdGltZWxpbmVfcHJlX2NvbXBfZG9uZV8gPSAwOwogICBV bmlxdWVGZCBvdXRfZmVuY2VfID0gLTE7CiAKICAgYm9vbCBnZW9tZXRyeV9jaGFuZ2VkXzsKICAg c3RkOjp2ZWN0b3I8RHJtSHdjTGF5ZXI+IGxheWVyc187Ci0gIHN0ZDo6dmVjdG9yPERybUNvbXBv c2l0aW9uUmVnaW9uPiBzcXVhc2hfcmVnaW9uc187Ci0gIHN0ZDo6dmVjdG9yPERybUNvbXBvc2l0 aW9uUmVnaW9uPiBwcmVfY29tcF9yZWdpb25zXzsKICAgc3RkOjp2ZWN0b3I8RHJtQ29tcG9zaXRp b25QbGFuZT4gY29tcG9zaXRpb25fcGxhbmVzXzsKIAogICB1aW50NjRfdCBmcmFtZV9ub18gPSAw OwpkaWZmIC0tZ2l0IGEvZHJtZGlzcGxheWNvbXBvc2l0b3IuY3BwIGIvZHJtZGlzcGxheWNvbXBv c2l0b3IuY3BwCmluZGV4IGU1NzA5MjNkZTk0Mi4uMzRhNzI5OTI0ZmM2IDEwMDY0NAotLS0gYS9k cm1kaXNwbGF5Y29tcG9zaXRvci5jcHAKKysrIGIvZHJtZGlzcGxheWNvbXBvc2l0b3IuY3BwCkBA IC0zNSwxNTMgKzM1LDE1IEBACiAjaW5jbHVkZSAiZHJtY3J0Yy5oIgogI2luY2x1ZGUgImRybXBs YW5lLmgiCiAjaW5jbHVkZSAiZHJtcmVzb3VyY2VzLmgiCi0jaW5jbHVkZSAiZ2x3b3JrZXIuaCIK IAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi12b2lkIFNxdWFzaFN0YXRlOjpJbml0KERybUh3Y0xh eWVyICpsYXllcnMsIHNpemVfdCBudW1fbGF5ZXJzKSB7Ci0gIGdlbmVyYXRpb25fbnVtYmVyXysr OwotICB2YWxpZF9oaXN0b3J5XyA9IDA7Ci0gIHJlZ2lvbnNfLmNsZWFyKCk7Ci0gIGxhc3RfaGFu ZGxlc18uY2xlYXIoKTsKLQotICBzdGQ6OnZlY3RvcjxEcm1Id2NSZWN0PGludD4+IGluX3JlY3Rz OwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9sYXllcnM7IGkrKykgewotICAgIERybUh3 Y0xheWVyICpsYXllciA9ICZsYXllcnNbaV07Ci0gICAgaW5fcmVjdHMuZW1wbGFjZV9iYWNrKGxh eWVyLT5kaXNwbGF5X2ZyYW1lKTsKLSAgICBsYXN0X2hhbmRsZXNfLnB1c2hfYmFjayhsYXllci0+ c2ZfaGFuZGxlKTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHNlcGFyYXRlX3JlY3RzOjpSZWN0U2V0 PHVpbnQ2NF90LCBpbnQ+PiBvdXRfcmVnaW9uczsKLSAgc2VwYXJhdGVfcmVjdHM6OnNlcGFyYXRl X3JlY3RzXzY0KGluX3JlY3RzLCAmb3V0X3JlZ2lvbnMpOwotCi0gIGZvciAoY29uc3Qgc2VwYXJh dGVfcmVjdHM6OlJlY3RTZXQ8dWludDY0X3QsIGludD4gJm91dF9yZWdpb24gOiBvdXRfcmVnaW9u cykgewotICAgIHJlZ2lvbnNfLmVtcGxhY2VfYmFjaygpOwotICAgIFJlZ2lvbiAmcmVnaW9uID0g cmVnaW9uc18uYmFjaygpOwotICAgIHJlZ2lvbi5yZWN0ID0gb3V0X3JlZ2lvbi5yZWN0OwotICAg IHJlZ2lvbi5sYXllcl9yZWZzID0gb3V0X3JlZ2lvbi5pZF9zZXQuZ2V0Qml0cygpOwotICB9Ci19 Ci0KLXZvaWQgU3F1YXNoU3RhdGU6OkdlbmVyYXRlSGlzdG9yeShEcm1Id2NMYXllciAqbGF5ZXJz LCBzaXplX3QgbnVtX2xheWVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz dGQ6OnZlY3Rvcjxib29sPiAmY2hhbmdlZF9yZWdpb25zKSBjb25zdCB7Ci0gIGNoYW5nZWRfcmVn aW9ucy5yZXNpemUocmVnaW9uc18uc2l6ZSgpKTsKLSAgaWYgKG51bV9sYXllcnMgIT0gbGFzdF9o YW5kbGVzXy5zaXplKCkpIHsKLSAgICBBTE9HRSgiU3F1YXNoU3RhdGU6OkdlbmVyYXRlSGlzdG9y eSBleHBlY3RlZCAlenUgbGF5ZXJzIGJ1dCBnb3QgJXp1IGxheWVycyIsCi0gICAgICAgICAgbGFz dF9oYW5kbGVzXy5zaXplKCksIG51bV9sYXllcnMpOwotICAgIHJldHVybjsKLSAgfQotICBzdGQ6 OmJpdHNldDxrTWF4TGF5ZXJzPiBjaGFuZ2VkX2xheWVyczsKLSAgZm9yIChzaXplX3QgaSA9IDA7 IGkgPCBsYXN0X2hhbmRsZXNfLnNpemUoKTsgaSsrKSB7Ci0gICAgRHJtSHdjTGF5ZXIgKmxheWVy ID0gJmxheWVyc1tpXTsKLSAgICAvLyBQcm90ZWN0ZWQgbGF5ZXJzIGNhbid0IGJlIHNxdWFzaGVk IHNvIHdlIHRyZWF0IHRoZW0gYXMgY29uc3RhbnRseQotICAgIC8vIGNoYW5naW5nLgotICAgIGlm IChsYXllci0+cHJvdGVjdGVkX3VzYWdlKCkgfHwgbGFzdF9oYW5kbGVzX1tpXSAhPSBsYXllci0+ c2ZfaGFuZGxlKQotICAgICAgY2hhbmdlZF9sYXllcnMuc2V0KGkpOwotICB9Ci0KLSAgZm9yIChz aXplX3QgaSA9IDA7IGkgPCByZWdpb25zXy5zaXplKCk7IGkrKykgewotICAgIGNoYW5nZWRfcmVn aW9uc1tpXSA9IChyZWdpb25zX1tpXS5sYXllcl9yZWZzICYgY2hhbmdlZF9sYXllcnMpLmFueSgp OwotICB9Ci19Ci0KLXZvaWQgU3F1YXNoU3RhdGU6OlN0YWJsZVJlZ2lvbnNXaXRoTWFyZ2luYWxI aXN0b3J5KAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJvb2w+ICZjaGFuZ2VkX3JlZ2lvbnMsCi0g ICAgc3RkOjp2ZWN0b3I8Ym9vbD4gJnN0YWJsZV9yZWdpb25zKSBjb25zdCB7Ci0gIHN0YWJsZV9y ZWdpb25zLnJlc2l6ZShyZWdpb25zXy5zaXplKCkpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8 IHJlZ2lvbnNfLnNpemUoKTsgaSsrKSB7Ci0gICAgc3RhYmxlX3JlZ2lvbnNbaV0gPSAhY2hhbmdl ZF9yZWdpb25zW2ldICYmIGlzX3N0YWJsZShpKTsKLSAgfQotfQotCi12b2lkIFNxdWFzaFN0YXRl OjpSZWNvcmRIaXN0b3J5KERybUh3Y0xheWVyICpsYXllcnMsIHNpemVfdCBudW1fbGF5ZXJzLAot ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxib29sPiAm Y2hhbmdlZF9yZWdpb25zKSB7Ci0gIGlmIChudW1fbGF5ZXJzICE9IGxhc3RfaGFuZGxlc18uc2l6 ZSgpKSB7Ci0gICAgQUxPR0UoIlNxdWFzaFN0YXRlOjpSZWNvcmRIaXN0b3J5IGV4cGVjdGVkICV6 dSBsYXllcnMgYnV0IGdvdCAlenUgbGF5ZXJzIiwKLSAgICAgICAgICBsYXN0X2hhbmRsZXNfLnNp emUoKSwgbnVtX2xheWVycyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChjaGFuZ2VkX3JlZ2lv bnMuc2l6ZSgpICE9IHJlZ2lvbnNfLnNpemUoKSkgewotICAgIEFMT0dFKCJTcXVhc2hTdGF0ZTo6 UmVjb3JkSGlzdG9yeSBleHBlY3RlZCAlenUgcmVnaW9ucyBidXQgZ290ICV6dSByZWdpb25zIiwK LSAgICAgICAgICByZWdpb25zXy5zaXplKCksIGNoYW5nZWRfcmVnaW9ucy5zaXplKCkpOwotICAg IHJldHVybjsKLSAgfQotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGFzdF9oYW5kbGVzXy5z aXplKCk7IGkrKykgewotICAgIERybUh3Y0xheWVyICpsYXllciA9ICZsYXllcnNbaV07Ci0gICAg bGFzdF9oYW5kbGVzX1tpXSA9IGxheWVyLT5zZl9oYW5kbGU7Ci0gIH0KLQotICBmb3IgKHNpemVf dCBpID0gMDsgaSA8IHJlZ2lvbnNfLnNpemUoKTsgaSsrKSB7Ci0gICAgcmVnaW9uc19baV0uY2hh bmdlX2hpc3RvcnkgPDw9IDE7Ci0gICAgcmVnaW9uc19baV0uY2hhbmdlX2hpc3Rvcnkuc2V0KC8q IExTQiAqLyAwLCBjaGFuZ2VkX3JlZ2lvbnNbaV0pOwotICB9Ci0KLSAgdmFsaWRfaGlzdG9yeV8r KzsKLX0KLQotYm9vbCBTcXVhc2hTdGF0ZTo6UmVjb3JkQW5kQ29tcGFyZVNxdWFzaGVkKAotICAg IGNvbnN0IHN0ZDo6dmVjdG9yPGJvb2w+ICZzcXVhc2hlZF9yZWdpb25zKSB7Ci0gIGlmIChzcXVh c2hlZF9yZWdpb25zLnNpemUoKSAhPSByZWdpb25zXy5zaXplKCkpIHsKLSAgICBBTE9HRSgKLSAg ICAgICAgIlNxdWFzaFN0YXRlOjpSZWNvcmRBbmRDb21wYXJlU3F1YXNoZWQgZXhwZWN0ZWQgJXp1 IHJlZ2lvbnMgYnV0IGdvdCAiCi0gICAgICAgICIlenUgcmVnaW9ucyIsCi0gICAgICAgIHJlZ2lv bnNfLnNpemUoKSwgc3F1YXNoZWRfcmVnaW9ucy5zaXplKCkpOwotICAgIHJldHVybiBmYWxzZTsK LSAgfQotICBib29sIGNoYW5nZWQgPSBmYWxzZTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBy ZWdpb25zXy5zaXplKCk7IGkrKykgewotICAgIGlmIChyZWdpb25zX1tpXS5zcXVhc2hlZCAhPSBz cXVhc2hlZF9yZWdpb25zW2ldKSB7Ci0gICAgICByZWdpb25zX1tpXS5zcXVhc2hlZCA9IHNxdWFz aGVkX3JlZ2lvbnNbaV07Ci0gICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0 dXJuIGNoYW5nZWQ7Ci19Ci0KLXZvaWQgU3F1YXNoU3RhdGU6OkR1bXAoc3RkOjpvc3RyaW5nc3Ry ZWFtICpvdXQpIGNvbnN0IHsKLSAgKm91dCA8PCAiLS0tLVNxdWFzaFN0YXRlIGdlbmVyYXRpb249 IiA8PCBnZW5lcmF0aW9uX251bWJlcl8KLSAgICAgICA8PCAiIGhpc3Rvcnk9IiA8PCB2YWxpZF9o aXN0b3J5XyA8PCAiXG4iCi0gICAgICAgPDwgIiAgICBSZWdpb25zOiBjb3VudD0iIDw8IHJlZ2lv bnNfLnNpemUoKSA8PCAiXG4iOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlZ2lvbnNfLnNp emUoKTsgaSsrKSB7Ci0gICAgY29uc3QgUmVnaW9uICZyZWdpb24gPSByZWdpb25zX1tpXTsKLSAg ICAqb3V0IDw8ICIgICAgICBbIiA8PCBpIDw8ICJdIgotICAgICAgICAgPDwgIiBoaXN0b3J5PSIg PDwgcmVnaW9uLmNoYW5nZV9oaXN0b3J5IDw8ICIgcmVjdCI7Ci0gICAgcmVnaW9uLnJlY3QuRHVt cChvdXQpOwotICAgICpvdXQgPDwgIiBsYXllcnM9KCI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7 Ci0gICAgZm9yIChzaXplX3QgbGF5ZXJfaW5kZXggPSAwOyBsYXllcl9pbmRleCA8IGtNYXhMYXll cnM7IGxheWVyX2luZGV4KyspIHsKLSAgICAgIGlmICgocmVnaW9uLmxheWVyX3JlZnMgJgotICAg ICAgICAgICBzdGQ6OmJpdHNldDxrTWF4TGF5ZXJzPigoc2l6ZV90KTEgPDwgbGF5ZXJfaW5kZXgp KQotICAgICAgICAgICAgICAuYW55KCkpIHsKLSAgICAgICAgaWYgKCFmaXJzdCkKLSAgICAgICAg ICAqb3V0IDw8ICIgIjsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgKm91dCA8PCBs YXllcl9pbmRleDsKLSAgICAgIH0KLSAgICB9Ci0gICAgKm91dCA8PCAiKSI7Ci0gICAgaWYgKHJl Z2lvbi5zcXVhc2hlZCkKLSAgICAgICpvdXQgPDwgIiBzcXVhc2hlZCI7Ci0gICAgKm91dCA8PCAi XG4iOwotICB9Ci19Ci0KLXN0YXRpYyBib29sIFVzZXNTcXVhc2goY29uc3Qgc3RkOjp2ZWN0b3I8 RHJtQ29tcG9zaXRpb25QbGFuZT4gJmNvbXBfcGxhbmVzKSB7Ci0gIHJldHVybiBzdGQ6OmFueV9v Zihjb21wX3BsYW5lcy5iZWdpbigpLCBjb21wX3BsYW5lcy5lbmQoKSwKLSAgICAgICAgICAgICAg ICAgICAgIFtdKGNvbnN0IERybUNvbXBvc2l0aW9uUGxhbmUgJnBsYW5lKSB7Ci0gICAgcmV0dXJu IHBsYW5lLnR5cGUoKSA9PSBEcm1Db21wb3NpdGlvblBsYW5lOjpUeXBlOjprU3F1YXNoOwotICB9 KTsKLX0KLQogRHJtRGlzcGxheUNvbXBvc2l0b3I6OkRybURpc3BsYXlDb21wb3NpdG9yKCkKICAg ICA6IGRybV8oTlVMTCksCiAgICAgICBkaXNwbGF5XygtMSksCiAgICAgICBpbml0aWFsaXplZF8o ZmFsc2UpLAogICAgICAgYWN0aXZlXyhmYWxzZSksCiAgICAgICB1c2VfaHdfb3ZlcmxheXNfKHRy dWUpLAotICAgICAgZnJhbWVidWZmZXJfaW5kZXhfKDApLAotICAgICAgc3F1YXNoX2ZyYW1lYnVm ZmVyX2luZGV4XygwKSwKICAgICAgIGR1bXBfZnJhbWVzX2NvbXBvc2l0ZWRfKDApLAogICAgICAg ZHVtcF9sYXN0X3RpbWVzdGFtcF9uc18oMCkgewogICBzdHJ1Y3QgdGltZXNwZWMgdHM7CkBAIC0y NDQsMTEyICsxMDYsNiBAQCBEcm1EaXNwbGF5Q29tcG9zaXRvcjo6R2V0QWN0aXZlTW9kZVJlc29s dXRpb24oKSB7CiAgIHJldHVybiBzdGQ6Om1ha2VfdHVwbGUobW9kZS5oX2Rpc3BsYXkoKSwgbW9k ZS52X2Rpc3BsYXkoKSwgMCk7CiB9CiAKLWludCBEcm1EaXNwbGF5Q29tcG9zaXRvcjo6UHJlcGFy ZUZyYW1lYnVmZmVyKAotICAgIERybUZyYW1lYnVmZmVyICZmYiwgRHJtRGlzcGxheUNvbXBvc2l0 aW9uICpkaXNwbGF5X2NvbXApIHsKLSAgaW50IHJldCA9IGZiLldhaXRSZWxlYXNlZCgtMSk7Ci0g IGlmIChyZXQpIHsKLSAgICBBTE9HRSgiRmFpbGVkIHRvIHdhaXQgZm9yIGZyYW1lYnVmZmVyIHJl bGVhc2UgJWQiLCByZXQpOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLSAgdWludDMyX3Qgd2lkdGgs IGhlaWdodDsKLSAgc3RkOjp0aWUod2lkdGgsIGhlaWdodCwgcmV0KSA9IEdldEFjdGl2ZU1vZGVS ZXNvbHV0aW9uKCk7Ci0gIGlmIChyZXQpIHsKLSAgICBBTE9HRSgKLSAgICAgICAgIkZhaWxlZCB0 byBhbGxvY2F0ZSBmcmFtZWJ1ZmZlciBiZWNhdXNlIHRoZSBkaXNwbGF5IHJlc29sdXRpb24gY291 bGQgIgotICAgICAgICAibm90IGJlIGRldGVybWluZWQgJWQiLAotICAgICAgICByZXQpOwotICAg IHJldHVybiByZXQ7Ci0gIH0KLQotICBmYi5zZXRfcmVsZWFzZV9mZW5jZV9mZCgtMSk7Ci0gIGlm ICghZmIuQWxsb2NhdGUod2lkdGgsIGhlaWdodCkpIHsKLSAgICBBTE9HRSgiRmFpbGVkIHRvIGFs bG9jYXRlIGZyYW1lYnVmZmVyIHdpdGggc2l6ZSAlZHglZCIsIHdpZHRoLCBoZWlnaHQpOwotICAg IHJldHVybiAtRU5PTUVNOwotICB9Ci0KLSAgZGlzcGxheV9jb21wLT5sYXllcnMoKS5lbXBsYWNl X2JhY2soKTsKLSAgRHJtSHdjTGF5ZXIgJnByZV9jb21wX2xheWVyID0gZGlzcGxheV9jb21wLT5s YXllcnMoKS5iYWNrKCk7Ci0gIHByZV9jb21wX2xheWVyLnNmX2hhbmRsZSA9IGZiLmJ1ZmZlcigp LT5oYW5kbGU7Ci0gIHByZV9jb21wX2xheWVyLmJsZW5kaW5nID0gRHJtSHdjQmxlbmRpbmc6OmtQ cmVNdWx0OwotICBwcmVfY29tcF9sYXllci5zb3VyY2VfY3JvcCA9IERybUh3Y1JlY3Q8ZmxvYXQ+ KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICBwcmVfY29tcF9sYXllci5kaXNwbGF5X2ZyYW1lID0g RHJtSHdjUmVjdDxpbnQ+KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICByZXQgPSBwcmVfY29tcF9s YXllci5idWZmZXIuSW1wb3J0QnVmZmVyKGZiLmJ1ZmZlcigpLT5oYW5kbGUsCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9jb21wLT5pbXBvcnRlcigp KTsKLSAgaWYgKHJldCkgewotICAgIEFMT0dFKCJGYWlsZWQgdG8gaW1wb3J0IGZyYW1lYnVmZmVy IGZvciBkaXNwbGF5ICVkIiwgcmV0KTsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgcmV0dXJu IHJldDsKLX0KLQotaW50IERybURpc3BsYXlDb21wb3NpdG9yOjpBcHBseVNxdWFzaChEcm1EaXNw bGF5Q29tcG9zaXRpb24gKmRpc3BsYXlfY29tcCkgewotICBpbnQgcmV0ID0gMDsKLQotICBEcm1G cmFtZWJ1ZmZlciAmZmIgPSBzcXVhc2hfZnJhbWVidWZmZXJzX1tzcXVhc2hfZnJhbWVidWZmZXJf aW5kZXhfXTsKLSAgcmV0ID0gUHJlcGFyZUZyYW1lYnVmZmVyKGZiLCBkaXNwbGF5X2NvbXApOwot ICBpZiAocmV0KSB7Ci0gICAgQUxPR0UoIkZhaWxlZCB0byBwcmVwYXJlIGZyYW1lYnVmZmVyIGZv ciBzcXVhc2ggJWQiLCByZXQpOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBzdGQ6OnZlY3Rv cjxEcm1Db21wb3NpdGlvblJlZ2lvbj4gJnJlZ2lvbnMgPSBkaXNwbGF5X2NvbXAtPnNxdWFzaF9y ZWdpb25zKCk7Ci0gIHJldCA9IHByZV9jb21wb3NpdG9yXy0+Q29tcG9zaXRlKGRpc3BsYXlfY29t cC0+bGF5ZXJzKCkuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBy ZWdpb25zLmRhdGEoKSwgcmVnaW9ucy5zaXplKCksIGZiLmJ1ZmZlcigpLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2NvbXAtPmltcG9ydGVyKCkpOwotICBwcmVf Y29tcG9zaXRvcl8tPkZpbmlzaCgpOwotCi0gIGlmIChyZXQpIHsKLSAgICBBTE9HRSgiRmFpbGVk IHRvIHNxdWFzaCBsYXllcnMiKTsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgcmV0ID0gZGlz cGxheV9jb21wLT5DcmVhdGVOZXh0VGltZWxpbmVGZW5jZSgpOwotICBpZiAocmV0IDw9IDApIHsK LSAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBzcXVhc2ggZnJhbWVidWZmZXIgcmVsZWFzZSBm ZW5jZSAlZCIsIHJldCk7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIGZiLnNldF9yZWxlYXNl X2ZlbmNlX2ZkKHJldCk7Ci0gIGRpc3BsYXlfY29tcC0+U2lnbmFsU3F1YXNoRG9uZSgpOwotCi0g IHJldHVybiAwOwotfQotCi1pbnQgRHJtRGlzcGxheUNvbXBvc2l0b3I6OkFwcGx5UHJlQ29tcG9z aXRlKAotICAgIERybURpc3BsYXlDb21wb3NpdGlvbiAqZGlzcGxheV9jb21wKSB7Ci0gIGludCBy ZXQgPSAwOwotCi0gIERybUZyYW1lYnVmZmVyICZmYiA9IGZyYW1lYnVmZmVyc19bZnJhbWVidWZm ZXJfaW5kZXhfXTsKLSAgcmV0ID0gUHJlcGFyZUZyYW1lYnVmZmVyKGZiLCBkaXNwbGF5X2NvbXAp OwotICBpZiAocmV0KSB7Ci0gICAgQUxPR0UoIkZhaWxlZCB0byBwcmVwYXJlIGZyYW1lYnVmZmVy IGZvciBwcmUtY29tcG9zaXRlICVkIiwgcmV0KTsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAg c3RkOjp2ZWN0b3I8RHJtQ29tcG9zaXRpb25SZWdpb24+ICZyZWdpb25zID0gZGlzcGxheV9jb21w LT5wcmVfY29tcF9yZWdpb25zKCk7Ci0gIHJldCA9IHByZV9jb21wb3NpdG9yXy0+Q29tcG9zaXRl KGRpc3BsYXlfY29tcC0+bGF5ZXJzKCkuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICByZWdpb25zLmRhdGEoKSwgcmVnaW9ucy5zaXplKCksIGZiLmJ1ZmZlcigpLAot ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2NvbXAtPmltcG9ydGVy KCkpOwotICBwcmVfY29tcG9zaXRvcl8tPkZpbmlzaCgpOwotCi0gIGlmIChyZXQpIHsKLSAgICBB TE9HRSgiRmFpbGVkIHRvIHByZS1jb21wb3NpdGUgbGF5ZXJzIik7Ci0gICAgcmV0dXJuIHJldDsK LSAgfQotCi0gIHJldCA9IGRpc3BsYXlfY29tcC0+Q3JlYXRlTmV4dFRpbWVsaW5lRmVuY2UoKTsK LSAgaWYgKHJldCA8PSAwKSB7Ci0gICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgcHJlLWNvbXBv c2l0ZSBmcmFtZWJ1ZmZlciByZWxlYXNlIGZlbmNlICVkIiwgcmV0KTsKLSAgICByZXR1cm4gcmV0 OwotICB9Ci0KLSAgZmIuc2V0X3JlbGVhc2VfZmVuY2VfZmQocmV0KTsKLSAgZGlzcGxheV9jb21w LT5TaWduYWxQcmVDb21wRG9uZSgpOwotCi0gIHJldHVybiAwOwotfQotCiBpbnQgRHJtRGlzcGxh eUNvbXBvc2l0b3I6OkRpc2FibGVQbGFuZXMoRHJtRGlzcGxheUNvbXBvc2l0aW9uICpkaXNwbGF5 X2NvbXApIHsKICAgZHJtTW9kZUF0b21pY1JlcVB0ciBwc2V0ID0gZHJtTW9kZUF0b21pY0FsbG9j KCk7CiAgIGlmICghcHNldCkgewpAQCAtMzg0LDEwMyArMTQwLDYgQEAgaW50IERybURpc3BsYXlD b21wb3NpdG9yOjpEaXNhYmxlUGxhbmVzKERybURpc3BsYXlDb21wb3NpdGlvbiAqZGlzcGxheV9j b21wKSB7CiAgIHJldHVybiAwOwogfQogCi1pbnQgRHJtRGlzcGxheUNvbXBvc2l0b3I6OlByZXBh cmVGcmFtZShEcm1EaXNwbGF5Q29tcG9zaXRpb24gKmRpc3BsYXlfY29tcCkgewotICBpbnQgcmV0 ID0gMDsKLQotICBzdGQ6OnZlY3RvcjxEcm1Id2NMYXllcj4gJmxheWVycyA9IGRpc3BsYXlfY29t cC0+bGF5ZXJzKCk7Ci0gIHN0ZDo6dmVjdG9yPERybUNvbXBvc2l0aW9uUGxhbmU+ICZjb21wX3Bs YW5lcyA9Ci0gICAgICBkaXNwbGF5X2NvbXAtPmNvbXBvc2l0aW9uX3BsYW5lcygpOwotICBzdGQ6 OnZlY3RvcjxEcm1Db21wb3NpdGlvblJlZ2lvbj4gJnNxdWFzaF9yZWdpb25zID0KLSAgICAgIGRp c3BsYXlfY29tcC0+c3F1YXNoX3JlZ2lvbnMoKTsKLSAgc3RkOjp2ZWN0b3I8RHJtQ29tcG9zaXRp b25SZWdpb24+ICZwcmVfY29tcF9yZWdpb25zID0KLSAgICAgIGRpc3BsYXlfY29tcC0+cHJlX2Nv bXBfcmVnaW9ucygpOwotCi0gIGlmICghcHJlX2NvbXBvc2l0b3JfKSB7Ci0gICAgcHJlX2NvbXBv c2l0b3JfLnJlc2V0KG5ldyBHTFdvcmtlckNvbXBvc2l0b3IoKSk7Ci0gICAgaW50IHJldCA9IHBy ZV9jb21wb3NpdG9yXy0+SW5pdCgpOwotICAgIGlmIChyZXQpIHsKLSAgICAgIEFMT0dFKCJGYWls ZWQgdG8gaW5pdGlhbGl6ZSBPcGVuR0wgY29tcG9zaXRvciAlZCIsIHJldCk7Ci0gICAgICByZXR1 cm4gcmV0OwotICAgIH0KLSAgfQotCi0gIGludCBzcXVhc2hfbGF5ZXJfaW5kZXggPSAtMTsKLSAg aWYgKHNxdWFzaF9yZWdpb25zLnNpemUoKSA+IDApIHsKLSAgICBzcXVhc2hfZnJhbWVidWZmZXJf aW5kZXhfID0gKHNxdWFzaF9mcmFtZWJ1ZmZlcl9pbmRleF8gKyAxKSAlIDI7Ci0gICAgcmV0ID0g QXBwbHlTcXVhc2goZGlzcGxheV9jb21wKTsKLSAgICBpZiAocmV0KQotICAgICAgcmV0dXJuIHJl dDsKLQotICAgIHNxdWFzaF9sYXllcl9pbmRleCA9IGxheWVycy5zaXplKCkgLSAxOwotICB9IGVs c2UgewotICAgIGlmIChVc2VzU3F1YXNoKGNvbXBfcGxhbmVzKSkgewotICAgICAgRHJtRnJhbWVi dWZmZXIgJmZiID0gc3F1YXNoX2ZyYW1lYnVmZmVyc19bc3F1YXNoX2ZyYW1lYnVmZmVyX2luZGV4 X107Ci0gICAgICBsYXllcnMuZW1wbGFjZV9iYWNrKCk7Ci0gICAgICBzcXVhc2hfbGF5ZXJfaW5k ZXggPSBsYXllcnMuc2l6ZSgpIC0gMTsKLSAgICAgIERybUh3Y0xheWVyICZzcXVhc2hfbGF5ZXIg PSBsYXllcnMuYmFjaygpOwotICAgICAgcmV0ID0gc3F1YXNoX2xheWVyLmJ1ZmZlci5JbXBvcnRC dWZmZXIoZmIuYnVmZmVyKCktPmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGRpc3BsYXlfY29tcC0+aW1wb3J0ZXIoKSk7Ci0gICAgICBpZiAocmV0 KSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW1wb3J0IG9sZCBzcXVhc2hlZCBmcmFtZWJ1 ZmZlciAlZCIsIHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgICB9Ci0gICAgICBzcXVh c2hfbGF5ZXIuc2ZfaGFuZGxlID0gZmIuYnVmZmVyKCktPmhhbmRsZTsKLSAgICAgIHNxdWFzaF9s YXllci5ibGVuZGluZyA9IERybUh3Y0JsZW5kaW5nOjprUHJlTXVsdDsKLSAgICAgIHNxdWFzaF9s YXllci5zb3VyY2VfY3JvcCA9IERybUh3Y1JlY3Q8ZmxvYXQ+KAotICAgICAgICAgIDAsIDAsIHNx dWFzaF9sYXllci5idWZmZXItPndpZHRoLCBzcXVhc2hfbGF5ZXIuYnVmZmVyLT5oZWlnaHQpOwot ICAgICAgc3F1YXNoX2xheWVyLmRpc3BsYXlfZnJhbWUgPSBEcm1Id2NSZWN0PGludD4oCi0gICAg ICAgICAgMCwgMCwgc3F1YXNoX2xheWVyLmJ1ZmZlci0+d2lkdGgsIHNxdWFzaF9sYXllci5idWZm ZXItPmhlaWdodCk7Ci0gICAgICByZXQgPSBkaXNwbGF5X2NvbXAtPkNyZWF0ZU5leHRUaW1lbGlu ZUZlbmNlKCk7Ci0KLSAgICAgIGlmIChyZXQgPD0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVk IHRvIGNyZWF0ZSBzcXVhc2ggZnJhbWVidWZmZXIgcmVsZWFzZSBmZW5jZSAlZCIsIHJldCk7Ci0g ICAgICAgIHJldHVybiByZXQ7Ci0gICAgICB9Ci0KLSAgICAgIGZiLnNldF9yZWxlYXNlX2ZlbmNl X2ZkKHJldCk7Ci0gICAgICByZXQgPSAwOwotICAgIH0KLSAgfQotCi0gIGJvb2wgZG9fcHJlX2Nv bXAgPSBwcmVfY29tcF9yZWdpb25zLnNpemUoKSA+IDA7Ci0gIGludCBwcmVfY29tcF9sYXllcl9p bmRleCA9IC0xOwotICBpZiAoZG9fcHJlX2NvbXApIHsKLSAgICByZXQgPSBBcHBseVByZUNvbXBv c2l0ZShkaXNwbGF5X2NvbXApOwotICAgIGlmIChyZXQpCi0gICAgICByZXR1cm4gcmV0OwotCi0g ICAgcHJlX2NvbXBfbGF5ZXJfaW5kZXggPSBsYXllcnMuc2l6ZSgpIC0gMTsKLSAgICBmcmFtZWJ1 ZmZlcl9pbmRleF8gPSAoZnJhbWVidWZmZXJfaW5kZXhfICsgMSkgJSBEUk1fRElTUExBWV9CVUZG RVJTOwotICB9Ci0KLSAgZm9yIChEcm1Db21wb3NpdGlvblBsYW5lICZjb21wX3BsYW5lIDogY29t cF9wbGFuZXMpIHsKLSAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZzb3VyY2VfbGF5ZXJzID0gY29t cF9wbGFuZS5zb3VyY2VfbGF5ZXJzKCk7Ci0gICAgc3dpdGNoIChjb21wX3BsYW5lLnR5cGUoKSkg ewotICAgICAgY2FzZSBEcm1Db21wb3NpdGlvblBsYW5lOjpUeXBlOjprU3F1YXNoOgotICAgICAg ICBpZiAoc291cmNlX2xheWVycy5zaXplKCkpCi0gICAgICAgICAgQUxPR0UoIlNxdWFzaCBzb3Vy Y2VfbGF5ZXJzIGlzIGV4cGVjdGVkIHRvIGJlIGVtcHR5ICglenUvJWQpIiwKLSAgICAgICAgICAg ICAgICBzb3VyY2VfbGF5ZXJzWzBdLCBzcXVhc2hfbGF5ZXJfaW5kZXgpOwotICAgICAgICBzb3Vy Y2VfbGF5ZXJzLnB1c2hfYmFjayhzcXVhc2hfbGF5ZXJfaW5kZXgpOwotICAgICAgICBicmVhazsK LSAgICAgIGNhc2UgRHJtQ29tcG9zaXRpb25QbGFuZTo6VHlwZTo6a1ByZWNvbXA6Ci0gICAgICAg IGlmICghZG9fcHJlX2NvbXApIHsKLSAgICAgICAgICBBTE9HRSgKLSAgICAgICAgICAgICAgIkNh biBub3QgdXNlIHByZSBjb21wb3NpdGUgZnJhbWVidWZmZXIgd2l0aCBubyBwcmUgY29tcG9zaXRl ICIKLSAgICAgICAgICAgICAgInJlZ2lvbnMiKTsKLSAgICAgICAgICByZXR1cm4gLUVJTlZBTDsK LSAgICAgICAgfQotICAgICAgICAvLyBSZXBsYWNlIHNvdXJjZV9sYXllcnMgd2l0aCB0aGUgb3V0 cHV0IG9mIHRoZSBwcmVjb21wb3NpdGUKLSAgICAgICAgc291cmNlX2xheWVycy5jbGVhcigpOwot ICAgICAgICBzb3VyY2VfbGF5ZXJzLnB1c2hfYmFjayhwcmVfY29tcF9sYXllcl9pbmRleCk7Ci0g ICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9 Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQogaW50IERybURpc3BsYXlDb21wb3NpdG9yOjpDb21taXRG cmFtZShEcm1EaXNwbGF5Q29tcG9zaXRpb24gKmRpc3BsYXlfY29tcCwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0ZXN0X29ubHkpIHsKICAgQVRSQUNFX0NBTEwo KTsKQEAgLTc3OCw4ICs0MzcsNiBAQCB2b2lkIERybURpc3BsYXlDb21wb3NpdG9yOjpDbGVhckRp c3BsYXkoKSB7CiAgIGlmIChEaXNhYmxlUGxhbmVzKGFjdGl2ZV9jb21wb3NpdGlvbl8uZ2V0KCkp KQogICAgIHJldHVybjsKIAotICBhY3RpdmVfY29tcG9zaXRpb25fLT5TaWduYWxDb21wb3NpdGlv bkRvbmUoKTsKLQogICBhY3RpdmVfY29tcG9zaXRpb25fLnJlc2V0KE5VTEwpOwogfQogCkBAIC03 OTksOSArNDU2LDYgQEAgdm9pZCBEcm1EaXNwbGF5Q29tcG9zaXRvcjo6QXBwbHlGcmFtZSgKICAg fQogICArK2R1bXBfZnJhbWVzX2NvbXBvc2l0ZWRfOwogCi0gIGlmIChhY3RpdmVfY29tcG9zaXRp b25fKQotICAgIGFjdGl2ZV9jb21wb3NpdGlvbl8tPlNpZ25hbENvbXBvc2l0aW9uRG9uZSgpOwot CiAgIHJldCA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbG9ja18pOwogICBpZiAocmV0KQogICAgIEFM T0dFKCJGYWlsZWQgdG8gYWNxdWlyZSBsb2NrIGZvciBhY3RpdmVfY29tcG9zaXRpb24gc3dhcCIp OwpAQCAtODE5LDM4ICs0NzMsMTYgQEAgaW50IERybURpc3BsYXlDb21wb3NpdG9yOjpBcHBseUNv bXBvc2l0aW9uKAogICBpbnQgcmV0ID0gMDsKICAgc3dpdGNoIChjb21wb3NpdGlvbi0+dHlwZSgp KSB7CiAgICAgY2FzZSBEUk1fQ09NUE9TSVRJT05fVFlQRV9GUkFNRToKLSAgICAgIHJldCA9IFBy ZXBhcmVGcmFtZShjb21wb3NpdGlvbi5nZXQoKSk7Ci0gICAgICBpZiAocmV0KSB7Ci0gICAgICAg IEFMT0dFKCJGYWlsZWQgdG8gcHJlcGFyZSBmcmFtZSBmb3IgZGlzcGxheSAlZCIsIGRpc3BsYXlf KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgIH0KICAgICAgIGlmIChjb21wb3NpdGlvbi0+ Z2VvbWV0cnlfY2hhbmdlZCgpKSB7CiAgICAgICAgIC8vIFNlbmQgdGhlIGNvbXBvc2l0aW9uIHRv IHRoZSBrZXJuZWwgdG8gZW5zdXJlIHdlIGNhbiBjb21taXQgaXQuIFRoaXMKLSAgICAgICAgLy8g aXMganVzdCBhIHRlc3QsIGl0IHdvbid0IGFjdHVhbGx5IGNvbW1pdCB0aGUgZnJhbWUuIElmIHJl amVjdGVkLAotICAgICAgICAvLyBzcXVhc2ggdGhlIGZyYW1lIGludG8gb25lIGxheWVyIGFuZCB1 c2UgdGhlIHNxdWFzaGVkIGNvbXBvc2l0aW9uCisgICAgICAgIC8vIGlzIGp1c3QgYSB0ZXN0LCBp dCB3b24ndCBhY3R1YWxseSBjb21taXQgdGhlIGZyYW1lLgogICAgICAgICByZXQgPSBDb21taXRG cmFtZShjb21wb3NpdGlvbi5nZXQoKSwgdHJ1ZSk7Ci0gICAgICAgIGlmIChyZXQpCi0gICAgICAg ICAgQUxPR0koIkNvbW1pdCB0ZXN0IGZhaWxlZCwgc3F1YXNoaW5nIGZyYW1lIGZvciBkaXNwbGF5 ICVkIiwgZGlzcGxheV8pOwotICAgICAgICB1c2VfaHdfb3ZlcmxheXNfID0gIXJldDsKLSAgICAg IH0KLQotICAgICAgLy8gSWYgdXNlX2h3X292ZXJsYXlzXyBpcyBmYWxzZSwgd2UgY2FuJ3QgdXNl IGhhcmR3YXJlIHRvIGNvbXBvc2l0ZSB0aGUKLSAgICAgIC8vIGZyYW1lLiBTbyBzcXVhc2ggYWxs IGxheWVycyBpbnRvIGEgc2luZ2xlIGNvbXBvc2l0aW9uIGFuZCBhcHBseSB0aGF0Ci0gICAgICAv LyBpbnN0ZWFkLgotICAgICAgaWYgKCF1c2VfaHdfb3ZlcmxheXNfKSB7Ci0gICAgICAgIHN0ZDo6 dW5pcXVlX3B0cjxEcm1EaXNwbGF5Q29tcG9zaXRpb24+IHNxdWFzaGVkID0gQ3JlYXRlQ29tcG9z aXRpb24oKTsKLSAgICAgICAgcmV0ID0gU3F1YXNoRnJhbWUoY29tcG9zaXRpb24uZ2V0KCksIHNx dWFzaGVkLmdldCgpKTsKLSAgICAgICAgaWYgKCFyZXQpIHsKLSAgICAgICAgICBjb21wb3NpdGlv biA9IHN0ZDo6bW92ZShzcXVhc2hlZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQUxP R0UoIkZhaWxlZCB0byBzcXVhc2ggZnJhbWUgZm9yIGRpc3BsYXkgJWQiLCBkaXNwbGF5Xyk7Ci0g ICAgICAgICAgLy8gRGlzYWJsZSB0aGUgaHcgdXNlZCBieSB0aGUgbGFzdCBhY3RpdmUgY29tcG9z aXRpb24uIFRoaXMgYWxsb3dzIHVzCi0gICAgICAgICAgLy8gdG8gc2lnbmFsIHRoZSByZWxlYXNl IGZlbmNlcyBmcm9tIHRoYXQgY29tcG9zaXRpb24gdG8gYXZvaWQKLSAgICAgICAgICAvLyBoYW5n aW5nLgotICAgICAgICAgIENsZWFyRGlzcGxheSgpOworICAgICAgICBpZiAocmV0KSB7CisgICAg ICAgICAgQUxPR0UoIkNvbW1pdCB0ZXN0IGZhaWxlZCBmb3IgZGlzcGxheSAlZCwgRklYTUUiLCBk aXNwbGF5Xyk7CiAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgfQorCiAg ICAgICBBcHBseUZyYW1lKHN0ZDo6bW92ZShjb21wb3NpdGlvbiksIHJldCk7CiAgICAgICBicmVh azsKICAgICBjYXNlIERSTV9DT01QT1NJVElPTl9UWVBFX0RQTVM6CkBAIC04NzgsMTU0ICs1MTAs NiBAQCBpbnQgRHJtRGlzcGxheUNvbXBvc2l0b3I6OkFwcGx5Q29tcG9zaXRpb24oCiAgIHJldHVy biByZXQ7CiB9CiAKLWludCBEcm1EaXNwbGF5Q29tcG9zaXRvcjo6U3F1YXNoQWxsKCkgewotICBB dXRvTG9jayBsb2NrKCZsb2NrXywgImNvbXBvc2l0b3IiKTsKLSAgaW50IHJldCA9IGxvY2suTG9j aygpOwotICBpZiAocmV0KQotICAgIHJldHVybiByZXQ7Ci0KLSAgaWYgKCFhY3RpdmVfY29tcG9z aXRpb25fKQotICAgIHJldHVybiAwOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxEcm1EaXNwbGF5Q29t cG9zaXRpb24+IGNvbXAgPSBDcmVhdGVDb21wb3NpdGlvbigpOwotICByZXQgPSBTcXVhc2hGcmFt ZShhY3RpdmVfY29tcG9zaXRpb25fLmdldCgpLCBjb21wLmdldCgpKTsKLQotICAvLyBBcHBseUZy YW1lIG5lZWRzIHRoZSBsb2NrCi0gIGxvY2suVW5sb2NrKCk7Ci0KLSAgaWYgKCFyZXQpCi0gICAg QXBwbHlGcmFtZShzdGQ6Om1vdmUoY29tcCksIDApOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8v IFJldHVybnM6Ci0vLyAgIC0gMCBpZiBzcmMgaXMgc3VjY2Vzc2Z1bGx5IHNxdWFzaGVkIGludG8g ZHN0Ci0vLyAgIC0gLUVBTFJFQURZIGlmIHRoZSBzcmMgaXMgYWxyZWFkeSBzcXVhc2hlZAotLy8g ICAtIEFwcHJvcHJpYXRlIGVycm9yIGlmIHRoZSBzcXVhc2ggZmFpbHMKLWludCBEcm1EaXNwbGF5 Q29tcG9zaXRvcjo6U3F1YXNoRnJhbWUoRHJtRGlzcGxheUNvbXBvc2l0aW9uICpzcmMsCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybURpc3BsYXlDb21wb3NpdGlvbiAq ZHN0KSB7Ci0gIGlmIChzcmMtPnR5cGUoKSAhPSBEUk1fQ09NUE9TSVRJT05fVFlQRV9GUkFNRSkK LSAgICByZXR1cm4gLUVOT1RTVVA7Ci0KLSAgc3RkOjp2ZWN0b3I8RHJtQ29tcG9zaXRpb25QbGFu ZT4gJnNyY19wbGFuZXMgPSBzcmMtPmNvbXBvc2l0aW9uX3BsYW5lcygpOwotICBzdGQ6OnZlY3Rv cjxEcm1Id2NMYXllcj4gJnNyY19sYXllcnMgPSBzcmMtPmxheWVycygpOwotCi0gIC8vIE1ha2Ug c3VyZSB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGxheWVyIHRvIHNxdWFzaC4KLSAgc2l6ZV90IHNy Y19wbGFuZXNfd2l0aF9sYXllciA9IHN0ZDo6Y291bnRfaWYoCi0gICAgICBzcmNfcGxhbmVzLmJl Z2luKCksIHNyY19wbGFuZXMuZW5kKCksIFtdKERybUNvbXBvc2l0aW9uUGxhbmUgJnApIHsKLSAg ICAgICAgcmV0dXJuIHAudHlwZSgpICE9IERybUNvbXBvc2l0aW9uUGxhbmU6OlR5cGU6OmtEaXNh YmxlOwotICAgICAgfSk7Ci0gIGlmIChzcmNfcGxhbmVzX3dpdGhfbGF5ZXIgPD0gMSkKLSAgICBy ZXR1cm4gLUVBTFJFQURZOwotCi0gIGludCBwcmVfY29tcF9sYXllcl9pbmRleDsKLQotICBpbnQg cmV0ID0gZHN0LT5Jbml0KGRybV8sIHNyYy0+Y3J0YygpLCBzcmMtPmltcG9ydGVyKCksIHNyYy0+ cGxhbm5lcigpLAotICAgICAgICAgICAgICAgICAgICAgIHNyYy0+ZnJhbWVfbm8oKSk7Ci0gIGlm IChyZXQpIHsKLSAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgc3F1YXNoIGFsbCBjb21wb3NpdGlv biAlZCIsIHJldCk7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIERybUNvbXBvc2l0aW9uUGxh bmUgc3F1YXNoZWRfY29tcChEcm1Db21wb3NpdGlvblBsYW5lOjpUeXBlOjprUHJlY29tcCwgTlVM TCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+Y3J0YygpKTsKLSAg c3RkOjp2ZWN0b3I8RHJtSHdjTGF5ZXI+IGRzdF9sYXllcnM7Ci0gIGZvciAoRHJtQ29tcG9zaXRp b25QbGFuZSAmY29tcF9wbGFuZSA6IHNyY19wbGFuZXMpIHsKLSAgICAvLyBDb21wb3NpdGlvbiBw bGFuZXMgd2l0aG91dCBEUk0gcGxhbmVzIHNob3VsZCBuZXZlciBoYXBwZW4KLSAgICBpZiAoY29t cF9wbGFuZS5wbGFuZSgpID09IE5VTEwpIHsKLSAgICAgIEFMT0dFKCJTa2lwcGluZyBzcXVhc2gg YWxsIGJlY2F1c2Ugb2YgTlVMTCBwbGFuZSIpOwotICAgICAgcmV0ID0gLUVJTlZBTDsKLSAgICAg IGdvdG8gbW92ZV9sYXllcnNfYmFjazsKLSAgICB9Ci0KLSAgICBpZiAoY29tcF9wbGFuZS5wbGFu ZSgpLT50eXBlKCkgPT0gRFJNX1BMQU5FX1RZUEVfUFJJTUFSWSkKLSAgICAgIHNxdWFzaGVkX2Nv bXAuc2V0X3BsYW5lKGNvbXBfcGxhbmUucGxhbmUoKSk7Ci0gICAgZWxzZQotICAgICAgZHN0LT5B ZGRQbGFuZURpc2FibGUoY29tcF9wbGFuZS5wbGFuZSgpKTsKLQotICAgIGlmIChjb21wX3BsYW5l LnR5cGUoKSA9PSBEcm1Db21wb3NpdGlvblBsYW5lOjpUeXBlOjprRGlzYWJsZSkKLSAgICAgIGNv bnRpbnVlOwotCi0gICAgZm9yIChhdXRvIGkgOiBjb21wX3BsYW5lLnNvdXJjZV9sYXllcnMoKSkg ewotICAgICAgRHJtSHdjTGF5ZXIgJmxheWVyID0gc3JjX2xheWVyc1tpXTsKLQotICAgICAgLy8g U3F1YXNoaW5nIHByb3RlY3RlZCBsYXllcnMgaXMgaW1wb3NzaWJsZS4KLSAgICAgIGlmIChsYXll ci5wcm90ZWN0ZWRfdXNhZ2UoKSkgewotICAgICAgICByZXQgPSAtRU5PVFNVUDsKLSAgICAgICAg Z290byBtb3ZlX2xheWVyc19iYWNrOwotICAgICAgfQotCi0gICAgICAvLyBUaGUgT3V0cHV0RmRz IHBvaW50IHRvIGZyZWVkIG1lbW9yeSBhZnRlciBod2Nfc2V0IHJldHVybnMuIFRoZXkgYXJlCi0g ICAgICAvLyByZXR1cm5lZCB0byB0aGUgZGVmYXVsdCB0byBwcmV2ZW50IERybURpc3BsYXlDb21w b3NpdGlvbjo6UGxhbiBmcm9tCi0gICAgICAvLyBmaWxsaW5nIHRoZSBPdXRwdXRGZHMuCi0gICAg ICBsYXllci5yZWxlYXNlX2ZlbmNlID0gT3V0cHV0RmQoKTsKLSAgICAgIGRzdF9sYXllcnMuZW1w bGFjZV9iYWNrKHN0ZDo6bW92ZShsYXllcikpOwotICAgICAgc3F1YXNoZWRfY29tcC5zb3VyY2Vf bGF5ZXJzKCkucHVzaF9iYWNrKAotICAgICAgICAgIHNxdWFzaGVkX2NvbXAuc291cmNlX2xheWVy cygpLnNpemUoKSk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHNxdWFzaGVkX2NvbXAucGxhbmUoKSA9 PSBOVUxMKSB7Ci0gICAgQUxPR0UoIlByaW1hcnkgcGxhbmUgbm90IGZvdW5kIGZvciBzcXVhc2gi KTsKLSAgICByZXQgPSAtRU5PVFNVUDsKLSAgICBnb3RvIG1vdmVfbGF5ZXJzX2JhY2s7Ci0gIH0K LQotICByZXQgPSBkc3QtPlNldExheWVycyhkc3RfbGF5ZXJzLmRhdGEoKSwgZHN0X2xheWVycy5z aXplKCksIGZhbHNlKTsKLSAgaWYgKHJldCkgewotICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGxh eWVycyBmb3Igc3F1YXNoIGFsbCBjb21wb3NpdGlvbiAlZCIsIHJldCk7Ci0gICAgZ290byBtb3Zl X2xheWVyc19iYWNrOwotICB9Ci0KLSAgcmV0ID0gZHN0LT5BZGRQbGFuZUNvbXBvc2l0aW9uKHN0 ZDo6bW92ZShzcXVhc2hlZF9jb21wKSk7Ci0gIGlmIChyZXQpIHsKLSAgICBBTE9HRSgiRmFpbGVk IHRvIGFkZCBzcXVhc2hlZCBwbGFuZSBjb21wb3NpdGlvbiAlZCIsIHJldCk7Ci0gICAgZ290byBt b3ZlX2xheWVyc19iYWNrOwotICB9Ci0KLSAgcmV0ID0gZHN0LT5GaW5hbGl6ZUNvbXBvc2l0aW9u KCk7Ci0gIGlmIChyZXQpIHsKLSAgICBBTE9HRSgiRmFpbGVkIHRvIHBsYW4gZm9yIHNxdWFzaCBh bGwgY29tcG9zaXRpb24gJWQiLCByZXQpOwotICAgIGdvdG8gbW92ZV9sYXllcnNfYmFjazsKLSAg fQotCi0gIHJldCA9IEFwcGx5UHJlQ29tcG9zaXRlKGRzdCk7Ci0gIGlmIChyZXQpIHsKLSAgICBB TE9HRSgiRmFpbGVkIHRvIHByZS1jb21wb3NpdGUgZm9yIHNxdWFzaCBhbGwgY29tcG9zaXRpb24g JWQiLCByZXQpOwotICAgIGdvdG8gbW92ZV9sYXllcnNfYmFjazsKLSAgfQotCi0gIHByZV9jb21w X2xheWVyX2luZGV4ID0gZHN0LT5sYXllcnMoKS5zaXplKCkgLSAxOwotICBmcmFtZWJ1ZmZlcl9p bmRleF8gPSAoZnJhbWVidWZmZXJfaW5kZXhfICsgMSkgJSBEUk1fRElTUExBWV9CVUZGRVJTOwot Ci0gIGZvciAoRHJtQ29tcG9zaXRpb25QbGFuZSAmcGxhbmUgOiBkc3QtPmNvbXBvc2l0aW9uX3Bs YW5lcygpKSB7Ci0gICAgaWYgKHBsYW5lLnR5cGUoKSA9PSBEcm1Db21wb3NpdGlvblBsYW5lOjpU eXBlOjprUHJlY29tcCkgewotICAgICAgLy8gUmVwbGFjZSBzb3VyY2VfbGF5ZXJzIHdpdGggdGhl IG91dHB1dCBvZiB0aGUgcHJlY29tcG9zaXRlCi0gICAgICBwbGFuZS5zb3VyY2VfbGF5ZXJzKCku Y2xlYXIoKTsKLSAgICAgIHBsYW5lLnNvdXJjZV9sYXllcnMoKS5wdXNoX2JhY2socHJlX2NvbXBf bGF5ZXJfaW5kZXgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDA7Ci0K LS8vIFRPRE8oemFjaHIpOiB0aGluayBvZiBhIGJldHRlciB3YXkgdG8gdHJhbnNmZXIgb3duZXJz aGlwIGJhY2sgdG8gdGhlIGFjdGl2ZQotLy8gY29tcG9zaXRpb24uCi1tb3ZlX2xheWVyc19iYWNr OgotICBmb3IgKHNpemVfdCBwbGFuZV9pbmRleCA9IDA7Ci0gICAgICAgcGxhbmVfaW5kZXggPCBz cmNfcGxhbmVzLnNpemUoKSAmJiBwbGFuZV9pbmRleCA8IGRzdF9sYXllcnMuc2l6ZSgpOykgewot ICAgIGlmIChzcmNfcGxhbmVzW3BsYW5lX2luZGV4XS5zb3VyY2VfbGF5ZXJzKCkuZW1wdHkoKSkg ewotICAgICAgcGxhbmVfaW5kZXgrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBmb3Ig KGF1dG8gaSA6IHNyY19wbGFuZXNbcGxhbmVfaW5kZXhdLnNvdXJjZV9sYXllcnMoKSkKLSAgICAg IHNyY19sYXllcnNbaV0gPSBzdGQ6Om1vdmUoZHN0X2xheWVyc1twbGFuZV9pbmRleCsrXSk7Ci0g IH0KLQotICByZXR1cm4gcmV0OwotfQotCiB2b2lkIERybURpc3BsYXlDb21wb3NpdG9yOjpEdW1w KHN0ZDo6b3N0cmluZ3N0cmVhbSAqb3V0KSBjb25zdCB7CiAgIGludCByZXQgPSBwdGhyZWFkX211 dGV4X2xvY2soJmxvY2tfKTsKICAgaWYgKHJldCkKQEAgLTEwNTEsMTEgKzUzNSw2IEBAIHZvaWQg RHJtRGlzcGxheUNvbXBvc2l0b3I6OkR1bXAoc3RkOjpvc3RyaW5nc3RyZWFtICpvdXQpIGNvbnN0 IHsKIAogICBkdW1wX2xhc3RfdGltZXN0YW1wX25zXyA9IGN1cl90czsKIAotICBpZiAoYWN0aXZl X2NvbXBvc2l0aW9uXykKLSAgICBhY3RpdmVfY29tcG9zaXRpb25fLT5EdW1wKG91dCk7Ci0KLSAg c3F1YXNoX3N0YXRlXy5EdW1wKG91dCk7Ci0KICAgcHRocmVhZF9tdXRleF91bmxvY2soJmxvY2tf KTsKIH0KIH0KZGlmZiAtLWdpdCBhL2RybWRpc3BsYXljb21wb3NpdG9yLmggYi9kcm1kaXNwbGF5 Y29tcG9zaXRvci5oCmluZGV4IGYxOTY1ZmIwYWQ3Zi4uZWFmODJmY2E5ODlkIDEwMDY0NAotLS0g YS9kcm1kaXNwbGF5Y29tcG9zaXRvci5oCisrKyBiL2RybWRpc3BsYXljb21wb3NpdG9yLmgKQEAg LTM2LDQ5ICszNiw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgR0xXb3JrZXJD b21wb3NpdG9yOwotCi1jbGFzcyBTcXVhc2hTdGF0ZSB7Ci0gcHVibGljOgotICBzdGF0aWMgY29u c3QgdW5zaWduZWQga0hpc3RvcnlMZW5ndGggPSA2OyAgLy8gVE9ETzogbWFrZSB0aGlzIG51bWJl ciBub3QgbWFnaWMKLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtNYXhMYXllcnMgPSA2NDsKLQot ICBzdHJ1Y3QgUmVnaW9uIHsKLSAgICBEcm1Id2NSZWN0PGludD4gcmVjdDsKLSAgICBzdGQ6OmJp dHNldDxrTWF4TGF5ZXJzPiBsYXllcl9yZWZzOwotICAgIHN0ZDo6Yml0c2V0PGtIaXN0b3J5TGVu Z3RoPiBjaGFuZ2VfaGlzdG9yeTsKLSAgICBib29sIHNxdWFzaGVkID0gZmFsc2U7Ci0gIH07Ci0K LSAgYm9vbCBpc19zdGFibGUoaW50IHJlZ2lvbl9pbmRleCkgY29uc3QgewotICAgIHJldHVybiB2 YWxpZF9oaXN0b3J5XyA+PSBrSGlzdG9yeUxlbmd0aCAmJgotICAgICAgICAgICByZWdpb25zX1ty ZWdpb25faW5kZXhdLmNoYW5nZV9oaXN0b3J5Lm5vbmUoKTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6 dmVjdG9yPFJlZ2lvbj4gJnJlZ2lvbnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJlZ2lvbnNfOwot ICB9Ci0KLSAgdm9pZCBJbml0KERybUh3Y0xheWVyICpsYXllcnMsIHNpemVfdCBudW1fbGF5ZXJz KTsKLSAgdm9pZCBHZW5lcmF0ZUhpc3RvcnkoRHJtSHdjTGF5ZXIgKmxheWVycywgc2l6ZV90IG51 bV9sYXllcnMsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGJvb2w+ICZjaGFu Z2VkX3JlZ2lvbnMpIGNvbnN0OwotICB2b2lkIFN0YWJsZVJlZ2lvbnNXaXRoTWFyZ2luYWxIaXN0 b3J5KAotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vbD4gJmNoYW5nZWRfcmVnaW9ucywKLSAg ICAgIHN0ZDo6dmVjdG9yPGJvb2w+ICZzdGFibGVfcmVnaW9ucykgY29uc3Q7Ci0gIHZvaWQgUmVj b3JkSGlzdG9yeShEcm1Id2NMYXllciAqbGF5ZXJzLCBzaXplX3QgbnVtX2xheWVycywKLSAgICAg ICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJvb2w+ICZjaGFuZ2VkX3JlZ2lvbnMp OwotICBib29sIFJlY29yZEFuZENvbXBhcmVTcXVhc2hlZChjb25zdCBzdGQ6OnZlY3Rvcjxib29s PiAmc3F1YXNoZWRfcmVnaW9ucyk7Ci0KLSAgdm9pZCBEdW1wKHN0ZDo6b3N0cmluZ3N0cmVhbSAq b3V0KSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHNpemVfdCBnZW5lcmF0aW9uX251bWJlcl8gPSAw OwotICB1bnNpZ25lZCB2YWxpZF9oaXN0b3J5XyA9IDA7Ci0gIHN0ZDo6dmVjdG9yPGJ1ZmZlcl9o YW5kbGVfdD4gbGFzdF9oYW5kbGVzXzsKLQotICBzdGQ6OnZlY3RvcjxSZWdpb24+IHJlZ2lvbnNf OwotfTsKLQogY2xhc3MgRHJtRGlzcGxheUNvbXBvc2l0b3IgewogIHB1YmxpYzoKICAgRHJtRGlz cGxheUNvbXBvc2l0b3IoKTsKQEAgLTg5LDE1ICs0NiwxMCBAQCBjbGFzcyBEcm1EaXNwbGF5Q29t cG9zaXRvciB7CiAgIHN0ZDo6dW5pcXVlX3B0cjxEcm1EaXNwbGF5Q29tcG9zaXRpb24+IENyZWF0 ZUNvbXBvc2l0aW9uKCkgY29uc3Q7CiAgIGludCBBcHBseUNvbXBvc2l0aW9uKHN0ZDo6dW5pcXVl X3B0cjxEcm1EaXNwbGF5Q29tcG9zaXRpb24+IGNvbXBvc2l0aW9uKTsKICAgaW50IENvbXBvc2l0 ZSgpOwotICBpbnQgU3F1YXNoQWxsKCk7CiAgIHZvaWQgRHVtcChzdGQ6Om9zdHJpbmdzdHJlYW0g Km91dCkgY29uc3Q7CiAKICAgc3RkOjp0dXBsZTx1aW50MzJfdCwgdWludDMyX3QsIGludD4gR2V0 QWN0aXZlTW9kZVJlc29sdXRpb24oKTsKIAotICBTcXVhc2hTdGF0ZSAqc3F1YXNoX3N0YXRlKCkg ewotICAgIHJldHVybiAmc3F1YXNoX3N0YXRlXzsKLSAgfQotCiAgcHJpdmF0ZToKICAgc3RydWN0 IE1vZGVTdGF0ZSB7CiAgICAgYm9vbCBuZWVkc19tb2Rlc2V0ID0gZmFsc2U7CkBAIC0xMTUsMTEg KzY3LDggQEAgY2xhc3MgRHJtRGlzcGxheUNvbXBvc2l0b3IgewogCiAgIGludCBQcmVwYXJlRnJh bWVidWZmZXIoRHJtRnJhbWVidWZmZXIgJmZiLAogICAgICAgICAgICAgICAgICAgICAgICAgIERy bURpc3BsYXlDb21wb3NpdGlvbiAqZGlzcGxheV9jb21wKTsKLSAgaW50IEFwcGx5U3F1YXNoKERy bURpc3BsYXlDb21wb3NpdGlvbiAqZGlzcGxheV9jb21wKTsKLSAgaW50IEFwcGx5UHJlQ29tcG9z aXRlKERybURpc3BsYXlDb21wb3NpdGlvbiAqZGlzcGxheV9jb21wKTsKICAgaW50IFByZXBhcmVG cmFtZShEcm1EaXNwbGF5Q29tcG9zaXRpb24gKmRpc3BsYXlfY29tcCk7CiAgIGludCBDb21taXRG cmFtZShEcm1EaXNwbGF5Q29tcG9zaXRpb24gKmRpc3BsYXlfY29tcCwgYm9vbCB0ZXN0X29ubHkp OwotICBpbnQgU3F1YXNoRnJhbWUoRHJtRGlzcGxheUNvbXBvc2l0aW9uICpzcmMsIERybURpc3Bs YXlDb21wb3NpdGlvbiAqZHN0KTsKICAgaW50IEFwcGx5RHBtcyhEcm1EaXNwbGF5Q29tcG9zaXRp b24gKmRpc3BsYXlfY29tcCk7CiAgIGludCBEaXNhYmxlUGxhbmVzKERybURpc3BsYXlDb21wb3Np dGlvbiAqZGlzcGxheV9jb21wKTsKIApAQCAtMTQyLDExICs5MSw2IEBAIGNsYXNzIERybURpc3Bs YXlDb21wb3NpdG9yIHsKIAogICBpbnQgZnJhbWVidWZmZXJfaW5kZXhfOwogICBEcm1GcmFtZWJ1 ZmZlciBmcmFtZWJ1ZmZlcnNfW0RSTV9ESVNQTEFZX0JVRkZFUlNdOwotICBzdGQ6OnVuaXF1ZV9w dHI8R0xXb3JrZXJDb21wb3NpdG9yPiBwcmVfY29tcG9zaXRvcl87Ci0KLSAgU3F1YXNoU3RhdGUg c3F1YXNoX3N0YXRlXzsKLSAgaW50IHNxdWFzaF9mcmFtZWJ1ZmZlcl9pbmRleF87Ci0gIERybUZy YW1lYnVmZmVyIHNxdWFzaF9mcmFtZWJ1ZmZlcnNfWzJdOwogCiAgIC8vIG11dGFibGUgc2luY2Ug d2UgbmVlZCB0byBhY3F1aXJlIGluIER1bXAoKQogICBtdXRhYmxlIHB0aHJlYWRfbXV0ZXhfdCBs b2NrXzsKZGlmZiAtLWdpdCBhL2RybWh3Y3R3by5jcHAgYi9kcm1od2N0d28uY3BwCmluZGV4IDhl MDBkNzE1MDIxNy4uNjBmZjM4NGU5YTA4IDEwMDY0NAotLS0gYS9kcm1od2N0d28uY3BwCisrKyBi L2RybWh3Y3R3by5jcHAKQEAgLTUzOSw3ICs1MzksNyBAQCBIV0MyOjpFcnJvciBEcm1Id2NUd286 Okh3Y0Rpc3BsYXk6OlByZXNlbnREaXNwbGF5KGludDMyX3QgKnJldGlyZV9mZW5jZSkgewogCiAg IHN0ZDo6dmVjdG9yPERybVBsYW5lICo+IHByaW1hcnlfcGxhbmVzKHByaW1hcnlfcGxhbmVzXyk7 CiAgIHN0ZDo6dmVjdG9yPERybVBsYW5lICo+IG92ZXJsYXlfcGxhbmVzKG92ZXJsYXlfcGxhbmVz Xyk7Ci0gIHJldCA9IGNvbXBvc2l0aW9uLT5QbGFuKGNvbXBvc2l0b3JfLnNxdWFzaF9zdGF0ZSgp LCAmcHJpbWFyeV9wbGFuZXMsCisgIHJldCA9IGNvbXBvc2l0aW9uLT5QbGFuKCZwcmltYXJ5X3Bs YW5lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZlcmxheV9wbGFuZXMpOwogICBpZiAo cmV0KSB7CiAgICAgQUxPR0UoIkZhaWxlZCB0byBwbGFuIHRoZSBjb21wb3NpdGlvbiByZXQ9JWQi LCByZXQpOwpAQCAtNjkyLDEyICs2OTIsMTAgQEAgSFdDMjo6RXJyb3IgRHJtSHdjVHdvOjpId2NE aXNwbGF5OjpWYWxpZGF0ZURpc3BsYXkodWludDMyX3QgKm51bV90eXBlcywKICAgICAgIGNhc2Ug SFdDMjo6Q29tcG9zaXRpb246OlNvbGlkQ29sb3I6CiAgICAgICBjYXNlIEhXQzI6OkNvbXBvc2l0 aW9uOjpDdXJzb3I6CiAgICAgICBjYXNlIEhXQzI6OkNvbXBvc2l0aW9uOjpTaWRlYmFuZDoKKyAg ICAgIGRlZmF1bHQ6CiAgICAgICAgIGxheWVyLnNldF92YWxpZGF0ZWRfdHlwZShIV0MyOjpDb21w b3NpdGlvbjo6Q2xpZW50KTsKICAgICAgICAgKysqbnVtX3R5cGVzOwogICAgICAgICBicmVhazsK LSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGxheWVyLnNldF92YWxpZGF0ZWRfdHlwZShsYXllci5z Zl90eXBlKCkpOwotICAgICAgICBicmVhazsKICAgICB9CiAgIH0KICAgcmV0dXJuICpudW1fdHlw ZXMgPyBIV0MyOjpFcnJvcjo6SGFzQ2hhbmdlcyA6IEhXQzI6OkVycm9yOjpOb25lOwpkaWZmIC0t Z2l0IGEvZ2x3b3JrZXIuY3BwIGIvZ2x3b3JrZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCBjYTcyNmJmNTczYmEuLjAwMDAwMDAwMDAwMAotLS0gYS9nbHdvcmtlci5jcHAKKysr IC9kZXYvbnVsbApAQCAtMSw4NDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBU aGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhl IEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5 IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2Uu Ci0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAg IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVz cyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29m dHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9u IGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBP RiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5z ZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAq IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgQVRSQUNFX1RB RyBBVFJBQ0VfVEFHX0dSQVBISUNTCi0jZGVmaW5lIExPR19UQUcgImh3Yy1nbC13b3JrZXIiCi0K LSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHNzdHJl YW0+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLQotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5o PgotCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJl L2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvaHdjb21wb3Nlci5oPgotCi0jaW5jbHVk ZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+Ci0KLSNp bmNsdWRlIDx1dGlscy9UcmFjZS5oPgotCi0jaW5jbHVkZSAiZHJtZGlzcGxheWNvbXBvc2l0aW9u LmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLQotI2luY2x1ZGUgImdsd29ya2VyLmgiCi0KLSNk ZWZpbmUgTUFYX09WRVJMQVBQSU5HX0xBWUVSUyA2NAotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0K LS8vIGNsYW5nLWZvcm1hdCBvZmYKLS8vIENvbHVtbi1tYWpvciBvcmRlcjoKLS8vIGZsb2F0IG1h dFs0XSA9IHsgMSwgMiwgMywgNCB9ID09PQotLy8gWyAxIDMgXQotLy8gWyAyIDQgXQotZmxvYXQg a1RleHR1cmVUcmFuc2Zvcm1NYXRyaWNlc1tdID0gewotICAgMS4wZiwgIDAuMGYsICAwLjBmLCAg MS4wZiwgLy8gaWRlbnRpdHkgbWF0cml4Ci0gICAwLjBmLCAgMS4wZiwgIDEuMGYsICAwLjBmLCAv LyBzd2FwIHggYW5kIHkKLX07Ci0vLyBjbGFuZy1mb3JtYXQgb24KLQotc3RhdGljIGNvbnN0IGNo YXIgKkdldEdMRXJyb3Iodm9pZCkgewotICBzd2l0Y2ggKGdsR2V0RXJyb3IoKSkgewotICAgIGNh c2UgR0xfTk9fRVJST1I6Ci0gICAgICByZXR1cm4gIkdMX05PX0VSUk9SIjsKLSAgICBjYXNlIEdM X0lOVkFMSURfRU5VTToKLSAgICAgIHJldHVybiAiR0xfSU5WQUxJRF9FTlVNIjsKLSAgICBjYXNl IEdMX0lOVkFMSURfVkFMVUU6Ci0gICAgICByZXR1cm4gIkdMX0lOVkFMSURfVkFMVUUiOwotICAg IGNhc2UgR0xfSU5WQUxJRF9PUEVSQVRJT046Ci0gICAgICByZXR1cm4gIkdMX0lOVkFMSURfT1BF UkFUSU9OIjsKLSAgICBjYXNlIEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OOgotICAg ICAgcmV0dXJuICJHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTiI7Ci0gICAgY2FzZSBH TF9PVVRfT0ZfTUVNT1JZOgotICAgICAgcmV0dXJuICJHTF9PVVRfT0ZfTUVNT1JZIjsKLSAgICBk ZWZhdWx0OgotICAgICAgcmV0dXJuICJVbmtub3duIGVycm9yIjsKLSAgfQotfQotCi1zdGF0aWMg Y29uc3QgY2hhciAqR2V0R0xGcmFtZWJ1ZmZlckVycm9yKHZvaWQpIHsKLSAgc3dpdGNoIChnbENo ZWNrRnJhbWVidWZmZXJTdGF0dXMoR0xfRlJBTUVCVUZGRVIpKSB7Ci0gICAgY2FzZSBHTF9GUkFN RUJVRkZFUl9DT01QTEVURToKLSAgICAgIHJldHVybiAiR0xfRlJBTUVCVUZGRVJfQ09NUExFVEUi OwotICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UOgotICAgICAg cmV0dXJuICJHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQiOwotICAgIGNhc2Ug R0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQ6Ci0gICAgICByZXR1 cm4gIkdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UIjsKLSAgICBj YXNlIEdMX0ZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEOgotICAgICAgcmV0dXJuICJHTF9GUkFNRUJV RkZFUl9VTlNVUFBPUlRFRCI7Ci0gICAgY2FzZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJ TUVOU0lPTlM6Ci0gICAgICByZXR1cm4gIkdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5T SU9OUyI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiVW5rbm93biBlcnJvciI7Ci0gIH0K LX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKkdldEVHTEVycm9yKHZvaWQpIHsKLSAgc3dpdGNoIChl Z2xHZXRFcnJvcigpKSB7Ci0gICAgY2FzZSBFR0xfU1VDQ0VTUzoKLSAgICAgIHJldHVybiAiRUdM X1NVQ0NFU1MiOwotICAgIGNhc2UgRUdMX05PVF9JTklUSUFMSVpFRDoKLSAgICAgIHJldHVybiAi RUdMX05PVF9JTklUSUFMSVpFRCI7Ci0gICAgY2FzZSBFR0xfQkFEX0FDQ0VTUzoKLSAgICAgIHJl dHVybiAiRUdMX0JBRF9BQ0NFU1MiOwotICAgIGNhc2UgRUdMX0JBRF9BTExPQzoKLSAgICAgIHJl dHVybiAiRUdMX0JBRF9BTExPQyI7Ci0gICAgY2FzZSBFR0xfQkFEX0FUVFJJQlVURToKLSAgICAg IHJldHVybiAiRUdMX0JBRF9BVFRSSUJVVEUiOwotICAgIGNhc2UgRUdMX0JBRF9DT05URVhUOgot ICAgICAgcmV0dXJuICJFR0xfQkFEX0NPTlRFWFQiOwotICAgIGNhc2UgRUdMX0JBRF9DT05GSUc6 Ci0gICAgICByZXR1cm4gIkVHTF9CQURfQ09ORklHIjsKLSAgICBjYXNlIEVHTF9CQURfQ1VSUkVO VF9TVVJGQUNFOgotICAgICAgcmV0dXJuICJFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRSI7Ci0gICAg Y2FzZSBFR0xfQkFEX0RJU1BMQVk6Ci0gICAgICByZXR1cm4gIkVHTF9CQURfRElTUExBWSI7Ci0g ICAgY2FzZSBFR0xfQkFEX1NVUkZBQ0U6Ci0gICAgICByZXR1cm4gIkVHTF9CQURfU1VSRkFDRSI7 Ci0gICAgY2FzZSBFR0xfQkFEX01BVENIOgotICAgICAgcmV0dXJuICJFR0xfQkFEX01BVENIIjsK LSAgICBjYXNlIEVHTF9CQURfUEFSQU1FVEVSOgotICAgICAgcmV0dXJuICJFR0xfQkFEX1BBUkFN RVRFUiI7Ci0gICAgY2FzZSBFR0xfQkFEX05BVElWRV9QSVhNQVA6Ci0gICAgICByZXR1cm4gIkVH TF9CQURfTkFUSVZFX1BJWE1BUCI7Ci0gICAgY2FzZSBFR0xfQkFEX05BVElWRV9XSU5ET1c6Ci0g ICAgICByZXR1cm4gIkVHTF9CQURfTkFUSVZFX1dJTkRPVyI7Ci0gICAgY2FzZSBFR0xfQ09OVEVY VF9MT1NUOgotICAgICAgcmV0dXJuICJFR0xfQ09OVEVYVF9MT1NUIjsKLSAgICBkZWZhdWx0Ogot ICAgICAgcmV0dXJuICJVbmtub3duIGVycm9yIjsKLSAgfQotfQotCi1zdGF0aWMgYm9vbCBIYXNF eHRlbnNpb24oY29uc3QgY2hhciAqZXh0ZW5zaW9uLCBjb25zdCBjaGFyICpleHRlbnNpb25zKSB7 Ci0gIGNvbnN0IGNoYXIgKnN0YXJ0LCAqd2hlcmUsICp0ZXJtaW5hdG9yOwotICBzdGFydCA9IGV4 dGVuc2lvbnM7Ci0gIGZvciAoOzspIHsKLSAgICB3aGVyZSA9IChjaGFyICopc3Ryc3RyKChjb25z dCBjaGFyICopc3RhcnQsIGV4dGVuc2lvbik7Ci0gICAgaWYgKCF3aGVyZSkKLSAgICAgIGJyZWFr OwotICAgIHRlcm1pbmF0b3IgPSB3aGVyZSArIHN0cmxlbihleHRlbnNpb24pOwotICAgIGlmICh3 aGVyZSA9PSBzdGFydCB8fCAqKHdoZXJlIC0gMSkgPT0gJyAnKQotICAgICAgaWYgKCp0ZXJtaW5h dG9yID09ICcgJyB8fCAqdGVybWluYXRvciA9PSAnXDAnKQotICAgICAgICByZXR1cm4gdHJ1ZTsK LSAgICBzdGFydCA9IHRlcm1pbmF0b3I7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQg R0xXb3JrZXJDb21wb3NpdG9yOjpCZWdpbkNvbnRleHQoKSB7Ci0gIHByaXZhdGVfLnNhdmVkX2Vn bF9kaXNwbGF5ID0gZWdsR2V0Q3VycmVudERpc3BsYXkoKTsKLSAgcHJpdmF0ZV8uc2F2ZWRfZWds X2N0eCA9IGVnbEdldEN1cnJlbnRDb250ZXh0KCk7Ci0KLSAgaWYgKHByaXZhdGVfLnNhdmVkX2Vn bF9kaXNwbGF5ICE9IGVnbF9kaXNwbGF5XyB8fAotICAgICAgcHJpdmF0ZV8uc2F2ZWRfZWdsX2N0 eCAhPSBlZ2xfY3R4XykgewotICAgIHByaXZhdGVfLnNhdmVkX2VnbF9yZWFkID0gZWdsR2V0Q3Vy cmVudFN1cmZhY2UoRUdMX1JFQUQpOwotICAgIHByaXZhdGVfLnNhdmVkX2VnbF9kcmF3ID0gZWds R2V0Q3VycmVudFN1cmZhY2UoRUdMX0RSQVcpOwotICB9IGVsc2UgewotICAgIHJldHVybiAwOwot ICB9Ci0KLSAgaWYgKCFlZ2xNYWtlQ3VycmVudChlZ2xfZGlzcGxheV8sIEVHTF9OT19TVVJGQUNF LCBFR0xfTk9fU1VSRkFDRSwgZWdsX2N0eF8pKSB7Ci0gICAgQUxPR0UoIkJlZ2luQ29udGV4dCBm YWlsZWQ6ICVzIiwgR2V0RUdMRXJyb3IoKSk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgcmV0dXJu IDA7Ci19Ci0KLWludCBHTFdvcmtlckNvbXBvc2l0b3I6OkVuZENvbnRleHQoKSB7Ci0gIGlmIChw cml2YXRlXy5zYXZlZF9lZ2xfZGlzcGxheSAhPSBlZ2xHZXRDdXJyZW50RGlzcGxheSgpIHx8Ci0g ICAgICBwcml2YXRlXy5zYXZlZF9lZ2xfY3R4ICE9IGVnbEdldEN1cnJlbnRDb250ZXh0KCkpIHsK LSAgICBpZiAoIWVnbE1ha2VDdXJyZW50KHByaXZhdGVfLnNhdmVkX2VnbF9kaXNwbGF5LCBwcml2 YXRlXy5zYXZlZF9lZ2xfcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGVfLnNh dmVkX2VnbF9kcmF3LCBwcml2YXRlXy5zYXZlZF9lZ2xfY3R4KSkgewotICAgICAgQUxPR0UoIkVu ZENvbnRleHQgZmFpbGVkOiAlcyIsIEdldEVHTEVycm9yKCkpOwotICAgICAgcmV0dXJuIDE7Ci0g ICAgfQotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBBdXRvR0xTaGFkZXIgQ29tcGls ZUFuZENoZWNrU2hhZGVyKEdMZW51bSB0eXBlLCB1bnNpZ25lZCBzb3VyY2VfY291bnQsCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGNoYXIgKipzb3Vy Y2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3Ry aW5nc3RyZWFtICpzaGFkZXJfbG9nKSB7Ci0gIEdMaW50IHN0YXR1czsKLSAgQXV0b0dMU2hhZGVy IHNoYWRlcihnbENyZWF0ZVNoYWRlcih0eXBlKSk7Ci0gIGlmIChzaGFkZXIuZ2V0KCkgPT0gMCkg ewotICAgIGlmIChzaGFkZXJfbG9nKQotICAgICAgKnNoYWRlcl9sb2cgPDwgIkZhaWxlZCBnbENy ZWF0ZVNoYWRlciBjYWxsIjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGdsU2hhZGVyU291cmNl KHNoYWRlci5nZXQoKSwgc291cmNlX2NvdW50LCBzb3VyY2VzLCBOVUxMKTsKLSAgZ2xDb21waWxl U2hhZGVyKHNoYWRlci5nZXQoKSk7Ci0gIGdsR2V0U2hhZGVyaXYoc2hhZGVyLmdldCgpLCBHTF9D T01QSUxFX1NUQVRVUywgJnN0YXR1cyk7Ci0gIGlmICghc3RhdHVzKSB7Ci0gICAgaWYgKHNoYWRl cl9sb2cpIHsKLSAgICAgIEdMaW50IGxvZ19sZW5ndGg7Ci0gICAgICBnbEdldFNoYWRlcml2KHNo YWRlci5nZXQoKSwgR0xfSU5GT19MT0dfTEVOR1RILCAmbG9nX2xlbmd0aCk7Ci0gICAgICBzdGQ6 OnN0cmluZyBpbmZvX2xvZyhsb2dfbGVuZ3RoLCAnICcpOwotICAgICAgZ2xHZXRTaGFkZXJJbmZv TG9nKHNoYWRlci5nZXQoKSwgbG9nX2xlbmd0aCwgTlVMTCwgJmluZm9fbG9nLmZyb250KCkpOwot ICAgICAgKnNoYWRlcl9sb2cgPDwgIkZhaWxlZCB0byBjb21waWxlIHNoYWRlcjpcbiIgPDwgaW5m b19sb2cuY19zdHIoKQotICAgICAgICAgICAgICAgICAgPDwgIlxuU2hhZGVyIFNvdXJjZTpcbiI7 Ci0gICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc291cmNlX2NvdW50OyBpKyspIHsKLSAg ICAgICAgKnNoYWRlcl9sb2cgPDwgc291cmNlc1tpXTsKLSAgICAgIH0KLSAgICAgICpzaGFkZXJf bG9nIDw8ICJcbiI7Ci0gICAgfQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIHNoYWRl cjsKLX0KLQotc3RhdGljIHN0ZDo6c3RyaW5nIEdlbmVyYXRlVmVydGV4U2hhZGVyKGludCBsYXll cl9jb3VudCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gdmVydGV4X3NoYWRlcl9zdHJlYW07Ci0g IHZlcnRleF9zaGFkZXJfc3RyZWFtCi0gICAgICA8PCAiI3ZlcnNpb24gMzAwIGVzXG4iCi0gICAg ICA8PCAiI2RlZmluZSBMQVlFUl9DT1VOVCAiIDw8IGxheWVyX2NvdW50IDw8ICJcbiIKLSAgICAg IDw8ICJwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG4iCi0gICAgICA8PCAidW5pZm9ybSB2ZWM0IHVW aWV3cG9ydDtcbiIKLSAgICAgIDw8ICJ1bmlmb3JtIHZlYzQgdUxheWVyQ3JvcFtMQVlFUl9DT1VO VF07XG4iCi0gICAgICA8PCAidW5pZm9ybSBtYXQyIHVUZXhNYXRyaXhbTEFZRVJfQ09VTlRdO1xu IgotICAgICAgPDwgImluIHZlYzIgdlBvc2l0aW9uO1xuIgotICAgICAgPDwgImluIHZlYzIgdlRl eENvb3JkcztcbiIKLSAgICAgIDw8ICJvdXQgdmVjMiBmVGV4Q29vcmRzW0xBWUVSX0NPVU5UXTtc biIKLSAgICAgIDw8ICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgICA8PCAiICBmb3IgKGludCBpID0g MDsgaSA8IExBWUVSX0NPVU5UOyBpKyspIHtcbiIKLSAgICAgIDw8ICIgICAgdmVjMiB0ZW1wQ29v cmRzID0gdlRleENvb3JkcyAqIHVUZXhNYXRyaXhbaV07XG4iCi0gICAgICA8PCAiICAgIGZUZXhD b29yZHNbaV0gPVxuIgotICAgICAgPDwgIiAgICAgICAgdUxheWVyQ3JvcFtpXS54eSArIHRlbXBD b29yZHMgKiB1TGF5ZXJDcm9wW2ldLnp3O1xuIgotICAgICAgPDwgIiAgfVxuIgotICAgICAgPDwg IiAgdmVjMiBzY2FsZWRQb3NpdGlvbiA9IHVWaWV3cG9ydC54eSArIHZQb3NpdGlvbiAqIHVWaWV3 cG9ydC56dztcbiIKLSAgICAgIDw8ICIgIGdsX1Bvc2l0aW9uID1cbiIKLSAgICAgIDw8ICIgICAg ICB2ZWM0KHNjYWxlZFBvc2l0aW9uICogdmVjMigyLjApIC0gdmVjMigxLjApLCAwLjAsIDEuMCk7 XG4iCi0gICAgICA8PCAifVxuIjsKLSAgcmV0dXJuIHZlcnRleF9zaGFkZXJfc3RyZWFtLnN0cigp OwotfQotCi1zdGF0aWMgc3RkOjpzdHJpbmcgR2VuZXJhdGVGcmFnbWVudFNoYWRlcihpbnQgbGF5 ZXJfY291bnQpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGZyYWdtZW50X3NoYWRlcl9zdHJlYW07 Ci0gIGZyYWdtZW50X3NoYWRlcl9zdHJlYW0gPDwgIiN2ZXJzaW9uIDMwMCBlc1xuIgotICAgICAg ICAgICAgICAgICAgICAgICAgIDw8ICIjZGVmaW5lIExBWUVSX0NPVU5UICIgPDwgbGF5ZXJfY291 bnQgPDwgIlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIjZXh0ZW5zaW9uIEdMX09F U19FR0xfaW1hZ2VfZXh0ZXJuYWwgOiByZXF1aXJlXG4iCi0gICAgICAgICAgICAgICAgICAgICAg ICAgPDwgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIjsKLSAgZm9yIChpbnQgaSA9IDA7IGkg PCBsYXllcl9jb3VudDsgKytpKSB7Ci0gICAgZnJhZ21lbnRfc2hhZGVyX3N0cmVhbSA8PCAidW5p Zm9ybSBzYW1wbGVyRXh0ZXJuYWxPRVMgdUxheWVyVGV4dHVyZSIgPDwgaQotICAgICAgICAgICAg ICAgICAgICAgICAgICAgPDwgIjtcbiI7Ci0gIH0KLSAgZnJhZ21lbnRfc2hhZGVyX3N0cmVhbSA8 PCAidW5pZm9ybSBmbG9hdCB1TGF5ZXJBbHBoYVtMQVlFUl9DT1VOVF07XG4iCi0gICAgICAgICAg ICAgICAgICAgICAgICAgPDwgInVuaWZvcm0gZmxvYXQgdUxheWVyUHJlbXVsdFtMQVlFUl9DT1VO VF07XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgImluIHZlYzIgZlRleENvb3Jkc1tM QVlFUl9DT1VOVF07XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIm91dCB2ZWM0IG9G cmFnQ29sb3I7XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgInZvaWQgbWFpbigpIHtc biIKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICB2ZWMzIGNvbG9yID0gdmVjMygwLjAs IDAuMCwgMC4wKTtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICBmbG9hdCBhbHBo YUNvdmVyID0gMS4wO1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIHZlYzQgdGV4 U2FtcGxlO1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIHZlYzMgbXVsdFJnYjtc biI7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbGF5ZXJfY291bnQ7ICsraSkgewotICAgIGlmIChp ID4gMCkKLSAgICAgIGZyYWdtZW50X3NoYWRlcl9zdHJlYW0gPDwgIiAgaWYgKGFscGhhQ292ZXIg PiAwLjUvMjU1LjApIHtcbiI7Ci0gICAgLy8gY2xhbmctZm9ybWF0IG9mZgotICAgIGZyYWdtZW50 X3NoYWRlcl9zdHJlYW0KLSAgICAgICAgPDwgIiAgdGV4U2FtcGxlID0gdGV4dHVyZTJEKHVMYXll clRleHR1cmUiIDw8IGkgPDwgIixcbiIKLSAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAg ICAgIGZUZXhDb29yZHNbIiA8PCBpIDw8ICJdKTtcbiIKLSAgICAgICAgPDwgIiAgbXVsdFJnYiA9 IHRleFNhbXBsZS5yZ2IgKlxuIgotICAgICAgICA8PCAiICAgICAgICAgICAgbWF4KHRleFNhbXBs ZS5hLCB1TGF5ZXJQcmVtdWx0WyIgPDwgaSA8PCAiXSk7XG4iCi0gICAgICAgIDw8ICIgIGNvbG9y ICs9IG11bHRSZ2IgKiB1TGF5ZXJBbHBoYVsiIDw8IGkgPDwgIl0gKiBhbHBoYUNvdmVyO1xuIgot ICAgICAgICA8PCAiICBhbHBoYUNvdmVyICo9IDEuMCAtIHRleFNhbXBsZS5hICogdUxheWVyQWxw aGFbIiA8PCBpIDw8ICJdO1xuIjsKLSAgICAvLyBjbGFuZy1mb3JtYXQgb24KLSAgfQotICBmb3Ig KGludCBpID0gMDsgaSA8IGxheWVyX2NvdW50IC0gMTsgKytpKQotICAgIGZyYWdtZW50X3NoYWRl cl9zdHJlYW0gPDwgIiAgfVxuIjsKLSAgZnJhZ21lbnRfc2hhZGVyX3N0cmVhbSA8PCAiICBvRnJh Z0NvbG9yID0gdmVjNChjb2xvciwgMS4wIC0gYWxwaGFDb3Zlcik7XG4iCi0gICAgICAgICAgICAg ICAgICAgICAgICAgPDwgIn1cbiI7Ci0gIHJldHVybiBmcmFnbWVudF9zaGFkZXJfc3RyZWFtLnN0 cigpOwotfQotCi1zdGF0aWMgQXV0b0dMUHJvZ3JhbSBHZW5lcmF0ZVByb2dyYW0odW5zaWduZWQg bnVtX3RleHR1cmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6 b3N0cmluZ3N0cmVhbSAqc2hhZGVyX2xvZykgewotICBzdGQ6OnN0cmluZyB2ZXJ0ZXhfc2hhZGVy X3N0cmluZyA9IEdlbmVyYXRlVmVydGV4U2hhZGVyKG51bV90ZXh0dXJlcyk7Ci0gIGNvbnN0IEdM Y2hhciAqdmVydGV4X3NoYWRlcl9zb3VyY2UgPSB2ZXJ0ZXhfc2hhZGVyX3N0cmluZy5jX3N0cigp OwotICBBdXRvR0xTaGFkZXIgdmVydGV4X3NoYWRlciA9IENvbXBpbGVBbmRDaGVja1NoYWRlcigK LSAgICAgIEdMX1ZFUlRFWF9TSEFERVIsIDEsICZ2ZXJ0ZXhfc2hhZGVyX3NvdXJjZSwgc2hhZGVy X2xvZyk7Ci0gIGlmICghdmVydGV4X3NoYWRlci5nZXQoKSkKLSAgICByZXR1cm4gMDsKLQotICBz dGQ6OnN0cmluZyBmcmFnbWVudF9zaGFkZXJfc3RyaW5nID0gR2VuZXJhdGVGcmFnbWVudFNoYWRl cihudW1fdGV4dHVyZXMpOwotICBjb25zdCBHTGNoYXIgKmZyYWdtZW50X3NoYWRlcl9zb3VyY2Ug PSBmcmFnbWVudF9zaGFkZXJfc3RyaW5nLmNfc3RyKCk7Ci0gIEF1dG9HTFNoYWRlciBmcmFnbWVu dF9zaGFkZXIgPSBDb21waWxlQW5kQ2hlY2tTaGFkZXIoCi0gICAgICBHTF9GUkFHTUVOVF9TSEFE RVIsIDEsICZmcmFnbWVudF9zaGFkZXJfc291cmNlLCBzaGFkZXJfbG9nKTsKLSAgaWYgKCFmcmFn bWVudF9zaGFkZXIuZ2V0KCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgQXV0b0dMUHJvZ3JhbSBwcm9n cmFtKGdsQ3JlYXRlUHJvZ3JhbSgpKTsKLSAgaWYgKCFwcm9ncmFtLmdldCgpKSB7Ci0gICAgaWYg KHNoYWRlcl9sb2cpCi0gICAgICAqc2hhZGVyX2xvZyA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBwcm9n cmFtOiAiIDw8IEdldEdMRXJyb3IoKSA8PCAiXG4iOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAg Z2xBdHRhY2hTaGFkZXIocHJvZ3JhbS5nZXQoKSwgdmVydGV4X3NoYWRlci5nZXQoKSk7Ci0gIGds QXR0YWNoU2hhZGVyKHByb2dyYW0uZ2V0KCksIGZyYWdtZW50X3NoYWRlci5nZXQoKSk7Ci0gIGds QmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0uZ2V0KCksIDAsICJ2UG9zaXRpb24iKTsKLSAgZ2xC aW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbS5nZXQoKSwgMSwgInZUZXhDb29yZHMiKTsKLSAgZ2xM aW5rUHJvZ3JhbShwcm9ncmFtLmdldCgpKTsKLSAgZ2xEZXRhY2hTaGFkZXIocHJvZ3JhbS5nZXQo KSwgdmVydGV4X3NoYWRlci5nZXQoKSk7Ci0gIGdsRGV0YWNoU2hhZGVyKHByb2dyYW0uZ2V0KCks IGZyYWdtZW50X3NoYWRlci5nZXQoKSk7Ci0KLSAgR0xpbnQgc3RhdHVzOwotICBnbEdldFByb2dy YW1pdihwcm9ncmFtLmdldCgpLCBHTF9MSU5LX1NUQVRVUywgJnN0YXR1cyk7Ci0gIGlmICghc3Rh dHVzKSB7Ci0gICAgaWYgKHNoYWRlcl9sb2cpIHsKLSAgICAgIEdMaW50IGxvZ19sZW5ndGg7Ci0g ICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLmdldCgpLCBHTF9JTkZPX0xPR19MRU5HVEgsICZs b2dfbGVuZ3RoKTsKLSAgICAgIHN0ZDo6c3RyaW5nIHByb2dyYW1fbG9nKGxvZ19sZW5ndGgsICcg Jyk7Ci0gICAgICBnbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0uZ2V0KCksIGxvZ19sZW5ndGgs IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9ncmFtX2xvZy5mcm9udCgpKTsK LSAgICAgICpzaGFkZXJfbG9nIDw8ICJGYWlsZWQgdG8gbGluayBwcm9ncmFtOlxuIiA8PCBwcm9n cmFtX2xvZy5jX3N0cigpIDw8ICJcbiI7Ci0gICAgfQotICAgIHJldHVybiAwOwotICB9Ci0KLSAg cmV0dXJuIHByb2dyYW07Ci19Ci0KLXN0cnVjdCBSZW5kZXJpbmdDb21tYW5kIHsKLSAgc3RydWN0 IFRleHR1cmVTb3VyY2UgewotICAgIHVuc2lnbmVkIHRleHR1cmVfaW5kZXg7Ci0gICAgZmxvYXQg Y3JvcF9ib3VuZHNbNF07Ci0gICAgZmxvYXQgYWxwaGE7Ci0gICAgZmxvYXQgcHJlbXVsdDsKLSAg ICBmbG9hdCB0ZXh0dXJlX21hdHJpeFs0XTsKLSAgfTsKLQotICBmbG9hdCBib3VuZHNbNF07Ci0g IHVuc2lnbmVkIHRleHR1cmVfY291bnQgPSAwOwotICBUZXh0dXJlU291cmNlIHRleHR1cmVzW01B WF9PVkVSTEFQUElOR19MQVlFUlNdOwotfTsKLQotc3RhdGljIHZvaWQgQ29uc3RydWN0Q29tbWFu ZChjb25zdCBEcm1Id2NMYXllciAqbGF5ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjb25zdCBEcm1Db21wb3NpdGlvblJlZ2lvbiAmcmVnaW9uLAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBSZW5kZXJpbmdDb21tYW5kICZjbWQpIHsKLSAgc3RkOjpjb3B5X24ocmVnaW9u LmZyYW1lLmJvdW5kcywgNCwgY21kLmJvdW5kcyk7Ci0KLSAgZm9yIChzaXplX3QgdGV4dHVyZV9p bmRleCA6IHJlZ2lvbi5zb3VyY2VfbGF5ZXJzKSB7Ci0gICAgY29uc3QgRHJtSHdjTGF5ZXIgJmxh eWVyID0gbGF5ZXJzW3RleHR1cmVfaW5kZXhdOwotCi0gICAgRHJtSHdjUmVjdDxmbG9hdD4gZGlz cGxheV9yZWN0KGxheWVyLmRpc3BsYXlfZnJhbWUpOwotICAgIGZsb2F0IGRpc3BsYXlfc2l6ZVsy XSA9IHtkaXNwbGF5X3JlY3QuYm91bmRzWzJdIC0gZGlzcGxheV9yZWN0LmJvdW5kc1swXSwKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9yZWN0LmJvdW5kc1szXSAtIGRpc3Bs YXlfcmVjdC5ib3VuZHNbMV19OwotCi0gICAgZmxvYXQgdGV4X3dpZHRoID0gbGF5ZXIuYnVmZmVy LT53aWR0aDsKLSAgICBmbG9hdCB0ZXhfaGVpZ2h0ID0gbGF5ZXIuYnVmZmVyLT5oZWlnaHQ7Ci0g ICAgRHJtSHdjUmVjdDxmbG9hdD4gY3JvcF9yZWN0KGxheWVyLnNvdXJjZV9jcm9wLmxlZnQgLyB0 ZXhfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnNvdXJjZV9j cm9wLnRvcCAvIHRleF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxh eWVyLnNvdXJjZV9jcm9wLnJpZ2h0IC8gdGV4X3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBsYXllci5zb3VyY2VfY3JvcC5ib3R0b20gLyB0ZXhfaGVpZ2h0KTsKLQotICAg IGZsb2F0IGNyb3Bfc2l6ZVsyXSA9IHtjcm9wX3JlY3QuYm91bmRzWzJdIC0gY3JvcF9yZWN0LmJv dW5kc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcF9yZWN0LmJvdW5kc1szXSAt IGNyb3BfcmVjdC5ib3VuZHNbMV19OwotCi0gICAgUmVuZGVyaW5nQ29tbWFuZDo6VGV4dHVyZVNv dXJjZSAmc3JjID0gY21kLnRleHR1cmVzW2NtZC50ZXh0dXJlX2NvdW50XTsKLSAgICBjbWQudGV4 dHVyZV9jb3VudCsrOwotICAgIHNyYy50ZXh0dXJlX2luZGV4ID0gdGV4dHVyZV9pbmRleDsKLQot ICAgIGJvb2wgc3dhcF94eSA9IGZhbHNlOwotICAgIGJvb2wgZmxpcF94eVsyXSA9IHsgZmFsc2Us IGZhbHNlIH07Ci0KLSAgICBpZiAobGF5ZXIudHJhbnNmb3JtID09IERybUh3Y1RyYW5zZm9ybTo6 a1JvdGF0ZTE4MCkgewotICAgICAgc3dhcF94eSA9IGZhbHNlOwotICAgICAgZmxpcF94eVswXSA9 IHRydWU7Ci0gICAgICBmbGlwX3h5WzFdID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKGxheWVyLnRy YW5zZm9ybSA9PSBEcm1Id2NUcmFuc2Zvcm06OmtSb3RhdGUyNzApIHsKLSAgICAgIHN3YXBfeHkg PSB0cnVlOwotICAgICAgZmxpcF94eVswXSA9IHRydWU7Ci0gICAgICBmbGlwX3h5WzFdID0gZmFs c2U7Ci0gICAgfSBlbHNlIGlmIChsYXllci50cmFuc2Zvcm0gJiBEcm1Id2NUcmFuc2Zvcm06OmtS b3RhdGU5MCkgewotICAgICAgc3dhcF94eSA9IHRydWU7Ci0gICAgICBpZiAobGF5ZXIudHJhbnNm b3JtICYgRHJtSHdjVHJhbnNmb3JtOjprRmxpcEgpIHsKLSAgICAgICAgZmxpcF94eVswXSA9IHRy dWU7Ci0gICAgICAgIGZsaXBfeHlbMV0gPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChsYXllci50 cmFuc2Zvcm0gJiBEcm1Id2NUcmFuc2Zvcm06OmtGbGlwVikgewotICAgICAgICBmbGlwX3h5WzBd ID0gZmFsc2U7Ci0gICAgICAgIGZsaXBfeHlbMV0gPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0g ICAgICAgIGZsaXBfeHlbMF0gPSBmYWxzZTsKLSAgICAgICAgZmxpcF94eVsxXSA9IHRydWU7Ci0g ICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChsYXllci50cmFuc2Zvcm0gJiBEcm1Id2NU cmFuc2Zvcm06OmtGbGlwSCkKLSAgICAgICAgZmxpcF94eVswXSA9IHRydWU7Ci0gICAgICBpZiAo bGF5ZXIudHJhbnNmb3JtICYgRHJtSHdjVHJhbnNmb3JtOjprRmxpcFYpCi0gICAgICAgIGZsaXBf eHlbMV0gPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChzd2FwX3h5KQotICAgICAgc3RkOjpjb3B5 X24oJmtUZXh0dXJlVHJhbnNmb3JtTWF0cmljZXNbNF0sIDQsIHNyYy50ZXh0dXJlX21hdHJpeCk7 Ci0gICAgZWxzZQotICAgICAgc3RkOjpjb3B5X24oJmtUZXh0dXJlVHJhbnNmb3JtTWF0cmljZXNb MF0sIDQsIHNyYy50ZXh0dXJlX21hdHJpeCk7Ci0KLSAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7 IGorKykgewotICAgICAgaW50IGIgPSBqIF4gKHN3YXBfeHkgPyAxIDogMCk7Ci0gICAgICBmbG9h dCBib3VuZF9wZXJjZW50ID0KLSAgICAgICAgICAoY21kLmJvdW5kc1tiXSAtIGRpc3BsYXlfcmVj dC5ib3VuZHNbYiAlIDJdKSAvIGRpc3BsYXlfc2l6ZVtiICUgMl07Ci0gICAgICBpZiAoZmxpcF94 eVtqICUgMl0pIHsKLSAgICAgICAgc3JjLmNyb3BfYm91bmRzW2pdID0KLSAgICAgICAgICAgIGNy b3BfcmVjdC5ib3VuZHNbaiAlIDIgKyAyXSAtIGJvdW5kX3BlcmNlbnQgKiBjcm9wX3NpemVbaiAl IDJdOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3JjLmNyb3BfYm91bmRzW2pdID0KLSAgICAg ICAgICAgIGNyb3BfcmVjdC5ib3VuZHNbaiAlIDJdICsgYm91bmRfcGVyY2VudCAqIGNyb3Bfc2l6 ZVtqICUgMl07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGxheWVyLmJsZW5kaW5nID09IERy bUh3Y0JsZW5kaW5nOjprTm9uZSkgewotICAgICAgc3JjLmFscGhhID0gc3JjLnByZW11bHQgPSAx LjBmOwotICAgICAgLy8gVGhpcyBsYXllciBpcyBvcGFxdWUuIFRoZXJlIGlzIG5vIHBvaW50IGlu IHVzaW5nIGxheWVycyBiZWxvdyB0aGlzIG9uZS4KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAg IHNyYy5hbHBoYSA9IGxheWVyLmFscGhhIC8gMjU1LjBmOwotICAgIHNyYy5wcmVtdWx0ID0gKGxh eWVyLmJsZW5kaW5nID09IERybUh3Y0JsZW5kaW5nOjprUHJlTXVsdCkgPyAxLjBmIDogMC4wZjsK LSAgfQotfQotCi1zdGF0aWMgaW50IEVHTEZlbmNlV2FpdChFR0xEaXNwbGF5IGVnbF9kaXNwbGF5 LCBpbnQgYWNxdWlyZUZlbmNlRmQpIHsKLSAgaW50IHJldCA9IDA7Ci0KLSAgRUdMaW50IGF0dHJp YnNbXSA9IHtFR0xfU1lOQ19OQVRJVkVfRkVOQ0VfRkRfQU5EUk9JRCwgYWNxdWlyZUZlbmNlRmQs Ci0gICAgICAgICAgICAgICAgICAgICAgRUdMX05PTkV9OwotICBFR0xTeW5jS0hSIGVnbF9zeW5j ID0KLSAgICAgIGVnbENyZWF0ZVN5bmNLSFIoZWdsX2Rpc3BsYXksIEVHTF9TWU5DX05BVElWRV9G RU5DRV9BTkRST0lELCBhdHRyaWJzKTsKLSAgaWYgKGVnbF9zeW5jID09IEVHTF9OT19TWU5DX0tI UikgewotICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFrZSBFR0xTeW5jS0hSIGZyb20gYWNxdWlyZUZl bmNlRmQ6ICVzIiwgR2V0RUdMRXJyb3IoKSk7Ci0gICAgY2xvc2UoYWNxdWlyZUZlbmNlRmQpOwot ICAgIHJldHVybiAxOwotICB9Ci0KLSAgRUdMaW50IHN1Y2Nlc3MgPSBlZ2xXYWl0U3luY0tIUihl Z2xfZGlzcGxheSwgZWdsX3N5bmMsIDApOwotICBpZiAoc3VjY2VzcyA9PSBFR0xfRkFMU0UpIHsK LSAgICBBTE9HRSgiRmFpbGVkIHRvIHdhaXQgZm9yIGFjcXVpcmU6ICVzIiwgR2V0RUdMRXJyb3Io KSk7Ci0gICAgcmV0ID0gMTsKLSAgfQotICBlZ2xEZXN0cm95U3luY0tIUihlZ2xfZGlzcGxheSwg ZWdsX3N5bmMpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgQ3JlYXRlVGV4dHVy ZUZyb21IYW5kbGUoRUdMRGlzcGxheSBlZ2xfZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgSW1wb3J0ZXIgKmltcG9ydGVyLAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBBdXRvRUdMSW1hZ2VBbmRHTFRleHR1cmUgKm91dCkgewotICBFR0xJ bWFnZUtIUiBpbWFnZSA9IGltcG9ydGVyLT5JbXBvcnRJbWFnZShlZ2xfZGlzcGxheSwgaGFuZGxl KTsKLQotICBpZiAoaW1hZ2UgPT0gRUdMX05PX0lNQUdFX0tIUikgewotICAgIEFMT0dFKCJGYWls ZWQgdG8gbWFrZSBpbWFnZSAlcyAlcCIsIEdldEVHTEVycm9yKCksIGhhbmRsZSk7Ci0gICAgcmV0 dXJuIC1FSU5WQUw7Ci0gIH0KLQotICBHTHVpbnQgdGV4dHVyZTsKLSAgZ2xHZW5UZXh0dXJlcygx LCAmdGV4dHVyZSk7Ci0gIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIHRl eHR1cmUpOwotICBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTKEdMX1RFWFRVUkVfRVhURVJO QUxfT0VTLCAoR0xlZ2xJbWFnZU9FUylpbWFnZSk7Ci0gIGdsVGV4UGFyYW1ldGVyaShHTF9URVhU VVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwotICBn bFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfTUlOX0ZJ TFRFUiwgR0xfTElORUFSKTsKLSAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfRVhURVJOQUxf T0VTLCBHTF9URVhUVVJFX1dSQVBfUywgR0xfUkVQRUFUKTsKLSAgZ2xUZXhQYXJhbWV0ZXJpKEdM X1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKLSAg Z2xCaW5kVGV4dHVyZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgMCk7Ci0KLSAgb3V0LT5pbWFn ZS5yZXNldChlZ2xfZGlzcGxheSwgaW1hZ2UpOwotICBvdXQtPnRleHR1cmUucmVzZXQodGV4dHVy ZSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLUdMV29ya2VyQ29tcG9zaXRvcjo6R0xXb3JrZXJDb21w b3NpdG9yKCkKLSAgICA6IGVnbF9kaXNwbGF5XyhFR0xfTk9fRElTUExBWSksIGVnbF9jdHhfKEVH TF9OT19DT05URVhUKSB7Ci19Ci0KLWludCBHTFdvcmtlckNvbXBvc2l0b3I6OkluaXQoKSB7Ci0g IGludCByZXQgPSAwOwotICBjb25zdCBjaGFyICplZ2xfZXh0ZW5zaW9uczsKLSAgY29uc3QgY2hh ciAqZ2xfZXh0ZW5zaW9uczsKLSAgRUdMaW50IG51bV9jb25maWdzOwotICBFR0xDb25maWcgZWds X2NvbmZpZzsKLQotICAvLyBjbGFuZy1mb3JtYXQgb2ZmCi0gIGNvbnN0IEdMZmxvYXQgdmVydHNb XSA9IHsKLSAgICAwLjBmLCAgMC4wZiwgICAgMC4wZiwgMC4wZiwKLSAgICAwLjBmLCAgMi4wZiwg ICAgMC4wZiwgMi4wZiwKLSAgICAyLjBmLCAgMC4wZiwgICAgMi4wZiwgMC4wZgotICB9OwotICAv LyBjbGFuZy1mb3JtYXQgb24KLQotICBjb25zdCBFR0xpbnQgY29uZmlnX2F0dHJpYnNbXSA9IHtF R0xfUkVOREVSQUJMRV9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBF R0xfT1BFTkdMX0VTMl9CSVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVH TF9SRURfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX0dSRUVOX1NJWkUsCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIEVHTF9CTFVFX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9OT05FfTsKLQotICBj b25zdCBFR0xpbnQgY29udGV4dF9hdHRyaWJzW10gPSB7RUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJ T04sIDMsIEVHTF9OT05FfTsKLQotICBlZ2xfZGlzcGxheV8gPSBlZ2xHZXREaXNwbGF5KEVHTF9E RUZBVUxUX0RJU1BMQVkpOwotICBpZiAoZWdsX2Rpc3BsYXlfID09IEVHTF9OT19ESVNQTEFZKSB7 Ci0gICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgZWdsIGRpc3BsYXkiKTsKLSAgICByZXR1cm4gMTsK LSAgfQotCi0gIGlmICghZWdsSW5pdGlhbGl6ZShlZ2xfZGlzcGxheV8sIE5VTEwsIE5VTEwpKSB7 Ci0gICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVnbDogJXMiLCBHZXRFR0xFcnJvcigp KTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGVnbF9leHRlbnNpb25zID0gZWdsUXVlcnlTdHJp bmcoZWdsX2Rpc3BsYXlfLCBFR0xfRVhURU5TSU9OUyk7Ci0KLSAgLy8gVGhlc2UgZXh0ZW5zaW9u cyBhcmUgYWxsIHRlY2huaWNhbGx5IHJlcXVpcmVkIGJ1dCBub3QgYWx3YXlzIHJlcG9ydGVkIGR1 ZQotICAvLyB0byBtZXRhIEVHTCBmaWx0ZXJpbmcgdGhlbSBvdXQuCi0gIGlmICghSGFzRXh0ZW5z aW9uKCJFR0xfS0hSX2ltYWdlX2Jhc2UiLCBlZ2xfZXh0ZW5zaW9ucykpCi0gICAgQUxPR1coIkVH TF9LSFJfaW1hZ2VfYmFzZSBleHRlbnNpb24gbm90IHN1cHBvcnRlZCIpOwotCi0gIGlmICghSGFz RXh0ZW5zaW9uKCJFR0xfQU5EUk9JRF9pbWFnZV9uYXRpdmVfYnVmZmVyIiwgZWdsX2V4dGVuc2lv bnMpKQotICAgIEFMT0dXKCJFR0xfQU5EUk9JRF9pbWFnZV9uYXRpdmVfYnVmZmVyIGV4dGVuc2lv biBub3Qgc3VwcG9ydGVkIik7Ci0KLSAgaWYgKCFIYXNFeHRlbnNpb24oIkVHTF9BTkRST0lEX25h dGl2ZV9mZW5jZV9zeW5jIiwgZWdsX2V4dGVuc2lvbnMpKQotICAgIEFMT0dXKCJFR0xfQU5EUk9J RF9uYXRpdmVfZmVuY2Vfc3luYyBleHRlbnNpb24gbm90IHN1cHBvcnRlZCIpOwotCi0gIGlmICgh ZWdsQ2hvb3NlQ29uZmlnKGVnbF9kaXNwbGF5XywgY29uZmlnX2F0dHJpYnMsICZlZ2xfY29uZmln LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAmbnVtX2NvbmZpZ3MpKSB7Ci0gICAgQUxPR0Uo ImVnbENob29zZUNvbmZpZygpIGZhaWxlZCB3aXRoIGVycm9yOiAlcyIsIEdldEVHTEVycm9yKCkp OwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgZWdsX2N0eF8gPQotICAgICAgZWdsQ3JlYXRlQ29u dGV4dChlZ2xfZGlzcGxheV8sIGVnbF9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgIEVH TF9OT19DT05URVhUIC8qIE5vIHNoYXJlZCBjb250ZXh0ICovLCBjb250ZXh0X2F0dHJpYnMpOwot Ci0gIGlmIChlZ2xfY3R4XyA9PSBFR0xfTk9fQ09OVEVYVCkgewotICAgIEFMT0dFKCJGYWlsZWQg dG8gY3JlYXRlIE9wZW5HTCBFUyBDb250ZXh0OiAlcyIsIEdldEVHTEVycm9yKCkpOwotICAgIHJl dHVybiAxOwotICB9Ci0KLSAgcmV0ID0gQmVnaW5Db250ZXh0KCk7Ci0gIGlmIChyZXQpCi0gICAg cmV0dXJuIHJldDsKLQotICBnbF9leHRlbnNpb25zID0gKGNvbnN0IGNoYXIgKilnbEdldFN0cmlu ZyhHTF9FWFRFTlNJT05TKTsKLQotICBpZiAoIUhhc0V4dGVuc2lvbigiR0xfT0VTX0VHTF9pbWFn ZSIsIGdsX2V4dGVuc2lvbnMpKQotICAgIEFMT0dXKCJHTF9PRVNfRUdMX2ltYWdlIGV4dGVuc2lv biBub3Qgc3VwcG9ydGVkIik7Ci0KLSAgaWYgKCFIYXNFeHRlbnNpb24oIkdMX09FU19FR0xfaW1h Z2VfZXh0ZXJuYWwiLCBnbF9leHRlbnNpb25zKSkKLSAgICBBTE9HVygiR0xfT0VTX0VHTF9pbWFn ZV9leHRlcm5hbCBleHRlbnNpb24gbm90IHN1cHBvcnRlZCIpOwotCi0gIEdMdWludCB2ZXJ0ZXhf YnVmZmVyOwotICBnbEdlbkJ1ZmZlcnMoMSwgJnZlcnRleF9idWZmZXIpOwotICBnbEJpbmRCdWZm ZXIoR0xfQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhfYnVmZmVyKTsKLSAgZ2xCdWZmZXJEYXRhKEdMX0FS UkFZX0JVRkZFUiwgc2l6ZW9mKHZlcnRzKSwgdmVydHMsIEdMX1NUQVRJQ19EUkFXKTsKLSAgZ2xC aW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgMCk7Ci0gIHZlcnRleF9idWZmZXJfLnJlc2V0KHZl cnRleF9idWZmZXIpOwotCi0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzaGFkZXJfbG9nOwotICBibGVu ZF9wcm9ncmFtc18uZW1wbGFjZV9iYWNrKEdlbmVyYXRlUHJvZ3JhbSgxLCAmc2hhZGVyX2xvZykp OwotCi0gIEVuZENvbnRleHQoKTsKLQotICBpZiAoYmxlbmRfcHJvZ3JhbXNfLmJhY2soKS5nZXQo KSA9PSAwKSB7Ci0gICAgQUxPR0UoIiVzIiwgc2hhZGVyX2xvZy5zdHIoKS5jX3N0cigpKTsKLSAg ICByZXR1cm4gMTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi1HTFdvcmtlckNvbXBvc2l0b3I6 On5HTFdvcmtlckNvbXBvc2l0b3IoKSB7Ci0gIGlmIChlZ2xfZGlzcGxheV8gIT0gRUdMX05PX0RJ U1BMQVkgJiYgZWdsX2N0eF8gIT0gRUdMX05PX0NPTlRFWFQpCi0gICAgaWYgKGVnbERlc3Ryb3lD b250ZXh0KGVnbF9kaXNwbGF5XywgZWdsX2N0eF8pID09IEVHTF9GQUxTRSkKLSAgICAgIEFMT0dF KCJGYWlsZWQgdG8gZGVzdHJveSBPcGVuR0wgRVMgQ29udGV4dDogJXMiLCBHZXRFR0xFcnJvcigp KTsKLX0KLQotaW50IEdMV29ya2VyQ29tcG9zaXRvcjo6Q29tcG9zaXRlKERybUh3Y0xheWVyICps YXllcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtQ29tcG9zaXRpb25S ZWdpb24gKnJlZ2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90 IG51bV9yZWdpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNw PEdyYXBoaWNCdWZmZXI+ICZmcmFtZWJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBJbXBvcnRlciAqaW1wb3J0ZXIpIHsKLSAgQVRSQUNFX0NBTEwoKTsKLSAgaW50IHJl dCA9IDA7Ci0gIHN0ZDo6dmVjdG9yPEF1dG9FR0xJbWFnZUFuZEdMVGV4dHVyZT4gbGF5ZXJfdGV4 dHVyZXM7Ci0gIHN0ZDo6dmVjdG9yPFJlbmRlcmluZ0NvbW1hbmQ+IGNvbW1hbmRzOwotCi0gIGlm IChudW1fcmVnaW9ucyA9PSAwKSB7Ci0gICAgcmV0dXJuIC1FQUxSRUFEWTsKLSAgfQotCi0gIHJl dCA9IEJlZ2luQ29udGV4dCgpOwotICBpZiAocmV0KQotICAgIHJldHVybiAtMTsKLQotICBHTGlu dCBmcmFtZV93aWR0aCA9IGZyYW1lYnVmZmVyLT5nZXRXaWR0aCgpOwotICBHTGludCBmcmFtZV9o ZWlnaHQgPSBmcmFtZWJ1ZmZlci0+Z2V0SGVpZ2h0KCk7Ci0gIENhY2hlZEZyYW1lYnVmZmVyICpj YWNoZWRfZnJhbWVidWZmZXIgPQotICAgICAgUHJlcGFyZUFuZENhY2hlRnJhbWVidWZmZXIoZnJh bWVidWZmZXIpOwotICBpZiAoY2FjaGVkX2ZyYW1lYnVmZmVyID09IE5VTEwpIHsKLSAgICBBTE9H RSgiQ29tcG9zaXRlIGZhaWxlZCBiZWNhdXNlIG9mIGZhaWxlZCBmcmFtZWJ1ZmZlciIpOwotICAg IEVuZENvbnRleHQoKTsKLSAgICByZXR1cm4gLUVJTlZBTDsKLSAgfQotCi0gIHN0ZDo6dW5vcmRl cmVkX3NldDxzaXplX3Q+IGxheWVyc191c2VkX2luZGljZXM7Ci0gIGZvciAoc2l6ZV90IHJlZ2lv bl9pbmRleCA9IDA7IHJlZ2lvbl9pbmRleCA8IG51bV9yZWdpb25zOyByZWdpb25faW5kZXgrKykg ewotICAgIERybUNvbXBvc2l0aW9uUmVnaW9uICZyZWdpb24gPSByZWdpb25zW3JlZ2lvbl9pbmRl eF07Ci0gICAgbGF5ZXJzX3VzZWRfaW5kaWNlcy5pbnNlcnQocmVnaW9uLnNvdXJjZV9sYXllcnMu YmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24uc291cmNlX2xh eWVycy5lbmQoKSk7Ci0gICAgY29tbWFuZHMuZW1wbGFjZV9iYWNrKCk7Ci0gICAgQ29uc3RydWN0 Q29tbWFuZChsYXllcnMsIHJlZ2lvbiwgY29tbWFuZHMuYmFjaygpKTsKLSAgfQotCi0gIGZvciAo c2l6ZV90IGxheWVyX2luZGV4ID0gMDsgbGF5ZXJfaW5kZXggPCBNQVhfT1ZFUkxBUFBJTkdfTEFZ RVJTOwotICAgICAgIGxheWVyX2luZGV4KyspIHsKLSAgICBEcm1Id2NMYXllciAqbGF5ZXIgPSAm bGF5ZXJzW2xheWVyX2luZGV4XTsKLQotICAgIGxheWVyX3RleHR1cmVzLmVtcGxhY2VfYmFjaygp OwotCi0gICAgaWYgKGxheWVyc191c2VkX2luZGljZXMuY291bnQobGF5ZXJfaW5kZXgpID09IDAp Ci0gICAgICBjb250aW51ZTsKLQotICAgIHJldCA9IENyZWF0ZVRleHR1cmVGcm9tSGFuZGxlKGVn bF9kaXNwbGF5XywgbGF5ZXItPmdldF91c2FibGVfaGFuZGxlKCksCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgaW1wb3J0ZXIsICZsYXllcl90ZXh0dXJlcy5iYWNrKCkpOwotCi0g ICAgaWYgKCFyZXQpIHsKLSAgICAgIHJldCA9IEVHTEZlbmNlV2FpdChlZ2xfZGlzcGxheV8sIGxh eWVyLT5hY3F1aXJlX2ZlbmNlLlJlbGVhc2UoKSk7Ci0gICAgfQotICAgIGlmIChyZXQpIHsKLSAg ICAgIGxheWVyX3RleHR1cmVzLnBvcF9iYWNrKCk7Ci0gICAgICByZXQgPSAtRUlOVkFMOwotICAg IH0KLSAgfQotCi0gIGlmIChyZXQpIHsKLSAgICBFbmRDb250ZXh0KCk7Ci0gICAgcmV0dXJuIHJl dDsKLSAgfQotCi0gIGdsVmlld3BvcnQoMCwgMCwgZnJhbWVfd2lkdGgsIGZyYW1lX2hlaWdodCk7 Ci0KLSAgZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOwotICBnbENsZWFyKEdM X0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIHZl cnRleF9idWZmZXJfLmdldCgpKTsKLSAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKDAsIDIsIEdMX0ZM T0FULCBHTF9GQUxTRSwgc2l6ZW9mKGZsb2F0KSAqIDQsIE5VTEwpOwotICBnbFZlcnRleEF0dHJp YlBvaW50ZXIoMSwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLCBzaXplb2YoZmxvYXQpICogNCwKLSAg ICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHNpemVvZihmbG9hdCkgKiAyKSk7Ci0gIGds RW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMCk7Ci0gIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXko MSk7Ci0gIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0KLSAgZm9yIChjb25zdCBSZW5kZXJp bmdDb21tYW5kICZjbWQgOiBjb21tYW5kcykgewotICAgIGlmIChjbWQudGV4dHVyZV9jb3VudCA9 PSAwKQotICAgICAgY29udGludWU7Ci0KLSAgICAvLyBUT0RPKHphY2hyKTogaGFuZGxlIHRoZSBj YXNlIG9mIHRvbyBtYW55IG92ZXJsYXBwaW5nIHRleHR1cmVzIGZvciBvbmUKLSAgICAvLyBhcmVh IGJ5IGZhbGxpbmcgYmFjayB0byByZW5kZXJpbmcgYXMgbWFueSBsYXllcnMgYXMgcG9zc2libGUg dXNpbmcKLSAgICAvLyBtdWx0aXBsZSBibGVuZGluZyBwYXNzZXMuCi0gICAgR0xpbnQgcHJvZ3Jh bSA9IFByZXBhcmVBbmRDYWNoZVByb2dyYW0oY21kLnRleHR1cmVfY291bnQpOwotICAgIGlmIChw cm9ncmFtID09IDApIHsKLSAgICAgIEFMT0dFKCJUb28gbWFueSBsYXllcnMgdG8gcmVuZGVyIGlu IG9uZSBhcmVhIik7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBnbFVzZVByb2dyYW0o cHJvZ3JhbSk7Ci0gICAgR0xpbnQgZ2xfdmlld3BvcnRfbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRp b24ocHJvZ3JhbSwgInVWaWV3cG9ydCIpOwotICAgIEdMaW50IGdsX2Nyb3BfbG9jID0gZ2xHZXRV bmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVMYXllckNyb3AiKTsKLSAgICBHTGludCBnbF9hbHBo YV9sb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidUxheWVyQWxwaGEiKTsKLSAg ICBHTGludCBnbF9wcmVtdWx0X2xvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1 TGF5ZXJQcmVtdWx0Iik7Ci0gICAgR0xpbnQgZ2xfdGV4X21hdHJpeF9sb2MgPSBnbEdldFVuaWZv cm1Mb2NhdGlvbihwcm9ncmFtLCAidVRleE1hdHJpeCIpOwotICAgIGdsVW5pZm9ybTRmKGdsX3Zp ZXdwb3J0X2xvYywgY21kLmJvdW5kc1swXSAvIChmbG9hdClmcmFtZV93aWR0aCwKLSAgICAgICAg ICAgICAgICBjbWQuYm91bmRzWzFdIC8gKGZsb2F0KWZyYW1lX2hlaWdodCwKLSAgICAgICAgICAg ICAgICAoY21kLmJvdW5kc1syXSAtIGNtZC5ib3VuZHNbMF0pIC8gKGZsb2F0KWZyYW1lX3dpZHRo LAotICAgICAgICAgICAgICAgIChjbWQuYm91bmRzWzNdIC0gY21kLmJvdW5kc1sxXSkgLyAoZmxv YXQpZnJhbWVfaGVpZ2h0KTsKLQotICAgIGZvciAodW5zaWduZWQgc3JjX2luZGV4ID0gMDsgc3Jj X2luZGV4IDwgY21kLnRleHR1cmVfY291bnQ7IHNyY19pbmRleCsrKSB7Ci0gICAgICBzdGQ6Om9z dHJpbmdzdHJlYW0gdGV4dHVyZV9uYW1lX2Zvcm1hdHRlcjsKLSAgICAgIHRleHR1cmVfbmFtZV9m b3JtYXR0ZXIgPDwgInVMYXllclRleHR1cmUiIDw8IHNyY19pbmRleDsKLSAgICAgIEdMaW50IGds X3RleF9sb2MgPQotICAgICAgICAgIGdsR2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIHRleHR1 cmVfbmFtZV9mb3JtYXR0ZXIuc3RyKCkuY19zdHIoKSk7Ci0KLSAgICAgIGNvbnN0IFJlbmRlcmlu Z0NvbW1hbmQ6OlRleHR1cmVTb3VyY2UgJnNyYyA9IGNtZC50ZXh0dXJlc1tzcmNfaW5kZXhdOwot ICAgICAgZ2xVbmlmb3JtMWYoZ2xfYWxwaGFfbG9jICsgc3JjX2luZGV4LCBzcmMuYWxwaGEpOwot ICAgICAgZ2xVbmlmb3JtMWYoZ2xfcHJlbXVsdF9sb2MgKyBzcmNfaW5kZXgsIHNyYy5wcmVtdWx0 KTsKLSAgICAgIGdsVW5pZm9ybTRmKGdsX2Nyb3BfbG9jICsgc3JjX2luZGV4LCBzcmMuY3JvcF9i b3VuZHNbMF0sCi0gICAgICAgICAgICAgICAgICBzcmMuY3JvcF9ib3VuZHNbMV0sIHNyYy5jcm9w X2JvdW5kc1syXSAtIHNyYy5jcm9wX2JvdW5kc1swXSwKLSAgICAgICAgICAgICAgICAgIHNyYy5j cm9wX2JvdW5kc1szXSAtIHNyYy5jcm9wX2JvdW5kc1sxXSk7Ci0gICAgICBnbFVuaWZvcm0xaShn bF90ZXhfbG9jLCBzcmNfaW5kZXgpOwotICAgICAgZ2xVbmlmb3JtTWF0cml4MmZ2KGdsX3RleF9t YXRyaXhfbG9jICsgc3JjX2luZGV4LCAxLCBHTF9GQUxTRSwKLSAgICAgICAgICAgICAgICAgICAg ICAgICBzcmMudGV4dHVyZV9tYXRyaXgpOwotICAgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRV UkUwICsgc3JjX2luZGV4KTsKLSAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9FWFRFUk5B TF9PRVMsCi0gICAgICAgICAgICAgICAgICAgIGxheWVyX3RleHR1cmVzW3NyYy50ZXh0dXJlX2lu ZGV4XS50ZXh0dXJlLmdldCgpKTsKLSAgICB9Ci0KLSAgICBnbFNjaXNzb3IoY21kLmJvdW5kc1sw XSwgY21kLmJvdW5kc1sxXSwgY21kLmJvdW5kc1syXSAtIGNtZC5ib3VuZHNbMF0sCi0gICAgICAg ICAgICAgIGNtZC5ib3VuZHNbM10gLSBjbWQuYm91bmRzWzFdKTsKLSAgICBnbERyYXdBcnJheXMo R0xfVFJJQU5HTEVTLCAwLCAzKTsKLQotICAgIGZvciAodW5zaWduZWQgc3JjX2luZGV4ID0gMDsg c3JjX2luZGV4IDwgY21kLnRleHR1cmVfY291bnQ7IHNyY19pbmRleCsrKSB7Ci0gICAgICBnbEFj dGl2ZVRleHR1cmUoR0xfVEVYVFVSRTAgKyBzcmNfaW5kZXgpOwotICAgICAgZ2xCaW5kVGV4dHVy ZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgMCk7Ci0gICAgfQotICB9Ci0KLSAgZ2xEaXNhYmxl KEdMX1NDSVNTT1JfVEVTVCk7Ci0gIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7Ci0gIGds RGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KDApOwotICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJh eSgxKTsKLSAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgMCk7Ci0gIGdsVXNlUHJvZ3Jh bSgwKTsKLQotICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgMCk7Ci0KLSAgRW5k Q29udGV4dCgpOwotICByZXR1cm4gcmV0OwotfQotCi12b2lkIEdMV29ya2VyQ29tcG9zaXRvcjo6 RmluaXNoKCkgewotICBBVFJBQ0VfQ0FMTCgpOwotICBnbEZpbmlzaCgpOwotCi0gIGNoYXIgdXNl X2ZyYW1lYnVmZmVyX2NhY2hlX29wdFtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICBwcm9wZXJ0eV9n ZXQoImh3Yy5kcm0udXNlX2ZyYW1lYnVmZmVyX2NhY2hlIiwgdXNlX2ZyYW1lYnVmZmVyX2NhY2hl X29wdCwgIjEiKTsKLSAgYm9vbCB1c2VfZnJhbWVidWZmZXJfY2FjaGUgPSBhdG9pKHVzZV9mcmFt ZWJ1ZmZlcl9jYWNoZV9vcHQpOwotCi0gIGlmICh1c2VfZnJhbWVidWZmZXJfY2FjaGUpIHsKLSAg ICBmb3IgKGF1dG8gJmZiIDogY2FjaGVkX2ZyYW1lYnVmZmVyc18pCi0gICAgICBmYi5zdHJvbmdf ZnJhbWVidWZmZXIuY2xlYXIoKTsKLSAgfSBlbHNlIHsKLSAgICBjYWNoZWRfZnJhbWVidWZmZXJz Xy5jbGVhcigpOwotICB9Ci19Ci0KLUdMV29ya2VyQ29tcG9zaXRvcjo6Q2FjaGVkRnJhbWVidWZm ZXI6OkNhY2hlZEZyYW1lYnVmZmVyKAotICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZnYiwg QXV0b0VHTERpc3BsYXlJbWFnZSAmJmltYWdlLAotICAgIEF1dG9HTFRleHR1cmUgJiZ0ZXgsIEF1 dG9HTEZyYW1lYnVmZmVyICYmZmIpCi0gICAgOiBzdHJvbmdfZnJhbWVidWZmZXIoZ2IpLAotICAg ICAgd2Vha19mcmFtZWJ1ZmZlcihnYiksCi0gICAgICBlZ2xfZmJfaW1hZ2Uoc3RkOjptb3ZlKGlt YWdlKSksCi0gICAgICBnbF9mYl90ZXgoc3RkOjptb3ZlKHRleCkpLAotICAgICAgZ2xfZmIoc3Rk Ojptb3ZlKGZiKSkgewotfQotCi1ib29sIEdMV29ya2VyQ29tcG9zaXRvcjo6Q2FjaGVkRnJhbWVi dWZmZXI6OlByb21vdGUoKSB7Ci0gIGlmIChzdHJvbmdfZnJhbWVidWZmZXIuZ2V0KCkgIT0gTlVM TCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgc3Ryb25nX2ZyYW1lYnVmZmVyID0gd2Vha19mcmFtZWJ1 ZmZlci5wcm9tb3RlKCk7Ci0gIHJldHVybiBzdHJvbmdfZnJhbWVidWZmZXIuZ2V0KCkgIT0gTlVM TDsKLX0KLQotR0xXb3JrZXJDb21wb3NpdG9yOjpDYWNoZWRGcmFtZWJ1ZmZlciAqCi1HTFdvcmtl ckNvbXBvc2l0b3I6OkZpbmRDYWNoZWRGcmFtZWJ1ZmZlcigKLSAgICBjb25zdCBzcDxHcmFwaGlj QnVmZmVyPiAmZnJhbWVidWZmZXIpIHsKLSAgZm9yIChhdXRvICZmYiA6IGNhY2hlZF9mcmFtZWJ1 ZmZlcnNfKQotICAgIGlmIChmYi53ZWFrX2ZyYW1lYnVmZmVyID09IGZyYW1lYnVmZmVyKQotICAg ICAgcmV0dXJuICZmYjsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLUdMV29ya2VyQ29tcG9zaXRvcjo6 Q2FjaGVkRnJhbWVidWZmZXIgKgotR0xXb3JrZXJDb21wb3NpdG9yOjpQcmVwYXJlQW5kQ2FjaGVG cmFtZWJ1ZmZlcigKLSAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZnJhbWVidWZmZXIpIHsK LSAgQ2FjaGVkRnJhbWVidWZmZXIgKmNhY2hlZF9mcmFtZWJ1ZmZlciA9IEZpbmRDYWNoZWRGcmFt ZWJ1ZmZlcihmcmFtZWJ1ZmZlcik7Ci0gIGlmIChjYWNoZWRfZnJhbWVidWZmZXIgIT0gTlVMTCkg ewotICAgIGlmIChjYWNoZWRfZnJhbWVidWZmZXItPlByb21vdGUoKSkgewotICAgICAgZ2xCaW5k RnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIGNhY2hlZF9mcmFtZWJ1ZmZlci0+Z2xfZmIuZ2V0 KCkpOwotICAgICAgcmV0dXJuIGNhY2hlZF9mcmFtZWJ1ZmZlcjsKLSAgICB9Ci0KLSAgICBmb3Ig KGF1dG8gaXQgPSBjYWNoZWRfZnJhbWVidWZmZXJzXy5iZWdpbigpOwotICAgICAgICAgaXQgIT0g Y2FjaGVkX2ZyYW1lYnVmZmVyc18uZW5kKCk7ICsraXQpIHsKLSAgICAgIGlmIChpdC0+d2Vha19m cmFtZWJ1ZmZlciA9PSBmcmFtZWJ1ZmZlcikgewotICAgICAgICBjYWNoZWRfZnJhbWVidWZmZXJz Xy5lcmFzZShpdCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIEF1 dG9FR0xEaXNwbGF5SW1hZ2UgZWdsX2ZiX2ltYWdlKAotICAgICAgZWdsX2Rpc3BsYXlfLAotICAg ICAgZWdsQ3JlYXRlSW1hZ2VLSFIoZWdsX2Rpc3BsYXlfLCBFR0xfTk9fQ09OVEVYVCwgRUdMX05B VElWRV9CVUZGRVJfQU5EUk9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChFR0xDbGllbnRC dWZmZXIpZnJhbWVidWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpLAotICAgICAgICAgICAgICAgICAg ICAgICAgTlVMTCAvKiBubyBhdHRyaWJzICovKSk7Ci0KLSAgaWYgKGVnbF9mYl9pbWFnZS5pbWFn ZSgpID09IEVHTF9OT19JTUFHRV9LSFIpIHsKLSAgICBBTE9HRSgiRmFpbGVkIHRvIG1ha2UgaW1h Z2UgZnJvbSB0YXJnZXQgYnVmZmVyOiAlcyIsIEdldEVHTEVycm9yKCkpOwotICAgIHJldHVybiBO VUxMOwotICB9Ci0KLSAgR0x1aW50IGdsX2ZiX3RleDsKLSAgZ2xHZW5UZXh0dXJlcygxLCAmZ2xf ZmJfdGV4KTsKLSAgQXV0b0dMVGV4dHVyZSBnbF9mYl90ZXhfYXV0byhnbF9mYl90ZXgpOwotICBn bEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGdsX2ZiX3RleCk7Ci0gIGdsRUdMSW1hZ2VUYXJn ZXRUZXh0dXJlMkRPRVMoR0xfVEVYVFVSRV8yRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAoR0xlZ2xJbWFnZU9FUyllZ2xfZmJfaW1hZ2UuaW1hZ2UoKSk7Ci0gIGdsQmluZFRleHR1 cmUoR0xfVEVYVFVSRV8yRCwgMCk7Ci0KLSAgR0x1aW50IGdsX2ZiOwotICBnbEdlbkZyYW1lYnVm ZmVycygxLCAmZ2xfZmIpOwotICBBdXRvR0xGcmFtZWJ1ZmZlciBnbF9mYl9hdXRvKGdsX2ZiKTsK LSAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIGdsX2ZiKTsKLSAgZ2xGcmFtZWJ1 ZmZlclRleHR1cmUyRChHTF9GUkFNRUJVRkZFUiwgR0xfQ09MT1JfQVRUQUNITUVOVDAsIEdMX1RF WFRVUkVfMkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2xfZmJfdGV4LCAwKTsKLQotICBp ZiAoZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdMX0ZSQU1FQlVGRkVSKSAhPSBHTF9GUkFNRUJV RkZFUl9DT01QTEVURSkgewotICAgIEFMT0dFKCJGYWlsZWQgZnJhbWVidWZmZXIgY2hlY2sgZm9y IGNyZWF0ZWQgdGFyZ2V0IGJ1ZmZlcjogJXMiLAotICAgICAgICAgIEdldEdMRnJhbWVidWZmZXJF cnJvcigpKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGNhY2hlZF9mcmFtZWJ1ZmZlcnNf LmVtcGxhY2VfYmFjayhmcmFtZWJ1ZmZlciwgc3RkOjptb3ZlKGVnbF9mYl9pbWFnZSksCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoZ2xfZmJfdGV4X2F1dG8p LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGdsX2ZiX2F1 dG8pKTsKLSAgcmV0dXJuICZjYWNoZWRfZnJhbWVidWZmZXJzXy5iYWNrKCk7Ci19Ci0KLUdMaW50 IEdMV29ya2VyQ29tcG9zaXRvcjo6UHJlcGFyZUFuZENhY2hlUHJvZ3JhbSh1bnNpZ25lZCB0ZXh0 dXJlX2NvdW50KSB7Ci0gIGlmIChibGVuZF9wcm9ncmFtc18uc2l6ZSgpID49IHRleHR1cmVfY291 bnQpIHsKLSAgICBHTGludCBwcm9ncmFtID0gYmxlbmRfcHJvZ3JhbXNfW3RleHR1cmVfY291bnQg LSAxXS5nZXQoKTsKLSAgICBpZiAocHJvZ3JhbSAhPSAwKQotICAgICAgcmV0dXJuIHByb2dyYW07 Ci0gIH0KLQotICBBdXRvR0xQcm9ncmFtIHByb2dyYW0gPSBHZW5lcmF0ZVByb2dyYW0odGV4dHVy ZV9jb3VudCwgTlVMTCk7Ci0gIGlmIChwcm9ncmFtLmdldCgpICE9IDApIHsKLSAgICBpZiAoYmxl bmRfcHJvZ3JhbXNfLnNpemUoKSA8IHRleHR1cmVfY291bnQpCi0gICAgICBibGVuZF9wcm9ncmFt c18ucmVzaXplKHRleHR1cmVfY291bnQpOwotICAgIGJsZW5kX3Byb2dyYW1zX1t0ZXh0dXJlX2Nv dW50IC0gMV0gPSBzdGQ6Om1vdmUocHJvZ3JhbSk7Ci0gICAgcmV0dXJuIGJsZW5kX3Byb2dyYW1z X1t0ZXh0dXJlX2NvdW50IC0gMV0uZ2V0KCk7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotfSAg Ly8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2dsd29ya2VyLmggYi9nbHdvcmtlci5o CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRlNTVkNzI1Y2QuLjAwMDAwMDAwMDAw MAotLS0gYS9nbHdvcmtlci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAq IENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgot ICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJM aWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlh bmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExp Y2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNF TlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3Jl ZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNl bnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJB TlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGll ZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmlu ZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICov Ci0KLSNpZm5kZWYgQU5EUk9JRF9HTF9XT1JLRVJfSF8KLSNkZWZpbmUgQU5EUk9JRF9HTF9XT1JL RVJfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2RlZmluZSBFR0xfRUdMRVhUX1BST1RPVFlQ RVMKLSNkZWZpbmUgR0xfR0xFWFRfUFJPVE9UWVBFUwotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgot I2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRl IDxHTEVTMi9nbDJleHQuaD4KLQotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KLQotI2lu Y2x1ZGUgImF1dG9nbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBEcm1Id2NM YXllcjsKLXN0cnVjdCBEcm1Db21wb3NpdGlvblJlZ2lvbjsKLQotY2xhc3MgR0xXb3JrZXJDb21w b3NpdG9yIHsKLSBwdWJsaWM6Ci0gIEdMV29ya2VyQ29tcG9zaXRvcigpOwotICB+R0xXb3JrZXJD b21wb3NpdG9yKCk7Ci0KLSAgaW50IEluaXQoKTsKLSAgaW50IENvbXBvc2l0ZShEcm1Id2NMYXll ciAqbGF5ZXJzLCBEcm1Db21wb3NpdGlvblJlZ2lvbiAqcmVnaW9ucywKLSAgICAgICAgICAgICAg ICBzaXplX3QgbnVtX3JlZ2lvbnMsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZmcmFtZWJ1ZmZl ciwKLSAgICAgICAgICAgICAgICBJbXBvcnRlciAqaW1wb3J0ZXIpOwotICB2b2lkIEZpbmlzaCgp OwotCi0gcHJpdmF0ZToKLSAgc3RydWN0IENhY2hlZEZyYW1lYnVmZmVyIHsKLSAgICAvLyBJZiB0 aGUgc3Ryb25nX2ZyYW1lYnVmZmVyIGlzIG5vbi1OVUxMLCB3ZSBhcmUgaG9sZGluZyBhIHN0cm9u ZyByZWZlcmVuY2UKLSAgICAvLyB1bnRpbCB3ZSBhcmUgc3VyZSByZW5kZXJpbmcgaXMgZG9uZS4g VGhlIHdlYWsgcmVmZXJlbmNlIHdpbGwgYmUgZXF1YWwgaW4KLSAgICAvLyB0aGF0IGNhc2UuCi0g ICAgc3A8R3JhcGhpY0J1ZmZlcj4gc3Ryb25nX2ZyYW1lYnVmZmVyOwotICAgIHdwPEdyYXBoaWNC dWZmZXI+IHdlYWtfZnJhbWVidWZmZXI7Ci0gICAgQXV0b0VHTERpc3BsYXlJbWFnZSBlZ2xfZmJf aW1hZ2U7Ci0gICAgQXV0b0dMVGV4dHVyZSBnbF9mYl90ZXg7Ci0gICAgQXV0b0dMRnJhbWVidWZm ZXIgZ2xfZmI7Ci0KLSAgICBDYWNoZWRGcmFtZWJ1ZmZlcihjb25zdCBzcDxHcmFwaGljQnVmZmVy PiAmZ2IsIEF1dG9FR0xEaXNwbGF5SW1hZ2UgJiZpbWFnZSwKLSAgICAgICAgICAgICAgICAgICAg ICBBdXRvR0xUZXh0dXJlICYmdGV4LCBBdXRvR0xGcmFtZWJ1ZmZlciAmJmZiKTsKLQotICAgIGJv b2wgUHJvbW90ZSgpOwotICB9OwotCi0gIHN0cnVjdCB7Ci0gICAgRUdMRGlzcGxheSBzYXZlZF9l Z2xfZGlzcGxheSA9IEVHTF9OT19ESVNQTEFZOwotICAgIEVHTENvbnRleHQgc2F2ZWRfZWdsX2N0 eCA9IEVHTF9OT19DT05URVhUOwotICAgIEVHTFN1cmZhY2Ugc2F2ZWRfZWdsX3JlYWQgPSBFR0xf Tk9fU1VSRkFDRTsKLSAgICBFR0xTdXJmYWNlIHNhdmVkX2VnbF9kcmF3ID0gRUdMX05PX1NVUkZB Q0U7Ci0gIH0gcHJpdmF0ZV87Ci0KLSAgaW50IEJlZ2luQ29udGV4dCgpOwotICBpbnQgRW5kQ29u dGV4dCgpOwotCi0gIENhY2hlZEZyYW1lYnVmZmVyICpGaW5kQ2FjaGVkRnJhbWVidWZmZXIoCi0g ICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZnJhbWVidWZmZXIpOwotICBDYWNoZWRGcmFt ZWJ1ZmZlciAqUHJlcGFyZUFuZENhY2hlRnJhbWVidWZmZXIoCi0gICAgICBjb25zdCBzcDxHcmFw aGljQnVmZmVyPiAmZnJhbWVidWZmZXIpOwotCi0gIEdMaW50IFByZXBhcmVBbmRDYWNoZVByb2dy YW0odW5zaWduZWQgdGV4dHVyZV9jb3VudCk7Ci0KLSAgRUdMRGlzcGxheSBlZ2xfZGlzcGxheV87 Ci0gIEVHTENvbnRleHQgZWdsX2N0eF87Ci0KLSAgc3RkOjp2ZWN0b3I8QXV0b0dMUHJvZ3JhbT4g YmxlbmRfcHJvZ3JhbXNfOwotICBBdXRvR0xCdWZmZXIgdmVydGV4X2J1ZmZlcl87Ci0KLSAgc3Rk Ojp2ZWN0b3I8Q2FjaGVkRnJhbWVidWZmZXI+IGNhY2hlZF9mcmFtZWJ1ZmZlcnNfOwotfTsKLX0K LQotI2VuZGlmCmRpZmYgLS1naXQgYS9od2NvbXBvc2VyLmNwcCBiL2h3Y29tcG9zZXIuY3BwCmRl bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzhlMDQyODk1YTkuLjAwMDAwMDAwMDAwMAot LS0gYS9od2NvbXBvc2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg0MSArMCwwIEBACi0vKgot ICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAq Ci0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUg IkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBs aWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUg TGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJ Q0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFn cmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExp Y2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FS UkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBs aWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJu aW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0g Ki8KLQotI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfR1JBUEhJQ1MKLSNkZWZpbmUgTE9H X1RBRyAiaHdjb21wb3Nlci1kcm0iCi0KLSNpbmNsdWRlICJkcm1od2NvbXBvc2VyLmgiCi0jaW5j bHVkZSAiZHJtZXZlbnRsaXN0ZW5lci5oIgotI2luY2x1ZGUgImRybXJlc291cmNlcy5oIgotI2lu Y2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmlydHVhbGNvbXBvc2l0b3J3b3JrZXIuaCIK LSNpbmNsdWRlICJ2c3luY3dvcmtlci5oIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNs dWRlIDxjaW50dHlwZXM+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNs dWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgot I2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxz eXMvcmVzb3VyY2UuaD4KLSNpbmNsdWRlIDx4Zjg2ZHJtLmg+Ci0jaW5jbHVkZSA8eGY4NmRybU1v ZGUuaD4KLQotI2luY2x1ZGUgPGxvZy9sb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGll cy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUv aHdjb21wb3Nlci5oPgotI2luY2x1ZGUgPHN3X3N5bmMuaD4KLSNpbmNsdWRlIDxzeW5jL3N5bmMu aD4KLSNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgotCi0jZGVmaW5lIFVNX1BFUl9JTkNIIDI1NDAw Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRHVtbXlTd1N5bmNUaW1lbGluZSB7Ci0g cHVibGljOgotICBpbnQgSW5pdCgpIHsKLSAgICBpbnQgcmV0ID0gdGltZWxpbmVfZmRfLlNldChz d19zeW5jX3RpbWVsaW5lX2NyZWF0ZSgpKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgIHJldHVy biByZXQ7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBVbmlxdWVGZCBDcmVhdGVEdW1teUZlbmNl KCkgewotICAgIGludCByZXQgPSBzd19zeW5jX2ZlbmNlX2NyZWF0ZSh0aW1lbGluZV9mZF8uZ2V0 KCksICJkdW1teSBmZW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRp bWVsaW5lX3B0XyArIDEpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICBBTE9HRSgiRmFpbGVk IHRvIGNyZWF0ZSBkdW1teSBmZW5jZSAlZCIsIHJldCk7Ci0gICAgICByZXR1cm4gcmV0OwotICAg IH0KLQotICAgIFVuaXF1ZUZkIHJldF9mZChyZXQpOwotCi0gICAgcmV0ID0gc3dfc3luY190aW1l bGluZV9pbmModGltZWxpbmVfZmRfLmdldCgpLCAxKTsKLSAgICBpZiAocmV0KSB7Ci0gICAgICBB TE9HRSgiRmFpbGVkIHRvIGluY3JlbWVudCBkdW1teSBzeW5jIHRpbWVsaW5lICVkIiwgcmV0KTsK LSAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgKyt0aW1lbGluZV9wdF87Ci0gICAgcmV0 dXJuIHJldF9mZDsKLSAgfQotCi0gcHJpdmF0ZToKLSAgVW5pcXVlRmQgdGltZWxpbmVfZmRfOwot ICBpbnQgdGltZWxpbmVfcHRfID0gMDsKLX07Ci0KLXN0cnVjdCBDaGVja2VkT3V0cHV0RmQgewot ICBDaGVja2VkT3V0cHV0RmQoaW50ICpmZCwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24sCi0gICAg ICAgICAgICAgICAgICBEdW1teVN3U3luY1RpbWVsaW5lICZ0aW1lbGluZSkKLSAgICAgIDogZmRf KGZkKSwgZGVzY3JpcHRpb25fKGRlc2NyaXB0aW9uKSwgdGltZWxpbmVfKHRpbWVsaW5lKSB7Ci0g IH0KLSAgQ2hlY2tlZE91dHB1dEZkKENoZWNrZWRPdXRwdXRGZCAmJnJocykKLSAgICAgIDogZGVz Y3JpcHRpb25fKHJocy5kZXNjcmlwdGlvbl8pLCB0aW1lbGluZV8ocmhzLnRpbWVsaW5lXykgewot ICAgIHN0ZDo6c3dhcChmZF8sIHJocy5mZF8pOwotICB9Ci0KLSAgQ2hlY2tlZE91dHB1dEZkICZv cGVyYXRvcj0oY29uc3QgQ2hlY2tlZE91dHB1dEZkICZyaHMpID0gZGVsZXRlOwotCi0gIH5DaGVj a2VkT3V0cHV0RmQoKSB7Ci0gICAgaWYgKGZkXyA9PSBOVUxMKQotICAgICAgcmV0dXJuOwotCi0g ICAgaWYgKCpmZF8gPj0gMCkKLSAgICAgIHJldHVybjsKLQotICAgICpmZF8gPSB0aW1lbGluZV8u Q3JlYXRlRHVtbXlGZW5jZSgpLlJlbGVhc2UoKTsKLQotICAgIGlmICgqZmRfIDwgMCkKLSAgICAg IEFMT0dFKCJGYWlsZWQgdG8gZmlsbCAlcyAoJXAgPT0gJWQpIGJlZm9yZSBkZXN0cnVjdGlvbiIs Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbl8uY19zdHIoKSwgZmRfLCAqZmRfKTsKLSAgfQotCi0g cHJpdmF0ZToKLSAgaW50ICpmZF8gPSBOVUxMOwotICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbl87 Ci0gIER1bW15U3dTeW5jVGltZWxpbmUgJnRpbWVsaW5lXzsKLX07Ci0KLXR5cGVkZWYgc3RydWN0 IGh3Y19kcm1fZGlzcGxheSB7Ci0gIHN0cnVjdCBod2NfY29udGV4dF90ICpjdHg7Ci0gIGludCBk aXNwbGF5OwotCi0gIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBjb25maWdfaWRzOwotCi0gIFZTeW5j V29ya2VyIHZzeW5jX3dvcmtlcjsKLX0gaHdjX2RybV9kaXNwbGF5X3Q7Ci0KLWNsYXNzIERybUhv dHBsdWdIYW5kbGVyIDogcHVibGljIERybUV2ZW50SGFuZGxlciB7Ci0gcHVibGljOgotICB2b2lk IEluaXQoRHJtUmVzb3VyY2VzICpkcm0sIGNvbnN0IHN0cnVjdCBod2NfcHJvY3MgKnByb2NzKSB7 Ci0gICAgZHJtXyA9IGRybTsKLSAgICBwcm9jc18gPSBwcm9jczsKLSAgfQotCi0gIHZvaWQgSGFu ZGxlRXZlbnQodWludDY0X3QgdGltZXN0YW1wX3VzKSB7Ci0gICAgZm9yIChhdXRvICZjb25uIDog ZHJtXy0+Y29ubmVjdG9ycygpKSB7Ci0gICAgICBkcm1Nb2RlQ29ubmVjdGlvbiBvbGRfc3RhdGUg PSBjb25uLT5zdGF0ZSgpOwotCi0gICAgICBjb25uLT5VcGRhdGVNb2RlcygpOwotCi0gICAgICBk cm1Nb2RlQ29ubmVjdGlvbiBjdXJfc3RhdGUgPSBjb25uLT5zdGF0ZSgpOwotCi0gICAgICBpZiAo Y3VyX3N0YXRlID09IG9sZF9zdGF0ZSkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIEFMT0dJ KCIlcyBldmVudCBAJSIgUFJJdTY0ICIgZm9yIGNvbm5lY3RvciAldVxuIiwKLSAgICAgICAgICAg IGN1cl9zdGF0ZSA9PSBEUk1fTU9ERV9DT05ORUNURUQgPyAiUGx1ZyIgOiAiVW5wbHVnIiwgdGlt ZXN0YW1wX3VzLAotICAgICAgICAgICAgY29ubi0+aWQoKSk7Ci0KLSAgICAgIGlmIChjdXJfc3Rh dGUgPT0gRFJNX01PREVfQ09OTkVDVEVEKSB7Ci0gICAgICAgIC8vIFRha2UgdGhlIGZpcnN0IG9u ZSwgdGhlbiBsb29rIGZvciB0aGUgcHJlZmVycmVkCi0gICAgICAgIERybU1vZGUgbW9kZSA9ICoo Y29ubi0+bW9kZXMoKS5iZWdpbigpKTsKLSAgICAgICAgZm9yIChhdXRvICZtIDogY29ubi0+bW9k ZXMoKSkgewotICAgICAgICAgIGlmIChtLnR5cGUoKSAmIERSTV9NT0RFX1RZUEVfUFJFRkVSUkVE KSB7Ci0gICAgICAgICAgICBtb2RlID0gbTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg IH0KLSAgICAgICAgfQotICAgICAgICBBTE9HSSgiU2V0dGluZyBtb2RlICVkeCVkIGZvciBjb25u ZWN0b3IgJWRcbiIsIG1vZGUuaF9kaXNwbGF5KCksCi0gICAgICAgICAgICAgIG1vZGUudl9kaXNw bGF5KCksIGNvbm4tPmlkKCkpOwotICAgICAgICBpbnQgcmV0ID0gZHJtXy0+U2V0RGlzcGxheUFj dGl2ZU1vZGUoY29ubi0+ZGlzcGxheSgpLCBtb2RlKTsKLSAgICAgICAgaWYgKHJldCkgewotICAg ICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGFjdGl2ZSBjb25maWcgJWQiLCByZXQpOwotICAg ICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW50IHJl dCA9IGRybV8tPlNldERwbXNNb2RlKGNvbm4tPmRpc3BsYXkoKSwgRFJNX01PREVfRFBNU19PRkYp OwotICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgZHBt cyBtb2RlIG9mZiAlZCIsIHJldCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAg ICB9Ci0KLSAgICAgIHByb2NzXy0+aG90cGx1Zyhwcm9jc18sIGNvbm4tPmRpc3BsYXkoKSwKLSAg ICAgICAgICAgICAgICAgICAgICBjdXJfc3RhdGUgPT0gRFJNX01PREVfQ09OTkVDVEVEID8gMSA6 IDApOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgRHJtUmVzb3VyY2VzICpkcm1fID0gTlVM TDsKLSAgY29uc3Qgc3RydWN0IGh3Y19wcm9jcyAqcHJvY3NfID0gTlVMTDsKLX07Ci0KLXN0cnVj dCBod2NfY29udGV4dF90IHsKLSAgLy8gbWFwIG9mIGRpc3BsYXk6aHdjX2RybV9kaXNwbGF5X3QK LSAgdHlwZWRlZiBzdGQ6Om1hcDxpbnQsIGh3Y19kcm1fZGlzcGxheV90PiBEaXNwbGF5TWFwOwot Ci0gIH5od2NfY29udGV4dF90KCkgewotICAgIHZpcnR1YWxfY29tcG9zaXRvcl93b3JrZXIuRXhp dCgpOwotICB9Ci0KLSAgaHdjX2NvbXBvc2VyX2RldmljZV8xX3QgZGV2aWNlOwotICBod2NfcHJv Y3NfdCBjb25zdCAqcHJvY3MgPSBOVUxMOwotCi0gIERpc3BsYXlNYXAgZGlzcGxheXM7Ci0gIERy bVJlc291cmNlcyBkcm07Ci0gIHN0ZDo6dW5pcXVlX3B0cjxJbXBvcnRlcj4gaW1wb3J0ZXI7Ci0g IGNvbnN0IGdyYWxsb2NfbW9kdWxlX3QgKmdyYWxsb2M7Ci0gIER1bW15U3dTeW5jVGltZWxpbmUg ZHVtbXlfdGltZWxpbmU7Ci0gIFZpcnR1YWxDb21wb3NpdG9yV29ya2VyIHZpcnR1YWxfY29tcG9z aXRvcl93b3JrZXI7Ci0gIERybUhvdHBsdWdIYW5kbGVyIGhvdHBsdWdfaGFuZGxlcjsKLX07Ci0K LWNsYXNzIERybVZzeW5jQ2FsbGJhY2sgOiBwdWJsaWMgVnN5bmNDYWxsYmFjayB7Ci0gcHVibGlj OgotICBEcm1Wc3luY0NhbGxiYWNrKGh3Y19wcm9jc190IGNvbnN0ICpwcm9jcykgOiBwcm9jc18o cHJvY3MpIHsKLSAgfQotCi0gIHZvaWQgQ2FsbGJhY2soaW50IGRpc3BsYXksIGludDY0X3QgdGlt ZXN0YW1wKSB7Ci0gICAgcHJvY3NfLT52c3luYyhwcm9jc18sIGRpc3BsYXksIHRpbWVzdGFtcCk7 Ci0gIH0KLSBwcml2YXRlOgotICBod2NfcHJvY3NfdCBjb25zdCAqcHJvY3NfOwotfTsKLQotc3Rh dGljIHZvaWQgaHdjX2R1bXAoc3RydWN0IGh3Y19jb21wb3Nlcl9kZXZpY2VfMSAqZGV2LCBjaGFy ICpidWZmLAotICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmZfbGVuKSB7Ci0gIHN0cnVjdCBo d2NfY29udGV4dF90ICpjdHggPSAoc3RydWN0IGh3Y19jb250ZXh0X3QgKikmZGV2LT5jb21tb247 Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgY3R4LT5kcm0uY29tcG9zaXRvcigpLT5E dW1wKCZvdXQpOwotICBzdGQ6OnN0cmluZyBvdXRfc3RyID0gb3V0LnN0cigpOwotICBzdHJuY3B5 KGJ1ZmYsIG91dF9zdHIuY19zdHIoKSwKLSAgICAgICAgICBzdGQ6Om1pbigoc2l6ZV90KWJ1ZmZf bGVuLCBvdXRfc3RyLmxlbmd0aCgpICsgMSkpOwotICBidWZmW2J1ZmZfbGVuIC0gMV0gPSAnXDAn OwotfQotCi1zdGF0aWMgYm9vbCBod2Nfc2tpcF9sYXllcihjb25zdCBzdGQ6OnBhaXI8aW50LCBp bnQ+ICZpbmRpY2VzLCBpbnQgaSkgewotICByZXR1cm4gaW5kaWNlcy5maXJzdCA+PSAwICYmIGkg Pj0gaW5kaWNlcy5maXJzdCAmJiBpIDw9IGluZGljZXMuc2Vjb25kOwotfQotCi1zdGF0aWMgaW50 IGh3Y19wcmVwYXJlKGh3Y19jb21wb3Nlcl9kZXZpY2VfMV90ICpkZXYsIHNpemVfdCBudW1fZGlz cGxheXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGh3Y19kaXNwbGF5X2NvbnRlbnRzXzFfdCAq KmRpc3BsYXlfY29udGVudHMpIHsKLSAgc3RydWN0IGh3Y19jb250ZXh0X3QgKmN0eCA9IChzdHJ1 Y3QgaHdjX2NvbnRleHRfdCAqKSZkZXYtPmNvbW1vbjsKLQotICBmb3IgKGludCBpID0gMDsgaSA8 IChpbnQpbnVtX2Rpc3BsYXlzOyArK2kpIHsKLSAgICBpZiAoIWRpc3BsYXlfY29udGVudHNbaV0p Ci0gICAgICBjb250aW51ZTsKLQotICAgIGJvb2wgdXNlX2ZyYW1lYnVmZmVyX3RhcmdldCA9IGZh bHNlOwotICAgIERybU1vZGUgbW9kZTsKLSAgICBpZiAoaSA9PSBIV0NfRElTUExBWV9WSVJUVUFM KSB7Ci0gICAgICB1c2VfZnJhbWVidWZmZXJfdGFyZ2V0ID0gdHJ1ZTsKLSAgICB9IGVsc2Ugewot ICAgICAgRHJtQ29ubmVjdG9yICpjID0gY3R4LT5kcm0uR2V0Q29ubmVjdG9yRm9yRGlzcGxheShp KTsKLSAgICAgIGlmICghYykgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBEcm1Db25u ZWN0b3IgZm9yIGRpc3BsYXkgJWQiLCBpKTsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAg ICB9Ci0gICAgICBtb2RlID0gYy0+YWN0aXZlX21vZGUoKTsKLSAgICB9Ci0KLSAgICAvLyBTaW5j ZSB3ZSBjYW4ndCBjb21wb3NpdGUgSFdDX1NLSVBfTEFZRVJzIGJ5IG91cnNlbHZlcywgd2UnbGwg bGV0IFNGCi0gICAgLy8gaGFuZGxlIGFsbCBsYXllcnMgaW4gYmV0d2VlbiB0aGUgZmlyc3QgYW5k IGxhc3Qgc2tpcCBsYXllcnMuIFNvIGZpbmQgdGhlCi0gICAgLy8gb3V0ZXIgaW5kaWNlcyBhbmQg bWFyayBldmVyeXRoaW5nIGluIGJldHdlZW4gYXMgSFdDX0ZSQU1FQlVGRkVSCi0gICAgc3RkOjpw YWlyPGludCwgaW50PiBza2lwX2xheWVyX2luZGljZXMoLTEsIC0xKTsKLSAgICBpbnQgbnVtX2xh eWVycyA9IGRpc3BsYXlfY29udGVudHNbaV0tPm51bUh3TGF5ZXJzOwotICAgIGZvciAoaW50IGog PSAwOyAhdXNlX2ZyYW1lYnVmZmVyX3RhcmdldCAmJiBqIDwgbnVtX2xheWVyczsgKytqKSB7Ci0g ICAgICBod2NfbGF5ZXJfMV90ICpsYXllciA9ICZkaXNwbGF5X2NvbnRlbnRzW2ldLT5od0xheWVy c1tqXTsKLQotICAgICAgaWYgKCEobGF5ZXItPmZsYWdzICYgSFdDX1NLSVBfTEFZRVIpKQotICAg ICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKHNraXBfbGF5ZXJfaW5kaWNlcy5maXJzdCA9PSAt MSkKLSAgICAgICAgc2tpcF9sYXllcl9pbmRpY2VzLmZpcnN0ID0gajsKLSAgICAgIHNraXBfbGF5 ZXJfaW5kaWNlcy5zZWNvbmQgPSBqOwotICAgIH0KLQotICAgIGZvciAoaW50IGogPSAwOyBqIDwg bnVtX2xheWVyczsgKytqKSB7Ci0gICAgICBod2NfbGF5ZXJfMV90ICpsYXllciA9ICZkaXNwbGF5 X2NvbnRlbnRzW2ldLT5od0xheWVyc1tqXTsKLQotICAgICAgaWYgKCF1c2VfZnJhbWVidWZmZXJf dGFyZ2V0ICYmICFod2Nfc2tpcF9sYXllcihza2lwX2xheWVyX2luZGljZXMsIGopKSB7Ci0gICAg ICAgIC8vIElmIHRoZSBsYXllciBpcyBvZmYgdGhlIHNjcmVlbiwgZG9uJ3QgZWFybWFyayBpdCBm b3IgYW4gb3ZlcmxheS4KLSAgICAgICAgLy8gV2UnbGwgbGVhdmUgaXQgYXMtaXMsIHdoaWNoIGVm ZmVjdGl2ZWx5IGp1c3QgZHJvcHMgaXQgZnJvbSB0aGUgZnJhbWUKLSAgICAgICAgY29uc3QgaHdj X3JlY3RfdCAqZnJhbWUgPSAmbGF5ZXItPmRpc3BsYXlGcmFtZTsKLSAgICAgICAgaWYgKChmcmFt ZS0+cmlnaHQgLSBmcmFtZS0+bGVmdCkgPD0gMCB8fAotICAgICAgICAgICAgKGZyYW1lLT5ib3R0 b20gLSBmcmFtZS0+dG9wKSA8PSAwIHx8Ci0gICAgICAgICAgICBmcmFtZS0+cmlnaHQgPD0gMCB8 fCBmcmFtZS0+Ym90dG9tIDw9IDAgfHwKLSAgICAgICAgICAgIGZyYW1lLT5sZWZ0ID49IChpbnQp bW9kZS5oX2Rpc3BsYXkoKSB8fAotICAgICAgICAgICAgZnJhbWUtPnRvcCA+PSAoaW50KW1vZGUu dl9kaXNwbGF5KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAobGF5ZXIt PmNvbXBvc2l0aW9uVHlwZSA9PSBIV0NfRlJBTUVCVUZGRVIpCi0gICAgICAgICAgbGF5ZXItPmNv bXBvc2l0aW9uVHlwZSA9IEhXQ19PVkVSTEFZOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dp dGNoIChsYXllci0+Y29tcG9zaXRpb25UeXBlKSB7Ci0gICAgICAgICAgY2FzZSBIV0NfT1ZFUkxB WToKLSAgICAgICAgICBjYXNlIEhXQ19CQUNLR1JPVU5EOgotICAgICAgICAgIGNhc2UgSFdDX1NJ REVCQU5EOgotICAgICAgICAgIGNhc2UgSFdDX0NVUlNPUl9PVkVSTEFZOgotICAgICAgICAgICAg bGF5ZXItPmNvbXBvc2l0aW9uVHlwZSA9IEhXQ19GUkFNRUJVRkZFUjsKLSAgICAgICAgICAgIGJy ZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0K LXN0YXRpYyB2b2lkIGh3Y19hZGRfbGF5ZXJfdG9fcmV0aXJlX2ZlbmNlKAotICAgIGh3Y19sYXll cl8xX3QgKmxheWVyLCBod2NfZGlzcGxheV9jb250ZW50c18xX3QgKmRpc3BsYXlfY29udGVudHMp IHsKLSAgaWYgKGxheWVyLT5yZWxlYXNlRmVuY2VGZCA8IDApCi0gICAgcmV0dXJuOwotCi0gIGlm IChkaXNwbGF5X2NvbnRlbnRzLT5yZXRpcmVGZW5jZUZkID49IDApIHsKLSAgICBpbnQgb2xkX3Jl dGlyZV9mZW5jZSA9IGRpc3BsYXlfY29udGVudHMtPnJldGlyZUZlbmNlRmQ7Ci0gICAgZGlzcGxh eV9jb250ZW50cy0+cmV0aXJlRmVuY2VGZCA9Ci0gICAgICAgIHN5bmNfbWVyZ2UoImRjX3JldGly ZSIsIG9sZF9yZXRpcmVfZmVuY2UsIGxheWVyLT5yZWxlYXNlRmVuY2VGZCk7Ci0gICAgY2xvc2Uo b2xkX3JldGlyZV9mZW5jZSk7Ci0gIH0gZWxzZSB7Ci0gICAgZGlzcGxheV9jb250ZW50cy0+cmV0 aXJlRmVuY2VGZCA9IGR1cChsYXllci0+cmVsZWFzZUZlbmNlRmQpOwotICB9Ci19Ci0KLXN0YXRp YyBpbnQgaHdjX3NldChod2NfY29tcG9zZXJfZGV2aWNlXzFfdCAqZGV2LCBzaXplX3QgbnVtX2Rp c3BsYXlzLAotICAgICAgICAgICAgICAgICAgIGh3Y19kaXNwbGF5X2NvbnRlbnRzXzFfdCAqKnNm X2Rpc3BsYXlfY29udGVudHMpIHsKLSAgQVRSQUNFX0NBTEwoKTsKLSAgc3RydWN0IGh3Y19jb250 ZXh0X3QgKmN0eCA9IChzdHJ1Y3QgaHdjX2NvbnRleHRfdCAqKSZkZXYtPmNvbW1vbjsKLSAgaW50 IHJldCA9IDA7Ci0KLSAgc3RkOjp2ZWN0b3I8Q2hlY2tlZE91dHB1dEZkPiBjaGVja2VkX291dHB1 dF9mZW5jZXM7Ci0gIHN0ZDo6dmVjdG9yPERybUh3Y0Rpc3BsYXlDb250ZW50cz4gZGlzcGxheXNf Y29udGVudHM7Ci0gIHN0ZDo6dmVjdG9yPERybUNvbXBvc2l0aW9uRGlzcGxheUxheWVyc01hcD4g bGF5ZXJzX21hcDsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c2l6ZV90Pj4gbGF5ZXJzX2lu ZGljZXM7Ci0gIGRpc3BsYXlzX2NvbnRlbnRzLnJlc2VydmUobnVtX2Rpc3BsYXlzKTsKLSAgLy8g bGF5ZXJzX21hcC5yZXNlcnZlKG51bV9kaXNwbGF5cyk7Ci0gIGxheWVyc19pbmRpY2VzLnJlc2Vy dmUobnVtX2Rpc3BsYXlzKTsKLQotICAvLyBQaGFzZSBvbmUgZG9lcyBub3RoaW5nIHRoYXQgd291 bGQgY2F1c2UgZXJyb3JzLiBPbmx5IHRha2Ugb3duZXJzaGlwIG9mIEZEcy4KLSAgZm9yIChzaXpl X3QgaSA9IDA7IGkgPCBudW1fZGlzcGxheXM7ICsraSkgewotICAgIGh3Y19kaXNwbGF5X2NvbnRl bnRzXzFfdCAqZGMgPSBzZl9kaXNwbGF5X2NvbnRlbnRzW2ldOwotICAgIGRpc3BsYXlzX2NvbnRl bnRzLmVtcGxhY2VfYmFjaygpOwotICAgIERybUh3Y0Rpc3BsYXlDb250ZW50cyAmZGlzcGxheV9j b250ZW50cyA9IGRpc3BsYXlzX2NvbnRlbnRzLmJhY2soKTsKLSAgICBsYXllcnNfaW5kaWNlcy5l bXBsYWNlX2JhY2soKTsKLSAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZpbmRpY2VzX3RvX2NvbXBv c2l0ZSA9IGxheWVyc19pbmRpY2VzLmJhY2soKTsKLQotICAgIGlmICghc2ZfZGlzcGxheV9jb250 ZW50c1tpXSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgaWYgKGkgPT0gSFdDX0RJU1BMQVlfVklS VFVBTCkgewotICAgICAgY3R4LT52aXJ0dWFsX2NvbXBvc2l0b3Jfd29ya2VyLlF1ZXVlQ29tcG9z aXRlKGRjKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIHN0ZDo6b3N0cmluZ3N0cmVh bSBkaXNwbGF5X2luZGV4X2Zvcm1hdHRlcjsKLSAgICBkaXNwbGF5X2luZGV4X2Zvcm1hdHRlciA8 PCAicmV0aXJlIGZlbmNlIGZvciBkaXNwbGF5ICIgPDwgaTsKLSAgICBzdGQ6OnN0cmluZyBkaXNw bGF5X2ZlbmNlX2Rlc2NyaXB0aW9uKGRpc3BsYXlfaW5kZXhfZm9ybWF0dGVyLnN0cigpKTsKLSAg ICBjaGVja2VkX291dHB1dF9mZW5jZXMuZW1wbGFjZV9iYWNrKCZkYy0+cmV0aXJlRmVuY2VGZCwK LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZmVuY2VfZGVz Y3JpcHRpb24uY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGN0eC0+ZHVtbXlfdGltZWxpbmUpOwotICAgIGRpc3BsYXlfY29udGVudHMucmV0aXJlX2ZlbmNl ID0gT3V0cHV0RmQoJmRjLT5yZXRpcmVGZW5jZUZkKTsKLQotICAgIHNpemVfdCBudW1fZGNfbGF5 ZXJzID0gZGMtPm51bUh3TGF5ZXJzOwotICAgIGludCBmcmFtZWJ1ZmZlcl90YXJnZXRfaW5kZXgg PSAtMTsKLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG51bV9kY19sYXllcnM7ICsraikgewot ICAgICAgaHdjX2xheWVyXzFfdCAqc2ZfbGF5ZXIgPSAmZGMtPmh3TGF5ZXJzW2pdOwotICAgICAg aWYgKHNmX2xheWVyLT5jb21wb3NpdGlvblR5cGUgPT0gSFdDX0ZSQU1FQlVGRkVSX1RBUkdFVCkg ewotICAgICAgICBmcmFtZWJ1ZmZlcl90YXJnZXRfaW5kZXggPSBqOwotICAgICAgICBicmVhazsK LSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG51bV9kY19sYXll cnM7ICsraikgewotICAgICAgaHdjX2xheWVyXzFfdCAqc2ZfbGF5ZXIgPSAmZGMtPmh3TGF5ZXJz W2pdOwotCi0gICAgICBkaXNwbGF5X2NvbnRlbnRzLmxheWVycy5lbXBsYWNlX2JhY2soKTsKLSAg ICAgIERybUh3Y0xheWVyICZsYXllciA9IGRpc3BsYXlfY29udGVudHMubGF5ZXJzLmJhY2soKTsK LQotICAgICAgLy8gSW4gcHJlcGFyZSgpIHdlIG1hcmtlZCBhbGwgbGF5ZXJzIEZSQU1FQlVGRkVS IGJldHdlZW4gU0tJUF9MQVlFUidzLgotICAgICAgLy8gVGhpcyBtZWFucyB3ZSBzaG91bGQgaW5z ZXJ0IHRoZSBGQl9UQVJHRVQgbGF5ZXIgaW4gdGhlIGNvbXBvc2l0aW9uCi0gICAgICAvLyBzdGFj ayBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IHNraXAgbGF5ZXIsIGFuZCBpZ25vcmUgdGhl IHJlc3QuCi0gICAgICBpZiAoc2ZfbGF5ZXItPmZsYWdzICYgSFdDX1NLSVBfTEFZRVIpIHsKLSAg ICAgICAgaWYgKGZyYW1lYnVmZmVyX3RhcmdldF9pbmRleCA8IDApCi0gICAgICAgICAgY29udGlu dWU7Ci0gICAgICAgIGludCBpZHggPSBmcmFtZWJ1ZmZlcl90YXJnZXRfaW5kZXg7Ci0gICAgICAg IGZyYW1lYnVmZmVyX3RhcmdldF9pbmRleCA9IC0xOwotICAgICAgICBod2NfbGF5ZXJfMV90ICpm YnRfbGF5ZXIgPSAmZGMtPmh3TGF5ZXJzW2lkeF07Ci0gICAgICAgIGlmICghZmJ0X2xheWVyLT5o YW5kbGUgfHwgKGZidF9sYXllci0+ZmxhZ3MgJiBIV0NfU0tJUF9MQVlFUikpIHsKLSAgICAgICAg ICBBTE9HRSgiSW52YWxpZCBIV0NfRlJBTUVCVUZGRVJfVEFSR0VUIHdpdGggSFdDX1NLSVBfTEFZ RVIgcHJlc2VudCIpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlu ZGljZXNfdG9fY29tcG9zaXRlLnB1c2hfYmFjayhpZHgpOwotICAgICAgICBjb250aW51ZTsKLSAg ICAgIH0KLQotICAgICAgaWYgKHNmX2xheWVyLT5jb21wb3NpdGlvblR5cGUgPT0gSFdDX09WRVJM QVkpCi0gICAgICAgIGluZGljZXNfdG9fY29tcG9zaXRlLnB1c2hfYmFjayhqKTsKLQotICAgICAg bGF5ZXIuYWNxdWlyZV9mZW5jZS5TZXQoc2ZfbGF5ZXItPmFjcXVpcmVGZW5jZUZkKTsKLSAgICAg IHNmX2xheWVyLT5hY3F1aXJlRmVuY2VGZCA9IC0xOwotCi0gICAgICBzdGQ6Om9zdHJpbmdzdHJl YW0gbGF5ZXJfZmVuY2VfZm9ybWF0dGVyOwotICAgICAgbGF5ZXJfZmVuY2VfZm9ybWF0dGVyIDw8 ICJyZWxlYXNlIGZlbmNlIGZvciBsYXllciAiIDw8IGogPDwgIiBvZiBkaXNwbGF5ICIKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICA8PCBpOwotICAgICAgc3RkOjpzdHJpbmcgbGF5ZXJfZmVu Y2VfZGVzY3JpcHRpb24obGF5ZXJfZmVuY2VfZm9ybWF0dGVyLnN0cigpKTsKLSAgICAgIGNoZWNr ZWRfb3V0cHV0X2ZlbmNlcy5lbXBsYWNlX2JhY2soJnNmX2xheWVyLT5yZWxlYXNlRmVuY2VGZCwK LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfZmVuY2VfZGVz Y3JpcHRpb24uY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgY3R4LT5kdW1teV90aW1lbGluZSk7Ci0gICAgICBsYXllci5yZWxlYXNlX2ZlbmNlID0gT3V0 cHV0RmQoJnNmX2xheWVyLT5yZWxlYXNlRmVuY2VGZCk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBp cyBhIGNhdGNoLWFsbCBpbiBjYXNlIHdlIGdldCBhIGZyYW1lIHdpdGhvdXQgYW55IG92ZXJsYXkg bGF5ZXJzLCBvcgotICAgIC8vIHNraXAgbGF5ZXJzLCBidXQgd2l0aCBhIHZhbHVlIGZiX3Rhcmdl dCBsYXllci4gVGhpcyBfc2hvdWxkbid0XyBoYXBwZW4sCi0gICAgLy8gYnV0IGl0J3Mgbm90IHJ1 bGVkIG91dCBieSB0aGUgaHdjIHNwZWNpZmljYXRpb24KLSAgICBpZiAoaW5kaWNlc190b19jb21w b3NpdGUuZW1wdHkoKSAmJiBmcmFtZWJ1ZmZlcl90YXJnZXRfaW5kZXggPj0gMCkgewotICAgICAg aHdjX2xheWVyXzFfdCAqc2ZfbGF5ZXIgPSAmZGMtPmh3TGF5ZXJzW2ZyYW1lYnVmZmVyX3Rhcmdl dF9pbmRleF07Ci0gICAgICBpZiAoIXNmX2xheWVyLT5oYW5kbGUgfHwgKHNmX2xheWVyLT5mbGFn cyAmIEhXQ19TS0lQX0xBWUVSKSkgewotICAgICAgICBBTE9HRSgKLSAgICAgICAgICAgICJFeHBl Y3RlZCB2YWxpZCBsYXllciB3aXRoIEhXQ19GUkFNRUJVRkZFUl9UQVJHRVQgd2hlbiBhbGwgIgot ICAgICAgICAgICAgIkhXQ19PVkVSTEFZIGxheWVycyBhcmUgc2tpcHBlZC4iKTsKLSAgICAgICAg cmV0ID0gLUVJTlZBTDsKLSAgICAgIH0KLSAgICAgIGluZGljZXNfdG9fY29tcG9zaXRlLnB1c2hf YmFjayhmcmFtZWJ1ZmZlcl90YXJnZXRfaW5kZXgpOwotICAgIH0KLSAgfQotCi0gIGlmIChyZXQp Ci0gICAgcmV0dXJuIHJldDsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9kaXNwbGF5 czsgKytpKSB7Ci0gICAgaHdjX2Rpc3BsYXlfY29udGVudHNfMV90ICpkYyA9IHNmX2Rpc3BsYXlf Y29udGVudHNbaV07Ci0gICAgRHJtSHdjRGlzcGxheUNvbnRlbnRzICZkaXNwbGF5X2NvbnRlbnRz ID0gZGlzcGxheXNfY29udGVudHNbaV07Ci0gICAgaWYgKCFzZl9kaXNwbGF5X2NvbnRlbnRzW2ld IHx8IGkgPT0gSFdDX0RJU1BMQVlfVklSVFVBTCkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgbGF5 ZXJzX21hcC5lbXBsYWNlX2JhY2soKTsKLSAgICBEcm1Db21wb3NpdGlvbkRpc3BsYXlMYXllcnNN YXAgJm1hcCA9IGxheWVyc19tYXAuYmFjaygpOwotICAgIG1hcC5kaXNwbGF5ID0gaTsKLSAgICBt YXAuZ2VvbWV0cnlfY2hhbmdlZCA9Ci0gICAgICAgIChkYy0+ZmxhZ3MgJiBIV0NfR0VPTUVUUllf Q0hBTkdFRCkgPT0gSFdDX0dFT01FVFJZX0NIQU5HRUQ7Ci0gICAgc3RkOjp2ZWN0b3I8c2l6ZV90 PiAmaW5kaWNlc190b19jb21wb3NpdGUgPSBsYXllcnNfaW5kaWNlc1tpXTsKLSAgICBmb3IgKHNp emVfdCBqIDogaW5kaWNlc190b19jb21wb3NpdGUpIHsKLSAgICAgIGh3Y19sYXllcl8xX3QgKnNm X2xheWVyID0gJmRjLT5od0xheWVyc1tqXTsKLQotICAgICAgRHJtSHdjTGF5ZXIgJmxheWVyID0g ZGlzcGxheV9jb250ZW50cy5sYXllcnNbal07Ci0KLSAgICAgIHJldCA9IGxheWVyLkluaXRGcm9t SHdjTGF5ZXIoc2ZfbGF5ZXIsIGN0eC0+aW1wb3J0ZXIuZ2V0KCksIGN0eC0+Z3JhbGxvYyk7Ci0g ICAgICBpZiAocmV0KSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdCBjb21wb3NpdGlv biBmcm9tIGxheWVyICVkIiwgcmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgIH0KLSAg ICAgIG1hcC5sYXllcnMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShsYXllcikpOwotICAgIH0KLSAg fQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxEcm1Db21wb3NpdGlvbj4gY29tcG9zaXRpb24oCi0gICAg ICBjdHgtPmRybS5jb21wb3NpdG9yKCktPkNyZWF0ZUNvbXBvc2l0aW9uKGN0eC0+aW1wb3J0ZXIu Z2V0KCkpKTsKLSAgaWYgKCFjb21wb3NpdGlvbikgewotICAgIEFMT0dFKCJEcm0gY29tcG9zaXRp b24gaW5pdCBmYWlsZWQiKTsKLSAgICByZXR1cm4gLUVJTlZBTDsKLSAgfQotCi0gIHJldCA9IGNv bXBvc2l0aW9uLT5TZXRMYXllcnMobGF5ZXJzX21hcC5zaXplKCksIGxheWVyc19tYXAuZGF0YSgp KTsKLSAgaWYgKHJldCkgewotICAgIHJldHVybiAtRUlOVkFMOwotICB9Ci0KLSAgcmV0ID0gY3R4 LT5kcm0uY29tcG9zaXRvcigpLT5RdWV1ZUNvbXBvc2l0aW9uKHN0ZDo6bW92ZShjb21wb3NpdGlv bikpOwotICBpZiAocmV0KSB7Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci0gIH0KLQotICBmb3IgKHNp emVfdCBpID0gMDsgaSA8IG51bV9kaXNwbGF5czsgKytpKSB7Ci0gICAgaHdjX2Rpc3BsYXlfY29u dGVudHNfMV90ICpkYyA9IHNmX2Rpc3BsYXlfY29udGVudHNbaV07Ci0gICAgaWYgKCFkYykKLSAg ICAgIGNvbnRpbnVlOwotCi0gICAgc2l6ZV90IG51bV9kY19sYXllcnMgPSBkYy0+bnVtSHdMYXll cnM7Ci0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBudW1fZGNfbGF5ZXJzOyArK2opIHsKLSAg ICAgIGh3Y19sYXllcl8xX3QgKmxheWVyID0gJmRjLT5od0xheWVyc1tqXTsKLSAgICAgIGlmIChs YXllci0+ZmxhZ3MgJiBIV0NfU0tJUF9MQVlFUikKLSAgICAgICAgY29udGludWU7Ci0gICAgICBo d2NfYWRkX2xheWVyX3RvX3JldGlyZV9mZW5jZShsYXllciwgZGMpOwotICAgIH0KLSAgfQotCi0g IGNvbXBvc2l0aW9uLnJlc2V0KE5VTEwpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBp bnQgaHdjX2V2ZW50X2NvbnRyb2woc3RydWN0IGh3Y19jb21wb3Nlcl9kZXZpY2VfMSAqZGV2LCBp bnQgZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LCBpbnQg ZW5hYmxlZCkgewotICBpZiAoZXZlbnQgIT0gSFdDX0VWRU5UX1ZTWU5DIHx8IChlbmFibGVkICE9 IDAgJiYgZW5hYmxlZCAhPSAxKSkKLSAgICByZXR1cm4gLUVJTlZBTDsKLQotICBzdHJ1Y3QgaHdj X2NvbnRleHRfdCAqY3R4ID0gKHN0cnVjdCBod2NfY29udGV4dF90ICopJmRldi0+Y29tbW9uOwot ICBod2NfZHJtX2Rpc3BsYXlfdCAqaGQgPSAmY3R4LT5kaXNwbGF5c1tkaXNwbGF5XTsKLSAgaGQt PnZzeW5jX3dvcmtlci5WU3luY0NvbnRyb2woZW5hYmxlZCk7Ci0gIHJldHVybiAwOwotfQotCi1z dGF0aWMgaW50IGh3Y19zZXRfcG93ZXJfbW9kZShzdHJ1Y3QgaHdjX2NvbXBvc2VyX2RldmljZV8x ICpkZXYsIGludCBkaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1v ZGUpIHsKLSAgc3RydWN0IGh3Y19jb250ZXh0X3QgKmN0eCA9IChzdHJ1Y3QgaHdjX2NvbnRleHRf dCAqKSZkZXYtPmNvbW1vbjsKLQotICB1aW50NjRfdCBkcG1zVmFsdWUgPSAwOwotICBzd2l0Y2gg KG1vZGUpIHsKLSAgICBjYXNlIEhXQ19QT1dFUl9NT0RFX09GRjoKLSAgICAgIGRwbXNWYWx1ZSA9 IERSTV9NT0RFX0RQTVNfT0ZGOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBXZSBjYW4ndCBzdXBw b3J0IGRvemluZyByaWdodCBub3csIHNvIGdvIGZ1bGwgb24gKi8KLSAgICBjYXNlIEhXQ19QT1dF Ul9NT0RFX0RPWkU6Ci0gICAgY2FzZSBIV0NfUE9XRVJfTU9ERV9ET1pFX1NVU1BFTkQ6Ci0gICAg Y2FzZSBIV0NfUE9XRVJfTU9ERV9OT1JNQUw6Ci0gICAgICBkcG1zVmFsdWUgPSBEUk1fTU9ERV9E UE1TX09OOwotICAgICAgYnJlYWs7Ci0gIH07Ci0gIHJldHVybiBjdHgtPmRybS5TZXREcG1zTW9k ZShkaXNwbGF5LCBkcG1zVmFsdWUpOwotfQotCi1zdGF0aWMgaW50IGh3Y19xdWVyeShzdHJ1Y3Qg aHdjX2NvbXBvc2VyX2RldmljZV8xICogLyogZGV2ICovLCBpbnQgd2hhdCwKLSAgICAgICAgICAg ICAgICAgICAgIGludCAqdmFsdWUpIHsKLSAgc3dpdGNoICh3aGF0KSB7Ci0gICAgY2FzZSBIV0Nf QkFDS0dST1VORF9MQVlFUl9TVVBQT1JURUQ6Ci0gICAgICAqdmFsdWUgPSAwOyAvKiBUT0RPOiBX ZSBzaG91bGQgZG8gdGhpcyAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIV0NfVlNZTkNfUEVS SU9EOgotICAgICAgQUxPR1coIlF1ZXJ5IGZvciBkZXByZWNhdGVkIHZzeW5jIHZhbHVlLCByZXR1 cm5pbmcgNjBIeiIpOwotICAgICAgKnZhbHVlID0gMTAwMCAqIDEwMDAgKiAxMDAwIC8gNjA7Ci0g ICAgICBicmVhazsKLSAgICBjYXNlIEhXQ19ESVNQTEFZX1RZUEVTX1NVUFBPUlRFRDoKLSAgICAg ICp2YWx1ZSA9IEhXQ19ESVNQTEFZX1BSSU1BUllfQklUIHwgSFdDX0RJU1BMQVlfRVhURVJOQUxf QklUIHwKLSAgICAgICAgICAgICAgIEhXQ19ESVNQTEFZX1ZJUlRVQUxfQklUOwotICAgICAgYnJl YWs7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGh3Y19yZWdpc3Rlcl9wcm9j cyhzdHJ1Y3QgaHdjX2NvbXBvc2VyX2RldmljZV8xICpkZXYsCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgaHdjX3Byb2NzX3QgY29uc3QgKnByb2NzKSB7Ci0gIHN0cnVjdCBod2NfY29u dGV4dF90ICpjdHggPSAoc3RydWN0IGh3Y19jb250ZXh0X3QgKikmZGV2LT5jb21tb247Ci0KLSAg Y3R4LT5wcm9jcyA9IHByb2NzOwotCi0gIGZvciAoc3RkOjpwYWlyPGNvbnN0IGludCwgaHdjX2Ry bV9kaXNwbGF5PiAmZGlzcGxheV9lbnRyeSA6IGN0eC0+ZGlzcGxheXMpIHsKLSAgICBhdXRvIGNh bGxiYWNrID0gc3RkOjptYWtlX3NoYXJlZDxEcm1Wc3luY0NhbGxiYWNrPihwcm9jcyk7Ci0gICAg ZGlzcGxheV9lbnRyeS5zZWNvbmQudnN5bmNfd29ya2VyLlJlZ2lzdGVyQ2FsbGJhY2soc3RkOjpt b3ZlKGNhbGxiYWNrKSk7Ci0gIH0KLQotICBjdHgtPmhvdHBsdWdfaGFuZGxlci5Jbml0KCZjdHgt PmRybSwgcHJvY3MpOwotICBjdHgtPmRybS5ldmVudF9saXN0ZW5lcigpLT5SZWdpc3RlckhvdHBs dWdIYW5kbGVyKCZjdHgtPmhvdHBsdWdfaGFuZGxlcik7Ci19Ci0KLXN0YXRpYyBpbnQgaHdjX2dl dF9kaXNwbGF5X2NvbmZpZ3Moc3RydWN0IGh3Y19jb21wb3Nlcl9kZXZpY2VfMSAqZGV2LAotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlzcGxheSwgdWludDMyX3QgKmNv bmZpZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbnVtX2Nv bmZpZ3MpIHsKLSAgaWYgKCEqbnVtX2NvbmZpZ3MpCi0gICAgcmV0dXJuIDA7Ci0KLSAgc3RydWN0 IGh3Y19jb250ZXh0X3QgKmN0eCA9IChzdHJ1Y3QgaHdjX2NvbnRleHRfdCAqKSZkZXYtPmNvbW1v bjsKLSAgaHdjX2RybV9kaXNwbGF5X3QgKmhkID0gJmN0eC0+ZGlzcGxheXNbZGlzcGxheV07Ci0g IGhkLT5jb25maWdfaWRzLmNsZWFyKCk7Ci0KLSAgRHJtQ29ubmVjdG9yICpjb25uZWN0b3IgPSBj dHgtPmRybS5HZXRDb25uZWN0b3JGb3JEaXNwbGF5KGRpc3BsYXkpOwotICBpZiAoIWNvbm5lY3Rv cikgewotICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGNvbm5lY3RvciBmb3IgZGlzcGxheSAlZCIs IGRpc3BsYXkpOwotICAgIHJldHVybiAtRU5PREVWOwotICB9Ci0KLSAgaW50IHJldCA9IGNvbm5l Y3Rvci0+VXBkYXRlTW9kZXMoKTsKLSAgaWYgKHJldCkgewotICAgIEFMT0dFKCJGYWlsZWQgdG8g dXBkYXRlIGRpc3BsYXkgbW9kZXMgJWQiLCByZXQpOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLQot ICBmb3IgKGNvbnN0IERybU1vZGUgJm1vZGUgOiBjb25uZWN0b3ItPm1vZGVzKCkpIHsKLSAgICBz aXplX3QgaWR4ID0gaGQtPmNvbmZpZ19pZHMuc2l6ZSgpOwotICAgIGlmIChpZHggPT0gKm51bV9j b25maWdzKQotICAgICAgYnJlYWs7Ci0gICAgaGQtPmNvbmZpZ19pZHMucHVzaF9iYWNrKG1vZGUu aWQoKSk7Ci0gICAgY29uZmlnc1tpZHhdID0gbW9kZS5pZCgpOwotICB9Ci0gICpudW1fY29uZmln cyA9IGhkLT5jb25maWdfaWRzLnNpemUoKTsKLSAgcmV0dXJuICpudW1fY29uZmlncyA9PSAwID8g LTEgOiAwOwotfQotCi1zdGF0aWMgaW50IGh3Y19nZXRfZGlzcGxheV9hdHRyaWJ1dGVzKHN0cnVj dCBod2NfY29tcG9zZXJfZGV2aWNlXzEgKmRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgaW50IGRpc3BsYXksIHVpbnQzMl90IGNvbmZpZywKLSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKmF0dHJpYnV0ZXMsCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnZhbHVlcykgewotICBz dHJ1Y3QgaHdjX2NvbnRleHRfdCAqY3R4ID0gKHN0cnVjdCBod2NfY29udGV4dF90ICopJmRldi0+ Y29tbW9uOwotICBEcm1Db25uZWN0b3IgKmMgPSBjdHgtPmRybS5HZXRDb25uZWN0b3JGb3JEaXNw bGF5KGRpc3BsYXkpOwotICBpZiAoIWMpIHsKLSAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBEcm1D b25uZWN0b3IgZm9yIGRpc3BsYXkgJWQiLCBkaXNwbGF5KTsKLSAgICByZXR1cm4gLUVOT0RFVjsK LSAgfQotICBEcm1Nb2RlIG1vZGU7Ci0gIGZvciAoY29uc3QgRHJtTW9kZSAmY29ubl9tb2RlIDog Yy0+bW9kZXMoKSkgewotICAgIGlmIChjb25uX21vZGUuaWQoKSA9PSBjb25maWcpIHsKLSAgICAg IG1vZGUgPSBjb25uX21vZGU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKG1vZGUu aWQoKSA9PSAwKSB7Ci0gICAgQUxPR0UoIkZhaWxlZCB0byBmaW5kIGFjdGl2ZSBtb2RlIGZvciBk aXNwbGF5ICVkIiwgZGlzcGxheSk7Ci0gICAgcmV0dXJuIC1FTk9FTlQ7Ci0gIH0KLQotICB1aW50 MzJfdCBtbV93aWR0aCA9IGMtPm1tX3dpZHRoKCk7Ci0gIHVpbnQzMl90IG1tX2hlaWdodCA9IGMt Pm1tX2hlaWdodCgpOwotICBmb3IgKGludCBpID0gMDsgYXR0cmlidXRlc1tpXSAhPSBIV0NfRElT UExBWV9OT19BVFRSSUJVVEU7ICsraSkgewotICAgIHN3aXRjaCAoYXR0cmlidXRlc1tpXSkgewot ICAgICAgY2FzZSBIV0NfRElTUExBWV9WU1lOQ19QRVJJT0Q6Ci0gICAgICAgIHZhbHVlc1tpXSA9 IDEwMDAgKiAxMDAwICogMTAwMCAvIG1vZGUudl9yZWZyZXNoKCk7Ci0gICAgICAgIGJyZWFrOwot ICAgICAgY2FzZSBIV0NfRElTUExBWV9XSURUSDoKLSAgICAgICAgdmFsdWVzW2ldID0gbW9kZS5o X2Rpc3BsYXkoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEhXQ19ESVNQTEFZX0hFSUdI VDoKLSAgICAgICAgdmFsdWVzW2ldID0gbW9kZS52X2Rpc3BsYXkoKTsKLSAgICAgICAgYnJlYWs7 Ci0gICAgICBjYXNlIEhXQ19ESVNQTEFZX0RQSV9YOgotICAgICAgICAvKiBEb3RzIHBlciAxMDAw IGluY2hlcyAqLwotICAgICAgICB2YWx1ZXNbaV0gPSBtbV93aWR0aCA/IChtb2RlLmhfZGlzcGxh eSgpICogVU1fUEVSX0lOQ0gpIC8gbW1fd2lkdGggOiAwOwotICAgICAgICBicmVhazsKLSAgICAg IGNhc2UgSFdDX0RJU1BMQVlfRFBJX1k6Ci0gICAgICAgIC8qIERvdHMgcGVyIDEwMDAgaW5jaGVz ICovCi0gICAgICAgIHZhbHVlc1tpXSA9Ci0gICAgICAgICAgICBtbV9oZWlnaHQgPyAobW9kZS52 X2Rpc3BsYXkoKSAqIFVNX1BFUl9JTkNIKSAvIG1tX2hlaWdodCA6IDA7Ci0gICAgICAgIGJyZWFr OwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBod2NfZ2V0X2FjdGl2 ZV9jb25maWcoc3RydWN0IGh3Y19jb21wb3Nlcl9kZXZpY2VfMSAqZGV2LAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3BsYXkpIHsKLSAgc3RydWN0IGh3Y19jb250ZXh0 X3QgKmN0eCA9IChzdHJ1Y3QgaHdjX2NvbnRleHRfdCAqKSZkZXYtPmNvbW1vbjsKLSAgRHJtQ29u bmVjdG9yICpjID0gY3R4LT5kcm0uR2V0Q29ubmVjdG9yRm9yRGlzcGxheShkaXNwbGF5KTsKLSAg aWYgKCFjKSB7Ci0gICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgRHJtQ29ubmVjdG9yIGZvciBkaXNw bGF5ICVkIiwgZGlzcGxheSk7Ci0gICAgcmV0dXJuIC1FTk9ERVY7Ci0gIH0KLQotICBEcm1Nb2Rl IG1vZGUgPSBjLT5hY3RpdmVfbW9kZSgpOwotICBod2NfZHJtX2Rpc3BsYXlfdCAqaGQgPSAmY3R4 LT5kaXNwbGF5c1tkaXNwbGF5XTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZC0+Y29uZmln X2lkcy5zaXplKCk7ICsraSkgewotICAgIGlmIChoZC0+Y29uZmlnX2lkc1tpXSA9PSBtb2RlLmlk KCkpCi0gICAgICByZXR1cm4gaTsKLSAgfQotICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQg aHdjX3NldF9hY3RpdmVfY29uZmlnKHN0cnVjdCBod2NfY29tcG9zZXJfZGV2aWNlXzEgKmRldiwg aW50IGRpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgp IHsKLSAgc3RydWN0IGh3Y19jb250ZXh0X3QgKmN0eCA9IChzdHJ1Y3QgaHdjX2NvbnRleHRfdCAq KSZkZXYtPmNvbW1vbjsKLSAgaHdjX2RybV9kaXNwbGF5X3QgKmhkID0gJmN0eC0+ZGlzcGxheXNb ZGlzcGxheV07Ci0gIGlmIChpbmRleCA+PSAoaW50KWhkLT5jb25maWdfaWRzLnNpemUoKSkgewot ICAgIEFMT0dFKCJJbnZhbGlkIGNvbmZpZyBpbmRleCAlZCBwYXNzZWQgaW4iLCBpbmRleCk7Ci0g ICAgcmV0dXJuIC1FSU5WQUw7Ci0gIH0KLQotICBEcm1Db25uZWN0b3IgKmMgPSBjdHgtPmRybS5H ZXRDb25uZWN0b3JGb3JEaXNwbGF5KGRpc3BsYXkpOwotICBpZiAoIWMpIHsKLSAgICBBTE9HRSgi RmFpbGVkIHRvIGdldCBjb25uZWN0b3IgZm9yIGRpc3BsYXkgJWQiLCBkaXNwbGF5KTsKLSAgICBy ZXR1cm4gLUVOT0RFVjsKLSAgfQotCi0gIGlmIChjLT5zdGF0ZSgpICE9IERSTV9NT0RFX0NPTk5F Q1RFRCkKLSAgICByZXR1cm4gLUVOT0RFVjsKLQotICBEcm1Nb2RlIG1vZGU7Ci0gIGZvciAoY29u c3QgRHJtTW9kZSAmY29ubl9tb2RlIDogYy0+bW9kZXMoKSkgewotICAgIGlmIChjb25uX21vZGUu aWQoKSA9PSBoZC0+Y29uZmlnX2lkc1tpbmRleF0pIHsKLSAgICAgIG1vZGUgPSBjb25uX21vZGU7 Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKG1vZGUuaWQoKSAhPSBoZC0+Y29uZmln X2lkc1tpbmRleF0pIHsKLSAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgYWN0aXZlIG1vZGUgZm9y ICVkLyVkIiwgaW5kZXgsIGhkLT5jb25maWdfaWRzW2luZGV4XSk7Ci0gICAgcmV0dXJuIC1FTk9F TlQ7Ci0gIH0KLSAgaW50IHJldCA9IGN0eC0+ZHJtLlNldERpc3BsYXlBY3RpdmVNb2RlKGRpc3Bs YXksIG1vZGUpOwotICBpZiAocmV0KSB7Ci0gICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgYWN0aXZl IGNvbmZpZyAlZCIsIHJldCk7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotICByZXQgPSBjdHgtPmRy bS5TZXREcG1zTW9kZShkaXNwbGF5LCBEUk1fTU9ERV9EUE1TX09OKTsKLSAgaWYgKHJldCkgewot ICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGRwbXMgbW9kZSBvbiAlZCIsIHJldCk7Ci0gICAgcmV0 dXJuIHJldDsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGh3Y19kZXZpY2Vf Y2xvc2Uoc3RydWN0IGh3X2RldmljZV90ICpkZXYpIHsKLSAgc3RydWN0IGh3Y19jb250ZXh0X3Qg KmN0eCA9IChzdHJ1Y3QgaHdjX2NvbnRleHRfdCAqKWRldjsKLSAgZGVsZXRlIGN0eDsKLSAgcmV0 dXJuIDA7Ci19Ci0KLS8qCi0gKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGFjdGl2ZSBj b25maWcgdG8gdGhlIGZpcnN0IG9uZSBpbiB0aGUgbGlzdC4gVGhpcwotICogc2hvdWxkIGJlIGZp eGVkIHN1Y2ggdGhhdCBpdCBzZWxlY3RzIHRoZSBwcmVmZXJyZWQgbW9kZSBmb3IgdGhlIGRpc3Bs YXksIG9yCi0gKiBzb21lIG90aGVyLCBzYW5lciwgbWV0aG9kIG9mIGNob29zaW5nIHRoZSBjb25m aWcuCi0gKi8KLXN0YXRpYyBpbnQgaHdjX3NldF9pbml0aWFsX2NvbmZpZyhod2NfZHJtX2Rpc3Bs YXlfdCAqaGQpIHsKLSAgdWludDMyX3QgY29uZmlnOwotICBzaXplX3QgbnVtX2NvbmZpZ3MgPSAx OwotICBpbnQgcmV0ID0gaHdjX2dldF9kaXNwbGF5X2NvbmZpZ3MoJmhkLT5jdHgtPmRldmljZSwg aGQtPmRpc3BsYXksICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAmbnVtX2NvbmZpZ3MpOwotICBpZiAocmV0IHx8ICFudW1fY29uZmlncykKLSAgICByZXR1cm4g MDsKLQotICByZXQgPSBod2Nfc2V0X2FjdGl2ZV9jb25maWcoJmhkLT5jdHgtPmRldmljZSwgaGQt PmRpc3BsYXksIDApOwotICBpZiAocmV0KSB7Ci0gICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgYWN0 aXZlIGNvbmZpZyBkPSVkIHJldD0lZCIsIGhkLT5kaXNwbGF5LCByZXQpOwotICAgIHJldHVybiBy ZXQ7Ci0gIH0KLQotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGh3Y19pbml0aWFsaXpl X2Rpc3BsYXkoc3RydWN0IGh3Y19jb250ZXh0X3QgKmN0eCwgaW50IGRpc3BsYXkpIHsKLSAgaHdj X2RybV9kaXNwbGF5X3QgKmhkID0gJmN0eC0+ZGlzcGxheXNbZGlzcGxheV07Ci0gIGhkLT5jdHgg PSBjdHg7Ci0gIGhkLT5kaXNwbGF5ID0gZGlzcGxheTsKLQotICBpbnQgcmV0ID0gaHdjX3NldF9p bml0aWFsX2NvbmZpZyhoZCk7Ci0gIGlmIChyZXQpIHsKLSAgICBBTE9HRSgiRmFpbGVkIHRvIHNl dCBpbml0aWFsIGNvbmZpZyBmb3IgZD0lZCByZXQ9JWQiLCBkaXNwbGF5LCByZXQpOwotICAgIHJl dHVybiByZXQ7Ci0gIH0KLQotICByZXQgPSBoZC0+dnN5bmNfd29ya2VyLkluaXQoJmN0eC0+ZHJt LCBkaXNwbGF5KTsKLSAgaWYgKHJldCkgewotICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGV2 ZW50IHdvcmtlciBmb3IgZGlzcGxheSAlZCAlZFxuIiwgZGlzcGxheSwgcmV0KTsKLSAgICByZXR1 cm4gcmV0OwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaHdjX2VudW1lcmF0 ZV9kaXNwbGF5cyhzdHJ1Y3QgaHdjX2NvbnRleHRfdCAqY3R4KSB7Ci0gIGludCByZXQ7Ci0gIGZv ciAoYXV0byAmY29ubiA6IGN0eC0+ZHJtLmNvbm5lY3RvcnMoKSkgewotICAgIHJldCA9IGh3Y19p bml0aWFsaXplX2Rpc3BsYXkoY3R4LCBjb25uLT5kaXNwbGF5KCkpOwotICAgIGlmIChyZXQpIHsK LSAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkaXNwbGF5ICVkIiwgY29ubi0+ZGlz cGxheSgpKTsKLSAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICB9Ci0KLSAgcmV0ID0gY3R4LT52 aXJ0dWFsX2NvbXBvc2l0b3Jfd29ya2VyLkluaXQoKTsKLSAgaWYgKHJldCkgewotICAgIEFMT0dF KCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB2aXJ0dWFsIGNvbXBvc2l0b3Igd29ya2VyIik7Ci0gICAg cmV0dXJuIHJldDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBod2NfZGV2aWNl X29wZW4oY29uc3Qgc3RydWN0IGh3X21vZHVsZV90ICptb2R1bGUsIGNvbnN0IGNoYXIgKm5hbWUs Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaHdfZGV2aWNlX3QgKipkZXYpIHsK LSAgaWYgKHN0cmNtcChuYW1lLCBIV0NfSEFSRFdBUkVfQ09NUE9TRVIpKSB7Ci0gICAgQUxPR0Uo IkludmFsaWQgbW9kdWxlIG5hbWUtICVzIiwgbmFtZSk7Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci0g IH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8aHdjX2NvbnRleHRfdD4gY3R4KG5ldyBod2NfY29udGV4 dF90KCkpOwotICBpZiAoIWN0eCkgewotICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgaHdj IGNvbnRleHQiKTsKLSAgICByZXR1cm4gLUVOT01FTTsKLSAgfQotCi0gIGludCByZXQgPSBjdHgt PmRybS5Jbml0KCk7Ci0gIGlmIChyZXQpIHsKLSAgICBBTE9HRSgiQ2FuJ3QgaW5pdGlhbGl6ZSBE cm0gb2JqZWN0ICVkIiwgcmV0KTsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgcmV0ID0gaHdf Z2V0X21vZHVsZShHUkFMTE9DX0hBUkRXQVJFX01PRFVMRV9JRCwKLSAgICAgICAgICAgICAgICAg ICAgICAoY29uc3QgaHdfbW9kdWxlX3QgKiopJmN0eC0+Z3JhbGxvYyk7Ci0gIGlmIChyZXQpIHsK LSAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gZ3JhbGxvYyBtb2R1bGUgJWQiLCByZXQpOwotICAg IHJldHVybiByZXQ7Ci0gIH0KLQotICByZXQgPSBjdHgtPmR1bW15X3RpbWVsaW5lLkluaXQoKTsK LSAgaWYgKHJldCkgewotICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGR1bW15IHN3IHN5bmMg dGltZWxpbmUgJWQiLCByZXQpOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBjdHgtPmltcG9y dGVyLnJlc2V0KEltcG9ydGVyOjpDcmVhdGVJbnN0YW5jZSgmY3R4LT5kcm0pKTsKLSAgaWYgKCFj dHgtPmltcG9ydGVyKSB7Ci0gICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgaW1wb3J0ZXIgaW5z dGFuY2UiKTsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgcmV0ID0gaHdjX2VudW1lcmF0ZV9k aXNwbGF5cyhjdHguZ2V0KCkpOwotICBpZiAocmV0KSB7Ci0gICAgQUxPR0UoIkZhaWxlZCB0byBl bnVtZXJhdGUgZGlzcGxheXM6ICVzIiwgc3RyZXJyb3IocmV0KSk7Ci0gICAgcmV0dXJuIHJldDsK LSAgfQotCi0gIGN0eC0+ZGV2aWNlLmNvbW1vbi50YWcgPSBIQVJEV0FSRV9ERVZJQ0VfVEFHOwot ICBjdHgtPmRldmljZS5jb21tb24udmVyc2lvbiA9IEhXQ19ERVZJQ0VfQVBJX1ZFUlNJT05fMV80 OwotICBjdHgtPmRldmljZS5jb21tb24ubW9kdWxlID0gY29uc3RfY2FzdDxod19tb2R1bGVfdCAq Pihtb2R1bGUpOwotICBjdHgtPmRldmljZS5jb21tb24uY2xvc2UgPSBod2NfZGV2aWNlX2Nsb3Nl OwotCi0gIGN0eC0+ZGV2aWNlLmR1bXAgPSBod2NfZHVtcDsKLSAgY3R4LT5kZXZpY2UucHJlcGFy ZSA9IGh3Y19wcmVwYXJlOwotICBjdHgtPmRldmljZS5zZXQgPSBod2Nfc2V0OwotICBjdHgtPmRl dmljZS5ldmVudENvbnRyb2wgPSBod2NfZXZlbnRfY29udHJvbDsKLSAgY3R4LT5kZXZpY2Uuc2V0 UG93ZXJNb2RlID0gaHdjX3NldF9wb3dlcl9tb2RlOwotICBjdHgtPmRldmljZS5xdWVyeSA9IGh3 Y19xdWVyeTsKLSAgY3R4LT5kZXZpY2UucmVnaXN0ZXJQcm9jcyA9IGh3Y19yZWdpc3Rlcl9wcm9j czsKLSAgY3R4LT5kZXZpY2UuZ2V0RGlzcGxheUNvbmZpZ3MgPSBod2NfZ2V0X2Rpc3BsYXlfY29u ZmlnczsKLSAgY3R4LT5kZXZpY2UuZ2V0RGlzcGxheUF0dHJpYnV0ZXMgPSBod2NfZ2V0X2Rpc3Bs YXlfYXR0cmlidXRlczsKLSAgY3R4LT5kZXZpY2UuZ2V0QWN0aXZlQ29uZmlnID0gaHdjX2dldF9h Y3RpdmVfY29uZmlnOwotICBjdHgtPmRldmljZS5zZXRBY3RpdmVDb25maWcgPSBod2Nfc2V0X2Fj dGl2ZV9jb25maWc7Ci0gIGN0eC0+ZGV2aWNlLnNldEN1cnNvclBvc2l0aW9uQXN5bmMgPSBOVUxM OyAvKiBUT0RPOiBBZGQgY3Vyc29yICovCi0KLSAgKmRldiA9ICZjdHgtPmRldmljZS5jb21tb247 Ci0gIGN0eC5yZWxlYXNlKCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qg aHdfbW9kdWxlX21ldGhvZHNfdCBod2NfbW9kdWxlX21ldGhvZHMgPSB7Ci0gIC5vcGVuID0gYW5k cm9pZDo6aHdjX2RldmljZV9vcGVuCi19OwotCi1od2NfbW9kdWxlX3QgSEFMX01PRFVMRV9JTkZP X1NZTSA9IHsKLSAgLmNvbW1vbiA9IHsKLSAgICAudGFnID0gSEFSRFdBUkVfTU9EVUxFX1RBRywK LSAgICAudmVyc2lvbl9tYWpvciA9IDEsCi0gICAgLnZlcnNpb25fbWlub3IgPSAwLAotICAgIC5p ZCA9IEhXQ19IQVJEV0FSRV9NT0RVTEVfSUQsCi0gICAgLm5hbWUgPSAiRFJNIGh3Y29tcG9zZXIg bW9kdWxlIiwKLSAgICAuYXV0aG9yID0gIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3Qi LAotICAgIC5tZXRob2RzID0gJmh3Y19tb2R1bGVfbWV0aG9kcywKLSAgICAuZHNvID0gTlVMTCwK LSAgICAucmVzZXJ2ZWQgPSB7MH0sCi0gIH0KLX07CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS5jcHAg Yi9wbGF0Zm9ybS5jcHAKaW5kZXggNjJiMDNhODgxZGNhLi5iNmMzOWQwNWEzYTEgMTAwNjQ0Ci0t LSBhL3BsYXRmb3JtLmNwcAorKysgYi9wbGF0Zm9ybS5jcHAKQEAgLTM3LDcgKzM3LDcgQEAgc3Rk Ojp2ZWN0b3I8RHJtUGxhbmUgKj4gUGxhbm5lcjo6R2V0VXNhYmxlUGxhbmVzKAogfQogCiBzdGQ6 OnR1cGxlPGludCwgc3RkOjp2ZWN0b3I8RHJtQ29tcG9zaXRpb25QbGFuZT4+IFBsYW5uZXI6OlBy b3Zpc2lvblBsYW5lcygKLSAgICBzdGQ6Om1hcDxzaXplX3QsIERybUh3Y0xheWVyICo+ICZsYXll cnMsIGJvb2wgdXNlX3NxdWFzaF9mYiwgRHJtQ3J0YyAqY3J0YywKKyAgICBzdGQ6Om1hcDxzaXpl X3QsIERybUh3Y0xheWVyICo+ICZsYXllcnMsIERybUNydGMgKmNydGMsCiAgICAgc3RkOjp2ZWN0 b3I8RHJtUGxhbmUgKj4gKnByaW1hcnlfcGxhbmVzLAogICAgIHN0ZDo6dmVjdG9yPERybVBsYW5l ICo+ICpvdmVybGF5X3BsYW5lcykgewogICBzdGQ6OnZlY3RvcjxEcm1Db21wb3NpdGlvblBsYW5l PiBjb21wb3NpdGlvbjsKQEAgLTQ4LDMwICs0OCw2IEBAIHN0ZDo6dHVwbGU8aW50LCBzdGQ6OnZl Y3RvcjxEcm1Db21wb3NpdGlvblBsYW5lPj4gUGxhbm5lcjo6UHJvdmlzaW9uUGxhbmVzKAogICAg IHJldHVybiBzdGQ6Om1ha2VfdHVwbGUoLUVOT0RFViwgc3RkOjp2ZWN0b3I8RHJtQ29tcG9zaXRp b25QbGFuZT4oKSk7CiAgIH0KIAotICAvLyBJZiBuZWVkZWQsIHJlc2VydmUgdGhlIHNxdWFzaCBw bGFuZSBhdCB0aGUgaGlnaGVzdCB6LW9yZGVyCi0gIERybVBsYW5lICpzcXVhc2hfcGxhbmUgPSBO VUxMOwotICBpZiAodXNlX3NxdWFzaF9mYikgewotICAgIGlmICghcGxhbmVzLmVtcHR5KCkpIHsK LSAgICAgIHNxdWFzaF9wbGFuZSA9IHBsYW5lcy5iYWNrKCk7Ci0gICAgICBwbGFuZXMucG9wX2Jh Y2soKTsKLSAgICB9IGVsc2UgewotICAgICAgQUxPR0koIk5vdCBlbm91Z2ggcGxhbmVzIHRvIHJl c2VydmUgZm9yIHNxdWFzaCBmYiIpOwotICAgIH0KLSAgfQotCi0gIC8vIElmIG5lZWRlZCwgcmVz ZXJ2ZSB0aGUgcHJlY29tcCBwbGFuZSBhdCB0aGUgbmV4dCBoaWdoZXN0IHotb3JkZXIKLSAgRHJt UGxhbmUgKnByZWNvbXBfcGxhbmUgPSBOVUxMOwotICBpZiAobGF5ZXJzLnNpemUoKSA+IHBsYW5l cy5zaXplKCkpIHsKLSAgICBpZiAoIXBsYW5lcy5lbXB0eSgpKSB7Ci0gICAgICBwcmVjb21wX3Bs YW5lID0gcGxhbmVzLmJhY2soKTsKLSAgICAgIHBsYW5lcy5wb3BfYmFjaygpOwotICAgICAgY29t cG9zaXRpb24uZW1wbGFjZV9iYWNrKERybUNvbXBvc2l0aW9uUGxhbmU6OlR5cGU6OmtQcmVjb21w LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNvbXBfcGxhbmUsIGNydGMpOwot ICAgIH0gZWxzZSB7Ci0gICAgICBBTE9HRSgiTm90IGVub3VnaCBwbGFuZXMgdG8gcmVzZXJ2ZSBm b3IgcHJlY29tcCBmYiIpOwotICAgIH0KLSAgfQotCiAgIC8vIEdvIHRocm91Z2ggdGhlIHByb3Zp c2lvbmluZyBzdGFnZXMgYW5kIHByb3Zpc2lvbiBwbGFuZXMKICAgZm9yIChhdXRvICZpIDogc3Rh Z2VzXykgewogICAgIGludCByZXQgPSBpLT5Qcm92aXNpb25QbGFuZXMoJmNvbXBvc2l0aW9uLCBs YXllcnMsIGNydGMsICZwbGFuZXMpOwpAQCAtODEsMTAgKzU3LDYgQEAgc3RkOjp0dXBsZTxpbnQs IHN0ZDo6dmVjdG9yPERybUNvbXBvc2l0aW9uUGxhbmU+PiBQbGFubmVyOjpQcm92aXNpb25QbGFu ZXMoCiAgICAgfQogICB9CiAKLSAgaWYgKHNxdWFzaF9wbGFuZSkKLSAgICBjb21wb3NpdGlvbi5l bXBsYWNlX2JhY2soRHJtQ29tcG9zaXRpb25QbGFuZTo6VHlwZTo6a1NxdWFzaCwgc3F1YXNoX3Bs YW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnRjKTsKLQogICByZXR1cm4gc3Rk OjptYWtlX3R1cGxlKDAsIHN0ZDo6bW92ZShjb21wb3NpdGlvbikpOwogfQogCkBAIC0xMDksNjIg KzgxLDYgQEAgaW50IFBsYW5TdGFnZVByb3RlY3RlZDo6UHJvdmlzaW9uUGxhbmVzKAogICAgIGkg PSBsYXllcnMuZXJhc2UoaSk7CiAgIH0KIAotICBpZiAocHJvdGVjdGVkX3pvcmRlciA9PSAtMSkK LSAgICByZXR1cm4gMDsKLQotICAvLyBBZGQgYW55IGxheWVycyBiZWxvdyB0aGUgcHJvdGVjdGVk IGNvbnRlbnQgdG8gdGhlIHByZWNvbXBvc2l0aW9uIHNpbmNlIHdlCi0gIC8vIG5lZWQgdG8gcHVu Y2ggYSBob2xlIHRocm91Z2ggdGhlbS4KLSAgZm9yIChhdXRvIGkgPSBsYXllcnMuYmVnaW4oKTsg aSAhPSBsYXllcnMuZW5kKCk7KSB7Ci0gICAgLy8gU2tpcCBsYXllcnMgYWJvdmUgdGhlIHotb3Jk ZXIgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50Ci0gICAgaWYgKGktPmZpcnN0ID4gc3RhdGljX2Nh c3Q8c2l6ZV90Pihwcm90ZWN0ZWRfem9yZGVyKSkgewotICAgICAgKytpOwotICAgICAgY29udGlu dWU7Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlcmUncyBubyBwcmVjb21wIGxheWVyIGFscmVhZHkg cXVldWVkLCBxdWV1ZSBvbmUgbm93LgotICAgIERybUNvbXBvc2l0aW9uUGxhbmUgKnByZWNvbXAg PSBHZXRQcmVjb21wKGNvbXBvc2l0aW9uKTsKLSAgICBpZiAocHJlY29tcCkgewotICAgICAgcHJl Y29tcC0+c291cmNlX2xheWVycygpLmVtcGxhY2VfYmFjayhpLT5maXJzdCk7Ci0gICAgfSBlbHNl IHsKLSAgICAgIGlmICghcGxhbmVzLT5lbXB0eSgpKSB7Ci0gICAgICAgIERybVBsYW5lICpwcmVj b21wX3BsYW5lID0gcGxhbmVzLT5iYWNrKCk7Ci0gICAgICAgIHBsYW5lcy0+cG9wX2JhY2soKTsK LSAgICAgICAgY29tcG9zaXRpb24tPmVtcGxhY2VfYmFjayhEcm1Db21wb3NpdGlvblBsYW5lOjpU eXBlOjprUHJlY29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjb21w X3BsYW5lLCBjcnRjLCBpLT5maXJzdCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgi Tm90IGVub3VnaCBwbGFuZXMgdG8gcmVzZXJ2ZSBmb3IgcHJlY29tcCBmYiIpOwotICAgICAgfQot ICAgIH0KLSAgICBpID0gbGF5ZXJzLmVyYXNlKGkpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1p bnQgUGxhblN0YWdlUHJlY29tcDo6UHJvdmlzaW9uUGxhbmVzKAotICAgIHN0ZDo6dmVjdG9yPERy bUNvbXBvc2l0aW9uUGxhbmU+ICpjb21wb3NpdGlvbiwKLSAgICBzdGQ6Om1hcDxzaXplX3QsIERy bUh3Y0xheWVyICo+ICZsYXllcnMsIERybUNydGMgKiAvKmNydGMqLywKLSAgICBzdGQ6OnZlY3Rv cjxEcm1QbGFuZSAqPiAqIC8qcGxhbmVzKi8pIHsKLSAgRHJtQ29tcG9zaXRpb25QbGFuZSAqcHJl Y29tcCA9IEdldFByZWNvbXAoY29tcG9zaXRpb24pOwotICBpZiAoIXByZWNvbXAgfHwgcHJlY29t cC0+c291cmNlX2xheWVycygpLmVtcHR5KCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLy8gRmluZCBs b3dlc3Qgem9yZGVyIG91dCBvZiBwcmVjb21wIGxheWVycwotICBzaXplX3QgcHJlY29tcF96b3Jk ZXIgPSAqc3RkOjptaW5fZWxlbWVudCgKLSAgICAgIHByZWNvbXAtPnNvdXJjZV9sYXllcnMoKS5i ZWdpbigpLCBwcmVjb21wLT5zb3VyY2VfbGF5ZXJzKCkuZW5kKCksCi0gICAgICBbXShzaXplX3Qg YSwgc2l6ZV90IGIpIHsgcmV0dXJuIGEgPCBiOyB9KTsKLQotICAvLyBpZiB0aGVyZSBhcmUgYW55 IHJlbWFpbmluZyBsYXllcnMgb24gdG9wIG9mIGFueSBvZiB0aGUgcHJlY29tcCBsYXllcnMsCi0g IC8vIGFkZCB0aGVtIHRvIHByZWNvbXAgdG8gYXZvaWQgYmxlbmRpbmcgaXNzdWVzIHNpbmNlIHBy ZWNvbXAgaXMgYWx3YXlzIGF0Ci0gIC8vIGhpZ2hlc3Qgem9yZGVyCi0gIGZvciAoYXV0byBpID0g bGF5ZXJzLmJlZ2luKCk7IGkgIT0gbGF5ZXJzLmVuZCgpOykgewotICAgIGlmIChpLT5maXJzdCA8 IHByZWNvbXBfem9yZGVyKSB7Ci0gICAgICBpKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0g ICAgcHJlY29tcC0+c291cmNlX2xheWVycygpLmVtcGxhY2VfYmFjayhpLT5maXJzdCk7Ci0gICAg aSA9IGxheWVycy5lcmFzZShpKTsKLSAgfQotCiAgIHJldHVybiAwOwogfQogCkBAIC0xODMsMTMg Kzk5LDYgQEAgaW50IFBsYW5TdGFnZUdyZWVkeTo6UHJvdmlzaW9uUGxhbmVzKAogICAgICAgQUxP R0UoIkZhaWxlZCB0byBlbXBsYWNlIGxheWVyICV6dSwgZHJvcHBpbmcgaXQiLCBpLT5maXJzdCk7 CiAgIH0KIAotICAvLyBQdXQgdGhlIHJlc3Qgb2YgdGhlIGxheWVycyBpbiB0aGUgcHJlY29tcCBw bGFuZQotICBEcm1Db21wb3NpdGlvblBsYW5lICpwcmVjb21wID0gR2V0UHJlY29tcChjb21wb3Np dGlvbik7Ci0gIGlmIChwcmVjb21wKSB7Ci0gICAgZm9yIChhdXRvIGkgPSBsYXllcnMuYmVnaW4o KTsgaSAhPSBsYXllcnMuZW5kKCk7IGkgPSBsYXllcnMuZXJhc2UoaSkpCi0gICAgICBwcmVjb21w LT5zb3VyY2VfbGF5ZXJzKCkuZW1wbGFjZV9iYWNrKGktPmZpcnN0KTsKLSAgfQotCiAgIHJldHVy biAwOwogfQogfQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0uaCBiL3BsYXRmb3JtLmgKaW5kZXggZTQx N2JmNzg1YTJjLi42MzlhYzg4NGJhM2YgMTAwNjQ0Ci0tLSBhL3BsYXRmb3JtLmgKKysrIGIvcGxh dGZvcm0uaApAQCAtMzgsMTAgKzM4LDYgQEAgY2xhc3MgSW1wb3J0ZXIgewogICAvLyBDcmVhdGVz IGEgcGxhdGZvcm0tc3BlY2lmaWMgaW1wb3J0ZXIgaW5zdGFuY2UKICAgc3RhdGljIEltcG9ydGVy ICpDcmVhdGVJbnN0YW5jZShEcm1SZXNvdXJjZXMgKmRybSk7CiAKLSAgLy8gSW1wb3J0cyBFR0xJ bWFnZSBmb3IgZ2xjb21wb3NpdG9yLCBzaW5jZSBOViBoYW5kbGVzIHRoaXMgaW4gbm9uLXN0YW5k YXJkCi0gIC8vIHdheSwgYW5kIGZpc2hpbmcgb3V0IHRoZSBkZXRhaWxzIGlzIHNwZWNpZmljIHRv IHRoZSBncmFsbG9jIHVzZWQuCi0gIHZpcnR1YWwgRUdMSW1hZ2VLSFIgSW1wb3J0SW1hZ2UoRUdM RGlzcGxheSBlZ2xfZGlzcGxheSwgYnVmZmVyX2hhbmRsZV90IGhhbmRsZSkgPSAwOwotCiAgIC8v IEltcG9ydHMgdGhlIGJ1ZmZlciByZWZlcnJlZCB0byBieSBoYW5kbGUgaW50byBiby4KICAgLy8K ICAgLy8gTm90ZTogVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkIHRo YW4gUmVsZWFzZUJ1ZmZlci4gVGhlCkBAIC03NywxNyArNzMsNyBAQCBjbGFzcyBQbGFubmVyIHsK ICAgICAgIHJldHVybiBwbGFuZTsKICAgICB9CiAKLSAgICAvLyBGaW5kcyBhbmQgcmV0dXJucyB0 aGUgc3F1YXNoIGxheWVyIGZyb20gdGhlIGNvbXBvc2l0aW9uCi0gICAgc3RhdGljIERybUNvbXBv c2l0aW9uUGxhbmUgKkdldFByZWNvbXAoCi0gICAgICAgIHN0ZDo6dmVjdG9yPERybUNvbXBvc2l0 aW9uUGxhbmU+ICpjb21wb3NpdGlvbikgewotICAgICAgYXV0byBsID0gR2V0UHJlY29tcEl0ZXIo Y29tcG9zaXRpb24pOwotICAgICAgaWYgKGwgPT0gY29tcG9zaXRpb24tPmVuZCgpKQotICAgICAg ICByZXR1cm4gTlVMTDsKLSAgICAgIHJldHVybiAmKCpsKTsKLSAgICB9Ci0KLSAgICAvLyBJbnNl cnRzIHRoZSBnaXZlbiBsYXllcjpwbGFuZSBpbiB0aGUgY29tcG9zaXRpb24gcmlnaHQgYmVmb3Jl IHRoZSBwcmVjb21wCi0gICAgLy8gbGF5ZXIKKyAgICAvLyBJbnNlcnRzIHRoZSBnaXZlbiBsYXll cjpwbGFuZSBpbiB0aGUgY29tcG9zaXRpb24gYXQgdGhlIGJhY2sKICAgICBzdGF0aWMgaW50IEVt cGxhY2Uoc3RkOjp2ZWN0b3I8RHJtQ29tcG9zaXRpb25QbGFuZT4gKmNvbXBvc2l0aW9uLAogICAg ICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEcm1QbGFuZSAqPiAqcGxhbmVzLAogICAg ICAgICAgICAgICAgICAgICAgICBEcm1Db21wb3NpdGlvblBsYW5lOjpUeXBlIHR5cGUsIERybUNy dGMgKmNydGMsCkBAIC05Niw0MCArODIsMjUgQEAgY2xhc3MgUGxhbm5lciB7CiAgICAgICBpZiAo IXBsYW5lKQogICAgICAgICByZXR1cm4gLUVOT0VOVDsKIAotICAgICAgYXV0byBwcmVjb21wID0g R2V0UHJlY29tcEl0ZXIoY29tcG9zaXRpb24pOwotICAgICAgY29tcG9zaXRpb24tPmVtcGxhY2Uo cHJlY29tcCwgdHlwZSwgcGxhbmUsIGNydGMsIHNvdXJjZV9sYXllcik7CisgICAgICBjb21wb3Np dGlvbi0+ZW1wbGFjZV9iYWNrKHR5cGUsIHBsYW5lLCBjcnRjLCBzb3VyY2VfbGF5ZXIpOwogICAg ICAgcmV0dXJuIDA7CiAgICAgfQotCi0gICBwcml2YXRlOgotICAgIHN0YXRpYyBzdGQ6OnZlY3Rv cjxEcm1Db21wb3NpdGlvblBsYW5lPjo6aXRlcmF0b3IgR2V0UHJlY29tcEl0ZXIoCi0gICAgICAg IHN0ZDo6dmVjdG9yPERybUNvbXBvc2l0aW9uUGxhbmU+ICpjb21wb3NpdGlvbikgewotICAgICAg cmV0dXJuIHN0ZDo6ZmluZF9pZihjb21wb3NpdGlvbi0+YmVnaW4oKSwgY29tcG9zaXRpb24tPmVu ZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBEcm1Db21wb3NpdGlvblBs YW5lICZwKSB7Ci0gICAgICAgIHJldHVybiBwLnR5cGUoKSA9PSBEcm1Db21wb3NpdGlvblBsYW5l OjpUeXBlOjprUHJlY29tcDsKLSAgICAgIH0pOwotICAgIH0KICAgfTsKIAogICAvLyBDcmVhdGVz IGEgcGxhbm5lciBpbnN0YW5jZSB3aXRoIHBsYXRmb3JtLXNwZWNpZmljIHBsYW5uaW5nIHN0YWdl cwogICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFBsYW5uZXI+IENyZWF0ZUluc3RhbmNlKERybVJl c291cmNlcyAqZHJtKTsKIAogICAvLyBUYWtlcyBhIHN0YWNrIG9mIGxheWVycyBhbmQgcHJvdmlz aW9ucyBoYXJkd2FyZSBwbGFuZXMgZm9yIHRoZW0uIElmIHRoZQotICAvLyBlbnRpcmUgc3RhY2sg Y2FuJ3QgZml0IGluIGhhcmR3YXJlLCB0aGUgUGxhbm5lciBtYXkgcGxhY2UgdGhlIHJlbWFpbmlu ZwotICAvLyBsYXllcnMgaW4gYSBQUkVDT01QIHBsYW5lLiBMYXllcnMgaW4gdGhlIFBSRUNPTVAg cGxhbmUgd2lsbCBiZSBjb21wb3NpdGVkCi0gIC8vIHVzaW5nIEdMLiBQUkVDT01QIHBsYW5lcyBz aG91bGQgYmUgcGxhY2VkIGFib3ZlIGFueSAxOjEgbGF5ZXI6cGxhbmUKLSAgLy8gY29tcG9zaXRp b25zLiBJZiB1c2Vfc3F1YXNoX2ZiIGlzIHRydWUsIHRoZSBQbGFubmVyIHNob3VsZCB0cnkgdG8g cmVzZXJ2ZSBhCi0gIC8vIHBsYW5lIGF0IHRoZSBoaWdoZXN0IHotb3JkZXIgd2l0aCB0eXBlIFNR VUFTSC4KKyAgLy8gZW50aXJlIHN0YWNrIGNhbid0IGZpdCBpbiBoYXJkd2FyZSwgRklYTUUKICAg Ly8KICAgLy8gQGxheWVyczogYSBtYXAgb2YgaW5kZXg6bGF5ZXIgb2YgbGF5ZXJzIHRvIGNvbXBv c2l0ZQotICAvLyBAdXNlX3NxdWFzaF9mYjogcmVzZXJ2ZSBhIHNxdWFzaCBmcmFtZWJ1ZmZlcgog ICAvLyBAcHJpbWFyeV9wbGFuZXM6IGEgdmVjdG9yIG9mIHByaW1hcnkgcGxhbmVzIGF2YWlsYWJs ZSBmb3IgdGhpcyBmcmFtZQogICAvLyBAb3ZlcmxheV9wbGFuZXM6IGEgdmVjdG9yIG9mIG92ZXJs YXkgcGxhbmVzIGF2YWlsYWJsZSBmb3IgdGhpcyBmcmFtZQogICAvLwogICAvLyBSZXR1cm5zOiBB IHR1cGxlIHdpdGggdGhlIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uICgwIGZvciBzdWNjZXNzKSBh bmQKICAgLy8gICAgICAgICAgYSB2ZWN0b3Igb2YgdGhlIHJlc3VsdGluZyBwbGFuIChpZTogbGF5 ZXItPnBsYW5lIG1hcHBpbmcpLgogICBzdGQ6OnR1cGxlPGludCwgc3RkOjp2ZWN0b3I8RHJtQ29t cG9zaXRpb25QbGFuZT4+IFByb3Zpc2lvblBsYW5lcygKLSAgICAgIHN0ZDo6bWFwPHNpemVfdCwg RHJtSHdjTGF5ZXIgKj4gJmxheWVycywgYm9vbCB1c2Vfc3F1YXNoX2ZiLAorICAgICAgc3RkOjpt YXA8c2l6ZV90LCBEcm1Id2NMYXllciAqPiAmbGF5ZXJzLAogICAgICAgRHJtQ3J0YyAqY3J0Yywg c3RkOjp2ZWN0b3I8RHJtUGxhbmUgKj4gKnByaW1hcnlfcGxhbmVzLAogICAgICAgc3RkOjp2ZWN0 b3I8RHJtUGxhbmUgKj4gKm92ZXJsYXlfcGxhbmVzKTsKIApAQCAtMTU2LDE4ICsxMjcsNiBAQCBj bGFzcyBQbGFuU3RhZ2VQcm90ZWN0ZWQgOiBwdWJsaWMgUGxhbm5lcjo6UGxhblN0YWdlIHsKICAg ICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEcm1QbGFuZSAqPiAqcGxhbmVzKTsKIH07 CiAKLS8vIFRoaXMgcGxhbiBzdGFnZSBwcm92aXNpb25zIHRoZSBwcmVjb21wIHBsYW5lIHdpdGgg YW55IHJlbWFpbmluZyBsYXllcnMgdGhhdAotLy8gYXJlIG9uIHRvcCBvZiB0aGUgY3VycmVudCBw cmVjb21wIGxheWVycy4gVGhpcyBzdGFnZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4KLS8vIGFsbCBw bGF0Zm9ybXMgYmVmb3JlIGxvb3NlbHkgYWxsb2NhdGluZyBsYXllcnMgKGkuZS4gUGxhblN0YWdl R3JlZWR5KSBpZgotLy8gYW55IHByZXZpb3VzIHBsYW4gY291bGQgaGF2ZSBtb2RpZmllZCB0aGUg cHJlY29tcCBwbGFuZSBsYXllcnMKLS8vIChleC4gUGxhblN0YWdlUHJvdGVjdGVkKS4KLWNsYXNz IFBsYW5TdGFnZVByZWNvbXAgOiBwdWJsaWMgUGxhbm5lcjo6UGxhblN0YWdlIHsKLSBwdWJsaWM6 Ci0gIGludCBQcm92aXNpb25QbGFuZXMoc3RkOjp2ZWN0b3I8RHJtQ29tcG9zaXRpb25QbGFuZT4g KmNvbXBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHNpemVfdCwgRHJt SHdjTGF5ZXIgKj4gJmxheWVycywgRHJtQ3J0YyAqY3J0YywKLSAgICAgICAgICAgICAgICAgICAg ICBzdGQ6OnZlY3RvcjxEcm1QbGFuZSAqPiAqcGxhbmVzKTsKLX07Ci0KIC8vIFRoaXMgcGxhbiBz dGFnZSBwbGFjZXMgYXMgbWFueSBsYXllcnMgb24gZGVkaWNhdGVkIHBsYW5lcyBhcyBwb3NzaWJs ZSAoZmlyc3QKIC8vIGNvbWUgZmlyc3Qgc2VydmUpLCBhbmQgdGhlbiBzdGlja3MgdGhlIHJlc3Qg aW4gYSBwcmVjb21wb3NpdGlvbiBwbGFuZSAoaWYKIC8vIG5lZWRlZCkuCmRpZmYgLS1naXQgYS9w bGF0Zm9ybWRybWdlbmVyaWMuY3BwIGIvcGxhdGZvcm1kcm1nZW5lcmljLmNwcAppbmRleCA4MjUz OTY3NmIyMjkuLjViNDJjNGFlZDVhNCAxMDA2NDQKLS0tIGEvcGxhdGZvcm1kcm1nZW5lcmljLmNw cAorKysgYi9wbGF0Zm9ybWRybWdlbmVyaWMuY3BwCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVk ZSA8bG9nL2xvZy5oPgogI2luY2x1ZGUgPGdyYWxsb2NfaGFuZGxlLmg+CiAjaW5jbHVkZSA8aGFy ZHdhcmUvZ3JhbGxvYy5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KIAogbmFtZXNwYWNlIGFu ZHJvaWQgewogCkBAIC04NCwyMiArODMsNiBAQCB1aW50MzJfdCBEcm1HZW5lcmljSW1wb3J0ZXI6 OkNvbnZlcnRIYWxGb3JtYXRUb0RybSh1aW50MzJfdCBoYWxfZm9ybWF0KSB7CiAgIH0KIH0KIAot RUdMSW1hZ2VLSFIgRHJtR2VuZXJpY0ltcG9ydGVyOjpJbXBvcnRJbWFnZShFR0xEaXNwbGF5IGVn bF9kaXNwbGF5LCBidWZmZXJfaGFuZGxlX3QgaGFuZGxlKSB7Ci0gIGdyYWxsb2NfaGFuZGxlX3Qg KmdyX2hhbmRsZSA9IGdyYWxsb2NfaGFuZGxlKGhhbmRsZSk7Ci0gIGlmICghZ3JfaGFuZGxlKQot ICAgIHJldHVybiBOVUxMOwotICBFR0xpbnQgYXR0cltdID0gewotICAgIEVHTF9XSURUSCwgKEVH TGludClncl9oYW5kbGUtPndpZHRoLAotICAgIEVHTF9IRUlHSFQsIChFR0xpbnQpZ3JfaGFuZGxl LT5oZWlnaHQsCi0gICAgRUdMX0xJTlVYX0RSTV9GT1VSQ0NfRVhULCAoRUdMaW50KUNvbnZlcnRI YWxGb3JtYXRUb0RybShncl9oYW5kbGUtPmZvcm1hdCksCi0gICAgRUdMX0RNQV9CVUZfUExBTkUw X0ZEX0VYVCwgZ3JfaGFuZGxlLT5wcmltZV9mZCwKLSAgICBFR0xfRE1BX0JVRl9QTEFORTBfT0ZG U0VUX0VYVCwgMCwKLSAgICBFR0xfRE1BX0JVRl9QTEFORTBfUElUQ0hfRVhULCAoRUdMaW50KWdy X2hhbmRsZS0+c3RyaWRlLAotICAgIEVHTF9OT05FLAotICB9OwotICByZXR1cm4gZWdsQ3JlYXRl SW1hZ2VLSFIoZWdsX2Rpc3BsYXksIEVHTF9OT19DT05URVhULCBFR0xfTElOVVhfRE1BX0JVRl9F WFQsIE5VTEwsIGF0dHIpOwotfQotCiBpbnQgRHJtR2VuZXJpY0ltcG9ydGVyOjpJbXBvcnRCdWZm ZXIoYnVmZmVyX2hhbmRsZV90IGhhbmRsZSwgaHdjX2RybV9ib190ICpibykgewogICBncmFsbG9j X2hhbmRsZV90ICpncl9oYW5kbGUgPSBncmFsbG9jX2hhbmRsZShoYW5kbGUpOwogICBpZiAoIWdy X2hhbmRsZSkKZGlmZiAtLWdpdCBhL3BsYXRmb3JtZHJtZ2VuZXJpYy5oIGIvcGxhdGZvcm1kcm1n ZW5lcmljLmgKaW5kZXggZmJlMDU5YjQ5YTkyLi4wMzM5ZTFlMzk1N2UgMTAwNjQ0Ci0tLSBhL3Bs YXRmb3JtZHJtZ2VuZXJpYy5oCisrKyBiL3BsYXRmb3JtZHJtZ2VuZXJpYy5oCkBAIC0zMSw3ICsz MSw2IEBAIGNsYXNzIERybUdlbmVyaWNJbXBvcnRlciA6IHB1YmxpYyBJbXBvcnRlciB7CiAKICAg aW50IEluaXQoKTsKIAotICBFR0xJbWFnZUtIUiBJbXBvcnRJbWFnZShFR0xEaXNwbGF5IGVnbF9k aXNwbGF5LCBidWZmZXJfaGFuZGxlX3QgaGFuZGxlKSBvdmVycmlkZTsKICAgaW50IEltcG9ydEJ1 ZmZlcihidWZmZXJfaGFuZGxlX3QgaGFuZGxlLCBod2NfZHJtX2JvX3QgKmJvKSBvdmVycmlkZTsK ICAgaW50IFJlbGVhc2VCdWZmZXIoaHdjX2RybV9ib190ICpibykgb3ZlcnJpZGU7CiAKZGlmZiAt LWdpdCBhL3BsYXRmb3JtaGlzaS5jcHAgYi9wbGF0Zm9ybWhpc2kuY3BwCmluZGV4IDNmNWMzMTk5 NWM1Ny4uMWVhMWQwNzc2NjQ4IDEwMDY0NAotLS0gYS9wbGF0Zm9ybWhpc2kuY3BwCisrKyBiL3Bs YXRmb3JtaGlzaS5jcHAKQEAgLTY5LDI3ICs2OSw2IEBAIGludCBIaXNpSW1wb3J0ZXI6OkluaXQo KSB7CiAgIHJldHVybiAwOwogfQogCi1FR0xJbWFnZUtIUiBIaXNpSW1wb3J0ZXI6OkltcG9ydElt YWdlKEVHTERpc3BsYXkgZWdsX2Rpc3BsYXksIGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGUpIHsKLSAg cHJpdmF0ZV9oYW5kbGVfdCBjb25zdCAqaG5kID0gcmVpbnRlcnByZXRfY2FzdCA8IHByaXZhdGVf aGFuZGxlX3QgY29uc3QgKj4oaGFuZGxlKTsKLSAgaWYgKCFobmQpCi0gICAgcmV0dXJuIE5VTEw7 Ci0KLSAgRUdMaW50IGZtdCA9IENvbnZlcnRIYWxGb3JtYXRUb0RybShobmQtPnJlcV9mb3JtYXQp OwotICBpZiAoZm10IDwgMCkKLQlyZXR1cm4gTlVMTDsKLQotICBFR0xpbnQgYXR0cltdID0gewot ICAgIEVHTF9XSURUSCwgaG5kLT53aWR0aCwKLSAgICBFR0xfSEVJR0hULCBobmQtPmhlaWdodCwK LSAgICBFR0xfTElOVVhfRFJNX0ZPVVJDQ19FWFQsIGZtdCwKLSAgICBFR0xfRE1BX0JVRl9QTEFO RTBfRkRfRVhULCBobmQtPnNoYXJlX2ZkLAotICAgIEVHTF9ETUFfQlVGX1BMQU5FMF9PRkZTRVRf RVhULCAwLAotICAgIEVHTF9ETUFfQlVGX1BMQU5FMF9QSVRDSF9FWFQsIGhuZC0+Ynl0ZV9zdHJp ZGUsCi0gICAgRUdMX05PTkUsCi0gIH07Ci0gIHJldHVybiBlZ2xDcmVhdGVJbWFnZUtIUihlZ2xf ZGlzcGxheSwgRUdMX05PX0NPTlRFWFQsIEVHTF9MSU5VWF9ETUFfQlVGX0VYVCwgTlVMTCwgYXR0 cik7Ci19Ci0KIGludCBIaXNpSW1wb3J0ZXI6OkltcG9ydEJ1ZmZlcihidWZmZXJfaGFuZGxlX3Qg aGFuZGxlLCBod2NfZHJtX2JvX3QgKmJvKSB7CiAgIHByaXZhdGVfaGFuZGxlX3QgY29uc3QgKmhu ZCA9IHJlaW50ZXJwcmV0X2Nhc3QgPCBwcml2YXRlX2hhbmRsZV90IGNvbnN0ICo+KGhhbmRsZSk7 CiAgIGlmICghaG5kKQpAQCAtMTMxLDUgKzExMCwzIEBAIHN0ZDo6dW5pcXVlX3B0cjxQbGFubmVy PiBQbGFubmVyOjpDcmVhdGVJbnN0YW5jZShEcm1SZXNvdXJjZXMgKikgewogICByZXR1cm4gcGxh bm5lcjsKIH0KIH0KLQotCmRpZmYgLS1naXQgYS9wbGF0Zm9ybWhpc2kuaCBiL3BsYXRmb3JtaGlz aS5oCmluZGV4IDQ2ZjQ1OTUxM2RmZi4uYTA5ODY5MjNkNGQzIDEwMDY0NAotLS0gYS9wbGF0Zm9y bWhpc2kuaAorKysgYi9wbGF0Zm9ybWhpc2kuaApAQCAtMzQsNyArMzQsNiBAQCBjbGFzcyBIaXNp SW1wb3J0ZXIgOiBwdWJsaWMgRHJtR2VuZXJpY0ltcG9ydGVyIHsKIAogICBpbnQgSW5pdCgpOwog Ci0gIEVHTEltYWdlS0hSIEltcG9ydEltYWdlKEVHTERpc3BsYXkgZWdsX2Rpc3BsYXksIGJ1ZmZl cl9oYW5kbGVfdCBoYW5kbGUpIG92ZXJyaWRlOwogICBpbnQgSW1wb3J0QnVmZmVyKGJ1ZmZlcl9o YW5kbGVfdCBoYW5kbGUsIGh3Y19kcm1fYm9fdCAqYm8pIG92ZXJyaWRlOwogCiAgcHJpdmF0ZToK ZGlmZiAtLWdpdCBhL3BsYXRmb3JtbWluaWdibS5jcHAgYi9wbGF0Zm9ybW1pbmlnYm0uY3BwCmlu ZGV4IDgwZTJjMGY5ZjVmZC4uOGUzY2M2NWYwYzRjIDEwMDY0NAotLS0gYS9wbGF0Zm9ybW1pbmln Ym0uY3BwCisrKyBiL3BsYXRmb3JtbWluaWdibS5jcHAKQEAgLTY2LDIyICs2Niw2IEBAIGludCBE cm1NaW5pZ2JtSW1wb3J0ZXI6OkluaXQoKSB7CiAgIHJldHVybiAwOwogfQogCi1FR0xJbWFnZUtI UiBEcm1NaW5pZ2JtSW1wb3J0ZXI6OkltcG9ydEltYWdlKEVHTERpc3BsYXkgZWdsX2Rpc3BsYXks IGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGUpIHsKLSAgY3Jvc19ncmFsbG9jX2hhbmRsZSAqZ3JfaGFu ZGxlID0gKGNyb3NfZ3JhbGxvY19oYW5kbGUgKiloYW5kbGU7Ci0gIGlmICghZ3JfaGFuZGxlKQot ICAgIHJldHVybiBOVUxMOwotICBFR0xpbnQgYXR0cltdID0gewotICAgIEVHTF9XSURUSCwgKEVH TGludClncl9oYW5kbGUtPndpZHRoLAotICAgIEVHTF9IRUlHSFQsIChFR0xpbnQpZ3JfaGFuZGxl LT5oZWlnaHQsCi0gICAgRUdMX0xJTlVYX0RSTV9GT1VSQ0NfRVhULCAoRUdMaW50KWdyX2hhbmRs ZS0+Zm9ybWF0LAotICAgIEVHTF9ETUFfQlVGX1BMQU5FMF9GRF9FWFQsIGdyX2hhbmRsZS0+ZmRz WzBdLAotICAgIEVHTF9ETUFfQlVGX1BMQU5FMF9QSVRDSF9FWFQsIChFR0xpbnQpZ3JfaGFuZGxl LT5zdHJpZGVzWzBdLAotICAgIEVHTF9ETUFfQlVGX1BMQU5FMF9PRkZTRVRfRVhULCAoRUdMaW50 KWdyX2hhbmRsZS0+b2Zmc2V0c1swXSwKLSAgICBFR0xfTk9ORSwKLSAgfTsKLSAgcmV0dXJuIGVn bENyZWF0ZUltYWdlS0hSKGVnbF9kaXNwbGF5LCBFR0xfTk9fQ09OVEVYVCwgRUdMX0xJTlVYX0RN QV9CVUZfRVhULCBOVUxMLCBhdHRyKTsKLX0KLQogaW50IERybU1pbmlnYm1JbXBvcnRlcjo6SW1w b3J0QnVmZmVyKGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGUsIGh3Y19kcm1fYm9fdCAqYm8pIHsKICAg Y3Jvc19ncmFsbG9jX2hhbmRsZSAqZ3JfaGFuZGxlID0gKGNyb3NfZ3JhbGxvY19oYW5kbGUgKilo YW5kbGU7CiAgIGlmICghZ3JfaGFuZGxlKQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm1taW5pZ2JtLmgg Yi9wbGF0Zm9ybW1pbmlnYm0uaAppbmRleCBkZWQ0YzA3N2UxNzguLmYyNWJmN2JjMmQxOSAxMDA2 NDQKLS0tIGEvcGxhdGZvcm1taW5pZ2JtLmgKKysrIGIvcGxhdGZvcm1taW5pZ2JtLmgKQEAgLTMy LDcgKzMyLDYgQEAgY2xhc3MgRHJtTWluaWdibUltcG9ydGVyIDogcHVibGljIERybUdlbmVyaWNJ bXBvcnRlciB7CiAKICAgaW50IEluaXQoKTsKIAotICBFR0xJbWFnZUtIUiBJbXBvcnRJbWFnZShF R0xEaXNwbGF5IGVnbF9kaXNwbGF5LCBidWZmZXJfaGFuZGxlX3QgaGFuZGxlKSBvdmVycmlkZTsK ICAgaW50IEltcG9ydEJ1ZmZlcihidWZmZXJfaGFuZGxlX3QgaGFuZGxlLCBod2NfZHJtX2JvX3Qg KmJvKSBvdmVycmlkZTsKIAogIHByaXZhdGU6CmRpZmYgLS1naXQgYS92aXJ0dWFsY29tcG9zaXRv cndvcmtlci5jcHAgYi92aXJ0dWFsY29tcG9zaXRvcndvcmtlci5jcHAKZGVsZXRlZCBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IGI2NGI0MTQ4ZWU1MC4uMDAwMDAwMDAwMDAwCi0tLSBhL3ZpcnR1YWxj b21wb3NpdG9yd29ya2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgot ICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAq Ci0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUg IkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBs aWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUg TGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJ Q0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFn cmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExp Y2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FS UkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBs aWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJu aW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0g Ki8KLQotI2RlZmluZSBMT0dfVEFHICJod2MtdmlydHVhbC1jb21wb3NpdG9yLXdvcmtlciIKLQot I2luY2x1ZGUgInZpcnR1YWxjb21wb3NpdG9yd29ya2VyLmgiCi0jaW5jbHVkZSAid29ya2VyLmgi Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8 bG9nL2xvZy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8aGFy ZHdhcmUvaHdjb21wb3Nlci5oPgotI2luY2x1ZGUgPHNjaGVkLmg+Ci0jaW5jbHVkZSA8c3dfc3lu Yy5oPgotI2luY2x1ZGUgPHN5bmMvc3luYy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0 YXRpYyBjb25zdCBpbnQga01heFF1ZXVlRGVwdGggPSAzOwotc3RhdGljIGNvbnN0IGludCBrQWNx dWlyZVdhaXRUaW1lb3V0TXMgPSAzMDAwOwotCi1WaXJ0dWFsQ29tcG9zaXRvcldvcmtlcjo6Vmly dHVhbENvbXBvc2l0b3JXb3JrZXIoKQotICAgIDogV29ya2VyKCJ2aXJ0dWFsLWNvbXBvc2l0b3Ii LCBIQUxfUFJJT1JJVFlfVVJHRU5UX0RJU1BMQVkpLAotICAgICAgdGltZWxpbmVfZmRfKC0xKSwK LSAgICAgIHRpbWVsaW5lXygwKSwKLSAgICAgIHRpbWVsaW5lX2N1cnJlbnRfKDApIHsKLX0KLQot VmlydHVhbENvbXBvc2l0b3JXb3JrZXI6On5WaXJ0dWFsQ29tcG9zaXRvcldvcmtlcigpIHsKLSAg aWYgKHRpbWVsaW5lX2ZkXyA+PSAwKSB7Ci0gICAgRmluaXNoQ29tcG9zaXRpb24odGltZWxpbmVf KTsKLSAgICBjbG9zZSh0aW1lbGluZV9mZF8pOwotICAgIHRpbWVsaW5lX2ZkXyA9IC0xOwotICB9 Ci19Ci0KLWludCBWaXJ0dWFsQ29tcG9zaXRvcldvcmtlcjo6SW5pdCgpIHsKLSAgaW50IHJldCA9 IHN3X3N5bmNfdGltZWxpbmVfY3JlYXRlKCk7Ci0gIGlmIChyZXQgPCAwKSB7Ci0gICAgQUxPR0Uo IkZhaWxlZCB0byBjcmVhdGUgc3cgc3luYyB0aW1lbGluZSAlZCIsIHJldCk7Ci0gICAgcmV0dXJu IHJldDsKLSAgfQotICB0aW1lbGluZV9mZF8gPSByZXQ7Ci0gIHJldHVybiBJbml0V29ya2VyKCk7 Ci19Ci0KLXZvaWQgVmlydHVhbENvbXBvc2l0b3JXb3JrZXI6OlF1ZXVlQ29tcG9zaXRlKGh3Y19k aXNwbGF5X2NvbnRlbnRzXzFfdCAqZGMpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPFZpcnR1YWxDb21w b3NpdGlvbj4gY29tcG9zaXRpb24obmV3IFZpcnR1YWxDb21wb3NpdGlvbik7Ci0KLSAgY29tcG9z aXRpb24tPm91dGJ1Zl9hY3F1aXJlX2ZlbmNlLlNldChkYy0+b3V0YnVmQWNxdWlyZUZlbmNlRmQp OwotICBkYy0+b3V0YnVmQWNxdWlyZUZlbmNlRmQgPSAtMTsKLSAgaWYgKGRjLT5yZXRpcmVGZW5j ZUZkID49IDApCi0gICAgY2xvc2UoZGMtPnJldGlyZUZlbmNlRmQpOwotICBkYy0+cmV0aXJlRmVu Y2VGZCA9IENyZWF0ZU5leHRUaW1lbGluZUZlbmNlKCk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7 IGkgPCBkYy0+bnVtSHdMYXllcnM7ICsraSkgewotICAgIGh3Y19sYXllcl8xX3QgKmxheWVyID0g JmRjLT5od0xheWVyc1tpXTsKLSAgICBpZiAobGF5ZXItPmZsYWdzICYgSFdDX1NLSVBfTEFZRVIp Ci0gICAgICBjb250aW51ZTsKLSAgICBjb21wb3NpdGlvbi0+bGF5ZXJfYWNxdWlyZV9mZW5jZXMu ZW1wbGFjZV9iYWNrKGxheWVyLT5hY3F1aXJlRmVuY2VGZCk7Ci0gICAgbGF5ZXItPmFjcXVpcmVG ZW5jZUZkID0gLTE7Ci0gICAgaWYgKGxheWVyLT5yZWxlYXNlRmVuY2VGZCA+PSAwKQotICAgICAg Y2xvc2UobGF5ZXItPnJlbGVhc2VGZW5jZUZkKTsKLSAgICBsYXllci0+cmVsZWFzZUZlbmNlRmQg PSBDcmVhdGVOZXh0VGltZWxpbmVGZW5jZSgpOwotICB9Ci0KLSAgY29tcG9zaXRpb24tPnJlbGVh c2VfdGltZWxpbmUgPSB0aW1lbGluZV87Ci0KLSAgTG9jaygpOwotICB3aGlsZSAoY29tcG9zaXRl X3F1ZXVlXy5zaXplKCkgPj0ga01heFF1ZXVlRGVwdGgpIHsKLSAgICBVbmxvY2soKTsKLSAgICBz Y2hlZF95aWVsZCgpOwotICAgIExvY2soKTsKLSAgfQotCi0gIGNvbXBvc2l0ZV9xdWV1ZV8ucHVz aChzdGQ6Om1vdmUoY29tcG9zaXRpb24pKTsKLSAgVW5sb2NrKCk7Ci0gIFNpZ25hbCgpOwotfQot Ci12b2lkIFZpcnR1YWxDb21wb3NpdG9yV29ya2VyOjpSb3V0aW5lKCkgewotICBpbnQgd2FpdF9y ZXQgPSAwOwotCi0gIExvY2soKTsKLSAgaWYgKGNvbXBvc2l0ZV9xdWV1ZV8uZW1wdHkoKSkgewot ICAgIHdhaXRfcmV0ID0gV2FpdEZvclNpZ25hbE9yRXhpdExvY2tlZCgpOwotICB9Ci0KLSAgc3Rk Ojp1bmlxdWVfcHRyPFZpcnR1YWxDb21wb3NpdGlvbj4gY29tcG9zaXRpb247Ci0gIGlmICghY29t cG9zaXRlX3F1ZXVlXy5lbXB0eSgpKSB7Ci0gICAgY29tcG9zaXRpb24gPSBzdGQ6Om1vdmUoY29t cG9zaXRlX3F1ZXVlXy5mcm9udCgpKTsKLSAgICBjb21wb3NpdGVfcXVldWVfLnBvcCgpOwotICB9 Ci0gIFVubG9jaygpOwotCi0gIGlmICh3YWl0X3JldCA9PSAtRUlOVFIpIHsKLSAgICByZXR1cm47 Ci0gIH0gZWxzZSBpZiAod2FpdF9yZXQpIHsKLSAgICBBTE9HRSgiRmFpbGVkIHRvIHdhaXQgZm9y IHNpZ25hbCwgJWQiLCB3YWl0X3JldCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ29tcG9zZShz dGQ6Om1vdmUoY29tcG9zaXRpb24pKTsKLX0KLQotaW50IFZpcnR1YWxDb21wb3NpdG9yV29ya2Vy OjpDcmVhdGVOZXh0VGltZWxpbmVGZW5jZSgpIHsKLSAgKyt0aW1lbGluZV87Ci0gIHJldHVybiBz d19zeW5jX2ZlbmNlX2NyZWF0ZSh0aW1lbGluZV9mZF8sICJkcm1fZmVuY2UiLCB0aW1lbGluZV8p OwotfQotCi1pbnQgVmlydHVhbENvbXBvc2l0b3JXb3JrZXI6OkZpbmlzaENvbXBvc2l0aW9uKGlu dCBwb2ludCkgewotICBpbnQgdGltZWxpbmVfaW5jcmVhc2UgPSBwb2ludCAtIHRpbWVsaW5lX2N1 cnJlbnRfOwotICBpZiAodGltZWxpbmVfaW5jcmVhc2UgPD0gMCkKLSAgICByZXR1cm4gMDsKLSAg aW50IHJldCA9IHN3X3N5bmNfdGltZWxpbmVfaW5jKHRpbWVsaW5lX2ZkXywgdGltZWxpbmVfaW5j cmVhc2UpOwotICBpZiAocmV0KQotICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5jcmVtZW50IHN5bmMg dGltZWxpbmUgJWQiLCByZXQpOwotICBlbHNlCi0gICAgdGltZWxpbmVfY3VycmVudF8gPSBwb2lu dDsKLSAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBWaXJ0dWFsQ29tcG9zaXRvcldvcmtlcjo6Q29t cG9zZSgKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VmlydHVhbENvbXBvc2l0aW9uPiBjb21wb3NpdGlv bikgewotICBpZiAoIWNvbXBvc2l0aW9uLmdldCgpKQotICAgIHJldHVybjsKLQotICBpbnQgcmV0 OwotICBpbnQgb3V0YnVmX2FjcXVpcmVfZmVuY2UgPSBjb21wb3NpdGlvbi0+b3V0YnVmX2FjcXVp cmVfZmVuY2UuZ2V0KCk7Ci0gIGlmIChvdXRidWZfYWNxdWlyZV9mZW5jZSA+PSAwKSB7Ci0gICAg cmV0ID0gc3luY193YWl0KG91dGJ1Zl9hY3F1aXJlX2ZlbmNlLCBrQWNxdWlyZVdhaXRUaW1lb3V0 TXMpOwotICAgIGlmIChyZXQpIHsKLSAgICAgIEFMT0dFKCJGYWlsZWQgdG8gd2FpdCBmb3Igb3V0 YnVmIGFjcXVpcmUgJWQvJWQiLCBvdXRidWZfYWNxdWlyZV9mZW5jZSwKLSAgICAgICAgICAgIHJl dCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNvbXBvc2l0aW9uLT5vdXRidWZfYWNxdWly ZV9mZW5jZS5DbG9zZSgpOwotICB9Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tcG9zaXRp b24tPmxheWVyX2FjcXVpcmVfZmVuY2VzLnNpemUoKTsgKytpKSB7Ci0gICAgaW50IGxheWVyX2Fj cXVpcmVfZmVuY2UgPSBjb21wb3NpdGlvbi0+bGF5ZXJfYWNxdWlyZV9mZW5jZXNbaV0uZ2V0KCk7 Ci0gICAgaWYgKGxheWVyX2FjcXVpcmVfZmVuY2UgPj0gMCkgewotICAgICAgcmV0ID0gc3luY193 YWl0KGxheWVyX2FjcXVpcmVfZmVuY2UsIGtBY3F1aXJlV2FpdFRpbWVvdXRNcyk7Ci0gICAgICBp ZiAocmV0KSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gd2FpdCBmb3IgbGF5ZXIgYWNxdWly ZSAlZC8lZCIsIGxheWVyX2FjcXVpcmVfZmVuY2UsCi0gICAgICAgICAgICAgIHJldCk7Ci0gICAg ICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGNvbXBvc2l0aW9uLT5sYXllcl9hY3F1aXJlX2Zl bmNlc1tpXS5DbG9zZSgpOwotICAgIH0KLSAgfQotICBGaW5pc2hDb21wb3NpdGlvbihjb21wb3Np dGlvbi0+cmVsZWFzZV90aW1lbGluZSk7Ci19Ci19CmRpZmYgLS1naXQgYS92aXJ0dWFsY29tcG9z aXRvcndvcmtlci5oIGIvdmlydHVhbGNvbXBvc2l0b3J3b3JrZXIuaApkZWxldGVkIGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMWZjNWU0MzVlYWFjLi4wMDAwMDAwMDAwMDAKLS0tIGEvdmlydHVhbGNv bXBvc2l0b3J3b3JrZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBD b3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAq IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGlj ZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5j ZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNl bnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5T RS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVk IHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5z ZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5U SUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQu Ci0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcg cGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwot Ci0jaWZuZGVmIEFORFJPSURfVklSVFVBTF9DT01QT1NJVE9SX1dPUktFUl9IXwotI2RlZmluZSBB TkRST0lEX1ZJUlRVQUxfQ09NUE9TSVRPUl9XT1JLRVJfSF8KLQotI2luY2x1ZGUgImRybWh3Y29t cG9zZXIuaCIKLSNpbmNsdWRlICJ3b3JrZXIuaCIKLQotI2luY2x1ZGUgPHF1ZXVlPgotCi1uYW1l c3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFZpcnR1YWxDb21wb3NpdG9yV29ya2VyIDogcHVibGlj IFdvcmtlciB7Ci0gcHVibGljOgotICBWaXJ0dWFsQ29tcG9zaXRvcldvcmtlcigpOwotICB+Vmly dHVhbENvbXBvc2l0b3JXb3JrZXIoKSBvdmVycmlkZTsKLQotICBpbnQgSW5pdCgpOwotICB2b2lk IFF1ZXVlQ29tcG9zaXRlKGh3Y19kaXNwbGF5X2NvbnRlbnRzXzFfdCAqZGMpOwotCi0gcHJvdGVj dGVkOgotICB2b2lkIFJvdXRpbmUoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0cnVjdCBW aXJ0dWFsQ29tcG9zaXRpb24gewotICAgIFVuaXF1ZUZkIG91dGJ1Zl9hY3F1aXJlX2ZlbmNlOwot ICAgIHN0ZDo6dmVjdG9yPFVuaXF1ZUZkPiBsYXllcl9hY3F1aXJlX2ZlbmNlczsKLSAgICBpbnQg cmVsZWFzZV90aW1lbGluZTsKLSAgfTsKLQotICBpbnQgQ3JlYXRlTmV4dFRpbWVsaW5lRmVuY2Uo KTsKLSAgaW50IEZpbmlzaENvbXBvc2l0aW9uKGludCB0aW1lbGluZSk7Ci0gIHZvaWQgQ29tcG9z ZShzdGQ6OnVuaXF1ZV9wdHI8VmlydHVhbENvbXBvc2l0aW9uPiBjb21wb3NpdGlvbik7Ci0KLSAg c3RkOjpxdWV1ZTxzdGQ6OnVuaXF1ZV9wdHI8VmlydHVhbENvbXBvc2l0aW9uPj4gY29tcG9zaXRl X3F1ZXVlXzsKLSAgaW50IHRpbWVsaW5lX2ZkXzsKLSAgaW50IHRpbWVsaW5lXzsKLSAgaW50IHRp bWVsaW5lX2N1cnJlbnRfOwotfTsKLX0KLQotI2VuZGlmCi0tIAoyLjE3LjAKCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxp c3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNr dG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=