From: Hugh Sasse Date: 2005-10-28T19:53:30+09:00 Subject: csv.rb a start on refactoring. ---559023410-1141662977-1130496800=:19167 Content-Type: MULTIPART/MIXED; BOUNDARY="-559023410-1141662977-1130496800=:19167" This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---559023410-1141662977-1130496800=:19167 Content-Type: TEXT/PLAIN; charset=US-ASCII For a database application I found using CSV to be rather slow. I have made an attempt to speed it up, which, frankly has not been very successuful. However I think I have improved the code a little. I've added an error for if the state machine should get into an unknown state, rather than assuming that "it must be in the other one" after several tests. This slows things down, but is probably safer, given how hard state machines can be to debug. I've changed if block to if block_given? -- more idiomatic, possibly faster?? I've tried to simplify if something.is_a?(Klass) something.method end to if something.respond_to?(:method) something.method end I think its faster, and its more duck-typing style. I've tried to handle state transitions with a hash, as it is probably clearer than if...elsif...else...end. Likely to be faster, too. I've changed if expr singlestatement end to singlestatement if expr to shorten the code. Don't know how that impacts speed. I've changed if...elsif...else... to case statements where I can. I think that ought to be faster, but it is clearer code, I think. There's a while statement with an if immediately inside it. Since thre is no else for that if, and the loop condition doesn't change if the if-condition is false, then the condition must always apply. For, if it did not apply, the while loop would never exit. I have commented out the condition and corresponding end. idx_is_eos? is private, and thus not really part of the external interface. It takes a parameter that it doesn't use. I have removed that and made it parameterless. I have tested the code and it still works. I could not find exhaustive test cases for CSV (looked in Rubycon and on the web) so hope I haven't broken anything. It does seem to be a tiny bit faster, for the given case. My tests are attached. The test program takes the file to test (csv or nova_csv) as an argument, to allow comparison. The name? nova_csv because new_csv was already being used for doc patches. HTH Hugh ---559023410-1141662977-1130496800=:19167 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=csv_code_diffs Content-Transfer-Encoding: BASE64 Content-Description: Content-Disposition: attachment; filename=csv_code_diffs LS0tIGNzdi5yYgkyMDA0LTA1LTI3IDE1OjM5OjEwLjAwMDAwMDAwMCArMDEw MA0KKysrIG5vdmFfY3N2LnJiCTIwMDUtMTAtMjggMTE6MDU6NDguNzUxNDc4 MDAwICswMTAwDQpAQCAtMTAsNiArMTAsNyBAQA0KICAgDQogY2xhc3MgQ1NW DQogICBjbGFzcyBJbGxlZ2FsRm9ybWF0RXJyb3IgPCBSdW50aW1lRXJyb3I7 IGVuZA0KKyAgY2xhc3MgVW5rbm93blN0YXRlIDwgUnVudGltZUVycm9yOyBl bmQNCiANCiAgICMgZGVwcmVjYXRlZA0KICAgY2xhc3MgQ2VsbCA8IFN0cmlu Zw0KQEAgLTExOCw3ICsxMTksNyBAQA0KICAgICAgICAgIiAgVXNlIENTVi5v cGVuKGZpbGVuYW1lLCAncicpIGluc3RlYWQuIikNCiAgICAgICByZXR1cm4g b3Blbl9yZWFkZXIoc3RyX29yX3JlYWRhYmxlLCAncicsIGZzLCBycywgJmJs b2NrKQ0KICAgICBlbmQNCi0gICAgaWYgYmxvY2sNCisgICAgaWYgYmxvY2tf Z2l2ZW4/DQogICAgICAgQ1NWOjpSZWFkZXIucGFyc2Uoc3RyX29yX3JlYWRh YmxlLCBmcywgcnMpIGRvIHxyb3d8DQogICAgICAgICB5aWVsZChyb3cpDQog ICAgICAgZW5kDQpAQCAtMTM2LDEwICsxMzcsMTAgQEANCiAgICMgbm90LCB1 c2UgQ1NWLnBhcnNlX3JvdyBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kLg0KICAg ZGVmIENTVi5wYXJzZV9saW5lKHNyYywgZnMgPSBuaWwsIHJzID0gbmlsKQ0K ICAgICBmcyB8fD0gJywnDQotICAgIGlmIGZzLmlzX2E/KEZpeG51bSkNCisg ICAgaWYgZnMucmVzcG9uZF90bz8gOmNocg0KICAgICAgIGZzID0gZnMuY2hy DQogICAgIGVuZA0KLSAgICBpZiAhcnMubmlsPyBhbmQgcnMuaXNfYT8oRml4 bnVtKQ0KKyAgICBpZiBycy5yZXNwb25kX3RvPyA6Y2hyDQogICAgICAgcnMg PSBycy5jaHINCiAgICAgZW5kDQogICAgIGlkeCA9IDANCkBAIC0xNjIsMTAg KzE2MywxMCBAQA0KICAgICAgIHJldHVybiAnJw0KICAgICBlbmQNCiAgICAg ZnMgfHw9ICcsJw0KLSAgICBpZiBmcy5pc19hPyhGaXhudW0pDQorICAgIGlm IGZzLnJlc3BvbmRfdG8/IDpjaHINCiAgICAgICBmcyA9IGZzLmNocg0KICAg ICBlbmQNCi0gICAgaWYgIXJzLm5pbD8gYW5kIHJzLmlzX2E/KEZpeG51bSkN CisgICAgaWYgcnMucmVzcG9uZF90bz8gOmNocg0KICAgICAgIHJzID0gcnMu Y2hyDQogICAgIGVuZA0KICAgICByZXNfdHlwZSA9IDpEVF9DT0xTRVANCkBA IC0yMTMsMTAgKzIxNCwxMCBAQA0KICAgIw0KICAgZGVmIENTVi5wYXJzZV9y b3coc3JjLCBpZHgsIG91dF9kZXYsIGZzID0gbmlsLCBycyA9IG5pbCkNCiAg ICAgZnMgfHw9ICcsJw0KLSAgICBpZiBmcy5pc19hPyhGaXhudW0pDQorICAg IGlmIGZzLnJlc3BvbmRfdG8/IDpjaHINCiAgICAgICBmcyA9IGZzLmNocg0K ICAgICBlbmQNCi0gICAgaWYgIXJzLm5pbD8gYW5kIHJzLmlzX2E/KEZpeG51 bSkNCisgICAgaWYgcnMucmVzcG9uZF90bz8gOmNocg0KICAgICAgIHJzID0g cnMuY2hyDQogICAgIGVuZA0KICAgICBpZHhfYmFja3VwID0gaWR4DQpAQCAt MjcwLDEwICsyNzEsMTAgQEANCiAgICMNCiAgIGRlZiBDU1YuZ2VuZXJhdGVf cm93KHNyYywgY2VsbHMsIG91dF9kZXYsIGZzID0gbmlsLCBycyA9IG5pbCkN CiAgICAgZnMgfHw9ICcsJw0KLSAgICBpZiBmcy5pc19hPyhGaXhudW0pDQor ICAgIGlmIGZzLnJlc3BvbmRfdG8gOmNocg0KICAgICAgIGZzID0gZnMuY2hy DQogICAgIGVuZA0KLSAgICBpZiAhcnMubmlsPyBhbmQgcnMuaXNfYT8oRml4 bnVtKQ0KKyAgICBpZiBycy5yZXNwb25kX3RvIDpjaHINCiAgICAgICBycyA9 IHJzLmNocg0KICAgICBlbmQNCiAgICAgc3JjX3NpemUgPSBzcmMuc2l6ZQ0K QEAgLTMwMyw2ICszMDQsOSBAQA0KICAgIyBQcml2YXRlIGNsYXNzIG1ldGhv ZHMuDQogICBjbGFzcyA8PCBzZWxmDQogICBwcml2YXRlDQorICAgIERBVEFf VFJBTlNJVElPTjEgPSBIYXNoLm5ld3t8aCxrfCBrfS5tZXJnZSEoOlNUX1NU QVJUID0+IDpTVF9EQVRBLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDpTVF9RVU9URSA9PiA6SUxMRUdBTF9G T1JNQVQpDQorICAgICMgcmV0dXJuIHRoZSBrZXkgYXMgZGVmYXVsdA0KIA0K ICAgICBkZWYgb3Blbl9yZWFkZXIocGF0aCwgbW9kZSwgZnMsIHJzLCAmYmxv Y2spDQogICAgICAgZmlsZSA9IEZpbGUub3BlbihwYXRoLCBtb2RlKQ0KQEAg LTM0MCw2ICszNDQsMTMgQEANCiAgICAgICBlbmQNCiAgICAgZW5kDQogDQor DQorICAgIGRlZiB0b19kYXRhX3VubGVzc19xdW90ZShzdGF0ZSkNCisgICAg ICBzdGF0ZSA9IERBVEFfVFJBTlNJVElPTjFbc3RhdGVdDQorICAgICAgcmFp c2UgSWxsZWdhbEZvcm1hdEVycm9yIGlmIHN0YXRlID09IDpJTExFR0FMX0ZP Uk1BVA0KKyAgICAgIHJldHVybiBzdGF0ZQ0KKyAgICBlbmQNCisNCiAgICAg ZGVmIHBhcnNlX2JvZHkoc3JjLCBpZHgsIGZzLCBycykNCiAgICAgICBmc19z dHIgPSBmcw0KICAgICAgIGZzX3NpemUgPSBmc19zdHIuc2l6ZQ0KQEAgLTM1 OSw1NCArMzcwLDM3IEBADQogICAgICAgICAgIGlmICFmc2NoYXIgYW5kIGMg PT0gZnNfc3RyWzBdDQogICAgICAgICAgICAgZnNfaWR4ID0gMA0KICAgICAg ICAgICAgIGZzY2hhciA9IHRydWUNCi0gICAgICAgICAgICBpZiBzdGF0ZSA9 PSA6U1RfU1RBUlQNCi0gICAgICAgICAgICAgIHN0YXRlID0gOlNUX0RBVEEN Ci0gICAgICAgICAgICBlbHNpZiBzdGF0ZSA9PSA6U1RfUVVPVEUNCi0gICAg ICAgICAgICAgIHJhaXNlIElsbGVnYWxGb3JtYXRFcnJvcg0KLSAgICAgICAg ICAgIGVuZA0KKyAgICAgICAgICAgIHN0YXRlID0gdG9fZGF0YV91bmxlc3Nf cXVvdGUoc3RhdGUpDQogICAgICAgICAgIGVuZA0KICAgICAgICAgICBpZiAh cnNjaGFyIGFuZCBjID09IHJzX3N0clswXQ0KICAgICAgICAgICAgIHJzX2lk eCA9IDANCiAgICAgICAgICAgICByc2NoYXIgPSB0cnVlDQotICAgICAgICAg ICAgaWYgc3RhdGUgPT0gOlNUX1NUQVJUDQotICAgICAgICAgICAgICBzdGF0 ZSA9IDpTVF9EQVRBDQotICAgICAgICAgICAgZWxzaWYgc3RhdGUgPT0gOlNU X1FVT1RFDQotICAgICAgICAgICAgICByYWlzZSBJbGxlZ2FsRm9ybWF0RXJy b3INCi0gICAgICAgICAgICBlbmQNCisgICAgICAgICAgICBzdGF0ZSA9IHRv X2RhdGFfdW5sZXNzX3F1b3RlKHN0YXRlKQ0KICAgICAgICAgICBlbmQNCiAg ICAgICAgIGVuZA0KICAgICAgICAgaWYgYyA9PSA/Ig0KICAgICAgICAgICBm c19pZHggPSByc19pZHggPSAwDQotICAgICAgICAgIGlmIGNyDQotICAgICAg ICAgICAgcmFpc2UgSWxsZWdhbEZvcm1hdEVycm9yDQotICAgICAgICAgIGVu ZA0KKyAgICAgICAgICByYWlzZSBJbGxlZ2FsRm9ybWF0RXJyb3IgaWYgY3IN CiAgICAgICAgICAgY2VsbCA8PCBzcmNbbGFzdF9pZHgsIChpZHggLSBsYXN0 X2lkeCldDQotICAgICAgICAgIGxhc3RfaWR4ID0gaWR4DQotICAgICAgICAg IGlmIHN0YXRlID09IDpTVF9EQVRBDQotICAgICAgICAgICAgaWYgcXVvdGVk DQotICAgICAgICAgICAgICBsYXN0X2lkeCArPSAxDQotICAgICAgICAgICAg ICBxdW90ZWQgPSBmYWxzZQ0KLSAgICAgICAgICAgICAgc3RhdGUgPSA6U1Rf UVVPVEUNCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICByYWlz ZSBJbGxlZ2FsRm9ybWF0RXJyb3INCi0gICAgICAgICAgICBlbmQNCi0gICAg ICAgICAgZWxzaWYgc3RhdGUgPT0gOlNUX1FVT1RFDQorICAgICAgICAgIGxh c3RfaWR4ID0gaWR4ICsgMQ0KKyAgICAgICAgICBjYXNlIHN0YXRlIA0KKyAg ICAgICAgICB3aGVuIDpTVF9EQVRBDQorICAgICAgICAgICAgcmFpc2UgSWxs ZWdhbEZvcm1hdEVycm9yIHVubGVzcyBxdW90ZWQNCisgICAgICAgICAgICBx dW90ZWQgPSBmYWxzZSAgIyBSZWR1bmRhbnQsIHN1cmVseT8NCisgICAgICAg ICAgICBzdGF0ZSA9IDpTVF9RVU9URQ0KKyAgICAgICAgICB3aGVuIDpTVF9R VU9URQ0KICAgICAgICAgICAgIGNlbGwgPDwgYy5jaHINCi0gICAgICAgICAg ICBsYXN0X2lkeCArPSAxDQogICAgICAgICAgICAgcXVvdGVkID0gdHJ1ZQ0K ICAgICAgICAgICAgIHN0YXRlID0gOlNUX0RBVEENCi0gICAgICAgICAgZWxz ZSAgIyA6U1RfU1RBUlQNCisgICAgICAgICAgd2hlbiA6U1RfU1RBUlQNCiAg ICAgICAgICAgICBxdW90ZWQgPSB0cnVlDQotICAgICAgICAgICAgbGFzdF9p ZHggKz0gMQ0KICAgICAgICAgICAgIHN0YXRlID0gOlNUX0RBVEENCisgICAg ICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHJhaXNlIFVua25vd25TdGF0ZQ0K ICAgICAgICAgICBlbmQNCiAgICAgICAgIGVsc2lmIGZzY2hhciBvciByc2No YXINCi0gICAgICAgICAgaWYgZnNjaGFyDQotICAgICAgICAgICAgZnNfaWR4 ICs9IDENCi0gICAgICAgICAgZW5kDQotICAgICAgICAgIGlmIHJzY2hhcg0K LSAgICAgICAgICAgIHJzX2lkeCArPSAxDQotICAgICAgICAgIGVuZA0KKyAg ICAgICAgICBmc19pZHggKz0gMSBpZiBmc2NoYXINCisgICAgICAgICAgcnNf aWR4ICs9IDEgaWYgcnNjaGFyDQogICAgICAgICAgIHNlcCA9IG5pbA0KICAg ICAgICAgICBpZiBmc19pZHggPT0gZnNfc2l6ZQ0KICAgICAgICAgICAgIGlm IHN0YXRlID09IDpTVF9TVEFSVCBhbmQgcnNfaWR4ID4gMCBhbmQgZnNfaWR4 IDwgcnNfaWR4DQpAQCAtNDE1LDkgKzQwOSw3IEBADQogICAgICAgICAgICAg Y2VsbCA8PCBzcmNbbGFzdF9pZHgsIChpZHggLSBsYXN0X2lkeCAtIChmc19z aXplIC0gMSkpXQ0KICAgICAgICAgICAgIGxhc3RfaWR4ID0gaWR4DQogICAg ICAgICAgICAgZnNfaWR4ID0gcnNfaWR4ID0gMA0KLSAgICAgICAgICAgIGlm IGNyDQotICAgICAgICAgICAgICByYWlzZSBJbGxlZ2FsRm9ybWF0RXJyb3IN Ci0gICAgICAgICAgICBlbmQNCisgICAgICAgICAgICByYWlzZSBJbGxlZ2Fs Rm9ybWF0RXJyb3IgaWYgY3INCiAgICAgICAgICAgICBzZXAgPSA6RFRfQ09M U0VQDQogICAgICAgICAgIGVsc2lmIHJzX2lkeCA9PSByc19zaXplDQogICAg ICAgICAgICAgaWYgc3RhdGUgPT0gOlNUX1NUQVJUIGFuZCBmc19pZHggPiAw IGFuZCByc19pZHggPCBmc19pZHgNCkBAIC00MzEsMjAgKzQyMywxOSBAQA0K ICAgICAgICAgICAgIHNlcCA9IDpEVF9ST1dTRVANCiAgICAgICAgICAgZW5k DQogICAgICAgICAgIGlmIHNlcA0KLSAgICAgICAgICAgIGlmIHN0YXRlID09 IDpTVF9EQVRBDQotICAgICAgICAgICAgICByZXR1cm4gc2VwLCBpZHggKyAx LCBjZWxsOw0KLSAgICAgICAgICAgIGVsc2lmIHN0YXRlID09IDpTVF9RVU9U RQ0KLSAgICAgICAgICAgICAgcmV0dXJuIHNlcCwgaWR4ICsgMSwgY2VsbDsN Ci0gICAgICAgICAgICBlbHNlICAjIDpTVF9TVEFSVA0KLSAgICAgICAgICAg ICAgcmV0dXJuIHNlcCwgaWR4ICsgMSwgbmlsDQorICAgICAgICAgICAgcmV0 dXJuIHNlcCwgaWR4ICsgMSwgY2FzZSBzdGF0ZQ0KKyAgICAgICAgICAgIHdo ZW4gOlNUX0RBVEEsIDpTVF9RVU9URQ0KKyAgICAgICAgICAgICAgIGNlbGwN CisgICAgICAgICAgICB3aGVuIDpTVF9TVEFSVA0KKyAgICAgICAgICAgICAg IG5pbA0KKyAgICAgICAgICAgIGVsc2UgIA0KKyAgICAgICAgICAgICAgcmFp c2UgVW5rbm93blN0YXRlDQogICAgICAgICAgICAgZW5kDQogICAgICAgICAg IGVuZA0KICAgICAgICAgZWxzaWYgcnMubmlsPyBhbmQgYyA9PSA/XHINCiAg ICAgICAgICAgIyBzcGVjaWFsIFxyIHRyZWF0bWVudCBmb3IgYmFja3dhcmQg Y29tcGF0aWJpbGl0eQ0KICAgICAgICAgICBmc19pZHggPSByc19pZHggPSAw DQotICAgICAgICAgIGlmIGNyDQotICAgICAgICAgICAgcmFpc2UgSWxsZWdh bEZvcm1hdEVycm9yDQotICAgICAgICAgIGVuZA0KKyAgICAgICAgICByYWlz ZSBJbGxlZ2FsRm9ybWF0RXJyb3IgaWYgY3INCiAgICAgICAgICAgY2VsbCA8 PCBzcmNbbGFzdF9pZHgsIChpZHggLSBsYXN0X2lkeCldDQogICAgICAgICAg IGxhc3RfaWR4ID0gaWR4DQogICAgICAgICAgIGlmIHF1b3RlZA0KQEAgLTQ1 NCwxMyArNDQ1LDE0IEBADQogICAgICAgICAgIGVuZA0KICAgICAgICAgZWxz ZQ0KICAgICAgICAgICBmc19pZHggPSByc19pZHggPSAwDQotICAgICAgICAg IGlmIHN0YXRlID09IDpTVF9EQVRBIG9yIHN0YXRlID09IDpTVF9TVEFSVA0K LSAgICAgICAgICAgIGlmIGNyDQotICAgICAgICAgICAgICByYWlzZSBJbGxl Z2FsRm9ybWF0RXJyb3INCi0gICAgICAgICAgICBlbmQNCisgICAgICAgICAg Y2FzZSBzdGF0ZSANCisgICAgICAgICAgd2hlbiA6U1RfREFUQSwgOlNUX1NU QVJUDQorICAgICAgICAgICAgcmFpc2UgSWxsZWdhbEZvcm1hdEVycm9yIGlm IGNyDQogICAgICAgICAgICAgc3RhdGUgPSA6U1RfREFUQQ0KLSAgICAgICAg ICBlbHNlICAjIDpTVF9RVU9URQ0KKyAgICAgICAgICB3aGVuIDpTVF9RVU9U RQ0KICAgICAgICAgICAgIHJhaXNlIElsbGVnYWxGb3JtYXRFcnJvcg0KKyAg ICAgICAgICBlbHNlIA0KKyAgICAgICAgICAgIHJhaXNlIFVua25vd25TdGF0 ZQ0KICAgICAgICAgICBlbmQNCiAgICAgICAgIGVuZA0KICAgICAgICAgaWR4 ICs9IDENCkBAIC00NzEsOSArNDYzLDcgQEANCiAgICAgICAgIGVsc2UNCiAg ICAgICAgICAgcmV0dXJuIDpEVF9FT1MsIGlkeCwgbmlsDQogICAgICAgICBl bmQNCi0gICAgICBlbHNpZiBxdW90ZWQNCi0gICAgICAgIHJhaXNlIElsbGVn YWxGb3JtYXRFcnJvcg0KLSAgICAgIGVsc2lmIGNyDQorICAgICAgZWxzaWYg cXVvdGVkIG9yIGNyDQogICAgICAgICByYWlzZSBJbGxlZ2FsRm9ybWF0RXJy b3INCiAgICAgICBlbmQNCiAgICAgICBjZWxsIDw8IHNyY1tsYXN0X2lkeCwg KGlkeCAtIGxhc3RfaWR4KV0NCkBAIC04MDQsNyArNzk0LDcgQEANCiAgICAg ICBpZiBpZHggPCAwDQogICAgICAgICByZXR1cm4gbmlsDQogICAgICAgZW5k DQotICAgICAgaWYgKGlkeF9pc19lb3M/KGlkeCkpDQorICAgICAgaWYgKGlk eF9pc19lb3M/KQ0KICAgICAgICAgaWYgbiBhbmQgKEBvZmZzZXQgKyBpZHgg PT0gYnVmX3NpemUoQGN1cl9idWYpKQ0KICAgICAgICAgICAjIExpa2UgYSBT dHJpbmcsICdhYmMnWzQsIDFdIHJldHVybnMgbmlsIGFuZA0KICAgICAgICAg ICAjICdhYmMnWzMsIDFdIHJldHVybnMgJycgbm90IG5pbC4NCkBAIC04MTgs MTMgKzgwOCwxMiBAQA0KICAgICAgIG5leHRfaWR4ID0gaWR4DQogICAgICAg d2hpbGUgKG15X29mZnNldCArIG5leHRfaWR4ID49IGJ1Zl9zaXplKG15X2J1 ZikpDQogICAgICAgICBpZiAobXlfYnVmID09IEBidWZfdGFpbF9pZHgpDQot ICAgICAgICAgIHVubGVzcyBhZGRfYnVmDQotICAgICAgICAgICAgYnJlYWsN Ci0gICAgICAgICAgZW5kDQorICAgICAgICAgIGJyZWFrIHVubGVzcyBhZGRf YnVmDQogICAgICAgICBlbmQNCiAgICAgICAgIG5leHRfaWR4ID0gbXlfb2Zm c2V0ICsgbmV4dF9pZHggLSBidWZfc2l6ZShteV9idWYpDQogICAgICAgICBt eV9idWYgKz0gMQ0KICAgICAgICAgbXlfb2Zmc2V0ID0gMA0KKyAgICAgICAg IyBpLmUuIGxvYyA9IG15X29mZnNldCArIG5leHRfaWR4IGJlY2F1c2UgbXlv ZmZzZXQgaXMgMA0KICAgICAgIGVuZA0KICAgICAgIGxvYyA9IG15X29mZnNl dCArIG5leHRfaWR4DQogICAgICAgaWYgIW4NCkBAIC04NTUsOSArODQ0LDkg QEANCiAgICAgICBpZiBpc19lb3M/DQogICAgICAgICByZXR1cm4gMA0KICAg ICAgIGVuZA0KLSAgICAgIHNpemVfZHJvcHBlZCA9IDANCisgICAgICBic2Mg PSBzaXplX2Ryb3BwZWQgPSAwDQogICAgICAgd2hpbGUgKG4gPiAwKQ0KLSAg ICAgICAgaWYgIUBpc19lb3Mgb3IgKEBjdXJfYnVmICE9IEBidWZfdGFpbF9p ZHgpDQorICAgICAgICAjIGlmICFAaXNfZW9zIG9yIChAY3VyX2J1ZiAhPSBA YnVmX3RhaWxfaWR4KSAjIHJlZHVuZGFudD8gSWYgaXQgZmFpbHMgbG9vcCBu ZXZlciBleGl0cw0KICAgICAgICAgICBpZiAoQG9mZnNldCArIG4gPCBidWZf c2l6ZShAY3VyX2J1ZikpDQogICAgICAgICAgICAgc2l6ZV9kcm9wcGVkICs9 IG4NCiAgICAgICAgICAgICBAb2Zmc2V0ICs9IG4NCkBAIC04NjgsMTkgKzg1 NywxNyBAQA0KICAgICAgICAgICAgIG4gLT0gc2l6ZQ0KICAgICAgICAgICAg IEBvZmZzZXQgPSAwDQogICAgICAgICAgICAgdW5sZXNzIHJlbF9idWYNCi0g ICAgICAgICAgICAgIHVubGVzcyBhZGRfYnVmDQotICAgICAgICAgICAgICAg IGJyZWFrDQotICAgICAgICAgICAgICBlbmQNCisgICAgICAgICAgICAgIGJy ZWFrIHVubGVzcyBhZGRfYnVmDQogICAgICAgICAgICAgICBAY3VyX2J1ZiA9 IEBidWZfdGFpbF9pZHgNCiAgICAgICAgICAgICBlbmQNCiAgICAgICAgICAg ZW5kDQotICAgICAgICBlbmQNCisgICAgICAgICMgZW5kDQogICAgICAgZW5k DQogICAgICAgc2l6ZV9kcm9wcGVkDQogICAgIGVuZA0KICAgDQogICAgIGRl ZiBpc19lb3M/DQotICAgICAgcmV0dXJuIGlkeF9pc19lb3M/KDApDQorICAg ICAgcmV0dXJuIGlkeF9pc19lb3M/DQogICAgIGVuZA0KICAgDQogICAgICMg V0FSTjogRG8gbm90IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgZGlyZWN0bHku ICBEZWZpbmUgeW91ciBvd24gY2xhc3MNCkBAIC05MjksMTMgKzkxNiwxMiBA QA0KICAgICAgIGlmIHN0cl9yZWFkLm5pbD8NCiAgICAgICAgIEBpc19lb3Mg PSB0cnVlDQogICAgICAgICBAYnVmX2xpc3QucHVzaCgnJykNCi0gICAgICAg IEBidWZfdGFpbF9pZHggKz0gMQ0KICAgICAgICAgZmFsc2UNCiAgICAgICBl bHNlDQogICAgICAgICBAYnVmX2xpc3QucHVzaChzdHJfcmVhZCkNCi0gICAg ICAgIEBidWZfdGFpbF9pZHggKz0gMQ0KICAgICAgICAgdHJ1ZQ0KICAgICAg IGVuZA0KKyAgICAgIEBidWZfdGFpbF9pZHggKz0gMQ0KICAgICBlbmQNCiAg IA0KICAgICBkZWYgcmVsX2J1Zg0KQEAgLTk1Miw4ICs5MzgsOCBAQA0KICAg ICAgIGVuZA0KICAgICBlbmQNCiAgIA0KLSAgICBkZWYgaWR4X2lzX2Vvcz8o aWR4KQ0KLSAgICAgIChAaXNfZW9zIGFuZCAoKEBjdXJfYnVmIDwgMCkgb3Ig KEBjdXJfYnVmID09IEBidWZfdGFpbF9pZHgpKSkNCisgICAgZGVmIGlkeF9p c19lb3M/DQorICAgICAgKEBpc19lb3MgYW5kICgoQGN1cl9idWYgPT0gQGJ1 Zl90YWlsX2lkeCkgb3IgKEBjdXJfYnVmIDwgMCkpKQ0KICAgICBlbmQNCiAg IA0KICAgICBCdWZTaXplID0gMTAyNCAqIDgNCg== ---559023410-1141662977-1130496800=:19167 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=test_csv.rb Content-Transfer-Encoding: BASE64 Content-Description: Content-Disposition: attachment; filename=test_csv.rb IyEvdXNyL2xvY2FsL2Jpbi9ydWJ5IC13DQojDQojIFRlc3QgdGhlIENTViBs aWJyYXJ5IGFuZCB0aGUgbmV3IHZlcnNpb24gdG8gc2VlIHRoZXkgYXJlIHRo ZSBzYW1lLg0KIw0KIw0KDQpURVNUX0RBVEExID0gPDxFTkQNCnRoaXMsIHRo YXQsIG90aGVyDQpvbmUsIHR3bywgdGhyZWUNCjEsMiwzDQoiYSBzdHJpbmci LCJxdW90ZSBcIlwiIGluIGEgc3RyaW5nIiwiY29tbWEgLCBpbiBhIHN0cmlu ZyINCkVORA0KDQpNVUxUSVBMRSA9IDMwMA0KUk9XUz1bIFsidGhpcyIsICIg dGhhdCIsICIgb3RoZXIiXSwNCiAgICAgICBbICJvbmUiLCAiIHR3byIsICIg dGhyZWUiXSwNCiAgICAgICBbICIxIiwgIjIiLCAiMyJdLA0KICAgICAgIFsg ImEgc3RyaW5nIiwgInF1b3RlIFwiIGluIGEgc3RyaW5nIiwgImNvbW1hICwg aW4gYSBzdHJpbmciXQ0KXQ0KcmVxdWlyZSBBUkdWWzBdDQoNCm9wZW4oInRl c3RfY3N2MS5kYXQiLCAidyIpIGRvIHxkYXRhfA0KICBkYXRhLnByaW50IFRF U1RfREFUQTENCmVuZA0Kb3BlbigidGVzdF9jc3YyLmRhdCIsICJ3IikgZG8g fGRhdGF8DQogIE1VTFRJUExFLnRpbWVzIGRvIHxpfA0KICAgIGRhdGEucHJp bnQgVEVTVF9EQVRBMQ0KICBlbmQNCmVuZA0KDQpkZWYgYXNzZXJ0X2VxdWFs KGEsYixtZXNzYWdlPSIje2EuaW5zcGVjdH0gIT0gI3tiLmluc3BlY3R9IikN CiAgcmFpc2UgbWVzc2FnZSB1bmxlc3MgYSA9PSBiDQplbmQNCmNvdW50ID0g MA0KWyJ0ZXN0X2NzdjEuZGF0IiwgInRlc3RfY3N2Mi5kYXQiXS5lYWNoIGRv IHxwYXRofA0KICBwdXRzIHBhdGguaW5zcGVjdA0KICBDU1Yub3BlbihwYXRo LCAiciIpIGRvIHxyb3d8DQogICAgIyBwdXRzIHJvdy5pbnNwZWN0DQogICAg YXNzZXJ0X2VxdWFsKHJvdywgUk9XU1tjb3VudF0pDQogICAgY291bnQgPSAo Y291bnQgKyAxKSAlIFJPV1Muc2l6ZQ0KICBlbmQNCmVuZA0KDQo= ---559023410-1141662977-1130496800=:19167-- ---559023410-1141662977-1130496800=:19167--