From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Jeffrey Walton Newsgroups: gmane.emacs.bugs Subject: bug#9747: C-x h TAB and M-x untabify Date: Thu, 13 Oct 2011 19:27:54 -0400 Message-ID: Reply-To: noloader@gmail.com NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=bcaec5485cf871279404af367d27 X-Trace: dough.gmane.org 1318548799 9693 80.91.229.12 (13 Oct 2011 23:33:19 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Thu, 13 Oct 2011 23:33:19 +0000 (UTC) To: 9747@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Fri Oct 14 01:33:15 2011 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([140.186.70.17]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1REUm1-0004Cd-O3 for geb-bug-gnu-emacs@m.gmane.org; Fri, 14 Oct 2011 01:33:15 +0200 Original-Received: from localhost ([::1]:35574 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1REUm0-0007e1-9G for geb-bug-gnu-emacs@m.gmane.org; Thu, 13 Oct 2011 19:33:12 -0400 Original-Received: from eggs.gnu.org ([140.186.70.92]:37722) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1REUlN-0007cL-1W for bug-gnu-emacs@gnu.org; Thu, 13 Oct 2011 19:32:34 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1REUlL-0001bD-IN for bug-gnu-emacs@gnu.org; Thu, 13 Oct 2011 19:32:33 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:58778) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1REUlL-0001b8-Es for bug-gnu-emacs@gnu.org; Thu, 13 Oct 2011 19:32:31 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.69) (envelope-from ) id 1REUlp-0005qI-RX for bug-gnu-emacs@gnu.org; Thu, 13 Oct 2011 19:33:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Jeffrey Walton Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 13 Oct 2011 23:33:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 9747 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.131854874422409 (code B ref -1); Thu, 13 Oct 2011 23:33:01 +0000 Original-Received: (at submit) by debbugs.gnu.org; 13 Oct 2011 23:32:24 +0000 Original-Received: from localhost ([127.0.0.1] helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1REUlD-0005pN-Vg for submit@debbugs.gnu.org; Thu, 13 Oct 2011 19:32:24 -0400 Original-Received: from eggs.gnu.org ([140.186.70.92]) by debbugs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1REUhb-0005jM-5U for submit@debbugs.gnu.org; Thu, 13 Oct 2011 19:28:40 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1REUgz-0000pI-W9 for submit@debbugs.gnu.org; Thu, 13 Oct 2011 19:28:03 -0400 Original-Received: from lists.gnu.org ([140.186.70.17]:46678) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1REUgz-0000p0-NT for submit@debbugs.gnu.org; Thu, 13 Oct 2011 19:28:01 -0400 Original-Received: from eggs.gnu.org ([140.186.70.92]:43218) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1REUgy-0007Ev-FO for bug-gnu-emacs@gnu.org; Thu, 13 Oct 2011 19:28:01 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1REUgt-0000dg-HI for bug-gnu-emacs@gnu.org; Thu, 13 Oct 2011 19:28:00 -0400 Original-Received: from mail-vw0-f41.google.com ([209.85.212.41]:63418) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1REUgt-0000dS-3Q for bug-gnu-emacs@gnu.org; Thu, 13 Oct 2011 19:27:55 -0400 Original-Received: by vws16 with SMTP id 16so158837vws.0 for ; Thu, 13 Oct 2011 16:27:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:reply-to:date:message-id:subject:from:to:content-type; bh=3uo8xS/zUj02N9iRLf0wBiDu5Vrf3XDdT/G+ANvxqCU=; b=f72fJZoymiikLIBVAznAlTBbFNVCwQQOTUD7DUvskoxqiysVt5eAUQubPcwUM1VUtJ IGH188mV6DxVqDHDKRxKH+nYqEaVV9czu/1IcdhfxWmumkO73ucC45m/2AsCt8hVw3kE 7ZaAvCNkl+tK+SavuyTVoPMPQt1Zfskaq+vFM= Original-Received: by 10.52.112.135 with SMTP id iq7mr6439259vdb.51.1318548474504; Thu, 13 Oct 2011 16:27:54 -0700 (PDT) Original-Received: by 10.220.163.9 with HTTP; Thu, 13 Oct 2011 16:27:54 -0700 (PDT) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Mailman-Approved-At: Thu, 13 Oct 2011 19:32:23 -0400 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.11 Precedence: list Resent-Date: Thu, 13 Oct 2011 19:33:01 -0400 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 140.186.70.43 X-Mailman-Approved-At: Thu, 13 Oct 2011 19:33:08 -0400 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:52632 Archived-At: --bcaec5485cf871279404af367d27 Content-Type: text/plain; charset=ISO-8859-1 I often use C-x h TAB and M-x untabify to format C, C++, and Java code. If a document has an errant UTF-8 byte order mark (a UTF-8 BOM is EF BB BF), Emacs cannot always format the source file. For example, the attached Java file (JavaEncryptor.java-backup) has 1845 BOMs sprinkled throughout. I'm not sure what editor put them in, but Emacs does not properly handle some operations with them present. If I strip the errant BOMs with the attached program (efbbbf-strip.cpp), Emacs will properly format the file. --bcaec5485cf871279404af367d27 Content-Type: application/octet-stream; name="JavaEncryptor.java-backup" Content-Disposition: attachment; filename="JavaEncryptor.java-backup" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gtqdmsaw0 LyoqCiAqIE9XQVNQIEVudGVycHJpc2UgU2VjdXJpdHkgQVBJIChFU0FQSSkKICoKICogVGhpcyBm aWxlIGlzIHBhcnQgb2YgdGhlIE9wZW4gV2ViIEFwcGxpY2F0aW9uIFNlY3VyaXR5IFByb2plY3Qg KE9XQVNQKQogKiBFbnRlcnByaXNlIFNlY3VyaXR5IEFQSSAoRVNBUEkpIHByb2plY3QuIEZvciBk ZXRhaWxzLCBwbGVhc2Ugc2VlCiAqIDxhIGhyZWY9Imh0dHA6Ly93d3cub3dhc3Aub3JnL2luZGV4 LnBocC9FU0FQSSI+aHR0cDovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL0VTQVBJPC9hPi4KICoK ICogQ29weXJpZ2h0IChjKSAyMDA3IC0gVGhlIE9XQVNQIEZvdW5kYXRpb24KICoKICogVGhlIEVT QVBJIGlzIHB1Ymxpc2hlZCBieSBPV0FTUCB1bmRlciB0aGUgQlNEIGxpY2Vuc2UuIFlvdSBzaG91 bGQgcmVhZCBhbmQgYWNjZXB0IHRoZQogKiBMSUNFTlNFIGJlZm9yZSB5b3UgdXNlLCBtb2RpZnks IGFuZC9vciByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZS4KICoKICogQGF1dGhvciBKZWZmIFdp bGxpYW1zIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXNwZWN0c2VjdXJpdHkuY29tIj5Bc3BlY3QgU2Vj dXJpdHk8L2E+CiAqIEBhdXRob3Iga2V2aW4udy53YWxsQGdtYWlsLmNvbQogKiBAY3JlYXRlZCAy MDA3CiAqLwpwYWNrYWdlIG9yZy5vd2FzcC5lc2FwaS5yZWZlcmVuY2UuY3J5cHRvOwoKaW1wb3J0 IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdF eGNlcHRpb247CmltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJF eGNlcHRpb247CmltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CmltcG9y dCBqYXZhLnNlY3VyaXR5LktleVBhaXI7CmltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXJHZW5l cmF0b3I7CmltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CmltcG9ydCBqYXZhLnNl Y3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9T dWNoUHJvdmlkZXJFeGNlcHRpb247CmltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7Cmlt cG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOwppbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNL ZXk7CmltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKaW1wb3J0IGphdmEuc2VjdXJp dHkuU2VjdXJpdHk7CmltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZTsKaW1wb3J0IGphdmEu dXRpbC5EYXRlOwppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwppbXBvcnQgamF2YS51dGlsLk1h cDsKaW1wb3J0IGphdmEudXRpbC5TZXQ7CmltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKaW1wb3J0 IGphdmEudXRpbC5NYXAuRW50cnk7CgppbXBvcnQgamF2YXguY3J5cHRvLkJhZFBhZGRpbmdFeGNl cHRpb247CmltcG9ydCBqYXZheC5jcnlwdG8uQ2lwaGVyOwppbXBvcnQgamF2YXguY3J5cHRvLkls bGVnYWxCbG9ja1NpemVFeGNlcHRpb247Ci8vIGltcG9ydCBqYXZheC5jcnlwdG8uTWFjO++7vyAg 77u/ICDvu78gIC8vIFVuY29tbWVudCBpZiBjb21wdXRlSE1BQygpIGlzIGluY2x1ZGVkLgppbXBv cnQgamF2YXguY3J5cHRvLk5vU3VjaFBhZGRpbmdFeGNlcHRpb247CmltcG9ydCBqYXZheC5jcnlw dG8uU2VjcmV0S2V5OwppbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYzsKaW1w b3J0IGphdmF4LmNyeXB0by5zcGVjLkl2UGFyYW1ldGVyU3BlYzsKCmltcG9ydCBvcmcub3dhc3Au ZXNhcGkuRVNBUEk7CmltcG9ydCBvcmcub3dhc3AuZXNhcGkuRW5jb2RlckNvbnN0YW50czsKaW1w b3J0IG9yZy5vd2FzcC5lc2FwaS5FbmNyeXB0b3I7CmltcG9ydCBvcmcub3dhc3AuZXNhcGkuTG9n Z2VyOwppbXBvcnQgb3JnLm93YXNwLmVzYXBpLmNvZGVjcy5IZXg7CmltcG9ydCBvcmcub3dhc3Au ZXNhcGkuY3J5cHRvLkNpcGhlclNwZWM7CmltcG9ydCBvcmcub3dhc3AuZXNhcGkuY3J5cHRvLkNp cGhlclRleHQ7CmltcG9ydCBvcmcub3dhc3AuZXNhcGkuY3J5cHRvLkNyeXB0b0hlbHBlcjsKaW1w b3J0IG9yZy5vd2FzcC5lc2FwaS5jcnlwdG8uS2V5RGVyaXZhdGlvbkZ1bmN0aW9uOwppbXBvcnQg b3JnLm93YXNwLmVzYXBpLmNyeXB0by5QbGFpblRleHQ7CmltcG9ydCBvcmcub3dhc3AuZXNhcGku Y3J5cHRvLlNlY3VyaXR5UHJvdmlkZXJMb2FkZXI7CmltcG9ydCBvcmcub3dhc3AuZXNhcGkuZXJy b3JzLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CmltcG9ydCBvcmcub3dhc3AuZXNhcGkuZXJyb3Jz LkVuY3J5cHRpb25FeGNlcHRpb247CmltcG9ydCBvcmcub3dhc3AuZXNhcGkuZXJyb3JzLkludGVn cml0eUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5vd2FzcC5lc2FwaS5yZWZlcmVuY2UuRGVmYXVsdFNl Y3VyaXR5Q29uZmlndXJhdGlvbjsKCi8qKgogKiBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2Yg dGhlIHtAY29kZSBFbmNyeXB0b3J9IGludGVyZmFjZS4gVGhpcyBpbXBsZW1lbnRhdGlvbgogKiBs YXllcnMgb24gdGhlIEpDRSBwcm92aWRlZCBjcnlwdG9ncmFwaGljIHBhY2thZ2UuIEFsZ29yaXRo bXMgdXNlZCBhcmUKICogY29uZmlndXJhYmxlIGluIHRoZSB7QGNvZGUgRVNBUEkucHJvcGVydGll c30gZmlsZS4gVGhlIG1haW4gcHJvcGVydHkKICogY29udHJvbGxpbmcgdGhlIHNlbGVjdGlvbiBv ZiB0aGlzIGNsYXNzIGlzIHtAY29kZSBFU0FQSS5FbmNyeXB0b3J9LiBNb3N0IG9mCiAqIHRoZSBv dGhlciBlbmNyeXB0aW9uIHJlbGF0ZWQgcHJvcGVydGllcyBoYXZlIHByb3BlcnR5IG5hbWVzIHRo YXQgc3RhcnQgd2l0aAogKiB0aGUgc3RyaW5nICJFbmNyeXB0b3IuIi4KICoKICogQGF1dGhvciBK ZWZmIFdpbGxpYW1zIChqZWZmLndpbGxpYW1zIC5hdC4gYXNwZWN0c2VjdXJpdHkuY29tKSA8YQog KiAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXNwZWN0c2VjdXJpdHkuY29tIj5Bc3BlY3QgU2Vj dXJpdHk8L2E+CiAqIEBhdXRob3Iga2V2aW4udy53YWxsQGdtYWlsLmNvbQogKiBAYXV0aG9yIENo cmlzIFNjaG1pZHQgKGNocmlzaXNiZWVmIC5hdC4gZ21haWwuY29tKQogKiBAc2luY2UgSnVuZSAx LCAyMDA3OyBzb21lIG1ldGhvZHMgc2luY2UgRVNBUEkgSmF2YSAyLjAKICogQHNlZSBvcmcub3dh c3AuZXNhcGkuRW5jcnlwdG9yCiAqLwpwdWJsaWMgZmluYWwgY2xhc3MgSmF2YUVuY3J5cHRvciBp bXBsZW1lbnRzIEVuY3J5cHRvciB7CiAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBFbmNyeXB0 b3Igc2luZ2xldG9uSW5zdGFuY2U7CgogICAgLy8gTm90ZTogVGhpcyBkb3VibGUtY2hlY2sgcGF0 dGVybiBvbmx5IHdvcmtzIGJlY2F1c2Ugc2luZ2xldG9uSW5zdGFuY2UKICAgIC8vICAgICAgIGlz IGRlY2xhcmVkIHRvIGJlIHZvbGF0aWxlLiAgVXN1YWxseSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQK ICAgIC8vICAgICAgIHZpYSBFU0FQSS5lbmNyeXB0b3IoKSByYXRoZXIgdGhhbiBkaXJlY3RseS4K ICAgIHB1YmxpYyBzdGF0aWMgRW5jcnlwdG9yIGdldEluc3RhbmNlKCkgdGhyb3dzIEVuY3J5cHRp b25FeGNlcHRpb24gewoJaWYgKCBzaW5nbGV0b25JbnN0YW5jZSA9PSBudWxsICkgewoJICAgIHN5 bmNocm9uaXplZCAoIEphdmFFbmNyeXB0b3IuY2xhc3MgKSB7CgkJaWYgKCBzaW5nbGV0b25JbnN0 YW5jZSA9PSBudWxsICkgewoJCSAgICBzaW5nbGV0b25JbnN0YW5jZSA9IG5ldyBKYXZhRW5jcnlw dG9yKCk7CgkJfQoJICAgIH0KCX0KCXJldHVybiBzaW5nbGV0b25JbnN0YW5jZTsKICAgIH0KCiAg ICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7CgogICAgLy8gZW5j cnlwdGlvbgogICAgcHJpdmF0ZSBzdGF0aWMgU2VjcmV0S2V5U3BlYyBzZWNyZXRLZXlTcGVjID0g bnVsbDsgLy8gRElTQ1VTUzogV2h5IHN0YXRpYz8gSW1wbGllcyBvbmUga2V5PyE/CiAgICBwcml2 YXRlIHN0YXRpYyBTdHJpbmcgZW5jcnlwdEFsZ29yaXRobSA9ICJBRVMiOwogICAgcHJpdmF0ZSBz dGF0aWMgU3RyaW5nIGVuY29kaW5nID0gIlVURi04IjsKICAgIHByaXZhdGUgc3RhdGljIGludCBl bmNyeXB0aW9uS2V5TGVuZ3RoID0gMTI4OwoKICAgIC8vIGRpZ2l0YWwgc2lnbmF0dXJlcwogICAg cHJpdmF0ZSBzdGF0aWMgUHJpdmF0ZUtleSBwcml2YXRlS2V5ID0gbnVsbDsKICAgIO+7vyAgICBw cml2YXRlIHN0YXRpYyBQdWJsaWNLZXkgcHVibGljS2V5ID0gbnVsbDsKICAgIO+7vyAgICBwcml2 YXRlIHN0YXRpYyBTdHJpbmcgc2lnbmF0dXJlQWxnb3JpdGhtID0gIlNIQTF3aXRoRFNBIjsKICAg IHByaXZhdGUgc3RhdGljIFN0cmluZyByYW5kb21BbGdvcml0aG0gPSAiU0hBMVBSTkciOwogICAg 77u/ICAgIHByaXZhdGUgc3RhdGljIGludCBzaWduYXR1cmVLZXlMZW5ndGggPSAxMDI0OwogICAg 77u/ICAKCe+7vyAgICAvLyBoYXNoaW5nCgnvu78gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhh c2hBbGdvcml0aG0gPSAiU0hBLTUxMiI7CiAgICDvu78gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGhh c2hJdGVyYXRpb25zID0gMTAyNDsKICAgIO+7vyAgCgnvu78gICAgLy8gTG9nZ2luZyAtIERJU0NV U1M6IFRoaXMgInN0aWNrcyIgdXMgd2l0aCBhIHNwZWNpZmljIGxvZ2dlciB0byB3aGF0ZXZlciBp dCB3YXMgd2hlbgoJ77u/ICAgIC8v77u/ICDvu78gIO+7vyAg77u/ICDvu78gICAgdGhpcyBjbGFz cyBpcyBmaXJzdCBsb2FkZWQuIElzIHRoaXMgYSBiaWcgbGltaXRhdGlvbj8gU2luY2UgdGhlcmUK Ce+7vyAgICAvLyAgICAgICAgICAgICAgICAgICAgaXMgbm8gbWV0aG9kIHRvIHJlc2V0IGl0LCB3 ZSBtYXkgaGFzIHdlbGwgbWFrZSBpdCAnZmluYWwnIGFsc28uCgnvu78gICAgcHJpdmF0ZSBzdGF0 aWMgTG9nZ2VyIGxvZ2dlciA9IEVTQVBJLmdldExvZ2dlcigiSmF2YUVuY3J5cHRvciIpOwogICAg 77u/ICAgIC8vIFVzZWQgdG8gcHJpbnQgb3V0IHdhcm5pbmdzIGFib3V0IGRlcHJlY2F0ZWQgbWV0 aG9kcy4KCe+7vyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZW5jcnlwdENvdW50ZXIgPSAwOwogICAg 77u/77u/ICAgIHByaXZhdGUgc3RhdGljIGludCBkZWNyeXB0Q291bnRlciA9IDA7CiAgICDvu78g ICAgLy8gRElTQ1VTUzogT0sgdG8gbm90IGhhdmUgYSBwcm9wZXJ0eSBmb3IgdGhpcyB0byBzZXQg dGhlIGZyZXF1ZW5jeT8KCe+7vyAgICAvLyAgICAgICAgICBUaGUgZGVzaXJlIGlzIHRvIHBlcnN1 YWRlIHBlb3BsZSB0byBtb3ZlIGF3YXkgZnJvbSB0aGVzZQoJ77u/ICAgIC8vICAgICAgICAgIHR3 byBkZXByZWNhdGVkIGVuY3J5cHQoU3RyaW5nKSAvIGRlY3J5cHQoU3RyaW5nKSBtZXRob2RzLAoJ 77u/ICAgIC8vICAgICAgICAgIHNvIHBlcmhhcHMgdGhlIGFubm95YW5jZSBmYWN0b3Igb2Ygbm90 IGJlaW5nIGFibGUgdG8KCe+7vyAgICAvLyAgICAgICAgICBjaGFuZ2UgaXQgd2lsbCBoZWxwLiBG b3Igbm93LCBpdCBpcyBqdXN0IGhhcmQtY29kZWQgaGVyZS4KCe+7vyAgICAvLyAgICAgICAgICBX ZSBjb3VsZCBiZSBtZWFuIGFuZCBqdXN0IHByaW50IGEgd2FybmluZyAqZXZlcnkqIHRpbWUuCgnv u78gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGxvZ0V2ZXJ5TnRoVXNlID0gMjU7CiAgICDv u78gIAoJ77u/ICAgIC8vICpPbmx5KiB1c2UgdGhpcyBzdHJpbmcgZm9yIHVzZXIgbWVzc2FnZXMg Zm9yIEVuY3J5cHRpb25FeGNlcHRpb24gd2hlbgogICAgLy8gZGVjcnlwdGlvbiBmYWlscy4gVGhp cyBpcyB0byBwcmV2ZW50IGluZm9ybWF0aW9uIGxlYWthZ2UgdGhhdCBtYXkgYmUKICAgIC8vIHZh bHVhYmxlIGluIHZhcmlvdXMgZm9ybXMgb2YgY2lwaGVydGV4dCBhdHRhY2tzLCBzdWNoIGFzIHRo ZQoJ77u/ICAgIC8vIFBhZGRlZCBPcmFjbGUgYXR0YWNrIGRlc2NyaWJlZCBieSBSaXp6byBhbmQg RHVvbmcuCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDUllQVElPTl9GQUlMRUQgPQoJ IkRlY3J5cHRpb24gZmFpbGVkOyBzZWUgbG9ncyBmb3IgZGV0YWlscy4iOwoKICAgIC8vICMgb2Yg c2Vjb25kcyB0aGF0IGFsbCBmYWlsZWQgZGVjcnlwdGlvbiBhdHRlbXB0cyB3aWxsIHRha2UuIFVz ZWQgdG8KICAgIC8vIGhlbHAgcHJldmVudCBzaWRlLWNoYW5uZWwgdGltaW5nIGF0dGFja3MuCiAg ICBwcml2YXRlIHN0YXRpYyBpbnQgTl9TRUNTID0gMjsKCiAgICDvu78gICAgLy8gTG9hZCB0aGUg cHJlZmVycmVkIEpDRSBwcm92aWRlciBpZiBvbmUgaGFzIGJlZW4gc3BlY2lmaWVkLgoJ77u/ICAg IHN0YXRpYyB7Cgnvu78gICAgICB0cnkgewoJICAgIFNlY3VyaXR5UHJvdmlkZXJMb2FkZXIubG9h ZEVTQVBJUHJlZmVycmVkSkNFUHJvdmlkZXIoKTsKCX0gY2F0Y2ggKE5vU3VjaFByb3ZpZGVyRXhj ZXB0aW9uIGV4KSB7CgkgICAg77u/ICAvLyBOb3RlIHRoYXQgYXVkaXQgbG9nZ2luZyBpcyBkb25l IGVsc2V3aGVyZSBpbiBjYWxsZWQgbWV0aG9kLgoJCWxvZ2dlci5mYXRhbChMb2dnZXIuU0VDVVJJ VFlfRkFJTFVSRSwKCQkJICAgICAiSmF2YUVuY3J5cHRvciBmYWlsZWQgdG8gbG9hZCBwcmVmZXJy ZWQgSkNFIHByb3ZpZGVyLiIsIGV4KTsKCSAgICB0aHJvdyBuZXcgRXhjZXB0aW9uSW5Jbml0aWFs aXplckVycm9yKGV4KTsKCX0KCXNldHVwQWxnb3JpdGhtcygpOwoJ77u/ICAgIH0KICAgIO+7vyAg CiAgICAvKioKICAgICAqIEdlbmVyYXRlcyBhIG5ldyBzdHJvbmdseSByYW5kb20gc2VjcmV0IGtl eSBhbmQgc2FsdCB0aGF0IGNhbiBiZQogICAgICogY29weSBhbmQgcGFzdGVkIGluIHRoZSA8Yj5F U0FQSS5wcm9wZXJ0aWVzPC9iPiBmaWxlLgogICAgICoKICAgICAqIEBwYXJhbSBhcmdzIFNldCBm aXJzdCBhcmd1bWVudCB0byAiLXByaW50IiB0byBkaXNwbGF5IGF2YWlsYWJsZSBhbGdvcml0aG1z IG9uIHN0YW5kYXJkIG91dHB1dC4KICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbu+7 vyAgVG8gY292ZXIgYSBtdWx0aXR1ZGUgb2Ygc2lucywgbW9zdGx5IGluIGNvbmZpZ3VyaW5nIEVT QVBJLnByb3BlcnRpZXMuCiAgICAgKi8KCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdb XSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbiB7Cgnvu78gIO+7vyAgU3lzdGVtLm91dC5wcmludGxu KCAiR2VuZXJhdGluZyBhIG5ldyBzZWNyZXQgbWFzdGVyIGtleSIgKTsKCe+7vyAg77u/ICAKCSAg ICDvu78gIO+7vyAgLy8gcHJpbnQgb3V0IGF2YWlsYWJsZSBjaXBoZXJzCgkgICAg77u/ICDvu78g IGlmICggYXJncy5sZW5ndGggPT0gMSAmJiBhcmdzWzBdLmVxdWFsc0lnbm9yZUNhc2UoIi1wcmlu dCIgKSApIHsKCSAgICDvu78gIO+7vyAg77u/ICBTeXN0ZW0ub3V0LnByaW50bG4oICJBVkFJTEFC TEUgQUxHT1JJVEhNUyIgKTsKCgkgICAg77u/ICDvu78gIO+7vyAgUHJvdmlkZXJbXSBwcm92aWRl cnMgPSBTZWN1cml0eS5nZXRQcm92aWRlcnMoKTsKCSAgICDvu78gIO+7vyAg77u/ICBUcmVlTWFw PFN0cmluZywgU3RyaW5nPiB0bSA9IG5ldyBUcmVlTWFwPFN0cmluZywgU3RyaW5nPigpOwoJICAg IO+7vyAg77u/ICDvu78gIC8vIERJU0NVU1M6IE5vdGU6IFdlIGdvIHRocm91Z2ggbXVsdGlwbGUg cHJvdmlkZXJzLCB5ZXQgbm93aGVyZSBkbyBJCgkJ77u/ICDvu78gIO+7vyAgLy/vu78gIO+7vyAg 77u/ICBzZWUgd2hlcmUgd2UgcHJpbnQgb3V0IHRoZSBQUk9WSURFUiBOQU1FLiBOb3QgYWxsIHBy b3ZpZGVycwoJCe+7vyAg77u/ICDvu78gIC8v77u/ICDvu78gIO+7vyAgd2lsbCBpbXBsZW1lbnQg dGhlIHNhbWUgYWxnb3JpdGhtcyBhbmQgc29tZSAicGFydG5lciIgd2l0aAoJCe+7vyAg77u/ICDv u78gIC8v77u/ICDvu78gIO+7vyAgd2hvbSB3ZSBhcmUgZXhjaGFuZ2luZyBkaWZmZXJlbnQgY3J5 cHRvZ3JhcGhpYyBtZXNzYWdlcyBtYXkKCQnvu78gIO+7vyAg77u/ICAvL++7vyAg77u/ICDvu78g IGhhdmUgX2RpZmZlcmVudF8gcHJvdmlkZXJzIGluIHRoZWlyIGphdmEuc2VjdXJpdHkgZmlsZS4g U28KCQnvu78gIO+7vyAg77u/ICAvL++7vyAg77u/ICDvu78gIGl0IHdvdWxkIGJlIHVzZWZ1bCB0 byBrbm93IHRoZSBwcm92aWRlciBuYW1lIHdoZXJlIGVhY2gKCQnvu78gIO+7vyAg77u/ICAvL++7 vyAg77u/ICDvu78gIGFsZ29yaXRobSBpcyBpbXBsZW1lbnRlZC4gTWlnaHQgYmUgZ29vZCB0byBw cmVwZW5kIHRoZSBwcm92aWRlcgoJCe+7vyAg77u/ICDvu78gIC8v77u/ICDvu78gIO+7vyAgbmFt ZSB0byB0aGUgJ2tleScgd2l0aCBzb21ldGhpbmcgbGlrZSAicHJvdmlkZXJOYW1lOiAiLiBUaG91 Z2h0cz8KCQnvu78gIO+7vyAg77u/ICBmb3IgKGludCBpID0gMDsgaSAhPSBwcm92aWRlcnMubGVu Z3RoOyBpKyspIHsKCQnvu78gICAgICAgIC8vIERJU0NVU1M6IFByaW50IHNlY3VyaXR5IHByb3Zp ZGVyIG5hbWUgaGVyZT8/PwoJCSAgICDvu78gICAgICAgIC8vIE5vdGU6IEZvciBzb21lIG9kZCBy ZWFzb24sIFByb3ZpZGVyLmtleVNldCgpIHJldHVybnMKCQkgICAg77u/ICAgICAgICAvL++7vyAg 77u/ICAgU2V0PE9iamVjdD4gb2YgdGhlIHByb3BlcnR5IGtleXMgKHdoaWNoIGFyZSBTdHJpbmdz KQoJCSAgICDvu78gICAgICAgIC8v77u/ICDvu78gICBjb250YWluZWQgaW4gdGhpcyBwcm92aWRl ciwgYnV0IFNldDxTdHJpbmc+IHNlZW1zCgkJICAgIO+7vyAgICAgICAgLy/vu78gIO+7vyAgIG1v cmUgYXBwcm9wcmlhdGUuIEJ1dCB0aGF0J3Mgd2h5IHdlIG5lZWQgdGhlIGNhc3QgYmVsb3cuCgkJ ICAgIO+7vyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI9PT09PSBQcm92aWRlciAiICsgaSAr ICI6IiArIHByb3ZpZGVyc1tpXS5nZXROYW1lKCkgKyAiID09PT09PSIpOwoJCe+7vyAgICAgICAg SXRlcmF0b3I8T2JqZWN0PiBpdCA9IHByb3ZpZGVyc1tpXS5rZXlTZXQoKS5pdGVyYXRvcigpOwoJ Ce+7vyAg77u/ICDvu78gIO+7vyAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewoJCSAgICDvu78gICAg ICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpaXQubmV4dCgpOwoJCSAgICDvu78gICAgICAgICAg U3RyaW5nIHZhbHVlID0gcHJvdmlkZXJzW2ldLmdldFByb3BlcnR5KCBrZXkgKTsKCQkgICAg77u/ ICAgICAgICAgIHRtLnB1dChrZXksIHZhbHVlKTsKCQkgICAg77u/ICAgICAgICAgIFN5c3RlbS5v dXQucHJpbnRsbigiXHRcdCAgICIgKyBrZXkgKyAiIC0+ICIrIHZhbHVlICk7CgkJICAgIO+7vyAg 77u/ICDvu78gIO+7vyAgfQoJCe+7vyAg77u/ICDvu78gIH0KCgkgICAg77u/ICDvu78gIO+7vyAg U2V0PCBFbnRyeTxTdHJpbmcsU3RyaW5nPiA+IGtleVZhbHVlU2V0ID0gdG0uZW50cnlTZXQoKTsK CSAgICDvu78gIO+7vyAg77u/ICBJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIFN0cmluZz4+IGl0ID0g a2V5VmFsdWVTZXQuaXRlcmF0b3IoKTsKCSAgICDvu78gIO+7vyAg77u/ICB3aGlsZSggaXQuaGFz TmV4dCgpICkgewoJCe+7vyAg77u/ICDvu78gIO+7vyAgTWFwLkVudHJ5PFN0cmluZyxTdHJpbmc+ IGVudHJ5ID0gaXQubmV4dCgpOwoJCe+7vyAg77u/ICDvu78gIO+7vyAgU3RyaW5nIGtleSA9IGVu dHJ5LmdldEtleSgpOwoJCe+7vyAg77u/ICDvu78gIO+7vyAgU3RyaW5nIHZhbHVlID0gZW50cnku Z2V0VmFsdWUoKTsKCQnvu78gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIiAgICIgKyBrZXkg KyAiIC0+ICIrIHZhbHVlICk7CgkJ77u/ICDvu78gIO+7vyAgfQoJICAgIO+7vyAg77u/ICB9IGVs c2UgewoJICAgIO+7vyAg77u/ICDvu78gIO+7vyAgLy8gVXNlZCB0byBwcmludCBhIHNpbWlsYXIg bGluZSB0byB1c2UgJy1wcmludCcgZXZlbiB3aGVuIGl0IHdhcyBzcGVjaWZpZWQuCgkJ77u/ICDv u78gIO+7vyAgU3lzdGVtLm91dC5wcmludGxuKCAiXHR1c2UgJy1wcmludCcgdG8gYWxzbyBzaG93 IGF2YWlsYWJsZSBjcnlwdG8gYWxnb3JpdGhtcyBmcm9tIGFsbCB0aGUgc2VjdXJpdHkgcHJvdmlk ZXJzIiApOwoJICAgIO+7vyAg77u/ICB9Cgnvu78gIO+7vyAgCgkgICAg77u/ICDvu78gIC8vIHNl dHVwIGFsZ29yaXRobXMgLS0gRWFjaCBvZiB0aGVzZSBoYXZlIGRlZmF1bHRzIGlmIG5vdCBzZXQs IGFsdGhvdWdoCgkgICAg77u/ICDvu78gIC8v77u/ICDvu78gIO+7vyAg77u/ICDvu78gICAgIHNv bWVvbmUgY291bGQgc2V0IHRoZW0gdG8gc29tZXRoaW5nIGludmFsaWQuIElmCgkgICAg77u/ICDv u78gIC8v77u/ICDvu78gIO+7vyAg77u/ICDvu78gICAgIHNvIGEgc3VpdGFibGUgZXhjZXB0aW9u IHdpbGwgYmUgdGhyb3duIGFuZCBkaXNwbGF5ZWQuCgkgICAg77u/ICDvu78gIGVuY3J5cHRBbGdv cml0aG0gPSBFU0FQSS5zZWN1cml0eUNvbmZpZ3VyYXRpb24oKS5nZXRFbmNyeXB0aW9uQWxnb3Jp dGhtKCk7Cgnvu78gIO+7vyAgZW5jcnlwdGlvbktleUxlbmd0aCA9IEVTQVBJLnNlY3VyaXR5Q29u ZmlndXJhdGlvbigpLmdldEVuY3J5cHRpb25LZXlMZW5ndGgoKTsKCe+7vyAg77u/ICByYW5kb21B bGdvcml0aG0gPSBFU0FQSS5zZWN1cml0eUNvbmZpZ3VyYXRpb24oKS5nZXRSYW5kb21BbGdvcml0 aG0oKTsKCgnvu78gIO+7vyAgU2VjdXJlUmFuZG9tIHJhbmRvbSA9IFNlY3VyZVJhbmRvbS5nZXRJ bnN0YW5jZShyYW5kb21BbGdvcml0aG0pOwoJ77u/ICDvu78gIFNlY3JldEtleSBzZWNyZXRLZXkg PSBDcnlwdG9IZWxwZXIuZ2VuZXJhdGVTZWNyZXRLZXkoZW5jcnlwdEFsZ29yaXRobSwgZW5jcnlw dGlvbktleUxlbmd0aCk7Cgnvu78gIO+7vyAgYnl0ZVtdIHJhdyA9IHNlY3JldEtleS5nZXRFbmNv ZGVkKCk7Cgnvu78gIO+7vyAgYnl0ZVtdIHNhbHQgPSBuZXcgYnl0ZVsyMF0777u/ICAvLyBPciAx NjAtYml0czsgYmlnIGVub3VnaCBmb3IgU0hBMSwgYnV0IG5vdCBTSEEtMjU2IG9yIFNIQS01MTIu CgkJCQkJICAg77u/ICDvu78gIHJhbmRvbS5uZXh0Qnl0ZXMoIHNhbHQgKTsKCe+7vyAg77u/ICBT dHJpbmcgZW9sID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOyAv LyBTbyBpdCB3b3JrcyBvbiBXaW5kb3dzIHRvby4KCe+7vyAg77u/ICBTeXN0ZW0ub3V0LnByaW50 bG4oIGVvbCArICJDb3B5IGFuZCBwYXN0ZSB0aGVzZSBsaW5lcyBpbnRvIHlvdXIgRVNBUEkucHJv cGVydGllcyIgKyBlb2wpOwoJ77u/ICDvu78gIFN5c3RlbS5vdXQucHJpbnRsbiggIiM9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIp OwoJ77u/ICDvu78gIFN5c3RlbS5vdXQucHJpbnRsbiggIkVuY3J5cHRvci5NYXN0ZXJLZXk9IiAr IEVTQVBJLmVuY29kZXIoKS5lbmNvZGVGb3JCYXNlNjQocmF3LCBmYWxzZSkgKTsKCe+7vyAg77u/ ICBTeXN0ZW0ub3V0LnByaW50bG4oICJFbmNyeXB0b3IuTWFzdGVyU2FsdD0iICsgRVNBUEkuZW5j b2RlcigpLmVuY29kZUZvckJhc2U2NChzYWx0LCBmYWxzZSkgKTsKCe+7vyAg77u/ICBTeXN0ZW0u b3V0LnByaW50bG4oICIjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0iICsgZW9sKTsKICAgIH0KICAgIO+7vyAgCgogICAgLyoqCiAg ICAgKiBQcml2YXRlIENUT1IgZm9yIHtAY29kZSBKYXZhRW5jcnlwdG9yfSwgY2FsbGVkIGJ5IHtA Y29kZSBnZXRJbnN0YW5jZSgpfS4KICAgICAqIEB0aHJvd3MgRW5jcnlwdGlvbkV4Y2VwdGlvbiBp ZiBjYW4ndCBjb25zdHJ1Y3QgdGhpcyBvYmplY3QgZm9yIHNvbWUgcmVhc29uLgogICAgICog77u/ ICDvu78gIO+7vyAg77u/ICDvu78gIE9yaWdpbmFsIGV4Y2VwdGlvbiB3aWxsIGJlIGF0dGFjaGVk IGFzIHRoZSAnY2F1c2UnLgogICAgICovCglwcml2YXRlIEphdmFFbmNyeXB0b3IoKSB0aHJvd3Mg RW5jcnlwdGlvbkV4Y2VwdGlvbiB7CglieXRlW10gc2FsdCA9IEVTQVBJLnNlY3VyaXR5Q29uZmln dXJhdGlvbigpLmdldE1hc3RlclNhbHQoKTsKCWJ5dGVbXSBza2V5ID0gRVNBUEkuc2VjdXJpdHlD b25maWd1cmF0aW9uKCkuZ2V0TWFzdGVyS2V5KCk7CgoJYXNzZXJ0IHNhbHQgIT0gbnVsbCA6ICJD YW4ndCBvYnRhaW4gbWFzdGVyIHNhbHQsIEVuY3J5cHRvci5NYXN0ZXJTYWx0IjsKCWFzc2VydCBz YWx0Lmxlbmd0aCA+PSAxNiA6ICJFbmNyeXB0b3IuTWFzdGVyU2FsdCBtdXN0IGJlIGF0IGxlYXN0 IDE2IGJ5dGVzLiAiICsKCSAgICAiTGVuZ3RoIGlzOiAiICsgc2FsdC5sZW5ndGggKyAiIGJ5dGVz LiI7Cglhc3NlcnQgc2tleSAhPSBudWxsIDogIkNhbid0IG9idGFpbiBtYXN0ZXIga2V5LCBFbmNy eXB0b3IuTWFzdGVyS2V5IjsKCWFzc2VydCBza2V5Lmxlbmd0aCA+PSA3IDogIkVuY3J5cHRvci5N YXN0ZXJLZXkgbXVzdCBiZSBhdCBsZWFzdCA3IGJ5dGVzLiAiICsKCSAgICAiTGVuZ3RoIGlzOiAi ICsgc2tleS5sZW5ndGggKyAiIGJ5dGVzLiI7CgoJLy8gU2V0IHVwIHNlY3JldEtleVNwZWMgZm9y IHVzZSBmb3Igc3ltbWV0cmljIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24sCgkvLyBhbmQgc2V0 IHVwIHRoZSBwdWJsaWMvcHJpdmF0ZSBrZXlzIGZvciBhc3ltbWV0cmljIGVuY3J5cHRpb24gLwoJ Ly8gZGVjcnlwdGlvbi4KCS8vIFRPRE86IE5vdGU6IElmIHdlIGR1bXAgRVNBUEkgMS40IGNyeXB0 byBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LAoJLy8gICAgICAgdGhlbiB3ZSBwcm9iYWJseSB3aWxs IGRpdGNoIHRoZSBFbmNyeXB0b3IuRW5jcnlwdGlvbkFsZ29yaXRobQoJLy8gICAgICAgcHJvcGVy dHkuIElmIHNvLCBlbmNyeXB0QWxnb3JpdGhtIHNob3VsZCBwcm9iYWJseSB1c2UKCS8vICAgICAg IEVuY3J5cHRvci5DaXBoZXJUcmFuc2Zvcm1hdGlvbiBhbmQganVzdCBwdWxsIG9mZiB0aGUgY2lw aGVyCgkvLyAgICAgICBhbGdvcml0aG0gbmFtZSBzbyB3ZSBjYW4gdXNlIGl0IGhlcmUuCglzeW5j aHJvbml6ZWQoSmF2YUVuY3J5cHRvci5jbGFzcykgewoJICAgIGlmICggISBpbml0aWFsaXplZCAp IHsKCQkvLwoJCS8vIEZvciBzeW1tZXRyaWMgZW5jcnlwdGlvbgoJCS8vCgkJLy8gICAgICBOT1RF OiBGaW5kQnVncyBjb21wbGFpbnMgYWJvdXQgdGhpcwoJCS8vICAgICAgICAgICAgKFNUX1dSSVRF X1RPX1NUQVRJQ19GUk9NX0lOU1RBTkNFX01FVEhPRCkgYnV0CgkJLy8gICAgICAgICAgICBpdCBz aG91bGQgYmUgT0sgc2luY2UgaXQgaXMgc3luY2hyb25pemVkIGFuZCBvbmx5CgkJLy8gICAgICAg ICAgICBkb25lIG9uY2UuIFdoaWxlIHdlIGNvdWxkIHNlcGFyYXRlIHRoaXMgb3V0IGFuZAoJCS8v ICAgICAgICAgICAgaGFuZGxlIGluIGEgc3RhdGljIGluaXRpYWxpemVyLCBpdCBqdXN0IHNlZW1z IHRvCgkJLy8gICAgICAgICAgICBmaXQgYmV0dGVyIGhlcmUuCgkJc2VjcmV0S2V5U3BlYyA9IG5l dyBTZWNyZXRLZXlTcGVjKHNrZXksIGVuY3J5cHRBbGdvcml0aG0gKTsKCgkJLy8KCQkvLyBGb3Ig YXN5bW1ldHJpYyBlbmNyeXB0aW9uIChpLmUuLCBwdWJsaWMvcHJpdmF0ZSBrZXkpCgkJLy8KCQl0 cnkgewoJCSAgICBTZWN1cmVSYW5kb20gcHJuZyA9IFNlY3VyZVJhbmRvbS5nZXRJbnN0YW5jZShy YW5kb21BbGdvcml0aG0pOwoKCQkgICAgLy8gQmVjYXVzZSBoYXNoKCkgaXMgbm90IHN0YXRpYyAo YnV0IGl0IGNvdWxkIGJlIHdlcmUgaW4gbm90CgkJICAgIC8vIGZvciB0aGUgaW50ZXJmYWNlIG1l dGhvZCBzcGVjaWZpY2F0aW9uIGluIEVuY3J5cHRvciksIHdlCgkJICAgIC8vIGNhbm5vdCBkbyB0 aGlzIGluaXRpYWxpemF0aW9uIGluIGEgc3RhdGljIG1ldGhvZCBvciBzdGF0aWMKCQkgICAgLy8g aW5pdGlhbGl6ZXIuCgkJICAgIGJ5dGVbXSBzZWVkID0gaGFzaChuZXcgU3RyaW5nKHNrZXksIGVu Y29kaW5nKSxuZXcgU3RyaW5nKHNhbHQsIGVuY29kaW5nKSkuZ2V0Qnl0ZXMoZW5jb2RpbmcpOwoJ CSAgICBwcm5nLnNldFNlZWQoc2VlZCk7CgkJICAgIGluaXRLZXlQYWlyKHBybmcpOwoJCX0gY2F0 Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJICAgIHRocm93IG5ldyBFbmNyeXB0aW9uRXhjZXB0aW9uKCJF bmNyeXB0aW9uIGZhaWx1cmUiLCAiRXJyb3IgY3JlYXRpbmcgRW5jcnlwdG9yIiwgZSk7CgkJfSAg ICAgICAgICAgICAKCgkJLy8gTWFyayBldmVyeXRoaW5nIGFzIGluaXRpYWxpemVkLgoJCWluaXRp YWxpemVkID0gdHJ1ZTsKCSAgICB9Cgl9CiAgICB9CgoKCiAgICDvu78gIC8qKgogICAgICAgKiB7 QGluaGVyaXREb2N9CiAgICAgICAqCiAgICAgICDvu78gICAqIEhhc2hlcyB0aGUgZGF0YSB3aXRo IHRoZSBzdXBwbGllZCBzYWx0IGFuZCB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgc3BlY2lmaWVk IGluCiAgICAgICDvu78gICAqIHRoZSBFU0FQSSBTZWN1cml0eUNvbmZpZ3VyYXRpb24uCiAgICAg ICDvu78gICAqLwoJ77u/ICBwdWJsaWMgU3RyaW5nIGhhc2goU3RyaW5nIHBsYWludGV4dCwgU3Ry aW5nIHNhbHQpIHRocm93cyBFbmNyeXB0aW9uRXhjZXB0aW9uIHsKCe+7vyAg77u/ICByZXR1cm4g aGFzaCggcGxhaW50ZXh0LCBzYWx0LCBoYXNoSXRlcmF0aW9ucyApOwoJ77u/ICB9CiAgICDvu78g IAoJ77u/ICAvKioKCSAgICoge0Bpbmhlcml0RG9jfQoJICAgKgoJICAg77u/ICAgKiBIYXNoZXMg dGhlIGRhdGEgdXNpbmcgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gYW5kIHRoZSBKYXZhIE1lc3Nh Z2VEaWdlc3QgY2xhc3MuIFRoaXMgbWV0aG9kCgkgICDvu78gICAqIGZpcnN0IGFkZHMgdGhlIHNh bHQsIGEgc2VwYXJhdG9yICgiOiIpLCBhbmQgdGhlIGRhdGEsIGFuZCB0aGVuIHJlaGFzaGVzIHRo ZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKCSAgIO+7vyAgICogaW4gb3JkZXIgdG8g aGVscCBzdHJlbmd0aGVuIHdlYWsgcGFzc3dvcmRzLgoJICAg77u/ICAgKi8KCe+7vyAgcHVibGlj IFN0cmluZyBoYXNoKFN0cmluZyBwbGFpbnRleHQsIFN0cmluZyBzYWx0LCBpbnQgaXRlcmF0aW9u cykgdGhyb3dzIEVuY3J5cHRpb25FeGNlcHRpb24gewoJ77u/ICDvu78gIGJ5dGVbXSBieXRlcyA9 IG51bGw7Cgnvu78gIO+7vyAgdHJ5IHsKCSAgICDvu78gIO+7vyAg77u/ICBNZXNzYWdlRGlnZXN0 IGRpZ2VzdCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoaGFzaEFsZ29yaXRobSk7CgkgICAg 77u/ICDvu78gIO+7vyAgZGlnZXN0LnJlc2V0KCk7CgkgICAg77u/ICDvu78gIO+7vyAgZGlnZXN0 LnVwZGF0ZShFU0FQSS5zZWN1cml0eUNvbmZpZ3VyYXRpb24oKS5nZXRNYXN0ZXJTYWx0KCkpOwoJ ICAgIO+7vyAg77u/ICDvu78gIGRpZ2VzdC51cGRhdGUoc2FsdC5nZXRCeXRlcyhlbmNvZGluZykp OwoJICAgIO+7vyAg77u/ICDvu78gIGRpZ2VzdC51cGRhdGUocGxhaW50ZXh0LmdldEJ5dGVzKGVu Y29kaW5nKSk7CgoJICAgIO+7vyAg77u/ICDvu78gIC8vIHJlaGFzaCBhIG51bWJlciBvZiB0aW1l cyB0byBoZWxwIHN0cmVuZ3RoZW4gd2VhayBwYXNzd29yZHMKCQnvu78gIO+7vyAg77u/ICBieXRl cyA9IGRpZ2VzdC5kaWdlc3QoKTsKCSAgICDvu78gIO+7vyAg77u/ICBmb3IgKGludCBpID0gMDsg aSA8IGl0ZXJhdGlvbnM7IGkrKykgewoJCe+7vyAg77u/ICDvu78gIO+7vyAgZGlnZXN0LnJlc2V0 KCk7CgkJ77u/ICDvu78gIO+7vyAg77u/ICBieXRlcyA9IGRpZ2VzdC5kaWdlc3QoYnl0ZXMpOwoJ Ce+7vyAg77u/ICDvu78gIH0KCSAgICDvu78gIO+7vyAg77u/ICBTdHJpbmcgZW5jb2RlZCA9IEVT QVBJLmVuY29kZXIoKS5lbmNvZGVGb3JCYXNlNjQoYnl0ZXMsZmFsc2UpOwoJICAgIO+7vyAg77u/ ICDvu78gIHJldHVybiBlbmNvZGVkOwoJICAgIO+7vyAg77u/ICB9IGNhdGNoIChOb1N1Y2hBbGdv cml0aG1FeGNlcHRpb24gZSkgewoJICAgIO+7vyAg77u/ICDvu78gIHRocm93IG5ldyBFbmNyeXB0 aW9uRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIsICJDYW4ndCBmaW5kIGhhc2ggYWxnb3JpdGht ICIgKyBoYXNoQWxnb3JpdGhtLCBlKTsKCSAgICDvu78gIO+7vyAgfSBjYXRjaCAoVW5zdXBwb3J0 ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewoJICAgIO+7vyAg77u/ICDvu78gIHRocm93IG5ldyBF bmNyeXB0aW9uRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciIsICJDYW4ndCBmaW5kIGVuY29kaW5n IGZvciAiICsgZW5jb2RpbmcsIGV4KTsKCSAgICDvu78gIO+7vyAgfQoJ77u/ICB9CiAgICDvu78g IAoJ77u/ICAvKioKCSAgICAg77u/ICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCBlbmNyeXB0 cyBwbGFpbnRleHQgc3RyaW5ncyB0aGUgbmV3IHdheSAoZGVmYXVsdAoJICAgICDvu78gICAqIGlz IENCQyBtb2RlIGFuZCBQS0NTNSBwYWRkaW5nKS4gVGhpcyBlbmNyeXB0aW9uIG1ldGhvZCB1c2Vz IHRoZSBtYXN0ZXIKCSAgICAg77u/ICAgKiBlbmNyeXB0aW9uIGtleSBzcGVjaWZpZWQgYnkgdGhl IHtAY29kZSBFbmNyeXB0b3IuTWFzdGVyS2V5fSBwcm9wZXJ0eQoJICAgICDvu78gICAqIGluIHtA Y29kZSBFU0FQSS5wcm9wZXJ0aWVzfS4KCSAgICAg77u/ICAgKgoJICAgICDvu78gICAqIEBwYXJh bSBwbGFpbnRleHTvu78gIEEgU3RyaW5nIHRvIGJlIGVuY3J5cHRlZAoJICAgICDvu78gICAqIEBy ZXR1cm7vu78gIEEgYmFzZTY0LWVuY29kZWQgY29tYmluYXRpb24gb2YgSVYgKyByYXcgY2lwaGVy dGV4dAoJICAgICDvu78gICAqIEB0aHJvd3MgRW5jcnlwdGlvbkV4Y2VwdGlvbu+7vyAgVGhyb3du IHdoZW4gc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUKCSAgICAg77u/ICAgKiDvu78gIO+7 vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAgZW5jcnlwdGlvbi4KCSAgICAg77u/ICAg KgoJICAgICDvu78gICAqIEBzZWUgb3JnLm93YXNwLmVzYXBpLkVuY3J5cHRvciNlbmNyeXB0KFBs YWluVGV4dCkKCSAgICAg77u/ICAgKi8KCe+7vyAgQERlcHJlY2F0ZWQgcHVibGljIFN0cmluZyBl bmNyeXB0KFN0cmluZyBwbGFpbnRleHQpIHRocm93cyBFbmNyeXB0aW9uRXhjZXB0aW9uCgkJCQkJ CQkJICAgICDvu78gIHsKCWxvZ1dhcm5pbmcoImVuY3J5cHQiLCAiQ2FsbGluZyBkZXByZWNhdGVk IGVuY3J5cHQoKSBtZXRob2QuIik7Cgnvu78gIO+7vyAgQ2lwaGVyVGV4dCBjdCA9IG51bGw7Cgnv u78gIO+7vyAgY3QgPSBlbmNyeXB0KG5ldyBQbGFpblRleHQocGxhaW50ZXh0KSApOwoJ77u/ICDv u78gIHJldHVybiBjdC5nZXRFbmNvZGVkSVZDaXBoZXJUZXh0KCk7Cgnvu78gIH0KCgogICAg77u/ ICAvKioKCSDvu78gICoge0Bpbmhlcml0RG9jfQoJIO+7vyAgKi8KCe+7vyAgIHB1YmxpYyBDaXBo ZXJUZXh0IGVuY3J5cHQoUGxhaW5UZXh0IHBsYWludGV4dCkgdGhyb3dzIEVuY3J5cHRpb25FeGNl cHRpb24gewoJ77u/ICDvu78gICAvLyBOb3cgbW9yZSBvZiBhIGNvbnZlbmllbmNlIGZ1bmN0aW9u IGZvciB1c2luZyB0aGUgbWFzdGVyIGtleS4KCSAgICDvu78gIO+7vyAgIHJldHVybiBlbmNyeXB0 KHNlY3JldEtleVNwZWMsIHBsYWludGV4dCk7Cgnvu78gICB9CiAgICDvu78gICAKCe+7vyAgIC8q KgoJICAgICAg77u/ICAgICoge0Bpbmhlcml0RG9jfQoJICAgICAg77u/ICAgICovCgnvu78gICBw dWJsaWMgQ2lwaGVyVGV4dCBlbmNyeXB0KFNlY3JldEtleSBrZXksIFBsYWluVGV4dCBwbGFpbikK Ce+7vyAgIO+7vyAg77u/ICDvu78gIHRocm93cyBFbmNyeXB0aW9uRXhjZXB0aW9uCgkJCe+7vyAg IHsKCe+7vyAg77u/ICAgYnl0ZVtdIHBsYWludGV4dCA9IHBsYWluLmFzQnl0ZXMoKTsKCe+7vyAg 77u/ICAgYm9vbGVhbiBvdmVyd3JpdGVQbGFpbnRleHQgPSBFU0FQSS5zZWN1cml0eUNvbmZpZ3Vy YXRpb24oKS5vdmVyd3JpdGVQbGFpblRleHQoKTsKCe+7vyAg77u/ICAgYXNzZXJ0IGtleSAhPSBu dWxsIDogIihNYXN0ZXIpIGVuY3J5cHRpb24ga2V5IG1heSBub3QgYmUgbnVsbCI7Cgnvu78gIO+7 vyAgIAoJICAgIO+7vyAg77u/ICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U777u/ICAvLyBVc2Vk IGluICdmaW5hbGx5JyBjbGF1c2UuCgkJCQkJICAgICDvu78gIO+7vyAgIFN0cmluZyB4Zm9ybSA9 IG51bGw7Cgnvu78gIO+7vyAgIGludCBrZXlTaXplID0ga2V5LmdldEVuY29kZWQoKS5sZW5ndGgg KiA4O++7vyAgLy8gQ29udmVydCB0byAjIGJpdHMKCgkJCQkJCQkgICB0cnkgewoJCQkJCQkJICAg ICAgIHhmb3JtID0gRVNBUEkuc2VjdXJpdHlDb25maWd1cmF0aW9uKCkuZ2V0Q2lwaGVyVHJhbnNm b3JtYXRpb24oKTsKCQkJCQkJCSAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IHhmb3JtLnNwbGl0KCIv Iik7CgkJCQkJCQkgICAgICAgYXNzZXJ0IHBhcnRzLmxlbmd0aCA9PSAzIDogIk1hbGZvcm1lZCBj aXBoZXIgdHJhbnNmb3JtYXRpb246ICIgKyB4Zm9ybTsKCQkJCQkJCSAgICAgICBTdHJpbmcgY2lw aGVyTW9kZSA9IHBhcnRzWzFdOwoKCQkJCQkJCSAgICAgICAvLyBUaGlzIHdheSB3ZSBjYW4gcHJl dmVudCBtb2RlcyBsaWtlIE9GQiBhbmQgQ0ZCIHdoZXJlIHRoZSBJViBzaG91bGQgbmV2ZXIKCQkJ CQkJCSAgICAgICAvLyBiZSByZXBlYXRlZCB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24ga2V5IChh dCBsZWFzdCB1bnRpbCB3ZSBzdXBwb3J0CgkJCQkJCQkgICAgICAgLy8gRW5jcnlwdG9yLkNob29z ZUlWTWV0aG9kPXNwZWNpZmllZCBhbmQgYWxsb3cgdXMgdG8gc3BlY2lmeSBzb21lIG1lY2hhbmlz bQoJCQkJCQkJICAgICAgIC8vIHRvIGVuc3VyZSB0aGUgSVYgd2lsbCBuZXZlciBiZSByZXBlYXRl ZCAoc3VjaCBhcyBhIHRpbWUgc3RhbXAgb3Igb3RoZXIKCQkJCQkJCSAgICAgICAvLyBtb25vdG9u aWNhbGx5IGluY3JlYXNpbmcgZnVuY3Rpb24pLgoJCQkJCQkJICAgICAgIC8vIERJU0NVU1M6IFNo b3VsZCB3ZSBpbmNsdWRlIHRoZSBwZXJtaXR0ZWQgY2lwaGVyIG1vZGVzIGluIHRoZSBleGNlcHRp b24gbXNnPwoJCQkJCQkJICAgICAgIGlmICggISBDcnlwdG9IZWxwZXIuaXNBbGxvd2VkQ2lwaGVy TW9kZShjaXBoZXJNb2RlKSApIHsKCQkJCQkJCQkgICB0aHJvdyBuZXcgRW5jcnlwdGlvbkV4Y2Vw dGlvbigiRW5jcnlwdGlvbiBmYWlsdXJlOiBpbnZhbGlkIGNpcGhlciBtb2RlICggIiArIGNpcGhl ck1vZGUgKyAiKSBmb3IgZW5jcnlwdGlvbiIsCgkJCQkJCQkJCQkJCSAiRW5jcnlwdGlvbiBmYWls dXJlOiBDaXBoZXIgdHJhbnNmb3JtYXRpb24gIiArIHhmb3JtICsgIiBzcGVjaWZpZXMgaW52YWxp ZCAiICsKCQkJCQkJCQkJCQkJICJjaXBoZXIgbW9kZSAiICsgY2lwaGVyTW9kZSk7CgkJCQkJCQkg ICAgICAgfQoKCQkJCQkJCSAgICAgICDvu78gIO+7vyAg77u/ICAgLy8gTm90ZSAtIENpcGhlciBp cyBub3QgdGhyZWFkLXNhZmUgc28gd2UgY3JlYXRlIG9uZSBsb2NhbGx5CgkJCQkJCQkJICAg77u/ ICDvu78gIO+7vyAgIC8vICAgICAgICBBbHNvLCB3ZSBuZWVkIHRvIGNoYW5nZSB0aGlzIGV2ZW50 dWFsbHkgc28gb3RoZXIgYWxnb3JpdGhtcyBjYW4KCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ICAg Ly8gICAgICAgIGJlIHN1cHBvcnRlZC4gRXZlbnR1YWxseSwgdGhlcmUgd2lsbCBiZSBhbiBlbmNy eXB0KCkgbWV0aG9kIHRoYXQKCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ICAgLy8gICAgICAgIHRh a2VzIGEgKG5ldyBjbGFzcykgQ3J5cHRvQ29udHJvbHMsIGFzIHNvbWV0aGluZyBsaWtlIHRoaXM6 CgkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAgIC8vICAgICAgICAgIHB1YmxpYyBDaXBoZXJUZXh0 IGVuY3J5cHQoQ3J5cHRvQ29udHJvbHMgY3RybCwgU2VjcmV0S2V5IHNrZXksIFBsYWluVGV4dCBw bGFpbnRleHQpCgkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAgIC8vICAgICAgICBhbmQgdGhpcyBt ZXRob2Qgd2lsbCBqdXN0IGNhbGwgdGhhdCBvbmUuCgkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAg IENpcGhlciBlbmNyeXB0ZXIgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoeGZvcm0pOwoJCQkJCQkJICAg ICAgIO+7vyAg77u/ICDvu78gICBTdHJpbmcgY2lwaGVyQWxnID0gZW5jcnlwdGVyLmdldEFsZ29y aXRobSgpOwoJCQkJCQkJICAgICAgIO+7vyAg77u/ICDvu78gICBpbnQga2V5TGVuID0gRVNBUEku c2VjdXJpdHlDb25maWd1cmF0aW9uKCkuZ2V0RW5jcnlwdGlvbktleUxlbmd0aCgpOwoKCQkJCQkJ CSAgICAgICDvu78gIO+7vyAg77u/ICAgLy8gRElTQ1VTUzogT0ssIHdoYXQgZG8gd2Ugd2FudCB0 byBkbyBoZXJlIGlmIGtleUxlbiAhPSBrZXlTaXplPyBJZiB1c2Uga2V5TGVuLCBlbmNyeXB0aW9u CgkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAgIC8v77u/ICDvu78gICAgICAgY291bGQgZmFpbCB3 aXRoIGFuIGV4Y2VwdGlvbiwgYnV0IHBlcmhhcHMgdGhhdCdzIHdoYXQgd2Ugd2FudC4gT3Igd2Ug bWF5IGp1c3QgYmUKCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ICAgLy/vu78gIO+7vyAg77u/ICAg T0sgd2l0aCBzaWxlbnRseSB1c2luZyBrZXlTaXplIGFzIGxvbmcgYXMga2V5U2l6ZSA+PSBrZXlM ZW4sIHdoaWNoIHRoZW4gaW50ZXJwcmV0cwoJCQkJCQkJCSAgIO+7vyAg77u/ICDvu78gICAvL++7 vyAg77u/ICDvu78gICBFU0FQSS5FbmNyeXB0aW9uS2V5TGVuZ3RoIGFzIHRoZSAqbWluaW11bSog a2V5IHNpemUsIGJ1dCBhcyBsb25nIGFzIHdlIGhhdmUgc29tZXRoaW5nCgkJCQkJCQkJICAg77u/ ICDvu78gIO+7vyAgIC8v77u/ICDvu78gIO+7vyAgIHN0cm9uZ2VyIGl0J3MgT0sgdG8gdXNlIGl0 LiBGb3Igbm93LCBJIGFtIGp1c3QgZ29pbmcgdG8gbG9nIHdhcm5pbmcgaWYgZGlmZmVyZW50LCBi dXQgdXNlCgkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAgIC8v77u/ICDvu78gIO+7vyAgIGtleVNp emUgdW5sZXNzIGtleVNpemUgaXMgU01BTExFUiB0aGFuIEVTQVBJLkVuY3J5cHRpb25LZXlMZW5n dGgsIGluIHdoaWNoIGNhc2UgSSdtIGdvaW5nCgkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAgIC8v 77u/ICDvu78gIO+7vyAgIHRvIGxvZyBhbiBlcnJvci4KCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ ICAgLy8KCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ICAgLy/vu78gIO+7vyAg77u/ICAgSU1QT1JU QU5UIE5PVEU677u/ICBXaGVuIHdlIGdlbmVyYXRlIGtleSBzaXplcyBmb3IgYm90aCBERVMgYW5k IERFU2VkZSB0aGUgcmVzdWx0IG9mCgkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAgIC8v77u/ICDv u78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIFNlY3JldEtleS5nZXRFbmNvZGluZygp Lmxlbmd0aCBpbmNsdWRlcyB0aGUgVFJVRSBrZXkgc2l6ZSAoaS5lLiwKCQkJCQkJCQkgICDvu78g IO+7vyAg77u/ICAgLy/vu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAgKndp dGgqIHRoZSBldmVuIHBhcml0eSBiaXRzKSByYXRoZXIgdGhhbiB0aGUgRUZGRUNUSVZFIGtleSBz aXplCgkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAgIC8v77u/ICDvu78gIO+7vyAg77u/ICDvu78g IO+7vyAg77u/ICDvu78gICh3aGljaCBpbmNpZGVudGFsbHkgaXMgd2hhdCBLZXlHZW5lcmF0b3Iu aW5pdCgpIGV4cGVjdHMgZm9yIERFUwoJCQkJCQkJCSAgIO+7vyAg77u/ICDvu78gICAvL++7vyAg 77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICBhbmQgREVTZWRlOyBkdWghIE5vdGhp bmcgbGlrZSBiZWluZyBjb25zaXN0ZW50KS4gVGhpcyBsZWFkcyB0bwoJCQkJCQkJCSAgIO+7vyAg 77u/ICDvu78gICAvL++7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICB0aGUg Zm9sbG93aW5nIGRpbGVtbWE6CgkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAgIC8vCgkJCQkJCQkJ ICAg77u/ICDvu78gIO+7vyAgIC8v77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDv u78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICBFRkZFQ1RJVkUgS2V5IFNpemXvu78gIO+7vyAg VFJVRSBLZXkgU2l6ZQoJCQkJCQkJCSAgIO+7vyAg77u/ICDvu78gICAvL++7vyAg77u/ICDvu78g IO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAgKEtleUdl bmVyYXRvci5pbml0KCkp77u/ICAoU2VjcmV0S2V5LmdldEVuY29kaW5nKCkubGVuZ3RoKQoJCQkJ CQkJCSAgIO+7vyAg77u/ICDvu78gICAvL++7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7 vyAg77u/ICDvu78gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09CgkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAgIC8v77u/ ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAgRm9yIERFUzrvu78gICAg IDU2IGJpdHPvu78gIO+7vyAg77u/ICDvu78gIO+7vyAgICAgICAgICAgIDY0IGJpdHMKCQkJCQkJ CQkgICDvu78gIO+7vyAg77u/ICAgLy/vu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78g IO+7vyAg77u/ICBGb3IgREVTZWRlOu+7vyAxMTIgYml0cyAvIDE2OCBiaXRz77u/ICDvu78gIDE5 MiBiaXRzIChhbHdheXMpCgkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAgIC8vCgkJCQkJCQkJICAg 77u/ICDvu78gIO+7vyAgIC8v77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78g IFdlIGFyZSB0cnlpbmcgdG8gYXV0b21hdGljYWxseSBkZXRlcm1pbmUgdGhlIGtleSBzaXplIGZy b20gU2VjcmV0S2V5CgkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAgIC8v77u/ICDvu78gIO+7vyAg 77u/ICDvu78gIO+7vyAg77u/ICDvu78gIGJhc2VkIG9uIDggKiBTZWNyZXRLZXkuZ2V0RW5jb2Rp bmcoKS5sZW5ndGgsIGJ1dCBhcyB5b3UgY2FuIHNlZSwgdGhlCgkJCQkJCQkJICAg77u/ICDvu78g IO+7vyAgIC8v77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIDIga2V5IDNE RVMgYW5kIHRoZSAzIGtleSAzREVTIGJvdGggdXNlIHRoZSBzYW1lIGtleSBzaXplICgxOTIgYml0 cykKCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ICAgLy/vu78gIO+7vyAg77u/ICDvu78gIO+7vyAg 77u/ICDvu78gIO+7vyAgcmVnYXJkbGVzcyBvZiB3aGF0IGlzIHBhc3NlZCB0byBLZXlHZW5lcmF0 b3IuaW5pdCgpLiBUaGVyZSBhcmUgbm8gYWR2ZXJ0aXNlZAoJCQkJCQkJCSAgIO+7vyAg77u/ICDv u78gICAvL++7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICBtZXRob2RzIHRv IGdldCB0aGUga2V5IHNpemUgc3BlY2lmaWVkIGJ5IHRoZSBpbml0KCkgbWV0aG9kIHNvIEknbSBu b3Qgc3VyZSBob3cKCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ICAgLy/vu78gIO+7vyAg77u/ICDv u78gIO+7vyAg77u/ICDvu78gIO+7vyAgdGhpcyBpcyBhY3R1YWxseSB3b3JraW5nIGludGVybmFs bHkuIEhvd2V2ZXIsIGl0IGRvZXMgcHJlc2VudCBhIHByb2JsZW0gaWYgd2UKCQkJCQkJCQkgICDv u78gIO+7vyAg77u/ICAgLy/vu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg d2lzaCB0byBjb21tdW5pY2F0ZSB0aGUgM0RFUyBrZXkgc2l6ZSB0byBhIHJlY2lwaWVudCBmb3Ig bGF0ZXIgZGVjcnlwdGlvbiBhcwoJCQkJCQkJCSAgIO+7vyAg77u/ICDvu78gICAvL++7vyAg77u/ ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICB0aGV5IHdvdWxkIG5vdCBiZSBhYmxlIHRv IGRpc3Rpbmd1aXNoIDIga2V5IDNERVMgZnJvbSAzIGtleSAzREVTLgoJCQkJCQkJCSAgIO+7vyAg 77u/ICDvu78gICAvLwoJCQkJCQkJCSAgIO+7vyAg77u/ICDvu78gICAvL++7vyAg77u/ICDvu78g IO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICBUaGUgb25seSB3b3JrYXJvdW5kIEkga25vdyBpcyB0 byBwYXNzIHRoZSBleHBsaWNpdCBrZXkgc2l6ZSBkb3duLiBIb3dldmVyLCBpZgoJCQkJCQkJCSAg IO+7vyAg77u/ICDvu78gICAvL++7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ ICB3ZSBhcmUgZ29pbmcgdG8gZG8gdGhhdCwgSSdkIHByb3Bvc2UgcGFzc2luZyBpbiBhIENpcGhl clNwZWMgb2JqZWN0IHNvIHdlIGNvdWxkCgkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAgIC8v77u/ ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIHRlbGwgd2hhdCBjaXBoZXIgdHJh bnNmb3JtYXRpb24gdG8gdXNlIGFzIHdlbGwgaW5zdGVhZCBvZiBqdXN0IHRoZSBrZXkgc2l6ZS4g VGhlbgoJCQkJCQkJCSAgIO+7vyAg77u/ICDvu78gICAvL++7vyAg77u/ICDvu78gIO+7vyAg77u/ ICDvu78gIO+7vyAg77u/ICB3ZSB3b3VsZCBleHRyYWN0IGtleVNpemUgZnJvbSB0aGUgQ2lwaGVy U3BlYyBvYmplY3Qgb2YgZnJvbSB0aGUgU2VjcmV0S2V5IG9iamVjdC4KCQkJCQkJCQkgICDvu78g IO+7vyAg77u/ICAgLy8KCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ICAgaWYgKCBrZXlTaXplICE9 IGtleUxlbiApIHsKCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ICDvu78gICAvLyBESVNDVVNTOiBU ZWNobmljYWxseSB0aGlzIGlzIG5vdCBhIHNlY3VyaXR5ICJmYWlsdXJlIiBwZXIgc2UsIGJ1dCBu b3QgcmVhbGx5IGEgInN1Y2Nlc3MiIGVpdGhlci4KCQkJCQkJCQkgICAgICAg77u/ICDvu78gIO+7 vyAg77u/ICAgbG9nZ2VyLndhcm5pbmcoTG9nZ2VyLlNFQ1VSSVRZX0ZBSUxVUkUsICJFbmNyeXB0 aW9uIGtleSBsZW5ndGggbWlzbWF0Y2guIEVTQVBJLkVuY3J5cHRpb25LZXlMZW5ndGggaXMgIiAr CgkJCQkJCQkJCQkJICAgICAgIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gICBrZXlMZW4g KyAiIGJpdHMsIGJ1dCBsZW5ndGggb2YgYWN0dWFsIGVuY3J5cHRpb24ga2V5IGlzICIgKyBrZXlT aXplICsKCQkJCQkJCQkJCQkgICAgICAg77u/ICDvu78gIO+7vyAg77u/ICAg77u/ICDvu78gICIg Yml0cy4gIERpZCB5b3UgcmVtZW1iZXIgdG8gcmVnZW5lcmF0ZSB5b3VyIG1hc3RlciBrZXkgKGlm IHRoYXQgaXMgd2hhdCB5b3UgYXJlIHVzaW5nKT8/PyIpOwoJCQkJCQkJCSAgIO+7vyAg77u/ICDv u78gICB9CgkJCQkJCQkgICAgICAg77u/ICDvu78gIO+7vyAgIC8vIERJU0NVU1M6IFJlY29uc2lk ZXIgdGhlc2Ugd2FybmluZ3MuIElmIHRob3VzYW5kcyBvZiBlbmNyeXB0aW9ucyBhcmUgZG9uZSBp biB0aWdodCBsb29wLCBubyBvbmUgbmVlZHMKCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ICAgLy8g ICAgICAgICAgbW9yZSB0aGFuIDEgd2FybmluZy4gU2hvdWxkIHdlIGRvIHNvbWV0aGluZyBtb3Jl IGludGVsbGlnZW50IGhlcmU/CgkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAgIGlmICgga2V5U2l6 ZSA8IGtleUxlbiApIHsKCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ICDvu78gICAvLyBFU0FQSS5F bmNyeXB0aW9uS2V5TGVuZ3RoIGRlZmF1bHRzIHRvIDEyOCwgYnV0IHRoYXQgbWVhbnMgdGhhdCB3 ZSBjb3VsZCBub3QgdXNlIERFUyAoYXMgd2VhayBhcyBpdAoJCQkJCQkJCSAgICAgICDvu78gIO+7 vyAg77u/ICDvu78gICAvLyBpcyksIGV2ZW4gZm9yIGxlZ2FjeSBjb2RlLiBUaGVyZWZvcmUsIHRo aXMgaGFzIGJlZW4gY2hhbmdlZCB0byBzaW1wbGUgbG9nIGEgd2FybmluZyByYXRoZXIgdGhhbgoJ CQkJCQkJCSAgICAgICDvu78gIO+7vyAg77u/ICDvu78gICAvL++7vyAgdGhyb3cgdGhlIGZvbGxv d2luZyBleGNlcHRpb24uCgkJCQkJCQkJICAgICAgIO+7vyAg77u/ICDvu78gIO+7vyAgIC8v77u/ ICDvu78gIO+7vyAg77u/ICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIkFjdHVh bCBrZXkgc2l6ZSBvZiAiICsga2V5U2l6ZSArICIgYml0cyBzbWFsbGVyIHRoYW4gc3BlY2lmaWVk ICIgKwoJCQkJCQkJCSAgICAgICDvu78gIO+7vyAg77u/ICDvu78gICAvL++7vyAg77u/ICDvu78g IO+7vyAg77u/ICDvu78gICAgImVuY3J5cHRpb24ga2V5IGxlbmd0aCAoRVNBUEkuRW5jcnlwdGlv bktleUxlbmd0aCkgb2YgIiArIGtleUxlbiArICIgYml0cy4iKTsKCQkJCQkJCQkgICAgICAg77u/ ICDvu78gIO+7vyAg77u/ICAgbG9nZ2VyLndhcm5pbmcoTG9nZ2VyLlNFQ1VSSVRZX0ZBSUxVUkUs ICJBY3R1YWwga2V5IHNpemUgb2YgIiArIGtleVNpemUgKyAiIGJpdHMgU01BTExFUiBUSEFOIHNw ZWNpZmllZCAiICsKCQkJCQkJCQkJCQkgICAgICAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7 vyAgICJlbmNyeXB0aW9uIGtleSBsZW5ndGggKEVTQVBJLkVuY3J5cHRpb25LZXlMZW5ndGgpIG9m ICIgKyBrZXlMZW4gKyAiIGJpdHMgd2l0aCBjaXBoZXIgYWxnb3JpdGhtICIgKyBjaXBoZXJBbGcp OwoJCQkJCQkJCSAgIO+7vyAg77u/ICDvu78gICB9CgkJCQkJCQkgICAgICAg77u/ICDvu78gIO+7 vyAgIGlmICgga2V5U2l6ZSA8IDExMiApIHvvu78gIO+7vyAgLy8gTklTVCBTcGVjaWFsIFB1YiA4 MDAtNTcgY29uc2lkZXJzIDExMi1iaXRzIHRvIGJlIHRoZSBtaW5pbWFsbHkgc2FmZSBrZXkgc2l6 ZSBmcm9tIDIwMTAtMjAzMC4KCQkJCQkJCQkgICAgICAg77u/ICDvu78gIO+7vyAg77u/ICAgLy8g Tm90ZSB0aGF0IDExMiBiaXRzICdqdXN0IGhhcHBlbnMnIHRvIGJlIHNpemUgb2YgMi1rZXkgVHJp cGxlIERFUyEKCQkJCQkJCQkgICAgICAg77u/ICDvu78gIO+7vyAg77u/ICAgbG9nZ2VyLndhcm5p bmcoTG9nZ2VyLlNFQ1VSSVRZX0ZBSUxVUkUsICJQb3RlbnRpYWxseSB1bnNlY3VyZSBlbmNyeXB0 aW9uLiBLZXkgc2l6ZSBvZiAiICsga2V5U2l6ZSArICJiaXRzICIgKwoJCQkJCQkJCQkJCSAgICAg ICAibm90IHN1ZmZpY2llbnRseSBsb25nIGZvciAiICsgY2lwaGVyQWxnICsgIi4gU2hvdWxkIHVz ZSBhcHByb3ByaWF0ZSBhbGdvcml0aG0gd2l0aCBrZXkgc2l6ZSAiICsKCQkJCQkJCQkJCQkgICAg ICAgIm9mICphdCBsZWFzdCogMTEyIGJpdHMgZXhjZXB0IHdoZW4gcmVxdWlyZWQgYnkgbGVnYWN5 IGFwcHMuIFNlZSBOSVNUIFNwZWNpYWwgUHViIDgwMC01Ny4iKTsKCQkJCQkJCQkgICDvu78gIO+7 vyAg77u/ICAgfQoJCQkJCQkJICAgICAgIO+7vyAg77u/ICDvu78gICAvLyBDaGVjayBpZiBhbGdv cml0aG0gbWVudGlvbmVkIGluIFNlY3JldEtleSBpcyBzYW1lIGFzIHRoYXQgYmVpbmcgdXNlZCBm b3IgQ2lwaGVyIG9iamVjdC4KCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ICAgLy8gVGhleSBzaG91 bGQgYmUgdGhlIHNhbWUuIElmIHRoZXkgYXJlIGRpZmZlcmVudCwgdGhpbmdzIGNvdWxkIGZhaWwu IChFLmcuLCBERVMgYW5kIERFU2VkZQoJCQkJCQkJCSAgIO+7vyAg77u/ICDvu78gICAvLyByZXF1 aXJlIGtleXMgd2l0aCBldmVuIHBhcml0eS4gRXZlbiBpZiBrZXkgd2FzIHN1ZmZpY2llbnQgc2l6 ZSwgaWYgaXQgZGlkbid0IGhhdmUgdGhlIGNvcnJlY3QKCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ ICAgLy8gcGFyaXR5IGl0IGNvdWxkIGZhaWwuKQoJCQkJCQkJCSAgIO+7vyAg77u/ICDvu78gICAv LwoJCQkJCQkJCSAgIO+7vyAg77u/ICDvu78gICBTdHJpbmcgc2tleUFsZyA9IGtleS5nZXRBbGdv cml0aG0oKTsKCQkJCQkJCSAgICAgICDvu78gIO+7vyAg77u/ICAgaWYgKCAhKCBjaXBoZXJBbGcu c3RhcnRzV2l0aCggc2tleUFsZyArICIvIiApIHx8IGNpcGhlckFsZy5lcXVhbHMoIHNrZXlBbGcg KSApICkgewoJCQkJCQkJCSAgIO+7vyAg77u/ICDvu78gIO+7vyAgIC8vIERJU0NVU1M6IFNob3Vs ZCB3ZSB0aHJvd24gYSBDb25maWd1cmF0aW9uRXhjZXB0aW9uIGhlcmUgb3IganVzdCBsb2cgYSB3 YXJuaW5nPz8/IEknbSBnYW1lIGZvcgoJCQkJCQkJCSAgICAgICDvu78gIO+7vyAg77u/ICDvu78g ICAvL++7vyAg77u/ICDvu78gICBlaXRoZXIsIGJ1dCBwZXJzb25hbGx5IEknZCBwcmVmZXIgdGhl IHNxdWVha3kgd2hlZWwgdG8gdGhlIGFubm95aW5nIHRocm93aW5nIG9mCgkJCQkJCQkJICAgICAg IO+7vyAg77u/ICDvu78gIO+7vyAgIC8v77u/ICDvu78gIO+7vyAgIGEgQ29uZmlndXJhdGlvbkV4 Y2VwdGlvbiAod2hpY2ggaXMgYSBSdW50aW1lRXhjZXB0aW9uKS4gTGVzcyBsaWtlbHkgdG8gdXBz ZXQKCQkJCQkJCQkgICAgICAg77u/ICDvu78gIO+7vyAg77u/ICAgLy/vu78gIO+7vyAg77u/ICAg dGhlIGRldmVsb3BtZW50IGNvbW11bml0eS4KCQkJCQkJCQkgICAgICAg77u/ICDvu78gIO+7vyAg 77u/ICAgbG9nZ2VyLndhcm5pbmcoTG9nZ2VyLlNFQ1VSSVRZX0ZBSUxVUkUsICJFbmNyeXB0aW9u IG1pc21hdGNoIGJldHdlZW4gY2lwaGVyIGFsZ29yaXRobSAoIiArCgkJCQkJCQkJCQkJICAgICAg IO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gICBjaXBoZXJBbGcgKyAiKSBhbmQgU2VjcmV0 S2V5IGFsZ29yaXRobSAoIiArIHNrZXlBbGcgKyAiKS4gQ2lwaGVyIHdpbGwgdXNlIGFsZ29yaXRo bSAiICsgY2lwaGVyQWxnKTsKCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ICAgfQoKCQkJCQkJCSAg ICAgICDvu78gIO+7vyAg77u/ICAgYnl0ZVtdIGl2Qnl0ZXMgPSBudWxsOwoJCQkJCQkJICAgICAg IO+7vyAg77u/ICDvu78gICBDaXBoZXJTcGVjIGNpcGhlclNwZWMgPSBuZXcgQ2lwaGVyU3BlYyhl bmNyeXB0ZXIsIGtleVNpemUpO++7vyAgLy8gQ291bGQgcGFzcyB0aGUgQUNUVUFMIChpbnRlbmRl ZCkga2V5IHNpemUKCQkJCQkJCQkJCQkJCQkJCSAgICAg77u/ICDvu78gIO+7vyAgIAoJCQkJCQkJ CQkJCQkJCQkJICAgICAvLyBVc2luZyBjaXBoZXIgbW9kZSB0aGF0IHN1cHBvcnRzICpib3RoKiBj b25maWRlbnRpYWxpdHkgKmFuZCogYXV0aGVudGljaXR5PyBJZiBzbywgdGhlbgoJCQkJCQkJCQkJ CQkJCQkJICAgICAvLyB1c2UgdGhlIHNwZWNpZmllZCBTZWNyZXRLZXkgYXMtaXMgcmF0aGVyIHRo YW4gY29tcHV0aW5nIGEgZGVyaXZlZCBrZXkgZnJvbSBpdC4gV2UgYWxzbwoJCQkJCQkJCQkJCQkJ CQkJICAgICAvLyBkb24ndCBleHBlY3QgYSBzZXBhcmF0ZSBNQUMgaW4gdGhlIHNwZWNpZmllZCBD aXBoZXJUZXh0IG9iamVjdCBzbyB0aGVyZWZvcmUgZG9uJ3QgdHJ5CgkJCQkJCQkJCQkJCQkJCQkg ICAgIC8vIHRvIHZhbGlkYXRlIGl0LgoJCQkJCQkJCQkJCQkJCQkJICAgICBib29sZWFuIHByZWZl cnJlZENpcGhlck1vZGUgPSBDcnlwdG9IZWxwZXIuaXNDb21iaW5lZENpcGhlck1vZGUoIGNpcGhl ck1vZGUgKTsKCQkJCQkJCSAgICAgICBTZWNyZXRLZXkgZW5jS2V5ID0gbnVsbDsKCQkJCQkJCSAg ICAgICBpZiAoIHByZWZlcnJlZENpcGhlck1vZGUgKSB7CgkJCQkJCQkJICAgZW5jS2V5ID0ga2V5 OwoJCQkJCQkJICAgICAgIH0gZWxzZSB7CgkJCQkJCQkJICAgZW5jS2V5ID0gY29tcHV0ZURlcml2 ZWRLZXkoS2V5RGVyaXZhdGlvbkZ1bmN0aW9uLmtkZlZlcnNpb24sIGdldERlZmF1bHRQUkYoKSwK CQkJCQkJCQkJCQkgICAgICBrZXksIGtleVNpemUsICJlbmNyeXB0aW9uIik7CgkJCQkJCQkgICAg ICAgfQoJCQkJCQkJICAgICAgIO+7vyAg77u/ICDvu78gICAKCQkJCQkJCQkgICBpZiAoIGNpcGhl clNwZWMucmVxdWlyZXNJVigpICkgewoJCQkJCQkJCSAgICAgICBTdHJpbmcgaXZUeXBlID0gRVNB UEkuc2VjdXJpdHlDb25maWd1cmF0aW9uKCkuZ2V0SVZUeXBlKCk7CgkJCQkJCQkJICAgICAgIEl2 UGFyYW1ldGVyU3BlYyBpdlNwZWMgPSBudWxsOwoJCQkJCQkJCSAgICAgICBpZiAoIGl2VHlwZS5l cXVhbHNJZ25vcmVDYXNlKCJyYW5kb20iKSApIHsKCQkJCQkJCQkJICAgaXZCeXRlcyA9IEVTQVBJ LnJhbmRvbWl6ZXIoKS5nZXRSYW5kb21CeXRlcyhlbmNyeXB0ZXIuZ2V0QmxvY2tTaXplKCkpOwoJ CQkJCQkJCQkgICDvu78gICAgICAgICAgfSBlbHNlIGlmICggaXZUeXBlLmVxdWFsc0lnbm9yZUNh c2UoImZpeGVkIikgKSB7CgkJCQkJCQkJCSAgIFN0cmluZyBmaXhlZElWQXNIZXggPSBFU0FQSS5z ZWN1cml0eUNvbmZpZ3VyYXRpb24oKS5nZXRGaXhlZElWKCk7CgkJCQkJCQkJCSAgIGl2Qnl0ZXMg PSBIZXguZGVjb2RlKGZpeGVkSVZBc0hleCk7CgkJCQkJCQkJCSAgIC8qIEZVVFVSRe+7vyAg77u/ ICAgfSBlbHNlIGlmICggaXZUeXBlLmVxdWFsc0lnbm9yZUNhc2UoInNwZWNpZmllZCIpKSB7CgkJ CQkJCQkJCSAgIC8vIEZVVFVSRSAtIFRPRE8gIC0gQ3JlYXRlIGluc3RhbmNlIG9mIHNwZWNpZmll ZCBjbGFzcyB0byB1c2UgZm9yIElWIGdlbmVyYXRpb24gYW5kCgkJCQkJCQkJCSAgIC8v77u/ICDv u78gIO+7vyAg77u/ICDvu78gICB1c2UgaXQgdG8gY3JlYXRlIHRoZSBpdkJ5dGVzLiAoVGhlIGlu dGVudCBpcyB0byBtYWtlIHN1cmUgdGhhdAoJCQkJCQkJCQkgICAvL++7vyAg77u/ICDvu78gIO+7 vyAgICAgICAxKSBJVnMgYXJlIG5ldmVyIHJlcGVhdGVkIGZvciBjaXBoZXIgbW9kZXMgbGlrZSBP RkIgYW5kIENGQiwgYW5kCgkJCQkJCQkJCSAgIC8v77u/ICDvu78gIO+7vyAg77u/ICDvu78gICAy KSB0byBzY3JlZW4gZm9yIHdlYWsgSVZzIGZvciB0aGUgcGFydGljdWxhciBjaXBoZXIgYWxnb3Jp dGhtLgoJCQkJCQkJCQkgICAvL++7vyAg77u/ICBJbiBtZWFudGltZSwgdXNlICdyYW5kb20nIGZv ciBibG9jayBjaXBoZXIgaW4gZmVlZGJhY2sgbW9kZS4gVW5saWtlbHkgdGhleSB3aWxsCgkJCQkJ CQkJCSAgIC8v77u/ICDvu78gIGJlIHJlcGVhdGVkIHVubGVzcyB5b3UgYXJlIHNhbHRpbmcgU2Vj dXJlUmFuZG9tIHdpdGggc2FtZSB2YWx1ZSBlYWNoIHRpbWUuIEFueXRoaW5nCgkJCQkJCQkJCSAg IC8v77u/ICDvu78gIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBzaG91bGQgYmUgc3VpdGFibGUs IGxpa2UgYSBjb3VudGVyLCBidXQgbmVlZCB0byByZW1lbWJlcgoJCQkJCQkJCQkgICDvu78gIO+7 vyAg77u/ICDvu78gIO+7vyAgIO+7vyAg77u/ICAvL++7vyAg77u/ICBpdCBhY3Jvc3MgSlZNIHJl c3RhcnRzLiBXYXMgdGhpbmtpbmcgb2YgdXNpbmcgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCku IFdoaWxlCgkJCQkJCQkJCSAgIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICAg77u/ICDvu78gIC8v 77u/ICDvu78gIGl0J3Mgbm90IHBlcmZlY3QgaXQgcHJvYmFibHkgaXMgZ29vZCBlbm91Z2guIENv dWxkIGV2ZW4gYWxsIChhZHZhbmNlZCkgZGV2ZWxvcGVycwoJCQkJCQkJCQkgICDvu78gIO+7vyAg 77u/ICDvu78gIO+7vyAgIO+7vyAg77u/ICAvLyAgICAgIHRvIGRlZmluZSB0aGVpciBvd24gY2xh c3MgdG8gY3JlYXRlIGEgdW5pcXVlIElWIHRvIGFsbG93IHRoZW0gc29tZSBjaG9pY2UsIGJ1dAoJ CQkJCQkJCQkgICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAgIO+7vyAg77u/ICAvLyAgICAgIGRl ZmluaXRlbHkgbmVlZCB0byBwcm92aWRlIGEgc2FmZSwgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4K CQkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gICAgKi8KCQkJCQkJCQkJICAg77u/ ICDvu78gIO+7vyAg77u/ICAgfSBlbHNlIHsKCQkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAg77u/ ICDvu78gICAvLyBUT0RPOiBVcGRhdGUgdG8gYWRkICdzcGVjaWZpZWQnIG9uY2UgdGhhdCBpcyBz dXBwb3J0ZWQgYW5kIGFkZGVkIGFib3ZlLgoJCQkJCQkJCQkgICAgICAg77u/ICDvu78gIO+7vyAg 77u/ICDvu78gICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiUHJvcGVydHkgRW5j cnlwdG9yLkNob29zZUlWTWV0aG9kIG11c3QgYmUgc2V0IHRvICdyYW5kb20nIG9yICdmaXhlZCci KTsKCQkJCQkJCQkJICAg77u/ICDvu78gIO+7vyAg77u/ICAgfQoJCQkJCQkJCSAgICAgICDvu78g IO+7vyAg77u/ICDvu78gICBpdlNwZWMgPSBuZXcgSXZQYXJhbWV0ZXJTcGVjKGl2Qnl0ZXMpOwoJ CQkJCQkJCSAgICAgICDvu78gIO+7vyAg77u/ICDvu78gICBjaXBoZXJTcGVjLnNldElWKGl2Qnl0 ZXMpOwoJCQkJCQkJCSAgICAgICDvu78gIO+7vyAg77u/ICDvu78gICBlbmNyeXB0ZXIuaW5pdChD aXBoZXIuRU5DUllQVF9NT0RFLCBlbmNLZXksIGl2U3BlYyk7CgkJCQkJCQkJICAgICAgIO+7vyAg 77u/ICDvu78gICB9IGVsc2UgewoJCQkJCQkJCSAgICAgICDvu78gIO+7vyAg77u/ICDvu78gICBl bmNyeXB0ZXIuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBlbmNLZXkpOwoJCQkJCQkJCSAgICAg ICDvu78gIO+7vyAg77u/ICAgfQoJCQkJCQkJICAgICAgIO+7vyAg77u/ICDvu78gICBsb2dnZXIu ZGVidWcoTG9nZ2VyLkVWRU5UX1NVQ0NFU1MsICJFbmNyeXB0aW5nIHdpdGggIiArIGNpcGhlclNw ZWMpOwoJCQkJCQkJICAgICAgIO+7vyAg77u/ICDvu78gICBieXRlW10gcmF3ID0gZW5jcnlwdGVy LmRvRmluYWwocGxhaW50ZXh0KTsKCQkJCQkJCSAgICAgICAvLyBDb252ZXJ0IHRvIENpcGhlclRl eHQuCgkJCQkJCQkgICAgICAgQ2lwaGVyVGV4dCBjaXBoZXJ0ZXh0ID0gbmV3IENpcGhlclRleHQo Y2lwaGVyU3BlYywgcmF3KTsKCQkJCQkJCSAgICAgICDvu78gIO+7vyAg77u/ICAgCgkJCQkJCQkJ ICAg77u/ICDvu78gIO+7vyAgIC8vIElmIHdlIGFyZSB1c2luZyBhICJwcmVmZXJyZWQiIGNpcGhl ciBtb2RlLS1pLmUuLCBvbmUgdGhhdCBzdXBwb3J0cyAqYm90aCogY29uZmlkZW50aWFsaXR5IGFu ZAoJCQkJCQkJCSAgIO+7vyAg77u/ICDvu78gICAvLyBhdXRoZW50aWNpdHksIHRoZXJlIGlzIG5v IHBvaW50IHRvIHN0b3JlIGEgc2VwYXJhdGUgTUFDIGluIHRoZSBDaXBoZXJUZXh0IG9iamVjdC4g VGh1cyB3ZSBvbmx5CgkJCQkJCQkJICAgLy8gZG8gdGhpcyB3aGVuIHdlIGFyZSBub3QgdXNpbmcg c3VjaCBhIGNpcGhlciBtb2RlLgoJCQkJCQkJCSAgIO+7vyAg77u/ICDvu78gICBpZiAoICFwcmVm ZXJyZWRDaXBoZXJNb2RlICkgewoJCQkJCQkJCSAgIO+7vyAg77u/ICDvu78gICAgICAgLy8gQ29t cHV0ZSBkZXJpdmVkIGtleSwgYW5kIHRoZW4gdXNlIGl0IHRvIGNvbXB1dGUgYW5kIHN0b3JlIHNl cGFyYXRlIE1BQyBpbiBDaXBoZXJUZXh0IG9iamVjdC4KCQkJCQkJCQkgICAgICAg77u/ICDvu78g IO+7vyAgICAgICBTZWNyZXRLZXkgYXV0aEtleSA9IGNvbXB1dGVEZXJpdmVkS2V5KEtleURlcml2 YXRpb25GdW5jdGlvbi5rZGZWZXJzaW9uLCBnZXREZWZhdWx0UFJGKCksCgkJCQkJCQkJCQkJCQkJ Ce+7vyAg77u/ICDvu78gICAgICDvu78gIO+7vyAgIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDv u78gIO+7vyAgICAga2V5LCBrZXlTaXplLCAiYXV0aGVudGljaXR5Iik7CgkJCQkJCQkJICAg77u/ ICDvu78gIO+7vyAgICAgICBjaXBoZXJ0ZXh0LmNvbXB1dGVBbmRTdG9yZU1BQyggIGF1dGhLZXkg KTsKCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ICAgfQoJCQkJCQkJICAgICAgIO+7vyAg77u/ICDv u78gICBsb2dnZXIuZGVidWcoTG9nZ2VyLkVWRU5UX1NVQ0NFU1MsICJKYXZhRW5jcnlwdG9yLmVu Y3J5cHQoU2VjcmV0S2V5LGJ5dGVbXSxib29sZWFuLGJvb2xlYW4pIC0tIHN1Y2Nlc3MhIik7CgkJ CQkJCQkgICAgICAg77u/ICDvu78gIO+7vyAgIHN1Y2Nlc3MgPSB0cnVlO++7vyAgLy8gVzAwdCEh IQoJCQkJCQkJCQkJCSDvu78gIO+7vyAg77u/ICAgcmV0dXJuIGNpcGhlcnRleHQ7CgkJCQkJCQkg ICAgICAg77u/ICDvu78gIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gaWtlKSB7CgkJCQkJ CQkgICAgICAg77u/ICDvu78gIO+7vyAgIHRocm93IG5ldyBFbmNyeXB0aW9uRXhjZXB0aW9uKCJF bmNyeXB0aW9uIGZhaWx1cmU6IEludmFsaWQga2V5IGV4Y2VwdGlvbi4iLAoJCQkJCQkJCQkJCQkg ICAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gICAiUmVxdWVzdGVkIGtleSBzaXplOiAiICsga2V5 U2l6ZSArICJiaXRzIGdyZWF0ZXIgdGhhbiAxMjggYml0cy4gTXVzdCBpbnN0YWxsIHVubGltaXRl ZCBzdHJlbmd0aCBjcnlwdG8gZXh0ZW5zaW9uIGZyb20gU3VuOiAiICsKCQkJCQkJCQkJCQkJICAg IO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICAgaWtlLmdldE1lc3NhZ2UoKSwgaWtlKTsKCQkJCQkJ CSAgICAgICDvu78gIO+7vyAgIH0gY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gY2V4KSB7 CgkJCQkJCQkgICAgICAg77u/ICDvu78gIO+7vyAgIHRocm93IG5ldyBFbmNyeXB0aW9uRXhjZXB0 aW9uKCJFbmNyeXB0aW9uIGZhaWx1cmU6IENvbmZpZ3VyYXRpb24gZXJyb3IuIERldGFpbHMgaW4g bG9nLiIsICJLZXkgc2l6ZSBtaXNtYXRjaCBvciB1bnN1cHBvcnRlZCBJViBtZXRob2QuICIgKwoJ CQkJCQkJCQkJCQkgICAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gICAiQ2hlY2sgZW5jcnlwdGlv biBrZXkgc2l6ZSB2cy4gRVNBUEkuRW5jcnlwdGlvbktleUxlbmd0aCBvciBFbmNyeXB0b3IuQ2hv b3NlSVZNZXRob2QgcHJvcGVydHkuIiwgY2V4KTsKCQkJCQkJCSAgICAgICDvu78gIO+7vyAgIH0g Y2F0Y2ggKEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24gZSkgewoJCQkJCQkJICAg ICAgIO+7vyAg77u/ICDvu78gICB0aHJvdyBuZXcgRW5jcnlwdGlvbkV4Y2VwdGlvbigiRW5jcnlw dGlvbiBmYWlsdXJlIChpbnZhbGlkIElWKSIsCgkJCQkJCQkJCQkJCSAgICDvu78gIO+7vyAg77u/ ICDvu78gIO+7vyAgICJFbmNyeXB0aW9uIHByb2JsZW06IEludmFsaWQgSVYgc3BlYzogIiArIGUu Z2V0TWVzc2FnZSgpLCBlKTsKCQkJCQkJCSAgICAgICDvu78gIO+7vyAgIH0gY2F0Y2ggKElsbGVn YWxCbG9ja1NpemVFeGNlcHRpb24gZSkgewoJCQkJCQkJICAgICAgIO+7vyAg77u/ICDvu78gICB0 aHJvdyBuZXcgRW5jcnlwdGlvbkV4Y2VwdGlvbigiRW5jcnlwdGlvbiBmYWlsdXJlIChubyBwYWRk aW5nIHVzZWQ7IGludmFsaWQgaW5wdXQgc2l6ZSkiLAoJCQkJCQkJCQkJCQkgICAg77u/ICDvu78g IO+7vyAg77u/ICDvu78gICAiRW5jcnlwdGlvbiBwcm9ibGVtOiBJbnZhbGlkIGlucHV0IHNpemUg d2l0aG91dCBwYWRkaW5nICgiICsgeGZvcm0gKyAiKS4gIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsK CQkJCQkJCSAgICAgICDvu78gIO+7vyAgIH0gY2F0Y2ggKEJhZFBhZGRpbmdFeGNlcHRpb24gZSkg ewoJCQkJCQkJICAgICAgIO+7vyAg77u/ICDvu78gICB0aHJvdyBuZXcgRW5jcnlwdGlvbkV4Y2Vw dGlvbigiRW5jcnlwdGlvbiBmYWlsdXJlIiwKCQkJCQkJCQkJCQkJICAgIO+7vyAg77u/ICDvu78g IO+7vyAg77u/ICAgIltOb3RlOiBTaG91bGQgTkVWRVIgaGFwcGVuIGluIGVuY3J5cHRpb24gbW9k ZS5dIEVuY3J5cHRpb24gcHJvYmxlbTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKCQkJCQkJCSAg ICAgICDvu78gIO+7vyAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CgkJ CQkJCQkgICAgICAg77u/ICDvu78gIO+7vyAgIHRocm93IG5ldyBFbmNyeXB0aW9uRXhjZXB0aW9u KCJFbmNyeXB0aW9uIGZhaWx1cmUgKHVuYXZhaWxhYmxlIGNpcGhlciByZXF1ZXN0ZWQpIiwKCQkJ CQkJCQkJCQkJICAgIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICAgIkVuY3J5cHRpb24gcHJvYmxl bTogc3BlY2lmaWVkIGFsZ29yaXRobSBpbiBjaXBoZXIgeGZvcm0gIiArIHhmb3JtICsgIiBub3Qg YXZhaWxhYmxlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwoJCQkJCQkJICAgICAgIO+7vyAg77u/ ICAgfSBjYXRjaCAoTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbiBlKSB7CgkJCQkJCQkgICAgICAg77u/ ICDvu78gIO+7vyAgIHRocm93IG5ldyBFbmNyeXB0aW9uRXhjZXB0aW9uKCJFbmNyeXB0aW9uIGZh aWx1cmUgKHVuYXZhaWxhYmxlIHBhZGRpbmcgc2NoZW1lIHJlcXVlc3RlZCkiLAoJCQkJCQkJCQkJ CQkgICAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gICAiRW5jcnlwdGlvbiBwcm9ibGVtOiBzcGVj aWZpZWQgcGFkZGluZyBzY2hlbWUgaW4gY2lwaGVyIHhmb3JtICIgKyB4Zm9ybSArICIgbm90IGF2 YWlsYWJsZTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKCQkJCQkJCSAgICAgICDvu78gIO+7vyAg IH0gZmluYWxseSB7CgkJCQkJCQkgICAgICAg77u/ICDvu78gIO+7vyAgIC8vIERvbid0IG92ZXJ3 cml0ZSBhbnl0aGluZyBpbiB0aGUgY2FzZSBvZiBleGNlcHRpb25zIGJlY2F1c2UgdGhleSBtYXkg d2lzaCB0byByZXRyeS4KCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ICAgaWYgKCBzdWNjZXNzICYm IG92ZXJ3cml0ZVBsYWludGV4dCApIHsKCQkJCQkJCQkgICDvu78gIO+7vyAg77u/ICDvu78gICBw bGFpbi5vdmVyd3JpdGUoKTvvu78gIO+7vyAgLy8gTm90ZTogU2FtZSBhcyBvdmVyd3JpdGluZyAn cGxhaW50ZXh0JyBieXRlIGFycmF5LgoJCQkJCQkJCQkJCQkgIO+7vyAg77u/ICB9CgkJCQkJCQkg ICAgICAg77u/ICB9Cgnvu78gICB9CgogICAg77u/ICAvKioKCSDvu78gICAgKiBDb252ZW5pZW5j ZSBtZXRob2QgdGhhdCBkZWNyeXB0cyBwcmV2aW91c2x5IGVuY3J5cHRlZCBwbGFpbnRleHQgc3Ry aW5ncwoJIO+7vyAgICAqIHRoYXQgd2VyZSBlbmNyeXB0ZWQgdXNpbmcgdGhlIG5ldyBlbmNyeXB0 aW9uIG1lY2hhbmlzbSAod2l0aCBDQkMgbW9kZSBhbmQKCSDvu78gICAgKiBQS0NTNSBwYWRkaW5n IGJ5IGRlZmF1bHQpLiAgVGhpcyBkZWNyeXB0aW9uIG1ldGhvZCB1c2VzIHRoZSBtYXN0ZXIKCSDv u78gICAgKiBlbmNyeXB0aW9uIGtleSBzcGVjaWZpZWQgYnkgdGhlIHtAY29kZSBFbmNyeXB0b3Iu TWFzdGVyS2V5fSBwcm9wZXJ0eQoJIO+7vyAgICAqIGluIHtAY29kZSBFU0FQSS5wcm9wZXJ0aWVz fS4KCSDvu78gICAgKgoJIO+7vyAgICAqIEBwYXJhbSBiNjRJVkNpcGhlcnRleHTvu78gIEEgYmFz ZTY0LWVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlCgkg77u/ICAgICog77u/ICDvu78gIO+7 vyAg77u/ICDvu78gIO+7vyAg77u/ICBJViArIHJhdyBjaXBoZXJ0ZXh0IHN0cmluZyB0byBiZSBk ZWNyeXB0ZWQgd2l0aAoJIO+7vyAgICAqIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7 vyAgdGhlIGRlZmF1bHQgbWFzdGVyIGtleS4KCSDvu78gICAgKiBAcmV0dXJu77u/ICBUaGUgcGxh aW50ZXh0IHN0cmluZyBwcmlvciB0byBlbmNyeXB0aW9uLgoJIO+7vyAgICAqIEB0aHJvd3MgRW5j cnlwdGlvbkV4Y2VwdGlvbiBXaGVuIHNvbWV0aGluZyBmYWlscyB3aXRoIHRoZSBkZWNyeXB0aW9u LgoJIO+7vyAgICAqCgkg77u/ICAgICogQHNlZSBvcmcub3dhc3AuZXNhcGkuRW5jcnlwdG9yI2Rl Y3J5cHQoQ2lwaGVyVGV4dCkKCSDvu78gICAgKi8KCe+7vyAgIEBEZXByZWNhdGVkIHB1YmxpYyBT dHJpbmcgZGVjcnlwdChTdHJpbmcgYjY0SVZDaXBoZXJ0ZXh0KSB0aHJvd3MgRW5jcnlwdGlvbkV4 Y2VwdGlvbgoJCQkJCQkJCQkgICAg77u/ICAgewoJ77u/ICAgICAgIGxvZ1dhcm5pbmcoImRlY3J5 cHQiLCAiQ2FsbGluZyBkZXByZWNhdGVkIGRlY3J5cHQoKSBtZXRob2QuIik7Cgnvu78gIO+7vyAg IENpcGhlclRleHQgY3QgPSBudWxsOwoJ77u/ICDvu78gICB0cnkgewoJICAgIO+7vyAg77u/ICDv u78gICAvLyBXZSBhc3N1bWUgdGhhdCB0aGUgZGVmYXVsdCBjaXBoZXIgdHJhbnNmb3JtIHdhcyB1 c2VkIHRvIGVuY3J5cHQgdGhpcy4KCQnvu78gIO+7vyAg77u/ICAgY3QgPSBuZXcgQ2lwaGVyVGV4 dCgpOwoKCSAgICDvu78gIO+7vyAg77u/ICAgLy8gTmVlZCB0byBiYXNlNjQgZGVjb2RlIHRoZSBJ VitjaXBoZXJ0ZXh0IGFuZCBleHRyYWN0IHRoZSBJViB0byBzZXQgaXQgaW4gQ2lwaGVyVGV4dCBv YmplY3QuCgkJ77u/ICDvu78gIO+7vyAgIGJ5dGVbXSBpdlBsdXNSYXdDaXBoZXJUZXh0ID0gRVNB UEkuZW5jb2RlcigpLmRlY29kZUZyb21CYXNlNjQoYjY0SVZDaXBoZXJ0ZXh0KTsKCSAgICDvu78g IO+7vyAg77u/ICAgaW50IGJsb2NrU2l6ZSA9IGN0LmdldEJsb2NrU2l6ZSgpO++7vyAgLy8gU2l6 ZSBpbiBieXRlcy4KCQkJCQkJCSDvu78gIO+7vyAg77u/ICAgYnl0ZVtdIGl2ID0gbmV3IGJ5dGVb IGJsb2NrU2l6ZSBdOwoJICAgIO+7vyAg77u/ICDvu78gICBDcnlwdG9IZWxwZXIuY29weUJ5dGVB cnJheShpdlBsdXNSYXdDaXBoZXJUZXh0LCBpdiwgYmxvY2tTaXplKTvvu78gIC8vIENvcHkgdGhl IGZpcnN0IGJsb2NrU2l6ZSBieXRlcyBpbnRvIGl2IGFycmF5CgkJCQkJCQkJCQkgICAgICDvu78g IO+7vyAg77u/ICAgaW50IGNpcGhlclRleHRTaXplID0gaXZQbHVzUmF3Q2lwaGVyVGV4dC5sZW5n dGggLSBibG9ja1NpemU7CgkgICAg77u/ICDvu78gIO+7vyAgIGJ5dGVbXSByYXdDaXBoZXJUZXh0 ID0gbmV3IGJ5dGVbIGNpcGhlclRleHRTaXplIF07CgkgICAg77u/ICDvu78gIO+7vyAgIFN5c3Rl bS5hcnJheWNvcHkoaXZQbHVzUmF3Q2lwaGVyVGV4dCwgYmxvY2tTaXplLCByYXdDaXBoZXJUZXh0 LCAwLCBjaXBoZXJUZXh0U2l6ZSk7CgkgICAg77u/ICDvu78gIO+7vyAgIGN0LnNldElWYW5kQ2lw aGVydGV4dChpdiwgcmF3Q2lwaGVyVGV4dCk7CgoJICAgIO+7vyAg77u/ICDvu78gICAvLyBOb3cg dGhlIENpcGhlclRleHQgb2JqZWN0IHNob3VsZCBiZSBwcmVwYXJlZCB0byB1c2UgaXQgdG8gZGVj cnlwdC4KCQnvu78gIO+7vyAg77u/ICAgUGxhaW5UZXh0IHBsYWludGV4dCA9IGRlY3J5cHQoY3Qp OwoJICAgIO+7vyAg77u/ICDvu78gICByZXR1cm4gcGxhaW50ZXh0LnRvU3RyaW5nKCk777u/ICAv LyBDb252ZXJ0IGJhY2sgdG8gYSBKYXZhIFN0cmluZwoJCQkJCQkgICDvu78gIO+7vyAgIH0gY2F0 Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewoJICAgIO+7vyAg77u/ICDvu78g ICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuOyBVVEYtOCBzaG91bGQgYmUgaW4gcnQuamFyLgoJCe+7 vyAg77u/ICDvu78gICBsb2dnZXIuZXJyb3IoTG9nZ2VyLlNFQ1VSSVRZX0ZBSUxVUkUsICJVVEYt OCBlbmNvZGluZyBub3QgYXZhaWxhYmxlISBEZWNyeXB0aW9uIGZhaWxlZC4iLCBlKTsKCSAgICDv u78gIO+7vyAg77u/ICAgcmV0dXJuIG51bGw777u/ICAvLyBDSEVDS01FOiBPciByZS10aHJvdyBv ciB3aGF0PyBDb3VsZCBhbHNvIHVzZSBuYXRpdmUgZW5jb2RpbmcsIGJ1dCB0aGF0J3MKCQkJCSAg IO+7vyAg77u/ICDvu78gICAvLyBsaWtlbHkgdG8gY2F1c2UgdW5leHBlY3RlZCBhbmQgdW5kZXNp cmVkIGVmZmVjdHMgZmFyIGRvd25zdHJlYW0uCgkJCQkgICDvu78gIO+7vyAgIH0gY2F0Y2ggKElP RXhjZXB0aW9uIGUpIHsKCSAgICDvu78gIO+7vyAg77u/ICAgbG9nZ2VyLmVycm9yKExvZ2dlci5T RUNVUklUWV9GQUlMVVJFLCAiQmFzZTY0IGRlY29kaW5nIG9mIElWK2NpcGhlcnRleHQgZmFpbGVk LiBEZWNyeXB0aW9uIGZhaWxlZC4iLCBlKTsKCSAgICDvu78gIO+7vyAg77u/ICAgcmV0dXJuIG51 bGw7CgkgICAg77u/ICDvu78gICB9Cgnvu78gICB9CgogICAg77u/ICAvKioKCSDvu78gICoge0Bp bmhlcml0RG9jfQoJIO+7vyAgKi8KCe+7vyAgcHVibGljIFBsYWluVGV4dCBkZWNyeXB0KENpcGhl clRleHQgY2lwaGVydGV4dCkgdGhyb3dzIEVuY3J5cHRpb25FeGNlcHRpb24gewoJ77u/ICDvu78g ICAvLyBOb3cgbW9yZSBvZiBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciB1c2luZyB0aGUgbWFz dGVyIGtleS4KCSAgICDvu78gIO+7vyAgIHJldHVybiBkZWNyeXB0KHNlY3JldEtleVNwZWMsIGNp cGhlcnRleHQpOwoJ77u/ICB9CgogICAg77u/ICAvKioKCSDvu78gICAqIHtAaW5oZXJpdERvY30K CSDvu78gICAqLwoJ77u/ICBwdWJsaWMgUGxhaW5UZXh0IGRlY3J5cHQoU2VjcmV0S2V5IGtleSwg Q2lwaGVyVGV4dCBjaXBoZXJ0ZXh0KQoJ77u/ICAgICAgdGhyb3dzIEVuY3J5cHRpb25FeGNlcHRp b24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgoJCSAgICAg77u/ICB7Cgnvu78gICAgICBsb25n IHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7ICAvLyBDdXJyZW50IHRpbWUgaW4gbmFub3NlY3M7 IHVzZWQgdG8gcHJldmVudCB0aW1pbmcgYXR0YWNrcwoJ77u/ICAgICAgaWYgKCBrZXkgPT0gbnVs bCApIHsKCSAgICDvu78gICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlv bigiU2VjcmV0S2V5IGFyZyBtYXkgbm90IGJlIG51bGwiKTsKCSAgICDvu78gICAgICB9Cgnvu78g ICAgICBpZiAoIGNpcGhlcnRleHQgPT0gbnVsbCApIHsKCSAgICDvu78gICAgICAgICAgdGhyb3cg bmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2lwaGVydGV4dCBtYXkgYXJnIG5vdCBiZSBu dWxsIik7CgkgICAg77u/ICAgICAgfQoKCe+7vyAgICAgIGlmICggISBDcnlwdG9IZWxwZXIuaXNB bGxvd2VkQ2lwaGVyTW9kZShjaXBoZXJ0ZXh0LmdldENpcGhlck1vZGUoKSkgKSB7CgkgICAg77u/ ICAgICAgICAgIC8vIFRoaXMgcmVhbGx5IHNob3VsZCBiZSBhbiBpbGxlZ2FsIGFyZ3VtZW50IGV4 Y2VwdGlvbiwgYnV0IGl0IGNvdWxkCgkJ77u/ICAgICAgICAgIC8vIG1lYW4gdGhhdCBhIHBhcnRu ZXIgZW5jcnlwdGVkIHNvbWV0aGluZyB1c2luZyBhIGNpcGhlciBtb2RlIHRoYXQKCQnvu78gICAg ICAgICAgLy8geW91IGRvIG5vdCBhY2NlcHQsIHNvIGl0J3MgYSBiaXQgbW9yZSBjb21wbGV4IHRo YW4gdGhhdC4gQWxzbwoJCe+7vyAgICAgICAgICAvLyB0aHJvd2luZyBhbiBJbGxlZ2FsQXJndW1l bnRFeGNlcHRpb24gZG9lc24ndCBhbGxvdyB1cyB0byBwcm92aWRlCgkJ77u/ICAgICAgICAgIC8v IHRoZSB0d28gc2VwYXJhdGUgZXJyb3IgbWVzc2FnZXMgb3IgYXV0b21hdGljYWxseSBsb2cgaXQu CgkJ77u/ICAgICAgICAgIHRocm93IG5ldyBFbmNyeXB0aW9uRXhjZXB0aW9uKERFQ1JZUFRJT05f RkFJTEVELAoJCQkJCQkJ77u/ICAgICAgICAgICAgICAgICAgIkludmFsaWQgY2lwaGVyIG1vZGUg IiArIGNpcGhlcnRleHQuZ2V0Q2lwaGVyTW9kZSgpICsKCQkJCQkJCe+7vyAgICAgICAgICAiIG5v dCBwZXJtaXR0ZWQgZm9yIGRlY3J5cHRpb24gb3IgZW5jcnlwdGlvbiBvcGVyYXRpb25zLiIpOwoJ ICAgIO+7vyAgICAgIH0KCe+7vyAgICAgIGxvZ2dlci5kZWJ1ZyhMb2dnZXIuRVZFTlRfU1VDQ0VT UywKCQkJICAg77u/ICAgICAgICAgICAgICAiQXJncyB2YWxpZCBmb3IgSmF2YUVuY3J5cHRvci5k ZWNyeXB0KFNlY3JldEtleSxDaXBoZXJUZXh0KTogIiArCgkJCSAgIO+7vyAgICAgICAgICAgICAg Y2lwaGVydGV4dCk7CgoJ77u/ICAgICAgUGxhaW5UZXh0IHBsYWludGV4dCA9IG51bGw7Cgnvu78g ICAgICBib29sZWFuIGNhdWdodEV4Y2VwdGlvbiA9IGZhbHNlOwoJ77u/ICAgICAgaW50IHByb2dy ZXNzTWFyayA9IDA7Cgnvu78gICAgICB0cnkgewoJICAgIO+7vyAgICAgICAgICAvLyBGaXJzdCB3 ZSB2YWxpZGF0ZSB0aGUgTUFDLgoJCe+7vyAgICAgICAgICBib29sZWFuIHZhbGlkID0gQ3J5cHRv SGVscGVyLmlzQ2lwaGVyVGV4dE1BQ3ZhbGlkKGtleSwgY2lwaGVydGV4dCk7CgkgICAg77u/ICAg ICAgICAgIGlmICggIXZhbGlkICkgewoJCe+7vyAgICAgICAgICAgICAgdHJ5IHsKCQkgICAg77u/ ICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBnb2luZyB0byBmYWlsLCBidXQgd2Ugd2FudCB0 aGUgc2FtZSBwcm9jZXNzaW5nCgkJCe+7vyAgICAgICAgICAgICAgICAgIC8vIHRvIG9jY3VyIGFz IG11Y2ggYXMgcG9zc2libGUgc28gYXMgdG8gcHJldmVudCB0aW1pbmcKCQkJ77u/ICAgICAgICAg ICAgICAgICAgLy8gYXR0YWNrcy4gV2UgX2NvdWxkXyBqdXN0IGJlIHNhdGlzZmllZCBieSB0aGUg YWRkaXRpb25hbAoJCQnvu78gICAgICAgICAgICAgICAgICAvLyBzbGVlcCBpbiB0aGUgJ2ZpbmFs bHknIGNsYXVzZSwgYnV0IGFuIGF0dGFja2VyIG9uIHRoZQoJCQnvu78gICAgICAgICAgICAgICAg ICAvLyBzYW1lIHNlcnZlciB3aG8gY2FuIHJ1biBzb21ldGhpbmcgbGlrZSAncHMnIGNhbiB0ZWxs CgkJCe+7vyAgICAgICAgICAgICAgICAgIC8vIENQVSB0aW1lIHZlcnN1cyB3aGVuIHRoZSBwcm9j ZXNzIGlzIHNsZWVwaW5nLiBIZW5jZSB3ZQoJCQnvu78gICAgICAgICAgICAgICAgICAvLyB0cnkg dG8gbWFrZSB0aGlzIGFzIGNsb3NlIGFzIHBvc3NpYmxlLiBTaW5jZSB3ZSBrbm93CgkJCe+7vyAg ICAgICAgICAgICAgICAgIC8vIGl0IGlzIGdvaW5nIHRvIGZhaWwsIHdlIGlnbm9yZSB0aGUgcmVz dWx0IGFuZCBpZ25vcmUKCQkJ77u/ICAgICAgICAgICAgICAgICAgLy8gdGhlIChleHBlY3RlZCkg ZXhjZXB0aW9uLgoJCQnvu78gICAgICAgICAgICAgICAgICBoYW5kbGVEZWNyeXB0aW9uKGtleSwg Y2lwaGVydGV4dCk7IC8vIElnbm9yZSByZXR1cm4gKHNob3VsZCBmYWlsKS4KCQkgICAg77u/ICAg ICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgewoJCSAgICDvu78gICAgICAgICAgICAg ICAgICA7ICAgLy8gSWdub3JlCgkJICAgIO+7vyAgICAgICAgICAgICAgfQoJCe+7vyAgICAgICAg ICAgICAgdGhyb3cgbmV3IEVuY3J5cHRpb25FeGNlcHRpb24oREVDUllQVElPTl9GQUlMRUQsCgkJ CQkJCQkgICAg77u/ICAgICAgICAgICAgICAgICAgICAgICJEZWNyeXB0aW9uIGZhaWxlZCBiZWNh dXNlIE1BQyBpbnZhbGlkIGZvciAiICsKCQkJCQkJCSAgICDvu78gICAgICAgICAgICAgICAgICAg ICAgY2lwaGVydGV4dCk7CgkJ77u/ICAgICAgICAgIH0KCSAgICDvu78gICAgICAgICAgcHJvZ3Jl c3NNYXJrKys7CgkgICAg77u/ICAgICAgICAgIC8vIFRoZSBkZWNyeXB0aW9uIG9ubHkgY291bnRz IGlmIHRoZSBNQUMgd2FzIHZhbGlkLgoJCe+7vyAgICAgICAgICBwbGFpbnRleHQgPSBoYW5kbGVE ZWNyeXB0aW9uKGtleSwgY2lwaGVydGV4dCk7CgkgICAg77u/ICAgICAgICAgIHByb2dyZXNzTWFy aysrOwoJICAgIO+7vyAgICAgIH0gY2F0Y2goRW5jcnlwdGlvbkV4Y2VwdGlvbiBleCkgewoJICAg IO+7vyAgICAgICAgICBjYXVnaHRFeGNlcHRpb24gPSB0cnVlOwoJICAgIO+7vyAgICAgICAgICBT dHJpbmcgbG9nTXNnID0gbnVsbDsKCSAgICDvu78gICAgICAgICAgc3dpdGNoKCBwcm9ncmVzc01h cmsgKSB7CgkJ77u/ICAgICAgICAgIGNhc2UgMToKCQnvu78gICAgICAgICAgICAgIGxvZ01zZyA9 ICJEZWNyeXB0aW9uIGZhaWxlZCBiZWNhdXNlIE1BQyBpbnZhbGlkLiBTZWUgbG9nZ2VkIGV4Y2Vw dGlvbiBmb3IgZGV0YWlscy4iOwoJCe+7vyAgICAgICAgICAgICAgYnJlYWs7CgkJ77u/ICAgICAg ICAgIGNhc2UgMjoKCQnvu78gICAgICAgICAgICAgIGxvZ01zZyA9ICJEZWNyeXB0aW9uIGZhaWxl ZCBiZWNhdXNlIGhhbmRsZURlY3J5cHRpb24oKSBmYWlsZWQuIFNlZSBsb2dnZWQgZXhjZXB0aW9u IGZvciBkZXRhaWxzLiI7CgkJ77u/ICAgICAgICAgICAgICBicmVhazsKCQnvu78gICAgICAgICAg ZGVmYXVsdDoKCQnvu78gICAgICAgICAgICAgIGxvZ01zZyA9ICJQcm9ncmFtbWluZyBlcnJvcjog dW5leHBlY3RlZCBwcm9ncmVzcyBtYXJrID09ICIgKyBwcm9ncmVzc01hcms7CgkJ77u/ICAgICAg ICAgIGJyZWFrOwoJCe+7vyAgICAgICAgICB9CgkgICAg77u/ICAgICAgICAgIGxvZ2dlci5lcnJv cihMb2dnZXIuU0VDVVJJVFlfRkFJTFVSRSwgbG9nTXNnKTsKCSAgICDvu78gICAgICAgICAgdGhy b3cgZXg7ICAgICAgICAgICAvLyBSZS10aHJvdwoJICAgIO+7vyAgICAgIH0KCe+7vyAgICAgIGZp bmFsbHkgewoJICAgIO+7vyAgICAgICAgICBpZiAoIGNhdWdodEV4Y2VwdGlvbiApIHsKCQnvu78g ICAgICAgICAgICAgIC8vIFRoZSByZXN0IG9mIHRoaXMgY29kZSBpcyB0byB0cnkgdG8gYWNjb3Vu dCBmb3IgYW55IG1pbnV0ZSBkaWZmZXJlbmNlcwoJCSAgICDvu78gICAgICAgICAgICAgIC8vIGlu IHRoZSB0aW1lIGl0IG1pZ2h0IHRha2UgZm9yIHRoZSB2YXJpb3VzIHJlYXNvbnMgdGhhdCBkZWNy eXB0aW9uIGZhaWxzCgkJICAgIO+7vyAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gcHJldmVu dCBhbnkgb3RoZXIgcG9zc2libGUgdGltaW5nIGF0dGFja3MuIFBlcmhhcHMgaXQgaXMKCQkgICAg 77u/ICAgICAgICAgICAgICAvLyBnb2luZyBvdmVyYm9hcmQuIElmIG5vdGhpbmcgZWxzZSwgaWYg Tl9TRUNTIGlzIGxhcmdlIGVub3VnaCwgaXQgbWlnaHQKCQkgICAg77u/ICAgICAgICAgICAgICAv LyBkZXRlciBhdHRlbXB0ZWQgcmVwZWF0ZWQgYXR0YWNrcyBieSBtYWtpbmcgdGhlbSB0YWtlIG11 Y2ggbG9uZ2VyLgoJCSAgICDvu78gICAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLm5hbm9U aW1lKCk7CgkJ77u/ICAgICAgICAgICAgICBsb25nIGVsYXBzZWQgPSBub3cgLSBzdGFydDsKCQnv u78gICAgICAgICAgICAgIGZpbmFsIGxvbmcgTkFOT1NFQ1NfSU5fU0VDID0gMTAwMDAwMDAwMEw7 IC8vIG5hbm9zZWMgaXMgMTAqKi05IHNlYwoJCe+7vyAgICAgICAgICAgICAgbG9uZyBuU2VjcyA9 IE5fU0VDUyAqIE5BTk9TRUNTX0lOX1NFQzsgIC8vIE4gc2Vjb25kcyBpbiBuYW5vIHNlY29uZHMK CQnvu78gICAgICAgICAgICAgIGlmICggZWxhcHNlZCA8IG5TZWNzICkgewoJCSAgICDvu78gICAg ICAgICAgICAgICAgICAvLyBXYW50IHRvIHNsZWVwIHNvIHRvdGFsIHRpbWUgdGFrZW4gaXMgTiBz ZWNvbmRzLgoJCQnvu78gICAgICAgICAgICAgICAgICBsb25nIGV4dHJhU2xlZXAgPSBuU2VjcyAt IGVsYXBzZWQ7CgoJCSAgICDvu78gICAgICAgICAgICAgICAgICAvLyAnZXh0cmFTbGVlcCcgaXMg aW4gbmFub3NlY29uZHMuIE5lZWQgdG8gY29udmVydCB0byBhIG1pbGxpc2VjCgkJCe+7vyAgICAg ICAgICAgICAgICAgIC8vIHBhcnQgYW5kIG5hbm9zZWMgcGFydC4gTmFub3NlYyBpcyAxMCoqLTks IG1pbGxzZWMgaXMKCQkJ77u/ICAgICAgICAgICAgICAgICAgLy8gMTAqKi0zLCBzbyBkaXZpZGUg YnkgKDEwKiotOSAvIDEwKiotMyksIG9yIDEwKio2IHRvCgkJCe+7vyAgICAgICAgICAgICAgICAg IC8vIGNvbnZlcnQgdG8gZnJvbSBuYW5vc2Vjb25kcyB0byBtaWxsaXNlY29uZHMuCgkJCe+7vyAg ICAgICAgICAgICAgICAgIGxvbmcgbWlsbGlzID0gZXh0cmFTbGVlcCAvIDEwMDAwMDBMOwoJCSAg ICDvu78gICAgICAgICAgICAgICAgICBsb25nIG5hbm9zICA9IChleHRyYVNsZWVwIC0gKG1pbGxp cyAqIDEwMDAwMDBMKSk7CgkJICAgIO+7vyAgICAgICAgICAgICAgICAgIGFzc2VydCBuYW5vcyA+ PSAwICYmIG5hbm9zIDw9IEludGVnZXIuTUFYX1ZBTFVFIDoKCQkgICAgIk5hbm9zZWNzIG91dCBv ZiBib3VuZHM7IG5hbm9zID0gIiArIG5hbm9zOwoJCSAgICDvu78gICAgICAgICAgICAgICAgICB0 cnkgewoJCQnvu78gICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKG1pbGxpcywgKGlu dCluYW5vcyk7CgkJCe+7vyAgICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNl cHRpb24gZXgpIHsKCQkJ77u/ICAgICAgICAgICAgICAgICAgICAgIDsgICAvLyBJZ25vcmUKCQkJ 77u/ICAgICAgICAgICAgICAgICAgfQoJCSAgICDvu78gICAgICAgICAgICAgIH0gLy8gRWxzZSAu Li4gdGltZSBhbHJlYWR5IGV4Y2VlZHMgTl9TRUNTIHNlYywgc28gZG8gbm90IHNsZWVwLgoJCe+7 vyAgICAgICAgICB9CgkgICAg77u/ICAgICAgfQoJ77u/ICAgICAgcmV0dXJuIHBsYWludGV4dDsK Ce+7vyAgfQoKICAgIC8vIEhhbmRsZSB0aGUgYWN0dWFsIGRlY3J5cHRpb24gcG9ydGlvbi4gQXQg dGhpcyBwb2ludCBpdCBpcyBhc3N1bWVkIHRoYXQKICAgIC8vIGFueSBNQUMgaGFzIGFscmVhZHkg YmVlbiB2YWxpZGF0ZWQuIChCdXQgc2VlICJESVNDVVNTIiBpc3N1ZSwgYmVsb3cuKQogICAgcHJp dmF0ZSBQbGFpblRleHQgaGFuZGxlRGVjcnlwdGlvbihTZWNyZXRLZXkga2V5LCBDaXBoZXJUZXh0 IGNpcGhlcnRleHQpCgl0aHJvd3MgRW5jcnlwdGlvbkV4Y2VwdGlvbgogICAgewoJaW50IGtleVNp emUgPSAwOwoJdHJ5IHsKCSAgICBDaXBoZXIgZGVjcnlwdGVyID0gQ2lwaGVyLmdldEluc3RhbmNl KGNpcGhlcnRleHQuZ2V0Q2lwaGVyVHJhbnNmb3JtYXRpb24oKSk7CgkgICAga2V5U2l6ZSA9IGtl eS5nZXRFbmNvZGVkKCkubGVuZ3RoICogODsgIC8vIENvbnZlcnQgdG8gIyBiaXRzCgoJICAgIC8v IFVzaW5nIGNpcGhlciBtb2RlIHRoYXQgc3VwcG9ydHMgKmJvdGgqIGNvbmZpZGVudGlhbGl0eSAq YW5kKiBhdXRoZW50aWNpdHk/IElmIHNvLCB0aGVuCgkgICAgLy8gdXNlIHRoZSBzcGVjaWZpZWQg U2VjcmV0S2V5IGFzLWlzIHJhdGhlciB0aGFuIGNvbXB1dGluZyBhIGRlcml2ZWQga2V5IGZyb20g aXQuIFdlIGFsc28KCSAgICAvLyBkb24ndCBleHBlY3QgYSBzZXBhcmF0ZSBNQUMgaW4gdGhlIHNw ZWNpZmllZCBDaXBoZXJUZXh0IG9iamVjdCBzbyB0aGVyZWZvcmUgZG9uJ3QgdHJ5CgkgICAgLy8g dG8gdmFsaWRhdGUgaXQuCgkgICAgYm9vbGVhbiBwcmVmZXJyZWRDaXBoZXJNb2RlID0gQ3J5cHRv SGVscGVyLmlzQ29tYmluZWRDaXBoZXJNb2RlKCBjaXBoZXJ0ZXh0LmdldENpcGhlck1vZGUoKSAp OwoJICAgIFNlY3JldEtleSBlbmNLZXkgPSBudWxsOwoJICAgIGlmICggcHJlZmVycmVkQ2lwaGVy TW9kZSApIHsKCQllbmNLZXkgPSBrZXk7CgkgICAgfSBlbHNlIHsKCQkvLyBUT0RPOiBQRVJGT1JN QU5DRTogQ2FsY3VsYXRlIGF2ZyB0aW1lIHRoaXMgdGFrZXMgYW5kIGNvbnNpZGVyIGNhY2hpbmcg Zm9yIHZlcnkgc2hvcnQgaW50ZXJ2YWwKCQkvLyAgICAgICAoZS5nLiwgMiB0byA1IHNlYyB0b3Bz KS4gT3RoZXJ3aXNlIGRvaW5nIGxvdHMgb2YgZW5jcnlwdGlvbnMgaW4gYSBsb29wIGNvdWxkIHRh a2UgYSBMT1QgbG9uZ2VyLgoJCS8vICAgICAgIEJ1dCByZW1lbWJlciBKb24gQmVudGxleSdzICJS dWxlICMxIG9uIHBlcmZvcm1hbmNlOiBGaXJzdCBtYWtlIGl0IHJpZ2h0LCB0aGVuIG1ha2UgaXQg ZmFzdC4iCgkJ77u/ICAvL++7vyAg77u/ICAgVGhpcyB3b3VsZCBiZSBhIHNlY3VyaXR5IHRyYWRl LW9mZiBhcyBpdCB3b3VsZCBsZWF2ZSBrZXlzIGluIG1lbW9yeSBhIGJpdCBsb25nZXIsIHNvIGl0 CgkJICAgIO+7vyAgLy/vu78gIO+7vyAgIHNob3VsZCBwcm9iYWJseSBiZSBvZmYgYnkgZGVmYXVs dCBhbmQgY29udHJvbGxlZCB2aWEgYSBwcm9wZXJ0eS4KCQkgICAgZW5jS2V5ID0gY29tcHV0ZURl cml2ZWRLZXkoIGNpcGhlcnRleHQuZ2V0S0RGVmVyc2lvbigpLCBjaXBoZXJ0ZXh0LmdldEtERl9Q UkYoKSwKCQkJCQkJ77u/ICDvu78gICAgICAgICAgICAgICAgICAgICAga2V5LCBrZXlTaXplLCAi ZW5jcnlwdGlvbiIpOwoJICAgIH0KCSAgICBpZiAoIGNpcGhlcnRleHQucmVxdWlyZXNJVigpICkg ewoJCWRlY3J5cHRlci5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIGVuY0tleSwgbmV3IEl2UGFy YW1ldGVyU3BlYyhjaXBoZXJ0ZXh0LmdldElWKCkpKTsKCSAgICB9IGVsc2UgewoJCWRlY3J5cHRl ci5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIGVuY0tleSk7CgkgICAgfQoJICAgIGJ5dGVbXSBv dXRwdXQgPSBkZWNyeXB0ZXIuZG9GaW5hbChjaXBoZXJ0ZXh0LmdldFJhd0NpcGhlclRleHQoKSk7 CgkgICAgcmV0dXJuIG5ldyBQbGFpblRleHQob3V0cHV0KTsKCgl9IGNhdGNoIChJbnZhbGlkS2V5 RXhjZXB0aW9uIGlrZSkgewoJICAgIHRocm93IG5ldyBFbmNyeXB0aW9uRXhjZXB0aW9uKERFQ1JZ UFRJT05fRkFJTEVELCAiTXVzdCBpbnN0YWxsIEpDRSBVbmxpbWl0ZWQgU3RyZW5ndGggSnVyaXNk aWN0aW9uIFBvbGljeSBGaWxlcyBmcm9tIFN1biIsIGlrZSk7Cgl9IGNhdGNoIChOb1N1Y2hBbGdv cml0aG1FeGNlcHRpb24gZSkgewoJICAgIHRocm93IG5ldyBFbmNyeXB0aW9uRXhjZXB0aW9uKERF Q1JZUFRJT05fRkFJTEVELCAiSW52YWxpZCBhbGdvcml0aG0gZm9yIGF2YWlsYWJsZSBKQ0UgcHJv dmlkZXJzIC0gIiArCgkJCQkJICBjaXBoZXJ0ZXh0LmdldENpcGhlclRyYW5zZm9ybWF0aW9uKCkg KyAiOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwoJfSBjYXRjaCAoTm9TdWNoUGFkZGluZ0V4Y2Vw dGlvbiBlKSB7CgkgICAgdGhyb3cgbmV3IEVuY3J5cHRpb25FeGNlcHRpb24oREVDUllQVElPTl9G QUlMRUQsICJJbnZhbGlkIHBhZGRpbmcgc2NoZW1lICgiICsKCQkJCQkgIGNpcGhlcnRleHQuZ2V0 UGFkZGluZ1NjaGVtZSgpICsgIikgZm9yIGNpcGhlciB0cmFuc2Zvcm1hdGlvbiAiICsgY2lwaGVy dGV4dC5nZXRDaXBoZXJUcmFuc2Zvcm1hdGlvbigpICsKCQkJCQkgICI6ICIgKyBlLmdldE1lc3Nh Z2UoKSwgZSk7Cgl9IGNhdGNoIChJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uIGUp IHsKCSAgICB0aHJvdyBuZXcgRW5jcnlwdGlvbkV4Y2VwdGlvbihERUNSWVBUSU9OX0ZBSUxFRCwg IkRlY3J5cHRpb24gcHJvYmxlbTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKCX0gY2F0Y2ggKEls bGVnYWxCbG9ja1NpemVFeGNlcHRpb24gZSkgewoJICAgIHRocm93IG5ldyBFbmNyeXB0aW9uRXhj ZXB0aW9uKERFQ1JZUFRJT05fRkFJTEVELCAiRGVjcnlwdGlvbiBwcm9ibGVtOiAiICsgZS5nZXRN ZXNzYWdlKCksIGUpOwoJfSBjYXRjaCAoQmFkUGFkZGluZ0V4Y2VwdGlvbiBlKSB7CgkgICAgLy9E SVNDVVNTOiBUaGlzIG5lZWRzIGZpeGVkLiBBbHJlYWR5IHZhbGlkYXRlZCBNQUMgaW4gQ3J5cHRv SGVscGVyLmlzQ2lwaGVyVGV4dE1BQ3ZhbGlkKCkgYWJvdmUuCgkgICAgLy9TbyBvbmx5IHdheSB3 ZSBjb3VsZCBnZXQgYSBwYWRkaW5nIGV4Y2VwdGlvbiBpcyBpZiBpbnZhbGlkIHBhZGRpbmcgd2Vy ZSB1c2VkIG9yaWdpbmFsbHkgYnkKCSAgICAvL3RoZSBwYXJ0eSBkb2luZyB0aGUgZW5jcnlwdGlv bi4gKFRoaXMgbWlnaHQgaGFwcGVuIHdpdGggYSBidWdneSBwYWRkaW5nIHNjaGVtZSBmb3IgaW5z dGFuY2UuKQoJICAgIC8vSXQgKnNlZW1zKiBoYXJtbGVzcyB0aG91Z2gsIHNvIHdpbGwgbGVhdmUg aXQgZm9yIG5vdywgYW5kIHRlY2huaWNhbGx5LCB3ZSBuZWVkIHRvIGVpdGhlciBjYXRjaCBpdAoJ ICAgIC8vb3IgZGVjbGFyZSBpdCBpbiBhIHRocm93cyBjbGFzcy4gQ2xlYXJseSB3ZSBkb24ndCB3 YW50IHRvIGRvIHRoZSBsYXRlci4gVGhpcyBzaG91bGQgYmUgZGlzY3Vzc2VkCgkgICAgLy9kdXJp bmcgYSBjb2RlIGluc3BlY3Rpb24uCgkgICAgU2VjcmV0S2V5IGF1dGhLZXk7CgkgICAgdHJ5IHsK CQlhdXRoS2V5ID0gY29tcHV0ZURlcml2ZWRLZXkoIGNpcGhlcnRleHQuZ2V0S0RGVmVyc2lvbigp LCBjaXBoZXJ0ZXh0LmdldEtERl9QUkYoKSwKCQkJCQkgICAgIO+7vyAg77u/ICAgICAgICAgICAg ICAgICAgICAgICBrZXksIGtleVNpemUsICJhdXRoZW50aWNpdHkiKTsKCSAgICB9IGNhdGNoIChF eGNlcHRpb24gZTEpIHsKCQl0aHJvdyBuZXcgRW5jcnlwdGlvbkV4Y2VwdGlvbihERUNSWVBUSU9O X0ZBSUxFRCwKCQkJCQkgICAgICAiRGVjcnlwdGlvbiBwcm9ibGVtIC0tIGZhaWxlZCB0byBjb21w dXRlIGRlcml2ZWQga2V5IGZvciBhdXRoZW50aWNpdHk6ICIgKyBlMS5nZXRNZXNzYWdlKCksIGUx KTsKCSAgICB9CgkgICAgYm9vbGVhbiBzdWNjZXNzID0gY2lwaGVydGV4dC52YWxpZGF0ZU1BQygg YXV0aEtleSApOwoJICAgIGlmICggc3VjY2VzcyApIHsKCQl0aHJvdyBuZXcgRW5jcnlwdGlvbkV4 Y2VwdGlvbihERUNSWVBUSU9OX0ZBSUxFRCwgIkRlY3J5cHRpb24gcHJvYmxlbTogIiArIGUuZ2V0 TWVzc2FnZSgpLCBlKTsKCSAgICB9IGVsc2UgewoJCXRocm93IG5ldyBFbmNyeXB0aW9uRXhjZXB0 aW9uKERFQ1JZUFRJT05fRkFJTEVELAoJCQkJCSAgICAgICJEZWNyeXB0aW9uIHByb2JsZW06IFdB Uk5JTkc6IEFkdmVyc2FyeSBtYXkgaGF2ZSB0YW1wZXJlZCB3aXRoICIgKwoJCQkJCSAgICAgICJD aXBoZXJUZXh0IG9iamVjdCBvckNpcGhlclRleHQgb2JqZWN0IG1hbmdsZWQgaW4gdHJhbnNpdDog IiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKCSAgICB9Cgl9CiAgICB9CiAgICDvu78gIAoJ77u/ICAv KioKCSAgICAg77u/ICAqIHtAaW5oZXJpdERvY30KCSAgICAg77u/ICAqLwoJ77u/ICBwdWJsaWMg U3RyaW5nIHNpZ24oU3RyaW5nIGRhdGEpIHRocm93cyBFbmNyeXB0aW9uRXhjZXB0aW9uIHsKCe+7 vyAg77u/ICB0cnkgewoJICAgIO+7vyAg77u/ICDvu78gIFNpZ25hdHVyZSBzaWduZXIgPSBTaWdu YXR1cmUuZ2V0SW5zdGFuY2Uoc2lnbmF0dXJlQWxnb3JpdGhtKTsKCSAgICDvu78gIO+7vyAg77u/ ICBzaWduZXIuaW5pdFNpZ24ocHJpdmF0ZUtleSk7CgkgICAg77u/ICDvu78gIO+7vyAgc2lnbmVy LnVwZGF0ZShkYXRhLmdldEJ5dGVzKGVuY29kaW5nKSk7CgkgICAg77u/ICDvu78gIO+7vyAgYnl0 ZVtdIGJ5dGVzID0gc2lnbmVyLnNpZ24oKTsKCSAgICDvu78gIO+7vyAg77u/ICByZXR1cm4gRVNB UEkuZW5jb2RlcigpLmVuY29kZUZvckJhc2U2NChieXRlcywgZmFsc2UpOwoJICAgIO+7vyAg77u/ ICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGlrZSkgewoJICAgIO+7vyAg77u/ICDvu78g IHRocm93IG5ldyBFbmNyeXB0aW9uRXhjZXB0aW9uKCJFbmNyeXB0aW9uIGZhaWx1cmUiLCAiTXVz dCBpbnN0YWxsIHVubGltaXRlZCBzdHJlbmd0aCBjcnlwdG8gZXh0ZW5zaW9uIGZyb20gU3VuIiwg aWtlKTsKCSAgICDvu78gIO+7vyAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCSAgICDvu78gIO+7 vyAg77u/ICB0aHJvdyBuZXcgRW5jcnlwdGlvbkV4Y2VwdGlvbigiU2lnbmF0dXJlIGZhaWx1cmUi LCAiQ2FuJ3QgZmluZCBzaWduYXR1cmUgYWxnb3JpdGhtICIgKyBzaWduYXR1cmVBbGdvcml0aG0s IGUpOwoJICAgIO+7vyAg77u/ICB9Cgnvu78gIH0KICAgIO+7vyAg77u/ICAKCe+7vyAgLyoqCgkg ICAgIO+7vyAgKiB7QGluaGVyaXREb2N9CgkgICAgIO+7vyAgKi8KCe+7vyAgcHVibGljIGJvb2xl YW4gdmVyaWZ5U2lnbmF0dXJlKFN0cmluZyBzaWduYXR1cmUsIFN0cmluZyBkYXRhKSB7Cgnvu78g IO+7vyAgdHJ5IHsKCSAgICDvu78gIO+7vyAg77u/ICBieXRlW10gYnl0ZXMgPSBFU0FQSS5lbmNv ZGVyKCkuZGVjb2RlRnJvbUJhc2U2NChzaWduYXR1cmUpOwoJICAgIO+7vyAg77u/ICDvu78gIFNp Z25hdHVyZSBzaWduZXIgPSBTaWduYXR1cmUuZ2V0SW5zdGFuY2Uoc2lnbmF0dXJlQWxnb3JpdGht KTsKCSAgICDvu78gIO+7vyAg77u/ICBzaWduZXIuaW5pdFZlcmlmeShwdWJsaWNLZXkpOwoJICAg IO+7vyAg77u/ICDvu78gIHNpZ25lci51cGRhdGUoZGF0YS5nZXRCeXRlcyhlbmNvZGluZykpOwoJ ICAgIO+7vyAg77u/ICDvu78gIHJldHVybiBzaWduZXIudmVyaWZ5KGJ5dGVzKTsKCSAgICDvu78g IO+7vyAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCSAgICDvu78gIO+7vyAgICAgIC8vIE5PVEU6 IEVuY3J5cHRpb25FeGNlcHRpb24gY29uc3RydWN0ZWQgKm9ubHkqIGZvciBzaWRlLWVmZmVjdCBv ZiBjYXVzaW5nIGxvZ2dpbmcuCgkJ77u/ICDvu78gICAgICAvLyBGaW5kQnVncyBjb21wbGFpbnMg YWJvdXQgdGhpcyBhbmQgc2luY2UgaXQgZXhhbWluZXMgYnl0ZS1jb2RlLCB0aGVyZSdzIG5vIHdh eSB0bwoJCe+7vyAg77u/ICAgICAgLy8gc2h1dCBpdCB1cC4KCQnvu78gIO+7vyAg77u/ICBuZXcg RW5jcnlwdGlvbkV4Y2VwdGlvbigiSW52YWxpZCBzaWduYXR1cmUiLCAiUHJvYmxlbSB2ZXJpZnlp bmcgc2lnbmF0dXJlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwoJICAgIO+7vyAg77u/ICDvu78g IHJldHVybiBmYWxzZTsKCSAgICDvu78gIO+7vyAgfQoJ77u/ICB9CgogICAg77u/ICAvKioKCSDv u78gICoge0Bpbmhlcml0RG9jfQoJICoKCSAqIEBwYXJhbSBleHBpcmF0aW9uCgkgKiBAdGhyb3dz IEludGVncml0eUV4Y2VwdGlvbgoJICovCgnvu78gIHB1YmxpYyBTdHJpbmcgc2VhbChTdHJpbmcg ZGF0YSwgbG9uZyBleHBpcmF0aW9uKSB0aHJvd3MgSW50ZWdyaXR5RXhjZXB0aW9uIHsKCe+7vyAg ICAgIGlmICggZGF0YSA9PSBudWxsICkgewoJICAgIO+7vyAgICAgICAgICB0aHJvdyBuZXcgSWxs ZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEYXRhIHRvIGJlIHNlYWxlZCBtYXkgbm90IGJlIG51bGwu Iik7CgkgICAg77u/ICAgICAgfQoJ77u/ICAgICAgCgkgICAg77u/ICDvu78gIHRyeSB7CgkgICAg 77u/ICDvu78gICAgICBTdHJpbmcgYjY0ZGF0YSA9IG51bGw7CgkgICAgdHJ5IHsKCQliNjRkYXRh ID0gRVNBUEkuZW5jb2RlcigpLmVuY29kZUZvckJhc2U2NChkYXRhLmdldEJ5dGVzKCJVVEYtOCIp LCBmYWxzZSk7CgkgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7 CgkJOyAvLyBJZ25vcmU7IHNob3VsZCBuZXZlciBoYXBwZW4gc2luY2UgVVRGLTggYnVpbHQgaW50 byBydC5qYXIKCSAgICB9CgkgICAg77u/ICDvu78gIO+7vyAgLy8gbWl4IGluIHNvbWUgcmFuZG9t IGRhdGEgc28gZXZlbiBpZGVudGljYWwgZGF0YSBhbmQgdGltZXN0YW1wIHByb2R1Y2VzIGRpZmZl cmVudCBzZWFscwoJCe+7vyAg77u/ICDvu78gIFN0cmluZyBub25jZSA9IEVTQVBJLnJhbmRvbWl6 ZXIoKS5nZXRSYW5kb21TdHJpbmcoMTAsIEVuY29kZXJDb25zdGFudHMuQ0hBUl9BTFBIQU5VTUVS SUNTKTsKCSAgICDvu78gIO+7vyAg77u/ICBTdHJpbmcgcGxhaW50ZXh0ID0gZXhwaXJhdGlvbiAr ICI6IiArIG5vbmNlICsgIjoiICsgYjY0ZGF0YTsKCSAgICDvu78gIO+7vyAg77u/ICAvLyBhZGQg aW50ZWdyaXR5IGNoZWNrOyBzaWduYXR1cmUgaXMgYWxyZWFkeSBiYXNlNjQgZW5jb2RlZC4KCQnv u78gIO+7vyAg77u/ICBTdHJpbmcgc2lnID0gdGhpcy5zaWduKCBwbGFpbnRleHQgKTsKCSAgICDv u78gIO+7vyAg77u/ICBDaXBoZXJUZXh0IGNpcGhlcnRleHQgPSB0aGlzLmVuY3J5cHQoIG5ldyBQ bGFpblRleHQocGxhaW50ZXh0ICsgIjoiICsgc2lnKSApOwoJICAgIO+7vyAg77u/ICDvu78gIFN0 cmluZyBzZWFsZWREYXRhID0gRVNBUEkuZW5jb2RlcigpLmVuY29kZUZvckJhc2U2NChjaXBoZXJ0 ZXh0LmFzUG9ydGFibGVTZXJpYWxpemVkQnl0ZUFycmF5KCksIGZhbHNlKTsKCSAgICDvu78gIO+7 vyAg77u/ICByZXR1cm4gc2VhbGVkRGF0YTsKCSAgICDvu78gIO+7vyAgfSBjYXRjaCggRW5jcnlw dGlvbkV4Y2VwdGlvbiBlICkgewoJICAgIO+7vyAg77u/ICDvu78gIHRocm93IG5ldyBJbnRlZ3Jp dHlFeGNlcHRpb24oIGUuZ2V0VXNlck1lc3NhZ2UoKSwgZS5nZXRMb2dNZXNzYWdlKCksIGUgKTsK CSAgICDvu78gIO+7vyAgfQoJ77u/ICB9CgogICAg77u/ICAvKioKCSDvu78gICoge0Bpbmhlcml0 RG9jfQoJIO+7vyAgKi8KCe+7vyAgcHVibGljIFN0cmluZyB1bnNlYWwoU3RyaW5nIHNlYWwpIHRo cm93cyBFbmNyeXB0aW9uRXhjZXB0aW9uIHsKCe+7vyAg77u/ICBQbGFpblRleHQgcGxhaW50ZXh0 ID0gbnVsbDsKCe+7vyAg77u/ICB0cnkgewoJICAgIO+7vyAg77u/ICAgICAgYnl0ZVtdIGVuY3J5 cHRlZEJ5dGVzID0gRVNBUEkuZW5jb2RlcigpLmRlY29kZUZyb21CYXNlNjQoc2VhbCk7CgkgICAg 77u/ICDvu78gICAgICBDaXBoZXJUZXh0IGNpcGhlclRleHQgPSBudWxsOwoJICAgIO+7vyAg77u/ ICAgICAgdHJ5IHsKCQnvu78gIO+7vyAgICAgICAgICBjaXBoZXJUZXh0ID0gQ2lwaGVyVGV4dC5m cm9tUG9ydGFibGVTZXJpYWxpemVkQnl0ZXMoZW5jcnlwdGVkQnl0ZXMpOwoJCe+7vyAg77u/ICAg ICAgfSBjYXRjaCggQXNzZXJ0aW9uRXJyb3IgZSkgewoJCe+7vyAgICAgICAgICAgICAgLy8gU29t ZSBvZiB0aGUgdGVzdHMgaW4gRW5jcnlwdG9yVGVzdC50ZXN0VmVyaWZ5U2VhbCgpIGFyZSBleGFt cGxlcyBvZgoJCSAgICDvu78gIO+7vyAgICAgICAgICAvLyB0aGlzIGlmIGFzc2VydGlvbnMgYXJl IGVuYWJsZWQuCgkJICAgIO+7vyAg77u/ICAgICAgICAgIHRocm93IG5ldyBFbmNyeXB0aW9uRXhj ZXB0aW9uKCJJbnZhbGlkIHNlYWwiLAoJCQkJCQkJICAgICAg77u/ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VhbCBwYXNzZWQgZ2FyYmFyZ2UgZGF0YSByZXN1 bHRpbmcgaW4gQXNzZXJ0aW9uRXJyb3I6ICIgKyBlKTsKCQnvu78gICAgICAgICAgfQoJICAgIO+7 vyAg77u/ICDvu78gIHBsYWludGV4dCA9IHRoaXMuZGVjcnlwdChjaXBoZXJUZXh0KTsKCgkgICAg 77u/ICDvu78gIO+7vyAgU3RyaW5nW10gcGFydHMgPSBwbGFpbnRleHQudG9TdHJpbmcoKS5zcGxp dCgiOiIpOwoJICAgIO+7vyAg77u/ICDvu78gIGlmIChwYXJ0cy5sZW5ndGggIT0gNCkgewoJCe+7 vyAg77u/ICDvu78gIO+7vyAgdGhyb3cgbmV3IEVuY3J5cHRpb25FeGNlcHRpb24oIkludmFsaWQg c2VhbCIsICJTZWFsIHdhcyBub3QgZm9ybWF0dGVkIHByb3Blcmx5LiIpOwoJCe+7vyAg77u/ICDv u78gIH0KCSAgICDvu78gIAoJCe+7vyAg77u/ICDvu78gIFN0cmluZyB0aW1lc3RyaW5nID0gcGFy dHNbMF07CgkgICAg77u/ICDvu78gIO+7vyAgbG9uZyBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUo KTsKCSAgICDvu78gIO+7vyAg77u/ICBsb25nIGV4cGlyYXRpb24gPSBMb25nLnBhcnNlTG9uZyh0 aW1lc3RyaW5nKTsKCSAgICDvu78gIO+7vyAg77u/ICBpZiAobm93ID4gZXhwaXJhdGlvbikgewoJ Ce+7vyAg77u/ICDvu78gIO+7vyAgdGhyb3cgbmV3IEVuY3J5cHRpb25FeGNlcHRpb24oIkludmFs aWQgc2VhbCIsICJTZWFsIGV4cGlyYXRpb24gZGF0ZSBvZiAiICsgbmV3IERhdGUoZXhwaXJhdGlv bikgKyAiIGhhcyBwYXN0LiIpOwoJCe+7vyAg77u/ICDvu78gIH0KCSAgICDvu78gIO+7vyAg77u/ ICBTdHJpbmcgbm9uY2UgPSBwYXJ0c1sxXTsKCSAgICDvu78gIO+7vyAg77u/ICBTdHJpbmcgYjY0 ZGF0YSA9IHBhcnRzWzJdOwoJICAgIO+7vyAg77u/ICDvu78gIFN0cmluZyBzaWcgPSBwYXJ0c1sz XTsKCSAgICDvu78gIO+7vyAg77u/ICBpZiAoIXRoaXMudmVyaWZ5U2lnbmF0dXJlKHNpZywgdGlt ZXN0cmluZyArICI6IiArIG5vbmNlICsgIjoiICsgYjY0ZGF0YSApICkgewoJCe+7vyAg77u/ICDv u78gIO+7vyAgdGhyb3cgbmV3IEVuY3J5cHRpb25FeGNlcHRpb24oIkludmFsaWQgc2VhbCIsICJT ZWFsIGludGVncml0eSBjaGVjayBmYWlsZWQiKTsKCQnvu78gIO+7vyAg77u/ICB977u/ICAKCQkJ ICAg77u/ICDvu78gIO+7vyAgcmV0dXJuIG5ldyBTdHJpbmcoRVNBUEkuZW5jb2RlcigpLmRlY29k ZUZyb21CYXNlNjQoYjY0ZGF0YSksICJVVEYtOCIpOwoJICAgIO+7vyAg77u/ICB9IGNhdGNoIChF bmNyeXB0aW9uRXhjZXB0aW9uIGUpIHsKCSAgICDvu78gIO+7vyAg77u/ICB0aHJvdyBlOwoJICAg IO+7vyAg77u/ICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJICAgIO+7vyAg77u/ICDvu78gIHRo cm93IG5ldyBFbmNyeXB0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIHNlYWwiLCAiSW52YWxpZCBzZWFs OiIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CgkgICAg77u/ICDvu78gIH0KCe+7vyAgfQoKICAgIO+7 vyAgCgnvu78gIC8qKgoJICAgICDvu78gICoge0Bpbmhlcml0RG9jfQoJICAgICDvu78gICovCgnv u78gIHB1YmxpYyBib29sZWFuIHZlcmlmeVNlYWwoIFN0cmluZyBzZWFsICkgewoJ77u/ICDvu78g IHRyeSB7CgkgICAg77u/ICDvu78gIO+7vyAgdW5zZWFsKCBzZWFsICk7CgkgICAg77u/ICDvu78g IO+7vyAgcmV0dXJuIHRydWU7CgkgICAg77u/ICDvu78gIH0gY2F0Y2goIEVuY3J5cHRpb25FeGNl cHRpb24gZSApIHsKCSAgICDvu78gIO+7vyAg77u/ICByZXR1cm4gZmFsc2U7CgkgICAg77u/ICDv u78gIH0KCe+7vyAgfQogICAg77u/ICAKCe+7vyAgLyoqCgkgICAgIO+7vyAgKiB7QGluaGVyaXRE b2N9CgkgICAgIO+7vyAgKi8KCe+7vyAgcHVibGljIGxvbmcgZ2V0VGltZVN0YW1wKCkgewoJ77u/ ICDvu78gIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKCe+7vyAgfQoKICAgIO+7vyAgLyoq Cgkg77u/ICAqIHtAaW5oZXJpdERvY30KCSDvu78gICovCgnvu78gIHB1YmxpYyBsb25nIGdldFJl bGF0aXZlVGltZVN0YW1wKCBsb25nIG9mZnNldCApIHsKCe+7vyAg77u/ICByZXR1cm4gbmV3IERh dGUoKS5nZXRUaW1lKCkgKyBvZmZzZXQ7Cgnvu78gIH0KCiAgICDvu78gIC8vIERJU0NVU1M6IFdo eSBleHBlcmltZW50YWw/IFdvdWxkIGhhdmUgdG8gYmUgYWRkZWQgdG8gRW5jcnlwdG9yIGludGVy ZmFjZQoJ77u/ICAvL++7vyAg77u/ICDvu78gIGJ1dCBvbmx5IDMgdGhpbmdzIEkgc2F3IHdyb25n IHdpdGggdGhpcyB3YXMgMSkgaXQgdXNlZCBITWFjTUQ1IGluc3RlYWQKCe+7vyAgLy/vu78gIO+7 vyAg77u/ICBvZiBITWFjU0hBMSAoc2VlIGRpc2N1c3Npb24gYmVsb3cpLCAyKSB0aGF0IHRoZSBI TWFjIGtleSBpcyB0aGUKCe+7vyAgLy/vu78gIO+7vyAg77u/ICBzYW1lIG9uZSB1c2VkIGZvciBl bmNyeXB0aW9uIChhbHNvIHNlZSBjb21tZW50cyksIGFuZCAzKSBpdCBjYXVnaHQKCe+7vyAgLy/v u78gIO+7vyAg77u/ICBvdmVybHkgYnJvYWQgZXhjZXB0aW9ucy4gSGVyZSBpdCBpcyB3aXRoIHRo ZXNlIHNwZWNpZmljIGFyZWFzCgnvu78gIC8v77u/ICDvu78gIO+7vyAgYWRkcmVzc2VkLCBidXQg bm8gdW5pdCB0ZXN0aW5nIGhhcyBiZWVuIGRvbmUgYXQgdGhpcyBwb2ludC4gLWt3dwogICAgLyoq CiAgICAgKiBDb21wdXRlIGFuIEhNQUMgZm9yIGEgU3RyaW5nLiAgRXhwZXJpbWVudGFsLgogICAg ICogQHBhcmFtIGlucHV077u/ICBUaGUgaW5wdXQgZm9yIHdoaWNoIHRvIGNvbXB1dGUgdGhlIEhN YWMuCiAgICAgKi8KICAgIC8qKioqKioqKioqKioqKioqKioqKgog77u/ICBwdWJsaWMgU3RyaW5n IGNvbXB1dGVITUFDKCBTdHJpbmcgaW5wdXQgKSB0aHJvd3MgRW5jcnlwdGlvbkV4Y2VwdGlvbiB7 CiDvu78gIO+7vyAgdHJ5IHsKIO+7vyAg77u/ICDvu78gIE1hYyBobWFjID0gTWFjLmdldEluc3Rh bmNlKCJITWFjU0hBMSIpOyAvLyBESVNDVVNTOiBDaGFuZ2VkIHRvIEhNYWNTSEExLiBNRDUgKmJh ZGx5KiBicm9rZW4KIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78g IO+7vyAg77u/ICDvu78gICAgIC8vICAgICAgICAgIFNIQTEgc2hvdWxkIHJlYWxseSBiZSBhdm9p ZGVkLCBidXQgdXNpbmcKIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDv u78gIO+7vyAg77u/ICDvu78gICAgIC8v77u/ICDvu78gICAgIGZvciBITUFDLVNIQTEgaXMgYWNj ZXB0YWJsZSBmb3Igbm93LiBQbGFuCiDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78g IO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICAgICAvL++7vyAg77u/ICAgICB0byBtaWdyYXRlIHRv IFNIQS0yNTYgb3IgTklTVCByZXBsYWNlbWVudCBmb3IKIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gICAgIC8v77u/ICDvu78gICAgIFNI QTEgaW4gbm90IHRvbyBkaXN0YW50IGZ1dHVyZS4KIO+7vyAg77u/ICDvu78gIC8vIERJU0NVU1M6 IEFsc28gbm90IHJlY29tbWVuZGVkIHRoYXQgdGhlIEhNYWMga2V5IGlzIHRoZSBzYW1lIGFzIHRo ZSBvbmUKIO+7vyAg77u/ICDvu78gIC8v77u/ICDvu78gIO+7vyAgdXNlZCBmb3IgZW5jcnlwdGlv biAobmFtZWx5LCBFbmNyeXB0b3IuTWFzdGVyS2V5KS4gSWYgYW55dGhpbmcgaXQKIO+7vyAg77u/ ICDvu78gIC8v77u/ICDvu78gIO+7vyAgd291bGQgYmUgYmV0dGVyIHRvIHVzZSBFbmNyeXB0b3Iu TWFzdGVyU2FsdCBmb3IgdGhlIEhNYWMga2V5LCBvcgog77u/ICDvu78gIO+7vyAgLy/vu78gIO+7 vyAg77u/ICBwZXJoYXBzIGEgZGVyaXZlZCBrZXkgYmFzZWQgb24gdGhlIG1hc3RlciBzYWx0LiAo T25lIGNvdWxkIHVzZQog77u/ICDvu78gIO+7vyAgLy/vu78gIO+7vyAg77u/ICBLZXlEZXJpdmF0 aW9uRnVuY3Rpb24uY29tcHV0ZURlcml2ZWRLZXkoKS4pCiDvu78gIO+7vyAg77u/ICAvLwog77u/ ICDvu78gIO+7vyAgYnl0ZVtdIHNhbHQgPSBFU0FQSS5zZWN1cml0eUNvbmZpZ3VyYXRpb24oKS5n ZXRNYXN0ZXJTYWx0KCk7CiDvu78gIO+7vyAg77u/ICBobWFjLmluaXQoIG5ldyBTZWNyZXRLZXlT cGVjKHNhbHQsICJITWFjU0hBMSIpICk777u/ICAvLyBXYXM677u/ICBobWFjLmluaXQoc2VjcmV0 S2V5U3BlYynvu78gIAog77u/ICDvu78gIO+7vyAgYnl0ZVtdIGluQnl0ZXM7CiDvu78gIO+7vyAg 77u/ICB0cnkgewog77u/ICDvu78gIO+7vyAg77u/ICBpbkJ5dGVzID0gaW5wdXQuZ2V0Qnl0ZXMo IlVURi04Iik7CiDvu78gIO+7vyAg77u/ICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhj ZXB0aW9uIGUpIHsKIO+7vyAg77u/ICDvu78gIO+7vyAgbG9nZ2VyLndhcm5pbmcoTG9nZ2VyLlNF Q1VSSVRZX0ZBSUxVUkUsICJjb21wdXRlSE1BQygpOiBDYW4ndCBmaW5kIFVURi04IGVuY29kaW5n OyB1c2luZyBkZWZhdWx0IGVuY29kaW5nIiwgZSk7CiDvu78gIO+7vyAg77u/ICDvu78gIGluQnl0 ZXMgPSBpbnB1dC5nZXRCeXRlcygpOwog77u/ICDvu78gIO+7vyAgfQog77u/ICDvu78gIO+7vyAg Ynl0ZVtdIGJ5dGVzID0gaG1hYy5kb0ZpbmFsKCBpbkJ5dGVzICk7CiDvu78gIO+7vyAg77u/ICBy ZXR1cm4gRVNBUEkuZW5jb2RlcigpLmVuY29kZUZvckJhc2U2NChieXRlcywgZmFsc2UpOwog77u/ ICDvu78gIH0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gaWtlKSB7CiDvu78gIO+7vyAg77u/ ICB0aHJvdyBuZXcgRW5jcnlwdGlvbkV4Y2VwdGlvbigiRW5jcnlwdGlvbiBmYWlsdXJlIiwgIk11 c3QgaW5zdGFsbCB1bmxpbWl0ZWQgc3RyZW5ndGggY3J5cHRvIGV4dGVuc2lvbiBmcm9tIFN1biIs IGlrZSk7CiDvu78gICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgewog 77u/ICAgICAg77u/ICB0aHJvdyBuZXcgRW5jcnlwdGlvbkV4Y2VwdGlvbigiQ291bGQgbm90IGNv bXB1dGUgSE1BQyIsICJDYW4ndCBmaW5kIEhNYWNTSEExIGFsZ29yaXRobS4gIiArCiDvu78gICAg ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg 77u/ICDvu78gIO+7vyAg77u/ICAiUHJvYmxlbSBjb21wdXRpbmcgSE1BQyBmb3IgIiArIGlucHV0 LCBlICk7CiDvu78gICAgICB9CiDvu78gIH0KICAgICoqKioqKioqKioqKioqKioqKioqLwoKICAg IC8qKgogICAgICogTG9nIGEgc2VjdXJpdHkgd2FybmluZyBldmVyeSBOdGggdGltZSBvbmUgb2Yg dGhlIGRlcHJlY2F0ZWQgZW5jcnlwdCBvcgogICAgICogZGVjcnlwdCBtZXRob2RzIGFyZSBjYWxs ZWQuICgnTicgaXMgaGFyZC1jb2RlZCB0byBiZSAyNSBieSBkZWZhdWx0LCBidXQKICAgICAqIG1h eSBiZSBjaGFuZ2VkIHZpYSB0aGUgc3lzdGVtIHByb3BlcnR5CiAgICAgKiB7QGNvZGUgRVNBUEku RW5jcnlwdG9yLndhcm5FdmVyeU50aFVzZX0uKSBJbiBvdGhlciB3b3Jkcywgd2UgbmFnCiAgICAg KiB0aGVtIHVudGlsIHRoZSBnaXZlIGluIGFuZCBjaGFuZ2UgaXQuIDstKQogICAgICoKICAgICAq IEBwYXJhbSB3aGVyZSBUaGUgc3RyaW5nICJlbmNyeXB0IiBvciAiZGVjcnlwdCIsIGNvcnJlc3Bv bmRpbmcgdG8gdGhlCiAgICAgKiAgICAgICAgICAgICAgbWV0aG9kIHRoYXQgaXMgYmVpbmcgbG9n Z2VkLgogICAgICogQHBhcmFtIG1zZyAgIFRoZSBtZXNzYWdlIHRvIGxvZy4KICAgICAqLwoJcHJp dmF0ZSB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIHdoZXJlLCBTdHJpbmcgbXNnKSB7CglpbnQgY291 bnRlciA9IDA7CglpZiAoIHdoZXJlLmVxdWFscygiZW5jcnlwdCIpICkgewoJICAgIGNvdW50ZXIg PSBlbmNyeXB0Q291bnRlcisrOwoJICAgIHdoZXJlID0gIkphdmFFbmNyeXB0b3IuZW5jcnlwdCgp OiBbY291bnQ9IiArIGNvdW50ZXIgKyJdIjsKCX0gZWxzZSBpZiAoIHdoZXJlLmVxdWFscygiZGVj cnlwdCIpICkgewoJICAgIGNvdW50ZXIgPSBkZWNyeXB0Q291bnRlcisrOwoJICAgIHdoZXJlID0g IkphdmFFbmNyeXB0b3IuZGVjcnlwdCgpOiBbY291bnQ9IiArIGNvdW50ZXIgKyJdIjsKCX0gZWxz ZSB7CgkgICAgd2hlcmUgPSAiSmF2YUVuY3J5cHRvcjogVW5rbm93biBtZXRob2Q6ICI7Cgl9Cgkv LyBXZSBsb2cgdGhlIHZlcnkgZmlyc3QgdGltZSAobm90ZSB0aGUgdXNlIG9mIHBvc3QtaW5jcmVt ZW50IG9uIHRoZQoJLy8gY291bnRlcnMpIGFuZCB0aGVuIGV2ZXJ5IE50aCB0aW1lIHRoZXJlYWZ0 ZXIuIExvZ2dpbmcgZXZlcnkgc2luZ2xlCgkvLyB0aW1lIGlzIGxpa2VseSB0byBiZSB3YXkgdG9v IG11Y2ggbG9nZ2luZy4KCWlmICggKGNvdW50ZXIgJSBsb2dFdmVyeU50aFVzZSkgPT0gMCApIHsK CSAgICBsb2dnZXIud2FybmluZyhMb2dnZXIuU0VDVVJJVFlfRkFJTFVSRSwgd2hlcmUgKyBtc2cp OwoJfQogICAgfQoKICAgIHByaXZhdGUgS2V5RGVyaXZhdGlvbkZ1bmN0aW9uLlBSRl9BTEdPUklU SE1TIGdldFBSRihTdHJpbmcgbmFtZSkgeyAgICDvu78gIAoJICAgIO+7vyAg77u/ICBTdHJpbmcg cHJmTmFtZSA9IG51bGw7Cgnvu78gIO+7vyAgaWYgKCBuYW1lID09IG51bGwgKSB7CgkgICAg77u/ ICDvu78gIO+7vyAgcHJmTmFtZSA9IEVTQVBJLnNlY3VyaXR5Q29uZmlndXJhdGlvbigpLmdldEtE RlBzZXVkb1JhbmRvbUZ1bmN0aW9uKCk7CgkgICAg77u/ICDvu78gIH0gZWxzZSB7CgkgICAg77u/ ICDvu78gIO+7vyAgcHJmTmFtZSA9IG5hbWU7CgkgICAg77u/ICDvu78gIH0KCe+7vyAg77u/ICBL ZXlEZXJpdmF0aW9uRnVuY3Rpb24uUFJGX0FMR09SSVRITVMgcHJmID0gS2V5RGVyaXZhdGlvbkZ1 bmN0aW9uLmNvbnZlcnROYW1lVG9QUkYocHJmTmFtZSk7Cgnvu78gIO+7vyAgcmV0dXJuIHByZjsK ICAgIH0KCiAgICBwcml2YXRlIEtleURlcml2YXRpb25GdW5jdGlvbi5QUkZfQUxHT1JJVEhNUyBn ZXREZWZhdWx0UFJGKCkgewoJ77u/ICDvu78gIFN0cmluZyBwcmZOYW1lID0gRVNBUEkuc2VjdXJp dHlDb25maWd1cmF0aW9uKCkuZ2V0S0RGUHNldWRvUmFuZG9tRnVuY3Rpb24oKTsKCe+7vyAg77u/ ICByZXR1cm4gZ2V0UFJGKHByZk5hbWUpOwogICAgfQoKICAgIC8vIFByaXZhdGUgaW50ZXJmYWNl IHRvIGNhbGwgRVNBUEkncyBLREYgdG8gZ2V0IGtleSBmb3IgZW5jcnlwdGlvbiBvciBhdXRoZW50 aWNpdHkuCiAgICBwcml2YXRlIFNlY3JldEtleSBjb21wdXRlRGVyaXZlZEtleShpbnQga2RmVmVy c2lvbiwgS2V5RGVyaXZhdGlvbkZ1bmN0aW9uLlBSRl9BTEdPUklUSE1TIHByZiwKCQkJCQnvu78g IO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICDvu78gIO+7vyAg77u/ICBTZWNyZXRLZXkga2RrLCBp bnQga2V5U2l6ZSwgU3RyaW5nIHB1cnBvc2UpCgnvu78gIHRocm93cyBOb1N1Y2hBbGdvcml0aG1F eGNlcHRpb24sIEludmFsaWRLZXlFeGNlcHRpb24sIEVuY3J5cHRpb25FeGNlcHRpb24KICAgIHsK Ce+7vyAgLy8gVGhlc2UgcmVhbGx5IHNob3VsZCBiZSB0dXJuZWQgaW50byBhY3R1YWwgcnVudGlt ZSBjaGVja3MgYW5kIGFuCgkgICAg77u/ICAvLyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc2hv dWxkIGJlIHRocm93biBpZiB0aGV5IGFyZSB2aW9sYXRlZC4KCSAgICDvu78gIC8vIEJ1dCB0aGlz IHNob3VsZCBiZSBPSyBzaW5jZSB0aGlzIGlzIGEgcHJpdmF0ZSBtZXRob2QuIEFsc28sIHRoaXMg bWV0aG9kIHdpbGwKCSAgICDvu78gIC8vIGJlIGNhbGxlZCBxdWl0ZSBvZnRlbiBzbyBhc3NlcnRp b25zIGFyZSBhIGJpZyB3aW4gYXMgdGhleSBjYW4gYmUgZGlzYWJsZWQgb3IKCSAgICDvu78gIC8v IGVuYWJsZWQgYXQgd2lsbC4KCSAgICDvu78gIGFzc2VydCBwcmYgIT0gbnVsbCA6ICJQc2V1ZG8g UmFuZG9tIEZ1bmN0aW9uIGZvciBLREYgY2Fubm90IGJlIG51bGwiOwoJ77u/ICBhc3NlcnQga2Rr ICE9IG51bGwgOiAiS2V5IGRlcml2YXRpb24ga2V5IGNhbm5vdCBiZSBudWxsLiI7Cgnvu78gIC8v IFdlIHdvdWxkIGNob29zZSBhIGxhcmdlciBtaW5pbXVtIGtleSBzaXplLCBidXQgd2Ugd2FudCB0 byBiZQoJICAgIO+7vyAgLy8gYWJsZSB0byBhY2NlcHQgREVTIGZvciBsZWdhY3kgZW5jcnlwdGlv biBuZWVkcy4gTklTVCBzYXlzIDExMi1iaXRzIGlzIG1pbi4gSWYgbGVzcyB0aGFuIHRoYXQsCgkg ICAg77u/ICAvLyB3ZSBwcmludCB3YXJuaW5nLgoJICAgIO+7vyAgYXNzZXJ0IGtleVNpemUgPj0g NTYgOiAiS2V5IGhhcyBzaXplIG9mICIgKyBrZXlTaXplICsgIiwgd2hpY2ggaXMgbGVzcyB0aGFu IG1pbmltdW0gb2YgNTYtYml0cy4iOwoJ77u/ICBhc3NlcnQgKGtleVNpemUgJSA4KSA9PSAwIDog IktleSBzaXplICgiICsga2V5U2l6ZSArICIpIG11c3QgYmUgYSBldmVuIG11bHRpcGxlIG9mIDgt Yml0cy4iOwoJ77u/ICBhc3NlcnQgcHVycG9zZSAhPSBudWxsIDogIlB1cnBvc2UgY2Fubm90IGJl IG51bGwuIFNob3VsZCBiZSAnZW5jcnlwdGlvbicgb3IgJ2F1dGhlbnRpY2l0eScuIjsKCe+7vyAg YXNzZXJ0IHB1cnBvc2UuZXF1YWxzKCJlbmNyeXB0aW9uIikgfHwgcHVycG9zZS5lcXVhbHMoImF1 dGhlbnRpY2l0eSIpIDoKCe+7vyAg77u/ICAiUHVycG9zZSBtdXN0IGJlIFwiZW5jcnlwdGlvblwi IG9yIFwiYXV0aGVudGljaXR5XCIuIjsKCgnvu78gIEtleURlcml2YXRpb25GdW5jdGlvbiBrZGYg PSBuZXcgS2V5RGVyaXZhdGlvbkZ1bmN0aW9uKHByZik7Cgnvu78gIGlmICgga2RmVmVyc2lvbiAh PSAwICkgewoJICAgIO+7vyAg77u/ICBrZGYuc2V0VmVyc2lvbihrZGZWZXJzaW9uKTsKCSAgICDv u78gIH0KCe+7vyAgcmV0dXJuIGtkZi5jb21wdXRlRGVyaXZlZEtleShrZGssIGtleVNpemUsIHB1 cnBvc2UpOwogICAgfQoKICAgIC8vIEdldCBhbGwgdGhlIGFsZ29yaXRobXMgd2Ugd2lsbCBiZSB1 c2luZyBmcm9tIEVTQVBJLnByb3BlcnRpZXMuCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldHVw QWxnb3JpdGhtcygpIHsKCS8vIHNldHVwIGFsZ29yaXRobXMKCWVuY3J5cHRBbGdvcml0aG0gPSBF U0FQSS5zZWN1cml0eUNvbmZpZ3VyYXRpb24oKS5nZXRFbmNyeXB0aW9uQWxnb3JpdGhtKCk7Cglz aWduYXR1cmVBbGdvcml0aG0gPSBFU0FQSS5zZWN1cml0eUNvbmZpZ3VyYXRpb24oKS5nZXREaWdp dGFsU2lnbmF0dXJlQWxnb3JpdGhtKCk7CglyYW5kb21BbGdvcml0aG0gPSBFU0FQSS5zZWN1cml0 eUNvbmZpZ3VyYXRpb24oKS5nZXRSYW5kb21BbGdvcml0aG0oKTsKCWhhc2hBbGdvcml0aG0gPSBF U0FQSS5zZWN1cml0eUNvbmZpZ3VyYXRpb24oKS5nZXRIYXNoQWxnb3JpdGhtKCk7CgloYXNoSXRl cmF0aW9ucyA9IEVTQVBJLnNlY3VyaXR5Q29uZmlndXJhdGlvbigpLmdldEhhc2hJdGVyYXRpb25z KCk7CgllbmNvZGluZyA9IEVTQVBJLnNlY3VyaXR5Q29uZmlndXJhdGlvbigpLmdldENoYXJhY3Rl ckVuY29kaW5nKCk7CgllbmNyeXB0aW9uS2V5TGVuZ3RoID0gRVNBUEkuc2VjdXJpdHlDb25maWd1 cmF0aW9uKCkuZ2V0RW5jcnlwdGlvbktleUxlbmd0aCgpOwoJc2lnbmF0dXJlS2V5TGVuZ3RoID0g RVNBUEkuc2VjdXJpdHlDb25maWd1cmF0aW9uKCkuZ2V0RGlnaXRhbFNpZ25hdHVyZUtleUxlbmd0 aCgpOwogICAgfQoKICAgIC8vIFNldCB1cCBzaWduaW5nIGtleSBwYWlyIHVzaW5nIHRoZSBtYXN0 ZXIgcGFzc3dvcmQgYW5kIHNhbHQuIENhbGxlZCAob25jZSkKICAgIC8vIGZyb20gdGhlIEphdmFF bmNyeXB0b3IgQ1RPUi4KICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5pdEtleVBhaXIoU2VjdXJl UmFuZG9tIHBybmcpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewoJU3RyaW5nIHNp Z0FsZyA9IHNpZ25hdHVyZUFsZ29yaXRobS50b0xvd2VyQ2FzZSgpOwoJaWYgKCBzaWdBbGcuZW5k c1dpdGgoIndpdGhkc2EiKSApIHsKCSAgICAvLwoJICAgIC8vIEFkbWl0dGVkbHksIHRoaXMgaXMg YSBrbHVkZ2UuIEhvd2V2ZXIgZm9yIFN1biBKQ0UsIGV2ZW4gdGhvdWdoCgkgICAgLy8gIlNIQTF3 aXRoRFNBIiBpcyBhIHZhbGlkIHNpZ25hdHVyZSBhbGdvcml0aG0gbmFtZSwgaWYgb25lIGNhbGxz CgkgICAgLy8gICAgICBLZXlQYWlyR2VuZXJhdG9yIGtwZyA9IEtleVBhaXJHZW5lcmF0b3IuZ2V0 SW5zdGFuY2UoIlNIQTF3aXRoRFNBIik7CgkgICAgLy8gdGhhdCB3aWxsIHRocm93IGEgTm9TdWNo QWxnb3JpdGhtRXhjZXB0aW9uIHdpdGggYW4gZXhjZXB0aW9uCgkgICAgLy8gbWVzc2FnZSBvZiAi U0hBMXdpdGhEU0EgS2V5UGFpckdlbmVyYXRvciBub3QgYXZhaWxhYmxlIi4gU2luY2UKCSAgICAv LyBTSEExd2l0aERTQSBhbmQgRFNBIGtleXMgc2hvdWxkIGJlIGlkZW50aWNhbCwgd2UgdXNlICJE U0EiCgkgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCBTSEExd2l0aERTQSBvciBTSEF3aXRoRFNBIHdh cyBzcGVjaWZpZWQuIFRoaXMgaXMKCSAgICAvLyBhbGwganVzdCB0byBtYWtlIHRoZXNlIDIgd29y ayBhcyBleHBlY3RlZC4gU2lnaC4gKE5vdGU6CgkgICAgLy8gdGhpcyB3YXMgdGVzdGVkIHdpdGgg SkRLIDEuNi4wXzIxLCBidXQgbGlrZWx5IGZhaWxzIHdpdGggZWFybGllcgoJICAgIC8vIHZlcnNp b25zIG9mIHRoZSBKREsgYXMgd2VsbC4pCgkgICAgLy8KCSAgICBzaWdBbGcgPSAiRFNBIjsKCX0g ZWxzZSBpZiAoIHNpZ0FsZy5lbmRzV2l0aCgid2l0aHJzYSIpICkgewoJICAgIC8vIERpdHRvIGZv ciBSU0EuCgkgICAgc2lnQWxnID0gIlJTQSI7Cgl9CglLZXlQYWlyR2VuZXJhdG9yIGtleUdlbiA9 IEtleVBhaXJHZW5lcmF0b3IuZ2V0SW5zdGFuY2Uoc2lnQWxnKTsKCWtleUdlbi5pbml0aWFsaXpl KHNpZ25hdHVyZUtleUxlbmd0aCwgcHJuZyk7CglLZXlQYWlyIHBhaXIgPSBrZXlHZW4uZ2VuZXJh dGVLZXlQYWlyKCk7Cglwcml2YXRlS2V5ID0gcGFpci5nZXRQcml2YXRlKCk7CglwdWJsaWNLZXkg PSBwYWlyLmdldFB1YmxpYygpOwogICAgfQp9Cgo= --bcaec5485cf871279404af367d27 Content-Type: text/x-c++src; charset=UTF-8; name="efbbbf-strip.cpp" Content-Disposition: attachment; filename="efbbbf-strip.cpp" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gtqdod1f1 Ly8gZysrIC1nIC1PMiBlZmJiYmYtc3RyaXAuY3BwIC1vIGVmYmJiZi1zdHJpcC5leGUKCiNpbmNs dWRlIDxpb3N0cmVhbT4KdXNpbmcgc3RkOjpjb3V0Owp1c2luZyBzdGQ6OmNlcnI7CnVzaW5nIHN0 ZDo6ZW5kbDsKdXNpbmcgc3RkOjppb3NfYmFzZTsKCiNpbmNsdWRlIDxmc3RyZWFtPgp1c2luZyBz dGQ6Omlmc3RyZWFtOwp1c2luZyBzdGQ6Om9mc3RyZWFtOwoKI2luY2x1ZGUgPHN0cmluZz4KdXNp bmcgc3RkOjpzdHJpbmc7CgojaW5jbHVkZSA8Y3N0cmluZz4KdXNpbmcgc3RkOjpzdHJsZW47Cgpz dGF0aWMgY29uc3Qgc3RyaW5nIEVGQkJCRiA9IHN0cmluZygiXHhlZlx4YmJceGJmIik7CnN0YXRp YyBjb25zdCB1bnNpZ25lZCBpbnQgRUZCQkJGX0xFTiA9IDM7Cgpib29sIFN0cmlwKGNvbnN0IGNo YXIqIGZpbGVuYW1lKTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCnsKICBpZihh cmdjID09IDEpCiAgewogICAgY2VyciA8PCAiU3RyaXBzIHRleHQgZmlsZXMgb2YgVVRGLTggYnl0 ZSBvcmRlciBtYXJrcyAoQk9NKSBpbiBwbGFjZS4iIDw8IGVuZGw7CiAgICBjZXJyIDw8ICIgIFVz YWdlOiBlZmJiYmYtc3RyaXAuZXhlIDx0ZXh0IGZpbGU+IFs8dGV4dCBmaWxlPiDigKZdIiA8PCBl bmRsOwogICAgcmV0dXJuIDE7CiAgfQoKICBmb3IodW5zaWduZWQgaW50IGkgPSAxOyBpIDwgKHVu c2lnbmVkIGludClhcmdjOyBpKyspCiAgewogICAgU3RyaXAoYXJndltpXSk7CiAgfQp9Cgpib29s IFN0cmlwKGNvbnN0IGNoYXIqIGZpbGVuYW1lKQp7CiAgaWYgKCAhZmlsZW5hbWUgfHwgMCA9PSBz dHJsZW4oZmlsZW5hbWUpICkKICAgIHJldHVybiBmYWxzZTsKCiAgLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogIC8vIFJlYWQgdGhlIGZp bGUKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vCgogIGlmc3RyZWFtIGlmaWxlKGZpbGVuYW1lKTsKICBpZiggIWlmaWxlLmdvb2QoKSAp CiAgewogICAgY2VyciA8PCAiVW5hYmxlIHRvIG9wZW4gIiA8PCBmaWxlbmFtZSA8PCAiIGZvciBy ZWFkaW5nIiA8PCBlbmRsOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICAKICAvLyBSZXNlcnZlIHNp emUgdG8gc2F2ZSBvbiBhbGxvY2F0aW9ucwogIGlmaWxlLnNlZWtnKDAsIGlvc19iYXNlOjplbmQp OwogIGlmKCAhaWZpbGUuZ29vZCgpICkKICB7CiAgICBjZXJyIDw8ICJGYWlsZWQgdG8gc2VlayB0 byBlbmQgb2YgIiA8PCBmaWxlbmFtZSA8PCBlbmRsOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAg c2l6ZV90IGZzaXplID0gaWZpbGUudGVsbGcoKTsKICBpZiggIWlmaWxlLmdvb2QoKSApCiAgewog ICAgY2VyciA8PCAiRmFpbGVkIHRvIGRldGVybWluZSBzaXplIG9mICIgPDwgZmlsZW5hbWUgPDwg ZW5kbDsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGlmaWxlLnNlZWtnKDAsIGlvc19iYXNlOjpi ZWcpOwogIGlmKCAhaWZpbGUuZ29vZCgpICkKICB7CiAgICBjZXJyIDw8ICJGYWlsZWQgdG8gc2Vl ayB0byBiZWdpbm5pbmcgb2YgIiA8PCBmaWxlbmFtZSA8PCBlbmRsOwogICAgcmV0dXJuIGZhbHNl OwogIH0KCiAgc3RyaW5nIHN0ciwgbGluZTsKICBzdHIucmVzZXJ2ZShmc2l6ZSk7CgogIC8vIFJl YWQgdGhlIGZpbGUgbGluZSBieSBsaW5lLiBOb3Qgc3VyZSB3aHkgcmVhZGluZyBpbiBvbmUgZmVs bCBzd29vcCBmYWlsZWQuLi4uCiAgd2hpbGUoc3RkOjpnZXRsaW5lKGlmaWxlLCBsaW5lKSkKICB7 CiAgICBzdHIgKz0gbGluZTsKICAgIHN0ciArPSAiXG4iOwoKICAgIGlmKCAhaWZpbGUuZ29vZCgp ICkKICAgICAgYnJlYWs7CiAgfQoKICBpZmlsZS5jbG9zZSgpOwoKICAvLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8gRml4IHRoZSBm aWxlCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLwoKICBzaXplX3QgY291bnQgPSAwOwogIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IDE7 CiAgd2hpbGUoIChwb3MgPSBzdHIuZmluZChFRkJCQkYsIHBvcykpICE9IHN0cmluZzo6bnBvcyAp CiAgewogICAgIHN0ci5yZXBsYWNlKHBvcywgRUZCQkJGX0xFTiwgIiIpOwogICAgIGNvdW50Kys7 CiAgfQoKICBpZigwID09IGNvdW50KQogIHsKICAgIGNvdXQgPDwgZmlsZW5hbWUgPDwgIjogbm8g cmVwbGFjZW1lbnRzIiA8PCBlbmRsOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8gV3Jp dGUgdGhlIGZpbGUKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vCgogIG9mc3RyZWFtIG9maWxlKGZpbGVuYW1lLCBpb3NfYmFzZTo6b3V0 IHwgaW9zX2Jhc2U6OnRydW5jKTsKICBpZiggIW9maWxlLmdvb2QoKSApCiAgewogICAgY2VyciA8 PCAiVW5hYmxlIHRvIG9wZW4gIiA8PCBmaWxlbmFtZSA8PCAiIGZvciB3cml0aW5nIiA8PCBlbmRs OwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgb2ZpbGUud3JpdGUoc3RyLmRhdGEoKSwgc3RyLnNp emUoKSk7CiAgaWYoICFvZmlsZS5nb29kKCkgKQogIHsKICAgIGNlcnIgPDwgIkZhaWxlZCB0byB3 cml0ZSAiIDw8IGZpbGVuYW1lIDw8IGVuZGw7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBvZmls ZS5jbG9zZSgpOwoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vCiAgLy8gQm9vayBrZWVwaW5nCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICBjb3V0IDw8IGZpbGVuYW1l IDw8ICI6ICIgPDwgY291bnQgPDwgIiByZXBsYWNlbWVudHMiIDw8IGVuZGw7CiAgcmV0dXJuIHRy dWU7Cn0KCg== --bcaec5485cf871279404af367d27--