[Mono-list] xmldsig fix to consume CR in advance

Atsushi Eno atsushi@ximian.com
Wed, 30 Mar 2005 01:45:28 +0900


This is a multi-part message in MIME format.
--------------080500010704070801060209
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

Hello,

Attached is a patch that _fixes_ c14n transformation that did not
consume CR (\r) in advance. It should remove \r, while the
corresponding character entity (
) must be preserved.

This patch affects on some XML signature verification.

For SignedXml, there is no standard way to specify non XmlElement
input, so this patch will break such signature verification that
depends on CRLF existence.

This is required to distinguish \r and 
 for Stream input. On
the other hand, if you LoadInput() from XmlDocument or XmlNodeList,
we can't do anything, since there is no way to distinguish them
(MS.NET also shows difference here).

To avoid this problem, XmlDocument must be loaded with such input
source that removes CR but preserves 
 . I attached an example
TextReader implementation that eliminates \r (actually it is what I
used to consume Stream passed for XmlDsigC14NTransform.LoadInput()).

Again, this patch affects on some XML signature verification.
For example, our standalone test runner for W3C "phaos" tests
won't run anymore without the attached TextReader.

I'm 75% sure that this is the way we should fix stuff, but 25% not
sure. So I wanted to ask if you guys have better or correct idea to
handle them. If there is no further discussion, I'll check them in.

Thanks,
Atsushi Eno

--------------080500010704070801060209
Content-Type: text/plain;
 name="consumeCRinAdvance.patch"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="consumeCRinAdvance.patch"

