From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 48124 invoked by alias); 14 Oct 2016 12:07:35 -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 48089 invoked by uid 89); 14 Oct 2016 12:07:34 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.3 required=5.0 tests=AWL,BAYES_50,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=ham version=3.3.2 spammy=ysrumyan@gmail.com, ysrumyangmailcom, corner, premature X-HELO: mail-vk0-f52.google.com Received: from mail-vk0-f52.google.com (HELO mail-vk0-f52.google.com) (209.85.213.52) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 14 Oct 2016 12:07:31 +0000 Received: by mail-vk0-f52.google.com with SMTP id 2so111303409vkb.3 for ; Fri, 14 Oct 2016 05:07:31 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=C3+nht3JP6JuglXm6XZyevevU7o4i/wFZo07q3K2H5I=; b=TMTfgxvkPCeXzS8MNtQARnPaF1oeMcEPrnFPZjZEw9Uwcufes1b3z2Iy6XfYYWEaf5 srloCnBAZYCgAx9v9tYJ/i6X4+lacQbkKX+OWVCUL8k3GDHQVkF50CrjWVKXgSnffd/N 5G2HaHHvVkniOcVJjdm9+Yvh7t5P/CbezZdU8v/fKYUpuak1SIQpDd24ELBHeOK/+cdJ P8N1+hkbVbecFVLjqVVqCJ2cYpkeatp7P9FjfAzc0ns1KYoRiNxqGP2/f76tLbLrf4DV 9qttTVcsqcQ1/P/Zo7JA5cEKch1sL1Xf3MY8FB6OS2VlFBCU+kBr1dGK6eZdmwJ7ZvS2 qd/g== X-Gm-Message-State: AA6/9RnVNQrvI7sLN8K7kEAjHsJi8Z+xTEyf+rbgA+YYTmL5ubwTsl4SQoU346NZdLNr+OM9qVjgg4UVEC4GrQ== X-Received: by 10.31.152.195 with SMTP id a186mr8596785vke.79.1476446849567; Fri, 14 Oct 2016 05:07:29 -0700 (PDT) MIME-Version: 1.0 Received: by 10.176.64.74 with HTTP; Fri, 14 Oct 2016 05:07:28 -0700 (PDT) In-Reply-To: References: From: Yuri Rumyantsev Date: Fri, 14 Oct 2016 12:07:00 -0000 Message-ID: Subject: Re: Compile-time improvement for if conversion. To: Richard Biener Cc: gcc-patches Content-Type: multipart/mixed; boundary=001a1141bf42ffa631053ed21106 X-SW-Source: 2016-10/txt/msg01144.txt.bz2 --001a1141bf42ffa631053ed21106 Content-Type: text/plain; charset=UTF-8 Content-length: 12084 Richard, Here is updated patch with the changes proposed by you. Bootstrapping and regression testing did not show any new failures. Is it OK for trunk? ChangeLog: 2016-10-14 Yuri Rumyantsev * dominance.c (dom_info::dom_info): Add new constructor for region presented by vector of basic blocks. (dom_init): New method to initialize members common for both constructors. (dom_info::dom_info): Invoke dom_init for partial initialization. (dom_info::get_idom): Add check to corner cases on basic blocks which are not in region. (dom_info::calc_dfs_tree): Check M_FAKE_EXIT_EDGE instead of M_REVERSE to detect unreachable bbs. (dom_info::calc_idoms): Likewise. (compute_dom_fast_query_in_region): New function. (calculate_dominance_info_for_region): Likewise. (free_dominance_info_for_region): Add couple functions to free dominance info for region. * dominance.h: Add prototypes for introduced region-based functions tree-if-conv.c: (build_region): New function. (if_convertible_loop_p_1): Invoke local version of post-dominators calculation before basic block predication with subsequent freeing post-dominator info. (tree_if_conversion): Remove free of post-dominator info (pass_if_conversion::execute): Delete detection of infinite loops and fake edges to exit block since post-dominator calculation is performed per if-converted loop only. 2016-10-13 13:15 GMT+03:00 Richard Biener : > On Wed, Oct 12, 2016 at 3:37 PM, Yuri Rumyantsev wrote: >> Richard, >> >> Here is updated patch . I avoided creation of new entry/exit blocks >> but instead add check to border cases - do not consider also blocks >> which are out of region. >> >> Any comments will be appreciated. > > I mostly like it now. Can you split out all the common parts from the > dom_info constructor > to a helper method please and just compute m_n_basic_blocks and a max_index and > do all the memory allocation in that common function? > > @@ -276,9 +334,10 @@ dom_info::calc_dfs_tree_nonrec (basic_block bb) > bn = e->src; > > /* If the next node BN is either already visited or a border > - block the current edge is useless, and simply overwritten > - with the next edge out of the current node. */ > - if (bn == m_end_block || m_dfs_order[bn->index]) > + block or out of region the current edge is useless, and simply > + overwritten with the next edge out of the current node. */ > + if (bn == m_end_block || bn->dom[d_i] == NULL > > clever idea ;) Just thinking if this means we support single entry, > multiple exit > regions for CDI_DOMINATORs and multiple entry, single exit regions for > CDI_POST_DOMINATORs. I think so. Please update the function comments > accordingly. > > > + m_dfsnum = 1; > + m_nodes = 0; > + m_fake_exit_edge = NULL; /* Assume that region is SCC. */ > > you mean SESE rather than SCC? > > @@ -511,7 +573,7 @@ dom_info::calc_idoms () > : ei_start (bb->preds); > edge_iterator einext; > > - if (m_reverse) > + if (m_reverse && !in_region) > { > /* If this block has a fake edge to exit, process that first. */ > if (bitmap_bit_p (m_fake_exit_edge, bb->index)) > > I think it's better to simply change the if (m_reverse) test to a if > (m_fake_exit_edge) test. > > I noticed you do not initialize n_bbs_in_dom_tree (just set it to > zero), it's not really used > anywhere (but in an assert). > > free_dominance_info_for_region needs a function level comment (per > coding guidelines). > > Please make free_dominance_info_for_region take a struct function * pointer. > > @@ -1318,11 +1350,13 @@ if_convertible_loop_p_1 (struct loop *loop, > vec *refs) > { > unsigned int i; > basic_block exit_bb = NULL; > + vec region; > > if (find_data_references_in_loop (loop, refs) == chrec_dont_know) > return false; > > - calculate_dominance_info (CDI_DOMINATORS); > + if (dom_info_state (CDI_DOMINATORS) != DOM_OK) > + calculate_dominance_info (CDI_DOMINATORS); > > This is a premature (unwanted) change. > > Other than that the only O(function-size) part left is the zeroing in > > + /* Determine max basic block index in region. */ > + int max_index = region[0]->index; > + for (size_t i = 1; i < num; i++) > + if (region[i]->index > max_index) > + max_index = region[i]->index; > + max_index += 1; > + m_dfs_order = new_zero_array (max_index + 1); > + m_dfs_last = &m_dfs_order[max_index]; > > I suppose we can try addressing this as followup. > > Thanks a lot for doing this. > Richard. > >> 2016-10-11 16:48 GMT+03:00 Richard Biener : >>> On Tue, Oct 11, 2016 at 3:23 PM, Yuri Rumyantsev wrote: >>>> Richard, >>>> >>>> I implemented this by passing callback function in_region which >>>> returns true if block belongs to region. >>>> I am testing it now >>>> >>>> I attach modified patch for your quick review. >>> >>> + FOR_EACH_VEC_ELT (region, i, bb) >>> + { >>> + bb->dom[dir_index] = et_new_tree (bb); >>> + } >>> + /* Check that region is SESE region. */ >>> + entry = region[0]; >>> + if ( EDGE_COUNT (entry->succs) > 1) >>> + { >>> + /* Create new entry block with the only successor. */ >>> + basic_block succ = NULL; >>> + bool found = false; >>> + FOR_EACH_EDGE (e, ei, entry->succs) >>> + if (in_region (region, e->dest)) >>> + { >>> + gcc_assert (!found); >>> >>> is that check equal to e->dest->dom[dir_index] != NULL? I think we >>> shouldn't need the callback. >>> >>> + new_entry = create_empty_bb (entry); >>> + unchecked_make_edge (new_entry, succ, 0); >>> >>> I still think this is somewhat gross and we should try to avoid it >>> somehow - at least it's well-hidden now ;) >>> >>> + /* Put it to region as entry node. */ >>> + region[0] = new_entry; >>> >>> so region[0] is overwritten now? >>> >>> As far as I understand calc_dfs_tree it should be possible to compute >>> the region on-the-fly >>> from calling calc_dfs_tree_nonrec on the entry/exit (also maybe >>> avoiding some of the still >>> "large" complexity of zeroing arrays in the constructor). >>> >>> And if we use that DFS walk directly we should be able to avoid >>> creating those fake entry/exit >>> blocks by using entry/exit edges instead... (somehow). >>> >>> Richard. >>> >>> >>> >>>> Thanks. >>>> >>>> 2016-10-11 13:33 GMT+03:00 Richard Biener : >>>>> On Mon, Oct 10, 2016 at 4:17 PM, Yuri Rumyantsev wrote: >>>>>> Richard, >>>>>> >>>>>> If "fake" exit or entry block is created in dominance how we can >>>>>> determine what is its the only predecessor or successor without using >>>>>> a notion of loop? >>>>> >>>>> The caller passes in an entry and exit edge instead of a block or loop. >>>>> >>>>> Richard. >>>>> >>>>>> 2016-10-10 15:00 GMT+03:00 Richard Biener : >>>>>>> On Mon, Oct 10, 2016 at 1:42 PM, Yuri Rumyantsev wrote: >>>>>>>> Thanks Richard for your comments. >>>>>>>> I'd like to answer on your last comment regarding use split_edge() >>>>>>>> instead of creating fake post-header. I started with this splitting >>>>>>>> but it requires to fix-up closed ssa form by creating additional phi >>>>>>>> nodes, so I decided to use only cfg change without updating ssa form. >>>>>>>> Other changes look reasonable and will fix them. >>>>>>> >>>>>>> Ah. In this case can you investigate what it takes to make the entry/exit >>>>>>> edges rather than BBs? That is, introduce those "fakes" only internally >>>>>>> in dominance.c? >>>>>>> >>>>>>>> 2016-10-10 12:52 GMT+03:00 Richard Biener : >>>>>>>>> On Wed, Oct 5, 2016 at 3:22 PM, Yuri Rumyantsev wrote: >>>>>>>>>> Hi All, >>>>>>>>>> >>>>>>>>>> Here is implementation of Richard proposal: >>>>>>>>>> >>>>>>>>>> < For general infrastructure it would be nice to expose a (post-)dominator >>>>>>>>>> < compute for MESE (post-dominators) / SEME (dominators) regions. I believe >>>>>>>>>> < what makes if-conversion expensive is the post-dom compute which happens >>>>>>>>>> < for each loop for the whole function. It shouldn't be very difficult >>>>>>>>>> < to write this, >>>>>>>>>> < sharing as much as possible code with the current DOM code might need >>>>>>>>>> < quite some refactoring though. >>>>>>>>>> >>>>>>>>>> I implemented this proposal by adding calculation of dominance info >>>>>>>>>> for SESE regions and incorporate this change to if conversion pass. >>>>>>>>>> SESE region is built by adding loop pre-header and possibly fake >>>>>>>>>> post-header blocks to loop body. Fake post-header is deleted after >>>>>>>>>> predication completion. >>>>>>>>>> >>>>>>>>>> Bootstrapping and regression testing did not show any new failures. >>>>>>>>>> >>>>>>>>>> Is it OK for trunk? >>>>>>>>> >>>>>>>>> It's mostly reasonable but I have a few comments. First, re-using >>>>>>>>> bb->dom[] for the dominator info is somewhat fragile but indeed >>>>>>>>> a requirement to make the patch reasonably small. Please, >>>>>>>>> in calculate_dominance_info_for_region, make sure that >>>>>>>>> !dom_info_available_p (dir). >>>>>>>>> >>>>>>>>> You pass loop * everywhere but require ->aux to be set up as >>>>>>>>> an array of BBs forming the region with special BBs at array ends. >>>>>>>>> >>>>>>>>> Please instead pass in a vec which avoids using ->aux >>>>>>>>> and also allows other non-loop-based SESE regions to be used >>>>>>>>> (I couldn't spot anything that relies on this being a loop). >>>>>>>>> >>>>>>>>> Adding a convenience wrapper for loop * would be of course nice, >>>>>>>>> to cover the special pre/post-header code in tree-if-conv.c. >>>>>>>>> >>>>>>>>> In theory a SESE region is fully specified by its entry end exit _edge_, >>>>>>>>> so you might want to see if it's possible to use such a pair of edges >>>>>>>>> to guard the dfs/idom walks to avoid the need to create fake blocks. >>>>>>>>> >>>>>>>>> Btw, instead of using create_empty_bb, unchecked_make_edge, etc. >>>>>>>>> please use split_edge() of the entry/exit edges. >>>>>>>>> >>>>>>>>> Richard. >>>>>>>>> >>>>>>>>>> ChangeLog: >>>>>>>>>> 2016-10-05 Yuri Rumyantsev >>>>>>>>>> >>>>>>>>>> * dominance.c : Include cfgloop.h for loop recognition. >>>>>>>>>> (dom_info): Add new functions and add boolean argument to recognize >>>>>>>>>> computation for loop region. >>>>>>>>>> (dom_info::dom_info): New function. >>>>>>>>>> (dom_info::calc_dfs_tree): Add boolean argument IN_REGION to not >>>>>>>>>> handle unvisited blocks. >>>>>>>>>> (dom_info::calc_idoms): Likewise. >>>>>>>>>> (compute_dom_fast_query_in_region): New function. >>>>>>>>>> (calculate_dominance_info): Invoke calc_dfs_tree and calc_idoms with >>>>>>>>>> false argument. >>>>>>>>>> (calculate_dominance_info_for_region): New function. >>>>>>>>>> (free_dominance_info_for_region): Likewise. >>>>>>>>>> (verify_dominators): Invoke calc_dfs_tree and calc_idoms with false >>>>>>>>>> argument. >>>>>>>>>> * dominance.h: Add prototype for introduced functions >>>>>>>>>> calculate_dominance_info_for_region and >>>>>>>>>> free_dominance_info_for_region. >>>>>>>>>> tree-if-conv.c: Add to local variables ifc_sese_bbs & fake_postheader. >>>>>>>>>> (build_sese_region): New function. >>>>>>>>>> (if_convertible_loop_p_1): Invoke local version of post-dominators >>>>>>>>>> calculation, free it after basic block predication and delete created >>>>>>>>>> fake post-header block if any. >>>>>>>>>> (tree_if_conversion): Delete call of free_dominance_info for >>>>>>>>>> post-dominators, free ifc_sese_bbs which represents SESE region. >>>>>>>>>> (pass_if_conversion::execute): Delete detection of infinite loops >>>>>>>>>> and fake edges to exit block since post-dominator calculation is >>>>>>>>>> performed per if-converted loop only. --001a1141bf42ffa631053ed21106 Content-Type: application/octet-stream; name="patch.4" Content-Disposition: attachment; filename="patch.4" Content-Transfer-Encoding: base64 X-Attachment-Id: f_iu9qbuee0 Content-length: 16503 ZGlmZiAtLWdpdCBhL2djYy9kb21pbmFuY2UuYyBiL2djYy9kb21pbmFuY2Uu YwppbmRleCBlMzMwOGNjLi45ZDdkOWU5IDEwMDY0NAotLS0gYS9nY2MvZG9t aW5hbmNlLmMKKysrIGIvZ2NjL2RvbWluYW5jZS5jCkBAIC02MCw2ICs2MCw3 IEBAIGNsYXNzIGRvbV9pbmZvCiB7CiBwdWJsaWM6CiAgIGRvbV9pbmZvIChm dW5jdGlvbiAqLCBjZGlfZGlyZWN0aW9uKTsKKyAgZG9tX2luZm8gKHZlYyA8 YmFzaWNfYmxvY2s+LCBjZGlfZGlyZWN0aW9uKTsKICAgfmRvbV9pbmZvICgp OwogICB2b2lkIGNhbGNfZGZzX3RyZWUgKCk7CiAgIHZvaWQgY2FsY19pZG9t cyAoKTsKQEAgLTY4LDYgKzY5LDcgQEAgcHVibGljOgogcHJpdmF0ZToKICAg dm9pZCBjYWxjX2Rmc190cmVlX25vbnJlYyAoYmFzaWNfYmxvY2spOwogICB2 b2lkIGNvbXByZXNzIChUQkIpOworICB2b2lkIGRvbV9pbml0ICh2b2lkKTsK ICAgVEJCIGV2YWwgKFRCQik7CiAgIHZvaWQgbGlua19yb290cyAoVEJCLCBU QkIpOwogCkBAIC0xNTMsMTIgKzE1NSwxMiBAQCBpbmxpbmUgVCAqbmV3X3pl cm9fYXJyYXkgKHNpemVfdCBudW0pCiAgIHJldHVybiByZXN1bHQ7CiB9CiAK LS8qIEFsbG9jYXRlIGFsbCBuZWVkZWQgbWVtb3J5IGluIGEgcGVzc2ltaXN0 aWMgZmFzaGlvbiAoc28gd2Ugcm91bmQgdXApLiAgKi8KKy8qIEhlbHBlciBm dW5jdGlvbiBmb3IgY29uc3RydWN0b3JzIHRvIGluaXRpYWxpemUgYSBwYXJ0 IG9mIGNsYXNzIG1lbWJlcnMuICAqLwogCi1kb21faW5mbzo6ZG9tX2luZm8g KGZ1bmN0aW9uICpmbiwgY2RpX2RpcmVjdGlvbiBkaXIpCit2b2lkCitkb21f aW5mbzo6ZG9tX2luaXQgKHZvaWQpCiB7Ci0gIC8qIFdlIG5lZWQgbWVtb3J5 IGZvciBuX2Jhc2ljX2Jsb2NrcyBub2Rlcy4gICovCi0gIHNpemVfdCBudW0g PSBtX25fYmFzaWNfYmxvY2tzID0gbl9iYXNpY19ibG9ja3NfZm9yX2ZuIChm bik7CisgIHNpemVfdCBudW0gPSBtX25fYmFzaWNfYmxvY2tzOwogICBtX2Rm c19wYXJlbnQgPSBuZXdfemVyb19hcnJheSA8VEJCPiAobnVtKTsKICAgbV9k b20gPSBuZXdfemVyb19hcnJheSA8VEJCPiAobnVtKTsKIApAQCAtMTc3LDEz ICsxNzksMjMgQEAgZG9tX2luZm86OmRvbV9pbmZvIChmdW5jdGlvbiAqZm4s IGNkaV9kaXJlY3Rpb24gZGlyKQogICBtX3NldF9jaGFpbiA9IG5ld196ZXJv X2FycmF5IDxUQkI+IChudW0pOwogICBtX3NldF9jaGlsZCA9IG5ld196ZXJv X2FycmF5IDxUQkI+IChudW0pOwogCi0gIHVuc2lnbmVkIGxhc3RfYmJfaW5k ZXggPSBsYXN0X2Jhc2ljX2Jsb2NrX2Zvcl9mbiAoZm4pOwotICBtX2Rmc19v cmRlciA9IG5ld196ZXJvX2FycmF5IDxUQkI+IChsYXN0X2JiX2luZGV4ICsg MSk7Ci0gIG1fZGZzX2xhc3QgPSAmbV9kZnNfb3JkZXJbbGFzdF9iYl9pbmRl eF07CiAgIG1fZGZzX3RvX2JiID0gbmV3X3plcm9fYXJyYXkgPGJhc2ljX2Js b2NrPiAobnVtKTsKIAogICBtX2Rmc251bSA9IDE7CiAgIG1fbm9kZXMgPSAw OworfQorCisvKiBBbGxvY2F0ZSBhbGwgbmVlZGVkIG1lbW9yeSBpbiBhIHBl c3NpbWlzdGljIGZhc2hpb24gKHNvIHdlIHJvdW5kIHVwKS4gICovCisKK2Rv bV9pbmZvOjpkb21faW5mbyAoZnVuY3Rpb24gKmZuLCBjZGlfZGlyZWN0aW9u IGRpcikKK3sKKyAgbV9uX2Jhc2ljX2Jsb2NrcyA9IG5fYmFzaWNfYmxvY2tz X2Zvcl9mbiAoZm4pOworCisgIGRvbV9pbml0ICgpOworCisgIHVuc2lnbmVk IGxhc3RfYmJfaW5kZXggPSBsYXN0X2Jhc2ljX2Jsb2NrX2Zvcl9mbiAoZm4p OworICBtX2Rmc19vcmRlciA9IG5ld196ZXJvX2FycmF5IDxUQkI+IChsYXN0 X2JiX2luZGV4ICsgMSk7CisgIG1fZGZzX2xhc3QgPSAmbV9kZnNfb3JkZXJb bGFzdF9iYl9pbmRleF07CiAKICAgc3dpdGNoIChkaXIpCiAgICAgewpAQCAt MjA0LDYgKzIxNiw0NCBAQCBkb21faW5mbzo6ZG9tX2luZm8gKGZ1bmN0aW9u ICpmbiwgY2RpX2RpcmVjdGlvbiBkaXIpCiAgICAgfQogfQogCisvKiBDb25z dHJ1Y3RvciBmb3IgcmVkdWNpYmxlIHJlZ2lvbiBSRUdJT04uICAqLworCitk b21faW5mbzo6ZG9tX2luZm8gKHZlYzxiYXNpY19ibG9jaz4gcmVnaW9uLCBj ZGlfZGlyZWN0aW9uIGRpcikKK3sKKyAgbV9uX2Jhc2ljX2Jsb2NrcyA9IHJl Z2lvbi5sZW5ndGggKCk7CisgIHVuc2lnbmVkIGludCBubTEgPSBtX25fYmFz aWNfYmxvY2tzIC0gMTsKKworICBkb21faW5pdCAoKTsKKworICAvKiBEZXRl cm1pbmUgbWF4IGJhc2ljIGJsb2NrIGluZGV4IGluIHJlZ2lvbi4gICovCisg IGludCBtYXhfaW5kZXggPSByZWdpb25bMF0tPmluZGV4OworICBmb3IgKHNp emVfdCBpID0gMTsgaSA8PSBubTE7IGkrKykKKyAgICBpZiAocmVnaW9uW2ld LT5pbmRleCA+IG1heF9pbmRleCkKKyAgICAgIG1heF9pbmRleCA9IHJlZ2lv bltpXS0+aW5kZXg7CisgIG1heF9pbmRleCArPSAxOyAgLyogc2V0IGluZGV4 IG9uIHRoZSBmaXJzdCBiYiBvdXQgb2YgcmVnaW9uLiAgKi8KKworICBtX2Rm c19vcmRlciA9IG5ld196ZXJvX2FycmF5IDxUQkI+IChtYXhfaW5kZXggKyAx KTsKKyAgbV9kZnNfbGFzdCA9ICZtX2Rmc19vcmRlclttYXhfaW5kZXhdOwor CisgIG1fZmFrZV9leGl0X2VkZ2UgPSBOVUxMOyAvKiBBc3N1bWUgdGhhdCBy ZWdpb24gaXMgcmVkdWNpYmxlLiAgKi8KKworICBzd2l0Y2ggKGRpcikKKyAg ICB7CisgICAgICBjYXNlIENESV9ET01JTkFUT1JTOgorCW1fcmV2ZXJzZSA9 IGZhbHNlOworCW1fc3RhcnRfYmxvY2sgPSByZWdpb25bMF07CisJbV9lbmRf YmxvY2sgPSByZWdpb25bbm0xXTsKKwlicmVhazsKKyAgICAgIGNhc2UgQ0RJ X1BPU1RfRE9NSU5BVE9SUzoKKwltX3JldmVyc2UgPSB0cnVlOworCW1fc3Rh cnRfYmxvY2sgPSByZWdpb25bbm0xXTsKKwltX2VuZF9ibG9jayA9IHJlZ2lv blswXTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJZ2NjX3VucmVhY2hh YmxlICgpOworICAgIH0KK30KKwogaW5saW5lIGJhc2ljX2Jsb2NrCiBkb21f aW5mbzo6Z2V0X2lkb20gKGJhc2ljX2Jsb2NrIGJiKQogewpAQCAtMjUyLDYg KzMwMiw4IEBAIGRvbV9pbmZvOjpjYWxjX2Rmc190cmVlX25vbnJlYyAoYmFz aWNfYmxvY2sgYmIpCiB7CiAgIGVkZ2VfaXRlcmF0b3IgKnN0YWNrID0gbmV3 IGVkZ2VfaXRlcmF0b3JbbV9uX2Jhc2ljX2Jsb2NrcyArIDFdOwogICBpbnQg c3AgPSAwOworICB1bnNpZ25lZCBkX2kgPSBkb21fY29udmVydF9kaXJfdG9f aWR4IChtX3JldmVyc2UgPyBDRElfUE9TVF9ET01JTkFUT1JTCisJCQkJCSA6 IENESV9ET01JTkFUT1JTKTsKIAogICAvKiBJbml0aWFsaXplIHRoZSBmaXJz dCBlZGdlLiAgKi8KICAgZWRnZV9pdGVyYXRvciBlaSA9IG1fcmV2ZXJzZSA/ IGVpX3N0YXJ0IChiYi0+cHJlZHMpCkBAIC0yNzYsOSArMzI4LDEwIEBAIGRv bV9pbmZvOjpjYWxjX2Rmc190cmVlX25vbnJlYyAoYmFzaWNfYmxvY2sgYmIp CiAJICAgICAgYm4gPSBlLT5zcmM7CiAKIAkgICAgICAvKiBJZiB0aGUgbmV4 dCBub2RlIEJOIGlzIGVpdGhlciBhbHJlYWR5IHZpc2l0ZWQgb3IgYSBib3Jk ZXIKLQkgICAgICAgICBibG9jayB0aGUgY3VycmVudCBlZGdlIGlzIHVzZWxl c3MsIGFuZCBzaW1wbHkgb3ZlcndyaXR0ZW4KLQkgICAgICAgICB3aXRoIHRo ZSBuZXh0IGVkZ2Ugb3V0IG9mIHRoZSBjdXJyZW50IG5vZGUuICAqLwotCSAg ICAgIGlmIChibiA9PSBtX2VuZF9ibG9jayB8fCBtX2Rmc19vcmRlcltibi0+ aW5kZXhdKQorCQkgYmxvY2sgb3Igb3V0IG9mIHJlZ2lvbiB0aGUgY3VycmVu dCBlZGdlIGlzIHVzZWxlc3MsIGFuZCBzaW1wbHkKKwkJIG92ZXJ3cml0dGVu IHdpdGggdGhlIG5leHQgZWRnZSBvdXQgb2YgdGhlIGN1cnJlbnQgbm9kZS4g ICovCisJICAgICAgaWYgKGJuID09IG1fZW5kX2Jsb2NrIHx8IGJuLT5kb21b ZF9pXSA9PSBOVUxMCisJCSAgfHwgbV9kZnNfb3JkZXJbYm4tPmluZGV4XSkK IAkJewogCQkgIGVpX25leHQgKCZlaSk7CiAJCSAgY29udGludWU7CkBAIC0y ODksNyArMzQyLDggQEAgZG9tX2luZm86OmNhbGNfZGZzX3RyZWVfbm9ucmVj IChiYXNpY19ibG9jayBiYikKIAkgIGVsc2UKIAkgICAgewogCSAgICAgIGJu ID0gZS0+ZGVzdDsKLQkgICAgICBpZiAoYm4gPT0gbV9lbmRfYmxvY2sgfHwg bV9kZnNfb3JkZXJbYm4tPmluZGV4XSkKKwkgICAgICBpZiAoYm4gPT0gbV9l bmRfYmxvY2sgfHwgYm4tPmRvbVtkX2ldID09IE5VTEwKKwkJICB8fCBtX2Rm c19vcmRlcltibi0+aW5kZXhdKQogCQl7CiAJCSAgZWlfbmV4dCAoJmVpKTsK IAkJICBjb250aW51ZTsKQEAgLTM0Nyw3ICs0MDEsNyBAQCBkb21faW5mbzo6 Y2FsY19kZnNfdHJlZSAoKQogCiAgIGNhbGNfZGZzX3RyZWVfbm9ucmVjICht X3N0YXJ0X2Jsb2NrKTsKIAotICBpZiAobV9yZXZlcnNlKQorICBpZiAobV9m YWtlX2V4aXRfZWRnZSkKICAgICB7CiAgICAgICAvKiBJbiB0aGUgcG9zdC1k b20gY2FzZSB3ZSBtYXkgaGF2ZSBub2RlcyB3aXRob3V0IGEgcGF0aCB0byBF WElUX0JMT0NLLgogICAgICAgICAgVGhleSBhcmUgcmV2ZXJzZS11bnJlYWNo YWJsZS4gIEluIHRoZSBkb20tY2FzZSB3ZSBkaXNhbGxvdyBzdWNoCkBAIC01 MTEsNyArNTY1LDcgQEAgZG9tX2luZm86OmNhbGNfaWRvbXMgKCkKIAkJCQkg ICA6IGVpX3N0YXJ0IChiYi0+cHJlZHMpOwogICAgICAgZWRnZV9pdGVyYXRv ciBlaW5leHQ7CiAKLSAgICAgIGlmIChtX3JldmVyc2UpCisgICAgICBpZiAo bV9mYWtlX2V4aXRfZWRnZSkKIAl7CiAJICAvKiBJZiB0aGlzIGJsb2NrIGhh cyBhIGZha2UgZWRnZSB0byBleGl0LCBwcm9jZXNzIHRoYXQgZmlyc3QuICAq LwogCSAgaWYgKGJpdG1hcF9iaXRfcCAobV9mYWtlX2V4aXRfZWRnZSwgYmIt PmluZGV4KSkKQEAgLTYyMiw2ICs2NzYsMzMgQEAgY29tcHV0ZV9kb21fZmFz dF9xdWVyeSAoZW51bSBjZGlfZGlyZWN0aW9uIGRpcikKICAgZG9tX2NvbXB1 dGVkW2Rpcl9pbmRleF0gPSBET01fT0s7CiB9CiAKKy8qIEFuYWxvZ291cyB0 byB0aGUgcHJldmlvdXMgZnVuY3Rpb24gYnV0IGNvbXB1dGUgdGhlIGRhdGEg Zm9yIHJlZHVjaWJsZQorICAgcmVnaW9uIFJFR0lPTi4gICovCisKK3N0YXRp YyB2b2lkCitjb21wdXRlX2RvbV9mYXN0X3F1ZXJ5X2luX3JlZ2lvbiAoZW51 bSBjZGlfZGlyZWN0aW9uIGRpciwKKwkJCQkgIHZlYzxiYXNpY19ibG9jaz4g cmVnaW9uKQoreworICBpbnQgbnVtID0gMDsKKyAgYmFzaWNfYmxvY2sgYmI7 CisgIHVuc2lnbmVkIGludCBkaXJfaW5kZXggPSBkb21fY29udmVydF9kaXJf dG9faWR4IChkaXIpOworCisgIGdjY19jaGVja2luZ19hc3NlcnQgKGRvbV9p bmZvX2F2YWlsYWJsZV9wIChkaXIpKTsKKworICBpZiAoZG9tX2NvbXB1dGVk W2Rpcl9pbmRleF0gPT0gRE9NX09LKQorICAgIHJldHVybjsKKworICAvKiBB c3NpZ24gZGZzIG51bWJlcnMgZm9yIHJlZ2lvbiBub2RlcyBleGNlcHQgZm9y IGVudHJ5IGFuZCBleGl0IG5vZGVzLiAgKi8KKyAgZm9yICh1bnNpZ25lZCBp bnQgaSA9IDE7IGkgPCByZWdpb24ubGVuZ3RoICgpIC0gMTsgaSsrKQorICAg IHsKKyAgICAgIGJiID0gcmVnaW9uW2ldOworICAgICAgaWYgKCFiYi0+ZG9t W2Rpcl9pbmRleF0tPmZhdGhlcikKKwlhc3NpZ25fZGZzX251bWJlcnMgKGJi LT5kb21bZGlyX2luZGV4XSwgJm51bSk7CisgICAgfQorCisgIGRvbV9jb21w dXRlZFtkaXJfaW5kZXhdID0gRE9NX09LOworfQorCiAvKiBUaGUgbWFpbiBl bnRyeSBwb2ludCBpbnRvIHRoaXMgbW9kdWxlLiAgRElSIGlzIHNldCBkZXBl bmRpbmcgb24gd2hldGhlcgogICAgd2Ugd2FudCB0byBjb21wdXRlIGRvbWlu YXRvcnMgb3IgcG9zdGRvbWluYXRvcnMuICAqLwogCkBAIC02NjgsNiArNzQ5 LDQzIEBAIGNhbGN1bGF0ZV9kb21pbmFuY2VfaW5mbyAoY2RpX2RpcmVjdGlv biBkaXIpCiAgIHRpbWV2YXJfcG9wIChUVl9ET01JTkFOQ0UpOwogfQogCisv KiBBbmFsb2dvdXMgdG8gdGhlIHByZXZpb3VzIGZ1bmN0aW9uIGJ1dCBjb21w dXRlIGRvbWluYW5jZSBpbmZvIGZvciByZWdpb25zCisgICB3aGljaCBhcmUg c2luZ2xlIGVudHJ5LCBtdWx0aXBsZSBleGl0IHJlZ2lvbnMgZm9yIENESV9E T01JTkFUT1JzIGFuZAorICAgbXVsdGlwbGUgZW50cnksIHNpbmdsZSBleGl0 IHJlZ2lvbnMgZm9yIENESV9QT1NUX0RPTUlOQVRPUnMuICAqLworCit2b2lk CitjYWxjdWxhdGVfZG9taW5hbmNlX2luZm9fZm9yX3JlZ2lvbiAoY2RpX2Rp cmVjdGlvbiBkaXIsCisJCQkJICAgICB2ZWM8YmFzaWNfYmxvY2s+IHJlZ2lv bikKK3sKKyAgdW5zaWduZWQgaW50IGRpcl9pbmRleCA9IGRvbV9jb252ZXJ0 X2Rpcl90b19pZHggKGRpcik7CisgIGJhc2ljX2Jsb2NrIGJiOworICB1bnNp Z25lZCBpbnQgaTsKKworICBpZiAoZG9tX2NvbXB1dGVkW2Rpcl9pbmRleF0g PT0gRE9NX09LKQorICAgIHJldHVybjsKKworICB0aW1ldmFyX3B1c2ggKFRW X0RPTUlOQU5DRSk7CisgIC8qIEFzc3VtZSB0aGF0IGRvbSBpbmZvIGlzIG5v dCBwYXJ0aWFsbHkgY29tcHV0ZWQuICAqLworICBnY2NfYXNzZXJ0ICghZG9t X2luZm9fYXZhaWxhYmxlX3AgKGRpcikpOworCisgIEZPUl9FQUNIX1ZFQ19F TFQgKHJlZ2lvbiwgaSwgYmIpCisgICAgeworICAgICAgYmItPmRvbVtkaXJf aW5kZXhdID0gZXRfbmV3X3RyZWUgKGJiKTsKKyAgICB9CisgIGRvbV9pbmZv IGRpIChyZWdpb24sIGRpcik7CisgIGRpLmNhbGNfZGZzX3RyZWUgKCk7Cisg IGRpLmNhbGNfaWRvbXMgKCk7CisKKyAgRk9SX0VBQ0hfVkVDX0VMVCAocmVn aW9uLCBpLCBiYikKKyAgICBpZiAoYmFzaWNfYmxvY2sgZCA9IGRpLmdldF9p ZG9tIChiYikpCisgICAgICBldF9zZXRfZmF0aGVyIChiYi0+ZG9tW2Rpcl9p bmRleF0sIGQtPmRvbVtkaXJfaW5kZXhdKTsKKworICBkb21fY29tcHV0ZWRb ZGlyX2luZGV4XSA9IERPTV9OT19GQVNUX1FVRVJZOworICBjb21wdXRlX2Rv bV9mYXN0X3F1ZXJ5X2luX3JlZ2lvbiAoZGlyLCByZWdpb24pOworCisgIHRp bWV2YXJfcG9wIChUVl9ET01JTkFOQ0UpOworfQorCiAvKiBGcmVlIGRvbWlu YW5jZSBpbmZvcm1hdGlvbiBmb3IgZGlyZWN0aW9uIERJUi4gICovCiB2b2lk CiBmcmVlX2RvbWluYW5jZV9pbmZvIChmdW5jdGlvbiAqZm4sIGVudW0gY2Rp X2RpcmVjdGlvbiBkaXIpCkBAIC02OTYsNiArODE0LDM5IEBAIGZyZWVfZG9t aW5hbmNlX2luZm8gKGVudW0gY2RpX2RpcmVjdGlvbiBkaXIpCiAgIGZyZWVf ZG9taW5hbmNlX2luZm8gKGNmdW4sIGRpcik7CiB9CiAKKy8qIEZyZWUgZG9t aW5hbmNlIGluZm9ybWF0aW9uIGZvciBkaXJlY3Rpb24gRElSIGluIHJlZ2lv biBSRUdJT04uICAqLworCit2b2lkCitmcmVlX2RvbWluYW5jZV9pbmZvX2Zv cl9yZWdpb24gKGVudW0gY2RpX2RpcmVjdGlvbiBkaXIsCisJCQkJdmVjPGJh c2ljX2Jsb2NrPiByZWdpb24sCisJCQkJZnVuY3Rpb24gKmZuKQoreworICBi YXNpY19ibG9jayBiYjsKKyAgdW5zaWduZWQgaW50IGk7CisgIHVuc2lnbmVk IGludCBkaXJfaW5kZXggPSBkb21fY29udmVydF9kaXJfdG9faWR4IChkaXIp OworCisgIGlmICghZG9tX2luZm9fYXZhaWxhYmxlX3AgKGRpcikpCisgICAg cmV0dXJuOworCisgIEZPUl9FQUNIX1ZFQ19FTFQgKHJlZ2lvbiwgaSwgYmIp CisgICAgeworICAgICAgZXRfZnJlZV90cmVlX2ZvcmNlIChiYi0+ZG9tW2Rp cl9pbmRleF0pOworICAgICAgYmItPmRvbVtkaXJfaW5kZXhdID0gTlVMTDsK KyAgICB9CisgIGV0X2ZyZWVfcG9vbHMgKCk7CisKKyAgZm4tPmNmZy0+eF9k b21fY29tcHV0ZWRbZGlyX2luZGV4XSA9IERPTV9OT05FOworCisgIGZuLT5j ZmctPnhfbl9iYnNfaW5fZG9tX3RyZWVbZGlyX2luZGV4XSA9IDA7Cit9CisK K3ZvaWQKK2ZyZWVfZG9taW5hbmNlX2luZm9fZm9yX3JlZ2lvbiAoZW51bSBj ZGlfZGlyZWN0aW9uIGRpciwKKwkJCQl2ZWM8YmFzaWNfYmxvY2s+IHJlZ2lv bikKK3sKKyAgZnJlZV9kb21pbmFuY2VfaW5mb19mb3JfcmVnaW9uIChkaXIs IHJlZ2lvbiwgY2Z1bik7Cit9CisKIC8qIFJldHVybiB0aGUgaW1tZWRpYXRl IGRvbWluYXRvciBvZiBiYXNpYyBibG9jayBCQi4gICovCiBiYXNpY19ibG9j awogZ2V0X2ltbWVkaWF0ZV9kb21pbmF0b3IgKGVudW0gY2RpX2RpcmVjdGlv biBkaXIsIGJhc2ljX2Jsb2NrIGJiKQpkaWZmIC0tZ2l0IGEvZ2NjL2RvbWlu YW5jZS5oIGIvZ2NjL2RvbWluYW5jZS5oCmluZGV4IDk2MWM0ZTIuLjhlZDdm NWMgMTAwNjQ0Ci0tLSBhL2djYy9kb21pbmFuY2UuaAorKysgYi9nY2MvZG9t aW5hbmNlLmgKQEAgLTM2LDggKzM2LDE1IEBAIGVudW0gZG9tX3N0YXRlCiB9 OwogCiBleHRlcm4gdm9pZCBjYWxjdWxhdGVfZG9taW5hbmNlX2luZm8gKGVu dW0gY2RpX2RpcmVjdGlvbik7CitleHRlcm4gdm9pZCBjYWxjdWxhdGVfZG9t aW5hbmNlX2luZm9fZm9yX3JlZ2lvbiAoZW51bSBjZGlfZGlyZWN0aW9uLAor CQkJCQkJIHZlYzxiYXNpY19ibG9jaz4pOwogZXh0ZXJuIHZvaWQgZnJlZV9k b21pbmFuY2VfaW5mbyAoZnVuY3Rpb24gKiwgZW51bSBjZGlfZGlyZWN0aW9u KTsKIGV4dGVybiB2b2lkIGZyZWVfZG9taW5hbmNlX2luZm8gKGVudW0gY2Rp X2RpcmVjdGlvbik7CitleHRlcm4gdm9pZCBmcmVlX2RvbWluYW5jZV9pbmZv X2Zvcl9yZWdpb24gKGVudW0gY2RpX2RpcmVjdGlvbiwKKwkJCQkJICAgIHZl YzxiYXNpY19ibG9jaz4sCisJCQkJCSAgICBmdW5jdGlvbiAqKTsKK2V4dGVy biB2b2lkIGZyZWVfZG9taW5hbmNlX2luZm9fZm9yX3JlZ2lvbiAoZW51bSBj ZGlfZGlyZWN0aW9uLAorCQkJCQkgICAgdmVjPGJhc2ljX2Jsb2NrPik7CiBl eHRlcm4gYmFzaWNfYmxvY2sgZ2V0X2ltbWVkaWF0ZV9kb21pbmF0b3IgKGVu dW0gY2RpX2RpcmVjdGlvbiwgYmFzaWNfYmxvY2spOwogZXh0ZXJuIHZvaWQg c2V0X2ltbWVkaWF0ZV9kb21pbmF0b3IgKGVudW0gY2RpX2RpcmVjdGlvbiwg YmFzaWNfYmxvY2ssCiAJCQkJICAgICBiYXNpY19ibG9jayk7CmRpZmYgLS1n aXQgYS9nY2MvdHJlZS1pZi1jb252LmMgYi9nY2MvdHJlZS1pZi1jb252LmMK aW5kZXggZWVjNDMxZS4uYWEyNmM1OSAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUt aWYtY29udi5jCisrKyBiL2djYy90cmVlLWlmLWNvbnYuYwpAQCAtMTMwOSw2 ICsxMzA5LDM4IEBAIHByZWRpY2F0ZV9iYnMgKGxvb3BfcCBsb29wKQogCSAg ICAgICYmIGJiX3ByZWRpY2F0ZV9naW1wbGlmaWVkX3N0bXRzIChsb29wLT5s YXRjaCkgPT0gTlVMTCk7CiB9CiAKKy8qIEJ1aWxkIHJlZ2lvbiBieSBhZGRp bmcgbG9vcCBwcmUtaGVhZGVyIGFuZCBwb3N0LWhlYWRlciBibG9ja3MuICAq LworCitzdGF0aWMgdmVjPGJhc2ljX2Jsb2NrPgorYnVpbGRfcmVnaW9uIChz dHJ1Y3QgbG9vcCAqbG9vcCkKK3sKKyAgdmVjPGJhc2ljX2Jsb2NrPiByZWdp b24gPSB2TlVMTDsKKyAgYmFzaWNfYmxvY2sgZXhpdF9iYiA9IE5VTEw7CisK KyAgZ2NjX2Fzc2VydCAoaWZjX2Jicyk7CisgIC8qIFRoZSBmaXJzdCBlbGVt ZW50IGlzIGxvb3AgcHJlLWhlYWRlci4gICovCisgIHJlZ2lvbi5zYWZlX3B1 c2ggKGxvb3BfcHJlaGVhZGVyX2VkZ2UgKGxvb3ApLT5zcmMpOworCisgIGZv ciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbG9vcC0+bnVtX25vZGVzOyBp KyspCisgICAgeworICAgICAgYmFzaWNfYmxvY2sgYmIgPSBpZmNfYmJzW2ld OworICAgICAgcmVnaW9uLnNhZmVfcHVzaCAoYmIpOworICAgICAgLyogRmlu ZCBsb29wIHBvc3RoZWFkZXIuICAqLworICAgICAgZWRnZSBlOworICAgICAg ZWRnZV9pdGVyYXRvciBlaTsKKyAgICAgIEZPUl9FQUNIX0VER0UgKGUsIGVp LCBiYi0+c3VjY3MpCisJaWYgKGxvb3BfZXhpdF9lZGdlX3AgKGxvb3AsIGUp KQorCSAgeworCSAgICAgIGV4aXRfYmIgPSBlLT5kZXN0OworCSAgICAgIGJy ZWFrOworCSAgfQorICAgIH0KKyAgLyogVGhlIGxhc3QgZWxlbWVudCBpcyBs b29wIHBvc3QtaGVhZGVyLiAgKi8KKyAgZ2NjX2Fzc2VydCAoZXhpdF9iYik7 CisgIHJlZ2lvbi5zYWZlX3B1c2ggKGV4aXRfYmIpOworICByZXR1cm4gcmVn aW9uOworfQorCiAvKiBSZXR1cm4gdHJ1ZSB3aGVuIExPT1AgaXMgaWYtY29u dmVydGlibGUuICBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uCiAgICBmb3Ig aWZfY29udmVydGlibGVfbG9vcF9wLiAgUkVGUyBhbmQgRERSUyBhcmUgaW5p dGlhbGl6ZWQgYW5kIGZyZWVkCiAgICBpbiBpZl9jb252ZXJ0aWJsZV9sb29w X3AuICAqLwpAQCAtMTMxOCw2ICsxMzUwLDcgQEAgaWZfY29udmVydGlibGVf bG9vcF9wXzEgKHN0cnVjdCBsb29wICpsb29wLCB2ZWM8ZGF0YV9yZWZlcmVu Y2VfcD4gKnJlZnMpCiB7CiAgIHVuc2lnbmVkIGludCBpOwogICBiYXNpY19i bG9jayBleGl0X2JiID0gTlVMTDsKKyAgdmVjPGJhc2ljX2Jsb2NrPiByZWdp b247CiAKICAgaWYgKGZpbmRfZGF0YV9yZWZlcmVuY2VzX2luX2xvb3AgKGxv b3AsIHJlZnMpID09IGNocmVjX2RvbnRfa25vdykKICAgICByZXR1cm4gZmFs c2U7CkBAIC0xMzcwLDkgKzE0MDMsMTYgQEAgaWZfY29udmVydGlibGVfbG9v cF9wXzEgKHN0cnVjdCBsb29wICpsb29wLCB2ZWM8ZGF0YV9yZWZlcmVuY2Vf cD4gKnJlZnMpCiAJICA9IG5ldyBoYXNoX21hcDxpbm5lcm1vc3RfbG9vcF9i ZWhhdmlvcl9oYXNoLCBkYXRhX3JlZmVyZW5jZV9wPjsKICAgYmFzZXJlZl9E Ul9tYXAgPSBuZXcgaGFzaF9tYXA8dHJlZV9vcGVyYW5kX2hhc2gsIGRhdGFf cmVmZXJlbmNlX3A+OwogCi0gIGNhbGN1bGF0ZV9kb21pbmFuY2VfaW5mbyAo Q0RJX1BPU1RfRE9NSU5BVE9SUyk7CisgIC8qIENvbXB1dGUgcG9zdC1kb21p bmF0b3IgdHJlZSBsb2NhbGx5LiAgKi8KKyAgcmVnaW9uID0gYnVpbGRfcmVn aW9uIChsb29wKTsKKyAgY2FsY3VsYXRlX2RvbWluYW5jZV9pbmZvX2Zvcl9y ZWdpb24gKENESV9QT1NUX0RPTUlOQVRPUlMsIHJlZ2lvbik7CisKICAgcHJl ZGljYXRlX2JicyAobG9vcCk7CiAKKyAgLyogRnJlZSBwb3N0LWRvbWluYXRv ciB0cmVlIHNpbmNlIGl0IGlzIG5vdCB1c2VkIGFmdGVyIHByZWRpY2F0aW9u LiAgKi8KKyAgZnJlZV9kb21pbmFuY2VfaW5mb19mb3JfcmVnaW9uIChDRElf UE9TVF9ET01JTkFUT1JTLCByZWdpb24pOworICByZWdpb24ucmVsZWFzZSAo KTsKKwogICBmb3IgKGkgPSAwOyByZWZzLT5pdGVyYXRlIChpLCAmZHIpOyBp KyspCiAgICAgewogICAgICAgdHJlZSByZWYgPSBEUl9SRUYgKGRyKTsKQEAg LTI3NTIsNyArMjc5Miw2IEBAIHRyZWVfaWZfY29udmVyc2lvbiAoc3RydWN0 IGxvb3AgKmxvb3ApCiAgICAgICBmcmVlIChpZmNfYmJzKTsKICAgICAgIGlm Y19iYnMgPSBOVUxMOwogICAgIH0KLSAgZnJlZV9kb21pbmFuY2VfaW5mbyAo Q0RJX1BPU1RfRE9NSU5BVE9SUyk7CiAKICAgcmV0dXJuIHRvZG87CiB9CkBA IC0yODA1LDE0ICsyODQ0LDYgQEAgcGFzc19pZl9jb252ZXJzaW9uOjpleGVj dXRlIChmdW5jdGlvbiAqZnVuKQogICBpZiAobnVtYmVyX29mX2xvb3BzIChm dW4pIDw9IDEpCiAgICAgcmV0dXJuIDA7CiAKLSAgLyogSWYgdGhlcmUgYXJl IGluZmluaXRlIGxvb3BzLCBkdXJpbmcgQ0RJX1BPU1RfRE9NSU5BVE9SUyBj b21wdXRhdGlvbgotICAgICB3ZSBjYW4gcGljayBwcmV0dHkgbXVjaCByYW5k b20gYmIgaW5zaWRlIG9mIHRoZSBpbmZpbml0ZSBsb29wIHRoYXQKLSAgICAg aGFzIHRoZSBmYWtlIGVkZ2UuICBJZiB3ZSBhcmUgdW5sdWNreSBlbm91Z2gs IHRoaXMgY2FuIGNvbmZ1c2UgdGhlCi0gICAgIGFkZF90b19wcmVkaWNhdGVf bGlzdCBwb3N0LWRvbWluYXRvciBjaGVjayB0byBvcHRpbWl6ZSBhcyBpZiB0 aGF0Ci0gICAgIGJiIG9yIHNvbWUgb3RoZXIgb25lIGlzIGEgam9pbiBibG9j ayB3aGVuIGl0IGFjdHVhbGx5IGlzIG5vdC4KLSAgICAgU2VlIFBSNzA5MTYu ICAqLwotICBjb25uZWN0X2luZmluaXRlX2xvb3BzX3RvX2V4aXQgKCk7Ci0K ICAgRk9SX0VBQ0hfTE9PUCAobG9vcCwgMCkKICAgICBpZiAoZmxhZ190cmVl X2xvb3BfaWZfY29udmVydCA9PSAxCiAJfHwgZmxhZ190cmVlX2xvb3BfaWZf Y29udmVydF9zdG9yZXMgPT0gMQpAQCAtMjgyMCw4ICsyODUxLDYgQEAgcGFz c19pZl9jb252ZXJzaW9uOjpleGVjdXRlIChmdW5jdGlvbiAqZnVuKQogCSAg ICAmJiAhbG9vcC0+ZG9udF92ZWN0b3JpemUpKQogICAgICAgdG9kbyB8PSB0 cmVlX2lmX2NvbnZlcnNpb24gKGxvb3ApOwogCi0gIHJlbW92ZV9mYWtlX2V4 aXRfZWRnZXMgKCk7Ci0KICAgaWYgKGZsYWdfY2hlY2tpbmcpCiAgICAgewog ICAgICAgYmFzaWNfYmxvY2sgYmI7Cg== --001a1141bf42ffa631053ed21106--