From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 318CA446AA for ; Sat, 22 Oct 2022 10:37:32 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 45DE668BEA7; Sat, 22 Oct 2022 13:37:30 +0300 (EEST) Received: from mail-vs1-f50.google.com (mail-vs1-f50.google.com [209.85.217.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AC30968BE20 for ; Sat, 22 Oct 2022 13:37:23 +0300 (EEST) Received: by mail-vs1-f50.google.com with SMTP id h3so3590012vsa.4 for ; Sat, 22 Oct 2022 03:37:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:to:subject:message-id:date:from :references:in-reply-to:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=m0bqnvfkD4nrF+Y1daYEz1w5v653wr8ZJ+kYDNMC5go=; b=bLbdxehykfcX82CxaFS2u3SypnHPLKVV9j62v8hHtMKkxBlTdnETA7tnxFRbF18N6C y+Xs3pBKZqKTa18BWzMRAejFU43RJJ96l382EG6oBPIE8RlwS2LdvY3ES9/aKfHd4AyQ s7KSTMr4v3DqkH9Qo9GRKhxQhb6dPJq9yqhDMyrx3tR4k8u8hGwdkEapQr0viz9dug+K VdcQxGeEb6Rx1PeJkkyYJdy36IgFAsCMq5npSpJtjeZvEXa+7vtRc6kYqDYSCZGakrIV TgKabWREWD3QTooc3tFKIEUiRKEQSatIeftnwwaa+xLBRfyRMN/20Rb/UkaAwyzBvNsk mYcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:to:subject:message-id:date:from :references:in-reply-to:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=m0bqnvfkD4nrF+Y1daYEz1w5v653wr8ZJ+kYDNMC5go=; b=g9aVV39tkYEWViZz0n7np0KXUkKyxZeZsmJYo2bAZKq6ep2q3xI4giHeee2dz6+4y/ WadcYGBOmCOKH1ScxiYJCQpFqv7zh35q7jfX5zzWBZ2pN19Vx0AYPwOgtt15wen3IupB zh+BikIt9cbyPsCc3NxSq4Dco7jW8a5/8fBAuxRssosY6lXbkUiptORYmZsuOwZ3FkN6 i1z8sR2UL8fsu3igCy2x8spEZ4n3yPvHouY+6gNwaVLA877QnFYAbUlHXjlX4Vhu9OHY 13Pos79CiNXabc2aME3g0OvdE6CmBFiHA66/hNTrNjiYgXACpWJfQ7XKbJRs0XH+3fER xjdQ== X-Gm-Message-State: ACrzQf1jnNqRGEP7wTaImf9YZq3PzcAJTxF6A8w0aAM6InUbsPjG9JQG SK6ahTZKhCN7EITUlSBJpeCi1NHMXV1KSjMv5pklQti9 X-Google-Smtp-Source: AMsMyM6Lzh7feBE0ANicaXqggtVNe5eFEG/I8r2nlISxv+rEar3SM9gdQtq4MUYIhXvk3zKKp7JK4e0DWLjEEIa5RHE= X-Received: by 2002:a05:6102:441c:b0:3a9:77c5:a62a with SMTP id df28-20020a056102441c00b003a977c5a62amr12827089vsb.57.1666435041913; Sat, 22 Oct 2022 03:37:21 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a05:612c:612:b0:314:ac6a:1eb7 with HTTP; Sat, 22 Oct 2022 03:37:20 -0700 (PDT) In-Reply-To: <20221022103257.15463-1-anton@khirnov.net> References: <20221022103257.15463-1-anton@khirnov.net> From: Paul B Mahol Date: Sat, 22 Oct 2022 12:37:20 +0200 Message-ID: To: FFmpeg development discussions and patches Subject: Re: [FFmpeg-devel] [PATCH v4 1/4] lavc: add standalone cached bitstream reader X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: T24gMTAvMjIvMjIsIEFudG9uIEtoaXJub3YgPGFudG9uQGtoaXJub3YubmV0PiB3cm90ZToKPiBG cm9tOiBBbGV4YW5kcmEgSMOhamtvdsOhIDxhbGV4YW5kcmEua2hpcm5vdmFAZ21haWwuY29tPgo+ Cj4gVGhlIGNhY2hlZCBiaXRzdHJlYW0gcmVhZGVyIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkg QWxleGFuZHJhIEjDoWprb3bDoQo+IGZvciBMaWJhdiwgd2l0aCBzaWduaWZpY2FudCBpbnB1dCBm cm9tIEtvc3R5YSBTaGlzaGtvdiBhbmQgTHVjYSBCYXJiYXRvLgo+IEl0IHdhcyB0aGVuIGNvbW1p dHRlZCB0byBGRm1wZWcgaW4gY2EwNzliMDk1NDksIGJ5IG1lcmdpbmcgaXQgd2l0aCB0aGUKPiBp bXBsZW1lbnRhdGlvbiBvZiB0aGUgY3VycmVudCBiaXRzdHJlYW0gcmVhZGVyLgo+Cj4gVGhpcyBt ZXJnZSBtYWtlcyB0aGUgY29kZSBvZiBnZXRfYml0cy5oIHNpZ25pZmljYW50bHkgaGFyZGVyIHRv IHJlYWQsCj4gc2luY2UgaXQgbm93IGNvbnRhaW5zIHR3byBkaWZmZXJlbnQgYml0c3RyZWFtIHJl YWRlcnMgaW50ZXJsZWF2ZWQgd2l0aAo+ICAjaWZkZWZzLiBBZGRpdGlvbmFsbHksIHRoZSBjb2Rl IHdhcyBjb21taXR0ZWQgd2l0aG91dCBwcm9wZXIgYXV0aG9yc2hpcAo+IGF0dHJpYnV0aW9uLgo+ Cj4gVGhpcyBjb21taXQgcmUtYWRkcyB0aGUgY2FjaGVkIGJpdHN0cmVhbSByZWFkZXIgYXMgYSBz dGFuZGFsb25lIGhlYWRlciwKPiBhcyBpdCB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQuIEl0IHdp bGwgYmUgbWFkZSB1c2VmdWwgaW4gZm9sbG93aW5nCj4gY29tbWl0cy4KPgo+IEludGVncmF0aW9u IGJ5IEFudG9uIEtoaXJub3YuCj4KPiBTaWduZWQtb2ZmLWJ5OiBBbnRvbiBLaGlybm92IDxhbnRv bkBraGlybm92Lm5ldD4KPiAtLS0KPiAgbGliYXZjb2RlYy9iaXRzdHJlYW0uaCB8IDUyOSArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ICAxIGZpbGUgY2hhbmdlZCwg NTI5IGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYmF2Y29kZWMvYml0c3Ry ZWFtLmgKPgo+IGRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2JpdHN0cmVhbS5oIGIvbGliYXZjb2Rl Yy9iaXRzdHJlYW0uaAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMC4u NmZkMzIxZGJhNQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9saWJhdmNvZGVjL2JpdHN0cmVhbS5o Cj4gQEAgLTAsMCArMSw1MjkgQEAKPiArLyoKPiArICogQ29weXJpZ2h0IChjKSAyMDE2IEFsZXhh bmRyYSBIw6Fqa292w6EKPiArICoKPiArICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgo+ ICsgKgo+ICsgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yCj4gKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz ZXIgR2VuZXJhbCBQdWJsaWMKPiArICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCj4gKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNl bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgo+ICsgKgo+ICsgKiBG Rm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwK PiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg d2FycmFudHkgb2YKPiArICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKPiArICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KPiArICoKPiArICogWW91IHNob3VsZCBoYXZlIHJlY2Vp dmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwo+ICsgKiBMaWNlbnNl IGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCj4g KyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJv c3RvbiwgTUEgMDIxMTAtMTMwMQo+IFVTQQo+ICsgKi8KPiArCj4gKy8qKgo+ICsgKiBAZmlsZQo+ ICsgKiBiaXRzdHJlYW0gcmVhZGVyIEFQSSBoZWFkZXIuCj4gKyAqLwo+ICsKPiArI2lmbmRlZiBB VkNPREVDX0JJVFNUUkVBTV9ICj4gKyNkZWZpbmUgQVZDT0RFQ19CSVRTVFJFQU1fSAo+ICsKPiAr I2luY2x1ZGUgPHN0ZGludC5oPgo+ICsKPiArI2luY2x1ZGUgImNvbmZpZy5oIgo+ICsKPiArI2lu Y2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgo+ICsjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1v bi5oIgo+ICsjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgo+ICsjaW5jbHVkZSAi bGliYXZ1dGlsL2xvZy5oIgo+ICsKPiArI2luY2x1ZGUgIm1hdGhvcHMuaCIKPiArI2luY2x1ZGUg InZsYy5oIgo+ICsKPiArI2lmbmRlZiBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUgo+ICsjZGVm aW5lIFVOQ0hFQ0tFRF9CSVRTVFJFQU1fUkVBREVSICFDT05GSUdfU0FGRV9CSVRTVFJFQU1fUkVB REVSCj4gKyNlbmRpZgo+ICsKPiArdHlwZWRlZiBzdHJ1Y3QgQml0c3RyZWFtQ29udGV4dCB7Cj4g KyAgICB1aW50NjRfdCBiaXRzOyAgICAgICAvLyBzdG9yZXMgYml0cyByZWFkIGZyb20gdGhlIGJ1 ZmZlcgo+ICsgICAgY29uc3QgdWludDhfdCAqYnVmZmVyLCAqYnVmZmVyX2VuZDsKPiArICAgIGNv bnN0IHVpbnQ4X3QgKnB0cjsgIC8vIHBvaW50ZXIgdG8gdGhlIHBvc2l0aW9uIGluc2lkZSBhIGJ1 ZmZlcgo+ICsgICAgdW5zaWduZWQgYml0c192YWxpZDsgLy8gbnVtYmVyIG9mIGJpdHMgbGVmdCBp biBiaXRzIGZpZWxkCj4gKyAgICB1bnNpZ25lZCBzaXplX2luX2JpdHM7Cj4gK30gQml0c3RyZWFt Q29udGV4dDsKPiArCj4gKy8qKgo+ICsgKiBAcmV0dXJuCj4gKyAqIC0gMCBvbiBzdWNjZXNzZnVs IHJlZmlsbAo+ICsgKiAtIGEgbmVnYXRpdmUgbnVtYmVyIHdoZW4gYml0c3RyZWFtIGVuZCBpcyBo aXQKPiArICoKPiArICogQWx3YXlzIHN1Y2NlZWRzIHdoZW4gVU5DSEVDS0VEX0JJVFNUUkVBTV9S RUFERVIgaXMgZW5hYmxlZC4KPiArICovCj4gK3N0YXRpYyBpbmxpbmUgaW50IGJpdHNfcHJpdl9y ZWZpbGxfNjQoQml0c3RyZWFtQ29udGV4dCAqYmMpCj4gK3sKPiArI2lmICFVTkNIRUNLRURfQklU U1RSRUFNX1JFQURFUgo+ICsgICAgaWYgKGJjLT5wdHIgPj0gYmMtPmJ1ZmZlcl9lbmQpCj4gKyAg ICAgICAgcmV0dXJuIC0xOwo+ICsjZW5kaWYKPiArCj4gKyNpZmRlZiBCSVRTVFJFQU1fUkVBREVS X0xFCj4gKyAgICBiYy0+Yml0cyAgICAgICA9IEFWX1JMNjQoYmMtPnB0cik7Cj4gKyNlbHNlCj4g KyAgICBiYy0+Yml0cyAgICAgICA9IEFWX1JCNjQoYmMtPnB0cik7Cj4gKyNlbmRpZgo+ICsgICAg YmMtPnB0ciAgICAgICArPSA4Owo+ICsgICAgYmMtPmJpdHNfdmFsaWQgPSA2NDsKPiArCj4gKyAg ICByZXR1cm4gMDsKPiArfQo+ICsKPiArLyoqCj4gKyAqIEByZXR1cm4KPiArICogLSAwIG9uIHN1 Y2Nlc3NmdWwgcmVmaWxsCj4gKyAqIC0gYSBuZWdhdGl2ZSBudW1iZXIgd2hlbiBiaXRzdHJlYW0g ZW5kIGlzIGhpdAo+ICsgKgo+ICsgKiBBbHdheXMgc3VjY2VlZHMgd2hlbiBVTkNIRUNLRURfQklU U1RSRUFNX1JFQURFUiBpcyBlbmFibGVkLgo+ICsgKi8KPiArc3RhdGljIGlubGluZSBpbnQgYml0 c19wcml2X3JlZmlsbF8zMihCaXRzdHJlYW1Db250ZXh0ICpiYykKPiArewo+ICsjaWYgIVVOQ0hF Q0tFRF9CSVRTVFJFQU1fUkVBREVSCj4gKyAgICBpZiAoYmMtPnB0ciA+PSBiYy0+YnVmZmVyX2Vu ZCkKPiArICAgICAgICByZXR1cm4gLTE7Cj4gKyNlbmRpZgo+ICsKPiArI2lmZGVmIEJJVFNUUkVB TV9SRUFERVJfTEUKPiArICAgIGJjLT5iaXRzICAgICAgfD0gKHVpbnQ2NF90KUFWX1JMMzIoYmMt PnB0cikgPDwgYmMtPmJpdHNfdmFsaWQ7Cj4gKyNlbHNlCj4gKyAgICBiYy0+Yml0cyAgICAgIHw9 ICh1aW50NjRfdClBVl9SQjMyKGJjLT5wdHIpIDw8ICgzMiAtIGJjLT5iaXRzX3ZhbGlkKTsKPiAr I2VuZGlmCj4gKyAgICBiYy0+cHRyICAgICAgICArPSA0Owo+ICsgICAgYmMtPmJpdHNfdmFsaWQg Kz0gMzI7Cj4gKwo+ICsgICAgcmV0dXJuIDA7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBJbml0aWFs aXplIEJpdHN0cmVhbUNvbnRleHQuCj4gKyAqIEBwYXJhbSBidWZmZXIgYml0c3RyZWFtIGJ1ZmZl ciwgbXVzdCBiZSBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFCj4gYnl0ZXMKPiArICogICAg ICAgIGxhcmdlciB0aGFuIHRoZSBhY3R1YWwgcmVhZCBiaXRzIGJlY2F1c2Ugc29tZSBvcHRpbWl6 ZWQgYml0c3RyZWFtCj4gKyAqICAgICAgICByZWFkZXJzIHJlYWQgMzIgb3IgNjQgYml0cyBhdCBv bmNlIGFuZCBjb3VsZCByZWFkIG92ZXIgdGhlIGVuZAo+ICsgKiBAcGFyYW0gYml0X3NpemUgdGhl IHNpemUgb2YgdGhlIGJ1ZmZlciBpbiBiaXRzCj4gKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBB VkVSUk9SX0lOVkFMSUREQVRBIGlmIHRoZSBidWZmZXJfc2l6ZSB3b3VsZAo+IG92ZXJmbG93Lgo+ ICsgKi8KPiArc3RhdGljIGlubGluZSBpbnQgYml0c19pbml0KEJpdHN0cmVhbUNvbnRleHQgKmJj LCBjb25zdCB1aW50OF90ICpidWZmZXIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1 bnNpZ25lZCBpbnQgYml0X3NpemUpCj4gK3sKPiArICAgIHVuc2lnbmVkIGludCBidWZmZXJfc2l6 ZTsKPiArCj4gKyAgICBpZiAoYml0X3NpemUgPiBJTlRfTUFYIC0gNyB8fCAhYnVmZmVyKSB7Cj4g KyAgICAgICAgYmMtPmJ1ZmZlciAgICAgPSBOVUxMOwo+ICsgICAgICAgIGJjLT5wdHIgICAgICAg ID0gTlVMTDsKPiArICAgICAgICBiYy0+Yml0c192YWxpZCA9IDA7Cj4gKyAgICAgICAgcmV0dXJu IEFWRVJST1JfSU5WQUxJRERBVEE7Cj4gKyAgICB9Cj4gKwo+ICsgICAgYnVmZmVyX3NpemUgPSAo Yml0X3NpemUgKyA3KSA+PiAzOwo+ICsKPiArICAgIGJjLT5idWZmZXIgICAgICAgPSBidWZmZXI7 Cj4gKyAgICBiYy0+YnVmZmVyX2VuZCAgID0gYnVmZmVyICsgYnVmZmVyX3NpemU7Cj4gKyAgICBi Yy0+cHRyICAgICAgICAgID0gYmMtPmJ1ZmZlcjsKPiArICAgIGJjLT5zaXplX2luX2JpdHMgPSBi aXRfc2l6ZTsKPiArICAgIGJjLT5iaXRzX3ZhbGlkICAgPSAwOwo+ICsgICAgYmMtPmJpdHMgICAg ICAgICA9IDA7Cj4gKwo+ICsgICAgYml0c19wcml2X3JlZmlsbF82NChiYyk7Cj4gKwo+ICsgICAg cmV0dXJuIDA7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBJbml0aWFsaXplIEJpdHN0cmVhbUNvbnRl eHQuCj4gKyAqIEBwYXJhbSBidWZmZXIgYml0c3RyZWFtIGJ1ZmZlciwgbXVzdCBiZSBBVl9JTlBV VF9CVUZGRVJfUEFERElOR19TSVpFCj4gYnl0ZXMKPiArICogICAgICAgIGxhcmdlciB0aGFuIHRo ZSBhY3R1YWwgcmVhZCBiaXRzIGJlY2F1c2Ugc29tZSBvcHRpbWl6ZWQgYml0c3RyZWFtCj4gKyAq ICAgICAgICByZWFkZXJzIHJlYWQgMzIgb3IgNjQgYml0cyBhdCBvbmNlIGFuZCBjb3VsZCByZWFk IG92ZXIgdGhlIGVuZAo+ICsgKiBAcGFyYW0gYnl0ZV9zaXplIHRoZSBzaXplIG9mIHRoZSBidWZm ZXIgaW4gYnl0ZXMKPiArICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIEFWRVJST1JfSU5WQUxJRERB VEEgaWYgdGhlIGJ1ZmZlcl9zaXplIHdvdWxkCj4gb3ZlcmZsb3cKPiArICovCj4gK3N0YXRpYyBp bmxpbmUgaW50IGJpdHNfaW5pdDgoQml0c3RyZWFtQ29udGV4dCAqYmMsIGNvbnN0IHVpbnQ4X3Qg KmJ1ZmZlciwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnl0 ZV9zaXplKQo+ICt7Cj4gKyAgICBpZiAoYnl0ZV9zaXplID4gSU5UX01BWCAvIDgpCj4gKyAgICAg ICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cj4gKyAgICByZXR1cm4gYml0c19pbml0KGJj LCBidWZmZXIsIGJ5dGVfc2l6ZSAqIDgpOwo+ICt9Cj4gKwo+ICsvKioKPiArICogUmV0dXJuIG51 bWJlciBvZiBiaXRzIGFscmVhZHkgcmVhZC4KPiArICovCj4gK3N0YXRpYyBpbmxpbmUgaW50IGJp dHNfdGVsbChjb25zdCBCaXRzdHJlYW1Db250ZXh0ICpiYykKPiArewo+ICsgICAgcmV0dXJuIChi Yy0+cHRyIC0gYmMtPmJ1ZmZlcikgKiA4IC0gYmMtPmJpdHNfdmFsaWQ7Cj4gK30KPiArCj4gKy8q Kgo+ICsgKiBSZXR1cm4gYnVmZmVyIHNpemUgaW4gYml0cy4KPiArICovCj4gK3N0YXRpYyBpbmxp bmUgaW50IGJpdHNfc2l6ZShjb25zdCBCaXRzdHJlYW1Db250ZXh0ICpiYykKPiArewo+ICsgICAg cmV0dXJuIGJjLT5zaXplX2luX2JpdHM7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBSZXR1cm4gdGhl IG51bWJlciBvZiB0aGUgYml0cyBsZWZ0IGluIGEgYnVmZmVyLgo+ICsgKi8KPiArc3RhdGljIGlu bGluZSBpbnQgYml0c19sZWZ0KGNvbnN0IEJpdHN0cmVhbUNvbnRleHQgKmJjKQo+ICt7Cj4gKyAg ICByZXR1cm4gKGJjLT5idWZmZXIgLSBiYy0+cHRyKSAqIDggKyBiYy0+c2l6ZV9pbl9iaXRzICsg YmMtPmJpdHNfdmFsaWQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgYml0c19w cml2X3ZhbF9zaG93KEJpdHN0cmVhbUNvbnRleHQgKmJjLCB1bnNpZ25lZAo+IGludCBuKQo+ICt7 Cj4gKyAgICBhdl9hc3NlcnQyKG4gPiAwICYmIG4gPD0gNjQpOwo+ICsKPiArI2lmZGVmIEJJVFNU UkVBTV9SRUFERVJfTEUKPiArICAgIHJldHVybiBiYy0+Yml0cyAmIChVSU5UNjRfTUFYID4+ICg2 NCAtIG4pKTsKPiArI2Vsc2UKPiArICAgIHJldHVybiBiYy0+Yml0cyA+PiAoNjQgLSBuKTsKPiAr I2VuZGlmCj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBiaXRzX3ByaXZfc2tpcF9yZW1h aW5pbmcoQml0c3RyZWFtQ29udGV4dCAqYmMsIHVuc2lnbmVkCj4gaW50IG4pCj4gK3sKPiArI2lm ZGVmIEJJVFNUUkVBTV9SRUFERVJfTEUKPiArICAgIGJjLT5iaXRzID4+PSBuOwo+ICsjZWxzZQo+ ICsgICAgYmMtPmJpdHMgPDw9IG47Cj4gKyNlbmRpZgo+ICsgICAgYmMtPmJpdHNfdmFsaWQgLT0g bjsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB1aW50NjRfdCBiaXRzX3ByaXZfdmFsX2dldChC aXRzdHJlYW1Db250ZXh0ICpiYywgdW5zaWduZWQgaW50Cj4gbikKPiArewo+ICsgICAgdWludDY0 X3QgcmV0Owo+ICsKPiArICAgIGF2X2Fzc2VydDIobiA+IDAgJiYgbiA8IDY0KTsKPiArCj4gKyAg ICByZXQgPSBiaXRzX3ByaXZfdmFsX3Nob3coYmMsIG4pOwo+ICsgICAgYml0c19wcml2X3NraXBf cmVtYWluaW5nKGJjLCBuKTsKPiArCj4gKyAgICByZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICsvKioK PiArICogUmV0dXJuIG9uZSBiaXQgZnJvbSB0aGUgYnVmZmVyLgo+ICsgKi8KPiArc3RhdGljIGlu bGluZSB1bnNpZ25lZCBpbnQgYml0c19yZWFkX2JpdChCaXRzdHJlYW1Db250ZXh0ICpiYykKPiAr ewo+ICsgICAgaWYgKCFiYy0+Yml0c192YWxpZCAmJiBiaXRzX3ByaXZfcmVmaWxsXzY0KGJjKSA8 IDApCj4gKyAgICAgICAgcmV0dXJuIDA7Cj4gKwo+ICsgICAgcmV0dXJuIGJpdHNfcHJpdl92YWxf Z2V0KGJjLCAxKTsKPiArfQo+ICsKPiArLyoqCj4gKyAqIFJldHVybiBuIGJpdHMgZnJvbSB0aGUg YnVmZmVyLCBuIGhhcyB0byBiZSBpbiB0aGUgMS0zMiByYW5nZS4KPiArICogTWF5IGJlIGZhc3Rl ciB0aGFuIGJpdHNfcmVhZCgpIHdoZW4gbiBpcyBub3QgYSBjb21waWxlLXRpbWUgY29uc3RhbnQg YW5kCj4gaXMKPiArICoga25vd24gdG8gYmUgbm9uLXplcm87Cj4gKyAqLwo+ICtzdGF0aWMgaW5s aW5lIHVpbnQzMl90IGJpdHNfcmVhZF9ueihCaXRzdHJlYW1Db250ZXh0ICpiYywgdW5zaWduZWQg aW50IG4pCj4gK3sKPiArICAgIGF2X2Fzc2VydDIobiA+IDAgJiYgbiA8PSAzMik7Cj4gKwo+ICsg ICAgaWYgKG4gPiBiYy0+Yml0c192YWxpZCkgewo+ICsgICAgICAgIGlmIChiaXRzX3ByaXZfcmVm aWxsXzMyKGJjKSA8IDApCj4gKyAgICAgICAgICAgIGJjLT5iaXRzX3ZhbGlkID0gbjsKPiArICAg IH0KPiArCj4gKyAgICByZXR1cm4gYml0c19wcml2X3ZhbF9nZXQoYmMsIG4pOwo+ICt9Cj4gKwo+ ICsvKioKPiArICogUmV0dXJuIG4gYml0cyBmcm9tIHRoZSBidWZmZXIsIG4gaGFzIHRvIGJlIGlu IHRoZSAwLTMyICByYW5nZS4KPiArICovCj4gK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgYml0c19y ZWFkKEJpdHN0cmVhbUNvbnRleHQgKmJjLCB1bnNpZ25lZCBpbnQgbikKPiArewo+ICsgICAgYXZf YXNzZXJ0MihuIDw9IDMyKTsKPiArCj4gKyAgICBpZiAoIW4pCj4gKyAgICAgICAgcmV0dXJuIDA7 Cj4gKwo+ICsgICAgcmV0dXJuIGJpdHNfcmVhZF9ueihiYywgbik7Cj4gK30KPiArCj4gKy8qKgo+ ICsgKiBSZXR1cm4gbiBiaXRzIGZyb20gdGhlIGJ1ZmZlciwgbiBoYXMgdG8gYmUgaW4gdGhlIDAt NjMgcmFuZ2UuCj4gKyAqLwo+ICtzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGJpdHNfcmVhZF82MyhC aXRzdHJlYW1Db250ZXh0ICpiYywgdW5zaWduZWQgaW50IG4pCj4gK3sKPiArICAgIHVpbnQ2NF90 IHJldCA9IDA7Cj4gKyAgICB1bnNpZ25lZCBsZWZ0ID0gMDsKPiArCj4gKyAgICBhdl9hc3NlcnQy KG4gPD0gNjMpOwo+ICsKPiArICAgIGlmICghbikKPiArICAgICAgICByZXR1cm4gMDsKPiArCj4g KyAgICBpZiAobiA+IGJjLT5iaXRzX3ZhbGlkKSB7Cj4gKyAgICAgICAgbGVmdCA9IGJjLT5iaXRz X3ZhbGlkOwo+ICsgICAgICAgIG4gICAtPSBsZWZ0Owo+ICsKPiArICAgICAgICBpZiAobGVmdCkK PiArICAgICAgICAgICAgcmV0ID0gYml0c19wcml2X3ZhbF9nZXQoYmMsIGxlZnQpOwo+ICsKPiAr ICAgICAgICBpZiAoYml0c19wcml2X3JlZmlsbF82NChiYykgPCAwKQo+ICsgICAgICAgICAgICBi Yy0+Yml0c192YWxpZCA9IG47Cj4gKwo+ICsgICAgfQo+ICsKPiArI2lmZGVmIEJJVFNUUkVBTV9S RUFERVJfTEUKPiArICAgIHJldCA9IGJpdHNfcHJpdl92YWxfZ2V0KGJjLCBuKSA8PCBsZWZ0IHwg cmV0Owo+ICsjZWxzZQo+ICsgICAgcmV0ID0gYml0c19wcml2X3ZhbF9nZXQoYmMsIG4pIHwgcmV0 IDw8IG47Cj4gKyNlbmRpZgo+ICsKPiArICAgIHJldHVybiByZXQ7Cj4gK30KPiArCj4gKy8qKgo+ ICsgKiBSZXR1cm4gbiBiaXRzIGZyb20gdGhlIGJ1ZmZlciwgbiBoYXMgdG8gYmUgaW4gdGhlIDAt NjQgcmFuZ2UuCj4gKyAqLwo+ICtzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGJpdHNfcmVhZF82NChC aXRzdHJlYW1Db250ZXh0ICpiYywgdW5zaWduZWQgaW50IG4pCj4gK3sKPiArICAgIGF2X2Fzc2Vy dDIobiA8PSA2NCk7Cj4gKwo+ICsgICAgaWYgKG4gPT0gNjQpIHsKPiArICAgICAgICB1aW50NjRf dCByZXQgPSBiaXRzX3JlYWRfNjMoYmMsIDYzKTsKPiArI2lmZGVmIEJJVFNUUkVBTV9SRUFERVJf TEUKPiArICAgICAgICByZXR1cm4gcmV0IHwgKCh1aW50NjRfdCliaXRzX3JlYWRfYml0KGJjKSA8 PCA2Myk7Cj4gKyNlbHNlCj4gKyAgICAgICAgcmV0dXJuIChyZXQgPDwgMSkgfCAodWludDY0X3Qp Yml0c19yZWFkX2JpdChiYyk7Cj4gKyNlbmRpZgo+ICsgICAgfQo+ICsgICAgcmV0dXJuIGJpdHNf cmVhZF82MyhiYywgbik7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBSZXR1cm4gbiBiaXRzIGZyb20g dGhlIGJ1ZmZlciBhcyBhIHNpZ25lZCBpbnRlZ2VyLgo+ICsgKiBuIGhhcyB0byBiZSBpbiB0aGUg MC0zMiByYW5nZS4KPiArICovCj4gK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBiaXRzX3JlYWRfc2ln bmVkKEJpdHN0cmVhbUNvbnRleHQgKmJjLCB1bnNpZ25lZCBpbnQKPiBuKQo+ICt7Cj4gKyAgICBy ZXR1cm4gc2lnbl9leHRlbmQoYml0c19yZWFkKGJjLCBuKSwgbik7Cj4gK30KPiArCj4gKy8qKgo+ ICsgKiBSZXR1cm4gbiBiaXRzIGZyb20gdGhlIGJ1ZmZlciBidXQgZG8gbm90IGNoYW5nZSB0aGUg YnVmZmVyIHN0YXRlLgo+ICsgKiBuIGhhcyB0byBiZSBpbiB0aGUgMS0zMiByYW5nZS4gTWF5Cj4g KyAqLwo+ICtzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJpdHNfcGVla19ueihCaXRzdHJlYW1Db250 ZXh0ICpiYywgdW5zaWduZWQgaW50IG4pCj4gK3sKPiArICAgIGF2X2Fzc2VydDIobiA+IDAgJiYg biA8PSAzMik7Cj4gKwo+ICsgICAgaWYgKG4gPiBiYy0+Yml0c192YWxpZCkKPiArICAgICAgICBi aXRzX3ByaXZfcmVmaWxsXzMyKGJjKTsKPiArCj4gKyAgICByZXR1cm4gYml0c19wcml2X3ZhbF9z aG93KGJjLCBuKTsKPiArfQo+ICsKPiArLyoqCj4gKyAqIFJldHVybiBuIGJpdHMgZnJvbSB0aGUg YnVmZmVyIGJ1dCBkbyBub3QgY2hhbmdlIHRoZSBidWZmZXIgc3RhdGUuCj4gKyAqIG4gaGFzIHRv IGJlIGluIHRoZSAwLTMyIHJhbmdlLgo+ICsgKi8KPiArc3RhdGljIGlubGluZSB1aW50MzJfdCBi aXRzX3BlZWsoQml0c3RyZWFtQ29udGV4dCAqYmMsIHVuc2lnbmVkIGludCBuKQo+ICt7Cj4gKyAg ICBhdl9hc3NlcnQyKG4gPD0gMzIpOwo+ICsKPiArICAgIGlmICghbikKPiArICAgICAgICByZXR1 cm4gMDsKPiArCj4gKyAgICByZXR1cm4gYml0c19wZWVrX256KGJjLCBuKTsKPiArfQo+ICsKPiAr LyoqCj4gKyAqIFJldHVybiBuIGJpdHMgZnJvbSB0aGUgYnVmZmVyIGFzIGEgc2lnbmVkIGludGVn ZXIsCj4gKyAqIGRvIG5vdCBjaGFuZ2UgdGhlIGJ1ZmZlciBzdGF0ZS4KPiArICogbiBoYXMgdG8g YmUgaW4gdGhlIDAtMzIgcmFuZ2UuCj4gKyAqLwo+ICtzdGF0aWMgaW5saW5lIGludCBiaXRzX3Bl ZWtfc2lnbmVkKEJpdHN0cmVhbUNvbnRleHQgKmJjLCB1bnNpZ25lZCBpbnQgbikKPiArewo+ICsg ICAgcmV0dXJuIHNpZ25fZXh0ZW5kKGJpdHNfcGVlayhiYywgbiksIG4pOwo+ICt9Cj4gKwo+ICsv KioKPiArICogU2tpcCBuIGJpdHMgaW4gdGhlIGJ1ZmZlci4KPiArICovCj4gK3N0YXRpYyBpbmxp bmUgdm9pZCBiaXRzX3NraXAoQml0c3RyZWFtQ29udGV4dCAqYmMsIHVuc2lnbmVkIGludCBuKQo+ ICt7Cj4gKyAgICBpZiAobiA8IGJjLT5iaXRzX3ZhbGlkKQo+ICsgICAgICAgIGJpdHNfcHJpdl9z a2lwX3JlbWFpbmluZyhiYywgbik7Cj4gKyAgICBlbHNlIHsKPiArICAgICAgICBuIC09IGJjLT5i aXRzX3ZhbGlkOwo+ICsgICAgICAgIGJjLT5iaXRzICAgICAgID0gMDsKPiArICAgICAgICBiYy0+ Yml0c192YWxpZCA9IDA7Cj4gKwo+ICsgICAgICAgIGlmIChuID49IDY0KSB7Cj4gKyAgICAgICAg ICAgIHVuc2lnbmVkIGludCBza2lwID0gbiAvIDg7Cj4gKwo+ICsgICAgICAgICAgICBuIC09IHNr aXAgKiA4Owo+ICsgICAgICAgICAgICBiYy0+cHRyICs9IHNraXA7Cj4gKyAgICAgICAgfQo+ICsg ICAgICAgIGJpdHNfcHJpdl9yZWZpbGxfNjQoYmMpOwo+ICsgICAgICAgIGlmIChuKQo+ICsgICAg ICAgICAgICBiaXRzX3ByaXZfc2tpcF9yZW1haW5pbmcoYmMsIG4pOwo+ICsgICAgfQo+ICt9Cj4g Kwo+ICsvKioKPiArICogU2VlayB0byB0aGUgZ2l2ZW4gYml0IHBvc2l0aW9uLgo+ICsgKi8KPiAr c3RhdGljIGlubGluZSB2b2lkIGJpdHNfc2VlayhCaXRzdHJlYW1Db250ZXh0ICpiYywgdW5zaWdu ZWQgcG9zKQo+ICt7Cj4gKyAgICBiYy0+cHRyICAgICAgICA9IGJjLT5idWZmZXI7Cj4gKyAgICBi Yy0+Yml0cyAgICAgICA9IDA7Cj4gKyAgICBiYy0+Yml0c192YWxpZCA9IDA7Cj4gKwo+ICsgICAg Yml0c19za2lwKGJjLCBwb3MpOwo+ICt9Cj4gKwo+ICsvKioKPiArICogU2tpcCBiaXRzIHRvIGEg Ynl0ZSBib3VuZGFyeS4KPiArICovCj4gK3N0YXRpYyBpbmxpbmUgY29uc3QgdWludDhfdCAqYml0 c19hbGlnbihCaXRzdHJlYW1Db250ZXh0ICpiYykKPiArewo+ICsgICAgdW5zaWduZWQgaW50IG4g PSAtYml0c190ZWxsKGJjKSAmIDc7Cj4gKyAgICBpZiAobikKPiArICAgICAgICBiaXRzX3NraXAo YmMsIG4pOwo+ICsgICAgcmV0dXJuIGJjLT5idWZmZXIgKyAoYml0c190ZWxsKGJjKSA+PiAzKTsK PiArfQo+ICsKPiArLyoqCj4gKyAqIFJlYWQgTVBFRy0xIGRjLXN0eWxlIFZMQyAoc2lnbiBiaXQg KyBtYW50aXNzYSB3aXRoIG5vIE1TQikuCj4gKyAqIElmIE1TQiBub3Qgc2V0IGl0IGlzIG5lZ2F0 aXZlLgo+ICsgKiBAcGFyYW0gbiBsZW5ndGggaW4gYml0cwo+ICsgKi8KPiArc3RhdGljIGlubGlu ZSBpbnQgYml0c19yZWFkX3hiaXRzKEJpdHN0cmVhbUNvbnRleHQgKmJjLCB1bnNpZ25lZCBpbnQg bikKPiArewo+ICsgICAgaW50MzJfdCBjYWNoZSA9IGJpdHNfcGVlayhiYywgMzIpOwo+ICsgICAg aW50IHNpZ24gPSB+Y2FjaGUgPj4gMzE7Cj4gKyAgICBiaXRzX3ByaXZfc2tpcF9yZW1haW5pbmco YmMsIG4pOwo+ICsKPiArICAgIHJldHVybiAoKCgodWludDMyX3QpKHNpZ24gXiBjYWNoZSkpID4+ ICgzMiAtIG4pKSBeIHNpZ24pIC0gc2lnbjsKPiArfQo+ICsKPiArLyoqCj4gKyAqIFJldHVybiBk ZWNvZGVkIHRydW5jYXRlZCB1bmFyeSBjb2RlIGZvciB0aGUgdmFsdWVzIDAsIDEsIDIuCj4gKyAq Lwo+ICtzdGF0aWMgaW5saW5lIGludCBiaXRzX2RlY29kZTAxMihCaXRzdHJlYW1Db250ZXh0ICpi YykKPiArewo+ICsgICAgaWYgKCFiaXRzX3JlYWRfYml0KGJjKSkKPiArICAgICAgICByZXR1cm4g MDsKPiArICAgIGVsc2UKPiArICAgICAgICByZXR1cm4gYml0c19yZWFkX2JpdChiYykgKyAxOwo+ ICt9Cj4gKwo+ICsvKioKPiArICogUmV0dXJuIGRlY29kZWQgdHJ1bmNhdGVkIHVuYXJ5IGNvZGUg Zm9yIHRoZSB2YWx1ZXMgMiwgMSwgMC4KPiArICovCj4gK3N0YXRpYyBpbmxpbmUgaW50IGJpdHNf ZGVjb2RlMjEwKEJpdHN0cmVhbUNvbnRleHQgKmJjKQo+ICt7Cj4gKyAgICBpZiAoYml0c19yZWFk X2JpdChiYykpCj4gKyAgICAgICAgcmV0dXJuIDA7Cj4gKyAgICBlbHNlCj4gKyAgICAgICAgcmV0 dXJuIDIgLSBiaXRzX3JlYWRfYml0KGJjKTsKPiArfQo+ICsKPiArLyogUmVhZCBzaWduIGJpdCBh bmQgZmxpcCB0aGUgc2lnbiBvZiB0aGUgcHJvdmlkZWQgdmFsdWUgYWNjb3JkaW5nbHkuICovCj4g K3N0YXRpYyBpbmxpbmUgaW50IGJpdHNfYXBwbHlfc2lnbihCaXRzdHJlYW1Db250ZXh0ICpiYywg aW50IHZhbCkKPiArewo+ICsgICAgaW50IHNpZ24gPSBiaXRzX3JlYWRfc2lnbmVkKGJjLCAxKTsK PiArICAgIHJldHVybiAodmFsIF4gc2lnbikgLSBzaWduOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5s aW5lIGludCBiaXRzX3NraXBfMXN0b3BfOGRhdGEoQml0c3RyZWFtQ29udGV4dCAqcykKPiArewo+ ICsgICAgaWYgKGJpdHNfbGVmdChzKSA8PSAwKQo+ICsgICAgICAgIHJldHVybiBBVkVSUk9SX0lO VkFMSUREQVRBOwo+ICsKPiArICAgIHdoaWxlIChiaXRzX3JlYWRfYml0KHMpKSB7Cj4gKyAgICAg ICAgYml0c19za2lwKHMsIDgpOwo+ICsgICAgICAgIGlmIChiaXRzX2xlZnQocykgPD0gMCkKPiAr ICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cj4gKyAgICB9Cj4gKwo+ICsg ICAgcmV0dXJuIDA7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBSZXR1cm4gdGhlIExVVCBlbGVtZW50 IGZvciB0aGUgZ2l2ZW4gYml0c3RyZWFtIGNvbmZpZ3VyYXRpb24uCj4gKyAqLwo+ICtzdGF0aWMg aW5saW5lIGludCBiaXRzX3ByaXZfc2V0X2lkeChCaXRzdHJlYW1Db250ZXh0ICpiYywgaW50IGNv ZGUsIGludCAqbiwKPiBpbnQgKm5iX2JpdHMsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGNvbnN0IFZMQ0VsZW0gKnRhYmxlKQo+ICt7Cj4gKyAgICB1bnNpZ25lZCBpZHg7 Cj4gKwo+ICsgICAgKm5iX2JpdHMgPSAtKm47Cj4gKyAgICBpZHggPSBiaXRzX3BlZWsoYmMsICpu Yl9iaXRzKSArIGNvZGU7Cj4gKyAgICAqbiA9IHRhYmxlW2lkeF0ubGVuOwo+ICsKPiArICAgIHJl dHVybiB0YWJsZVtpZHhdLnN5bTsKPiArfQo+ICsKPiArLyoqCj4gKyAqIFBhcnNlIGEgdmxjIGNv ZGUuCj4gKyAqIEBwYXJhbSBiaXRzIGlzIHRoZSBudW1iZXIgb2YgYml0cyB3aGljaCB3aWxsIGJl IHJlYWQgYXQgb25jZSwgbXVzdCBiZQo+ICsgKiAgICAgICAgICAgICBpZGVudGljYWwgdG8gbmJf Yml0cyBpbiBpbml0X3ZsYygpCj4gKyAqIEBwYXJhbSBtYXhfZGVwdGggaXMgdGhlIG51bWJlciBv ZiB0aW1lcyBiaXRzIGJpdHMgbXVzdCBiZSByZWFkIHRvCj4gY29tcGxldGVseQo+ICsgKiAgICAg ICAgICAgICAgICAgIHJlYWQgdGhlIGxvbmdlc3QgdmxjIGNvZGUKPiArICogICAgICAgICAgICAg ICAgICA9IChtYXhfdmxjX2xlbmd0aCArIGJpdHMgLSAxKSAvIGJpdHMKPiArICogSWYgdGhlIHZs YyBjb2RlIGlzIGludmFsaWQgYW5kIG1heF9kZXB0aD0xLCB0aGVuIG5vIGJpdHMgd2lsbCBiZQo+ IHJlbW92ZWQuCj4gKyAqIElmIHRoZSB2bGMgY29kZSBpcyBpbnZhbGlkIGFuZCBtYXhfZGVwdGg+ MSwgdGhlbiB0aGUgbnVtYmVyIG9mIGJpdHMKPiByZW1vdmVkCj4gKyAqIGlzIHVuZGVmaW5lZC4K PiArICovCj4gK3N0YXRpYyBpbmxpbmUgaW50IGJpdHNfcmVhZF92bGMoQml0c3RyZWFtQ29udGV4 dCAqYmMsIGNvbnN0IFZMQ0VsZW0gKnRhYmxlLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGludCBiaXRzLCBpbnQgbWF4X2RlcHRoKQo+ICt7Cj4gKyAgICBpbnQgbmJfYml0czsK PiArICAgIHVuc2lnbmVkIGlkeCA9IGJpdHNfcGVlayhiYywgYml0cyk7Cj4gKyAgICBpbnQgY29k ZSAgICAgPSB0YWJsZVtpZHhdLnN5bTsKPiArICAgIGludCBuICAgICAgICA9IHRhYmxlW2lkeF0u bGVuOwo+ICsKPiArICAgIGlmIChtYXhfZGVwdGggPiAxICYmIG4gPCAwKSB7Cj4gKyAgICAgICAg Yml0c19wcml2X3NraXBfcmVtYWluaW5nKGJjLCBiaXRzKTsKPiArICAgICAgICBjb2RlID0gYml0 c19wcml2X3NldF9pZHgoYmMsIGNvZGUsICZuLCAmbmJfYml0cywgdGFibGUpOwo+ICsgICAgICAg IGlmIChtYXhfZGVwdGggPiAyICYmIG4gPCAwKSB7Cj4gKyAgICAgICAgICAgIGJpdHNfcHJpdl9z a2lwX3JlbWFpbmluZyhiYywgbmJfYml0cyk7Cj4gKyAgICAgICAgICAgIGNvZGUgPSBiaXRzX3By aXZfc2V0X2lkeChiYywgY29kZSwgJm4sICZuYl9iaXRzLCB0YWJsZSk7Cj4gKyAgICAgICAgfQo+ ICsgICAgfQo+ICsgICAgYml0c19wcml2X3NraXBfcmVtYWluaW5nKGJjLCBuKTsKPiArCj4gKyAg ICByZXR1cm4gY29kZTsKPiArfQo+ICsKPiArI2RlZmluZSBCSVRTX1JMX1ZMQyhsZXZlbCwgcnVu LCBiYywgdGFibGUsIGJpdHMsIG1heF9kZXB0aCkgXAo+ICsgICAgZG8geyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gKyAgICAgICAgaW50IG4s IG5iX2JpdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiArICAgICAg ICB1bnNpZ25lZCBpbnQgaW5kZXggPSBiaXRzX3BlZWsoYmMsIGJpdHMpOyAgICAgICAgICAgXAo+ ICsgICAgICAgIGxldmVsID0gdGFibGVbaW5kZXhdLmxldmVsOyAgICAgICAgICAgICAgICAgICAg ICAgICBcCj4gKyAgICAgICAgbiAgICAgPSB0YWJsZVtpbmRleF0ubGVuOyAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAo+ICsgICAgICAgIGlmIChtYXhfZGVwdGggPiAxICYmIG4g PCAwKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCj4gKyAgICAgICAgICAgIGJpdHNfc2tpcChi YywgYml0cyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ICsgICAgICAg ICAgICBuYl9iaXRzID0gLW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKPiArICAgICAgICAgICAgaW5kZXggPSBiaXRzX3BlZWsoYmMsIG5iX2JpdHMpICsgbGV2 ZWw7ICAgICAgICAgXAo+ICsgICAgICAgICAgICBsZXZlbCA9IHRhYmxlW2luZGV4XS5sZXZlbDsg ICAgICAgICAgICAgICAgICAgICBcCj4gKyAgICAgICAgICAgIG4gICAgID0gdGFibGVbaW5kZXhd LmxlbjsgICAgICAgICAgICAgICAgICAgICAgIFwKPiArICAgICAgICAgICAgaWYgKG1heF9kZXB0 aCA+IDIgJiYgbiA8IDApIHsgICAgICAgICAgICAgICAgICAgXAo+ICsgICAgICAgICAgICAgICAg Yml0c19za2lwKGJjLCBuYl9iaXRzKTsgICAgICAgICAgICAgICAgICAgICBcCj4gKyAgICAgICAg ICAgICAgICBuYl9iaXRzID0gLW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgXAo+ICsgICAgICAgICAgICAgICAgaW5kZXggPSBiaXRzX3BlZWsoYmMsIG5iX2JpdHMpICsg bGV2ZWw7ICAgICBcCj4gKyAgICAgICAgICAgICAgICBsZXZlbCA9IHRhYmxlW2luZGV4XS5sZXZl bDsgICAgICAgICAgICAgICAgIFwKPiArICAgICAgICAgICAgICAgIG4gICAgID0gdGFibGVbaW5k ZXhdLmxlbjsgICAgICAgICAgICAgICAgICAgXAo+ICsgICAgICAgICAgICB9ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gKyAgICAgICAgfSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiArICAgICAgICBy dW4gPSB0YWJsZVtpbmRleF0ucnVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ICsg ICAgICAgIGJpdHNfc2tpcChiYywgbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCj4gKyAgICB9IHdoaWxlICgwKQo+ICsKPiArI2VuZGlmIC8qIEFWQ09ERUNfQklUU1RSRUFN X0ggKi8KPiAtLQo+IDIuMzUuMQo+Cj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KPiBmZm1wZWctZGV2ZWwgbWFpbGluZyBsaXN0Cj4gZmZtcGVnLWRldmVs QGZmbXBlZy5vcmcKPiBodHRwczovL2ZmbXBlZy5vcmcvbWFpbG1hbi9saXN0aW5mby9mZm1wZWct ZGV2ZWwKPgo+IFRvIHVuc3Vic2NyaWJlLCB2aXNpdCBsaW5rIGFib3ZlLCBvciBlbWFpbAo+IGZm bXBlZy1kZXZlbC1yZXF1ZXN0QGZmbXBlZy5vcmcgd2l0aCBzdWJqZWN0ICJ1bnN1YnNjcmliZSIu Cj4KCgpOQUsKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K ZmZtcGVnLWRldmVsIG1haWxpbmcgbGlzdApmZm1wZWctZGV2ZWxAZmZtcGVnLm9yZwpodHRwczov L2ZmbXBlZy5vcmcvbWFpbG1hbi9saXN0aW5mby9mZm1wZWctZGV2ZWwKClRvIHVuc3Vic2NyaWJl LCB2aXNpdCBsaW5rIGFib3ZlLCBvciBlbWFpbApmZm1wZWctZGV2ZWwtcmVxdWVzdEBmZm1wZWcu b3JnIHdpdGggc3ViamVjdCAidW5zdWJzY3JpYmUiLgo=