[ruby-core:109515] [Ruby master Feature#18934] Proposal: Introduce method results memoization API in the core
From:
"jeremyevans0 (Jeremy Evans)" <noreply@...>
Date:
2022-08-17 14:55:32 UTC
List:
ruby-core #109515
SXNzdWUgIzE4OTM0IGhhcyBiZWVuIHVwZGF0ZWQgYnkgamVyZW15ZXZhbnMwIChKZXJlbXkgRXZh bnMpLg0KDQoNCkRhbjAwNDIgKERhbmllbCBEZUxvcm1lKSB3cm90ZSBpbiAjbm90ZS0xOg0KPiBJ J20gYWxzbyBleGNpdGVkIGJ5IHRoZSBwb3NzaWJpbGl0eSB0aGlzIGNvdWxkIGFsbG93IHRvIG1l bW9pemUgbWV0aG9kcyBvbiBmcm96ZW4vc2hhcmVhYmxlIG9iamVjdHMsIHdoaWNoIGlzIGltcG9z c2libGUgd2l0aCBpbnN0YW5jZSB2YXJpYWJsZXMuIElmIHlvdSBkZWNsYXJlIGEgY2xhc3Mgd2l0 aCAzIG1lbW9pemVkIG1ldGhvZHMsIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBwcmUtYWxsb2Nh dGUgYSAzLXNsb3QgdmVjdG9yIGZvciBlYWNoIGluc3RhbmNlLCB3aGljaCBjYW4gdGhlbiBzdG9y ZSB0aGUgbWVtb2l6ZWQgaW5mbyByZWdhcmRsZXNzIG9mIGZyb3plbiBzdGF0dXMuDQoNClRoaXMg dHlwZSBvZiBvcHRpbWl6YXRpb24gaXMgbm90IHNhZmUgdW5sZXNzIHRoZSBlbnRpcmUgY2xhc3Mg aGllcmFyY2h5IGlzIGZyb3plbi4gIE90aGVyd2lzZSwgYWRkaXRpb25hbCBtZW1vaXplZCBtZXRo b2RzIGNvdWxkIGJlIGFkZGVkIHRvIGFueSBhbmNlc3RvciBhdCBhbnkgdGltZS4NCg0KenZlcm9r IChWaWN0b3IgU2hlcGVsZXYpIHdyb3RlOg0KPiAqIE5vIGV4dHJhIEFQSSB0byBtZW1vaXplIGNs YXNzIG1ldGhvZHMsIGxpa2Ugd2UgZG9uJ3QgaGF2ZSBhIHNwZWNpZmljIEFQSSBmb3IgbWFraW5n IGNsYXNzIG1ldGhvZHMgcHJpdmF0ZS4NCg0KVGhpcyBtYXkgbm90IGJlIGEgZ29vZCBleGFtcGxl LCBhcyBgQ2xhc3MjcHJpdmF0ZV9jbGFzc19tZXRob2RgIGlzIHRoZSBzcGVjaWZpYyBBUEkgZm9y IG1ha2luZyBjbGFzcyBtZXRob2RzIHByaXZhdGUuDQoNCklNTywgb25lIGlzc3VlIHdpdGggbWVt b2l6YXRpb24gaW4gZ2VuZXJhbCBpcyB0aGF0IGl0IGlzIG9ubHkgc2FmZSB3aGVuIHRoZSBtZW1v aXphdGlvbiBkZXBlbmRzIG9uIGltbXV0YWJsZSBzdGF0ZS4gIElmIHRoZSByZXN1bHRzIG9mIHRo ZSBtZXRob2QgY2FuIGNoYW5nZSBieSBtb2RpZnlpbmcgdGhlIG9iamVjdCdzIHN0YXRlLCB0aGVu IG1lbW9pemF0aW9uIGNhbiByZXN1bHQgaW4gaW5jb3JyZWN0IGJlaGF2aW9yLiAgU28gSSdtIG5v dCBzdXJlIGlmIHRoaXMgaXMgc29tZXRoaW5nIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiBg T2JqZWN0YC9gS2VybmVsYC4gIEl0IHdvdWxkIGJlIHNhZmVyIHRvIGludHJvZHVjZSB0aGlzIG9u bHkgZm9yIGltbXV0YWJsZSBvYmplY3RzLCBzdWNoIGFzIHRoZSBjbGFzcyBkaXNjdXNzZWQgaW4g IzE2MTIyLg0KDQpPbmUgdGhpbmcgbWlzc2luZyBmcm9tIHRoaXMgcHJvcG9zYWwgaXMgYW4gaW1w bGVtZW50YXRpb24gYXBwcm9hY2guICBBcmUgdGhlIG1lbW9pemVkIHJlc3VsdHMgc3RvcmVkIGlu IGEgaGFzaD8gIEFyZSB0aGV5IHN0b3JlZCBpbiBpbnN0YW5jZSB2YXJpYWJsZXM/ICBIb3cgd2ls bCB0aGUgbWVtb2l6YXRpb24gYXBwcm9hY2ggaW50ZXJhY3Qgd2l0aCBvYmplY3Qgc2hhcGVzICgj MTg3NzYpPyANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRmVh dHVyZSAjMTg5MzQ6IFByb3Bvc2FsOiBJbnRyb2R1Y2UgbWV0aG9kIHJlc3VsdHMgbWVtb2l6YXRp b24gQVBJIGluIHRoZSBjb3JlDQpodHRwczovL2J1Z3MucnVieS1sYW5nLm9yZy9pc3N1ZXMvMTg5 MzQjY2hhbmdlLTk4Njg0DQoNCiogQXV0aG9yOiB6dmVyb2sgKFZpY3RvciBTaGVwZWxldikNCiog U3RhdHVzOiBPcGVuDQoqIFByaW9yaXR5OiBOb3JtYWwNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0NCioqQWJzdHJhY3Q6KiogSSBwcm9wb3NlIHRvIGludHJvZHVjZSBh IHNpbXBsZSBjb3JlIEFQSSBmb3IgbWVtb2l6aW5nIGFyZ3VtZW50LWxlc3MgbWV0aG9kIHJldHVy biB2YWx1ZXMuDQoNCmBgYHJ1YnkNCmNsYXNzIFRlc3QNCiAgZGVmIGZvbw0KICAgIHB1dHMgImNh bGwhIg0KICAgIDUNCiAgZW5kDQoNCiAgbWVtb2l6ZWQgOmZvbw0KZW5kDQoNCm8gPSBUZXN0Lm5l dw0Kby5mb28gIyBwcmludHMgImNhbGwhIiwgcmV0dXJucyA1DQpvLmZvbyAjIHJldHVybnMgNSBp bW1lZGlhdGVseQ0KYGBgDQoNClRoZSBmdWxsIHByb3Bvc2FsIGlzIGJlbG93Lg0KDQojIyBJbnRy bw0KDQpGb3IgZnVydGhlciByZWFzb25pbmcsIEknbGwgYmUgdXNpbmcgdGhlIGZvbGxvd2luZyBj bGFzcy4gSXQgaXMgc2ltcGxpZmllZC9pbnZlbnRlZCBmb3IgZGVtb25zdHJhdGl2ZSBwdXJwb3Nl cywgc28gSSdkIHByZWZlciB0byBkaXNjdXNzIHByb2JsZW1zL3NvbHV0aW9ucyBkZXNjcmliZWQg aW4gZ2VuZXJhbCBhbmQgbm90IGZvY3VzIG9uICJ5b3UgY291bGQgcmV3cml0ZSB0aGlzIGNsYXNz IHRoYXQgd2F5Ii4NCg0KYGBgcnVieQ0KY2xhc3MgU2VudGVuY2UNCiAgYXR0cl9yZWFkZXIgOnRl eHQNCg0KICBkZWYgaW5pdGlhbGl6ZSh0ZXh0KSA9IEB0ZXh0ID0gdGV4dA0KDQogIGRlZiB0b2tl bnMoKSA9IFNvbWVUb2tlbml6ZXIubmV3KHRleHQpLmNhbGwNCg0KICBkZWYgc2l6ZSgpID0gdG9r ZW5zLnNpemUNCiAgZGVmIGVtcHR5PygpID0gdG9rZW5zLmFsbD8oJjp3aGl0ZXNwYWNlPykNCg0K ICBkZWYgd29yZHMoKSA9IHRva2Vucy5zZWxlY3QoJjp3b3JkPykNCiAgZGVmIHNlcnZpY2U/KCkg PSB3b3Jkcy5lbXB0eT8NCmVuZA0KYGBgDQoNCiMjIFRoZSBwcm9ibGVtDQoNClRoZSBjbGFzcyBh Ym92ZSBpcyBuaWNlLCBjbGVhbiwgYW5kIGVhc3kgdG8gcmVhZC4gVGhlIHByb2JsZW0gd2l0aCBp dCBpcyBlZmZpY2llbmN5OiBpZiB3ZSBpbWFnaW5lIHRoYXQgYFNvbWVUb2tlbml6ZXIjY2FsbGAg aXMgbm90IGNoZWFwIChpdCBwcm9iYWJseSBpc24ndCksIHRoZW4gY3JlYXRpbmcgYSBmZXcgc2Vu dGVuY2VzIGFuZCB0aGVuIHByb2Nlc3NpbmcgdGhlbSB3aXRoIHNvbWUgYWxnb3JpdGhtIHdpbGwg YmXigJR3aXRoIHRoZSBkZW1vbnN0cmF0ZWQgZGVmaW5pdGlvbiBvZiB0aGUgY2xhc3PigJRtdWNo IGxlc3MgZWZmaWNpZW50IHRoZW4gaXQgY291bGQgYmUuIEV2ZXJ5IHN0YXRlbWVudCBsaWtlLi4u DQpgYGBydWJ5DQptYW55X3NlbnRlbmNlcy5yZWplY3QoJjplbXB0eT8pLnNlbGVjdCB7IF8xLndv cmRzLmluY2x1ZGU/KCdSdWJ5JykgfS5tYXAgeyBfMS53b3Jkcy5jb3VudCAvIF8xLnRva2Vucy5j b3VudCB9DQpgYGANCi4uLmlzIG11Y2ggbGVzcyBlZmZpY2llbnQgdGhhbiBpdCAiaW50dWl0aXZl bHkiIHNob3VsZCBiZSBiZWNhdXNlIHRva2VuaXphdGlvbiBoYXBwZW5zIGFnYWluIGFuZCBhZ2Fp bi4NCg0KQ2FjaGluZyBqdXN0IGB0b2tlbnNgIHdvdWxkIHByb2JhYmx5IG5vdCBiZSBlbm91Z2gg Zm9yIGEgY29tcGxleCBhbGdvcml0aG0gd29ya2luZyB3aXRoIHNvbWUgbm90YWJsZSBhbW91bnRz IG9mIGRhdGE6IGB3aGl0ZXNwYWNlP2AgYW5kIGB3b3JkP2AgbWlnaHQgYWxzbyBiZSBub24tdHJp dmlhbDsgYnV0IGV2ZW4gdHJpdmlhbCBtZXRob2RzIGxpa2UgYHNlbGVjdGAgYW5kIGBlbXB0eT9g IHdoZW4gbmVlZGxlc3NseSByZXBlYXRlZCB0aG91c2FuZHMgb2YgdGltZXMsIHdvdWxkIGJlIHZp c2libGUgaW4gcHJvZmlsaW5nLg0KDQpTbywgY2FuIHdlIHN0b3AgcmVjYWxjdWxhdGluZyB0aGVt IGNvbnN0YW50bHk/DQoNCiMjIEV4aXN0aW5nIHNvbHV0aW9ucw0KDQojIyMgSnVzdCBwcmUtY2Fs Y3VsYXRlIGV2ZXJ5dGhpbmcgaW4gYGluaXRpYWxpemVgDQoNCldlIGNvdWxkIGNyZWF0ZSBhIGxv dCBvZiBpbnN0YW5jZSB2YXJpYWJsZXMgaW4gYGluaXRpYWxpemVgOg0KYGBgcnVieQ0KZGVmIGlu aXRpYWxpemUodGV4dCkNCiAgQHRleHQgPSB0ZXh0DQogIEB0b2tlbnMgPSBTb21lVG9rZW5pemVy Lm5ldyhAdGV4dCkuY2FsbA0KICBAc2l6ZSA9IEB0b2tlbnMuc2l6ZQ0KICBAZW1wdHkgPSBAdG9r ZW5zLmFsbD8oJjp3aGl0ZXNwYWNlPykNCiAgQHdvcmRzID0gQHRva2Vucy5zZWxlY3QoJjp3b3Jk PykNCiAgQHNlcnZpY2UgPSBAd29yZHMuZW1wdHk/DQplbmQNCmBgYA0KSXQgd2lsbCB3b3JrLCBv ZiBjb3Vyc2UsIGJ1dCBpdCBsb3NlcyBuaWNlIHZpc2liaWxpdHkgb2Ygd2hhdCdzIG9iamVjdHMg bWFpbiBkYXRhIGFuZCB3aGF0IGlzIGRlcml2YXRpdmU7IGFuZCBpdCBpcyBtb3JlIGNvZGUgKG5v dyB3ZSBuZWVkIHRvIGRlZmluZSBhdHRyX3JlYWRlcnMgYW5kIHByZWRpY2F0ZSBtZXRob2RzIGZv ciBhbGwgb2YgdGhhdCEpLiBBbmQgYWRkaW5nIGV2ZXJ5IG5ldyBzbWFsbCBzZXJ2aWNlIG1ldGhv ZCAobGlrZSBgZGVmIHF1ZXN0aW9uPygpID0gdG9rZW5zLmxhc3QmLnRleHQgPT0gJz8nYCkgd291 bGQgcmVxdWlyZSByZXRoaW5raW5nICJpcyBpdCBlZmZpY2llbnQgZW5vdWdoIHRvIGJlIGEgbWV0 aG9kLCBvciBzaG91bGQgSSBhZGQgb25lIG1vcmUgaW5zdGFuY2UgdmFyIj8NCg0KIyMjIGB8fD1g IGlkaW9tDQoNClRoZSBjb21tb24gaWRpb20gZm9yIGNhY2hpbmcgaXMgYHx8PWA6DQpgYGBydWJ5 DQpkZWYgd29yZHMoKT0gQHdvcmRzIHx8PSB0b2tlbnMuc2VsZWN0KCY6d29yZD8pDQpgYGANCg0K SXQgaGFzIGl0cyBkcmF3YmFja3MsIHRob3VnaDoNCjEuIGRvZXNuJ3Qgc3VpdCBtZXRob2RzIHRo YXQgY2FuIHJldHVybiBgZmFsc2VgIG9yIGBuaWxgIChsaWtlIGBzZXJ2aWNlP2ApDQoyLiBoYXJk ZXIgdG8gdXNlIHdpdGggbWV0aG9kcyB0aGF0IG5lZWQgc2V2ZXJhbCBzdGF0ZW1lbnRzIHRvIGNh bGN1bGF0ZSB0aGUgZW5kIHJlc3VsdA0KMy4gaXQgbWl4ZXMgdGhlIGNvbmNlcm5zIG9mICJob3cg aXQgaXMgY2FsY3VsYXRlZCIgYW5kICJpdCBpcyBtZW1vaXplZCIgKGxvb2tpbmcgYXQgdGhlIG1l dGhvZCdzIGNvZGUsIHlvdSBkb24ndCBpbW1lZGlhdGVseSBrbm93IGlmIHRoZSB2YXJpYWJsZSBp cyB1c2VkIG9ubHkgZm9yIG1lbW9pemF0aW9uLCBvciBpdCBjb3VsZCd2ZSBiZWVuIHNldCBlbHNl d2hlcmUsIGFuZCBoZXJlIHdlIGp1c3QgcHJvdmlkaW5nIGRlZmF1bHQgdmFsdWUpDQo0LiBpdCBw b2xsdXRlcyB0aGUgb2JqZWN0J3MgZGF0YSByZXByZXNlbnRhdGlvbg0KDQoxLTIgaXMgdHlwaWNh bGx5IGFkdmlzZWQgdG8gc29sdmUgd2l0aCBhIGxlc3MgZWxlZ2FudCBidXQgZnV0dXJlcHJvb2Yg c29sdXRpb24gKHdoaWNoIGFsc28gbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBkZWZpbmUgaW4gb25l LWxpbmUgbWV0aG9kcywgZXZlbiBpZiB0aGUgbWFpbiBjb2RlIGlzIHNob3J0KToNCg0KYGBgcnVi eQ0KZGVmIGVtcHR5Pw0KICByZXR1cm4gQGVtcHR5IGlmIGRlZmluZWQ/KEBlbXB0eSkNCg0KICBA ZW1wdHkgPSB0b2tlbnMuYWxsPygmOndoaXRlc3BhY2U/KQ0KZW5kDQpgYGANCg0KQWJvdXQgNDog d2hpbGUgdXNpbmcgdGhpcyBzb2x1dGlvbiwgd2UnbGwgaGF2ZSBhIGxvdCBvZiBpbnN0YW5jZSB2 YXJzICh0aGF0IGFyZSBkZXJpdmF0aXZlIGFuZCBsb2dpY2FsbHkgbm90IHRoZSBwYXJ0IG9mIG9i amVjdCdzIHN0YXRlKSBub3cgdmlzaWJsZSBpbiBkZWZhdWx0IGAjaW5zcGVjdGAgYW5kIHNlcmlh bGl6YXRpb246DQpgYGBydWJ5DQpzID0gU2VudGVuY2UubmV3KCdSdWJ5IGlzIGNvb2wnKQ0KcCBz DQojICM8U2VudGVuY2U6MHgwMDAwN2ZlMjFkOGZkMTM4IEB0ZXh0PSJSdWJ5IGlzIGNvb2wiPg0K cHV0cyBzLnRvX3lhbWwNCiMgLS0tICFydWJ5L29iamVjdDpTZW50ZW5jZQ0KIyB0ZXh0OiBSdWJ5 IGlzIGNvb2wNCnAgcy5lbXB0eT8NCiMgZmFsc2UNCnAgcw0KIyAjPFNlbnRlbmNlOjB4MDAwMDdm ZTIxZDhmZDEzOCBAdGV4dD0iUnVieSBpcyBjb29sIiwgQGVtcHR5PWZhbHNlPg0KcHV0cyBzLnRv X3lhbWwNCiMgLS0tICFydWJ5L29iamVjdDpTZW50ZW5jZQ0KIyB0ZXh0OiBSdWJ5IGlzIGNvb2wN CiMgZW1wdHk6IGZhbHNlDQpgYGANCg0KIyMjIEV4aXN0aW5nIG1lbW9pemF0aW9uIGxpYnJhcmll cw0KDQpUaGVyZSBhcmUgc2V2ZXJhbCB3ZWxsLWtub3duIG1lbW9pemF0aW9uIGxpYnJhcmllcyBv dXQgdGhlcmUsIHRvIG5hbWUgYSBjb3VwbGU6IG9sZCBhbmQgcmVsaWFibGUgW21lbW9pc3RdKGh0 dHBzOi8vZ2l0aHViLmNvbS9tYXR0aGV3cnVkeS9tZW1vaXN0KSwgbmV3IGFuZCBlZmZpY2llbnQg W21lbW9fd2lzZV0oaHR0cHM6Ly9naXRodWIuY29tL3Bhbm9yYW1hLWVkL21lbW9fd2lzZSkuDQoN ClRoZXkgc29sdmUgcHJvYmxlbXMgMS0zIG9mIGB8fD1gLCBhbmQgYWxzbyBhZGQgc2V2ZXJhbCBj b29sIGZlYXR1cmVzIChsaWtlIGFyZ3VtZW50LWRlcGVuZGVudCBtZW1vaXphdGlvbikgd2l0aCBh IG1hY3JvICh0aGlzIGlzIGBtZW1vX3dpc2VgLCBgbWVtb2lzdGAgYmVoYXZlcyB0aGUgc2FtZSwg anVzdCBkaWZmZXJlbnQgbWFjcm8gbmFtZSk6DQoNCmBgYHJ1YnkNCmNsYXNzIFNlbnRlbmNlDQog IHByZXBlbmQgTWVtb1dpc2UNCiAgIyAuLi4NCiAgbWVtb193aXNlIGRlZiBlbXB0eT8oKSA9IHRv a2Vucy5hbGw/KDp3aGl0ZXNwYWNlPykNCmVuZA0KYGBgDQoNCk5vdyB3ZSBoYXZlIGEgbmljZSBk ZWNsYXJhdGl2ZSBhbmQgZGVjb3VwbGVkIHN0YXRlbWVudCAiaXQgaXMgbWVtb2l6ZWQiLCB3aGlj aCBhbHNvIHN1cHBvcnRzIGJvb2xlYW5zIGFuZCBgbmlsYHMgYW5kIG11bHRpLXN0YXRlbWVudCBt ZXRob2RzLg0KDQpUaGUgcHJvYmxlbSBvZiAiZGV0YWlsIGxlYWtpbmciIGlzbid0IHNvbHZlZCwg dGhvdWdoOg0KYGBgcnVieQ0KcCBzLmVtcHR5Pw0KIyBmYWxzZQ0KcCBzDQojICM8U2VudGVuY2U6 MHgwMDAwN2YwZjQ3NGViNDE4IEBfbWVtb193aXNlPXs6ZW1wdHk/PT5mYWxzZX0sIEB0ZXh0PSJS dWJ5IGlzIGNvb2wiPg0KcHV0cyBzLnRvX3lhbWwNCiMgLS0tICFydWJ5L29iamVjdDpTZW50ZW5j ZQ0KIyBfbWVtb193aXNlOg0KIyAgIDplbXB0eT86IGZhbHNlDQojIHRleHQ6IFJ1YnkgaXMgY29v bA0KYGBgDQoNCkFsc28sIHVzaW5nIHRoaXJkLXBhcnR5IGdlbXMgaW50cm9kdWNlcyBhIGZldyBu ZXcgcHJvYmxlbXM6DQoxLiBQZXJmb3JtYW5jZSBwZW5hbHR5LiBIb3dldmVyIHdlbGwgaXQgaXMg b3B0aW1pemVkLCBSdWJ5LWxhbmQgInJlZGVmaW5lIG1ldGhvZCwgdGhlbiBjaGVjayBpdCBpcyB0 aGVyZSwgdGhlbiBjYWxjdWxhdGUiIGhhcyBub3QgemVybyBvdmVyaGVhZC4NCjIuIERlcGVuZGVu Y3kgcGVuYWx0eS4gSWYgdGhlIG1lbW9pemluZyBnZW0gaXMgbm90IGluIHRoZSBwcm9qZWN0IHll dCwgaXQgaXMgYSBkZWNpc2lvbiB3aGV0aGVyIHRvIGludHJvZHVjZSBpdCBvciBub3QgYW5kIGZv ciBzbWFsbCBuby1kZXBlbmRlbmNpZXMgZ2VtcyBvciBmb3IgdGhlIHN0cmljdGx5LWNvbnRyb2xs ZWQgY29kZWJhc2UsIGl0IG1pZ2h0IGJlIGEgcHJvYmxlbS4gQWxzbywgZG9pbmcgYHByZXBlbmQg TWVtb1dpc2VgIChvciBgZXh0ZW5kIE1lbW9pc3RgKSBpcyBhbm90aGVyIHBvaW50IHdoZXJlIHRo ZSBxdWVzdGlvbiAic2hvdWxkIEkgaW50cm9kdWNlIHRoaXMgZGVwZW5kZW5jeT8iIGFyaXNlcyAo aW4gYSBzbWFsbCBjbGFzcyB3aXRoIGV4YWN0bHkgb25lIG1ldGhvZCB0byBtZW1vaXplLCBmb3Ig ZXhhbXBsZSEpDQoNCiMjIEZlYXR1cmUgcHJvcG9zYWwgJiBEZXNpZ24gZGVjaXNpb25zDQoNCkkg cHJvcG9zZSB0byBpbnRyb2R1Y2UgdGhlIGBNb2R1bGUjbWVtb2l6ZWQoKnN5bWJvbHMpYCBtZXRo b2QgaW4gdGhlIGNvcmUsIGltcGxlbWVudGVkIGluIEMuDQoNCjEuIE5hbWU6IGBtZW1vaXplYCBp cyBhIHR5cGljYWwgbmFtZSB0aGF0IHRoZSBjb21tdW5pdHkgaXMgdXNlZCB0by4gSSB3YW50IHRo ZSBuZXcgbWV0aG9kIHRvIGxvb2sgdW5pZm9ybSB3aXRoIG90aGVyIGV4aXN0aW5nICJtYWNyb3Mi IHRoYXQgaGF2ZSB3b3JkaW5nIHN1aXRhYmxlIGZvciB0aGUgcGhyYXNlICJ0aGlzIG1ldGhvZCBp cyB7d29yZH0iOiBgcHJpdmF0ZWAgb3IgYG1vZHVsZV9mdW5jdGlvbmA7IHRoYXQncyB3aHkgSSBw cm9wb3NlIHRoZSBuYW1lIGBtZW1vaXplZGANCjIuIEkgYmVsaWV2ZSB0aGF0IHRoZSBtZW1vaXNh dGlvbiBzaG91bGQgYmUgZnVsbHkgb3BhcXVlOiBub3QgdmlzaWJsZSBvbiBgI2luc3BlY3RgIG9y IHNlcmlhbGl6YXRpb247IG5vIHNldHRpbmdzIG9yIEFQSSB0byBpbnRlcmFjdCB3aXRoIHRoZSBp bnRlcm5hbCBzdGF0ZSBvZiBtZW1vaXphdGlvbi4NCjMuIE9ubHkgYXJndW1lbnQtbGVzcyBtZXRo b2RzIGFyZSBtZW1vaXphYmxlLCBgbWVtb2l6ZSBkZWYgZm9vKGFueSwgYXJncylgIHNob3VsZCBy YWlzZSBhbiBleGNlcHRpb24NCjQuIChOb3Qgc3VyZSBhYm91dCB0aGF0IG9uZSkgIk1lbW9pc2Vk IiBzdGF0ZSBvZiB0aGUgbWV0aG9kIHNob3VsZCBiZSBpbmhlcml0YWJsZS4gUHJvYmFibHkgd2Ug bWlnaHQgbmVlZCBhIHN5bW1ldHJpYyBgdW5tZW1vaXplZCA6Zm9vYCB0byBvdmVyd3JpdGUgdGhh dCBpbiBkZXNjZW5kYW50cy4NCg0KIyMjIE5vbi1mZWF0dXJlcw0KDQpUaGVyZSBhcmUgc2V2ZXJh bCBtb3JlIGZlYXR1cmVzIHR5cGljYWxseSBzZWVuIGluIG1lbW9pemF0aW9uIGdlbXMgY29uc2lk ZXJlZCB1bnN1aXRhYmxlIGZvciBjb3JlIGZ1bmN0aW9uYWxpdHk6DQoNCiogTm8gYXJndW1lbnRz LWRlcGVuZGVudCBtZW1vaXphdGlvbi4gSSBiZWxpZXZlIGl0IGlzIGEgImJ1c2luZXNzIGxvZ2lj IiBjb25jZXJuOiBob3cgZXhhY3RseSB0aGUgYXJndW1lbnRzIHNob3VsZCBiZSBzdG9yZWQsIGNh Y2hlIGdyb3d0aCBjb250cm9sICh3aXRoIHRvbyBtYW55IGFyZ3VtZW50LXJlc3VsdCBwYWlycyBt ZW1vaXplZCksIGNhY2hlIGNsZWFudXAsIGV0Yy4gVGhpcmQtcGFydHkgbGlicmFyaWVzIGNhbiBo YW5kbGUgdGhhdC4NCiogTm8gY2FjaGUgcHJlc2V0dGluZy9yZXNldHRpbmcgQVBJLiBJZiAiaXQg aXMgbWVtb2l6ZWQgaW4gZ2VuZXJhbCwgYnV0IHNvbWV0aW1lcyByZXNldCIsIGl0IGlzIGFnYWlu IGEgYnVzaW5lc3MtbGF5ZXIgY29uY2VybiBhbmQgc2hvdWxkbid0IGJlIHNvbHZlZCBieSBhIGxh bmd1YWdlLWxldmVsIGRlY2xhcmF0aW9uLiBUaGlyZC1wYXJ0eSBsaWJyYXJpZXMgY2FuIGhhbmRs ZSB0aGF0Lg0KKiBObyBleHRyYSBBUEkgdG8gbWVtb2l6ZSBjbGFzcyBtZXRob2RzLCBsaWtlIHdl IGRvbid0IGhhdmUgYSBzcGVjaWZpYyBBUEkgZm9yIG1ha2luZyBjbGFzcyBtZXRob2RzIHByaXZh dGUuDQoNCg0KDQoNCi0tIA0KaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvDQoKVW5zdWJzY3Jp YmU6IDxtYWlsdG86cnVieS1jb3JlLXJlcXVlc3RAcnVieS1sYW5nLm9yZz9zdWJqZWN0PXVuc3Vi c2NyaWJlPgo8aHR0cDovL2xpc3RzLnJ1YnktbGFuZy5vcmcvY2dpLWJpbi9tYWlsbWFuL29wdGlv bnMvcnVieS1jb3JlPgo=