SW5kZXg6IFRlc3QvU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YbWwvWG1sRHNpZ0Mx
NE5UcmFuc2Zvcm1UZXN0LmNzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRlc3QvU3lzdGVtLlNlY3Vy
aXR5LkNyeXB0b2dyYXBoeS5YbWwvWG1sRHNpZ0MxNE5UcmFuc2Zvcm1UZXN0LmNzCShyZXZp
c2lvbiA0MjMwOSkKKysrIFRlc3QvU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YbWwv
WG1sRHNpZ0MxNE5UcmFuc2Zvcm1UZXN0LmNzCSh3b3JraW5nIGNvcHkpCkBAIC0xMDQsMTMg
KzEwNCwxNSBAQAogCQkJcmV0dXJuIHNiLlRvU3RyaW5nICgpOwogCQl9CiAKLQkJc3RhdGlj
IHN0cmluZyB4bWwgPSAiPFRlc3QgIGF0dHJpYj0nYXQgJyB4bWxucz1cImh0dHA6Ly93d3cu
Z28tbW9uby5jb20vXCIgPiBcclxuIDxUb3RvLz4gdGV4dCAmYW1wOyA8L1Rlc3QgICA+IjsK
LQkJLy8gQkFEIChmcmFtZXdvcmsgMS4wIHJlc3VsdCkKLQkJc3RhdGljIHN0cmluZyBjMTR4
bWwxID0gIjxUZXN0IHhtbG5zPVwiaHR0cDovL3d3dy5nby1tb25vLmNvbS9cIiBhdHRyaWI9
XCJhdCBcIj4gXHJcbiA8VG90bz48L1RvdG8+IHRleHQgJmFtcDsgPC9UZXN0PiI7Ci0JCS8v
IEJBRCAoZnJhbWV3b3JrIDEuMSByZXN1bHQgZm9yIFN0cmVhbSkKLQkJc3RhdGljIHN0cmlu
ZyBjMTR4bWwyID0gIjxUZXN0IHhtbG5zPVwiaHR0cDovL3d3dy5nby1tb25vLmNvbS9cIiBh
dHRyaWI9XCJhdCBcIj4gXG4gPFRvdG8+PC9Ub3RvPiB0ZXh0ICZhbXA7IDwvVGVzdD4iOwot
CQkvLyBHT09EIChmcmFtZXdvcmsgMS4xIGZvciBYbWxEb2N1bWVudCBhbmQgTW9ubzo6KQot
CQlzdGF0aWMgc3RyaW5nIGMxNHhtbDMgPSAiPFRlc3QgeG1sbnM9XCJodHRwOi8vd3d3Lmdv
LW1vbm8uY29tL1wiIGF0dHJpYj1cImF0IFwiPiAmI3hEO1xuIDxUb3RvPjwvVG90bz4gdGV4
dCAmYW1wOyA8L1Rlc3Q+IjsKKwkJc3RhdGljIHN0cmluZyB4bWwgPSAiPFRlc3QgIGF0dHJp
Yj0nYXQgJyB4bWxucz1cImh0dHA6Ly93d3cuZ28tbW9uby5jb20vXCIgPiBcclxuICYjeEQ7
IDxUb3RvLz4gdGV4dCAmYW1wOyA8L1Rlc3QgICA+IjsKKwkJLy8gQkFEIGZvciBYbWxEb2N1
bWVudCBpbnB1dCAoZnJhbWV3b3JrIDEuMCByZXN1bHQpCisJCXN0YXRpYyBzdHJpbmcgYzE0
eG1sMSA9ICI8VGVzdCB4bWxucz1cImh0dHA6Ly93d3cuZ28tbW9uby5jb20vXCIgYXR0cmli
PVwiYXQgXCI+IFxyXG4gXHIgPFRvdG8+PC9Ub3RvPiB0ZXh0ICZhbXA7IDwvVGVzdD4iOwor
CQkvLyBHT09EIGZvciBTdHJlYW0gaW5wdXQKKwkJc3RhdGljIHN0cmluZyBjMTR4bWwyID0g
IjxUZXN0IHhtbG5zPVwiaHR0cDovL3d3dy5nby1tb25vLmNvbS9cIiBhdHRyaWI9XCJhdCBc
Ij4gXG4gJiN4RDsgPFRvdG8+PC9Ub3RvPiB0ZXh0ICZhbXA7IDwvVGVzdD4iOworCQkvLyBH
T09EIGZvciBYbWxEb2N1bWVudCBpbnB1dC4gVGhlIGRpZmZlcmVuY2UgaXMgYmVjYXVzZSBv
bmNlCisJCS8vIHhtbCBzdHJpbmcgaXMgbG9hZGVkIHRvIFhtbERvY3VtZW50LCB0aGVyZSBp
cyBubyBkaWZmZXJlbmNlCisJCS8vIGJldHdlZW4gXHIgYW5kICYjeEQ7LCBzbyBldmVyeSBc
ciBtdXN0IGJlIGhhbmRsZWQgYXMgJiN4RDsuCisJCXN0YXRpYyBzdHJpbmcgYzE0eG1sMyA9
ICI8VGVzdCB4bWxucz1cImh0dHA6Ly93d3cuZ28tbW9uby5jb20vXCIgYXR0cmliPVwiYXQg
XCI+ICYjeEQ7XG4gJiN4RDsgPFRvdG8+PC9Ub3RvPiB0ZXh0ICZhbXA7IDwvVGVzdD4iOwog
CiAJCXByaXZhdGUgWG1sRG9jdW1lbnQgR2V0RG9jICgpIAogCQl7CkBAIC0xMjcsMTEgKzEy
OSwxMSBAQAogCQkJdHJhbnNmb3JtLkxvYWRJbnB1dCAoZG9jKTsKIAkJCVN0cmVhbSBzID0g
KFN0cmVhbSkgdHJhbnNmb3JtLkdldE91dHB1dCAoKTsKIAkJCXN0cmluZyBvdXRwdXQgPSBT
dHJlYW0yU3RyaW5nIChzKTsKLSNpZiBORVRfMV8wCisjaWYgTkVUXzFfMQorCQkJQXNzZXJ0
RXF1YWxzKCJYbWxEb2N1bWVudCIsIGMxNHhtbDMsIG91dHB1dCk7CisjZWxzZQogCQkJLy8g
Lk5FVCAxLjAga2VlcHMgdGhlIFxyXG4gKDB4MEQsIDB4MEEpIC0gYnVnCiAJCQlBc3NlcnRF
cXVhbHMoIlhtbERvY3VtZW50IiwgYzE0eG1sMSwgb3V0cHV0KTsKLSNlbHNlCi0JCQlBc3Nl
cnRFcXVhbHMoIlhtbERvY3VtZW50IiwgYzE0eG1sMywgb3V0cHV0KTsKICNlbmRpZgogCQl9
CiAKQEAgLTE0NywxMyArMTQ5LDE3IEBACiAJCX0KIAogCQlbVGVzdF0KKwkJW0NhdGVnb3J5
ICgiTm90RG90TmV0IildCisJCS8vIE1TIGhhcyBhIGJ1ZyB0aGF0IHRob3NlIG5hbWVzcGFj
ZSBkZWNsYXJhdGlvbiBub2RlcyBpbgorCQkvLyB0aGUgbm9kZS1zZXQgYXJlIHdyaXR0ZW4g
dG8gb3V0cHV0LiBSZWxhdGVkIHNwZWMgc2VjdGlvbiBpczoKKwkJLy8gaHR0cDovL3d3dy53
My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUjUHJvY2Vzc2luZ01vZGVsCiAJ
CXB1YmxpYyB2b2lkIExvYWRJbnB1dEFzWG1sTm9kZUxpc3QyICgpIAogCQl7CiAJCQlYbWxE
b2N1bWVudCBkb2MgPSBHZXREb2MgKCk7CiAJCQl0cmFuc2Zvcm0uTG9hZElucHV0IChkb2Mu
U2VsZWN0Tm9kZXMgKCIvLyoiKSk7CiAJCQlTdHJlYW0gcyA9IChTdHJlYW0pIHRyYW5zZm9y
bS5HZXRPdXRwdXQgKCk7CiAJCQlzdHJpbmcgb3V0cHV0ID0gU3RyZWFtMlN0cmluZyAocyk7
Ci0JCQlzdHJpbmcgZXhwZWN0ZWQgPSBAIjxUZXN0PjxUb3RvIHhtbG5zPSIiaHR0cDovL3d3
dy5nby1tb25vLmNvbS8iIj48L1RvdG8+PC9UZXN0PiI7CisJCQlzdHJpbmcgZXhwZWN0ZWQg
PSBAIjxUZXN0PjxUb3RvPjwvVG90bz48L1Rlc3Q+IjsKIAkJCUFzc2VydEVxdWFscyAoIlht
bENoaWxkTm9kZXMiLCBleHBlY3RlZCwgb3V0cHV0KTsKIAkJfQogCkBAIC0xNjcsMTAgKzE3
Myw3IEBACiAJCQl0cmFuc2Zvcm0uTG9hZElucHV0IChtcyk7CiAJCQlTdHJlYW0gcyA9IChT
dHJlYW0pIHRyYW5zZm9ybS5HZXRPdXRwdXQgKCk7CiAJCQlzdHJpbmcgb3V0cHV0ID0gU3Ry
ZWFtMlN0cmluZyAocyk7Ci0JCQkvLyBBUkdIISBIT1cgQ0FOIE1TIFJFVFVSTiBTT01FVEhJ
TkcgRElGRkVSRU5UIElGIEEgCi0JCQkvLyBTVFJFQU0gSVMgVVNFRCBUSEFOIElGIEEgWE1M
RE9DVU1FTlQgSVMgVVNFRCA6LSgKLQkJCWJvb2wgcmVzdWx0ID0gKChvdXRwdXQgPT0gYzE0
eG1sMikgfHwgKG91dHB1dCA9PSBjMTR4bWwzKSk7Ci0JCQlBc3NlcnQgKCJNZW1vcnlTdHJl
YW0iLCByZXN1bHQpOworCQkJQXNzZXJ0RXF1YWxzICgiTWVtb3J5U3RyZWFtIiwgYzE0eG1s
Miwgb3V0cHV0KTsKIAkJfQogCiAJCVtUZXN0XQpJbmRleDogVGVzdC9TeXN0ZW0uU2VjdXJp
dHkuQ3J5cHRvZ3JhcGh5LlhtbC9YbWxEc2lnWFBhdGhUcmFuc2Zvcm1UZXN0LmNzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFRlc3QvU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YbWwvWG1s
RHNpZ1hQYXRoVHJhbnNmb3JtVGVzdC5jcwkocmV2aXNpb24gNDIzMDkpCisrKyBUZXN0L1N5
c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWG1sL1htbERzaWdYUGF0aFRyYW5zZm9ybVRl
c3QuY3MJKHdvcmtpbmcgY29weSkKQEAgLTEyNiw5ICsxMjYsOSBAQAogCQlwdWJsaWMgdm9p
ZCBMb2FkSW5wdXRBc1htbERvY3VtZW50ICgpIAogCQl7CiAJCQlYbWxEb2N1bWVudCBkb2Mg
PSBHZXREb2MgKCk7Ci0JCQl0cmFuc2Zvcm0uTG9hZElucHV0IChkb2MpOwogCQkJWG1sTm9k
ZUxpc3QgaW5uZXIgPSBJbm5lclhtbCAoIi8vKi90aXRsZSIpOwogCQkJdHJhbnNmb3JtLkxv
YWRJbm5lclhtbCAoaW5uZXIpOworCQkJdHJhbnNmb3JtLkxvYWRJbnB1dCAoZG9jKTsKIAkJ
CVhtbE5vZGVMaXN0IHhubCA9IChYbWxOb2RlTGlzdCkgdHJhbnNmb3JtLkdldE91dHB1dCAo
KTsKIAkJCUFzc2VydEVxdWFscyAoNDcsIHhubC5Db3VudCk7CiAJCX0KSW5kZXg6IFRlc3Qv
c3RhbmRhbG9uZV90ZXN0cy94bWxkc2lnLmNzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRlc3Qvc3Rh
bmRhbG9uZV90ZXN0cy94bWxkc2lnLmNzCShyZXZpc2lvbiA0MjMwOSkKKysrIFRlc3Qvc3Rh
bmRhbG9uZV90ZXN0cy94bWxkc2lnLmNzCSh3b3JraW5nIGNvcHkpCkBAIC0xMiw2ICsxMiw3
IEBACiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CiB1c2luZyBTeXN0ZW0uSU87CiB1c2lu
ZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2
aWNlczsKIHVzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHk7CiB1c2luZyBTeXN0
ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7CiB1c2luZyBTeXN0
ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5LlhtbDsKQEAgLTMwLDggKzMxLDEzIEBACiAJc3Rh
dGljIGJvb2wgZXhjMTRuOwogCXN0YXRpYyBib29sIGhtYWNtZDU7CiAKLQlwdWJsaWMgc3Rh
dGljIHZvaWQgTWFpbigpIAorCXN0YXRpYyBib29sIHVzZURlY2VudFJlYWRlcjsKKworCXB1
YmxpYyBzdGF0aWMgdm9pZCBNYWluKHN0cmluZyBbXSBhcmdzKSAKIAl7CisJCWZvcmVhY2gg
KHN0cmluZyBhcmcgaW4gYXJncykKKwkJCWlmIChhcmcgPT0gIi0tZGVjZW50LXJlYWRlciIp
CisJCQkJdXNlRGVjZW50UmVhZGVyID0gdHJ1ZTsKIAkJdHJ5IHsKIAkJCS8vIGF1dG9tYWdp
Y2FsbHkgYWp1c3QgdGVzdHMgdG8gcnVuIGRlcGVuZGluZyBvbiBzeXN0ZW0gY29uZmlnCiAJ
CQlleGMxNG4gPSAoQ3J5cHRvQ29uZmlnLkNyZWF0ZUZyb21OYW1lICgiaHR0cDovL3d3dy53
My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jV2l0aENvbW1lbnRzIikgIT0gbnVsbCk7CkBA
IC04MCwxMyArODYsMjcgQEAKIAkJcmV0dXJuIHBhdGg7CiAJfQogCisJc3RhdGljIFRleHRS
ZWFkZXIgR2V0UmVhZGVyIChzdHJpbmcgZmlsZW5hbWUpCisJeworCQlYbWxSZXNvbHZlciBy
ZXNvbHZlciA9IG5ldyBYbWxVcmxSZXNvbHZlciAoKTsKKwkJU3RyZWFtIHN0cmVhbSA9IHJl
c29sdmVyLkdldEVudGl0eSAocmVzb2x2ZXIuUmVzb2x2ZVVyaSAobnVsbCwgZmlsZW5hbWUp
LCBudWxsLCB0eXBlb2YgKFN0cmVhbSkpIGFzIFN0cmVhbTsKKwkJaWYgKHVzZURlY2VudFJl
YWRlcikKKwkJCXJldHVybiBuZXcgWG1sU2lnbmF0dXJlU3RyZWFtUmVhZGVyICgKKwkJCQlu
ZXcgU3RyZWFtUmVhZGVyIChzdHJlYW0pKTsKKwkJZWxzZQorCQkJcmV0dXJuIG5ldyBTdHJl
YW1SZWFkZXIgKHN0cmVhbSk7CisJfQorCiAJc3RhdGljIHZvaWQgU3ltbWV0cmljIChzdHJp
bmcgZmlsZW5hbWUsIGJ5dGVbXSBrZXkpIAogCXsKIAkJc3RyaW5nIHNob3J0TmFtZSA9IFBh
dGguR2V0RmlsZU5hbWUgKGZpbGVuYW1lKTsKIAogCQlYbWxEb2N1bWVudCBkb2MgPSBuZXcg
WG1sRG9jdW1lbnQgKCk7CiAJCWRvYy5QcmVzZXJ2ZVdoaXRlc3BhY2UgPSB0cnVlOwotCQlk
b2MuTG9hZCAoZmlsZW5hbWUpOworCQlYbWxUZXh0UmVhZGVyIHh0ciA9IG5ldyBYbWxUZXh0
UmVhZGVyIChHZXRSZWFkZXIgKGZpbGVuYW1lKSk7CisJCVhtbFZhbGlkYXRpbmdSZWFkZXIg
eHZyID0gbmV3IFhtbFZhbGlkYXRpbmdSZWFkZXIgKHh0cik7CisJCXh0ci5Ob3JtYWxpemF0
aW9uID0gdHJ1ZTsKKwkJZG9jLkxvYWQgKHh2cik7CiAgICAgICAgICAgICAgICAgCiAJCXRy
eSB7CiAJCQlYbWxOb2RlTGlzdCBub2RlTGlzdCA9IGRvYy5HZXRFbGVtZW50c0J5VGFnTmFt
ZSAoIlNpZ25hdHVyZSIsIFNpZ25lZFhtbC5YbWxEc2lnTmFtZXNwYWNlVXJsKTsKQEAgLTEx
Niw4ICsxMzYsMTEgQEAKIAkJc3RyaW5nIHNob3J0TmFtZSA9IFBhdGguR2V0RmlsZU5hbWUg
KGZpbGVuYW1lKTsKIAogCQlYbWxEb2N1bWVudCBkb2MgPSBuZXcgWG1sRG9jdW1lbnQgKCk7
CisJCVhtbFRleHRSZWFkZXIgeHRyID0gbmV3IFhtbFRleHRSZWFkZXIgKEdldFJlYWRlciAo
ZmlsZW5hbWUpKTsKKwkJWG1sVmFsaWRhdGluZ1JlYWRlciB4dnIgPSBuZXcgWG1sVmFsaWRh
dGluZ1JlYWRlciAoeHRyKTsKKwkJeHRyLk5vcm1hbGl6YXRpb24gPSB0cnVlOwogCQlkb2Mu
UHJlc2VydmVXaGl0ZXNwYWNlID0gdHJ1ZTsKLQkJZG9jLkxvYWQgKGZpbGVuYW1lKTsKKwkJ
ZG9jLkxvYWQgKHh2cik7CiAKIAkJdHJ5IHsKIAkJCVNpZ25lZFhtbCBzID0gbnVsbDsKQEAg
LTMzMiwzICszNTUsODkgQEAKIAl9CiB9CiAKKy8vIGJlbG93IGlzIGEgY29weSBmcm9tIG91
ciBTeXN0ZW0uU2VjdXJpdHkuZGxsIHNvdXJjZS4KKwlpbnRlcm5hbCBjbGFzcyBYbWxTaWdu
YXR1cmVTdHJlYW1SZWFkZXIgOiBUZXh0UmVhZGVyCisJeworCQlUZXh0UmVhZGVyIHNvdXJj
ZTsKKwkJaW50IGNhY2hlID0gaW50Lk1pblZhbHVlOworCisJCXB1YmxpYyBYbWxTaWduYXR1
cmVTdHJlYW1SZWFkZXIgKFRleHRSZWFkZXIgaW5wdXQpCisJCXsKKwkJCXNvdXJjZSA9aW5w
dXQ7CisJCX0KKworCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSAoKQorCQl7CisJCQlz
b3VyY2UuQ2xvc2UgKCk7CisJCX0KKworCQlwdWJsaWMgb3ZlcnJpZGUgaW50IFBlZWsgKCkK
KwkJeworCQkJaWYgKGNhY2hlICE9IGludC5NaW5WYWx1ZSkKKwkJCQlyZXR1cm4gY2FjaGU7
CisJCQljYWNoZSA9IHNvdXJjZS5SZWFkICgpOworCQkJaWYgKGNhY2hlICE9ICdccicpCisJ
CQkJcmV0dXJuIGNhY2hlOworCQkJLy8gY2FjaGUgbXVzdCBiZSAnXHInIGhlcmUuCisJCQlp
ZiAoc291cmNlLlBlZWsgKCkgIT0gJ1xuJykKKwkJCQlyZXR1cm4gJ1xyJzsKKwkJCS8vIE5v
dyBQZWVrKCkgcmV0dXJucyAnXG4nLCBzbyBjbGVhciBjYWNoZS4KKwkJCWNhY2hlID0gaW50
Lk1pblZhbHVlOworCQkJcmV0dXJuICdcbic7CisJCX0KKworCQlwdWJsaWMgb3ZlcnJpZGUg
aW50IFJlYWQgKCkKKwkJeworCQkJaWYgKGNhY2hlICE9IGludC5NaW5WYWx1ZSkgeworCQkJ
CWludCByZXQgPSBjYWNoZTsKKwkJCQljYWNoZSA9IGludC5NaW5WYWx1ZTsKKwkJCQlyZXR1
cm4gcmV0OworCQkJfQorCQkJaW50IGkgPSBzb3VyY2UuUmVhZCAoKTsKKwkJCWlmIChpICE9
ICdccicpCisJCQkJcmV0dXJuIGk7CisJCQkvLyByZWFkIG9uZSBtb3JlIGNoYXIgKGFmdGVy
ICdccicpCisJCQljYWNoZSA9IHNvdXJjZS5SZWFkICgpOworCQkJaWYgKGNhY2hlICE9ICdc
bicpCisJCQkJcmV0dXJuICdccic7CisJCQljYWNoZSA9IGludC5NaW5WYWx1ZTsKKwkJCXJl
dHVybiAnXG4nOworCQl9CisKKwkJcHVibGljIG92ZXJyaWRlIGludCBSZWFkQmxvY2sgKAor
CQkJW0luLCBPdXRdIGNoYXIgW10gYnVmZmVyLCBpbnQgaW5kZXgsIGludCBjb3VudCkKKwkJ
eworCQkJY2hhciBbXSB0bXAgPSBuZXcgY2hhciBbY291bnRdOworCQkJc291cmNlLlJlYWRC
bG9jayAodG1wLCAwLCBjb3VudCk7CisJCQlpbnQgaiA9IGluZGV4OworCQkJZm9yIChpbnQg
aSA9IDA7IGkgPCBjb3VudDsgaisrKSB7CisJCQkJaWYgKHRtcCBbaV0gPT0gJ1xyJykgewor
CQkJCQlpZiAoKytpIDwgdG1wLkxlbmd0aCAmJiB0bXAgW2ldID09ICdcbicpCisJCQkJCQli
dWZmZXIgW2pdID0gdG1wIFtpKytdOworCQkJCQllbHNlCisJCQkJCQlidWZmZXIgW2pdID0g
J1xyJzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlidWZmZXIgW2pdID0gdG1wIFtpXTsKKwkJ
CX0KKwkJCXdoaWxlIChqIDwgY291bnQpIHsKKwkJCQlpbnQgZCA9IFJlYWQgKCk7CisJCQkJ
aWYgKGQgPCAwKQorCQkJCQlicmVhazsKKwkJCQlidWZmZXIgW2orK10gPSAoY2hhcikgZDsK
KwkJCX0KKwkJCXJldHVybiBqOworCQl9CisKKwkJcHVibGljIG92ZXJyaWRlIHN0cmluZyBS
ZWFkTGluZSAoKQorCQl7CisJCQlyZXR1cm4gc291cmNlLlJlYWRMaW5lICgpLlJlcGxhY2Ug
KCJcclxuIiwgIlxuIik7CisJCX0KKworCQlwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFJlYWRU
b0VuZCAoKQorCQl7CisJCQlyZXR1cm4gc291cmNlLlJlYWRUb0VuZCAoKS5SZXBsYWNlICgi
XHJcbiIsICJcbiIpOworCQl9CisKKwl9CisKSW5kZXg6IFRlc3Qvc3RhbmRhbG9uZV90ZXN0
cy9NYWtlZmlsZQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUZXN0L3N0YW5kYWxvbmVfdGVzdHMvTWFr
ZWZpbGUJKHJldmlzaW9uIDQyMzA5KQorKysgVGVzdC9zdGFuZGFsb25lX3Rlc3RzL01ha2Vm
aWxlCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsOCBAQAogUlVOVElNRSA9IG1vbm8gLS1k
ZWJ1ZyAKIENTQ09NUElMRSA9IG1jcyAtLWRlYnVnCitQUk9GSUxFID0gZGVmYXVsdAorI1hN
TERTSUdfRVhFX09QVElPTlMgPQorWE1MRFNJR19FWEVfT1BUSU9OUyA9IC0tZGVjZW50LXJl
YWRlcgogCiBydW4tdGVzdDogYzE0bi5leGUgeG1sZHNpZy5leGUgbWVybGluLXhtbGRzaWct
dHdlbnR5LXRocmVlCiAJJChSVU5USU1FKSBjMTRuLmV4ZSBtZXJsaW4teG1sZHNpZy10d2Vu
dHktdGhyZWUvc2lnbmF0dXJlLWVudmVsb3BlZC1kc2EueG1sIFNpZ25lZEluZm8gfCBjbXAg
bWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1lbnZlbG9wZWQtZHNhLWMx
NG4tMS50eHQKQEAgLTEwLDEwICsxMywxMCBAQAogCSQoUlVOVElNRSkgYzE0bi5leGUgbWVy
bGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1lbnZlbG9waW5nLXJzYS54bWwg
U2lnbmVkSW5mbyB8IGNtcCBtZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJl
LWVudmVsb3BpbmctcnNhLWMxNG4tMS50eHQKIAkkKFJVTlRJTUUpIGMxNG4uZXhlIG1lcmxp
bi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUtZXh0ZXJuYWwtYjY0LWRzYS54bWwg
U2lnbmVkSW5mbyB8IGNtcCBtZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJl
LWV4dGVybmFsLWI2NC1kc2EtYzE0bi0wLnR4dAogCSQoUlVOVElNRSkgYzE0bi5leGUgbWVy
bGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1leHRlcm5hbC1kc2EueG1sIFNp
Z25lZEluZm8gfCBjbXAgbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1l
eHRlcm5hbC1kc2EtYzE0bi0wLnR4dAotCSQoUlVOVElNRSkgeG1sZHNpZy5leGUKKwkkKFJV
TlRJTUUpIHhtbGRzaWcuZXhlICQoWE1MRFNJR19FWEVfT1BUSU9OUykKIAogbXMtdGVzdDog
YzE0bi5leGUgeG1sZHNpZy5leGUgbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlCi0JY3Ag
Li4vLi4vLi4vbGliL01vbm8uU2VjdXJpdHkuZGxsIC4KKwljcCAuLi8uLi8uLi9saWIvJChQ
Uk9GSUxFKS9Nb25vLlNlY3VyaXR5LmRsbCAuCiAJLi9jMTRuLmV4ZSBtZXJsaW4teG1sZHNp
Zy10d2VudHktdGhyZWUvc2lnbmF0dXJlLWVudmVsb3BlZC1kc2EueG1sIFNpZ25lZEluZm8g
fCBjbXAgbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1lbnZlbG9wZWQt
ZHNhLWMxNG4tMS50eHQKIAkuL2MxNG4uZXhlIG1lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJl
ZS9zaWduYXR1cmUtZW52ZWxvcGluZy1iNjQtZHNhLnhtbCBTaWduZWRJbmZvIHwgY21wIG1l
cmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUtZW52ZWxvcGluZy1iNjQtZHNh
LWMxNG4tMC50eHQKIAkuL2MxNG4uZXhlIG1lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9z
aWduYXR1cmUtZW52ZWxvcGluZy1kc2EueG1sIFNpZ25lZEluZm8gfCBjbXAgbWVybGluLXht
bGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1lbnZlbG9waW5nLWRzYS1jMTRuLTEudHh0
CkBAIC0yMiw3ICsyNSw3IEBACiAJLi9jMTRuLmV4ZSBtZXJsaW4teG1sZHNpZy10d2VudHkt
dGhyZWUvc2lnbmF0dXJlLWVudmVsb3BpbmctcnNhLnhtbCBTaWduZWRJbmZvIHwgY21wIG1l
cmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUtZW52ZWxvcGluZy1yc2EtYzE0
bi0xLnR4dAogCS4vYzE0bi5leGUgbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25h
dHVyZS1leHRlcm5hbC1iNjQtZHNhLnhtbCBTaWduZWRJbmZvIHwgY21wIG1lcmxpbi14bWxk
c2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUtZXh0ZXJuYWwtYjY0LWRzYS1jMTRuLTAudHh0
CiAJLi9jMTRuLmV4ZSBtZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLWV4
dGVybmFsLWRzYS54bWwgU2lnbmVkSW5mbyB8IGNtcCBtZXJsaW4teG1sZHNpZy10d2VudHkt
dGhyZWUvc2lnbmF0dXJlLWV4dGVybmFsLWRzYS1jMTRuLTAudHh0Ci0JLi94bWxkc2lnLmV4
ZQorCS4veG1sZHNpZy5leGUgJChYTUxEU0lHX0VYRV9PUFRJT05TKQogCXJtIE1vbm8uU2Vj
dXJpdHkuZGxsCiAKIGNsZWFuOgpAQCAtMzIsNyArMzUsNyBAQAogCSQoQ1NDT01QSUxFKSBj
MTRuLmNzIC1yOlN5c3RlbS5TZWN1cml0eQogCiB4bWxkc2lnLmV4ZTogeG1sZHNpZy5jcwot
CSQoQ1NDT01QSUxFKSB4bWxkc2lnLmNzIC1yOlN5c3RlbS5TZWN1cml0eSAtcjouLi8uLi8u
Li9saWIvTW9uby5TZWN1cml0eS5kbGwKKwkkKENTQ09NUElMRSkgeG1sZHNpZy5jcyAtcjpT
eXN0ZW0uU2VjdXJpdHkgLXI6TW9uby5TZWN1cml0eS5kbGwKIAogcGhhb3MteG1sZHNpZy10
aHJlZTogcGhhb3MteG1sZHNpZy10aHJlZS56aXAKIAl1bnppcCAtdSBwaGFvcy14bWxkc2ln
LXRocmVlLnppcApJbmRleDogU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YbWwvWG1s
RHNpZ1hzbHRUcmFuc2Zvcm0uY3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU3lzdGVtLlNlY3VyaXR5
LkNyeXB0b2dyYXBoeS5YbWwvWG1sRHNpZ1hzbHRUcmFuc2Zvcm0uY3MJKHJldmlzaW9uIDQy
MzA5KQorKysgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YbWwvWG1sRHNpZ1hzbHRU
cmFuc2Zvcm0uY3MJKHdvcmtpbmcgY29weSkKQEAgLTE0NCw3ICsxNDQsOSBAQAogI2lmIE5F
VF8xXzEKIAkJCQlpbnB1dERvYy5YbWxSZXNvbHZlciA9IEdldFJlc29sdmVyICgpOwogI2Vu
ZGlmCi0JCQkJaW5wdXREb2MuTG9hZCAob2JqIGFzIFN0cmVhbSk7CisvLwkJCQlpbnB1dERv
Yy5Mb2FkIChvYmogYXMgU3RyZWFtKTsKKwkJCQlpbnB1dERvYy5Mb2FkIChuZXcgWG1sU2ln
bmF0dXJlU3RyZWFtUmVhZGVyICgKKwkJCQkJbmV3IFN0cmVhbVJlYWRlciAob2JqIGFzIFN0
cmVhbSkpKTsKIAkJCX0KIAkJCWVsc2UgaWYgKG9iaiBpcyBYbWxEb2N1bWVudCkgewogCQkJ
CWlucHV0RG9jPSBvYmogYXMgWG1sRG9jdW1lbnQ7CkluZGV4OiBTeXN0ZW0uU2VjdXJpdHku
Q3J5cHRvZ3JhcGh5LlhtbC9YbWxTaWduYXR1cmVTdHJlYW1SZWFkZXIuY3MKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YbWwvWG1sU2lnbmF0dXJl
U3RyZWFtUmVhZGVyLmNzCShyZXZpc2lvbiAwKQorKysgU3lzdGVtLlNlY3VyaXR5LkNyeXB0
b2dyYXBoeS5YbWwvWG1sU2lnbmF0dXJlU3RyZWFtUmVhZGVyLmNzCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDEzMSBAQAorLy8KKy8vIFhtbFNpZ25hdHVyZVN0cmVhbVJlYWRlci5jczog
V3JhcCBUZXh0UmVhZGVyIGFuZCBlbGltaW5hdGUgXHIKKy8vCisvLyBBdXRob3I6CisvLwlB
dHN1c2hpIEVub21vdG8gKGF0c3VzaGlAeGltaWFuLmNvbSkKKy8vCisvLyAoQykgMjAwNSBO
b3ZlbGwgSW5jLgorLy8KKworLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQs
IGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworLy8gYSBjb3B5IG9m
IHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhl
CisvLyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0
cmljdGlvbiwgaW5jbHVkaW5nCisvLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0
byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisvLyBkaXN0cmlidXRlLCBz
dWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8K
Ky8vIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0
byBkbyBzbywgc3ViamVjdCB0bworLy8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorLy8g
CisvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5v
dGljZSBzaGFsbCBiZQorLy8gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlh
bCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisvLyAKKy8vIFRIRSBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorLy8gRVhQ
UkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJS
QU5USUVTIE9GCisvLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFORAorLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorLy8gTElBQkxFIEZPUiBBTlkg
Q0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElP
TgorLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9V
VCBPRiBPUiBJTiBDT05ORUNUSU9OCisvLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNF
IE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKy8vCisvLworLy8gVXNlIGl0
IHRvIGRpc3Rpbmd1aXNoICYjeEQ7IGFuZCBcci4gXHIgaXMgcmVtb3ZlZCwgd2hpbGUgJiN4
RDsgaXMgbm90LgorLy8KKy8vCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsK
K3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworbmFtZXNwYWNlIFN5
c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWG1sCit7CisJaW50ZXJuYWwgY2xhc3MgWG1s
U2lnbmF0dXJlU3RyZWFtUmVhZGVyIDogVGV4dFJlYWRlcgorCXsKKwkJVGV4dFJlYWRlciBz
b3VyY2U7CisJCWludCBjYWNoZSA9IGludC5NaW5WYWx1ZTsKKworCQlwdWJsaWMgWG1sU2ln
bmF0dXJlU3RyZWFtUmVhZGVyIChUZXh0UmVhZGVyIGlucHV0KQorCQl7CisJCQlzb3VyY2Ug
PWlucHV0OworCQl9CisKKwkJcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UgKCkKKwkJewor
CQkJc291cmNlLkNsb3NlICgpOworCQl9CisKKwkJcHVibGljIG92ZXJyaWRlIGludCBQZWVr
ICgpCisJCXsKKwkJCS8vIElmIHNvdXJjZSBUZXh0UmVhZGVyIGRvZXMgbm90IHN1cHBvcnQg
UGVlaygpLAorCQkJLy8gaXQgZG9lcyBub3Qgc3VwcG9ydCB0b28uIE9yIGl0IGp1c3QgcmV0
dXJucyBFT0YuCisJCQlpZiAoc291cmNlLlBlZWsgKCkgPT0gLTEpCisJCQkJcmV0dXJuIC0x
OworCisJCQlpZiAoY2FjaGUgIT0gaW50Lk1pblZhbHVlKQorCQkJCXJldHVybiBjYWNoZTsK
KwkJCWNhY2hlID0gc291cmNlLlJlYWQgKCk7CisJCQlpZiAoY2FjaGUgIT0gJ1xyJykKKwkJ
CQlyZXR1cm4gY2FjaGU7CisJCQkvLyBjYWNoZSBtdXN0IGJlICdccicgaGVyZS4KKwkJCWlm
IChzb3VyY2UuUGVlayAoKSAhPSAnXG4nKQorCQkJCXJldHVybiAnXHInOworCQkJLy8gTm93
IFBlZWsoKSByZXR1cm5zICdcbicsIHNvIGNsZWFyIGNhY2hlLgorCQkJY2FjaGUgPSBpbnQu
TWluVmFsdWU7CisJCQlyZXR1cm4gJ1xuJzsKKwkJfQorCisJCXB1YmxpYyBvdmVycmlkZSBp
bnQgUmVhZCAoKQorCQl7CisJCQlpZiAoY2FjaGUgIT0gaW50Lk1pblZhbHVlKSB7CisJCQkJ
aW50IHJldCA9IGNhY2hlOworCQkJCWNhY2hlID0gaW50Lk1pblZhbHVlOworCQkJCXJldHVy
biByZXQ7CisJCQl9CisJCQlpbnQgaSA9IHNvdXJjZS5SZWFkICgpOworCQkJaWYgKGkgIT0g
J1xyJykKKwkJCQlyZXR1cm4gaTsKKwkJCS8vIHJlYWQgb25lIG1vcmUgY2hhciAoYWZ0ZXIg
J1xyJykKKwkJCWNhY2hlID0gc291cmNlLlJlYWQgKCk7CisJCQlpZiAoY2FjaGUgIT0gJ1xu
JykKKwkJCQlyZXR1cm4gJ1xyJzsKKwkJCWNhY2hlID0gaW50Lk1pblZhbHVlOworCQkJcmV0
dXJuICdcbic7CisJCX0KKworCQlwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWRCbG9jayAoCisJ
CQlbSW4sIE91dF0gY2hhciBbXSBidWZmZXIsIGludCBpbmRleCwgaW50IGNvdW50KQorCQl7
CisJCQljaGFyIFtdIHRtcCA9IG5ldyBjaGFyIFtjb3VudF07CisJCQlzb3VyY2UuUmVhZEJs
b2NrICh0bXAsIDAsIGNvdW50KTsKKwkJCWludCBqID0gaW5kZXg7CisJCQlmb3IgKGludCBp
ID0gMDsgaSA8IGNvdW50OyBqKyspIHsKKwkJCQlpZiAodG1wIFtpXSA9PSAnXHInKSB7CisJ
CQkJCWlmICgrK2kgPCB0bXAuTGVuZ3RoICYmIHRtcCBbaV0gPT0gJ1xuJykKKwkJCQkJCWJ1
ZmZlciBbal0gPSB0bXAgW2krK107CisJCQkJCWVsc2UKKwkJCQkJCWJ1ZmZlciBbal0gPSAn
XHInOworCQkJCX0KKwkJCQllbHNlCisJCQkJCWJ1ZmZlciBbal0gPSB0bXAgW2ldOworCQkJ
fQorCQkJd2hpbGUgKGogPCBjb3VudCkgeworCQkJCWludCBkID0gUmVhZCAoKTsKKwkJCQlp
ZiAoZCA8IDApCisJCQkJCWJyZWFrOworCQkJCWJ1ZmZlciBbaisrXSA9IChjaGFyKSBkOwor
CQkJfQorCQkJcmV0dXJuIGo7CisJCX0KKworCQkvLyBJIGhhdmUgbm8gaWRlYSB3aGF0IHRv
IGRvIGhlcmUsIGJ1dCBJIGRvbid0IHRoaW5rIGl0IAorCQkvLyBtYWtlcyBzZW5zZS4KKwkJ
cHVibGljIG92ZXJyaWRlIHN0cmluZyBSZWFkTGluZSAoKQorCQl7CisJCQlyZXR1cm4gc291
cmNlLlJlYWRMaW5lICgpOworCQl9CisKKwkJcHVibGljIG92ZXJyaWRlIHN0cmluZyBSZWFk
VG9FbmQgKCkKKwkJeworCQkJcmV0dXJuIHNvdXJjZS5SZWFkVG9FbmQgKCkuUmVwbGFjZSAo
IlxyXG4iLCAiXG4iKTsKKwkJfQorCX0KK30KSW5kZXg6IFN5c3RlbS5TZWN1cml0eS5Dcnlw
dG9ncmFwaHkuWG1sL1htbERzaWdFbnZlbG9wZWRTaWduYXR1cmVUcmFuc2Zvcm0uY3MKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YbWwvWG1sRHNp
Z0VudmVsb3BlZFNpZ25hdHVyZVRyYW5zZm9ybS5jcwkocmV2aXNpb24gNDIzMDkpCisrKyBT
eXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5LlhtbC9YbWxEc2lnRW52ZWxvcGVkU2lnbmF0
dXJlVHJhbnNmb3JtLmNzCSh3b3JraW5nIGNvcHkpCkBAIC0xMDQsNyArMTA0LDggQEAKICNp
ZiBORVRfMV8xCiAJCQkJZG9jLlhtbFJlc29sdmVyID0gR2V0UmVzb2x2ZXIgKCk7CiAjZW5k
aWYKLQkJCQlkb2MuTG9hZCAoaW5wdXRPYmogYXMgU3RyZWFtKTsKKwkJCQlkb2MuTG9hZCAo
bmV3IFhtbFNpZ25hdHVyZVN0cmVhbVJlYWRlciAoCisJCQkJCW5ldyBTdHJlYW1SZWFkZXIg
KGlucHV0T2JqIGFzIFN0cmVhbSkpKTsKIAkJCQlyZXR1cm4gR2V0T3V0cHV0RnJvbU5vZGUg
KGRvYywgR2V0TmFtZXNwYWNlTWFuYWdlciAoZG9jKSwgdHJ1ZSk7CiAJCQl9CiAJCQllbHNl
IGlmIChpbnB1dE9iaiBpcyBYbWxEb2N1bWVudCkgewpJbmRleDogU3lzdGVtLlNlY3VyaXR5
LkNyeXB0b2dyYXBoeS5YbWwvWG1sRHNpZ0MxNE5UcmFuc2Zvcm0uY3MKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YbWwvWG1sRHNpZ0MxNE5UcmFu
c2Zvcm0uY3MJKHJldmlzaW9uIDQyMzA5KQorKysgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dy
YXBoeS5YbWwvWG1sRHNpZ0MxNE5UcmFuc2Zvcm0uY3MJKHdvcmtpbmcgY29weSkKQEAgLTEy
NCw3ICsxMjQsMTIgQEAKIAkJCQlzID0gKG9iaiBhcyBTdHJlYW0pOwogCQkJCVhtbERvY3Vt
ZW50IGRvYyA9IG5ldyBYbWxEb2N1bWVudCAoKTsKIAkJCQlkb2MuUHJlc2VydmVXaGl0ZXNw
YWNlID0gdHJ1ZTsJLy8gUkVBTExZIElNUE9SVEFOVAotCQkJCWRvYy5Mb2FkIChvYmogYXMg
U3RyZWFtKTsKKyNpZiBORVRfMV8xCisJCQkJZG9jLlhtbFJlc29sdmVyID0gR2V0UmVzb2x2
ZXIgKCk7CisjZW5kaWYKKwkJCQlkb2MuTG9hZCAobmV3IFhtbFNpZ25hdHVyZVN0cmVhbVJl
YWRlciAoCisJCQkJCW5ldyBTdHJlYW1SZWFkZXIgKChTdHJlYW0pIG9iaikpKTsKKy8vCQkJ
CWRvYy5Mb2FkICgoU3RyZWFtKSBvYmopOwogCQkJCXMgPSBjYW5vbmljYWxpemVyLkNhbm9u
aWNhbGl6ZSAoZG9jKTsKIAkJCX0gZWxzZSBpZiAob2JqIGlzIFhtbERvY3VtZW50KQogCQkJ
CXMgPSBjYW5vbmljYWxpemVyLkNhbm9uaWNhbGl6ZSAoKG9iaiBhcyBYbWxEb2N1bWVudCkp
OwpJbmRleDogU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YbWwvWG1sRGVjcnlwdGlv
blRyYW5zZm9ybS5jcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRv
Z3JhcGh5LlhtbC9YbWxEZWNyeXB0aW9uVHJhbnNmb3JtLmNzCShyZXZpc2lvbiA0MjMwOSkK
KysrIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWG1sL1htbERlY3J5cHRpb25UcmFu
c2Zvcm0uY3MJKHdvcmtpbmcgY29weSkKQEAgLTEyOSwxMCArMTI5LDkgQEAKIAkJCWlmIChp
bnB1dE9iaiBpcyBTdHJlYW0pIHsKIAkJCQlkb2N1bWVudCA9IG5ldyBYbWxEb2N1bWVudCAo
KTsKIAkJCQlkb2N1bWVudC5QcmVzZXJ2ZVdoaXRlc3BhY2UgPSB0cnVlOwotI2lmIE5FVF8x
XzEKIAkJCQlkb2N1bWVudC5YbWxSZXNvbHZlciA9IEdldFJlc29sdmVyICgpOwotI2VuZGlm
Ci0JCQkJZG9jdW1lbnQuTG9hZCAoaW5wdXRPYmogYXMgU3RyZWFtKTsKKwkJCQlkb2N1bWVu
dC5Mb2FkIChuZXcgWG1sU2lnbmF0dXJlU3RyZWFtUmVhZGVyICgKKwkJCQkJbmV3IFN0cmVh
bVJlYWRlciAoaW5wdXRPYmogYXMgU3RyZWFtKSkpOwogCQkJfQogCQkJZWxzZSBpZiAoaW5w
dXRPYmogaXMgWG1sRG9jdW1lbnQpIHsKIAkJCQlkb2N1bWVudCA9IGlucHV0T2JqIGFzIFht
bERvY3VtZW50OwpJbmRleDogU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YbWwvWG1s
RHNpZ1hQYXRoVHJhbnNmb3JtLmNzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFN5c3RlbS5TZWN1cml0
eS5DcnlwdG9ncmFwaHkuWG1sL1htbERzaWdYUGF0aFRyYW5zZm9ybS5jcwkocmV2aXNpb24g
NDIzMDkpCisrKyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5LlhtbC9YbWxEc2lnWFBh
dGhUcmFuc2Zvcm0uY3MJKHdvcmtpbmcgY29weSkKQEAgLTE5MiwxNyArMTkyLDE5IEBACiAJ
CQkvLyBwb3NzaWJsZSBpbnB1dDogU3RyZWFtLCBYbWxEb2N1bWVudCwgYW5kIFhtbE5vZGVM
aXN0CiAJCQlpZiAob2JqIGlzIFN0cmVhbSkgewogCQkJCWRvYyA9IG5ldyBYbWxEb2N1bWVu
dCAoKTsKLSNpZiAhIE5FVF8xXzAKKwkJCQlkb2MuUHJlc2VydmVXaGl0ZXNwYWNlID0gdHJ1
ZTsKKyNpZiBORVRfMV8xCiAJCQkJZG9jLlhtbFJlc29sdmVyID0gR2V0UmVzb2x2ZXIgKCk7
CiAjZW5kaWYKLQkJCQlkb2MuTG9hZCAob2JqIGFzIFN0cmVhbSk7CisJCQkJZG9jLkxvYWQg
KG5ldyBYbWxTaWduYXR1cmVTdHJlYW1SZWFkZXIgKAorCQkJCQluZXcgU3RyZWFtUmVhZGVy
ICgoU3RyZWFtKSBvYmopKSk7CiAJCQl9CiAJCQllbHNlIGlmIChvYmogaXMgWG1sRG9jdW1l
bnQpIHsKIAkJCQlkb2MgPSAob2JqIGFzIFhtbERvY3VtZW50KTsKIAkJCX0KIAkJCWVsc2Ug
aWYgKG9iaiBpcyBYbWxOb2RlTGlzdCkgewogCQkJCWRvYyA9IG5ldyBYbWxEb2N1bWVudCAo
KTsKLSNpZiAhIE5FVF8xXzAKKyNpZiBORVRfMV8xCiAJCQkJZG9jLlhtbFJlc29sdmVyID0g
R2V0UmVzb2x2ZXIgKCk7CiAjZW5kaWYKIAkJCQlmb3JlYWNoIChYbWxOb2RlIHhuIGluIChv
YmogYXMgWG1sTm9kZUxpc3QpKSAgewpJbmRleDogU3lzdGVtLlNlY3VyaXR5LmRsbC5zb3Vy
Y2VzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFN5c3RlbS5TZWN1cml0eS5kbGwuc291cmNlcwkocmV2
aXNpb24gNDIzMDkpCisrKyBTeXN0ZW0uU2VjdXJpdHkuZGxsLnNvdXJjZXMJKHdvcmtpbmcg
Y29weSkKQEAgLTEyMCw2ICsxMjAsNyBAQAogU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBo
eS5YbWwvWG1sRHNpZ1hzbHRUcmFuc2Zvcm0uY3MKIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9n
cmFwaHkuWG1sL1htbEVuY3J5cHRpb24uY3MKIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFw
aHkuWG1sL1htbFNpZ25hdHVyZS5jcworU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5Y
bWwvWG1sU2lnbmF0dXJlU3RyZWFtUmVhZGVyLmNzCiBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRv
Z3JhcGh5LlhtbC9UT0RPQXR0cmlidXRlLmNzCiBTeXN0ZW0uU2VjdXJpdHkuUGVybWlzc2lv
bnMvRGF0YVByb3RlY3Rpb25QZXJtaXNzaW9uLmNzCiBTeXN0ZW0uU2VjdXJpdHkuUGVybWlz
c2lvbnMvRGF0YVByb3RlY3Rpb25QZXJtaXNzaW9uQXR0cmlidXRlLmNzCkluZGV4OiBNb25v
LlhtbC9YbWxDYW5vbmljYWxpemVyLmNzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIE1vbm8uWG1sL1ht
bENhbm9uaWNhbGl6ZXIuY3MJKHJldmlzaW9uIDQyMzA5KQorKysgTW9uby5YbWwvWG1sQ2Fu
b25pY2FsaXplci5jcwkod29ya2luZyBjb3B5KQpAQCAtNTE0LDEzICs1MTQsOCBAQAogCQkJ
CQlzYi5BcHBlbmQgKCImI3g5OyIpOwogCQkJCWVsc2UgaWYgKGNoID09ICdceDBBJyAmJiB0
eXBlID09IFhtbE5vZGVUeXBlLkF0dHJpYnV0ZSkKIAkJCQkJc2IuQXBwZW5kICgiJiN4QTsi
KTsKLQkJCQllbHNlIGlmIChjaCA9PSAnXHgwRCcgJiYgKHR5cGUgPT0gWG1sTm9kZVR5cGUu
QXR0cmlidXRlIHx8Ci0JCQkJCQkJICBJc1RleHROb2RlICh0eXBlKSAmJiB0eXBlICE9IFht
bE5vZGVUeXBlLldoaXRlc3BhY2UgfHwKLQkJCQkJCQkgIHR5cGUgPT0gWG1sTm9kZVR5cGUu
Q29tbWVudCB8fAotCQkJCQkJCSAgdHlwZSA9PSBYbWxOb2RlVHlwZS5Qcm9jZXNzaW5nSW5z
dHJ1Y3Rpb24pKQotCQkJCQlzYi5BcHBlbmQgKCImI3hEOyIpOwogCQkJCWVsc2UgaWYgKGNo
ID09ICdceDBEJykKLQkJCQkJY29udGludWU7CisJCQkJCXNiLkFwcGVuZCAoIiYjeEQ7Iik7
CiAJCQkJZWxzZQogCQkJCQlzYi5BcHBlbmQgKGNoKTsKIAkJCX0K
--------------080500010704070801060209
Content-Type: text/plain;
 name="XmlSignatureStreamReader.cs"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="XmlSignatureStreamReader.cs"

