From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 63855 invoked by alias); 7 Mar 2019 01:51:49 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 63709 invoked by uid 89); 7 Mar 2019 01:51:48 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-13.8 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: mail-oi1-f193.google.com Received: from mail-oi1-f193.google.com (HELO mail-oi1-f193.google.com) (209.85.167.193) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 07 Mar 2019 01:51:43 +0000 Received: by mail-oi1-f193.google.com with SMTP id t206so11625096oib.3 for ; Wed, 06 Mar 2019 17:51:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=ZHGe6V/ksBEacJflv442hOIU39pTZ9nnfyTxgHkt0mw=; b=IdT/zwtS0mZZPnSVPFFQ/AKO5FNEaK5Karzc8PLfn9DqZGT2soj7aJw7bdGP2E309X lZdQGxTprWKWgODgaYICiC9RDNf9fXTKuDYFH715RKVa2Y30zNREklk7rU6LoNUoSb0u gvKtSwuewZZ0142EngUwQSDlRzncZ0/9kmATZP3o/6iUgbhmpDWLCnH19/KnDllvt+ZT rkoPCTUA/DYeN56ykwclH/2+m1rhOvxq3/ZtrwjIwrT3V3GsfNOr8anc9xIboKoYhjQQ QZlMgGs4c2u8GhQGZi1l0zBPQfkmoo5kqDJK9h5S4KwPAJgv9iPebs/ol9ewzxqA4+tN uM3Q== MIME-Version: 1.0 References: <20190303143230.19742-1-hjl.tools@gmail.com> <20190303211325.GA24057@gmail.com> <20190304174625.GA25613@gmail.com> In-Reply-To: From: "H.J. Lu" Date: Thu, 07 Mar 2019 07:12:00 -0000 Message-ID: Subject: V4 [PATCH] Optimize vector constructor To: Richard Biener Cc: Hongtao Liu , Andrew Pinski , GCC Patches Content-Type: multipart/mixed; boundary="00000000000003a0bf05837759fb" X-IsSubscribed: yes X-SW-Source: 2019-03/txt/msg00292.txt.bz2 --00000000000003a0bf05837759fb Content-Type: text/plain; charset="UTF-8" Content-length: 9241 On Wed, Mar 6, 2019 at 8:33 PM Richard Biener wrote: > > On Wed, Mar 6, 2019 at 8:46 AM H.J. Lu wrote: > > > > On Tue, Mar 5, 2019 at 1:46 AM H.J. Lu wrote: > > > > > > On Mon, Mar 04, 2019 at 12:55:04PM +0100, Richard Biener wrote: > > > > On Sun, Mar 3, 2019 at 10:13 PM H.J. Lu wrote: > > > > > > > > > > On Sun, Mar 03, 2019 at 06:40:09AM -0800, Andrew Pinski wrote: > > > > > > ) > > > > > > ,On Sun, Mar 3, 2019 at 6:32 AM H.J. Lu wrote: > > > > > > > > > > > > > > For vector init constructor: > > > > > > > > > > > > > > --- > > > > > > > typedef float __v4sf __attribute__ ((__vector_size__ (16))); > > > > > > > > > > > > > > __v4sf > > > > > > > foo (__v4sf x, float f) > > > > > > > { > > > > > > > __v4sf y = { f, x[1], x[2], x[3] }; > > > > > > > return y; > > > > > > > } > > > > > > > --- > > > > > > > > > > > > > > we can optimize vector init constructor with vector copy or permute > > > > > > > followed by a single scalar insert: > > > > > > > and you want to advance to the _1 = BIT_INSERT_EXPR here. The easiest way > > > > is to emit a new stmt for _2 = copy ...; and do the set_rhs with the > > > > BIT_INSERT_EXPR. > > > > > > Thanks for BIT_INSERT_EXPR suggestion. I am testing this patch. > > > > > > > > > H.J. > > > --- > > > We can optimize vector constructor with vector copy or permute followed > > > by a single scalar insert: > > > > > > __v4sf y; > > > __v4sf D.1930; > > > float _1; > > > float _2; > > > float _3; > > > > > > : > > > _1 = BIT_FIELD_REF ; > > > _2 = BIT_FIELD_REF ; > > > _3 = BIT_FIELD_REF ; > > > y_6 = {f_5(D), _3, _2, _1}; > > > return y_6; > > > > > > with > > > > > > __v4sf y; > > > __v4sf D.1930; > > > float _1; > > > float _2; > > > float _3; > > > vector(4) float _8; > > > > > > : > > > _1 = BIT_FIELD_REF ; > > > _2 = BIT_FIELD_REF ; > > > _3 = BIT_FIELD_REF ; > > > _8 = x_9(D); > > > y_6 = BIT_INSERT_EXPR ; > > > return y_6; > > > > > > gcc/ > > > > > > PR tree-optimization/88828 > > > * tree-ssa-forwprop.c (simplify_vector_constructor): Optimize > > > vector init constructor with vector copy or permute followed > > > by a single scalar insert. > > > > > > gcc/testsuite/ > > > > > > PR tree-optimization/88828 > > > * gcc.target/i386/pr88828-1a.c: New test. > > > * gcc.target/i386/pr88828-2b.c: Likewise. > > > * gcc.target/i386/pr88828-2.c: Likewise. > > > * gcc.target/i386/pr88828-3a.c: Likewise. > > > * gcc.target/i386/pr88828-3b.c: Likewise. > > > * gcc.target/i386/pr88828-3c.c: Likewise. > > > * gcc.target/i386/pr88828-3d.c: Likewise. > > > * gcc.target/i386/pr88828-4a.c: Likewise. > > > * gcc.target/i386/pr88828-4b.c: Likewise. > > > * gcc.target/i386/pr88828-5a.c: Likewise. > > > * gcc.target/i386/pr88828-5b.c: Likewise. > > > * gcc.target/i386/pr88828-6a.c: Likewise. > > > * gcc.target/i386/pr88828-6b.c: Likewise. > > > > Here is the updated patch with run-time tests. > > - if (TREE_CODE (elt->value) != SSA_NAME) > + if (TREE_CODE (ce->value) != SSA_NAME) > return false; > > hmm, so it doesn't allow { 0, v[1], v[2], v[3] }? I think the single > scalar value can be a constant as well. Fixed. > if (!def_stmt) > - return false; > + { > + if (gimple_nop_p (SSA_NAME_DEF_STMT (ce->value))) > > if (SSA_NAME_IS_DEFAULT_DEF (ce->value)) > > + { > > also you seem to disallow > > { i + 1, v[1], v[2], v[3] } Fixed by if (code != BIT_FIELD_REF) { /* Only allow one scalar insert. */ if (nscalars != 0) return false; nscalars = 1; insert = true; scalar_idx = i; sel.quick_push (i); scalar_element = ce->value; continue; } > because get_prop_source_stmt will return the definition computing > i + 1 in this case and your code will be skipped? > > I think you can simplify the code by treating scalar_element != NULL > as nscalars == 1 and eliding nscalars. It works only if TYPE_VECTOR_SUBPARTS (type).to_constant () == (nscalars + nvectors) We need to check both nscalars and nvectors. Elide nscalar check doesn't help much here. > - if (conv_code == ERROR_MARK) > + if (conv_code == ERROR_MARK && !insert) > gimple_assign_set_rhs_with_ops (gsi, VEC_PERM_EXPR, orig[0], > orig[1], op2); > else > @@ -2148,10 +2198,25 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi) > VEC_PERM_EXPR, orig[0], orig[1], op2); > orig[0] = gimple_assign_lhs (perm); > gsi_insert_before (gsi, perm, GSI_SAME_STMT); > - gimple_assign_set_rhs_with_ops (gsi, conv_code, orig[0], > + gimple_assign_set_rhs_with_ops (gsi, > + (conv_code != ERROR_MARK > + ? conv_code > + : NOP_EXPR), > + orig[0], > NULL_TREE, NULL_TREE); > > I believe you should elide the last stmt for conv_code == ERROR_MARK, > that is, why did you need to add the && !insert check in the guarding condition When conv_code == ERROR_MARK, we still need gimple *perm = gimple_build_assign (make_ssa_name (TREE_TYPE (orig[0])), VEC_PERM_EXPR, orig[0], orig[1], op2); orig[0] = gimple_assign_lhs (perm); gsi_insert_before (gsi, perm, GSI_SAME_STMT); gimple_assign_set_rhs_with_ops (gsi, NOP_EXPR, orig[0], NULL_TREE, NULL_TREE); Otherwise, scalar insert won't work. > (this path should already do the correct thing?). Note that in all > cases it looks > that with conv_code != ERROR_MARK you may end up doing a float->int > or int->float conversion on a value it wasn't done on before which might > raise exceptions? That is, do we need to make sure we permute a > value we already do convert into the place we're going to insert to? This couldn't happen: if (type == TREE_TYPE (ref)) { /* The RHS vector has the same type as LHS. */ if (rhs_vector == NULL) rhs_vector = ref; /* Check if all RHS vector elements come fome the same vector. */ if (rhs_vector == ref) nvectors++; } ... if (insert && (nvectors == 0 || (TYPE_VECTOR_SUBPARTS (type).to_constant () != (nscalars + nvectors)))) return false; > + if (insert) > + { > + /* Generate a single scalar insert. */ > + tree var = make_ssa_name (type); > + tree val = gimple_assign_rhs1 (stmt); > + gimple *copy = gimple_build_assign (var, val); > > I believe this doesn't properly copy the stmt in case it is a permute. > You can use (note the use of gsi_stmt - gimple_assign_set_rhs_with_ops > can re-allocate the stmt) > > gimple *copy = gimple_copy (gsi_stmt (*gsi)); > gimple_assign_set_lhs (copy, var); Fixed. > + gsi_insert_before (gsi, copy, GSI_SAME_STMT); > + tree bitpos = bitsize_int (scalar_idx * elem_size); > + gimple_assign_set_rhs_with_ops (gsi, BIT_INSERT_EXPR, var, > + scalar_element, bitpos); > + } > > Otherwise looks OK to me. > > As separate followup patch it might be interesting to support > > { 0, a[1], a[2], 3 } > > kinds as well, thus combining a VECTOR_CST (which is > reasonably cheap to create) with another vector. That should > be maybe done as a first patch given this is just a two-vector > permute which the code already handles apart from not > recognizing the implicit constant vector participating. > > Similar > > { 0, a[1], b[2], 3 } > > where the combination of a and b is blended with another > constant vector. I'm not sure if handling an arbitrary number > of scalar elements should be done in a similar way, that is, > implementing > > { s1, a[1], a[2], s2, s3, b[0], b[1], b[2] } > > as > > tem = VEC_PERM > tem2 = { s1, 0, 0, s2, s3, 0, 0, 0 } > res = VEC_PERM > > where constructing tem2 should take at most > N-1 inserts (the first element to insert into tem2 > can use a splat or if element zero a zero-extending move). > > Doing this effectively lifts the restriction of only > handling two vectors - we'd incrementally do > two-vector permute plus blend of the rest which has > its constructor re-processed. > > But as said - the code is already a bit awkward so changing > this in multiple reivisions is preferred and the single-element > case is certainly sth to do via a BIT_INSERT_EXPR. Agreed. I am testing this updated patch. -- H.J. --00000000000003a0bf05837759fb Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Optimize-vector-constructor.patch" Content-Disposition: attachment; filename="0001-Optimize-vector-constructor.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_jsxy3szm0 Content-length: 45380 RnJvbSA5MWUwNjBjMTNiM2Q3Mjk3NzJjNTMwNjQwZWUxZTY5MmQ4MDY2N2U5 IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiSC5KLiBMdSIgPGhq bC50b29sc0BnbWFpbC5jb20+CkRhdGU6IFR1ZSwgNSBGZWIgMjAxOSAxNToz OToyNyAtMDgwMApTdWJqZWN0OiBbUEFUQ0hdIE9wdGltaXplIHZlY3RvciBj b25zdHJ1Y3RvcgoKV2UgY2FuIG9wdGltaXplIHZlY3RvciBjb25zdHJ1Y3Rv ciB3aXRoIHZlY3RvciBjb3B5IG9yIHBlcm11dGUgZm9sbG93ZWQKYnkgYSBz aW5nbGUgc2NhbGFyIGluc2VydDoKCiAgX192NHNmIHk7CiAgX192NHNmIEQu MTkzMDsKICBmbG9hdCBfMTsKICBmbG9hdCBfMjsKICBmbG9hdCBfMzsKCiAg PGJiIDI+IDoKICBfMSA9IEJJVF9GSUVMRF9SRUYgPHhfOShEKSwgMzIsIDk2 PjsKICBfMiA9IEJJVF9GSUVMRF9SRUYgPHhfOShEKSwgMzIsIDY0PjsKICBf MyA9IEJJVF9GSUVMRF9SRUYgPHhfOShEKSwgMzIsIDMyPjsKICB5XzYgPSB7 Zl81KEQpLCBfMywgXzIsIF8xfTsKICByZXR1cm4geV82OwoKd2l0aAoKIF9f djRzZiB5OwogIF9fdjRzZiBELjE5MzA7CiAgZmxvYXQgXzE7CiAgZmxvYXQg XzI7CiAgZmxvYXQgXzM7CiAgdmVjdG9yKDQpIGZsb2F0IF84OwoKICA8YmIg Mj4gOgogIF8xID0gQklUX0ZJRUxEX1JFRiA8eF85KEQpLCAzMiwgOTY+Owog IF8yID0gQklUX0ZJRUxEX1JFRiA8eF85KEQpLCAzMiwgNjQ+OwogIF8zID0g QklUX0ZJRUxEX1JFRiA8eF85KEQpLCAzMiwgMzI+OwogIF84ID0geF85KEQp OwogIHlfNiA9IEJJVF9JTlNFUlRfRVhQUiA8eF85KEQpLCBmXzUoRCksIDAg KDMyIGJpdHMpPjsKICByZXR1cm4geV82OwoKZ2NjLwoKCVBSIHRyZWUtb3B0 aW1pemF0aW9uLzg4ODI4CgkqIHRyZWUtc3NhLWZvcndwcm9wLmMgKHNpbXBs aWZ5X3ZlY3Rvcl9jb25zdHJ1Y3Rvcik6IE9wdGltaXplCgl2ZWN0b3IgaW5p dCBjb25zdHJ1Y3RvciB3aXRoIHZlY3RvciBjb3B5IG9yIHBlcm11dGUgZm9s bG93ZWQKCWJ5IGEgc2luZ2xlIHNjYWxhciBpbnNlcnQuCgpnY2MvdGVzdHN1 aXRlLwoKCVBSIHRyZWUtb3B0aW1pemF0aW9uLzg4ODI4CgkqIGdjYy50YXJn ZXQvaTM4Ni9wcjg4ODI4LTEuYzogTmV3IHRlc3QuCgkqIGdjYy50YXJnZXQv aTM4Ni9wcjg4ODI4LTFhLmM6IExpa2V3aXNlLgoJKiBnY2MudGFyZ2V0L2kz ODYvcHI4ODgyOC0xYi5jOiBMaWtld2lzZS4KCSogZ2NjLnRhcmdldC9pMzg2 L3ByODg4MjgtMWMuYzogTGlrZXdpc2UuCgkqIGdjYy50YXJnZXQvaTM4Ni9w cjg4ODI4LTIuYzogTGlrZXdpc2UuCgkqIGdjYy50YXJnZXQvaTM4Ni9wcjg4 ODI4LTJhLmM6IExpa2V3aXNlLgoJKiBnY2MudGFyZ2V0L2kzODYvcHI4ODgy OC0yYi5jOiBMaWtld2lzZS4KCSogZ2NjLnRhcmdldC9pMzg2L3ByODg4Mjgt MmMuYzogTGlrZXdpc2UuCgkqIGdjYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTJk LmM6IExpa2V3aXNlLgoJKiBnY2MudGFyZ2V0L2kzODYvcHI4ODgyOC0zLmM6 IExpa2V3aXNlLgoJKiBnY2MudGFyZ2V0L2kzODYvcHI4ODgyOC0zYS5jOiBM aWtld2lzZS4KCSogZ2NjLnRhcmdldC9pMzg2L3ByODg4MjgtM2IuYzogTGlr ZXdpc2UuCgkqIGdjYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTNjLmM6IExpa2V3 aXNlLgoJKiBnY2MudGFyZ2V0L2kzODYvcHI4ODgyOC0zZC5jOiBMaWtld2lz ZS4KCSogZ2NjLnRhcmdldC9pMzg2L3ByODg4MjgtNGEuYzogTGlrZXdpc2Uu CgkqIGdjYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTRiLmM6IExpa2V3aXNlLgoJ KiBnY2MudGFyZ2V0L2kzODYvcHI4ODgyOC01YS5jOiBMaWtld2lzZS4KCSog Z2NjLnRhcmdldC9pMzg2L3ByODg4MjgtNWIuYzogTGlrZXdpc2UuCgkqIGdj Yy50YXJnZXQvaTM4Ni9wcjg4ODI4LTYuYzogTGlrZXdpc2UuCgkqIGdjYy50 YXJnZXQvaTM4Ni9wcjg4ODI4LTZhLmM6IExpa2V3aXNlLgoJKiBnY2MudGFy Z2V0L2kzODYvcHI4ODgyOC02Yi5jOiBMaWtld2lzZS4KCSogZ2NjLnRhcmdl dC9pMzg2L3ByODg4MjgtNy5jOiBMaWtld2lzZS4KCSogZ2NjLnRhcmdldC9p Mzg2L3ByODg4MjgtN2EuYzogTGlrZXdpc2UuCgkqIGdjYy50YXJnZXQvaTM4 Ni9wcjg4ODI4LTdiLmM6IExpa2V3aXNlLgoJKiBnY2MudGFyZ2V0L2kzODYv cHI4ODgyOC04LmM6IExpa2V3aXNlLgoJKiBnY2MudGFyZ2V0L2kzODYvcHI4 ODgyOC04YS5jOiBMaWtld2lzZS4KCSogZ2NjLnRhcmdldC9pMzg2L3ByODg4 MjgtOGIuYzogTGlrZXdpc2UuCi0tLQogZ2NjL3Rlc3RzdWl0ZS9nY2MudGFy Z2V0L2kzODYvcHI4ODgyOC0xLmMgIHwgNDkgKysrKysrKysrKysKIGdjYy90 ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4MjgtMWEuYyB8IDE3ICsr KysKIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4MjgtMWIu YyB8IDIzICsrKysrKwogZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYv cHI4ODgyOC0xYy5jIHwgMTggKysrKwogZ2NjL3Rlc3RzdWl0ZS9nY2MudGFy Z2V0L2kzODYvcHI4ODgyOC0yLmMgIHwgNTEgKysrKysrKysrKysrCiBnY2Mv dGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTJhLmMgfCAxNyAr KysrCiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTJi LmMgfCAxOSArKysrKwogZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYv cHI4ODgyOC0yYy5jIHwgMjMgKysrKysrCiBnY2MvdGVzdHN1aXRlL2djYy50 YXJnZXQvaTM4Ni9wcjg4ODI4LTJkLmMgfCAyNSArKysrKysKIGdjYy90ZXN0 c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4MjgtMy5jICB8IDU0ICsrKysr KysrKysrKwogZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgy OC0zYS5jIHwgMTcgKysrKwogZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kz ODYvcHI4ODgyOC0zYi5jIHwgMTkgKysrKysKIGdjYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9pMzg2L3ByODg4MjgtM2MuYyB8IDI1ICsrKysrKwogZ2NjL3Rl c3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC00YS5jIHwgMTggKysr KwogZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC00Yi5j IHwgMjEgKysrKysKIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3By ODg4MjgtNWEuYyB8IDE4ICsrKysKIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdl dC9pMzg2L3ByODg4MjgtNWIuYyB8IDIwICsrKysrCiBnY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTYuYyAgfCA0NyArKysrKysrKysr KwogZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC02YS5j IHwgMTYgKysrKwogZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4 ODgyOC02Yi5jIHwgMjIgKysrKysKIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdl dC9pMzg2L3ByODg4MjgtNy5jICB8IDUzICsrKysrKysrKysrKwogZ2NjL3Rl c3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC03YS5jIHwgMTYgKysr KwogZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC03Yi5j IHwgMjIgKysrKysKIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3By ODg4MjgtOC5jICB8IDQ2ICsrKysrKysrKysrCiBnY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvaTM4Ni9wcjg4ODI4LThhLmMgfCAxNSArKysrCiBnY2MvdGVz dHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LThiLmMgfCAyMSArKysr KwogZ2NjL3RyZWUtc3NhLWZvcndwcm9wLmMgICAgICAgICAgICAgICAgICAg IHwgOTYgKysrKysrKysrKysrKysrKysrKy0tLQogMjcgZmlsZXMgY2hhbmdl ZCwgNzc2IGluc2VydGlvbnMoKyksIDEyIGRlbGV0aW9ucygtKQogY3JlYXRl IG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3By ODg4MjgtMS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L2kzODYvcHI4ODgyOC0xYS5jCiBjcmVhdGUgbW9kZSAxMDA2 NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC0xYi5j CiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2kzODYvcHI4ODgyOC0xYy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rl c3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC0yLmMKIGNyZWF0ZSBt b2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4 ODI4LTJhLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvaTM4Ni9wcjg4ODI4LTJiLmMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTJjLmMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv aTM4Ni9wcjg4ODI4LTJkLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVz dHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTMuYwogY3JlYXRlIG1v ZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4 MjgtM2EuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9pMzg2L3ByODg4MjgtM2IuYwogY3JlYXRlIG1vZGUgMTAwNjQ0 IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4MjgtM2MuYwog Y3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9p Mzg2L3ByODg4MjgtNGEuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0 c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4MjgtNGIuYwogY3JlYXRlIG1v ZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4 MjgtNWEuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9pMzg2L3ByODg4MjgtNWIuYwogY3JlYXRlIG1vZGUgMTAwNjQ0 IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4MjgtNi5jCiBj cmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kz ODYvcHI4ODgyOC02YS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3Rz dWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC02Yi5jCiBjcmVhdGUgbW9k ZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgy OC03LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy50 YXJnZXQvaTM4Ni9wcjg4ODI4LTdhLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBn Y2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTdiLmMKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4 Ni9wcjg4ODI4LTguYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3Vp dGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4MjgtOGEuYwogY3JlYXRlIG1vZGUg MTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4Mjgt OGIuYwoKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9p Mzg2L3ByODg4MjgtMS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kz ODYvcHI4ODgyOC0xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAwMDAuLmExNWQxZmVhM2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC0xLmMKQEAgLTAs MCArMSw0OSBAQAorLyogeyBkZy1kbyBydW4geyB0YXJnZXQgc3NlMl9ydW50 aW1lIH0gfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLW1zc2UyIiB9ICov CisKKyNpbmNsdWRlICJwcjg4ODI4LTFhLmMiCisjaW5jbHVkZSAicHI4ODgy OC0xYi5jIgorI2luY2x1ZGUgInByODg4MjgtMWMuYyIKKworZXh0ZXJuIHZv aWQgYWJvcnQgKCk7CisKK3ZvaWQKK2RvX2NoZWNrIChfX3Y0c2YgeSwgZmxv YXQgZls0XSwgZmxvYXQgeikKK3sKKyAgaW50IGk7CisKKyAgZm9yIChpID0g MDsgaSA8IDQ7IGkrKykKKyAgICBpZiAoaSA9PSAwKQorICAgICAgeworCWlm ICh5W2ldICE9IHopCisJICBhYm9ydCAoKTsKKyAgICAgIH0KKyAgICBlbHNl CisgICAgICB7CisJaWYgKHlbaV0gIT0gZltpXSkKKwkgIGFib3J0ICgpOwor ICAgICAgfQorfQorCitpbnQKK21haW4gKHZvaWQpCit7CisgIGZsb2F0IGZb NF0gPSB7IC0xMSwgMiwgNTU1NTMsIC00IH07CisgIGZsb2F0IHogPSAxMzQ1 Njc7CisgIF9fdjRzZiB4ID0geyBmWzBdLCBmWzFdLCBmWzJdLCBmWzNdIH07 CisgIF9fdjRzZiB5OworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwg NDsgaSsrKQorICAgIGlmICh4W2ldICE9IGZbaV0pCisgICAgICBhYm9ydCAo KTsKKworICB5ID0gZm9vMSAoeCwgeik7CisgIGRvX2NoZWNrICh5LCBmLCB6 KTsKKyAgeSA9IGZvbzIgKHgsIHopOworICBkb19jaGVjayAoeSwgZiwgeik7 CisgIHkgPSBmb28zICh4LCB6KTsKKyAgZG9fY2hlY2sgKHksIGYsIHopOwor CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L2kzODYvcHI4ODgyOC0xYS5jIGIvZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L2kzODYvcHI4ODgyOC0xYS5jCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5kMzdiMjRjNjY2MQotLS0gL2Rldi9u dWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4 MjgtMWEuYwpAQCAtMCwwICsxLDE3IEBACisvKiB7IGRnLWRvIGNvbXBpbGUg fSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLW1zc2UgLW1uby1zc2U0IiB9 ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXIgIm1vdnNzIiB9 IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgIm1v dmFwcyIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXIt bm90ICJtb3ZsaHBzIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFz c2VtYmxlci1ub3QgInVucGNrbHBzIiB9IH0gKi8KKy8qIHsgZGctZmluYWwg eyBzY2FuLWFzc2VtYmxlci1ub3QgInNodWZwcyIgfSB9ICovCisKK3R5cGVk ZWYgZmxvYXQgX192NHNmIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXpl X18gKDE2KSkpOworCitfX2F0dHJpYnV0ZV9fKChub2lubGluZSwgbm9jbG9u ZSkpCitfX3Y0c2YKK2ZvbzEgKF9fdjRzZiB4LCBmbG9hdCBmKQoreworICBf X3Y0c2YgeSA9IHsgZiwgeFsxXSwgeFsyXSwgeFszXSB9OworICByZXR1cm4g eTsKK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9p Mzg2L3ByODg4MjgtMWIuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9p Mzg2L3ByODg4MjgtMWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMDAwMC4uYWY0YWNlZDY1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9n Y2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTFiLmMKQEAg LTAsMCArMSwyMyBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsg ZGctb3B0aW9ucyAiLU8yIC1tc3NlIC1tbm8tc3NlNCIgfSAqLworLyogeyBk Zy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyICJtb3ZzcyIgfSB9ICovCisvKiB7 IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJtb3ZhcHMiIH0gfSAq LworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAibW92bGhw cyIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90 ICJ1bnBja2xwcyIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3Nl bWJsZXItbm90ICJzaHVmcHMiIH0gfSAqLworCit0eXBlZGVmIGZsb2F0IF9f djRzZiBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgxNikpKTsK Kworc3RhdGljIF9fdjRzZgordmVjdG9yX2luaXQgKGZsb2F0IGYwLGZsb2F0 IGYxLCBmbG9hdCBmMixmbG9hdCBmMykKK3sKKyAgX192NHNmIHkgPSB7IGYw LCBmMSwgZjIsIGYzIH07CisgICByZXR1cm4geTsKK30KKworX19hdHRyaWJ1 dGVfXygobm9pbmxpbmUsIG5vY2xvbmUpKQorX192NHNmCitmb28yIChfX3Y0 c2YgeCwgZmxvYXQgZikKK3sKKyAgcmV0dXJuIHZlY3Rvcl9pbml0IChmLCB4 WzFdLCB4WzJdLCB4WzNdKSA7Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTFjLmMgYi9nY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTFjLmMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmExMTdmM2VjN2IxCi0tLSAv ZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYv cHI4ODgyOC0xYy5jCkBAIC0wLDAgKzEsMTggQEAKKy8qIHsgZGctZG8gY29t cGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtbXNzZSAtbW5vLXNz ZTQiIH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlciAibW92 c3MiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5v dCAibW92YXBzIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2Vt Ymxlci1ub3QgIm1vdmxocHMiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNj YW4tYXNzZW1ibGVyLW5vdCAidW5wY2tscHMiIH0gfSAqLworLyogeyBkZy1m aW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAic2h1ZnBzIiB9IH0gKi8KKwor dHlwZWRlZiBmbG9hdCBfX3Y0c2YgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9y X3NpemVfXyAoMTYpKSk7CisKK19fYXR0cmlidXRlX18oKG5vaW5saW5lLCBu b2Nsb25lKSkKK19fdjRzZgorZm9vMyAoX192NHNmIHgsIGZsb2F0IGYpCit7 CisgIF9fdjRzZiB5ID0geDsKKyAgeVswXSA9IGY7CisgIHJldHVybiB5Owor fQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYv cHI4ODgyOC0yLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9w cjg4ODI4LTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAwMC4uMDExZmQ0ODZiYjEKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVz dHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTIuYwpAQCAtMCwwICsx LDUxIEBACisvKiB7IGRnLWRvIHJ1biB7IHRhcmdldCBzc2UyX3J1bnRpbWUg fSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtbXNzZTIiIH0gKi8KKwor I2luY2x1ZGUgInByODg4MjgtMmEuYyIKKyNpbmNsdWRlICJwcjg4ODI4LTJj LmMiCisKK2V4dGVybiB2b2lkIGFib3J0ICgpOworCit2b2lkCitkb19jaGVj ayAoX192NHNmIHksIGZsb2F0IGZbNF0sIGZsb2F0IHopCit7CisgIGludCBp OworCisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgaWYgKGkgPT0g MCkKKyAgICAgIHsKKwlpZiAoeVtpXSAhPSB6KQorCSAgYWJvcnQgKCk7Cisg ICAgICB9CisgICAgZWxzZSBpZiAoaSA9PSAxKQorICAgICAgeworCWlmICh5 W2ldICE9IGZbMF0pCisJICBhYm9ydCAoKTsKKyAgICAgIH0KKyAgICBlbHNl CisgICAgICB7CisJaWYgKHlbaV0gIT0gZltpXSkKKwkgIGFib3J0ICgpOwor ICAgICAgfQorfQorCitpbnQKK21haW4gKHZvaWQpCit7CisgIGZsb2F0IGZb NF0gPSB7IC0xMSwgMiwgNTU1NTMsIC00IH07CisgIGZsb2F0IHogPSAxMzQ1 Njc7CisgIF9fdjRzZiB4ID0geyBmWzBdLCBmWzFdLCBmWzJdLCBmWzNdIH07 CisgIF9fdjRzZiB5OworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwg NDsgaSsrKQorICAgIGlmICh4W2ldICE9IGZbaV0pCisgICAgICBhYm9ydCAo KTsKKworICB5ID0gZm9vMSAoeCwgeik7CisgIGRvX2NoZWNrICh5LCBmLCB6 KTsKKyAgeSA9IGZvbzIgKHgsIHopOworICBkb19jaGVjayAoeSwgZiwgeik7 CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTJhLmMgYi9nY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTJhLmMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjg1ZTQ5NTM1ZWJkCi0tLSAvZGV2 L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4 ODgyOC0yYS5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIHsgZGctZG8gY29tcGls ZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtbXNzZSAtbW5vLXNzZTQi IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlciAibW92c3Mi IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVz ICJzaHVmcHMiIDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3Nl bWJsZXItbm90ICJtb3ZhcHMiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNj YW4tYXNzZW1ibGVyLW5vdCAibW92bGhwcyIgfSB9ICovCisvKiB7IGRnLWZp bmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJ1bnBja2xwcyIgfSB9ICovCisK K3R5cGVkZWYgZmxvYXQgX192NHNmIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rv cl9zaXplX18gKDE2KSkpOworCitfX2F0dHJpYnV0ZV9fKChub2lubGluZSwg bm9jbG9uZSkpCitfX3Y0c2YKK2ZvbzEgKF9fdjRzZiB4LCBmbG9hdCBmKQor eworICBfX3Y0c2YgeSA9IHsgZiwgeFswXSwgeFsyXSwgeFszXSB9OworICBy ZXR1cm4geTsKK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRh cmdldC9pMzg2L3ByODg4MjgtMmIuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRh cmdldC9pMzg2L3ByODg4MjgtMmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMC4uYWRmZDcwMDJhNGQKLS0tIC9kZXYvbnVsbAor KysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTJi LmMKQEAgLTAsMCArMSwxOSBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8K Ky8qIHsgZGctb3B0aW9ucyAiLU8yIC1tYXZ4IiB9ICovCisvKiB7IGRnLWZp bmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInZwZXJtaWxwcyIgMSB9IH0g Ki8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidm1v dnNzIiAxIHsgdGFyZ2V0IHsgISBpYTMyIH0gfSB9IH0gKi8KKy8qIHsgZGct ZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidnBpbnNyZCIgMSB7IHRh cmdldCBpYTMyIH0gfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3Nl bWJsZXItbm90ICJ2bW92c3MiIHsgdGFyZ2V0IGlhMzIgfSB9IH0gKi8KKy8q IHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgInZtb3ZhcHMiIH0g fSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAidm1v dmxocHMiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVy LW5vdCAidnVucGNrbHBzIiB9IH0gKi8KKwordHlwZWRlZiBmbG9hdCBfX3Y0 c2YgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMTYpKSk7CisK K19fYXR0cmlidXRlX18oKG5vaW5saW5lLCBub2Nsb25lKSkKK19fdjRzZgor Zm9vMSAoX192NHNmIHgsIGZsb2F0IGYpCit7CisgIF9fdjRzZiB5ID0geyBm LCB4WzBdLCB4WzJdLCB4WzNdIH07CisgIHJldHVybiB5OworfQpkaWZmIC0t Z2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC0y Yy5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC0y Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4x NDk5NjdlYTBiOQotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUv Z2NjLnRhcmdldC9pMzg2L3ByODg4MjgtMmMuYwpAQCAtMCwwICsxLDIzIEBA CisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICIt TzIgLW1zc2UgLW1uby1zc2U0IiB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi1hc3NlbWJsZXIgIm1vdnNzIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBz Y2FuLWFzc2VtYmxlci10aW1lcyAic2h1ZnBzIiAxIH0gfSAqLworLyogeyBk Zy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAibW92YXBzIiB9IH0gKi8K Ky8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgIm1vdmxocHMi IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAi dW5wY2tscHMiIH0gfSAqLworCit0eXBlZGVmIGZsb2F0IF9fdjRzZiBfX2F0 dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgxNikpKTsKKworc3RhdGlj IF9fdjRzZgordmVjdG9yX2luaXQgKGZsb2F0IGYwLGZsb2F0IGYxLCBmbG9h dCBmMixmbG9hdCBmMykKK3sKKyAgX192NHNmIHkgPSB7IGYwLCBmMSwgZjIs IGYzIH07CisgICByZXR1cm4geTsKK30KKworX19hdHRyaWJ1dGVfXygobm9p bmxpbmUsIG5vY2xvbmUpKQorX192NHNmCitmb28yIChfX3Y0c2YgeCwgZmxv YXQgZikKK3sKKyAgcmV0dXJuIHZlY3Rvcl9pbml0IChmLCB4WzBdLCB4WzJd LCB4WzNdKSA7Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50 YXJnZXQvaTM4Ni9wcjg4ODI4LTJkLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50 YXJnZXQvaTM4Ni9wcjg4ODI4LTJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMDAuLjIxMDg4NDk2NzMwCi0tLSAvZGV2L251bGwK KysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC0y ZC5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICov CisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtbWF2eCIgfSAqLworLyogeyBkZy1m aW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2cGVybWlscHMiIDEgfSB9 ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInZt b3ZzcyIgMSB7IHRhcmdldCB7ICEgaWEzMiB9IH0gfSB9ICovCisvKiB7IGRn LWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInZwaW5zcmQiIDEgeyB0 YXJnZXQgaWEzMiB9IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNz ZW1ibGVyLW5vdCAidm1vdnNzIiB7IHRhcmdldCBpYTMyIH0gfSB9ICovCisv KiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJ2bW92YXBzIiB9 IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgInZt b3ZsaHBzIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxl ci1ub3QgInZ1bnBja2xwcyIgfSB9ICovCisKK3R5cGVkZWYgZmxvYXQgX192 NHNmIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18gKDE2KSkpOwor CitzdGF0aWMgX192NHNmCit2ZWN0b3JfaW5pdCAoZmxvYXQgZjAsZmxvYXQg ZjEsIGZsb2F0IGYyLGZsb2F0IGYzKQoreworICBfX3Y0c2YgeSA9IHsgZjAs IGYxLCBmMiwgZjMgfTsKKyAgIHJldHVybiB5OworfQorCitfX2F0dHJpYnV0 ZV9fKChub2lubGluZSwgbm9jbG9uZSkpCitfX3Y0c2YKK2ZvbyAoX192NHNm IHgsIGZsb2F0IGYpCit7CisgIHJldHVybiB2ZWN0b3JfaW5pdCAoZiwgeFsw XSwgeFsyXSwgeFszXSkgOworfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0 ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC0zLmMgYi9nY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTMuYwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYWRiYzQ2ZGJmM2IKLS0tIC9kZXYv bnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4 ODI4LTMuYwpAQCAtMCwwICsxLDU0IEBACisvKiB7IGRnLWRvIHJ1biB7IHRh cmdldCBzc2UyX3J1bnRpbWUgfSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1P MiAtbXNzZTIiIH0gKi8KKworI2luY2x1ZGUgInByODg4MjgtM2EuYyIKKyNp bmNsdWRlICJwcjg4ODI4LTNiLmMiCisjaW5jbHVkZSAicHI4ODgyOC0zYy5j IgorCitleHRlcm4gdm9pZCBhYm9ydCAoKTsKKwordm9pZAorZG9fY2hlY2sg KF9fdjRzZiB5LCBmbG9hdCBmWzRdLCBmbG9hdCB6KQoreworICBpbnQgaTsK KworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIGlmIChpID09IDMp CisgICAgICB7CisJaWYgKHlbaV0gIT0geikKKwkgIGFib3J0ICgpOworICAg ICAgfQorICAgIGVsc2UgaWYgKGkgPT0gMCkKKyAgICAgIHsKKwlpZiAoeVtp XSAhPSBmW2ldKQorCSAgYWJvcnQgKCk7CisgICAgICB9CisgICAgZWxzZQor ICAgICAgeworCWlmICh5W2ldICE9IGZbaSArIDFdKQorCSAgYWJvcnQgKCk7 CisgICAgICB9Cit9CisKK2ludAorbWFpbiAodm9pZCkKK3sKKyAgZmxvYXQg Zls0XSA9IHsgLTExLCAyLCA1NTU1MywgLTQgfTsKKyAgZmxvYXQgeiA9IDEz NDU2NzsKKyAgX192NHNmIHggPSB7IGZbMF0sIGZbMV0sIGZbMl0sIGZbM10g fTsKKyAgX192NHNmIHk7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkg PCA0OyBpKyspCisgICAgaWYgKHhbaV0gIT0gZltpXSkKKyAgICAgIGFib3J0 ICgpOworCisgIHkgPSBmb28xICh4LCB6KTsKKyAgZG9fY2hlY2sgKHksIGYs IHopOworICB5ID0gZm9vMiAoeCwgeik7CisgIGRvX2NoZWNrICh5LCBmLCB6 KTsKKyAgeSA9IGZvbzMgKHgsIHopOworICBkb19jaGVjayAoeSwgZiwgeik7 CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTNhLmMgYi9nY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTNhLmMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmU1Y2I5NWMxMjc1Ci0tLSAvZGV2 L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4 ODgyOC0zYS5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIHsgZGctZG8gY29tcGls ZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtbXNzZSAtbW5vLXNzZTQi IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlciAibW92c3Mi IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVz ICJzaHVmcHMiIDIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3Nl bWJsZXItdGltZXMgIm1vdmFwcyIgMSB9IH0gKi8KKy8qIHsgZGctZmluYWwg eyBzY2FuLWFzc2VtYmxlci1ub3QgIm1vdmxocHMiIH0gfSAqLworLyogeyBk Zy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAidW5wY2tscHMiIH0gfSAq LworCit0eXBlZGVmIGZsb2F0IF9fdjRzZiBfX2F0dHJpYnV0ZV9fICgoX192 ZWN0b3Jfc2l6ZV9fICgxNikpKTsKKworX19hdHRyaWJ1dGVfXygobm9pbmxp bmUsIG5vY2xvbmUpKQorX192NHNmCitmb28xIChfX3Y0c2YgeCwgZmxvYXQg ZikKK3sKKyAgX192NHNmIHkgPSB7IHhbMF0sIHhbMl0sIHhbM10sIGYgfTsK KyAgcmV0dXJuIHk7Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvaTM4Ni9wcjg4ODI4LTNiLmMgYi9nY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvaTM4Ni9wcjg4ODI4LTNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMDAuLjAzNDlmMzViMDhhCi0tLSAvZGV2L251 bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgy OC0zYi5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9 ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtbWF2eCIgfSAqLworLyogeyBk Zy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2cGVybWlscHMiIDEg fSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMg InZpbnNlcnRwcyIgMSB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFz c2VtYmxlci1ub3QgInZtb3ZzcyIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsg c2Nhbi1hc3NlbWJsZXItbm90ICJ2c2h1ZnBzIiB9IH0gKi8KKy8qIHsgZGct ZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgInZtb3ZhcHMiIH0gfSAqLwor LyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAidm1vdmxocHMi IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAi dnVucGNrbHBzIiB9IH0gKi8KKwordHlwZWRlZiBmbG9hdCBfX3Y0c2YgX19h dHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMTYpKSk7CisKK19fYXR0 cmlidXRlX18oKG5vaW5saW5lLCBub2Nsb25lKSkKK19fdjRzZgorZm9vMiAo X192NHNmIHgsIGZsb2F0IGYpCit7CisgIF9fdjRzZiB5ID0geyB4WzBdLCB4 WzJdLCB4WzNdLCBmIH07CisgIHJldHVybiB5OworfQpkaWZmIC0tZ2l0IGEv Z2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC0zYy5jIGIv Z2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC0zYy5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5mYjY2OGE1 NWYxZAotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRh cmdldC9pMzg2L3ByODg4MjgtM2MuYwpAQCAtMCwwICsxLDI1IEBACisvKiB7 IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLW1h dngiIH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1l cyAidnBlcm1pbHBzIiAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4t YXNzZW1ibGVyLXRpbWVzICJ2aW5zZXJ0cHMiIDEgfSB9ICovCisvKiB7IGRn LWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJ2bW92c3MiIH0gfSAqLwor LyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAidnNodWZwcyIg fSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJ2 bW92YXBzIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxl ci1ub3QgInZtb3ZsaHBzIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2Fu LWFzc2VtYmxlci1ub3QgInZ1bnBja2xwcyIgfSB9ICovCisKK3R5cGVkZWYg ZmxvYXQgX192NHNmIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18g KDE2KSkpOworCitzdGF0aWMgX192NHNmCit2ZWN0b3JfaW5pdCAoZmxvYXQg ZjAsZmxvYXQgZjEsIGZsb2F0IGYyLGZsb2F0IGYzKQoreworICBfX3Y0c2Yg eSA9IHsgZjAsIGYxLCBmMiwgZjMgfTsKKyAgIHJldHVybiB5OworfQorCitf X2F0dHJpYnV0ZV9fKChub2lubGluZSwgbm9jbG9uZSkpCitfX3Y0c2YKK2Zv bzMgKF9fdjRzZiB4LCBmbG9hdCBmKQoreworICByZXR1cm4gdmVjdG9yX2lu aXQgKHhbMF0sIHhbMl0sIHhbM10sIGYpOworfQpkaWZmIC0tZ2l0IGEvZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC00YS5jIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC00YS5jCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi42NDA0M2I5ODU1 ZgotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdl dC9pMzg2L3ByODg4MjgtNGEuYwpAQCAtMCwwICsxLDE4IEBACisvKiB7IGRn LWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLW1zc2Ug LW1uby1zc2U0IiB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJs ZXIgIm1vdnNzIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2Vt Ymxlci10aW1lcyAic2h1ZnBzIiAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7 IHNjYW4tYXNzZW1ibGVyLW5vdCAibW92YXBzIiB9IH0gKi8KKy8qIHsgZGct ZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgIm1vdmxocHMiIH0gfSAqLwor LyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAidW5wY2tscHMi IH0gfSAqLworCit0eXBlZGVmIGZsb2F0IF9fdjRzZiBfX2F0dHJpYnV0ZV9f ICgoX192ZWN0b3Jfc2l6ZV9fICgxNikpKTsKKworX19hdHRyaWJ1dGVfXygo bm9pbmxpbmUsIG5vY2xvbmUpKQorX192NHNmCitmb28gKF9fdjRzZiB4LCBm bG9hdCBmKQoreworICBfX3Y0c2YgeSA9IHsgeFswXSwgeFsyXSwgeFszXSwg eFsxXSB9OworICB5WzBdID0gZjsKKyAgcmV0dXJuIHk7Cit9CmRpZmYgLS1n aXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTRi LmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTRi LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmFk OGQyYjk4NWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L2kzODYvcHI4ODgyOC00Yi5jCkBAIC0wLDAgKzEsMjEgQEAK Ky8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1P MiAtbWF2eCIgfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVy LXRpbWVzICJ2cGVybWlscHMiIDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsg c2Nhbi1hc3NlbWJsZXItdGltZXMgInZtb3ZzcyIgMSB7IHRhcmdldCB7ICEg aWEzMiB9IH0gfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJs ZXItdGltZXMgInZwaW5zcmQiIDEgeyB0YXJnZXQgaWEzMiB9IH0gfSAqLwor LyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAidm1vdnNzIiB7 IHRhcmdldCBpYTMyIH0gfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1h c3NlbWJsZXItbm90ICJ2c2h1ZnBzIiB9IH0gKi8KKy8qIHsgZGctZmluYWwg eyBzY2FuLWFzc2VtYmxlci1ub3QgInZtb3ZhcHMiIH0gfSAqLworLyogeyBk Zy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAidm1vdmxocHMiIH0gfSAq LworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAidnVucGNr bHBzIiB9IH0gKi8KKwordHlwZWRlZiBmbG9hdCBfX3Y0c2YgX19hdHRyaWJ1 dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMTYpKSk7CisKK19fYXR0cmlidXRl X18oKG5vaW5saW5lLCBub2Nsb25lKSkKK19fdjRzZgorZm9vIChfX3Y0c2Yg eCwgZmxvYXQgZikKK3sKKyAgX192NHNmIHkgPSB7IHhbMF0sIHhbMl0sIHhb M10sIHhbMV0gfTsKKyAgeVswXSA9IGY7CisgIHJldHVybiB5OworfQpkaWZm IC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgy OC01YS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgy OC01YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw Li41ZTkwOGZhZWY1YwotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3Vp dGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4MjgtNWEuYwpAQCAtMCwwICsxLDE4 IEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25z ICItTzIgLW1zc2UgLW1uby1zc2U0IiB9ICovCisvKiB7IGRnLWZpbmFsIHsg c2Nhbi1hc3NlbWJsZXIgIm1vdnNzIiB9IH0gKi8KKy8qIHsgZGctZmluYWwg eyBzY2FuLWFzc2VtYmxlci10aW1lcyAic2h1ZnBzIiAyIH0gfSAqLworLyog eyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJtb3ZhcHMiIDEg fSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJt b3ZsaHBzIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxl ci1ub3QgInVucGNrbHBzIiB9IH0gKi8KKwordHlwZWRlZiBmbG9hdCBfX3Y0 c2YgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMTYpKSk7CisK K19fYXR0cmlidXRlX18oKG5vaW5saW5lLCBub2Nsb25lKSkKK19fdjRzZgor Zm9vIChfX3Y0c2YgeCwgZmxvYXQgZikKK3sKKyAgX192NHNmIHkgPSB7IHhb MF0sIHhbMl0sIHhbM10sIHhbMF0gfTsKKyAgeVszXSA9IGY7CisgIHJldHVy biB5OworfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2kzODYvcHI4ODgyOC01Yi5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2kzODYvcHI4ODgyOC01Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAwLi45ODhhNDg4MjNlNgotLS0gL2Rldi9udWxsCisrKyBi L2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4MjgtNWIuYwpA QCAtMCwwICsxLDIwIEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyog eyBkZy1vcHRpb25zICItTzIgLW1hdngiIH0gKi8KKy8qIHsgZGctZmluYWwg eyBzY2FuLWFzc2VtYmxlci10aW1lcyAidnBlcm1pbHBzIiAxIH0gfSAqLwor LyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2aW5zZXJ0 cHMiIDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXIt bm90ICJ2c2h1ZnBzIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFz c2VtYmxlci1ub3QgInZtb3ZzcyIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsg c2Nhbi1hc3NlbWJsZXItbm90ICJ2bW92YXBzIiB9IH0gKi8KKy8qIHsgZGct ZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgInZtb3ZsaHBzIiB9IH0gKi8K Ky8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgInZ1bnBja2xw cyIgfSB9ICovCisKK3R5cGVkZWYgZmxvYXQgX192NHNmIF9fYXR0cmlidXRl X18gKChfX3ZlY3Rvcl9zaXplX18gKDE2KSkpOworCitfX2F0dHJpYnV0ZV9f KChub2lubGluZSwgbm9jbG9uZSkpCitfX3Y0c2YKK2ZvbyAoX192NHNmIHgs IGZsb2F0IGYpCit7CisgIF9fdjRzZiB5ID0geyB4WzBdLCB4WzJdLCB4WzNd LCB4WzBdIH07CisgIHlbM10gPSBmOworICByZXR1cm4geTsKK30KZGlmZiAt LWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4Mjgt Ni5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC02 LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjhk OTIwMzk2ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L2kzODYvcHI4ODgyOC02LmMKQEAgLTAsMCArMSw0NyBAQAor LyogeyBkZy1kbyBydW4geyB0YXJnZXQgc3NlMl9ydW50aW1lIH0gfSAqLwor LyogeyBkZy1vcHRpb25zICItTzIgLW1zc2UyIiB9ICovCisKKyNpbmNsdWRl ICJwcjg4ODI4LTZhLmMiCisjaW5jbHVkZSAicHI4ODgyOC02Yi5jIgorCitl eHRlcm4gdm9pZCBhYm9ydCAoKTsKKwordm9pZAorZG9fY2hlY2sgKF9fdjRz ZiB4LCBmbG9hdCBmMVs0XSwgZmxvYXQgZjJbNF0pCit7CisgIGludCBpOwor CisgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgaWYgKGkgPT0gMCkK KyAgICAgIHsKKwlpZiAoeFtpXSAhPSAoZjFbaV0gKyBmMltpXSkpCisJICBh Ym9ydCAoKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJaWYgKHhb aV0gIT0gZjFbaV0pCisJICBhYm9ydCAoKTsKKyAgICAgIH0KK30KKworaW50 CittYWluICh2b2lkKQoreworICBmbG9hdCBmMVs0XSA9IHsgLTExLCAyLCA1 NTU1MywgLTQgfTsKKyAgZmxvYXQgZjJbNF0gPSB7IDExMSwgMy4zLCAtNTUu NTUzLCA0LjggfTsKKyAgX192NHNmIHggPSB7IGYxWzBdLCBmMVsxXSwgZjFb Ml0sIGYxWzNdIH07CisgIF9fdjRzZiB5ID0geyBmMlswXSwgZjJbMV0sIGYy WzJdLCBmMlszXSB9OworICBfX3Y0c2YgejsKKyAgaW50IGk7CisKKyAgZm9y IChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICBpZiAoeFtpXSAhPSBmMVtpXSB8 fCB5W2ldICE9IGYyW2ldICkKKyAgICAgIGFib3J0ICgpOworCisgIHogPSBm b28xICh4LCB5KTsKKyAgZG9fY2hlY2sgKHosIGYxLCBmMik7CisgIHggPSBm b28yICh4LCB5KTsKKyAgZG9fY2hlY2sgKHosIGYxLCBmMik7CisKKyAgcmV0 dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJn ZXQvaTM4Ni9wcjg4ODI4LTZhLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJn ZXQvaTM4Ni9wcjg4ODI4LTZhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAuLjQwOTRmMjVhMWZiCi0tLSAvZGV2L251bGwKKysr IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC02YS5j CkBAIC0wLDAgKzEsMTYgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisv KiB7IGRnLW9wdGlvbnMgIi1PMiAtbXNzZSAtbW5vLXNzZTQiIH0gKi8KKy8q IHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlciAiYWRkc3MiIH0gfSAqLwor LyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAibW92bGhwcyIg fSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJ1 bnBja2hwcyIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJs ZXItbm90ICJ1bnBja2xwcyIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi1hc3NlbWJsZXItbm90ICJzaHVmcHMiIH0gfSAqLworCit0eXBlZGVmIGZs b2F0IF9fdjRzZiBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgx NikpKTsKKworX192NHNmCitmb28xIChfX3Y0c2YgeCwgX192NHNmIHkpCit7 CisgIF9fdjRzZiB6ID0geyB4WzBdICsgeVswXSwgeFsxXSwgeFsyXSwgeFsz XSB9OworICByZXR1cm4gejsKK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3Vp dGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4MjgtNmIuYyBiL2djYy90ZXN0c3Vp dGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4MjgtNmIuYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYTQyM2EwODk5NjMKLS0tIC9k ZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9w cjg4ODI4LTZiLmMKQEAgLTAsMCArMSwyMiBAQAorLyogeyBkZy1kbyBjb21w aWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1tc3NlIC1tbm8tc3Nl NCIgfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyICJhZGRz cyIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90 ICJtb3ZsaHBzIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2Vt Ymxlci1ub3QgInVucGNraHBzIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBz Y2FuLWFzc2VtYmxlci1ub3QgInVucGNrbHBzIiB9IH0gKi8KKy8qIHsgZGct ZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgInNodWZwcyIgfSB9ICovCisK K3R5cGVkZWYgZmxvYXQgX192NHNmIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rv cl9zaXplX18gKDE2KSkpOworCitzdGF0aWMgX192NHNmCit2ZWN0b3JfaW5p dCAoZmxvYXQgZjAsZmxvYXQgZjEsIGZsb2F0IGYyLGZsb2F0IGYzKQorewor ICBfX3Y0c2YgeSA9IHsgZjAsIGYxLCBmMiwgZjMgfTsKKyAgIHJldHVybiB5 OworfQorCitfX3Y0c2YKK2ZvbzIgKF9fdjRzZiB4LCBfX3Y0c2YgeSkKK3sK KyAgcmV0dXJuIHZlY3Rvcl9pbml0ICh4WzBdICsgeVswXSwgeFsxXSwgeFsy XSwgeFszXSkgOworfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2Mu dGFyZ2V0L2kzODYvcHI4ODgyOC03LmMgYi9nY2MvdGVzdHN1aXRlL2djYy50 YXJnZXQvaTM4Ni9wcjg4ODI4LTcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMC4uNDcxMDI4ZDQxN2QKLS0tIC9kZXYvbnVsbAor KysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LTcu YwpAQCAtMCwwICsxLDUzIEBACisvKiB7IGRnLWRvIHJ1biB7IHRhcmdldCBz c2UyX3J1bnRpbWUgfSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtbXNz ZTIiIH0gKi8KKworI2luY2x1ZGUgInByODg4MjgtN2EuYyIKKyNpbmNsdWRl ICJwcjg4ODI4LTdiLmMiCisKK2V4dGVybiB2b2lkIGFib3J0ICgpOworCitm bG9hdAorYmFyIChmbG9hdCB4LCBmbG9hdCB5KQoreworICByZXR1cm4geCAv IHkgLSB5ICogeDsKK30KKwordm9pZAorZG9fY2hlY2sgKF9fdjRzZiB4LCBm bG9hdCBmMVs0XSwgZmxvYXQgZjJbNF0pCit7CisgIGludCBpOworCisgIGZv ciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgaWYgKGkgPT0gMCkKKyAgICAg IHsKKwlpZiAoeFtpXSAhPSBiYXIgKGYxW2ldLCBmMltpXSkpCisJICBhYm9y dCAoKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisJaWYgKHhbaV0g IT0gZjFbaV0pCisJICBhYm9ydCAoKTsKKyAgICAgIH0KK30KKworaW50Citt YWluICh2b2lkKQoreworICBmbG9hdCBmMVs0XSA9IHsgLTExLCAyLCA1NTU1 MywgLTQgfTsKKyAgZmxvYXQgZjJbNF0gPSB7IDExMSwgMy4zLCAtNTUuNTUz LCA0LjggfTsKKyAgX192NHNmIHggPSB7IGYxWzBdLCBmMVsxXSwgZjFbMl0s IGYxWzNdIH07CisgIF9fdjRzZiB5ID0geyBmMlswXSwgZjJbMV0sIGYyWzJd LCBmMlszXSB9OworICBfX3Y0c2YgejsKKyAgaW50IGk7CisKKyAgZm9yIChp ID0gMDsgaSA8IDQ7IGkrKykKKyAgICBpZiAoeFtpXSAhPSBmMVtpXSB8fCB5 W2ldICE9IGYyW2ldICkKKyAgICAgIGFib3J0ICgpOworCisgIHogPSBmb28x ICh4LCB5KTsKKyAgZG9fY2hlY2sgKHosIGYxLCBmMik7CisgIHggPSBmb28y ICh4LCB5KTsKKyAgZG9fY2hlY2sgKHosIGYxLCBmMik7CisKKyAgcmV0dXJu IDA7Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv aTM4Ni9wcjg4ODI4LTdhLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv aTM4Ni9wcjg4ODI4LTdhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMDAuLmYxYWU1NzQyMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIv Z2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC03YS5jCkBA IC0wLDAgKzEsMTYgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7 IGRnLW9wdGlvbnMgIi1PMiAtbXNzZSAtbW5vLXNzZTQiIH0gKi8KKy8qIHsg ZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgIm1vdmxocHMiIH0gfSAq LworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAidW5wY2to cHMiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5v dCAidW5wY2tscHMiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNz ZW1ibGVyLW5vdCAic2h1ZnBzIiB9IH0gKi8KKwordHlwZWRlZiBmbG9hdCBf X3Y0c2YgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMTYpKSk7 CitleHRlcm4gZmxvYXQgYmFyIChmbG9hdCwgZmxvYXQpOworCitfX3Y0c2YK K2ZvbzEgKF9fdjRzZiB4LCBfX3Y0c2YgeSkKK3sKKyAgX192NHNmIHogPSB7 IGJhciAoeFswXSwgeVswXSksIHhbMV0sIHhbMl0sIHhbM10gfTsKKyAgcmV0 dXJuIHo7Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJn ZXQvaTM4Ni9wcjg4ODI4LTdiLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJn ZXQvaTM4Ni9wcjg4ODI4LTdiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAuLmMwMjdjNTY5NDhkCi0tLSAvZGV2L251bGwKKysr IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC03Yi5j CkBAIC0wLDAgKzEsMjIgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisv KiB7IGRnLW9wdGlvbnMgIi1PMiAtbXNzZSAtbW5vLXNzZTQiIH0gKi8KKy8q IHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgIm1vdmxocHMiIH0g fSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAidW5w Y2tocHMiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVy LW5vdCAidW5wY2tscHMiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4t YXNzZW1ibGVyLW5vdCAic2h1ZnBzIiB9IH0gKi8KKwordHlwZWRlZiBmbG9h dCBfX3Y0c2YgX19hdHRyaWJ1dGVfXyAoKF9fdmVjdG9yX3NpemVfXyAoMTYp KSk7CitleHRlcm4gZmxvYXQgYmFyIChmbG9hdCwgZmxvYXQpOworCitzdGF0 aWMgX192NHNmCit2ZWN0b3JfaW5pdCAoZmxvYXQgZjAsZmxvYXQgZjEsIGZs b2F0IGYyLGZsb2F0IGYzKQoreworICBfX3Y0c2YgeSA9IHsgZjAsIGYxLCBm MiwgZjMgfTsKKyAgIHJldHVybiB5OworfQorCitfX3Y0c2YKK2ZvbzIgKF9f djRzZiB4LCBfX3Y0c2YgeSkKK3sKKyAgcmV0dXJuIHZlY3Rvcl9pbml0IChi YXIgKHhbMF0sIHlbMF0pLCB4WzFdLCB4WzJdLCB4WzNdKSA7Cit9CmRpZmYg LS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4 LTguYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByODg4Mjgt OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4z YjhlYWJkMjI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUv Z2NjLnRhcmdldC9pMzg2L3ByODg4MjgtOC5jCkBAIC0wLDAgKzEsNDYgQEAK Ky8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IHNzZTJfcnVudGltZSB9IH0gKi8K Ky8qIHsgZGctb3B0aW9ucyAiLU8yIC1tc3NlMiIgfSAqLworCisjaW5jbHVk ZSAicHI4ODgyOC04YS5jIgorI2luY2x1ZGUgInByODg4MjgtOGIuYyIKKwor ZXh0ZXJuIHZvaWQgYWJvcnQgKCk7CisKK3ZvaWQKK2RvX2NoZWNrIChfX3Y0 c2YgeSwgZmxvYXQgZls0XSwgZmxvYXQgeikKK3sKKyAgaW50IGk7CisKKyAg Zm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICBpZiAoaSA9PSAwKQorICAg ICAgeworCWlmICh5W2ldICE9IHopCisJICBhYm9ydCAoKTsKKyAgICAgIH0K KyAgICBlbHNlCisgICAgICB7CisJaWYgKHlbaV0gIT0gZltpXSkKKwkgIGFi b3J0ICgpOworICAgICAgfQorfQorCitpbnQKK21haW4gKHZvaWQpCit7Cisg IGZsb2F0IGZbNF0gPSB7IC0xMSwgMiwgNTU1NTMsIC00IH07CisgIGZsb2F0 IHogPSAxMS40OworICBfX3Y0c2YgeCA9IHsgZlswXSwgZlsxXSwgZlsyXSwg ZlszXSB9OworICBfX3Y0c2YgeTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0g MDsgaSA8IDQ7IGkrKykKKyAgICBpZiAoeFtpXSAhPSBmW2ldKQorICAgICAg YWJvcnQgKCk7CisKKyAgeSA9IGZvbzEgKHgpOworICBkb19jaGVjayAoeSwg Ziwgeik7CisgIHkgPSBmb28yICh4KTsKKyAgZG9fY2hlY2sgKHksIGYsIHop OworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0 ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC04YS5jIGIvZ2NjL3Rlc3RzdWl0 ZS9nY2MudGFyZ2V0L2kzODYvcHI4ODgyOC04YS5jCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi41ZDM4M2RmZDA4MQotLS0gL2Rl di9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3By ODg4MjgtOGEuYwpAQCAtMCwwICsxLDE1IEBACisvKiB7IGRnLWRvIGNvbXBp bGUgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLW1zc2UgLW1uby1zc2U0 IiB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJt b3ZsaHBzIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxl ci1ub3QgInVucGNraHBzIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2Fu LWFzc2VtYmxlci1ub3QgInVucGNrbHBzIiB9IH0gKi8KKy8qIHsgZGctZmlu YWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgInNodWZwcyIgfSB9ICovCisKK3R5 cGVkZWYgZmxvYXQgX192NHNmIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9z aXplX18gKDE2KSkpOworCitfX3Y0c2YKK2ZvbzEgKF9fdjRzZiB4KQorewor ICBfX3Y0c2YgeiA9IHsgMTEuNCwgeFsxXSwgeFsyXSwgeFszXSB9OworICBy ZXR1cm4gejsKK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRh cmdldC9pMzg2L3ByODg4MjgtOGIuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRh cmdldC9pMzg2L3ByODg4MjgtOGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMC4uNWZmYmM5YzMxMDMKLS0tIC9kZXYvbnVsbAor KysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjg4ODI4LThi LmMKQEAgLTAsMCArMSwyMSBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8K Ky8qIHsgZGctb3B0aW9ucyAiLU8yIC1tc3NlIC1tbm8tc3NlNCIgfSAqLwor LyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAibW92bGhwcyIg fSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJ1 bnBja2hwcyIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJs ZXItbm90ICJ1bnBja2xwcyIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi1hc3NlbWJsZXItbm90ICJzaHVmcHMiIH0gfSAqLworCit0eXBlZGVmIGZs b2F0IF9fdjRzZiBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgx NikpKTsKKworc3RhdGljIF9fdjRzZgordmVjdG9yX2luaXQgKGZsb2F0IGYw LGZsb2F0IGYxLCBmbG9hdCBmMixmbG9hdCBmMykKK3sKKyAgX192NHNmIHkg PSB7IGYwLCBmMSwgZjIsIGYzIH07CisgICByZXR1cm4geTsKK30KKworX192 NHNmCitmb28yIChfX3Y0c2YgeCkKK3sKKyAgcmV0dXJuIHZlY3Rvcl9pbml0 ICgxMS40LCB4WzFdLCB4WzJdLCB4WzNdKSA7Cit9CmRpZmYgLS1naXQgYS9n Y2MvdHJlZS1zc2EtZm9yd3Byb3AuYyBiL2djYy90cmVlLXNzYS1mb3J3cHJv cC5jCmluZGV4IGVlYjYyODFjNjUyLi5mNDBlYWZmZGNjMSAxMDA2NDQKLS0t IGEvZ2NjL3RyZWUtc3NhLWZvcndwcm9wLmMKKysrIGIvZ2NjL3RyZWUtc3Nh LWZvcndwcm9wLmMKQEAgLTIwMDgsNyArMjAwOCw3IEBAIHNpbXBsaWZ5X3Zl Y3Rvcl9jb25zdHJ1Y3RvciAoZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKmdzaSkK ICAgdW5zaWduZWQgZWxlbV9zaXplLCBpOwogICB1bnNpZ25lZCBIT1NUX1dJ REVfSU5UIG5lbHRzOwogICBlbnVtIHRyZWVfY29kZSBjb2RlLCBjb252X2Nv ZGU7Ci0gIGNvbnN0cnVjdG9yX2VsdCAqZWx0OworICBjb25zdHJ1Y3Rvcl9l bHQgKmNlOwogICBib29sIG1heWJlX2lkZW50OwogCiAgIGdjY19jaGVja2lu Z19hc3NlcnQgKGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHN0bXQpID09IENP TlNUUlVDVE9SKTsKQEAgLTIwMjcsMTggKzIwMjcsMzggQEAgc2ltcGxpZnlf dmVjdG9yX2NvbnN0cnVjdG9yIChnaW1wbGVfc3RtdF9pdGVyYXRvciAqZ3Np KQogICBvcmlnWzFdID0gTlVMTDsKICAgY29udl9jb2RlID0gRVJST1JfTUFS SzsKICAgbWF5YmVfaWRlbnQgPSB0cnVlOwotICBGT1JfRUFDSF9WRUNfU0FG RV9FTFQgKENPTlNUUlVDVE9SX0VMVFMgKG9wKSwgaSwgZWx0KQorCisgIHRy ZWUgcmhzX3ZlY3RvciA9IE5VTEw7CisgIC8qIFRoZSBzaW5nbGUgc2NhbGFy IGVsZW1lbnQuICAqLworICB0cmVlIHNjYWxhcl9lbGVtZW50ID0gTlVMTDsK KyAgdW5zaWduZWQgaW50IHNjYWxhcl9pZHggPSAwOworICBib29sIGluc2Vy dCA9IGZhbHNlOworICB1bnNpZ25lZCBpbnQgbnNjYWxhcnMgPSAwOworICB1 bnNpZ25lZCBpbnQgbnZlY3RvcnMgPSAwOworICBGT1JfRUFDSF9WRUNfU0FG RV9FTFQgKENPTlNUUlVDVE9SX0VMVFMgKG9wKSwgaSwgY2UpCiAgICAgewog ICAgICAgdHJlZSByZWYsIG9wMTsKIAogICAgICAgaWYgKGkgPj0gbmVsdHMp CiAJcmV0dXJuIGZhbHNlOwogCi0gICAgICBpZiAoVFJFRV9DT0RFIChlbHQt PnZhbHVlKSAhPSBTU0FfTkFNRSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBk ZWZfc3RtdCA9IGdldF9wcm9wX3NvdXJjZV9zdG10IChlbHQtPnZhbHVlLCBm YWxzZSwgTlVMTCk7CisgICAgICBpZiAoVFJFRV9DT0RFIChjZS0+dmFsdWUp ID09IFNTQV9OQU1FKQorCWRlZl9zdG10ID0gZ2V0X3Byb3Bfc291cmNlX3N0 bXQgKGNlLT52YWx1ZSwgZmFsc2UsIE5VTEwpOworICAgICAgZWxzZQorCWRl Zl9zdG10ID0gTlVMTDsKICAgICAgIGlmICghZGVmX3N0bXQpCi0JcmV0dXJu IGZhbHNlOworCXsKKwkgIC8qIE9ubHkgYWxsb3cgb25lIHNjYWxhciBpbnNl cnQuICAqLworCSAgaWYgKG5zY2FsYXJzICE9IDApCisJICAgIHJldHVybiBm YWxzZTsKKworCSAgbnNjYWxhcnMgPSAxOworCSAgaW5zZXJ0ID0gdHJ1ZTsK KwkgIHNjYWxhcl9pZHggPSBpOworCSAgc2VsLnF1aWNrX3B1c2ggKGkpOwor CSAgc2NhbGFyX2VsZW1lbnQgPSBjZS0+dmFsdWU7CisJICBjb250aW51ZTsK Kwl9CiAgICAgICBjb2RlID0gZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoZGVm X3N0bXQpOwogICAgICAgaWYgKGNvZGUgPT0gRkxPQVRfRVhQUgogCSAgfHwg Y29kZSA9PSBGSVhfVFJVTkNfRVhQUikKQEAgLTIwNDYsNyArMjA2Niw3IEBA IHNpbXBsaWZ5X3ZlY3Rvcl9jb25zdHJ1Y3RvciAoZ2ltcGxlX3N0bXRfaXRl cmF0b3IgKmdzaSkKIAkgIG9wMSA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoZGVm X3N0bXQpOwogCSAgaWYgKGNvbnZfY29kZSA9PSBFUlJPUl9NQVJLKQogCSAg ICB7Ci0JICAgICAgaWYgKG1heWJlX25lIChHRVRfTU9ERV9TSVpFIChUWVBF X01PREUgKFRSRUVfVFlQRSAoZWx0LT52YWx1ZSkpKSwKKwkgICAgICBpZiAo bWF5YmVfbmUgKEdFVF9NT0RFX1NJWkUgKFRZUEVfTU9ERSAoVFJFRV9UWVBF IChjZS0+dmFsdWUpKSksCiAJCQkgICAgR0VUX01PREVfU0laRSAoVFlQRV9N T0RFIChUUkVFX1RZUEUgKG9wMSkpKSkpCiAJCXJldHVybiBmYWxzZTsKIAkg ICAgICBjb252X2NvZGUgPSBjb2RlOwpAQCAtMjA2MSw3ICsyMDgxLDE4IEBA IHNpbXBsaWZ5X3ZlY3Rvcl9jb25zdHJ1Y3RvciAoZ2ltcGxlX3N0bXRfaXRl cmF0b3IgKmdzaSkKIAkgIGNvZGUgPSBnaW1wbGVfYXNzaWduX3Joc19jb2Rl IChkZWZfc3RtdCk7CiAJfQogICAgICAgaWYgKGNvZGUgIT0gQklUX0ZJRUxE X1JFRikKLQlyZXR1cm4gZmFsc2U7CisJeworCSAgLyogT25seSBhbGxvdyBv bmUgc2NhbGFyIGluc2VydC4gICovCisJICBpZiAobnNjYWxhcnMgIT0gMCkK KwkgICAgcmV0dXJuIGZhbHNlOworCisJICBuc2NhbGFycyA9IDE7CisJICBp bnNlcnQgPSB0cnVlOworCSAgc2NhbGFyX2lkeCA9IGk7CisJICBzZWwucXVp Y2tfcHVzaCAoaSk7CisJICBzY2FsYXJfZWxlbWVudCA9IGNlLT52YWx1ZTsK KwkgIGNvbnRpbnVlOworCX0KICAgICAgIG9wMSA9IGdpbXBsZV9hc3NpZ25f cmhzMSAoZGVmX3N0bXQpOwogICAgICAgcmVmID0gVFJFRV9PUEVSQU5EIChv cDEsIDApOwogICAgICAgdW5zaWduZWQgaW50IGo7CkBAIC0yMDk1LDExICsy MTI2LDI5IEBAIHNpbXBsaWZ5X3ZlY3Rvcl9jb25zdHJ1Y3RvciAoZ2ltcGxl X3N0bXRfaXRlcmF0b3IgKmdzaSkKIAllbHQgKz0gbmVsdHM7CiAgICAgICBp ZiAoZWx0ICE9IGkpCiAJbWF5YmVfaWRlbnQgPSBmYWxzZTsKKworICAgICAg IGlmICh0eXBlID09IFRSRUVfVFlQRSAocmVmKSkKKwkgeworCSAgIC8qIFRo ZSBSSFMgdmVjdG9yIGhhcyB0aGUgc2FtZSB0eXBlIGFzIExIUy4gICovCisJ ICAgaWYgKHJoc192ZWN0b3IgPT0gTlVMTCkKKwkgICAgIHJoc192ZWN0b3Ig PSByZWY7CisJICAgLyogQ2hlY2sgaWYgYWxsIFJIUyB2ZWN0b3IgZWxlbWVu dHMgY29tZSBmb21lIHRoZSBzYW1lCisJICAgICAgdmVjdG9yLiAgKi8KKwkg ICBpZiAocmhzX3ZlY3RvciA9PSByZWYpCisJICAgICBudmVjdG9ycysrOwor CSB9CisKICAgICAgIHNlbC5xdWlja19wdXNoIChlbHQpOwogICAgIH0KICAg aWYgKGkgPCBuZWx0cykKICAgICByZXR1cm4gZmFsc2U7CiAKKyAgaWYgKGlu c2VydAorICAgICAgJiYgKG52ZWN0b3JzID09IDAKKwkgIHx8IChUWVBFX1ZF Q1RPUl9TVUJQQVJUUyAodHlwZSkudG9fY29uc3RhbnQgKCkKKwkgICAgICAh PSAobnNjYWxhcnMgKyBudmVjdG9ycykpKSkKKyAgICByZXR1cm4gZmFsc2U7 CisKICAgaWYgKCEgVkVDVE9SX1RZUEVfUCAoVFJFRV9UWVBFIChvcmlnWzBd KSkKICAgICAgIHx8IG1heWJlX25lIChUWVBFX1ZFQ1RPUl9TVUJQQVJUUyAo dHlwZSksCiAJCSAgIFRZUEVfVkVDVE9SX1NVQlBBUlRTIChUUkVFX1RZUEUg KG9yaWdbMF0pKSkpCkBAIC0yMTI3LDE4ICsyMTc2LDI2IEBAIHNpbXBsaWZ5 X3ZlY3Rvcl9jb25zdHJ1Y3RvciAoZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKmdz aSkKIAogICAgICAgdmVjX3Blcm1faW5kaWNlcyBpbmRpY2VzIChzZWwsIG9y aWdbMV0gPyAyIDogMSwgbmVsdHMpOwogICAgICAgaWYgKCFjYW5fdmVjX3Bl cm1fY29uc3RfcCAoVFlQRV9NT0RFICh0eXBlKSwgaW5kaWNlcykpCi0JcmV0 dXJuIGZhbHNlOworCXsKKwkgIGlmIChpbnNlcnQpCisJICAgIGdjY191bnJl YWNoYWJsZSAoKTsKKwkgIHJldHVybiBmYWxzZTsKKwl9CiAgICAgICBtYXNr X3R5cGUKIAk9IGJ1aWxkX3ZlY3Rvcl90eXBlIChidWlsZF9ub25zdGFuZGFy ZF9pbnRlZ2VyX3R5cGUgKGVsZW1fc2l6ZSwgMSksCiAJCQkgICAgIG5lbHRz KTsKICAgICAgIGlmIChHRVRfTU9ERV9DTEFTUyAoVFlQRV9NT0RFIChtYXNr X3R5cGUpKSAhPSBNT0RFX1ZFQ1RPUl9JTlQKIAkgIHx8IG1heWJlX25lIChH RVRfTU9ERV9TSVpFIChUWVBFX01PREUgKG1hc2tfdHlwZSkpLAogCQkgICAg ICAgR0VUX01PREVfU0laRSAoVFlQRV9NT0RFICh0eXBlKSkpKQotCXJldHVy biBmYWxzZTsKKwl7CisJICBpZiAoaW5zZXJ0KQorCSAgICBnY2NfdW5yZWFj aGFibGUgKCk7CisJICByZXR1cm4gZmFsc2U7CisJfQogICAgICAgb3AyID0g dmVjX3Blcm1faW5kaWNlc190b190cmVlIChtYXNrX3R5cGUsIGluZGljZXMp OwogICAgICAgaWYgKCFvcmlnWzFdKQogCW9yaWdbMV0gPSBvcmlnWzBdOwot ICAgICAgaWYgKGNvbnZfY29kZSA9PSBFUlJPUl9NQVJLKQorICAgICAgaWYg KGNvbnZfY29kZSA9PSBFUlJPUl9NQVJLICYmICFpbnNlcnQpCiAJZ2ltcGxl X2Fzc2lnbl9zZXRfcmhzX3dpdGhfb3BzIChnc2ksIFZFQ19QRVJNX0VYUFIs IG9yaWdbMF0sCiAJCQkJCW9yaWdbMV0sIG9wMik7CiAgICAgICBlbHNlCkBA IC0yMTQ4LDEwICsyMjA1LDI1IEBAIHNpbXBsaWZ5X3ZlY3Rvcl9jb25zdHJ1 Y3RvciAoZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKmdzaSkKIAkJCQkgICBWRUNf UEVSTV9FWFBSLCBvcmlnWzBdLCBvcmlnWzFdLCBvcDIpOwogCSAgb3JpZ1sw XSA9IGdpbXBsZV9hc3NpZ25fbGhzIChwZXJtKTsKIAkgIGdzaV9pbnNlcnRf YmVmb3JlIChnc2ksIHBlcm0sIEdTSV9TQU1FX1NUTVQpOwotCSAgZ2ltcGxl X2Fzc2lnbl9zZXRfcmhzX3dpdGhfb3BzIChnc2ksIGNvbnZfY29kZSwgb3Jp Z1swXSwKKwkgIGdpbXBsZV9hc3NpZ25fc2V0X3Joc193aXRoX29wcyAoZ3Np LAorCQkJCQkgIChjb252X2NvZGUgIT0gRVJST1JfTUFSSworCQkJCQkgICA/ IGNvbnZfY29kZQorCQkJCQkgICA6IE5PUF9FWFBSKSwKKwkJCQkJICBvcmln WzBdLAogCQkJCQkgIE5VTExfVFJFRSwgTlVMTF9UUkVFKTsKIAl9CiAgICAg fQorICBpZiAoaW5zZXJ0KQorICAgIHsKKyAgICAgIC8qIEdlbmVyYXRlIGEg c2luZ2xlIHNjYWxhciBpbnNlcnQuICAqLworICAgICAgdHJlZSB2YXIgPSBt YWtlX3NzYV9uYW1lICh0eXBlKTsKKyAgICAgIGdpbXBsZSAqY29weSA9IGdp bXBsZV9jb3B5IChnc2lfc3RtdCAoKmdzaSkpOworICAgICAgZ2ltcGxlX2Fz c2lnbl9zZXRfbGhzIChjb3B5LCB2YXIpOworICAgICAgZ3NpX2luc2VydF9i ZWZvcmUgKGdzaSwgY29weSwgR1NJX1NBTUVfU1RNVCk7CisgICAgICB0cmVl IGJpdHBvcyA9IGJpdHNpemVfaW50IChzY2FsYXJfaWR4ICogZWxlbV9zaXpl KTsKKyAgICAgIGdpbXBsZV9hc3NpZ25fc2V0X3Joc193aXRoX29wcyAoZ3Np LCBCSVRfSU5TRVJUX0VYUFIsIHZhciwKKwkJCQkgICAgICBzY2FsYXJfZWxl bWVudCwgYml0cG9zKTsKKyAgICB9CiAgIHVwZGF0ZV9zdG10IChnc2lfc3Rt dCAoKmdzaSkpOwogICByZXR1cm4gdHJ1ZTsKIH0KLS0gCjIuMjAuMQoK --00000000000003a0bf05837759fb--