VGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFBhcnRlZApDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcKICAgICAgICAgICAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gSW5jLgoKVGhpcyBmaWxlIG1heSBiZSBtb2RpZmllZCBhbmQvb3IgZGlzdHJpYnV0ZWQgd2l0aG91dCByZXN0cmljdGlvbi4gIFRoaXMgaXMKbm90IGFuIGludml0YXRpb24gdG8gbWlzcmVwcmVzZW50IHdobyBjb250cmlidXRlZCB0byBHTlUgUGFydGVkLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGNvcHlyaWdodCAoc2VlIHRoZSBNYWludGFpbmVyIEhPV1RPIG9uIHd3dy5nbnUub3JnKS4KCgpMZXNsaWUgUGF0cmljayBQb2x6ZXIgICA8cG9semVyQGdudS5vcmc+CiAgICAgICAgKiBwYXJ0cyBvZiAxLjYuMjQgUGVkVW5pdCBBUEkKICAgICAgICAqIEdQVCBwdGhfKiBmdW5jdGlvbnMgYW5kIGJsb2NrIHNpemUgZml4ZXMKICAgICAgICAqIFBFRF9TRUNUT1JfU0laRSAtPiBQRURfU0VDVE9SX1NJWkVfREVGQVVMVAogICAgICAgICogZGVidWdnaW5nIGZyYW1ld29yawogICAgICAgICogZXh0MiAic3RyYW5nZSBsYXlvdXQiIGZpeCAoZXhwZXJpbWVudGFsKQogICAgICAgICogc3VwcG9ydCBmb3IgcGh5c2ljYWwgYmxvY2sgc2l6ZXMKICAgICAgICAqIFNDTyBCRlMgc3VwcG9ydAoKICAgICAgICBodHRwOi8vbmljLW5hYy1wcm9qZWN0LmRlL35za3lwaGVyLwoKICAgICAgICBTbmFpbCBNYWlsOgogICAgICAgIEFtIEtpcmNoYmVyZyAxNQogICAgICAgIDg5NTM3IEdpZW5nZW4KICAgICAgICBHZXJtYW55CgpBbmRyZXcgQ2xhdXNlbiAgICAgICAgICA8Y2xhdXNlbkBnbnUub3JnPgogICAgICAgICogYWxsIEZBVCBjb2RlIChsaWJwYXJ0ZWQvZnNfZmF0KQogICAgICAgICogYWxsIGxpbnV4LXN3YXAgY29kZSAobGlicGFydGVkL2ZzX2xpbnV4X3N3YXApCiAgICAgICAgKiBzb21lIHJlaXNlcmZzIGdsdWUgY29kZSAobGlicGFydGVkL2ZzX3JlaXNlcmZzKSB3aXRoIFVtYW5ldHMKICAgICAgICAqIG1vc3Qgb2YgdGhlIEFQSSAod2l0aCBsb3RzIG9mIGRpc2N1c3Npb24gd2l0aCBMZW5uZXJ0IEJ1eXRlbmhlaykKICAgICAgICAgIChpbmNsdWRlL3BhcnRlZC8qKQogICAgICAgICogZ2VuZXJpYyBmaWxlc3lzdGVtIGNvZGUgKGZpbGVzeXMuYykgYW5kIGRldmljZSBjb2RlIChkZXZpY2UuYykKICAgICAgICAqIGV4Y2VwdGlvbiBjb2RlIChleGNlcHRpb24uYywgZGVidWcuYykKICAgICAgICAqIHBhcnRpdGlvbiB0YWJsZSBjb2RlIChkaXNrLmMpCiAgICAgICAgKiBkb3MgcGFydGl0aW9uIHN1cHBvcnQgKGRpc2tfZG9zLmMpCiAgICAgICAgKiBtYWMgcGFydGl0aW9uIHN1cHBvcnQgKGRpc2tfbWFjLmMpCiAgICAgICAgKiBtaXBzIHBhcnRpdGlvbiBzdXBwb3J0IChkaXNrX21pcHMuYykKICAgICAgICAqIGxvb3BiYWNrIHN1cHBvcnQgKGRpc2tfbG9vcC5jKQogICAgICAgICogc29tZSBvZiB0aGUgUEM5OCBjb2RlIChkaXNrX3BjOTguYyksIHdpdGggTWFzYWhpcm8gU2FrYWkuCiAgICAgICAgKiBtaXNjLiBoYWNraW5nIG9uIGFsbCBkaXNrXyouYyBjb2RlCiAgICAgICAgKiBsb3ctbGV2ZWwgSS9PIGNvZGUgKGRldmljZS5jLCBnZW9tLmMsIGxpbnV4LmMpCiAgICAgICAgICAtIGluaXRfc2NzaSgpIHN0b2xlbiBmcm9tIGdub21lLWdmZGlzayB2aWEgTWF0dCBXaWxzb24uCiAgICAgICAgKiBjb25zdHJhaW50IHNvbHZlciAobmF0bWF0aC5jLCBjb25zdHJhaW50LmMpCiAgICAgICAgKiBjb21tYW5kLWxpbmUsIGFuZCBmZGlzay1saWtlIGZyb250ZW5kIChwYXJ0ZWQvKikKICAgICAgICAqIHN0dWJzIGZvciBudGZzLCBoZnMsIHhmcwogICAgICAgICogaGFja2VkIG9uIGxpYnBhcnRlZC9mc19leHQyIGEgZmFpciBiaXQgKGJ1ZyBmaXhlcywgZXJyb3IgaGFuZGxpbmcsCiAgICAgICAgc3VwcG9ydCBmb3IgPiAxMDI0IGdyb3VwcywgZXRjLikKICAgICAgICAqIGxpYnBhcnRlZC9tYnIucyAodGhlIE1CUiBib290IGxvYWRlciBjb2RlKQogICAgICAgICogbWlzYyBoYWNraW5nIG9uIEdOVS9IdXJkIHBvcnQKICAgICAgICAqIG1ham9yIHN1cmdlcnkgb24gR1VJRCBQYXJ0aXRpb24gVGFibGUgKEdQVCkgc3VwcG9ydCAoZGlza19ncHQuW2NoXSkKICAgICAgICAqIHByb2dyZXNzIG1ldGVyIHN1cHBvcnQgKGxpYnBhcnRlZC90aW1lci5jIGluY2x1ZGUvcGFydGVkL3RpbWVyLmgpCgogICAgICAgIFNuYWlsIG1haWw6CiAgICAgICAgMTggU2hhdyBTdAogICAgICAgIEFzaHdvb2QsIDMxNDcKICAgICAgICBBdXN0cmFsaWEKCkxlbm5lcnQgQnV5dGVuaGVrICAgICAgIDxidXl0ZW5oQGdudS5vcmc+CiAgICAgICAgKiBvcmlnaW5hbCBleHQyIGNvZGUgKGxpYnBhcnRlZC9mc19leHQyKQogICAgICAgICogZGlzY3Vzc2lvbi9pZGVhcyBmb3IgQVBJCgpNYXR0aGV3IFdpbHNvbiAgICAgICAgICA8bXN3QHJlZGhhdC5jb20+CiAgICAgICAgKiBiYXNpcyBvZiBwYXJ0aXRpb24gdGFibGUgYW5kIGRldmljZSBjb2RlIChkaXNrLmMsIGRpc2tfZG9zLmMsCiAgICAgICAgYW5kIGRldmljZS5jKSAgSGFzIG1vcnBoZWQgaW50byBzb21ldGhpbmcgdGhhdCBsb29rcyBjb21wbGV0ZWx5CiAgICAgICAgZGlmZmVyZW50IG5vdyA6LSkKICAgICAgICAqIGJ1ZyBmaXhlcwogICAgICAgICogQlNEIGRpc2tsYWJlbCBzdXBwb3J0IChkaXNrX2JzZC5jKQogICAgICAgICogUHl0aG9uIGJpbmRpbmdzIHRvIGxpYnBhcnRlZAogICAgICAgICogRG9uJ3QgZGV0ZWN0IEFJWCBwaHlzaWNhbCB2b2x1bWVzIGFzIG1zZG9zIHBhcnRpdGlvbiB0YWJsZXMKICAgICAgICAqIENvZGUgZm9yIG1hbmlwdWxhdGluZyBBSVggUFZzCgpNYXJ0aW4gdm9uIEz2d2lzICAgICAgICA8bWFydGluQG1pcmEuaXNkbi5jcy50dS1iZXJsaW4uZGU+CiAgICAgICAgKiBHZXJtYW4gdHJhbnNsYXRpb25zCgpCYXR5IEplYW4tTWFyYyAgICAgICAgICA8YmF0eUBjbHViLWludGVybmV0LmZyPgogICAgICAgICogRnJlbmNoIHRyYW5zbGF0aW9ucwoKSGlyb3NoaSBUYWtla2F3YSAgICAgICAgPHRha2VrYXdhQHNyMy50LnUtdG9reW8uYWMuanA+CiAgICAgICAgKiBKYXBhbmVzZSB0cmFuc2xhdGlvbnMKCkVsaXBoYXMgTGV2eSBUaGVvZG9ybyAgIDxlbGlwaGFzQGNvbmVjdGl2YS5jb20+CiAgICAgICAgKiBCcmF6aWxsaWFuIFBvcnR1Z2VzZSB0cmFuc2xhdGlvbnMKCkRtaXRyeSBTLiBTaXZhY2hlbmtvICAgIDxkaW1hQENoZy5SVT4KICAgICAgICAqIFJ1c3NpYW4gdHJhbnNsYXRpb25zCgpUaW1zaGVsIEtub2xsICAgICAgICAgICA8dGltc2hlbEBwb2JveC5jb20+CiAgICAgICAgKiBtYW4gcGFnZXMgKHBhcnRlZC44IHBhcnRwcm9iZS44KQogICAgICAgICogYnVnIGZpeGVzCgpJdm8gVGltbWVybWFucyAgICAgICAgICA8aXRpbW1lcm1hbnNAYmlnZm9vdC5jb20+CiAgICAgICAgKiBEdXRjaCB0cmFuc2xhdGlvbnMKClJ5b2ppIEthd2FnaXNoaSAgICAgICAgIDxrYXdhZ2lzaUB5ay5yaW0ub3IuanA+CiAgICAgICAgKiBKYXBhbmVzZSB0cmFuc2xhdGlvbiBvZiBkb2MvVVNFUiAodXNlciBkb2N1bWVudGF0aW9uKQogICAgICAgIChyZXBsYWNlZCBieSBPa3VqaSdzIHZlcnNpb24sIG5vdykKCk9rdWppIFlvc2hpbm9yaSAgICAgICAgIDxva3VqaUBrdWljci5reW90by1hLmFjLmpwPgogICAgICAgICogZG9jL1VTRVIuanAKICAgICAgICAqIGNvbnRyaWJ1dGlvbnMgdG8gSmFwYW5lc2UgdHJhbnNsYXRpb25zCgpNYXNhaGlybyBTYWthaSAgICAgICAgICA8WlZNMDEwNTJAbmlmdHkubmUuanA+CiAgICAgICAgKiBtb3N0IG9mIHRoZSBQQzk4IHN1cHBvcnQgKGRpc2tfcGM5OC5jKSwgd2l0aCBBbmRyZXcgQ2xhdXNlbgogICAgICAgICogbG90cyBvZiB0ZWRpb3VzIHdvcmsgb24gcGFydGVkL3N0cmxpc3QuYwoKRGFtaWVuIEdlbmV0ICAgICAgICAgICAgPGRhbWllbi5nZW5ldEBmcmVlLmZyPgogICAgICAgICogcGFydGVkLm00CgpCZW4gQ29sbGlucyAgICAgICAgICAgICA8YmNvbGxpbnNAZGViaWFuLm9yZz4KICAgICAgICAqIFN1biBkaXNrIGxhYmVsIHN1cHBvcnQgKGxpYnBhcnRlZC9kaXNrX3N1bi5jKQogICAgICAgICogc3R1YnMgZm9yIFVGUwoKVmluY2VudCBTdGVsaOkgICAgICAgICAgPHZpbmNlbnQuc3RlbGhlQGZyZWUuZnI+CiAgICAgICAgKiBtb3ZlIHN5bnRheCBwYXRjaCAobWFrZSBFTkQgc3BlY2lmaWNhdGlvbiBvcHRpb25hbCkuICBUcml2aWFsCiAgICAgICAgZm9yIGNvcHlyaWdodCBwdXJwb3NlcyAobm8gZGlzY2xhaW1lciBuZWVkZWQpCgpOZWFsIEggV2FsZmllbGQgICAgICAgICA8bmVhbEBjcy51bWwuZWR1PgogICAgICAgICogR05VL0h1cmQgcG9ydCAtIGxpYnBhcnRlZC9nbnUuYwoKVGhvbWFzIFJvZWx6ICAgICAgICAgICAgPHRvbUBzdXNlLmRlPgogICAgICAgICogbWlzYyBidWcgZml4ZXMKCk1hdHQgRG9tc2NoICAgICAgICAgICAgIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KICAgICAgICAqIEdVSUQgUGFydGl0aW9uIFRhYmxlIChHUFQpIHN1cHBvcnQgKGRpc2tfZ3B0LltjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmMzMi5bY2hdKQogICAgICAgICogbWlzYyBidWcgZml4ZXMsIGluY2x1ZGluZyBlbmQtb2YtZGV2aWNlIHdvcmthcm91bmQKICAgICAgICBpbiBsaWJwYXJ0ZWQvbGludXguYwoKS2pldGlsIFRvcmdyaW0gSG9tbWUgICAgPGtqZXRpbGhvQGxpbnByby5ubz4KICAgICAgICAqIE5vcndlaWdlbiB0cmFuc2xhdGlvbnMKCkr2cmdlbiBUZWdu6XIgICAgICAgICAgIDxqb3JnZW4udGVnbmVyQHRlbGlhLmNvbT4KICAgICAgICAqIFN3ZWRpc2ggdHJhbnNsYXRpb25zCgpLZWxkIFNpbW9uc2VuICAgICAgICAgICA8a2VsZEBka3V1Zy5kaz4KICAgICAgICAqIERhbmlzaCB0cmFuc2xhdGlvbnMKClJpY2hhcmQgTS4gS3JldXRlciAgICAgIDxrcmV1dGVyQGF1c2FyLnJ1dGdlcnMuZWR1PgogICAgICAgICogY29udmVydGVkIGRvYy9VU0VSIHRvIHRleGluZm8gKGRvYy9wYXJ0ZWQudGV4aSkKCk1pcXVlbCBNYXRhcyAgICAgICAgICAgIDxtaXF1ZWxtYXRhc0B3YW5hZG9vLmVzPgogICAgICAgICogQ2F0YWxhbiB0cmFuc2xhdGlvbnMKCkFuZHJlYXMgRGlsZ2VyICAgICAgICAgIDxhZGlsZ2VyQGNsdXN0ZXJmcy5jb20+CiAgICAgICAgKiBsb3RzIG9mIG1peCBidWcgZml4ZXMvY2xlYW51cHMKClZpY2VudGUgRS4gTGxvcmVucyAgICAgIDx2bGxvcmVuc0BtdW5kb2ZyZWUuY29tPgogICAgICAgICogU3BhbmlzaCB0cmFuc2xhdGlvbnMKCll1cnkgVW1hbmV0cyAgICAgICAgICAgIDx0b3JxdWVAdWtycG9zdC5uZXQ+CiAgICAgICAgKiBiYXNpcyBvZiBsaWJwYXJ0ZWQvZnNfcmVpc2VyZnMKCkJlcm5hcmRvIEpv428gVG9ycmVzIGRhIFNpbHZlaXJhIAogICAgICAgICAgICAgICAgICAgICAgICA8YmVybmFyZG9qdHNAaWcuY29tLmJyPgogICAgICAgICogcHRfQlIgdHJhbnNsYXRpb24gb2YgRkFRIGFuZCBwYXJ0ZWQudGV4aQoKV29qY2llY2ggUG9sYWsgICAgICAgICAgPHBvbGFrQGdudS5vcmc+CiAgICAgICAgKiBQb2xpc2ggdHJhbnNsYXRpb25zCgpNaWxvc2xhdiBUcm1hYyAgICAgICAgICA8bWl0ckB2b2xueS5jej4KICAgICAgICAqIEN6ZWNoIHRyYW5zbGF0aW9ucwoKTWF4aW0gVi4gRHppdW1hbmVua28gICAgPG12ZEBteWxpbnV4LmNvbS51YT4KICAgICAgICAqIFVrcmFpbmlhbiB0cmFuc2xhdGlvbnMKCkdpdXNlcHBlIFNhY2NvICAgICAgICAgIDxlcHBlc3VpZ0BkZWJpYW4ub3JnPgogICAgICAgICogSXRhbGlhbiB0cmFuc2xhdGlvbnMKCkd1aWxsYXVtZSBLbmlzcGVsICAgICAgIDxrX2d1aWxsYXVtZUBsaWJlcnR5c3VyZi5mcj4KICAgICAgICAqIG5lYXJseSBhbGwgaGZzIGFuZCBoZnMrIGNvZGUgKGxpYnBhcnRlZC9mc19oZnMpCiAgICAgICAgKiBoZnMrIHN1cHBvcnQgZm9yIG1hYyBwYXJ0aXRpb25zIChkaXNrX21hYy5jKQogICAgICAgICogc3luY19mYXN0IGNvZGUgKGxpbnV4LmMgZ251LmMgZ2VvbS5bY2hdIGRldmljZS5bY2hdICkKICAgICAgICAqIHZhcmlvdXMgZml4ZXMgKHBhcnRlZC5jIHVpLmMgZmlsZXN5cy5jIGRpc2tfZG9zLmMgZGlzay5jCiAgICAgICAgZG9jL3BhcnRlZC50ZXhpIGRvYy9BUEkgZGlza19ncHQuYyBkaXNrX21hYy5jIHVuaXQuYyBmc19mYXQvdHJhdmVyc2UuYykKCkNocmlzIEx1bWVucyAgICAgICAgICAgIDxjbHVtZW5zQHJlZGhhdC5jb20+CiAgICAgICAgKiBpbnRlcmFjdGl2ZSBoZWxwIGZpeGVzIGZvciBmaWxlc3lzdGVtIHR5cGVzCiAgICAgICAgKiBnY2MtNCBwZWRhbnRpY2lzbSBjbGVhbnVwcwoKV2VpLUx1biBDaGFvICAgICAgICAgICAgPGNoYW93ZWlsdW5AcGNtYWlsLmNvbS50dz4KICAgICAgICAqIFRhaXdhbmVzZSBkaWFsZWN0IG9mIENoaW5lc2UgKENhbnRvbmVzZT8pIHRyYW5zbGF0aW9ucy4KClRyYW4gVGhpIEhvYW5nIFF1eWVuICAgIDxiYW5oZGF1eGFuaGhhaWR1b25nQGdtYWlsLmNvbT4KICAgICAgICAqIFZpZXRuYW1lc2UgdHJhbnNsYXRpb25zCgpFZHVhcmRvIE1hZXN0cmkgUmlnaGVzICA8ZWR1YXJkb0B0dGVuZy5jb20uYnI+CiAgICAgICAgKiBoaWRkZW4gcGFydGl0aW9ucyBzdXBwb3J0CiAgICAgICAgKiBzZXR0aW5nIE1TIFJlc2VydmVkIHBhcnRpdGlvbnMgdGhyb3VnaCAic2V0IiBjb21tYW5kLgoKQXJpZiBFLiBOdWdyb2hvICAgICAgICAgPGFyaWZfZW5kcm9AeWFob28uY29tPgogICAgICAgICogSW5kb25lc2lhbiB0cmFuc2xhdGlvbnMKCkl0aGFtYXIgUi4gQWRlbWEgICAgICAgIDxpdGhhbWFyQHVuZXQubmw+CiAgICAgICAgKiBCZU9TIHN1cHBvcnQKCkRhdmlkIENhbnRyZWxsICAgICAgICAgIDxkY2FudHJlbGxAcmVkaGF0LmNvbT4KICAgICAgICAqIEFkZGVkIHN1cHBvcnQgZm9yIFByb21pc2UgU1g4IGRldmljZXMgKG9yaWdpbmFsIHBhdGNoIGZyb20gSmVyZW15CiAgICAgICAgICBLYXR6IDxrYXR6akByZWRoYXQuY29tPikKICAgICAgICAqIEJyb3VnaHQgSUJNL1JlZCBIYXQgREFTRCBwYXRjaGVzIGZvcndhcmQgdG8gcGFydGVkLTEuNy54CiAgICAgICAgICBPcmlnaW5hbCBJQk0gYXV0aG9yczogVm9sa2VyIFNhbWVza2UgPHNhbWVza2VAZGUuaWJtLmNvbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb3JzdCBIdW1tZWwgPEhvcnN0Lkh1bW1lbEBkZS5pYm0uY29tPgogICAgICAgICAgT3JpZ2luYWwgUmVkIEhhdCBhdXRob3JzOiBQaGlsIEtuaXJzY2ggPHBoaWxAcmVkaGF0LmRlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXJhbGQgSG95ZXIgPGhhcmFsZEByZWRoYXQuZGU+CiAgICAgICAgKiBQcmV2ZW50IFNJR0ZQRSB3aGVuIEZBVCBzZWN0b3Igc2l6ZSBpcyAwCiAgICAgICAgKiBBZGQgdmlydHVhbCBEQVNEIChWSU9EQVNEKSBvbiBpU2VyaWVzIHN1cHBvcnQKICAgICAgICAqIFVzZSBPX0RJUkVDVCBJL08gdG8gcHJldmVudCBmaXJzdCBwYXJ0aXRpb24gY29ycnVwdGlvbiBvbiBHUFQgZGlza3MKICAgICAgICAqIFByZXZlbnQgc2VjdG9yIHJlYWRpbmcgZXhjZXB0aW9ucyBmcm9tIHBlZF9nZW9tZXRyeV9jaGVjaygpIG9uIE1hYwogICAgICAgICAgZGlza2xhYmVscy4KICAgICAgICAqIFZhcmlvdXMgYnVnIGZpeGVzIGFuZCBvdGhlciB0aGluZ3MuCgpQZXRlciBKb25lcyAgICAgICAgICAgICA8cGpvbmVzQHJlZGhhdC5jb20+CiAgICAgICAgKiBBZGQgcGVkX2V4Y2VwdGlvbl9nZXRfaGFuZGxlcigpCiAgICAgICAgKiAvZGV2L21hcHBlciByZWFkL3dyaXRlIHN1cHBvcnQgb24gTGludXggKHZpYSBsaWJkZXZtYXBwZXIpCgpEYXJyZW4gTGF2ZW5kZXIgICAgICAgICA8ZGwxQGhwcGluZTk5Lmdici5ocC5jb20+CiAgICAgICAgKiBGaXggU0lHU0VHViBpbiBwYXJ0ZWQgMS42LjE5IGFuZCBhc3NlcnRpb24gZXJyb3IgaW4gMS43LjAKICAgICAgICAqIEFkZCBzdXBwb3J0IGZvciBMVU4vZGV2aWNlIHJlc2l6ZSBkZXRlY3Rpb24gYW5kIG9wdGlvbiBHUFQKICAgICAgICAgIGhlYWRlciBjb3JydXB0aW9uCiAgICAgICAgKiBGaXhlZCBvZmYtYnktb25lIGVycm9yIGluIEdQVCBoZWFkZXIgdGhhdCBhbGxvd2VkIGZvciBvdmVybGFwCiAgICAgICAgICBiZXR3ZWVuIExEQXMgb2YgTGFzdFVzYWJsZUxCQSBhbmQgUGFydGl0aW9uRW50cnlMQkEgaW4gYmFja3VwIEdQVAoKT2xhZiBIZXJpbmcgICAgICAgICAgICAgPG9saEBzdXNlLmRlPgogICAgICAgICogRml4ZXMgZm9yIE1hY2ludG9zaCBkaXNrIGxhYmVsIGNvZGUKCkRlYmFyc2hpIFJheSAgICAgICAgICAgIDxyaXNoaUBnbnUub3JnPgogICAgICAgICogRGlzcGxheSBkaXNrIG1vZGVsIGFuZCB0cmFuc3BvcnQgdHlwZSBpbiBwYXJ0ZWQoOCkuCiAgICAgICAgKiAnLS1saXN0Ly1sJyBjb21tYW5kIGxpbmUgc3dpdGNoLgogICAgICAgICogSW50cm9kdWNlICdwcmludCBkZXZpY2VzJyBhbmQgYWxpYXMgJ3ByaW50IGxpc3QnIHRvICdwcmludCBhbGwnLgogICAgICAgICogQWxpYXMgJ21rdGFibGUnIHRvICdta2xhYmVsJy4KICAgICAgICAqIENvZGUgYW5kIEFQSSBjbGVhbi11cCwgYnVnIGZpeGVzLCBhbmQgb3RoZXIgbWlzY2VsbGFuZW91cyBzdHVmZi4K