From: "Yugui (Yuki Sonoda)" Date: 2008-08-25T18:20:52+09:00 Subject: [ruby-dev:35950] Re: Refactoring of enumerating prime numbers This is a multi-part message in MIME format. --------------030408030902070401080303 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Yuguiです。 keiju ISHITSUKA さんは書きました: > では, 新案待っています(^^; 新しい案を書いてみました。パッチを添付します。 >> 1. Prime::Generator という素数列挙の外部イテレータクラスを作成 >> 1.1. 互換性のため、また内部イテレータの提供者としてPrimeクラスを温存 >> 2. Prime.each は Prime::Generator オブジェクトを呼び出して列挙 >> 3. (optional) Integer.each_primeはPrime.eachに転送 ↑このあたりは第2案のままです。そして、 * ファイル名をlib/prime.rbにしました * Prime.eachがありますが、 > というかですね. クラスは基本として記述子であって, インスタンスではない > です. つまり, 素数全体を表すものもインスタンスであって欲しいです. を受けて、中田さん案のように特異メソッドを持つインスタンスにしました。 * 互換性のためPrime.newが可能で、これは外部イテレータを返します。且つ、 Prime === Prime.new です。 * 中田さんのパッチを取り込んで、素数表の拡大をスレッドセーフにしました。 * ついでにtest/test_prime.rb を足しました。 ご検討を、何卒よろしくお願いします。 -- Yugui http://yugui.jp 私は私をDumpする --------------030408030902070401080303 Content-Type: text/plain; x-mac-type="0"; x-mac-creator="0"; name="prime-refactoring-3.patch" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="prime-refactoring-3.patch" ZGlmZiAtLWdpdCBhL2xpYi9tYXRobi5yYiBiL2xpYi9tYXRobi5yYgppbmRleCBjZTFhY2M5 Li4yYWYyYjgzIDEwMDY0NAotLS0gYS9saWIvbWF0aG4ucmIKKysrIGIvbGliL21hdGhuLnJi CkBAIC0xMiwxMDEgKzEyLDcgQEAKIHJlcXVpcmUgImNvbXBsZXgucmIiCiByZXF1aXJlICJy YXRpb25hbC5yYiIKIHJlcXVpcmUgIm1hdHJpeC5yYiIKLQotY2xhc3MgSW50ZWdlcgotCi0g IGRlZiBJbnRlZ2VyLmZyb21fcHJpbWVfZGl2aXNpb24ocGQpCi0gICAgdmFsdWUgPSAxCi0g ICAgZm9yIHByaW1lLCBpbmRleCBpbiBwZAotICAgICAgdmFsdWUgKj0gcHJpbWUqKmluZGV4 Ci0gICAgZW5kCi0gICAgdmFsdWUKLSAgZW5kCi0gIAotICBkZWYgcHJpbWVfZGl2aXNpb24K LSAgICByYWlzZSBaZXJvRGl2aXNpb25FcnJvciBpZiBzZWxmID09IDAKLSAgICBwcyA9IFBy aW1lLm5ldwotICAgIHZhbHVlID0gc2VsZgotICAgIHB2ID0gW10KLSAgICBmb3IgcHJpbWUg aW4gcHMKLSAgICAgIGNvdW50ID0gMAotICAgICAgd2hpbGUgKHZhbHVlMSwgbW9kID0gdmFs dWUuZGl2bW9kKHByaW1lKQotCSAgICAgbW9kKSA9PSAwCi0JdmFsdWUgPSB2YWx1ZTEKLQlj b3VudCArPSAxCi0gICAgICBlbmQKLSAgICAgIGlmIGNvdW50ICE9IDAKLQlwdi5wdXNoIFtw cmltZSwgY291bnRdCi0gICAgICBlbmQKLSAgICAgIGJyZWFrIGlmIHByaW1lICogcHJpbWUg ID49IHZhbHVlCi0gICAgZW5kCi0gICAgaWYgdmFsdWUgPiAxCi0gICAgICBwdi5wdXNoIFt2 YWx1ZSwgMV0KLSAgICBlbmQKLSAgICByZXR1cm4gcHYKLSAgZW5kCi1lbmQKLSAgCi1jbGFz cyBQcmltZQotICBpbmNsdWRlIEVudW1lcmFibGUKLSAgIyBUaGVzZSBhcmUgaW5jbHVkZWQg YXMgY2xhc3MgdmFyaWFibGVzIHRvIGNhY2hlIHRoZW0gZm9yIGxhdGVyIHVzZXMuICBJZiBt ZW1vcnkKLSAgIyAgIHVzYWdlIGlzIGEgcHJvYmxlbSwgdGhleSBjYW4gYmUgcHV0IGluIFBy aW1lI2luaXRpYWxpemUgYXMgaW5zdGFuY2UgdmFyaWFibGVzLgotCi0gICMgVGhlcmUgbXVz dCBiZSBubyBwcmltZXMgYmV0d2VlbiBAQHByaW1lc1stMV0gYW5kIEBAbmV4dF90b19jaGVj ay4KLSAgQEBwcmltZXMgPSBbMiwgMywgNSwgNywgMTEsIDEzLCAxNywgMTksIDIzLCAyOSwg MzEsIDM3LCA0MSwgNDMsIDQ3LCA1MywgNTksIDYxLCA2NywgNzEsIDczLCA3OSwgODMsIDg5 LCA5NywgMTAxXQotICAjIEBAbmV4dF90b19jaGVjayAlIDYgbXVzdCBiZSAxLiAgCi0gIEBA bmV4dF90b19jaGVjayA9IDEwMyAgICAgICAgICAgICMgQEBwcmltZXNbLTFdIC0gQEBwcmlt ZXNbLTFdICUgNiArIDcKLSAgQEB1bHRpY2hlY2tfaW5kZXggPSAzICAgICAgICAgICAgIyBA QHByaW1lcy5pbmRleChAQHByaW1lcy5yZXZlcnNlLmZpbmQge3xufAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAjICAgbiA8IE1hdGguc3FydChAQG5leHRfdG9fY2hl Y2spIH0pCi0gIEBAdWx0aWNoZWNrX25leHRfc3F1YXJlZCA9IDEyMSAgICMgQEBwcmltZXNb QEB1bHRpY2hlY2tfaW5kZXggKyAxXSAqKiAyCi0KLSAgY2xhc3MgPDwgc2VsZgotICAgICMg UmV0dXJuIHRoZSBwcmltZSBjYWNoZS4KLSAgICBkZWYgY2FjaGUKLSAgICAgIHJldHVybiBA QHByaW1lcwotICAgIGVuZAotICAgIGFsaWFzIHByaW1lcyBjYWNoZQotICAgIGFsaWFzIHBy aW1lc19zb19mYXIgY2FjaGUKLSAgZW5kCi0gIAotICBkZWYgaW5pdGlhbGl6ZQotICAgIEBp bmRleCA9IC0xCi0gIGVuZAotICAKLSAgIyBSZXR1cm4gcHJpbWVzIGdpdmVuIGJ5IHRoaXMg aW5zdGFuY2Ugc28gZmFyLgotICBkZWYgcHJpbWVzCi0gICAgcmV0dXJuIEBAcHJpbWVzWzAs IEBpbmRleCArIDFdCi0gIGVuZAotICBhbGlhcyBwcmltZXNfc29fZmFyIHByaW1lcwotICAK LSAgZGVmIHN1Y2MKLSAgICBAaW5kZXggKz0gMQotICAgIHdoaWxlIEBpbmRleCA+PSBAQHBy aW1lcy5sZW5ndGgKLSAgICAgICMgT25seSBjaGVjayBmb3IgcHJpbWUgZmFjdG9ycyB1cCB0 byB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHBvdGVudGlhbCBwcmltZXMsCi0gICAgICAjICAg YnV0IHdpdGhvdXQgdGhlIHBlcmZvcm1hbmNlIGhpdCBvZiBhbiBhY3R1YWwgc3F1YXJlIHJv b3QgY2FsY3VsYXRpb24uCi0gICAgICBpZiBAQG5leHRfdG9fY2hlY2sgKyA0ID4gQEB1bHRp Y2hlY2tfbmV4dF9zcXVhcmVkCi0gICAgICAgIEBAdWx0aWNoZWNrX2luZGV4ICs9IDEKLSAg ICAgICAgQEB1bHRpY2hlY2tfbmV4dF9zcXVhcmVkID0gQEBwcmltZXMuYXQoQEB1bHRpY2hl Y2tfaW5kZXggKyAxKSAqKiAyCi0gICAgICBlbmQKLSAgICAgICMgT25seSBjaGVjayBudW1i ZXJzIGNvbmdydWVudCB0byBvbmUgYW5kIGZpdmUsIG1vZHVsbyBzaXguIEFsbCBvdGhlcnMK LSAgICAgICMgICBhcmUgZGl2aXNpYmxlIGJ5IHR3byBvciB0aHJlZS4gIFRoaXMgYWxzbyBh bGxvd3MgdXMgdG8gc2tpcCBjaGVja2luZyBhZ2FpbnN0Ci0gICAgICAjICAgdHdvIGFuZCB0 aHJlZS4KLSAgICAgIEBAcHJpbWVzLnB1c2ggQEBuZXh0X3RvX2NoZWNrIGlmIEBAcHJpbWVz WzIuLkBAdWx0aWNoZWNrX2luZGV4XS5maW5kIHt8cHJpbWV8IEBAbmV4dF90b19jaGVjayAl IHByaW1lID09IDAgfS5uaWw/Ci0gICAgICBAQG5leHRfdG9fY2hlY2sgKz0gNAotICAgICAg QEBwcmltZXMucHVzaCBAQG5leHRfdG9fY2hlY2sgaWYgQEBwcmltZXNbMi4uQEB1bHRpY2hl Y2tfaW5kZXhdLmZpbmQge3xwcmltZXwgQEBuZXh0X3RvX2NoZWNrICUgcHJpbWUgPT0gMCB9 Lm5pbD8KLSAgICAgIEBAbmV4dF90b19jaGVjayArPSAyIAotICAgIGVuZAotICAgIHJldHVy biBAQHByaW1lc1tAaW5kZXhdCi0gIGVuZAotICBhbGlhcyBuZXh0IHN1Y2MKLQotICBkZWYg ZWFjaAotICAgIHJldHVybiB0b19lbnVtKDplYWNoKSB1bmxlc3MgYmxvY2tfZ2l2ZW4/Ci0g ICAgbG9vcCBkbwotICAgICAgeWllbGQgc3VjYwotICAgIGVuZAotICBlbmQKLWVuZAorcmVx dWlyZSAicHJpbWUucmIiCiAKIGNsYXNzIEZpeG51bQogICByZW1vdmVfbWV0aG9kIDovCmRp ZmYgLS1naXQgYS9saWIvcHJpbWUucmIgYi9saWIvcHJpbWUucmIKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uMjllZTBlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9w cmltZS5yYgpAQCAtMCwwICsxLDEyNyBAQAorY2xhc3MgSW50ZWdlcgorCisgIGRlZiBJbnRl Z2VyLmZyb21fcHJpbWVfZGl2aXNpb24ocGQpCisgICAgdmFsdWUgPSAxCisgICAgZm9yIHBy aW1lLCBpbmRleCBpbiBwZAorICAgICAgdmFsdWUgKj0gcHJpbWUqKmluZGV4CisgICAgZW5k CisgICAgdmFsdWUKKyAgZW5kCisgIAorICBkZWYgcHJpbWVfZGl2aXNpb24KKyAgICByYWlz ZSBaZXJvRGl2aXNpb25FcnJvciBpZiBzZWxmID09IDAKKyAgICB2YWx1ZSA9IHNlbGYKKyAg ICBwdiA9IFtdCisgICAgZm9yIHByaW1lIGluIFByaW1lCisgICAgICBjb3VudCA9IDAKKyAg ICAgIHdoaWxlICh2YWx1ZTEsIG1vZCA9IHZhbHVlLmRpdm1vZChwcmltZSkKKwkgICAgIG1v ZCkgPT0gMAorCXZhbHVlID0gdmFsdWUxCisJY291bnQgKz0gMQorICAgICAgZW5kCisgICAg ICBpZiBjb3VudCAhPSAwCisJcHYucHVzaCBbcHJpbWUsIGNvdW50XQorICAgICAgZW5kCisg ICAgICBicmVhayBpZiBwcmltZSAqIHByaW1lICA+PSB2YWx1ZQorICAgIGVuZAorICAgIGlm IHZhbHVlID4gMQorICAgICAgcHYucHVzaCBbdmFsdWUsIDFdCisgICAgZW5kCisgICAgcmV0 dXJuIHB2CisgIGVuZAorCisgIGRlZiBJbnRlZ2VyLmVhY2hfcHJpbWUoJnByb2MpCisgICAg UHJpbWUuZWFjaCgmcHJvYykKKyAgZW5kCitlbmQKKworY2xhc3MgPDwgKFByaW1lID0gT2Jq ZWN0Lm5ldykKKyAgaW5jbHVkZSBFbnVtZXJhYmxlCisKKyAgZGVmIG5ldworICAgIHdhcm4o IlByaW1lIGNsYXNzIGlzIG9ic29sZXRlLiB1c2UgUHJpbWU6OmVhY2guIikKKyAgICByZXR1 cm4gR2VuZXJhdG9yLm5ldworICBlbmQKKworICBkZWYgPT09KHJocykKKyAgICByZXR1cm4g UHJpbWUuZXF1YWw/KHJocykgfHwgR2VuZXJhdG9yID09PSByaHMKKyAgZW5kCisKKyAgZGVm IGVhY2goJnByb2MpCisgICAgR2VuZXJhdG9yLm5ldy5lYWNoKCZwcm9jKQorICBlbmQKKwor ICAjIFJldHVybiB0aGUgcHJpbWUgY2FjaGUuCisgIGRlZiBjYWNoZQorICAgIEdlbmVyYXRv ci5jYWNoZQorICBlbmQKKyAgYWxpYXMgcHJpbWVzIGNhY2hlCisgIGFsaWFzIHByaW1lc19z b19mYXIgY2FjaGUKKworICBjbGFzcyBHZW5lcmF0b3IKKyAgICBpbmNsdWRlIEVudW1lcmFi bGUKKyAgICAjIFRoZXNlIGFyZSBpbmNsdWRlZCBhcyBjbGFzcyB2YXJpYWJsZXMgdG8gY2Fj aGUgdGhlbSBmb3IgbGF0ZXIgdXNlcy4gIElmIG1lbW9yeQorICAgICMgICB1c2FnZSBpcyBh IHByb2JsZW0sIHRoZXkgY2FuIGJlIHB1dCBpbiBQcmltZSNpbml0aWFsaXplIGFzIGluc3Rh bmNlIHZhcmlhYmxlcy4KKworICAgICMgVGhlcmUgbXVzdCBiZSBubyBwcmltZXMgYmV0d2Vl biBAQHByaW1lc1stMV0gYW5kIEBAbmV4dF90b19jaGVjay4KKyAgICBAQHByaW1lcyA9IFsy LCAzLCA1LCA3LCAxMSwgMTMsIDE3LCAxOSwgMjMsIDI5LCAzMSwgMzcsIDQxLCA0MywgNDcs IDUzLCA1OSwgNjEsIDY3LCA3MSwgNzMsIDc5LCA4MywgODksIDk3LCAxMDFdCisgICAgIyBA QG5leHRfdG9fY2hlY2sgJSA2IG11c3QgYmUgMS4gIAorICAgIEBAbmV4dF90b19jaGVjayA9 IDEwMyAgICAgICAgICAgICMgQEBwcmltZXNbLTFdIC0gQEBwcmltZXNbLTFdICUgNiArIDcK KyAgICBAQHVsdGljaGVja19pbmRleCA9IDMgICAgICAgICAgICAjIEBAcHJpbWVzLmluZGV4 KEBAcHJpbWVzLnJldmVyc2UuZmluZCB7fG58CisgICAgIyAgIG4gPCBNYXRoLnNxcnQoQEBu ZXh0X3RvX2NoZWNrKSB9KQorICAgIEBAdWx0aWNoZWNrX25leHRfc3F1YXJlZCA9IDEyMSAg ICMgQEBwcmltZXNbQEB1bHRpY2hlY2tfaW5kZXggKyAxXSAqKiAyCisgICAgQEBsb2NrID0g TXV0ZXgubmV3CisKKworICAgICMgUmV0dXJuIHRoZSBwcmltZSBjYWNoZS4KKyAgICBkZWYg c2VsZi5jYWNoZQorICAgICAgcmV0dXJuIEBAcHJpbWVzCisgICAgZW5kCisKKyAgICBkZWYg aW5pdGlhbGl6ZQorICAgICAgQGluZGV4ID0gLTEKKyAgICBlbmQKKworICAgICMgUmV0dXJu IHByaW1lcyBnaXZlbiBieSB0aGlzIGluc3RhbmNlIHNvIGZhci4KKyAgICBkZWYgcHJpbWVz CisgICAgICByZXR1cm4gQEBwcmltZXNbMCwgQGluZGV4ICsgMV0KKyAgICBlbmQKKyAgICBh bGlhcyBwcmltZXNfc29fZmFyIHByaW1lcworCisgICAgZGVmIHN1Y2MKKyAgICAgIEBpbmRl eCArPSAxCisgICAgICBpZiBAaW5kZXggPj0gQEBwcmltZXMubGVuZ3RoCisJQEBsb2NrLnN5 bmNocm9uaXplIGRvCisJICB3aGlsZSBAaW5kZXggPj0gQEBwcmltZXMubGVuZ3RoCisJICAg ICMgT25seSBjaGVjayBmb3IgcHJpbWUgZmFjdG9ycyB1cCB0byB0aGUgc3F1YXJlIHJvb3Qg b2YgdGhlIHBvdGVudGlhbCBwcmltZXMsCisJICAgICMgICBidXQgd2l0aG91dCB0aGUgcGVy Zm9ybWFuY2UgaGl0IG9mIGFuIGFjdHVhbCBzcXVhcmUgcm9vdCBjYWxjdWxhdGlvbi4KKwkg ICAgaWYgQEBuZXh0X3RvX2NoZWNrICsgNCA+IEBAdWx0aWNoZWNrX25leHRfc3F1YXJlZAor CSAgICAgIEBAdWx0aWNoZWNrX2luZGV4ICs9IDEKKwkgICAgICBAQHVsdGljaGVja19uZXh0 X3NxdWFyZWQgPSBAQHByaW1lcy5hdChAQHVsdGljaGVja19pbmRleCArIDEpICoqIDIKKwkg ICAgZW5kCisJICAgICMgT25seSBjaGVjayBudW1iZXJzIGNvbmdydWVudCB0byBvbmUgYW5k IGZpdmUsIG1vZHVsbyBzaXguIEFsbCBvdGhlcnMKKwkgICAgIyAgIGFyZSBkaXZpc2libGUg YnkgdHdvIG9yIHRocmVlLiAgVGhpcyBhbHNvIGFsbG93cyB1cyB0byBza2lwIGNoZWNraW5n IGFnYWluc3QKKwkgICAgIyAgIHR3byBhbmQgdGhyZWUuCisJICAgIEBAcHJpbWVzLnB1c2gg QEBuZXh0X3RvX2NoZWNrIGlmIEBAcHJpbWVzWzIuLkBAdWx0aWNoZWNrX2luZGV4XS5maW5k IHt8cHJpbWV8IEBAbmV4dF90b19jaGVjayAlIHByaW1lID09IDAgfS5uaWw/CisJICAgIEBA bmV4dF90b19jaGVjayArPSA0CisJICAgIEBAcHJpbWVzLnB1c2ggQEBuZXh0X3RvX2NoZWNr IGlmIEBAcHJpbWVzWzIuLkBAdWx0aWNoZWNrX2luZGV4XS5maW5kIHt8cHJpbWV8IEBAbmV4 dF90b19jaGVjayAlIHByaW1lID09IDAgfS5uaWw/CisJICAgIEBAbmV4dF90b19jaGVjayAr PSAyIAorCSAgZW5kCisJZW5kCisgICAgICBlbmQKKyAgICAgIHJldHVybiBAQHByaW1lc1tA aW5kZXhdCisgICAgZW5kCisgICAgYWxpYXMgbmV4dCBzdWNjCisKKyAgICBkZWYgZWFjaAor ICAgICAgcmV0dXJuIHNlbGYuZHVwIHVubGVzcyBibG9ja19naXZlbj8KKyAgICAgIGxvb3Ag ZG8KKwl5aWVsZCBzdWNjCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBhbGlhcyB3aXRoX2lu ZGV4IGVhY2hfd2l0aF9pbmRleAorICAgIGRlZiByZXdpbmQKKyAgICAgIEBpbmRleCA9IC0x CisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS90ZXN0L3Rlc3RfcHJpbWUucmIg Yi90ZXN0L3Rlc3RfcHJpbWUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MC4uOTM2MzRiMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdGVzdF9wcmltZS5yYgpAQCAt MCwwICsxLDExMSBAQAorcmVxdWlyZSAndGVzdC91bml0JworcmVxdWlyZSAncHJpbWUnCity ZXF1aXJlICdzdHJpbmdpbycKKworY2xhc3MgVGVzdFByaW1lIDwgVGVzdDo6VW5pdDo6VGVz dENhc2UKKyAgIyBUaGUgZmlyc3QgMTAwIHByaW1lIG51bWJlcnMKKyAgUFJJTUVTID0gWwor ICAgIDIsIDMsIDUsIDcsIDExLCAxMywgMTcsIDE5LCAyMywgMjksIDMxLCAzNywKKyAgICA0 MSwgNDMsIDQ3LCA1MywgNTksIDYxLCA2NywgNzEsIDczLCA3OSwgODMsIAorICAgIDg5LCA5 NywgMTAxLCAxMDMsIDEwNywgMTA5LCAxMTMsIDEyNywgMTMxLCAKKyAgICAxMzcsIDEzOSwg MTQ5LCAxNTEsIDE1NywgMTYzLCAxNjcsIDE3MywgMTc5LCAKKyAgICAxODEsIDE5MSwgMTkz LCAxOTcsIDE5OSwgMjExLCAyMjMsIDIyNywgMjI5LCAKKyAgICAyMzMsIDIzOSwgMjQxLCAy NTEsIDI1NywgMjYzLCAyNjksIDI3MSwgMjc3LCAKKyAgICAyODEsIDI4MywgMjkzLCAzMDcs IDMxMSwgMzEzLCAzMTcsIDMzMSwgMzM3LCAKKyAgICAzNDcsIDM0OSwgMzUzLCAzNTksIDM2 NywgMzczLCAzNzksIDM4MywgMzg5LCAKKyAgICAzOTcsIDQwMSwgNDA5LCA0MTksIDQyMSwg NDMxLCA0MzMsIDQzOSwgNDQzLCAKKyAgICA0NDksIDQ1NywgNDYxLCA0NjMsIDQ2NywgNDc5 LCA0ODcsIDQ5MSwgNDk5LCAKKyAgICA1MDMsIDUwOSwgNTIxLCA1MjMsIDU0MSwKKyAgXQor ICBkZWYgdGVzdF9lYWNoCisgICAgcHJpbWVzID0gW10KKyAgICBQcmltZS5lYWNoIGRvIHxw fAorICAgICAgYnJlYWsgaWYgcCA+PSAxMDAKKyAgICAgIHByaW1lcyA8PCBwCisgICAgZW5k CisgICAgIyBccGkoMTAwKSA9PSAyNQorICAgIGFzc2VydF9lcXVhbCBQUklNRVNbMCwgMjVd LCBwcmltZXMgCisgICAgYXNzZXJ0IFByaW1lLmNhY2hlLmxlbmd0aCA+PSAyNQorICBlbmQK KworICBkZWYgdGVzdF9lYWNoX2J5X3ByaW1lX251bWJlcl90aGVvcmVtCisgICAgMy51cHRv KDE1KSBkbyB8aXwKKyAgICAgIG1heCA9IDIqKmkKKyAgICAgIHByaW1lcyA9IFtdCisgICAg ICBQcmltZS5lYWNoIGRvIHxwfAorICAgICAgICBicmVhayBpZiBwID49IG1heAorICAgICAg ICBwcmltZXMgPDwgcAorICAgICAgZW5kCisKKyAgICAgICMgUHJpbWUgbnVtYmVyIHRoZW9y ZW0KKyAgICAgIGFzc2VydCBwcmltZXMubGVuZ3RoID49IG1heC9NYXRoLmxvZyhtYXgpICAK KyAgICAgIGFzc2VydCBwcmltZXMubGVuZ3RoIDw9ICgyLi5tYXgpLnN0ZXAoMC4xKS5pbmpl Y3QoMCl7fHN1bSx4fCBzdW0gKyAwLjEgLyBNYXRoLmxvZyh4KX0gIyBMaSh4KQorCisgICAg ICBhc3NlcnQgUHJpbWUuY2FjaGUubGVuZ3RoID49IHByaW1lcy5sZW5ndGgKKyAgICBlbmQK KyAgZW5kCisKKyAgZGVmIHRlc3RfZWFjaF93aXRob3V0X2Jsb2NrCisgICAgZW51bSA9IFBy aW1lLmVhY2gKKyAgICBhc3NlcnQgZW51bS5yZXNwb25kX3RvPyg6ZWFjaCkKKyAgICBhc3Nl cnQgZW51bS5raW5kX29mPyhFbnVtZXJhYmxlKQorICAgIGFzc2VydCBlbnVtLnJlc3BvbmRf dG8/KDp3aXRoX2luZGV4KQorICAgIGFzc2VydCBlbnVtLnJlc3BvbmRfdG8/KDpuZXh0KQor ICAgIGFzc2VydCBlbnVtLnJlc3BvbmRfdG8/KDpzdWNjKQorICAgIGFzc2VydCBlbnVtLnJl c3BvbmRfdG8/KDpyZXdpbmQpCisgIGVuZAorCisgIGRlZiB0ZXN0X25ldworICAgIGJ1ZiA9 IFN0cmluZ0lPLm5ldygnJywgJ3cnKQorICAgIG9yaWcsICRzdGRlcnIgPSAkc3RkZXJyLCBi dWYKKworICAgIGVudW0gPSBQcmltZS5uZXcKKyAgICBhc3NlcnQgIWJ1Zi5zdHJpbmcuZW1w dHk/CisgICAgJHN0ZGVyciA9IG9yaWcKKworICAgIGFzc2VydCBlbnVtLnJlc3BvbmRfdG8/ KDplYWNoKQorICAgIGFzc2VydCBlbnVtLmtpbmRfb2Y/KEVudW1lcmFibGUpCisgICAgYXNz ZXJ0IGVudW0ucmVzcG9uZF90bz8oOndpdGhfaW5kZXgpCisgICAgYXNzZXJ0IGVudW0ucmVz cG9uZF90bz8oOm5leHQpCisgICAgYXNzZXJ0IGVudW0ucmVzcG9uZF90bz8oOnN1Y2MpCisg ICAgYXNzZXJ0IGVudW0ucmVzcG9uZF90bz8oOnJld2luZCkKKworICAgIGFzc2VydCBQcmlt ZSA9PT0gZW51bQorICBlbnN1cmUKKyAgICAkc3RkZXJyID0gb3JpZworICBlbmQKKworICBk ZWYgdGVzdF9lcXEKKyAgICBhc3NlcnQgUHJpbWUgPT09IFByaW1lCisgIGVuZAorCisgIGRl ZiB0ZXN0X2VudW1lcmF0b3Jfc3VjYworICAgIGVudW0gPSBQcmltZS5lYWNoCisgICAgYXNz ZXJ0X2VxdWFsIFBSSU1FU1swLCA1MF0sIDUwLnRpbWVzLm1hcHsgZW51bS5zdWNjIH0KKyAg ICBhc3NlcnRfZXF1YWwgUFJJTUVTWzUwLCA1MF0sIDUwLnRpbWVzLm1hcHsgZW51bS5zdWNj IH0KKyAgICBlbnVtLnJld2luZAorICAgIGFzc2VydF9lcXVhbCBQUklNRVNbMCwgMTAwXSwg MTAwLnRpbWVzLm1hcHsgZW51bS5zdWNjIH0KKyAgZW5kCisKKyAgZGVmIHRlc3RfZW51bWVy YXRvcl93aXRoX2luZGV4CisgICAgZW51bSA9IFByaW1lLmVhY2gKKyAgICBsYXN0ID0gLTEK KyAgICBlbnVtLndpdGhfaW5kZXggZG8gfHAsaXwKKyAgICAgIGJyZWFrIGlmIGkgPj0gMTAw CisgICAgICBhc3NlcnRfZXF1YWwgbGFzdCsxLCBpCisgICAgICBhc3NlcnRfZXF1YWwgUFJJ TUVTW2ldLCBwCisgICAgICBsYXN0ID0gaQorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBU ZXN0SW50ZWdlciA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCisgICAgZGVmIHRlc3RfcHJpbWVf ZGl2aXNpb24KKyAgICAgIHBkID0gUFJJTUVTLmluamVjdCgmOiopLnByaW1lX2RpdmlzaW9u CisgICAgICBhc3NlcnRfZXF1YWwgUFJJTUVTLm1hcHt8cHwgW3AsIDFdfSwgcGQKKyAgICBl bmQKKworICAgIGRlZiB0ZXN0X2Zyb21fcHJpbWVfZGl2aXNpb24KKyAgICAgIGFzc2VydF9l cXVhbCBQUklNRVMuaW5qZWN0KCY6KiksIEludGVnZXIuZnJvbV9wcmltZV9kaXZpc2lvbihQ UklNRVMubWFwe3xwfCBbcCwxXX0pCisgICAgZW5kCisgIGVuZAorZW5kCg== --------------030408030902070401080303--