Team tours and training camps in the UAE
This Is ES Sport.
Inbound sports tours and warm-weather training camps in the UAE for professional clubs, schools and academies. Fixtures, facilities, hotels and transfers arranged, with a dedicated ES Sport manager on the ground for the whole tour.
Since 2009 Hosting touring teams in the UAE
Season Nov to Mar Peak warm-weather training window
Group 10+ Minimum touring party
On call 24hr Dedicated ES Sport tour manager
Team Tours· Dubai and Abu Dhabi· Rugby, cricket, football and netball· Enquire Now
On tour in the UAE
Train Like The Pros.
ES Sport is a schools and academies sports tours specialist for the Middle East, and the host of choice for professional squads preparing in the Gulf. Every tour gets a dedicated ES Sport manager, on call around the clock, handling fixtures, accommodation, logistics and training in a high-performance environment.
We have hosted Sheffield United FC, the West Indies men’s and Australia women’s cricket squads, NRL champions Sydney Roosters and the Irish and Welsh women’s rugby sevens teams, among many others.
The winter climate makes the UAE the right place for warm-weather camps. World-class facilities, exceptional accommodation and first-class medical services, with the whole trip planned and run for you.
Training camp, Dubai
Dubai and Abu Dhabi · Schools, academies and professional squads Tours By Sport. Tell us the sport, the squad and the dates. Inclusions confirmed on enquiry.
← →
Fixtures Matches against the right level of opposition, arranged through our club and school network.
Facilities High-performance training venues, from the ICC Academy to Hudayriyat Island.
Hotels And Transfers Accommodation, coaches and airport transfers booked around the training schedule.
Visas And Support Visa guidance, medical cover and a dedicated manager on call 24 hours a day.
Education
Sport And Learning On The Same Trip.
School and university tours to the UAE do more than fill a fixture list. ES Sport builds itineraries that pair training and matches with the learning a school needs to justify the trip: visits with a curriculum link, time with UAE clubs and academies, and sessions on how sport is run as a business in the region.
The same manager who books the pitches books the classroom time. Guest speakers from the ES Sport team and partner properties, behind-the-scenes access at venues we work with, and cultural visits across Dubai and Abu Dhabi are arranged around the training schedule rather than instead of it.
Safeguarding sits at the centre of every school tour: supervised itineraries, vetted venues, appropriate hotels and a dedicated manager on call 24 hours a day.
UAE School Games national finals
✓ Sports business sessions on hospitality, sponsorship and event delivery from the ES Sport team✓ Venue access at the properties we work with, from the Sevens to Yas Marina Circuit, subject to event calendars✓ Coaching clinics with UAE clubs and academies alongside the tour’s own training✓ Cultural visits across Dubai and Abu Dhabi, matched to the school’s curriculum✓ Leadership and teamwork workshops built into the tour programme✓ Safeguarding first : supervised itineraries, vetted venues and hotels chosen for school groups
Education tours are available for schools, colleges and universities. Tell us the subject focus and we will shape the programme.
Thank you for the excellent service that you provided for our team at the Dubai Rugby Sevens tournament. Gillian McDarby Programme Manager, Irish Rugby Football Union The whole organisation was absolutely spot on and it was nice to deal with someone who understood our needs. I look forward to continuing the relationship between you, your company and The Bahrain RFC in the future. Bahrain RFC Everything went wonderfully well and we will be in touch to enquire about future bookings. Thanks for all your help. Durham County Cricket Club
The destination
Winter Sun,World Class.
Dubai and Abu Dhabi in the winter months: warm, dry and built for sport. The ICC Academy at Dubai Sports City, the sporting excellence centre on Hudayriyat Island and a network of clubs and schools ready to play.
Off the pitch, the standard of accommodation is exceptional and the downtime is easy: beaches, golf, water sports and sightseeing. Healthcare and medical services are first class.
Dubai Sports City
Tours Which sports do you run tours for?
Rugby, cricket, football and netball are the core, and we have hosted squads across other sports too. Tell us the sport and the level and we build the tour around it.
Tours Who are the tours for?
Professional clubs, schools and academies. The minimum touring party is 10.
Season When is the best time to come?
November to March for warm-weather training. Dubai 7s week at the end of November is the busiest period, so book early for that window.
Logistics What is included?
Fixtures, training facilities, hotels, transfers, visa guidance and a dedicated ES Sport manager on call 24 hours a day. Flights can be included on request. Every tour is quoted individually.
Booking How do I book?
Tours are confirmed on enquiry. Tell us the sport, the squad size and the dates and we come back with a plan and pricing.
Schools Can a school tour include classroom time?
Yes. Education tours pair training and fixtures with curriculum-linked visits, sports business sessions and venue access, all arranged by the same ES Sport manager who runs the sporting side of the trip.
×
Enquire
Bring Your Team To The UAE.
We’ll get back to you.
IWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVzLXBhZ2UiKTtlJiZlLmNsYXNzTGlzdC5hZGQoImpzIiksZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHQ9bnVsbDt0cnl7dD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiZXNUaGVtZSIpfWNhdGNoKFMpe30ibGlnaHQiPT09dHx8ImRhcmsiPT09dD9lLnNldEF0dHJpYnV0ZSgiZGF0YS10aGVtZSIsdCk6d2luZG93Lm1hdGNoTWVkaWEmJndpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSIpLm1hdGNoZXMmJmUuc2V0QXR0cmlidXRlKCJkYXRhLXRoZW1lIiwibGlnaHQiKTt2YXIgbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGhlbWVCdG4iKSxhPXdpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkiKS5tYXRjaGVzO2Z1bmN0aW9uIG8odCl7ZS5zZXRBdHRyaWJ1dGUoImRhdGEtdGhlbWUiLHQpO3RyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiZXNUaGVtZSIsdCl9Y2F0Y2goUyl7fX1uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3ZhciB0PSJsaWdodCI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aGVtZSIpPyJkYXJrIjoibGlnaHQiO2lmKG4uY2xhc3NMaXN0LmFkZCgic3BpbiIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtuLmNsYXNzTGlzdC5yZW1vdmUoInNwaW4iKX0sNTIwKSwhYSYmZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbil7dmFyIGk9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPWkubGVmdCtpLndpZHRoLzIscj1pLnRvcCtpLmhlaWdodC8yLHM9TWF0aC5oeXBvdChNYXRoLm1heChjLHdpbmRvdy5pbm5lcldpZHRoLWMpLE1hdGgubWF4KHIsd2luZG93LmlubmVySGVpZ2h0LXIpKTtkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGZ1bmN0aW9uKCl7byh0KX0pLnJlYWR5LnRoZW4oZnVuY3Rpb24oKXtlLmFuaW1hdGUoe2NsaXBQYXRoOlsiY2lyY2xlKDBweCBhdCAiK2MrInB4ICIrcisicHgpIiwiY2lyY2xlKCIrcysicHggYXQgIitjKyJweCAiK3IrInB4KSJdfSx7ZHVyYXRpb246NjIwLGVhc2luZzoiY3ViaWMtYmV6aWVyKC40LDAsLjIsMSkiLHBzZXVkb0VsZW1lbnQ6Ijo6dmlldy10cmFuc2l0aW9uLW5ldyhyb290KSJ9KX0pLmNhdGNoKGZ1bmN0aW9uKCl7fSl9ZWxzZSFmdW5jdGlvbih0KXtlLmNsYXNzTGlzdC5hZGQoInRoZW1pbmciKSxvKHQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmNsYXNzTGlzdC5yZW1vdmUoInRoZW1pbmciKX0sNTYwKX0odCl9KTt2YXIgaT1mdW5jdGlvbigpe307IWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImhlcm9UaXRsZSIpLHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmhlcm8tcGlsbGFycyIpO2lmKGUmJnQmJiFhJiZlLmFuaW1hdGUpe3ZhciBuPTI0MCxvPWZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49W10sYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmNoaWxkTm9kZXMpO2Z1bmN0aW9uIG8oZSxhKXtlLnNwbGl0KC8oXHMrKS8pLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSlpZigvXlxzKyQvLnRlc3QoZSkpYS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpKTtlbHNle3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtvLmNsYXNzTmFtZT0idyIsQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTt0LmNsYXNzTmFtZT0iYyIsdC50ZXh0Q29udGVudD1lLG8uYXBwZW5kQ2hpbGQodCksbi5wdXNoKHQpfSksYS5hcHBlbmRDaGlsZChvKSx0LnB1c2gobyl9fSl9cmV0dXJuIGUuaW5uZXJIVE1MPSIiLGEuZm9yRWFjaChmdW5jdGlvbih0KXtpZigzPT09dC5ub2RlVHlwZSlvKHQudGV4dENvbnRlbnQsZSk7ZWxzZXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKTtuLmNsYXNzTmFtZT10LmNsYXNzTmFtZSxlLmFwcGVuZENoaWxkKG4pLG8odC50ZXh0Q29udGVudCxuKX19KSx7d29yZHM6dCxjaGFyczpufX0oZSksYz10LnF1ZXJ5U2VsZWN0b3JBbGwoImEiKTt0LmNsYXNzTGlzdC5hZGQoImxpZnQiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsZnVuY3Rpb24oZSl7ZS5zdHlsZS5vcGFjaXR5PSIwIn0pLGk9ZnVuY3Rpb24oKXtkb2N1bWVudC5mb250cyYmZG9jdW1lbnQuZm9udHMucmVhZHk/ZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbihyKS5jYXRjaChyKTpyKCl9fWZ1bmN0aW9uIHIoKXt2YXIgYT1mdW5jdGlvbigpe3ZhciB0PWUucXVlcnlTZWxlY3RvcigiZW0iKTtpZighdClyZXR1cm4gbnVsbDt2YXIgbj10LnF1ZXJ5U2VsZWN0b3JBbGwoIi53Iik7aWYobi5sZW5ndGg8MilyZXR1cm4gbnVsbDtmb3IodmFyIGE9blswXS5xdWVyeVNlbGVjdG9yQWxsKCIuYyIpLG89blsxXS5xdWVyeVNlbGVjdG9yQWxsKCIuYyIpLGk9bnVsbCxjPW8ubGVuZ3RoLTE7Yz49MDtjLS0paWYoInQiPT09b1tjXS50ZXh0Q29udGVudC50b0xvd2VyQ2FzZSgpKXtpPW9bY107YnJlYWt9cmV0dXJuIGFbMF0mJmFbMV0mJmk/W2FbMF0sYVsxXSxpXTpudWxsfSgpO2lmKCFhfHxjLmxlbmd0aDwzKXJldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsZnVuY3Rpb24oZSl7ZS5zdHlsZS5vcGFjaXR5PSIifSksdm9pZCB0LmNsYXNzTGlzdC5yZW1vdmUoImxpZnQiKTtvLmNoYXJzLmZvckVhY2goZnVuY3Rpb24oZSx0KXtlLmFuaW1hdGUoW3t0cmFuc2Zvcm06InRyYW5zbGF0ZVkoNDZweCkiLG9wYWNpdHk6MH0se3RyYW5zZm9ybToidHJhbnNsYXRlWSgwKSIsb3BhY2l0eToxfV0se2R1cmF0aW9uOjg2MCxkZWxheToyNCp0LGVhc2luZzoiY3ViaWMtYmV6aWVyKC4xNiwxLC4zLDEpIixmaWxsOiJib3RoIn0pfSk7dmFyIGk9W107QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLGZ1bmN0aW9uKGUsdCl7dmFyIG49YVt0XS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxvPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aS5wdXNoKHtlbDplLGR4Om4ubGVmdC1vLmxlZnQsZHk6bi50b3Atby50b3B9KX0pO3ZhciByPTExODAscz0wO2kuZm9yRWFjaChmdW5jdGlvbihlLHQpe3ZhciBvPTFlMyszODAqdDtzPU1hdGgubWF4KHMsbys1MCtyKTt2YXIgaT1nZXRDb21wdXRlZFN0eWxlKGFbdF0pLmNvbG9yO2FbdF0uYW5pbWF0ZShbe3RyYW5zZm9ybToic2NhbGUoMSkiLGNvbG9yOml9LHt0cmFuc2Zvcm06InNjYWxlKDEuMykiLGNvbG9yOiIjRUJCNDQ2IixvZmZzZXQ6LjMzLGVhc2luZzoiY3ViaWMtYmV6aWVyKC4yNSwuNDYsLjQ1LC45NCkifSx7dHJhbnNmb3JtOiJzY2FsZSgxKSIsY29sb3I6aSxlYXNpbmc6ImN1YmljLWJlemllciguMzQsMS41NiwuNjQsMSkifV0se2R1cmF0aW9uOjQ1MCxkZWxheTpvLGZpbGw6Im5vbmUifSk7dmFyIGM9InRyYW5zbGF0ZSgiK2UuZHgrInB4LCIrZS5keSsicHgpIHNjYWxlKDEuNCwxLjQpIjtlLmVsLmFuaW1hdGUoW3t0cmFuc2Zvcm06YyxvcGFjaXR5OjAsb2Zmc2V0OjB9LHt0cmFuc2Zvcm06YyxvcGFjaXR5OjEsb2Zmc2V0OjEzMC9yfSx7dHJhbnNmb3JtOmMsb3BhY2l0eToxLG9mZnNldDpuL3IsZWFzaW5nOiJjdWJpYy1iZXppZXIoLjU1LC4wODUsLjY4LC41MykifSx7dHJhbnNmb3JtOiJ0cmFuc2xhdGUoMHB4LDBweCkgc2NhbGUoMSwxKSIsb3BhY2l0eToxLG9mZnNldDo4ODAvcixlYXNpbmc6ImVhc2Utb3V0In0se3RyYW5zZm9ybToidHJhbnNsYXRlKDBweCwwcHgpIHNjYWxlKDEsMC44NSkiLG9wYWNpdHk6MSxvZmZzZXQ6OTcwL3IsZWFzaW5nOiJlYXNlLW91dCJ9LHt0cmFuc2Zvcm06InRyYW5zbGF0ZSgwcHgsMHB4KSBzY2FsZSgxLDEpIixvcGFjaXR5OjEsb2Zmc2V0OjF9XSx7ZHVyYXRpb246cixkZWxheTpvKzUwLGZpbGw6ImJvdGgifSl9KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLGZ1bmN0aW9uKGUpe2UuZ2V0QW5pbWF0aW9ucygpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jYW5jZWwoKX0pLGUuc3R5bGUub3BhY2l0eT0iIixlLnN0eWxlLnRyYW5zZm9ybT0iIn0pLHQuY2xhc3NMaXN0LnJlbW92ZSgibGlmdCIpfSxzKzQwKX19KCk7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVzTG9hZGVyIikscj1kb2N1bWVudC5ib2R5LHM9ITA7dHJ5e3M9ITB9Y2F0Y2goUyl7fWZ1bmN0aW9uIGwoKXtjLmNsYXNzTGlzdC5hZGQoImlzLW91dCIpLHIuY2xhc3NMaXN0LnJlbW92ZSgiZXNsLWxvY2siKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5oaWRkZW49ITB9LDcwMCk7dHJ5e3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oImVzU2VlbkxvYWRlciIsIjEiKX1jYXRjaChTKXt9c2V0VGltZW91dChpLDMwMCl9cz8oYy5oaWRkZW49ITAsci5jbGFzc0xpc3QucmVtb3ZlKCJlc2wtbG9jayIpLHNldFRpbWVvdXQoaSwyNjApKTooc2V0VGltZW91dChsLDIwNTApLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGwpKSxkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuY2FyLWJ0biIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlLmRhdGFzZXQudGFyZ2V0KTtpZih0KXt2YXIgbj10LmZpcnN0RWxlbWVudENoaWxkLGE9bj9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKzQ6LjgqdC5jbGllbnRXaWR0aDt0LnNjcm9sbEJ5KHtsZWZ0OmEqK2UuZGF0YXNldC5kaXIsYmVoYXZpb3I6InNtb290aCJ9KX19KX0pLGZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmZjaGlwIiksYT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIubmNhcmRbZGF0YS1zcG9ydF0iKSxuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjYXRFbXB0eSIpO2lmKHQubGVuZ3RoJiZhLmxlbmd0aCl7dC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIG89ZS5kYXRhc2V0LmZpbHRlcixpPTA7YS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PSJhbGwiPT09b3x8ZS5kYXRhc2V0LnNwb3J0PT09bztlLmNsYXNzTGlzdC50b2dnbGUoImlzLWhpZGRlbiIsIXQpLHQmJihpKz0xLGUuY2xhc3NMaXN0LmFkZCgidiIpKX0pLG4mJihuLmhpZGRlbj1pPjApLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5yb3csLmNhdGFsb2d1ZS13cmFwIikuZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgYz1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi5uY2FyZCIpO2lmKGMubGVuZ3RoKXt2YXIgdj1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi5uY2FyZDpub3QoLmlzLWhpZGRlbikiKS5sZW5ndGg7ci5jbGFzc0xpc3QudG9nZ2xlKCJpcy1lbXB0eSIsdj09PTApfX0pLHQuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLmRhdGFzZXQuZmlsdGVyPT09bztlLmNsYXNzTGlzdC50b2dnbGUoImlzLW9uIix0KSxlLnNldEF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIsdD8idHJ1ZSI6ImZhbHNlIil9KX0pfSl9fSgpO3ZhciBkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZmlNb2RhbCIpLHU9ZC5xdWVyeVNlbGVjdG9yKCIucmZpLWRsZyIpLGY9bnVsbCxtPW51bGwsaD0wO2Z1bmN0aW9uIHAoKXtpZighKGgrKz4wKSl7dmFyIGU9d2luZG93LmlubmVyV2lkdGgtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO2U+MCYmKGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PWUrInB4IiksZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIn19ZnVuY3Rpb24geSgpeyhoPU1hdGgubWF4KDAsaC0xKSk+MHx8KGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9IiIsZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9IiIpfWZ1bmN0aW9uIHYoKXtkLmhpZGRlbnx8KGQuY2xhc3NMaXN0LnJlbW92ZSgiaXMtb3BlbiIpLGQuY2xhc3NMaXN0LmFkZCgiaXMtY2xvc2luZyIpLGNsZWFyVGltZW91dChtKSxtPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtkLmhpZGRlbj0hMCxkLmNsYXNzTGlzdC5yZW1vdmUoImlzLWNsb3NpbmciKSx5KCksZiYmZi5mb2N1cyYmZi5mb2N1cygpLGY9bnVsbH0sYT8wOjI0MCkpfWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLW9wZW4tcmZpXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBuLG89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5hdlBhbmVsIik7aWYobyYmIW8uaGlkZGVuKXtvLmNsYXNzTGlzdC5yZW1vdmUoImlzLW9wZW4iKSxvLmNsYXNzTGlzdC5hZGQoImlzLWNsb3NpbmciKTt2YXIgaT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2QnVyZ2VyIik7aSYmKGkuc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiwiZmFsc2UiKSxpLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsIk9wZW4gbWVudSIpKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5oaWRkZW49ITAsby5jbGFzc0xpc3QucmVtb3ZlKCJpcy1jbG9zaW5nIikseSgpfSxhPzA6MjYwKX1uPWUsY2xlYXJUaW1lb3V0KG0pLGY9bnx8bnVsbCxkLmNsYXNzTGlzdC5yZW1vdmUoImlzLWNsb3NpbmciKSxkLmhpZGRlbj0hMSxwKCksZC5vZmZzZXRXaWR0aCxkLmNsYXNzTGlzdC5hZGQoImlzLW9wZW4iKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImYtZmlyc3QiKTtpZihlKXRyeXtlLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSl9Y2F0Y2goUyl7ZS5mb2N1cygpfX0sYT8wOjI2MCl9KX0pLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWNsb3NlLXJmaV0iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7digpfSl9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihlKXsiRXNjYXBlIiE9PWUua2V5fHxkLmhpZGRlbnx8digpfSksZC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihlKXtpZigiVGFiIj09PWUua2V5KXtmb3IodmFyIHQ9dS5xdWVyeVNlbGVjdG9yQWxsKCJhW2hyZWZdLCBidXR0b246bm90KFtkaXNhYmxlZF0pLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSIpLG49W10sYT0wO2E8dC5sZW5ndGg7YSsrKW51bGwhPT10W2FdLm9mZnNldFBhcmVudCYmbi5wdXNoKHRbYV0pO2lmKG4ubGVuZ3RoKXt2YXIgbz1uWzBdLGk9bltuLmxlbmd0aC0xXTtlLnNoaWZ0S2V5JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09bz8oZS5wcmV2ZW50RGVmYXVsdCgpLGkuZm9jdXMoKSk6ZS5zaGlmdEtleXx8ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PWl8fChlLnByZXZlbnREZWZhdWx0KCksby5mb2N1cygpKX19fSksZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiZm9ybS5mb3JtIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpO3ZhciB0PWUudGFyZ2V0O2lmKHQuY2hlY2tWYWxpZGl0eSgpKXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoIi5zZW50Iil8fGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZW50IiksYT10LmRhdGFzZXQuZW5kcG9pbnQsbz1mdW5jdGlvbigpe3ZhciBzPW47biYmcy5jbGFzc0xpc3QuYWRkKCJvbiIpO3QucmVzZXQoKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7biYmcy5jbGFzc0xpc3QucmVtb3ZlKCJvbiIpfSw3MDAwKX07YT9mZXRjaChhLHttZXRob2Q6IlBPU1QiLGJvZHk6bmV3IEZvcm1EYXRhKHQpfSkudGhlbihvKS5jYXRjaChvKTpvKCl9ZWxzZSB0LnJlcG9ydFZhbGlkaXR5KCl9KX0pO3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuYXZCdXJnZXIiKSxFPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuYXZQYW5lbCIpLGI9bnVsbDtmdW5jdGlvbiBMKCl7RS5oaWRkZW58fChFLmNsYXNzTGlzdC5yZW1vdmUoImlzLW9wZW4iKSxFLmNsYXNzTGlzdC5hZGQoImlzLWNsb3NpbmciKSxnLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsImZhbHNlIiksZy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLCJPcGVuIG1lbnUiKSxjbGVhclRpbWVvdXQoYiksYj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7RS5oaWRkZW49ITAsRS5jbGFzc0xpc3QucmVtb3ZlKCJpcy1jbG9zaW5nIikseSgpfSxhPzA6MjYwKSl9Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtFLmhpZGRlbj8oY2xlYXJUaW1lb3V0KGIpLEUuY2xhc3NMaXN0LnJlbW92ZSgiaXMtY2xvc2luZyIpLEUuaGlkZGVuPSExLHAoKSxFLm9mZnNldFdpZHRoLEUuY2xhc3NMaXN0LmFkZCgiaXMtb3BlbiIpLGcuc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiwidHJ1ZSIpLGcuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwiQ2xvc2UgbWVudSIpKTpMKCl9KSxFLnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWNsb3NlLW1lbnVdIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe0woKX0pfSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7IkVzY2FwZSIhPT1lLmtleXx8RS5oaWRkZW58fChMKCksZy5mb2N1cygpKX0pO3ZhciB3PXdpbmRvdy5tYXRjaE1lZGlhKCIobWluLXdpZHRoOiAxMDAxcHgpIikseD1mdW5jdGlvbihlKXtlLm1hdGNoZXMmJkwoKX07dy5hZGRFdmVudExpc3RlbmVyP3cuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix4KTp3LmFkZExpc3RlbmVyJiZ3LmFkZExpc3RlbmVyKHgpO3ZhciBBPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuYXYiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmdW5jdGlvbigpe0EuY2xhc3NMaXN0LnRvZ2dsZSgic2Nyb2xsZWQiLHdpbmRvdy5zY3JvbGxZPjYwKX0pO3ZhciBxPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5pc0ludGVyc2VjdGluZyYmKGUudGFyZ2V0LmNsYXNzTGlzdC5hZGQoInYiKSxxLnVub2JzZXJ2ZShlLnRhcmdldCkpfSl9LHt0aHJlc2hvbGQ6LjA4fSk7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnIsIC5zZWN0aW9uLWhlYWRlciIpLmZvckVhY2goZnVuY3Rpb24oZSl7cS5vYnNlcnZlKGUpfSl9KCksZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGU9d2luZG93Lm1hdGNoTWVkaWEmJndpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSIpLm1hdGNoZXMsdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZXN4VGl0bGUiKSxuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlc3hQaWxsYXJzIik7aWYodCYmbiYmIWUmJnQuYW5pbWF0ZSl7dmFyIGE9MjQwLG89ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmNoaWxkTm9kZXMpO2Z1bmN0aW9uIGEoZSxuKXtlLnNwbGl0KC8oXHMrKS8pLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSlpZigvXlxzKyQvLnRlc3QoZSkpbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpKTtlbHNle3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTthLmNsYXNzTmFtZT0idyIsQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtuLmNsYXNzTmFtZT0iYyIsbi50ZXh0Q29udGVudD1lLGEuYXBwZW5kQ2hpbGQobiksdC5wdXNoKG4pfSksbi5hcHBlbmRDaGlsZChhKX19KX1yZXR1cm4gZS5pbm5lckhUTUw9IiIsbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKDM9PT10Lm5vZGVUeXBlKWEodC50ZXh0Q29udGVudCxlKTtlbHNle3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpO24uY2xhc3NOYW1lPXQuY2xhc3NOYW1lLGUuYXBwZW5kQ2hpbGQobiksYSh0LnRleHRDb250ZW50LG4pfX0pLHR9KHQpLGk9bi5xdWVyeVNlbGVjdG9yKCJhIik7bi5jbGFzc0xpc3QuYWRkKCJsaWZ0IiksaSYmKGkuc3R5bGUub3BhY2l0eT0iMCIpO3ZhciBlc3hUYWc9bi5xdWVyeVNlbGVjdG9yKCJsaTpudGgtY2hpbGQoMikiKTtlc3hUYWcmJmVzeFRhZy5jbGFzc0xpc3QuYWRkKCJ0YWctd2FpdCIpO3ZhciBjPSEwO3RyeXtjPSEwfWNhdGNoKHMpe31zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQuZm9udHMmJmRvY3VtZW50LmZvbnRzLnJlYWR5P2RvY3VtZW50LmZvbnRzLnJlYWR5LnRoZW4ocikuY2F0Y2gocik6cigpfSxjPzI2MDoyMzUwKX1mdW5jdGlvbiByKCl7dmFyIGU9ZnVuY3Rpb24oKXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoImVtIik7aWYoIWUpcmV0dXJuIG51bGw7dmFyIGE9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudyIpO2lmKCFhLmxlbmd0aClyZXR1cm4gbnVsbDt2YXIgbz1wYXJzZUludChuLmdldEF0dHJpYnV0ZSgiZGF0YS1zcmMtaW5kZXgiKXx8IjAiLDEwKXx8MCxpPWFbMF0ucXVlcnlTZWxlY3RvckFsbCgiLmMiKTtyZXR1cm4gaVtvXXx8aVswXXx8bnVsbH0oKTtpZighZXx8IWkpcmV0dXJuIGkmJihpLnN0eWxlLm9wYWNpdHk9IiIpLGVzeFRhZyYmZXN4VGFnLmNsYXNzTGlzdC5yZW1vdmUoInRhZy13YWl0Iiksdm9pZCBuLmNsYXNzTGlzdC5yZW1vdmUoImxpZnQiKTtvLmZvckVhY2goZnVuY3Rpb24oZSx0KXtlLmFuaW1hdGUoW3t0cmFuc2Zvcm06InRyYW5zbGF0ZVkoNDZweCkiLG9wYWNpdHk6MH0se3RyYW5zZm9ybToidHJhbnNsYXRlWSgwKSIsb3BhY2l0eToxfV0se2R1cmF0aW9uOjg2MCxkZWxheToyNCp0LGVhc2luZzoiY3ViaWMtYmV6aWVyKC4xNiwxLC4zLDEpIixmaWxsOiJib3RoIn0pfSk7dmFyIGM9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxyPWkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscz1NYXRoLm1pbigxLjQsTWF0aC5tYXgoLjIsYy5oZWlnaHQvci5oZWlnaHQqMS4xNSkpLGw9Yy5sZWZ0LXIubGVmdCxkPWMuYm90dG9tLXIuYm90dG9tLHU9MTE4MCxmPTFlMyxtPWdldENvbXB1dGVkU3R5bGUoZSkuY29sb3I7ZS5hbmltYXRlKFt7dHJhbnNmb3JtOiJzY2FsZSgxKSIsY29sb3I6bX0se3RyYW5zZm9ybToic2NhbGUoMS4zKSIsY29sb3I6IiNFQkI0NDYiLG9mZnNldDouMzMsZWFzaW5nOiJjdWJpYy1iZXppZXIoLjI1LC40NiwuNDUsLjk0KSJ9LHt0cmFuc2Zvcm06InNjYWxlKDEpIixjb2xvcjptLGVhc2luZzoiY3ViaWMtYmV6aWVyKC4zNCwxLjU2LC42NCwxKSJ9XSx7ZHVyYXRpb246NDUwLGRlbGF5OmYsZmlsbDoibm9uZSJ9KTt2YXIgaD0idHJhbnNsYXRlKCIrbCsicHgsIitkKyJweCkgc2NhbGUoIitzKyIsIitzKyIpIjtpLmFuaW1hdGUoW3t0cmFuc2Zvcm06aCxvcGFjaXR5OjAsb2Zmc2V0OjB9LHt0cmFuc2Zvcm06aCxvcGFjaXR5OjEsb2Zmc2V0OjEzMC91fSx7dHJhbnNmb3JtOmgsb3BhY2l0eToxLG9mZnNldDphL3UsZWFzaW5nOiJjdWJpYy1iZXppZXIoLjU1LC4wODUsLjY4LC41MykifSx7dHJhbnNmb3JtOiJ0cmFuc2xhdGUoMHB4LDBweCkgc2NhbGUoMSwxKSIsb3BhY2l0eToxLG9mZnNldDo4ODAvdSxlYXNpbmc6ImVhc2Utb3V0In0se3RyYW5zZm9ybToidHJhbnNsYXRlKDBweCwwcHgpIHNjYWxlKDEsMC44NSkiLG9wYWNpdHk6MSxvZmZzZXQ6OTcwL3UsZWFzaW5nOiJlYXNlLW91dCJ9LHt0cmFuc2Zvcm06InRyYW5zbGF0ZSgwcHgsMHB4KSBzY2FsZSgxLDEpIixvcGFjaXR5OjEsb2Zmc2V0OjF9XSx7ZHVyYXRpb246dSxkZWxheToxMDUwLGZpbGw6ImJvdGgifSksc2V0VGltZW91dChmdW5jdGlvbigpe2kuZ2V0QW5pbWF0aW9ucygpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jYW5jZWwoKX0pLGkuc3R5bGUub3BhY2l0eT0iIixpLnN0eWxlLnRyYW5zZm9ybT0iIixuLmNsYXNzTGlzdC5yZW1vdmUoImxpZnQiKSxlc3hUYWcmJihlc3hUYWcuY2xhc3NMaXN0LnJlbW92ZSgidGFnLXdhaXQiKSxlc3hUYWcuY2xhc3NMaXN0LmFkZCgidGFnLWluIikpfSwyMjcwKX19KCksZnVuY3Rpb24oKXtpZigoIXdpbmRvdy5tYXRjaE1lZGlhfHwhd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIikubWF0Y2hlcykmJiJJbnRlcnNlY3Rpb25PYnNlcnZlciJpbiB3aW5kb3cpe2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCJtbyIpO3ZhciBlPVsiLnN0YWNrID4gLml0ZW0iLCIuYWNjLWl0ZW0iLCIuZmFxLWl0ZW0iLCIuYm91dCIsIi52c3RvcnkiLCIudGtib3giLCIuYWItZnJhbWUiLCIuY21wIHRib2R5IHRkIiwiLmNtcCB0aGVhZCB0aCIsIi50YXBlLWNlbGwiLCIudnMtcm93IiwiLnZlbnVlLXNwZWNzID4gKiIsIi56cC10aWVyIiwiLnRrZ3JpZCB0ZCIsIi5zdGF0cyA+IC5zdGF0IiwiLnN0YXRzID4gLnN0IiwiLnZpdGFscyA+IC52aXRhbCIsIi5oZXJvLW1ldGEgPiAuaG0iLCIudGllcnMgPiAudGllciIsIi52Z3JpZCA+IC52YmxvY2siLCIua2MtY2FyZCIsIi5hYi1zcGVjIiwiLmluYy1saXN0ID4gbGkiLCIuYXJ0cyA+IC5hcnQiLCIuZm9yayA+IC5yb3V0ZSIsIi5jYXRhbG9ndWUgLm5jYXJkIiwiLm9jYXJkIiwiLnBjYXJkIiwiLmJjYXJkIiwiLnBjYXJkcCIsIi5maXZldy1ncmlkID4gKiIsIi5sb2dvcyA+IC5sb2dvIiwiLmVzbS1iYW5kIiwiLm1hcC1jaGlwIiwiLnRhcGUtZ3JpZCA+IC50YXBlLWNlbGwiLCIuZ2NhcmQiXSx0PWUuam9pbigiLCIpO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLW1vXSIpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5tYXRjaGVzKHQpfHxlLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1tbyIpfSk7dmFyIG49W107aWYoZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0LGE9bnVsbCxvPTA7dHJ5e3Q9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlKX1jYXRjaChpKXtyZXR1cm59dC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCFlLmhhc0F0dHJpYnV0ZSgiZGF0YS1tbyIpKXt2YXIgdD1lLnBhcmVudE5vZGU7bz10PT09YT9vKzE6MCxhPXQsZS5zZXRBdHRyaWJ1dGUoImRhdGEtbW8iLCIiKSxlLnN0eWxlLnNldFByb3BlcnR5KCItLW1vLWQiLE1hdGgubWluKDUwKm8sMzAwKSsibXMiKSxuLnB1c2goZSl9fSl9KSxuLmxlbmd0aCl7dmFyIGE9bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGUpe2UuZm9yRWFjaChmdW5jdGlvbihlKXtlLmlzSW50ZXJzZWN0aW5nJiYoZS50YXJnZXQuY2xhc3NMaXN0LmFkZCgibW8tbGl0IiksYS51bm9ic2VydmUoZS50YXJnZXQpKX0pfSx7cm9vdE1hcmdpbjoiMHB4IDBweCAtNiUgMHB4Iix0aHJlc2hvbGQ6LjA1fSk7bi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Eub2JzZXJ2ZShlKX0pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtuLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoIWUuY2xhc3NMaXN0LmNvbnRhaW5zKCJtby1saXQiKSl7dmFyIHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0LnRvcDxpbm5lckhlaWdodCYmdC5ib3R0b20+MCYmZS5jbGFzc0xpc3QuYWRkKCJtby1saXQiKX19KX0sNGUzKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCFlLmNsYXNzTGlzdC5jb250YWlucygibW8tbGl0Iikpe3ZhciB0PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dC50b3A8aW5uZXJIZWlnaHQmJnQuYm90dG9tPjAmJnQuaGVpZ2h0JiZlLmNsYXNzTGlzdC5hZGQoIm1vLWxpdCIpfX0pfSw2MCl9KX19fSgpLGZ1bmN0aW9uKCl7WyJ4cUZvcm0iLCJyZmkiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpO3QmJnQuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IixmdW5jdGlvbihlKXt0LmNoZWNrVmFsaWRpdHkoKSYmKCh0LmdldEF0dHJpYnV0ZSgiZGF0YS1lbmRwb2ludCIpfHwiIikudHJpbSgpfHwod2luZG93LmxvY2F0aW9uLmhyZWY9ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1lLnF1ZXJ5U2VsZWN0b3IoIltuYW1lPWV2ZW50LW5hbWVdIik7cmV0dXJuIG4mJnQucHVzaCgiRW5xdWlyeTogIituLnZhbHVlKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0Om5vdChbdHlwZT1oaWRkZW5dKSxzZWxlY3QsdGV4dGFyZWEiKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciBhPWUucXVlcnlTZWxlY3RvcignbGFiZWxbZm9yPSInK24uaWQrJyJdJyksbz1hP2EudGV4dENvbnRlbnQudHJpbSgpOm4ubmFtZXx8bi5pZDtuLnZhbHVlJiZ0LnB1c2gobysiOiAiK24udmFsdWUpfSksIm1haWx0bzppbmZvQGVzLXNwb3J0LmFlP3N1YmplY3Q9IitlbmNvZGVVUklDb21wb25lbnQoKG4/bi52YWx1ZToiV2Vic2l0ZSBlbnF1aXJ5IikrIiAtIGVucXVpcnkiKSsiJmJvZHk9IitlbmNvZGVVUklDb21wb25lbnQodC5qb2luKCJcbiIpKX0odCkpKX0sITApfSk7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInhxTW9kYWwiKTtpZihlJiYhZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoImRhdGEteHEtbmF0aXZlIikpe3ZhciB0LG49d2luZG93Lm1hdGNoTWVkaWEmJm1hdGNoTWVkaWEoIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIikubWF0Y2hlcyxhPW51bGw7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtb3Blbi14cV0iKS5mb3JFYWNoKGZ1bmN0aW9uKG8pe28uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGkpe2kucHJldmVudERlZmF1bHQoKSxmdW5jdGlvbihvKXtjbGVhclRpbWVvdXQodCksYT1vLGUuaGlkZGVuPSExLGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsZS5vZmZzZXRXaWR0aCxlLmNsYXNzTGlzdC5hZGQoImlzLW9wZW4iKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIHQ9ZS5xdWVyeVNlbGVjdG9yKCJpbnB1dDpub3QoW3R5cGU9aGlkZGVuXSkiKTt0JiZ0LmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSl9LG4/MDoyNjApfShvKX0pfSksZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtY2xvc2UteHFdIikuZm9yRWFjaChmdW5jdGlvbihlKXtlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixpKX0pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZ1bmN0aW9uKHQpeyJFc2NhcGUiIT09dC5rZXl8fGUuaGlkZGVufHxpKCl9KTt2YXIgbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieHFGb3JtIik7byYmby5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLGZ1bmN0aW9uKGUpe2lmKGUucHJldmVudERlZmF1bHQoKSxvLmNoZWNrVmFsaWRpdHkoKSl7dmFyIHQ9by5nZXRBdHRyaWJ1dGUoImRhdGEtZW5kcG9pbnQiKSxuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4cVNlbnQiKSxhPWZ1bmN0aW9uKCl7biYmbi5jbGFzc0xpc3QuYWRkKCJvbiIpO28ucmVzZXQoKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7biYmbi5jbGFzc0xpc3QucmVtb3ZlKCJvbiIpfSw3MDAwKX07dD9mZXRjaCh0LHttZXRob2Q6IlBPU1QiLGJvZHk6bmV3IEZvcm1EYXRhKG8pfSkudGhlbihhKS5jYXRjaChhKTphKCl9ZWxzZSBvLnJlcG9ydFZhbGlkaXR5KCl9KX1mdW5jdGlvbiBpKCl7ZS5oaWRkZW58fChlLmNsYXNzTGlzdC5yZW1vdmUoImlzLW9wZW4iKSxjbGVhclRpbWVvdXQodCksdD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5oaWRkZW49ITAsZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz0iIixhJiZhLmZvY3VzJiZhLmZvY3VzKCksYT1udWxsfSxuPzA6MzYwKSl9fSgpfSgpOwo7KGZ1bmN0aW9uKCl7dmFyIG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5hdiIpO2lmKCFuKXJldHVybjt2YXIgZj1mdW5jdGlvbigpe24uY2xhc3NMaXN0LnRvZ2dsZSgic2Nyb2xsZWQiLHdpbmRvdy5zY3JvbGxZPjYwKX07ZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwYWdlc2hvdyIsZik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGYpO30pKCk7Ci8qIGV2ZW50LWV4dHJhcy5qczogYmVoYXZpb3VycyBmb3IgYXJjaGV0eXBlIEMgZXZlbnQgcGFnZXMsIGFwcGVuZGVkIGFmdGVyIG1haW4tanMuZGVjb2RlZC5qcwogICAxLiAuYWNjLWl0ZW0gYWNjb3JkaW9uIChGQVEpICAgICAgICAgIDIuIC5lcy1kZCBleHBhbmRhYmxlIHBhbmVscwogICAzLiBoZXJvIHN0YXQgY291bnQtdXAgKHJlZHVjZWQtbW90aW9uIHNhZmUpICAgNC4gcGFja2FnZSBjYXJkIC0+IGVucXVpcnkgbW9kYWwgcHJlLWZpbGwKICAgUnVsZXM6IG5vIHJlZ2V4IGxpdGVyYWxzLCBubyAtLSBkZWNyZW1lbnQgKExpdGVTcGVlZCBtaW5pZmllci1ob3N0aWxlIHRva2VucykuICovCihmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjsKdmFyIHJlZHVjZT13aW5kb3cubWF0Y2hNZWRpYSYmd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIikubWF0Y2hlczsKLyogMSArIDI6IG9uZSBhY2NvcmRpb24gbWVjaGFuaWMgKi8KZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmFjYy1pdGVtIikuZm9yRWFjaChmdW5jdGlvbihpdGVtKXt2YXIgcT1pdGVtLnF1ZXJ5U2VsZWN0b3IoIi5hY2MtcSIpO2lmKCFxKXJldHVybjtxLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3ZhciBvcGVuPWl0ZW0uY2xhc3NMaXN0LnRvZ2dsZSgib3BlbiIpO3Euc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIixvcGVuPyJ0cnVlIjoiZmFsc2UiKTt9KTt9KTsKZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmVzLWRkIikuZm9yRWFjaChmdW5jdGlvbihkZCl7dmFyIGhlYWQ9ZGQucXVlcnlTZWxlY3RvcigiLmVzLWRkX19oZWFkIik7aWYoIWhlYWQpcmV0dXJuO2hlYWQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIG9wZW49ZGQuZ2V0QXR0cmlidXRlKCJkYXRhLW9wZW4iKT09PSJ0cnVlIjtkZC5zZXRBdHRyaWJ1dGUoImRhdGEtb3BlbiIsb3Blbj8iZmFsc2UiOiJ0cnVlIik7aGVhZC5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLG9wZW4/ImZhbHNlIjoidHJ1ZSIpO30pO30pOwovKiAzOiBzdGF0IGNvdW50LXVwICovCnZhciBudW1zPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5zdGF0cyAuc3RhdCAubiIpOwppZihudW1zLmxlbmd0aCl7CiAgdmFyIHJ1bj1mdW5jdGlvbihlbCl7dmFyIHNyYz1lbC50ZXh0Q29udGVudC50cmltKCk7dmFyIGk9MCxwcmU9IiIsZGlnaXRzPSIiLHN1Zj0iIjt3aGlsZShpPHNyYy5sZW5ndGgmJihzcmMuY2hhckF0KGkpPCIwInx8c3JjLmNoYXJBdChpKT4iOSIpKXtwcmUrPXNyYy5jaGFyQXQoaSk7aSs9MTt9d2hpbGUoaTxzcmMubGVuZ3RoJiYoKHNyYy5jaGFyQXQoaSk+PSIwIiYmc3JjLmNoYXJBdChpKTw9IjkiKXx8c3JjLmNoYXJBdChpKT09PSIsIikpe2lmKHNyYy5jaGFyQXQoaSkhPT0iLCIpZGlnaXRzKz1zcmMuY2hhckF0KGkpO2krPTE7fXN1Zj1zcmMuc2xpY2UoaSk7aWYoIWRpZ2l0cyl7cmV0dXJuO312YXIgdGFyZ2V0PXBhcnNlSW50KGRpZ2l0cywxMCkscGFkPWRpZ2l0cy5sZW5ndGgsdXNlQ29tbWE9c3JjLmluZGV4T2YoIiwiKT4tMTt2YXIgZm10PWZ1bmN0aW9uKG4pe3ZhciBzPVN0cmluZyhuKTt3aGlsZShzLmxlbmd0aDxwYWQmJmRpZ2l0cy5jaGFyQXQoMCk9PT0iMCIpcz0iMCIrcztpZih1c2VDb21tYSl7dmFyIG91dD0iIixjPTAsaj1zLmxlbmd0aC0xO3doaWxlKGo+PTApe291dD1zLmNoYXJBdChqKStvdXQ7Yys9MTtpZihjJTM9PT0wJiZqPjApb3V0PSIsIitvdXQ7ai09MTt9cz1vdXQ7fXJldHVybiBwcmUrcytzdWY7fTtpZihyZWR1Y2V8fHRhcmdldD45OTk5KXtlbC50ZXh0Q29udGVudD1zcmM7cmV0dXJuO312YXIgdDA9bnVsbCxkdXI9MTQwMDt2YXIgc3RlcD1mdW5jdGlvbih0cyl7aWYodDA9PT1udWxsKXQwPXRzO3ZhciBwPU1hdGgubWluKDEsKHRzLXQwKS9kdXIpO3ZhciBlPTEtTWF0aC5wb3coMS1wLDMpO2VsLnRleHRDb250ZW50PWZtdChNYXRoLnJvdW5kKHRhcmdldCplKSk7aWYocDwxKXJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTtlbHNlIGVsLnRleHRDb250ZW50PXNyYzt9O3JlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTt9OwogIGlmKCJJbnRlcnNlY3Rpb25PYnNlcnZlciJpbiB3aW5kb3cmJiFyZWR1Y2Upe3ZhciBpbz1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcyl7ZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVuKXtpZihlbi5pc0ludGVyc2VjdGluZyl7cnVuKGVuLnRhcmdldCk7aW8udW5vYnNlcnZlKGVuLnRhcmdldCk7fX0pO30se3RocmVzaG9sZDouNH0pO251bXMuZm9yRWFjaChmdW5jdGlvbihuKXtpby5vYnNlcnZlKG4pO30pO30KfQovKiA0OiBwYWNrYWdlIGNhcmRzIGFuZCBDVEFzIGNhcnJ5aW5nIGRhdGEtY2F0IHByZS1maWxsIHRoZSBlbnF1aXJ5IGZvcm0gKi8KZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtb3Blbi1yZmldW2RhdGEtY2F0XSIpLmZvckVhY2goZnVuY3Rpb24oYnRuKXtidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGNhdD1idG4uZ2V0QXR0cmlidXRlKCJkYXRhLWNhdCIpfHwiIjt2YXIgc2VsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmLWNhdCIpO2lmKHNlbCl7Zm9yKHZhciBrPTA7azxzZWwub3B0aW9ucy5sZW5ndGg7ays9MSl7aWYoc2VsLm9wdGlvbnNba10udGV4dD09PWNhdCl7c2VsLnNlbGVjdGVkSW5kZXg9azticmVhazt9fX12YXIgaD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcmZpIGlucHV0W25hbWU9ZWViX2NhdGVnb3J5XSIpO2lmKGgpaC52YWx1ZT1jYXQ7fSx0cnVlKTt9KTsKfSkoKTsK