From kfm-devel Sun Jun 10 16:14:31 2001 From: Andreas Hochsteger Date: Sun, 10 Jun 2001 16:14:31 +0000 To: kfm-devel Subject: A more flexible solution for internet keywords X-MARC-Message: https://marc.info/?l=kfm-devel&m=99218972716819 MIME-Version: 1 Content-Type: multipart/mixed; boundary="---1463811328-947861716-992189558=:16103" 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. ---1463811328-947861716-992189558=:16103 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII Content-ID: Hi! Sorry for this rather long mail, I hope you read it nevertheless ;-) I've implemented a more flexible solution for the internet keywords which solves some problems with more advanced queries and provides a more flexible usage. What was my intend to change the current scheme? ------------------------------------------------ Last week I wanted to create a simplified query for telephone numbers with konqeror's internet keywords. But I had troubles to get this working the way it should, because the url to be generated looks like this: http://my.telephone.book/query?name=MyName&city=MyCity As you can see there are there are two different substitutions necessary, which can't be done by the current substitution scheme. It only replaces \1 by the whole (encoded) string of the user query. I submitted a bug report (whishlist) therefore which can be read here: http://lists.kde.org/?l=kde-bugs-dist&m=99189305712959&w=2 Overview to my implementation: ------------------------------ Since I never really programmed anything with KDE/Qt beyond some simple "Hello World" programms, I wanted to try it myself. It's now finished and working well. I'm writing to this list, because I've got some remaining questions. Perhaps someone can take a look at it, if I've done everything allright. All changes were done in the method "formatResult". Nothing else had to be modified which speaks a lot for the great design of kde! The parameters query and url of that method have been replaced to reflect the real semantics of that parameters. I've attached a diff for the file kuriikwsfiltereng.cpp and the whole, plain method filterResult (for a quick look). The algorithm works like this: ------------------------------ The user query gets split at the spaces into a QStringList. Now every item of that list gets inserted to a map of type Map which I called IKWMap. The key is the index of the list + 1 and the value is the data of the list entry. In addition the string is scanned for a '=' and if found then an additional entry is made to the map with the part left of "=" as key and the part right of "=" as the value. Afterwards the map is iterated and every match for \ replaced by its value in the map. The charsets for the realnames query are added to the map too with the references \ikw_charset and \ikw_responsecharset. I adjusted the affected parts in the other methods wich used \0, \2 and \3 instead. Testing: -------- After applying the patch create an internet keyword 'ikw' with the following (test-)URL: http://www.ikwtest.com/1=\1&2=\2&3=\3&4=\4&5=\5&6=\6&7=\7&8=\8&9=\9&10=\10&11=\11&12=\12&name=\name&test=\test Enter the following query into konqueror: ikw:1 2 3 4 5 6 7 name=myname 9 test=mytest 11 12 This query gets replaced with the following url: http://www.ikwtest.com/1=1&2=2&3=3&4=4&5=5&6=6&7=7&8=name%3Dmyname&9=9&10=test%3Dmytest&11=11&12=12&name=myname&test=mytest \0 is a special reference and has the same meanig like \1 has now. It simply expands to the whole user query. The old internet keyword files needs to be changed therefore (replace \1 with \0) to work with the new scheme. Future work: ------------ * Allow quoted string (name="My Name") and save spaces quotes. * Let the user define some global references which can be used in query definitions without specifying them at the user query Examples: name, e-mail address, some environment variables, ... Important: Don't use sensitive information by default, which can cause some security weaks, but give the user the possibility to do so if he wants to. Implementation is rather simple: Just initialize the IKW-Map with those values. Questions: ---------- * I don't know, if I've done everything right with the encoding of the strings. Can somebody with more experience take a look at it and help me with that? * When the code works for everyone and all agree to put it into cvs: Can somebody put it into CVS for me, since I don't have an account? * What do you think about the global reference thing? For that I think the interface of that function has ---1463811328-947861716-992189558=:16103 Content-Type: TEXT/PLAIN; NAME="formatResult_method.cpp" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: ATTACHMENT; FILENAME="formatResult_method.cpp" UVN0cmluZyBLVVJJU2VhcmNoRmlsdGVyRW5naW5lOjpmb3JtYXRSZXN1bHQo IGNvbnN0IFFTdHJpbmcmIHVybCwNCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRU3RyaW5nJiBjc2V0MSwN CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjb25zdCBRU3RyaW5nJiBjc2V0MiwNCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRU3RyaW5nJiBxdWVy eSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBib29sIGlzTWFsZm9ybWVkICkgY29uc3QNCnsNCiAgICAgICAga2RE ZWJ1Zyg3MDIzKSA8PCAiKCIgPDwgZ2V0cGlkKCkgPDwgIikgcXVlcnk9JyIg PDwgcXVlcnkgPDwgIicsIHVybD0nIiA8PCB1cmwgPDwgIidcbiI7DQoNCgkv LyBSZXR1cm4gbm90aGluZyBpZiB1c2VycXVlcnkgaXMgZW1wdHk6DQoJaWYg KHF1ZXJ5LmlzRW1wdHkoKSkgcmV0dXJuIFFTdHJpbmc6Om51bGw7DQoNCgl0 eXBlZGVmIFFNYXAgPFFTdHJpbmcsIFFTdHJpbmc+IElLV01hcDsNCglJS1dN YXAgbWFwOw0KCVFTdHJpbmcgbmV3dXJsID0gdXJsOw0KCWludCBwY3Q7DQoN CgkvLyBEZWNvZGUgc3RyaW5ncyBmb3IgYmV0dGVyIGhhbmRsaW5nIChmb3Ig JyAnIGFuZCAnPScpOg0KCVFTdHJpbmcgdXNlcnF1ZXJ5ID0gS1VSTDo6ZGVj b2RlX3N0cmluZyhxdWVyeSk7DQoNCiAgICAgICAga2REZWJ1Zyg3MDIzKSA8 PCAiKCIgPDwgZ2V0cGlkKCkgPDwgIikgdXNlcnF1ZXJ5PSciIDw8IHVzZXJx dWVyeSA8PCAiJywgbmV3dXJsPSciIDw8IG5ld3VybCA8PCAiJ1xuIjsNCg0K CS8vIENyZWF0ZSBhIGNvZGVjIGZvciB0aGUgZGVzaXJlZCBlbmNvZGluZyBz byB0aGF0IHdlIGNhbiB0cmFuc2NvZGUgdGhlIHVzZXIncyAidXJsIi4NCglR U3RyaW5nIGNzZXRhID0gY3NldDE7DQoJaWYgKGNzZXRhLmlzRW1wdHkoKSkg ew0KCQljc2V0YSA9ICJpc28tODg1OS0xIjsNCgl9DQoJUVRleHRDb2RlYyAq Y3NldGFjb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFtZShjc2V0YS5s YXRpbjEoKSk7DQoJaWYgKCFjc2V0YWNvZGVjKSB7DQoJCWNzZXRhID0gImlz by04ODU5LTEiOw0KCQljc2V0YWNvZGVjID0gUVRleHRDb2RlYzo6Y29kZWNG b3JOYW1lKGNzZXRhLmxhdGluMSgpKTsNCgl9DQoNCgkvLyBBZGQgY2hhcnNl dCBpbmRpY2F0b3IgZm9yIHRoZSBxdWVyeSB0byBzdWJzdGl0dXRpb24gbWFw Og0KCW1hcC5yZXBsYWNlKCJpa3dfY2hhcnNldCIsIGNzZXRhKTsNCg0KCS8v IEFkZCBjaGFyc2V0IGluZGljYXRvciBmb3IgdGhlIGZhbGxiYWNrIHF1ZXJ5 IHRvIHN1YnN0aXR1dGlvbiBtYXA6DQoJUVN0cmluZyBjc2V0YiA9IGNzZXQy Ow0KCWlmIChjc2V0Yi5pc0VtcHR5KCkpDQoJCWNzZXRiID0gImlzby04ODU5 LTEiOw0KCW1hcC5yZXBsYWNlKCJpa3dfcmVzcG9uc2VjaGFyc2V0IiwgY3Nl dGIpOw0KDQogICAgICAgIHVzZXJxdWVyeSA9IGNzZXRhY29kZWMtPmZyb21V bmljb2RlKHVzZXJxdWVyeSk7DQoJaW50IHNwYWNlX3BvczsNCgl3aGlsZSAo KHNwYWNlX3Bvcz11c2VycXVlcnkuZmluZCgnKycpKSAhPSAtMSApDQogICAg ICAgIAl1c2VycXVlcnk9dXNlcnF1ZXJ5LnJlcGxhY2Uoc3BhY2VfcG9zLCAx LCAiJTJCIik7DQoNCgkvLyBBZGQgd2hvbGUgcXVlcnkgd2l0aCByZWZlcmVu Y2UgJ1wwJyB0byBzdWJzdGl0dXRpb24gbWFwOg0KCW1hcC5yZXBsYWNlKCIw IiwgS1VSTDo6ZW5jb2RlX3N0cmluZyh1c2VycXVlcnkpKTsNCg0KCS8vIEdl bmVyYXRlIElLVyBzdWJzdGl0dXRpb24gbWFwIGZyb20gdXNlciBxdWVyeToN CglRU3RyaW5nTGlzdCBsID0gUVN0cmluZ0xpc3Q6OnNwbGl0KCIgIiwgdXNl cnF1ZXJ5LnNpbXBsaWZ5V2hpdGVTcGFjZSgpKTsNCglmb3IgKGludCBpPTA7 IGk8bC5jb3VudCgpOyBpKyspIHsNCgkJUVN0cmluZyB2ID0gbFtpXTsNCg0K CQkvLyBJbnNlcnQgcGFydGlhbCBxdWVyaWVzIChyZWZlcmVuY2VkIGJ5IFwx IC4uLiBcbikgdG8gbWFwOg0KCQltYXAucmVwbGFjZShRU3RyaW5nOjpudW1i ZXIoaSsxKSwgS1VSTDo6ZW5jb2RlX3N0cmluZyh2KSk7DQoNCgkJLy8gSW5z ZXJ0IG5hbWVkIHZhcmlhYmxlcyAocmVmZXJlbmNlZCBieSBcbmFtZSkgdG8g bWFwOg0KCQlpZiAoKHBjdCA9IHYuZmluZCgiPSIpKSA+IDApDQoJCQltYXAu cmVwbGFjZSh2LmxlZnQocGN0KSwgS1VSTDo6ZW5jb2RlX3N0cmluZyh2LnJp Z2h0KHBjdCArIDIpKSk7DQoJfQ0KDQoJLy8gU3Vic3RpdHV0ZSByZWZlcmVu Y2VzIChccmVmbmFtZSkgZnJvbSBtYXAgd2l0aCB0aGUgdmFsdWVzIGluIHRo ZSBtYXA6DQoJZm9yIChJS1dNYXA6Okl0ZXJhdG9yIGl0ID0gbWFwLmJlZ2lu KCk7IGl0ICE9IG1hcC5lbmQoKTsgKytpdCkgew0KCQlRU3RyaW5nIHJlZiA9 ICJcXCIgKyBpdC5rZXkoKTsNCgkJa2REZWJ1ZyAoNzAyMykgIDw8ICIoIiA8 PCBnZXRwaWQoKSA8PCAiKSBrZXk9JyIgPDwgaXQua2V5KCkgPDwgIicgdmFs PSciIDw8IGl0LmRhdGEoKSA8PCAiJ1xuIjsNCgkJaWYgKChwY3QgPSBuZXd1 cmwuZmluZChyZWYpKSA+PSAwKQ0KCQkJbmV3dXJsID0gbmV3dXJsLnJlcGxh Y2UocGN0LCByZWYubGVuZ3RoKCksIGl0LmRhdGEoKSk7DQoJfQ0KDQogICAg ICAgIGtkRGVidWcoNzAyMykgPDwgIigiIDw8IGdldHBpZCgpIDw8ICIpIHVz ZXJxdWVyeT0nIiA8PCB1c2VycXVlcnkgPDwgIicsIHVybD0nIiA8PCB1cmwg PDwgIicsIG5ld3VybD0nIiA8PCBuZXd1cmwgPDwgIidcbiI7DQoNCiAgICAg ICAgcmV0dXJuIG5ld3VybDsNCn0NCg0K ---1463811328-947861716-992189558=:16103 Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; NAME="kuriikwsfiltereng.cpp.diff" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: ATTACHMENT; FILENAME="kuriikwsfiltereng.cpp.diff" LS0tIGt1cmlpa3dzZmlsdGVyZW5nLmNwcC5vcmlnCVRodSBKdW4gIDcgMjE6 NDQ6MTMgMjAwMQ0KKysrIGt1cmlpa3dzZmlsdGVyZW5nLmNwcAlTdW4gSnVu IDEwIDE2OjM3OjI3IDIwMDENCkBAIC0xMDEsMTIgKzEwMSwxMiBAQA0KICAg ICAgICAgICAgICAgICAgICAgICAgIF91cmwgPSBfdXJsLnJlcGxhY2UocXVl c3Rpb24sICIiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g Zm9ybWF0UmVzdWx0KHNlYXJjaCwgZmFsbGJhY2stPmNoYXJzZXQoKSwgUVN0 cmluZzo6bnVsbCwgX3VybCwgdHJ1ZSk7DQogICAgICAgICAgICAgICAgIH0g ZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBjdCA9IG1f Y3VyckludGVybmV0S2V5d29yZHNFbmdpbmUubV9zdHJRdWVyeVdpdGhTZWFy Y2guZmluZCgiXFx8Iik7DQorICAgICAgICAgICAgICAgICAgICAgICAgaW50 IHBjdCA9IG1fY3VyckludGVybmV0S2V5d29yZHNFbmdpbmUubV9zdHJRdWVy eVdpdGhTZWFyY2guZmluZCgiXFxpa3dfZmFsbGJhY2t1cmkiKTsNCiAgICAg ICAgICAgICAgICAgICAgICAgICBpZiAocGN0ID49IDApDQogICAgICAgICAg ICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgc2VhcmNoID0gS1VSTDo6ZW5jb2RlX3N0cmluZyggc2VhcmNoICk7 DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU3RyaW5nIHJl cyA9IG1fY3VyckludGVybmV0S2V5d29yZHNFbmdpbmUubV9zdHJRdWVyeVdp dGhTZWFyY2g7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBy ZXR1cm4gZm9ybWF0UmVzdWx0KCByZXMucmVwbGFjZShwY3QsIDIsIHNlYXJj aCksIGZhbGxiYWNrLT5jaGFyc2V0KCksIFFTdHJpbmc6Om51bGwsIF91cmws IHVybC5pc01hbGZvcm1lZCgpICk7DQorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICByZXR1cm4gZm9ybWF0UmVzdWx0KCByZXMucmVwbGFjZShw Y3QsIDE2LCBzZWFyY2gpLCBmYWxsYmFjay0+Y2hhcnNldCgpLCBRU3RyaW5n OjpudWxsLCBfdXJsLCB1cmwuaXNNYWxmb3JtZWQoKSApOw0KICAgICAgICAg ICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgfQ0KICAgICAg ICAgICAgIH0NCkBAIC0xNTksNjQgKzE1OSw3OSBAQA0KICAgICByZXR1cm4g c19wU2VsZjsNCiB9DQogDQotUVN0cmluZyBLVVJJU2VhcmNoRmlsdGVyRW5n aW5lOjpmb3JtYXRSZXN1bHQoIGNvbnN0IFFTdHJpbmcmIHF1ZXJ5LA0KK1FT dHJpbmcgS1VSSVNlYXJjaEZpbHRlckVuZ2luZTo6Zm9ybWF0UmVzdWx0KCBj b25zdCBRU3RyaW5nJiB1cmwsDQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFTdHJpbmcmIGNzZXQxLA0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjb25zdCBRU3RyaW5nJiBjc2V0MiwNCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVN0cmluZyYgdXJs LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjb25zdCBRU3RyaW5nJiBxdWVyeSwNCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc01hbGZvcm1l ZCApIGNvbnN0DQogew0KLSAgICAvLyBTdWJzdGl0dXRlIHRoZSB2YXJpYWJs ZSBwYXJ0IHdlIGZpbmQgaW4gdGhlIHF1ZXJ5Lg0KLSAgICBpZiAoIXF1ZXJ5 LmlzRW1wdHkoKSkNCi0Jew0KLQkgICAgUVN0cmluZyBuZXd1cmwgPSBxdWVy eTsNCi0JICAgIGludCBwY3Q7DQorICAgICAgICBrZERlYnVnKDcwMjMpIDw8 ICIoIiA8PCBnZXRwaWQoKSA8PCAiKSBxdWVyeT0nIiA8PCBxdWVyeSA8PCAi JywgdXJsPSciIDw8IHVybCA8PCAiJ1xuIjsNCisNCisJLy8gUmV0dXJuIG5v dGhpbmcgaWYgdXNlcnF1ZXJ5IGlzIGVtcHR5Og0KKwlpZiAocXVlcnkuaXNF bXB0eSgpKSByZXR1cm4gUVN0cmluZzo6bnVsbDsNCisNCisJdHlwZWRlZiBR TWFwIDxRU3RyaW5nLCBRU3RyaW5nPiBJS1dNYXA7DQorCUlLV01hcCBtYXA7 DQorCVFTdHJpbmcgbmV3dXJsID0gdXJsOw0KKwlpbnQgcGN0Ow0KKw0KKwkv LyBEZWNvZGUgc3RyaW5ncyBmb3IgYmV0dGVyIGhhbmRsaW5nIChmb3IgJyAn IGFuZCAnPScpOg0KKwlRU3RyaW5nIHVzZXJxdWVyeSA9IEtVUkw6OmRlY29k ZV9zdHJpbmcocXVlcnkpOw0KKw0KKyAgICAgICAga2REZWJ1Zyg3MDIzKSA8 PCAiKCIgPDwgZ2V0cGlkKCkgPDwgIikgdXNlcnF1ZXJ5PSciIDw8IHVzZXJx dWVyeSA8PCAiJywgbmV3dXJsPSciIDw8IG5ld3VybCA8PCAiJ1xuIjsNCiAN Ci0JICAgIC8vIENyZWF0ZSBhIGNvZGVjIGZvciB0aGUgZGVzaXJlZCBlbmNv ZGluZyBzbyB0aGF0IHdlIGNhbg0KLQkgICAgLy8gdHJhbnNjb2RlIHRoZSB1 c2VyJ3MgInVybCIuDQotCSAgICBRU3RyaW5nIGNzZXRhID0gY3NldDE7DQot CSAgICBpZiAoY3NldGEuaXNFbXB0eSgpKSB7DQorCS8vIENyZWF0ZSBhIGNv ZGVjIGZvciB0aGUgZGVzaXJlZCBlbmNvZGluZyBzbyB0aGF0IHdlIGNhbiB0 cmFuc2NvZGUgdGhlIHVzZXIncyAidXJsIi4NCisJUVN0cmluZyBjc2V0YSA9 IGNzZXQxOw0KKwlpZiAoY3NldGEuaXNFbXB0eSgpKSB7DQogCQljc2V0YSA9 ICJpc28tODg1OS0xIjsNCi0JICAgIH0NCi0JICAgIFFUZXh0Q29kZWMgKmNz ZXRhY29kZWMgPSBRVGV4dENvZGVjOjpjb2RlY0Zvck5hbWUoY3NldGEubGF0 aW4xKCkpOw0KLQkgICAgaWYgKCFjc2V0YWNvZGVjKSB7DQorCX0NCisJUVRl eHRDb2RlYyAqY3NldGFjb2RlYyA9IFFUZXh0Q29kZWM6OmNvZGVjRm9yTmFt ZShjc2V0YS5sYXRpbjEoKSk7DQorCWlmICghY3NldGFjb2RlYykgew0KIAkJ Y3NldGEgPSAiaXNvLTg4NTktMSI7DQogCQljc2V0YWNvZGVjID0gUVRleHRD b2RlYzo6Y29kZWNGb3JOYW1lKGNzZXRhLmxhdGluMSgpKTsNCi0JICAgIH0N Ci0NCi0JICAgIC8vIFN1YnN0aXR1dGUgdGhlIGNoYXJzZXQgaW5kaWNhdG9y IGZvciB0aGUgcXVlcnkuDQotCSAgICBpZiAoKHBjdCA9IG5ld3VybC5maW5k KCJcXDIiKSkgPj0gMCkgew0KLQkJbmV3dXJsID0gbmV3dXJsLnJlcGxhY2Uo cGN0LCAyLCBjc2V0YSk7DQotCSAgICB9DQotDQotCSAgICAvLyBTdWJzdGl0 dXRlIHRoZSBjaGFyc2V0IGluZGljYXRvciBmb3IgdGhlIGZhbGxiYWNrIHF1 ZXJ5Lg0KLQkgICAgaWYgKChwY3QgPSBuZXd1cmwuZmluZCgiXFwzIikpID49 IDApIHsNCi0JCVFTdHJpbmcgY3NldGIgPSBjc2V0MjsNCi0JCWlmIChjc2V0 Yi5pc0VtcHR5KCkpIHsNCi0JCSAgICBjc2V0YiA9ICJpc28tODg1OS0xIjsN Ci0JCX0NCi0JCW5ld3VybCA9IG5ld3VybC5yZXBsYWNlKHBjdCwgMiwgY3Nl dGIpOw0KLQkgICAgfQ0KKwl9DQogDQotICAgICAgICBRU3RyaW5nIHVzZXJx dWVyeSA9IGNzZXRhY29kZWMtPmZyb21Vbmljb2RlKHVybCk7DQotICAgICAg ICBpbnQgc3BhY2VfcG9zOw0KLSAgICAgICAgd2hpbGUoIChzcGFjZV9wb3M9 dXNlcnF1ZXJ5LmZpbmQoJysnKSkgIT0gLTEgKQ0KLSAgICAgICAgdXNlcnF1 ZXJ5PXVzZXJxdWVyeS5yZXBsYWNlKCBzcGFjZV9wb3MsIDEsICIlMkIiICk7 DQotDQotICAgICAgICB3aGlsZSggKHNwYWNlX3Bvcz11c2VycXVlcnkuZmlu ZCgnICcpKSAhPSAtMSApDQotICAgICAgICB1c2VycXVlcnk9dXNlcnF1ZXJ5 LnJlcGxhY2UoIHNwYWNlX3BvcywgMSwgIisiICk7DQorCS8vIEFkZCBjaGFy c2V0IGluZGljYXRvciBmb3IgdGhlIHF1ZXJ5IHRvIHN1YnN0aXR1dGlvbiBt YXA6DQorCW1hcC5yZXBsYWNlKCJpa3dfY2hhcnNldCIsIGNzZXRhKTsNCiAN Ci0gICAgICAgIGlmICggaXNNYWxmb3JtZWQgKQ0KLSAgICAgICAgdXNlcnF1 ZXJ5ID0gS1VSTDo6ZW5jb2RlX3N0cmluZyh1c2VycXVlcnkpOw0KKwkvLyBB ZGQgY2hhcnNldCBpbmRpY2F0b3IgZm9yIHRoZSBmYWxsYmFjayBxdWVyeSB0 byBzdWJzdGl0dXRpb24gbWFwOg0KKwlRU3RyaW5nIGNzZXRiID0gY3NldDI7 DQorCWlmIChjc2V0Yi5pc0VtcHR5KCkpDQorCQljc2V0YiA9ICJpc28tODg1 OS0xIjsNCisJbWFwLnJlcGxhY2UoImlrd19yZXNwb25zZWNoYXJzZXQiLCBj c2V0Yik7DQorDQorICAgICAgICB1c2VycXVlcnkgPSBjc2V0YWNvZGVjLT5m cm9tVW5pY29kZSh1c2VycXVlcnkpOw0KKwlpbnQgc3BhY2VfcG9zOw0KKwl3 aGlsZSAoKHNwYWNlX3Bvcz11c2VycXVlcnkuZmluZCgnKycpKSAhPSAtMSAp DQorICAgICAgICAJdXNlcnF1ZXJ5PXVzZXJxdWVyeS5yZXBsYWNlKHNwYWNl X3BvcywgMSwgIiUyQiIpOw0KKw0KKwkvLyBBZGQgd2hvbGUgcXVlcnkgd2l0 aCByZWZlcmVuY2UgJ1wwJyB0byBzdWJzdGl0dXRpb24gbWFwOg0KKwltYXAu cmVwbGFjZSgiMCIsIEtVUkw6OmVuY29kZV9zdHJpbmcodXNlcnF1ZXJ5KSk7 DQorDQorCS8vIEdlbmVyYXRlIElLVyBzdWJzdGl0dXRpb24gbWFwIGZyb20g dXNlciBxdWVyeToNCisJUVN0cmluZ0xpc3QgbCA9IFFTdHJpbmdMaXN0Ojpz cGxpdCgiICIsIHVzZXJxdWVyeS5zaW1wbGlmeVdoaXRlU3BhY2UoKSk7DQor CWZvciAoaW50IGk9MDsgaTxsLmNvdW50KCk7IGkrKykgew0KKwkJUVN0cmlu ZyB2ID0gbFtpXTsNCisNCisJCS8vIEluc2VydCBwYXJ0aWFsIHF1ZXJpZXMg KHJlZmVyZW5jZWQgYnkgXDEgLi4uIFxuKSB0byBtYXA6DQorCQltYXAucmVw bGFjZShRU3RyaW5nOjpudW1iZXIoaSsxKSwgS1VSTDo6ZW5jb2RlX3N0cmlu Zyh2KSk7DQorDQorCQkvLyBJbnNlcnQgbmFtZWQgdmFyaWFibGVzIChyZWZl cmVuY2VkIGJ5IFxuYW1lKSB0byBtYXA6DQorCQlpZiAoKHBjdCA9IHYuZmlu ZCgiPSIpKSA+IDApDQorCQkJbWFwLnJlcGxhY2Uodi5sZWZ0KHBjdCksIEtV Ukw6OmVuY29kZV9zdHJpbmcodi5yaWdodChwY3QgKyAyKSkpOw0KKwl9DQog DQotICAgICAgICBpZiAoKHBjdCA9IG5ld3VybC5maW5kKCJcXDEiKSkgPj0g MCkNCi0gICAgICAgIG5ld3VybCA9IG5ld3VybC5yZXBsYWNlKHBjdCwgMiwg dXNlcnF1ZXJ5KTsNCisJLy8gU3Vic3RpdHV0ZSByZWZlcmVuY2VzIChccmVm bmFtZSkgZnJvbSBtYXAgd2l0aCB0aGUgdmFsdWVzIGluIHRoZSBtYXA6DQor CWZvciAoSUtXTWFwOjpJdGVyYXRvciBpdCA9IG1hcC5iZWdpbigpOyBpdCAh PSBtYXAuZW5kKCk7ICsraXQpIHsNCisJCVFTdHJpbmcgcmVmID0gIlxcIiAr IGl0LmtleSgpOw0KKwkJa2REZWJ1ZyAoNzAyMykgIDw8ICIoIiA8PCBnZXRw aWQoKSA8PCAiKSBrZXk9JyIgPDwgaXQua2V5KCkgPDwgIicgdmFsPSciIDw8 IGl0LmRhdGEoKSA8PCAiJ1xuIjsNCisJCWlmICgocGN0ID0gbmV3dXJsLmZp bmQocmVmKSkgPj0gMCkNCisJCQluZXd1cmwgPSBuZXd1cmwucmVwbGFjZShw Y3QsIHJlZi5sZW5ndGgoKSwgaXQuZGF0YSgpKTsNCisJfQ0KIA0KLSAgICAg ICAgaWYgKCBtX2JWZXJib3NlICkNCi0gICAgICAgIGtkRGVidWcoNzAyMykg PDwgIigiIDw8IGdldHBpZCgpIDw8ICIpIGZpbHRlcmVkICIgPDwgdXJsIDw8 ICIgdG8gIiA8PCBuZXd1cmwgPDwgIlxuIjsNCisgICAgICAgIGtkRGVidWco NzAyMykgPDwgIigiIDw8IGdldHBpZCgpIDw8ICIpIHVzZXJxdWVyeT0nIiA8 PCB1c2VycXVlcnkgPDwgIicsIHVybD0nIiA8PCB1cmwgPDwgIicsIG5ld3Vy bD0nIiA8PCBuZXd1cmwgPDwgIidcbiI7DQogDQogICAgICAgICByZXR1cm4g bmV3dXJsOw0KLSAgICB9DQotICAgIHJldHVybiBRU3RyaW5nOjpudWxsOw0K IH0NCiANCiB2b2lkIEtVUklTZWFyY2hGaWx0ZXJFbmdpbmU6OmxvYWRDb25m aWcoKQ0KQEAgLTMyOSwxMCArMzQ0LDEwIEBADQogICAgIElLV1NFbnRyeSBy biA9IGlrd3NFbnRyeUJ5TmFtZShJS1dfUkVBTE5BTUVTKTsNCiAgICAgaWYg KHJuLm1fc3RyTmFtZS5pc0VtcHR5KCkpCXsNCiAJcm4ubV9zdHJOYW1lID0g SUtXX1JFQUxOQU1FUzsNCi0Jcm4ubV9zdHJRdWVyeSA9IFFTdHJpbmc6OmZy b21MYXRpbjEoImh0dHA6Ly9uYXZpZ2F0aW9uLnJlYWxuYW1lcy5jb20vcmVz b2x2ZXIuZGxsP3JlYWxuYW1lPVxcMSZjaGFyc2V0PVxcMiZyZXNwb25zZWNo YXJzZXQ9XFwzJnByb3ZpZGVyaWQ9MTgwIik7DQorCXJuLm1fc3RyUXVlcnkg PSBRU3RyaW5nOjpmcm9tTGF0aW4xKCJodHRwOi8vbmF2aWdhdGlvbi5yZWFs bmFtZXMuY29tL3Jlc29sdmVyLmRsbD9yZWFsbmFtZT1cXDAmY2hhcnNldD1c XGlrd19jaGFyc2V0JnJlc3BvbnNlY2hhcnNldD1cXGlrd19yZXNwb25zZWNo YXJzZXQmcHJvdmlkZXJpZD0xODAiKTsNCiAJcm4ubV9zdHJDaGFyc2V0ID0g InV0Zi04IjsNCiAJcm4ubV9zdHJRdWVyeVdpdGhTZWFyY2ggPSBRU3RyaW5n Ojpmcm9tTGF0aW4xKCJodHRwOi8vbmF2aWdhdGlvbi5yZWFsbmFtZXMuY29t L3Jlc29sdmVyLmRsbD8iDQotCQkJCQkJICAgICAgImFjdGlvbj1uYXZpZ2F0 aW9uJnJlYWxuYW1lPVxcMSZjaGFyc2V0PVxcMiZwcm92aWRlcmlkPTE4MCZm YWxsYmFja3VyaT1cXHwiKTsNCisJCQkJCQkgICAgICAiYWN0aW9uPW5hdmln YXRpb24mcmVhbG5hbWU9XFwwJmNoYXJzZXQ9XFxpa3dfY2hhcnNldCZwcm92 aWRlcmlkPTE4MCZmYWxsYmFja3VyaT1cXGlrd19mYWxsYmFja3VyaSIpOw0K IAlpZiAocm4ubV9zdHJOYW1lID09IHNlbElLV1NFbmdpbmUpDQogCSAgICBt X2N1cnJJbnRlcm5ldEtleXdvcmRzRW5naW5lID0gcm47DQogDQo= ---1463811328-947861716-992189558=:16103--