Return-Path: X-Original-To: apmail-hadoop-user-archive@minotaur.apache.org Delivered-To: apmail-hadoop-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 CD9B910A57 for ; Fri, 29 Nov 2013 10:12:12 +0000 (UTC) Received: (qmail 9342 invoked by uid 500); 29 Nov 2013 10:12:03 -0000 Delivered-To: apmail-hadoop-user-archive@hadoop.apache.org Received: (qmail 9226 invoked by uid 500); 29 Nov 2013 10:12:02 -0000 Mailing-List: contact user-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@hadoop.apache.org Delivered-To: mailing list user@hadoop.apache.org Received: (qmail 9219 invoked by uid 99); 29 Nov 2013 10:12:01 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 29 Nov 2013 10:12:01 +0000 X-ASF-Spam-Status: No, hits=1.5 required=5.0 tests=HTML_MESSAGE,RCVD_IN_DNSWL_LOW,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of kawa.adam@gmail.com designates 209.85.223.177 as permitted sender) Received: from [209.85.223.177] (HELO mail-ie0-f177.google.com) (209.85.223.177) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 29 Nov 2013 10:11:56 +0000 Received: by mail-ie0-f177.google.com with SMTP id tp5so15359316ieb.8 for ; Fri, 29 Nov 2013 02:11:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=ZdiZDd9nOpi+d496MKqV48As+7FtH7qH0KD5vkpvcTo=; b=Zgau3zVHwYh72IxmFcHlAToHVrmSCy2jd9e9z8RYN91XdgkXkpBFHkJV+dAF3BN90H J4qy1uXYjzsQgJ/D0Oi7N+QFP1D+q0ELSgEPWn0YzHcbn3LD7VeR5LMvcJN8RrQIsr2e +oiz7KR2LzcOrJojrPVSJgcAHhnFvRiZYIieXGNJkChtvWaP3UKWlWbTh1WD5mR/030Y CQOh7+0Y6RzfFYURjPmyFVLFVajUZ2H2XWpuJ7kj4aZXU0kXI+NY6gvf/V7KU43nD2Sj FvqhOVArx5Xfbppdrb0FjS3azCX8+S4eRJiSKtYka6NoB7dvXVGmtVDMp0wV9yfHtcc4 uAPw== MIME-Version: 1.0 X-Received: by 10.50.109.132 with SMTP id hs4mr5649657igb.34.1385719896275; Fri, 29 Nov 2013 02:11:36 -0800 (PST) Received: by 10.42.153.136 with HTTP; Fri, 29 Nov 2013 02:11:36 -0800 (PST) In-Reply-To: References: <969B118F8FF0104281DFF098C334754051D6B9DC85@PUNINMSMBX01.puneodc.lntinfotech.com> Date: Fri, 29 Nov 2013 12:11:36 +0200 Message-ID: Subject: Re: XML parsing in Hadoop From: Adam Kawa To: user@hadoop.apache.org Content-Type: multipart/alternative; boundary=089e013a1d902d033f04ec4e0e28 X-Virus-Checked: Checked by ClamAV on apache.org --089e013a1d902d033f04ec4e0e28 Content-Type: text/plain; charset=ISO-8859-1 Alternatively you can try an input format called WholeFileInputFormat (nicely explained in "Hadoop: The Definitive Guide" by Tom White), where you process a whole file as a record in a single map() method. Refer to a book, for a code example. 2013/11/28 Devaraj K > Hi, > > Here this map() function will be called for every (key,value) pair (i.e. > for every line of split in your Job because of TextInputFormat). This xml > parsing code which you have written in map() function will be executed for > every line of your input which is causing the problem. > > You can customize your InputFormat to read the xml file, instead of > parsing in map() or you could place this parsing code in run() method by > overriding it from Mapper.run(Context context). > > > On Thu, Nov 28, 2013 at 12:15 PM, Chhaya Vishwakarma < > Chhaya.Vishwakarma@lntinfotech.com> wrote: > >> Hi, >> >> >> >> >> >> The below code parses XML file, Here the output of the code is correct >> but the job takes long time for completion. >> >> It took 20 hours to parse 2MB file. >> >> Kindly suggest what changes could be done to increase the performance. >> >> >> >> >> >> >> >> package xml; >> >> >> >> import java.io.FileInputStream; >> >> import java.io.FileNotFoundException; >> >> import java.io.IOException; >> >> import java.util.*; >> >> >> >> import javax.xml.parsers.DocumentBuilder; >> >> import javax.xml.parsers.DocumentBuilderFactory; >> >> import javax.xml.parsers.ParserConfigurationException; >> >> import javax.xml.xpath.XPath; >> >> import javax.xml.xpath.XPathConstants; >> >> import javax.xml.xpath.XPathExpressionException; >> >> import javax.xml.xpath.XPathFactory; >> >> >> >> import org.apache.hadoop.fs.FSDataInputStream; >> >> import org.apache.hadoop.fs.FSInputStream; >> >> import org.apache.hadoop.fs.FileSystem; >> >> import org.apache.hadoop.fs.Path; >> >> >> >> import org.apache.hadoop.conf.*; >> >> import org.apache.hadoop.io.*; >> >> >> >> import org.apache.hadoop.mapred.JobConf; >> >> import org.apache.hadoop.mapreduce.*; >> >> import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; >> >> import org.apache.hadoop.mapreduce.lib.input.FileSplit; >> >> import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; >> >> import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; >> >> import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; >> >> >> >> >> >> import org.apache.log4j.Logger; >> >> import org.w3c.dom.Document; >> >> import org.w3c.dom.Element; >> >> import org.w3c.dom.NodeList; >> >> import org.xml.sax.SAXException; >> >> >> >> >> >> public class ReadXmlMR >> >> { >> >> static Logger log = >> Logger.getLogger(ReadXmlMR.class.getName()); >> >> public static String fileName = new String(); >> >> public static Document dom; >> >> public void configure(JobConf job) { >> >> fileName = job.get("map.input.file"); >> >> } >> >> >> >> >> >> public static class Map extends >> Mapper >> >> { >> >> >> >> public void map(LongWritable key, Text >> value,Context context ) throws IOException, InterruptedException >> >> { >> >> try { >> >> FileSplit >> fileSplit = (FileSplit)context.getInputSplit(); >> >> >> Configuration conf = context.getConfiguration(); >> >> >> >> >> DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); >> >> >> >> >> FSDataInputStream fstream1; >> >> Path file >> = fileSplit.getPath(); >> >> FileSystem fs = >> file.getFileSystem(conf); >> >> fstream1 = >> fs.open(fileSplit.getPath()); >> >> >> DocumentBuilder db = dbf.newDocumentBuilder(); >> >> dom = >> db.parse(fstream1); >> >> Element >> docEle = null; >> >> docEle = >> dom.getDocumentElement(); >> >> >> >> XPath >> xpath = XPathFactory.newInstance().newXPath(); >> >> >> >> Object >> result = xpath.compile("//*").evaluate(dom, XPathConstants.NODESET); >> >> >> >> NodeList >> nodes = (NodeList) result; >> >> >> >> >> >> for (int >> n = 2; n < nodes.getLength(); n++) >> >> >> >> { >> >> >> Text colvalue=new Text(""); >> >> >> Text nodename= new Text(""); >> >> >> >> >> nodename = new Text(nodes.item(n).getNodeName()); >> >> >> try{colvalue = new >> Text(nodes.item(n).getFirstChild().getNodeValue());}catch(Exception e){} >> >> >> if(colvalue.toString().equalsIgnoreCase(null)){colvalue=new Text("");} >> >> >> context.write(nodename, colvalue); >> >> } >> >> >> >> >> >> } catch >> (ParserConfigurationException e) { >> >> // TODO >> Auto-generated catch block >> >> >> e.printStackTrace(); >> >> } catch >> (SAXException e) { >> >> // TODO >> Auto-generated catch block >> >> >> e.printStackTrace(); >> >> >> >> } catch >> (XPathExpressionException e) { >> >> // TODO >> Auto-generated catch block >> >> >> e.printStackTrace(); >> >> } >> >> >> >> } >> >> >> >> } >> >> >> >> >> >> >> >> public static void main(String[] args) throws Exception >> >> >> >> { >> >> >> >> Configuration conf = new Configuration(); >> >> >> >> Job job = new Job(conf, "XmlParsing"); >> >> job.setJarByClass(ReadXmlMR.class); >> >> job.setOutputKeyClass(Text.class); >> >> job.setOutputValueClass(Text.class); >> >> >> >> >> >> job.setMapperClass(Map.class); >> >> >> >> >> >> job.setInputFormatClass(TextInputFormat.class); >> >> job.setOutputFormatClass(TextOutputFormat.class); >> >> >> >> FileInputFormat.addInputPath(job, new Path(args[0])); >> >> FileOutputFormat.setOutputPath(job, new Path(args[1])); >> >> >> >> >> >> job.submit(); >> >> >> >> job.waitForCompletion(true); >> >> >> >> >> >> } >> >> >> >> } >> >> >> >> >> >> >> >> Regards, >> >> Chhaya Vishwakarma >> >> >> >> ------------------------------ >> The contents of this e-mail and any attachment(s) may contain >> confidential or privileged information for the intended recipient(s). >> Unintended recipients are prohibited from taking action on the basis of >> information in this e-mail and using or disseminating the information, and >> must notify the sender and delete it from their system. L&T Infotech will >> not accept responsibility or liability for the accuracy or completeness of, >> or the presence of any virus or disabling code in this e-mail" >> > > > > -- > > > Thanks > Devaraj K > --089e013a1d902d033f04ec4e0e28 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+QWx0ZXJuYXRpdmVseSB5b3UgY2FuIHRyeSBhbiBpbnB1dCBmb3JtYXQg Y2FsbGVkIFdob2xlRmlsZUlucHV0Rm9ybWF0IChuaWNlbHkgZXhwbGFpbmVkIGluICZxdW90O0hh ZG9vcDogVGhlIERlZmluaXRpdmUgR3VpZGUmcXVvdDsgYnkgVG9tIFdoaXRlKSwgd2hlcmUgeW91 IHByb2Nlc3MgYSB3aG9sZSBmaWxlIGFzIGEgcmVjb3JkIGluIGEgc2luZ2xlIG1hcCgpIG1ldGhv ZC4gUmVmZXIgdG8gYSBib29rLCBmb3IgYSBjb2RlIGV4YW1wbGUuPC9kaXY+DQo8ZGl2IGNsYXNz PSJnbWFpbF9leHRyYSI+PGJyPjxicj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+MjAxMy8xMS8y OCBEZXZhcmFqIEsgPHNwYW4gZGlyPSJsdHIiPiZsdDs8YSBocmVmPSJtYWlsdG86ZGV2YXJhakBh cGFjaGUub3JnIiB0YXJnZXQ9Il9ibGFuayI+ZGV2YXJhakBhcGFjaGUub3JnPC9hPiZndDs8L3Nw YW4+PGJyPjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowIDAg MCAuOGV4O2JvcmRlci1sZWZ0OjFweCAjY2NjIHNvbGlkO3BhZGRpbmctbGVmdDoxZXgiPg0KPGRp diBkaXI9Imx0ciI+PGRpdj48ZGl2PkhpLDwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SGVyZSB0 aGlzIG1hcCgpIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGZvciBldmVyeSAoa2V5LHZhbHVlKSBw YWlyIChpLmUuIGZvciBldmVyeSBsaW5lIG9mIHNwbGl0IGluIHlvdXIgSm9iIGJlY2F1c2Ugb2Yg VGV4dElucHV0Rm9ybWF0KS4gVGhpcyB4bWwgcGFyc2luZyBjb2RlIHdoaWNoIHlvdSBoYXZlIHdy aXR0ZW4gaW4gbWFwKCkgZnVuY3Rpb24gd2lsbCBiZSBleGVjdXRlZCBmb3IgZXZlcnkgbGluZSBv ZiB5b3VyIGlucHV0IHdoaWNoIGlzIGNhdXNpbmcgdGhlIHByb2JsZW0uoDwvZGl2Pg0KDQo8ZGl2 Pjxicj48L2Rpdj48ZGl2PllvdSBjYW4gY3VzdG9taXplIHlvdXIgSW5wdXRGb3JtYXQgdG8gcmVh ZCB0aGUgeG1sIGZpbGUsIGluc3RlYWQgb2YgcGFyc2luZyBpbiBtYXAoKSBvciB5b3UgY291bGQg cGxhY2UgdGhpcyBwYXJzaW5nIGNvZGUgaW4gcnVuKCkgbWV0aG9kIGJ5IG92ZXJyaWRpbmcgaXQg ZnJvbSBNYXBwZXIucnVuKENvbnRleHQgY29udGV4dCkuoDwvZGl2PjwvZGl2Pg0KDQo8ZGl2IGNs YXNzPSJnbWFpbF9leHRyYSI+PGRpdj48ZGl2IGNsYXNzPSJoNSI+PGJyPjxicj48ZGl2IGNsYXNz PSJnbWFpbF9xdW90ZSI+T24gVGh1LCBOb3YgMjgsIDIwMTMgYXQgMTI6MTUgUE0sIENoaGF5YSBW aXNod2FrYXJtYSA8c3BhbiBkaXI9Imx0ciI+Jmx0OzxhIGhyZWY9Im1haWx0bzpDaGhheWEuVmlz aHdha2FybWFAbG50aW5mb3RlY2guY29tIiB0YXJnZXQ9Il9ibGFuayI+Q2hoYXlhLlZpc2h3YWth cm1hQGxudGluZm90ZWNoLmNvbTwvYT4mZ3Q7PC9zcGFuPiB3cm90ZTo8YnI+DQoNCjxibG9ja3F1 b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowcHggMHB4IDBweCAwLjhleDti b3JkZXItbGVmdC13aWR0aDoxcHg7Ym9yZGVyLWxlZnQtY29sb3I6cmdiKDIwNCwyMDQsMjA0KTti b3JkZXItbGVmdC1zdHlsZTpzb2xpZDtwYWRkaW5nLWxlZnQ6MWV4Ij4NCg0KDQoNCg0KDQo8ZGl2 IGxhbmc9IkVOLVVTIiBsaW5rPSJibHVlIiB2bGluaz0icHVycGxlIj4NCjxkaXY+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj5IaSw8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi Pjx1PjwvdT6gPHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91 PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTBwdDtm b250LWZhbWlseTomIzM5O1NlZ29lIFVJJiMzOTssc2Fucy1zZXJpZiI+VGhlIGJlbG93IGNvZGUg cGFyc2VzIFhNTCBmaWxlLCBIZXJlIHRoZSBvdXRwdXQgb2YgdGhlIGNvZGUgaXMgY29ycmVjdCBi dXQgdGhlIGpvYiB0YWtlcyBsb25nIHRpbWUgZm9yIGNvbXBsZXRpb24uPHU+PC91Pjx1PjwvdT48 L3NwYW4+PC9wPg0KDQoNCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNp emU6MTBwdDtmb250LWZhbWlseTomIzM5O1NlZ29lIFVJJiMzOTssc2Fucy1zZXJpZiI+SXQgdG9v ayAyMCBob3VycyB0byBwYXJzZSAyTUIgZmlsZS48dT48L3U+PHU+PC91Pjwvc3Bhbj48L3A+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEwcHQ7Zm9udC1mYW1p bHk6JiMzOTtTZWdvZSBVSSYjMzk7LHNhbnMtc2VyaWYiPktpbmRseSBzdWdnZXN0IHdoYXQgY2hh bmdlcyBjb3VsZCBiZSBkb25lIHRvIGluY3JlYXNlIHRoZSBwZXJmb3JtYW5jZS48dT48L3U+PHU+ PC91Pjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1z aXplOjEycHQ7Zm9udC1mYW1pbHk6JiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OyxzZXJpZiI+PHU+ PC91PqA8dT48L3U+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjx1PjwvdT6gPHU+ PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91PjwvcD4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPnBhY2thZ2UgeG1sOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+PHU+PC91PqA8dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1w b3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+aW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOzx1PjwvdT48 dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1wb3J0IGphdmEuaW8uSU9FeGNlcHRp b247PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgamF2YS51 dGlsLio7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48dT48L3U+oDx1 PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMu RG9jdW1lbnRCdWlsZGVyOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ aW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7PHU+PC91Pjx1 PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMu UGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPmltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGg7PHU+PC91Pjx1PjwvdT48 L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoQ29u c3RhbnRzOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1wb3J0IGph dmF4LnhtbC54cGF0aC5YUGF0aEV4cHJlc3Npb25FeGNlcHRpb247PHU+PC91Pjx1PjwvdT48L3A+ DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRmFjdG9y eTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKAgPHU+PC91 Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgb3JnLmFwYWNoZS5oYWRv b3AuZnMuRlNEYXRhSW5wdXRTdHJlYW07PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj5pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRlNJbnB1dFN0cmVhbTs8dT48L3U+ PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBvcmcuYXBhY2hlLmhhZG9v cC5mcy5GaWxlU3lzdGVtOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ aW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj48dT48L3U+oDx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij5pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi4qOzx1PjwvdT48dT48L3U+PC9wPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+aW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmlvLio7PHU+PC91Pjx1 PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48dT48L3U+oDx1PjwvdT48L3A+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLkpvYkNvbmY7 PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgb3JnLmFwYWNo ZS5oYWRvb3AubWFwcmVkdWNlLio7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj5pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLmxpYi5pbnB1dC5GaWxlSW5w dXRGb3JtYXQ7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQg b3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLmxpYi5pbnB1dC5GaWxlU3BsaXQ7PHU+PC91Pjx1 PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3Au bWFwcmVkdWNlLmxpYi5pbnB1dC5UZXh0SW5wdXRGb3JtYXQ7PHU+PC91Pjx1PjwvdT48L3A+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLmxp Yi5vdXRwdXQuRmlsZU91dHB1dEZvcm1hdDs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPmltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UubGliLm91dHB1dC5U ZXh0T3V0cHV0Rm9ybWF0Ozx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHU+PC91PqA8dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHU+PC91PqA8dT48L3U+ PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2Vy Ozx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1wb3J0IG9yZy53M2Mu ZG9tLkRvY3VtZW50Ozx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1w b3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj5pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7PHU+PC91Pjx1PjwvdT48L3A+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOzx1Pjwv dT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHU+PC91PqA8dT48L3U+PC9wPg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHU+PC91PqA8dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+cHVibGljIGNsYXNzIFJlYWRYbWxNUiA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPns8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCg oKCgoKCgoKCgoKCgoCBzdGF0aWMgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoUmVhZFht bE1SLmNsYXNzLmdldE5hbWUoKSk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj6goCCgoKCgoKCgoKCgoKAgoHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVOYW1lID0gbmV3 IFN0cmluZygpOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgIKCg oKCgoKCgoKCgIKBwdWJsaWMgc3RhdGljIERvY3VtZW50IGRvbTs8dT48L3U+PHU+PC91PjwvcD4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoCCgoKCgoKCgoKCgoCCgcHVibGljIHZvaWQgY29uZmln dXJlKEpvYkNvbmYgam9iKSB7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij6goKCgoKCgoCBmaWxlTmFtZSA9IGpvYi5nZXQoJnF1b3Q7bWFwLmlucHV0LmZpbGUmcXVvdDsp Ozx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+fTx1PjwvdT48dT48L3U+ PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHU+PC91PqA8dT48L3U+PC9wPg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+oKAgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6g oKCgoKCgoKCgoKCgoKAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXAgZXh0ZW5kcyBNYXBwZXImbHQ7 TG9uZ1dyaXRhYmxlLFRleHQsVGV4dCxUZXh0Jmd0Ozx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xh c3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKAgeyA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgPHU+PC91Pjx1 PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgIHB1YmxpYyB2b2lkIG1hcChMb25nV3JpdGFibGUga2V5LCBUZXh0IHZhbHVlLENvbnRl eHQgY29udGV4dCApIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb26gDQo8 dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKAgeyA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIHRyeSB7PHU+ PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgRmlsZVNwbGl0IGZp bGVTcGxpdCA9IChGaWxlU3BsaXQpY29udGV4dC5nZXRJbnB1dFNwbGl0KCk7PHU+PC91Pjx1Pjwv dT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgQ29uZmlndXJhdGlvbiBjb25mID0g Y29udGV4dC5nZXRDb25maWd1cmF0aW9uKCk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKANCjx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFj dG9yeS5uZXdJbnN0YW5jZSgpOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgPHU+PC91 Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgRlNEYXRhSW5wdXRTdHJl YW0gZnN0cmVhbTE7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKAgUGF0aCBmaWxlID0gZmlsZVNwbGl0LmdldFBhdGgoKTs8dT48L3U+PHU+PC91PjwvcD4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgIKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgIEZpbGVTeXN0ZW0gZnMgPSBmaWxlLmdldEZpbGVTeXN0ZW0oY29uZik7PHU+PC91 Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgIKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBmc3RyZWFtMSA9IGZzLm9wZW4oZmlsZVNwbGl0Lmdl dFBhdGgoKSk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAg RG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOzx1PjwvdT48dT48 L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIGRvbSA9IGRiLnBhcnNlKGZzdHJl YW0xKTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBFbGVt ZW50IGRvY0VsZSA9IG51bGw7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKAgZG9jRWxlID0gZG9tLmdldERvY3VtZW50RWxlbWVudCgpOzx1PjwvdT48dT48L3U+ PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKAgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKAgWFBhdGggeHBhdGggPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdYUGF0 aCgpOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgPHU+PC91Pjx1PjwvdT48L3A+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgT2JqZWN0IHJlc3VsdCA9oCB4cGF0aC5jb21waWxl KCZxdW90Oy8vKiZxdW90OykuZXZhbHVhdGUoZG9tLCBYUGF0aENvbnN0YW50cy5OT0RFU0VUKTs8 dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91Pjwv cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBOb2RlTGlzdCBub2RlcyA9IChOb2RlTGlz dCkgcmVzdWx0Ozx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgPHU+PC91Pjx1PjwvdT48 L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoCA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoCBmb3IgKGludCBuID0gMjsgbiAmbHQ7IG5vZGVzLmdldExlbmd0aCgpOyBuKyspDQo8 dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoA0KPHU+PC91Pjx1 PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgezx1PjwvdT48dT48L3U+PC9w Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBUZXh0IGNvbHZh bHVlPW5ldyBUZXh0KCZxdW90OyZxdW90Oyk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIFRleHQgbm9kZW5hbWU9IG5ldyBUZXh0 KCZxdW90OyZxdW90Oyk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48 dT48L3U+oDx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgIG5vZGVuYW1lID0gbmV3IFRleHQobm9kZXMuaXRlbShuKS5nZXROb2RlTmFtZSgpKTs8 dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKAgdHJ5e2NvbHZhbHVlID0gbmV3IFRleHQobm9kZXMuaXRlbShuKS5nZXRGaXJzdENoaWxk KCkuZ2V0Tm9kZVZhbHVlKCkpO31jYXRjaChFeGNlcHRpb24gZSl7fTx1PjwvdT48dT48L3U+PC9w Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBpZihjb2x2YWx1 ZS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UobnVsbCkpe2NvbHZhbHVlPW5ldyBUZXh0KCZx dW90OyZxdW90Oyk7fTx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoCBjb250ZXh0LndyaXRlKG5vZGVuYW1lLCBjb2x2YWx1ZSk7oKCg oKANCjx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIH08dT48 L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIDx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+PHU+PC91PqA8dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgezx1PjwvdT48dT48 L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIC8vIFRPRE8gQXV0by1nZW5lcmF0 ZWQgY2F0Y2ggYmxvY2s8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoCBlLnByaW50U3RhY2tUcmFjZSgpOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7PHU+PC91Pjx1PjwvdT48 L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBj YXRjaCBibG9jazx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgoKCgoKCgoKCgoKCgoKCg IGUucHJpbnRTdGFja1RyYWNlKCk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIDx1PjwvdT48dT48L3U+PC9wPg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIH0gY2F0Y2ggKFhQYXRoRXhwcmVzc2lvbkV4Y2Vw dGlvbiBlKSB7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAg Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jazx1PjwvdT48dT48L3U+PC9wPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIGUucHJpbnRTdGFja1RyYWNlKCk7PHU+PC91Pjx1Pjwv dT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgfTx1PjwvdT48dT48L3U+PC9wPg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKAgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKAgfTx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCg oKCgIDx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoCB9PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj6goKCgoKCgoKCgoKCgoKAgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIKCgoKCgIDx1PjwvdT48dT48L3U+ PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgIDx1PjwvdT48dT48L3U+ PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgIHB1YmxpYyBzdGF0aWMg dm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb248dT48L3U+PHU+PC91Pjwv cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoCA8dT48L3U+PHU+PC91Pjwv cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoCB7PHU+PC91Pjx1PjwvdT48 L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKAgPHU+PC91Pjx1PjwvdT48 L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKAgQ29uZmlndXJhdGlvbiBj b25mID0gbmV3IENvbmZpZ3VyYXRpb24oKTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoCCgoCA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPqCgoKCgoKCgSm9iIGpvYiA9IG5ldyBKb2IoY29uZiwgJnF1b3Q7WG1sUGFy c2luZyZxdW90Oyk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCg oKCgIGpvYi5zZXRKYXJCeUNsYXNzKFJlYWRYbWxNUi5jbGFzcyk7PHU+PC91Pjx1PjwvdT48L3A+ DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goCCgoKCgoKCgoKCgoKAgam9iLnNldE91dHB1dEtleUNs YXNzKFRleHQuY2xhc3MpOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ oKAgoKCgoKCgoKCgoKCgIGpvYi5zZXRPdXRwdXRWYWx1ZUNsYXNzKFRleHQuY2xhc3MpOzx1Pjwv dT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHU+PC91PqA8dT48L3U+PC9wPg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKAgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKAgam9iLnNldE1hcHBlckNsYXNzKE1hcC5jbGFz cyk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goCA8dT48L3U+PHU+ PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgPHU+PC91Pjx1PjwvdT48L3A+ DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKAgam9iLnNldElucHV0Rm9ybWF0 Q2xhc3MoVGV4dElucHV0Rm9ybWF0LmNsYXNzKTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPqCgoCCgoKCgoKCgoKCgoCBqb2Iuc2V0T3V0cHV0Rm9ybWF0Q2xhc3MoVGV4 dE91dHB1dEZvcm1hdC5jbGFzcyk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj6goKCgoKCgIDx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCg oKCgoKCgoKCgoKCgIEZpbGVJbnB1dEZvcm1hdC5hZGRJbnB1dFBhdGgoam9iLCBuZXcgUGF0aChh cmdzWzBdKSk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKAgoKCg oKCgoKCgoKAgRmlsZU91dHB1dEZvcm1hdC5zZXRPdXRwdXRQYXRoKGpvYiwgbmV3IFBhdGgoYXJn c1sxXSkpOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgIDx1 PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoDx1PjwvdT48dT48L3U+ PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgIGpvYi5zdWJtaXQoKTs8 dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKAgPHU+PC91Pjx1 PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKAgam9iLndhaXRG b3JDb21wbGV0aW9uKHRydWUpOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCA8dT48L3U+PHU+PC91PjwvcD4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiPqCgoKCgoKCgoKCgoKCgoCB9PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj48dT48L3U+oDx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj59PHU+PC91Pjx1 PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48dT48L3U+oDx1PjwvdT48L3A+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj48dT48L3U+oDx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij48dT48L3U+oDx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5SZWdhcmRzLDx1Pjwv dT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+Q2hoYXlhIFZpc2h3YWthcm1hPHU+ PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48dT48L3U+oDx1PjwvdT48L3A+ DQo8L2Rpdj4NCjxicj4NCjxocj4NCjxmb250IGZhY2U9IkFyaWFsIiBjb2xvcj0iQmxhY2siIHNp emU9IjMiPlRoZSBjb250ZW50cyBvZiB0aGlzIGUtbWFpbCBhbmQgYW55IGF0dGFjaG1lbnQocykg bWF5IGNvbnRhaW4gY29uZmlkZW50aWFsIG9yIHByaXZpbGVnZWQgaW5mb3JtYXRpb24gZm9yIHRo ZSBpbnRlbmRlZCByZWNpcGllbnQocykuIFVuaW50ZW5kZWQgcmVjaXBpZW50cyBhcmUgcHJvaGli aXRlZCBmcm9tIHRha2luZyBhY3Rpb24gb24gdGhlIGJhc2lzIG9mIGluZm9ybWF0aW9uDQogaW4g dGhpcyBlLW1haWwgYW5kIHVzaW5nIG9yIGRpc3NlbWluYXRpbmcgdGhlIGluZm9ybWF0aW9uLCBh bmQgbXVzdCBub3RpZnkgdGhlIHNlbmRlciBhbmQgZGVsZXRlIGl0IGZyb20gdGhlaXIgc3lzdGVt LiBMJmFtcDtUIEluZm90ZWNoIHdpbGwgbm90IGFjY2VwdCByZXNwb25zaWJpbGl0eSBvciBsaWFi aWxpdHkgZm9yIHRoZSBhY2N1cmFjeSBvciBjb21wbGV0ZW5lc3Mgb2YsIG9yIHRoZSBwcmVzZW5j ZSBvZiBhbnkgdmlydXMgb3IgZGlzYWJsaW5nIGNvZGUNCiBpbiB0aGlzIGUtbWFpbCZxdW90Ozxi cj4NCjwvZm9udD4NCjwvZGl2Pg0KDQo8L2Jsb2NrcXVvdGU+PC9kaXY+PGJyPjxiciBjbGVhcj0i YWxsIj48ZGl2Pjxicj48L2Rpdj48L2Rpdj48L2Rpdj48c3BhbiBjbGFzcz0iSE9FblpiIj48Zm9u dCBjb2xvcj0iIzg4ODg4OCI+LS0gPGJyPjxkaXYgZGlyPSJsdHIiPjxkaXY+PGJyPjwvZGl2Pjxk aXY+PGJyPjwvZGl2PjxkaXY+VGhhbmtzPC9kaXY+PGRpdj5EZXZhcmFqIEs8L2Rpdj48L2Rpdj4N CjwvZm9udD48L3NwYW4+PC9kaXY+PC9kaXY+DQo8L2Jsb2NrcXVvdGU+PC9kaXY+PGJyPjwvZGl2 Pg0K --089e013a1d902d033f04ec4e0e28--