Fwd: How to preserve dates when copying rows with a CellCopyPolicy value for cellStyle set to false
Dan S <[email protected]> Tue, 11 Feb 2025 23:26:59 -0500
| Newsgroups | gmane.comp.jakarta.poi.user |
|---|---|
| Message-ID | <CANeOZMRRtqJ6KMmP+APwkw0LuKA2W=cMZjjsW+50kpNg9SQaVQ@mail.gmail.com> |
--00000000000004db9d062dea5b3e Content-Type: multipart/alternative; boundary="00000000000004db9c062dea5b3c" --00000000000004db9c062dea5b3c Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thank you very much for that example. It was very helpful. Based on the example, I changed my code, changing back the cellStyle to true in the CellCopyPolicy and I refactored the method copyRows from org.apache.poi.xssf.usermodel.XSSFSheet and method copyRowFrom from org.apache.poi.xssf.usermodel.XSSFRow instantiating a CellCopyContext in copyRows. The problem though is when I ran the following worksheet through, the resulting workbook with a single sheet has date formatted columns (as expected) in the column with header transaction_date is but the values in the column header transaction time is not date formatted where it should be (as it is in the original file). Attached is my new code and the sample file. Please advise. Thank you so much! On Tue, Feb 11, 2025 at 4:18=E2=80=AFPM PJ Fanning <[email protected]> w= rote: > That copyRows method doesn't allow you to specify the CellCopyContext. > We probably should add a variant of copyRows that supports this extra > param. The context keeps track of styles so that it avoids adding the > same style over and over - i.e. it spots the duplicate styles. > > This example might be useful > > https://github.com/pjfanning/excel-streaming-reader/blob/main/src/test/ja= va/com/github/pjfanning/xlsx/CopyToSXSSFUtil.java > > CellUtil.copyCell - this method can take a CellCopyContext instance. > > On Tue, 11 Feb 2025 at 17:48, Dan S <[email protected]> wrote: > > > > I hope I am addressing the right list. I am an Apache NIFI developer an= d > I > > have developed an Apache NIFI processor named SplitExcel which splits a > > multi sheet Microsoft Excel spreadsheet into multiple Microsoft Excel > > spreadsheets where each sheet from the original file is converted to an > > individual spreadsheet. Source code for this can be found here > > < > https://github.com/apache/nifi/blob/main/nifi-extension-bundles/nifi-poi-= bundle/nifi-poi-services/src/main/java/org/apache/nifi/processors/excel/Spl= itExcel.java > > > > (lines > > 165-188). > > In order to accomplish this, I use the > > com.github.pjfanning.xlsx.StreamingReader to stream the Excel workbook > > which allows for easy looping over each sheet. I create a new > XSSFWorkbook > > for each sheet there is in the existing workbook and I use XSSFSheet > > copyRows method to copy the rows from the existing sheet to a new sheet > to > > place in the new XSSFWorkbook. The CellCopyPolicy used has cellStyle se= t > to > > false in order to avoid exceeding the maximum number of cell styles > (fixed > > in NIFI-13726 <https://issues.apache.org/jira/browse/NIFI-13726>). The > > drawback though of using cellStyle set to false is that any columns whi= ch > > have dates, its date formatting is lost and what is left is a meaningle= ss > > number (reported in NIFI-14106 > > <https://issues.apache.org/jira/browse/NIFI-14106>). Is there a way I > can > > use copyRows not to exceed the maximum number of cell styles and yet ha= ve > > the formatting needed for dates? > --00000000000004db9c062dea5b3c Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"><div class=3D"gmail_quote gmail_quote_container"><div dir= =3D"ltr" class=3D"gmail_attr">Thank you very much for that example. It was = very helpful.=C2=A0 Based on the example,=C2=A0 I changed my code, changing= back the cellStyle to true in the=C2=A0CellCopyPolicy and I refactored the= method copyRows from=C2=A0org.apache.poi.xssf.usermodel.XSSFSheet and meth= od=C2=A0copyRowFrom from=C2=A0org.apache.poi.xssf.usermodel.XSSFRow instant= iating a=C2=A0CellCopyContext in copyRows. The problem though is when I ran= the following worksheet through, the resulting workbook with a single shee= t has date formatted columns (as expected) in the column with header=C2=A0t= ransaction_date is but=C2=A0the values in the column header transaction tim= e is not date formatted where it should be (as it is in the original file).= Attached is my new code and the sample file. Please advise. Thank you so m= uch!</div><br><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_at= tr">On Tue, Feb 11, 2025 at 4:18=E2=80=AFPM PJ Fanning <<a href=3D"mailt= o:[email protected]" target=3D"_blank">[email protected]</a>> wrot= e:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0= .8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">That copyRows= method doesn't allow you to specify the CellCopyContext.<br> We probably should add a variant of copyRows that supports this extra<br> param. The context keeps track of styles so that it avoids adding the<br> same style over and over - i.e. it spots the duplicate styles.<br> <br> This example might be useful<br> <a href=3D"https://github.com/pjfanning/excel-streaming-reader/blob/main/sr= c/test/java/com/github/pjfanning/xlsx/CopyToSXSSFUtil.java" rel=3D"noreferr= er" target=3D"_blank">https://github.com/pjfanning/excel-streaming-reader/b= lob/main/src/test/java/com/github/pjfanning/xlsx/CopyToSXSSFUtil.java</a><b= r> <br> CellUtil.copyCell - this method can take a CellCopyContext instance.<br> <br> On Tue, 11 Feb 2025 at 17:48, Dan S <<a href=3D"mailto:[email protected]= " target=3D"_blank">[email protected]</a>> wrote:<br> ><br> > I hope I am addressing the right list. I am an Apache NIFI developer a= nd I<br> > have developed an Apache NIFI processor named SplitExcel which splits = a<br> > multi sheet Microsoft Excel spreadsheet into multiple Microsoft Excel<= br> > spreadsheets where each sheet from the original file is converted to a= n<br> > individual spreadsheet. Source code for this can be found here<br> > <<a href=3D"https://github.com/apache/nifi/blob/main/nifi-extension= -bundles/nifi-poi-bundle/nifi-poi-services/src/main/java/org/apache/nifi/pr= ocessors/excel/SplitExcel.java" rel=3D"noreferrer" target=3D"_blank">https:= //github.com/apache/nifi/blob/main/nifi-extension-bundles/nifi-poi-bundle/n= ifi-poi-services/src/main/java/org/apache/nifi/processors/excel/SplitExcel.= java</a>><br> > (lines<br> > 165-188).<br> > In order to accomplish this, I use the<br> > com.github.pjfanning.xlsx.StreamingReader to stream the Excel workbook= <br> > which allows for easy looping over each sheet. I create a new XSSFWork= book<br> > for each sheet there is in the existing workbook and I use XSSFSheet<b= r> > copyRows method to copy the rows from the existing sheet to a new shee= t to<br> > place in the new XSSFWorkbook. The CellCopyPolicy used has cellStyle s= et to<br> > false in order to avoid exceeding the maximum number of cell styles (f= ixed<br> > in NIFI-13726 <<a href=3D"https://issues.apache.org/jira/browse/NIF= I-13726" rel=3D"noreferrer" target=3D"_blank">https://issues.apache.org/jir= a/browse/NIFI-13726</a>>). The<br> > drawback though of using cellStyle set to false is that any columns wh= ich<br> > have dates, its date formatting is lost and what is left is a meaningl= ess<br> > number (reported in NIFI-14106<br> > <<a href=3D"https://issues.apache.org/jira/browse/NIFI-14106" rel= =3D"noreferrer" target=3D"_blank">https://issues.apache.org/jira/browse/NIF= I-14106</a>>). Is there a way I can<br> > use copyRows not to exceed the maximum number of cell styles and yet h= ave<br> > the formatting needed for dates?<br> </blockquote></div> </div></div> --00000000000004db9c062dea5b3c-- --00000000000004db9d062dea5b3e Content-Type: application/ms-java; name="SplitExcel.java" Content-Disposition: attachment; filename="SplitExcel.java" Content-Transfer-Encoding: base64 Content-ID: <f_m715gcq40> X-Attachment-Id: f_m715gcq40 LyoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVu ZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0 aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9u YWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0Yg bGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNp b24gMi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNl cHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBj b3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGlj ZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3 IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0 aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VU IFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3Ig aW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292 ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4K ICovCnBhY2thZ2Ugb3JnLmFwYWNoZS5uaWZpLnByb2Nlc3NvcnMuZXhjZWw7CgppbXBvcnQgY29t LmdpdGh1Yi5wamZhbm5pbmcueGxzeC5TdHJlYW1pbmdSZWFkZXI7CmltcG9ydCBjb20uZ2l0aHVi LnBqZmFubmluZy54bHN4LmV4Y2VwdGlvbnMuRXhjZWxSdW50aW1lRXhjZXB0aW9uOwppbXBvcnQg b3JnLmFwYWNoZS5uaWZpLmFubm90YXRpb24uYmVoYXZpb3IuSW5wdXRSZXF1aXJlbWVudDsKaW1w b3J0IG9yZy5hcGFjaGUubmlmaS5hbm5vdGF0aW9uLmJlaGF2aW9yLlNpZGVFZmZlY3RGcmVlOwpp bXBvcnQgb3JnLmFwYWNoZS5uaWZpLmFubm90YXRpb24uYmVoYXZpb3IuU3VwcG9ydHNCYXRjaGlu ZzsKaW1wb3J0IG9yZy5hcGFjaGUubmlmaS5hbm5vdGF0aW9uLmJlaGF2aW9yLldyaXRlc0F0dHJp YnV0ZTsKaW1wb3J0IG9yZy5hcGFjaGUubmlmaS5hbm5vdGF0aW9uLmJlaGF2aW9yLldyaXRlc0F0 dHJpYnV0ZXM7CmltcG9ydCBvcmcuYXBhY2hlLm5pZmkuYW5ub3RhdGlvbi5kb2N1bWVudGF0aW9u LkNhcGFiaWxpdHlEZXNjcmlwdGlvbjsKaW1wb3J0IG9yZy5hcGFjaGUubmlmaS5hbm5vdGF0aW9u LmRvY3VtZW50YXRpb24uVGFnczsKaW1wb3J0IG9yZy5hcGFjaGUubmlmaS5jb21wb25lbnRzLlBy b3BlcnR5RGVzY3JpcHRvcjsKaW1wb3J0IG9yZy5hcGFjaGUubmlmaS5leGNlbC5Qcm90ZWN0aW9u VHlwZTsKaW1wb3J0IG9yZy5hcGFjaGUubmlmaS5mbG93ZmlsZS5GbG93RmlsZTsKaW1wb3J0IG9y Zy5hcGFjaGUubmlmaS5mbG93ZmlsZS5hdHRyaWJ1dGVzLkNvcmVBdHRyaWJ1dGVzOwppbXBvcnQg b3JnLmFwYWNoZS5uaWZpLnByb2Nlc3Nvci5BYnN0cmFjdFByb2Nlc3NvcjsKaW1wb3J0IG9yZy5h cGFjaGUubmlmaS5wcm9jZXNzb3IuUHJvY2Vzc0NvbnRleHQ7CmltcG9ydCBvcmcuYXBhY2hlLm5p ZmkucHJvY2Vzc29yLlByb2Nlc3NTZXNzaW9uOwppbXBvcnQgb3JnLmFwYWNoZS5uaWZpLnByb2Nl c3Nvci5SZWxhdGlvbnNoaXA7CmltcG9ydCBvcmcuYXBhY2hlLm5pZmkucHJvY2Vzc29yLmV4Y2Vw dGlvbi5Qcm9jZXNzRXhjZXB0aW9uOwppbXBvcnQgb3JnLmFwYWNoZS5uaWZpLnByb2Nlc3Nvci51 dGlsLlN0YW5kYXJkVmFsaWRhdG9yczsKaW1wb3J0IG9yZy5hcGFjaGUucG9pLmNvbW1vbi5EdXBs aWNhdGFibGU7CmltcG9ydCBvcmcuYXBhY2hlLnBvaS5zcy5TcHJlYWRzaGVldFZlcnNpb247Cmlt cG9ydCBvcmcuYXBhY2hlLnBvaS5zcy5mb3JtdWxhLkZvcm11bGFTaGlmdGVyOwppbXBvcnQgb3Jn LmFwYWNoZS5wb2kuc3MudXNlcm1vZGVsLkNlbGw7CmltcG9ydCBvcmcuYXBhY2hlLnBvaS5zcy51 c2VybW9kZWwuQ2VsbENvcHlDb250ZXh0OwppbXBvcnQgb3JnLmFwYWNoZS5wb2kuc3MudXNlcm1v ZGVsLkNlbGxDb3B5UG9saWN5OwppbXBvcnQgb3JnLmFwYWNoZS5wb2kuc3MudXNlcm1vZGVsLkNl bGxTdHlsZTsKaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5DZWxsVHlwZTsKaW1w b3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2RlbC5EYXRhRm9ybWF0dGVyOwppbXBvcnQgb3Jn LmFwYWNoZS5wb2kuc3MudXNlcm1vZGVsLkRhdGVVdGlsOwppbXBvcnQgb3JnLmFwYWNoZS5wb2ku c3MudXNlcm1vZGVsLkh5cGVybGluazsKaW1wb3J0IG9yZy5hcGFjaGUucG9pLnNzLnVzZXJtb2Rl bC5Sb3c7CmltcG9ydCBvcmcuYXBhY2hlLnBvaS5zcy51c2VybW9kZWwuU2hlZXQ7CmltcG9ydCBv cmcuYXBhY2hlLnBvaS5zcy51c2VybW9kZWwuV29ya2Jvb2s7CmltcG9ydCBvcmcuYXBhY2hlLnBv aS5zcy51dGlsLkNlbGxSYW5nZUFkZHJlc3M7CmltcG9ydCBvcmcuYXBhY2hlLnBvaS5zcy51dGls LkNlbGxVdGlsOwppbXBvcnQgb3JnLmFwYWNoZS5wb2kueHNzZi51c2VybW9kZWwuWFNTRlJvdzsK aW1wb3J0IG9yZy5hcGFjaGUucG9pLnhzc2YudXNlcm1vZGVsLlhTU0ZTaGVldDsKaW1wb3J0IG9y Zy5hcGFjaGUucG9pLnhzc2YudXNlcm1vZGVsLlhTU0ZXb3JrYm9vazsKaW1wb3J0IG9yZy5hcGFj aGUucG9pLnhzc2YudXNlcm1vZGVsLmhlbHBlcnMuWFNTRlJvd1NoaWZ0ZXI7CgppbXBvcnQgamF2 YS5pby5PdXRwdXRTdHJlYW07CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2 YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKaW1wb3J0IGphdmEudXRp bC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk1hcDsK aW1wb3J0IGphdmEudXRpbC5TZXQ7CmltcG9ydCBqYXZhLnV0aWwuVVVJRDsKCmltcG9ydCBzdGF0 aWMgb3JnLmFwYWNoZS5uaWZpLmZsb3dmaWxlLmF0dHJpYnV0ZXMuRnJhZ21lbnRBdHRyaWJ1dGVz LkZSQUdNRU5UX0NPVU5UOwppbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubmlmaS5mbG93ZmlsZS5h dHRyaWJ1dGVzLkZyYWdtZW50QXR0cmlidXRlcy5GUkFHTUVOVF9JRDsKaW1wb3J0IHN0YXRpYyBv cmcuYXBhY2hlLm5pZmkuZmxvd2ZpbGUuYXR0cmlidXRlcy5GcmFnbWVudEF0dHJpYnV0ZXMuRlJB R01FTlRfSU5ERVg7CmltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5uaWZpLmZsb3dmaWxlLmF0dHJp YnV0ZXMuRnJhZ21lbnRBdHRyaWJ1dGVzLlNFR01FTlRfT1JJR0lOQUxfRklMRU5BTUU7CgpAU2lk ZUVmZmVjdEZyZWUKQFN1cHBvcnRzQmF0Y2hpbmcKQFRhZ3MoeyJzcGxpdCIsICJ0ZXh0In0pCkBJ bnB1dFJlcXVpcmVtZW50KElucHV0UmVxdWlyZW1lbnQuUmVxdWlyZW1lbnQuSU5QVVRfUkVRVUlS RUQpCkBDYXBhYmlsaXR5RGVzY3JpcHRpb24oIlRoaXMgcHJvY2Vzc29yIHNwbGl0cyBhIG11bHRp IHNoZWV0IE1pY3Jvc29mdCBFeGNlbCBzcHJlYWRzaGVldCBpbnRvIG11bHRpcGxlIE1pY3Jvc29m dCBFeGNlbCBzcHJlYWRzaGVldHMgd2hlcmUgZWFjaCBzaGVldCBmcm9tIHRoZSBvcmlnaW5hbCIg KwogICAgICAgICIgZmlsZSBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5kaXZpZHVhbCBzcHJlYWRzaGVl dCBpbiBpdHMgb3duIGZsb3cgZmlsZS4gQ3VycmVudGx5IHRoaXMgcHJvY2Vzc29yIGlzIG9ubHkg Y2FwYWJsZSBvZiBwcm9jZXNzaW5nIC54bHN4IiArCiAgICAgICAgIiAoWFNTRiAyMDA3IE9PWE1M IGZpbGUgZm9ybWF0KSBFeGNlbCBkb2N1bWVudHMgYW5kIG5vdCBvbGRlciAueGxzIChIU1NGICc5 NygtMjAwNykgZmlsZSBmb3JtYXQpIGRvY3VtZW50cy4iICsKICAgICAgICAiIFBsZWFzZSBub3Rl IGFsbCBvcmlnaW5hbCBjZWxsIHN0eWxlcyBhcmUgZHJvcHBlZCBhbmQgZm9ybXVsYXMgYXJlIHJl bW92ZWQgbGVhdmluZyBvbmx5IHRoZSBjYWxjdWxhdGVkIHZhbHVlcy4iICsKICAgICAgICAiIEV2 ZW4gYSBzaW5nbGUgc2hlZXQgTWljcm9zb2Z0IEV4Y2VsIHNwcmVhZHNoZWV0IGlzIGNvbnZlcnRl ZCB0byBpdHMgb3duIGZsb3cgZmlsZSB3aXRoIGFsbCB0aGUgb3JpZ2luYWwgY2VsbCBzdHlsZXMg ZHJvcHBlZCBhbmQgZm9ybXVsYXMgcmVtb3ZlZC4iCikKQFdyaXRlc0F0dHJpYnV0ZXMoewogICAg ICAgIEBXcml0ZXNBdHRyaWJ1dGUoYXR0cmlidXRlID0gImZyYWdtZW50LmlkZW50aWZpZXIiLCBk ZXNjcmlwdGlvbiA9ICJBbGwgc3BsaXQgRXhjZWwgRmxvd0ZpbGVzIHByb2R1Y2VkIGZyb20gdGhl IHNhbWUgcGFyZW50IEV4Y2VsIEZsb3dGaWxlIHdpbGwgaGF2ZSB0aGUgc2FtZSByYW5kb21seSBn ZW5lcmF0ZWQgVVVJRCBhZGRlZCIgKwogICAgICAgICAgICAgICAgIiBmb3IgdGhpcyBhdHRyaWJ1 dGUiKSwKICAgICAgICBAV3JpdGVzQXR0cmlidXRlKGF0dHJpYnV0ZSA9ICJmcmFnbWVudC5pbmRl eCIsIGRlc2NyaXB0aW9uID0gIkEgb25lLXVwIG51bWJlciB0aGF0IGluZGljYXRlcyB0aGUgb3Jk ZXJpbmcgb2YgdGhlIHNwbGl0IEV4Y2VsIEZsb3dGaWxlcyB0aGF0IHdlcmUgY3JlYXRlZCBmcm9t IGEgc2luZ2xlIHBhcmVudCBFeGNlbCBGbG93RmlsZSIpLAogICAgICAgIEBXcml0ZXNBdHRyaWJ1 dGUoYXR0cmlidXRlID0gImZyYWdtZW50LmNvdW50IiwgZGVzY3JpcHRpb24gPSAiVGhlIG51bWJl ciBvZiBzcGxpdCBFeGNlbCBGbG93RmlsZXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBhcmVudCBFeGNl bCBGbG93RmlsZSIpLAogICAgICAgIEBXcml0ZXNBdHRyaWJ1dGUoYXR0cmlidXRlID0gInNlZ21l bnQub3JpZ2luYWwuZmlsZW5hbWUiLCBkZXNjcmlwdGlvbiA9ICJUaGUgZmlsZW5hbWUgb2YgdGhl IHBhcmVudCBFeGNlbCBGbG93RmlsZSIpLAogICAgICAgIEBXcml0ZXNBdHRyaWJ1dGUoYXR0cmli dXRlID0gU3BsaXRFeGNlbC5TSEVFVF9OQU1FLCBkZXNjcmlwdGlvbiA9ICJUaGUgbmFtZSBvZiB0 aGUgRXhjZWwgc2hlZXQgZnJvbSB0aGUgb3JpZ2luYWwgc3ByZWFkc2hlZXQuIiksCiAgICAgICAg QFdyaXRlc0F0dHJpYnV0ZShhdHRyaWJ1dGUgPSBTcGxpdEV4Y2VsLlRPVEFMX1JPV1MsIGRlc2Ny aXB0aW9uID0gIlRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgRXhjZWwgc2hlZXQgZnJvbSB0aGUg b3JpZ2luYWwgc3ByZWFkc2hlZXQuIil9KQpwdWJsaWMgY2xhc3MgU3BsaXRFeGNlbCBleHRlbmRz IEFic3RyYWN0UHJvY2Vzc29yIHsKICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIRUVU X05BTUUgPSAic2hlZXRuYW1lIjsKICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPVEFM X1JPV1MgPSAidG90YWwucm93cyI7CiAgICBzdGF0aWMgZmluYWwgRGF0YUZvcm1hdHRlciBEQVRB X0ZPUk1BVFRFUiA9IG5ldyBEYXRhRm9ybWF0dGVyKCk7CgogICAgcHVibGljIHN0YXRpYyBmaW5h bCBQcm9wZXJ0eURlc2NyaXB0b3IgUFJPVEVDVElPTl9UWVBFID0gbmV3IFByb3BlcnR5RGVzY3Jp cHRvci5CdWlsZGVyKCkKICAgICAgICAgICAgLm5hbWUoIlByb3RlY3Rpb24gVHlwZSIpCiAgICAg ICAgICAgIC5kZXNjcmlwdGlvbigiU3BlY2lmaWVzIHdoZXRoZXIgYW4gRXhjZWwgc3ByZWFkc2hl ZXQgaXMgcHJvdGVjdGVkIGJ5IGEgcGFzc3dvcmQgb3Igbm90LiIpCiAgICAgICAgICAgIC5yZXF1 aXJlZCh0cnVlKQogICAgICAgICAgICAuYWxsb3dhYmxlVmFsdWVzKFByb3RlY3Rpb25UeXBlLmNs YXNzKQogICAgICAgICAgICAuZGVmYXVsdFZhbHVlKFByb3RlY3Rpb25UeXBlLlVOUFJPVEVDVEVE KQogICAgICAgICAgICAuYnVpbGQoKTsKCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFByb3BlcnR5 RGVzY3JpcHRvciBQQVNTV09SRCA9IG5ldyBQcm9wZXJ0eURlc2NyaXB0b3IuQnVpbGRlcigpCiAg ICAgICAgICAgIC5uYW1lKCJQYXNzd29yZCIpCiAgICAgICAgICAgIC5kZXNjcmlwdGlvbigiVGhl IHBhc3N3b3JkIGZvciBhIHBhc3N3b3JkIHByb3RlY3RlZCBFeGNlbCBzcHJlYWRzaGVldCIpCiAg ICAgICAgICAgIC5yZXF1aXJlZCh0cnVlKQogICAgICAgICAgICAuc2Vuc2l0aXZlKHRydWUpCiAg ICAgICAgICAgIC5hZGRWYWxpZGF0b3IoU3RhbmRhcmRWYWxpZGF0b3JzLk5PTl9CTEFOS19WQUxJ REFUT1IpCiAgICAgICAgICAgIC5kZXBlbmRzT24oUFJPVEVDVElPTl9UWVBFLCBQcm90ZWN0aW9u VHlwZS5QQVNTV09SRCkKICAgICAgICAgICAgLmJ1aWxkKCk7CgogICAgcHVibGljIHN0YXRpYyBm aW5hbCBSZWxhdGlvbnNoaXAgUkVMX09SSUdJTkFMID0gbmV3IFJlbGF0aW9uc2hpcC5CdWlsZGVy KCkKICAgICAgICAgICAgLm5hbWUoIm9yaWdpbmFsIikKICAgICAgICAgICAgLmRlc2NyaXB0aW9u KCJUaGUgb3JpZ2luYWwgRmxvd0ZpbGUgdGhhdCB3YXMgc3BsaXQgaW50byBzZWdtZW50cy4gSWYg dGhlIEZsb3dGaWxlIGZhaWxzIHByb2Nlc3NpbmcsIG5vdGhpbmcgd2lsbCBiZSBzZW50IHRvIHRo aXMgcmVsYXRpb25zaGlwIikKICAgICAgICAgICAgLmJ1aWxkKCk7CgogICAgcHVibGljIHN0YXRp YyBmaW5hbCBSZWxhdGlvbnNoaXAgUkVMX0ZBSUxVUkUgPSBuZXcgUmVsYXRpb25zaGlwLkJ1aWxk ZXIoKQogICAgICAgICAgICAubmFtZSgiZmFpbHVyZSIpCiAgICAgICAgICAgIC5kZXNjcmlwdGlv bigiSWYgYSBGbG93RmlsZSBjYW5ub3QgYmUgdHJhbnNmb3JtZWQgZnJvbSB0aGUgY29uZmlndXJl ZCBpbnB1dCBmb3JtYXQgdG8gdGhlIGNvbmZpZ3VyZWQgb3V0cHV0IGZvcm1hdCwgdGhlIHVuY2hh bmdlZCBGbG93RmlsZSB3aWxsIGJlIHJvdXRlZCB0byB0aGlzIHJlbGF0aW9uc2hpcC4iKQogICAg ICAgICAgICAuYnVpbGQoKTsKCiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJlbGF0aW9uc2hpcCBS RUxfU1BMSVQgPSBuZXcgUmVsYXRpb25zaGlwLkJ1aWxkZXIoKQogICAgICAgICAgICAubmFtZSgi c3BsaXQiKQogICAgICAgICAgICAuZGVzY3JpcHRpb24oIlRoZSBpbmRpdmlkdWFsIEV4Y2VsICdz ZWdtZW50cycgb2YgdGhlIG9yaWdpbmFsIEV4Y2VsIEZsb3dGaWxlIHdpbGwgYmUgcm91dGVkIHRv IHRoaXMgcmVsYXRpb25zaGlwLiIpCiAgICAgICAgICAgIC5idWlsZCgpOwoKICAgIHByaXZhdGUg c3RhdGljIGZpbmFsIExpc3Q8UHJvcGVydHlEZXNjcmlwdG9yPiBQUk9QRVJUWV9ERVNDUklQVE9S UyA9IExpc3Qub2YoCiAgICAgICAgICAgIFBST1RFQ1RJT05fVFlQRSwKICAgICAgICAgICAgUEFT U1dPUkQKICAgICk7CgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFJlbGF0aW9uc2hpcD4g UkVMQVRJT05TSElQUyA9IFNldC5vZigKICAgICAgICAgICAgUkVMX09SSUdJTkFMLAogICAgICAg ICAgICBSRUxfRkFJTFVSRSwKICAgICAgICAgICAgUkVMX1NQTElUCiAgICApOwoKICAgIHByaXZh dGUgc3RhdGljIGZpbmFsIENlbGxDb3B5UG9saWN5IENFTExfQ09QWV9QT0xJQ1kgPSBuZXcgQ2Vs bENvcHlQb2xpY3kuQnVpbGRlcigpCiAgICAgICAgICAgIC5jZWxsRm9ybXVsYShmYWxzZSkgLy8g Tk9URTogc2V0dGluZyB0byBmYWxzZSBhbGxvd3MgZm9yIGNvcHlpbmcgdGhlIGV2YWx1YXRlZCBm b3JtdWxhIHZhbHVlLgogICAgICAgICAgICAuY2VsbFN0eWxlKENlbGxDb3B5UG9saWN5LkRFRkFV TFRfQ09QWV9DRUxMX1NUWUxFX1BPTElDWSkKICAgICAgICAgICAgLmNvcHlIeXBlcmxpbmsoQ2Vs bENvcHlQb2xpY3kuREVGQVVMVF9DT1BZX0hZUEVSTElOS19QT0xJQ1kpCiAgICAgICAgICAgIC5t ZXJnZUh5cGVybGluayhDZWxsQ29weVBvbGljeS5ERUZBVUxUX01FUkdFX0hZUEVSTElOS19QT0xJ Q1kpCiAgICAgICAgICAgIC5tZXJnZWRSZWdpb25zKENlbGxDb3B5UG9saWN5LkRFRkFVTFRfQ09Q WV9NRVJHRURfUkVHSU9OU19QT0xJQ1kpCiAgICAgICAgICAgIC5yb3dIZWlnaHQoQ2VsbENvcHlQ b2xpY3kuREVGQVVMVF9DT1BZX1JPV19IRUlHSFRfUE9MSUNZKQogICAgICAgICAgICAuYnVpbGQo KTsKCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBTZXQ8UmVsYXRpb25zaGlwPiBnZXRSZWxhdGlv bnNoaXBzKCkgewogICAgICAgIHJldHVybiBSRUxBVElPTlNISVBTOwogICAgfQoKICAgIEBPdmVy cmlkZQogICAgcHVibGljIGZpbmFsIExpc3Q8UHJvcGVydHlEZXNjcmlwdG9yPiBnZXRTdXBwb3J0 ZWRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewogICAgICAgIHJldHVybiBQUk9QRVJUWV9ERVNDUklQ VE9SUzsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyB2b2lkIG9uVHJpZ2dlcihQcm9j ZXNzQ29udGV4dCBjb250ZXh0LCBQcm9jZXNzU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgUHJvY2Vz c0V4Y2VwdGlvbiB7CiAgICAgICAgRmxvd0ZpbGUgb3JpZ2luYWxGbG93RmlsZSA9IHNlc3Npb24u Z2V0KCk7CiAgICAgICAgaWYgKG9yaWdpbmFsRmxvd0ZpbGUgPT0gbnVsbCkgewogICAgICAgICAg ICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBmaW5hbCBTdHJpbmcgcGFzc3dvcmQgPSBjb250 ZXh0LmdldFByb3BlcnR5KFBBU1NXT1JEKS5nZXRWYWx1ZSgpOwogICAgICAgIGZpbmFsIExpc3Q8 V29ya2Jvb2tTcGxpdD4gd29ya2Jvb2tTcGxpdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKCiAgICAg ICAgdHJ5IHsKICAgICAgICAgICAgc2Vzc2lvbi5yZWFkKG9yaWdpbmFsRmxvd0ZpbGUsIGluIC0+ IHsKCiAgICAgICAgICAgICAgICBmaW5hbCBXb3JrYm9vayBvcmlnaW5hbFdvcmtib29rID0gU3Ry ZWFtaW5nUmVhZGVyLmJ1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAucm93Q2FjaGVT aXplKDEwMCkKICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclNpemUoNDA5NikKICAgICAg ICAgICAgICAgICAgICAgICAgLnBhc3N3b3JkKHBhc3N3b3JkKQogICAgICAgICAgICAgICAgICAg ICAgICAuc2V0UmVhZEh5cGVybGlua3ModHJ1ZSkgLy8gTk9URTogTmVlZGVkIGZvciBjb3B5aW5n IHJvd3MuCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRSZWFkU2hhcmVkRm9ybXVsYXModHJ1 ZSkgLy8gTk9URTogSWYgbm90IHNldCB0byB0cnVlLCB0aGVuIGRhdGEgd2l0aCBzaGFyZWQgZm9y bXVsYXMgZmFpbC4KICAgICAgICAgICAgICAgICAgICAgICAgLm9wZW4oaW4pOwoKICAgICAgICAg ICAgICAgIGludCBpbmRleCA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFNoZWV0IG9y aWdpbmFsU2hlZXQgOiBvcmlnaW5hbFdvcmtib29rKSB7CiAgICAgICAgICAgICAgICAgICAgZmlu YWwgU3RyaW5nIG9yaWdpbmFsU2hlZXROYW1lID0gb3JpZ2luYWxTaGVldC5nZXRTaGVldE5hbWUo KTsKICAgICAgICAgICAgICAgICAgICB0cnkgKFhTU0ZXb3JrYm9vayBuZXdXb3JrYm9vayA9IG5l dyBYU1NGV29ya2Jvb2soKSkgewogICAgICAgICAgICAgICAgICAgICAgICBYU1NGU2hlZXQgbmV3 U2hlZXQgPSBuZXdXb3JrYm9vay5jcmVhdGVTaGVldChvcmlnaW5hbFNoZWV0TmFtZSk7CiAgICAg ICAgICAgICAgICAgICAgICAgIExpc3Q8Um93PiBvcmlnaW5hbFJvd3MgPSBuZXcgQXJyYXlMaXN0 PD4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSb3cgb3JpZ2luYWxSb3cgOiBvcmln aW5hbFNoZWV0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFJvd3MuYWRk KG9yaWdpbmFsUm93KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAg ICAgICAgICAgaWYgKCFvcmlnaW5hbFJvd3MuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAg ICAgICAgICAgICBjb3B5Um93cyhuZXdTaGVldCwgb3JpZ2luYWxSb3dzLCBvcmlnaW5hbFNoZWV0 LmdldEZpcnN0Um93TnVtKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAg ICAgICAgICAgICAgICBGbG93RmlsZSBuZXdGbG93RmlsZSA9IHNlc3Npb24uY3JlYXRlKG9yaWdp bmFsRmxvd0ZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgKGZpbmFsIE91dHB1dFN0 cmVhbSBvdXQgPSBzZXNzaW9uLndyaXRlKG5ld0Zsb3dGaWxlKSkgewogICAgICAgICAgICAgICAg ICAgICAgICAgICAgbmV3V29ya2Jvb2sud3JpdGUob3V0KTsKICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHdvcmtib29rU3BsaXRzLmFkZChuZXcgV29ya2Jvb2tTcGxpdChpbmRleCwgbmV3Rmxv d0ZpbGUsIG9yaWdpbmFsU2hlZXROYW1lLCBvcmlnaW5hbFJvd3Muc2l6ZSgpKSk7CiAgICAgICAg ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAg ICAgIGluZGV4Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0g Y2F0Y2ggKEV4Y2VsUnVudGltZUV4Y2VwdGlvbiB8IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB8IFBy b2Nlc3NFeGNlcHRpb24gZSkgewogICAgICAgICAgICBnZXRMb2dnZXIoKS5lcnJvcigiRmFpbGVk IHRvIHNwbGl0IHt9Iiwgb3JpZ2luYWxGbG93RmlsZSwgZSk7CiAgICAgICAgICAgIHNlc3Npb24u cmVtb3ZlKHdvcmtib29rU3BsaXRzLnN0cmVhbSgpCiAgICAgICAgICAgICAgICAgICAgLm1hcChX b3JrYm9va1NwbGl0Ojpjb250ZW50KQogICAgICAgICAgICAgICAgICAgIC50b0xpc3QoKSk7CiAg ICAgICAgICAgIHdvcmtib29rU3BsaXRzLmNsZWFyKCk7CiAgICAgICAgICAgIHNlc3Npb24udHJh bnNmZXIob3JpZ2luYWxGbG93RmlsZSwgUkVMX0ZBSUxVUkUpOwogICAgICAgICAgICByZXR1cm47 CiAgICAgICAgfQoKICAgICAgICBmaW5hbCBTdHJpbmcgZnJhZ21lbnRJZCA9IFVVSUQucmFuZG9t VVVJRCgpLnRvU3RyaW5nKCk7CiAgICAgICAgZmluYWwgU3RyaW5nIG9yaWdpbmFsRmlsZU5hbWUg PSBvcmlnaW5hbEZsb3dGaWxlLmdldEF0dHJpYnV0ZShDb3JlQXR0cmlidXRlcy5GSUxFTkFNRS5r ZXkoKSk7CiAgICAgICAgZmluYWwgaW50IGV4dGVuc2lvbkluZGV4ID0gb3JpZ2luYWxGaWxlTmFt ZS5sYXN0SW5kZXhPZigiLiIpOwogICAgICAgIFN0cmluZyBvcmlnaW5hbEZpbGVOYW1lV2l0aG91 dEV4dGVuc2lvbiA9IG9yaWdpbmFsRmlsZU5hbWU7CiAgICAgICAgU3RyaW5nIG9yaWdpbmFsRmls ZU5hbWVFeHRlbnNpb24gPSAiIjsKCiAgICAgICAgaWYgKGV4dGVuc2lvbkluZGV4ID4gLTEpIHsK ICAgICAgICAgICAgb3JpZ2luYWxGaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24gPSBvcmlnaW5hbEZp bGVOYW1lLnN1YnN0cmluZygwLCBleHRlbnNpb25JbmRleCk7CiAgICAgICAgICAgIG9yaWdpbmFs RmlsZU5hbWVFeHRlbnNpb24gPSBvcmlnaW5hbEZpbGVOYW1lLnN1YnN0cmluZyhleHRlbnNpb25J bmRleCk7CiAgICAgICAgfQoKICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJp YnV0ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgYXR0cmlidXRlcy5wdXQoRlJBR01FTlRf Q09VTlQua2V5KCksIFN0cmluZy52YWx1ZU9mKHdvcmtib29rU3BsaXRzLnNpemUoKSkpOwogICAg ICAgIGF0dHJpYnV0ZXMucHV0KEZSQUdNRU5UX0lELmtleSgpLCBmcmFnbWVudElkKTsKICAgICAg ICBhdHRyaWJ1dGVzLnB1dChTRUdNRU5UX09SSUdJTkFMX0ZJTEVOQU1FLmtleSgpLCBvcmlnaW5h bEZpbGVOYW1lKTsKCiAgICAgICAgZm9yIChXb3JrYm9va1NwbGl0IHNwbGl0IDogd29ya2Jvb2tT cGxpdHMpIHsKICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoQ29yZUF0dHJpYnV0ZXMuRklMRU5B TUUua2V5KCksIFN0cmluZy5mb3JtYXQoIiVzLSVzJXMiLCBvcmlnaW5hbEZpbGVOYW1lV2l0aG91 dEV4dGVuc2lvbiwgc3BsaXQuaW5kZXgoKSwgb3JpZ2luYWxGaWxlTmFtZUV4dGVuc2lvbikpOwog ICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChGUkFHTUVOVF9JTkRFWC5rZXkoKSwgSW50ZWdlci50 b1N0cmluZyhzcGxpdC5pbmRleCgpKSk7CiAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KFNIRUVU X05BTUUsIHNwbGl0LnNoZWV0TmFtZSgpKTsKICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoVE9U QUxfUk9XUywgSW50ZWdlci50b1N0cmluZyhzcGxpdC5udW1Sb3dzKCkpKTsKICAgICAgICAgICAg c2Vzc2lvbi5wdXRBbGxBdHRyaWJ1dGVzKHNwbGl0LmNvbnRlbnQoKSwgYXR0cmlidXRlcyk7CiAg ICAgICAgfQoKICAgICAgICBzZXNzaW9uLnRyYW5zZmVyKG9yaWdpbmFsRmxvd0ZpbGUsIFJFTF9P UklHSU5BTCk7CiAgICAgICAgZmluYWwgTGlzdDxGbG93RmlsZT4gZmxvd0ZpbGVTcGxpdHMgPSB3 b3JrYm9va1NwbGl0cy5zdHJlYW0oKQogICAgICAgICAgICAgICAgLm1hcChXb3JrYm9va1NwbGl0 Ojpjb250ZW50KQogICAgICAgICAgICAgICAgLnRvTGlzdCgpOwoKICAgICAgICBzZXNzaW9uLnRy YW5zZmVyKGZsb3dGaWxlU3BsaXRzLCBSRUxfU1BMSVQpOwogICAgfQoKICAgIHByaXZhdGUgcmVj b3JkIFdvcmtib29rU3BsaXQoaW50IGluZGV4LCBGbG93RmlsZSBjb250ZW50LCBTdHJpbmcgc2hl ZXROYW1lLCBpbnQgbnVtUm93cykgewogICAgfQoKICAgIC8qb3JnLmFwYWNoZS5wb2kueHNzZi51 c2VybW9kZWwuWFNTRlNoZWV0IGNvcHlSb3dzIG1ldGhvZCByZWZhY3RvcmVkIHdpdGggSW50ZWxs aWogc3VnZ2VzdGlvbnMKICAgICAgYW5kIGluc3RhbnRpYXRlcyBhIENlbGxDb3B5Q29udGV4dCB0 byBoYW5kbGUgY2VsbCBzdHlsZXMgd2hpY2ggZ2V0cyBldmVudHVhbGx5IHBhc3NlZCB0byBDZWxs VXRpbC5jb3B5Q2VsbAogICAgICovCiAgICBzdGF0aWMgdm9pZCBjb3B5Um93cyhYU1NGU2hlZXQg ZGVzdFNoZWV0LCBMaXN0PD8gZXh0ZW5kcyBSb3c+IHNyY1Jvd3MsIGludCBkZXN0U3RhcnRSb3cp IHsKICAgICAgICBpZiAoc3JjUm93cyAhPSBudWxsICYmICFzcmNSb3dzLmlzRW1wdHkoKSkgewog ICAgICAgICAgICBSb3cgc3JjU3RhcnRSb3cgPSBzcmNSb3dzLmdldEZpcnN0KCk7CiAgICAgICAg ICAgIFJvdyBzcmNFbmRSb3cgPSBzcmNSb3dzLmdldExhc3QoKTsKCiAgICAgICAgICAgIGlmIChz cmNTdGFydFJvdyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFy Z3VtZW50RXhjZXB0aW9uKCJjb3B5Um93czogRmlyc3Qgcm93IGNhbm5vdCBiZSBudWxsIik7CiAg ICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpbnQgc3JjU3RhcnRSb3dOdW0gPSBz cmNTdGFydFJvdy5nZXRSb3dOdW0oKTsKICAgICAgICAgICAgICAgIGludCBzcmNFbmRSb3dOdW0g PSBzcmNFbmRSb3cuZ2V0Um93TnVtKCk7CgogICAgICAgICAgICAgICAgZm9yKGludCBpbmRleCA9 IDE7IGluZGV4IDwgc3JjUm93cy5zaXplKCk7ICsraW5kZXgpIHsKICAgICAgICAgICAgICAgICAg ICBSb3cgY3VyUm93ID0gc3JjUm93cy5nZXQoaW5kZXgpOwogICAgICAgICAgICAgICAgICAgIGlm IChjdXJSb3cgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxs ZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzcmNSb3dzIG1heSBub3QgY29udGFpbiBudWxsIHJvd3Mu IEZvdW5kIG51bGwgcm93IGF0IGluZGV4ICIgKyBpbmRleCArICIuIik7CiAgICAgICAgICAgICAg ICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoc3JjU3RhcnRSb3cuZ2V0U2hlZXQoKS5n ZXRXb3JrYm9vaygpICE9IGN1clJvdy5nZXRTaGVldCgpLmdldFdvcmtib29rKCkpIHsKICAgICAg ICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQWxs IHJvd3MgaW4gc3JjUm93cyBtdXN0IGJlbG9uZyB0byB0aGUgc2FtZSBzaGVldCBpbiB0aGUgc2Ft ZSB3b3JrYm9vay4gRXhwZWN0ZWQgYWxsIHJvd3MgZnJvbSBzYW1lIHdvcmtib29rICgiICsgc3Jj U3RhcnRSb3cuZ2V0U2hlZXQoKS5nZXRXb3JrYm9vaygpICsgIikuIEdvdCBzcmNSb3dzWyIgKyBp bmRleCArICJdIGZyb20gZGlmZmVyZW50IHdvcmtib29rICgiICsgY3VyUm93LmdldFNoZWV0KCku Z2V0V29ya2Jvb2soKSArICIpLiIpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAg ICAgICAgICAgaWYgKHNyY1N0YXJ0Um93LmdldFNoZWV0KCkgIT0gY3VyUm93LmdldFNoZWV0KCkp IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2Vw dGlvbigiQWxsIHJvd3MgaW4gc3JjUm93cyBtdXN0IGJlbG9uZyB0byB0aGUgc2FtZSBzaGVldC4g RXhwZWN0ZWQgYWxsIHJvd3MgZnJvbSAiICsgc3JjU3RhcnRSb3cuZ2V0U2hlZXQoKS5nZXRTaGVl dE5hbWUoKSArICIuIEdvdCBzcmNSb3dzWyIgKyBpbmRleCArICJdIGZyb20gIiArIGN1clJvdy5n ZXRTaGVldCgpLmdldFNoZWV0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAg ICAgICAgICB9CgogICAgICAgICAgICAgICAgQ2VsbENvcHlQb2xpY3kgb3B0aW9ucyA9IG5ldyBD ZWxsQ29weVBvbGljeShTcGxpdEV4Y2VsLkNFTExfQ09QWV9QT0xJQ1kpOwogICAgICAgICAgICAg ICAgb3B0aW9ucy5zZXRDb3B5TWVyZ2VkUmVnaW9ucyhmYWxzZSk7CiAgICAgICAgICAgICAgICBp bnQgciA9IGRlc3RTdGFydFJvdzsKICAgICAgICAgICAgICAgIENlbGxDb3B5Q29udGV4dCBjb250 ZXh0ID0gbmV3IENlbGxDb3B5Q29udGV4dCgpOwoKICAgICAgICAgICAgICAgIGZvciAoUm93IHNy Y1JvdyA6IHNyY1Jvd3MpIHsKICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdFJvd051bTsKICAg ICAgICAgICAgICAgICAgICBpZiAoU3BsaXRFeGNlbC5DRUxMX0NPUFlfUE9MSUNZLmlzQ29uZGVu c2VSb3dzKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFJvd051bSA9IHIrKzsKICAg ICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hp ZnQgPSBzcmNSb3cuZ2V0Um93TnVtKCkgLSBzcmNTdGFydFJvd051bTsKICAgICAgICAgICAgICAg ICAgICAgICAgZGVzdFJvd051bSA9IGRlc3RTdGFydFJvdyArIHNoaWZ0OwogICAgICAgICAgICAg ICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgWFNTRlJvdyBkZXN0Um93ID0gZGVzdFNoZWV0 LmNyZWF0ZVJvdyhkZXN0Um93TnVtKTsKICAgICAgICAgICAgICAgICAgICBjb3B5Um93RnJvbShk ZXN0Um93LCBzcmNSb3csIG9wdGlvbnMsIGNvbnRleHQpOwogICAgICAgICAgICAgICAgfQoKICAg ICAgICAgICAgICAgIGlmIChTcGxpdEV4Y2VsLkNFTExfQ09QWV9QT0xJQ1kuaXNDb3B5TWVyZ2Vk UmVnaW9ucygpKSB7CiAgICAgICAgICAgICAgICAgICAgaW50IHNoaWZ0ID0gZGVzdFN0YXJ0Um93 IC0gc3JjU3RhcnRSb3dOdW07CgogICAgICAgICAgICAgICAgICAgIGZvciAoQ2VsbFJhbmdlQWRk cmVzcyBzcmNSZWdpb24gOiBzcmNTdGFydFJvdy5nZXRTaGVldCgpLmdldE1lcmdlZFJlZ2lvbnMo KSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjU3RhcnRSb3dOdW0gPD0gc3JjUmVn aW9uLmdldEZpcnN0Um93KCkgJiYgc3JjUmVnaW9uLmdldExhc3RSb3coKSA8PSBzcmNFbmRSb3dO dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGxSYW5nZUFkZHJlc3MgZGVzdFJl Z2lvbiA9IHNyY1JlZ2lvbi5jb3B5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0 UmVnaW9uLnNldEZpcnN0Um93KGRlc3RSZWdpb24uZ2V0Rmlyc3RSb3coKSArIHNoaWZ0KTsKICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RSZWdpb24uc2V0TGFzdFJvdyhkZXN0UmVnaW9u LmdldExhc3RSb3coKSArIHNoaWZ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RT aGVldC5hZGRNZXJnZWRSZWdpb24oZGVzdFJlZ2lvbik7CiAgICAgICAgICAgICAgICAgICAgICAg IH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0K ICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhj ZXB0aW9uKCJObyByb3dzIHRvIGNvcHkiKTsKICAgICAgICB9CiAgICB9CgogICAgLypvcmcuYXBh Y2hlLnBvaS54c3NmLnVzZXJtb2RlbC5YU1NGUm93IGNvcHlSb3dGcm9tIG1ldGhvZCByZWZhY3Rv cmVkIHdpdGggSW50ZWxsaWogc3VnZ2VzdGlvbnMqLwogICAgc3RhdGljIHZvaWQgY29weVJvd0Zy b20oUm93IGRlc3RSb3csIFJvdyBzcmNSb3csIENlbGxDb3B5UG9saWN5IHBvbGljeSwgQ2VsbENv cHlDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICBpZiAoc3JjUm93ID09IG51bGwpIHsKICAgICAg ICAgICAgZm9yIChDZWxsIGNlbGwgOiBkZXN0Um93KSB7CiAgICAgICAgICAgICAgICBDZWxsVXRp bC5jb3B5Q2VsbChudWxsLCBjZWxsLCBwb2xpY3ksIGNvbnRleHQpOwogICAgICAgICAgICB9Cgog ICAgICAgICAgICBpZiAocG9saWN5LmlzQ29weU1lcmdlZFJlZ2lvbnMoKSkgewogICAgICAgICAg ICAgICAgaW50IGRlc3RSb3dOdW0gPSBkZXN0Um93LmdldFJvd051bSgpOwogICAgICAgICAgICAg ICAgaW50IGluZGV4ID0gMDsKICAgICAgICAgICAgICAgIFNldDxJbnRlZ2VyPiBpbmRpY2VzID0g bmV3IEhhc2hTZXQ8PigpOwoKICAgICAgICAgICAgICAgIGZvcihJdGVyYXRvcjxDZWxsUmFuZ2VB ZGRyZXNzPiBjZWxsUmFuZ2VBZGRyZXNzSXRlcmF0b3IgPSBkZXN0Um93LmdldFNoZWV0KCkuZ2V0 TWVyZ2VkUmVnaW9ucygpLml0ZXJhdG9yKCk7IGNlbGxSYW5nZUFkZHJlc3NJdGVyYXRvci5oYXNO ZXh0KCk7ICsraW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICBDZWxsUmFuZ2VBZGRyZXNzIGRl c3RSZWdpb24gPSBjZWxsUmFuZ2VBZGRyZXNzSXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgICAg ICAgICAgIGlmIChkZXN0Um93TnVtID09IGRlc3RSZWdpb24uZ2V0Rmlyc3RSb3coKSAmJiBkZXN0 Um93TnVtID09IGRlc3RSZWdpb24uZ2V0TGFzdFJvdygpKSB7CiAgICAgICAgICAgICAgICAgICAg ICAgIGluZGljZXMuYWRkKGluZGV4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg ICAgICB9CgogICAgICAgICAgICAgICAgZGVzdFJvdy5nZXRTaGVldCgpLnJlbW92ZU1lcmdlZFJl Z2lvbnMoaW5kaWNlcyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwb2xpY3kuaXND b3B5Um93SGVpZ2h0KCkpIHsKICAgICAgICAgICAgICAgIGRlc3RSb3cuc2V0SGVpZ2h0KChzaG9y dCktMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKENl bGwgc3JjQ2VsbCA6IHNyY1JvdykgewogICAgICAgICAgICAgICAgQ2VsbCBkZXN0Q2VsbCA9IGRl c3RSb3cuY3JlYXRlQ2VsbChzcmNDZWxsLmdldENvbHVtbkluZGV4KCkpOwogICAgICAgICAgICAg ICAgQ2VsbFV0aWwuY29weUNlbGwoc3JjQ2VsbCwgZGVzdENlbGwsIHBvbGljeSwgY29udGV4dCk7 CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGludCBkZXN0Um93TnVtID0gZGVzdFJvdy5nZXRT aGVldCgpLmdldFdvcmtib29rKCkuZ2V0U2hlZXRJbmRleChkZXN0Um93LmdldFNoZWV0KCkpOwog ICAgICAgICAgICBTdHJpbmcgc2hlZXROYW1lID0gZGVzdFJvdy5nZXRTaGVldCgpLmdldFdvcmti b29rKCkuZ2V0U2hlZXROYW1lKGRlc3RSb3dOdW0pOwogICAgICAgICAgICBpbnQgc3JjUm93TnVt ID0gc3JjUm93LmdldFJvd051bSgpOwogICAgICAgICAgICBkZXN0Um93TnVtID0gZGVzdFJvdy5n ZXRSb3dOdW0oKTsKICAgICAgICAgICAgaW50IHJvd0RpZmZlcmVuY2UgPSBkZXN0Um93TnVtIC0g c3JjUm93TnVtOwogICAgICAgICAgICBGb3JtdWxhU2hpZnRlciBmb3JtdWxhU2hpZnRlciA9IEZv cm11bGFTaGlmdGVyLmNyZWF0ZUZvclJvd0NvcHkoZGVzdFJvd051bSwgc2hlZXROYW1lLCBzcmNS b3dOdW0sIHNyY1Jvd051bSwgcm93RGlmZmVyZW5jZSwgU3ByZWFkc2hlZXRWZXJzaW9uLkVYQ0VM MjAwNyk7CiAgICAgICAgICAgIFhTU0ZSb3dTaGlmdGVyIHJvd1NoaWZ0ZXIgPSBuZXcgWFNTRlJv d1NoaWZ0ZXIoKFhTU0ZTaGVldCkgZGVzdFJvdy5nZXRTaGVldCgpKTsKICAgICAgICAgICAgcm93 U2hpZnRlci51cGRhdGVSb3dGb3JtdWxhcygoWFNTRlJvdykgZGVzdFJvdywgZm9ybXVsYVNoaWZ0 ZXIpOwoKICAgICAgICAgICAgaWYgKHBvbGljeS5pc0NvcHlNZXJnZWRSZWdpb25zKCkpIHsKICAg ICAgICAgICAgICAgIGZvciAoQ2VsbFJhbmdlQWRkcmVzcyBzcmNSZWdpb24gOiBzcmNSb3cuZ2V0 U2hlZXQoKS5nZXRNZXJnZWRSZWdpb25zKCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3Jj Um93TnVtID09IHNyY1JlZ2lvbi5nZXRGaXJzdFJvdygpICYmIHNyY1Jvd051bSA9PSBzcmNSZWdp b24uZ2V0TGFzdFJvdygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIENlbGxSYW5nZUFkZHJl c3MgZGVzdFJlZ2lvbiA9IHNyY1JlZ2lvbi5jb3B5KCk7CiAgICAgICAgICAgICAgICAgICAgICAg IGRlc3RSZWdpb24uc2V0Rmlyc3RSb3coZGVzdFJvd051bSk7CiAgICAgICAgICAgICAgICAgICAg ICAgIGRlc3RSZWdpb24uc2V0TGFzdFJvdyhkZXN0Um93TnVtKTsKICAgICAgICAgICAgICAgICAg ICAgICAgZGVzdFJvdy5nZXRTaGVldCgpLmFkZE1lcmdlZFJlZ2lvbihkZXN0UmVnaW9uKTsKICAg ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAg ICAgICAgIGlmIChwb2xpY3kuaXNDb3B5Um93SGVpZ2h0KCkpIHsKICAgICAgICAgICAgICAgIGRl c3RSb3cuc2V0SGVpZ2h0KHNyY1Jvdy5nZXRIZWlnaHQoKSk7CiAgICAgICAgICAgIH0KICAgICAg ICB9CiAgICB9CgogICAgLypUYWtlbiBmcm9tIG9yZy5hcGFjaGUucG9pLnNzLnV0aWwuQ2VsbFV0 aWwgd2l0aCByZWZhY3RvciB0byBmb3JtYXQgdGhlIGRhdGUgYXMgYSBzdHJpbmcKICAgICAgaW4g b3JkZXIgbm90IHRvIGxvc2UgdGhlIGZhY3QgdGhpcyBjZWxsIGlzIGEgZGF0ZSB3aGVuIG5vdCBj b3B5aW5nIGNlbGwgc3R5bGUgaW5mb3JtYXRpb24sCiAgICAgIG90aGVyd2lzZSB3aXRob3V0IGNl bGwgZm9ybWF0dGluZyB0aGUgZmFjdCB0aGlzIGNlbGwgaXMgYSBkYXRlIGlzIGxvc3QuCiAgICAq LwogICAvKiBzdGF0aWMgdm9pZCBjb3B5Q2VsbChDZWxsIHNyY0NlbGwsIENlbGwgZGVzdENlbGws IENlbGxDb3B5UG9saWN5IHBvbGljeSwgQ2VsbENvcHlDb250ZXh0IGNvbnRleHQpIHsKICAgICAg ICBpZiAocG9saWN5LmlzQ29weUNlbGxWYWx1ZSgpKSB7CiAgICAgICAgICAgIGlmIChzcmNDZWxs ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIENlbGxUeXBlIGNvcHlDZWxsVHlwZSA9IHNyY0Nl bGwuZ2V0Q2VsbFR5cGUoKTsKICAgICAgICAgICAgICAgIGlmIChjb3B5Q2VsbFR5cGUgPT0gQ2Vs bFR5cGUuRk9STVVMQSAmJiAhcG9saWN5LmlzQ29weUNlbGxGb3JtdWxhKCkpIHsKICAgICAgICAg ICAgICAgICAgICBjb3B5Q2VsbFR5cGUgPSBzcmNDZWxsLmdldENhY2hlZEZvcm11bGFSZXN1bHRU eXBlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3dpdGNoIChjb3B5Q2Vs bFR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIE5VTUVSSUM6CiAgICAgICAgICAgICAg ICAgICAgICAgIGlmIChEYXRlVXRpbC5pc0NlbGxEYXRlRm9ybWF0dGVkKHNyY0NlbGwpKSB7CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0dGVkQ2VsbFZhbHVl ID0gREFUQV9GT1JNQVRURVIuZm9ybWF0Q2VsbFZhbHVlKHNyY0NlbGwpOwogICAgICAgICAgICAg ICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGZvcm1hdHRlZENlbGxWYWx1ZSk7CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Q2VsbC5zZXRDZWxsVmFsdWUoc3JjQ2VsbC5n ZXREYXRlQ2VsbFZhbHVlKCkgKi8vKmZvcm1hdHRlZENlbGxWYWx1ZSovLyopOwogICAgICAgICAg ICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdENl bGwuc2V0Q2VsbFZhbHVlKHNyY0NlbGwuZ2V0TnVtZXJpY0NlbGxWYWx1ZSgpKTsKICAgICAgICAg ICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAg ICAgICAgICAgICBjYXNlIFNUUklORzoKICAgICAgICAgICAgICAgICAgICAgICAgZGVzdENlbGwu c2V0Q2VsbFZhbHVlKHNyY0NlbGwuZ2V0UmljaFN0cmluZ0NlbGxWYWx1ZSgpKTsKICAgICAgICAg ICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBGT1JNVUxBOgog ICAgICAgICAgICAgICAgICAgICAgICBkZXN0Q2VsbC5zZXRDZWxsRm9ybXVsYShzcmNDZWxsLmdl dENlbGxGb3JtdWxhKCkpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAg ICAgICAgICAgICBjYXNlIEJMQU5LOgogICAgICAgICAgICAgICAgICAgICAgICBkZXN0Q2VsbC5z ZXRCbGFuaygpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAg ICAgICBjYXNlIEJPT0xFQU46CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RDZWxsLnNldENl bGxWYWx1ZShzcmNDZWxsLmdldEJvb2xlYW5DZWxsVmFsdWUoKSk7CiAgICAgICAgICAgICAgICAg ICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgRVJST1I6CiAgICAgICAgICAg ICAgICAgICAgICAgIGRlc3RDZWxsLnNldENlbGxFcnJvclZhbHVlKHNyY0NlbGwuZ2V0RXJyb3JD ZWxsVmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAg ICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2Fs QXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgY2VsbCB0eXBlICIgKyBzcmNDZWxsLmdldENlbGxU eXBlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAg ICAgICAgZGVzdENlbGwuc2V0QmxhbmsoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAg ICAgaWYgKHBvbGljeS5pc0NvcHlDZWxsU3R5bGUoKSAmJiBzcmNDZWxsICE9IG51bGwpIHsKICAg ICAgICAgICAgaWYgKHNyY0NlbGwuZ2V0U2hlZXQoKSAhPSBudWxsICYmIGRlc3RDZWxsLmdldFNo ZWV0KCkgIT0gbnVsbCAmJiBkZXN0Q2VsbC5nZXRTaGVldCgpLmdldFdvcmtib29rKCkgPT0gc3Jj Q2VsbC5nZXRTaGVldCgpLmdldFdvcmtib29rKCkpIHsKICAgICAgICAgICAgICAgIGRlc3RDZWxs LnNldENlbGxTdHlsZShzcmNDZWxsLmdldENlbGxTdHlsZSgpKTsKICAgICAgICAgICAgfSBlbHNl IHsKICAgICAgICAgICAgICAgIENlbGxTdHlsZSBzcmNTdHlsZSA9IHNyY0NlbGwuZ2V0Q2VsbFN0 eWxlKCk7CiAgICAgICAgICAgICAgICBDZWxsU3R5bGUgZGVzdFN0eWxlID0gY29udGV4dCA9PSBu dWxsID8gbnVsbCA6IGNvbnRleHQuZ2V0TWFwcGVkU3R5bGUoc3JjU3R5bGUpOwogICAgICAgICAg ICAgICAgaWYgKGRlc3RTdHlsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZGVzdFN0 eWxlID0gZGVzdENlbGwuZ2V0U2hlZXQoKS5nZXRXb3JrYm9vaygpLmNyZWF0ZUNlbGxTdHlsZSgp OwogICAgICAgICAgICAgICAgICAgIGRlc3RTdHlsZS5jbG9uZVN0eWxlRnJvbShzcmNTdHlsZSk7 CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewogICAgICAgICAgICAg ICAgICAgICAgICBjb250ZXh0LnB1dE1hcHBlZFN0eWxlKHNyY1N0eWxlLCBkZXN0U3R5bGUpOwog ICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBk ZXN0Q2VsbC5zZXRDZWxsU3R5bGUoZGVzdFN0eWxlKTsKICAgICAgICAgICAgfQogICAgICAgIH0K CiAgICAgICAgSHlwZXJsaW5rIHNyY0h5cGVybGluayA9IHNyY0NlbGwgPT0gbnVsbCA/IG51bGwg OiBzcmNDZWxsLmdldEh5cGVybGluaygpOwogICAgICAgIEh5cGVybGluayBuZXdIeXBlcmxpbms7 CiAgICAgICAgaWYgKHBvbGljeS5pc01lcmdlSHlwZXJsaW5rKCkpIHsKICAgICAgICAgICAgaWYg KHNyY0h5cGVybGluayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAoIShzcmNIeXBlcmxp bmsgaW5zdGFuY2VvZiBEdXBsaWNhdGFibGUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cg bmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic3JjQ2VsbCBoeXBlcmxpbmsgaXMgbm90IGFuIGlu c3RhbmNlIG9mIER1cGxpY2F0YWJsZSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAg ICAgIG5ld0h5cGVybGluayA9IChIeXBlcmxpbmspKChEdXBsaWNhdGFibGUpc3JjSHlwZXJsaW5r KS5jb3B5KCk7CiAgICAgICAgICAgICAgICBkZXN0Q2VsbC5zZXRIeXBlcmxpbmsobmV3SHlwZXJs aW5rKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAocG9saWN5LmlzQ29weUh5cGVy bGluaygpKSB7CiAgICAgICAgICAgIGlmIChzcmNIeXBlcmxpbmsgPT0gbnVsbCkgewogICAgICAg ICAgICAgICAgZGVzdENlbGwuc2V0SHlwZXJsaW5rKG51bGwpOwogICAgICAgICAgICB9IGVsc2Ug ewogICAgICAgICAgICAgICAgaWYgKCEoc3JjSHlwZXJsaW5rIGluc3RhbmNlb2YgRHVwbGljYXRh YmxlKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRp b24oInNyY0NlbGwgaHlwZXJsaW5rIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBEdXBsaWNhdGFibGUi KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBuZXdIeXBlcmxpbmsgPSAoSHlw ZXJsaW5rKSgoRHVwbGljYXRhYmxlKXNyY0h5cGVybGluaykuY29weSgpOwogICAgICAgICAgICAg ICAgZGVzdENlbGwuc2V0SHlwZXJsaW5rKG5ld0h5cGVybGluayk7CiAgICAgICAgICAgIH0KICAg ICAgICB9CiAgICB9Ki8KfQo= --00000000000004db9d062dea5b3e Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; name="fileWithIssue.xlsx" Content-Disposition: attachment; filename="fileWithIssue.xlsx" Content-Transfer-Encoding: base64 Content-ID: <f_m715gs891> X-Attachment-Id: f_m715gs891 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 AgAAhREAAAAA --00000000000004db9d062dea5b3e Content-Type: text/plain; charset=us-ascii --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected] --00000000000004db9d062dea5b3e--