From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS4713 221.184.0.0/13 X-Spam-Status: No, score=-2.6 required=3.0 tests=BAYES_00,BODY_8BITS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from neon.ruby-lang.org (neon.ruby-lang.org [221.186.184.75]) by dcvr.yhbt.net (Postfix) with ESMTP id 6709220248 for ; Wed, 27 Feb 2019 22:27:04 +0000 (UTC) Received: from neon.ruby-lang.org (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id D3ED0121EBD; Thu, 28 Feb 2019 07:26:56 +0900 (JST) Received: from o1678916x28.outbound-mail.sendgrid.net (o1678916x28.outbound-mail.sendgrid.net [167.89.16.28]) by neon.ruby-lang.org (Postfix) with ESMTPS id 85A64121EBC for ; Thu, 28 Feb 2019 07:26:51 +0900 (JST) Received: by filter0130p3las1.sendgrid.net with SMTP id filter0130p3las1-8188-5C770EAA-8 2019-02-27 22:26:50.136421948 +0000 UTC m=+317162.576819583 Received: from herokuapp.com (ec2-54-91-101-91.compute-1.amazonaws.com [54.91.101.91]) by ismtpd0046p1iad1.sendgrid.net (SG) with ESMTP id Gb4GfxahQpCEJhTahtoukA for ; Wed, 27 Feb 2019 22:26:49.986 +0000 (UTC) Date: Wed, 27 Feb 2019 22:26:50 +0000 (UTC) From: tenderlove@ruby-lang.org To: ruby-core@ruby-lang.org Message-ID: References: Mime-Version: 1.0 X-Redmine-MailingListIntegration-Message-Ids: 67085 X-Redmine-Project: ruby-trunk X-Redmine-Issue-Id: 15626 X-Redmine-Issue-Author: tenderlovemaking X-Redmine-Sender: tenderlovemaking X-Mailer: Redmine X-Redmine-Host: bugs.ruby-lang.org X-Redmine-Site: Ruby Issue Tracking System X-Auto-Response-Suppress: All Auto-Submitted: auto-generated X-SG-EID: ync6xU2WACa70kv/Ymy4QrNMhiuLXJG8OTL2vJD1yS6MpkCKx3rf8O9CDTEWJZSMDPGvAXg8vAf2EM woz1nzRx95jQmglygIyxAkpDv9C9LOzeTkib/fKwShFVzkEqifcRcadrrTjx7kQnqSpANiB9uS4jCX cP90mT0yqr9vR7g3t7UJbp+/YqWfwh1+DqRvFARumPvYmZ9/syHYNd8iJw== X-ML-Name: ruby-core X-Mail-Count: 91635 Subject: [ruby-core:91635] [Ruby trunk Feature#15626] Manual Compaction for MRI's GC (`GC.compact`) X-BeenThere: ruby-core@ruby-lang.org X-Mailman-Version: 2.1.15 Precedence: list Reply-To: Ruby developers List-Id: Ruby developers List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: ruby-core-bounces@ruby-lang.org Sender: "ruby-core" SXNzdWUgIzE1NjI2IGhhcyBiZWVuIHVwZGF0ZWQgYnkgdGVuZGVybG92ZW1ha2luZyAoQWFyb24g UGF0dGVyc29uKS4NCg0KRmlsZSBhZnRlcl9jb21wYWN0LTEucG5nIGFkZGVkDQpGaWxlIGJlZm9y ZV9jb21wYWN0LTEucG5nIGFkZGVkDQpGaWxlIGFmdGVyX2NvbXBhY3QtMC5wbmcgYWRkZWQNCkZp bGUgYmVmb3JlX2NvbXBhY3QtMC5wbmcgYWRkZWQNCg0KSSd2ZSB0ZXN0ZWQgdGhlIGNvbXBhY3Rv ciB3aXRoIGEgUmFpbHMgYXBwbGljYXRpb24sIGFuZCBJIHdhbnQgdG8gc2hhcmUgbXkgcmVzdWx0 cy4NCg0KSSBhZGRlZCB0aGUgbWlkZGxld2FyZSBiZWxvdzoNCg0KYGBgcnVieQ0KIyBUaGlzIGZp bGUgaXMgdXNlZCBieSBSYWNrLWJhc2VkIHNlcnZlcnMgdG8gc3RhcnQgdGhlIGFwcGxpY2F0aW9u Lg0KDQpyZXF1aXJlX3JlbGF0aXZlICdjb25maWcvZW52aXJvbm1lbnQnDQpyZXF1aXJlICdvYmpz cGFjZScNCg0KJENPVU5UID0gMA0KY2xhc3MgQ29tcGFjdEhlYXANCiAgZGVmIGluaXRpYWxpemUg YXBwDQogICAgQGFwcCA9IGFwcA0KICBlbmQNCg0KICBkZWYgY2FsbCBlbnYNCiAgICB4ID0gQGFw cC5jYWxsIGVudg0KICAgIEdDLnN0YXJ0DQogICAgRmlsZS5vcGVuKCJiZWZvcmVfY29tcGFjdC0j eyRDT1VOVH0udHh0IiwgJ3cnKSBkbyB8ZnwNCiAgICAgIE9iamVjdFNwYWNlLmR1bXBfYWxsKG91 dHB1dDogZikNCiAgICBlbmQNCiAgICBHQy5jb21wYWN0DQogICAgRmlsZS5vcGVuKCJhZnRlcl9j b21wYWN0LSN7JENPVU5UfS50eHQiLCAndycpIGRvIHxmfA0KICAgICAgT2JqZWN0U3BhY2UuZHVt cF9hbGwob3V0cHV0OiBmKQ0KICAgIGVuZA0KICAgICRDT1VOVCArPSAxDQogICAgeA0KICBlbmQN CmVuZA0KDQp1c2UgQ29tcGFjdEhlYXANCnJ1biBSYWlscy5hcHBsaWNhdGlvbg0KYGBgDQoNClRo ZSBhYm92ZSBtaWRkbGV3YXJlIHdpbGw6DQoNCjEuIFJ1biB0aGUgd2ViIHJlcXVlc3QNCjIuIFJ1 biB0aGUgR0MNCjMuIER1bXAgdGhlIGhlYXANCjQuIENvbXBhY3QgdGhlIGhlYXANCjUuIER1bXAg dGhlIGhlYXANCg0KVGhpcyBnaXZlcyB1cyBhbiBpZGVhIHdoYXQgdGhlIGhlYXAgbG9va3MgbGlr ZSBhZnRlciBhIHJlcXVlc3QsIGJ1dCBiZWZvcmUgYW5kIGFmdGVyIGNvbXBhY3Rpb24uDQpJJ3Zl IGF0dGFjaGVkIHZpc3VhbGl6YXRpb25zIG9mIHRoZSBoZWFwIGZvciB0d28gcmVxdWVzdHMuICBF YWNoIHZpc3VhbGl6YXRpb24NCmlzIGEgUE5HIGZpbGUgdGhhdCByZXByZXNlbnRzIHRoZSBoZWFw LiAgRWFjaCBjb2x1bW4gb2YgdGhlIGltYWdlIHJlcHJlc2VudHMgYQ0KcGFnZSBpbiB0aGUgaGVh cC4gIENvbHVtbnMgYXJlIHR3byBwaXhlbHMgd2lkZS4gIEVhY2ggc3F1YXJlIGluIHRoZSBjb2x1 bW4NCnJlcHJlc2VudHMgYSBzbG90LiAgU2xvdHMgYXJlIDJweCBieSAycHggc3F1YXJlcy4gIFJl ZCBzcXVhcmVzIGFyZSBzbG90cyB0aGF0DQpoYXZlIGFuIHVubW92YWJsZSAocGlubmVkKSBvYmpl Y3QuICBCbGFjayBzcXVhcmVzIGFyZSBzbG90cyB0aGF0IGhhdmUgYSBtb3ZlYWJsZQ0Kb2JqZWN0 LiAgT3RoZXIgc3F1YXJlcyBhcmUgZW1wdHkgc2xvdHMuDQoNClRoZSBmaXJzdCBpbWFnZSAiYmVm b3JlLWNvbXBhY3QtMC5wbmciIGlzIGJlZm9yZSBhIGNvbXBhY3Rpb24gaGFzIGV2ZXINCm9jY3Vy cmVkLiAgWW91IGNhbiBzZWUgdGhlcmUgYXJlIG1hbnkgdW5maWxsZWQgcGFnZXMuICBPZiB0aGUg NTgyIHBhZ2VzLCA5OCBhcmUNCmZ1bGwsIGFuZCA0ODQgaGF2ZSBlbXB0eSBzbG90cy4gIEFmdGVy IGNvbXBhY3Rpb24gImFmdGVyLWNvbXBhY3QtMC5wbmciLCB0aGVyZQ0KYXJlIDU3NiBwYWdlcywg NDExIGZ1bGwsIGFuZCAxNjUgaGF2ZSBlbXB0eSBzbG90cy4NCg0KU3Vic2VxdWVudCByZXF1ZXN0 cyBoYXZlIHNpbWlsYXIgbG9va2luZyBoZWFwcyB0byAiYWZ0ZXItY29tcGFjdC0wIiAoYXMgZXhw ZWN0ZWQpLg0KDQpUaGUgcHJvZ3JhbSBJIHVzZWQgdG8gZ2VuZXJhdGUgdGhlc2UgdmlzdWFsaXph dGlvbnMgY2FuIGJlIGZvdW5kIGhlcmU6DQoNCiAgaHR0cHM6Ly9naXN0LmdpdGh1YnVzZXJjb250 ZW50LmNvbS90ZW5kZXJsb3ZlLzU3OGNmYjRjZTY3NzQ2NWQwYThjZWI0MzYyOTI4YTg5L3Jhdy80 MTc5OGRiNTUxNTRiMjM1MDU5ZjE0MTRhOGJiMThjZDk1NWQxYWNlL2hlYXB2aXoucmINCg0KSSds bCBwdWJsaXNoIHRoZSBSYWlscyBhcHBsaWNhdGlvbiBJIHVzZWQgdG8gZ2VuZXJhdGUgdGhlc2Ug Z3JhcGhzIGFuZCBhZGQgYSBsaW5rIGhlcmUuIDopDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0NCkZlYXR1cmUgIzE1NjI2OiBNYW51YWwgQ29tcGFjdGlvbiBmb3Ig TVJJJ3MgR0MgKGBHQy5jb21wYWN0YCkNCmh0dHBzOi8vYnVncy5ydWJ5LWxhbmcub3JnL2lzc3Vl cy8xNTYyNiNjaGFuZ2UtNzY4OTYNCg0KKiBBdXRob3I6IHRlbmRlcmxvdmVtYWtpbmcgKEFhcm9u IFBhdHRlcnNvbikNCiogU3RhdHVzOiBPcGVuDQoqIFByaW9yaXR5OiBOb3JtYWwNCiogQXNzaWdu ZWU6IA0KKiBUYXJnZXQgdmVyc2lvbjogDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tDQpIaSwNCg0KSSd2ZSBhdHRhY2hlZCBhIHBhdGNoIHRoYXQgaW1wbGVtZW50cyBh IGNvbXBhY3RvciBmb3IgTVJJLiAgSSdsbCB0cnkgdG8gZGVzY3JpYmUgdGhlIHBhdGNoIGluIGRl dGFpbCBiZWxvdywgYnV0IHRoZSBiaWdnZXN0IHVzZXIgZmFjaW5nIGNoYW5nZXMgYXJlOg0KDQox LiBBIG5ldyBtZXRob2QgYEdDLmNvbXBhY3RgIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tIFJ1YnkN CjIuIEMgZXh0ZW5zaW9ucyBoYXZlIGEgbmV3ICJhZnRlciBjb21wYWN0aW9uIiBjYWxsYmFjayB0 aGV5IGNhbiByZWdpc3Rlcg0KMy4gSW50cm9kdWN0aW9uIG9mIG5ldyBtYXJraW5nIGZ1bmN0aW9u cyB0aGF0IGFsbG93IG9iamVjdHMgdG8gYmUgbWFya2VkLCBidXQgbm90ICJwaW5uZWQiIHRvIHRo ZSBzYW1lIGxvY2F0aW9uDQo0LiBBIGZ1bmN0aW9uIHRvIGdldCB0aGUgbmV3IGxvY2F0aW9uIG9m IGFuIG9iamVjdCAodG8gYmUgdXNlZCBmcm9tIHRoZSAiYWZ0ZXIgY29tcGFjdGlvbiIgY2FsbGJh Y2spDQoNCiMgQ29tcGFjdG9yIGZvciBSR2VuR0MNCg0KVGhpcyBkb2N1bWVudCBkZXNjcmliZXMg dGhlIGNvbXBhY3RvciBpbXBsZW1lbnRhdGlvbiBmb3IgUkdlbkdDLiAgVGhpcyBwYXRjaA0KYWRk cyBhIG5ldyBtZXRob2QgdG8gUnVieSwgYEdDLmNvbXBhY3RgIHdoaWNoIHdpbGwgY29tcGFjdCB0 aGUgb2JqZWN0cyBpbiB0aGUNCmhlYXAuICBXaGF0IGZvbGxvd3MgaXMgYSBkZXNjcmlwdGlvbiBv ZiB0aGUgYWxnb3JpdGhtLCBhbG9uZyB3aXRoIGFjaGlldmVtZW50cw0KYW5kIHRlY2huaWNhbCBj aGFsbGVuZ2VzLg0KDQojIyBTdGVwcyBmb3IgQ29tcGFjdGlvbg0KDQpUaGVzZSBhcmUgdGhlIGhp Z2ggbGV2ZWwgc3RlcHMgdGFrZW4gaW4gYEdDLmNvbXBhY3RgIGFyZSBhcyBmb2xsb3dzOg0KDQox LiBGdWxsIEdDDQoyLiBNb3ZlIG9iamVjdHMNCjMuIFVwZGF0ZSByZWZlcmVuY2VzDQo0LiBGdWxs IEdDDQoNCiMjIyBTdGVwIE9uZSwgRnVsbCBHQw0KDQpOb3QgYWxsIG9iamVjdHMgaW4gUnVieSdz IGhlYXAgY2FuIG1vdmUuICBJbiBwYXJ0aWN1bGFyLCBDIGV4dGVuc2lvbnMgbWF5IGhvbGQNCnJl ZmVyZW5jZXMgdG8gVkFMVUUgcG9pbnRlcnMuICBJZiB0aGUgVkFMVUUgcG9pbnRlcnMgbW92ZSwg dGhlIEMgZXh0ZW5zaW9uIG1heQ0Kbm90IGJlIGFibGUgdG8gZmluZCB0aGVtIGFuZCB3aWxsIGdl dCBhIFNFR1Ygb3IgcG9zc2libHkgd3JvbmcgZGF0YS4NCg0KVG8gcHJldmVudCB0aGlzLCBhIG5l dyAicGlubmluZyIgdGFibGUgd2FzIGludHJvZHVjZWQuICBBbnkgb2JqZWN0IG1hcmtlZCB2aWEN CmByYl9nY19tYXJrYCBpcyAicGlubmVkIiBhbmQgaXMgbm90IGFsbG93ZWQgdG8gbW92ZS4gIEMg ZXh0ZW5zaW9ucyBtdXN0IG1hcmsNCnRoZWlyIHJlZmVyZW5jZXMgaW4gb3JkZXIgdG8ga2VlcCB0 aGVtIGFsaXZlLiAgU2luY2UgQyBleHRlbnNpb25zIHVzZQ0KYHJiX2djX21hcmtgIHRvIG1hcmsg YSByZWZlcmVuY2UsIHdlIGtub3cgbm90IHRvIG1vdmUgdGhhdCByZWZlcmVuY2UuICBJbiBvcmRl cg0KdG8gZW5zdXJlIGFsbCByZWZlcmVuY2VzIGdldCBtYXJrZWQsIHdlIHBlcmZvcm0gYSBmdWxs IEdDLg0KDQpOZXcgZnVuY3Rpb25zLCBgcmJfZ2NfbWFya19ub19waW5gLCBldGMgd2VyZSBpbnRy b2R1Y2VkIGFuZCB1c2VkIGludGVybmFsbHkuDQpUaGVzZSBmdW5jdGlvbnMga2VlcHMgdGhlIG9i amVjdCBhbGl2ZSBidXQgd2l0aG91dCBwaW5uaW5nIHRoZSByZWZlcmVuY2UuDQoNClN1bW1hcnk6 IFBlcmZvcm0gYSBmdWxsIEdDIHNvIHRoYXQgb2JqZWN0cyBtYXJrZWQgd2l0aCBgcmJfZ2NfbWFy a2AgZG8gbm90IG1vdmUuDQoNCiMjIyBTdGVwIFR3bywgTW92ZSBPYmplY3RzDQoNClRoaXMgY29t cGFjdG9yIHVzZXMgYSAidHdvIGZpbmdlciIgYWxnb3JpdGhtIHdoaWNoIHdhcyBpbnRyb2R1Y2Vk IGluICJUaGUNClByb2dyYW1taW5nIExhbmd1YWdlIExJU1A6IEl0cyBPcGVyYXRpb24gYW5kIEFw cGxpY2F0aW9ucyIgKHBhZ2UgMjI4KVteMV0uICBUd28NCnBvaW50ZXJzIHBvaW50IGF0IGVhY2gg c2lkZSBvZiB0aGUgaGVhcCwgaWYgb25lIHNsb3QgaXMgZW1wdHksIGFuZCB0aGUgb3RoZXIgaXMN Cm1vdmVhYmxlLCBpdCBzd2FwcyBwbGFjZXMgYW5kIGxlYXZlcyBhIGBUX01PVkVEYCBvYmplY3Qg dGhhdCBjb250YWlucyBhDQpmb3J3YXJkaW5nIGFkZHJlc3MuDQoNCkluIFJ1YnksIHRoZSBhbGdv cml0aG0gbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczoNCg0KYGBgcnVieQ0KZGVmIGNvbXBhY3QN CiAgaGVhcCA9IFsgLi4uIF0gIyBtYW55IHNsb3RzDQogIGxlZnQgID0gMA0KICByaWdodCA9IGhl YXAubGVuZ3RoIC0gMQ0KDQogIHdoaWxlIGxlZnQgPCByaWdodA0KICAgIGxlZnRfc2xvdCA9IGhl YXBbbGVmdF0NCiAgICByaWdodF9zbG90ID0gaGVhcFtyaWdodF0NCg0KICAgIGlmIGlzX2VtcHR5 PyhsZWZ0X3Nsb3QpICYmICFpc19lbXB0eT8ocmlnaHRfc2xvdCkgJiYgY2FuX21vdmU/KHJpZ2h0 X3Nsb3QpDQogICAgICBzd2FwKGxlZnQsIHJpZ2h0KQ0KICAgICAgaGVhcFtyaWdodF0gPSBUX01P VkVELm5ldyhsZWZ0KSAjIGxlYXZlIGZvcndhcmRpbmcgYWRkcmVzcw0KICAgIGVuZA0KDQogICAg d2hpbGUgIWlzX2VtcHR5PyhoZWFwW2xlZnRdKQ0KICAgICAgbGVmdCArPSAxDQogICAgZW5kDQoN CiAgICB3aGlsZSBpc19lbXB0eT8oaGVhcFtyaWdodF0pIHx8ICFjYW5fbW92ZT8oaGVhcFtyaWdo dF0pDQogICAgICByaWdodCAtPSAxDQogICAgZW5kDQogIGVuZA0KZW5kDQpgYGANCg0KSWYgd2Ug aGF2ZSBhIGhlYXAgd2l0aCA2IHNsb3RzLCBiZWZvcmUgY29tcGFjdGlvbiBpdCBtaWdodCBsb29r IHNvbWV0aGluZyBsaWtlDQp0aGlzOg0KDQpgYGANCiAgICAgICAgICAgICAgICAgICAgIOKUjCDi lIAg4pSAIOKUgCDilIAg4pSAIOKUgCDilIAg4pSAIOKUgCDilIAg4pSAICAgICAgICANCiAgICAg ICAgICAgICAgICAgICAgICAgIEJlZm9yZSBDb21wYWN0aW9uICAg4pSCICAgICAgIA0KICAgICAg ICAgICAgICAgICAgICAg4pSUIOKUgCDilIAg4pSAIOKUgCDilIAg4pSAIOKUgCDilIAg4pSAIOKU gCDilIAgICAgICAgIA0KICAgICAgICAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA 4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA 4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSQDQogU2xvdCBJbmRleCAgICDilIIgIDEgIOKUgiAg MiAg4pSCICAzICDilIIgIDQgIOKUgiAgNSAg4pSCICA2ICDilIINCiAgICAgICAgICAgICAgIOKU nOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUvOKU gOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUpA0KU2xv dCBDb250ZW50cyAg4pSCICBBICDilIIgIEIgIOKUgkVtcHR54pSCRW1wdHnilIIgIEMgIOKUgiAg RCAg4pSCDQogICAgICAgICAgICAgICDilIIgICAgIOKUgiAgICAg4pSCICAgICDilIIgICAgIOKU giAgICAg4pSCICAgICDilIINCiAgICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUtOKU gOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKU gOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUmA0KYGBgDQoNCkFmdGVyIGNvbXBhY3Rpb24s IGJ1dCBiZWZvcmUgcmVmZXJlbmNlIHVwZGF0ZSwgaXQgd2lsbCBsb29rIGxpa2UgdGhpczoNCg0K YGBgDQogICAgICAgICAgICAgICAgICAgICDilIwg4pSAIOKUgCDilIAg4pSAIOKUgCDilIAg4pSA IOKUgCDilIAg4pSAIOKUgCAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgQWZ0ZXIg Q29tcGFjdGlvbiAgIOKUgiAgICAgICANCiAgICAgICAgICAgICAgICAgICAgIOKUlCDilIAg4pSA IOKUgCDilIAg4pSAIOKUgCDilIAg4pSAIOKUgCDilIAg4pSAICAgICAgICANCiAgICAgICAgICAg ICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKU gOKUrOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKU kA0KIFNsb3QgSW5kZXggICAg4pSCICAxICDilIIgIDIgIOKUgiAgMyAg4pSCICA0ICDilIIgIDUg IOKUgiAgNiAg4pSCDQogICAgICAgICAgICAgICDilJzilIDilIDilIDilIDilIDilLzilIDilIDi lIDilIDilIDilLzilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilLzilIDilIDilIDi lIDilIDilLzilIDilIDilIDilIDilIDilKQNClNsb3QgQ29udGVudHMgIOKUgiAgQSAg4pSCICBC ICDilIIgIEQgIOKUgiAgQyAg4pSCTU9WRUTilIJNT1ZFROKUgg0KICAgICAgICAgICAgICAg4pSC ICAgICDilIIgICAgIOKUgiAgICAg4pSCICAgICDilIJUTyA0IOKUglRPIDMg4pSCDQogICAgICAg ICAgICAgICDilJTilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilLTilIDilIDilIDi lIDilIDilLTilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDi lIDilJgNCmBgYA0KDQpTbG90cyA1IGFuZCA2IGNvbnRhaW4gYFRfTU9WRURgIG9iamVjdHMgdGhh dCBwb2ludCB0byB0aGUgbmV3IGxvY2F0aW9ucyBvZiBEIGFuZA0KQyBvYmplY3RzLg0KDQojIyMg U3RlcCBUaHJlZSwgVXBkYXRlIFJlZmVyZW5jZXMNCg0KQWZ0ZXIgb2JqZWN0cyBoYXZlIG1vdmVk LCByZWZlcmVuY2VzIGFyZSB1cGRhdGVkLiAgVGhpcyBpcyBhIG1hdHRlciBvZiB1cGRhdGluZw0K YW55IHJlZmVyZW5jZXMgdG8gdXNlIHRoZSBmb3J3YXJkaW5nIGFkZHJlc3MgcmF0aGVyIHRoYW4g dGhlIG9yaWdpbmFsIGxvY2F0aW9uLg0KDQpGb3IgZXhhbXBsZSwgaWYgb2JqZWN0IEEgaGFzIGEg cmVmZXJlbmNlIHRvIEMsIGFuZCBCIGEgcmVmZXJlbmNlIHRvIEQ6DQoNCmBgYA0KICAgICAgICAg ICAgICAgICAgICAg4pSMIOKUgCDilIAg4pSAIOKUgCDilIAg4pSAIOKUgCDilIAg4pSAIOKUgCDi lIAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgQmVmb3JlIENvbXBhY3Rpb24gICDi lIIgICAgICAgDQogICAgICAgICAgICAgICAgICAgICDilJQg4pSAIOKUgCDilIAg4pSAIOKUgCDi lIAg4pSAIOKUgCDilIAg4pSAIOKUgCAgICAgICAgDQogICAgICAgICAgICAgICDilIzilIDilIDi lIDilIDilIDilKzilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilKzilIDilIDilIDi lIDilIDilKzilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilJANCiBTbG90IEluZGV4 ICAgIOKUgiAgMSAg4pSCICAyICDilIIgIDMgIOKUgiAgNCAg4pSCICA1ICDilIIgIDYgIOKUgg0K ICAgICAgICAgICAgICAg4pSc4pSA4pSA4pSA4pSA4pSA4pS84pSA4pSA4pSA4pSA4pSA4pS84pSA 4pSA4pSA4pSA4pSA4pS84pSA4pSA4pSA4pSA4pSA4pS84pSA4pSA4pSA4pSA4pSA4pS84pSA4pSA 4pSA4pSA4pSA4pSkDQpTbG90IENvbnRlbnRzICDilIIgIEEgIOKUgiAgQiAg4pSCRW1wdHnilIJF bXB0eeKUgiAgQyAg4pSCICBEICDilIINCiAgICAgICAgICAgICAgIOKUgiAgICAg4pSCICAgICDi lIIgICAgIOKUgiAgICAg4pSCICAgICDilIIgICAgIOKUgg0KICAgICAgICAgICAgICAg4pSU4pSA 4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA 4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pSYDQogICAgICAg ICAgICAgICAgICDilIIgICAgIOKUgiAgICAgICAgICAgICAgICAg4payICAgICDilrIgICANCiAg ICAgICAgICAgICAgICAgIOKUgiAgICAg4pSCICAgICAgICAgICAgICAgICDilIIgICAgIOKUgiAg IA0KICAgICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pS84pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAgICDilIIgICANCiAgICAg ICAgICAgICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIA0KYGBgDQoNCkFmdGVyIGNv bXBhY3Rpb24sIGJ1dCBiZWZvcmUgdXBkYXRpbmcgcmVmZXJlbmNlcywgdGhlIGhlYXAgd2lsbCBs b29rIGxpa2UgdGhpczoNCg0KYGBgDQogICAgICAgICAgICAgICAgICAgICDilIwg4pSAIOKUgCDi lIAg4pSAIOKUgCDilIAg4pSAIOKUgCDilIAg4pSAIOKUgCAgICAgICAgDQogICAgICAgICAgICAg ICAgICAgICAgICAgQWZ0ZXIgQ29tcGFjdGlvbiAgIOKUgiAgICAgICANCiAgICAgICAgICAgICAg ICAgICAgIOKUlCDilIAg4pSAIOKUgCDilIAg4pSAIOKUgCDilIAg4pSAIOKUgCDilIAg4pSAICAg ICAgICANCiAgICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKU gOKUrOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKU rOKUgOKUgOKUgOKUgOKUgOKUkA0KIFNsb3QgSW5kZXggICAg4pSCICAxICDilIIgIDIgIOKUgiAg MyAg4pSCICA0ICDilIIgIDUgIOKUgiAgNiAg4pSCDQogICAgICAgICAgICAgICDilJzilIDilIDi lIDilIDilIDilLzilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilLzilIDilIDilIDi lIDilIDilLzilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilKQNClNsb3QgQ29udGVu dHMgIOKUgiAgQSAg4pSCICBCICDilIIgIEQgIOKUgiAgQyAg4pSCTU9WRUTilIJNT1ZFROKUgg0K ICAgICAgICAgICAgICAg4pSCICAgICDilIIgICAgIOKUgiAgICAg4pSCICAgICDilIJUTyA0IOKU glRPIDMg4pSCDQogICAgICAgICAgICAgICDilJTilIDilIDilIDilIDilIDilLTilIDilIDilIDi lIDilIDilLTilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDi lIDilLTilIDilIDilIDilIDilIDilJgNCiAgICAgICAgICAgICAgICAgIOKUgiAgICAg4pSCICAg ICAgICAgICAgICAgICDilrIgICAgIOKWsiAgIA0KICAgICAgICAgICAgICAgICAg4pSCICAgICDi lIIgICAgICAgICAgICAgICAgIOKUgiAgICAg4pSCICAgDQogICAgICAgICAgICAgICAgICDilJTi lIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilJggICAgIOKUgiAgIA0KICAgICAgICAgICAgICAgICAgICAgICAg4pSU4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSYICAgDQpgYGANCg0KVGhlIHVwZGF0ZSByZWZlcmVuY2VzIHN0ZXAgbG9va3Mg YXQgZWFjaCBvYmplY3QgaW4gdGhlIGhlYXAsIGNoZWNrcyB0byBzZWUgaWYgaXQNCnJlZmVyZW5j ZXMgYW55IG1vdmVkIHNsb3RzLCB0aGVuIHVwZGF0ZXMgdGhlIHJlZmVyZW5jZSB0byB1c2UgdGhl IG5ldyBsb2NhdGlvbi4NCkluIFJ1YnksIGl0IGxvb2tzIGxpa2UgdGhpczoNCg0KYGBgcnVieQ0K ZGVmIHVwZGF0ZV9yZWZlcmVuY2VzDQogIGhlYXAuZWFjaCBkbyB8c2xvdHwNCiAgICBuZXh0IGlm IGlzX2VtcHR5PyhzbG90KSB8fCBpc19tb3ZlZD8oc2xvdCkNCg0KICAgIHNsb3QucmVmZXJlbmNl cy5lYWNoX3dpdGhfaW5kZXggZG8gfGNoaWxkLCBpfA0KICAgICAgaWYgaXNfbW92ZWQ/KGNoaWxk KQ0KICAgICAgICBzbG90LnNldF9yZWZlcmVuY2UoaSwgY2hpbGQubmV3X2xvY2F0aW9uKQ0KICAg ICAgZW5kDQogICAgZW5kDQogIGVuZA0KZW5kDQpgYGANCg0KQWZ0ZXIgcmVmZXJlbmNlIHVwZGF0 ZXMsIHRoZSBoZWFwIHdpbGwgbG9vayBsaWtlIHRoaXM6DQoNCmBgYA0KICAgICAgICAgICAgICAg ICAgICAg4pSMIOKUgCDilIAg4pSAIOKUgCDilIAg4pSAIOKUgCDilIAg4pSAIOKUgCDilIAgICAg ICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgQWZ0ZXIgUmVmIFVwZGF0ZXMgICDilIIgICAg ICAgDQogICAgICAgICAgICAgICAgICAgICDilJQg4pSAIOKUgCDilIAg4pSAIOKUgCDilIAg4pSA IOKUgCDilIAg4pSAIOKUgCAgICAgICAgDQogICAgICAgICAgICAgICDilIzilIDilIDilIDilIDi lIDilKzilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDi lKzilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilJANCiBTbG90IEluZGV4ICAgIOKU giAgMSAg4pSCICAyICDilIIgIDMgIOKUgiAgNCAg4pSCICA1ICDilIIgIDYgIOKUgg0KICAgICAg ICAgICAgICAg4pSc4pSA4pSA4pSA4pSA4pSA4pS84pSA4pSA4pSA4pSA4pSA4pS84pSA4pSA4pSA 4pSA4pSA4pS84pSA4pSA4pSA4pSA4pSA4pS84pSA4pSA4pSA4pSA4pSA4pS84pSA4pSA4pSA4pSA 4pSA4pSkDQpTbG90IENvbnRlbnRzICDilIIgIEEgIOKUgiAgQiAg4pSCICBEICDilIIgIEMgIOKU gk1PVkVE4pSCTU9WRUTilIINCiAgICAgICAgICAgICAgIOKUgiAgICAg4pSCICAgICDilIIgICAg IOKUgiAgICAg4pSCVE8gNCDilIJUTyAzIOKUgg0KICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA 4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA 4pSA4pS04pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pSYDQogICAgICAgICAgICAg ICAgICDilIIgICAgIOKUgiAgICAg4payICAgICDilrIgICAgICAgICAgICAgICANCiAgICAgICAg ICAgICAgICAgIOKUgiAgICAg4pSCICAgICDilIIgICAgIOKUgiAgICAgICAgICAgICAgIA0KICAg ICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pS84pSA4pSA4pSA4pSA4pSA4pS84pSA 4pSA4pSA4pSA4pSA4pSYICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICDi lJTilIDilIDilIDilIDilIDilJggICAgICAgICAgICAgICAgICAgICANCmBgYA0KDQojIyMgU3Rl cCBGb3VyLCBGdWxsIEdDDQoNCkFmdGVyIHJlZmVyZW5jZXMgaGF2ZSBiZWVuIHVwZGF0ZWQsIGEg ZnVsbCBHQyBpcyBwZXJmb3JtZWQuICBUaGlzIGNvbnZlcnRzIHRoZQ0KYFRfTU9WRURgIHNsb3Rz IGJhY2sgaW4gdG8gYFRfRU1QVFlgIHNsb3RzLiAgVGhlIEdDIGF1dG9tYXRpY2FsbHkgdGFrZXMg Y2FyZSBvZg0KdGhpcyBiZWNhdXNlIG5vIG9iamVjdCBzaG91bGQgcmVmZXJlbmNlIGEgYFRfTU9W RURgIHNsb3QuDQoNCiMjIE5vbiBNb3ZpbmcgT2JqZWN0cw0KDQpOb24gbW92aW5nIG9iamVjdHMg YXJlOg0KDQoxLiBPYmplY3RzIG9uIHRoZSBzdGFjaw0KMi4gT2JqZWN0cyBtYXJrZWQgd2l0aCBg cmJfZ2NfbWFya2ANCjMuIEhhc2gga2V5IG9iamVjdHMNCg0KIyMjIE9iamVjdHMgb24gdGhlIHN0 YWNrDQoNClRoZSBzdGFjayBzaG91bGQgbm90IGJlIG11dGF0ZWQsIHNvIHRoZXNlIGFyZSBwaW5u ZWQuDQoNCiMjIyBPYmplY3RzIG1hcmtlZCB3aXRoIGByYl9nY19tYXJrYA0KDQpBcyBtZW50aW9u ZWQgZWFybGllciwgYW55IG9iamVjdCBtYXJrZWQgd2l0aCBgcmJfZ2NfbWFya2AgbWF5IG5vdCBt b3ZlIGJlY2F1c2UgYQ0KQyBleHRlbnNpb24gbWF5IGhvbGQgYSByZWZlcmVuY2UuICBIZXJlIGlz IGFuIGV4Y2VycHQgZnJvbSBZYWpsLCBhIEpTT04gcGFyc2VyLg0KVGhpcyBpcyB0aGUgbWFyayBm dW5jdGlvbiBpdCB1c2VzOg0KDQpgYGBjDQpzdGF0aWMgdm9pZCB5YWpsX2VuY29kZXJfd3JhcHBl cl9tYXJrKHZvaWQgKiB3cmFwcGVyKSB7DQogICAgeWFqbF9lbmNvZGVyX3dyYXBwZXIgKiB3ID0g d3JhcHBlcjsNCiAgICBpZiAodykgew0KICAgICAgICByYl9nY19tYXJrKHctPm9uX3Byb2dyZXNz X2NhbGxiYWNrKTsNCiAgICAgICAgcmJfZ2NfbWFyayh3LT50ZXJtaW5hdG9yKTsNCiAgICB9DQp9 DQoNCg0Kb2JqID0gRGF0YV9NYWtlX1N0cnVjdChrbGFzcywgeWFqbF9lbmNvZGVyX3dyYXBwZXIs IHlhamxfZW5jb2Rlcl93cmFwcGVyX21hcmssIHlhamxfZW5jb2Rlcl93cmFwcGVyX2ZyZWUsIHdy YXBwZXIpOw0KYGBgDQoNClRoZSB2YWx1ZXMgaW4gdGhpcyBtYXJrIGZ1bmN0aW9uIGB3LT5vbl9w cm9ncmVzc19jYWxsYmFja2AgYW5kIGB3LT50ZXJtaW5hdG9yYA0Kd2lsbCBub3QgbW92ZSBzaW5j ZSB0aGV5IGFyZSBwaW5uZWQgYnkgYHJiX2djX21hcmtgLg0KDQojIyMgSGFzaCBrZXkgb2JqZWN0 cw0KDQpDZXJ0YWluIGhhc2gga2V5cyB3aWxsIG5vdCBtb3ZlLiAgTW9zdCBvYmplY3RzIHVzZSB0 aGVpciBhZGRyZXNzIGFzIHRoZSBoYXNoDQp2YWx1ZS4gIElmIHRoZSBvYmplY3QgbW92ZXMsIHRo ZSBoYXNoIHZhbHVlIGNvdWxkIGNoYW5nZSwgc28gaGFzaCBrZXlzIGFyZSBub3QNCmFsbG93ZWQg dG8gbW92ZS4NCg0KVGhlcmUgaXMgYW4gZXhjZXB0aW9uIGZvciBzdHJpbmcgb2JqZWN0cy4gIFN0 cmluZyBvYmplY3RzIGNhbGN1bGF0ZSB0aGVpciBoYXNoDQpiYXNlZCBvbiB0aGUgYnl0ZXMgaW4g dGhlIHN0cmluZy4gIFNpbmNlIHRoZSBieXRlcyBpbiB0aGUgc3RyaW5nIGRvIG5vdCBjaGFuZ2UN CmFmdGVyIG1vdmUsIHRoZXkgYXJlIGFsbG93ZWQgdG8gbW92ZS4gIE1vc3QgaGFzaCBrZXlzIGlu IGxhcmdlIHByb2dyYW1zIGFyZQ0Kc3RyaW5ncywgc28gb25seSBhbGxvd2luZyBzdHJpbmcga2V5 cyB0byBtb3ZlIHNlZW1lZCBlbm91Z2guDQoNCiMjIFNwZWNpYWwgQ29uc2lkZXJhdGlvbnMNCg0K IyMjIE9iamVjdCBJRA0KDQpgT2JqZWN0I29iamVjdF9pZGAgYmFzZXMgaXRzIHZhbHVlIGZyb20g dGhlIGFkZHJlc3Mgb2YgdGhlIG9iamVjdC4gIEZvciBleGFtcGxlOg0KDQpgYGBydWJ5DQp4ID0g T2JqZWN0Lm5ldw0KaWQgPSB4Lm9iamVjdF9pZA0KR0MuY29tcGFjdCAgICAgICAgIyBgeGAgbW92 ZXMNCmlkID09IHgub2JqZWN0X2lkICMgYGlkYCBzaG91bGQgYmUgc2FtZSBhcyBgeC5vYmplY3Rf aWRgDQpgYGANCg0KV2UgZXhwZWN0IHRoZSBvYmplY3QgaWQgdG8gcmVtYWluIHRoZSBzYW1lIHJl Z2FyZGxlc3Mgb2YgY29tcGFjdGlvbi4gIFRvIGRlYWwNCndpdGggYG9iamVjdF9pZGAsIHR3byBo YXNoZXMgd2VyZSBpbnRyb2R1Y2VkLiAgT25lIGhhc2ggY29udGFpbnMgYSBtYXAgb2YgdGhlDQpv YmplY3QgdG8gdGhlICpzZWVuKiBvYmplY3QgaWQuICBUaGUgc2Vjb25kIG1hcCBjb250YWlucyBh bGwgc2VlbiBvYmplY3QgaWRzLg0KVGhlIG1hcHMgYXJlIHVwZGF0ZWQgYW55IHRpbWUgYG9iamVj dF9pZGAgaXMgY2FsbGVkLCBhbiBvYmplY3QgbW92ZXMsIG9yIGFuDQpvYmplY3QgaXMgZnJlZWQu DQoNCm9iamVjdF9pZCBpbXBsZW1lbnRhdGlvbiBpbiBSdWJ5Og0KDQpgYGBydWJ5DQokb2JqX3Rv X2lkID0ge30NCiRpZF90b19vYmogPSB7fQ0KDQpjbGFzcyBPYmplY3QNCiAgZGVmIG9iamVjdF9p ZA0KICAgIGlmICRvYmpfdG9faWQua2V5PyhhZGRyZXNzKQ0KICAgICAgIyBTZWNvbmQgY2FsbCB0 byBvYmplY3RfaWQgb24gdGhpcyBvYmplY3QNCiAgICAgIHJldHVybiAkb2JqX3RvX2lkW2FkZHJl c3NdDQogICAgZWxzZQ0KICAgICAgIyBGaXJzdCBjYWxsIHRvIG9iamVjdF9pZCBvbiB0aGlzIG9i amVjdA0KDQogICAgICBhZGRyID0gc2VsZi5hZGRyZXNzDQoNCiAgICAgIGxvb3AgZG8NCiAgICAg ICAgaWYgJHNlZW5faWRzLmtleT8oYWRkcikNCiAgICAgICAgICAjIFJlc29sdmUgY29uZmxpY3QN CiAgICAgICAgICBhZGRyICs9IHNpemVvZihSVkFMVUUpDQogICAgICAgIGVsc2UNCiAgICAgICAg ICAkb2JqX3RvX2lkW3NlbGYuYWRkcmVzc10gPSBhZGRyDQogICAgICAgICAgJGlkX3RvX29ialth ZGRyXSAgICAgICAgID0gc2VsZg0KICAgICAgICAgIHJldHVybiBhZGRyDQogICAgICAgIGVuZA0K ICAgICAgZW5kDQogICAgZW5kDQogIGVuZA0KDQogIHByaXZhdGUNCg0KICBkZWYgYWRkcmVzcw0K ICAgICMgcmV0dXJucyBhZGRyZXNzIGluIG1lbW9yeSBvZiBvYmplY3QNCiAgZW5kDQplbmQNCmBg YA0KDQpEdXJpbmcgY29tcGFjdGlvbjoNCg0KYGBgcnVieQ0KZGVmIGNvbXBhY3QNCiAgaGVhcCA9 IFsgLi4uIF0gIyBtYW55IHNsb3RzDQoNCiAgd2hpbGUgbGVmdCA8IHJpZ2h0DQogICAgZGVzdF9z bG90ID0gaGVhcFtsZWZ0XQ0KICAgIHNvdXJjZV9zbG90ID0gaGVhcFtyaWdodF0NCg0KICAgIGlm IG1vdmluZz8oc291cmNlX3Nsb3QpDQogICAgICBpZiAkb2JqX3RvX2lkLmtleT8oc291cmNlX3Ns b3QuYWRkcmVzcykNCiAgICAgICAgaWQgPSAkb2JqX3RvX2lkLmRlbGV0ZShzb3VyY2Vfc2xvdC5h ZGRyZXNzKQ0KICAgICAgICAkb2JqX3RvX2lkW2Rlc3Rfc2xvdC5hZGRyZXNzXSA9IGlkDQogICAg ICAgICRpZF90b19vYmpbaWRdICAgICAgICAgICAgICAgID0gZGVzdF9zbG90LmFkZHJlc3MNCiAg ICAgIGVuZA0KDQogICAgICAjIGV0Yw0KICAgIGVuZA0KICBlbmQNCmVuZA0KYGBgDQoNCkR1cmlu ZyBGcmVlOg0KDQpgYGBydWJ5DQpkZWYgZnJlZShvYmopDQogIGlmICRvYmpfdG9faWQua2V5Pyhv YmouYWRkcmVzcykNCiAgICAkc2Vlbl9pZHMuZGVsZXRlKCRvYmpfdG9faWQuZGVsZXRlKG9iai5h ZGRyZXNzKSkNCiAgZW5kDQplbmQNCmBgYA0KDQojIyMgT2JqZWN0U3BhY2UuX2lkMnJlZg0KDQpX aGVuIGdlbmVyYXRpbmcgYW4gb2JqZWN0IGlkLCBpbiB0aGUgY2FzZSBvZiBhIGNvbGxpc2lvbiwg dGhlIGFkZHJlc3MgaXMNCmluY3JlbWVudGVkIGJ5IDQwLiAgVGhpcyBlbmFibGVzIGBfaWQycmVm YCB0byBkZXRlcm1pbmUgdGhlcmUgaXMgYSBWQUxVRSBwb2ludGVyDQphbmQgcm91bmQgdHJpcCB0 aGUgb2JqZWN0IGNvcnJlY3RseS4NCg0KIyMgQ29tcGFjdGlvbiBTdXBwb3J0IGZvciBDIGV4dGVu c2lvbnMNCg0KQW55IG9iamVjdCBtYXJrZWQgd2l0aCBgcmJfZ2NfbWFya2Agd2lsbCBiZSAicGlu bmVkIiBhbmQgY2Fubm90IG1vdmUuICBDDQpleHRlbnNpb25zIG1hcmsgb2JqZWN0cyB2aWEgYHJi X2djX21hcmtgLCBzbyB0aGlzIGVuc3VyZXMgdGhhdCBwb2ludGVycyBpbiBDDQpzdGF5IHZhbGlk Lg0KDQpIb3dldmVyLCBzb21lIEMgZXh0ZW5zaW9ucyBtYXkgd2FudCB0byBzdXBwb3J0IHJlZmVy ZW5jZSBtb3ZlbWVudC4NCg0KIyMjIFJlZmVyZW5jZSBNb3ZlbWVudCBpbiBDIGV4dGVuc2lvbnMN Cg0KSW4gb3JkZXIgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGlmIGEgQyBl eHRlbnNpb24gaG9sZHMgYSByZWZlcmVuY2UNCnRvIGEgVkFMVUUsIHRoZSBWQUxVRSBzaG91bGQg bm90IG1vdmUuICBHb2luZyBmb3J3YXJkLCBDIGV4dGVuc2lvbnMgY2FuIHN1cHBvcnQNCm1vdmlu ZyBWQUxVRXMuICBUbyBzdXBwb3J0IG1vdmluZyBWQUxVRXMsIGEgQyBleHRlbnNpb24gc2hvdWxk IGNoYW5nZQ0KYHJiX2djX21hcmtgIHRvIGByYl9nY19tYXJrX25vX3BpbmAsIHRoZW4gaW1wbGVt ZW50IGEgbmV3IGNhbGxiYWNrIHRoYXQgaXMNCmNhbGxlZCBkdXJpbmcgY29tcGFjdGlvbiB0aGF0 IGdpdmVzIHRoZSBleHRlbnNpb24gYW4gb3Bwb3J0dW5pdHkgdG8gdXBkYXRlIGl0cw0Kb3duIHJl ZmVyZW5jZXMuICBBIG5ldyBmdW5jdGlvbiBgcmJfZ2NfbmV3X2xvY2F0aW9uYCB3aWxsIHJldHVy biB0aGUgbmV3DQpsb2NhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIFZBTFVFLg0KDQpIZXJlIGlzIGFu IGV4YW1wbGUgZm9yIGF1dG9sb2FkIGZyb20gYHZhcmlhYmxlLmNgLiAgQSBuZXcgY29tcGFjdGlv biBjYWxsYmFjayBpcw0KcmVnaXN0ZXJlZCwgYGF1dG9sb2FkX2lfY29tcGFjdGA6DQoNCmBgYGMN CnN0YXRpYyBjb25zdCByYl9kYXRhX3R5cGVfdCBhdXRvbG9hZF9kYXRhX2lfdHlwZSA9IHsNCiAg ICAiYXV0b2xvYWRfaSIsDQogICAge2F1dG9sb2FkX2lfbWFyaywgYXV0b2xvYWRfaV9mcmVlLCBh dXRvbG9hZF9pX21lbXNpemUsIGF1dG9sb2FkX2lfY29tcGFjdH0sDQogICAgMCwgMCwgUlVCWV9U WVBFRF9GUkVFX0lNTUVESUFURUxZDQp9Ow0KYGBgDQoNClRoZSBtYXJrIGZ1bmN0aW9uIGNoYW5n ZXMgdG8gKm1hcmsqIHJlZmVyZW5jZXMsIGJ1dCAqbm90KiBwaW4gdGhlbToNCg0KYGBgYw0Kc3Rh dGljIHZvaWQNCmF1dG9sb2FkX2lfbWFyayh2b2lkICpwdHIpDQp7DQogICAgc3RydWN0IGF1dG9s b2FkX2RhdGFfaSAqcCA9IHB0cjsNCg0KICAgIHJiX2djX21hcmtfbm9fcGluKHAtPmZlYXR1cmUp Ow0KDQogICAgLyogYWxsb3cgR0MgdG8gZnJlZSB1cyBpZiBubyBtb2R1bGVzIHJlZmVyIHRvIHRo aXMgdmlhIGF1dG9sb2FkX2NvbnN0LmFkICovDQogICAgaWYgKGxpc3RfZW1wdHkoJnAtPmNvbnN0 YW50cykpIHsNCiAgICAgICAgcmJfaGFzaF9kZWxldGUoYXV0b2xvYWRfZmVhdHVyZW1hcCwgcC0+ ZmVhdHVyZSk7DQogICAgfQ0KfQ0KYGBgDQoNCkFmdGVyIHRoZSBoZWFwIGlzIGNvbXBhY3RlZCwg YW55IEMgZXh0ZW5zaW9ucyB0aGF0IHJlZ2lzdGVyZWQgYSAiY29tcGFjdGlvbiINCmNhbGxiYWNr IHdpbGwgYmUgY2FsbGVkIGFuZCBoYXZlIGEgY2hhbmNlIHRvIHVwZGF0ZSBpbnRlcm5hbCByZWZl cmVuY2VzLiAgVGhlDQphdXRvbG9hZCBjb21wYWN0aW9uIGZ1bmN0aW9uIGlzIGxpa2UgdGhpczoN Cg0KYGBgYw0Kc3RhdGljIHZvaWQNCmF1dG9sb2FkX2lfY29tcGFjdCh2b2lkICpwdHIpDQp7DQog ICAgc3RydWN0IGF1dG9sb2FkX2RhdGFfaSAqcCA9IHB0cjsNCiAgICBwLT5mZWF0dXJlID0gcmJf Z2NfbmV3X2xvY2F0aW9uKHAtPmZlYXR1cmUpOw0KYGBgDQoNClRoZSBjb21wYWN0aW9uIGNhbGxi YWNrIGFza3MgZm9yIHRoZSBuZXcgbG9jYXRpb24gZm9yIHRoZSBgcC0+ZmVhdHVyZWANCnJlZmVy ZW5jZS4gIGByYl9nY19uZXdfbG9jYXRpb25gIHdpbGwgZWl0aGVyIHJldHVybiB0aGUgY3VycmVu dCB2YWx1ZSBvZg0KYHAtPmZlYXR1cmVgIChpbiB0aGUgY2FzZSB0aGUgVkFMVUUgZGlkIG5vdCBt b3ZlKSwgb3IgdGhlIG5ldyBsb2NhdGlvbi4NCg0KIyMgUmVmZXJlbmNlIFZlcmlmaWNhdGlvbiBh bmQgVGVzdGluZw0KDQpBZnRlciBjb21wYWN0aW9uLCBvYmplY3RzIHRoYXQgaGF2ZSBtb3ZlZCBh cmUgY2hhbmdlZCB0byBgVF9NT1ZFRGAgb2JqZWN0cyB3aXRoDQpmb3J3YXJkaW5nIGFkZHJlc3Nl cy4gIE9uY2UgYWxsIHJlZmVyZW5jZXMgYXJlIHVwZGF0ZWQsIG5vIG9iamVjdCBzaG91bGQgcG9p bnQNCnRvIGEgYFRfTU9WRURgIHNsb3QuICBXZSBjYW4gc2F5IHRoYXQgYmVmb3JlIGFuZCBhZnRl ciBjb21wYWN0aW9uLCBubyBvYmplY3QNCnNob3VsZCBldmVyIHBvaW50IGF0IGEgYFRfTU9WRURg IHNsb3QuICBTbyBpZiBhIGBUX01PVkVEYCBvYmplY3QgaXMgZXZlciBwdXNoZWQNCm9uIHRvIHRo ZSBtYXJrIHF1ZXVlLCB0aGVyZSBpcyBhIGJ1Zy4gIGBwdXNoX21hcmtfc3RhY2tgIGhhcyBhIGNo ZWNrIGZvcg0KYFRfTU9WRURgIG9iamVjdHMsIGFuZCB3aWxsIGNyYXNoIGlmIGEgYFRfTU9WRURg IG9iamVjdCBpcyBldmVyIHB1c2hlZCBvbiB0byB0aGUNCm1hcmsgc3RhY2suDQoNCkEgbWV0aG9k IGBHQy52ZXJpZnlfY29tcGFjdGlvbl9yZWZlcmVuY2VzYCB3YXMgYWRkZWQgdGhhdCBkb3VibGVz IHRoZSBhdmFpbGFibGUNCmhlYXAgc2l6ZSwgdGhlbiBjb21wYWN0cyB0aGUgaGVhcC4gIFNpbmNl IHRoZSBoZWFwIGhhcyBkb3VibGVkIGluIHNpemUsIGFueQ0Kb2JqZWN0IHRoYXQgY2FuIG1vdmUg d2lsbCBtb3ZlLiAgQW55IHJlZmVyZW5jZXMgdG8gYFRfTU9WRURgIG9iamVjdHMgd2lsbCBiZQ0K Y2F1Z2h0IGR1cmluZyB0aGUgR0MgcGhhc2UgYWZ0ZXIgY29tcGFjdGlvbi4NCg0KIyMgS25vd24g SXNzdWUNCg0KU2FmZXR5IGZvciBDIGV4dGVuc2lvbnMgZGVwZW5kcyBlbnRpcmVseSBvbiBDIGV4 dGVuc2lvbnMgbWFya2luZyB0aGVpcg0KcmVmZXJlbmNlcy4gIElmIGEgQyBleHRlbnNpb24gZG9l cyBub3QgbWFyayBhIHJlZmVyZW5jZSwgdGhlIGNvbXBhY3RvciBhc3N1bWVzDQp0aGF0IHRoZSBv YmplY3QgaXMgc2FmZSB0byBtb3ZlLiAgVGhpcyBjYW4gY2F1c2UgYW4gZXJyb3IgaW4gdGhlIGZv bGxvd2luZw0Kc2l0dWF0aW9uLCB3aGVuIHRoZXJlIGlzIGFuIG9iamVjdCBncmFwaCBsaWtlIHRo aXM6DQoNCg0KYGBgDQog4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSQICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUkCANCiDilIIgIFJ1YnkgT2JqZWN0ICDilIIgICAgICAg4pSCICBSdWJ5IE9iamVj dCAg4pSCIA0KIOKUgiAgSW1wbGVtZW50ZWQgIOKUgiAgICAgICDilIIgIEltcGxlbWVudGVkICDi lIIgDQog4pSCICAgIGluIFJ1YnkgICAg4pSCICAgICAgIOKUgiAgICAgaW4gQyAgICAgIOKUgiAN CiDilIIgICAgICAgICAgICAgICDilIIgICAgICAg4pSCICAgICAgICAgICAgICAg4pSCIA0KIOKU lOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgICAgICDi lJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggDQogICAg ICAgICDilIIgICAgICAgICAgICAgICAgICAgICAgIOKUgiAgICAgICAgIA0KICAgICAgICAg4pSC ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICDilIIgICAgICAgICAg ICAgICAgICAgICAgIOKUgiAgIE5PVCAgIA0KIE1hcmtlZCAg4pSCICAgICAgICAgICAgICAgICAg ICAgICAgICBNYXJrZWQgDQogICAgICAgICDilIIgICAgICAgICAgICAgICAgICAgICAgIOKUgiAg ICAgICAgIA0KICAgICAgICAg4pSCICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSQICAgICAgICAgICAgIA0KICAgICAgICAg4pSCICAg4pSCICAgICAg ICAgICAgICAg4pSCICAg4pSCICAgICAgICAgDQogICAgICAgICDilIIgICDilIIgIFJ1YnkgT2Jq ZWN0ICDilIIgICAgICAgICAgICAgDQogICAgICAgICDilJTilIDilIDilrbilIIgICAgICAgICAg ICAgICDilILil4DilIAg4pSYICAgICAgICAgDQogICAgICAgICAgICAg4pSCICAgICAgICAgICAg ICAg4pSCICAgICAgICAgICAgIA0KICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgICAgICAgICAgICANCmBgYA0KDQpJZiB0aGUg QyBleHRlbnNpb24gY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0LCBidXQgZXhwZWN0 cyB0aGUgb2JqZWN0DQpub3QgdG8gbW92ZSBiZWNhdXNlIGEgUnVieSBvYmplY3QgY29udGFpbnMg YSByZWZlcmVuY2UsIHRoZW4gdGhlIHRhcmdldCBSdWJ5DQpvYmplY3QgKm1heSogbW92ZSBhbmQg dGhlIHJlZmVyZW5jZSBpbiB0aGUgQyBleHRlbnNpb24gd2lsbCBiZSB3cm9uZy4gIEkgbGlrZSB0 bw0KY2FsbCB0aGVzZSAiZ2hvc3QgcmVmZXJlbmNlcyIgYmVjYXVzZSB0aGUgR0MgY2Fubm90IHNl ZSB0aGVtIGJ1dCB0aGV5IHdpbGwgY29tZQ0KYmFjayB0byBoYXVudCB5b3UuDQoNClRoZSBzb2x1 dGlvbiB0byB0aGlzIGlzIGVpdGhlcjoNCg0KMS4gQ2hhbmdlIHRoZSBDIGV4dGVuc2lvbiB0byBg cmJfZ2NfbWFya2AgdGhlIG9iamVjdA0KMi4gUmVtb3ZlIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUg QyBleHRlbnNpb24NCg0KT25lIGV4YW1wbGUgb2YgdGhpcyBzaXR1YXRpb24gd2FzIGZpeGVkIGhl cmU6DQoNCiAgaHR0cHM6Ly9naXRodWIuY29tL21zZ3BhY2svbXNncGFjay1ydWJ5L2lzc3Vlcy8x MzMNCg0KIyMgU3VtbWFyeQ0KDQpCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIEMgZXh0ZW5z aW9ucyBpcyBtYWludGFpbmVkIGJ5ICJwaW5uaW5nIiBhbnkNCnJlZmVyZW5jZXMgbWFya2VkIHdp dGggYHJiX2djX21hcmtgLiAgQSBmdWxsIG1hcmsgKm11c3QqIGJlIGRvbmUgYmVmb3JlDQpjb21w YWN0aW5nIHRvIGRpc2NvdmVyIGFsbCBwaW5uZWQgcmVmZXJlbmNlcy4NCg0KQSBuZXcgY2FsbGJh Y2sgZm9yIEMgZXh0ZW5zaW9ucyBpcyBpbnRyb2R1Y2VkIHNvIHRoYXQgQyBleHRlbnNpb25zIGNh biBzdXBwb3J0DQpjb21wYWN0aW9uLiAgQyBleHRlbnNpb25zIHRoYXQgd2lzaCB0byBzdXBwb3J0 IGNvbXBhY3Rpb24gbXVzdCB1c2UgdGhlIG5ldw0KY2FsbGJhY2ssIGByYl9nY19tYXJrX25vX3Bp bmAsIGFuZCBgcmJfZ2NfbmV3X2xvY2F0aW9uYC4NCg0KQyBleHRlbnNpb25zIHRoYXQgbWFpbnRh aW4gcG9pbnRlcnMgYnV0IGRvIG5vdCBtYXJrIHRob3NlIHBvaW50ZXJzIG1heSBTRUdWLiAgV2UN CmNhbiB1c2UgYEdDLnZlcmlmeV9jb21wYWN0aW9uX3JlZmVyZW5jZXNgIHRvIGRpc2NvdmVyIHRo ZXNlIGlzc3Vlcy4NCg0KW14xXTogU2VlIGFsc28gIlRoZSBHYXJiYWdlIENvbGxlY3Rpb24gSGFu ZGJvb2siIHBhZ2UgMzINCg0KDQotLS1GaWxlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tDQowMDAxLUNvbXBhY3RpbmctR0MtZm9yLU1SSS5wYXRjaCAoNzYuNSBLQikNCmJlZm9yZV9j b21wYWN0LTAucG5nICgxMTEgS0IpDQphZnRlcl9jb21wYWN0LTAucG5nICg4MC42IEtCKQ0KYmVm b3JlX2NvbXBhY3QtMS5wbmcgKDgxLjIgS0IpDQphZnRlcl9jb21wYWN0LTEucG5nICg3OS40IEtC KQ0KDQoNCi0tIA0KaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvDQo=