[Snowball-discuss] Porter Stemmer

Jin Wang jin@cs.tamu.edu
Tue Feb 4 09:45:02 2003


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

---559023410-1804928587-1044310617=:5619
Content-Type: TEXT/PLAIN; charset=US-ASCII

Dear Richard,

> If you agree to license your modified version in the same way
> as the original version was, then send your modified version to me, and
> I'll incorporate your changes into the version on
> the website.
> 
> Thanks,
> Richard Boulton
> 

The attachment is my modified version. I just think the StringBuffer is the 
right thing to use here in java. It makes the code looks more organized
and easy-understandable. Actually, at first, I was confused why char array
was used here.

And I found a small bug in the method "public String stem(String s)",
it is just a very small bug. The orginal code is
 public String stem(String s)
   {
      NewPorterStemmer stemmer = new NewPorterStemmer();
      return stemmer.toString();
   }

It should be
  public String stem(String s)
   {
      NewPorterStemmer stemmer = new NewPorterStemmer();
      stemmer.add(s);
      stemmer.stem();
      return stemmer.toString();
   }


Actually, I got the original stemmer code from my friend, he said he
downloaded it from Martin's website. However, when I checked the latest
release of stemmer in his website. I didn't see this method. I think this
method is very useful. Would you please add it into the stemmer?


Thanks!

Jin

---559023410-1804928587-1044310617=:5619
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="NewPorterStemmer.java"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.SOL.4.10.10302031616570.5619@dogbert>
Content-Description: 
Content-Disposition: attachment; filename="NewPorterStemmer.java"

cGFja2FnZSBjbS5tZWRpYS50ZXh0Ow0NCi8qDQ0KDQ0KICAgUG9ydGVyIHN0
ZW1tZXIgaW4gSmF2YS4gVGhlIG9yaWdpbmFsIHBhcGVyIGlzIGluDQ0KDQ0K
ICAgICAgIFBvcnRlciwgMTk4MCwgQW4gYWxnb3JpdGhtIGZvciBzdWZmaXgg
c3RyaXBwaW5nLCBQcm9ncmFtLCBWb2wuIDE0LA0NCiAgICAgICBuby4gMywg
cHAgMTMwLTEzNywNDQoNDQogICBTZWUgYWxzbyBodHRwOi8vd3d3LnRhcnRh
cnVzLm9yZy9+bWFydGluL1BvcnRlclN0ZW1tZXINDQoNDQogICBIaXN0b3J5
Og0NCg0NCiAgIFJlbGVhc2UgMQ0NCg0NCiAgIEJ1ZyAxIChyZXBvcnRlZCBi
eSBHb256YWxvIFBhcnJhIDE2LzEwLzk5KSBmaXhlZCBhcyBtYXJrZWQgYmVs
b3cuDQ0KICAgVGhlIHdvcmRzICdhZWQnLCAnZWVkJywgJ29lZCcgbGVhdmUg
ayBhdCAnYScgZm9yIHN0ZXAgMywgYW5kIGJbay0xXQ0NCiAgIGlzIHRoZW4g
b3V0IG91dHNpZGUgdGhlIGJvdW5kcyBvZiBiLg0NCg0NCiAgIFJlbGVhc2Ug
Mg0NCg0NCiAgIFNpbWlsYXJseSwNDQoNDQogICBCdWcgMiAocmVwb3J0ZWQg
YnkgU3RldmUgRHlyZGFobCAyMi8yLzAwKSBmaXhlZCBhcyBtYXJrZWQgYmVs
b3cuDQ0KICAgJ2lvbicgYnkgaXRzZWxmIGxlYXZlcyBqID0gLTEgaW4gdGhl
IHRlc3QgZm9yICdpb24nIGluIHN0ZXAgNSwgYW5kDQ0KICAgYltqXSBpcyB0
aGVuIG91dHNpZGUgdGhlIGJvdW5kcyBvZiBiLg0NCg0NCiAgIFJlbGVhc2Ug
Mw0NCg0NCiAgIENvbnNpZGVyYWJseSByZXZpc2VkIDQvOS8wMCBpbiB0aGUg
bGlnaHQgb2YgbWFueSBoZWxwZnVsIHN1Z2dlc3Rpb25zDQ0KICAgZnJvbSBC
cmlhbiBHb2V0eiBvZiBRdWlvdGl4IENvcnBvcmF0aW9uIChicmlhbkBxdWlv
dGl4LmNvbSkuDQ0KDQ0KICAgUmVsZWFzZSA0DQ0KICAgDQ0KICAgTW9kaWZp
Y2F0aW9uDQ0KICAgVGhpcyB2ZXJzaW9uIGlzIGRlcml2ZWQgZnJvbSBSZWxl
YXNlIDQsIG1vZGlmaWVkIGJ5IEppbiBXYW5nIHRvIHVzZSANDQogICBTdHJp
bmdCdWZmZXIgaW5zdGVhZCBvZiBjaGFyIGFycmF5LiAgIA0NCg0NCiovDQ0K
DQ0KaW1wb3J0IGphdmEuaW8uKjsNDQppbXBvcnQgamF2YS5sYW5nLlN0cmlu
Z0J1ZmZlcjsNDQoNDQoNDQovKioNDQogICogU3RlbW1lciwgaW1wbGVtZW50
aW5nIHRoZSBQb3J0ZXIgU3RlbW1pbmcgQWxnb3JpdGhtDQ0KICAqDQ0KICAq
IFRoZSBTdGVtbWVyIGNsYXNzIHRyYW5zZm9ybXMgYSB3b3JkIGludG8gaXRz
IHJvb3QgZm9ybS4gIFRoZSBpbnB1dA0NCiAgKiB3b3JkIGNhbiBiZSBwcm92
aWRlZCBhIGNoYXJhY3RlciBhdCB0aW1lIChieSBjYWxsaW5nIGFkZCgpKSwg
b3IgYXQgb25jZQ0NCiAgKiBieSBjYWxsaW5nIG9uZSBvZiB0aGUgdmFyaW91
cyBzdGVtKHNvbWV0aGluZykgbWV0aG9kcy4NDQogICogDQ0KICAqIE5ldyB2
ZXJzaW9uIG9mIFBvcnRlclN0ZW1tZXIgaW1wbGVtZW50ZWQgd2l0aCBTdHJp
bmdCdWZmZXIuDQ0KICAqLw0NCg0NCnB1YmxpYyBjbGFzcyBOZXdQb3J0ZXJT
dGVtbWVyDQ0KeyAgDQ0KCS8vcHJpdmF0ZSBjaGFyW10gYjsNDQogICBwcml2
YXRlIFN0cmluZ0J1ZmZlciBiOw0NCiAgIHByaXZhdGUgaW50IGksICAgICAv
KiBvZmZzZXQgaW50byBiICovDQ0KICAgICAgICAgICAgICAgaV9lbmQsIC8q
IG9mZnNldCB0byBlbmQgb2Ygc3RlbW1lZCB3b3JkICovDQ0KICAgICAgICAg
ICAgICAgaiwgazsNDQogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5D
ID0gNTA7DQ0KICAgICAgICAgICAgICAgICAgICAgLyogdW5pdCBvZiBzaXpl
IHdoZXJlYnkgYiBpcyBpbmNyZWFzZWQgKi8NDQogICBwdWJsaWMgTmV3UG9y
dGVyU3RlbW1lcigpDQ0KICAgeyAgICAgCSANDQogICAJIGIgPSBuZXcgU3Ry
aW5nQnVmZmVyKElOQyk7DQ0KICAgICBpID0gMDsNDQogICAgIGlfZW5kID0g
MDsNDQogICB9DQ0KDQ0KICAgLyoqDQ0KICAgICogQWRkIGEgY2hhcmFjdGVy
IHRvIHRoZSB3b3JkIGJlaW5nIHN0ZW1tZWQuICBXaGVuIHlvdSBhcmUgZmlu
aXNoZWQNDQogICAgKiBhZGRpbmcgY2hhcmFjdGVycywgeW91IGNhbiBjYWxs
IHN0ZW0odm9pZCkgdG8gc3RlbSB0aGUgd29yZC4NDQogICAgKi8NDQoNDQog
ICBwdWJsaWMgdm9pZCBhZGQoY2hhciBjaCkNDQogICB7ICAgICAgIA0NCiAg
ICAgaWYgKGkgPT0gYi5sZW5ndGgoKSkgICAgIA0NCiAgICAJYi5zZXRMZW5n
dGgoaStJTkMpOyAgICAgICAgICAJDQ0KICAgICBiLnNldENoYXJBdChpKyss
IGNoKTsgICAgICAgICAgICAgICAgICAgDQ0KICAgfQ0NCg0NCiAgIC8qKiBB
ZGRzIHdMZW4gY2hhcmFjdGVycyB0byB0aGUgd29yZCBiZWluZyBzdGVtbWVk
IGNvbnRhaW5lZCBpbiBhIHBvcnRpb24NDQogICAgKiBvZiBhIGNoYXJbXSBh
cnJheS4gVGhpcyBpcyBsaWtlIHJlcGVhdGVkIGNhbGxzIG9mIGFkZChjaGFy
IGNoKSwgYnV0DQ0KICAgICogZmFzdGVyLg0NCiAgICAqLw0NCg0NCiAgIHB1
YmxpYyB2b2lkIGFkZChjaGFyW10gdywgaW50IHdMZW4pDQ0KICAgeyAgICAN
DQogICAgIGlmIChpK3dMZW4gPj0gYi5sZW5ndGgoKSkNDQogICAgIAliLnNl
dExlbmd0aChpK3dMZW4rSU5DKTsNDQogICAgIGZvciAoaW50IGMgPSAwOyBj
IDwgd0xlbjsgYysrKSAgICAgIA0NCiAgICAgCWIuc2V0Q2hhckF0KGkrKywg
d1tjXSk7DQ0KICAgICAgDQ0KICAgfQ0NCiAgIHB1YmxpYyB2b2lkIGFkZChT
dHJpbmcgcykNDQogICB7DQ0KICAgICAgYWRkKHMudG9DaGFyQXJyYXkoKSwg
cy5sZW5ndGgoKSk7DQ0KICAgfQ0NCiAgIC8qKg0NCiAgICAqIEFmdGVyIGEg
d29yZCBoYXMgYmVlbiBzdGVtbWVkLCBpdCBjYW4gYmUgcmV0cmlldmVkIGJ5
IHRvU3RyaW5nKCksDQ0KICAgICogb3IgYSByZWZlcmVuY2UgdG8gdGhlIGlu
dGVybmFsIGJ1ZmZlciBjYW4gYmUgcmV0cmlldmVkIGJ5IGdldFJlc3VsdEJ1
ZmZlcg0NCiAgICAqIGFuZCBnZXRSZXN1bHRMZW5ndGggKHdoaWNoIGlzIGdl
bmVyYWxseSBtb3JlIGVmZmljaWVudC4pDQ0KICAgICovDQ0KICAgcHVibGlj
IFN0cmluZyB0b1N0cmluZygpIHsgDQ0KICAgCS8vcmV0dXJuIG5ldyBTdHJp
bmcoYiwwLGlfZW5kKTsgDQ0KICAgCXJldHVybiBiLnN1YnN0cmluZygwLCBp
X2VuZCk7DQ0KICAgCX0NDQoNDQogICBwdWJsaWMgU3RyaW5nIHN0ZW0oU3Ry
aW5nIHMpDQ0KICAgeyAgICAgICAgIAkgICAJDQ0KICAgCSAgTmV3UG9ydGVy
U3RlbW1lciBzdGVtbWVyID0gbmV3IE5ld1BvcnRlclN0ZW1tZXIoKTsNDQog
ICAgICBzdGVtbWVyLmFkZChzKTsgDQ0KICAgICAgc3RlbW1lci5zdGVtKCk7
ICAgICANDQogICAgICByZXR1cm4gc3RlbW1lci50b1N0cmluZygpOyAgICAg
IA0NCiAgIH0NDQogICAvKioNDQogICAgKiBSZXR1cm5zIHRoZSBsZW5ndGgg
b2YgdGhlIHdvcmQgcmVzdWx0aW5nIGZyb20gdGhlIHN0ZW1taW5nIHByb2Nl
c3MuDQ0KICAgICovDQ0KICAgcHVibGljIGludCBnZXRSZXN1bHRMZW5ndGgo
KSB7IHJldHVybiBpX2VuZDsgfQ0NCg0NCiAgIC8qKg0NCiAgICAqIFJldHVy
bnMgYSByZWZlcmVuY2UgdG8gYSBjaGFyYWN0ZXIgYnVmZmVyIGNvbnRhaW5p
bmcgdGhlIHJlc3VsdHMgb2YNDQogICAgKiB0aGUgc3RlbW1pbmcgcHJvY2Vz
cy4gIFlvdSBhbHNvIG5lZWQgdG8gY29uc3VsdCBnZXRSZXN1bHRMZW5ndGgo
KQ0NCiAgICAqIHRvIGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1
bHQuDQ0KICAgICovDQ0KICAgcHVibGljIFN0cmluZ0J1ZmZlciBnZXRSZXN1
bHRCdWZmZXIoKSB7IHJldHVybiBiOyB9DQ0KDQ0KICAgLyogY29ucyhpKSBp
cyB0cnVlIDw9PiBiW2ldIGlzIGEgY29uc29uYW50LiAqLw0NCg0NCiAgIHBy
aXZhdGUgZmluYWwgYm9vbGVhbiBjb25zKGludCBpKQ0NCiAgIHsgIHN3aXRj
aCAoYi5jaGFyQXQoaSkpDQ0KICAgICAgeyAgY2FzZSAnYSc6IGNhc2UgJ2Un
OiBjYXNlICdpJzogY2FzZSAnbyc6IGNhc2UgJ3UnOiByZXR1cm4gZmFsc2U7
DQ0KICAgICAgICAgY2FzZSAneSc6IHJldHVybiAoaT09MCkgPyB0cnVlIDog
IWNvbnMoaS0xKTsNDQogICAgICAgICBkZWZhdWx0OiByZXR1cm4gdHJ1ZTsN
DQogICAgICB9DQ0KICAgfQ0NCg0NCiAgIC8qIG0oKSBtZWFzdXJlcyB0aGUg
bnVtYmVyIG9mIGNvbnNvbmFudCBzZXF1ZW5jZXMgYmV0d2VlbiAwIGFuZCBq
LiBpZiBjIGlzDQ0KICAgICAgYSBjb25zb25hbnQgc2VxdWVuY2UgYW5kIHYg
YSB2b3dlbCBzZXF1ZW5jZSwgYW5kIDwuLj4gaW5kaWNhdGVzIGFyYml0cmFy
eQ0NCiAgICAgIHByZXNlbmNlLA0NCg0NCiAgICAgICAgIDxjPjx2PiAgICAg
ICBnaXZlcyAwDQ0KICAgICAgICAgPGM+dmM8dj4gICAgIGdpdmVzIDENDQog
ICAgICAgICA8Yz52Y3ZjPHY+ICAgZ2l2ZXMgMg0NCiAgICAgICAgIDxjPnZj
dmN2Yzx2PiBnaXZlcyAzDQ0KICAgICAgICAgLi4uLg0NCiAgICovDQ0KDQ0K
ICAgcHJpdmF0ZSBmaW5hbCBpbnQgbSgpDQ0KICAgeyAgaW50IG4gPSAwOw0N
CiAgICAgIGludCBpID0gMDsNDQogICAgICB3aGlsZSh0cnVlKQ0NCiAgICAg
IHsgIGlmIChpID4gaikgcmV0dXJuIG47DQ0KICAgICAgICAgaWYgKCEgY29u
cyhpKSkgYnJlYWs7IGkrKzsNDQogICAgICB9DQ0KICAgICAgaSsrOw0NCiAg
ICAgIHdoaWxlKHRydWUpDQ0KICAgICAgeyAgd2hpbGUodHJ1ZSkNDQogICAg
ICAgICB7ICBpZiAoaSA+IGopIHJldHVybiBuOw0NCiAgICAgICAgICAgICAg
IGlmIChjb25zKGkpKSBicmVhazsNDQogICAgICAgICAgICAgICBpKys7DQ0K
ICAgICAgICAgfQ0NCiAgICAgICAgIGkrKzsNDQogICAgICAgICBuKys7DQ0K
ICAgICAgICAgd2hpbGUodHJ1ZSkNDQogICAgICAgICB7ICBpZiAoaSA+IGop
IHJldHVybiBuOw0NCiAgICAgICAgICAgIGlmICghIGNvbnMoaSkpIGJyZWFr
Ow0NCiAgICAgICAgICAgIGkrKzsNDQogICAgICAgICB9DQ0KICAgICAgICAg
aSsrOw0NCiAgICAgICB9DQ0KICAgfQ0NCg0NCiAgIC8qIHZvd2VsaW5zdGVt
KCkgaXMgdHJ1ZSA8PT4gMCwuLi5qIGNvbnRhaW5zIGEgdm93ZWwgKi8NDQoN
DQogICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdm93ZWxpbnN0ZW0oKQ0NCiAg
IHsgIGludCBpOyBmb3IgKGkgPSAwOyBpIDw9IGo7IGkrKykgaWYgKCEgY29u
cyhpKSkgcmV0dXJuIHRydWU7DQ0KICAgICAgcmV0dXJuIGZhbHNlOw0NCiAg
IH0NDQoNDQogICAvKiBkb3VibGVjKGopIGlzIHRydWUgPD0+IGosKGotMSkg
Y29udGFpbiBhIGRvdWJsZSBjb25zb25hbnQuICovDQ0KDQ0KICAgcHJpdmF0
ZSBmaW5hbCBib29sZWFuIGRvdWJsZWMoaW50IGopDQ0KICAgeyAgaWYgKGog
PCAxKSByZXR1cm4gZmFsc2U7DQ0KICAgICAgaWYgKGIuY2hhckF0KGopICE9
IGIuY2hhckF0KGotMSkpIHJldHVybiBmYWxzZTsNDQogICAgICByZXR1cm4g
Y29ucyhqKTsNDQogICB9DQ0KDQ0KICAgLyogY3ZjKGkpIGlzIHRydWUgPD0+
IGktMixpLTEsaSBoYXMgdGhlIGZvcm0gY29uc29uYW50IC0gdm93ZWwgLSBj
b25zb25hbnQNDQogICAgICBhbmQgYWxzbyBpZiB0aGUgc2Vjb25kIGMgaXMg
bm90IHcseCBvciB5LiB0aGlzIGlzIHVzZWQgd2hlbiB0cnlpbmcgdG8NDQog
ICAgICByZXN0b3JlIGFuIGUgYXQgdGhlIGVuZCBvZiBhIHNob3J0IHdvcmQu
IGUuZy4NDQoNDQogICAgICAgICBjYXYoZSksIGxvdihlKSwgaG9wKGUpLCBj
cmltKGUpLCBidXQNDQogICAgICAgICBzbm93LCBib3gsIHRyYXkuDQ0KDQ0K
ICAgKi8NDQoNDQogICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY3ZjKGludCBp
KQ0NCiAgIHsgIGlmIChpIDwgMiB8fCAhY29ucyhpKSB8fCBjb25zKGktMSkg
fHwgIWNvbnMoaS0yKSkgcmV0dXJuIGZhbHNlOw0NCiAgICAgIHsgIGludCBj
aCA9IGIuY2hhckF0KGkpOw0NCiAgICAgICAgIGlmIChjaCA9PSAndycgfHwg
Y2ggPT0gJ3gnIHx8IGNoID09ICd5JykgcmV0dXJuIGZhbHNlOw0NCiAgICAg
IH0NDQogICAgICByZXR1cm4gdHJ1ZTsNDQogICB9DQ0KDQ0KICAgcHJpdmF0
ZSBmaW5hbCBib29sZWFuIGVuZHMoU3RyaW5nIHMpDQ0KICAgeyAgaW50IGwg
PSBzLmxlbmd0aCgpOw0NCiAgICAgIGludCBvID0gay1sKzE7DQ0KICAgICAg
aWYgKG8gPCAwKSByZXR1cm4gZmFsc2U7DQ0KICAgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBsOyBpKyspIGlmIChiLmNoYXJBdChvK2kpICE9IHMuY2hhckF0
KGkpKSByZXR1cm4gZmFsc2U7DQ0KICAgICAgaiA9IGstbDsNDQogICAgICBy
ZXR1cm4gdHJ1ZTsNDQogICB9DQ0KDQ0KICAgLyogc2V0dG8ocykgc2V0cyAo
aisxKSwuLi5rIHRvIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgcywg
cmVhZGp1c3RpbmcNDQogICAgICBrLiAqLw0NCg0NCiAgIHByaXZhdGUgZmlu
YWwgdm9pZCBzZXR0byhTdHJpbmcgcykNDQogICB7ICBpbnQgbCA9IHMubGVu
Z3RoKCk7DQ0KICAgICAgaW50IG8gPSBqKzE7DQ0KICAgICAgZm9yIChpbnQg
aSA9IDA7IGkgPCBsOyBpKyspIGIuc2V0Q2hhckF0KG8raSwgcy5jaGFyQXQo
aSkpOw0NCiAgICAgIGsgPSBqK2w7DQ0KICAgfQ0NCg0NCiAgIC8qIHIocykg
aXMgdXNlZCBmdXJ0aGVyIGRvd24uICovDQ0KDQ0KICAgcHJpdmF0ZSBmaW5h
bCB2b2lkIHIoU3RyaW5nIHMpIHsgaWYgKG0oKSA+IDApIHNldHRvKHMpOyB9
DQ0KDQ0KICAgLyogc3RlcDEoKSBnZXRzIHJpZCBvZiBwbHVyYWxzIGFuZCAt
ZWQgb3IgLWluZy4gZS5nLg0NCg0NCiAgICAgICAgICBjYXJlc3NlcyAgLT4g
IGNhcmVzcw0NCiAgICAgICAgICBwb25pZXMgICAgLT4gIHBvbmkNDQogICAg
ICAgICAgdGllcyAgICAgIC0+ICB0aQ0NCiAgICAgICAgICBjYXJlc3MgICAg
LT4gIGNhcmVzcw0NCiAgICAgICAgICBjYXRzICAgICAgLT4gIGNhdA0NCg0N
CiAgICAgICAgICBmZWVkICAgICAgLT4gIGZlZWQNDQogICAgICAgICAgYWdy
ZWVkICAgIC0+ICBhZ3JlZQ0NCiAgICAgICAgICBkaXNhYmxlZCAgLT4gIGRp
c2FibGUNDQoNDQogICAgICAgICAgbWF0dGluZyAgIC0+ICBtYXQNDQogICAg
ICAgICAgbWF0aW5nICAgIC0+ICBtYXRlDQ0KICAgICAgICAgIG1lZXRpbmcg
ICAtPiAgbWVldA0NCiAgICAgICAgICBtaWxsaW5nICAgLT4gIG1pbGwNDQog
ICAgICAgICAgbWVzc2luZyAgIC0+ICBtZXNzDQ0KDQ0KICAgICAgICAgIG1l
ZXRpbmdzICAtPiAgbWVldA0NCg0NCiAgICovDQ0KDQ0KICAgcHJpdmF0ZSBm
aW5hbCB2b2lkIHN0ZXAxKCkNDQogICB7ICBpZiAoYi5jaGFyQXQoaykgPT0g
J3MnKQ0NCiAgICAgIHsgIGlmIChlbmRzKCJzc2VzIikpIGsgLT0gMjsgZWxz
ZQ0NCiAgICAgICAgIGlmIChlbmRzKCJpZXMiKSkgc2V0dG8oImkiKTsgZWxz
ZQ0NCiAgICAgICAgIGlmIChiLmNoYXJBdChrLTEpICE9ICdzJykgay0tOw0N
CiAgICAgIH0NDQogICAgICBpZiAoZW5kcygiZWVkIikpIHsgaWYgKG0oKSA+
IDApIGstLTsgfSBlbHNlDQ0KICAgICAgaWYgKChlbmRzKCJlZCIpIHx8IGVu
ZHMoImluZyIpKSAmJiB2b3dlbGluc3RlbSgpKQ0NCiAgICAgIHsgIGsgPSBq
Ow0NCiAgICAgICAgIGlmIChlbmRzKCJhdCIpKSBzZXR0bygiYXRlIik7IGVs
c2UNDQogICAgICAgICBpZiAoZW5kcygiYmwiKSkgc2V0dG8oImJsZSIpOyBl
bHNlDQ0KICAgICAgICAgaWYgKGVuZHMoIml6IikpIHNldHRvKCJpemUiKTsg
ZWxzZQ0NCiAgICAgICAgIGlmIChkb3VibGVjKGspKQ0NCiAgICAgICAgIHsg
IGstLTsNDQogICAgICAgICAgICB7ICBpbnQgY2ggPSBiLmNoYXJBdChrKTsN
DQogICAgICAgICAgICAgICBpZiAoY2ggPT0gJ2wnIHx8IGNoID09ICdzJyB8
fCBjaCA9PSAneicpIGsrKzsNDQogICAgICAgICAgICB9DQ0KICAgICAgICAg
fQ0NCiAgICAgICAgIGVsc2UgaWYgKG0oKSA9PSAxICYmIGN2YyhrKSkgc2V0
dG8oImUiKTsNDQogICAgIH0NDQogICB9DQ0KDQ0KICAgLyogc3RlcDIoKSB0
dXJucyB0ZXJtaW5hbCB5IHRvIGkgd2hlbiB0aGVyZSBpcyBhbm90aGVyIHZv
d2VsIGluIHRoZSBzdGVtLiAqLw0NCg0NCiAgIHByaXZhdGUgZmluYWwgdm9p
ZCBzdGVwMigpIHsgaWYgKGVuZHMoInkiKSAmJiB2b3dlbGluc3RlbSgpKSBi
LnNldENoYXJBdChrLCdpJyk7IH0NDQogICAvKiBzdGVwMygpIG1hcHMgZG91
YmxlIHN1ZmZpY2VzIHRvIHNpbmdsZSBvbmVzLiBzbyAtaXphdGlvbiAoID0g
LWl6ZSBwbHVzDQ0KICAgICAgLWF0aW9uKSBtYXBzIHRvIC1pemUgZXRjLiBu
b3RlIHRoYXQgdGhlIHN0cmluZyBiZWZvcmUgdGhlIHN1ZmZpeCBtdXN0IGdp
dmUNDQogICAgICBtKCkgPiAwLiAqLw0NCg0NCiAgIHByaXZhdGUgZmluYWwg
dm9pZCBzdGVwMygpIHsgaWYgKGsgPT0gMCkgcmV0dXJuOyAvKiBGb3IgQnVn
IDEgKi8gc3dpdGNoIChiLmNoYXJBdChrLTEpKQ0NCiAgIHsNDQogICAgICAg
Y2FzZSAnYSc6IGlmIChlbmRzKCJhdGlvbmFsIikpIHsgcigiYXRlIik7IGJy
ZWFrOyB9DQ0KICAgICAgICAgICAgICAgICBpZiAoZW5kcygidGlvbmFsIikp
IHsgcigidGlvbiIpOyBicmVhazsgfQ0NCiAgICAgICAgICAgICAgICAgYnJl
YWs7DQ0KICAgICAgIGNhc2UgJ2MnOiBpZiAoZW5kcygiZW5jaSIpKSB7IHIo
ImVuY2UiKTsgYnJlYWs7IH0NDQogICAgICAgICAgICAgICAgIGlmIChlbmRz
KCJhbmNpIikpIHsgcigiYW5jZSIpOyBicmVhazsgfQ0NCiAgICAgICAgICAg
ICAgICAgYnJlYWs7DQ0KICAgICAgIGNhc2UgJ2UnOiBpZiAoZW5kcygiaXpl
ciIpKSB7IHIoIml6ZSIpOyBicmVhazsgfQ0NCiAgICAgICAgICAgICAgICAg
YnJlYWs7DQ0KICAgICAgIGNhc2UgJ2wnOiBpZiAoZW5kcygiYmxpIikpIHsg
cigiYmxlIik7IGJyZWFrOyB9DQ0KICAgICAgICAgICAgICAgICBpZiAoZW5k
cygiYWxsaSIpKSB7IHIoImFsIik7IGJyZWFrOyB9DQ0KICAgICAgICAgICAg
ICAgICBpZiAoZW5kcygiZW50bGkiKSkgeyByKCJlbnQiKTsgYnJlYWs7IH0N
DQogICAgICAgICAgICAgICAgIGlmIChlbmRzKCJlbGkiKSkgeyByKCJlIik7
IGJyZWFrOyB9DQ0KICAgICAgICAgICAgICAgICBpZiAoZW5kcygib3VzbGki
KSkgeyByKCJvdXMiKTsgYnJlYWs7IH0NDQogICAgICAgICAgICAgICAgIGJy
ZWFrOw0NCiAgICAgICBjYXNlICdvJzogaWYgKGVuZHMoIml6YXRpb24iKSkg
eyByKCJpemUiKTsgYnJlYWs7IH0NDQogICAgICAgICAgICAgICAgIGlmIChl
bmRzKCJhdGlvbiIpKSB7IHIoImF0ZSIpOyBicmVhazsgfQ0NCiAgICAgICAg
ICAgICAgICAgaWYgKGVuZHMoImF0b3IiKSkgeyByKCJhdGUiKTsgYnJlYWs7
IH0NDQogICAgICAgICAgICAgICAgIGJyZWFrOw0NCiAgICAgICBjYXNlICdz
JzogaWYgKGVuZHMoImFsaXNtIikpIHsgcigiYWwiKTsgYnJlYWs7IH0NDQog
ICAgICAgICAgICAgICAgIGlmIChlbmRzKCJpdmVuZXNzIikpIHsgcigiaXZl
Iik7IGJyZWFrOyB9DQ0KICAgICAgICAgICAgICAgICBpZiAoZW5kcygiZnVs
bmVzcyIpKSB7IHIoImZ1bCIpOyBicmVhazsgfQ0NCiAgICAgICAgICAgICAg
ICAgaWYgKGVuZHMoIm91c25lc3MiKSkgeyByKCJvdXMiKTsgYnJlYWs7IH0N
DQogICAgICAgICAgICAgICAgIGJyZWFrOw0NCiAgICAgICBjYXNlICd0Jzog
aWYgKGVuZHMoImFsaXRpIikpIHsgcigiYWwiKTsgYnJlYWs7IH0NDQogICAg
ICAgICAgICAgICAgIGlmIChlbmRzKCJpdml0aSIpKSB7IHIoIml2ZSIpOyBi
cmVhazsgfQ0NCiAgICAgICAgICAgICAgICAgaWYgKGVuZHMoImJpbGl0aSIp
KSB7IHIoImJsZSIpOyBicmVhazsgfQ0NCiAgICAgICAgICAgICAgICAgYnJl
YWs7DQ0KICAgICAgIGNhc2UgJ2cnOiBpZiAoZW5kcygibG9naSIpKSB7IHIo
ImxvZyIpOyBicmVhazsgfQ0NCiAgIH0gfQ0NCg0NCiAgIC8qIHN0ZXA0KCkg
ZGVhbHMgd2l0aCAtaWMtLCAtZnVsbCwgLW5lc3MgZXRjLiBzaW1pbGFyIHN0
cmF0ZWd5IHRvIHN0ZXAzLiAqLw0NCg0NCiAgIHByaXZhdGUgZmluYWwgdm9p
ZCBzdGVwNCgpIHsgc3dpdGNoIChiLmNoYXJBdChrKSkNDQogICB7DQ0KICAg
ICAgIGNhc2UgJ2UnOiBpZiAoZW5kcygiaWNhdGUiKSkgeyByKCJpYyIpOyBi
cmVhazsgfQ0NCiAgICAgICAgICAgICAgICAgaWYgKGVuZHMoImF0aXZlIikp
IHsgcigiIik7IGJyZWFrOyB9DQ0KICAgICAgICAgICAgICAgICBpZiAoZW5k
cygiYWxpemUiKSkgeyByKCJhbCIpOyBicmVhazsgfQ0NCiAgICAgICAgICAg
ICAgICAgYnJlYWs7DQ0KICAgICAgIGNhc2UgJ2knOiBpZiAoZW5kcygiaWNp
dGkiKSkgeyByKCJpYyIpOyBicmVhazsgfQ0NCiAgICAgICAgICAgICAgICAg
YnJlYWs7DQ0KICAgICAgIGNhc2UgJ2wnOiBpZiAoZW5kcygiaWNhbCIpKSB7
IHIoImljIik7IGJyZWFrOyB9DQ0KICAgICAgICAgICAgICAgICBpZiAoZW5k
cygiZnVsIikpIHsgcigiIik7IGJyZWFrOyB9DQ0KICAgICAgICAgICAgICAg
ICBicmVhazsNDQogICAgICAgY2FzZSAncyc6IGlmIChlbmRzKCJuZXNzIikp
IHsgcigiIik7IGJyZWFrOyB9DQ0KICAgICAgICAgICAgICAgICBicmVhazsN
DQogICB9IH0NDQoNDQogICAvKiBzdGVwNSgpIHRha2VzIG9mZiAtYW50LCAt
ZW5jZSBldGMuLCBpbiBjb250ZXh0IDxjPnZjdmM8dj4uICovDQ0KDQ0KICAg
cHJpdmF0ZSBmaW5hbCB2b2lkIHN0ZXA1KCkNDQogICB7ICAgaWYgKGsgPT0g
MCkgcmV0dXJuOyAvKiBmb3IgQnVnIDEgKi8gc3dpdGNoIChiLmNoYXJBdChr
LTEpKQ0NCiAgICAgICB7ICBjYXNlICdhJzogaWYgKGVuZHMoImFsIikpIGJy
ZWFrOyByZXR1cm47DQ0KICAgICAgICAgIGNhc2UgJ2MnOiBpZiAoZW5kcygi
YW5jZSIpKSBicmVhazsNDQogICAgICAgICAgICAgICAgICAgIGlmIChlbmRz
KCJlbmNlIikpIGJyZWFrOyByZXR1cm47DQ0KICAgICAgICAgIGNhc2UgJ2Un
OiBpZiAoZW5kcygiZXIiKSkgYnJlYWs7IHJldHVybjsNDQogICAgICAgICAg
Y2FzZSAnaSc6IGlmIChlbmRzKCJpYyIpKSBicmVhazsgcmV0dXJuOw0NCiAg
ICAgICAgICBjYXNlICdsJzogaWYgKGVuZHMoImFibGUiKSkgYnJlYWs7DQ0K
ICAgICAgICAgICAgICAgICAgICBpZiAoZW5kcygiaWJsZSIpKSBicmVhazsg
cmV0dXJuOw0NCiAgICAgICAgICBjYXNlICduJzogaWYgKGVuZHMoImFudCIp
KSBicmVhazsNDQogICAgICAgICAgICAgICAgICAgIGlmIChlbmRzKCJlbWVu
dCIpKSBicmVhazsNDQogICAgICAgICAgICAgICAgICAgIGlmIChlbmRzKCJt
ZW50IikpIGJyZWFrOw0NCiAgICAgICAgICAgICAgICAgICAgLyogZWxlbWVu
dCBldGMuIG5vdCBzdHJpcHBlZCBiZWZvcmUgdGhlIG0gKi8NDQogICAgICAg
ICAgICAgICAgICAgIGlmIChlbmRzKCJlbnQiKSkgYnJlYWs7IHJldHVybjsN
DQogICAgICAgICAgY2FzZSAnbyc6IGlmIChlbmRzKCJpb24iKSAmJiBqID49
IDAgJiYgKGIuY2hhckF0KGopID09ICdzJyB8fCBiLmNoYXJBdChqKSA9PSAn
dCcpKSBicmVhazsNDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvKiBqID49IDAgZml4ZXMgQnVnIDIgKi8NDQogICAgICAgICAgICAg
ICAgICAgIGlmIChlbmRzKCJvdSIpKSBicmVhazsgcmV0dXJuOw0NCiAgICAg
ICAgICAgICAgICAgICAgLyogdGFrZXMgY2FyZSBvZiAtb3VzICovDQ0KICAg
ICAgICAgIGNhc2UgJ3MnOiBpZiAoZW5kcygiaXNtIikpIGJyZWFrOyByZXR1
cm47DQ0KICAgICAgICAgIGNhc2UgJ3QnOiBpZiAoZW5kcygiYXRlIikpIGJy
ZWFrOw0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHMoIml0aSIpKSBi
cmVhazsgcmV0dXJuOw0NCiAgICAgICAgICBjYXNlICd1JzogaWYgKGVuZHMo
Im91cyIpKSBicmVhazsgcmV0dXJuOw0NCiAgICAgICAgICBjYXNlICd2Jzog
aWYgKGVuZHMoIml2ZSIpKSBicmVhazsgcmV0dXJuOw0NCiAgICAgICAgICBj
YXNlICd6JzogaWYgKGVuZHMoIml6ZSIpKSBicmVhazsgcmV0dXJuOw0NCiAg
ICAgICAgICBkZWZhdWx0OiByZXR1cm47DQ0KICAgICAgIH0NDQogICAgICAg
aWYgKG0oKSA+IDEpIGsgPSBqOw0NCiAgIH0NDQoNDQogICAvKiBzdGVwNigp
IHJlbW92ZXMgYSBmaW5hbCAtZSBpZiBtKCkgPiAxLiAqLw0NCg0NCiAgIHBy
aXZhdGUgZmluYWwgdm9pZCBzdGVwNigpDQ0KICAgeyAgaiA9IGs7DQ0KICAg
ICAgaWYgKGIuY2hhckF0KGspID09ICdlJykNDQogICAgICB7ICBpbnQgYSA9
IG0oKTsNDQogICAgICAgICBpZiAoYSA+IDEgfHwgYSA9PSAxICYmICFjdmMo
ay0xKSkgay0tOw0NCiAgICAgIH0NDQogICAgICBpZiAoYi5jaGFyQXQoaykg
PT0gJ2wnICYmIGRvdWJsZWMoaykgJiYgbSgpID4gMSkgay0tOw0NCiAgIH0N
DQoNDQogICAvKiogU3RlbSB0aGUgd29yZCBwbGFjZWQgaW50byB0aGUgU3Rl
bW1lciBidWZmZXIgdGhyb3VnaCBjYWxscyB0byBhZGQoKS4NDQogICAgKiBS
ZXR1cm5zIHRydWUgaWYgdGhlIHN0ZW1taW5nIHByb2Nlc3MgcmVzdWx0ZWQg
aW4gYSB3b3JkIGRpZmZlcmVudA0NCiAgICAqIGZyb20gdGhlIGlucHV0LiAg
WW91IGNhbiByZXRyaWV2ZSB0aGUgcmVzdWx0IHdpdGgNDQogICAgKiBnZXRS
ZXN1bHRMZW5ndGgoKS9nZXRSZXN1bHRCdWZmZXIoKSBvciB0b1N0cmluZygp
Lg0NCiAgICAqLw0NCiAgIHB1YmxpYyB2b2lkIHN0ZW0oKQ0NCiAgIHsgIGsg
PSBpIC0gMTsNDQogICAgICBpZiAoayA+IDEpIHsgDQ0KICAgICAgCXN0ZXAx
KCk7IA0NCiAgICAgIAlzdGVwMigpOyANDQogICAgICAJc3RlcDMoKTsgDQ0K
ICAgICAgCXN0ZXA0KCk7IA0NCiAgICAgIAlzdGVwNSgpOyANDQogICAgICAJ
c3RlcDYoKTsgfQ0NCiAgICAgIGlfZW5kID0gaysxOyBpID0gMDsNDQogICB9
DQ0KDQ0KICAgLyoqIFRlc3QgcHJvZ3JhbSBmb3IgZGVtb25zdHJhdGluZyB0
aGUgUG9ydGVyU3RlbW1lci4gIEl0IHJlYWRzIHRleHQgZnJvbSBhDQ0KICAg
ICogYSBsaXN0IG9mIGZpbGVzLCBzdGVtcyBlYWNoIHdvcmQsIGFuZCB3cml0
ZXMgdGhlIHJlc3VsdCB0byBzdGFuZGFyZA0NCiAgICAqIG91dHB1dC4gTm90
ZSB0aGF0IHRoZSB3b3JkIHN0ZW1tZWQgaXMgZXhwZWN0ZWQgdG8gYmUgaW4g
bG93ZXIgY2FzZToNDQogICAgKiBmb3JjaW5nIGxvd2VyIGNhc2UgbXVzdCBi
ZSBkb25lIG91dHNpZGUgdGhlIFBvcnRlclN0ZW1tZXIgY2xhc3MuDQ0KICAg
ICogVXNhZ2U6IFBvcnRlclN0ZW1tZXIgZmlsZS1uYW1lIGZpbGUtbmFtZSAu
Li4NDQogICAgKi8NDQogICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJp
bmdbXSBhcmdzKQ0NCiAgIHsNDQogICAgICBjaGFyW10gdyA9IG5ldyBjaGFy
WzUwMV07DQ0KICAgICAgTmV3UG9ydGVyU3RlbW1lciBzID0gbmV3IE5ld1Bv
cnRlclN0ZW1tZXIoKTsNDQogICAgICAvL1N0cmluZyB0ZXN0ID0gImNvbXB1
dGVycyI7DQ0KICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInRlc3RTdHJp
bmcgaXMgIiArIHMuc3RlbSh0ZXN0KSk7ICAgICAgDQ0KICAgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKQ0NCiAgICAgIHRyeQ0N
CiAgICAgIHsNDQogICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcg
RmlsZUlucHV0U3RyZWFtKGFyZ3NbaV0pOw0NCg0NCiAgICAgICAgIHRyeQ0N
CiAgICAgICAgIHsgd2hpbGUodHJ1ZSkNDQoNDQogICAgICAgICAgIHsgIGlu
dCBjaCA9IGluLnJlYWQoKTsNDQogICAgICAgICAgICAgIGlmIChDaGFyYWN0
ZXIuaXNMZXR0ZXIoKGNoYXIpIGNoKSkNDQogICAgICAgICAgICAgIHsNDQog
ICAgICAgICAgICAgICAgIGludCBqID0gMDsNDQogICAgICAgICAgICAgICAg
IHdoaWxlKHRydWUpDQ0KICAgICAgICAgICAgICAgICB7ICBjaCA9IENoYXJh
Y3Rlci50b0xvd2VyQ2FzZSgoY2hhcikgY2gpOw0NCiAgICAgICAgICAgICAg
ICAgICAgd1tqXSA9IChjaGFyKSBjaDsNDQogICAgICAgICAgICAgICAgICAg
IGlmIChqIDwgNTAwKSBqKys7DQ0KICAgICAgICAgICAgICAgICAgICBjaCA9
IGluLnJlYWQoKTsNDQogICAgICAgICAgICAgICAgICAgIGlmICghQ2hhcmFj
dGVyLmlzTGV0dGVyKChjaGFyKSBjaCkpDQ0KICAgICAgICAgICAgICAgICAg
ICB7DQ0KICAgICAgICAgICAgICAgICAgICAgICAvKiB0byB0ZXN0IGFkZChj
aGFyIGNoKSAqLw0NCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQg
YyA9IDA7IGMgPCBqOyBjKyspICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAJIA0NCiAgICAgICAgICAgICAgICAgICAg
ICAgDQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRkKHdbY10pOyAg
DQ0KICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmlu
dGxuKHMudG9TdHJpbmcoKSk7DQ0KICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IA0NCg0NCiAgICAgICAgICAgICAgICAgICAgICAgLyogb3IsIHRvIHRlc3Qg
YWRkKGNoYXJbXSB3LCBpbnQgaikgKi8NDQogICAgICAgICAgICAgICAgICAg
ICAgICAvL3MuYWRkKHcsIGopOyANDQoNDQogICAgICAgICAgICAgICAgICAg
ICAgIHMuc3RlbSgpOw0NCiAgICAgICAgICAgICAgICAgICAgICAgDQ0KICAg
ICAgICAgICAgICAgICAgICAgICB7ICBTdHJpbmcgdTsNDQoNDQogICAgICAg
ICAgICAgICAgICAgICAgICAgIC8qIGFuZCBub3csIHRvIHRlc3QgdG9TdHJp
bmcoKSA6ICovDQ0KICAgICAgICAgICAgICAgICAgICAgICAgIA0NCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgdSA9IHMudG9TdHJpbmcoKTsgCQkJCQkJ
ICANDQogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvIHRlc3QgZ2V0
UmVzdWx0QnVmZmVyKCksIGdldFJlc3VsdExlbmd0aCgpIDogKi8NDQogICAg
ICAgICAgICAgICAgICAgICAgICAgIC8qIHUgPSBuZXcgU3RyaW5nKHMuZ2V0
UmVzdWx0QnVmZmVyKCksIDAsIHMuZ2V0UmVzdWx0TGVuZ3RoKCkpOyAqLw0N
Cg0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmlu
dCh1KTsNDQogICAgICAgICAgICAgICAgICAgICAgIH0NDQogICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOw0NCiAgICAgICAgICAgICAgICAgICAgfQ0N
CiAgICAgICAgICAgICAgICAgfQ0NCiAgICAgICAgICAgICAgfQ0NCiAgICAg
ICAgICAgICAgaWYgKGNoIDwgMCkgYnJlYWs7DQ0KICAgICAgICAgICAgICBT
eXN0ZW0ub3V0LnByaW50KChjaGFyKWNoKTsNDQogICAgICAgICAgIH0NDQog
ICAgICAgICB9DQ0KICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpDQ0K
ICAgICAgICAgeyAgU3lzdGVtLm91dC5wcmludGxuKCJlcnJvciByZWFkaW5n
ICIgKyBhcmdzW2ldKTsNDQogICAgICAgICAgICBicmVhazsNDQogICAgICAg
ICB9DQ0KICAgICAgfQ0NCiAgICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNl
cHRpb24gZSkNDQogICAgICB7ICBTeXN0ZW0ub3V0LnByaW50bG4oImZpbGUg
IiArIGFyZ3NbaV0gKyAiIG5vdCBmb3VuZCIpOw0NCiAgICAgICAgIGJyZWFr
Ow0NCiAgICAgIH0NDQogICB9DQ0KfQ0NCg0NCg0NCg0NCg==
---559023410-1804928587-1044310617=:5619--