From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa4.mentor.iphmx.com (esa4.mentor.iphmx.com [68.232.137.252]) by sourceware.org (Postfix) with ESMTPS id D1B24384F01F; Thu, 19 May 2022 08:39:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D1B24384F01F Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-IronPort-AV: E=Sophos;i="5.91,237,1647331200"; d="diff'?scan'208";a="76108140" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa4.mentor.iphmx.com with ESMTP; 19 May 2022 00:39:13 -0800 IronPort-SDR: Ah8G9Ma2mx7Ckogcj7anJ7dYaDswWwJyH4wN0WLyW9HuE7m0c5AOaw6Y+CHufVCHo2bYfhSU/L pX54qe8SxTEUBiJmQnLk0UDkWlxUP+/+x8GbfGjXKoiBmtlr7j4sAG5zbanoRSLb0BBbcbs7RP /tgSPjX9FSQ2UhcSEgDTbonKaQCYgGImiWNivL/4Uxqh7jjOrb2lG2UlhNru26UMJWJMhrpMzF HQiIIvYSfOhvpNNEavD839eYeB5EadpF/vgMukQzGz4zNmC/cNGcll+5GYlenw/JLTIfAAfrJz iuM= Content-Type: multipart/mixed; boundary="------------msxAYwJuF9ftsMfE3rfFDDpF" Message-ID: Date: Thu, 19 May 2022 10:39:05 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.7.0 Subject: Re: [PATCH] OpenMP, libgomp: Add new runtime routines omp_target_memcpy_async and omp_target_memcpy_rect_async References: From: Marcel Vollweiler To: Jakub Jelinek CC: , In-Reply-To: X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-11.mgc.mentorg.com (139.181.222.11) To svr-ies-mbx-10.mgc.mentorg.com (139.181.222.10) X-Spam-Status: No, score=-13.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, NICE_REPLY_A, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: fortran@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Fortran mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 19 May 2022 08:39:21 -0000 --------------msxAYwJuF9ftsMfE3rfFDDpF Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: quoted-printable Hi Jakub, Am 17.05.2022 um 20:08 schrieb Jakub Jelinek: > On Tue, May 17, 2022 at 11:57:02AM +0200, Marcel Vollweiler wrote: >>> More importantly, I have no idea how this can work when you pass arg_si= ze 0 >>> and arg_align 0. The s variable is in the current function frame, with >>> arg_size 0 nothing is really copied to the generated task. >>> arg_size should be sizeof (memcpy_t) and arg_align __alignof__ (memcpy_= t) >>> (well, struct omp_target_memcpy_data). >> >> The copy function of GOMP_task ("cpyfn") is not used here (set to NULL) = and thus >> also arg_size and arg_align are set to 0 since they are related to cpyfn= if I >> understand it correctly. > > No, arg_size and arg_align are for all (explicit) tasks the size and > alignment of the arguments. For an included task (one executed by the > encountering thread) we indeed use data directly instead of allocating > arg_size arg_align aligned bytes and copying data to it. But when we cre= ate > a deferred task (that is the only thing that actually can be asynchronous= ), we > allocate struct gomp_task together with memory for the data (arg_size byt= es > aligned to arg_align). If cpyfn, we invoke that copy function (from sour= ce > data to the destination buffer), otherwise memcpy. cpyfn is a callback t= hat > will do memcpy for parts that need bitwise copy and copy construction / > whatever else is needed for other data. > Looking at your patch, you call GOMP_task always with if_clause =3D false= , > that means it is always included task (like with #pragma omp task if(0)), > but that also means calling GOMP_task doesn't bring any advantages and it= is > not asynchronous. > If you called it with if_clause =3D true, like what #pragma omp task woul= d do, > then the arg_size =3D 0 and arg_align =3D 0 would make it not work at all= , > so after fixing if_clause, you need to supply sizeof (s) and __alignof__ = (s). Good explanation, thanks. Changed accordingly. > >>> Also, it would be nice to avoid GOMP_task for the depobj_count =3D=3D 0= case >>> at least sometimes (but perhaps that can be done incrementally) and ins= tead >>> use some CUDA etc. asynchronous copy APIs. We don't really need to wai= t >>> for anything in that case, and from OpenMP POV all we need to make sure= is >>> that barrier/taskwait/taskgroup end will know about these "tasks" and >>> wait for them. So, it can be implemented more like #pragma omp target = nowait >>> instead of #pragma omp task that calls the synchronous omp_target_memcp= y. >>> Though, maybe that is how it should be implemented always, something li= ke >>> gomp_create_target_task and its caller. We already use that single rou= tine >>> for multiple purposes (target nowait as well as target enter/exit data >>> nowait), so just telling it somehow that it shouldn't do mapping/unmapp= ing >>> and perhaps target execution and instead copying would be nice. >> >> I dont't see/understand the advantage using gomp_create_target_task over >> GOMP_task. Whether the task waits for dependencies >> ("gomp_task_maybe_wait_for_dependencies") depends on GOMP_TASK_FLAG_DEPE= ND which >> is only set if depobj_count > 0 and depobj_list !=3D NULL. Thus, there s= houldn't >> be any waiting in case of depobj_count =3D=3D 0? Additionally, in both f= unctions a >> new thread is created - independently of dependencies. > > GOMP_task never creates a new thread. > gomp_create_target_task can create (but just once) an unshackeled thread > that runs on the side, doesn't do normal OpenMP user work and just polls = the > offloading device and performs unmapping or whatever is needed to finish = a > nowait offloaded task. > > The disadvantage of GOMP_task is: > 1) if you call say omp_target_memcpy_async from outside of parallel, it w= ill > not be actually asynchronous even if you call GOMP_task with if_claus= e =3D true > 2) if you call it from inside of parallel, it might be scheduled only whe= n > some host thread is ready for work (e.g. when reaching #pragma omp ba= rrier, > implicit barrier, #pragma omp taskwait etc.), so even when the offloa= ding > device is unused but host has lots of work to do, it might take quite= a > while before starting the work, and then one of the OpenMP host threa= ds > will be blocked waiting for the copying to be done > > gomp_create_target_task doesn't have these disadvantages, it can fire off= the > copying right away and then just needs to be able to figure out when it > finished (either the unshackeled thread polls the device, or some other w= ay > how to find out that it finished; but OpenMP certainly needs to know that= , > because user code can say #pragma omp taskwait for it, or it should be > complete at the end of a taskgroup, or at the end of #pragma omp barrier > or implicit barrier etc.). > > Anyway, I guess it is ok to use GOMP_task in the initial patch and change= it > later, but if_clause =3D false and 0, 0 for arg_{size,align} are definite= ly > wrong. Agreed. Thanks for the details. > >> +int >> +omp_target_memcpy (void *dst, const void *src, size_t length, size_t ds= t_offset, >> + size_t src_offset, int dst_device_num, int src_device_nu= m) >> +{ >> + struct gomp_device_descr *dst_devicep =3D NULL, *src_devicep =3D NULL= ; >> + int ret; >> + >> + ret =3D omp_target_memcpy_check (dst_device_num, src_device_num, &dst= _devicep, >> + &src_devicep); > > You can just use > int ret =3D omp_target_memcpy_check (dst_device_num, src_device_num, > &dst_devicep, &src_devicep); Changed. > >> +int >> +omp_target_memcpy_async (void *dst, const void *src, size_t length, >> + size_t dst_offset, size_t src_offset, >> + int dst_device_num, int src_device_num, >> + int depobj_count, omp_depend_t *depobj_list) >> +{ >> + struct gomp_device_descr *dst_devicep =3D NULL, *src_devicep =3D NULL= ; >> + void (*fn) (void *) =3D &omp_target_memcpy_async_helper; > > No need for the fn variable, just pass /*fn=3D*/omp_target_memcpy_async_h= elper > as the first argument to GOMP_task. Changed. > >> + unsigned int flags =3D 0; >> + void *data; > > No need for the data variable. > >> + void *depend[depobj_count + 5]; >> + int i; >> + int check =3D omp_target_memcpy_check (dst_device_num, src_device_num= , >> + &dst_devicep, &src_devicep); >> + >> + omp_target_memcpy_data s =3D { >> + .dst =3D dst, >> + .src =3D src, >> + .length =3D length, >> + .dst_offset =3D dst_offset, >> + .src_offset =3D src_offset, >> + .dst_devicep =3D dst_devicep, >> + .src_devicep =3D src_devicep >> + }; >> + data =3D &s; > > And the above stmt, just pass &s as the second argument. Changed. > >> + >> + if (check) >> + return check; >> + >> + depend[0] =3D 0; >> + depend[1] =3D (void *) (uintptr_t) depobj_count; >> + depend[2] =3D depend[3] =3D depend[4] =3D 0; >> + for (i =3D 0; i < depobj_count; ++i) >> + depend[i + 5] =3D &depobj_list[i]; > > This doesn't need to be done if flags will not include > GOMP_TASK_FLAG_DEPEND, so maybe better: > >> + >> + if (depobj_count > 0 && depobj_list !=3D NULL) >> + flags |=3D GOMP_TASK_FLAG_DEPEND; > > add here > else > { > depend[0] =3D 0; > ... > } Added the "depend" definition to the "if" branch (instead the "else" branch= ). > >> + >> + GOMP_task (fn, data, /*cpyfn=3D*/NULL, /*arg_size=3D*/0, /*arg_align= =3D*/0, >> + /*if_clause=3D*/false, flags, depend, /*priority_arg=3D*/0, >> + /*detach=3D*/NULL); > > Ditto for the other function. Also changed. An updated patch is attached (and tested again on x86_64-linux with nvptx a= nd amdgcn offloading without regression). Marcel ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstra=C3=9Fe 201= , 80634 M=C3=BCnchen; Gesellschaft mit beschr=C3=A4nkter Haftung; Gesch=C3= =A4ftsf=C3=BChrer: Thomas Heurung, Frank Th=C3=BCrauf; Sitz der Gesellschaf= t: M=C3=BCnchen; Registergericht M=C3=BCnchen, HRB 106955 --------------msxAYwJuF9ftsMfE3rfFDDpF Content-Type: text/plain; charset="UTF-8"; name="target-memcpy-async.diff" Content-Disposition: attachment; filename="target-memcpy-async.diff" Content-Transfer-Encoding: base64 T3Blbk1QLCBsaWJnb21wOiBBZGQgbmV3IHJ1bnRpbWUgcm91dGluZXMgb21wX3RhcmdldF9t ZW1jcHlfYXN5bmMgYW5kCm9tcF90YXJnZXRfbWVtY3B5X3JlY3RfYXN5bmMuCgpUaGlzIHBh dGNoIGFkZHMgdHdvIG5ldyBPcGVuTVAgcnVudGltZSByb3V0aW5lczogb21wX3RhcmdldF9t ZW1jcHlfYXN5bmMgYW5kCm9tcF90YXJnZXRfbWVtY3B5X3JlY3RfYXN5bmMuIEJvdGggZnVu Y3Rpb25zIGFyZSBpbnRyb2R1Y2VkIGluIE9wZW5NUCA1LjEgYXMKYXN5bmNocm9ub3VzIHZh cmlhbnRzIG9mIG9tcF90YXJnZXRfbWVtY3B5IGFuZCBvbXBfdGFyZ2V0X21lbWNweV9yZWN0 LgoKSW4gY29udHJhc3QgdG8gdGhlIHN5bmNocm9ub3VzIHZhcmlhbnRzLCB0aGUgYXN5bmNo cm9ub3VzIGZ1bmN0aW9ucyBoYXZlIHR3bwphZGRpdGlvbmFsIGZ1bmN0aW9uIHBhcmFtZXRl cnMgdG8gYWxsb3cgdGhlIHNwZWNpZmljYXRpb24gb2YgdGFzayBkZXBlbmRlbmNlczoKCglp bnQgZGVwb2JqX2NvdW50CglvbXBfZGVwZW5kX3QgKmRlcG9ial9saXN0CgoJaW50ZWdlcihj X2ludCksIHZhbHVlIDo6IGRlcG9ial9jb3VudAoJaW50ZWdlcihvbXBfZGVwZW5kX2tpbmQp LCBvcHRpb25hbCA6OiBkZXBvYmpfbGlzdCgqKQoKVGhlIGltcGxlbWVudGF0aW9uIHNwbGl0 cyB0aGUgc3luY2hyb25vdXMgZnVuY3Rpb25zIGludG8gdHdvIHBhcnRzOiAoYSkgY2hlY2sK YW5kIChiKSBjb3B5LiBUaGVuIChhKSBpcyB1c2VkIGluIHRoZSBhc3luY2hyb25vdXMgZnVu Y3Rpb25zIGZvciB0aGUgc2VxdWVudGlhbApwYXJ0LCBhbmQgdGhlIGFjdHVhbCBjb3B5IHBy b2Nlc3MgKGIpIGlzIGV4ZWN1dGVkIGluIGEgbmV3IGNyZWF0ZWQgdGFzay4gVGhlCnNlcXVl bnRpYWwgcGFydCAoYSkgdGFrZXMgaW50byBhY2NvdW50IHRoZSByZXF1aXJlbWVudHMgZm9y IHRoZSByZXR1cm4gdmFsdWVzOiAKCiJUaGUgcm91dGluZSByZXR1cm5zIHplcm8gaWYgc3Vj Y2Vzc2Z1bC4gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIGEgbm9uLXplcm8KdmFsdWUuIiAob21w X3RhcmdldF9tZW1jcHlfYXN5bmMsIE9wZW5NUCA1LjEgc3BlYywgc2VjdGlvbiAzLjguNykK CiJBbiBhcHBsaWNhdGlvbiBjYW4gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgaW5jbHVzaXZl IGRpbWVuc2lvbnMgc3VwcG9ydGVkIGJ5IGFuCmltcGxlbWVudGF0aW9uIGJ5IHBhc3Npbmcg TlVMTCBwb2ludGVycyAob3IgQ19OVUxMX1BUUiwgZm9yIEZvcnRyYW4pIGZvciBib3RoCmRz dCBhbmQgc3JjLiBUaGUgcm91dGluZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgZGltZW5zaW9u cyBzdXBwb3J0ZWQgYnkgdGhlCmltcGxlbWVudGF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGRl dmljZSBudW1iZXJzLiBObyBjb3B5IG9wZXJhdGlvbiBpcwpwZXJmb3JtZWQuIiAob21wX3Rh cmdldF9tZW1jcHlfcmVjdF9hc3luYywgT3Blbk1QIDUuMSBzcGVjLCBzZWN0aW9uIDMuOC44 KQoKRHVlIHRvIGFzeW5jaHJvbmljaXR5IGFuIGVycm9yIGlzIHRocm93biBpZiB0aGUgYXN5 bmNocm9ub3VzIG1lbWNweSBpcyBub3QKc3VjY2Vzc2Z1bCAoaW4gY29udHJhc3QgdG8gdGhl IHN5bmNocm9ub3VzIGZ1bmN0aW9ucyB3aGljaCB1c2UgYSByZXR1cm4KdmFsdWUgdW5lcXVh bCB0byB6ZXJvKS4KCmdjYy9DaGFuZ2VMb2c6CgoJKiBvbXAtbG93LmNjIChvbXBfcnVudGlt ZV9hcGlfY2FsbCk6IEFkZGVkIHRhcmdldF9tZW1jcHlfYXN5bmMgYW5kCgl0YXJnZXRfbWVt Y3B5X3JlY3RfYXN5bmMgdG8gb21wX3J1bnRpbWVfYXBpcyBhcnJheS4KCmxpYmdvbXAvQ2hh bmdlTG9nOgoKCSogbGliZ29tcC5tYXA6IEFkZGVkIG9tcF90YXJnZXRfbWVtY3B5X2FzeW5j IGFuZAoJb21wX3RhcmdldF9tZW1jcHlfcmVjdF9hc3luYy4KCSogbGliZ29tcC50ZXhpOiBC b3RoIGZ1bmN0aW9ucyBhcmUgbm93IHN1cHBvcnRlZC4KCSogb21wLmguaW46IEFkZGVkIG9t cF90YXJnZXRfbWVtY3B5X2FzeW5jIGFuZAoJb21wX3RhcmdldF9tZW1jcHlfcmVjdF9hc3lu Yy4KCSogb21wX2xpYi5mOTAuaW46IEFkZGVkIGludGVyZmFjZXMgZm9yIGJvdGggbmV3IGZ1 bmN0aW9ucy4KCSogb21wX2xpYi5oLmluOiBMaWtld2lzZS4KCSogdGFyZ2V0LmMgKGlhbGlh c19yZWRpcmVjdCk6IEFkZGVkIGZvciBHT01QX3Rhc2suCgkob21wX3RhcmdldF9tZW1jcHkp OiBSZXN0cnVjdHVyZWQgaW50byBjaGVjayBhbmQgY29weSBwYXJ0LgoJKG9tcF90YXJnZXRf bWVtY3B5X2NoZWNrKTogTmV3IGhlbHBlciBmdW5jdGlvbiBmb3Igb21wX3RhcmdldF9tZW1j cHkgYW5kCglvbXBfdGFyZ2V0X21lbWNweV9hc3luYyB0aGF0IGNoZWNrcyByZXF1aXJlbWVu dHMuCgkob21wX3RhcmdldF9tZW1jcHlfY29weSk6IE5ldyBoZWxwZXIgZnVuY3Rpb24gZm9y IG9tcF90YXJnZXRfbWVtY3B5IGFuZAoJb21wX3RhcmdldF9tZW1jcHlfYXN5bmMgdGhhdCBw ZXJmb3JtcyB0aGUgbWVtY3B5LgoJKG9tcF90YXJnZXRfbWVtY3B5X2FzeW5jX2hlbHBlcik6 IE5ldyBoZWxwZXIgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIGluCglvbXBfdGFyZ2V0X21lbWNw eV9hc3luYyBmb3IgdGhlIGFzeW5jaHJvbm91cyB0YXNrLgoJKG9tcF90YXJnZXRfbWVtY3B5 X2FzeW5jKTogQWRkZWQuCgkob21wX3RhcmdldF9tZW1jcHlfcmVjdCk6IFJlc3RydWN0dXJl ZCBpbnRvIGNoZWNrIGFuZCBjb3B5IHBhcnQuCgkob21wX3RhcmdldF9tZW1jcHlfcmVjdF9j aGVjayk6IE5ldyBoZWxwZXIgZnVuY3Rpb24gZm9yCglvbXBfdGFyZ2V0X21lbWNweV9yZWN0 IGFuZCBvbXBfdGFyZ2V0X21lbWNweV9yZWN0X2FzeW5jIHRoYXQgY2hlY2tzCglyZXF1aXJl bWVudHMuCgkob21wX3RhcmdldF9tZW1jcHlfcmVjdF9jb3B5KTogTmV3IGhlbHBlciBmdW5j dGlvbiBmb3IKCW9tcF90YXJnZXRfbWVtY3B5X3JlY3QgYW5kIG9tcF90YXJnZXRfbWVtY3B5 X3JlY3RfYXN5bmMgdGhhdCBwZXJmb3JtcwoJdGhlIG1lbWNweS4KCShvbXBfdGFyZ2V0X21l bWNweV9yZWN0X2FzeW5jX2hlbHBlcik6IE5ldyBoZWxwZXIgZnVuY3Rpb24gdGhhdCBpcyB1 c2VkCglpbiBvbXBfdGFyZ2V0X21lbWNweV9yZWN0X2FzeW5jIGZvciB0aGUgYXN5bmNocm9u b3VzIHRhc2suCgkob21wX3RhcmdldF9tZW1jcHlfcmVjdF9hc3luYyk6IEFkZGVkLgoJKiB0 YXNrLmMgKGlhbGlhcyk6IEFkZGVkIGZvciBHT01QX3Rhc2suCgkqIHRlc3RzdWl0ZS9saWJn b21wLmMtYysrLWNvbW1vbi90YXJnZXQtbWVtY3B5LWFzeW5jLTEuYzogTmV3IHRlc3QuCgkq IHRlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi90YXJnZXQtbWVtY3B5LWFzeW5jLTIu YzogTmV3IHRlc3QuCgkqIHRlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi90YXJnZXQt bWVtY3B5LXJlY3QtYXN5bmMtMS5jOiBOZXcgdGVzdC4KCSogdGVzdHN1aXRlL2xpYmdvbXAu Yy1jKystY29tbW9uL3RhcmdldC1tZW1jcHktcmVjdC1hc3luYy0yLmM6IE5ldyB0ZXN0LgoJ KiB0ZXN0c3VpdGUvbGliZ29tcC5mb3J0cmFuL3RhcmdldC1tZW1jcHktYXN5bmMtMS5mOTA6 IE5ldyB0ZXN0LgoJKiB0ZXN0c3VpdGUvbGliZ29tcC5mb3J0cmFuL3RhcmdldC1tZW1jcHkt YXN5bmMtMi5mOTA6IE5ldyB0ZXN0LgoJKiB0ZXN0c3VpdGUvbGliZ29tcC5mb3J0cmFuL3Rh cmdldC1tZW1jcHktcmVjdC1hc3luYy0xLmY5MDogTmV3IHRlc3QuCgkqIHRlc3RzdWl0ZS9s aWJnb21wLmZvcnRyYW4vdGFyZ2V0LW1lbWNweS1yZWN0LWFzeW5jLTIuZjkwOiBOZXcgdGVz dC4KCmRpZmYgLS1naXQgYS9nY2Mvb21wLWxvdy5jYyBiL2djYy9vbXAtbG93LmNjCmluZGV4 IDRjNTI4ODYuLjM2ODJjNGMgMTAwNjQ0Ci0tLSBhL2djYy9vbXAtbG93LmNjCisrKyBiL2dj Yy9vbXAtbG93LmNjCkBAIC0zOTkwLDcgKzM5OTAsOSBAQCBvbXBfcnVudGltZV9hcGlfY2Fs bCAoY29uc3RfdHJlZSBmbmRlY2wpCiAgICAgICAidGFyZ2V0X2ZyZWUiLAogICAgICAgInRh cmdldF9pc19wcmVzZW50IiwKICAgICAgICJ0YXJnZXRfbWVtY3B5IiwKKyAgICAgICJ0YXJn ZXRfbWVtY3B5X2FzeW5jIiwKICAgICAgICJ0YXJnZXRfbWVtY3B5X3JlY3QiLAorICAgICAg InRhcmdldF9tZW1jcHlfcmVjdF9hc3luYyIsCiAgICAgICBOVUxMLAogICAgICAgLyogTm93 IG9tcF8qIGNhbGxzIHRoYXQgYXJlIGF2YWlsYWJsZSBhcyBvbXBfKiBhbmQgb21wXypfOyBo b3dldmVyLCB0aGUKIAkgREVDTF9OQU1FIGlzIGFsd2F5cyBvbXBfKiB3aXRob3V0IHRhaWxp bmcgdW5kZXJzY29yZS4gICovCmRpZmYgLS1naXQgYS9saWJnb21wL2xpYmdvbXAubWFwIGIv bGliZ29tcC9saWJnb21wLm1hcAppbmRleCA2MDhhNTRjLi5mZDNjMTVlIDEwMDY0NAotLS0g YS9saWJnb21wL2xpYmdvbXAubWFwCisrKyBiL2xpYmdvbXAvbGliZ29tcC5tYXAKQEAgLTIy OSw2ICsyMjksOCBAQCBPTVBfNS4xIHsKIE9NUF81LjEuMSB7CiAgIGdsb2JhbDoKIAlvbXBf Z2V0X21hcHBlZF9wdHI7CisJb21wX3RhcmdldF9tZW1jcHlfYXN5bmM7CisJb21wX3Rhcmdl dF9tZW1jcHlfcmVjdF9hc3luYzsKIH0gT01QXzUuMTsKIAogR09NUF8xLjAgewpkaWZmIC0t Z2l0IGEvbGliZ29tcC9saWJnb21wLnRleGkgYi9saWJnb21wL2xpYmdvbXAudGV4aQppbmRl eCAzOGUwMzM3Li45MzIyMzAxIDEwMDY0NAotLS0gYS9saWJnb21wL2xpYmdvbXAudGV4aQor KysgYi9saWJnb21wL2xpYmdvbXAudGV4aQpAQCAtMzEzLDcgKzMxMyw3IEBAIFRoZSBPcGVu TVAgNC41IHNwZWNpZmljYXRpb24gaXMgZnVsbHkgc3VwcG9ydGVkLgogICAgICAgcm91dGlu ZXMgQHRhYiBZIEB0YWIKIEBpdGVtIEBjb2Rle29tcF90YXJnZXRfaXNfYWNjZXNzaWJsZX0g cnVudGltZSByb3V0aW5lIEB0YWIgTiBAdGFiCiBAaXRlbSBAY29kZXtvbXBfdGFyZ2V0X21l bWNweV9hc3luY30gYW5kIEBjb2Rle29tcF90YXJnZXRfbWVtY3B5X3JlY3RfYXN5bmN9Ci0g ICAgICBydW50aW1lIHJvdXRpbmVzIEB0YWIgTiBAdGFiCisgICAgICBydW50aW1lIHJvdXRp bmVzIEB0YWIgWSBAdGFiCiBAaXRlbSBAY29kZXtvbXBfZ2V0X21hcHBlZF9wdHJ9IHJ1bnRp bWUgcm91dGluZSBAdGFiIFkgQHRhYgogQGl0ZW0gQGNvZGV7b21wX2NhbGxvY30sIEBjb2Rl e29tcF9yZWFsbG9jfSwgQGNvZGV7b21wX2FsaWduZWRfYWxsb2N9IGFuZAogICAgICAgQGNv ZGV7b21wX2FsaWduZWRfY2FsbG9jfSBydW50aW1lIHJvdXRpbmVzIEB0YWIgWSBAdGFiCmRp ZmYgLS1naXQgYS9saWJnb21wL29tcC5oLmluIGIvbGliZ29tcC9vbXAuaC5pbgppbmRleCAx OGQwMTUyLi5jZjkzYzk3IDEwMDY0NAotLS0gYS9saWJnb21wL29tcC5oLmluCisrKyBiL2xp YmdvbXAvb21wLmguaW4KQEAgLTI3Miw2ICsyNzIsMTAgQEAgZXh0ZXJuIGludCBvbXBfdGFy Z2V0X2lzX3ByZXNlbnQgKGNvbnN0IHZvaWQgKiwgaW50KSBfX0dPTVBfTk9USFJPVzsKIGV4 dGVybiBpbnQgb21wX3RhcmdldF9tZW1jcHkgKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBfX1NJ WkVfVFlQRV9fLAogCQkJICAgICAgX19TSVpFX1RZUEVfXywgX19TSVpFX1RZUEVfXywgaW50 LCBpbnQpCiAgIF9fR09NUF9OT1RIUk9XOworZXh0ZXJuIGludCBvbXBfdGFyZ2V0X21lbWNw eV9hc3luYyAodm9pZCAqLCBjb25zdCB2b2lkICosIF9fU0laRV9UWVBFX18sCisJCQkJICAg IF9fU0laRV9UWVBFX18sIF9fU0laRV9UWVBFX18sIGludCwgaW50LAorCQkJCSAgICBpbnQs IG9tcF9kZXBlbmRfdCAqKQorICBfX0dPTVBfTk9USFJPVzsKIGV4dGVybiBpbnQgb21wX3Rh cmdldF9tZW1jcHlfcmVjdCAodm9pZCAqLCBjb25zdCB2b2lkICosIF9fU0laRV9UWVBFX18s IGludCwKIAkJCQkgICBjb25zdCBfX1NJWkVfVFlQRV9fICosCiAJCQkJICAgY29uc3QgX19T SVpFX1RZUEVfXyAqLApAQCAtMjc5LDYgKzI4MywxNCBAQCBleHRlcm4gaW50IG9tcF90YXJn ZXRfbWVtY3B5X3JlY3QgKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBfX1NJWkVfVFlQRV9fLCBp bnQsCiAJCQkJICAgY29uc3QgX19TSVpFX1RZUEVfXyAqLAogCQkJCSAgIGNvbnN0IF9fU0la RV9UWVBFX18gKiwgaW50LCBpbnQpCiAgIF9fR09NUF9OT1RIUk9XOworZXh0ZXJuIGludCBv bXBfdGFyZ2V0X21lbWNweV9yZWN0X2FzeW5jICh2b2lkICosIGNvbnN0IHZvaWQgKiwgX19T SVpFX1RZUEVfXywKKwkJCQkJIGludCwgY29uc3QgX19TSVpFX1RZUEVfXyAqLAorCQkJCQkg Y29uc3QgX19TSVpFX1RZUEVfXyAqLAorCQkJCQkgY29uc3QgX19TSVpFX1RZUEVfXyAqLAor CQkJCQkgY29uc3QgX19TSVpFX1RZUEVfXyAqLAorCQkJCQkgY29uc3QgX19TSVpFX1RZUEVf XyAqLCBpbnQsIGludCwgaW50LAorCQkJCQkgb21wX2RlcGVuZF90ICopCisgIF9fR09NUF9O T1RIUk9XOwogZXh0ZXJuIGludCBvbXBfdGFyZ2V0X2Fzc29jaWF0ZV9wdHIgKGNvbnN0IHZv aWQgKiwgY29uc3Qgdm9pZCAqLCBfX1NJWkVfVFlQRV9fLAogCQkJCSAgICAgX19TSVpFX1RZ UEVfXywgaW50KSBfX0dPTVBfTk9USFJPVzsKIGV4dGVybiBpbnQgb21wX3RhcmdldF9kaXNh c3NvY2lhdGVfcHRyIChjb25zdCB2b2lkICosIGludCkgX19HT01QX05PVEhST1c7CmRpZmYg LS1naXQgYS9saWJnb21wL29tcF9saWIuZjkwLmluIGIvbGliZ29tcC9vbXBfbGliLmY5MC5p bgppbmRleCA1MDZmMTVjLi4zOGU0MjFjIDEwMDY0NAotLS0gYS9saWJnb21wL29tcF9saWIu ZjkwLmluCisrKyBiL2xpYmdvbXAvb21wX2xpYi5mOTAuaW4KQEAgLTc5OSw2ICs3OTksMjIg QEAKICAgICAgICAgZW5kIGludGVyZmFjZQogCiAgICAgICAgIGludGVyZmFjZQorICAgICAg ICAgIGZ1bmN0aW9uIG9tcF90YXJnZXRfbWVtY3B5X2FzeW5jIChkc3QsIHNyYywgbGVuZ3Ro LCBkc3Rfb2Zmc2V0LCAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHNyY19vZmZzZXQsIGRzdF9kZXZpY2VfbnVtLCAmCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19kZXZpY2VfbnVtLCBkZXBvYmpfY291 bnQsICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVw b2JqX2xpc3QpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19j X2JpbmRpbmcsIG9ubHkgOiBjX3B0ciwgY19pbnQsIGNfc2l6ZV90CisgICAgICAgICAgICBp bXBvcnQgOjogb21wX2RlcGVuZF9raW5kCisgICAgICAgICAgICBpbnRlZ2VyKGNfaW50KSA6 OiBvbXBfdGFyZ2V0X21lbWNweV9hc3luYworICAgICAgICAgICAgdHlwZShjX3B0ciksIHZh bHVlIDo6IGRzdCwgc3JjCisgICAgICAgICAgICBpbnRlZ2VyKGNfc2l6ZV90KSwgdmFsdWUg OjogbGVuZ3RoLCBkc3Rfb2Zmc2V0LCBzcmNfb2Zmc2V0CisgICAgICAgICAgICBpbnRlZ2Vy KGNfaW50KSwgdmFsdWUgOjogZHN0X2RldmljZV9udW0sIHNyY19kZXZpY2VfbnVtLCAmCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwb2JqX2NvdW50CisgICAg ICAgICAgICBpbnRlZ2VyKG9tcF9kZXBlbmRfa2luZCksIG9wdGlvbmFsIDo6IGRlcG9ial9s aXN0KCopCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90YXJnZXRfbWVtY3B5X2FzeW5j CisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworICAgICAgICBpbnRlcmZhY2UKICAgICAgICAg ICBmdW5jdGlvbiBvbXBfdGFyZ2V0X21lbWNweV9yZWN0IChkc3Qsc3JjLGVsZW1lbnRfc2l6 ZSwgbnVtX2RpbXMsICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB2b2x1bWUsIGRzdF9vZmZzZXRzLCBzcmNfb2Zmc2V0cywgJgogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kaW1lbnNpb25zLCBzcmNfZGlt ZW5zaW9ucywgJgpAQCAtODE2LDYgKzgzMiwzMCBAQAogICAgICAgICBlbmQgaW50ZXJmYWNl CiAKICAgICAgICAgaW50ZXJmYWNlCisgICAgICAgICAgZnVuY3Rpb24gb21wX3RhcmdldF9t ZW1jcHlfcmVjdF9hc3luYyAoZHN0LHNyYyxlbGVtZW50X3NpemUsICAgICAmCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2RpbXMsIHZv bHVtZSwgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZHN0X29mZnNldHMsIHNyY19vZmZzZXRzLCAmCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RpbWVuc2lvbnMsICAg ICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgc3JjX2RpbWVuc2lvbnMsICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RldmljZV9udW0sICAgICAgICAg ICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3JjX2RldmljZV9udW0sICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZGVwb2JqX2NvdW50LCAgICAgICAgICAgICAmCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwb2Jq X2xpc3QpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2Jp bmRpbmcsIG9ubHkgOiBjX3B0ciwgY19pbnQsIGNfc2l6ZV90CisgICAgICAgICAgICBpbXBv cnQgOjogb21wX2RlcGVuZF9raW5kCisgICAgICAgICAgICBpbnRlZ2VyKGNfaW50KSA6OiBv bXBfdGFyZ2V0X21lbWNweV9yZWN0X2FzeW5jCisgICAgICAgICAgICB0eXBlKGNfcHRyKSwg dmFsdWUgOjogZHN0LCBzcmMKKyAgICAgICAgICAgIGludGVnZXIoY19zaXplX3QpLCB2YWx1 ZSA6OiBlbGVtZW50X3NpemUKKyAgICAgICAgICAgIGludGVnZXIoY19pbnQpLCB2YWx1ZSA6 OiBudW1fZGltcywgZHN0X2RldmljZV9udW0sIHNyY19kZXZpY2VfbnVtLCAmCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwb2JqX2NvdW50CisgICAgICAgICAg ICBpbnRlZ2VyKGNfc2l6ZV90KSwgaW50ZW50KGluKSA6OiB2b2x1bWUoKiksIGRzdF9vZmZz ZXRzKCopLCAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgc3JjX29mZnNldHMoKiksIGRzdF9kaW1lbnNpb25zKCopLCAmCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZGltZW5zaW9ucygqKQorICAg ICAgICAgICAgaW50ZWdlcihvbXBfZGVwZW5kX2tpbmQpLCBvcHRpb25hbCA6OiBkZXBvYmpf bGlzdCgqKQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGFyZ2V0X21lbWNweV9yZWN0 X2FzeW5jCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworICAgICAgICBpbnRlcmZhY2UKICAg ICAgICAgICBmdW5jdGlvbiBvbXBfdGFyZ2V0X2Fzc29jaWF0ZV9wdHIgKGhvc3RfcHRyLCBk ZXZpY2VfcHRyLCBzaXplLCAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBkZXZpY2Vfb2Zmc2V0LCBkZXZpY2VfbnVtKSBiaW5kKGMpCiAgICAgICAg ICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nLCBvbmx5IDogY19wdHIsIGNf c2l6ZV90LCBjX2ludApkaWZmIC0tZ2l0IGEvbGliZ29tcC9vbXBfbGliLmguaW4gYi9saWJn b21wL29tcF9saWIuaC5pbgppbmRleCAwZjQ4NTEwLi43YjgwNThiIDEwMDY0NAotLS0gYS9s aWJnb21wL29tcF9saWIuaC5pbgorKysgYi9saWJnb21wL29tcF9saWIuaC5pbgpAQCAtMzc4 LDYgKzM3OCwyMiBAQAogICAgICAgZW5kIGludGVyZmFjZQogCiAgICAgICBpbnRlcmZhY2UK KyAgICAgICAgZnVuY3Rpb24gb21wX3RhcmdldF9tZW1jcHlfYXN5bmMgKGRzdCwgc3JjLCBs ZW5ndGgsIGRzdF9vZmZzZXQsICAgICYKKyAgICAgJiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHNyY19vZmZzZXQsIGRzdF9kZXZpY2VfbnVtLCAgICAgICAgICAgICYKKyAgICAg JiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19kZXZpY2VfbnVtLCBkZXBvYmpf Y291bnQsICAgICAgICAgICYKKyAgICAgJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGRlcG9ial9saXN0KSBiaW5kKGMpCisgICAgICAgICAgdXNlLCBpbnRyaW5zaWMgOjogaXNv X2NfYmluZGluZywgb25seSA6IGNfcHRyLCBjX2ludCwgY19zaXplX3QKKyAgICAgICAgICBp bXBvcnQgOjogb21wX2RlcGVuZF9raW5kCisgICAgICAgICAgaW50ZWdlcihjX2ludCkgOjog b21wX3RhcmdldF9tZW1jcHlfYXN5bmMKKyAgICAgICAgICB0eXBlKGNfcHRyKSwgdmFsdWUg OjogZHN0LCBzcmMKKyAgICAgICAgICBpbnRlZ2VyKGNfc2l6ZV90KSwgdmFsdWUgOjogbGVu Z3RoLCBkc3Rfb2Zmc2V0LCBzcmNfb2Zmc2V0CisgICAgICAgICAgaW50ZWdlcihjX2ludCks IHZhbHVlIDo6IGRzdF9kZXZpY2VfbnVtLCBzcmNfZGV2aWNlX251bQorICAgICAgICAgIGlu dGVnZXIoY19pbnQpLCB2YWx1ZSA6OiBkZXBvYmpfY291bnQKKyAgICAgICAgICBpbnRlZ2Vy KG9tcF9kZXBlbmRfa2luZCksIG9wdGlvbmFsIDo6IGRlcG9ial9saXN0KCopCisgICAgICAg IGVuZCBmdW5jdGlvbiBvbXBfdGFyZ2V0X21lbWNweV9hc3luYworICAgICAgZW5kIGludGVy ZmFjZQorCisgICAgICBpbnRlcmZhY2UKICAgICAgICAgZnVuY3Rpb24gb21wX3RhcmdldF9t ZW1jcHlfcmVjdCAoZHN0LHNyYyxlbGVtZW50X3NpemUsIG51bV9kaW1zLCAgICYKICAgICAg JiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lLCBkc3Rfb2Zmc2V0 cywgICAgICAgICAgICAgICYKICAgICAgJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgc3JjX29mZnNldHMsIGRzdF9kaW1lbnNpb25zLCAgICAgICYKQEAgLTM5Nyw2ICs0 MTMsMzEgQEAKICAgICAgIGVuZCBpbnRlcmZhY2UKIAogICAgICAgaW50ZXJmYWNlCisgICAg ICAgIGZ1bmN0aW9uIG9tcF90YXJnZXRfbWVtY3B5X3JlY3RfYXN5bmMgKGRzdCxzcmMsZWxl bWVudF9zaXplLCAgICAgICAgJgorICAgICAmICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBudW1fZGltcywgdm9sdW1lLCAgICAgICAgICAgICYKKyAgICAgJiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X29mZnNldHMsIHNy Y19vZmZzZXRzLCAgICAmCisgICAgICYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGRzdF9kaW1lbnNpb25zLCAgICAgICAgICAgICAgJgorICAgICAmICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZGltZW5zaW9ucywgICAg ICAgICAgICAgICYKKyAgICAgJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgZHN0X2RldmljZV9udW0sICAgICAgICAgICAgICAmCisgICAgICYgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19kZXZpY2VfbnVtLCAgICAgICAg ICAgICAgJgorICAgICAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBkZXBvYmpfY291bnQsICAgICAgICAgICAgICAgICYKKyAgICAgJiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwb2JqX2xpc3QpIGJpbmQoYykKKyAgICAg ICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nLCBvbmx5IDogY19wdHIsIGNf aW50LCBjX3NpemVfdAorICAgICAgICAgIGltcG9ydCA6OiBvbXBfZGVwZW5kX2tpbmQKKyAg ICAgICAgICBpbnRlZ2VyKGNfaW50KSA6OiBvbXBfdGFyZ2V0X21lbWNweV9yZWN0X2FzeW5j CisgICAgICAgICAgdHlwZShjX3B0ciksIHZhbHVlIDo6IGRzdCwgc3JjCisgICAgICAgICAg aW50ZWdlcihjX3NpemVfdCksIHZhbHVlIDo6IGVsZW1lbnRfc2l6ZQorICAgICAgICAgIGlu dGVnZXIoY19pbnQpLCB2YWx1ZSA6OiBudW1fZGltcywgZGVwb2JqX2NvdW50CisgICAgICAg ICAgaW50ZWdlcihjX2ludCksIHZhbHVlIDo6IGRzdF9kZXZpY2VfbnVtLCBzcmNfZGV2aWNl X251bQorICAgICAgICAgIGludGVnZXIoY19zaXplX3QpLCBpbnRlbnQoaW4pIDo6IHZvbHVt ZSgqKSwgZHN0X29mZnNldHMoKikKKyAgICAgICAgICBpbnRlZ2VyKGNfc2l6ZV90KSwgaW50 ZW50KGluKSA6OiBzcmNfb2Zmc2V0cygqKQorICAgICAgICAgIGludGVnZXIoY19zaXplX3Qp LCBpbnRlbnQoaW4pIDo6IGRzdF9kaW1lbnNpb25zKCopCisgICAgICAgICAgaW50ZWdlcihj X3NpemVfdCksIGludGVudChpbikgOjogc3JjX2RpbWVuc2lvbnMoKikKKyAgICAgICAgICBp bnRlZ2VyKG9tcF9kZXBlbmRfa2luZCksIG9wdGlvbmFsIDo6IGRlcG9ial9saXN0KCopCisg ICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGFyZ2V0X21lbWNweV9yZWN0X2FzeW5jCisgICAg ICBlbmQgaW50ZXJmYWNlCisKKyAgICAgIGludGVyZmFjZQogICAgICAgICBmdW5jdGlvbiBv bXBfdGFyZ2V0X2Fzc29jaWF0ZV9wdHIgKGhvc3RfcHRyLCBkZXZpY2VfcHRyLCBzaXplLCAg ICAgJgogICAgICAmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmlj ZV9vZmZzZXQsIGRldmljZV9udW0pICAgICAgJgogICAgICAmICAgICAgYmluZChjKQpkaWZm IC0tZ2l0IGEvbGliZ29tcC90YXJnZXQuYyBiL2xpYmdvbXAvdGFyZ2V0LmMKaW5kZXggODY5 MzBlYS4uMWM0Y2Y1OSAxMDA2NDQKLS0tIGEvbGliZ29tcC90YXJnZXQuYworKysgYi9saWJn b21wL3RhcmdldC5jCkBAIC00OSw2ICs0OSw4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqIGh0 YWJfYWxsb2MgKHNpemVfdCBzaXplKSB7IHJldHVybiBnb21wX21hbGxvYyAoc2l6ZSk7IH0K IHN0YXRpYyBpbmxpbmUgdm9pZCBodGFiX2ZyZWUgKHZvaWQgKnB0cikgeyBmcmVlIChwdHIp OyB9CiAjaW5jbHVkZSAiaGFzaHRhYi5oIgogCitpYWxpYXNfcmVkaXJlY3QgKEdPTVBfdGFz aykKKwogc3RhdGljIGlubGluZSBoYXNodmFsX3QKIGh0YWJfaGFzaCAoaGFzaF9lbnRyeV90 eXBlIGVsZW1lbnQpCiB7CkBAIC0zMzU1LDQwICszMzU3LDQ5IEBAIG9tcF90YXJnZXRfaXNf cHJlc2VudCAoY29uc3Qgdm9pZCAqcHRyLCBpbnQgZGV2aWNlX251bSkKICAgcmV0dXJuIHJl dDsKIH0KIAotaW50Ci1vbXBfdGFyZ2V0X21lbWNweSAodm9pZCAqZHN0LCBjb25zdCB2b2lk ICpzcmMsIHNpemVfdCBsZW5ndGgsCi0JCSAgIHNpemVfdCBkc3Rfb2Zmc2V0LCBzaXplX3Qg c3JjX29mZnNldCwgaW50IGRzdF9kZXZpY2VfbnVtLAotCQkgICBpbnQgc3JjX2RldmljZV9u dW0pCitzdGF0aWMgaW50CitvbXBfdGFyZ2V0X21lbWNweV9jaGVjayAoaW50IGRzdF9kZXZp Y2VfbnVtLCBpbnQgc3JjX2RldmljZV9udW0sCisJCQkgc3RydWN0IGdvbXBfZGV2aWNlX2Rl c2NyICoqZHN0X2RldmljZXAsCisJCQkgc3RydWN0IGdvbXBfZGV2aWNlX2Rlc2NyICoqc3Jj X2RldmljZXApCiB7Ci0gIHN0cnVjdCBnb21wX2RldmljZV9kZXNjciAqZHN0X2RldmljZXAg PSBOVUxMLCAqc3JjX2RldmljZXAgPSBOVUxMOwotICBib29sIHJldDsKLQogICBpZiAoZHN0 X2RldmljZV9udW0gIT0gZ29tcF9nZXRfbnVtX2RldmljZXMgKCkpCiAgICAgewogICAgICAg aWYgKGRzdF9kZXZpY2VfbnVtIDwgMCkKIAlyZXR1cm4gRUlOVkFMOwogCi0gICAgICBkc3Rf ZGV2aWNlcCA9IHJlc29sdmVfZGV2aWNlIChkc3RfZGV2aWNlX251bSk7Ci0gICAgICBpZiAo ZHN0X2RldmljZXAgPT0gTlVMTCkKKyAgICAgICpkc3RfZGV2aWNlcCA9IHJlc29sdmVfZGV2 aWNlIChkc3RfZGV2aWNlX251bSk7CisgICAgICBpZiAoKmRzdF9kZXZpY2VwID09IE5VTEwp CiAJcmV0dXJuIEVJTlZBTDsKIAotICAgICAgaWYgKCEoZHN0X2RldmljZXAtPmNhcGFiaWxp dGllcyAmIEdPTVBfT0ZGTE9BRF9DQVBfT1BFTk1QXzQwMCkKLQkgIHx8IGRzdF9kZXZpY2Vw LT5jYXBhYmlsaXRpZXMgJiBHT01QX09GRkxPQURfQ0FQX1NIQVJFRF9NRU0pCi0JZHN0X2Rl dmljZXAgPSBOVUxMOworICAgICAgaWYgKCEoKCpkc3RfZGV2aWNlcCktPmNhcGFiaWxpdGll cyAmIEdPTVBfT0ZGTE9BRF9DQVBfT1BFTk1QXzQwMCkKKwkgIHx8ICgqZHN0X2RldmljZXAp LT5jYXBhYmlsaXRpZXMgJiBHT01QX09GRkxPQURfQ0FQX1NIQVJFRF9NRU0pCisJKmRzdF9k ZXZpY2VwID0gTlVMTDsKICAgICB9CisKICAgaWYgKHNyY19kZXZpY2VfbnVtICE9IG51bV9k ZXZpY2VzX29wZW5tcCkKICAgICB7CiAgICAgICBpZiAoc3JjX2RldmljZV9udW0gPCAwKQog CXJldHVybiBFSU5WQUw7CiAKLSAgICAgIHNyY19kZXZpY2VwID0gcmVzb2x2ZV9kZXZpY2Ug KHNyY19kZXZpY2VfbnVtKTsKLSAgICAgIGlmIChzcmNfZGV2aWNlcCA9PSBOVUxMKQorICAg ICAgKnNyY19kZXZpY2VwID0gcmVzb2x2ZV9kZXZpY2UgKHNyY19kZXZpY2VfbnVtKTsKKyAg ICAgIGlmICgqc3JjX2RldmljZXAgPT0gTlVMTCkKIAlyZXR1cm4gRUlOVkFMOwogCi0gICAg ICBpZiAoIShzcmNfZGV2aWNlcC0+Y2FwYWJpbGl0aWVzICYgR09NUF9PRkZMT0FEX0NBUF9P UEVOTVBfNDAwKQotCSAgfHwgc3JjX2RldmljZXAtPmNhcGFiaWxpdGllcyAmIEdPTVBfT0ZG TE9BRF9DQVBfU0hBUkVEX01FTSkKLQlzcmNfZGV2aWNlcCA9IE5VTEw7CisgICAgICBpZiAo ISgoKnNyY19kZXZpY2VwKS0+Y2FwYWJpbGl0aWVzICYgR09NUF9PRkZMT0FEX0NBUF9PUEVO TVBfNDAwKQorCSAgfHwgKCpzcmNfZGV2aWNlcCktPmNhcGFiaWxpdGllcyAmIEdPTVBfT0ZG TE9BRF9DQVBfU0hBUkVEX01FTSkKKwkqc3JjX2RldmljZXAgPSBOVUxMOwogICAgIH0KKwor ICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorb21wX3RhcmdldF9tZW1jcHlfY29weSAo dm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW5ndGgsCisJCQlzaXplX3Qg ZHN0X29mZnNldCwgc2l6ZV90IHNyY19vZmZzZXQsCisJCQlzdHJ1Y3QgZ29tcF9kZXZpY2Vf ZGVzY3IgKmRzdF9kZXZpY2VwLAorCQkJc3RydWN0IGdvbXBfZGV2aWNlX2Rlc2NyICpzcmNf ZGV2aWNlcCkKK3sKKyAgYm9vbCByZXQ7CiAgIGlmIChzcmNfZGV2aWNlcCA9PSBOVUxMICYm IGRzdF9kZXZpY2VwID09IE5VTEwpCiAgICAgewogICAgICAgbWVtY3B5ICgoY2hhciAqKSBk c3QgKyBkc3Rfb2Zmc2V0LCAoY2hhciAqKSBzcmMgKyBzcmNfb2Zmc2V0LCBsZW5ndGgpOwpA QCAtMzQyNCw2ICszNDM1LDg1IEBAIG9tcF90YXJnZXRfbWVtY3B5ICh2b2lkICpkc3QsIGNv bnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbmd0aCwKICAgcmV0dXJuIEVJTlZBTDsKIH0KIAor aW50CitvbXBfdGFyZ2V0X21lbWNweSAodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNp emVfdCBsZW5ndGgsIHNpemVfdCBkc3Rfb2Zmc2V0LAorCQkgICBzaXplX3Qgc3JjX29mZnNl dCwgaW50IGRzdF9kZXZpY2VfbnVtLCBpbnQgc3JjX2RldmljZV9udW0pCit7CisgIHN0cnVj dCBnb21wX2RldmljZV9kZXNjciAqZHN0X2RldmljZXAgPSBOVUxMLCAqc3JjX2RldmljZXAg PSBOVUxMOworICBpbnQgcmV0ID0gb21wX3RhcmdldF9tZW1jcHlfY2hlY2sgKGRzdF9kZXZp Y2VfbnVtLCBzcmNfZGV2aWNlX251bSwKKwkJCQkgICAgICZkc3RfZGV2aWNlcCwgJnNyY19k ZXZpY2VwKTsKKworICBpZiAocmV0KQorICAgIHJldHVybiByZXQ7CisKKyAgcmV0ID0gb21w X3RhcmdldF9tZW1jcHlfY29weSAoZHN0LCBzcmMsIGxlbmd0aCwgZHN0X29mZnNldCwgc3Jj X29mZnNldCwKKwkJCQlkc3RfZGV2aWNlcCwgc3JjX2RldmljZXApOworCisgIHJldHVybiBy ZXQ7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIHZvaWQgKmRzdDsKKyAgY29uc3Qgdm9p ZCAqc3JjOworICBzaXplX3QgbGVuZ3RoOworICBzaXplX3QgZHN0X29mZnNldDsKKyAgc2l6 ZV90IHNyY19vZmZzZXQ7CisgIHN0cnVjdCBnb21wX2RldmljZV9kZXNjciAqZHN0X2Rldmlj ZXA7CisgIHN0cnVjdCBnb21wX2RldmljZV9kZXNjciAqc3JjX2RldmljZXA7Cit9IG9tcF90 YXJnZXRfbWVtY3B5X2RhdGE7CisKK3N0YXRpYyB2b2lkCitvbXBfdGFyZ2V0X21lbWNweV9h c3luY19oZWxwZXIgKHZvaWQgKmFyZ3MpCit7CisgIG9tcF90YXJnZXRfbWVtY3B5X2RhdGEg KmEgPSBhcmdzOworICBpZiAob21wX3RhcmdldF9tZW1jcHlfY29weSAoYS0+ZHN0LCBhLT5z cmMsIGEtPmxlbmd0aCwgYS0+ZHN0X29mZnNldCwKKwkJCSAgICAgIGEtPnNyY19vZmZzZXQs IGEtPmRzdF9kZXZpY2VwLCBhLT5zcmNfZGV2aWNlcCkpCisgICAgZ29tcF9mYXRhbCAoIm9t cF90YXJnZXRfbWVtY3B5IGZhaWxlZCIpOworfQorCitpbnQKK29tcF90YXJnZXRfbWVtY3B5 X2FzeW5jICh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbmd0aCwKKwkJ CSBzaXplX3QgZHN0X29mZnNldCwgc2l6ZV90IHNyY19vZmZzZXQsCisJCQkgaW50IGRzdF9k ZXZpY2VfbnVtLCBpbnQgc3JjX2RldmljZV9udW0sCisJCQkgaW50IGRlcG9ial9jb3VudCwg b21wX2RlcGVuZF90ICpkZXBvYmpfbGlzdCkKK3sKKyAgc3RydWN0IGdvbXBfZGV2aWNlX2Rl c2NyICpkc3RfZGV2aWNlcCA9IE5VTEwsICpzcmNfZGV2aWNlcCA9IE5VTEw7CisgIHVuc2ln bmVkIGludCBmbGFncyA9IDA7CisgIHZvaWQgKmRlcGVuZFtkZXBvYmpfY291bnQgKyA1XTsK KyAgaW50IGk7CisgIGludCBjaGVjayA9IG9tcF90YXJnZXRfbWVtY3B5X2NoZWNrIChkc3Rf ZGV2aWNlX251bSwgc3JjX2RldmljZV9udW0sCisJCQkJICAgICAgICZkc3RfZGV2aWNlcCwg JnNyY19kZXZpY2VwKTsKKworICBvbXBfdGFyZ2V0X21lbWNweV9kYXRhIHMgPSB7CisgICAg LmRzdCA9IGRzdCwKKyAgICAuc3JjID0gc3JjLAorICAgIC5sZW5ndGggPSBsZW5ndGgsCisg ICAgLmRzdF9vZmZzZXQgPSBkc3Rfb2Zmc2V0LAorICAgIC5zcmNfb2Zmc2V0ID0gc3JjX29m ZnNldCwKKyAgICAuZHN0X2RldmljZXAgPSBkc3RfZGV2aWNlcCwKKyAgICAuc3JjX2Rldmlj ZXAgPSBzcmNfZGV2aWNlcAorICB9OworCisgIGlmIChjaGVjaykKKyAgICByZXR1cm4gY2hl Y2s7CisKKyAgaWYgKGRlcG9ial9jb3VudCA+IDAgJiYgZGVwb2JqX2xpc3QgIT0gTlVMTCkK KyAgICB7CisgICAgICBmbGFncyB8PSBHT01QX1RBU0tfRkxBR19ERVBFTkQ7CisgICAgICBk ZXBlbmRbMF0gPSAwOworICAgICAgZGVwZW5kWzFdID0gKHZvaWQgKikgKHVpbnRwdHJfdCkg ZGVwb2JqX2NvdW50OworICAgICAgZGVwZW5kWzJdID0gZGVwZW5kWzNdID0gZGVwZW5kWzRd ID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBkZXBvYmpfY291bnQ7ICsraSkKKwlkZXBl bmRbaSArIDVdID0gJmRlcG9ial9saXN0W2ldOworICAgIH0KKworICBHT01QX3Rhc2sgKG9t cF90YXJnZXRfbWVtY3B5X2FzeW5jX2hlbHBlciwgJnMsIE5VTEwsIHNpemVvZiAocyksCisJ ICAgICBfX2FsaWdub2ZfXyAocyksIHRydWUsIGZsYWdzLCBkZXBlbmQsIDAsIE5VTEwpOwor CisgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50CiBvbXBfdGFyZ2V0X21lbWNweV9yZWN0 X3dvcmtlciAodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBlbGVtZW50X3Np emUsCiAJCQkgICAgICAgaW50IG51bV9kaW1zLCBjb25zdCBzaXplX3QgKnZvbHVtZSwKQEAg LTM1MDAsNTAgKzM1OTAsMzYgQEAgb21wX3RhcmdldF9tZW1jcHlfcmVjdF93b3JrZXIgKHZv aWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZWxlbWVudF9zaXplLAogICByZXR1 cm4gMDsKIH0KIAotaW50Ci1vbXBfdGFyZ2V0X21lbWNweV9yZWN0ICh2b2lkICpkc3QsIGNv bnN0IHZvaWQgKnNyYywgc2l6ZV90IGVsZW1lbnRfc2l6ZSwKLQkJCWludCBudW1fZGltcywg Y29uc3Qgc2l6ZV90ICp2b2x1bWUsCi0JCQljb25zdCBzaXplX3QgKmRzdF9vZmZzZXRzLAot CQkJY29uc3Qgc2l6ZV90ICpzcmNfb2Zmc2V0cywKLQkJCWNvbnN0IHNpemVfdCAqZHN0X2Rp bWVuc2lvbnMsCi0JCQljb25zdCBzaXplX3QgKnNyY19kaW1lbnNpb25zLAotCQkJaW50IGRz dF9kZXZpY2VfbnVtLCBpbnQgc3JjX2RldmljZV9udW0pCitzdGF0aWMgaW50CitvbXBfdGFy Z2V0X21lbWNweV9yZWN0X2NoZWNrICh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgaW50 IGRzdF9kZXZpY2VfbnVtLAorCQkJICAgICAgaW50IHNyY19kZXZpY2VfbnVtLAorCQkJICAg ICAgc3RydWN0IGdvbXBfZGV2aWNlX2Rlc2NyICoqZHN0X2RldmljZXAsCisJCQkgICAgICBz dHJ1Y3QgZ29tcF9kZXZpY2VfZGVzY3IgKipzcmNfZGV2aWNlcCkKIHsKLSAgc3RydWN0IGdv bXBfZGV2aWNlX2Rlc2NyICpkc3RfZGV2aWNlcCA9IE5VTEwsICpzcmNfZGV2aWNlcCA9IE5V TEw7Ci0KICAgaWYgKCFkc3QgJiYgIXNyYykKICAgICByZXR1cm4gSU5UX01BWDsKIAotICBp ZiAoZHN0X2RldmljZV9udW0gIT0gZ29tcF9nZXRfbnVtX2RldmljZXMgKCkpCi0gICAgewot ICAgICAgaWYgKGRzdF9kZXZpY2VfbnVtIDwgMCkKLQlyZXR1cm4gRUlOVkFMOwotCi0gICAg ICBkc3RfZGV2aWNlcCA9IHJlc29sdmVfZGV2aWNlIChkc3RfZGV2aWNlX251bSk7Ci0gICAg ICBpZiAoZHN0X2RldmljZXAgPT0gTlVMTCkKLQlyZXR1cm4gRUlOVkFMOwotCi0gICAgICBp ZiAoIShkc3RfZGV2aWNlcC0+Y2FwYWJpbGl0aWVzICYgR09NUF9PRkZMT0FEX0NBUF9PUEVO TVBfNDAwKQotCSAgfHwgZHN0X2RldmljZXAtPmNhcGFiaWxpdGllcyAmIEdPTVBfT0ZGTE9B RF9DQVBfU0hBUkVEX01FTSkKLQlkc3RfZGV2aWNlcCA9IE5VTEw7Ci0gICAgfQotICBpZiAo c3JjX2RldmljZV9udW0gIT0gbnVtX2RldmljZXNfb3Blbm1wKQotICAgIHsKLSAgICAgIGlm IChzcmNfZGV2aWNlX251bSA8IDApCi0JcmV0dXJuIEVJTlZBTDsKLQotICAgICAgc3JjX2Rl dmljZXAgPSByZXNvbHZlX2RldmljZSAoc3JjX2RldmljZV9udW0pOwotICAgICAgaWYgKHNy Y19kZXZpY2VwID09IE5VTEwpCi0JcmV0dXJuIEVJTlZBTDsKKyAgaW50IHJldCA9IG9tcF90 YXJnZXRfbWVtY3B5X2NoZWNrIChkc3RfZGV2aWNlX251bSwgc3JjX2RldmljZV9udW0sCisJ CQkJICAgICBkc3RfZGV2aWNlcCwgc3JjX2RldmljZXApOworICBpZiAocmV0KQorICAgIHJl dHVybiByZXQ7CiAKLSAgICAgIGlmICghKHNyY19kZXZpY2VwLT5jYXBhYmlsaXRpZXMgJiBH T01QX09GRkxPQURfQ0FQX09QRU5NUF80MDApCi0JICB8fCBzcmNfZGV2aWNlcC0+Y2FwYWJp bGl0aWVzICYgR09NUF9PRkZMT0FEX0NBUF9TSEFSRURfTUVNKQotCXNyY19kZXZpY2VwID0g TlVMTDsKLSAgICB9Ci0KLSAgaWYgKHNyY19kZXZpY2VwICE9IE5VTEwgJiYgZHN0X2Rldmlj ZXAgIT0gTlVMTCAmJiBzcmNfZGV2aWNlcCAhPSBkc3RfZGV2aWNlcCkKKyAgaWYgKCpzcmNf ZGV2aWNlcCAhPSBOVUxMICYmICpkc3RfZGV2aWNlcCAhPSBOVUxMICYmICpzcmNfZGV2aWNl cCAhPSAqZHN0X2RldmljZXApCiAgICAgcmV0dXJuIEVJTlZBTDsKIAorICByZXR1cm4gMDsK K30KKworc3RhdGljIGludAorb21wX3RhcmdldF9tZW1jcHlfcmVjdF9jb3B5ICh2b2lkICpk c3QsIGNvbnN0IHZvaWQgKnNyYywKKwkJCSAgICAgc2l6ZV90IGVsZW1lbnRfc2l6ZSwgaW50 IG51bV9kaW1zLAorCQkJICAgICBjb25zdCBzaXplX3QgKnZvbHVtZSwgY29uc3Qgc2l6ZV90 ICpkc3Rfb2Zmc2V0cywKKwkJCSAgICAgY29uc3Qgc2l6ZV90ICpzcmNfb2Zmc2V0cywKKwkJ CSAgICAgY29uc3Qgc2l6ZV90ICpkc3RfZGltZW5zaW9ucywKKwkJCSAgICAgY29uc3Qgc2l6 ZV90ICpzcmNfZGltZW5zaW9ucywKKwkJCSAgICAgc3RydWN0IGdvbXBfZGV2aWNlX2Rlc2Ny ICpkc3RfZGV2aWNlcCwKKwkJCSAgICAgc3RydWN0IGdvbXBfZGV2aWNlX2Rlc2NyICpzcmNf ZGV2aWNlcCkKK3sKICAgaWYgKHNyY19kZXZpY2VwKQogICAgIGdvbXBfbXV0ZXhfbG9jayAo JnNyY19kZXZpY2VwLT5sb2NrKTsKICAgZWxzZSBpZiAoZHN0X2RldmljZXApCkBAIC0zNTU2 LDkgKzM2MzIsMTE1IEBAIG9tcF90YXJnZXRfbWVtY3B5X3JlY3QgKHZvaWQgKmRzdCwgY29u c3Qgdm9pZCAqc3JjLCBzaXplX3QgZWxlbWVudF9zaXplLAogICAgIGdvbXBfbXV0ZXhfdW5s b2NrICgmc3JjX2RldmljZXAtPmxvY2spOwogICBlbHNlIGlmIChkc3RfZGV2aWNlcCkKICAg ICBnb21wX211dGV4X3VubG9jayAoJmRzdF9kZXZpY2VwLT5sb2NrKTsKKworICByZXR1cm4g cmV0OworfQorCitpbnQKK29tcF90YXJnZXRfbWVtY3B5X3JlY3QgKHZvaWQgKmRzdCwgY29u c3Qgdm9pZCAqc3JjLCBzaXplX3QgZWxlbWVudF9zaXplLAorCQkJaW50IG51bV9kaW1zLCBj b25zdCBzaXplX3QgKnZvbHVtZSwKKwkJCWNvbnN0IHNpemVfdCAqZHN0X29mZnNldHMsCisJ CQljb25zdCBzaXplX3QgKnNyY19vZmZzZXRzLAorCQkJY29uc3Qgc2l6ZV90ICpkc3RfZGlt ZW5zaW9ucywKKwkJCWNvbnN0IHNpemVfdCAqc3JjX2RpbWVuc2lvbnMsCisJCQlpbnQgZHN0 X2RldmljZV9udW0sIGludCBzcmNfZGV2aWNlX251bSkKK3sKKyAgc3RydWN0IGdvbXBfZGV2 aWNlX2Rlc2NyICpkc3RfZGV2aWNlcCA9IE5VTEwsICpzcmNfZGV2aWNlcCA9IE5VTEw7CisK KyAgaW50IGNoZWNrID0gb21wX3RhcmdldF9tZW1jcHlfcmVjdF9jaGVjayAoZHN0LCBzcmMs IGRzdF9kZXZpY2VfbnVtLAorCQkJCQkgICAgc3JjX2RldmljZV9udW0sICZkc3RfZGV2aWNl cCwKKwkJCQkJICAgICZzcmNfZGV2aWNlcCk7CisKKyAgaWYgKGNoZWNrKQorICAgIHJldHVy biBjaGVjazsKKworICBpbnQgcmV0ID0gb21wX3RhcmdldF9tZW1jcHlfcmVjdF9jb3B5IChk c3QsIHNyYywgZWxlbWVudF9zaXplLCBudW1fZGltcywKKwkJCQkJIHZvbHVtZSwgZHN0X29m ZnNldHMsIHNyY19vZmZzZXRzLAorCQkJCQkgZHN0X2RpbWVuc2lvbnMsIHNyY19kaW1lbnNp b25zLAorCQkJCQkgZHN0X2RldmljZXAsIHNyY19kZXZpY2VwKTsKKwogICByZXR1cm4gcmV0 OwogfQogCit0eXBlZGVmIHN0cnVjdAoreworICB2b2lkICpkc3Q7CisgIGNvbnN0IHZvaWQg KnNyYzsKKyAgc2l6ZV90IGVsZW1lbnRfc2l6ZTsKKyAgaW50IG51bV9kaW1zOworICBjb25z dCBzaXplX3QgKnZvbHVtZTsKKyAgY29uc3Qgc2l6ZV90ICpkc3Rfb2Zmc2V0czsKKyAgY29u c3Qgc2l6ZV90ICpzcmNfb2Zmc2V0czsKKyAgY29uc3Qgc2l6ZV90ICpkc3RfZGltZW5zaW9u czsKKyAgY29uc3Qgc2l6ZV90ICpzcmNfZGltZW5zaW9uczsKKyAgc3RydWN0IGdvbXBfZGV2 aWNlX2Rlc2NyICpkc3RfZGV2aWNlcDsKKyAgc3RydWN0IGdvbXBfZGV2aWNlX2Rlc2NyICpz cmNfZGV2aWNlcDsKK30gb21wX3RhcmdldF9tZW1jcHlfcmVjdF9kYXRhOworCitzdGF0aWMg dm9pZAorb21wX3RhcmdldF9tZW1jcHlfcmVjdF9hc3luY19oZWxwZXIgKHZvaWQgKmFyZ3Mp Cit7CisgIG9tcF90YXJnZXRfbWVtY3B5X3JlY3RfZGF0YSAqYSA9IGFyZ3M7CisgIGludCBy ZXQgPSBvbXBfdGFyZ2V0X21lbWNweV9yZWN0X2NvcHkgKGEtPmRzdCwgYS0+c3JjLCBhLT5l bGVtZW50X3NpemUsCisJCQkJCSBhLT5udW1fZGltcywgYS0+dm9sdW1lLCBhLT5kc3Rfb2Zm c2V0cywKKwkJCQkJIGEtPnNyY19vZmZzZXRzLCBhLT5kc3RfZGltZW5zaW9ucywKKwkJCQkJ IGEtPnNyY19kaW1lbnNpb25zLCBhLT5kc3RfZGV2aWNlcCwKKwkJCQkJIGEtPnNyY19kZXZp Y2VwKTsKKyAgaWYgKHJldCkKKyAgICBnb21wX2ZhdGFsICgib21wX3RhcmdldF9tZW1jcHlf cmVjdCBmYWlsZWQiKTsKK30KKworaW50CitvbXBfdGFyZ2V0X21lbWNweV9yZWN0X2FzeW5j ICh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGVsZW1lbnRfc2l6ZSwKKwkJ CSAgICAgIGludCBudW1fZGltcywgY29uc3Qgc2l6ZV90ICp2b2x1bWUsCisJCQkgICAgICBj b25zdCBzaXplX3QgKmRzdF9vZmZzZXRzLAorCQkJICAgICAgY29uc3Qgc2l6ZV90ICpzcmNf b2Zmc2V0cywKKwkJCSAgICAgIGNvbnN0IHNpemVfdCAqZHN0X2RpbWVuc2lvbnMsCisJCQkg ICAgICBjb25zdCBzaXplX3QgKnNyY19kaW1lbnNpb25zLAorCQkJICAgICAgaW50IGRzdF9k ZXZpY2VfbnVtLCBpbnQgc3JjX2RldmljZV9udW0sCisJCQkgICAgICBpbnQgZGVwb2JqX2Nv dW50LCBvbXBfZGVwZW5kX3QgKmRlcG9ial9saXN0KQoreworICBzdHJ1Y3QgZ29tcF9kZXZp Y2VfZGVzY3IgKmRzdF9kZXZpY2VwID0gTlVMTCwgKnNyY19kZXZpY2VwID0gTlVMTDsKKyAg dW5zaWduZWQgZmxhZ3MgPSAwOworICBpbnQgY2hlY2sgPSBvbXBfdGFyZ2V0X21lbWNweV9y ZWN0X2NoZWNrIChkc3QsIHNyYywgZHN0X2RldmljZV9udW0sCisJCQkJCSAgICBzcmNfZGV2 aWNlX251bSwgJmRzdF9kZXZpY2VwLAorCQkJCQkgICAgJnNyY19kZXZpY2VwKTsKKyAgdm9p ZCAqZGVwZW5kW2RlcG9ial9jb3VudCArIDVdOworICBpbnQgaTsKKworICBvbXBfdGFyZ2V0 X21lbWNweV9yZWN0X2RhdGEgcyA9IHsKKyAgICAuZHN0ID0gZHN0LAorICAgIC5zcmMgPSBz cmMsCisgICAgLmVsZW1lbnRfc2l6ZSA9IGVsZW1lbnRfc2l6ZSwKKyAgICAubnVtX2RpbXMg PSBudW1fZGltcywKKyAgICAudm9sdW1lID0gdm9sdW1lLAorICAgIC5kc3Rfb2Zmc2V0cyA9 IGRzdF9vZmZzZXRzLAorICAgIC5zcmNfb2Zmc2V0cyA9IHNyY19vZmZzZXRzLAorICAgIC5k c3RfZGltZW5zaW9ucyA9IGRzdF9kaW1lbnNpb25zLAorICAgIC5zcmNfZGltZW5zaW9ucyA9 IHNyY19kaW1lbnNpb25zLAorICAgIC5kc3RfZGV2aWNlcCA9IGRzdF9kZXZpY2VwLAorICAg IC5zcmNfZGV2aWNlcCA9IHNyY19kZXZpY2VwCisgIH07CisKKyAgaWYgKGNoZWNrKQorICAg IHJldHVybiBjaGVjazsKKworICBpZiAoZGVwb2JqX2NvdW50ID4gMCAmJiBkZXBvYmpfbGlz dCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZsYWdzIHw9IEdPTVBfVEFTS19GTEFHX0RFUEVO RDsKKyAgICAgIGRlcGVuZFswXSA9IDA7CisgICAgICBkZXBlbmRbMV0gPSAodm9pZCAqKSAo dWludHB0cl90KSBkZXBvYmpfY291bnQ7CisgICAgICBkZXBlbmRbMl0gPSBkZXBlbmRbM10g PSBkZXBlbmRbNF0gPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8IGRlcG9ial9jb3VudDsg KytpKQorCWRlcGVuZFtpICsgNV0gPSAmZGVwb2JqX2xpc3RbaV07CisgICAgfQorCisgIEdP TVBfdGFzayAob21wX3RhcmdldF9tZW1jcHlfcmVjdF9hc3luY19oZWxwZXIsICZzLCBOVUxM LCBzaXplb2YgKHMpLAorCSAgICAgX19hbGlnbm9mX18gKHMpLCB0cnVlLCBmbGFncywgZGVw ZW5kLCAwLCBOVUxMKTsKKworICByZXR1cm4gMDsKK30KKwogaW50CiBvbXBfdGFyZ2V0X2Fz c29jaWF0ZV9wdHIgKGNvbnN0IHZvaWQgKmhvc3RfcHRyLCBjb25zdCB2b2lkICpkZXZpY2Vf cHRyLAogCQkJICBzaXplX3Qgc2l6ZSwgc2l6ZV90IGRldmljZV9vZmZzZXQsIGludCBkZXZp Y2VfbnVtKQpkaWZmIC0tZ2l0IGEvbGliZ29tcC90YXNrLmMgYi9saWJnb21wL3Rhc2suYwpp bmRleCA4MjgzNDhjLi5kMWJiM2JhIDEwMDY0NAotLS0gYS9saWJnb21wL3Rhc2suYworKysg Yi9saWJnb21wL3Rhc2suYwpAQCAtNTgxLDYgKzU4MSw3IEBAIEdPTVBfdGFzayAodm9pZCAo KmZuKSAodm9pZCAqKSwgdm9pZCAqZGF0YSwgdm9pZCAoKmNweWZuKSAodm9pZCAqLCB2b2lk ICopLAogICAgIH0KIH0KIAoraWFsaWFzIChHT01QX3Rhc2spCiBpYWxpYXMgKEdPTVBfdGFz a2dyb3VwX3N0YXJ0KQogaWFsaWFzIChHT01QX3Rhc2tncm91cF9lbmQpCiBpYWxpYXMgKEdP TVBfdGFza2dyb3VwX3JlZHVjdGlvbl9yZWdpc3RlcikKZGlmZiAtLWdpdCBhL2xpYmdvbXAv dGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL3RhcmdldC1tZW1jcHktYXN5bmMtMS5j IGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5jLWMrKy1jb21tb24vdGFyZ2V0LW1lbWNw eS1hc3luYy0xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1YzNi YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuYy1jKyst Y29tbW9uL3RhcmdldC1tZW1jcHktYXN5bmMtMS5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qIFRl c3QgZm9yIG9tcF90YXJnZXRfbWVtY3B5X2FzeW5jIHdpdGhvdXQgY29uc2lkZXJpbmcgZGVw ZW5kZW5jZSBvYmplY3RzLiAgKi8KKworI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPHN0 ZGxpYi5oPgorCitpbnQKK21haW4gKCkKK3sKKyAgaW50IGQgPSBvbXBfZ2V0X2RlZmF1bHRf ZGV2aWNlICgpOworICBpbnQgaWQgPSBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlICgpOworICBp bnQgcVsxMjhdLCBpOworICB2b2lkICpwOworCisgIGlmIChkIDwgMCB8fCBkID49IG9tcF9n ZXRfbnVtX2RldmljZXMgKCkpCisgICAgZCA9IGlkOworCisgIHAgPSBvbXBfdGFyZ2V0X2Fs bG9jICgxMzAgKiBzaXplb2YgKGludCksIGQpOworICBpZiAocCA9PSBOVUxMKQorICAgIHJl dHVybiAwOworCisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBxW2ldID0gaTsK KworICBpZiAob21wX3RhcmdldF9tZW1jcHlfYXN5bmMgKHAsIHEsIDEyOCAqIHNpemVvZiAo aW50KSwgc2l6ZW9mIChpbnQpLCAwLCBkLCBpZCwKKyAgICAgIDAsIE5VTEwpKQorICAgIGFi b3J0ICgpOworCisgICNwcmFnbWEgb21wIHRhc2t3YWl0CisKKyAgaW50IHEyWzEyOF07Cisg IGZvciAoaSA9IDA7IGkgPCAxMjg7ICsraSkKKyAgICBxMltpXSA9IDA7CisgIGlmIChvbXBf dGFyZ2V0X21lbWNweV9hc3luYyAocTIsIHAsIDEyOCAqIHNpemVvZihpbnQpLCAwLCBzaXpl b2YgKGludCksIGlkLCBkLAorICAgICAgMCwgTlVMTCkpCisgICAgYWJvcnQgKCk7CisKKyAg I3ByYWdtYSBvbXAgdGFza3dhaXQKKworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyArK2kpCisg ICAgaWYgKHEyW2ldICE9IHFbaV0pCisgICAgICBhYm9ydCAoKTsKKworICBvbXBfdGFyZ2V0 X2ZyZWUgKHAsIGQpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZ29tcC90 ZXN0c3VpdGUvbGliZ29tcC5jLWMrKy1jb21tb24vdGFyZ2V0LW1lbWNweS1hc3luYy0yLmMg Yi9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi90YXJnZXQtbWVtY3B5 LWFzeW5jLTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTM1M2E1 Ci0tLSAvZGV2L251bGwKKysrIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5jLWMrKy1j b21tb24vdGFyZ2V0LW1lbWNweS1hc3luYy0yLmMKQEAgLTAsMCArMSw3NCBAQAorLyogVGVz dCBmb3Igb21wX3RhcmdldF9tZW1jcHlfYXN5bmMgY29uc2lkZXJpbmcgZGVwZW5kZW5jZSBv YmplY3RzLiAgKi8KKworI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgor CitpbnQKK21haW4gKCkKK3sKKyAgaW50IGQgPSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlICgp OworICBpbnQgaWQgPSBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlICgpOworICBpbnQgYVsxMjhd LCBiWzY0XSwgY1szMl0sIGVbMTZdLCBxWzEyOF0sIGk7CisgIHZvaWQgKnA7CisKKyAgaWYg KGQgPCAwIHx8IGQgPj0gb21wX2dldF9udW1fZGV2aWNlcyAoKSkKKyAgICBkID0gaWQ7CisK KyAgcCA9IG9tcF90YXJnZXRfYWxsb2MgKDEzMCAqIHNpemVvZiAoaW50KSwgZCk7CisgIGlm IChwID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgZm9yIChpID0gMDsgaSA8IDEyODsg KytpKQorICAgIGFbaV0gPSBpICsgMTsKKyAgZm9yIChpID0gMDsgaSA8IDY0OyArK2kpCisg ICAgYltpXSA9IGkgKyAyOworICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKyAgICBjW2ld ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgZVtpXSA9IGkgKyA0Owor CisgIG9tcF9kZXBlbmRfdCBvYmpbMl07CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVt X3RocmVhZHMoNSkKKyAgI3ByYWdtYSBvbXAgc2luZ2xlCisgIHsKKyAgICAjcHJhZ21hIG9t cCB0YXNrIGRlcGVuZChvdXQ6IHApCisgICAgb21wX3RhcmdldF9tZW1jcHkgKHAsIGEsIDEy OCAqIHNpemVvZiAoaW50KSwgMCwgMCwgZCwgaWQpOworCisgICAgI3ByYWdtYSBvbXAgdGFz ayBkZXBlbmQoaW5vdXQ6IHApCisgICAgb21wX3RhcmdldF9tZW1jcHkgKHAsIGIsIDY0ICog c2l6ZW9mIChpbnQpLCAwLCAwLCBkLCBpZCk7CisKKyAgICAjcHJhZ21hIG9tcCB0YXNrIGRl cGVuZChvdXQ6IGMpCisgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisgICAgICBjW2ld ID0gaSArIDM7CisKKyAgICAjcHJhZ21hIG9tcCBkZXBvYmoob2JqWzBdKSBkZXBlbmQoaW5v dXQ6IHApCisgICAgI3ByYWdtYSBvbXAgZGVwb2JqKG9ialsxXSkgZGVwZW5kKGluOiBjKQor ICAgIG9tcF90YXJnZXRfbWVtY3B5X2FzeW5jIChwLCBjLCAzMiAqIHNpemVvZiAoaW50KSwg MCwgMCwgZCwgaWQsIDIsIG9iaik7CisKKyAgICAjcHJhZ21hIG9tcCB0YXNrIGRlcGVuZChp bjogcCkKKyAgICBvbXBfdGFyZ2V0X21lbWNweSAocCwgZSwgMTYgKiBzaXplb2YgKGludCks IDAsIDAsIGQsIGlkKTsKKyAgfQorCisgICNwcmFnbWEgb21wIHRhc2t3YWl0CisKKyAgZm9y IChpID0gMDsgaSA8IDEyODsgKytpKQorICAgIHFbaV0gPSAwOworICBvbXBfdGFyZ2V0X21l bWNweSAocSwgcCwgMTI4ICogc2l6ZW9mKGludCksIDAsIDAsIGlkLCBkKTsKKyAgZm9yIChp ID0gMDsgaSA8IDE2OyArK2kpCisgICAgaWYgKHFbaV0gIT0gaSArIDQpCisgICAgICBhYm9y dCAoKTsKKyAgZm9yIChpID0gMTY7IGkgPCAzMjsgKytpKQorICAgIGlmIChxW2ldICE9IGkg KyAzKQorICAgICAgYWJvcnQgKCk7CisgIGZvciAoaSA9IDMyOyBpIDwgNjQ7ICsraSkKKyAg ICBpZiAocVtpXSAhPSBpICsgMikKKyAgICAgIGFib3J0ICgpOworICBmb3IgKGkgPSA2NDsg aSA8IDEyODsgKytpKQorICAgIGlmIChxW2ldICE9IGkgKyAxKQorICAgICAgYWJvcnQgKCk7 CisKKyAgb21wX3RhcmdldF9mcmVlIChwLCBkKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAt LWdpdCBhL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL3RhcmdldC1t ZW1jcHktcmVjdC1hc3luYy0xLmMgYi9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmMtYysr LWNvbW1vbi90YXJnZXQtbWVtY3B5LXJlY3QtYXN5bmMtMS5jCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAuLjE3NmJjZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJnb21w L3Rlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi90YXJnZXQtbWVtY3B5LXJlY3QtYXN5 bmMtMS5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIFRlc3QgZm9yIG9tcF90YXJnZXRfbWVtY3B5 X3JlY3RfYXN5bmMgd2l0aG91dCBjb25zaWRlcmluZyBkZXBlbmRlbmNlCisgICBvYmplY3Rz LiAgKi8KKworI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVm aW5lIE5VTV9ESU1TIDMKKworaW50CittYWluICgpCit7CisgIGludCBkID0gb21wX2dldF9k ZWZhdWx0X2RldmljZSAoKTsKKyAgaW50IGlkID0gb21wX2dldF9pbml0aWFsX2RldmljZSAo KTsKKyAgaW50IHFbMTI4XSwgcTJbMTI4XSwgaTsKKyAgdm9pZCAqcDsKKworICBpZiAoZCA8 IDAgfHwgZCA+PSBvbXBfZ2V0X251bV9kZXZpY2VzICgpKQorICAgIGQgPSBpZDsKKworICBw ID0gb21wX3RhcmdldF9hbGxvYyAoMTMwICogc2l6ZW9mIChpbnQpLCBkKTsKKyAgaWYgKHAg PT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICBpZiAob21wX3RhcmdldF9tZW1jcHlfcmVj dF9hc3luYyAoTlVMTCwgTlVMTCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJ CQkgICAgTlVMTCwgZCwgaWQsIDAsIE5VTEwpIDwgMworICAgICAgfHwgb21wX3RhcmdldF9t ZW1jcHlfcmVjdF9hc3luYyAoTlVMTCwgTlVMTCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwg TlVMTCwKKwkJCQkgICAgICAgTlVMTCwgaWQsIGQsIDAsIE5VTEwpIDwgMworICAgICAgfHwg b21wX3RhcmdldF9tZW1jcHlfcmVjdF9hc3luYyAoTlVMTCwgTlVMTCwgMCwgMCwgTlVMTCwg TlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkgICAgICAgTlVMTCwgaWQsIGlkLCAwLCBOVUxMKSA8 IDMpCisgICAgYWJvcnQgKCk7CisKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAg IHFbaV0gPSAwOworICBpZiAob21wX3RhcmdldF9tZW1jcHkgKHAsIHEsIDEyOCAqIHNpemVv ZiAoaW50KSwgMCwgMCwgZCwgaWQpICE9IDApCisgICAgYWJvcnQgKCk7CisKKyAgZm9yIChp ID0gMDsgaSA8IDEyODsgaSsrKQorICAgIHFbaV0gPSBpICsgMTsKKworICBzaXplX3Qgdm9s dW1lW05VTV9ESU1TXSA9IHsgMSwgMiwgMyB9OworICBzaXplX3QgZHN0X29mZnNldHNbTlVN X0RJTVNdID0geyAwLCAwLCAwIH07CisgIHNpemVfdCBzcmNfb2Zmc2V0c1tOVU1fRElNU10g PSB7IDAsIDAsIDAgfTsKKyAgc2l6ZV90IGRzdF9kaW1lbnNpb25zW05VTV9ESU1TXSA9IHsg MywgNCwgNSB9OworICBzaXplX3Qgc3JjX2RpbWVuc2lvbnNbTlVNX0RJTVNdID0geyAyLCAz LCA0IH07CisKKyAgaWYgKG9tcF90YXJnZXRfbWVtY3B5X3JlY3RfYXN5bmMgKHAsIHEsIHNp emVvZiAoaW50KSwgTlVNX0RJTVMsIHZvbHVtZSwKKwkJCQkgICAgZHN0X29mZnNldHMsIHNy Y19vZmZzZXRzLCBkc3RfZGltZW5zaW9ucywKKwkJCQkgICAgc3JjX2RpbWVuc2lvbnMsIGQs IGlkLCAwLCBOVUxMKSAhPSAwKQorICAgIGFib3J0ICgpOworCisgICNwcmFnbWEgb21wIHRh c2t3YWl0CisKKyAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgIHEyW2ldID0gMDsK KyAgaWYgKG9tcF90YXJnZXRfbWVtY3B5IChxMiwgcCwgMTI4ICogc2l6ZW9mIChpbnQpLCAw LCAwLCBpZCwgZCkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKworICAvKiBxMiBpcyBleHBlY3Rl ZCB0byBjb250YWluOiAxIDIgMyAwIDAgNSA2IDcgMCAwIC4uIDAgICovCisgIGlmIChxMlsw XSAhPSAxIHx8IHEyWzFdICE9IDIgfHwgcTJbMl0gIT0zIHx8IHEyWzNdICE9IDAgfHwgcTJb NF0gIT0gMAorICAgICAgfHwgcTJbNV0gIT0gNSB8fCBxMls2XSAhPSA2IHx8IHEyWzddICE9 IDcpCisgICAgYWJvcnQgKCk7CisgIGZvciAoaSA9IDg7IGkgPCAxMjg7ICsraSkKKyAgICBp ZiAocTJbaV0gIT0gMCkKKyAgICAgIGFib3J0ICgpOworCisgIG9tcF90YXJnZXRfZnJlZSAo cCwgZCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZ29tcC90ZXN0c3VpdGUv bGliZ29tcC5jLWMrKy1jb21tb24vdGFyZ2V0LW1lbWNweS1yZWN0LWFzeW5jLTIuYyBiL2xp YmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL3RhcmdldC1tZW1jcHktcmVj dC1hc3luYy0yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1ZDgw ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuYy1jKyst Y29tbW9uL3RhcmdldC1tZW1jcHktcmVjdC1hc3luYy0yLmMKQEAgLTAsMCArMSw5MSBAQAor LyogVGVzdCBmb3Igb21wX3RhcmdldF9tZW1jcHlfcmVjdF9hc3luYyBjb25zaWRlcmluZyBk ZXBlbmRlbmNlIG9iamVjdHMuICAqLworCisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8 c3RkbGliLmg+CisKKyNkZWZpbmUgTlVNX0RJTVMgMworCitpbnQKK21haW4gKCkKK3sKKyAg aW50IGQgPSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlICgpOworICBpbnQgaWQgPSBvbXBfZ2V0 X2luaXRpYWxfZGV2aWNlICgpOworICBpbnQgYVsxMjhdLCBiWzY0XSwgY1sxMjhdLCBlWzE2 XSwgcVsxMjhdLCBpOworICB2b2lkICpwOworCisgIGlmIChkIDwgMCB8fCBkID49IG9tcF9n ZXRfbnVtX2RldmljZXMgKCkpCisgICAgZCA9IGlkOworCisgIHAgPSBvbXBfdGFyZ2V0X2Fs bG9jICgxMzAgKiBzaXplb2YgKGludCksIGQpOworICBpZiAocCA9PSBOVUxMKQorICAgIHJl dHVybiAwOworCisgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICBxW2ldID0gMDsK KyAgaWYgKG9tcF90YXJnZXRfbWVtY3B5IChwLCBxLCAxMjggKiBzaXplb2YgKGludCksIDAs IDAsIGQsIGlkKSAhPSAwKQorICAgIGFib3J0ICgpOworCisgIHNpemVfdCB2b2x1bWVbTlVN X0RJTVNdID0geyAyLCAyLCAzIH07CisgIHNpemVfdCBkc3Rfb2Zmc2V0c1tOVU1fRElNU10g PSB7IDAsIDAsIDAgfTsKKyAgc2l6ZV90IHNyY19vZmZzZXRzW05VTV9ESU1TXSA9IHsgMCwg MCwgMCB9OworICBzaXplX3QgZHN0X2RpbWVuc2lvbnNbTlVNX0RJTVNdID0geyAzLCA0LCA1 IH07CisgIHNpemVfdCBzcmNfZGltZW5zaW9uc1tOVU1fRElNU10gPSB7IDIsIDMsIDQgfTsK KworICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgYVtpXSA9IDQyOworICBmb3Ig KGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICBiW2ldID0gMjQ7CisgIGZvciAoaSA9IDA7IGkg PCAxMjg7IGkrKykKKyAgICBjW2ldID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IDE2OyBpKysp CisgICAgZVtpXSA9IDc3OworCisgIG9tcF9kZXBlbmRfdCBvYmpbMl07CisKKyAgI3ByYWdt YSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoNSkKKyAgI3ByYWdtYSBvbXAgc2luZ2xlCisg IHsKKyAgICAjcHJhZ21hIG9tcCB0YXNrIGRlcGVuZCAob3V0OiBwKQorICAgIG9tcF90YXJn ZXRfbWVtY3B5IChwLCBhLCAxMjggKiBzaXplb2YgKGludCksIDAsIDAsIGQsIGlkKTsKKwor ICAgICNwcmFnbWEgb21wIHRhc2sgZGVwZW5kKGlub3V0OiBwKQorICAgIG9tcF90YXJnZXRf bWVtY3B5IChwLCBiLCA2NCAqIHNpemVvZiAoaW50KSwgMCwgMCwgZCwgaWQpOworCisgICAg I3ByYWdtYSBvbXAgdGFzayBkZXBlbmQob3V0OiBjKQorICAgIGZvciAoaSA9IDA7IGkgPCAx Mjg7IGkrKykKKyAgICAgIGNbaV0gPSBpICsgMTsKKworICAgICNwcmFnbWEgb21wIGRlcG9i aihvYmpbMF0pIGRlcGVuZChpbm91dDogcCkKKyAgICAjcHJhZ21hIG9tcCBkZXBvYmoob2Jq WzFdKSBkZXBlbmQoaW46IGMpCisKKyAgICAvKiAgVGhpcyBwcm9kdWNlczogMSAyIDMgLSAt IDUgNiA3IC0gLSBhdCBwb3NpdGlvbnMgMC4uOSBhbmQKKwkJICAgICAgIDEzIDE0IDE1IC0g LSAxNyAxOCAxOSAtIC0gYXQgcG9zaXRpb25zIDIwLi4yOS4gICovCisgICAgb21wX3Rhcmdl dF9tZW1jcHlfcmVjdF9hc3luYyAocCwgYywgc2l6ZW9mIChpbnQpLCBOVU1fRElNUywgdm9s dW1lLAorCQkJCSAgZHN0X29mZnNldHMsIHNyY19vZmZzZXRzLCBkc3RfZGltZW5zaW9ucywK KwkJCQkgIHNyY19kaW1lbnNpb25zLCBkLCBpZCwgMiwgb2JqKTsKKworICAgICNwcmFnbWEg b21wIHRhc2sgZGVwZW5kKGluOiBwKQorICAgIG9tcF90YXJnZXRfbWVtY3B5IChwLCBlLCAx NiAqIHNpemVvZiAoaW50KSwgMCwgMCwgZCwgaWQpOworICB9CisKKyAgI3ByYWdtYSBvbXAg dGFza3dhaXQKKworICBpZiAob21wX3RhcmdldF9tZW1jcHkgKHEsIHAsIDEyOCAqIHNpemVv ZihpbnQpLCAwLCAwLCBpZCwgZCkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKworICBmb3IgKGkg PSAwOyBpIDwgMTY7ICsraSkKKyAgICBpZiAocVtpXSAhPSA3NykKKyAgICAgIGFib3J0ICgp OworICBpZiAocVsyMF0gIT0gMTMgfHwgcVsyMV0gIT0gMTQgfHwgcVsyMl0gIT0gMTUgfHwg cVsyNV0gIT0gMTcgfHwgcVsyNl0gIT0gMTgKKyAgICAgIHx8IHFbMjddICE9IDE5KQorICAg IGFib3J0ICgpOworICBmb3IgKGkgPSAyODsgaSA8IDY0OyArK2kpCisgICAgaWYgKHFbaV0g IT0gMjQpCisgICAgICBhYm9ydCAoKTsKKyAgZm9yIChpID0gNjQ7IGkgPCAxMjg7ICsraSkK KyAgICBpZiAocVtpXSAhPSA0MikKKyAgICAgIGFib3J0ICgpOworCisgIG9tcF90YXJnZXRf ZnJlZSAocCwgZCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliZ29tcC90ZXN0 c3VpdGUvbGliZ29tcC5mb3J0cmFuL3RhcmdldC1tZW1jcHktYXN5bmMtMS5mOTAgYi9saWJn b21wL3Rlc3RzdWl0ZS9saWJnb21wLmZvcnRyYW4vdGFyZ2V0LW1lbWNweS1hc3luYy0xLmY5 MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njc5ZmQyCi0tLSAvZGV2 L251bGwKKysrIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5mb3J0cmFuL3RhcmdldC1t ZW1jcHktYXN5bmMtMS5mOTAKQEAgLTAsMCArMSw0MiBAQAorISBUZXN0IGZvciBvbXBfdGFy Z2V0X21lbWNweV9hc3luYyB3aXRob3V0IGNvbnNpZGVyaW5nIGRlcGVuZGVuY2Ugb2JqZWN0 cy4KKworcHJvZ3JhbSBtYWluCisgIHVzZSBvbXBfbGliCisgIHVzZSBpc29fY19iaW5kaW5n CisgIGltcGxpY2l0IG5vbmUgKGV4dGVybmFsLCB0eXBlKQorICBpbnRlZ2VyIDo6IGQsIGlk LCBpLCBqCisgIGludGVnZXIsIHRhcmdldCA6OiBxKDA6MTI3KSwgcTIoMDoxMjcpCisgIHR5 cGUoY19wdHIpIDo6IHAKKyAgaW50ZWdlcihvbXBfZGVwZW5kX2tpbmQpIDo6IG9iaigxOjAp CisKKyAgZCA9IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UgKCkKKyAgaWQgPSBvbXBfZ2V0X2lu aXRpYWxfZGV2aWNlICgpCisKKyAgaWYgKGQgPCAwIC5vci4gZCA+PSBvbXBfZ2V0X251bV9k ZXZpY2VzICgpKSAmCisgICAgZCA9IGlkCisKKyAgcCA9IG9tcF90YXJnZXRfYWxsb2MgKDEz MCAqIGNfc2l6ZW9mIChxKSwgZCkKKyAgaWYgKC5ub3QuIGNfYXNzb2NpYXRlZCAocCkpICYK KyAgICBzdG9wIDAgICEgb2theQorCisgIHEgPSBbKGksIGkgPSAwLCAxMjcpXQorICBpZiAo b21wX3RhcmdldF9tZW1jcHlfYXN5bmMgKHAsIGNfbG9jIChxKSwgMTI4ICogc2l6ZW9mIChx KDApKSwgMF9jX3NpemVfdCwgJgorICAgICAgMF9jX3NpemVfdCwgZCwgaWQsIDAsIG9iaikg Lz0gMCkgJgorICAgIHN0b3AgMQorCisgICEkb21wIHRhc2t3YWl0CisKKyAgcTIgPSBbKDAs IGkgPSAwLCAxMjcpXQorICBpZiAob21wX3RhcmdldF9tZW1jcHlfYXN5bmMgKGNfbG9jIChx MiksIHAsIDEyOCAqIHNpemVvZiAocTIoMCkpLCAwX2Nfc2l6ZV90LCYKKyAgICAgIDBfY19z aXplX3QsIGlkLCBkLCAwLCBvYmopIC89IDApICYKKyAgICBzdG9wIDIKKworICAhJG9tcCB0 YXNrd2FpdAorCisgIGRvIGogPSAwLCAxMjcKKyAgICBpZiAocShqKSAvPSBxMihqKSkgJgor ICAgICAgc3RvcCAzCisgIGVuZCBkbworCisgIGNhbGwgb21wX3RhcmdldF9mcmVlIChwLCBk KQorZW5kIHByb2dyYW0gbWFpbgpkaWZmIC0tZ2l0IGEvbGliZ29tcC90ZXN0c3VpdGUvbGli Z29tcC5mb3J0cmFuL3RhcmdldC1tZW1jcHktYXN5bmMtMi5mOTAgYi9saWJnb21wL3Rlc3Rz dWl0ZS9saWJnb21wLmZvcnRyYW4vdGFyZ2V0LW1lbWNweS1hc3luYy0yLmY5MApuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWE0ODJhCi0tLSAvZGV2L251bGwKKysr IGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5mb3J0cmFuL3RhcmdldC1tZW1jcHktYXN5 bmMtMi5mOTAKQEAgLTAsMCArMSw5MSBAQAorISBUZXN0IGZvciBvbXBfdGFyZ2V0X21lbWNw eV9hc3luYyBjb25zaWRlcmluZyBkZXBlbmRlbmNlIG9iamVjdHMuCisKK3Byb2dyYW0gbWFp bgorICB1c2Ugb21wX2xpYgorICB1c2UgaXNvX2NfYmluZGluZworICBpbXBsaWNpdCBub25l IChleHRlcm5hbCwgdHlwZSkKKyAgaW50ZWdlciA6OiBkLCBpZCwgaSwgagorICBpbnRlZ2Vy LCB0YXJnZXQgOjogYSgwOjEyNyksIGIoMDo2MyksIGMoMDozMSksIGUoMDoxNSksIHEoMDox MjcpCisgIHR5cGUoY19wdHIpIDo6IHAKKyAgaW50ZWdlcihvbXBfZGVwZW5kX2tpbmQpIDo6 IG9iaigwOjEpCisKKyAgZCA9IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UgKCkKKyAgaWQgPSBv bXBfZ2V0X2luaXRpYWxfZGV2aWNlICgpCisKKyAgaWYgKGQgPCAwIC5vci4gZCA+PSBvbXBf Z2V0X251bV9kZXZpY2VzICgpKSAmCisgICAgZCA9IGlkCisKKyAgcCA9IG9tcF90YXJnZXRf YWxsb2MgKDEzMCAqIGNfc2l6ZW9mIChxKSwgZCkKKyAgaWYgKC5ub3QuIGNfYXNzb2NpYXRl ZCAocCkpICYKKyAgICBzdG9wIDAgICEgb2theQorCisgIGEgPSBbKGkgKyAxLCBpID0gMCwg MTI3KV0KKyAgYiA9IFsoaSArIDIsIGkgPSAwLCA2MyldCisgIGMgPSBbKDAsIGkgPSAwLCAz MSldCisgIGUgPSBbKGkgKyA0LCBpID0gMCwgMTUpXQorCisgICEkb21wIHBhcmFsbGVsIG51 bV90aHJlYWRzKDUpCisgICEkb21wIHNpbmdsZQorCisgICAgISRvbXAgdGFzayBkZXBlbmQo b3V0OiBwKQorICAgIGlmIChvbXBfdGFyZ2V0X21lbWNweSAocCwgY19sb2MgKGEpLCAxMjgg KiBzaXplb2YgKGEoMCkpLCAwX2Nfc2l6ZV90LCAmCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAwX2Nfc2l6ZV90LCBkLCBpZCkgLz0gMCkgJgorICAgICAgc3RvcCAxCisgICAgISRv bXAgZW5kIHRhc2sKKworICAgICEkb21wIHRhc2sgZGVwZW5kKGlub3V0OiBwKQorICAgIGlm IChvbXBfdGFyZ2V0X21lbWNweSAocCwgY19sb2MgKGIpLCA2NCAqIHNpemVvZiAoYigwKSks IDBfY19zaXplX3QsICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDBfY19zaXplX3Qs IGQsIGlkKSAvPSAwKSAmCisgICAgICBzdG9wIDIKKyAgICAhJG9tcCBlbmQgdGFzaworCisg ICAgISRvbXAgdGFzayBkZXBlbmQob3V0OiBjKQorICAgIGRvIGogPSAwLCAzMQorICAgICAg YyhqKSA9IGogKyAzCisgICAgZW5kIGRvCisgICAgISRvbXAgZW5kIHRhc2sKKworICAgICEk b21wIGRlcG9iaihvYmooMCkpIGRlcGVuZChpbm91dDogcCkKKyAgICAhJG9tcCBkZXBvYmoo b2JqKDEpKSBkZXBlbmQoaW46IGMpCisgICAgaWYgKG9tcF90YXJnZXRfbWVtY3B5X2FzeW5j IChwLCBjX2xvYyAoYyksIDMyICogc2l6ZW9mIChjKDApKSwgMF9jX3NpemVfdCwgJgorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMF9jX3NpemVfdCwgZCwgaWQsIDIsIG9i aikgLz0gMCkgJgorICAgICAgc3RvcCAzCisKKyAgICAhJG9tcCB0YXNrIGRlcGVuZChpbjog cCkKKyAgICBpZiAob21wX3RhcmdldF9tZW1jcHkgKHAsIGNfbG9jIChlKSwgMTYgKiBzaXpl b2YgKGUoMCkpLCAwX2Nfc2l6ZV90LCAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAw X2Nfc2l6ZV90LCBkLCBpZCkgLz0gMCkgJgorICAgICAgc3RvcCA0CisgICAgISRvbXAgZW5k IHRhc2sKKworICAhJG9tcCBlbmQgc2luZ2xlCisgICEkb21wIGVuZCBwYXJhbGxlbAorCisg ICEkb21wIHRhc2t3YWl0CisKKyAgcSA9IFsoMCwgaSA9IDAsIDEyNyldCisgIGlmIChvbXBf dGFyZ2V0X21lbWNweSAoY19sb2MgKHEpLCBwLCAxMjggKiBzaXplb2YgKHEoMCkpLCAwX2Nf c2l6ZV90LCAmCisgICAgICAgICAgICAgICAgICAgICAgICAgMF9jX3NpemVfdCwgaWQsIGQp IC89IDApICYKKyAgICBzdG9wIDUKKworICBkbyBqID0gMCwgMTUKKyAgICBpZiAocShqKSAv PSBqKzQpICYKKyAgICAgIHN0b3AgMTAKKyAgZW5kIGRvCisKKyAgZG8gaiA9IDE2LCAzMQor ICAgIGlmIChxKGopIC89IGorMykgJgorICAgICAgc3RvcCAxMQorICBlbmQgZG8KKworICBk byBqID0gMzIsIDYzCisgICAgaWYgKHEoaikgLz0gaisyKSAmCisgICAgICBzdG9wIDEyCisg IGVuZCBkbworCisgIGRvIGogPSA2NCwgMTI3CisgICAgaWYgKHEoaikgLz0gaisxKSAmCisg ICAgICBzdG9wIDEzCisgIGVuZCBkbworCisgIGNhbGwgb21wX3RhcmdldF9mcmVlIChwLCBk KQorZW5kIHByb2dyYW0gbWFpbgpkaWZmIC0tZ2l0IGEvbGliZ29tcC90ZXN0c3VpdGUvbGli Z29tcC5mb3J0cmFuL3RhcmdldC1tZW1jcHktcmVjdC1hc3luYy0xLmY5MCBiL2xpYmdvbXAv dGVzdHN1aXRlL2xpYmdvbXAuZm9ydHJhbi90YXJnZXQtbWVtY3B5LXJlY3QtYXN5bmMtMS5m OTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjODdjNQotLS0gL2Rl di9udWxsCisrKyBiL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuZm9ydHJhbi90YXJnZXQt bWVtY3B5LXJlY3QtYXN5bmMtMS5mOTAKQEAgLTAsMCArMSw4NiBAQAorISBUZXN0IGZvciBv bXBfdGFyZ2V0X21lbWNweV9yZWN0X2FzeW5jIHdpdGhvdXQgY29uc2lkZXJpbmcgZGVwZW5k ZW5jZSBvYmplY3RzLgorCitwcm9ncmFtIG1haW4KKyAgdXNlIG9tcF9saWIKKyAgdXNlIGlz b19jX2JpbmRpbmcKKyAgaW1wbGljaXQgbm9uZSAoZXh0ZXJuYWwsIHR5cGUpCisgIGludGVn ZXIgOjogZCwgaWQsIGksIGoKKyAgaW50ZWdlciwgdGFyZ2V0IDo6IHEoMDoxMjcpLCBxMigw OjEyNykKKyAgdHlwZShjX3B0cikgOjogcAorICBpbnRlZ2VyKG9tcF9kZXBlbmRfa2luZCkg Ojogb2JqKDE6MCkKKworICBpbnRlZ2VyKGtpbmQ9Y19zaXplX3QpIDo6IHZvbHVtZSgwOjIp CisgIGludGVnZXIoa2luZD1jX3NpemVfdCkgOjogZHN0X29mZnNldHMoMDoyKQorICBpbnRl Z2VyKGtpbmQ9Y19zaXplX3QpIDo6IHNyY19vZmZzZXRzKDA6MikKKyAgaW50ZWdlcihraW5k PWNfc2l6ZV90KSA6OiBkc3RfZGltZW5zaW9ucygwOjIpCisgIGludGVnZXIoa2luZD1jX3Np emVfdCkgOjogc3JjX2RpbWVuc2lvbnMoMDoyKQorICBpbnRlZ2VyKGtpbmQ9Y19zaXplX3Qp IDo6IGVtcHR5KDE6MCkKKworICBkID0gb21wX2dldF9kZWZhdWx0X2RldmljZSAoKQorICBp ZCA9IG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UgKCkKKworICBpZiAoZCA8IDAgLm9yLiBkID49 IG9tcF9nZXRfbnVtX2RldmljZXMgKCkpICYKKyAgICBkID0gaWQKKworICBwID0gb21wX3Rh cmdldF9hbGxvYyAoMTMwICogY19zaXplb2YgKHEpLCBkKQorICBpZiAoLm5vdC4gY19hc3Nv Y2lhdGVkIChwKSkgJgorICAgIHN0b3AgMCAgISBva2F5CisKKyAgaWYgKG9tcF90YXJnZXRf bWVtY3B5X3JlY3RfYXN5bmMgKENfTlVMTF9QVFIsIENfTlVMTF9QVFIsIDBfY19zaXplX3Qs IDAsICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5LCBlbXB0 eSwgZW1wdHksIGVtcHR5LCAgZW1wdHksIGQsIGlkLCAmCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAwLCBvYmopIDwgMyAmCisgICAgIC5vci4gb21wX3RhcmdldF9t ZW1jcHlfcmVjdF9hc3luYyAoQ19OVUxMX1BUUiwgQ19OVUxMX1BUUiwgMF9jX3NpemVfdCwg MCwgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5LCBl bXB0eSwgZW1wdHksIGVtcHR5LCBlbXB0eSwgJgorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGlkLCBkLCAwLCBvYmopIDwgMyAmCisgICAgIC5vci4gb21wX3Rh cmdldF9tZW1jcHlfcmVjdF9hc3luYyAoQ19OVUxMX1BUUiwgQ19OVUxMX1BUUiwgMF9jX3Np emVfdCwgMCwgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVt cHR5LCBlbXB0eSwgZW1wdHksIGVtcHR5LCBlbXB0eSwgJgorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGlkLCBpZCwgMCwgb2JqKSA8IDMpICYKKyAgICBzdG9w IDEKKworICBxID0gWygwLCBpID0gMCwgMTI3KV0KKyAgaWYgKG9tcF90YXJnZXRfbWVtY3B5 IChwLCBjX2xvYyAocSksIDEyOCAqIHNpemVvZiAocSgwKSksIDBfY19zaXplX3QsICYKKyAg ICAgICAgICAgICAgICAgICAgICAgICAwX2Nfc2l6ZV90LCBkLCBpZCkgLz0gMCkgJgorICAg IHN0b3AgMgorCisgIHEgPSBbKGkrMSwgaSA9IDAsIDEyNyldCisKKyAgdm9sdW1lKDIpID0g MworICB2b2x1bWUoMSkgPSAyCisgIHZvbHVtZSgwKSA9IDEKKyAgZHN0X29mZnNldHMoMikg PSAwCisgIGRzdF9vZmZzZXRzKDEpID0gMAorICBkc3Rfb2Zmc2V0cygwKSA9IDAKKyAgc3Jj X29mZnNldHMoMikgPSAwCisgIHNyY19vZmZzZXRzKDEpID0gMAorICBzcmNfb2Zmc2V0cygw KSA9IDAKKyAgZHN0X2RpbWVuc2lvbnMoMikgPSA1CisgIGRzdF9kaW1lbnNpb25zKDEpID0g NAorICBkc3RfZGltZW5zaW9ucygwKSA9IDMKKyAgc3JjX2RpbWVuc2lvbnMoMikgPSA0Cisg IHNyY19kaW1lbnNpb25zKDEpID0gMworICBzcmNfZGltZW5zaW9ucygwKSA9IDIKKworICBp ZiAob21wX3RhcmdldF9tZW1jcHlfcmVjdF9hc3luYyAocCwgY19sb2MgKHEpLCBzaXplb2Yg KHEoMCkpLCAzLCB2b2x1bWUsICYKKyAgICAgIGRzdF9vZmZzZXRzLCBzcmNfb2Zmc2V0cywg ZHN0X2RpbWVuc2lvbnMsIHNyY19kaW1lbnNpb25zLCBkLCBpZCwgMCwgJgorICAgICAgb2Jq KSAvPSAwKSAmCisgICAgc3RvcCAzCisKKyAgISRvbXAgdGFza3dhaXQKKworICBxMiA9IFso MCwgaSA9IDAsIDEyNyldCisgIGlmIChvbXBfdGFyZ2V0X21lbWNweSAoY19sb2MgKHEyKSwg cCwgMTI4ICogc2l6ZW9mIChxMigwKSksIDBfY19zaXplX3QsICYKKyAgICAgICAgICAgICAg ICAgICAgICAgICAwX2Nfc2l6ZV90LCBpZCwgZCkgLz0gMCkgJgorICAgIHN0b3AgNAorCisg ICEgcTIgaXMgZXhwZWN0ZWQgdG8gY29udGFpbjogMSAyIDMgMCAwIDUgNiA3IDAgMCAuLiAw CisgIGlmIChxMigwKSAvPSAxIC5vci4gcTIoMSkgLz0gMiAub3IuIHEyKDIpIC89IDMgLm9y LiBxMigzKSAvPSAwICYKKyAgICAgIC5vci4gcTIoNCkgLz0gMCAub3IuIHEyKDUpIC89IDUg Lm9yLiBxMig2KSAvPSA2IC5vci4gcTIoNykgLz0gNykgJgorICAgIHN0b3AgNQorCisgIGRv IGogPSA4LCAxMjcKKyAgICBpZiAocTIoaikgLz0gMCkgJgorICAgICAgc3RvcCA2CisgIGVu ZCBkbworCisgIGNhbGwgb21wX3RhcmdldF9mcmVlIChwLCBkKQorZW5kIHByb2dyYW0gbWFp bgpkaWZmIC0tZ2l0IGEvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5mb3J0cmFuL3Rhcmdl dC1tZW1jcHktcmVjdC1hc3luYy0yLmY5MCBiL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAu Zm9ydHJhbi90YXJnZXQtbWVtY3B5LXJlY3QtYXN5bmMtMi5mOTAKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiYzVmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdv bXAvdGVzdHN1aXRlL2xpYmdvbXAuZm9ydHJhbi90YXJnZXQtbWVtY3B5LXJlY3QtYXN5bmMt Mi5mOTAKQEAgLTAsMCArMSwxMTcgQEAKKyEgVGVzdCBmb3Igb21wX3RhcmdldF9tZW1jcHlf cmVjdF9hc3luYyBjb25zaWRlcmluZyBkZXBlbmRlbmNlIG9iamVjdHMuCisKK3Byb2dyYW0g bWFpbgorICB1c2Ugb21wX2xpYgorICB1c2UgaXNvX2NfYmluZGluZworICBpbXBsaWNpdCBu b25lIChleHRlcm5hbCwgdHlwZSkKKyAgaW50ZWdlciA6OiBkLCBpZCwgaSwgagorICBpbnRl Z2VyLCB0YXJnZXQgOjogYSgwOjEyNyksIGIoMDo2MyksIGMoMDoxMjcpLCBlKDA6MTUpLCBx KDA6MTI3KQorICB0eXBlKGNfcHRyKSA6OiBwCisgIGludGVnZXIob21wX2RlcGVuZF9raW5k KSA6OiBvYmooMDoyKQorCisgIGludGVnZXIoa2luZD1jX3NpemVfdCkgOjogdm9sdW1lKDA6 MikKKyAgaW50ZWdlcihraW5kPWNfc2l6ZV90KSA6OiBkc3Rfb2Zmc2V0cygwOjIpCisgIGlu dGVnZXIoa2luZD1jX3NpemVfdCkgOjogc3JjX29mZnNldHMoMDoyKQorICBpbnRlZ2VyKGtp bmQ9Y19zaXplX3QpIDo6IGRzdF9kaW1lbnNpb25zKDA6MikKKyAgaW50ZWdlcihraW5kPWNf c2l6ZV90KSA6OiBzcmNfZGltZW5zaW9ucygwOjIpCisKKyAgZCA9IG9tcF9nZXRfZGVmYXVs dF9kZXZpY2UgKCkKKyAgaWQgPSBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlICgpCisKKyAgaWYg KGQgPCAwIC5vci4gZCA+PSBvbXBfZ2V0X251bV9kZXZpY2VzICgpKSAmCisgICAgZCA9IGlk CisKKyAgcCA9IG9tcF90YXJnZXRfYWxsb2MgKDEzMCAqIGNfc2l6ZW9mIChxKSwgZCkKKyAg aWYgKC5ub3QuIGNfYXNzb2NpYXRlZCAocCkpICYKKyAgICBzdG9wIDAgICEgb2theQorCisg IGEgPSBbKDQyLCBpID0gMCwgMTI3KV0KKyAgYiA9IFsoMjQsIGkgPSAwLCA2MyldCisgIGMg PSBbKDAsIGkgPSAwLCAxMjcpXQorICBlID0gWyg3NywgaSA9IDAsIDE1KV0KKworICB2b2x1 bWUoMikgPSAzCisgIHZvbHVtZSgxKSA9IDIKKyAgdm9sdW1lKDApID0gMgorICBkc3Rfb2Zm c2V0cygyKSA9IDAKKyAgZHN0X29mZnNldHMoMSkgPSAwCisgIGRzdF9vZmZzZXRzKDApID0g MAorICBzcmNfb2Zmc2V0cygyKSA9IDAKKyAgc3JjX29mZnNldHMoMSkgPSAwCisgIHNyY19v ZmZzZXRzKDApID0gMAorICBkc3RfZGltZW5zaW9ucygyKSA9IDUKKyAgZHN0X2RpbWVuc2lv bnMoMSkgPSA0CisgIGRzdF9kaW1lbnNpb25zKDApID0gMworICBzcmNfZGltZW5zaW9ucygy KSA9IDQKKyAgc3JjX2RpbWVuc2lvbnMoMSkgPSAzCisgIHNyY19kaW1lbnNpb25zKDApID0g MgorCisgICEkb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKDUpCisgICEkb21wIHNpbmdsZQor CisgICAgISRvbXAgdGFzayBkZXBlbmQob3V0OiBwKQorICAgIGlmIChvbXBfdGFyZ2V0X21l bWNweSAocCwgY19sb2MgKGEpLCAxMjggKiBzaXplb2YgKGEoMCkpLCAwX2Nfc2l6ZV90LCAm CisgICAgICAgICAgICAgICAgICAgICAgICAgICAwX2Nfc2l6ZV90LCBkLCBpZCkgLz0gMCkg JgorICAgICAgc3RvcCAxCisgICAgISRvbXAgZW5kIHRhc2sKKworICAgICEkb21wIHRhc2sg ZGVwZW5kKGlub3V0OiBwKQorICAgIGlmIChvbXBfdGFyZ2V0X21lbWNweSAocCwgY19sb2Mg KGIpLCA2NCAqIHNpemVvZiAoYigwKSksIDBfY19zaXplX3QsICYKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgIDBfY19zaXplX3QsIGQsIGlkKSAvPSAwKSAmCisgICAgICBzdG9wIDIK KyAgICAhJG9tcCBlbmQgdGFzaworCisgICAgISRvbXAgdGFzayBkZXBlbmQob3V0OiBjKQor ICAgIGRvIGogPSAwLCAxMjcKKyAgICAgIGMoaikgPSBqICsgMQorICAgIGVuZCBkbworICAg ICEkb21wIGVuZCB0YXNrCisKKyAgICAhJG9tcCBkZXBvYmoob2JqKDApKSBkZXBlbmQoaW5v dXQ6IHApCisgICAgISRvbXAgZGVwb2JqKG9iaigxKSkgZGVwZW5kKGluOiBjKQorCisgICAg ISBUaGlzIHByb2R1Y2VzOiAxIDIgMyAtIC0gNSA2IDcgLSAtIGF0IHBvc2l0aW9ucyAwLi45 IGFuZAorICAgICEgICAgICAgICAgICAgICAgMTMgMTQgMTUgLSAtIDE3IDE4IDE5IC0gLSBh dCBwb3NpdGlvbnMgMjAuLjI5LgorICAgIGlmIChvbXBfdGFyZ2V0X21lbWNweV9yZWN0X2Fz eW5jIChwLCBjX2xvYyAoYyksIHNpemVvZiAoYygwKSksIDMsIHZvbHVtZSwgJgorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfb2Zmc2V0cywgc3JjX29mZnNl dHMsICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RpbWVu c2lvbnMsIHNyY19kaW1lbnNpb25zLCBkLCBpZCwgJgorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAyLCBvYmopIC89IDApICYKKyAgICAgIHN0b3AgMworCisgICAg ISRvbXAgdGFzayBkZXBlbmQoaW46IHApCisgICAgaWYgKG9tcF90YXJnZXRfbWVtY3B5IChw LCBjX2xvYyAoZSksIDE2ICogc2l6ZW9mIChlKDApKSwgMF9jX3NpemVfdCwgJgorICAgICAg ICAgICAgICAgICAgICAgICAgICAgMF9jX3NpemVfdCwgZCwgaWQpIC89IDApICYKKyAgICAg IHN0b3AgNAorICAgICEkb21wIGVuZCB0YXNrCisKKyAgISRvbXAgZW5kIHNpbmdsZQorICAh JG9tcCBlbmQgcGFyYWxsZWwKKworICAhJG9tcCB0YXNrd2FpdAorCisgIHEgPSBbKDAsIGkg PSAwLCAxMjcpXQorICBpZiAob21wX3RhcmdldF9tZW1jcHkgKGNfbG9jIChxKSwgcCwgMTI4 ICogc2l6ZW9mIChxKDApKSwgMF9jX3NpemVfdCwgJgorICAgICAgICAgICAgICAgICAgICAg ICAgIDBfY19zaXplX3QsIGlkLCBkKSAvPSAwKSAmCisgICAgc3RvcCA1CisKKyAgZG8gaiA9 IDAsIDE1CisgICAgaWYgKHEoaikgLz0gNzcpICYKKyAgICAgIHN0b3AgNgorICBlbmQgZG8K KworICBpZiAocSgyMCkgLz0gMTMgLm9yLiBxKDIxKSAvPSAxNCAub3IuIHEoMjIpIC89IDE1 IC5vci4gcSgyNSkgLz0gMTcgJgorICAgICAgLm9yLiBxKDI2KSAvPSAxOCAub3IuIHEoMjcp IC89IDE5KSAmCisgICAgc3RvcCA3CisKKyAgZG8gaiA9IDI4LCA2MworICAgIGlmIChxKGop IC89IDI0KSAmCisgICAgICBzdG9wIDgKKyAgZW5kIGRvCisKKyAgZG8gaiA9IDY0LCAxMjcK KyAgICBpZiAocShqKSAvPSA0MikgJgorICAgICAgc3RvcCA5CisgIGVuZCBkbworCisgIGNh bGwgb21wX3RhcmdldF9mcmVlIChwLCBkKQorZW5kIHByb2dyYW0gbWFpbgo= --------------msxAYwJuF9ftsMfE3rfFDDpF--