[ruby-core:76019] [Ruby trunk Feature#12361] Proposal: add Geo::Coord class to standard library
From:
duerst@...
Date:
2016-06-14 09:40:07 UTC
List:
ruby-core #76019
SXNzdWUgIzEyMzYxIGhhcyBiZWVuIHVwZGF0ZWQgYnkgTWFydGluIETDvHJzdC4KCgpHcmVhdCB0 byBzZWUgdGhlIGdlbS4gV2l0aCByZXNwZWN0IHRvCgo+IEFuZCB0aGVuLCBwcm9wb3NhbCB3YXMg ZmFpbGVkIGFuZCByZWplY3RlZCBiZWNhdXNlIGl0IGlzIGltcGxlbWVudGVkIDopIFRoYXQncyBr aW5kIG9mIGZ1bm55LgoKSSB0aGluayB5b3UgbWlzdW5kZXJzdG9vZCBNYXR6LiBXZSBjb3VsZCBo YXZlIHBpY2tlZCBqdXN0IHlvdXIgYmFzaWMgZGF0YSByZXByZXNlbnRhdGlvbiwgd2l0aG91dCBz b21lIG9yIGFsbCBvZiB0aGUgbWV0aG9kcy4gQnV0IHdoYXQgd2Ugd291bGQgbGlrZSB0byBzZWUg aXMgbW9yZSBidXktaW4gZnJvbSB0aGUgZ2VvY29tbXV0aW5nIGNvbW11bml0eS4gVGhlIGJlc3Qg d2F5IHRvIHNob3cgc3VjaCBidXktaW4gaXMgdG8gc2VlIHlvdXIgZ2VtIGFkb3B0ZWQuCgotLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkZlYXR1cmUgIzEyMzYxOiBQcm9w b3NhbDogYWRkIEdlbzo6Q29vcmQgY2xhc3MgdG8gc3RhbmRhcmQgbGlicmFyeQpodHRwczovL2J1 Z3MucnVieS1sYW5nLm9yZy9pc3N1ZXMvMTIzNjEjY2hhbmdlLTU5MjE5CgoqIEF1dGhvcjogVmlj dG9yIFNoZXBlbGV2CiogU3RhdHVzOiBSZWplY3RlZAoqIFByaW9yaXR5OiBOb3JtYWwKKiBBc3Np Z25lZTogCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyMgUHJvcG9z YWwKCkFkZCBgR2VvOjpDb29yZGAgY2xhc3MgdG8gUnVieSBzdGFuZGFyZCBsaWJyYXJ5LCByZXBy ZXNlbnRpbmcgYFtsYXRpdHVkZSwgbG9uZ2l0dWRlXWAgcGFpciArIGNvbnZlbmllbmNlIG1ldGhv ZHMuIEFkZCBgR2VvYCBzdGFuZGFyZCBsaWJyYXJ5IHdpdGggYWRkaXRpb25hbCBjYWxjdWxhdGlv bnMgYW5kIGNvbnZlbmllbmNlIG1ldGhvZHMuCgojIyBSYXRpb25hbGUKCkluIG1vZGVybiBhcHBs aWNhdGlvbnMsIHdvcmtpbmcgd2l0aCBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMgaXMgZnJlcXVl bnQuIFdlIHByb3Bvc2UgdG8gdGhpbmsgb2Ygc3VjaCBjb29yZGluYXRlcyAobmFtZWx5LCBgbGF0 aXR1ZGUsIGxvbmdpdHVkZWAgcGFpcikgYXMgb2YgImJhc2ljIiB0eXBlIHRoYXQgc2hvdWxkIGJl IHN1cHBvcnRlZCBieSBzdGFuZGFyZCBsaWJyYXJ5IC0gdGhlIHNhbWUgd2F5IGFzIHdlIHN1cHBv cnQgYFRpbWVgL2BEYXRlYC9gRGF0ZVRpbWVgIGluc3RlYWQgb2YgaGF2aW5nIGl0IGRlZmluZWQK YnkgdXNlci9nZW1zLgoKVGhpcyB0eXBlIGlzIHRvbyAic21hbGwiIHRvIGJlIGRlZmluZWQgYnkg c2VwYXJhdGUgZ2VtLCBzbywgYWxsIG9mIGV4aXN0aW5nIGdlbyBnZW1zIChHZW9LaXQsIFJHZW8s IEdlb1J1YnksIEdyYXRpY3VsZSBldGMuKSBkZWZpbmUgdGhlaXIgb3duIGBMYXRMbmdgLCBvciBg TG9jYXRpb25gLCBvciBgUG9pbnRgLCB3aGF0ZXZlci4KCk9uIG90aGVyIGhhbmQsIEFQSSBkZXNp Z24gZm9yIHRoaXMgInNtYWxsIiB0eXBlIGlzIHZhZ3VlIGVub3VnaCBmb3IgYWxsIHRob3NlIHNp bWlsYXIgdHlwZXMgdG8gYmUgaW5jb21wYXRpYmxlIGFuZCBicmVhayBzbWFsbCBoYWJpdHMgYW5k IGNvbnZlbnRpb25zIHdoZW4geW91IGNoYW5nZSBmcm9tIG9uZSBnZW8gbGlicmFyeSB0byBhbm90 aGVyLCBvciB0cnkgdG8gdXNlIHNldmVyYWwKc2ltdWx0YW5lb3VzbHkuCgpBZGRpdGlvbmFseSwg bWFueSBnZW1zIHNvbWVob3cgd29ya2luZyB3aXRoIGdlbyBjb29yZGluYXRlcyAoZm9yIHdlYXRo ZXIsIG9yIHRpbWV6b25lLCBvciBhbm90aGVyIHRhc2tzKSBnZW5lcmFsbHkgcHJlZmVyIG5vdCB0 byBpbnRyb2R1Y2UgdHlwZSwgYW5kIGp1c3Qgd29yayB3aXRoIGBbbGF0LCBsbmddYCBhcnJheSwg d2hpY2ggaXMgbm90IHZlcnkgY29udmVuaWVudCwgZmFpdGhmdWxseS4KClNvLCBoYXZpbmcgImdl byBjb29yZGluYXRlcyIgZnVuY3Rpb25hbGl0eSBpbiBzdGFuZGFyZCBsaWJyYXJ5IHNlZW1zIHJl YXNvbmFibGUgYW5kIHZhbHVhYmxlLgoKIyMgRXhpc3RpbmcvcmVmZXJlbmNlIHNvbHV0aW9ucwoK UnVieToKCiogW0dlb0tpdDo6TGF0TG5nXShodHRwOi8vd3d3LnJ1Ynlkb2MuaW5mby9naXRodWIv Z2Vva2l0L2dlb2tpdC9tYXN0ZXIvR2Vva2l0L0xhdExuZyk7CiogW1JHZW86OkZlYXR1cmU6OlBv aW50XShodHRwOi8vd3d3LnJ1Ynlkb2MuaW5mby9nZW1zL3JnZW8vUkdlby9GZWF0dXJlL1BvaW50 KSAod2l0aCBzZXZlcmFsICJwcml2YXRlIiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzKTsgUkdlbyBp bXBsZW1lbnRzIGZ1bGwgW09HQyBTaW1wbGUgRmVhdHVyZXNdKGh0dHBzOi8vZW4ud2lraXBlZGlh Lm9yZy93aWtpL1NpbXBsZV9GZWF0dXJlcykgc3BlY2lmaWNhdGlvbiwgc28sIGl0cyBwb2ludHMg aGF2ZSBgemAgYW5kIGBtYCBjb29yZGluYXRlcywgcHJvamVjdGlvbiBhbmQgbXVjaCBtb3JlOwoq IFtHcmF0aWN1bGU6OkxvY2F0aW9uXShodHRwOi8vd3d3LnJ1Ynlkb2MuaW5mby9naXRodWIvY29s bGVjdGl2ZWlkZWEvZ3JhdGljdWxlL0dyYXRpY3VsZS9Mb2NhdGlvbikgKG5vdCBzdHJpY3RseSBh IGBbbGF0LGxuZ11gIHdyYXBwZXIpOwoqIFtSb3NhbWFyeTo6Tm9kZV0oaHR0cDovL3d3dy5ydWJ5 ZG9jLmluZm8vZ2Vtcy9yb3NlbWFyeS8wLjQuNC9Sb3NlbWFyeS9Ob2RlKSAoZm9sbG93cyBuYW1p bmcgY29udmVudGlvbiBvZiB1bmRlcmx5aW5nIE9wZW5TdHJlZXRNYXAgQVBJKTsKCk90aGVyIHNv dXJjZXM6CgoqIFB5dGhvbjogW2dlb3B5LlBvaW50XShodHRwOi8vZ2VvcHkucmVhZHRoZWRvY3Mu b3JnL2VuL2xhdGVzdC8jZ2VvcHkucG9pbnQuUG9pbnQpOwoqIFtFbGFzdGljU2VhcmNoXShodHRw czovL3d3dy5lbGFzdGljLmNvL2Jsb2cvZ2VvLWxvY2F0aW9uLWFuZC1zZWFyY2gpIHVzZXMgaGFz aCB3aXRoICJsYXQiIGFuZCAibG9uIiBrZXlzOwoqIEdvb2dsZSBNYXBzIFtHZW9jb2RpbmcgQVBJ XShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vZ2VvY29k aW5nL2ludHJvI0dlb2NvZGluZ1Jlc3BvbnNlcykgdXNlcyBoYXNoIHdpdGggImxhdCIgYW5kICJs bmciIGtleXM7CiogUG9zdEdJUzogW3ByZXR0eSBjb21wbGljYXRlZF0oaHR0cDovL3Bvc3RnaXMu bmV0L2RvY3MvbWFudWFsLTIuMi91c2luZ19wb3N0Z2lzX2RibWFuYWdlbWVudC5odG1sI1JlZk9i amVjdCkgIGhhcyBfZ2VvbWV0cmljYWxfIChwcm9qZWN0ZWQpIGFuZCBfZ2VvZ3JhcGhpY2FsXyAo bGF0LCBsbmcpIHBvaW50cyBhbmQgc3R1ZmYuCgojIyBEZXNpZ24gZGVjaXNpb25zCgpXaGlsZSBk ZXNpZ25pbmcgYEdlb2AgbGlicmFyeSwgb3VyIHJlZmVyZW5jZSBwb2ludCB3YXMgc3RhbmRhcmQg YFRpbWVgIGNsYXNzIChhbmQsIHRvIGxlc3NlciBleHRlbnQsIGBEYXRlYC9gRGF0ZVRpbWVgKS4g SXQgaGFzIHRoaXMgcmVzcG9uc2liaWxpdGllczoKCiogc3RvcmVzIGRhdGEgaW4gc2ltcGxlIGlu dGVybmFsIGZvcm07CiogaGVscHMgdG8gcGFyc2UgYW5kIGZvcm1hdCBkYXRhIHRvIGFuZCBmcm9t IHN0cmluZ3M7CiogcHJvdmlkZXMgZWFzeSBhY2Nlc3MgdG8gbG9naWNhbCBjb21wb25lbnRzIG9m IGRhdGE7CiogYWxsb3dzIG1vc3Qgc2ltcGxlIGFuZCB1bmFtYmlndW91cyBjYWxjdWxhdGlvbnMu CgoqKk1haW4gdHlwZSBuYW1lKio6IGFzIGZhciBhcyB3ZSBjYW4gc2VlLCB0aGVyZSdzIG5vIGdv b2Qgc2luZ3VsYXIgbmFtZSBmb3IgYChsYXQsIGxuZylgIHBhaXIgY29uY2VwdC4gQXMgbWVudGlv bmVkIGFib3ZlLCB0aGVyZSBjYW4gYmUgc2VlbiBuYW1lcyBsaWtlIGBMYXRMbmdgLCBvciBgTG9j YXRpb25gLCBvciBgUG9pbnRgOyBhbmQgaW4gbmF0dXJhbCBsYW5ndWFnZQpqdXN0ICJjb29yZGlu YXRlcyIgdXNlZCBmcmVxdWVudGx5LiBXZSBwcm9wb3NlIHRoZSBuYW1lIGBDb29yZGAsIHdoaWNo IGlzIHByZXR0eSBzaG9ydCwgZWFzeSB0byByZW1lbWJlciwgZGVtb25zdHJhdGVzIGludGVudGlv bnMgKGFuZCBsb29rcyBsaWtlIHNpbmd1bGFyLCBzbyB5b3UgY2FuIGhhdmUgIm9uZSBjb29yZCBv YmplY3QiIGFuZCAiYXJyYXkgb2YgY29vcmRzIiwKd2hpY2ggaXMgbm90IDEwMCUgbGluZ3Vpc3Rp Y2FsbHkgY29ycmVjdCwgeWV0IGNvbnZlbmllbnQpLiBBbHRlcm5hdGl2ZSBgUG9pbnRgIG5hbWUg c2VlbXMgdG8gYmUgdG9vIGFtYmlnb3VzLCBiZWluZyB1c2VkIGluIG1hbnkgY29udGV4dHMuCgpg R2VvOjpDb29yZGAgb2JqZWN0IGlzICoqaW1tdXRhYmxlKiosIHRoZXJlJ3Mgbm8gc2VtYW50aWNh bCBzZW5zZSBpbiBgbG9jYXRpb24ubGF0aXR1ZGUgPSAuLi5gIG9yIHNvbWV0aGluZyBsaWtlIHRo aXMuCgoqKlVuaXRzKio6IGBHZW9gIGNhbGN1bGF0aW9ucyAoanVzdCBsaWtlIGBUaW1lYCBjYWxj dWxhdGlvbnMpIHByb3ZpZGUgbm8gdW5pdHMgb3B0aW9ucywganVzdCByZXR1cm5pbmcgbnVtYmVy cyBtZWFzdXJlZCBpbiAiZGVmYXVsdCIgdW5pdHM6IG1ldHJlcyBmb3IgZGlzdGFuY2VzIChhcyB0 aGV5IGFyZSBTSSB1bml0KSBhbmQgZGVncmVlcyBmb3IgYXppbXV0aC4gTGF0aXR1ZGUgYW5kIGxv bmdpdHVkZSBhcmUgc3RvcmVkIGluIGRlZ3JlZXMsIGJ1dCByYWRpYW5zIHZhbHVlcyBhY2Nlc3Nv cnMgYXJlIHByb3ZpZGVkIChiZWluZyB3aWRlbHkgdXNlZCBpbiBnZW9kZXN5IG1hdGgpLgoKQWxs IGNvb3JkaW5hdGVzIGFuZCBjYWxjdWxhdGlvbnMgYXJlIHRob3VnaHQgdG8gYmUgaW4gV0dTIDg0 IGNvb3JkaW5hdGVzIHJlZmVyZW5jZSBzeXN0ZW0sIGJlaW5nIGN1cnJlbnQgc3RhbmRhcmQgZm9y IG1hcHMgYW5kIEdQUy4KClRoZXJlJ3MgaW50cm9kdWNlZCAqKmNvbmNlcHQgb2YgZ2xvYmUqKiB1 c2VkIGludGVybmFsbHkgZm9yIGNhbGN1bGF0aW9ucy4gT25seSBnZW5lcmljIChzcGhlcmUpIGFu ZCBFYXJ0aCBnbG9iZXMgYXJlIGltcGxlbWVudGVkLCBidXQgZm9yIDIwMTYgd2UgZmVlbCBsaWtl IGN1cnJlbnQgZGVzaWduIG9mIGJhc2ljIHR5cGVzIHNob3VsZCB0YWtlIGluIGNvbnNpZGVyYXRp b24KcG9zc2liaWxpdHkgb2Ygd3JpdGluZyBSdWJ5IHNjcmlwdHMgZm9yIE1hcnMgbWFwcyBhbmFs eXNpcy4gT25seSBvbmUgZ2VvZGVzeSBmb3JtdWxhIGlzIGltcGxlbWVudGVkIChWaW5jZW50eSwg Z2VuZXJhbGx5IGNvbnNpZGVyZWQgb25lIG9mIHRoZSBtb3N0IHByZWNpc2UpLCBhcyBmb3Igc3Rh bmRhcmQgbGlicmFyeSBjbGFzcyBpdCBjb25zaWRlcmVkIHVubmVjZXNzYXJ5IHRvIHByb3ZpZGUg dXNlciB3aXRoIGdlb2Rlc3kgZm9ybXVsYWUgb3B0aW9ucy4KCk5vICoqbWFwIHByb2plY3Rpb24q KiBtYXRoIHdhcyBhZGRlZCBpbnRvIGN1cnJlbnQgcHJvcG9zYWwsIGJ1dCBpdCBtYXkgYmUgYSBn b29kIGRpcmVjdGlvbiBmb3IgZnVydGhlciB3b3JrLiBObyAqKmVsZXZhdGlvbioqIGRhdGEgY29u c2lkZXJlZCBlaXRoZXIuCgojIyBQcm9wb3NhbCBkZXRhaWxzCgojIyMgYEdlbzo6Q29vcmRgIGNs YXNzCgpSZXByZXNlbnRzIGBbbGF0aXR1ZGUsIGxvbmdpdHVkZV1gIHBhaXIuIExhdGl0dWRlIGlz IC05MCB0byArOTAgKGRlZ3JlZXMpLiBMb25naXR1ZGUgaXMgLTE4MCB0byArMTgwLgoKQ2xhc3Mg bWV0aG9kczoKCiogYG5ldyhsYXQsIGxuZylgIGNyZWF0ZXMgaW5zdGFuY2UgZnJvbSB0d28gTnVt ZXJpY3MgKGluIGRlZ3JlZXMpOwoqIGBuZXcobGF0OiwgbG5nOilgIGtleXdvcmQgYXJndW1lbnRz IGZvcm0gb2YgYWJvdmU7CiogYG5ldyhsYXRkOiwgbGF0bTosIGxhdHM6LCBsYXRoOiwgbG5nZDog bG5nbTosIGxuZ3M6IGxuZ2g6KWAgY3JlYXRlcyBpbnN0YW5jZSBmcm9tIGNvb3JkaW5hdGVzIGlu IChkZWcsIG1pbiwgc2VjLCBoZW1pc3BoZXJlKSBmb3JtOyBoZW1pc3BoZXJlcyBhcmUgIk4iLyJT IiBmb3IgbGF0aXR1ZGUgYW5kICJXIi9FIiBmb3IgbG9uZ2l0dWRlOyBhbnkgY29tcG9uZW50IGV4 Y2VwdCBmb3IgZGVncmVlcyBjYW4gYmUgb21pdHRlZDsgaWYgaGVtaXNwaGVyZSBpcyBvbWl0dGVk LCBpdCBpcyBkZWNpZGVkIGJ5IGRlZ3JlZXMgc2lnbiAobGF0OiBwb3NpdGl2ZSBpcyAiTiIsIGxu ZzogcG9zaXRpdmUgaXMgIkUiKTsKKiBgZnJvbV9oKGhhc2gpYCBjcmVhdGVzIGluc3RhbmNlIGZy b20gaGFzaCB3aXRoIGAibGF0ImAgb3IgYCJsYXRpdHVkZSJgIGtleSBhbmQgYCJsb24iYCBvciBg ImxuZyJgIG9yIGAibG9uZ2l0dWRlImAga2V5IChjYXNlLWluZGVwZW5kZW50KTsKKiBgZnJvbV9y YWRpYW5zKHBoaSwgbGEpYCBjcmVhdGVzIGluc3RhbmNlIGZyb20gcmFkaWFuIHZhbHVlczsKKiBg c3RycGNvb3JkYCBwYXJzZXMgc3RyaW5nIGludG8gY29vcmRpbmF0ZXMgYnkgcHJvdmlkZWQgcGF0 dGVybiAoc2VlIGJlbG93IGZvciBwYXR0ZXJuIGRlc2NyaXB0aW9uKTsKKiBgcGFyc2VfbGxgIHBh cnNlcyBjb29yZGluYXRlcyBzdHJpbmcgaW4gYCJmbG9hdCwgZmxvYXQiYCBmb3JtOwoqIGBwYXJz ZV9kbXNgIHBhcnNlcyBjb29yZGluYXRlcyBzdHJpbmcgaW4gYGQgbSBzIGgsIGQgbSBzIGhgIGZv cm1hdCAoY29uc2lkZXJpbmcgc2V2ZXJhbCB3aWRlbHkgdXNlZCBzeW1ib2xzIGZvciBkZWdyZWVz LCBtaW51dGVzIGFuZCBzZWNvbmRzKTsKKiBgcGFyc2VgIHRyaWVzIHRvIHBhcnNlIHN0cmluZyBp bnRvIGNvb3JkaW5hdGVzIGZyb20gdmFyaW91cyBmb3JtYXRzLgoKSW5zdGFuY2UgbWV0aG9kczoK CiogYGxhdGAgYW5kIGBsbmdgLCByZXR1cm5pbmcgYEZsb2F0YHMsIHNpZ25lZDsKKiBgbGF0aXR1 ZGVgIGFuZCBgbG9uZ2l0dWRlYCBhcyBhbiBhbGlhc2VzOyBgbG9uYCBhcyBhbiBhZGRpdGlvbmFs IGFsaWFzZXMgZm9yIGxvbmdpdHVkZTsKKiBgbGF0ZGAsIGBsYXRtYCwgYGxhdHNgLCBgbGF0aGA6 IGRlZ3JlZSwgbWludXRlLCBzZWNvbmQsIGhlbWlzcGhlcmU7IGBsYXRkYCBhbmQgYGxhdG1gIGFy ZSBgRml4bnVtYCwgYGxhdHNgIGlzIGBGbG9hdGAsIGBsYXRoYCBpcyAiTiIvIlMiOyBhbGwgbnVt YmVycyBhcmUgdW5zaWduZWQ7CiogYGxuZ2RgLCBgbG5nbWAsIGBsbmdzYCwgYGxuZ2hgOiB0aGUg c2FtZSBmb3IgbG9uZ2l0dWRlIChoZW1pc3BoZXJlIGlzICJXIi8iRSIpOwoqIGBsYXRkbXMobm9o ZW1pc3BoZXJlID0gZmFsc2UpYCByZXR1cm5zIGBbbGF0ZCwgbGF0bSwgbGF0cywgbGF0aF1gIHdp dGggYG5vaGVtaXNwaGVyZWAgcGFyYW0gZXF1YWwgdG8gYGZhbHNlYCwgYW5kIGBbwrFsYXRkLCBs YXRtLCBsYXRzXWAgd2l0aCBgdHJ1ZWA7IHNhbWUgd2l0aCBgbG5nZG1zYCBmb3IgbG9uZ2l0dWRl OwoqIGBwaGlgIGFuZCBgz4ZgIGlzIGxhdGl0dWRlIGluIHJhZGlhbnMgKGhlbHBmdWwgZm9yIG1h dGgpLCBgbGFgIG9yIGDOu2AgaXMgbG9uZ2l0dWRlIGluIHJhZGlhbnMgKG5vdCBgbGFtYmRhYCB0 byBub3QgY29uZnVzZSB3aXRoIEtlcm5lbCBtZXRob2QpOwoqIGB0b19zYCByZXR1cm5pbmcgc3Ry aW5nIGxpa2UgIjUwLjAwNDQ0NCwzNi4yMzEzODkiIChnb29kIGZvciBtYXAgVVJMcyBjb25zdHJ1 Y3Rpb24sIGZvciBleGFtcGxlKTsKKiBgdG9faChsYXQ6IDpsYXQsIGxuZzogOmxuZylgIGNvbnZl cnRzIGNvb3JkIHRvIGhhc2ggKHdpdGggZGVzaXJlZCBrZXkgbmFtZXMpOwoqIGB0b19hYCBjb252 ZXJ0cyBjb29yZCB0byBzaW1wbGUgYFtsYXQsIGxuZ11gIHBhaXI7CiogYHN0cmZjb29yZChmb3Jt YXRzdHIpYCBmb3IgY29tcGxleCBjb29yZGluYXRlIGZvcm1hdHRpbmcgKHNlZSBiZWxvdyBmb3Ig Zm9ybWF0IHN0cmluZyBkZXNjcmlwdGlvbik7CiogYGRpc3RhbmNlKG90aGVyKWAgY2FsY3VsYXRl cyBkaXN0YW5jZSB0byBhbm90aGVyIHBvaW50IChpbiBtZXRyZXMpOwoqIGBhemltdXRoKG90aGVy KWAgY2FsY3VsYXRlcyBkaXJlY3Rpb24gdG8gdGFyZ2V0IChpbiBkZWdyZWVzKTsKKiBgZW5kcG9p bnQoZGlyZWN0aW9uLCBhemltdXRoKWAgY2FsY3VsYXRlcyBmaW5hbCBwb2ludCBvZiB0aGUgbGlu ZSBvZiBgZGlzdGFuY2VgIG1ldHJlcyBnb2luZyBpbiBgYXppbXV0aGAgZGlyZWN0aW9uIGZyb20g Y3VycmVudCBwb2ludC4KCiMjIyMgYHN0cnBjb29yZGAvYHN0cmZjb29yZGAKCkV4YW1wbGU6Cgp+ fn5ydWJ5CmtoYXJraXYuc3RyZmNvb3JkKCclbGF0ZHXCsCVsYXRt4oCyJWxhdHPigLMgJWxhdGgs ICVsbmdkdcKwJWxuZ23igLIlbG5nc+KAsyAlbG5naCcpCiMgPT4gIjUwwrAw4oCyMTbigLMgTiwg MzbCsDEz4oCyNTPigLMgRSIKfn5+CgpEaXJlY3RpdmVzOgoKKiBgJWxhdGAgLSBmdWxsIGxhdGl0 dWRlLCBmbG9hdDsgY2FuIGJlIGZvcm1hdHRlZCB3aXRoIG1vcmUgY29udHJvbCBsaWtlIGAlLjRs YXRgIChmb3VyIGRpZ2l0cyBhZnRlciBwb2ludCkgb3IgYCUrbGF0YCAoZXhwbGljaXQgcGx1cyBz aWduIGZvciBwb3NpdGl2ZSBsYXRpdHVkZXMpOwoqIGAlbGF0ZGAgLSBsYXRpdHVkZSBkZWdyZWVz LCB1bnNpZ25lZCwgaW50ZWdlcgoqIGAlbGF0ZHNgIC0gbGF0aXR1ZGUgZGVncmVlcywgc2lnbmVk CiogYCVsYXRtYCAtIGxhdGl0dWRlIG1pbnV0ZXMsIHVuc2lnbmVkLCBpbnRlZ2VyCiogYCVsYXRz YCAtIGxhdGl0dWRlIHNlY29uZHMsIHVuc2lnbmVkLCBpbnRlZ2VyLCBidXQgY2FuIGJlIGZvcm1h dHRlZCBhcyBmbG9hdDogYCUuMmxhdHNgCiogYCVsYXRoYCAtIGxhdGl0dWRlIGhlbWlzcGhlcmUs IG9uZSBsZXR0ZXIgKCJOIi8iUyIpCiogYCVsbmdgLCBgJWxuZ2RgLCBgJWxuZ2RzYCwgYCVsbmdz YCwgYCVsbmdoYCwgYCVsbmdIYCAtIHNhbWUgZm9yIGxvbmdpdHVkZQoqIGAlJWAgbGl0ZXJhbCBg JWAgc2lnbgoKIyMjIEN1cnJlbnQgaW1wbGVtZW50YXRpb24KClByb3Bvc2VkIGltcGxlbWVudGF0 aW9uIGNhbiBiZSBmb3VuZCBhdCBodHRwczovL2dpdGh1Yi5jb20venZlcm9rL2dlb19jb29yZC4K Ckl0IHdhcyBjcmVhdGVkIHdpdGggdGhvdWdodHMgb2Ygc3RhbmRhcmQgbGlicmFyeSwgc28sIGFs bCBkb2NzIGFyZSBpbiBSRG9jIGZvcm1hdCwgYW5kIHRlc3RzL3NwZWNzIGFyZSBpbiBtc3BlYy1j b21wYXRpYmxlIHJzcGVjIGZsYXZvdXIuCgoKCgotLSAKaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5v cmcvCgpVbnN1YnNjcmliZTogPG1haWx0bzpydWJ5LWNvcmUtcmVxdWVzdEBydWJ5LWxhbmcub3Jn P3N1YmplY3Q9dW5zdWJzY3JpYmU+CjxodHRwOi8vbGlzdHMucnVieS1sYW5nLm9yZy9jZ2ktYmlu L21haWxtYW4vb3B0aW9ucy9ydWJ5LWNvcmU+Cg==