F1 Abu Dhabi Grand Prix hospitality and tickets · 3 to 6 Dec 2026
Feel the speed, soak up the atmosphere and experience every moment live at the F1 season finale.
First GP 2009 Formula 1 at Yas Marina since
Corners 16 Across 5.281 km of circuit
Laps 58 From daylight into the floodlit night
Champions 05 Titles decided at Yas Marina since 2010
LyogZXNWaW1lb0xvb3A6IHNlYW1sZXNzIGhlcm8gbG9vcCwgQ0wtMjAyNjA5MzAtMDQsIGxlYW4gc3RhbmRieSBhbmQgcXVhbGl0eSBjYXAgQ0wtMjAyNjEw
MDctMDUsIDcyMHAgQ0wtMjAyNjEwMDctMDggKi8oZnVuY3Rpb24oKXt2YXIgTz0iaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tIixtbT13aW5kb3cubWF0Y2hN
ZWRpYT9mdW5jdGlvbihxKXtyZXR1cm4gbWF0Y2hNZWRpYShxKS5tYXRjaGVzfTpmdW5jdGlvbigpe3JldHVybiBmYWxzZX07dmFyIFJNPW1tKCIocHJlZmVy
cy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSIpLFE9IjcyMHAiO3ZhciB3cmFwcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuaGVyby12aWRlby13cmFw
Iik7Zm9yKHZhciB3PTA7dzx3cmFwcy5sZW5ndGg7dysrKShmdW5jdGlvbih3cmFwKXt2YXIgYT13cmFwLnF1ZXJ5U2VsZWN0b3IoImlmcmFtZSIpO2lmKCFh
fHwoYS5nZXRBdHRyaWJ1dGUoInNyYyIpfHwiIikuaW5kZXhPZihPKSE9PTB8fHdyYXAuaGFzQXR0cmlidXRlKCJkYXRhLWVzdmwiKSlyZXR1cm47d3JhcC5z
ZXRBdHRyaWJ1dGUoImRhdGEtZXN2bCIsIjEiKTtpZihSTSYmd3JhcC5jbG9zZXN0JiZ3cmFwLmNsb3Nlc3QoIi5wYWdlLWhlcm8iKSl7YS5wYXJlbnROb2Rl
LnJlbW92ZUNoaWxkKGEpO3JldHVybn12YXIgUD1be2Y6YSxkdXI6MCx0aWNrczowLHE6MH0sbnVsbF0sYWN0PTAsZmFkaW5nPTAsaGVsZD0wLExFQUQ9MS4x
LEZBREU9OTAwLFBSRVA9MTA7ZnVuY3Rpb24gc2VuZChwLG0sdil7aWYoIXApcmV0dXJuO3RyeXt2YXIgbz17bWV0aG9kOm19O2lmKHYhPT12b2lkIDApby52
YWx1ZT12O3AuZi5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KG8pLE8pfWNhdGNoKGUpe319ZnVuY3Rpb24gYXJtKHApe2lmKCFw
LnEpc2VuZChwLCJzZXRRdWFsaXR5IixRKTtpZihSTSlyZXR1cm47c2VuZChwLCJhZGRFdmVudExpc3RlbmVyIiwidGltZXVwZGF0ZSIpO3NlbmQocCwiZ2V0
RHVyYXRpb24iKX1mdW5jdGlvbiBwYXJrKHApe3NlbmQocCwicGF1c2UiKTtzZW5kKHAsInNldEN1cnJlbnRUaW1lIiwwKX1mdW5jdGlvbiBtYWtlKCl7dmFy
IGI9YS5jbG9uZU5vZGUoZmFsc2UpO2IucmVtb3ZlQXR0cmlidXRlKCJpZCIpO2Iuc2V0QXR0cmlidXRlKCJsb2FkaW5nIiwiZWFnZXIiKTtiLnNldEF0dHJp
YnV0ZSgidGFiaW5kZXgiLCItMSIpO2Iuc2V0QXR0cmlidXRlKCJkYXRhLWVzdmwiLCJvZmYiKTt2YXIgcD17ZjpiLGR1cjowLHRpY2tzOjAscTowfTtQWzEt
YWN0XT1wO2IuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXthcm0ocCl9KTt3cmFwLmFwcGVuZENoaWxkKGIpO3ZhciBuPTAsdD1zZXRJbnRl
cnZhbChmdW5jdGlvbigpe2lmKHAudGlja3N8fCsrbj44KXtjbGVhckludGVydmFsKHQpO3JldHVybn1hcm0ocCl9LDE1MDApfWZ1bmN0aW9uIHN3YXAoKXt2
YXIgbj1QWzEtYWN0XSxjPVBbYWN0XTtpZihmYWRpbmd8fGhlbGR8fCFufHwhbi50aWNrcylyZXR1cm47ZmFkaW5nPTE7c2VuZChuLCJzZXRDdXJyZW50VGlt
ZSIsMCk7c2VuZChuLCJwbGF5Iik7Yy5mLnNldEF0dHJpYnV0ZSgiZGF0YS1lc3ZsIiwidW5kZXIiKTtuLmYuc2V0QXR0cmlidXRlKCJkYXRhLWVzdmwiLCJv
biIpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtwYXJrKGMpO2MuZi5zZXRBdHRyaWJ1dGUoImRhdGEtZXN2bCIsIm9mZiIpO2FjdD0xLWFjdDtmYWRpbmc9MH0s
RkFERSl9YS5zZXRBdHRyaWJ1dGUoImRhdGEtZXN2bCIsIm9uIik7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixmdW5jdGlvbigpe2FybShQWzBdKX0pO2Fy
bShQWzBdKTt2YXIgbjA9MCx0MD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2lmKChQWzBdLnRpY2tzfHxSTSkmJlBbMF0ucXx8KytuMD4xMil7Y2xlYXJJbnRl
cnZhbCh0MCk7cmV0dXJufWFybShQWzBdKX0sMTUwMCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGUpe2lmKGUub3JpZ2lu
IT09TylyZXR1cm47dmFyIGk9LTE7Zm9yKHZhciBrPTA7azwyO2srKylpZihQW2tdJiZlLnNvdXJjZT09PVBba10uZi5jb250ZW50V2luZG93KWk9aztpZihp
PDApcmV0dXJuO3ZhciBkPWUuZGF0YTtpZih0eXBlb2YgZD09PSJzdHJpbmciKXt0cnl7ZD1KU09OLnBhcnNlKGQpfWNhdGNoKHgpe3JldHVybn19aWYoIWQp
cmV0dXJuO3ZhciBwPVBbaV07aWYoZC5ldmVudD09PSJyZWFkeSIpe2FybShwKTtyZXR1cm59aWYoZC5tZXRob2Q9PT0ic2V0UXVhbGl0eSIpe3AucT0xO3Jl
dHVybn1pZihkLm1ldGhvZD09PSJnZXREdXJhdGlvbiIpe3AuZHVyPStkLnZhbHVlfHxwLmR1cjtyZXR1cm59aWYoUk0pcmV0dXJuO2lmKChkLmV2ZW50PT09
InBsYXlQcm9ncmVzcyJ8fGQuZXZlbnQ9PT0idGltZXVwZGF0ZSIpJiZkLmRhdGEpe3AudGlja3MrKztpZihkLmRhdGEuZHVyYXRpb24pcC5kdXI9ZC5kYXRh
LmR1cmF0aW9uO2lmKGk9PT1hY3Qpe3ZhciBsZWZ0PXAuZHVyLWQuZGF0YS5zZWNvbmRzO2lmKHAuZHVyJiYhaGVsZCYmIWZhZGluZyYmIVBbMS1hY3RdJiZs
ZWZ0PkxFQUQmJmxlZnQ8PU1hdGgubWluKFBSRVAscC5kdXIvMikpbWFrZSgpO2lmKCFmYWRpbmcmJnAuZHVyJiZsZWZ0PD1MRUFEKXN3YXAoKX1lbHNlIGlm
KCFmYWRpbmcmJiFoZWxkJiZkLmRhdGEuc2Vjb25kcz4uMDUpcGFyayhwKX19KTt2YXIgaGVybz13cmFwLmNsb3Nlc3Q/d3JhcC5jbG9zZXN0KCIucGFnZS1o
ZXJvLC5oZXJvIik6bnVsbCxidG49aGVybyYmaGVyby5xdWVyeVNlbGVjdG9yKCIuaGVyby12aWQtdG9nZ2xlIik7aWYoYnRuKWJ0bi5hZGRFdmVudExpc3Rl
bmVyKCJjbGljayIsZnVuY3Rpb24oKXtoZWxkPWJ0bi5nZXRBdHRyaWJ1dGUoImFyaWEtcHJlc3NlZCIpPT09InRydWUiO2lmKGhlbGQpe3NlbmQoUFswXSwi
cGF1c2UiKTtzZW5kKFBbMV0sInBhdXNlIil9ZWxzZXtzZW5kKFBbYWN0XSwicGxheSIpO2lmKFBbMS1hY3RdKXBhcmsoUFsxLWFjdF0pfX0pO30pKHdyYXBz
W3ddKTt9KSgpOw==
F1 Abu Dhabi Grand Prix · 3 to 6 Dec 2026 · Packages Now Live
Race Weekend
The Season FinaleUnder The Lights.
The final race of the F1 season lands in Abu Dhabi, bringing three days of speed,
spectacle and high-stakes racing to Yas Marina.
Be there for every moment. The race runs from daylight into the floodlit night, the world’s best
drivers go head-to-head one last time, and the marina, the atmosphere and the after-race concerts
make it a weekend that goes well beyond the track.
As an official Abu Dhabi Grand Prix reseller, we put you closer to the action. Choose from
grandstand and Abu Dhabi Hill tickets through to the Sunset Lounge and trackside suites,
with hotels and transfers available through our team.
One race. One finale. One weekend you’ll be talking about for years.
At a glance
The Formula 1 Abu Dhabi Grand Prix is the season finale at Yas Marina Circuit on Yas Island, from 3 to 6 December 2026, with racing from 4 December. ES Sport offers grandstand tickets, private suites and lounges, and hotel packages, with general admission on Abu Dhabi Hill from AED 1,800 and the After-Race Concerts included with most weekend tickets.
Last updated 22 October 2026
Yas Marina Circuit, Abu Dhabi Grand Prix
Yas Marina Circuit · 3 to 6 Dec 2026
On Sale Now
Buy Official F1 Abu Dhabi Grand Prix Tickets
←
→
Grandstand Main Grandstand The grid, the pit lane and the podium
Over the starting grid, the pit stops, the finish line and the podium celebrations, with the F1 Fanzone, Oasis areas and After-Race Concerts included.
Hospitality Sunset Lounge Indoor lounge and terrace over Turn 5
An indoor lounge with an outdoor terrace over the Turn 5 braking zone, with food and drink included. Part of our private hospitality range at Yas Marina.
Grandstand West Grandstand The end of the longest straight, into Turns 6 and 7
The cars arrive flat out at the end of the longest straight on the circuit and brake hard for Turns 6 and 7 in front of you. Fanzone, Oasis areas and After-Race Concerts included.
General Admission Abu Dhabi Hill The grass hill inside the North section
Laid-back open-air viewing across Turns 2 to 6, with the freedom to roam between vantage points. Fanzone, Oasis areas and After-Race Concerts included.
Grandstand North Grandstand Over the Turn 5 braking zone
Watch the cars arrive at full speed, hard on the brakes, and fight for the corner at one of the best overtaking spots on the circuit. Fanzone, Oasis areas and After-Race Concerts included.
→ Enquire Now
Grandstand North Straight Grandstand Cars at full speed below
Above the straight, with the cars passing at full speed below you. Pure pace across the race weekend, with the Fanzone, Oasis areas and After-Race Concerts included.
→ Enquire Now
Grandstand West Straight Grandstand Inside the DRS zone, into Turns 6 and 7
Inside the DRS zone on the back straight, where the cars run flat out toward Turns 6 and 7 and the overtakes are set up in front of you. Fanzone, Oasis areas and After-Race Concerts included.
→ Enquire Now
Ly8gRVMgU3BvcnQgaGVhdCBoYXplIGVuZ2luZS4gT25lIFdlYkdMIGNhbnZhczogYSBjYXIgaW1hZ2UgcGx1cyBhbiBvdmVybGF5
IGxheWVyIChsb2dvIGFuZC9vcgovLyB0ZXh0KSwgYm90aCBiZW50IGJ5IHRoZSBzYW1lIHJpc2luZyBub2lzZSBmaWVsZCBpbnNp
ZGUgYSBwbHVtZSB0aGF0IGxlYXZlcyB0aGUgZXhoYXVzdC4KLy8KLy8gICBjb25zdCBoYXplID0gRVNIYXplLnN0YXJ0KGNhbnZh
cywgY29uZmlnLCB7IGF1dG9wbGF5OiB0cnVlLCByZWR1Y2VkTW90aW9uOiAnYXV0bycsIHBpeGVsUmF0aW86IG51bGwsIG1heFBp
eGVsUmF0aW86IDIgfSk7Ci8vICAgaGF6ZS5yZWFkeS50aGVuKCgpID0+IC4uLik7ICAgaGF6ZS5yZW5kZXIoc2Vjb25kcyk7ICAg
aGF6ZS5zdG9wKCk7Ci8vCi8vIGNvbmZpZzogc2VlIHBpZWNlcy5qcy4gRXZlcnkgY29vcmRpbmF0ZSBpcyBpbiBERVNJR04gcGl4
ZWxzIChjb25maWcud2lkdGggeCBjb25maWcuaGVpZ2h0KS4gVGhlIGNhbnZhcwovLyBiYWNraW5nIHN0b3JlIGlzIHRoYXQgc2l6
ZSB0aW1lcyB0aGUgcGl4ZWwgcmF0aW8gKHRoZSBzY3JlZW4ncyBieSBkZWZhdWx0LCBjYXBwZWQgYXQgbWF4UGl4ZWxSYXRpbzsK
Ly8gcGl4ZWxSYXRpbzogMSBmb3IgZnJhbWUgY2FwdHVyZXMpLCBhbmQgdGhlIGNhciBpbWFnZSBtYXkgYmUgYmlnZ2VyIHRoYW4g
dGhlIGRlc2lnbiBzaXplOiBpdCBpcyBzYW1wbGVkCi8vIGJ5IHBvc2l0aW9uLCBzbyBhIDJ4IGltYWdlIG9uIGEgMnggc2NyZWVu
IHJlbmRlcnMgc2hhcnAuIEltYWdlIHNvdXJjZXMgbWF5IGJlIHBhdGhzIG9yIGRhdGE6IFVSSXMuCi8vIElmIFdlYkdMIGlzIHVu
YXZhaWxhYmxlIHRoZSBjYW52YXMgc2hvd3MgdGhlIHN0aWxsIChjYXIgcGx1cyBvdmVybGF5KSB0aHJvdWdoIHRoZSAyRCBjb250
ZXh0LgovLyBXaXRoIHJlZHVjZWRNb3Rpb24gJ2F1dG8nIGFuZCB0aGUgdmlzaXRvcidzIHByZWZlcnMtcmVkdWNlZC1tb3Rpb24g
c2V0LCBvbmUgZnJhbWUgaXMgZHJhd24gYW5kCi8vIHRoZSBsb29wIG5ldmVyIHN0YXJ0cy4gVGhlIG5vaXNlIHdyYXBzIGV4YWN0
bHkgZXZlcnkgY29uZmlnLnBlcmlvZCBzZWNvbmRzLCBzbyB0aGUgYW5pbWF0aW9uCi8vIGxvb3BzIHNlYW1sZXNzbHkgYW5kIGEg
Y2FwdHVyZSBvZiBvbmUgcGVyaW9kIGlzIGEgcGVyZmVjdCBsb29wLgp3aW5kb3cuRVNIYXplID0gKGZ1bmN0aW9uICgpIHsKICAn
dXNlIHN0cmljdCc7CgogIGNvbnN0IFZTID0gYAphdHRyaWJ1dGUgdmVjMiBhUG9zOwp2YXJ5aW5nIHZlYzIgdlV2Owp2b2lkIG1h
aW4oKSB7CiAgdlV2ID0gdmVjMihhUG9zLnggKiAwLjUgKyAwLjUsIDAuNSAtIGFQb3MueSAqIDAuNSk7CiAgZ2xfUG9zaXRpb24g
PSB2ZWM0KGFQb3MsIDAuMCwgMS4wKTsKfWA7CgogIGNvbnN0IEZTID0gYApwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CnZhcnlpbmcg
dmVjMiB2VXY7CnVuaWZvcm0gc2FtcGxlcjJEIHVJbWFnZTsKdW5pZm9ybSBzYW1wbGVyMkQgdU92ZXJsYXk7CnVuaWZvcm0gc2Ft
cGxlcjJEIHVPdmVybGF5Qmx1cjsgICAvLyB0aGUgb3ZlcmxheSBhZ2Fpbiwgc21lYXJlZCBhbG9uZyB0aGUgZmxvdyBhbmQgYmx1
cnJlZCAodGhlIGhlYXQtcG9ja2V0IGxvb2spCnVuaWZvcm0gdmVjMiAgdVJlczsKdW5pZm9ybSBmbG9hdCB1VGltZTsKdW5pZm9y
bSBmbG9hdCB1UGVyaW9kOwp1bmlmb3JtIGZsb2F0IHVTcGVlZDsKdW5pZm9ybSB2ZWMzICB1V3JhcDsKdW5pZm9ybSB2ZWMyICB1
TW91dGg7CnVuaWZvcm0gdmVjMiAgdU1vdXRoQXhlczsKdW5pZm9ybSBmbG9hdCB1TW91dGhBbmdsZTsKdW5pZm9ybSB2ZWMyICB1
UGx1bWVDMTsKdW5pZm9ybSB2ZWMyICB1UGx1bWVFbmQ7CnVuaWZvcm0gdmVjMiAgdVBsdW1lV2lkdGg7CnVuaWZvcm0gdmVjMiAg
dURyaWZ0RGlyOwp1bmlmb3JtIGZsb2F0IHVTdHJlbmd0aDsKdW5pZm9ybSBmbG9hdCB1RW5kU3RyZW5ndGg7CnVuaWZvcm0gZmxv
YXQgdUZhbGxvZmY7ICAgICAgIC8vIDEgPSBsaW5lYXIgZmFkZSBhbG9uZyB0aGUgcGx1bWU7IGhpZ2hlciA9IHRoZSBoZWF0IGRp
ZXMgb2ZmIHNvb25lciwgbGlrZSBhIHJlYWwgZXhoYXVzdAp1bmlmb3JtIGZsb2F0IHVCbHVyOwp1bmlmb3JtIGZsb2F0IHVHbG93
Owp1bmlmb3JtIHZlYzIgIHVQb2NrZXQ7ICAgICAgICAvLyB4OiBjZWxsIHNpemUgb2YgdGhlIGhlYXQtcG9ja2V0IGZpZWxkIChk
ZXNpZ24gcHgpLCB5OiBpdHMgbGF0dGljZSB3cmFwIGluIGNlbGxzCgovLyBHcmFkaWVudCBub2lzZSBvbiBhbiBpbnRlZ2VyIGxh
dHRpY2UgdGhhdCB3cmFwcyBldmVyeSAicGVyaW9kIiBjZWxscyBhbG9uZyB0aGUgZHJpZnQgYXhpcywKLy8gc28gdGhlIGZpZWxk
IHRpbGVzIGluIHRoYXQgZGlyZWN0aW9uIGFuZCB0aGUgYW5pbWF0aW9uIGxvb3BzIGV4YWN0bHkuCnZlYzIgZ3JhZCh2ZWMyIGNl
bGwsIHZlYzIgcGVyaW9kLCBmbG9hdCBzZWVkKSB7CiAgY2VsbCA9IG1vZChjZWxsLCBwZXJpb2QpOwogIGZsb2F0IGggPSBmcmFj
dChzaW4oZG90KGNlbGwsIHZlYzIoMTI3LjEsIDMxMS43KSkgKyBzZWVkICogNTMuMzcpICogNDM3NTguNTQ1Myk7CiAgZmxvYXQg
YSA9IGggKiA2LjI4MzE4NTM7CiAgcmV0dXJuIHZlYzIoY29zKGEpLCBzaW4oYSkpOwp9CmZsb2F0IGdub2lzZSh2ZWMyIHAsIHZl
YzIgcGVyaW9kLCBmbG9hdCBzZWVkKSB7CiAgdmVjMiBpID0gZmxvb3IocCk7CiAgdmVjMiBmID0gZnJhY3QocCk7CiAgdmVjMiB1
ID0gZiAqIGYgKiBmICogKGYgKiAoZiAqIDYuMCAtIDE1LjApICsgMTAuMCk7CiAgZmxvYXQgYSA9IGRvdChncmFkKGksICAgICAg
ICAgICAgICAgICAgcGVyaW9kLCBzZWVkKSwgZik7CiAgZmxvYXQgYiA9IGRvdChncmFkKGkgKyB2ZWMyKDEuMCwgMC4wKSwgcGVy
aW9kLCBzZWVkKSwgZiAtIHZlYzIoMS4wLCAwLjApKTsKICBmbG9hdCBjID0gZG90KGdyYWQoaSArIHZlYzIoMC4wLCAxLjApLCBw
ZXJpb2QsIHNlZWQpLCBmIC0gdmVjMigwLjAsIDEuMCkpOwogIGZsb2F0IGQgPSBkb3QoZ3JhZChpICsgdmVjMigxLjAsIDEuMCks
IHBlcmlvZCwgc2VlZCksIGYgLSB2ZWMyKDEuMCwgMS4wKSk7CiAgcmV0dXJuIG1peChtaXgoYSwgYiwgdS54KSwgbWl4KGMsIGQs
IHUueCksIHUueSk7Cn0KCi8vIFRocmVlIG9jdGF2ZXMgKDYwLCAzMCwgMTUgcHggY2VsbHMpIGRyaWZ0aW5nIGF0IDF4LCAxLjV4
IGFuZCAyeCB0aGUgc3BlZWQsIHNvIHRoZSBwYXR0ZXJuCi8vIGJvaWxzIGFzIGl0IHRyYXZlbHMgaW5zdGVhZCBvZiBzbGlkaW5n
IGFzIG9uZSBzaGVldC4gRWFjaCB3cmFwcyBvbmNlIHBlciBwZXJpb2QuCnZlYzIgaGF6ZSh2ZWMyIHEsIGZsb2F0IHQpIHsKICB2
ZWMyIGQgPSB2ZWMyKDAuMCk7CiAgdmVjMiBwMSA9IHZlYzIocS54LCBxLnkgLSB1U3BlZWQgKiAxLjAgKiB0KSAvIDYwLjA7CiAg
dmVjMiBwMiA9IHZlYzIocS54LCBxLnkgLSB1U3BlZWQgKiAxLjUgKiB0KSAvIDMwLjA7CiAgdmVjMiBwMyA9IHZlYzIocS54LCBx
LnkgLSB1U3BlZWQgKiAyLjAgKiB0KSAvIDE1LjA7CiAgZCArPSAxLjAwICogdmVjMihnbm9pc2UocDEsIHZlYzIoNjQuMCwgdVdy
YXAueCksIDEuMCksIGdub2lzZShwMSwgdmVjMig2NC4wLCB1V3JhcC54KSwgMTEuMCkpOwogIGQgKz0gMC41MCAqIHZlYzIoZ25v
aXNlKHAyLCB2ZWMyKDY0LjAsIHVXcmFwLnkpLCAyLjApLCBnbm9pc2UocDIsIHZlYzIoNjQuMCwgdVdyYXAueSksIDEyLjApKTsK
ICBkICs9IDAuMjUgKiB2ZWMyKGdub2lzZShwMywgdmVjMig2NC4wLCB1V3JhcC56KSwgMy4wKSwgZ25vaXNlKHAzLCB2ZWMyKDY0
LjAsIHVXcmFwLnopLCAxMy4wKSk7CiAgcmV0dXJuIGQ7Cn0KCi8vIEhlYXQgcG9ja2V0czogYSBjb2Fyc2UsIHNsb3cgZmllbGQg
c2F5aW5nIHdoZXJlIHRoZSBhaXIgaXMgaG90dGVzdCByaWdodCBub3cuIFRoZSBibHVyIGxpdmVzIGluIHRoZQovLyBwb2NrZXRz
IGFuZCBtb3N0IG9mIHRoZSBiZW5kaW5nIGRvZXMgdG9vLCBzbyBtb3N0IG9mIHRoZSBoZWFkbGluZSBzdGF5cyBzaGFycCB3aGls
ZSBwYXRjaGVzIG9mIGl0Ci8vIHNtZWFyIGFuZCBkcmlmdCwgdGhlIHdheSB0aGUgSGVybWV1cyBoZXJvIGNvcHkgYmVoYXZlcyAo
Y2hlY2tlZCBmcmFtZSBieSBmcmFtZSwgMjIgT2N0IDIwMjYpLgpmbG9hdCBwb2NrZXQodmVjMiBxLCBmbG9hdCB0KSB7CiAgdmVj
MiBwID0gdmVjMihxLngsIHEueSAtIHVTcGVlZCAqIDAuOCAqIHQpIC8gdVBvY2tldC54OwogIGZsb2F0IG4gPSBnbm9pc2UocCwg
dmVjMig2NC4wLCB1UG9ja2V0LnkpLCAyMS4wKTsKICByZXR1cm4gc21vb3Roc3RlcCgtMC4xMiwgMC40Miwgbik7Cn0KCi8vIFNv
ZnQgcGx1bWUgbWFzayBhcm91bmQgYSBxdWFkcmF0aWMgYmV6aWVyIGZyb20gdGhlIG1vdXRoLCB3aWRlbmluZyBhbG9uZyBpdC4K
ZmxvYXQgcGx1bWUodmVjMiBweCwgb3V0IGZsb2F0IHMpIHsKICBmbG9hdCBiZXN0ID0gMWU5OwogIGZsb2F0IGJzID0gMC4wOwog
IGZvciAoaW50IGkgPSAwOyBpIDw9IDQwOyBpKyspIHsKICAgIGZsb2F0IHQgPSBmbG9hdChpKSAvIDQwLjA7CiAgICB2ZWMyIHEg
PSBtaXgobWl4KHVNb3V0aCwgdVBsdW1lQzEsIHQpLCBtaXgodVBsdW1lQzEsIHVQbHVtZUVuZCwgdCksIHQpOwogICAgZmxvYXQg
ZCA9IGRpc3RhbmNlKHB4LCBxKTsKICAgIGlmIChkIDwgYmVzdCkgeyBiZXN0ID0gZDsgYnMgPSB0OyB9CiAgfQogIHMgPSBiczsK
ICBmbG9hdCB3ID0gbWl4KHVQbHVtZVdpZHRoLngsIHVQbHVtZVdpZHRoLnksIGJzKTsKICByZXR1cm4gMS4wIC0gc21vb3Roc3Rl
cCh3ICogMC4yNSwgdywgYmVzdCk7Cn0KCi8vIEFsbCB0ZXh0dXJlcyBhcmUgdXBsb2FkZWQgcHJlbXVsdGlwbGllZC4gQSBjYXIg
aW1hZ2Ugd2l0aCB0cmFuc3BhcmVuY3kgbGVhdmVzIHRoZSBwYWdlCi8vIGJhY2tncm91bmQgc2hvd2luZyB0aHJvdWdoIHdoZXJl
dmVyIGl0IGlzIGNsZWFyOyBhbiBvcGFxdWUgb25lIGZpbGxzIHRoZSBmcmFtZSBhcyBiZWZvcmUuCi8vIGhiIHNheXMgaG93IG11
Y2ggb2YgdGhlIHNtZWFyZWQgb3ZlcmxheSB0byBzaG93IGhlcmUgKDAgc2hhcnAsIDEgZnVsbHkgc21lYXJlZCkuCnZlYzQgc2Nl
bmUodmVjMiBweCwgZmxvYXQgaGIpIHsKICB2ZWMyIHV2ID0gY2xhbXAocHggLyB1UmVzLCAwLjAsIDEuMCk7CiAgdmVjNCBjYXIg
PSB0ZXh0dXJlMkQodUltYWdlLCB1dik7CiAgdmVjNCBvID0gbWl4KHRleHR1cmUyRCh1T3ZlcmxheSwgdXYpLCB0ZXh0dXJlMkQo
dU92ZXJsYXlCbHVyLCB1diksIGhiKTsKICByZXR1cm4gY2FyICogKDEuMCAtIG8uYSkgKyBvOwp9Cgp2b2lkIG1haW4oKSB7CiAg
dmVjMiBweCA9IHZVdiAqIHVSZXM7CiAgZmxvYXQgdCA9IG1vZCh1VGltZSwgdVBlcmlvZCk7CgogIGZsb2F0IHM7CiAgZmxvYXQg
bSA9IHBsdW1lKHB4LCBzKTsKICBmbG9hdCByYW1wID0gc21vb3Roc3RlcCgwLjAsIDAuMiwgcyk7ICAgICAgICAgICAgICAgIC8v
IHRoZSBtZXRhbCBvZiB0aGUgcGlwZSBzdGF5cyBzdGlsbDsgdGhlIGFpciBqdXN0IHBhc3QgaXQgYmVuZHMKICBmbG9hdCBmYWRl
ID0gbWl4KHVFbmRTdHJlbmd0aCwgMS4wLCBwb3coMS4wIC0gcywgdUZhbGxvZmYpKTsgICAvLyBoZWF0IGRpc3NpcGF0ZXMgYWxv
bmcgdGhlIHBsdW1lCiAgZmxvYXQgYW1wID0gdVN0cmVuZ3RoICogZmFkZSAqIG0gKiByYW1wOwoKICB2ZWMyIGRpciA9IG5vcm1h
bGl6ZSh1RHJpZnREaXIpOwogIHZlYzIgcGVycCA9IHZlYzIoLWRpci55LCBkaXIueCk7CiAgdmVjMiBxID0gdmVjMihkb3QocHgs
IHBlcnApLCBkb3QocHgsIGRpcikpOwogIGZsb2F0IGggPSBwb2NrZXQocSwgdCk7CiAgYW1wICo9IG1peCgwLjM1LCAxLjAsIGgp
OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbSBhaXIgYmVuZHMgYSBsaXR0bGUsIHRoZSBwb2NrZXRzIGEgbG90
CiAgdmVjMiBuID0gaGF6ZShxLCB0KTsKICB2ZWMyIGRpc3AgPSAobi54ICogcGVycCArIG4ueSAqIDAuNTUgKiBkaXIpICogYW1w
OyAgIC8vIGhlYXQgYmVuZHMgbW9zdGx5IGFjcm9zcyB0aGUgZmxvdwoKICB2ZWMyIHNwID0gcHggKyBkaXNwOwogIGZsb2F0IGhi
ID0gY2xhbXAobSAqIHJhbXAgKiBoICogMS4xNSAqIGZhZGUsIDAuMCwgMS4wKTsgICAvLyB0aGUgc21lYXJlZCBoZWFkbGluZSBz
aG93cyB0aHJvdWdoIGluIHRoZSBwb2NrZXRzLCBsZXNzIGFzIHRoZSBoZWF0IGZhZGVzCiAgdmVjNCBjb2wgPSBzY2VuZShzcCwg
aGIpOwoKICAvLyBIb3QgcGlwZTogb25lIHN0ZWFkeSBnbG93IGluc2lkZSB0aGUgb3BlbmluZywgc3Ryb25nZXN0IGRlZXAgaW4g
dGhlIHBpcGUsIG5vdGhpbmcgcGFzdCB0aGUgcmltLgogIC8vIFRoZSBwaWVjZSdzIGdsb3cgdmFsdWUgc2NhbGVzIGl0OyAxLjAg
aXMgYSB2aXNpYmx5IGhvdCBwaXBlLCAwLjMgaXMgYSBoaW50IG9mIGhlYXQuCiAgaWYgKHVHbG93ID4gMC4wKSB7CiAgICBmbG9h
dCBjYSA9IGNvcyh1TW91dGhBbmdsZSksIHNhID0gc2luKHVNb3V0aEFuZ2xlKTsKICAgIHZlYzIgcmVsID0gcHggLSB1TW91dGg7
CiAgICB2ZWMyIGUgPSB2ZWMyKGNhICogcmVsLnggKyBzYSAqIHJlbC55LCAtc2EgKiByZWwueCArIGNhICogcmVsLnkpIC8gdU1v
dXRoQXhlczsKICAgIGZsb2F0IGQgPSBsZW5ndGgoZSk7CiAgICBmbG9hdCBpbnNpZGUgPSAxLjAgLSBzbW9vdGhzdGVwKDAuODUs
IDEuMCwgZCk7CiAgICBmbG9hdCBmaWxsID0gZXhwKC1kICogZCAqIDEuNikgKiBpbnNpZGU7CiAgICB2ZWMyIGUyID0gZSAtIHZl
YzIoMC4xNiwgLTAuMDYpOwogICAgZmxvYXQgaG90c3BvdCA9IGV4cCgtZG90KGUyLCBlMikgKiA1LjApICogaW5zaWRlOwogICAg
dmVjMyBkZWVwID0gdmVjMygwLjk1LCAwLjIyLCAwLjA1KTsKICAgIHZlYzMgaG90ICA9IHZlYzMoMS4wLCAwLjYyLCAwLjI4KTsK
ICAgIGNvbC5yZ2IgKz0gKGRlZXAgKiBmaWxsICogMC43NSArIGhvdCAqIGhvdHNwb3QgKiAwLjYpICogdUdsb3cgKiBjb2wuYTsK
ICB9CgogIGdsX0ZyYWdDb2xvciA9IGNvbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlbXVsdGlwbGll
ZAp9YDsKCiAgY29uc3QgVU5JRk9STVMgPSBbJ3VJbWFnZScsICd1T3ZlcmxheScsICd1T3ZlcmxheUJsdXInLCAndVJlcycsICd1
VGltZScsICd1UGVyaW9kJywgJ3VTcGVlZCcsICd1V3JhcCcsICd1TW91dGgnLCAndU1vdXRoQXhlcycsCiAgICAndU1vdXRoQW5n
bGUnLCAndVBsdW1lQzEnLCAndVBsdW1lRW5kJywgJ3VQbHVtZVdpZHRoJywgJ3VEcmlmdERpcicsICd1U3RyZW5ndGgnLCAndUVu
ZFN0cmVuZ3RoJywgJ3VGYWxsb2ZmJywgJ3VCbHVyJywgJ3VHbG93JywgJ3VQb2NrZXQnXTsKCiAgZnVuY3Rpb24gbG9hZEltYWdl
KHNyYykgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgY29uc3QgaW1nID0gbmV3
IEltYWdlKCk7CiAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKGltZyk7CiAgICAgIGltZy5vbmVycm9yID0gKCkgPT4g
cmVqZWN0KG5ldyBFcnJvcignY291bGQgbm90IGxvYWQgJyArIFN0cmluZyhzcmMpLnNsaWNlKDAsIDgwKSkpOwogICAgICBpbWcu
c3JjID0gc3JjOwogICAgfSk7CiAgfQoKICAvLyBUaGUgb3ZlcmxheSBsYXllcjogbG9nbyBhbmQgdGV4dCBkcmF3biBvbmNlIGlu
dG8gYSAyRCBjYW52YXMsIGsgdGltZXMgdGhlIGRlc2lnbiBzaXplIHNvIHRleHQgc3RheXMgY3Jpc3AuCiAgLy8gV2l0aCBgc21l
YXJgIChkZXNpZ24gcHgpIHRoZSBzYW1lIGl0ZW1zIGFyZSBkcmF3biBhcyBhIHN0cmVhayBhbG9uZyB0aGUgZHJpZnQgZGlyZWN0
aW9uIHVuZGVyIGEgYmx1cjoKICAvLyB0aGF0IGNvcHkgaXMgd2hhdCB0aGUgaGVhdCBwb2NrZXRzIHJldmVhbC4KICBhc3luYyBm
dW5jdGlvbiBidWlsZE92ZXJsYXkoY29uZmlnLCBrLCBzbWVhcikgewogICAgayA9IGsgfHwgMTsKICAgIGNvbnN0IG8gPSBkb2N1
bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgIG8ud2lkdGggPSBNYXRoLnJvdW5kKGNvbmZpZy53aWR0aCAqIGspOwog
ICAgby5oZWlnaHQgPSBNYXRoLnJvdW5kKGNvbmZpZy5oZWlnaHQgKiBrKTsKICAgIGNvbnN0IGN0eCA9IG8uZ2V0Q29udGV4dCgn
MmQnKTsKICAgIGN0eC5zY2FsZShrLCBrKTsKICAgIGxldCBsb2dvSW1nID0gbnVsbDsKICAgIGlmIChjb25maWcubG9nbyAmJiBj
b25maWcubG9nby5zcmMpIGxvZ29JbWcgPSBhd2FpdCBsb2FkSW1hZ2UoY29uZmlnLmxvZ28uc3JjKTsKICAgIGZvciAoY29uc3Qg
aXRlbSBvZiBjb25maWcudGV4dCB8fCBbXSkgewogICAgICBpZiAoZG9jdW1lbnQuZm9udHMgJiYgZG9jdW1lbnQuZm9udHMubG9h
ZCkgeyB0cnkgeyBhd2FpdCBkb2N1bWVudC5mb250cy5sb2FkKGl0ZW0uZm9udCk7IH0gY2F0Y2ggKGUpIHsgLyogc3lzdGVtIGZv
bnQgKi8gfSB9CiAgICB9CiAgICBmdW5jdGlvbiBkcmF3QWxsKGR4LCBkeSkgewogICAgICBpZiAobG9nb0ltZykgewogICAgICAg
IGNvbnN0IFt4LCB5LCB3LCBoXSA9IGNvbmZpZy5sb2dvLnJlY3Q7CiAgICAgICAgY3R4LmRyYXdJbWFnZShsb2dvSW1nLCB4ICsg
ZHgsIHkgKyBkeSwgdywgaCk7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbmZpZy50ZXh0IHx8IFtdKSB7CiAg
ICAgICAgY3R4LmZvbnQgPSBpdGVtLmZvbnQ7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGl0ZW0uY29sb3I7CiAgICAgICAgY3R4
LnRleHRBbGlnbiA9IGl0ZW0uYWxpZ24gfHwgJ2xlZnQnOwogICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSBpdGVtLmJhc2VsaW5l
IHx8ICdhbHBoYWJldGljJzsKICAgICAgICBpZiAoaXRlbS5sZXR0ZXJTcGFjaW5nICYmICdsZXR0ZXJTcGFjaW5nJyBpbiBjdHgp
IGN0eC5sZXR0ZXJTcGFjaW5nID0gaXRlbS5sZXR0ZXJTcGFjaW5nOwogICAgICAgIGN0eC5maWxsVGV4dChpdGVtLnRleHQsIGl0
ZW0ueCArIGR4LCBpdGVtLnkgKyBkeSk7CiAgICAgIH0KICAgIH0KICAgIGlmICghc21lYXIpIHsgZHJhd0FsbCgwLCAwKTsgcmV0
dXJuIG87IH0KICAgIGNvbnN0IGQgPSBjb25maWcuZHJpZnREaXIgfHwgWzEsIDBdOwogICAgY29uc3QgbGVuID0gTWF0aC5oeXBv
dChkWzBdLCBkWzFdKSB8fCAxOwogICAgY29uc3QgdXggPSBkWzBdIC8gbGVuLCB1eSA9IGRbMV0gLyBsZW47CiAgICBjb25zdCBj
b3BpZXMgPSA5OwogICAgaWYgKCdmaWx0ZXInIGluIGN0eCkgY3R4LmZpbHRlciA9ICdibHVyKCcgKyAoc21lYXIgKiAwLjU1ICog
aykgKyAncHgpJzsKICAgIGN0eC5nbG9iYWxBbHBoYSA9IDEgLyBjb3BpZXM7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvcGll
czsgaSsrKSB7CiAgICAgIGNvbnN0IHMgPSAoaSAvIChjb3BpZXMgLSAxKSAtIDAuNSkgKiAyICogc21lYXIgKiAxLjM7ICAgLy8g
c3RyZWFrIG9mIDIuNiBzbWVhciBsZW5ndGhzIGFsb25nIHRoZSBmbG93CiAgICAgIGRyYXdBbGwodXggKiBzLCB1eSAqIHMpOwog
ICAgfQogICAgY3R4Lmdsb2JhbEFscGhhID0gMTsKICAgIGlmICgnZmlsdGVyJyBpbiBjdHgpIGN0eC5maWx0ZXIgPSAnbm9uZSc7
CiAgICByZXR1cm4gbzsKICB9CgogIGZ1bmN0aW9uIGNvbXBpbGUoZ2wsIHR5cGUsIHNyYykgewogICAgY29uc3Qgc2ggPSBnbC5j
cmVhdGVTaGFkZXIodHlwZSk7CiAgICBnbC5zaGFkZXJTb3VyY2Uoc2gsIHNyYyk7CiAgICBnbC5jb21waWxlU2hhZGVyKHNoKTsK
ICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoLCBnbC5DT01QSUxFX1NUQVRVUykpIHRocm93IG5ldyBFcnJvcihnbC5n
ZXRTaGFkZXJJbmZvTG9nKHNoKSk7CiAgICByZXR1cm4gc2g7CiAgfQoKICBmdW5jdGlvbiB1cGxvYWQoZ2wsIHRleCwgc291cmNl
LCB1bml0KSB7CiAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwICsgdW5pdCk7CiAgICBnbC5iaW5kVGV4dHVyZShnbC5U
RVhUVVJFXzJELCB0ZXgpOwogICAgZ2wucGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgZmFsc2UpOwogICAgZ2wu
cGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCB0cnVlKTsKICAgIGdsLnRleEltYWdlMkQoZ2wu
VEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgc291cmNlKTsKICAgIGdsLnRleFBhcmFt
ZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpOwogICAgZ2wudGV4UGFyYW1l
dGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7CiAgICBnbC50ZXhQYXJhbWV0
ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSKTsKICAgIGdsLnRleFBhcmFtZXRlcmko
Z2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpOwogIH0KCiAgLy8gTm8gV2ViR0w6IHRoZSBz
dGlsbCwgY2FyIHBsdXMgb3ZlcmxheSwgdGhyb3VnaCB0aGUgMkQgY29udGV4dC4KICBmdW5jdGlvbiBmYWxsYmFjayhjYW52YXMs
IGNvbmZpZywgYXBpLCBrKSB7CiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKICAgIGxldCBjYXIgPSBu
dWxsOwogICAgYXN5bmMgZnVuY3Rpb24gZHJhdygpIHsKICAgICAgaWYgKCFjYXIpIGNhciA9IGF3YWl0IGxvYWRJbWFnZShjb25m
aWcuaW1hZ2UpOwogICAgICBjb25zdCBvdmVybGF5ID0gYXdhaXQgYnVpbGRPdmVybGF5KGNvbmZpZywgayk7CiAgICAgIGN0eC5j
bGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTsKICAgICAgY3R4LmRyYXdJbWFnZShjYXIsIDAsIDAs
IGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7CiAgICAgIGN0eC5kcmF3SW1hZ2Uob3ZlcmxheSwgMCwgMCwgY2FudmFzLndp
ZHRoLCBjYW52YXMuaGVpZ2h0KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBhcGkudXBkYXRlT3ZlcmxheSA9IGRyYXc7
CiAgICBhcGkucmVhZHkgPSBkcmF3KCk7CiAgICByZXR1cm4gYXBpOwogIH0KCiAgZnVuY3Rpb24gc3RhcnQoY2FudmFzLCBjb25m
aWcsIG9wdHMpIHsKICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgY29uc3QgYXV0b3BsYXkgPSBvcHRzLmF1dG9wbGF5ICE9PSBm
YWxzZTsKICAgIGNvbnN0IHJlZHVjZSA9IG9wdHMucmVkdWNlZE1vdGlvbiA9PT0gJ2lnbm9yZScgPyBmYWxzZQogICAgICA6ICEh
KHdpbmRvdy5tYXRjaE1lZGlhICYmIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKScp
Lm1hdGNoZXMpOwogICAgaWYgKChjb25maWcuc3BlZWQgKiBjb25maWcucGVyaW9kKSAlIDEyMCAhPT0gMCkgY29uc29sZS53YXJu
KCdFU0hhemU6IHNwZWVkIHggcGVyaW9kIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDEyMCBmb3IgYSBzZWFtbGVzcyBsb29wJyk7
CgogICAgY29uc3QgZHByID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlv
KSB8fCAxOwogICAgY29uc3QgayA9IE1hdGgubWF4KDEsIE1hdGgubWluKG9wdHMucGl4ZWxSYXRpbyAhPSBudWxsID8gb3B0cy5w
aXhlbFJhdGlvIDogZHByLCBvcHRzLm1heFBpeGVsUmF0aW8gfHwgMikpOwogICAgY2FudmFzLndpZHRoID0gTWF0aC5yb3VuZChj
b25maWcud2lkdGggKiBrKTsKICAgIGNhbnZhcy5oZWlnaHQgPSBNYXRoLnJvdW5kKGNvbmZpZy5oZWlnaHQgKiBrKTsKICAgIGNv
bnN0IGFwaSA9IHsgY29uZmlnLCBwaXhlbFJhdGlvOiBrLCByZW5kZXI6IGZ1bmN0aW9uICgpIHt9LCBzdG9wOiBmdW5jdGlvbiAo
KSB7fSwgdXBkYXRlT3ZlcmxheTogbnVsbCwgcmVhZHk6IG51bGwsIHdlYmdsOiBmYWxzZSB9OwoKICAgIC8vIGFscGhhOiB0cnVl
IHNvIGEgY3V0LW91dCBjYXIgc2l0cyBvbiB3aGF0ZXZlciB0aGUgcGFnZSBwdXRzIGJlaGluZCB0aGUgY2FudmFzLgogICAgY29u
c3QgZ2wgPSBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCB7IHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdHJ1ZSwgYW50aWFsaWFz
OiBmYWxzZSwgYWxwaGE6IHRydWUsIHByZW11bHRpcGxpZWRBbHBoYTogdHJ1ZSB9KTsKICAgIGlmICghZ2wpIHJldHVybiBmYWxs
YmFjayhjYW52YXMsIGNvbmZpZywgYXBpLCBrKTsKICAgIGFwaS53ZWJnbCA9IHRydWU7CgogICAgY29uc3QgcHJvZyA9IGdsLmNy
ZWF0ZVByb2dyYW0oKTsKICAgIGdsLmF0dGFjaFNoYWRlcihwcm9nLCBjb21waWxlKGdsLCBnbC5WRVJURVhfU0hBREVSLCBWUykp
OwogICAgZ2wuYXR0YWNoU2hhZGVyKHByb2csIGNvbXBpbGUoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgRlMpKTsKICAgIGdsLmxp
bmtQcm9ncmFtKHByb2cpOwogICAgaWYgKCFnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2csIGdsLkxJTktfU1RBVFVTKSkgdGhy
b3cgbmV3IEVycm9yKGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2cpKTsKICAgIGdsLnVzZVByb2dyYW0ocHJvZyk7CgogICAgY29u
c3QgYnVmID0gZ2wuY3JlYXRlQnVmZmVyKCk7CiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmKTsKICAgIGds
LmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFstMSwgLTEsIDMsIC0xLCAtMSwgM10pLCBnbC5T
VEFUSUNfRFJBVyk7CiAgICBjb25zdCBhUG9zID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZywgJ2FQb3MnKTsKICAgIGdsLmVu
YWJsZVZlcnRleEF0dHJpYkFycmF5KGFQb3MpOwogICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihhUG9zLCAyLCBnbC5GTE9BVCwg
ZmFsc2UsIDAsIDApOwoKICAgIGNvbnN0IFUgPSB7fTsKICAgIGZvciAoY29uc3QgbmFtZSBvZiBVTklGT1JNUykgVVtuYW1lXSA9
IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9nLCBuYW1lKTsKCiAgICBmdW5jdGlvbiBzZXRVbmlmb3Jtcyh0aW1lKSB7CiAgICAg
IGNvbnN0IGMgPSBjb25maWc7CiAgICAgIGNvbnN0IHRyYXZlbCA9IGMuc3BlZWQgKiBjLnBlcmlvZDsgICAgICAgICAgICAvLyBw
eCB0aGUgc2xvd2VzdCBvY3RhdmUgbW92ZXMgcGVyIGxvb3AKICAgICAgZ2wudW5pZm9ybTFpKFUudUltYWdlLCAwKTsKICAgICAg
Z2wudW5pZm9ybTFpKFUudU92ZXJsYXksIDEpOwogICAgICBnbC51bmlmb3JtMWkoVS51T3ZlcmxheUJsdXIsIDIpOwogICAgICBn
bC51bmlmb3JtMmYoVS51UmVzLCBjLndpZHRoLCBjLmhlaWdodCk7ICAgICAgLy8gdGhlIHNoYWRlciB3b3JrcyBpbiBkZXNpZ24g
cHggd2hhdGV2ZXIgdGhlIGJhY2tpbmcgc2l6ZQogICAgICBnbC51bmlmb3JtMWYoVS51VGltZSwgdGltZSk7CiAgICAgIGdsLnVu
aWZvcm0xZihVLnVQZXJpb2QsIGMucGVyaW9kKTsKICAgICAgZ2wudW5pZm9ybTFmKFUudVNwZWVkLCBjLnNwZWVkKTsKICAgICAg
Z2wudW5pZm9ybTNmKFUudVdyYXAsIHRyYXZlbCAvIDYwLCB0cmF2ZWwgKiAxLjUgLyAzMCwgdHJhdmVsICogMi4wIC8gMTUpOwog
ICAgICBnbC51bmlmb3JtMmYoVS51TW91dGgsIGMubW91dGhbMF0sIGMubW91dGhbMV0pOwogICAgICBnbC51bmlmb3JtMmYoVS51
TW91dGhBeGVzLCBjLm1vdXRoQXhlc1swXSwgYy5tb3V0aEF4ZXNbMV0pOwogICAgICBnbC51bmlmb3JtMWYoVS51TW91dGhBbmds
ZSwgYy5tb3V0aEFuZ2xlKTsKICAgICAgZ2wudW5pZm9ybTJmKFUudVBsdW1lQzEsIGMucGx1bWVDMVswXSwgYy5wbHVtZUMxWzFd
KTsKICAgICAgZ2wudW5pZm9ybTJmKFUudVBsdW1lRW5kLCBjLnBsdW1lRW5kWzBdLCBjLnBsdW1lRW5kWzFdKTsKICAgICAgZ2wu
dW5pZm9ybTJmKFUudVBsdW1lV2lkdGgsIGMucGx1bWVXaWR0aFswXSwgYy5wbHVtZVdpZHRoWzFdKTsKICAgICAgZ2wudW5pZm9y
bTJmKFUudURyaWZ0RGlyLCBjLmRyaWZ0RGlyWzBdLCBjLmRyaWZ0RGlyWzFdKTsKICAgICAgZ2wudW5pZm9ybTFmKFUudVN0cmVu
Z3RoLCBjLnN0cmVuZ3RoKTsKICAgICAgZ2wudW5pZm9ybTFmKFUudUVuZFN0cmVuZ3RoLCBjLmVuZFN0cmVuZ3RoKTsKICAgICAg
Z2wudW5pZm9ybTFmKFUudUZhbGxvZmYsIGMuZmFsbG9mZiB8fCAxLjApOwogICAgICBnbC51bmlmb3JtMWYoVS51Qmx1ciwgYy5i
bHVyKTsKICAgICAgZ2wudW5pZm9ybTFmKFUudUdsb3csIGMuZ2xvdyk7CiAgICAgIC8vIFBvY2tldCBmaWVsZDogYWJvdXQgMTcw
IHB4IGNlbGxzLCBkcmlmdGluZyBhdCAwLjh4OyB0aGUgY2VsbCBzaXplIGlzIG51ZGdlZCBzbyBpdCB3cmFwcyBhIHdob2xlCiAg
ICAgIC8vIG51bWJlciBvZiB0aW1lcyBwZXIgbG9vcCAodHJhdmVsICogMC44IC8gY2VsbCBpcyBhbiBpbnRlZ2VyKSBhbmQgdGhl
IGNhcHR1cmUgc3RheXMgc2VhbWxlc3MuCiAgICAgIGNvbnN0IHdhbnQgPSBjLnBvY2tldENlbGwgfHwgMTcwOwogICAgICBjb25z
dCB3cmFwcyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQodHJhdmVsICogMC44IC8gd2FudCkpOwogICAgICBnbC51bmlmb3JtMmYo
VS51UG9ja2V0LCB0cmF2ZWwgKiAwLjggLyB3cmFwcywgd3JhcHMpOwogICAgfQoKICAgIGxldCByYWYgPSAwOwogICAgbGV0IGNs
b2NrID0gMDsgICAgICAgICAgICAvLyBzZWNvbmRzIGFscmVhZHkgcGxheWVkLCBzbyBwbGF5KCkgYWZ0ZXIgc3RvcCgpIGNhcnJp
ZXMgb24gd2hlcmUgaXQgbGVmdCBvZmYKICAgIGFwaS5yZW5kZXIgPSBmdW5jdGlvbiAodGltZSkgewogICAgICBnbC52aWV3cG9y
dCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpOwogICAgICBzZXRVbmlmb3Jtcyh0aW1lKTsKICAgICAgZ2wuZHJh
d0FycmF5cyhnbC5UUklBTkdMRVMsIDAsIDMpOwogICAgfTsKICAgIGFwaS5zdG9wID0gZnVuY3Rpb24gKCkgeyBpZiAocmFmKSBj
YW5jZWxBbmltYXRpb25GcmFtZShyYWYpOyByYWYgPSAwOyB9OwogICAgYXBpLnBsYXkgPSBmdW5jdGlvbiAoKSB7CiAgICAgIGlm
IChyYWYgfHwgcmVkdWNlKSByZXR1cm47CiAgICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCkgLSBjbG9jayAqIDEw
MDA7CiAgICAgIGNvbnN0IGxvb3AgPSAoKSA9PiB7IGNsb2NrID0gKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQpIC8gMTAwMDsg
YXBpLnJlbmRlcihjbG9jayk7IHJhZiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTsgfTsKICAgICAgcmFmID0gcmVxdWVz
dEFuaW1hdGlvbkZyYW1lKGxvb3ApOwogICAgfTsKCiAgICBjb25zdCBjYXJUZXggPSBnbC5jcmVhdGVUZXh0dXJlKCk7CiAgICBj
b25zdCBvdmVybGF5VGV4ID0gZ2wuY3JlYXRlVGV4dHVyZSgpOwogICAgY29uc3Qgb3ZlcmxheUJsdXJUZXggPSBnbC5jcmVhdGVU
ZXh0dXJlKCk7CiAgICBsZXQgbGFzdFRpbWUgPSByZWR1Y2UgPyAwLjggOiAwOwogICAgY29uc3QgcmVuZGVyR2wgPSBhcGkucmVu
ZGVyOwogICAgYXBpLnJlbmRlciA9IGZ1bmN0aW9uICh0aW1lKSB7IGxhc3RUaW1lID0gdGltZTsgcmVuZGVyR2wodGltZSk7IH07
CgogICAgLy8gUmVkcmF3IHRoZSBvdmVybGF5IChhZnRlciBjaGFuZ2luZyB0ZXh0IGNvbG91cnMgb3IgdGhlIGxvZ28pIGFuZCBz
aG93IGl0IGF0IHRoZSBjdXJyZW50IHRpbWUuCiAgICBhcGkudXBkYXRlT3ZlcmxheSA9IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAg
ICAgY29uc3QgW292ZXJsYXksIHNtZWFyZWRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2J1aWxkT3ZlcmxheShjb25maWcsIGspLCBi
dWlsZE92ZXJsYXkoY29uZmlnLCBrLCBjb25maWcuYmx1cildKTsKICAgICAgdXBsb2FkKGdsLCBvdmVybGF5VGV4LCBvdmVybGF5
LCAxKTsKICAgICAgdXBsb2FkKGdsLCBvdmVybGF5Qmx1clRleCwgc21lYXJlZCwgMik7CiAgICAgIGFwaS5yZW5kZXIobGFzdFRp
bWUpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgYXBpLnJlYWR5ID0gKGFzeW5jICgpID0+IHsKICAgICAgY29uc3Qg
W2Nhciwgb3ZlcmxheSwgc21lYXJlZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbbG9hZEltYWdlKGNvbmZpZy5pbWFnZSksIGJ1aWxk
T3ZlcmxheShjb25maWcsIGspLCBidWlsZE92ZXJsYXkoY29uZmlnLCBrLCBjb25maWcuYmx1cildKTsKICAgICAgdXBsb2FkKGds
LCBjYXJUZXgsIGNhciwgMCk7CiAgICAgIHVwbG9hZChnbCwgb3ZlcmxheVRleCwgb3ZlcmxheSwgMSk7CiAgICAgIHVwbG9hZChn
bCwgb3ZlcmxheUJsdXJUZXgsIHNtZWFyZWQsIDIpOwogICAgICBhcGkucmVuZGVyKHJlZHVjZSA/IDAuOCA6IDApOwogICAgICBp
ZiAoYXV0b3BsYXkpIGFwaS5wbGF5KCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSkoKTsKICAgIHJldHVybiBhcGk7CiAgfQoK
ICByZXR1cm4geyBzdGFydDogc3RhcnQsIGJ1aWxkT3ZlcmxheTogYnVpbGRPdmVybGF5IH07Cn0pKCk7CgoKLyogZXNXaXRuZXNz
OiB0aGUgaGVhdC1oYXplIEYxIGNhciBvbiB0aGUgRjEgaHViIChDTC0yMDI2MTAyMi0wOSwgYmFuZCBDTC0yMDI2MTAyMi0xMSwg
Q0wtMjAyNjEwMjItMTgpLiBFbmdpbmUgYWJvdmU7IHRoaXMgd2lyZXMgaXQgdG8gdGhlIHBhZ2UuICovCihmdW5jdGlvbigpewog
IHZhciBjYW52YXM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVzSGF6ZUNhbnZhcyIpOwogIGlmKCFjYW52YXN8fCF3aW5kb3cu
RVNIYXplKXJldHVybjsKICB2YXIgTkFWWT0iIzI3MzI0OCIsV0hJVEU9IiNmZmZmZmYiOwogIHZhciBGT05UPSI0MDAgMTE4cHgg
SW1wYWN0LCBBbnRvbiwgJ0FyaWFsIEJsYWNrJywgc2Fucy1zZXJpZiI7CiAgdmFyIEZPTlRfTT0iNDAwIDEyOHB4IEltcGFjdCwg
QW50b24sICdBcmlhbCBCbGFjaycsIHNhbnMtc2VyaWYiOwogIHZhciBjZmdXaWRlPXsKICAgIHdpZHRoOjE5MjAsaGVpZ2h0OjQy
MCwKICAgIGltYWdlOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8xMC9mMS13aXRuZXNz
LWhpc3RvcnktY2FyLXJlYXItMngtZS53ZWJwIiwKICAgIHBlcmlvZDo0LHNwZWVkOjI0MCwKICAgIG1vdXRoOls2NDQsMjI4XSxt
b3V0aEF4ZXM6WzMwLDE4XSxtb3V0aEFuZ2xlOjAsCiAgICBwbHVtZUMxOlsxMDAwLDIyOF0scGx1bWVFbmQ6WzE1MDAsMjI4XSxw
bHVtZVdpZHRoOls3MCwzODBdLAogICAgZHJpZnREaXI6WzEsMF0sCiAgICBzdHJlbmd0aDoxOCxlbmRTdHJlbmd0aDowLjA1LGZh
bGxvZmY6MS41LGJsdXI6MTQsZ2xvdzowLAogICAgbG9nbzpudWxsLAogICAgdGV4dDpbCiAgICAgIHt0ZXh0OiJXSVRORVNTIEhJ
U1RPUlkiLGZvbnQ6Rk9OVCxjb2xvcjpXSElURSx4OjgyMCx5OjI2MixhbGlnbjoibGVmdCIsYmFzZWxpbmU6ImFscGhhYmV0aWMi
fQogICAgXQogIH07CiAgLyogcGhvbmVzOiBhIHRhbGxlciBiYW5kLCB0aGUgY2FyJ3MgcmVhciBsYXJnZXIsIHRoZSBoZWFkbGlu
ZSBvbiB0d28gbGluZXMgYmVzaWRlIGl0ICovCiAgdmFyIGNmZ05hcnJvdz17CiAgICB3aWR0aDoxMDgwLGhlaWdodDo3MjAsCiAg
ICBpbWFnZToiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMTAvZjEtd2l0bmVzcy1oaXN0
b3J5LWNhci1tb2JpbGUtMngud2VicCIsCiAgICBwZXJpb2Q6NCxzcGVlZDoyNDAsCiAgICBtb3V0aDpbNTI2LDM3NF0sbW91dGhB
eGVzOlsyNCwxNF0sbW91dGhBbmdsZTowLAogICAgcGx1bWVDMTpbODAwLDM3NF0scGx1bWVFbmQ6WzExNTAsMzc0XSxwbHVtZVdp
ZHRoOls3MCwzNDBdLAogICAgZHJpZnREaXI6WzEsMF0sCiAgICBzdHJlbmd0aDoxOCxlbmRTdHJlbmd0aDowLjA1LGZhbGxvZmY6
MS41LGJsdXI6MTQsZ2xvdzowLHBvY2tldENlbGw6MTUwLAogICAgbG9nbzpudWxsLAogICAgdGV4dDpbCiAgICAgIHt0ZXh0OiJX
SVRORVNTIixmb250OkZPTlRfTSxjb2xvcjpXSElURSx4OjU2MCx5OjM0NSxhbGlnbjoibGVmdCIsYmFzZWxpbmU6ImFscGhhYmV0
aWMifSwKICAgICAge3RleHQ6IkhJU1RPUlkiLGZvbnQ6Rk9OVF9NLGNvbG9yOldISVRFLHg6NTYwLHk6NDY3LGFsaWduOiJsZWZ0
IixiYXNlbGluZToiYWxwaGFiZXRpYyJ9CiAgICBdCiAgfTsKICB2YXIgbXE9d2luZG93Lm1hdGNoTWVkaWE/d2luZG93Lm1hdGNo
TWVkaWEoIihtYXgtd2lkdGg6NzAwcHgpIik6bnVsbDsKICBmdW5jdGlvbiBwaWNrKCl7cmV0dXJuIChtcSYmbXEubWF0Y2hlcyk/
Y2ZnTmFycm93OmNmZ1dpZGU7fQogIHZhciBjZmc9cGljaygpOwogIGZ1bmN0aW9uIGxpZ2h0KCl7CiAgICB2YXIgaD1kb2N1bWVu
dC5kb2N1bWVudEVsZW1lbnQ7CiAgICBpZihoLmdldEF0dHJpYnV0ZSgiZGF0YS10aGVtZSIpPT09ImxpZ2h0IilyZXR1cm4gdHJ1
ZTsKICAgIGlmKGguY2xhc3NMaXN0LmNvbnRhaW5zKCJlZWItbGlnaHQiKSlyZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBkb2N1bWVu
dC5ib2R5P2RvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCJkYXRhLXRoZW1lIik9PT0ibGlnaHQiOmZhbHNlOwogIH0KICBmdW5j
dGlvbiBhcHBseVRoZW1lKCl7CiAgICAvKiAyMiBPY3QgMjAyNiAoTG91aXMpOiB0aGUgc3R1ZGlvIGdyZXkgc2l0cyBiZWhpbmQg
dGhlIGNhciBpbiBib3RoIHRoZW1lcywgc28gdGhlIGhlYWRsaW5lIGlzIG5hdnkgaW4gYm90aC4KICAgICAgIFdISVRFIGlzIGtl
cHQgZm9yIGEgZGFyayBiYWNrZHJvcCBpZiB0aGF0IGV2ZXIgY29tZXMgYmFjay4gKi8KICAgIHZhciBjPWxpZ2h0KCk/TkFWWTpO
QVZZOwogICAgY2ZnV2lkZS50ZXh0LmZvckVhY2goZnVuY3Rpb24odCl7dC5jb2xvcj1jO30pOwogICAgY2ZnTmFycm93LnRleHQu
Zm9yRWFjaChmdW5jdGlvbih0KXt0LmNvbG9yPWM7fSk7CiAgfQogIGFwcGx5VGhlbWUoKTsKICB2YXIgaGF6ZT1FU0hhemUuc3Rh
cnQoY2FudmFzLGNmZyx7YXV0b3BsYXk6ZmFsc2UscmVkdWNlZE1vdGlvbjoiYXV0byJ9KTsKICB2YXIgb25TY3JlZW49ZmFsc2U7
CiAgZnVuY3Rpb24gcmVzdGFydCgpewogICAgdmFyIG5leHQ9cGljaygpOwogICAgaWYobmV4dD09PWNmZylyZXR1cm47CiAgICB0
cnl7aGF6ZS5zdG9wKCk7fWNhdGNoKGUpe30KICAgIGNmZz1uZXh0OwogICAgY2FudmFzLnN0eWxlLmFzcGVjdFJhdGlvPWNmZy53
aWR0aCsiIC8gIitjZmcuaGVpZ2h0OwogICAgaGF6ZT1FU0hhemUuc3RhcnQoY2FudmFzLGNmZyx7YXV0b3BsYXk6ZmFsc2UscmVk
dWNlZE1vdGlvbjoiYXV0byJ9KTsKICAgIGlmKG9uU2NyZWVuKWhhemUucmVhZHkudGhlbihmdW5jdGlvbigpe2hhemUucGxheSgp
O30pOwogIH0KICBpZihtcSl7aWYobXEuYWRkRXZlbnRMaXN0ZW5lciltcS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHJlc3Rh
cnQpO2Vsc2UgaWYobXEuYWRkTGlzdGVuZXIpbXEuYWRkTGlzdGVuZXIocmVzdGFydCk7fQogIHZhciB3YXM9bGlnaHQoKTsKICBm
dW5jdGlvbiBvbkNoYW5nZSgpewogICAgdmFyIG5vdz1saWdodCgpOwogICAgaWYobm93PT09d2FzKXJldHVybjsKICAgIHdhcz1u
b3c7YXBwbHlUaGVtZSgpOwogICAgaGF6ZS5yZWFkeS50aGVuKGZ1bmN0aW9uKCl7aGF6ZS51cGRhdGVPdmVybGF5KCk7fSk7CiAg
fQogIHRyeXsKICAgIHZhciBtbz1uZXcgTXV0YXRpb25PYnNlcnZlcihvbkNoYW5nZSk7CiAgICBtby5vYnNlcnZlKGRvY3VtZW50
LmRvY3VtZW50RWxlbWVudCx7YXR0cmlidXRlczp0cnVlLGF0dHJpYnV0ZUZpbHRlcjpbImNsYXNzIiwiZGF0YS10aGVtZSJdfSk7
CiAgICBpZihkb2N1bWVudC5ib2R5KW1vLm9ic2VydmUoZG9jdW1lbnQuYm9keSx7YXR0cmlidXRlczp0cnVlLGF0dHJpYnV0ZUZp
bHRlcjpbImNsYXNzIiwiZGF0YS10aGVtZSJdfSk7CiAgfWNhdGNoKGUpe30KICBmdW5jdGlvbiBwbGF5KCl7aGF6ZS5yZWFkeS50
aGVuKGZ1bmN0aW9uKCl7aGF6ZS5wbGF5KCk7fSk7fQogIGlmKCJJbnRlcnNlY3Rpb25PYnNlcnZlciIgaW4gd2luZG93KXsKICAg
IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlcyl7CiAgICAgIGVzLmZvckVhY2goZnVuY3Rpb24oZW4pe29uU2Ny
ZWVuPWVuLmlzSW50ZXJzZWN0aW5nO2lmKGVuLmlzSW50ZXJzZWN0aW5nKXtwbGF5KCk7fWVsc2V7aGF6ZS5zdG9wKCk7fX0pOwog
ICAgfSx7dGhyZXNob2xkOjAuMDV9KS5vYnNlcnZlKGNhbnZhcyk7CiAgfWVsc2V7b25TY3JlZW49dHJ1ZTtwbGF5KCk7fQp9KSgp
Owo=
Need help navigating the venue? Click to reveal the map Hide the map
Yas Marina Circuit Guide
Most circuits earn a reputation lap by lap over decades. This one opened with a title decider and has crowned world champions ever since.
Yas Marina opened in 2009 with a season finale and has closed the Formula 1 calendar in most years since. The race begins in daylight and finishes under floodlights, and the transition through sunset is the circuit's signature: track temperature drops sharply through the race and shifts the balance of the cars. The layout was substantially reprofiled in 2021, opening out the hairpin and the marina section, and the racing has been better for it ever since.
ES Sport holds confirmed allocation across the hospitality inventory here , which makes this the one round on the calendar where availability questions get an immediate answer.
First Grand Prix 2009 Formula 1 at Yas Marina since
Lap length 5.281 km 16 corners, anticlockwise
Race 58 laps 306 km, daylight into night
Race lap record 1:25.637 Kevin Magnussen, 2024
Longest straight 1.2 km Two overtaking zones
Titles settled here 5 2010, 2014, 2016, 2021, 2025
Capacity 60,000+ Grandstands, hill and suites
Race start Twilight The only day-into-night race
Location Yas Island Abu Dhabi
Season finale Since 2014 The last round every year
Reprofiled 2021 21 corners down to 16
2026 dates 3 to 6 Dec Thursday to Sunday
How the track behaves
The only twilight race. Lights out in late-afternoon sun, chequered flag under floodlights. Track temperature falls all race, and setups are a compromise between the two.
Anticlockwise, one of the few on the calendar, so the neck loading and the kerb lines feel different from almost everywhere else.
The 2021 relayout cut 21 corners to 16 and opened the hairpin onto a 1.2 km straight with two DRS (drag reduction system) zones. The biggest braking moment of the lap waits at the end of it, into Turns 6 and 7.
Traction decides it. The marina section wraps the W Abu Dhabi hotel. Low speed, close walls, and the race is won on rear grip and patience.
Where to watch it from
The Main Grandstand faces the pit straight, the grid and the podium. The title, if it goes the distance, gets decided in front of it.
The West Grandstand takes the cars arriving flat out at the end of the longest straight, braking hard for Turns 6 and 7 in front of you.
Suites and lounges look over everything from the podium to the marina, with the closest views of a car on this circuit.
Key corners
T1
Turn 1 A tight left immediately after the start, and a regular first lap flashpoint.
T5
Turn 5 Heavy braking at the end of the long back straight and the primary overtaking point on the lap.
T9
Turn 9 Reprofiled in 2021 into a faster, more open corner that improved the following section considerably.
T12–14
Marina section Through the harbour past the yachts and under the Yas Hotel, the most recognisable stretch of the circuit.
T16
Final corner Onto the start/finish straight, deciding the run to the line.
Ci8qIGVzTWFwRm9sZDogdGhlIGludGVyYWN0aXZlIG1hcCBiZWhpbmQgYSBiYXIgKENMLTIwMjYxMDIyLTE3KS4gT3BlbnMgb24g
Y2xpY2sgb3Igb24gYSBoYXNoIGluc2lkZSB0aGUgZm9sZC4gKi8KKGZ1bmN0aW9uKCl7CiAgdmFyIHNlYz1kb2N1bWVudC5nZXRF
bGVtZW50QnlJZCgiY2lyY3VpdCIpLGJ0bj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFwRm9sZEJ0biIpLGZvbGQ9ZG9jdW1l
bnQuZ2V0RWxlbWVudEJ5SWQoIm1hcEZvbGQiKTsKICBpZighc2VjfHwhYnRufHwhZm9sZClyZXR1cm47CiAgdmFyIHQ9bnVsbDsK
ICBmdW5jdGlvbiBzZXQob3BlbixzY3JvbGwpewogICAgZm9sZC5jbGFzc0xpc3QudG9nZ2xlKCJvcGVuIixvcGVuKTsKICAgIGJ0
bi5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLG9wZW4/InRydWUiOiJmYWxzZSIpOwogICAgc2VjLmNsYXNzTGlzdC50b2dn
bGUoIm1mLWNsb3NlZCIsIW9wZW4pOwogICAgaWYob3Blbil7CiAgICAgIGNsZWFyVGltZW91dCh0KTsKICAgICAgdD1zZXRUaW1l
b3V0KGZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgicmVzaXplIikpO31jYXRjaChlKXt9fSw1
NjApOwogICAgICBpZihzY3JvbGwpe3RyeXtidG4uc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOiJzbW9vdGgiLGJsb2NrOiJzdGFy
dCJ9KTt9Y2F0Y2goZSl7fX0KICAgIH0KICB9CiAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3NldCgh
Zm9sZC5jbGFzc0xpc3QuY29udGFpbnMoIm9wZW4iKSxmYWxzZSk7fSk7CiAgZnVuY3Rpb24gaGFzaEluc2lkZSgpewogICAgdmFy
IGg9bG9jYXRpb24uaGFzaD9sb2NhdGlvbi5oYXNoLnNsaWNlKDEpOiIiOwogICAgaWYoIWgpcmV0dXJuIGZhbHNlOwogICAgaWYo
aD09PSJjaXJjdWl0IilyZXR1cm4gdHJ1ZTsKICAgIHZhciBlbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChoKTsKICAgIHJldHVy
biAhIShlbCYmZm9sZC5jb250YWlucyhlbCkpOwogIH0KICBmdW5jdGlvbiBvbkhhc2goKXtpZihoYXNoSW5zaWRlKCkpe3NldCh0
cnVlLGZhbHNlKTt9fQogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIixvbkhhc2gpOwogIGRvY3VtZW50LmFk
ZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihldil7CiAgICB2YXIgYT1ldi50YXJnZXQmJmV2LnRhcmdldC5jbG9zZXN0
P2V2LnRhcmdldC5jbG9zZXN0KCdhW2hyZWZePSIjIl0nKTpudWxsOwogICAgaWYoIWEpcmV0dXJuOwogICAgdmFyIGlkPWEuZ2V0
QXR0cmlidXRlKCJocmVmIikuc2xpY2UoMSksZWw9aWQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOm51bGw7CiAgICBpZihp
ZD09PSJjaXJjdWl0Inx8KGVsJiZmb2xkLmNvbnRhaW5zKGVsKSkpc2V0KHRydWUsZmFsc2UpOwogIH0pOwogIHNldChoYXNoSW5z
aWRlKCksZmFsc2UpOwp9KSgpOwo=
Private hospitality
Private Suites.
Private hospitality at the Abu Dhabi Grand Prix deserves its own space. Our trackside
suites, lounges and private hosted spaces are detailed on our private hospitality page, with full
inventory, floor plans and everything you need to choose the right space.
← →
P1 · Leads Antonelli 340 pts
P2 Russell 238 pts
P3 Hamilton 229 pts
P4 Verstappen 221 pts
P5 Leclerc 215 pts
Drivers' championship standings after the Singapore Grand Prix, 13 October 2026
Mercedes Engine · Mercedes 63 Russell · 12 Antonelli
63
George Russell United Kingdom · RUS
Age 28
World titles 0
Yas wins 0
Second in the standings, chasing his own team-mate. Mercedes lead the constructors' table into the finale.
Career record formula1.com, 20 October 2026
Grands prix 169
Wins 8
Podiums 32
Career points 1,271
Best finish P1 ×8
Best grid P1 ×13
Born 15/02/1998 · King's Lynn, England
12
Kimi Antonelli Italy · ANT
Age 20
World titles 0
Yas wins 0
Arrives leading the championship. A title at 20 would make him the youngest world champion in Formula 1 history.
Career record formula1.com, 20 October 2026
Grands prix 41
Wins 8
Podiums 17
Career points 490
Best finish P1 ×8
Best grid P1 ×6
Born 25/08/2006 · Bologna, Italy
Ferrari Engine · Ferrari 16 Leclerc · 44 Hamilton
16
Charles Leclerc Monaco · LEC
Age 29
World titles 0
Yas wins 0
Took a Yas Marina podium from P19 on the grid in 2024. Fifth in the standings.
Career record formula1.com, 20 October 2026
Grands prix 188
Wins 9
Podiums 55
Career points 1,887
Best finish P1 ×9
Best grid P1 ×27
Born 16/10/1997 · Monte Carlo, Monaco
44
Lewis Hamilton United Kingdom · HAM
Yas winner
Age 41
World titles 7
Yas wins 5
Five Abu Dhabi wins, level with Verstappen as the most on this grid. Third in the 2026 standings.
Career record formula1.com, 20 October 2026
Grands prix 397
Wins 106
Podiums 208
Career points 5,247.5
Best finish P1 ×106
Best grid P1 ×104
Born 07/01/1985 · Stevenage, England
McLaren Engine · Mercedes 1 Norris · 81 Piastri
1
Lando Norris United Kingdom · NOR
Yas winner
Age 27
World titles 1
Yas wins 1
Won here from pole in 2024, then sealed the 2025 title here with third place. Carries the number 1 as reigning champion.
Career record formula1.com, 20 October 2026
Grands prix 168
Wins 13
Podiums 49
Career points 1,631
Best finish P1 ×13
Best grid P1 ×19
Born 13/11/1999 · Bristol, England
81
Oscar Piastri Australia · PIA
Age 25
World titles 0
Yas wins 0
Second in the 2025 finale, two points from the championship. Still after a first Yas Marina win.
Career record formula1.com, 20 October 2026
Grands prix 85
Wins 9
Podiums 28
Career points 937
Best finish P1 ×9
Best grid P1 ×6
Born 06/04/2001 · Melbourne, Australia
Red Bull Racing Engine · Red Bull Powertrains 3 Verstappen · 6 Hadjar
3
Max Verstappen Netherlands · VER
Yas winner
Age 29
World titles 4
Yas wins 5
Five wins here, including the 2021 last-lap title decider and the 2025 finale. Holds the race lap record.
Career record formula1.com, 20 October 2026
Grands prix 250
Wins 73
Podiums 136
Career points 3,665.5
Best finish P1 ×73
Best grid P1 ×50
Born 30/09/1997 · Hasselt, Belgium
6
Isack Hadjar France · HAD
New seat
Age 22
World titles 0
Yas wins 0
First Abu Dhabi weekend in the senior Red Bull seat after his breakout rookie year.
Career record formula1.com, 20 October 2026
Grands prix 37
Wins 0
Podiums 3
Career points 148
Best finish P3 ×3
Best grid P3 ×1
Born 28/09/2004 · Paris, France
Racing Bulls Engine · Red Bull Powertrains 30 Lawson · 41 Lindblad
30
Liam Lawson New Zealand · LAW
Age 24
World titles 0
Yas wins 0
Now the senior name at the junior Red Bull team after Hadjar's promotion.
Career record formula1.com, 20 October 2026
Grands prix 52
Wins 0
Podiums 0
Career points 119
Best finish P5 ×2
Best grid P3 ×1
Born 11/02/2002 · Hastings, New Zealand
41
Arvid Lindblad United Kingdom · LIN
Rookie
Age 19
World titles 0
Yas wins 0
The only rookie on the 2026 grid, and its youngest driver. First time at Yas Marina in a Formula 1 car.
Career record formula1.com, 20 October 2026
Grands prix 16
Wins 0
Podiums 0
Career points 38
Best finish P6 ×1
Best grid P7 ×1
Born 08/08/2007 · London, England
Alpine Engine · Mercedes 10 Gasly · 43 Colapinto
10
Pierre Gasly France · GAS
Age 30
World titles 0
Yas wins 0
A grand prix winner with 194 starts behind him, the experienced head in the Alpine garage.
Career record formula1.com, 20 October 2026
Grands prix 194
Wins 1
Podiums 5
Career points 499
Best finish P1 ×1
Best grid P1 ×1
Born 07/02/1996 · Rouen, France
43
Franco Colapinto Argentina · COL
Age 23
World titles 0
Yas wins 0
Argentina's first full-season Formula 1 driver in a generation, in his second year with Alpine.
Career record formula1.com, 20 October 2026
Grands prix 43
Wins 0
Podiums 0
Career points 32
Best finish P6 ×1
Best grid P7 ×1
Born 27/05/2003 · Buenos Aires, Argentina
Haas F1 Team Engine · Ferrari 31 Ocon · 87 Bearman
31
Esteban Ocon France · OCO
Age 30
World titles 0
Yas wins 0
A race winner in his second season leading the American team's line-up.
Career record formula1.com, 20 October 2026
Grands prix 197
Wins 1
Podiums 4
Career points 490
Best finish P1 ×1
Best grid P3 ×3
Born 17/09/1996 · Évreux, France
87
Oliver Bearman United Kingdom · BEA
Age 21
World titles 0
Yas wins 0
The Ferrari academy graduate who scored on his Formula 1 debut, now a fixture at Haas.
Career record formula1.com, 20 October 2026
Grands prix 44
Wins 0
Podiums 0
Career points 71
Best finish P4 ×1
Best grid P8 ×2
Born 08/05/2005 · Chelmsford, England
Audi Engine · Audi 27 Hülkenberg · 5 Bortoleto
27
Nico Hülkenberg Germany · HUL
New team
Age 39
World titles 0
Yas wins 0
Audi's first season. His first Formula 1 podium came at Silverstone in 2025, in his 16th year in the sport.
Career record formula1.com, 20 October 2026
Grands prix 266
Wins 0
Podiums 1
Career points 635
Best finish P3 ×1
Best grid P1 ×1
Born 19/08/1987 · Emmerich am Rhein, Germany
5
Gabriel Bortoleto Brazil · BOR
New team
Age 22
World titles 0
Yas wins 0
Carried over from Sauber into the new Audi works team for his second season.
Career record formula1.com, 20 October 2026
Grands prix 40
Wins 0
Podiums 0
Career points 29
Best finish P6 ×1
Best grid P7 ×3
Born 14/10/2004 · São Paulo, Brazil
Williams Engine · Mercedes 55 Sainz · 23 Albon
55
Carlos Sainz Spain · SAI
Age 32
World titles 0
Yas wins 0
On the Yas Marina podium in 2021. Second season leading the Williams rebuild.
Career record formula1.com, 20 October 2026
Grands prix 246
Wins 4
Podiums 29
Career points 1,343.5
Best finish P1 ×4
Best grid P1 ×6
Born 01/09/1994 · Madrid, Spain
23
Alex Albon Thailand · ALB
Age 30
World titles 0
Yas wins 0
Raced here for Red Bull before Williams, and knows this circuit from both ends of the grid.
Career record formula1.com, 20 October 2026
Grands prix 144
Wins 0
Podiums 2
Career points 318
Best finish P3 ×2
Best grid P4 ×5
Born 23/03/1996 · London, England
Aston Martin Engine · Honda 14 Alonso · 18 Stroll
14
Fernando Alonso Spain · ALO
Age 45
World titles 2
Yas wins 0
Lost the four-way 2010 title decider here. The grid's elder statesman, now with Honda power.
Career record formula1.com, 20 October 2026
Grands prix 444
Wins 32
Podiums 106
Career points 2,400
Best finish P1 ×32
Best grid P1 ×22
Born 29/07/1981 · Oviedo, Spain
18
Lance Stroll Canada · STR
Age 28
World titles 0
Yas wins 0
A tenth Abu Dhabi start, all with the same Silverstone team through its Racing Point and Aston Martin years.
Career record formula1.com, 20 October 2026
Grands prix 206
Wins 0
Podiums 3
Career points 325
Best finish P3 ×3
Best grid P1 ×1
Born 29/10/1998 · Montreal, Canada
Cadillac Engine · Ferrari 11 Pérez · 77 Bottas
11
Sergio Pérez Mexico · PER
New team
Age 36
World titles 0
Yas wins 0
Held off Hamilton here for lap after lap in 2021. Back from a year out with Formula 1's newest team.
Career record formula1.com, 20 October 2026
Grands prix 298
Wins 6
Podiums 39
Career points 1,638
Best finish P1 ×6
Best grid P1 ×3
Born 26/01/1990 · Guadalajara, Mexico
77
Valtteri Bottas Finland · BOT
New team Yas winner
Age 37
World titles 0
Yas wins 1
Won here in 2017. One of only four Yas Marina winners on the 2026 grid.
Career record formula1.com, 20 October 2026
Grands prix 263
Wins 10
Podiums 67
Career points 1,797
Best finish P1 ×10
Best grid P1 ×20
Born 28/08/1989 · Nastola, Finland
Career records as listed on the official Formula 1 driver pages, 20 October 2026 · driver ages at race weekend
LyogZXNHcmlkOiBsaXZlIGRyaXZlcnMnIGNoYW1waW9uc2hpcCB0aWxlcyBvbiB0aGUgRjEgaHViIChDTC0yMDI2MTAyMC0wMSkuCiAgIFNvdXJjZTogYXBp
LmpvbHBpLmNhIChFcmdhc3QtY29tcGF0aWJsZSwgQ09SUyBvcGVuKS4gRmFpbHMgcXVpZXQ6IHRoZSBiYWtlZAogICBzbmFwc2hvdCBhbmQgaXRzIGRhdGVk
IGxhYmVsIHN0YXkgaW4gcGxhY2UuICovCihmdW5jdGlvbigpewogIHZhciBib3g9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRnU3RhbmRpbmdzIik7CiAg
dmFyIG5vdGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRnTm90ZSIpOwogIGlmKCFib3gpcmV0dXJuOwogIGZ1bmN0aW9uIGFwcGx5KGopewogICAgdmFy
IHQ9aiYmai5NUkRhdGEmJmouTVJEYXRhLlN0YW5kaW5nc1RhYmxlOwogICAgdmFyIEw9dCYmdC5TdGFuZGluZ3NMaXN0cyYmdC5TdGFuZGluZ3NMaXN0c1sw
XTsKICAgIGlmKCFMfHwhTC5Ecml2ZXJTdGFuZGluZ3N8fCFMLkRyaXZlclN0YW5kaW5ncy5sZW5ndGgpcmV0dXJuOwogICAgdmFyIGRzPUwuRHJpdmVyU3Rh
bmRpbmdzOwogICAgdmFyIHRpbGVzPWJveC5xdWVyeVNlbGVjdG9yQWxsKCIuZGctc3QiKTsKICAgIHZhciBuPU1hdGgubWluKHRpbGVzLmxlbmd0aCxkcy5s
ZW5ndGgpOwogICAgZm9yKHZhciBpPTA7aTxuO2krKyl7CiAgICAgIHZhciBubT10aWxlc1tpXS5xdWVyeVNlbGVjdG9yKCIubm0iKTsKICAgICAgdmFyIHB0
cz10aWxlc1tpXS5xdWVyeVNlbGVjdG9yKCIucHRzIGIiKTsKICAgICAgaWYobm0mJmRzW2ldLkRyaXZlciYmZHNbaV0uRHJpdmVyLmZhbWlseU5hbWUpbm0u
dGV4dENvbnRlbnQ9ZHNbaV0uRHJpdmVyLmZhbWlseU5hbWU7CiAgICAgIGlmKHB0cyYmZHNbaV0ucG9pbnRzKXB0cy50ZXh0Q29udGVudD1kc1tpXS5wb2lu
dHM7CiAgICB9CiAgICBpZihub3RlKW5vdGUudGV4dENvbnRlbnQ9IkxpdmUgZHJpdmVycycgY2hhbXBpb25zaGlwIHN0YW5kaW5ncywgYWZ0ZXIgcm91bmQg
IitMLnJvdW5kKyIgb2YgdGhlIDIwMjYgc2Vhc29uIjsKICB9CiAgdHJ5ewogICAgZmV0Y2goImh0dHBzOi8vYXBpLmpvbHBpLmNhL2VyZ2FzdC9mMS9jdXJy
ZW50L2RyaXZlcnN0YW5kaW5ncy5qc29uIix7bW9kZToiY29ycyJ9KQogICAgICAudGhlbihmdW5jdGlvbihyKXtpZighci5vayl0aHJvdyAwO3JldHVybiBy
Lmpzb24oKX0pCiAgICAgIC50aGVuKGFwcGx5KQogICAgICAuY2F0Y2goZnVuY3Rpb24oKXt9KTsKICB9Y2F0Y2goZSl7fQp9KSgpOwoKLyogRmxpY2tlci1p
biAoQ0wtMjAyNjEwMjAtMDgsIGZpcnN0IHNoaXBwZWQgdW5kZXIgdGhlIGNvbGxpZGluZyBpZCAtMDcpOiBqb2lucyB0aGUgcGFnZSdzIG1vIHN5c3RlbS4g
UnVucyBvbiBsb2FkLCBhZnRlcgogICB0aGUgbWFpbiBwYXlsb2FkJ3MgZGF0YS1tbyBjbGVhbnVwIGhhcyBmaW5pc2hlZCwgYW5kIGJyaW5ncyBpdHMgb3du
IG9ic2VydmVyCiAgICh0aGUgbWFpbiBvbmUgb25seSB3YXRjaGVzIGVsZW1lbnRzIGl0IHRhZ2dlZCBpdHNlbGYpLiBHYXRlZCBieSBodG1sLm1vIGxpa2UK
ICAgdGhlIHNoYXJlZCBydWxlczsgd2l0aG91dCB0aGUgZmxhZyBub3RoaW5nIGlzIHRhZ2dlZCwgc28gbm90aGluZyBjYW4gYmUgbGVmdAogICBoaWRkZW4u
IERyb3Bkb3duIGJvZGllcyBmbGljayB2aWEgQ1NTIG9uIFtvcGVuXSBpbnN0ZWFkLCBzbyBlbGVtZW50cyBpbnNpZGUKICAgdGhlIGNsb3NlZCBkcm9wZG93
bnMgYXJlIG5vdCB0YWdnZWQgaGVyZS4gKi8Kd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGZ1bmN0aW9uKCl7CiAgdHJ5ewogICAgaWYoIWRvY3Vt
ZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoIm1vIikpcmV0dXJuOwogICAgaWYoISgiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiIGluIHdp
bmRvdykpcmV0dXJuOwogICAgdmFyIHNlbHM9WyIjZGdTdGFuZGluZ3MgLmRnLXN0IiwiI2RyaXZlcnMgLmRnLWNhcmQgLmRnLXMiLCIjZHJpdmVycyAuZGct
bnVtIiwiI2RyaXZlcnMgLmRnLXRhZyIsIiNkcml2ZXJzIC5kZy1waG90byJdOwogICAgdmFyIHRhZ2dlZD1bXTsKICAgIHNlbHMuZm9yRWFjaChmdW5jdGlv
bihzKXsKICAgICAgdmFyIGxhc3Q9bnVsbCxvPTAsZWxzOwogICAgICB0cnl7ZWxzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocyl9Y2F0Y2goZSl7cmV0
dXJufQogICAgICBlbHMuZm9yRWFjaChmdW5jdGlvbihlbCl7CiAgICAgICAgaWYoZWwuaGFzQXR0cmlidXRlKCJkYXRhLW1vIikpcmV0dXJuOwogICAgICAg
IHZhciBwPWVsLnBhcmVudE5vZGU7CiAgICAgICAgbz0ocD09PWxhc3QpP28rMTowO2xhc3Q9cDsKICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoImRhdGEtbW8i
LCIiKTsKICAgICAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1tby1kIixNYXRoLm1pbig1MCpvLDMwMCkrIm1zIik7CiAgICAgICAgdGFnZ2VkLnB1c2go
ZWwpOwogICAgICB9KTsKICAgIH0pOwogICAgaWYoIXRhZ2dlZC5sZW5ndGgpcmV0dXJuOwogICAgdmFyIGlvPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihm
dW5jdGlvbihlcyl7CiAgICAgIGVzLmZvckVhY2goZnVuY3Rpb24oZW4pewogICAgICAgIGlmKGVuLmlzSW50ZXJzZWN0aW5nKXtlbi50YXJnZXQuY2xhc3NM
aXN0LmFkZCgibW8tbGl0Iik7aW8udW5vYnNlcnZlKGVuLnRhcmdldCl9CiAgICAgIH0pOwogICAgfSx7dGhyZXNob2xkOjAuMn0pOwogICAgdGFnZ2VkLmZv
ckVhY2goZnVuY3Rpb24oZWwpe2lvLm9ic2VydmUoZWwpfSk7CiAgfWNhdGNoKGUpe30KfSk7Cg==
Thursday 3 December
The circuit opens. Hospitality begins the weekend: settle in, walk the F1 Fanzone and the Oasis areas, and get your bearings before the track goes live.
Friday 4 December
Practice. Racing begins: Formula 1 practice runs into the evening under the lights, with the support series filling the day.
Saturday 5 December
Qualifying. Final practice, then qualifying at twilight sets the grid for the season finale.
Sunday 6 December
Race day. The Abu Dhabi Grand Prix: 58 laps from daylight into night, the podium on the pit straight, and the season decided.
After the track action, the Yasalam concerts take over Etihad Live in the evenings, with general admission included with every ticket.
Thursday 3 December
Lewis Capaldi
Thursday 3 December
Zara Larsson
Friday 4 December
Jennifer Lopez
Saturday 5 December
Imagine Dragons
Sunday 6 December
The Chainsmokers
Sunday 6 December
The Script
Every After-Race Concert is included with your ticket as general admission, first come, first served, with set times published by the organiser nearer the weekend. Ticketed separately that week: Yasalam Classics with Andrea Bocelli on 2 December at Etihad Arena, and the official after-party, Anyma presents ÆDEN, on 4 December at Yas Gateway Park. On the circuit, the 16/360 terraces carry their own DJ bill: Shimza on Friday, CamelPhat on Saturday and Black Coffee on Sunday.
Yasalam Concerts
After-race concerts at Etihad Live every night of the event, with Jennifer Lopez, Imagine Dragons and Lewis Capaldi leading the 2026 line-up. General admission included.
F1 Fanzone
Access to the F1 Fanzone and all Oasis areas across the circuit throughout the weekend.
Yas Theme Parks
A one day pass to a Yas Island theme park, from Ferrari World to Yas Waterworld.
Museum Entry
Entry to selected museums, making a race weekend an Abu Dhabi weekend.
✓ Included with every ES Sport F1 Abu Dhabi ticket package. Not an upgrade, not an add-on.
Travel How do you get to Yas Marina Circuit?
The circuit is on Yas Island, around 15 minutes from Zayed International Airport and 40 minutes from the city centre. Yas Island accommodation puts you within walking distance of a gate, which is the reason it books out first.
If walking is not an option, taxis and ride-hailing services run to Yas Island throughout the weekend, and there are designated drop-off points close to the gates. Shuttle buses also operate from Yas Island hotels and from set points in Abu Dhabi and Dubai on race days. We can arrange private transfers as part of your package. Tell us your hotel and any accessibility requirements when you enquire and we will confirm the best route in.
Travel First time at the Abu Dhabi GP?
December in the UAE is the most comfortable weather of any round on the calendar. The weekend extends well beyond the circuit: concerts, the island's hotels and the after race programme are a substantial part of what people come for.
FAQ When is the 2026 Abu Dhabi GP?
The race weekend runs 4 to 6 December 2026 at Yas Marina Circuit, with the event opening on 3 December. It closes the Formula 1 season.
FAQ Does ES Sport hold allocation here?
Yes. Abu Dhabi is our home round and we work across suites, lounges, terraces and grandstand seating. Enquiries here get a fast, direct answer on availability.
FAQ Which hospitality option should I choose?
It depends on whether you want the racing or the occasion. Trackside lounges and terrace collections put you at the circuit; suites are the full hosted weekend. Tell us the party and the priority and we will match it.
FAQ Are grandstand tickets sold separately?
Some Yas Marina inventory carries a hotel stay condition rather than being available standalone. We will tell you which applies before you commit to anything.
FAQ What about the concerts?
The Yasalam After-Race Concerts are included with most weekend tickets and are a significant part of the event, with Jennifer Lopez, Imagine Dragons and Lewis Capaldi leading the 2026 line-up. We can advise on which packages carry which access.
×
Enquire
Secure YourRace Weekend.
We'll get back to you.
LyogRjEgbWFwLCAxMSBTZXAgMjAyNjogY2xvc2UgY29udHJvbCBmb3IgdGhlIGRlc2t0b3Agem9uZSBwYW5lbCwgYW5kIHRoZSBtYXAgcmVkdWNlZCB0byB0
aGUKICAgem9uZXMgd2Ugc3RvY2sgYW5kIHJlZHJhd24gc28gZWFjaCBvbmUgcmVhZHMuIERvbmUgaGVyZSByYXRoZXIgdGhhbiBpbiB0aGUgbWluaWZpZWQg
bWFwIGNvZGUKICAgaW5zaWRlICNlc01haW5Kcy4KCiAgIFNoaXBwZWQgYXMgYmFzZTY0IGZvciB0aGUgc2FtZSByZWFzb24gI2VzTWFpbkpzIGlzOiBzZXJ2
ZWQgdGhyb3VnaCBXb3JkUHJlc3MsIGEgcGxhaW4gaW5saW5lCiAgIHNjcmlwdCBjb21lcyBiYWNrIHdpdGggc29tZSBvZiBpdHMgJiYgcmV3cml0dGVuIHRv
ICYjMDM4OyYjMDM4Oywgd2hpY2ggaXMgYSBzeW50YXggZXJyb3IgYW5kCiAgIHRha2VzIHRoZSB3aG9sZSBibG9jayBkb3duLiBJdCBtYW5nbGVkIHRocmVl
IG9mIHRoZSBzaXh0ZWVuIGhlcmUgYW5kIGxlZnQgdGhlIHJlc3QgYWxvbmUuICovCihmdW5jdGlvbigpewogIHZhciBaT05FUz1bWyJiZDdhOTQ4YTRlNjI0
MWFjYTZlY2M5ZmY1N2Q4YzBmN19jdGciLCJBYnUgRGhhYmkgSGlsbCIsIkFCVSBESEFCSSBISUxMIiwiZ2EiLC02LDE3Ml0sWyJmYTM0OWFmYzUxODY0Y2Fj
Yjk1YTM5OTU1ZDgyYjM3OV9jdGciLCJNYWluIEdyYW5kc3RhbmQiLCJNQUlOIEdSQU5EU1RBTkQiLCJncmFuZHN0YW5kIiwtMTI2LDQ2XSxbIjA5MGUxNjUy
YmQyYTRmYmFiMzBjY2ZhYzk4YzZmYzNjX2N0ZyIsIldlc3QgR3JhbmRzdGFuZCIsIldFU1QgR1JBTkRTVEFORCIsImdyYW5kc3RhbmQiLDIxMCwtNDBdLFsi
ZGRhNDc0ZTU3YzcyNGJmNzk2MDZhNmJhMzJkMjYyZDJfY3RnIiwiU3Vuc2V0IExvdW5nZSIsIlNVTlNFVCBMT1VOR0UiLCJsb3VuZ2UiLDAsLTY2XV0sIEhJ
TEw9ImJkN2E5NDhhNGU2MjQxYWNhNmVjYzlmZjU3ZDhjMGY3X2N0ZyIsIE5TPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CiAgLyogc3VidGxlOiB0
aGUgYmFuZCBhIHNoYWRlIGFib3ZlIHRoZSBpbnNpZGUsIHRoZSBlZGdlcyBhIHNoYWRlIGFib3ZlIHRoZSBiYW5kICovCiAgdmFyIFJJTkdfVz0xOCwgUklO
R19UPSIjMkUzNjUwIiwgUklOR19MPSIjNUE2Njg0IiwgUklOR19JPSIjMUIyMTMwIjsKICB2YXIgQlk9e307IFpPTkVTLmZvckVhY2goZnVuY3Rpb24oeil7
IEJZW3pbMF1dPXo7IH0pOwoKICAvKiAtLS0tLS0tLS0tIDEuIGNsb3NlIGNvbnRyb2wgb24gdGhlIGRlc2t0b3Agem9uZSBwYW5lbCAtLS0tLS0tLS0tICov
CiAgdmFyIHBhbmVsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6b25lUGFuZWwiKTsgaWYoIXBhbmVsKSByZXR1cm47CiAgdmFyIHRpdGxlPWRvY3VtZW50
LmdldEVsZW1lbnRCeUlkKCJ6cFRpdGxlIiksIGRlc2M9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwRGVzYyIpLAogICAgICB0aWVyPWRvY3VtZW50Lmdl
dEVsZW1lbnRCeUlkKCJ6cFRpZXIiKSwgY29kZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBDb2RlIiksCiAgICAgIG1lZGlhPWRvY3VtZW50LmdldEVs
ZW1lbnRCeUlkKCJ6cE1lZGlhIiksIHBrZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBQa2ciKTsKICBpZighdGl0bGUpIHJldHVybjsKICB2YXIgYmFz
ZT17dGl0bGU6dGl0bGUudGV4dENvbnRlbnQsZGVzYzpkZXNjP2Rlc2MudGV4dENvbnRlbnQ6IiIsdGllcjp0aWVyP3RpZXIudGV4dENvbnRlbnQ6IiIsY29k
ZTpjb2RlP2NvZGUudGV4dENvbnRlbnQ6IiJ9OwogIHZhciBidG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgYnRuLnR5cGU9ImJ1dHRv
biI7IGJ0bi5jbGFzc05hbWU9InpwLXgiOyBidG4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwiQ2xvc2Ugem9uZSBkZXRhaWxzIik7CiAgYnRuLmlubmVy
SFRNTD0iJnRpbWVzOyI7CiAgcGFuZWwuaW5zZXJ0QmVmb3JlKGJ0bixwYW5lbC5maXJzdENoaWxkKTsKICBmdW5jdGlvbiBjbG9zZVBhbmVsKCl7CiAgICB0
aXRsZS50ZXh0Q29udGVudD1iYXNlLnRpdGxlOwogICAgaWYoZGVzYykgZGVzYy50ZXh0Q29udGVudD1iYXNlLmRlc2M7CiAgICBpZih0aWVyKSB0aWVyLnRl
eHRDb250ZW50PWJhc2UudGllcjsKICAgIGlmKGNvZGUpIGNvZGUudGV4dENvbnRlbnQ9YmFzZS5jb2RlOwogICAgaWYobWVkaWEpIG1lZGlhLmhpZGRlbj10
cnVlOwogICAgaWYocGtnKSBwa2cuaGlkZGVuPXRydWU7CiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JB
bGwoIi5lcy16b25lLmVzLWFjdGl2ZSIpLGZ1bmN0aW9uKHope3ouY2xhc3NMaXN0LnJlbW92ZSgiZXMtYWN0aXZlIik7fSk7CiAgICAvKiB0aGUgbWFwIGRy
YXdzIGl0cyBvd24gY29ybmVyIGJyYWNrZXRzIGludG8gYSA8ZyBpZD0iZXMtbG9jayI+LCBzZXBhcmF0ZWx5IGZyb20gLmVzLWFjdGl2ZSwKICAgICAgIHNv
IGNsZWFyaW5nIHRoZSBjbGFzcyBhbG9uZSBsZWZ0IHRoZSBzdGFuZCBzdGlsbCBsb29raW5nIHBpY2tlZCAqLwogICAgdmFyIGxvY2s9ZG9jdW1lbnQuZ2V0
RWxlbWVudEJ5SWQoImVzLWxvY2siKTsKICAgIGlmKGxvY2spIGxvY2suc3R5bGUuZGlzcGxheT0ibm9uZSI7CiAgICBwYW5lbC5jbGFzc0xpc3QucmVtb3Zl
KCJ6cC1vcGVuIik7CiAgfQogIGJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsY2xvc2VQYW5lbCk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigi
a2V5ZG93biIsZnVuY3Rpb24oZSl7CiAgICB2YXIgbW9kYWw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpvbmVNb2RhbCIpOwogICAgaWYoZS5rZXk9PT0i
RXNjYXBlIiAmJiBwYW5lbC5jbGFzc0xpc3QuY29udGFpbnMoInpwLW9wZW4iKSAmJiAoIW1vZGFsfHxtb2RhbC5oaWRkZW4pKSBjbG9zZVBhbmVsKCk7CiAg
fSk7CiAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXsKICAgIHBhbmVsLmNsYXNzTGlzdC50b2dnbGUoInpwLW9wZW4iLCB0aXRsZS50ZXh0Q29u
dGVudCE9PWJhc2UudGl0bGUpOwogIH0pLm9ic2VydmUodGl0bGUse2NoaWxkTGlzdDp0cnVlLGNoYXJhY3RlckRhdGE6dHJ1ZSxzdWJ0cmVlOnRydWV9KTsK
CiAgLyogLS0tLS0tLS0tLSAyLiB0aGUgbWFwIGl0c2VsZiAtLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gYm94KGVsKXsgdHJ5eyB2YXIgYj1lbC5nZXRCQm94
KCk7IGlmKCFiLndpZHRoJiYhYi5oZWlnaHQpIHJldHVybiBudWxsOyByZXR1cm4gYjsgfWNhdGNoKGUpeyByZXR1cm4gbnVsbDsgfSB9CiAgZnVuY3Rpb24g
aGlkZShlbCl7IGVsLnN0eWxlLmRpc3BsYXk9Im5vbmUiOyBlbC5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpOyBlbC5yZW1vdmVBdHRyaWJ1
dGUoInRhYmluZGV4Iik7IH0KCiAgLyogQWJ1IERoYWJpIEhpbGwgc2hpcHMgYXMgYSBuYXJyb3cgYmFuZCBodWdnaW5nIHRoZSB0cmFjayBlZGdlLiBUaGUg
b2ZmaWNpYWwgbWFwIGRyYXdzIGl0IGFzCiAgICAgdGhlIGxhcmdlIGFyZWEgaXQgaXMsIHNvIHRoZSB0cmFjay1zaWRlIGVkZ2UgaXMgbGVmdCBleGFjdGx5
IHdoZXJlIGl0IGlzIGFuZCB0aGUgZmFyIGVkZ2UgaXMKICAgICBwdXNoZWQgYXdheSBmcm9tIGl0LiAqLwogIGZ1bmN0aW9uIGQyKGEsYil7IHJldHVybiAo
YS54LWIueCkqKGEueC1iLngpKyhhLnktYi55KSooYS55LWIueSk7IH0KICBmdW5jdGlvbiB4eShhKXsgcmV0dXJuIGEueC50b0ZpeGVkKDIpKyIgIithLnku
dG9GaXhlZCgyKTsgfQogIGZ1bmN0aW9uIHdpZGVuKGVsLGYpewogICAgdmFyIEw9ZWwuZ2V0VG90YWxMZW5ndGgmJmVsLmdldFRvdGFsTGVuZ3RoKCk7IGlm
KCFMKSByZXR1cm47CiAgICB2YXIgTj0xMjAscD1bXSxpLGo7CiAgICBmb3IoaT0wO2k8TjtpKyspeyB2YXIgcT1lbC5nZXRQb2ludEF0TGVuZ3RoKEwqaS9O
KTsgcC5wdXNoKHt4OnEueCx5OnEueX0pOyB9CiAgICB2YXIgZmFyPTAsYmVzdD0tMTsKICAgIGZvcihpPTE7aTxOO2krKyl7IHZhciBkPWQyKHBbaV0scFsw
XSk7IGlmKGQ+YmVzdCl7IGJlc3Q9ZDsgZmFyPWk7IH0gfQogICAgaWYoZmFyPDEwfHxmYXI+Ti0xMCkgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgIC8q
IG5vdCBhIGJhbmQsIGxlYXZlIGl0IGFsb25lICovCiAgICB2YXIgb3V0ZXI9cC5zbGljZSgwLGZhcisxKSwgaW5uZXI9cC5zbGljZShmYXIrMSk7CiAgICBp
Zihpbm5lci5sZW5ndGg8NikgcmV0dXJuOwoKICAgIC8qIG91dHdhcmQgZGlyZWN0aW9uIGFuZCBsb2NhbCBiYW5kIHdpZHRoLCB0YWtlbiBmcm9tIHRoZSBu
ZWFyZXN0IHBvaW50IG9uIHRoZSB0cmFjay1zaWRlIGVkZ2UgKi8KICAgIHZhciBkaXI9W10sd2lkPVtdOwogICAgb3V0ZXIuZm9yRWFjaChmdW5jdGlvbihh
KXsKICAgICAgdmFyIHE9aW5uZXJbMF0sYmQ9SW5maW5pdHk7CiAgICAgIGlubmVyLmZvckVhY2goZnVuY3Rpb24oYyl7IHZhciBkPWQyKGMsYSk7IGlmKGQ8
YmQpeyBiZD1kOyBxPWM7IH0gfSk7CiAgICAgIHZhciBkeD1hLngtcS54LCBkeT1hLnktcS55LCBtPU1hdGguc3FydChkeCpkeCtkeSpkeSl8fDE7CiAgICAg
IGRpci5wdXNoKHt4OmR4L20seTpkeS9tfSk7IHdpZC5wdXNoKG0pOwogICAgfSk7CiAgICAvKiB0aGUgdHdvIGVuZCBjYXBzIGZsaXAgdGhhdCBkaXJlY3Rp
b24gYW5kIHNwaWtlIHRoZSBvZmZzZXQsIHNvIHNtb290aCBpdCBhbG9uZyB0aGUgcnVuICovCiAgICB2YXIgc209W107CiAgICBmb3IoaT0wO2k8ZGlyLmxl
bmd0aDtpKyspewogICAgICB2YXIgc3g9MCxzeT0wOwogICAgICBmb3Ioaj1NYXRoLm1heCgwLGktNCk7ajw9TWF0aC5taW4oZGlyLmxlbmd0aC0xLGkrNCk7
aisrKXsgc3grPWRpcltqXS54OyBzeSs9ZGlyW2pdLnk7IH0KICAgICAgdmFyIG0yPU1hdGguc3FydChzeCpzeCtzeSpzeSl8fDE7CiAgICAgIHNtLnB1c2go
e3g6c3gvbTIseTpzeS9tMn0pOwogICAgfQogICAgdmFyIG1lZD13aWQuc2xpY2UoKS5zb3J0KGZ1bmN0aW9uKGEsYil7IHJldHVybiBhLWI7IH0pW01hdGgu
Zmxvb3Iod2lkLmxlbmd0aC8yKV07CiAgICB2YXIgcHVzaD1tZWQqKGYtMSksIG49b3V0ZXIubGVuZ3RoOwogICAgdmFyIG1vdmVkPW91dGVyLm1hcChmdW5j
dGlvbihhLGkpewogICAgICAvKiB0YXBlciB0byBub3RoaW5nIGF0IGJvdGggZW5kcyBzbyB0aGUgYXJlYSBjbG9zZXMgYmFjayBvbnRvIHRoZSBiYW5kICov
CiAgICAgIHZhciBnPU1hdGgubWluKDEsTWF0aC5tYXgoMCxNYXRoLm1pbihpLG4tMS1pKS8obiowLjE4KSkpOwogICAgICBnPWcqZyooMy0yKmcpOwogICAg
ICByZXR1cm4ge3g6YS54K3NtW2ldLngqcHVzaCpnLCB5OmEueStzbVtpXS55KnB1c2gqZ307CiAgICB9KTsKICAgIGVsLnNldEF0dHJpYnV0ZSgiZCIsIk0g
Iittb3ZlZC5tYXAoeHkpLmpvaW4oIiBMICIpKyIgTCAiK2lubmVyLm1hcCh4eSkuam9pbigiIEwgIikrIiBaIik7CiAgfQoKICBmdW5jdGlvbiBsYWJlbChz
dmcsdGV4dCx4LHksc2l6ZSl7CiAgICB2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoTlMsInRleHQiKTsKICAgIHQuc2V0QXR0cmlidXRlKCJkYXRh
LWVzLWxhYmVsIiwiMSIpOwogICAgdC5zZXRBdHRyaWJ1dGUoIngiLHgpOyB0LnNldEF0dHJpYnV0ZSgieSIseSk7CiAgICB0LnNldEF0dHJpYnV0ZSgidGV4
dC1hbmNob3IiLCJtaWRkbGUiKTsKICAgIHQuc2V0QXR0cmlidXRlKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKTsKICAgIC8qIEltcGFjdCBpbiBvcmFuZ2Us
IG5vIG91dGxpbmU6IHRoZSBzYW1lIGZhY2UgdGhlIGNhcmQgaGVhZGluZ3MgdXNlICovCiAgICB0LnN0eWxlLmZpbGw9IiNGRjQ3MTMiOyB0LnN0eWxlLnN0
cm9rZT0ibm9uZSI7CiAgICB0LnN0eWxlLmZvbnRGYW1pbHk9IkltcGFjdCwnQW50b24nLCdBcmlhbCBOYXJyb3cnLHNhbnMtc2VyaWYiOyB0LnN0eWxlLmZv
bnRXZWlnaHQ9IjQwMCI7CiAgICB0LnN0eWxlLmZvbnRTaXplPXNpemUrInB4IjsgdC5zdHlsZS5sZXR0ZXJTcGFjaW5nPShzaXplKjAuMDMpKyJweCI7CiAg
ICAvKiB0d28gbGluZXMsIHNvIGEgZnVsbCBzdGFuZCBuYW1lIHNpdHMgYmVzaWRlIGl0cyBoYXRjaCBpbnN0ZWFkIG9mIGFjcm9zcyB0aGUgY2lyY3VpdCAq
LwogICAgdmFyIHc9dGV4dC5zcGxpdCgiICIpLCBsaW5lcz1bdGV4dF07CiAgICBpZih0ZXh0Lmxlbmd0aD4xMCYmdy5sZW5ndGg+MSl7CiAgICAgIHZhciBj
dXQ9MTsKICAgICAgaWYody5sZW5ndGg+MikgY3V0PSh3WzBdKyIgIit3WzFdKS5sZW5ndGg8PTEwPzI6MTsKICAgICAgbGluZXM9W3cuc2xpY2UoMCxjdXQp
LmpvaW4oIiAiKSwgdy5zbGljZShjdXQpLmpvaW4oIiAiKV07CiAgICB9CiAgICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUsaSl7CiAgICAgIHZhciBz
PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhOUywidHNwYW4iKTsKICAgICAgcy5zZXRBdHRyaWJ1dGUoIngiLHgpOwogICAgICBzLnNldEF0dHJpYnV0ZSgi
eSIseSsoaS0obGluZXMubGVuZ3RoLTEpLzIpKnNpemUqMS4wOCk7CiAgICAgIHMuc2V0QXR0cmlidXRlKCJkb21pbmFudC1iYXNlbGluZSIsIm1pZGRsZSIp
OwogICAgICBzLnRleHRDb250ZW50PWxpbmU7CiAgICAgIHQuYXBwZW5kQ2hpbGQocyk7CiAgICB9KTsKICAgIHN2Zy5hcHBlbmRDaGlsZCh0KTsKICAgIHJl
dHVybiB0OwogIH0KCiAgZnVuY3Rpb24gZWwodGFnLGF0dHJzKXsKICAgIHZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhOUyx0YWcpOwogICAgT2Jq
ZWN0LmtleXMoYXR0cnMpLmZvckVhY2goZnVuY3Rpb24oayl7IGUuc2V0QXR0cmlidXRlKGssYXR0cnNba10pOyB9KTsKICAgIGUuc2V0QXR0cmlidXRlKCJk
YXRhLWVzLXJpbmciLCIxIik7CiAgICByZXR1cm4gZTsKICB9CiAgLyogVGhlIGdyb3VuZHMgb3V0bGluZSwgY29udHJhY3RlZCBieSBSSU5HX1cgYW5kIHRo
ZSBkaWZmZXJlbmNlIHJlY29sb3VyZWQuIERvbmUgd2l0aCBjbGlwcGVkCiAgICAgc3Ryb2tlcyByYXRoZXIgdGhhbiBhbiBvZmZzZXQgcGF0aDogYSBzdHJv
a2Ugc2l0cyBoYWxmIGluc2lkZSB0aGUgZWRnZSwgYW5kIGNsaXBwaW5nIHRvIHRoZQogICAgIG91dGxpbmUga2VlcHMgb25seSB0aGF0IGlubmVyIGhhbGYs
IHdoaWNoIGlzIGV4YWN0bHkgdGhlIGJhbmQgYmV0d2VlbiB0aGUgb3V0bGluZSBhbmQgaXRzCiAgICAgY29udHJhY3Rpb24uIExpZ2h0IGF0IGJvdGggZWRn
ZXMgb2YgdGhlIGJhbmQgc28gaXQgcmVhZHMgYXMgYSByb2FkLiAqLwogIGZ1bmN0aW9uIHJpbmcoc3ZnKXsKICAgIHZhciBiYXNlPXN2Zy5xdWVyeVNlbGVj
dG9yKCIudHJhY2stZHJpdmUiKTsgaWYoIWJhc2UpIHJldHVybjsKICAgIHZhciBkPWJhc2UuZ2V0QXR0cmlidXRlKCJkIik7IGlmKCFkKSByZXR1cm47CiAg
ICBbXS5zbGljZS5jYWxsKHN2Zy5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1lcy1yaW5nXSIpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyBlLnJlbW92ZSgpOyB9
KTsKICAgIHZhciBkZWZzPXN2Zy5xdWVyeVNlbGVjdG9yKCJkZWZzIik7CiAgICBpZighZGVmcyl7IGRlZnM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKE5T
LCJkZWZzIik7IHN2Zy5pbnNlcnRCZWZvcmUoZGVmcyxzdmcuZmlyc3RDaGlsZCk7IH0KICAgIHZhciBjcD1lbCgiY2xpcFBhdGgiLHtpZDoiZXNSaW5nQ2xp
cCJ9KTsgY3AuYXBwZW5kQ2hpbGQoZWwoInBhdGgiLHtkOmR9KSk7IGRlZnMuYXBwZW5kQ2hpbGQoY3ApOwogICAgdmFyIGc9ZWwoImciLHt9KTsKICAgIGcu
YXBwZW5kQ2hpbGQoZWwoInBhdGgiLHtkOmQsZmlsbDpSSU5HX0l9KSk7CiAgICB2YXIgYz1lbCgiZyIseyJjbGlwLXBhdGgiOiJ1cmwoI2VzUmluZ0NsaXAp
In0pOwogICAgYy5hcHBlbmRDaGlsZChlbCgicGF0aCIse2Q6ZCxmaWxsOiJub25lIixzdHJva2U6UklOR19MLCJzdHJva2Utd2lkdGgiOjIqUklOR19XLCJz
dHJva2UtbGluZWpvaW4iOiJyb3VuZCJ9KSk7CiAgICBjLmFwcGVuZENoaWxkKGVsKCJwYXRoIix7ZDpkLGZpbGw6Im5vbmUiLHN0cm9rZTpSSU5HX1QsInN0
cm9rZS13aWR0aCI6MipSSU5HX1ctMywic3Ryb2tlLWxpbmVqb2luIjoicm91bmQifSkpOwogICAgYy5hcHBlbmRDaGlsZChlbCgicGF0aCIse2Q6ZCxmaWxs
OiJub25lIixzdHJva2U6UklOR19MLCJzdHJva2Utd2lkdGgiOjMsInN0cm9rZS1saW5lam9pbiI6InJvdW5kIn0pKTsKICAgIGcuYXBwZW5kQ2hpbGQoYyk7
CgogICAgLyogc21hbGwgZ29sZCBwb2ludGVycyBhbG9uZyB0aGUgbWlkZGxlIG9mIHRoZSBiYW5kLiBUaGUgb3V0bGluZSBpcyB0cmFjZWQgaW4gdGhlIGRy
aXZpbmcKICAgICAgIGRpcmVjdGlvbiAoZG93biB0aGUgcGl0IHN0cmFpZ2h0IHRoZSB3YXkgdGhlIHZlbnVlJ3Mgb3duIGFycm93IHBvaW50cykgd2l0aCB0
aGUgZ3JvdW5kcyBvbgogICAgICAgaXRzIGxlZnQsIHNvIHRoZSB0YW5nZW50IGlzIHRoZSBkaXJlY3Rpb24gYW5kIHRoZSBsZWZ0IG5vcm1hbCBwb2ludHMg
aW50byB0aGUgYmFuZC4gVGhlCiAgICAgICBjb3B5IGluIHRoZSBjbGlwUGF0aCBpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiB0aGUgaGlkZGVuIG9yaWdpbmFs
LiAqLwogICAgdmFyIGdlbz1jcC5maXJzdENoaWxkLCBMPWdlby5nZXRUb3RhbExlbmd0aCgpOwogICAgaWYoTCl7CiAgICAgIHZhciBuPTE0LCBzdGVwPUwv
biwgb2ZmPVJJTkdfVy8yLCBwdD1zdmcuY3JlYXRlU1ZHUG9pbnQoKSwgaW5zaWRlPTAsIGNhbmQ9W107CiAgICAgIGZvcih2YXIgaT0wO2k8bjtpKyspewog
ICAgICAgIHZhciBhdD1pKnN0ZXArc3RlcC8yLCBwPWdlby5nZXRQb2ludEF0TGVuZ3RoKGF0KSwgcT1nZW8uZ2V0UG9pbnRBdExlbmd0aCgoYXQrMyklTCk7
CiAgICAgICAgdmFyIGR4PXEueC1wLngsIGR5PXEueS1wLnksIG09TWF0aC5zcXJ0KGR4KmR4K2R5KmR5KXx8MTsgZHgvPW07IGR5Lz1tOwogICAgICAgIHZh
ciBjeD1wLngrZHkqb2ZmLCBjeT1wLnktZHgqb2ZmOwogICAgICAgIHB0Lng9Y3g7IHB0Lnk9Y3k7IGlmKGdlby5pc1BvaW50SW5GaWxsKHB0KSkgaW5zaWRl
Kys7CiAgICAgICAgY2FuZC5wdXNoKHt4OmN4LHk6Y3ksYTpNYXRoLmF0YW4yKGR5LGR4KSoxODAvTWF0aC5QSSxweDpwLngscHk6cC55LGR4OmR4LGR5OmR5
fSk7CiAgICAgIH0KICAgICAgdmFyIGZsaXA9aW5zaWRlPG4vMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBvdXRsaW5lIHJhbiB0aGUg
b3RoZXIgd2F5IHJvdW5kICovCiAgICAgIHZhciBib3hlcz1bXS5zbGljZS5jYWxsKHN2Zy5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1lcy1sYWJlbF0iKSku
bWFwKGZ1bmN0aW9uKHQpeyByZXR1cm4gdC5nZXRCQm94KCk7IH0pOwogICAgICBjYW5kLmZvckVhY2goZnVuY3Rpb24oYzIpewogICAgICAgIHZhciBjeD1m
bGlwP2MyLnB4LWMyLmR5Km9mZjpjMi54LCBjeT1mbGlwP2MyLnB5K2MyLmR4Km9mZjpjMi55OwogICAgICAgIGlmKE1hdGguc3FydCgoY3gtMjYyKSooY3gt
MjYyKSsoY3ktMTQzKSooY3ktMTQzKSk8NjApIHJldHVybjsgICAvKiBsZWF2ZSB0aGUgZmxhZyBhbG9uZSAqLwogICAgICAgIGlmKGJveGVzLnNvbWUoZnVu
Y3Rpb24oYil7IHJldHVybiBjeD5iLngtOCYmY3g8Yi54K2Iud2lkdGgrOCYmY3k+Yi55LTgmJmN5PGIueStiLmhlaWdodCs4OyB9KSkgcmV0dXJuOwogICAg
ICAgIGcuYXBwZW5kQ2hpbGQoZWwoInBvbHlnb24iLHtwb2ludHM6IjUuNSwwIC00LDMuOCAtNCwtMy44IixmaWxsOiIjRjRCMjIzIiwKICAgICAgICAgIHRy
YW5zZm9ybToidHJhbnNsYXRlKCIrY3gudG9GaXhlZCgxKSsiICIrY3kudG9GaXhlZCgxKSsiKSByb3RhdGUoIitjMi5hLnRvRml4ZWQoMSkrIikifSkpOwog
ICAgICB9KTsKICAgIH0KICAgIGJhc2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiYXNlLm5leHRTaWJsaW5nKTsKICB9CgogIHZhciBkcmF3bj1mYWxz
ZTsKICBmdW5jdGlvbiBwcnVuZSgpewogICAgdmFyIHdyYXA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1hcFdyYXAiKTsKICAgIHZhciBzdmc9d3JhcCYm
d3JhcC5xdWVyeVNlbGVjdG9yKCJzdmciKTsKICAgIHZhciB6b25lcz1zdmc/W10uc2xpY2UuY2FsbChzdmcucXVlcnlTZWxlY3RvckFsbCgiLmVzLXpvbmUi
KSk6W107CiAgICBpZighem9uZXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICB2YXIga2VlcD1bXSxkcm9wPVtdOwogICAgem9uZXMuZm9yRWFjaChmdW5j
dGlvbih6KXsgKHouZGF0YXNldC5lc0lkJiZCWVt6LmRhdGFzZXQuZXNJZF0/a2VlcDpkcm9wKS5wdXNoKHopOyB9KTsKICAgIGlmKCFrZWVwLmxlbmd0aCkg
cmV0dXJuIGZhbHNlOwoKICAgIC8qIHRoZSB2ZW51ZSBmaWxlIGRyYXdzIHRoZSBIaWxsIGFzIGFuIG91dGxpbmUgYW5kIHRoZSByZXN0IGhhdGNoZWQ7IExv
dWlzIHdhbnRzIHRoZW0gYWxpa2UgKi8KICAgIGtlZXAuZm9yRWFjaChmdW5jdGlvbih6KXsgei5jbGFzc0xpc3QucmVtb3ZlKCJlcy1vdXRsaW5lIik7IH0p
OwoKICAgIGtlZXAuZm9yRWFjaChmdW5jdGlvbih6KXsKICAgICAgaWYoei5kYXRhc2V0LmVzSWQ9PT1ISUxMJiYhei5oYXNBdHRyaWJ1dGUoImRhdGEtZXMt
d2lkZSIpKXsKICAgICAgICB3aWRlbih6LDMuNSk7IHouc2V0QXR0cmlidXRlKCJkYXRhLWVzLXdpZGUiLCIxIik7CiAgICAgIH0KICAgIH0pOwoKICAgIC8q
IG9uZSBib3ggcGVyIHpvbmUuIFRoZSB2ZW51ZSBmaWxlIGdpdmVzIHRoZSBNYWluIEdyYW5kc3RhbmQgYSBzdHJheSAyMXgyMSBkb3Qgb24gdGhlIGZhcgog
ICAgICAgc2lkZSBvZiB0aGUgY2lyY3VpdCwgd2hpY2ggc2hhcmVkIHRoZSB6b25lIGlkIGFuZCBzbyBsaXQgdXAgd2hlbiB0aGUgc3RhbmQgd2FzIHNlbGVj
dGVkLAogICAgICAgYW5kIHRoZSBTdW5zZXQgTG91bmdlIGEgc2Vjb25kIHF1YWQgYXdheSBmcm9tIHRoZSBsb3VuZ2UgaXRzZWxmLiBMb3VpcyB3YW50cyBl
YWNoIHN0YW5kCiAgICAgICByZWFkaW5nIGFzIGEgc2luZ2xlIGJveCwgc28gb25seSB0aGUgbGFyZ2VzdCBzaGFwZSBvZiBlYWNoIHpvbmUgaXMga2VwdC4g
Ki8KICAgIHZhciBiaWc9e307CiAgICBrZWVwLmZvckVhY2goZnVuY3Rpb24oeil7CiAgICAgIHZhciBiPWJveCh6KTsgaWYoIWIpIHJldHVybjsKICAgICAg
dmFyIGE9Yi53aWR0aCpiLmhlaWdodCwgaWQ9ei5kYXRhc2V0LmVzSWQ7CiAgICAgIGlmKCEoaWQgaW4gYmlnKXx8YT5iaWdbaWRdKSBiaWdbaWRdPWE7CiAg
ICB9KTsKICAgIHZhciBsaXZlPVtdLGJlc3Q9e307CiAgICBrZWVwLmZvckVhY2goZnVuY3Rpb24oeil7CiAgICAgIHZhciBiPWJveCh6KSwgaWQ9ei5kYXRh
c2V0LmVzSWQ7CiAgICAgIGlmKCFifHxiZXN0W2lkXXx8Yi53aWR0aCpiLmhlaWdodDxiaWdbaWRdKXsgaGlkZSh6KTsgcmV0dXJuOyB9CiAgICAgIGJlc3Rb
aWRdPTE7IGxpdmUucHVzaCh6KTsKICAgIH0pOwoKICAgIC8qIGxhYmVsIGFuY2hvcjogdGhlIGNlbnRyZSBvZiBlYWNoIHpvbmUncyBsYXJnZXN0IHNoYXBl
LiBOb3QgdGhlIHVuaW9uIG9mIGl0cyBzaGFwZXMsIHdoaWNoCiAgICAgICBmb3IgYSB6b25lIGRyYXduIGFzIHR3byBibG9ja3MgbGFuZHMgb24gdGhlIGVt
cHR5IHRyYWNrIGJldHdlZW4gdGhlbS4gKi8KICAgIHZhciBzcGFucz17fTsKICAgIGxpdmUuZm9yRWFjaChmdW5jdGlvbih6KXsKICAgICAgdmFyIGI9Ym94
KHopOyBpZighYikgcmV0dXJuOwogICAgICB2YXIgaWQ9ei5kYXRhc2V0LmVzSWQsIGE9Yi53aWR0aCpiLmhlaWdodCwgcz1zcGFuc1tpZF07CiAgICAgIGlm
KCFzfHxhPnMuYXJlYSkgc3BhbnNbaWRdPXt4OmIueCtiLndpZHRoLzIseTpiLnkrYi5oZWlnaHQvMixhcmVhOmF9OwogICAgfSk7CgogICAgZHJvcC5mb3JF
YWNoKGhpZGUpOwoKICAgIC8qIHRoZSB2ZW51ZSdzIG93biBsYWJlbHMgbmFtZSB6b25lcyB3ZSBubyBsb25nZXIgc2hvdyBhbmQgc2l0IG91dHNpZGUgdGhl
IHpvbmUgcGF0aHMsIHNvIHRoZXkKICAgICAgIGNhbm5vdCBiZSBtYXRjaGVkIGJhY2sgcmVsaWFibHkuIEhpZGUgdGhlbSBhbGwgYW5kIGRyYXcgb3VyIG93
bi4gKi8KICAgIFtdLnNsaWNlLmNhbGwoc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoInRleHQiKSkuZm9yRWFjaChmdW5jdGlvbih0KXsKICAgICAgaWYoIXQuZ2V0
QXR0cmlidXRlKCJkYXRhLWVzLWxhYmVsIikpIHQuc3R5bGUuZGlzcGxheT0ibm9uZSI7CiAgICB9KTsKICAgIGRyYXdMYWJlbHMoc3ZnLHNwYW5zKTsKICAg
IHJpbmcoc3ZnKTsKCiAgICAvKiBwcmlvcml0eS16b25lIHF1aWNrIGxpbmtzOiBrZWVwIG9ubHkgem9uZXMgc3RpbGwgb24gdGhlIG1hcCAqLwogICAgdmFy
IGxpbmtzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cFF1aWNrTGlua3MiKTsKICAgIGlmKGxpbmtzKXsKICAgICAgdmFyIG5hbWVzPXt9OyBPYmplY3Qu
a2V5cyhzcGFucykuZm9yRWFjaChmdW5jdGlvbihpZCl7IG5hbWVzW0JZW2lkXVsxXS50b0xvd2VyQ2FzZSgpXT0xOyB9KTsKICAgICAgW10uc2xpY2UuY2Fs
bChsaW5rcy5xdWVyeVNlbGVjdG9yQWxsKCJidXR0b24iKSkuZm9yRWFjaChmdW5jdGlvbihiKXsKICAgICAgICBpZighbmFtZXNbKGIudGV4dENvbnRlbnR8
fCIiKS50cmltKCkudG9Mb3dlckNhc2UoKV0pIGIuc3R5bGUuZGlzcGxheT0ibm9uZSI7CiAgICAgIH0pOwogICAgfQogICAgZHJhd249dHJ1ZTsKICAgIGxh
c3RTcGFucz1zcGFuczsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgdmFyIGxhc3RTcGFucz1udWxsOwogIGZ1bmN0aW9uIGRyYXdMYWJlbHMoc3ZnLHNwYW5z
KXsKICAgIFtdLnNsaWNlLmNhbGwoc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWVzLWxhYmVsXSIpKS5mb3JFYWNoKGZ1bmN0aW9uKHQpeyB0LnJlbW92
ZSgpOyB9KTsKICAgIC8qIHNpemVkIGZyb20gdGhlIGxpdmUgc2NhbGU6IHRoZSB2aWV3Qm94IGlzIGFib3V0IDE1MDkgdW5pdHMgd2lkZSBhbmQgcmVuZGVy
cyBuZWFyIDg2MHB4LCBzbwogICAgICAgYSBDU1MtcGl4ZWwgZm9udC1zaXplIGhlcmUgd291bGQgZHJhdyBhdCByb3VnaGx5IGhhbGYgb2Ygd2hhdCBpdCBz
YXlzICovCiAgICB2YXIgdmI9c3ZnLnZpZXdCb3gmJnN2Zy52aWV3Qm94LmJhc2VWYWwsIHI9c3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgdmFy
IGs9KHZiJiZ2Yi53aWR0aCYmci53aWR0aCk/ci53aWR0aC92Yi53aWR0aDoxOwogICAgaWYoIWt8fCFpc0Zpbml0ZShrKSkgaz0xOwogICAgdmFyIHNpemU9
TWF0aC5taW4oMTgvayw0OCk7CiAgICBPYmplY3Qua2V5cyhzcGFucykuZm9yRWFjaChmdW5jdGlvbihpZCl7CiAgICAgIHZhciBzPXNwYW5zW2lkXSwgej1C
WVtpZF07CiAgICAgIGxhYmVsKHN2Zyx6WzJdLHMueCt6WzRdLHMueSt6WzVdLHNpemUpLnNldEF0dHJpYnV0ZSgiZGF0YS1lcy1mb3IiLGlkKTsKICAgIH0p
OwogIH0KCiAgaWYoIXBydW5lKCkpewogICAgdmFyIHRyaWVzPTAsIGl2PXNldEludGVydmFsKGZ1bmN0aW9uKCl7IGlmKHBydW5lKCl8fCsrdHJpZXM+NDAp
IGNsZWFySW50ZXJ2YWwoaXYpOyB9LDQwMCk7CiAgfQogIHZhciBydD1udWxsOwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLGZ1bmN0aW9u
KCl7CiAgICBpZighZHJhd258fCFsYXN0U3BhbnMpIHJldHVybjsKICAgIGNsZWFyVGltZW91dChydCk7CiAgICBydD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7
CiAgICAgIHZhciBzdmc9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI21hcFdyYXAgc3ZnIik7CiAgICAgIC8qIHRoZSBnb2xkIHBvaW50ZXJzIHN0ZXAgcm91
bmQgdGhlIGxhYmVscywgc28gdGhleSBhcmUgcmVkcmF3biBvbmNlIHRoZSBsYWJlbHMgaGF2ZSBtb3ZlZCAqLwogICAgICBpZihzdmcpeyBkcmF3TGFiZWxz
KHN2ZyxsYXN0U3BhbnMpOyByaW5nKHN2Zyk7IH0KICAgIH0sMjAwKTsKICB9KTsKLyogLS0tLS0tLS0tLSAzLiB0aHJlZSBzdWl0ZXMgb24gdGhlIG1hcCAo
Q0wtMjAyNjEwMDYtMDUsIHYyIENMLTIwMjYxMDA2LTA5LCB2MyBDTC0yMDI2MTAwNi0xMCkgLS0tLS0tLS0tLSAqLwogIC8qIFRoZSBNYWluIEdyYW5kc3Rh
bmQgYmFuZCBpbiB0aGUgdmVudWUgZmlsZSBydW5zIGZyb20gaXRzIHRvcCBlZGdlICgyODksNzQpLSgyNjYsODMpIHRvIHRoZSBib3R0b20tbGVmdCBjb3Ju
ZXIKICAgICAoMzc2LDMxMCk7IGl0cyBjZW50cmVsaW5lLCBtZWFzdXJlZCBvbiA2IE9jdCAyMDI2LCBnb2VzIGZyb20gKDI3Nyw3Ny41KSB0byAoMzg3LDMw
NC41KSwgMjUgdW5pdHMgd2lkZSwgYXQgNjQKICAgICBkZWdyZWVzLiBUd28gc29saWQgb3JhbmdlIGJveGVzIHNpdCBvbiB0aGF0IGxpbmUgYXQgMjcuNSUg
YW5kIDY5JSBvZiBpdHMgbGVuZ3RoLCB0aGUgcG9zaXRpb25zIExvdWlzIG1hcmtlZC4gVGhlCiAgICAgU2hhbXMgU3VpdGUgYm94IHNpdHMgYWJvdmUgdGhl
IGJhY2sgc3RyYWlnaHQsIHdoaWNoIHJ1bnMgYWxvbmcgeSA9IC02MCwgdG8gdGhlIGxlZnQgb2YgdGhlIFN1bnNldCBMb3VuZ2UuICovCiAgdmFyIFNVSVRF
X0xJTkU9e3gwOjI3Nyx5MDo3Ny41LHgxOjM4Nyx5MTozMDQuNSxhbmdsZTo2My45fTsKICB2YXIgU1VJVEVTPVsKICAgIHtpZDoiZXMtc3VpdGUtbTE3Iixu
YW1lOiJQb2RpdW0gVmlld3MgU3VpdGUiLGxhYmVsVGV4dDoiUE9ESVVNfFZJRVdTIixjb2RlOiJTVEUtMDEiLHQ6MC4yNzUsc29saWQ6dHJ1ZSwKICAgICBj
YXQ6IlBvZGl1bSBWaWV3cyBTdWl0ZSIsZGVzYzoiQSBnbGFzcy1mcm9udGVkIHN1aXRlIGluIHRoZSBNYWluIEdyYW5kc3RhbmQgYnVpbGRpbmcgb3ZlciB0
aGUgc3RhcnQtZmluaXNoIGxpbmUsIHdpdGggdGhlIHBpdCBsYW5lIG9wcG9zaXRlIGFuZCB0aGUgcG9kaXVtIGNlcmVtb255IGluIGZyb250IG9mIHlvdS4i
LAogICAgIHN1bToiSG9zdGVkIGRpbmluZyBpbnNpZGUsIHJlc2VydmVkIHNlYXRzIG91dHNpZGUsIHRoZSBncmlkLCB0aGUgcGl0IHN0b3BzIGFuZCB0aGUg
cG9kaXVtIGZyb20gb25lIHNwb3QuIiwKICAgICBpbmM6WyJGb3VyLWRheSBhY2Nlc3MsIFRodXJzZGF5IHRvIFN1bmRheSIsIkhvc3RlZCBkaW5pbmcgYW5k
IGJldmVyYWdlcyBpbiB0aGUgc3VpdGUiLCJSZXNlcnZlZCBzZWF0aW5nIG92ZXIgdGhlIHN0YXJ0LWZpbmlzaCBsaW5lIiwiR2VuZXJhbCBhZG1pc3Npb24g
dG8gdGhlIEFmdGVyLVJhY2UgQ29uY2VydHMiLCJPbmUgZGF5IGF0IHRlYW1MYWIgUGhlbm9tZW5hIG9yIGEgWWFzIElzbGFuZCB0aGVtZSBwYXJrIiwiRjEg
RmFuem9uZSBhbmQgYWxsIE9hc2lzIGFyZWFzIl0sCiAgICAgaWRlYWw6WyJQb2RpdW0gdmlld3MiLCJDbGllbnQgaG9zdGluZyIsIlJhY2UtbG9uZyBjb21m
b3J0Il0sbm90ZToiRnVsbCBpbmNsdXNpb25zIGFuZCBwcmljaW5nIGNvbmZpcm1lZCBvbiBlbnF1aXJ5LiIsCiAgICAgc2hvdHM6W3tzcmM6Imh0dHBzOi8v
d3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA2LzE4MDQyMTU2NDkuanBnIixjYXA6IlRoZSBwb2RpdW0gY2VyZW1vbnkgYWNyb3Nz
IHRoZSBzdGFydC1maW5pc2ggc3RyYWlnaHQifSx7c3JjOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3At
ZjEtMDMuanBnIixjYXA6IlRoZSBncmlkIGFuZCB0aGUgZ2FyYWdlcyBvcHBvc2l0ZSJ9XSx1cmw6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL2YxLW0xNy1w
b2RpdW0tc3VpdGUvIixsYWJlbER4Oi00MCxsYWJlbER5Oi0zNixsYWJlbEFuY2hvcjoiZW5kIn0sCiAgICB7aWQ6ImVzLXN1aXRlLXBpdGxhbmUiLG5hbWU6
IlBpdGxhbmUgVmlld3MgU3VpdGUiLGxhYmVsVGV4dDoiUElUTEFORXxWSUVXUyIsY29kZToiU1RFLTAyIix0OjAuNjksc29saWQ6dHJ1ZSwKICAgICBjYXQ6
IlBpdGxhbmUgVmlld3MgTTIwIFN1aXRlIixkZXNjOiJBbiBlbGVnYW50IGluZG9vciBsb3VuZ2Ugd2l0aCBnb3VybWV0IGRpbmluZyBhbmQgcHJlbWl1bSBi
ZXZlcmFnZXMsIGFuZCBhIGJhbGNvbnkgb3ZlciB0aGUgZ3JpZCBmb3IgcmFjZSBsYXVuY2hlcyBhbmQgcGl0IHN0b3BzLiIsCiAgICAgc3VtOiJBIHJlZmlu
ZWQgdmFudGFnZSBwb2ludCBvdmVyIHRoZSBzdGFydGluZyBncmlkLCB3aGVyZSBhbnRpY2lwYXRpb24gYnVpbGRzIGFuZCB3aW5uZXJzIGFyZSBkZWNpZGVk
LiIsCiAgICAgaW5jOlsiRm91ci1kYXkgYWNjZXNzLCBUaHVyc2RheSB0byBTdW5kYXkiLCJJbmRvb3IgbG91bmdlIHdpdGggZ291cm1ldCBkaW5pbmcgYW5k
IHByZW1pdW0gYmV2ZXJhZ2VzIiwiQmFsY29ueSBvdmVybG9va2luZyB0aGUgcGl0IGxhbmUgZ2FyYWdlcyIsIkdlbmVyYWwgYWRtaXNzaW9uIHRvIHRoZSBB
ZnRlci1SYWNlIENvbmNlcnRzIiwiT25lIGRheSBhdCB0ZWFtTGFiIFBoZW5vbWVuYSBvciBhIFlhcyBJc2xhbmQgdGhlbWUgcGFyayIsIkVudHJ5IHRvIHRo
ZSBMb3V2cmUgQWJ1IERoYWJpLCBRYXNyIEFsIFdhdGFuLCBaYXllZCBOYXRpb25hbCBNdXNldW0gYW5kIHRoZSBOYXR1cmFsIEhpc3RvcnkgTXVzZXVtIiwi
RjEgRmFuem9uZSBhbmQgYWxsIE9hc2lzIGFyZWFzIl0sCiAgICAgaWRlYWw6WyJHcmlkIGFuZCBwaXQgbGFuZSIsIkNhbG0sIHJlZmluZWQgc2V0dGluZyIs
IkNsaWVudCBob3N0aW5nIl0sbm90ZToiUHJpY2luZyBhbmQgYXZhaWxhYmlsaXR5IGNvbmZpcm1lZCBvbiBlbnF1aXJ5LiIsCiAgICAgc2hvdHM6W3tzcmM6
Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA2L0FER1BfV2ViX01haW5fR3JhbmRzdGFuZF8xOTIweDY5NHB4X1Yy
LmpwZyIsY2FwOiJUaGUgc3RhcnQtZmluaXNoIHN0cmFpZ2h0In0se3NyYzoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIw
MjYvMDcvMzEyOTktbWFpbl9ncmFuZHN0YW5kX3lhc19tYXJpbmEtN2ZmZWJmYzIwYTk1NTg0YTlkZGViODgxMTliZDQ4YmYtMS5qcGciLGNhcDoiVGhlIHJh
Y2Ugc3RhcnQifV0sCiAgICAgdXJsOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS9mMS1waXRsYW5lLXZpZXdzLXN1aXRlLyIsbGFiZWxEeDotNjAsbGFiZWxE
eToxMDAsbGFiZWxBbmNob3I6Im1pZGRsZSJ9LAogICAge2lkOiJlcy1zdWl0ZS1zaGFtcyIsbmFtZToiU2hhbXMgU3VpdGUiLGxhYmVsVGV4dDoiU0hBTVN8
U1VJVEUiLGNvZGU6IlNURS0wMyIseDo3OTQseTotOTIsdzo0NCxoOjIyLHNvbGlkOmZhbHNlLAogICAgIGNhdDoiU2hhbXMgU3VpdGUiLGRlc2M6IkphcGFu
ZXNlIGZsYXZvdXJzIGJ5IEdvaGFuIGluIGEgcGx1c2gsIGFpci1jb25kaXRpb25lZCBsb3VuZ2UsIHdpdGggYSBiYWxjb255IG92ZXIgdGhlIFR1cm4gNSBo
YWlycGluIGFuZCBnZW5lcmFsIGFkbWlzc2lvbiB0byB0aGUgQWZ0ZXItUmFjZSBDb25jZXJ0cy4iLAogICAgIHN1bToiR29oYW4ncyBzaWduYXR1cmUgZGlz
aGVzIGFuZCBjcmFmdGVkIGNvY2t0YWlscywgd2l0aCB0aGUgaGFpcnBpbiBiZWxvdyB0aGUgYmFsY29ueS4iLAogICAgIGluYzpbIkZvdXItZGF5IGFjY2Vz
cywgVGh1cnNkYXkgdG8gU3VuZGF5IiwiR29oYW4ncyBKYXBhbmVzZSBtZW51IHdpdGggY3JhZnRlZCBjb2NrdGFpbHMiLCJBaXItY29uZGl0aW9uZWQgbG91
bmdlIGFuZCBiYWxjb255IG92ZXIgVHVybiA1IiwiTGl2ZSBlbnRlcnRhaW5tZW50IiwiR2VuZXJhbCBhZG1pc3Npb24gdG8gdGhlIEFmdGVyLVJhY2UgQ29u
Y2VydHMiLCJPbmUgZGF5IGF0IHRlYW1MYWIgUGhlbm9tZW5hIG9yIGEgWWFzIElzbGFuZCB0aGVtZSBwYXJrIiwiRW50cnkgdG8gdGhlIExvdXZyZSBBYnUg
RGhhYmksIFFhc3IgQWwgV2F0YW4sIFpheWVkIE5hdGlvbmFsIE11c2V1bSBhbmQgdGhlIE5hdHVyYWwgSGlzdG9yeSBNdXNldW0iLCJGMSBGYW56b25lIGFu
ZCBhbGwgT2FzaXMgYXJlYXMiXSwKICAgICBpZGVhbDpbIkZvb2QgYW5kIGF0bW9zcGhlcmUiLCJUaGUgaGFpcnBpbiIsIkdyb3VwcyBhbmQgY2VsZWJyYXRp
b25zIl0sbm90ZToiUHJpY2luZyBhbmQgYXZhaWxhYmlsaXR5IGNvbmZpcm1lZCBvbiBlbnF1aXJ5LiIsCiAgICAgc2hvdHM6W3tzcmM6Imh0dHBzOi8vd3d3
LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA5L3NoYW1zLWluZG9vci13aXRoLWNyb3dkLnBuZyIsY2FwOiJJbnNpZGUgdGhlIFNoYW1z
IFN1aXRlIn1dLAogICAgIHVybDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvZjEtc2hhbXMtc3VpdGUvIixsYWJlbER4OjQwLGxhYmVsRHk6LTQwLGxhYmVs
QW5jaG9yOiJzdGFydCJ9CiAgXTsKICB2YXIgc3VpdGVBY3RpdmU9bnVsbDsKICBmdW5jdGlvbiBzdWl0ZUNlbnRyZShzKXsKICAgIGlmKHMudD09bnVsbCkg
cmV0dXJuIHt4OnMueCx5OnMueX07CiAgICByZXR1cm4ge3g6U1VJVEVfTElORS54MCsoU1VJVEVfTElORS54MS1TVUlURV9MSU5FLngwKSpzLnQsIHk6U1VJ
VEVfTElORS55MCsoU1VJVEVfTElORS55MS1TVUlURV9MSU5FLnkwKSpzLnR9OwogIH0KICBmdW5jdGlvbiBzdWl0ZUxhYmVsKHN2Zyx0ZXh0LHgseSxhbmNo
b3Isc2l6ZSl7CiAgICB2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoTlMsInRleHQiKTsKICAgIHQuc2V0QXR0cmlidXRlKCJkYXRhLWVzLWxhYmVs
IiwiMSIpOyB0LnNldEF0dHJpYnV0ZSgiZGF0YS1lcy1zdWl0ZS1sYWJlbCIsIjEiKTsKICAgIHQuc2V0QXR0cmlidXRlKCJ4Iix4KTsgdC5zZXRBdHRyaWJ1
dGUoInkiLHkpOyB0LnNldEF0dHJpYnV0ZSgidGV4dC1hbmNob3IiLGFuY2hvcik7IHQuc2V0QXR0cmlidXRlKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKTsK
ICAgIHQuc3R5bGUuZmlsbD0iI0ZGNDcxMyI7IHQuc3R5bGUuc3Ryb2tlPSJub25lIjsgdC5zdHlsZS5mb250RmFtaWx5PSJJbXBhY3QsJ0FudG9uJywnQXJp
YWwgTmFycm93JyxzYW5zLXNlcmlmIjsgdC5zdHlsZS5mb250V2VpZ2h0PSI0MDAiOwogICAgdC5zdHlsZS5mb250U2l6ZT1zaXplKyJweCI7IHQuc3R5bGUu
bGV0dGVyU3BhY2luZz0oc2l6ZSowLjAzKSsicHgiOwogICAgdmFyIGxpbmVzPXRleHQuc3BsaXQoInwiKTsKICAgIGxpbmVzLmZvckVhY2goZnVuY3Rpb24o
bGluZSxpKXsKICAgICAgdmFyIHNwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhOUywidHNwYW4iKTsgc3Auc2V0QXR0cmlidXRlKCJ4Iix4KTsKICAgICAg
c3Auc2V0QXR0cmlidXRlKCJ5Iix5KyhpLShsaW5lcy5sZW5ndGgtMSkvMikqc2l6ZSoxLjA4KTsgc3Auc2V0QXR0cmlidXRlKCJkb21pbmFudC1iYXNlbGlu
ZSIsIm1pZGRsZSIpOwogICAgICBzcC50ZXh0Q29udGVudD1saW5lOyB0LmFwcGVuZENoaWxkKHNwKTsKICAgIH0pOwogICAgc3ZnLmFwcGVuZENoaWxkKHQp
OyByZXR1cm4gdDsKICB9CiAgZnVuY3Rpb24gY2xlYXJTdWl0ZUFjdGl2ZSgpewogICAgc3VpdGVBY3RpdmU9bnVsbDsKICAgIHZhciBwa2c9ZG9jdW1lbnQu
Z2V0RWxlbWVudEJ5SWQoInpwUGtnIik7CiAgICBpZihwa2cpeyBbXS5zbGljZS5jYWxsKHBrZy5xdWVyeVNlbGVjdG9yQWxsKCIuenAtcGtnLWhlYWQsLnpw
LXByaWNlIikpLmZvckVhY2goZnVuY3Rpb24oZSl7IGUuaGlkZGVuPWZhbHNlOyBlLnN0eWxlLmRpc3BsYXk9IiI7IH0pOyB9CiAgICBbXS5zbGljZS5jYWxs
KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5lcy16b25lW2RhdGEtZXMtc3VpdGVdLmVzLWFjdGl2ZSIpKS5mb3JFYWNoKGZ1bmN0aW9uKHopeyB6LmNs
YXNzTGlzdC5yZW1vdmUoImVzLWFjdGl2ZSIpOyB9KTsKICB9CiAgZnVuY3Rpb24gb3BlblN1aXRlKHMsc2hhcGUpewogICAgLyogdGhlIG1haW4gc2NyaXB0
J3MgcGFuZWwgcm91dGluZSBpcyBwcml2YXRlOyBhIHF1aWNrLWxpbmsgYnV0dG9uIHJ1bnMgaXQgKGFuZCBvcGVucyB0aGUgbW9kYWwgb24gcGhvbmVzKSwK
ICAgICAgIHRoZW4gdGhlIHBhbmVsIGlzIHJld3JpdHRlbiBmb3IgdGhlIHN1aXRlICovCiAgICB2YXIgcWw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3pw
UXVpY2tMaW5rcyBidXR0b24iKTsgaWYocWwpIHFsLmNsaWNrKCk7CiAgICBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5lcy16
b25lLmVzLWFjdGl2ZSIpKS5mb3JFYWNoKGZ1bmN0aW9uKHopeyB6LmNsYXNzTGlzdC5yZW1vdmUoImVzLWFjdGl2ZSIpOyB9KTsKICAgIHZhciBsb2NrPWRv
Y3VtZW50LmdldEVsZW1lbnRCeUlkKCJlcy1sb2NrIik7IGlmKGxvY2spIGxvY2suc3R5bGUuZGlzcGxheT0ibm9uZSI7CiAgICBpZihzaGFwZSkgc2hhcGUu
Y2xhc3NMaXN0LmFkZCgiZXMtYWN0aXZlIik7CiAgICBzdWl0ZUFjdGl2ZT1zLmlkOwogICAgdmFyIGc9ZnVuY3Rpb24oaWQpeyByZXR1cm4gZG9jdW1lbnQu
Z2V0RWxlbWVudEJ5SWQoaWQpOyB9OwogICAgaWYoZygienBUaWVyIikpIGcoInpwVGllciIpLnRleHRDb250ZW50PSJTdWl0ZSI7CiAgICBpZihnKCJ6cENv
ZGUiKSkgZygienBDb2RlIikudGV4dENvbnRlbnQ9cy5jb2RlOwogICAgaWYoZygienBEZXNjIikpIGcoInpwRGVzYyIpLnRleHRDb250ZW50PXMuZGVzYzsK
ICAgIHZhciBzaG90cz1nKCJ6cFNob3RzIiksIG1lZGlhQm94PWcoInpwTWVkaWEiKTsKICAgIGlmKHNob3RzKXsKICAgICAgc2hvdHMuaW5uZXJIVE1MPSIi
OyBzaG90cy5zY3JvbGxMZWZ0PTA7CiAgICAgIHMuc2hvdHMuZm9yRWFjaChmdW5jdGlvbihzaCl7CiAgICAgICAgdmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxl
bWVudCgiZGl2Iik7IGQuY2xhc3NOYW1lPSJ6cC1zaG90IjsKICAgICAgICB2YXIgaW09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7IGltLmxvYWRp
bmc9ImxhenkiOyBpbS5kZWNvZGluZz0iYXN5bmMiOyBpbS5hbHQ9cy5uYW1lKyhzaC5jYXA/IiwgIitzaC5jYXA6IiIpOyBpbS5zcmM9c2guc3JjOwogICAg
ICAgIGltLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpeyBkLnJlbW92ZSgpOyBpZihtZWRpYUJveCYmIXNob3RzLnF1ZXJ5U2VsZWN0b3Io
Ii56cC1zaG90IikpIG1lZGlhQm94LmhpZGRlbj10cnVlOyB9KTsKICAgICAgICBkLmFwcGVuZENoaWxkKGltKTsKICAgICAgICBpZihzaC5jYXApeyB2YXIg
Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsgYy5jbGFzc05hbWU9ImNhcCI7IGMudGV4dENvbnRlbnQ9c2guY2FwOyBkLmFwcGVuZENoaWxkKGMp
OyB9CiAgICAgICAgc2hvdHMuYXBwZW5kQ2hpbGQoZCk7CiAgICAgIH0pOwogICAgICBpZihtZWRpYUJveCkgbWVkaWFCb3guaGlkZGVuPXMuc2hvdHMubGVu
Z3RoPT09MDsKICAgIH0KICAgIC8qIHRoZSBwYWNrYWdlIGJsb2NrIHdpdGhvdXQgc3RvY2sgb3IgcHJpY2U6IHN1bW1hcnksIGluY2x1c2lvbnMsIHdobyBp
dCBzdWl0cywgYSBub3RlICovCiAgICB2YXIgcGtnPWcoInpwUGtnIik7CiAgICBpZihwa2cpewogICAgICBwa2cuaGlkZGVuPWZhbHNlOwogICAgICB2YXIg
aGVhZD1wa2cucXVlcnlTZWxlY3RvcigiLnpwLXBrZy1oZWFkIik7IGlmKGhlYWQpeyBoZWFkLmhpZGRlbj10cnVlOyBoZWFkLnN0eWxlLmRpc3BsYXk9Im5v
bmUiOyB9CiAgICAgIHZhciBwcmljZT1wa2cucXVlcnlTZWxlY3RvcigiLnpwLXByaWNlIik7IGlmKHByaWNlKXsgcHJpY2UuaGlkZGVuPXRydWU7IHByaWNl
LnN0eWxlLmRpc3BsYXk9Im5vbmUiOyB9CiAgICAgIGlmKGcoInpwU3VtIikpIGcoInpwU3VtIikudGV4dENvbnRlbnQ9cy5zdW18fCIiOwogICAgICBpZihn
KCJ6cFRpcCIpKXsgZygienBUaXAiKS50ZXh0Q29udGVudD0iIjsgZygienBUaXAiKS5oaWRkZW49dHJ1ZTsgfQogICAgICB2YXIgaW5jPWcoInpwSW5jIik7
IGlmKGluYyl7IGluYy5pbm5lckhUTUw9IiI7IChzLmluY3x8W10pLmZvckVhY2goZnVuY3Rpb24oeCl7IHZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
ImRpdiIpOyBkLnRleHRDb250ZW50PXg7IGluYy5hcHBlbmRDaGlsZChkKTsgfSk7IH0KICAgICAgdmFyIGlkZWFsPWcoInpwSWRlYWwiKTsgaWYoaWRlYWwp
eyBpZGVhbC5pbm5lckhUTUw9IiI7IChzLmlkZWFsfHxbXSkuZm9yRWFjaChmdW5jdGlvbih4KXsgdmFyIHNwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNw
YW4iKTsgc3AudGV4dENvbnRlbnQ9eDsgaWRlYWwuYXBwZW5kQ2hpbGQoc3ApOyB9KTsgfQogICAgICBpZihnKCJ6cE5vdGUiKSl7IGcoInpwTm90ZSIpLmhp
ZGRlbj0hcy5ub3RlOyBnKCJ6cE5vdGUiKS50ZXh0Q29udGVudD1zLm5vdGV8fCIiOyB9CiAgICB9CiAgICBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5
U2VsZWN0b3JBbGwoIiN6b25lUGFuZWwgW2RhdGEtZXMtaG90ZWwtY3RhXSIpKS5mb3JFYWNoKGZ1bmN0aW9uKGMpeyBjLmhpZGRlbj10cnVlOyBjLnN0eWxl
LmRpc3BsYXk9Im5vbmUiOyB9KTsKICAgIHZhciBib29rPWcoInpwQ3RhQm9vayIpOwogICAgaWYoYm9vayl7CiAgICAgIGlmKHMudXJsKXsgYm9vay5oaWRk
ZW49ZmFsc2U7IGJvb2sudGV4dENvbnRlbnQ9IlZpZXcgdGhlIHN1aXRlIjsgYm9vay5ocmVmPXMudXJsOyBib29rLnJlbW92ZUF0dHJpYnV0ZSgidGFyZ2V0
Iik7IGJvb2sub25jbGljaz1udWxsOyB9CiAgICAgIGVsc2UgeyBib29rLmhpZGRlbj10cnVlOyBib29rLnJlbW92ZUF0dHJpYnV0ZSgiaHJlZiIpOyB9CiAg
ICB9CiAgICB2YXIgZW5xPWcoInpwQ3RhRW5xdWlyZSIpOwogICAgaWYoZW5xKXsKICAgICAgZW5xLmhpZGRlbj1mYWxzZTsgZW5xLnN0eWxlLmRpc3BsYXk9
IiI7IGVucS50ZXh0Q29udGVudD0iRW5xdWlyZSBhYm91dCB0aGlzIHN1aXRlIjsKICAgICAgZW5xLnNldEF0dHJpYnV0ZSgiaHJlZiIsIiNlbnF1aXJlIik7
IGVucS5zZXRBdHRyaWJ1dGUoImRhdGEtb3Blbi1yZmkiLCIiKTsgZW5xLnNldEF0dHJpYnV0ZSgiZGF0YS1jYXQiLHMuY2F0KTsKICAgICAgZW5xLm9uY2xp
Y2s9ZnVuY3Rpb24oZXYpewogICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7IGV2LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHZhciBzZWw9ZG9jdW1l
bnQuZ2V0RWxlbWVudEJ5SWQoImYtY2F0Iik7CiAgICAgICAgaWYoc2VsKXsgZm9yKHZhciBrPTA7azxzZWwub3B0aW9ucy5sZW5ndGg7aysrKXsgaWYoc2Vs
Lm9wdGlvbnNba10udGV4dD09PXMuY2F0KXsgc2VsLnNlbGVjdGVkSW5kZXg9azsgYnJlYWs7IH0gfSB9CiAgICAgICAgdmFyIGg9ZG9jdW1lbnQucXVlcnlT
ZWxlY3RvcigiI3JmaSBpbnB1dFtuYW1lPWVlYl9jYXRlZ29yeV0iKTsgaWYoaCkgaC52YWx1ZT1zLmNhdDsKICAgICAgICB2YXIgb3BlbmVyPWRvY3VtZW50
LnF1ZXJ5U2VsZWN0b3IoIi5uYXYtY3RhW2RhdGEtb3Blbi1yZmldIil8fGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIltkYXRhLW9wZW4tcmZpXSIpOwogICAg
ICAgIGlmKG9wZW5lcikgb3BlbmVyLmNsaWNrKCk7CiAgICAgIH07CiAgICB9CiAgICAvKiB0aGUgdGl0bGUgbGFzdDogdGhlIHBhbmVsIG9wZW5zLCBhbmQg
dGhlIGRldmVsb3BlcidzIHN5bmMgcmVhZHMgaXQsIG9uIHRoaXMgY2hhbmdlICovCiAgICBpZihnKCJ6cFRpdGxlIikpIGcoInpwVGl0bGUiKS50ZXh0Q29u
dGVudD1zLm5hbWU7CiAgICB2YXIgc2M9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3pvbmVQYW5lbCAuenAtc2Nyb2xsIik7IGlmKHNjKSBzYy5zY3JvbGxU
b3A9MDsKICB9CiAgZnVuY3Rpb24gZHJhd1N1aXRlcyhzdmcpewogICAgaWYoIXN2ZykgcmV0dXJuOwogICAgW10uc2xpY2UuY2FsbChzdmcucXVlcnlTZWxl
Y3RvckFsbCgiW2RhdGEtZXMtc3VpdGVdLFtkYXRhLWVzLXN1aXRlLWxhYmVsXSIpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyBlLnJlbW92ZSgpOyB9KTsKICAg
IHZhciByZWY9c3ZnLnF1ZXJ5U2VsZWN0b3IoInRleHRbZGF0YS1lcy1sYWJlbF06bm90KFtkYXRhLWVzLXN1aXRlLWxhYmVsXSkiKTsKICAgIHZhciBzaXpl
PXJlZj9wYXJzZUZsb2F0KHJlZi5zdHlsZS5mb250U2l6ZSk6MzY7ICAgLyogdGhlIHN0YW5kIGxhYmVscycgc2l6ZTogZXZlcnkgbGFiZWwgb24gdGhlIG1h
cCByZWFkcyBhbGlrZSAqLwogICAgU1VJVEVTLmZvckVhY2goZnVuY3Rpb24ocyl7CiAgICAgIHZhciBjPXN1aXRlQ2VudHJlKHMpLCBzaGFwZTsKICAgICAg
aWYocy50IT1udWxsKXsKICAgICAgICAvKiBhIDM0IHggMTYgYm94IHR1cm5lZCB0byB0aGUgYmFuZCdzIGFuZ2xlLCBhcyBhYnNvbHV0ZSBwb2ludHMgc28g
bm8gdHJhbnNmb3JtIHJ1bGUgY2FuIG1vdmUgaXQgKi8KICAgICAgICB2YXIgYT1TVUlURV9MSU5FLmFuZ2xlKk1hdGguUEkvMTgwLCBjYT1NYXRoLmNvcyhh
KSwgc2E9TWF0aC5zaW4oYSksIGh3PTE3LCBoaD04OwogICAgICAgIHZhciBwdHM9W1staHcsLWhoXSxbaHcsLWhoXSxbaHcsaGhdLFstaHcsaGhdXS5tYXAo
ZnVuY3Rpb24ocCl7IHJldHVybiAoYy54K3BbMF0qY2EtcFsxXSpzYSkudG9GaXhlZCgxKSsiLCIrKGMueStwWzBdKnNhK3BbMV0qY2EpLnRvRml4ZWQoMSk7
IH0pOwogICAgICAgIHNoYXBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhOUywicG9seWdvbiIpOwogICAgICAgIHNoYXBlLnNldEF0dHJpYnV0ZSgicG9p
bnRzIixwdHMuam9pbigiICIpKTsgc2hhcGUuc2V0QXR0cmlidXRlKCJzdHJva2UtbGluZWpvaW4iLCJyb3VuZCIpOwogICAgICB9ZWxzZXsKICAgICAgICBz
aGFwZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoTlMsInJlY3QiKTsKICAgICAgICBzaGFwZS5zZXRBdHRyaWJ1dGUoIngiLChjLngtcy53LzIpLnRvRml4
ZWQoMSkpOyBzaGFwZS5zZXRBdHRyaWJ1dGUoInkiLChjLnktcy5oLzIpLnRvRml4ZWQoMSkpOyBzaGFwZS5zZXRBdHRyaWJ1dGUoIndpZHRoIixzLncpOyBz
aGFwZS5zZXRBdHRyaWJ1dGUoImhlaWdodCIscy5oKTsgc2hhcGUuc2V0QXR0cmlidXRlKCJyeCIsMS41KTsKICAgICAgfQogICAgICBzaGFwZS5zZXRBdHRy
aWJ1dGUoImNsYXNzIiwiZXMtem9uZSBlcy1wa2ciKyhzLnNvbGlkPyIgZXMtc3VpdGUtc29saWQiOiIiKSk7CiAgICAgIHNoYXBlLnNldEF0dHJpYnV0ZSgi
ZGF0YS1lcy1zdWl0ZSIsIjEiKTsgc2hhcGUuZGF0YXNldC5lc0lkPXMuaWQ7CiAgICAgIHNoYXBlLnNldEF0dHJpYnV0ZSgicm9sZSIsImJ1dHRvbiIpOyBz
aGFwZS5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiMCIpOyBzaGFwZS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLHMubmFtZSsiLCAiK3MuY29kZSk7CiAg
ICAgIHNoYXBlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsZnVuY3Rpb24oZSl7IGUucHJldmVudERlZmF1bHQoKTsgfSk7CiAgICAgIHNoYXBlLmFk
ZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXsgZS5zdG9wUHJvcGFnYXRpb24oKTsgb3BlblN1aXRlKHMsc2hhcGUpOyB9KTsKICAgICAgc2hh
cGUuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7IGlmKGUua2V5PT09IkVudGVyInx8ZS5rZXk9PT0iICIpeyBlLnByZXZlbnREZWZh
dWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IG9wZW5TdWl0ZShzLHNoYXBlKTsgfSB9KTsKICAgICAgaWYoc3VpdGVBY3RpdmU9PT1zLmlkKSBzaGFwZS5j
bGFzc0xpc3QuYWRkKCJlcy1hY3RpdmUiKTsKICAgICAgc3ZnLmFwcGVuZENoaWxkKHNoYXBlKTsKICAgICAgLyogcG9zaXRpb25zIGZyb20gYSBmaXQgc2Vh
cmNoIG9uIHRoZSBsaXZlIG1hcCAoNiBPY3QgMjAyNik6IGNsZWFyIG9mIGV2ZXJ5IHpvbmUsIGxhYmVsIGFuZCB0aGUgbWFwIGVkZ2UgYXQKICAgICAgICAg
dGhlIHN0YW5kLWxhYmVsIHNpemUsIHdpdGggdGhlIE1haW4gR3JhbmRzdGFuZCBsYWJlbCBtb3ZlZCA0MCB1bml0cyBkb3duIHRvIG1ha2Ugcm9vbSAqLwog
ICAgICBzdWl0ZUxhYmVsKHN2ZyxzLmxhYmVsVGV4dCxjLngrcy5sYWJlbER4LGMueStzLmxhYmVsRHkscy5sYWJlbEFuY2hvcixzaXplKS5zZXRBdHRyaWJ1
dGUoImRhdGEtZXMtZm9yIixzLmlkKTsKICAgIH0pOwogICAgLyogdGhlIHRpZXIgZmlsdGVyIGNoaXBzIGRpbSBldmVyeSB6b25lIHRoZSBtYWluIHNjcmlw
dCBkb2VzIG5vdCBrbm93OyB0aGUgc3VpdGVzIGZvbGxvdyB0aGUgU3VpdGUgY2hpcCAqLwogICAgdmFyIGNoaXBzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JB
bGwoIiNtYXBGaWx0ZXJzIC5tYXAtY2hpcCIpOwogICAgaWYoY2hpcHMubGVuZ3RoJiYhc3ZnLmhhc0F0dHJpYnV0ZSgiZGF0YS1lcy1zdWl0ZS1jaGlwcyIp
KXsKICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgiZGF0YS1lcy1zdWl0ZS1jaGlwcyIsIjEiKTsKICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChj
aGlwcyxmdW5jdGlvbihjaCl7CiAgICAgICAgY2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7CiAgICAgICAgICB2YXIgdD1jaC5kYXRh
c2V0LnRpZXI7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIFtdLnNsaWNlLmNhbGwoc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwo
Ii5lcy16b25lW2RhdGEtZXMtc3VpdGVdIikpLmZvckVhY2goZnVuY3Rpb24oeil7IHouY2xhc3NMaXN0LnRvZ2dsZSgiZXMtZGltIiwhKCJhbGwiPT09dHx8
InN1aXRlIj09PXQpKTsgfSk7CiAgICAgICAgICB9LDApOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICB9CiAgLyogcmVkcmF3IGFmdGVyIGV2ZXJ5
IGxhYmVsIHBhc3MgKGZpcnN0IGRyYXcgYW5kIGV2ZXJ5IHJlc2l6ZSk7IHRoZSBsYWJlbHMgYXJlIHJlZHJhd24gdGhlIHNhbWUgd2F5ICovCiAgdmFyIF9k
cmF3TGFiZWxzPWRyYXdMYWJlbHM7CiAgZHJhd0xhYmVscz1mdW5jdGlvbihzdmcsc3BhbnMpeyBfZHJhd0xhYmVscyhzdmcsc3BhbnMpOyB0cnl7IGRyYXdT
dWl0ZXMoc3ZnKTsgfWNhdGNoKGUpe30gdHJ5eyBwbGFjZUxhYmVscyhzdmcpOyB9Y2F0Y2goZSl7fSB9OwoKLyogLS0tLS0tLS0tLSA0LiBsYWJlbHMga2Vw
dCBjbGVhciBvZiB0aGUgbWFwICgyMiBPY3QgMjAyNikgLS0tLS0tLS0tLSAqLwogIC8qIFRoZSBvZmZzZXRzIGFib3ZlIHdlcmUgZml0dGVkIGF0IG9uZSB3
aWR0aCwgYnV0IHRoZSBsYWJlbHMgYXJlIHNpemVkIGZyb20gdGhlIGxpdmUgc2NhbGUsIHNvIGF0IG90aGVyIHdpZHRocwogICAgIHRoZXkgZ3JldyBpbnRv
IHRoZSB0cmFjaywgdGhlIHN0YW5kcyBhbmQgdGhlIHN1aXRlIGJveGVzLiBFYWNoIGxhYmVsIG5vdyBzdGFydHMgZnJvbSBpdHMgZml0dGVkIHNwb3QgYW5k
LAogICAgIGlmIGFueXRoaW5nIGlzIHVuZGVyIGl0LCBtb3ZlcyB0byB0aGUgbmVhcmVzdCBjbGVhciBzcG90IGJlc2lkZSBpdHMgb3duIHpvbmUuIEV2ZXJ5
dGhpbmcgYSBsYWJlbCBtdXN0IG5vdAogICAgIHRvdWNoIGlzIHBhaW50ZWQgb25jZSBpbnRvIGFuIG9mZnNjcmVlbiBncmlkICh0cmFjayBiYW5kLCBldmVy
eSB6b25lLCB0aGUgZmxhZywgdGhlIHpvb20gY29udHJvbHMpIHdpdGggYQogICAgIHNtYWxsIGdhcCByb3VuZCBlYWNoLCBhbmQgYSBzdW1tZWQgdGFibGUg
YW5zd2VycyAiaXMgdGhpcyBib3ggY2xlYXIiIGluIGNvbnN0YW50IHRpbWUsIHNvIHRoZSBzZWFyY2ggb3ZlcgogICAgIGEgZmV3IHRob3VzYW5kIHNwb3Rz
IHBlciBsYWJlbCBzdGF5cyBjaGVhcC4gKi8KICBmdW5jdGlvbiBwbGFjZUxhYmVscyhzdmcpewogICAgdmFyIHZiPXN2Zy52aWV3Qm94JiZzdmcudmlld0Jv
eC5iYXNlVmFsLCBzcj1zdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICBpZighdmJ8fCF2Yi53aWR0aHx8IXNyLndpZHRoKSByZXR1cm47CiAgICB2
YXIgaz1zci53aWR0aC92Yi53aWR0aCwgVT1NYXRoLm1heCgxLDEuNS9rKTsgICAgIC8qIFNWRyB1bml0cyBwZXIgZ3JpZCBjZWxsLCBhYm91dCAxLjUgc2Ny
ZWVuIHB4ICovCiAgICB2YXIgcGFkPTQvaywgZ3c9TWF0aC5jZWlsKHZiLndpZHRoL1UpLCBnaD1NYXRoLmNlaWwodmIuaGVpZ2h0L1UpOwogICAgdmFyIGN2
PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOyBjdi53aWR0aD1ndzsgY3YuaGVpZ2h0PWdoOwogICAgdmFyIGN4PWN2LmdldENvbnRleHQoIjJk
Iik7IGlmKCFjeHx8IXdpbmRvdy5QYXRoMkQpIHJldHVybjsKICAgIHZhciBiYXNlPVsxL1UsMCwwLDEvVSwtdmIueC9VLC12Yi55L1VdLCBjdG09c3ZnLmdl
dENUTSgpLCBpbnY9Y3RtP2N0bS5pbnZlcnNlKCk6bnVsbDsKICAgIGZ1bmN0aW9uIGF0KGUpewogICAgICBjeC5zZXRUcmFuc2Zvcm0uYXBwbHkoY3gsYmFz
ZSk7CiAgICAgIGlmKGludiYmZS5nZXRDVE0peyB2YXIgbT1pbnYubXVsdGlwbHkoZS5nZXRDVE0oKSk7IGN4LnRyYW5zZm9ybShtLmEsbS5iLG0uYyxtLmQs
bS5lLG0uZik7IH0KICAgIH0KICAgIGZ1bmN0aW9uIGdlbyhlKXsKICAgICAgdmFyIHQ9ZS50YWdOYW1lLnRvTG93ZXJDYXNlKCksIHA7CiAgICAgIGlmKHQ9
PT0icGF0aCIpIHJldHVybiBuZXcgUGF0aDJEKGUuZ2V0QXR0cmlidXRlKCJkIil8fCIiKTsKICAgICAgaWYodD09PSJwb2x5Z29uIil7CiAgICAgICAgdmFy
IG49KGUuZ2V0QXR0cmlidXRlKCJwb2ludHMiKXx8IiIpLnRyaW0oKS5zcGxpdCgvW1xzLF0rLykubWFwKE51bWJlciksIHM9IiI7CiAgICAgICAgZm9yKHZh
ciBpPTA7aSsxPG4ubGVuZ3RoO2krPTIpIHMrPShpPyJMIjoiTSIpK25baV0rIiAiK25baSsxXTsKICAgICAgICByZXR1cm4gbmV3IFBhdGgyRChzKyJaIik7
CiAgICAgIH0KICAgICAgaWYodD09PSJyZWN0Iil7IHA9bmV3IFBhdGgyRCgpOyBwLnJlY3QoK2UuZ2V0QXR0cmlidXRlKCJ4Iil8fDAsK2UuZ2V0QXR0cmli
dXRlKCJ5Iil8fDAsK2UuZ2V0QXR0cmlidXRlKCJ3aWR0aCIpfHwwLCtlLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iil8fDApOyByZXR1cm4gcDsgfQogICAgICBy
ZXR1cm4gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHNob3duKGUpeyByZXR1cm4gZS5zdHlsZS5kaXNwbGF5IT09Im5vbmUiJiZnZXRDb21wdXRlZFN0eWxl
KGUpLmRpc3BsYXkhPT0ibm9uZSI7IH0KICAgIGZ1bmN0aW9uIHBhaW50KGUpewogICAgICB2YXIgZz1nZW8oZSk7IGlmKCFnKSByZXR1cm47CiAgICAgIGF0
KGUpOyBjeC5maWxsKGcpOyBjeC5saW5lV2lkdGg9MipwYWQ7IGN4LmxpbmVKb2luPSJyb3VuZCI7IGN4LnN0cm9rZShnKTsKICAgIH0KICAgIGN4LmZpbGxT
dHlsZT1jeC5zdHJva2VTdHlsZT0iIzAwMCI7CgogICAgLyogdGhlIHRyYWNrOiB0aGUgYmFuZCBkcmF3biBpbnNpZGUgdGhlIGdyb3VuZHMgb3V0bGluZSwg
cGx1cyB0aGUgZ2FwIGVpdGhlciBzaWRlIG9mIGl0ICovCiAgICB2YXIgdHJhY2s9c3ZnLnF1ZXJ5U2VsZWN0b3IoIi50cmFjay1kcml2ZSIpOwogICAgaWYo
dHJhY2spewogICAgICB2YXIgdGc9Z2VvKHRyYWNrKTsKICAgICAgYXQodHJhY2spOyBjeC5zYXZlKCk7IGN4LmNsaXAodGcpOyBjeC5saW5lV2lkdGg9Mioo
UklOR19XK3BhZCk7IGN4LnN0cm9rZSh0Zyk7IGN4LnJlc3RvcmUoKTsKICAgICAgYXQodHJhY2spOyBjeC5saW5lV2lkdGg9MipwYWQ7IGN4LnN0cm9rZSh0
Zyk7CiAgICB9CiAgICAvKiBldmVyeSB6b25lIGxlZnQgb24gdGhlIG1hcCAoc3RhbmRzLCBsb3VuZ2VzLCB0aGUgdGhyZWUgc3VpdGVzKSwgdGhlIGdyaWQg
c2xvdHMgYW5kIHRoZSBmbGFnICovCiAgICBbXS5zbGljZS5jYWxsKHN2Zy5xdWVyeVNlbGVjdG9yQWxsKCIuZXMtem9uZSwuc3RhcnRpbmctZ3JpZCIpKS5m
b3JFYWNoKGZ1bmN0aW9uKHopeyBpZihzaG93bih6KSkgcGFpbnQoeik7IH0pOwogICAgLyogZWFjaCBjaGVxdWVyIHNxdWFyZSBvbiBpdHMgb3duLCBwYWRk
ZWQ6IHRoZSBkcmF3aW5nIGhhcyB0d28gZmxhZ3MgZmFyIGFwYXJ0ICh0aGUgZ3JpZCBhbmQgYSBzZWNvbmQgb25lIG5lYXIKICAgICAgIHRoZSBib3R0b20p
LCBhbmQgb25lIGJveCByb3VuZCBhbGwgb2YgdGhlbSBibG9ja2VkIHRoZSB3aG9sZSBpbmZpZWxkIGJlc2lkZSB0aGUgTWFpbiBHcmFuZHN0YW5kICovCiAg
ICBjeC5zZXRUcmFuc2Zvcm0uYXBwbHkoY3gsYmFzZSk7CiAgICBbXS5zbGljZS5jYWxsKHN2Zy5xdWVyeVNlbGVjdG9yQWxsKCIuZmxhZy13aGl0ZSIpKS5m
b3JFYWNoKGZ1bmN0aW9uKGUpewogICAgICB2YXIgYj1zaG93bihlKSYmbWFwQm94KGUpOyBpZihiKSBjeC5maWxsUmVjdChiLngtcGFkLTQvayxiLnktcGFk
LTQvayxiLncrMipwYWQrOC9rLGIuaCsyKnBhZCs4L2spOwogICAgfSk7CiAgICAvKiBzY3JlZW4gYm94ZXMgaW50byBtYXAgdW5pdHMgdGhyb3VnaCB0aGUg
bGl2ZSBzY3JlZW4gdHJhbnNmb3JtLCB3aGljaCBjYXJyaWVzIHRoZSB6b29tIGFuZCBwYW4gKi8KICAgIHZhciBzY3I9c3ZnLmdldFNjcmVlbkNUTSgpLCBi
YWNrPXNjcj9zY3IuaW52ZXJzZSgpOm51bGw7CiAgICBmdW5jdGlvbiB0b01hcChyKXsKICAgICAgaWYoIWJhY2spIHJldHVybiBudWxsOwogICAgICB2YXIg
YT1zdmcuY3JlYXRlU1ZHUG9pbnQoKSwgYj1zdmcuY3JlYXRlU1ZHUG9pbnQoKTsKICAgICAgYS54PXIubGVmdDsgYS55PXIudG9wOyBiLng9ci5yaWdodDsg
Yi55PXIuYm90dG9tOyBhPWEubWF0cml4VHJhbnNmb3JtKGJhY2spOyBiPWIubWF0cml4VHJhbnNmb3JtKGJhY2spOwogICAgICByZXR1cm4ge3g6TWF0aC5t
aW4oYS54LGIueCkseTpNYXRoLm1pbihhLnksYi55KSx3Ok1hdGguYWJzKGIueC1hLngpLGg6TWF0aC5hYnMoYi55LWEueSl9OwogICAgfQogICAgLyogdGhl
IHpvb20gYnV0dG9ucyBhbmQgdGhlaXIgaGludCBzaXQgb3ZlciB0aGUgdG9wIHJpZ2h0IGNvcm5lciBhcyBIVE1MOiBlYWNoIG9uZSwgbm90IHRoZSBib3gg
cm91bmQgdGhlbSAqLwogICAgY3guc2V0VHJhbnNmb3JtLmFwcGx5KGN4LGJhc2UpOwogICAgdmFyIHdyYXA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1h
cFdyYXAiKSwgaG9zdD13cmFwJiZ3cmFwLnBhcmVudEVsZW1lbnQ7CiAgICBbXS5zbGljZS5jYWxsKGhvc3Q/aG9zdC5xdWVyeVNlbGVjdG9yQWxsKCIubWFw
eiBidXR0b24sLm1hcHogLm1hcHotaGludCIpOltdKS5mb3JFYWNoKGZ1bmN0aW9uKG8pewogICAgICB2YXIgcj1vLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgp
LCBtPXIud2lkdGgmJnRvTWFwKHIpOyBpZighbSkgcmV0dXJuOwogICAgICBjeC5maWxsUmVjdChtLngtcGFkLG0ueS1wYWQsbS53KzIqcGFkLG0uaCsyKnBh
ZCk7CiAgICB9KTsKICAgIC8qIHdoYXQgaXMgYWN0dWFsbHkgb24gc2NyZWVuOiB0aGUgbWFwJ3MgZnJhbWUsIHdoaWNoIG9uIGEgcGhvbmUgc2hvd3MgYSB6
b29tZWQtaW4gcGFydCBvZiB0aGUgZHJhd2luZyAqLwogICAgdmFyIHZpZXc9e3g6dmIueCx5OnZiLnkscjp2Yi54K3ZiLndpZHRoLGI6dmIueSt2Yi5oZWln
aHR9LCBmcj13cmFwJiZ0b01hcCh3cmFwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTsKICAgIGlmKGZyKXsgdmlldz17eDpNYXRoLm1heCh2aWV3LngsZnIu
eCkseTpNYXRoLm1heCh2aWV3LnksZnIueSkscjpNYXRoLm1pbih2aWV3LnIsZnIueCtmci53KSxiOk1hdGgubWluKHZpZXcuYixmci55K2ZyLmgpfTsgfQoK
ICAgIC8qIHN1bW1lZC1hcmVhIHRhYmxlIG9mIHRoZSBwYWludGVkIGNlbGxzICovCiAgICB2YXIgcHg9Y3guZ2V0SW1hZ2VEYXRhKDAsMCxndyxnaCkuZGF0
YSwgUz1uZXcgRmxvYXQ2NEFycmF5KChndysxKSooZ2grMSkpLCBXMT1ndysxOwogICAgZm9yKHZhciB5PTA7eTxnaDt5KyspeyB2YXIgcm93PTA7IGZvcih2
YXIgeD0wO3g8Z3c7eCsrKXsgcm93Kz1weFsoeSpndyt4KSo0KzNdPjQwPzE6MDsgU1soeSsxKSpXMSt4KzFdPVNbeSpXMSt4KzFdK3JvdzsgfSB9CiAgICB2
YXIgZWRnZT0xMC9rOwogICAgZnVuY3Rpb24gY29zdChiKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBhaW50ZWQgY2VsbHMgdW5k
ZXIgYm94IGIsIG9yIC0xIGlmIGl0IGxlYXZlcyB0aGUgbWFwICovCiAgICAgIGlmKGIueDx2aWV3LngrZWRnZXx8Yi55PHZpZXcueStlZGdlfHxiLngrYi53
PnZpZXcuci1lZGdlfHxiLnkrYi5oPnZpZXcuYi1lZGdlKSByZXR1cm4gLTE7CiAgICAgIHZhciB4MD1NYXRoLmZsb29yKChiLngtdmIueCkvVSksIHkwPU1h
dGguZmxvb3IoKGIueS12Yi55KS9VKSwgeDE9TWF0aC5jZWlsKChiLngrYi53LXZiLngpL1UpLCB5MT1NYXRoLmNlaWwoKGIueStiLmgtdmIueSkvVSk7CiAg
ICAgIHJldHVybiBTW3kxKlcxK3gxXS1TW3kwKlcxK3gxXS1TW3kxKlcxK3gwXStTW3kwKlcxK3gwXTsKICAgIH0KICAgIGZ1bmN0aW9uIGdhcChhLGIpeyB2
YXIgZHg9TWF0aC5tYXgoMCxiLngtKGEueCthLncpLGEueC0oYi54K2IudykpLCBkeT1NYXRoLm1heCgwLGIueS0oYS55K2EuaCksYS55LShiLnkrYi5oKSk7
IHJldHVybiBNYXRoLnNxcnQoZHgqZHgrZHkqZHkpOyB9CiAgICBmdW5jdGlvbiBuZXN0ZWQoYSxiKXsgcmV0dXJuIChhLng+PWIueCYmYS55Pj1iLnkmJmEu
eCthLnc8PWIueCtiLncmJmEueSthLmg8PWIueStiLmgpfHwoYi54Pj1hLngmJmIueT49YS55JiZiLngrYi53PD1hLngrYS53JiZiLnkrYi5oPD1hLnkrYS5o
KTsgfQogICAgZnVuY3Rpb24gaGl0cyhhLGIpeyByZXR1cm4gYS54PGIueCtiLncrcGFkJiZiLng8YS54K2EudytwYWQmJmEueTxiLnkrYi5oK3BhZCYmYi55
PGEueSthLmgrcGFkOyB9CgogICAgLyogYSBzaGFwZSdzIGJveCBhcyBkcmF3bjogdGhlIGxvdW5nZSwgZm9yIG9uZSwgaXMgdHVybmVkIGJ5IGEgdHJhbnNm
b3JtIHRoYXQgZ2V0QkJveCBsZWF2ZXMgb3V0ICovCiAgICBmdW5jdGlvbiBtYXBCb3goZSl7CiAgICAgIHZhciBiPWJveChlKTsgaWYoIWIpIHJldHVybiBu
dWxsOwogICAgICB2YXIgbT1pbnYmJmUuZ2V0Q1RNP2ludi5tdWx0aXBseShlLmdldENUTSgpKTpudWxsOyBpZighbSkgcmV0dXJuIHt4OmIueCx5OmIueSx3
OmIud2lkdGgsaDpiLmhlaWdodH07CiAgICAgIHZhciB4cz1bXSx5cz1bXTsKICAgICAgW1tiLngsYi55XSxbYi54K2Iud2lkdGgsYi55XSxbYi54LGIueSti
LmhlaWdodF0sW2IueCtiLndpZHRoLGIueStiLmhlaWdodF1dLmZvckVhY2goZnVuY3Rpb24oYyl7CiAgICAgICAgeHMucHVzaChtLmEqY1swXSttLmMqY1sx
XSttLmUpOyB5cy5wdXNoKG0uYipjWzBdK20uZCpjWzFdK20uZik7CiAgICAgIH0pOwogICAgICB2YXIgeD1NYXRoLm1pbi5hcHBseShudWxsLHhzKSwgeT1N
YXRoLm1pbi5hcHBseShudWxsLHlzKTsKICAgICAgcmV0dXJuIHt4OngseTp5LHc6TWF0aC5tYXguYXBwbHkobnVsbCx4cykteCxoOk1hdGgubWF4LmFwcGx5
KG51bGwseXMpLXl9OwogICAgfQogICAgLyogZWFjaCBsYWJlbCdzIHpvbmUgYm94LCBzbyBhIGxhYmVsIHN0YXlzIG5lYXJlciBpdHMgb3duIHpvbmUgdGhh
biBhbnkgb3RoZXIgKi8KICAgIHZhciBsYWJlbHM9W10uc2xpY2UuY2FsbChzdmcucXVlcnlTZWxlY3RvckFsbCgidGV4dFtkYXRhLWVzLWZvcl0iKSksIHpi
PXt9LCB6cD17fTsKICAgIGxhYmVscy5mb3JFYWNoKGZ1bmN0aW9uKHQpewogICAgICB2YXIgaWQ9dC5nZXRBdHRyaWJ1dGUoImRhdGEtZXMtZm9yIiksIGJl
c3Q9bnVsbCwgZWw9bnVsbDsKICAgICAgW10uc2xpY2UuY2FsbChzdmcucXVlcnlTZWxlY3RvckFsbCgiLmVzLXpvbmUiKSkuZm9yRWFjaChmdW5jdGlvbih6
KXsKICAgICAgICBpZih6LmRhdGFzZXQuZXNJZCE9PWlkfHwhc2hvd24oeikpIHJldHVybjsKICAgICAgICB2YXIgYj1tYXBCb3goeik7IGlmKGImJighYmVz
dHx8Yi53KmIuaD5iZXN0LncqYmVzdC5oKSl7IGJlc3Q9YjsgZWw9ejsgfQogICAgICB9KTsKICAgICAgaWYoYmVzdCl7IHpiW2lkXT1iZXN0OyB6cFtpZF09
b3V0bGluZShlbCk7IH0KICAgIH0pOwogICAgLyogcG9pbnRzIHJvdW5kIGEgem9uZSdzIG93biBvdXRsaW5lLCBhcyBkcmF3bi4gVGhlIE1haW4gR3JhbmRz
dGFuZCBpcyBhIGxvbmcgZGlhZ29uYWwgYmFuZCwgc28gaXRzIGJveCBpcyBhIGJpZwogICAgICAgcmVjdGFuZ2xlIG1vc3RseSBvZiBlbXB0eSB0cmFjazsg
bWVhc3VyaW5nIHRvIHRoZSBib3ggbGV0IGl0cyBsYWJlbCBzaXQgd2VsbCBhd2F5IGZyb20gdGhlIHN0YW5kIGl0c2VsZiAqLwogICAgZnVuY3Rpb24gb3V0
bGluZShlKXsKICAgICAgdmFyIG09aW52JiZlLmdldENUTT9pbnYubXVsdGlwbHkoZS5nZXRDVE0oKSk6bnVsbCwgcmF3PVtdOwogICAgICB0cnl7CiAgICAg
ICAgaWYoZS5nZXRUb3RhbExlbmd0aCl7IHZhciBMPWUuZ2V0VG90YWxMZW5ndGgoKTsgZm9yKHZhciBpPTA7aTw0ODtpKyspeyB2YXIgcD1lLmdldFBvaW50
QXRMZW5ndGgoTCppLzQ4KTsgcmF3LnB1c2goW3AueCxwLnldKTsgfSB9CiAgICAgIH1jYXRjaCh4KXt9CiAgICAgIGlmKCFyYXcubGVuZ3RoKXsgdmFyIGI9
Ym94KGUpOyBpZihiKSByYXc9W1tiLngsYi55XSxbYi54K2Iud2lkdGgsYi55XSxbYi54LGIueStiLmhlaWdodF0sW2IueCtiLndpZHRoLGIueStiLmhlaWdo
dF1dOyB9CiAgICAgIHJldHVybiByYXcubWFwKGZ1bmN0aW9uKGMpeyByZXR1cm4gbT9bbS5hKmNbMF0rbS5jKmNbMV0rbS5lLG0uYipjWzBdK20uZCpjWzFd
K20uZl06YzsgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBlZGdlR2FwKGIscHRzKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgZ2FwIGZy
b20gYm94IGIgdG8gdGhlIGNsb3Nlc3Qgb3V0bGluZSBwb2ludCAqLwogICAgICB2YXIgZD1JbmZpbml0eTsKICAgICAgZm9yKHZhciBpPTA7aTxwdHMubGVu
Z3RoO2krKyl7CiAgICAgICAgdmFyIGR4PU1hdGgubWF4KDAsYi54LXB0c1tpXVswXSxwdHNbaV1bMF0tKGIueCtiLncpKSwgZHk9TWF0aC5tYXgoMCxiLnkt
cHRzW2ldWzFdLHB0c1tpXVsxXS0oYi55K2IuaCkpLCBxPWR4KmR4K2R5KmR5OwogICAgICAgIGlmKHE8ZCkgZD1xOwogICAgICB9CiAgICAgIHJldHVybiBN
YXRoLnNxcnQoZCk7CiAgICB9CiAgICBmdW5jdGlvbiBzZXRBdCh0LFgsWSxzaXplKXsKICAgICAgdmFyIHNwPVtdLnNsaWNlLmNhbGwodC5xdWVyeVNlbGVj
dG9yQWxsKCJ0c3BhbiIpKSwgbj1zcC5sZW5ndGg7CiAgICAgIHQuc3R5bGUuZm9udFNpemU9c2l6ZSsicHgiOyB0LnN0eWxlLmxldHRlclNwYWNpbmc9KHNp
emUqMC4wMykrInB4IjsKICAgICAgdC5zZXRBdHRyaWJ1dGUoIngiLFgpOyB0LnNldEF0dHJpYnV0ZSgieSIsWSk7CiAgICAgIHNwLmZvckVhY2goZnVuY3Rp
b24ocyxpKXsgcy5zZXRBdHRyaWJ1dGUoIngiLFgpOyBzLnNldEF0dHJpYnV0ZSgieSIsWSsoaS0obi0xKS8yKSpzaXplKjEuMDgpOyB9KTsKICAgIH0KICAg
IC8qIHRoZSBjcm93ZGVkIG1pZGRsZSBmaXJzdDogdGhlIHR3byBzdWl0ZXMgb24gdGhlIE1haW4gR3JhbmRzdGFuZCwgdGhlbiBpdHMgb3duIGxhYmVsLCB0
aGVuIHRoZSByZXN0ICovCiAgICB2YXIgb3JkZXI9WyJlcy1zdWl0ZS1tMTciLCJlcy1zdWl0ZS1waXRsYW5lIiwiZmEzNDlhZmM1MTg2NGNhY2I5NWEzOTk1
NWQ4MmIzNzlfY3RnIixISUxMXTsKICAgIGxhYmVscy5zb3J0KGZ1bmN0aW9uKGEsYil7CiAgICAgIHZhciBpYT1vcmRlci5pbmRleE9mKGEuZ2V0QXR0cmli
dXRlKCJkYXRhLWVzLWZvciIpKSwgaWI9b3JkZXIuaW5kZXhPZihiLmdldEF0dHJpYnV0ZSgiZGF0YS1lcy1mb3IiKSk7CiAgICAgIHJldHVybiAoaWE8MD85
OmlhKS0oaWI8MD85OmliKTsKICAgIH0pOwogICAgdmFyIHN0YXJ0PWxhYmVscy5tYXAoZnVuY3Rpb24odCl7IHJldHVybiB7dDp0LFg6K3QuZ2V0QXR0cmli
dXRlKCJ4IiksWTordC5nZXRBdHRyaWJ1dGUoInkiKX07IH0pOwogICAgdmFyIHNpemUwPXBhcnNlRmxvYXQoKGxhYmVsc1swXXx8e3N0eWxlOnt9fSkuc3R5
bGUuZm9udFNpemUpfHwxOC9rLCBuZWFyPTMwL2s7CiAgICAvKiBvbmUgcGFzcyBhdCBhIGdpdmVuIHNpemU6IGVhY2ggbGFiZWwgdG8gaXRzIGJlc3Qgc3Bv
dCwgbmVhcmVzdCBmaXJzdCB0byBpdHMgZml0dGVkIG9uZSAqLwogICAgZnVuY3Rpb24gcGFzcyhzaXplKXsKICAgICAgdmFyIHBsYWNlZD1bXSwgb3V0PVtd
LCB0b3RhbD0wLCBvaz10cnVlOwogICAgICBzdGFydC5mb3JFYWNoKGZ1bmN0aW9uKHMpewogICAgICAgIHZhciBpZD1zLnQuZ2V0QXR0cmlidXRlKCJkYXRh
LWVzLWZvciIpLCBvd249emJbaWRdOyBpZighb3duKSByZXR1cm47CiAgICAgICAgc2V0QXQocy50LHMuWCxzLlksc2l6ZSk7CiAgICAgICAgdmFyIGIwPXMu
dC5nZXRCQm94KCksIHJlbD17eDpiMC54LXMuWCx5OmIwLnktcy5ZLHc6YjAud2lkdGgsaDpiMC5oZWlnaHR9OwogICAgICAgIHZhciBzdGVwPU1hdGgubWF4
KFUsMy9rKSwgUj1NYXRoLm1heChvd24udyxvd24uaCkvMitNYXRoLm1heChyZWwudyxyZWwuaCkrNjAvaywgYmVzdD1udWxsOwogICAgICAgIGZvcih2YXIg
ZHk9LVI7ZHk8PVI7ZHkrPXN0ZXApIGZvcih2YXIgZHg9LVI7ZHg8PVI7ZHgrPXN0ZXApewogICAgICAgICAgdmFyIGJ4PXt4OnMuWCtkeCtyZWwueCx5OnMu
WStkeStyZWwueSx3OnJlbC53LGg6cmVsLmh9LCBjPWNvc3QoYngpOwogICAgICAgICAgaWYoYzwwKSBjb250aW51ZTsKICAgICAgICAgIGlmKHBsYWNlZC5z
b21lKGZ1bmN0aW9uKHApeyByZXR1cm4gaGl0cyhwLGJ4KTsgfSkpIGMrPTFlNDsKICAgICAgICAgIC8qIGNsb3NlbmVzcyB0byB0aGUgem9uZSdzIG91dGxp
bmUgY291bnRzIG1vc3Q7IHRoZSBmaXR0ZWQgc3BvdCBvbmx5IGJyZWFrcyB0aWVzICovCiAgICAgICAgICB2YXIgZz16cFtpZF0mJnpwW2lkXS5sZW5ndGg/
ZWRnZUdhcChieCx6cFtpZF0pOmdhcChieCxvd24pLCBzYz1jKjFlMysyKmcrMC4xKk1hdGguc3FydChkeCpkeCtkeSpkeSk7CiAgICAgICAgICBmb3IodmFy
IG8gaW4gemIpIGlmKG8hPT1pZCYmIW5lc3RlZCh6YltvXSxvd24pJiZnYXAoYngsemJbb10pPGcpIHNjKz00MDA7ICAgLyogY2xvc2VyIHRvIGFub3RoZXIg
em9uZSByZWFkcyBhcyB0aGF0IHpvbmUncyAqLwogICAgICAgICAgaWYoIWJlc3R8fHNjPGJlc3Quc2MpIGJlc3Q9e3NjOnNjLGM6YyxnOmcsWDpzLlgrZHgs
WTpzLlkrZHksYjpieH07CiAgICAgICAgfQogICAgICAgIGlmKCFiZXN0KXsgb2s9ZmFsc2U7IHRvdGFsKz0xZTk7IG91dC5wdXNoKHt0OnMudCxYOnMuWCxZ
OnMuWX0pOyByZXR1cm47IH0KICAgICAgICBpZihiZXN0LmM+MHx8YmVzdC5nPm5lYXIpIG9rPWZhbHNlOwogICAgICAgIHRvdGFsKz1iZXN0LnNjOyBwbGFj
ZWQucHVzaChiZXN0LmIpOyBvdXQucHVzaCh7dDpzLnQsWDpiZXN0LlgsWTpiZXN0Lll9KTsKICAgICAgfSk7CiAgICAgIHJldHVybiB7b2s6b2ssdG90YWw6
dG90YWwsc2l6ZTpzaXplLG91dDpvdXR9OwogICAgfQogICAgLyogZXZlcnkgbGFiZWwgc2hhcmVzIG9uZSBzaXplLCBhcyBiZWZvcmU6IGZ1bGwgc2l6ZSB3
aGVuIGVhY2ggbGFiZWwgZmluZHMgYSBjbGVhciBzcG90IHdpdGhpbiBhYm91dAogICAgICAgMzBweCBvZiBpdHMgem9uZSwgb3RoZXJ3aXNlIHRoZSB3aG9s
ZSBzZXQgc3RlcHMgZG93biB0b2dldGhlciAodG8gc2V2ZW4gdGVudGhzIGF0IG1vc3QpICovCiAgICB2YXIgd2luPW51bGw7CiAgICBbMSwwLjkyLDAuODUs
MC43OCwwLjddLnNvbWUoZnVuY3Rpb24oZil7CiAgICAgIHZhciByPXBhc3Moc2l6ZTAqZik7IHIudG90YWwrPSgxLWYpKjIwMC9rKnN0YXJ0Lmxlbmd0aDsK
ICAgICAgaWYoIXdpbnx8ci50b3RhbDx3aW4udG90YWwpIHdpbj1yOwogICAgICByZXR1cm4gci5vazsKICAgIH0pOwogICAgaWYoIXdpbil7IHN0YXJ0LmZv
ckVhY2goZnVuY3Rpb24ocyl7IHNldEF0KHMudCxzLlgscy5ZLHNpemUwKTsgfSk7IHJldHVybjsgfQogICAgd2luLm91dC5mb3JFYWNoKGZ1bmN0aW9uKG8p
eyBzZXRBdChvLnQsby5YLG8uWSx3aW4uc2l6ZSk7IH0pOwogIH0KICAvKiBhIHN0YW5kIG9yIGxvdW5nZSBwaWNrZWQgYWZ0ZXIgYSBzdWl0ZTogdGhlIHN1
aXRlJ3MgaGlnaGxpZ2h0IGdvZXMgKi8KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oZSl7CiAgICBpZihlLmlzVHJ1c3Rl
ZD09PWZhbHNlKSByZXR1cm47ICAgLyogb3BlblN1aXRlIHByZXNzZXMgYSBxdWljayBsaW5rIGl0c2VsZiAqLwogICAgdmFyIHo9ZS50YXJnZXQmJmUudGFy
Z2V0LmNsb3Nlc3QmJmUudGFyZ2V0LmNsb3Nlc3QoIi5lcy16b25lOm5vdChbZGF0YS1lcy1zdWl0ZV0pLCN6cFF1aWNrTGlua3MgYnV0dG9uLCNzdGFuZEFj
YyAuYWNjLXE6bm90KFtkYXRhLWVzLXN1aXRlLXJvd10pIik7CiAgICBpZih6KSBzZXRUaW1lb3V0KGNsZWFyU3VpdGVBY3RpdmUsMCk7CiAgfSx0cnVlKTsK
ICAvKiB0aGUgdGhyZWUgcm93cyBpbiB0aGUgU3RhbmRzIGFuZCBMb3VuZ2VzIGxpc3QgKi8KICBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0
b3JBbGwoIiNzdGFuZEFjYyAuYWNjLXFbZGF0YS1lcy1zdWl0ZS1yb3ddIikpLmZvckVhY2goZnVuY3Rpb24oYnRuKXsKICAgIHZhciBzPW51bGw7IFNVSVRF
Uy5mb3JFYWNoKGZ1bmN0aW9uKHgpeyBpZih4LmlkPT09YnRuLmdldEF0dHJpYnV0ZSgiZGF0YS1lcy1zdWl0ZS1yb3ciKSkgcz14OyB9KTsKICAgIGlmKCFz
KSByZXR1cm47CiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGUpewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFBy
b3BhZ2F0aW9uKCk7CiAgICAgIHZhciBzdmc9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI21hcFdyYXAgc3ZnIik7CiAgICAgIG9wZW5TdWl0ZShzLHN2ZyYm
c3ZnLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWVzLWlkPSInK3MuaWQrJyJdJykpOwogICAgfSx0cnVlKTsKICB9KTsKfSkoKTsK
IWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVzLXBhZ2UiKTtlJiZlLmNsYXNzTGlzdC5hZGQoImpzIiksZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHQ9bnVsbDt0cnl7dD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiZXNUaGVtZSIpfWNhdGNoKEEpe30ibGlnaHQiPT09dHx8ImRhcmsiPT09dD9lLnNldEF0dHJpYnV0ZSgiZGF0YS10aGVtZSIsdCk6d2luZG93Lm1hdGNoTWVkaWEmJndpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSIpLm1hdGNoZXMmJmUuc2V0QXR0cmlidXRlKCJkYXRhLXRoZW1lIiwibGlnaHQiKTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGhlbWVCdG4iKSxuPXdpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkiKS5tYXRjaGVzO2Z1bmN0aW9uIGkodCl7ZS5zZXRBdHRyaWJ1dGUoImRhdGEtdGhlbWUiLHQpO3RyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiZXNUaGVtZSIsdCl9Y2F0Y2goQSl7fX1hLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3ZhciB0PSJsaWdodCI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aGVtZSIpPyJkYXJrIjoibGlnaHQiO2lmKGEuY2xhc3NMaXN0LmFkZCgic3BpbiIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmNsYXNzTGlzdC5yZW1vdmUoInNwaW4iKX0sNTIwKSwhbiYmZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbil7dmFyIG89YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPW8ubGVmdCtvLndpZHRoLzIscj1vLnRvcCtvLmhlaWdodC8yLHM9TWF0aC5oeXBvdChNYXRoLm1heChjLHdpbmRvdy5pbm5lcldpZHRoLWMpLE1hdGgubWF4KHIsd2luZG93LmlubmVySGVpZ2h0LXIpKTtkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGZ1bmN0aW9uKCl7aSh0KX0pLnJlYWR5LnRoZW4oZnVuY3Rpb24oKXtlLmFuaW1hdGUoe2NsaXBQYXRoOlsiY2lyY2xlKDBweCBhdCAiK2MrInB4ICIrcisicHgpIiwiY2lyY2xlKCIrcysicHggYXQgIitjKyJweCAiK3IrInB4KSJdfSx7ZHVyYXRpb246NjIwLGVhc2luZzoiY3ViaWMtYmV6aWVyKC40LDAsLjIsMSkiLHBzZXVkb0VsZW1lbnQ6Ijo6dmlldy10cmFuc2l0aW9uLW5ldyhyb290KSJ9KX0pLmNhdGNoKGZ1bmN0aW9uKCl7fSl9ZWxzZSFmdW5jdGlvbih0KXtlLmNsYXNzTGlzdC5hZGQoInRoZW1pbmciKSxpKHQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmNsYXNzTGlzdC5yZW1vdmUoInRoZW1pbmciKX0sNTYwKX0odCl9KTt2YXIgbz1mdW5jdGlvbigpe307IWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImhlcm9UaXRsZSIpLHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmhlcm8tcGlsbGFycyIpO2lmKGUmJnQmJiFuJiZlLmFuaW1hdGUpe3ZhciBhPTI0MCxpPWZ1bmN0aW9uKGUpe3ZhciB0PVtdLGE9W10sbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmNoaWxkTm9kZXMpO2Z1bmN0aW9uIGkoZSxuKXtlLnNwbGl0KC8oXHMrKS8pLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSlpZigvXlxzKyQvLnRlc3QoZSkpbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpKTtlbHNle3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtpLmNsYXNzTmFtZT0idyIsQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTt0LmNsYXNzTmFtZT0iYyIsdC50ZXh0Q29udGVudD1lLGkuYXBwZW5kQ2hpbGQodCksYS5wdXNoKHQpfSksbi5hcHBlbmRDaGlsZChpKSx0LnB1c2goaSl9fSl9cmV0dXJuIGUuaW5uZXJIVE1MPSIiLG4uZm9yRWFjaChmdW5jdGlvbih0KXtpZigzPT09dC5ub2RlVHlwZSlpKHQudGV4dENvbnRlbnQsZSk7ZWxzZXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKTthLmNsYXNzTmFtZT10LmNsYXNzTmFtZSxlLmFwcGVuZENoaWxkKGEpLGkodC50ZXh0Q29udGVudCxhKX19KSx7d29yZHM6dCxjaGFyczphfX0oZSksYz10LnF1ZXJ5U2VsZWN0b3JBbGwoImEiKTt0LmNsYXNzTGlzdC5hZGQoImxpZnQiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsZnVuY3Rpb24oZSl7ZS5zdHlsZS5vcGFjaXR5PSIwIn0pLG89ZnVuY3Rpb24oKXtkb2N1bWVudC5mb250cyYmZG9jdW1lbnQuZm9udHMucmVhZHk/ZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbihyKS5jYXRjaChyKTpyKCl9fWZ1bmN0aW9uIHIoKXt2YXIgbj1mdW5jdGlvbigpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiZW0iKTtpZighdClyZXR1cm4gbnVsbDt2YXIgYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi53Iik7aWYoYS5sZW5ndGg8MilyZXR1cm4gbnVsbDtmb3IodmFyIG49YVswXS5xdWVyeVNlbGVjdG9yQWxsKCIuYyIpLGk9YVsxXS5xdWVyeVNlbGVjdG9yQWxsKCIuYyIpLG89bnVsbCxjPWkubGVuZ3RoLTE7Yz49MDtjLS0paWYoInQiPT09aVtjXS50ZXh0Q29udGVudC50b0xvd2VyQ2FzZSgpKXtvPWlbY107YnJlYWt9cmV0dXJuIG5bMF0mJm5bMV0mJm8/W25bMF0sblsxXSxvXTpudWxsfSgpO2lmKCFufHxjLmxlbmd0aDwzKXJldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsZnVuY3Rpb24oZSl7ZS5zdHlsZS5vcGFjaXR5PSIifSksdm9pZCB0LmNsYXNzTGlzdC5yZW1vdmUoImxpZnQiKTtpLmNoYXJzLmZvckVhY2goZnVuY3Rpb24oZSx0KXtlLmFuaW1hdGUoW3t0cmFuc2Zvcm06InRyYW5zbGF0ZVkoNDZweCkiLG9wYWNpdHk6MH0se3RyYW5zZm9ybToidHJhbnNsYXRlWSgwKSIsb3BhY2l0eToxfV0se2R1cmF0aW9uOjg2MCxkZWxheToyNCp0LGVhc2luZzoiY3ViaWMtYmV6aWVyKC4xNiwxLC4zLDEpIixmaWxsOiJib3RoIn0pfSk7dmFyIG89W107QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLGZ1bmN0aW9uKGUsdCl7dmFyIGE9blt0XS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7by5wdXNoKHtlbDplLGR4OmEubGVmdC1pLmxlZnQsZHk6YS50b3AtaS50b3B9KX0pO3ZhciByPTExODAscz0wO28uZm9yRWFjaChmdW5jdGlvbihlLHQpe3ZhciBpPTFlMyszODAqdDtzPU1hdGgubWF4KHMsaSs1MCtyKTt2YXIgbz1nZXRDb21wdXRlZFN0eWxlKG5bdF0pLmNvbG9yO25bdF0uYW5pbWF0ZShbe3RyYW5zZm9ybToic2NhbGUoMSkiLGNvbG9yOm99LHt0cmFuc2Zvcm06InNjYWxlKDEuMykiLGNvbG9yOiIjRUJCNDQ2IixvZmZzZXQ6LjMzLGVhc2luZzoiY3ViaWMtYmV6aWVyKC4yNSwuNDYsLjQ1LC45NCkifSx7dHJhbnNmb3JtOiJzY2FsZSgxKSIsY29sb3I6byxlYXNpbmc6ImN1YmljLWJlemllciguMzQsMS41NiwuNjQsMSkifV0se2R1cmF0aW9uOjQ1MCxkZWxheTppLGZpbGw6Im5vbmUifSk7dmFyIGM9InRyYW5zbGF0ZSgiK2UuZHgrInB4LCIrZS5keSsicHgpIHNjYWxlKDEuNCwxLjQpIjtlLmVsLmFuaW1hdGUoW3t0cmFuc2Zvcm06YyxvcGFjaXR5OjAsb2Zmc2V0OjB9LHt0cmFuc2Zvcm06YyxvcGFjaXR5OjEsb2Zmc2V0OjEzMC9yfSx7dHJhbnNmb3JtOmMsb3BhY2l0eToxLG9mZnNldDphL3IsZWFzaW5nOiJjdWJpYy1iZXppZXIoLjU1LC4wODUsLjY4LC41MykifSx7dHJhbnNmb3JtOiJ0cmFuc2xhdGUoMHB4LDBweCkgc2NhbGUoMSwxKSIsb3BhY2l0eToxLG9mZnNldDo4ODAvcixlYXNpbmc6ImVhc2Utb3V0In0se3RyYW5zZm9ybToidHJhbnNsYXRlKDBweCwwcHgpIHNjYWxlKDEsMC44NSkiLG9wYWNpdHk6MSxvZmZzZXQ6OTcwL3IsZWFzaW5nOiJlYXNlLW91dCJ9LHt0cmFuc2Zvcm06InRyYW5zbGF0ZSgwcHgsMHB4KSBzY2FsZSgxLDEpIixvcGFjaXR5OjEsb2Zmc2V0OjF9XSx7ZHVyYXRpb246cixkZWxheTppKzUwLGZpbGw6ImJvdGgifSl9KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLGZ1bmN0aW9uKGUpe2UuZ2V0QW5pbWF0aW9ucygpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jYW5jZWwoKX0pLGUuc3R5bGUub3BhY2l0eT0iIixlLnN0eWxlLnRyYW5zZm9ybT0iIn0pLHQuY2xhc3NMaXN0LnJlbW92ZSgibGlmdCIpfSxzKzQwKX19KCk7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVzTG9hZGVyIikscj1kb2N1bWVudC5ib2R5LHM9ITA7dHJ5e3M9ITB9Y2F0Y2goQSl7fWZ1bmN0aW9uIGQoKXtjLmNsYXNzTGlzdC5hZGQoImlzLW91dCIpLHIuY2xhc3NMaXN0LnJlbW92ZSgiZXNsLWxvY2siKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5oaWRkZW49ITB9LDcwMCk7dHJ5e3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oImVzU2VlbkxvYWRlciIsIjEiKX1jYXRjaChBKXt9c2V0VGltZW91dChvLDMwMCl9cz8oYy5oaWRkZW49ITAsci5jbGFzc0xpc3QucmVtb3ZlKCJlc2wtbG9jayIpLHNldFRpbWVvdXQobywyNjApKTooc2V0VGltZW91dChkLDIwNTApLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGQpKSxkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuY2FyLWJ0biIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlLmRhdGFzZXQudGFyZ2V0KTtpZih0KXt2YXIgYT10LmZpcnN0RWxlbWVudENoaWxkLG49YT9hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKzQ6LjgqdC5jbGllbnRXaWR0aDt0LnNjcm9sbEJ5KHtsZWZ0Om4qK2UuZGF0YXNldC5kaXIsYmVoYXZpb3I6InNtb290aCJ9KX19KX0pO3ZhciBsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZmlNb2RhbCIpLHU9bC5xdWVyeVNlbGVjdG9yKCIucmZpLWRsZyIpLHA9bnVsbCxmPW51bGwsaD0wO2Z1bmN0aW9uIG0oKXtpZighKGgrKz4wKSl7dmFyIGU9d2luZG93LmlubmVyV2lkdGgtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO2U+MCYmKGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PWUrInB4IiksZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIn19ZnVuY3Rpb24gZygpeyhoPU1hdGgubWF4KDAsaC0xKSk+MHx8KGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9IiIsZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9IiIpfWZ1bmN0aW9uIGIoKXtsLmhpZGRlbnx8KGwuY2xhc3NMaXN0LnJlbW92ZSgiaXMtb3BlbiIpLGwuY2xhc3NMaXN0LmFkZCgiaXMtY2xvc2luZyIpLGNsZWFyVGltZW91dChmKSxmPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtsLmhpZGRlbj0hMCxsLmNsYXNzTGlzdC5yZW1vdmUoImlzLWNsb3NpbmciKSxnKCkscCYmcC5mb2N1cyYmcC5mb2N1cygpLHA9bnVsbH0sbj8wOjI0MCkpfWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLW9wZW4tcmZpXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBhLGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5hdlBhbmVsIik7aWYoaSYmIWkuaGlkZGVuKXtpLmNsYXNzTGlzdC5yZW1vdmUoImlzLW9wZW4iKSxpLmNsYXNzTGlzdC5hZGQoImlzLWNsb3NpbmciKTt2YXIgbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2QnVyZ2VyIik7byYmKG8uc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiwiZmFsc2UiKSxvLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsIk9wZW4gbWVudSIpKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5oaWRkZW49ITAsaS5jbGFzc0xpc3QucmVtb3ZlKCJpcy1jbG9zaW5nIiksZygpfSxuPzA6MjYwKX1hPWUsY2xlYXJUaW1lb3V0KGYpLHA9YXx8bnVsbCxsLmNsYXNzTGlzdC5yZW1vdmUoImlzLWNsb3NpbmciKSxsLmhpZGRlbj0hMSxtKCksbC5vZmZzZXRXaWR0aCxsLmNsYXNzTGlzdC5hZGQoImlzLW9wZW4iKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImYtZmlyc3QiKTtpZihlKXRyeXtlLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSl9Y2F0Y2goQSl7ZS5mb2N1cygpfX0sbj8wOjI2MCl9KX0pLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWNsb3NlLXJmaV0iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7YigpfSl9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihlKXsiRXNjYXBlIiE9PWUua2V5fHxsLmhpZGRlbnx8YigpfSksbC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihlKXtpZigiVGFiIj09PWUua2V5KXtmb3IodmFyIHQ9dS5xdWVyeVNlbGVjdG9yQWxsKCJhW2hyZWZdLCBidXR0b246bm90KFtkaXNhYmxlZF0pLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSIpLGE9W10sbj0wO248dC5sZW5ndGg7bisrKW51bGwhPT10W25dLm9mZnNldFBhcmVudCYmYS5wdXNoKHRbbl0pO2lmKGEubGVuZ3RoKXt2YXIgaT1hWzBdLG89YVthLmxlbmd0aC0xXTtlLnNoaWZ0S2V5JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09aT8oZS5wcmV2ZW50RGVmYXVsdCgpLG8uZm9jdXMoKSk6ZS5zaGlmdEtleXx8ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PW98fChlLnByZXZlbnREZWZhdWx0KCksaS5mb2N1cygpKX19fSksZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJmaSIpLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpO3ZhciB0PWUudGFyZ2V0O2lmKHQuY2hlY2tWYWxpZGl0eSgpKXt2YXIgYT10LmRhdGFzZXQuZW5kcG9pbnQsbj1mdW5jdGlvbigpe3ZhciBzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZW50Iik7cy5jbGFzc0xpc3QuYWRkKCJvbiIpO3QucmVzZXQoKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cy5jbGFzc0xpc3QucmVtb3ZlKCJvbiIpfSw3MDAwKX07YT9mZXRjaChhLHttZXRob2Q6IlBPU1QiLGJvZHk6bmV3IEZvcm1EYXRhKHQpfSkudGhlbihuKS5jYXRjaChuKTpuKCl9ZWxzZSB0LnJlcG9ydFZhbGlkaXR5KCl9KTt2YXIgdj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2QnVyZ2VyIikseT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2UGFuZWwiKSx3PW51bGw7ZnVuY3Rpb24gRSgpe3kuaGlkZGVufHwoeS5jbGFzc0xpc3QucmVtb3ZlKCJpcy1vcGVuIikseS5jbGFzc0xpc3QuYWRkKCJpcy1jbG9zaW5nIiksdi5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpLHYuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwiT3BlbiBtZW51IiksY2xlYXJUaW1lb3V0KHcpLHc9c2V0VGltZW91dChmdW5jdGlvbigpe3kuaGlkZGVuPSEwLHkuY2xhc3NMaXN0LnJlbW92ZSgiaXMtY2xvc2luZyIpLGcoKX0sbj8wOjI2MCkpfXYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7eS5oaWRkZW4/KGNsZWFyVGltZW91dCh3KSx5LmNsYXNzTGlzdC5yZW1vdmUoImlzLWNsb3NpbmciKSx5LmhpZGRlbj0hMSxtKCkseS5vZmZzZXRXaWR0aCx5LmNsYXNzTGlzdC5hZGQoImlzLW9wZW4iKSx2LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsInRydWUiKSx2LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsIkNsb3NlIG1lbnUiKSk6RSgpfSkseS5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1jbG9zZS1tZW51XSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtFKCl9KX0pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZ1bmN0aW9uKGUpeyJFc2NhcGUiIT09ZS5rZXl8fHkuaGlkZGVufHwoRSgpLHYuZm9jdXMoKSl9KTt2YXIgUz13aW5kb3cubWF0Y2hNZWRpYSgiKG1pbi13aWR0aDogMTAwMXB4KSIpLEw9ZnVuY3Rpb24oZSl7ZS5tYXRjaGVzJiZFKCl9O1MuYWRkRXZlbnRMaXN0ZW5lcj9TLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsTCk6Uy5hZGRMaXN0ZW5lciYmUy5hZGRMaXN0ZW5lcihMKTt2YXIgaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2Iik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZnVuY3Rpb24oKXtrLmNsYXNzTGlzdC50b2dnbGUoInNjcm9sbGVkIix3aW5kb3cuc2Nyb2xsWT42MCl9KTt2YXIgeD1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuaXNJbnRlcnNlY3RpbmcmJihlLnRhcmdldC5jbGFzc0xpc3QuYWRkKCJ2IikseC51bm9ic2VydmUoZS50YXJnZXQpKX0pfSx7dGhyZXNob2xkOi4wOH0pO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5yLCAuc2VjdGlvbi1oZWFkZXIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3gub2JzZXJ2ZShlKX0pfSgpLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPXdpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkiKS5tYXRjaGVzLHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVzeFRpdGxlIiksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXN4UGlsbGFycyIpO2lmKHQmJmEmJiFlJiZ0LmFuaW1hdGUpe3ZhciBuPTI0MCxpPWZ1bmN0aW9uKGUpe3ZhciB0PVtdLGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5jaGlsZE5vZGVzKTtmdW5jdGlvbiBuKGUsYSl7ZS5zcGxpdCgvKFxzKykvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUpaWYoL15ccyskLy50ZXN0KGUpKWEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAiKSk7ZWxzZXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7bi5jbGFzc05hbWU9InciLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSxmdW5jdGlvbihlKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7YS5jbGFzc05hbWU9ImMiLGEudGV4dENvbnRlbnQ9ZSxuLmFwcGVuZENoaWxkKGEpLHQucHVzaChhKX0pLGEuYXBwZW5kQ2hpbGQobil9fSl9cmV0dXJuIGUuaW5uZXJIVE1MPSIiLGEuZm9yRWFjaChmdW5jdGlvbih0KXtpZigzPT09dC5ub2RlVHlwZSluKHQudGV4dENvbnRlbnQsZSk7ZWxzZXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKTthLmNsYXNzTmFtZT10LmNsYXNzTmFtZSxlLmFwcGVuZENoaWxkKGEpLG4odC50ZXh0Q29udGVudCxhKX19KSx0fSh0KSxvPWEucXVlcnlTZWxlY3RvcigiYSIpO2EuY2xhc3NMaXN0LmFkZCgibGlmdCIpLG8mJihvLnN0eWxlLm9wYWNpdHk9IjAiKTt2YXIgYz1hLnF1ZXJ5U2VsZWN0b3IoImxpOm50aC1jaGlsZCgyKSIpO2MmJmMuY2xhc3NMaXN0LmFkZCgidGFnLXdhaXQiKTt2YXIgcj0hMDt0cnl7cj0hMH1jYXRjaChkKXt9c2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmZvbnRzJiZkb2N1bWVudC5mb250cy5yZWFkeT9kb2N1bWVudC5mb250cy5yZWFkeS50aGVuKHMpLmNhdGNoKHMpOnMoKX0scj8yNjA6MjM1MCl9ZnVuY3Rpb24gcygpe3ZhciBlPWZ1bmN0aW9uKCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCJlbSIpO2lmKCFlKXJldHVybiBudWxsO3ZhciBuPWUucXVlcnlTZWxlY3RvckFsbCgiLnciKTtpZighbi5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIGk9cGFyc2VJbnQoYS5nZXRBdHRyaWJ1dGUoImRhdGEtc3JjLWluZGV4Iil8fCIwIiwxMCl8fDAsbz1uWzBdLnF1ZXJ5U2VsZWN0b3JBbGwoIi5jIik7cmV0dXJuIG9baV18fG9bMF18fG51bGx9KCk7aWYoIWV8fCFvKXJldHVybiBvJiYoby5zdHlsZS5vcGFjaXR5PSIiKSxjJiZjLmNsYXNzTGlzdC5yZW1vdmUoInRhZy13YWl0Iiksdm9pZCBhLmNsYXNzTGlzdC5yZW1vdmUoImxpZnQiKTtpLmZvckVhY2goZnVuY3Rpb24oZSx0KXtlLmFuaW1hdGUoW3t0cmFuc2Zvcm06InRyYW5zbGF0ZVkoNDZweCkiLG9wYWNpdHk6MH0se3RyYW5zZm9ybToidHJhbnNsYXRlWSgwKSIsb3BhY2l0eToxfV0se2R1cmF0aW9uOjg2MCxkZWxheToyNCp0LGVhc2luZzoiY3ViaWMtYmV6aWVyKC4xNiwxLC4zLDEpIixmaWxsOiJib3RoIn0pfSk7dmFyIHI9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPW8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD1NYXRoLm1pbigxLjQsTWF0aC5tYXgoLjIsci5oZWlnaHQvcy5oZWlnaHQqMS4xNSkpLGw9ci5sZWZ0LXMubGVmdCx1PXIuYm90dG9tLXMuYm90dG9tLHA9MTE4MCxmPTFlMyxoPWdldENvbXB1dGVkU3R5bGUoZSkuY29sb3I7ZS5hbmltYXRlKFt7dHJhbnNmb3JtOiJzY2FsZSgxKSIsY29sb3I6aH0se3RyYW5zZm9ybToic2NhbGUoMS4zKSIsY29sb3I6IiNFQkI0NDYiLG9mZnNldDouMzMsZWFzaW5nOiJjdWJpYy1iZXppZXIoLjI1LC40NiwuNDUsLjk0KSJ9LHt0cmFuc2Zvcm06InNjYWxlKDEpIixjb2xvcjpoLGVhc2luZzoiY3ViaWMtYmV6aWVyKC4zNCwxLjU2LC42NCwxKSJ9XSx7ZHVyYXRpb246NDUwLGRlbGF5OmYsZmlsbDoibm9uZSJ9KTt2YXIgbT0idHJhbnNsYXRlKCIrbCsicHgsIit1KyJweCkgc2NhbGUoIitkKyIsIitkKyIpIjtvLmFuaW1hdGUoW3t0cmFuc2Zvcm06bSxvcGFjaXR5OjAsb2Zmc2V0OjB9LHt0cmFuc2Zvcm06bSxvcGFjaXR5OjEsb2Zmc2V0OjEzMC9wfSx7dHJhbnNmb3JtOm0sb3BhY2l0eToxLG9mZnNldDpuL3AsZWFzaW5nOiJjdWJpYy1iZXppZXIoLjU1LC4wODUsLjY4LC41MykifSx7dHJhbnNmb3JtOiJ0cmFuc2xhdGUoMHB4LDBweCkgc2NhbGUoMSwxKSIsb3BhY2l0eToxLG9mZnNldDo4ODAvcCxlYXNpbmc6ImVhc2Utb3V0In0se3RyYW5zZm9ybToidHJhbnNsYXRlKDBweCwwcHgpIHNjYWxlKDEsMC44NSkiLG9wYWNpdHk6MSxvZmZzZXQ6OTcwL3AsZWFzaW5nOiJlYXNlLW91dCJ9LHt0cmFuc2Zvcm06InRyYW5zbGF0ZSgwcHgsMHB4KSBzY2FsZSgxLDEpIixvcGFjaXR5OjEsb2Zmc2V0OjF9XSx7ZHVyYXRpb246cCxkZWxheToxMDUwLGZpbGw6ImJvdGgifSksc2V0VGltZW91dChmdW5jdGlvbigpe28uZ2V0QW5pbWF0aW9ucygpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jYW5jZWwoKX0pLG8uc3R5bGUub3BhY2l0eT0iIixvLnN0eWxlLnRyYW5zZm9ybT0iIixhLmNsYXNzTGlzdC5yZW1vdmUoImxpZnQiKSxjJiYoYy5jbGFzc0xpc3QucmVtb3ZlKCJ0YWctd2FpdCIpLGMuY2xhc3NMaXN0LmFkZCgidGFnLWluIikpfSwyMjcwKX19KCksZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZlbnVlRmlsZSIpO2lmKGUpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiLmFiLXRvZ2dsZSIpLGE9ZS5xdWVyeVNlbGVjdG9yKCIuYWItbGVhZCIpLG49ZnVuY3Rpb24oKXt2YXIgYT1lLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKTt0LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsYT8idHJ1ZSI6ImZhbHNlIil9O2EuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLG4pLHQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7IkVudGVyIiE9PWUua2V5JiYiICIhPT1lLmtleXx8KGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpLG4oKSl9KX1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuYWNjLWl0ZW0iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiLmFjYy1xIik7dC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt2YXIgYT1lLmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKTt0LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsYT8idHJ1ZSI6ImZhbHNlIil9KX0pfSgpLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPSJodHRwczovL2Nkbi54czJldmVudC5jb20vdmVudWVzL2VmOGU0ODViZDY0MTQ2MzJiYjEwYmFhMGU2ZTIzMWZlX3ZueC5zdmciLHQ9e2ZhMzQ5YWZjNTE4NjRjYWNiOTVhMzk5NTVkODJiMzc5X2N0Zzp7bmFtZToiTWFpbiBHcmFuZHN0YW5kIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJEaXJlY3RseSBvcHBvc2l0ZSB0aGUgcGl0IGxhbmUgb24gdGhlIHN0YXJ04oCTZmluaXNoIHN0cmFpZ2h0IOKAlCB0aGUgZ3JpZCwgcGl0IHN0b3BzLCBhbmQgdGhlIHBvZGl1bSBhbGwgcGxheSBvdXQgaW4gZnJvbnQgb2YgeW91LiJ9LGQyZmZiMTczNjczYzQ5Nzg5ZTcxOWM2OTU2YzAyNjVmX2N0Zzp7bmFtZToiTWFpbiBHcmFuZHN0YW5kIFByZW1pdW0iLHRpZXI6ImdyYW5kc3RhbmQiLGRlc2M6IlByZW1pdW0gc2VhdGluZyBibG9ja3Mgb24gdGhlIG1haW4gc3RyYWlnaHQgd2l0aCBlbGV2YXRlZCBzaWdodGxpbmVzIG92ZXIgdGhlIGdyaWQgYW5kIHBpdCBsYW5lLiJ9LCI4ZmY1OGZlYWZlNzA0YmUwYmQ3MDI1YWM3ZGMyODkxMV9jdGciOntuYW1lOiJOb3J0aCBHcmFuZHN0YW5kIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJPdmVybG9va2luZyB0aGUgaGVhdnkgYnJha2luZyB6b25lIGF0IHRoZSBlbmQgb2YgdGhlIGJhY2sgc3RyYWlnaHQg4oCUIG9uZSBvZiB0aGUgYmVzdCBvdmVydGFraW5nIHNwb3RzIG9uIHRoZSBjaXJjdWl0LiJ9LGFkMDExZDhmMzk2MzQ1N2E5ZTJiODM1MDlmOTE5OWUyX2N0Zzp7bmFtZToiTm9ydGggR3JhbmRzdGFuZCBQcmVtaXVtIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJQcmVtaXVtIGJsb2NrcyBhYm92ZSB0aGUgTm9ydGggaGFpcnBpbiBicmFraW5nIHpvbmUsIHByaW1lIHRlcnJpdG9yeSBmb3IgbGF0ZS1yYWNlIG92ZXJ0YWtlcy4ifSxkM2NiMjU4ZDI5ZTM0MDBhYWE2MDllNzFmMmZkNDg0YV9jdGc6e25hbWU6Ik5vcnRoIFN0cmFpZ2h0Iix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJTZWF0aW5nIGFsb25nIHRoZSBydW4gZG93biB0byB0aGUgTm9ydGggY29ybmVyIGNvbXBsZXgsIHdpdGggY2FycyBhdCBmdWxsIHNwZWVkIGRpcmVjdGx5IGJlbG93LiJ9LCI2OWM2M2NiMjM3Y2E0ZjZkODQ4NWVhZjU1MGYxYjYyMF9jdGciOntuYW1lOiJOb3J0aCBTdHJhaWdodCBQcmVtaXVtIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJQcmVtaXVtIHBvc2l0aW9ucyBvbiB0aGUgYXBwcm9hY2ggdG8gdGhlIE5vcnRoIGNvcm5lcnMuIn0sIjA5MGUxNjUyYmQyYTRmYmFiMzBjY2ZhYzk4YzZmYzNjX2N0ZyI6e25hbWU6Ildlc3QgR3JhbmRzdGFuZCIsdGllcjoiZ3JhbmRzdGFuZCIsZGVzYzoiU2V0IGFnYWluc3QgdGhlIHN3ZWVwaW5nIFdlc3Qgc2VjdGlvbiBiZW5lYXRoIHRoZSBXIEFidSBEaGFiaSBob3RlbCwgY2F0Y2hpbmcgdGhlIGNhcnMgdGhyb3VnaCB0aGUgdHdpbGlnaHQgc3dpdGNoYmFja3MuIn0sIjUwYTA1NjZmMDAzNjQyMDY5MGVmN2Q3NGQxMTYyMzg2X2N0ZyI6e25hbWU6Ildlc3QgR3JhbmRzdGFuZCBQcmVtaXVtIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJQcmVtaXVtIGJsb2NrcyBvbiB0aGUgV2VzdCBzZWN0aW9uIHdpdGggdmlld3MgdG93YXJkcyB0aGUgaG90ZWwgYW5kIG1hcmluYS4ifSwiNjQ0NzkyMjdmN2M4NGEzYzgyNjVhMGVmNmM1N2IzOTJfY3RnIjp7bmFtZToiV2VzdCBTdHJhaWdodCIsdGllcjoiZ3JhbmRzdGFuZCIsZGVzYzoiU2VhdGluZyBhbG9uZyB0aGUgd2VzdGVybiBzdHJhaWdodCBhcyB0aGUgY2FycyBidWlsZCBzcGVlZCB0b3dhcmRzIHRoZSBmaW5hbCBzZWN0b3IuIn0sZWJhNzk3ODEzZWZhNDUyNDk1ZjE2YTZmMTg5N2RkYzNfY3RnOntuYW1lOiJTb3V0aCBHcmFuZHN0YW5kIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJQb3NpdGlvbmVkIG92ZXIgdGhlIHNvdXRoZXJuIGNvcm5lciBzZXF1ZW5jZSwgd2l0aCBsb25nIHNpZ2h0bGluZXMgYWNyb3NzIG11bHRpcGxlIHR1cm5zLiJ9LCI3NDRiNDY5ZTEyYjc0MmIzYWRiYTA4YzIyMjBiODc1Zl9jdGciOntuYW1lOiJTb3V0aCBHcmFuZHN0YW5kIExvd2VyIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJMb3dlci10aWVyIHNlYXRpbmcgaW4gdGhlIFNvdXRoIHN0YW5kLCBjbG9zZSB0byB0aGUgYWN0aW9uIHRocm91Z2ggdGhlIHNvdXRoZXJuIGNvcm5lcnMuIn0sIjk1NWVmOTgxZGIyODQ1NmJiMGFjZThhNDk1YWJmOThiX2N0ZyI6e25hbWU6Ik1hcmluYSBHcmFuZHN0YW5kIix0aWVyOiJncmFuZHN0YW5kIixkZXNjOiJUaGUgc2lnbmF0dXJlIFlhcyBNYXJpbmEgYmFja2Ryb3Ag4oCUIHN1cGVyeWFjaHRzIG9uIG9uZSBzaWRlLCB0aGUgY2lyY3VpdCBvbiB0aGUgb3RoZXIuIn0sIjdkY2MyNDM2ODEzNzRjYTA4Y2Q3ZDkxOWQ5YTI3NmZlX2N0ZyI6e25hbWU6Ik1haW4gQ2x1YiIsdGllcjoibG91bmdlIixkZXNjOiJDbHViIGhvc3BpdGFsaXR5IGJlaGluZCB0aGUgTWFpbiBHcmFuZHN0YW5kIHBhaXJpbmcgcHJlbWl1bSBzZWF0aW5nIHdpdGggYWxsLWRheSBsb3VuZ2UgYWNjZXNzLiJ9LGQ0MTVjODE1ZWNjZjQyODk4ZDU0ODI2ZTA0YmVkOTM3X2N0Zzp7bmFtZToiV2VzdCBDbHViIix0aWVyOiJsb3VuZ2UiLGRlc2M6IkNsdWIgaG9zcGl0YWxpdHkgb24gdGhlIFdlc3Qgc2VjdGlvbiDigJQgbG91bmdlIGFjY2VzcyB3aXRoIGdyYW5kc3RhbmQgc2VhdGluZyBvdmVyIHRoZSBzd2l0Y2hiYWNrcy4ifSxlZDE2NDhlZWM2Mjg0NGUzYjJlZjZiYmI0ZmQxYzk5NF9jdGc6e25hbWU6IlNvdXRoIENsdWIiLHRpZXI6ImxvdW5nZSIsZGVzYzoiQ2x1Yi1sZXZlbCBob3NwaXRhbGl0eSBwYWlyZWQgd2l0aCBTb3V0aCBHcmFuZHN0YW5kIHNlYXRpbmcuIn0sZjU1YjIwMjVlMzkzNDcxMTljNzNhYTMwZWJjYjU0NWJfY3RnOntuYW1lOiJDaGFtcGlvbnMgQ2x1YiIsdGllcjoibG91bmdlIixkZXNjOiJFbGV2YXRlZCBjbHViIGhvc3BpdGFsaXR5IHdpdGggcHJlbWl1bSBkaW5pbmcgYW5kIHNvbWUgb2YgdGhlIGJyb2FkZXN0IHZpZXdzIG9uIHRoZSBjaXJjdWl0LiJ9LGI4NTQxY2I4ZTI0MDRmZjk4MTJmZTgzZDMyNjI4Y2M2X2N0Zzp7bmFtZToiWWFzIExvdW5nZSBOb3J0aCIsdGllcjoibG91bmdlIixkZXNjOiJMb3VuZ2UgaG9zcGl0YWxpdHkgYWJvdmUgdGhlIE5vcnRoIHNlY3Rpb24gYnJha2luZyB6b25lLiJ9LCI2NmJlMzQ2OTlmY2U0MmQ5OTI2ZDg1NGUwYjc1ZmI3N19jdGciOntuYW1lOiJZYXMgTG91bmdlIFdlc3QiLHRpZXI6ImxvdW5nZSIsZGVzYzoiTG91bmdlIGhvc3BpdGFsaXR5IG92ZXJsb29raW5nIHRoZSBXZXN0IHNlY3Rpb24uIn0sIjg1NDA5ZDFjYzFhOTQ3OTY5NDg5ZjRjMDVjMWUzMmQ3X2N0ZyI6e25hbWU6IlRlcnJhY2UgSG9zcGl0YWxpdHkg4oCUIFR1cm4gMSIsdGllcjoibG91bmdlIixkZXNjOiJPcGVuIHRlcnJhY2UgaG9zcGl0YWxpdHkgYWJvdmUgVHVybiAxLCB3YXRjaGluZyB0aGUgZmllbGQgZnVubmVsIGluIG9uIHRoZSBvcGVuaW5nIGxhcC4ifSxhZmM2N2JkOTE0ODY0ODQ4OGMxNDgzNTNiYzY4OTdhMF9jdGc6e25hbWU6IlRlcnJhY2UgSG9zcGl0YWxpdHkg4oCUIEhhaXJwaW4iLHRpZXI6ImxvdW5nZSIsZGVzYzoiVGVycmFjZSBwb3NpdGlvbnMgb3ZlciB0aGUgaGFpcnBpbiwgdGhlIHNsb3dlc3QgYW5kIG1vc3QgZHJhbWF0aWMgY29ybmVyIG9uIHRoZSBsYXAuIn0sY2JmM2Q3NTExOTZiNDM3ZDhiM2E3ODFmMWI5ZTU1MjdfY3RnOntuYW1lOiJNYXJpbmEgTG91bmdlIix0aWVyOiJsb3VuZ2UiLGRlc2M6IkxvdW5nZSBob3NwaXRhbGl0eSBzZXQgYWdhaW5zdCB0aGUgbWFyaW5hLCBjb21iaW5pbmcgdHJhY2tzaWRlIHZpZXdzIHdpdGggdGhlIHdhdGVyZnJvbnQgc2V0dGluZy4ifSxkZGE0NzRlNTdjNzI0YmY3OTYwNmE2YmEzMmQyNjJkMl9jdGc6e25hbWU6IlN1bnNldCBMb3VuZ2UiLHRpZXI6ImxvdW5nZSIsZGVzYzoiV2VzdC1mYWNpbmcgbG91bmdlIGJ1aWx0IGFyb3VuZCB0aGUgdHdpbGlnaHQtaW50by1uaWdodCBjaGFyYWN0ZXIgb2YgdGhlIHJhY2UuIn0sIjRhMTJiZGU0MmI2NTQ0NDE5OGY5NDcxZGVjMWM4NDY0X2N0ZyI6e25hbWU6IlRoZSBEZWNrIEAgTmluZSIsdGllcjoibG91bmdlIixkZXNjOiJUZXJyYWNlIGhvc3BpdGFsaXR5IHBvc2l0aW9uZWQgb3ZlciB0aGUgVHVybiA5IGNvbXBsZXguIn0sIjI5M2JjYzIwZjE4OTRkMzFhYjBiNTU2YmE0NTA0MjRhX2N0ZyI6e25hbWU6Ik1hcmluYSDigJQgVmVsb2NpdHkgRXhwZXJpZW5jZSIsdGllcjoibG91bmdlIixkZXNjOiJNYXJpbmEtc2lkZSBob3NwaXRhbGl0eSBleHBlcmllbmNlIHdpdGggcHJlbWl1bSB2aWV3aW5nIGFjcm9zcyB0aGUgY2lyY3VpdCBiYXNpbi4ifSxjYWJlZWEyNmJjNTg0YTVkYjMwNjY0Y2NjNGZjYTRiYV9jdGc6e25hbWU6IllhcyBTdWl0ZSDigJQgTWFpbiIsdGllcjoic3VpdGUiLGRlc2M6IlByaXZhdGUgc3VpdGUgaG9zcGl0YWxpdHkgYWJvdmUgdGhlIG1haW4gc3RyYWlnaHQsIHdpdGggdGhlIGdyaWQgYW5kIHBpdCBsYW5lIGxhaWQgb3V0IGJlbG93LiJ9LGYyMmRlY2EzZDQzNzQ2MTRiMzI0YTA4YzQ1ODA4YmQwX2N0Zzp7bmFtZToiWWFzIFN1aXRlIOKAlCBNYWluIFByZW1pdW0iLHRpZXI6InN1aXRlIixkZXNjOiJUaGUgcHJlbWl1bSB0aWVyIG9mIE1haW4gc3VpdGVzLCBkaXJlY3RseSBvdmVyIHRoZSBzdGFydOKAk2ZpbmlzaCBsaW5lLiJ9LCI0MTVkZmViM2JmNzE0YTNmOGVjYzg3MmI3Y2ViODJlZV9jdGciOntuYW1lOiJZYXMgU3VpdGUg4oCUIFdlc3QiLHRpZXI6InN1aXRlIixkZXNjOiJQcml2YXRlIHN1aXRlcyBvbiB0aGUgV2VzdCBzZWN0aW9uIHdpdGggaG90ZWwgYW5kIG1hcmluYSB2aWV3cy4ifSwiNDA1ZGQzZmVlZDc1NGMzYjhmYjdkNWRiZTAwNzJhMTBfY3RnIjp7bmFtZToiWWFzIFN1aXRlIOKAlCBXZXN0IFByZW1pdW0iLHRpZXI6InN1aXRlIixkZXNjOiJQcmVtaXVtIFdlc3Qgc3VpdGVzIG92ZXIgdGhlIHN3aXRjaGJhY2sgc2VxdWVuY2UuIn0sIjZmNTMzMzk2ODJhZjQ1NTFiZWZlYTg3MzRkZmE2MTJiX2N0ZyI6e25hbWU6IllhcyBTdWl0ZSDigJQgTm9ydGgiLHRpZXI6InN1aXRlIixkZXNjOiJQcml2YXRlIHN1aXRlcyBhYm92ZSB0aGUgTm9ydGggYnJha2luZyB6b25lLiJ9LCI3ODQzODM1MDgwNDM0NDdkOTNjMjViZGNhNWJhOTE5NF9jdGciOntuYW1lOiJZYXMgU3VpdGUg4oCUIE5vcnRoIFByZW1pdW0iLHRpZXI6InN1aXRlIixkZXNjOiJQcmVtaXVtIE5vcnRoIHN1aXRlcyBvdmVyIHRoZSBjaXJjdWl04oCZcyBiZXN0IG92ZXJ0YWtpbmcgcG9pbnQuIn0sYjVjZDZhMDY2YjFiNDBmNzk1ODA0MTlkOTI2Njg3NThfY3RnOntuYW1lOiJNYXJzYSBTdWl0ZXMiLHRpZXI6InN1aXRlIixkZXNjOiJTdWl0ZSBob3NwaXRhbGl0eSBvbiB0aGUgbWFyaW5hIHNpZGUgb2YgdGhlIGNpcmN1aXQuIn0sYWJkMGYxMzQ3YjIzNDNjNGEzNWQ4YjNiMDU5ZTNmYjBfY3RnOntuYW1lOiJNYXJzYSBCb3hlcyIsdGllcjoic3VpdGUiLGRlc2M6IlByaXZhdGUgYm94ZXMgd2l0aCBtYXJpbmEtc2lkZSBwb3NpdGlvbmluZy4ifSwiOGYyYzgxZDhlNDY2NDk5MGJkMWZjYjA1MGQ5OWU3NTVfY3RnIjp7bmFtZToiTWFyaW5hIFZpZXdzIFN1aXRlIix0aWVyOiJzdWl0ZSIsZGVzYzoiU3VpdGUgaG9zcGl0YWxpdHkgbG9va2luZyBhY3Jvc3MgdGhlIG1hcmluYSBiYXNpbiB0byB0aGUgY2lyY3VpdC4ifSwiNzE3NzhhNDk0YTk3NGMxZjkxMzRmMGY2MzE4NTA3MWNfY3RnIjp7bmFtZToiVHVybiAxIEhvc3BpdGFsaXR5IFN1aXRlIix0aWVyOiJzdWl0ZSIsZGVzYzoiU3VpdGUgcG9zaXRpb25zIGRpcmVjdGx5IGFib3ZlIFR1cm4gMS4ifSwiOGJkZGU5YzFjZmFjNGVhYmExYTE0NDUzNDllNDhiMjNfY3RnIjp7bmFtZToiWWFzIFlhY2h0Iix0aWVyOiJzdWl0ZSIsZGVzYzoiSG9zcGl0YWxpdHkgaG9zdGVkIGFib2FyZCBhIHlhY2h0IGJlcnRoZWQgaW4gWWFzIE1hcmluYSDigJQgdGhlIG1vc3QgZGlzdGluY3RpdmUgc2V0dGluZyBvbiB0aGUgY2lyY3VpdC4ifSxiZDdhOTQ4YTRlNjI0MWFjYTZlY2M5ZmY1N2Q4YzBmN19jdGc6e25hbWU6IkFidSBEaGFiaSBIaWxsIix0aWVyOiJnYSIsZGVzYzoiVGhlIGdyYXNzIGhpbGwgaW5zaWRlIHRoZSBOb3J0aCBzZWN0aW9uIOKAlCBnZW5lcmFsIGFkbWlzc2lvbiB3aXRoIGEgZmVzdGl2YWwgYXRtb3NwaGVyZSBhbmQgY2xlYXIgdHJhY2sgdmlld3MuIn19LGE9e2ZhMzQ5YWZjNTE4NjRjYWNiOTVhMzk5NTVkODJiMzc5X2N0Zzp7ZnJvbTo2MTAwLHN0b2NrOiJvdXQiLHVybDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvcHJvZHVjdC9mMS1hYnUtZGhhYmktbWFpbi1ncmFuZHN0YW5kLXRpY2tldC8iLHN1bToiSGVhcnQgb2YgdGhlIEdyYW5kIFByaXgg4oCUIHN0YXJ0aW5nIGdyaWQsIHBpdCBzdG9wcywgZmluaXNoLWxpbmUgZHJhbWEgYW5kIHRoZSBwb2RpdW0gZGlyZWN0bHkgaW4gZnJvbnQgb2YgeW91LiIsdGlwOiJUSVAgLy8gQlJJTkcgSEVBRFBIT05FUyBGT1IgWU9VTkcgRkFOUyDigJQgR1JJRC1TSURFIE5PSVNFIFBFQUtTIEhFUkUuIixpbmM6WyJGMcKuIEZhbnpvbmUgKyBhbGwgT2FzaXMgYXJlYXMiLCJBZnRlci1SYWNlIENvbmNlcnRzIGF0IEV0aWhhZCBQYXJrIChHQSkiLCIxLWRheSBZYXMgdGhlbWUtcGFyayBhY2Nlc3MiLCJFbnRyeSB0byBzZWxlY3RlZCBtdXNldW1zIl0saWRlYWw6WyJTdGFydC10by1maW5pc2ggZHJhbWEiLCJGaXJzdC10aW1lcnMiLCJDZW50cmFsIHJhY2Ugdmlld3MiXSxub3RlOiJNYW5kYXRvcnkgMi1uaWdodCBBYnUgRGhhYmkgaG90ZWwgc3RheSDigJQgYWRkZWQgYXQgdGhlIG5leHQgc3RlcDsgcHJpY2Ugc2hvd24gaXMgdGlja2V0IG9ubHkuIn0sIjhmZjU4ZmVhZmU3MDRiZTBiZDcwMjVhYzdkYzI4OTExX2N0ZyI6e2Zyb206NTEwMCxzdG9jazoiaW4iLHVybDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvcHJvZHVjdC9ub3J0aC1ncmFuZHN0YW5kLyIsc3VtOiJSaWdodCBieSB0aGUgVHVybiA1IGJyYWtpbmcgem9uZSDigJQgaGFyZCBicmFraW5nLCBwb3NpdGlvbiBiYXR0bGVzLCB0aGVuIHRoZSBsYXVuY2ggb250byB0aGUgbG9uZ2VzdCBzdHJhaWdodC4iLHRpcDoiVElQIC8vIEhFQURQSE9ORVMgQURWSVNFRCDigJQgRU5HSU5FIE5PSVNFIFBFQUtTIE9OVE8gVEhFIFNUUkFJR0hULiIsaW5jOlsiRjHCriBGYW56b25lICsgYWxsIE9hc2lzIGFyZWFzIiwiQWZ0ZXItUmFjZSBDb25jZXJ0cyBhdCBFdGloYWQgUGFyayAoR0EpIiwiMS1kYXkgWWFzIHRoZW1lLXBhcmsgYWNjZXNzIiwiRW50cnkgdG8gc2VsZWN0ZWQgbXVzZXVtcyJdLGlkZWFsOlsiVGVjaG5pY2FsIGNvcm5lcmluZyIsIkJyYWtpbmcgKyBvdmVydGFrZXMiLCJOZWFyIEV0aWhhZCBQYXJrIGNvbmNlcnRzIl19LGQzY2IyNThkMjllMzQwMGFhYTYwOWU3MWYyZmQ0ODRhX2N0Zzp7ZnJvbTozNzAwLHN0b2NrOiJpbiIsdXJsOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS9wcm9kdWN0L25vcnRoLXN0cmFpZ2h0LyIsc3VtOiJCZXNpZGUgdGhlIGxvbmdlc3Qgc3RyYWlnaHQg4oCUIGNhcnMgYXQgbWF4aW11bSB2ZWxvY2l0eSBtYWtpbmcgZGVjaXNpdmUgb3ZlcnRha2luZyBtb3Zlcy4iLHRpcDoiVElQIC8vIFdBVENIIEZPUiBTUEFSS1MgQVMgQ0FSUyBSSURFIFRIRSBLRVJCUyBBVCBGVUxMIFNQRUVELiIsaW5jOlsiRjHCriBGYW56b25lICsgYWxsIE9hc2lzIGFyZWFzIiwiQWZ0ZXItUmFjZSBDb25jZXJ0cyBhdCBFdGloYWQgUGFyayAoR0EpIiwiMS1kYXkgWWFzIHRoZW1lLXBhcmsgYWNjZXNzIiwiRW50cnkgdG8gc2VsZWN0ZWQgbXVzZXVtcyJdLGlkZWFsOlsiU3RyYWlnaHQtbGluZSBzcGVlZCIsIkZ1bGwtdGhyb3R0bGUgb3ZlcnRha2VzIiwiQ29uY2VydCBwcm94aW1pdHkiXX0sIjA5MGUxNjUyYmQyYTRmYmFiMzBjY2ZhYzk4YzZmYzNjX2N0ZyI6e2Zyb206NTIwMCxzdG9jazoiaW4iLHVybDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvcHJvZHVjdC93ZXN0LWdyYW5kc3RhbmQvIixzdW06IlRyYWNrc2lkZSBvbiB0aGUgbG9uZ2VzdCBzdHJhaWdodCDigJQgdG9wIHNwZWVkIGJlZm9yZSB0aGUgaGVhdnkgYnJha2luZyBwb2ludCBpbnRvIFR1cm5zIDbigJM3LiIsdGlwOiJUSVAgLy8gVEhFIEJJRyBNT1ZFUyBMQU5EIEFUIFRIRSBUNuKAk1Q3IEJSQUtJTkcgUE9JTlQsIERJUkVDVExZIElOIFZJRVcuIixpbmM6WyJGMcKuIEZhbnpvbmUgKyBhbGwgT2FzaXMgYXJlYXMiLCJBZnRlci1SYWNlIENvbmNlcnRzIGF0IEV0aWhhZCBQYXJrIChHQSkiLCIxLWRheSBZYXMgdGhlbWUtcGFyayBhY2Nlc3MiLCJFbnRyeSB0byBzZWxlY3RlZCBtdXNldW1zIl0saWRlYWw6WyJQdXJlIHNwZWVkIHpvbmVzIiwiT3ZlcnRha2luZyBhY3Rpb24iLCJNYXhpbXVtIHBhY2UiXX0sIjY0NDc5MjI3ZjdjODRhM2M4MjY1YTBlZjZjNTdiMzkyX2N0ZyI6e2Zyb206MzQ1MCxzdG9jazoiaW4iLHVybDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvcHJvZHVjdC93ZXN0LXN0cmFpZ2h0LyIsc3VtOiJBbG9uZyB0aGUgcnVuIHRvIFR1cm5zIDbigJM3IOKAlCBwcmVjaXNpb24gZHJpdmluZyBhbmQgd2hlZWwtdG8td2hlZWwgcmFjaW5nIGF0IHNwZWVkLiIsdGlwOiJUSVAgLy8gVFJBQ0sgVEhFIEJSQUtJTkcgTUFSS0VSUyDigJQgQVBFWCBQUkVDSVNJT04gQVQgVFVSTiA2LiIsaW5jOlsiRjHCriBGYW56b25lICsgYWxsIE9hc2lzIGFyZWFzIiwiQWZ0ZXItUmFjZSBDb25jZXJ0cyBhdCBFdGloYWQgUGFyayAoR0EpIiwiMS1kYXkgWWFzIHRoZW1lLXBhcmsgYWNjZXNzIiwiRW50cnkgdG8gc2VsZWN0ZWQgbXVzZXVtcyJdLGlkZWFsOlsiTGF0ZS1icmFraW5nIGFjdGlvbiIsIkhpZ2gtc3BlZWQgb3ZlcnRha2VzIiwiV2hlZWwtdG8td2hlZWwgcmFjaW5nIl19LGRkYTQ3NGU1N2M3MjRiZjc5NjA2YTZiYTMyZDI2MmQyX2N0Zzp7ZnJvbToxMjM5NSxzdG9jazoiaW4iLHVybDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvcHJvZHVjdC9zdW5zZXQtbG91bmdlLyIsc3VtOiJJbmRvb3IgbG91bmdlIGFuZCB0ZXJyYWNlIG92ZXIgVHVybiA1IOKAlCByYWNpbmcgYnkgZGF5LCBESi1sZWQgbG91bmdlIGVuZXJneSBhcyB0aGUgc3VuIGRyb3BzLiIsdGlwOiJUSVAgLy8gVEVSUkFDRSBBVCBMQVRFIEFGVEVSTk9PTiBGT1IgU1VOU0VUIFNIT1RTIE9WRVIgVEhFIENJUkNVSVQuIixpbmM6WyJMaXZlIGNvb2tpbmcgc3RhdGlvbnMgKyBmcmVlLWZsb3dpbmcgYmV2ZXJhZ2VzIiwiSW5kb29yIGxvdW5nZSArIHN1bnNldCB0ZXJyYWNlIiwiREotbGVkIGVudGVydGFpbm1lbnQiLCJGMcKuIEZhbnpvbmUgKyBhbGwgT2FzaXMgYXJlYXMiLCJBZnRlci1SYWNlIENvbmNlcnRzIGF0IEV0aWhhZCBQYXJrIChHQSkiLCIxLWRheSBZYXMgdGhlbWUtcGFyayBhY2Nlc3MiLCJFbnRyeSB0byBzZWxlY3RlZCBtdXNldW1zIl0saWRlYWw6WyJSYWNpbmcgd2l0aCBhIHBhcnR5IHZpYmUiLCJTdW5zZXQgKyBzb2NpYWwgZW5lcmd5IiwiTXVzaWMtbGVkIGhvc3BpdGFsaXR5Il19LGJkN2E5NDhhNGU2MjQxYWNhNmVjYzlmZjU3ZDhjMGY3X2N0Zzp7ZnJvbToxODAwLHN0b2NrOiJpbiIsdXJsOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS9wcm9kdWN0L2YxLWFidS1kaGFiaS1oaWxsLXRpY2tldC8iLHN1bToiTGFpZC1iYWNrIG9wZW4tYWlyIHZpZXdpbmcgYWNyb3NzIFR1cm5zIDLigJM2LCB3aXRoIHRoZSBmcmVlZG9tIHRvIHJvYW0gYmV0d2VlbiB2YW50YWdlIHBvaW50cy4iLHRpcDoiVElQIC8vIEFSUklWRSBFQVJMWSDigJQgVEhFIEJFU1QgU1BPVFMgT04gVEhFIEhJTEwgR08gRklSU1QuIixpbmM6WyJGMcKuIEZhbnpvbmUgKyBhbGwgT2FzaXMgYXJlYXMiLCJBZnRlci1SYWNlIENvbmNlcnRzIGF0IEV0aWhhZCBQYXJrIChHQSkiLCIxLWRheSBZYXMgdGhlbWUtcGFyayBhY2Nlc3MiLCJFbnRyeSB0byBzZWxlY3RlZCBtdXNldW1zIl0saWRlYWw6WyJSZWxheGVkIG91dGRvb3Igdmlld2luZyIsIlBhbm9yYW1pYyBtdWx0aS10dXJuIHZpZXdzIiwiRmFtaWx5IHBpY25pYyBzdHlsZSJdLG5vdGU6Ik1hbmRhdG9yeSAyLW5pZ2h0IEFidSBEaGFiaSBob3RlbCBzdGF5IGFwcGxpZXMgdG8gSGlsbCB0aWNrZXRzLiJ9fSxuPXtmYTM0OWFmYzUxODY0Y2FjYjk1YTM5OTU1ZDgyYjM3OV9jdGc6W3tkOiJodHRwczovL2Nkbi5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8xMC9mMS1tYXAtbWFpbi1ncmFuZHN0YW5kLXZpZXcuanBnIixjYXA6Ik1haW4gR3JhbmRzdGFuZCJ9LHtzcmM6IjIwMjYvMDcvMzEyOTktbWFpbl9ncmFuZHN0YW5kX3lhc19tYXJpbmEtN2ZmZWJmYzIwYTk1NTg0YTlkZGViODgxMTliZDQ4YmYtMS5qcGciLGNhcDoiR3JpZCBWaWV3In0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0wNS5qcGciLGNhcDoiUGFub3JhbWljIHZpZXcgb3ZlciB0aGUgc3RhcnQvZmluaXNoIHN0cmFpZ2h0In1dLCI4ZmY1OGZlYWZlNzA0YmUwYmQ3MDI1YWM3ZGMyODkxMV9jdGciOlt7c3JjOiIyMDI2LzA3L25vcnRoLWdyYW5kc3RhbmQtOTczMzEuanBnIixjYXA6Ik5vcnRoIEdyYW5kc3RhbmQifV0sIjA5MGUxNjUyYmQyYTRmYmFiMzBjY2ZhYzk4YzZmYzNjX2N0ZyI6W3tkOiJodHRwczovL2Nkbi5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8xMC9mMS1tYXAtd2VzdC1ncmFuZHN0YW5kLXZpZXcuanBnIixjYXA6Ildlc3QgR3JhbmRzdGFuZCJ9LHtkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMDYuanBnIixjYXA6IlRyYWNrc2lkZSB2aWV3In1dLGJkN2E5NDhhNGU2MjQxYWNhNmVjYzlmZjU3ZDhjMGY3X2N0Zzpbe2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0wMS5qcGciLGNhcDoiR2VuZXJhbCBhZG1pc3Npb24gbGF3biJ9XSxkZGE0NzRlNTdjNzI0YmY3OTYwNmE2YmEzMmQyNjJkMl9jdGc6W3tkOiJodHRwczovL2Nkbi5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8xMC9zdW5zZXQtbG91bmdlLWNvbGxhZ2UuanBnIixjYXA6IlN1bnNldCBMb3VuZ2UifSx7c3JjOiIyMDI1LzA1L3RhYl8yX2ltYWdlLTEuanBnIixjYXA6IlN1bnNldCBUZXJyYWNlIn1dLCI2NDQ3OTIyN2Y3Yzg0YTNjODI2NWEwZWY2YzU3YjM5Ml9jdGciOlt7ZDoiaHR0cHM6Ly9jZG4uZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMTAvZjEtbWFwLXdlc3Qtc3RyYWlnaHQtdmlldy5qcGciLGNhcDoiV2VzdCBTdHJhaWdodCJ9LHtkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMDQuanBnIixjYXA6IlVuZGVyIHRoZSBsaWdodHMifV0sZWJhNzk3ODEzZWZhNDUyNDk1ZjE2YTZmMTg5N2RkYzNfY3RnOlt7ZDoiaHR0cHM6Ly9jZG4uZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMTAvZjEtbWFwLXNvdXRoLWdyYW5kc3RhbmQtdmlldy5qcGciLGNhcDoiU291dGggR3JhbmRzdGFuZCJ9LHtkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMDguanBnIixjYXA6IlRyYWNrc2lkZSB2aWV3In1dLCI1MGEwNTY2ZjAwMzY0MjA2OTBlZjdkNzRkMTE2MjM4Nl9jdGciOlt7c3JjOiIyMDI0LzA5L3dlc3QtZ3JhbmRzdGFuZC1wcmVtaXVtLXZpZXcxLmF2aWYiLGNhcDoiUHJlbWl1bSBWaWV3In1dLCI5NTVlZjk4MWRiMjg0NTZiYjBhY2U4YTQ5NWFiZjk4Yl9jdGciOlt7ZDoiaHR0cHM6Ly9jZG4uZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMTAvZjEtbWFwLW5vcnRoLXN0cmFpZ2h0LXZpZXcuanBnIixjYXA6IllhcyBNYXJpbmEifV0sY2FiZWVhMjZiYzU4NGE1ZGIzMDY2NGNjYzRmY2E0YmFfY3RnOlt7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTExLmpwZyIsY2FwOiJUcmFja3NpZGUgdmlldyJ9LHtkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMTIuanBnIixjYXA6IlN1aXRlIGludGVyaW9yIn0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0xMy5qcGciLGNhcDoiU2hhbXMgU3VpdGUifSx7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTE0LmpwZyIsY2FwOiJTaGFtcyBTdWl0ZSJ9LHtkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMTUuanBnIixjYXA6IlNoYW1zIFN1aXRlIn1dLCI0MDVkZDNmZWVkNzU0YzNiOGZiN2Q1ZGJlMDA3MmExMF9jdGciOlt7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTEyLmpwZyIsY2FwOiJQcmVtaXVtIHN1aXRlIn1dLCI0MTVkZmViM2JmNzE0YTNmOGVjYzg3MmI3Y2ViODJlZV9jdGciOlt7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTE2LmpwZyIsY2FwOiJUcmFja3NpZGUgdmlldyJ9LHtkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMTcuanBnIixjYXA6IlN1aXRlIGludGVyaW9yIn1dLCI2ZjUzMzM5NjgyYWY0NTUxYmVmZWE4NzM0ZGZhNjEyYl9jdGciOlt7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTE4LmpwZyIsY2FwOiJUcmFja3NpZGUgdmlldyJ9LHtkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMTkuanBnIixjYXA6IlRlcnJhY2UifSx7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTIwLmpwZyIsY2FwOiJTdWl0ZSBpbnRlcmlvciJ9XSwiNjZiZTM0Njk5ZmNlNDJkOTkyNmQ4NTRlMGI3NWZiNzdfY3RnIjpbe2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0yMS5qcGciLGNhcDoiTG91bmdlIGFuZCB0ZXJyYWNlIn1dLGI4NTQxY2I4ZTI0MDRmZjk4MTJmZTgzZDMyNjI4Y2M2X2N0Zzpbe2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0yMi5qcGciLGNhcDoiTG91bmdlIGFuZCB0ZXJyYWNlIn1dLGQzY2IyNThkMjllMzQwMGFhYTYwOWU3MWYyZmQ0ODRhX2N0Zzpbe2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0yMy5qcGciLGNhcDoiQWVyaWFsIG92ZXIgdGhlIGJyYWtpbmcgem9uZSJ9LHtkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMjQuanBnIixjYXA6IkFlcmlhbCJ9XSwiODU0MDlkMWNjMWE5NDc5Njk0ODlmNGMwNWMxZTMyZDdfY3RnIjpbe2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0yNS5qcGciLGNhcDoiVHJhY2tzaWRlIn0se2Q6Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2VzcC1mMS0yNi5qcGciLGNhcDoiRGVjayJ9XSxhZmM2N2JkOTE0ODY0ODQ4OGMxNDgzNTNiYzY4OTdhMF9jdGc6W3tkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMjcuanBnIixjYXA6IlRyYWNrc2lkZSJ9LHtkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMjguanBnIixjYXA6IkRlY2sifV0sZjU1YjIwMjVlMzkzNDcxMTljNzNhYTMwZWJjYjU0NWJfY3RnOlt7ZDoiaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDgvZXNwLWYxLTI5LmpwZyIsY2FwOiJJbnRlcmlvciJ9LHtkOiJodHRwczovL3d3dy5lcy1zcG9ydC5hZS93cC1jb250ZW50L3VwbG9hZHMvMjAyNi8wOC9lc3AtZjEtMjQuanBnIixjYXA6IkFlcmlhbCJ9XX0saT17YmQ3YTk0OGE0ZTYyNDFhY2E2ZWNjOWZmNTdkOGMwZjdfY3RnOiJvdXRsaW5lIn0sbz17Z3JhbmRzdGFuZDoiR3JhbmRzdGFuZCIsbG91bmdlOiJMb3VuZ2UgJiBUZXJyYWNlIixzdWl0ZToiU3VpdGUiLGdhOiJHZW5lcmFsIEFkbWlzc2lvbiJ9LGM9e2dyYW5kc3RhbmQ6IkdSRCIsbG91bmdlOiJMTkciLHN1aXRlOiJTVEUiLGdhOiJHQSJ9LHI9Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL3dwLWNvbnRlbnQvdXBsb2Fkcy8iLHM9WyJmYTM0OWFmYzUxODY0Y2FjYjk1YTM5OTU1ZDgyYjM3OV9jdGciLCI5NTVlZjk4MWRiMjg0NTZiYjBhY2U4YTQ5NWFiZjk4Yl9jdGciLCJiZDdhOTQ4YTRlNjI0MWFjYTZlY2M5ZmY1N2Q4YzBmN19jdGciLCJmMjJkZWNhM2Q0Mzc0NjE0YjMyNGEwOGM0NTgwOGJkMF9jdGciLCJhYTFhYTA3NzMzYzk0ZTFiODk3ZmUwMjU0MTA2YmE5OF9jdGciXSxkPWZ1bmN0aW9uKGUpe3JldHVybiJBRUQgIitlLnRvTG9jYWxlU3RyaW5nKCJlbi1VUyIpfSxsPXdpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkiKS5tYXRjaGVzLHU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixwPS8oWzAtOWEtZl17MzJ9X2N0ZykvZyxmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYXBXcmFwIiksaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFwU3RhdHVzIik7aWYoZil7dmFyIG09ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwVGllciIpLGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwQ29kZSIpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwVGl0bGUiKSx2PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cERlc2MiKSx5PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cE1lZGlhIiksdz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBTaG90cyIpLEU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwUGtnIiksUz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBTdG9jayIpLEw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwUHJpY2UiKSxrPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cFN1bSIpLHg9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInpwVGlwIiksQT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBJbmMiKSxUPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ6cElkZWFsIiksQz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBOb3RlIiksST1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBDdGFCb29rIiksQj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBDdGFFbnF1aXJlIiksTT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgienBRdWlja0xpbmtzIiksaG90ZWxDdGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiW2RhdGEtZXMtaG90ZWwtY3RhXSIpLF89bnVsbCxQPW51bGwsTj1udWxsOyFmdW5jdGlvbigpe3ZhciBlPXt9O09iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIG49dFthXTtlW24udGllcl09KGVbbi50aWVyXXx8MCkrMSxuLmNvZGU9KGNbbi50aWVyXXx8IlpOIikrIi0iK1N0cmluZyhlW24udGllcl0pLnBhZFN0YXJ0KDIsIjAiKX0pO3ZhciBhPU9iamVjdC5rZXlzKHQpLmxlbmd0aDtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjbWFwRmlsdGVycyBbZGF0YS1jb3VudF0iKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPXQuZGF0YXNldC5jb3VudDt0LnRleHRDb250ZW50PVN0cmluZygiYWxsIj09PW4/YTplW25dfHwwKS5wYWRTdGFydCgyLCIwIil9KX0oKSx5LnF1ZXJ5U2VsZWN0b3IoIi5wcmV2IikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dy5zY3JvbGxCeSh7bGVmdDotdy5jbGllbnRXaWR0aCxiZWhhdmlvcjpsPyJhdXRvIjoic21vb3RoIn0pfSkseS5xdWVyeVNlbGVjdG9yKCIubmV4dCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3cuc2Nyb2xsQnkoe2xlZnQ6dy5jbGllbnRXaWR0aCxiZWhhdmlvcjpsPyJhdXRvIjoic21vb3RoIn0pfSkscy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKHRbZV0pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO2EudHlwZT0iYnV0dG9uIixhLnRleHRDb250ZW50PXRbZV0ubmFtZSxhLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3ZhciBhPU4mJk4ucXVlcnlTZWxlY3RvcignW2RhdGEtZXMtaWQ9IicrZSsnIl0nKTtLKE9iamVjdC5hc3NpZ24oe2lkOmV9LHRbZV0pLGF8fG51bGwpfSksTS5hcHBlbmRDaGlsZChhKX19KSxkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucGljay1jYXJkW2RhdGEtem9uZV0iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGE9ZS5kYXRhc2V0LnpvbmUudG9Mb3dlckNhc2UoKSxuPW51bGw7aWYoT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihlKXtufHwwPT09dFtlXS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihhKSYmKG49ZSl9KSxuKXt2YXIgaT1OJiZOLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWVzLWlkPSInK24rJyJdJyk7SyhPYmplY3QuYXNzaWduKHtpZDpufSx0W25dKSxpfHxudWxsKSxmLnNjcm9sbEludG9WaWV3KHtiZWhhdmlvcjpsPyJhdXRvIjoic21vb3RoIixibG9jazoiY2VudGVyIn0pfX0pfSksZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiI21hcEZpbHRlcnMgLm1hcC1jaGlwIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIiNtYXBGaWx0ZXJzIC5tYXAtY2hpcCIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKX0pLGUuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIik7dmFyIHQ9ZS5kYXRhc2V0LnRpZXI7Zi5xdWVyeVNlbGVjdG9yQWxsKCIuZXMtem9uZSIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIGE9VyhlKTtlLmNsYXNzTGlzdC50b2dnbGUoImVzLWRpbSIsImFsbCIhPT10JiYoIWF8fGEudGllciE9PXQpKX0pLFAmJl8mJihQLnN0eWxlLmRpc3BsYXk9Xy5jbGFzc0xpc3QuY29udGFpbnMoImVzLWRpbSIpPyJub25lIjoiIil9KX0pO3ZhciBxPW51bGwsTz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiem9uZVBhbmVsIiksUj1PLnBhcmVudEVsZW1lbnQ7IlJlc2l6ZU9ic2VydmVyImluIHdpbmRvdz9uZXcgUmVzaXplT2JzZXJ2ZXIoWikub2JzZXJ2ZShmKTp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixaKTt2YXIgej13aW5kb3cubWF0Y2hNZWRpYSgiKG1heC13aWR0aDogOTgwcHgpIiksSD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiem9uZU1vZGFsIiksaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiem1Ib3N0IiksRz1udWxsO0gucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtY2xvc2Utem1dIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixYKX0pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZ1bmN0aW9uKGUpeyJFc2NhcGUiIT09ZS5rZXl8fEguaGlkZGVufHxYKCl9KSxJJiZJLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixYKSxCJiZCLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixYKTt2YXIgRj1mdW5jdGlvbigpe0guaGlkZGVufHxYKCksUSgpfTt6LmFkZEV2ZW50TGlzdGVuZXI/ei5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLEYpOnouYWRkTGlzdGVuZXImJnouYWRkTGlzdGVuZXIoRiksUSgpLGZ1bmN0aW9uIHQoKXtpZighaCl7cmV0dXJufWguaW5uZXJIVE1MPSI8c3Bhbj5Mb2FkaW5nIGNpcmN1aXQgZ2VvbWV0cnk8L3NwYW4+IixmZXRjaChlKS50aGVuKGZ1bmN0aW9uKGUpe2lmKCFlLm9rKXRocm93IG5ldyBFcnJvcigiSFRUUCAiK2Uuc3RhdHVzKTtyZXR1cm4gZS50ZXh0KCl9KS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QuaW5uZXJIVE1MPWUucmVwbGFjZSgvPFw/eG1sW1xzXFNdKj9cPz4vZywiIikucmVwbGFjZSgvPCFET0NUWVBFW1xzXFNdKj8+L2dpLCIiKTt2YXIgYT10LnF1ZXJ5U2VsZWN0b3IoInN2ZyIpO2lmKCFhKXRocm93IG5ldyBFcnJvcigiTm8gU1ZHIGluIHJlc3BvbnNlIik7aC5yZW1vdmUoKSxmLmluc2VydEJlZm9yZShhLGYuZmlyc3RDaGlsZCksSihhKSxaKCk7dmFyIG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1hcFNjYW4iKTtuJiYhbCYmKG4uY2xhc3NMaXN0LmFkZCgicnVuIiksbi5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLGZ1bmN0aW9uKCl7bi5jbGFzc0xpc3QucmVtb3ZlKCJydW4iKX0se29uY2U6ITB9KSl9KS5jYXRjaChmdW5jdGlvbigpe2guaW5uZXJIVE1MPSI8c3Bhbj5UaGUgY2lyY3VpdCBtYXAgY291bGQgbm90IGJlIGxvYWRlZC4gQ2hlY2sgdGhlIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi48L3NwYW4+Ijt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTtlLnR5cGU9ImJ1dHRvbiIsZS50ZXh0Q29udGVudD0iUmVsb2FkIHRoZSBtYXAiLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHQpLGguYXBwZW5kQ2hpbGQoZSl9KX0oKX1mdW5jdGlvbiBEKGUpe3ZhciB0LGE9KGUuaWR8fCIiKSsiICIrKGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIiksbj1bXTtmb3IocC5sYXN0SW5kZXg9MDt0PXAuZXhlYyhhKTspbi5pbmRleE9mKHRbMV0pPDAmJm4ucHVzaCh0WzFdKTtyZXR1cm4gbn1mdW5jdGlvbiBXKGUpe2Zvcih2YXIgYT1EKGUpLG49MDtuPGEubGVuZ3RoO24rKylpZih0W2Fbbl1dKXJldHVybiBPYmplY3QuYXNzaWduKHtpZDphW25dfSx0W2Fbbl1dKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBZKGUpe3RyeXtpZighUClyZXR1cm47aWYoIWUpcmV0dXJuIHZvaWQoUC5zdHlsZS5kaXNwbGF5PSJub25lIik7dmFyIHQ9UC5vd25lclNWR0VsZW1lbnQsYT10LnZpZXdCb3guYmFzZVZhbCxuPWZ1bmN0aW9uKGUsdCl7dmFyIGE9dC5nZXRCQm94KCksbj1lLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKS5tdWx0aXBseSh0LmdldFNjcmVlbkNUTSgpKSxpPVtbYS54LGEueV0sW2EueCthLndpZHRoLGEueV0sW2EueCxhLnkrYS5oZWlnaHRdLFthLngrYS53aWR0aCxhLnkrYS5oZWlnaHRdXS5tYXAoZnVuY3Rpb24odCl7dmFyIGE9ZS5jcmVhdGVTVkdQb2ludCgpO3JldHVybiBhLng9dFswXSxhLnk9dFsxXSxhLm1hdHJpeFRyYW5zZm9ybShuKX0pLG89aS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUueH0pLGM9aS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUueX0pO3JldHVybnt4Ok1hdGgubWluLmFwcGx5KDAsbykseTpNYXRoLm1pbi5hcHBseSgwLGMpLHc6TWF0aC5tYXguYXBwbHkoMCxvKS1NYXRoLm1pbi5hcHBseSgwLG8pLGg6TWF0aC5tYXguYXBwbHkoMCxjKS1NYXRoLm1pbi5hcHBseSgwLGMpfX0odCxlKSxpPS4wMDYqKGEmJmEud2lkdGg/YS53aWR0aDo5MDApLG89bi54LWksYz1uLnktaSxyPW4udysyKmkscz1uLmgrMippLGQ9LjMqTWF0aC5taW4ocixzKTtQLmlubmVySFRNTD0nPHBhdGggZD0iTScrbysiICIrKGMrZCkrIiBWIitjKyIgSCIrKG8rZCkrIiBNIisobytyLWQpKyIgIitjKyIgSCIrKG8rcikrIiBWIisoYytkKSsiIE0iKyhvK3IpKyIgIisoYytzLWQpKyIgViIrKGMrcykrIiBIIisobytyLWQpKyIgTSIrKG8rZCkrIiAiKyhjK3MpKyIgSCIrbysiIFYiKyhjK3MtZCkrJyIgZmlsbD0ibm9uZSIvPjxjaXJjbGUgY3g9IicrKG8rci8yKSsnIiBjeT0iJysoYytzLzIpKyciIHI9IicrLjUqaSsnIi8+JyxQLnN0eWxlLmRpc3BsYXk9IiIsbHx8KFAuY2xhc3NMaXN0LnJlbW92ZSgib24iKSxQLmdldEJCb3goKSxQLmNsYXNzTGlzdC5hZGQoIm9uIikpfWNhdGNoKHUpe1AmJihQLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX19ZnVuY3Rpb24gVihlKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZi1jYXQiKSxhPSJBbm90aGVyIHpvbmUiO2lmKHQpZm9yKHZhciBuPTA7bjx0Lm9wdGlvbnMubGVuZ3RoO24rKylpZih0Lm9wdGlvbnNbbl0udGV4dD09PWUpe2E9ZTticmVha31CJiZCLnNldEF0dHJpYnV0ZSgiZGF0YS1jYXQiLGEpfWZ1bmN0aW9uIGVzRUVCY2F0KGUpe3ZhciBhdj13aW5kb3cuRUVCX2F2YWlsYWJpbGl0eSYmd2luZG93LkVFQl9hdmFpbGFiaWxpdHkoKSxubT1mdW5jdGlvbihzKXtyZXR1cm4gU3RyaW5nKHN8fCIiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1wrXHMqaG90ZWxccyokLywiIikucmVwbGFjZSgvW15hLXowLTldL2csIiIpfSxvdXQ9bnVsbDtpZihhdiYmYXYuY2F0ZWdvcmllcylPYmplY3Qua2V5cyhhdi5jYXRlZ29yaWVzKS5mb3JFYWNoKGZ1bmN0aW9uKGspe3ZhciBjPWF2LmNhdGVnb3JpZXNba107IW91dCYmbm0oYy5uYW1lKT09PW5tKGUubmFtZSkmJihvdXQ9e2lkOmssYzpjfSl9KTtyZXR1cm4gb3V0fWZ1bmN0aW9uIGVzRUVCY3RhKGUsdCxuLGQpe3ZhciBjYXQ9ZXNFRUJjYXQoZSksY2lkPWNhdCYmY2F0LmlkLGM9Y2F0JiZjYXQuYyxlbnE9Imh0dHBzOi8vd3d3LmVzLXNwb3J0LmFlL2NvbnRhY3QvP2VlYl9ldmVudD1mMWFkMjYmZWViX3JlYXNvbj1vbi1yZXF1ZXN0IisoY2lkPyImZWViX2NhdGVnb3J5PSIrY2lkOiIiKTtpZihJKXtJLm9uY2xpY2s9bnVsbDtJLmhpZGRlbj0hMDtJLnJlbW92ZUF0dHJpYnV0ZSgiaHJlZiIpO31pZighQilyZXR1cm47aWYoZSYmZS5pZD09PSJmYTM0OWFmYzUxODY0Y2FjYjk1YTM5OTU1ZDgyYjM3OV9jdGciKXtCLmhpZGRlbj0hMDtyZXR1cm59Qi5oaWRkZW49ITE7Qi50ZXh0Q29udGVudD0iRW5xdWlyZSBhYm91dCB0aGlzIHpvbmUiO0IuaHJlZj0oYyYmYy5lbnF1aXJ5KXx8ZW5xfWZ1bmN0aW9uIFUoZSl7dmFyIHQ9ZSYmYVtlLmlkXTtpZihob3RlbEN0YSlob3RlbEN0YS5oaWRkZW49IShlJiZlLmlkPT09ImZhMzQ5YWZjNTE4NjRjYWNiOTVhMzk5NTVkODJiMzc5X2N0ZyIpO2lmKCF0KXJldHVybiBFLmhpZGRlbj0hMCxJJiYoSS5oaWRkZW49ITApLEImJihCLmhpZGRlbj0hMSxCLnRleHRDb250ZW50PSJFbnF1aXJlIGFib3V0IHRoaXMgem9uZSIpLHZvaWQgVihlP2UubmFtZToiIik7RS5oaWRkZW49ITE7dmFyIGVjPWVzRUVCY2F0KGUpLHBmPShlJiZlLmlkPT09ImZhMzQ5YWZjNTE4NjRjYWNiOTVhMzk5NTVkODJiMzc5X2N0ZyIpPzYxMDA6KGVjJiZlYy5jLmZyb20/ZWMuYy5mcm9tOnQuZnJvbSksbj0ib3V0Ij09PXQuc3RvY2s7ZWMmJiFuJiYobj0ic29sZC1vdXQiPT09ZWMuYy5zdGF0ZSk7Uy50ZXh0Q29udGVudD1uPyJTb2xkIG91dCI6IkF2YWlsYWJsZSIsUy5jbGFzc0xpc3QudG9nZ2xlKCJvdXQiLG4pLGZ1bmN0aW9uKGUpe3EmJmNhbmNlbEFuaW1hdGlvbkZyYW1lKHEpO2lmKGwpcmV0dXJuIHZvaWQoTC50ZXh0Q29udGVudD1kKGUpKTt2YXIgdD1udWxsLGE9NjAwLG49ZnVuY3Rpb24oZSl7cmV0dXJuIDEtTWF0aC5wb3coMS1lLDMpfSxpPWZ1bmN0aW9uKG8pe251bGw9PT10JiYodD1vKTt2YXIgYz1NYXRoLm1pbigxLChvLXQpL2EpO0wudGV4dENvbnRlbnQ9ZChNYXRoLnJvdW5kKGUqbihjKSkpLGM8MT9xPXJlcXVlc3RBbmltYXRpb25GcmFtZShpKTooTC50ZXh0Q29udGVudD1kKGUpLHE9bnVsbCl9O3E9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGkpfShwZiksay50ZXh0Q29udGVudD10LnN1bSx4LnRleHRDb250ZW50PSh0LnRpcHx8IiIpLnJlcGxhY2UoL15USVBccypcL1wvXHMqL2ksIlRpcDogIiksQS5pbm5lckhUTUw9IiIsKHQuaW5jfHxbXSkuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LnRleHRDb250ZW50PWUsQS5hcHBlbmRDaGlsZCh0KX0pLFQuaW5uZXJIVE1MPSIiLCh0LmlkZWFsfHxbXSkuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7dC50ZXh0Q29udGVudD1lLFQuYXBwZW5kQ2hpbGQodCl9KSxDLmhpZGRlbj0hdC5ub3RlLHQubm90ZSYmKEMudGV4dENvbnRlbnQ9dC5ub3RlKSxlc0VFQmN0YShlLHQsbixkKX1mdW5jdGlvbiBLKGUsdCl7XyYmXy5jbGFzc0xpc3QucmVtb3ZlKCJlcy1hY3RpdmUiKSwoXz10fHxudWxsKSYmXy5jbGFzc0xpc3QuYWRkKCJlcy1hY3RpdmUiKSxZKF8pLG0udGV4dENvbnRlbnQ9b1tlLnRpZXJdfHwiWm9uZSIsZy50ZXh0Q29udGVudD1lLmNvZGUsYi50ZXh0Q29udGVudD1lLm5hbWUsdi50ZXh0Q29udGVudD1lLmRlc2MsZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmbltlLmlkXTtpZih3LmlubmVySFRNTD0iIix3LnNjcm9sbExlZnQ9MCx0JiZ0Lmxlbmd0aCl7dmFyIGE9MDt0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bi5jbGFzc05hbWU9InpwLXNob3QiO3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpO2lmKGkubG9hZGluZz0ibGF6eSIsaS5kZWNvZGluZz0iYXN5bmMiLGkuYWx0PWUubmFtZSsodC5jYXA/IiwgIit0LmNhcDoiIiksaS5zcmM9dC5kP3QuZDovXihkYXRhOnxodHRwcz86KS8udGVzdCh0LnNyYyk/dC5zcmM6cit0LnNyYyxpLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe24ucmVtb3ZlKCksdy5xdWVyeVNlbGVjdG9yKCIuenAtc2hvdCIpfHwoeS5oaWRkZW49ITApfSksbi5hcHBlbmRDaGlsZChpKSx0LmNhcCl7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7by5jbGFzc05hbWU9ImNhcCIsby50ZXh0Q29udGVudD10LmNhcCxuLmFwcGVuZENoaWxkKG8pfXcuYXBwZW5kQ2hpbGQobiksYSsrfSkseS5oaWRkZW49MD09PWF9ZWxzZSB5LmhpZGRlbj0hMH0oZSksVShlKTt2YXIgYSxpPU8ucXVlcnlTZWxlY3RvcigiLnpwLXNjcm9sbCIpO2kmJihpLnNjcm9sbFRvcD0wLGx8fChpLmNsYXNzTGlzdC5yZW1vdmUoInN3YXAiKSxpLm9mZnNldFdpZHRoLGkuY2xhc3NMaXN0LmFkZCgic3dhcCIpKSksei5tYXRjaGVzJiYoUSgpLGNsZWFyVGltZW91dChHKSxILmNsYXNzTGlzdC5yZW1vdmUoImlzLWNsb3NpbmciKSxILmhpZGRlbj0hMSwoYT13aW5kb3cuaW5uZXJXaWR0aC1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpPjAmJihkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1hKyJweCIpLGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsSC5vZmZzZXRXaWR0aCxILmNsYXNzTGlzdC5hZGQoImlzLW9wZW4iKSl9ZnVuY3Rpb24gJChlKXt2YXIgdD1lLnZpZXdCb3gmJmUudmlld0JveC5iYXNlVmFsOyFmdW5jdGlvbihlLHQpe3RyeXt2YXIgYT1bIkdFTkVSQUwgQURNSVNTSU9OIiwiR0VORVJBTCIsIkFETUlTU0lPTiIsIkdSQU5EU1RBTkRTIiwiR1JBTkRTVEFORCIsIkhPU1BJVEFMSVRZIiwiTE9VTkdFUyIsIlNVSVRFUyIsIkxFR0VORCIsIktFWSJdLG49ZnVuY3Rpb24oZSl7cmV0dXJuIGEuaW5kZXhPZihmdW5jdGlvbihlKXtyZXR1cm4oZXx8IiIpLnJlcGxhY2UoL1xzKy9nLCIgIikudHJpbSgpLnRvVXBwZXJDYXNlKCl9KGUpKT49MH0saT10JiZ0LndpZHRoP3Qud2lkdGg6OTAwO2UucXVlcnlTZWxlY3RvckFsbCgidGV4dCwgdHNwYW4iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKG4oZS50ZXh0Q29udGVudCkpe3ZhciB0PWUuY2xvc2VzdCgidGV4dCIpfHxlO3Quc3R5bGUuZGlzcGxheT0ibm9uZSI7dmFyIGE9dC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO2EmJi9eKHJlY3R8cGF0aHxwb2x5Z29ufGNpcmNsZSkkL2kudGVzdChhLnRhZ05hbWUpJiYoYS5zdHlsZS5kaXNwbGF5PSJub25lIil9fSksZS5xdWVyeVNlbGVjdG9yQWxsKCJnIikuZm9yRWFjaChmdW5jdGlvbihlKXtpZigiZXMtbG9jayIhPT1lLmlkKXt2YXIgdD1lLnF1ZXJ5U2VsZWN0b3JBbGwoInRleHQiKTtpZih0Lmxlbmd0aCl7dmFyIGE9QXJyYXkucHJvdG90eXBlLmV2ZXJ5LmNhbGwodCxmdW5jdGlvbihlKXtyZXR1cm4gbihlLnRleHRDb250ZW50KX0pLGk9ZS5xdWVyeVNlbGVjdG9yKCdbY2xhc3MqPSJfY3RnIl0nKXx8L19jdGcvLnRlc3QoZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKTthJiYhaSYmKGUuc3R5bGUuZGlzcGxheT0ibm9uZSIpfX19KSxlLnF1ZXJ5U2VsZWN0b3JBbGwoInJlY3QsIHBhdGgsIHBvbHlnb24sIGNpcmNsZSIpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoIWUuY2xvc2VzdCgnW2NsYXNzKj0iX2N0ZyJdJykmJiFlLmNsb3Nlc3QoImRlZnMiKSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiO2lmKCEvdHJhY2stfGN1cnZlLXxmbGFnLXxlcy16b25lLy50ZXN0KHQpKXRyeXt2YXIgYT1lLmdldEJCb3goKTtpZihhLndpZHRoPj0uMDM1Kml8fGEuaGVpZ2h0Pj0uMDM1KmkpcmV0dXJuO3ZhciBuPShnZXRDb21wdXRlZFN0eWxlKGUpLmZpbGx8fCIiKS5tYXRjaCgvcmdiYT9cKChcZCspLFxzKihcZCspLFxzKihcZCspLyk7aWYoIW4pcmV0dXJuOy4yMTI2Km5bMV0rLjcxNTIqblsyXSsuMDcyMipuWzNdPDQ4JiYoZS5zdHlsZS5kaXNwbGF5PSJub25lIil9Y2F0Y2gobyl7fX19KX1jYXRjaChvKXt9fShlLHQpO3RyeXt2YXIgYT1lLmdldEJCb3goKTtpZihhJiZhLndpZHRoPjUwJiZhLmhlaWdodD41MCl7dmFyIG49LjAyNSphLndpZHRoLGk9LjA0NSphLmhlaWdodDtlLnNldEF0dHJpYnV0ZSgidmlld0JveCIsYS54LW4rIiAiKyhhLnktaSkrIiAiKyhhLndpZHRoKzIqbikrIiAiKyhhLmhlaWdodCsyKmkpKSx0PWUudmlld0JveC5iYXNlVmFsfX1jYXRjaChyKXt9dmFyIG89TWF0aC5tYXgoNCwodCYmdC53aWR0aD90LndpZHRoOjkwMCkvMTYwKTtlLnN0eWxlLnNldFByb3BlcnR5KCItLWhhdGNoU2hpZnQiLC44Km8rInB4Iik7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHUsImRlZnMiKTtjLmlubmVySFRNTD0nPHBhdHRlcm4gaWQ9ImVzSGF0Y2giIHdpZHRoPSInK28rJyIgaGVpZ2h0PSInK28rJyIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgcGF0dGVyblRyYW5zZm9ybT0icm90YXRlKDQ1KSI+PHJlY3Qgd2lkdGg9IicrbysnIiBoZWlnaHQ9IicrbysnIiBmaWxsPSJyZ2JhKDIzNSwxODAsNzAsMC4yMCkiLz48bGluZSB4MT0iMCIgeTE9IjAiIHgyPSIwIiB5Mj0iJytvKyciIHN0cm9rZT0icmdiYSgyMzUsMTgwLDcwLDAuNTUpIiBzdHJva2Utd2lkdGg9IicrLjE4Km8rJyIvPjwvcGF0dGVybj48cGF0dGVybiBpZD0iZXNIYXRjaEhvdCIgd2lkdGg9IicrLjgqbysnIiBoZWlnaHQ9IicrLjgqbysnIiBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBwYXR0ZXJuVHJhbnNmb3JtPSJyb3RhdGUoNDUpIj48cmVjdCB3aWR0aD0iJysuOCpvKyciIGhlaWdodD0iJysuOCpvKyciIGZpbGw9InJnYmEoMjM1LDE4MCw3MCwwLjM0KSIvPjxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSInKy44Km8rJyIgc3Ryb2tlPSJyZ2JhKDIzNSwxODAsNzAsMC45NSkiIHN0cm9rZS13aWR0aD0iJysuMjIqbysnIi8+PC9wYXR0ZXJuPicsZS5pbnNlcnRCZWZvcmUoYyxlLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIEooZSl7ZS5jbGFzc0xpc3QuYWRkKCJ2ZW51ZSIpLGUucmVtb3ZlQXR0cmlidXRlKCJ3aWR0aCIpLGUucmVtb3ZlQXR0cmlidXRlKCJoZWlnaHQiKSwkKGUpO3ZhciBuPSJwYXRoLHBvbHlnb24scmVjdCxjaXJjbGUiLG89QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGUucXVlcnlTZWxlY3RvckFsbCgiKiIpLGZ1bmN0aW9uKGUpe2lmKCFEKGUpLmxlbmd0aClyZXR1cm4hMTt2YXIgdD1lLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iZyI9PT10PyEhZS5xdWVyeVNlbGVjdG9yKG4pOm4uaW5kZXhPZih0KT49MH0pLGM9by5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuImciPT09ZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkmJiFvLnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIHQhPT1lJiZlLmNvbnRhaW5zKHQpJiZEKHQpLmpvaW4oKSE9PUQoZSkuam9pbigpfSl9KSxyPWMuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFjLnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIHQhPT1lJiZ0LmNvbnRhaW5zKGUpfSl9KSxzPXIuY29uY2F0KG8uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiJnIiE9PWUudGFnTmFtZS50b0xvd2VyQ2FzZSgpJiYhci5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNvbnRhaW5zKGUpfSl9KSk7ZnVuY3Rpb24gZChlLHQpe2UuY2xhc3NMaXN0LmFkZCgiZXMtem9uZSIpLHQmJihlLmRhdGFzZXQuZXNJZD10LmlkLGFbdC5pZF0mJmUuY2xhc3NMaXN0LmFkZCgiZXMtcGtnIiksIm91dGxpbmUiPT09aVt0LmlkXSYmZS5jbGFzc0xpc3QuYWRkKCJlcy1vdXRsaW5lIiksZS5zZXRBdHRyaWJ1dGUoInJvbGUiLCJidXR0b24iKSxlLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCIwIiksZS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLHQubmFtZSsiLCAiK3QuY29kZSksZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCksSyh0LGUpfSksZS5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihhKXsiRW50ZXIiIT09YS5rZXkmJiIgIiE9PWEua2V5fHwoYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCksSyh0LGUpKX0pKX1zLmZvckVhY2goZnVuY3Rpb24oZSl7ZChlLFcoZSkpfSk7dmFyIGw9e307cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe0QoZSkuZm9yRWFjaChmdW5jdGlvbihlKXtsW2VdPSEwfSl9KSxPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCFsW2VdKXt2YXIgYT1vLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gRCh0KS5pbmRleE9mKGUpPj0wfSk7YS5sZW5ndGgmJmQoYVthLmxlbmd0aC0xXSxPYmplY3QuYXNzaWduKHtpZDplfSx0W2VdKSl9fSksTj1lLFA9ZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHUsImciKTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGUoImlkIiwiZXMtbG9jayIpLHQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZS5hcHBlbmRDaGlsZCh0KSx0fShlKX1mdW5jdGlvbiBaKCl7ei5tYXRjaGVzfHxPLnBhcmVudEVsZW1lbnQhPT1SP08uc3R5bGUuaGVpZ2h0PSIiOk8uc3R5bGUuaGVpZ2h0PWYub2Zmc2V0SGVpZ2h0KyJweCJ9ZnVuY3Rpb24gUSgpe3oubWF0Y2hlcz9PLnBhcmVudEVsZW1lbnQhPT1qJiZqLmFwcGVuZENoaWxkKE8pOihPLnBhcmVudEVsZW1lbnQhPT1SJiZSLmFwcGVuZENoaWxkKE8pLFooKSl9ZnVuY3Rpb24gWCgpe0guaGlkZGVufHwoSC5jbGFzc0xpc3QucmVtb3ZlKCJpcy1vcGVuIiksSC5jbGFzc0xpc3QuYWRkKCJpcy1jbG9zaW5nIiksY2xlYXJUaW1lb3V0KEcpLEc9c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBlO0guaGlkZGVuPSEwLEguY2xhc3NMaXN0LnJlbW92ZSgiaXMtY2xvc2luZyIpLChlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZmlNb2RhbCIpKSYmIWUuaGlkZGVufHwoZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz0iIixkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD0iIil9LGw/MDoyNjApKX19KCksZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImYtY2F0Iik7ZSYmZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtY2F0XSIpLmZvckVhY2goZnVuY3Rpb24odCl7dC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtmb3IodmFyIGE9dC5nZXRBdHRyaWJ1dGUoImRhdGEtY2F0Iiksbj0wO248ZS5vcHRpb25zLmxlbmd0aDtuKyspaWYoZS5vcHRpb25zW25dLnRleHQ9PT1hKXJldHVybiB2b2lkKGUuc2VsZWN0ZWRJbmRleD1uKX0pfSl9KCksZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGU9d2luZG93Lm1hdGNoTWVkaWEmJndpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSIpLm1hdGNoZXMsdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuc3RhdHMgLnN0YXQgLm4iKSk7aWYodC5sZW5ndGgmJiFlJiYiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiaW4gd2luZG93KXt2YXIgYT1mdW5jdGlvbihlKXt2YXIgdD1lLnRleHRDb250ZW50LnRyaW0oKSxhPXQubWF0Y2goL14oXGQrKShLP1wrPykkLyk7aWYoYSl7dmFyIG49cGFyc2VJbnQoYVsxXSwxMCksaT1hWzJdfHwiIixvPWFbMV0ubGVuZ3RoLGM9bnVsbCxyPWZ1bmN0aW9uKGEpe251bGw9PT1jJiYoYz1hKTtmb3IodmFyIHMsZD1NYXRoLm1pbigxLChhLWMpLzE0MDApLGw9TWF0aC5yb3VuZChuKihzPWQsMS1NYXRoLnBvdygxLXMsMykpKSx1PVN0cmluZyhsKTt1Lmxlbmd0aDxvOyl1PSIwIit1O2UudGV4dENvbnRlbnQ9dStpLGQ8MT9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocik6ZS50ZXh0Q29udGVudD10fTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUocil9fSxuPW5ldyBXZWFrU2V0LGk9bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGUpe2UuZm9yRWFjaChmdW5jdGlvbihlKXtlLmlzSW50ZXJzZWN0aW5nJiYhbi5oYXMoZS50YXJnZXQpJiYobi5hZGQoZS50YXJnZXQpLGEoZS50YXJnZXQpLGkudW5vYnNlcnZlKGUudGFyZ2V0KSl9KX0se3RocmVzaG9sZDouNX0pO3QuZm9yRWFjaChmdW5jdGlvbihlKXtpLm9ic2VydmUoZSl9KX19KCksZnVuY3Rpb24oKXtpZigoIXdpbmRvdy5tYXRjaE1lZGlhfHwhd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIikubWF0Y2hlcykmJiJJbnRlcnNlY3Rpb25PYnNlcnZlciJpbiB3aW5kb3cpe2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCJtbyIpO3ZhciBlPVsiLnN0YWNrID4gLml0ZW0iLCIuYWNjLWl0ZW0iLCIuZmFxLWl0ZW0iLCIuYm91dCIsIi52c3RvcnkiLCIudGtib3giLCIuYWItZnJhbWUiLCIuY21wIHRib2R5IHRkIiwiLmNtcCB0aGVhZCB0aCIsIi50YXBlLWNlbGwiLCIudnMtcm93IiwiLnZlbnVlLXNwZWNzID4gKiIsIi56cC10aWVyIiwiLnRrZ3JpZCB0ZCIsIi5zdGF0cyA+IC5zdGF0IiwiLnN0YXRzID4gLnN0IiwiLnZpdGFscyA+IC52aXRhbCIsIi5oZXJvLW1ldGEgPiAuaG0iLCIudGllcnMgPiAudGllciIsIi52Z3JpZCA+IC52YmxvY2siLCIua2MtY2FyZCIsIi5hYi1zcGVjIiwiLmluYy1saXN0ID4gbGkiLCIuYXJ0cyA+IC5hcnQiLCIuZm9yayA+IC5yb3V0ZSIsIi5jYXRhbG9ndWUgLm5jYXJkIiwiLm9jYXJkIiwiLnBjYXJkIiwiLmJjYXJkIiwiLnBjYXJkcCIsIi5maXZldy1ncmlkID4gKiIsIi5sb2dvcyA+IC5sb2dvIiwiLmVzbS1iYW5kIiwiLm1hcC1jaGlwIiwiLnRhcGUtZ3JpZCA+IC50YXBlLWNlbGwiLCIuZ2NhcmQiXSx0PWUuam9pbigiLCIpO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLW1vXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5tYXRjaGVzKHQpfHxlLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1tbyIpfSk7dmFyIGE9W107aWYoZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0LG49bnVsbCxpPTA7dHJ5e3Q9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlKX1jYXRjaChvKXtyZXR1cm59dC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCFlLmhhc0F0dHJpYnV0ZSgiZGF0YS1tbyIpKXt2YXIgdD1lLnBhcmVudE5vZGU7aT10PT09bj9pKzE6MCxuPXQsZS5zZXRBdHRyaWJ1dGUoImRhdGEtbW8iLCIiKSxlLnN0eWxlLnNldFByb3BlcnR5KCItLW1vLWQiLE1hdGgubWluKDUwKmksMzAwKSsibXMiKSxhLnB1c2goZSl9fSl9KSxhLmxlbmd0aCl7dmFyIG49bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGUpe2UuZm9yRWFjaChmdW5jdGlvbihlKXtlLmlzSW50ZXJzZWN0aW5nJiYoZS50YXJnZXQuY2xhc3NMaXN0LmFkZCgibW8tbGl0Iiksbi51bm9ic2VydmUoZS50YXJnZXQpKX0pfSx7cm9vdE1hcmdpbjoiMHB4IDBweCAtNiUgMHB4Iix0aHJlc2hvbGQ6LjA1fSk7YS5mb3JFYWNoKGZ1bmN0aW9uKGUpe24ub2JzZXJ2ZShlKX0pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoIWUuY2xhc3NMaXN0LmNvbnRhaW5zKCJtby1saXQiKSl7dmFyIHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0LnRvcDxpbm5lckhlaWdodCYmdC5ib3R0b20+MCYmZS5jbGFzc0xpc3QuYWRkKCJtby1saXQiKX19KX0sNGUzKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCFlLmNsYXNzTGlzdC5jb250YWlucygibW8tbGl0Iikpe3ZhciB0PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dC50b3A8aW5uZXJIZWlnaHQmJnQuYm90dG9tPjAmJnQuaGVpZ2h0JiZlLmNsYXNzTGlzdC5hZGQoIm1vLWxpdCIpfX0pfSw2MCl9KX19fSgpLGZ1bmN0aW9uKCl7WyJ4cUZvcm0iLCJyZmkiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpO3QmJnQuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IixmdW5jdGlvbihlKXt0LmNoZWNrVmFsaWRpdHkoKSYmKCh0LmdldEF0dHJpYnV0ZSgiZGF0YS1lbmRwb2ludCIpfHwiIikudHJpbSgpfHwod2luZG93LmxvY2F0aW9uLmhyZWY9ZnVuY3Rpb24oZSl7dmFyIHQ9W10sYT1lLnF1ZXJ5U2VsZWN0b3IoIltuYW1lPWV2ZW50LW5hbWVdIik7cmV0dXJuIGEmJnQucHVzaCgiRW5xdWlyeTogIithLnZhbHVlKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0Om5vdChbdHlwZT1oaWRkZW5dKSxzZWxlY3QsdGV4dGFyZWEiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBuPWUucXVlcnlTZWxlY3RvcignbGFiZWxbZm9yPSInK2EuaWQrJyJdJyksaT1uP24udGV4dENvbnRlbnQudHJpbSgpOmEubmFtZXx8YS5pZDthLnZhbHVlJiZ0LnB1c2goaSsiOiAiK2EudmFsdWUpfSksIm1haWx0bzppbmZvQGVzLXNwb3J0LmFlP3N1YmplY3Q9IitlbmNvZGVVUklDb21wb25lbnQoKGE/YS52YWx1ZToiV2Vic2l0ZSBlbnF1aXJ5IikrIiAtIGVucXVpcnkiKSsiJmJvZHk9IitlbmNvZGVVUklDb21wb25lbnQodC5qb2luKCJcbiIpKX0odCkpKX0sITApfSk7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInhxTW9kYWwiKTtpZihlJiYhZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoImRhdGEteHEtbmF0aXZlIikpe3ZhciB0LGE9d2luZG93Lm1hdGNoTWVkaWEmJm1hdGNoTWVkaWEoIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIikubWF0Y2hlcyxuPW51bGw7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtb3Blbi14cV0iKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2kuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKG8pe28ucHJldmVudERlZmF1bHQoKSxmdW5jdGlvbihpKXtjbGVhclRpbWVvdXQodCksbj1pLGUuaGlkZGVuPSExLGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsZS5vZmZzZXRXaWR0aCxlLmNsYXNzTGlzdC5hZGQoImlzLW9wZW4iKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIHQ9ZS5xdWVyeVNlbGVjdG9yKCJpbnB1dDpub3QoW3R5cGU9aGlkZGVuXSkiKTt0JiZ0LmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSl9LGE/MDoyNjApfShpKX0pfSksZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtY2xvc2UteHFdIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixvKX0pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZ1bmN0aW9uKHQpeyJFc2NhcGUiIT09dC5rZXl8fGUuaGlkZGVufHxvKCl9KTt2YXIgaT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieHFGb3JtIik7aSYmaS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLGZ1bmN0aW9uKGUpe2lmKGUucHJldmVudERlZmF1bHQoKSxpLmNoZWNrVmFsaWRpdHkoKSl7dmFyIHQ9aS5nZXRBdHRyaWJ1dGUoImRhdGEtZW5kcG9pbnQiKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4cVNlbnQiKSxuPWZ1bmN0aW9uKCl7YSYmYS5jbGFzc0xpc3QuYWRkKCJvbiIpO2kucmVzZXQoKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YSYmYS5jbGFzc0xpc3QucmVtb3ZlKCJvbiIpfSw3MDAwKX07dD9mZXRjaCh0LHttZXRob2Q6IlBPU1QiLGJvZHk6bmV3IEZvcm1EYXRhKGkpfSkudGhlbihuKS5jYXRjaChuKTpuKCl9ZWxzZSBpLnJlcG9ydFZhbGlkaXR5KCl9KX1mdW5jdGlvbiBvKCl7ZS5oaWRkZW58fChlLmNsYXNzTGlzdC5yZW1vdmUoImlzLW9wZW4iKSxjbGVhclRpbWVvdXQodCksdD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5oaWRkZW49ITAsZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz0iIixuJiZuLmZvY3VzJiZuLmZvY3VzKCksbj1udWxsfSxhPzA6MzYwKSl9fSgpfSgpOwo7KGZ1bmN0aW9uKCl7dmFyIG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5hdiIpO2lmKCFuKXJldHVybjt2YXIgZj1mdW5jdGlvbigpe24uY2xhc3NMaXN0LnRvZ2dsZSgic2Nyb2xsZWQiLHdpbmRvdy5zY3JvbGxZPjYwKX07ZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwYWdlc2hvdyIsZik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGYpO30pKCk7Ci8qIFZlbnVlIG1hcCB6b29tLCBvbmUgcm91dGluZSBmb3IgdGhlIEYxIGh1YiAoNzMyOSwgLm1hcC13cmFwID4gc3ZnLnZlbnVlKSBhbmQgdGhlIER1YmFpIDdzIHNwZWN0YXRvciBtYXAKICAgKDczMjMsIC5kNy1tYXAtd3JhcCA+IHN2Zy5kNy12ZW51ZSk6IHRoZSBVRkMgc2VhdCBtYXAncyBiZWhhdmlvdXIgKExvdWlzLCA4IE9jdCAyMDI2OiAidGhlIHpvb21pbmcgaW4gb3Igb3V0CiAgIGZlYXR1cmUgaXMgZG9uZSBieSBidXR0b25zLCB3aGVyZWFzIHlvdSBjYW4gc2Nyb2xsIG9uIHRoZSB1ZmMgbWFwLiBjYW4gdGhlIGZ1bmN0aW9uIGJlIHRoZSBzYW1lIG9uIHRoZSA3cyBhbmQgZjEKICAgbWFwcyBhcyB0aGUgdWZjIikuIENoYW5nZSBsb2cgQ0wtMjAyNjEwMDgtMDQ7IEN0cmwgKyBzY3JvbGwgYW5kIHRoZSBoaW50cyBDTC0yMDI2MTAwOC0xNCAoImNhbiBhbGwgbWFwcyBiZQogICBjdHJsK3Njcm9sbCBhbmQgYmUgc2hvd24gdGhhdCB0aGF0cyB0aGUgY2FzZSwgYWxzbyBlbnN1cmluZyB0aGF0IGEgbm9ybWFsIG1vdXNlIGhvdmVyIGFuZCBzY3JvbGwgd2hpbHN0IGN1cnNvciBpcwogICBvdmVyIGFsbCB0aGUgbWFwcyByZXN1bHRzIGluIHRoZSBwYWdlIHNjcm9sbGluZyBhcyBub3JtYWwiKS4gQXBwbGllZCBieSBzY3JpcHRzL21hcF96b29tXzIwMjYtMTAtMDgucHkgYW5kCiAgIHNjcmlwdHMvbWFwX3doZWVsXzIwMjYtMTAtMDgucHkuCiAgIC0gQ3RybCArIHNjcm9sbCAob3IgQ21kLCBvciBhIHRyYWNrcGFkIHBpbmNoLCB3aGljaCBicm93c2VycyByZXBvcnQgYXMgYSB3aGVlbCB3aXRoIGN0cmxLZXkpIHpvb21zIGFib3V0IHRoZQogICAgIGN1cnNvcjsgYSBwbGFpbiBzY3JvbGwgaXMgbGVmdCB0byB0aGUgcGFnZSBhbmQgdGhlIG1hcCBzaG93cyAiQ3RybCArIHNjcm9sbCB0byB6b29tIiBmb3IgYSBtb21lbnQ7CiAgIC0gZHJhZyBwYW5zIG9uY2Ugem9vbWVkOyBhIGRyYWcgb2YgbW9yZSB0aGFuIDRweCBpcyBub3QgYSBjbGljaywgc28gYSB6b25lIGlzIG5vdCBwaWNrZWQgYnkgYWNjaWRlbnQ7CiAgIC0gdHdvIHBvaW50ZXJzIHBpbmNoIGFib3V0IHRoZWlyIG1pZHBvaW50OyBvbiB0b3VjaCB0aGUgd3JhcCBhbGxvd3MgcGFnZSBzY3JvbGxpbmcgKHBhbi15KSB1bnRpbCB0aGUgbWFwIGlzCiAgICAgem9vbWVkLCB0aGVuIHRha2VzIHRoZSB0b3VjaCBmb3IgcGFubmluZzsKICAgLSArIC8gbWludXMgLyByZXNldCBidXR0b25zIGF0IHRoZSBtYXAncyB0b3AtcmlnaHQgY29ybmVyLCBpbnNpZGUgdGhlIHdyYXAsIHdpdGggdGhlIGhpbnQgdW5kZXIgdGhlbSBvbiBkZXZpY2VzCiAgICAgdGhhdCBoYXZlIGEgcG9pbnRlciB0aGF0IGhvdmVyczsKICAgLSB0aGUgZHJhd2luZyBpcyBzY2FsZWQgd2l0aCBhIENTUyB0cmFuc2Zvcm0gYW5kIGNsaXBwZWQgYnkgdGhlIHdyYXAgKG92ZXJmbG93IGhpZGRlbiBpbiB0aGUgQ1NTIGJsb2NrKSwgYW5kCiAgICAgY2xhbXBlZCBzbyB0aGUgbWFwIGFsd2F5cyBmaWxscyBpdHMgYm94OyBhIHdpZHRoIGNoYW5nZSBwdXRzIGl0IGJhY2sgdG8gMSAodGhlIEYxIG1hcCBzY3JpcHQgc2l6ZXMgaXRzCiAgICAgbGFiZWxzIGZyb20gdGhlIHJlbmRlcmVkIHdpZHRoKSwgYSBoZWlnaHQtb25seSBjaGFuZ2UgKGEgcGhvbmUncyBhZGRyZXNzIGJhcikgbGVhdmVzIGl0IGFsb25lLiAqLwo7KGZ1bmN0aW9uKCl7CnZhciB0cmllcz0wOwpmdW5jdGlvbiBmbGFzaChlbCxtc2cpewogIHZhciBmPWVsLnF1ZXJ5U2VsZWN0b3IoIi5tYXAtZmxhc2giKTsKICBpZighZil7Zj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtmLmNsYXNzTmFtZT0ibWFwLWZsYXNoIjtmLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIik7ZWwuYXBwZW5kQ2hpbGQoZil9CiAgZi50ZXh0Q29udGVudD1tc2c7Zi5jbGFzc0xpc3QuYWRkKCJvbiIpO2NsZWFyVGltZW91dChmLl90KTtmLl90PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmNsYXNzTGlzdC5yZW1vdmUoIm9uIil9LDE0MDApOwp9CndpbmRvdy5lc01hcEZsYXNoPWZsYXNoOwpmdW5jdGlvbiBnbygpewogIHZhciB3PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5lcy1wZyAubWFwLXdyYXAsLmVzLXBnIC5kNy1tYXAtd3JhcCIpLHM9dyYmdy5xdWVyeVNlbGVjdG9yKCJzdmcudmVudWUsc3ZnLmQ3LXZlbnVlIik7CiAgaWYoIXd8fCFzKXtpZih0cmllcysrPDEwMClzZXRUaW1lb3V0KGdvLDEwMCk7cmV0dXJufQogIGlmKHcucXVlcnlTZWxlY3RvcigiLm1hcHoiKSlyZXR1cm47CiAgdmFyIGs9MSx4PTAseT0wLE1BWD02LGN0bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICBjdGwuY2xhc3NOYW1lPSJtYXB6IjtjdGwuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwiTWFwIHpvb20iKTsKICBjdGwuaW5uZXJIVE1MPSc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS16PSIrIiBhcmlhLWxhYmVsPSJab29tIGluIiB0aXRsZT0iWm9vbSBpbiAoQ3RybCArIHNjcm9sbCkiPis8L2J1dHRvbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgZGF0YS16PSItIiBhcmlhLWxhYmVsPSJab29tIG91dCIgdGl0bGU9Ilpvb20gb3V0IChDdHJsICsgc2Nyb2xsKSI+Jm1pbnVzOzwvYnV0dG9uPjxidXR0b24gdHlwZT0iYnV0dG9uIiBkYXRhLXo9IjAiIGFyaWEtbGFiZWw9IlJlc2V0IG1hcCIgdGl0bGU9IlJlc2V0IG1hcCI+JiM4NjM0OzwvYnV0dG9uPjxzcGFuIGNsYXNzPSJtYXB6LWhpbnQiPkN0cmwgKyBzY3JvbGwgdG8gem9vbTwvc3Bhbj4nOwogIHcuYXBwZW5kQ2hpbGQoY3RsKTsKICBzLnN0eWxlLnRyYW5zZm9ybU9yaWdpbj0iMCAwIjsKICAvKiB0aGUgZHJhd2luZydzIHVudHJhbnNmb3JtZWQgYm94OiBpdHMgcmVuZGVyZWQgYm94IHdpdGggdGhlIGN1cnJlbnQgdHJhbnNmb3JtIHRha2VuIG9mZiAqLwogIGZ1bmN0aW9uIGJhc2UoKXt2YXIgcj1zLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybntsOnIubGVmdC14LHQ6ci50b3AteSx3OnIud2lkdGgvayxoOnIuaGVpZ2h0L2t9fQogIC8qIGNsYW1wIGFnYWluc3QgdGhlIHdyYXAncyBib3g6IG9uY2UgdGhlIHNjYWxlZCBkcmF3aW5nIGlzIGxhcmdlciB0aGFuIHRoZSBib3ggaXQgbXVzdCBjb3ZlciBpdCAobm8gYmxhbmsKICAgICBiYW5kIGF0IGFuIGVkZ2UpOyB3aGlsZSBpdCBpcyBzbWFsbGVyLCBhcyB0aGUgN3MgbWFwIGlzIGF0IGZpcnN0IGluIGl0cyB0YWxsZXIgd3JhcCwgaXQgc3RheXMgaW5zaWRlICovCiAgZnVuY3Rpb24gY2xhbXAodixhLGIpe3ZhciBsbz1NYXRoLm1pbihhLGIpLGhpPU1hdGgubWF4KGEsYik7cmV0dXJuIE1hdGgubWluKGhpLE1hdGgubWF4KGxvLHYpKX0KICBmdW5jdGlvbiBhcCgpewogICAgdmFyIGI9YmFzZSgpLFc9dy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIGlmKGs8MS4wMDEpe2s9MTt4PTA7eT0wfQogICAgZWxzZXt4PWNsYW1wKHgsVy5sZWZ0LWIubCxXLnJpZ2h0LWIudyprLWIubCk7eT1jbGFtcCh5LFcudG9wLWIudCxXLmJvdHRvbS1iLmgqay1iLnQpfQogICAgcy5zdHlsZS50cmFuc2Zvcm09az09PTE/IiI6InRyYW5zbGF0ZSgiK3grInB4LCIreSsicHgpIHNjYWxlKCIraysiKSI7CiAgICB2YXIgd2FzPXcuY2xhc3NMaXN0LmNvbnRhaW5zKCJpcy16b29tIik7CiAgICB3LmNsYXNzTGlzdC50b2dnbGUoImlzLXpvb20iLGs+MSk7CiAgICAvKiB1bnpvb21lZCwgYSBmaW5nZXIgb24gdGhlIG1hcCBzY3JvbGxzIHRoZSBwYWdlOyB6b29tZWQsIGl0IHBhbnMgdGhlIG1hcCAqLwogICAgdy5zdHlsZS50b3VjaEFjdGlvbj1rPjE/Im5vbmUiOiJwYW4teSI7CiAgICAvKiBiYWNrIGF0IDE6IHRoZSBGMSBtYXAgc2NyaXB0IHNpemVzIGl0cyBsYWJlbHMgZnJvbSB0aGUgcmVuZGVyZWQgd2lkdGggb24gcmVzaXplLCBzbyBsZXQgaXQgbWVhc3VyZSBhZ2FpbiAqLwogICAgaWYod2FzJiZrPT09MSlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7d2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJyZXNpemUiKSl9LDApOwogIH0KICBmdW5jdGlvbiB6b29tKGYsY3gsY3kpewogICAgdmFyIGI9YmFzZSgpLG5rPU1hdGgubWluKE1BWCxNYXRoLm1heCgxLGsqZikpOwogICAgaWYobms9PT1rKXJldHVybjsKICAgIHZhciBweD0oY3gtYi5sLXgpL2sscHk9KGN5LWIudC15KS9rOwogICAgeC09cHgqKG5rLWspO3ktPXB5Kihuay1rKTtrPW5rO2FwKCk7CiAgfQogIGZ1bmN0aW9uIG1pZCgpe3ZhciByPXcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW3IubGVmdCtyLndpZHRoLzIsci50b3Arci5oZWlnaHQvMl19CiAgY3RsLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXsKICAgIHZhciBiPWUudGFyZ2V0LmNsb3Nlc3QoImJ1dHRvbiIpO2lmKCFiKXJldHVybjsKICAgIHZhciB6PWIuZ2V0QXR0cmlidXRlKCJkYXRhLXoiKSxjPW1pZCgpOwogICAgaWYoIjAiPT09eil7az0xO3g9MDt5PTA7YXAoKX1lbHNlIHpvb20oIisiPT09ej8xLjQ1OjEvMS40NSxjWzBdLGNbMV0pOwogIH0pOwogIHcuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLGZ1bmN0aW9uKGUpewogICAgaWYoIWUuY3RybEtleSYmIWUubWV0YUtleSl7Zmxhc2godywiQ3RybCArIHNjcm9sbCB0byB6b29tIik7cmV0dXJufQogICAgZS5wcmV2ZW50RGVmYXVsdCgpO3pvb20oZS5kZWx0YVk8MD8xLjE4OjEvMS4xOCxlLmNsaWVudFgsZS5jbGllbnRZKTsKICB9LHtwYXNzaXZlOmZhbHNlfSk7CiAgdmFyIHB0cz17fSxkMD1udWxsLGRyYWc9ZmFsc2UsbGFzdD1udWxsLG1vdmVkPTAsc3dhbGxvdz1mYWxzZTsKICB3LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIixmdW5jdGlvbihlKXsKICAgIGlmKGUudGFyZ2V0LmNsb3Nlc3QoIi5tYXB6IikpcmV0dXJuOwogICAgcHRzW2UucG9pbnRlcklkXT17eDplLmNsaWVudFgseTplLmNsaWVudFl9OwogICAgdmFyIGlkcz1PYmplY3Qua2V5cyhwdHMpOwogICAgaWYoaWRzLmxlbmd0aD09PTIpe3ZhciBhPXB0c1tpZHNbMF1dLGI9cHRzW2lkc1sxXV07ZDA9TWF0aC5oeXBvdChhLngtYi54LGEueS1iLnkpO2RyYWc9ZmFsc2U7cmV0dXJufQogICAgZHJhZz10cnVlO21vdmVkPTA7bGFzdD17eDplLmNsaWVudFgseTplLmNsaWVudFl9OwogIH0pOwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsZnVuY3Rpb24oZSl7CiAgICBpZighcHRzW2UucG9pbnRlcklkXSlyZXR1cm47CiAgICBwdHNbZS5wb2ludGVySWRdPXt4OmUuY2xpZW50WCx5OmUuY2xpZW50WX07CiAgICB2YXIgaWRzPU9iamVjdC5rZXlzKHB0cyk7CiAgICBpZihpZHMubGVuZ3RoPT09MiYmZDApewogICAgICB2YXIgYT1wdHNbaWRzWzBdXSxiPXB0c1tpZHNbMV1dLGQ9TWF0aC5oeXBvdChhLngtYi54LGEueS1iLnkpOwogICAgICB6b29tKGQvZDAsKGEueCtiLngpLzIsKGEueStiLnkpLzIpO2QwPWQ7bW92ZWQ9OTk7ZS5wcmV2ZW50RGVmYXVsdCgpO3JldHVybjsKICAgIH0KICAgIGlmKCFkcmFnKXJldHVybjsKICAgIHZhciBkeD1lLmNsaWVudFgtbGFzdC54LGR5PWUuY2xpZW50WS1sYXN0Lnk7bGFzdD17eDplLmNsaWVudFgseTplLmNsaWVudFl9OwogICAgbW92ZWQrPU1hdGguYWJzKGR4KStNYXRoLmFicyhkeSk7CiAgICBpZihtb3ZlZD40KXcuY2xhc3NMaXN0LmFkZCgiaXMtcGFubmluZyIpOwogICAgaWYoaz4xKXt4Kz1keDt5Kz1keTthcCgpfQogIH0se3Bhc3NpdmU6ZmFsc2V9KTsKICBmdW5jdGlvbiB1cChlKXsKICAgIGlmKCFwdHNbZS5wb2ludGVySWRdKXJldHVybjsKICAgIGRlbGV0ZSBwdHNbZS5wb2ludGVySWRdOwogICAgaWYoT2JqZWN0LmtleXMocHRzKS5sZW5ndGg8MilkMD1udWxsOwogICAgZHJhZz1mYWxzZTt3LmNsYXNzTGlzdC5yZW1vdmUoImlzLXBhbm5pbmciKTsKICAgIGlmKG1vdmVkPjQpe3N3YWxsb3c9dHJ1ZTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c3dhbGxvdz1mYWxzZX0sMCl9CiAgfQogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLHVwKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmNhbmNlbCIsdXApOwogIHcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGUpe2lmKHN3YWxsb3cpe2Uuc3RvcFByb3BhZ2F0aW9uKCk7ZS5wcmV2ZW50RGVmYXVsdCgpfX0sdHJ1ZSk7CiAgLyogYSB3aWR0aCBjaGFuZ2UgKHJvdGF0aW9uLCBhIHdpbmRvdyByZXNpemVkKSByZXNldHMgdGhlIG1hcDsgYSBoZWlnaHQtb25seSBjaGFuZ2UgZG9lcyBub3QsIGJlY2F1c2UgYSBwaG9uZSdzCiAgICAgYWRkcmVzcyBiYXIgc2hvd2luZyBhbmQgaGlkaW5nIGZpcmVzIHJlc2l6ZSBhcyB0aGUgcGFnZSBzY3JvbGxzICovCiAgdmFyIGxhc3RXPXdpbmRvdy5pbm5lcldpZHRoOwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLGZ1bmN0aW9uKCl7aWYod2luZG93LmlubmVyV2lkdGg9PT1sYXN0VylyZXR1cm47bGFzdFc9d2luZG93LmlubmVyV2lkdGg7az0xO3g9MDt5PTA7YXAoKX0pOwogIGFwKCk7Cn0KZ28oKTsKfSkoKTsKDQo=
LyogZXNGb3JtSnM6IGVucXVpcnkgZm9ybXMgZGVsaXZlciBzb21ld2hlcmUgYW5kIHRlbGwgdGhlIHRydXRoIChDTC0yMDI2MTAwMi0xMiwgMiBPY3QgMjAy
Njsgc3RhdHVzIG5hbWVzIGZpeGVkIGluCiAgIENMLTIwMjYxMDAyLTE0IHRoZSBzYW1lIG5pZ2h0KS4KICAgVGFrZXMgdGhlIHN1Ym1pdCBvZiAjcmZpIGFu
ZCAjeHFGb3JtIGF0IHRoZSBjYXB0dXJlIHBoYXNlLCBhaGVhZCBvZiB0aGUgb2xkZXIgaGFuZGxlcnMgaW4gdGhlIG1haW4gYW5kIGV2ZW50CiAgIHBheWxv
YWRzICh3aGljaCBzaG93ZWQgUmVjZWl2ZWQgd2l0aCBubyBkZWxpdmVyeSwgb3IgaGFuZGVkIGEgbWFpbHRvOiBsaW5rIHRvIHRoZSBtYWlsIGNsaWVudCku
CiAgIFJvdXRlIDE6IGRhdGEtZW5kcG9pbnQgc2V0IChhbiBodHRwcyBVUkwsIGUuZy4gdGhlIG44biB3ZWJob29rKTogUE9TVCB0aGUgRm9ybURhdGEgdGhl
cmUsIHN1Y2Nlc3Mgb24gYSAyeHguCiAgIFJvdXRlIDI6IG5vIGVuZHBvaW50OiBoYW5kIHRoZSBlbnF1aXJ5IHRvIHRoZSBzaXRlJ3Mgb3duIENvbnRhY3Qg
Rm9ybSA3IGZvcm0gODY3LCB3aGljaCBpcyBpbiB0aGUgcGFnZSAodGhlIG9sZAogICB0aGVtZSdzIGVucXVpcnkgcG9wdXApLCB3aXRoIENGNydzIHJlQ0FQ
VENIQSB2MyBhbmQgQWtpc21ldCBjaGVja3MsIGFuZCByZWFkIENGNydzIG91dGNvbWUuCiAgIENGNyByZXBvcnRzIHRoZSBvdXRjb21lIHR3aWNlOiB0aGUg
d3BjZjdzdWJtaXQgZXZlbnQgb24gdGhlIGZvcm0ncyB3cmFwcGVyIGNhcnJpZXMgdGhlIEFQSSBzdGF0dXMgKG1haWxfc2VudCwKICAgbWFpbF9mYWlsZWQs
IHZhbGlkYXRpb25fZmFpbGVkLCBhY2NlcHRhbmNlX21pc3NpbmcsIHNwYW0sIGFib3J0ZWQpLCBhbmQgdGhlIHdwY2Y3c3RhdHVzY2hhbmdlZCBldmVudCBv
biB0aGUgZm9ybQogICBjYXJyaWVzIHRoZSBzaG9ydCBmb3JtIChzZW50LCBmYWlsZWQsIGludmFsaWQsIHVuYWNjZXB0ZWQsIHNwYW0sIGFib3J0ZWQpLiBC
b3RoIGFyZSBhY2NlcHRlZCBoZXJlOyB0aGUgZmlyc3QKICAgdmVyc2lvbiBsaXN0ZW5lZCBmb3IgdGhlIGxvbmcgbmFtZXMgb24gdGhlIHNlY29uZCBldmVu
dCwgc28gc2VudCBhbmQgZmFpbGVkIHdlcmUgbmV2ZXIgc2VlbiBhbmQgdGhlIGZvcm0gd2FpdGVkCiAgIGZvciB0aGUgdGltZW91dC4gQW55dGhpbmcgYnV0
IHN1Y2Nlc3Mgc2hvd3MgYW4gZXJyb3Igd2l0aCB0aGUgb2ZmaWNlIGVtYWlsIGFuZCBwaG9uZSBhbmQga2VlcHMgdGhlIHZhbHVlcy4gKi8KKGZ1bmN0aW9u
ICgpIHsKICB2YXIgRk9STVMgPSAnZm9ybSNyZmksIGZvcm0jeHFGb3JtJzsKICB2YXIgRU1BSUwgPSAnaW5mb0Blcy1zcG9ydC5hZScsIFBIT05FID0gJys5
NzEgNCA0MzUgNjYxMicsIENGN19JRCA9ICc4NjcnLCBXQUlUID0gNDUwMDA7CiAgdmFyIE9LID0geyBtYWlsX3NlbnQ6IDEsIHNlbnQ6IDEgfTsKICB2YXIg
QkFEID0geyBtYWlsX2ZhaWxlZDogMSwgZmFpbGVkOiAxLCBzcGFtOiAxLCB2YWxpZGF0aW9uX2ZhaWxlZDogMSwgaW52YWxpZDogMSwgYWNjZXB0YW5jZV9t
aXNzaW5nOiAxLCB1bmFjY2VwdGVkOiAxLCBhYm9ydGVkOiAxLCBwYXltZW50X3JlcXVpcmVkOiAxLCAncGF5bWVudC1yZXF1aXJlZCc6IDEgfTsKICB2YXIg
TE9ORyA9IHsgc2VudDogJ21haWxfc2VudCcsIGZhaWxlZDogJ21haWxfZmFpbGVkJywgaW52YWxpZDogJ3ZhbGlkYXRpb25fZmFpbGVkJywgdW5hY2NlcHRl
ZDogJ2FjY2VwdGFuY2VfbWlzc2luZycsICdwYXltZW50LXJlcXVpcmVkJzogJ3BheW1lbnRfcmVxdWlyZWQnIH07CiAgdmFyIFJFQVNPTiA9IHsgdmFsaWRh
dGlvbl9mYWlsZWQ6ICdhIGZpZWxkIHdhcyByZWplY3RlZCcsIHNwYW06ICd0aGUgc3BhbSBmaWx0ZXIgYmxvY2tlZCBpdCcsIG1haWxfZmFpbGVkOiAndGhl
IG1haWwgc2VydmVyIGRpZCBub3QgYWNjZXB0IGl0JywKICAgICAgICAgICAgICAgICBhY2NlcHRhbmNlX21pc3Npbmc6ICdjb25zZW50IHdhcyBtaXNzaW5n
JywgYWJvcnRlZDogJ2l0IHdhcyBpbnRlcnJ1cHRlZCcsIHBheW1lbnRfcmVxdWlyZWQ6ICdwYXltZW50IHdhcyByZXF1ZXN0ZWQnLCB0aW1lb3V0OiAnbm8g
cmVwbHkgaW4gdGltZScsCiAgICAgICAgICAgICAgICAgbmV0d29yazogJ2EgY29ubmVjdGlvbiBwcm9ibGVtJywgZXhjZXB0aW9uOiAnYSBzY3JpcHQgZXJy
b3InLCAnbm8gZGVzdGluYXRpb24nOiAndGhlIGZvcm0gaGFzIG5vd2hlcmUgdG8gc2VuZCcgfTsKICB2YXIgRklFTEQgPSB7ICd5b3VyLW5hbWUnOiAnZmly
c3QgbmFtZScsICdsYXN0LW5hbWUnOiAnbGFzdCBuYW1lJywgJ3RleHQtOTk4JzogJ2NvbXBhbnknLCAneW91ci1lbWFpbCc6ICdlbWFpbCcsICd5b3VyLXRl
bCc6ICdwaG9uZScsICd5b3VyLW1lc3NhZ2UnOiAnbWVzc2FnZScgfTsKICBmdW5jdGlvbiBsb2coeCkgeyB0cnkgeyAod2luZG93LmVzRm9ybUxvZyA9IHdp
bmRvdy5lc0Zvcm1Mb2cgfHwgW10pLnB1c2goeCk7IH0gY2F0Y2ggKGVycikge30gfQogIGZ1bmN0aW9uIHNlbnRFbChmKSB7IHJldHVybiBmLnF1ZXJ5U2Vs
ZWN0b3IoJy5zZW50JykgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlbnQnKTsgfQogIGZ1bmN0aW9uIHNob3coZiwgb2ssIG1zZykgewogICAgdmFy
IHMgPSBzZW50RWwoZik7IGlmICghcykgcmV0dXJuOwogICAgaWYgKCFzLmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnJykpIHMuc2V0QXR0cmlidXRlKCdkYXRh
LW9yaWcnLCBzLnRleHRDb250ZW50KTsKICAgIHMudGV4dENvbnRlbnQgPSBvayA/IHMuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWcnKSA6IG1zZzsKICAgIHMu
Y2xhc3NMaXN0LnRvZ2dsZSgnaXMtZXJyJywgIW9rKTsgcy5jbGFzc0xpc3QuYWRkKCdvbicpOwogICAgY2xlYXJUaW1lb3V0KHMuX2VzVCk7CiAgICBzLl9l
c1QgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcy5jbGFzc0xpc3QucmVtb3ZlKCdvbicpOyBzLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWVycicpOyBzLnRl
eHRDb250ZW50ID0gcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZycpOyB9LCBvayA/IDcwMDAgOiAyNTAwMCk7CiAgfQogIGZ1bmN0aW9uIGJ1c3koZiwgb24p
IHsKICAgIHZhciBiID0gZi5xdWVyeVNlbGVjdG9yKCdbdHlwZT0ic3VibWl0Il0nKTsgaWYgKCFiKSByZXR1cm47CiAgICBiLmRpc2FibGVkID0gb247CiAg
ICBpZiAob24pIHsgaWYgKCFiLmdldEF0dHJpYnV0ZSgnZGF0YS1sYWJlbCcpKSBiLnNldEF0dHJpYnV0ZSgnZGF0YS1sYWJlbCcsIGIudGV4dENvbnRlbnQp
OyBiLnRleHRDb250ZW50ID0gJ1NlbmRpbmcnOyB9CiAgICBlbHNlIGlmIChiLmdldEF0dHJpYnV0ZSgnZGF0YS1sYWJlbCcpKSBiLnRleHRDb250ZW50ID0g
Yi5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGFiZWwnKTsKICB9CiAgZnVuY3Rpb24gdmFsKGYsIG4pIHsgdmFyIGUgPSBmLnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPSIn
ICsgbiArICciXScpOyByZXR1cm4gZSA/IFN0cmluZyhlLnZhbHVlIHx8ICcnKS5yZXBsYWNlKC9eXHMrfFxzKyQvZywgJycpIDogJyc7IH0KICBmdW5jdGlv
biBjb25zZW50KGYpIHsgdmFyIGMgPSBmLnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPSJjb25zZW50Il0nKTsgcmV0dXJuIGMgJiYgYy5jaGVja2VkID8gJ3llcycg
OiAnbm8nOyB9CiAgZnVuY3Rpb24gY2Y3Zm9ybSgpIHsgdmFyIGkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPSJfd3BjZjciXVt2YWx1
ZT0iJyArIENGN19JRCArICciXScpOyByZXR1cm4gaSA/IGkuY2xvc2VzdCgnZm9ybScpIDogbnVsbDsgfQogIGZ1bmN0aW9uIHZpYUNmNyhmLCBkb25lKSB7
CiAgICB2YXIgYyA9IGNmN2Zvcm0oKTsKICAgIGlmICghYyB8fCAhd2luZG93LndwY2Y3IHx8IHR5cGVvZiB3aW5kb3cud3BjZjcuc3VibWl0ICE9PSAnZnVu
Y3Rpb24nKSByZXR1cm4gZmFsc2U7CiAgICBmdW5jdGlvbiBzZXQobiwgdikgeyB2YXIgZSA9IGMucXVlcnlTZWxlY3RvcignW25hbWU9IicgKyBuICsgJyJd
Jyk7IGlmIChlKSBlLnZhbHVlID0gdjsgfQogICAgdmFyIGludGVyZXN0ID0gdmFsKGYsICdpbnRlcmVzdCcpIHx8IHZhbChmLCAnc3BvcnQnKSwgZXYgPSB2
YWwoZiwgJ2V2ZW50LW5hbWUnKSB8fCAnV2Vic2l0ZSBlbnF1aXJ5JzsKICAgIC8qIHRlYW0tdHJhdmVsIGZvcm0gKCN4cUZvcm0pIGhhcyBjb250YWN0LW5h
bWUgLyB0ZWFtLW5hbWUgLyBzcG9ydCBpbnN0ZWFkIG9mIGZpcnN0LW5hbWUgLyBsYXN0LW5hbWUgLyBjb21wYW55CiAgICAgICAoZWRpdGVkIGxpdmUgb24g
NzMyNCBvbiAxNCBPY3QgMjAyNiwgZm9sZGVkIGludG8gdGhpcyBzb3VyY2Ugb24gMTYgT2N0LCBDTC0yMDI2MTAxNi0wMSkgKi8KICAgIHZhciBjbiA9IHZh
bChmLCAnY29udGFjdC1uYW1lJykuc3BsaXQoL1xzKy8pLmZpbHRlcihCb29sZWFuKTsKICAgIHZhciBmaXJzdCA9IHZhbChmLCAnZmlyc3QtbmFtZScpIHx8
IChjbi5sZW5ndGggPiAxID8gY24uc2xpY2UoMCwgLTEpLmpvaW4oJyAnKSA6IGNuWzBdKSB8fCAnV2Vic2l0ZSc7CiAgICB2YXIgbGFzdCAgPSB2YWwoZiwg
J2xhc3QtbmFtZScpICB8fCAoY24ubGVuZ3RoID4gMSA/IGNuW2NuLmxlbmd0aCAtIDFdIDogKGNuLmxlbmd0aCA/ICctJyA6ICdFbnF1aXJ5JykpOwogICAg
c2V0KCd5b3VyLW5hbWUnLCBmaXJzdCk7IHNldCgnbGFzdC1uYW1lJywgbGFzdCk7CiAgICBzZXQoJ3RleHQtOTk4JywgdmFsKGYsICdjb21wYW55JykgfHwg
dmFsKGYsICd0ZWFtLW5hbWUnKSB8fCAnTm90IGdpdmVuJyk7CiAgICBzZXQoJ3lvdXItZW1haWwnLCB2YWwoZiwgJ2VtYWlsJykpOyBzZXQoJ3lvdXItdGVs
JywgdmFsKGYsICdwaG9uZScpKTsKICAgIHNldCgnaW50ZXJlc3RlZC1pbicsIGludGVyZXN0KTsgc2V0KCdldmVudC1uYW1lJywgZXYpOwogICAgdmFyIGV4
dHJhID0gW107CiAgICBpZiAodmFsKGYsICd0ZWFtLW5hbWUnKSkgICAgZXh0cmEucHVzaCgnVGVhbTogJyArIHZhbChmLCAndGVhbS1uYW1lJykpOwogICAg
aWYgKHZhbChmLCAnY29udGFjdC1uYW1lJykpIGV4dHJhLnB1c2goJ0NvbnRhY3Q6ICcgKyB2YWwoZiwgJ2NvbnRhY3QtbmFtZScpKTsKICAgIGlmICh2YWwo
ZiwgJ3Nwb3J0JykpICAgICAgICBleHRyYS5wdXNoKCdTcG9ydDogJyArIHZhbChmLCAnc3BvcnQnKSk7CiAgICBzZXQoJ3lvdXItbWVzc2FnZScsIFt2YWwo
ZiwgJ21lc3NhZ2UnKSB8fCAnTm8gbWVzc2FnZSBsZWZ0LicsICcnXS5jb25jYXQoZXh0cmEsIFsKICAgICAgJ0ludGVyZXN0ZWQgaW46ICcgKyBpbnRlcmVz
dCwgJ0V2ZW50OiAnICsgZXYsCiAgICAgICdSb3V0aW5nOiAnICsgdmFsKGYsICdlZWJfZXZlbnQnKSArICcgLyAnICsgdmFsKGYsICdlZWJfY2F0ZWdvcnkn
KSArICcgLyAnICsgdmFsKGYsICdlZWJfcmVhc29uJyksCiAgICAgICdDb25zZW50IHRvIGNvbnRhY3Q6ICcgKyBjb25zZW50KGYpLCAnU2VudCBmcm9tOiAn
ICsgbG9jYXRpb24uaHJlZl0pLmpvaW4oJ1xuJykpOwogICAgdmFyIHNldHRsZWQgPSBmYWxzZSwgdDsKICAgIGZ1bmN0aW9uIGZpbmlzaChvaywgc3RhdHVz
LCBleHRyYSkgewogICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuOyBzZXR0bGVkID0gdHJ1ZTsgY2xlYXJUaW1lb3V0KHQpOwogICAgICBjLnJlbW92ZUV2ZW50
TGlzdGVuZXIoJ3dwY2Y3c3RhdHVzY2hhbmdlZCcsIG9uU3RhdHVzKTsgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd3BjZjdzdWJtaXQnLCBvblN1
Ym1pdCk7CiAgICAgIGRvbmUob2ssIHN0YXR1cywgZXh0cmEpOwogICAgfQogICAgZnVuY3Rpb24gc2V0dGxlKHN0LCBkKSB7CiAgICAgIHN0ID0gU3RyaW5n
KHN0IHx8ICcnKTsKICAgICAgaWYgKE9LW3N0XSkgeyBmaW5pc2godHJ1ZSwgJ21haWxfc2VudCcpOyByZXR1cm47IH0KICAgICAgaWYgKCFCQURbc3RdKSBy
ZXR1cm47CiAgICAgIHZhciBleHRyYSA9ICcnLCBpbnYgPSBkICYmIGQuYXBpUmVzcG9uc2UgJiYgZC5hcGlSZXNwb25zZS5pbnZhbGlkX2ZpZWxkczsKICAg
ICAgaWYgKGludiAmJiBpbnYubGVuZ3RoKSB7IHZhciBuYW1lcyA9IFtdOyBmb3IgKHZhciBpID0gMDsgaSA8IGludi5sZW5ndGg7IGkrKykgbmFtZXMucHVz
aChGSUVMRFtpbnZbaV0uZmllbGRdIHx8IGludltpXS5maWVsZCk7IGV4dHJhID0gbmFtZXMuam9pbignLCAnKTsgfQogICAgICBpZiAoZCAmJiBkLmFwaVJl
c3BvbnNlICYmIGQuYXBpUmVzcG9uc2UubWVzc2FnZSkgbG9nKCdjZjc6ICcgKyBkLmFwaVJlc3BvbnNlLm1lc3NhZ2UpOwogICAgICBmaW5pc2goZmFsc2Us
IExPTkdbc3RdIHx8IHN0LCBleHRyYSk7CiAgICB9CiAgICAvKiBzdGF0dXNjaGFuZ2VkIGZpcmVzIGZpcnN0LCBpbnNpZGUgQ0Y3J3Mgc2V0U3RhdHVzOyBh
IHRpY2sgbGF0ZXIgdGhlIHN1Ym1pdCBldmVudCBicmluZ3MgdGhlIGRldGFpbCAocmVqZWN0ZWQKICAgICAgIGZpZWxkcywgbWVzc2FnZSksIHNvIGxldCB0
aGF0IG9uZSBzZXR0bGUgZmlyc3Qgd2hlbiBpdCBjb21lcyAqLwogICAgZnVuY3Rpb24gb25TdGF0dXMoZSkgeyB2YXIgc3QgPSAoZS5kZXRhaWwgJiYgZS5k
ZXRhaWwuc3RhdHVzKSB8fCBjLmdldEF0dHJpYnV0ZSgnZGF0YS1zdGF0dXMnKTsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHNldHRsZShzdCk7IH0sIDAp
OyB9CiAgICBmdW5jdGlvbiBvblN1Ym1pdChlKSB7IHZhciBkID0gZS5kZXRhaWwgfHwge307IGlmIChTdHJpbmcoZC5jb250YWN0Rm9ybUlkKSAhPT0gQ0Y3
X0lEKSByZXR1cm47IHNldHRsZShkLnN0YXR1cywgZCk7IH0KICAgIGMuYWRkRXZlbnRMaXN0ZW5lcignd3BjZjdzdGF0dXNjaGFuZ2VkJywgb25TdGF0dXMp
OwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd3BjZjdzdWJtaXQnLCBvblN1Ym1pdCk7CiAgICB0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7
IGZpbmlzaChmYWxzZSwgJ3RpbWVvdXQnKTsgfSwgV0FJVCk7CiAgICB0cnkgeyB3aW5kb3cud3BjZjcuc3VibWl0KGMpOyB9IGNhdGNoIChlcnIpIHsgZmlu
aXNoKGZhbHNlLCAnZXhjZXB0aW9uJyk7IH0KICAgIHJldHVybiB0cnVlOwogIH0KICBmdW5jdGlvbiB2aWFFbmRwb2ludChmLCB1cmwsIGRvbmUpIHsKICAg
IHZhciBjdGwgPSAoJ0Fib3J0Q29udHJvbGxlcicgaW4gd2luZG93KSA/IG5ldyBBYm9ydENvbnRyb2xsZXIoKSA6IG51bGw7CiAgICB2YXIgdCA9IGN0bCA/
IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBjdGwuYWJvcnQoKTsgfSwgV0FJVCkgOiBudWxsOwogICAgdmFyIG9wdHMgPSB7IG1ldGhvZDogJ1BPU1QnLCBi
b2R5OiBuZXcgRm9ybURhdGEoZikgfTsgaWYgKGN0bCkgb3B0cy5zaWduYWwgPSBjdGwuc2lnbmFsOwogICAgZmV0Y2godXJsLCBvcHRzKS50aGVuKGZ1bmN0
aW9uIChyKSB7IGlmICh0KSBjbGVhclRpbWVvdXQodCk7IGRvbmUoci5vaywgJ2h0dHAgJyArIHIuc3RhdHVzKTsgfSkKICAgICAgLmNhdGNoKGZ1bmN0aW9u
ICgpIHsgaWYgKHQpIGNsZWFyVGltZW91dCh0KTsgZG9uZShmYWxzZSwgJ25ldHdvcmsnKTsgfSk7CiAgfQogIGZ1bmN0aW9uIGZhaWwoZiwgc3RhdHVzLCBl
eHRyYSkgewogICAgYnVzeShmLCBmYWxzZSk7CiAgICB2YXIgd2h5ID0gKFJFQVNPTltzdGF0dXNdIHx8IHN0YXR1cykgKyAoZXh0cmEgPyAnOiAnICsgZXh0
cmEgOiAnJyk7CiAgICBzaG93KGYsIGZhbHNlLCAnU29ycnksIHRoYXQgZGlkIG5vdCBzZW5kICgnICsgd2h5ICsgJykuIEVtYWlsICcgKyBFTUFJTCArICcg
b3IgY2FsbCAnICsgUEhPTkUgKyAnLicpOwogICAgbG9nKHN0YXR1cyk7CiAgfQogIC8qIEFuYWx5dGljcyAoMTYgT2N0IDIwMjYsIHNpdGUgcGxhbiA2LjYp
OiB0aGUgdGFnIG1hbmFnZXIncyBvd24gbGlzdGVuZXJzIG5ldmVyIHNlZSBvdXIgZm9ybXMsIGJlY2F1c2UgdGhpcwogICAgIGhhbmRsZXIgc3RvcHMgdGhl
IHN1Ym1pdCBldmVudCBhdCB0aGUgY2FwdHVyZSBwaGFzZSBhbmQgdGhlIGVucXVpcnkgZ29lcyBvdXQgdGhyb3VnaCB3cGNmNy5zdWJtaXQoKSwgd2hpY2gg
ZmlyZXMKICAgICBubyBzdWJtaXQgZXZlbnQ7IHNvIGV2ZXJ5IGVucXVpcnkgZXZlbnQgc3RvcHBlZCBvbiBsYXVuY2ggZGF5LiBUaGUgY29udGFpbmVyJ3Mg
bGVhZF9mb3JtIHRhZyBmaXJlcyBvbgogICAgIGd0bS5mb3JtU3VibWl0IGFuZCBpdHMgd2hhdHNhcHBfY2xpY2tzIHRhZyBvbiBndG0ubGlua0NsaWNrIHdp
dGggdGhlIGVuY29kZWQgV2hhdHNBcHAgVVJMIChib3RoIHRyaWdnZXJzIGFjY2VwdAogICAgIGEgcHVzaCB3aXRoIG5vIGd0bS50cmlnZ2VycykuIFB1c2hl
ZCBvbmNlIHBlciBzdWNjZXNzZnVsIHNlbmQsIG5ldmVyIG9uIGEgZmFpbGVkIG9uZS4gZXNfZW5xdWlyeV9zZW50IGlzIHRoZQogICAgIHNhbWUgcHVzaCB1
bmRlciBhIHBsYWluIG5hbWUgZm9yIGFueSBmdXR1cmUgdHJpZ2dlci4gKi8KICB2YXIgV0EgPSAnaHR0cHM6Ly93YS5tZS85NzE1NTgxNTM1ODQ/dGV4dD1J
JTI3bSUyMGludGVyZXN0ZWQlMjBpbiUyMGNvbm5lY3RpbmclMjB3aXRoJTIwdGhlJTIwRVMlMjBTcG9ydCUyMHRlYW0nOwogIGZ1bmN0aW9uIHRyYWNrKG5h
bWUsIGRhdGEpIHsKICAgIHRyeSB7IHZhciBkID0geyBldmVudDogbmFtZSB9OyBmb3IgKHZhciBrIGluIGRhdGEpIGRba10gPSBkYXRhW2tdOyAod2luZG93
LmRhdGFMYXllciA9IHdpbmRvdy5kYXRhTGF5ZXIgfHwgW10pLnB1c2goZCk7IH0gY2F0Y2ggKGVycikge30KICB9CiAgZnVuY3Rpb24gc3VjY2VzcyhmKSB7
CiAgICBidXN5KGYsIGZhbHNlKTsgc2hvdyhmLCB0cnVlKTsKICAgIHZhciBkID0geyAnZ3RtLmVsZW1lbnRJZCc6IGYuaWQgfHwgJycsICdndG0uZWxlbWVu
dENsYXNzZXMnOiBmLmNsYXNzTmFtZSB8fCAnJywgJ2d0bS5lbGVtZW50VXJsJzogbG9jYXRpb24uaHJlZiwKICAgICAgICAgICAgICBlc19mb3JtOiBmLmlk
IHx8ICcnLCBlc19ldmVudDogdmFsKGYsICdldmVudC1uYW1lJyksIGVzX2ludGVyZXN0OiB2YWwoZiwgJ2ludGVyZXN0JyksIGVzX3BhZ2U6IGxvY2F0aW9u
LnBhdGhuYW1lIH07CiAgICB0cmFjaygnZ3RtLmZvcm1TdWJtaXQnLCBkKTsgdHJhY2soJ2VzX2VucXVpcnlfc2VudCcsIGQpOwogICAgZi5yZXNldCgpOyBs
b2coJ21haWxfc2VudCcpOwogIH0KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7CiAgICB2YXIgYSA9IGUudGFy
Z2V0ICYmIGUudGFyZ2V0LmNsb3Nlc3QgPyBlLnRhcmdldC5jbG9zZXN0KCdhW2hyZWYqPSJ3YS5tZS8iXScpIDogbnVsbDsKICAgIGlmIChhKSB0cmFjaygn
Z3RtLmxpbmtDbGljaycsIHsgJ2d0bS5lbGVtZW50VXJsJzogV0EsICdndG0uZWxlbWVudElkJzogYS5pZCB8fCAnJywgJ2d0bS5lbGVtZW50Q2xhc3Nlcyc6
IGEuY2xhc3NOYW1lIHx8ICcnLCBlc193aGF0c2FwcDogYS5ocmVmLCBlc19wYWdlOiBsb2NhdGlvbi5wYXRobmFtZSB9KTsKICB9LCB0cnVlKTsKICBkb2N1
bWVudC5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBmdW5jdGlvbiAoZSkgewogICAgdmFyIGYgPSBlLnRhcmdldDsKICAgIGlmICghZiB8fCAhZi5tYXRj
aGVzIHx8ICFmLm1hdGNoZXMoRk9STVMpKSByZXR1cm47CiAgICBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IGUuc3RvcEltbWVk
aWF0ZVByb3BhZ2F0aW9uKCk7CiAgICBpZiAoIWYuY2hlY2tWYWxpZGl0eSgpKSB7IGYucmVwb3J0VmFsaWRpdHkoKTsgcmV0dXJuOyB9CiAgICBpZiAoZi5n
ZXRBdHRyaWJ1dGUoJ2RhdGEtc2VuZGluZycpID09PSAnMScpIHJldHVybjsKICAgIGYuc2V0QXR0cmlidXRlKCdkYXRhLXNlbmRpbmcnLCAnMScpOyBidXN5
KGYsIHRydWUpOwogICAgdmFyIGRvbmUgPSBmdW5jdGlvbiAob2ssIHN0YXR1cywgZXh0cmEpIHsgZi5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc2VuZGluZycp
OyBpZiAob2spIHN1Y2Nlc3MoZik7IGVsc2UgZmFpbChmLCBzdGF0dXMsIGV4dHJhKTsgfTsKICAgIHZhciB1cmwgPSAoZi5nZXRBdHRyaWJ1dGUoJ2RhdGEt
ZW5kcG9pbnQnKSB8fCAnJykucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgIGlmICh1cmwpIHsgdmlhRW5kcG9pbnQoZiwgdXJsLCBkb25lKTsgcmV0
dXJuOyB9CiAgICBpZiAodmlhQ2Y3KGYsIGRvbmUpKSByZXR1cm47CiAgICBkb25lKGZhbHNlLCAnbm8gZGVzdGluYXRpb24nKTsKICB9LCB0cnVlKTsKICAv
KiB0aGUgb2ZmaWNlIGZvcm0gdGhhdCByZWNlaXZlcyB0aGUgZW5xdWlyeSByZXF1aXJlcyBhIHBob25lIG51bWJlciAqLwogIHZhciBmb3JtcyA9IGRvY3Vt
ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoRk9STVMpOwogIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybXMubGVuZ3RoOyBpKyspIHsgdmFyIHAgPSBmb3Jtc1tpXS5x
dWVyeVNlbGVjdG9yKCdbbmFtZT0icGhvbmUiXScpOyBpZiAocCkgcC5yZXF1aXJlZCA9IHRydWU7IH0KfSkoKTsK
LyogZXNDYXJKczogY2Fyb3VzZWwgYXJyb3dzIGZvbGxvdyB0aGUgRXhwZXJpZW5jZXMgc3RhbmRhcmQgb24gZXZlcnkgcGFnZSAoQ0wtMjAyNjEwMDUtMDMs
IDUgT2N0IDIwMjYpLgogICBBIGNhcm91c2VsIHdob3NlIGNhcmRzIGFsbCBmaXQgc2hvd3Mgbm8gYXJyb3dzOiBlYWNoIC5jYXItbmF2IGdldHMgLm5vLXNj
cm9sbCB3aGlsZSB0aGUgdHJhY2sgaXRzIGJ1dHRvbnMgcG9pbnQgYXQKICAgKGRhdGEtdGFyZ2V0KSBoYXMgbm90aGluZyB0byBzY3JvbGwuIFJlLWNoZWNr
ZWQgd2hlbiB0aGUgdHJhY2sgb3IgYSBjYXJkIGNoYW5nZXMgc2l6ZSAod2luZG93IHJlc2l6ZSwgdGhlCiAgIEV4cGVyaWVuY2VzIGZpbHRlciBjaGlwcyBo
aWRpbmcgY2FyZHMpIGFuZCBvbiBsb2FkLCB3aGVuIGxhdGUgZm9udHMgYW5kIGltYWdlcyBoYXZlIHNldHRsZWQuCiAgIFNvdXJjZSBvZiB0cnV0aDogdGVt
cGxhdGUvZnJhZ21lbnRzL2Nhcm91c2VsLWpzLmpzLCBzaGlwcGVkIGJ5IHNjcmlwdHMvY2Fyb3VzZWxfYXJyb3dzXzIwMjYtMTAtMDUucHkuICovCihmdW5j
dGlvbiAoKSB7CiAgdmFyIG5hdnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2FyLW5hdicpOwogIGlmICghbmF2cy5sZW5ndGgpIHJldHVybjsK
ICBmdW5jdGlvbiB3YXRjaChuYXYpIHsKICAgIHZhciBidG4gPSBuYXYucXVlcnlTZWxlY3RvcignLmNhci1idG5bZGF0YS10YXJnZXRdJyk7CiAgICB2YXIg
dHJhY2sgPSBidG4gPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChidG4uZ2V0QXR0cmlidXRlKCdkYXRhLXRhcmdldCcpKSA6IG51bGw7CiAgICBpZiAoIXRy
YWNrKSByZXR1cm47CiAgICBmdW5jdGlvbiBzeW5jKCkgeyBuYXYuY2xhc3NMaXN0LnRvZ2dsZSgnbm8tc2Nyb2xsJywgdHJhY2suc2Nyb2xsV2lkdGggLSB0
cmFjay5jbGllbnRXaWR0aCA8PSA0KTsgfQogICAgc3luYygpOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHN5bmMpOwogICAgd2lu
ZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBzeW5jKTsKICAgIGlmICh3aW5kb3cuUmVzaXplT2JzZXJ2ZXIpIHsKICAgICAgdmFyIHJvID0gbmV3IFJl
c2l6ZU9ic2VydmVyKHN5bmMpOwogICAgICByby5vYnNlcnZlKHRyYWNrKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFjay5jaGlsZHJlbi5sZW5n
dGg7IGkrKykgcm8ub2JzZXJ2ZSh0cmFjay5jaGlsZHJlbltpXSk7CiAgICB9CiAgfQogIGZvciAodmFyIGkgPSAwOyBpIDwgbmF2cy5sZW5ndGg7IGkrKykg
d2F0Y2gobmF2c1tpXSk7Cn0pKCk7Cg==
LyogZXNSZmlKczogb3BlbmluZyB0aGUgZW5xdWlyeSBmb3JtIGtlZXBzIHRoZSBwYWdlIHdoZXJlIGl0IGlzIChDTC0yMDI2MTAwNi0wMSwgNiBPY3QgMjAy
NikuCiAgIEV2ZXJ5IGNvbnRyb2wgdGhhdCBvcGVucyBhIGZvcm0gaXMgYW4gYW5jaG9yIHRvICNlbnF1aXJlLCB0aGUgaW4tcGFnZSBmYWxsYmFjayBmb3Ig
cmVhZGVycyB3aXRob3V0IHNjcmlwdC4KICAgVGhlIG9sZCB0aGVtZSdzIGN1c3RvbS1zY3JpcHQuanMgbGlzdGVucyBvbiBkb2N1bWVudCBmb3IgZXZlcnkg
Y2xpY2sgb24gYVtocmVmKj0iIyJdIGFuZCBzbW9vdGgtc2Nyb2xscyB0bwogICB0aGF0IHNlY3Rpb24sIHNvIHRoZSBwYWdlIHNsaWQgdG8gdGhlIGJvdHRv
bSB1bmRlciB0aGUgb3BlbiBmb3JtLiBPdXIgb3BlbmVyIHJ1bnMgb24gdGhlIGVsZW1lbnQgYW5kIGNhbGxzCiAgIHByZXZlbnREZWZhdWx0LCB3aGljaCBk
b2VzIG5vdCBzdG9wIGEgZGVsZWdhdGVkIGhhbmRsZXIgb24gZG9jdW1lbnQ7IHN0b3BwaW5nIHRoZSBjbGljayBmcm9tIHJlYWNoaW5nIGRvY3VtZW50CiAg
IGRvZXMuIFRoZSBzdG9wIGhhcHBlbnMgb24gYm9keSwgYWZ0ZXIgZXZlcnkgaGFuZGxlciBvbiB0aGUgZWxlbWVudCBpdHNlbGYgaGFzIHJ1biAodGhlIG9w
ZW5lciwgdGhlCiAgICJJbnRlcmVzdGVkIGluIiBwcmVzZWxlY3QpLCBhbmQgb25seSBmb3IgY2xpY2tzIG9uIGEgZm9ybSBvcGVuZXIuIExpbmtzIHRoYXQg
b25seSBwb2ludCBhdCAjZW5xdWlyZSBzdGlsbCBzY3JvbGwuCiAgIFNvdXJjZSBvZiB0cnV0aDogdGVtcGxhdGUvZnJhZ21lbnRzL3JmaS1qcy5qcywgc2hp
cHBlZCBieSBzY3JpcHRzL3JmaV9ub19zY3JvbGxfMjAyNi0xMC0wNi5weS4gKi8KKGZ1bmN0aW9uICgpIHsKICB2YXIgU0VMID0gJ1tkYXRhLW9wZW4tcmZp
XSwgW2RhdGEtb3Blbi14cV0nOwogIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTsKICBpZiAoIWJvZHkgfHwgIWJvZHkuYWRkRXZlbnRMaXN0ZW5lcikgcmV0
dXJuOwogIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkgewogICAgdmFyIGVsID0gZS50YXJnZXQ7CiAgICB3aGlsZSAoZWwg
JiYgZWwgIT09IGJvZHkpIHsKICAgICAgaWYgKGVsLm1hdGNoZXMgJiYgZWwubWF0Y2hlcyhTRUwpKSB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHJldHVybjsg
fQogICAgICBlbCA9IGVsLnBhcmVudE5vZGU7CiAgICB9CiAgfSwgZmFsc2UpOwp9KSgpOwo=
LyogZXNDYXJ0SnM6IHRoZSBjYXJ0IGljb24gaW4gdGhlIG5hdiBzaG93cyBob3cgbWFueSBpdGVtcyBhcmUgaW4gdGhlIHZpc2l0b3IncyBiYXNrZXQgKENM
LTIwMjYxMDA5LTAyLCA5IE9jdCAyMDI2KS4KICAgTG91aXM6ICJDYW4gd2UgYWRkIGEgY2FydCBpY29uIHRvIHRoZSB0b3AgcmlnaHQgb2YgdGhlIG5ldyBz
aXRlIHNvIHRoYXQgcGVvcGxlIGNhbiBuYXZpZ2F0ZSB0aGUgd2Vic2l0ZSBhZnRlcgogICBhZGRlZCB0byBjYXJ0IGFuZCB0aGVuIGdvIGJhY2sgdG8gcGF5
PyBPdGhlcndpc2UgaXQncyBub3Qgb2J2aW91cyBob3cgeW91J2Qgc2VlIHdoYXQncyBpbiB5b3VyIGJhc2tldCBpZiB5b3UKICAgbmF2aWdhdGVkIGF3YXkg
ZnJvbSB0aGUgY2hlY2tvdXQgcGFnZSIuIFRoZSBpY29uIGl0c2VsZiBpcyBwbGFpbiBtYXJrdXAgKGEgbGluayB0byAvY2FydC8pLCBzbyBpdCB3b3JrcyB3
aXRob3V0CiAgIHNjcmlwdC4gVGhpcyByZWFkcyB0aGUgV29vQ29tbWVyY2UgU3RvcmUgQVBJIGZvciB0aGUgdmlzaXRvcidzIG93biBzZXNzaW9uIChzYW1l
LW9yaWdpbiBjb29raWVzLCBubyBub25jZSBuZWVkZWQKICAgZm9yIGEgcmVhZCkgYW5kIHNob3dzIHRoZSBjb3VudCBiYWRnZSB3aGVuIHRoZSBiYXNrZXQg
aGFzIGFueXRoaW5nIGluIGl0OyBhIGZhaWxlZCBvciBlbXB0eSByZWFkIGxlYXZlcyB0aGUgYmFkZ2UKICAgaGlkZGVuLiBSZS1yZWFkIHdoZW4gdGhlIHBh
Z2UgaXMgc2hvd24gYWdhaW4gZnJvbSB0aGUgYmFjay1mb3J3YXJkIGNhY2hlLCB3aGljaCBpcyBob3cgcGVvcGxlIGNvbWUgYmFjayBmcm9tIHRoZQogICBj
YXJ0LiBTb3VyY2Ugb2YgdHJ1dGg6IHRlbXBsYXRlL2ZyYWdtZW50cy9jYXJ0LWpzLmpzLCBzaGlwcGVkIGJ5IHNjcmlwdHMvY2FydF9pY29uXzIwMjYtMTAt
MDkucHkuICovCihmdW5jdGlvbiAoKSB7CiAgdmFyIGJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25hdkNhcnROJyk7CiAgaWYgKCFiYWRnZSkg
cmV0dXJuOwogIHZhciBVUkwgPSAnaHR0cHM6Ly93d3cuZXMtc3BvcnQuYWUvd3AtanNvbi93Yy9zdG9yZS92MS9jYXJ0JzsKICBmdW5jdGlvbiBzaG93KG4p
IHsKICAgIG4gPSBwYXJzZUludChuLCAxMCkgfHwgMDsKICAgIGJhZGdlLnRleHRDb250ZW50ID0gbiA+IDk5ID8gJzk5KycgOiBTdHJpbmcobik7CiAgICBi
YWRnZS5oaWRkZW4gPSBuIDwgMTsKICAgIHZhciBhID0gYmFkZ2UucGFyZW50Tm9kZTsKICAgIGlmIChhKSBhLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcs
IG4gPiAwID8gJ1lvdXIgY2FydCwgJyArIG4gKyAobiA9PT0gMSA/ICcgaXRlbScgOiAnIGl0ZW1zJykgOiAnWW91ciBjYXJ0Jyk7CiAgfQogIGZ1bmN0aW9u
IHJlYWQoKSB7CiAgICBpZiAoIXdpbmRvdy5mZXRjaCkgcmV0dXJuOwogICAgLy8gMTIgT2N0IDIwMjYgKENMLTIwMjYxMDEyLTExKTogTGl0ZVNwZWVkIHNl
cnZlZCB0aGUgU3RvcmUgQVBJIGNhcnQgZnJvbSBpdHMgcGFnZSBjYWNoZSAoeC1saXRlc3BlZWQtY2FjaGU6IGhpdCksCiAgICAvLyBzbyBhIG5ldyB2aXNp
dG9yIGNvdWxkIHNlZSBhbm90aGVyIHZpc2l0b3IncyBjb3VudC4gQSB1bmlxdWUgcXVlcnkgcGVyIHJlYWQgbmV2ZXIgbWF0Y2hlcyBhIGNhY2hlZCBjb3B5
LgogICAgZmV0Y2goVVJMICsgJz9fPScgKyBEYXRlLm5vdygpLCB7IGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLCBjYWNoZTogJ25vLXN0b3JlJywgaGVh
ZGVyczogeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nIH0gfSkKICAgICAgLnRoZW4oZnVuY3Rpb24gKHIpIHsgcmV0dXJuIHIub2sgPyByLmpzb24o
KSA6IG51bGw7IH0pCiAgICAgIC50aGVuKGZ1bmN0aW9uIChjKSB7IGlmIChjKSBzaG93KGMuaXRlbXNfY291bnQpOyB9KQogICAgICAuY2F0Y2goZnVuY3Rp
b24gKCkge30pOwogIH0KICByZWFkKCk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VzaG93JywgZnVuY3Rpb24gKGUpIHsgaWYgKGUucGVyc2lz
dGVkKSByZWFkKCk7IH0pOwogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBmdW5jdGlvbiAoKSB7IGlmIChkb2N1bWVu
dC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJykgcmVhZCgpOyB9KTsKfSkoKTsK
Step 1 of 5
When are you staying?
Your package includes a minimum two-night stay by default. Please adjust the dates if you're planning to stay longer.
Dates and guests
Check in – check out
Select dates
Mo Tu We Th Fr Sa Su
Select check-in, then check-out · min 2 nights
Guests and rooms
1 adult · 1 room
Adults
18 and over · one race ticket each
Children
2–12 · circuit entry is free
Rooms
Max 4 guests per room
Step 2 of 5
Pick your hotel
← Back to all hotels
Step 3 of 5
Choose a room
Step 4 of 5
Who is travelling?
Names must match the passport or Emirates ID used at check-in and at the circuit gate. Tickets are issued in the lead guest's name.
Step 5 of 5
Check it over
Nothing is charged yet. The cart holds your rate for 20 minutes.
I've checked the guest names and dates, and I accept the ticket and hotel terms. ES Sport can contact me about this booking.