cps & contification
Matthew Fluet
Matthew Fluet <fluet@CS.Cornell.EDU>
Mon, 15 Jan 2001 14:01:32 -0500 (EST)
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-126398554-979585292=:8833
Content-Type: TEXT/PLAIN; charset=US-ASCII
> This last bit doesn't make sense to me. The globals do not contain local
> function definitions. The call "shrinkExp globals" is just making global
> definitions of variables available to the calls to shrinkExp that happen later,
> to the results of walkExp. Those later calls are being made on the complete
> body of a CPS function definition, which should not contain any undefined jumps.
> It is an undefined jump that is causing the error.
You are right, of course. What I had determined was that the property
which was missing was defined in the call "shrinkExp globals", but
obviously that property didn't need to be filled in yet until the
resulting function was called.
> Also, the previous analyses already determined cases where toplevel functions
> are turned into local functions. I don't see the difference with the new
> analysis (although I haven't yet read the code you sent).
Yes and no. The previous continuation analysis would never produce a
ContSet.Return of Func.t; I think you had this in mind, but the line to do
so is commented out:
in case cont of
NONE => ContSet.<= (c, c')
(* ContSet.addReturn (c, name) *)
| SOME j => ContSet.addJump (c', j)
So, when the analysis determined that a function had exactly one
continuation, it was always a ContSet.One of Jump.t. This played into
the way in which prefixes were calculated.
But the call analysis was determining where toplevel functions were turned
into local functions.
> It looks to me like there is a bug in the original contify. The code should
> probably be the following.
>
> val body = walkExp (name, body, NONE)
> val body =
> case !prefixes of
> NONE => body
> | SOME fs =>
> let val {decs, transfer} = Exp.dest body
> in Exp.make {decs = nest (fs, NONE, decs),
> transfer = transfer}
> end
> val body = shrinkExp body
>
> That will make all the local functions available in the expression being
> shrunk. I have no idea how it worked before.
This works. I'm including an updated contify.new.fun which now performs
contification based on the new analysis. It assumes extending the
Control.strategy datatype with a New constructor (and appropriate changes
in control.sig and main.sml to select the new strategy). I'm starting
regression, benchmarks, and a self-compile, but that will take a while.
---559023410-126398554-979585292=:8833
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="contify.new.fun"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.SOL.3.95.1010115140132.8833C@hoho.cs.cornell.edu>
Content-Description:
KCogQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgTkVDIFJlc2VhcmNoIEluc3RpdHV0ZS4NCiAqIFBs
ZWFzZSBzZWUgdGhlIGZpbGUgTElDRU5TRSBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4NCiAqKQ0K
KCoNCiAqIFRoaXMgcGFzcyBjb21iaW5lcyB0d28gYW5hbHlzZXMgYW5kIHRyYW5zZm9ybWF0aW9u
cy4NCiAqDQogKiBUaGUgZmlyc3QgYW5hbHlzaXMsICJjYWxsIGJhc2VkIiBub3RpY2VzIGlmIGEg
dG9wbGV2ZWwgZnVuY3Rpb24gaXMgY2FsbGVkDQogKiAgICAgICAxLiBmcm9tIG9uZSBwbGFjZSBv
dXRzaWRlIGl0c2VsZg0KICogICBhbmQgMi4gYWxsIGNhbGxzIHRvIGl0c2VsZiB3aXRoaW4gaXRz
ZWxmIGFyZSB0YWlsDQogKiBJZiAoMSkgYW5kICgyKSBhcmUgdHJ1ZSwgdGhlbiB0aGF0IGZ1bmN0
aW9uIGNhbiBiZSBtYWRlIGxvY2FsIGF0IHRoZSBwb2ludA0KICogb2YgaXRzIG91dGVyIGNhbGwu
DQogKg0KICogVGhlIHNlY29uZCBhbmFseXNpcyBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHBh
cGVyLg0KICogICBMb2NhbCBDUFMgY29udmVyc2lvbiBpbiBhIGRpcmVjdC1zdHlsZSBjb21waWxl
ci4gIEpvaG4gUmVwcHkuDQogKiBJdCBkZXRlcm1pbmVzIHRoZSBzZXQgb2YgY29udGludWF0aW9u
cyB0aGF0IGEgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGguICBJZg0KICogdGhhdCBzZXQgaXMgYSBz
aW5nbGV0b24sIHRoZW4gdGhlIGZ1bmN0aW9uIGNhbiBiZSBwcmVmaXhlZCBvbnRvIHRoZQ0KICog
Y29udGludWF0aW9uIGl0IGlzIGNhbGxlZCB3aXRoLg0KICopDQoNCmZ1bmN0b3IgQ29udGlmeSAo
UzogQ09OVElGWV9TVFJVQ1RTKTogQ09OVElGWSA9IA0Kc3RydWN0DQoNCm9wZW4gUw0Kb3BlbiBE
ZWMgVHJhbnNmZXINCg0Kc3RydWN0dXJlIFJDb250ID0NCiAgIHN0cnVjdA0KDQogICAgICAoKiBM
YWJlbCA9IHtmIDogZiBpcyB0b3AgbGV2ZWwgQ1BTIGZ1bmN0aW9uIG5hbWV9IFUgIA0KICAgICAg
ICAgICAgICAgICB7ayA6IGsgaXMgbG9jYWwgcmV0dXJuIGNvbnRpbnVhdGlvbn0gDQogICAgICAg
KikNCiAgICAgIGRhdGF0eXBlIGxhYmVsDQoJPSBGdW5jTGFiZWwgb2YgRnVuYy50DQoJfCBKdW1w
TGFiZWwgb2YgSnVtcC50DQoNCiAgICAgIHZhbCBsYWJlbF90b1N0cmluZw0KCT0gZm4gRnVuY0xh
YmVsIGYgPT4gRnVuYy50b1N0cmluZyBmDQoJICAgfCBKdW1wTGFiZWwgaiA9PiBKdW1wLnRvU3Ry
aW5nIGoNCgkNCiAgICAgIHZhbCBsYWJlbF9lcXVhbHMNCgk9IGZuIChGdW5jTGFiZWwgZjEsIEZ1
bmNMYWJlbCBmMikgPT4gRnVuYy5lcXVhbHMgKGYxLCBmMikNCgkgICB8IChKdW1wTGFiZWwgajEs
IEp1bXBMYWJlbCBqMikgPT4gSnVtcC5lcXVhbHMgKGoxLCBqMikNCgkgICB8IF8gPT4gZmFsc2UN
Cg0KICAgICAgKCogUkNvbnQgPSBib3QgVSBMYWJlbA0KICAgICAgICopDQogICAgICBkYXRhdHlw
ZSByY29udA0KCT0gQm90DQoJfCBMYWJlbCBvZiBsYWJlbA0KDQogICAgICB2YWwgcmNvbnRfdG9T
dHJpbmcNCgk9IGZuIEJvdCA9PiAiQm90Ig0KCSAgIHwgTGFiZWwgbCA9PiAiTGFiZWwgIiBeIChs
YWJlbF90b1N0cmluZyBsKQ0KDQogICAgICB2YWwgcmNvbnRfZXF1YWxzDQoJPSBmbiAoQm90LCBC
b3QpID0+IHRydWUNCiAgICAgICAgICAgfCAoTGFiZWwgbDEsIExhYmVsIGwyKSA9PiBsYWJlbF9l
cXVhbHMgKGwxLCBsMikNCgkgICB8IF8gPT4gZmFsc2UNCg0KICAgICAgKCogR2FtbWEgaW4gUkVu
diA9IExhYmVsIC0+IFJDb250DQogICAgICAgKg0KICAgICAgICogR2FtbWExIDw9IEdhbW1hMg0K
ICAgICAgICogaWZmDQogICAgICAgKiBmb3JhbGwgbCBpbiBMYWJlbC4gR2FtbWEobCkgPD1sIEdh
bW1hMihsKQ0KICAgICAgICogICAgICAgICAgICAgICAgICAgIHdoZXJlIGJvdCA8PWwgbCcgPD1s
IGwgZm9yYWxsIGwnIGluIExhYmVsDQogICAgICAgKg0KICAgICAgICogR2FtbWExIFYgR2FtbWEy
DQogICAgICAgKiA9IHtsIC0+IHIgfCBsIGluIExhYmVsDQogICAgICAgKiAgICAgICAgICAgICBy
ID0gY2FzZSAoR2FtbWExKGwpLCBHYW1tYTIobCkpDQogICAgICAgKiAgICAgICAgICAgICAgICAg
ICBvZiAoYm90LCByJykgPT4gcicNCiAgICAgICAqICAgICAgICAgICAgICAgICAgICB8IChyJywg
Ym90KSA9PiByJw0KICAgICAgICogICAgICAgICAgICAgICAgICAgIHwgKHIxLCByMikgPT4gaWYg
cjEgPSByMg0KICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4g
cjENCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGx9DQog
ICAgICAgKiANCiAgICAgICAqIEFuYWx5c2lzIHdpbGwgbW9ub3RvbmljYWxseSBpbmNyZWFzZSBH
YW1tYSwNCiAgICAgICAqIHNvIGl0IHN1ZmZpY2VzIHRvIHJlY29yZCwgZm9yIGVhY2ggbGFiZWws
DQogICAgICAgKiB0aGUgY3VycmVudCBSQ29udCBhbmQgYSBsaXN0IG9mIG90aGVyIHZhbHVlcw0K
ICAgICAgICogdG8gY2hhbmdlIGlmIHRoZSBjdXJyZW50IGxhYmVsIGlzIGluY3JlYXNlZC4NCiAg
ICAgICAqKQ0KICAgICAgZGF0YXR5cGUgdCA9IFQgb2Yge2xhYmVsOiBsYWJlbCwNCgkJCSByY29u
dDogcmNvbnQgcmVmLA0KCQkJIHJlc2V0OiBib29sIHJlZiwNCgkJCSBsZXNzVGhhbjogdCBsaXN0
IHJlZiwNCgkJCSBtb3JlVGhhbjogdCBsaXN0IHJlZiwNCgkJCSBtb3JlVGhhbic6IGxhYmVsIGxp
c3QgcmVmfQ0KDQogICAgICBmdW4gdG9TdHJpbmcgKFQge2xhYmVsLCByY29udCwgbGVzc1RoYW4s
IG1vcmVUaGFuLCBtb3JlVGhhbicsIC4uLn0pDQooKg0KCT0gKGxhYmVsX3RvU3RyaW5nIGxhYmVs
KSBeICI6IiBeIChyY29udF90b1N0cmluZyAoIXJjb250KSkNCiopDQoJPSBjYXNlICFyY29udA0K
CSAgICBvZiBCb3QgPT4gInt9Ig0KCSAgICAgfCBMYWJlbCBsID0+IGlmIGxhYmVsX2VxdWFscyhs
YWJlbCwgbCkNCgkJCSAgICB0aGVuICJBbGwiDQoJCQkgICAgZWxzZSBjb25jYXQgWyJ7ICIsDQoJ
CQkJCSBsYWJlbF90b1N0cmluZyBsLA0KCQkJCQkgIiB9Il0NCg0KICAgICAgZnVuIGVxdWFscyAo
VCB7cmNvbnQgPSByY29udDEsIC4uLn0sIFQge3Jjb250ID0gcmNvbnQyLCAuLi59KQ0KCT0gcmNv
bnQxID0gcmNvbnQyDQoNCiAgICAgIGZ1biBsYWJlbCAoVCB7bGFiZWwsIC4uLn0pID0gbGFiZWwN
CiAgICAgIGZ1biByY29udCAoVCB7cmNvbnQsIC4uLn0pID0gIXJjb250DQoNCiAgICAgIGZ1biBu
ZXcgbCA9IFQge2xhYmVsID0gbCwNCgkJICAgICByY29udCA9IHJlZiBCb3QsDQoJCSAgICAgcmVz
ZXQgPSByZWYgZmFsc2UsDQoJCSAgICAgbGVzc1RoYW4gPSByZWYgW10sDQoJCSAgICAgbW9yZVRo
YW4gPSByZWYgW10sDQoJCSAgICAgbW9yZVRoYW4nID0gcmVmIFtdfQ0KDQogICAgICB2YWwgb3Ag
XC8NCgk9IGZuIChsLCByMSwgcjIpDQoJICAgPT4gIChjYXNlIChyMSwgcjIpIA0KCQkgIG9mIChC
b3QsIHIyKSA9PiByMg0KCQkgICB8IChyMSwgQm90KSA9PiByMQ0KCQkgICB8IChMYWJlbCBsMSwg
TGFiZWwgbDIpDQoJCSAgID0+IGlmIGxhYmVsX2VxdWFscyhsMSwgbDIpDQoJCQl0aGVuIExhYmVs
IGwxDQoJCQllbHNlIExhYmVsIGwpDQoNCiAgICAgIGZ1biBjYXNjYWRlIChjIGFzIFQge3Jjb250
LCByZXNldCwgbGVzc1RoYW4sIC4uLn0pDQoJPSBpZiAhcmVzZXQNCgkgICAgdGhlbiAoKQ0KCSAg
ICBlbHNlIChyY29udCA6PSBCb3Q7DQoJCSAgcmVzZXQgOj0gdHJ1ZTsNCgkJICBMaXN0LmZvcmVh
Y2goIWxlc3NUaGFuLCBjYXNjYWRlKSkNCg0KKCoNCiAgICAgIHZhbCBpbmRlbnQgPSByZWYgW10g
OiBzdHJpbmcgbGlzdCByZWYNCiopDQogICAgICBmdW4gcmVkbyAoYyBhcyBUIHtsYWJlbCwgcmNv
bnQsIHJlc2V0LCANCgkJCWxlc3NUaGFuLCBtb3JlVGhhbiwgbW9yZVRoYW4nLCAuLi59KQ0KCT0g
bGV0DQooKg0KCSAgICB2YWwgXyA9IExpc3QuZm9yZWFjaCghaW5kZW50LCBwcmludCkNCgkgICAg
dmFsIF8gPSBwcmludCAobGFiZWxfdG9TdHJpbmcgbGFiZWwpDQogIAkgICAgdmFsIF8gPSBwcmlu
dCAiIDogIg0KCSAgICB2YWwgXyA9IHByaW50ICh0b1N0cmluZyBjKQ0KCSAgICB2YWwgXyA9IHBy
aW50ICIgLT4gIg0KCSAgICB2YWwgXyA9IHByaW50IChjb25jYXQgKExpc3Quc2VwYXJhdGUNCgkJ
CQkgICAoTGlzdC5tYXAoIW1vcmVUaGFuLCB0b1N0cmluZykgQA0KCQkJCSAgICBMaXN0Lm1hcCgh
bW9yZVRoYW4nLCBsYWJlbF90b1N0cmluZyksDQoJCQkJICAgICIgfCAiKSkpDQoJICAgIHZhbCBf
ID0gcHJpbnQgIiA9ICINCiopDQoJDQoJICAgIHZhbCBvcCBcXC8vID0gZm4gKHIxLCByMikgPT4g
XC8gKGxhYmVsLCByMSwgcjIpDQoJICAgIHZhbCB0b3AgPSBMYWJlbCBsYWJlbA0KCSAgICAgIA0K
CSAgICB2YWwgcmNvbnRfb2xkID0gIXJjb250DQoJICAgIHZhbCByY29udF9uZXcNCgkgICAgICA9
IExpc3QuZm9sZA0KCSAgICAgICAgKCFtb3JlVGhhbiwNCgkJIExpc3QuZm9sZA0KCQkgKCFtb3Jl
VGhhbicsDQoJCSAgQm90LA0KCQkgIGZuIChsLCByY29udF9uZXcpID0+IFxcLy8gKHJjb250X25l
dywgTGFiZWwgbCkpLA0KCQkgZm4gKFQge3Jjb250LCAuLi59LCByY29udF9uZXcpID0+IFxcLy8g
KHJjb250X25ldywgIXJjb250KSkNCgkgICAgdmFsIF8gPSByY29udCA6PSByY29udF9uZXcNCg0K
KCoNCgkgICAgdmFsIF8gPSBwcmludCAocmNvbnRfdG9TdHJpbmcgcmNvbnRfbmV3KQ0KCSAgICB2
YWwgXyA9IHByaW50ICJcbiINCiopDQoJICBpbg0KKCoNCgkgICAgaWdub3JlIChMaXN0LnB1c2go
aW5kZW50LCAiICIpKTsNCiopDQoJICAgIGlmICFyZXNldA0KCSAgICAgIHRoZW4gKHJlc2V0IDo9
IGZhbHNlOw0KCQkgICAgTGlzdC5mb3JlYWNoKCFsZXNzVGhhbiwgcmVkbykpDQoJICAgICAgZWxz
ZSBpZiByY29udF9lcXVhbHMocmNvbnRfb2xkLCByY29udF9uZXcpIA0KCQkgICAgIHRoZW4gKCkN
CgkJICAgICBlbHNlIExpc3QuZm9yZWFjaCghbGVzc1RoYW4sIHJlZG8pOw0KKCoNCgkgICAgaWdu
b3JlIChMaXN0LnBvcChpbmRlbnQpKTsNCiopDQoJICAgICgpDQoJICBlbmQNCg0KICAgICAgdmFs
IGpvaW4NCgk9IGZuIChjIGFzIFQge21vcmVUaGFuLCAuLi59LCBjJyBhcyBUIHtsZXNzVGhhbiwg
Li4ufSkNCgkgICA9PiAoTGlzdC5wdXNoIChsZXNzVGhhbiwgYyk7DQoJICAgICAgIExpc3QucHVz
aCAobW9yZVRoYW4sIGMnKTsNCgkgICAgICAgY2FzY2FkZSBjOw0KCSAgICAgICByZWRvIGMpDQoN
CiAgICAgIHZhbCBqb2luJw0KCT0gZm4gKGMgYXMgVCB7bW9yZVRoYW4nLCAuLi59LCBsKQ0KCSAg
ID0+IChMaXN0LnB1c2ggKG1vcmVUaGFuJywgbCk7DQoJICAgICAgIGNhc2NhZGUgYzsNCgkgICAg
ICAgcmVkbyBjKQ0KDQogICAgICB2YWwgam9pbidfZg0KCT0gZm4gKGMsIGYpID0+IGpvaW4nIChj
LCBGdW5jTGFiZWwgZikNCiAgICAgIHZhbCBqb2luJ19qDQoJPSBmbiAoYywgaikgPT4gam9pbicg
KGMsIEp1bXBMYWJlbCBqKQ0KDQogICAgICBmdW4gbWFrZVRvcCAoYyBhcyBUIHtsYWJlbCwgLi4u
fSkgPSBqb2luJyAoYywgbGFiZWwpDQoNCiAgICAgIGZ1biBpc1RvcCAoYyBhcyBUIHtsYWJlbCwg
cmNvbnQsIC4uLn0pDQoJPSBjYXNlICFyY29udA0KCSAgICBvZiBCb3QgPT4gZmFsc2UNCgkgICAg
IHwgTGFiZWwgbCA9PiBsYWJlbF9lcXVhbHMgKGwsIGxhYmVsKQ0KICAgICAgZnVuIGlzQm90IChj
IGFzIFQge2xhYmVsLCByY29udCwgLi4ufSkNCgk9IGNhc2UgIXJjb250DQoJICAgIG9mIEJvdCA9
PiB0cnVlDQoJICAgICB8IExhYmVsIGwgPT4gZmFsc2UNCg0KICAgICAgZnVuIGFuYWx5emUge3By
b2dyYW0gYXMgUHJvZ3JhbS5UIHtmdW5jdGlvbnMsIG1haW4sIC4uLn19DQoJPSBsZXQNCgkgICAg
KCogR2FtbWEgaW4gUkVudiA9IExhYmVsIC0+IFJDb250DQoJICAgICAqKQ0KCSAgICB2YWwge2dl
dCA9IGdldF9yY29udCA6IGxhYmVsIC0+IHR9DQoJICAgICAgPSBQcm9wZXJ0eS5nZXQNCgkgICAg
ICAgIChmbiBGdW5jTGFiZWwgZiA9PiBGdW5jLnBsaXN0IGYNCgkgICAgICAgICAgfCBKdW1wTGFi
ZWwgaiA9PiBKdW1wLnBsaXN0IGosDQoJCSBQcm9wZXJ0eS5pbml0RnVuIChmbiBsID0+IG5ldyBs
KSkNCg0KCSAgICB2YWwgZ2V0X3Jjb250X2YgPSBmbiBmID0+IGdldF9yY29udCAoRnVuY0xhYmVs
IGYpDQoJICAgIHZhbCBnZXRfcmNvbnRfaiA9IGZuIGogPT4gZ2V0X3Jjb250IChKdW1wTGFiZWwg
aikNCg0KCSAgICAoKiBQcm9ncmFtIGFuYWx5c2lzOg0KCSAgICAgKiBBbmFsWzxmdW4gZmkgKDx4
aWo+KykgPSBlaT4rXSANCgkgICAgICogICA9IGZpeCAoZm4gR2FtbWEgPT4gVl9pIFJbZWldIEdh
bW1hJyhmaSkpDQoJICAgICAqICB3aGVyZSBHYW1tYScgPSBHYW1tYSBWIHttYWluIC0+IG1haW59
DQoJICAgICAqIChmaXhlZCBwb2ludCBuZWNlc3NhcnkgYmVjYXVzZSB0b3AgbGV2ZWwgQ1BTIGZ1
bmN0aW9ucw0KICAgICAgICAgICAgICogYXJlIG11dHVhbGx5IHJlY3Vyc2l2ZTsgYnV0IHRoZQ0K
ICAgICAgICAgICAgICogbGVzc1RoYW4vbW9yZVRoYW4vbW9yZVRoYW4nIHRyaWNrIGxldHMgdXMg
ZG8gaXQgaW4gb25lDQogICAgICAgICAgICAgKiBwYXNzKSAgDQogICAgICAgICAgICAgKiAoaW50
aWFsaXppbmcgbWFpbiB0byAibWFpbiIgZW5zdXJlcyB0aGF0IGJvdA0KCSAgICAgKiBjb3JyZXNw
b25kcyB0byBubyBjYWxscykgICANCgkgICAgICoNCgkgICAgICogRGVjIGFuYWx5c2lzOg0KCSAg
ICAgKiBSW2xldCBmdW4gayA8eGk+KyA9IGUgaW4gZSddcCA9IFJbZV1wJyBWIEdhbW1hDQoJICAg
ICAqICB3aGVyZSBHYW1tYSA9IFJbZSddcCBhbmQgcCcgPSBHYW1tYShrKQ0KCSAgICAgKiBSW2xl
dCB2YWwgeCA9IHMgaW4gZSddcCA9IFJbZSddcA0KCSAgICAgKiBSW2xldCB2YWwgXyA9IEhhbmRs
ZXJQdXNoIGogaW4gZSddcCA9IFJbZSddcCBWIHtqIC0+IHB9DQoJICAgICAqDQoJICAgICAqIFRy
YW5zZmVyIGFuYWx5c2lzOg0KCSAgICAgKiBSW2YgKDx4aT4rKV1wID0ge2YgLT4gcH0NCgkgICAg
ICogUltrIChmICg8eGk+KykpXXAgPSB7ayAtPiBwfSBWIHtmIC0+IGt9DQoJICAgICAqIFJbayAo
PHhpPispXXAgPSB7ayAtPiBwfQ0KCSAgICAgKiBSWzx4aT4rXXAgPSB7fQ0KCSAgICAgKiBSW2Nh
c2UgeCBvZiA8Q2kgPT4ga2k+K11wID0gVl9pIHtraSAtPiBwfQ0KCSAgICAgKg0KCSAgICAgKiBU
aGUgbm90YXRpb24gPGV4cChpKT4rIGluZGljYXRlcyBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMsIA0K
CSAgICAgKiBpbmRleGVkIGJ5IGkuDQoJICAgICAqIFRoZSBub3RhdGlvbiBWX2kgaW5kaWNhdGVz
IHRoZSBqb2luIG92ZXIgYWxsIGkuDQoJICAgICAqKQ0KDQoJICAgIHZhbCBfID0gbWFrZVRvcCAo
Z2V0X3Jjb250X2YgbWFpbikNCgkgICAgdmFsIF8gDQoJICAgICAgPSBMaXN0LmZvcmVhY2gNCgkg
ICAgICAgIChmdW5jdGlvbnMsIA0KCQkgZm4ge25hbWUsIGJvZHksIC4uLn0gDQoJCSAgPT4gbGV0
DQoJCSAgICAgICAoKiBDYW4ndCB1c2UgRXhwLmZvcmVhY2gqOyBuZWVkIHRvIGNoYW5nZSByY29u
dA0KCQkJKiBmb3IgZGVjZW50IGludG8gYm9keSBvZiBEZWMuRnVuLg0KCQkJKikNCgkJICAgICAg
IGZ1biBkb2l0IChib2R5LCByY29udCkNCgkJCSA9IGxldA0KCQkJICAgICB2YWwge2RlY3MsIHRy
YW5zZmVyfSA9IEV4cC5kZXN0IGJvZHkNCgkJCSAgIGluCQ0KCQkJICAgICBjYXNlIHRyYW5zZmVy
DQoJCQkgICAgICAgb2YgVHJhbnNmZXIuQ2FsbCB7ZnVuYywgY29udCwgLi4ufSANCgkJCQk9PiBs
ZXQNCgkJCQkgICAgIHZhbCBmcmNvbnQgPSBnZXRfcmNvbnRfZiBmdW5jDQoJCQkJICAgaW4NCgkJ
CQkgICAgIGNhc2UgY29udA0KCQkJCSAgICAgICBvZiBOT05FIA0KCQkJCQk9PiBpZiBGdW5jLmVx
dWFscyhmdW5jLCBuYW1lKQ0KCQkJCQkgICAgIHRoZW4gam9pbiAoZnJjb250LCByY29udCkNCgkJ
CQkJICAgICBlbHNlIGpvaW4gKGZyY29udCwgcmNvbnQpDQoJCQkJCXwgU09NRSBqdW1wDQoJCQkJ
ICAgICAgICA9PiAoam9pbidfaiAoZnJjb250LCBqdW1wKTsNCgkJCQkJICAgIGpvaW4gKGdldF9y
Y29udF9qIGp1bXAsIHJjb250KSkNCgkJCQkgICBlbmQNCgkJCSAgICAgICAgfCBUcmFuc2Zlci5D
YXNlIHtjYXNlcywgZGVmYXVsdCwgLi4ufQ0KCQkJICAgICAgICA9PiAoQ2FzZXMuZm9yZWFjaA0K
CQkJICAgICAgICAgICAgKGNhc2VzLA0KCQkJCSAgICAgZm4ganVtcCANCgkJCQkgICAgICA9PiBq
b2luIChnZXRfcmNvbnRfaiBqdW1wLCByY29udCkpOw0KCQkJCSAgICBjYXNlIGRlZmF1bHQNCgkJ
CQkgICAgICBvZiBOT05FID0+ICgpDQoJCQkJICAgICAgIHwgU09NRSBqdW1wIA0KCQkJCSAgICAg
ICA9PiBqb2luIChnZXRfcmNvbnRfaiBqdW1wLCByY29udCkpDQoJCQkgICAgICAgIHwgVHJhbnNm
ZXIuSnVtcCB7ZHN0LCAuLi59DQoJCQkgICAgICAgID0+IGpvaW4gKGdldF9yY29udF9qIGRzdCwg
cmNvbnQpDQoJCQkgICAgICAgIHwgXyA9PiAoKTsNCgkJCSAgICBMaXN0LmZvcmVhY2gNCgkJCSAg
ICAoTGlzdC5yZXYgZGVjcywNCgkJCSAgICAgZm4gRGVjLkZ1biB7bmFtZSwgYm9keSwgLi4ufQ0K
CQkJICAgICAgPT4gZG9pdCAoYm9keSwgZ2V0X3Jjb250X2ogbmFtZSkNCgkJCSAgICAgIHwgRGVj
LkhhbmRsZXJQdXNoIGp1bXANCgkJCSAgICAgID0+IGpvaW4gKGdldF9yY29udF9qIGp1bXAsIHJj
b250KQ0KCQkJICAgICAgfCBfID0+ICgpKQ0KCQkJICAgZW5kCQkgICANCgkJICAgICBpbiANCgkJ
ICAgICAgIGRvaXQgKGJvZHksIGdldF9yY29udF9mIG5hbWUpDQoJCSAgICAgZW5kKQ0KDQoJICAo
KiBMZXQgR2FtbWEgPSBBbmFsW3Byb2ddDQoJICAgKiANCgkgICAqIGNhc2UgR2FtbWEobCkNCgkg
ICAqICAgb2YgYm90ID0+IGZ1bmN0aW9uIHdpdGggbGFiZWwgbCBpcyBuZXZlciBjYWxsZWQNCgkg
ICAqICAgIHwgciA9PiBpZiByIDw+IGwNCgkgICAqICAgICAgICAgICAgdGhlbiB0aGUgZnVuY3Rp
b24gd2l0aCBsYWJlbCBsIGhhcyBleGFjdGx5IG9uZQ0KCSAgICogICAgICAgICAgICAgICAgIGNv
bnRpbnVhdGlvbiAocikgYW5kIGlzIGNvbnRpZmlhYmxlIGluIHINCgkgICAqICAgICAgICAgICAg
ZWxzZSB0aGUgZnVuY3Rpb24gd2l0aCBsYWJlbCBsIGhhcyBtb3JlIHRoYW4gb25lDQoJICAgKiAg
ICAgICAgICAgICAgICAgY29udGludWF0aW9uIGlzIGlzIG5vdCBjb250aWZpYWJsZQ0KCSAgICop
DQoJICBpbg0KCSAgICB7Z2V0X3Jjb250X2ogPSBnZXRfcmNvbnRfaiwNCgkgICAgIGdldF9yY29u
dF9mID0gZ2V0X3Jjb250X2Z9DQoJICBlbmQNCiAgIGVuZA0KDQpzdHJ1Y3R1cmUgQ29udFNldCA9
DQogICBzdHJ1Y3QNCiAgICAgIGRhdGF0eXBlIHNldCA9DQoJIEVtcHR5DQogICAgICAgfCBNYWlu
Q29udA0KICAgICAgIHwgT25lIG9mIEp1bXAudA0KICAgICAgIHwgUmV0dXJuIG9mIEZ1bmMudA0K
ICAgICAgIHwgQWxsDQoNCiAgICAgIHZhbCB0b1N0cmluZw0KCT0gZm4gRW1wdHkgPT4gInt9Ig0K
ICAgICAgICAgICB8IE1haW5Db250ID0+ICJNYWluQ29udCINCgkgICB8IE9uZSBqID0+IGNvbmNh
dCBbInsgIiwgSnVtcC50b1N0cmluZyBqLCAiIH0iXQ0KCSAgIHwgUmV0dXJuIGYgPT4gY29uY2F0
IFsieyAiLCBGdW5jLnRvU3RyaW5nIGYsICIgfSJdDQoJICAgfCBBbGwgPT4gIkFsbCINCg0KICAg
ICAgZnVuIGxheW91dFNldCBzID0NCgkgbGV0IG9wZW4gTGF5b3V0DQoJIGluIGNhc2UgcyBvZg0K
CSAgICBFbXB0eSA9PiBzdHIgInt9Ig0KCSAgfCBNYWluQ29udCA9PiBzdHIgIk1haW5Db250Ig0K
CSAgfCBPbmUgaiA9PiBzZXEgW3N0ciAieyAiLCBKdW1wLmxheW91dCBqLCBzdHIgIiB9Il0NCgkg
IHwgUmV0dXJuIGYgPT4gc2VxIFtzdHIgInsgIiwgRnVuYy5sYXlvdXQgZiwgc3RyICIgfSJdDQoJ
ICB8IEFsbCA9PiBzdHIgIkFsbCINCgkgZW5kDQoNCiAgICAgIGRhdGF0eXBlIHQgPSBUIG9mIHtz
ZXQ6IHNldCByZWYsDQoJCQkgbGVzc1RoYW46IHQgbGlzdCByZWZ9DQoNCiAgICAgIGZ1biBzZXQg
KFQge3NldCwgLi4ufSkgPSAhc2V0DQoNCiAgICAgIHZhbCBsYXlvdXQgPSBsYXlvdXRTZXQgbyBz
ZXQNCg0KICAgICAgZnVuIGlzRW1wdHkgYyA9IChjYXNlIHNldCBjIG9mDQoJCQkgIEVtcHR5ID0+
IHRydWUNCgkJCXwgXyA9PiBmYWxzZSkNCgkgDQogICAgICBmdW4gbmV3ICgpID0gVCB7c2V0ID0g
cmVmIEVtcHR5LA0KCQkgICAgICBsZXNzVGhhbiA9IHJlZiBbXX0NCg0KICAgICAgZnVuIHVwIChU
IHtzZXQsIGxlc3NUaGFufSwgcykgPQ0KCSBsZXQNCgkgICAgZnVuIGRvaXQgcyA9IChzZXQgOj0g
czsgTGlzdC5mb3JlYWNoICghbGVzc1RoYW4sIGZuIGMgPT4gdXAgKGMsIHMpKSkNCgkgaW4gY2Fz
ZSAoIXNldCwgcykgb2YNCgkgICAgKF8sIEVtcHR5KSA9PiAoKQ0KCSAgfCAoQWxsLCBfKSA9PiAo
KQ0KCSAgfCAoRW1wdHksIGspID0+IGRvaXQgaw0KCSAgfCAoTWFpbkNvbnQsIE1haW5Db250KSA9
PiAoKQ0KCSAgfCAoT25lIGosIE9uZSBqJykgPT4gaWYgSnVtcC5lcXVhbHMgKGosIGonKSB0aGVu
ICgpIGVsc2UgZG9pdCBBbGwNCgkgIHwgKFJldHVybiBmLCBSZXR1cm4gZicpID0+IGlmIEZ1bmMu
ZXF1YWxzIChmLCBmJykgdGhlbiAoKSBlbHNlIGRvaXQgQWxsDQoJICB8IF8gPT4gZG9pdCBBbGwN
CgkgZW5kDQoNCiAgICAgIHZhbCB1cCA9IFRyYWNlLnRyYWNlMiAoInVwIiwgbGF5b3V0LCBsYXlv
dXRTZXQsIFVuaXQubGF5b3V0KSB1cA0KDQogICAgICB2YWwgb3AgPD0gPQ0KCSBmbiAoVCB7c2V0
LCBsZXNzVGhhbn0sIGMpID0+DQoJICAgICAgKExpc3QucHVzaCAobGVzc1RoYW4sIGMpDQoJICAg
ICAgIDsgdXAgKGMsICFzZXQpKQ0KDQogICAgICBmdW4gYWRkUmV0dXJuIChjLCBmKSA9IHVwIChj
LCBSZXR1cm4gZikNCiAgICAgIGZ1biBhZGRKdW1wIChjLCBqKSA9IHVwIChjLCBPbmUgaikNCiAg
ICAgIGZ1biBhZGRNYWluIGMgPSB1cCAoYywgTWFpbkNvbnQpDQogICAgICBmdW4gbWFrZVRvcCBj
ID0gdXAgKGMsIEFsbCkNCiAgIGVuZA0KCSANCnN0cnVjdHVyZSBDYWxsSW5mbyA9DQogICBzdHJ1
Y3QNCiAgICAgIGRhdGF0eXBlIHQgPQ0KCSBOb091dGVyQ2FsbHMNCiAgICAgICB8IE9uZU91dGVy
Q2FsbA0KICAgICAgIHwgTm90Q29udA0KDQogICAgICB2YWwgdG9TdHJpbmcgPQ0KCSBmbiBOb091
dGVyQ2FsbHMgPT4gIk5vT3V0ZXJDYWxscyINCgkgIHwgT25lT3V0ZXJDYWxsID0+ICJPbmVPdXRl
ckNhbGwiDQoJICB8IE5vdENvbnQgPT4gIk5vdENvbnQiDQoNCiAgICAgIHZhbCBsYXlvdXQgPSBM
YXlvdXQuc3RyIG8gdG9TdHJpbmcNCiAgIGVuZA0KICAgDQpzdHJ1Y3R1cmUgR3JhcGggPSBEaXJl
Y3RlZEdyYXBoDQpzdHJ1Y3R1cmUgTm9kZSA9IEdyYXBoLk5vZGUNCiAgDQpmdW4gY29udGlmeSAo
cHJvZ3JhbSBhcyBQcm9ncmFtLlQge2RhdGF0eXBlcywgZ2xvYmFscywgZnVuY3Rpb25zLCBtYWlu
fSkgPQ0KICAgbGV0DQogICAgICAgdmFsIHN0cmF0ZWd5ID0gIUNvbnRyb2wuY29udGlmeVN0cmF0
ZWd5DQogICBpbiBjYXNlIHN0cmF0ZWd5IG9mDQogICAgICBDb250cm9sLk5vbmUgPT4gcHJvZ3Jh
bQ0KICAgIHwgXyA9PiANCgkgbGV0DQoJICAgIGRhdGF0eXBlICdhIHJlcGxhY2UgPQ0KCSAgICAg
ICBOb25lDQoJICAgICB8IE9uZUNhbGwgb2YgJ2ENCgkgICAgIHwgT25lQ29udCBvZiAnYQ0KCSAg
ICB2YWwge2dldCA9IGZ1bmNJbmZvOg0KCQkgRnVuYy50IC0+IHsNCgkJCSAgICBjYWxsZXJzOiBG
dW5jLnQgbGlzdCByZWYsDQoJCQkgICAgY2FsbEluZm86IENhbGxJbmZvLnQgcmVmLA0KCQkJICAg
IGNhblByZWZpeDogYm9vbCByZWYsDQoJCQkgICAgY29udFNldDogQ29udFNldC50LA0KCQkJICAg
IGlzTG9jYWw6IGJvb2wgcmVmLA0KCQkJICAgIG5lc3RlZDogRnVuYy50IGxpc3QgcmVmLA0KCQkJ
ICAgIG5vZGU6IEdyYXBoLk5vZGUudCBvcHRpb24gcmVmLA0KCQkJICAgIHBvc3NpYmxlUHJlZml4
ZXM6IEZ1bmMudCBsaXN0IHJlZiwNCgkJCSAgICBwcmVmaXhlczogRnVuYy50IGxpc3Qgb3B0aW9u
IHJlZiwNCgkJCSAgICByZXBsYWNlOiB7YXJnczogKFZhci50ICogVHlwZS50KSBsaXN0LA0KCQkJ
CSAgICAgIGJvZHk6IEV4cC50LA0KCQkJCSAgICAgIGp1bXA6IEp1bXAudH0gb3B0aW9uIHJlZg0K
CQkJICAgIH19ID0NCgkgICAgICAgUHJvcGVydHkuZ2V0IChGdW5jLnBsaXN0LA0KCQkJICAgICBQ
cm9wZXJ0eS5pbml0RnVuDQoJCQkgICAgIChmbiBfID0+IHtjYWxsZXJzID0gcmVmIFtdLA0KCQkJ
CSAgICAgICBjYWxsSW5mbyA9IHJlZiBDYWxsSW5mby5Ob091dGVyQ2FsbHMsDQoJCQkJICAgICAg
IGNhblByZWZpeCA9IHJlZiBmYWxzZSwNCgkJCQkgICAgICAgY29udFNldCA9IENvbnRTZXQubmV3
ICgpLA0KCQkJCSAgICAgICBpc0xvY2FsID0gcmVmIGZhbHNlLA0KCQkJCSAgICAgICBuZXN0ZWQg
PSByZWYgW10sDQoJCQkJICAgICAgIG5vZGUgPSByZWYgTk9ORSwNCgkJCQkgICAgICAgcG9zc2li
bGVQcmVmaXhlcyA9IHJlZiBbXSwNCgkJCQkgICAgICAgcHJlZml4ZXMgPSByZWYgTk9ORSwNCgkJ
CQkgICAgICAgcmVwbGFjZSA9IHJlZiBOT05FfSkpDQoJICAgICgqIENvbXB1dGUgdGhlIGNvbnRT
ZXQgYW5kIGNhbGxJbmZvIGZvciBlYWNoIGZ1bmN0aW9uLg0KCSAgICAgKiBUaGUgY29udFNldCBp
cyBhbiBvdmVyLWFwcHJveGltYXRpb24gdG8gdGhlIHNldCBvZiBjb250aW51YXRpb25zDQoJICAg
ICAqIHdpdGggd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4NCgkgICAgICogVGhlIGNhbGxJ
bmZvIHRlbGxzIGF0IGhvdyBtYW55IHBsYWNlcyBvdXRzaWRlIG9mIGl0c2VsZiBlYWNoDQoJICAg
ICAqIGZ1bmN0aW9uIGlzIGNhbGxlZC4NCgkgICAgICopDQoJICAgIHZhbCBfID0gQ29udFNldC5h
ZGRNYWluICgjY29udFNldCAoZnVuY0luZm8gbWFpbikpDQoJICAgIHZhbCBfID0NCgkgICAgICAg
TGlzdC5mb3JlYWNoDQoJICAgICAgIChmdW5jdGlvbnMsIGZuIHtuYW1lLCBib2R5LCAuLi59ID0+
DQoJCWxldCB2YWwge2NhbGxJbmZvLCBjb250U2V0ID0gYywgLi4ufSA9IGZ1bmNJbmZvIG5hbWUN
CgkJaW4gRXhwLmZvcmVhY2hDYWxsDQoJCSAgIChib2R5LCBmbiB7ZnVuYywgY29udCwgLi4ufSA9
Pg0KCQkgICAgaWYgRnVuYy5lcXVhbHMobmFtZSwgZnVuYykNCgkJICAgICAgIHRoZW4NCgkJCSAg
Y2FzZSBjb250IG9mDQoJCQkgICAgIE5PTkUgPT4gKCkNCgkJCSAgIHwgU09NRSBfID0+IChjYWxs
SW5mbyA6PSBDYWxsSW5mby5Ob3RDb250DQoJCQkJCTsgQ29udFNldC5tYWtlVG9wIGMpDQoJCSAg
ICBlbHNlDQoJCSAgICAgICBsZXQNCgkJCSAgdmFsIHtjYWxsZXJzLCBjYWxsSW5mbyA9IGNhbGxJ
bmZvJywgY29udFNldCA9IGMnLCAuLi59ID0NCgkJCSAgICAgZnVuY0luZm8gZnVuYw0KCQkJICB2
YWwgXyA9DQoJCQkgICAgIGxldA0KCQkJCWRhdGF0eXBlIHogPSBkYXRhdHlwZSBDYWxsSW5mby50
DQoJCQkgICAgIGluIGNhc2UgIWNhbGxJbmZvJyBvZg0KCQkJCU5vT3V0ZXJDYWxscyA9PiBjYWxs
SW5mbycgOj0gT25lT3V0ZXJDYWxsDQoJCQkgICAgICB8IE9uZU91dGVyQ2FsbCA9PiBjYWxsSW5m
bycgOj0gTm90Q29udA0KCQkJICAgICAgfCBOb3RDb250ID0+ICgpDQoJCQkgICAgIGVuZA0KCQkJ
ICB2YWwgXyA9IExpc3QucHVzaCAoY2FsbGVycywgbmFtZSkNCgkJICAgICAgIGluIGNhc2UgY29u
dCBvZg0KCQkJICBOT05FID0+IENvbnRTZXQuPD0gKGMsIGMnKQ0KCQkJKCogQ29udFNldC5hZGRS
ZXR1cm4gKGMsIG5hbWUpICopDQoJCQl8IFNPTUUgaiA9PiBDb250U2V0LmFkZEp1bXAgKGMnLCBq
KQ0KCQkgICAgICAgZW5kKQ0KCQllbmQpDQoNCigqIGZsdWV0ICsgKikNCgkgICAgdmFsIHtnZXRf
cmNvbnRfZiwgZ2V0X3Jjb250X2p9ID0gUkNvbnQuYW5hbHl6ZSB7cHJvZ3JhbSA9IHByb2dyYW19
DQoNCgkgICAgKCogUmVjb3JkIGZvciBlYWNoIGp1bXAgdGhlIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0
IGJlIHR1cm5lZCBpbnRvDQoJICAgICAqIGNvbnRpbnVhdGlvbnMgYXMgaXRzIHByZWZpeGVzLg0K
CSAgICAgKiBSZWNvcmQgZm9yIGVhY2ggZnVuY3Rpb24gdGhlIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0
IHByZWZpeCBpdHMNCgkgICAgICogcmV0dXJuLg0KCSAgICAgKikNCgkgICAgdmFsIHtnZXQgPSBq
dW1wSW5mbzogSnVtcC50IC0+DQoJCSB7cG9zc2libGVQcmVmaXhlczogRnVuYy50IGxpc3QgcmVm
LA0KCQkgIHByZWZpeGVzOiBGdW5jLnQgbGlzdCBvcHRpb24gcmVmfX0gPQ0KCSAgICAgICBQcm9w
ZXJ0eS5nZXQgKEp1bXAucGxpc3QsDQoJCQkgICAgIFByb3BlcnR5LmluaXRGdW4NCgkJCSAgICAg
KGZuIF8gPT4ge3Bvc3NpYmxlUHJlZml4ZXMgPSByZWYgW10sDQoJCQkJICAgICAgIHByZWZpeGVz
ID0gcmVmIE5PTkV9KSkNCgkgICAgdmFsIHRvZG8gPSByZWYgW10NCgkgICAgdmFsIF8gPQ0KCSAg
ICAgICBMaXN0LmZvcmVhY2gNCgkgICAgICAgKGZ1bmN0aW9ucywgZm4ge25hbWUsIC4uLn0gPT4N
CgkJbGV0DQoJCSAgIGZ1biBkb2l0IChwb3NzaWJsZVByZWZpeGVzLCBwcmVmaXhlcykgPQ0KCQkg
ICAgICBsZXQNCgkJCSB2YWwgXyA9DQoJCQkgICAgY2FzZSAhcG9zc2libGVQcmVmaXhlcyBvZg0K
CQkJICAgICAgIFtdID0+IExpc3QucHVzaCAodG9kbywNCgkJCQkJCShwb3NzaWJsZVByZWZpeGVz
LCBwcmVmaXhlcykpDQoJCQkgICAgIHwgXyA9PiAoKQ0KCQkgICAgICBpbiBMaXN0LnB1c2ggKHBv
c3NpYmxlUHJlZml4ZXMsIG5hbWUpDQoJCSAgICAgIGVuZA0KDQooKiBmbHVldCArICopDQoJCSAg
IGZ1biBkb2l0X25ldyAoKQ0KCQkgICAgID0gKGNhc2UgUkNvbnQucmNvbnQgKGdldF9yY29udF9m
IG5hbWUpDQoJCQkgIG9mIFJDb250LkJvdCA9PiAoKQ0KCQkgICAgICAgICAgIHwgUkNvbnQuTGFi
ZWwgKFJDb250LkZ1bmNMYWJlbCBmKQ0KCQkgICAgICAgICAgID0+IGlmIEZ1bmMuZXF1YWxzKGYs
IG5hbWUpDQoJCQkJdGhlbiAoKQ0KCQkJCWVsc2UgbGV0IA0KCQkJCSAgICAgICB2YWwge3Bvc3Np
YmxlUHJlZml4ZXMsIHByZWZpeGVzLCAuLi59IA0KCQkJCQkgPSBmdW5jSW5mbyBmDQoJCQkJICAg
ICBpbiBkb2l0IChwb3NzaWJsZVByZWZpeGVzLCBwcmVmaXhlcykNCgkJCQkgICAgIGVuZA0KCQkg
ICAgICAgICAgIHwgUkNvbnQuTGFiZWwgKFJDb250Lkp1bXBMYWJlbCBqKQ0KCQkJICAgPT4gbGV0
IA0KCQkJCXZhbCB7cG9zc2libGVQcmVmaXhlcywgcHJlZml4ZXMsIC4uLn0gDQoJCQkJICA9IGp1
bXBJbmZvIGoNCgkJCSAgICAgIGluIGRvaXQgKHBvc3NpYmxlUHJlZml4ZXMsIHByZWZpeGVzKQ0K
CQkJICAgICAgZW5kKQ0KDQooKiBmbHVldCArICopDQoJCSAgIGZ1biBkb2l0X2NvbnQgKCkNCgkJ
ICAgICA9IChjYXNlIENvbnRTZXQuc2V0ICgjY29udFNldChmdW5jSW5mbyBuYW1lKSkgb2YNCgkJ
CUNvbnRTZXQuT25lIGogPT4gDQoJCQkgICBsZXQgdmFsIHtwb3NzaWJsZVByZWZpeGVzLCBwcmVm
aXhlcywgLi4ufSANCgkJCSAgICAgICAgID0ganVtcEluZm8gag0KCQkJICAgaW4gZG9pdCAocG9z
c2libGVQcmVmaXhlcywgcHJlZml4ZXMpDQoJCQkgICBlbmQNCgkJICAgICAgfCBDb250U2V0LlJl
dHVybiBmID0+DQoJCQkgICBsZXQgdmFsIHtwb3NzaWJsZVByZWZpeGVzLCBwcmVmaXhlcywgLi4u
fSANCgkJCSAgICAgPSBmdW5jSW5mbyBmDQoJCQkgICBpbiBkb2l0IChwb3NzaWJsZVByZWZpeGVz
LCBwcmVmaXhlcykNCgkJCSAgIGVuZA0KCQkgICAgICB8IF8gPT4gKCkpDQoNCigqIGZsdWV0ICsg
KikNCgkJaW4gY2FzZSBzdHJhdGVneSBvZiANCgkJICAgQ29udHJvbC5Db250ID0+IGRvaXRfY29u
dCAoKQ0KCQkgfCBDb250cm9sLkJvdGggPT4gZG9pdF9jb250ICgpDQoJCSB8IENvbnRyb2wuTmV3
ID0+IGRvaXRfbmV3ICgpDQoJCSB8IF8gPT4gKCkNCgkJZW5kKQ0KDQooKiBmbHVldCAtICopDQoo
Kg0KCQkgICB2YWwge2NvbnRTZXQsIC4uLn0gPSBmdW5jSW5mbyBuYW1lDQoJCWluIGNhc2UgQ29u
dFNldC5zZXQgY29udFNldCBvZg0KCQkgICBDb250U2V0Lk9uZSBqID0+IA0KCQkgICAgICBsZXQg
dmFsIHtwb3NzaWJsZVByZWZpeGVzLCBwcmVmaXhlcywgLi4ufSA9IGp1bXBJbmZvIGoNCgkJICAg
ICAgaW4gZG9pdCAocG9zc2libGVQcmVmaXhlcywgcHJlZml4ZXMpDQoJCSAgICAgIGVuZA0KCQkg
fCBDb250U2V0LlJldHVybiBmID0+DQoJCSAgICAgIGxldCB2YWwge3Bvc3NpYmxlUHJlZml4ZXMs
IHByZWZpeGVzLCAuLi59ID0gZnVuY0luZm8gZg0KCQkJICB2YWwgXyA9IHByaW50ICJDb250U2V0
LlJldHVybiBmIg0KCQkgICAgICBpbiBkb2l0IChwb3NzaWJsZVByZWZpeGVzLCBwcmVmaXhlcykN
CgkJICAgICAgZW5kDQoJCSB8IF8gPT4gKCkNCgkJZW5kKQ0KKikNCg0KCSAgICAoKiBTdHJvbmds
eSBjb25uZWN0ZWQgY29tcG9uZW50cyBvZiBhIGdyb3VwIG9mIGZ1bmN0aW9ucy4gKikNCgkgICAg
ZnVuIHNjY3MgKGZzOiBGdW5jLnQgbGlzdCkgPQ0KCSAgICAgICBsZXQNCgkJICB2YWwgZyA9IEdy
YXBoLm5ldyAoKQ0KCQkgIHZhbCB7Z2V0ID0gbm9kZUZ1bmMsIHNldCA9IHNldE5vZGVGdW5jfSA9
DQoJCSAgICAgUHJvcGVydHkuZ2V0U2V0T25jZQ0KCQkgICAgIChOb2RlLnBsaXN0LCBQcm9wZXJ0
eS5pbml0UmFpc2UgKCJmdW5jIiwgTm9kZS5sYXlvdXQpKQ0KCQkgICB2YWwgXyA9DQoJCSAgICAg
IExpc3QuZm9yZWFjaCAoZnMsIGZuIGYgPT4NCgkJCQkgICAgbGV0IHZhbCB7bm9kZSwgLi4ufSA9
IGZ1bmNJbmZvIGYNCgkJCQkgICAgICAgdmFsIG4gPSBHcmFwaC5uZXdOb2RlIGcNCgkJCQkgICAg
ICAgdmFsIF8gPSBzZXROb2RlRnVuYyAobiwgZikNCgkJCQkgICAgICAgdmFsIF8gPSBub2RlIDo9
IFNPTUUgbg0KCQkJCSAgICBpbiAoKQ0KCQkJCSAgICBlbmQpDQoJCSAgICgqIEJ1aWxkIHRoZSBj
YWxsIGdyYXBoLg0KCQkgICAgKiBFZGdlcyBnbyBmcm9tIG5vZGVzIHRvIHRoZSBjYWxsZXJzLg0K
CQkgICAgKikNCgkJICAgdmFsIF8gPQ0KCQkgICAgICBMaXN0LmZvcmVhY2gNCgkJICAgICAgKGZz
LCBmbiBmID0+DQoJCSAgICAgICBsZXQgdmFsIHtub2RlLCBjYWxsZXJzLCAuLi59ID0gZnVuY0lu
Zm8gZg0KCQkJICB2YWwgZnJvbSA9IHZhbE9mICghbm9kZSkNCgkJICAgICAgIGluIExpc3QuZm9y
ZWFjaA0KCQkJICAoIWNhbGxlcnMsIGZuIGYnID0+DQoJCQkgICBsZXQgdmFsIHtub2RlLCAuLi59
ID0gZnVuY0luZm8gZicNCgkJCSAgIGluIGNhc2UgIW5vZGUgb2YNCgkJCSAgICAgIE5PTkUgPT4g
KCkNCgkJCSAgICB8IFNPTUUgdG8gPT4NCgkJCQkgKEdyYXBoLmFkZEVkZ2UgKGcsIHtmcm9tID0g
ZnJvbSwgdG8gPSB0b30pDQoJCQkJICA7ICgpKQ0KCQkJICAgZW5kKQ0KCQkgICAgICAgZW5kKQ0K
CQkgICB2YWwgXyA9IExpc3QuZm9yZWFjaCAoZnMsIGZuIGYgPT4gI25vZGUgKGZ1bmNJbmZvIGYp
IDo9IE5PTkUpDQoJCSAgIHZhbCBuc3MgPSBHcmFwaC5zdHJvbmdseUNvbm5lY3RlZENvbXBvbmVu
dHMgZw0KCSAgICAgICBpbiBMaXN0Lm1hcCAobnNzLCBmbiBucyA9PiBMaXN0LnJldk1hcCAobnMs
IG5vZGVGdW5jKSkNCgkgICAgICAgZW5kDQoJICAgIA0KCSAgICAoKiBGb3IgZWFjaCBjb2xsZWN0
aW9uIG9mIGZ1bmN0aW9ucyB0aGF0IGFyZSBnb2luZyB0byBwcmVmaXggYSBjb250LA0KCSAgICAg
KiBkbyBhIHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnRzIGNvbXB1dGF0aW9uLiAgSW4gb3Jk
ZXIgZm9yIHRoZQ0KCSAgICAgKiBmdW5jdGlvbnMgdG8gYmUgY29udGlmaWVkLCB0aGVyZSBjYW4g
YmUgYXQgbW9zdCBvbmUgZnVuY3Rpb24gaW4NCgkgICAgICogZWFjaCBjb21wb25lbnQgdGhhdCBp
cyBjYWxsZWQgZnJvbSBvdXRzaWRlLiAgVGhpcyBpcyBkdWUgdG8gdGhlDQoJICAgICAqIGZhY3Qg
dGhhdCBtdXR1YWxseSByZWN1cnNpdmUgY29udGludWF0aW9ucyBjYW5ub3QgYmUgZGlyZWN0bHkN
CgkgICAgICogZGVjbGFyZWQgaW4gQ1BTIC0tIHRoZSBvbmx5IHdheSB0byBkbyBzbyBpcyB0byBu
ZXN0IG9uZSB3aXRoaW4gdGhlDQoJICAgICAqIG90aGVyLiAgVGh1cyBvbmx5IG9uZSBjYW4gYmUg
ImV4cG9ydGVkIi4NCgkgICAgICopDQoJICAgIGV4Y2VwdGlvbiBOb3BlDQoJICAgICgqIHNjY0hl
YWRzIHJldHVybnMgdGhlIGhlYWQgZnVuY3Rpb24gZm9yIGVhY2ggc2NjIGluIHRoZSBsaXN0IG9m
DQoJICAgICAqIGZ1bmN0aW9ucy4gIEl0IHJhaXNlcyBOb3BlIGlmIHRoZXJlIGlzIGFuIHNjYyB3
aXRoIG1vcmUgdGhhbiBvbmUNCgkgICAgICogZnVuY3Rpb24gY2FsbGVkIGZyb20gb3V0c2lkZSB0
aGUgc2NjLg0KCSAgICAgKikNCgkgICAgZnVuIHNjY0hlYWRzIChmczogRnVuYy50IGxpc3QpOiBG
dW5jLnQgbGlzdCA9DQoJICAgICAgIExpc3QubWFwDQoJICAgICAgIChzY2NzIGZzLCBmbiBmcyA9
Pg0KCQlsZXQNCgkJICAgZnVuIHNldExvY2FsIGIgPQ0KCQkgICAgICBMaXN0LmZvcmVhY2ggKGZz
LCBmbiBmID0+ICNpc0xvY2FsIChmdW5jSW5mbyBmKSA6PSBiKQ0KCQkgICB2YWwgXyA9IHNldExv
Y2FsIHRydWUNCgkJICAgdmFsIG91dHNpZGVDYWxsZXIgPSByZWYgTk9ORQ0KCQkgICB2YWwgXyA9
DQoJCSAgICAgIExpc3QuZm9yZWFjaA0KCQkgICAgICAoZnMsIGZuIGYgPT4NCgkJICAgICAgIGxl
dCB2YWwge2NhbGxlcnMsIC4uLn0gPSBmdW5jSW5mbyBmDQoJCSAgICAgICBpbiBpZiBMaXN0LmV4
aXN0cyAoIWNhbGxlcnMsIGZuIGYgPT4NCgkJCQkJICBub3QgKCEoI2lzTG9jYWwgKGZ1bmNJbmZv
IGYpKSkpDQoJCQkgICAgIHRoZW4gKGNhc2UgIW91dHNpZGVDYWxsZXIgb2YNCgkJCQkgICAgICBT
T01FIF8gPT4gcmFpc2UgTm9wZQ0KCQkJCSAgICB8IE5PTkUgPT4gb3V0c2lkZUNhbGxlciA6PSBT
T01FIGYpDQoJCQkgIGVsc2UgKCkNCgkJICAgICAgIGVuZCkNCgkJICAgdmFsIF8gPSBzZXRMb2Nh
bCBmYWxzZQ0KCQlpbiBjYXNlICFvdXRzaWRlQ2FsbGVyIG9mDQoJCSAgIE5PTkUgPT4gRXJyb3Iu
YnVnICJubyBvdXRzaWRlIGNhbGxlciINCgkJIHwgU09NRSBmID0+DQoJCSAgICAgIGxldA0KCQkJ
IHZhbCB7bmVzdGVkLCAuLi59ID0gZnVuY0luZm8gZg0KCQkJIHZhbCByZXN0ID0gTGlzdC5yZW1v
dmVGaXJzdCAoZnMsIGZuIGYnID0+DQoJCQkJCQkgICAgICBGdW5jLmVxdWFscyAoZiwgZicpKQ0K
CQkJIHZhbCBfID0gbmVzdGVkIDo9IHNjY0hlYWRzIHJlc3QNCgkJICAgICAgaW4gZg0KCQkgICAg
ICBlbmQNCgkJZW5kKQ0KCSAgICB2YWwgXyA9DQoJICAgICAgIExpc3QuZm9yZWFjaA0KCSAgICAg
ICAoIXRvZG8sIGZuIChwb3NzaWJsZVByZWZpeGVzLCBwcmVmaXhlcykgPT4NCgkJbGV0DQoJCSAg
IHZhbCBmcyA9ICFwb3NzaWJsZVByZWZpeGVzDQoJCSAgIHZhbCBfID0gcHJlZml4ZXMgOj0gU09N
RSAoc2NjSGVhZHMgZnMpDQoJCSAgIHZhbCBfID0gTGlzdC5mb3JlYWNoIChmcywgZm4gZiA9Pg0K
CQkJCQkgI2NhblByZWZpeCAoZnVuY0luZm8gZikgOj0gdHJ1ZSkNCgkJaW4gKCkNCgkJZW5kIGhh
bmRsZSBOb3BlID0+ICgpKQ0KCSAgICAoKiBEaWFnbm9zdGljcy4gKikNCgkgICAgdmFsIF8gPQ0K
CSAgICAgICBpZiBmYWxzZQ0KCQkgIHRoZW4gDQoJCSAgICAgbGV0DQooKiBmbHVldCAtICopDQoo
KiBPTEQgRElBR05PU1RJQ1MgKikNCigqDQoJCQl2YWwgXyA9DQoJCQkgICBQcm9ncmFtLmxheW91
dHMNCgkJCSAgIChwcm9ncmFtLCBmbiBsID0+IA0KCQkJICAgIChMYXlvdXQub3V0cHV0IChsLCBP
dXQuZXJyb3IpDQoJCQkgICAgIDsgT3V0Lm5ld2xpbmUgT3V0LmVycm9yKSkNCgkJCXZhbCBvbGQg
PSByZWYgMA0KCQkJdmFsIG5ldyA9IHJlZiAwDQoJCQl2YWwgbmV3Tm8gPSByZWYgMA0KCQkJdmFs
IHNhbWUgPSByZWYgMA0KCQkJdmFsIHNhbWVObyA9IHJlZiAwDQoNCgkJCXZhbCBuZXdlciA9IHJl
ZiAwDQoJCSAgICAgaW4gTGlzdC5mb3JlYWNoDQoJCQkoZnVuY3Rpb25zLCBmbiB7bmFtZSwgLi4u
fSA9Pg0KCQkJIGxldA0KCQkJICAgIHZhbCB7Y2FsbEluZm8sIGNhblByZWZpeCwgY29udFNldCwg
Li4ufSA9IGZ1bmNJbmZvIG5hbWUNCgkJCSAgICBmdW4gZG9pdCAociwgcykgPQ0KCQkJICAgICAg
IChJbnQuaW5jIHINCgkJCQk7IGlmIHRydWUNCgkJCQkgICAgIHRoZW4gcHJpbnQgKGNvbmNhdCBb
cywgIiAiLA0KCQkJCQkJCSBGdW5jLnRvU3RyaW5nIG5hbWUsICJcbiJdKQ0KCQkJCSAgZWxzZSAo
KSkNCgkJCSAgICBkYXRhdHlwZSB6ID0gZGF0YXR5cGUgQ2FsbEluZm8udA0KCQkJICAgIGRhdGF0
eXBlIHogPSBkYXRhdHlwZSBDb250U2V0LnNldA0KCQkJIGluIGNhc2UgKCFjYWxsSW5mbywgQ29u
dFNldC5zZXQgY29udFNldCkgb2YNCgkJCSAgICAoT25lT3V0ZXJDYWxsLCBPbmUgXykgPT4NCgkJ
CSAgICAgICBpZiAhY2FuUHJlZml4DQoJCQkJICB0aGVuIGRvaXQgKHNhbWUsICJzYW1lIikNCgkJ
CSAgICAgICBlbHNlIGRvaXQgKHNhbWVObywgInNhbWVObyIpDQoJCQkgIHwgKE9uZU91dGVyQ2Fs
bCwgXykgPT4gZG9pdCAob2xkLCAib2xkIikNCgkJCSAgfCAoXywgT25lIF8pID0+DQoJCQkgICAg
ICAgaWYgIWNhblByZWZpeA0KCQkJCSAgdGhlbiBkb2l0IChuZXcsICJuZXciKQ0KCQkJICAgICAg
IGVsc2UgZG9pdCAobmV3Tm8sICJuZXdObyIpDQoJCQkgIHwgXyA9PiAoKQ0KCQkJIGVuZCkNCgkJ
CTsgcHJpbnQgKGNvbmNhdA0KCQkJCSBbIm51bSBmdW5jdGlvbnMgIiwNCgkJCQkgIEludC50b1N0
cmluZyAoTGlzdC5sZW5ndGggZnVuY3Rpb25zKSwNCgkJCQkgICIgIHNhbWUgIiwgSW50LnRvU3Ry
aW5nICghc2FtZSksDQoJCQkJICAiICBzYW1lTm8gIiwgSW50LnRvU3RyaW5nICghc2FtZU5vKSwN
CgkJCQkgICIgIG51bSBuZXcgIiwgSW50LnRvU3RyaW5nICghbmV3KSwNCgkJCQkgICIgIG51bSBu
ZXdObyAiLCBJbnQudG9TdHJpbmcgKCFuZXdObyksDQoJCQkJICAiICBudW0gb2xkICIsIEludC50
b1N0cmluZyAoIW9sZCksDQoJCQkJICAiXG4iXSkNCiopDQoNCigqIGZsdWV0ICsgKikNCigqIE5F
VyBESUFHTk9TVElDUyAqKQ0KDQoJCSAgICAgICAgdmFsIGNwcyA9IGZhbHNlDQoJCSAgICAgICAg
dmFsIGV4dHJhID0gZmFsc2UNCigqIHByaW50IG91dCBlbnRpcmUgY3BzIElMICopDQoNCgkJCXZh
bCBfDQoJCQkgID0gaWYgY3BzDQoJCQkgICAgICB0aGVuIFByb2dyYW0ubGF5b3V0cw0KCQkJCSAg
IChwcm9ncmFtLCANCgkJCQkgICAgZm4gbCA9PiAoTGF5b3V0Lm91dHB1dCAobCwgT3V0LmVycm9y
KQ0KCQkJCQkgICAgIDsgT3V0Lm5ld2xpbmUgT3V0LmVycm9yKSkNCgkJCSAgICAgIGVsc2UgKCkN
Cg0KCQkJdmFsIGNhbGxfY29udF9uZXcgPSByZWYgMA0KCQkJdmFsIGNhbGxfY29udCA9IHJlZiAw
DQoJCQl2YWwgY2FsbF9uZXcgPSByZWYgMA0KCQkJdmFsIGNvbnRfbmV3ID0gcmVmIDANCgkJCXZh
bCBjYWxsID0gcmVmIDANCgkJCXZhbCBjb250ID0gcmVmIDANCgkJCXZhbCBuZXcgPSByZWYgMA0K
CQkgICAgIGluIExpc3QuZm9yZWFjaA0KCQkJKGZ1bmN0aW9ucywgZm4ge25hbWUsIC4uLn0gPT4N
CgkJCSBsZXQNCgkJCSAgICB2YWwge2NhbGxJbmZvLCBjYW5QcmVmaXgsIGNvbnRTZXQsIC4uLn0g
DQoJCQkgICAgICA9IGZ1bmNJbmZvIG5hbWUNCgkJCSAgICB2YWwgcmNvbnQgPSBnZXRfcmNvbnRf
ZiBuYW1lDQoNCigqIHByaW50IG91dCB0aGUgcmNvbnQgZm9yIGVhY2ggZnVuY3Rpb24gKikNCigq
IHByaW50IG91dCB0aGUgY29udCBzZXQgZm9yIGVhY2ggZnVuY3Rpb24gKikNCgkJCSAgICB2YWwg
XyANCgkJCSAgICAgID0gaWYgZXh0cmENCgkJCQkgIHRoZW4gKHByaW50IChjb25jYXQgW0Z1bmMu
dG9TdHJpbmcgbmFtZSwNCgkJCQkJCSAgICAgICAiIDogIiwNCgkJCQkJCSAgICAgICBSQ29udC50
b1N0cmluZyByY29udCwNCgkJCQkJCSAgICAgICAiXG4iXSk7DQoJCQkJCXByaW50IChjb25jYXQg
W0Z1bmMudG9TdHJpbmcgbmFtZSwNCgkJCQkJCSAgICAgICAiIDogIiwNCgkJCQkJCSAgICAgICBD
b250U2V0LnRvU3RyaW5nIA0KCQkJCQkJICAgICAgIChDb250U2V0LnNldCBjb250U2V0KSwNCgkJ
CQkJCSAgICAgICAiXG4iXSkpDQoJCQkJICBlbHNlICgpDQoNCgkJCSAgICBmdW4gZG9pdCAociwg
cykgPQ0KCQkJICAgICAgIChJbnQuaW5jIHINCgkJCQk7IGlmIGV4dHJhDQoJCQkJICAgICB0aGVu
IHByaW50IChjb25jYXQgW3MsIA0KCQkJCQkJCSAiICIsDQoJCQkJCQkJIEZ1bmMudG9TdHJpbmcg
bmFtZSwgDQoJCQkJCQkJICJcbiJdKQ0KCQkJCSAgZWxzZSAoKSkNCg0KCQkJICAgIGRhdGF0eXBl
IHogPSBkYXRhdHlwZSBDYWxsSW5mby50DQoJCQkgICAgZGF0YXR5cGUgeiA9IGRhdGF0eXBlIENv
bnRTZXQuc2V0DQoJCQkgICAgZGF0YXR5cGUgeiA9IGRhdGF0eXBlIFJDb250LnJjb250IA0KDQoJ
CQkgICAgdmFsIGNhbl9jYWxsID0gY2FzZSAhY2FsbEluZm8NCgkJCQkJICAgICBvZiBPbmVPdXRl
ckNhbGwgPT4gdHJ1ZQ0KCQkJCQkgICAgICB8IF8gPT4gZmFsc2UNCgkJCSAgICB2YWwgY2FuX2Nv
bnQgPSBjYXNlIENvbnRTZXQuc2V0IGNvbnRTZXQNCgkJCQkJICAgICBvZiBPbmUgXyA9PiB0cnVl
DQoJCQkJCSAgICAgIHwgXyA9PiBmYWxzZSANCgkJCSAgICB2YWwgcmVtX2NvbnQgPSBjYXNlIENv
bnRTZXQuc2V0IGNvbnRTZXQNCgkJCQkJICAgICBvZiBFbXB0eSA9PiB0cnVlDQoJCQkJCSAgICAg
IHwgXyA9PiBmYWxzZQ0KCQkJICAgIHZhbCBjYW5fbmV3ID0gbm90IChSQ29udC5pc1RvcCByY29u
dCkNCgkJCSAgICAgICAgICAgICAgICAgIGFuZGFsc28NCgkJCQkJICBub3QgKFJDb250LmlzQm90
IHJjb250KQ0KCQkJICAgIHZhbCByZW1fbmV3ID0gUkNvbnQuaXNCb3QgcmNvbnQNCgkJCSBpbiBj
YXNlIChjYW5fY2FsbCwgY2FuX2NvbnQsIGNhbl9uZXcpDQoJCQkgICAgICBvZiAodHJ1ZSwgdHJ1
ZSwgdHJ1ZSkgDQoJCQkgICAgICAgPT4gZG9pdChjYWxsX2NvbnRfbmV3LCAiY2FsbF9jb250X25l
dyIpDQoJCQkgICAgICAgfCAodHJ1ZSwgdHJ1ZSwgZmFsc2UpIA0KCQkJICAgICAgID0+IGRvaXQo
Y2FsbF9jb250LCAiY2FsbF9jb250IikNCgkJCSAgICAgICB8ICh0cnVlLCBmYWxzZSwgdHJ1ZSkg
DQoJCQkgICAgICAgPT4gZG9pdChjYWxsX25ldywgImNhbGxfbmV3IikNCgkJCSAgICAgICB8ICh0
cnVlLCBmYWxzZSwgZmFsc2UpIA0KCQkJICAgICAgID0+IGRvaXQoY2FsbCwgImNhbGwiKQ0KCQkJ
ICAgICAgIHwgKGZhbHNlLCB0cnVlLCB0cnVlKSANCgkJCSAgICAgICA9PiBkb2l0KGNvbnRfbmV3
LCAiY29udF9uZXciKQ0KCQkJICAgICAgIHwgKGZhbHNlLCB0cnVlLCBmYWxzZSkgDQoJCQkgICAg
ICAgPT4gZG9pdChjb250LCAiY29udCIpDQoJCQkgICAgICAgfCAoZmFsc2UsIGZhbHNlLCB0cnVl
KSANCgkJCSAgICAgICA9PiBkb2l0KG5ldywgIm5ldyIpDQoJCQkgICAgICAgfCAoZmFsc2UsIGZh
bHNlLCBmYWxzZSkgPT4gKCkNCgkJCSBlbmQpDQoJCQk7IHByaW50IChjb25jYXQNCgkJCQkgWyJm
dW5jdGlvbnM6ICIsDQoJCQkJICBJbnQudG9TdHJpbmcgKExpc3QubGVuZ3RoIGZ1bmN0aW9ucyks
DQoJCQkJICAiICBjYWxsX2NvbnRfbmV3OiAiLCANCgkJCQkgIEludC50b1N0cmluZyAoIWNhbGxf
Y29udF9uZXcpLA0KCQkJCSAgIiAgY2FsbF9jb250OiAiLCANCgkJCQkgIEludC50b1N0cmluZyAo
IWNhbGxfY29udCksDQoJCQkJICAiICBjYWxsX25ldzogIiwNCgkJCQkgIEludC50b1N0cmluZyAo
IWNhbGxfbmV3KSwNCgkJCQkgICIgIGNvbnRfbmV3OiAiLCANCgkJCQkgIEludC50b1N0cmluZyAo
IWNvbnRfbmV3KSwNCgkJCQkgICIgIGNhbGw6ICIsIA0KCQkJCSAgSW50LnRvU3RyaW5nICghY2Fs
bCksDQoJCQkJICAiICBjb250OiAiLCANCgkJCQkgIEludC50b1N0cmluZyAoIWNvbnQpLA0KCQkJ
CSAgIiAgbmV3OiAiLCANCgkJCQkgIEludC50b1N0cmluZyAoIW5ldyksDQoJCQkJICAiXG4iXSkN
CgkJICAgICBlbmQNCgkgICAgICAgZWxzZSAoKQ0KCSAgICAoKiBGb3IgZnVuY3Rpb25zIHR1cm5l
ZCBpbnRvIGNvbnRpbnVhdGlvbnMsIHJlY29yZCB0aGVpcg0KCSAgICAgKiBhcmdzLCBib2R5LCBh
bmQgbmV3IG5hbWUuDQoJICAgICAqKQ0KCSAgICB2YWwgXyA9DQoJICAgICAgIExpc3QuZm9yZWFj
aA0KCSAgICAgICAoZnVuY3Rpb25zLCBmbiB7bmFtZSwgYXJncywgYm9keSwgLi4ufSA9Pg0KCQls
ZXQgdmFsIHtjYWxsSW5mbywgY2FuUHJlZml4LCByZXBsYWNlLCAuLi59ID0gZnVuY0luZm8gbmFt
ZQ0KCQkgICB2YWwgb25lQ2FsbCA9DQoJCSAgICAgIGNhc2UgIWNhbGxJbmZvIG9mDQoJCQkgQ2Fs
bEluZm8uT25lT3V0ZXJDYWxsID0+IHRydWUNCgkJICAgICAgIHwgXyA9PiBmYWxzZQ0KCQkgICB2
YWwgb25lQ29udCA9ICFjYW5QcmVmaXgNCgkJaW4gaWYgKGNhc2Ugc3RyYXRlZ3kgb2YNCgkJCSAg
Q29udHJvbC5Cb3RoID0+IG9uZUNhbGwgb3JlbHNlIG9uZUNvbnQNCgkJCXwgQ29udHJvbC5DYWxs
ID0+IG9uZUNhbGwNCgkJCXwgQ29udHJvbC5Db250ID0+IG9uZUNvbnQNCg0KKCogZmx1ZXQgKyAq
KQ0KCQkJfCBDb250cm9sLk5ldyA9PiBvbmVDb250DQoJCQl8IENvbnRyb2wuTm9uZSA9PiBmYWxz
ZSkNCgkJICAgICAgdGhlbg0KCQkJIHJlcGxhY2UgOj0NCgkJCSBTT01FIHthcmdzID0gYXJncywN
CgkJCSAgICAgICBib2R5ID0gYm9keSwNCgkJCSAgICAgICBqdW1wID0gSnVtcC5uZXdTdHJpbmcg
KEZ1bmMub3JpZ2luYWxOYW1lIG5hbWUpfQ0KCQkgICBlbHNlICgpDQoJCWVuZCkNCgkgICAgKCog
V2FsayBvdmVyIGFsbCBmdW5jdGlvbnMsIHJlbW92aW5nIHRob3NlIHRoYXQgYXJlbid0IHRvcGxl
dmVsLCBhbmQNCgkgICAgICogZGVzY2VuZGluZyB0aG9zZSB0aGF0IGFyZSwgaW5zZXJ0aW5nIGxv
Y2FsIGZ1bmN0aW9ucw0KCSAgICAgKiB3aGVyZSBuZWNlc3NhcnkuDQoJICAgICAqICAtIHR1cm4g
dGFpbCBjYWxscyBpbnRvIG5vbnRhaWwgY2FsbHMNCgkgICAgICogIC0gdHVybiByZXR1cm5zIGlu
dG8ganVtcHMNCgkgICAgICopDQoJICAgIGZ1biB3YWxrRXhwIChmOiBGdW5jLnQsIGU6IEV4cC50
LCBjOiBKdW1wLnQgb3B0aW9uKTogRXhwLnQgPQ0KCSAgICAgICBsZXQNCgkJICB2YWwge2RlY3Ms
IHRyYW5zZmVyfSA9IEV4cC5kZXN0IGUNCgkJICB2YWwgZGVjcyA9IA0KCQkgICAgIExpc3QuZm9s
ZA0KCQkgICAgIChyZXYgZGVjcywgW10sIGZuIChkLCBkcykgPT4NCgkJICAgICAgY2FzZSBkIG9m
DQoJCQkgQmluZCBfID0+IGQgOjogZHMNCgkJICAgICAgIHwgRnVuIHtuYW1lLCBhcmdzLCBib2R5
fSA9Pg0KCQkJICAgIEZ1biB7bmFtZSA9IG5hbWUsDQoJCQkJIGFyZ3MgPSBhcmdzLA0KCQkJCSBi
b2R5ID0gd2Fsa0V4cCAoZiwgYm9keSwgYyl9DQoJCQkgICAgOjogKGlmIChjYXNlIHN0cmF0ZWd5
IG9mDQoJCQkJICAgICAgIENvbnRyb2wuQm90aCA9PiB0cnVlDQoJCQkJICAgICB8IENvbnRyb2wu
Q29udCA9PiB0cnVlDQooKiBmbHVldCArICopDQoJCQkJICAgICB8IENvbnRyb2wuTmV3ID0+IHRy
dWUNCgkJCQkgICAgIHwgXyA9PiBmYWxzZSkNCgkJCQkgICB0aGVuDQoJCQkJICAgICAgbGV0IHZh
bCB7cHJlZml4ZXMsIC4uLn0gPSBqdW1wSW5mbyBuYW1lDQoJCQkJICAgICAgaW4gY2FzZSAhcHJl
Zml4ZXMgb2YNCgkJCQkJIE5PTkUgPT4gZHMNCgkJCQkgICAgICAgfCBTT01FIGZzID0+IG5lc3Qg
KGZzLCBTT01FIG5hbWUsIGRzKQ0KCQkJCSAgICAgIGVuZA0KCQkJCWVsc2UgZHMpDQoJCSAgICAg
ICB8IEhhbmRsZXJQdXNoIGggPT4gSGFuZGxlclB1c2ggaCA6OiBkcw0KCQkgICAgICAgfCBIYW5k
bGVyUG9wID0+IEhhbmRsZXJQb3AgOjogZHMpDQoJCSAgZnVuIG1ha2UgdHJhbnNmZXIgPSBFeHAu
bWFrZSB7ZGVjcyA9IGRlY3MsDQoJCQkJCQl0cmFuc2ZlciA9IHRyYW5zZmVyfQ0KCSAgICAgICBp
bg0KCQkgIGNhc2UgdHJhbnNmZXIgb2YNCgkJICAgICBDYWxsIHtmdW5jLCBhcmdzLCBjb250fSA9
Pg0KCQkJbGV0DQoJCQkgICB2YWwgbmV3Q29udDogSnVtcC50IG9wdGlvbiA9DQoJCQkgICAgICBj
YXNlIGNvbnQgb2YNCgkJCQkgTk9ORSA9PiBjDQoJCQkgICAgICAgfCBTT01FIF8gPT4gY29udA0K
CQkJICAgdmFsIHtjYWxsSW5mbywgY2FuUHJlZml4LCByZXBsYWNlLCAuLi59ID0NCgkJCSAgICAg
IGZ1bmNJbmZvIGZ1bmMNCgkJCWluDQoJCQkgICBjYXNlICFyZXBsYWNlIG9mDQoJCQkgICAgICBO
T05FID0+DQoJCQkJIG1ha2UgKENhbGwge2Z1bmMgPSBmdW5jLA0KCQkJCQkgICAgIGFyZ3MgPSBh
cmdzLA0KCQkJCQkgICAgIGNvbnQgPSBuZXdDb250fSkNCgkJCSAgICB8IFNPTUUge2p1bXAsIGFy
Z3MgPSBmb3JtYWxzLCBib2R5fSA9Pg0KCQkJCSBsZXQNCgkJCQkgICAgdmFsIGRlY3MgPQ0KCQkJ
CSAgICAgICBpZiAhY2FsbEluZm8gPSBDYWxsSW5mby5PbmVPdXRlckNhbGwNCgkJCQkJICBhbmRh
bHNvIG5vdCAoRnVuYy5lcXVhbHMgKGYsIGZ1bmMpKQ0KCQkJCQkgIGFuZGFsc28gKGNhc2Ugc3Ry
YXRlZ3kgb2YNCgkJCQkJCSAgICAgIENvbnRyb2wuQm90aCA9Pg0KCQkJCQkJCSBub3QgKCFjYW5Q
cmVmaXgpDQoJCQkJCQkgICAgfCBDb250cm9sLkNhbGwgPT4gdHJ1ZQ0KCQkJCQkJICAgIHwgXyA9
PiBmYWxzZSkNCgkJCQkJICB0aGVuDQoJCQkJCSAgICAgZGVjcw0KCQkJCQkgICAgIEAgW0Z1biB7
bmFtZSA9IGp1bXAsDQoJCQkJCQkgICAgIGFyZ3MgPSBmb3JtYWxzLA0KCQkJCQkJICAgICBib2R5
ID0gd2Fsa0V4cCAoZnVuYywgYm9keSwNCgkJCQkJCQkJICAgICBuZXdDb250KX1dDQoJCQkJCSAg
ICAgIA0KCQkJCSAgICAgICBlbHNlIGRlY3MNCgkJCQkgaW4NCgkJCQkgICAgRXhwLm1ha2UNCgkJ
CQkgICAge2RlY3MgPSBkZWNzLA0KCQkJCSAgICAgdHJhbnNmZXIgPSBKdW1wIHtkc3QgPSBqdW1w
LCBhcmdzID0gYXJnc319DQoJCQkJIGVuZA0KCQkJZW5kDQoJCSAgIHwgUmV0dXJuIHhzID0+DQoJ
CQltYWtlIChjYXNlIGMgb2YNCgkJCQkgTk9ORSA9PiB0cmFuc2Zlcg0KCQkJICAgICAgIHwgU09N
RSBjID0+IEp1bXAge2RzdCA9IGMsIGFyZ3MgPSB4c30pDQoJCSAgIHwgXyA9PiBtYWtlIHRyYW5z
ZmVyDQoJICAgICAgIGVuZA0KCSAgICBhbmQgbmVzdCAoZnM6IEZ1bmMudCBsaXN0LA0KCQkgICAg
ICBjb250OiBKdW1wLnQgb3B0aW9uLA0KCQkgICAgICBkczogRGVjLnQgbGlzdCk6IERlYy50IGxp
c3QgPQ0KCSAgICAgICBMaXN0LmZvbGQNCgkgICAgICAgKHJldiBmcywgZHMsIGZuIChmLCBkcykg
PT4NCgkJbGV0DQoJCSAgIHZhbCB7cmVwbGFjZSwgbmVzdGVkLCBwcmVmaXhlcywgLi4ufSA9IGZ1
bmNJbmZvIGYNCgkJICAgdmFsIGZzID0NCgkJICAgICAgY2FzZSAhcHJlZml4ZXMgb2YNCgkJCSBO
T05FID0+ICFuZXN0ZWQNCgkJICAgICAgIHwgU09NRSBmcyA9PiBMaXN0LmFwcGVuZFJldiAoZnMs
ICFuZXN0ZWQpDQoJCSAgIHZhbCB7anVtcCwgYXJncywgYm9keX0gPSB2YWxPZiAoIXJlcGxhY2Up
DQoJCSAgIHZhbCB7ZGVjcywgdHJhbnNmZXJ9ID0gRXhwLmRlc3QgKHdhbGtFeHAgKGYsIGJvZHks
IGNvbnQpKQ0KCQkgICB2YWwgYm9keSA9IEV4cC5tYWtlIHtkZWNzID0gbmVzdCAoIW5lc3RlZCwg
Y29udCwgZGVjcyksDQoJCQkJCXRyYW5zZmVyID0gdHJhbnNmZXJ9DQoJCWluIEZ1biB7bmFtZSA9
IGp1bXAsIGFyZ3MgPSBhcmdzLCBib2R5ID0gYm9keX0gOjogZHMNCgkJZW5kKQ0KDQoJICAgIHZh
bCBzaHJpbmtFeHAgPSBzaHJpbmtFeHAgZ2xvYmFscw0KCSAgICB2YWwgZnVuY3Rpb25zID0NCgkg
ICAgICAgTGlzdC5mb2xkDQoJICAgICAgIChmdW5jdGlvbnMsIFtdLCBmbiAoe25hbWUsIGFyZ3Ms
IGJvZHksIHJldHVybnN9LCBmdW5jdGlvbnMpID0+DQoJCWxldA0KCQkgICB2YWwge2NvbnRTZXQs
IHByZWZpeGVzLCByZXBsYWNlLCAuLi59ID0gZnVuY0luZm8gbmFtZQ0KCQkgICB2YWwgcmNvbnQg
PSBnZXRfcmNvbnRfZiBuYW1lDQoJCWluIGNhc2UgIXJlcGxhY2Ugb2YNCgkJICAgTk9ORSA9PiAN
CigqIGZsdWV0ICsgKikNCgkJICAgICAgaWYgKGNhc2Ugc3RyYXRlZ3kNCgkJCSAgICBvZiBDb250
cm9sLkNvbnQgPT4gQ29udFNldC5pc0VtcHR5IGNvbnRTZXQNCgkJCSAgICAgfCBDb250cm9sLkJv
dGggPT4gQ29udFNldC5pc0VtcHR5IGNvbnRTZXQNCgkJCSAgICAgfCBDb250cm9sLk5ldyA9PiBS
Q29udC5pc0JvdCByY29udA0KCQkJICAgICB8IF8gPT4gZmFsc2UpDQooKiBmbHVldCAtICopDQoo
Kg0KCQkgICAgICBpZiBDb250U2V0LmlzRW1wdHkgY29udFNldA0KKikNCgkJCSB0aGVuDQoJCQkg
ICAgKCogRG9uJ3QgaW5jbHVkZSBmdW5jdGlvbnMgdGhhdCBoYXZlIGFuIGVtcHR5IGNvbnQNCgkJ
CSAgICAgKiBzZXQsIGJlY2F1c2UgdGhleSBhcmVuJ3QgY2FsbGVkLg0KCQkJICAgICAqKQ0KCQkJ
ICAgIGZ1bmN0aW9ucw0KCQkgICAgICBlbHNlDQoJCQkgbGV0DQoJCQkgICAgdmFsIGJvZHkgPSB3
YWxrRXhwIChuYW1lLCBib2R5LCBOT05FKQ0KCQkJICAgIHZhbCBib2R5ID0NCgkJCSAgICAgICBj
YXNlICFwcmVmaXhlcyBvZg0KCQkJCSAgTk9ORSA9PiBib2R5DQoJCQkJfCBTT01FIGZzID0+DQoJ
CQkJICAgICBsZXQgdmFsIHtkZWNzLCB0cmFuc2Zlcn0gPSBFeHAuZGVzdCBib2R5DQoJCQkJICAg
ICBpbiBFeHAubWFrZSB7ZGVjcyA9IG5lc3QgKGZzLCBOT05FLCBkZWNzKSwNCgkJCQkJCSAgdHJh
bnNmZXIgPSB0cmFuc2Zlcn0NCgkJCQkgICAgIGVuZA0KCQkJICAgIHZhbCBib2R5ID0gc2hyaW5r
RXhwIGJvZHkNCgkJCSBpbiB7bmFtZSA9IG5hbWUsIGFyZ3MgPSBhcmdzLCByZXR1cm5zID0gcmV0
dXJucywNCgkJCSAgICAgYm9keSA9IGJvZHl9DQoJCQkgZW5kIDo6IGZ1bmN0aW9ucw0KCQkgfCBf
ID0+IGZ1bmN0aW9ucw0KCQllbmQpDQoJICAgIHZhbCBwcm9ncmFtID0NCgkgICAgICAgUHJvZ3Jh
bS5UIHtkYXRhdHlwZXMgPSBkYXRhdHlwZXMsDQoJCQkgIGdsb2JhbHMgPSBnbG9iYWxzLA0KCQkJ
ICBmdW5jdGlvbnMgPSBmdW5jdGlvbnMsDQoJCQkgIG1haW4gPSBtYWlufQ0KCSAgICB2YWwgXyA9
IFByb2dyYW0uY2xlYXIgcHJvZ3JhbQ0KCSBpbg0KCSAgICBwcm9ncmFtDQoJIGVuZA0KICAgZW5k
DQoNCmVuZA0K
---559023410-126398554-979585292=:8833--