------ art_15873_11735180.1181694401377 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline On 6/12/07, NAKAMURA, Hiroshi <nakahiro / sarion.co.jp> wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Hi all, > > # Especially to Technorama Ltd. > > We're discussing about introducing Random class for PRNG on ruby-dev ML. > > * current rand and srand changes global state. it should be the > source of a security problem sooner or later in this "framework" era. > (I claimed) > * Mats agreed to introduce a class for PRNG based on current Mersenne > Twister implementation. class name is "Random". > * no plan to introduce another PRNG based on other PRNG algorithm. > MT is the only PRNG engine for "Random". > * we're now discussing what methods "Random" should have. > > Here's my proposal (no agreement for now); > > Random#integer(max) > Ramdom#bytes(size) > Random#float # same as Random#rand(0). not needed? > Random#rand(max ) > Random#srand(seed il) > Random#seed eed il) # same as Random#srand(seed) > > Random.rand(max ) # calls Random#rand(max) of the singleton Random > # object which is initialized with the current > # srand(). > > rand(max il) # calls Random.rand(max) > srand() # srand() now takes no argument for 1.9. > > Comments needed. Will it be core or standard? If we need to require 'random', then I might suggest adding additional convenience methods. Attached is a collection of such methods. Some can be especially useful, like Array#shuffle. T. ------ art_15873_11735180.1181694401377 Content-Type: application/x-extension-rb; name=random.rb Content-Transfer-Encoding: base64 X-Attachment-Id: f_f2v2k8rw Content-Disposition: attachment; filename="random.rb" IyA9IEZJTEUKIyAgIHJhbmRvbS5yYgojCiMgPSBERVNDUklQVElPTgojICAgUmFuZG9taXphdGlv biBtZXRob2RzLgojCiMgPSBDUkVESVRTCiMgICBDUkVESVQgSWxtYXJpIEhlaWtraW5lbiA8bWFp bHRvOmtpZ0BtaXNmaXJpbmcubmV0PgojICAgQ1JFRElUIENocmlzdGlhbiBOZXVraXJjaGVuIDxt YWlsdG86Y2huZXVraXJjaGVuQGdtYWlsLmNvbT4KCgpyZXF1aXJlICdmYWNldHMvcGF0dGVybnMn CgoKbW9kdWxlIEtlcm5lbAoKICAjIFJhbmRvbSBnZW5lcmF0b3IgdGhhdCByZXR1cm5zIHRydWUg b3IgZmFsc2UuIAogICMgQ2FuIGFsc28gdGFrZSBhIGJsb2NrIHRoYXQgaGFzIGEgNTAvNTAgY2hh bmNlIHRvIGJlaW5nIGV4ZWN1dGVkLgogICMKICAjICAgbWF5YmUgICM9PiB0cnVlCiAgIyAgIG1h eWJlICAjPT4gZmFsc2UKICAjCiAgZGVmIG1heWJlKGNoYW5jZSA9IDAuNSwgJmJsb2NrKQogICAg aWYgYmxvY2sgdGhlbgogICAgICB5aWVsZCBpZiByYW5kIDwgY2hhbmNlCiAgICBlbHNlCiAgICAg IHJhbmQgPCBjaGFuY2UKICAgIGVuZAogIGVuZAoKZW5kCgoKY2xhc3MgQXJyYXkKCiAgIyBSZXR1 cm4gYSByYW5kb20gZWxlbWVudCBvZiB0aGUgYXJyYXkuCiAgIwogICMgICBbMSwgMiwgMywgNF0u YXRfcmFuZCAgICAgICAgICAgIz0+IDIKICAjICAgWzEsIDIsIDMsIDRdLmF0X3JhbmQgICAgICAg ICAgICM9PiA0CiAgIwogIGRlZiBhdF9yYW5kCiAgICBzZWxmLmF0KCByYW5kKCBzaXplICkgKQog IGVuZAoKICAjIFNhbWUgYXMgI2F0X3JhbmQsIGJ1dCBhY3RzIGluIHBsYWNlIHJlbW92aW5nIGEK ICAjIHJhbmRvbSBlbGVtZW50IGZyb20gdGhlIGFycmF5LgogICMKICAjICAgYSA9IFsxLDIsMyw0 XQogICMgICBhLmF0X3JhbmQhICAgICAgICM9PiAyCiAgIyAgIGEgICAgICAgICAgICAgICAgIz0+ IFsxLDMsNF0KICAjCiAgZGVmIGF0X3JhbmQhCiAgICByZXR1cm4gZGVsZXRlX2F0KCBLZXJuZWwu cmFuZCggc2l6ZSApICkKICBlbmQKCiAgIyBTaW1pbGFyIHRvICNhdF9yYW5kLCBidXQgd2lsbCBy ZXR1cm4gYW4gYXJyYXkgb2YgcmFuZG9tbHkKICAjIHBpY2tlZCBleGNsdXNpdmUgZWxlbWVudHMg aWYgZ2l2ZW4gYSBudW1iZXIuCiAgZGVmIHBpY2sobj1uaWwpCiAgICBpZiBuCiAgICAgIGEgPSBz ZWxmLmR1cAogICAgICBhLnBpY2shKG4pCiAgICBlbHNlCiAgICAgIGF0KCBLZXJuZWwucmFuZCgg c2l6ZSApICkKICAgIGVuZAogIGVuZAoKICAjIFNpbWlsYXIgdG8gI2F0X3JhbmQhLCBidXQgZ2l2 ZW4gYSBudW1iZXIgd2lsbCByZXR1cm4KICAjIGFuIGFycmF5IG9mIGV4Y2x1c2l2ZSBlbGVtZW50 cy4KICBkZWYgcGljayEobj1uaWwpCiAgICBpZiBuCiAgICAgIGlmIG4gPiBzZWxmLnNpemUKICAg ICAgICByID0gc2VsZi5kdXAKICAgICAgICBzZWxmLnJlcGxhY2UoW10pCiAgICAgICAgcgogICAg ICBlbHNlCiAgICAgICAgciA9IFtdCiAgICAgICAgbi50aW1lcyB7IHIgPDwgZGVsZXRlX2F0KCBL ZXJuZWwucmFuZCggc2l6ZSApICkgfQogICAgICAgIHIKICAgICAgZW5kCiAgICBlbHNlCiAgICAg IGRlbGV0ZV9hdCggS2VybmVsLnJhbmQoIHNpemUgKSApCiAgICBlbmQKICBlbmQKCiAgIyBSYW5k b20gaW5kZXguCiAgIwogIGRlZiByYW5kX2luZGV4CiAgICByYW5kKCBzaXplICkKICBlbmQKCiAg IyBSZXR1cm5zIGEgcmFuZG9tIHN1YnNldCBvZiBhbiBBcnJheS4gSWYgYSBfbnVtYmVyXwogICMg b2YgZWxlbWVudHMgaXMgc3BlY2lmaWVkIHRoZW4gcmV0dXJucyB0aGF0IG51bWJlciBvZgogICMg ZWxlbWVudHMsIG90aGVyd2lzZSByZXR1cm5zIGEgcmFuZG9tIG51bWJlciBvZiBlbGVtZW50cwog ICMgdXB0byB0aGUgc2l6ZSBvZiB0aGUgQXJyYXkuCiAgIwogICMgQnkgZGVmdWFsdCB0aGUgcmV0 dXJuZWQgdmFsdWVzIGFyZSBleGNsdXNpdmUgb2YKICAjIGVhY2ggb3RoZXIsIGJ1dCBpZiBfZXhj bHVzaXZlXyBpcyBzZXQgdG8gPHR0PmZhbHNlPC90dD4sCiAgIyB0aGUgc2FtZSB2YWx1ZXMgY2Fu IGJlIGNob29zZW4gbW9yZSB0aGFuIG9uY2UuCiAgIwogICMgV2hlbiBfZXhjbHVzaXZlXyBpcyA8 dHQ+dHJ1ZTwvdHQ+ICh0aGUgZGVmYXVsdCkgYW5kIHRoZQogICMgX251bWJlcl8gZ2l2ZW4gaXMg Z3JlYXRlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBhcnJheSwKICAjIHRoZW4gYWxsIHZhbHVlcyBh cmUgcmV0dXJuZWQuCiAgIwogICMgICBbMSwgMiwgMywgNF0ucmFuZF9zdWJzZXQoMSkgICAgICAg ICM9PiBbMl0KICAjICAgWzEsIDIsIDMsIDRdLnJhbmRfc3Vic2V0KDQpICAgICAgICAjPT4gWzIs IDEsIDMsIDRdCiAgIyAgIFsxLCAyLCAzLCA0XS5yYW5kX3N1YnNldCAgICAgICAgICAgIz0+IFsx LCAzLCA0XQogICMgICBbMSwgMiwgMywgNF0ucmFuZF9zdWJzZXQgICAgICAgICAgICM9PiBbMiwg M10KICAjCiAgZGVmIHJhbmRfc3Vic2V0KCBudW1iZXI9bmlsLCBleGNsdXNpdmU9dHJ1ZSApCiAg ICBudW1iZXIgPSByYW5kKCBzaXplICkgdW5sZXNzIG51bWJlcgogICAgbnVtYmVyID0gbnVtYmVy LnRvX2ludAogICAgI3JldHVybiBzZWxmLmR1cCBpZiAobnVtYmVyID49IHNpemUgYW5kIGV4bHVz aXZlKQogICAgcmV0dXJuIHNvcnRfYnl7cmFuZH0uc2xpY2UoMCxudW1iZXIpIGlmIGV4Y2x1c2l2 ZQogICAgcmkgPVtdOyBudW1iZXIudGltZXMgeyB8bnwgcmkgPDwgcmFuZCggc2l6ZSApIH0KICAg IHJldHVybiB2YWx1ZXNfYXQoKnJpKQogIGVuZAoKICAjIFJhbmRvbWl6ZSB0aGUgb3JkZXIgb2Yg YW4gYXJyYXkuCiAgIwogICMgICBbMSwyLDMsNF0uc2h1ZmZsZSAgIz0+IFsyLDQsMSwzXQogICMK ICBkZWYgc2h1ZmZsZQogICAgZHVwLnNodWZmbGUhCiAgICAjc29ydF9ieXtLZXJuZWwucmFuZH0K ICBlbmQKCiAgIyBDUkVESVQgTmllbCBTcHJpbmcKCiAgIyBBcyB3aXRoICNzaHVmZmxlIGJ1dCBt b2RpZmllcyB0aGUgYXJyYXkgaW4gcGxhY2UuCiAgIyBUaGUgYWxnb3JpdGhtIHVzZWQgaGVyZSBp cyBrbm93biBhcyBhIEZpc2hlci1ZYXRlcyBzaHVmZmxlLgogICMKICAjICAgYSA9IFsxLDIsMyw0 XQogICMgICBhLnNodWZmbGUhCiAgIyAgIGEgICM9PiBbMiw0LDEsM10KICAjCiAgZGVmIHNodWZm bGUhCiAgICBzID0gc2l6ZQogICAgZWFjaF9pbmRleCBkbyB8anwKICAgICAgaSA9IEtlcm5lbC5y YW5kKHMtaikKICAgICAgI3NlbGZbal0sIHNlbGZbaitpXSA9IHNlbGZbaitpXSwgc2VsZltqXQog ICAgICB0bXAgPSBzZWxmW2pdCiAgICAgIHNlbGZbal0gPSBzZWxmW2oraV0KICAgICAgc2VsZltq K2ldID0gdG1wCiAgICBlbmQKICAgIHNlbGYKICBlbmQKCmVuZAoKCnJlcXVpcmUgJ2ZhY2V0cy9j b3JlL2hhc2gvc2VsZi96aXBuZXcnCgpjbGFzcyBIYXNoCgogICMgUmV0dXJucyBhIHJhbmRvbSBr ZXkuCiAgIwogICMgICB7Om9uZSA9PiAxLCA6dHdvID0+IDIsIDp0aHJlZSA9PiAzfS5waWNrX2tl eSAgIz0+IDp0aHJlZQogICMKICBkZWYgcmFuZF9rZXkKICAgIGtleXMuYXQoIHJhbmQoa2V5cy5z aXplKSApCiAgZW5kCgogICMgRGVsZXRlIGEgcmFuZG9tIGtleS12YWx1ZSBwYWlyLCByZXR1cm5p bmcgdGhlIGtleS4KICAjCiAgIyAgIGEgPSB7Om9uZSA9PiAxLCA6dHdvID0+IDIsIDp0aHJlZSA9 PiAzfQogICMgICBhLnBpY2tfa2V5ISAgIz0+IDp0d28KICAjICAgYSAgICAgICAgICAgICM9PiB7 Om9uZSA9PiAxLCA6dGhyZWUgPT4gM30KICAjCiAgZGVmIHJhbmRfa2V5IQogICAgayx2ID0gcmFu ZF9wYWlyCiAgICBkZWxldGUoIGsgKQogICAgcmV0dXJuIGsKICBlbmQKCiAgYWxpYXNfbWV0aG9k KCA6cGlja19rZXksIDpyYW5kX2tleSEgKQoKICAjIFJldHVybnMgYSByYW5kb20ga2V5LXZhbHVl IHBhaXIuCiAgIwogICMgICB7Om9uZSA9PiAxLCA6dHdvID0+IDIsIDp0aHJlZSA9PiAzfS5waWNr ICAjPT4gWzpvbmUsIDFdCiAgIwogIGRlZiByYW5kX3BhaXIKICAgIGsgPSByYW5kX2tleQogICAg cmV0dXJuIGssIGZldGNoKGspCiAgZW5kCgogICMgRGVsZXRlcyBhIHJhbmRvbSBrZXktdmFsdWUg cGFpciBhbmQgcmV0dXJucyB0aGF0IHBhaXIuCiAgIwogICMgICBhID0gezpvbmUgPT4gMSwgOnR3 byA9PiAyLCA6dGhyZWUgPT4gM30KICAjICAgYS5yYW5kX3BhaXIhICAjPT4gWzp0d28sIDJdCiAg IyAgIGEgICAgICAgICAgICAgIz0+IHs6b25lID0+IDEsIDp0aHJlZSA9PiAzfQogICMKICBkZWYg cmFuZF9wYWlyIQogICAgayx2ID0gcmFuZF9wYWlyCiAgICBkZWxldGUoIGsgKQogICAgcmV0dXJu IGssdgogIGVuZAoKICBhbGlhc19tZXRob2QoIDpwaWNrX3BhaXIsIDpyYW5kX3BhaXIhICkKCiAg IyBSZXR1cm5zIGEgcmFuZG9tIGhhc2ggdmFsdWUuCiAgIwogICMgICB7Om9uZSA9PiAxLCA6dHdv ID0+IDIsIDp0aHJlZSA9PiAzfS5yYW5kX3ZhbHVlICAjPT4gMgogICMgICB7Om9uZSA9PiAxLCA6 dHdvID0+IDIsIDp0aHJlZSA9PiAzfS5yYW5kX3ZhbHVlICAjPT4gMQogICMKICBkZWYgcmFuZF92 YWx1ZQogICAgZmV0Y2goIHJhbmRfa2V5ICkKICBlbmQKCiAgIyBEZWxldGVzIGEgcmFuZG9tIGtl eS12YWx1ZSBwYWlyIGFuZCByZXR1cm5zIHRoZSB2YWx1ZS4KICAjCiAgIyAgIGEgPSB7Om9uZSA9 PiAxLCA6dHdvID0+IDIsIDp0aHJlZSA9PiAzfQogICMgICBhLmF0X3JhbmQhICAjPT4gMgogICMg ICBhICAgICAgICAgICAjPT4gezpvbmUgPT4gMSwgOnRocmVlID0+IDN9CiAgIwogIGRlZiByYW5k X3ZhbHVlIQogICAgayx2ID0gcmFuZF9wYWlyCiAgICBkZWxldGUoIGsgKQogICAgcmV0dXJuIHYK ICBlbmQKCiAgYWxpYXNfbWV0aG9kKCA6cGljaywgOnJhbmRfdmFsdWUhICkKCiAgYWxpYXNfbWV0 aG9kKCA6YXRfcmFuZCwgOnJhbmRfdmFsdWUgKQogIGFsaWFzX21ldGhvZCggOmF0X3JhbmQhLCA6 cmFuZF92YWx1ZSEgKQoKICAjIFJldHVybnMgYSBjb3B5IG9mIHRoZSBoYXNoIHdpdGggX3ZhbHVl c18gYXJyYW5nZWQKICAjIGluIG5ldyByYW5kb20gb3JkZXIuCiAgIwogICMgICBoID0gezphPT4x LCA6Yj0+MiwgOmM9PjN9CiAgIyAgIGguc2h1ZmZsZV9oYXNoICAjPT4gezpiPT4yLCA6Yz0+MSwg OmE+M30KICAjCiAgZGVmIHNodWZmbGUKICAgIEhhc2guemlwbmV3KCBrZXlzLnNvcnRfYnl7S2Vy bmVsLnJhbmR9LCB2YWx1ZXMuc29ydF9ieXtLZXJuZWwucmFuZH0gKQogIGVuZAoKICAjIERlc3Ry dWN0aXZlIHNodWZmbGVfaGFzaC4gQXJyYW5nZSB0aGUgdmFsdWVzIGluCiAgIyBhIG5ldyByYW5k b20gb3JkZXIuCiAgIwogICMgICBoID0gezphID0+IDEsIDpiID0+IDIsIDpjID0+IDN9CiAgIyAg IGguc2h1ZmZsZV9oYXNoIQogICMgICBoICAjPT4gezpiPT4yLCA6Yz0+MSwgOmE9PjN9CiAgIwog IGRlZiBzaHVmZmxlIQogICAgc2VsZi5yZXBsYWNlKCBzaHVmZmxlICkKICBlbmQKCmVuZAoKCmNs YXNzIFN0cmluZwoKICAjIFJldHVybnMgYSByYW5kb21seSBnZW5lcmF0ZWQgc3RyaW5nLiBPbmUg cG9zc2libGUgdXNlIGlzCiAgIyBwYXNzd29yZCBpbml0aWFsaXphdGlvbi4gVGFrZXMgYSBtYXgg bGVnbnRoIG9mIGNoYXJhY3RlcnMKICAjIChkZWZhdWx0IDgpIGFuZCBhbiBvcHRpb25hbCB2YWxp ZCBjaGFyIFJlZ2V4cCAoZGVmYXVsdCAvXHdcZC8pLgogICMKICAjLS0KICAjIENSRURJVCBHZW9y Z2UgTW9zY2hvdml0aXMKICAjCiAgIyBOT1RFIFRoaXMgaXMgbm90IHZlcnkgZWZmaWNpZW50LiBC ZXR0ZXIgd2F5PwogICMrKwoKICBkZWYgc2VsZi5yYW5kb20obWF4X2xlbmd0aCA9IDgsIGNoYXJf cmUgPSAvW1x3XGRdLykKICAgICMgZ21vc3g6IHRoaXMgaXMgYSBuaWNlIGV4YW1wbGUgb2YgaW5w dXQgcGFyYW1ldGVyIGNoZWNraW5nLgogICAgIyB0aGlzIGlzIE5PVCBhIHJlYWwgdGltZSBjYWxs ZWQgbWV0aG9kIHNvIHdlIGNhbiBhZGQgdGhpcwogICAgIyBjaGVjay4gQ29uZ3JhdHMgdG8gdGhl IGF1dGhvci4KICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IubmV3KCdjaGFyX3JlIG11c3QgYmUgYSBy ZWd1bGFyIGV4cHJlc3Npb24hJykgdW5sZXNzIGNoYXJfcmUuaXNfYT8oUmVnZXhwKQogICAgc3Ry aW5nID0gIiIKICAgIHdoaWxlIHN0cmluZy5sZW5ndGggPCBtYXhfbGVuZ3RoCiAgICAgICAgY2gg PSByYW5kKDI1NSkuY2hyCiAgICAgICAgc3RyaW5nIDw8IGNoIGlmIGNoID1+IGNoYXJfcmUKICAg IGVuZAogICAgcmV0dXJuIHN0cmluZwogIGVuZAoKICAjIE1vZHVsZSBtZXRob2QgdG8gZ2VuZXJh dGUgYSByYW5kb20gbGV0dGVyLgogICMKICAjICAgU3RyaW5nOjpSYW5kb20ucmFuZF9sZXR0ZXIg ICM9PiAicSIKICAjICAgU3RyaW5nOjpSYW5kb20ucmFuZF9sZXR0ZXIgICM9PiAiciIKICAjICAg U3RyaW5nOjpSYW5kb20ucmFuZF9sZXR0ZXIgICM9PiAiYSIKICAjCiAgZGVmIHNlbGYucmFuZF9s ZXR0ZXIKICAgIChyYW5kKDI2KSArIChyYW5kKDIpID09IDAgPyA2NSA6IDk3KSApLmNocgogIGVu ZAoKICAjIFJldHVybiBhIHJhbmRvbSBzZXBhcmF0aW9uIG9mIHRoZSBzdHJpbmcuCiAgIyBEZWZh dWx0IHNlcGFyYXRpb24gaXMgYnkgY2hhcmFhY3Rlci4KICAjCiAgIyAgICJSdWJ5IHJ1bGVzIi5h dF9yYW5kKCcgJykgICM9PiBbIlJ1YnkiXQogICMKICBkZWYgYXRfcmFuZCggc2VwYXJhdG9yPS8v ICkKICAgIHNlcGFyYXRvciA9IHNlbGYuY2xhc3MucGF0dGVybnMoIHNlcGFyYXRvciApCiAgICBz ZWxmLnNwbGl0KHNlcGFyYXRvciwtMSkuYXRfcmFuZAogIGVuZAoKICAjIFJldHVybiBhIHJhbmRv bSBzZXBhcmF0aW9uIHdoaWxlIHJlbW92aW5nIGl0CiAgIyBmcm9tIHRoZSBzdHJpbmcuIERlZmF1 bHQgc2VwYXJhdGlvbiBpcyBieSBjaGFyYWN0ZXIuCiAgIwogICMgICBzID0gIlJ1YnkgcnVsZXMi CiAgIyAgIHMgPSBhdF9yYW5kISgnICcpICAjPT4gIlJ1YnkiCiAgIyAgIHMgICAgICAgICAgICAg ICAgICAjPT4gInJ1bGVzIgogICMKICBkZWYgYXRfcmFuZCEoIHNlcGFyYXRvcj0vLyApCiAgICBz ZXBhcmF0b3IgPSBzZWxmLmNsYXNzLnBhdHRlcm5zKCBzZXBhcmF0b3IgKQogICAgYSA9IHNlbGYu c2hhdHRlciggc2VwYXJhdG9yICkKICAgIHcgPSBbXTsgYS5lYWNoX3dpdGhfaW5kZXggeyB8cyxp fCBpICUgMiA9PSAwID8gdyA8PCBzIDogdy5sYXN0IDw8IHMgfQogICAgaSA9IHJhbmQoIHcuc2l6 ZSApCiAgICByID0gdy5kZWxldGVfYXQoIGkgKQogICAgc2VsZi5yZXBsYWNlKCB3LmpvaW4oJycp ICkKICAgIHJldHVybiByCiAgZW5kCgogICMgUmV0dXJuIGEgcmFuZG9tIGJ5dGUgb2YgX3NlbGZf LgogICMKICAjICAgIlJ1YnkgcnVsZXMiLnJhbmRfYnl0ZSAgIz0+IDEyMQogICMKICBkZWYgcmFu ZF9ieXRlCiAgICBzZWxmW3JhbmQoIHNpemUgKV0KICBlbmQKCiAgIyBEZXN0cnVjdGl2ZSByYW5k X2J5dGUuIERlbGV0ZSBhIHJhbmRvbSBieXRlIG9mIF9zZWxmXyBhbmQgcmV0dXJuIGl0LgogICMK ICAjICAgcyA9ICJSdWJ5IHJ1bGVzIgogICMgICBzLnJhbmRfYnl0ZSEgICAgICAjPT4gMTIxCiAg IyAgIHMgICAgICAgICAgICAgICAgICM9PiAiUnViIHJ1bGVzIgogICMKICBkZWYgcmFuZF9ieXRl IQogICAgaSA9IHJhbmQoIHNpemUgKQogICAgcnYgPSBzZWxmW2ksMV0KICAgIHNlbGZbaSwxXSA9 ICcnCiAgICBydgogIGVuZAoKICAjIFJldHVybiBhIHJhbmRvbSBzdHJpbmcgaW5kZXguCiAgIwog ICMgICAiUnVieSBydWxlcyIucmFuZF9pbmRleCAgIz0+IDMKICAjCiAgZGVmIHJhbmRfaW5kZXgK ICAgIHJhbmQoIHNpemUgKQogIGVuZAoKICAjIFJldHVybiB0aGUgc3RyaW5nIHdpdGggc2VwZXJh dGVkIHNlY3Rpb25zIGFycmFuZ2VkCiAgIyBpbiBhIHJhbmRvbSBvcmRlci4gVGhlIGRlZmF1bHQg c2VwZXJhdGlvbiBpcyBieSBjaGFyYWN0ZXIuCiAgIwogICMgICAiUnVieSBydWxlcyIuc2h1ZmZs ZSAgIz0+ICJlIGx5YlJzdXVyIgogICMKICBkZWYgc2h1ZmZsZShzZXBhcmF0b3I9Ly8pCiAgICBz cGxpdChzZXBhcmF0b3IpLnNodWZmbGUuam9pbignJykKICBlbmQKCiAgIyBJbiBwbGFjZSB2ZXJz aW9uIG9mIHNodWZmbGUuCiAgIwogIGRlZiBzaHVmZmxlIShzZXBhcmF0b3I9Ly8pCiAgICBzZWxm LnJlcGxhY2UoIHNodWZmbGUoc2VwYXJhdG9yKSApCiAgZW5kCgplbmQKCgojICBfX19fXyAgICAg ICAgIF8KIyB8XyAgIF98X18gIF9fX3wgfF8KIyAgIHwgfC8gXyBcLyBfX3wgX198CiMgICB8IHwg IF9fL1xfXyBcIHxfCiMgICB8X3xcX19ffHxfX18vXF9ffAojCj1iZWdpbiB0ZXN0CgogIHJlcXVp cmUgJ3Rlc3QvdW5pdCcKCiAgY2xhc3MgVGVzdEtlcm5lbFJhbmRvbSA8IFRlc3Q6OlVuaXQ6OlRl c3RDYXNlCgogICAgZGVmIHRlc3RfbWF5YmUKICAgICAgYXNzZXJ0X25vdGhpbmdfcmFpc2VkIHsg bWF5YmUgfQogICAgZW5kCgogIGVuZAoKICBjbGFzcyBUZXN0QXJyYXlSYW5kb20gPCBUZXN0OjpV bml0OjpUZXN0Q2FzZQoKICAgIGRlZiB0ZXN0X2F0X3JhbmQKICAgICAgYSA9IFsxLDIsMyw0LDVd CiAgICAgIDIwLnRpbWVzeyBhc3NlcnRfbm90aGluZ19yYWlzZWR7IGEuYXRfcmFuZCB9IH0KICAg ICAgMjAudGltZXN7IGFzc2VydCggYS5pbmNsdWRlPyggYS5hdF9yYW5kICkgKSB9CiAgICBlbmQK CiAgICBkZWYgdGVzdF9hdF9yYW5kIQogICAgICBhID0gWydhJywnYicsJ2MnXQogICAgICBhc3Nl cnRfZXF1YWwoIDEsIGEuYXRfcmFuZCEubGVuZ3RoICkKICAgICAgYXNzZXJ0X2VxdWFsKCAyLCBh Lmxlbmd0aCApCiAgICBlbmQKCiAgICBkZWYgdGVzdF9waWNrCiAgICAgIGEgPSBbJ2EnLCdiJywn YyddCiAgICAgIGFzc2VydF9lcXVhbCggMywgYS5waWNrKDMpLmxlbmd0aCApCiAgICAgIGFzc2Vy dF9lcXVhbCggMywgYS5sZW5ndGggKQogICAgICBhID0gWydhJywnYicsJ2MnXQogICAgICBhc3Nl cnRfZXF1YWwoIDMsIGEucGljayg0KS5sZW5ndGggKQogICAgICBhc3NlcnRfZXF1YWwoIDMsIGEu bGVuZ3RoICkKICAgIGVuZAoKICAgIGRlZiB0ZXN0X3BpY2shCiAgICAgIGEgPSBbJ2EnLCdiJywn YyddCiAgICAgIGFzc2VydF9lcXVhbCggMywgYS5waWNrISgzKS5sZW5ndGggKQogICAgICBhc3Nl cnRfZXF1YWwoIDAsIGEubGVuZ3RoICkKICAgICAgYSA9IFsnYScsJ2InLCdjJ10KICAgICAgYXNz ZXJ0X2VxdWFsKCAzLCBhLnBpY2shKDQpLmxlbmd0aCApCiAgICAgIGFzc2VydF9lcXVhbCggMCwg YS5sZW5ndGggKQogICAgZW5kCgogICAgZGVmIHRlc3RfcmFuZF9pbmRleAogICAgICAxMC50aW1l cyB7CiAgICAgICAgaSA9IFsxLDIsM10ucmFuZF9pbmRleAogICAgICAgIGFzc2VydCggKDAuLjIp LmluY2x1ZGU/KGkpICkKICAgICAgfQogICAgZW5kCgogICAgZGVmIHRlc3RfcmFuZF9zdWJzZXQK ICAgICAgMTAudGltZXMgewogICAgICAgIGEgPSBbMSwyLDMsNF0ucmFuZF9zdWJzZXQKICAgICAg ICBhc3NlcnQoIGEuc2l6ZSA8PSA0ICkKICAgICAgfQogICAgZW5kCgogICAgZGVmIHRlc3Rfc2h1 ZmZsZQogICAgICBhID0gWzEsMiwzLDQsNV0KICAgICAgYiA9IGEuc2h1ZmZsZQogICAgICBhc3Nl cnRfZXF1YWwoIGEsIGIuc29ydCApCiAgICBlbmQKCiAgICBkZWYgdGVzdF9zaHVmZmxlIQogICAg ICBhID0gWzEsMiwzLDQsNV0KICAgICAgYiA9IGEuZHVwCiAgICAgIGIuc2h1ZmZsZSEKICAgICAg YXNzZXJ0X2VxdWFsKCBhLCBiLnNvcnQgKQogICAgZW5kCgogIGVuZAoKICBjbGFzcyBUZXN0SGFz aFJhbmRvbSA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCgogICAgZGVmIHRlc3RfcmFuZF9rZXkKICAg ICAgaCA9IHsgOmE9PjEsIDpiPT4yLCA6Yz0+MyB9CiAgICAgIDEwLnRpbWVzIHsgYXNzZXJ0KCBo LmtleXMuaW5jbHVkZT8oIGgucmFuZF9rZXkgKSApIH0KICAgIGVuZAoKICAgIGRlZiB0ZXN0X3Jh bmRfcGFpcgogICAgICBoID0geyA6YT0+MSwgOmI9PjIsIDpjPT4zIH0KICAgICAgMTAudGltZXMg eyBrLHYgPSAqaC5yYW5kX3BhaXI7IGFzc2VydF9lcXVhbCggdiwgaFtrXSApIH0KICAgIGVuZAoK ICAgIGRlZiB0ZXN0X3JhbmRfdmFsdWUKICAgICAgaCA9IHsgOmE9PjEsIDpiPT4yLCA6Yz0+MyB9 CiAgICAgIDEwLnRpbWVzIHsgYXNzZXJ0KCBoLnZhbHVlcy5pbmNsdWRlPyggaC5yYW5kX3ZhbHVl ICkgKSB9CiAgICBlbmQKCiAgICBkZWYgdGVzdF9zaHVmZmxlCiAgICAgIGggPSB7OmE9PjEsIDpi PT4yLCA6Yz0+MyB9CiAgICAgIGFzc2VydF9ub3RoaW5nX3JhaXNlZCB7IGguc2h1ZmZsZSB9CiAg ICBlbmQKCiAgICBkZWYgdGVzdF9zaHVmZmxlIQogICAgICBoID0gezphPT4xLCA6Yj0+MiwgOmM9 PjMgfQogICAgICBhc3NlcnRfbm90aGluZ19yYWlzZWQgeyBoLnNodWZmbGUhIH0KICAgIGVuZAoK ICBlbmQKCiAgY2xhc3MgVGVzdFN0cmluZ1JhbmRvbSA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCgog ICAgZGVmIHRlc3RfU3RyaW5nX3JhbmRfbGV0dGVyCiAgICAgIDEwMC50aW1lcyB7IHxpfCBhc3Nl cnQoIC9bYS16QS16XS8gPX4gU3RyaW5nLnJhbmRfbGV0dGVyICkgfQogICAgZW5kCgogICAgZGVm IHRlc3RfYXRfcmFuZAogICAgICBhID0gJzEyMzQ1JwogICAgICAyMC50aW1lc3sgYXNzZXJ0X25v dGhpbmdfcmFpc2VkeyBhLmF0X3JhbmQgfSB9CiAgICAgIDIwLnRpbWVzeyBhc3NlcnQoIGEuaW5j bHVkZT8oIGEuYXRfcmFuZCApICkgfQogICAgZW5kCgogICAgZGVmIHRlc3RfYXRfcmFuZCEKICAg ICAgeCA9ICdhYicKICAgICAgciA9IHguYXRfcmFuZCEKICAgICAgYXNzZXJ0KCByID09ICdhJyB8 fCByID09ICdiJyApCiAgICAgIGFzc2VydCggeCA9PSAnYScgfHwgeCA9PSAnYicgKQogICAgZW5k CgogICAgZGVmIHRlc3RfcmFuZF9pbmRleAogICAgICAxMC50aW1lcyB7IGFzc2VydCggKDAuLjIp LmluY2x1ZGU/KCAnYWJjJy5yYW5kX2luZGV4ICkgKSB9CiAgICBlbmQKCiAgICBkZWYgdGVzdF9y YW5kX2J5dGUKICAgICAgcyA9ICdhYicKICAgICAgciA9IHMucmFuZF9ieXRlCiAgICAgIGFzc2Vy dCggciA9PSA5NyB8fCByID09IDk4ICkKICAgIGVuZAoKICAgIGRlZiB0ZXN0X3JhbmRfYnl0ZQog ICAgICBzID0gJ2FiJwogICAgICByID0gcy5yYW5kX2J5dGUKICAgICAgYXNzZXJ0KCByID09IDk3 IHx8IHIgPT0gOTggKQogICAgICBhc3NlcnQoIHMgPSAnYScgfHwgcyA9ICdiJyApCiAgICBlbmQK CiAgICBkZWYgdGVzdF9zaHVmZmxlCiAgICAgIGFzc2VydF9ub3RoaW5nX3JhaXNlZCB7ICJhYmMg MTIzIi5zaHVmZmxlIH0KICAgICAgI2Fzc2VydF9ub3RoaW5nX3JhaXNlZCB7ICJhYmMgMTIzIi5z aHVmZmxlISB9CiAgICBlbmQKCiAgZW5kCgo9ZW5kCg ------ art_15873_11735180.1181694401377--