From user-return-4248-apmail-phoenix-user-archive=phoenix.apache.org@phoenix.apache.org Mon Nov 30 18:01:57 2015 Return-Path: X-Original-To: apmail-phoenix-user-archive@minotaur.apache.org Delivered-To: apmail-phoenix-user-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 9AE2418E1D for ; Mon, 30 Nov 2015 18:01:57 +0000 (UTC) Received: (qmail 14889 invoked by uid 500); 30 Nov 2015 18:01:57 -0000 Delivered-To: apmail-phoenix-user-archive@phoenix.apache.org Received: (qmail 14831 invoked by uid 500); 30 Nov 2015 18:01:56 -0000 Mailing-List: contact user-help@phoenix.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@phoenix.apache.org Delivered-To: mailing list user@phoenix.apache.org Received: (qmail 14821 invoked by uid 99); 30 Nov 2015 18:01:56 -0000 Received: from Unknown (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 30 Nov 2015 18:01:56 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id 54301C5782 for ; Mon, 30 Nov 2015 18:01:56 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 2.879 X-Spam-Level: ** X-Spam-Status: No, score=2.879 tagged_above=-999 required=6.31 tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HTML_MESSAGE=3, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_PASS=-0.001] autolearn=disabled Authentication-Results: spamd1-us-west.apache.org (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.com Received: from mx1-eu-west.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id hozfwf7RnmlJ for ; Mon, 30 Nov 2015 18:01:54 +0000 (UTC) Received: from mail-wm0-f44.google.com (mail-wm0-f44.google.com [74.125.82.44]) by mx1-eu-west.apache.org (ASF Mail Server at mx1-eu-west.apache.org) with ESMTPS id 4E55921195 for ; Mon, 30 Nov 2015 18:01:54 +0000 (UTC) Received: by wmww144 with SMTP id w144so148637039wmw.0 for ; Mon, 30 Nov 2015 10:01:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=NhCYNqsJBOvqdc+YUbxPxOTiZMgS+3Xwwm56qUdsbT8=; b=vzmj8/jZ2V5O0Zh51xb5Dz4kiZsHiWHSRHLSxJ+6tHvmt5O4iT/40ivh5aXb6KfLXL VJobgtb47CrOruQHDBDM8v+EaX/AEQrU0kZ+XZ43qhFqI+1zLMvRVmgNN0/dDCjzu7CN FDvVkuEg3MNsElAN+HtXkrwKrmzICiujHPuGbTnnPBUl+PhFGMjC/ZfOdKbq2I62U7qp 6ZSR7qVfQDKetJW3M0QNXZmQxVRWbLeFu5iNUFBsdBVCBepRX85tus1SAzT5CWfD9TWX JhbWmRKH9OwemSkZGmiNe9Zyxw0UUfx2kv7+M0ilKj8OajfmlkM58/jXr29i5frEjtPG IUhg== MIME-Version: 1.0 X-Received: by 10.194.191.134 with SMTP id gy6mr71466060wjc.173.1448906513878; Mon, 30 Nov 2015 10:01:53 -0800 (PST) Received: by 10.28.236.208 with HTTP; Mon, 30 Nov 2015 10:01:53 -0800 (PST) Date: Mon, 30 Nov 2015 19:01:53 +0100 Message-ID: Subject: Problem with arrays in phoenix-spark From: Dawid Wysakowicz To: user@phoenix.apache.org Content-Type: multipart/mixed; boundary=047d7b8739a6131ff20525c5d661 --047d7b8739a6131ff20525c5d661 Content-Type: multipart/alternative; boundary=047d7b8739a6131fee0525c5d65f --047d7b8739a6131fee0525c5d65f Content-Type: text/plain; charset=UTF-8 Hi, I've recently found some behaviour that I found buggy when working with phoenix-spark and arrays. Take a look at those unit tests: test("Can save arrays from custom dataframes back to phoenix") { val dataSet = List(Row(2L, Array("String1", "String2", "String3"))) val sqlContext = new SQLContext(sc) val schema = StructType( Seq(StructField("ID", LongType, nullable = false), StructField("VCARRAY", ArrayType(StringType)))) val rowRDD = sc.parallelize(dataSet) // Apply the schema to the RDD. val df = sqlContext.createDataFrame(rowRDD, schema) df.write .format("org.apache.phoenix.spark") .options(Map("table" -> "ARRAY_TEST_TABLE", "zkUrl" -> quorumAddress)) .mode(SaveMode.Overwrite) .save() } test("Can save arrays of AnyVal type back to phoenix") { val dataSet = List((2L, Array(1, 2, 3), Array(1L, 2L, 3L))) sc .parallelize(dataSet) .saveToPhoenix( "ARRAY_ANYVAL_TEST_TABLE", Seq("ID", "INTARRAY", "BIGINTARRAY"), zkUrl = Some(quorumAddress) ) // Load the results back val stmt = conn.createStatement() val rs = stmt.executeQuery("SELECT INTARRAY, BIGINTARRAY FROM ARRAY_ANYVAL_TEST_TABLE WHERE ID = 2") rs.next() val intArray = rs.getArray(1).getArray().asInstanceOf[Array[Int]] val longArray = rs.getArray(2).getArray().asInstanceOf[Array[Long]] // Verify the arrays are equal intArray shouldEqual dataSet(0)._2 longArray shouldEqual dataSet(0)._3 } Both fail with some ClassCastExceptions. In attached patch I've proposed a solution. The tricky part is with Array[Byte] as this would be same for both VARBINARY and TINYINT[]. Let me know If I should create an issue for this, and if my solution satisfies you. Regards Dawid Wysakowicz --047d7b8739a6131fee0525c5d65f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hi,

I've recently found some behavi= our that I found buggy when working with phoenix-spark and arrays.

Take a look at those unit tests:

=
=C2=A0 test("Can save arrays from custom dataframes back to phoen= ix") {
=C2=A0 =C2=A0 val dataSet =3D List(Row(2L, Array(&quo= t;String1", "String2", "String3")))

=
=C2=A0 =C2=A0 val sqlContext =3D new SQLContext(sc)
=C2=A0 =C2=A0 val schema =3D StructType(
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 Seq(StructField("ID", LongType, nullable =3D fa= lse),
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 StructField("= ;VCARRAY", ArrayType(StringType))))

=C2=A0 = =C2=A0 val rowRDD =3D sc.parallelize(dataSet)

=C2= =A0 =C2=A0 // Apply the schema to the RDD.
=C2=A0 =C2=A0 val df = =3D sqlContext.createDataFrame(rowRDD, schema)

=C2= =A0 =C2=A0 df.write
=C2=A0 =C2=A0 =C2=A0 .format("org.apache= .phoenix.spark")
=C2=A0 =C2=A0 =C2=A0 .options(Map("tab= le" -> "ARRAY_TEST_TABLE", "zkUrl" -> quorum= Address))
=C2=A0 =C2=A0 =C2=A0 .mode(SaveMode.Overwrite)
=C2=A0 =C2=A0 =C2=A0 .save()
=C2=A0 }

= =C2=A0 test("Can save arrays of AnyVal type back to phoenix") {
=C2=A0 =C2=A0 val dataSet =3D List((2L, Array(1, 2, 3), Array(1L, = 2L, 3L)))

=C2=A0 =C2=A0 sc
=C2=A0 =C2=A0= =C2=A0 .parallelize(dataSet)
=C2=A0 =C2=A0 =C2=A0 .saveToPhoenix= (
=C2=A0 =C2=A0 =C2=A0 =C2=A0 "ARRAY_ANYVAL_TEST_TABLE"= ,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 Seq("ID", "INTARRAY&= quot;, "BIGINTARRAY"),
=C2=A0 =C2=A0 =C2=A0 =C2=A0 zkUr= l =3D Some(quorumAddress)
=C2=A0 =C2=A0 =C2=A0 )

=C2=A0 =C2=A0 // Load the results back
=C2=A0 =C2=A0 val= stmt =3D conn.createStatement()
=C2=A0 =C2=A0 val rs =3D stmt.ex= ecuteQuery("SELECT INTARRAY, BIGINTARRAY FROM ARRAY_ANYVAL_TEST_TABLE = WHERE ID =3D 2")
=C2=A0 =C2=A0 rs.next()
=C2=A0 = =C2=A0 val intArray =3D rs.getArray(1).getArray().asInstanceOf[Array[Int]]<= /div>
=C2=A0 =C2=A0 val longArray =3D rs.getArray(2).getArray().asInsta= nceOf[Array[Long]]

=C2=A0 =C2=A0 // Verify the arr= ays are equal
=C2=A0 =C2=A0 intArray shouldEqual dataSet(0)._2
=C2=A0 =C2=A0 longArray shouldEqual dataSet(0)._3
=C2=A0 = }

Both fail with some ClassCastExceptions.

In attached patch I've proposed a solution. The= tricky part is with Array[Byte] as this would be same for both VARBINARY a= nd TINYINT[].

Let me know If I should create an is= sue for this, and if my solution satisfies you.

Re= gards
Dawid Wysakowicz


--047d7b8739a6131fee0525c5d65f-- --047d7b8739a6131ff20525c5d661 Content-Type: text/x-patch; charset=US-ASCII; name="phoenix-spark.patch" Content-Disposition: attachment; filename="phoenix-spark.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ihm9hyu10 RnJvbSA1ZDI0ODc0Y2QwYjJkMTU2MTg4NDNhZGEyMjE2MzRmYTJhMzcxZDM1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBkYXdpZCA8ZGF3aWQud3lzYWtvd2ljekBnbWFpbC5jb20+CkRh dGU6IE1vbiwgMzAgTm92IDIwMTUgMTg6NTQ6NDAgKzAxMDAKU3ViamVjdDogW1BBVENIXSBQaG9l bml4LXNwYXJrIGFycmF5cwoKLS0tCiBwaG9lbml4LXNwYXJrL3NyYy9pdC9yZXNvdXJjZXMvc2V0 dXAuc3FsICAgICAgICAgICB8ICAyICsKIC4uLi9vcmcvYXBhY2hlL3Bob2VuaXgvc3BhcmsvUGhv ZW5peFNwYXJrSVQuc2NhbGEgIHwgNDggKysrKysrKysrKysrKysrKysrKysrLQogLi4uL3Bob2Vu aXgvc3BhcmsvUGhvZW5peFJlY29yZFdyaXRhYmxlLnNjYWxhICAgICAgfCAyNyArKysrKysrKy0t LS0KIDMgZmlsZXMgY2hhbmdlZCwgNjcgaW5zZXJ0aW9ucygrKSwgMTAgZGVsZXRpb25zKC0pCgpk aWZmIC0tZ2l0IGEvcGhvZW5peC1zcGFyay9zcmMvaXQvcmVzb3VyY2VzL3NldHVwLnNxbCBiL3Bo b2VuaXgtc3Bhcmsvc3JjL2l0L3Jlc291cmNlcy9zZXR1cC5zcWwKaW5kZXggMTU0YTk5Ni4uZTk3 MTQ4YyAxMDA2NDQKLS0tIGEvcGhvZW5peC1zcGFyay9zcmMvaXQvcmVzb3VyY2VzL3NldHVwLnNx bAorKysgYi9waG9lbml4LXNwYXJrL3NyYy9pdC9yZXNvdXJjZXMvc2V0dXAuc3FsCkBAIC0zMCw2 ICszMCw4IEBAIFVQU0VSVCBJTlRPICJ0YWJsZTMiICgiaWQiLCAiY29sMSIpIFZBTFVFUyAoMSwg J2ZvbycpCiBVUFNFUlQgSU5UTyAidGFibGUzIiAoImlkIiwgImNvbDEiKSBWQUxVRVMgKDIsICdi YXInKQogQ1JFQVRFIFRBQkxFIEFSUkFZX1RFU1RfVEFCTEUgKElEIEJJR0lOVCBOT1QgTlVMTCBQ UklNQVJZIEtFWSwgVkNBUlJBWSBWQVJDSEFSW10pCiBVUFNFUlQgSU5UTyBBUlJBWV9URVNUX1RB QkxFIChJRCwgVkNBUlJBWSkgVkFMVUVTICgxLCBBUlJBWVsnU3RyaW5nMScsICdTdHJpbmcyJywg J1N0cmluZzMnXSkKK0NSRUFURSBUQUJMRSBBUlJBWV9BTllWQUxfVEVTVF9UQUJMRSAoSUQgQklH SU5UIE5PVCBOVUxMIFBSSU1BUlkgS0VZLCBJTlRBUlJBWSBJTlRFR0VSW10sIEJJR0lOVEFSUkFZ IEJJR0lOVFtdKQorVVBTRVJUIElOVE8gQVJSQVlfQU5ZVkFMX1RFU1RfVEFCTEUgKElELCBJTlRB UlJBWSwgQklHSU5UQVJSQVkpIFZBTFVFUyAoMSwgQVJSQVlbMSwgMiwgM10sIEFSUkFZWzEsIDIs IDNdKQogQ1JFQVRFIFRBQkxFIERBVEVfUFJFRElDQVRFX1RFU1RfVEFCTEUgKElEIEJJR0lOVCBO T1QgTlVMTCwgVElNRVNFUklFU19LRVkgVElNRVNUQU1QIE5PVCBOVUxMIENPTlNUUkFJTlQgcGsg UFJJTUFSWSBLRVkgKElELCBUSU1FU0VSSUVTX0tFWSkpCiBVUFNFUlQgSU5UTyBEQVRFX1BSRURJ Q0FURV9URVNUX1RBQkxFIChJRCwgVElNRVNFUklFU19LRVkpIFZBTFVFUyAoMSwgQ0FTVChDVVJS RU5UX1RJTUUoKSBBUyBUSU1FU1RBTVApKQogQ1JFQVRFIFRBQkxFIE9VVFBVVF9URVNUX1RBQkxF IChpZCBCSUdJTlQgTk9UIE5VTEwgUFJJTUFSWSBLRVksIGNvbDEgVkFSQ0hBUiwgY29sMiBJTlRF R0VSLCBjb2wzIERBVEUpCmRpZmYgLS1naXQgYS9waG9lbml4LXNwYXJrL3NyYy9pdC9zY2FsYS9v cmcvYXBhY2hlL3Bob2VuaXgvc3BhcmsvUGhvZW5peFNwYXJrSVQuc2NhbGEgYi9waG9lbml4LXNw YXJrL3NyYy9pdC9zY2FsYS9vcmcvYXBhY2hlL3Bob2VuaXgvc3BhcmsvUGhvZW5peFNwYXJrSVQu c2NhbGEKaW5kZXggZTFjOWRmNC4uODY3NjlmNiAxMDA2NDQKLS0tIGEvcGhvZW5peC1zcGFyay9z cmMvaXQvc2NhbGEvb3JnL2FwYWNoZS9waG9lbml4L3NwYXJrL1Bob2VuaXhTcGFya0lULnNjYWxh CisrKyBiL3Bob2VuaXgtc3Bhcmsvc3JjL2l0L3NjYWxhL29yZy9hcGFjaGUvcGhvZW5peC9zcGFy ay9QaG9lbml4U3BhcmtJVC5zY2FsYQpAQCAtMjMsOCArMjMsOCBAQCBpbXBvcnQgb3JnLmFwYWNo ZS5waG9lbml4LnF1ZXJ5LkJhc2VUZXN0CiBpbXBvcnQgb3JnLmFwYWNoZS5waG9lbml4LnNjaGVt YS57VGFibGVOb3RGb3VuZEV4Y2VwdGlvbiwgQ29sdW1uTm90Rm91bmRFeGNlcHRpb259CiBpbXBv cnQgb3JnLmFwYWNoZS5waG9lbml4LnNjaGVtYS50eXBlcy5QVmFyY2hhcgogaW1wb3J0IG9yZy5h cGFjaGUucGhvZW5peC51dGlsLntTY2hlbWFVdGlsLCBDb2x1bW5JbmZvfQotaW1wb3J0IG9yZy5h cGFjaGUuc3Bhcmsuc3FsLntTYXZlTW9kZSwgZXhlY3V0aW9uLCBTUUxDb250ZXh0fQotaW1wb3J0 IG9yZy5hcGFjaGUuc3Bhcmsuc3FsLnR5cGVzLntMb25nVHlwZSwgRGF0YVR5cGUsIFN0cmluZ1R5 cGUsIFN0cnVjdEZpZWxkfQoraW1wb3J0IG9yZy5hcGFjaGUuc3Bhcmsuc3FsLntSb3csIFNhdmVN b2RlLCBleGVjdXRpb24sIFNRTENvbnRleHR9CitpbXBvcnQgb3JnLmFwYWNoZS5zcGFyay5zcWwu dHlwZXMuXwogaW1wb3J0IG9yZy5hcGFjaGUuc3Bhcmsue1NwYXJrQ29uZiwgU3BhcmtDb250ZXh0 fQogaW1wb3J0IG9yZy5qb2RhLnRpbWUuRGF0ZVRpbWUKIGltcG9ydCBvcmcuc2NhbGF0ZXN0Ll8K QEAgLTQ0OCw0ICs0NDgsNDggQEAgY2xhc3MgUGhvZW5peFNwYXJrSVQgZXh0ZW5kcyBGdW5TdWl0 ZSB3aXRoIE1hdGNoZXJzIHdpdGggQmVmb3JlQW5kQWZ0ZXJBbGwgewogICAgIGNvdW50IHNob3Vs ZEVxdWFsIDFMCiAKICAgfQorCisgIHRlc3QoIkNhbiBzYXZlIGFycmF5cyBmcm9tIGN1c3RvbSBk YXRhZnJhbWVzIGJhY2sgdG8gcGhvZW5peCIpIHsKKyAgICB2YWwgZGF0YVNldCA9IExpc3QoUm93 KDJMLCBBcnJheSgiU3RyaW5nMSIsICJTdHJpbmcyIiwgIlN0cmluZzMiKSkpCisKKyAgICB2YWwg c3FsQ29udGV4dCA9IG5ldyBTUUxDb250ZXh0KHNjKQorCisgICAgdmFsIHNjaGVtYSA9IFN0cnVj dFR5cGUoCisgICAgICAgIFNlcShTdHJ1Y3RGaWVsZCgiSUQiLCBMb25nVHlwZSwgbnVsbGFibGUg PSBmYWxzZSksCisgICAgICAgICAgICBTdHJ1Y3RGaWVsZCgiVkNBUlJBWSIsIEFycmF5VHlwZShT dHJpbmdUeXBlKSkpKQorCisgICAgdmFsIHJvd1JERCA9IHNjLnBhcmFsbGVsaXplKGRhdGFTZXQp CisKKyAgICAvLyBBcHBseSB0aGUgc2NoZW1hIHRvIHRoZSBSREQuCisgICAgdmFsIGRmID0gc3Fs Q29udGV4dC5jcmVhdGVEYXRhRnJhbWUocm93UkRELCBzY2hlbWEpCisKKyAgICBkZi53cml0ZQor ICAgICAgLmZvcm1hdCgib3JnLmFwYWNoZS5waG9lbml4LnNwYXJrIikKKyAgICAgIC5vcHRpb25z KE1hcCgidGFibGUiIC0+ICJBUlJBWV9URVNUX1RBQkxFIiwgInprVXJsIiAtPiBxdW9ydW1BZGRy ZXNzKSkKKyAgICAgIC5tb2RlKFNhdmVNb2RlLk92ZXJ3cml0ZSkKKyAgICAgIC5zYXZlKCkKKyAg fQorCisgIHRlc3QoIkNhbiBzYXZlIGFycmF5cyBvZiBBbnlWYWwgdHlwZSBiYWNrIHRvIHBob2Vu aXgiKSB7CisgICAgdmFsIGRhdGFTZXQgPSBMaXN0KCgyTCwgQXJyYXkoMSwgMiwgMyksIEFycmF5 KDFMLCAyTCwgM0wpKSkKKworICAgIHNjCisgICAgICAucGFyYWxsZWxpemUoZGF0YVNldCkKKyAg ICAgIC5zYXZlVG9QaG9lbml4KAorICAgICAgICAiQVJSQVlfQU5ZVkFMX1RFU1RfVEFCTEUiLAor ICAgICAgICBTZXEoIklEIiwgIklOVEFSUkFZIiwgIkJJR0lOVEFSUkFZIiksCisgICAgICAgIHpr VXJsID0gU29tZShxdW9ydW1BZGRyZXNzKQorICAgICAgKQorCisgICAgLy8gTG9hZCB0aGUgcmVz dWx0cyBiYWNrCisgICAgdmFsIHN0bXQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpCisgICAgdmFs IHJzID0gc3RtdC5leGVjdXRlUXVlcnkoIlNFTEVDVCBJTlRBUlJBWSwgQklHSU5UQVJSQVkgRlJP TSBBUlJBWV9BTllWQUxfVEVTVF9UQUJMRSBXSEVSRSBJRCA9IDIiKQorICAgIHJzLm5leHQoKQor ICAgIHZhbCBpbnRBcnJheSA9IHJzLmdldEFycmF5KDEpLmdldEFycmF5KCkuYXNJbnN0YW5jZU9m W0FycmF5W0ludF1dCisgICAgdmFsIGxvbmdBcnJheSA9IHJzLmdldEFycmF5KDIpLmdldEFycmF5 KCkuYXNJbnN0YW5jZU9mW0FycmF5W0xvbmddXQorCisgICAgLy8gVmVyaWZ5IHRoZSBhcnJheXMg YXJlIGVxdWFsCisgICAgaW50QXJyYXkgc2hvdWxkRXF1YWwgZGF0YVNldCgwKS5fMgorICAgIGxv bmdBcnJheSBzaG91bGRFcXVhbCBkYXRhU2V0KDApLl8zCisgIH0KIH0KXCBObyBuZXdsaW5lIGF0 IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9waG9lbml4LXNwYXJrL3NyYy9tYWluL3NjYWxhL29y Zy9hcGFjaGUvcGhvZW5peC9zcGFyay9QaG9lbml4UmVjb3JkV3JpdGFibGUuc2NhbGEgYi9waG9l bml4LXNwYXJrL3NyYy9tYWluL3NjYWxhL29yZy9hcGFjaGUvcGhvZW5peC9zcGFyay9QaG9lbml4 UmVjb3JkV3JpdGFibGUuc2NhbGEKaW5kZXggZjExZjljYy4uYzkxZDEwNSAxMDA2NDQKLS0tIGEv cGhvZW5peC1zcGFyay9zcmMvbWFpbi9zY2FsYS9vcmcvYXBhY2hlL3Bob2VuaXgvc3BhcmsvUGhv ZW5peFJlY29yZFdyaXRhYmxlLnNjYWxhCisrKyBiL3Bob2VuaXgtc3Bhcmsvc3JjL21haW4vc2Nh bGEvb3JnL2FwYWNoZS9waG9lbml4L3NwYXJrL1Bob2VuaXhSZWNvcmRXcml0YWJsZS5zY2FsYQpA QCAtMTksNiArMTksNyBAQCBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLmxpYi5k Yi5EQldyaXRhYmxlCiBpbXBvcnQgb3JnLmFwYWNoZS5waG9lbml4LnNjaGVtYS50eXBlcy57UERh dGFUeXBlLCBQRGF0ZSwgUGhvZW5peEFycmF5fQogaW1wb3J0IG9yZy5hcGFjaGUucGhvZW5peC51 dGlsLkNvbHVtbkluZm8KIGltcG9ydCBvcmcuam9kYS50aW1lLkRhdGVUaW1lCitpbXBvcnQgc2Nh bGEuY29sbGVjdGlvbi5tdXRhYmxlLkFycmF5QnVmZmVyCiBpbXBvcnQgc2NhbGEuY29sbGVjdGlv bi57aW1tdXRhYmxlLCBtdXRhYmxlfQogaW1wb3J0IHNjYWxhLmNvbGxlY3Rpb24uSmF2YUNvbnZl cnNpb25zLl8KIApAQCAtNTMsMTUgKzU0LDI1IEBAIGNsYXNzIFBob2VuaXhSZWNvcmRXcml0YWJs ZShjb2x1bW5NZXRhRGF0YUxpc3Q6IExpc3RbQ29sdW1uSW5mb10pIGV4dGVuZHMgREJXcml0CiAg ICAgICAgICAgfQogCiAgICAgICAgICAgLy8gU2F2ZSBhcyBhcnJheSBvciBvYmplY3QKKyAgICAg ICAgICBkZWYgc2V0QXJyYXlJblN0YXRlbWVudChvYmo6IEFycmF5W0FueVJlZl0pOiBVbml0ID0g eworICAgICAgICAgICAgLy8gQ3JlYXRlIGEgamF2YS5zcWwuQXJyYXksIG5lZWQgdG8gbG9va3Vw IHRoZSBiYXNlIHNxbCB0eXBlIG5hbWUKKyAgICAgICAgICAgIHZhbCBzcWxBcnJheSA9IHN0YXRl bWVudC5nZXRDb25uZWN0aW9uLmNyZWF0ZUFycmF5T2YoCisgICAgICAgICAgICAgIFBEYXRhVHlw ZS5hcnJheUJhc2VUeXBlKGZpbmFsVHlwZSkuZ2V0U3FsVHlwZU5hbWUsCisgICAgICAgICAgICAg IG9iagorICAgICAgICAgICAgKQorICAgICAgICAgICAgc3RhdGVtZW50LnNldEFycmF5KGkgKyAx LCBzcWxBcnJheSkKKyAgICAgICAgICB9CisKICAgICAgICAgICBmaW5hbE9iaiBtYXRjaCB7Ci0g ICAgICAgICAgICBjYXNlIG9iajogQXJyYXlbQW55UmVmXSA9PiB7Ci0gICAgICAgICAgICAgIC8v IENyZWF0ZSBhIGphdmEuc3FsLkFycmF5LCBuZWVkIHRvIGxvb2t1cCB0aGUgYmFzZSBzcWwgdHlw ZSBuYW1lCi0gICAgICAgICAgICAgIHZhbCBzcWxBcnJheSA9IHN0YXRlbWVudC5nZXRDb25uZWN0 aW9uLmNyZWF0ZUFycmF5T2YoCi0gICAgICAgICAgICAgICAgUERhdGFUeXBlLmFycmF5QmFzZVR5 cGUoZmluYWxUeXBlKS5nZXRTcWxUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICBvYmoKLSAgICAg ICAgICAgICAgKQotICAgICAgICAgICAgICBzdGF0ZW1lbnQuc2V0QXJyYXkoaSArIDEsIHNxbEFy cmF5KQotICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBvYmo6IEFycmF5W0FueVJlZl0g PT4gc2V0QXJyYXlJblN0YXRlbWVudChvYmopCisgICAgICAgICAgICBjYXNlIG9iajogQXJyYXlC dWZmZXJbQW55UmVmXSA9PiBzZXRBcnJheUluU3RhdGVtZW50KG9iai50b0FycmF5KQorICAgICAg ICAgICAgY2FzZSBvYmo6IEFycmF5QnVmZmVyW0FueVZhbF0gPT4gc2V0QXJyYXlJblN0YXRlbWVu dChvYmoubWFwKF8uYXNJbnN0YW5jZU9mW0FueVJlZl0pLnRvQXJyYXkpCisgICAgICAgICAgICBj YXNlIG9iajogQXJyYXlbSW50XSA9PiBzZXRBcnJheUluU3RhdGVtZW50KG9iai5tYXAoXy5hc0lu c3RhbmNlT2ZbQW55UmVmXSkpCisgICAgICAgICAgICBjYXNlIG9iajogQXJyYXlbTG9uZ10gPT4g c2V0QXJyYXlJblN0YXRlbWVudChvYmoubWFwKF8uYXNJbnN0YW5jZU9mW0FueVJlZl0pKQorICAg ICAgICAgICAgY2FzZSBvYmo6IEFycmF5W0NoYXJdID0+IHNldEFycmF5SW5TdGF0ZW1lbnQob2Jq Lm1hcChfLmFzSW5zdGFuY2VPZltBbnlSZWZdKSkKKyAgICAgICAgICAgIGNhc2Ugb2JqOiBBcnJh eVtTaG9ydF0gPT4gc2V0QXJyYXlJblN0YXRlbWVudChvYmoubWFwKF8uYXNJbnN0YW5jZU9mW0Fu eVJlZl0pKQorICAgICAgICAgICAgY2FzZSBvYmo6IEFycmF5W0Zsb2F0XSA9PiBzZXRBcnJheUlu U3RhdGVtZW50KG9iai5tYXAoXy5hc0luc3RhbmNlT2ZbQW55UmVmXSkpCisgICAgICAgICAgICBj YXNlIG9iajogQXJyYXlbRG91YmxlXSA9PiBzZXRBcnJheUluU3RhdGVtZW50KG9iai5tYXAoXy5h c0luc3RhbmNlT2ZbQW55UmVmXSkpCiAgICAgICAgICAgICBjYXNlIF8gPT4gc3RhdGVtZW50LnNl dE9iamVjdChpICsgMSwgZmluYWxPYmopCiAgICAgICAgICAgfQogICAgICAgICB9IGVsc2Ugewot LSAKMS45LjEKCg== --047d7b8739a6131ff20525c5d661--