Ly8KLy8gWG1sU2lnbmF0dXJlU3RyZWFtUmVhZGVyLmNzOiBXcmFwIFRleHRSZWFkZXIgYW5k
IGVsaW1pbmF0ZSBccgovLwovLyBBdXRob3I6Ci8vCUF0c3VzaGkgRW5vbW90byAoYXRzdXNo
aUB4aW1pYW4uY29tKQovLwovLyAoQykgMjAwNSBOb3ZlbGwgSW5jLgovLwoKLy8KLy8gUGVy
bWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJz
b24gb2J0YWluaW5nCi8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVk
IGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQovLyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0
aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi8vIHdpdGhvdXQg
bGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVi
bGlzaCwKLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9m
IHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi8vIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNv
ZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwovLyB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnM6Ci8vIAovLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQg
dGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQovLyBpbmNsdWRlZCBpbiBhbGwgY29w
aWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLy8gCi8vIFRI
RSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFO
WSBLSU5ELAovLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlU
RUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBF
VkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQovLyBMSUFC
TEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQU4gQUNUSU9OCi8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lO
RyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgovLyBXSVRIIFRIRSBTT0ZUV0FSRSBP
UiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLy8KLy8KLy8g
VXNlIGl0IHRvIGRpc3Rpbmd1aXNoICYjeEQ7IGFuZCBcci4gXHIgaXMgcmVtb3ZlZCwgd2hp
bGUgJiN4RDsgaXMgbm90LgovLwovLwoKdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uSU87
CnVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKCm5hbWVzcGFjZSBTeXN0
ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5LlhtbAp7CglpbnRlcm5hbCBjbGFzcyBYbWxTaWdu
YXR1cmVTdHJlYW1SZWFkZXIgOiBUZXh0UmVhZGVyCgl7CgkJVGV4dFJlYWRlciBzb3VyY2U7
CgkJaW50IGNhY2hlID0gaW50Lk1pblZhbHVlOwoKCQlwdWJsaWMgWG1sU2lnbmF0dXJlU3Ry
ZWFtUmVhZGVyIChUZXh0UmVhZGVyIGlucHV0KQoJCXsKCQkJc291cmNlID1pbnB1dDsKCQl9
CgoJCXB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlICgpCgkJewoJCQlzb3VyY2UuQ2xvc2Ug
KCk7CgkJfQoKCQlwdWJsaWMgb3ZlcnJpZGUgaW50IFBlZWsgKCkKCQl7CgkJCS8vIElmIHNv
dXJjZSBUZXh0UmVhZGVyIGRvZXMgbm90IHN1cHBvcnQgUGVlaygpLAoJCQkvLyBpdCBkb2Vz
IG5vdCBzdXBwb3J0IHRvby4gT3IgaXQganVzdCByZXR1cm5zIEVPRi4KCQkJaWYgKHNvdXJj
ZS5QZWVrICgpID09IC0xKQoJCQkJcmV0dXJuIC0xOwoKCQkJaWYgKGNhY2hlICE9IGludC5N
aW5WYWx1ZSkKCQkJCXJldHVybiBjYWNoZTsKCQkJY2FjaGUgPSBzb3VyY2UuUmVhZCAoKTsK
CQkJaWYgKGNhY2hlICE9ICdccicpCgkJCQlyZXR1cm4gY2FjaGU7CgkJCS8vIGNhY2hlIG11
c3QgYmUgJ1xyJyBoZXJlLgoJCQlpZiAoc291cmNlLlBlZWsgKCkgIT0gJ1xuJykKCQkJCXJl
dHVybiAnXHInOwoJCQkvLyBOb3cgUGVlaygpIHJldHVybnMgJ1xuJywgc28gY2xlYXIgY2Fj
aGUuCgkJCWNhY2hlID0gaW50Lk1pblZhbHVlOwoJCQlyZXR1cm4gJ1xuJzsKCQl9CgoJCXB1
YmxpYyBvdmVycmlkZSBpbnQgUmVhZCAoKQoJCXsKCQkJaWYgKGNhY2hlICE9IGludC5NaW5W
YWx1ZSkgewoJCQkJaW50IHJldCA9IGNhY2hlOwoJCQkJY2FjaGUgPSBpbnQuTWluVmFsdWU7
CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgkJCWludCBpID0gc291cmNlLlJlYWQgKCk7CgkJCWlm
IChpICE9ICdccicpCgkJCQlyZXR1cm4gaTsKCQkJLy8gcmVhZCBvbmUgbW9yZSBjaGFyIChh
ZnRlciAnXHInKQoJCQljYWNoZSA9IHNvdXJjZS5SZWFkICgpOwoJCQlpZiAoY2FjaGUgIT0g
J1xuJykKCQkJCXJldHVybiAnXHInOwoJCQljYWNoZSA9IGludC5NaW5WYWx1ZTsKCQkJcmV0
dXJuICdcbic7CgkJfQoKCQlwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWRCbG9jayAoCgkJCVtJ
biwgT3V0XSBjaGFyIFtdIGJ1ZmZlciwgaW50IGluZGV4LCBpbnQgY291bnQpCgkJewoJCQlj
aGFyIFtdIHRtcCA9IG5ldyBjaGFyIFtjb3VudF07CgkJCXNvdXJjZS5SZWFkQmxvY2sgKHRt
cCwgMCwgY291bnQpOwoJCQlpbnQgaiA9IGluZGV4OwoJCQlmb3IgKGludCBpID0gMDsgaSA8
IGNvdW50OyBqKyspIHsKCQkJCWlmICh0bXAgW2ldID09ICdccicpIHsKCQkJCQlpZiAoKytp
IDwgdG1wLkxlbmd0aCAmJiB0bXAgW2ldID09ICdcbicpCgkJCQkJCWJ1ZmZlciBbal0gPSB0
bXAgW2krK107CgkJCQkJZWxzZQoJCQkJCQlidWZmZXIgW2pdID0gJ1xyJzsKCQkJCX0KCQkJ
CWVsc2UKCQkJCQlidWZmZXIgW2pdID0gdG1wIFtpXTsKCQkJfQoJCQl3aGlsZSAoaiA8IGNv
dW50KSB7CgkJCQlpbnQgZCA9IFJlYWQgKCk7CgkJCQlpZiAoZCA8IDApCgkJCQkJYnJlYWs7
CgkJCQlidWZmZXIgW2orK10gPSAoY2hhcikgZDsKCQkJfQoJCQlyZXR1cm4gajsKCQl9CgoJ
CS8vIEkgaGF2ZSBubyBpZGVhIHdoYXQgdG8gZG8gaGVyZSwgYnV0IEkgZG9uJ3QgdGhpbmsg
aXQgCgkJLy8gbWFrZXMgc2Vuc2UuCgkJcHVibGljIG92ZXJyaWRlIHN0cmluZyBSZWFkTGlu
ZSAoKQoJCXsKCQkJcmV0dXJuIHNvdXJjZS5SZWFkTGluZSAoKTsKCQl9CgoJCXB1YmxpYyBv
dmVycmlkZSBzdHJpbmcgUmVhZFRvRW5kICgpCgkJewoJCQlyZXR1cm4gc291cmNlLlJlYWRU
b0VuZCAoKS5SZXBsYWNlICgiXHJcbiIsICJcbiIpOwoJCX0KCX0KfQo=
--------------080500010704070801060209--