From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f49.google.com (mail-pj1-f49.google.com [209.85.216.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1D1C2811 for ; Tue, 23 Jan 2024 03:53:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.49 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705982007; cv=none; b=pdIoqvzpy0oqWG1OWF/KARw8XneWP0QgKTaPPIEB1ES/nQNfhrR+8DMuKSk2LwfGlsgy8OTa/n/Uj3XX+GdTOsiHPQgzktOMB/wBux9ew6ZuVI9RzaAd+EBiym9GHL4Lll+KED5mmOWX3oBRnY/Fm0gnTSAE5jsKIgOGlfMfHr8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705982007; c=relaxed/simple; bh=ZlC9HcryiKZezGX4KKPuKWyBHD/mXVHVwCYawtuI8Fo=; h=MIME-Version:From:Date:Message-ID:Subject:To:Cc:Content-Type; b=hOw+Sxk2rHzNW2dBekv2ryg1+JfvcILhf8PAynIowBxG03ba1sSFsAtcLK6/YQY1/LHls/eVTddMDksVFF9EH0ct+Q86X6RsiGgoX9Lmrb29H0ZjpQTks/Ms1DethypyJiw/MWUiSA1arCiyKHcfnMHVUPy8pfOfOFgtRJ0lZK4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=KQoC0seZ; arc=none smtp.client-ip=209.85.216.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="KQoC0seZ" Received: by mail-pj1-f49.google.com with SMTP id 98e67ed59e1d1-2900c648b8bso2931629a91.3 for ; Mon, 22 Jan 2024 19:53:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1705982005; x=1706586805; darn=vger.kernel.org; h=cc:to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=ZlC9HcryiKZezGX4KKPuKWyBHD/mXVHVwCYawtuI8Fo=; b=KQoC0seZHLWPegb4SHMqg8twYWfQMxMXCbO1T3Tf6jvB10T3u/OWK7W+zHAgmX2MjW k18X8BSNgoH/ue4BMi9nyeq1yGNBo0qNnvqGOfJgWC5gRxUt4nk5qt1U1t43si0YB9xm Pz1mlAJPAiY3vYgM9BkG3QE771KfbVCOrFJU39mhRGW+rmqH5jrUyGVQGNvePs+B2SKq vBAGxEQ2FCOn/RZJl17evzUmE+e/uoObv6ZyMtDvTfA5hVDSfUiVo8dC6/kxXqZUKlKT huMaVDhdLjddU7UJ1LA9VficMaZecSYhMA1l/qZFPqlmL3E5czK71Ew3Z54oKduDKOxw Mz5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705982005; x=1706586805; h=cc:to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=ZlC9HcryiKZezGX4KKPuKWyBHD/mXVHVwCYawtuI8Fo=; b=L/bVueDF0bz19MEF7h86sjH2Eepa2/0zWxXhpXXYS51j7T0k1aIc1yRBuC0JxKhXK/ mkRS152eylL1soTOjHWmepkeUBqqcOBQtwm8bZAsAEST9NDhhzkrUQSHUtHat76HapCB U6FNisQVdAwjaqwxIKXjMrcO76KHUTVIVeZtNLlos8ewHx4pepyvm+DOS64zSxA/+k7y hX4sV7bXGTw2TCman/a3KEDni3g9taVOW60E8j1lp5jvWY+zcv9/lozvYIzsO0DRcfrr axUVrGf8XCjqfaeeVwX9ATa8of46KdXC082VdYxRO6K9K3+mSk7PkoxXV0E50qIb507y /SSA== X-Gm-Message-State: AOJu0YyIF0pEieVMiGLSgkrctj50Y/F8o6/Re2oMHXHWwqRSWRE3fRDF p4FSjn0HTZwIJw1ROfBHcpRV5Itwub7MOTcUF+ZA4+rI2Rv4cTRj1S3BhK8CXiYcP57hmxKAErI bug8u0k79Qdi2oyFq2qJdar4WRA== X-Google-Smtp-Source: AGHT+IE/fFlxtlPSZGWyoeszdX4GY6dDeEno/ClIAmcTdgcrQVXOW6AR7o7ViKz+c3RYaNrff7uEovOJxgoNN/1T+qI= X-Received: by 2002:a17:90a:dd46:b0:290:b018:a2e6 with SMTP id u6-20020a17090add4600b00290b018a2e6mr1383342pjv.59.1705982005247; Mon, 22 Jan 2024 19:53:25 -0800 (PST) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Chenyuan Yang Date: Mon, 22 Jan 2024 21:53:14 -0600 Message-ID: Subject: [Linux Kernel Bug] memory leak in ubi_attach To: linux-mtd@lists.infradead.org, richard@nod.at, miquel.raynal@bootlin.com, vigneshr@ti.com Cc: linux-kernel@vger.kernel.org, syzkaller@googlegroups.com, Zijie Zhao Content-Type: multipart/mixed; boundary="0000000000006a9de8060f94e3b5" --0000000000006a9de8060f94e3b5 Content-Type: text/plain; charset="UTF-8" Dear Linux Kernel Developers for UBI, We encountered "memory leak in ubi_attach" when testing UBI with Syzkaller and our generated specifications. syz repro: https://drive.google.com/file/d/17FoGw6akfufz05U-oRBP2wXmOiFF1VUq/view?usp=drive_link C reproducer: https://drive.google.com/file/d/1ayd3lmHPvqNoI01pQEdU832EktpTUnZ_/view?usp=drive_link report: https://drive.google.com/file/d/1hC2arY3FbQt-6L5rbDfY-DQ2oH82IIGq/view?usp=drive_link stats: https://drive.google.com/file/d/1REig9fV0H1fYPWaiicc-JVLlCpo7TTw4/view?usp=drive_link This memory leak is triggered by `ioctl$UBI_IOCATT`, where `ubi_attach_info` invokes `kmem_cache_create` (https://elixir.bootlin.com/linux/v6.7/source/drivers/mtd/ubi/attach.c#L1464). It seems that the memory leak occurs when the slab cache is successfully created. I apologize for not being able to conduct a deeper analysis of the root cause, as my expertise in UBI drivers is limited. If you have any questions or require more information, please feel free to contact us. Reported-by: Chenyuan Yang Best, Chenyuan --0000000000006a9de8060f94e3b5 Content-Type: application/octet-stream; name="repro.cprog" Content-Disposition: attachment; filename="repro.cprog" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lrpt61oc0 Ly8gYXV0b2dlbmVyYXRlZCBieSBzeXprYWxsZXIgKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUv c3l6a2FsbGVyKQoKI2RlZmluZSBfR05VX1NPVVJDRSAKCiNpbmNsdWRlIDxhcnBhL2luZXQuaD4K I2luY2x1ZGUgPGRpcmVudC5oPgojaW5jbHVkZSA8ZW5kaWFuLmg+CiNpbmNsdWRlIDxlcnJuby5o PgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPG5ldC9pZi5oPgojaW5jbHVkZSA8bmV0L2lm X2FycC5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5j bHVkZSA8c2NoZWQuaD4KI2luY2x1ZGUgPHNldGptcC5oPgojaW5jbHVkZSA8c2lnbmFsLmg+CiNp bmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGJvb2wuaD4KI2luY2x1ZGUgPHN0ZGludC5o PgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5n Lmg+CiNpbmNsdWRlIDxzeXMvZXBvbGwuaD4KI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojaW5jbHVk ZSA8c3lzL21vdW50Lmg+CiNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KI2luY2x1ZGUgPHN5cy9yZXNv dXJjZS5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2lu Y2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3lz L3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvdWlvLmg+CiNpbmNsdWRlIDxzeXMvd2FpdC5oPgojaW5j bHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojaW5jbHVkZSA8bGludXgvY2FwYWJp bGl0eS5oPgojaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KI2luY2x1ZGUgPGxpbnV4L2dlbmV0bGlu ay5oPgojaW5jbHVkZSA8bGludXgvaWZfYWRkci5oPgojaW5jbHVkZSA8bGludXgvaWZfZXRoZXIu aD4KI2luY2x1ZGUgPGxpbnV4L2lmX2xpbmsuaD4KI2luY2x1ZGUgPGxpbnV4L2lmX3R1bi5oPgoj aW5jbHVkZSA8bGludXgvaW42Lmg+CiNpbmNsdWRlIDxsaW51eC9pcC5oPgojaW5jbHVkZSA8bGlu dXgvbmVpZ2hib3VyLmg+CiNpbmNsdWRlIDxsaW51eC9uZXQuaD4KI2luY2x1ZGUgPGxpbnV4L25l dGxpbmsuaD4KI2luY2x1ZGUgPGxpbnV4L25sODAyMTEuaD4KI2luY2x1ZGUgPGxpbnV4L3Jma2ls bC5oPgojaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiNpbmNsdWRlIDxsaW51eC90Y3AuaD4K I2luY2x1ZGUgPGxpbnV4L3ZldGguaD4KCnN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgcHJvY2lk OwoKc3RhdGljIF9fdGhyZWFkIGludCBjbG9uZV9vbmdvaW5nOwpzdGF0aWMgX190aHJlYWQgaW50 IHNraXBfc2VndjsKc3RhdGljIF9fdGhyZWFkIGptcF9idWYgc2Vndl9lbnY7CgpzdGF0aWMgdm9p ZCBzZWd2X2hhbmRsZXIoaW50IHNpZywgc2lnaW5mb190KiBpbmZvLCB2b2lkKiBjdHgpCnsKCWlm IChfX2F0b21pY19sb2FkX24oJmNsb25lX29uZ29pbmcsIF9fQVRPTUlDX1JFTEFYRUQpICE9IDAp IHsKCQlleGl0KHNpZyk7Cgl9Cgl1aW50cHRyX3QgYWRkciA9ICh1aW50cHRyX3QpaW5mby0+c2lf YWRkcjsKCWNvbnN0IHVpbnRwdHJfdCBwcm9nX3N0YXJ0ID0gMSA8PCAyMDsKCWNvbnN0IHVpbnRw dHJfdCBwcm9nX2VuZCA9IDEwMCA8PCAyMDsKCWludCBza2lwID0gX19hdG9taWNfbG9hZF9uKCZz a2lwX3NlZ3YsIF9fQVRPTUlDX1JFTEFYRUQpICE9IDA7CglpbnQgdmFsaWQgPSBhZGRyIDwgcHJv Z19zdGFydCB8fCBhZGRyID4gcHJvZ19lbmQ7CglpZiAoc2tpcCAmJiB2YWxpZCkgewoJCV9sb25n am1wKHNlZ3ZfZW52LCAxKTsKCX0KCWV4aXQoc2lnKTsKfQoKc3RhdGljIHZvaWQgaW5zdGFsbF9z ZWd2X2hhbmRsZXIodm9pZCkKewoJc3RydWN0IHNpZ2FjdGlvbiBzYTsKCW1lbXNldCgmc2EsIDAs IHNpemVvZihzYSkpOwoJc2Euc2FfaGFuZGxlciA9IFNJR19JR047CglzeXNjYWxsKFNZU19ydF9z aWdhY3Rpb24sIDB4MjAsICZzYSwgTlVMTCwgOCk7CglzeXNjYWxsKFNZU19ydF9zaWdhY3Rpb24s IDB4MjEsICZzYSwgTlVMTCwgOCk7CgltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKCXNhLnNh X3NpZ2FjdGlvbiA9IHNlZ3ZfaGFuZGxlcjsKCXNhLnNhX2ZsYWdzID0gU0FfTk9ERUZFUiB8IFNB X1NJR0lORk87CglzaWdhY3Rpb24oU0lHU0VHViwgJnNhLCBOVUxMKTsKCXNpZ2FjdGlvbihTSUdC VVMsICZzYSwgTlVMTCk7Cn0KCiNkZWZpbmUgTk9ORkFJTElORyguLi4pICh7IGludCBvayA9IDE7 IF9fYXRvbWljX2ZldGNoX2FkZCgmc2tpcF9zZWd2LCAxLCBfX0FUT01JQ19TRVFfQ1NUKTsgaWYg KF9zZXRqbXAoc2Vndl9lbnYpID09IDApIHsgX19WQV9BUkdTX187IH0gZWxzZSBvayA9IDA7IF9f YXRvbWljX2ZldGNoX3N1Yigmc2tpcF9zZWd2LCAxLCBfX0FUT01JQ19TRVFfQ1NUKTsgb2s7IH0p CgpzdGF0aWMgdm9pZCBzbGVlcF9tcyh1aW50NjRfdCBtcykKewoJdXNsZWVwKG1zICogMTAwMCk7 Cn0KCnN0YXRpYyB1aW50NjRfdCBjdXJyZW50X3RpbWVfbXModm9pZCkKewoJc3RydWN0IHRpbWVz cGVjIHRzOwoJaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpKQoJZXhpdCgx KTsKCXJldHVybiAodWludDY0X3QpdHMudHZfc2VjICogMTAwMCArICh1aW50NjRfdCl0cy50dl9u c2VjIC8gMTAwMDAwMDsKfQoKc3RhdGljIHZvaWQgdXNlX3RlbXBvcmFyeV9kaXIodm9pZCkKewoJ Y2hhciB0bXBkaXJfdGVtcGxhdGVbXSA9ICIuL3N5emthbGxlci5YWFhYWFgiOwoJY2hhciogdG1w ZGlyID0gbWtkdGVtcCh0bXBkaXJfdGVtcGxhdGUpOwoJaWYgKCF0bXBkaXIpCglleGl0KDEpOwoJ aWYgKGNobW9kKHRtcGRpciwgMDc3NykpCglleGl0KDEpOwoJaWYgKGNoZGlyKHRtcGRpcikpCgll eGl0KDEpOwp9CgpzdGF0aWMgdm9pZCB0aHJlYWRfc3RhcnQodm9pZCogKCpmbikodm9pZCopLCB2 b2lkKiBhcmcpCnsKCXB0aHJlYWRfdCB0aDsKCXB0aHJlYWRfYXR0cl90IGF0dHI7CglwdGhyZWFk X2F0dHJfaW5pdCgmYXR0cik7CglwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZhdHRyLCAxMjgg PDwgMTApOwoJaW50IGkgPSAwOwoJZm9yICg7IGkgPCAxMDA7IGkrKykgewoJCWlmIChwdGhyZWFk X2NyZWF0ZSgmdGgsICZhdHRyLCBmbiwgYXJnKSA9PSAwKSB7CgkJCXB0aHJlYWRfYXR0cl9kZXN0 cm95KCZhdHRyKTsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoZXJybm8gPT0gRUFHQUlOKSB7CgkJCXVz bGVlcCg1MCk7CgkJCWNvbnRpbnVlOwoJCX0KCQlicmVhazsKCX0KCWV4aXQoMSk7Cn0KCnR5cGVk ZWYgc3RydWN0IHsKCWludCBzdGF0ZTsKfSBldmVudF90OwoKc3RhdGljIHZvaWQgZXZlbnRfaW5p dChldmVudF90KiBldikKewoJZXYtPnN0YXRlID0gMDsKfQoKc3RhdGljIHZvaWQgZXZlbnRfcmVz ZXQoZXZlbnRfdCogZXYpCnsKCWV2LT5zdGF0ZSA9IDA7Cn0KCnN0YXRpYyB2b2lkIGV2ZW50X3Nl dChldmVudF90KiBldikKewoJaWYgKGV2LT5zdGF0ZSkKCWV4aXQoMSk7CglfX2F0b21pY19zdG9y ZV9uKCZldi0+c3RhdGUsIDEsIF9fQVRPTUlDX1JFTEVBU0UpOwoJc3lzY2FsbChTWVNfZnV0ZXgs ICZldi0+c3RhdGUsIEZVVEVYX1dBS0UgfCBGVVRFWF9QUklWQVRFX0ZMQUcsIDEwMDAwMDApOwp9 CgpzdGF0aWMgdm9pZCBldmVudF93YWl0KGV2ZW50X3QqIGV2KQp7Cgl3aGlsZSAoIV9fYXRvbWlj X2xvYWRfbigmZXYtPnN0YXRlLCBfX0FUT01JQ19BQ1FVSVJFKSkKCQlzeXNjYWxsKFNZU19mdXRl eCwgJmV2LT5zdGF0ZSwgRlVURVhfV0FJVCB8IEZVVEVYX1BSSVZBVEVfRkxBRywgMCwgMCk7Cn0K CnN0YXRpYyBpbnQgZXZlbnRfaXNzZXQoZXZlbnRfdCogZXYpCnsKCXJldHVybiBfX2F0b21pY19s b2FkX24oJmV2LT5zdGF0ZSwgX19BVE9NSUNfQUNRVUlSRSk7Cn0KCnN0YXRpYyBpbnQgZXZlbnRf dGltZWR3YWl0KGV2ZW50X3QqIGV2LCB1aW50NjRfdCB0aW1lb3V0KQp7Cgl1aW50NjRfdCBzdGFy dCA9IGN1cnJlbnRfdGltZV9tcygpOwoJdWludDY0X3Qgbm93ID0gc3RhcnQ7Cglmb3IgKDs7KSB7 CgkJdWludDY0X3QgcmVtYWluID0gdGltZW91dCAtIChub3cgLSBzdGFydCk7CgkJc3RydWN0IHRp bWVzcGVjIHRzOwoJCXRzLnR2X3NlYyA9IHJlbWFpbiAvIDEwMDA7CgkJdHMudHZfbnNlYyA9IChy ZW1haW4gJSAxMDAwKSAqIDEwMDAgKiAxMDAwOwoJCXN5c2NhbGwoU1lTX2Z1dGV4LCAmZXYtPnN0 YXRlLCBGVVRFWF9XQUlUIHwgRlVURVhfUFJJVkFURV9GTEFHLCAwLCAmdHMpOwoJCWlmIChfX2F0 b21pY19sb2FkX24oJmV2LT5zdGF0ZSwgX19BVE9NSUNfQUNRVUlSRSkpCgkJCXJldHVybiAxOwoJ CW5vdyA9IGN1cnJlbnRfdGltZV9tcygpOwoJCWlmIChub3cgLSBzdGFydCA+IHRpbWVvdXQpCgkJ CXJldHVybiAwOwoJfQp9CgpzdGF0aWMgYm9vbCB3cml0ZV9maWxlKGNvbnN0IGNoYXIqIGZpbGUs IGNvbnN0IGNoYXIqIHdoYXQsIC4uLikKewoJY2hhciBidWZbMTAyNF07Cgl2YV9saXN0IGFyZ3M7 Cgl2YV9zdGFydChhcmdzLCB3aGF0KTsKCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCB3aGF0 LCBhcmdzKTsKCXZhX2VuZChhcmdzKTsKCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKCWludCBs ZW4gPSBzdHJsZW4oYnVmKTsKCWludCBmZCA9IG9wZW4oZmlsZSwgT19XUk9OTFkgfCBPX0NMT0VY RUMpOwoJaWYgKGZkID09IC0xKQoJCXJldHVybiBmYWxzZTsKCWlmICh3cml0ZShmZCwgYnVmLCBs ZW4pICE9IGxlbikgewoJCWludCBlcnIgPSBlcnJubzsKCQljbG9zZShmZCk7CgkJZXJybm8gPSBl cnI7CgkJcmV0dXJuIGZhbHNlOwoJfQoJY2xvc2UoZmQpOwoJcmV0dXJuIHRydWU7Cn0KCnN0cnVj dCBubG1zZyB7CgljaGFyKiBwb3M7CglpbnQgbmVzdGluZzsKCXN0cnVjdCBubGF0dHIqIG5lc3Rl ZFs4XTsKCWNoYXIgYnVmWzQwOTZdOwp9OwoKc3RhdGljIHZvaWQgbmV0bGlua19pbml0KHN0cnVj dCBubG1zZyogbmxtc2csIGludCB0eXAsIGludCBmbGFncywKCQkJIGNvbnN0IHZvaWQqIGRhdGEs IGludCBzaXplKQp7CgltZW1zZXQobmxtc2csIDAsIHNpemVvZigqbmxtc2cpKTsKCXN0cnVjdCBu bG1zZ2hkciogaGRyID0gKHN0cnVjdCBubG1zZ2hkciopbmxtc2ctPmJ1ZjsKCWhkci0+bmxtc2df dHlwZSA9IHR5cDsKCWhkci0+bmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUIHwgTkxNX0ZfQUNL IHwgZmxhZ3M7CgltZW1jcHkoaGRyICsgMSwgZGF0YSwgc2l6ZSk7CglubG1zZy0+cG9zID0gKGNo YXIqKShoZHIgKyAxKSArIE5MTVNHX0FMSUdOKHNpemUpOwp9CgpzdGF0aWMgdm9pZCBuZXRsaW5r X2F0dHIoc3RydWN0IG5sbXNnKiBubG1zZywgaW50IHR5cCwKCQkJIGNvbnN0IHZvaWQqIGRhdGEs IGludCBzaXplKQp7CglzdHJ1Y3QgbmxhdHRyKiBhdHRyID0gKHN0cnVjdCBubGF0dHIqKW5sbXNn LT5wb3M7CglhdHRyLT5ubGFfbGVuID0gc2l6ZW9mKCphdHRyKSArIHNpemU7CglhdHRyLT5ubGFf dHlwZSA9IHR5cDsKCWlmIChzaXplID4gMCkKCQltZW1jcHkoYXR0ciArIDEsIGRhdGEsIHNpemUp OwoJbmxtc2ctPnBvcyArPSBOTE1TR19BTElHTihhdHRyLT5ubGFfbGVuKTsKfQoKc3RhdGljIHZv aWQgbmV0bGlua19uZXN0KHN0cnVjdCBubG1zZyogbmxtc2csIGludCB0eXApCnsKCXN0cnVjdCBu bGF0dHIqIGF0dHIgPSAoc3RydWN0IG5sYXR0ciopbmxtc2ctPnBvczsKCWF0dHItPm5sYV90eXBl ID0gdHlwOwoJbmxtc2ctPnBvcyArPSBzaXplb2YoKmF0dHIpOwoJbmxtc2ctPm5lc3RlZFtubG1z Zy0+bmVzdGluZysrXSA9IGF0dHI7Cn0KCnN0YXRpYyB2b2lkIG5ldGxpbmtfZG9uZShzdHJ1Y3Qg bmxtc2cqIG5sbXNnKQp7CglzdHJ1Y3QgbmxhdHRyKiBhdHRyID0gbmxtc2ctPm5lc3RlZFstLW5s bXNnLT5uZXN0aW5nXTsKCWF0dHItPm5sYV9sZW4gPSBubG1zZy0+cG9zIC0gKGNoYXIqKWF0dHI7 Cn0KCnN0YXRpYyBpbnQgbmV0bGlua19zZW5kX2V4dChzdHJ1Y3Qgbmxtc2cqIG5sbXNnLCBpbnQg c29jaywKCQkJICAgIHVpbnQxNl90IHJlcGx5X3R5cGUsIGludCogcmVwbHlfbGVuLCBib29sIGRv ZmFpbCkKewoJaWYgKG5sbXNnLT5wb3MgPiBubG1zZy0+YnVmICsgc2l6ZW9mKG5sbXNnLT5idWYp IHx8IG5sbXNnLT5uZXN0aW5nKQoJZXhpdCgxKTsKCXN0cnVjdCBubG1zZ2hkciogaGRyID0gKHN0 cnVjdCBubG1zZ2hkciopbmxtc2ctPmJ1ZjsKCWhkci0+bmxtc2dfbGVuID0gbmxtc2ctPnBvcyAt IG5sbXNnLT5idWY7CglzdHJ1Y3Qgc29ja2FkZHJfbmwgYWRkcjsKCW1lbXNldCgmYWRkciwgMCwg c2l6ZW9mKGFkZHIpKTsKCWFkZHIubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKCXNzaXplX3QgbiA9 IHNlbmR0byhzb2NrLCBubG1zZy0+YnVmLCBoZHItPm5sbXNnX2xlbiwgMCwgKHN0cnVjdCBzb2Nr YWRkciopJmFkZHIsIHNpemVvZihhZGRyKSk7CglpZiAobiAhPSAoc3NpemVfdCloZHItPm5sbXNn X2xlbikgewoJCWlmIChkb2ZhaWwpCglleGl0KDEpOwoJCXJldHVybiAtMTsKCX0KCW4gPSByZWN2 KHNvY2ssIG5sbXNnLT5idWYsIHNpemVvZihubG1zZy0+YnVmKSwgMCk7CglpZiAocmVwbHlfbGVu KQoJCSpyZXBseV9sZW4gPSAwOwoJaWYgKG4gPCAwKSB7CgkJaWYgKGRvZmFpbCkKCWV4aXQoMSk7 CgkJcmV0dXJuIC0xOwoJfQoJaWYgKG4gPCAoc3NpemVfdClzaXplb2Yoc3RydWN0IG5sbXNnaGRy KSkgewoJCWVycm5vID0gRUlOVkFMOwoJCWlmIChkb2ZhaWwpCglleGl0KDEpOwoJCXJldHVybiAt MTsKCX0KCWlmIChoZHItPm5sbXNnX3R5cGUgPT0gTkxNU0dfRE9ORSkKCQlyZXR1cm4gMDsKCWlm IChyZXBseV9sZW4gJiYgaGRyLT5ubG1zZ190eXBlID09IHJlcGx5X3R5cGUpIHsKCQkqcmVwbHlf bGVuID0gbjsKCQlyZXR1cm4gMDsKCX0KCWlmIChuIDwgKHNzaXplX3QpKHNpemVvZihzdHJ1Y3Qg bmxtc2doZHIpICsgc2l6ZW9mKHN0cnVjdCBubG1zZ2VycikpKSB7CgkJZXJybm8gPSBFSU5WQUw7 CgkJaWYgKGRvZmFpbCkKCWV4aXQoMSk7CgkJcmV0dXJuIC0xOwoJfQoJaWYgKGhkci0+bmxtc2df dHlwZSAhPSBOTE1TR19FUlJPUikgewoJCWVycm5vID0gRUlOVkFMOwoJCWlmIChkb2ZhaWwpCgll eGl0KDEpOwoJCXJldHVybiAtMTsKCX0KCWVycm5vID0gLSgoc3RydWN0IG5sbXNnZXJyKikoaGRy ICsgMSkpLT5lcnJvcjsKCXJldHVybiAtZXJybm87Cn0KCnN0YXRpYyBpbnQgbmV0bGlua19zZW5k KHN0cnVjdCBubG1zZyogbmxtc2csIGludCBzb2NrKQp7CglyZXR1cm4gbmV0bGlua19zZW5kX2V4 dChubG1zZywgc29jaywgMCwgTlVMTCwgdHJ1ZSk7Cn0KCnN0YXRpYyBpbnQgbmV0bGlua19xdWVy eV9mYW1pbHlfaWQoc3RydWN0IG5sbXNnKiBubG1zZywgaW50IHNvY2ssIGNvbnN0IGNoYXIqIGZh bWlseV9uYW1lLCBib29sIGRvZmFpbCkKewoJc3RydWN0IGdlbmxtc2doZHIgZ2VubGhkcjsKCW1l bXNldCgmZ2VubGhkciwgMCwgc2l6ZW9mKGdlbmxoZHIpKTsKCWdlbmxoZHIuY21kID0gQ1RSTF9D TURfR0VURkFNSUxZOwoJbmV0bGlua19pbml0KG5sbXNnLCBHRU5MX0lEX0NUUkwsIDAsICZnZW5s aGRyLCBzaXplb2YoZ2VubGhkcikpOwoJbmV0bGlua19hdHRyKG5sbXNnLCBDVFJMX0FUVFJfRkFN SUxZX05BTUUsIGZhbWlseV9uYW1lLCBzdHJubGVuKGZhbWlseV9uYW1lLCBHRU5MX05BTVNJWiAt IDEpICsgMSk7CglpbnQgbiA9IDA7CglpbnQgZXJyID0gbmV0bGlua19zZW5kX2V4dChubG1zZywg c29jaywgR0VOTF9JRF9DVFJMLCAmbiwgZG9mYWlsKTsKCWlmIChlcnIgPCAwKSB7CgkJcmV0dXJu IC0xOwoJfQoJdWludDE2X3QgaWQgPSAwOwoJc3RydWN0IG5sYXR0ciogYXR0ciA9IChzdHJ1Y3Qg bmxhdHRyKikobmxtc2ctPmJ1ZiArIE5MTVNHX0hEUkxFTiArIE5MTVNHX0FMSUdOKHNpemVvZihn ZW5saGRyKSkpOwoJZm9yICg7IChjaGFyKilhdHRyIDwgbmxtc2ctPmJ1ZiArIG47IGF0dHIgPSAo c3RydWN0IG5sYXR0ciopKChjaGFyKilhdHRyICsgTkxNU0dfQUxJR04oYXR0ci0+bmxhX2xlbikp KSB7CgkJaWYgKGF0dHItPm5sYV90eXBlID09IENUUkxfQVRUUl9GQU1JTFlfSUQpIHsKCQkJaWQg PSAqKHVpbnQxNl90KikoYXR0ciArIDEpOwoJCQlicmVhazsKCQl9Cgl9CglpZiAoIWlkKSB7CgkJ ZXJybm8gPSBFSU5WQUw7CgkJcmV0dXJuIC0xOwoJfQoJcmVjdihzb2NrLCBubG1zZy0+YnVmLCBz aXplb2Yobmxtc2ctPmJ1ZiksIDApOwoJcmV0dXJuIGlkOwp9CgpzdGF0aWMgdm9pZCBuZXRsaW5r X2FkZF9kZXZpY2VfaW1wbChzdHJ1Y3Qgbmxtc2cqIG5sbXNnLCBjb25zdCBjaGFyKiB0eXBlLAoJ CQkJICAgIGNvbnN0IGNoYXIqIG5hbWUsIGJvb2wgdXApCnsKCXN0cnVjdCBpZmluZm9tc2cgaGRy OwoJbWVtc2V0KCZoZHIsIDAsIHNpemVvZihoZHIpKTsKCWlmICh1cCkKCQloZHIuaWZpX2ZsYWdz ID0gaGRyLmlmaV9jaGFuZ2UgPSBJRkZfVVA7CgluZXRsaW5rX2luaXQobmxtc2csIFJUTV9ORVdM SU5LLCBOTE1fRl9FWENMIHwgTkxNX0ZfQ1JFQVRFLCAmaGRyLCBzaXplb2YoaGRyKSk7CglpZiAo bmFtZSkKCQluZXRsaW5rX2F0dHIobmxtc2csIElGTEFfSUZOQU1FLCBuYW1lLCBzdHJsZW4obmFt ZSkpOwoJbmV0bGlua19uZXN0KG5sbXNnLCBJRkxBX0xJTktJTkZPKTsKCW5ldGxpbmtfYXR0cihu bG1zZywgSUZMQV9JTkZPX0tJTkQsIHR5cGUsIHN0cmxlbih0eXBlKSk7Cn0KCnN0YXRpYyB2b2lk IG5ldGxpbmtfZGV2aWNlX2NoYW5nZShzdHJ1Y3Qgbmxtc2cqIG5sbXNnLCBpbnQgc29jaywgY29u c3QgY2hhciogbmFtZSwgYm9vbCB1cCwKCQkJCSAgY29uc3QgY2hhciogbWFzdGVyLCBjb25zdCB2 b2lkKiBtYWMsIGludCBtYWNzaXplLAoJCQkJICBjb25zdCBjaGFyKiBuZXdfbmFtZSkKewoJc3Ry dWN0IGlmaW5mb21zZyBoZHI7CgltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOwoJaWYgKHVw KQoJCWhkci5pZmlfZmxhZ3MgPSBoZHIuaWZpX2NoYW5nZSA9IElGRl9VUDsKCWhkci5pZmlfaW5k ZXggPSBpZl9uYW1ldG9pbmRleChuYW1lKTsKCW5ldGxpbmtfaW5pdChubG1zZywgUlRNX05FV0xJ TkssIDAsICZoZHIsIHNpemVvZihoZHIpKTsKCWlmIChuZXdfbmFtZSkKCQluZXRsaW5rX2F0dHIo bmxtc2csIElGTEFfSUZOQU1FLCBuZXdfbmFtZSwgc3RybGVuKG5ld19uYW1lKSk7CglpZiAobWFz dGVyKSB7CgkJaW50IGlmaW5kZXggPSBpZl9uYW1ldG9pbmRleChtYXN0ZXIpOwoJCW5ldGxpbmtf YXR0cihubG1zZywgSUZMQV9NQVNURVIsICZpZmluZGV4LCBzaXplb2YoaWZpbmRleCkpOwoJfQoJ aWYgKG1hY3NpemUpCgkJbmV0bGlua19hdHRyKG5sbXNnLCBJRkxBX0FERFJFU1MsIG1hYywgbWFj c2l6ZSk7CglpbnQgZXJyID0gbmV0bGlua19zZW5kKG5sbXNnLCBzb2NrKTsKCWlmIChlcnIgPCAw KSB7Cgl9Cn0KCnN0YXRpYyBpbnQgbmV0bGlua19hZGRfYWRkcihzdHJ1Y3Qgbmxtc2cqIG5sbXNn LCBpbnQgc29jaywgY29uc3QgY2hhciogZGV2LAoJCQkgICAgY29uc3Qgdm9pZCogYWRkciwgaW50 IGFkZHJzaXplKQp7CglzdHJ1Y3QgaWZhZGRybXNnIGhkcjsKCW1lbXNldCgmaGRyLCAwLCBzaXpl b2YoaGRyKSk7CgloZHIuaWZhX2ZhbWlseSA9IGFkZHJzaXplID09IDQgPyBBRl9JTkVUIDogQUZf SU5FVDY7CgloZHIuaWZhX3ByZWZpeGxlbiA9IGFkZHJzaXplID09IDQgPyAyNCA6IDEyMDsKCWhk ci5pZmFfc2NvcGUgPSBSVF9TQ09QRV9VTklWRVJTRTsKCWhkci5pZmFfaW5kZXggPSBpZl9uYW1l dG9pbmRleChkZXYpOwoJbmV0bGlua19pbml0KG5sbXNnLCBSVE1fTkVXQUREUiwgTkxNX0ZfQ1JF QVRFIHwgTkxNX0ZfUkVQTEFDRSwgJmhkciwgc2l6ZW9mKGhkcikpOwoJbmV0bGlua19hdHRyKG5s bXNnLCBJRkFfTE9DQUwsIGFkZHIsIGFkZHJzaXplKTsKCW5ldGxpbmtfYXR0cihubG1zZywgSUZB X0FERFJFU1MsIGFkZHIsIGFkZHJzaXplKTsKCXJldHVybiBuZXRsaW5rX3NlbmQobmxtc2csIHNv Y2spOwp9CgpzdGF0aWMgdm9pZCBuZXRsaW5rX2FkZF9hZGRyNChzdHJ1Y3Qgbmxtc2cqIG5sbXNn LCBpbnQgc29jaywKCQkJICAgICAgY29uc3QgY2hhciogZGV2LCBjb25zdCBjaGFyKiBhZGRyKQp7 CglzdHJ1Y3QgaW5fYWRkciBpbl9hZGRyOwoJaW5ldF9wdG9uKEFGX0lORVQsIGFkZHIsICZpbl9h ZGRyKTsKCWludCBlcnIgPSBuZXRsaW5rX2FkZF9hZGRyKG5sbXNnLCBzb2NrLCBkZXYsICZpbl9h ZGRyLCBzaXplb2YoaW5fYWRkcikpOwoJaWYgKGVyciA8IDApIHsKCX0KfQoKc3RhdGljIHZvaWQg bmV0bGlua19hZGRfYWRkcjYoc3RydWN0IG5sbXNnKiBubG1zZywgaW50IHNvY2ssCgkJCSAgICAg IGNvbnN0IGNoYXIqIGRldiwgY29uc3QgY2hhciogYWRkcikKewoJc3RydWN0IGluNl9hZGRyIGlu Nl9hZGRyOwoJaW5ldF9wdG9uKEFGX0lORVQ2LCBhZGRyLCAmaW42X2FkZHIpOwoJaW50IGVyciA9 IG5ldGxpbmtfYWRkX2FkZHIobmxtc2csIHNvY2ssIGRldiwgJmluNl9hZGRyLCBzaXplb2YoaW42 X2FkZHIpKTsKCWlmIChlcnIgPCAwKSB7Cgl9Cn0KCnN0YXRpYyB2b2lkIG5ldGxpbmtfYWRkX25l aWdoKHN0cnVjdCBubG1zZyogbmxtc2csIGludCBzb2NrLCBjb25zdCBjaGFyKiBuYW1lLAoJCQkg ICAgICBjb25zdCB2b2lkKiBhZGRyLCBpbnQgYWRkcnNpemUsIGNvbnN0IHZvaWQqIG1hYywgaW50 IG1hY3NpemUpCnsKCXN0cnVjdCBuZG1zZyBoZHI7CgltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhk cikpOwoJaGRyLm5kbV9mYW1pbHkgPSBhZGRyc2l6ZSA9PSA0ID8gQUZfSU5FVCA6IEFGX0lORVQ2 OwoJaGRyLm5kbV9pZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgobmFtZSk7CgloZHIubmRtX3N0YXRl ID0gTlVEX1BFUk1BTkVOVDsKCW5ldGxpbmtfaW5pdChubG1zZywgUlRNX05FV05FSUdILCBOTE1f Rl9FWENMIHwgTkxNX0ZfQ1JFQVRFLCAmaGRyLCBzaXplb2YoaGRyKSk7CgluZXRsaW5rX2F0dHIo bmxtc2csIE5EQV9EU1QsIGFkZHIsIGFkZHJzaXplKTsKCW5ldGxpbmtfYXR0cihubG1zZywgTkRB X0xMQUREUiwgbWFjLCBtYWNzaXplKTsKCWludCBlcnIgPSBuZXRsaW5rX3NlbmQobmxtc2csIHNv Y2spOwoJaWYgKGVyciA8IDApIHsKCX0KfQoKc3RhdGljIHN0cnVjdCBubG1zZyBubG1zZzsKCnN0 YXRpYyBpbnQgdHVuZmQgPSAtMTsKCiNkZWZpbmUgVFVOX0lGQUNFICJzeXpfdHVuIgojZGVmaW5l IExPQ0FMX01BQyAweGFhYWFhYWFhYWFhYQojZGVmaW5lIFJFTU9URV9NQUMgMHhhYWFhYWFhYWFh YmIKI2RlZmluZSBMT0NBTF9JUFY0ICIxNzIuMjAuMjAuMTcwIgojZGVmaW5lIFJFTU9URV9JUFY0 ICIxNzIuMjAuMjAuMTg3IgojZGVmaW5lIExPQ0FMX0lQVjYgImZlODA6OmFhIgojZGVmaW5lIFJF TU9URV9JUFY2ICJmZTgwOjpiYiIKCiNkZWZpbmUgSUZGX05BUEkgMHgwMDEwCgpzdGF0aWMgdm9p ZCBpbml0aWFsaXplX3R1bih2b2lkKQp7Cgl0dW5mZCA9IG9wZW4oIi9kZXYvbmV0L3R1biIsIE9f UkRXUiB8IE9fTk9OQkxPQ0spOwoJaWYgKHR1bmZkID09IC0xKSB7CgkJcHJpbnRmKCJ0dW46IGNh bid0IG9wZW4gL2Rldi9uZXQvdHVuOiBwbGVhc2UgZW5hYmxlIENPTkZJR19UVU49eVxuIik7CgkJ cHJpbnRmKCJvdGhlcndpc2UgZnV6emluZyBvciByZXByb2R1Y2luZyBtaWdodCBub3Qgd29yayBh cyBpbnRlbmRlZFxuIik7CgkJcmV0dXJuOwoJfQoJY29uc3QgaW50IGtUdW5GZCA9IDIwMDsKCWlm IChkdXAyKHR1bmZkLCBrVHVuRmQpIDwgMCkKCWV4aXQoMSk7CgljbG9zZSh0dW5mZCk7Cgl0dW5m ZCA9IGtUdW5GZDsKCXN0cnVjdCBpZnJlcSBpZnI7CgltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlm cikpOwoJc3RybmNweShpZnIuaWZyX25hbWUsIFRVTl9JRkFDRSwgSUZOQU1TSVopOwoJaWZyLmlm cl9mbGFncyA9IElGRl9UQVAgfCBJRkZfTk9fUEk7CglpZiAoaW9jdGwodHVuZmQsIFRVTlNFVElG RiwgKHZvaWQqKSZpZnIpIDwgMCkgewoJZXhpdCgxKTsKCX0KCWNoYXIgc3lzY3RsWzY0XTsKCXNw cmludGYoc3lzY3RsLCAiL3Byb2Mvc3lzL25ldC9pcHY2L2NvbmYvJXMvYWNjZXB0X2RhZCIsIFRV Tl9JRkFDRSk7Cgl3cml0ZV9maWxlKHN5c2N0bCwgIjAiKTsKCXNwcmludGYoc3lzY3RsLCAiL3By b2Mvc3lzL25ldC9pcHY2L2NvbmYvJXMvcm91dGVyX3NvbGljaXRhdGlvbnMiLCBUVU5fSUZBQ0Up OwoJd3JpdGVfZmlsZShzeXNjdGwsICIwIik7CglpbnQgc29jayA9IHNvY2tldChBRl9ORVRMSU5L LCBTT0NLX1JBVywgTkVUTElOS19ST1VURSk7CglpZiAoc29jayA9PSAtMSkKCWV4aXQoMSk7Cglu ZXRsaW5rX2FkZF9hZGRyNCgmbmxtc2csIHNvY2ssIFRVTl9JRkFDRSwgTE9DQUxfSVBWNCk7Cglu ZXRsaW5rX2FkZF9hZGRyNigmbmxtc2csIHNvY2ssIFRVTl9JRkFDRSwgTE9DQUxfSVBWNik7Cgl1 aW50NjRfdCBtYWNhZGRyID0gUkVNT1RFX01BQzsKCXN0cnVjdCBpbl9hZGRyIGluX2FkZHI7Cglp bmV0X3B0b24oQUZfSU5FVCwgUkVNT1RFX0lQVjQsICZpbl9hZGRyKTsKCW5ldGxpbmtfYWRkX25l aWdoKCZubG1zZywgc29jaywgVFVOX0lGQUNFLCAmaW5fYWRkciwgc2l6ZW9mKGluX2FkZHIpLCAm bWFjYWRkciwgRVRIX0FMRU4pOwoJc3RydWN0IGluNl9hZGRyIGluNl9hZGRyOwoJaW5ldF9wdG9u KEFGX0lORVQ2LCBSRU1PVEVfSVBWNiwgJmluNl9hZGRyKTsKCW5ldGxpbmtfYWRkX25laWdoKCZu bG1zZywgc29jaywgVFVOX0lGQUNFLCAmaW42X2FkZHIsIHNpemVvZihpbjZfYWRkciksICZtYWNh ZGRyLCBFVEhfQUxFTik7CgltYWNhZGRyID0gTE9DQUxfTUFDOwoJbmV0bGlua19kZXZpY2VfY2hh bmdlKCZubG1zZywgc29jaywgVFVOX0lGQUNFLCB0cnVlLCAwLCAmbWFjYWRkciwgRVRIX0FMRU4s IE5VTEwpOwoJY2xvc2Uoc29jayk7Cn0KCiNkZWZpbmUgV0lGSV9JTklUSUFMX0RFVklDRV9DT1VO VCAyCiNkZWZpbmUgV0lGSV9NQUNfQkFTRSB7IDB4MDgsIDB4MDIsIDB4MTEsIDB4MDAsIDB4MDAs IDB4MDAgfQojZGVmaW5lIFdJRklfSUJTU19CU1NJRCB7IDB4NTAsIDB4NTAsIDB4NTAsIDB4NTAs IDB4NTAsIDB4NTAgfQojZGVmaW5lIFdJRklfSUJTU19TU0lEIHsgMHgxMCwgMHgxMCwgMHgxMCwg MHgxMCwgMHgxMCwgMHgxMCB9CiNkZWZpbmUgV0lGSV9ERUZBVUxUX0ZSRVFVRU5DWSAyNDEyCiNk ZWZpbmUgV0lGSV9ERUZBVUxUX1NJR05BTCAwCiNkZWZpbmUgV0lGSV9ERUZBVUxUX1JYX1JBVEUg MQojZGVmaW5lIEhXU0lNX0NNRF9SRUdJU1RFUiAxCiNkZWZpbmUgSFdTSU1fQ01EX0ZSQU1FIDIK I2RlZmluZSBIV1NJTV9DTURfTkVXX1JBRElPIDQKI2RlZmluZSBIV1NJTV9BVFRSX1NVUFBPUlRf UDJQX0RFVklDRSAxNAojZGVmaW5lIEhXU0lNX0FUVFJfUEVSTV9BRERSIDIyCgojZGVmaW5lIElG X09QRVJfVVAgNgpzdHJ1Y3Qgam9pbl9pYnNzX3Byb3BzIHsKCWludCB3aXBoeV9mcmVxOwoJYm9v bCB3aXBoeV9mcmVxX2ZpeGVkOwoJdWludDhfdCogbWFjOwoJdWludDhfdCogc3NpZDsKCWludCBz c2lkX2xlbjsKfTsKCnN0YXRpYyBpbnQgc2V0X2ludGVyZmFjZV9zdGF0ZShjb25zdCBjaGFyKiBp bnRlcmZhY2VfbmFtZSwgaW50IG9uKQp7CglzdHJ1Y3QgaWZyZXEgaWZyOwoJaW50IHNvY2sgPSBz b2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CglpZiAoc29jayA8IDApIHsKCQlyZXR1cm4g LTE7Cgl9CgltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOwoJc3RyY3B5KGlmci5pZnJfbmFt ZSwgaW50ZXJmYWNlX25hbWUpOwoJaW50IHJldCA9IGlvY3RsKHNvY2ssIFNJT0NHSUZGTEFHUywg Jmlmcik7CglpZiAocmV0IDwgMCkgewoJCWNsb3NlKHNvY2spOwoJCXJldHVybiAtMTsKCX0KCWlm IChvbikKCQlpZnIuaWZyX2ZsYWdzIHw9IElGRl9VUDsKCWVsc2UKCQlpZnIuaWZyX2ZsYWdzICY9 IH5JRkZfVVA7CglyZXQgPSBpb2N0bChzb2NrLCBTSU9DU0lGRkxBR1MsICZpZnIpOwoJY2xvc2Uo c29jayk7CglpZiAocmV0IDwgMCkgewoJCXJldHVybiAtMTsKCX0KCXJldHVybiAwOwp9CgpzdGF0 aWMgaW50IG5sODAyMTFfc2V0X2ludGVyZmFjZShzdHJ1Y3Qgbmxtc2cqIG5sbXNnLCBpbnQgc29j aywgaW50IG5sODAyMTFfZmFtaWx5LCB1aW50MzJfdCBpZmluZGV4LCB1aW50MzJfdCBpZnR5cGUp CnsKCXN0cnVjdCBnZW5sbXNnaGRyIGdlbmxoZHI7CgltZW1zZXQoJmdlbmxoZHIsIDAsIHNpemVv ZihnZW5saGRyKSk7CglnZW5saGRyLmNtZCA9IE5MODAyMTFfQ01EX1NFVF9JTlRFUkZBQ0U7Cglu ZXRsaW5rX2luaXQobmxtc2csIG5sODAyMTFfZmFtaWx5LCAwLCAmZ2VubGhkciwgc2l6ZW9mKGdl bmxoZHIpKTsKCW5ldGxpbmtfYXR0cihubG1zZywgTkw4MDIxMV9BVFRSX0lGSU5ERVgsICZpZmlu ZGV4LCBzaXplb2YoaWZpbmRleCkpOwoJbmV0bGlua19hdHRyKG5sbXNnLCBOTDgwMjExX0FUVFJf SUZUWVBFLCAmaWZ0eXBlLCBzaXplb2YoaWZ0eXBlKSk7CglpbnQgZXJyID0gbmV0bGlua19zZW5k KG5sbXNnLCBzb2NrKTsKCWlmIChlcnIgPCAwKSB7Cgl9CglyZXR1cm4gZXJyOwp9CgpzdGF0aWMg aW50IG5sODAyMTFfam9pbl9pYnNzKHN0cnVjdCBubG1zZyogbmxtc2csIGludCBzb2NrLCBpbnQg bmw4MDIxMV9mYW1pbHksIHVpbnQzMl90IGlmaW5kZXgsIHN0cnVjdCBqb2luX2lic3NfcHJvcHMq IHByb3BzKQp7CglzdHJ1Y3QgZ2VubG1zZ2hkciBnZW5saGRyOwoJbWVtc2V0KCZnZW5saGRyLCAw LCBzaXplb2YoZ2VubGhkcikpOwoJZ2VubGhkci5jbWQgPSBOTDgwMjExX0NNRF9KT0lOX0lCU1M7 CgluZXRsaW5rX2luaXQobmxtc2csIG5sODAyMTFfZmFtaWx5LCAwLCAmZ2VubGhkciwgc2l6ZW9m KGdlbmxoZHIpKTsKCW5ldGxpbmtfYXR0cihubG1zZywgTkw4MDIxMV9BVFRSX0lGSU5ERVgsICZp ZmluZGV4LCBzaXplb2YoaWZpbmRleCkpOwoJbmV0bGlua19hdHRyKG5sbXNnLCBOTDgwMjExX0FU VFJfU1NJRCwgcHJvcHMtPnNzaWQsIHByb3BzLT5zc2lkX2xlbik7CgluZXRsaW5rX2F0dHIobmxt c2csIE5MODAyMTFfQVRUUl9XSVBIWV9GUkVRLCAmKHByb3BzLT53aXBoeV9mcmVxKSwgc2l6ZW9m KHByb3BzLT53aXBoeV9mcmVxKSk7CglpZiAocHJvcHMtPm1hYykKCQluZXRsaW5rX2F0dHIobmxt c2csIE5MODAyMTFfQVRUUl9NQUMsIHByb3BzLT5tYWMsIEVUSF9BTEVOKTsKCWlmIChwcm9wcy0+ d2lwaHlfZnJlcV9maXhlZCkKCQluZXRsaW5rX2F0dHIobmxtc2csIE5MODAyMTFfQVRUUl9GUkVR X0ZJWEVELCBOVUxMLCAwKTsKCWludCBlcnIgPSBuZXRsaW5rX3NlbmQobmxtc2csIHNvY2spOwoJ aWYgKGVyciA8IDApIHsKCX0KCXJldHVybiBlcnI7Cn0KCnN0YXRpYyBpbnQgZ2V0X2lmbGFfb3Bl cnN0YXRlKHN0cnVjdCBubG1zZyogbmxtc2csIGludCBpZmluZGV4KQp7CglzdHJ1Y3QgaWZpbmZv bXNnIGluZm87CgltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CglpbmZvLmlmaV9mYW1p bHkgPSBBRl9VTlNQRUM7CglpbmZvLmlmaV9pbmRleCA9IGlmaW5kZXg7CglpbnQgc29jayA9IHNv Y2tldChBRl9ORVRMSU5LLCBTT0NLX1JBVywgTkVUTElOS19ST1VURSk7CglpZiAoc29jayA9PSAt MSkgewoJCXJldHVybiAtMTsKCX0KCW5ldGxpbmtfaW5pdChubG1zZywgUlRNX0dFVExJTkssIDAs ICZpbmZvLCBzaXplb2YoaW5mbykpOwoJaW50IG47CglpbnQgZXJyID0gbmV0bGlua19zZW5kX2V4 dChubG1zZywgc29jaywgUlRNX05FV0xJTkssICZuLCB0cnVlKTsKCWNsb3NlKHNvY2spOwoJaWYg KGVycikgewoJCXJldHVybiAtMTsKCX0KCXN0cnVjdCBydGF0dHIqIGF0dHIgPSBJRkxBX1JUQShO TE1TR19EQVRBKG5sbXNnLT5idWYpKTsKCWZvciAoOyBSVEFfT0soYXR0ciwgbik7IGF0dHIgPSBS VEFfTkVYVChhdHRyLCBuKSkgewoJCWlmIChhdHRyLT5ydGFfdHlwZSA9PSBJRkxBX09QRVJTVEFU RSkKCQkJcmV0dXJuICooKGludDMyX3QqKVJUQV9EQVRBKGF0dHIpKTsKCX0KCXJldHVybiAtMTsK fQoKc3RhdGljIGludCBhd2FpdF9pZmxhX29wZXJzdGF0ZShzdHJ1Y3Qgbmxtc2cqIG5sbXNnLCBj aGFyKiBpbnRlcmZhY2UsIGludCBvcGVyc3RhdGUpCnsKCWludCBpZmluZGV4ID0gaWZfbmFtZXRv aW5kZXgoaW50ZXJmYWNlKTsKCXdoaWxlICh0cnVlKSB7CgkJdXNsZWVwKDEwMDApOwoJCWludCBy ZXQgPSBnZXRfaWZsYV9vcGVyc3RhdGUobmxtc2csIGlmaW5kZXgpOwoJCWlmIChyZXQgPCAwKQoJ CQlyZXR1cm4gcmV0OwoJCWlmIChyZXQgPT0gb3BlcnN0YXRlKQoJCQlyZXR1cm4gMDsKCX0KCXJl dHVybiAwOwp9CgpzdGF0aWMgaW50IG5sODAyMTFfc2V0dXBfaWJzc19pbnRlcmZhY2Uoc3RydWN0 IG5sbXNnKiBubG1zZywgaW50IHNvY2ssIGludCBubDgwMjExX2ZhbWlseV9pZCwgY2hhciogaW50 ZXJmYWNlLCBzdHJ1Y3Qgam9pbl9pYnNzX3Byb3BzKiBpYnNzX3Byb3BzKQp7CglpbnQgaWZpbmRl eCA9IGlmX25hbWV0b2luZGV4KGludGVyZmFjZSk7CglpZiAoaWZpbmRleCA9PSAwKSB7CgkJcmV0 dXJuIC0xOwoJfQoJaW50IHJldCA9IG5sODAyMTFfc2V0X2ludGVyZmFjZShubG1zZywgc29jaywg bmw4MDIxMV9mYW1pbHlfaWQsIGlmaW5kZXgsIE5MODAyMTFfSUZUWVBFX0FESE9DKTsKCWlmIChy ZXQgPCAwKSB7CgkJcmV0dXJuIC0xOwoJfQoJcmV0ID0gc2V0X2ludGVyZmFjZV9zdGF0ZShpbnRl cmZhY2UsIDEpOwoJaWYgKHJldCA8IDApIHsKCQlyZXR1cm4gLTE7Cgl9CglyZXQgPSBubDgwMjEx X2pvaW5faWJzcyhubG1zZywgc29jaywgbmw4MDIxMV9mYW1pbHlfaWQsIGlmaW5kZXgsIGlic3Nf cHJvcHMpOwoJaWYgKHJldCA8IDApIHsKCQlyZXR1cm4gLTE7Cgl9CglyZXR1cm4gMDsKfQoKc3Rh dGljIGludCBod3NpbTgwMjExX2NyZWF0ZV9kZXZpY2Uoc3RydWN0IG5sbXNnKiBubG1zZywgaW50 IHNvY2ssIGludCBod3NpbV9mYW1pbHksIHVpbnQ4X3QgbWFjX2FkZHJbRVRIX0FMRU5dKQp7Cglz dHJ1Y3QgZ2VubG1zZ2hkciBnZW5saGRyOwoJbWVtc2V0KCZnZW5saGRyLCAwLCBzaXplb2YoZ2Vu bGhkcikpOwoJZ2VubGhkci5jbWQgPSBIV1NJTV9DTURfTkVXX1JBRElPOwoJbmV0bGlua19pbml0 KG5sbXNnLCBod3NpbV9mYW1pbHksIDAsICZnZW5saGRyLCBzaXplb2YoZ2VubGhkcikpOwoJbmV0 bGlua19hdHRyKG5sbXNnLCBIV1NJTV9BVFRSX1NVUFBPUlRfUDJQX0RFVklDRSwgTlVMTCwgMCk7 CgluZXRsaW5rX2F0dHIobmxtc2csIEhXU0lNX0FUVFJfUEVSTV9BRERSLCBtYWNfYWRkciwgRVRI X0FMRU4pOwoJaW50IGVyciA9IG5ldGxpbmtfc2VuZChubG1zZywgc29jayk7CglpZiAoZXJyIDwg MCkgewoJfQoJcmV0dXJuIGVycjsKfQoKc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV93aWZpX2Rldmlj ZXModm9pZCkKewoJaW50IHJma2lsbCA9IG9wZW4oIi9kZXYvcmZraWxsIiwgT19SRFdSKTsKCWlm IChyZmtpbGwgPT0gLTEpIHsKCQlpZiAoZXJybm8gIT0gRU5PRU5UICYmIGVycm5vICE9IEVBQ0NF UykKCWV4aXQoMSk7Cgl9IGVsc2UgewoJCXN0cnVjdCByZmtpbGxfZXZlbnQgZXZlbnQgPSB7MH07 CgkJZXZlbnQudHlwZSA9IFJGS0lMTF9UWVBFX0FMTDsKCQlldmVudC5vcCA9IFJGS0lMTF9PUF9D SEFOR0VfQUxMOwoJCWlmICh3cml0ZShyZmtpbGwsICZldmVudCwgc2l6ZW9mKGV2ZW50KSkgIT0g KHNzaXplX3QpKHNpemVvZihldmVudCkpKQoJZXhpdCgxKTsKCQljbG9zZShyZmtpbGwpOwoJfQoJ dWludDhfdCBtYWNfYWRkcls2XSA9IFdJRklfTUFDX0JBU0U7CglpbnQgc29jayA9IHNvY2tldChB Rl9ORVRMSU5LLCBTT0NLX1JBVywgTkVUTElOS19HRU5FUklDKTsKCWlmIChzb2NrIDwgMCkgewoJ CXJldHVybjsKCX0KCWludCBod3NpbV9mYW1pbHlfaWQgPSBuZXRsaW5rX3F1ZXJ5X2ZhbWlseV9p ZCgmbmxtc2csIHNvY2ssICJNQUM4MDIxMV9IV1NJTSIsIHRydWUpOwoJaW50IG5sODAyMTFfZmFt aWx5X2lkID0gbmV0bGlua19xdWVyeV9mYW1pbHlfaWQoJm5sbXNnLCBzb2NrLCAibmw4MDIxMSIs IHRydWUpOwoJdWludDhfdCBzc2lkW10gPSBXSUZJX0lCU1NfU1NJRDsKCXVpbnQ4X3QgYnNzaWRb XSA9IFdJRklfSUJTU19CU1NJRDsKCXN0cnVjdCBqb2luX2lic3NfcHJvcHMgaWJzc19wcm9wcyA9 IHsKCSAgICAud2lwaHlfZnJlcSA9IFdJRklfREVGQVVMVF9GUkVRVUVOQ1ksIC53aXBoeV9mcmVx X2ZpeGVkID0gdHJ1ZSwgLm1hYyA9IGJzc2lkLCAuc3NpZCA9IHNzaWQsIC5zc2lkX2xlbiA9IHNp emVvZihzc2lkKX07Cglmb3IgKGludCBkZXZpY2VfaWQgPSAwOyBkZXZpY2VfaWQgPCBXSUZJX0lO SVRJQUxfREVWSUNFX0NPVU5UOyBkZXZpY2VfaWQrKykgewoJCW1hY19hZGRyWzVdID0gZGV2aWNl X2lkOwoJCWludCByZXQgPSBod3NpbTgwMjExX2NyZWF0ZV9kZXZpY2UoJm5sbXNnLCBzb2NrLCBo d3NpbV9mYW1pbHlfaWQsIG1hY19hZGRyKTsKCQlpZiAocmV0IDwgMCkKCWV4aXQoMSk7CgkJY2hh ciBpbnRlcmZhY2VbNl0gPSAid2xhbjAiOwoJCWludGVyZmFjZVs0XSArPSBkZXZpY2VfaWQ7CgkJ aWYgKG5sODAyMTFfc2V0dXBfaWJzc19pbnRlcmZhY2UoJm5sbXNnLCBzb2NrLCBubDgwMjExX2Zh bWlseV9pZCwgaW50ZXJmYWNlLCAmaWJzc19wcm9wcykgPCAwKQoJZXhpdCgxKTsKCX0KCWZvciAo aW50IGRldmljZV9pZCA9IDA7IGRldmljZV9pZCA8IFdJRklfSU5JVElBTF9ERVZJQ0VfQ09VTlQ7 IGRldmljZV9pZCsrKSB7CgkJY2hhciBpbnRlcmZhY2VbNl0gPSAid2xhbjAiOwoJCWludGVyZmFj ZVs0XSArPSBkZXZpY2VfaWQ7CgkJaW50IHJldCA9IGF3YWl0X2lmbGFfb3BlcnN0YXRlKCZubG1z ZywgaW50ZXJmYWNlLCBJRl9PUEVSX1VQKTsKCQlpZiAocmV0IDwgMCkKCWV4aXQoMSk7Cgl9Cglj bG9zZShzb2NrKTsKfQoKc3RhdGljIGludCByZWFkX3R1bihjaGFyKiBkYXRhLCBpbnQgc2l6ZSkK ewoJaWYgKHR1bmZkIDwgMCkKCQlyZXR1cm4gLTE7CglpbnQgcnYgPSByZWFkKHR1bmZkLCBkYXRh LCBzaXplKTsKCWlmIChydiA8IDApIHsKCQlpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09 IEVCQURGRCkKCQkJcmV0dXJuIC0xOwoJZXhpdCgxKTsKCX0KCXJldHVybiBydjsKfQoKc3RhdGlj IHZvaWQgZmx1c2hfdHVuKCkKewoJY2hhciBkYXRhWzEwMDBdOwoJd2hpbGUgKHJlYWRfdHVuKCZk YXRhWzBdLCBzaXplb2YoZGF0YSkpICE9IC0xKSB7Cgl9Cn0KCiNkZWZpbmUgTUFYX0ZEUyAzMAoK I2RlZmluZSBCVFBST1RPX0hDSSAxCiNkZWZpbmUgQUNMX0xJTksgMQojZGVmaW5lIFNDQU5fUEFH RSAyCgp0eXBlZGVmIHN0cnVjdCB7Cgl1aW50OF90IGJbNl07Cn0gX19hdHRyaWJ1dGVfXygocGFj a2VkKSkgYmRhZGRyX3Q7CgojZGVmaW5lIEhDSV9DT01NQU5EX1BLVCAxCiNkZWZpbmUgSENJX0VW RU5UX1BLVCA0CiNkZWZpbmUgSENJX1ZFTkRPUl9QS1QgMHhmZgoKc3RydWN0IGhjaV9jb21tYW5k X2hkciB7Cgl1aW50MTZfdCBvcGNvZGU7Cgl1aW50OF90IHBsZW47Cn0gX19hdHRyaWJ1dGVfXygo cGFja2VkKSk7CgpzdHJ1Y3QgaGNpX2V2ZW50X2hkciB7Cgl1aW50OF90IGV2dDsKCXVpbnQ4X3Qg cGxlbjsKfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKCiNkZWZpbmUgSENJX0VWX0NPTk5fQ09N UExFVEUgMHgwMwpzdHJ1Y3QgaGNpX2V2X2Nvbm5fY29tcGxldGUgewoJdWludDhfdCBzdGF0dXM7 Cgl1aW50MTZfdCBoYW5kbGU7CgliZGFkZHJfdCBiZGFkZHI7Cgl1aW50OF90IGxpbmtfdHlwZTsK CXVpbnQ4X3QgZW5jcl9tb2RlOwp9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwoKI2RlZmluZSBI Q0lfRVZfQ09OTl9SRVFVRVNUIDB4MDQKc3RydWN0IGhjaV9ldl9jb25uX3JlcXVlc3QgewoJYmRh ZGRyX3QgYmRhZGRyOwoJdWludDhfdCBkZXZfY2xhc3NbM107Cgl1aW50OF90IGxpbmtfdHlwZTsK fSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKCiNkZWZpbmUgSENJX0VWX1JFTU9URV9GRUFUVVJF UyAweDBiCnN0cnVjdCBoY2lfZXZfcmVtb3RlX2ZlYXR1cmVzIHsKCXVpbnQ4X3Qgc3RhdHVzOwoJ dWludDE2X3QgaGFuZGxlOwoJdWludDhfdCBmZWF0dXJlc1s4XTsKfSBfX2F0dHJpYnV0ZV9fKChw YWNrZWQpKTsKCiNkZWZpbmUgSENJX0VWX0NNRF9DT01QTEVURSAweDBlCnN0cnVjdCBoY2lfZXZf Y21kX2NvbXBsZXRlIHsKCXVpbnQ4X3QgbmNtZDsKCXVpbnQxNl90IG9wY29kZTsKfSBfX2F0dHJp YnV0ZV9fKChwYWNrZWQpKTsKCiNkZWZpbmUgSENJX09QX1dSSVRFX1NDQU5fRU5BQkxFIDB4MGMx YQoKI2RlZmluZSBIQ0lfT1BfUkVBRF9CVUZGRVJfU0laRSAweDEwMDUKc3RydWN0IGhjaV9ycF9y ZWFkX2J1ZmZlcl9zaXplIHsKCXVpbnQ4X3Qgc3RhdHVzOwoJdWludDE2X3QgYWNsX210dTsKCXVp bnQ4X3Qgc2NvX210dTsKCXVpbnQxNl90IGFjbF9tYXhfcGt0OwoJdWludDE2X3Qgc2NvX21heF9w a3Q7Cn0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CgojZGVmaW5lIEhDSV9PUF9SRUFEX0JEX0FE RFIgMHgxMDA5CnN0cnVjdCBoY2lfcnBfcmVhZF9iZF9hZGRyIHsKCXVpbnQ4X3Qgc3RhdHVzOwoJ YmRhZGRyX3QgYmRhZGRyOwp9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwoKI2RlZmluZSBIQ0lf RVZfTEVfTUVUQSAweDNlCnN0cnVjdCBoY2lfZXZfbGVfbWV0YSB7Cgl1aW50OF90IHN1YmV2ZW50 Owp9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwoKI2RlZmluZSBIQ0lfRVZfTEVfQ09OTl9DT01Q TEVURSAweDAxCnN0cnVjdCBoY2lfZXZfbGVfY29ubl9jb21wbGV0ZSB7Cgl1aW50OF90IHN0YXR1 czsKCXVpbnQxNl90IGhhbmRsZTsKCXVpbnQ4X3Qgcm9sZTsKCXVpbnQ4X3QgYmRhZGRyX3R5cGU7 CgliZGFkZHJfdCBiZGFkZHI7Cgl1aW50MTZfdCBpbnRlcnZhbDsKCXVpbnQxNl90IGxhdGVuY3k7 Cgl1aW50MTZfdCBzdXBlcnZpc2lvbl90aW1lb3V0OwoJdWludDhfdCBjbGtfYWNjdXJhbmN5Owp9 IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwoKc3RydWN0IGhjaV9kZXZfcmVxIHsKCXVpbnQxNl90 IGRldl9pZDsKCXVpbnQzMl90IGRldl9vcHQ7Cn07CgpzdHJ1Y3QgdmhjaV92ZW5kb3JfcGt0X3Jl cXVlc3QgewoJdWludDhfdCB0eXBlOwoJdWludDhfdCBvcGNvZGU7Cn0gX19hdHRyaWJ1dGVfXygo cGFja2VkKSk7CgpzdHJ1Y3QgdmhjaV9wa3QgewoJdWludDhfdCB0eXBlOwoJdW5pb24gewoJCXN0 cnVjdCB7CgkJCXVpbnQ4X3Qgb3Bjb2RlOwoJCQl1aW50MTZfdCBpZDsKCQl9IF9fYXR0cmlidXRl X18oKHBhY2tlZCkpIHZlbmRvcl9wa3Q7CgkJc3RydWN0IGhjaV9jb21tYW5kX2hkciBjb21tYW5k X2hkcjsKCX07Cn0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CgojZGVmaW5lIEhDSURFVlVQIF9J T1coJ0gnLCAyMDEsIGludCkKI2RlZmluZSBIQ0lTRVRTQ0FOIF9JT1coJ0gnLCAyMjEsIGludCkK CnN0YXRpYyBpbnQgdmhjaV9mZCA9IC0xOwoKc3RhdGljIHZvaWQgcmZraWxsX3VuYmxvY2tfYWxs KCkKewoJaW50IGZkID0gb3BlbigiL2Rldi9yZmtpbGwiLCBPX1dST05MWSk7CglpZiAoZmQgPCAw KQoJZXhpdCgxKTsKCXN0cnVjdCByZmtpbGxfZXZlbnQgZXZlbnQgPSB7MH07CglldmVudC5pZHgg PSAwOwoJZXZlbnQudHlwZSA9IFJGS0lMTF9UWVBFX0FMTDsKCWV2ZW50Lm9wID0gUkZLSUxMX09Q X0NIQU5HRV9BTEw7CglldmVudC5zb2Z0ID0gMDsKCWV2ZW50LmhhcmQgPSAwOwoJaWYgKHdyaXRl KGZkLCAmZXZlbnQsIHNpemVvZihldmVudCkpIDwgMCkKCWV4aXQoMSk7CgljbG9zZShmZCk7Cn0K CnN0YXRpYyB2b2lkIGhjaV9zZW5kX2V2ZW50X3BhY2tldChpbnQgZmQsIHVpbnQ4X3QgZXZ0LCB2 b2lkKiBkYXRhLCBzaXplX3QgZGF0YV9sZW4pCnsKCXN0cnVjdCBpb3ZlYyBpdlszXTsKCXN0cnVj dCBoY2lfZXZlbnRfaGRyIGhkcjsKCWhkci5ldnQgPSBldnQ7CgloZHIucGxlbiA9IGRhdGFfbGVu OwoJdWludDhfdCB0eXBlID0gSENJX0VWRU5UX1BLVDsKCWl2WzBdLmlvdl9iYXNlID0gJnR5cGU7 CglpdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHR5cGUpOwoJaXZbMV0uaW92X2Jhc2UgPSAmaGRyOwoJ aXZbMV0uaW92X2xlbiA9IHNpemVvZihoZHIpOwoJaXZbMl0uaW92X2Jhc2UgPSBkYXRhOwoJaXZb Ml0uaW92X2xlbiA9IGRhdGFfbGVuOwoJaWYgKHdyaXRldihmZCwgaXYsIHNpemVvZihpdikgLyBz aXplb2Yoc3RydWN0IGlvdmVjKSkgPCAwKQoJZXhpdCgxKTsKfQoKc3RhdGljIHZvaWQgaGNpX3Nl bmRfZXZlbnRfY21kX2NvbXBsZXRlKGludCBmZCwgdWludDE2X3Qgb3Bjb2RlLCB2b2lkKiBkYXRh LCBzaXplX3QgZGF0YV9sZW4pCnsKCXN0cnVjdCBpb3ZlYyBpdls0XTsKCXN0cnVjdCBoY2lfZXZl bnRfaGRyIGhkcjsKCWhkci5ldnQgPSBIQ0lfRVZfQ01EX0NPTVBMRVRFOwoJaGRyLnBsZW4gPSBz aXplb2Yoc3RydWN0IGhjaV9ldl9jbWRfY29tcGxldGUpICsgZGF0YV9sZW47CglzdHJ1Y3QgaGNp X2V2X2NtZF9jb21wbGV0ZSBldnRfaGRyOwoJZXZ0X2hkci5uY21kID0gMTsKCWV2dF9oZHIub3Bj b2RlID0gb3Bjb2RlOwoJdWludDhfdCB0eXBlID0gSENJX0VWRU5UX1BLVDsKCWl2WzBdLmlvdl9i YXNlID0gJnR5cGU7CglpdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHR5cGUpOwoJaXZbMV0uaW92X2Jh c2UgPSAmaGRyOwoJaXZbMV0uaW92X2xlbiA9IHNpemVvZihoZHIpOwoJaXZbMl0uaW92X2Jhc2Ug PSAmZXZ0X2hkcjsKCWl2WzJdLmlvdl9sZW4gPSBzaXplb2YoZXZ0X2hkcik7CglpdlszXS5pb3Zf YmFzZSA9IGRhdGE7CglpdlszXS5pb3ZfbGVuID0gZGF0YV9sZW47CglpZiAod3JpdGV2KGZkLCBp diwgc2l6ZW9mKGl2KSAvIHNpemVvZihzdHJ1Y3QgaW92ZWMpKSA8IDApCglleGl0KDEpOwp9Cgpz dGF0aWMgYm9vbCBwcm9jZXNzX2NvbW1hbmRfcGt0KGludCBmZCwgY2hhciogYnVmLCBzc2l6ZV90 IGJ1Zl9zaXplKQp7CglzdHJ1Y3QgaGNpX2NvbW1hbmRfaGRyKiBoZHIgPSAoc3RydWN0IGhjaV9j b21tYW5kX2hkciopYnVmOwoJaWYgKGJ1Zl9zaXplIDwgKHNzaXplX3Qpc2l6ZW9mKHN0cnVjdCBo Y2lfY29tbWFuZF9oZHIpIHx8CgkgICAgaGRyLT5wbGVuICE9IGJ1Zl9zaXplIC0gc2l6ZW9mKHN0 cnVjdCBoY2lfY29tbWFuZF9oZHIpKQoJZXhpdCgxKTsKCXN3aXRjaCAoaGRyLT5vcGNvZGUpIHsK CWNhc2UgSENJX09QX1dSSVRFX1NDQU5fRU5BQkxFOiB7CgkJdWludDhfdCBzdGF0dXMgPSAwOwoJ CWhjaV9zZW5kX2V2ZW50X2NtZF9jb21wbGV0ZShmZCwgaGRyLT5vcGNvZGUsICZzdGF0dXMsIHNp emVvZihzdGF0dXMpKTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCWNhc2UgSENJX09QX1JFQURfQkRfQURE UjogewoJCXN0cnVjdCBoY2lfcnBfcmVhZF9iZF9hZGRyIHJwID0gezB9OwoJCXJwLnN0YXR1cyA9 IDA7CgkJbWVtc2V0KCZycC5iZGFkZHIsIDB4YWEsIDYpOwoJCWhjaV9zZW5kX2V2ZW50X2NtZF9j b21wbGV0ZShmZCwgaGRyLT5vcGNvZGUsICZycCwgc2l6ZW9mKHJwKSk7CgkJcmV0dXJuIGZhbHNl OwoJfQoJY2FzZSBIQ0lfT1BfUkVBRF9CVUZGRVJfU0laRTogewoJCXN0cnVjdCBoY2lfcnBfcmVh ZF9idWZmZXJfc2l6ZSBycCA9IHswfTsKCQlycC5zdGF0dXMgPSAwOwoJCXJwLmFjbF9tdHUgPSAx MDIxOwoJCXJwLnNjb19tdHUgPSA5NjsKCQlycC5hY2xfbWF4X3BrdCA9IDQ7CgkJcnAuc2NvX21h eF9wa3QgPSA2OwoJCWhjaV9zZW5kX2V2ZW50X2NtZF9jb21wbGV0ZShmZCwgaGRyLT5vcGNvZGUs ICZycCwgc2l6ZW9mKHJwKSk7CgkJcmV0dXJuIGZhbHNlOwoJfQoJfQoJY2hhciBkdW1teVsweGY5 XSA9IHswfTsKCWhjaV9zZW5kX2V2ZW50X2NtZF9jb21wbGV0ZShmZCwgaGRyLT5vcGNvZGUsIGR1 bW15LCBzaXplb2YoZHVtbXkpKTsKCXJldHVybiBmYWxzZTsKfQoKc3RhdGljIHZvaWQqIGV2ZW50 X3RocmVhZCh2b2lkKiBhcmcpCnsKCXdoaWxlICgxKSB7CgkJY2hhciBidWZbMTAyNF0gPSB7MH07 CgkJc3NpemVfdCBidWZfc2l6ZSA9IHJlYWQodmhjaV9mZCwgYnVmLCBzaXplb2YoYnVmKSk7CgkJ aWYgKGJ1Zl9zaXplIDwgMCkKCWV4aXQoMSk7CgkJaWYgKGJ1Zl9zaXplID4gMCAmJiBidWZbMF0g PT0gSENJX0NPTU1BTkRfUEtUKSB7CgkJCWlmIChwcm9jZXNzX2NvbW1hbmRfcGt0KHZoY2lfZmQs IGJ1ZiArIDEsIGJ1Zl9zaXplIC0gMSkpCgkJCQlicmVhazsKCQl9Cgl9CglyZXR1cm4gTlVMTDsK fQojZGVmaW5lIEhDSV9IQU5ETEVfMSAyMDAKI2RlZmluZSBIQ0lfSEFORExFXzIgMjAxCgojZGVm aW5lIEhDSV9QUklNQVJZIDAKI2RlZmluZSBIQ0lfT1BfUkVTRVQgMHgwYzAzCgpzdGF0aWMgdm9p ZCBpbml0aWFsaXplX3ZoY2koKQp7CglpbnQgaGNpX3NvY2sgPSBzb2NrZXQoQUZfQkxVRVRPT1RI LCBTT0NLX1JBVywgQlRQUk9UT19IQ0kpOwoJaWYgKGhjaV9zb2NrIDwgMCkKCWV4aXQoMSk7Cgl2 aGNpX2ZkID0gb3BlbigiL2Rldi92aGNpIiwgT19SRFdSKTsKCWlmICh2aGNpX2ZkID09IC0xKQoJ ZXhpdCgxKTsKCWNvbnN0IGludCBrVmhjaUZkID0gMjAyOwoJaWYgKGR1cDIodmhjaV9mZCwga1Zo Y2lGZCkgPCAwKQoJZXhpdCgxKTsKCWNsb3NlKHZoY2lfZmQpOwoJdmhjaV9mZCA9IGtWaGNpRmQ7 CglzdHJ1Y3QgdmhjaV92ZW5kb3JfcGt0X3JlcXVlc3QgdmVuZG9yX3BrdF9yZXEgPSB7SENJX1ZF TkRPUl9QS1QsIEhDSV9QUklNQVJZfTsKCWlmICh3cml0ZSh2aGNpX2ZkLCAmdmVuZG9yX3BrdF9y ZXEsIHNpemVvZih2ZW5kb3JfcGt0X3JlcSkpICE9IHNpemVvZih2ZW5kb3JfcGt0X3JlcSkpCgll eGl0KDEpOwoJc3RydWN0IHZoY2lfcGt0IHZoY2lfcGt0OwoJaWYgKHJlYWQodmhjaV9mZCwgJnZo Y2lfcGt0LCBzaXplb2YodmhjaV9wa3QpKSAhPSBzaXplb2YodmhjaV9wa3QpKQoJZXhpdCgxKTsK CWlmICh2aGNpX3BrdC50eXBlID09IEhDSV9DT01NQU5EX1BLVCAmJiB2aGNpX3BrdC5jb21tYW5k X2hkci5vcGNvZGUgPT0gSENJX09QX1JFU0VUKSB7CgkJY2hhciByZXNwb25zZVsxXSA9IHswfTsK CQloY2lfc2VuZF9ldmVudF9jbWRfY29tcGxldGUodmhjaV9mZCwgSENJX09QX1JFU0VULCByZXNw b25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CgkJaWYgKHJlYWQodmhjaV9mZCwgJnZoY2lfcGt0LCBz aXplb2YodmhjaV9wa3QpKSAhPSBzaXplb2YodmhjaV9wa3QpKQoJZXhpdCgxKTsKCX0KCWlmICh2 aGNpX3BrdC50eXBlICE9IEhDSV9WRU5ET1JfUEtUKQoJZXhpdCgxKTsKCWludCBkZXZfaWQgPSB2 aGNpX3BrdC52ZW5kb3JfcGt0LmlkOwoJcHRocmVhZF90IHRoOwoJaWYgKHB0aHJlYWRfY3JlYXRl KCZ0aCwgTlVMTCwgZXZlbnRfdGhyZWFkLCBOVUxMKSkKCWV4aXQoMSk7CglpbnQgcmV0ID0gaW9j dGwoaGNpX3NvY2ssIEhDSURFVlVQLCBkZXZfaWQpOwoJaWYgKHJldCkgewoJCWlmIChlcnJubyA9 PSBFUkZLSUxMKSB7CgkJCXJma2lsbF91bmJsb2NrX2FsbCgpOwoJCQlyZXQgPSBpb2N0bChoY2lf c29jaywgSENJREVWVVAsIGRldl9pZCk7CgkJfQoJCWlmIChyZXQgJiYgZXJybm8gIT0gRUFMUkVB RFkpCglleGl0KDEpOwoJfQoJc3RydWN0IGhjaV9kZXZfcmVxIGRyID0gezB9OwoJZHIuZGV2X2lk ID0gZGV2X2lkOwoJZHIuZGV2X29wdCA9IFNDQU5fUEFHRTsKCWlmIChpb2N0bChoY2lfc29jaywg SENJU0VUU0NBTiwgJmRyKSkKCWV4aXQoMSk7CglzdHJ1Y3QgaGNpX2V2X2Nvbm5fcmVxdWVzdCBy ZXF1ZXN0OwoJbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YocmVxdWVzdCkpOwoJbWVtc2V0KCZy ZXF1ZXN0LmJkYWRkciwgMHhhYSwgNik7CgkqKHVpbnQ4X3QqKSZyZXF1ZXN0LmJkYWRkci5iWzVd ID0gMHgxMDsKCXJlcXVlc3QubGlua190eXBlID0gQUNMX0xJTks7CgloY2lfc2VuZF9ldmVudF9w YWNrZXQodmhjaV9mZCwgSENJX0VWX0NPTk5fUkVRVUVTVCwgJnJlcXVlc3QsIHNpemVvZihyZXF1 ZXN0KSk7CglzdHJ1Y3QgaGNpX2V2X2Nvbm5fY29tcGxldGUgY29tcGxldGU7CgltZW1zZXQoJmNv bXBsZXRlLCAwLCBzaXplb2YoY29tcGxldGUpKTsKCWNvbXBsZXRlLnN0YXR1cyA9IDA7Cgljb21w bGV0ZS5oYW5kbGUgPSBIQ0lfSEFORExFXzE7CgltZW1zZXQoJmNvbXBsZXRlLmJkYWRkciwgMHhh YSwgNik7CgkqKHVpbnQ4X3QqKSZjb21wbGV0ZS5iZGFkZHIuYls1XSA9IDB4MTA7Cgljb21wbGV0 ZS5saW5rX3R5cGUgPSBBQ0xfTElOSzsKCWNvbXBsZXRlLmVuY3JfbW9kZSA9IDA7CgloY2lfc2Vu ZF9ldmVudF9wYWNrZXQodmhjaV9mZCwgSENJX0VWX0NPTk5fQ09NUExFVEUsICZjb21wbGV0ZSwg c2l6ZW9mKGNvbXBsZXRlKSk7CglzdHJ1Y3QgaGNpX2V2X3JlbW90ZV9mZWF0dXJlcyBmZWF0dXJl czsKCW1lbXNldCgmZmVhdHVyZXMsIDAsIHNpemVvZihmZWF0dXJlcykpOwoJZmVhdHVyZXMuc3Rh dHVzID0gMDsKCWZlYXR1cmVzLmhhbmRsZSA9IEhDSV9IQU5ETEVfMTsKCWhjaV9zZW5kX2V2ZW50 X3BhY2tldCh2aGNpX2ZkLCBIQ0lfRVZfUkVNT1RFX0ZFQVRVUkVTLCAmZmVhdHVyZXMsIHNpemVv ZihmZWF0dXJlcykpOwoJc3RydWN0IHsKCQlzdHJ1Y3QgaGNpX2V2X2xlX21ldGEgbGVfbWV0YTsK CQlzdHJ1Y3QgaGNpX2V2X2xlX2Nvbm5fY29tcGxldGUgbGVfY29ubjsKCX0gbGVfY29ubjsKCW1l bXNldCgmbGVfY29ubiwgMCwgc2l6ZW9mKGxlX2Nvbm4pKTsKCWxlX2Nvbm4ubGVfbWV0YS5zdWJl dmVudCA9IEhDSV9FVl9MRV9DT05OX0NPTVBMRVRFOwoJbWVtc2V0KCZsZV9jb25uLmxlX2Nvbm4u YmRhZGRyLCAweGFhLCA2KTsKCSoodWludDhfdCopJmxlX2Nvbm4ubGVfY29ubi5iZGFkZHIuYls1 XSA9IDB4MTE7CglsZV9jb25uLmxlX2Nvbm4ucm9sZSA9IDE7CglsZV9jb25uLmxlX2Nvbm4uaGFu ZGxlID0gSENJX0hBTkRMRV8yOwoJaGNpX3NlbmRfZXZlbnRfcGFja2V0KHZoY2lfZmQsIEhDSV9F Vl9MRV9NRVRBLCAmbGVfY29ubiwgc2l6ZW9mKGxlX2Nvbm4pKTsKCXB0aHJlYWRfam9pbih0aCwg TlVMTCk7CgljbG9zZShoY2lfc29jayk7Cn0KCnN0YXRpYyB2b2lkIG1vdW50X2Nncm91cHMoY29u c3QgY2hhciogZGlyLCBjb25zdCBjaGFyKiogY29udHJvbGxlcnMsIGludCBjb3VudCkKewoJaWYg KG1rZGlyKGRpciwgMDc3NykpIHsKCQlyZXR1cm47Cgl9CgljaGFyIGVuYWJsZWRbMTI4XSA9IHsw fTsKCWludCBpID0gMDsKCWZvciAoOyBpIDwgY291bnQ7IGkrKykgewoJCWlmIChtb3VudCgibm9u ZSIsIGRpciwgImNncm91cCIsIDAsIGNvbnRyb2xsZXJzW2ldKSkgewoJCQljb250aW51ZTsKCQl9 CgkJdW1vdW50KGRpcik7CgkJc3RyY2F0KGVuYWJsZWQsICIsIik7CgkJc3RyY2F0KGVuYWJsZWQs IGNvbnRyb2xsZXJzW2ldKTsKCX0KCWlmIChlbmFibGVkWzBdID09IDApIHsKCQlpZiAocm1kaXIo ZGlyKSAmJiBlcnJubyAhPSBFQlVTWSkKCWV4aXQoMSk7CgkJcmV0dXJuOwoJfQoJaWYgKG1vdW50 KCJub25lIiwgZGlyLCAiY2dyb3VwIiwgMCwgZW5hYmxlZCArIDEpKSB7CgkJaWYgKHJtZGlyKGRp cikgJiYgZXJybm8gIT0gRUJVU1kpCglleGl0KDEpOwoJfQoJaWYgKGNobW9kKGRpciwgMDc3Nykp IHsKCX0KfQoKc3RhdGljIHZvaWQgbW91bnRfY2dyb3VwczIoY29uc3QgY2hhcioqIGNvbnRyb2xs ZXJzLCBpbnQgY291bnQpCnsKCWlmIChta2RpcigiL3N5emNncm91cC91bmlmaWVkIiwgMDc3Nykp IHsKCQlyZXR1cm47Cgl9CglpZiAobW91bnQoIm5vbmUiLCAiL3N5emNncm91cC91bmlmaWVkIiwg ImNncm91cDIiLCAwLCBOVUxMKSkgewoJCWlmIChybWRpcigiL3N5emNncm91cC91bmlmaWVkIikg JiYgZXJybm8gIT0gRUJVU1kpCglleGl0KDEpOwoJCXJldHVybjsKCX0KCWlmIChjaG1vZCgiL3N5 emNncm91cC91bmlmaWVkIiwgMDc3NykpIHsKCX0KCWludCBjb250cm9sID0gb3BlbigiL3N5emNn cm91cC91bmlmaWVkL2Nncm91cC5zdWJ0cmVlX2NvbnRyb2wiLCBPX1dST05MWSk7CglpZiAoY29u dHJvbCA9PSAtMSkKCQlyZXR1cm47CglpbnQgaTsKCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsr KQoJCWlmICh3cml0ZShjb250cm9sLCBjb250cm9sbGVyc1tpXSwgc3RybGVuKGNvbnRyb2xsZXJz W2ldKSkgPCAwKSB7CgkJfQoJY2xvc2UoY29udHJvbCk7Cn0KCnN0YXRpYyB2b2lkIHNldHVwX2Nn cm91cHMoKQp7Cgljb25zdCBjaGFyKiB1bmlmaWVkX2NvbnRyb2xsZXJzW10gPSB7IitjcHUiLCAi K2lvIiwgIitwaWRzIn07Cgljb25zdCBjaGFyKiBuZXRfY29udHJvbGxlcnNbXSA9IHsibmV0Iiwg Im5ldF9wcmlvIiwgImRldmljZXMiLCAiYmxraW8iLCAiZnJlZXplciJ9OwoJY29uc3QgY2hhciog Y3B1X2NvbnRyb2xsZXJzW10gPSB7ImNwdXNldCIsICJjcHVhY2N0IiwgImh1Z2V0bGIiLCAicmxp bWl0IiwgIm1lbW9yeSJ9OwoJaWYgKG1rZGlyKCIvc3l6Y2dyb3VwIiwgMDc3NykpIHsKCQlyZXR1 cm47Cgl9Cgltb3VudF9jZ3JvdXBzMih1bmlmaWVkX2NvbnRyb2xsZXJzLCBzaXplb2YodW5pZmll ZF9jb250cm9sbGVycykgLyBzaXplb2YodW5pZmllZF9jb250cm9sbGVyc1swXSkpOwoJbW91bnRf Y2dyb3VwcygiL3N5emNncm91cC9uZXQiLCBuZXRfY29udHJvbGxlcnMsIHNpemVvZihuZXRfY29u dHJvbGxlcnMpIC8gc2l6ZW9mKG5ldF9jb250cm9sbGVyc1swXSkpOwoJbW91bnRfY2dyb3Vwcygi L3N5emNncm91cC9jcHUiLCBjcHVfY29udHJvbGxlcnMsIHNpemVvZihjcHVfY29udHJvbGxlcnMp IC8gc2l6ZW9mKGNwdV9jb250cm9sbGVyc1swXSkpOwoJd3JpdGVfZmlsZSgiL3N5emNncm91cC9j cHUvY2dyb3VwLmNsb25lX2NoaWxkcmVuIiwgIjEiKTsKCXdyaXRlX2ZpbGUoIi9zeXpjZ3JvdXAv Y3B1L2NwdXNldC5tZW1vcnlfcHJlc3N1cmVfZW5hYmxlZCIsICIxIik7Cn0KCnN0YXRpYyB2b2lk IHNldHVwX2Nncm91cHNfbG9vcCgpCnsKCWludCBwaWQgPSBnZXRwaWQoKTsKCWNoYXIgZmlsZVsx MjhdOwoJY2hhciBjZ3JvdXBkaXJbNjRdOwoJc25wcmludGYoY2dyb3VwZGlyLCBzaXplb2YoY2dy b3VwZGlyKSwgIi9zeXpjZ3JvdXAvdW5pZmllZC9zeXolbGx1IiwgcHJvY2lkKTsKCWlmIChta2Rp cihjZ3JvdXBkaXIsIDA3NzcpKSB7Cgl9CglzbnByaW50ZihmaWxlLCBzaXplb2YoZmlsZSksICIl cy9waWRzLm1heCIsIGNncm91cGRpcik7Cgl3cml0ZV9maWxlKGZpbGUsICIzMiIpOwoJc25wcmlu dGYoZmlsZSwgc2l6ZW9mKGZpbGUpLCAiJXMvY2dyb3VwLnByb2NzIiwgY2dyb3VwZGlyKTsKCXdy aXRlX2ZpbGUoZmlsZSwgIiVkIiwgcGlkKTsKCXNucHJpbnRmKGNncm91cGRpciwgc2l6ZW9mKGNn cm91cGRpciksICIvc3l6Y2dyb3VwL2NwdS9zeXolbGx1IiwgcHJvY2lkKTsKCWlmIChta2Rpcihj Z3JvdXBkaXIsIDA3NzcpKSB7Cgl9CglzbnByaW50ZihmaWxlLCBzaXplb2YoZmlsZSksICIlcy9j Z3JvdXAucHJvY3MiLCBjZ3JvdXBkaXIpOwoJd3JpdGVfZmlsZShmaWxlLCAiJWQiLCBwaWQpOwoJ c25wcmludGYoZmlsZSwgc2l6ZW9mKGZpbGUpLCAiJXMvbWVtb3J5LnNvZnRfbGltaXRfaW5fYnl0 ZXMiLCBjZ3JvdXBkaXIpOwoJd3JpdGVfZmlsZShmaWxlLCAiJWQiLCAyOTkgPDwgMjApOwoJc25w cmludGYoZmlsZSwgc2l6ZW9mKGZpbGUpLCAiJXMvbWVtb3J5LmxpbWl0X2luX2J5dGVzIiwgY2dy b3VwZGlyKTsKCXdyaXRlX2ZpbGUoZmlsZSwgIiVkIiwgMzAwIDw8IDIwKTsKCXNucHJpbnRmKGNn cm91cGRpciwgc2l6ZW9mKGNncm91cGRpciksICIvc3l6Y2dyb3VwL25ldC9zeXolbGx1IiwgcHJv Y2lkKTsKCWlmIChta2RpcihjZ3JvdXBkaXIsIDA3NzcpKSB7Cgl9CglzbnByaW50ZihmaWxlLCBz aXplb2YoZmlsZSksICIlcy9jZ3JvdXAucHJvY3MiLCBjZ3JvdXBkaXIpOwoJd3JpdGVfZmlsZShm aWxlLCAiJWQiLCBwaWQpOwp9CgpzdGF0aWMgdm9pZCBzZXR1cF9jZ3JvdXBzX3Rlc3QoKQp7Cglj aGFyIGNncm91cGRpcls2NF07CglzbnByaW50ZihjZ3JvdXBkaXIsIHNpemVvZihjZ3JvdXBkaXIp LCAiL3N5emNncm91cC91bmlmaWVkL3N5eiVsbHUiLCBwcm9jaWQpOwoJaWYgKHN5bWxpbmsoY2dy b3VwZGlyLCAiLi9jZ3JvdXAiKSkgewoJfQoJc25wcmludGYoY2dyb3VwZGlyLCBzaXplb2YoY2dy b3VwZGlyKSwgIi9zeXpjZ3JvdXAvY3B1L3N5eiVsbHUiLCBwcm9jaWQpOwoJaWYgKHN5bWxpbmso Y2dyb3VwZGlyLCAiLi9jZ3JvdXAuY3B1IikpIHsKCX0KCXNucHJpbnRmKGNncm91cGRpciwgc2l6 ZW9mKGNncm91cGRpciksICIvc3l6Y2dyb3VwL25ldC9zeXolbGx1IiwgcHJvY2lkKTsKCWlmIChz eW1saW5rKGNncm91cGRpciwgIi4vY2dyb3VwLm5ldCIpKSB7Cgl9Cn0KCnN0YXRpYyB2b2lkIHNl dHVwX2NvbW1vbigpCnsKCWlmIChtb3VudCgwLCAiL3N5cy9mcy9mdXNlL2Nvbm5lY3Rpb25zIiwg ImZ1c2VjdGwiLCAwLCAwKSkgewoJfQp9CgpzdGF0aWMgdm9pZCBzZXR1cF9iaW5kZXJmcygpCnsK CWlmIChta2RpcigiL2Rldi9iaW5kZXJmcyIsIDA3NzcpKSB7Cgl9CglpZiAobW91bnQoImJpbmRl ciIsICIvZGV2L2JpbmRlcmZzIiwgImJpbmRlciIsIDAsIE5VTEwpKSB7Cgl9Cn0KCnN0YXRpYyB2 b2lkIGxvb3AoKTsKCnN0YXRpYyB2b2lkIHNhbmRib3hfY29tbW9uKCkKewoJcHJjdGwoUFJfU0VU X1BERUFUSFNJRywgU0lHS0lMTCwgMCwgMCwgMCk7CglzZXRzaWQoKTsKCXN0cnVjdCBybGltaXQg cmxpbTsKCXJsaW0ucmxpbV9jdXIgPSBybGltLnJsaW1fbWF4ID0gKDIwMCA8PCAyMCk7CglzZXRy bGltaXQoUkxJTUlUX0FTLCAmcmxpbSk7CglybGltLnJsaW1fY3VyID0gcmxpbS5ybGltX21heCA9 IDMyIDw8IDIwOwoJc2V0cmxpbWl0KFJMSU1JVF9NRU1MT0NLLCAmcmxpbSk7CglybGltLnJsaW1f Y3VyID0gcmxpbS5ybGltX21heCA9IDEzNiA8PCAyMDsKCXNldHJsaW1pdChSTElNSVRfRlNJWkUs ICZybGltKTsKCXJsaW0ucmxpbV9jdXIgPSBybGltLnJsaW1fbWF4ID0gMSA8PCAyMDsKCXNldHJs aW1pdChSTElNSVRfU1RBQ0ssICZybGltKTsKCXJsaW0ucmxpbV9jdXIgPSBybGltLnJsaW1fbWF4 ID0gMTI4IDw8IDIwOwoJc2V0cmxpbWl0KFJMSU1JVF9DT1JFLCAmcmxpbSk7CglybGltLnJsaW1f Y3VyID0gcmxpbS5ybGltX21heCA9IDI1NjsKCXNldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmcmxp bSk7CglpZiAodW5zaGFyZShDTE9ORV9ORVdOUykpIHsKCX0KCWlmIChtb3VudChOVUxMLCAiLyIs IE5VTEwsIE1TX1JFQyB8IE1TX1BSSVZBVEUsIE5VTEwpKSB7Cgl9CglpZiAodW5zaGFyZShDTE9O RV9ORVdJUEMpKSB7Cgl9CglpZiAodW5zaGFyZSgweDAyMDAwMDAwKSkgewoJfQoJaWYgKHVuc2hh cmUoQ0xPTkVfTkVXVVRTKSkgewoJfQoJaWYgKHVuc2hhcmUoQ0xPTkVfU1lTVlNFTSkpIHsKCX0K CXR5cGVkZWYgc3RydWN0IHsKCQljb25zdCBjaGFyKiBuYW1lOwoJCWNvbnN0IGNoYXIqIHZhbHVl OwoJfSBzeXNjdGxfdDsKCXN0YXRpYyBjb25zdCBzeXNjdGxfdCBzeXNjdGxzW10gPSB7CgkgICAg eyIvcHJvYy9zeXMva2VybmVsL3NobW1heCIsICIxNjc3NzIxNiJ9LAoJICAgIHsiL3Byb2Mvc3lz L2tlcm5lbC9zaG1hbGwiLCAiNTM2ODcwOTEyIn0sCgkgICAgeyIvcHJvYy9zeXMva2VybmVsL3No bW1uaSIsICIxMDI0In0sCgkgICAgeyIvcHJvYy9zeXMva2VybmVsL21zZ21heCIsICI4MTkyIn0s CgkgICAgeyIvcHJvYy9zeXMva2VybmVsL21zZ21uaSIsICIxMDI0In0sCgkgICAgeyIvcHJvYy9z eXMva2VybmVsL21zZ21uYiIsICIxMDI0In0sCgkgICAgeyIvcHJvYy9zeXMva2VybmVsL3NlbSIs ICIxMDI0IDEwNDg1NzYgNTAwIDEwMjQifSwKCX07Cgl1bnNpZ25lZCBpOwoJZm9yIChpID0gMDsg aSA8IHNpemVvZihzeXNjdGxzKSAvIHNpemVvZihzeXNjdGxzWzBdKTsgaSsrKQoJCXdyaXRlX2Zp bGUoc3lzY3Rsc1tpXS5uYW1lLCBzeXNjdGxzW2ldLnZhbHVlKTsKfQoKc3RhdGljIGludCB3YWl0 X2Zvcl9sb29wKGludCBwaWQpCnsKCWlmIChwaWQgPCAwKQoJZXhpdCgxKTsKCWludCBzdGF0dXMg PSAwOwoJd2hpbGUgKHdhaXRwaWQoLTEsICZzdGF0dXMsIF9fV0FMTCkgIT0gcGlkKSB7Cgl9Cgly ZXR1cm4gV0VYSVRTVEFUVVMoc3RhdHVzKTsKfQoKc3RhdGljIHZvaWQgZHJvcF9jYXBzKHZvaWQp CnsKCXN0cnVjdCBfX3VzZXJfY2FwX2hlYWRlcl9zdHJ1Y3QgY2FwX2hkciA9IHt9OwoJc3RydWN0 IF9fdXNlcl9jYXBfZGF0YV9zdHJ1Y3QgY2FwX2RhdGFbMl0gPSB7fTsKCWNhcF9oZHIudmVyc2lv biA9IF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT05fMzsKCWNhcF9oZHIucGlkID0gZ2V0cGlkKCk7 CglpZiAoc3lzY2FsbChTWVNfY2FwZ2V0LCAmY2FwX2hkciwgJmNhcF9kYXRhKSkKCWV4aXQoMSk7 Cgljb25zdCBpbnQgZHJvcCA9ICgxIDw8IENBUF9TWVNfUFRSQUNFKSB8ICgxIDw8IENBUF9TWVNf TklDRSk7CgljYXBfZGF0YVswXS5lZmZlY3RpdmUgJj0gfmRyb3A7CgljYXBfZGF0YVswXS5wZXJt aXR0ZWQgJj0gfmRyb3A7CgljYXBfZGF0YVswXS5pbmhlcml0YWJsZSAmPSB+ZHJvcDsKCWlmIChz eXNjYWxsKFNZU19jYXBzZXQsICZjYXBfaGRyLCAmY2FwX2RhdGEpKQoJZXhpdCgxKTsKfQoKc3Rh dGljIGludCBkb19zYW5kYm94X25vbmUodm9pZCkKewoJaWYgKHVuc2hhcmUoQ0xPTkVfTkVXUElE KSkgewoJfQoJaW50IHBpZCA9IGZvcmsoKTsKCWlmIChwaWQgIT0gMCkKCQlyZXR1cm4gd2FpdF9m b3JfbG9vcChwaWQpOwoJc2V0dXBfY29tbW9uKCk7Cglpbml0aWFsaXplX3ZoY2koKTsKCXNhbmRi b3hfY29tbW9uKCk7Cglkcm9wX2NhcHMoKTsKCWlmICh1bnNoYXJlKENMT05FX05FV05FVCkpIHsK CX0KCXdyaXRlX2ZpbGUoIi9wcm9jL3N5cy9uZXQvaXB2NC9waW5nX2dyb3VwX3JhbmdlIiwgIjAg NjU1MzUiKTsKCWluaXRpYWxpemVfdHVuKCk7Cglpbml0aWFsaXplX3dpZmlfZGV2aWNlcygpOwoJ c2V0dXBfYmluZGVyZnMoKTsKCWxvb3AoKTsKCWV4aXQoMSk7Cn0KCiNkZWZpbmUgRlNfSU9DX1NF VEZMQUdTIF9JT1coJ2YnLCAyLCBsb25nKQpzdGF0aWMgdm9pZCByZW1vdmVfZGlyKGNvbnN0IGNo YXIqIGRpcikKewoJaW50IGl0ZXIgPSAwOwoJRElSKiBkcCA9IDA7CnJldHJ5OgoJCXdoaWxlICh1 bW91bnQyKGRpciwgTU5UX0RFVEFDSCB8IFVNT1VOVF9OT0ZPTExPVykgPT0gMCkgewoJCX0KCWRw ID0gb3BlbmRpcihkaXIpOwoJaWYgKGRwID09IE5VTEwpIHsKCQlpZiAoZXJybm8gPT0gRU1GSUxF KSB7CglleGl0KDEpOwoJCX0KCWV4aXQoMSk7Cgl9CglzdHJ1Y3QgZGlyZW50KiBlcCA9IDA7Cgl3 aGlsZSAoKGVwID0gcmVhZGRpcihkcCkpKSB7CgkJaWYgKHN0cmNtcChlcC0+ZF9uYW1lLCAiLiIp ID09IDAgfHwgc3RyY21wKGVwLT5kX25hbWUsICIuLiIpID09IDApCgkJCWNvbnRpbnVlOwoJCWNo YXIgZmlsZW5hbWVbRklMRU5BTUVfTUFYXTsKCQlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZp bGVuYW1lKSwgIiVzLyVzIiwgZGlyLCBlcC0+ZF9uYW1lKTsKCQkJd2hpbGUgKHVtb3VudDIoZmls ZW5hbWUsIE1OVF9ERVRBQ0ggfCBVTU9VTlRfTk9GT0xMT1cpID09IDApIHsKCQkJfQoJCXN0cnVj dCBzdGF0IHN0OwoJCWlmIChsc3RhdChmaWxlbmFtZSwgJnN0KSkKCWV4aXQoMSk7CgkJaWYgKFNf SVNESVIoc3Quc3RfbW9kZSkpIHsKCQkJcmVtb3ZlX2RpcihmaWxlbmFtZSk7CgkJCWNvbnRpbnVl OwoJCX0KCQlpbnQgaTsKCQlmb3IgKGkgPSAwOzsgaSsrKSB7CgkJCWlmICh1bmxpbmsoZmlsZW5h bWUpID09IDApCgkJCQlicmVhazsKCQkJaWYgKGVycm5vID09IEVQRVJNKSB7CgkJCQlpbnQgZmQg PSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CgkJCQlpZiAoZmQgIT0gLTEpIHsKCQkJCQlsb25n IGZsYWdzID0gMDsKCQkJCQlpZiAoaW9jdGwoZmQsIEZTX0lPQ19TRVRGTEFHUywgJmZsYWdzKSA9 PSAwKSB7CgkJCQkJfQoJCQkJCWNsb3NlKGZkKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJfQoJ CQlpZiAoZXJybm8gPT0gRVJPRlMpIHsKCQkJCWJyZWFrOwoJCQl9CgkJCWlmIChlcnJubyAhPSBF QlVTWSB8fCBpID4gMTAwKQoJZXhpdCgxKTsKCQkJCWlmICh1bW91bnQyKGZpbGVuYW1lLCBNTlRf REVUQUNIIHwgVU1PVU5UX05PRk9MTE9XKSkKCWV4aXQoMSk7CgkJfQoJfQoJY2xvc2VkaXIoZHAp OwoJZm9yIChpbnQgaSA9IDA7OyBpKyspIHsKCQlpZiAocm1kaXIoZGlyKSA9PSAwKQoJCQlicmVh azsKCQlpZiAoaSA8IDEwMCkgewoJCQlpZiAoZXJybm8gPT0gRVBFUk0pIHsKCQkJCWludCBmZCA9 IG9wZW4oZGlyLCBPX1JET05MWSk7CgkJCQlpZiAoZmQgIT0gLTEpIHsKCQkJCQlsb25nIGZsYWdz ID0gMDsKCQkJCQlpZiAoaW9jdGwoZmQsIEZTX0lPQ19TRVRGTEFHUywgJmZsYWdzKSA9PSAwKSB7 CgkJCQkJfQoJCQkJCWNsb3NlKGZkKTsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJfQoJCQlpZiAo ZXJybm8gPT0gRVJPRlMpIHsKCQkJCWJyZWFrOwoJCQl9CgkJCWlmIChlcnJubyA9PSBFQlVTWSkg ewoJCQkJCWlmICh1bW91bnQyKGRpciwgTU5UX0RFVEFDSCB8IFVNT1VOVF9OT0ZPTExPVykpCgll eGl0KDEpOwoJCQkJY29udGludWU7CgkJCX0KCQkJaWYgKGVycm5vID09IEVOT1RFTVBUWSkgewoJ CQkJaWYgKGl0ZXIgPCAxMDApIHsKCQkJCQlpdGVyKys7CgkJCQkJZ290byByZXRyeTsKCQkJCX0K CQkJfQoJCX0KCWV4aXQoMSk7Cgl9Cn0KCnN0YXRpYyBpbnQgaW5qZWN0X2ZhdWx0KGludCBudGgp CnsKCWludCBmZDsKCWZkID0gb3BlbigiL3Byb2MvdGhyZWFkLXNlbGYvZmFpbC1udGgiLCBPX1JE V1IpOwoJaWYgKGZkID09IC0xKQoJZXhpdCgxKTsKCWNoYXIgYnVmWzE2XTsKCXNwcmludGYoYnVm LCAiJWQiLCBudGgpOwoJaWYgKHdyaXRlKGZkLCBidWYsIHN0cmxlbihidWYpKSAhPSAoc3NpemVf dClzdHJsZW4oYnVmKSkKCWV4aXQoMSk7CglyZXR1cm4gZmQ7Cn0KCnN0YXRpYyB2b2lkIGtpbGxf YW5kX3dhaXQoaW50IHBpZCwgaW50KiBzdGF0dXMpCnsKCWtpbGwoLXBpZCwgU0lHS0lMTCk7Cglr aWxsKHBpZCwgU0lHS0lMTCk7Cglmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CgkJaWYg KHdhaXRwaWQoLTEsIHN0YXR1cywgV05PSEFORyB8IF9fV0FMTCkgPT0gcGlkKQoJCQlyZXR1cm47 CgkJdXNsZWVwKDEwMDApOwoJfQoJRElSKiBkaXIgPSBvcGVuZGlyKCIvc3lzL2ZzL2Z1c2UvY29u bmVjdGlvbnMiKTsKCWlmIChkaXIpIHsKCQlmb3IgKDs7KSB7CgkJCXN0cnVjdCBkaXJlbnQqIGVu dCA9IHJlYWRkaXIoZGlyKTsKCQkJaWYgKCFlbnQpCgkJCQlicmVhazsKCQkJaWYgKHN0cmNtcChl bnQtPmRfbmFtZSwgIi4iKSA9PSAwIHx8IHN0cmNtcChlbnQtPmRfbmFtZSwgIi4uIikgPT0gMCkK CQkJCWNvbnRpbnVlOwoJCQljaGFyIGFib3J0WzMwMF07CgkJCXNucHJpbnRmKGFib3J0LCBzaXpl b2YoYWJvcnQpLCAiL3N5cy9mcy9mdXNlL2Nvbm5lY3Rpb25zLyVzL2Fib3J0IiwgZW50LT5kX25h bWUpOwoJCQlpbnQgZmQgPSBvcGVuKGFib3J0LCBPX1dST05MWSk7CgkJCWlmIChmZCA9PSAtMSkg ewoJCQkJY29udGludWU7CgkJCX0KCQkJaWYgKHdyaXRlKGZkLCBhYm9ydCwgMSkgPCAwKSB7CgkJ CX0KCQkJY2xvc2UoZmQpOwoJCX0KCQljbG9zZWRpcihkaXIpOwoJfSBlbHNlIHsKCX0KCXdoaWxl ICh3YWl0cGlkKC0xLCBzdGF0dXMsIF9fV0FMTCkgIT0gcGlkKSB7Cgl9Cn0KCnN0YXRpYyB2b2lk IHNldHVwX2xvb3AoKQp7CglzZXR1cF9jZ3JvdXBzX2xvb3AoKTsKfQoKc3RhdGljIHZvaWQgc2V0 dXBfdGVzdCgpCnsKCXByY3RsKFBSX1NFVF9QREVBVEhTSUcsIFNJR0tJTEwsIDAsIDAsIDApOwoJ c2V0cGdycCgpOwoJc2V0dXBfY2dyb3Vwc190ZXN0KCk7Cgl3cml0ZV9maWxlKCIvcHJvYy9zZWxm L29vbV9zY29yZV9hZGoiLCAiMTAwMCIpOwoJZmx1c2hfdHVuKCk7CglpZiAoc3ltbGluaygiL2Rl di9iaW5kZXJmcyIsICIuL2JpbmRlcmZzIikpIHsKCX0KfQoKc3RhdGljIHZvaWQgY2xvc2VfZmRz KCkKewoJZm9yIChpbnQgZmQgPSAzOyBmZCA8IE1BWF9GRFM7IGZkKyspCgkJY2xvc2UoZmQpOwp9 CgpzdGF0aWMgdm9pZCBzZXR1cF9mYXVsdCgpCnsKCXN0YXRpYyBzdHJ1Y3QgewoJCWNvbnN0IGNo YXIqIGZpbGU7CgkJY29uc3QgY2hhciogdmFsOwoJCWJvb2wgZmF0YWw7Cgl9IGZpbGVzW10gPSB7 CgkgICAgeyIvc3lzL2tlcm5lbC9kZWJ1Zy9mYWlsc2xhYi9pZ25vcmUtZ2ZwLXdhaXQiLCAiTiIs IHRydWV9LAoJICAgIHsiL3N5cy9rZXJuZWwvZGVidWcvZmFpbF9mdXRleC9pZ25vcmUtcHJpdmF0 ZSIsICJOIiwgZmFsc2V9LAoJICAgIHsiL3N5cy9rZXJuZWwvZGVidWcvZmFpbF9wYWdlX2FsbG9j L2lnbm9yZS1nZnAtaGlnaG1lbSIsICJOIiwgZmFsc2V9LAoJICAgIHsiL3N5cy9rZXJuZWwvZGVi dWcvZmFpbF9wYWdlX2FsbG9jL2lnbm9yZS1nZnAtd2FpdCIsICJOIiwgZmFsc2V9LAoJICAgIHsi L3N5cy9rZXJuZWwvZGVidWcvZmFpbF9wYWdlX2FsbG9jL21pbi1vcmRlciIsICIwIiwgZmFsc2V9 LAoJfTsKCXVuc2lnbmVkIGk7Cglmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGZpbGVzKSAvIHNpemVv ZihmaWxlc1swXSk7IGkrKykgewoJCWlmICghd3JpdGVfZmlsZShmaWxlc1tpXS5maWxlLCBmaWxl c1tpXS52YWwpKSB7CgkJCWlmIChmaWxlc1tpXS5mYXRhbCkKCWV4aXQoMSk7CgkJfQoJfQp9Cgoj ZGVmaW5lIEtNRU1MRUFLX0ZJTEUgIi9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrIgoKc3RhdGlj IHZvaWQgc2V0dXBfbGVhaygpCnsKCWlmICghd3JpdGVfZmlsZShLTUVNTEVBS19GSUxFLCAic2Nh biIpKQoJZXhpdCgxKTsKCXNsZWVwKDUpOwoJaWYgKCF3cml0ZV9maWxlKEtNRU1MRUFLX0ZJTEUs ICJzY2FuIikpCglleGl0KDEpOwoJaWYgKCF3cml0ZV9maWxlKEtNRU1MRUFLX0ZJTEUsICJjbGVh ciIpKQoJZXhpdCgxKTsKfQoKc3RhdGljIHZvaWQgY2hlY2tfbGVha3Modm9pZCkKewoJaW50IGZk ID0gb3BlbihLTUVNTEVBS19GSUxFLCBPX1JEV1IpOwoJaWYgKGZkID09IC0xKQoJZXhpdCgxKTsK CXVpbnQ2NF90IHN0YXJ0ID0gY3VycmVudF90aW1lX21zKCk7CglpZiAod3JpdGUoZmQsICJzY2Fu IiwgNCkgIT0gNCkKCWV4aXQoMSk7CglzbGVlcCgxKTsKCXdoaWxlIChjdXJyZW50X3RpbWVfbXMo KSAtIHN0YXJ0IDwgNCAqIDEwMDApCgkJc2xlZXAoMSk7CglpZiAod3JpdGUoZmQsICJzY2FuIiwg NCkgIT0gNCkKCWV4aXQoMSk7CglzdGF0aWMgY2hhciBidWZbMTI4IDw8IDEwXTsKCXNzaXplX3Qg biA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTsKCWlmIChuIDwgMCkKCWV4aXQoMSk7 CglpbnQgbmxlYWtzID0gMDsKCWlmIChuICE9IDApIHsKCQlzbGVlcCgxKTsKCQlpZiAod3JpdGUo ZmQsICJzY2FuIiwgNCkgIT0gNCkKCWV4aXQoMSk7CgkJaWYgKGxzZWVrKGZkLCAwLCBTRUVLX1NF VCkgPCAwKQoJZXhpdCgxKTsKCQluID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSAtIDEpOwoJ CWlmIChuIDwgMCkKCWV4aXQoMSk7CgkJYnVmW25dID0gMDsKCQljaGFyKiBwb3MgPSBidWY7CgkJ Y2hhciogZW5kID0gYnVmICsgbjsKCQl3aGlsZSAocG9zIDwgZW5kKSB7CgkJCWNoYXIqIG5leHQg PSBzdHJzdHIocG9zICsgMSwgInVucmVmZXJlbmNlZCBvYmplY3QiKTsKCQkJaWYgKCFuZXh0KQoJ CQkJbmV4dCA9IGVuZDsKCQkJY2hhciBwcmV2ID0gKm5leHQ7CgkJCSpuZXh0ID0gMDsKCQkJZnBy aW50ZihzdGRlcnIsICJCVUc6IG1lbW9yeSBsZWFrXG4lc1xuIiwgcG9zKTsKCQkJKm5leHQgPSBw cmV2OwoJCQlwb3MgPSBuZXh0OwoJCQlubGVha3MrKzsKCQl9Cgl9CglpZiAod3JpdGUoZmQsICJj bGVhciIsIDUpICE9IDUpCglleGl0KDEpOwoJY2xvc2UoZmQpOwoJaWYgKG5sZWFrcykKCQlleGl0 KDEpOwp9CgojZGVmaW5lIE5MODAyMTU0X0NNRF9TRVRfU0hPUlRfQUREUiAxMQojZGVmaW5lIE5M ODAyMTU0X0FUVFJfSUZJTkRFWCAzCiNkZWZpbmUgTkw4MDIxNTRfQVRUUl9TSE9SVF9BRERSIDEw CgpzdGF0aWMgdm9pZCBzZXR1cF84MDIxNTQoKQp7CglpbnQgc29ja19yb3V0ZSA9IHNvY2tldChB Rl9ORVRMSU5LLCBTT0NLX1JBVywgTkVUTElOS19ST1VURSk7CglpZiAoc29ja19yb3V0ZSA9PSAt MSkKCWV4aXQoMSk7CglpbnQgc29ja19nZW5lcmljID0gc29ja2V0KEFGX05FVExJTkssIFNPQ0tf UkFXLCBORVRMSU5LX0dFTkVSSUMpOwoJaWYgKHNvY2tfZ2VuZXJpYyA8IDApCglleGl0KDEpOwoJ aW50IG5sODAyMTU0X2ZhbWlseV9pZCA9IG5ldGxpbmtfcXVlcnlfZmFtaWx5X2lkKCZubG1zZywg c29ja19nZW5lcmljLCAibmw4MDIxNTQiLCB0cnVlKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgMjsg aSsrKSB7CgkJY2hhciBkZXZuYW1lW10gPSAid3BhbjAiOwoJCWRldm5hbWVbc3RybGVuKGRldm5h bWUpIC0gMV0gKz0gaTsKCQl1aW50NjRfdCBod2FkZHIgPSAweGFhYWFhYWFhYWFhYTAwMDIgKyAo aSA8PCA4KTsKCQl1aW50MTZfdCBzaG9ydGFkZHIgPSAweGFhYTAgKyBpOwoJCWludCBpZmluZGV4 ID0gaWZfbmFtZXRvaW5kZXgoZGV2bmFtZSk7CgkJc3RydWN0IGdlbmxtc2doZHIgZ2VubGhkcjsK CQltZW1zZXQoJmdlbmxoZHIsIDAsIHNpemVvZihnZW5saGRyKSk7CgkJZ2VubGhkci5jbWQgPSBO TDgwMjE1NF9DTURfU0VUX1NIT1JUX0FERFI7CgkJbmV0bGlua19pbml0KCZubG1zZywgbmw4MDIx NTRfZmFtaWx5X2lkLCAwLCAmZ2VubGhkciwgc2l6ZW9mKGdlbmxoZHIpKTsKCQluZXRsaW5rX2F0 dHIoJm5sbXNnLCBOTDgwMjE1NF9BVFRSX0lGSU5ERVgsICZpZmluZGV4LCBzaXplb2YoaWZpbmRl eCkpOwoJCW5ldGxpbmtfYXR0cigmbmxtc2csIE5MODAyMTU0X0FUVFJfU0hPUlRfQUREUiwgJnNo b3J0YWRkciwgc2l6ZW9mKHNob3J0YWRkcikpOwoJCWludCBlcnIgPSBuZXRsaW5rX3NlbmQoJm5s bXNnLCBzb2NrX2dlbmVyaWMpOwoJCWlmIChlcnIgPCAwKSB7CgkJfQoJCW5ldGxpbmtfZGV2aWNl X2NoYW5nZSgmbmxtc2csIHNvY2tfcm91dGUsIGRldm5hbWUsIHRydWUsIDAsICZod2FkZHIsIHNp emVvZihod2FkZHIpLCAwKTsKCQlpZiAoaSA9PSAwKSB7CgkJCW5ldGxpbmtfYWRkX2RldmljZV9p bXBsKCZubG1zZywgImxvd3BhbiIsICJsb3dwYW4wIiwgZmFsc2UpOwoJCQluZXRsaW5rX2RvbmUo Jm5sbXNnKTsKCQkJbmV0bGlua19hdHRyKCZubG1zZywgSUZMQV9MSU5LLCAmaWZpbmRleCwgc2l6 ZW9mKGlmaW5kZXgpKTsKCQkJaW50IGVyciA9IG5ldGxpbmtfc2VuZCgmbmxtc2csIHNvY2tfcm91 dGUpOwoJCQlpZiAoZXJyIDwgMCkgewoJCQl9CgkJfQoJfQoJY2xvc2Uoc29ja19yb3V0ZSk7Cglj bG9zZShzb2NrX2dlbmVyaWMpOwp9CgpzdHJ1Y3QgdGhyZWFkX3QgewoJaW50IGNyZWF0ZWQsIGNh bGw7CglldmVudF90IHJlYWR5LCBkb25lOwp9OwoKc3RhdGljIHN0cnVjdCB0aHJlYWRfdCB0aHJl YWRzWzE2XTsKc3RhdGljIHZvaWQgZXhlY3V0ZV9jYWxsKGludCBjYWxsKTsKc3RhdGljIGludCBy dW5uaW5nOwoKc3RhdGljIHZvaWQqIHRocih2b2lkKiBhcmcpCnsKCXN0cnVjdCB0aHJlYWRfdCog dGggPSAoc3RydWN0IHRocmVhZF90Kilhcmc7Cglmb3IgKDs7KSB7CgkJZXZlbnRfd2FpdCgmdGgt PnJlYWR5KTsKCQlldmVudF9yZXNldCgmdGgtPnJlYWR5KTsKCQlleGVjdXRlX2NhbGwodGgtPmNh bGwpOwoJCV9fYXRvbWljX2ZldGNoX3N1YigmcnVubmluZywgMSwgX19BVE9NSUNfUkVMQVhFRCk7 CgkJZXZlbnRfc2V0KCZ0aC0+ZG9uZSk7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgZXhl Y3V0ZV9vbmUodm9pZCkKewoJaW50IGksIGNhbGwsIHRocmVhZDsKCWZvciAoY2FsbCA9IDA7IGNh bGwgPCAyOyBjYWxsKyspIHsKCQlmb3IgKHRocmVhZCA9IDA7IHRocmVhZCA8IChpbnQpKHNpemVv Zih0aHJlYWRzKSAvIHNpemVvZih0aHJlYWRzWzBdKSk7IHRocmVhZCsrKSB7CgkJCXN0cnVjdCB0 aHJlYWRfdCogdGggPSAmdGhyZWFkc1t0aHJlYWRdOwoJCQlpZiAoIXRoLT5jcmVhdGVkKSB7CgkJ CQl0aC0+Y3JlYXRlZCA9IDE7CgkJCQlldmVudF9pbml0KCZ0aC0+cmVhZHkpOwoJCQkJZXZlbnRf aW5pdCgmdGgtPmRvbmUpOwoJCQkJZXZlbnRfc2V0KCZ0aC0+ZG9uZSk7CgkJCQl0aHJlYWRfc3Rh cnQodGhyLCB0aCk7CgkJCX0KCQkJaWYgKCFldmVudF9pc3NldCgmdGgtPmRvbmUpKQoJCQkJY29u dGludWU7CgkJCWV2ZW50X3Jlc2V0KCZ0aC0+ZG9uZSk7CgkJCXRoLT5jYWxsID0gY2FsbDsKCQkJ X19hdG9taWNfZmV0Y2hfYWRkKCZydW5uaW5nLCAxLCBfX0FUT01JQ19SRUxBWEVEKTsKCQkJZXZl bnRfc2V0KCZ0aC0+cmVhZHkpOwoJCQlldmVudF90aW1lZHdhaXQoJnRoLT5kb25lLCA1MCk7CgkJ CWJyZWFrOwoJCX0KCX0KCWZvciAoaSA9IDA7IGkgPCAxMDAgJiYgX19hdG9taWNfbG9hZF9uKCZy dW5uaW5nLCBfX0FUT01JQ19SRUxBWEVEKTsgaSsrKQoJCXNsZWVwX21zKDEpOwoJY2xvc2VfZmRz KCk7Cn0KCnN0YXRpYyB2b2lkIGV4ZWN1dGVfb25lKHZvaWQpOwoKI2RlZmluZSBXQUlUX0ZMQUdT IF9fV0FMTAoKc3RhdGljIHZvaWQgbG9vcCh2b2lkKQp7CglzZXR1cF9sb29wKCk7CglpbnQgaXRl ciA9IDA7Cglmb3IgKDs7IGl0ZXIrKykgewoJCWNoYXIgY3dkYnVmWzMyXTsKCQlzcHJpbnRmKGN3 ZGJ1ZiwgIi4vJWQiLCBpdGVyKTsKCQlpZiAobWtkaXIoY3dkYnVmLCAwNzc3KSkKCWV4aXQoMSk7 CgkJaW50IHBpZCA9IGZvcmsoKTsKCQlpZiAocGlkIDwgMCkKCWV4aXQoMSk7CgkJaWYgKHBpZCA9 PSAwKSB7CgkJCWlmIChjaGRpcihjd2RidWYpKQoJZXhpdCgxKTsKCQkJc2V0dXBfdGVzdCgpOwoJ CQlleGVjdXRlX29uZSgpOwoJCQlleGl0KDApOwoJCX0KCQlpbnQgc3RhdHVzID0gMDsKCQl1aW50 NjRfdCBzdGFydCA9IGN1cnJlbnRfdGltZV9tcygpOwoJCWZvciAoOzspIHsKCQkJaWYgKHdhaXRw aWQoLTEsICZzdGF0dXMsIFdOT0hBTkcgfCBXQUlUX0ZMQUdTKSA9PSBwaWQpCgkJCQlicmVhazsK CQkJc2xlZXBfbXMoMSk7CgkJCWlmIChjdXJyZW50X3RpbWVfbXMoKSAtIHN0YXJ0IDwgNTAwMCkK CQkJCWNvbnRpbnVlOwoJCQlraWxsX2FuZF93YWl0KHBpZCwgJnN0YXR1cyk7CgkJCWJyZWFrOwoJ CX0KCQlyZW1vdmVfZGlyKGN3ZGJ1Zik7CgkJY2hlY2tfbGVha3MoKTsKCX0KfQoKdWludDY0X3Qg clsxXSA9IHsweGZmZmZmZmZmZmZmZmZmZmZ9OwoKdm9pZCBleGVjdXRlX2NhbGwoaW50IGNhbGwp CnsKCQlpbnRwdHJfdCByZXMgPSAwOwoJc3dpdGNoIChjYWxsKSB7CgljYXNlIDA6CgkJTk9ORkFJ TElORyhtZW1jcHkoKHZvaWQqKTB4MjAwMDA0NDAsICIvZGV2L3ViaV9jdHJsXDAwMCIsIDE0KSk7 CgkJcmVzID0gc3lzY2FsbChfX05SX29wZW5hdCwgLypmZD0qLzB4ZmZmZmZmZmZmZmZmZmY5Y3Vs LCAvKmZpbGU9Ki8weDIwMDAwNDQwdWwsIC8qZmxhZ3M9Ki8ydWwsIC8qbW9kZT0qLzB1bCk7CgkJ aWYgKHJlcyAhPSAtMSkKCQkJCXJbMF0gPSByZXM7CgkJYnJlYWs7CgljYXNlIDE6CgkJTk9ORkFJ TElORygqKHVpbnQzMl90KikweDIwMDAwNDgwID0gMCk7CgkJTk9ORkFJTElORygqKHVpbnQzMl90 KikweDIwMDAwNDg0ID0gMCk7CgkJTk9ORkFJTElORygqKHVpbnQzMl90KikweDIwMDAwNDg4ID0g MHg3NCk7CgkJTk9ORkFJTElORygqKHVpbnQxNl90KikweDIwMDAwNDhjID0gMCk7CgkJTk9ORkFJ TElORygqKHVpbnQ4X3QqKTB4MjAwMDA0OGUgPSAwKTsKCQlOT05GQUlMSU5HKCoodWludDhfdCop MHgyMDAwMDQ4ZiA9IDApOwoJCU5PTkZBSUxJTkcobWVtY3B5KCh2b2lkKikweDIwMDAwNDkwLCAi XHgyNlx4ZDdceGE5XHhiYVx4OThceDE2XHhlZFx4NTEiLCA4KSk7CgkJaW5qZWN0X2ZhdWx0KDIx KTsKCQlzeXNjYWxsKF9fTlJfaW9jdGwsIC8qZmQ9Ki9yWzBdLCAvKmNtZD0qLzB4NDAxODZmNDAs IC8qYXJnPSovMHgyMDAwMDQ4MHVsKTsKCQlicmVhazsKCX0KCn0KaW50IG1haW4odm9pZCkKewoJ CXN5c2NhbGwoX19OUl9tbWFwLCAvKmFkZHI9Ki8weDFmZmZmMDAwdWwsIC8qbGVuPSovMHgxMDAw dWwsIC8qcHJvdD0qLzB1bCwgLypmbGFncz0qLzB4MzJ1bCwgLypmZD0qLy0xLCAvKm9mZnNldD0q LzB1bCk7CglzeXNjYWxsKF9fTlJfbW1hcCwgLyphZGRyPSovMHgyMDAwMDAwMHVsLCAvKmxlbj0q LzB4MTAwMDAwMHVsLCAvKnByb3Q9Ki83dWwsIC8qZmxhZ3M9Ki8weDMydWwsIC8qZmQ9Ki8tMSwg LypvZmZzZXQ9Ki8wdWwpOwoJc3lzY2FsbChfX05SX21tYXAsIC8qYWRkcj0qLzB4MjEwMDAwMDB1 bCwgLypsZW49Ki8weDEwMDB1bCwgLypwcm90PSovMHVsLCAvKmZsYWdzPSovMHgzMnVsLCAvKmZk PSovLTEsIC8qb2Zmc2V0PSovMHVsKTsKCXNldHVwX2Nncm91cHMoKTsKCXNldHVwX2xlYWsoKTsK CXNldHVwX2ZhdWx0KCk7CglzZXR1cF84MDIxNTQoKTsKCWluc3RhbGxfc2Vndl9oYW5kbGVyKCk7 CgkJCXVzZV90ZW1wb3JhcnlfZGlyKCk7CgkJCWRvX3NhbmRib3hfbm9uZSgpOwoJcmV0dXJuIDA7 Cn0K --0000000000006a9de8060f94e3b5 Content-Type: application/octet-stream; name="repro.prog" Content-Disposition: attachment; filename="repro.prog" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lrpt62bw1 IyB7VGhyZWFkZWQ6dHJ1ZSBSZXBlYXQ6dHJ1ZSBSZXBlYXRUaW1lczowIFByb2NzOjEgU2xvd2Rv d246MSBTYW5kYm94Om5vbmUgU2FuZGJveEFyZzowIExlYWs6dHJ1ZSBOZXRJbmplY3Rpb246dHJ1 ZSBOZXREZXZpY2VzOmZhbHNlIE5ldFJlc2V0OmZhbHNlIENncm91cHM6dHJ1ZSBCaW5mbXRNaXNj OmZhbHNlIENsb3NlRkRzOnRydWUgS0NTQU46ZmFsc2UgRGV2bGlua1BDSTpmYWxzZSBOaWNWRjpm YWxzZSBVU0I6ZmFsc2UgVmhjaUluamVjdGlvbjp0cnVlIFdpZmk6dHJ1ZSBJRUVFODAyMTU0OnRy dWUgU3lzY3RsOmZhbHNlIFN3YXA6ZmFsc2UgVXNlVG1wRGlyOnRydWUgSGFuZGxlU2Vndjp0cnVl IFJlcHJvOmZhbHNlIFRyYWNlOmZhbHNlIExlZ2FjeU9wdGlvbnM6e0NvbGxpZGU6ZmFsc2UgRmF1 bHQ6ZmFsc2UgRmF1bHRDYWxsOjAgRmF1bHROdGg6MH19CnIwID0gb3BlbmF0JEtHUFRfdWJpX2N0 cmwoMHhmZmZmZmZmZmZmZmZmZjljLCAmKDB4N2YwMDAwMDAwNDQwKSwgMHgyLCAweDApCmlvY3Rs JEtHUFRfVUJJX0lPQ0FUVChyMCwgMHg0MDE4NmY0MCwgJigweDdmMDAwMDAwMDQ4MCk9ezB4MCwg MHgwLCAweDc0LCAweDAsIDB4MCwgMHgwLCAiMjZkN2E5YmE5ODE2ZWQ1MSJ9KSAoZmFpbF9udGg6 IDIxKQo= --0000000000006a9de8060f94e3b5--