DIR : /home/kozerus/public_html/zm_20211006_0000.html

/home/kozerus/public_html

<!DOCTYPE html>
	<head>
		<title>zm.html 20210617_1130 zmid zmurl window.location.search</title>
<!--        
		<title>index_vu.html 20200212_2000 video_players index.mp4</title>
		<title>index_vu.html 20200212_2000 video_players jtfdcr jtfinc jtfdc</title>
		<title>index_vu.html 20200212_1600 mp4 skwii_dollycall </title>
		<title>index_vu.html 20200211_1230 mp4 huckleberry dogheads </title>
		<title>index_vu.html 20200211_0500 giphy_view19-22_link </title>
		<title>index_vu.html 20200210_2100 giphy_view30_link </title>
		<title>index_vu.html 20200210_1800 jax_yt.txt</title>
		<title>index_vu.html 20200210_1600 jtfdcr_video_2016-2019</title>
		<title>index_vu.html 20200210_1230 ytlist_text_1000</title>
		<title>index_vu.html 20200210_1200 ytlist_jax jax</title>
		<title>index_vu.html 20200204_0100 ytlist_load_ajax</title>
		<title>index_vu.html 20200204_0100 tl_source</title>
		<title>index_vu.html 20200203_0800 kogrid</title>
		<title>index_vu.html 20200202_2300 div_hide</title>
		<title>index_vu.html 20200202_1800 ytlist_img i.ytimg.com </title>
		<title>index_vu.html 20200202_1730 ytlist_img i.ytimg.com </title>
		<title>index_vu.html 20200202_1540 ytlist_img i.ytimg.com </title>
		<title>index_vu.html 20190130_0100 ytlist</title>
		<title>index_vu.html 20190129_2200 ytlist</title>
		<title>index_vu.html 20190129_1900 ytlist</title>
		<title>index_vu.html 20190129_0330 avid redir rehab</title>
		<title>index_vu.html 20190124_1500 preview jtfdc_wingvehecles/</title>
		<title>index_vu.html 20190121_2100 preview script_avlist/</title>
		<title>index_vu.html 20190121_2100 preview youttube search/</title>
		<title>index_vu.html 20190113_2130 s/index_??.html/index_vu.html/</title>
					width:		'1400',
		<title>index_vu.html 20190113_1143 width=1400</title>
		<title>index_tl.html 20190112_0400 width=1400</title>
		<title>index_tl.html 20190109_2000 </title>
		<title>index_tl.html 20190101_1800</title>
		<script type="text/javascript" src="/zm/ZoomifyImageViewer.js"></script>
 -->
	<style>
	@font-face {
		font-family: yokkmokkOT;
		src: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
		}

	@font-face {
		font-family: 'yokkmokkOT_file';
		src: url('/fonts/yokkmokkOT.otf'); /* IE 5-8 */ 
		src: local('?'),             /* sneakily trick IE */
	        url('/fonts/yokkmokk.ttf') format('truetype'), /* Opera, Safari */
	        url('/fonts/yokkmokkOT.woff') format('woff'),    /* FF 3.6, Chrome 5, IE9 */
	        url('/fonts/yokkmokkOT.svg#font') format('svg'); /* iOS */
		}

		body { 
//			background: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
			background-color: lightblue;
			background-color: darkslategrey;
			background-color: darkgreyslate;
//			color: black;
			color: white;
			font-size:62.5%; 
			font-family: "New Times Roman";
			font-family: "serif";
			font-family: "sans-serif";
			font-family: "courier";
			font-family: "monospace";
			font-family: cursive;
			font-family: fantasy;
			font-family: yokkmokkOT;
			font-family: "arial";
			font-size: 38pt;
			}

//		h1 { font-size: 2.4em; } /* =24px */
		h1 { font-size: 14pt; } /* =24px */
		h2 { font-size: 12pt; } /* =24px */
		p  { font-size: 10pt; } /* =14px */
		li { font-size: 20pt; } /* =14px? */
		</style>

<!--
	<style id="style_index_vue">
//			h1 { font-size: 2.4em; } /* =24px */
			h1 { font-size: 128pt; color: ivory; font-family: yokkmokkOT; } /* =24px */
			h2 { font-size: 32pt; } /* =24px */
			h3 { font-size: 18pt; color: grey; font-family: "times new roman"; } /* =24px */
			h4 { font-size: 14pt; color: grey; font-family: "times new roman"; } /* =24px */
			p  { font-size: 10pt; } /* =14px */
			dl { font-size: 20pt; color: ivory; font-family: arial;  } /* =14px? */
			dd { font-size: 18pt; color: ivory; font-family: arial;  } /* =14px? */

			ol { font-size: 20pt; color: ivory; font-family: "times new roman";  } /* =14px? */
			li { font-size: 18pt; color: ivory; font-family: "times new roman";  } /* =14px? */


			.detail_default {          
				background: darkslategrey;
				width: 35%;
				padding: 20px;
				border: 1px solid black;
				font-family: yokkmokkOT;
				color: ivory;
				}

		.detail_new {          
			background: lightblue;
			width: 35%;
			padding: 20px;
			border: 1px solid black;
			font-family: garamond;
			}
		.detail_focus {          
			background: lightblue;
			width: 35%;
			padding: 20px;
			border: 1px solid black;
			font-family: garamond;
			}
		.detail_byrdpucker {          
			background: lightblue;
			width: 35%;
			padding: 20px;
			border: 1px solid black;
			font-family: garamond;
			}
		.detail_iperms  {          
			background: green;
			width: 35%;
			padding: 20px;
			border: 1px solid black;
			font-family: ariel;
			}
		.detail_jkwii {          
			background: red;
			width: 35%;
			padding: 20px;
			border: 1px solid black;
			font-family: times new roman;
			}
		.detail_jtfdc {          
			background: lightblue;
			width: 35%;
			padding: 20px;
			border: 1px solid black;
			font-family: garamond;
			}
		.detail_jtfinc {          
			background: yellow;
			width: 35%;
			padding: 20px;
			border: 1px solid black;
			font-family: garamond;
			}
		.detail_kassil {          
			background: blue;
			width: 35%;
			padding: 20px;
			border: 1px solid black;
			font-family: garamond;
			}
		.detail_konabus {          
			background: blue;
			width: 35%;
			padding: 20px;
			border: 1px solid black;
			font-family: ariel;
			}
		.detail_konet {          
			background: blue;
			width: 35%;
			padding: 20px;
			border: 1px solid black;
			font-family: comic sans ms;
			}
		.detail_kou {          
			background: blue;
			width: 35%;
			padding: 20px;
			border: 1px solid black;
			font-family: courier new;
			}
		.detail_old {          
			background: blue;
			width: 35%;
			padding: 20px;
			border: 1px solid black;
			font-family: courier new;
			}
		.detail_av {          
			background: blue;
			width: 35%;
			padding: 20px;
			border: 1px solid black;
			font-family: courier new;
			}
			</style>    
	-->

<!--
	<style id="style_popover" >
		.popover  {
			position: relative;
			float: left;
			padding: 5px;
			/*z-ka1: 0;*/
			}
		.popover:hover {
			background-color: darkSlategrey;
//			background-color: #e9e9e2;
			/*z-ka1: 50;*/
//			color: white;
			color: ivory;
//			color: #335500;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.popover span { 
			position: absolute; 
//			background-color: #e5e5e5;
			background-color: darkSlategrey;
			padding: 5px;
			/*left: -1000px;*/
			border: 1px solid #666;
			visibility: hidden;
			color: ivory;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.popover span img { 
			border-width: 0px; 
			/*padding: 2px;*/
			}
		
/*CSS for enlarged image on hover*/
		.popover:hover span { 
			visibility: visible; 
//			width: 200px;
			top: 0px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 0px;/*position where enlarged image should offset horizontally */
			}
		</style>
	-->

	<style id="style_thumbnail" >
		.thumbnail  {
			position: relative;
			float: left;
			padding: 5px;
			/*z-ka1: 0;*/
			}
		.thumbnail:hover {
//			background-color: #e9e9e2;
			background-color: darkslategrey;
			/*z-ka1: 50;*/
//			color: #335500;
			color: ivory;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.thumbnail span { 
			position: absolute; 
//			background-color: #e5e5e5;
			background-color: darkSlategrey;
			padding: 5px;
			/*left: -1000px;*/
			border: 1px solid #666;
			visibility: hidden;
//			color: black;
			color: ivory;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.thumbnail span img { 
			border-width: 0px; 
			/*padding: 2px;*/
			}
		
/*CSS for enlarged image on hover*/
		.thumbnail:hover span { 
			visibility: visible; 
			width: 200px;
			top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 300px;/*position where enlarged image should offset horizontally */
			}
		
		/*THUMBNAIL2 - thumbnail2 has border and border on hover*/
		.thumbnail2 {
			position: relative;
			float: left;
			padding: 5px;
			/*z-ka1: 0;*/
			}
		.thumbnail2:hover { 
//			background-color: #e9e9e2;
			background-color: darkSlategrey;
			/*z-ka1: 50;*/
//			color: #335500;
			color: ivory;
			text-decoration: none;
			}
		.thumbnail2 span { /*CSS for enlarged image*/
			position: absolute;
			background-color: darkSlategrey;
//			background-color: #e5e5e5;
			padding: 5px;
			/*left: -1000px;*/
			border: 1px solid #666;
			visibility: hidden;
//			color: black;
			color: ivory;
			text-decoration: none;
			}
		
/*CSS for enlarged image*/
		.thumbnail2 span img { border-width: 0px;}
/*CSS for enlarged image on hover*/
		.thumbnail2:hover span { 
			visibility: visible; width: 208px;
			top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 300px;/*position where enlarged image should offset horizontally */
			}
		a.thumbnail2 img { text-decoration:none; z-ka1: 50; }
		
/*if same attribute for all 4 states, then declare here in a.thumbnail2*/ 
		a.thumbnail2 img:link { border: 2px solid #e9e9e2; background: transparent; }
		a.thumbnail2 img:visited { border: 2px solid #e9e9e2; background : transparent; }
		a.thumbnail2 img:hover { border: 2px solid #f00; background : transparent; }
		a.thumbnail2 img:active { border: 2px solid #e9e9e2; background : transparent; }
		a.thumbnail2 img { border: 2px solid #e9e9e2; }
		</style>
<!--
	-->


<!--
	-->
		<!-- SCRIPTS -->
<!--		<script type="text/javascript" src="js/libraries/jquery-2.1.1.min.js"></script> -->
<!--		<script type="text/javascript" src="/js/vue.js" > -->
		<script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIFZ1ZS5qcyB2Mi41LjE3CiAqIChjKSAyMDE0LTIwMTggRXZhbiBZb3UKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogKi8KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDoKCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6CgkoZ2xvYmFsLlZ1ZSA9IGZhY3RvcnkoKSk7Cn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOwoKLyogICovCgp2YXIgZW1wdHlPYmplY3QgPSBPYmplY3QuZnJlZXplKHt9KTsKCi8vIHRoZXNlIGhlbHBlcnMgcHJvZHVjZXMgYmV0dGVyIHZtIGNvZGUgaW4gSlMgZW5naW5lcyBkdWUgdG8gdGhlaXIKLy8gZXhwbGljaXRuZXNzIGFuZCBmdW5jdGlvbiBpbmxpbmluZwpmdW5jdGlvbiBpc1VuZGVmICh2KSB7CiAgcmV0dXJuIHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsCn0KCmZ1bmN0aW9uIGlzRGVmICh2KSB7CiAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsCn0KCmZ1bmN0aW9uIGlzVHJ1ZSAodikgewogIHJldHVybiB2ID09PSB0cnVlCn0KCmZ1bmN0aW9uIGlzRmFsc2UgKHYpIHsKICByZXR1cm4gdiA9PT0gZmFsc2UKfQoKLyoqCiAqIENoZWNrIGlmIHZhbHVlIGlzIHByaW1pdGl2ZQogKi8KZnVuY3Rpb24gaXNQcmltaXRpdmUgKHZhbHVlKSB7CiAgcmV0dXJuICgKICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwKICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwKICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgdHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJyB8fAogICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicKICApCn0KCi8qKgogKiBRdWljayBvYmplY3QgY2hlY2sgLSB0aGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIHRlbGwKICogT2JqZWN0cyBmcm9tIHByaW1pdGl2ZSB2YWx1ZXMgd2hlbiB3ZSBrbm93IHRoZSB2YWx1ZQogKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuCiAqLwpmdW5jdGlvbiBpc09iamVjdCAob2JqKSB7CiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jwp9CgovKioKICogR2V0IHRoZSByYXcgdHlwZSBzdHJpbmcgb2YgYSB2YWx1ZSBlLmcuIFtvYmplY3QgT2JqZWN0XQogKi8KdmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CgpmdW5jdGlvbiB0b1Jhd1R5cGUgKHZhbHVlKSB7CiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSkKfQoKLyoqCiAqIFN0cmljdCBvYmplY3QgdHlwZSBjaGVjay4gT25seSByZXR1cm5zIHRydWUKICogZm9yIHBsYWluIEphdmFTY3JpcHQgb2JqZWN0cy4KICovCmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QgKG9iaikgewogIHJldHVybiBfdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBPYmplY3RdJwp9CgpmdW5jdGlvbiBpc1JlZ0V4cCAodikgewogIHJldHVybiBfdG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgUmVnRXhwXScKfQoKLyoqCiAqIENoZWNrIGlmIHZhbCBpcyBhIHZhbGlkIGFycmF5IGluZGV4LgogKi8KZnVuY3Rpb24gaXNWYWxpZEFycmF5SW5kZXggKHZhbCkgewogIHZhciBuID0gcGFyc2VGbG9hdChTdHJpbmcodmFsKSk7CiAgcmV0dXJuIG4gPj0gMCAmJiBNYXRoLmZsb29yKG4pID09PSBuICYmIGlzRmluaXRlKHZhbCkKfQoKLyoqCiAqIENvbnZlcnQgYSB2YWx1ZSB0byBhIHN0cmluZyB0aGF0IGlzIGFjdHVhbGx5IHJlbmRlcmVkLgogKi8KZnVuY3Rpb24gdG9TdHJpbmcgKHZhbCkgewogIHJldHVybiB2YWwgPT0gbnVsbAogICAgPyAnJwogICAgOiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JwogICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbCwgbnVsbCwgMikKICAgICAgOiBTdHJpbmcodmFsKQp9CgovKioKICogQ29udmVydCBhIGlucHV0IHZhbHVlIHRvIGEgbnVtYmVyIGZvciBwZXJzaXN0ZW5jZS4KICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCBzdHJpbmcuCiAqLwpmdW5jdGlvbiB0b051bWJlciAodmFsKSB7CiAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbCk7CiAgcmV0dXJuIGlzTmFOKG4pID8gdmFsIDogbgp9CgovKioKICogTWFrZSBhIG1hcCBhbmQgcmV0dXJuIGEgZnVuY3Rpb24gZm9yIGNoZWNraW5nIGlmIGEga2V5CiAqIGlzIGluIHRoYXQgbWFwLgogKi8KZnVuY3Rpb24gbWFrZU1hcCAoCiAgc3RyLAogIGV4cGVjdHNMb3dlckNhc2UKKSB7CiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgdmFyIGxpc3QgPSBzdHIuc3BsaXQoJywnKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgIG1hcFtsaXN0W2ldXSA9IHRydWU7CiAgfQogIHJldHVybiBleHBlY3RzTG93ZXJDYXNlCiAgICA/IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWwudG9Mb3dlckNhc2UoKV07IH0KICAgIDogZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gbWFwW3ZhbF07IH0KfQoKLyoqCiAqIENoZWNrIGlmIGEgdGFnIGlzIGEgYnVpbHQtaW4gdGFnLgogKi8KdmFyIGlzQnVpbHRJblRhZyA9IG1ha2VNYXAoJ3Nsb3QsY29tcG9uZW50JywgdHJ1ZSk7CgovKioKICogQ2hlY2sgaWYgYSBhdHRyaWJ1dGUgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUuCiAqLwp2YXIgaXNSZXNlcnZlZEF0dHJpYnV0ZSA9IG1ha2VNYXAoJ2tleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzJyk7CgovKioKICogUmVtb3ZlIGFuIGl0ZW0gZnJvbSBhbiBhcnJheQogKi8KZnVuY3Rpb24gcmVtb3ZlIChhcnIsIGl0ZW0pIHsKICBpZiAoYXJyLmxlbmd0aCkgewogICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICByZXR1cm4gYXJyLnNwbGljZShpbmRleCwgMSkKICAgIH0KICB9Cn0KCi8qKgogKiBDaGVjayB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eS4KICovCnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CmZ1bmN0aW9uIGhhc093biAob2JqLCBrZXkpIHsKICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkKfQoKLyoqCiAqIENyZWF0ZSBhIGNhY2hlZCB2ZXJzaW9uIG9mIGEgcHVyZSBmdW5jdGlvbi4KICovCmZ1bmN0aW9uIGNhY2hlZCAoZm4pIHsKICB2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHJldHVybiAoZnVuY3Rpb24gY2FjaGVkRm4gKHN0cikgewogICAgdmFyIGhpdCA9IGNhY2hlW3N0cl07CiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSkKICB9KQp9CgovKioKICogQ2FtZWxpemUgYSBoeXBoZW4tZGVsaW1pdGVkIHN0cmluZy4KICovCnZhciBjYW1lbGl6ZVJFID0gLy0oXHcpL2c7CnZhciBjYW1lbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKGNhbWVsaXplUkUsIGZ1bmN0aW9uIChfLCBjKSB7IHJldHVybiBjID8gYy50b1VwcGVyQ2FzZSgpIDogJyc7IH0pCn0pOwoKLyoqCiAqIENhcGl0YWxpemUgYSBzdHJpbmcuCiAqLwp2YXIgY2FwaXRhbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7CiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKQp9KTsKCi8qKgogKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLgogKi8KdmFyIGh5cGhlbmF0ZVJFID0gL1xCKFtBLVpdKS9nOwp2YXIgaHlwaGVuYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChzdHIpIHsKICByZXR1cm4gc3RyLnJlcGxhY2UoaHlwaGVuYXRlUkUsICctJDEnKS50b0xvd2VyQ2FzZSgpCn0pOwoKLyoqCiAqIFNpbXBsZSBiaW5kIHBvbHlmaWxsIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpdC4uLiBlLmcuCiAqIFBoYW50b21KUyAxLnguIFRlY2huaWNhbGx5IHdlIGRvbid0IG5lZWQgdGhpcyBhbnltb3JlIHNpbmNlIG5hdGl2ZSBiaW5kIGlzCiAqIG5vdyBtb3JlIHBlcmZvcm1hbnQgaW4gbW9zdCBicm93c2VycywgYnV0IHJlbW92aW5nIGl0IHdvdWxkIGJlIGJyZWFraW5nIGZvcgogKiBjb2RlIHRoYXQgd2FzIGFibGUgdG8gcnVuIGluIFBoYW50b21KUyAxLngsIHNvIHRoaXMgbXVzdCBiZSBrZXB0IGZvcgogKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICovCgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwpmdW5jdGlvbiBwb2x5ZmlsbEJpbmQgKGZuLCBjdHgpIHsKICBmdW5jdGlvbiBib3VuZEZuIChhKSB7CiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICByZXR1cm4gbAogICAgICA/IGwgPiAxCiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cykKICAgICAgICA6IGZuLmNhbGwoY3R4LCBhKQogICAgICA6IGZuLmNhbGwoY3R4KQogIH0KCiAgYm91bmRGbi5fbGVuZ3RoID0gZm4ubGVuZ3RoOwogIHJldHVybiBib3VuZEZuCn0KCmZ1bmN0aW9uIG5hdGl2ZUJpbmQgKGZuLCBjdHgpIHsKICByZXR1cm4gZm4uYmluZChjdHgpCn0KCnZhciBiaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQKICA/IG5hdGl2ZUJpbmQKICA6IHBvbHlmaWxsQmluZDsKCi8qKgogKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS4KICovCmZ1bmN0aW9uIHRvQXJyYXkgKGxpc3QsIHN0YXJ0KSB7CiAgc3RhcnQgPSBzdGFydCB8fCAwOwogIHZhciBpID0gbGlzdC5sZW5ndGggLSBzdGFydDsKICB2YXIgcmV0ID0gbmV3IEFycmF5KGkpOwogIHdoaWxlIChpLS0pIHsKICAgIHJldFtpXSA9IGxpc3RbaSArIHN0YXJ0XTsKICB9CiAgcmV0dXJuIHJldAp9CgovKioKICogTWl4IHByb3BlcnRpZXMgaW50byB0YXJnZXQgb2JqZWN0LgogKi8KZnVuY3Rpb24gZXh0ZW5kICh0bywgX2Zyb20pIHsKICBmb3IgKHZhciBrZXkgaW4gX2Zyb20pIHsKICAgIHRvW2tleV0gPSBfZnJvbVtrZXldOwogIH0KICByZXR1cm4gdG8KfQoKLyoqCiAqIE1lcmdlIGFuIEFycmF5IG9mIE9iamVjdHMgaW50byBhIHNpbmdsZSBPYmplY3QuCiAqLwpmdW5jdGlvbiB0b09iamVjdCAoYXJyKSB7CiAgdmFyIHJlcyA9IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoYXJyW2ldKSB7CiAgICAgIGV4dGVuZChyZXMsIGFycltpXSk7CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyoqCiAqIFBlcmZvcm0gbm8gb3BlcmF0aW9uLgogKiBTdHViYmluZyBhcmdzIHRvIG1ha2UgRmxvdyBoYXBweSB3aXRob3V0IGxlYXZpbmcgdXNlbGVzcyB0cmFuc3BpbGVkIGNvZGUKICogd2l0aCAuLi5yZXN0IChodHRwczovL2Zsb3cub3JnL2Jsb2cvMjAxNy8wNS8wNy9TdHJpY3QtRnVuY3Rpb24tQ2FsbC1Bcml0eS8pCiAqLwpmdW5jdGlvbiBub29wIChhLCBiLCBjKSB7fQoKLyoqCiAqIEFsd2F5cyByZXR1cm4gZmFsc2UuCiAqLwp2YXIgbm8gPSBmdW5jdGlvbiAoYSwgYiwgYykgeyByZXR1cm4gZmFsc2U7IH07CgovKioKICogUmV0dXJuIHNhbWUgdmFsdWUKICovCnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9OwoKLyoqCiAqIEdlbmVyYXRlIGEgc3RhdGljIGtleXMgc3RyaW5nIGZyb20gY29tcGlsZXIgbW9kdWxlcy4KICovCmZ1bmN0aW9uIGdlblN0YXRpY0tleXMgKG1vZHVsZXMpIHsKICByZXR1cm4gbW9kdWxlcy5yZWR1Y2UoZnVuY3Rpb24gKGtleXMsIG0pIHsKICAgIHJldHVybiBrZXlzLmNvbmNhdChtLnN0YXRpY0tleXMgfHwgW10pCiAgfSwgW10pLmpvaW4oJywnKQp9CgovKioKICogQ2hlY2sgaWYgdHdvIHZhbHVlcyBhcmUgbG9vc2VseSBlcXVhbCAtIHRoYXQgaXMsCiAqIGlmIHRoZXkgYXJlIHBsYWluIG9iamVjdHMsIGRvIHRoZXkgaGF2ZSB0aGUgc2FtZSBzaGFwZT8KICovCmZ1bmN0aW9uIGxvb3NlRXF1YWwgKGEsIGIpIHsKICBpZiAoYSA9PT0gYikgeyByZXR1cm4gdHJ1ZSB9CiAgdmFyIGlzT2JqZWN0QSA9IGlzT2JqZWN0KGEpOwogIHZhciBpc09iamVjdEIgPSBpc09iamVjdChiKTsKICBpZiAoaXNPYmplY3RBICYmIGlzT2JqZWN0QikgewogICAgdHJ5IHsKICAgICAgdmFyIGlzQXJyYXlBID0gQXJyYXkuaXNBcnJheShhKTsKICAgICAgdmFyIGlzQXJyYXlCID0gQXJyYXkuaXNBcnJheShiKTsKICAgICAgaWYgKGlzQXJyYXlBICYmIGlzQXJyYXlCKSB7CiAgICAgICAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KGZ1bmN0aW9uIChlLCBpKSB7CiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChlLCBiW2ldKQogICAgICAgIH0pCiAgICAgIH0gZWxzZSBpZiAoIWlzQXJyYXlBICYmICFpc0FycmF5QikgewogICAgICAgIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKGEpOwogICAgICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKGIpOwogICAgICAgIHJldHVybiBrZXlzQS5sZW5ndGggPT09IGtleXNCLmxlbmd0aCAmJiBrZXlzQS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChhW2tleV0sIGJba2V5XSkKICAgICAgICB9KQogICAgICB9IGVsc2UgewogICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICAgICAgcmV0dXJuIGZhbHNlCiAgICB9CiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHsKICAgIHJldHVybiBTdHJpbmcoYSkgPT09IFN0cmluZyhiKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2UKICB9Cn0KCmZ1bmN0aW9uIGxvb3NlSW5kZXhPZiAoYXJyLCB2YWwpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgewogICAgaWYgKGxvb3NlRXF1YWwoYXJyW2ldLCB2YWwpKSB7IHJldHVybiBpIH0KICB9CiAgcmV0dXJuIC0xCn0KCi8qKgogKiBFbnN1cmUgYSBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBvbmNlLgogKi8KZnVuY3Rpb24gb25jZSAoZm4pIHsKICB2YXIgY2FsbGVkID0gZmFsc2U7CiAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgIGlmICghY2FsbGVkKSB7CiAgICAgIGNhbGxlZCA9IHRydWU7CiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgfQp9Cgp2YXIgU1NSX0FUVFIgPSAnZGF0YS1zZXJ2ZXItcmVuZGVyZWQnOwoKdmFyIEFTU0VUX1RZUEVTID0gWwogICdjb21wb25lbnQnLAogICdkaXJlY3RpdmUnLAogICdmaWx0ZXInCl07Cgp2YXIgTElGRUNZQ0xFX0hPT0tTID0gWwogICdiZWZvcmVDcmVhdGUnLAogICdjcmVhdGVkJywKICAnYmVmb3JlTW91bnQnLAogICdtb3VudGVkJywKICAnYmVmb3JlVXBkYXRlJywKICAndXBkYXRlZCcsCiAgJ2JlZm9yZURlc3Ryb3knLAogICdkZXN0cm95ZWQnLAogICdhY3RpdmF0ZWQnLAogICdkZWFjdGl2YXRlZCcsCiAgJ2Vycm9yQ2FwdHVyZWQnCl07CgovKiAgKi8KCnZhciBjb25maWcgPSAoewogIC8qKgogICAqIE9wdGlvbiBtZXJnZSBzdHJhdGVnaWVzICh1c2VkIGluIGNvcmUvdXRpbC9vcHRpb25zKQogICAqLwogIC8vICRmbG93LWRpc2FibGUtbGluZQogIG9wdGlvbk1lcmdlU3RyYXRlZ2llczogT2JqZWN0LmNyZWF0ZShudWxsKSwKCiAgLyoqCiAgICogV2hldGhlciB0byBzdXBwcmVzcyB3YXJuaW5ncy4KICAgKi8KICBzaWxlbnQ6IGZhbHNlLAoKICAvKioKICAgKiBTaG93IHByb2R1Y3Rpb24gbW9kZSB0aXAgbWVzc2FnZSBvbiBib290PwogICAqLwogIHByb2R1Y3Rpb25UaXA6ICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJywKCiAgLyoqCiAgICogV2hldGhlciB0byBlbmFibGUgZGV2dG9vbHMKICAgKi8KICBkZXZ0b29sczogImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nLAoKICAvKioKICAgKiBXaGV0aGVyIHRvIHJlY29yZCBwZXJmCiAgICovCiAgcGVyZm9ybWFuY2U6IGZhbHNlLAoKICAvKioKICAgKiBFcnJvciBoYW5kbGVyIGZvciB3YXRjaGVyIGVycm9ycwogICAqLwogIGVycm9ySGFuZGxlcjogbnVsbCwKCiAgLyoqCiAgICogV2FybiBoYW5kbGVyIGZvciB3YXRjaGVyIHdhcm5zCiAgICovCiAgd2FybkhhbmRsZXI6IG51bGwsCgogIC8qKgogICAqIElnbm9yZSBjZXJ0YWluIGN1c3RvbSBlbGVtZW50cwogICAqLwogIGlnbm9yZWRFbGVtZW50czogW10sCgogIC8qKgogICAqIEN1c3RvbSB1c2VyIGtleSBhbGlhc2VzIGZvciB2LW9uCiAgICovCiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAga2V5Q29kZXM6IE9iamVjdC5jcmVhdGUobnVsbCksCgogIC8qKgogICAqIENoZWNrIGlmIGEgdGFnIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHJlZ2lzdGVyZWQgYXMgYQogICAqIGNvbXBvbmVudC4gVGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi4KICAgKi8KICBpc1Jlc2VydmVkVGFnOiBubywKCiAgLyoqCiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb21wb25lbnQKICAgKiBwcm9wLiBUaGlzIGlzIHBsYXRmb3JtLWRlcGVuZGVudCBhbmQgbWF5IGJlIG92ZXJ3cml0dGVuLgogICAqLwogIGlzUmVzZXJ2ZWRBdHRyOiBubywKCiAgLyoqCiAgICogQ2hlY2sgaWYgYSB0YWcgaXMgYW4gdW5rbm93biBlbGVtZW50LgogICAqIFBsYXRmb3JtLWRlcGVuZGVudC4KICAgKi8KICBpc1Vua25vd25FbGVtZW50OiBubywKCiAgLyoqCiAgICogR2V0IHRoZSBuYW1lc3BhY2Ugb2YgYW4gZWxlbWVudAogICAqLwogIGdldFRhZ05hbWVzcGFjZTogbm9vcCwKCiAgLyoqCiAgICogUGFyc2UgdGhlIHJlYWwgdGFnIG5hbWUgZm9yIHRoZSBzcGVjaWZpYyBwbGF0Zm9ybS4KICAgKi8KICBwYXJzZVBsYXRmb3JtVGFnTmFtZTogaWRlbnRpdHksCgogIC8qKgogICAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIGJvdW5kIHVzaW5nIHByb3BlcnR5LCBlLmcuIHZhbHVlCiAgICogUGxhdGZvcm0tZGVwZW5kZW50LgogICAqLwogIG11c3RVc2VQcm9wOiBubywKCiAgLyoqCiAgICogRXhwb3NlZCBmb3IgbGVnYWN5IHJlYXNvbnMKICAgKi8KICBfbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LUwp9KQoKLyogICovCgovKioKICogQ2hlY2sgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggJCBvciBfCiAqLwpmdW5jdGlvbiBpc1Jlc2VydmVkIChzdHIpIHsKICB2YXIgYyA9IChzdHIgKyAnJykuY2hhckNvZGVBdCgwKTsKICByZXR1cm4gYyA9PT0gMHgyNCB8fCBjID09PSAweDVGCn0KCi8qKgogKiBEZWZpbmUgYSBwcm9wZXJ0eS4KICovCmZ1bmN0aW9uIGRlZiAob2JqLCBrZXksIHZhbCwgZW51bWVyYWJsZSkgewogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgewogICAgdmFsdWU6IHZhbCwKICAgIGVudW1lcmFibGU6ICEhZW51bWVyYWJsZSwKICAgIHdyaXRhYmxlOiB0cnVlLAogICAgY29uZmlndXJhYmxlOiB0cnVlCiAgfSk7Cn0KCi8qKgogKiBQYXJzZSBzaW1wbGUgcGF0aC4KICovCnZhciBiYWlsUkUgPSAvW15cdy4kXS87CmZ1bmN0aW9uIHBhcnNlUGF0aCAocGF0aCkgewogIGlmIChiYWlsUkUudGVzdChwYXRoKSkgewogICAgcmV0dXJuCiAgfQogIHZhciBzZWdtZW50cyA9IHBhdGguc3BsaXQoJy4nKTsKICByZXR1cm4gZnVuY3Rpb24gKG9iaikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIW9iaikgeyByZXR1cm4gfQogICAgICBvYmogPSBvYmpbc2VnbWVudHNbaV1dOwogICAgfQogICAgcmV0dXJuIG9iagogIH0KfQoKLyogICovCgovLyBjYW4gd2UgdXNlIF9fcHJvdG9fXz8KdmFyIGhhc1Byb3RvID0gJ19fcHJvdG9fXycgaW4ge307CgovLyBCcm93c2VyIGVudmlyb25tZW50IHNuaWZmaW5nCnZhciBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJzsKdmFyIGluV2VleCA9IHR5cGVvZiBXWEVudmlyb25tZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhIVdYRW52aXJvbm1lbnQucGxhdGZvcm07CnZhciB3ZWV4UGxhdGZvcm0gPSBpbldlZXggJiYgV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpOwp2YXIgVUEgPSBpbkJyb3dzZXIgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKdmFyIGlzSUUgPSBVQSAmJiAvbXNpZXx0cmlkZW50Ly50ZXN0KFVBKTsKdmFyIGlzSUU5ID0gVUEgJiYgVUEuaW5kZXhPZignbXNpZSA5LjAnKSA+IDA7CnZhciBpc0VkZ2UgPSBVQSAmJiBVQS5pbmRleE9mKCdlZGdlLycpID4gMDsKdmFyIGlzQW5kcm9pZCA9IChVQSAmJiBVQS5pbmRleE9mKCdhbmRyb2lkJykgPiAwKSB8fCAod2VleFBsYXRmb3JtID09PSAnYW5kcm9pZCcpOwp2YXIgaXNJT1MgPSAoVUEgJiYgL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KFVBKSkgfHwgKHdlZXhQbGF0Zm9ybSA9PT0gJ2lvcycpOwp2YXIgaXNDaHJvbWUgPSBVQSAmJiAvY2hyb21lXC9cZCsvLnRlc3QoVUEpICYmICFpc0VkZ2U7CgovLyBGaXJlZm94IGhhcyBhICJ3YXRjaCIgZnVuY3Rpb24gb24gT2JqZWN0LnByb3RvdHlwZS4uLgp2YXIgbmF0aXZlV2F0Y2ggPSAoe30pLndhdGNoOwoKdmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlOwppZiAoaW5Ccm93c2VyKSB7CiAgdHJ5IHsKICAgIHZhciBvcHRzID0ge307CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0cywgJ3Bhc3NpdmUnLCAoewogICAgICBnZXQ6IGZ1bmN0aW9uIGdldCAoKSB7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlOwogICAgICB9CiAgICB9KSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yODUKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0LXBhc3NpdmUnLCBudWxsLCBvcHRzKTsKICB9IGNhdGNoIChlKSB7fQp9CgovLyB0aGlzIG5lZWRzIHRvIGJlIGxhenktZXZhbGVkIGJlY2F1c2UgdnVlIG1heSBiZSByZXF1aXJlZCBiZWZvcmUKLy8gdnVlLXNlcnZlci1yZW5kZXJlciBjYW4gc2V0IFZVRV9FTlYKdmFyIF9pc1NlcnZlcjsKdmFyIGlzU2VydmVyUmVuZGVyaW5nID0gZnVuY3Rpb24gKCkgewogIGlmIChfaXNTZXJ2ZXIgPT09IHVuZGVmaW5lZCkgewogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoIWluQnJvd3NlciAmJiAhaW5XZWV4ICYmIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgIC8vIGRldGVjdCBwcmVzZW5jZSBvZiB2dWUtc2VydmVyLXJlbmRlcmVyIGFuZCBhdm9pZAogICAgICAvLyBXZWJwYWNrIHNoaW1taW5nIHRoZSBwcm9jZXNzCiAgICAgIF9pc1NlcnZlciA9IGdsb2JhbFsncHJvY2VzcyddLmVudi5WVUVfRU5WID09PSAnc2VydmVyJzsKICAgIH0gZWxzZSB7CiAgICAgIF9pc1NlcnZlciA9IGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gX2lzU2VydmVyCn07CgovLyBkZXRlY3QgZGV2dG9vbHMKdmFyIGRldnRvb2xzID0gaW5Ccm93c2VyICYmIHdpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fOwoKLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KZnVuY3Rpb24gaXNOYXRpdmUgKEN0b3IpIHsKICByZXR1cm4gdHlwZW9mIEN0b3IgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KEN0b3IudG9TdHJpbmcoKSkKfQoKdmFyIGhhc1N5bWJvbCA9CiAgdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoU3ltYm9sKSAmJgogIHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShSZWZsZWN0Lm93bktleXMpOwoKdmFyIF9TZXQ7Ci8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLyAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKaWYgKHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFNldCkpIHsKICAvLyB1c2UgbmF0aXZlIFNldCB3aGVuIGF2YWlsYWJsZS4KICBfU2V0ID0gU2V0Owp9IGVsc2UgewogIC8vIGEgbm9uLXN0YW5kYXJkIFNldCBwb2x5ZmlsbCB0aGF0IG9ubHkgd29ya3Mgd2l0aCBwcmltaXRpdmUga2V5cy4KICBfU2V0ID0gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFNldCAoKSB7CiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gaGFzIChrZXkpIHsKICAgICAgcmV0dXJuIHRoaXMuc2V0W2tleV0gPT09IHRydWUKICAgIH07CiAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoa2V5KSB7CiAgICAgIHRoaXMuc2V0W2tleV0gPSB0cnVlOwogICAgfTsKICAgIFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhciAoKSB7CiAgICAgIHRoaXMuc2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH07CgogICAgcmV0dXJuIFNldDsKICB9KCkpOwp9CgovKiAgKi8KCnZhciB3YXJuID0gbm9vcDsKdmFyIHRpcCA9IG5vb3A7CnZhciBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlID0gKG5vb3ApOyAvLyB3b3JrIGFyb3VuZCBmbG93IGNoZWNrCnZhciBmb3JtYXRDb21wb25lbnROYW1lID0gKG5vb3ApOwoKewogIHZhciBoYXNDb25zb2xlID0gdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnOwogIHZhciBjbGFzc2lmeVJFID0gLyg/Ol58Wy1fXSkoXHcpL2c7CiAgdmFyIGNsYXNzaWZ5ID0gZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gc3RyCiAgICAucmVwbGFjZShjbGFzc2lmeVJFLCBmdW5jdGlvbiAoYykgeyByZXR1cm4gYy50b1VwcGVyQ2FzZSgpOyB9KQogICAgLnJlcGxhY2UoL1stX10vZywgJycpOyB9OwoKICB3YXJuID0gZnVuY3Rpb24gKG1zZywgdm0pIHsKICAgIHZhciB0cmFjZSA9IHZtID8gZ2VuZXJhdGVDb21wb25lbnRUcmFjZSh2bSkgOiAnJzsKCiAgICBpZiAoY29uZmlnLndhcm5IYW5kbGVyKSB7CiAgICAgIGNvbmZpZy53YXJuSGFuZGxlci5jYWxsKG51bGwsIG1zZywgdm0sIHRyYWNlKTsKICAgIH0gZWxzZSBpZiAoaGFzQ29uc29sZSAmJiAoIWNvbmZpZy5zaWxlbnQpKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoKCJbVnVlIHdhcm5dOiAiICsgbXNnICsgdHJhY2UpKTsKICAgIH0KICB9OwoKICB0aXAgPSBmdW5jdGlvbiAobXNnLCB2bSkgewogICAgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkgewogICAgICBjb25zb2xlLndhcm4oIltWdWUgdGlwXTogIiArIG1zZyArICgKICAgICAgICB2bSA/IGdlbmVyYXRlQ29tcG9uZW50VHJhY2Uodm0pIDogJycKICAgICAgKSk7CiAgICB9CiAgfTsKCiAgZm9ybWF0Q29tcG9uZW50TmFtZSA9IGZ1bmN0aW9uICh2bSwgaW5jbHVkZUZpbGUpIHsKICAgIGlmICh2bS4kcm9vdCA9PT0gdm0pIHsKICAgICAgcmV0dXJuICc8Um9vdD4nCiAgICB9CiAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiB2bSA9PT0gJ2Z1bmN0aW9uJyAmJiB2bS5jaWQgIT0gbnVsbAogICAgICA/IHZtLm9wdGlvbnMKICAgICAgOiB2bS5faXNWdWUKICAgICAgICA/IHZtLiRvcHRpb25zIHx8IHZtLmNvbnN0cnVjdG9yLm9wdGlvbnMKICAgICAgICA6IHZtIHx8IHt9OwogICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgb3B0aW9ucy5fY29tcG9uZW50VGFnOwogICAgdmFyIGZpbGUgPSBvcHRpb25zLl9fZmlsZTsKICAgIGlmICghbmFtZSAmJiBmaWxlKSB7CiAgICAgIHZhciBtYXRjaCA9IGZpbGUubWF0Y2goLyhbXi9cXF0rKVwudnVlJC8pOwogICAgICBuYW1lID0gbWF0Y2ggJiYgbWF0Y2hbMV07CiAgICB9CgogICAgcmV0dXJuICgKICAgICAgKG5hbWUgPyAoIjwiICsgKGNsYXNzaWZ5KG5hbWUpKSArICI+IikgOiAiPEFub255bW91cz4iKSArCiAgICAgIChmaWxlICYmIGluY2x1ZGVGaWxlICE9PSBmYWxzZSA/ICgiIGF0ICIgKyBmaWxlKSA6ICcnKQogICAgKQogIH07CgogIHZhciByZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBuKSB7CiAgICB2YXIgcmVzID0gJyc7CiAgICB3aGlsZSAobikgewogICAgICBpZiAobiAlIDIgPT09IDEpIHsgcmVzICs9IHN0cjsgfQogICAgICBpZiAobiA+IDEpIHsgc3RyICs9IHN0cjsgfQogICAgICBuID4+PSAxOwogICAgfQogICAgcmV0dXJuIHJlcwogIH07CgogIGdlbmVyYXRlQ29tcG9uZW50VHJhY2UgPSBmdW5jdGlvbiAodm0pIHsKICAgIGlmICh2bS5faXNWdWUgJiYgdm0uJHBhcmVudCkgewogICAgICB2YXIgdHJlZSA9IFtdOwogICAgICB2YXIgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDsKICAgICAgd2hpbGUgKHZtKSB7CiAgICAgICAgaWYgKHRyZWUubGVuZ3RoID4gMCkgewogICAgICAgICAgdmFyIGxhc3QgPSB0cmVlW3RyZWUubGVuZ3RoIC0gMV07CiAgICAgICAgICBpZiAobGFzdC5jb25zdHJ1Y3RvciA9PT0gdm0uY29uc3RydWN0b3IpIHsKICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlKys7CiAgICAgICAgICAgIHZtID0gdm0uJHBhcmVudDsKICAgICAgICAgICAgY29udGludWUKICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID4gMCkgewogICAgICAgICAgICB0cmVlW3RyZWUubGVuZ3RoIC0gMV0gPSBbbGFzdCwgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlXTsKICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHJlZS5wdXNoKHZtKTsKICAgICAgICB2bSA9IHZtLiRwYXJlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuICdcblxuZm91bmQgaW5cblxuJyArIHRyZWUKICAgICAgICAubWFwKGZ1bmN0aW9uICh2bSwgaSkgeyByZXR1cm4gKCIiICsgKGkgPT09IDAgPyAnLS0tPiAnIDogcmVwZWF0KCcgJywgNSArIGkgKiAyKSkgKyAoQXJyYXkuaXNBcnJheSh2bSkKICAgICAgICAgICAgPyAoKGZvcm1hdENvbXBvbmVudE5hbWUodm1bMF0pKSArICIuLi4gKCIgKyAodm1bMV0pICsgIiByZWN1cnNpdmUgY2FsbHMpIikKICAgICAgICAgICAgOiBmb3JtYXRDb21wb25lbnROYW1lKHZtKSkpOyB9KQogICAgICAgIC5qb2luKCdcbicpCiAgICB9IGVsc2UgewogICAgICByZXR1cm4gKCJcblxuKGZvdW5kIGluICIgKyAoZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpICsgIikiKQogICAgfQogIH07Cn0KCi8qICAqLwoKCnZhciB1aWQgPSAwOwoKLyoqCiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZQogKiBkaXJlY3RpdmVzIHN1YnNjcmliaW5nIHRvIGl0LgogKi8KdmFyIERlcCA9IGZ1bmN0aW9uIERlcCAoKSB7CiAgdGhpcy5pZCA9IHVpZCsrOwogIHRoaXMuc3VicyA9IFtdOwp9OwoKRGVwLnByb3RvdHlwZS5hZGRTdWIgPSBmdW5jdGlvbiBhZGRTdWIgKHN1YikgewogIHRoaXMuc3Vicy5wdXNoKHN1Yik7Cn07CgpEZXAucHJvdG90eXBlLnJlbW92ZVN1YiA9IGZ1bmN0aW9uIHJlbW92ZVN1YiAoc3ViKSB7CiAgcmVtb3ZlKHRoaXMuc3Vicywgc3ViKTsKfTsKCkRlcC5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHsKICBpZiAoRGVwLnRhcmdldCkgewogICAgRGVwLnRhcmdldC5hZGREZXAodGhpcyk7CiAgfQp9OwoKRGVwLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkgKCkgewogIC8vIHN0YWJpbGl6ZSB0aGUgc3Vic2NyaWJlciBsaXN0IGZpcnN0CiAgdmFyIHN1YnMgPSB0aGlzLnN1YnMuc2xpY2UoKTsKICBmb3IgKHZhciBpID0gMCwgbCA9IHN1YnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICBzdWJzW2ldLnVwZGF0ZSgpOwogIH0KfTsKCi8vIHRoZSBjdXJyZW50IHRhcmdldCB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZC4KLy8gdGhpcyBpcyBnbG9iYWxseSB1bmlxdWUgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvbmx5IG9uZQovLyB3YXRjaGVyIGJlaW5nIGV2YWx1YXRlZCBhdCBhbnkgdGltZS4KRGVwLnRhcmdldCA9IG51bGw7CnZhciB0YXJnZXRTdGFjayA9IFtdOwoKZnVuY3Rpb24gcHVzaFRhcmdldCAoX3RhcmdldCkgewogIGlmIChEZXAudGFyZ2V0KSB7IHRhcmdldFN0YWNrLnB1c2goRGVwLnRhcmdldCk7IH0KICBEZXAudGFyZ2V0ID0gX3RhcmdldDsKfQoKZnVuY3Rpb24gcG9wVGFyZ2V0ICgpIHsKICBEZXAudGFyZ2V0ID0gdGFyZ2V0U3RhY2sucG9wKCk7Cn0KCi8qICAqLwoKdmFyIFZOb2RlID0gZnVuY3Rpb24gVk5vZGUgKAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIHRleHQsCiAgZWxtLAogIGNvbnRleHQsCiAgY29tcG9uZW50T3B0aW9ucywKICBhc3luY0ZhY3RvcnkKKSB7CiAgdGhpcy50YWcgPSB0YWc7CiAgdGhpcy5kYXRhID0gZGF0YTsKICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47CiAgdGhpcy50ZXh0ID0gdGV4dDsKICB0aGlzLmVsbSA9IGVsbTsKICB0aGlzLm5zID0gdW5kZWZpbmVkOwogIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CiAgdGhpcy5mbkNvbnRleHQgPSB1bmRlZmluZWQ7CiAgdGhpcy5mbk9wdGlvbnMgPSB1bmRlZmluZWQ7CiAgdGhpcy5mblNjb3BlSWQgPSB1bmRlZmluZWQ7CiAgdGhpcy5rZXkgPSBkYXRhICYmIGRhdGEua2V5OwogIHRoaXMuY29tcG9uZW50T3B0aW9ucyA9IGNvbXBvbmVudE9wdGlvbnM7CiAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9IHVuZGVmaW5lZDsKICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDsKICB0aGlzLnJhdyA9IGZhbHNlOwogIHRoaXMuaXNTdGF0aWMgPSBmYWxzZTsKICB0aGlzLmlzUm9vdEluc2VydCA9IHRydWU7CiAgdGhpcy5pc0NvbW1lbnQgPSBmYWxzZTsKICB0aGlzLmlzQ2xvbmVkID0gZmFsc2U7CiAgdGhpcy5pc09uY2UgPSBmYWxzZTsKICB0aGlzLmFzeW5jRmFjdG9yeSA9IGFzeW5jRmFjdG9yeTsKICB0aGlzLmFzeW5jTWV0YSA9IHVuZGVmaW5lZDsKICB0aGlzLmlzQXN5bmNQbGFjZWhvbGRlciA9IGZhbHNlOwp9OwoKdmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgY2hpbGQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTsKCi8vIERFUFJFQ0FURUQ6IGFsaWFzIGZvciBjb21wb25lbnRJbnN0YW5jZSBmb3IgYmFja3dhcmRzIGNvbXBhdC4KLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KcHJvdG90eXBlQWNjZXNzb3JzLmNoaWxkLmdldCA9IGZ1bmN0aW9uICgpIHsKICByZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZQp9OwoKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZOb2RlLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7Cgp2YXIgY3JlYXRlRW1wdHlWTm9kZSA9IGZ1bmN0aW9uICh0ZXh0KSB7CiAgaWYgKCB0ZXh0ID09PSB2b2lkIDAgKSB0ZXh0ID0gJyc7CgogIHZhciBub2RlID0gbmV3IFZOb2RlKCk7CiAgbm9kZS50ZXh0ID0gdGV4dDsKICBub2RlLmlzQ29tbWVudCA9IHRydWU7CiAgcmV0dXJuIG5vZGUKfTsKCmZ1bmN0aW9uIGNyZWF0ZVRleHRWTm9kZSAodmFsKSB7CiAgcmV0dXJuIG5ldyBWTm9kZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBTdHJpbmcodmFsKSkKfQoKLy8gb3B0aW1pemVkIHNoYWxsb3cgY2xvbmUKLy8gdXNlZCBmb3Igc3RhdGljIG5vZGVzIGFuZCBzbG90IG5vZGVzIGJlY2F1c2UgdGhleSBtYXkgYmUgcmV1c2VkIGFjcm9zcwovLyBtdWx0aXBsZSByZW5kZXJzLCBjbG9uaW5nIHRoZW0gYXZvaWRzIGVycm9ycyB3aGVuIERPTSBtYW5pcHVsYXRpb25zIHJlbHkKLy8gb24gdGhlaXIgZWxtIHJlZmVyZW5jZS4KZnVuY3Rpb24gY2xvbmVWTm9kZSAodm5vZGUpIHsKICB2YXIgY2xvbmVkID0gbmV3IFZOb2RlKAogICAgdm5vZGUudGFnLAogICAgdm5vZGUuZGF0YSwKICAgIHZub2RlLmNoaWxkcmVuLAogICAgdm5vZGUudGV4dCwKICAgIHZub2RlLmVsbSwKICAgIHZub2RlLmNvbnRleHQsCiAgICB2bm9kZS5jb21wb25lbnRPcHRpb25zLAogICAgdm5vZGUuYXN5bmNGYWN0b3J5CiAgKTsKICBjbG9uZWQubnMgPSB2bm9kZS5uczsKICBjbG9uZWQuaXNTdGF0aWMgPSB2bm9kZS5pc1N0YXRpYzsKICBjbG9uZWQua2V5ID0gdm5vZGUua2V5OwogIGNsb25lZC5pc0NvbW1lbnQgPSB2bm9kZS5pc0NvbW1lbnQ7CiAgY2xvbmVkLmZuQ29udGV4dCA9IHZub2RlLmZuQ29udGV4dDsKICBjbG9uZWQuZm5PcHRpb25zID0gdm5vZGUuZm5PcHRpb25zOwogIGNsb25lZC5mblNjb3BlSWQgPSB2bm9kZS5mblNjb3BlSWQ7CiAgY2xvbmVkLmlzQ2xvbmVkID0gdHJ1ZTsKICByZXR1cm4gY2xvbmVkCn0KCi8qCiAqIG5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBwbGF5IHdlbGwgd2l0aAogKiBkeW5hbWljYWxseSBhY2Nlc3NpbmcgbWV0aG9kcyBvbiBBcnJheSBwcm90b3R5cGUKICovCgp2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTsKdmFyIGFycmF5TWV0aG9kcyA9IE9iamVjdC5jcmVhdGUoYXJyYXlQcm90byk7Cgp2YXIgbWV0aG9kc1RvUGF0Y2ggPSBbCiAgJ3B1c2gnLAogICdwb3AnLAogICdzaGlmdCcsCiAgJ3Vuc2hpZnQnLAogICdzcGxpY2UnLAogICdzb3J0JywKICAncmV2ZXJzZScKXTsKCi8qKgogKiBJbnRlcmNlcHQgbXV0YXRpbmcgbWV0aG9kcyBhbmQgZW1pdCBldmVudHMKICovCm1ldGhvZHNUb1BhdGNoLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgewogIC8vIGNhY2hlIG9yaWdpbmFsIG1ldGhvZAogIHZhciBvcmlnaW5hbCA9IGFycmF5UHJvdG9bbWV0aG9kXTsKICBkZWYoYXJyYXlNZXRob2RzLCBtZXRob2QsIGZ1bmN0aW9uIG11dGF0b3IgKCkgewogICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsKICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07CgogICAgdmFyIHJlc3VsdCA9IG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgdmFyIG9iID0gdGhpcy5fX29iX187CiAgICB2YXIgaW5zZXJ0ZWQ7CiAgICBzd2l0Y2ggKG1ldGhvZCkgewogICAgICBjYXNlICdwdXNoJzoKICAgICAgY2FzZSAndW5zaGlmdCc6CiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzOwogICAgICAgIGJyZWFrCiAgICAgIGNhc2UgJ3NwbGljZSc6CiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzLnNsaWNlKDIpOwogICAgICAgIGJyZWFrCiAgICB9CiAgICBpZiAoaW5zZXJ0ZWQpIHsgb2Iub2JzZXJ2ZUFycmF5KGluc2VydGVkKTsgfQogICAgLy8gbm90aWZ5IGNoYW5nZQogICAgb2IuZGVwLm5vdGlmeSgpOwogICAgcmV0dXJuIHJlc3VsdAogIH0pOwp9KTsKCi8qICAqLwoKdmFyIGFycmF5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFycmF5TWV0aG9kcyk7CgovKioKICogSW4gc29tZSBjYXNlcyB3ZSBtYXkgd2FudCB0byBkaXNhYmxlIG9ic2VydmF0aW9uIGluc2lkZSBhIGNvbXBvbmVudCdzCiAqIHVwZGF0ZSBjb21wdXRhdGlvbi4KICovCnZhciBzaG91bGRPYnNlcnZlID0gdHJ1ZTsKCmZ1bmN0aW9uIHRvZ2dsZU9ic2VydmluZyAodmFsdWUpIHsKICBzaG91bGRPYnNlcnZlID0gdmFsdWU7Cn0KCi8qKgogKiBPYnNlcnZlciBjbGFzcyB0aGF0IGlzIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWQKICogb2JqZWN0LiBPbmNlIGF0dGFjaGVkLCB0aGUgb2JzZXJ2ZXIgY29udmVydHMgdGhlIHRhcmdldAogKiBvYmplY3QncyBwcm9wZXJ0eSBrZXlzIGludG8gZ2V0dGVyL3NldHRlcnMgdGhhdAogKiBjb2xsZWN0IGRlcGVuZGVuY2llcyBhbmQgZGlzcGF0Y2ggdXBkYXRlcy4KICovCnZhciBPYnNlcnZlciA9IGZ1bmN0aW9uIE9ic2VydmVyICh2YWx1ZSkgewogIHRoaXMudmFsdWUgPSB2YWx1ZTsKICB0aGlzLmRlcCA9IG5ldyBEZXAoKTsKICB0aGlzLnZtQ291bnQgPSAwOwogIGRlZih2YWx1ZSwgJ19fb2JfXycsIHRoaXMpOwogIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgdmFyIGF1Z21lbnQgPSBoYXNQcm90bwogICAgICA/IHByb3RvQXVnbWVudAogICAgICA6IGNvcHlBdWdtZW50OwogICAgYXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzLCBhcnJheUtleXMpOwogICAgdGhpcy5vYnNlcnZlQXJyYXkodmFsdWUpOwogIH0gZWxzZSB7CiAgICB0aGlzLndhbGsodmFsdWUpOwogIH0KfTsKCi8qKgogKiBXYWxrIHRocm91Z2ggZWFjaCBwcm9wZXJ0eSBhbmQgY29udmVydCB0aGVtIGludG8KICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuCiAqIHZhbHVlIHR5cGUgaXMgT2JqZWN0LgogKi8KT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICBkZWZpbmVSZWFjdGl2ZShvYmosIGtleXNbaV0pOwogIH0KfTsKCi8qKgogKiBPYnNlcnZlIGEgbGlzdCBvZiBBcnJheSBpdGVtcy4KICovCk9ic2VydmVyLnByb3RvdHlwZS5vYnNlcnZlQXJyYXkgPSBmdW5jdGlvbiBvYnNlcnZlQXJyYXkgKGl0ZW1zKSB7CiAgZm9yICh2YXIgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIG9ic2VydmUoaXRlbXNbaV0pOwogIH0KfTsKCi8vIGhlbHBlcnMKCi8qKgogKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgaW50ZXJjZXB0aW5nCiAqIHRoZSBwcm90b3R5cGUgY2hhaW4gdXNpbmcgX19wcm90b19fCiAqLwpmdW5jdGlvbiBwcm90b0F1Z21lbnQgKHRhcmdldCwgc3JjLCBrZXlzKSB7CiAgLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi8KICB0YXJnZXQuX19wcm90b19fID0gc3JjOwogIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi8KfQoKLyoqCiAqIEF1Z21lbnQgYW4gdGFyZ2V0IE9iamVjdCBvciBBcnJheSBieSBkZWZpbmluZwogKiBoaWRkZW4gcHJvcGVydGllcy4KICovCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCmZ1bmN0aW9uIGNvcHlBdWdtZW50ICh0YXJnZXQsIHNyYywga2V5cykgewogIGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIHZhciBrZXkgPSBrZXlzW2ldOwogICAgZGVmKHRhcmdldCwga2V5LCBzcmNba2V5XSk7CiAgfQp9CgovKioKICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsCiAqIHJldHVybnMgdGhlIG5ldyBvYnNlcnZlciBpZiBzdWNjZXNzZnVsbHkgb2JzZXJ2ZWQsCiAqIG9yIHRoZSBleGlzdGluZyBvYnNlcnZlciBpZiB0aGUgdmFsdWUgYWxyZWFkeSBoYXMgb25lLgogKi8KZnVuY3Rpb24gb2JzZXJ2ZSAodmFsdWUsIGFzUm9vdERhdGEpIHsKICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFZOb2RlKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIG9iOwogIGlmIChoYXNPd24odmFsdWUsICdfX29iX18nKSAmJiB2YWx1ZS5fX29iX18gaW5zdGFuY2VvZiBPYnNlcnZlcikgewogICAgb2IgPSB2YWx1ZS5fX29iX187CiAgfSBlbHNlIGlmICgKICAgIHNob3VsZE9ic2VydmUgJiYKICAgICFpc1NlcnZlclJlbmRlcmluZygpICYmCiAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpICYmCiAgICBPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSAmJgogICAgIXZhbHVlLl9pc1Z1ZQogICkgewogICAgb2IgPSBuZXcgT2JzZXJ2ZXIodmFsdWUpOwogIH0KICBpZiAoYXNSb290RGF0YSAmJiBvYikgewogICAgb2Iudm1Db3VudCsrOwogIH0KICByZXR1cm4gb2IKfQoKLyoqCiAqIERlZmluZSBhIHJlYWN0aXZlIHByb3BlcnR5IG9uIGFuIE9iamVjdC4KICovCmZ1bmN0aW9uIGRlZmluZVJlYWN0aXZlICgKICBvYmosCiAga2V5LAogIHZhbCwKICBjdXN0b21TZXR0ZXIsCiAgc2hhbGxvdwopIHsKICB2YXIgZGVwID0gbmV3IERlcCgpOwoKICB2YXIgcHJvcGVydHkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KTsKICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkgewogICAgcmV0dXJuCiAgfQoKICAvLyBjYXRlciBmb3IgcHJlLWRlZmluZWQgZ2V0dGVyL3NldHRlcnMKICB2YXIgZ2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuZ2V0OwogIGlmICghZ2V0dGVyICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgIHZhbCA9IG9ialtrZXldOwogIH0KICB2YXIgc2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuc2V0OwoKICB2YXIgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUodmFsKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgIGVudW1lcmFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHsKICAgICAgdmFyIHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDsKICAgICAgaWYgKERlcC50YXJnZXQpIHsKICAgICAgICBkZXAuZGVwZW5kKCk7CiAgICAgICAgaWYgKGNoaWxkT2IpIHsKICAgICAgICAgIGNoaWxkT2IuZGVwLmRlcGVuZCgpOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlCiAgICB9LAogICAgc2V0OiBmdW5jdGlvbiByZWFjdGl2ZVNldHRlciAobmV3VmFsKSB7CiAgICAgIHZhciB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWw7CiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqLwogICAgICBpZiAobmV3VmFsID09PSB2YWx1ZSB8fCAobmV3VmFsICE9PSBuZXdWYWwgJiYgdmFsdWUgIT09IHZhbHVlKSkgewogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgY3VzdG9tU2V0dGVyKSB7CiAgICAgICAgY3VzdG9tU2V0dGVyKCk7CiAgICAgIH0KICAgICAgaWYgKHNldHRlcikgewogICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWwgPSBuZXdWYWw7CiAgICAgIH0KICAgICAgY2hpbGRPYiA9ICFzaGFsbG93ICYmIG9ic2VydmUobmV3VmFsKTsKICAgICAgZGVwLm5vdGlmeSgpOwogICAgfQogIH0pOwp9CgovKioKICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBBZGRzIHRoZSBuZXcgcHJvcGVydHkgYW5kCiAqIHRyaWdnZXJzIGNoYW5nZSBub3RpZmljYXRpb24gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QKICogYWxyZWFkeSBleGlzdC4KICovCmZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbCkgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSkKICApIHsKICAgIHdhcm4oKCJDYW5ub3Qgc2V0IHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiICsgKCh0YXJnZXQpKSkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHsKICAgIHRhcmdldC5sZW5ndGggPSBNYXRoLm1heCh0YXJnZXQubGVuZ3RoLCBrZXkpOwogICAgdGFyZ2V0LnNwbGljZShrZXksIDEsIHZhbCk7CiAgICByZXR1cm4gdmFsCiAgfQogIGlmIChrZXkgaW4gdGFyZ2V0ICYmICEoa2V5IGluIE9iamVjdC5wcm90b3R5cGUpKSB7CiAgICB0YXJnZXRba2V5XSA9IHZhbDsKICAgIHJldHVybiB2YWwKICB9CiAgdmFyIG9iID0gKHRhcmdldCkuX19vYl9fOwogIGlmICh0YXJnZXQuX2lzVnVlIHx8IChvYiAmJiBvYi52bUNvdW50KSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICdBdm9pZCBhZGRpbmcgcmVhY3RpdmUgcHJvcGVydGllcyB0byBhIFZ1ZSBpbnN0YW5jZSBvciBpdHMgcm9vdCAkZGF0YSAnICsKICAgICAgJ2F0IHJ1bnRpbWUgLSBkZWNsYXJlIGl0IHVwZnJvbnQgaW4gdGhlIGRhdGEgb3B0aW9uLicKICAgICk7CiAgICByZXR1cm4gdmFsCiAgfQogIGlmICghb2IpIHsKICAgIHRhcmdldFtrZXldID0gdmFsOwogICAgcmV0dXJuIHZhbAogIH0KICBkZWZpbmVSZWFjdGl2ZShvYi52YWx1ZSwga2V5LCB2YWwpOwogIG9iLmRlcC5ub3RpZnkoKTsKICByZXR1cm4gdmFsCn0KCi8qKgogKiBEZWxldGUgYSBwcm9wZXJ0eSBhbmQgdHJpZ2dlciBjaGFuZ2UgaWYgbmVjZXNzYXJ5LgogKi8KZnVuY3Rpb24gZGVsICh0YXJnZXQsIGtleSkgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIChpc1VuZGVmKHRhcmdldCkgfHwgaXNQcmltaXRpdmUodGFyZ2V0KSkKICApIHsKICAgIHdhcm4oKCJDYW5ub3QgZGVsZXRlIHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiICsgKCh0YXJnZXQpKSkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIGlzVmFsaWRBcnJheUluZGV4KGtleSkpIHsKICAgIHRhcmdldC5zcGxpY2Uoa2V5LCAxKTsKICAgIHJldHVybgogIH0KICB2YXIgb2IgPSAodGFyZ2V0KS5fX29iX187CiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgJ0F2b2lkIGRlbGV0aW5nIHByb3BlcnRpZXMgb24gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgJyArCiAgICAgICctIGp1c3Qgc2V0IGl0IHRvIG51bGwuJwogICAgKTsKICAgIHJldHVybgogIH0KICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkpIHsKICAgIHJldHVybgogIH0KICBkZWxldGUgdGFyZ2V0W2tleV07CiAgaWYgKCFvYikgewogICAgcmV0dXJuCiAgfQogIG9iLmRlcC5ub3RpZnkoKTsKfQoKLyoqCiAqIENvbGxlY3QgZGVwZW5kZW5jaWVzIG9uIGFycmF5IGVsZW1lbnRzIHdoZW4gdGhlIGFycmF5IGlzIHRvdWNoZWQsIHNpbmNlCiAqIHdlIGNhbm5vdCBpbnRlcmNlcHQgYXJyYXkgZWxlbWVudCBhY2Nlc3MgbGlrZSBwcm9wZXJ0eSBnZXR0ZXJzLgogKi8KZnVuY3Rpb24gZGVwZW5kQXJyYXkgKHZhbHVlKSB7CiAgZm9yICh2YXIgZSA9ICh2b2lkIDApLCBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZSA9IHZhbHVlW2ldOwogICAgZSAmJiBlLl9fb2JfXyAmJiBlLl9fb2JfXy5kZXAuZGVwZW5kKCk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICBkZXBlbmRBcnJheShlKTsKICAgIH0KICB9Cn0KCi8qICAqLwoKLyoqCiAqIE9wdGlvbiBvdmVyd3JpdGluZyBzdHJhdGVnaWVzIGFyZSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUKICogaG93IHRvIG1lcmdlIGEgcGFyZW50IG9wdGlvbiB2YWx1ZSBhbmQgYSBjaGlsZCBvcHRpb24KICogdmFsdWUgaW50byB0aGUgZmluYWwgdmFsdWUuCiAqLwp2YXIgc3RyYXRzID0gY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llczsKCi8qKgogKiBPcHRpb25zIHdpdGggcmVzdHJpY3Rpb25zCiAqLwp7CiAgc3RyYXRzLmVsID0gc3RyYXRzLnByb3BzRGF0YSA9IGZ1bmN0aW9uIChwYXJlbnQsIGNoaWxkLCB2bSwga2V5KSB7CiAgICBpZiAoIXZtKSB7CiAgICAgIHdhcm4oCiAgICAgICAgIm9wdGlvbiBcIiIgKyBrZXkgKyAiXCIgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgaW5zdGFuY2UgIiArCiAgICAgICAgJ2NyZWF0aW9uIHdpdGggdGhlIGBuZXdgIGtleXdvcmQuJwogICAgICApOwogICAgfQogICAgcmV0dXJuIGRlZmF1bHRTdHJhdChwYXJlbnQsIGNoaWxkKQogIH07Cn0KCi8qKgogKiBIZWxwZXIgdGhhdCByZWN1cnNpdmVseSBtZXJnZXMgdHdvIGRhdGEgb2JqZWN0cyB0b2dldGhlci4KICovCmZ1bmN0aW9uIG1lcmdlRGF0YSAodG8sIGZyb20pIHsKICBpZiAoIWZyb20pIHsgcmV0dXJuIHRvIH0KICB2YXIga2V5LCB0b1ZhbCwgZnJvbVZhbDsKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyb20pOwogIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAga2V5ID0ga2V5c1tpXTsKICAgIHRvVmFsID0gdG9ba2V5XTsKICAgIGZyb21WYWwgPSBmcm9tW2tleV07CiAgICBpZiAoIWhhc093bih0bywga2V5KSkgewogICAgICBzZXQodG8sIGtleSwgZnJvbVZhbCk7CiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodG9WYWwpICYmIGlzUGxhaW5PYmplY3QoZnJvbVZhbCkpIHsKICAgICAgbWVyZ2VEYXRhKHRvVmFsLCBmcm9tVmFsKTsKICAgIH0KICB9CiAgcmV0dXJuIHRvCn0KCi8qKgogKiBEYXRhCiAqLwpmdW5jdGlvbiBtZXJnZURhdGFPckZuICgKICBwYXJlbnRWYWwsCiAgY2hpbGRWYWwsCiAgdm0KKSB7CiAgaWYgKCF2bSkgewogICAgLy8gaW4gYSBWdWUuZXh0ZW5kIG1lcmdlLCBib3RoIHNob3VsZCBiZSBmdW5jdGlvbnMKICAgIGlmICghY2hpbGRWYWwpIHsKICAgICAgcmV0dXJuIHBhcmVudFZhbAogICAgfQogICAgaWYgKCFwYXJlbnRWYWwpIHsKICAgICAgcmV0dXJuIGNoaWxkVmFsCiAgICB9CiAgICAvLyB3aGVuIHBhcmVudFZhbCAmIGNoaWxkVmFsIGFyZSBib3RoIHByZXNlbnQsCiAgICAvLyB3ZSBuZWVkIHRvIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUKICAgIC8vIG1lcmdlZCByZXN1bHQgb2YgYm90aCBmdW5jdGlvbnMuLi4gbm8gbmVlZCB0bwogICAgLy8gY2hlY2sgaWYgcGFyZW50VmFsIGlzIGEgZnVuY3Rpb24gaGVyZSBiZWNhdXNlCiAgICAvLyBpdCBoYXMgdG8gYmUgYSBmdW5jdGlvbiB0byBwYXNzIHByZXZpb3VzIG1lcmdlcy4KICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWREYXRhRm4gKCkgewogICAgICByZXR1cm4gbWVyZ2VEYXRhKAogICAgICAgIHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IGNoaWxkVmFsLmNhbGwodGhpcywgdGhpcykgOiBjaGlsZFZhbCwKICAgICAgICB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nID8gcGFyZW50VmFsLmNhbGwodGhpcywgdGhpcykgOiBwYXJlbnRWYWwKICAgICAgKQogICAgfQogIH0gZWxzZSB7CiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkSW5zdGFuY2VEYXRhRm4gKCkgewogICAgICAvLyBpbnN0YW5jZSBtZXJnZQogICAgICB2YXIgaW5zdGFuY2VEYXRhID0gdHlwZW9mIGNoaWxkVmFsID09PSAnZnVuY3Rpb24nCiAgICAgICAgPyBjaGlsZFZhbC5jYWxsKHZtLCB2bSkKICAgICAgICA6IGNoaWxkVmFsOwogICAgICB2YXIgZGVmYXVsdERhdGEgPSB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nCiAgICAgICAgPyBwYXJlbnRWYWwuY2FsbCh2bSwgdm0pCiAgICAgICAgOiBwYXJlbnRWYWw7CiAgICAgIGlmIChpbnN0YW5jZURhdGEpIHsKICAgICAgICByZXR1cm4gbWVyZ2VEYXRhKGluc3RhbmNlRGF0YSwgZGVmYXVsdERhdGEpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHREYXRhCiAgICAgIH0KICAgIH0KICB9Cn0KCnN0cmF0cy5kYXRhID0gZnVuY3Rpb24gKAogIHBhcmVudFZhbCwKICBjaGlsZFZhbCwKICB2bQopIHsKICBpZiAoIXZtKSB7CiAgICBpZiAoY2hpbGRWYWwgJiYgdHlwZW9mIGNoaWxkVmFsICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICdUaGUgImRhdGEiIG9wdGlvbiBzaG91bGQgYmUgYSBmdW5jdGlvbiAnICsKICAgICAgICAndGhhdCByZXR1cm5zIGEgcGVyLWluc3RhbmNlIHZhbHVlIGluIGNvbXBvbmVudCAnICsKICAgICAgICAnZGVmaW5pdGlvbnMuJywKICAgICAgICB2bQogICAgICApOwoKICAgICAgcmV0dXJuIHBhcmVudFZhbAogICAgfQogICAgcmV0dXJuIG1lcmdlRGF0YU9yRm4ocGFyZW50VmFsLCBjaGlsZFZhbCkKICB9CgogIHJldHVybiBtZXJnZURhdGFPckZuKHBhcmVudFZhbCwgY2hpbGRWYWwsIHZtKQp9OwoKLyoqCiAqIEhvb2tzIGFuZCBwcm9wcyBhcmUgbWVyZ2VkIGFzIGFycmF5cy4KICovCmZ1bmN0aW9uIG1lcmdlSG9vayAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsCikgewogIHJldHVybiBjaGlsZFZhbAogICAgPyBwYXJlbnRWYWwKICAgICAgPyBwYXJlbnRWYWwuY29uY2F0KGNoaWxkVmFsKQogICAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRWYWwpCiAgICAgICAgPyBjaGlsZFZhbAogICAgICAgIDogW2NoaWxkVmFsXQogICAgOiBwYXJlbnRWYWwKfQoKTElGRUNZQ0xFX0hPT0tTLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHsKICBzdHJhdHNbaG9va10gPSBtZXJnZUhvb2s7Cn0pOwoKLyoqCiAqIEFzc2V0cwogKgogKiBXaGVuIGEgdm0gaXMgcHJlc2VudCAoaW5zdGFuY2UgY3JlYXRpb24pLCB3ZSBuZWVkIHRvIGRvCiAqIGEgdGhyZWUtd2F5IG1lcmdlIGJldHdlZW4gY29uc3RydWN0b3Igb3B0aW9ucywgaW5zdGFuY2UKICogb3B0aW9ucyBhbmQgcGFyZW50IG9wdGlvbnMuCiAqLwpmdW5jdGlvbiBtZXJnZUFzc2V0cyAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsLAogIHZtLAogIGtleQopIHsKICB2YXIgcmVzID0gT2JqZWN0LmNyZWF0ZShwYXJlbnRWYWwgfHwgbnVsbCk7CiAgaWYgKGNoaWxkVmFsKSB7CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgICByZXR1cm4gZXh0ZW5kKHJlcywgY2hpbGRWYWwpCiAgfSBlbHNlIHsKICAgIHJldHVybiByZXMKICB9Cn0KCkFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICBzdHJhdHNbdHlwZSArICdzJ10gPSBtZXJnZUFzc2V0czsKfSk7CgovKioKICogV2F0Y2hlcnMuCiAqCiAqIFdhdGNoZXJzIGhhc2hlcyBzaG91bGQgbm90IG92ZXJ3cml0ZSBvbmUKICogYW5vdGhlciwgc28gd2UgbWVyZ2UgdGhlbSBhcyBhcnJheXMuCiAqLwpzdHJhdHMud2F0Y2ggPSBmdW5jdGlvbiAoCiAgcGFyZW50VmFsLAogIGNoaWxkVmFsLAogIHZtLAogIGtleQopIHsKICAvLyB3b3JrIGFyb3VuZCBGaXJlZm94J3MgT2JqZWN0LnByb3RvdHlwZS53YXRjaC4uLgogIGlmIChwYXJlbnRWYWwgPT09IG5hdGl2ZVdhdGNoKSB7IHBhcmVudFZhbCA9IHVuZGVmaW5lZDsgfQogIGlmIChjaGlsZFZhbCA9PT0gbmF0aXZlV2F0Y2gpIHsgY2hpbGRWYWwgPSB1bmRlZmluZWQ7IH0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNoaWxkVmFsKSB7IHJldHVybiBPYmplY3QuY3JlYXRlKHBhcmVudFZhbCB8fCBudWxsKSB9CiAgewogICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgfQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9CiAgdmFyIHJldCA9IHt9OwogIGV4dGVuZChyZXQsIHBhcmVudFZhbCk7CiAgZm9yICh2YXIga2V5JDEgaW4gY2hpbGRWYWwpIHsKICAgIHZhciBwYXJlbnQgPSByZXRba2V5JDFdOwogICAgdmFyIGNoaWxkID0gY2hpbGRWYWxba2V5JDFdOwogICAgaWYgKHBhcmVudCAmJiAhQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7CiAgICAgIHBhcmVudCA9IFtwYXJlbnRdOwogICAgfQogICAgcmV0W2tleSQxXSA9IHBhcmVudAogICAgICA/IHBhcmVudC5jb25jYXQoY2hpbGQpCiAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZCkgPyBjaGlsZCA6IFtjaGlsZF07CiAgfQogIHJldHVybiByZXQKfTsKCi8qKgogKiBPdGhlciBvYmplY3QgaGFzaGVzLgogKi8Kc3RyYXRzLnByb3BzID0Kc3RyYXRzLm1ldGhvZHMgPQpzdHJhdHMuaW5qZWN0ID0Kc3RyYXRzLmNvbXB1dGVkID0gZnVuY3Rpb24gKAogIHBhcmVudFZhbCwKICBjaGlsZFZhbCwKICB2bSwKICBrZXkKKSB7CiAgaWYgKGNoaWxkVmFsICYmICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJykgewogICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7CiAgfQogIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9CiAgdmFyIHJldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTsKICBpZiAoY2hpbGRWYWwpIHsgZXh0ZW5kKHJldCwgY2hpbGRWYWwpOyB9CiAgcmV0dXJuIHJldAp9OwpzdHJhdHMucHJvdmlkZSA9IG1lcmdlRGF0YU9yRm47CgovKioKICogRGVmYXVsdCBzdHJhdGVneS4KICovCnZhciBkZWZhdWx0U3RyYXQgPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkgewogIHJldHVybiBjaGlsZFZhbCA9PT0gdW5kZWZpbmVkCiAgICA/IHBhcmVudFZhbAogICAgOiBjaGlsZFZhbAp9OwoKLyoqCiAqIFZhbGlkYXRlIGNvbXBvbmVudCBuYW1lcwogKi8KZnVuY3Rpb24gY2hlY2tDb21wb25lbnRzIChvcHRpb25zKSB7CiAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMuY29tcG9uZW50cykgewogICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGtleSk7CiAgfQp9CgpmdW5jdGlvbiB2YWxpZGF0ZUNvbXBvbmVudE5hbWUgKG5hbWUpIHsKICBpZiAoIS9eW2EtekEtWl1bXHctXSokLy50ZXN0KG5hbWUpKSB7CiAgICB3YXJuKAogICAgICAnSW52YWxpZCBjb21wb25lbnQgbmFtZTogIicgKyBuYW1lICsgJyIuIENvbXBvbmVudCBuYW1lcyAnICsKICAgICAgJ2NhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIHRoZSBoeXBoZW4sICcgKwogICAgICAnYW5kIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlci4nCiAgICApOwogIH0KICBpZiAoaXNCdWlsdEluVGFnKG5hbWUpIHx8IGNvbmZpZy5pc1Jlc2VydmVkVGFnKG5hbWUpKSB7CiAgICB3YXJuKAogICAgICAnRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCAnICsKICAgICAgJ2lkOiAnICsgbmFtZQogICAgKTsKICB9Cn0KCi8qKgogKiBFbnN1cmUgYWxsIHByb3BzIG9wdGlvbiBzeW50YXggYXJlIG5vcm1hbGl6ZWQgaW50byB0aGUKICogT2JqZWN0LWJhc2VkIGZvcm1hdC4KICovCmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzIChvcHRpb25zLCB2bSkgewogIHZhciBwcm9wcyA9IG9wdGlvbnMucHJvcHM7CiAgaWYgKCFwcm9wcykgeyByZXR1cm4gfQogIHZhciByZXMgPSB7fTsKICB2YXIgaSwgdmFsLCBuYW1lOwogIGlmIChBcnJheS5pc0FycmF5KHByb3BzKSkgewogICAgaSA9IHByb3BzLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdmFsID0gcHJvcHNbaV07CiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgICAgIG5hbWUgPSBjYW1lbGl6ZSh2YWwpOwogICAgICAgIHJlc1tuYW1lXSA9IHsgdHlwZTogbnVsbCB9OwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oJ3Byb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC4nKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChwcm9wcykpIHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgICB2YWwgPSBwcm9wc1trZXldOwogICAgICBuYW1lID0gY2FtZWxpemUoa2V5KTsKICAgICAgcmVzW25hbWVdID0gaXNQbGFpbk9iamVjdCh2YWwpCiAgICAgICAgPyB2YWwKICAgICAgICA6IHsgdHlwZTogdmFsIH07CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJwcm9wc1wiOiBleHBlY3RlZCBhbiBBcnJheSBvciBhbiBPYmplY3QsICIgKwogICAgICAiYnV0IGdvdCAiICsgKHRvUmF3VHlwZShwcm9wcykpICsgIi4iLAogICAgICB2bQogICAgKTsKICB9CiAgb3B0aW9ucy5wcm9wcyA9IHJlczsKfQoKLyoqCiAqIE5vcm1hbGl6ZSBhbGwgaW5qZWN0aW9ucyBpbnRvIE9iamVjdC1iYXNlZCBmb3JtYXQKICovCmZ1bmN0aW9uIG5vcm1hbGl6ZUluamVjdCAob3B0aW9ucywgdm0pIHsKICB2YXIgaW5qZWN0ID0gb3B0aW9ucy5pbmplY3Q7CiAgaWYgKCFpbmplY3QpIHsgcmV0dXJuIH0KICB2YXIgbm9ybWFsaXplZCA9IG9wdGlvbnMuaW5qZWN0ID0ge307CiAgaWYgKEFycmF5LmlzQXJyYXkoaW5qZWN0KSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmplY3QubGVuZ3RoOyBpKyspIHsKICAgICAgbm9ybWFsaXplZFtpbmplY3RbaV1dID0geyBmcm9tOiBpbmplY3RbaV0gfTsKICAgIH0KICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoaW5qZWN0KSkgewogICAgZm9yICh2YXIga2V5IGluIGluamVjdCkgewogICAgICB2YXIgdmFsID0gaW5qZWN0W2tleV07CiAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IGlzUGxhaW5PYmplY3QodmFsKQogICAgICAgID8gZXh0ZW5kKHsgZnJvbToga2V5IH0sIHZhbCkKICAgICAgICA6IHsgZnJvbTogdmFsIH07CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCJpbmplY3RcIjogZXhwZWN0ZWQgYW4gQXJyYXkgb3IgYW4gT2JqZWN0LCAiICsKICAgICAgImJ1dCBnb3QgIiArICh0b1Jhd1R5cGUoaW5qZWN0KSkgKyAiLiIsCiAgICAgIHZtCiAgICApOwogIH0KfQoKLyoqCiAqIE5vcm1hbGl6ZSByYXcgZnVuY3Rpb24gZGlyZWN0aXZlcyBpbnRvIG9iamVjdCBmb3JtYXQuCiAqLwpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzIChvcHRpb25zKSB7CiAgdmFyIGRpcnMgPSBvcHRpb25zLmRpcmVjdGl2ZXM7CiAgaWYgKGRpcnMpIHsKICAgIGZvciAodmFyIGtleSBpbiBkaXJzKSB7CiAgICAgIHZhciBkZWYgPSBkaXJzW2tleV07CiAgICAgIGlmICh0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZGlyc1trZXldID0geyBiaW5kOiBkZWYsIHVwZGF0ZTogZGVmIH07CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGFzc2VydE9iamVjdFR5cGUgKG5hbWUsIHZhbHVlLCB2bSkgewogIGlmICghaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHsKICAgIHdhcm4oCiAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXCIiICsgbmFtZSArICJcIjogZXhwZWN0ZWQgYW4gT2JqZWN0LCAiICsKICAgICAgImJ1dCBnb3QgIiArICh0b1Jhd1R5cGUodmFsdWUpKSArICIuIiwKICAgICAgdm0KICAgICk7CiAgfQp9CgovKioKICogTWVyZ2UgdHdvIG9wdGlvbiBvYmplY3RzIGludG8gYSBuZXcgb25lLgogKiBDb3JlIHV0aWxpdHkgdXNlZCBpbiBib3RoIGluc3RhbnRpYXRpb24gYW5kIGluaGVyaXRhbmNlLgogKi8KZnVuY3Rpb24gbWVyZ2VPcHRpb25zICgKICBwYXJlbnQsCiAgY2hpbGQsCiAgdm0KKSB7CiAgewogICAgY2hlY2tDb21wb25lbnRzKGNoaWxkKTsKICB9CgogIGlmICh0eXBlb2YgY2hpbGQgPT09ICdmdW5jdGlvbicpIHsKICAgIGNoaWxkID0gY2hpbGQub3B0aW9uczsKICB9CgogIG5vcm1hbGl6ZVByb3BzKGNoaWxkLCB2bSk7CiAgbm9ybWFsaXplSW5qZWN0KGNoaWxkLCB2bSk7CiAgbm9ybWFsaXplRGlyZWN0aXZlcyhjaGlsZCk7CiAgdmFyIGV4dGVuZHNGcm9tID0gY2hpbGQuZXh0ZW5kczsKICBpZiAoZXh0ZW5kc0Zyb20pIHsKICAgIHBhcmVudCA9IG1lcmdlT3B0aW9ucyhwYXJlbnQsIGV4dGVuZHNGcm9tLCB2bSk7CiAgfQogIGlmIChjaGlsZC5taXhpbnMpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2hpbGQubWl4aW5zLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBjaGlsZC5taXhpbnNbaV0sIHZtKTsKICAgIH0KICB9CiAgdmFyIG9wdGlvbnMgPSB7fTsKICB2YXIga2V5OwogIGZvciAoa2V5IGluIHBhcmVudCkgewogICAgbWVyZ2VGaWVsZChrZXkpOwogIH0KICBmb3IgKGtleSBpbiBjaGlsZCkgewogICAgaWYgKCFoYXNPd24ocGFyZW50LCBrZXkpKSB7CiAgICAgIG1lcmdlRmllbGQoa2V5KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gbWVyZ2VGaWVsZCAoa2V5KSB7CiAgICB2YXIgc3RyYXQgPSBzdHJhdHNba2V5XSB8fCBkZWZhdWx0U3RyYXQ7CiAgICBvcHRpb25zW2tleV0gPSBzdHJhdChwYXJlbnRba2V5XSwgY2hpbGRba2V5XSwgdm0sIGtleSk7CiAgfQogIHJldHVybiBvcHRpb25zCn0KCi8qKgogKiBSZXNvbHZlIGFuIGFzc2V0LgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYmVjYXVzZSBjaGlsZCBpbnN0YW5jZXMgbmVlZCBhY2Nlc3MKICogdG8gYXNzZXRzIGRlZmluZWQgaW4gaXRzIGFuY2VzdG9yIGNoYWluLgogKi8KZnVuY3Rpb24gcmVzb2x2ZUFzc2V0ICgKICBvcHRpb25zLAogIHR5cGUsCiAgaWQsCiAgd2Fybk1pc3NpbmcKKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycpIHsKICAgIHJldHVybgogIH0KICB2YXIgYXNzZXRzID0gb3B0aW9uc1t0eXBlXTsKICAvLyBjaGVjayBsb2NhbCByZWdpc3RyYXRpb24gdmFyaWF0aW9ucyBmaXJzdAogIGlmIChoYXNPd24oYXNzZXRzLCBpZCkpIHsgcmV0dXJuIGFzc2V0c1tpZF0gfQogIHZhciBjYW1lbGl6ZWRJZCA9IGNhbWVsaXplKGlkKTsKICBpZiAoaGFzT3duKGFzc2V0cywgY2FtZWxpemVkSWQpKSB7IHJldHVybiBhc3NldHNbY2FtZWxpemVkSWRdIH0KICB2YXIgUGFzY2FsQ2FzZUlkID0gY2FwaXRhbGl6ZShjYW1lbGl6ZWRJZCk7CiAgaWYgKGhhc093bihhc3NldHMsIFBhc2NhbENhc2VJZCkpIHsgcmV0dXJuIGFzc2V0c1tQYXNjYWxDYXNlSWRdIH0KICAvLyBmYWxsYmFjayB0byBwcm90b3R5cGUgY2hhaW4KICB2YXIgcmVzID0gYXNzZXRzW2lkXSB8fCBhc3NldHNbY2FtZWxpemVkSWRdIHx8IGFzc2V0c1tQYXNjYWxDYXNlSWRdOwogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2Fybk1pc3NpbmcgJiYgIXJlcykgewogICAgd2FybigKICAgICAgJ0ZhaWxlZCB0byByZXNvbHZlICcgKyB0eXBlLnNsaWNlKDAsIC0xKSArICc6ICcgKyBpZCwKICAgICAgb3B0aW9ucwogICAgKTsKICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCmZ1bmN0aW9uIHZhbGlkYXRlUHJvcCAoCiAga2V5LAogIHByb3BPcHRpb25zLAogIHByb3BzRGF0YSwKICB2bQopIHsKICB2YXIgcHJvcCA9IHByb3BPcHRpb25zW2tleV07CiAgdmFyIGFic2VudCA9ICFoYXNPd24ocHJvcHNEYXRhLCBrZXkpOwogIHZhciB2YWx1ZSA9IHByb3BzRGF0YVtrZXldOwogIC8vIGJvb2xlYW4gY2FzdGluZwogIHZhciBib29sZWFuSW5kZXggPSBnZXRUeXBlSW5kZXgoQm9vbGVhbiwgcHJvcC50eXBlKTsKICBpZiAoYm9vbGVhbkluZGV4ID4gLTEpIHsKICAgIGlmIChhYnNlbnQgJiYgIWhhc093bihwcm9wLCAnZGVmYXVsdCcpKSB7CiAgICAgIHZhbHVlID0gZmFsc2U7CiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gaHlwaGVuYXRlKGtleSkpIHsKICAgICAgLy8gb25seSBjYXN0IGVtcHR5IHN0cmluZyAvIHNhbWUgbmFtZSB0byBib29sZWFuIGlmCiAgICAgIC8vIGJvb2xlYW4gaGFzIGhpZ2hlciBwcmlvcml0eQogICAgICB2YXIgc3RyaW5nSW5kZXggPSBnZXRUeXBlSW5kZXgoU3RyaW5nLCBwcm9wLnR5cGUpOwogICAgICBpZiAoc3RyaW5nSW5kZXggPCAwIHx8IGJvb2xlYW5JbmRleCA8IHN0cmluZ0luZGV4KSB7CiAgICAgICAgdmFsdWUgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQogIC8vIGNoZWNrIGRlZmF1bHQgdmFsdWUKICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgdmFsdWUgPSBnZXRQcm9wRGVmYXVsdFZhbHVlKHZtLCBwcm9wLCBrZXkpOwogICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBmcmVzaCBjb3B5LAogICAgLy8gbWFrZSBzdXJlIHRvIG9ic2VydmUgaXQuCiAgICB2YXIgcHJldlNob3VsZE9ic2VydmUgPSBzaG91bGRPYnNlcnZlOwogICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpOwogICAgb2JzZXJ2ZSh2YWx1ZSk7CiAgICB0b2dnbGVPYnNlcnZpbmcocHJldlNob3VsZE9ic2VydmUpOwogIH0KICB7CiAgICBhc3NlcnRQcm9wKHByb3AsIGtleSwgdmFsdWUsIHZtLCBhYnNlbnQpOwogIH0KICByZXR1cm4gdmFsdWUKfQoKLyoqCiAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHByb3AuCiAqLwpmdW5jdGlvbiBnZXRQcm9wRGVmYXVsdFZhbHVlICh2bSwgcHJvcCwga2V5KSB7CiAgLy8gbm8gZGVmYXVsdCwgcmV0dXJuIHVuZGVmaW5lZAogIGlmICghaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHsKICAgIHJldHVybiB1bmRlZmluZWQKICB9CiAgdmFyIGRlZiA9IHByb3AuZGVmYXVsdDsKICAvLyB3YXJuIGFnYWluc3Qgbm9uLWZhY3RvcnkgZGVmYXVsdHMgZm9yIE9iamVjdCAmIEFycmF5CiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBpc09iamVjdChkZWYpKSB7CiAgICB3YXJuKAogICAgICAnSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBwcm9wICInICsga2V5ICsgJyI6ICcgKwogICAgICAnUHJvcHMgd2l0aCB0eXBlIE9iamVjdC9BcnJheSBtdXN0IHVzZSBhIGZhY3RvcnkgZnVuY3Rpb24gJyArCiAgICAgICd0byByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuJywKICAgICAgdm0KICAgICk7CiAgfQogIC8vIHRoZSByYXcgcHJvcCB2YWx1ZSB3YXMgYWxzbyB1bmRlZmluZWQgZnJvbSBwcmV2aW91cyByZW5kZXIsCiAgLy8gcmV0dXJuIHByZXZpb3VzIGRlZmF1bHQgdmFsdWUgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd2F0Y2hlciB0cmlnZ2VyCiAgaWYgKHZtICYmIHZtLiRvcHRpb25zLnByb3BzRGF0YSAmJgogICAgdm0uJG9wdGlvbnMucHJvcHNEYXRhW2tleV0gPT09IHVuZGVmaW5lZCAmJgogICAgdm0uX3Byb3BzW2tleV0gIT09IHVuZGVmaW5lZAogICkgewogICAgcmV0dXJuIHZtLl9wcm9wc1trZXldCiAgfQogIC8vIGNhbGwgZmFjdG9yeSBmdW5jdGlvbiBmb3Igbm9uLUZ1bmN0aW9uIHR5cGVzCiAgLy8gYSB2YWx1ZSBpcyBGdW5jdGlvbiBpZiBpdHMgcHJvdG90eXBlIGlzIGZ1bmN0aW9uIGV2ZW4gYWNyb3NzIGRpZmZlcmVudCBleGVjdXRpb24gY29udGV4dAogIHJldHVybiB0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nICYmIGdldFR5cGUocHJvcC50eXBlKSAhPT0gJ0Z1bmN0aW9uJwogICAgPyBkZWYuY2FsbCh2bSkKICAgIDogZGVmCn0KCi8qKgogKiBBc3NlcnQgd2hldGhlciBhIHByb3AgaXMgdmFsaWQuCiAqLwpmdW5jdGlvbiBhc3NlcnRQcm9wICgKICBwcm9wLAogIG5hbWUsCiAgdmFsdWUsCiAgdm0sCiAgYWJzZW50CikgewogIGlmIChwcm9wLnJlcXVpcmVkICYmIGFic2VudCkgewogICAgd2FybigKICAgICAgJ01pc3NpbmcgcmVxdWlyZWQgcHJvcDogIicgKyBuYW1lICsgJyInLAogICAgICB2bQogICAgKTsKICAgIHJldHVybgogIH0KICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcHJvcC5yZXF1aXJlZCkgewogICAgcmV0dXJuCiAgfQogIHZhciB0eXBlID0gcHJvcC50eXBlOwogIHZhciB2YWxpZCA9ICF0eXBlIHx8IHR5cGUgPT09IHRydWU7CiAgdmFyIGV4cGVjdGVkVHlwZXMgPSBbXTsKICBpZiAodHlwZSkgewogICAgaWYgKCFBcnJheS5pc0FycmF5KHR5cGUpKSB7CiAgICAgIHR5cGUgPSBbdHlwZV07CiAgICB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGUubGVuZ3RoICYmICF2YWxpZDsgaSsrKSB7CiAgICAgIHZhciBhc3NlcnRlZFR5cGUgPSBhc3NlcnRUeXBlKHZhbHVlLCB0eXBlW2ldKTsKICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGFzc2VydGVkVHlwZS5leHBlY3RlZFR5cGUgfHwgJycpOwogICAgICB2YWxpZCA9IGFzc2VydGVkVHlwZS52YWxpZDsKICAgIH0KICB9CiAgaWYgKCF2YWxpZCkgewogICAgd2FybigKICAgICAgIkludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCIiICsgbmFtZSArICJcIi4iICsKICAgICAgIiBFeHBlY3RlZCAiICsgKGV4cGVjdGVkVHlwZXMubWFwKGNhcGl0YWxpemUpLmpvaW4oJywgJykpICsKICAgICAgIiwgZ290ICIgKyAodG9SYXdUeXBlKHZhbHVlKSkgKyAiLiIsCiAgICAgIHZtCiAgICApOwogICAgcmV0dXJuCiAgfQogIHZhciB2YWxpZGF0b3IgPSBwcm9wLnZhbGlkYXRvcjsKICBpZiAodmFsaWRhdG9yKSB7CiAgICBpZiAoIXZhbGlkYXRvcih2YWx1ZSkpIHsKICAgICAgd2FybigKICAgICAgICAnSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCAiJyArIG5hbWUgKyAnIi4nLAogICAgICAgIHZtCiAgICAgICk7CiAgICB9CiAgfQp9Cgp2YXIgc2ltcGxlQ2hlY2tSRSA9IC9eKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxGdW5jdGlvbnxTeW1ib2wpJC87CgpmdW5jdGlvbiBhc3NlcnRUeXBlICh2YWx1ZSwgdHlwZSkgewogIHZhciB2YWxpZDsKICB2YXIgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZSh0eXBlKTsKICBpZiAoc2ltcGxlQ2hlY2tSRS50ZXN0KGV4cGVjdGVkVHlwZSkpIHsKICAgIHZhciB0ID0gdHlwZW9mIHZhbHVlOwogICAgdmFsaWQgPSB0ID09PSBleHBlY3RlZFR5cGUudG9Mb3dlckNhc2UoKTsKICAgIC8vIGZvciBwcmltaXRpdmUgd3JhcHBlciBvYmplY3RzCiAgICBpZiAoIXZhbGlkICYmIHQgPT09ICdvYmplY3QnKSB7CiAgICAgIHZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiB0eXBlOwogICAgfQogIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnT2JqZWN0JykgewogICAgdmFsaWQgPSBpc1BsYWluT2JqZWN0KHZhbHVlKTsKICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ0FycmF5JykgewogICAgdmFsaWQgPSBBcnJheS5pc0FycmF5KHZhbHVlKTsKICB9IGVsc2UgewogICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7CiAgfQogIHJldHVybiB7CiAgICB2YWxpZDogdmFsaWQsCiAgICBleHBlY3RlZFR5cGU6IGV4cGVjdGVkVHlwZQogIH0KfQoKLyoqCiAqIFVzZSBmdW5jdGlvbiBzdHJpbmcgbmFtZSB0byBjaGVjayBidWlsdC1pbiB0eXBlcywKICogYmVjYXVzZSBhIHNpbXBsZSBlcXVhbGl0eSBjaGVjayB3aWxsIGZhaWwgd2hlbiBydW5uaW5nCiAqIGFjcm9zcyBkaWZmZXJlbnQgdm1zIC8gaWZyYW1lcy4KICovCmZ1bmN0aW9uIGdldFR5cGUgKGZuKSB7CiAgdmFyIG1hdGNoID0gZm4gJiYgZm4udG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7CiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiAnJwp9CgpmdW5jdGlvbiBpc1NhbWVUeXBlIChhLCBiKSB7CiAgcmV0dXJuIGdldFR5cGUoYSkgPT09IGdldFR5cGUoYikKfQoKZnVuY3Rpb24gZ2V0VHlwZUluZGV4ICh0eXBlLCBleHBlY3RlZFR5cGVzKSB7CiAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVHlwZXMpKSB7CiAgICByZXR1cm4gaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzLCB0eXBlKSA/IDAgOiAtMQogIH0KICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXhwZWN0ZWRUeXBlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgaWYgKGlzU2FtZVR5cGUoZXhwZWN0ZWRUeXBlc1tpXSwgdHlwZSkpIHsKICAgICAgcmV0dXJuIGkKICAgIH0KICB9CiAgcmV0dXJuIC0xCn0KCi8qICAqLwoKZnVuY3Rpb24gaGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICBpZiAodm0pIHsKICAgIHZhciBjdXIgPSB2bTsKICAgIHdoaWxlICgoY3VyID0gY3VyLiRwYXJlbnQpKSB7CiAgICAgIHZhciBob29rcyA9IGN1ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkOwogICAgICBpZiAoaG9va3MpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgY2FwdHVyZSA9IGhvb2tzW2ldLmNhbGwoY3VyLCBlcnIsIHZtLCBpbmZvKSA9PT0gZmFsc2U7CiAgICAgICAgICAgIGlmIChjYXB0dXJlKSB7IHJldHVybiB9CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGdsb2JhbEhhbmRsZUVycm9yKGUsIGN1ciwgJ2Vycm9yQ2FwdHVyZWQgaG9vaycpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBnbG9iYWxIYW5kbGVFcnJvcihlcnIsIHZtLCBpbmZvKTsKfQoKZnVuY3Rpb24gZ2xvYmFsSGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICBpZiAoY29uZmlnLmVycm9ySGFuZGxlcikgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIGNvbmZpZy5lcnJvckhhbmRsZXIuY2FsbChudWxsLCBlcnIsIHZtLCBpbmZvKQogICAgfSBjYXRjaCAoZSkgewogICAgICBsb2dFcnJvcihlLCBudWxsLCAnY29uZmlnLmVycm9ySGFuZGxlcicpOwogICAgfQogIH0KICBsb2dFcnJvcihlcnIsIHZtLCBpbmZvKTsKfQoKZnVuY3Rpb24gbG9nRXJyb3IgKGVyciwgdm0sIGluZm8pIHsKICB7CiAgICB3YXJuKCgiRXJyb3IgaW4gIiArIGluZm8gKyAiOiBcIiIgKyAoZXJyLnRvU3RyaW5nKCkpICsgIlwiIiksIHZtKTsKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICBpZiAoKGluQnJvd3NlciB8fCBpbldlZXgpICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykgewogICAgY29uc29sZS5lcnJvcihlcnIpOwogIH0gZWxzZSB7CiAgICB0aHJvdyBlcnIKICB9Cn0KCi8qICAqLwovKiBnbG9iYWxzIE1lc3NhZ2VDaGFubmVsICovCgp2YXIgY2FsbGJhY2tzID0gW107CnZhciBwZW5kaW5nID0gZmFsc2U7CgpmdW5jdGlvbiBmbHVzaENhbGxiYWNrcyAoKSB7CiAgcGVuZGluZyA9IGZhbHNlOwogIHZhciBjb3BpZXMgPSBjYWxsYmFja3Muc2xpY2UoMCk7CiAgY2FsbGJhY2tzLmxlbmd0aCA9IDA7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3BpZXMubGVuZ3RoOyBpKyspIHsKICAgIGNvcGllc1tpXSgpOwogIH0KfQoKLy8gSGVyZSB3ZSBoYXZlIGFzeW5jIGRlZmVycmluZyB3cmFwcGVycyB1c2luZyBib3RoIG1pY3JvdGFza3MgYW5kIChtYWNybykgdGFza3MuCi8vIEluIDwgMi40IHdlIHVzZWQgbWljcm90YXNrcyBldmVyeXdoZXJlLCBidXQgdGhlcmUgYXJlIHNvbWUgc2NlbmFyaW9zIHdoZXJlCi8vIG1pY3JvdGFza3MgaGF2ZSB0b28gaGlnaCBhIHByaW9yaXR5IGFuZCBmaXJlIGluIGJldHdlZW4gc3VwcG9zZWRseQovLyBzZXF1ZW50aWFsIGV2ZW50cyAoZS5nLiAjNDUyMSwgIzY2OTApIG9yIGV2ZW4gYmV0d2VlbiBidWJibGluZyBvZiB0aGUgc2FtZQovLyBldmVudCAoIzY1NjYpLiBIb3dldmVyLCB1c2luZyAobWFjcm8pIHRhc2tzIGV2ZXJ5d2hlcmUgYWxzbyBoYXMgc3VidGxlIHByb2JsZW1zCi8vIHdoZW4gc3RhdGUgaXMgY2hhbmdlZCByaWdodCBiZWZvcmUgcmVwYWludCAoZS5nLiAjNjgxMywgb3V0LWluIHRyYW5zaXRpb25zKS4KLy8gSGVyZSB3ZSB1c2UgbWljcm90YXNrIGJ5IGRlZmF1bHQsIGJ1dCBleHBvc2UgYSB3YXkgdG8gZm9yY2UgKG1hY3JvKSB0YXNrIHdoZW4KLy8gbmVlZGVkIChlLmcuIGluIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIGJ5IHYtb24pLgp2YXIgbWljcm9UaW1lckZ1bmM7CnZhciBtYWNyb1RpbWVyRnVuYzsKdmFyIHVzZU1hY3JvVGFzayA9IGZhbHNlOwoKLy8gRGV0ZXJtaW5lIChtYWNybykgdGFzayBkZWZlciBpbXBsZW1lbnRhdGlvbi4KLy8gVGVjaG5pY2FsbHkgc2V0SW1tZWRpYXRlIHNob3VsZCBiZSB0aGUgaWRlYWwgY2hvaWNlLCBidXQgaXQncyBvbmx5IGF2YWlsYWJsZQovLyBpbiBJRS4gVGhlIG9ubHkgcG9seWZpbGwgdGhhdCBjb25zaXN0ZW50bHkgcXVldWVzIHRoZSBjYWxsYmFjayBhZnRlciBhbGwgRE9NCi8vIGV2ZW50cyB0cmlnZ2VyZWQgaW4gdGhlIHNhbWUgbG9vcCBpcyBieSB1c2luZyBNZXNzYWdlQ2hhbm5lbC4KLyogaXN0YW5idWwgaWdub3JlIGlmICovCmlmICh0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShzZXRJbW1lZGlhdGUpKSB7CiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICBzZXRJbW1lZGlhdGUoZmx1c2hDYWxsYmFja3MpOwogIH07Cn0gZWxzZSBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJyAmJiAoCiAgaXNOYXRpdmUoTWVzc2FnZUNoYW5uZWwpIHx8CiAgLy8gUGhhbnRvbUpTCiAgTWVzc2FnZUNoYW5uZWwudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgTWVzc2FnZUNoYW5uZWxDb25zdHJ1Y3Rvcl0nCikpIHsKICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpOwogIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjsKICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZsdXNoQ2FsbGJhY2tzOwogIG1hY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkgewogICAgcG9ydC5wb3N0TWVzc2FnZSgxKTsKICB9Owp9IGVsc2UgewogIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgbWFjcm9UaW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7CiAgICBzZXRUaW1lb3V0KGZsdXNoQ2FsbGJhY2tzLCAwKTsKICB9Owp9CgovLyBEZXRlcm1pbmUgbWljcm90YXNrIGRlZmVyIGltcGxlbWVudGF0aW9uLgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCwgJGZsb3ctZGlzYWJsZS1saW5lICovCmlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUHJvbWlzZSkpIHsKICB2YXIgcCA9IFByb21pc2UucmVzb2x2ZSgpOwogIG1pY3JvVGltZXJGdW5jID0gZnVuY3Rpb24gKCkgewogICAgcC50aGVuKGZsdXNoQ2FsbGJhY2tzKTsKICAgIC8vIGluIHByb2JsZW1hdGljIFVJV2ViVmlld3MsIFByb21pc2UudGhlbiBkb2Vzbid0IGNvbXBsZXRlbHkgYnJlYWssIGJ1dAogICAgLy8gaXQgY2FuIGdldCBzdHVjayBpbiBhIHdlaXJkIHN0YXRlIHdoZXJlIGNhbGxiYWNrcyBhcmUgcHVzaGVkIGludG8gdGhlCiAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYnV0IHRoZSBxdWV1ZSBpc24ndCBiZWluZyBmbHVzaGVkLCB1bnRpbCB0aGUgYnJvd3NlcgogICAgLy8gbmVlZHMgdG8gZG8gc29tZSBvdGhlciB3b3JrLCBlLmcuIGhhbmRsZSBhIHRpbWVyLiBUaGVyZWZvcmUgd2UgY2FuCiAgICAvLyAiZm9yY2UiIHRoZSBtaWNyb3Rhc2sgcXVldWUgdG8gYmUgZmx1c2hlZCBieSBhZGRpbmcgYW4gZW1wdHkgdGltZXIuCiAgICBpZiAoaXNJT1MpIHsgc2V0VGltZW91dChub29wKTsgfQogIH07Cn0gZWxzZSB7CiAgLy8gZmFsbGJhY2sgdG8gbWFjcm8KICBtaWNyb1RpbWVyRnVuYyA9IG1hY3JvVGltZXJGdW5jOwp9CgovKioKICogV3JhcCBhIGZ1bmN0aW9uIHNvIHRoYXQgaWYgYW55IGNvZGUgaW5zaWRlIHRyaWdnZXJzIHN0YXRlIGNoYW5nZSwKICogdGhlIGNoYW5nZXMgYXJlIHF1ZXVlZCB1c2luZyBhIChtYWNybykgdGFzayBpbnN0ZWFkIG9mIGEgbWljcm90YXNrLgogKi8KZnVuY3Rpb24gd2l0aE1hY3JvVGFzayAoZm4pIHsKICByZXR1cm4gZm4uX3dpdGhUYXNrIHx8IChmbi5fd2l0aFRhc2sgPSBmdW5jdGlvbiAoKSB7CiAgICB1c2VNYWNyb1Rhc2sgPSB0cnVlOwogICAgdmFyIHJlcyA9IGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICB1c2VNYWNyb1Rhc2sgPSBmYWxzZTsKICAgIHJldHVybiByZXMKICB9KQp9CgpmdW5jdGlvbiBuZXh0VGljayAoY2IsIGN0eCkgewogIHZhciBfcmVzb2x2ZTsKICBjYWxsYmFja3MucHVzaChmdW5jdGlvbiAoKSB7CiAgICBpZiAoY2IpIHsKICAgICAgdHJ5IHsKICAgICAgICBjYi5jYWxsKGN0eCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBoYW5kbGVFcnJvcihlLCBjdHgsICduZXh0VGljaycpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF9yZXNvbHZlKSB7CiAgICAgIF9yZXNvbHZlKGN0eCk7CiAgICB9CiAgfSk7CiAgaWYgKCFwZW5kaW5nKSB7CiAgICBwZW5kaW5nID0gdHJ1ZTsKICAgIGlmICh1c2VNYWNyb1Rhc2spIHsKICAgICAgbWFjcm9UaW1lckZ1bmMoKTsKICAgIH0gZWxzZSB7CiAgICAgIG1pY3JvVGltZXJGdW5jKCk7CiAgICB9CiAgfQogIC8vICRmbG93LWRpc2FibGUtbGluZQogIGlmICghY2IgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgX3Jlc29sdmUgPSByZXNvbHZlOwogICAgfSkKICB9Cn0KCi8qICAqLwoKdmFyIG1hcms7CnZhciBtZWFzdXJlOwoKewogIHZhciBwZXJmID0gaW5Ccm93c2VyICYmIHdpbmRvdy5wZXJmb3JtYW5jZTsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoCiAgICBwZXJmICYmCiAgICBwZXJmLm1hcmsgJiYKICAgIHBlcmYubWVhc3VyZSAmJgogICAgcGVyZi5jbGVhck1hcmtzICYmCiAgICBwZXJmLmNsZWFyTWVhc3VyZXMKICApIHsKICAgIG1hcmsgPSBmdW5jdGlvbiAodGFnKSB7IHJldHVybiBwZXJmLm1hcmsodGFnKTsgfTsKICAgIG1lYXN1cmUgPSBmdW5jdGlvbiAobmFtZSwgc3RhcnRUYWcsIGVuZFRhZykgewogICAgICBwZXJmLm1lYXN1cmUobmFtZSwgc3RhcnRUYWcsIGVuZFRhZyk7CiAgICAgIHBlcmYuY2xlYXJNYXJrcyhzdGFydFRhZyk7CiAgICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpOwogICAgICBwZXJmLmNsZWFyTWVhc3VyZXMobmFtZSk7CiAgICB9OwogIH0KfQoKLyogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoIFByb3h5ICovCgp2YXIgaW5pdFByb3h5OwoKewogIHZhciBhbGxvd2VkR2xvYmFscyA9IG1ha2VNYXAoCiAgICAnSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTiwnICsKICAgICdwYXJzZUZsb2F0LHBhcnNlSW50LGRlY29kZVVSSSxkZWNvZGVVUklDb21wb25lbnQsZW5jb2RlVVJJLGVuY29kZVVSSUNvbXBvbmVudCwnICsKICAgICdNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsJyArCiAgICAncmVxdWlyZScgLy8gZm9yIFdlYnBhY2svQnJvd3NlcmlmeQogICk7CgogIHZhciB3YXJuTm9uUHJlc2VudCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgewogICAgd2FybigKICAgICAgIlByb3BlcnR5IG9yIG1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaXMgbm90IGRlZmluZWQgb24gdGhlIGluc3RhbmNlIGJ1dCAiICsKICAgICAgJ3JlZmVyZW5jZWQgZHVyaW5nIHJlbmRlci4gTWFrZSBzdXJlIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyByZWFjdGl2ZSwgJyArCiAgICAgICdlaXRoZXIgaW4gdGhlIGRhdGEgb3B0aW9uLCBvciBmb3IgY2xhc3MtYmFzZWQgY29tcG9uZW50cywgYnkgJyArCiAgICAgICdpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5LiAnICsKICAgICAgJ1NlZTogaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvcmVhY3Rpdml0eS5odG1sI0RlY2xhcmluZy1SZWFjdGl2ZS1Qcm9wZXJ0aWVzLicsCiAgICAgIHRhcmdldAogICAgKTsKICB9OwoKICB2YXIgaGFzUHJveHkgPQogICAgdHlwZW9mIFByb3h5ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShQcm94eSk7CgogIGlmIChoYXNQcm94eSkgewogICAgdmFyIGlzQnVpbHRJbk1vZGlmaWVyID0gbWFrZU1hcCgnc3RvcCxwcmV2ZW50LHNlbGYsY3RybCxzaGlmdCxhbHQsbWV0YSxleGFjdCcpOwogICAgY29uZmlnLmtleUNvZGVzID0gbmV3IFByb3h5KGNvbmZpZy5rZXlDb2RlcywgewogICAgICBzZXQ6IGZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbHVlKSB7CiAgICAgICAgaWYgKGlzQnVpbHRJbk1vZGlmaWVyKGtleSkpIHsKICAgICAgICAgIHdhcm4oKCJBdm9pZCBvdmVyd3JpdGluZyBidWlsdC1pbiBtb2RpZmllciBpbiBjb25maWcua2V5Q29kZXM6IC4iICsga2V5KSk7CiAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIHZhciBoYXNIYW5kbGVyID0gewogICAgaGFzOiBmdW5jdGlvbiBoYXMgKHRhcmdldCwga2V5KSB7CiAgICAgIHZhciBoYXMgPSBrZXkgaW4gdGFyZ2V0OwogICAgICB2YXIgaXNBbGxvd2VkID0gYWxsb3dlZEdsb2JhbHMoa2V5KSB8fCBrZXkuY2hhckF0KDApID09PSAnXyc7CiAgICAgIGlmICghaGFzICYmICFpc0FsbG93ZWQpIHsKICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGhhcyB8fCAhaXNBbGxvd2VkCiAgICB9CiAgfTsKCiAgdmFyIGdldEhhbmRsZXIgPSB7CiAgICBnZXQ6IGZ1bmN0aW9uIGdldCAodGFyZ2V0LCBrZXkpIHsKICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmICEoa2V5IGluIHRhcmdldCkpIHsKICAgICAgICB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRhcmdldFtrZXldCiAgICB9CiAgfTsKCiAgaW5pdFByb3h5ID0gZnVuY3Rpb24gaW5pdFByb3h5ICh2bSkgewogICAgaWYgKGhhc1Byb3h5KSB7CiAgICAgIC8vIGRldGVybWluZSB3aGljaCBwcm94eSBoYW5kbGVyIHRvIHVzZQogICAgICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOwogICAgICB2YXIgaGFuZGxlcnMgPSBvcHRpb25zLnJlbmRlciAmJiBvcHRpb25zLnJlbmRlci5fd2l0aFN0cmlwcGVkCiAgICAgICAgPyBnZXRIYW5kbGVyCiAgICAgICAgOiBoYXNIYW5kbGVyOwogICAgICB2bS5fcmVuZGVyUHJveHkgPSBuZXcgUHJveHkodm0sIGhhbmRsZXJzKTsKICAgIH0gZWxzZSB7CiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IHZtOwogICAgfQogIH07Cn0KCi8qICAqLwoKdmFyIHNlZW5PYmplY3RzID0gbmV3IF9TZXQoKTsKCi8qKgogKiBSZWN1cnNpdmVseSB0cmF2ZXJzZSBhbiBvYmplY3QgdG8gZXZva2UgYWxsIGNvbnZlcnRlZAogKiBnZXR0ZXJzLCBzbyB0aGF0IGV2ZXJ5IG5lc3RlZCBwcm9wZXJ0eSBpbnNpZGUgdGhlIG9iamVjdAogKiBpcyBjb2xsZWN0ZWQgYXMgYSAiZGVlcCIgZGVwZW5kZW5jeS4KICovCmZ1bmN0aW9uIHRyYXZlcnNlICh2YWwpIHsKICBfdHJhdmVyc2UodmFsLCBzZWVuT2JqZWN0cyk7CiAgc2Vlbk9iamVjdHMuY2xlYXIoKTsKfQoKZnVuY3Rpb24gX3RyYXZlcnNlICh2YWwsIHNlZW4pIHsKICB2YXIgaSwga2V5czsKICB2YXIgaXNBID0gQXJyYXkuaXNBcnJheSh2YWwpOwogIGlmICgoIWlzQSAmJiAhaXNPYmplY3QodmFsKSkgfHwgT2JqZWN0LmlzRnJvemVuKHZhbCkgfHwgdmFsIGluc3RhbmNlb2YgVk5vZGUpIHsKICAgIHJldHVybgogIH0KICBpZiAodmFsLl9fb2JfXykgewogICAgdmFyIGRlcElkID0gdmFsLl9fb2JfXy5kZXAuaWQ7CiAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7CiAgICAgIHJldHVybgogICAgfQogICAgc2Vlbi5hZGQoZGVwSWQpOwogIH0KICBpZiAoaXNBKSB7CiAgICBpID0gdmFsLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsgX3RyYXZlcnNlKHZhbFtpXSwgc2Vlbik7IH0KICB9IGVsc2UgewogICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7CiAgICBpID0ga2V5cy5sZW5ndGg7CiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxba2V5c1tpXV0sIHNlZW4pOyB9CiAgfQp9CgovKiAgKi8KCnZhciBub3JtYWxpemVFdmVudCA9IGNhY2hlZChmdW5jdGlvbiAobmFtZSkgewogIHZhciBwYXNzaXZlID0gbmFtZS5jaGFyQXQoMCkgPT09ICcmJzsKICBuYW1lID0gcGFzc2l2ZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lOwogIHZhciBvbmNlJCQxID0gbmFtZS5jaGFyQXQoMCkgPT09ICd+JzsgLy8gUHJlZml4ZWQgbGFzdCwgY2hlY2tlZCBmaXJzdAogIG5hbWUgPSBvbmNlJCQxID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7CiAgdmFyIGNhcHR1cmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyEnOwogIG5hbWUgPSBjYXB0dXJlID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7CiAgcmV0dXJuIHsKICAgIG5hbWU6IG5hbWUsCiAgICBvbmNlOiBvbmNlJCQxLAogICAgY2FwdHVyZTogY2FwdHVyZSwKICAgIHBhc3NpdmU6IHBhc3NpdmUKICB9Cn0pOwoKZnVuY3Rpb24gY3JlYXRlRm5JbnZva2VyIChmbnMpIHsKICBmdW5jdGlvbiBpbnZva2VyICgpIHsKICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50czsKCiAgICB2YXIgZm5zID0gaW52b2tlci5mbnM7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnMpKSB7CiAgICAgIHZhciBjbG9uZWQgPSBmbnMuc2xpY2UoKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbG9uZWQubGVuZ3RoOyBpKyspIHsKICAgICAgICBjbG9uZWRbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzJDEpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyByZXR1cm4gaGFuZGxlciByZXR1cm4gdmFsdWUgZm9yIHNpbmdsZSBoYW5kbGVycwogICAgICByZXR1cm4gZm5zLmFwcGx5KG51bGwsIGFyZ3VtZW50cykKICAgIH0KICB9CiAgaW52b2tlci5mbnMgPSBmbnM7CiAgcmV0dXJuIGludm9rZXIKfQoKZnVuY3Rpb24gdXBkYXRlTGlzdGVuZXJzICgKICBvbiwKICBvbGRPbiwKICBhZGQsCiAgcmVtb3ZlJCQxLAogIHZtCikgewogIHZhciBuYW1lLCBkZWYsIGN1ciwgb2xkLCBldmVudDsKICBmb3IgKG5hbWUgaW4gb24pIHsKICAgIGRlZiA9IGN1ciA9IG9uW25hbWVdOwogICAgb2xkID0gb2xkT25bbmFtZV07CiAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoaXNVbmRlZihjdXIpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJJbnZhbGlkIGhhbmRsZXIgZm9yIGV2ZW50IFwiIiArIChldmVudC5uYW1lKSArICJcIjogZ290ICIgKyBTdHJpbmcoY3VyKSwKICAgICAgICB2bQogICAgICApOwogICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZCkpIHsKICAgICAgaWYgKGlzVW5kZWYoY3VyLmZucykpIHsKICAgICAgICBjdXIgPSBvbltuYW1lXSA9IGNyZWF0ZUZuSW52b2tlcihjdXIpOwogICAgICB9CiAgICAgIGFkZChldmVudC5uYW1lLCBjdXIsIGV2ZW50Lm9uY2UsIGV2ZW50LmNhcHR1cmUsIGV2ZW50LnBhc3NpdmUsIGV2ZW50LnBhcmFtcyk7CiAgICB9IGVsc2UgaWYgKGN1ciAhPT0gb2xkKSB7CiAgICAgIG9sZC5mbnMgPSBjdXI7CiAgICAgIG9uW25hbWVdID0gb2xkOwogICAgfQogIH0KICBmb3IgKG5hbWUgaW4gb2xkT24pIHsKICAgIGlmIChpc1VuZGVmKG9uW25hbWVdKSkgewogICAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpOwogICAgICByZW1vdmUkJDEoZXZlbnQubmFtZSwgb2xkT25bbmFtZV0sIGV2ZW50LmNhcHR1cmUpOwogICAgfQogIH0KfQoKLyogICovCgpmdW5jdGlvbiBtZXJnZVZOb2RlSG9vayAoZGVmLCBob29rS2V5LCBob29rKSB7CiAgaWYgKGRlZiBpbnN0YW5jZW9mIFZOb2RlKSB7CiAgICBkZWYgPSBkZWYuZGF0YS5ob29rIHx8IChkZWYuZGF0YS5ob29rID0ge30pOwogIH0KICB2YXIgaW52b2tlcjsKICB2YXIgb2xkSG9vayA9IGRlZltob29rS2V5XTsKCiAgZnVuY3Rpb24gd3JhcHBlZEhvb2sgKCkgewogICAgaG9vay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgLy8gaW1wb3J0YW50OiByZW1vdmUgbWVyZ2VkIGhvb2sgdG8gZW5zdXJlIGl0J3MgY2FsbGVkIG9ubHkgb25jZQogICAgLy8gYW5kIHByZXZlbnQgbWVtb3J5IGxlYWsKICAgIHJlbW92ZShpbnZva2VyLmZucywgd3JhcHBlZEhvb2spOwogIH0KCiAgaWYgKGlzVW5kZWYob2xkSG9vaykpIHsKICAgIC8vIG5vIGV4aXN0aW5nIGhvb2sKICAgIGludm9rZXIgPSBjcmVhdGVGbkludm9rZXIoW3dyYXBwZWRIb29rXSk7CiAgfSBlbHNlIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKGlzRGVmKG9sZEhvb2suZm5zKSAmJiBpc1RydWUob2xkSG9vay5tZXJnZWQpKSB7CiAgICAgIC8vIGFscmVhZHkgYSBtZXJnZWQgaW52b2tlcgogICAgICBpbnZva2VyID0gb2xkSG9vazsKICAgICAgaW52b2tlci5mbnMucHVzaCh3cmFwcGVkSG9vayk7CiAgICB9IGVsc2UgewogICAgICAvLyBleGlzdGluZyBwbGFpbiBob29rCiAgICAgIGludm9rZXIgPSBjcmVhdGVGbkludm9rZXIoW29sZEhvb2ssIHdyYXBwZWRIb29rXSk7CiAgICB9CiAgfQoKICBpbnZva2VyLm1lcmdlZCA9IHRydWU7CiAgZGVmW2hvb2tLZXldID0gaW52b2tlcjsKfQoKLyogICovCgpmdW5jdGlvbiBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhICgKICBkYXRhLAogIEN0b3IsCiAgdGFnCikgewogIC8vIHdlIGFyZSBvbmx5IGV4dHJhY3RpbmcgcmF3IHZhbHVlcyBoZXJlLgogIC8vIHZhbGlkYXRpb24gYW5kIGRlZmF1bHQgdmFsdWVzIGFyZSBoYW5kbGVkIGluIHRoZSBjaGlsZAogIC8vIGNvbXBvbmVudCBpdHNlbGYuCiAgdmFyIHByb3BPcHRpb25zID0gQ3Rvci5vcHRpb25zLnByb3BzOwogIGlmIChpc1VuZGVmKHByb3BPcHRpb25zKSkgewogICAgcmV0dXJuCiAgfQogIHZhciByZXMgPSB7fTsKICB2YXIgYXR0cnMgPSBkYXRhLmF0dHJzOwogIHZhciBwcm9wcyA9IGRhdGEucHJvcHM7CiAgaWYgKGlzRGVmKGF0dHJzKSB8fCBpc0RlZihwcm9wcykpIHsKICAgIGZvciAodmFyIGtleSBpbiBwcm9wT3B0aW9ucykgewogICAgICB2YXIgYWx0S2V5ID0gaHlwaGVuYXRlKGtleSk7CiAgICAgIHsKICAgICAgICB2YXIga2V5SW5Mb3dlckNhc2UgPSBrZXkudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAoCiAgICAgICAgICBrZXkgIT09IGtleUluTG93ZXJDYXNlICYmCiAgICAgICAgICBhdHRycyAmJiBoYXNPd24oYXR0cnMsIGtleUluTG93ZXJDYXNlKQogICAgICAgICkgewogICAgICAgICAgdGlwKAogICAgICAgICAgICAiUHJvcCBcIiIgKyBrZXlJbkxvd2VyQ2FzZSArICJcIiBpcyBwYXNzZWQgdG8gY29tcG9uZW50ICIgKwogICAgICAgICAgICAoZm9ybWF0Q29tcG9uZW50TmFtZSh0YWcgfHwgQ3RvcikpICsgIiwgYnV0IHRoZSBkZWNsYXJlZCBwcm9wIG5hbWUgaXMiICsKICAgICAgICAgICAgIiBcIiIgKyBrZXkgKyAiXCIuICIgKwogICAgICAgICAgICAiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgY2FtZWxDYXNlZCAiICsKICAgICAgICAgICAgInByb3BzIG5lZWQgdG8gdXNlIHRoZWlyIGtlYmFiLWNhc2UgZXF1aXZhbGVudHMgd2hlbiB1c2luZyBpbi1ET00gIiArCiAgICAgICAgICAgICJ0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIFwiIiArIGFsdEtleSArICJcIiBpbnN0ZWFkIG9mIFwiIiArIGtleSArICJcIi4iCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgICBjaGVja1Byb3AocmVzLCBwcm9wcywga2V5LCBhbHRLZXksIHRydWUpIHx8CiAgICAgIGNoZWNrUHJvcChyZXMsIGF0dHJzLCBrZXksIGFsdEtleSwgZmFsc2UpOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIGNoZWNrUHJvcCAoCiAgcmVzLAogIGhhc2gsCiAga2V5LAogIGFsdEtleSwKICBwcmVzZXJ2ZQopIHsKICBpZiAoaXNEZWYoaGFzaCkpIHsKICAgIGlmIChoYXNPd24oaGFzaCwga2V5KSkgewogICAgICByZXNba2V5XSA9IGhhc2hba2V5XTsKICAgICAgaWYgKCFwcmVzZXJ2ZSkgewogICAgICAgIGRlbGV0ZSBoYXNoW2tleV07CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWUKICAgIH0gZWxzZSBpZiAoaGFzT3duKGhhc2gsIGFsdEtleSkpIHsKICAgICAgcmVzW2tleV0gPSBoYXNoW2FsdEtleV07CiAgICAgIGlmICghcHJlc2VydmUpIHsKICAgICAgICBkZWxldGUgaGFzaFthbHRLZXldOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfQogIHJldHVybiBmYWxzZQp9CgovKiAgKi8KCi8vIFRoZSB0ZW1wbGF0ZSBjb21waWxlciBhdHRlbXB0cyB0byBtaW5pbWl6ZSB0aGUgbmVlZCBmb3Igbm9ybWFsaXphdGlvbiBieQovLyBzdGF0aWNhbGx5IGFuYWx5emluZyB0aGUgdGVtcGxhdGUgYXQgY29tcGlsZSB0aW1lLgovLwovLyBGb3IgcGxhaW4gSFRNTCBtYXJrdXAsIG5vcm1hbGl6YXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgc2tpcHBlZCBiZWNhdXNlIHRoZQovLyBnZW5lcmF0ZWQgcmVuZGVyIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIEFycmF5PFZOb2RlPi4gVGhlcmUgYXJlCi8vIHR3byBjYXNlcyB3aGVyZSBleHRyYSBub3JtYWxpemF0aW9uIGlzIG5lZWRlZDoKCi8vIDEuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbXBvbmVudHMgLSBiZWNhdXNlIGEgZnVuY3Rpb25hbCBjb21wb25lbnQKLy8gbWF5IHJldHVybiBhbiBBcnJheSBpbnN0ZWFkIG9mIGEgc2luZ2xlIHJvb3QuIEluIHRoaXMgY2FzZSwganVzdCBhIHNpbXBsZQovLyBub3JtYWxpemF0aW9uIGlzIG5lZWRlZCAtIGlmIGFueSBjaGlsZCBpcyBhbiBBcnJheSwgd2UgZmxhdHRlbiB0aGUgd2hvbGUKLy8gdGhpbmcgd2l0aCBBcnJheS5wcm90b3R5cGUuY29uY2F0LiBJdCBpcyBndWFyYW50ZWVkIHRvIGJlIG9ubHkgMS1sZXZlbCBkZWVwCi8vIGJlY2F1c2UgZnVuY3Rpb25hbCBjb21wb25lbnRzIGFscmVhZHkgbm9ybWFsaXplIHRoZWlyIG93biBjaGlsZHJlbi4KZnVuY3Rpb24gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW5baV0pKSB7CiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBjaGlsZHJlbikKICAgIH0KICB9CiAgcmV0dXJuIGNoaWxkcmVuCn0KCi8vIDIuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbnN0cnVjdHMgdGhhdCBhbHdheXMgZ2VuZXJhdGVkIG5lc3RlZCBBcnJheXMsCi8vIGUuZy4gPHRlbXBsYXRlPiwgPHNsb3Q+LCB2LWZvciwgb3Igd2hlbiB0aGUgY2hpbGRyZW4gaXMgcHJvdmlkZWQgYnkgdXNlcgovLyB3aXRoIGhhbmQtd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zIC8gSlNYLiBJbiBzdWNoIGNhc2VzIGEgZnVsbCBub3JtYWxpemF0aW9uCi8vIGlzIG5lZWRlZCB0byBjYXRlciB0byBhbGwgcG9zc2libGUgdHlwZXMgb2YgY2hpbGRyZW4gdmFsdWVzLgpmdW5jdGlvbiBub3JtYWxpemVDaGlsZHJlbiAoY2hpbGRyZW4pIHsKICByZXR1cm4gaXNQcmltaXRpdmUoY2hpbGRyZW4pCiAgICA/IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXQogICAgOiBBcnJheS5pc0FycmF5KGNoaWxkcmVuKQogICAgICA/IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oY2hpbGRyZW4pCiAgICAgIDogdW5kZWZpbmVkCn0KCmZ1bmN0aW9uIGlzVGV4dE5vZGUgKG5vZGUpIHsKICByZXR1cm4gaXNEZWYobm9kZSkgJiYgaXNEZWYobm9kZS50ZXh0KSAmJiBpc0ZhbHNlKG5vZGUuaXNDb21tZW50KQp9CgpmdW5jdGlvbiBub3JtYWxpemVBcnJheUNoaWxkcmVuIChjaGlsZHJlbiwgbmVzdGVkSW5kZXgpIHsKICB2YXIgcmVzID0gW107CiAgdmFyIGksIGMsIGxhc3RJbmRleCwgbGFzdDsKICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgIGMgPSBjaGlsZHJlbltpXTsKICAgIGlmIChpc1VuZGVmKGMpIHx8IHR5cGVvZiBjID09PSAnYm9vbGVhbicpIHsgY29udGludWUgfQogICAgbGFzdEluZGV4ID0gcmVzLmxlbmd0aCAtIDE7CiAgICBsYXN0ID0gcmVzW2xhc3RJbmRleF07CiAgICAvLyAgbmVzdGVkCiAgICBpZiAoQXJyYXkuaXNBcnJheShjKSkgewogICAgICBpZiAoYy5sZW5ndGggPiAwKSB7CiAgICAgICAgYyA9IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oYywgKChuZXN0ZWRJbmRleCB8fCAnJykgKyAiXyIgKyBpKSk7CiAgICAgICAgLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2RlcwogICAgICAgIGlmIChpc1RleHROb2RlKGNbMF0pICYmIGlzVGV4dE5vZGUobGFzdCkpIHsKICAgICAgICAgIHJlc1tsYXN0SW5kZXhdID0gY3JlYXRlVGV4dFZOb2RlKGxhc3QudGV4dCArIChjWzBdKS50ZXh0KTsKICAgICAgICAgIGMuc2hpZnQoKTsKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2guYXBwbHkocmVzLCBjKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZShjKSkgewogICAgICBpZiAoaXNUZXh0Tm9kZShsYXN0KSkgewogICAgICAgIC8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXMKICAgICAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgU1NSIGh5ZHJhdGlvbiBiZWNhdXNlIHRleHQgbm9kZXMgYXJlCiAgICAgICAgLy8gZXNzZW50aWFsbHkgbWVyZ2VkIHdoZW4gcmVuZGVyZWQgdG8gSFRNTCBzdHJpbmdzCiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYyk7CiAgICAgIH0gZWxzZSBpZiAoYyAhPT0gJycpIHsKICAgICAgICAvLyBjb252ZXJ0IHByaW1pdGl2ZSB0byB2bm9kZQogICAgICAgIHJlcy5wdXNoKGNyZWF0ZVRleHRWTm9kZShjKSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChpc1RleHROb2RlKGMpICYmIGlzVGV4dE5vZGUobGFzdCkpIHsKICAgICAgICAvLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzCiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYy50ZXh0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBkZWZhdWx0IGtleSBmb3IgbmVzdGVkIGFycmF5IGNoaWxkcmVuIChsaWtlbHkgZ2VuZXJhdGVkIGJ5IHYtZm9yKQogICAgICAgIGlmIChpc1RydWUoY2hpbGRyZW4uX2lzVkxpc3QpICYmCiAgICAgICAgICBpc0RlZihjLnRhZykgJiYKICAgICAgICAgIGlzVW5kZWYoYy5rZXkpICYmCiAgICAgICAgICBpc0RlZihuZXN0ZWRJbmRleCkpIHsKICAgICAgICAgIGMua2V5ID0gIl9fdmxpc3QiICsgbmVzdGVkSW5kZXggKyAiXyIgKyBpICsgIl9fIjsKICAgICAgICB9CiAgICAgICAgcmVzLnB1c2goYyk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCmZ1bmN0aW9uIGVuc3VyZUN0b3IgKGNvbXAsIGJhc2UpIHsKICBpZiAoCiAgICBjb21wLl9fZXNNb2R1bGUgfHwKICAgIChoYXNTeW1ib2wgJiYgY29tcFtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnTW9kdWxlJykKICApIHsKICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7CiAgfQogIHJldHVybiBpc09iamVjdChjb21wKQogICAgPyBiYXNlLmV4dGVuZChjb21wKQogICAgOiBjb21wCn0KCmZ1bmN0aW9uIGNyZWF0ZUFzeW5jUGxhY2Vob2xkZXIgKAogIGZhY3RvcnksCiAgZGF0YSwKICBjb250ZXh0LAogIGNoaWxkcmVuLAogIHRhZwopIHsKICB2YXIgbm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsKICBub2RlLmFzeW5jRmFjdG9yeSA9IGZhY3Rvcnk7CiAgbm9kZS5hc3luY01ldGEgPSB7IGRhdGE6IGRhdGEsIGNvbnRleHQ6IGNvbnRleHQsIGNoaWxkcmVuOiBjaGlsZHJlbiwgdGFnOiB0YWcgfTsKICByZXR1cm4gbm9kZQp9CgpmdW5jdGlvbiByZXNvbHZlQXN5bmNDb21wb25lbnQgKAogIGZhY3RvcnksCiAgYmFzZUN0b3IsCiAgY29udGV4dAopIHsKICBpZiAoaXNUcnVlKGZhY3RvcnkuZXJyb3IpICYmIGlzRGVmKGZhY3RvcnkuZXJyb3JDb21wKSkgewogICAgcmV0dXJuIGZhY3RvcnkuZXJyb3JDb21wCiAgfQoKICBpZiAoaXNEZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHsKICAgIHJldHVybiBmYWN0b3J5LnJlc29sdmVkCiAgfQoKICBpZiAoaXNUcnVlKGZhY3RvcnkubG9hZGluZykgJiYgaXNEZWYoZmFjdG9yeS5sb2FkaW5nQ29tcCkpIHsKICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmdDb21wCiAgfQoKICBpZiAoaXNEZWYoZmFjdG9yeS5jb250ZXh0cykpIHsKICAgIC8vIGFscmVhZHkgcGVuZGluZwogICAgZmFjdG9yeS5jb250ZXh0cy5wdXNoKGNvbnRleHQpOwogIH0gZWxzZSB7CiAgICB2YXIgY29udGV4dHMgPSBmYWN0b3J5LmNvbnRleHRzID0gW2NvbnRleHRdOwogICAgdmFyIHN5bmMgPSB0cnVlOwoKICAgIHZhciBmb3JjZVJlbmRlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjb250ZXh0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICBjb250ZXh0c1tpXS4kZm9yY2VVcGRhdGUoKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgcmVzb2x2ZSA9IG9uY2UoZnVuY3Rpb24gKHJlcykgewogICAgICAvLyBjYWNoZSByZXNvbHZlZAogICAgICBmYWN0b3J5LnJlc29sdmVkID0gZW5zdXJlQ3RvcihyZXMsIGJhc2VDdG9yKTsKICAgICAgLy8gaW52b2tlIGNhbGxiYWNrcyBvbmx5IGlmIHRoaXMgaXMgbm90IGEgc3luY2hyb25vdXMgcmVzb2x2ZQogICAgICAvLyAoYXN5bmMgcmVzb2x2ZXMgYXJlIHNoaW1tZWQgYXMgc3luY2hyb25vdXMgZHVyaW5nIFNTUikKICAgICAgaWYgKCFzeW5jKSB7CiAgICAgICAgZm9yY2VSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHJlamVjdCA9IG9uY2UoZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgICAiRmFpbGVkIHRvIHJlc29sdmUgYXN5bmMgY29tcG9uZW50OiAiICsgKFN0cmluZyhmYWN0b3J5KSkgKwogICAgICAgIChyZWFzb24gPyAoIlxuUmVhc29uOiAiICsgcmVhc29uKSA6ICcnKQogICAgICApOwogICAgICBpZiAoaXNEZWYoZmFjdG9yeS5lcnJvckNvbXApKSB7CiAgICAgICAgZmFjdG9yeS5lcnJvciA9IHRydWU7CiAgICAgICAgZm9yY2VSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHJlcyA9IGZhY3RvcnkocmVzb2x2ZSwgcmVqZWN0KTsKCiAgICBpZiAoaXNPYmplY3QocmVzKSkgewogICAgICBpZiAodHlwZW9mIHJlcy50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgLy8gKCkgPT4gUHJvbWlzZQogICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpKSB7CiAgICAgICAgICByZXMudGhlbihyZXNvbHZlLCByZWplY3QpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChpc0RlZihyZXMuY29tcG9uZW50KSAmJiB0eXBlb2YgcmVzLmNvbXBvbmVudC50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmVzLmNvbXBvbmVudC50aGVuKHJlc29sdmUsIHJlamVjdCk7CgogICAgICAgIGlmIChpc0RlZihyZXMuZXJyb3IpKSB7CiAgICAgICAgICBmYWN0b3J5LmVycm9yQ29tcCA9IGVuc3VyZUN0b3IocmVzLmVycm9yLCBiYXNlQ3Rvcik7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNEZWYocmVzLmxvYWRpbmcpKSB7CiAgICAgICAgICBmYWN0b3J5LmxvYWRpbmdDb21wID0gZW5zdXJlQ3RvcihyZXMubG9hZGluZywgYmFzZUN0b3IpOwogICAgICAgICAgaWYgKHJlcy5kZWxheSA9PT0gMCkgewogICAgICAgICAgICBmYWN0b3J5LmxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkgJiYgaXNVbmRlZihmYWN0b3J5LmVycm9yKSkgewogICAgICAgICAgICAgICAgZmFjdG9yeS5sb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGZvcmNlUmVuZGVyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCByZXMuZGVsYXkgfHwgMjAwKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpc0RlZihyZXMudGltZW91dCkpIHsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoaXNVbmRlZihmYWN0b3J5LnJlc29sdmVkKSkgewogICAgICAgICAgICAgIHJlamVjdCgKICAgICAgICAgICAgICAgICJ0aW1lb3V0ICgiICsgKHJlcy50aW1lb3V0KSArICJtcykiCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgcmVzLnRpbWVvdXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHN5bmMgPSBmYWxzZTsKICAgIC8vIHJldHVybiBpbiBjYXNlIHJlc29sdmVkIHN5bmNocm9ub3VzbHkKICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmcKICAgICAgPyBmYWN0b3J5LmxvYWRpbmdDb21wCiAgICAgIDogZmFjdG9yeS5yZXNvbHZlZAogIH0KfQoKLyogICovCgpmdW5jdGlvbiBpc0FzeW5jUGxhY2Vob2xkZXIgKG5vZGUpIHsKICByZXR1cm4gbm9kZS5pc0NvbW1lbnQgJiYgbm9kZS5hc3luY0ZhY3RvcnkKfQoKLyogICovCgpmdW5jdGlvbiBnZXRGaXJzdENvbXBvbmVudENoaWxkIChjaGlsZHJlbikgewogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgYyA9IGNoaWxkcmVuW2ldOwogICAgICBpZiAoaXNEZWYoYykgJiYgKGlzRGVmKGMuY29tcG9uZW50T3B0aW9ucykgfHwgaXNBc3luY1BsYWNlaG9sZGVyKGMpKSkgewogICAgICAgIHJldHVybiBjCiAgICAgIH0KICAgIH0KICB9Cn0KCi8qICAqLwoKLyogICovCgpmdW5jdGlvbiBpbml0RXZlbnRzICh2bSkgewogIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHZtLl9oYXNIb29rRXZlbnQgPSBmYWxzZTsKICAvLyBpbml0IHBhcmVudCBhdHRhY2hlZCBldmVudHMKICB2YXIgbGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyczsKICBpZiAobGlzdGVuZXJzKSB7CiAgICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycyk7CiAgfQp9Cgp2YXIgdGFyZ2V0OwoKZnVuY3Rpb24gYWRkIChldmVudCwgZm4sIG9uY2UpIHsKICBpZiAob25jZSkgewogICAgdGFyZ2V0LiRvbmNlKGV2ZW50LCBmbik7CiAgfSBlbHNlIHsKICAgIHRhcmdldC4kb24oZXZlbnQsIGZuKTsKICB9Cn0KCmZ1bmN0aW9uIHJlbW92ZSQxIChldmVudCwgZm4pIHsKICB0YXJnZXQuJG9mZihldmVudCwgZm4pOwp9CgpmdW5jdGlvbiB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnMgKAogIHZtLAogIGxpc3RlbmVycywKICBvbGRMaXN0ZW5lcnMKKSB7CiAgdGFyZ2V0ID0gdm07CiAgdXBkYXRlTGlzdGVuZXJzKGxpc3RlbmVycywgb2xkTGlzdGVuZXJzIHx8IHt9LCBhZGQsIHJlbW92ZSQxLCB2bSk7CiAgdGFyZ2V0ID0gdW5kZWZpbmVkOwp9CgpmdW5jdGlvbiBldmVudHNNaXhpbiAoVnVlKSB7CiAgdmFyIGhvb2tSRSA9IC9eaG9vazovOwogIFZ1ZS5wcm90b3R5cGUuJG9uID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIHZtID0gdGhpczsKICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGV2ZW50Lmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgIHRoaXMkMS4kb24oZXZlbnRbaV0sIGZuKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgKHZtLl9ldmVudHNbZXZlbnRdIHx8ICh2bS5fZXZlbnRzW2V2ZW50XSA9IFtdKSkucHVzaChmbik7CiAgICAgIC8vIG9wdGltaXplIGhvb2s6ZXZlbnQgY29zdCBieSB1c2luZyBhIGJvb2xlYW4gZmxhZyBtYXJrZWQgYXQgcmVnaXN0cmF0aW9uCiAgICAgIC8vIGluc3RlYWQgb2YgYSBoYXNoIGxvb2t1cAogICAgICBpZiAoaG9va1JFLnRlc3QoZXZlbnQpKSB7CiAgICAgICAgdm0uX2hhc0hvb2tFdmVudCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2bQogIH07CgogIFZ1ZS5wcm90b3R5cGUuJG9uY2UgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgZnVuY3Rpb24gb24gKCkgewogICAgICB2bS4kb2ZmKGV2ZW50LCBvbik7CiAgICAgIGZuLmFwcGx5KHZtLCBhcmd1bWVudHMpOwogICAgfQogICAgb24uZm4gPSBmbjsKICAgIHZtLiRvbihldmVudCwgb24pOwogICAgcmV0dXJuIHZtCiAgfTsKCiAgVnVlLnByb3RvdHlwZS4kb2ZmID0gZnVuY3Rpb24gKGV2ZW50LCBmbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIHZtID0gdGhpczsKICAgIC8vIGFsbAogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICByZXR1cm4gdm0KICAgIH0KICAgIC8vIGFycmF5IG9mIGV2ZW50cwogICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQpKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgdGhpcyQxLiRvZmYoZXZlbnRbaV0sIGZuKTsKICAgICAgfQogICAgICByZXR1cm4gdm0KICAgIH0KICAgIC8vIHNwZWNpZmljIGV2ZW50CiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07CiAgICBpZiAoIWNicykgewogICAgICByZXR1cm4gdm0KICAgIH0KICAgIGlmICghZm4pIHsKICAgICAgdm0uX2V2ZW50c1tldmVudF0gPSBudWxsOwogICAgICByZXR1cm4gdm0KICAgIH0KICAgIGlmIChmbikgewogICAgICAvLyBzcGVjaWZpYyBoYW5kbGVyCiAgICAgIHZhciBjYjsKICAgICAgdmFyIGkkMSA9IGNicy5sZW5ndGg7CiAgICAgIHdoaWxlIChpJDEtLSkgewogICAgICAgIGNiID0gY2JzW2kkMV07CiAgICAgICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHsKICAgICAgICAgIGNicy5zcGxpY2UoaSQxLCAxKTsKICAgICAgICAgIGJyZWFrCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdm0KICB9OwoKICBWdWUucHJvdG90eXBlLiRlbWl0ID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgewogICAgICB2YXIgbG93ZXJDYXNlRXZlbnQgPSBldmVudC50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAobG93ZXJDYXNlRXZlbnQgIT09IGV2ZW50ICYmIHZtLl9ldmVudHNbbG93ZXJDYXNlRXZlbnRdKSB7CiAgICAgICAgdGlwKAogICAgICAgICAgIkV2ZW50IFwiIiArIGxvd2VyQ2FzZUV2ZW50ICsgIlwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50ICIgKwogICAgICAgICAgKGZvcm1hdENvbXBvbmVudE5hbWUodm0pKSArICIgYnV0IHRoZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgZm9yIFwiIiArIGV2ZW50ICsgIlwiLiAiICsKICAgICAgICAgICJOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCB5b3UgY2Fubm90IHVzZSAiICsKICAgICAgICAgICJ2LW9uIHRvIGxpc3RlbiB0byBjYW1lbENhc2UgZXZlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gIiArCiAgICAgICAgICAiWW91IHNob3VsZCBwcm9iYWJseSB1c2UgXCIiICsgKGh5cGhlbmF0ZShldmVudCkpICsgIlwiIGluc3RlYWQgb2YgXCIiICsgZXZlbnQgKyAiXCIuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHZhciBjYnMgPSB2bS5fZXZlbnRzW2V2ZW50XTsKICAgIGlmIChjYnMpIHsKICAgICAgY2JzID0gY2JzLmxlbmd0aCA+IDEgPyB0b0FycmF5KGNicykgOiBjYnM7CiAgICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpOwogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNicy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICB0cnkgewogICAgICAgICAgY2JzW2ldLmFwcGx5KHZtLCBhcmdzKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB2bSwgKCJldmVudCBoYW5kbGVyIGZvciBcIiIgKyBldmVudCArICJcIiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2bQogIH07Cn0KCi8qICAqLwoKCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyByYXcgY2hpbGRyZW4gVk5vZGVzIGludG8gYSBzbG90IG9iamVjdC4KICovCmZ1bmN0aW9uIHJlc29sdmVTbG90cyAoCiAgY2hpbGRyZW4sCiAgY29udGV4dAopIHsKICB2YXIgc2xvdHMgPSB7fTsKICBpZiAoIWNoaWxkcmVuKSB7CiAgICByZXR1cm4gc2xvdHMKICB9CiAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgdmFyIGRhdGEgPSBjaGlsZC5kYXRhOwogICAgLy8gcmVtb3ZlIHNsb3QgYXR0cmlidXRlIGlmIHRoZSBub2RlIGlzIHJlc29sdmVkIGFzIGEgVnVlIHNsb3Qgbm9kZQogICAgaWYgKGRhdGEgJiYgZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnNsb3QpIHsKICAgICAgZGVsZXRlIGRhdGEuYXR0cnMuc2xvdDsKICAgIH0KICAgIC8vIG5hbWVkIHNsb3RzIHNob3VsZCBvbmx5IGJlIHJlc3BlY3RlZCBpZiB0aGUgdm5vZGUgd2FzIHJlbmRlcmVkIGluIHRoZQogICAgLy8gc2FtZSBjb250ZXh0LgogICAgaWYgKChjaGlsZC5jb250ZXh0ID09PSBjb250ZXh0IHx8IGNoaWxkLmZuQ29udGV4dCA9PT0gY29udGV4dCkgJiYKICAgICAgZGF0YSAmJiBkYXRhLnNsb3QgIT0gbnVsbAogICAgKSB7CiAgICAgIHZhciBuYW1lID0gZGF0YS5zbG90OwogICAgICB2YXIgc2xvdCA9IChzbG90c1tuYW1lXSB8fCAoc2xvdHNbbmFtZV0gPSBbXSkpOwogICAgICBpZiAoY2hpbGQudGFnID09PSAndGVtcGxhdGUnKSB7CiAgICAgICAgc2xvdC5wdXNoLmFwcGx5KHNsb3QsIGNoaWxkLmNoaWxkcmVuIHx8IFtdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzbG90LnB1c2goY2hpbGQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAoc2xvdHMuZGVmYXVsdCB8fCAoc2xvdHMuZGVmYXVsdCA9IFtdKSkucHVzaChjaGlsZCk7CiAgICB9CiAgfQogIC8vIGlnbm9yZSBzbG90cyB0aGF0IGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZQogIGZvciAodmFyIG5hbWUkMSBpbiBzbG90cykgewogICAgaWYgKHNsb3RzW25hbWUkMV0uZXZlcnkoaXNXaGl0ZXNwYWNlKSkgewogICAgICBkZWxldGUgc2xvdHNbbmFtZSQxXTsKICAgIH0KICB9CiAgcmV0dXJuIHNsb3RzCn0KCmZ1bmN0aW9uIGlzV2hpdGVzcGFjZSAobm9kZSkgewogIHJldHVybiAobm9kZS5pc0NvbW1lbnQgJiYgIW5vZGUuYXN5bmNGYWN0b3J5KSB8fCBub2RlLnRleHQgPT09ICcgJwp9CgpmdW5jdGlvbiByZXNvbHZlU2NvcGVkU2xvdHMgKAogIGZucywgLy8gc2VlIGZsb3cvdm5vZGUKICByZXMKKSB7CiAgcmVzID0gcmVzIHx8IHt9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgZm5zLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnNbaV0pKSB7CiAgICAgIHJlc29sdmVTY29wZWRTbG90cyhmbnNbaV0sIHJlcyk7CiAgICB9IGVsc2UgewogICAgICByZXNbZm5zW2ldLmtleV0gPSBmbnNbaV0uZm47CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyogICovCgp2YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsOwp2YXIgaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ID0gZmFsc2U7CgpmdW5jdGlvbiBpbml0TGlmZWN5Y2xlICh2bSkgewogIHZhciBvcHRpb25zID0gdm0uJG9wdGlvbnM7CgogIC8vIGxvY2F0ZSBmaXJzdCBub24tYWJzdHJhY3QgcGFyZW50CiAgdmFyIHBhcmVudCA9IG9wdGlvbnMucGFyZW50OwogIGlmIChwYXJlbnQgJiYgIW9wdGlvbnMuYWJzdHJhY3QpIHsKICAgIHdoaWxlIChwYXJlbnQuJG9wdGlvbnMuYWJzdHJhY3QgJiYgcGFyZW50LiRwYXJlbnQpIHsKICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7CiAgICB9CiAgICBwYXJlbnQuJGNoaWxkcmVuLnB1c2godm0pOwogIH0KCiAgdm0uJHBhcmVudCA9IHBhcmVudDsKICB2bS4kcm9vdCA9IHBhcmVudCA/IHBhcmVudC4kcm9vdCA6IHZtOwoKICB2bS4kY2hpbGRyZW4gPSBbXTsKICB2bS4kcmVmcyA9IHt9OwoKICB2bS5fd2F0Y2hlciA9IG51bGw7CiAgdm0uX2luYWN0aXZlID0gbnVsbDsKICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTsKICB2bS5faXNNb3VudGVkID0gZmFsc2U7CiAgdm0uX2lzRGVzdHJveWVkID0gZmFsc2U7CiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZTsKfQoKZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4gKFZ1ZSkgewogIFZ1ZS5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uICh2bm9kZSwgaHlkcmF0aW5nKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgaWYgKHZtLl9pc01vdW50ZWQpIHsKICAgICAgY2FsbEhvb2sodm0sICdiZWZvcmVVcGRhdGUnKTsKICAgIH0KICAgIHZhciBwcmV2RWwgPSB2bS4kZWw7CiAgICB2YXIgcHJldlZub2RlID0gdm0uX3Zub2RlOwogICAgdmFyIHByZXZBY3RpdmVJbnN0YW5jZSA9IGFjdGl2ZUluc3RhbmNlOwogICAgYWN0aXZlSW5zdGFuY2UgPSB2bTsKICAgIHZtLl92bm9kZSA9IHZub2RlOwogICAgLy8gVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gaXMgaW5qZWN0ZWQgaW4gZW50cnkgcG9pbnRzCiAgICAvLyBiYXNlZCBvbiB0aGUgcmVuZGVyaW5nIGJhY2tlbmQgdXNlZC4KICAgIGlmICghcHJldlZub2RlKSB7CiAgICAgIC8vIGluaXRpYWwgcmVuZGVyCiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXygKICAgICAgICB2bS4kZWwsIHZub2RlLCBoeWRyYXRpbmcsIGZhbHNlIC8qIHJlbW92ZU9ubHkgKi8sCiAgICAgICAgdm0uJG9wdGlvbnMuX3BhcmVudEVsbSwKICAgICAgICB2bS4kb3B0aW9ucy5fcmVmRWxtCiAgICAgICk7CiAgICAgIC8vIG5vIG5lZWQgZm9yIHRoZSByZWYgbm9kZXMgYWZ0ZXIgaW5pdGlhbCBwYXRjaAogICAgICAvLyB0aGlzIHByZXZlbnRzIGtlZXBpbmcgYSBkZXRhY2hlZCBET00gdHJlZSBpbiBtZW1vcnkgKCM1ODUxKQogICAgICB2bS4kb3B0aW9ucy5fcGFyZW50RWxtID0gdm0uJG9wdGlvbnMuX3JlZkVsbSA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICAvLyB1cGRhdGVzCiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXyhwcmV2Vm5vZGUsIHZub2RlKTsKICAgIH0KICAgIGFjdGl2ZUluc3RhbmNlID0gcHJldkFjdGl2ZUluc3RhbmNlOwogICAgLy8gdXBkYXRlIF9fdnVlX18gcmVmZXJlbmNlCiAgICBpZiAocHJldkVsKSB7CiAgICAgIHByZXZFbC5fX3Z1ZV9fID0gbnVsbDsKICAgIH0KICAgIGlmICh2bS4kZWwpIHsKICAgICAgdm0uJGVsLl9fdnVlX18gPSB2bTsKICAgIH0KICAgIC8vIGlmIHBhcmVudCBpcyBhbiBIT0MsIHVwZGF0ZSBpdHMgJGVsIGFzIHdlbGwKICAgIGlmICh2bS4kdm5vZGUgJiYgdm0uJHBhcmVudCAmJiB2bS4kdm5vZGUgPT09IHZtLiRwYXJlbnQuX3Zub2RlKSB7CiAgICAgIHZtLiRwYXJlbnQuJGVsID0gdm0uJGVsOwogICAgfQogICAgLy8gdXBkYXRlZCBob29rIGlzIGNhbGxlZCBieSB0aGUgc2NoZWR1bGVyIHRvIGVuc3VyZSB0aGF0IGNoaWxkcmVuIGFyZQogICAgLy8gdXBkYXRlZCBpbiBhIHBhcmVudCdzIHVwZGF0ZWQgaG9vay4KICB9OwoKICBWdWUucHJvdG90eXBlLiRmb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB2bSA9IHRoaXM7CiAgICBpZiAodm0uX3dhdGNoZXIpIHsKICAgICAgdm0uX3dhdGNoZXIudXBkYXRlKCk7CiAgICB9CiAgfTsKCiAgVnVlLnByb3RvdHlwZS4kZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciB2bSA9IHRoaXM7CiAgICBpZiAodm0uX2lzQmVpbmdEZXN0cm95ZWQpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZURlc3Ryb3knKTsKICAgIHZtLl9pc0JlaW5nRGVzdHJveWVkID0gdHJ1ZTsKICAgIC8vIHJlbW92ZSBzZWxmIGZyb20gcGFyZW50CiAgICB2YXIgcGFyZW50ID0gdm0uJHBhcmVudDsKICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5faXNCZWluZ0Rlc3Ryb3llZCAmJiAhdm0uJG9wdGlvbnMuYWJzdHJhY3QpIHsKICAgICAgcmVtb3ZlKHBhcmVudC4kY2hpbGRyZW4sIHZtKTsKICAgIH0KICAgIC8vIHRlYXJkb3duIHdhdGNoZXJzCiAgICBpZiAodm0uX3dhdGNoZXIpIHsKICAgICAgdm0uX3dhdGNoZXIudGVhcmRvd24oKTsKICAgIH0KICAgIHZhciBpID0gdm0uX3dhdGNoZXJzLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgdm0uX3dhdGNoZXJzW2ldLnRlYXJkb3duKCk7CiAgICB9CiAgICAvLyByZW1vdmUgcmVmZXJlbmNlIGZyb20gZGF0YSBvYgogICAgLy8gZnJvemVuIG9iamVjdCBtYXkgbm90IGhhdmUgb2JzZXJ2ZXIuCiAgICBpZiAodm0uX2RhdGEuX19vYl9fKSB7CiAgICAgIHZtLl9kYXRhLl9fb2JfXy52bUNvdW50LS07CiAgICB9CiAgICAvLyBjYWxsIHRoZSBsYXN0IGhvb2suLi4KICAgIHZtLl9pc0Rlc3Ryb3llZCA9IHRydWU7CiAgICAvLyBpbnZva2UgZGVzdHJveSBob29rcyBvbiBjdXJyZW50IHJlbmRlcmVkIHRyZWUKICAgIHZtLl9fcGF0Y2hfXyh2bS5fdm5vZGUsIG51bGwpOwogICAgLy8gZmlyZSBkZXN0cm95ZWQgaG9vawogICAgY2FsbEhvb2sodm0sICdkZXN0cm95ZWQnKTsKICAgIC8vIHR1cm4gb2ZmIGFsbCBpbnN0YW5jZSBsaXN0ZW5lcnMuCiAgICB2bS4kb2ZmKCk7CiAgICAvLyByZW1vdmUgX192dWVfXyByZWZlcmVuY2UKICAgIGlmICh2bS4kZWwpIHsKICAgICAgdm0uJGVsLl9fdnVlX18gPSBudWxsOwogICAgfQogICAgLy8gcmVsZWFzZSBjaXJjdWxhciByZWZlcmVuY2UgKCM2NzU5KQogICAgaWYgKHZtLiR2bm9kZSkgewogICAgICB2bS4kdm5vZGUucGFyZW50ID0gbnVsbDsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBtb3VudENvbXBvbmVudCAoCiAgdm0sCiAgZWwsCiAgaHlkcmF0aW5nCikgewogIHZtLiRlbCA9IGVsOwogIGlmICghdm0uJG9wdGlvbnMucmVuZGVyKSB7CiAgICB2bS4kb3B0aW9ucy5yZW5kZXIgPSBjcmVhdGVFbXB0eVZOb2RlOwogICAgewogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgaWYgKCh2bS4kb3B0aW9ucy50ZW1wbGF0ZSAmJiB2bS4kb3B0aW9ucy50ZW1wbGF0ZS5jaGFyQXQoMCkgIT09ICcjJykgfHwKICAgICAgICB2bS4kb3B0aW9ucy5lbCB8fCBlbCkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAnWW91IGFyZSB1c2luZyB0aGUgcnVudGltZS1vbmx5IGJ1aWxkIG9mIFZ1ZSB3aGVyZSB0aGUgdGVtcGxhdGUgJyArCiAgICAgICAgICAnY29tcGlsZXIgaXMgbm90IGF2YWlsYWJsZS4gRWl0aGVyIHByZS1jb21waWxlIHRoZSB0ZW1wbGF0ZXMgaW50byAnICsKICAgICAgICAgICdyZW5kZXIgZnVuY3Rpb25zLCBvciB1c2UgdGhlIGNvbXBpbGVyLWluY2x1ZGVkIGJ1aWxkLicsCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdGYWlsZWQgdG8gbW91bnQgY29tcG9uZW50OiB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24gbm90IGRlZmluZWQuJywKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgfQogIH0KICBjYWxsSG9vayh2bSwgJ2JlZm9yZU1vdW50Jyk7CgogIHZhciB1cGRhdGVDb21wb25lbnQ7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykgewogICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewogICAgICB2YXIgbmFtZSA9IHZtLl9uYW1lOwogICAgICB2YXIgaWQgPSB2bS5fdWlkOwogICAgICB2YXIgc3RhcnRUYWcgPSAidnVlLXBlcmYtc3RhcnQ6IiArIGlkOwogICAgICB2YXIgZW5kVGFnID0gInZ1ZS1wZXJmLWVuZDoiICsgaWQ7CgogICAgICBtYXJrKHN0YXJ0VGFnKTsKICAgICAgdmFyIHZub2RlID0gdm0uX3JlbmRlcigpOwogICAgICBtYXJrKGVuZFRhZyk7CiAgICAgIG1lYXN1cmUoKCJ2dWUgIiArIG5hbWUgKyAiIHJlbmRlciIpLCBzdGFydFRhZywgZW5kVGFnKTsKCiAgICAgIG1hcmsoc3RhcnRUYWcpOwogICAgICB2bS5fdXBkYXRlKHZub2RlLCBoeWRyYXRpbmcpOwogICAgICBtYXJrKGVuZFRhZyk7CiAgICAgIG1lYXN1cmUoKCJ2dWUgIiArIG5hbWUgKyAiIHBhdGNoIiksIHN0YXJ0VGFnLCBlbmRUYWcpOwogICAgfTsKICB9IGVsc2UgewogICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkgewogICAgICB2bS5fdXBkYXRlKHZtLl9yZW5kZXIoKSwgaHlkcmF0aW5nKTsKICAgIH07CiAgfQoKICAvLyB3ZSBzZXQgdGhpcyB0byB2bS5fd2F0Y2hlciBpbnNpZGUgdGhlIHdhdGNoZXIncyBjb25zdHJ1Y3RvcgogIC8vIHNpbmNlIHRoZSB3YXRjaGVyJ3MgaW5pdGlhbCBwYXRjaCBtYXkgY2FsbCAkZm9yY2VVcGRhdGUgKGUuZy4gaW5zaWRlIGNoaWxkCiAgLy8gY29tcG9uZW50J3MgbW91bnRlZCBob29rKSwgd2hpY2ggcmVsaWVzIG9uIHZtLl93YXRjaGVyIGJlaW5nIGFscmVhZHkgZGVmaW5lZAogIG5ldyBXYXRjaGVyKHZtLCB1cGRhdGVDb21wb25lbnQsIG5vb3AsIG51bGwsIHRydWUgLyogaXNSZW5kZXJXYXRjaGVyICovKTsKICBoeWRyYXRpbmcgPSBmYWxzZTsKCiAgLy8gbWFudWFsbHkgbW91bnRlZCBpbnN0YW5jZSwgY2FsbCBtb3VudGVkIG9uIHNlbGYKICAvLyBtb3VudGVkIGlzIGNhbGxlZCBmb3IgcmVuZGVyLWNyZWF0ZWQgY2hpbGQgY29tcG9uZW50cyBpbiBpdHMgaW5zZXJ0ZWQgaG9vawogIGlmICh2bS4kdm5vZGUgPT0gbnVsbCkgewogICAgdm0uX2lzTW91bnRlZCA9IHRydWU7CiAgICBjYWxsSG9vayh2bSwgJ21vdW50ZWQnKTsKICB9CiAgcmV0dXJuIHZtCn0KCmZ1bmN0aW9uIHVwZGF0ZUNoaWxkQ29tcG9uZW50ICgKICB2bSwKICBwcm9wc0RhdGEsCiAgbGlzdGVuZXJzLAogIHBhcmVudFZub2RlLAogIHJlbmRlckNoaWxkcmVuCikgewogIHsKICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IHRydWU7CiAgfQoKICAvLyBkZXRlcm1pbmUgd2hldGhlciBjb21wb25lbnQgaGFzIHNsb3QgY2hpbGRyZW4KICAvLyB3ZSBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIG92ZXJ3cml0aW5nICRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbgogIHZhciBoYXNDaGlsZHJlbiA9ICEhKAogICAgcmVuZGVyQ2hpbGRyZW4gfHwgICAgICAgICAgICAgICAvLyBoYXMgbmV3IHN0YXRpYyBzbG90cwogICAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuIHx8ICAvLyBoYXMgb2xkIHN0YXRpYyBzbG90cwogICAgcGFyZW50Vm5vZGUuZGF0YS5zY29wZWRTbG90cyB8fCAvLyBoYXMgbmV3IHNjb3BlZCBzbG90cwogICAgdm0uJHNjb3BlZFNsb3RzICE9PSBlbXB0eU9iamVjdCAvLyBoYXMgb2xkIHNjb3BlZCBzbG90cwogICk7CgogIHZtLiRvcHRpb25zLl9wYXJlbnRWbm9kZSA9IHBhcmVudFZub2RlOwogIHZtLiR2bm9kZSA9IHBhcmVudFZub2RlOyAvLyB1cGRhdGUgdm0ncyBwbGFjZWhvbGRlciBub2RlIHdpdGhvdXQgcmUtcmVuZGVyCgogIGlmICh2bS5fdm5vZGUpIHsgLy8gdXBkYXRlIGNoaWxkIHRyZWUncyBwYXJlbnQKICAgIHZtLl92bm9kZS5wYXJlbnQgPSBwYXJlbnRWbm9kZTsKICB9CiAgdm0uJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuID0gcmVuZGVyQ2hpbGRyZW47CgogIC8vIHVwZGF0ZSAkYXR0cnMgYW5kICRsaXN0ZW5lcnMgaGFzaAogIC8vIHRoZXNlIGFyZSBhbHNvIHJlYWN0aXZlIHNvIHRoZXkgbWF5IHRyaWdnZXIgY2hpbGQgdXBkYXRlIGlmIHRoZSBjaGlsZAogIC8vIHVzZWQgdGhlbSBkdXJpbmcgcmVuZGVyCiAgdm0uJGF0dHJzID0gcGFyZW50Vm5vZGUuZGF0YS5hdHRycyB8fCBlbXB0eU9iamVjdDsKICB2bS4kbGlzdGVuZXJzID0gbGlzdGVuZXJzIHx8IGVtcHR5T2JqZWN0OwoKICAvLyB1cGRhdGUgcHJvcHMKICBpZiAocHJvcHNEYXRhICYmIHZtLiRvcHRpb25zLnByb3BzKSB7CiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpOwogICAgdmFyIHByb3BzID0gdm0uX3Byb3BzOwogICAgdmFyIHByb3BLZXlzID0gdm0uJG9wdGlvbnMuX3Byb3BLZXlzIHx8IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIga2V5ID0gcHJvcEtleXNbaV07CiAgICAgIHZhciBwcm9wT3B0aW9ucyA9IHZtLiRvcHRpb25zLnByb3BzOyAvLyB3dGYgZmxvdz8KICAgICAgcHJvcHNba2V5XSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BPcHRpb25zLCBwcm9wc0RhdGEsIHZtKTsKICAgIH0KICAgIHRvZ2dsZU9ic2VydmluZyh0cnVlKTsKICAgIC8vIGtlZXAgYSBjb3B5IG9mIHJhdyBwcm9wc0RhdGEKICAgIHZtLiRvcHRpb25zLnByb3BzRGF0YSA9IHByb3BzRGF0YTsKICB9CgogIC8vIHVwZGF0ZSBsaXN0ZW5lcnMKICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3Q7CiAgdmFyIG9sZExpc3RlbmVycyA9IHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7CiAgdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyA9IGxpc3RlbmVyczsKICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycywgb2xkTGlzdGVuZXJzKTsKCiAgLy8gcmVzb2x2ZSBzbG90cyArIGZvcmNlIHVwZGF0ZSBpZiBoYXMgY2hpbGRyZW4KICBpZiAoaGFzQ2hpbGRyZW4pIHsKICAgIHZtLiRzbG90cyA9IHJlc29sdmVTbG90cyhyZW5kZXJDaGlsZHJlbiwgcGFyZW50Vm5vZGUuY29udGV4dCk7CiAgICB2bS4kZm9yY2VVcGRhdGUoKTsKICB9CgogIHsKICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IGZhbHNlOwogIH0KfQoKZnVuY3Rpb24gaXNJbkluYWN0aXZlVHJlZSAodm0pIHsKICB3aGlsZSAodm0gJiYgKHZtID0gdm0uJHBhcmVudCkpIHsKICAgIGlmICh2bS5faW5hY3RpdmUpIHsgcmV0dXJuIHRydWUgfQogIH0KICByZXR1cm4gZmFsc2UKfQoKZnVuY3Rpb24gYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkgewogIGlmIChkaXJlY3QpIHsKICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IGZhbHNlOwogICAgaWYgKGlzSW5JbmFjdGl2ZVRyZWUodm0pKSB7CiAgICAgIHJldHVybgogICAgfQogIH0gZWxzZSBpZiAodm0uX2RpcmVjdEluYWN0aXZlKSB7CiAgICByZXR1cm4KICB9CiAgaWYgKHZtLl9pbmFjdGl2ZSB8fCB2bS5faW5hY3RpdmUgPT09IG51bGwpIHsKICAgIHZtLl9pbmFjdGl2ZSA9IGZhbHNlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudCh2bS4kY2hpbGRyZW5baV0pOwogICAgfQogICAgY2FsbEhvb2sodm0sICdhY3RpdmF0ZWQnKTsKICB9Cn0KCmZ1bmN0aW9uIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkgewogIGlmIChkaXJlY3QpIHsKICAgIHZtLl9kaXJlY3RJbmFjdGl2ZSA9IHRydWU7CiAgICBpZiAoaXNJbkluYWN0aXZlVHJlZSh2bSkpIHsKICAgICAgcmV0dXJuCiAgICB9CiAgfQogIGlmICghdm0uX2luYWN0aXZlKSB7CiAgICB2bS5faW5hY3RpdmUgPSB0cnVlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHZtLiRjaGlsZHJlbltpXSk7CiAgICB9CiAgICBjYWxsSG9vayh2bSwgJ2RlYWN0aXZhdGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBjYWxsSG9vayAodm0sIGhvb2spIHsKICAvLyAjNzU3MyBkaXNhYmxlIGRlcCBjb2xsZWN0aW9uIHdoZW4gaW52b2tpbmcgbGlmZWN5Y2xlIGhvb2tzCiAgcHVzaFRhcmdldCgpOwogIHZhciBoYW5kbGVycyA9IHZtLiRvcHRpb25zW2hvb2tdOwogIGlmIChoYW5kbGVycykgewogICAgZm9yICh2YXIgaSA9IDAsIGogPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBqOyBpKyspIHsKICAgICAgdHJ5IHsKICAgICAgICBoYW5kbGVyc1tpXS5jYWxsKHZtKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCAoaG9vayArICIgaG9vayIpKTsKICAgICAgfQogICAgfQogIH0KICBpZiAodm0uX2hhc0hvb2tFdmVudCkgewogICAgdm0uJGVtaXQoJ2hvb2s6JyArIGhvb2spOwogIH0KICBwb3BUYXJnZXQoKTsKfQoKLyogICovCgoKdmFyIE1BWF9VUERBVEVfQ09VTlQgPSAxMDA7Cgp2YXIgcXVldWUgPSBbXTsKdmFyIGFjdGl2YXRlZENoaWxkcmVuID0gW107CnZhciBoYXMgPSB7fTsKdmFyIGNpcmN1bGFyID0ge307CnZhciB3YWl0aW5nID0gZmFsc2U7CnZhciBmbHVzaGluZyA9IGZhbHNlOwp2YXIgaW5kZXggPSAwOwoKLyoqCiAqIFJlc2V0IHRoZSBzY2hlZHVsZXIncyBzdGF0ZS4KICovCmZ1bmN0aW9uIHJlc2V0U2NoZWR1bGVyU3RhdGUgKCkgewogIGluZGV4ID0gcXVldWUubGVuZ3RoID0gYWN0aXZhdGVkQ2hpbGRyZW4ubGVuZ3RoID0gMDsKICBoYXMgPSB7fTsKICB7CiAgICBjaXJjdWxhciA9IHt9OwogIH0KICB3YWl0aW5nID0gZmx1c2hpbmcgPSBmYWxzZTsKfQoKLyoqCiAqIEZsdXNoIGJvdGggcXVldWVzIGFuZCBydW4gdGhlIHdhdGNoZXJzLgogKi8KZnVuY3Rpb24gZmx1c2hTY2hlZHVsZXJRdWV1ZSAoKSB7CiAgZmx1c2hpbmcgPSB0cnVlOwogIHZhciB3YXRjaGVyLCBpZDsKCiAgLy8gU29ydCBxdWV1ZSBiZWZvcmUgZmx1c2guCiAgLy8gVGhpcyBlbnN1cmVzIHRoYXQ6CiAgLy8gMS4gQ29tcG9uZW50cyBhcmUgdXBkYXRlZCBmcm9tIHBhcmVudCB0byBjaGlsZC4gKGJlY2F1c2UgcGFyZW50IGlzIGFsd2F5cwogIC8vICAgIGNyZWF0ZWQgYmVmb3JlIHRoZSBjaGlsZCkKICAvLyAyLiBBIGNvbXBvbmVudCdzIHVzZXIgd2F0Y2hlcnMgYXJlIHJ1biBiZWZvcmUgaXRzIHJlbmRlciB3YXRjaGVyIChiZWNhdXNlCiAgLy8gICAgdXNlciB3YXRjaGVycyBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIHJlbmRlciB3YXRjaGVyKQogIC8vIDMuIElmIGEgY29tcG9uZW50IGlzIGRlc3Ryb3llZCBkdXJpbmcgYSBwYXJlbnQgY29tcG9uZW50J3Mgd2F0Y2hlciBydW4sCiAgLy8gICAgaXRzIHdhdGNoZXJzIGNhbiBiZSBza2lwcGVkLgogIHF1ZXVlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuaWQgLSBiLmlkOyB9KTsKCiAgLy8gZG8gbm90IGNhY2hlIGxlbmd0aCBiZWNhdXNlIG1vcmUgd2F0Y2hlcnMgbWlnaHQgYmUgcHVzaGVkCiAgLy8gYXMgd2UgcnVuIGV4aXN0aW5nIHdhdGNoZXJzCiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcXVldWUubGVuZ3RoOyBpbmRleCsrKSB7CiAgICB3YXRjaGVyID0gcXVldWVbaW5kZXhdOwogICAgaWQgPSB3YXRjaGVyLmlkOwogICAgaGFzW2lkXSA9IG51bGw7CiAgICB3YXRjaGVyLnJ1bigpOwogICAgLy8gaW4gZGV2IGJ1aWxkLCBjaGVjayBhbmQgc3RvcCBjaXJjdWxhciB1cGRhdGVzLgogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBoYXNbaWRdICE9IG51bGwpIHsKICAgICAgY2lyY3VsYXJbaWRdID0gKGNpcmN1bGFyW2lkXSB8fCAwKSArIDE7CiAgICAgIGlmIChjaXJjdWxhcltpZF0gPiBNQVhfVVBEQVRFX0NPVU5UKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdZb3UgbWF5IGhhdmUgYW4gaW5maW5pdGUgdXBkYXRlIGxvb3AgJyArICgKICAgICAgICAgICAgd2F0Y2hlci51c2VyCiAgICAgICAgICAgICAgPyAoImluIHdhdGNoZXIgd2l0aCBleHByZXNzaW9uIFwiIiArICh3YXRjaGVyLmV4cHJlc3Npb24pICsgIlwiIikKICAgICAgICAgICAgICA6ICJpbiBhIGNvbXBvbmVudCByZW5kZXIgZnVuY3Rpb24uIgogICAgICAgICAgKSwKICAgICAgICAgIHdhdGNoZXIudm0KICAgICAgICApOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICB9CgogIC8vIGtlZXAgY29waWVzIG9mIHBvc3QgcXVldWVzIGJlZm9yZSByZXNldHRpbmcgc3RhdGUKICB2YXIgYWN0aXZhdGVkUXVldWUgPSBhY3RpdmF0ZWRDaGlsZHJlbi5zbGljZSgpOwogIHZhciB1cGRhdGVkUXVldWUgPSBxdWV1ZS5zbGljZSgpOwoKICByZXNldFNjaGVkdWxlclN0YXRlKCk7CgogIC8vIGNhbGwgY29tcG9uZW50IHVwZGF0ZWQgYW5kIGFjdGl2YXRlZCBob29rcwogIGNhbGxBY3RpdmF0ZWRIb29rcyhhY3RpdmF0ZWRRdWV1ZSk7CiAgY2FsbFVwZGF0ZWRIb29rcyh1cGRhdGVkUXVldWUpOwoKICAvLyBkZXZ0b29sIGhvb2sKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoZGV2dG9vbHMgJiYgY29uZmlnLmRldnRvb2xzKSB7CiAgICBkZXZ0b29scy5lbWl0KCdmbHVzaCcpOwogIH0KfQoKZnVuY3Rpb24gY2FsbFVwZGF0ZWRIb29rcyAocXVldWUpIHsKICB2YXIgaSA9IHF1ZXVlLmxlbmd0aDsKICB3aGlsZSAoaS0tKSB7CiAgICB2YXIgd2F0Y2hlciA9IHF1ZXVlW2ldOwogICAgdmFyIHZtID0gd2F0Y2hlci52bTsKICAgIGlmICh2bS5fd2F0Y2hlciA9PT0gd2F0Y2hlciAmJiB2bS5faXNNb3VudGVkKSB7CiAgICAgIGNhbGxIb29rKHZtLCAndXBkYXRlZCcpOwogICAgfQogIH0KfQoKLyoqCiAqIFF1ZXVlIGEga2VwdC1hbGl2ZSBjb21wb25lbnQgdGhhdCB3YXMgYWN0aXZhdGVkIGR1cmluZyBwYXRjaC4KICogVGhlIHF1ZXVlIHdpbGwgYmUgcHJvY2Vzc2VkIGFmdGVyIHRoZSBlbnRpcmUgdHJlZSBoYXMgYmVlbiBwYXRjaGVkLgogKi8KZnVuY3Rpb24gcXVldWVBY3RpdmF0ZWRDb21wb25lbnQgKHZtKSB7CiAgLy8gc2V0dGluZyBfaW5hY3RpdmUgdG8gZmFsc2UgaGVyZSBzbyB0aGF0IGEgcmVuZGVyIGZ1bmN0aW9uIGNhbgogIC8vIHJlbHkgb24gY2hlY2tpbmcgd2hldGhlciBpdCdzIGluIGFuIGluYWN0aXZlIHRyZWUgKGUuZy4gcm91dGVyLXZpZXcpCiAgdm0uX2luYWN0aXZlID0gZmFsc2U7CiAgYWN0aXZhdGVkQ2hpbGRyZW4ucHVzaCh2bSk7Cn0KCmZ1bmN0aW9uIGNhbGxBY3RpdmF0ZWRIb29rcyAocXVldWUpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7CiAgICBxdWV1ZVtpXS5faW5hY3RpdmUgPSB0cnVlOwogICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChxdWV1ZVtpXSwgdHJ1ZSAvKiB0cnVlICovKTsKICB9Cn0KCi8qKgogKiBQdXNoIGEgd2F0Y2hlciBpbnRvIHRoZSB3YXRjaGVyIHF1ZXVlLgogKiBKb2JzIHdpdGggZHVwbGljYXRlIElEcyB3aWxsIGJlIHNraXBwZWQgdW5sZXNzIGl0J3MKICogcHVzaGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGJlaW5nIGZsdXNoZWQuCiAqLwpmdW5jdGlvbiBxdWV1ZVdhdGNoZXIgKHdhdGNoZXIpIHsKICB2YXIgaWQgPSB3YXRjaGVyLmlkOwogIGlmIChoYXNbaWRdID09IG51bGwpIHsKICAgIGhhc1tpZF0gPSB0cnVlOwogICAgaWYgKCFmbHVzaGluZykgewogICAgICBxdWV1ZS5wdXNoKHdhdGNoZXIpOwogICAgfSBlbHNlIHsKICAgICAgLy8gaWYgYWxyZWFkeSBmbHVzaGluZywgc3BsaWNlIHRoZSB3YXRjaGVyIGJhc2VkIG9uIGl0cyBpZAogICAgICAvLyBpZiBhbHJlYWR5IHBhc3QgaXRzIGlkLCBpdCB3aWxsIGJlIHJ1biBuZXh0IGltbWVkaWF0ZWx5LgogICAgICB2YXIgaSA9IHF1ZXVlLmxlbmd0aCAtIDE7CiAgICAgIHdoaWxlIChpID4gaW5kZXggJiYgcXVldWVbaV0uaWQgPiB3YXRjaGVyLmlkKSB7CiAgICAgICAgaS0tOwogICAgICB9CiAgICAgIHF1ZXVlLnNwbGljZShpICsgMSwgMCwgd2F0Y2hlcik7CiAgICB9CiAgICAvLyBxdWV1ZSB0aGUgZmx1c2gKICAgIGlmICghd2FpdGluZykgewogICAgICB3YWl0aW5nID0gdHJ1ZTsKICAgICAgbmV4dFRpY2soZmx1c2hTY2hlZHVsZXJRdWV1ZSk7CiAgICB9CiAgfQp9CgovKiAgKi8KCnZhciB1aWQkMSA9IDA7CgovKioKICogQSB3YXRjaGVyIHBhcnNlcyBhbiBleHByZXNzaW9uLCBjb2xsZWN0cyBkZXBlbmRlbmNpZXMsCiAqIGFuZCBmaXJlcyBjYWxsYmFjayB3aGVuIHRoZSBleHByZXNzaW9uIHZhbHVlIGNoYW5nZXMuCiAqIFRoaXMgaXMgdXNlZCBmb3IgYm90aCB0aGUgJHdhdGNoKCkgYXBpIGFuZCBkaXJlY3RpdmVzLgogKi8KdmFyIFdhdGNoZXIgPSBmdW5jdGlvbiBXYXRjaGVyICgKICB2bSwKICBleHBPckZuLAogIGNiLAogIG9wdGlvbnMsCiAgaXNSZW5kZXJXYXRjaGVyCikgewogIHRoaXMudm0gPSB2bTsKICBpZiAoaXNSZW5kZXJXYXRjaGVyKSB7CiAgICB2bS5fd2F0Y2hlciA9IHRoaXM7CiAgfQogIHZtLl93YXRjaGVycy5wdXNoKHRoaXMpOwogIC8vIG9wdGlvbnMKICBpZiAob3B0aW9ucykgewogICAgdGhpcy5kZWVwID0gISFvcHRpb25zLmRlZXA7CiAgICB0aGlzLnVzZXIgPSAhIW9wdGlvbnMudXNlcjsKICAgIHRoaXMubGF6eSA9ICEhb3B0aW9ucy5sYXp5OwogICAgdGhpcy5zeW5jID0gISFvcHRpb25zLnN5bmM7CiAgfSBlbHNlIHsKICAgIHRoaXMuZGVlcCA9IHRoaXMudXNlciA9IHRoaXMubGF6eSA9IHRoaXMuc3luYyA9IGZhbHNlOwogIH0KICB0aGlzLmNiID0gY2I7CiAgdGhpcy5pZCA9ICsrdWlkJDE7IC8vIHVpZCBmb3IgYmF0Y2hpbmcKICB0aGlzLmFjdGl2ZSA9IHRydWU7CiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eTsgLy8gZm9yIGxhenkgd2F0Y2hlcnMKICB0aGlzLmRlcHMgPSBbXTsKICB0aGlzLm5ld0RlcHMgPSBbXTsKICB0aGlzLmRlcElkcyA9IG5ldyBfU2V0KCk7CiAgdGhpcy5uZXdEZXBJZHMgPSBuZXcgX1NldCgpOwogIHRoaXMuZXhwcmVzc2lvbiA9IGV4cE9yRm4udG9TdHJpbmcoKTsKICAvLyBwYXJzZSBleHByZXNzaW9uIGZvciBnZXR0ZXIKICBpZiAodHlwZW9mIGV4cE9yRm4gPT09ICdmdW5jdGlvbicpIHsKICAgIHRoaXMuZ2V0dGVyID0gZXhwT3JGbjsKICB9IGVsc2UgewogICAgdGhpcy5nZXR0ZXIgPSBwYXJzZVBhdGgoZXhwT3JGbik7CiAgICBpZiAoIXRoaXMuZ2V0dGVyKSB7CiAgICAgIHRoaXMuZ2V0dGVyID0gZnVuY3Rpb24gKCkge307CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJGYWlsZWQgd2F0Y2hpbmcgcGF0aDogXCIiICsgZXhwT3JGbiArICJcIiAiICsKICAgICAgICAnV2F0Y2hlciBvbmx5IGFjY2VwdHMgc2ltcGxlIGRvdC1kZWxpbWl0ZWQgcGF0aHMuICcgKwogICAgICAgICdGb3IgZnVsbCBjb250cm9sLCB1c2UgYSBmdW5jdGlvbiBpbnN0ZWFkLicsCiAgICAgICAgdm0KICAgICAgKTsKICAgIH0KICB9CiAgdGhpcy52YWx1ZSA9IHRoaXMubGF6eQogICAgPyB1bmRlZmluZWQKICAgIDogdGhpcy5nZXQoKTsKfTsKCi8qKgogKiBFdmFsdWF0ZSB0aGUgZ2V0dGVyLCBhbmQgcmUtY29sbGVjdCBkZXBlbmRlbmNpZXMuCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKCkgewogIHB1c2hUYXJnZXQodGhpcyk7CiAgdmFyIHZhbHVlOwogIHZhciB2bSA9IHRoaXMudm07CiAgdHJ5IHsKICAgIHZhbHVlID0gdGhpcy5nZXR0ZXIuY2FsbCh2bSwgdm0pOwogIH0gY2F0Y2ggKGUpIHsKICAgIGlmICh0aGlzLnVzZXIpIHsKICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICgiZ2V0dGVyIGZvciB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIikpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgZQogICAgfQogIH0gZmluYWxseSB7CiAgICAvLyAidG91Y2giIGV2ZXJ5IHByb3BlcnR5IHNvIHRoZXkgYXJlIGFsbCB0cmFja2VkIGFzCiAgICAvLyBkZXBlbmRlbmNpZXMgZm9yIGRlZXAgd2F0Y2hpbmcKICAgIGlmICh0aGlzLmRlZXApIHsKICAgICAgdHJhdmVyc2UodmFsdWUpOwogICAgfQogICAgcG9wVGFyZ2V0KCk7CiAgICB0aGlzLmNsZWFudXBEZXBzKCk7CiAgfQogIHJldHVybiB2YWx1ZQp9OwoKLyoqCiAqIEFkZCBhIGRlcGVuZGVuY3kgdG8gdGhpcyBkaXJlY3RpdmUuCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5hZGREZXAgPSBmdW5jdGlvbiBhZGREZXAgKGRlcCkgewogIHZhciBpZCA9IGRlcC5pZDsKICBpZiAoIXRoaXMubmV3RGVwSWRzLmhhcyhpZCkpIHsKICAgIHRoaXMubmV3RGVwSWRzLmFkZChpZCk7CiAgICB0aGlzLm5ld0RlcHMucHVzaChkZXApOwogICAgaWYgKCF0aGlzLmRlcElkcy5oYXMoaWQpKSB7CiAgICAgIGRlcC5hZGRTdWIodGhpcyk7CiAgICB9CiAgfQp9OwoKLyoqCiAqIENsZWFuIHVwIGZvciBkZXBlbmRlbmN5IGNvbGxlY3Rpb24uCiAqLwpXYXRjaGVyLnByb3RvdHlwZS5jbGVhbnVwRGVwcyA9IGZ1bmN0aW9uIGNsZWFudXBEZXBzICgpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7CiAgd2hpbGUgKGktLSkgewogICAgdmFyIGRlcCA9IHRoaXMkMS5kZXBzW2ldOwogICAgaWYgKCF0aGlzJDEubmV3RGVwSWRzLmhhcyhkZXAuaWQpKSB7CiAgICAgIGRlcC5yZW1vdmVTdWIodGhpcyQxKTsKICAgIH0KICB9CiAgdmFyIHRtcCA9IHRoaXMuZGVwSWRzOwogIHRoaXMuZGVwSWRzID0gdGhpcy5uZXdEZXBJZHM7CiAgdGhpcy5uZXdEZXBJZHMgPSB0bXA7CiAgdGhpcy5uZXdEZXBJZHMuY2xlYXIoKTsKICB0bXAgPSB0aGlzLmRlcHM7CiAgdGhpcy5kZXBzID0gdGhpcy5uZXdEZXBzOwogIHRoaXMubmV3RGVwcyA9IHRtcDsKICB0aGlzLm5ld0RlcHMubGVuZ3RoID0gMDsKfTsKCi8qKgogKiBTdWJzY3JpYmVyIGludGVyZmFjZS4KICogV2lsbCBiZSBjYWxsZWQgd2hlbiBhIGRlcGVuZGVuY3kgY2hhbmdlcy4KICovCldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICBpZiAodGhpcy5sYXp5KSB7CiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsKICB9IGVsc2UgaWYgKHRoaXMuc3luYykgewogICAgdGhpcy5ydW4oKTsKICB9IGVsc2UgewogICAgcXVldWVXYXRjaGVyKHRoaXMpOwogIH0KfTsKCi8qKgogKiBTY2hlZHVsZXIgam9iIGludGVyZmFjZS4KICogV2lsbCBiZSBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlci4KICovCldhdGNoZXIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIHJ1biAoKSB7CiAgaWYgKHRoaXMuYWN0aXZlKSB7CiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldCgpOwogICAgaWYgKAogICAgICB2YWx1ZSAhPT0gdGhpcy52YWx1ZSB8fAogICAgICAvLyBEZWVwIHdhdGNoZXJzIGFuZCB3YXRjaGVycyBvbiBPYmplY3QvQXJyYXlzIHNob3VsZCBmaXJlIGV2ZW4KICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGJlY2F1c2UgdGhlIHZhbHVlIG1heQogICAgICAvLyBoYXZlIG11dGF0ZWQuCiAgICAgIGlzT2JqZWN0KHZhbHVlKSB8fAogICAgICB0aGlzLmRlZXAKICAgICkgewogICAgICAvLyBzZXQgbmV3IHZhbHVlCiAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgaWYgKHRoaXMudXNlcikgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB0aGlzLnZtLCAoImNhbGxiYWNrIGZvciB3YXRjaGVyIFwiIiArICh0aGlzLmV4cHJlc3Npb24pICsgIlwiIikpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmNiLmNhbGwodGhpcy52bSwgdmFsdWUsIG9sZFZhbHVlKTsKICAgICAgfQogICAgfQogIH0KfTsKCi8qKgogKiBFdmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIHdhdGNoZXIuCiAqIFRoaXMgb25seSBnZXRzIGNhbGxlZCBmb3IgbGF6eSB3YXRjaGVycy4KICovCldhdGNoZXIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gZXZhbHVhdGUgKCkgewogIHRoaXMudmFsdWUgPSB0aGlzLmdldCgpOwogIHRoaXMuZGlydHkgPSBmYWxzZTsKfTsKCi8qKgogKiBEZXBlbmQgb24gYWxsIGRlcHMgY29sbGVjdGVkIGJ5IHRoaXMgd2F0Y2hlci4KICovCldhdGNoZXIucHJvdG90eXBlLmRlcGVuZCA9IGZ1bmN0aW9uIGRlcGVuZCAoKSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOwogIHdoaWxlIChpLS0pIHsKICAgIHRoaXMkMS5kZXBzW2ldLmRlcGVuZCgpOwogIH0KfTsKCi8qKgogKiBSZW1vdmUgc2VsZiBmcm9tIGFsbCBkZXBlbmRlbmNpZXMnIHN1YnNjcmliZXIgbGlzdC4KICovCldhdGNoZXIucHJvdG90eXBlLnRlYXJkb3duID0gZnVuY3Rpb24gdGVhcmRvd24gKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogIGlmICh0aGlzLmFjdGl2ZSkgewogICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdAogICAgLy8gdGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVuc2l2ZSBvcGVyYXRpb24gc28gd2Ugc2tpcCBpdAogICAgLy8gaWYgdGhlIHZtIGlzIGJlaW5nIGRlc3Ryb3llZC4KICAgIGlmICghdGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZCkgewogICAgICByZW1vdmUodGhpcy52bS5fd2F0Y2hlcnMsIHRoaXMpOwogICAgfQogICAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoOwogICAgd2hpbGUgKGktLSkgewogICAgICB0aGlzJDEuZGVwc1tpXS5yZW1vdmVTdWIodGhpcyQxKTsKICAgIH0KICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgfQp9OwoKLyogICovCgp2YXIgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uID0gewogIGVudW1lcmFibGU6IHRydWUsCiAgY29uZmlndXJhYmxlOiB0cnVlLAogIGdldDogbm9vcCwKICBzZXQ6IG5vb3AKfTsKCmZ1bmN0aW9uIHByb3h5ICh0YXJnZXQsIHNvdXJjZUtleSwga2V5KSB7CiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IGZ1bmN0aW9uIHByb3h5R2V0dGVyICgpIHsKICAgIHJldHVybiB0aGlzW3NvdXJjZUtleV1ba2V5XQogIH07CiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9IGZ1bmN0aW9uIHByb3h5U2V0dGVyICh2YWwpIHsKICAgIHRoaXNbc291cmNlS2V5XVtrZXldID0gdmFsOwogIH07CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24pOwp9CgpmdW5jdGlvbiBpbml0U3RhdGUgKHZtKSB7CiAgdm0uX3dhdGNoZXJzID0gW107CiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9uczsKICBpZiAob3B0cy5wcm9wcykgeyBpbml0UHJvcHModm0sIG9wdHMucHJvcHMpOyB9CiAgaWYgKG9wdHMubWV0aG9kcykgeyBpbml0TWV0aG9kcyh2bSwgb3B0cy5tZXRob2RzKTsgfQogIGlmIChvcHRzLmRhdGEpIHsKICAgIGluaXREYXRhKHZtKTsKICB9IGVsc2UgewogICAgb2JzZXJ2ZSh2bS5fZGF0YSA9IHt9LCB0cnVlIC8qIGFzUm9vdERhdGEgKi8pOwogIH0KICBpZiAob3B0cy5jb21wdXRlZCkgeyBpbml0Q29tcHV0ZWQodm0sIG9wdHMuY29tcHV0ZWQpOyB9CiAgaWYgKG9wdHMud2F0Y2ggJiYgb3B0cy53YXRjaCAhPT0gbmF0aXZlV2F0Y2gpIHsKICAgIGluaXRXYXRjaCh2bSwgb3B0cy53YXRjaCk7CiAgfQp9CgpmdW5jdGlvbiBpbml0UHJvcHMgKHZtLCBwcm9wc09wdGlvbnMpIHsKICB2YXIgcHJvcHNEYXRhID0gdm0uJG9wdGlvbnMucHJvcHNEYXRhIHx8IHt9OwogIHZhciBwcm9wcyA9IHZtLl9wcm9wcyA9IHt9OwogIC8vIGNhY2hlIHByb3Aga2V5cyBzbyB0aGF0IGZ1dHVyZSBwcm9wcyB1cGRhdGVzIGNhbiBpdGVyYXRlIHVzaW5nIEFycmF5CiAgLy8gaW5zdGVhZCBvZiBkeW5hbWljIG9iamVjdCBrZXkgZW51bWVyYXRpb24uCiAgdmFyIGtleXMgPSB2bS4kb3B0aW9ucy5fcHJvcEtleXMgPSBbXTsKICB2YXIgaXNSb290ID0gIXZtLiRwYXJlbnQ7CiAgLy8gcm9vdCBpbnN0YW5jZSBwcm9wcyBzaG91bGQgYmUgY29udmVydGVkCiAgaWYgKCFpc1Jvb3QpIHsKICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSk7CiAgfQogIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7CiAgICBrZXlzLnB1c2goa2V5KTsKICAgIHZhciB2YWx1ZSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BzT3B0aW9ucywgcHJvcHNEYXRhLCB2bSk7CiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLwogICAgewogICAgICB2YXIgaHlwaGVuYXRlZEtleSA9IGh5cGhlbmF0ZShrZXkpOwogICAgICBpZiAoaXNSZXNlcnZlZEF0dHJpYnV0ZShoeXBoZW5hdGVkS2V5KSB8fAogICAgICAgICAgY29uZmlnLmlzUmVzZXJ2ZWRBdHRyKGh5cGhlbmF0ZWRLZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICgiXCIiICsgaHlwaGVuYXRlZEtleSArICJcIiBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgY29tcG9uZW50IHByb3AuIiksCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgICAgZGVmaW5lUmVhY3RpdmUocHJvcHMsIGtleSwgdmFsdWUsIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAodm0uJHBhcmVudCAmJiAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50KSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYSBwcm9wIGRpcmVjdGx5IHNpbmNlIHRoZSB2YWx1ZSB3aWxsIGJlICIgKwogICAgICAgICAgICAib3ZlcndyaXR0ZW4gd2hlbmV2ZXIgdGhlIHBhcmVudCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArCiAgICAgICAgICAgICJJbnN0ZWFkLCB1c2UgYSBkYXRhIG9yIGNvbXB1dGVkIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwcm9wJ3MgIiArCiAgICAgICAgICAgICJ2YWx1ZS4gUHJvcCBiZWluZyBtdXRhdGVkOiBcIiIgKyBrZXkgKyAiXCIiLAogICAgICAgICAgICB2bQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgLy8gc3RhdGljIHByb3BzIGFyZSBhbHJlYWR5IHByb3hpZWQgb24gdGhlIGNvbXBvbmVudCdzIHByb3RvdHlwZQogICAgLy8gZHVyaW5nIFZ1ZS5leHRlbmQoKS4gV2Ugb25seSBuZWVkIHRvIHByb3h5IHByb3BzIGRlZmluZWQgYXQKICAgIC8vIGluc3RhbnRpYXRpb24gaGVyZS4KICAgIGlmICghKGtleSBpbiB2bSkpIHsKICAgICAgcHJveHkodm0sICJfcHJvcHMiLCBrZXkpOwogICAgfQogIH07CgogIGZvciAodmFyIGtleSBpbiBwcm9wc09wdGlvbnMpIGxvb3AoIGtleSApOwogIHRvZ2dsZU9ic2VydmluZyh0cnVlKTsKfQoKZnVuY3Rpb24gaW5pdERhdGEgKHZtKSB7CiAgdmFyIGRhdGEgPSB2bS4kb3B0aW9ucy5kYXRhOwogIGRhdGEgPSB2bS5fZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nCiAgICA/IGdldERhdGEoZGF0YSwgdm0pCiAgICA6IGRhdGEgfHwge307CiAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEpKSB7CiAgICBkYXRhID0ge307CiAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgJ2RhdGEgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0OlxuJyArCiAgICAgICdodHRwczovL3Z1ZWpzLm9yZy92Mi9ndWlkZS9jb21wb25lbnRzLmh0bWwjZGF0YS1NdXN0LUJlLWEtRnVuY3Rpb24nLAogICAgICB2bQogICAgKTsKICB9CiAgLy8gcHJveHkgZGF0YSBvbiBpbnN0YW5jZQogIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7CiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7CiAgdmFyIG1ldGhvZHMgPSB2bS4kb3B0aW9ucy5tZXRob2RzOwogIHZhciBpID0ga2V5cy5sZW5ndGg7CiAgd2hpbGUgKGktLSkgewogICAgdmFyIGtleSA9IGtleXNbaV07CiAgICB7CiAgICAgIGlmIChtZXRob2RzICYmIGhhc093bihtZXRob2RzLCBrZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICgiTWV0aG9kIFwiIiArIGtleSArICJcIiBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgYXMgYSBkYXRhIHByb3BlcnR5LiIpLAogICAgICAgICAgdm0KICAgICAgICApOwogICAgICB9CiAgICB9CiAgICBpZiAocHJvcHMgJiYgaGFzT3duKHByb3BzLCBrZXkpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICJUaGUgZGF0YSBwcm9wZXJ0eSBcIiIgKyBrZXkgKyAiXCIgaXMgYWxyZWFkeSBkZWNsYXJlZCBhcyBhIHByb3AuICIgKwogICAgICAgICJVc2UgcHJvcCBkZWZhdWx0IHZhbHVlIGluc3RlYWQuIiwKICAgICAgICB2bQogICAgICApOwogICAgfSBlbHNlIGlmICghaXNSZXNlcnZlZChrZXkpKSB7CiAgICAgIHByb3h5KHZtLCAiX2RhdGEiLCBrZXkpOwogICAgfQogIH0KICAvLyBvYnNlcnZlIGRhdGEKICBvYnNlcnZlKGRhdGEsIHRydWUgLyogYXNSb290RGF0YSAqLyk7Cn0KCmZ1bmN0aW9uIGdldERhdGEgKGRhdGEsIHZtKSB7CiAgLy8gIzc1NzMgZGlzYWJsZSBkZXAgY29sbGVjdGlvbiB3aGVuIGludm9raW5nIGRhdGEgZ2V0dGVycwogIHB1c2hUYXJnZXQoKTsKICB0cnkgewogICAgcmV0dXJuIGRhdGEuY2FsbCh2bSwgdm0pCiAgfSBjYXRjaCAoZSkgewogICAgaGFuZGxlRXJyb3IoZSwgdm0sICJkYXRhKCkiKTsKICAgIHJldHVybiB7fQogIH0gZmluYWxseSB7CiAgICBwb3BUYXJnZXQoKTsKICB9Cn0KCnZhciBjb21wdXRlZFdhdGNoZXJPcHRpb25zID0geyBsYXp5OiB0cnVlIH07CgpmdW5jdGlvbiBpbml0Q29tcHV0ZWQgKHZtLCBjb21wdXRlZCkgewogIC8vICRmbG93LWRpc2FibGUtbGluZQogIHZhciB3YXRjaGVycyA9IHZtLl9jb21wdXRlZFdhdGNoZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAvLyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBqdXN0IGdldHRlcnMgZHVyaW5nIFNTUgogIHZhciBpc1NTUiA9IGlzU2VydmVyUmVuZGVyaW5nKCk7CgogIGZvciAodmFyIGtleSBpbiBjb21wdXRlZCkgewogICAgdmFyIHVzZXJEZWYgPSBjb21wdXRlZFtrZXldOwogICAgdmFyIGdldHRlciA9IHR5cGVvZiB1c2VyRGVmID09PSAnZnVuY3Rpb24nID8gdXNlckRlZiA6IHVzZXJEZWYuZ2V0OwogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBnZXR0ZXIgPT0gbnVsbCkgewogICAgICB3YXJuKAogICAgICAgICgiR2V0dGVyIGlzIG1pc3NpbmcgZm9yIGNvbXB1dGVkIHByb3BlcnR5IFwiIiArIGtleSArICJcIi4iKSwKICAgICAgICB2bQogICAgICApOwogICAgfQoKICAgIGlmICghaXNTU1IpIHsKICAgICAgLy8gY3JlYXRlIGludGVybmFsIHdhdGNoZXIgZm9yIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS4KICAgICAgd2F0Y2hlcnNba2V5XSA9IG5ldyBXYXRjaGVyKAogICAgICAgIHZtLAogICAgICAgIGdldHRlciB8fCBub29wLAogICAgICAgIG5vb3AsCiAgICAgICAgY29tcHV0ZWRXYXRjaGVyT3B0aW9ucwogICAgICApOwogICAgfQoKICAgIC8vIGNvbXBvbmVudC1kZWZpbmVkIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIGFscmVhZHkgZGVmaW5lZCBvbiB0aGUKICAgIC8vIGNvbXBvbmVudCBwcm90b3R5cGUuIFdlIG9ubHkgbmVlZCB0byBkZWZpbmUgY29tcHV0ZWQgcHJvcGVydGllcyBkZWZpbmVkCiAgICAvLyBhdCBpbnN0YW50aWF0aW9uIGhlcmUuCiAgICBpZiAoIShrZXkgaW4gdm0pKSB7CiAgICAgIGRlZmluZUNvbXB1dGVkKHZtLCBrZXksIHVzZXJEZWYpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGtleSBpbiB2bS4kZGF0YSkgewogICAgICAgIHdhcm4oKCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBkYXRhLiIpLCB2bSk7CiAgICAgIH0gZWxzZSBpZiAodm0uJG9wdGlvbnMucHJvcHMgJiYga2V5IGluIHZtLiRvcHRpb25zLnByb3BzKSB7CiAgICAgICAgd2FybigoIlRoZSBjb21wdXRlZCBwcm9wZXJ0eSBcIiIgKyBrZXkgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgcHJvcC4iKSwgdm0pOwogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBkZWZpbmVDb21wdXRlZCAoCiAgdGFyZ2V0LAogIGtleSwKICB1c2VyRGVmCikgewogIHZhciBzaG91bGRDYWNoZSA9ICFpc1NlcnZlclJlbmRlcmluZygpOwogIGlmICh0eXBlb2YgdXNlckRlZiA9PT0gJ2Z1bmN0aW9uJykgewogICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHNob3VsZENhY2hlCiAgICAgID8gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIoa2V5KQogICAgICA6IHVzZXJEZWY7CiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gbm9vcDsKICB9IGVsc2UgewogICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IHVzZXJEZWYuZ2V0CiAgICAgID8gc2hvdWxkQ2FjaGUgJiYgdXNlckRlZi5jYWNoZSAhPT0gZmFsc2UKICAgICAgICA/IGNyZWF0ZUNvbXB1dGVkR2V0dGVyKGtleSkKICAgICAgICA6IHVzZXJEZWYuZ2V0CiAgICAgIDogbm9vcDsKICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSB1c2VyRGVmLnNldAogICAgICA/IHVzZXJEZWYuc2V0CiAgICAgIDogbm9vcDsKICB9CiAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID09PSBub29wKSB7CiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gZnVuY3Rpb24gKCkgewogICAgICB3YXJuKAogICAgICAgICgiQ29tcHV0ZWQgcHJvcGVydHkgXCIiICsga2V5ICsgIlwiIHdhcyBhc3NpZ25lZCB0byBidXQgaXQgaGFzIG5vIHNldHRlci4iKSwKICAgICAgICB0aGlzCiAgICAgICk7CiAgICB9OwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbik7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbXB1dGVkR2V0dGVyIChrZXkpIHsKICByZXR1cm4gZnVuY3Rpb24gY29tcHV0ZWRHZXR0ZXIgKCkgewogICAgdmFyIHdhdGNoZXIgPSB0aGlzLl9jb21wdXRlZFdhdGNoZXJzICYmIHRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNba2V5XTsKICAgIGlmICh3YXRjaGVyKSB7CiAgICAgIGlmICh3YXRjaGVyLmRpcnR5KSB7CiAgICAgICAgd2F0Y2hlci5ldmFsdWF0ZSgpOwogICAgICB9CiAgICAgIGlmIChEZXAudGFyZ2V0KSB7CiAgICAgICAgd2F0Y2hlci5kZXBlbmQoKTsKICAgICAgfQogICAgICByZXR1cm4gd2F0Y2hlci52YWx1ZQogICAgfQogIH0KfQoKZnVuY3Rpb24gaW5pdE1ldGhvZHMgKHZtLCBtZXRob2RzKSB7CiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7CiAgZm9yICh2YXIga2V5IGluIG1ldGhvZHMpIHsKICAgIHsKICAgICAgaWYgKG1ldGhvZHNba2V5XSA9PSBudWxsKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJNZXRob2QgXCIiICsga2V5ICsgIlwiIGhhcyBhbiB1bmRlZmluZWQgdmFsdWUgaW4gdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLiAiICsKICAgICAgICAgICJEaWQgeW91IHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gY29ycmVjdGx5PyIsCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgICAgaWYgKHByb3BzICYmIGhhc093bihwcm9wcywga2V5KSkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAoIk1ldGhvZCBcIiIgKyBrZXkgKyAiXCIgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGFzIGEgcHJvcC4iKSwKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgICBpZiAoKGtleSBpbiB2bSkgJiYgaXNSZXNlcnZlZChrZXkpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJNZXRob2QgXCIiICsga2V5ICsgIlwiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIFZ1ZSBpbnN0YW5jZSBtZXRob2QuICIgKwogICAgICAgICAgIkF2b2lkIGRlZmluaW5nIGNvbXBvbmVudCBtZXRob2RzIHRoYXQgc3RhcnQgd2l0aCBfIG9yICQuIgogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIHZtW2tleV0gPSBtZXRob2RzW2tleV0gPT0gbnVsbCA/IG5vb3AgOiBiaW5kKG1ldGhvZHNba2V5XSwgdm0pOwogIH0KfQoKZnVuY3Rpb24gaW5pdFdhdGNoICh2bSwgd2F0Y2gpIHsKICBmb3IgKHZhciBrZXkgaW4gd2F0Y2gpIHsKICAgIHZhciBoYW5kbGVyID0gd2F0Y2hba2V5XTsKICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXIpKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlci5sZW5ndGg7IGkrKykgewogICAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcltpXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNyZWF0ZVdhdGNoZXIodm0sIGtleSwgaGFuZGxlcik7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVXYXRjaGVyICgKICB2bSwKICBleHBPckZuLAogIGhhbmRsZXIsCiAgb3B0aW9ucwopIHsKICBpZiAoaXNQbGFpbk9iamVjdChoYW5kbGVyKSkgewogICAgb3B0aW9ucyA9IGhhbmRsZXI7CiAgICBoYW5kbGVyID0gaGFuZGxlci5oYW5kbGVyOwogIH0KICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnKSB7CiAgICBoYW5kbGVyID0gdm1baGFuZGxlcl07CiAgfQogIHJldHVybiB2bS4kd2F0Y2goZXhwT3JGbiwgaGFuZGxlciwgb3B0aW9ucykKfQoKZnVuY3Rpb24gc3RhdGVNaXhpbiAoVnVlKSB7CiAgLy8gZmxvdyBzb21laG93IGhhcyBwcm9ibGVtcyB3aXRoIGRpcmVjdGx5IGRlY2xhcmVkIGRlZmluaXRpb24gb2JqZWN0CiAgLy8gd2hlbiB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHksIHNvIHdlIGhhdmUgdG8gcHJvY2VkdXJhbGx5IGJ1aWxkIHVwCiAgLy8gdGhlIG9iamVjdCBoZXJlLgogIHZhciBkYXRhRGVmID0ge307CiAgZGF0YURlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kYXRhIH07CiAgdmFyIHByb3BzRGVmID0ge307CiAgcHJvcHNEZWYuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcHJvcHMgfTsKICB7CiAgICBkYXRhRGVmLnNldCA9IGZ1bmN0aW9uIChuZXdEYXRhKSB7CiAgICAgIHdhcm4oCiAgICAgICAgJ0F2b2lkIHJlcGxhY2luZyBpbnN0YW5jZSByb290ICRkYXRhLiAnICsKICAgICAgICAnVXNlIG5lc3RlZCBkYXRhIHByb3BlcnRpZXMgaW5zdGVhZC4nLAogICAgICAgIHRoaXMKICAgICAgKTsKICAgIH07CiAgICBwcm9wc0RlZi5zZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHdhcm4oIiRwcm9wcyBpcyByZWFkb25seS4iLCB0aGlzKTsKICAgIH07CiAgfQogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGRhdGEnLCBkYXRhRGVmKTsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRwcm9wcycsIHByb3BzRGVmKTsKCiAgVnVlLnByb3RvdHlwZS4kc2V0ID0gc2V0OwogIFZ1ZS5wcm90b3R5cGUuJGRlbGV0ZSA9IGRlbDsKCiAgVnVlLnByb3RvdHlwZS4kd2F0Y2ggPSBmdW5jdGlvbiAoCiAgICBleHBPckZuLAogICAgY2IsCiAgICBvcHRpb25zCiAgKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgaWYgKGlzUGxhaW5PYmplY3QoY2IpKSB7CiAgICAgIHJldHVybiBjcmVhdGVXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucykKICAgIH0KICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgb3B0aW9ucy51c2VyID0gdHJ1ZTsKICAgIHZhciB3YXRjaGVyID0gbmV3IFdhdGNoZXIodm0sIGV4cE9yRm4sIGNiLCBvcHRpb25zKTsKICAgIGlmIChvcHRpb25zLmltbWVkaWF0ZSkgewogICAgICBjYi5jYWxsKHZtLCB3YXRjaGVyLnZhbHVlKTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiB1bndhdGNoRm4gKCkgewogICAgICB3YXRjaGVyLnRlYXJkb3duKCk7CiAgICB9CiAgfTsKfQoKLyogICovCgpmdW5jdGlvbiBpbml0UHJvdmlkZSAodm0pIHsKICB2YXIgcHJvdmlkZSA9IHZtLiRvcHRpb25zLnByb3ZpZGU7CiAgaWYgKHByb3ZpZGUpIHsKICAgIHZtLl9wcm92aWRlZCA9IHR5cGVvZiBwcm92aWRlID09PSAnZnVuY3Rpb24nCiAgICAgID8gcHJvdmlkZS5jYWxsKHZtKQogICAgICA6IHByb3ZpZGU7CiAgfQp9CgpmdW5jdGlvbiBpbml0SW5qZWN0aW9ucyAodm0pIHsKICB2YXIgcmVzdWx0ID0gcmVzb2x2ZUluamVjdCh2bS4kb3B0aW9ucy5pbmplY3QsIHZtKTsKICBpZiAocmVzdWx0KSB7CiAgICB0b2dnbGVPYnNlcnZpbmcoZmFsc2UpOwogICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgICAgewogICAgICAgIGRlZmluZVJlYWN0aXZlKHZtLCBrZXksIHJlc3VsdFtrZXldLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAiQXZvaWQgbXV0YXRpbmcgYW4gaW5qZWN0ZWQgdmFsdWUgZGlyZWN0bHkgc2luY2UgdGhlIGNoYW5nZXMgd2lsbCBiZSAiICsKICAgICAgICAgICAgIm92ZXJ3cml0dGVuIHdoZW5ldmVyIHRoZSBwcm92aWRlZCBjb21wb25lbnQgcmUtcmVuZGVycy4gIiArCiAgICAgICAgICAgICJpbmplY3Rpb24gYmVpbmcgbXV0YXRlZDogXCIiICsga2V5ICsgIlwiIiwKICAgICAgICAgICAgdm0KICAgICAgICAgICk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpOwogIH0KfQoKZnVuY3Rpb24gcmVzb2x2ZUluamVjdCAoaW5qZWN0LCB2bSkgewogIGlmIChpbmplY3QpIHsKICAgIC8vIGluamVjdCBpcyA6YW55IGJlY2F1c2UgZmxvdyBpcyBub3Qgc21hcnQgZW5vdWdoIHRvIGZpZ3VyZSBvdXQgY2FjaGVkCiAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHZhciBrZXlzID0gaGFzU3ltYm9sCiAgICAgID8gUmVmbGVjdC5vd25LZXlzKGluamVjdCkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwogICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluamVjdCwga2V5KS5lbnVtZXJhYmxlCiAgICAgIH0pCiAgICAgIDogT2JqZWN0LmtleXMoaW5qZWN0KTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGtleSA9IGtleXNbaV07CiAgICAgIHZhciBwcm92aWRlS2V5ID0gaW5qZWN0W2tleV0uZnJvbTsKICAgICAgdmFyIHNvdXJjZSA9IHZtOwogICAgICB3aGlsZSAoc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5fcHJvdmlkZWQgJiYgaGFzT3duKHNvdXJjZS5fcHJvdmlkZWQsIHByb3ZpZGVLZXkpKSB7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHNvdXJjZS5fcHJvdmlkZWRbcHJvdmlkZUtleV07CiAgICAgICAgICBicmVhawogICAgICAgIH0KICAgICAgICBzb3VyY2UgPSBzb3VyY2UuJHBhcmVudDsKICAgICAgfQogICAgICBpZiAoIXNvdXJjZSkgewogICAgICAgIGlmICgnZGVmYXVsdCcgaW4gaW5qZWN0W2tleV0pIHsKICAgICAgICAgIHZhciBwcm92aWRlRGVmYXVsdCA9IGluamVjdFtrZXldLmRlZmF1bHQ7CiAgICAgICAgICByZXN1bHRba2V5XSA9IHR5cGVvZiBwcm92aWRlRGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJwogICAgICAgICAgICA/IHByb3ZpZGVEZWZhdWx0LmNhbGwodm0pCiAgICAgICAgICAgIDogcHJvdmlkZURlZmF1bHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhcm4oKCJJbmplY3Rpb24gXCIiICsga2V5ICsgIlwiIG5vdCBmb3VuZCIpLCB2bSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0CiAgfQp9CgovKiAgKi8KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIHYtZm9yIGxpc3RzLgogKi8KZnVuY3Rpb24gcmVuZGVyTGlzdCAoCiAgdmFsLAogIHJlbmRlcgopIHsKICB2YXIgcmV0LCBpLCBsLCBrZXlzLCBrZXk7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgewogICAgcmV0ID0gbmV3IEFycmF5KHZhbC5sZW5ndGgpOwogICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtpXSwgaSk7CiAgICB9CiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgewogICAgcmV0ID0gbmV3IEFycmF5KHZhbCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgdmFsOyBpKyspIHsKICAgICAgcmV0W2ldID0gcmVuZGVyKGkgKyAxLCBpKTsKICAgIH0KICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkpIHsKICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpOwogICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTsKICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBrZXkgPSBrZXlzW2ldOwogICAgICByZXRbaV0gPSByZW5kZXIodmFsW2tleV0sIGtleSwgaSk7CiAgICB9CiAgfQogIGlmIChpc0RlZihyZXQpKSB7CiAgICAocmV0KS5faXNWTGlzdCA9IHRydWU7CiAgfQogIHJldHVybiByZXQKfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyA8c2xvdD4KICovCmZ1bmN0aW9uIHJlbmRlclNsb3QgKAogIG5hbWUsCiAgZmFsbGJhY2ssCiAgcHJvcHMsCiAgYmluZE9iamVjdAopIHsKICB2YXIgc2NvcGVkU2xvdEZuID0gdGhpcy4kc2NvcGVkU2xvdHNbbmFtZV07CiAgdmFyIG5vZGVzOwogIGlmIChzY29wZWRTbG90Rm4pIHsgLy8gc2NvcGVkIHNsb3QKICAgIHByb3BzID0gcHJvcHMgfHwge307CiAgICBpZiAoYmluZE9iamVjdCkgewogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmICFpc09iamVjdChiaW5kT2JqZWN0KSkgewogICAgICAgIHdhcm4oCiAgICAgICAgICAnc2xvdCB2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCcsCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgfQogICAgICBwcm9wcyA9IGV4dGVuZChleHRlbmQoe30sIGJpbmRPYmplY3QpLCBwcm9wcyk7CiAgICB9CiAgICBub2RlcyA9IHNjb3BlZFNsb3RGbihwcm9wcykgfHwgZmFsbGJhY2s7CiAgfSBlbHNlIHsKICAgIHZhciBzbG90Tm9kZXMgPSB0aGlzLiRzbG90c1tuYW1lXTsKICAgIC8vIHdhcm4gZHVwbGljYXRlIHNsb3QgdXNhZ2UKICAgIGlmIChzbG90Tm9kZXMpIHsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBzbG90Tm9kZXMuX3JlbmRlcmVkKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJEdXBsaWNhdGUgcHJlc2VuY2Ugb2Ygc2xvdCBcIiIgKyBuYW1lICsgIlwiIGZvdW5kIGluIHRoZSBzYW1lIHJlbmRlciB0cmVlICIgKwogICAgICAgICAgIi0gdGhpcyB3aWxsIGxpa2VseSBjYXVzZSByZW5kZXIgZXJyb3JzLiIsCiAgICAgICAgICB0aGlzCiAgICAgICAgKTsKICAgICAgfQogICAgICBzbG90Tm9kZXMuX3JlbmRlcmVkID0gdHJ1ZTsKICAgIH0KICAgIG5vZGVzID0gc2xvdE5vZGVzIHx8IGZhbGxiYWNrOwogIH0KCiAgdmFyIHRhcmdldCA9IHByb3BzICYmIHByb3BzLnNsb3Q7CiAgaWYgKHRhcmdldCkgewogICAgcmV0dXJuIHRoaXMuJGNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJywgeyBzbG90OiB0YXJnZXQgfSwgbm9kZXMpCiAgfSBlbHNlIHsKICAgIHJldHVybiBub2RlcwogIH0KfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyBmaWx0ZXJzCiAqLwpmdW5jdGlvbiByZXNvbHZlRmlsdGVyIChpZCkgewogIHJldHVybiByZXNvbHZlQXNzZXQodGhpcy4kb3B0aW9ucywgJ2ZpbHRlcnMnLCBpZCwgdHJ1ZSkgfHwgaWRlbnRpdHkKfQoKLyogICovCgpmdW5jdGlvbiBpc0tleU5vdE1hdGNoIChleHBlY3QsIGFjdHVhbCkgewogIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdCkpIHsKICAgIHJldHVybiBleHBlY3QuaW5kZXhPZihhY3R1YWwpID09PSAtMQogIH0gZWxzZSB7CiAgICByZXR1cm4gZXhwZWN0ICE9PSBhY3R1YWwKICB9Cn0KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgY2hlY2tpbmcga2V5Q29kZXMgZnJvbSBjb25maWcuCiAqIGV4cG9zZWQgYXMgVnVlLnByb3RvdHlwZS5fawogKiBwYXNzaW5nIGluIGV2ZW50S2V5TmFtZSBhcyBsYXN0IGFyZ3VtZW50IHNlcGFyYXRlbHkgZm9yIGJhY2t3YXJkcyBjb21wYXQKICovCmZ1bmN0aW9uIGNoZWNrS2V5Q29kZXMgKAogIGV2ZW50S2V5Q29kZSwKICBrZXksCiAgYnVpbHRJbktleUNvZGUsCiAgZXZlbnRLZXlOYW1lLAogIGJ1aWx0SW5LZXlOYW1lCikgewogIHZhciBtYXBwZWRLZXlDb2RlID0gY29uZmlnLmtleUNvZGVzW2tleV0gfHwgYnVpbHRJbktleUNvZGU7CiAgaWYgKGJ1aWx0SW5LZXlOYW1lICYmIGV2ZW50S2V5TmFtZSAmJiAhY29uZmlnLmtleUNvZGVzW2tleV0pIHsKICAgIHJldHVybiBpc0tleU5vdE1hdGNoKGJ1aWx0SW5LZXlOYW1lLCBldmVudEtleU5hbWUpCiAgfSBlbHNlIGlmIChtYXBwZWRLZXlDb2RlKSB7CiAgICByZXR1cm4gaXNLZXlOb3RNYXRjaChtYXBwZWRLZXlDb2RlLCBldmVudEtleUNvZGUpCiAgfSBlbHNlIGlmIChldmVudEtleU5hbWUpIHsKICAgIHJldHVybiBoeXBoZW5hdGUoZXZlbnRLZXlOYW1lKSAhPT0ga2V5CiAgfQp9CgovKiAgKi8KCi8qKgogKiBSdW50aW1lIGhlbHBlciBmb3IgbWVyZ2luZyB2LWJpbmQ9Im9iamVjdCIgaW50byBhIFZOb2RlJ3MgZGF0YS4KICovCmZ1bmN0aW9uIGJpbmRPYmplY3RQcm9wcyAoCiAgZGF0YSwKICB0YWcsCiAgdmFsdWUsCiAgYXNQcm9wLAogIGlzU3luYwopIHsKICBpZiAodmFsdWUpIHsKICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICd2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCBvciBBcnJheSB2YWx1ZScsCiAgICAgICAgdGhpcwogICAgICApOwogICAgfSBlbHNlIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgdmFsdWUgPSB0b09iamVjdCh2YWx1ZSk7CiAgICAgIH0KICAgICAgdmFyIGhhc2g7CiAgICAgIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7CiAgICAgICAgaWYgKAogICAgICAgICAga2V5ID09PSAnY2xhc3MnIHx8CiAgICAgICAgICBrZXkgPT09ICdzdHlsZScgfHwKICAgICAgICAgIGlzUmVzZXJ2ZWRBdHRyaWJ1dGUoa2V5KQogICAgICAgICkgewogICAgICAgICAgaGFzaCA9IGRhdGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnR5cGU7CiAgICAgICAgICBoYXNoID0gYXNQcm9wIHx8IGNvbmZpZy5tdXN0VXNlUHJvcCh0YWcsIHR5cGUsIGtleSkKICAgICAgICAgICAgPyBkYXRhLmRvbVByb3BzIHx8IChkYXRhLmRvbVByb3BzID0ge30pCiAgICAgICAgICAgIDogZGF0YS5hdHRycyB8fCAoZGF0YS5hdHRycyA9IHt9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCEoa2V5IGluIGhhc2gpKSB7CiAgICAgICAgICBoYXNoW2tleV0gPSB2YWx1ZVtrZXldOwoKICAgICAgICAgIGlmIChpc1N5bmMpIHsKICAgICAgICAgICAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTsKICAgICAgICAgICAgb25bKCJ1cGRhdGU6IiArIGtleSldID0gZnVuY3Rpb24gKCRldmVudCkgewogICAgICAgICAgICAgIHZhbHVlW2tleV0gPSAkZXZlbnQ7CiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwoKICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSBsb29wKCBrZXkgKTsKICAgIH0KICB9CiAgcmV0dXJuIGRhdGEKfQoKLyogICovCgovKioKICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyBzdGF0aWMgdHJlZXMuCiAqLwpmdW5jdGlvbiByZW5kZXJTdGF0aWMgKAogIGluZGV4LAogIGlzSW5Gb3IKKSB7CiAgdmFyIGNhY2hlZCA9IHRoaXMuX3N0YXRpY1RyZWVzIHx8ICh0aGlzLl9zdGF0aWNUcmVlcyA9IFtdKTsKICB2YXIgdHJlZSA9IGNhY2hlZFtpbmRleF07CiAgLy8gaWYgaGFzIGFscmVhZHktcmVuZGVyZWQgc3RhdGljIHRyZWUgYW5kIG5vdCBpbnNpZGUgdi1mb3IsCiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUuCiAgaWYgKHRyZWUgJiYgIWlzSW5Gb3IpIHsKICAgIHJldHVybiB0cmVlCiAgfQogIC8vIG90aGVyd2lzZSwgcmVuZGVyIGEgZnJlc2ggdHJlZS4KICB0cmVlID0gY2FjaGVkW2luZGV4XSA9IHRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2luZGV4XS5jYWxsKAogICAgdGhpcy5fcmVuZGVyUHJveHksCiAgICBudWxsLAogICAgdGhpcyAvLyBmb3IgcmVuZGVyIGZucyBnZW5lcmF0ZWQgZm9yIGZ1bmN0aW9uYWwgY29tcG9uZW50IHRlbXBsYXRlcwogICk7CiAgbWFya1N0YXRpYyh0cmVlLCAoIl9fc3RhdGljX18iICsgaW5kZXgpLCBmYWxzZSk7CiAgcmV0dXJuIHRyZWUKfQoKLyoqCiAqIFJ1bnRpbWUgaGVscGVyIGZvciB2LW9uY2UuCiAqIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIG1hcmtpbmcgdGhlIG5vZGUgYXMgc3RhdGljIHdpdGggYSB1bmlxdWUga2V5LgogKi8KZnVuY3Rpb24gbWFya09uY2UgKAogIHRyZWUsCiAgaW5kZXgsCiAga2V5CikgewogIG1hcmtTdGF0aWModHJlZSwgKCJfX29uY2VfXyIgKyBpbmRleCArIChrZXkgPyAoIl8iICsga2V5KSA6ICIiKSksIHRydWUpOwogIHJldHVybiB0cmVlCn0KCmZ1bmN0aW9uIG1hcmtTdGF0aWMgKAogIHRyZWUsCiAga2V5LAogIGlzT25jZQopIHsKICBpZiAoQXJyYXkuaXNBcnJheSh0cmVlKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0cmVlW2ldICYmIHR5cGVvZiB0cmVlW2ldICE9PSAnc3RyaW5nJykgewogICAgICAgIG1hcmtTdGF0aWNOb2RlKHRyZWVbaV0sIChrZXkgKyAiXyIgKyBpKSwgaXNPbmNlKTsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBtYXJrU3RhdGljTm9kZSh0cmVlLCBrZXksIGlzT25jZSk7CiAgfQp9CgpmdW5jdGlvbiBtYXJrU3RhdGljTm9kZSAobm9kZSwga2V5LCBpc09uY2UpIHsKICBub2RlLmlzU3RhdGljID0gdHJ1ZTsKICBub2RlLmtleSA9IGtleTsKICBub2RlLmlzT25jZSA9IGlzT25jZTsKfQoKLyogICovCgpmdW5jdGlvbiBiaW5kT2JqZWN0TGlzdGVuZXJzIChkYXRhLCB2YWx1ZSkgewogIGlmICh2YWx1ZSkgewogICAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkgewogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgd2FybigKICAgICAgICAndi1vbiB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IHZhbHVlJywKICAgICAgICB0aGlzCiAgICAgICk7CiAgICB9IGVsc2UgewogICAgICB2YXIgb24gPSBkYXRhLm9uID0gZGF0YS5vbiA/IGV4dGVuZCh7fSwgZGF0YS5vbikgOiB7fTsKICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7CiAgICAgICAgdmFyIGV4aXN0aW5nID0gb25ba2V5XTsKICAgICAgICB2YXIgb3VycyA9IHZhbHVlW2tleV07CiAgICAgICAgb25ba2V5XSA9IGV4aXN0aW5nID8gW10uY29uY2F0KGV4aXN0aW5nLCBvdXJzKSA6IG91cnM7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGRhdGEKfQoKLyogICovCgpmdW5jdGlvbiBpbnN0YWxsUmVuZGVySGVscGVycyAodGFyZ2V0KSB7CiAgdGFyZ2V0Ll9vID0gbWFya09uY2U7CiAgdGFyZ2V0Ll9uID0gdG9OdW1iZXI7CiAgdGFyZ2V0Ll9zID0gdG9TdHJpbmc7CiAgdGFyZ2V0Ll9sID0gcmVuZGVyTGlzdDsKICB0YXJnZXQuX3QgPSByZW5kZXJTbG90OwogIHRhcmdldC5fcSA9IGxvb3NlRXF1YWw7CiAgdGFyZ2V0Ll9pID0gbG9vc2VJbmRleE9mOwogIHRhcmdldC5fbSA9IHJlbmRlclN0YXRpYzsKICB0YXJnZXQuX2YgPSByZXNvbHZlRmlsdGVyOwogIHRhcmdldC5fayA9IGNoZWNrS2V5Q29kZXM7CiAgdGFyZ2V0Ll9iID0gYmluZE9iamVjdFByb3BzOwogIHRhcmdldC5fdiA9IGNyZWF0ZVRleHRWTm9kZTsKICB0YXJnZXQuX2UgPSBjcmVhdGVFbXB0eVZOb2RlOwogIHRhcmdldC5fdSA9IHJlc29sdmVTY29wZWRTbG90czsKICB0YXJnZXQuX2cgPSBiaW5kT2JqZWN0TGlzdGVuZXJzOwp9CgovKiAgKi8KCmZ1bmN0aW9uIEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0ICgKICBkYXRhLAogIHByb3BzLAogIGNoaWxkcmVuLAogIHBhcmVudCwKICBDdG9yCikgewogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOwogIC8vIGVuc3VyZSB0aGUgY3JlYXRlRWxlbWVudCBmdW5jdGlvbiBpbiBmdW5jdGlvbmFsIGNvbXBvbmVudHMKICAvLyBnZXRzIGEgdW5pcXVlIGNvbnRleHQgLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgY29ycmVjdCBuYW1lZCBzbG90IGNoZWNrCiAgdmFyIGNvbnRleHRWbTsKICBpZiAoaGFzT3duKHBhcmVudCwgJ191aWQnKSkgewogICAgY29udGV4dFZtID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQpOwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICBjb250ZXh0Vm0uX29yaWdpbmFsID0gcGFyZW50OwogIH0gZWxzZSB7CiAgICAvLyB0aGUgY29udGV4dCB2bSBwYXNzZWQgaW4gaXMgYSBmdW5jdGlvbmFsIGNvbnRleHQgYXMgd2VsbC4KICAgIC8vIGluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBhcmUgYWJsZSB0byBnZXQgYSBob2xkIHRvIHRoZQogICAgLy8gcmVhbCBjb250ZXh0IGluc3RhbmNlLgogICAgY29udGV4dFZtID0gcGFyZW50OwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICBwYXJlbnQgPSBwYXJlbnQuX29yaWdpbmFsOwogIH0KICB2YXIgaXNDb21waWxlZCA9IGlzVHJ1ZShvcHRpb25zLl9jb21waWxlZCk7CiAgdmFyIG5lZWROb3JtYWxpemF0aW9uID0gIWlzQ29tcGlsZWQ7CgogIHRoaXMuZGF0YSA9IGRhdGE7CiAgdGhpcy5wcm9wcyA9IHByb3BzOwogIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICB0aGlzLmxpc3RlbmVycyA9IGRhdGEub24gfHwgZW1wdHlPYmplY3Q7CiAgdGhpcy5pbmplY3Rpb25zID0gcmVzb2x2ZUluamVjdChvcHRpb25zLmluamVjdCwgcGFyZW50KTsKICB0aGlzLnNsb3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZVNsb3RzKGNoaWxkcmVuLCBwYXJlbnQpOyB9OwoKICAvLyBzdXBwb3J0IGZvciBjb21waWxlZCBmdW5jdGlvbmFsIHRlbXBsYXRlCiAgaWYgKGlzQ29tcGlsZWQpIHsKICAgIC8vIGV4cG9zaW5nICRvcHRpb25zIGZvciByZW5kZXJTdGF0aWMoKQogICAgdGhpcy4kb3B0aW9ucyA9IG9wdGlvbnM7CiAgICAvLyBwcmUtcmVzb2x2ZSBzbG90cyBmb3IgcmVuZGVyU2xvdCgpCiAgICB0aGlzLiRzbG90cyA9IHRoaXMuc2xvdHMoKTsKICAgIHRoaXMuJHNjb3BlZFNsb3RzID0gZGF0YS5zY29wZWRTbG90cyB8fCBlbXB0eU9iamVjdDsKICB9CgogIGlmIChvcHRpb25zLl9zY29wZUlkKSB7CiAgICB0aGlzLl9jID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsKICAgICAgdmFyIHZub2RlID0gY3JlYXRlRWxlbWVudChjb250ZXh0Vm0sIGEsIGIsIGMsIGQsIG5lZWROb3JtYWxpemF0aW9uKTsKICAgICAgaWYgKHZub2RlICYmICFBcnJheS5pc0FycmF5KHZub2RlKSkgewogICAgICAgIHZub2RlLmZuU2NvcGVJZCA9IG9wdGlvbnMuX3Njb3BlSWQ7CiAgICAgICAgdm5vZGUuZm5Db250ZXh0ID0gcGFyZW50OwogICAgICB9CiAgICAgIHJldHVybiB2bm9kZQogICAgfTsKICB9IGVsc2UgewogICAgdGhpcy5fYyA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7IHJldHVybiBjcmVhdGVFbGVtZW50KGNvbnRleHRWbSwgYSwgYiwgYywgZCwgbmVlZE5vcm1hbGl6YXRpb24pOyB9OwogIH0KfQoKaW5zdGFsbFJlbmRlckhlbHBlcnMoRnVuY3Rpb25hbFJlbmRlckNvbnRleHQucHJvdG90eXBlKTsKCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQgKAogIEN0b3IsCiAgcHJvcHNEYXRhLAogIGRhdGEsCiAgY29udGV4dFZtLAogIGNoaWxkcmVuCikgewogIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zOwogIHZhciBwcm9wcyA9IHt9OwogIHZhciBwcm9wT3B0aW9ucyA9IG9wdGlvbnMucHJvcHM7CiAgaWYgKGlzRGVmKHByb3BPcHRpb25zKSkgewogICAgZm9yICh2YXIga2V5IGluIHByb3BPcHRpb25zKSB7CiAgICAgIHByb3BzW2tleV0gPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wT3B0aW9ucywgcHJvcHNEYXRhIHx8IGVtcHR5T2JqZWN0KTsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGlzRGVmKGRhdGEuYXR0cnMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEuYXR0cnMpOyB9CiAgICBpZiAoaXNEZWYoZGF0YS5wcm9wcykpIHsgbWVyZ2VQcm9wcyhwcm9wcywgZGF0YS5wcm9wcyk7IH0KICB9CgogIHZhciByZW5kZXJDb250ZXh0ID0gbmV3IEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0KAogICAgZGF0YSwKICAgIHByb3BzLAogICAgY2hpbGRyZW4sCiAgICBjb250ZXh0Vm0sCiAgICBDdG9yCiAgKTsKCiAgdmFyIHZub2RlID0gb3B0aW9ucy5yZW5kZXIuY2FsbChudWxsLCByZW5kZXJDb250ZXh0Ll9jLCByZW5kZXJDb250ZXh0KTsKCiAgaWYgKHZub2RlIGluc3RhbmNlb2YgVk5vZGUpIHsKICAgIHJldHVybiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0KHZub2RlLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucykKICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodm5vZGUpKSB7CiAgICB2YXIgdm5vZGVzID0gbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUpIHx8IFtdOwogICAgdmFyIHJlcyA9IG5ldyBBcnJheSh2bm9kZXMubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdm5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc1tpXSA9IGNsb25lQW5kTWFya0Z1bmN0aW9uYWxSZXN1bHQodm5vZGVzW2ldLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucyk7CiAgICB9CiAgICByZXR1cm4gcmVzCiAgfQp9CgpmdW5jdGlvbiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0ICh2bm9kZSwgZGF0YSwgY29udGV4dFZtLCBvcHRpb25zKSB7CiAgLy8gIzc4MTcgY2xvbmUgbm9kZSBiZWZvcmUgc2V0dGluZyBmbkNvbnRleHQsIG90aGVyd2lzZSBpZiB0aGUgbm9kZSBpcyByZXVzZWQKICAvLyAoZS5nLiBpdCB3YXMgZnJvbSBhIGNhY2hlZCBub3JtYWwgc2xvdCkgdGhlIGZuQ29udGV4dCBjYXVzZXMgbmFtZWQgc2xvdHMKICAvLyB0aGF0IHNob3VsZCBub3QgYmUgbWF0Y2hlZCB0byBtYXRjaC4KICB2YXIgY2xvbmUgPSBjbG9uZVZOb2RlKHZub2RlKTsKICBjbG9uZS5mbkNvbnRleHQgPSBjb250ZXh0Vm07CiAgY2xvbmUuZm5PcHRpb25zID0gb3B0aW9uczsKICBpZiAoZGF0YS5zbG90KSB7CiAgICAoY2xvbmUuZGF0YSB8fCAoY2xvbmUuZGF0YSA9IHt9KSkuc2xvdCA9IGRhdGEuc2xvdDsKICB9CiAgcmV0dXJuIGNsb25lCn0KCmZ1bmN0aW9uIG1lcmdlUHJvcHMgKHRvLCBmcm9tKSB7CiAgZm9yICh2YXIga2V5IGluIGZyb20pIHsKICAgIHRvW2NhbWVsaXplKGtleSldID0gZnJvbVtrZXldOwogIH0KfQoKLyogICovCgoKCgovLyBSZWdpc3RlciB0aGUgY29tcG9uZW50IGhvb2sgdG8gd2VleCBuYXRpdmUgcmVuZGVyIGVuZ2luZS4KLy8gVGhlIGhvb2sgd2lsbCBiZSB0cmlnZ2VyZWQgYnkgbmF0aXZlLCBub3QgamF2YXNjcmlwdC4KCgovLyBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50IHRvIHdlZXggbmF0aXZlIHJlbmRlciBlbmdpbmUuCgovKiAgKi8KCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9IYW5rczEwMTAwL3dlZXgtbmF0aXZlLWRpcmVjdGl2ZS90cmVlL21hc3Rlci9jb21wb25lbnQKCi8vIGxpc3RlbmluZyBvbiBuYXRpdmUgY2FsbGJhY2sKCi8qICAqLwoKLyogICovCgovLyBpbmxpbmUgaG9va3MgdG8gYmUgaW52b2tlZCBvbiBjb21wb25lbnQgVk5vZGVzIGR1cmluZyBwYXRjaAp2YXIgY29tcG9uZW50Vk5vZGVIb29rcyA9IHsKICBpbml0OiBmdW5jdGlvbiBpbml0ICgKICAgIHZub2RlLAogICAgaHlkcmF0aW5nLAogICAgcGFyZW50RWxtLAogICAgcmVmRWxtCiAgKSB7CiAgICBpZiAoCiAgICAgIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmCiAgICAgICF2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQgJiYKICAgICAgdm5vZGUuZGF0YS5rZWVwQWxpdmUKICAgICkgewogICAgICAvLyBrZXB0LWFsaXZlIGNvbXBvbmVudHMsIHRyZWF0IGFzIGEgcGF0Y2gKICAgICAgdmFyIG1vdW50ZWROb2RlID0gdm5vZGU7IC8vIHdvcmsgYXJvdW5kIGZsb3cKICAgICAgY29tcG9uZW50Vk5vZGVIb29rcy5wcmVwYXRjaChtb3VudGVkTm9kZSwgbW91bnRlZE5vZGUpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlKAogICAgICAgIHZub2RlLAogICAgICAgIGFjdGl2ZUluc3RhbmNlLAogICAgICAgIHBhcmVudEVsbSwKICAgICAgICByZWZFbG0KICAgICAgKTsKICAgICAgY2hpbGQuJG1vdW50KGh5ZHJhdGluZyA/IHZub2RlLmVsbSA6IHVuZGVmaW5lZCwgaHlkcmF0aW5nKTsKICAgIH0KICB9LAoKICBwcmVwYXRjaDogZnVuY3Rpb24gcHJlcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSkgewogICAgdmFyIG9wdGlvbnMgPSB2bm9kZS5jb21wb25lbnRPcHRpb25zOwogICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBvbGRWbm9kZS5jb21wb25lbnRJbnN0YW5jZTsKICAgIHVwZGF0ZUNoaWxkQ29tcG9uZW50KAogICAgICBjaGlsZCwKICAgICAgb3B0aW9ucy5wcm9wc0RhdGEsIC8vIHVwZGF0ZWQgcHJvcHMKICAgICAgb3B0aW9ucy5saXN0ZW5lcnMsIC8vIHVwZGF0ZWQgbGlzdGVuZXJzCiAgICAgIHZub2RlLCAvLyBuZXcgcGFyZW50IHZub2RlCiAgICAgIG9wdGlvbnMuY2hpbGRyZW4gLy8gbmV3IGNoaWxkcmVuCiAgICApOwogIH0sCgogIGluc2VydDogZnVuY3Rpb24gaW5zZXJ0ICh2bm9kZSkgewogICAgdmFyIGNvbnRleHQgPSB2bm9kZS5jb250ZXh0OwogICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7CiAgICBpZiAoIWNvbXBvbmVudEluc3RhbmNlLl9pc01vdW50ZWQpIHsKICAgICAgY29tcG9uZW50SW5zdGFuY2UuX2lzTW91bnRlZCA9IHRydWU7CiAgICAgIGNhbGxIb29rKGNvbXBvbmVudEluc3RhbmNlLCAnbW91bnRlZCcpOwogICAgfQogICAgaWYgKHZub2RlLmRhdGEua2VlcEFsaXZlKSB7CiAgICAgIGlmIChjb250ZXh0Ll9pc01vdW50ZWQpIHsKICAgICAgICAvLyB2dWUtcm91dGVyIzEyMTIKICAgICAgICAvLyBEdXJpbmcgdXBkYXRlcywgYSBrZXB0LWFsaXZlIGNvbXBvbmVudCdzIGNoaWxkIGNvbXBvbmVudHMgbWF5CiAgICAgICAgLy8gY2hhbmdlLCBzbyBkaXJlY3RseSB3YWxraW5nIHRoZSB0cmVlIGhlcmUgbWF5IGNhbGwgYWN0aXZhdGVkIGhvb2tzCiAgICAgICAgLy8gb24gaW5jb3JyZWN0IGNoaWxkcmVuLiBJbnN0ZWFkIHdlIHB1c2ggdGhlbSBpbnRvIGEgcXVldWUgd2hpY2ggd2lsbAogICAgICAgIC8vIGJlIHByb2Nlc3NlZCBhZnRlciB0aGUgd2hvbGUgcGF0Y2ggcHJvY2VzcyBlbmRlZC4KICAgICAgICBxdWV1ZUFjdGl2YXRlZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudChjb21wb25lbnRJbnN0YW5jZSwgdHJ1ZSAvKiBkaXJlY3QgKi8pOwogICAgICB9CiAgICB9CiAgfSwKCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHsKICAgIHZhciBjb21wb25lbnRJbnN0YW5jZSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlOwogICAgaWYgKCFjb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQpIHsKICAgICAgaWYgKCF2bm9kZS5kYXRhLmtlZXBBbGl2ZSkgewogICAgICAgIGNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cnVlIC8qIGRpcmVjdCAqLyk7CiAgICAgIH0KICAgIH0KICB9Cn07Cgp2YXIgaG9va3NUb01lcmdlID0gT2JqZWN0LmtleXMoY29tcG9uZW50Vk5vZGVIb29rcyk7CgpmdW5jdGlvbiBjcmVhdGVDb21wb25lbnQgKAogIEN0b3IsCiAgZGF0YSwKICBjb250ZXh0LAogIGNoaWxkcmVuLAogIHRhZwopIHsKICBpZiAoaXNVbmRlZihDdG9yKSkgewogICAgcmV0dXJuCiAgfQoKICB2YXIgYmFzZUN0b3IgPSBjb250ZXh0LiRvcHRpb25zLl9iYXNlOwoKICAvLyBwbGFpbiBvcHRpb25zIG9iamVjdDogdHVybiBpdCBpbnRvIGEgY29uc3RydWN0b3IKICBpZiAoaXNPYmplY3QoQ3RvcikpIHsKICAgIEN0b3IgPSBiYXNlQ3Rvci5leHRlbmQoQ3Rvcik7CiAgfQoKICAvLyBpZiBhdCB0aGlzIHN0YWdlIGl0J3Mgbm90IGEgY29uc3RydWN0b3Igb3IgYW4gYXN5bmMgY29tcG9uZW50IGZhY3RvcnksCiAgLy8gcmVqZWN0LgogIGlmICh0eXBlb2YgQ3RvciAhPT0gJ2Z1bmN0aW9uJykgewogICAgewogICAgICB3YXJuKCgiSW52YWxpZCBDb21wb25lbnQgZGVmaW5pdGlvbjogIiArIChTdHJpbmcoQ3RvcikpKSwgY29udGV4dCk7CiAgICB9CiAgICByZXR1cm4KICB9CgogIC8vIGFzeW5jIGNvbXBvbmVudAogIHZhciBhc3luY0ZhY3Rvcnk7CiAgaWYgKGlzVW5kZWYoQ3Rvci5jaWQpKSB7CiAgICBhc3luY0ZhY3RvcnkgPSBDdG9yOwogICAgQ3RvciA9IHJlc29sdmVBc3luY0NvbXBvbmVudChhc3luY0ZhY3RvcnksIGJhc2VDdG9yLCBjb250ZXh0KTsKICAgIGlmIChDdG9yID09PSB1bmRlZmluZWQpIHsKICAgICAgLy8gcmV0dXJuIGEgcGxhY2Vob2xkZXIgbm9kZSBmb3IgYXN5bmMgY29tcG9uZW50LCB3aGljaCBpcyByZW5kZXJlZAogICAgICAvLyBhcyBhIGNvbW1lbnQgbm9kZSBidXQgcHJlc2VydmVzIGFsbCB0aGUgcmF3IGluZm9ybWF0aW9uIGZvciB0aGUgbm9kZS4KICAgICAgLy8gdGhlIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBmb3IgYXN5bmMgc2VydmVyLXJlbmRlcmluZyBhbmQgaHlkcmF0aW9uLgogICAgICByZXR1cm4gY3JlYXRlQXN5bmNQbGFjZWhvbGRlcigKICAgICAgICBhc3luY0ZhY3RvcnksCiAgICAgICAgZGF0YSwKICAgICAgICBjb250ZXh0LAogICAgICAgIGNoaWxkcmVuLAogICAgICAgIHRhZwogICAgICApCiAgICB9CiAgfQoKICBkYXRhID0gZGF0YSB8fCB7fTsKCiAgLy8gcmVzb2x2ZSBjb25zdHJ1Y3RvciBvcHRpb25zIGluIGNhc2UgZ2xvYmFsIG1peGlucyBhcmUgYXBwbGllZCBhZnRlcgogIC8vIGNvbXBvbmVudCBjb25zdHJ1Y3RvciBjcmVhdGlvbgogIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvcik7CgogIC8vIHRyYW5zZm9ybSBjb21wb25lbnQgdi1tb2RlbCBkYXRhIGludG8gcHJvcHMgJiBldmVudHMKICBpZiAoaXNEZWYoZGF0YS5tb2RlbCkpIHsKICAgIHRyYW5zZm9ybU1vZGVsKEN0b3Iub3B0aW9ucywgZGF0YSk7CiAgfQoKICAvLyBleHRyYWN0IHByb3BzCiAgdmFyIHByb3BzRGF0YSA9IGV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgdGFnKTsKCiAgLy8gZnVuY3Rpb25hbCBjb21wb25lbnQKICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5mdW5jdGlvbmFsKSkgewogICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQoQ3RvciwgcHJvcHNEYXRhLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbikKICB9CgogIC8vIGV4dHJhY3QgbGlzdGVuZXJzLCBzaW5jZSB0aGVzZSBuZWVkcyB0byBiZSB0cmVhdGVkIGFzCiAgLy8gY2hpbGQgY29tcG9uZW50IGxpc3RlbmVycyBpbnN0ZWFkIG9mIERPTSBsaXN0ZW5lcnMKICB2YXIgbGlzdGVuZXJzID0gZGF0YS5vbjsKICAvLyByZXBsYWNlIHdpdGggbGlzdGVuZXJzIHdpdGggLm5hdGl2ZSBtb2RpZmllcgogIC8vIHNvIGl0IGdldHMgcHJvY2Vzc2VkIGR1cmluZyBwYXJlbnQgY29tcG9uZW50IHBhdGNoLgogIGRhdGEub24gPSBkYXRhLm5hdGl2ZU9uOwoKICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5hYnN0cmFjdCkpIHsKICAgIC8vIGFic3RyYWN0IGNvbXBvbmVudHMgZG8gbm90IGtlZXAgYW55dGhpbmcKICAgIC8vIG90aGVyIHRoYW4gcHJvcHMgJiBsaXN0ZW5lcnMgJiBzbG90CgogICAgLy8gd29yayBhcm91bmQgZmxvdwogICAgdmFyIHNsb3QgPSBkYXRhLnNsb3Q7CiAgICBkYXRhID0ge307CiAgICBpZiAoc2xvdCkgewogICAgICBkYXRhLnNsb3QgPSBzbG90OwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBjb21wb25lbnQgbWFuYWdlbWVudCBob29rcyBvbnRvIHRoZSBwbGFjZWhvbGRlciBub2RlCiAgaW5zdGFsbENvbXBvbmVudEhvb2tzKGRhdGEpOwoKICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciB2bm9kZQogIHZhciBuYW1lID0gQ3Rvci5vcHRpb25zLm5hbWUgfHwgdGFnOwogIHZhciB2bm9kZSA9IG5ldyBWTm9kZSgKICAgICgidnVlLWNvbXBvbmVudC0iICsgKEN0b3IuY2lkKSArIChuYW1lID8gKCItIiArIG5hbWUpIDogJycpKSwKICAgIGRhdGEsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHQsCiAgICB7IEN0b3I6IEN0b3IsIHByb3BzRGF0YTogcHJvcHNEYXRhLCBsaXN0ZW5lcnM6IGxpc3RlbmVycywgdGFnOiB0YWcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9LAogICAgYXN5bmNGYWN0b3J5CiAgKTsKCiAgLy8gV2VleCBzcGVjaWZpYzogaW52b2tlIHJlY3ljbGUtbGlzdCBvcHRpbWl6ZWQgQHJlbmRlciBmdW5jdGlvbiBmb3IKICAvLyBleHRyYWN0aW5nIGNlbGwtc2xvdCB0ZW1wbGF0ZS4KICAvLyBodHRwczovL2dpdGh1Yi5jb20vSGFua3MxMDEwMC93ZWV4LW5hdGl2ZS1kaXJlY3RpdmUvdHJlZS9tYXN0ZXIvY29tcG9uZW50CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgcmV0dXJuIHZub2RlCn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlRm9yVm5vZGUgKAogIHZub2RlLCAvLyB3ZSBrbm93IGl0J3MgTW91bnRlZENvbXBvbmVudFZOb2RlIGJ1dCBmbG93IGRvZXNuJ3QKICBwYXJlbnQsIC8vIGFjdGl2ZUluc3RhbmNlIGluIGxpZmVjeWNsZSBzdGF0ZQogIHBhcmVudEVsbSwKICByZWZFbG0KKSB7CiAgdmFyIG9wdGlvbnMgPSB7CiAgICBfaXNDb21wb25lbnQ6IHRydWUsCiAgICBwYXJlbnQ6IHBhcmVudCwKICAgIF9wYXJlbnRWbm9kZTogdm5vZGUsCiAgICBfcGFyZW50RWxtOiBwYXJlbnRFbG0gfHwgbnVsbCwKICAgIF9yZWZFbG06IHJlZkVsbSB8fCBudWxsCiAgfTsKICAvLyBjaGVjayBpbmxpbmUtdGVtcGxhdGUgcmVuZGVyIGZ1bmN0aW9ucwogIHZhciBpbmxpbmVUZW1wbGF0ZSA9IHZub2RlLmRhdGEuaW5saW5lVGVtcGxhdGU7CiAgaWYgKGlzRGVmKGlubGluZVRlbXBsYXRlKSkgewogICAgb3B0aW9ucy5yZW5kZXIgPSBpbmxpbmVUZW1wbGF0ZS5yZW5kZXI7CiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IGlubGluZVRlbXBsYXRlLnN0YXRpY1JlbmRlckZuczsKICB9CiAgcmV0dXJuIG5ldyB2bm9kZS5jb21wb25lbnRPcHRpb25zLkN0b3Iob3B0aW9ucykKfQoKZnVuY3Rpb24gaW5zdGFsbENvbXBvbmVudEhvb2tzIChkYXRhKSB7CiAgdmFyIGhvb2tzID0gZGF0YS5ob29rIHx8IChkYXRhLmhvb2sgPSB7fSk7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rc1RvTWVyZ2UubGVuZ3RoOyBpKyspIHsKICAgIHZhciBrZXkgPSBob29rc1RvTWVyZ2VbaV07CiAgICBob29rc1trZXldID0gY29tcG9uZW50Vk5vZGVIb29rc1trZXldOwogIH0KfQoKLy8gdHJhbnNmb3JtIGNvbXBvbmVudCB2LW1vZGVsIGluZm8gKHZhbHVlIGFuZCBjYWxsYmFjaykgaW50bwovLyBwcm9wIGFuZCBldmVudCBoYW5kbGVyIHJlc3BlY3RpdmVseS4KZnVuY3Rpb24gdHJhbnNmb3JtTW9kZWwgKG9wdGlvbnMsIGRhdGEpIHsKICB2YXIgcHJvcCA9IChvcHRpb25zLm1vZGVsICYmIG9wdGlvbnMubW9kZWwucHJvcCkgfHwgJ3ZhbHVlJzsKICB2YXIgZXZlbnQgPSAob3B0aW9ucy5tb2RlbCAmJiBvcHRpb25zLm1vZGVsLmV2ZW50KSB8fCAnaW5wdXQnOyhkYXRhLnByb3BzIHx8IChkYXRhLnByb3BzID0ge30pKVtwcm9wXSA9IGRhdGEubW9kZWwudmFsdWU7CiAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTsKICBpZiAoaXNEZWYob25bZXZlbnRdKSkgewogICAgb25bZXZlbnRdID0gW2RhdGEubW9kZWwuY2FsbGJhY2tdLmNvbmNhdChvbltldmVudF0pOwogIH0gZWxzZSB7CiAgICBvbltldmVudF0gPSBkYXRhLm1vZGVsLmNhbGxiYWNrOwogIH0KfQoKLyogICovCgp2YXIgU0lNUExFX05PUk1BTElaRSA9IDE7CnZhciBBTFdBWVNfTk9STUFMSVpFID0gMjsKCi8vIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHByb3ZpZGluZyBhIG1vcmUgZmxleGlibGUgaW50ZXJmYWNlCi8vIHdpdGhvdXQgZ2V0dGluZyB5ZWxsZWQgYXQgYnkgZmxvdwpmdW5jdGlvbiBjcmVhdGVFbGVtZW50ICgKICBjb250ZXh0LAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIG5vcm1hbGl6YXRpb25UeXBlLAogIGFsd2F5c05vcm1hbGl6ZQopIHsKICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSB8fCBpc1ByaW1pdGl2ZShkYXRhKSkgewogICAgbm9ybWFsaXphdGlvblR5cGUgPSBjaGlsZHJlbjsKICAgIGNoaWxkcmVuID0gZGF0YTsKICAgIGRhdGEgPSB1bmRlZmluZWQ7CiAgfQogIGlmIChpc1RydWUoYWx3YXlzTm9ybWFsaXplKSkgewogICAgbm9ybWFsaXphdGlvblR5cGUgPSBBTFdBWVNfTk9STUFMSVpFOwogIH0KICByZXR1cm4gX2NyZWF0ZUVsZW1lbnQoY29udGV4dCwgdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUpCn0KCmZ1bmN0aW9uIF9jcmVhdGVFbGVtZW50ICgKICBjb250ZXh0LAogIHRhZywKICBkYXRhLAogIGNoaWxkcmVuLAogIG5vcm1hbGl6YXRpb25UeXBlCikgewogIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZigoZGF0YSkuX19vYl9fKSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICJBdm9pZCB1c2luZyBvYnNlcnZlZCBkYXRhIG9iamVjdCBhcyB2bm9kZSBkYXRhOiAiICsgKEpTT04uc3RyaW5naWZ5KGRhdGEpKSArICJcbiIgKwogICAgICAnQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhJywKICAgICAgY29udGV4dAogICAgKTsKICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKCkKICB9CiAgLy8gb2JqZWN0IHN5bnRheCBpbiB2LWJpbmQKICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5pcykpIHsKICAgIHRhZyA9IGRhdGEuaXM7CiAgfQogIGlmICghdGFnKSB7CiAgICAvLyBpbiBjYXNlIG9mIGNvbXBvbmVudCA6aXMgc2V0IHRvIGZhbHN5IHZhbHVlCiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpCiAgfQogIC8vIHdhcm4gYWdhaW5zdCBub24tcHJpbWl0aXZlIGtleQogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgIGlzRGVmKGRhdGEpICYmIGlzRGVmKGRhdGEua2V5KSAmJiAhaXNQcmltaXRpdmUoZGF0YS5rZXkpCiAgKSB7CiAgICB7CiAgICAgIHdhcm4oCiAgICAgICAgJ0F2b2lkIHVzaW5nIG5vbi1wcmltaXRpdmUgdmFsdWUgYXMga2V5LCAnICsKICAgICAgICAndXNlIHN0cmluZy9udW1iZXIgdmFsdWUgaW5zdGVhZC4nLAogICAgICAgIGNvbnRleHQKICAgICAgKTsKICAgIH0KICB9CiAgLy8gc3VwcG9ydCBzaW5nbGUgZnVuY3Rpb24gY2hpbGRyZW4gYXMgZGVmYXVsdCBzY29wZWQgc2xvdAogIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJgogICAgdHlwZW9mIGNoaWxkcmVuWzBdID09PSAnZnVuY3Rpb24nCiAgKSB7CiAgICBkYXRhID0gZGF0YSB8fCB7fTsKICAgIGRhdGEuc2NvcGVkU2xvdHMgPSB7IGRlZmF1bHQ6IGNoaWxkcmVuWzBdIH07CiAgICBjaGlsZHJlbi5sZW5ndGggPSAwOwogIH0KICBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IEFMV0FZU19OT1JNQUxJWkUpIHsKICAgIGNoaWxkcmVuID0gbm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pOwogIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IFNJTVBMRV9OT1JNQUxJWkUpIHsKICAgIGNoaWxkcmVuID0gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4oY2hpbGRyZW4pOwogIH0KICB2YXIgdm5vZGUsIG5zOwogIGlmICh0eXBlb2YgdGFnID09PSAnc3RyaW5nJykgewogICAgdmFyIEN0b3I7CiAgICBucyA9IChjb250ZXh0LiR2bm9kZSAmJiBjb250ZXh0LiR2bm9kZS5ucykgfHwgY29uZmlnLmdldFRhZ05hbWVzcGFjZSh0YWcpOwogICAgaWYgKGNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHsKICAgICAgLy8gcGxhdGZvcm0gYnVpbHQtaW4gZWxlbWVudHMKICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoCiAgICAgICAgY29uZmlnLnBhcnNlUGxhdGZvcm1UYWdOYW1lKHRhZyksIGRhdGEsIGNoaWxkcmVuLAogICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjb250ZXh0CiAgICAgICk7CiAgICB9IGVsc2UgaWYgKGlzRGVmKEN0b3IgPSByZXNvbHZlQXNzZXQoY29udGV4dC4kb3B0aW9ucywgJ2NvbXBvbmVudHMnLCB0YWcpKSkgewogICAgICAvLyBjb21wb25lbnQKICAgICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQoQ3RvciwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4sIHRhZyk7CiAgICB9IGVsc2UgewogICAgICAvLyB1bmtub3duIG9yIHVubGlzdGVkIG5hbWVzcGFjZWQgZWxlbWVudHMKICAgICAgLy8gY2hlY2sgYXQgcnVudGltZSBiZWNhdXNlIGl0IG1heSBnZXQgYXNzaWduZWQgYSBuYW1lc3BhY2Ugd2hlbiBpdHMKICAgICAgLy8gcGFyZW50IG5vcm1hbGl6ZXMgY2hpbGRyZW4KICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoCiAgICAgICAgdGFnLCBkYXRhLCBjaGlsZHJlbiwKICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dAogICAgICApOwogICAgfQogIH0gZWxzZSB7CiAgICAvLyBkaXJlY3QgY29tcG9uZW50IG9wdGlvbnMgLyBjb25zdHJ1Y3RvcgogICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQodGFnLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbik7CiAgfQogIGlmIChBcnJheS5pc0FycmF5KHZub2RlKSkgewogICAgcmV0dXJuIHZub2RlCiAgfSBlbHNlIGlmIChpc0RlZih2bm9kZSkpIHsKICAgIGlmIChpc0RlZihucykpIHsgYXBwbHlOUyh2bm9kZSwgbnMpOyB9CiAgICBpZiAoaXNEZWYoZGF0YSkpIHsgcmVnaXN0ZXJEZWVwQmluZGluZ3MoZGF0YSk7IH0KICAgIHJldHVybiB2bm9kZQogIH0gZWxzZSB7CiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpCiAgfQp9CgpmdW5jdGlvbiBhcHBseU5TICh2bm9kZSwgbnMsIGZvcmNlKSB7CiAgdm5vZGUubnMgPSBuczsKICBpZiAodm5vZGUudGFnID09PSAnZm9yZWlnbk9iamVjdCcpIHsKICAgIC8vIHVzZSBkZWZhdWx0IG5hbWVzcGFjZSBpbnNpZGUgZm9yZWlnbk9iamVjdAogICAgbnMgPSB1bmRlZmluZWQ7CiAgICBmb3JjZSA9IHRydWU7CiAgfQogIGlmIChpc0RlZih2bm9kZS5jaGlsZHJlbikpIHsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNoaWxkcmVuW2ldOwogICAgICBpZiAoaXNEZWYoY2hpbGQudGFnKSAmJiAoCiAgICAgICAgaXNVbmRlZihjaGlsZC5ucykgfHwgKGlzVHJ1ZShmb3JjZSkgJiYgY2hpbGQudGFnICE9PSAnc3ZnJykpKSB7CiAgICAgICAgYXBwbHlOUyhjaGlsZCwgbnMsIGZvcmNlKTsKICAgICAgfQogICAgfQogIH0KfQoKLy8gcmVmICM1MzE4Ci8vIG5lY2Vzc2FyeSB0byBlbnN1cmUgcGFyZW50IHJlLXJlbmRlciB3aGVuIGRlZXAgYmluZGluZ3MgbGlrZSA6c3R5bGUgYW5kCi8vIDpjbGFzcyBhcmUgdXNlZCBvbiBzbG90IG5vZGVzCmZ1bmN0aW9uIHJlZ2lzdGVyRGVlcEJpbmRpbmdzIChkYXRhKSB7CiAgaWYgKGlzT2JqZWN0KGRhdGEuc3R5bGUpKSB7CiAgICB0cmF2ZXJzZShkYXRhLnN0eWxlKTsKICB9CiAgaWYgKGlzT2JqZWN0KGRhdGEuY2xhc3MpKSB7CiAgICB0cmF2ZXJzZShkYXRhLmNsYXNzKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdFJlbmRlciAodm0pIHsKICB2bS5fdm5vZGUgPSBudWxsOyAvLyB0aGUgcm9vdCBvZiB0aGUgY2hpbGQgdHJlZQogIHZtLl9zdGF0aWNUcmVlcyA9IG51bGw7IC8vIHYtb25jZSBjYWNoZWQgdHJlZXMKICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zOwogIHZhciBwYXJlbnRWbm9kZSA9IHZtLiR2bm9kZSA9IG9wdGlvbnMuX3BhcmVudFZub2RlOyAvLyB0aGUgcGxhY2Vob2xkZXIgbm9kZSBpbiBwYXJlbnQgdHJlZQogIHZhciByZW5kZXJDb250ZXh0ID0gcGFyZW50Vm5vZGUgJiYgcGFyZW50Vm5vZGUuY29udGV4dDsKICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpOwogIHZtLiRzY29wZWRTbG90cyA9IGVtcHR5T2JqZWN0OwogIC8vIGJpbmQgdGhlIGNyZWF0ZUVsZW1lbnQgZm4gdG8gdGhpcyBpbnN0YW5jZQogIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuCiAgLy8gYXJncyBvcmRlcjogdGFnLCBkYXRhLCBjaGlsZHJlbiwgbm9ybWFsaXphdGlvblR5cGUsIGFsd2F5c05vcm1hbGl6ZQogIC8vIGludGVybmFsIHZlcnNpb24gaXMgdXNlZCBieSByZW5kZXIgZnVuY3Rpb25zIGNvbXBpbGVkIGZyb20gdGVtcGxhdGVzCiAgdm0uX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgZmFsc2UpOyB9OwogIC8vIG5vcm1hbGl6YXRpb24gaXMgYWx3YXlzIGFwcGxpZWQgZm9yIHRoZSBwdWJsaWMgdmVyc2lvbiwgdXNlZCBpbgogIC8vIHVzZXItd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zLgogIHZtLiRjcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpOyB9OwoKICAvLyAkYXR0cnMgJiAkbGlzdGVuZXJzIGFyZSBleHBvc2VkIGZvciBlYXNpZXIgSE9DIGNyZWF0aW9uLgogIC8vIHRoZXkgbmVlZCB0byBiZSByZWFjdGl2ZSBzbyB0aGF0IEhPQ3MgdXNpbmcgdGhlbSBhcmUgYWx3YXlzIHVwZGF0ZWQKICB2YXIgcGFyZW50RGF0YSA9IHBhcmVudFZub2RlICYmIHBhcmVudFZub2RlLmRhdGE7CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgewogICAgZGVmaW5lUmVhY3RpdmUodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHsKICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKCIkYXR0cnMgaXMgcmVhZG9ubHkuIiwgdm0pOwogICAgfSwgdHJ1ZSk7CiAgICBkZWZpbmVSZWFjdGl2ZSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHsKICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKCIkbGlzdGVuZXJzIGlzIHJlYWRvbmx5LiIsIHZtKTsKICAgIH0sIHRydWUpOwogIH0KfQoKZnVuY3Rpb24gcmVuZGVyTWl4aW4gKFZ1ZSkgewogIC8vIGluc3RhbGwgcnVudGltZSBjb252ZW5pZW5jZSBoZWxwZXJzCiAgaW5zdGFsbFJlbmRlckhlbHBlcnMoVnVlLnByb3RvdHlwZSk7CgogIFZ1ZS5wcm90b3R5cGUuJG5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7CiAgICByZXR1cm4gbmV4dFRpY2soZm4sIHRoaXMpCiAgfTsKCiAgVnVlLnByb3RvdHlwZS5fcmVuZGVyID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHZtID0gdGhpczsKICAgIHZhciByZWYgPSB2bS4kb3B0aW9uczsKICAgIHZhciByZW5kZXIgPSByZWYucmVuZGVyOwogICAgdmFyIF9wYXJlbnRWbm9kZSA9IHJlZi5fcGFyZW50Vm5vZGU7CgogICAgLy8gcmVzZXQgX3JlbmRlcmVkIGZsYWcgb24gc2xvdHMgZm9yIGR1cGxpY2F0ZSBzbG90IGNoZWNrCiAgICB7CiAgICAgIGZvciAodmFyIGtleSBpbiB2bS4kc2xvdHMpIHsKICAgICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgICAgICB2bS4kc2xvdHNba2V5XS5fcmVuZGVyZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGlmIChfcGFyZW50Vm5vZGUpIHsKICAgICAgdm0uJHNjb3BlZFNsb3RzID0gX3BhcmVudFZub2RlLmRhdGEuc2NvcGVkU2xvdHMgfHwgZW1wdHlPYmplY3Q7CiAgICB9CgogICAgLy8gc2V0IHBhcmVudCB2bm9kZS4gdGhpcyBhbGxvd3MgcmVuZGVyIGZ1bmN0aW9ucyB0byBoYXZlIGFjY2VzcwogICAgLy8gdG8gdGhlIGRhdGEgb24gdGhlIHBsYWNlaG9sZGVyIG5vZGUuCiAgICB2bS4kdm5vZGUgPSBfcGFyZW50Vm5vZGU7CiAgICAvLyByZW5kZXIgc2VsZgogICAgdmFyIHZub2RlOwogICAgdHJ5IHsKICAgICAgdm5vZGUgPSByZW5kZXIuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50KTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICJyZW5kZXIiKTsKICAgICAgLy8gcmV0dXJuIGVycm9yIHJlbmRlciByZXN1bHQsCiAgICAgIC8vIG9yIHByZXZpb3VzIHZub2RlIHRvIHByZXZlbnQgcmVuZGVyIGVycm9yIGNhdXNpbmcgYmxhbmsgY29tcG9uZW50CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgICAgIHsKICAgICAgICBpZiAodm0uJG9wdGlvbnMucmVuZGVyRXJyb3IpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3IuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50LCBlKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sICJyZW5kZXJFcnJvciIpOwogICAgICAgICAgICB2bm9kZSA9IHZtLl92bm9kZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdm5vZGUgPSB2bS5fdm5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyByZXR1cm4gZW1wdHkgdm5vZGUgaW4gY2FzZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGVycm9yZWQgb3V0CiAgICBpZiAoISh2bm9kZSBpbnN0YW5jZW9mIFZOb2RlKSkgewogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIEFycmF5LmlzQXJyYXkodm5vZGUpKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICdNdWx0aXBsZSByb290IG5vZGVzIHJldHVybmVkIGZyb20gcmVuZGVyIGZ1bmN0aW9uLiBSZW5kZXIgZnVuY3Rpb24gJyArCiAgICAgICAgICAnc2hvdWxkIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUuJywKICAgICAgICAgIHZtCiAgICAgICAgKTsKICAgICAgfQogICAgICB2bm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTsKICAgIH0KICAgIC8vIHNldCBwYXJlbnQKICAgIHZub2RlLnBhcmVudCA9IF9wYXJlbnRWbm9kZTsKICAgIHJldHVybiB2bm9kZQogIH07Cn0KCi8qICAqLwoKdmFyIHVpZCQzID0gMDsKCmZ1bmN0aW9uIGluaXRNaXhpbiAoVnVlKSB7CiAgVnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICB2YXIgdm0gPSB0aGlzOwogICAgLy8gYSB1aWQKICAgIHZtLl91aWQgPSB1aWQkMysrOwoKICAgIHZhciBzdGFydFRhZywgZW5kVGFnOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7CiAgICAgIHN0YXJ0VGFnID0gInZ1ZS1wZXJmLXN0YXJ0OiIgKyAodm0uX3VpZCk7CiAgICAgIGVuZFRhZyA9ICJ2dWUtcGVyZi1lbmQ6IiArICh2bS5fdWlkKTsKICAgICAgbWFyayhzdGFydFRhZyk7CiAgICB9CgogICAgLy8gYSBmbGFnIHRvIGF2b2lkIHRoaXMgYmVpbmcgb2JzZXJ2ZWQKICAgIHZtLl9pc1Z1ZSA9IHRydWU7CiAgICAvLyBtZXJnZSBvcHRpb25zCiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLl9pc0NvbXBvbmVudCkgewogICAgICAvLyBvcHRpbWl6ZSBpbnRlcm5hbCBjb21wb25lbnQgaW5zdGFudGlhdGlvbgogICAgICAvLyBzaW5jZSBkeW5hbWljIG9wdGlvbnMgbWVyZ2luZyBpcyBwcmV0dHkgc2xvdywgYW5kIG5vbmUgb2YgdGhlCiAgICAgIC8vIGludGVybmFsIGNvbXBvbmVudCBvcHRpb25zIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LgogICAgICBpbml0SW50ZXJuYWxDb21wb25lbnQodm0sIG9wdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgdm0uJG9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoCiAgICAgICAgcmVzb2x2ZUNvbnN0cnVjdG9yT3B0aW9ucyh2bS5jb25zdHJ1Y3RvciksCiAgICAgICAgb3B0aW9ucyB8fCB7fSwKICAgICAgICB2bQogICAgICApOwogICAgfQogICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgIHsKICAgICAgaW5pdFByb3h5KHZtKTsKICAgIH0KICAgIC8vIGV4cG9zZSByZWFsIHNlbGYKICAgIHZtLl9zZWxmID0gdm07CiAgICBpbml0TGlmZWN5Y2xlKHZtKTsKICAgIGluaXRFdmVudHModm0pOwogICAgaW5pdFJlbmRlcih2bSk7CiAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZUNyZWF0ZScpOwogICAgaW5pdEluamVjdGlvbnModm0pOyAvLyByZXNvbHZlIGluamVjdGlvbnMgYmVmb3JlIGRhdGEvcHJvcHMKICAgIGluaXRTdGF0ZSh2bSk7CiAgICBpbml0UHJvdmlkZSh2bSk7IC8vIHJlc29sdmUgcHJvdmlkZSBhZnRlciBkYXRhL3Byb3BzCiAgICBjYWxsSG9vayh2bSwgJ2NyZWF0ZWQnKTsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHsKICAgICAgdm0uX25hbWUgPSBmb3JtYXRDb21wb25lbnROYW1lKHZtLCBmYWxzZSk7CiAgICAgIG1hcmsoZW5kVGFnKTsKICAgICAgbWVhc3VyZSgoInZ1ZSAiICsgKHZtLl9uYW1lKSArICIgaW5pdCIpLCBzdGFydFRhZywgZW5kVGFnKTsKICAgIH0KCiAgICBpZiAodm0uJG9wdGlvbnMuZWwpIHsKICAgICAgdm0uJG1vdW50KHZtLiRvcHRpb25zLmVsKTsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBpbml0SW50ZXJuYWxDb21wb25lbnQgKHZtLCBvcHRpb25zKSB7CiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUodm0uY29uc3RydWN0b3Iub3B0aW9ucyk7CiAgLy8gZG9pbmcgdGhpcyBiZWNhdXNlIGl0J3MgZmFzdGVyIHRoYW4gZHluYW1pYyBlbnVtZXJhdGlvbi4KICB2YXIgcGFyZW50Vm5vZGUgPSBvcHRpb25zLl9wYXJlbnRWbm9kZTsKICBvcHRzLnBhcmVudCA9IG9wdGlvbnMucGFyZW50OwogIG9wdHMuX3BhcmVudFZub2RlID0gcGFyZW50Vm5vZGU7CiAgb3B0cy5fcGFyZW50RWxtID0gb3B0aW9ucy5fcGFyZW50RWxtOwogIG9wdHMuX3JlZkVsbSA9IG9wdGlvbnMuX3JlZkVsbTsKCiAgdmFyIHZub2RlQ29tcG9uZW50T3B0aW9ucyA9IHBhcmVudFZub2RlLmNvbXBvbmVudE9wdGlvbnM7CiAgb3B0cy5wcm9wc0RhdGEgPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMucHJvcHNEYXRhOwogIG9wdHMuX3BhcmVudExpc3RlbmVycyA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnM7CiAgb3B0cy5fcmVuZGVyQ2hpbGRyZW4gPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMuY2hpbGRyZW47CiAgb3B0cy5fY29tcG9uZW50VGFnID0gdm5vZGVDb21wb25lbnRPcHRpb25zLnRhZzsKCiAgaWYgKG9wdGlvbnMucmVuZGVyKSB7CiAgICBvcHRzLnJlbmRlciA9IG9wdGlvbnMucmVuZGVyOwogICAgb3B0cy5zdGF0aWNSZW5kZXJGbnMgPSBvcHRpb25zLnN0YXRpY1JlbmRlckZuczsKICB9Cn0KCmZ1bmN0aW9uIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMgKEN0b3IpIHsKICB2YXIgb3B0aW9ucyA9IEN0b3Iub3B0aW9uczsKICBpZiAoQ3Rvci5zdXBlcikgewogICAgdmFyIHN1cGVyT3B0aW9ucyA9IHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvci5zdXBlcik7CiAgICB2YXIgY2FjaGVkU3VwZXJPcHRpb25zID0gQ3Rvci5zdXBlck9wdGlvbnM7CiAgICBpZiAoc3VwZXJPcHRpb25zICE9PSBjYWNoZWRTdXBlck9wdGlvbnMpIHsKICAgICAgLy8gc3VwZXIgb3B0aW9uIGNoYW5nZWQsCiAgICAgIC8vIG5lZWQgdG8gcmVzb2x2ZSBuZXcgb3B0aW9ucy4KICAgICAgQ3Rvci5zdXBlck9wdGlvbnMgPSBzdXBlck9wdGlvbnM7CiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbGF0ZS1tb2RpZmllZC9hdHRhY2hlZCBvcHRpb25zICgjNDk3NikKICAgICAgdmFyIG1vZGlmaWVkT3B0aW9ucyA9IHJlc29sdmVNb2RpZmllZE9wdGlvbnMoQ3Rvcik7CiAgICAgIC8vIHVwZGF0ZSBiYXNlIGV4dGVuZCBvcHRpb25zCiAgICAgIGlmIChtb2RpZmllZE9wdGlvbnMpIHsKICAgICAgICBleHRlbmQoQ3Rvci5leHRlbmRPcHRpb25zLCBtb2RpZmllZE9wdGlvbnMpOwogICAgICB9CiAgICAgIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoc3VwZXJPcHRpb25zLCBDdG9yLmV4dGVuZE9wdGlvbnMpOwogICAgICBpZiAob3B0aW9ucy5uYW1lKSB7CiAgICAgICAgb3B0aW9ucy5jb21wb25lbnRzW29wdGlvbnMubmFtZV0gPSBDdG9yOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBvcHRpb25zCn0KCmZ1bmN0aW9uIHJlc29sdmVNb2RpZmllZE9wdGlvbnMgKEN0b3IpIHsKICB2YXIgbW9kaWZpZWQ7CiAgdmFyIGxhdGVzdCA9IEN0b3Iub3B0aW9uczsKICB2YXIgZXh0ZW5kZWQgPSBDdG9yLmV4dGVuZE9wdGlvbnM7CiAgdmFyIHNlYWxlZCA9IEN0b3Iuc2VhbGVkT3B0aW9uczsKICBmb3IgKHZhciBrZXkgaW4gbGF0ZXN0KSB7CiAgICBpZiAobGF0ZXN0W2tleV0gIT09IHNlYWxlZFtrZXldKSB7CiAgICAgIGlmICghbW9kaWZpZWQpIHsgbW9kaWZpZWQgPSB7fTsgfQogICAgICBtb2RpZmllZFtrZXldID0gZGVkdXBlKGxhdGVzdFtrZXldLCBleHRlbmRlZFtrZXldLCBzZWFsZWRba2V5XSk7CiAgICB9CiAgfQogIHJldHVybiBtb2RpZmllZAp9CgpmdW5jdGlvbiBkZWR1cGUgKGxhdGVzdCwgZXh0ZW5kZWQsIHNlYWxlZCkgewogIC8vIGNvbXBhcmUgbGF0ZXN0IGFuZCBzZWFsZWQgdG8gZW5zdXJlIGxpZmVjeWNsZSBob29rcyB3b24ndCBiZSBkdXBsaWNhdGVkCiAgLy8gYmV0d2VlbiBtZXJnZXMKICBpZiAoQXJyYXkuaXNBcnJheShsYXRlc3QpKSB7CiAgICB2YXIgcmVzID0gW107CiAgICBzZWFsZWQgPSBBcnJheS5pc0FycmF5KHNlYWxlZCkgPyBzZWFsZWQgOiBbc2VhbGVkXTsKICAgIGV4dGVuZGVkID0gQXJyYXkuaXNBcnJheShleHRlbmRlZCkgPyBleHRlbmRlZCA6IFtleHRlbmRlZF07CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhdGVzdC5sZW5ndGg7IGkrKykgewogICAgICAvLyBwdXNoIG9yaWdpbmFsIG9wdGlvbnMgYW5kIG5vdCBzZWFsZWQgb3B0aW9ucyB0byBleGNsdWRlIGR1cGxpY2F0ZWQgb3B0aW9ucwogICAgICBpZiAoZXh0ZW5kZWQuaW5kZXhPZihsYXRlc3RbaV0pID49IDAgfHwgc2VhbGVkLmluZGV4T2YobGF0ZXN0W2ldKSA8IDApIHsKICAgICAgICByZXMucHVzaChsYXRlc3RbaV0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzCiAgfSBlbHNlIHsKICAgIHJldHVybiBsYXRlc3QKICB9Cn0KCmZ1bmN0aW9uIFZ1ZSAob3B0aW9ucykgewogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICEodGhpcyBpbnN0YW5jZW9mIFZ1ZSkKICApIHsKICAgIHdhcm4oJ1Z1ZSBpcyBhIGNvbnN0cnVjdG9yIGFuZCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGBuZXdgIGtleXdvcmQnKTsKICB9CiAgdGhpcy5faW5pdChvcHRpb25zKTsKfQoKaW5pdE1peGluKFZ1ZSk7CnN0YXRlTWl4aW4oVnVlKTsKZXZlbnRzTWl4aW4oVnVlKTsKbGlmZWN5Y2xlTWl4aW4oVnVlKTsKcmVuZGVyTWl4aW4oVnVlKTsKCi8qICAqLwoKZnVuY3Rpb24gaW5pdFVzZSAoVnVlKSB7CiAgVnVlLnVzZSA9IGZ1bmN0aW9uIChwbHVnaW4pIHsKICAgIHZhciBpbnN0YWxsZWRQbHVnaW5zID0gKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgfHwgKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgPSBbXSkpOwogICAgaWYgKGluc3RhbGxlZFBsdWdpbnMuaW5kZXhPZihwbHVnaW4pID4gLTEpIHsKICAgICAgcmV0dXJuIHRoaXMKICAgIH0KCiAgICAvLyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpOwogICAgYXJncy51bnNoaWZ0KHRoaXMpOwogICAgaWYgKHR5cGVvZiBwbHVnaW4uaW5zdGFsbCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBwbHVnaW4uaW5zdGFsbC5hcHBseShwbHVnaW4sIGFyZ3MpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgcGx1Z2luID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHBsdWdpbi5hcHBseShudWxsLCBhcmdzKTsKICAgIH0KICAgIGluc3RhbGxlZFBsdWdpbnMucHVzaChwbHVnaW4pOwogICAgcmV0dXJuIHRoaXMKICB9Owp9CgovKiAgKi8KCmZ1bmN0aW9uIGluaXRNaXhpbiQxIChWdWUpIHsKICBWdWUubWl4aW4gPSBmdW5jdGlvbiAobWl4aW4pIHsKICAgIHRoaXMub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsIG1peGluKTsKICAgIHJldHVybiB0aGlzCiAgfTsKfQoKLyogICovCgpmdW5jdGlvbiBpbml0RXh0ZW5kIChWdWUpIHsKICAvKioKICAgKiBFYWNoIGluc3RhbmNlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgVnVlLCBoYXMgYSB1bmlxdWUKICAgKiBjaWQuIFRoaXMgZW5hYmxlcyB1cyB0byBjcmVhdGUgd3JhcHBlZCAiY2hpbGQKICAgKiBjb25zdHJ1Y3RvcnMiIGZvciBwcm90b3R5cGFsIGluaGVyaXRhbmNlIGFuZCBjYWNoZSB0aGVtLgogICAqLwogIFZ1ZS5jaWQgPSAwOwogIHZhciBjaWQgPSAxOwoKICAvKioKICAgKiBDbGFzcyBpbmhlcml0YW5jZQogICAqLwogIFZ1ZS5leHRlbmQgPSBmdW5jdGlvbiAoZXh0ZW5kT3B0aW9ucykgewogICAgZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnMgfHwge307CiAgICB2YXIgU3VwZXIgPSB0aGlzOwogICAgdmFyIFN1cGVySWQgPSBTdXBlci5jaWQ7CiAgICB2YXIgY2FjaGVkQ3RvcnMgPSBleHRlbmRPcHRpb25zLl9DdG9yIHx8IChleHRlbmRPcHRpb25zLl9DdG9yID0ge30pOwogICAgaWYgKGNhY2hlZEN0b3JzW1N1cGVySWRdKSB7CiAgICAgIHJldHVybiBjYWNoZWRDdG9yc1tTdXBlcklkXQogICAgfQoKICAgIHZhciBuYW1lID0gZXh0ZW5kT3B0aW9ucy5uYW1lIHx8IFN1cGVyLm9wdGlvbnMubmFtZTsKICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSkgewogICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSk7CiAgICB9CgogICAgdmFyIFN1YiA9IGZ1bmN0aW9uIFZ1ZUNvbXBvbmVudCAob3B0aW9ucykgewogICAgICB0aGlzLl9pbml0KG9wdGlvbnMpOwogICAgfTsKICAgIFN1Yi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN1cGVyLnByb3RvdHlwZSk7CiAgICBTdWIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViOwogICAgU3ViLmNpZCA9IGNpZCsrOwogICAgU3ViLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoCiAgICAgIFN1cGVyLm9wdGlvbnMsCiAgICAgIGV4dGVuZE9wdGlvbnMKICAgICk7CiAgICBTdWJbJ3N1cGVyJ10gPSBTdXBlcjsKCiAgICAvLyBGb3IgcHJvcHMgYW5kIGNvbXB1dGVkIHByb3BlcnRpZXMsIHdlIGRlZmluZSB0aGUgcHJveHkgZ2V0dGVycyBvbgogICAgLy8gdGhlIFZ1ZSBpbnN0YW5jZXMgYXQgZXh0ZW5zaW9uIHRpbWUsIG9uIHRoZSBleHRlbmRlZCBwcm90b3R5cGUuIFRoaXMKICAgIC8vIGF2b2lkcyBPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbHMgZm9yIGVhY2ggaW5zdGFuY2UgY3JlYXRlZC4KICAgIGlmIChTdWIub3B0aW9ucy5wcm9wcykgewogICAgICBpbml0UHJvcHMkMShTdWIpOwogICAgfQogICAgaWYgKFN1Yi5vcHRpb25zLmNvbXB1dGVkKSB7CiAgICAgIGluaXRDb21wdXRlZCQxKFN1Yik7CiAgICB9CgogICAgLy8gYWxsb3cgZnVydGhlciBleHRlbnNpb24vbWl4aW4vcGx1Z2luIHVzYWdlCiAgICBTdWIuZXh0ZW5kID0gU3VwZXIuZXh0ZW5kOwogICAgU3ViLm1peGluID0gU3VwZXIubWl4aW47CiAgICBTdWIudXNlID0gU3VwZXIudXNlOwoKICAgIC8vIGNyZWF0ZSBhc3NldCByZWdpc3RlcnMsIHNvIGV4dGVuZGVkIGNsYXNzZXMKICAgIC8vIGNhbiBoYXZlIHRoZWlyIHByaXZhdGUgYXNzZXRzIHRvby4KICAgIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICAgICAgU3ViW3R5cGVdID0gU3VwZXJbdHlwZV07CiAgICB9KTsKICAgIC8vIGVuYWJsZSByZWN1cnNpdmUgc2VsZi1sb29rdXAKICAgIGlmIChuYW1lKSB7CiAgICAgIFN1Yi5vcHRpb25zLmNvbXBvbmVudHNbbmFtZV0gPSBTdWI7CiAgICB9CgogICAgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgc3VwZXIgb3B0aW9ucyBhdCBleHRlbnNpb24gdGltZS4KICAgIC8vIGxhdGVyIGF0IGluc3RhbnRpYXRpb24gd2UgY2FuIGNoZWNrIGlmIFN1cGVyJ3Mgb3B0aW9ucyBoYXZlCiAgICAvLyBiZWVuIHVwZGF0ZWQuCiAgICBTdWIuc3VwZXJPcHRpb25zID0gU3VwZXIub3B0aW9uczsKICAgIFN1Yi5leHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9uczsKICAgIFN1Yi5zZWFsZWRPcHRpb25zID0gZXh0ZW5kKHt9LCBTdWIub3B0aW9ucyk7CgogICAgLy8gY2FjaGUgY29uc3RydWN0b3IKICAgIGNhY2hlZEN0b3JzW1N1cGVySWRdID0gU3ViOwogICAgcmV0dXJuIFN1YgogIH07Cn0KCmZ1bmN0aW9uIGluaXRQcm9wcyQxIChDb21wKSB7CiAgdmFyIHByb3BzID0gQ29tcC5vcHRpb25zLnByb3BzOwogIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgcHJveHkoQ29tcC5wcm90b3R5cGUsICJfcHJvcHMiLCBrZXkpOwogIH0KfQoKZnVuY3Rpb24gaW5pdENvbXB1dGVkJDEgKENvbXApIHsKICB2YXIgY29tcHV0ZWQgPSBDb21wLm9wdGlvbnMuY29tcHV0ZWQ7CiAgZm9yICh2YXIga2V5IGluIGNvbXB1dGVkKSB7CiAgICBkZWZpbmVDb21wdXRlZChDb21wLnByb3RvdHlwZSwga2V5LCBjb21wdXRlZFtrZXldKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdEFzc2V0UmVnaXN0ZXJzIChWdWUpIHsKICAvKioKICAgKiBDcmVhdGUgYXNzZXQgcmVnaXN0cmF0aW9uIG1ldGhvZHMuCiAgICovCiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogICAgVnVlW3R5cGVdID0gZnVuY3Rpb24gKAogICAgICBpZCwKICAgICAgZGVmaW5pdGlvbgogICAgKSB7CiAgICAgIGlmICghZGVmaW5pdGlvbikgewogICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdCiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlID09PSAnY29tcG9uZW50JykgewogICAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGlkKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGUgPT09ICdjb21wb25lbnQnICYmIGlzUGxhaW5PYmplY3QoZGVmaW5pdGlvbikpIHsKICAgICAgICAgIGRlZmluaXRpb24ubmFtZSA9IGRlZmluaXRpb24ubmFtZSB8fCBpZDsKICAgICAgICAgIGRlZmluaXRpb24gPSB0aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKGRlZmluaXRpb24pOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSA9PT0gJ2RpcmVjdGl2ZScgJiYgdHlwZW9mIGRlZmluaXRpb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGRlZmluaXRpb24gPSB7IGJpbmQ6IGRlZmluaXRpb24sIHVwZGF0ZTogZGVmaW5pdGlvbiB9OwogICAgICAgIH0KICAgICAgICB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdID0gZGVmaW5pdGlvbjsKICAgICAgICByZXR1cm4gZGVmaW5pdGlvbgogICAgICB9CiAgICB9OwogIH0pOwp9CgovKiAgKi8KCmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUgKG9wdHMpIHsKICByZXR1cm4gb3B0cyAmJiAob3B0cy5DdG9yLm9wdGlvbnMubmFtZSB8fCBvcHRzLnRhZykKfQoKZnVuY3Rpb24gbWF0Y2hlcyAocGF0dGVybiwgbmFtZSkgewogIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7CiAgICByZXR1cm4gcGF0dGVybi5pbmRleE9mKG5hbWUpID4gLTEKICB9IGVsc2UgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykgewogICAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoJywnKS5pbmRleE9mKG5hbWUpID4gLTEKICB9IGVsc2UgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7CiAgICByZXR1cm4gcGF0dGVybi50ZXN0KG5hbWUpCiAgfQogIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgcmV0dXJuIGZhbHNlCn0KCmZ1bmN0aW9uIHBydW5lQ2FjaGUgKGtlZXBBbGl2ZUluc3RhbmNlLCBmaWx0ZXIpIHsKICB2YXIgY2FjaGUgPSBrZWVwQWxpdmVJbnN0YW5jZS5jYWNoZTsKICB2YXIga2V5cyA9IGtlZXBBbGl2ZUluc3RhbmNlLmtleXM7CiAgdmFyIF92bm9kZSA9IGtlZXBBbGl2ZUluc3RhbmNlLl92bm9kZTsKICBmb3IgKHZhciBrZXkgaW4gY2FjaGUpIHsKICAgIHZhciBjYWNoZWROb2RlID0gY2FjaGVba2V5XTsKICAgIGlmIChjYWNoZWROb2RlKSB7CiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjYWNoZWROb2RlLmNvbXBvbmVudE9wdGlvbnMpOwogICAgICBpZiAobmFtZSAmJiAhZmlsdGVyKG5hbWUpKSB7CiAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGNhY2hlLCBrZXksIGtleXMsIF92bm9kZSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHBydW5lQ2FjaGVFbnRyeSAoCiAgY2FjaGUsCiAga2V5LAogIGtleXMsCiAgY3VycmVudAopIHsKICB2YXIgY2FjaGVkJCQxID0gY2FjaGVba2V5XTsKICBpZiAoY2FjaGVkJCQxICYmICghY3VycmVudCB8fCBjYWNoZWQkJDEudGFnICE9PSBjdXJyZW50LnRhZykpIHsKICAgIGNhY2hlZCQkMS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpOwogIH0KICBjYWNoZVtrZXldID0gbnVsbDsKICByZW1vdmUoa2V5cywga2V5KTsKfQoKdmFyIHBhdHRlcm5UeXBlcyA9IFtTdHJpbmcsIFJlZ0V4cCwgQXJyYXldOwoKdmFyIEtlZXBBbGl2ZSA9IHsKICBuYW1lOiAna2VlcC1hbGl2ZScsCiAgYWJzdHJhY3Q6IHRydWUsCgogIHByb3BzOiB7CiAgICBpbmNsdWRlOiBwYXR0ZXJuVHlwZXMsCiAgICBleGNsdWRlOiBwYXR0ZXJuVHlwZXMsCiAgICBtYXg6IFtTdHJpbmcsIE51bWJlcl0KICB9LAoKICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkICgpIHsKICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5rZXlzID0gW107CiAgfSwKCiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQgKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgZm9yICh2YXIga2V5IGluIHRoaXMkMS5jYWNoZSkgewogICAgICBwcnVuZUNhY2hlRW50cnkodGhpcyQxLmNhY2hlLCBrZXksIHRoaXMkMS5rZXlzKTsKICAgIH0KICB9LAoKICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkICgpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICAgIHRoaXMuJHdhdGNoKCdpbmNsdWRlJywgZnVuY3Rpb24gKHZhbCkgewogICAgICBwcnVuZUNhY2hlKHRoaXMkMSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIG1hdGNoZXModmFsLCBuYW1lKTsgfSk7CiAgICB9KTsKICAgIHRoaXMuJHdhdGNoKCdleGNsdWRlJywgZnVuY3Rpb24gKHZhbCkgewogICAgICBwcnVuZUNhY2hlKHRoaXMkMSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuICFtYXRjaGVzKHZhbCwgbmFtZSk7IH0pOwogICAgfSk7CiAgfSwKCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKCkgewogICAgdmFyIHNsb3QgPSB0aGlzLiRzbG90cy5kZWZhdWx0OwogICAgdmFyIHZub2RlID0gZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChzbG90KTsKICAgIHZhciBjb21wb25lbnRPcHRpb25zID0gdm5vZGUgJiYgdm5vZGUuY29tcG9uZW50T3B0aW9uczsKICAgIGlmIChjb21wb25lbnRPcHRpb25zKSB7CiAgICAgIC8vIGNoZWNrIHBhdHRlcm4KICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE9wdGlvbnMpOwogICAgICB2YXIgcmVmID0gdGhpczsKICAgICAgdmFyIGluY2x1ZGUgPSByZWYuaW5jbHVkZTsKICAgICAgdmFyIGV4Y2x1ZGUgPSByZWYuZXhjbHVkZTsKICAgICAgaWYgKAogICAgICAgIC8vIG5vdCBpbmNsdWRlZAogICAgICAgIChpbmNsdWRlICYmICghbmFtZSB8fCAhbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSkpIHx8CiAgICAgICAgLy8gZXhjbHVkZWQKICAgICAgICAoZXhjbHVkZSAmJiBuYW1lICYmIG1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpCiAgICAgICkgewogICAgICAgIHJldHVybiB2bm9kZQogICAgICB9CgogICAgICB2YXIgcmVmJDEgPSB0aGlzOwogICAgICB2YXIgY2FjaGUgPSByZWYkMS5jYWNoZTsKICAgICAgdmFyIGtleXMgPSByZWYkMS5rZXlzOwogICAgICB2YXIga2V5ID0gdm5vZGUua2V5ID09IG51bGwKICAgICAgICAvLyBzYW1lIGNvbnN0cnVjdG9yIG1heSBnZXQgcmVnaXN0ZXJlZCBhcyBkaWZmZXJlbnQgbG9jYWwgY29tcG9uZW50cwogICAgICAgIC8vIHNvIGNpZCBhbG9uZSBpcyBub3QgZW5vdWdoICgjMzI2OSkKICAgICAgICA/IGNvbXBvbmVudE9wdGlvbnMuQ3Rvci5jaWQgKyAoY29tcG9uZW50T3B0aW9ucy50YWcgPyAoIjo6IiArIChjb21wb25lbnRPcHRpb25zLnRhZykpIDogJycpCiAgICAgICAgOiB2bm9kZS5rZXk7CiAgICAgIGlmIChjYWNoZVtrZXldKSB7CiAgICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBjYWNoZVtrZXldLmNvbXBvbmVudEluc3RhbmNlOwogICAgICAgIC8vIG1ha2UgY3VycmVudCBrZXkgZnJlc2hlc3QKICAgICAgICByZW1vdmUoa2V5cywga2V5KTsKICAgICAgICBrZXlzLnB1c2goa2V5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjYWNoZVtrZXldID0gdm5vZGU7CiAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgLy8gcHJ1bmUgb2xkZXN0IGVudHJ5CiAgICAgICAgaWYgKHRoaXMubWF4ICYmIGtleXMubGVuZ3RoID4gcGFyc2VJbnQodGhpcy5tYXgpKSB7CiAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoY2FjaGUsIGtleXNbMF0sIGtleXMsIHRoaXMuX3Zub2RlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB2bm9kZSB8fCAoc2xvdCAmJiBzbG90WzBdKQogIH0KfQoKdmFyIGJ1aWx0SW5Db21wb25lbnRzID0gewogIEtlZXBBbGl2ZTogS2VlcEFsaXZlCn0KCi8qICAqLwoKZnVuY3Rpb24gaW5pdEdsb2JhbEFQSSAoVnVlKSB7CiAgLy8gY29uZmlnCiAgdmFyIGNvbmZpZ0RlZiA9IHt9OwogIGNvbmZpZ0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWc7IH07CiAgewogICAgY29uZmlnRGVmLnNldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgd2FybigKICAgICAgICAnRG8gbm90IHJlcGxhY2UgdGhlIFZ1ZS5jb25maWcgb2JqZWN0LCBzZXQgaW5kaXZpZHVhbCBmaWVsZHMgaW5zdGVhZC4nCiAgICAgICk7CiAgICB9OwogIH0KICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLCAnY29uZmlnJywgY29uZmlnRGVmKTsKCiAgLy8gZXhwb3NlZCB1dGlsIG1ldGhvZHMuCiAgLy8gTk9URTogdGhlc2UgYXJlIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgLSBhdm9pZCByZWx5aW5nIG9uCiAgLy8gdGhlbSB1bmxlc3MgeW91IGFyZSBhd2FyZSBvZiB0aGUgcmlzay4KICBWdWUudXRpbCA9IHsKICAgIHdhcm46IHdhcm4sCiAgICBleHRlbmQ6IGV4dGVuZCwKICAgIG1lcmdlT3B0aW9uczogbWVyZ2VPcHRpb25zLAogICAgZGVmaW5lUmVhY3RpdmU6IGRlZmluZVJlYWN0aXZlCiAgfTsKCiAgVnVlLnNldCA9IHNldDsKICBWdWUuZGVsZXRlID0gZGVsOwogIFZ1ZS5uZXh0VGljayA9IG5leHRUaWNrOwoKICBWdWUub3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgewogICAgVnVlLm9wdGlvbnNbdHlwZSArICdzJ10gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIH0pOwoKICAvLyB0aGlzIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlICJiYXNlIiBjb25zdHJ1Y3RvciB0byBleHRlbmQgYWxsIHBsYWluLW9iamVjdAogIC8vIGNvbXBvbmVudHMgd2l0aCBpbiBXZWV4J3MgbXVsdGktaW5zdGFuY2Ugc2NlbmFyaW9zLgogIFZ1ZS5vcHRpb25zLl9iYXNlID0gVnVlOwoKICBleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgYnVpbHRJbkNvbXBvbmVudHMpOwoKICBpbml0VXNlKFZ1ZSk7CiAgaW5pdE1peGluJDEoVnVlKTsKICBpbml0RXh0ZW5kKFZ1ZSk7CiAgaW5pdEFzc2V0UmVnaXN0ZXJzKFZ1ZSk7Cn0KCmluaXRHbG9iYWxBUEkoVnVlKTsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGlzU2VydmVyJywgewogIGdldDogaXNTZXJ2ZXJSZW5kZXJpbmcKfSk7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRzc3JDb250ZXh0JywgewogIGdldDogZnVuY3Rpb24gZ2V0ICgpIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICByZXR1cm4gdGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dAogIH0KfSk7CgovLyBleHBvc2UgRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgZm9yIHNzciBydW50aW1lIGhlbHBlciBpbnN0YWxsYXRpb24KT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZSwgJ0Z1bmN0aW9uYWxSZW5kZXJDb250ZXh0JywgewogIHZhbHVlOiBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dAp9KTsKClZ1ZS52ZXJzaW9uID0gJzIuNS4xNyc7CgovKiAgKi8KCi8vIHRoZXNlIGFyZSByZXNlcnZlZCBmb3Igd2ViIGJlY2F1c2UgdGhleSBhcmUgZGlyZWN0bHkgY29tcGlsZWQgYXdheQovLyBkdXJpbmcgdGVtcGxhdGUgY29tcGlsYXRpb24KdmFyIGlzUmVzZXJ2ZWRBdHRyID0gbWFrZU1hcCgnc3R5bGUsY2xhc3MnKTsKCi8vIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgdXNpbmcgcHJvcHMgZm9yIGJpbmRpbmcKdmFyIGFjY2VwdFZhbHVlID0gbWFrZU1hcCgnaW5wdXQsdGV4dGFyZWEsb3B0aW9uLHNlbGVjdCxwcm9ncmVzcycpOwp2YXIgbXVzdFVzZVByb3AgPSBmdW5jdGlvbiAodGFnLCB0eXBlLCBhdHRyKSB7CiAgcmV0dXJuICgKICAgIChhdHRyID09PSAndmFsdWUnICYmIGFjY2VwdFZhbHVlKHRhZykpICYmIHR5cGUgIT09ICdidXR0b24nIHx8CiAgICAoYXR0ciA9PT0gJ3NlbGVjdGVkJyAmJiB0YWcgPT09ICdvcHRpb24nKSB8fAogICAgKGF0dHIgPT09ICdjaGVja2VkJyAmJiB0YWcgPT09ICdpbnB1dCcpIHx8CiAgICAoYXR0ciA9PT0gJ211dGVkJyAmJiB0YWcgPT09ICd2aWRlbycpCiAgKQp9OwoKdmFyIGlzRW51bWVyYXRlZEF0dHIgPSBtYWtlTWFwKCdjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2snKTsKCnZhciBpc0Jvb2xlYW5BdHRyID0gbWFrZU1hcCgKICAnYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSwnICsKICAnZGVmYXVsdCxkZWZhdWx0Y2hlY2tlZCxkZWZhdWx0bXV0ZWQsZGVmYXVsdHNlbGVjdGVkLGRlZmVyLGRpc2FibGVkLCcgKwogICdlbmFibGVkLGZvcm1ub3ZhbGlkYXRlLGhpZGRlbixpbmRldGVybWluYXRlLGluZXJ0LGlzbWFwLGl0ZW1zY29wZSxsb29wLG11bHRpcGxlLCcgKwogICdtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LCcgKwogICdyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3Msc2VsZWN0ZWQsc29ydGFibGUsdHJhbnNsYXRlLCcgKwogICd0cnVlc3BlZWQsdHlwZW11c3RtYXRjaCx2aXNpYmxlJwopOwoKdmFyIHhsaW5rTlMgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayc7Cgp2YXIgaXNYbGluayA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgcmV0dXJuIG5hbWUuY2hhckF0KDUpID09PSAnOicgJiYgbmFtZS5zbGljZSgwLCA1KSA9PT0gJ3hsaW5rJwp9OwoKdmFyIGdldFhsaW5rUHJvcCA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgcmV0dXJuIGlzWGxpbmsobmFtZSkgPyBuYW1lLnNsaWNlKDYsIG5hbWUubGVuZ3RoKSA6ICcnCn07Cgp2YXIgaXNGYWxzeUF0dHJWYWx1ZSA9IGZ1bmN0aW9uICh2YWwpIHsKICByZXR1cm4gdmFsID09IG51bGwgfHwgdmFsID09PSBmYWxzZQp9OwoKLyogICovCgpmdW5jdGlvbiBnZW5DbGFzc0ZvclZub2RlICh2bm9kZSkgewogIHZhciBkYXRhID0gdm5vZGUuZGF0YTsKICB2YXIgcGFyZW50Tm9kZSA9IHZub2RlOwogIHZhciBjaGlsZE5vZGUgPSB2bm9kZTsKICB3aGlsZSAoaXNEZWYoY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlKSkgewogICAgY2hpbGROb2RlID0gY2hpbGROb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTsKICAgIGlmIChjaGlsZE5vZGUgJiYgY2hpbGROb2RlLmRhdGEpIHsKICAgICAgZGF0YSA9IG1lcmdlQ2xhc3NEYXRhKGNoaWxkTm9kZS5kYXRhLCBkYXRhKTsKICAgIH0KICB9CiAgd2hpbGUgKGlzRGVmKHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudCkpIHsKICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUuZGF0YSkgewogICAgICBkYXRhID0gbWVyZ2VDbGFzc0RhdGEoZGF0YSwgcGFyZW50Tm9kZS5kYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlbmRlckNsYXNzKGRhdGEuc3RhdGljQ2xhc3MsIGRhdGEuY2xhc3MpCn0KCmZ1bmN0aW9uIG1lcmdlQ2xhc3NEYXRhIChjaGlsZCwgcGFyZW50KSB7CiAgcmV0dXJuIHsKICAgIHN0YXRpY0NsYXNzOiBjb25jYXQoY2hpbGQuc3RhdGljQ2xhc3MsIHBhcmVudC5zdGF0aWNDbGFzcyksCiAgICBjbGFzczogaXNEZWYoY2hpbGQuY2xhc3MpCiAgICAgID8gW2NoaWxkLmNsYXNzLCBwYXJlbnQuY2xhc3NdCiAgICAgIDogcGFyZW50LmNsYXNzCiAgfQp9CgpmdW5jdGlvbiByZW5kZXJDbGFzcyAoCiAgc3RhdGljQ2xhc3MsCiAgZHluYW1pY0NsYXNzCikgewogIGlmIChpc0RlZihzdGF0aWNDbGFzcykgfHwgaXNEZWYoZHluYW1pY0NsYXNzKSkgewogICAgcmV0dXJuIGNvbmNhdChzdGF0aWNDbGFzcywgc3RyaW5naWZ5Q2xhc3MoZHluYW1pY0NsYXNzKSkKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICByZXR1cm4gJycKfQoKZnVuY3Rpb24gY29uY2F0IChhLCBiKSB7CiAgcmV0dXJuIGEgPyBiID8gKGEgKyAnICcgKyBiKSA6IGEgOiAoYiB8fCAnJykKfQoKZnVuY3Rpb24gc3RyaW5naWZ5Q2xhc3MgKHZhbHVlKSB7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUpCiAgfQogIGlmIChpc09iamVjdCh2YWx1ZSkpIHsKICAgIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUpCiAgfQogIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICByZXR1cm4gdmFsdWUKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICByZXR1cm4gJycKfQoKZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkgKHZhbHVlKSB7CiAgdmFyIHJlcyA9ICcnOwogIHZhciBzdHJpbmdpZmllZDsKICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgaWYgKGlzRGVmKHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5Q2xhc3ModmFsdWVbaV0pKSAmJiBzdHJpbmdpZmllZCAhPT0gJycpIHsKICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9CiAgICAgIHJlcyArPSBzdHJpbmdpZmllZDsKICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgpmdW5jdGlvbiBzdHJpbmdpZnlPYmplY3QgKHZhbHVlKSB7CiAgdmFyIHJlcyA9ICcnOwogIGZvciAodmFyIGtleSBpbiB2YWx1ZSkgewogICAgaWYgKHZhbHVlW2tleV0pIHsKICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9CiAgICAgIHJlcyArPSBrZXk7CiAgICB9CiAgfQogIHJldHVybiByZXMKfQoKLyogICovCgp2YXIgbmFtZXNwYWNlTWFwID0gewogIHN2ZzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywKICBtYXRoOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCcKfTsKCnZhciBpc0hUTUxUYWcgPSBtYWtlTWFwKAogICdodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSwnICsKICAnYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLCcgKwogICdkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCwnICsKICAnYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LCcgKwogICdzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbywnICsKICAnZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsJyArCiAgJ2NhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLCcgKwogICdidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLCcgKwogICdvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLCcgKwogICdkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksJyArCiAgJ2NvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QnCik7CgovLyB0aGlzIG1hcCBpcyBpbnRlbnRpb25hbGx5IHNlbGVjdGl2ZSwgb25seSBjb3ZlcmluZyBTVkcgZWxlbWVudHMgdGhhdCBtYXkKLy8gY29udGFpbiBjaGlsZCBlbGVtZW50cy4KdmFyIGlzU1ZHID0gbWFrZU1hcCgKICAnc3ZnLGFuaW1hdGUsY2lyY2xlLGNsaXBwYXRoLGN1cnNvcixkZWZzLGRlc2MsZWxsaXBzZSxmaWx0ZXIsZm9udC1mYWNlLCcgKwogICdmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybiwnICsKICAncG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldycsCiAgdHJ1ZQopOwoKdmFyIGlzUHJlVGFnID0gZnVuY3Rpb24gKHRhZykgeyByZXR1cm4gdGFnID09PSAncHJlJzsgfTsKCnZhciBpc1Jlc2VydmVkVGFnID0gZnVuY3Rpb24gKHRhZykgewogIHJldHVybiBpc0hUTUxUYWcodGFnKSB8fCBpc1NWRyh0YWcpCn07CgpmdW5jdGlvbiBnZXRUYWdOYW1lc3BhY2UgKHRhZykgewogIGlmIChpc1NWRyh0YWcpKSB7CiAgICByZXR1cm4gJ3N2ZycKICB9CiAgLy8gYmFzaWMgc3VwcG9ydCBmb3IgTWF0aE1MCiAgLy8gbm90ZSBpdCBkb2Vzbid0IHN1cHBvcnQgb3RoZXIgTWF0aE1MIGVsZW1lbnRzIGJlaW5nIGNvbXBvbmVudCByb290cwogIGlmICh0YWcgPT09ICdtYXRoJykgewogICAgcmV0dXJuICdtYXRoJwogIH0KfQoKdmFyIHVua25vd25FbGVtZW50Q2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwpmdW5jdGlvbiBpc1Vua25vd25FbGVtZW50ICh0YWcpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWluQnJvd3NlcikgewogICAgcmV0dXJuIHRydWUKICB9CiAgaWYgKGlzUmVzZXJ2ZWRUYWcodGFnKSkgewogICAgcmV0dXJuIGZhbHNlCiAgfQogIHRhZyA9IHRhZy50b0xvd2VyQ2FzZSgpOwogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gIT0gbnVsbCkgewogICAgcmV0dXJuIHVua25vd25FbGVtZW50Q2FjaGVbdGFnXQogIH0KICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgaWYgKHRhZy5pbmRleE9mKCctJykgPiAtMSkgewogICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjgyMTAzNjQvMTA3MDI0NAogICAgcmV0dXJuICh1bmtub3duRWxlbWVudENhY2hlW3RhZ10gPSAoCiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTFVua25vd25FbGVtZW50IHx8CiAgICAgIGVsLmNvbnN0cnVjdG9yID09PSB3aW5kb3cuSFRNTEVsZW1lbnQKICAgICkpCiAgfSBlbHNlIHsKICAgIHJldHVybiAodW5rbm93bkVsZW1lbnRDYWNoZVt0YWddID0gL0hUTUxVbmtub3duRWxlbWVudC8udGVzdChlbC50b1N0cmluZygpKSkKICB9Cn0KCnZhciBpc1RleHRJbnB1dFR5cGUgPSBtYWtlTWFwKCd0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCcpOwoKLyogICovCgovKioKICogUXVlcnkgYW4gZWxlbWVudCBzZWxlY3RvciBpZiBpdCdzIG5vdCBhbiBlbGVtZW50IGFscmVhZHkuCiAqLwpmdW5jdGlvbiBxdWVyeSAoZWwpIHsKICBpZiAodHlwZW9mIGVsID09PSAnc3RyaW5nJykgewogICAgdmFyIHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbCk7CiAgICBpZiAoIXNlbGVjdGVkKSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAgICdDYW5ub3QgZmluZCBlbGVtZW50OiAnICsgZWwKICAgICAgKTsKICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpCiAgICB9CiAgICByZXR1cm4gc2VsZWN0ZWQKICB9IGVsc2UgewogICAgcmV0dXJuIGVsCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQkMSAodGFnTmFtZSwgdm5vZGUpIHsKICB2YXIgZWxtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKICBpZiAodGFnTmFtZSAhPT0gJ3NlbGVjdCcpIHsKICAgIHJldHVybiBlbG0KICB9CiAgLy8gZmFsc2Ugb3IgbnVsbCB3aWxsIHJlbW92ZSB0aGUgYXR0cmlidXRlIGJ1dCB1bmRlZmluZWQgd2lsbCBub3QKICBpZiAodm5vZGUuZGF0YSAmJiB2bm9kZS5kYXRhLmF0dHJzICYmIHZub2RlLmRhdGEuYXR0cnMubXVsdGlwbGUgIT09IHVuZGVmaW5lZCkgewogICAgZWxtLnNldEF0dHJpYnV0ZSgnbXVsdGlwbGUnLCAnbXVsdGlwbGUnKTsKICB9CiAgcmV0dXJuIGVsbQp9CgpmdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMgKG5hbWVzcGFjZSwgdGFnTmFtZSkgewogIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlTWFwW25hbWVzcGFjZV0sIHRhZ05hbWUpCn0KCmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlICh0ZXh0KSB7CiAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpCn0KCmZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnQgKHRleHQpIHsKICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KQp9CgpmdW5jdGlvbiBpbnNlcnRCZWZvcmUgKHBhcmVudE5vZGUsIG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpIHsKICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZlcmVuY2VOb2RlKTsKfQoKZnVuY3Rpb24gcmVtb3ZlQ2hpbGQgKG5vZGUsIGNoaWxkKSB7CiAgbm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7Cn0KCmZ1bmN0aW9uIGFwcGVuZENoaWxkIChub2RlLCBjaGlsZCkgewogIG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpOwp9CgpmdW5jdGlvbiBwYXJlbnROb2RlIChub2RlKSB7CiAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZQp9CgpmdW5jdGlvbiBuZXh0U2libGluZyAobm9kZSkgewogIHJldHVybiBub2RlLm5leHRTaWJsaW5nCn0KCmZ1bmN0aW9uIHRhZ05hbWUgKG5vZGUpIHsKICByZXR1cm4gbm9kZS50YWdOYW1lCn0KCmZ1bmN0aW9uIHNldFRleHRDb250ZW50IChub2RlLCB0ZXh0KSB7CiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7Cn0KCmZ1bmN0aW9uIHNldFN0eWxlU2NvcGUgKG5vZGUsIHNjb3BlSWQpIHsKICBub2RlLnNldEF0dHJpYnV0ZShzY29wZUlkLCAnJyk7Cn0KCgp2YXIgbm9kZU9wcyA9IE9iamVjdC5mcmVlemUoewoJY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCQxLAoJY3JlYXRlRWxlbWVudE5TOiBjcmVhdGVFbGVtZW50TlMsCgljcmVhdGVUZXh0Tm9kZTogY3JlYXRlVGV4dE5vZGUsCgljcmVhdGVDb21tZW50OiBjcmVhdGVDb21tZW50LAoJaW5zZXJ0QmVmb3JlOiBpbnNlcnRCZWZvcmUsCglyZW1vdmVDaGlsZDogcmVtb3ZlQ2hpbGQsCglhcHBlbmRDaGlsZDogYXBwZW5kQ2hpbGQsCglwYXJlbnROb2RlOiBwYXJlbnROb2RlLAoJbmV4dFNpYmxpbmc6IG5leHRTaWJsaW5nLAoJdGFnTmFtZTogdGFnTmFtZSwKCXNldFRleHRDb250ZW50OiBzZXRUZXh0Q29udGVudCwKCXNldFN0eWxlU2NvcGU6IHNldFN0eWxlU2NvcGUKfSk7CgovKiAgKi8KCnZhciByZWYgPSB7CiAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUgKF8sIHZub2RlKSB7CiAgICByZWdpc3RlclJlZih2bm9kZSk7CiAgfSwKICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSAob2xkVm5vZGUsIHZub2RlKSB7CiAgICBpZiAob2xkVm5vZGUuZGF0YS5yZWYgIT09IHZub2RlLmRhdGEucmVmKSB7CiAgICAgIHJlZ2lzdGVyUmVmKG9sZFZub2RlLCB0cnVlKTsKICAgICAgcmVnaXN0ZXJSZWYodm5vZGUpOwogICAgfQogIH0sCiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHsKICAgIHJlZ2lzdGVyUmVmKHZub2RlLCB0cnVlKTsKICB9Cn0KCmZ1bmN0aW9uIHJlZ2lzdGVyUmVmICh2bm9kZSwgaXNSZW1vdmFsKSB7CiAgdmFyIGtleSA9IHZub2RlLmRhdGEucmVmOwogIGlmICghaXNEZWYoa2V5KSkgeyByZXR1cm4gfQoKICB2YXIgdm0gPSB2bm9kZS5jb250ZXh0OwogIHZhciByZWYgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSB8fCB2bm9kZS5lbG07CiAgdmFyIHJlZnMgPSB2bS4kcmVmczsKICBpZiAoaXNSZW1vdmFsKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZzW2tleV0pKSB7CiAgICAgIHJlbW92ZShyZWZzW2tleV0sIHJlZik7CiAgICB9IGVsc2UgaWYgKHJlZnNba2V5XSA9PT0gcmVmKSB7CiAgICAgIHJlZnNba2V5XSA9IHVuZGVmaW5lZDsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKHZub2RlLmRhdGEucmVmSW5Gb3IpIHsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnNba2V5XSkpIHsKICAgICAgICByZWZzW2tleV0gPSBbcmVmXTsKICAgICAgfSBlbHNlIGlmIChyZWZzW2tleV0uaW5kZXhPZihyZWYpIDwgMCkgewogICAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgICAgIHJlZnNba2V5XS5wdXNoKHJlZik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJlZnNba2V5XSA9IHJlZjsKICAgIH0KICB9Cn0KCi8qKgogKiBWaXJ0dWFsIERPTSBwYXRjaGluZyBhbGdvcml0aG0gYmFzZWQgb24gU25hYmJkb20gYnkKICogU2ltb24gRnJpaXMgVmluZHVtIChAcGFsZGVwaW5kKQogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UKICogaHR0cHM6Ly9naXRodWIuY29tL3BhbGRlcGluZC9zbmFiYmRvbS9ibG9iL21hc3Rlci9MSUNFTlNFCiAqCiAqIG1vZGlmaWVkIGJ5IEV2YW4gWW91IChAeXl4OTkwODAzKQogKgogKiBOb3QgdHlwZS1jaGVja2luZyB0aGlzIGJlY2F1c2UgdGhpcyBmaWxlIGlzIHBlcmYtY3JpdGljYWwgYW5kIHRoZSBjb3N0CiAqIG9mIG1ha2luZyBmbG93IHVuZGVyc3RhbmQgaXQgaXMgbm90IHdvcnRoIGl0LgogKi8KCnZhciBlbXB0eU5vZGUgPSBuZXcgVk5vZGUoJycsIHt9LCBbXSk7Cgp2YXIgaG9va3MgPSBbJ2NyZWF0ZScsICdhY3RpdmF0ZScsICd1cGRhdGUnLCAncmVtb3ZlJywgJ2Rlc3Ryb3knXTsKCmZ1bmN0aW9uIHNhbWVWbm9kZSAoYSwgYikgewogIHJldHVybiAoCiAgICBhLmtleSA9PT0gYi5rZXkgJiYgKAogICAgICAoCiAgICAgICAgYS50YWcgPT09IGIudGFnICYmCiAgICAgICAgYS5pc0NvbW1lbnQgPT09IGIuaXNDb21tZW50ICYmCiAgICAgICAgaXNEZWYoYS5kYXRhKSA9PT0gaXNEZWYoYi5kYXRhKSAmJgogICAgICAgIHNhbWVJbnB1dFR5cGUoYSwgYikKICAgICAgKSB8fCAoCiAgICAgICAgaXNUcnVlKGEuaXNBc3luY1BsYWNlaG9sZGVyKSAmJgogICAgICAgIGEuYXN5bmNGYWN0b3J5ID09PSBiLmFzeW5jRmFjdG9yeSAmJgogICAgICAgIGlzVW5kZWYoYi5hc3luY0ZhY3RvcnkuZXJyb3IpCiAgICAgICkKICAgICkKICApCn0KCmZ1bmN0aW9uIHNhbWVJbnB1dFR5cGUgKGEsIGIpIHsKICBpZiAoYS50YWcgIT09ICdpbnB1dCcpIHsgcmV0dXJuIHRydWUgfQogIHZhciBpOwogIHZhciB0eXBlQSA9IGlzRGVmKGkgPSBhLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7CiAgdmFyIHR5cGVCID0gaXNEZWYoaSA9IGIuZGF0YSkgJiYgaXNEZWYoaSA9IGkuYXR0cnMpICYmIGkudHlwZTsKICByZXR1cm4gdHlwZUEgPT09IHR5cGVCIHx8IGlzVGV4dElucHV0VHlwZSh0eXBlQSkgJiYgaXNUZXh0SW5wdXRUeXBlKHR5cGVCKQp9CgpmdW5jdGlvbiBjcmVhdGVLZXlUb09sZElkeCAoY2hpbGRyZW4sIGJlZ2luSWR4LCBlbmRJZHgpIHsKICB2YXIgaSwga2V5OwogIHZhciBtYXAgPSB7fTsKICBmb3IgKGkgPSBiZWdpbklkeDsgaSA8PSBlbmRJZHg7ICsraSkgewogICAga2V5ID0gY2hpbGRyZW5baV0ua2V5OwogICAgaWYgKGlzRGVmKGtleSkpIHsgbWFwW2tleV0gPSBpOyB9CiAgfQogIHJldHVybiBtYXAKfQoKZnVuY3Rpb24gY3JlYXRlUGF0Y2hGdW5jdGlvbiAoYmFja2VuZCkgewogIHZhciBpLCBqOwogIHZhciBjYnMgPSB7fTsKCiAgdmFyIG1vZHVsZXMgPSBiYWNrZW5kLm1vZHVsZXM7CiAgdmFyIG5vZGVPcHMgPSBiYWNrZW5kLm5vZGVPcHM7CgogIGZvciAoaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkgewogICAgY2JzW2hvb2tzW2ldXSA9IFtdOwogICAgZm9yIChqID0gMDsgaiA8IG1vZHVsZXMubGVuZ3RoOyArK2opIHsKICAgICAgaWYgKGlzRGVmKG1vZHVsZXNbal1baG9va3NbaV1dKSkgewogICAgICAgIGNic1tob29rc1tpXV0ucHVzaChtb2R1bGVzW2pdW2hvb2tzW2ldXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGVtcHR5Tm9kZUF0IChlbG0pIHsKICAgIHJldHVybiBuZXcgVk5vZGUobm9kZU9wcy50YWdOYW1lKGVsbSkudG9Mb3dlckNhc2UoKSwge30sIFtdLCB1bmRlZmluZWQsIGVsbSkKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZVJtQ2IgKGNoaWxkRWxtLCBsaXN0ZW5lcnMpIHsKICAgIGZ1bmN0aW9uIHJlbW92ZSAoKSB7CiAgICAgIGlmICgtLXJlbW92ZS5saXN0ZW5lcnMgPT09IDApIHsKICAgICAgICByZW1vdmVOb2RlKGNoaWxkRWxtKTsKICAgICAgfQogICAgfQogICAgcmVtb3ZlLmxpc3RlbmVycyA9IGxpc3RlbmVyczsKICAgIHJldHVybiByZW1vdmUKICB9CgogIGZ1bmN0aW9uIHJlbW92ZU5vZGUgKGVsKSB7CiAgICB2YXIgcGFyZW50ID0gbm9kZU9wcy5wYXJlbnROb2RlKGVsKTsKICAgIC8vIGVsZW1lbnQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZHVlIHRvIHYtaHRtbCAvIHYtdGV4dAogICAgaWYgKGlzRGVmKHBhcmVudCkpIHsKICAgICAgbm9kZU9wcy5yZW1vdmVDaGlsZChwYXJlbnQsIGVsKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzVW5rbm93bkVsZW1lbnQkJDEgKHZub2RlLCBpblZQcmUpIHsKICAgIHJldHVybiAoCiAgICAgICFpblZQcmUgJiYKICAgICAgIXZub2RlLm5zICYmCiAgICAgICEoCiAgICAgICAgY29uZmlnLmlnbm9yZWRFbGVtZW50cy5sZW5ndGggJiYKICAgICAgICBjb25maWcuaWdub3JlZEVsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGlnbm9yZSkgewogICAgICAgICAgcmV0dXJuIGlzUmVnRXhwKGlnbm9yZSkKICAgICAgICAgICAgPyBpZ25vcmUudGVzdCh2bm9kZS50YWcpCiAgICAgICAgICAgIDogaWdub3JlID09PSB2bm9kZS50YWcKICAgICAgICB9KQogICAgICApICYmCiAgICAgIGNvbmZpZy5pc1Vua25vd25FbGVtZW50KHZub2RlLnRhZykKICAgICkKICB9CgogIHZhciBjcmVhdGluZ0VsbUluVlByZSA9IDA7CgogIGZ1bmN0aW9uIGNyZWF0ZUVsbSAoCiAgICB2bm9kZSwKICAgIGluc2VydGVkVm5vZGVRdWV1ZSwKICAgIHBhcmVudEVsbSwKICAgIHJlZkVsbSwKICAgIG5lc3RlZCwKICAgIG93bmVyQXJyYXksCiAgICBpbmRleAogICkgewogICAgaWYgKGlzRGVmKHZub2RlLmVsbSkgJiYgaXNEZWYob3duZXJBcnJheSkpIHsKICAgICAgLy8gVGhpcyB2bm9kZSB3YXMgdXNlZCBpbiBhIHByZXZpb3VzIHJlbmRlciEKICAgICAgLy8gbm93IGl0J3MgdXNlZCBhcyBhIG5ldyBub2RlLCBvdmVyd3JpdGluZyBpdHMgZWxtIHdvdWxkIGNhdXNlCiAgICAgIC8vIHBvdGVudGlhbCBwYXRjaCBlcnJvcnMgZG93biB0aGUgcm9hZCB3aGVuIGl0J3MgdXNlZCBhcyBhbiBpbnNlcnRpb24KICAgICAgLy8gcmVmZXJlbmNlIG5vZGUuIEluc3RlYWQsIHdlIGNsb25lIHRoZSBub2RlIG9uLWRlbWFuZCBiZWZvcmUgY3JlYXRpbmcKICAgICAgLy8gYXNzb2NpYXRlZCBET00gZWxlbWVudCBmb3IgaXQuCiAgICAgIHZub2RlID0gb3duZXJBcnJheVtpbmRleF0gPSBjbG9uZVZOb2RlKHZub2RlKTsKICAgIH0KCiAgICB2bm9kZS5pc1Jvb3RJbnNlcnQgPSAhbmVzdGVkOyAvLyBmb3IgdHJhbnNpdGlvbiBlbnRlciBjaGVjawogICAgaWYgKGNyZWF0ZUNvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkpIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47CiAgICB2YXIgdGFnID0gdm5vZGUudGFnOwogICAgaWYgKGlzRGVmKHRhZykpIHsKICAgICAgewogICAgICAgIGlmIChkYXRhICYmIGRhdGEucHJlKSB7CiAgICAgICAgICBjcmVhdGluZ0VsbUluVlByZSsrOwogICAgICAgIH0KICAgICAgICBpZiAoaXNVbmtub3duRWxlbWVudCQkMSh2bm9kZSwgY3JlYXRpbmdFbG1JblZQcmUpKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAnVW5rbm93biBjdXN0b20gZWxlbWVudDogPCcgKyB0YWcgKyAnPiAtIGRpZCB5b3UgJyArCiAgICAgICAgICAgICdyZWdpc3RlciB0aGUgY29tcG9uZW50IGNvcnJlY3RseT8gRm9yIHJlY3Vyc2l2ZSBjb21wb25lbnRzLCAnICsKICAgICAgICAgICAgJ21ha2Ugc3VyZSB0byBwcm92aWRlIHRoZSAibmFtZSIgb3B0aW9uLicsCiAgICAgICAgICAgIHZub2RlLmNvbnRleHQKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CgogICAgICB2bm9kZS5lbG0gPSB2bm9kZS5ucwogICAgICAgID8gbm9kZU9wcy5jcmVhdGVFbGVtZW50TlModm5vZGUubnMsIHRhZykKICAgICAgICA6IG5vZGVPcHMuY3JlYXRlRWxlbWVudCh0YWcsIHZub2RlKTsKICAgICAgc2V0U2NvcGUodm5vZGUpOwoKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIHsKICAgICAgICBjcmVhdGVDaGlsZHJlbih2bm9kZSwgY2hpbGRyZW4sIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICB9CiAgICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgICB9CgogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRhdGEgJiYgZGF0YS5wcmUpIHsKICAgICAgICBjcmVhdGluZ0VsbUluVlByZS0tOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpKSB7CiAgICAgIHZub2RlLmVsbSA9IG5vZGVPcHMuY3JlYXRlQ29tbWVudCh2bm9kZS50ZXh0KTsKICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgfSBlbHNlIHsKICAgICAgdm5vZGUuZWxtID0gbm9kZU9wcy5jcmVhdGVUZXh0Tm9kZSh2bm9kZS50ZXh0KTsKICAgICAgaW5zZXJ0KHBhcmVudEVsbSwgdm5vZGUuZWxtLCByZWZFbG0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIHJlZkVsbSkgewogICAgdmFyIGkgPSB2bm9kZS5kYXRhOwogICAgaWYgKGlzRGVmKGkpKSB7CiAgICAgIHZhciBpc1JlYWN0aXZhdGVkID0gaXNEZWYodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpICYmIGkua2VlcEFsaXZlOwogICAgICBpZiAoaXNEZWYoaSA9IGkuaG9vaykgJiYgaXNEZWYoaSA9IGkuaW5pdCkpIHsKICAgICAgICBpKHZub2RlLCBmYWxzZSAvKiBoeWRyYXRpbmcgKi8sIHBhcmVudEVsbSwgcmVmRWxtKTsKICAgICAgfQogICAgICAvLyBhZnRlciBjYWxsaW5nIHRoZSBpbml0IGhvb2ssIGlmIHRoZSB2bm9kZSBpcyBhIGNoaWxkIGNvbXBvbmVudAogICAgICAvLyBpdCBzaG91bGQndmUgY3JlYXRlZCBhIGNoaWxkIGluc3RhbmNlIGFuZCBtb3VudGVkIGl0LiB0aGUgY2hpbGQKICAgICAgLy8gY29tcG9uZW50IGFsc28gaGFzIHNldCB0aGUgcGxhY2Vob2xkZXIgdm5vZGUncyBlbG0uCiAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBjYW4ganVzdCByZXR1cm4gdGhlIGVsZW1lbnQgYW5kIGJlIGRvbmUuCiAgICAgIGlmIChpc0RlZih2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHsKICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIGlmIChpc1RydWUoaXNSZWFjdGl2YXRlZCkpIHsKICAgICAgICAgIHJlYWN0aXZhdGVDb21wb25lbnQodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbml0Q29tcG9uZW50ICh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7CiAgICBpZiAoaXNEZWYodm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSkgewogICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaC5hcHBseShpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCk7CiAgICAgIHZub2RlLmRhdGEucGVuZGluZ0luc2VydCA9IG51bGw7CiAgICB9CiAgICB2bm9kZS5lbG0gPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS4kZWw7CiAgICBpZiAoaXNQYXRjaGFibGUodm5vZGUpKSB7CiAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICBzZXRTY29wZSh2bm9kZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBlbXB0eSBjb21wb25lbnQgcm9vdC4KICAgICAgLy8gc2tpcCBhbGwgZWxlbWVudC1yZWxhdGVkIG1vZHVsZXMgZXhjZXB0IGZvciByZWYgKCMzNDU1KQogICAgICByZWdpc3RlclJlZih2bm9kZSk7CiAgICAgIC8vIG1ha2Ugc3VyZSB0byBpbnZva2UgdGhlIGluc2VydCBob29rCiAgICAgIGluc2VydGVkVm5vZGVRdWV1ZS5wdXNoKHZub2RlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlYWN0aXZhdGVDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKSB7CiAgICB2YXIgaTsKICAgIC8vIGhhY2sgZm9yICM0MzM5OiBhIHJlYWN0aXZhdGVkIGNvbXBvbmVudCB3aXRoIGlubmVyIHRyYW5zaXRpb24KICAgIC8vIGRvZXMgbm90IHRyaWdnZXIgYmVjYXVzZSB0aGUgaW5uZXIgbm9kZSdzIGNyZWF0ZWQgaG9va3MgYXJlIG5vdCBjYWxsZWQKICAgIC8vIGFnYWluLiBJdCdzIG5vdCBpZGVhbCB0byBpbnZvbHZlIG1vZHVsZS1zcGVjaWZpYyBsb2dpYyBpbiBoZXJlIGJ1dAogICAgLy8gdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgYmV0dGVyIHdheSB0byBkbyBpdC4KICAgIHZhciBpbm5lck5vZGUgPSB2bm9kZTsKICAgIHdoaWxlIChpbm5lck5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgaW5uZXJOb2RlID0gaW5uZXJOb2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTsKICAgICAgaWYgKGlzRGVmKGkgPSBpbm5lck5vZGUuZGF0YSkgJiYgaXNEZWYoaSA9IGkudHJhbnNpdGlvbikpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmFjdGl2YXRlLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICBjYnMuYWN0aXZhdGVbaV0oZW1wdHlOb2RlLCBpbm5lck5vZGUpOwogICAgICAgIH0KICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaChpbm5lck5vZGUpOwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgIH0KICAgIC8vIHVubGlrZSBhIG5ld2x5IGNyZWF0ZWQgY29tcG9uZW50LAogICAgLy8gYSByZWFjdGl2YXRlZCBrZWVwLWFsaXZlIGNvbXBvbmVudCBkb2Vzbid0IGluc2VydCBpdHNlbGYKICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTsKICB9CgogIGZ1bmN0aW9uIGluc2VydCAocGFyZW50LCBlbG0sIHJlZiQkMSkgewogICAgaWYgKGlzRGVmKHBhcmVudCkpIHsKICAgICAgaWYgKGlzRGVmKHJlZiQkMSkpIHsKICAgICAgICBpZiAocmVmJCQxLnBhcmVudE5vZGUgPT09IHBhcmVudCkgewogICAgICAgICAgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50LCBlbG0sIHJlZiQkMSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQocGFyZW50LCBlbG0pOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVDaGlsZHJlbiAodm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgewogICAgICB7CiAgICAgICAgY2hlY2tEdXBsaWNhdGVLZXlzKGNoaWxkcmVuKTsKICAgICAgfQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7CiAgICAgICAgY3JlYXRlRWxtKGNoaWxkcmVuW2ldLCBpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmVsbSwgbnVsbCwgdHJ1ZSwgY2hpbGRyZW4sIGkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZub2RlLnRleHQpKSB7CiAgICAgIG5vZGVPcHMuYXBwZW5kQ2hpbGQodm5vZGUuZWxtLCBub2RlT3BzLmNyZWF0ZVRleHROb2RlKFN0cmluZyh2bm9kZS50ZXh0KSkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaXNQYXRjaGFibGUgKHZub2RlKSB7CiAgICB3aGlsZSAodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgdm5vZGUgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7CiAgICB9CiAgICByZXR1cm4gaXNEZWYodm5vZGUudGFnKQogIH0KCiAgZnVuY3Rpb24gaW52b2tlQ3JlYXRlSG9va3MgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHsKICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgewogICAgICBjYnMuY3JlYXRlW2kkMV0oZW1wdHlOb2RlLCB2bm9kZSk7CiAgICB9CiAgICBpID0gdm5vZGUuZGF0YS5ob29rOyAvLyBSZXVzZSB2YXJpYWJsZQogICAgaWYgKGlzRGVmKGkpKSB7CiAgICAgIGlmIChpc0RlZihpLmNyZWF0ZSkpIHsgaS5jcmVhdGUoZW1wdHlOb2RlLCB2bm9kZSk7IH0KICAgICAgaWYgKGlzRGVmKGkuaW5zZXJ0KSkgeyBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7IH0KICAgIH0KICB9CgogIC8vIHNldCBzY29wZSBpZCBhdHRyaWJ1dGUgZm9yIHNjb3BlZCBDU1MuCiAgLy8gdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNwZWNpYWwgY2FzZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQKICAvLyBvZiBnb2luZyB0aHJvdWdoIHRoZSBub3JtYWwgYXR0cmlidXRlIHBhdGNoaW5nIHByb2Nlc3MuCiAgZnVuY3Rpb24gc2V0U2NvcGUgKHZub2RlKSB7CiAgICB2YXIgaTsKICAgIGlmIChpc0RlZihpID0gdm5vZGUuZm5TY29wZUlkKSkgewogICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBhbmNlc3RvciA9IHZub2RlOwogICAgICB3aGlsZSAoYW5jZXN0b3IpIHsKICAgICAgICBpZiAoaXNEZWYoaSA9IGFuY2VzdG9yLmNvbnRleHQpICYmIGlzRGVmKGkgPSBpLiRvcHRpb25zLl9zY29wZUlkKSkgewogICAgICAgICAgbm9kZU9wcy5zZXRTdHlsZVNjb3BlKHZub2RlLmVsbSwgaSk7CiAgICAgICAgfQogICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50OwogICAgICB9CiAgICB9CiAgICAvLyBmb3Igc2xvdCBjb250ZW50IHRoZXkgc2hvdWxkIGFsc28gZ2V0IHRoZSBzY29wZUlkIGZyb20gdGhlIGhvc3QgaW5zdGFuY2UuCiAgICBpZiAoaXNEZWYoaSA9IGFjdGl2ZUluc3RhbmNlKSAmJgogICAgICBpICE9PSB2bm9kZS5jb250ZXh0ICYmCiAgICAgIGkgIT09IHZub2RlLmZuQ29udGV4dCAmJgogICAgICBpc0RlZihpID0gaS4kb3B0aW9ucy5fc2NvcGVJZCkKICAgICkgewogICAgICBub2RlT3BzLnNldFN0eWxlU2NvcGUodm5vZGUuZWxtLCBpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFkZFZub2RlcyAocGFyZW50RWxtLCByZWZFbG0sIHZub2Rlcywgc3RhcnRJZHgsIGVuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7CiAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7CiAgICAgIGNyZWF0ZUVsbSh2bm9kZXNbc3RhcnRJZHhdLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtLCBmYWxzZSwgdm5vZGVzLCBzdGFydElkeCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbnZva2VEZXN0cm95SG9vayAodm5vZGUpIHsKICAgIHZhciBpLCBqOwogICAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5kZXN0cm95KSkgeyBpKHZub2RlKTsgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmRlc3Ryb3kubGVuZ3RoOyArK2kpIHsgY2JzLmRlc3Ryb3lbaV0odm5vZGUpOyB9CiAgICB9CiAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNoaWxkcmVuKSkgewogICAgICBmb3IgKGogPSAwOyBqIDwgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyArK2opIHsKICAgICAgICBpbnZva2VEZXN0cm95SG9vayh2bm9kZS5jaGlsZHJlbltqXSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbW92ZVZub2RlcyAocGFyZW50RWxtLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgpIHsKICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHsKICAgICAgdmFyIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTsKICAgICAgaWYgKGlzRGVmKGNoKSkgewogICAgICAgIGlmIChpc0RlZihjaC50YWcpKSB7CiAgICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGNoKTsKICAgICAgICAgIGludm9rZURlc3Ryb3lIb29rKGNoKTsKICAgICAgICB9IGVsc2UgeyAvLyBUZXh0IG5vZGUKICAgICAgICAgIHJlbW92ZU5vZGUoY2guZWxtKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2sgKHZub2RlLCBybSkgewogICAgaWYgKGlzRGVmKHJtKSB8fCBpc0RlZih2bm9kZS5kYXRhKSkgewogICAgICB2YXIgaTsKICAgICAgdmFyIGxpc3RlbmVycyA9IGNicy5yZW1vdmUubGVuZ3RoICsgMTsKICAgICAgaWYgKGlzRGVmKHJtKSkgewogICAgICAgIC8vIHdlIGhhdmUgYSByZWN1cnNpdmVseSBwYXNzZWQgZG93biBybSBjYWxsYmFjawogICAgICAgIC8vIGluY3JlYXNlIHRoZSBsaXN0ZW5lcnMgY291bnQKICAgICAgICBybS5saXN0ZW5lcnMgKz0gbGlzdGVuZXJzOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIGRpcmVjdGx5IHJlbW92aW5nCiAgICAgICAgcm0gPSBjcmVhdGVSbUNiKHZub2RlLmVsbSwgbGlzdGVuZXJzKTsKICAgICAgfQogICAgICAvLyByZWN1cnNpdmVseSBpbnZva2UgaG9va3Mgb24gY2hpbGQgY29tcG9uZW50IHJvb3Qgbm9kZQogICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSAmJiBpc0RlZihpID0gaS5fdm5vZGUpICYmIGlzRGVmKGkuZGF0YSkpIHsKICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGksIHJtKTsKICAgICAgfQogICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLnJlbW92ZS5sZW5ndGg7ICsraSkgewogICAgICAgIGNicy5yZW1vdmVbaV0odm5vZGUsIHJtKTsKICAgICAgfQogICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucmVtb3ZlKSkgewogICAgICAgIGkodm5vZGUsIHJtKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBybSgpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZW1vdmVOb2RlKHZub2RlLmVsbSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVDaGlsZHJlbiAocGFyZW50RWxtLCBvbGRDaCwgbmV3Q2gsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgewogICAgdmFyIG9sZFN0YXJ0SWR4ID0gMDsKICAgIHZhciBuZXdTdGFydElkeCA9IDA7CiAgICB2YXIgb2xkRW5kSWR4ID0gb2xkQ2gubGVuZ3RoIC0gMTsKICAgIHZhciBvbGRTdGFydFZub2RlID0gb2xkQ2hbMF07CiAgICB2YXIgb2xkRW5kVm5vZGUgPSBvbGRDaFtvbGRFbmRJZHhdOwogICAgdmFyIG5ld0VuZElkeCA9IG5ld0NoLmxlbmd0aCAtIDE7CiAgICB2YXIgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWzBdOwogICAgdmFyIG5ld0VuZFZub2RlID0gbmV3Q2hbbmV3RW5kSWR4XTsKICAgIHZhciBvbGRLZXlUb0lkeCwgaWR4SW5PbGQsIHZub2RlVG9Nb3ZlLCByZWZFbG07CgogICAgLy8gcmVtb3ZlT25seSBpcyBhIHNwZWNpYWwgZmxhZyB1c2VkIG9ubHkgYnkgPHRyYW5zaXRpb24tZ3JvdXA+CiAgICAvLyB0byBlbnN1cmUgcmVtb3ZlZCBlbGVtZW50cyBzdGF5IGluIGNvcnJlY3QgcmVsYXRpdmUgcG9zaXRpb25zCiAgICAvLyBkdXJpbmcgbGVhdmluZyB0cmFuc2l0aW9ucwogICAgdmFyIGNhbk1vdmUgPSAhcmVtb3ZlT25seTsKCiAgICB7CiAgICAgIGNoZWNrRHVwbGljYXRlS2V5cyhuZXdDaCk7CiAgICB9CgogICAgd2hpbGUgKG9sZFN0YXJ0SWR4IDw9IG9sZEVuZElkeCAmJiBuZXdTdGFydElkeCA8PSBuZXdFbmRJZHgpIHsKICAgICAgaWYgKGlzVW5kZWYob2xkU3RhcnRWbm9kZSkpIHsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07IC8vIFZub2RlIGhhcyBiZWVuIG1vdmVkIGxlZnQKICAgICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZEVuZFZub2RlKSkgewogICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdOwogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07CiAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdOwogICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUpKSB7CiAgICAgICAgcGF0Y2hWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgb2xkRW5kVm5vZGUgPSBvbGRDaFstLW9sZEVuZElkeF07CiAgICAgICAgbmV3RW5kVm5vZGUgPSBuZXdDaFstLW5ld0VuZElkeF07CiAgICAgIH0gZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlKSkgeyAvLyBWbm9kZSBtb3ZlZCByaWdodAogICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVuZFZub2RlLmVsbSkpOwogICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTsKICAgICAgICBuZXdFbmRWbm9kZSA9IG5ld0NoWy0tbmV3RW5kSWR4XTsKICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7IC8vIFZub2RlIG1vdmVkIGxlZnQKICAgICAgICBwYXRjaFZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCBvbGRFbmRWbm9kZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTsKICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlzVW5kZWYob2xkS2V5VG9JZHgpKSB7IG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOyB9CiAgICAgICAgaWR4SW5PbGQgPSBpc0RlZihuZXdTdGFydFZub2RlLmtleSkKICAgICAgICAgID8gb2xkS2V5VG9JZHhbbmV3U3RhcnRWbm9kZS5rZXldCiAgICAgICAgICA6IGZpbmRJZHhJbk9sZChuZXdTdGFydFZub2RlLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7CiAgICAgICAgaWYgKGlzVW5kZWYoaWR4SW5PbGQpKSB7IC8vIE5ldyBlbGVtZW50CiAgICAgICAgICBjcmVhdGVFbG0obmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBmYWxzZSwgbmV3Q2gsIG5ld1N0YXJ0SWR4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdm5vZGVUb01vdmUgPSBvbGRDaFtpZHhJbk9sZF07CiAgICAgICAgICBpZiAoc2FtZVZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlKSkgewogICAgICAgICAgICBwYXRjaFZub2RlKHZub2RlVG9Nb3ZlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgICAgICBvbGRDaFtpZHhJbk9sZF0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIGNhbk1vdmUgJiYgbm9kZU9wcy5pbnNlcnRCZWZvcmUocGFyZW50RWxtLCB2bm9kZVRvTW92ZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIHNhbWUga2V5IGJ1dCBkaWZmZXJlbnQgZWxlbWVudC4gdHJlYXQgYXMgbmV3IGVsZW1lbnQKICAgICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSwgZmFsc2UsIG5ld0NoLCBuZXdTdGFydElkeCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTsKICAgICAgfQogICAgfQogICAgaWYgKG9sZFN0YXJ0SWR4ID4gb2xkRW5kSWR4KSB7CiAgICAgIHJlZkVsbSA9IGlzVW5kZWYobmV3Q2hbbmV3RW5kSWR4ICsgMV0pID8gbnVsbCA6IG5ld0NoW25ld0VuZElkeCArIDFdLmVsbTsKICAgICAgYWRkVm5vZGVzKHBhcmVudEVsbSwgcmVmRWxtLCBuZXdDaCwgbmV3U3RhcnRJZHgsIG5ld0VuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgIH0gZWxzZSBpZiAobmV3U3RhcnRJZHggPiBuZXdFbmRJZHgpIHsKICAgICAgcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgb2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY2hlY2tEdXBsaWNhdGVLZXlzIChjaGlsZHJlbikgewogICAgdmFyIHNlZW5LZXlzID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciB2bm9kZSA9IGNoaWxkcmVuW2ldOwogICAgICB2YXIga2V5ID0gdm5vZGUua2V5OwogICAgICBpZiAoaXNEZWYoa2V5KSkgewogICAgICAgIGlmIChzZWVuS2V5c1trZXldKSB7CiAgICAgICAgICB3YXJuKAogICAgICAgICAgICAoIkR1cGxpY2F0ZSBrZXlzIGRldGVjdGVkOiAnIiArIGtleSArICInLiBUaGlzIG1heSBjYXVzZSBhbiB1cGRhdGUgZXJyb3IuIiksCiAgICAgICAgICAgIHZub2RlLmNvbnRleHQKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlZW5LZXlzW2tleV0gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gZmluZElkeEluT2xkIChub2RlLCBvbGRDaCwgc3RhcnQsIGVuZCkgewogICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgdmFyIGMgPSBvbGRDaFtpXTsKICAgICAgaWYgKGlzRGVmKGMpICYmIHNhbWVWbm9kZShub2RlLCBjKSkgeyByZXR1cm4gaSB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXRjaFZub2RlIChvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkgewogICAgaWYgKG9sZFZub2RlID09PSB2bm9kZSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgZWxtID0gdm5vZGUuZWxtID0gb2xkVm5vZGUuZWxtOwoKICAgIGlmIChpc1RydWUob2xkVm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyKSkgewogICAgICBpZiAoaXNEZWYodm5vZGUuYXN5bmNGYWN0b3J5LnJlc29sdmVkKSkgewogICAgICAgIGh5ZHJhdGUob2xkVm5vZGUuZWxtLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2bm9kZS5pc0FzeW5jUGxhY2Vob2xkZXIgPSB0cnVlOwogICAgICB9CiAgICAgIHJldHVybgogICAgfQoKICAgIC8vIHJldXNlIGVsZW1lbnQgZm9yIHN0YXRpYyB0cmVlcy4KICAgIC8vIG5vdGUgd2Ugb25seSBkbyB0aGlzIGlmIHRoZSB2bm9kZSBpcyBjbG9uZWQgLQogICAgLy8gaWYgdGhlIG5ldyBub2RlIGlzIG5vdCBjbG9uZWQgaXQgbWVhbnMgdGhlIHJlbmRlciBmdW5jdGlvbnMgaGF2ZSBiZWVuCiAgICAvLyByZXNldCBieSB0aGUgaG90LXJlbG9hZC1hcGkgYW5kIHdlIG5lZWQgdG8gZG8gYSBwcm9wZXIgcmUtcmVuZGVyLgogICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc1N0YXRpYykgJiYKICAgICAgaXNUcnVlKG9sZFZub2RlLmlzU3RhdGljKSAmJgogICAgICB2bm9kZS5rZXkgPT09IG9sZFZub2RlLmtleSAmJgogICAgICAoaXNUcnVlKHZub2RlLmlzQ2xvbmVkKSB8fCBpc1RydWUodm5vZGUuaXNPbmNlKSkKICAgICkgewogICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IG9sZFZub2RlLmNvbXBvbmVudEluc3RhbmNlOwogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgaTsKICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTsKICAgIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wcmVwYXRjaCkpIHsKICAgICAgaShvbGRWbm9kZSwgdm5vZGUpOwogICAgfQoKICAgIHZhciBvbGRDaCA9IG9sZFZub2RlLmNoaWxkcmVuOwogICAgdmFyIGNoID0gdm5vZGUuY2hpbGRyZW47CiAgICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNQYXRjaGFibGUodm5vZGUpKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMudXBkYXRlLmxlbmd0aDsgKytpKSB7IGNicy51cGRhdGVbaV0ob2xkVm5vZGUsIHZub2RlKTsgfQogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkudXBkYXRlKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0KICAgIH0KICAgIGlmIChpc1VuZGVmKHZub2RlLnRleHQpKSB7CiAgICAgIGlmIChpc0RlZihvbGRDaCkgJiYgaXNEZWYoY2gpKSB7CiAgICAgICAgaWYgKG9sZENoICE9PSBjaCkgeyB1cGRhdGVDaGlsZHJlbihlbG0sIG9sZENoLCBjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsgfQogICAgICB9IGVsc2UgaWYgKGlzRGVmKGNoKSkgewogICAgICAgIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkgeyBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpOyB9CiAgICAgICAgYWRkVm5vZGVzKGVsbSwgbnVsbCwgY2gsIDAsIGNoLmxlbmd0aCAtIDEsIGluc2VydGVkVm5vZGVRdWV1ZSk7CiAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkQ2gpKSB7CiAgICAgICAgcmVtb3ZlVm5vZGVzKGVsbSwgb2xkQ2gsIDAsIG9sZENoLmxlbmd0aCAtIDEpOwogICAgICB9IGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7CiAgICAgICAgbm9kZU9wcy5zZXRUZXh0Q29udGVudChlbG0sICcnKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChvbGRWbm9kZS50ZXh0ICE9PSB2bm9kZS50ZXh0KSB7CiAgICAgIG5vZGVPcHMuc2V0VGV4dENvbnRlbnQoZWxtLCB2bm9kZS50ZXh0KTsKICAgIH0KICAgIGlmIChpc0RlZihkYXRhKSkgewogICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucG9zdHBhdGNoKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGludm9rZUluc2VydEhvb2sgKHZub2RlLCBxdWV1ZSwgaW5pdGlhbCkgewogICAgLy8gZGVsYXkgaW5zZXJ0IGhvb2tzIGZvciBjb21wb25lbnQgcm9vdCBub2RlcywgaW52b2tlIHRoZW0gYWZ0ZXIgdGhlCiAgICAvLyBlbGVtZW50IGlzIHJlYWxseSBpbnNlcnRlZAogICAgaWYgKGlzVHJ1ZShpbml0aWFsKSAmJiBpc0RlZih2bm9kZS5wYXJlbnQpKSB7CiAgICAgIHZub2RlLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQgPSBxdWV1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHsKICAgICAgICBxdWV1ZVtpXS5kYXRhLmhvb2suaW5zZXJ0KHF1ZXVlW2ldKTsKICAgICAgfQogICAgfQogIH0KCiAgdmFyIGh5ZHJhdGlvbkJhaWxlZCA9IGZhbHNlOwogIC8vIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IGNhbiBza2lwIGNyZWF0ZSBob29rIGR1cmluZyBoeWRyYXRpb24gYmVjYXVzZSB0aGV5CiAgLy8gYXJlIGFscmVhZHkgcmVuZGVyZWQgb24gdGhlIGNsaWVudCBvciBoYXMgbm8gbmVlZCBmb3IgaW5pdGlhbGl6YXRpb24KICAvLyBOb3RlOiBzdHlsZSBpcyBleGNsdWRlZCBiZWNhdXNlIGl0IHJlbGllcyBvbiBpbml0aWFsIGNsb25lIGZvciBmdXR1cmUKICAvLyBkZWVwIHVwZGF0ZXMgKCM3MDYzKS4KICB2YXIgaXNSZW5kZXJlZE1vZHVsZSA9IG1ha2VNYXAoJ2F0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleScpOwoKICAvLyBOb3RlOiB0aGlzIGlzIGEgYnJvd3Nlci1vbmx5IGZ1bmN0aW9uIHNvIHdlIGNhbiBhc3N1bWUgZWxtcyBhcmUgRE9NIG5vZGVzLgogIGZ1bmN0aW9uIGh5ZHJhdGUgKGVsbSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaW5WUHJlKSB7CiAgICB2YXIgaTsKICAgIHZhciB0YWcgPSB2bm9kZS50YWc7CiAgICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7CiAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjsKICAgIGluVlByZSA9IGluVlByZSB8fCAoZGF0YSAmJiBkYXRhLnByZSk7CiAgICB2bm9kZS5lbG0gPSBlbG07CgogICAgaWYgKGlzVHJ1ZSh2bm9kZS5pc0NvbW1lbnQpICYmIGlzRGVmKHZub2RlLmFzeW5jRmFjdG9yeSkpIHsKICAgICAgdm5vZGUuaXNBc3luY1BsYWNlaG9sZGVyID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICAgIC8vIGFzc2VydCBub2RlIG1hdGNoCiAgICB7CiAgICAgIGlmICghYXNzZXJ0Tm9kZU1hdGNoKGVsbSwgdm5vZGUsIGluVlByZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgfQogICAgfQogICAgaWYgKGlzRGVmKGRhdGEpKSB7CiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5pbml0KSkgeyBpKHZub2RlLCB0cnVlIC8qIGh5ZHJhdGluZyAqLyk7IH0KICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkpIHsKICAgICAgICAvLyBjaGlsZCBjb21wb25lbnQuIGl0IHNob3VsZCBoYXZlIGh5ZHJhdGVkIGl0cyBvd24gdHJlZS4KICAgICAgICBpbml0Q29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpOwogICAgICAgIHJldHVybiB0cnVlCiAgICAgIH0KICAgIH0KICAgIGlmIChpc0RlZih0YWcpKSB7CiAgICAgIGlmIChpc0RlZihjaGlsZHJlbikpIHsKICAgICAgICAvLyBlbXB0eSBlbGVtZW50LCBhbGxvdyBjbGllbnQgdG8gcGljayB1cCBhbmQgcG9wdWxhdGUgY2hpbGRyZW4KICAgICAgICBpZiAoIWVsbS5oYXNDaGlsZE5vZGVzKCkpIHsKICAgICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gdi1odG1sIGFuZCBkb21Qcm9wczogaW5uZXJIVE1MCiAgICAgICAgICBpZiAoaXNEZWYoaSA9IGRhdGEpICYmIGlzRGVmKGkgPSBpLmRvbVByb3BzKSAmJiBpc0RlZihpID0gaS5pbm5lckhUTUwpKSB7CiAgICAgICAgICAgIGlmIChpICE9PSBlbG0uaW5uZXJIVE1MKSB7CiAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgICAhaHlkcmF0aW9uQmFpbGVkCiAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBoeWRyYXRpb25CYWlsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdQYXJlbnQ6ICcsIGVsbSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ3NlcnZlciBpbm5lckhUTUw6ICcsIGkpOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdjbGllbnQgaW5uZXJIVE1MOiAnLCBlbG0uaW5uZXJIVE1MKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGl0ZXJhdGUgYW5kIGNvbXBhcmUgY2hpbGRyZW4gbGlzdHMKICAgICAgICAgICAgdmFyIGNoaWxkcmVuTWF0Y2ggPSB0cnVlOwogICAgICAgICAgICB2YXIgY2hpbGROb2RlID0gZWxtLmZpcnN0Q2hpbGQ7CiAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNoaWxkcmVuLmxlbmd0aDsgaSQxKyspIHsKICAgICAgICAgICAgICBpZiAoIWNoaWxkTm9kZSB8fCAhaHlkcmF0ZShjaGlsZE5vZGUsIGNoaWxkcmVuW2kkMV0sIGluc2VydGVkVm5vZGVRdWV1ZSwgaW5WUHJlKSkgewogICAgICAgICAgICAgICAgY2hpbGRyZW5NYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGlmIGNoaWxkTm9kZSBpcyBub3QgbnVsbCwgaXQgbWVhbnMgdGhlIGFjdHVhbCBjaGlsZE5vZGVzIGxpc3QgaXMKICAgICAgICAgICAgLy8gbG9uZ2VyIHRoYW4gdGhlIHZpcnR1YWwgY2hpbGRyZW4gbGlzdC4KICAgICAgICAgICAgaWYgKCFjaGlsZHJlbk1hdGNoIHx8IGNoaWxkTm9kZSkgewogICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICAgIWh5ZHJhdGlvbkJhaWxlZAogICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgaHlkcmF0aW9uQmFpbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUGFyZW50OiAnLCBlbG0pOwogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNaXNtYXRjaGluZyBjaGlsZE5vZGVzIHZzLiBWTm9kZXM6ICcsIGVsbS5jaGlsZE5vZGVzLCBjaGlsZHJlbik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBmYWxzZQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpc0RlZihkYXRhKSkgewogICAgICAgIHZhciBmdWxsSW52b2tlID0gZmFsc2U7CiAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICAgIGlmICghaXNSZW5kZXJlZE1vZHVsZShrZXkpKSB7CiAgICAgICAgICAgIGZ1bGxJbnZva2UgPSB0cnVlOwogICAgICAgICAgICBpbnZva2VDcmVhdGVIb29rcyh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTsKICAgICAgICAgICAgYnJlYWsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFmdWxsSW52b2tlICYmIGRhdGFbJ2NsYXNzJ10pIHsKICAgICAgICAgIC8vIGVuc3VyZSBjb2xsZWN0aW5nIGRlcHMgZm9yIGRlZXAgY2xhc3MgYmluZGluZ3MgZm9yIGZ1dHVyZSB1cGRhdGVzCiAgICAgICAgICB0cmF2ZXJzZShkYXRhWydjbGFzcyddKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWxtLmRhdGEgIT09IHZub2RlLnRleHQpIHsKICAgICAgZWxtLmRhdGEgPSB2bm9kZS50ZXh0OwogICAgfQogICAgcmV0dXJuIHRydWUKICB9CgogIGZ1bmN0aW9uIGFzc2VydE5vZGVNYXRjaCAobm9kZSwgdm5vZGUsIGluVlByZSkgewogICAgaWYgKGlzRGVmKHZub2RlLnRhZykpIHsKICAgICAgcmV0dXJuIHZub2RlLnRhZy5pbmRleE9mKCd2dWUtY29tcG9uZW50JykgPT09IDAgfHwgKAogICAgICAgICFpc1Vua25vd25FbGVtZW50JCQxKHZub2RlLCBpblZQcmUpICYmCiAgICAgICAgdm5vZGUudGFnLnRvTG93ZXJDYXNlKCkgPT09IChub2RlLnRhZ05hbWUgJiYgbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpCiAgICAgICkKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAodm5vZGUuaXNDb21tZW50ID8gOCA6IDMpCiAgICB9CiAgfQoKICByZXR1cm4gZnVuY3Rpb24gcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSwgaHlkcmF0aW5nLCByZW1vdmVPbmx5LCBwYXJlbnRFbG0sIHJlZkVsbSkgewogICAgaWYgKGlzVW5kZWYodm5vZGUpKSB7CiAgICAgIGlmIChpc0RlZihvbGRWbm9kZSkpIHsgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOyB9CiAgICAgIHJldHVybgogICAgfQoKICAgIHZhciBpc0luaXRpYWxQYXRjaCA9IGZhbHNlOwogICAgdmFyIGluc2VydGVkVm5vZGVRdWV1ZSA9IFtdOwoKICAgIGlmIChpc1VuZGVmKG9sZFZub2RlKSkgewogICAgICAvLyBlbXB0eSBtb3VudCAobGlrZWx5IGFzIGNvbXBvbmVudCksIGNyZWF0ZSBuZXcgcm9vdCBlbGVtZW50CiAgICAgIGlzSW5pdGlhbFBhdGNoID0gdHJ1ZTsKICAgICAgY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBpc1JlYWxFbGVtZW50ID0gaXNEZWYob2xkVm5vZGUubm9kZVR5cGUpOwogICAgICBpZiAoIWlzUmVhbEVsZW1lbnQgJiYgc2FtZVZub2RlKG9sZFZub2RlLCB2bm9kZSkpIHsKICAgICAgICAvLyBwYXRjaCBleGlzdGluZyByb290IG5vZGUKICAgICAgICBwYXRjaFZub2RlKG9sZFZub2RlLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaXNSZWFsRWxlbWVudCkgewogICAgICAgICAgLy8gbW91bnRpbmcgdG8gYSByZWFsIGVsZW1lbnQKICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQgYW5kIGlmIHdlIGNhbiBwZXJmb3JtCiAgICAgICAgICAvLyBhIHN1Y2Nlc3NmdWwgaHlkcmF0aW9uLgogICAgICAgICAgaWYgKG9sZFZub2RlLm5vZGVUeXBlID09PSAxICYmIG9sZFZub2RlLmhhc0F0dHJpYnV0ZShTU1JfQVRUUikpIHsKICAgICAgICAgICAgb2xkVm5vZGUucmVtb3ZlQXR0cmlidXRlKFNTUl9BVFRSKTsKICAgICAgICAgICAgaHlkcmF0aW5nID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc1RydWUoaHlkcmF0aW5nKSkgewogICAgICAgICAgICBpZiAoaHlkcmF0ZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkpIHsKICAgICAgICAgICAgICBpbnZva2VJbnNlcnRIb29rKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHRydWUpOwogICAgICAgICAgICAgIHJldHVybiBvbGRWbm9kZQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHdhcm4oCiAgICAgICAgICAgICAgICAnVGhlIGNsaWVudC1zaWRlIHJlbmRlcmVkIHZpcnR1YWwgRE9NIHRyZWUgaXMgbm90IG1hdGNoaW5nICcgKwogICAgICAgICAgICAgICAgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgaW5jb3JyZWN0ICcgKwogICAgICAgICAgICAgICAgJ0hUTUwgbWFya3VwLCBmb3IgZXhhbXBsZSBuZXN0aW5nIGJsb2NrLWxldmVsIGVsZW1lbnRzIGluc2lkZSAnICsKICAgICAgICAgICAgICAgICc8cD4sIG9yIG1pc3NpbmcgPHRib2R5Pi4gQmFpbGluZyBoeWRyYXRpb24gYW5kIHBlcmZvcm1pbmcgJyArCiAgICAgICAgICAgICAgICAnZnVsbCBjbGllbnQtc2lkZSByZW5kZXIuJwogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8vIGVpdGhlciBub3Qgc2VydmVyLXJlbmRlcmVkLCBvciBoeWRyYXRpb24gZmFpbGVkLgogICAgICAgICAgLy8gY3JlYXRlIGFuIGVtcHR5IG5vZGUgYW5kIHJlcGxhY2UgaXQKICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVwbGFjaW5nIGV4aXN0aW5nIGVsZW1lbnQKICAgICAgICB2YXIgb2xkRWxtID0gb2xkVm5vZGUuZWxtOwogICAgICAgIHZhciBwYXJlbnRFbG0kMSA9IG5vZGVPcHMucGFyZW50Tm9kZShvbGRFbG0pOwoKICAgICAgICAvLyBjcmVhdGUgbmV3IG5vZGUKICAgICAgICBjcmVhdGVFbG0oCiAgICAgICAgICB2bm9kZSwKICAgICAgICAgIGluc2VydGVkVm5vZGVRdWV1ZSwKICAgICAgICAgIC8vIGV4dHJlbWVseSByYXJlIGVkZ2UgY2FzZTogZG8gbm90IGluc2VydCBpZiBvbGQgZWxlbWVudCBpcyBpbiBhCiAgICAgICAgICAvLyBsZWF2aW5nIHRyYW5zaXRpb24uIE9ubHkgaGFwcGVucyB3aGVuIGNvbWJpbmluZyB0cmFuc2l0aW9uICsKICAgICAgICAgIC8vIGtlZXAtYWxpdmUgKyBIT0NzLiAoIzQ1OTApCiAgICAgICAgICBvbGRFbG0uX2xlYXZlQ2IgPyBudWxsIDogcGFyZW50RWxtJDEsCiAgICAgICAgICBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVsbSkKICAgICAgICApOwoKICAgICAgICAvLyB1cGRhdGUgcGFyZW50IHBsYWNlaG9sZGVyIG5vZGUgZWxlbWVudCwgcmVjdXJzaXZlbHkKICAgICAgICBpZiAoaXNEZWYodm5vZGUucGFyZW50KSkgewogICAgICAgICAgdmFyIGFuY2VzdG9yID0gdm5vZGUucGFyZW50OwogICAgICAgICAgdmFyIHBhdGNoYWJsZSA9IGlzUGF0Y2hhYmxlKHZub2RlKTsKICAgICAgICAgIHdoaWxlIChhbmNlc3RvcikgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgY2JzLmRlc3Ryb3lbaV0oYW5jZXN0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFuY2VzdG9yLmVsbSA9IHZub2RlLmVsbTsKICAgICAgICAgICAgaWYgKHBhdGNoYWJsZSkgewogICAgICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkgewogICAgICAgICAgICAgICAgY2JzLmNyZWF0ZVtpJDFdKGVtcHR5Tm9kZSwgYW5jZXN0b3IpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyAjNjUxMwogICAgICAgICAgICAgIC8vIGludm9rZSBpbnNlcnQgaG9va3MgdGhhdCBtYXkgaGF2ZSBiZWVuIG1lcmdlZCBieSBjcmVhdGUgaG9va3MuCiAgICAgICAgICAgICAgLy8gZS5nLiBmb3IgZGlyZWN0aXZlcyB0aGF0IHVzZXMgdGhlICJpbnNlcnRlZCIgaG9vay4KICAgICAgICAgICAgICB2YXIgaW5zZXJ0ID0gYW5jZXN0b3IuZGF0YS5ob29rLmluc2VydDsKICAgICAgICAgICAgICBpZiAoaW5zZXJ0Lm1lcmdlZCkgewogICAgICAgICAgICAgICAgLy8gc3RhcnQgYXQgaW5kZXggMSB0byBhdm9pZCByZS1pbnZva2luZyBjb21wb25lbnQgbW91bnRlZCBob29rCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpJDIgPSAxOyBpJDIgPCBpbnNlcnQuZm5zLmxlbmd0aDsgaSQyKyspIHsKICAgICAgICAgICAgICAgICAgaW5zZXJ0LmZuc1tpJDJdKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlZ2lzdGVyUmVmKGFuY2VzdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGRlc3Ryb3kgb2xkIG5vZGUKICAgICAgICBpZiAoaXNEZWYocGFyZW50RWxtJDEpKSB7CiAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50RWxtJDEsIFtvbGRWbm9kZV0sIDAsIDApOwogICAgICAgIH0gZWxzZSBpZiAoaXNEZWYob2xkVm5vZGUudGFnKSkgewogICAgICAgICAgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGludm9rZUluc2VydEhvb2sodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgaXNJbml0aWFsUGF0Y2gpOwogICAgcmV0dXJuIHZub2RlLmVsbQogIH0KfQoKLyogICovCgp2YXIgZGlyZWN0aXZlcyA9IHsKICBjcmVhdGU6IHVwZGF0ZURpcmVjdGl2ZXMsCiAgdXBkYXRlOiB1cGRhdGVEaXJlY3RpdmVzLAogIGRlc3Ryb3k6IGZ1bmN0aW9uIHVuYmluZERpcmVjdGl2ZXMgKHZub2RlKSB7CiAgICB1cGRhdGVEaXJlY3RpdmVzKHZub2RlLCBlbXB0eU5vZGUpOwogIH0KfQoKZnVuY3Rpb24gdXBkYXRlRGlyZWN0aXZlcyAob2xkVm5vZGUsIHZub2RlKSB7CiAgaWYgKG9sZFZub2RlLmRhdGEuZGlyZWN0aXZlcyB8fCB2bm9kZS5kYXRhLmRpcmVjdGl2ZXMpIHsKICAgIF91cGRhdGUob2xkVm5vZGUsIHZub2RlKTsKICB9Cn0KCmZ1bmN0aW9uIF91cGRhdGUgKG9sZFZub2RlLCB2bm9kZSkgewogIHZhciBpc0NyZWF0ZSA9IG9sZFZub2RlID09PSBlbXB0eU5vZGU7CiAgdmFyIGlzRGVzdHJveSA9IHZub2RlID09PSBlbXB0eU5vZGU7CiAgdmFyIG9sZERpcnMgPSBub3JtYWxpemVEaXJlY3RpdmVzJDEob2xkVm5vZGUuZGF0YS5kaXJlY3RpdmVzLCBvbGRWbm9kZS5jb250ZXh0KTsKICB2YXIgbmV3RGlycyA9IG5vcm1hbGl6ZURpcmVjdGl2ZXMkMSh2bm9kZS5kYXRhLmRpcmVjdGl2ZXMsIHZub2RlLmNvbnRleHQpOwoKICB2YXIgZGlyc1dpdGhJbnNlcnQgPSBbXTsKICB2YXIgZGlyc1dpdGhQb3N0cGF0Y2ggPSBbXTsKCiAgdmFyIGtleSwgb2xkRGlyLCBkaXI7CiAgZm9yIChrZXkgaW4gbmV3RGlycykgewogICAgb2xkRGlyID0gb2xkRGlyc1trZXldOwogICAgZGlyID0gbmV3RGlyc1trZXldOwogICAgaWYgKCFvbGREaXIpIHsKICAgICAgLy8gbmV3IGRpcmVjdGl2ZSwgYmluZAogICAgICBjYWxsSG9vayQxKGRpciwgJ2JpbmQnLCB2bm9kZSwgb2xkVm5vZGUpOwogICAgICBpZiAoZGlyLmRlZiAmJiBkaXIuZGVmLmluc2VydGVkKSB7CiAgICAgICAgZGlyc1dpdGhJbnNlcnQucHVzaChkaXIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBleGlzdGluZyBkaXJlY3RpdmUsIHVwZGF0ZQogICAgICBkaXIub2xkVmFsdWUgPSBvbGREaXIudmFsdWU7CiAgICAgIGNhbGxIb29rJDEoZGlyLCAndXBkYXRlJywgdm5vZGUsIG9sZFZub2RlKTsKICAgICAgaWYgKGRpci5kZWYgJiYgZGlyLmRlZi5jb21wb25lbnRVcGRhdGVkKSB7CiAgICAgICAgZGlyc1dpdGhQb3N0cGF0Y2gucHVzaChkaXIpOwogICAgICB9CiAgICB9CiAgfQoKICBpZiAoZGlyc1dpdGhJbnNlcnQubGVuZ3RoKSB7CiAgICB2YXIgY2FsbEluc2VydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXJzV2l0aEluc2VydC5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxIb29rJDEoZGlyc1dpdGhJbnNlcnRbaV0sICdpbnNlcnRlZCcsIHZub2RlLCBvbGRWbm9kZSk7CiAgICAgIH0KICAgIH07CiAgICBpZiAoaXNDcmVhdGUpIHsKICAgICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBjYWxsSW5zZXJ0KTsKICAgIH0gZWxzZSB7CiAgICAgIGNhbGxJbnNlcnQoKTsKICAgIH0KICB9CgogIGlmIChkaXJzV2l0aFBvc3RwYXRjaC5sZW5ndGgpIHsKICAgIG1lcmdlVk5vZGVIb29rKHZub2RlLCAncG9zdHBhdGNoJywgZnVuY3Rpb24gKCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnNXaXRoUG9zdHBhdGNoLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aFBvc3RwYXRjaFtpXSwgJ2NvbXBvbmVudFVwZGF0ZWQnLCB2bm9kZSwgb2xkVm5vZGUpOwogICAgICB9CiAgICB9KTsKICB9CgogIGlmICghaXNDcmVhdGUpIHsKICAgIGZvciAoa2V5IGluIG9sZERpcnMpIHsKICAgICAgaWYgKCFuZXdEaXJzW2tleV0pIHsKICAgICAgICAvLyBubyBsb25nZXIgcHJlc2VudCwgdW5iaW5kCiAgICAgICAgY2FsbEhvb2skMShvbGREaXJzW2tleV0sICd1bmJpbmQnLCBvbGRWbm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCnZhciBlbXB0eU1vZGlmaWVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CgpmdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzJDEgKAogIGRpcnMsCiAgdm0KKSB7CiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgaWYgKCFkaXJzKSB7CiAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgIHJldHVybiByZXMKICB9CiAgdmFyIGksIGRpcjsKICBmb3IgKGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykgewogICAgZGlyID0gZGlyc1tpXTsKICAgIGlmICghZGlyLm1vZGlmaWVycykgewogICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUKICAgICAgZGlyLm1vZGlmaWVycyA9IGVtcHR5TW9kaWZpZXJzOwogICAgfQogICAgcmVzW2dldFJhd0Rpck5hbWUoZGlyKV0gPSBkaXI7CiAgICBkaXIuZGVmID0gcmVzb2x2ZUFzc2V0KHZtLiRvcHRpb25zLCAnZGlyZWN0aXZlcycsIGRpci5uYW1lLCB0cnVlKTsKICB9CiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgcmV0dXJuIHJlcwp9CgpmdW5jdGlvbiBnZXRSYXdEaXJOYW1lIChkaXIpIHsKICByZXR1cm4gZGlyLnJhd05hbWUgfHwgKChkaXIubmFtZSkgKyAiLiIgKyAoT2JqZWN0LmtleXMoZGlyLm1vZGlmaWVycyB8fCB7fSkuam9pbignLicpKSkKfQoKZnVuY3Rpb24gY2FsbEhvb2skMSAoZGlyLCBob29rLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSkgewogIHZhciBmbiA9IGRpci5kZWYgJiYgZGlyLmRlZltob29rXTsKICBpZiAoZm4pIHsKICAgIHRyeSB7CiAgICAgIGZuKHZub2RlLmVsbSwgZGlyLCB2bm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGhhbmRsZUVycm9yKGUsIHZub2RlLmNvbnRleHQsICgiZGlyZWN0aXZlICIgKyAoZGlyLm5hbWUpICsgIiAiICsgaG9vayArICIgaG9vayIpKTsKICAgIH0KICB9Cn0KCnZhciBiYXNlTW9kdWxlcyA9IFsKICByZWYsCiAgZGlyZWN0aXZlcwpdCgovKiAgKi8KCmZ1bmN0aW9uIHVwZGF0ZUF0dHJzIChvbGRWbm9kZSwgdm5vZGUpIHsKICB2YXIgb3B0cyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7CiAgaWYgKGlzRGVmKG9wdHMpICYmIG9wdHMuQ3Rvci5vcHRpb25zLmluaGVyaXRBdHRycyA9PT0gZmFsc2UpIHsKICAgIHJldHVybgogIH0KICBpZiAoaXNVbmRlZihvbGRWbm9kZS5kYXRhLmF0dHJzKSAmJiBpc1VuZGVmKHZub2RlLmRhdGEuYXR0cnMpKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIGtleSwgY3VyLCBvbGQ7CiAgdmFyIGVsbSA9IHZub2RlLmVsbTsKICB2YXIgb2xkQXR0cnMgPSBvbGRWbm9kZS5kYXRhLmF0dHJzIHx8IHt9OwogIHZhciBhdHRycyA9IHZub2RlLmRhdGEuYXR0cnMgfHwge307CiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0CiAgaWYgKGlzRGVmKGF0dHJzLl9fb2JfXykpIHsKICAgIGF0dHJzID0gdm5vZGUuZGF0YS5hdHRycyA9IGV4dGVuZCh7fSwgYXR0cnMpOwogIH0KCiAgZm9yIChrZXkgaW4gYXR0cnMpIHsKICAgIGN1ciA9IGF0dHJzW2tleV07CiAgICBvbGQgPSBvbGRBdHRyc1trZXldOwogICAgaWYgKG9sZCAhPT0gY3VyKSB7CiAgICAgIHNldEF0dHIoZWxtLCBrZXksIGN1cik7CiAgICB9CiAgfQogIC8vICM0MzkxOiBpbiBJRTksIHNldHRpbmcgdHlwZSBjYW4gcmVzZXQgdmFsdWUgZm9yIGlucHV0W3R5cGU9cmFkaW9dCiAgLy8gIzY2NjY6IElFL0VkZ2UgZm9yY2VzIHByb2dyZXNzIHZhbHVlIGRvd24gdG8gMSBiZWZvcmUgc2V0dGluZyBhIG1heAogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmICgoaXNJRSB8fCBpc0VkZ2UpICYmIGF0dHJzLnZhbHVlICE9PSBvbGRBdHRycy52YWx1ZSkgewogICAgc2V0QXR0cihlbG0sICd2YWx1ZScsIGF0dHJzLnZhbHVlKTsKICB9CiAgZm9yIChrZXkgaW4gb2xkQXR0cnMpIHsKICAgIGlmIChpc1VuZGVmKGF0dHJzW2tleV0pKSB7CiAgICAgIGlmIChpc1hsaW5rKGtleSkpIHsKICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywgZ2V0WGxpbmtQcm9wKGtleSkpOwogICAgICB9IGVsc2UgaWYgKCFpc0VudW1lcmF0ZWRBdHRyKGtleSkpIHsKICAgICAgICBlbG0ucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHNldEF0dHIgKGVsLCBrZXksIHZhbHVlKSB7CiAgaWYgKGVsLnRhZ05hbWUuaW5kZXhPZignLScpID4gLTEpIHsKICAgIGJhc2VTZXRBdHRyKGVsLCBrZXksIHZhbHVlKTsKICB9IGVsc2UgaWYgKGlzQm9vbGVhbkF0dHIoa2V5KSkgewogICAgLy8gc2V0IGF0dHJpYnV0ZSBmb3IgYmxhbmsgdmFsdWUKICAgIC8vIGUuZy4gPG9wdGlvbiBkaXNhYmxlZD5TZWxlY3Qgb25lPC9vcHRpb24+CiAgICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsKICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGtleSk7CiAgICB9IGVsc2UgewogICAgICAvLyB0ZWNobmljYWxseSBhbGxvd2Z1bGxzY3JlZW4gaXMgYSBib29sZWFuIGF0dHJpYnV0ZSBmb3IgPGlmcmFtZT4sCiAgICAgIC8vIGJ1dCBGbGFzaCBleHBlY3RzIGEgdmFsdWUgb2YgInRydWUiIHdoZW4gdXNlZCBvbiA8ZW1iZWQ+IHRhZwogICAgICB2YWx1ZSA9IGtleSA9PT0gJ2FsbG93ZnVsbHNjcmVlbicgJiYgZWwudGFnTmFtZSA9PT0gJ0VNQkVEJwogICAgICAgID8gJ3RydWUnCiAgICAgICAgOiBrZXk7CiAgICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKICAgIH0KICB9IGVsc2UgaWYgKGlzRW51bWVyYXRlZEF0dHIoa2V5KSkgewogICAgZWwuc2V0QXR0cmlidXRlKGtleSwgaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkgfHwgdmFsdWUgPT09ICdmYWxzZScgPyAnZmFsc2UnIDogJ3RydWUnKTsKICB9IGVsc2UgaWYgKGlzWGxpbmsoa2V5KSkgewogICAgaWYgKGlzRmFsc3lBdHRyVmFsdWUodmFsdWUpKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZU5TKHhsaW5rTlMsIGdldFhsaW5rUHJvcChrZXkpKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLnNldEF0dHJpYnV0ZU5TKHhsaW5rTlMsIGtleSwgdmFsdWUpOwogICAgfQogIH0gZWxzZSB7CiAgICBiYXNlU2V0QXR0cihlbCwga2V5LCB2YWx1ZSk7CiAgfQp9CgpmdW5jdGlvbiBiYXNlU2V0QXR0ciAoZWwsIGtleSwgdmFsdWUpIHsKICBpZiAoaXNGYWxzeUF0dHJWYWx1ZSh2YWx1ZSkpIHsKICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpOwogIH0gZWxzZSB7CiAgICAvLyAjNzEzODogSUUxMCAmIDExIGZpcmVzIGlucHV0IGV2ZW50IHdoZW4gc2V0dGluZyBwbGFjZWhvbGRlciBvbgogICAgLy8gPHRleHRhcmVhPi4uLiBibG9jayB0aGUgZmlyc3QgaW5wdXQgZXZlbnQgYW5kIHJlbW92ZSB0aGUgYmxvY2tlcgogICAgLy8gaW1tZWRpYXRlbHkuCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmICgKICAgICAgaXNJRSAmJiAhaXNJRTkgJiYKICAgICAgZWwudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyAmJgogICAgICBrZXkgPT09ICdwbGFjZWhvbGRlcicgJiYgIWVsLl9faWVwaAogICAgKSB7CiAgICAgIHZhciBibG9ja2VyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7CiAgICAgIH07CiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgYmxvY2tlcik7CiAgICAgIC8vICRmbG93LWRpc2FibGUtbGluZQogICAgICBlbC5fX2llcGggPSB0cnVlOyAvKiBJRSBwbGFjZWhvbGRlciBwYXRjaGVkICovCiAgICB9CiAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7CiAgfQp9Cgp2YXIgYXR0cnMgPSB7CiAgY3JlYXRlOiB1cGRhdGVBdHRycywKICB1cGRhdGU6IHVwZGF0ZUF0dHJzCn0KCi8qICAqLwoKZnVuY3Rpb24gdXBkYXRlQ2xhc3MgKG9sZFZub2RlLCB2bm9kZSkgewogIHZhciBlbCA9IHZub2RlLmVsbTsKICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7CiAgdmFyIG9sZERhdGEgPSBvbGRWbm9kZS5kYXRhOwogIGlmICgKICAgIGlzVW5kZWYoZGF0YS5zdGF0aWNDbGFzcykgJiYKICAgIGlzVW5kZWYoZGF0YS5jbGFzcykgJiYgKAogICAgICBpc1VuZGVmKG9sZERhdGEpIHx8ICgKICAgICAgICBpc1VuZGVmKG9sZERhdGEuc3RhdGljQ2xhc3MpICYmCiAgICAgICAgaXNVbmRlZihvbGREYXRhLmNsYXNzKQogICAgICApCiAgICApCiAgKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBjbHMgPSBnZW5DbGFzc0ZvclZub2RlKHZub2RlKTsKCiAgLy8gaGFuZGxlIHRyYW5zaXRpb24gY2xhc3NlcwogIHZhciB0cmFuc2l0aW9uQ2xhc3MgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXM7CiAgaWYgKGlzRGVmKHRyYW5zaXRpb25DbGFzcykpIHsKICAgIGNscyA9IGNvbmNhdChjbHMsIHN0cmluZ2lmeUNsYXNzKHRyYW5zaXRpb25DbGFzcykpOwogIH0KCiAgLy8gc2V0IHRoZSBjbGFzcwogIGlmIChjbHMgIT09IGVsLl9wcmV2Q2xhc3MpIHsKICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBjbHMpOwogICAgZWwuX3ByZXZDbGFzcyA9IGNsczsKICB9Cn0KCnZhciBrbGFzcyA9IHsKICBjcmVhdGU6IHVwZGF0ZUNsYXNzLAogIHVwZGF0ZTogdXBkYXRlQ2xhc3MKfQoKLyogICovCgp2YXIgdmFsaWREaXZpc2lvbkNoYXJSRSA9IC9bXHcpLitcLV8kXF1dLzsKCmZ1bmN0aW9uIHBhcnNlRmlsdGVycyAoZXhwKSB7CiAgdmFyIGluU2luZ2xlID0gZmFsc2U7CiAgdmFyIGluRG91YmxlID0gZmFsc2U7CiAgdmFyIGluVGVtcGxhdGVTdHJpbmcgPSBmYWxzZTsKICB2YXIgaW5SZWdleCA9IGZhbHNlOwogIHZhciBjdXJseSA9IDA7CiAgdmFyIHNxdWFyZSA9IDA7CiAgdmFyIHBhcmVuID0gMDsKICB2YXIgbGFzdEZpbHRlckluZGV4ID0gMDsKICB2YXIgYywgcHJldiwgaSwgZXhwcmVzc2lvbiwgZmlsdGVyczsKCiAgZm9yIChpID0gMDsgaSA8IGV4cC5sZW5ndGg7IGkrKykgewogICAgcHJldiA9IGM7CiAgICBjID0gZXhwLmNoYXJDb2RlQXQoaSk7CiAgICBpZiAoaW5TaW5nbGUpIHsKICAgICAgaWYgKGMgPT09IDB4MjcgJiYgcHJldiAhPT0gMHg1QykgeyBpblNpbmdsZSA9IGZhbHNlOyB9CiAgICB9IGVsc2UgaWYgKGluRG91YmxlKSB7CiAgICAgIGlmIChjID09PSAweDIyICYmIHByZXYgIT09IDB4NUMpIHsgaW5Eb3VibGUgPSBmYWxzZTsgfQogICAgfSBlbHNlIGlmIChpblRlbXBsYXRlU3RyaW5nKSB7CiAgICAgIGlmIChjID09PSAweDYwICYmIHByZXYgIT09IDB4NUMpIHsgaW5UZW1wbGF0ZVN0cmluZyA9IGZhbHNlOyB9CiAgICB9IGVsc2UgaWYgKGluUmVnZXgpIHsKICAgICAgaWYgKGMgPT09IDB4MmYgJiYgcHJldiAhPT0gMHg1QykgeyBpblJlZ2V4ID0gZmFsc2U7IH0KICAgIH0gZWxzZSBpZiAoCiAgICAgIGMgPT09IDB4N0MgJiYgLy8gcGlwZQogICAgICBleHAuY2hhckNvZGVBdChpICsgMSkgIT09IDB4N0MgJiYKICAgICAgZXhwLmNoYXJDb2RlQXQoaSAtIDEpICE9PSAweDdDICYmCiAgICAgICFjdXJseSAmJiAhc3F1YXJlICYmICFwYXJlbgogICAgKSB7CiAgICAgIGlmIChleHByZXNzaW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBmaXJzdCBmaWx0ZXIsIGVuZCBvZiBleHByZXNzaW9uCiAgICAgICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7CiAgICAgICAgZXhwcmVzc2lvbiA9IGV4cC5zbGljZSgwLCBpKS50cmltKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHVzaEZpbHRlcigpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICBjYXNlIDB4MjI6IGluRG91YmxlID0gdHJ1ZTsgYnJlYWsgICAgICAgICAvLyAiCiAgICAgICAgY2FzZSAweDI3OiBpblNpbmdsZSA9IHRydWU7IGJyZWFrICAgICAgICAgLy8gJwogICAgICAgIGNhc2UgMHg2MDogaW5UZW1wbGF0ZVN0cmluZyA9IHRydWU7IGJyZWFrIC8vIGAKICAgICAgICBjYXNlIDB4Mjg6IHBhcmVuKys7IGJyZWFrICAgICAgICAgICAgICAgICAvLyAoCiAgICAgICAgY2FzZSAweDI5OiBwYXJlbi0tOyBicmVhayAgICAgICAgICAgICAgICAgLy8gKQogICAgICAgIGNhc2UgMHg1Qjogc3F1YXJlKys7IGJyZWFrICAgICAgICAgICAgICAgIC8vIFsKICAgICAgICBjYXNlIDB4NUQ6IHNxdWFyZS0tOyBicmVhayAgICAgICAgICAgICAgICAvLyBdCiAgICAgICAgY2FzZSAweDdCOiBjdXJseSsrOyBicmVhayAgICAgICAgICAgICAgICAgLy8gewogICAgICAgIGNhc2UgMHg3RDogY3VybHktLTsgYnJlYWsgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgfQogICAgICBpZiAoYyA9PT0gMHgyZikgeyAvLyAvCiAgICAgICAgdmFyIGogPSBpIC0gMTsKICAgICAgICB2YXIgcCA9ICh2b2lkIDApOwogICAgICAgIC8vIGZpbmQgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgcHJldiBjaGFyCiAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7CiAgICAgICAgICBwID0gZXhwLmNoYXJBdChqKTsKICAgICAgICAgIGlmIChwICE9PSAnICcpIHsgYnJlYWsgfQogICAgICAgIH0KICAgICAgICBpZiAoIXAgfHwgIXZhbGlkRGl2aXNpb25DaGFyUkUudGVzdChwKSkgewogICAgICAgICAgaW5SZWdleCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBpZiAoZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICBleHByZXNzaW9uID0gZXhwLnNsaWNlKDAsIGkpLnRyaW0oKTsKICB9IGVsc2UgaWYgKGxhc3RGaWx0ZXJJbmRleCAhPT0gMCkgewogICAgcHVzaEZpbHRlcigpOwogIH0KCiAgZnVuY3Rpb24gcHVzaEZpbHRlciAoKSB7CiAgICAoZmlsdGVycyB8fCAoZmlsdGVycyA9IFtdKSkucHVzaChleHAuc2xpY2UobGFzdEZpbHRlckluZGV4LCBpKS50cmltKCkpOwogICAgbGFzdEZpbHRlckluZGV4ID0gaSArIDE7CiAgfQoKICBpZiAoZmlsdGVycykgewogICAgZm9yIChpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgZXhwcmVzc2lvbiA9IHdyYXBGaWx0ZXIoZXhwcmVzc2lvbiwgZmlsdGVyc1tpXSk7CiAgICB9CiAgfQoKICByZXR1cm4gZXhwcmVzc2lvbgp9CgpmdW5jdGlvbiB3cmFwRmlsdGVyIChleHAsIGZpbHRlcikgewogIHZhciBpID0gZmlsdGVyLmluZGV4T2YoJygnKTsKICBpZiAoaSA8IDApIHsKICAgIC8vIF9mOiByZXNvbHZlRmlsdGVyCiAgICByZXR1cm4gKCJfZihcIiIgKyBmaWx0ZXIgKyAiXCIpKCIgKyBleHAgKyAiKSIpCiAgfSBlbHNlIHsKICAgIHZhciBuYW1lID0gZmlsdGVyLnNsaWNlKDAsIGkpOwogICAgdmFyIGFyZ3MgPSBmaWx0ZXIuc2xpY2UoaSArIDEpOwogICAgcmV0dXJuICgiX2YoXCIiICsgbmFtZSArICJcIikoIiArIGV4cCArIChhcmdzICE9PSAnKScgPyAnLCcgKyBhcmdzIDogYXJncykpCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGJhc2VXYXJuIChtc2cpIHsKICBjb25zb2xlLmVycm9yKCgiW1Z1ZSBjb21waWxlcl06ICIgKyBtc2cpKTsKfQoKZnVuY3Rpb24gcGx1Y2tNb2R1bGVGdW5jdGlvbiAoCiAgbW9kdWxlcywKICBrZXkKKSB7CiAgcmV0dXJuIG1vZHVsZXMKICAgID8gbW9kdWxlcy5tYXAoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG1ba2V5XTsgfSkuZmlsdGVyKGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9KQogICAgOiBbXQp9CgpmdW5jdGlvbiBhZGRQcm9wIChlbCwgbmFtZSwgdmFsdWUpIHsKICAoZWwucHJvcHMgfHwgKGVsLnByb3BzID0gW10pKS5wdXNoKHsgbmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlIH0pOwogIGVsLnBsYWluID0gZmFsc2U7Cn0KCmZ1bmN0aW9uIGFkZEF0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgewogIChlbC5hdHRycyB8fCAoZWwuYXR0cnMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7CiAgZWwucGxhaW4gPSBmYWxzZTsKfQoKLy8gYWRkIGEgcmF3IGF0dHIgKHVzZSB0aGlzIGluIHByZVRyYW5zZm9ybXMpCmZ1bmN0aW9uIGFkZFJhd0F0dHIgKGVsLCBuYW1lLCB2YWx1ZSkgewogIGVsLmF0dHJzTWFwW25hbWVdID0gdmFsdWU7CiAgZWwuYXR0cnNMaXN0LnB1c2goeyBuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWUgfSk7Cn0KCmZ1bmN0aW9uIGFkZERpcmVjdGl2ZSAoCiAgZWwsCiAgbmFtZSwKICByYXdOYW1lLAogIHZhbHVlLAogIGFyZywKICBtb2RpZmllcnMKKSB7CiAgKGVsLmRpcmVjdGl2ZXMgfHwgKGVsLmRpcmVjdGl2ZXMgPSBbXSkpLnB1c2goeyBuYW1lOiBuYW1lLCByYXdOYW1lOiByYXdOYW1lLCB2YWx1ZTogdmFsdWUsIGFyZzogYXJnLCBtb2RpZmllcnM6IG1vZGlmaWVycyB9KTsKICBlbC5wbGFpbiA9IGZhbHNlOwp9CgpmdW5jdGlvbiBhZGRIYW5kbGVyICgKICBlbCwKICBuYW1lLAogIHZhbHVlLAogIG1vZGlmaWVycywKICBpbXBvcnRhbnQsCiAgd2FybgopIHsKICBtb2RpZmllcnMgPSBtb2RpZmllcnMgfHwgZW1wdHlPYmplY3Q7CiAgLy8gd2FybiBwcmV2ZW50IGFuZCBwYXNzaXZlIG1vZGlmaWVyCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKAogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4gJiYKICAgIG1vZGlmaWVycy5wcmV2ZW50ICYmIG1vZGlmaWVycy5wYXNzaXZlCiAgKSB7CiAgICB3YXJuKAogICAgICAncGFzc2l2ZSBhbmQgcHJldmVudCBjYW5cJ3QgYmUgdXNlZCB0b2dldGhlci4gJyArCiAgICAgICdQYXNzaXZlIGhhbmRsZXIgY2FuXCd0IHByZXZlbnQgZGVmYXVsdCBldmVudC4nCiAgICApOwogIH0KCiAgLy8gY2hlY2sgY2FwdHVyZSBtb2RpZmllcgogIGlmIChtb2RpZmllcnMuY2FwdHVyZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5jYXB0dXJlOwogICAgbmFtZSA9ICchJyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIGNhcHR1cmVkCiAgfQogIGlmIChtb2RpZmllcnMub25jZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5vbmNlOwogICAgbmFtZSA9ICd+JyArIG5hbWU7IC8vIG1hcmsgdGhlIGV2ZW50IGFzIG9uY2UKICB9CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKG1vZGlmaWVycy5wYXNzaXZlKSB7CiAgICBkZWxldGUgbW9kaWZpZXJzLnBhc3NpdmU7CiAgICBuYW1lID0gJyYnICsgbmFtZTsgLy8gbWFyayB0aGUgZXZlbnQgYXMgcGFzc2l2ZQogIH0KCiAgLy8gbm9ybWFsaXplIGNsaWNrLnJpZ2h0IGFuZCBjbGljay5taWRkbGUgc2luY2UgdGhleSBkb24ndCBhY3R1YWxseSBmaXJlCiAgLy8gdGhpcyBpcyB0ZWNobmljYWxseSBicm93c2VyLXNwZWNpZmljLCBidXQgYXQgbGVhc3QgZm9yIG5vdyBicm93c2VycyBhcmUKICAvLyB0aGUgb25seSB0YXJnZXQgZW52cyB0aGF0IGhhdmUgcmlnaHQvbWlkZGxlIGNsaWNrcy4KICBpZiAobmFtZSA9PT0gJ2NsaWNrJykgewogICAgaWYgKG1vZGlmaWVycy5yaWdodCkgewogICAgICBuYW1lID0gJ2NvbnRleHRtZW51JzsKICAgICAgZGVsZXRlIG1vZGlmaWVycy5yaWdodDsKICAgIH0gZWxzZSBpZiAobW9kaWZpZXJzLm1pZGRsZSkgewogICAgICBuYW1lID0gJ21vdXNldXAnOwogICAgfQogIH0KCiAgdmFyIGV2ZW50czsKICBpZiAobW9kaWZpZXJzLm5hdGl2ZSkgewogICAgZGVsZXRlIG1vZGlmaWVycy5uYXRpdmU7CiAgICBldmVudHMgPSBlbC5uYXRpdmVFdmVudHMgfHwgKGVsLm5hdGl2ZUV2ZW50cyA9IHt9KTsKICB9IGVsc2UgewogICAgZXZlbnRzID0gZWwuZXZlbnRzIHx8IChlbC5ldmVudHMgPSB7fSk7CiAgfQoKICB2YXIgbmV3SGFuZGxlciA9IHsKICAgIHZhbHVlOiB2YWx1ZS50cmltKCkKICB9OwogIGlmIChtb2RpZmllcnMgIT09IGVtcHR5T2JqZWN0KSB7CiAgICBuZXdIYW5kbGVyLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKICB9CgogIHZhciBoYW5kbGVycyA9IGV2ZW50c1tuYW1lXTsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoQXJyYXkuaXNBcnJheShoYW5kbGVycykpIHsKICAgIGltcG9ydGFudCA/IGhhbmRsZXJzLnVuc2hpZnQobmV3SGFuZGxlcikgOiBoYW5kbGVycy5wdXNoKG5ld0hhbmRsZXIpOwogIH0gZWxzZSBpZiAoaGFuZGxlcnMpIHsKICAgIGV2ZW50c1tuYW1lXSA9IGltcG9ydGFudCA/IFtuZXdIYW5kbGVyLCBoYW5kbGVyc10gOiBbaGFuZGxlcnMsIG5ld0hhbmRsZXJdOwogIH0gZWxzZSB7CiAgICBldmVudHNbbmFtZV0gPSBuZXdIYW5kbGVyOwogIH0KCiAgZWwucGxhaW4gPSBmYWxzZTsKfQoKZnVuY3Rpb24gZ2V0QmluZGluZ0F0dHIgKAogIGVsLAogIG5hbWUsCiAgZ2V0U3RhdGljCikgewogIHZhciBkeW5hbWljVmFsdWUgPQogICAgZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJzonICsgbmFtZSkgfHwKICAgIGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWJpbmQ6JyArIG5hbWUpOwogIGlmIChkeW5hbWljVmFsdWUgIT0gbnVsbCkgewogICAgcmV0dXJuIHBhcnNlRmlsdGVycyhkeW5hbWljVmFsdWUpCiAgfSBlbHNlIGlmIChnZXRTdGF0aWMgIT09IGZhbHNlKSB7CiAgICB2YXIgc3RhdGljVmFsdWUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCBuYW1lKTsKICAgIGlmIChzdGF0aWNWYWx1ZSAhPSBudWxsKSB7CiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGF0aWNWYWx1ZSkKICAgIH0KICB9Cn0KCi8vIG5vdGU6IHRoaXMgb25seSByZW1vdmVzIHRoZSBhdHRyIGZyb20gdGhlIEFycmF5IChhdHRyc0xpc3QpIHNvIHRoYXQgaXQKLy8gZG9lc24ndCBnZXQgcHJvY2Vzc2VkIGJ5IHByb2Nlc3NBdHRycy4KLy8gQnkgZGVmYXVsdCBpdCBkb2VzIE5PVCByZW1vdmUgaXQgZnJvbSB0aGUgbWFwIChhdHRyc01hcCkgYmVjYXVzZSB0aGUgbWFwIGlzCi8vIG5lZWRlZCBkdXJpbmcgY29kZWdlbi4KZnVuY3Rpb24gZ2V0QW5kUmVtb3ZlQXR0ciAoCiAgZWwsCiAgbmFtZSwKICByZW1vdmVGcm9tTWFwCikgewogIHZhciB2YWw7CiAgaWYgKCh2YWwgPSBlbC5hdHRyc01hcFtuYW1lXSkgIT0gbnVsbCkgewogICAgdmFyIGxpc3QgPSBlbC5hdHRyc0xpc3Q7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIGlmIChsaXN0W2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICBsaXN0LnNwbGljZShpLCAxKTsKICAgICAgICBicmVhawogICAgICB9CiAgICB9CiAgfQogIGlmIChyZW1vdmVGcm9tTWFwKSB7CiAgICBkZWxldGUgZWwuYXR0cnNNYXBbbmFtZV07CiAgfQogIHJldHVybiB2YWwKfQoKLyogICovCgovKioKICogQ3Jvc3MtcGxhdGZvcm0gY29kZSBnZW5lcmF0aW9uIGZvciBjb21wb25lbnQgdi1tb2RlbAogKi8KZnVuY3Rpb24gZ2VuQ29tcG9uZW50TW9kZWwgKAogIGVsLAogIHZhbHVlLAogIG1vZGlmaWVycwopIHsKICB2YXIgcmVmID0gbW9kaWZpZXJzIHx8IHt9OwogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOwogIHZhciB0cmltID0gcmVmLnRyaW07CgogIHZhciBiYXNlVmFsdWVFeHByZXNzaW9uID0gJyQkdic7CiAgdmFyIHZhbHVlRXhwcmVzc2lvbiA9IGJhc2VWYWx1ZUV4cHJlc3Npb247CiAgaWYgKHRyaW0pIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9CiAgICAgICIodHlwZW9mICIgKyBiYXNlVmFsdWVFeHByZXNzaW9uICsgIiA9PT0gJ3N0cmluZyciICsKICAgICAgIj8gIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyAiLnRyaW0oKSIgKwogICAgICAiOiAiICsgYmFzZVZhbHVlRXhwcmVzc2lvbiArICIpIjsKICB9CiAgaWYgKG51bWJlcikgewogICAgdmFsdWVFeHByZXNzaW9uID0gIl9uKCIgKyB2YWx1ZUV4cHJlc3Npb24gKyAiKSI7CiAgfQogIHZhciBhc3NpZ25tZW50ID0gZ2VuQXNzaWdubWVudENvZGUodmFsdWUsIHZhbHVlRXhwcmVzc2lvbik7CgogIGVsLm1vZGVsID0gewogICAgdmFsdWU6ICgiKCIgKyB2YWx1ZSArICIpIiksCiAgICBleHByZXNzaW9uOiAoIlwiIiArIHZhbHVlICsgIlwiIiksCiAgICBjYWxsYmFjazogKCJmdW5jdGlvbiAoIiArIGJhc2VWYWx1ZUV4cHJlc3Npb24gKyAiKSB7IiArIGFzc2lnbm1lbnQgKyAifSIpCiAgfTsKfQoKLyoqCiAqIENyb3NzLXBsYXRmb3JtIGNvZGVnZW4gaGVscGVyIGZvciBnZW5lcmF0aW5nIHYtbW9kZWwgdmFsdWUgYXNzaWdubWVudCBjb2RlLgogKi8KZnVuY3Rpb24gZ2VuQXNzaWdubWVudENvZGUgKAogIHZhbHVlLAogIGFzc2lnbm1lbnQKKSB7CiAgdmFyIHJlcyA9IHBhcnNlTW9kZWwodmFsdWUpOwogIGlmIChyZXMua2V5ID09PSBudWxsKSB7CiAgICByZXR1cm4gKHZhbHVlICsgIj0iICsgYXNzaWdubWVudCkKICB9IGVsc2UgewogICAgcmV0dXJuICgiJHNldCgiICsgKHJlcy5leHApICsgIiwgIiArIChyZXMua2V5KSArICIsICIgKyBhc3NpZ25tZW50ICsgIikiKQogIH0KfQoKLyoqCiAqIFBhcnNlIGEgdi1tb2RlbCBleHByZXNzaW9uIGludG8gYSBiYXNlIHBhdGggYW5kIGEgZmluYWwga2V5IHNlZ21lbnQuCiAqIEhhbmRsZXMgYm90aCBkb3QtcGF0aCBhbmQgcG9zc2libGUgc3F1YXJlIGJyYWNrZXRzLgogKgogKiBQb3NzaWJsZSBjYXNlczoKICoKICogLSB0ZXN0CiAqIC0gdGVzdFtrZXldCiAqIC0gdGVzdFt0ZXN0MVtrZXldXQogKiAtIHRlc3RbImEiXVtrZXldCiAqIC0geHh4LnRlc3RbYVthXS50ZXN0MVtrZXldXQogKiAtIHRlc3QueHh4LmFbImFzYSJdW3Rlc3QxW2tleV1dCiAqCiAqLwoKdmFyIGxlbjsKdmFyIHN0cjsKdmFyIGNocjsKdmFyIGluZGV4JDE7CnZhciBleHByZXNzaW9uUG9zOwp2YXIgZXhwcmVzc2lvbkVuZFBvczsKCgoKZnVuY3Rpb24gcGFyc2VNb2RlbCAodmFsKSB7CiAgLy8gRml4IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvcHVsbC83NzMwCiAgLy8gYWxsb3cgdi1tb2RlbD0ib2JqLnZhbCAiICh0cmFpbGluZyB3aGl0ZXNwYWNlKQogIHZhbCA9IHZhbC50cmltKCk7CiAgbGVuID0gdmFsLmxlbmd0aDsKCiAgaWYgKHZhbC5pbmRleE9mKCdbJykgPCAwIHx8IHZhbC5sYXN0SW5kZXhPZignXScpIDwgbGVuIC0gMSkgewogICAgaW5kZXgkMSA9IHZhbC5sYXN0SW5kZXhPZignLicpOwogICAgaWYgKGluZGV4JDEgPiAtMSkgewogICAgICByZXR1cm4gewogICAgICAgIGV4cDogdmFsLnNsaWNlKDAsIGluZGV4JDEpLAogICAgICAgIGtleTogJyInICsgdmFsLnNsaWNlKGluZGV4JDEgKyAxKSArICciJwogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gewogICAgICAgIGV4cDogdmFsLAogICAgICAgIGtleTogbnVsbAogICAgICB9CiAgICB9CiAgfQoKICBzdHIgPSB2YWw7CiAgaW5kZXgkMSA9IGV4cHJlc3Npb25Qb3MgPSBleHByZXNzaW9uRW5kUG9zID0gMDsKCiAgd2hpbGUgKCFlb2YoKSkgewogICAgY2hyID0gbmV4dCgpOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoaXNTdHJpbmdTdGFydChjaHIpKSB7CiAgICAgIHBhcnNlU3RyaW5nKGNocik7CiAgICB9IGVsc2UgaWYgKGNociA9PT0gMHg1QikgewogICAgICBwYXJzZUJyYWNrZXQoY2hyKTsKICAgIH0KICB9CgogIHJldHVybiB7CiAgICBleHA6IHZhbC5zbGljZSgwLCBleHByZXNzaW9uUG9zKSwKICAgIGtleTogdmFsLnNsaWNlKGV4cHJlc3Npb25Qb3MgKyAxLCBleHByZXNzaW9uRW5kUG9zKQogIH0KfQoKZnVuY3Rpb24gbmV4dCAoKSB7CiAgcmV0dXJuIHN0ci5jaGFyQ29kZUF0KCsraW5kZXgkMSkKfQoKZnVuY3Rpb24gZW9mICgpIHsKICByZXR1cm4gaW5kZXgkMSA+PSBsZW4KfQoKZnVuY3Rpb24gaXNTdHJpbmdTdGFydCAoY2hyKSB7CiAgcmV0dXJuIGNociA9PT0gMHgyMiB8fCBjaHIgPT09IDB4MjcKfQoKZnVuY3Rpb24gcGFyc2VCcmFja2V0IChjaHIpIHsKICB2YXIgaW5CcmFja2V0ID0gMTsKICBleHByZXNzaW9uUG9zID0gaW5kZXgkMTsKICB3aGlsZSAoIWVvZigpKSB7CiAgICBjaHIgPSBuZXh0KCk7CiAgICBpZiAoaXNTdHJpbmdTdGFydChjaHIpKSB7CiAgICAgIHBhcnNlU3RyaW5nKGNocik7CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBpZiAoY2hyID09PSAweDVCKSB7IGluQnJhY2tldCsrOyB9CiAgICBpZiAoY2hyID09PSAweDVEKSB7IGluQnJhY2tldC0tOyB9CiAgICBpZiAoaW5CcmFja2V0ID09PSAwKSB7CiAgICAgIGV4cHJlc3Npb25FbmRQb3MgPSBpbmRleCQxOwogICAgICBicmVhawogICAgfQogIH0KfQoKZnVuY3Rpb24gcGFyc2VTdHJpbmcgKGNocikgewogIHZhciBzdHJpbmdRdW90ZSA9IGNocjsKICB3aGlsZSAoIWVvZigpKSB7CiAgICBjaHIgPSBuZXh0KCk7CiAgICBpZiAoY2hyID09PSBzdHJpbmdRdW90ZSkgewogICAgICBicmVhawogICAgfQogIH0KfQoKLyogICovCgp2YXIgd2FybiQxOwoKLy8gaW4gc29tZSBjYXNlcywgdGhlIGV2ZW50IHVzZWQgaGFzIHRvIGJlIGRldGVybWluZWQgYXQgcnVudGltZQovLyBzbyB3ZSB1c2VkIHNvbWUgcmVzZXJ2ZWQgdG9rZW5zIGR1cmluZyBjb21waWxlLgp2YXIgUkFOR0VfVE9LRU4gPSAnX19yJzsKdmFyIENIRUNLQk9YX1JBRElPX1RPS0VOID0gJ19fYyc7CgpmdW5jdGlvbiBtb2RlbCAoCiAgZWwsCiAgZGlyLAogIF93YXJuCikgewogIHdhcm4kMSA9IF93YXJuOwogIHZhciB2YWx1ZSA9IGRpci52YWx1ZTsKICB2YXIgbW9kaWZpZXJzID0gZGlyLm1vZGlmaWVyczsKICB2YXIgdGFnID0gZWwudGFnOwogIHZhciB0eXBlID0gZWwuYXR0cnNNYXAudHlwZTsKCiAgewogICAgLy8gaW5wdXRzIHdpdGggdHlwZT0iZmlsZSIgYXJlIHJlYWQgb25seSBhbmQgc2V0dGluZyB0aGUgaW5wdXQncwogICAgLy8gdmFsdWUgd2lsbCB0aHJvdyBhbiBlcnJvci4KICAgIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2ZpbGUnKSB7CiAgICAgIHdhcm4kMSgKICAgICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIiB0eXBlPVwiZmlsZVwiPjpcbiIgKwogICAgICAgICJGaWxlIGlucHV0cyBhcmUgcmVhZCBvbmx5LiBVc2UgYSB2LW9uOmNoYW5nZSBsaXN0ZW5lciBpbnN0ZWFkLiIKICAgICAgKTsKICAgIH0KICB9CgogIGlmIChlbC5jb21wb25lbnQpIHsKICAgIGdlbkNvbXBvbmVudE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsKICAgIC8vIGNvbXBvbmVudCB2LW1vZGVsIGRvZXNuJ3QgbmVlZCBleHRyYSBydW50aW1lCiAgICByZXR1cm4gZmFsc2UKICB9IGVsc2UgaWYgKHRhZyA9PT0gJ3NlbGVjdCcpIHsKICAgIGdlblNlbGVjdChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ2NoZWNrYm94JykgewogICAgZ2VuQ2hlY2tib3hNb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgdHlwZSA9PT0gJ3JhZGlvJykgewogICAgZ2VuUmFkaW9Nb2RlbChlbCwgdmFsdWUsIG1vZGlmaWVycyk7CiAgfSBlbHNlIGlmICh0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAndGV4dGFyZWEnKSB7CiAgICBnZW5EZWZhdWx0TW9kZWwoZWwsIHZhbHVlLCBtb2RpZmllcnMpOwogIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jlc2VydmVkVGFnKHRhZykpIHsKICAgIGdlbkNvbXBvbmVudE1vZGVsKGVsLCB2YWx1ZSwgbW9kaWZpZXJzKTsKICAgIC8vIGNvbXBvbmVudCB2LW1vZGVsIGRvZXNuJ3QgbmVlZCBleHRyYSBydW50aW1lCiAgICByZXR1cm4gZmFsc2UKICB9IGVsc2UgewogICAgd2FybiQxKAogICAgICAiPCIgKyAoZWwudGFnKSArICIgdi1tb2RlbD1cIiIgKyB2YWx1ZSArICJcIj46ICIgKwogICAgICAidi1tb2RlbCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZWxlbWVudCB0eXBlLiAiICsKICAgICAgJ0lmIHlvdSBhcmUgd29ya2luZyB3aXRoIGNvbnRlbnRlZGl0YWJsZSwgaXRcJ3MgcmVjb21tZW5kZWQgdG8gJyArCiAgICAgICd3cmFwIGEgbGlicmFyeSBkZWRpY2F0ZWQgZm9yIHRoYXQgcHVycG9zZSBpbnNpZGUgYSBjdXN0b20gY29tcG9uZW50LicKICAgICk7CiAgfQoKICAvLyBlbnN1cmUgcnVudGltZSBkaXJlY3RpdmUgbWV0YWRhdGEKICByZXR1cm4gdHJ1ZQp9CgpmdW5jdGlvbiBnZW5DaGVja2JveE1vZGVsICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOwogIHZhciB2YWx1ZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3ZhbHVlJykgfHwgJ251bGwnOwogIHZhciB0cnVlVmFsdWVCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICd0cnVlLXZhbHVlJykgfHwgJ3RydWUnOwogIHZhciBmYWxzZVZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAnZmFsc2UtdmFsdWUnKSB8fCAnZmFsc2UnOwogIGFkZFByb3AoZWwsICdjaGVja2VkJywKICAgICJBcnJheS5pc0FycmF5KCIgKyB2YWx1ZSArICIpIiArCiAgICAiP19pKCIgKyB2YWx1ZSArICIsIiArIHZhbHVlQmluZGluZyArICIpPi0xIiArICgKICAgICAgdHJ1ZVZhbHVlQmluZGluZyA9PT0gJ3RydWUnCiAgICAgICAgPyAoIjooIiArIHZhbHVlICsgIikiKQogICAgICAgIDogKCI6X3EoIiArIHZhbHVlICsgIiwiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpIikKICAgICkKICApOwogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLAogICAgInZhciAkJGE9IiArIHZhbHVlICsgIiwiICsKICAgICAgICAnJCRlbD0kZXZlbnQudGFyZ2V0LCcgKwogICAgICAgICIkJGM9JCRlbC5jaGVja2VkPygiICsgdHJ1ZVZhbHVlQmluZGluZyArICIpOigiICsgZmFsc2VWYWx1ZUJpbmRpbmcgKyAiKTsiICsKICAgICdpZihBcnJheS5pc0FycmF5KCQkYSkpeycgKwogICAgICAidmFyICQkdj0iICsgKG51bWJlciA/ICdfbignICsgdmFsdWVCaW5kaW5nICsgJyknIDogdmFsdWVCaW5kaW5nKSArICIsIiArCiAgICAgICAgICAnJCRpPV9pKCQkYSwkJHYpOycgKwogICAgICAiaWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKCIgKyAoZ2VuQXNzaWdubWVudENvZGUodmFsdWUsICckJGEuY29uY2F0KFskJHZdKScpKSArICIpfSIgKwogICAgICAiZWxzZXskJGk+LTEmJigiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSknKSkgKyAiKX0iICsKICAgICJ9ZWxzZXsiICsgKGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCAnJCRjJykpICsgIn0iLAogICAgbnVsbCwgdHJ1ZQogICk7Cn0KCmZ1bmN0aW9uIGdlblJhZGlvTW9kZWwgKAogIGVsLAogIHZhbHVlLAogIG1vZGlmaWVycwopIHsKICB2YXIgbnVtYmVyID0gbW9kaWZpZXJzICYmIG1vZGlmaWVycy5udW1iZXI7CiAgdmFyIHZhbHVlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndmFsdWUnKSB8fCAnbnVsbCc7CiAgdmFsdWVCaW5kaW5nID0gbnVtYmVyID8gKCJfbigiICsgdmFsdWVCaW5kaW5nICsgIikiKSA6IHZhbHVlQmluZGluZzsKICBhZGRQcm9wKGVsLCAnY2hlY2tlZCcsICgiX3EoIiArIHZhbHVlICsgIiwiICsgdmFsdWVCaW5kaW5nICsgIikiKSk7CiAgYWRkSGFuZGxlcihlbCwgJ2NoYW5nZScsIGdlbkFzc2lnbm1lbnRDb2RlKHZhbHVlLCB2YWx1ZUJpbmRpbmcpLCBudWxsLCB0cnVlKTsKfQoKZnVuY3Rpb24gZ2VuU2VsZWN0ICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIG51bWJlciA9IG1vZGlmaWVycyAmJiBtb2RpZmllcnMubnVtYmVyOwogIHZhciBzZWxlY3RlZFZhbCA9ICJBcnJheS5wcm90b3R5cGUuZmlsdGVyIiArCiAgICAiLmNhbGwoJGV2ZW50LnRhcmdldC5vcHRpb25zLGZ1bmN0aW9uKG8pe3JldHVybiBvLnNlbGVjdGVkfSkiICsKICAgICIubWFwKGZ1bmN0aW9uKG8pe3ZhciB2YWwgPSBcIl92YWx1ZVwiIGluIG8gPyBvLl92YWx1ZSA6IG8udmFsdWU7IiArCiAgICAicmV0dXJuICIgKyAobnVtYmVyID8gJ19uKHZhbCknIDogJ3ZhbCcpICsgIn0pIjsKCiAgdmFyIGFzc2lnbm1lbnQgPSAnJGV2ZW50LnRhcmdldC5tdWx0aXBsZSA/ICQkc2VsZWN0ZWRWYWwgOiAkJHNlbGVjdGVkVmFsWzBdJzsKICB2YXIgY29kZSA9ICJ2YXIgJCRzZWxlY3RlZFZhbCA9ICIgKyBzZWxlY3RlZFZhbCArICI7IjsKICBjb2RlID0gY29kZSArICIgIiArIChnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgYXNzaWdubWVudCkpOwogIGFkZEhhbmRsZXIoZWwsICdjaGFuZ2UnLCBjb2RlLCBudWxsLCB0cnVlKTsKfQoKZnVuY3Rpb24gZ2VuRGVmYXVsdE1vZGVsICgKICBlbCwKICB2YWx1ZSwKICBtb2RpZmllcnMKKSB7CiAgdmFyIHR5cGUgPSBlbC5hdHRyc01hcC50eXBlOwoKICAvLyB3YXJuIGlmIHYtYmluZDp2YWx1ZSBjb25mbGljdHMgd2l0aCB2LW1vZGVsCiAgLy8gZXhjZXB0IGZvciBpbnB1dHMgd2l0aCB2LWJpbmQ6dHlwZQogIHsKICAgIHZhciB2YWx1ZSQxID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp2YWx1ZSddIHx8IGVsLmF0dHJzTWFwWyc6dmFsdWUnXTsKICAgIHZhciB0eXBlQmluZGluZyA9IGVsLmF0dHJzTWFwWyd2LWJpbmQ6dHlwZSddIHx8IGVsLmF0dHJzTWFwWyc6dHlwZSddOwogICAgaWYgKHZhbHVlJDEgJiYgIXR5cGVCaW5kaW5nKSB7CiAgICAgIHZhciBiaW5kaW5nID0gZWwuYXR0cnNNYXBbJ3YtYmluZDp2YWx1ZSddID8gJ3YtYmluZDp2YWx1ZScgOiAnOnZhbHVlJzsKICAgICAgd2FybiQxKAogICAgICAgIGJpbmRpbmcgKyAiPVwiIiArIHZhbHVlJDEgKyAiXCIgY29uZmxpY3RzIHdpdGggdi1tb2RlbCBvbiB0aGUgc2FtZSBlbGVtZW50ICIgKwogICAgICAgICdiZWNhdXNlIHRoZSBsYXR0ZXIgYWxyZWFkeSBleHBhbmRzIHRvIGEgdmFsdWUgYmluZGluZyBpbnRlcm5hbGx5JwogICAgICApOwogICAgfQogIH0KCiAgdmFyIHJlZiA9IG1vZGlmaWVycyB8fCB7fTsKICB2YXIgbGF6eSA9IHJlZi5sYXp5OwogIHZhciBudW1iZXIgPSByZWYubnVtYmVyOwogIHZhciB0cmltID0gcmVmLnRyaW07CiAgdmFyIG5lZWRDb21wb3NpdGlvbkd1YXJkID0gIWxhenkgJiYgdHlwZSAhPT0gJ3JhbmdlJzsKICB2YXIgZXZlbnQgPSBsYXp5CiAgICA/ICdjaGFuZ2UnCiAgICA6IHR5cGUgPT09ICdyYW5nZScKICAgICAgPyBSQU5HRV9UT0tFTgogICAgICA6ICdpbnB1dCc7CgogIHZhciB2YWx1ZUV4cHJlc3Npb24gPSAnJGV2ZW50LnRhcmdldC52YWx1ZSc7CiAgaWYgKHRyaW0pIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9ICIkZXZlbnQudGFyZ2V0LnZhbHVlLnRyaW0oKSI7CiAgfQogIGlmIChudW1iZXIpIHsKICAgIHZhbHVlRXhwcmVzc2lvbiA9ICJfbigiICsgdmFsdWVFeHByZXNzaW9uICsgIikiOwogIH0KCiAgdmFyIGNvZGUgPSBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgdmFsdWVFeHByZXNzaW9uKTsKICBpZiAobmVlZENvbXBvc2l0aW9uR3VhcmQpIHsKICAgIGNvZGUgPSAiaWYoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpcmV0dXJuOyIgKyBjb2RlOwogIH0KCiAgYWRkUHJvcChlbCwgJ3ZhbHVlJywgKCIoIiArIHZhbHVlICsgIikiKSk7CiAgYWRkSGFuZGxlcihlbCwgZXZlbnQsIGNvZGUsIG51bGwsIHRydWUpOwogIGlmICh0cmltIHx8IG51bWJlcikgewogICAgYWRkSGFuZGxlcihlbCwgJ2JsdXInLCAnJGZvcmNlVXBkYXRlKCknKTsKICB9Cn0KCi8qICAqLwoKLy8gbm9ybWFsaXplIHYtbW9kZWwgZXZlbnQgdG9rZW5zIHRoYXQgY2FuIG9ubHkgYmUgZGV0ZXJtaW5lZCBhdCBydW50aW1lLgovLyBpdCdzIGltcG9ydGFudCB0byBwbGFjZSB0aGUgZXZlbnQgYXMgdGhlIGZpcnN0IGluIHRoZSBhcnJheSBiZWNhdXNlCi8vIHRoZSB3aG9sZSBwb2ludCBpcyBlbnN1cmluZyB0aGUgdi1tb2RlbCBjYWxsYmFjayBnZXRzIGNhbGxlZCBiZWZvcmUKLy8gdXNlci1hdHRhY2hlZCBoYW5kbGVycy4KZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRzIChvbikgewogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihvbltSQU5HRV9UT0tFTl0pKSB7CiAgICAvLyBJRSBpbnB1dFt0eXBlPXJhbmdlXSBvbmx5IHN1cHBvcnRzIGBjaGFuZ2VgIGV2ZW50CiAgICB2YXIgZXZlbnQgPSBpc0lFID8gJ2NoYW5nZScgOiAnaW5wdXQnOwogICAgb25bZXZlbnRdID0gW10uY29uY2F0KG9uW1JBTkdFX1RPS0VOXSwgb25bZXZlbnRdIHx8IFtdKTsKICAgIGRlbGV0ZSBvbltSQU5HRV9UT0tFTl07CiAgfQogIC8vIFRoaXMgd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQgdG8gZml4ICM0NTIxIGJ1dCBubyBsb25nZXIgbmVjZXNzYXJ5CiAgLy8gYWZ0ZXIgMi41LiBLZWVwaW5nIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0IHdpdGggZ2VuZXJhdGVkIGNvZGUgZnJvbSA8IDIuNAogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihvbltDSEVDS0JPWF9SQURJT19UT0tFTl0pKSB7CiAgICBvbi5jaGFuZ2UgPSBbXS5jb25jYXQob25bQ0hFQ0tCT1hfUkFESU9fVE9LRU5dLCBvbi5jaGFuZ2UgfHwgW10pOwogICAgZGVsZXRlIG9uW0NIRUNLQk9YX1JBRElPX1RPS0VOXTsKICB9Cn0KCnZhciB0YXJnZXQkMTsKCmZ1bmN0aW9uIGNyZWF0ZU9uY2VIYW5kbGVyIChoYW5kbGVyLCBldmVudCwgY2FwdHVyZSkgewogIHZhciBfdGFyZ2V0ID0gdGFyZ2V0JDE7IC8vIHNhdmUgY3VycmVudCB0YXJnZXQgZWxlbWVudCBpbiBjbG9zdXJlCiAgcmV0dXJuIGZ1bmN0aW9uIG9uY2VIYW5kbGVyICgpIHsKICAgIHZhciByZXMgPSBoYW5kbGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICBpZiAocmVzICE9PSBudWxsKSB7CiAgICAgIHJlbW92ZSQyKGV2ZW50LCBvbmNlSGFuZGxlciwgY2FwdHVyZSwgX3RhcmdldCk7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBhZGQkMSAoCiAgZXZlbnQsCiAgaGFuZGxlciwKICBvbmNlJCQxLAogIGNhcHR1cmUsCiAgcGFzc2l2ZQopIHsKICBoYW5kbGVyID0gd2l0aE1hY3JvVGFzayhoYW5kbGVyKTsKICBpZiAob25jZSQkMSkgeyBoYW5kbGVyID0gY3JlYXRlT25jZUhhbmRsZXIoaGFuZGxlciwgZXZlbnQsIGNhcHR1cmUpOyB9CiAgdGFyZ2V0JDEuYWRkRXZlbnRMaXN0ZW5lcigKICAgIGV2ZW50LAogICAgaGFuZGxlciwKICAgIHN1cHBvcnRzUGFzc2l2ZQogICAgICA/IHsgY2FwdHVyZTogY2FwdHVyZSwgcGFzc2l2ZTogcGFzc2l2ZSB9CiAgICAgIDogY2FwdHVyZQogICk7Cn0KCmZ1bmN0aW9uIHJlbW92ZSQyICgKICBldmVudCwKICBoYW5kbGVyLAogIGNhcHR1cmUsCiAgX3RhcmdldAopIHsKICAoX3RhcmdldCB8fCB0YXJnZXQkMSkucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgIGV2ZW50LAogICAgaGFuZGxlci5fd2l0aFRhc2sgfHwgaGFuZGxlciwKICAgIGNhcHR1cmUKICApOwp9CgpmdW5jdGlvbiB1cGRhdGVET01MaXN0ZW5lcnMgKG9sZFZub2RlLCB2bm9kZSkgewogIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEub24pICYmIGlzVW5kZWYodm5vZGUuZGF0YS5vbikpIHsKICAgIHJldHVybgogIH0KICB2YXIgb24gPSB2bm9kZS5kYXRhLm9uIHx8IHt9OwogIHZhciBvbGRPbiA9IG9sZFZub2RlLmRhdGEub24gfHwge307CiAgdGFyZ2V0JDEgPSB2bm9kZS5lbG07CiAgbm9ybWFsaXplRXZlbnRzKG9uKTsKICB1cGRhdGVMaXN0ZW5lcnMob24sIG9sZE9uLCBhZGQkMSwgcmVtb3ZlJDIsIHZub2RlLmNvbnRleHQpOwogIHRhcmdldCQxID0gdW5kZWZpbmVkOwp9Cgp2YXIgZXZlbnRzID0gewogIGNyZWF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzLAogIHVwZGF0ZTogdXBkYXRlRE9NTGlzdGVuZXJzCn0KCi8qICAqLwoKZnVuY3Rpb24gdXBkYXRlRE9NUHJvcHMgKG9sZFZub2RlLCB2bm9kZSkgewogIGlmIChpc1VuZGVmKG9sZFZub2RlLmRhdGEuZG9tUHJvcHMpICYmIGlzVW5kZWYodm5vZGUuZGF0YS5kb21Qcm9wcykpIHsKICAgIHJldHVybgogIH0KICB2YXIga2V5LCBjdXI7CiAgdmFyIGVsbSA9IHZub2RlLmVsbTsKICB2YXIgb2xkUHJvcHMgPSBvbGRWbm9kZS5kYXRhLmRvbVByb3BzIHx8IHt9OwogIHZhciBwcm9wcyA9IHZub2RlLmRhdGEuZG9tUHJvcHMgfHwge307CiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0CiAgaWYgKGlzRGVmKHByb3BzLl9fb2JfXykpIHsKICAgIHByb3BzID0gdm5vZGUuZGF0YS5kb21Qcm9wcyA9IGV4dGVuZCh7fSwgcHJvcHMpOwogIH0KCiAgZm9yIChrZXkgaW4gb2xkUHJvcHMpIHsKICAgIGlmIChpc1VuZGVmKHByb3BzW2tleV0pKSB7CiAgICAgIGVsbVtrZXldID0gJyc7CiAgICB9CiAgfQogIGZvciAoa2V5IGluIHByb3BzKSB7CiAgICBjdXIgPSBwcm9wc1trZXldOwogICAgLy8gaWdub3JlIGNoaWxkcmVuIGlmIHRoZSBub2RlIGhhcyB0ZXh0Q29udGVudCBvciBpbm5lckhUTUwsCiAgICAvLyBhcyB0aGVzZSB3aWxsIHRocm93IGF3YXkgZXhpc3RpbmcgRE9NIG5vZGVzIGFuZCBjYXVzZSByZW1vdmFsIGVycm9ycwogICAgLy8gb24gc3Vic2VxdWVudCBwYXRjaGVzICgjMzM2MCkKICAgIGlmIChrZXkgPT09ICd0ZXh0Q29udGVudCcgfHwga2V5ID09PSAnaW5uZXJIVE1MJykgewogICAgICBpZiAodm5vZGUuY2hpbGRyZW4pIHsgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoID0gMDsgfQogICAgICBpZiAoY3VyID09PSBvbGRQcm9wc1trZXldKSB7IGNvbnRpbnVlIH0KICAgICAgLy8gIzY2MDEgd29yayBhcm91bmQgQ2hyb21lIHZlcnNpb24gPD0gNTUgYnVnIHdoZXJlIHNpbmdsZSB0ZXh0Tm9kZQogICAgICAvLyByZXBsYWNlZCBieSBpbm5lckhUTUwvdGV4dENvbnRlbnQgcmV0YWlucyBpdHMgcGFyZW50Tm9kZSBwcm9wZXJ0eQogICAgICBpZiAoZWxtLmNoaWxkTm9kZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgZWxtLnJlbW92ZUNoaWxkKGVsbS5jaGlsZE5vZGVzWzBdKTsKICAgICAgfQogICAgfQoKICAgIGlmIChrZXkgPT09ICd2YWx1ZScpIHsKICAgICAgLy8gc3RvcmUgdmFsdWUgYXMgX3ZhbHVlIGFzIHdlbGwgc2luY2UKICAgICAgLy8gbm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBzdHJpbmdpZmllZAogICAgICBlbG0uX3ZhbHVlID0gY3VyOwogICAgICAvLyBhdm9pZCByZXNldHRpbmcgY3Vyc29yIHBvc2l0aW9uIHdoZW4gdmFsdWUgaXMgdGhlIHNhbWUKICAgICAgdmFyIHN0ckN1ciA9IGlzVW5kZWYoY3VyKSA/ICcnIDogU3RyaW5nKGN1cik7CiAgICAgIGlmIChzaG91bGRVcGRhdGVWYWx1ZShlbG0sIHN0ckN1cikpIHsKICAgICAgICBlbG0udmFsdWUgPSBzdHJDdXI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGVsbVtrZXldID0gY3VyOwogICAgfQogIH0KfQoKLy8gY2hlY2sgcGxhdGZvcm1zL3dlYi91dGlsL2F0dHJzLmpzIGFjY2VwdFZhbHVlCgoKZnVuY3Rpb24gc2hvdWxkVXBkYXRlVmFsdWUgKGVsbSwgY2hlY2tWYWwpIHsKICByZXR1cm4gKCFlbG0uY29tcG9zaW5nICYmICgKICAgIGVsbS50YWdOYW1lID09PSAnT1BUSU9OJyB8fAogICAgaXNOb3RJbkZvY3VzQW5kRGlydHkoZWxtLCBjaGVja1ZhbCkgfHwKICAgIGlzRGlydHlXaXRoTW9kaWZpZXJzKGVsbSwgY2hlY2tWYWwpCiAgKSkKfQoKZnVuY3Rpb24gaXNOb3RJbkZvY3VzQW5kRGlydHkgKGVsbSwgY2hlY2tWYWwpIHsKICAvLyByZXR1cm4gdHJ1ZSB3aGVuIHRleHRib3ggKC5udW1iZXIgYW5kIC50cmltKSBsb3NlcyBmb2N1cyBhbmQgaXRzIHZhbHVlIGlzCiAgLy8gbm90IGVxdWFsIHRvIHRoZSB1cGRhdGVkIHZhbHVlCiAgdmFyIG5vdEluRm9jdXMgPSB0cnVlOwogIC8vICM2MTU3CiAgLy8gd29yayBhcm91bmQgSUUgYnVnIHdoZW4gYWNjZXNzaW5nIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW4gYW4gaWZyYW1lCiAgdHJ5IHsgbm90SW5Gb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGVsbTsgfSBjYXRjaCAoZSkge30KICByZXR1cm4gbm90SW5Gb2N1cyAmJiBlbG0udmFsdWUgIT09IGNoZWNrVmFsCn0KCmZ1bmN0aW9uIGlzRGlydHlXaXRoTW9kaWZpZXJzIChlbG0sIG5ld1ZhbCkgewogIHZhciB2YWx1ZSA9IGVsbS52YWx1ZTsKICB2YXIgbW9kaWZpZXJzID0gZWxtLl92TW9kaWZpZXJzOyAvLyBpbmplY3RlZCBieSB2LW1vZGVsIHJ1bnRpbWUKICBpZiAoaXNEZWYobW9kaWZpZXJzKSkgewogICAgaWYgKG1vZGlmaWVycy5sYXp5KSB7CiAgICAgIC8vIGlucHV0cyB3aXRoIGxhenkgc2hvdWxkIG9ubHkgYmUgdXBkYXRlZCB3aGVuIG5vdCBpbiBmb2N1cwogICAgICByZXR1cm4gZmFsc2UKICAgIH0KICAgIGlmIChtb2RpZmllcnMubnVtYmVyKSB7CiAgICAgIHJldHVybiB0b051bWJlcih2YWx1ZSkgIT09IHRvTnVtYmVyKG5ld1ZhbCkKICAgIH0KICAgIGlmIChtb2RpZmllcnMudHJpbSkgewogICAgICByZXR1cm4gdmFsdWUudHJpbSgpICE9PSBuZXdWYWwudHJpbSgpCiAgICB9CiAgfQogIHJldHVybiB2YWx1ZSAhPT0gbmV3VmFsCn0KCnZhciBkb21Qcm9wcyA9IHsKICBjcmVhdGU6IHVwZGF0ZURPTVByb3BzLAogIHVwZGF0ZTogdXBkYXRlRE9NUHJvcHMKfQoKLyogICovCgp2YXIgcGFyc2VTdHlsZVRleHQgPSBjYWNoZWQoZnVuY3Rpb24gKGNzc1RleHQpIHsKICB2YXIgcmVzID0ge307CiAgdmFyIGxpc3REZWxpbWl0ZXIgPSAvOyg/IVteKF0qXCkpL2c7CiAgdmFyIHByb3BlcnR5RGVsaW1pdGVyID0gLzooLispLzsKICBjc3NUZXh0LnNwbGl0KGxpc3REZWxpbWl0ZXIpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgIGlmIChpdGVtKSB7CiAgICAgIHZhciB0bXAgPSBpdGVtLnNwbGl0KHByb3BlcnR5RGVsaW1pdGVyKTsKICAgICAgdG1wLmxlbmd0aCA+IDEgJiYgKHJlc1t0bXBbMF0udHJpbSgpXSA9IHRtcFsxXS50cmltKCkpOwogICAgfQogIH0pOwogIHJldHVybiByZXMKfSk7CgovLyBtZXJnZSBzdGF0aWMgYW5kIGR5bmFtaWMgc3R5bGUgZGF0YSBvbiB0aGUgc2FtZSB2bm9kZQpmdW5jdGlvbiBub3JtYWxpemVTdHlsZURhdGEgKGRhdGEpIHsKICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcoZGF0YS5zdHlsZSk7CiAgLy8gc3RhdGljIHN0eWxlIGlzIHByZS1wcm9jZXNzZWQgaW50byBhbiBvYmplY3QgZHVyaW5nIGNvbXBpbGF0aW9uCiAgLy8gYW5kIGlzIGFsd2F5cyBhIGZyZXNoIG9iamVjdCwgc28gaXQncyBzYWZlIHRvIG1lcmdlIGludG8gaXQKICByZXR1cm4gZGF0YS5zdGF0aWNTdHlsZQogICAgPyBleHRlbmQoZGF0YS5zdGF0aWNTdHlsZSwgc3R5bGUpCiAgICA6IHN0eWxlCn0KCi8vIG5vcm1hbGl6ZSBwb3NzaWJsZSBhcnJheSAvIHN0cmluZyB2YWx1ZXMgaW50byBPYmplY3QKZnVuY3Rpb24gbm9ybWFsaXplU3R5bGVCaW5kaW5nIChiaW5kaW5nU3R5bGUpIHsKICBpZiAoQXJyYXkuaXNBcnJheShiaW5kaW5nU3R5bGUpKSB7CiAgICByZXR1cm4gdG9PYmplY3QoYmluZGluZ1N0eWxlKQogIH0KICBpZiAodHlwZW9mIGJpbmRpbmdTdHlsZSA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBwYXJzZVN0eWxlVGV4dChiaW5kaW5nU3R5bGUpCiAgfQogIHJldHVybiBiaW5kaW5nU3R5bGUKfQoKLyoqCiAqIHBhcmVudCBjb21wb25lbnQgc3R5bGUgc2hvdWxkIGJlIGFmdGVyIGNoaWxkJ3MKICogc28gdGhhdCBwYXJlbnQgY29tcG9uZW50J3Mgc3R5bGUgY291bGQgb3ZlcnJpZGUgaXQKICovCmZ1bmN0aW9uIGdldFN0eWxlICh2bm9kZSwgY2hlY2tDaGlsZCkgewogIHZhciByZXMgPSB7fTsKICB2YXIgc3R5bGVEYXRhOwoKICBpZiAoY2hlY2tDaGlsZCkgewogICAgdmFyIGNoaWxkTm9kZSA9IHZub2RlOwogICAgd2hpbGUgKGNoaWxkTm9kZS5jb21wb25lbnRJbnN0YW5jZSkgewogICAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlOwogICAgICBpZiAoCiAgICAgICAgY2hpbGROb2RlICYmIGNoaWxkTm9kZS5kYXRhICYmCiAgICAgICAgKHN0eWxlRGF0YSA9IG5vcm1hbGl6ZVN0eWxlRGF0YShjaGlsZE5vZGUuZGF0YSkpCiAgICAgICkgewogICAgICAgIGV4dGVuZChyZXMsIHN0eWxlRGF0YSk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmICgoc3R5bGVEYXRhID0gbm9ybWFsaXplU3R5bGVEYXRhKHZub2RlLmRhdGEpKSkgewogICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsKICB9CgogIHZhciBwYXJlbnROb2RlID0gdm5vZGU7CiAgd2hpbGUgKChwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnQpKSB7CiAgICBpZiAocGFyZW50Tm9kZS5kYXRhICYmIChzdHlsZURhdGEgPSBub3JtYWxpemVTdHlsZURhdGEocGFyZW50Tm9kZS5kYXRhKSkpIHsKICAgICAgZXh0ZW5kKHJlcywgc3R5bGVEYXRhKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlcwp9CgovKiAgKi8KCnZhciBjc3NWYXJSRSA9IC9eLS0vOwp2YXIgaW1wb3J0YW50UkUgPSAvXHMqIWltcG9ydGFudCQvOwp2YXIgc2V0UHJvcCA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgdmFsKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGNzc1ZhclJFLnRlc3QobmFtZSkpIHsKICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbCk7CiAgfSBlbHNlIGlmIChpbXBvcnRhbnRSRS50ZXN0KHZhbCkpIHsKICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbC5yZXBsYWNlKGltcG9ydGFudFJFLCAnJyksICdpbXBvcnRhbnQnKTsKICB9IGVsc2UgewogICAgdmFyIG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplKG5hbWUpOwogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgewogICAgICAvLyBTdXBwb3J0IHZhbHVlcyBhcnJheSBjcmVhdGVkIGJ5IGF1dG9wcmVmaXhlciwgZS5nLgogICAgICAvLyB7ZGlzcGxheTogWyItd2Via2l0LWJveCIsICItbXMtZmxleGJveCIsICJmbGV4Il19CiAgICAgIC8vIFNldCB0aGVtIG9uZSBieSBvbmUsIGFuZCB0aGUgYnJvd3NlciB3aWxsIG9ubHkgc2V0IHRob3NlIGl0IGNhbiByZWNvZ25pemUKICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbC5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgIGVsLnN0eWxlW25vcm1hbGl6ZWROYW1lXSA9IHZhbFtpXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGVbbm9ybWFsaXplZE5hbWVdID0gdmFsOwogICAgfQogIH0KfTsKCnZhciB2ZW5kb3JOYW1lcyA9IFsnV2Via2l0JywgJ01veicsICdtcyddOwoKdmFyIGVtcHR5U3R5bGU7CnZhciBub3JtYWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHByb3ApIHsKICBlbXB0eVN0eWxlID0gZW1wdHlTdHlsZSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsKICBwcm9wID0gY2FtZWxpemUocHJvcCk7CiAgaWYgKHByb3AgIT09ICdmaWx0ZXInICYmIChwcm9wIGluIGVtcHR5U3R5bGUpKSB7CiAgICByZXR1cm4gcHJvcAogIH0KICB2YXIgY2FwTmFtZSA9IHByb3AuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wLnNsaWNlKDEpOwogIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9yTmFtZXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBuYW1lID0gdmVuZG9yTmFtZXNbaV0gKyBjYXBOYW1lOwogICAgaWYgKG5hbWUgaW4gZW1wdHlTdHlsZSkgewogICAgICByZXR1cm4gbmFtZQogICAgfQogIH0KfSk7CgpmdW5jdGlvbiB1cGRhdGVTdHlsZSAob2xkVm5vZGUsIHZub2RlKSB7CiAgdmFyIGRhdGEgPSB2bm9kZS5kYXRhOwogIHZhciBvbGREYXRhID0gb2xkVm5vZGUuZGF0YTsKCiAgaWYgKGlzVW5kZWYoZGF0YS5zdGF0aWNTdHlsZSkgJiYgaXNVbmRlZihkYXRhLnN0eWxlKSAmJgogICAgaXNVbmRlZihvbGREYXRhLnN0YXRpY1N0eWxlKSAmJiBpc1VuZGVmKG9sZERhdGEuc3R5bGUpCiAgKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBjdXIsIG5hbWU7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwogIHZhciBvbGRTdGF0aWNTdHlsZSA9IG9sZERhdGEuc3RhdGljU3R5bGU7CiAgdmFyIG9sZFN0eWxlQmluZGluZyA9IG9sZERhdGEubm9ybWFsaXplZFN0eWxlIHx8IG9sZERhdGEuc3R5bGUgfHwge307CgogIC8vIGlmIHN0YXRpYyBzdHlsZSBleGlzdHMsIHN0eWxlYmluZGluZyBhbHJlYWR5IG1lcmdlZCBpbnRvIGl0IHdoZW4gZG9pbmcgbm9ybWFsaXplU3R5bGVEYXRhCiAgdmFyIG9sZFN0eWxlID0gb2xkU3RhdGljU3R5bGUgfHwgb2xkU3R5bGVCaW5kaW5nOwoKICB2YXIgc3R5bGUgPSBub3JtYWxpemVTdHlsZUJpbmRpbmcodm5vZGUuZGF0YS5zdHlsZSkgfHwge307CgogIC8vIHN0b3JlIG5vcm1hbGl6ZWQgc3R5bGUgdW5kZXIgYSBkaWZmZXJlbnQga2V5IGZvciBuZXh0IGRpZmYKICAvLyBtYWtlIHN1cmUgdG8gY2xvbmUgaXQgaWYgaXQncyByZWFjdGl2ZSwgc2luY2UgdGhlIHVzZXIgbGlrZWx5IHdhbnRzCiAgLy8gdG8gbXV0YXRlIGl0LgogIHZub2RlLmRhdGEubm9ybWFsaXplZFN0eWxlID0gaXNEZWYoc3R5bGUuX19vYl9fKQogICAgPyBleHRlbmQoe30sIHN0eWxlKQogICAgOiBzdHlsZTsKCiAgdmFyIG5ld1N0eWxlID0gZ2V0U3R5bGUodm5vZGUsIHRydWUpOwoKICBmb3IgKG5hbWUgaW4gb2xkU3R5bGUpIHsKICAgIGlmIChpc1VuZGVmKG5ld1N0eWxlW25hbWVdKSkgewogICAgICBzZXRQcm9wKGVsLCBuYW1lLCAnJyk7CiAgICB9CiAgfQogIGZvciAobmFtZSBpbiBuZXdTdHlsZSkgewogICAgY3VyID0gbmV3U3R5bGVbbmFtZV07CiAgICBpZiAoY3VyICE9PSBvbGRTdHlsZVtuYW1lXSkgewogICAgICAvLyBpZTkgc2V0dGluZyB0byBudWxsIGhhcyBubyBlZmZlY3QsIG11c3QgdXNlIGVtcHR5IHN0cmluZwogICAgICBzZXRQcm9wKGVsLCBuYW1lLCBjdXIgPT0gbnVsbCA/ICcnIDogY3VyKTsKICAgIH0KICB9Cn0KCnZhciBzdHlsZSA9IHsKICBjcmVhdGU6IHVwZGF0ZVN0eWxlLAogIHVwZGF0ZTogdXBkYXRlU3R5bGUKfQoKLyogICovCgovKioKICogQWRkIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uCiAqIFNWRyBlbGVtZW50cyBpbiBJRQogKi8KZnVuY3Rpb24gYWRkQ2xhc3MgKGVsLCBjbHMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKGVsLmNsYXNzTGlzdCkgewogICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkgewogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5hZGQoYyk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuY2xhc3NMaXN0LmFkZChjbHMpOwogICAgfQogIH0gZWxzZSB7CiAgICB2YXIgY3VyID0gIiAiICsgKGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKSB8fCAnJykgKyAiICI7CiAgICBpZiAoY3VyLmluZGV4T2YoJyAnICsgY2xzICsgJyAnKSA8IDApIHsKICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIChjdXIgKyBjbHMpLnRyaW0oKSk7CiAgICB9CiAgfQp9CgovKioKICogUmVtb3ZlIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uCiAqIFNWRyBlbGVtZW50cyBpbiBJRQogKi8KZnVuY3Rpb24gcmVtb3ZlQ2xhc3MgKGVsLCBjbHMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoIWNscyB8fCAhKGNscyA9IGNscy50cmltKCkpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKGVsLmNsYXNzTGlzdCkgewogICAgaWYgKGNscy5pbmRleE9mKCcgJykgPiAtMSkgewogICAgICBjbHMuc3BsaXQoL1xzKy8pLmZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5yZW1vdmUoYyk7IH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShjbHMpOwogICAgfQogICAgaWYgKCFlbC5jbGFzc0xpc3QubGVuZ3RoKSB7CiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTsKICAgIH0KICB9IGVsc2UgewogICAgdmFyIGN1ciA9ICIgIiArIChlbC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykgfHwgJycpICsgIiAiOwogICAgdmFyIHRhciA9ICcgJyArIGNscyArICcgJzsKICAgIHdoaWxlIChjdXIuaW5kZXhPZih0YXIpID49IDApIHsKICAgICAgY3VyID0gY3VyLnJlcGxhY2UodGFyLCAnICcpOwogICAgfQogICAgY3VyID0gY3VyLnRyaW0oKTsKICAgIGlmIChjdXIpIHsKICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIGN1cik7CiAgICB9IGVsc2UgewogICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7CiAgICB9CiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uIChkZWYpIHsKICBpZiAoIWRlZikgewogICAgcmV0dXJuCiAgfQogIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovCiAgaWYgKHR5cGVvZiBkZWYgPT09ICdvYmplY3QnKSB7CiAgICB2YXIgcmVzID0ge307CiAgICBpZiAoZGVmLmNzcyAhPT0gZmFsc2UpIHsKICAgICAgZXh0ZW5kKHJlcywgYXV0b0Nzc1RyYW5zaXRpb24oZGVmLm5hbWUgfHwgJ3YnKSk7CiAgICB9CiAgICBleHRlbmQocmVzLCBkZWYpOwogICAgcmV0dXJuIHJlcwogIH0gZWxzZSBpZiAodHlwZW9mIGRlZiA9PT0gJ3N0cmluZycpIHsKICAgIHJldHVybiBhdXRvQ3NzVHJhbnNpdGlvbihkZWYpCiAgfQp9Cgp2YXIgYXV0b0Nzc1RyYW5zaXRpb24gPSBjYWNoZWQoZnVuY3Rpb24gKG5hbWUpIHsKICByZXR1cm4gewogICAgZW50ZXJDbGFzczogKG5hbWUgKyAiLWVudGVyIiksCiAgICBlbnRlclRvQ2xhc3M6IChuYW1lICsgIi1lbnRlci10byIpLAogICAgZW50ZXJBY3RpdmVDbGFzczogKG5hbWUgKyAiLWVudGVyLWFjdGl2ZSIpLAogICAgbGVhdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlIiksCiAgICBsZWF2ZVRvQ2xhc3M6IChuYW1lICsgIi1sZWF2ZS10byIpLAogICAgbGVhdmVBY3RpdmVDbGFzczogKG5hbWUgKyAiLWxlYXZlLWFjdGl2ZSIpCiAgfQp9KTsKCnZhciBoYXNUcmFuc2l0aW9uID0gaW5Ccm93c2VyICYmICFpc0lFOTsKdmFyIFRSQU5TSVRJT04gPSAndHJhbnNpdGlvbic7CnZhciBBTklNQVRJT04gPSAnYW5pbWF0aW9uJzsKCi8vIFRyYW5zaXRpb24gcHJvcGVydHkvZXZlbnQgc25pZmZpbmcKdmFyIHRyYW5zaXRpb25Qcm9wID0gJ3RyYW5zaXRpb24nOwp2YXIgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3RyYW5zaXRpb25lbmQnOwp2YXIgYW5pbWF0aW9uUHJvcCA9ICdhbmltYXRpb24nOwp2YXIgYW5pbWF0aW9uRW5kRXZlbnQgPSAnYW5pbWF0aW9uZW5kJzsKaWYgKGhhc1RyYW5zaXRpb24pIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAod2luZG93Lm9udHJhbnNpdGlvbmVuZCA9PT0gdW5kZWZpbmVkICYmCiAgICB3aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kICE9PSB1bmRlZmluZWQKICApIHsKICAgIHRyYW5zaXRpb25Qcm9wID0gJ1dlYmtpdFRyYW5zaXRpb24nOwogICAgdHJhbnNpdGlvbkVuZEV2ZW50ID0gJ3dlYmtpdFRyYW5zaXRpb25FbmQnOwogIH0KICBpZiAod2luZG93Lm9uYW5pbWF0aW9uZW5kID09PSB1bmRlZmluZWQgJiYKICAgIHdpbmRvdy5vbndlYmtpdGFuaW1hdGlvbmVuZCAhPT0gdW5kZWZpbmVkCiAgKSB7CiAgICBhbmltYXRpb25Qcm9wID0gJ1dlYmtpdEFuaW1hdGlvbic7CiAgICBhbmltYXRpb25FbmRFdmVudCA9ICd3ZWJraXRBbmltYXRpb25FbmQnOwogIH0KfQoKLy8gYmluZGluZyB0byB3aW5kb3cgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgaG90IHJlbG9hZCB3b3JrIGluIElFIGluIHN0cmljdCBtb2RlCnZhciByYWYgPSBpbkJyb3dzZXIKICA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUKICAgID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykKICAgIDogc2V0VGltZW91dAogIDogLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gKGZuKSB7IHJldHVybiBmbigpOyB9OwoKZnVuY3Rpb24gbmV4dEZyYW1lIChmbikgewogIHJhZihmdW5jdGlvbiAoKSB7CiAgICByYWYoZm4pOwogIH0pOwp9CgpmdW5jdGlvbiBhZGRUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHsKICB2YXIgdHJhbnNpdGlvbkNsYXNzZXMgPSBlbC5fdHJhbnNpdGlvbkNsYXNzZXMgfHwgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcyA9IFtdKTsKICBpZiAodHJhbnNpdGlvbkNsYXNzZXMuaW5kZXhPZihjbHMpIDwgMCkgewogICAgdHJhbnNpdGlvbkNsYXNzZXMucHVzaChjbHMpOwogICAgYWRkQ2xhc3MoZWwsIGNscyk7CiAgfQp9CgpmdW5jdGlvbiByZW1vdmVUcmFuc2l0aW9uQ2xhc3MgKGVsLCBjbHMpIHsKICBpZiAoZWwuX3RyYW5zaXRpb25DbGFzc2VzKSB7CiAgICByZW1vdmUoZWwuX3RyYW5zaXRpb25DbGFzc2VzLCBjbHMpOwogIH0KICByZW1vdmVDbGFzcyhlbCwgY2xzKTsKfQoKZnVuY3Rpb24gd2hlblRyYW5zaXRpb25FbmRzICgKICBlbCwKICBleHBlY3RlZFR5cGUsCiAgY2IKKSB7CiAgdmFyIHJlZiA9IGdldFRyYW5zaXRpb25JbmZvKGVsLCBleHBlY3RlZFR5cGUpOwogIHZhciB0eXBlID0gcmVmLnR5cGU7CiAgdmFyIHRpbWVvdXQgPSByZWYudGltZW91dDsKICB2YXIgcHJvcENvdW50ID0gcmVmLnByb3BDb3VudDsKICBpZiAoIXR5cGUpIHsgcmV0dXJuIGNiKCkgfQogIHZhciBldmVudCA9IHR5cGUgPT09IFRSQU5TSVRJT04gPyB0cmFuc2l0aW9uRW5kRXZlbnQgOiBhbmltYXRpb25FbmRFdmVudDsKICB2YXIgZW5kZWQgPSAwOwogIHZhciBlbmQgPSBmdW5jdGlvbiAoKSB7CiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7CiAgICBjYigpOwogIH07CiAgdmFyIG9uRW5kID0gZnVuY3Rpb24gKGUpIHsKICAgIGlmIChlLnRhcmdldCA9PT0gZWwpIHsKICAgICAgaWYgKCsrZW5kZWQgPj0gcHJvcENvdW50KSB7CiAgICAgICAgZW5kKCk7CiAgICAgIH0KICAgIH0KICB9OwogIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgaWYgKGVuZGVkIDwgcHJvcENvdW50KSB7CiAgICAgIGVuZCgpOwogICAgfQogIH0sIHRpbWVvdXQgKyAxKTsKICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBvbkVuZCk7Cn0KCnZhciB0cmFuc2Zvcm1SRSA9IC9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLzsKCmZ1bmN0aW9uIGdldFRyYW5zaXRpb25JbmZvIChlbCwgZXhwZWN0ZWRUeXBlKSB7CiAgdmFyIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTsKICB2YXIgdHJhbnNpdGlvbkRlbGF5cyA9IHN0eWxlc1t0cmFuc2l0aW9uUHJvcCArICdEZWxheSddLnNwbGl0KCcsICcpOwogIHZhciB0cmFuc2l0aW9uRHVyYXRpb25zID0gc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ0R1cmF0aW9uJ10uc3BsaXQoJywgJyk7CiAgdmFyIHRyYW5zaXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dCh0cmFuc2l0aW9uRGVsYXlzLCB0cmFuc2l0aW9uRHVyYXRpb25zKTsKICB2YXIgYW5pbWF0aW9uRGVsYXlzID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRGVsYXknXS5zcGxpdCgnLCAnKTsKICB2YXIgYW5pbWF0aW9uRHVyYXRpb25zID0gc3R5bGVzW2FuaW1hdGlvblByb3AgKyAnRHVyYXRpb24nXS5zcGxpdCgnLCAnKTsKICB2YXIgYW5pbWF0aW9uVGltZW91dCA9IGdldFRpbWVvdXQoYW5pbWF0aW9uRGVsYXlzLCBhbmltYXRpb25EdXJhdGlvbnMpOwoKICB2YXIgdHlwZTsKICB2YXIgdGltZW91dCA9IDA7CiAgdmFyIHByb3BDb3VudCA9IDA7CiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGV4cGVjdGVkVHlwZSA9PT0gVFJBTlNJVElPTikgewogICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkgewogICAgICB0eXBlID0gVFJBTlNJVElPTjsKICAgICAgdGltZW91dCA9IHRyYW5zaXRpb25UaW1lb3V0OwogICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDsKICAgIH0KICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gQU5JTUFUSU9OKSB7CiAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHsKICAgICAgdHlwZSA9IEFOSU1BVElPTjsKICAgICAgdGltZW91dCA9IGFuaW1hdGlvblRpbWVvdXQ7CiAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7CiAgICB9CiAgfSBlbHNlIHsKICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7CiAgICB0eXBlID0gdGltZW91dCA+IDAKICAgICAgPyB0cmFuc2l0aW9uVGltZW91dCA+IGFuaW1hdGlvblRpbWVvdXQKICAgICAgICA/IFRSQU5TSVRJT04KICAgICAgICA6IEFOSU1BVElPTgogICAgICA6IG51bGw7CiAgICBwcm9wQ291bnQgPSB0eXBlCiAgICAgID8gdHlwZSA9PT0gVFJBTlNJVElPTgogICAgICAgID8gdHJhbnNpdGlvbkR1cmF0aW9ucy5sZW5ndGgKICAgICAgICA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGgKICAgICAgOiAwOwogIH0KICB2YXIgaGFzVHJhbnNmb3JtID0KICAgIHR5cGUgPT09IFRSQU5TSVRJT04gJiYKICAgIHRyYW5zZm9ybVJFLnRlc3Qoc3R5bGVzW3RyYW5zaXRpb25Qcm9wICsgJ1Byb3BlcnR5J10pOwogIHJldHVybiB7CiAgICB0eXBlOiB0eXBlLAogICAgdGltZW91dDogdGltZW91dCwKICAgIHByb3BDb3VudDogcHJvcENvdW50LAogICAgaGFzVHJhbnNmb3JtOiBoYXNUcmFuc2Zvcm0KICB9Cn0KCmZ1bmN0aW9uIGdldFRpbWVvdXQgKGRlbGF5cywgZHVyYXRpb25zKSB7CiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8KICB3aGlsZSAoZGVsYXlzLmxlbmd0aCA8IGR1cmF0aW9ucy5sZW5ndGgpIHsKICAgIGRlbGF5cyA9IGRlbGF5cy5jb25jYXQoZGVsYXlzKTsKICB9CgogIHJldHVybiBNYXRoLm1heC5hcHBseShudWxsLCBkdXJhdGlvbnMubWFwKGZ1bmN0aW9uIChkLCBpKSB7CiAgICByZXR1cm4gdG9NcyhkKSArIHRvTXMoZGVsYXlzW2ldKQogIH0pKQp9CgpmdW5jdGlvbiB0b01zIChzKSB7CiAgcmV0dXJuIE51bWJlcihzLnNsaWNlKDAsIC0xKSkgKiAxMDAwCn0KCi8qICAqLwoKZnVuY3Rpb24gZW50ZXIgKHZub2RlLCB0b2dnbGVEaXNwbGF5KSB7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwoKICAvLyBjYWxsIGxlYXZlIGNhbGxiYWNrIG5vdwogIGlmIChpc0RlZihlbC5fbGVhdmVDYikpIHsKICAgIGVsLl9sZWF2ZUNiLmNhbmNlbGxlZCA9IHRydWU7CiAgICBlbC5fbGVhdmVDYigpOwogIH0KCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOwogIGlmIChpc1VuZGVmKGRhdGEpKSB7CiAgICByZXR1cm4KICB9CgogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0RlZihlbC5fZW50ZXJDYikgfHwgZWwubm9kZVR5cGUgIT09IDEpIHsKICAgIHJldHVybgogIH0KCiAgdmFyIGNzcyA9IGRhdGEuY3NzOwogIHZhciB0eXBlID0gZGF0YS50eXBlOwogIHZhciBlbnRlckNsYXNzID0gZGF0YS5lbnRlckNsYXNzOwogIHZhciBlbnRlclRvQ2xhc3MgPSBkYXRhLmVudGVyVG9DbGFzczsKICB2YXIgZW50ZXJBY3RpdmVDbGFzcyA9IGRhdGEuZW50ZXJBY3RpdmVDbGFzczsKICB2YXIgYXBwZWFyQ2xhc3MgPSBkYXRhLmFwcGVhckNsYXNzOwogIHZhciBhcHBlYXJUb0NsYXNzID0gZGF0YS5hcHBlYXJUb0NsYXNzOwogIHZhciBhcHBlYXJBY3RpdmVDbGFzcyA9IGRhdGEuYXBwZWFyQWN0aXZlQ2xhc3M7CiAgdmFyIGJlZm9yZUVudGVyID0gZGF0YS5iZWZvcmVFbnRlcjsKICB2YXIgZW50ZXIgPSBkYXRhLmVudGVyOwogIHZhciBhZnRlckVudGVyID0gZGF0YS5hZnRlckVudGVyOwogIHZhciBlbnRlckNhbmNlbGxlZCA9IGRhdGEuZW50ZXJDYW5jZWxsZWQ7CiAgdmFyIGJlZm9yZUFwcGVhciA9IGRhdGEuYmVmb3JlQXBwZWFyOwogIHZhciBhcHBlYXIgPSBkYXRhLmFwcGVhcjsKICB2YXIgYWZ0ZXJBcHBlYXIgPSBkYXRhLmFmdGVyQXBwZWFyOwogIHZhciBhcHBlYXJDYW5jZWxsZWQgPSBkYXRhLmFwcGVhckNhbmNlbGxlZDsKICB2YXIgZHVyYXRpb24gPSBkYXRhLmR1cmF0aW9uOwoKICAvLyBhY3RpdmVJbnN0YW5jZSB3aWxsIGFsd2F5cyBiZSB0aGUgPHRyYW5zaXRpb24+IGNvbXBvbmVudCBtYW5hZ2luZyB0aGlzCiAgLy8gdHJhbnNpdGlvbi4gT25lIGVkZ2UgY2FzZSB0byBjaGVjayBpcyB3aGVuIHRoZSA8dHJhbnNpdGlvbj4gaXMgcGxhY2VkCiAgLy8gYXMgdGhlIHJvb3Qgbm9kZSBvZiBhIGNoaWxkIGNvbXBvbmVudC4gSW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gY2hlY2sKICAvLyA8dHJhbnNpdGlvbj4ncyBwYXJlbnQgZm9yIGFwcGVhciBjaGVjay4KICB2YXIgY29udGV4dCA9IGFjdGl2ZUluc3RhbmNlOwogIHZhciB0cmFuc2l0aW9uTm9kZSA9IGFjdGl2ZUluc3RhbmNlLiR2bm9kZTsKICB3aGlsZSAodHJhbnNpdGlvbk5vZGUgJiYgdHJhbnNpdGlvbk5vZGUucGFyZW50KSB7CiAgICB0cmFuc2l0aW9uTm9kZSA9IHRyYW5zaXRpb25Ob2RlLnBhcmVudDsKICAgIGNvbnRleHQgPSB0cmFuc2l0aW9uTm9kZS5jb250ZXh0OwogIH0KCiAgdmFyIGlzQXBwZWFyID0gIWNvbnRleHQuX2lzTW91bnRlZCB8fCAhdm5vZGUuaXNSb290SW5zZXJ0OwoKICBpZiAoaXNBcHBlYXIgJiYgIWFwcGVhciAmJiBhcHBlYXIgIT09ICcnKSB7CiAgICByZXR1cm4KICB9CgogIHZhciBzdGFydENsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyQ2xhc3MKICAgID8gYXBwZWFyQ2xhc3MKICAgIDogZW50ZXJDbGFzczsKICB2YXIgYWN0aXZlQ2xhc3MgPSBpc0FwcGVhciAmJiBhcHBlYXJBY3RpdmVDbGFzcwogICAgPyBhcHBlYXJBY3RpdmVDbGFzcwogICAgOiBlbnRlckFjdGl2ZUNsYXNzOwogIHZhciB0b0NsYXNzID0gaXNBcHBlYXIgJiYgYXBwZWFyVG9DbGFzcwogICAgPyBhcHBlYXJUb0NsYXNzCiAgICA6IGVudGVyVG9DbGFzczsKCiAgdmFyIGJlZm9yZUVudGVySG9vayA9IGlzQXBwZWFyCiAgICA/IChiZWZvcmVBcHBlYXIgfHwgYmVmb3JlRW50ZXIpCiAgICA6IGJlZm9yZUVudGVyOwogIHZhciBlbnRlckhvb2sgPSBpc0FwcGVhcgogICAgPyAodHlwZW9mIGFwcGVhciA9PT0gJ2Z1bmN0aW9uJyA/IGFwcGVhciA6IGVudGVyKQogICAgOiBlbnRlcjsKICB2YXIgYWZ0ZXJFbnRlckhvb2sgPSBpc0FwcGVhcgogICAgPyAoYWZ0ZXJBcHBlYXIgfHwgYWZ0ZXJFbnRlcikKICAgIDogYWZ0ZXJFbnRlcjsKICB2YXIgZW50ZXJDYW5jZWxsZWRIb29rID0gaXNBcHBlYXIKICAgID8gKGFwcGVhckNhbmNlbGxlZCB8fCBlbnRlckNhbmNlbGxlZCkKICAgIDogZW50ZXJDYW5jZWxsZWQ7CgogIHZhciBleHBsaWNpdEVudGVyRHVyYXRpb24gPSB0b051bWJlcigKICAgIGlzT2JqZWN0KGR1cmF0aW9uKQogICAgICA/IGR1cmF0aW9uLmVudGVyCiAgICAgIDogZHVyYXRpb24KICApOwoKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGV4cGxpY2l0RW50ZXJEdXJhdGlvbiAhPSBudWxsKSB7CiAgICBjaGVja0R1cmF0aW9uKGV4cGxpY2l0RW50ZXJEdXJhdGlvbiwgJ2VudGVyJywgdm5vZGUpOwogIH0KCiAgdmFyIGV4cGVjdHNDU1MgPSBjc3MgIT09IGZhbHNlICYmICFpc0lFOTsKICB2YXIgdXNlcldhbnRzQ29udHJvbCA9IGdldEhvb2tBcmd1bWVudHNMZW5ndGgoZW50ZXJIb29rKTsKCiAgdmFyIGNiID0gZWwuX2VudGVyQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHsKICAgIGlmIChleHBlY3RzQ1NTKSB7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgdG9DbGFzcyk7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpOwogICAgfQogICAgaWYgKGNiLmNhbmNlbGxlZCkgewogICAgICBpZiAoZXhwZWN0c0NTUykgewogICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgc3RhcnRDbGFzcyk7CiAgICAgIH0KICAgICAgZW50ZXJDYW5jZWxsZWRIb29rICYmIGVudGVyQ2FuY2VsbGVkSG9vayhlbCk7CiAgICB9IGVsc2UgewogICAgICBhZnRlckVudGVySG9vayAmJiBhZnRlckVudGVySG9vayhlbCk7CiAgICB9CiAgICBlbC5fZW50ZXJDYiA9IG51bGw7CiAgfSk7CgogIGlmICghdm5vZGUuZGF0YS5zaG93KSB7CiAgICAvLyByZW1vdmUgcGVuZGluZyBsZWF2ZSBlbGVtZW50IG9uIGVudGVyIGJ5IGluamVjdGluZyBhbiBpbnNlcnQgaG9vawogICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUsICdpbnNlcnQnLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlOwogICAgICB2YXIgcGVuZGluZ05vZGUgPSBwYXJlbnQgJiYgcGFyZW50Ll9wZW5kaW5nICYmIHBhcmVudC5fcGVuZGluZ1t2bm9kZS5rZXldOwogICAgICBpZiAocGVuZGluZ05vZGUgJiYKICAgICAgICBwZW5kaW5nTm9kZS50YWcgPT09IHZub2RlLnRhZyAmJgogICAgICAgIHBlbmRpbmdOb2RlLmVsbS5fbGVhdmVDYgogICAgICApIHsKICAgICAgICBwZW5kaW5nTm9kZS5lbG0uX2xlYXZlQ2IoKTsKICAgICAgfQogICAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7CiAgICB9KTsKICB9CgogIC8vIHN0YXJ0IGVudGVyIHRyYW5zaXRpb24KICBiZWZvcmVFbnRlckhvb2sgJiYgYmVmb3JlRW50ZXJIb29rKGVsKTsKICBpZiAoZXhwZWN0c0NTUykgewogICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsKICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgYWN0aXZlQ2xhc3MpOwogICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBzdGFydENsYXNzKTsKICAgICAgaWYgKCFjYi5jYW5jZWxsZWQpIHsKICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIHRvQ2xhc3MpOwogICAgICAgIGlmICghdXNlcldhbnRzQ29udHJvbCkgewogICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdEVudGVyRHVyYXRpb24pKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoY2IsIGV4cGxpY2l0RW50ZXJEdXJhdGlvbik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgaWYgKHZub2RlLmRhdGEuc2hvdykgewogICAgdG9nZ2xlRGlzcGxheSAmJiB0b2dnbGVEaXNwbGF5KCk7CiAgICBlbnRlckhvb2sgJiYgZW50ZXJIb29rKGVsLCBjYik7CiAgfQoKICBpZiAoIWV4cGVjdHNDU1MgJiYgIXVzZXJXYW50c0NvbnRyb2wpIHsKICAgIGNiKCk7CiAgfQp9CgpmdW5jdGlvbiBsZWF2ZSAodm5vZGUsIHJtKSB7CiAgdmFyIGVsID0gdm5vZGUuZWxtOwoKICAvLyBjYWxsIGVudGVyIGNhbGxiYWNrIG5vdwogIGlmIChpc0RlZihlbC5fZW50ZXJDYikpIHsKICAgIGVsLl9lbnRlckNiLmNhbmNlbGxlZCA9IHRydWU7CiAgICBlbC5fZW50ZXJDYigpOwogIH0KCiAgdmFyIGRhdGEgPSByZXNvbHZlVHJhbnNpdGlvbih2bm9kZS5kYXRhLnRyYW5zaXRpb24pOwogIGlmIChpc1VuZGVmKGRhdGEpIHx8IGVsLm5vZGVUeXBlICE9PSAxKSB7CiAgICByZXR1cm4gcm0oKQogIH0KCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGlzRGVmKGVsLl9sZWF2ZUNiKSkgewogICAgcmV0dXJuCiAgfQoKICB2YXIgY3NzID0gZGF0YS5jc3M7CiAgdmFyIHR5cGUgPSBkYXRhLnR5cGU7CiAgdmFyIGxlYXZlQ2xhc3MgPSBkYXRhLmxlYXZlQ2xhc3M7CiAgdmFyIGxlYXZlVG9DbGFzcyA9IGRhdGEubGVhdmVUb0NsYXNzOwogIHZhciBsZWF2ZUFjdGl2ZUNsYXNzID0gZGF0YS5sZWF2ZUFjdGl2ZUNsYXNzOwogIHZhciBiZWZvcmVMZWF2ZSA9IGRhdGEuYmVmb3JlTGVhdmU7CiAgdmFyIGxlYXZlID0gZGF0YS5sZWF2ZTsKICB2YXIgYWZ0ZXJMZWF2ZSA9IGRhdGEuYWZ0ZXJMZWF2ZTsKICB2YXIgbGVhdmVDYW5jZWxsZWQgPSBkYXRhLmxlYXZlQ2FuY2VsbGVkOwogIHZhciBkZWxheUxlYXZlID0gZGF0YS5kZWxheUxlYXZlOwogIHZhciBkdXJhdGlvbiA9IGRhdGEuZHVyYXRpb247CgogIHZhciBleHBlY3RzQ1NTID0gY3NzICE9PSBmYWxzZSAmJiAhaXNJRTk7CiAgdmFyIHVzZXJXYW50c0NvbnRyb2wgPSBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKGxlYXZlKTsKCiAgdmFyIGV4cGxpY2l0TGVhdmVEdXJhdGlvbiA9IHRvTnVtYmVyKAogICAgaXNPYmplY3QoZHVyYXRpb24pCiAgICAgID8gZHVyYXRpb24ubGVhdmUKICAgICAgOiBkdXJhdGlvbgogICk7CgogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgaXNEZWYoZXhwbGljaXRMZWF2ZUR1cmF0aW9uKSkgewogICAgY2hlY2tEdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24sICdsZWF2ZScsIHZub2RlKTsKICB9CgogIHZhciBjYiA9IGVsLl9sZWF2ZUNiID0gb25jZShmdW5jdGlvbiAoKSB7CiAgICBpZiAoZWwucGFyZW50Tm9kZSAmJiBlbC5wYXJlbnROb2RlLl9wZW5kaW5nKSB7CiAgICAgIGVsLnBhcmVudE5vZGUuX3BlbmRpbmdbdm5vZGUua2V5XSA9IG51bGw7CiAgICB9CiAgICBpZiAoZXhwZWN0c0NTUykgewogICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7CiAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVBY3RpdmVDbGFzcyk7CiAgICB9CiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7CiAgICAgIGlmIChleHBlY3RzQ1NTKSB7CiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTsKICAgICAgfQogICAgICBsZWF2ZUNhbmNlbGxlZCAmJiBsZWF2ZUNhbmNlbGxlZChlbCk7CiAgICB9IGVsc2UgewogICAgICBybSgpOwogICAgICBhZnRlckxlYXZlICYmIGFmdGVyTGVhdmUoZWwpOwogICAgfQogICAgZWwuX2xlYXZlQ2IgPSBudWxsOwogIH0pOwoKICBpZiAoZGVsYXlMZWF2ZSkgewogICAgZGVsYXlMZWF2ZShwZXJmb3JtTGVhdmUpOwogIH0gZWxzZSB7CiAgICBwZXJmb3JtTGVhdmUoKTsKICB9CgogIGZ1bmN0aW9uIHBlcmZvcm1MZWF2ZSAoKSB7CiAgICAvLyB0aGUgZGVsYXllZCBsZWF2ZSBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkCiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7CiAgICAgIHJldHVybgogICAgfQogICAgLy8gcmVjb3JkIGxlYXZpbmcgZWxlbWVudAogICAgaWYgKCF2bm9kZS5kYXRhLnNob3cpIHsKICAgICAgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgfHwgKGVsLnBhcmVudE5vZGUuX3BlbmRpbmcgPSB7fSkpWyh2bm9kZS5rZXkpXSA9IHZub2RlOwogICAgfQogICAgYmVmb3JlTGVhdmUgJiYgYmVmb3JlTGVhdmUoZWwpOwogICAgaWYgKGV4cGVjdHNDU1MpIHsKICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUNsYXNzKTsKICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTsKICAgICAgbmV4dEZyYW1lKGZ1bmN0aW9uICgpIHsKICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQ2xhc3MpOwogICAgICAgIGlmICghY2IuY2FuY2VsbGVkKSB7CiAgICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7CiAgICAgICAgICBpZiAoIXVzZXJXYW50c0NvbnRyb2wpIHsKICAgICAgICAgICAgaWYgKGlzVmFsaWREdXJhdGlvbihleHBsaWNpdExlYXZlRHVyYXRpb24pKSB7CiAgICAgICAgICAgICAgc2V0VGltZW91dChjYiwgZXhwbGljaXRMZWF2ZUR1cmF0aW9uKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIHR5cGUsIGNiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBsZWF2ZSAmJiBsZWF2ZShlbCwgY2IpOwogICAgaWYgKCFleHBlY3RzQ1NTICYmICF1c2VyV2FudHNDb250cm9sKSB7CiAgICAgIGNiKCk7CiAgICB9CiAgfQp9CgovLyBvbmx5IHVzZWQgaW4gZGV2IG1vZGUKZnVuY3Rpb24gY2hlY2tEdXJhdGlvbiAodmFsLCBuYW1lLCB2bm9kZSkgewogIGlmICh0eXBlb2YgdmFsICE9PSAnbnVtYmVyJykgewogICAgd2FybigKICAgICAgIjx0cmFuc2l0aW9uPiBleHBsaWNpdCAiICsgbmFtZSArICIgZHVyYXRpb24gaXMgbm90IGEgdmFsaWQgbnVtYmVyIC0gIiArCiAgICAgICJnb3QgIiArIChKU09OLnN0cmluZ2lmeSh2YWwpKSArICIuIiwKICAgICAgdm5vZGUuY29udGV4dAogICAgKTsKICB9IGVsc2UgaWYgKGlzTmFOKHZhbCkpIHsKICAgIHdhcm4oCiAgICAgICI8dHJhbnNpdGlvbj4gZXhwbGljaXQgIiArIG5hbWUgKyAiIGR1cmF0aW9uIGlzIE5hTiAtICIgKwogICAgICAndGhlIGR1cmF0aW9uIGV4cHJlc3Npb24gbWlnaHQgYmUgaW5jb3JyZWN0LicsCiAgICAgIHZub2RlLmNvbnRleHQKICAgICk7CiAgfQp9CgpmdW5jdGlvbiBpc1ZhbGlkRHVyYXRpb24gKHZhbCkgewogIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsKQp9CgovKioKICogTm9ybWFsaXplIGEgdHJhbnNpdGlvbiBob29rJ3MgYXJndW1lbnQgbGVuZ3RoLiBUaGUgaG9vayBtYXkgYmU6CiAqIC0gYSBtZXJnZWQgaG9vayAoaW52b2tlcikgd2l0aCB0aGUgb3JpZ2luYWwgaW4gLmZucwogKiAtIGEgd3JhcHBlZCBjb21wb25lbnQgbWV0aG9kIChjaGVjayAuX2xlbmd0aCkKICogLSBhIHBsYWluIGZ1bmN0aW9uICgubGVuZ3RoKQogKi8KZnVuY3Rpb24gZ2V0SG9va0FyZ3VtZW50c0xlbmd0aCAoZm4pIHsKICBpZiAoaXNVbmRlZihmbikpIHsKICAgIHJldHVybiBmYWxzZQogIH0KICB2YXIgaW52b2tlckZucyA9IGZuLmZuczsKICBpZiAoaXNEZWYoaW52b2tlckZucykpIHsKICAgIC8vIGludm9rZXIKICAgIHJldHVybiBnZXRIb29rQXJndW1lbnRzTGVuZ3RoKAogICAgICBBcnJheS5pc0FycmF5KGludm9rZXJGbnMpCiAgICAgICAgPyBpbnZva2VyRm5zWzBdCiAgICAgICAgOiBpbnZva2VyRm5zCiAgICApCiAgfSBlbHNlIHsKICAgIHJldHVybiAoZm4uX2xlbmd0aCB8fCBmbi5sZW5ndGgpID4gMQogIH0KfQoKZnVuY3Rpb24gX2VudGVyIChfLCB2bm9kZSkgewogIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHsKICAgIGVudGVyKHZub2RlKTsKICB9Cn0KCnZhciB0cmFuc2l0aW9uID0gaW5Ccm93c2VyID8gewogIGNyZWF0ZTogX2VudGVyLAogIGFjdGl2YXRlOiBfZW50ZXIsCiAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUkJDEgKHZub2RlLCBybSkgewogICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi8KICAgIGlmICh2bm9kZS5kYXRhLnNob3cgIT09IHRydWUpIHsKICAgICAgbGVhdmUodm5vZGUsIHJtKTsKICAgIH0gZWxzZSB7CiAgICAgIHJtKCk7CiAgICB9CiAgfQp9IDoge30KCnZhciBwbGF0Zm9ybU1vZHVsZXMgPSBbCiAgYXR0cnMsCiAga2xhc3MsCiAgZXZlbnRzLAogIGRvbVByb3BzLAogIHN0eWxlLAogIHRyYW5zaXRpb24KXQoKLyogICovCgovLyB0aGUgZGlyZWN0aXZlIG1vZHVsZSBzaG91bGQgYmUgYXBwbGllZCBsYXN0LCBhZnRlciBhbGwKLy8gYnVpbHQtaW4gbW9kdWxlcyBoYXZlIGJlZW4gYXBwbGllZC4KdmFyIG1vZHVsZXMgPSBwbGF0Zm9ybU1vZHVsZXMuY29uY2F0KGJhc2VNb2R1bGVzKTsKCnZhciBwYXRjaCA9IGNyZWF0ZVBhdGNoRnVuY3Rpb24oeyBub2RlT3BzOiBub2RlT3BzLCBtb2R1bGVzOiBtb2R1bGVzIH0pOwoKLyoqCiAqIE5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBsaWtlIGF0dGFjaGluZwogKiBwcm9wZXJ0aWVzIHRvIEVsZW1lbnRzLgogKi8KCi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwppZiAoaXNJRTkpIHsKICAvLyBodHRwOi8vd3d3Lm1hdHRzNDExLmNvbS9wb3N0L2ludGVybmV0LWV4cGxvcmVyLTktb25pbnB1dC8KICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25jaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgZWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwogICAgaWYgKGVsICYmIGVsLnZtb2RlbCkgewogICAgICB0cmlnZ2VyKGVsLCAnaW5wdXQnKTsKICAgIH0KICB9KTsKfQoKdmFyIGRpcmVjdGl2ZSA9IHsKICBpbnNlcnRlZDogZnVuY3Rpb24gaW5zZXJ0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSwgb2xkVm5vZGUpIHsKICAgIGlmICh2bm9kZS50YWcgPT09ICdzZWxlY3QnKSB7CiAgICAgIC8vICM2OTAzCiAgICAgIGlmIChvbGRWbm9kZS5lbG0gJiYgIW9sZFZub2RlLmVsbS5fdk9wdGlvbnMpIHsKICAgICAgICBtZXJnZVZOb2RlSG9vayh2bm9kZSwgJ3Bvc3RwYXRjaCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGRpcmVjdGl2ZS5jb21wb25lbnRVcGRhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOwogICAgICB9CiAgICAgIGVsLl92T3B0aW9ucyA9IFtdLm1hcC5jYWxsKGVsLm9wdGlvbnMsIGdldFZhbHVlKTsKICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSAndGV4dGFyZWEnIHx8IGlzVGV4dElucHV0VHlwZShlbC50eXBlKSkgewogICAgICBlbC5fdk1vZGlmaWVycyA9IGJpbmRpbmcubW9kaWZpZXJzOwogICAgICBpZiAoIWJpbmRpbmcubW9kaWZpZXJzLmxhenkpIHsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbnN0YXJ0Jywgb25Db21wb3NpdGlvblN0YXJ0KTsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjb21wb3NpdGlvbmVuZCcsIG9uQ29tcG9zaXRpb25FbmQpOwogICAgICAgIC8vIFNhZmFyaSA8IDEwLjIgJiBVSVdlYlZpZXcgZG9lc24ndCBmaXJlIGNvbXBvc2l0aW9uZW5kIHdoZW4KICAgICAgICAvLyBzd2l0Y2hpbmcgZm9jdXMgYmVmb3JlIGNvbmZpcm1pbmcgY29tcG9zaXRpb24gY2hvaWNlCiAgICAgICAgLy8gdGhpcyBhbHNvIGZpeGVzIHRoZSBpc3N1ZSB3aGVyZSBzb21lIGJyb3dzZXJzIGUuZy4gaU9TIENocm9tZQogICAgICAgIC8vIGZpcmVzICJjaGFuZ2UiIGluc3RlYWQgb2YgImlucHV0IiBvbiBhdXRvY29tcGxldGUuCiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25Db21wb3NpdGlvbkVuZCk7CiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgICAgaWYgKGlzSUU5KSB7CiAgICAgICAgICBlbC52bW9kZWwgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCgogIGNvbXBvbmVudFVwZGF0ZWQ6IGZ1bmN0aW9uIGNvbXBvbmVudFVwZGF0ZWQgKGVsLCBiaW5kaW5nLCB2bm9kZSkgewogICAgaWYgKHZub2RlLnRhZyA9PT0gJ3NlbGVjdCcpIHsKICAgICAgc2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLmNvbnRleHQpOwogICAgICAvLyBpbiBjYXNlIHRoZSBvcHRpb25zIHJlbmRlcmVkIGJ5IHYtZm9yIGhhdmUgY2hhbmdlZCwKICAgICAgLy8gaXQncyBwb3NzaWJsZSB0aGF0IHRoZSB2YWx1ZSBpcyBvdXQtb2Ytc3luYyB3aXRoIHRoZSByZW5kZXJlZCBvcHRpb25zLgogICAgICAvLyBkZXRlY3Qgc3VjaCBjYXNlcyBhbmQgZmlsdGVyIG91dCB2YWx1ZXMgdGhhdCBubyBsb25nZXIgaGFzIGEgbWF0Y2hpbmcKICAgICAgLy8gb3B0aW9uIGluIHRoZSBET00uCiAgICAgIHZhciBwcmV2T3B0aW9ucyA9IGVsLl92T3B0aW9uczsKICAgICAgdmFyIGN1ck9wdGlvbnMgPSBlbC5fdk9wdGlvbnMgPSBbXS5tYXAuY2FsbChlbC5vcHRpb25zLCBnZXRWYWx1ZSk7CiAgICAgIGlmIChjdXJPcHRpb25zLnNvbWUoZnVuY3Rpb24gKG8sIGkpIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHByZXZPcHRpb25zW2ldKTsgfSkpIHsKICAgICAgICAvLyB0cmlnZ2VyIGNoYW5nZSBldmVudCBpZgogICAgICAgIC8vIG5vIG1hdGNoaW5nIG9wdGlvbiBmb3VuZCBmb3IgYXQgbGVhc3Qgb25lIHZhbHVlCiAgICAgICAgdmFyIG5lZWRSZXNldCA9IGVsLm11bHRpcGxlCiAgICAgICAgICA/IGJpbmRpbmcudmFsdWUuc29tZShmdW5jdGlvbiAodikgeyByZXR1cm4gaGFzTm9NYXRjaGluZ09wdGlvbih2LCBjdXJPcHRpb25zKTsgfSkKICAgICAgICAgIDogYmluZGluZy52YWx1ZSAhPT0gYmluZGluZy5vbGRWYWx1ZSAmJiBoYXNOb01hdGNoaW5nT3B0aW9uKGJpbmRpbmcudmFsdWUsIGN1ck9wdGlvbnMpOwogICAgICAgIGlmIChuZWVkUmVzZXQpIHsKICAgICAgICAgIHRyaWdnZXIoZWwsICdjaGFuZ2UnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CgpmdW5jdGlvbiBzZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7CiAgYWN0dWFsbHlTZXRTZWxlY3RlZChlbCwgYmluZGluZywgdm0pOwogIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogIGlmIChpc0lFIHx8IGlzRWRnZSkgewogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgIGFjdHVhbGx5U2V0U2VsZWN0ZWQoZWwsIGJpbmRpbmcsIHZtKTsKICAgIH0sIDApOwogIH0KfQoKZnVuY3Rpb24gYWN0dWFsbHlTZXRTZWxlY3RlZCAoZWwsIGJpbmRpbmcsIHZtKSB7CiAgdmFyIHZhbHVlID0gYmluZGluZy52YWx1ZTsKICB2YXIgaXNNdWx0aXBsZSA9IGVsLm11bHRpcGxlOwogIGlmIChpc011bHRpcGxlICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oCiAgICAgICI8c2VsZWN0IG11bHRpcGxlIHYtbW9kZWw9XCIiICsgKGJpbmRpbmcuZXhwcmVzc2lvbikgKyAiXCI+ICIgKwogICAgICAiZXhwZWN0cyBhbiBBcnJheSB2YWx1ZSBmb3IgaXRzIGJpbmRpbmcsIGJ1dCBnb3QgIiArIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKSksCiAgICAgIHZtCiAgICApOwogICAgcmV0dXJuCiAgfQogIHZhciBzZWxlY3RlZCwgb3B0aW9uOwogIGZvciAodmFyIGkgPSAwLCBsID0gZWwub3B0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgIG9wdGlvbiA9IGVsLm9wdGlvbnNbaV07CiAgICBpZiAoaXNNdWx0aXBsZSkgewogICAgICBzZWxlY3RlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgZ2V0VmFsdWUob3B0aW9uKSkgPiAtMTsKICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHsKICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBzZWxlY3RlZDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uKSwgdmFsdWUpKSB7CiAgICAgICAgaWYgKGVsLnNlbGVjdGVkSW5kZXggIT09IGkpIHsKICAgICAgICAgIGVsLnNlbGVjdGVkSW5kZXggPSBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4KICAgICAgfQogICAgfQogIH0KICBpZiAoIWlzTXVsdGlwbGUpIHsKICAgIGVsLnNlbGVjdGVkSW5kZXggPSAtMTsKICB9Cn0KCmZ1bmN0aW9uIGhhc05vTWF0Y2hpbmdPcHRpb24gKHZhbHVlLCBvcHRpb25zKSB7CiAgcmV0dXJuIG9wdGlvbnMuZXZlcnkoZnVuY3Rpb24gKG8pIHsgcmV0dXJuICFsb29zZUVxdWFsKG8sIHZhbHVlKTsgfSkKfQoKZnVuY3Rpb24gZ2V0VmFsdWUgKG9wdGlvbikgewogIHJldHVybiAnX3ZhbHVlJyBpbiBvcHRpb24KICAgID8gb3B0aW9uLl92YWx1ZQogICAgOiBvcHRpb24udmFsdWUKfQoKZnVuY3Rpb24gb25Db21wb3NpdGlvblN0YXJ0IChlKSB7CiAgZS50YXJnZXQuY29tcG9zaW5nID0gdHJ1ZTsKfQoKZnVuY3Rpb24gb25Db21wb3NpdGlvbkVuZCAoZSkgewogIC8vIHByZXZlbnQgdHJpZ2dlcmluZyBhbiBpbnB1dCBldmVudCBmb3Igbm8gcmVhc29uCiAgaWYgKCFlLnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuIH0KICBlLnRhcmdldC5jb21wb3NpbmcgPSBmYWxzZTsKICB0cmlnZ2VyKGUudGFyZ2V0LCAnaW5wdXQnKTsKfQoKZnVuY3Rpb24gdHJpZ2dlciAoZWwsIHR5cGUpIHsKICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7CiAgZS5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSk7CiAgZWwuZGlzcGF0Y2hFdmVudChlKTsKfQoKLyogICovCgovLyByZWN1cnNpdmVseSBzZWFyY2ggZm9yIHBvc3NpYmxlIHRyYW5zaXRpb24gZGVmaW5lZCBpbnNpZGUgdGhlIGNvbXBvbmVudCByb290CmZ1bmN0aW9uIGxvY2F0ZU5vZGUgKHZub2RlKSB7CiAgcmV0dXJuIHZub2RlLmNvbXBvbmVudEluc3RhbmNlICYmICghdm5vZGUuZGF0YSB8fCAhdm5vZGUuZGF0YS50cmFuc2l0aW9uKQogICAgPyBsb2NhdGVOb2RlKHZub2RlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkKICAgIDogdm5vZGUKfQoKdmFyIHNob3cgPSB7CiAgYmluZDogZnVuY3Rpb24gYmluZCAoZWwsIHJlZiwgdm5vZGUpIHsKICAgIHZhciB2YWx1ZSA9IHJlZi52YWx1ZTsKCiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpOwogICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjsKICAgIHZhciBvcmlnaW5hbERpc3BsYXkgPSBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgPQogICAgICBlbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnJyA6IGVsLnN0eWxlLmRpc3BsYXk7CiAgICBpZiAodmFsdWUgJiYgdHJhbnNpdGlvbiQkMSkgewogICAgICB2bm9kZS5kYXRhLnNob3cgPSB0cnVlOwogICAgICBlbnRlcih2bm9kZSwgZnVuY3Rpb24gKCkgewogICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSBvcmlnaW5hbERpc3BsYXk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gb3JpZ2luYWxEaXNwbGF5IDogJ25vbmUnOwogICAgfQogIH0sCgogIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlIChlbCwgcmVmLCB2bm9kZSkgewogICAgdmFyIHZhbHVlID0gcmVmLnZhbHVlOwogICAgdmFyIG9sZFZhbHVlID0gcmVmLm9sZFZhbHVlOwoKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKCF2YWx1ZSA9PT0gIW9sZFZhbHVlKSB7IHJldHVybiB9CiAgICB2bm9kZSA9IGxvY2F0ZU5vZGUodm5vZGUpOwogICAgdmFyIHRyYW5zaXRpb24kJDEgPSB2bm9kZS5kYXRhICYmIHZub2RlLmRhdGEudHJhbnNpdGlvbjsKICAgIGlmICh0cmFuc2l0aW9uJCQxKSB7CiAgICAgIHZub2RlLmRhdGEuc2hvdyA9IHRydWU7CiAgICAgIGlmICh2YWx1ZSkgewogICAgICAgIGVudGVyKHZub2RlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gZWwuX192T3JpZ2luYWxEaXNwbGF5OwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGxlYXZlKHZub2RlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyBlbC5fX3ZPcmlnaW5hbERpc3BsYXkgOiAnbm9uZSc7CiAgICB9CiAgfSwKCiAgdW5iaW5kOiBmdW5jdGlvbiB1bmJpbmQgKAogICAgZWwsCiAgICBiaW5kaW5nLAogICAgdm5vZGUsCiAgICBvbGRWbm9kZSwKICAgIGlzRGVzdHJveQogICkgewogICAgaWYgKCFpc0Rlc3Ryb3kpIHsKICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IGVsLl9fdk9yaWdpbmFsRGlzcGxheTsKICAgIH0KICB9Cn0KCnZhciBwbGF0Zm9ybURpcmVjdGl2ZXMgPSB7CiAgbW9kZWw6IGRpcmVjdGl2ZSwKICBzaG93OiBzaG93Cn0KCi8qICAqLwoKLy8gUHJvdmlkZXMgdHJhbnNpdGlvbiBzdXBwb3J0IGZvciBhIHNpbmdsZSBlbGVtZW50L2NvbXBvbmVudC4KLy8gc3VwcG9ydHMgdHJhbnNpdGlvbiBtb2RlIChvdXQtaW4gLyBpbi1vdXQpCgp2YXIgdHJhbnNpdGlvblByb3BzID0gewogIG5hbWU6IFN0cmluZywKICBhcHBlYXI6IEJvb2xlYW4sCiAgY3NzOiBCb29sZWFuLAogIG1vZGU6IFN0cmluZywKICB0eXBlOiBTdHJpbmcsCiAgZW50ZXJDbGFzczogU3RyaW5nLAogIGxlYXZlQ2xhc3M6IFN0cmluZywKICBlbnRlclRvQ2xhc3M6IFN0cmluZywKICBsZWF2ZVRvQ2xhc3M6IFN0cmluZywKICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsCiAgbGVhdmVBY3RpdmVDbGFzczogU3RyaW5nLAogIGFwcGVhckNsYXNzOiBTdHJpbmcsCiAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZywKICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsCiAgZHVyYXRpb246IFtOdW1iZXIsIFN0cmluZywgT2JqZWN0XQp9OwoKLy8gaW4gY2FzZSB0aGUgY2hpbGQgaXMgYWxzbyBhbiBhYnN0cmFjdCBjb21wb25lbnQsIGUuZy4gPGtlZXAtYWxpdmU+Ci8vIHdlIHdhbnQgdG8gcmVjdXJzaXZlbHkgcmV0cmlldmUgdGhlIHJlYWwgY29tcG9uZW50IHRvIGJlIHJlbmRlcmVkCmZ1bmN0aW9uIGdldFJlYWxDaGlsZCAodm5vZGUpIHsKICB2YXIgY29tcE9wdGlvbnMgPSB2bm9kZSAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zOwogIGlmIChjb21wT3B0aW9ucyAmJiBjb21wT3B0aW9ucy5DdG9yLm9wdGlvbnMuYWJzdHJhY3QpIHsKICAgIHJldHVybiBnZXRSZWFsQ2hpbGQoZ2V0Rmlyc3RDb21wb25lbnRDaGlsZChjb21wT3B0aW9ucy5jaGlsZHJlbikpCiAgfSBlbHNlIHsKICAgIHJldHVybiB2bm9kZQogIH0KfQoKZnVuY3Rpb24gZXh0cmFjdFRyYW5zaXRpb25EYXRhIChjb21wKSB7CiAgdmFyIGRhdGEgPSB7fTsKICB2YXIgb3B0aW9ucyA9IGNvbXAuJG9wdGlvbnM7CiAgLy8gcHJvcHMKICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucy5wcm9wc0RhdGEpIHsKICAgIGRhdGFba2V5XSA9IGNvbXBba2V5XTsKICB9CiAgLy8gZXZlbnRzLgogIC8vIGV4dHJhY3QgbGlzdGVuZXJzIGFuZCBwYXNzIHRoZW0gZGlyZWN0bHkgdG8gdGhlIHRyYW5zaXRpb24gbWV0aG9kcwogIHZhciBsaXN0ZW5lcnMgPSBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7CiAgZm9yICh2YXIga2V5JDEgaW4gbGlzdGVuZXJzKSB7CiAgICBkYXRhW2NhbWVsaXplKGtleSQxKV0gPSBsaXN0ZW5lcnNba2V5JDFdOwogIH0KICByZXR1cm4gZGF0YQp9CgpmdW5jdGlvbiBwbGFjZWhvbGRlciAoaCwgcmF3Q2hpbGQpIHsKICBpZiAoL1xkLWtlZXAtYWxpdmUkLy50ZXN0KHJhd0NoaWxkLnRhZykpIHsKICAgIHJldHVybiBoKCdrZWVwLWFsaXZlJywgewogICAgICBwcm9wczogcmF3Q2hpbGQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGEKICAgIH0pCiAgfQp9CgpmdW5jdGlvbiBoYXNQYXJlbnRUcmFuc2l0aW9uICh2bm9kZSkgewogIHdoaWxlICgodm5vZGUgPSB2bm9kZS5wYXJlbnQpKSB7CiAgICBpZiAodm5vZGUuZGF0YS50cmFuc2l0aW9uKSB7CiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBpc1NhbWVDaGlsZCAoY2hpbGQsIG9sZENoaWxkKSB7CiAgcmV0dXJuIG9sZENoaWxkLmtleSA9PT0gY2hpbGQua2V5ICYmIG9sZENoaWxkLnRhZyA9PT0gY2hpbGQudGFnCn0KCnZhciBUcmFuc2l0aW9uID0gewogIG5hbWU6ICd0cmFuc2l0aW9uJywKICBwcm9wczogdHJhbnNpdGlvblByb3BzLAogIGFic3RyYWN0OiB0cnVlLAoKICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIGNoaWxkcmVuID0gdGhpcy4kc2xvdHMuZGVmYXVsdDsKICAgIGlmICghY2hpbGRyZW4pIHsKICAgICAgcmV0dXJuCiAgICB9CgogICAgLy8gZmlsdGVyIG91dCB0ZXh0IG5vZGVzIChwb3NzaWJsZSB3aGl0ZXNwYWNlcykKICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRhZyB8fCBpc0FzeW5jUGxhY2Vob2xkZXIoYyk7IH0pOwogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkgewogICAgICByZXR1cm4KICAgIH0KCiAgICAvLyB3YXJuIG11bHRpcGxlIGVsZW1lbnRzCiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgd2FybigKICAgICAgICAnPHRyYW5zaXRpb24+IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzaW5nbGUgZWxlbWVudC4gVXNlICcgKwogICAgICAgICc8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLicsCiAgICAgICAgdGhpcy4kcGFyZW50CiAgICAgICk7CiAgICB9CgogICAgdmFyIG1vZGUgPSB0aGlzLm1vZGU7CgogICAgLy8gd2FybiBpbnZhbGlkIG1vZGUKICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgbW9kZSAmJiBtb2RlICE9PSAnaW4tb3V0JyAmJiBtb2RlICE9PSAnb3V0LWluJwogICAgKSB7CiAgICAgIHdhcm4oCiAgICAgICAgJ2ludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICcgKyBtb2RlLAogICAgICAgIHRoaXMuJHBhcmVudAogICAgICApOwogICAgfQoKICAgIHZhciByYXdDaGlsZCA9IGNoaWxkcmVuWzBdOwoKICAgIC8vIGlmIHRoaXMgaXMgYSBjb21wb25lbnQgcm9vdCBub2RlIGFuZCB0aGUgY29tcG9uZW50J3MKICAgIC8vIHBhcmVudCBjb250YWluZXIgbm9kZSBhbHNvIGhhcyB0cmFuc2l0aW9uLCBza2lwLgogICAgaWYgKGhhc1BhcmVudFRyYW5zaXRpb24odGhpcy4kdm5vZGUpKSB7CiAgICAgIHJldHVybiByYXdDaGlsZAogICAgfQoKICAgIC8vIGFwcGx5IHRyYW5zaXRpb24gZGF0YSB0byBjaGlsZAogICAgLy8gdXNlIGdldFJlYWxDaGlsZCgpIHRvIGlnbm9yZSBhYnN0cmFjdCBjb21wb25lbnRzIGUuZy4ga2VlcC1hbGl2ZQogICAgdmFyIGNoaWxkID0gZ2V0UmVhbENoaWxkKHJhd0NoaWxkKTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgaWYgKCFjaGlsZCkgewogICAgICByZXR1cm4gcmF3Q2hpbGQKICAgIH0KCiAgICBpZiAodGhpcy5fbGVhdmluZykgewogICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpCiAgICB9CgogICAgLy8gZW5zdXJlIGEga2V5IHRoYXQgaXMgdW5pcXVlIHRvIHRoZSB2bm9kZSB0eXBlIGFuZCB0byB0aGlzIHRyYW5zaXRpb24KICAgIC8vIGNvbXBvbmVudCBpbnN0YW5jZS4gVGhpcyBrZXkgd2lsbCBiZSB1c2VkIHRvIHJlbW92ZSBwZW5kaW5nIGxlYXZpbmcgbm9kZXMKICAgIC8vIGR1cmluZyBlbnRlcmluZy4KICAgIHZhciBpZCA9ICJfX3RyYW5zaXRpb24tIiArICh0aGlzLl91aWQpICsgIi0iOwogICAgY2hpbGQua2V5ID0gY2hpbGQua2V5ID09IG51bGwKICAgICAgPyBjaGlsZC5pc0NvbW1lbnQKICAgICAgICA/IGlkICsgJ2NvbW1lbnQnCiAgICAgICAgOiBpZCArIGNoaWxkLnRhZwogICAgICA6IGlzUHJpbWl0aXZlKGNoaWxkLmtleSkKICAgICAgICA/IChTdHJpbmcoY2hpbGQua2V5KS5pbmRleE9mKGlkKSA9PT0gMCA/IGNoaWxkLmtleSA6IGlkICsgY2hpbGQua2V5KQogICAgICAgIDogY2hpbGQua2V5OwoKICAgIHZhciBkYXRhID0gKGNoaWxkLmRhdGEgfHwgKGNoaWxkLmRhdGEgPSB7fSkpLnRyYW5zaXRpb24gPSBleHRyYWN0VHJhbnNpdGlvbkRhdGEodGhpcyk7CiAgICB2YXIgb2xkUmF3Q2hpbGQgPSB0aGlzLl92bm9kZTsKICAgIHZhciBvbGRDaGlsZCA9IGdldFJlYWxDaGlsZChvbGRSYXdDaGlsZCk7CgogICAgLy8gbWFyayB2LXNob3cKICAgIC8vIHNvIHRoYXQgdGhlIHRyYW5zaXRpb24gbW9kdWxlIGNhbiBoYW5kIG92ZXIgdGhlIGNvbnRyb2wgdG8gdGhlIGRpcmVjdGl2ZQogICAgaWYgKGNoaWxkLmRhdGEuZGlyZWN0aXZlcyAmJiBjaGlsZC5kYXRhLmRpcmVjdGl2ZXMuc29tZShmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5uYW1lID09PSAnc2hvdyc7IH0pKSB7CiAgICAgIGNoaWxkLmRhdGEuc2hvdyA9IHRydWU7CiAgICB9CgogICAgaWYgKAogICAgICBvbGRDaGlsZCAmJgogICAgICBvbGRDaGlsZC5kYXRhICYmCiAgICAgICFpc1NhbWVDaGlsZChjaGlsZCwgb2xkQ2hpbGQpICYmCiAgICAgICFpc0FzeW5jUGxhY2Vob2xkZXIob2xkQ2hpbGQpICYmCiAgICAgIC8vICM2Njg3IGNvbXBvbmVudCByb290IGlzIGEgY29tbWVudCBub2RlCiAgICAgICEob2xkQ2hpbGQuY29tcG9uZW50SW5zdGFuY2UgJiYgb2xkQ2hpbGQuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLmlzQ29tbWVudCkKICAgICkgewogICAgICAvLyByZXBsYWNlIG9sZCBjaGlsZCB0cmFuc2l0aW9uIGRhdGEgd2l0aCBmcmVzaCBvbmUKICAgICAgLy8gaW1wb3J0YW50IGZvciBkeW5hbWljIHRyYW5zaXRpb25zIQogICAgICB2YXIgb2xkRGF0YSA9IG9sZENoaWxkLmRhdGEudHJhbnNpdGlvbiA9IGV4dGVuZCh7fSwgZGF0YSk7CiAgICAgIC8vIGhhbmRsZSB0cmFuc2l0aW9uIG1vZGUKICAgICAgaWYgKG1vZGUgPT09ICdvdXQtaW4nKSB7CiAgICAgICAgLy8gcmV0dXJuIHBsYWNlaG9sZGVyIG5vZGUgYW5kIHF1ZXVlIHVwZGF0ZSB3aGVuIGxlYXZlIGZpbmlzaGVzCiAgICAgICAgdGhpcy5fbGVhdmluZyA9IHRydWU7CiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2FmdGVyTGVhdmUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB0aGlzJDEuX2xlYXZpbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMkMS4kZm9yY2VVcGRhdGUoKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXIoaCwgcmF3Q2hpbGQpCiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2luLW91dCcpIHsKICAgICAgICBpZiAoaXNBc3luY1BsYWNlaG9sZGVyKGNoaWxkKSkgewogICAgICAgICAgcmV0dXJuIG9sZFJhd0NoaWxkCiAgICAgICAgfQogICAgICAgIHZhciBkZWxheWVkTGVhdmU7CiAgICAgICAgdmFyIHBlcmZvcm1MZWF2ZSA9IGZ1bmN0aW9uICgpIHsgZGVsYXllZExlYXZlKCk7IH07CiAgICAgICAgbWVyZ2VWTm9kZUhvb2soZGF0YSwgJ2FmdGVyRW50ZXInLCBwZXJmb3JtTGVhdmUpOwogICAgICAgIG1lcmdlVk5vZGVIb29rKGRhdGEsICdlbnRlckNhbmNlbGxlZCcsIHBlcmZvcm1MZWF2ZSk7CiAgICAgICAgbWVyZ2VWTm9kZUhvb2sob2xkRGF0YSwgJ2RlbGF5TGVhdmUnLCBmdW5jdGlvbiAobGVhdmUpIHsgZGVsYXllZExlYXZlID0gbGVhdmU7IH0pOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJhd0NoaWxkCiAgfQp9CgovKiAgKi8KCi8vIFByb3ZpZGVzIHRyYW5zaXRpb24gc3VwcG9ydCBmb3IgbGlzdCBpdGVtcy4KLy8gc3VwcG9ydHMgbW92ZSB0cmFuc2l0aW9ucyB1c2luZyB0aGUgRkxJUCB0ZWNobmlxdWUuCgovLyBCZWNhdXNlIHRoZSB2ZG9tJ3MgY2hpbGRyZW4gdXBkYXRlIGFsZ29yaXRobSBpcyAidW5zdGFibGUiIC0gaS5lLgovLyBpdCBkb2Vzbid0IGd1YXJhbnRlZSB0aGUgcmVsYXRpdmUgcG9zaXRpb25pbmcgb2YgcmVtb3ZlZCBlbGVtZW50cywKLy8gd2UgZm9yY2UgdHJhbnNpdGlvbi1ncm91cCB0byB1cGRhdGUgaXRzIGNoaWxkcmVuIGludG8gdHdvIHBhc3NlczoKLy8gaW4gdGhlIGZpcnN0IHBhc3MsIHdlIHJlbW92ZSBhbGwgbm9kZXMgdGhhdCBuZWVkIHRvIGJlIHJlbW92ZWQsCi8vIHRyaWdnZXJpbmcgdGhlaXIgbGVhdmluZyB0cmFuc2l0aW9uOyBpbiB0aGUgc2Vjb25kIHBhc3MsIHdlIGluc2VydC9tb3ZlCi8vIGludG8gdGhlIGZpbmFsIGRlc2lyZWQgc3RhdGUuIFRoaXMgd2F5IGluIHRoZSBzZWNvbmQgcGFzcyByZW1vdmVkCi8vIG5vZGVzIHdpbGwgcmVtYWluIHdoZXJlIHRoZXkgc2hvdWxkIGJlLgoKdmFyIHByb3BzID0gZXh0ZW5kKHsKICB0YWc6IFN0cmluZywKICBtb3ZlQ2xhc3M6IFN0cmluZwp9LCB0cmFuc2l0aW9uUHJvcHMpOwoKZGVsZXRlIHByb3BzLm1vZGU7Cgp2YXIgVHJhbnNpdGlvbkdyb3VwID0gewogIHByb3BzOiBwcm9wcywKCiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgpIHsKICAgIHZhciB0YWcgPSB0aGlzLnRhZyB8fCB0aGlzLiR2bm9kZS5kYXRhLnRhZyB8fCAnc3Bhbic7CiAgICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CiAgICB2YXIgcmF3Q2hpbGRyZW4gPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdOwogICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgdmFyIHRyYW5zaXRpb25EYXRhID0gZXh0cmFjdFRyYW5zaXRpb25EYXRhKHRoaXMpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmF3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGMgPSByYXdDaGlsZHJlbltpXTsKICAgICAgaWYgKGMudGFnKSB7CiAgICAgICAgaWYgKGMua2V5ICE9IG51bGwgJiYgU3RyaW5nKGMua2V5KS5pbmRleE9mKCdfX3ZsaXN0JykgIT09IDApIHsKICAgICAgICAgIGNoaWxkcmVuLnB1c2goYyk7CiAgICAgICAgICBtYXBbYy5rZXldID0gYwogICAgICAgICAgOyhjLmRhdGEgfHwgKGMuZGF0YSA9IHt9KSkudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25EYXRhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgb3B0cyA9IGMuY29tcG9uZW50T3B0aW9uczsKICAgICAgICAgIHZhciBuYW1lID0gb3B0cyA/IChvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnIHx8ICcnKSA6IGMudGFnOwogICAgICAgICAgd2FybigoIjx0cmFuc2l0aW9uLWdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkOiA8IiArIG5hbWUgKyAiPiIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAocHJldkNoaWxkcmVuKSB7CiAgICAgIHZhciBrZXB0ID0gW107CiAgICAgIHZhciByZW1vdmVkID0gW107CiAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHByZXZDaGlsZHJlbi5sZW5ndGg7IGkkMSsrKSB7CiAgICAgICAgdmFyIGMkMSA9IHByZXZDaGlsZHJlbltpJDFdOwogICAgICAgIGMkMS5kYXRhLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTsKICAgICAgICBjJDEuZGF0YS5wb3MgPSBjJDEuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGlmIChtYXBbYyQxLmtleV0pIHsKICAgICAgICAgIGtlcHQucHVzaChjJDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZW1vdmVkLnB1c2goYyQxKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5rZXB0ID0gaCh0YWcsIG51bGwsIGtlcHQpOwogICAgICB0aGlzLnJlbW92ZWQgPSByZW1vdmVkOwogICAgfQoKICAgIHJldHVybiBoKHRhZywgbnVsbCwgY2hpbGRyZW4pCiAgfSwKCiAgYmVmb3JlVXBkYXRlOiBmdW5jdGlvbiBiZWZvcmVVcGRhdGUgKCkgewogICAgLy8gZm9yY2UgcmVtb3ZpbmcgcGFzcwogICAgdGhpcy5fX3BhdGNoX18oCiAgICAgIHRoaXMuX3Zub2RlLAogICAgICB0aGlzLmtlcHQsCiAgICAgIGZhbHNlLCAvLyBoeWRyYXRpbmcKICAgICAgdHJ1ZSAvLyByZW1vdmVPbmx5ICghaW1wb3J0YW50LCBhdm9pZHMgdW5uZWNlc3NhcnkgbW92ZXMpCiAgICApOwogICAgdGhpcy5fdm5vZGUgPSB0aGlzLmtlcHQ7CiAgfSwKCiAgdXBkYXRlZDogZnVuY3Rpb24gdXBkYXRlZCAoKSB7CiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbjsKICAgIHZhciBtb3ZlQ2xhc3MgPSB0aGlzLm1vdmVDbGFzcyB8fCAoKHRoaXMubmFtZSB8fCAndicpICsgJy1tb3ZlJyk7CiAgICBpZiAoIWNoaWxkcmVuLmxlbmd0aCB8fCAhdGhpcy5oYXNNb3ZlKGNoaWxkcmVuWzBdLmVsbSwgbW92ZUNsYXNzKSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICAvLyB3ZSBkaXZpZGUgdGhlIHdvcmsgaW50byB0aHJlZSBsb29wcyB0byBhdm9pZCBtaXhpbmcgRE9NIHJlYWRzIGFuZCB3cml0ZXMKICAgIC8vIGluIGVhY2ggaXRlcmF0aW9uIC0gd2hpY2ggaGVscHMgcHJldmVudCBsYXlvdXQgdGhyYXNoaW5nLgogICAgY2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7CiAgICBjaGlsZHJlbi5mb3JFYWNoKHJlY29yZFBvc2l0aW9uKTsKICAgIGNoaWxkcmVuLmZvckVhY2goYXBwbHlUcmFuc2xhdGlvbik7CgogICAgLy8gZm9yY2UgcmVmbG93IHRvIHB1dCBldmVyeXRoaW5nIGluIHBvc2l0aW9uCiAgICAvLyBhc3NpZ24gdG8gdGhpcyB0byBhdm9pZCBiZWluZyByZW1vdmVkIGluIHRyZWUtc2hha2luZwogICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lCiAgICB0aGlzLl9yZWZsb3cgPSBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDsKCiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7CiAgICAgIGlmIChjLmRhdGEubW92ZWQpIHsKICAgICAgICB2YXIgZWwgPSBjLmVsbTsKICAgICAgICB2YXIgcyA9IGVsLnN0eWxlOwogICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTsKICAgICAgICBzLnRyYW5zZm9ybSA9IHMuV2Via2l0VHJhbnNmb3JtID0gcy50cmFuc2l0aW9uRHVyYXRpb24gPSAnJzsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKHRyYW5zaXRpb25FbmRFdmVudCwgZWwuX21vdmVDYiA9IGZ1bmN0aW9uIGNiIChlKSB7CiAgICAgICAgICBpZiAoIWUgfHwgL3RyYW5zZm9ybSQvLnRlc3QoZS5wcm9wZXJ0eU5hbWUpKSB7CiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJhbnNpdGlvbkVuZEV2ZW50LCBjYik7CiAgICAgICAgICAgIGVsLl9tb3ZlQ2IgPSBudWxsOwogICAgICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogIH0sCgogIG1ldGhvZHM6IHsKICAgIGhhc01vdmU6IGZ1bmN0aW9uIGhhc01vdmUgKGVsLCBtb3ZlQ2xhc3MpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICghaGFzVHJhbnNpdGlvbikgewogICAgICAgIHJldHVybiBmYWxzZQogICAgICB9CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAodGhpcy5faGFzTW92ZSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNNb3ZlCiAgICAgIH0KICAgICAgLy8gRGV0ZWN0IHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBtb3ZlIGNsYXNzIGFwcGxpZWQgaGFzCiAgICAgIC8vIENTUyB0cmFuc2l0aW9ucy4gU2luY2UgdGhlIGVsZW1lbnQgbWF5IGJlIGluc2lkZSBhbiBlbnRlcmluZwogICAgICAvLyB0cmFuc2l0aW9uIGF0IHRoaXMgdmVyeSBtb21lbnQsIHdlIG1ha2UgYSBjbG9uZSBvZiBpdCBhbmQgcmVtb3ZlCiAgICAgIC8vIGFsbCBvdGhlciB0cmFuc2l0aW9uIGNsYXNzZXMgYXBwbGllZCB0byBlbnN1cmUgb25seSB0aGUgbW92ZSBjbGFzcwogICAgICAvLyBpcyBhcHBsaWVkLgogICAgICB2YXIgY2xvbmUgPSBlbC5jbG9uZU5vZGUoKTsKICAgICAgaWYgKGVsLl90cmFuc2l0aW9uQ2xhc3NlcykgewogICAgICAgIGVsLl90cmFuc2l0aW9uQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjbHMpIHsgcmVtb3ZlQ2xhc3MoY2xvbmUsIGNscyk7IH0pOwogICAgICB9CiAgICAgIGFkZENsYXNzKGNsb25lLCBtb3ZlQ2xhc3MpOwogICAgICBjbG9uZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICB0aGlzLiRlbC5hcHBlbmRDaGlsZChjbG9uZSk7CiAgICAgIHZhciBpbmZvID0gZ2V0VHJhbnNpdGlvbkluZm8oY2xvbmUpOwogICAgICB0aGlzLiRlbC5yZW1vdmVDaGlsZChjbG9uZSk7CiAgICAgIHJldHVybiAodGhpcy5faGFzTW92ZSA9IGluZm8uaGFzVHJhbnNmb3JtKQogICAgfQogIH0KfQoKZnVuY3Rpb24gY2FsbFBlbmRpbmdDYnMgKGMpIHsKICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoYy5lbG0uX21vdmVDYikgewogICAgYy5lbG0uX21vdmVDYigpOwogIH0KICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICBpZiAoYy5lbG0uX2VudGVyQ2IpIHsKICAgIGMuZWxtLl9lbnRlckNiKCk7CiAgfQp9CgpmdW5jdGlvbiByZWNvcmRQb3NpdGlvbiAoYykgewogIGMuZGF0YS5uZXdQb3MgPSBjLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKfQoKZnVuY3Rpb24gYXBwbHlUcmFuc2xhdGlvbiAoYykgewogIHZhciBvbGRQb3MgPSBjLmRhdGEucG9zOwogIHZhciBuZXdQb3MgPSBjLmRhdGEubmV3UG9zOwogIHZhciBkeCA9IG9sZFBvcy5sZWZ0IC0gbmV3UG9zLmxlZnQ7CiAgdmFyIGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3A7CiAgaWYgKGR4IHx8IGR5KSB7CiAgICBjLmRhdGEubW92ZWQgPSB0cnVlOwogICAgdmFyIHMgPSBjLmVsbS5zdHlsZTsKICAgIHMudHJhbnNmb3JtID0gcy5XZWJraXRUcmFuc2Zvcm0gPSAidHJhbnNsYXRlKCIgKyBkeCArICJweCwiICsgZHkgKyAicHgpIjsKICAgIHMudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBzJzsKICB9Cn0KCnZhciBwbGF0Zm9ybUNvbXBvbmVudHMgPSB7CiAgVHJhbnNpdGlvbjogVHJhbnNpdGlvbiwKICBUcmFuc2l0aW9uR3JvdXA6IFRyYW5zaXRpb25Hcm91cAp9CgovKiAgKi8KCi8vIGluc3RhbGwgcGxhdGZvcm0gc3BlY2lmaWMgdXRpbHMKVnVlLmNvbmZpZy5tdXN0VXNlUHJvcCA9IG11c3RVc2VQcm9wOwpWdWUuY29uZmlnLmlzUmVzZXJ2ZWRUYWcgPSBpc1Jlc2VydmVkVGFnOwpWdWUuY29uZmlnLmlzUmVzZXJ2ZWRBdHRyID0gaXNSZXNlcnZlZEF0dHI7ClZ1ZS5jb25maWcuZ2V0VGFnTmFtZXNwYWNlID0gZ2V0VGFnTmFtZXNwYWNlOwpWdWUuY29uZmlnLmlzVW5rbm93bkVsZW1lbnQgPSBpc1Vua25vd25FbGVtZW50OwoKLy8gaW5zdGFsbCBwbGF0Zm9ybSBydW50aW1lIGRpcmVjdGl2ZXMgJiBjb21wb25lbnRzCmV4dGVuZChWdWUub3B0aW9ucy5kaXJlY3RpdmVzLCBwbGF0Zm9ybURpcmVjdGl2ZXMpOwpleHRlbmQoVnVlLm9wdGlvbnMuY29tcG9uZW50cywgcGxhdGZvcm1Db21wb25lbnRzKTsKCi8vIGluc3RhbGwgcGxhdGZvcm0gcGF0Y2ggZnVuY3Rpb24KVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gPSBpbkJyb3dzZXIgPyBwYXRjaCA6IG5vb3A7CgovLyBwdWJsaWMgbW91bnQgbWV0aG9kClZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKAogIGVsLAogIGh5ZHJhdGluZwopIHsKICBlbCA9IGVsICYmIGluQnJvd3NlciA/IHF1ZXJ5KGVsKSA6IHVuZGVmaW5lZDsKICByZXR1cm4gbW91bnRDb21wb25lbnQodGhpcywgZWwsIGh5ZHJhdGluZykKfTsKCi8vIGRldnRvb2xzIGdsb2JhbCBob29rCi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCmlmIChpbkJyb3dzZXIpIHsKICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgIGlmIChjb25maWcuZGV2dG9vbHMpIHsKICAgICAgaWYgKGRldnRvb2xzKSB7CiAgICAgICAgZGV2dG9vbHMuZW1pdCgnaW5pdCcsIFZ1ZSk7CiAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmCiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Rlc3QnICYmCiAgICAgICAgaXNDaHJvbWUKICAgICAgKSB7CiAgICAgICAgY29uc29sZVtjb25zb2xlLmluZm8gPyAnaW5mbycgOiAnbG9nJ10oCiAgICAgICAgICAnRG93bmxvYWQgdGhlIFZ1ZSBEZXZ0b29scyBleHRlbnNpb24gZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6XG4nICsKICAgICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLWRldnRvb2xzJwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Rlc3QnICYmCiAgICAgIGNvbmZpZy5wcm9kdWN0aW9uVGlwICE9PSBmYWxzZSAmJgogICAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcKICAgICkgewogICAgICBjb25zb2xlW2NvbnNvbGUuaW5mbyA/ICdpbmZvJyA6ICdsb2cnXSgKICAgICAgICAiWW91IGFyZSBydW5uaW5nIFZ1ZSBpbiBkZXZlbG9wbWVudCBtb2RlLlxuIiArCiAgICAgICAgIk1ha2Ugc3VyZSB0byB0dXJuIG9uIHByb2R1Y3Rpb24gbW9kZSB3aGVuIGRlcGxveWluZyBmb3IgcHJvZHVjdGlvbi5cbiIgKwogICAgICAgICJTZWUgbW9yZSB0aXBzIGF0IGh0dHBzOi8vdnVlanMub3JnL2d1aWRlL2RlcGxveW1lbnQuaHRtbCIKICAgICAgKTsKICAgIH0KICB9LCAwKTsKfQoKLyogICovCgp2YXIgZGVmYXVsdFRhZ1JFID0gL1x7XHsoKD86LnxcbikrPylcfVx9L2c7CnZhciByZWdleEVzY2FwZVJFID0gL1stLiorP14ke30oKXxbXF1cL1xcXS9nOwoKdmFyIGJ1aWxkUmVnZXggPSBjYWNoZWQoZnVuY3Rpb24gKGRlbGltaXRlcnMpIHsKICB2YXIgb3BlbiA9IGRlbGltaXRlcnNbMF0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOwogIHZhciBjbG9zZSA9IGRlbGltaXRlcnNbMV0ucmVwbGFjZShyZWdleEVzY2FwZVJFLCAnXFwkJicpOwogIHJldHVybiBuZXcgUmVnRXhwKG9wZW4gKyAnKCg/Oi58XFxuKSs/KScgKyBjbG9zZSwgJ2cnKQp9KTsKCgoKZnVuY3Rpb24gcGFyc2VUZXh0ICgKICB0ZXh0LAogIGRlbGltaXRlcnMKKSB7CiAgdmFyIHRhZ1JFID0gZGVsaW1pdGVycyA/IGJ1aWxkUmVnZXgoZGVsaW1pdGVycykgOiBkZWZhdWx0VGFnUkU7CiAgaWYgKCF0YWdSRS50ZXN0KHRleHQpKSB7CiAgICByZXR1cm4KICB9CiAgdmFyIHRva2VucyA9IFtdOwogIHZhciByYXdUb2tlbnMgPSBbXTsKICB2YXIgbGFzdEluZGV4ID0gdGFnUkUubGFzdEluZGV4ID0gMDsKICB2YXIgbWF0Y2gsIGluZGV4LCB0b2tlblZhbHVlOwogIHdoaWxlICgobWF0Y2ggPSB0YWdSRS5leGVjKHRleHQpKSkgewogICAgaW5kZXggPSBtYXRjaC5pbmRleDsKICAgIC8vIHB1c2ggdGV4dCB0b2tlbgogICAgaWYgKGluZGV4ID4gbGFzdEluZGV4KSB7CiAgICAgIHJhd1Rva2Vucy5wdXNoKHRva2VuVmFsdWUgPSB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpKTsKICAgICAgdG9rZW5zLnB1c2goSlNPTi5zdHJpbmdpZnkodG9rZW5WYWx1ZSkpOwogICAgfQogICAgLy8gdGFnIHRva2VuCiAgICB2YXIgZXhwID0gcGFyc2VGaWx0ZXJzKG1hdGNoWzFdLnRyaW0oKSk7CiAgICB0b2tlbnMucHVzaCgoIl9zKCIgKyBleHAgKyAiKSIpKTsKICAgIHJhd1Rva2Vucy5wdXNoKHsgJ0BiaW5kaW5nJzogZXhwIH0pOwogICAgbGFzdEluZGV4ID0gaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7CiAgfQogIGlmIChsYXN0SW5kZXggPCB0ZXh0Lmxlbmd0aCkgewogICAgcmF3VG9rZW5zLnB1c2godG9rZW5WYWx1ZSA9IHRleHQuc2xpY2UobGFzdEluZGV4KSk7CiAgICB0b2tlbnMucHVzaChKU09OLnN0cmluZ2lmeSh0b2tlblZhbHVlKSk7CiAgfQogIHJldHVybiB7CiAgICBleHByZXNzaW9uOiB0b2tlbnMuam9pbignKycpLAogICAgdG9rZW5zOiByYXdUb2tlbnMKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gdHJhbnNmb3JtTm9kZSAoZWwsIG9wdGlvbnMpIHsKICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsKICB2YXIgc3RhdGljQ2xhc3MgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnY2xhc3MnKTsKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHN0YXRpY0NsYXNzKSB7CiAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHN0YXRpY0NsYXNzLCBvcHRpb25zLmRlbGltaXRlcnMpOwogICAgaWYgKHJlcykgewogICAgICB3YXJuKAogICAgICAgICJjbGFzcz1cIiIgKyBzdGF0aWNDbGFzcyArICJcIjogIiArCiAgICAgICAgJ0ludGVycG9sYXRpb24gaW5zaWRlIGF0dHJpYnV0ZXMgaGFzIGJlZW4gcmVtb3ZlZC4gJyArCiAgICAgICAgJ1VzZSB2LWJpbmQgb3IgdGhlIGNvbG9uIHNob3J0aGFuZCBpbnN0ZWFkLiBGb3IgZXhhbXBsZSwgJyArCiAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBjbGFzcz0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDpjbGFzcz0idmFsIj4uJwogICAgICApOwogICAgfQogIH0KICBpZiAoc3RhdGljQ2xhc3MpIHsKICAgIGVsLnN0YXRpY0NsYXNzID0gSlNPTi5zdHJpbmdpZnkoc3RhdGljQ2xhc3MpOwogIH0KICB2YXIgY2xhc3NCaW5kaW5nID0gZ2V0QmluZGluZ0F0dHIoZWwsICdjbGFzcycsIGZhbHNlIC8qIGdldFN0YXRpYyAqLyk7CiAgaWYgKGNsYXNzQmluZGluZykgewogICAgZWwuY2xhc3NCaW5kaW5nID0gY2xhc3NCaW5kaW5nOwogIH0KfQoKZnVuY3Rpb24gZ2VuRGF0YSAoZWwpIHsKICB2YXIgZGF0YSA9ICcnOwogIGlmIChlbC5zdGF0aWNDbGFzcykgewogICAgZGF0YSArPSAic3RhdGljQ2xhc3M6IiArIChlbC5zdGF0aWNDbGFzcykgKyAiLCI7CiAgfQogIGlmIChlbC5jbGFzc0JpbmRpbmcpIHsKICAgIGRhdGEgKz0gImNsYXNzOiIgKyAoZWwuY2xhc3NCaW5kaW5nKSArICIsIjsKICB9CiAgcmV0dXJuIGRhdGEKfQoKdmFyIGtsYXNzJDEgPSB7CiAgc3RhdGljS2V5czogWydzdGF0aWNDbGFzcyddLAogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUsCiAgZ2VuRGF0YTogZ2VuRGF0YQp9CgovKiAgKi8KCmZ1bmN0aW9uIHRyYW5zZm9ybU5vZGUkMSAoZWwsIG9wdGlvbnMpIHsKICB2YXIgd2FybiA9IG9wdGlvbnMud2FybiB8fCBiYXNlV2FybjsKICB2YXIgc3RhdGljU3R5bGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc3R5bGUnKTsKICBpZiAoc3RhdGljU3R5bGUpIHsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgewogICAgICB2YXIgcmVzID0gcGFyc2VUZXh0KHN0YXRpY1N0eWxlLCBvcHRpb25zLmRlbGltaXRlcnMpOwogICAgICBpZiAocmVzKSB7CiAgICAgICAgd2FybigKICAgICAgICAgICJzdHlsZT1cIiIgKyBzdGF0aWNTdHlsZSArICJcIjogIiArCiAgICAgICAgICAnSW50ZXJwb2xhdGlvbiBpbnNpZGUgYXR0cmlidXRlcyBoYXMgYmVlbiByZW1vdmVkLiAnICsKICAgICAgICAgICdVc2Ugdi1iaW5kIG9yIHRoZSBjb2xvbiBzaG9ydGhhbmQgaW5zdGVhZC4gRm9yIGV4YW1wbGUsICcgKwogICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBzdHlsZT0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDpzdHlsZT0idmFsIj4uJwogICAgICAgICk7CiAgICAgIH0KICAgIH0KICAgIGVsLnN0YXRpY1N0eWxlID0gSlNPTi5zdHJpbmdpZnkocGFyc2VTdHlsZVRleHQoc3RhdGljU3R5bGUpKTsKICB9CgogIHZhciBzdHlsZUJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ3N0eWxlJywgZmFsc2UgLyogZ2V0U3RhdGljICovKTsKICBpZiAoc3R5bGVCaW5kaW5nKSB7CiAgICBlbC5zdHlsZUJpbmRpbmcgPSBzdHlsZUJpbmRpbmc7CiAgfQp9CgpmdW5jdGlvbiBnZW5EYXRhJDEgKGVsKSB7CiAgdmFyIGRhdGEgPSAnJzsKICBpZiAoZWwuc3RhdGljU3R5bGUpIHsKICAgIGRhdGEgKz0gInN0YXRpY1N0eWxlOiIgKyAoZWwuc3RhdGljU3R5bGUpICsgIiwiOwogIH0KICBpZiAoZWwuc3R5bGVCaW5kaW5nKSB7CiAgICBkYXRhICs9ICJzdHlsZTooIiArIChlbC5zdHlsZUJpbmRpbmcpICsgIiksIjsKICB9CiAgcmV0dXJuIGRhdGEKfQoKdmFyIHN0eWxlJDEgPSB7CiAgc3RhdGljS2V5czogWydzdGF0aWNTdHlsZSddLAogIHRyYW5zZm9ybU5vZGU6IHRyYW5zZm9ybU5vZGUkMSwKICBnZW5EYXRhOiBnZW5EYXRhJDEKfQoKLyogICovCgp2YXIgZGVjb2RlcjsKCnZhciBoZSA9IHsKICBkZWNvZGU6IGZ1bmN0aW9uIGRlY29kZSAoaHRtbCkgewogICAgZGVjb2RlciA9IGRlY29kZXIgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkZWNvZGVyLmlubmVySFRNTCA9IGh0bWw7CiAgICByZXR1cm4gZGVjb2Rlci50ZXh0Q29udGVudAogIH0KfQoKLyogICovCgp2YXIgaXNVbmFyeVRhZyA9IG1ha2VNYXAoCiAgJ2FyZWEsYmFzZSxicixjb2wsZW1iZWQsZnJhbWUsaHIsaW1nLGlucHV0LGlzaW5kZXgsa2V5Z2VuLCcgKwogICdsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdicicKKTsKCi8vIEVsZW1lbnRzIHRoYXQgeW91IGNhbiwgaW50ZW50aW9uYWxseSwgbGVhdmUgb3BlbgovLyAoYW5kIHdoaWNoIGNsb3NlIHRoZW1zZWx2ZXMpCnZhciBjYW5CZUxlZnRPcGVuVGFnID0gbWFrZU1hcCgKICAnY29sZ3JvdXAsZGQsZHQsbGksb3B0aW9ucyxwLHRkLHRmb290LHRoLHRoZWFkLHRyLHNvdXJjZScKKTsKCi8vIEhUTUw1IHRhZ3MgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5kaWNlcy5odG1sI2VsZW1lbnRzLTMKLy8gUGhyYXNpbmcgQ29udGVudCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9kb20uaHRtbCNwaHJhc2luZy1jb250ZW50CnZhciBpc05vblBocmFzaW5nVGFnID0gbWFrZU1hcCgKICAnYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGJhc2UsYmxvY2txdW90ZSxib2R5LGNhcHRpb24sY29sLGNvbGdyb3VwLGRkLCcgKwogICdkZXRhaWxzLGRpYWxvZyxkaXYsZGwsZHQsZmllbGRzZXQsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGZvcm0sJyArCiAgJ2gxLGgyLGgzLGg0LGg1LGg2LGhlYWQsaGVhZGVyLGhncm91cCxocixodG1sLGxlZ2VuZCxsaSxtZW51aXRlbSxtZXRhLCcgKwogICdvcHRncm91cCxvcHRpb24scGFyYW0scnAscnQsc291cmNlLHN0eWxlLHN1bW1hcnksdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsJyArCiAgJ3RpdGxlLHRyLHRyYWNrJwopOwoKLyoqCiAqIE5vdCB0eXBlLWNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGl0J3MgbW9zdGx5IHZlbmRvciBjb2RlLgogKi8KCi8qIQogKiBIVE1MIFBhcnNlciBCeSBKb2huIFJlc2lnIChlam9obi5vcmcpCiAqIE1vZGlmaWVkIGJ5IEp1cml5ICJrYW5nYXgiIFpheXRzZXYKICogT3JpZ2luYWwgY29kZSBieSBFcmlrIEFydmlkc3NvbiwgTW96aWxsYSBQdWJsaWMgTGljZW5zZQogKiBodHRwOi8vZXJpay5lYWUubmV0L3NpbXBsZWh0bWxwYXJzZXIvc2ltcGxlaHRtbHBhcnNlci5qcwogKi8KCi8vIFJlZ3VsYXIgRXhwcmVzc2lvbnMgZm9yIHBhcnNpbmcgdGFncyBhbmQgYXR0cmlidXRlcwp2YXIgYXR0cmlidXRlID0gL15ccyooW15ccyInPD5cLz1dKykoPzpccyooPSlccyooPzoiKFteIl0qKSIrfCcoW14nXSopJyt8KFteXHMiJz08PmBdKykpKT8vOwovLyBjb3VsZCB1c2UgaHR0cHM6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhtbC1uYW1lcy0xOTk5MDExNC8jTlQtUU5hbWUKLy8gYnV0IGZvciBWdWUgdGVtcGxhdGVzIHdlIGNhbiBlbmZvcmNlIGEgc2ltcGxlIGNoYXJzZXQKdmFyIG5jbmFtZSA9ICdbYS16QS1aX11bXFx3XFwtXFwuXSonOwp2YXIgcW5hbWVDYXB0dXJlID0gIigoPzoiICsgbmNuYW1lICsgIlxcOik/IiArIG5jbmFtZSArICIpIjsKdmFyIHN0YXJ0VGFnT3BlbiA9IG5ldyBSZWdFeHAoKCJePCIgKyBxbmFtZUNhcHR1cmUpKTsKdmFyIHN0YXJ0VGFnQ2xvc2UgPSAvXlxzKihcLz8pPi87CnZhciBlbmRUYWcgPSBuZXcgUmVnRXhwKCgiXjxcXC8iICsgcW5hbWVDYXB0dXJlICsgIltePl0qPiIpKTsKdmFyIGRvY3R5cGUgPSAvXjwhRE9DVFlQRSBbXj5dKz4vaTsKLy8gIzcyOTg6IGVzY2FwZSAtIHRvIGF2b2lkIGJlaW5nIHBhc2VkIGFzIEhUTUwgY29tbWVudCB3aGVuIGlubGluZWQgaW4gcGFnZQp2YXIgY29tbWVudCA9IC9ePCFcLS0vOwp2YXIgY29uZGl0aW9uYWxDb21tZW50ID0gL148IVxbLzsKCnZhciBJU19SRUdFWF9DQVBUVVJJTkdfQlJPS0VOID0gZmFsc2U7Cid4Jy5yZXBsYWNlKC94KC4pPy9nLCBmdW5jdGlvbiAobSwgZykgewogIElTX1JFR0VYX0NBUFRVUklOR19CUk9LRU4gPSBnID09PSAnJzsKfSk7CgovLyBTcGVjaWFsIEVsZW1lbnRzIChjYW4gY29udGFpbiBhbnl0aGluZykKdmFyIGlzUGxhaW5UZXh0RWxlbWVudCA9IG1ha2VNYXAoJ3NjcmlwdCxzdHlsZSx0ZXh0YXJlYScsIHRydWUpOwp2YXIgcmVDYWNoZSA9IHt9OwoKdmFyIGRlY29kaW5nTWFwID0gewogICcmbHQ7JzogJzwnLAogICcmZ3Q7JzogJz4nLAogICcmcXVvdDsnOiAnIicsCiAgJyZhbXA7JzogJyYnLAogICcmIzEwOyc6ICdcbicsCiAgJyYjOTsnOiAnXHQnCn07CnZhciBlbmNvZGVkQXR0ciA9IC8mKD86bHR8Z3R8cXVvdHxhbXApOy9nOwp2YXIgZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgPSAvJig/Omx0fGd0fHF1b3R8YW1wfCMxMHwjOSk7L2c7CgovLyAjNTk5Mgp2YXIgaXNJZ25vcmVOZXdsaW5lVGFnID0gbWFrZU1hcCgncHJlLHRleHRhcmVhJywgdHJ1ZSk7CnZhciBzaG91bGRJZ25vcmVGaXJzdE5ld2xpbmUgPSBmdW5jdGlvbiAodGFnLCBodG1sKSB7IHJldHVybiB0YWcgJiYgaXNJZ25vcmVOZXdsaW5lVGFnKHRhZykgJiYgaHRtbFswXSA9PT0gJ1xuJzsgfTsKCmZ1bmN0aW9uIGRlY29kZUF0dHIgKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykgewogIHZhciByZSA9IHNob3VsZERlY29kZU5ld2xpbmVzID8gZW5jb2RlZEF0dHJXaXRoTmV3TGluZXMgOiBlbmNvZGVkQXR0cjsKICByZXR1cm4gdmFsdWUucmVwbGFjZShyZSwgZnVuY3Rpb24gKG1hdGNoKSB7IHJldHVybiBkZWNvZGluZ01hcFttYXRjaF07IH0pCn0KCmZ1bmN0aW9uIHBhcnNlSFRNTCAoaHRtbCwgb3B0aW9ucykgewogIHZhciBzdGFjayA9IFtdOwogIHZhciBleHBlY3RIVE1MID0gb3B0aW9ucy5leHBlY3RIVE1MOwogIHZhciBpc1VuYXJ5VGFnJCQxID0gb3B0aW9ucy5pc1VuYXJ5VGFnIHx8IG5vOwogIHZhciBjYW5CZUxlZnRPcGVuVGFnJCQxID0gb3B0aW9ucy5jYW5CZUxlZnRPcGVuVGFnIHx8IG5vOwogIHZhciBpbmRleCA9IDA7CiAgdmFyIGxhc3QsIGxhc3RUYWc7CiAgd2hpbGUgKGh0bWwpIHsKICAgIGxhc3QgPSBodG1sOwogICAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBpbiBhIHBsYWludGV4dCBjb250ZW50IGVsZW1lbnQgbGlrZSBzY3JpcHQvc3R5bGUKICAgIGlmICghbGFzdFRhZyB8fCAhaXNQbGFpblRleHRFbGVtZW50KGxhc3RUYWcpKSB7CiAgICAgIHZhciB0ZXh0RW5kID0gaHRtbC5pbmRleE9mKCc8Jyk7CiAgICAgIGlmICh0ZXh0RW5kID09PSAwKSB7CiAgICAgICAgLy8gQ29tbWVudDoKICAgICAgICBpZiAoY29tbWVudC50ZXN0KGh0bWwpKSB7CiAgICAgICAgICB2YXIgY29tbWVudEVuZCA9IGh0bWwuaW5kZXhPZignLS0+Jyk7CgogICAgICAgICAgaWYgKGNvbW1lbnRFbmQgPj0gMCkgewogICAgICAgICAgICBpZiAob3B0aW9ucy5zaG91bGRLZWVwQ29tbWVudCkgewogICAgICAgICAgICAgIG9wdGlvbnMuY29tbWVudChodG1sLnN1YnN0cmluZyg0LCBjb21tZW50RW5kKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWR2YW5jZShjb21tZW50RW5kICsgMyk7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbmRpdGlvbmFsX2NvbW1lbnQjRG93bmxldmVsLXJldmVhbGVkX2NvbmRpdGlvbmFsX2NvbW1lbnQKICAgICAgICBpZiAoY29uZGl0aW9uYWxDb21tZW50LnRlc3QoaHRtbCkpIHsKICAgICAgICAgIHZhciBjb25kaXRpb25hbEVuZCA9IGh0bWwuaW5kZXhPZignXT4nKTsKCiAgICAgICAgICBpZiAoY29uZGl0aW9uYWxFbmQgPj0gMCkgewogICAgICAgICAgICBhZHZhbmNlKGNvbmRpdGlvbmFsRW5kICsgMik7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBEb2N0eXBlOgogICAgICAgIHZhciBkb2N0eXBlTWF0Y2ggPSBodG1sLm1hdGNoKGRvY3R5cGUpOwogICAgICAgIGlmIChkb2N0eXBlTWF0Y2gpIHsKICAgICAgICAgIGFkdmFuY2UoZG9jdHlwZU1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgLy8gRW5kIHRhZzoKICAgICAgICB2YXIgZW5kVGFnTWF0Y2ggPSBodG1sLm1hdGNoKGVuZFRhZyk7CiAgICAgICAgaWYgKGVuZFRhZ01hdGNoKSB7CiAgICAgICAgICB2YXIgY3VySW5kZXggPSBpbmRleDsKICAgICAgICAgIGFkdmFuY2UoZW5kVGFnTWF0Y2hbMF0ubGVuZ3RoKTsKICAgICAgICAgIHBhcnNlRW5kVGFnKGVuZFRhZ01hdGNoWzFdLCBjdXJJbmRleCwgaW5kZXgpOwogICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgIC8vIFN0YXJ0IHRhZzoKICAgICAgICB2YXIgc3RhcnRUYWdNYXRjaCA9IHBhcnNlU3RhcnRUYWcoKTsKICAgICAgICBpZiAoc3RhcnRUYWdNYXRjaCkgewogICAgICAgICAgaGFuZGxlU3RhcnRUYWcoc3RhcnRUYWdNYXRjaCk7CiAgICAgICAgICBpZiAoc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lKGxhc3RUYWcsIGh0bWwpKSB7CiAgICAgICAgICAgIGFkdmFuY2UoMSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIHRleHQgPSAodm9pZCAwKSwgcmVzdCA9ICh2b2lkIDApLCBuZXh0ID0gKHZvaWQgMCk7CiAgICAgIGlmICh0ZXh0RW5kID49IDApIHsKICAgICAgICByZXN0ID0gaHRtbC5zbGljZSh0ZXh0RW5kKTsKICAgICAgICB3aGlsZSAoCiAgICAgICAgICAhZW5kVGFnLnRlc3QocmVzdCkgJiYKICAgICAgICAgICFzdGFydFRhZ09wZW4udGVzdChyZXN0KSAmJgogICAgICAgICAgIWNvbW1lbnQudGVzdChyZXN0KSAmJgogICAgICAgICAgIWNvbmRpdGlvbmFsQ29tbWVudC50ZXN0KHJlc3QpCiAgICAgICAgKSB7CiAgICAgICAgICAvLyA8IGluIHBsYWluIHRleHQsIGJlIGZvcmdpdmluZyBhbmQgdHJlYXQgaXQgYXMgdGV4dAogICAgICAgICAgbmV4dCA9IHJlc3QuaW5kZXhPZignPCcsIDEpOwogICAgICAgICAgaWYgKG5leHQgPCAwKSB7IGJyZWFrIH0KICAgICAgICAgIHRleHRFbmQgKz0gbmV4dDsKICAgICAgICAgIHJlc3QgPSBodG1sLnNsaWNlKHRleHRFbmQpOwogICAgICAgIH0KICAgICAgICB0ZXh0ID0gaHRtbC5zdWJzdHJpbmcoMCwgdGV4dEVuZCk7CiAgICAgICAgYWR2YW5jZSh0ZXh0RW5kKTsKICAgICAgfQoKICAgICAgaWYgKHRleHRFbmQgPCAwKSB7CiAgICAgICAgdGV4dCA9IGh0bWw7CiAgICAgICAgaHRtbCA9ICcnOwogICAgICB9CgogICAgICBpZiAob3B0aW9ucy5jaGFycyAmJiB0ZXh0KSB7CiAgICAgICAgb3B0aW9ucy5jaGFycyh0ZXh0KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIGVuZFRhZ0xlbmd0aCA9IDA7CiAgICAgIHZhciBzdGFja2VkVGFnID0gbGFzdFRhZy50b0xvd2VyQ2FzZSgpOwogICAgICB2YXIgcmVTdGFja2VkVGFnID0gcmVDYWNoZVtzdGFja2VkVGFnXSB8fCAocmVDYWNoZVtzdGFja2VkVGFnXSA9IG5ldyBSZWdFeHAoJyhbXFxzXFxTXSo/KSg8LycgKyBzdGFja2VkVGFnICsgJ1tePl0qPiknLCAnaScpKTsKICAgICAgdmFyIHJlc3QkMSA9IGh0bWwucmVwbGFjZShyZVN0YWNrZWRUYWcsIGZ1bmN0aW9uIChhbGwsIHRleHQsIGVuZFRhZykgewogICAgICAgIGVuZFRhZ0xlbmd0aCA9IGVuZFRhZy5sZW5ndGg7CiAgICAgICAgaWYgKCFpc1BsYWluVGV4dEVsZW1lbnQoc3RhY2tlZFRhZykgJiYgc3RhY2tlZFRhZyAhPT0gJ25vc2NyaXB0JykgewogICAgICAgICAgdGV4dCA9IHRleHQKICAgICAgICAgICAgLnJlcGxhY2UoLzwhXC0tKFtcc1xTXSo/KS0tPi9nLCAnJDEnKSAvLyAjNzI5OAogICAgICAgICAgICAucmVwbGFjZSgvPCFcW0NEQVRBXFsoW1xzXFNdKj8pXV0+L2csICckMScpOwogICAgICAgIH0KICAgICAgICBpZiAoc2hvdWxkSWdub3JlRmlyc3ROZXdsaW5lKHN0YWNrZWRUYWcsIHRleHQpKSB7CiAgICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgxKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnMpIHsKICAgICAgICAgIG9wdGlvbnMuY2hhcnModGV4dCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJwogICAgICB9KTsKICAgICAgaW5kZXggKz0gaHRtbC5sZW5ndGggLSByZXN0JDEubGVuZ3RoOwogICAgICBodG1sID0gcmVzdCQxOwogICAgICBwYXJzZUVuZFRhZyhzdGFja2VkVGFnLCBpbmRleCAtIGVuZFRhZ0xlbmd0aCwgaW5kZXgpOwogICAgfQoKICAgIGlmIChodG1sID09PSBsYXN0KSB7CiAgICAgIG9wdGlvbnMuY2hhcnMgJiYgb3B0aW9ucy5jaGFycyhodG1sKTsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiAhc3RhY2subGVuZ3RoICYmIG9wdGlvbnMud2FybikgewogICAgICAgIG9wdGlvbnMud2FybigoIk1hbC1mb3JtYXR0ZWQgdGFnIGF0IGVuZCBvZiB0ZW1wbGF0ZTogXCIiICsgaHRtbCArICJcIiIpKTsKICAgICAgfQogICAgICBicmVhawogICAgfQogIH0KCiAgLy8gQ2xlYW4gdXAgYW55IHJlbWFpbmluZyB0YWdzCiAgcGFyc2VFbmRUYWcoKTsKCiAgZnVuY3Rpb24gYWR2YW5jZSAobikgewogICAgaW5kZXggKz0gbjsKICAgIGh0bWwgPSBodG1sLnN1YnN0cmluZyhuKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlU3RhcnRUYWcgKCkgewogICAgdmFyIHN0YXJ0ID0gaHRtbC5tYXRjaChzdGFydFRhZ09wZW4pOwogICAgaWYgKHN0YXJ0KSB7CiAgICAgIHZhciBtYXRjaCA9IHsKICAgICAgICB0YWdOYW1lOiBzdGFydFsxXSwKICAgICAgICBhdHRyczogW10sCiAgICAgICAgc3RhcnQ6IGluZGV4CiAgICAgIH07CiAgICAgIGFkdmFuY2Uoc3RhcnRbMF0ubGVuZ3RoKTsKICAgICAgdmFyIGVuZCwgYXR0cjsKICAgICAgd2hpbGUgKCEoZW5kID0gaHRtbC5tYXRjaChzdGFydFRhZ0Nsb3NlKSkgJiYgKGF0dHIgPSBodG1sLm1hdGNoKGF0dHJpYnV0ZSkpKSB7CiAgICAgICAgYWR2YW5jZShhdHRyWzBdLmxlbmd0aCk7CiAgICAgICAgbWF0Y2guYXR0cnMucHVzaChhdHRyKTsKICAgICAgfQogICAgICBpZiAoZW5kKSB7CiAgICAgICAgbWF0Y2gudW5hcnlTbGFzaCA9IGVuZFsxXTsKICAgICAgICBhZHZhbmNlKGVuZFswXS5sZW5ndGgpOwogICAgICAgIG1hdGNoLmVuZCA9IGluZGV4OwogICAgICAgIHJldHVybiBtYXRjaAogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVTdGFydFRhZyAobWF0Y2gpIHsKICAgIHZhciB0YWdOYW1lID0gbWF0Y2gudGFnTmFtZTsKICAgIHZhciB1bmFyeVNsYXNoID0gbWF0Y2gudW5hcnlTbGFzaDsKCiAgICBpZiAoZXhwZWN0SFRNTCkgewogICAgICBpZiAobGFzdFRhZyA9PT0gJ3AnICYmIGlzTm9uUGhyYXNpbmdUYWcodGFnTmFtZSkpIHsKICAgICAgICBwYXJzZUVuZFRhZyhsYXN0VGFnKTsKICAgICAgfQogICAgICBpZiAoY2FuQmVMZWZ0T3BlblRhZyQkMSh0YWdOYW1lKSAmJiBsYXN0VGFnID09PSB0YWdOYW1lKSB7CiAgICAgICAgcGFyc2VFbmRUYWcodGFnTmFtZSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgdW5hcnkgPSBpc1VuYXJ5VGFnJCQxKHRhZ05hbWUpIHx8ICEhdW5hcnlTbGFzaDsKCiAgICB2YXIgbCA9IG1hdGNoLmF0dHJzLmxlbmd0aDsKICAgIHZhciBhdHRycyA9IG5ldyBBcnJheShsKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBhcmdzID0gbWF0Y2guYXR0cnNbaV07CiAgICAgIC8vIGhhY2tpc2ggd29yayBhcm91bmQgRkYgYnVnIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTM2OTc3OAogICAgICBpZiAoSVNfUkVHRVhfQ0FQVFVSSU5HX0JST0tFTiAmJiBhcmdzWzBdLmluZGV4T2YoJyIiJykgPT09IC0xKSB7CiAgICAgICAgaWYgKGFyZ3NbM10gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzNdOyB9CiAgICAgICAgaWYgKGFyZ3NbNF0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzRdOyB9CiAgICAgICAgaWYgKGFyZ3NbNV0gPT09ICcnKSB7IGRlbGV0ZSBhcmdzWzVdOyB9CiAgICAgIH0KICAgICAgdmFyIHZhbHVlID0gYXJnc1szXSB8fCBhcmdzWzRdIHx8IGFyZ3NbNV0gfHwgJyc7CiAgICAgIHZhciBzaG91bGREZWNvZGVOZXdsaW5lcyA9IHRhZ05hbWUgPT09ICdhJyAmJiBhcmdzWzFdID09PSAnaHJlZicKICAgICAgICA/IG9wdGlvbnMuc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmCiAgICAgICAgOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzOwogICAgICBhdHRyc1tpXSA9IHsKICAgICAgICBuYW1lOiBhcmdzWzFdLAogICAgICAgIHZhbHVlOiBkZWNvZGVBdHRyKHZhbHVlLCBzaG91bGREZWNvZGVOZXdsaW5lcykKICAgICAgfTsKICAgIH0KCiAgICBpZiAoIXVuYXJ5KSB7CiAgICAgIHN0YWNrLnB1c2goeyB0YWc6IHRhZ05hbWUsIGxvd2VyQ2FzZWRUYWc6IHRhZ05hbWUudG9Mb3dlckNhc2UoKSwgYXR0cnM6IGF0dHJzIH0pOwogICAgICBsYXN0VGFnID0gdGFnTmFtZTsKICAgIH0KCiAgICBpZiAob3B0aW9ucy5zdGFydCkgewogICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIGF0dHJzLCB1bmFyeSwgbWF0Y2guc3RhcnQsIG1hdGNoLmVuZCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwYXJzZUVuZFRhZyAodGFnTmFtZSwgc3RhcnQsIGVuZCkgewogICAgdmFyIHBvcywgbG93ZXJDYXNlZFRhZ05hbWU7CiAgICBpZiAoc3RhcnQgPT0gbnVsbCkgeyBzdGFydCA9IGluZGV4OyB9CiAgICBpZiAoZW5kID09IG51bGwpIHsgZW5kID0gaW5kZXg7IH0KCiAgICBpZiAodGFnTmFtZSkgewogICAgICBsb3dlckNhc2VkVGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgIH0KCiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IG9wZW5lZCB0YWcgb2YgdGhlIHNhbWUgdHlwZQogICAgaWYgKHRhZ05hbWUpIHsKICAgICAgZm9yIChwb3MgPSBzdGFjay5sZW5ndGggLSAxOyBwb3MgPj0gMDsgcG9zLS0pIHsKICAgICAgICBpZiAoc3RhY2tbcG9zXS5sb3dlckNhc2VkVGFnID09PSBsb3dlckNhc2VkVGFnTmFtZSkgewogICAgICAgICAgYnJlYWsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIElmIG5vIHRhZyBuYW1lIGlzIHByb3ZpZGVkLCBjbGVhbiBzaG9wCiAgICAgIHBvcyA9IDA7CiAgICB9CgogICAgaWYgKHBvcyA+PSAwKSB7CiAgICAgIC8vIENsb3NlIGFsbCB0aGUgb3BlbiBlbGVtZW50cywgdXAgdGhlIHN0YWNrCiAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSAxOyBpID49IHBvczsgaS0tKSB7CiAgICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJgogICAgICAgICAgKGkgPiBwb3MgfHwgIXRhZ05hbWUpICYmCiAgICAgICAgICBvcHRpb25zLndhcm4KICAgICAgICApIHsKICAgICAgICAgIG9wdGlvbnMud2FybigKICAgICAgICAgICAgKCJ0YWcgPCIgKyAoc3RhY2tbaV0udGFnKSArICI+IGhhcyBubyBtYXRjaGluZyBlbmQgdGFnLiIpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAob3B0aW9ucy5lbmQpIHsKICAgICAgICAgIG9wdGlvbnMuZW5kKHN0YWNrW2ldLnRhZywgc3RhcnQsIGVuZCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBSZW1vdmUgdGhlIG9wZW4gZWxlbWVudHMgZnJvbSB0aGUgc3RhY2sKICAgICAgc3RhY2subGVuZ3RoID0gcG9zOwogICAgICBsYXN0VGFnID0gcG9zICYmIHN0YWNrW3BvcyAtIDFdLnRhZzsKICAgIH0gZWxzZSBpZiAobG93ZXJDYXNlZFRhZ05hbWUgPT09ICdicicpIHsKICAgICAgaWYgKG9wdGlvbnMuc3RhcnQpIHsKICAgICAgICBvcHRpb25zLnN0YXJ0KHRhZ05hbWUsIFtdLCB0cnVlLCBzdGFydCwgZW5kKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChsb3dlckNhc2VkVGFnTmFtZSA9PT0gJ3AnKSB7CiAgICAgIGlmIChvcHRpb25zLnN0YXJ0KSB7CiAgICAgICAgb3B0aW9ucy5zdGFydCh0YWdOYW1lLCBbXSwgZmFsc2UsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmVuZCkgewogICAgICAgIG9wdGlvbnMuZW5kKHRhZ05hbWUsIHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICB9CiAgfQp9CgovKiAgKi8KCnZhciBvblJFID0gL15AfF52LW9uOi87CnZhciBkaXJSRSA9IC9edi18XkB8XjovOwp2YXIgZm9yQWxpYXNSRSA9IC8oW15dKj8pXHMrKD86aW58b2YpXHMrKFteXSopLzsKdmFyIGZvckl0ZXJhdG9yUkUgPSAvLChbXixcfVxdXSopKD86LChbXixcfVxdXSopKT8kLzsKdmFyIHN0cmlwUGFyZW5zUkUgPSAvXlwofFwpJC9nOwoKdmFyIGFyZ1JFID0gLzooLiopJC87CnZhciBiaW5kUkUgPSAvXjp8XnYtYmluZDovOwp2YXIgbW9kaWZpZXJSRSA9IC9cLlteLl0rL2c7Cgp2YXIgZGVjb2RlSFRNTENhY2hlZCA9IGNhY2hlZChoZS5kZWNvZGUpOwoKLy8gY29uZmlndXJhYmxlIHN0YXRlCnZhciB3YXJuJDI7CnZhciBkZWxpbWl0ZXJzOwp2YXIgdHJhbnNmb3JtczsKdmFyIHByZVRyYW5zZm9ybXM7CnZhciBwb3N0VHJhbnNmb3JtczsKdmFyIHBsYXRmb3JtSXNQcmVUYWc7CnZhciBwbGF0Zm9ybU11c3RVc2VQcm9wOwp2YXIgcGxhdGZvcm1HZXRUYWdOYW1lc3BhY2U7CgoKCmZ1bmN0aW9uIGNyZWF0ZUFTVEVsZW1lbnQgKAogIHRhZywKICBhdHRycywKICBwYXJlbnQKKSB7CiAgcmV0dXJuIHsKICAgIHR5cGU6IDEsCiAgICB0YWc6IHRhZywKICAgIGF0dHJzTGlzdDogYXR0cnMsCiAgICBhdHRyc01hcDogbWFrZUF0dHJzTWFwKGF0dHJzKSwKICAgIHBhcmVudDogcGFyZW50LAogICAgY2hpbGRyZW46IFtdCiAgfQp9CgovKioKICogQ29udmVydCBIVE1MIHN0cmluZyB0byBBU1QuCiAqLwpmdW5jdGlvbiBwYXJzZSAoCiAgdGVtcGxhdGUsCiAgb3B0aW9ucwopIHsKICB3YXJuJDIgPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47CgogIHBsYXRmb3JtSXNQcmVUYWcgPSBvcHRpb25zLmlzUHJlVGFnIHx8IG5vOwogIHBsYXRmb3JtTXVzdFVzZVByb3AgPSBvcHRpb25zLm11c3RVc2VQcm9wIHx8IG5vOwogIHBsYXRmb3JtR2V0VGFnTmFtZXNwYWNlID0gb3B0aW9ucy5nZXRUYWdOYW1lc3BhY2UgfHwgbm87CgogIHRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3RyYW5zZm9ybU5vZGUnKTsKICBwcmVUcmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdwcmVUcmFuc2Zvcm1Ob2RlJyk7CiAgcG9zdFRyYW5zZm9ybXMgPSBwbHVja01vZHVsZUZ1bmN0aW9uKG9wdGlvbnMubW9kdWxlcywgJ3Bvc3RUcmFuc2Zvcm1Ob2RlJyk7CgogIGRlbGltaXRlcnMgPSBvcHRpb25zLmRlbGltaXRlcnM7CgogIHZhciBzdGFjayA9IFtdOwogIHZhciBwcmVzZXJ2ZVdoaXRlc3BhY2UgPSBvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZSAhPT0gZmFsc2U7CiAgdmFyIHJvb3Q7CiAgdmFyIGN1cnJlbnRQYXJlbnQ7CiAgdmFyIGluVlByZSA9IGZhbHNlOwogIHZhciBpblByZSA9IGZhbHNlOwogIHZhciB3YXJuZWQgPSBmYWxzZTsKCiAgZnVuY3Rpb24gd2Fybk9uY2UgKG1zZykgewogICAgaWYgKCF3YXJuZWQpIHsKICAgICAgd2FybmVkID0gdHJ1ZTsKICAgICAgd2FybiQyKG1zZyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjbG9zZUVsZW1lbnQgKGVsZW1lbnQpIHsKICAgIC8vIGNoZWNrIHByZSBzdGF0ZQogICAgaWYgKGVsZW1lbnQucHJlKSB7CiAgICAgIGluVlByZSA9IGZhbHNlOwogICAgfQogICAgaWYgKHBsYXRmb3JtSXNQcmVUYWcoZWxlbWVudC50YWcpKSB7CiAgICAgIGluUHJlID0gZmFsc2U7CiAgICB9CiAgICAvLyBhcHBseSBwb3N0LXRyYW5zZm9ybXMKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zdFRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgcG9zdFRyYW5zZm9ybXNbaV0oZWxlbWVudCwgb3B0aW9ucyk7CiAgICB9CiAgfQoKICBwYXJzZUhUTUwodGVtcGxhdGUsIHsKICAgIHdhcm46IHdhcm4kMiwKICAgIGV4cGVjdEhUTUw6IG9wdGlvbnMuZXhwZWN0SFRNTCwKICAgIGlzVW5hcnlUYWc6IG9wdGlvbnMuaXNVbmFyeVRhZywKICAgIGNhbkJlTGVmdE9wZW5UYWc6IG9wdGlvbnMuY2FuQmVMZWZ0T3BlblRhZywKICAgIHNob3VsZERlY29kZU5ld2xpbmVzOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzLAogICAgc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmOiBvcHRpb25zLnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiwKICAgIHNob3VsZEtlZXBDb21tZW50OiBvcHRpb25zLmNvbW1lbnRzLAogICAgc3RhcnQ6IGZ1bmN0aW9uIHN0YXJ0ICh0YWcsIGF0dHJzLCB1bmFyeSkgewogICAgICAvLyBjaGVjayBuYW1lc3BhY2UuCiAgICAgIC8vIGluaGVyaXQgcGFyZW50IG5zIGlmIHRoZXJlIGlzIG9uZQogICAgICB2YXIgbnMgPSAoY3VycmVudFBhcmVudCAmJiBjdXJyZW50UGFyZW50Lm5zKSB8fCBwbGF0Zm9ybUdldFRhZ05hbWVzcGFjZSh0YWcpOwoKICAgICAgLy8gaGFuZGxlIElFIHN2ZyBidWcKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmIChpc0lFICYmIG5zID09PSAnc3ZnJykgewogICAgICAgIGF0dHJzID0gZ3VhcmRJRVNWR0J1ZyhhdHRycyk7CiAgICAgIH0KCiAgICAgIHZhciBlbGVtZW50ID0gY3JlYXRlQVNURWxlbWVudCh0YWcsIGF0dHJzLCBjdXJyZW50UGFyZW50KTsKICAgICAgaWYgKG5zKSB7CiAgICAgICAgZWxlbWVudC5ucyA9IG5zOwogICAgICB9CgogICAgICBpZiAoaXNGb3JiaWRkZW5UYWcoZWxlbWVudCkgJiYgIWlzU2VydmVyUmVuZGVyaW5nKCkpIHsKICAgICAgICBlbGVtZW50LmZvcmJpZGRlbiA9IHRydWU7CiAgICAgICAgImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4kMigKICAgICAgICAgICdUZW1wbGF0ZXMgc2hvdWxkIG9ubHkgYmUgcmVzcG9uc2libGUgZm9yIG1hcHBpbmcgdGhlIHN0YXRlIHRvIHRoZSAnICsKICAgICAgICAgICdVSS4gQXZvaWQgcGxhY2luZyB0YWdzIHdpdGggc2lkZS1lZmZlY3RzIGluIHlvdXIgdGVtcGxhdGVzLCBzdWNoIGFzICcgKwogICAgICAgICAgIjwiICsgdGFnICsgIj4iICsgJywgYXMgdGhleSB3aWxsIG5vdCBiZSBwYXJzZWQuJwogICAgICAgICk7CiAgICAgIH0KCiAgICAgIC8vIGFwcGx5IHByZS10cmFuc2Zvcm1zCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlVHJhbnNmb3Jtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGVsZW1lbnQgPSBwcmVUcmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7CiAgICAgIH0KCiAgICAgIGlmICghaW5WUHJlKSB7CiAgICAgICAgcHJvY2Vzc1ByZShlbGVtZW50KTsKICAgICAgICBpZiAoZWxlbWVudC5wcmUpIHsKICAgICAgICAgIGluVlByZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwbGF0Zm9ybUlzUHJlVGFnKGVsZW1lbnQudGFnKSkgewogICAgICAgIGluUHJlID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoaW5WUHJlKSB7CiAgICAgICAgcHJvY2Vzc1Jhd0F0dHJzKGVsZW1lbnQpOwogICAgICB9IGVsc2UgaWYgKCFlbGVtZW50LnByb2Nlc3NlZCkgewogICAgICAgIC8vIHN0cnVjdHVyYWwgZGlyZWN0aXZlcwogICAgICAgIHByb2Nlc3NGb3IoZWxlbWVudCk7CiAgICAgICAgcHJvY2Vzc0lmKGVsZW1lbnQpOwogICAgICAgIHByb2Nlc3NPbmNlKGVsZW1lbnQpOwogICAgICAgIC8vIGVsZW1lbnQtc2NvcGUgc3R1ZmYKICAgICAgICBwcm9jZXNzRWxlbWVudChlbGVtZW50LCBvcHRpb25zKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY2hlY2tSb290Q29uc3RyYWludHMgKGVsKSB7CiAgICAgICAgewogICAgICAgICAgaWYgKGVsLnRhZyA9PT0gJ3Nsb3QnIHx8IGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAiQ2Fubm90IHVzZSA8IiArIChlbC50YWcpICsgIj4gYXMgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlIGl0IG1heSAiICsKICAgICAgICAgICAgICAnY29udGFpbiBtdWx0aXBsZSBub2Rlcy4nCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZWwuYXR0cnNNYXAuaGFzT3duUHJvcGVydHkoJ3YtZm9yJykpIHsKICAgICAgICAgICAgd2Fybk9uY2UoCiAgICAgICAgICAgICAgJ0Nhbm5vdCB1c2Ugdi1mb3Igb24gc3RhdGVmdWwgY29tcG9uZW50IHJvb3QgZWxlbWVudCBiZWNhdXNlICcgKwogICAgICAgICAgICAgICdpdCByZW5kZXJzIG11bHRpcGxlIGVsZW1lbnRzLicKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIHRyZWUgbWFuYWdlbWVudAogICAgICBpZiAoIXJvb3QpIHsKICAgICAgICByb290ID0gZWxlbWVudDsKICAgICAgICBjaGVja1Jvb3RDb25zdHJhaW50cyhyb290KTsKICAgICAgfSBlbHNlIGlmICghc3RhY2subGVuZ3RoKSB7CiAgICAgICAgLy8gYWxsb3cgcm9vdCBlbGVtZW50cyB3aXRoIHYtaWYsIHYtZWxzZS1pZiBhbmQgdi1lbHNlCiAgICAgICAgaWYgKHJvb3QuaWYgJiYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkpIHsKICAgICAgICAgIGNoZWNrUm9vdENvbnN0cmFpbnRzKGVsZW1lbnQpOwogICAgICAgICAgYWRkSWZDb25kaXRpb24ocm9vdCwgewogICAgICAgICAgICBleHA6IGVsZW1lbnQuZWxzZWlmLAogICAgICAgICAgICBibG9jazogZWxlbWVudAogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdhcm5PbmNlKAogICAgICAgICAgICAiQ29tcG9uZW50IHRlbXBsYXRlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIHJvb3QgZWxlbWVudC4gIiArCiAgICAgICAgICAgICJJZiB5b3UgYXJlIHVzaW5nIHYtaWYgb24gbXVsdGlwbGUgZWxlbWVudHMsICIgKwogICAgICAgICAgICAidXNlIHYtZWxzZS1pZiB0byBjaGFpbiB0aGVtIGluc3RlYWQuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnRQYXJlbnQgJiYgIWVsZW1lbnQuZm9yYmlkZGVuKSB7CiAgICAgICAgaWYgKGVsZW1lbnQuZWxzZWlmIHx8IGVsZW1lbnQuZWxzZSkgewogICAgICAgICAgcHJvY2Vzc0lmQ29uZGl0aW9ucyhlbGVtZW50LCBjdXJyZW50UGFyZW50KTsKICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuc2xvdFNjb3BlKSB7IC8vIHNjb3BlZCBzbG90CiAgICAgICAgICBjdXJyZW50UGFyZW50LnBsYWluID0gZmFsc2U7CiAgICAgICAgICB2YXIgbmFtZSA9IGVsZW1lbnQuc2xvdFRhcmdldCB8fCAnImRlZmF1bHQiJzsoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyB8fCAoY3VycmVudFBhcmVudC5zY29wZWRTbG90cyA9IHt9KSlbbmFtZV0gPSBlbGVtZW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goZWxlbWVudCk7CiAgICAgICAgICBlbGVtZW50LnBhcmVudCA9IGN1cnJlbnRQYXJlbnQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdW5hcnkpIHsKICAgICAgICBjdXJyZW50UGFyZW50ID0gZWxlbWVudDsKICAgICAgICBzdGFjay5wdXNoKGVsZW1lbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTsKICAgICAgfQogICAgfSwKCiAgICBlbmQ6IGZ1bmN0aW9uIGVuZCAoKSB7CiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgICAgIHZhciBlbGVtZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgIHZhciBsYXN0Tm9kZSA9IGVsZW1lbnQuY2hpbGRyZW5bZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggLSAxXTsKICAgICAgaWYgKGxhc3ROb2RlICYmIGxhc3ROb2RlLnR5cGUgPT09IDMgJiYgbGFzdE5vZGUudGV4dCA9PT0gJyAnICYmICFpblByZSkgewogICAgICAgIGVsZW1lbnQuY2hpbGRyZW4ucG9wKCk7CiAgICAgIH0KICAgICAgLy8gcG9wIHN0YWNrCiAgICAgIHN0YWNrLmxlbmd0aCAtPSAxOwogICAgICBjdXJyZW50UGFyZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgIGNsb3NlRWxlbWVudChlbGVtZW50KTsKICAgIH0sCgogICAgY2hhcnM6IGZ1bmN0aW9uIGNoYXJzICh0ZXh0KSB7CiAgICAgIGlmICghY3VycmVudFBhcmVudCkgewogICAgICAgIHsKICAgICAgICAgIGlmICh0ZXh0ID09PSB0ZW1wbGF0ZSkgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAnQ29tcG9uZW50IHRlbXBsYXRlIHJlcXVpcmVzIGEgcm9vdCBlbGVtZW50LCByYXRoZXIgdGhhbiBqdXN0IHRleHQuJwogICAgICAgICAgICApOwogICAgICAgICAgfSBlbHNlIGlmICgodGV4dCA9IHRleHQudHJpbSgpKSkgewogICAgICAgICAgICB3YXJuT25jZSgKICAgICAgICAgICAgICAoInRleHQgXCIiICsgdGV4dCArICJcIiBvdXRzaWRlIHJvb3QgZWxlbWVudCB3aWxsIGJlIGlnbm9yZWQuIikKICAgICAgICAgICAgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuCiAgICAgIH0KICAgICAgLy8gSUUgdGV4dGFyZWEgcGxhY2Vob2xkZXIgYnVnCiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAoaXNJRSAmJgogICAgICAgIGN1cnJlbnRQYXJlbnQudGFnID09PSAndGV4dGFyZWEnICYmCiAgICAgICAgY3VycmVudFBhcmVudC5hdHRyc01hcC5wbGFjZWhvbGRlciA9PT0gdGV4dAogICAgICApIHsKICAgICAgICByZXR1cm4KICAgICAgfQogICAgICB2YXIgY2hpbGRyZW4gPSBjdXJyZW50UGFyZW50LmNoaWxkcmVuOwogICAgICB0ZXh0ID0gaW5QcmUgfHwgdGV4dC50cmltKCkKICAgICAgICA/IGlzVGV4dFRhZyhjdXJyZW50UGFyZW50KSA/IHRleHQgOiBkZWNvZGVIVE1MQ2FjaGVkKHRleHQpCiAgICAgICAgLy8gb25seSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIGlmIGl0cyBub3QgcmlnaHQgYWZ0ZXIgYSBzdGFydGluZyB0YWcKICAgICAgICA6IHByZXNlcnZlV2hpdGVzcGFjZSAmJiBjaGlsZHJlbi5sZW5ndGggPyAnICcgOiAnJzsKICAgICAgaWYgKHRleHQpIHsKICAgICAgICB2YXIgcmVzOwogICAgICAgIGlmICghaW5WUHJlICYmIHRleHQgIT09ICcgJyAmJiAocmVzID0gcGFyc2VUZXh0KHRleHQsIGRlbGltaXRlcnMpKSkgewogICAgICAgICAgY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIHR5cGU6IDIsCiAgICAgICAgICAgIGV4cHJlc3Npb246IHJlcy5leHByZXNzaW9uLAogICAgICAgICAgICB0b2tlbnM6IHJlcy50b2tlbnMsCiAgICAgICAgICAgIHRleHQ6IHRleHQKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAodGV4dCAhPT0gJyAnIHx8ICFjaGlsZHJlbi5sZW5ndGggfHwgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udGV4dCAhPT0gJyAnKSB7CiAgICAgICAgICBjaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgdHlwZTogMywKICAgICAgICAgICAgdGV4dDogdGV4dAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY29tbWVudDogZnVuY3Rpb24gY29tbWVudCAodGV4dCkgewogICAgICBjdXJyZW50UGFyZW50LmNoaWxkcmVuLnB1c2goewogICAgICAgIHR5cGU6IDMsCiAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICBpc0NvbW1lbnQ6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIHJvb3QKfQoKZnVuY3Rpb24gcHJvY2Vzc1ByZSAoZWwpIHsKICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtcHJlJykgIT0gbnVsbCkgewogICAgZWwucHJlID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NSYXdBdHRycyAoZWwpIHsKICB2YXIgbCA9IGVsLmF0dHJzTGlzdC5sZW5ndGg7CiAgaWYgKGwpIHsKICAgIHZhciBhdHRycyA9IGVsLmF0dHJzID0gbmV3IEFycmF5KGwpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsKICAgICAgYXR0cnNbaV0gPSB7CiAgICAgICAgbmFtZTogZWwuYXR0cnNMaXN0W2ldLm5hbWUsCiAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KGVsLmF0dHJzTGlzdFtpXS52YWx1ZSkKICAgICAgfTsKICAgIH0KICB9IGVsc2UgaWYgKCFlbC5wcmUpIHsKICAgIC8vIG5vbiByb290IG5vZGUgaW4gcHJlIGJsb2NrcyB3aXRoIG5vIGF0dHJpYnV0ZXMKICAgIGVsLnBsYWluID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NFbGVtZW50IChlbGVtZW50LCBvcHRpb25zKSB7CiAgcHJvY2Vzc0tleShlbGVtZW50KTsKCiAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIHBsYWluIGVsZW1lbnQgYWZ0ZXIKICAvLyByZW1vdmluZyBzdHJ1Y3R1cmFsIGF0dHJpYnV0ZXMKICBlbGVtZW50LnBsYWluID0gIWVsZW1lbnQua2V5ICYmICFlbGVtZW50LmF0dHJzTGlzdC5sZW5ndGg7CgogIHByb2Nlc3NSZWYoZWxlbWVudCk7CiAgcHJvY2Vzc1Nsb3QoZWxlbWVudCk7CiAgcHJvY2Vzc0NvbXBvbmVudChlbGVtZW50KTsKICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgIGVsZW1lbnQgPSB0cmFuc2Zvcm1zW2ldKGVsZW1lbnQsIG9wdGlvbnMpIHx8IGVsZW1lbnQ7CiAgfQogIHByb2Nlc3NBdHRycyhlbGVtZW50KTsKfQoKZnVuY3Rpb24gcHJvY2Vzc0tleSAoZWwpIHsKICB2YXIgZXhwID0gZ2V0QmluZGluZ0F0dHIoZWwsICdrZXknKTsKICBpZiAoZXhwKSB7CiAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICB3YXJuJDIoIjx0ZW1wbGF0ZT4gY2Fubm90IGJlIGtleWVkLiBQbGFjZSB0aGUga2V5IG9uIHJlYWwgZWxlbWVudHMgaW5zdGVhZC4iKTsKICAgIH0KICAgIGVsLmtleSA9IGV4cDsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NSZWYgKGVsKSB7CiAgdmFyIHJlZiA9IGdldEJpbmRpbmdBdHRyKGVsLCAncmVmJyk7CiAgaWYgKHJlZikgewogICAgZWwucmVmID0gcmVmOwogICAgZWwucmVmSW5Gb3IgPSBjaGVja0luRm9yKGVsKTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NGb3IgKGVsKSB7CiAgdmFyIGV4cDsKICBpZiAoKGV4cCA9IGdldEFuZFJlbW92ZUF0dHIoZWwsICd2LWZvcicpKSkgewogICAgdmFyIHJlcyA9IHBhcnNlRm9yKGV4cCk7CiAgICBpZiAocmVzKSB7CiAgICAgIGV4dGVuZChlbCwgcmVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHdhcm4kMigKICAgICAgICAoIkludmFsaWQgdi1mb3IgZXhwcmVzc2lvbjogIiArIGV4cCkKICAgICAgKTsKICAgIH0KICB9Cn0KCgoKZnVuY3Rpb24gcGFyc2VGb3IgKGV4cCkgewogIHZhciBpbk1hdGNoID0gZXhwLm1hdGNoKGZvckFsaWFzUkUpOwogIGlmICghaW5NYXRjaCkgeyByZXR1cm4gfQogIHZhciByZXMgPSB7fTsKICByZXMuZm9yID0gaW5NYXRjaFsyXS50cmltKCk7CiAgdmFyIGFsaWFzID0gaW5NYXRjaFsxXS50cmltKCkucmVwbGFjZShzdHJpcFBhcmVuc1JFLCAnJyk7CiAgdmFyIGl0ZXJhdG9yTWF0Y2ggPSBhbGlhcy5tYXRjaChmb3JJdGVyYXRvclJFKTsKICBpZiAoaXRlcmF0b3JNYXRjaCkgewogICAgcmVzLmFsaWFzID0gYWxpYXMucmVwbGFjZShmb3JJdGVyYXRvclJFLCAnJyk7CiAgICByZXMuaXRlcmF0b3IxID0gaXRlcmF0b3JNYXRjaFsxXS50cmltKCk7CiAgICBpZiAoaXRlcmF0b3JNYXRjaFsyXSkgewogICAgICByZXMuaXRlcmF0b3IyID0gaXRlcmF0b3JNYXRjaFsyXS50cmltKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHJlcy5hbGlhcyA9IGFsaWFzOwogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIHByb2Nlc3NJZiAoZWwpIHsKICB2YXIgZXhwID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtaWYnKTsKICBpZiAoZXhwKSB7CiAgICBlbC5pZiA9IGV4cDsKICAgIGFkZElmQ29uZGl0aW9uKGVsLCB7CiAgICAgIGV4cDogZXhwLAogICAgICBibG9jazogZWwKICAgIH0pOwogIH0gZWxzZSB7CiAgICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScpICE9IG51bGwpIHsKICAgICAgZWwuZWxzZSA9IHRydWU7CiAgICB9CiAgICB2YXIgZWxzZWlmID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZS1pZicpOwogICAgaWYgKGVsc2VpZikgewogICAgICBlbC5lbHNlaWYgPSBlbHNlaWY7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBwcm9jZXNzSWZDb25kaXRpb25zIChlbCwgcGFyZW50KSB7CiAgdmFyIHByZXYgPSBmaW5kUHJldkVsZW1lbnQocGFyZW50LmNoaWxkcmVuKTsKICBpZiAocHJldiAmJiBwcmV2LmlmKSB7CiAgICBhZGRJZkNvbmRpdGlvbihwcmV2LCB7CiAgICAgIGV4cDogZWwuZWxzZWlmLAogICAgICBibG9jazogZWwKICAgIH0pOwogIH0gZWxzZSB7CiAgICB3YXJuJDIoCiAgICAgICJ2LSIgKyAoZWwuZWxzZWlmID8gKCdlbHNlLWlmPSInICsgZWwuZWxzZWlmICsgJyInKSA6ICdlbHNlJykgKyAiICIgKwogICAgICAidXNlZCBvbiBlbGVtZW50IDwiICsgKGVsLnRhZykgKyAiPiB3aXRob3V0IGNvcnJlc3BvbmRpbmcgdi1pZi4iCiAgICApOwogIH0KfQoKZnVuY3Rpb24gZmluZFByZXZFbGVtZW50IChjaGlsZHJlbikgewogIHZhciBpID0gY2hpbGRyZW4ubGVuZ3RoOwogIHdoaWxlIChpLS0pIHsKICAgIGlmIChjaGlsZHJlbltpXS50eXBlID09PSAxKSB7CiAgICAgIHJldHVybiBjaGlsZHJlbltpXQogICAgfSBlbHNlIHsKICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjaGlsZHJlbltpXS50ZXh0ICE9PSAnICcpIHsKICAgICAgICB3YXJuJDIoCiAgICAgICAgICAidGV4dCBcIiIgKyAoY2hpbGRyZW5baV0udGV4dC50cmltKCkpICsgIlwiIGJldHdlZW4gdi1pZiBhbmQgdi1lbHNlKC1pZikgIiArCiAgICAgICAgICAid2lsbCBiZSBpZ25vcmVkLiIKICAgICAgICApOwogICAgICB9CiAgICAgIGNoaWxkcmVuLnBvcCgpOwogICAgfQogIH0KfQoKZnVuY3Rpb24gYWRkSWZDb25kaXRpb24gKGVsLCBjb25kaXRpb24pIHsKICBpZiAoIWVsLmlmQ29uZGl0aW9ucykgewogICAgZWwuaWZDb25kaXRpb25zID0gW107CiAgfQogIGVsLmlmQ29uZGl0aW9ucy5wdXNoKGNvbmRpdGlvbik7Cn0KCmZ1bmN0aW9uIHByb2Nlc3NPbmNlIChlbCkgewogIHZhciBvbmNlJCQxID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Ytb25jZScpOwogIGlmIChvbmNlJCQxICE9IG51bGwpIHsKICAgIGVsLm9uY2UgPSB0cnVlOwogIH0KfQoKZnVuY3Rpb24gcHJvY2Vzc1Nsb3QgKGVsKSB7CiAgaWYgKGVsLnRhZyA9PT0gJ3Nsb3QnKSB7CiAgICBlbC5zbG90TmFtZSA9IGdldEJpbmRpbmdBdHRyKGVsLCAnbmFtZScpOwogICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBlbC5rZXkpIHsKICAgICAgd2FybiQyKAogICAgICAgICJga2V5YCBkb2VzIG5vdCB3b3JrIG9uIDxzbG90PiBiZWNhdXNlIHNsb3RzIGFyZSBhYnN0cmFjdCBvdXRsZXRzICIgKwogICAgICAgICJhbmQgY2FuIHBvc3NpYmx5IGV4cGFuZCBpbnRvIG11bHRpcGxlIGVsZW1lbnRzLiAiICsKICAgICAgICAiVXNlIHRoZSBrZXkgb24gYSB3cmFwcGluZyBlbGVtZW50IGluc3RlYWQuIgogICAgICApOwogICAgfQogIH0gZWxzZSB7CiAgICB2YXIgc2xvdFNjb3BlOwogICAgaWYgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJykgewogICAgICBzbG90U2NvcGUgPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2NvcGUnKTsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgc2xvdFNjb3BlKSB7CiAgICAgICAgd2FybiQyKAogICAgICAgICAgInRoZSBcInNjb3BlXCIgYXR0cmlidXRlIGZvciBzY29wZWQgc2xvdHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYW5kICIgKwogICAgICAgICAgInJlcGxhY2VkIGJ5IFwic2xvdC1zY29wZVwiIHNpbmNlIDIuNS4gVGhlIG5ldyBcInNsb3Qtc2NvcGVcIiBhdHRyaWJ1dGUgIiArCiAgICAgICAgICAiY2FuIGFsc28gYmUgdXNlZCBvbiBwbGFpbiBlbGVtZW50cyBpbiBhZGRpdGlvbiB0byA8dGVtcGxhdGU+IHRvICIgKwogICAgICAgICAgImRlbm90ZSBzY29wZWQgc2xvdHMuIiwKICAgICAgICAgIHRydWUKICAgICAgICApOwogICAgICB9CiAgICAgIGVsLnNsb3RTY29wZSA9IHNsb3RTY29wZSB8fCBnZXRBbmRSZW1vdmVBdHRyKGVsLCAnc2xvdC1zY29wZScpOwogICAgfSBlbHNlIGlmICgoc2xvdFNjb3BlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3Nsb3Qtc2NvcGUnKSkpIHsKICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgZWwuYXR0cnNNYXBbJ3YtZm9yJ10pIHsKICAgICAgICB3YXJuJDIoCiAgICAgICAgICAiQW1iaWd1b3VzIGNvbWJpbmVkIHVzYWdlIG9mIHNsb3Qtc2NvcGUgYW5kIHYtZm9yIG9uIDwiICsgKGVsLnRhZykgKyAiPiAiICsKICAgICAgICAgICIodi1mb3IgdGFrZXMgaGlnaGVyIHByaW9yaXR5KS4gVXNlIGEgd3JhcHBlciA8dGVtcGxhdGU+IGZvciB0aGUgIiArCiAgICAgICAgICAic2NvcGVkIHNsb3QgdG8gbWFrZSBpdCBjbGVhcmVyLiIsCiAgICAgICAgICB0cnVlCiAgICAgICAgKTsKICAgICAgfQogICAgICBlbC5zbG90U2NvcGUgPSBzbG90U2NvcGU7CiAgICB9CiAgICB2YXIgc2xvdFRhcmdldCA9IGdldEJpbmRpbmdBdHRyKGVsLCAnc2xvdCcpOwogICAgaWYgKHNsb3RUYXJnZXQpIHsKICAgICAgZWwuc2xvdFRhcmdldCA9IHNsb3RUYXJnZXQgPT09ICciIicgPyAnImRlZmF1bHQiJyA6IHNsb3RUYXJnZXQ7CiAgICAgIC8vIHByZXNlcnZlIHNsb3QgYXMgYW4gYXR0cmlidXRlIGZvciBuYXRpdmUgc2hhZG93IERPTSBjb21wYXQKICAgICAgLy8gb25seSBmb3Igbm9uLXNjb3BlZCBzbG90cy4KICAgICAgaWYgKGVsLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJiAhZWwuc2xvdFNjb3BlKSB7CiAgICAgICAgYWRkQXR0cihlbCwgJ3Nsb3QnLCBzbG90VGFyZ2V0KTsKICAgICAgfQogICAgfQogIH0KfQoKZnVuY3Rpb24gcHJvY2Vzc0NvbXBvbmVudCAoZWwpIHsKICB2YXIgYmluZGluZzsKICBpZiAoKGJpbmRpbmcgPSBnZXRCaW5kaW5nQXR0cihlbCwgJ2lzJykpKSB7CiAgICBlbC5jb21wb25lbnQgPSBiaW5kaW5nOwogIH0KICBpZiAoZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ2lubGluZS10ZW1wbGF0ZScpICE9IG51bGwpIHsKICAgIGVsLmlubGluZVRlbXBsYXRlID0gdHJ1ZTsKICB9Cn0KCmZ1bmN0aW9uIHByb2Nlc3NBdHRycyAoZWwpIHsKICB2YXIgbGlzdCA9IGVsLmF0dHJzTGlzdDsKICB2YXIgaSwgbCwgbmFtZSwgcmF3TmFtZSwgdmFsdWUsIG1vZGlmaWVycywgaXNQcm9wOwogIGZvciAoaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgbmFtZSA9IHJhd05hbWUgPSBsaXN0W2ldLm5hbWU7CiAgICB2YWx1ZSA9IGxpc3RbaV0udmFsdWU7CiAgICBpZiAoZGlyUkUudGVzdChuYW1lKSkgewogICAgICAvLyBtYXJrIGVsZW1lbnQgYXMgZHluYW1pYwogICAgICBlbC5oYXNCaW5kaW5ncyA9IHRydWU7CiAgICAgIC8vIG1vZGlmaWVycwogICAgICBtb2RpZmllcnMgPSBwYXJzZU1vZGlmaWVycyhuYW1lKTsKICAgICAgaWYgKG1vZGlmaWVycykgewogICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UobW9kaWZpZXJSRSwgJycpOwogICAgICB9CiAgICAgIGlmIChiaW5kUkUudGVzdChuYW1lKSkgeyAvLyB2LWJpbmQKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGJpbmRSRSwgJycpOwogICAgICAgIHZhbHVlID0gcGFyc2VGaWx0ZXJzKHZhbHVlKTsKICAgICAgICBpc1Byb3AgPSBmYWxzZTsKICAgICAgICBpZiAobW9kaWZpZXJzKSB7CiAgICAgICAgICBpZiAobW9kaWZpZXJzLnByb3ApIHsKICAgICAgICAgICAgaXNQcm9wID0gdHJ1ZTsKICAgICAgICAgICAgbmFtZSA9IGNhbWVsaXplKG5hbWUpOwogICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2lubmVySHRtbCcpIHsgbmFtZSA9ICdpbm5lckhUTUwnOyB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobW9kaWZpZXJzLmNhbWVsKSB7CiAgICAgICAgICAgIG5hbWUgPSBjYW1lbGl6ZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtb2RpZmllcnMuc3luYykgewogICAgICAgICAgICBhZGRIYW5kbGVyKAogICAgICAgICAgICAgIGVsLAogICAgICAgICAgICAgICgidXBkYXRlOiIgKyAoY2FtZWxpemUobmFtZSkpKSwKICAgICAgICAgICAgICBnZW5Bc3NpZ25tZW50Q29kZSh2YWx1ZSwgIiRldmVudCIpCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc1Byb3AgfHwgKAogICAgICAgICAgIWVsLmNvbXBvbmVudCAmJiBwbGF0Zm9ybU11c3RVc2VQcm9wKGVsLnRhZywgZWwuYXR0cnNNYXAudHlwZSwgbmFtZSkKICAgICAgICApKSB7CiAgICAgICAgICBhZGRQcm9wKGVsLCBuYW1lLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFkZEF0dHIoZWwsIG5hbWUsIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAob25SRS50ZXN0KG5hbWUpKSB7IC8vIHYtb24KICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKG9uUkUsICcnKTsKICAgICAgICBhZGRIYW5kbGVyKGVsLCBuYW1lLCB2YWx1ZSwgbW9kaWZpZXJzLCBmYWxzZSwgd2FybiQyKTsKICAgICAgfSBlbHNlIHsgLy8gbm9ybWFsIGRpcmVjdGl2ZXMKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGRpclJFLCAnJyk7CiAgICAgICAgLy8gcGFyc2UgYXJnCiAgICAgICAgdmFyIGFyZ01hdGNoID0gbmFtZS5tYXRjaChhcmdSRSk7CiAgICAgICAgdmFyIGFyZyA9IGFyZ01hdGNoICYmIGFyZ01hdGNoWzFdOwogICAgICAgIGlmIChhcmcpIHsKICAgICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIC0oYXJnLmxlbmd0aCArIDEpKTsKICAgICAgICB9CiAgICAgICAgYWRkRGlyZWN0aXZlKGVsLCBuYW1lLCByYXdOYW1lLCB2YWx1ZSwgYXJnLCBtb2RpZmllcnMpOwogICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSA9PT0gJ21vZGVsJykgewogICAgICAgICAgY2hlY2tGb3JBbGlhc01vZGVsKGVsLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBsaXRlcmFsIGF0dHJpYnV0ZQogICAgICB7CiAgICAgICAgdmFyIHJlcyA9IHBhcnNlVGV4dCh2YWx1ZSwgZGVsaW1pdGVycyk7CiAgICAgICAgaWYgKHJlcykgewogICAgICAgICAgd2FybiQyKAogICAgICAgICAgICBuYW1lICsgIj1cIiIgKyB2YWx1ZSArICJcIjogIiArCiAgICAgICAgICAgICdJbnRlcnBvbGF0aW9uIGluc2lkZSBhdHRyaWJ1dGVzIGhhcyBiZWVuIHJlbW92ZWQuICcgKwogICAgICAgICAgICAnVXNlIHYtYmluZCBvciB0aGUgY29sb24gc2hvcnRoYW5kIGluc3RlYWQuIEZvciBleGFtcGxlLCAnICsKICAgICAgICAgICAgJ2luc3RlYWQgb2YgPGRpdiBpZD0ie3sgdmFsIH19Ij4sIHVzZSA8ZGl2IDppZD0idmFsIj4uJwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYWRkQXR0cihlbCwgbmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsKICAgICAgLy8gIzY4ODcgZmlyZWZveCBkb2Vzbid0IHVwZGF0ZSBtdXRlZCBzdGF0ZSBpZiBzZXQgdmlhIGF0dHJpYnV0ZQogICAgICAvLyBldmVuIGltbWVkaWF0ZWx5IGFmdGVyIGVsZW1lbnQgY3JlYXRpb24KICAgICAgaWYgKCFlbC5jb21wb25lbnQgJiYKICAgICAgICAgIG5hbWUgPT09ICdtdXRlZCcgJiYKICAgICAgICAgIHBsYXRmb3JtTXVzdFVzZVByb3AoZWwudGFnLCBlbC5hdHRyc01hcC50eXBlLCBuYW1lKSkgewogICAgICAgIGFkZFByb3AoZWwsIG5hbWUsICd0cnVlJyk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNoZWNrSW5Gb3IgKGVsKSB7CiAgdmFyIHBhcmVudCA9IGVsOwogIHdoaWxlIChwYXJlbnQpIHsKICAgIGlmIChwYXJlbnQuZm9yICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgfQogIHJldHVybiBmYWxzZQp9CgpmdW5jdGlvbiBwYXJzZU1vZGlmaWVycyAobmFtZSkgewogIHZhciBtYXRjaCA9IG5hbWUubWF0Y2gobW9kaWZpZXJSRSk7CiAgaWYgKG1hdGNoKSB7CiAgICB2YXIgcmV0ID0ge307CiAgICBtYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7IHJldFttLnNsaWNlKDEpXSA9IHRydWU7IH0pOwogICAgcmV0dXJuIHJldAogIH0KfQoKZnVuY3Rpb24gbWFrZUF0dHJzTWFwIChhdHRycykgewogIHZhciBtYXAgPSB7fTsKICBmb3IgKHZhciBpID0gMCwgbCA9IGF0dHJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgaWYgKAogICAgICAiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYKICAgICAgbWFwW2F0dHJzW2ldLm5hbWVdICYmICFpc0lFICYmICFpc0VkZ2UKICAgICkgewogICAgICB3YXJuJDIoJ2R1cGxpY2F0ZSBhdHRyaWJ1dGU6ICcgKyBhdHRyc1tpXS5uYW1lKTsKICAgIH0KICAgIG1hcFthdHRyc1tpXS5uYW1lXSA9IGF0dHJzW2ldLnZhbHVlOwogIH0KICByZXR1cm4gbWFwCn0KCi8vIGZvciBzY3JpcHQgKGUuZy4gdHlwZT0ieC90ZW1wbGF0ZSIpIG9yIHN0eWxlLCBkbyBub3QgZGVjb2RlIGNvbnRlbnQKZnVuY3Rpb24gaXNUZXh0VGFnIChlbCkgewogIHJldHVybiBlbC50YWcgPT09ICdzY3JpcHQnIHx8IGVsLnRhZyA9PT0gJ3N0eWxlJwp9CgpmdW5jdGlvbiBpc0ZvcmJpZGRlblRhZyAoZWwpIHsKICByZXR1cm4gKAogICAgZWwudGFnID09PSAnc3R5bGUnIHx8CiAgICAoZWwudGFnID09PSAnc2NyaXB0JyAmJiAoCiAgICAgICFlbC5hdHRyc01hcC50eXBlIHx8CiAgICAgIGVsLmF0dHJzTWFwLnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnCiAgICApKQogICkKfQoKdmFyIGllTlNCdWcgPSAvXnhtbG5zOk5TXGQrLzsKdmFyIGllTlNQcmVmaXggPSAvXk5TXGQrOi87CgovKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwpmdW5jdGlvbiBndWFyZElFU1ZHQnVnIChhdHRycykgewogIHZhciByZXMgPSBbXTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgYXR0ciA9IGF0dHJzW2ldOwogICAgaWYgKCFpZU5TQnVnLnRlc3QoYXR0ci5uYW1lKSkgewogICAgICBhdHRyLm5hbWUgPSBhdHRyLm5hbWUucmVwbGFjZShpZU5TUHJlZml4LCAnJyk7CiAgICAgIHJlcy5wdXNoKGF0dHIpOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIGNoZWNrRm9yQWxpYXNNb2RlbCAoZWwsIHZhbHVlKSB7CiAgdmFyIF9lbCA9IGVsOwogIHdoaWxlIChfZWwpIHsKICAgIGlmIChfZWwuZm9yICYmIF9lbC5hbGlhcyA9PT0gdmFsdWUpIHsKICAgICAgd2FybiQyKAogICAgICAgICI8IiArIChlbC50YWcpICsgIiB2LW1vZGVsPVwiIiArIHZhbHVlICsgIlwiPjogIiArCiAgICAgICAgIllvdSBhcmUgYmluZGluZyB2LW1vZGVsIGRpcmVjdGx5IHRvIGEgdi1mb3IgaXRlcmF0aW9uIGFsaWFzLiAiICsKICAgICAgICAiVGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIG1vZGlmeSB0aGUgdi1mb3Igc291cmNlIGFycmF5IGJlY2F1c2UgIiArCiAgICAgICAgIndyaXRpbmcgdG8gdGhlIGFsaWFzIGlzIGxpa2UgbW9kaWZ5aW5nIGEgZnVuY3Rpb24gbG9jYWwgdmFyaWFibGUuICIgKwogICAgICAgICJDb25zaWRlciB1c2luZyBhbiBhcnJheSBvZiBvYmplY3RzIGFuZCB1c2Ugdi1tb2RlbCBvbiBhbiBvYmplY3QgcHJvcGVydHkgaW5zdGVhZC4iCiAgICAgICk7CiAgICB9CiAgICBfZWwgPSBfZWwucGFyZW50OwogIH0KfQoKLyogICovCgovKioKICogRXhwYW5kIGlucHV0W3YtbW9kZWxdIHdpdGggZHlhbm1pYyB0eXBlIGJpbmRpbmdzIGludG8gdi1pZi1lbHNlIGNoYWlucwogKiBUdXJuIHRoaXM6CiAqICAgPGlucHV0IHYtbW9kZWw9ImRhdGFbdHlwZV0iIDp0eXBlPSJ0eXBlIj4KICogaW50byB0aGlzOgogKiAgIDxpbnB1dCB2LWlmPSJ0eXBlID09PSAnY2hlY2tib3gnIiB0eXBlPSJjaGVja2JveCIgdi1tb2RlbD0iZGF0YVt0eXBlXSI+CiAqICAgPGlucHV0IHYtZWxzZS1pZj0idHlwZSA9PT0gJ3JhZGlvJyIgdHlwZT0icmFkaW8iIHYtbW9kZWw9ImRhdGFbdHlwZV0iPgogKiAgIDxpbnB1dCB2LWVsc2UgOnR5cGU9InR5cGUiIHYtbW9kZWw9ImRhdGFbdHlwZV0iPgogKi8KCmZ1bmN0aW9uIHByZVRyYW5zZm9ybU5vZGUgKGVsLCBvcHRpb25zKSB7CiAgaWYgKGVsLnRhZyA9PT0gJ2lucHV0JykgewogICAgdmFyIG1hcCA9IGVsLmF0dHJzTWFwOwogICAgaWYgKCFtYXBbJ3YtbW9kZWwnXSkgewogICAgICByZXR1cm4KICAgIH0KCiAgICB2YXIgdHlwZUJpbmRpbmc7CiAgICBpZiAobWFwWyc6dHlwZSddIHx8IG1hcFsndi1iaW5kOnR5cGUnXSkgewogICAgICB0eXBlQmluZGluZyA9IGdldEJpbmRpbmdBdHRyKGVsLCAndHlwZScpOwogICAgfQogICAgaWYgKCFtYXAudHlwZSAmJiAhdHlwZUJpbmRpbmcgJiYgbWFwWyd2LWJpbmQnXSkgewogICAgICB0eXBlQmluZGluZyA9ICIoIiArIChtYXBbJ3YtYmluZCddKSArICIpLnR5cGUiOwogICAgfQoKICAgIGlmICh0eXBlQmluZGluZykgewogICAgICB2YXIgaWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1pZicsIHRydWUpOwogICAgICB2YXIgaWZDb25kaXRpb25FeHRyYSA9IGlmQ29uZGl0aW9uID8gKCImJigiICsgaWZDb25kaXRpb24gKyAiKSIpIDogIiI7CiAgICAgIHZhciBoYXNFbHNlID0gZ2V0QW5kUmVtb3ZlQXR0cihlbCwgJ3YtZWxzZScsIHRydWUpICE9IG51bGw7CiAgICAgIHZhciBlbHNlSWZDb25kaXRpb24gPSBnZXRBbmRSZW1vdmVBdHRyKGVsLCAndi1lbHNlLWlmJywgdHJ1ZSk7CiAgICAgIC8vIDEuIGNoZWNrYm94CiAgICAgIHZhciBicmFuY2gwID0gY2xvbmVBU1RFbGVtZW50KGVsKTsKICAgICAgLy8gcHJvY2VzcyBmb3Igb24gdGhlIG1haW4gbm9kZQogICAgICBwcm9jZXNzRm9yKGJyYW5jaDApOwogICAgICBhZGRSYXdBdHRyKGJyYW5jaDAsICd0eXBlJywgJ2NoZWNrYm94Jyk7CiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDAsIG9wdGlvbnMpOwogICAgICBicmFuY2gwLnByb2Nlc3NlZCA9IHRydWU7IC8vIHByZXZlbnQgaXQgZnJvbSBkb3VibGUtcHJvY2Vzc2VkCiAgICAgIGJyYW5jaDAuaWYgPSAiKCIgKyB0eXBlQmluZGluZyArICIpPT09J2NoZWNrYm94JyIgKyBpZkNvbmRpdGlvbkV4dHJhOwogICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7CiAgICAgICAgZXhwOiBicmFuY2gwLmlmLAogICAgICAgIGJsb2NrOiBicmFuY2gwCiAgICAgIH0pOwogICAgICAvLyAyLiBhZGQgcmFkaW8gZWxzZS1pZiBjb25kaXRpb24KICAgICAgdmFyIGJyYW5jaDEgPSBjbG9uZUFTVEVsZW1lbnQoZWwpOwogICAgICBnZXRBbmRSZW1vdmVBdHRyKGJyYW5jaDEsICd2LWZvcicsIHRydWUpOwogICAgICBhZGRSYXdBdHRyKGJyYW5jaDEsICd0eXBlJywgJ3JhZGlvJyk7CiAgICAgIHByb2Nlc3NFbGVtZW50KGJyYW5jaDEsIG9wdGlvbnMpOwogICAgICBhZGRJZkNvbmRpdGlvbihicmFuY2gwLCB7CiAgICAgICAgZXhwOiAiKCIgKyB0eXBlQmluZGluZyArICIpPT09J3JhZGlvJyIgKyBpZkNvbmRpdGlvbkV4dHJhLAogICAgICAgIGJsb2NrOiBicmFuY2gxCiAgICAgIH0pOwogICAgICAvLyAzLiBvdGhlcgogICAgICB2YXIgYnJhbmNoMiA9IGNsb25lQVNURWxlbWVudChlbCk7CiAgICAgIGdldEFuZFJlbW92ZUF0dHIoYnJhbmNoMiwgJ3YtZm9yJywgdHJ1ZSk7CiAgICAgIGFkZFJhd0F0dHIoYnJhbmNoMiwgJzp0eXBlJywgdHlwZUJpbmRpbmcpOwogICAgICBwcm9jZXNzRWxlbWVudChicmFuY2gyLCBvcHRpb25zKTsKICAgICAgYWRkSWZDb25kaXRpb24oYnJhbmNoMCwgewogICAgICAgIGV4cDogaWZDb25kaXRpb24sCiAgICAgICAgYmxvY2s6IGJyYW5jaDIKICAgICAgfSk7CgogICAgICBpZiAoaGFzRWxzZSkgewogICAgICAgIGJyYW5jaDAuZWxzZSA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoZWxzZUlmQ29uZGl0aW9uKSB7CiAgICAgICAgYnJhbmNoMC5lbHNlaWYgPSBlbHNlSWZDb25kaXRpb247CiAgICAgIH0KCiAgICAgIHJldHVybiBicmFuY2gwCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjbG9uZUFTVEVsZW1lbnQgKGVsKSB7CiAgcmV0dXJuIGNyZWF0ZUFTVEVsZW1lbnQoZWwudGFnLCBlbC5hdHRyc0xpc3Quc2xpY2UoKSwgZWwucGFyZW50KQp9Cgp2YXIgbW9kZWwkMiA9IHsKICBwcmVUcmFuc2Zvcm1Ob2RlOiBwcmVUcmFuc2Zvcm1Ob2RlCn0KCnZhciBtb2R1bGVzJDEgPSBbCiAga2xhc3MkMSwKICBzdHlsZSQxLAogIG1vZGVsJDIKXQoKLyogICovCgpmdW5jdGlvbiB0ZXh0IChlbCwgZGlyKSB7CiAgaWYgKGRpci52YWx1ZSkgewogICAgYWRkUHJvcChlbCwgJ3RleHRDb250ZW50JywgKCJfcygiICsgKGRpci52YWx1ZSkgKyAiKSIpKTsKICB9Cn0KCi8qICAqLwoKZnVuY3Rpb24gaHRtbCAoZWwsIGRpcikgewogIGlmIChkaXIudmFsdWUpIHsKICAgIGFkZFByb3AoZWwsICdpbm5lckhUTUwnLCAoIl9zKCIgKyAoZGlyLnZhbHVlKSArICIpIikpOwogIH0KfQoKdmFyIGRpcmVjdGl2ZXMkMSA9IHsKICBtb2RlbDogbW9kZWwsCiAgdGV4dDogdGV4dCwKICBodG1sOiBodG1sCn0KCi8qICAqLwoKdmFyIGJhc2VPcHRpb25zID0gewogIGV4cGVjdEhUTUw6IHRydWUsCiAgbW9kdWxlczogbW9kdWxlcyQxLAogIGRpcmVjdGl2ZXM6IGRpcmVjdGl2ZXMkMSwKICBpc1ByZVRhZzogaXNQcmVUYWcsCiAgaXNVbmFyeVRhZzogaXNVbmFyeVRhZywKICBtdXN0VXNlUHJvcDogbXVzdFVzZVByb3AsCiAgY2FuQmVMZWZ0T3BlblRhZzogY2FuQmVMZWZ0T3BlblRhZywKICBpc1Jlc2VydmVkVGFnOiBpc1Jlc2VydmVkVGFnLAogIGdldFRhZ05hbWVzcGFjZTogZ2V0VGFnTmFtZXNwYWNlLAogIHN0YXRpY0tleXM6IGdlblN0YXRpY0tleXMobW9kdWxlcyQxKQp9OwoKLyogICovCgp2YXIgaXNTdGF0aWNLZXk7CnZhciBpc1BsYXRmb3JtUmVzZXJ2ZWRUYWc7Cgp2YXIgZ2VuU3RhdGljS2V5c0NhY2hlZCA9IGNhY2hlZChnZW5TdGF0aWNLZXlzJDEpOwoKLyoqCiAqIEdvYWwgb2YgdGhlIG9wdGltaXplcjogd2FsayB0aGUgZ2VuZXJhdGVkIHRlbXBsYXRlIEFTVCB0cmVlCiAqIGFuZCBkZXRlY3Qgc3ViLXRyZWVzIHRoYXQgYXJlIHB1cmVseSBzdGF0aWMsIGkuZS4gcGFydHMgb2YKICogdGhlIERPTSB0aGF0IG5ldmVyIG5lZWRzIHRvIGNoYW5nZS4KICoKICogT25jZSB3ZSBkZXRlY3QgdGhlc2Ugc3ViLXRyZWVzLCB3ZSBjYW46CiAqCiAqIDEuIEhvaXN0IHRoZW0gaW50byBjb25zdGFudHMsIHNvIHRoYXQgd2Ugbm8gbG9uZ2VyIG5lZWQgdG8KICogICAgY3JlYXRlIGZyZXNoIG5vZGVzIGZvciB0aGVtIG9uIGVhY2ggcmUtcmVuZGVyOwogKiAyLiBDb21wbGV0ZWx5IHNraXAgdGhlbSBpbiB0aGUgcGF0Y2hpbmcgcHJvY2Vzcy4KICovCmZ1bmN0aW9uIG9wdGltaXplIChyb290LCBvcHRpb25zKSB7CiAgaWYgKCFyb290KSB7IHJldHVybiB9CiAgaXNTdGF0aWNLZXkgPSBnZW5TdGF0aWNLZXlzQ2FjaGVkKG9wdGlvbnMuc3RhdGljS2V5cyB8fCAnJyk7CiAgaXNQbGF0Zm9ybVJlc2VydmVkVGFnID0gb3B0aW9ucy5pc1Jlc2VydmVkVGFnIHx8IG5vOwogIC8vIGZpcnN0IHBhc3M6IG1hcmsgYWxsIG5vbi1zdGF0aWMgbm9kZXMuCiAgbWFya1N0YXRpYyQxKHJvb3QpOwogIC8vIHNlY29uZCBwYXNzOiBtYXJrIHN0YXRpYyByb290cy4KICBtYXJrU3RhdGljUm9vdHMocm9vdCwgZmFsc2UpOwp9CgpmdW5jdGlvbiBnZW5TdGF0aWNLZXlzJDEgKGtleXMpIHsKICByZXR1cm4gbWFrZU1hcCgKICAgICd0eXBlLHRhZyxhdHRyc0xpc3QsYXR0cnNNYXAscGxhaW4scGFyZW50LGNoaWxkcmVuLGF0dHJzJyArCiAgICAoa2V5cyA/ICcsJyArIGtleXMgOiAnJykKICApCn0KCmZ1bmN0aW9uIG1hcmtTdGF0aWMkMSAobm9kZSkgewogIG5vZGUuc3RhdGljID0gaXNTdGF0aWMobm9kZSk7CiAgaWYgKG5vZGUudHlwZSA9PT0gMSkgewogICAgLy8gZG8gbm90IG1ha2UgY29tcG9uZW50IHNsb3QgY29udGVudCBzdGF0aWMuIHRoaXMgYXZvaWRzCiAgICAvLyAxLiBjb21wb25lbnRzIG5vdCBhYmxlIHRvIG11dGF0ZSBzbG90IG5vZGVzCiAgICAvLyAyLiBzdGF0aWMgc2xvdCBjb250ZW50IGZhaWxzIGZvciBob3QtcmVsb2FkaW5nCiAgICBpZiAoCiAgICAgICFpc1BsYXRmb3JtUmVzZXJ2ZWRUYWcobm9kZS50YWcpICYmCiAgICAgIG5vZGUudGFnICE9PSAnc2xvdCcgJiYKICAgICAgbm9kZS5hdHRyc01hcFsnaW5saW5lLXRlbXBsYXRlJ10gPT0gbnVsbAogICAgKSB7CiAgICAgIHJldHVybgogICAgfQogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldOwogICAgICBtYXJrU3RhdGljJDEoY2hpbGQpOwogICAgICBpZiAoIWNoaWxkLnN0YXRpYykgewogICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykgewogICAgICBmb3IgKHZhciBpJDEgPSAxLCBsJDEgPSBub2RlLmlmQ29uZGl0aW9ucy5sZW5ndGg7IGkkMSA8IGwkMTsgaSQxKyspIHsKICAgICAgICB2YXIgYmxvY2sgPSBub2RlLmlmQ29uZGl0aW9uc1tpJDFdLmJsb2NrOwogICAgICAgIG1hcmtTdGF0aWMkMShibG9jayk7CiAgICAgICAgaWYgKCFibG9jay5zdGF0aWMpIHsKICAgICAgICAgIG5vZGUuc3RhdGljID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBtYXJrU3RhdGljUm9vdHMgKG5vZGUsIGlzSW5Gb3IpIHsKICBpZiAobm9kZS50eXBlID09PSAxKSB7CiAgICBpZiAobm9kZS5zdGF0aWMgfHwgbm9kZS5vbmNlKSB7CiAgICAgIG5vZGUuc3RhdGljSW5Gb3IgPSBpc0luRm9yOwogICAgfQogICAgLy8gRm9yIGEgbm9kZSB0byBxdWFsaWZ5IGFzIGEgc3RhdGljIHJvb3QsIGl0IHNob3VsZCBoYXZlIGNoaWxkcmVuIHRoYXQKICAgIC8vIGFyZSBub3QganVzdCBzdGF0aWMgdGV4dC4gT3RoZXJ3aXNlIHRoZSBjb3N0IG9mIGhvaXN0aW5nIG91dCB3aWxsCiAgICAvLyBvdXR3ZWlnaCB0aGUgYmVuZWZpdHMgYW5kIGl0J3MgYmV0dGVyIG9mZiB0byBqdXN0IGFsd2F5cyByZW5kZXIgaXQgZnJlc2guCiAgICBpZiAobm9kZS5zdGF0aWMgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggJiYgISgKICAgICAgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYKICAgICAgbm9kZS5jaGlsZHJlblswXS50eXBlID09PSAzCiAgICApKSB7CiAgICAgIG5vZGUuc3RhdGljUm9vdCA9IHRydWU7CiAgICAgIHJldHVybgogICAgfSBlbHNlIHsKICAgICAgbm9kZS5zdGF0aWNSb290ID0gZmFsc2U7CiAgICB9CiAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgbWFya1N0YXRpY1Jvb3RzKG5vZGUuY2hpbGRyZW5baV0sIGlzSW5Gb3IgfHwgISFub2RlLmZvcik7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2RlLmlmQ29uZGl0aW9ucykgewogICAgICBmb3IgKHZhciBpJDEgPSAxLCBsJDEgPSBub2RlLmlmQ29uZGl0aW9ucy5sZW5ndGg7IGkkMSA8IGwkMTsgaSQxKyspIHsKICAgICAgICBtYXJrU3RhdGljUm9vdHMobm9kZS5pZkNvbmRpdGlvbnNbaSQxXS5ibG9jaywgaXNJbkZvcik7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGlzU3RhdGljIChub2RlKSB7CiAgaWYgKG5vZGUudHlwZSA9PT0gMikgeyAvLyBleHByZXNzaW9uCiAgICByZXR1cm4gZmFsc2UKICB9CiAgaWYgKG5vZGUudHlwZSA9PT0gMykgeyAvLyB0ZXh0CiAgICByZXR1cm4gdHJ1ZQogIH0KICByZXR1cm4gISEobm9kZS5wcmUgfHwgKAogICAgIW5vZGUuaGFzQmluZGluZ3MgJiYgLy8gbm8gZHluYW1pYyBiaW5kaW5ncwogICAgIW5vZGUuaWYgJiYgIW5vZGUuZm9yICYmIC8vIG5vdCB2LWlmIG9yIHYtZm9yIG9yIHYtZWxzZQogICAgIWlzQnVpbHRJblRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgYnVpbHQtaW4KICAgIGlzUGxhdGZvcm1SZXNlcnZlZFRhZyhub2RlLnRhZykgJiYgLy8gbm90IGEgY29tcG9uZW50CiAgICAhaXNEaXJlY3RDaGlsZE9mVGVtcGxhdGVGb3Iobm9kZSkgJiYKICAgIE9iamVjdC5rZXlzKG5vZGUpLmV2ZXJ5KGlzU3RhdGljS2V5KQogICkpCn0KCmZ1bmN0aW9uIGlzRGlyZWN0Q2hpbGRPZlRlbXBsYXRlRm9yIChub2RlKSB7CiAgd2hpbGUgKG5vZGUucGFyZW50KSB7CiAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICBpZiAobm9kZS50YWcgIT09ICd0ZW1wbGF0ZScpIHsKICAgICAgcmV0dXJuIGZhbHNlCiAgICB9CiAgICBpZiAobm9kZS5mb3IpIHsKICAgICAgcmV0dXJuIHRydWUKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlCn0KCi8qICAqLwoKdmFyIGZuRXhwUkUgPSAvXihbXHckX10rfFwoW14pXSo/XCkpXHMqPT58XmZ1bmN0aW9uXHMqXCgvOwp2YXIgc2ltcGxlUGF0aFJFID0gL15bQS1aYS16XyRdW1x3JF0qKD86XC5bQS1aYS16XyRdW1x3JF0qfFxbJ1teJ10qPyddfFxbIlteIl0qPyJdfFxbXGQrXXxcW1tBLVphLXpfJF1bXHckXSpdKSokLzsKCi8vIEtleWJvYXJkRXZlbnQua2V5Q29kZSBhbGlhc2VzCnZhciBrZXlDb2RlcyA9IHsKICBlc2M6IDI3LAogIHRhYjogOSwKICBlbnRlcjogMTMsCiAgc3BhY2U6IDMyLAogIHVwOiAzOCwKICBsZWZ0OiAzNywKICByaWdodDogMzksCiAgZG93bjogNDAsCiAgJ2RlbGV0ZSc6IFs4LCA0Nl0KfTsKCi8vIEtleWJvYXJkRXZlbnQua2V5IGFsaWFzZXMKdmFyIGtleU5hbWVzID0gewogIGVzYzogJ0VzY2FwZScsCiAgdGFiOiAnVGFiJywKICBlbnRlcjogJ0VudGVyJywKICBzcGFjZTogJyAnLAogIC8vICM3ODA2OiBJRTExIHVzZXMga2V5IG5hbWVzIHdpdGhvdXQgYEFycm93YCBwcmVmaXggZm9yIGFycm93IGtleXMuCiAgdXA6IFsnVXAnLCAnQXJyb3dVcCddLAogIGxlZnQ6IFsnTGVmdCcsICdBcnJvd0xlZnQnXSwKICByaWdodDogWydSaWdodCcsICdBcnJvd1JpZ2h0J10sCiAgZG93bjogWydEb3duJywgJ0Fycm93RG93biddLAogICdkZWxldGUnOiBbJ0JhY2tzcGFjZScsICdEZWxldGUnXQp9OwoKLy8gIzQ4Njg6IG1vZGlmaWVycyB0aGF0IHByZXZlbnQgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbGlzdGVuZXIKLy8gbmVlZCB0byBleHBsaWNpdGx5IHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSB3aGV0aGVyIHRvIHJlbW92ZQovLyB0aGUgbGlzdGVuZXIgZm9yIC5vbmNlCnZhciBnZW5HdWFyZCA9IGZ1bmN0aW9uIChjb25kaXRpb24pIHsgcmV0dXJuICgiaWYoIiArIGNvbmRpdGlvbiArICIpcmV0dXJuIG51bGw7Iik7IH07Cgp2YXIgbW9kaWZpZXJDb2RlID0gewogIHN0b3A6ICckZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JywKICBwcmV2ZW50OiAnJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7JywKICBzZWxmOiBnZW5HdWFyZCgiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQiKSwKICBjdHJsOiBnZW5HdWFyZCgiISRldmVudC5jdHJsS2V5IiksCiAgc2hpZnQ6IGdlbkd1YXJkKCIhJGV2ZW50LnNoaWZ0S2V5IiksCiAgYWx0OiBnZW5HdWFyZCgiISRldmVudC5hbHRLZXkiKSwKICBtZXRhOiBnZW5HdWFyZCgiISRldmVudC5tZXRhS2V5IiksCiAgbGVmdDogZ2VuR3VhcmQoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAwIiksCiAgbWlkZGxlOiBnZW5HdWFyZCgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDEiKSwKICByaWdodDogZ2VuR3VhcmQoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAyIikKfTsKCmZ1bmN0aW9uIGdlbkhhbmRsZXJzICgKICBldmVudHMsCiAgaXNOYXRpdmUsCiAgd2FybgopIHsKICB2YXIgcmVzID0gaXNOYXRpdmUgPyAnbmF0aXZlT246eycgOiAnb246eyc7CiAgZm9yICh2YXIgbmFtZSBpbiBldmVudHMpIHsKICAgIHJlcyArPSAiXCIiICsgbmFtZSArICJcIjoiICsgKGdlbkhhbmRsZXIobmFtZSwgZXZlbnRzW25hbWVdKSkgKyAiLCI7CiAgfQogIHJldHVybiByZXMuc2xpY2UoMCwgLTEpICsgJ30nCn0KCmZ1bmN0aW9uIGdlbkhhbmRsZXIgKAogIG5hbWUsCiAgaGFuZGxlcgopIHsKICBpZiAoIWhhbmRsZXIpIHsKICAgIHJldHVybiAnZnVuY3Rpb24oKXt9JwogIH0KCiAgaWYgKEFycmF5LmlzQXJyYXkoaGFuZGxlcikpIHsKICAgIHJldHVybiAoIlsiICsgKGhhbmRsZXIubWFwKGZ1bmN0aW9uIChoYW5kbGVyKSB7IHJldHVybiBnZW5IYW5kbGVyKG5hbWUsIGhhbmRsZXIpOyB9KS5qb2luKCcsJykpICsgIl0iKQogIH0KCiAgdmFyIGlzTWV0aG9kUGF0aCA9IHNpbXBsZVBhdGhSRS50ZXN0KGhhbmRsZXIudmFsdWUpOwogIHZhciBpc0Z1bmN0aW9uRXhwcmVzc2lvbiA9IGZuRXhwUkUudGVzdChoYW5kbGVyLnZhbHVlKTsKCiAgaWYgKCFoYW5kbGVyLm1vZGlmaWVycykgewogICAgaWYgKGlzTWV0aG9kUGF0aCB8fCBpc0Z1bmN0aW9uRXhwcmVzc2lvbikgewogICAgICByZXR1cm4gaGFuZGxlci52YWx1ZQogICAgfQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICByZXR1cm4gKCJmdW5jdGlvbigkZXZlbnQpeyIgKyAoaGFuZGxlci52YWx1ZSkgKyAifSIpIC8vIGlubGluZSBzdGF0ZW1lbnQKICB9IGVsc2UgewogICAgdmFyIGNvZGUgPSAnJzsKICAgIHZhciBnZW5Nb2RpZmllckNvZGUgPSAnJzsKICAgIHZhciBrZXlzID0gW107CiAgICBmb3IgKHZhciBrZXkgaW4gaGFuZGxlci5tb2RpZmllcnMpIHsKICAgICAgaWYgKG1vZGlmaWVyQ29kZVtrZXldKSB7CiAgICAgICAgZ2VuTW9kaWZpZXJDb2RlICs9IG1vZGlmaWVyQ29kZVtrZXldOwogICAgICAgIC8vIGxlZnQvcmlnaHQKICAgICAgICBpZiAoa2V5Q29kZXNba2V5XSkgewogICAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2V4YWN0JykgewogICAgICAgIHZhciBtb2RpZmllcnMgPSAoaGFuZGxlci5tb2RpZmllcnMpOwogICAgICAgIGdlbk1vZGlmaWVyQ29kZSArPSBnZW5HdWFyZCgKICAgICAgICAgIFsnY3RybCcsICdzaGlmdCcsICdhbHQnLCAnbWV0YSddCiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGtleU1vZGlmaWVyKSB7IHJldHVybiAhbW9kaWZpZXJzW2tleU1vZGlmaWVyXTsgfSkKICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoa2V5TW9kaWZpZXIpIHsgcmV0dXJuICgiJGV2ZW50LiIgKyBrZXlNb2RpZmllciArICJLZXkiKTsgfSkKICAgICAgICAgICAgLmpvaW4oJ3x8JykKICAgICAgICApOwogICAgICB9IGVsc2UgewogICAgICAgIGtleXMucHVzaChrZXkpOwogICAgICB9CiAgICB9CiAgICBpZiAoa2V5cy5sZW5ndGgpIHsKICAgICAgY29kZSArPSBnZW5LZXlGaWx0ZXIoa2V5cyk7CiAgICB9CiAgICAvLyBNYWtlIHN1cmUgbW9kaWZpZXJzIGxpa2UgcHJldmVudCBhbmQgc3RvcCBnZXQgZXhlY3V0ZWQgYWZ0ZXIga2V5IGZpbHRlcmluZwogICAgaWYgKGdlbk1vZGlmaWVyQ29kZSkgewogICAgICBjb2RlICs9IGdlbk1vZGlmaWVyQ29kZTsKICAgIH0KICAgIHZhciBoYW5kbGVyQ29kZSA9IGlzTWV0aG9kUGF0aAogICAgICA/ICgicmV0dXJuICIgKyAoaGFuZGxlci52YWx1ZSkgKyAiKCRldmVudCkiKQogICAgICA6IGlzRnVuY3Rpb25FeHByZXNzaW9uCiAgICAgICAgPyAoInJldHVybiAoIiArIChoYW5kbGVyLnZhbHVlKSArICIpKCRldmVudCkiKQogICAgICAgIDogaGFuZGxlci52YWx1ZTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgcmV0dXJuICgiZnVuY3Rpb24oJGV2ZW50KXsiICsgY29kZSArIGhhbmRsZXJDb2RlICsgIn0iKQogIH0KfQoKZnVuY3Rpb24gZ2VuS2V5RmlsdGVyIChrZXlzKSB7CiAgcmV0dXJuICgiaWYoISgnYnV0dG9uJyBpbiAkZXZlbnQpJiYiICsgKGtleXMubWFwKGdlbkZpbHRlckNvZGUpLmpvaW4oJyYmJykpICsgIilyZXR1cm4gbnVsbDsiKQp9CgpmdW5jdGlvbiBnZW5GaWx0ZXJDb2RlIChrZXkpIHsKICB2YXIga2V5VmFsID0gcGFyc2VJbnQoa2V5LCAxMCk7CiAgaWYgKGtleVZhbCkgewogICAgcmV0dXJuICgiJGV2ZW50LmtleUNvZGUhPT0iICsga2V5VmFsKQogIH0KICB2YXIga2V5Q29kZSA9IGtleUNvZGVzW2tleV07CiAgdmFyIGtleU5hbWUgPSBrZXlOYW1lc1trZXldOwogIHJldHVybiAoCiAgICAiX2soJGV2ZW50LmtleUNvZGUsIiArCiAgICAoSlNPTi5zdHJpbmdpZnkoa2V5KSkgKyAiLCIgKwogICAgKEpTT04uc3RyaW5naWZ5KGtleUNvZGUpKSArICIsIiArCiAgICAiJGV2ZW50LmtleSwiICsKICAgICIiICsgKEpTT04uc3RyaW5naWZ5KGtleU5hbWUpKSArCiAgICAiKSIKICApCn0KCi8qICAqLwoKZnVuY3Rpb24gb24gKGVsLCBkaXIpIHsKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGRpci5tb2RpZmllcnMpIHsKICAgIHdhcm4oInYtb24gd2l0aG91dCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IG1vZGlmaWVycy4iKTsKICB9CiAgZWwud3JhcExpc3RlbmVycyA9IGZ1bmN0aW9uIChjb2RlKSB7IHJldHVybiAoIl9nKCIgKyBjb2RlICsgIiwiICsgKGRpci52YWx1ZSkgKyAiKSIpOyB9Owp9CgovKiAgKi8KCmZ1bmN0aW9uIGJpbmQkMSAoZWwsIGRpcikgewogIGVsLndyYXBEYXRhID0gZnVuY3Rpb24gKGNvZGUpIHsKICAgIHJldHVybiAoIl9iKCIgKyBjb2RlICsgIiwnIiArIChlbC50YWcpICsgIicsIiArIChkaXIudmFsdWUpICsgIiwiICsgKGRpci5tb2RpZmllcnMgJiYgZGlyLm1vZGlmaWVycy5wcm9wID8gJ3RydWUnIDogJ2ZhbHNlJykgKyAoZGlyLm1vZGlmaWVycyAmJiBkaXIubW9kaWZpZXJzLnN5bmMgPyAnLHRydWUnIDogJycpICsgIikiKQogIH07Cn0KCi8qICAqLwoKdmFyIGJhc2VEaXJlY3RpdmVzID0gewogIG9uOiBvbiwKICBiaW5kOiBiaW5kJDEsCiAgY2xvYWs6IG5vb3AKfQoKLyogICovCgp2YXIgQ29kZWdlblN0YXRlID0gZnVuY3Rpb24gQ29kZWdlblN0YXRlIChvcHRpb25zKSB7CiAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICB0aGlzLndhcm4gPSBvcHRpb25zLndhcm4gfHwgYmFzZVdhcm47CiAgdGhpcy50cmFuc2Zvcm1zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICd0cmFuc2Zvcm1Db2RlJyk7CiAgdGhpcy5kYXRhR2VuRm5zID0gcGx1Y2tNb2R1bGVGdW5jdGlvbihvcHRpb25zLm1vZHVsZXMsICdnZW5EYXRhJyk7CiAgdGhpcy5kaXJlY3RpdmVzID0gZXh0ZW5kKGV4dGVuZCh7fSwgYmFzZURpcmVjdGl2ZXMpLCBvcHRpb25zLmRpcmVjdGl2ZXMpOwogIHZhciBpc1Jlc2VydmVkVGFnID0gb3B0aW9ucy5pc1Jlc2VydmVkVGFnIHx8IG5vOwogIHRoaXMubWF5YmVDb21wb25lbnQgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuICFpc1Jlc2VydmVkVGFnKGVsLnRhZyk7IH07CiAgdGhpcy5vbmNlSWQgPSAwOwogIHRoaXMuc3RhdGljUmVuZGVyRm5zID0gW107Cn07CgoKCmZ1bmN0aW9uIGdlbmVyYXRlICgKICBhc3QsCiAgb3B0aW9ucwopIHsKICB2YXIgc3RhdGUgPSBuZXcgQ29kZWdlblN0YXRlKG9wdGlvbnMpOwogIHZhciBjb2RlID0gYXN0ID8gZ2VuRWxlbWVudChhc3QsIHN0YXRlKSA6ICdfYygiZGl2IiknOwogIHJldHVybiB7CiAgICByZW5kZXI6ICgid2l0aCh0aGlzKXtyZXR1cm4gIiArIGNvZGUgKyAifSIpLAogICAgc3RhdGljUmVuZGVyRm5zOiBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMKICB9Cn0KCmZ1bmN0aW9uIGdlbkVsZW1lbnQgKGVsLCBzdGF0ZSkgewogIGlmIChlbC5zdGF0aWNSb290ICYmICFlbC5zdGF0aWNQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5TdGF0aWMoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwub25jZSAmJiAhZWwub25jZVByb2Nlc3NlZCkgewogICAgcmV0dXJuIGdlbk9uY2UoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwuZm9yICYmICFlbC5mb3JQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5Gb3IoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwuaWYgJiYgIWVsLmlmUHJvY2Vzc2VkKSB7CiAgICByZXR1cm4gZ2VuSWYoZWwsIHN0YXRlKQogIH0gZWxzZSBpZiAoZWwudGFnID09PSAndGVtcGxhdGUnICYmICFlbC5zbG90VGFyZ2V0KSB7CiAgICByZXR1cm4gZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlKSB8fCAndm9pZCAwJwogIH0gZWxzZSBpZiAoZWwudGFnID09PSAnc2xvdCcpIHsKICAgIHJldHVybiBnZW5TbG90KGVsLCBzdGF0ZSkKICB9IGVsc2UgewogICAgLy8gY29tcG9uZW50IG9yIGVsZW1lbnQKICAgIHZhciBjb2RlOwogICAgaWYgKGVsLmNvbXBvbmVudCkgewogICAgICBjb2RlID0gZ2VuQ29tcG9uZW50KGVsLmNvbXBvbmVudCwgZWwsIHN0YXRlKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBkYXRhID0gZWwucGxhaW4gPyB1bmRlZmluZWQgOiBnZW5EYXRhJDIoZWwsIHN0YXRlKTsKCiAgICAgIHZhciBjaGlsZHJlbiA9IGVsLmlubGluZVRlbXBsYXRlID8gbnVsbCA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSwgdHJ1ZSk7CiAgICAgIGNvZGUgPSAiX2MoJyIgKyAoZWwudGFnKSArICInIiArIChkYXRhID8gKCIsIiArIGRhdGEpIDogJycpICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKSArICIpIjsKICAgIH0KICAgIC8vIG1vZHVsZSB0cmFuc2Zvcm1zCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLnRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKICAgICAgY29kZSA9IHN0YXRlLnRyYW5zZm9ybXNbaV0oZWwsIGNvZGUpOwogICAgfQogICAgcmV0dXJuIGNvZGUKICB9Cn0KCi8vIGhvaXN0IHN0YXRpYyBzdWItdHJlZXMgb3V0CmZ1bmN0aW9uIGdlblN0YXRpYyAoZWwsIHN0YXRlKSB7CiAgZWwuc3RhdGljUHJvY2Vzc2VkID0gdHJ1ZTsKICBzdGF0ZS5zdGF0aWNSZW5kZXJGbnMucHVzaCgoIndpdGgodGhpcyl7cmV0dXJuICIgKyAoZ2VuRWxlbWVudChlbCwgc3RhdGUpKSArICJ9IikpOwogIHJldHVybiAoIl9tKCIgKyAoc3RhdGUuc3RhdGljUmVuZGVyRm5zLmxlbmd0aCAtIDEpICsgKGVsLnN0YXRpY0luRm9yID8gJyx0cnVlJyA6ICcnKSArICIpIikKfQoKLy8gdi1vbmNlCmZ1bmN0aW9uIGdlbk9uY2UgKGVsLCBzdGF0ZSkgewogIGVsLm9uY2VQcm9jZXNzZWQgPSB0cnVlOwogIGlmIChlbC5pZiAmJiAhZWwuaWZQcm9jZXNzZWQpIHsKICAgIHJldHVybiBnZW5JZihlbCwgc3RhdGUpCiAgfSBlbHNlIGlmIChlbC5zdGF0aWNJbkZvcikgewogICAgdmFyIGtleSA9ICcnOwogICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudDsKICAgIHdoaWxlIChwYXJlbnQpIHsKICAgICAgaWYgKHBhcmVudC5mb3IpIHsKICAgICAgICBrZXkgPSBwYXJlbnQua2V5OwogICAgICAgIGJyZWFrCiAgICAgIH0KICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgIH0KICAgIGlmICgha2V5KSB7CiAgICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBzdGF0ZS53YXJuKAogICAgICAgICJ2LW9uY2UgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgdi1mb3IgdGhhdCBpcyBrZXllZC4gIgogICAgICApOwogICAgICByZXR1cm4gZ2VuRWxlbWVudChlbCwgc3RhdGUpCiAgICB9CiAgICByZXR1cm4gKCJfbygiICsgKGdlbkVsZW1lbnQoZWwsIHN0YXRlKSkgKyAiLCIgKyAoc3RhdGUub25jZUlkKyspICsgIiwiICsga2V5ICsgIikiKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ2VuU3RhdGljKGVsLCBzdGF0ZSkKICB9Cn0KCmZ1bmN0aW9uIGdlbklmICgKICBlbCwKICBzdGF0ZSwKICBhbHRHZW4sCiAgYWx0RW1wdHkKKSB7CiAgZWwuaWZQcm9jZXNzZWQgPSB0cnVlOyAvLyBhdm9pZCByZWN1cnNpb24KICByZXR1cm4gZ2VuSWZDb25kaXRpb25zKGVsLmlmQ29uZGl0aW9ucy5zbGljZSgpLCBzdGF0ZSwgYWx0R2VuLCBhbHRFbXB0eSkKfQoKZnVuY3Rpb24gZ2VuSWZDb25kaXRpb25zICgKICBjb25kaXRpb25zLAogIHN0YXRlLAogIGFsdEdlbiwKICBhbHRFbXB0eQopIHsKICBpZiAoIWNvbmRpdGlvbnMubGVuZ3RoKSB7CiAgICByZXR1cm4gYWx0RW1wdHkgfHwgJ19lKCknCiAgfQoKICB2YXIgY29uZGl0aW9uID0gY29uZGl0aW9ucy5zaGlmdCgpOwogIGlmIChjb25kaXRpb24uZXhwKSB7CiAgICByZXR1cm4gKCIoIiArIChjb25kaXRpb24uZXhwKSArICIpPyIgKyAoZ2VuVGVybmFyeUV4cChjb25kaXRpb24uYmxvY2spKSArICI6IiArIChnZW5JZkNvbmRpdGlvbnMoY29uZGl0aW9ucywgc3RhdGUsIGFsdEdlbiwgYWx0RW1wdHkpKSkKICB9IGVsc2UgewogICAgcmV0dXJuICgiIiArIChnZW5UZXJuYXJ5RXhwKGNvbmRpdGlvbi5ibG9jaykpKQogIH0KCiAgLy8gdi1pZiB3aXRoIHYtb25jZSBzaG91bGQgZ2VuZXJhdGUgY29kZSBsaWtlIChhKT9fbSgwKTpfbSgxKQogIGZ1bmN0aW9uIGdlblRlcm5hcnlFeHAgKGVsKSB7CiAgICByZXR1cm4gYWx0R2VuCiAgICAgID8gYWx0R2VuKGVsLCBzdGF0ZSkKICAgICAgOiBlbC5vbmNlCiAgICAgICAgPyBnZW5PbmNlKGVsLCBzdGF0ZSkKICAgICAgICA6IGdlbkVsZW1lbnQoZWwsIHN0YXRlKQogIH0KfQoKZnVuY3Rpb24gZ2VuRm9yICgKICBlbCwKICBzdGF0ZSwKICBhbHRHZW4sCiAgYWx0SGVscGVyCikgewogIHZhciBleHAgPSBlbC5mb3I7CiAgdmFyIGFsaWFzID0gZWwuYWxpYXM7CiAgdmFyIGl0ZXJhdG9yMSA9IGVsLml0ZXJhdG9yMSA/ICgiLCIgKyAoZWwuaXRlcmF0b3IxKSkgOiAnJzsKICB2YXIgaXRlcmF0b3IyID0gZWwuaXRlcmF0b3IyID8gKCIsIiArIChlbC5pdGVyYXRvcjIpKSA6ICcnOwoKICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmCiAgICBzdGF0ZS5tYXliZUNvbXBvbmVudChlbCkgJiYKICAgIGVsLnRhZyAhPT0gJ3Nsb3QnICYmCiAgICBlbC50YWcgIT09ICd0ZW1wbGF0ZScgJiYKICAgICFlbC5rZXkKICApIHsKICAgIHN0YXRlLndhcm4oCiAgICAgICI8IiArIChlbC50YWcpICsgIiB2LWZvcj1cIiIgKyBhbGlhcyArICIgaW4gIiArIGV4cCArICJcIj46IGNvbXBvbmVudCBsaXN0cyByZW5kZXJlZCB3aXRoICIgKwogICAgICAidi1mb3Igc2hvdWxkIGhhdmUgZXhwbGljaXQga2V5cy4gIiArCiAgICAgICJTZWUgaHR0cHM6Ly92dWVqcy5vcmcvZ3VpZGUvbGlzdC5odG1sI2tleSBmb3IgbW9yZSBpbmZvLiIsCiAgICAgIHRydWUgLyogdGlwICovCiAgICApOwogIH0KCiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uCiAgcmV0dXJuIChhbHRIZWxwZXIgfHwgJ19sJykgKyAiKCgiICsgZXhwICsgIiksIiArCiAgICAiZnVuY3Rpb24oIiArIGFsaWFzICsgaXRlcmF0b3IxICsgaXRlcmF0b3IyICsgIil7IiArCiAgICAgICJyZXR1cm4gIiArICgoYWx0R2VuIHx8IGdlbkVsZW1lbnQpKGVsLCBzdGF0ZSkpICsKICAgICd9KScKfQoKZnVuY3Rpb24gZ2VuRGF0YSQyIChlbCwgc3RhdGUpIHsKICB2YXIgZGF0YSA9ICd7JzsKCiAgLy8gZGlyZWN0aXZlcyBmaXJzdC4KICAvLyBkaXJlY3RpdmVzIG1heSBtdXRhdGUgdGhlIGVsJ3Mgb3RoZXIgcHJvcGVydGllcyBiZWZvcmUgdGhleSBhcmUgZ2VuZXJhdGVkLgogIHZhciBkaXJzID0gZ2VuRGlyZWN0aXZlcyhlbCwgc3RhdGUpOwogIGlmIChkaXJzKSB7IGRhdGEgKz0gZGlycyArICcsJzsgfQoKICAvLyBrZXkKICBpZiAoZWwua2V5KSB7CiAgICBkYXRhICs9ICJrZXk6IiArIChlbC5rZXkpICsgIiwiOwogIH0KICAvLyByZWYKICBpZiAoZWwucmVmKSB7CiAgICBkYXRhICs9ICJyZWY6IiArIChlbC5yZWYpICsgIiwiOwogIH0KICBpZiAoZWwucmVmSW5Gb3IpIHsKICAgIGRhdGEgKz0gInJlZkluRm9yOnRydWUsIjsKICB9CiAgLy8gcHJlCiAgaWYgKGVsLnByZSkgewogICAgZGF0YSArPSAicHJlOnRydWUsIjsKICB9CiAgLy8gcmVjb3JkIG9yaWdpbmFsIHRhZyBuYW1lIGZvciBjb21wb25lbnRzIHVzaW5nICJpcyIgYXR0cmlidXRlCiAgaWYgKGVsLmNvbXBvbmVudCkgewogICAgZGF0YSArPSAidGFnOlwiIiArIChlbC50YWcpICsgIlwiLCI7CiAgfQogIC8vIG1vZHVsZSBkYXRhIGdlbmVyYXRpb24gZnVuY3Rpb25zCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZS5kYXRhR2VuRm5zLmxlbmd0aDsgaSsrKSB7CiAgICBkYXRhICs9IHN0YXRlLmRhdGFHZW5GbnNbaV0oZWwpOwogIH0KICAvLyBhdHRyaWJ1dGVzCiAgaWYgKGVsLmF0dHJzKSB7CiAgICBkYXRhICs9ICJhdHRyczp7IiArIChnZW5Qcm9wcyhlbC5hdHRycykpICsgIn0sIjsKICB9CiAgLy8gRE9NIHByb3BzCiAgaWYgKGVsLnByb3BzKSB7CiAgICBkYXRhICs9ICJkb21Qcm9wczp7IiArIChnZW5Qcm9wcyhlbC5wcm9wcykpICsgIn0sIjsKICB9CiAgLy8gZXZlbnQgaGFuZGxlcnMKICBpZiAoZWwuZXZlbnRzKSB7CiAgICBkYXRhICs9IChnZW5IYW5kbGVycyhlbC5ldmVudHMsIGZhbHNlLCBzdGF0ZS53YXJuKSkgKyAiLCI7CiAgfQogIGlmIChlbC5uYXRpdmVFdmVudHMpIHsKICAgIGRhdGEgKz0gKGdlbkhhbmRsZXJzKGVsLm5hdGl2ZUV2ZW50cywgdHJ1ZSwgc3RhdGUud2FybikpICsgIiwiOwogIH0KICAvLyBzbG90IHRhcmdldAogIC8vIG9ubHkgZm9yIG5vbi1zY29wZWQgc2xvdHMKICBpZiAoZWwuc2xvdFRhcmdldCAmJiAhZWwuc2xvdFNjb3BlKSB7CiAgICBkYXRhICs9ICJzbG90OiIgKyAoZWwuc2xvdFRhcmdldCkgKyAiLCI7CiAgfQogIC8vIHNjb3BlZCBzbG90cwogIGlmIChlbC5zY29wZWRTbG90cykgewogICAgZGF0YSArPSAoZ2VuU2NvcGVkU2xvdHMoZWwuc2NvcGVkU2xvdHMsIHN0YXRlKSkgKyAiLCI7CiAgfQogIC8vIGNvbXBvbmVudCB2LW1vZGVsCiAgaWYgKGVsLm1vZGVsKSB7CiAgICBkYXRhICs9ICJtb2RlbDp7dmFsdWU6IiArIChlbC5tb2RlbC52YWx1ZSkgKyAiLGNhbGxiYWNrOiIgKyAoZWwubW9kZWwuY2FsbGJhY2spICsgIixleHByZXNzaW9uOiIgKyAoZWwubW9kZWwuZXhwcmVzc2lvbikgKyAifSwiOwogIH0KICAvLyBpbmxpbmUtdGVtcGxhdGUKICBpZiAoZWwuaW5saW5lVGVtcGxhdGUpIHsKICAgIHZhciBpbmxpbmVUZW1wbGF0ZSA9IGdlbklubGluZVRlbXBsYXRlKGVsLCBzdGF0ZSk7CiAgICBpZiAoaW5saW5lVGVtcGxhdGUpIHsKICAgICAgZGF0YSArPSBpbmxpbmVUZW1wbGF0ZSArICIsIjsKICAgIH0KICB9CiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvLCQvLCAnJykgKyAnfSc7CiAgLy8gdi1iaW5kIGRhdGEgd3JhcAogIGlmIChlbC53cmFwRGF0YSkgewogICAgZGF0YSA9IGVsLndyYXBEYXRhKGRhdGEpOwogIH0KICAvLyB2LW9uIGRhdGEgd3JhcAogIGlmIChlbC53cmFwTGlzdGVuZXJzKSB7CiAgICBkYXRhID0gZWwud3JhcExpc3RlbmVycyhkYXRhKTsKICB9CiAgcmV0dXJuIGRhdGEKfQoKZnVuY3Rpb24gZ2VuRGlyZWN0aXZlcyAoZWwsIHN0YXRlKSB7CiAgdmFyIGRpcnMgPSBlbC5kaXJlY3RpdmVzOwogIGlmICghZGlycykgeyByZXR1cm4gfQogIHZhciByZXMgPSAnZGlyZWN0aXZlczpbJzsKICB2YXIgaGFzUnVudGltZSA9IGZhbHNlOwogIHZhciBpLCBsLCBkaXIsIG5lZWRSdW50aW1lOwogIGZvciAoaSA9IDAsIGwgPSBkaXJzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZGlyID0gZGlyc1tpXTsKICAgIG5lZWRSdW50aW1lID0gdHJ1ZTsKICAgIHZhciBnZW4gPSBzdGF0ZS5kaXJlY3RpdmVzW2Rpci5uYW1lXTsKICAgIGlmIChnZW4pIHsKICAgICAgLy8gY29tcGlsZS10aW1lIGRpcmVjdGl2ZSB0aGF0IG1hbmlwdWxhdGVzIEFTVC4KICAgICAgLy8gcmV0dXJucyB0cnVlIGlmIGl0IGFsc28gbmVlZHMgYSBydW50aW1lIGNvdW50ZXJwYXJ0LgogICAgICBuZWVkUnVudGltZSA9ICEhZ2VuKGVsLCBkaXIsIHN0YXRlLndhcm4pOwogICAgfQogICAgaWYgKG5lZWRSdW50aW1lKSB7CiAgICAgIGhhc1J1bnRpbWUgPSB0cnVlOwogICAgICByZXMgKz0gIntuYW1lOlwiIiArIChkaXIubmFtZSkgKyAiXCIscmF3TmFtZTpcIiIgKyAoZGlyLnJhd05hbWUpICsgIlwiIiArIChkaXIudmFsdWUgPyAoIix2YWx1ZTooIiArIChkaXIudmFsdWUpICsgIiksZXhwcmVzc2lvbjoiICsgKEpTT04uc3RyaW5naWZ5KGRpci52YWx1ZSkpKSA6ICcnKSArIChkaXIuYXJnID8gKCIsYXJnOlwiIiArIChkaXIuYXJnKSArICJcIiIpIDogJycpICsgKGRpci5tb2RpZmllcnMgPyAoIixtb2RpZmllcnM6IiArIChKU09OLnN0cmluZ2lmeShkaXIubW9kaWZpZXJzKSkpIDogJycpICsgIn0sIjsKICAgIH0KICB9CiAgaWYgKGhhc1J1bnRpbWUpIHsKICAgIHJldHVybiByZXMuc2xpY2UoMCwgLTEpICsgJ10nCiAgfQp9CgpmdW5jdGlvbiBnZW5JbmxpbmVUZW1wbGF0ZSAoZWwsIHN0YXRlKSB7CiAgdmFyIGFzdCA9IGVsLmNoaWxkcmVuWzBdOwogIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgKAogICAgZWwuY2hpbGRyZW4ubGVuZ3RoICE9PSAxIHx8IGFzdC50eXBlICE9PSAxCiAgKSkgewogICAgc3RhdGUud2FybignSW5saW5lLXRlbXBsYXRlIGNvbXBvbmVudHMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGNoaWxkIGVsZW1lbnQuJyk7CiAgfQogIGlmIChhc3QudHlwZSA9PT0gMSkgewogICAgdmFyIGlubGluZVJlbmRlckZucyA9IGdlbmVyYXRlKGFzdCwgc3RhdGUub3B0aW9ucyk7CiAgICByZXR1cm4gKCJpbmxpbmVUZW1wbGF0ZTp7cmVuZGVyOmZ1bmN0aW9uKCl7IiArIChpbmxpbmVSZW5kZXJGbnMucmVuZGVyKSArICJ9LHN0YXRpY1JlbmRlckZuczpbIiArIChpbmxpbmVSZW5kZXJGbnMuc3RhdGljUmVuZGVyRm5zLm1hcChmdW5jdGlvbiAoY29kZSkgeyByZXR1cm4gKCJmdW5jdGlvbigpeyIgKyBjb2RlICsgIn0iKTsgfSkuam9pbignLCcpKSArICJdfSIpCiAgfQp9CgpmdW5jdGlvbiBnZW5TY29wZWRTbG90cyAoCiAgc2xvdHMsCiAgc3RhdGUKKSB7CiAgcmV0dXJuICgic2NvcGVkU2xvdHM6X3UoWyIgKyAoT2JqZWN0LmtleXMoc2xvdHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7CiAgICAgIHJldHVybiBnZW5TY29wZWRTbG90KGtleSwgc2xvdHNba2V5XSwgc3RhdGUpCiAgICB9KS5qb2luKCcsJykpICsgIl0pIikKfQoKZnVuY3Rpb24gZ2VuU2NvcGVkU2xvdCAoCiAga2V5LAogIGVsLAogIHN0YXRlCikgewogIGlmIChlbC5mb3IgJiYgIWVsLmZvclByb2Nlc3NlZCkgewogICAgcmV0dXJuIGdlbkZvclNjb3BlZFNsb3Qoa2V5LCBlbCwgc3RhdGUpCiAgfQogIHZhciBmbiA9ICJmdW5jdGlvbigiICsgKFN0cmluZyhlbC5zbG90U2NvcGUpKSArICIpeyIgKwogICAgInJldHVybiAiICsgKGVsLnRhZyA9PT0gJ3RlbXBsYXRlJwogICAgICA/IGVsLmlmCiAgICAgICAgPyAoKGVsLmlmKSArICI/IiArIChnZW5DaGlsZHJlbihlbCwgc3RhdGUpIHx8ICd1bmRlZmluZWQnKSArICI6dW5kZWZpbmVkIikKICAgICAgICA6IGdlbkNoaWxkcmVuKGVsLCBzdGF0ZSkgfHwgJ3VuZGVmaW5lZCcKICAgICAgOiBnZW5FbGVtZW50KGVsLCBzdGF0ZSkpICsgIn0iOwogIHJldHVybiAoIntrZXk6IiArIGtleSArICIsZm46IiArIGZuICsgIn0iKQp9CgpmdW5jdGlvbiBnZW5Gb3JTY29wZWRTbG90ICgKICBrZXksCiAgZWwsCiAgc3RhdGUKKSB7CiAgdmFyIGV4cCA9IGVsLmZvcjsKICB2YXIgYWxpYXMgPSBlbC5hbGlhczsKICB2YXIgaXRlcmF0b3IxID0gZWwuaXRlcmF0b3IxID8gKCIsIiArIChlbC5pdGVyYXRvcjEpKSA6ICcnOwogIHZhciBpdGVyYXRvcjIgPSBlbC5pdGVyYXRvcjIgPyAoIiwiICsgKGVsLml0ZXJhdG9yMikpIDogJyc7CiAgZWwuZm9yUHJvY2Vzc2VkID0gdHJ1ZTsgLy8gYXZvaWQgcmVjdXJzaW9uCiAgcmV0dXJuICJfbCgoIiArIGV4cCArICIpLCIgKwogICAgImZ1bmN0aW9uKCIgKyBhbGlhcyArIGl0ZXJhdG9yMSArIGl0ZXJhdG9yMiArICIpeyIgKwogICAgICAicmV0dXJuICIgKyAoZ2VuU2NvcGVkU2xvdChrZXksIGVsLCBzdGF0ZSkpICsKICAgICd9KScKfQoKZnVuY3Rpb24gZ2VuQ2hpbGRyZW4gKAogIGVsLAogIHN0YXRlLAogIGNoZWNrU2tpcCwKICBhbHRHZW5FbGVtZW50LAogIGFsdEdlbk5vZGUKKSB7CiAgdmFyIGNoaWxkcmVuID0gZWwuY2hpbGRyZW47CiAgaWYgKGNoaWxkcmVuLmxlbmd0aCkgewogICAgdmFyIGVsJDEgPSBjaGlsZHJlblswXTsKICAgIC8vIG9wdGltaXplIHNpbmdsZSB2LWZvcgogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJgogICAgICBlbCQxLmZvciAmJgogICAgICBlbCQxLnRhZyAhPT0gJ3RlbXBsYXRlJyAmJgogICAgICBlbCQxLnRhZyAhPT0gJ3Nsb3QnCiAgICApIHsKICAgICAgcmV0dXJuIChhbHRHZW5FbGVtZW50IHx8IGdlbkVsZW1lbnQpKGVsJDEsIHN0YXRlKQogICAgfQogICAgdmFyIG5vcm1hbGl6YXRpb25UeXBlID0gY2hlY2tTa2lwCiAgICAgID8gZ2V0Tm9ybWFsaXphdGlvblR5cGUoY2hpbGRyZW4sIHN0YXRlLm1heWJlQ29tcG9uZW50KQogICAgICA6IDA7CiAgICB2YXIgZ2VuID0gYWx0R2VuTm9kZSB8fCBnZW5Ob2RlOwogICAgcmV0dXJuICgiWyIgKyAoY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBnZW4oYywgc3RhdGUpOyB9KS5qb2luKCcsJykpICsgIl0iICsgKG5vcm1hbGl6YXRpb25UeXBlID8gKCIsIiArIG5vcm1hbGl6YXRpb25UeXBlKSA6ICcnKSkKICB9Cn0KCi8vIGRldGVybWluZSB0aGUgbm9ybWFsaXphdGlvbiBuZWVkZWQgZm9yIHRoZSBjaGlsZHJlbiBhcnJheS4KLy8gMDogbm8gbm9ybWFsaXphdGlvbiBuZWVkZWQKLy8gMTogc2ltcGxlIG5vcm1hbGl6YXRpb24gbmVlZGVkIChwb3NzaWJsZSAxLWxldmVsIGRlZXAgbmVzdGVkIGFycmF5KQovLyAyOiBmdWxsIG5vcm1hbGl6YXRpb24gbmVlZGVkCmZ1bmN0aW9uIGdldE5vcm1hbGl6YXRpb25UeXBlICgKICBjaGlsZHJlbiwKICBtYXliZUNvbXBvbmVudAopIHsKICB2YXIgcmVzID0gMDsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgZWwgPSBjaGlsZHJlbltpXTsKICAgIGlmIChlbC50eXBlICE9PSAxKSB7CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBpZiAobmVlZHNOb3JtYWxpemF0aW9uKGVsKSB8fAogICAgICAgIChlbC5pZkNvbmRpdGlvbnMgJiYgZWwuaWZDb25kaXRpb25zLnNvbWUoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIG5lZWRzTm9ybWFsaXphdGlvbihjLmJsb2NrKTsgfSkpKSB7CiAgICAgIHJlcyA9IDI7CiAgICAgIGJyZWFrCiAgICB9CiAgICBpZiAobWF5YmVDb21wb25lbnQoZWwpIHx8CiAgICAgICAgKGVsLmlmQ29uZGl0aW9ucyAmJiBlbC5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbiAoYykgeyByZXR1cm4gbWF5YmVDb21wb25lbnQoYy5ibG9jayk7IH0pKSkgewogICAgICByZXMgPSAxOwogICAgfQogIH0KICByZXR1cm4gcmVzCn0KCmZ1bmN0aW9uIG5lZWRzTm9ybWFsaXphdGlvbiAoZWwpIHsKICByZXR1cm4gZWwuZm9yICE9PSB1bmRlZmluZWQgfHwgZWwudGFnID09PSAndGVtcGxhdGUnIHx8IGVsLnRhZyA9PT0gJ3Nsb3QnCn0KCmZ1bmN0aW9uIGdlbk5vZGUgKG5vZGUsIHN0YXRlKSB7CiAgaWYgKG5vZGUudHlwZSA9PT0gMSkgewogICAgcmV0dXJuIGdlbkVsZW1lbnQobm9kZSwgc3RhdGUpCiAgfSBpZiAobm9kZS50eXBlID09PSAzICYmIG5vZGUuaXNDb21tZW50KSB7CiAgICByZXR1cm4gZ2VuQ29tbWVudChub2RlKQogIH0gZWxzZSB7CiAgICByZXR1cm4gZ2VuVGV4dChub2RlKQogIH0KfQoKZnVuY3Rpb24gZ2VuVGV4dCAodGV4dCkgewogIHJldHVybiAoIl92KCIgKyAodGV4dC50eXBlID09PSAyCiAgICA/IHRleHQuZXhwcmVzc2lvbiAvLyBubyBuZWVkIGZvciAoKSBiZWNhdXNlIGFscmVhZHkgd3JhcHBlZCBpbiBfcygpCiAgICA6IHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyhKU09OLnN0cmluZ2lmeSh0ZXh0LnRleHQpKSkgKyAiKSIpCn0KCmZ1bmN0aW9uIGdlbkNvbW1lbnQgKGNvbW1lbnQpIHsKICByZXR1cm4gKCJfZSgiICsgKEpTT04uc3RyaW5naWZ5KGNvbW1lbnQudGV4dCkpICsgIikiKQp9CgpmdW5jdGlvbiBnZW5TbG90IChlbCwgc3RhdGUpIHsKICB2YXIgc2xvdE5hbWUgPSBlbC5zbG90TmFtZSB8fCAnImRlZmF1bHQiJzsKICB2YXIgY2hpbGRyZW4gPSBnZW5DaGlsZHJlbihlbCwgc3RhdGUpOwogIHZhciByZXMgPSAiX3QoIiArIHNsb3ROYW1lICsgKGNoaWxkcmVuID8gKCIsIiArIGNoaWxkcmVuKSA6ICcnKTsKICB2YXIgYXR0cnMgPSBlbC5hdHRycyAmJiAoInsiICsgKGVsLmF0dHJzLm1hcChmdW5jdGlvbiAoYSkgeyByZXR1cm4gKChjYW1lbGl6ZShhLm5hbWUpKSArICI6IiArIChhLnZhbHVlKSk7IH0pLmpvaW4oJywnKSkgKyAifSIpOwogIHZhciBiaW5kJCQxID0gZWwuYXR0cnNNYXBbJ3YtYmluZCddOwogIGlmICgoYXR0cnMgfHwgYmluZCQkMSkgJiYgIWNoaWxkcmVuKSB7CiAgICByZXMgKz0gIixudWxsIjsKICB9CiAgaWYgKGF0dHJzKSB7CiAgICByZXMgKz0gIiwiICsgYXR0cnM7CiAgfQogIGlmIChiaW5kJCQxKSB7CiAgICByZXMgKz0gKGF0dHJzID8gJycgOiAnLG51bGwnKSArICIsIiArIGJpbmQkJDE7CiAgfQogIHJldHVybiByZXMgKyAnKScKfQoKLy8gY29tcG9uZW50TmFtZSBpcyBlbC5jb21wb25lbnQsIHRha2UgaXQgYXMgYXJndW1lbnQgdG8gc2h1biBmbG93J3MgcGVzc2ltaXN0aWMgcmVmaW5lbWVudApmdW5jdGlvbiBnZW5Db21wb25lbnQgKAogIGNvbXBvbmVudE5hbWUsCiAgZWwsCiAgc3RhdGUKKSB7CiAgdmFyIGNoaWxkcmVuID0gZWwuaW5saW5lVGVtcGxhdGUgPyBudWxsIDogZ2VuQ2hpbGRyZW4oZWwsIHN0YXRlLCB0cnVlKTsKICByZXR1cm4gKCJfYygiICsgY29tcG9uZW50TmFtZSArICIsIiArIChnZW5EYXRhJDIoZWwsIHN0YXRlKSkgKyAoY2hpbGRyZW4gPyAoIiwiICsgY2hpbGRyZW4pIDogJycpICsgIikiKQp9CgpmdW5jdGlvbiBnZW5Qcm9wcyAocHJvcHMpIHsKICB2YXIgcmVzID0gJyc7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgdmFyIHByb3AgPSBwcm9wc1tpXTsKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgewogICAgICByZXMgKz0gIlwiIiArIChwcm9wLm5hbWUpICsgIlwiOiIgKyAodHJhbnNmb3JtU3BlY2lhbE5ld2xpbmVzKHByb3AudmFsdWUpKSArICIsIjsKICAgIH0KICB9CiAgcmV0dXJuIHJlcy5zbGljZSgwLCAtMSkKfQoKLy8gIzM4OTUsICM0MjY4CmZ1bmN0aW9uIHRyYW5zZm9ybVNwZWNpYWxOZXdsaW5lcyAodGV4dCkgewogIHJldHVybiB0ZXh0CiAgICAucmVwbGFjZSgvXHUyMDI4L2csICdcXHUyMDI4JykKICAgIC5yZXBsYWNlKC9cdTIwMjkvZywgJ1xcdTIwMjknKQp9CgovKiAgKi8KCi8vIHRoZXNlIGtleXdvcmRzIHNob3VsZCBub3QgYXBwZWFyIGluc2lkZSBleHByZXNzaW9ucywgYnV0IG9wZXJhdG9ycyBsaWtlCi8vIHR5cGVvZiwgaW5zdGFuY2VvZiBhbmQgaW4gYXJlIGFsbG93ZWQKdmFyIHByb2hpYml0ZWRLZXl3b3JkUkUgPSBuZXcgUmVnRXhwKCdcXGInICsgKAogICdkbyxpZixmb3IsbGV0LG5ldyx0cnksdmFyLGNhc2UsZWxzZSx3aXRoLGF3YWl0LGJyZWFrLGNhdGNoLGNsYXNzLGNvbnN0LCcgKwogICdzdXBlcix0aHJvdyx3aGlsZSx5aWVsZCxkZWxldGUsZXhwb3J0LGltcG9ydCxyZXR1cm4sc3dpdGNoLGRlZmF1bHQsJyArCiAgJ2V4dGVuZHMsZmluYWxseSxjb250aW51ZSxkZWJ1Z2dlcixmdW5jdGlvbixhcmd1bWVudHMnCikuc3BsaXQoJywnKS5qb2luKCdcXGJ8XFxiJykgKyAnXFxiJyk7CgovLyB0aGVzZSB1bmFyeSBvcGVyYXRvcnMgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIHByb3BlcnR5L21ldGhvZCBuYW1lcwp2YXIgdW5hcnlPcGVyYXRvcnNSRSA9IG5ldyBSZWdFeHAoJ1xcYicgKyAoCiAgJ2RlbGV0ZSx0eXBlb2Ysdm9pZCcKKS5zcGxpdCgnLCcpLmpvaW4oJ1xccypcXChbXlxcKV0qXFwpfFxcYicpICsgJ1xccypcXChbXlxcKV0qXFwpJyk7CgovLyBzdHJpcCBzdHJpbmdzIGluIGV4cHJlc3Npb25zCnZhciBzdHJpcFN0cmluZ1JFID0gLycoPzpbXidcXF18XFwuKSonfCIoPzpbXiJcXF18XFwuKSoifGAoPzpbXmBcXF18XFwuKSpcJFx7fFx9KD86W15gXFxdfFxcLikqYHxgKD86W15gXFxdfFxcLikqYC9nOwoKLy8gZGV0ZWN0IHByb2JsZW1hdGljIGV4cHJlc3Npb25zIGluIGEgdGVtcGxhdGUKZnVuY3Rpb24gZGV0ZWN0RXJyb3JzIChhc3QpIHsKICB2YXIgZXJyb3JzID0gW107CiAgaWYgKGFzdCkgewogICAgY2hlY2tOb2RlKGFzdCwgZXJyb3JzKTsKICB9CiAgcmV0dXJuIGVycm9ycwp9CgpmdW5jdGlvbiBjaGVja05vZGUgKG5vZGUsIGVycm9ycykgewogIGlmIChub2RlLnR5cGUgPT09IDEpIHsKICAgIGZvciAodmFyIG5hbWUgaW4gbm9kZS5hdHRyc01hcCkgewogICAgICBpZiAoZGlyUkUudGVzdChuYW1lKSkgewogICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuYXR0cnNNYXBbbmFtZV07CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICBpZiAobmFtZSA9PT0gJ3YtZm9yJykgewogICAgICAgICAgICBjaGVja0Zvcihub2RlLCAoInYtZm9yPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7CiAgICAgICAgICB9IGVsc2UgaWYgKG9uUkUudGVzdChuYW1lKSkgewogICAgICAgICAgICBjaGVja0V2ZW50KHZhbHVlLCAobmFtZSArICI9XCIiICsgdmFsdWUgKyAiXCIiKSwgZXJyb3JzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoZWNrRXhwcmVzc2lvbih2YWx1ZSwgKG5hbWUgKyAiPVwiIiArIHZhbHVlICsgIlwiIiksIGVycm9ycyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBjaGVja05vZGUobm9kZS5jaGlsZHJlbltpXSwgZXJyb3JzKTsKICAgICAgfQogICAgfQogIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAyKSB7CiAgICBjaGVja0V4cHJlc3Npb24obm9kZS5leHByZXNzaW9uLCBub2RlLnRleHQsIGVycm9ycyk7CiAgfQp9CgpmdW5jdGlvbiBjaGVja0V2ZW50IChleHAsIHRleHQsIGVycm9ycykgewogIHZhciBzdGlwcGVkID0gZXhwLnJlcGxhY2Uoc3RyaXBTdHJpbmdSRSwgJycpOwogIHZhciBrZXl3b3JkTWF0Y2ggPSBzdGlwcGVkLm1hdGNoKHVuYXJ5T3BlcmF0b3JzUkUpOwogIGlmIChrZXl3b3JkTWF0Y2ggJiYgc3RpcHBlZC5jaGFyQXQoa2V5d29yZE1hdGNoLmluZGV4IC0gMSkgIT09ICckJykgewogICAgZXJyb3JzLnB1c2goCiAgICAgICJhdm9pZCB1c2luZyBKYXZhU2NyaXB0IHVuYXJ5IG9wZXJhdG9yIGFzIHByb3BlcnR5IG5hbWU6ICIgKwogICAgICAiXCIiICsgKGtleXdvcmRNYXRjaFswXSkgKyAiXCIgaW4gZXhwcmVzc2lvbiAiICsgKHRleHQudHJpbSgpKQogICAgKTsKICB9CiAgY2hlY2tFeHByZXNzaW9uKGV4cCwgdGV4dCwgZXJyb3JzKTsKfQoKZnVuY3Rpb24gY2hlY2tGb3IgKG5vZGUsIHRleHQsIGVycm9ycykgewogIGNoZWNrRXhwcmVzc2lvbihub2RlLmZvciB8fCAnJywgdGV4dCwgZXJyb3JzKTsKICBjaGVja0lkZW50aWZpZXIobm9kZS5hbGlhcywgJ3YtZm9yIGFsaWFzJywgdGV4dCwgZXJyb3JzKTsKICBjaGVja0lkZW50aWZpZXIobm9kZS5pdGVyYXRvcjEsICd2LWZvciBpdGVyYXRvcicsIHRleHQsIGVycm9ycyk7CiAgY2hlY2tJZGVudGlmaWVyKG5vZGUuaXRlcmF0b3IyLCAndi1mb3IgaXRlcmF0b3InLCB0ZXh0LCBlcnJvcnMpOwp9CgpmdW5jdGlvbiBjaGVja0lkZW50aWZpZXIgKAogIGlkZW50LAogIHR5cGUsCiAgdGV4dCwKICBlcnJvcnMKKSB7CiAgaWYgKHR5cGVvZiBpZGVudCA9PT0gJ3N0cmluZycpIHsKICAgIHRyeSB7CiAgICAgIG5ldyBGdW5jdGlvbigoInZhciAiICsgaWRlbnQgKyAiPV8iKSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGVycm9ycy5wdXNoKCgiaW52YWxpZCAiICsgdHlwZSArICIgXCIiICsgaWRlbnQgKyAiXCIgaW4gZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkpKTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGNoZWNrRXhwcmVzc2lvbiAoZXhwLCB0ZXh0LCBlcnJvcnMpIHsKICB0cnkgewogICAgbmV3IEZ1bmN0aW9uKCgicmV0dXJuICIgKyBleHApKTsKICB9IGNhdGNoIChlKSB7CiAgICB2YXIga2V5d29yZE1hdGNoID0gZXhwLnJlcGxhY2Uoc3RyaXBTdHJpbmdSRSwgJycpLm1hdGNoKHByb2hpYml0ZWRLZXl3b3JkUkUpOwogICAgaWYgKGtleXdvcmRNYXRjaCkgewogICAgICBlcnJvcnMucHVzaCgKICAgICAgICAiYXZvaWQgdXNpbmcgSmF2YVNjcmlwdCBrZXl3b3JkIGFzIHByb3BlcnR5IG5hbWU6ICIgKwogICAgICAgICJcIiIgKyAoa2V5d29yZE1hdGNoWzBdKSArICJcIlxuICBSYXcgZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIGVycm9ycy5wdXNoKAogICAgICAgICJpbnZhbGlkIGV4cHJlc3Npb246ICIgKyAoZS5tZXNzYWdlKSArICIgaW5cblxuIiArCiAgICAgICAgIiAgICAiICsgZXhwICsgIlxuXG4iICsKICAgICAgICAiICBSYXcgZXhwcmVzc2lvbjogIiArICh0ZXh0LnRyaW0oKSkgKyAiXG4iCiAgICAgICk7CiAgICB9CiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uIChjb2RlLCBlcnJvcnMpIHsKICB0cnkgewogICAgcmV0dXJuIG5ldyBGdW5jdGlvbihjb2RlKQogIH0gY2F0Y2ggKGVycikgewogICAgZXJyb3JzLnB1c2goeyBlcnI6IGVyciwgY29kZTogY29kZSB9KTsKICAgIHJldHVybiBub29wCiAgfQp9CgpmdW5jdGlvbiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuIChjb21waWxlKSB7CiAgdmFyIGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgcmV0dXJuIGZ1bmN0aW9uIGNvbXBpbGVUb0Z1bmN0aW9ucyAoCiAgICB0ZW1wbGF0ZSwKICAgIG9wdGlvbnMsCiAgICB2bQogICkgewogICAgb3B0aW9ucyA9IGV4dGVuZCh7fSwgb3B0aW9ucyk7CiAgICB2YXIgd2FybiQkMSA9IG9wdGlvbnMud2FybiB8fCB3YXJuOwogICAgZGVsZXRlIG9wdGlvbnMud2FybjsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIHsKICAgICAgLy8gZGV0ZWN0IHBvc3NpYmxlIENTUCByZXN0cmljdGlvbgogICAgICB0cnkgewogICAgICAgIG5ldyBGdW5jdGlvbigncmV0dXJuIDEnKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlLnRvU3RyaW5nKCkubWF0Y2goL3Vuc2FmZS1ldmFsfENTUC8pKSB7CiAgICAgICAgICB3YXJuJCQxKAogICAgICAgICAgICAnSXQgc2VlbXMgeW91IGFyZSB1c2luZyB0aGUgc3RhbmRhbG9uZSBidWlsZCBvZiBWdWUuanMgaW4gYW4gJyArCiAgICAgICAgICAgICdlbnZpcm9ubWVudCB3aXRoIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IHRoYXQgcHJvaGliaXRzIHVuc2FmZS1ldmFsLiAnICsKICAgICAgICAgICAgJ1RoZSB0ZW1wbGF0ZSBjb21waWxlciBjYW5ub3Qgd29yayBpbiB0aGlzIGVudmlyb25tZW50LiBDb25zaWRlciAnICsKICAgICAgICAgICAgJ3JlbGF4aW5nIHRoZSBwb2xpY3kgdG8gYWxsb3cgdW5zYWZlLWV2YWwgb3IgcHJlLWNvbXBpbGluZyB5b3VyICcgKwogICAgICAgICAgICAndGVtcGxhdGVzIGludG8gcmVuZGVyIGZ1bmN0aW9ucy4nCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIGNoZWNrIGNhY2hlCiAgICB2YXIga2V5ID0gb3B0aW9ucy5kZWxpbWl0ZXJzCiAgICAgID8gU3RyaW5nKG9wdGlvbnMuZGVsaW1pdGVycykgKyB0ZW1wbGF0ZQogICAgICA6IHRlbXBsYXRlOwogICAgaWYgKGNhY2hlW2tleV0pIHsKICAgICAgcmV0dXJuIGNhY2hlW2tleV0KICAgIH0KCiAgICAvLyBjb21waWxlCiAgICB2YXIgY29tcGlsZWQgPSBjb21waWxlKHRlbXBsYXRlLCBvcHRpb25zKTsKCiAgICAvLyBjaGVjayBjb21waWxhdGlvbiBlcnJvcnMvdGlwcwogICAgewogICAgICBpZiAoY29tcGlsZWQuZXJyb3JzICYmIGNvbXBpbGVkLmVycm9ycy5sZW5ndGgpIHsKICAgICAgICB3YXJuJCQxKAogICAgICAgICAgIkVycm9yIGNvbXBpbGluZyB0ZW1wbGF0ZTpcblxuIiArIHRlbXBsYXRlICsgIlxuXG4iICsKICAgICAgICAgIGNvbXBpbGVkLmVycm9ycy5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuICgiLSAiICsgZSk7IH0pLmpvaW4oJ1xuJykgKyAnXG4nLAogICAgICAgICAgdm0KICAgICAgICApOwogICAgICB9CiAgICAgIGlmIChjb21waWxlZC50aXBzICYmIGNvbXBpbGVkLnRpcHMubGVuZ3RoKSB7CiAgICAgICAgY29tcGlsZWQudGlwcy5mb3JFYWNoKGZ1bmN0aW9uIChtc2cpIHsgcmV0dXJuIHRpcChtc2csIHZtKTsgfSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyB0dXJuIGNvZGUgaW50byBmdW5jdGlvbnMKICAgIHZhciByZXMgPSB7fTsKICAgIHZhciBmbkdlbkVycm9ycyA9IFtdOwogICAgcmVzLnJlbmRlciA9IGNyZWF0ZUZ1bmN0aW9uKGNvbXBpbGVkLnJlbmRlciwgZm5HZW5FcnJvcnMpOwogICAgcmVzLnN0YXRpY1JlbmRlckZucyA9IGNvbXBpbGVkLnN0YXRpY1JlbmRlckZucy5tYXAoZnVuY3Rpb24gKGNvZGUpIHsKICAgICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uKGNvZGUsIGZuR2VuRXJyb3JzKQogICAgfSk7CgogICAgLy8gY2hlY2sgZnVuY3Rpb24gZ2VuZXJhdGlvbiBlcnJvcnMuCiAgICAvLyB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGUgY29tcGlsZXIgaXRzZWxmLgogICAgLy8gbW9zdGx5IGZvciBjb2RlZ2VuIGRldmVsb3BtZW50IHVzZQogICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgICB7CiAgICAgIGlmICgoIWNvbXBpbGVkLmVycm9ycyB8fCAhY29tcGlsZWQuZXJyb3JzLmxlbmd0aCkgJiYgZm5HZW5FcnJvcnMubGVuZ3RoKSB7CiAgICAgICAgd2FybiQkMSgKICAgICAgICAgICJGYWlsZWQgdG8gZ2VuZXJhdGUgcmVuZGVyIGZ1bmN0aW9uOlxuXG4iICsKICAgICAgICAgIGZuR2VuRXJyb3JzLm1hcChmdW5jdGlvbiAocmVmKSB7CiAgICAgICAgICAgIHZhciBlcnIgPSByZWYuZXJyOwogICAgICAgICAgICB2YXIgY29kZSA9IHJlZi5jb2RlOwoKICAgICAgICAgICAgcmV0dXJuICgoZXJyLnRvU3RyaW5nKCkpICsgIiBpblxuXG4iICsgY29kZSArICJcbiIpOwogICAgICAgIH0pLmpvaW4oJ1xuJyksCiAgICAgICAgICB2bQogICAgICAgICk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKGNhY2hlW2tleV0gPSByZXMpCiAgfQp9CgovKiAgKi8KCmZ1bmN0aW9uIGNyZWF0ZUNvbXBpbGVyQ3JlYXRvciAoYmFzZUNvbXBpbGUpIHsKICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlQ29tcGlsZXIgKGJhc2VPcHRpb25zKSB7CiAgICBmdW5jdGlvbiBjb21waWxlICgKICAgICAgdGVtcGxhdGUsCiAgICAgIG9wdGlvbnMKICAgICkgewogICAgICB2YXIgZmluYWxPcHRpb25zID0gT2JqZWN0LmNyZWF0ZShiYXNlT3B0aW9ucyk7CiAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgdmFyIHRpcHMgPSBbXTsKICAgICAgZmluYWxPcHRpb25zLndhcm4gPSBmdW5jdGlvbiAobXNnLCB0aXApIHsKICAgICAgICAodGlwID8gdGlwcyA6IGVycm9ycykucHVzaChtc2cpOwogICAgICB9OwoKICAgICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICAvLyBtZXJnZSBjdXN0b20gbW9kdWxlcwogICAgICAgIGlmIChvcHRpb25zLm1vZHVsZXMpIHsKICAgICAgICAgIGZpbmFsT3B0aW9ucy5tb2R1bGVzID0KICAgICAgICAgICAgKGJhc2VPcHRpb25zLm1vZHVsZXMgfHwgW10pLmNvbmNhdChvcHRpb25zLm1vZHVsZXMpOwogICAgICAgIH0KICAgICAgICAvLyBtZXJnZSBjdXN0b20gZGlyZWN0aXZlcwogICAgICAgIGlmIChvcHRpb25zLmRpcmVjdGl2ZXMpIHsKICAgICAgICAgIGZpbmFsT3B0aW9ucy5kaXJlY3RpdmVzID0gZXh0ZW5kKAogICAgICAgICAgICBPYmplY3QuY3JlYXRlKGJhc2VPcHRpb25zLmRpcmVjdGl2ZXMgfHwgbnVsbCksCiAgICAgICAgICAgIG9wdGlvbnMuZGlyZWN0aXZlcwogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgLy8gY29weSBvdGhlciBvcHRpb25zCiAgICAgICAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMpIHsKICAgICAgICAgIGlmIChrZXkgIT09ICdtb2R1bGVzJyAmJiBrZXkgIT09ICdkaXJlY3RpdmVzJykgewogICAgICAgICAgICBmaW5hbE9wdGlvbnNba2V5XSA9IG9wdGlvbnNba2V5XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBjb21waWxlZCA9IGJhc2VDb21waWxlKHRlbXBsYXRlLCBmaW5hbE9wdGlvbnMpOwogICAgICB7CiAgICAgICAgZXJyb3JzLnB1c2guYXBwbHkoZXJyb3JzLCBkZXRlY3RFcnJvcnMoY29tcGlsZWQuYXN0KSk7CiAgICAgIH0KICAgICAgY29tcGlsZWQuZXJyb3JzID0gZXJyb3JzOwogICAgICBjb21waWxlZC50aXBzID0gdGlwczsKICAgICAgcmV0dXJuIGNvbXBpbGVkCiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgY29tcGlsZTogY29tcGlsZSwKICAgICAgY29tcGlsZVRvRnVuY3Rpb25zOiBjcmVhdGVDb21waWxlVG9GdW5jdGlvbkZuKGNvbXBpbGUpCiAgICB9CiAgfQp9CgovKiAgKi8KCi8vIGBjcmVhdGVDb21waWxlckNyZWF0b3JgIGFsbG93cyBjcmVhdGluZyBjb21waWxlcnMgdGhhdCB1c2UgYWx0ZXJuYXRpdmUKLy8gcGFyc2VyL29wdGltaXplci9jb2RlZ2VuLCBlLmcgdGhlIFNTUiBvcHRpbWl6aW5nIGNvbXBpbGVyLgovLyBIZXJlIHdlIGp1c3QgZXhwb3J0IGEgZGVmYXVsdCBjb21waWxlciB1c2luZyB0aGUgZGVmYXVsdCBwYXJ0cy4KdmFyIGNyZWF0ZUNvbXBpbGVyID0gY3JlYXRlQ29tcGlsZXJDcmVhdG9yKGZ1bmN0aW9uIGJhc2VDb21waWxlICgKICB0ZW1wbGF0ZSwKICBvcHRpb25zCikgewogIHZhciBhc3QgPSBwYXJzZSh0ZW1wbGF0ZS50cmltKCksIG9wdGlvbnMpOwogIGlmIChvcHRpb25zLm9wdGltaXplICE9PSBmYWxzZSkgewogICAgb3B0aW1pemUoYXN0LCBvcHRpb25zKTsKICB9CiAgdmFyIGNvZGUgPSBnZW5lcmF0ZShhc3QsIG9wdGlvbnMpOwogIHJldHVybiB7CiAgICBhc3Q6IGFzdCwKICAgIHJlbmRlcjogY29kZS5yZW5kZXIsCiAgICBzdGF0aWNSZW5kZXJGbnM6IGNvZGUuc3RhdGljUmVuZGVyRm5zCiAgfQp9KTsKCi8qICAqLwoKdmFyIHJlZiQxID0gY3JlYXRlQ29tcGlsZXIoYmFzZU9wdGlvbnMpOwp2YXIgY29tcGlsZVRvRnVuY3Rpb25zID0gcmVmJDEuY29tcGlsZVRvRnVuY3Rpb25zOwoKLyogICovCgovLyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgYnJvd3NlciBlbmNvZGVzIGEgY2hhciBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcwp2YXIgZGl2OwpmdW5jdGlvbiBnZXRTaG91bGREZWNvZGUgKGhyZWYpIHsKICBkaXYgPSBkaXYgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgZGl2LmlubmVySFRNTCA9IGhyZWYgPyAiPGEgaHJlZj1cIlxuXCIvPiIgOiAiPGRpdiBhPVwiXG5cIi8+IjsKICByZXR1cm4gZGl2LmlubmVySFRNTC5pbmRleE9mKCcmIzEwOycpID4gMAp9CgovLyAjMzY2MzogSUUgZW5jb2RlcyBuZXdsaW5lcyBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcyB3aGlsZSBvdGhlciBicm93c2VycyBkb24ndAp2YXIgc2hvdWxkRGVjb2RlTmV3bGluZXMgPSBpbkJyb3dzZXIgPyBnZXRTaG91bGREZWNvZGUoZmFsc2UpIDogZmFsc2U7Ci8vICM2ODI4OiBjaHJvbWUgZW5jb2RlcyBjb250ZW50IGluIGFbaHJlZl0KdmFyIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZiA9IGluQnJvd3NlciA/IGdldFNob3VsZERlY29kZSh0cnVlKSA6IGZhbHNlOwoKLyogICovCgp2YXIgaWRUb1RlbXBsYXRlID0gY2FjaGVkKGZ1bmN0aW9uIChpZCkgewogIHZhciBlbCA9IHF1ZXJ5KGlkKTsKICByZXR1cm4gZWwgJiYgZWwuaW5uZXJIVE1MCn0pOwoKdmFyIG1vdW50ID0gVnVlLnByb3RvdHlwZS4kbW91bnQ7ClZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24gKAogIGVsLAogIGh5ZHJhdGluZwopIHsKICBlbCA9IGVsICYmIHF1ZXJ5KGVsKTsKCiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovCiAgaWYgKGVsID09PSBkb2N1bWVudC5ib2R5IHx8IGVsID09PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHsKICAgICJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKAogICAgICAiRG8gbm90IG1vdW50IFZ1ZSB0byA8aHRtbD4gb3IgPGJvZHk+IC0gbW91bnQgdG8gbm9ybWFsIGVsZW1lbnRzIGluc3RlYWQuIgogICAgKTsKICAgIHJldHVybiB0aGlzCiAgfQoKICB2YXIgb3B0aW9ucyA9IHRoaXMuJG9wdGlvbnM7CiAgLy8gcmVzb2x2ZSB0ZW1wbGF0ZS9lbCBhbmQgY29udmVydCB0byByZW5kZXIgZnVuY3Rpb24KICBpZiAoIW9wdGlvbnMucmVuZGVyKSB7CiAgICB2YXIgdGVtcGxhdGUgPSBvcHRpb25zLnRlbXBsYXRlOwogICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgaWYgKHRlbXBsYXRlLmNoYXJBdCgwKSA9PT0gJyMnKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IGlkVG9UZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgICAgIGlmICgiZGV2ZWxvcG1lbnQiICE9PSAncHJvZHVjdGlvbicgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIHdhcm4oCiAgICAgICAgICAgICAgKCJUZW1wbGF0ZSBlbGVtZW50IG5vdCBmb3VuZCBvciBpcyBlbXB0eTogIiArIChvcHRpb25zLnRlbXBsYXRlKSksCiAgICAgICAgICAgICAgdGhpcwogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZS5ub2RlVHlwZSkgewogICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUuaW5uZXJIVE1MOwogICAgICB9IGVsc2UgewogICAgICAgIHsKICAgICAgICAgIHdhcm4oJ2ludmFsaWQgdGVtcGxhdGUgb3B0aW9uOicgKyB0ZW1wbGF0ZSwgdGhpcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZWwpIHsKICAgICAgdGVtcGxhdGUgPSBnZXRPdXRlckhUTUwoZWwpOwogICAgfQogICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqLwogICAgICBpZiAoImRldmVsb3BtZW50IiAhPT0gJ3Byb2R1Y3Rpb24nICYmIGNvbmZpZy5wZXJmb3JtYW5jZSAmJiBtYXJrKSB7CiAgICAgICAgbWFyaygnY29tcGlsZScpOwogICAgICB9CgogICAgICB2YXIgcmVmID0gY29tcGlsZVRvRnVuY3Rpb25zKHRlbXBsYXRlLCB7CiAgICAgICAgc2hvdWxkRGVjb2RlTmV3bGluZXM6IHNob3VsZERlY29kZU5ld2xpbmVzLAogICAgICAgIHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjogc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmLAogICAgICAgIGRlbGltaXRlcnM6IG9wdGlvbnMuZGVsaW1pdGVycywKICAgICAgICBjb21tZW50czogb3B0aW9ucy5jb21tZW50cwogICAgICB9LCB0aGlzKTsKICAgICAgdmFyIHJlbmRlciA9IHJlZi5yZW5kZXI7CiAgICAgIHZhciBzdGF0aWNSZW5kZXJGbnMgPSByZWYuc3RhdGljUmVuZGVyRm5zOwogICAgICBvcHRpb25zLnJlbmRlciA9IHJlbmRlcjsKICAgICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnM7CgogICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgICAgaWYgKCJkZXZlbG9wbWVudCIgIT09ICdwcm9kdWN0aW9uJyAmJiBjb25maWcucGVyZm9ybWFuY2UgJiYgbWFyaykgewogICAgICAgIG1hcmsoJ2NvbXBpbGUgZW5kJyk7CiAgICAgICAgbWVhc3VyZSgoInZ1ZSAiICsgKHRoaXMuX25hbWUpICsgIiBjb21waWxlIiksICdjb21waWxlJywgJ2NvbXBpbGUgZW5kJyk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIG1vdW50LmNhbGwodGhpcywgZWwsIGh5ZHJhdGluZykKfTsKCi8qKgogKiBHZXQgb3V0ZXJIVE1MIG9mIGVsZW1lbnRzLCB0YWtpbmcgY2FyZQogKiBvZiBTVkcgZWxlbWVudHMgaW4gSUUgYXMgd2VsbC4KICovCmZ1bmN0aW9uIGdldE91dGVySFRNTCAoZWwpIHsKICBpZiAoZWwub3V0ZXJIVE1MKSB7CiAgICByZXR1cm4gZWwub3V0ZXJIVE1MCiAgfSBlbHNlIHsKICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbC5jbG9uZU5vZGUodHJ1ZSkpOwogICAgcmV0dXJuIGNvbnRhaW5lci5pbm5lckhUTUwKICB9Cn0KClZ1ZS5jb21waWxlID0gY29tcGlsZVRvRnVuY3Rpb25zOwoKcmV0dXJuIFZ1ZTsKCn0pKSk7Cg==" >
			</script>

<!--		<script type="text/javascript" src="/jquery-3.3.1.js" > -->
		<script type="text/javascript" src="data:/text/plain;base64,LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuMy4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WgogKi8KKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkgewoKCSJ1c2Ugc3RyaWN0IjsKCglpZiAoIHR5cGVvZiBtb2R1bGUgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2AKCQkvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LgoJCS8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgCgkJLy8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuCgkJLy8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC4KCQkvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKCJqcXVlcnkiKSh3aW5kb3cpOwoJCS8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uCgkJbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgPwoJCQlmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6CgkJCWZ1bmN0aW9uKCB3ICkgewoJCQkJaWYgKCAhdy5kb2N1bWVudCApIHsKCQkJCQl0aHJvdyBuZXcgRXJyb3IoICJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50IiApOwoJCQkJfQoJCQkJcmV0dXJuIGZhY3RvcnkoIHcgKTsKCQkJfTsKCX0gZWxzZSB7CgkJZmFjdG9yeSggZ2xvYmFsICk7Cgl9CgovLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldAp9ICkoIHR5cGVvZiB3aW5kb3cgIT09ICJ1bmRlZmluZWQiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7CgovLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjEKLy8gdGhyb3cgZXhjZXB0aW9ucyB3aGVuIG5vbi1zdHJpY3QgY29kZSAoZS5nLiwgQVNQLk5FVCA0LjUpIGFjY2Vzc2VzIHN0cmljdCBtb2RlCi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uCi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLgoidXNlIHN0cmljdCI7Cgp2YXIgYXJyID0gW107Cgp2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7Cgp2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7Cgp2YXIgc2xpY2UgPSBhcnIuc2xpY2U7Cgp2YXIgY29uY2F0ID0gYXJyLmNvbmNhdDsKCnZhciBwdXNoID0gYXJyLnB1c2g7Cgp2YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mOwoKdmFyIGNsYXNzMnR5cGUgPSB7fTsKCnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7Cgp2YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTsKCnZhciBmblRvU3RyaW5nID0gaGFzT3duLnRvU3RyaW5nOwoKdmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTsKCnZhciBzdXBwb3J0ID0ge307Cgp2YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24oIG9iaiApIHsKCiAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTIKICAgICAgLy8gSW4gc29tZSBicm93c2VycywgdHlwZW9mIHJldHVybnMgImZ1bmN0aW9uIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50cwogICAgICAvLyAoaS5lLiwgYHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib2JqZWN0IiApID09PSAiZnVuY3Rpb24iYCkuCiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi4KICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gIm51bWJlciI7CiAgfTsKCgp2YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkgewoJCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7Cgl9OwoKCgoKCXZhciBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzID0gewoJCXR5cGU6IHRydWUsCgkJc3JjOiB0cnVlLAoJCW5vTW9kdWxlOiB0cnVlCgl9OwoKCWZ1bmN0aW9uIERPTUV2YWwoIGNvZGUsIGRvYywgbm9kZSApIHsKCQlkb2MgPSBkb2MgfHwgZG9jdW1lbnQ7CgoJCXZhciBpLAoJCQlzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggInNjcmlwdCIgKTsKCgkJc2NyaXB0LnRleHQgPSBjb2RlOwoJCWlmICggbm9kZSApIHsKCQkJZm9yICggaSBpbiBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzICkgewoJCQkJaWYgKCBub2RlWyBpIF0gKSB7CgkJCQkJc2NyaXB0WyBpIF0gPSBub2RlWyBpIF07CgkJCQl9CgkJCX0KCQl9CgkJZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJfQoKCmZ1bmN0aW9uIHRvVHlwZSggb2JqICkgewoJaWYgKCBvYmogPT0gbnVsbCApIHsKCQlyZXR1cm4gb2JqICsgIiI7Cgl9CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5IChmdW5jdGlvbmlzaCBSZWdFeHApCglyZXR1cm4gdHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIG9iaiA9PT0gImZ1bmN0aW9uIiA/CgkJY2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCAib2JqZWN0IiA6CgkJdHlwZW9mIG9iajsKfQovKiBnbG9iYWwgU3ltYm9sICovCi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5lc2xpbnRyYy5qc29uIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsCi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBkZWZpbmUgZ2xvYmFsIG9ubHkgZm9yIHRoaXMgbW9kdWxlCgoKCnZhcgoJdmVyc2lvbiA9ICIzLjMuMSIsCgoJLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKCWpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCgkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCgkJLy8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZCkKCQlyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApOwoJfSwKCgkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHkKCS8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUAoJcnRyaW0gPSAvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7CgpqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0gewoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogdmVyc2lvbiwKCgljb25zdHJ1Y3RvcjogalF1ZXJ5LAoKCS8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMAoJbGVuZ3RoOiAwLAoKCXRvQXJyYXk6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CglnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7CgoJCS8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXkKCQlpZiAoIG51bSA9PSBudWxsICkgewoJCQlyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApOwoJCX0KCgkJLy8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldAoJCXJldHVybiBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdOwoJfSwKCgkvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrCgkvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldCkKCXB1c2hTdGFjazogZnVuY3Rpb24oIGVsZW1zICkgewoKCQkvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldAoJCXZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTsKCgkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKCQlyZXQucHJldk9iamVjdCA9IHRoaXM7CgoJCS8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0CgkJcmV0dXJuIHJldDsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCggdGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJfSApICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQl2YXIgbGVuID0gdGhpcy5sZW5ndGgsCgkJCWogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApOwoJfSwKCgllbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcigpOwoJfSwKCgkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCgkvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC4KCXB1c2g6IHB1c2gsCglzb3J0OiBhcnIuc29ydCwKCXNwbGljZTogYXJyLnNwbGljZQp9OwoKalF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHsKCXZhciBvcHRpb25zLCBuYW1lLCBzcmMsIGNvcHksIGNvcHlJc0FycmF5LCBjbG9uZSwKCQl0YXJnZXQgPSBhcmd1bWVudHNbIDAgXSB8fCB7fSwKCQlpID0gMSwKCQlsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAoJCWRlZXAgPSBmYWxzZTsKCgkvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0aW9uCglpZiAoIHR5cGVvZiB0YXJnZXQgPT09ICJib29sZWFuIiApIHsKCQlkZWVwID0gdGFyZ2V0OwoKCQkvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0CgkJdGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307CgkJaSsrOwoJfQoKCS8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQoJaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGkgPT09IGxlbmd0aCApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCWktLTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCgkJLy8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlcwoJCWlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkgewoKCQkJLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAoJCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCQlzcmMgPSB0YXJnZXRbIG5hbWUgXTsKCQkJCWNvcHkgPSBvcHRpb25zWyBuYW1lIF07CgoJCQkJLy8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcAoJCQkJaWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJLy8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzCgkJCQlpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHwKCQkJCQkoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHsKCgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgQXJyYXkuaXNBcnJheSggc3JjICkgPyBzcmMgOiBbXTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHNyYyApID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKCWV4cGFuZG86ICJqUXVlcnkiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cRC9nLCAiIiApLAoKCS8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlCglpc1JlYWR5OiB0cnVlLAoKCWVycm9yOiBmdW5jdGlvbiggbXNnICkgewoJCXRocm93IG5ldyBFcnJvciggbXNnICk7Cgl9LAoKCW5vb3A6IGZ1bmN0aW9uKCkge30sCgoJaXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCQl2YXIgcHJvdG8sIEN0b3I7CgoJCS8vIERldGVjdCBvYnZpb3VzIG5lZ2F0aXZlcwoJCS8vIFVzZSB0b1N0cmluZyBpbnN0ZWFkIG9mIGpRdWVyeS50eXBlIHRvIGNhdGNoIGhvc3Qgb2JqZWN0cwoJCWlmICggIW9iaiB8fCB0b1N0cmluZy5jYWxsKCBvYmogKSAhPT0gIltvYmplY3QgT2JqZWN0XSIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXByb3RvID0gZ2V0UHJvdG8oIG9iaiApOwoKCQkvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluCgkJaWYgKCAhcHJvdG8gKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJLy8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb24KCQlDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCAiY29uc3RydWN0b3IiICkgJiYgcHJvdG8uY29uc3RydWN0b3I7CgkJcmV0dXJuIHR5cGVvZiBDdG9yID09PSAiZnVuY3Rpb24iICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZzsKCX0sCgoJaXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCgkJLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KCQkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvaXNzdWVzLzYxMjUKCQl2YXIgbmFtZTsKCgkJZm9yICggbmFtZSBpbiBvYmogKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9LAoKCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CglnbG9iYWxFdmFsOiBmdW5jdGlvbiggY29kZSApIHsKCQlET01FdmFsKCBjb2RlICk7Cgl9LAoKCWVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkgewoJCXZhciBsZW5ndGgsIGkgPSAwOwoKCQlpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHsKCQkJbGVuZ3RoID0gb2JqLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWZvciAoIGkgaW4gb2JqICkgewoJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBvYmo7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seQoJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CgkJcmV0dXJuIHRleHQgPT0gbnVsbCA/CgkJCSIiIDoKCQkJKCB0ZXh0ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKCX0sCgoJLy8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQoJbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyLCByZXN1bHRzICkgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOwoKCQlpZiAoIGFyciAhPSBudWxsICkgewoJCQlpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7CgkJCQlqUXVlcnkubWVyZ2UoIHJldCwKCQkJCQl0eXBlb2YgYXJyID09PSAic3RyaW5nIiA/CgkJCQkJWyBhcnIgXSA6IGFycgoJCQkJKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guY2FsbCggcmV0LCBhcnIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJaW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHsKCQlyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7Cgl9LAoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seQoJLy8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdAoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCXZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCwKCQkJaiA9IDAsCgkJCWkgPSBmaXJzdC5sZW5ndGg7CgoJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQl9CgoJCWZpcnN0Lmxlbmd0aCA9IGk7CgoJCXJldHVybiBmaXJzdDsKCX0sCgoJZ3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkgewoJCXZhciBjYWxsYmFja0ludmVyc2UsCgkJCW1hdGNoZXMgPSBbXSwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKCQkJY2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0OwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCgkJLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJY2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgkJCWlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHsKCQkJCW1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gbWF0Y2hlczsKCX0sCgoJLy8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHsKCQl2YXIgbGVuZ3RoLCB2YWx1ZSwKCQkJaSA9IDAsCgkJCXJldCA9IFtdOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlcwoJCWlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7CgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTsKCgkJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CgkJCQkJcmV0LnB1c2goIHZhbHVlICk7CgkJCQl9CgkJCX0KCgkJLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKCQl9IGVsc2UgewoJCQlmb3IgKCBpIGluIGVsZW1zICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldC5wdXNoKCB2YWx1ZSApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzCgkJcmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKCWd1aWQ6IDEsCgoJLy8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyCgkvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LgoJc3VwcG9ydDogc3VwcG9ydAp9ICk7CgppZiAoIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgKSB7CglqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTsKfQoKLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCmpRdWVyeS5lYWNoKCAiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCAiICIgKSwKZnVuY3Rpb24oIGksIG5hbWUgKSB7CgljbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwp9ICk7CgpmdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkgewoKCS8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcikKCS8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSkKCS8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlcwoJLy8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRQoJdmFyIGxlbmd0aCA9ICEhb2JqICYmICJsZW5ndGgiIGluIG9iaiAmJiBvYmoubGVuZ3RoLAoJCXR5cGUgPSB0b1R5cGUoIG9iaiApOwoKCWlmICggaXNGdW5jdGlvbiggb2JqICkgfHwgaXNXaW5kb3coIG9iaiApICkgewoJCXJldHVybiBmYWxzZTsKCX0KCglyZXR1cm4gdHlwZSA9PT0gImFycmF5IiB8fCBsZW5ndGggPT09IDAgfHwKCQl0eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajsKfQp2YXIgU2l6emxlID0KLyohCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuMwogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogRGF0ZTogMjAxNi0wOC0wOAogKi8KKGZ1bmN0aW9uKCB3aW5kb3cgKSB7Cgp2YXIgaSwKCXN1cHBvcnQsCglFeHByLAoJZ2V0VGV4dCwKCWlzWE1MLAoJdG9rZW5pemUsCgljb21waWxlLAoJc2VsZWN0LAoJb3V0ZXJtb3N0Q29udGV4dCwKCXNvcnRJbnB1dCwKCWhhc0R1cGxpY2F0ZSwKCgkvLyBMb2NhbCBkb2N1bWVudCB2YXJzCglzZXREb2N1bWVudCwKCWRvY3VtZW50LAoJZG9jRWxlbSwKCWRvY3VtZW50SXNIVE1MLAoJcmJ1Z2d5UVNBLAoJcmJ1Z2d5TWF0Y2hlcywKCW1hdGNoZXMsCgljb250YWlucywKCgkvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhCglleHBhbmRvID0gInNpenpsZSIgKyAxICogbmV3IERhdGUoKSwKCXByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCwKCWRpcnJ1bnMgPSAwLAoJZG9uZSA9IDAsCgljbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSwKCXRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAoJY29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJfQoJCXJldHVybiAwOwoJfSwKCgkvLyBJbnN0YW5jZSBtZXRob2RzCgloYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LAoJYXJyID0gW10sCglwb3AgPSBhcnIucG9wLAoJcHVzaF9uYXRpdmUgPSBhcnIucHVzaCwKCXB1c2ggPSBhcnIucHVzaCwKCXNsaWNlID0gYXJyLnNsaWNlLAoJLy8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlCgkvLyBodHRwczovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81CglpbmRleE9mID0gZnVuY3Rpb24oIGxpc3QsIGVsZW0gKSB7CgkJdmFyIGkgPSAwLAoJCQlsZW4gPSBsaXN0Lmxlbmd0aDsKCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQkJaWYgKCBsaXN0W2ldID09PSBlbGVtICkgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQl9CgkJcmV0dXJuIC0xOwoJfSwKCglib29sZWFucyA9ICJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsCgoJLy8gUmVndWxhciBleHByZXNzaW9ucwoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlCgl3aGl0ZXNwYWNlID0gIltcXHgyMFxcdFxcclxcblxcZl0iLAoKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllcgoJaWRlbnRpZmllciA9ICIoPzpcXFxcLnxbXFx3LV18W15cMC1cXHhhMF0pKyIsCgoJLy8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCglhdHRyaWJ1dGVzID0gIlxcWyIgKyB3aGl0ZXNwYWNlICsgIiooIiArIGlkZW50aWZpZXIgKyAiKSg/OiIgKyB3aGl0ZXNwYWNlICsKCQkvLyBPcGVyYXRvciAoY2FwdHVyZSAyKQoJCSIqKFsqXiR8IX5dPz0pIiArIHdoaXRlc3BhY2UgKwoJCS8vICJBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgQ1NTIGlkZW50aWZpZXJzIFtjYXB0dXJlIDVdIG9yIHN0cmluZ3MgW2NhcHR1cmUgMyBvciBjYXB0dXJlIDRdIgoJCSIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIgKyBpZGVudGlmaWVyICsgIikpfCkiICsgd2hpdGVzcGFjZSArCgkJIipcXF0iLAoKCXBzZXVkb3MgPSAiOigiICsgaWRlbnRpZmllciArICIpKD86XFwoKCIgKwoJCS8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6CgkJLy8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpCgkJIignKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8IiArCgkJLy8gMi4gc2ltcGxlIChjYXB0dXJlIDYpCgkJIigoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIgKyBhdHRyaWJ1dGVzICsgIikqKXwiICsKCQkvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpCgkJIi4qIiArCgkJIilcXCl8KSIsCgoJLy8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlcgoJcndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgIisiLCAiZyIgKSwKCXJ0cmltID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiICsgd2hpdGVzcGFjZSArICIrJCIsICJnIiApLAoKCXJjb21tYSA9IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKiwiICsgd2hpdGVzcGFjZSArICIqIiApLAoJcmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggIl4iICsgd2hpdGVzcGFjZSArICIqKFs+K35dfCIgKyB3aGl0ZXNwYWNlICsgIikiICsgd2hpdGVzcGFjZSArICIqIiApLAoKCXJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCAiPSIgKyB3aGl0ZXNwYWNlICsgIiooW15cXF0nXCJdKj8pIiArIHdoaXRlc3BhY2UgKyAiKlxcXSIsICJnIiApLAoKCXJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksCglyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoICJeIiArIGlkZW50aWZpZXIgKyAiJCIgKSwKCgltYXRjaEV4cHIgPSB7CgkJIklEIjogbmV3IFJlZ0V4cCggIl4jKCIgKyBpZGVudGlmaWVyICsgIikiICksCgkJIkNMQVNTIjogbmV3IFJlZ0V4cCggIl5cXC4oIiArIGlkZW50aWZpZXIgKyAiKSIgKSwKCQkiVEFHIjogbmV3IFJlZ0V4cCggIl4oIiArIGlkZW50aWZpZXIgKyAifFsqXSkiICksCgkJIkFUVFIiOiBuZXcgUmVnRXhwKCAiXiIgKyBhdHRyaWJ1dGVzICksCgkJIlBTRVVETyI6IG5ldyBSZWdFeHAoICJeIiArIHBzZXVkb3MgKSwKCQkiQ0hJTEQiOiBuZXcgUmVnRXhwKCAiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIiArIHdoaXRlc3BhY2UgKwoJCQkiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKwoJCQkiKihcXGQrKXwpKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSIsICJpIiApLAoJCSJib29sIjogbmV3IFJlZ0V4cCggIl4oPzoiICsgYm9vbGVhbnMgKyAiKSQiLCAiaSIgKSwKCQkvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKCkKCQkvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgCgkJIm5lZWRzQ29udGV4dCI6IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIiArCgkJCXdoaXRlc3BhY2UgKyAiKigoPzotXFxkKT9cXGQqKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSg/PVteLV18JCkiLCAiaSIgKQoJfSwKCglyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJoZWFkZXIgPSAvXmhcZCQvaSwKCglybmF0aXZlID0gL15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLAoKCS8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9ycwoJcnF1aWNrRXhwciA9IC9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sCgoJcnNpYmxpbmcgPSAvWyt+XS8sCgoJLy8gQ1NTIGVzY2FwZXMKCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnMKCXJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoICJcXFxcKFtcXGRhLWZdezEsNn0iICsgd2hpdGVzcGFjZSArICI/fCgiICsgd2hpdGVzcGFjZSArICIpfC4pIiwgImlnIiApLAoJZnVuZXNjYXBlID0gZnVuY3Rpb24oIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkgewoJCXZhciBoaWdoID0gIjB4IiArIGVzY2FwZWQgLSAweDEwMDAwOwoJCS8vIE5hTiBtZWFucyBub24tY29kZXBvaW50CgkJLy8gU3VwcG9ydDogRmlyZWZveDwyNAoJCS8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgKyIweCIKCQlyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/CgkJCWVzY2FwZWQgOgoJCQloaWdoIDwgMCA/CgkJCQkvLyBCTVAgY29kZXBvaW50CgkJCQlTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDoKCQkJCS8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKQoJCQkJU3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7Cgl9LAoKCS8vIENTUyBzdHJpbmcvaWRlbnRpZmllciBzZXJpYWxpemF0aW9uCgkvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2NvbW1vbi1zZXJpYWxpemluZy1pZGlvbXMKCXJjc3Nlc2NhcGUgPSAvKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZywKCWZjc3Nlc2NhcGUgPSBmdW5jdGlvbiggY2gsIGFzQ29kZVBvaW50ICkgewoJCWlmICggYXNDb2RlUG9pbnQgKSB7CgoJCQkvLyBVKzAwMDAgTlVMTCBiZWNvbWVzIFUrRkZGRCBSRVBMQUNFTUVOVCBDSEFSQUNURVIKCQkJaWYgKCBjaCA9PT0gIlwwIiApIHsKCQkJCXJldHVybiAiXHVGRkZEIjsKCQkJfQoKCQkJLy8gQ29udHJvbCBjaGFyYWN0ZXJzIGFuZCAoZGVwZW5kZW50IHVwb24gcG9zaXRpb24pIG51bWJlcnMgZ2V0IGVzY2FwZWQgYXMgY29kZSBwb2ludHMKCQkJcmV0dXJuIGNoLnNsaWNlKCAwLCAtMSApICsgIlxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArICIgIjsKCQl9CgoJCS8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWQKCQlyZXR1cm4gIlxcIiArIGNoOwoJfSwKCgkvLyBVc2VkIGZvciBpZnJhbWVzCgkvLyBTZWUgc2V0RG9jdW1lbnQoKQoJLy8gUmVtb3ZpbmcgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgY2F1c2VzIGEgIlBlcm1pc3Npb24gRGVuaWVkIgoJLy8gZXJyb3IgaW4gSUUKCXVubG9hZEhhbmRsZXIgPSBmdW5jdGlvbigpIHsKCQlzZXREb2N1bWVudCgpOwoJfSwKCglkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcigKCQlmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWUgJiYgKCJmb3JtIiBpbiBlbGVtIHx8ICJsYWJlbCIgaW4gZWxlbSk7CgkJfSwKCQl7IGRpcjogInBhcmVudE5vZGUiLCBuZXh0OiAibGVnZW5kIiB9CgkpOwoKLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0ICkKdHJ5IHsKCXB1c2guYXBwbHkoCgkJKGFyciA9IHNsaWNlLmNhbGwoIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzICkpLAoJCXByZWZlcnJlZERvYy5jaGlsZE5vZGVzCgkpOwoJLy8gU3VwcG9ydDogQW5kcm9pZDw0LjAKCS8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHkKCWFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7Cn0gY2F0Y2ggKCBlICkgewoJcHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggPwoKCQkvLyBMZXZlcmFnZSBzbGljZSBpZiBwb3NzaWJsZQoJCWZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHsKCQkJcHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7CgkJfSA6CgoJCS8vIFN1cHBvcnQ6IElFPDkKCQkvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5CgkJZnVuY3Rpb24oIHRhcmdldCwgZWxzICkgewoJCQl2YXIgaiA9IHRhcmdldC5sZW5ndGgsCgkJCQlpID0gMDsKCQkJLy8gQ2FuJ3QgdHJ1c3QgTm9kZUxpc3QubGVuZ3RoCgkJCXdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge30KCQkJdGFyZ2V0Lmxlbmd0aCA9IGogLSAxOwoJCX0KCX07Cn0KCmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7Cgl2YXIgbSwgaSwgZWxlbSwgbmlkLCBtYXRjaCwgZ3JvdXBzLCBuZXdTZWxlY3RvciwKCQluZXdDb250ZXh0ID0gY29udGV4dCAmJiBjb250ZXh0Lm93bmVyRG9jdW1lbnQsCgoJCS8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnQKCQlub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTsKCglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKCgkvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dAoJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciIHx8ICFzZWxlY3RvciB8fAoJCW5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHsKCgkJcmV0dXJuIHJlc3VsdHM7Cgl9CgoJLy8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50cwoJaWYgKCAhc2VlZCApIHsKCgkJaWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHsKCQkJc2V0RG9jdW1lbnQoIGNvbnRleHQgKTsKCQl9CgkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJCWlmICggZG9jdW1lbnRJc0hUTUwgKSB7CgoJCQkvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgImdldCpCeSoiIERPTSBtZXRob2QKCQkJLy8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KQoJCQlpZiAoIG5vZGVUeXBlICE9PSAxMSAmJiAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkgewoKCQkJCS8vIElEIHNlbGVjdG9yCgkJCQlpZiAoIChtID0gbWF0Y2hbMV0pICkgewoKCQkJCQkvLyBEb2N1bWVudCBjb250ZXh0CgkJCQkJaWYgKCBub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJaWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJCS8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zCgkJCQkJCQkvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCQlpZiAoIGVsZW0uaWQgPT09IG0gKSB7CgkJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCQl9CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQkJfQoKCQkJCQkvLyBFbGVtZW50IGNvbnRleHQKCQkJCQl9IGVsc2UgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXQKCQkJCQkJLy8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnMKCQkJCQkJLy8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRAoJCQkJCQlpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmCgkJCQkJCQljb250YWlucyggY29udGV4dCwgZWxlbSApICYmCgkJCQkJCQllbGVtLmlkID09PSBtICkgewoKCQkJCQkJCXJlc3VsdHMucHVzaCggZWxlbSApOwoJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCX0KCQkJCQl9CgoJCQkJLy8gVHlwZSBzZWxlY3RvcgoJCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7CgkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApOwoJCQkJCXJldHVybiByZXN1bHRzOwoKCQkJCS8vIENsYXNzIHNlbGVjdG9yCgkJCQl9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYKCQkJCQljb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7CgoJCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7CgkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQl9CgkJCX0KCgkJCS8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGwKCQkJaWYgKCBzdXBwb3J0LnFzYSAmJgoJCQkJIWNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF0gJiYKCQkJCSghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7CgoJCQkJaWYgKCBub2RlVHlwZSAhPT0gMSApIHsKCQkJCQluZXdDb250ZXh0ID0gY29udGV4dDsKCQkJCQluZXdTZWxlY3RvciA9IHNlbGVjdG9yOwoKCQkJCS8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudAoJCQkJLy8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWUKCQkJCS8vIFN1cHBvcnQ6IElFIDw9OAoJCQkJLy8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHMKCQkJCX0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CgoJCQkJCS8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5CgkJCQkJaWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoICJpZCIgKSkgKSB7CgkJCQkJCW5pZCA9IG5pZC5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJY29udGV4dC5zZXRBdHRyaWJ1dGUoICJpZCIsIChuaWQgPSBleHBhbmRvKSApOwoJCQkJCX0KCgkJCQkJLy8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0CgkJCQkJZ3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7CgkJCQkJaSA9IGdyb3Vwcy5sZW5ndGg7CgkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCWdyb3Vwc1tpXSA9ICIjIiArIG5pZCArICIgIiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApOwoJCQkJCX0KCQkJCQluZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCAiLCIgKTsKCgkJCQkJLy8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzCgkJCQkJbmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8CgkJCQkJCWNvbnRleHQ7CgkJCQl9CgoJCQkJaWYgKCBuZXdTZWxlY3RvciApIHsKCQkJCQl0cnkgewoJCQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLAoJCQkJCQkJbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApCgkJCQkJCSk7CgkJCQkJCXJldHVybiByZXN1bHRzOwoJCQkJCX0gY2F0Y2ggKCBxc2FFcnJvciApIHsKCQkJCQl9IGZpbmFsbHkgewoJCQkJCQlpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHsKCQkJCQkJCWNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gQWxsIG90aGVycwoJcmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApOwp9CgovKioKICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplCiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGgKICoJcHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aCkKICoJZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeQogKi8KZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7Cgl2YXIga2V5cyA9IFtdOwoKCWZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkgewoJCS8vIFVzZSAoa2V5ICsgIiAiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KQoJCWlmICgga2V5cy5wdXNoKCBrZXkgKyAiICIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7CgkJCS8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllcwoJCQlkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdOwoJCX0KCQlyZXR1cm4gKGNhY2hlWyBrZXkgKyAiICIgXSA9IHZhbHVlKTsKCX0KCXJldHVybiBjYWNoZTsKfQoKLyoqCiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrCiAqLwpmdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkgewoJZm5bIGV4cGFuZG8gXSA9IHRydWU7CglyZXR1cm4gZm47Cn0KCi8qKgogKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudAogKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0CiAqLwpmdW5jdGlvbiBhc3NlcnQoIGZuICkgewoJdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTsKCgl0cnkgewoJCXJldHVybiAhIWZuKCBlbCApOwoJfSBjYXRjaCAoZSkgewoJCXJldHVybiBmYWxzZTsKCX0gZmluYWxseSB7CgkJLy8gUmVtb3ZlIGZyb20gaXRzIHBhcmVudCBieSBkZWZhdWx0CgkJaWYgKCBlbC5wYXJlbnROb2RlICkgewoJCQllbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbCApOwoJCX0KCQkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJCWVsID0gbnVsbDsKCX0KfQoKLyoqCiAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnMKICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlcwogKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWQKICovCmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7Cgl2YXIgYXJyID0gYXR0cnMuc3BsaXQoInwiKSwKCQlpID0gYXJyLmxlbmd0aDsKCgl3aGlsZSAoIGktLSApIHsKCQlFeHByLmF0dHJIYW5kbGVbIGFycltpXSBdID0gaGFuZGxlcjsKCX0KfQoKLyoqCiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3MKICogQHBhcmFtIHtFbGVtZW50fSBhCiAqIEBwYXJhbSB7RWxlbWVudH0gYgogKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGIKICovCmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHsKCXZhciBjdXIgPSBiICYmIGEsCgkJZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiYKCQkJYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7CgoJLy8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzCglpZiAoIGRpZmYgKSB7CgkJcmV0dXJuIGRpZmY7Cgl9CgoJLy8gQ2hlY2sgaWYgYiBmb2xsb3dzIGEKCWlmICggY3VyICkgewoJCXdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7CgkJCWlmICggY3VyID09PSBiICkgewoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQoJfQoKCXJldHVybiBhID8gMSA6IC0xOwp9CgovKioKICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7CglyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJcmV0dXJuIG5hbWUgPT09ICJpbnB1dCIgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9ucwogKiBAcGFyYW0ge1N0cmluZ30gdHlwZQogKi8KZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkgewoJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCXJldHVybiAobmFtZSA9PT0gImlucHV0IiB8fCBuYW1lID09PSAiYnV0dG9uIikgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLyoqCiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkCiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWQKICovCmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHsKCgkvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGUKCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWQKCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkCgkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWQKCQlpZiAoICJmb3JtIiBpbiBlbGVtICkgewoKCQkJLy8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOgoJCQkvLyAqIGxpc3RlZCBmb3JtLWFzc29jaWF0ZWQgZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBmaWVsZHNldAoJCQkvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkCgkJCS8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkCgkJCS8vICogb3B0aW9uIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXAKCQkJLy8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkCgkJCS8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSAiZm9ybSIgcHJvcGVydHkuCgkJCWlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkgewoKCQkJCS8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50CgkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbSApIHsKCQkJCQlpZiAoICJsYWJlbCIgaW4gZWxlbS5wYXJlbnROb2RlICkgewoJCQkJCQlyZXR1cm4gZWxlbS5wYXJlbnROb2RlLmRpc2FibGVkID09PSBkaXNhYmxlZDsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFN1cHBvcnQ6IElFIDYgLSAxMQoJCQkJLy8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnMKCQkJCXJldHVybiBlbGVtLmlzRGlzYWJsZWQgPT09IGRpc2FibGVkIHx8CgoJCQkJCS8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5CgkJCQkJLyoganNoaW50IC1XMDE4ICovCgkJCQkJZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiYKCQkJCQkJZGlzYWJsZWRBbmNlc3RvciggZWxlbSApID09PSBkaXNhYmxlZDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkOwoKCQkvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuCgkJLy8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0CgkJLy8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuCgkJfSBlbHNlIGlmICggImxhYmVsIiBpbiBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7CgkJfQoKCQkvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZAoJCXJldHVybiBmYWxzZTsKCX07Cn0KCi8qKgogKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzCiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuCiAqLwpmdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHsKCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkgewoJCWFyZ3VtZW50ID0gK2FyZ3VtZW50OwoJCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7CgkJCXZhciBqLAoJCQkJbWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSwKCQkJCWkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOwoKCQkJLy8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzCgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHsKCQkJCQlzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7CgkJCQl9CgkJCX0KCQl9KTsKCX0pOwp9CgovKioKICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dAogKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0PX0gY29udGV4dAogKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWUKICovCmZ1bmN0aW9uIHRlc3RDb250ZXh0KCBjb250ZXh0ICkgewoJcmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICYmIGNvbnRleHQ7Cn0KCi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlCnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9OwoKLyoqCiAqIERldGVjdHMgWE1MIG5vZGVzCiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IGVsZW0gQW4gZWxlbWVudCBvciBhIGRvY3VtZW50CiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGUKICovCmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykKCXZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50OwoJcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIDogZmFsc2U7Cn07CgovKioKICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50CiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50CiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnQKICovCnNldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7Cgl2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LAoJCWRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYzsKCgkvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZAoJaWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHsKCQlyZXR1cm4gZG9jdW1lbnQ7Cgl9CgoJLy8gVXBkYXRlIGdsb2JhbCB2YXJpYWJsZXMKCWRvY3VtZW50ID0gZG9jOwoJZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCWRvY3VtZW50SXNIVE1MID0gIWlzWE1MKCBkb2N1bWVudCApOwoKCS8vIFN1cHBvcnQ6IElFIDktMTEsIEVkZ2UKCS8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgInBlcm1pc3Npb24gZGVuaWVkIiBlcnJvcnMgKGpRdWVyeSAjMTM5MzYpCglpZiAoIHByZWZlcnJlZERvYyAhPT0gZG9jdW1lbnQgJiYKCQkoc3ViV2luZG93ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcpICYmIHN1YldpbmRvdy50b3AgIT09IHN1YldpbmRvdyApIHsKCgkJLy8gU3VwcG9ydDogSUUgMTEsIEVkZ2UKCQlpZiAoIHN1YldpbmRvdy5hZGRFdmVudExpc3RlbmVyICkgewoJCQlzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggInVubG9hZCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5CgkJfSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkgewoJCQlzdWJXaW5kb3cuYXR0YWNoRXZlbnQoICJvbnVubG9hZCIsIHVubG9hZEhhbmRsZXIgKTsKCQl9Cgl9CgoJLyogQXR0cmlidXRlcwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFN1cHBvcnQ6IElFPDgKCS8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllcwoJLy8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpCglzdXBwb3J0LmF0dHJpYnV0ZXMgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmNsYXNzTmFtZSA9ICJpIjsKCQlyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIik7Cgl9KTsKCgkvKiBnZXRFbGVtZW50KHMpQnkqCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSByZXR1cm5zIG9ubHkgZWxlbWVudHMKCXN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJCWVsLmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOwoJCXJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg7Cgl9KTsKCgkvLyBTdXBwb3J0OiBJRTw5CglzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTsKCgkvLyBTdXBwb3J0OiBJRTwxMAoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lCgkvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtbWF0aWNhbGx5LXNldCBuYW1lcywKCS8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdAoJc3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlkID0gZXhwYW5kbzsKCQlyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDsKCX0pOwoKCS8vIElEIGZpbHRlciBhbmQgZmluZAoJaWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7CgkJRXhwci5maWx0ZXJbIklEIl0gPSBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikgPT09IGF0dHJJZDsKCQkJfTsKCQl9OwoJCUV4cHIuZmluZFsiSUQiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCQl2YXIgZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7CgkJCQlyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107CgkJCX0KCQl9OwoJfSBlbHNlIHsKCQlFeHByLmZpbHRlclsiSUQiXSA9ICBmdW5jdGlvbiggaWQgKSB7CgkJCXZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmCgkJCQkJZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpOwoJCQkJcmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkOwoJCQl9OwoJCX07CgoJCS8vIFN1cHBvcnQ6IElFIDYgLSA3IG9ubHkKCQkvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0CgkJRXhwci5maW5kWyJJRCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkgewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudElzSFRNTCApIHsKCQkJCXZhciBub2RlLCBpLCBlbGVtcywKCQkJCQllbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsKCgkJCQlpZiAoIGVsZW0gKSB7CgoJCQkJCS8vIFZlcmlmeSB0aGUgaWQgYXR0cmlidXRlCgkJCQkJbm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKCQkJCQlpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7CgkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQl9CgoJCQkJCS8vIEZhbGwgYmFjayBvbiBnZXRFbGVtZW50c0J5TmFtZQoJCQkJCWVsZW1zID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggaWQgKTsKCQkJCQlpID0gMDsKCQkJCQl3aGlsZSAoIChlbGVtID0gZWxlbXNbaSsrXSkgKSB7CgkJCQkJCW5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7CgkJCQkJCWlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHsKCQkJCQkJCXJldHVybiBbIGVsZW0gXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gW107CgkJCX0KCQl9OwoJfQoKCS8vIFRhZwoJRXhwci5maW5kWyJUQUciXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPwoJCWZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROCgkJCX0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkgewoJCQkJcmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7CgkJCX0KCQl9IDoKCgkJZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHsKCQkJdmFyIGVsZW0sCgkJCQl0bXAgPSBbXSwKCQkJCWkgPSAwLAoJCQkJLy8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvbwoJCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIHRhZyA9PT0gIioiICkgewoJCQkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdG1wOwoJCQl9CgkJCXJldHVybiByZXN1bHRzOwoJCX07CgoJLy8gQ2xhc3MKCUV4cHIuZmluZFsiQ0xBU1MiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkgewoJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApOwoJCX0KCX07CgoJLyogUVNBL21hdGNoZXNTZWxlY3RvcgoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnQKCgkvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KQoJcmJ1Z2d5TWF0Y2hlcyA9IFtdOwoKCS8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpCgkvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3IKCS8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWUKCS8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yCgkvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4CglyYnVnZ3lRU0EgPSBbXTsKCglpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApKSApIHsKCQkvLyBCdWlsZCBRU0EgcmVnZXgKCQkvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pCgkJYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCQkJLy8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZQoJCQkvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90IGV4cGxpY2l0bHkKCQkJLy8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsCgkJCS8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoCgkJCS8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM1OQoJCQlkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlubmVySFRNTCA9ICI8YSBpZD0nIiArIGV4cGFuZG8gKyAiJz48L2E+IiArCgkJCQkiPHNlbGVjdCBpZD0nIiArIGV4cGFuZG8gKyAiLVxyXFwnIG1zYWxsb3djYXB0dXJlPScnPiIgKwoJCQkJIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IjsKCgkJCS8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTYKCQkJLy8gTm90aGluZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBvciAqPQoJCQkvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCAic2FmZSIgZm9yIFdpblJUCgkJCS8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvbgoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJbKl4kXT0iICsgd2hpdGVzcGFjZSArICIqKD86Jyd8XCJcIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IElFOAoJCQkvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kICJ2YWx1ZSIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseQoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJcXFsiICsgd2hpdGVzcGFjZSArICIqKD86dmFsdWV8IiArIGJvb2xlYW5zICsgIikiICk7CgkJCX0KCgkJCS8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjQsIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS44KwoJCQlpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCAiW2lkfj0iICsgZXhwYW5kbyArICItXSIgKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgifj0iKTsKCQkJfQoKCQkJLy8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHMKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWQKCQkJLy8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHMKCQkJaWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGggKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCgiOmNoZWNrZWQiKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCsKCQkJLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MQoJCQkvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzCgkJCWlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoICJhIyIgKyBleHBhbmRvICsgIisqIiApLmxlbmd0aCApIHsKCQkJCXJidWdneVFTQS5wdXNoKCIuIy4rWyt+XSIpOwoJCQl9CgkJfSk7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCWVsLmlubmVySFRNTCA9ICI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPiIgKwoJCQkJIjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iOwoKCQkJLy8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzCgkJCS8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudAoJCQl2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwoJCQlpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgImhpZGRlbiIgKTsKCQkJZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCAibmFtZSIsICJEIiApOwoKCQkJLy8gU3VwcG9ydDogSUU4CgkJCS8vIEVuZm9yY2UgY2FzZS1zZW5zaXRpdml0eSBvZiBuYW1lIGF0dHJpYnV0ZQoJCQlpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJuYW1lIiArIHdoaXRlc3BhY2UgKyAiKlsqXiR8IX5dPz0iICk7CgkJCX0KCgkJCS8vIEZGIDMuNSAtIDplbmFibGVkLzpkaXNhYmxlZCBhbmQgaGlkZGVuIGVsZW1lbnRzIChoaWRkZW4gZWxlbWVudHMgYXJlIHN0aWxsIGVuYWJsZWQpCgkJCS8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzCgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGggIT09IDIgKSB7CgkJCQlyYnVnZ3lRU0EucHVzaCggIjplbmFibGVkIiwgIjpkaXNhYmxlZCIgKTsKCQkJfQoKCQkJLy8gU3VwcG9ydDogSUU5LTExKwoJCQkvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHMKCQkJZG9jRWxlbS5hcHBlbmRDaGlsZCggZWwgKS5kaXNhYmxlZCA9IHRydWU7CgkJCWlmICggZWwucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoICE9PSAyICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiICk7CgkJCX0KCgkJCS8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zCgkJCWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKTsKCQkJcmJ1Z2d5UVNBLnB1c2goIiwuKjoiKTsKCQl9KTsKCX0KCglpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHwKCQlkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fAoJCWRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8CgkJZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7CgoJCWFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgoJCQkvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KQoJCQlzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBlbCwgIioiICk7CgoJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCgkJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKCQkJbWF0Y2hlcy5jYWxsKCBlbCwgIltzIT0nJ106eCIgKTsKCQkJcmJ1Z2d5TWF0Y2hlcy5wdXNoKCAiIT0iLCBwc2V1ZG9zICk7CgkJfSk7Cgl9CgoJcmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbigifCIpICk7CglyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKCJ8IikgKTsKCgkvKiBDb250YWlucwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJaGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApOwoKCS8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlcgoJLy8gUHVycG9zZWZ1bGx5IHNlbGYtZXhjbHVzaXZlCgkvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZgoJY29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID8KCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJdmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSwKCQkJCWJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOwoJCQlyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmICgKCQkJCWFkb3duLmNvbnRhaW5zID8KCQkJCQlhZG93bi5jb250YWlucyggYnVwICkgOgoJCQkJCWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNgoJCQkpKTsKCQl9IDoKCQlmdW5jdGlvbiggYSwgYiApIHsKCQkJaWYgKCBiICkgewoJCQkJd2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7CgkJCQkJaWYgKCBiID09PSBhICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX07CgoJLyogU29ydGluZwoJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCS8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmcKCXNvcnRPcmRlciA9IGhhc0NvbXBhcmUgPwoJZnVuY3Rpb24oIGEsIGIgKSB7CgoJCS8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCS8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb24KCQl2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247CgkJaWYgKCBjb21wYXJlICkgewoJCQlyZXR1cm4gY29tcGFyZTsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnQKCQljb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgPwoJCQlhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOgoKCQkJLy8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkCgkJCTE7CgoJCS8vIERpc2Nvbm5lY3RlZCBub2RlcwoJCWlmICggY29tcGFyZSAmIDEgfHwKCQkJKCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkgewoKCQkJLy8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50CgkJCWlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQlpZiAoIGIgPT09IGRvY3VtZW50IHx8IGIub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYikgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJLy8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXIKCQkJcmV0dXJuIHNvcnRJbnB1dCA/CgkJCQkoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6CgkJCQkwOwoJCX0KCgkJcmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxOwoJfSA6CglmdW5jdGlvbiggYSwgYiApIHsKCQkvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsCgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCXZhciBjdXIsCgkJCWkgPSAwLAoJCQlhdXAgPSBhLnBhcmVudE5vZGUsCgkJCWJ1cCA9IGIucGFyZW50Tm9kZSwKCQkJYXAgPSBbIGEgXSwKCQkJYnAgPSBbIGIgXTsKCgkJLy8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWQKCQlpZiAoICFhdXAgfHwgIWJ1cCApIHsKCQkJcmV0dXJuIGEgPT09IGRvY3VtZW50ID8gLTEgOgoJCQkJYiA9PT0gZG9jdW1lbnQgPyAxIDoKCQkJCWF1cCA/IC0xIDoKCQkJCWJ1cCA/IDEgOgoJCQkJc29ydElucHV0ID8KCQkJCSggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDoKCQkJCTA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrCgkJfSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7CgkJCXJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTsKCQl9CgoJCS8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uCgkJY3VyID0gYTsKCQl3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7CgkJCWFwLnVuc2hpZnQoIGN1ciApOwoJCX0KCQljdXIgPSBiOwoJCXdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJfQoKCQkvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeQoJCXdoaWxlICggYXBbaV0gPT09IGJwW2ldICkgewoJCQlpKys7CgkJfQoKCQlyZXR1cm4gaSA/CgkJCS8vIERvIGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvcgoJCQlzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDoKCgkJCS8vIE90aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdAoJCQlhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOgoJCQlicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6CgkJCTA7Cgl9OwoKCXJldHVybiBkb2N1bWVudDsKfTsKClNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkgewoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTsKfTsKClNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBlbGVtICk7Cgl9CgoJLy8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkCglleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCAiPSckMSddIiApOwoKCWlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiYKCQkhY29tcGlsZXJDYWNoZVsgZXhwciArICIgIiBdICYmCgkJKCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJgoJCSggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHsKCgkJdHJ5IHsKCQkJdmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApOwoKCQkJLy8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2RlcwoJCQlpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8CgkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5CgkJCQkJZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCQl9IGNhdGNoIChlKSB7fQoJfQoKCXJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7Cn07CgpTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHsKCS8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZAoJaWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkgewoJCXNldERvY3VtZW50KCBjb250ZXh0ICk7Cgl9CglyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTsKfTsKClNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWQKCWlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHsKCQlzZXREb2N1bWVudCggZWxlbSApOwoJfQoKCXZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sCgkJLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpCgkJdmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgPwoJCQlmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOgoJCQl1bmRlZmluZWQ7CgoJcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID8KCQl2YWwgOgoJCXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgPwoJCQllbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDoKCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSkgJiYgdmFsLnNwZWNpZmllZCA/CgkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKfTsKClNpenpsZS5lc2NhcGUgPSBmdW5jdGlvbiggc2VsICkgewoJcmV0dXJuIChzZWwgKyAiIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApOwp9OwoKU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHsKCXRocm93IG5ldyBFcnJvciggIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2cgKTsKfTsKCi8qKgogKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzCiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzCiAqLwpTaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkgewoJdmFyIGVsZW0sCgkJZHVwbGljYXRlcyA9IFtdLAoJCWogPSAwLAoJCWkgPSAwOwoKCS8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2UKCWhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7Cglzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTsKCXJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7CgoJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJd2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7CgkJCWlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkgewoJCQkJaiA9IGR1cGxpY2F0ZXMucHVzaCggaSApOwoJCQl9CgkJfQoJCXdoaWxlICggai0tICkgewoJCQlyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7CgkJfQoJfQoKCS8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzCgkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjUKCXNvcnRJbnB1dCA9IG51bGw7CgoJcmV0dXJuIHJlc3VsdHM7Cn07CgovKioKICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtCiAqLwpnZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHsKCXZhciBub2RlLAoJCXJldCA9ICIiLAoJCWkgPSAwLAoJCW5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTsKCglpZiAoICFub2RlVHlwZSApIHsKCQkvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheQoJCXdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkgewoJCQkvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2RlcwoJCQlyZXQgKz0gZ2V0VGV4dCggbm9kZSApOwoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHsKCQkvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzCgkJLy8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1MykKCQlpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CgkJfSBlbHNlIHsKCQkJLy8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJcmV0ICs9IGdldFRleHQoIGVsZW0gKTsKCQkJfQoJCX0KCX0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkgewoJCXJldHVybiBlbGVtLm5vZGVWYWx1ZTsKCX0KCS8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2RlcwoKCXJldHVybiByZXQ7Cn07CgpFeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHsKCgkvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXIKCWNhY2hlTGVuZ3RoOiA1MCwKCgljcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbiwKCgltYXRjaDogbWF0Y2hFeHByLAoKCWF0dHJIYW5kbGU6IHt9LAoKCWZpbmQ6IHt9LAoKCXJlbGF0aXZlOiB7CgkJIj4iOiB7IGRpcjogInBhcmVudE5vZGUiLCBmaXJzdDogdHJ1ZSB9LAoJCSIgIjogeyBkaXI6ICJwYXJlbnROb2RlIiB9LAoJCSIrIjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciLCBmaXJzdDogdHJ1ZSB9LAoJCSJ+IjogeyBkaXI6ICJwcmV2aW91c1NpYmxpbmciIH0KCX0sCgoJcHJlRmlsdGVyOiB7CgkJIkFUVFIiOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCW1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTsKCgkJCS8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkCgkJCW1hdGNoWzNdID0gKCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgoJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgewoJCQkJbWF0Y2hbM10gPSAiICIgKyBtYXRjaFszXSArICIgIjsKCQkJfQoKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7CgkJfSwKCgkJIkNISUxEIjogZnVuY3Rpb24oIG1hdGNoICkgewoJCQkvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByWyJDSElMRCJdCgkJCQkxIHR5cGUgKG9ubHl8bnRofC4uLikKCQkJCTIgd2hhdCAoY2hpbGR8b2YtdHlwZSkKCQkJCTMgYXJndW1lbnQgKGV2ZW58b2RkfFxkKnxcZCpuKFsrLV1cZCspP3wuLi4pCgkJCQk0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xkKm58KQoJCQkJNSBzaWduIG9mIHhuLWNvbXBvbmVudAoJCQkJNiB4IG9mIHhuLWNvbXBvbmVudAoJCQkJNyBzaWduIG9mIHktY29tcG9uZW50CgkJCQk4IHkgb2YgeS1jb21wb25lbnQKCQkJKi8KCQkJbWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpOwoKCQkJaWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSAibnRoIiApIHsKCQkJCS8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50CgkJCQlpZiAoICFtYXRjaFszXSApIHsKCQkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CgkJCQl9CgoJCQkJLy8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxECgkJCQkvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xCgkJCQltYXRjaFs0XSA9ICsoIG1hdGNoWzRdID8gbWF0Y2hbNV0gKyAobWF0Y2hbNl0gfHwgMSkgOiAyICogKCBtYXRjaFszXSA9PT0gImV2ZW4iIHx8IG1hdGNoWzNdID09PSAib2RkIiApICk7CgkJCQltYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSAib2RkIiApOwoKCQkJLy8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIG1hdGNoWzNdICkgewoJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQl9CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKCQkJdmFyIGV4Y2VzcywKCQkJCXVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdOwoKCQkJaWYgKCBtYXRjaEV4cHJbIkNISUxEIl0udGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQkvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pcwoJCQlpZiAoIG1hdGNoWzNdICkgewoJCQkJbWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIjsKCgkJCS8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJgoJCQkJLy8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSkKCQkJCShleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiYKCQkJCS8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpcwoJCQkJKGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoICIpIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkgewoKCQkJCS8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4CgkJCQltYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNlc3MgKTsKCQkJCW1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOwoJCQl9CgoJCQkvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudCkKCQkJcmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7CgkJfQoJfSwKCglmaWx0ZXI6IHsKCgkJIlRBRyI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkgewoJCQl2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09ICIqIiA/CgkJCQlmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOgoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTsKCQkJCX07CgkJfSwKCgkJIkNMQVNTIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHsKCQkJdmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyAiICIgXTsKCgkJCXJldHVybiBwYXR0ZXJuIHx8CgkJCQkocGF0dGVybiA9IG5ldyBSZWdFeHAoICIoXnwiICsgd2hpdGVzcGFjZSArICIpIiArIGNsYXNzTmFtZSArICIoIiArIHdoaXRlc3BhY2UgKyAifCQpIiApKSAmJgoJCQkJY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJCQlyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09ICJzdHJpbmciICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIgKTsKCQkJCX0pOwoJCX0sCgoJCSJBVFRSIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7CgoJCQkJaWYgKCByZXN1bHQgPT0gbnVsbCApIHsKCQkJCQlyZXR1cm4gb3BlcmF0b3IgPT09ICIhPSI7CgkJCQl9CgkJCQlpZiAoICFvcGVyYXRvciApIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCgkJCQlyZXN1bHQgKz0gIiI7CgoJCQkJcmV0dXJuIG9wZXJhdG9yID09PSAiPSIgPyByZXN1bHQgPT09IGNoZWNrIDoKCQkJCQlvcGVyYXRvciA9PT0gIiE9IiA/IHJlc3VsdCAhPT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAiXj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOgoJCQkJCW9wZXJhdG9yID09PSAiKj0iID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CgkJCQkJb3BlcmF0b3IgPT09ICIkPSIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOgoJCQkJCW9wZXJhdG9yID09PSAifj0iID8gKCAiICIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsICIgIiApICsgIiAiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDoKCQkJCQlvcGVyYXRvciA9PT0gInw9IiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgIi0iIDoKCQkJCQlmYWxzZTsKCQkJfTsKCQl9LAoKCQkiQ0hJTEQiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkgewoJCQl2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSAibnRoIiwKCQkJCWZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSAibGFzdCIsCgkJCQlvZlR5cGUgPSB3aGF0ID09PSAib2YtdHlwZSI7CgoJCQlyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/CgoJCQkJLy8gU2hvcnRjdXQgZm9yIDpudGgtKihuKQoJCQkJZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkJcmV0dXJuICEhZWxlbS5wYXJlbnROb2RlOwoJCQkJfSA6CgoJCQkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJCQl2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LAoJCQkJCQlkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyAibmV4dFNpYmxpbmciIDogInByZXZpb3VzU2libGluZyIsCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSwKCQkJCQkJbmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksCgkJCQkJCXVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlLAoJCQkJCQlkaWZmID0gZmFsc2U7CgoJCQkJCWlmICggcGFyZW50ICkgewoKCQkJCQkJLy8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKQoJCQkJCQlpZiAoIHNpbXBsZSApIHsKCQkJCQkJCXdoaWxlICggZGlyICkgewoJCQkJCQkJCW5vZGUgPSBlbGVtOwoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7CgkJCQkJCQkJCWlmICggb2ZUeXBlID8KCQkJCQkJCQkJCW5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6CgkJCQkJCQkJCQlub2RlLm5vZGVUeXBlID09PSAxICkgewoKCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQkvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbykKCQkJCQkJCQlzdGFydCA9IGRpciA9IHR5cGUgPT09ICJvbmx5IiAmJiAhc3RhcnQgJiYgIm5leHRTaWJsaW5nIjsKCQkJCQkJCX0KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgoJCQkJCQlzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdOwoKCQkJCQkJLy8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGAKCQkJCQkJaWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkgewoKCQkJCQkJCS8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleAoKCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCW5vZGUgPSBwYXJlbnQ7CgkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJLy8gU3VwcG9ydDogSUUgPDkgb25seQoJCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCShvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQkJY2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdOwoJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJZGlmZiA9IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdOwoJCQkJCQkJbm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07CgoJCQkJCQkJd2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHwKCgkJCQkJCQkJLy8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnQKCQkJCQkJCQkoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHsKCgkJCQkJCQkJLy8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWsKCQkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7CgkJCQkJCQkJCXVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlCgkJCQkJCQlpZiAoIHVzZUNhY2hlICkgewoJCQkJCQkJCS8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXkKCQkJCQkJCQlub2RlID0gZWxlbTsKCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQljYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107CgkJCQkJCQkJbm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdOwoJCQkJCQkJCWRpZmYgPSBub2RlSW5kZXg7CgkJCQkJCQl9CgoJCQkJCQkJLy8geG1sIDpudGgtY2hpbGQoLi4uKQoJCQkJCQkJLy8gb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKQoJCQkJCQkJaWYgKCBkaWZmID09PSBmYWxzZSApIHsKCQkJCQkJCQkvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydAoJCQkJCQkJCXdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8CgkJCQkJCQkJCShkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkgewoKCQkJCQkJCQkJaWYgKCAoIG9mVHlwZSA/CgkJCQkJCQkJCQlub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOgoJCQkJCQkJCQkJbm9kZS5ub2RlVHlwZSA9PT0gMSApICYmCgkJCQkJCQkJCQkrK2RpZmYgKSB7CgoJCQkJCQkJCQkJLy8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudAoJCQkJCQkJCQkJaWYgKCB1c2VDYWNoZSApIHsKCQkJCQkJCQkJCQlvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJCQkJCQkvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSkKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fAoJCQkJCQkJCQkJCQkob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pOwoKCQkJCQkJCQkJCQl1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07CgkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJaWYgKCBub2RlID09PSBlbGVtICkgewoJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZQoJCQkJCQlkaWZmIC09IGxhc3Q7CgkJCQkJCXJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJCX07CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkgewoJCQkvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3NlcwoJCQkvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVycwoJCQkvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zCgkJCXZhciBhcmdzLAoJCQkJZm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIHBzZXVkbzogIiArIHBzZXVkbyApOwoKCQkJLy8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdAoJCQkvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvbgoJCQkvLyBqdXN0IGFzIFNpenpsZSBkb2VzCgkJCWlmICggZm5bIGV4cGFuZG8gXSApIHsKCQkJCXJldHVybiBmbiggYXJndW1lbnQgKTsKCQkJfQoKCQkJLy8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzCgkJCWlmICggZm4ubGVuZ3RoID4gMSApIHsKCQkJCWFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCAiIiwgYXJndW1lbnQgXTsKCQkJCXJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgPwoJCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHsKCQkJCQkJdmFyIGlkeCwKCQkJCQkJCW1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSwKCQkJCQkJCWkgPSBtYXRjaGVkLmxlbmd0aDsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7CgkJCQkJCQlzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApOwoJCQkJCQl9CgkJCQkJfSkgOgoJCQkJCWZ1bmN0aW9uKCBlbGVtICkgewoJCQkJCQlyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTsKCQkJCQl9OwoJCQl9CgoJCQlyZXR1cm4gZm47CgkJfQoJfSwKCglwc2V1ZG9zOiB7CgkJLy8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zCgkJIm5vdCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJCS8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlCgkJCS8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nCgkJCS8vIHNwYWNlcyBhcyBjb21iaW5hdG9ycwoJCQl2YXIgaW5wdXQgPSBbXSwKCQkJCXJlc3VsdHMgPSBbXSwKCQkJCW1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApICk7CgoJCQlyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID8KCQkJCW1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkgewoJCQkJCXZhciBlbGVtLAoJCQkJCQl1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksCgkJCQkJCWkgPSBzZWVkLmxlbmd0aDsKCgkJCQkJLy8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYAoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsKCQkJCQkJCXNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pIDoKCQkJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCQkJaW5wdXRbMF0gPSBlbGVtOwoJCQkJCW1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTsKCQkJCQkvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KQoJCQkJCWlucHV0WzBdID0gbnVsbDsKCQkJCQlyZXR1cm4gIXJlc3VsdHMucG9wKCk7CgkJCQl9OwoJCX0pLAoKCQkiaGFzIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJcmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwOwoJCQl9OwoJCX0pLAoKCQkiY29udGFpbnMiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7CgkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7CgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7CgkJCX07CgkJfSksCgoJCS8vICJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yCgkJLy8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUKCQkvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLAoJCS8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgIi0iLgoJCS8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgoJCS8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuIgoJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG8KCQkibGFuZyI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7CgkJCS8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXIKCQkJaWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8ICIiKSApIHsKCQkJCVNpenpsZS5lcnJvciggInVuc3VwcG9ydGVkIGxhbmc6ICIgKyBsYW5nICk7CgkJCX0KCQkJbGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpOwoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgZWxlbUxhbmc7CgkJCQlkbyB7CgkJCQkJaWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/CgkJCQkJCWVsZW0ubGFuZyA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCJsYW5nIikpICkgewoKCQkJCQkJZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpOwoJCQkJCQlyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArICItIiApID09PSAwOwoJCQkJCX0KCQkJCX0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9OwoJCX0pLAoKCQkvLyBNaXNjZWxsYW5lb3VzCgkJInRhcmdldCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDsKCQkJcmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkOwoJCX0sCgoJCSJyb290IjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtID09PSBkb2NFbGVtOwoJCX0sCgoJCSJmb2N1cyI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpOwoJCX0sCgoJCS8vIEJvb2xlYW4gcHJvcGVydGllcwoJCSJlbmFibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGZhbHNlICksCgkJImRpc2FibGVkIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIHRydWUgKSwKCgkJImNoZWNrZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzCgkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCgkJCXZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChub2RlTmFtZSA9PT0gImlucHV0IiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSAib3B0aW9uIiAmJiAhIWVsZW0uc2VsZWN0ZWQpOwoJCX0sCgoJCSJzZWxlY3RlZCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0CgkJCS8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHkKCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoKCQkJcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7CgkJfSwKCgkJLy8gQ29udGVudHMKCQkiZW1wdHkiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG8KCQkJLy8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLAoJCQkvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKQoJCQkvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuCgkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJInBhcmVudCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gIUV4cHIucHNldWRvc1siZW1wdHkiXSggZWxlbSApOwoJCX0sCgoJCS8vIEVsZW1lbnQvaW5wdXQgdHlwZXMKCQkiaGVhZGVyIjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoKCQkiaW5wdXQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgoJCSJidXR0b24iOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmIGVsZW0udHlwZSA9PT0gImJ1dHRvbiIgfHwgbmFtZSA9PT0gImJ1dHRvbiI7CgkJfSwKCgkJInRleHQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIGF0dHI7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYKCQkJCWVsZW0udHlwZSA9PT0gInRleHQiICYmCgoJCQkJLy8gU3VwcG9ydDogSUU8OAoJCQkJLy8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sICJzZWFyY2giKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09ICJ0ZXh0IgoJCQkJKCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSAidGV4dCIgKTsKCQl9LAoKCQkvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uCgkJImZpcnN0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHsKCQkJcmV0dXJuIFsgMCBdOwoJCX0pLAoKCQkibGFzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQlyZXR1cm4gWyBsZW5ndGggLSAxIF07CgkJfSksCgoJCSJlcSI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJcmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdOwoJCX0pLAoKCQkiZXZlbiI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkgewoJCQl2YXIgaSA9IDA7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkgewoJCQkJbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKCQkJfQoJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOwoJCX0pLAoKCQkib2RkIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7CgkJCXZhciBpID0gMTsKCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7CgkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOwoJCQl9CgkJCXJldHVybiBtYXRjaEluZGV4ZXM7CgkJfSksCgoJCSJsdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJdmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50OwoJCQlmb3IgKCA7IC0taSA+PSAwOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KSwKCgkJImd0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewoJCQl2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7CgkJCWZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KQoJfQp9OwoKRXhwci5wc2V1ZG9zWyJudGgiXSA9IEV4cHIucHNldWRvc1siZXEiXTsKCi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zCmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkgewoJRXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApOwp9CmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7CglFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApOwp9CgovLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnMKZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9CnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zOwpFeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpOwoKdG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHsKCXZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLAoJCXNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsCgkJY2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyAiICIgXTsKCglpZiAoIGNhY2hlZCApIHsKCQlyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApOwoJfQoKCXNvRmFyID0gc2VsZWN0b3I7Cglncm91cHMgPSBbXTsKCXByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjsKCgl3aGlsZSAoIHNvRmFyICkgewoKCQkvLyBDb21tYSBhbmQgZmlyc3QgcnVuCgkJaWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7CgkJCWlmICggbWF0Y2ggKSB7CgkJCQkvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZAoJCQkJc29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7CgkJCX0KCQkJZ3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTsKCQl9CgoJCW1hdGNoZWQgPSBmYWxzZTsKCgkJLy8gQ29tYmluYXRvcnMKCQlpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHsKCQkJbWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7CgkJCXRva2Vucy5wdXNoKHsKCQkJCXZhbHVlOiBtYXRjaGVkLAoJCQkJLy8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlCgkJCQl0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgIiAiICkKCQkJfSk7CgkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJfQoKCQkvLyBGaWx0ZXJzCgkJZm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHsKCQkJaWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fAoJCQkJKG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7CgkJCQltYXRjaGVkID0gbWF0Y2guc2hpZnQoKTsKCQkJCXRva2Vucy5wdXNoKHsKCQkJCQl2YWx1ZTogbWF0Y2hlZCwKCQkJCQl0eXBlOiB0eXBlLAoJCQkJCW1hdGNoZXM6IG1hdGNoCgkJCQl9KTsKCQkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgkJCX0KCQl9CgoJCWlmICggIW1hdGNoZWQgKSB7CgkJCWJyZWFrOwoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3MKCS8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZwoJLy8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zCglyZXR1cm4gcGFyc2VPbmx5ID8KCQlzb0Zhci5sZW5ndGggOgoJCXNvRmFyID8KCQkJU2l6emxlLmVycm9yKCBzZWxlY3RvciApIDoKCQkJLy8gQ2FjaGUgdGhlIHRva2VucwoJCQl0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTsKfTsKCmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHsKCXZhciBpID0gMCwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCXNlbGVjdG9yID0gIiI7Cglmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQlzZWxlY3RvciArPSB0b2tlbnNbaV0udmFsdWU7Cgl9CglyZXR1cm4gc2VsZWN0b3I7Cn0KCmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7Cgl2YXIgZGlyID0gY29tYmluYXRvci5kaXIsCgkJc2tpcCA9IGNvbWJpbmF0b3IubmV4dCwKCQlrZXkgPSBza2lwIHx8IGRpciwKCQljaGVja05vbkVsZW1lbnRzID0gYmFzZSAmJiBrZXkgPT09ICJwYXJlbnROb2RlIiwKCQlkb25lTmFtZSA9IGRvbmUrKzsKCglyZXR1cm4gY29tYmluYXRvci5maXJzdCA/CgkJLy8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkgewoJCQkJCXJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfSA6CgoJCS8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50cwoJCWZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7CgkJCXZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsCgkJCQluZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTsKCgkJCS8vIFdlIGNhbid0IHNldCBhcmJpdHJhcnkgZGF0YSBvbiBYTUwgbm9kZXMsIHNvIHRoZXkgZG9uJ3QgYmVuZWZpdCBmcm9tIGNvbWJpbmF0b3IgY2FjaGluZwoJCQlpZiAoIHhtbCApIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CgkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7CgkJCQkJCW91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTsKCgkJCQkJCS8vIFN1cHBvcnQ6IElFIDw5IG9ubHkKCQkJCQkJLy8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpCgkJCQkJCXVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7CgoJCQkJCQlpZiAoIHNraXAgJiYgc2tpcCA9PT0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICkgewoJCQkJCQkJZWxlbSA9IGVsZW1bIGRpciBdIHx8IGVsZW07CgkJCQkJCX0gZWxzZSBpZiAoIChvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBrZXkgXSkgJiYKCQkJCQkJCW9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7CgoJCQkJCQkJLy8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHMKCQkJCQkJCXJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50cwoJCQkJCQkJdW5pcXVlQ2FjaGVbIGtleSBdID0gbmV3Q2FjaGU7CgoJCQkJCQkJLy8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nCgkJCQkJCQlpZiAoIChuZXdDYWNoZVsgMiBdID0gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkpICkgewoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9Owp9CgpmdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7CglyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJdmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7CgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9IDoKCQltYXRjaGVyc1swXTsKfQoKZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGNvbnRleHRzLmxlbmd0aDsKCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCVNpenpsZSggc2VsZWN0b3IsIGNvbnRleHRzW2ldLCByZXN1bHRzICk7Cgl9CglyZXR1cm4gcmVzdWx0czsKfQoKZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHsKCXZhciBlbGVtLAoJCW5ld1VubWF0Y2hlZCA9IFtdLAoJCWkgPSAwLAoJCWxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsCgkJbWFwcGVkID0gbWFwICE9IG51bGw7CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7CgkJCWlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkgewoJCQkJbmV3VW5tYXRjaGVkLnB1c2goIGVsZW0gKTsKCQkJCWlmICggbWFwcGVkICkgewoJCQkJCW1hcC5wdXNoKCBpICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIG5ld1VubWF0Y2hlZDsKfQoKZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkgewoJaWYgKCBwb3N0RmlsdGVyICYmICFwb3N0RmlsdGVyWyBleHBhbmRvIF0gKSB7CgkJcG9zdEZpbHRlciA9IHNldE1hdGNoZXIoIHBvc3RGaWx0ZXIgKTsKCX0KCWlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkgewoJCXBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTsKCX0KCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHsKCQl2YXIgdGVtcCwgaSwgZWxlbSwKCQkJcHJlTWFwID0gW10sCgkJCXBvc3RNYXAgPSBbXSwKCQkJcHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCwKCgkJCS8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0CgkJCWVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCAiKiIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksCgoJCQkvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb24KCQkJbWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/CgkJCQljb25kZW5zZSggZWxlbXMsIHByZU1hcCwgcHJlRmlsdGVyLCBjb250ZXh0LCB4bWwgKSA6CgkJCQllbGVtcywKCgkJCW1hdGNoZXJPdXQgPSBtYXRjaGVyID8KCQkJCS8vIElmIHdlIGhhdmUgYSBwb3N0RmluZGVyLCBvciBmaWx0ZXJlZCBzZWVkLCBvciBub24tc2VlZCBwb3N0RmlsdGVyIG9yIHByZWV4aXN0aW5nIHJlc3VsdHMsCgkJCQlwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/CgoJCQkJCS8vIC4uLmludGVybWVkaWF0ZSBwcm9jZXNzaW5nIGlzIG5lY2Vzc2FyeQoJCQkJCVtdIDoKCgkJCQkJLy8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5CgkJCQkJcmVzdWx0cyA6CgkJCQltYXRjaGVySW47CgoJCS8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzCgkJaWYgKCBtYXRjaGVyICkgewoJCQltYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApOwoJCX0KCgkJLy8gQXBwbHkgcG9zdEZpbHRlcgoJCWlmICggcG9zdEZpbHRlciApIHsKCQkJdGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7CgkJCXBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTsKCgkJCS8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW4KCQkJaSA9IHRlbXAubGVuZ3RoOwoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHsKCQkJCQltYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7CgkJCQl9CgkJCX0KCQl9CgoJCWlmICggc2VlZCApIHsKCQkJaWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHsKCQkJCWlmICggcG9zdEZpbmRlciApIHsKCQkJCQkvLyBHZXQgdGhlIGZpbmFsIG1hdGNoZXJPdXQgYnkgY29uZGVuc2luZyB0aGlzIGludGVybWVkaWF0ZSBpbnRvIHBvc3RGaW5kZXIgY29udGV4dHMKCQkJCQl0ZW1wID0gW107CgkJCQkJaSA9IG1hdGNoZXJPdXQubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoJCQkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7CgkJCQkJCQkvLyBSZXN0b3JlIG1hdGNoZXJJbiBzaW5jZSBlbGVtIGlzIG5vdCB5ZXQgYSBmaW5hbCBtYXRjaAoJCQkJCQkJdGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlwb3N0RmluZGVyKCBudWxsLCAobWF0Y2hlck91dCA9IFtdKSwgdGVtcCwgeG1sICk7CgkJCQl9CgoJCQkJLy8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWQKCQkJCWkgPSBtYXRjaGVyT3V0Lmxlbmd0aDsKCQkJCXdoaWxlICggaS0tICkgewoJCQkJCWlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSAmJgoJCQkJCQkodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7CgoJCQkJCQlzZWVkW3RlbXBdID0gIShyZXN1bHRzW3RlbXBdID0gZWxlbSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCS8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZAoJCX0gZWxzZSB7CgkJCW1hdGNoZXJPdXQgPSBjb25kZW5zZSgKCQkJCW1hdGNoZXJPdXQgPT09IHJlc3VsdHMgPwoJCQkJCW1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6CgkJCQkJbWF0Y2hlck91dAoJCQkpOwoJCQlpZiAoIHBvc3RGaW5kZXIgKSB7CgkJCQlwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTsKCQkJfSBlbHNlIHsKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTsKCQkJfQoJCX0KCX0pOwp9CgpmdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkgewoJdmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaiwKCQlsZW4gPSB0b2tlbnMubGVuZ3RoLAoJCWxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sCgkJaW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlWyIgIl0sCgkJaSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLAoKCQkvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKQoJCW1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0OwoJCX0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSwKCQltYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGluZGV4T2YoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7CgkJfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAoJCW1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewoJCQl2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8ICgKCQkJCShjaGVja0NvbnRleHQgPSBjb250ZXh0KS5ub2RlVHlwZSA/CgkJCQkJbWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6CgkJCQkJbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApOwoJCQkvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSkKCQkJY2hlY2tDb250ZXh0ID0gbnVsbDsKCQkJcmV0dXJuIHJldDsKCQl9IF07CgoJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJaWYgKCAobWF0Y2hlciA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1tpXS50eXBlIF0pICkgewoJCQltYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTsKCQl9IGVsc2UgewoJCQltYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7CgoJCQkvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlcgoJCQlpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHsKCQkJCS8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZwoJCQkJaiA9ICsraTsKCQkJCWZvciAoIDsgaiA8IGxlbjsgaisrICkgewoJCQkJCWlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIHNldE1hdGNoZXIoCgkJCQkJaSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksCgkJCQkJaSA+IDEgJiYgdG9TZWxlY3RvcigKCQkJCQkJLy8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmAKCQkJCQkJdG9rZW5zLnNsaWNlKCAwLCBpIC0gMSApLmNvbmNhdCh7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gIiAiID8gIioiIDogIiIgfSkKCQkJCQkpLnJlcGxhY2UoIHJ0cmltLCAiJDEiICksCgkJCQkJbWF0Y2hlciwKCQkJCQlpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSwKCQkJCQlqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksCgkJCQkJaiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKQoJCQkJKTsKCQkJfQoJCQltYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7CgkJfQoJfQoKCXJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTsKfQoKZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgewoJdmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7CgkJCXZhciBlbGVtLCBqLCBtYXRjaGVyLAoJCQkJbWF0Y2hlZENvdW50ID0gMCwKCQkJCWkgPSAiMCIsCgkJCQl1bm1hdGNoZWQgPSBzZWVkICYmIFtdLAoJCQkJc2V0TWF0Y2hlZCA9IFtdLAoJCQkJY29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsCgkJCQkvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0CgkJCQllbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgb3V0ZXJtb3N0ICksCgkJCQkvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hlcgoJCQkJZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksCgkJCQlsZW4gPSBlbGVtcy5sZW5ndGg7CgoJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDsKCQkJfQoKCQkJLy8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHMKCQkJLy8gU3VwcG9ydDogSUU8OSwgU2FmYXJpCgkJCS8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiAibGVuZ3RoIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWQKCQkJZm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHsKCQkJCQlqID0gMDsKCQkJCQlpZiAoICFjb250ZXh0ICYmIGVsZW0ub3duZXJEb2N1bWVudCAhPT0gZG9jdW1lbnQgKSB7CgkJCQkJCXNldERvY3VtZW50KCBlbGVtICk7CgkJCQkJCXhtbCA9ICFkb2N1bWVudElzSFRNTDsKCQkJCQl9CgkJCQkJd2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHsKCQkJCQkJaWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0IHx8IGRvY3VtZW50LCB4bWwpICkgewoJCQkJCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCQkJZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnMKCQkJCWlmICggYnlTZXQgKSB7CgkJCQkJLy8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVycwoJCQkJCWlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHsKCQkJCQkJbWF0Y2hlZENvdW50LS07CgkJCQkJfQoKCQkJCQkvLyBMZW5ndGhlbiB0aGUgYXJyYXkgZm9yIGV2ZXJ5IGVsZW1lbnQsIG1hdGNoZWQgb3Igbm90CgkJCQkJaWYgKCBzZWVkICkgewoJCQkJCQl1bm1hdGNoZWQucHVzaCggZWxlbSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gYGlgIGlzIG5vdyB0aGUgY291bnQgb2YgZWxlbWVudHMgdmlzaXRlZCBhYm92ZSwgYW5kIGFkZGluZyBpdCB0byBgbWF0Y2hlZENvdW50YAoJCQkvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLgoJCQltYXRjaGVkQ291bnQgKz0gaTsKCgkJCS8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50cwoJCQkvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgCgkJCS8vIGVxdWFscyBgaWApLCB1bmxlc3Mgd2UgZGlkbid0IHZpc2l0IF9hbnlfIGVsZW1lbnRzIGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGF2ZQoJCQkvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLgoJCQkvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyAiMCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdAoJCQkvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhICIwMCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvCgkJCS8vIG51bWVyaWNhbGx5IHplcm8uCgkJCWlmICggYnlTZXQgJiYgaSAhPT0gbWF0Y2hlZENvdW50ICkgewoJCQkJaiA9IDA7CgkJCQl3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7CgkJCQkJbWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTsKCQkJCX0KCgkJCQlpZiAoIHNlZWQgKSB7CgkJCQkJLy8gUmVpbnRlZ3JhdGUgZWxlbWVudCBtYXRjaGVzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3Igc29ydGluZwoJCQkJCWlmICggbWF0Y2hlZENvdW50ID4gMCApIHsKCQkJCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQkJCQlpZiAoICEodW5tYXRjaGVkW2ldIHx8IHNldE1hdGNoZWRbaV0pICkgewoJCQkJCQkJCXNldE1hdGNoZWRbaV0gPSBwb3AuY2FsbCggcmVzdWx0cyApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlcwoJCQkJCXNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApOwoJCQkJfQoKCQkJCS8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHMKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTsKCgkJCQkvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmcKCQkJCWlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJgoJCQkJCSggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkgewoKCQkJCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwoJCQkJfQoJCQl9CgoJCQkvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnMKCQkJaWYgKCBvdXRlcm1vc3QgKSB7CgkJCQlkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsKCQkJCW91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwOwoJCQl9CgoJCQlyZXR1cm4gdW5tYXRjaGVkOwoJCX07CgoJcmV0dXJuIGJ5U2V0ID8KCQltYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDoKCQlzdXBlck1hdGNoZXI7Cn0KCmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7Cgl2YXIgaSwKCQlzZXRNYXRjaGVycyA9IFtdLAoJCWVsZW1lbnRNYXRjaGVycyA9IFtdLAoJCWNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgIiAiIF07CgoJaWYgKCAhY2FjaGVkICkgewoJCS8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudAoJCWlmICggIW1hdGNoICkgewoJCQltYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApOwoJCX0KCQlpID0gbWF0Y2gubGVuZ3RoOwoJCXdoaWxlICggaS0tICkgewoJCQljYWNoZWQgPSBtYXRjaGVyRnJvbVRva2VucyggbWF0Y2hbaV0gKTsKCQkJaWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHsKCQkJCXNldE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudE1hdGNoZXJzLnB1c2goIGNhY2hlZCApOwoJCQl9CgkJfQoKCQkvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24KCQljYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTsKCgkJLy8gU2F2ZSBzZWxlY3RvciBhbmQgdG9rZW5pemF0aW9uCgkJY2FjaGVkLnNlbGVjdG9yID0gc2VsZWN0b3I7Cgl9CglyZXR1cm4gY2FjaGVkOwp9OwoKLyoqCiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWQKICogIHNlbGVjdG9yIGZ1bmN0aW9ucwogKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZAogKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZQogKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRleHQKICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdCiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0CiAqLwpzZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkgewoJdmFyIGksIHRva2VucywgdG9rZW4sIHR5cGUsIGZpbmQsCgkJY29tcGlsZWQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgJiYgc2VsZWN0b3IsCgkJbWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7CgoJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107CgoJLy8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWQKCS8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dCkKCWlmICggbWF0Y2gubGVuZ3RoID09PSAxICkgewoKCQkvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRAoJCXRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTsKCQlpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gIklEIiAmJgoJCQkJY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkgewoKCQkJY29udGV4dCA9ICggRXhwci5maW5kWyJJRCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTsKCQkJaWYgKCAhY29udGV4dCApIHsKCQkJCXJldHVybiByZXN1bHRzOwoKCQkJLy8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbAoJCQl9IGVsc2UgaWYgKCBjb21waWxlZCApIHsKCQkJCWNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7CgkJCX0KCgkJCXNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApOwoJCX0KCgkJLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZwoJCWkgPSBtYXRjaEV4cHJbIm5lZWRzQ29udGV4dCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDsKCQl3aGlsZSAoIGktLSApIHsKCQkJdG9rZW4gPSB0b2tlbnNbaV07CgoJCQkvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yCgkJCWlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHsKCQkJCS8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9ycwoJCQkJaWYgKCAoc2VlZCA9IGZpbmQoCgkJCQkJdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLAoJCQkJCXJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHQKCQkJCSkpICkgewoKCQkJCQkvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHkKCQkJCQl0b2tlbnMuc3BsaWNlKCBpLCAxICk7CgkJCQkJc2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKTsKCQkJCQlpZiAoICFzZWxlY3RvciApIHsKCQkJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApOwoJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQl9CgoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJfQoKCS8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZAoJLy8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZQoJKCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKAoJCXNlZWQsCgkJY29udGV4dCwKCQkhZG9jdW1lbnRJc0hUTUwsCgkJcmVzdWx0cywKCQkhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0CgkpOwoJcmV0dXJuIHJlc3VsdHM7Cn07CgovLyBPbmUtdGltZSBhc3NpZ25tZW50cwoKLy8gU29ydCBzdGFiaWxpdHkKc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdCgiIikuc29ydCggc29ydE9yZGVyICkuam9pbigiIikgPT09IGV4cGFuZG87CgovLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrCi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24Kc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7CgovLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnQKc2V0RG9jdW1lbnQoKTsKCi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpCi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKgpzdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydChmdW5jdGlvbiggZWwgKSB7CgkvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZykKCXJldHVybiBlbC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSApICYgMTsKfSk7CgovLyBTdXBwb3J0OiBJRTw4Ci8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5ICJpbnRlcnBvbGF0aW9uIgovLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweAppZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09ICIjIiA7Cn0pICkgewoJYWRkSGFuZGxlKCAidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJ0eXBlIiA/IDEgOiAyICk7CgkJfQoJfSk7Cn0KCi8vIFN1cHBvcnQ6IElFPDkKLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoInZhbHVlIikKaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkgewoJZWwuaW5uZXJIVE1MID0gIjxpbnB1dC8+IjsKCWVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCAidmFsdWUiLCAiIiApOwoJcmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCAidmFsdWUiICkgPT09ICIiOwp9KSApIHsKCWFkZEhhbmRsZSggInZhbHVlIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCWlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiApIHsKCQkJcmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlOwoJCX0KCX0pOwp9CgovLyBTdXBwb3J0OiBJRTw5Ci8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXMKaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHsKCXJldHVybiBlbC5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT0gbnVsbDsKfSkgKSB7CglhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7CgkJdmFyIHZhbDsKCQlpZiAoICFpc1hNTCApIHsKCQkJcmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6CgkJCQkJKHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID8KCQkJCQl2YWwudmFsdWUgOgoJCQkJbnVsbDsKCQl9Cgl9KTsKfQoKcmV0dXJuIFNpenpsZTsKCn0pKCB3aW5kb3cgKTsKCgoKalF1ZXJ5LmZpbmQgPSBTaXp6bGU7CmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9yczsKCi8vIERlcHJlY2F0ZWQKalF1ZXJ5LmV4cHJbICI6IiBdID0galF1ZXJ5LmV4cHIucHNldWRvczsKalF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwpqUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlOwoKCgoKdmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewoJdmFyIG1hdGNoZWQgPSBbXSwKCQl0cnVuY2F0ZSA9IHVudGlsICE9PSB1bmRlZmluZWQ7CgoJd2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICYmIGVsZW0ubm9kZVR5cGUgIT09IDkgKSB7CgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQlpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkgewoJCQkJYnJlYWs7CgkJCX0KCQkJbWF0Y2hlZC5wdXNoKCBlbGVtICk7CgkJfQoJfQoJcmV0dXJuIG1hdGNoZWQ7Cn07CgoKdmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7Cgl2YXIgbWF0Y2hlZCA9IFtdOwoKCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CgkJaWYgKCBuLm5vZGVUeXBlID09PSAxICYmIG4gIT09IGVsZW0gKSB7CgkJCW1hdGNoZWQucHVzaCggbiApOwoJCX0KCX0KCglyZXR1cm4gbWF0Y2hlZDsKfTsKCgp2YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDsKCgoKZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7CgogIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKfTsKdmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pICk7CgoKCi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkgewoJaWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90OwoJCX0gKTsKCX0KCgkvLyBTaW5nbGUgZWxlbWVudAoJaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7CgkJfSApOwoJfQoKCS8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KQoJaWYgKCB0eXBlb2YgcXVhbGlmaWVyICE9PSAic3RyaW5nIiApIHsKCQlyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+IC0xICkgIT09IG5vdDsKCQl9ICk7Cgl9CgoJLy8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9ycwoJcmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApOwp9CgpqUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7Cgl2YXIgZWxlbSA9IGVsZW1zWyAwIF07CgoJaWYgKCBub3QgKSB7CgkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOwoJfQoKCWlmICggZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJcmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXTsKCX0KCglyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTsKCX0gKSApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBpLCByZXQsCgkJCWxlbiA9IHRoaXMubGVuZ3RoLAoJCQlzZWxmID0gdGhpczsKCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJfSApICk7CgkJfQoKCQlyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTsKCgkJZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKCQkJalF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApOwoJCX0KCgkJcmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7Cgl9LAoJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7Cgl9LAoJbm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlICkgKTsKCX0sCglpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXdpbm5vdygKCQkJdGhpcywKCgkJCS8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXQKCQkJLy8gc28gJCgicDpmaXJzdCIpLmlzKCJwOmxhc3QiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gInAiLgoJCQl0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/CgkJCQlqUXVlcnkoIHNlbGVjdG9yICkgOgoJCQkJc2VsZWN0b3IgfHwgW10sCgkJCWZhbHNlCgkJKS5sZW5ndGg7Cgl9Cn0gKTsKCgovLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdAoKCi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KQp2YXIgcm9vdGpRdWVyeSwKCgkvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncwoJLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQoJLy8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFydCB3aXRoIDwpCgkvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkCglycXVpY2tFeHByID0gL14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLywKCglpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7CgkJdmFyIG1hdGNoLCBlbGVtOwoKCQkvLyBIQU5ETEU6ICQoIiIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpCgkJaWYgKCAhc2VsZWN0b3IgKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJLy8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5CgkJLy8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKQoJCXJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggc2VsZWN0b3JbIDAgXSA9PT0gIjwiICYmCgkJCQlzZWxlY3Rvclsgc2VsZWN0b3IubGVuZ3RoIC0gMSBdID09PSAiPiIgJiYKCQkJCXNlbGVjdG9yLmxlbmd0aCA+PSAzICkgewoKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKCQkJfQoKCQkJLy8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZAoJCQlpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsgMSBdICkgewoJCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDsKCgkJCQkJLy8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0CgkJCQkJLy8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnQKCQkJCQlqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoCgkJCQkJCW1hdGNoWyAxIF0sCgkJCQkJCWNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsCgkJCQkJCXRydWUKCQkJCQkpICk7CgoJCQkJCS8vIEhBTkRMRTogJChodG1sLCBwcm9wcykKCQkJCQlpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbIDEgXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CgkJCQkJCWZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7CgoJCQkJCQkJLy8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZQoJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7CgkJCQkJCQkJdGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApOwoKCQkJCQkJCS8vIC4uLmFuZCBvdGhlcndpc2Ugc2V0IGFzIGF0dHJpYnV0ZXMKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJdGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQlyZXR1cm4gdGhpczsKCgkJCQkvLyBIQU5ETEU6ICQoI2lkKQoJCQkJfSBlbHNlIHsKCQkJCQllbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTsKCgkJCQkJaWYgKCBlbGVtICkgewoKCQkJCQkJLy8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKCQkJCQkJdGhpc1sgMCBdID0gZWxlbTsKCQkJCQkJdGhpcy5sZW5ndGggPSAxOwoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCgkJCS8vIEhBTkRMRTogJChleHByLCAkKC4uLikpCgkJCX0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkgewoJCQkJcmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTsKCgkJCS8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KQoJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKCQkJfQoKCQkvLyBIQU5ETEU6ICQoRE9NRWxlbWVudCkKCQl9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHsKCQkJdGhpc1sgMCBdID0gc2VsZWN0b3I7CgkJCXRoaXMubGVuZ3RoID0gMTsKCQkJcmV0dXJuIHRoaXM7CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgewoJCQlyZXR1cm4gcm9vdC5yZWFkeSAhPT0gdW5kZWZpbmVkID8KCQkJCXJvb3QucmVhZHkoIHNlbGVjdG9yICkgOgoKCQkJCS8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnQKCQkJCXNlbGVjdG9yKCBqUXVlcnkgKTsKCQl9CgoJCXJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApOwoJfTsKCi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb24KaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgovLyBJbml0aWFsaXplIGNlbnRyYWwgcmVmZXJlbmNlCnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7CgoKdmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLAoKCS8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0CglndWFyYW50ZWVkVW5pcXVlID0gewoJCWNoaWxkcmVuOiB0cnVlLAoJCWNvbnRlbnRzOiB0cnVlLAoJCW5leHQ6IHRydWUsCgkJcHJldjogdHJ1ZQoJfTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWhhczogZnVuY3Rpb24oIHRhcmdldCApIHsKCQl2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksCgkJCWwgPSB0YXJnZXRzLmxlbmd0aDsKCgkJcmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHsKCQkJdmFyIGkgPSAwOwoJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1sgaSBdICkgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7CgkJdmFyIGN1ciwKCQkJaSA9IDAsCgkJCWwgPSB0aGlzLmxlbmd0aCwKCQkJbWF0Y2hlZCA9IFtdLAoJCQl0YXJnZXRzID0gdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTsKCgkJLy8gUG9zaXRpb25hbCBzZWxlY3RvcnMgbmV2ZXIgbWF0Y2gsIHNpbmNlIHRoZXJlJ3Mgbm8gX3NlbGVjdGlvbl8gY29udGV4dAoJCWlmICggIXJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgKSB7CgkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCWZvciAoIGN1ciA9IHRoaXNbIGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7CgoJCQkJCS8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50cwoJCQkJCWlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID8KCQkJCQkJdGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6CgoJCQkJCQkvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGUKCQkJCQkJY3VyLm5vZGVUeXBlID09PSAxICYmCgkJCQkJCQlqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHsKCgkJCQkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXQKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBJbmRleCBpbiBzZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLAoKCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkCgkJCWVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbQoJCSk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjaygKCQkJalF1ZXJ5LnVuaXF1ZVNvcnQoCgkJCQlqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApCgkJCSkKCQkpOwoJfSwKCglhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID8KCQkJdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKQoJCSk7Cgl9Cn0gKTsKCmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkgewoJd2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fQoJcmV0dXJuIGN1cjsKfQoKalF1ZXJ5LmVhY2goIHsKCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOwoJfSwKCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiApOwoJfSwKCXBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJwYXJlbnROb2RlIiwgdW50aWwgKTsKCX0sCgluZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gc2libGluZyggZWxlbSwgIm5leHRTaWJsaW5nIiApOwoJfSwKCXByZXY6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5nKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKCX0sCglwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGlyKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkgewoJCXJldHVybiBkaXIoIGVsZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7Cgl9LAoJcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CgkJcmV0dXJuIGRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7Cgl9LAoJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7Cgl9LAoJY2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7Cgl9LAoJY29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewogICAgICAgIGlmICggbm9kZU5hbWUoIGVsZW0sICJpZnJhbWUiICkgKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudDsKICAgICAgICB9CgogICAgICAgIC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5LCBpT1MgNyBvbmx5LCBBbmRyb2lkIEJyb3dzZXIgPD00LjMgb25seQogICAgICAgIC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdAogICAgICAgIC8vIGRvbid0IHN1cHBvcnQgaXQuCiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgInRlbXBsYXRlIiApICkgewogICAgICAgICAgICBlbGVtID0gZWxlbS5jb250ZW50IHx8IGVsZW07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7Cgl9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHsKCQl2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApOwoKCQlpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09ICJVbnRpbCIgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCW1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApOwoJCX0KCgkJaWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7CgoJCQkvLyBSZW1vdmUgZHVwbGljYXRlcwoJCQlpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7CgkJCQlqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApOwoJCQl9CgoJCQkvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlcwoJCQlpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7CgkJCQltYXRjaGVkLnJldmVyc2UoKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7Cgl9Owp9ICk7CnZhciBybm90aHRtbHdoaXRlID0gKCAvW15ceDIwXHRcclxuXGZdKy9nICk7CgoKCi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzCmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7Cgl2YXIgb2JqZWN0ID0ge307CglqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHsKCQlvYmplY3RbIGZsYWcgXSA9IHRydWU7Cgl9ICk7CglyZXR1cm4gb2JqZWN0Owp9CgovKgogKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKICoKICoJb3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvdwogKgkJCXRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3QKICoKICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmUKICogImZpcmVkIiBtdWx0aXBsZSB0aW1lcy4KICoKICogUG9zc2libGUgb3B0aW9uczoKICoKICoJb25jZToJCQl3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCW1lbW9yeToJCQl3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkCiAqCQkJCQlhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCAibWVtb3JpemVkIgogKgkJCQkJdmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpCiAqCiAqCXVuaXF1ZToJCQl3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdCkKICoKICoJc3RvcE9uRmFsc2U6CWludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZQogKgogKi8KalF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCS8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWQKCS8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdCkKCW9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgPwoJCWNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6CgkJalF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKCgl2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZwoJCWZpcmluZywKCgkJLy8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHMKCQltZW1vcnksCgoJCS8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkCgkJZmlyZWQsCgoJCS8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmcKCQlsb2NrZWQsCgoJCS8vIEFjdHVhbCBjYWxsYmFjayBsaXN0CgkJbGlzdCA9IFtdLAoKCQkvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0cwoJCXF1ZXVlID0gW10sCgoJCS8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKQoJCWZpcmluZ0luZGV4ID0gLTEsCgoJCS8vIEZpcmUgY2FsbGJhY2tzCgkJZmlyZSA9IGZ1bmN0aW9uKCkgewoKCQkJLy8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nCgkJCWxvY2tlZCA9IGxvY2tlZCB8fCBvcHRpb25zLm9uY2U7CgoJCQkvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucywKCQkJLy8gcmVzcGVjdGluZyBmaXJpbmdJbmRleCBvdmVycmlkZXMgYW5kIHJ1bnRpbWUgY2hhbmdlcwoJCQlmaXJlZCA9IGZpcmluZyA9IHRydWU7CgkJCWZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkgewoJCQkJbWVtb3J5ID0gcXVldWUuc2hpZnQoKTsKCQkJCXdoaWxlICggKytmaXJpbmdJbmRleCA8IGxpc3QubGVuZ3RoICkgewoKCQkJCQkvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvbgoJCQkJCWlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmCgkJCQkJCW9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7CgoJCQkJCQkvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlCgkJCQkJCWZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7CgkJCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdAoJCQlpZiAoICFvcHRpb25zLm1lbW9yeSApIHsKCQkJCW1lbW9yeSA9IGZhbHNlOwoJCQl9CgoJCQlmaXJpbmcgPSBmYWxzZTsKCgkJCS8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kCgkJCWlmICggbG9ja2VkICkgewoKCQkJCS8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHMKCQkJCWlmICggbWVtb3J5ICkgewoJCQkJCWxpc3QgPSBbXTsKCgkJCQkvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50CgkJCQl9IGVsc2UgewoJCQkJCWxpc3QgPSAiIjsKCQkJCX0KCQkJfQoJCX0sCgoJCS8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0CgkJc2VsZiA9IHsKCgkJCS8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3QKCQkJYWRkOiBmdW5jdGlvbigpIHsKCQkJCWlmICggbGlzdCApIHsKCgkJCQkJLy8gSWYgd2UgaGF2ZSBtZW1vcnkgZnJvbSBhIHBhc3QgcnVuLCB3ZSBzaG91bGQgZmlyZSBhZnRlciBhZGRpbmcKCQkJCQlpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkgewoJCQkJCQlmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTsKCQkJCQkJcXVldWUucHVzaCggbWVtb3J5ICk7CgkJCQkJfQoKCQkJCQkoIGZ1bmN0aW9uIGFkZCggYXJncyApIHsKCQkJCQkJalF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7CgkJCQkJCQlpZiAoIGlzRnVuY3Rpb24oIGFyZyApICkgewoJCQkJCQkJCWlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7CgkJCQkJCQkJCWxpc3QucHVzaCggYXJnICk7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdG9UeXBlKCBhcmcgKSAhPT0gInN0cmluZyIgKSB7CgoJCQkJCQkJCS8vIEluc3BlY3QgcmVjdXJzaXZlbHkKCQkJCQkJCQlhZGQoIGFyZyApOwoJCQkJCQkJfQoJCQkJCQl9ICk7CgkJCQkJfSApKCBhcmd1bWVudHMgKTsKCgkJCQkJaWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHsKCQkJCQkJZmlyZSgpOwoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdAoJCQlyZW1vdmU6IGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHsKCQkJCQl2YXIgaW5kZXg7CgkJCQkJd2hpbGUgKCAoIGluZGV4ID0galF1ZXJ5LmluQXJyYXkoIGFyZywgbGlzdCwgaW5kZXggKSApID4gLTEgKSB7CgkJCQkJCWxpc3Quc3BsaWNlKCBpbmRleCwgMSApOwoKCQkJCQkJLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCgkJCQkJCWlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7CgkJCQkJCQlmaXJpbmdJbmRleC0tOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgoJCQkvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LgoJCQkvLyBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IGxpc3QgaGFzIGNhbGxiYWNrcyBhdHRhY2hlZC4KCQkJaGFzOiBmdW5jdGlvbiggZm4gKSB7CgkJCQlyZXR1cm4gZm4gPwoJCQkJCWpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTEgOgoJCQkJCWxpc3QubGVuZ3RoID4gMDsKCQkJfSwKCgkJCS8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3QKCQkJZW1wdHk6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBsaXN0ICkgewoJCQkJCWxpc3QgPSBbXTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoKCQkJLy8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZAoJCQkvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnMKCQkJLy8gQ2xlYXIgYWxsIGNhbGxiYWNrcyBhbmQgdmFsdWVzCgkJCWRpc2FibGU6IGZ1bmN0aW9uKCkgewoJCQkJbG9ja2VkID0gcXVldWUgPSBbXTsKCQkJCWxpc3QgPSBtZW1vcnkgPSAiIjsKCQkJCXJldHVybiB0aGlzOwoJCQl9LAoJCQlkaXNhYmxlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gIWxpc3Q7CgkJCX0sCgoJCQkvLyBEaXNhYmxlIC5maXJlCgkJCS8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpCgkJCS8vIEFib3J0IGFueSBwZW5kaW5nIGV4ZWN1dGlvbnMKCQkJbG9jazogZnVuY3Rpb24oKSB7CgkJCQlsb2NrZWQgPSBxdWV1ZSA9IFtdOwoJCQkJaWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7CgkJCQkJbGlzdCA9IG1lbW9yeSA9ICIiOwoJCQkJfQoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCWxvY2tlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFsb2NrZWQ7CgkJCX0sCgoJCQkvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzCgkJCWZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHsKCQkJCWlmICggIWxvY2tlZCApIHsKCQkJCQlhcmdzID0gYXJncyB8fCBbXTsKCQkJCQlhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdOwoJCQkJCXF1ZXVlLnB1c2goIGFyZ3MgKTsKCQkJCQlpZiAoICFmaXJpbmcgKSB7CgkJCQkJCWZpcmUoKTsKCQkJCQl9CgkJCQl9CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCgkJCWZpcmU6IGZ1bmN0aW9uKCkgewoJCQkJc2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCgkJCS8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZQoJCQlmaXJlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFmaXJlZDsKCQkJfQoJCX07CgoJcmV0dXJuIHNlbGY7Cn07CgoKZnVuY3Rpb24gSWRlbnRpdHkoIHYgKSB7CglyZXR1cm4gdjsKfQpmdW5jdGlvbiBUaHJvd2VyKCBleCApIHsKCXRocm93IGV4Owp9CgpmdW5jdGlvbiBhZG9wdFZhbHVlKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0LCBub1ZhbHVlICkgewoJdmFyIG1ldGhvZDsKCgl0cnkgewoKCQkvLyBDaGVjayBmb3IgcHJvbWlzZSBhc3BlY3QgZmlyc3QgdG8gcHJpdmlsZWdlIHN5bmNocm9ub3VzIGJlaGF2aW9yCgkJaWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnByb21pc2UgKSApICkgewoJCQltZXRob2QuY2FsbCggdmFsdWUgKS5kb25lKCByZXNvbHZlICkuZmFpbCggcmVqZWN0ICk7CgoJCS8vIE90aGVyIHRoZW5hYmxlcwoJCX0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7CgkJCW1ldGhvZC5jYWxsKCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0ICk7CgoJCS8vIE90aGVyIG5vbi10aGVuYWJsZXMKCQl9IGVsc2UgewoKCQkJLy8gQ29udHJvbCBgcmVzb2x2ZWAgYXJndW1lbnRzIGJ5IGxldHRpbmcgQXJyYXkjc2xpY2UgY2FzdCBib29sZWFuIGBub1ZhbHVlYCB0byBpbnRlZ2VyOgoJCQkvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApCgkJCS8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpCgkJCXJlc29sdmUuYXBwbHkoIHVuZGVmaW5lZCwgWyB2YWx1ZSBdLnNsaWNlKCBub1ZhbHVlICkgKTsKCQl9CgoJLy8gRm9yIFByb21pc2VzL0ErLCBjb252ZXJ0IGV4Y2VwdGlvbnMgaW50byByZWplY3Rpb25zCgkvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluCgkvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLgoJfSBjYXRjaCAoIHZhbHVlICkgewoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5CgkJLy8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dAoJCXJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTsKCX0KfQoKalF1ZXJ5LmV4dGVuZCggewoKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgdHVwbGVzID0gWwoKCQkJCS8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBjYWxsYmFja3MsCgkJCQkvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdCgkJCQlbICJub3RpZnkiLCAicHJvZ3Jlc3MiLCBqUXVlcnkuQ2FsbGJhY2tzKCAibWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJtZW1vcnkiICksIDIgXSwKCQkJCVsgInJlc29sdmUiLCAiZG9uZSIsIGpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwKCQkJCQlqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksIDAsICJyZXNvbHZlZCIgXSwKCQkJCVsgInJlamVjdCIsICJmYWlsIiwgalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLAoJCQkJCWpRdWVyeS5DYWxsYmFja3MoICJvbmNlIG1lbW9yeSIgKSwgMSwgInJlamVjdGVkIiBdCgkJCV0sCgkJCXN0YXRlID0gInBlbmRpbmciLAoJCQlwcm9taXNlID0gewoJCQkJc3RhdGU6IGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiBzdGF0ZTsKCQkJCX0sCgkJCQlhbHdheXM6IGZ1bmN0aW9uKCkgewoJCQkJCWRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCQkJCSJjYXRjaCI6IGZ1bmN0aW9uKCBmbiApIHsKCQkJCQlyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApOwoJCQkJfSwKCgkJCQkvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0CgkJCQlwaXBlOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7CgkJCQkJdmFyIGZucyA9IGFyZ3VtZW50czsKCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoJCQkJCQlqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7CgoJCQkJCQkJLy8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpCgkJCQkJCQl2YXIgZm4gPSBpc0Z1bmN0aW9uKCBmbnNbIHR1cGxlWyA0IF0gXSApICYmIGZuc1sgdHVwbGVbIDQgXSBdOwoKCQkJCQkJCS8vIGRlZmVycmVkLnByb2dyZXNzKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLm5vdGlmeSB9KQoJCQkJCQkJLy8gZGVmZXJyZWQuZG9uZShmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZXNvbHZlIH0pCgkJCQkJCQkvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KQoJCQkJCQkJZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7CgkJCQkJCQkJdmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJCQkJCWlmICggcmV0dXJuZWQgJiYgaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkKCQkJCQkJCQkJCS5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICkKCQkJCQkJCQkJCS5kb25lKCBuZXdEZWZlci5yZXNvbHZlICkKCQkJCQkJCQkJCS5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQluZXdEZWZlclsgdHVwbGVbIDAgXSArICJXaXRoIiBdKAoJCQkJCQkJCQkJdGhpcywKCQkJCQkJCQkJCWZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzCgkJCQkJCQkJCSk7CgkJCQkJCQkJfQoJCQkJCQkJfSApOwoJCQkJCQl9ICk7CgkJCQkJCWZucyA9IG51bGw7CgkJCQkJfSApLnByb21pc2UoKTsKCQkJCX0sCgkJCQl0aGVuOiBmdW5jdGlvbiggb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIG9uUHJvZ3Jlc3MgKSB7CgkJCQkJdmFyIG1heERlcHRoID0gMDsKCQkJCQlmdW5jdGlvbiByZXNvbHZlKCBkZXB0aCwgZGVmZXJyZWQsIGhhbmRsZXIsIHNwZWNpYWwgKSB7CgkJCQkJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJCQkJCXZhciB0aGF0ID0gdGhpcywKCQkJCQkJCQlhcmdzID0gYXJndW1lbnRzLAoJCQkJCQkJCW1pZ2h0VGhyb3cgPSBmdW5jdGlvbigpIHsKCQkJCQkJCQkJdmFyIHJldHVybmVkLCB0aGVuOwoKCQkJCQkJCQkJLy8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjMKCQkJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTkKCQkJCQkJCQkJLy8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzCgkJCQkJCQkJCWlmICggZGVwdGggPCBtYXhEZXB0aCApIHsKCQkJCQkJCQkJCXJldHVybjsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJcmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7CgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xCgkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4CgkJCQkJCQkJCWlmICggcmV0dXJuZWQgPT09IGRlZmVycmVkLnByb21pc2UoKSApIHsKCQkJCQkJCQkJCXRocm93IG5ldyBUeXBlRXJyb3IoICJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iICk7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNQoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NAoJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC03NQoJCQkJCQkJCQkvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlCgkJCQkJCQkJCXRoZW4gPSByZXR1cm5lZCAmJgoKCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjQKCQkJCQkJCQkJCS8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0CgkJCQkJCQkJCQkvLyBPbmx5IGNoZWNrIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlbmFiaWxpdHkKCQkJCQkJCQkJCSggdHlwZW9mIHJldHVybmVkID09PSAib2JqZWN0IiB8fAoJCQkJCQkJCQkJCXR5cGVvZiByZXR1cm5lZCA9PT0gImZ1bmN0aW9uIiApICYmCgkJCQkJCQkJCQlyZXR1cm5lZC50aGVuOwoKCQkJCQkJCQkJLy8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGUKCQkJCQkJCQkJaWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7CgoJCQkJCQkJCQkJLy8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvbgoJCQkJCQkJCQkJaWYgKCBzcGVjaWFsICkgewoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICkKCQkJCQkJCQkJCQkpOwoKCQkJCQkJCQkJCS8vIE5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBhbHNvIGhvb2sgaW50byBwcm9ncmVzcwoJCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkJLy8gLi4uYW5kIGRpc3JlZ2FyZCBvbGRlciByZXNvbHV0aW9uIHZhbHVlcwoJCQkJCQkJCQkJCW1heERlcHRoKys7CgoJCQkJCQkJCQkJCXRoZW4uY2FsbCgKCQkJCQkJCQkJCQkJcmV0dXJuZWQsCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSwKCQkJCQkJCQkJCQkJcmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksCgkJCQkJCQkJCQkJCXJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksCgkJCQkJCQkJCQkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoICkKCQkJCQkJCQkJCQkpOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJLy8gSGFuZGxlIGFsbCBvdGhlciByZXR1cm5lZCB2YWx1ZXMKCQkJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJCQkvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0CgkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCWlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7CgkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQlhcmdzID0gWyByZXR1cm5lZCBdOwoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCS8vIFByb2Nlc3MgdGhlIHZhbHVlKHMpCgkJCQkJCQkJCQkvLyBEZWZhdWx0IHByb2Nlc3MgaXMgcmVzb2x2ZQoJCQkJCQkJCQkJKCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0sCgoJCQkJCQkJCS8vIE9ubHkgbm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGNhdGNoIGFuZCByZWplY3QgZXhjZXB0aW9ucwoJCQkJCQkJCXByb2Nlc3MgPSBzcGVjaWFsID8KCQkJCQkJCQkJbWlnaHRUaHJvdyA6CgkJCQkJCQkJCWZ1bmN0aW9uKCkgewoJCQkJCQkJCQkJdHJ5IHsKCQkJCQkJCQkJCQltaWdodFRocm93KCk7CgkJCQkJCQkJCQl9IGNhdGNoICggZSApIHsKCgkJCQkJCQkJCQkJaWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHsKCQkJCQkJCQkJCQkJalF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soIGUsCgkJCQkJCQkJCQkJCQlwcm9jZXNzLnN0YWNrVHJhY2UgKTsKCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCS8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy40LjEKCQkJCQkJCQkJCQkvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02MQoJCQkJCQkJCQkJCS8vIElnbm9yZSBwb3N0LXJlc29sdXRpb24gZXhjZXB0aW9ucwoJCQkJCQkJCQkJCWlmICggZGVwdGggKyAxID49IG1heERlcHRoICkgewoKCQkJCQkJCQkJCQkJLy8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dAoJCQkJCQkJCQkJCQkvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcikKCQkJCQkJCQkJCQkJaWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkgewoJCQkJCQkJCQkJCQkJdGhhdCA9IHVuZGVmaW5lZDsKCQkJCQkJCQkJCQkJCWFyZ3MgPSBbIGUgXTsKCQkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCX0KCQkJCQkJCQkJfTsKCgkJCQkJCQkvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMQoJCQkJCQkJLy8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTcKCQkJCQkJCS8vIFJlLXJlc29sdmUgcHJvbWlzZXMgaW1tZWRpYXRlbHkgdG8gZG9kZ2UgZmFsc2UgcmVqZWN0aW9uIGZyb20KCQkJCQkJCS8vIHN1YnNlcXVlbnQgZXJyb3JzCgkJCQkJCQlpZiAoIGRlcHRoICkgewoJCQkJCQkJCXByb2Nlc3MoKTsKCQkJCQkJCX0gZWxzZSB7CgoJCQkJCQkJCS8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIHN0YWNrLCBpbiBjYXNlIG9mIGV4Y2VwdGlvbgoJCQkJCQkJCS8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luYwoJCQkJCQkJCWlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHsKCQkJCQkJCQkJcHJvY2Vzcy5zdGFja1RyYWNlID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpOwoJCQkJCQkJCX0KCQkJCQkJCQl3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApOwoJCQkJCQkJfQoJCQkJCQl9OwoJCQkJCX0KCgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkgewoKCQkJCQkJLy8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKQoJCQkJCQl0dXBsZXNbIDAgXVsgMyBdLmFkZCgKCQkJCQkJCXJlc29sdmUoCgkJCQkJCQkJMCwKCQkJCQkJCQluZXdEZWZlciwKCQkJCQkJCQlpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgPwoJCQkJCQkJCQlvblByb2dyZXNzIDoKCQkJCQkJCQkJSWRlbnRpdHksCgkJCQkJCQkJbmV3RGVmZXIubm90aWZ5V2l0aAoJCQkJCQkJKQoJCQkJCQkpOwoKCQkJCQkJLy8gZnVsZmlsbGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAxIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25GdWxmaWxsZWQgKSA/CgkJCQkJCQkJCW9uRnVsZmlsbGVkIDoKCQkJCQkJCQkJSWRlbnRpdHkKCQkJCQkJCSkKCQkJCQkJKTsKCgkJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uICkKCQkJCQkJdHVwbGVzWyAyIF1bIDMgXS5hZGQoCgkJCQkJCQlyZXNvbHZlKAoJCQkJCQkJCTAsCgkJCQkJCQkJbmV3RGVmZXIsCgkJCQkJCQkJaXNGdW5jdGlvbiggb25SZWplY3RlZCApID8KCQkJCQkJCQkJb25SZWplY3RlZCA6CgkJCQkJCQkJCVRocm93ZXIKCQkJCQkJCSkKCQkJCQkJKTsKCQkJCQl9ICkucHJvbWlzZSgpOwoJCQkJfSwKCgkJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCgkJCQkvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0CgkJCQlwcm9taXNlOiBmdW5jdGlvbiggb2JqICkgewoJCQkJCXJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTsKCQkJCX0KCQkJfSwKCQkJZGVmZXJyZWQgPSB7fTsKCgkJLy8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kcwoJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsKCQkJdmFyIGxpc3QgPSB0dXBsZVsgMiBdLAoJCQkJc3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdOwoKCQkJLy8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkCgkJCS8vIHByb21pc2UuZmFpbCA9IGxpc3QuYWRkCgkJCXByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkOwoKCQkJLy8gSGFuZGxlIHN0YXRlCgkJCWlmICggc3RhdGVTdHJpbmcgKSB7CgkJCQlsaXN0LmFkZCgKCQkJCQlmdW5jdGlvbigpIHsKCgkJCQkJCS8vIHN0YXRlID0gInJlc29sdmVkIiAoaS5lLiwgZnVsZmlsbGVkKQoJCQkJCQkvLyBzdGF0ZSA9ICJyZWplY3RlZCIKCQkJCQkJc3RhdGUgPSBzdGF0ZVN0cmluZzsKCQkJCQl9LAoKCQkJCQkvLyByZWplY3RlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCS8vIGZ1bGZpbGxlZF9jYWxsYmFja3MuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMiBdLmRpc2FibGUsCgoJCQkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGUKCQkJCQkvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZQoJCQkJCXR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsCgoJCQkJCS8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDIgXS5sb2NrLAoKCQkJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5sb2NrCgkJCQkJdHVwbGVzWyAwIF1bIDMgXS5sb2NrCgkJCQkpOwoJCQl9CgoJCQkvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlCgkJCS8vIGZ1bGZpbGxlZF9oYW5kbGVycy5maXJlCgkJCS8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmUKCQkJbGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApOwoKCQkJLy8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9CgkJCS8vIGRlZmVycmVkLnJlamVjdCA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZWplY3RXaXRoKC4uLikgfQoJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7CgkJCQlkZWZlcnJlZFsgdHVwbGVbIDAgXSArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX07CgoJCQkvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aAoJCQkvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJLy8gZGVmZXJyZWQucmVqZWN0V2l0aCA9IGxpc3QuZmlyZVdpdGgKCQkJZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7CgkJfSApOwoKCQkvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2UKCQlwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7CgoJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKCQlpZiAoIGZ1bmMgKSB7CgkJCWZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CgkJfQoKCQkvLyBBbGwgZG9uZSEKCQlyZXR1cm4gZGVmZXJyZWQ7Cgl9LAoKCS8vIERlZmVycmVkIGhlbHBlcgoJd2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkgewoJCXZhcgoKCQkJLy8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzCgkJCXJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsCgoJCQkvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHMKCQkJaSA9IHJlbWFpbmluZywKCgkJCS8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGEKCQkJcmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSwKCQkJcmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAoKCQkJLy8gdGhlIG1hc3RlciBEZWZlcnJlZAoJCQltYXN0ZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSwKCgkJCS8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3RvcnkKCQkJdXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpICkgewoJCQkJcmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7CgkJCQkJcmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlOwoJCQkJCWlmICggISggLS1yZW1haW5pbmcgKSApIHsKCQkJCQkJbWFzdGVyLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTsKCQkJCQl9CgkJCQl9OwoJCQl9OwoKCQkvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmUKCQlpZiAoIHJlbWFpbmluZyA8PSAxICkgewoJCQlhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsCgkJCQkhcmVtYWluaW5nICk7CgoJCQkvLyBVc2UgLnRoZW4oKSB0byB1bndyYXAgc2Vjb25kYXJ5IHRoZW5hYmxlcyAoY2YuIGdoLTMwMDApCgkJCWlmICggbWFzdGVyLnN0YXRlKCkgPT09ICJwZW5kaW5nIiB8fAoJCQkJaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7CgoJCQkJcmV0dXJuIG1hc3Rlci50aGVuKCk7CgkJCX0KCQl9CgoJCS8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzCgkJd2hpbGUgKCBpLS0gKSB7CgkJCWFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7CgkJfQoKCQlyZXR1cm4gbWFzdGVyLnByb21pc2UoKTsKCX0KfSApOwoKCi8vIFRoZXNlIHVzdWFsbHkgaW5kaWNhdGUgYSBwcm9ncmFtbWVyIG1pc3Rha2UgZHVyaW5nIGRldmVsb3BtZW50LAovLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC4KdmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87CgpqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7CgoJLy8gU3VwcG9ydDogSUUgOCAtIDkgb25seQoJLy8gQ29uc29sZSBleGlzdHMgd2hlbiBkZXYgdG9vbHMgYXJlIG9wZW4sIHdoaWNoIGNhbiBoYXBwZW4gYXQgYW55IHRpbWUKCWlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7CgkJd2luZG93LmNvbnNvbGUud2FybiggImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTsKCX0KfTsKCgoKCmpRdWVyeS5yZWFkeUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKCBlcnJvciApIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQl0aHJvdyBlcnJvcjsKCX0gKTsKfTsKCgoKCi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeQp2YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7CgpqUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7CgoJcmVhZHlMaXN0CgkJLnRoZW4oIGZuICkKCgkJLy8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXAKCQkvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2sKCQkvLyByZWdpc3RyYXRpb24uCgkJLmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7CgkJCWpRdWVyeS5yZWFkeUV4Y2VwdGlvbiggZXJyb3IgKTsKCQl9ICk7CgoJcmV0dXJuIHRoaXM7Cn07CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy4KCWlzUmVhZHk6IGZhbHNlLAoKCS8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmUKCS8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxCglyZWFkeVdhaXQ6IDEsCgoJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQoJcmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkgewoKCQkvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5CgkJaWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKCgkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUKCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCXJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTsKCX0KfSApOwoKalF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjsKCi8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kCmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHsKCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgY29tcGxldGVkICk7Cgl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKCWpRdWVyeS5yZWFkeSgpOwp9CgovLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZAovLyBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seQovLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyAiaW50ZXJhY3RpdmUiIHRvbyBzb29uCmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiB8fAoJKCBkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAibG9hZGluZyIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkgewoKCS8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQoJd2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApOwoKfSBlbHNlIHsKCgkvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGNvbXBsZXRlZCApOwoKCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBjb21wbGV0ZWQgKTsKfQoKCgoKLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uCi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvbgp2YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkgewoJdmFyIGkgPSAwLAoJCWxlbiA9IGVsZW1zLmxlbmd0aCwKCQlidWxrID0ga2V5ID09IG51bGw7CgoJLy8gU2V0cyBtYW55IHZhbHVlcwoJaWYgKCB0b1R5cGUoIGtleSApID09PSAib2JqZWN0IiApIHsKCQljaGFpbmFibGUgPSB0cnVlOwoJCWZvciAoIGkgaW4ga2V5ICkgewoJCQlhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTsKCQl9CgoJLy8gU2V0cyBvbmUgdmFsdWUKCX0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJY2hhaW5hYmxlID0gdHJ1ZTsKCgkJaWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmF3ID0gdHJ1ZTsKCQl9CgoJCWlmICggYnVsayApIHsKCgkJCS8vIEJ1bGsgb3BlcmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldAoJCQlpZiAoIHJhdyApIHsKCQkJCWZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOwoJCQkJZm4gPSBudWxsOwoKCQkJLy8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlcwoJCQl9IGVsc2UgewoJCQkJYnVsayA9IGZuOwoJCQkJZm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTsKCQkJCX07CgkJCX0KCQl9CgoJCWlmICggZm4gKSB7CgkJCWZvciAoIDsgaSA8IGxlbjsgaSsrICkgewoJCQkJZm4oCgkJCQkJZWxlbXNbIGkgXSwga2V5LCByYXcgPwoJCQkJCXZhbHVlIDoKCQkJCQl2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKQoJCQkJKTsKCQkJfQoJCX0KCX0KCglpZiAoIGNoYWluYWJsZSApIHsKCQlyZXR1cm4gZWxlbXM7Cgl9CgoJLy8gR2V0cwoJaWYgKCBidWxrICkgewoJCXJldHVybiBmbi5jYWxsKCBlbGVtcyApOwoJfQoKCXJldHVybiBsZW4gPyBmbiggZWxlbXNbIDAgXSwga2V5ICkgOiBlbXB0eUdldDsKfTsKCgovLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcKdmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sCglyZGFzaEFscGhhID0gLy0oW2Etel0pL2c7CgovLyBVc2VkIGJ5IGNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKCkKZnVuY3Rpb24gZmNhbWVsQ2FzZSggYWxsLCBsZXR0ZXIgKSB7CglyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7Cn0KCi8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXMKLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQovLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCmZ1bmN0aW9uIGNhbWVsQ2FzZSggc3RyaW5nICkgewoJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwp9CnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkgewoKCS8vIEFjY2VwdHMgb25seToKCS8vICAtIE5vZGUKCS8vICAgIC0gTm9kZS5FTEVNRU5UX05PREUKCS8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFCgkvLyAgLSBPYmplY3QKCS8vICAgIC0gQW55CglyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7Cn07CgoKCgpmdW5jdGlvbiBEYXRhKCkgewoJdGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrOwp9CgpEYXRhLnVpZCA9IDE7CgpEYXRhLnByb3RvdHlwZSA9IHsKCgljYWNoZTogZnVuY3Rpb24oIG93bmVyICkgewoKCQkvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGUKCQl2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCS8vIElmIG5vdCwgY3JlYXRlIG9uZQoJCWlmICggIXZhbHVlICkgewoJCQl2YWx1ZSA9IHt9OwoKCQkJLy8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsCgkJCS8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuCgkJCS8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LgoJCQlpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7CgoJCQkJLy8gSWYgaXQgaXMgYSBub2RlIHVubGlrZWx5IHRvIGJlIHN0cmluZ2lmeS1lZCBvciBsb29wZWQgb3ZlcgoJCQkJLy8gdXNlIHBsYWluIGFzc2lnbm1lbnQKCQkJCWlmICggb3duZXIubm9kZVR5cGUgKSB7CgkJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7CgoJCQkJLy8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5CgkJCQkvLyBjb25maWd1cmFibGUgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZQoJCQkJLy8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZAoJCQkJfSBlbHNlIHsKCQkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHsKCQkJCQkJdmFsdWU6IHZhbHVlLAoJCQkJCQljb25maWd1cmFibGU6IHRydWUKCQkJCQl9ICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB2YWx1ZTsKCX0sCglzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7CgkJdmFyIHByb3AsCgkJCWNhY2hlID0gdGhpcy5jYWNoZSggb3duZXIgKTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJncwoJCS8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1NykKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCQkJY2FjaGVbIGNhbWVsQ2FzZSggZGF0YSApIF0gPSB2YWx1ZTsKCgkJLy8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3MKCQl9IGVsc2UgewoKCQkJLy8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUtYnktb25lIHRvIHRoZSBjYWNoZSBvYmplY3QKCQkJZm9yICggcHJvcCBpbiBkYXRhICkgewoJCQkJY2FjaGVbIGNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07CgkJCX0KCQl9CgkJcmV0dXJuIGNhY2hlOwoJfSwKCWdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7CgkJcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcy5jYWNoZSggb3duZXIgKSA6CgoJCQkvLyBBbHdheXMgdXNlIGNhbWVsQ2FzZSBrZXkgKGdoLTIyNTcpCgkJCW93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGNhbWVsQ2FzZSgga2V5ICkgXTsKCX0sCglhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHsKCgkJLy8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZAoJCS8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZAoJCS8vCgkJLy8gVGFrZSB0aGUgInJlYWQiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZQoJCS8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjoKCQkvLwoJCS8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3QKCQkvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5CgkJLy8KCQlpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8CgkJCQkoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApICkgewoKCQkJcmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7CgkJfQoKCQkvLyBXaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZQoJCS8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOgoJCS8vCgkJLy8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllcwoJCS8vICAgMi4gQSBrZXkgYW5kIHZhbHVlCgkJLy8KCQl0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTsKCgkJLy8gU2luY2UgdGhlICJzZXQiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50cwoJCS8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXQoJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7Cgl9LAoJcmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHsKCQl2YXIgaSwKCQkJY2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07CgoJCWlmICggY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHsKCgkJCS8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzCgkJCWlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7CgoJCQkJLy8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi4KCQkJCS8vIFdlIGFsd2F5cyBzZXQgY2FtZWxDYXNlIGtleXMsIHNvIHJlbW92ZSB0aGF0LgoJCQkJa2V5ID0ga2V5Lm1hcCggY2FtZWxDYXNlICk7CgkJCX0gZWxzZSB7CgkJCQlrZXkgPSBjYW1lbENhc2UoIGtleSApOwoKCQkJCS8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC4KCQkJCS8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlCgkJCQlrZXkgPSBrZXkgaW4gY2FjaGUgPwoJCQkJCVsga2V5IF0gOgoJCQkJCSgga2V5Lm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10gKTsKCQkJfQoKCQkJaSA9IGtleS5sZW5ndGg7CgoJCQl3aGlsZSAoIGktLSApIHsKCQkJCWRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTsKCQkJfQoJCX0KCgkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHsKCgkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUKCQkJLy8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXMKCQkJLy8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZAoJCQkvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzg2MDcgKGJ1ZyByZXN0cmljdGVkKQoJCQlpZiAoIG93bmVyLm5vZGVUeXBlICkgewoJCQkJb3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQl9IGVsc2UgewoJCQkJZGVsZXRlIG93bmVyWyB0aGlzLmV4cGFuZG8gXTsKCQkJfQoJCX0KCX0sCgloYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7CgkJdmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdOwoJCXJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTsKCX0KfTsKdmFyIGRhdGFQcml2ID0gbmV3IERhdGEoKTsKCnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7CgoKCi8vCUltcGxlbWVudGF0aW9uIFN1bW1hcnkKLy8KLy8JMS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaAovLwkyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcgdGhlIHN0b3JhZ2UKLy8JCXBhdGhzIHRvIGEgc2luZ2xlIG1lY2hhbmlzbS4KLy8JMy4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCAicHJpdmF0ZSIgYW5kICJ1c2VyIiBkYXRhLgovLwk0LiBfTmV2ZXJfIGV4cG9zZSAicHJpdmF0ZSIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKQovLwk1LiBBdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9uIHVzZXIgb2JqZWN0cyAoZWcuIGV4cGFuZG8gcHJvcGVydGllcykKLy8JNi4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0Cgp2YXIgcmJyYWNlID0gL14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLywKCXJtdWx0aURhc2ggPSAvW0EtWl0vZzsKCmZ1bmN0aW9uIGdldERhdGEoIGRhdGEgKSB7CglpZiAoIGRhdGEgPT09ICJ0cnVlIiApIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglpZiAoIGRhdGEgPT09ICJmYWxzZSIgKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWlmICggZGF0YSA9PT0gIm51bGwiICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nCglpZiAoIGRhdGEgPT09ICtkYXRhICsgIiIgKSB7CgkJcmV0dXJuICtkYXRhOwoJfQoKCWlmICggcmJyYWNlLnRlc3QoIGRhdGEgKSApIHsKCQlyZXR1cm4gSlNPTi5wYXJzZSggZGF0YSApOwoJfQoKCXJldHVybiBkYXRhOwp9CgpmdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkgewoJdmFyIG5hbWU7CgoJLy8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueQoJLy8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlCglpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCW5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJCYiICkudG9Mb3dlckNhc2UoKTsKCQlkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJaWYgKCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgKSB7CgkJCXRyeSB7CgkJCQlkYXRhID0gZ2V0RGF0YSggZGF0YSApOwoJCQl9IGNhdGNoICggZSApIHt9CgoJCQkvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKCQkJZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTsKCQl9IGVsc2UgewoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCX0KCXJldHVybiBkYXRhOwp9CgpqUXVlcnkuZXh0ZW5kKCB7CgloYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTsKCX0sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJcmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQlkYXRhVXNlci5yZW1vdmUoIGVsZW0sIG5hbWUgKTsKCX0sCgoJLy8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWQKCS8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLgoJX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgewoJCXJldHVybiBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTsKCX0sCgoJX3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgaSwgbmFtZSwgZGF0YSwKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJYXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlczsKCgkJLy8gR2V0cyBhbGwgdmFsdWVzCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0gKTsKCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFQcml2LmdldCggZWxlbSwgImhhc0RhdGFBdHRycyIgKSApIHsKCQkJCQlpID0gYXR0cnMubGVuZ3RoOwoJCQkJCXdoaWxlICggaS0tICkgewoKCQkJCQkJLy8gU3VwcG9ydDogSUUgMTEgb25seQoJCQkJCQkvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NCkKCQkJCQkJaWYgKCBhdHRyc1sgaSBdICkgewoJCQkJCQkJbmFtZSA9IGF0dHJzWyBpIF0ubmFtZTsKCQkJCQkJCWlmICggbmFtZS5pbmRleE9mKCAiZGF0YS0iICkgPT09IDAgKSB7CgkJCQkJCQkJbmFtZSA9IGNhbWVsQ2FzZSggbmFtZS5zbGljZSggNSApICk7CgkJCQkJCQkJZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5hbWUgXSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImhhc0RhdGFBdHRycyIsIHRydWUgKTsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgkJfQoKCQkvLyBTZXRzIG11bHRpcGxlIHZhbHVlcwoJCWlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQkJZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTsKCQkJfSApOwoJCX0KCgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQl2YXIgZGF0YTsKCgkJCS8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5CgkJCS8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlCgkJCS8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0CgkJCS8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGwKCQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS4KCQkJaWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgoJCQkJLy8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZQoJCQkJLy8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGEKCQkJCWRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gQXR0ZW1wdCB0byAiZGlzY292ZXIiIHRoZSBkYXRhIGluCgkJCQkvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzCgkJCQlkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApOwoJCQkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIGRhdGE7CgkJCQl9CgoJCQkJLy8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LgoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBTZXQgdGhlIGRhdGEuLi4KCQkJdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCgkJCQkvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5CgkJCQlkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSApOwoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApOwoJCX0gKTsKCX0KfSApOwoKCmpRdWVyeS5leHRlbmQoIHsKCXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHsKCQl2YXIgcXVldWU7CgoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9ICggdHlwZSB8fCAiZngiICkgKyAicXVldWUiOwoJCQlxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApOwoKCQkJLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cAoJCQlpZiAoIGRhdGEgKSB7CgkJCQlpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7CgkJCQkJcXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQlxdWV1ZS5wdXNoKCBkYXRhICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHF1ZXVlIHx8IFtdOwoJCX0KCX0sCgoJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJdmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksCgkJCXN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLAoJCQlmbiA9IHF1ZXVlLnNoaWZ0KCksCgkJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksCgkJCW5leHQgPSBmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7CgkJCX07CgoJCS8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWwKCQlpZiAoIGZuID09PSAiaW5wcm9ncmVzcyIgKSB7CgkJCWZuID0gcXVldWUuc2hpZnQoKTsKCQkJc3RhcnRMZW5ndGgtLTsKCQl9CgoJCWlmICggZm4gKSB7CgoJCQkvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCgkJCS8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWQKCQkJaWYgKCB0eXBlID09PSAiZngiICkgewoJCQkJcXVldWUudW5zaGlmdCggImlucHJvZ3Jlc3MiICk7CgkJCX0KCgkJCS8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb24KCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCWZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7CgkJfQoKCQlpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHsKCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCX0KCX0sCgoJLy8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmUKCV9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQl2YXIga2V5ID0gdHlwZSArICJxdWV1ZUhvb2tzIjsKCQlyZXR1cm4gZGF0YVByaXYuZ2V0KCBlbGVtLCBrZXkgKSB8fCBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwgewoJCQllbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLmFkZCggZnVuY3Rpb24oKSB7CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArICJxdWV1ZSIsIGtleSBdICk7CgkJCX0gKQoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXZhciBzZXR0ZXIgPSAyOwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZGF0YSA9IHR5cGU7CgkJCXR5cGUgPSAiZngiOwoJCQlzZXR0ZXItLTsKCQl9CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHsKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7CgkJfQoKCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID8KCQkJdGhpcyA6CgkJCXRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKCgkJCQkvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZQoJCQkJalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7CgoJCQkJaWYgKCB0eXBlID09PSAiZngiICYmIHF1ZXVlWyAwIF0gIT09ICJpbnByb2dyZXNzIiApIHsKCQkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQkJfQoJCQl9ICk7Cgl9LAoJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSApOwoJfSwKCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7Cgl9LAoKCS8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGUKCS8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KQoJcHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHsKCQl2YXIgdG1wLAoJCQljb3VudCA9IDEsCgkJCWRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWVsZW1lbnRzID0gdGhpcywKCQkJaSA9IHRoaXMubGVuZ3RoLAoJCQlyZXNvbHZlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCQlkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApOwoJCQkJfQoJCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJb2JqID0gdHlwZTsKCQkJdHlwZSA9IHVuZGVmaW5lZDsKCQl9CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJd2hpbGUgKCBpLS0gKSB7CgkJCXRtcCA9IGRhdGFQcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhvb2tzIiApOwoJCQlpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7CgkJCQljb3VudCsrOwoJCQkJdG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOwoJCQl9CgkJfQoJCXJlc29sdmUoKTsKCQlyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7Cgl9Cn0gKTsKdmFyIHBudW0gPSAoIC9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8gKS5zb3VyY2U7Cgp2YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoICJeKD86KFsrLV0pPXwpKCIgKyBwbnVtICsgIikoW2EteiVdKikkIiwgImkiICk7CgoKdmFyIGNzc0V4cGFuZCA9IFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIgXTsKCnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7CgoJCS8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uOwoJCS8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudAoJCWVsZW0gPSBlbCB8fCBlbGVtOwoKCQkvLyBJbmxpbmUgc3R5bGUgdHJ1bXBzIGFsbAoJCXJldHVybiBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fAoJCQllbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmCgoJCQkvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlCgkJCS8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1CgkJCS8vIERpc2Nvbm5lY3RlZCBlbGVtZW50cyBjYW4gaGF2ZSBjb21wdXRlZCBkaXNwbGF5OiBub25lLCBzbyBmaXJzdCBjb25maXJtIHRoYXQgZWxlbSBpcwoJCQkvLyBpbiB0aGUgZG9jdW1lbnQuCgkJCWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgJiYKCgkJCWpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAibm9uZSI7Cgl9OwoKdmFyIHN3YXAgPSBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2ssIGFyZ3MgKSB7Cgl2YXIgcmV0LCBuYW1lLAoJCW9sZCA9IHt9OwoKCS8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCW9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOwoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKCX0KCglyZXQgPSBjYWxsYmFjay5hcHBseSggZWxlbSwgYXJncyB8fCBbXSApOwoKCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcwoJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJfQoKCXJldHVybiByZXQ7Cn07CgoKCgpmdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkgewoJdmFyIGFkanVzdGVkLCBzY2FsZSwKCQltYXhJdGVyYXRpb25zID0gMjAsCgkJY3VycmVudFZhbHVlID0gdHdlZW4gPwoJCQlmdW5jdGlvbigpIHsKCQkJCXJldHVybiB0d2Vlbi5jdXIoKTsKCQkJfSA6CgkJCWZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsICIiICk7CgkJCX0sCgkJaW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLAoJCXVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApLAoKCQkvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlcwoJCWluaXRpYWxJblVuaXQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSAicHgiICYmICtpbml0aWFsICkgJiYKCQkJcmNzc051bS5leGVjKCBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wICkgKTsKCglpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5pdGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkgewoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTQKCQkvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpCgkJaW5pdGlhbCA9IGluaXRpYWwgLyAyOwoKCQkvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzCgkJdW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdOwoKCQkvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludAoJCWluaXRpYWxJblVuaXQgPSAraW5pdGlhbCB8fCAxOwoKCQl3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHsKCgkJCS8vIEV2YWx1YXRlIGFuZCB1cGRhdGUgb3VyIGJlc3QgZ3Vlc3MgKGRvdWJsaW5nIGd1ZXNzZXMgdGhhdCB6ZXJvIG91dCkuCgkJCS8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS4KCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApOwoJCQlpZiAoICggMSAtIHNjYWxlICkgKiAoIDEgLSAoIHNjYWxlID0gY3VycmVudFZhbHVlKCkgLyBpbml0aWFsIHx8IDAuNSApICkgPD0gMCApIHsKCQkJCW1heEl0ZXJhdGlvbnMgPSAwOwoJCQl9CgkJCWluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7CgoJCX0KCgkJaW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgKiAyOwoJCWpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTsKCgkJLy8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvbgoJCXZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdOwoJfQoKCWlmICggdmFsdWVQYXJ0cyApIHsKCQlpbml0aWFsSW5Vbml0ID0gK2luaXRpYWxJblVuaXQgfHwgK2luaXRpYWwgfHwgMDsKCgkJLy8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkCgkJYWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gPwoJCQlpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOgoJCQkrdmFsdWVQYXJ0c1sgMiBdOwoJCWlmICggdHdlZW4gKSB7CgkJCXR3ZWVuLnVuaXQgPSB1bml0OwoJCQl0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7CgkJCXR3ZWVuLmVuZCA9IGFkanVzdGVkOwoJCX0KCX0KCXJldHVybiBhZGp1c3RlZDsKfQoKCnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9OwoKZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7Cgl2YXIgdGVtcCwKCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsCgkJbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLAoJCWRpc3BsYXkgPSBkZWZhdWx0RGlzcGxheU1hcFsgbm9kZU5hbWUgXTsKCglpZiAoIGRpc3BsYXkgKSB7CgkJcmV0dXJuIGRpc3BsYXk7Cgl9CgoJdGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApOwoJZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsICJkaXNwbGF5IiApOwoKCXRlbXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGVtcCApOwoKCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCWRpc3BsYXkgPSAiYmxvY2siOwoJfQoJZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5OwoKCXJldHVybiBkaXNwbGF5Owp9CgpmdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7Cgl2YXIgZGlzcGxheSwgZWxlbSwKCQl2YWx1ZXMgPSBbXSwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOwoKCS8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZQoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQllbGVtID0gZWxlbWVudHNbIGluZGV4IF07CgkJaWYgKCAhZWxlbS5zdHlsZSApIHsKCQkJY29udGludWU7CgkJfQoKCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5OwoJCWlmICggc2hvdyApIHsKCgkJCS8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdykKCQkJLy8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyCgkJCS8vIGlubGluZSBvciBhYm91dC10by1iZS1yZXN0b3JlZCkKCQkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgKSB7CgkJCQl2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJkaXNwbGF5IiApIHx8IG51bGw7CgkJCQlpZiAoICF2YWx1ZXNbIGluZGV4IF0gKSB7CgkJCQkJZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJCQl9CgkJCX0KCQkJaWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICggZGlzcGxheSAhPT0gIm5vbmUiICkgewoJCQkJdmFsdWVzWyBpbmRleCBdID0gIm5vbmUiOwoKCQkJCS8vIFJlbWVtYmVyIHdoYXQgd2UncmUgb3ZlcndyaXRpbmcKCQkJCWRhdGFQcml2LnNldCggZWxlbSwgImRpc3BsYXkiLCBkaXNwbGF5ICk7CgkJCX0KCQl9Cgl9CgoJLy8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvdwoJZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlpZiAoIHZhbHVlc1sgaW5kZXggXSAhPSBudWxsICkgewoJCQllbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdOwoJCX0KCX0KCglyZXR1cm4gZWxlbWVudHM7Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCXNob3c6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApOwoJfSwKCWhpZGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBzaG93SGlkZSggdGhpcyApOwoJfSwKCXRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkgewoJCWlmICggdHlwZW9mIHN0YXRlID09PSAiYm9vbGVhbiIgKSB7CgkJCXJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJaWYgKCBpc0hpZGRlbldpdGhpblRyZWUoIHRoaXMgKSApIHsKCQkJCWpRdWVyeSggdGhpcyApLnNob3coKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeSggdGhpcyApLmhpZGUoKTsKCQkJfQoJCX0gKTsKCX0KfSApOwp2YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7Cgp2YXIgcnRhZ05hbWUgPSAoIC88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0rKS9pICk7Cgp2YXIgcnNjcmlwdFR5cGUgPSAoIC9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApOwoKCgovLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKQp2YXIgd3JhcE1hcCA9IHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJb3B0aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKCgkvLyBYSFRNTCBwYXJzZXJzIGRvIG5vdCBtYWdpY2FsbHkgaW5zZXJ0IGVsZW1lbnRzIGluIHRoZQoJLy8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlbgoJLy8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9yIG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLgoJdGhlYWQ6IFsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0sCgljb2w6IFsgMiwgIjx0YWJsZT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCgl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKCXRkOiBbIDMsICI8dGFibGU+PHRib2R5Pjx0cj4iLCAiPC90cj48L3Rib2R5PjwvdGFibGU+IiBdLAoKCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCn07CgovLyBTdXBwb3J0OiBJRSA8PTkgb25seQp3cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247Cgp3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwp3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKCgpmdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHsKCgkvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5CgkvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpCgl2YXIgcmV0OwoKCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCXJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSAidW5kZWZpbmVkIiApIHsKCQlyZXQgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCAiKiIgKTsKCgl9IGVsc2UgewoJCXJldCA9IFtdOwoJfQoKCWlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHsKCQlyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7Cgl9CgoJcmV0dXJuIHJldDsKfQoKCi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZApmdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7Cgl2YXIgaSA9IDAsCgkJbCA9IGVsZW1zLmxlbmd0aDsKCglmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJZGF0YVByaXYuc2V0KAoJCQllbGVtc1sgaSBdLAoJCQkiZ2xvYmFsRXZhbCIsCgkJCSFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sICJnbG9iYWxFdmFsIiApCgkJKTsKCX0KfQoKCnZhciByaHRtbCA9IC88fCYjP1x3KzsvOwoKZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHsKCXZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosCgkJZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlub2RlcyA9IFtdLAoJCWkgPSAwLAoJCWwgPSBlbGVtcy5sZW5ndGg7CgoJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCWVsZW0gPSBlbGVtc1sgaSBdOwoKCQlpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHsKCgkJCS8vIEFkZCBub2RlcyBkaXJlY3RseQoJCQlpZiAoIHRvVHlwZSggZWxlbSApID09PSAib2JqZWN0IiApIHsKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTsKCgkJCS8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZQoJCQl9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkgewoJCQkJbm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7CgoJCQkvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXMKCQkJfSBlbHNlIHsKCQkJCXRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBlbmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCAiZGl2IiApICk7CgoJCQkJLy8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvbgoJCQkJdGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTsKCQkJCXdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0OwoJCQkJdG1wLmlubmVySFRNTCA9IHdyYXBbIDEgXSArIGpRdWVyeS5odG1sUHJlZmlsdGVyKCBlbGVtICkgKyB3cmFwWyAyIF07CgoJCQkJLy8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50CgkJCQlqID0gd3JhcFsgMCBdOwoJCQkJd2hpbGUgKCBqLS0gKSB7CgkJCQkJdG1wID0gdG1wLmxhc3RDaGlsZDsKCQkJCX0KCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHkKCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCWpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7CgoJCQkJLy8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXIKCQkJCXRtcCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CgoJCQkJLy8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKQoJCQkJdG1wLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9Cgl9CgoJLy8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudAoJZnJhZ21lbnQudGV4dENvbnRlbnQgPSAiIjsKCglpID0gMDsKCXdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7CgoJCS8vIFNraXAgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29udGV4dCBjb2xsZWN0aW9uICh0cmFjLTQwODcpCgkJaWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApID4gLTEgKSB7CgkJCWlmICggaWdub3JlZCApIHsKCQkJCWlnbm9yZWQucHVzaCggZWxlbSApOwoJCQl9CgkJCWNvbnRpbnVlOwoJCX0KCgkJY29udGFpbnMgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBBcHBlbmQgdG8gZnJhZ21lbnQKCQl0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksICJzY3JpcHQiICk7CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlpZiAoIGNvbnRhaW5zICkgewoJCQlzZXRHbG9iYWxFdmFsKCB0bXAgKTsKCQl9CgoJCS8vIENhcHR1cmUgZXhlY3V0YWJsZXMKCQlpZiAoIHNjcmlwdHMgKSB7CgkJCWogPSAwOwoJCQl3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHsKCQkJCWlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8ICIiICkgKSB7CgkJCQkJc2NyaXB0cy5wdXNoKCBlbGVtICk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIGZyYWdtZW50Owp9CgoKKCBmdW5jdGlvbigpIHsKCXZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKCQlkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSApLAoJCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHkKCS8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpCgkvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpCgkvLyBgbmFtZWAgYW5kIGB0eXBlYCBtdXN0IHVzZSAuc2V0QXR0cmlidXRlIGZvciBXV0EgKCMxNDkwMSkKCWlucHV0LnNldEF0dHJpYnV0ZSggInR5cGUiLCAicmFkaW8iICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgImNoZWNrZWQiICk7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJuYW1lIiwgInQiICk7CgoJZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOwoKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgb25seQoJLy8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzCglzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZAoJZGl2LmlubmVySFRNTCA9ICI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IjsKCXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlOwp9ICkoKTsKdmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCgoKdmFyCglya2V5RXZlbnQgPSAvXmtleS8sCglybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLywKCXJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XC4oLispfCkvOwoKZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKCXJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsKCXJldHVybiBmYWxzZTsKfQoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvCmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkgewoJdHJ5IHsKCQlyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCX0gY2F0Y2ggKCBlcnIgKSB7IH0KfQoKZnVuY3Rpb24gb24oIGVsZW0sIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIG9uZSApIHsKCXZhciBvcmlnRm4sIHR5cGU7CgoJLy8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzCglpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7CgoJCS8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApCgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKQoJCQlkYXRhID0gZGF0YSB8fCBzZWxlY3RvcjsKCQkJc2VsZWN0b3IgPSB1bmRlZmluZWQ7CgkJfQoJCWZvciAoIHR5cGUgaW4gdHlwZXMgKSB7CgkJCW9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7CgkJfQoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7CgoJCS8vICggdHlwZXMsIGZuICkKCQlmbiA9IHNlbGVjdG9yOwoJCWRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDsKCX0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7CgkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgewoKCQkJLy8gKCB0eXBlcywgc2VsZWN0b3IsIGZuICkKCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0gZWxzZSB7CgoJCQkvLyAoIHR5cGVzLCBkYXRhLCBmbiApCgkJCWZuID0gZGF0YTsKCQkJZGF0YSA9IHNlbGVjdG9yOwoJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsKCQl9Cgl9CglpZiAoIGZuID09PSBmYWxzZSApIHsKCQlmbiA9IHJldHVybkZhbHNlOwoJfSBlbHNlIGlmICggIWZuICkgewoJCXJldHVybiBlbGVtOwoJfQoKCWlmICggb25lID09PSAxICkgewoJCW9yaWdGbiA9IGZuOwoJCWZuID0gZnVuY3Rpb24oIGV2ZW50ICkgewoKCQkJLy8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvCgkJCWpRdWVyeSgpLm9mZiggZXZlbnQgKTsKCQkJcmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfTsKCgkJLy8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm4KCQlmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTsKCX0KCXJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkgewoJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTsKCX0gKTsKfQoKLyoKICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgogKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLgogKi8KalF1ZXJ5LmV2ZW50ID0gewoKCWdsb2JhbDoge30sCgoJYWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkgewoKCQl2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsCgkJCWV2ZW50cywgdCwgaGFuZGxlT2JqLAoJCQlzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsCgkJCWVsZW1EYXRhID0gZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCS8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpCgkJaWYgKCAhZWxlbURhdGEgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlcgoJCWlmICggaGFuZGxlci5oYW5kbGVyICkgewoJCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7CgkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOwoJCQlzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yOwoJCX0KCgkJLy8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZQoJCS8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KQoJCWlmICggc2VsZWN0b3IgKSB7CgkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZG9jdW1lbnRFbGVtZW50LCBzZWxlY3RvciApOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyCgkJaWYgKCAhaGFuZGxlci5ndWlkICkgewoJCQloYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrOwoJCX0KCgkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdAoJCWlmICggISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7CgkJCWV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9OwoJCX0KCQlpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7CgkJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7CgoJCQkJLy8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmQKCQkJCS8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSAidW5kZWZpbmVkIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgPwoJCQkJCWpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7CgkJCX07CgkJfQoKCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzCgkJCWlmICggIXR5cGUgKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJLy8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlCgkJCXR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKCgkJCS8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGUKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQkvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVycwoJCQloYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKCB7CgkJCQl0eXBlOiB0eXBlLAoJCQkJb3JpZ1R5cGU6IG9yaWdUeXBlLAoJCQkJZGF0YTogZGF0YSwKCQkJCWhhbmRsZXI6IGhhbmRsZXIsCgkJCQlndWlkOiBoYW5kbGVyLmd1aWQsCgkJCQlzZWxlY3Rvcjogc2VsZWN0b3IsCgkJCQluZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLAoJCQkJbmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oICIuIiApCgkJCX0sIGhhbmRsZU9iakluICk7CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdAoJCQlpZiAoICEoIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gKSApIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKCQkJCWhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwOwoKCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fAoJCQkJCXNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7CgoJCQkJCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlpZiAoIHNwZWNpYWwuYWRkICkgewoJCQkJc3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7CgoJCQkJaWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHsKCQkJCQloYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkOwoJCQkJfQoJCQl9CgoJCQkvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udAoJCQlpZiAoIHNlbGVjdG9yICkgewoJCQkJaGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApOwoJCQl9IGVsc2UgewoJCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCX0KCgkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb24KCQkJalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTsKCQl9CgoJfSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7CgoJCXZhciBqLCBvcmlnQ291bnQsIHRtcCwKCQkJZXZlbnRzLCB0LCBoYW5kbGVPYmosCgkJCXNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSwKCQkJZWxlbURhdGEgPSBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YVByaXYuZ2V0KCBlbGVtICk7CgoJCWlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkCgkJdHlwZXMgPSAoIHR5cGVzIHx8ICIiICkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgkJdCA9IHR5cGVzLmxlbmd0aDsKCQl3aGlsZSAoIHQtLSApIHsKCQkJdG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTsKCQkJbmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgIiIgKS5zcGxpdCggIi4iICkuc29ydCgpOwoKCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50CgkJCWlmICggIXR5cGUgKSB7CgkJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTsKCQkJCX0KCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQkJdHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOwoJCQloYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdOwoJCQl0bXAgPSB0bXBbIDIgXSAmJgoJCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApOwoKCQkJLy8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cwoJCQlvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoOwoJCQl3aGlsZSAoIGotLSApIHsKCQkJCWhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07CgoJCQkJaWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJgoJCQkJCSggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmCgkJCQkJKCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJgoJCQkJCSggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwKCQkJCQkJc2VsZWN0b3IgPT09ICIqKiIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7CgkJCQkJaGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7CgoJCQkJCWlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkgewoJCQkJCQloYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07CgkJCQkJfQoJCQkJCWlmICggc3BlY2lhbC5yZW1vdmUgKSB7CgkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdAoJCQkvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycykKCQkJaWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHsKCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwKCQkJCQlzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHsKCgkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTsKCQkJCX0KCgkJCQlkZWxldGUgZXZlbnRzWyB0eXBlIF07CgkJCX0KCQl9CgoJCS8vIFJlbW92ZSBkYXRhIGFuZCB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkCgkJaWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7CgkJCWRhdGFQcml2LnJlbW92ZSggZWxlbSwgImhhbmRsZSBldmVudHMiICk7CgkJfQoJfSwKCglkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkgewoKCQkvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3QKCQl2YXIgZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBuYXRpdmVFdmVudCApOwoKCQl2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosIGhhbmRsZXJRdWV1ZSwKCQkJYXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLAoJCQloYW5kbGVycyA9ICggZGF0YVByaXYuZ2V0KCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSwKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307CgoJCS8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50CgkJYXJnc1sgMCBdID0gZXZlbnQ7CgoJCWZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkgewoJCQlhcmdzWyBpIF0gPSBhcmd1bWVudHNbIGkgXTsKCQl9CgoJCWV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpczsKCgkJLy8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZAoJCWlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBEZXRlcm1pbmUgaGFuZGxlcnMKCQloYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7CgoJCS8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzCgkJaSA9IDA7CgkJd2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07CgoJCQlqID0gMDsKCQkJd2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiYKCQkJCSFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoKCQkJCS8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2UocykKCQkJCS8vIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLgoJCQkJaWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKCgkJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwoJCQkJCWV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTsKCgkJCQkJcmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fAoJCQkJCQloYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTsKCgkJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQkJaWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHsKCQkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQoJCWlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7CgkJCXNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgloYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHsKCQl2YXIgaSwgaGFuZGxlT2JqLCBzZWwsIG1hdGNoZWRIYW5kbGVycywgbWF0Y2hlZFNlbGVjdG9ycywKCQkJaGFuZGxlclF1ZXVlID0gW10sCgkJCWRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LAoJCQljdXIgPSBldmVudC50YXJnZXQ7CgoJCS8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnMKCQlpZiAoIGRlbGVnYXRlQ291bnQgJiYKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OQoJCQkvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAodHJhYy0xMzE4MCkKCQkJY3VyLm5vZGVUeXBlICYmCgoJCQkvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDIKCQkJLy8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKQoJCQkvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudC10eXBlLWNsaWNrCgkJCS8vIFN1cHBvcnQ6IElFIDExIG9ubHkKCQkJLy8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgImNsaWNrcyIgb2YgcmFkaW8gaW5wdXRzLCB3aGljaCBjYW4gaGF2ZSBgYnV0dG9uYCAtMSAoZ2gtMjM0MykKCQkJISggZXZlbnQudHlwZSA9PT0gImNsaWNrIiAmJiBldmVudC5idXR0b24gPj0gMSApICkgewoKCQkJZm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7CgoJCQkJLy8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICgjMTMyMDgpCgkJCQkvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NCkKCQkJCWlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICEoIGV2ZW50LnR5cGUgPT09ICJjbGljayIgJiYgY3VyLmRpc2FibGVkID09PSB0cnVlICkgKSB7CgkJCQkJbWF0Y2hlZEhhbmRsZXJzID0gW107CgkJCQkJbWF0Y2hlZFNlbGVjdG9ycyA9IHt9OwoJCQkJCWZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkgewoJCQkJCQloYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdOwoKCQkJCQkJLy8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMykKCQkJCQkJc2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgIiAiOwoKCQkJCQkJaWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkgewoJCQkJCQkJbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID8KCQkJCQkJCQlqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDoKCQkJCQkJCQlqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoOwoJCQkJCQl9CgkJCQkJCWlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gKSB7CgkJCQkJCQltYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJaWYgKCBtYXRjaGVkSGFuZGxlcnMubGVuZ3RoICkgewoJCQkJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVkSGFuZGxlcnMgfSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVycwoJCWN1ciA9IHRoaXM7CgkJaWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkgewoJCQloYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBoYW5kbGVycy5zbGljZSggZGVsZWdhdGVDb3VudCApIH0gKTsKCQl9CgoJCXJldHVybiBoYW5kbGVyUXVldWU7Cgl9LAoKCWFkZFByb3A6IGZ1bmN0aW9uKCBuYW1lLCBob29rICkgewoJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggalF1ZXJ5LkV2ZW50LnByb3RvdHlwZSwgbmFtZSwgewoJCQllbnVtZXJhYmxlOiB0cnVlLAoJCQljb25maWd1cmFibGU6IHRydWUsCgoJCQlnZXQ6IGlzRnVuY3Rpb24oIGhvb2sgKSA/CgkJCQlmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHsKCQkJCQkJCXJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTsKCQkJCQl9CgkJCQl9IDoKCQkJCWZ1bmN0aW9uKCkgewoJCQkJCWlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkgewoJCQkJCQkJcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdOwoJCQkJCX0KCQkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwgewoJCQkJCWVudW1lcmFibGU6IHRydWUsCgkJCQkJY29uZmlndXJhYmxlOiB0cnVlLAoJCQkJCXdyaXRhYmxlOiB0cnVlLAoJCQkJCXZhbHVlOiB2YWx1ZQoJCQkJfSApOwoJCQl9CgkJfSApOwoJfSwKCglmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkgewoJCXJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8KCQkJb3JpZ2luYWxFdmVudCA6CgkJCW5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTsKCX0sCgoJc3BlY2lhbDogewoJCWxvYWQ6IHsKCgkJCS8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWQKCQkJbm9CdWJibGU6IHRydWUKCQl9LAoJCWZvY3VzOiB7CgoJCQkvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3QKCQkJdHJpZ2dlcjogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1cyApIHsKCQkJCQl0aGlzLmZvY3VzKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c2luIgoJCX0sCgkJYmx1cjogewoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7CgkJCQkJdGhpcy5ibHVyKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoJCQlkZWxlZ2F0ZVR5cGU6ICJmb2N1c291dCIKCQl9LAoJCWNsaWNrOiB7CgoJCQkvLyBGb3IgY2hlY2tib3gsIGZpcmUgbmF0aXZlIGV2ZW50IHNvIGNoZWNrZWQgc3RhdGUgd2lsbCBiZSByaWdodAoJCQl0cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQkJCWlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsICJpbnB1dCIgKSApIHsKCQkJCQl0aGlzLmNsaWNrKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9LAoKCQkJLy8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzCgkJCV9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlyZXR1cm4gbm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgImEiICk7CgkJCX0KCQl9LAoKCQliZWZvcmV1bmxvYWQ6IHsKCQkJcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CgoJCQkJLy8gU3VwcG9ydDogRmlyZWZveCAyMCsKCQkJCS8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC4KCQkJCWlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHsKCQkJCQlldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0OwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKalF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKCgkvLyBUaGlzICJpZiIgaXMgbmVlZGVkIGZvciBwbGFpbiBvYmplY3RzCglpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHsKCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApOwoJfQp9OwoKalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7CgoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCglpZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQgKSApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApOwoJfQoKCS8vIEV2ZW50IG9iamVjdAoJaWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7CgkJdGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjOwoJCXRoaXMudHlwZSA9IHNyYy50eXBlOwoKCQkvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZAoJCS8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwKCQkJCXNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiYKCgkJCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkKCQkJCXNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgPwoJCQlyZXR1cm5UcnVlIDoKCQkJcmV0dXJuRmFsc2U7CgoJCS8vIENyZWF0ZSB0YXJnZXQgcHJvcGVydGllcwoJCS8vIFN1cHBvcnQ6IFNhZmFyaSA8PTYgLSA3IG9ubHkKCQkvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKQoJCXRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/CgkJCXNyYy50YXJnZXQucGFyZW50Tm9kZSA6CgkJCXNyYy50YXJnZXQ7CgoJCXRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0OwoJCXRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0OwoKCS8vIEV2ZW50IHR5cGUKCX0gZWxzZSB7CgkJdGhpcy50eXBlID0gc3JjOwoJfQoKCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CglpZiAoIHByb3BzICkgewoJCWpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7Cgl9CgoJLy8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmUKCXRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTsKCgkvLyBNYXJrIGl0IGFzIGZpeGVkCgl0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZwovLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sCmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7Cgljb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LAoJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKCWlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzU2ltdWxhdGVkOiBmYWxzZSwKCglwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJaWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJfQoJfSwKCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJfQoJfSwKCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgoJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQlpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7CgkJCWUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CgkJfQoKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfQp9OwoKLy8gSW5jbHVkZXMgYWxsIGNvbW1vbiBldmVudCBwcm9wcyBpbmNsdWRpbmcgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnQgc3BlY2lmaWMgcHJvcHMKalF1ZXJ5LmVhY2goIHsKCWFsdEtleTogdHJ1ZSwKCWJ1YmJsZXM6IHRydWUsCgljYW5jZWxhYmxlOiB0cnVlLAoJY2hhbmdlZFRvdWNoZXM6IHRydWUsCgljdHJsS2V5OiB0cnVlLAoJZGV0YWlsOiB0cnVlLAoJZXZlbnRQaGFzZTogdHJ1ZSwKCW1ldGFLZXk6IHRydWUsCglwYWdlWDogdHJ1ZSwKCXBhZ2VZOiB0cnVlLAoJc2hpZnRLZXk6IHRydWUsCgl2aWV3OiB0cnVlLAoJImNoYXIiOiB0cnVlLAoJY2hhckNvZGU6IHRydWUsCglrZXk6IHRydWUsCglrZXlDb2RlOiB0cnVlLAoJYnV0dG9uOiB0cnVlLAoJYnV0dG9uczogdHJ1ZSwKCWNsaWVudFg6IHRydWUsCgljbGllbnRZOiB0cnVlLAoJb2Zmc2V0WDogdHJ1ZSwKCW9mZnNldFk6IHRydWUsCglwb2ludGVySWQ6IHRydWUsCglwb2ludGVyVHlwZTogdHJ1ZSwKCXNjcmVlblg6IHRydWUsCglzY3JlZW5ZOiB0cnVlLAoJdGFyZ2V0VG91Y2hlczogdHJ1ZSwKCXRvRWxlbWVudDogdHJ1ZSwKCXRvdWNoZXM6IHRydWUsCgoJd2hpY2g6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgYnV0dG9uID0gZXZlbnQuYnV0dG9uOwoKCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKCQlpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHsKCQkJcmV0dXJuIGV2ZW50LmNoYXJDb2RlICE9IG51bGwgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGU7CgkJfQoKCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgJiYgcm1vdXNlRXZlbnQudGVzdCggZXZlbnQudHlwZSApICkgewoJCQlpZiAoIGJ1dHRvbiAmIDEgKSB7CgkJCQlyZXR1cm4gMTsKCQkJfQoKCQkJaWYgKCBidXR0b24gJiAyICkgewoJCQkJcmV0dXJuIDM7CgkJCX0KCgkJCWlmICggYnV0dG9uICYgNCApIHsKCQkJCXJldHVybiAyOwoJCQl9CgoJCQlyZXR1cm4gMDsKCQl9CgoJCXJldHVybiBldmVudC53aGljaDsKCX0KfSwgalF1ZXJ5LmV2ZW50LmFkZFByb3AgKTsKCi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcwovLyBzbyB0aGF0IGV2ZW50IGRlbGVnYXRpb24gd29ya3MgaW4galF1ZXJ5LgovLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dAovLwovLyBTdXBwb3J0OiBTYWZhcmkgNyBvbmx5Ci8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOgovLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNTgKLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS4KalF1ZXJ5LmVhY2goIHsKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0IiwKCXBvaW50ZXJlbnRlcjogInBvaW50ZXJvdmVyIiwKCXBvaW50ZXJsZWF2ZTogInBvaW50ZXJvdXQiCn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CglqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0gewoJCWRlbGVnYXRlVHlwZTogZml4LAoJCWJpbmRUeXBlOiBmaXgsCgoJCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQl2YXIgcmV0LAoJCQkJdGFyZ2V0ID0gdGhpcywKCQkJCXJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LAoJCQkJaGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqOwoKCQkJLy8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4KCQkJLy8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cKCQkJaWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkgewoJCQkJZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTsKCQkJCXJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCWV2ZW50LnR5cGUgPSBmaXg7CgkJCX0KCQkJcmV0dXJuIHJldDsKCQl9Cgl9Owp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJb246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkgewoJCXJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCW9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7CgkJcmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7Cgl9LAoJb2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHsKCQl2YXIgaGFuZGxlT2JqLCB0eXBlOwoJCWlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkgewoKCQkJLy8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudAoJCQloYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7CgkJCWpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoCgkJCQloYW5kbGVPYmoubmFtZXNwYWNlID8KCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUgKyAiLiIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDoKCQkJCQloYW5kbGVPYmoub3JpZ1R5cGUsCgkJCQloYW5kbGVPYmouc2VsZWN0b3IsCgkJCQloYW5kbGVPYmouaGFuZGxlcgoJCQkpOwoJCQlyZXR1cm4gdGhpczsKCQl9CgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgewoKCQkJLy8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdICkKCQkJZm9yICggdHlwZSBpbiB0eXBlcyApIHsKCQkJCXRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCQlpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJmdW5jdGlvbiIgKSB7CgoJCQkvLyAoIHR5cGVzIFssIGZuXSApCgkJCWZuID0gc2VsZWN0b3I7CgkJCXNlbGVjdG9yID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGZuID09PSBmYWxzZSApIHsKCQkJZm4gPSByZXR1cm5GYWxzZTsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTsKCQl9ICk7Cgl9Cn0gKTsKCgp2YXIKCgkvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovCgoJLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy8zMjI5CglyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksCgoJLyogZXNsaW50LWVuYWJsZSAqLwoKCS8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSwgRWRnZSAxMiAtIDEzIG9ubHkKCS8vIEluIElFL0VkZ2UgdXNpbmcgcmVnZXggZ3JvdXBzIGhlcmUgY2F1c2VzIHNldmVyZSBzbG93ZG93bnMuCgkvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyLwoJcm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksCgoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZzsKCi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93cwpmdW5jdGlvbiBtYW5pcHVsYXRpb25UYXJnZXQoIGVsZW0sIGNvbnRlbnQgKSB7CglpZiAoIG5vZGVOYW1lKCBlbGVtLCAidGFibGUiICkgJiYKCQlub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCAidHIiICkgKSB7CgoJCXJldHVybiBqUXVlcnkoIGVsZW0gKS5jaGlsZHJlbiggInRib2R5IiApWyAwIF0gfHwgZWxlbTsKCX0KCglyZXR1cm4gZWxlbTsKfQoKLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvbgpmdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkgewoJZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggInR5cGUiICkgIT09IG51bGwgKSArICIvIiArIGVsZW0udHlwZTsKCXJldHVybiBlbGVtOwp9CmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7CglpZiAoICggZWxlbS50eXBlIHx8ICIiICkuc2xpY2UoIDAsIDUgKSA9PT0gInRydWUvIiApIHsKCQllbGVtLnR5cGUgPSBlbGVtLnR5cGUuc2xpY2UoIDUgKTsKCX0gZWxzZSB7CgkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoICJ0eXBlIiApOwoJfQoKCXJldHVybiBlbGVtOwp9CgpmdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkgewoJdmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7CgoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgewoJCXJldHVybjsKCX0KCgkvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLgoJaWYgKCBkYXRhUHJpdi5oYXNEYXRhKCBzcmMgKSApIHsKCQlwZGF0YU9sZCA9IGRhdGFQcml2LmFjY2Vzcyggc3JjICk7CgkJcGRhdGFDdXIgPSBkYXRhUHJpdi5zZXQoIGRlc3QsIHBkYXRhT2xkICk7CgkJZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTsKCQkJcGRhdGFDdXIuZXZlbnRzID0ge307CgoJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCWZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyAyLiBDb3B5IHVzZXIgZGF0YQoJaWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHsKCQl1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7CgkJdWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTsKCgkJZGF0YVVzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApOwoJfQp9CgovLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHMKZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHsKCXZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCgkvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi4KCWlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHsKCQlkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKCgkvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9ucwoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwgbm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7CgkJZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlOwoJfQp9CgpmdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7CgoJLy8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5cwoJYXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTsKCgl2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsCgkJaSA9IDAsCgkJbCA9IGNvbGxlY3Rpb24ubGVuZ3RoLAoJCWlOb0Nsb25lID0gbCAtIDEsCgkJdmFsdWUgPSBhcmdzWyAwIF0sCgkJdmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTsKCgkvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXQKCWlmICggdmFsdWVJc0Z1bmN0aW9uIHx8CgkJCSggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJgoJCQkJIXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7CgkJcmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkgewoJCQl2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7CgkJCWlmICggdmFsdWVJc0Z1bmN0aW9uICkgewoJCQkJYXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7CgkJCX0KCQkJZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7CgkJfSApOwoJfQoKCWlmICggbCApIHsKCQlmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApOwoJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCgkJaWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHsKCQkJZnJhZ21lbnQgPSBmaXJzdDsKCQl9CgoJCS8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFjawoJCWlmICggZmlyc3QgfHwgaWdub3JlZCApIHsKCQkJc2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsICJzY3JpcHQiICksIGRpc2FibGVTY3JpcHQgKTsKCQkJaGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoOwoKCQkJLy8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbQoJCQkvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAKCQkJLy8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS4KCQkJZm9yICggOyBpIDwgbDsgaSsrICkgewoJCQkJbm9kZSA9IGZyYWdtZW50OwoKCQkJCWlmICggaSAhPT0gaU5vQ2xvbmUgKSB7CgkJCQkJbm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApOwoKCQkJCQkvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uCgkJCQkJaWYgKCBoYXNTY3JpcHRzICkgewoKCQkJCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCQkJCS8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJCQkJalF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJCQl9CgkJCQl9CgoJCQkJY2FsbGJhY2suY2FsbCggY29sbGVjdGlvblsgaSBdLCBub2RlLCBpICk7CgkJCX0KCgkJCWlmICggaGFzU2NyaXB0cyApIHsKCQkJCWRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7CgoJCQkJLy8gUmVlbmFibGUgc2NyaXB0cwoJCQkJalF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApOwoKCQkJCS8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb24KCQkJCWZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkgewoJCQkJCW5vZGUgPSBzY3JpcHRzWyBpIF07CgkJCQkJaWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgIiIgKSAmJgoJCQkJCQkhZGF0YVByaXYuYWNjZXNzKCBub2RlLCAiZ2xvYmFsRXZhbCIgKSAmJgoJCQkJCQlqUXVlcnkuY29udGFpbnMoIGRvYywgbm9kZSApICkgewoKCQkJCQkJaWYgKCBub2RlLnNyYyAmJiAoIG5vZGUudHlwZSB8fCAiIiApLnRvTG93ZXJDYXNlKCkgICE9PSAibW9kdWxlIiApIHsKCgkJCQkJCQkvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudAoJCQkJCQkJaWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7CgkJCQkJCQkJalF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApOwoJCQkJCQkJfQoJCQkJCQl9IGVsc2UgewoJCQkJCQkJRE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsICIiICksIGRvYywgbm9kZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiBjb2xsZWN0aW9uOwp9CgpmdW5jdGlvbiByZW1vdmUoIGVsZW0sIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKCXZhciBub2RlLAoJCW5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSwKCQlpID0gMDsKCglmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7CgkJaWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBub2RlICkgKTsKCQl9CgoJCWlmICggbm9kZS5wYXJlbnROb2RlICkgewoJCQlpZiAoIGtlZXBEYXRhICYmIGpRdWVyeS5jb250YWlucyggbm9kZS5vd25lckRvY3VtZW50LCBub2RlICkgKSB7CgkJCQlzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsICJzY3JpcHQiICkgKTsKCQkJfQoJCQlub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIG5vZGUgKTsKCQl9Cgl9CgoJcmV0dXJuIGVsZW07Cn0KCmpRdWVyeS5leHRlbmQoIHsKCWh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiBodG1sLnJlcGxhY2UoIHJ4aHRtbFRhZywgIjwkMT48LyQyPiIgKTsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQl2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cywKCQkJY2xvbmUgPSBlbGVtLmNsb25lTm9kZSggdHJ1ZSApLAoJCQlpblBhZ2UgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwoKCQkvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXMKCQlpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmCgkJCQkhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7CgoJCQkvLyBXZSBlc2NoZXcgU2l6emxlIGhlcmUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM6IGh0dHBzOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzIKCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwoJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoKCQkJZm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTsKCQkJfQoJCX0KCgkJLy8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQoJCWlmICggZGF0YUFuZEV2ZW50cyApIHsKCQkJaWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQkJCXNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7CgkJCQlkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApOwoKCQkJCWZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJY2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7CgkJCX0KCQl9CgoJCS8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3RvcnkKCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCAic2NyaXB0IiApOwoJCWlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7CgkJCXNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sICJzY3JpcHQiICkgKTsKCQl9CgoJCS8vIFJldHVybiB0aGUgY2xvbmVkIHNldAoJCXJldHVybiBjbG9uZTsKCX0sCgoJY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGRhdGEsIGVsZW0sIHR5cGUsCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9PSB1bmRlZmluZWQ7IGkrKyApIHsKCQkJaWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCQlpZiAoICggZGF0YSA9IGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSApICkgewoJCQkJCWlmICggZGF0YS5ldmVudHMgKSB7CgkJCQkJCWZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CgkJCQkJCQlpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHsKCQkJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7CgoJCQkJCQkJLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQkJaWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7CgoJCQkJCS8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrCgkJCQkJLy8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlCgkJCQkJZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdID0gdW5kZWZpbmVkOwoJCQkJfQoJCQl9CgkJfQoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CglkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApOwoJfSwKCglyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciApOwoJfSwKCgl0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkgewoJCQlyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/CgkJCQlqUXVlcnkudGV4dCggdGhpcyApIDoKCQkJCXRoaXMuZW1wdHkoKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQkJdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwoJCQkJCX0KCQkJCX0gKTsKCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApOwoJfSwKCglhcHBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7CgkJCQl2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7CgkJCQl0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTsKCQkJfQoJCX0gKTsKCX0sCgoJcHJlcGVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTsKCQkJCXRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWJlZm9yZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMucGFyZW50Tm9kZSApIHsKCQkJCXRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTsKCQkJfQoJCX0gKTsKCX0sCgoJYWZ0ZXI6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0KCQl9ICk7Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbSwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKCBlbGVtID0gdGhpc1sgaSBdICkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gUHJldmVudCBtZW1vcnkgbGVha3MKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApOwoKCQkJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCgkJCQllbGVtLnRleHRDb250ZW50ID0gIiI7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkgewoJCWRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7CgkJZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzOwoKCQlyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOwoJCX0gKTsKCX0sCgoJaHRtbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sCgkJCQlpID0gMCwKCQkJCWwgPSB0aGlzLmxlbmd0aDsKCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJcmV0dXJuIGVsZW0uaW5uZXJIVE1MOwoJCQl9CgoJCQkvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MCgkJCWlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiYKCQkJCSF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyAiIiwgIiIgXSApWyAxIF0udG9Mb3dlckNhc2UoKSBdICkgewoKCQkJCXZhbHVlID0galF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIHZhbHVlICk7CgoJCQkJdHJ5IHsKCQkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJCWVsZW0gPSB0aGlzWyBpIF0gfHwge307CgoJCQkJCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7CgkJCQkJCQllbGVtLmlubmVySFRNTCA9IHZhbHVlOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQllbGVtID0gMDsKCgkJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJCX0gY2F0Y2ggKCBlICkge30KCQkJfQoKCQkJaWYgKCBlbGVtICkgewoJCQkJdGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTsKCQkJfQoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKCQl2YXIgaWdub3JlZCA9IFtdOwoKCQkvLyBNYWtlIHRoZSBjaGFuZ2VzLCByZXBsYWNpbmcgZWFjaCBub24taWdub3JlZCBjb250ZXh0IGVsZW1lbnQgd2l0aCB0aGUgbmV3IGNvbnRlbnQKCQlyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CgoJCQlpZiAoIGpRdWVyeS5pbkFycmF5KCB0aGlzLCBpZ25vcmVkICkgPCAwICkgewoJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTsKCQkJCWlmICggcGFyZW50ICkgewoJCQkJCXBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTsKCQkJCX0KCQkJfQoKCQkvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uCgkJfSwgaWdub3JlZCApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBlbGVtcywKCQkJcmV0ID0gW10sCgkJCWluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSwKCQkJbGFzdCA9IGluc2VydC5sZW5ndGggLSAxLAoJCQlpID0gMDsKCgkJZm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHsKCQkJZWxlbXMgPSBpID09PSBsYXN0ID8gdGhpcyA6IHRoaXMuY2xvbmUoIHRydWUgKTsKCQkJalF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApOwoKCQkJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5CgkJCS8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXQKCQkJcHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApOwoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTsKCX07Cn0gKTsKdmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoICJeKCIgKyBwbnVtICsgIikoPyFweClbYS16JV0rJCIsICJpIiApOwoKdmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAoIzE1MDk4LCAjMTQxNTApCgkJLy8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzCgkJLy8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoICJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlIgoJCXZhciB2aWV3ID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3OwoKCQlpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHsKCQkJdmlldyA9IHdpbmRvdzsKCQl9CgoJCXJldHVybiB2aWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTsKCX07Cgp2YXIgcmJveFN0eWxlID0gbmV3IFJlZ0V4cCggY3NzRXhwYW5kLmpvaW4oICJ8IiApLCAiaSIgKTsKCgoKKCBmdW5jdGlvbigpIHsKCgkvLyBFeGVjdXRpbmcgYm90aCBwaXhlbFBvc2l0aW9uICYgYm94U2l6aW5nUmVsaWFibGUgdGVzdHMgcmVxdWlyZSBvbmx5IG9uZSBsYXlvdXQKCS8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uCglmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHsKCgkJLy8gVGhpcyBpcyBhIHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZQoJCWlmICggIWRpdiApIHsKCQkJcmV0dXJuOwoJCX0KCgkJY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4OyIgKwoJCQkibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIjsKCQlkaXYuc3R5bGUuY3NzVGV4dCA9CgkJCSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7IiArCgkJCSJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4OyIgKwoJCQkid2lkdGg6NjAlO3RvcDoxJSI7CgkJZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKCBjb250YWluZXIgKS5hcHBlbmRDaGlsZCggZGl2ICk7CgoJCXZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTsKCQlwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSAiMSUiOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0CgkJcmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5tYXJnaW5MZWZ0ICkgPT09IDEyOwoKCQkvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjMKCQkvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3QKCQlkaXYuc3R5bGUucmlnaHQgPSAiNjAlIjsKCQlwaXhlbEJveFN0eWxlc1ZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUucmlnaHQgKSA9PT0gMzY7CgoJCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkJLy8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50cwoJCWJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjsKCgkJLy8gU3VwcG9ydDogSUUgOSBvbmx5CgkJLy8gRGV0ZWN0IG92ZXJmbG93OnNjcm9sbCBzY3Jld2luZXNzIChnaC0zNjk5KQoJCWRpdi5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CgkJc2Nyb2xsYm94U2l6ZVZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMzYgfHwgImFic29sdXRlIjsKCgkJZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKCgkJLy8gTnVsbGlmeSB0aGUgZGl2IHNvIGl0IHdvdWxkbid0IGJlIHN0b3JlZCBpbiB0aGUgbWVtb3J5IGFuZAoJCS8vIGl0IHdpbGwgYWxzbyBiZSBhIHNpZ24gdGhhdCBjaGVja3MgYWxyZWFkeSBwZXJmb3JtZWQKCQlkaXYgPSBudWxsOwoJfQoKCWZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHsKCQlyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7Cgl9CgoJdmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLCBzY3JvbGxib3hTaXplVmFsLCBwaXhlbEJveFN0eWxlc1ZhbCwKCQlyZWxpYWJsZU1hcmdpbkxlZnRWYWwsCgkJY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApOwoKCS8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzCglpZiAoICFkaXYuc3R5bGUgKSB7CgkJcmV0dXJuOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCS8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOCkKCWRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJjb250ZW50LWJveCI7CglkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSAiIjsKCXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSAiY29udGVudC1ib3giOwoKCWpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHsKCQlib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDsKCQl9LAoJCXBpeGVsQm94U3R5bGVzOiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHBpeGVsQm94U3R5bGVzVmFsOwoJCX0sCgkJcGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJCWNvbXB1dGVTdHlsZVRlc3RzKCk7CgkJCXJldHVybiBwaXhlbFBvc2l0aW9uVmFsOwoJCX0sCgkJcmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHsKCQkJY29tcHV0ZVN0eWxlVGVzdHMoKTsKCQkJcmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDsKCQl9LAoJCXNjcm9sbGJveFNpemU6IGZ1bmN0aW9uKCkgewoJCQljb21wdXRlU3R5bGVUZXN0cygpOwoJCQlyZXR1cm4gc2Nyb2xsYm94U2l6ZVZhbDsKCQl9Cgl9ICk7Cn0gKSgpOwoKCmZ1bmN0aW9uIGN1ckNTUyggZWxlbSwgbmFtZSwgY29tcHV0ZWQgKSB7Cgl2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LAoKCQkvLyBTdXBwb3J0OiBGaXJlZm94IDUxKwoJCS8vIFJldHJpZXZpbmcgc3R5bGUgYmVmb3JlIGNvbXB1dGVkIHNvbWVob3cKCQkvLyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGdldHRpbmcgd3JvbmcgdmFsdWVzCgkJLy8gb24gZGV0YWNoZWQgZWxlbWVudHMKCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJY29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTsKCgkvLyBnZXRQcm9wZXJ0eVZhbHVlIGlzIG5lZWRlZCBmb3I6CgkvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNykKCS8vICAgLmNzcygnLS1jdXN0b21Qcm9wZXJ0eSkgKCMzMTQ0KQoJaWYgKCBjb21wdXRlZCApIHsKCQlyZXQgPSBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXTsKCgkJaWYgKCByZXQgPT09ICIiICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkgewoJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKCQl9CgoJCS8vIEEgdHJpYnV0ZSB0byB0aGUgImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMiCgkJLy8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsCgkJLy8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy4KCQkvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6CgkJLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXMKCQlpZiAoICFzdXBwb3J0LnBpeGVsQm94U3R5bGVzKCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJib3hTdHlsZS50ZXN0KCBuYW1lICkgKSB7CgoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCXdpZHRoID0gc3R5bGUud2lkdGg7CgkJCW1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7CgkJCW1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7CgoJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CgkJCXN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDsKCQkJcmV0ID0gY29tcHV0ZWQud2lkdGg7CgoJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCgkJCXN0eWxlLndpZHRoID0gd2lkdGg7CgkJCXN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7CgkJCXN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7CgkJfQoJfQoKCXJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/CgoJCS8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHkKCQkvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLgoJCXJldCArICIiIDoKCQlyZXQ7Cn0KCgpmdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7CgoJLy8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC4KCXJldHVybiB7CgkJZ2V0OiBmdW5jdGlvbigpIHsKCQkJaWYgKCBjb25kaXRpb25GbigpICkgewoKCQkJCS8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZQoJCQkJLy8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LgoJCQkJZGVsZXRlIHRoaXMuZ2V0OwoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi4KCQkJcmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfQoJfTsKfQoKCnZhcgoKCS8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGUKCS8vIGV4Y2VwdCAidGFibGUiLCAidGFibGUtY2VsbCIsIG9yICJ0YWJsZS1jYXB0aW9uIgoJLy8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5CglyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sCglyY3VzdG9tUHJvcCA9IC9eLS0vLAoJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCgljc3NOb3JtYWxUcmFuc2Zvcm0gPSB7CgkJbGV0dGVyU3BhY2luZzogIjAiLAoJCWZvbnRXZWlnaHQ6ICI0MDAiCgl9LAoKCWNzc1ByZWZpeGVzID0gWyAiV2Via2l0IiwgIk1veiIsICJtcyIgXSwKCWVtcHR5U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApLnN0eWxlOwoKLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eQpmdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHsKCgkvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZAoJaWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7CgkJcmV0dXJuIG5hbWU7Cgl9CgoJLy8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lcwoJdmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSwKCQlpID0gY3NzUHJlZml4ZXMubGVuZ3RoOwoKCXdoaWxlICggaS0tICkgewoJCW5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTsKCQlpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHsKCQkJcmV0dXJuIG5hbWU7CgkJfQoJfQp9CgovLyBSZXR1cm4gYSBwcm9wZXJ0eSBtYXBwZWQgYWxvbmcgd2hhdCBqUXVlcnkuY3NzUHJvcHMgc3VnZ2VzdHMgb3IgdG8KLy8gYSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHkuCmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7Cgl2YXIgcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF07CglpZiAoICFyZXQgKSB7CgkJcmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7Cgl9CglyZXR1cm4gcmV0Owp9CgpmdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkgewoKCS8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW4KCS8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludAoJdmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7CglyZXR1cm4gbWF0Y2hlcyA/CgoJCS8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkICJzdWJ0cmFjdCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rcwoJCU1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgInB4IiApIDoKCQl2YWx1ZTsKfQoKZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7Cgl2YXIgaSA9IGRpbWVuc2lvbiA9PT0gIndpZHRoIiA/IDEgOiAwLAoJCWV4dHJhID0gMCwKCQlkZWx0YSA9IDA7CgoJLy8gQWRqdXN0bWVudCBtYXkgbm90IGJlIG5lY2Vzc2FyeQoJaWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApICkgewoJCXJldHVybiAwOwoJfQoKCWZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHsKCgkJLy8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luCgkJaWYgKCBib3ggPT09ICJtYXJnaW4iICkgewoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgkJfQoKCQkvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGEgY29udGVudC1ib3gsIHdlJ3JlIHNlZWtpbmcgInBhZGRpbmciIG9yICJib3JkZXIiIG9yICJtYXJnaW4iCgkJaWYgKCAhaXNCb3JkZXJCb3ggKSB7CgoJCQkvLyBBZGQgcGFkZGluZwoJCQlkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7CgoJCQkvLyBGb3IgImJvcmRlciIgb3IgIm1hcmdpbiIsIGFkZCBib3JkZXIKCQkJaWYgKCBib3ggIT09ICJwYWRkaW5nIiApIHsKCQkJCWRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sICJib3JkZXIiICsgY3NzRXhwYW5kWyBpIF0gKyAiV2lkdGgiLCB0cnVlLCBzdHlsZXMgKTsKCgkJCS8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZQoJCQl9IGVsc2UgewoJCQkJZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgImJvcmRlciIgKyBjc3NFeHBhbmRbIGkgXSArICJXaWR0aCIsIHRydWUsIHN0eWxlcyApOwoJCQl9CgoJCS8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgImNvbnRlbnQiIG9yCgkJLy8gInBhZGRpbmciIG9yICJtYXJnaW4iCgkJfSBlbHNlIHsKCgkJCS8vIEZvciAiY29udGVudCIsIHN1YnRyYWN0IHBhZGRpbmcKCQkJaWYgKCBib3ggPT09ICJjb250ZW50IiApIHsKCQkJCWRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTsKCQkJfQoKCQkJLy8gRm9yICJjb250ZW50IiBvciAicGFkZGluZyIsIHN1YnRyYWN0IGJvcmRlcgoJCQlpZiAoIGJveCAhPT0gIm1hcmdpbiIgKSB7CgkJCQlkZWx0YSAtPSBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiwgdHJ1ZSwgc3R5bGVzICk7CgkJCX0KCQl9Cgl9CgoJLy8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWwKCWlmICggIWlzQm9yZGVyQm94ICYmIGNvbXB1dGVkVmFsID49IDAgKSB7CgoJCS8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXIKCQkvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duCgkJZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbCgKCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCWNvbXB1dGVkVmFsIC0KCQkJZGVsdGEgLQoJCQlleHRyYSAtCgkJCTAuNQoJCSkgKTsKCX0KCglyZXR1cm4gZGVsdGE7Cn0KCmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7CgoJLy8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZQoJdmFyIHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLAoJCXZhbCA9IGN1ckNTUyggZWxlbSwgZGltZW5zaW9uLCBzdHlsZXMgKSwKCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQl2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3g7CgoJLy8gU3VwcG9ydDogRmlyZWZveCA8PTU0CgkvLyBSZXR1cm4gYSBjb25mb3VuZGluZyBub24tcGl4ZWwgdmFsdWUgb3IgZmVpZ24gaWdub3JhbmNlLCBhcyBhcHByb3ByaWF0ZS4KCWlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkgewoJCWlmICggIWV4dHJhICkgewoJCQlyZXR1cm4gdmFsOwoJCX0KCQl2YWwgPSAiYXV0byI7Cgl9CgoJLy8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXMKCS8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGUKCXZhbHVlSXNCb3JkZXJCb3ggPSB2YWx1ZUlzQm9yZGVyQm94ICYmCgkJKCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSApOwoKCS8vIEZhbGwgYmFjayB0byBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgd2hlbiB2YWx1ZSBpcyAiYXV0byIKCS8vIFRoaXMgaGFwcGVucyBmb3IgaW5saW5lIGVsZW1lbnRzIHdpdGggbm8gZXhwbGljaXQgc2V0dGluZyAoZ2gtMzU3MSkKCS8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgLSA0LjMgb25seQoJLy8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMikKCWlmICggdmFsID09PSAiYXV0byIgfHwKCQkhcGFyc2VGbG9hdCggdmFsICkgJiYgalF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiLCBmYWxzZSwgc3R5bGVzICkgPT09ICJpbmxpbmUiICkgewoKCQl2YWwgPSBlbGVtWyAib2Zmc2V0IiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdOwoKCQkvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgcHJvdmlkZSBib3JkZXItYm94IHZhbHVlcwoJCXZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlOwoJfQoKCS8vIE5vcm1hbGl6ZSAiIiBhbmQgYXV0bwoJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKCgkvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsCglyZXR1cm4gKCB2YWwgKwoJCWJveE1vZGVsQWRqdXN0bWVudCgKCQkJZWxlbSwKCQkJZGltZW5zaW9uLAoJCQlleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gImJvcmRlciIgOiAiY29udGVudCIgKSwKCQkJdmFsdWVJc0JvcmRlckJveCwKCQkJc3R5bGVzLAoKCQkJLy8gUHJvdmlkZSB0aGUgY3VycmVudCBjb21wdXRlZCBzaXplIHRvIHJlcXVlc3Qgc2Nyb2xsIGd1dHRlciBjYWxjdWxhdGlvbiAoZ2gtMzU4OSkKCQkJdmFsCgkJKQoJKSArICJweCI7Cn0KCmpRdWVyeS5leHRlbmQoIHsKCgkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKCQkJCQl2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIgKTsKCQkJCQlyZXR1cm4gcmV0ID09PSAiIiA/ICIxIiA6IHJldDsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJLy8gRG9uJ3QgYXV0b21hdGljYWxseSBhZGQgInB4IiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzCgljc3NOdW1iZXI6IHsKCQkiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQiOiB0cnVlLAoJCSJjb2x1bW5Db3VudCI6IHRydWUsCgkJImZpbGxPcGFjaXR5IjogdHJ1ZSwKCQkiZmxleEdyb3ciOiB0cnVlLAoJCSJmbGV4U2hyaW5rIjogdHJ1ZSwKCQkiZm9udFdlaWdodCI6IHRydWUsCgkJImxpbmVIZWlnaHQiOiB0cnVlLAoJCSJvcGFjaXR5IjogdHJ1ZSwKCQkib3JkZXIiOiB0cnVlLAoJCSJvcnBoYW5zIjogdHJ1ZSwKCQkid2lkb3dzIjogdHJ1ZSwKCQkiekluZGV4IjogdHJ1ZSwKCQkiem9vbSI6IHRydWUKCX0sCgoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQoJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQoJY3NzUHJvcHM6IHt9LAoKCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHsKCgkJLy8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZQoJCXZhciByZXQsIHR5cGUsIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsKCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndAoJCS8vIHdhbnQgdG8gcXVlcnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eQoJCS8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC4KCQlpZiAoICFpc0N1c3RvbVByb3AgKSB7CgkJCW5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApOwoJCX0KCgkJLy8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb24KCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTsKCgkJLy8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQl0eXBlID0gdHlwZW9mIHZhbHVlOwoKCQkJLy8gQ29udmVydCAiKz0iIG9yICItPSIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpCgkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHsKCQkJCXZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTsKCgkJCQkvLyBGaXhlcyBidWcgIzkyMzcKCQkJCXR5cGUgPSAibnVtYmVyIjsKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNikKCQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgKSB7CgkJCQl2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gIiIgOiAicHgiICk7CgkJCX0KCgkJCS8vIGJhY2tncm91bmQtKiBwcm9wcyBhZmZlY3Qgb3JpZ2luYWwgY2xvbmUncyB2YWx1ZXMKCQkJaWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09ICIiICYmIG5hbWUuaW5kZXhPZiggImJhY2tncm91bmQiICkgPT09IDAgKSB7CgkJCQlzdHlsZVsgbmFtZSBdID0gImluaGVyaXQiOwoJCQl9CgoJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKCQkJaWYgKCAhaG9va3MgfHwgISggInNldCIgaW4gaG9va3MgKSB8fAoJCQkJKCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCWlmICggaXNDdXN0b21Qcm9wICkgewoJCQkJCXN0eWxlLnNldFByb3BlcnR5KCBuYW1lLCB2YWx1ZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCgkJfSBlbHNlIHsKCgkJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZQoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkgewoKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCS8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0CgkJCXJldHVybiBzdHlsZVsgbmFtZSBdOwoJCX0KCX0sCgoJY3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHsKCQl2YXIgdmFsLCBudW0sIGhvb2tzLAoJCQlvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLAoJCQlpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICk7CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3QKCQkvLyB3YW50IHRvIG1vZGlmeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5CgkJLy8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLgoJCWlmICggIWlzQ3VzdG9tUHJvcCApIHsKCQkJbmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7CgkJfQoKCQkvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CgoJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCgkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyApIHsKCQkJdmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApOwoJCX0KCgkJLy8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXQKCQlpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgewoJCQl2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApOwoJCX0KCgkJLy8gQ29udmVydCAibm9ybWFsIiB0byBjb21wdXRlZCB2YWx1ZQoJCWlmICggdmFsID09PSAibm9ybWFsIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHsKCQkJdmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07CgkJfQoKCQkvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWMKCQlpZiAoIGV4dHJhID09PSAiIiB8fCBleHRyYSApIHsKCQkJbnVtID0gcGFyc2VGbG9hdCggdmFsICk7CgkJCXJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDsKCQl9CgoJCXJldHVybiB2YWw7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJoZWlnaHQiLCAid2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBkaW1lbnNpb24gKSB7CglqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKCQkJaWYgKCBjb21wdXRlZCApIHsKCgkJCQkvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW0KCQkJCS8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0CgkJCQlyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApICkgJiYKCgkJCQkJLy8gU3VwcG9ydDogU2FmYXJpIDgrCgkJCQkJLy8gVGFibGUgY29sdW1ucyBpbiBTYWZhcmkgaGF2ZSBub24temVybyBvZmZzZXRXaWR0aCAmIHplcm8KCQkJCQkvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB1bmxlc3MgZGlzcGxheSBpcyBjaGFuZ2VkLgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9MTEgb25seQoJCQkJCS8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGEgZGlzY29ubmVjdGVkIG5vZGUKCQkJCQkvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuCgkJCQkJKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCB8fCAhZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCApID8KCQkJCQkJc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CgkJCQkJCQlyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApOwoJCQkJCQl9ICkgOgoJCQkJCQlnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7CgkJCX0KCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7CgkJCXZhciBtYXRjaGVzLAoJCQkJc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksCgkJCQlpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciLCBmYWxzZSwgc3R5bGVzICkgPT09ICJib3JkZXItYm94IiwKCQkJCXN1YnRyYWN0ID0gZXh0cmEgJiYgYm94TW9kZWxBZGp1c3RtZW50KAoJCQkJCWVsZW0sCgkJCQkJZGltZW5zaW9uLAoJCQkJCWV4dHJhLAoJCQkJCWlzQm9yZGVyQm94LAoJCQkJCXN0eWxlcwoJCQkJKTsKCgkJCS8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZAoJCQkvLyBmYWtpbmcgYSBjb250ZW50LWJveCB0byBnZXQgYm9yZGVyIGFuZCBwYWRkaW5nIChnaC0zNjk5KQoJCQlpZiAoIGlzQm9yZGVyQm94ICYmIHN1cHBvcnQuc2Nyb2xsYm94U2l6ZSgpID09PSBzdHlsZXMucG9zaXRpb24gKSB7CgkJCQlzdWJ0cmFjdCAtPSBNYXRoLmNlaWwoCgkJCQkJZWxlbVsgIm9mZnNldCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtCgkJCQkJcGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC0KCQkJCQlib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgImJvcmRlciIsIGZhbHNlLCBzdHlsZXMgKSAtCgkJCQkJMC41CgkJCQkpOwoJCQl9CgoJCQkvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZAoJCQlpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmCgkJCQkoIG1hdGNoZXNbIDMgXSB8fCAicHgiICkgIT09ICJweCIgKSB7CgoJCQkJZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gPSB2YWx1ZTsKCQkJCXZhbHVlID0galF1ZXJ5LmNzcyggZWxlbSwgZGltZW5zaW9uICk7CgkJCX0KCgkJCXJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7CgkJfQoJfTsKfSApOwoKalF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LAoJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCWlmICggY29tcHV0ZWQgKSB7CgkJCXJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgIm1hcmdpbkxlZnQiICkgKSB8fAoJCQkJZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0KCQkJCQlzd2FwKCBlbGVtLCB7IG1hcmdpbkxlZnQ6IDAgfSwgZnVuY3Rpb24oKSB7CgkJCQkJCXJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7CgkJCQkJfSApCgkJCQkpICsgInB4IjsKCQl9Cgl9Cik7CgovLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzCmpRdWVyeS5lYWNoKCB7CgltYXJnaW46ICIiLAoJcGFkZGluZzogIiIsCglib3JkZXI6ICJXaWR0aCIKfSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkgewoJalF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHsKCQlleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGkgPSAwLAoJCQkJZXhwYW5kZWQgPSB7fSwKCgkJCQkvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKCQkJCXBhcnRzID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiA/IHZhbHVlLnNwbGl0KCAiICIgKSA6IFsgdmFsdWUgXTsKCgkJCWZvciAoIDsgaSA8IDQ7IGkrKyApIHsKCQkJCWV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID0KCQkJCQlwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07CgkJCX0KCgkJCXJldHVybiBleHBhbmRlZDsKCQl9Cgl9OwoKCWlmICggcHJlZml4ICE9PSAibWFyZ2luIiApIHsKCQlqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyOwoJfQp9ICk7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cgljc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJCXZhciBzdHlsZXMsIGxlbiwKCQkJCW1hcCA9IHt9LAoJCQkJaSA9IDA7CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHsKCQkJCXN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApOwoJCQkJbGVuID0gbmFtZS5sZW5ndGg7CgoJCQkJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJCQkJbWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApOwoJCQkJfQoKCQkJCXJldHVybiBtYXA7CgkJCX0KCgkJCXJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8KCQkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CgkJCQlqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7CgkJfSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9Cn0gKTsKCgpmdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7CglyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApOwp9CmpRdWVyeS5Ud2VlbiA9IFR3ZWVuOwoKVHdlZW4ucHJvdG90eXBlID0gewoJY29uc3RydWN0b3I6IFR3ZWVuLAoJaW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkgewoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCQl0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0OwoJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkJdGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTsKCQl0aGlzLmVuZCA9IGVuZDsKCQl0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gIiIgOiAicHgiICk7Cgl9LAoJY3VyOiBmdW5jdGlvbigpIHsKCQl2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdOwoKCQlyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID8KCQkJaG9va3MuZ2V0KCB0aGlzICkgOgoJCQlUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7Cgl9LAoJcnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHsKCQl2YXIgZWFzZWQsCgkJCWhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7CgkJCXRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKAoJCQkJcGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uCgkJCSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7CgkJfQoJCXRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoJCX0KCgkJaWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7CgkJCWhvb2tzLnNldCggdGhpcyApOwoJCX0gZWxzZSB7CgkJCVR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTsKCQl9CgkJcmV0dXJuIHRoaXM7Cgl9Cn07CgpUd2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7CgpUd2Vlbi5wcm9wSG9va3MgPSB7CglfZGVmYXVsdDogewoJCWdldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCQl2YXIgcmVzdWx0OwoKCQkJLy8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCwKCQkJLy8gb3Igd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBzdHlsZSBwcm9wZXJ0eSB0aGF0IGV4aXN0cy4KCQkJaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8CgkJCQl0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJiB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCApIHsKCQkJCXJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07CgkJCX0KCgkJCS8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseQoJCQkvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLgoJCQkvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgIjEwcHgiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7CgkJCS8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgInJvdGF0ZSgxcmFkKSIgYXJlIHJldHVybmVkIGFzLWlzLgoJCQlyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCAiIiApOwoKCQkJLy8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCAiYXV0byIgYXJlIGNvbnZlcnRlZCB0byAwLgoJCQlyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09ICJhdXRvIiA/IDAgOiByZXN1bHQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKCgkJCS8vIFVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0LgoJCQkvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuCgkJCS8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuCgkJCWlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHsKCQkJCWpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7CgkJCX0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiYKCQkJCSggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8CgkJCQkJalF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHsKCQkJCWpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApOwoJCQl9IGVsc2UgewoJCQkJdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93OwoJCQl9CgkJfQoJfQp9OwoKLy8gU3VwcG9ydDogSUUgPD05IG9ubHkKLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzClR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHsKCXNldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCWlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7CgkJCXR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKCQl9Cgl9Cn07CgpqUXVlcnkuZWFzaW5nID0gewoJbGluZWFyOiBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gcDsKCX0sCglzd2luZzogZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjsKCX0sCglfZGVmYXVsdDogInN3aW5nIgp9OwoKalF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7CgovLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludApqUXVlcnkuZnguc3RlcCA9IHt9OwoKCgoKdmFyCglmeE5vdywgaW5Qcm9ncmVzcywKCXJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLAoJcnJ1biA9IC9xdWV1ZUhvb2tzJC87CgpmdW5jdGlvbiBzY2hlZHVsZSgpIHsKCWlmICggaW5Qcm9ncmVzcyApIHsKCQlpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHsKCQkJd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggc2NoZWR1bGUgKTsKCQl9IGVsc2UgewoJCQl3aW5kb3cuc2V0VGltZW91dCggc2NoZWR1bGUsIGpRdWVyeS5meC5pbnRlcnZhbCApOwoJCX0KCgkJalF1ZXJ5LmZ4LnRpY2soKTsKCX0KfQoKLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseQpmdW5jdGlvbiBjcmVhdGVGeE5vdygpIHsKCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsKCQlmeE5vdyA9IHVuZGVmaW5lZDsKCX0gKTsKCXJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApOwp9CgovLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvbgpmdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkgewoJdmFyIHdoaWNoLAoJCWkgPSAwLAoJCWF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTsKCgkvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsCgkvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodAoJaW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7Cglmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7CgkJd2hpY2ggPSBjc3NFeHBhbmRbIGkgXTsKCQlhdHRyc1sgIm1hcmdpbiIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOwoJfQoKCWlmICggaW5jbHVkZVdpZHRoICkgewoJCWF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7Cgl9CgoJcmV0dXJuIGF0dHJzOwp9CgpmdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHsKCXZhciB0d2VlbiwKCQljb2xsZWN0aW9uID0gKCBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggQW5pbWF0aW9uLnR3ZWVuZXJzWyAiKiIgXSApLAoJCWluZGV4ID0gMCwKCQlsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsKCWZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJaWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHsKCgkJCS8vIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5CgkJCXJldHVybiB0d2VlbjsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIGRlZmF1bHRQcmVmaWx0ZXIoIGVsZW0sIHByb3BzLCBvcHRzICkgewoJdmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LAoJCWlzQm94ID0gIndpZHRoIiBpbiBwcm9wcyB8fCAiaGVpZ2h0IiBpbiBwcm9wcywKCQlhbmltID0gdGhpcywKCQlvcmlnID0ge30sCgkJc3R5bGUgPSBlbGVtLnN0eWxlLAoJCWhpZGRlbiA9IGVsZW0ubm9kZVR5cGUgJiYgaXNIaWRkZW5XaXRoaW5UcmVlKCBlbGVtICksCgkJZGF0YVNob3cgPSBkYXRhUHJpdi5nZXQoIGVsZW0sICJmeHNob3ciICk7CgoJLy8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzCglpZiAoICFvcHRzLnF1ZXVlICkgewoJCWhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCAiZngiICk7CgkJaWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkgewoJCQlob29rcy51bnF1ZXVlZCA9IDA7CgkJCW9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlOwoJCQlob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFob29rcy51bnF1ZXVlZCApIHsKCQkJCQlvbGRmaXJlKCk7CgkJCQl9CgkJCX07CgkJfQoJCWhvb2tzLnVucXVldWVkKys7CgoJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzCgkJCWFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHsKCQkJCWhvb2tzLnVucXVldWVkLS07CgkJCQlpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sICJmeCIgKS5sZW5ndGggKSB7CgkJCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCQkJfQoJCQl9ICk7CgkJfSApOwoJfQoKCS8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJZm9yICggcHJvcCBpbiBwcm9wcyApIHsKCQl2YWx1ZSA9IHByb3BzWyBwcm9wIF07CgkJaWYgKCByZnh0eXBlcy50ZXN0KCB2YWx1ZSApICkgewoJCQlkZWxldGUgcHJvcHNbIHByb3AgXTsKCQkJdG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSAidG9nZ2xlIjsKCQkJaWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyAiaGlkZSIgOiAic2hvdyIgKSApIHsKCgkJCQkvLyBQcmV0ZW5kIHRvIGJlIGhpZGRlbiBpZiB0aGlzIGlzIGEgInNob3ciIGFuZAoJCQkJLy8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGUKCQkJCWlmICggdmFsdWUgPT09ICJzaG93IiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJaGlkZGVuID0gdHJ1ZTsKCgkJCQkvLyBJZ25vcmUgYWxsIG90aGVyIG5vLW9wIHNob3cvaGlkZSBkYXRhCgkJCQl9IGVsc2UgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9CgkJCW9yaWdbIHByb3AgXSA9IGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gfHwgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wICk7CgkJfQoJfQoKCS8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpCglwcm9wVHdlZW4gPSAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3BzICk7CglpZiAoICFwcm9wVHdlZW4gJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHsKCQlyZXR1cm47Cgl9CgoJLy8gUmVzdHJpY3QgIm92ZXJmbG93IiBhbmQgImRpc3BsYXkiIHN0eWxlcyBkdXJpbmcgYm94IGFuaW1hdGlvbnMKCWlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCgkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNQoJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QgaW5mZXIgdGhlIHNob3J0aGFuZAoJCS8vIGZyb20gaWRlbnRpY2FsbHktdmFsdWVkIG92ZXJmbG93WCBhbmQgb3ZlcmZsb3dZIGFuZCBFZGdlIGp1c3QgbWlycm9ycwoJCS8vIHRoZSBvdmVyZmxvd1ggdmFsdWUgdGhlcmUuCgkJb3B0cy5vdmVyZmxvdyA9IFsgc3R5bGUub3ZlcmZsb3csIHN0eWxlLm92ZXJmbG93WCwgc3R5bGUub3ZlcmZsb3dZIF07CgoJCS8vIElkZW50aWZ5IGEgZGlzcGxheSB0eXBlLCBwcmVmZXJyaW5nIG9sZCBzaG93L2hpZGUgZGF0YSBvdmVyIHRoZSBDU1MgY2FzY2FkZQoJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVNob3cgJiYgZGF0YVNob3cuZGlzcGxheTsKCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCXJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCAiZGlzcGxheSIgKTsKCQl9CgkJZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApOwoJCWlmICggZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ICkgewoJCQkJZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQl9IGVsc2UgewoKCQkJCS8vIEdldCBub25lbXB0eSB2YWx1ZShzKSBieSB0ZW1wb3JhcmlseSBmb3JjaW5nIHZpc2liaWxpdHkKCQkJCXNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApOwoJCQkJcmVzdG9yZURpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXkgfHwgcmVzdG9yZURpc3BsYXk7CgkJCQlkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0gKTsKCQkJfQoJCX0KCgkJLy8gQW5pbWF0ZSBpbmxpbmUgZWxlbWVudHMgYXMgaW5saW5lLWJsb2NrCgkJaWYgKCBkaXNwbGF5ID09PSAiaW5saW5lIiB8fCBkaXNwbGF5ID09PSAiaW5saW5lLWJsb2NrIiAmJiByZXN0b3JlRGlzcGxheSAhPSBudWxsICkgewoJCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgewoKCQkJCS8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWUgYXQgdGhlIGVuZCBvZiBwdXJlIHNob3cvaGlkZSBhbmltYXRpb25zCgkJCQlpZiAoICFwcm9wVHdlZW4gKSB7CgkJCQkJYW5pbS5kb25lKCBmdW5jdGlvbigpIHsKCQkJCQkJc3R5bGUuZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5OwoJCQkJCX0gKTsKCQkJCQlpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7CgkJCQkJCWRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5OwoJCQkJCQlyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09ICJub25lIiA/ICIiIDogZGlzcGxheTsKCQkJCQl9CgkJCQl9CgkJCQlzdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CgkJCX0KCQl9Cgl9CgoJaWYgKCBvcHRzLm92ZXJmbG93ICkgewoJCXN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJYW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkgewoJCQlzdHlsZS5vdmVyZmxvdyA9IG9wdHMub3ZlcmZsb3dbIDAgXTsKCQkJc3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdOwoJCQlzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07CgkJfSApOwoJfQoKCS8vIEltcGxlbWVudCBzaG93L2hpZGUgYW5pbWF0aW9ucwoJcHJvcFR3ZWVuID0gZmFsc2U7Cglmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgoJCS8vIEdlbmVyYWwgc2hvdy9oaWRlIHNldHVwIGZvciB0aGlzIGVsZW1lbnQgYW5pbWF0aW9uCgkJaWYgKCAhcHJvcFR3ZWVuICkgewoJCQlpZiAoIGRhdGFTaG93ICkgewoJCQkJaWYgKCAiaGlkZGVuIiBpbiBkYXRhU2hvdyApIHsKCQkJCQloaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlkYXRhU2hvdyA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgImZ4c2hvdyIsIHsgZGlzcGxheTogcmVzdG9yZURpc3BsYXkgfSApOwoJCQl9CgoJCQkvLyBTdG9yZSBoaWRkZW4vdmlzaWJsZSBmb3IgdG9nZ2xlIHNvIGAuc3RvcCgpLnRvZ2dsZSgpYCAicmV2ZXJzZXMiCgkJCWlmICggdG9nZ2xlICkgewoJCQkJZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjsKCQkJfQoKCQkJLy8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW0KCQkJaWYgKCBoaWRkZW4gKSB7CgkJCQlzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTsKCQkJfQoKCQkJLyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovCgoJCQlhbmltLmRvbmUoIGZ1bmN0aW9uKCkgewoKCQkJLyogZXNsaW50LWVuYWJsZSBuby1sb29wLWZ1bmMgKi8KCgkJCQkvLyBUaGUgZmluYWwgc3RlcCBvZiBhICJoaWRlIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50CgkJCQlpZiAoICFoaWRkZW4gKSB7CgkJCQkJc2hvd0hpZGUoIFsgZWxlbSBdICk7CgkJCQl9CgkJCQlkYXRhUHJpdi5yZW1vdmUoIGVsZW0sICJmeHNob3ciICk7CgkJCQlmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgkJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTsKCQkJCX0KCQkJfSApOwoJCX0KCgkJLy8gUGVyLXByb3BlcnR5IHNldHVwCgkJcHJvcFR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7CgkJaWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7CgkJCWRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7CgkJCWlmICggaGlkZGVuICkgewoJCQkJcHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDsKCQkJCXByb3BUd2Vlbi5zdGFydCA9IDA7CgkJCX0KCQl9Cgl9Cn0KCmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkgewoJdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rczsKCgkvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3MKCWZvciAoIGluZGV4IGluIHByb3BzICkgewoJCW5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7CgkJZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdOwoJCXZhbHVlID0gcHJvcHNbIGluZGV4IF07CgkJaWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkgewoJCQllYXNpbmcgPSB2YWx1ZVsgMSBdOwoJCQl2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0gdmFsdWVbIDAgXTsKCQl9CgoJCWlmICggaW5kZXggIT09IG5hbWUgKSB7CgkJCXByb3BzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJZGVsZXRlIHByb3BzWyBpbmRleCBdOwoJCX0KCgkJaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTsKCQlpZiAoIGhvb2tzICYmICJleHBhbmQiIGluIGhvb2tzICkgewoJCQl2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTsKCQkJZGVsZXRlIHByb3BzWyBuYW1lIF07CgoJCQkvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuCgkJCS8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgIm5hbWUiCgkJCWZvciAoIGluZGV4IGluIHZhbHVlICkgewoJCQkJaWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkgewoJCQkJCXByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07CgkJCQkJc3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZzsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZzsKCQl9Cgl9Cn0KCmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHsKCXZhciByZXN1bHQsCgkJc3RvcHBlZCwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLAoJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHsKCgkJCS8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvcgoJCQlkZWxldGUgdGljay5lbGVtOwoJCX0gKSwKCQl0aWNrID0gZnVuY3Rpb24oKSB7CgkJCWlmICggc3RvcHBlZCApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAoJCQkJcmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLAoKCQkJCS8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHkKCQkJCS8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5NykKCQkJCXRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCwKCQkJCXBlcmNlbnQgPSAxIC0gdGVtcCwKCQkJCWluZGV4ID0gMCwKCQkJCWxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoOwoKCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCWFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7CgkJCX0KCgkJCWRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSApOwoKCQkJLy8gSWYgdGhlcmUncyBtb3JlIHRvIGRvLCB5aWVsZAoJCQlpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHsKCQkJCXJldHVybiByZW1haW5pbmc7CgkJCX0KCgkJCS8vIElmIHRoaXMgd2FzIGFuIGVtcHR5IGFuaW1hdGlvbiwgc3ludGhlc2l6ZSBhIGZpbmFsIHByb2dyZXNzIG5vdGlmaWNhdGlvbgoJCQlpZiAoICFsZW5ndGggKSB7CgkJCQlkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7CgkJCX0KCgkJCS8vIFJlc29sdmUgdGhlIGFuaW1hdGlvbiBhbmQgcmVwb3J0IGl0cyBjb25jbHVzaW9uCgkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7CgkJCXJldHVybiBmYWxzZTsKCQl9LAoJCWFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHsKCQkJZWxlbTogZWxlbSwKCQkJcHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksCgkJCW9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHsKCQkJCXNwZWNpYWxFYXNpbmc6IHt9LAoJCQkJZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0CgkJCX0sIG9wdGlvbnMgKSwKCQkJb3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLAoJCQlvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsCgkJCXN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKCQkJZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sCgkJCXR3ZWVuczogW10sCgkJCWNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkgewoJCQkJdmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLAoJCQkJCQlhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7CgkJCQlhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7CgkJCQlyZXR1cm4gdHdlZW47CgkJCX0sCgkJCXN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkgewoJCQkJdmFyIGluZGV4ID0gMCwKCgkJCQkJLy8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zCgkJCQkJLy8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0CgkJCQkJbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKCQkJCWlmICggc3RvcHBlZCApIHsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCQkJCXN0b3BwZWQgPSB0cnVlOwoJCQkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJCQlhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOwoJCQkJfQoKCQkJCS8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0CgkJCQlpZiAoIGdvdG9FbmQgKSB7CgkJCQkJZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApOwoJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7CgkJCQl9IGVsc2UgewoJCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJfSApLAoJCXByb3BzID0gYW5pbWF0aW9uLnByb3BzOwoKCXByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7CgoJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQlyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApOwoJCWlmICggcmVzdWx0ICkgewoJCQlpZiAoIGlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7CgkJCQlqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPQoJCQkJCXJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApOwoJCQl9CgkJCXJldHVybiByZXN1bHQ7CgkJfQoJfQoKCWpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7CgoJaWYgKCBpc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkgewoJCWFuaW1hdGlvbi5vcHRzLnN0YXJ0LmNhbGwoIGVsZW0sIGFuaW1hdGlvbiApOwoJfQoKCS8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zCglhbmltYXRpb24KCQkucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzICkKCQkuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKQoJCS5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsICkKCQkuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTsKCglqUXVlcnkuZngudGltZXIoCgkJalF1ZXJ5LmV4dGVuZCggdGljaywgewoJCQllbGVtOiBlbGVtLAoJCQlhbmltOiBhbmltYXRpb24sCgkJCXF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZQoJCX0gKQoJKTsKCglyZXR1cm4gYW5pbWF0aW9uOwp9CgpqUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7CgoJdHdlZW5lcnM6IHsKCQkiKiI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgewoJCQl2YXIgdHdlZW4gPSB0aGlzLmNyZWF0ZVR3ZWVuKCBwcm9wLCB2YWx1ZSApOwoJCQlhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTsKCQkJcmV0dXJuIHR3ZWVuOwoJCX0gXQoJfSwKCgl0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkgewoJCWlmICggaXNGdW5jdGlvbiggcHJvcHMgKSApIHsKCQkJY2FsbGJhY2sgPSBwcm9wczsKCQkJcHJvcHMgPSBbICIqIiBdOwoJCX0gZWxzZSB7CgkJCXByb3BzID0gcHJvcHMubWF0Y2goIHJub3RodG1sd2hpdGUgKTsKCQl9CgoJCXZhciBwcm9wLAoJCQlpbmRleCA9IDAsCgkJCWxlbmd0aCA9IHByb3BzLmxlbmd0aDsKCgkJZm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHsKCQkJcHJvcCA9IHByb3BzWyBpbmRleCBdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdOwoJCQlBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0KCX0sCgoJcHJlZmlsdGVyczogWyBkZWZhdWx0UHJlZmlsdGVyIF0sCgoJcHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7CgkJaWYgKCBwcmVwZW5kICkgewoJCQlBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0gZWxzZSB7CgkJCUFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7CgkJfQoJfQp9ICk7CgpqUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7Cgl2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDogewoJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCWlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCgkJZHVyYXRpb246IHNwZWVkLAoJCWVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nCgl9OwoKCS8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZgoJaWYgKCBqUXVlcnkuZngub2ZmICkgewoJCW9wdC5kdXJhdGlvbiA9IDA7CgoJfSBlbHNlIHsKCQlpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09ICJudW1iZXIiICkgewoJCQlpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF07CgoJCQl9IGVsc2UgewoJCQkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCQkJfQoJCX0KCX0KCgkvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiAiZngiCglpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHsKCQlvcHQucXVldWUgPSAiZngiOwoJfQoKCS8vIFF1ZXVlaW5nCglvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoKCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkgewoJCWlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewoJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsKCQl9CgoJCWlmICggb3B0LnF1ZXVlICkgewoJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7CgkJfQoJfTsKCglyZXR1cm4gb3B0Owp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewoKCQkvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDAKCQlyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuV2l0aGluVHJlZSApLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpCgoJCQkvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQKCQkJLmVuZCgpLmFuaW1hdGUoIHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKCX0sCglhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJdmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSwKCQkJb3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLAoJCQlkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgewoKCQkJCS8vIE9wZXJhdGUgb24gYSBjb3B5IG9mIHByb3Agc28gcGVyLXByb3BlcnR5IGVhc2luZyB3b24ndCBiZSBsb3N0CgkJCQl2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7CgoJCQkJLy8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5CgkJCQlpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgImZpbmlzaCIgKSApIHsKCQkJCQlhbmltLnN0b3AoIHRydWUgKTsKCQkJCX0KCQkJfTsKCQkJZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247CgoJCXJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID8KCQkJdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoKCQkJdGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApOwoJfSwKCXN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgewoJCXZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7CgkJCXZhciBzdG9wID0gaG9va3Muc3RvcDsKCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCXN0b3AoIGdvdG9FbmQgKTsKCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZ290b0VuZCA9IGNsZWFyUXVldWU7CgkJCWNsZWFyUXVldWUgPSB0eXBlOwoJCQl0eXBlID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7CgkJCXRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgZGVxdWV1ZSA9IHRydWUsCgkJCQlpbmRleCA9IHR5cGUgIT0gbnVsbCAmJiB0eXBlICsgInF1ZXVlSG9va3MiLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKTsKCgkJCWlmICggaW5kZXggKSB7CgkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkgewoJCQkJCXN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggaW5kZXggaW4gZGF0YSApIHsKCQkJCQlpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHsKCQkJCQkJc3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJgoJCQkJCSggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkgewoKCQkJCQl0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7CgkJCQkJZGVxdWV1ZSA9IGZhbHNlOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuCgkJCS8vIFRpbWVycyBjdXJyZW50bHkgd2lsbCBjYWxsIHRoZWlyIGNvbXBsZXRlIGNhbGxiYWNrcywgd2hpY2gKCQkJLy8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLgoJCQlpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7CgkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQl9CgkJfSApOwoJfSwKCWZpbmlzaDogZnVuY3Rpb24oIHR5cGUgKSB7CgkJaWYgKCB0eXBlICE9PSBmYWxzZSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCQl9CgkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CgkJCXZhciBpbmRleCwKCQkJCWRhdGEgPSBkYXRhUHJpdi5nZXQoIHRoaXMgKSwKCQkJCXF1ZXVlID0gZGF0YVsgdHlwZSArICJxdWV1ZSIgXSwKCQkJCWhvb2tzID0gZGF0YVsgdHlwZSArICJxdWV1ZUhvb2tzIiBdLAoJCQkJdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWxlbmd0aCA9IHF1ZXVlID8gcXVldWUubGVuZ3RoIDogMDsKCgkJCS8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGEKCQkJZGF0YS5maW5pc2ggPSB0cnVlOwoKCQkJLy8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0CgkJCWpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgW10gKTsKCgkJCWlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHsKCQkJCWhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApOwoJCQl9CgoJCQkvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbQoJCQlmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkgewoJCQkJaWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7CgkJCQkJdGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIExvb2sgZm9yIGFueSBhbmltYXRpb25zIGluIHRoZSBvbGQgcXVldWUgYW5kIGZpbmlzaCB0aGVtCgkJCWZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJCQlpZiAoIHF1ZXVlWyBpbmRleCBdICYmIHF1ZXVlWyBpbmRleCBdLmZpbmlzaCApIHsKCQkJCQlxdWV1ZVsgaW5kZXggXS5maW5pc2guY2FsbCggdGhpcyApOwoJCQkJfQoJCQl9CgoJCQkvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZwoJCQlkZWxldGUgZGF0YS5maW5pc2g7CgkJfSApOwoJfQp9ICk7CgpqUXVlcnkuZWFjaCggWyAidG9nZ2xlIiwgInNob3ciLCAiaGlkZSIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gImJvb2xlYW4iID8KCQkJY3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDoKCQkJdGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9ucwpqUXVlcnkuZWFjaCggewoJc2xpZGVEb3duOiBnZW5GeCggInNob3ciICksCglzbGlkZVVwOiBnZW5GeCggImhpZGUiICksCglzbGlkZVRvZ2dsZTogZ2VuRngoICJ0b2dnbGUiICksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSApOwoKalF1ZXJ5LnRpbWVycyA9IFtdOwpqUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkgewoJdmFyIHRpbWVyLAoJCWkgPSAwLAoJCXRpbWVycyA9IGpRdWVyeS50aW1lcnM7CgoJZnhOb3cgPSBEYXRlLm5vdygpOwoKCWZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHsKCQl0aW1lciA9IHRpbWVyc1sgaSBdOwoKCQkvLyBSdW4gdGhlIHRpbWVyIGFuZCBzYWZlbHkgcmVtb3ZlIGl0IHdoZW4gZG9uZSAoYWxsb3dpbmcgZm9yIGV4dGVybmFsIHJlbW92YWwpCgkJaWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7CgkJCXRpbWVycy5zcGxpY2UoIGktLSwgMSApOwoJCX0KCX0KCglpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCWpRdWVyeS5meC5zdG9wKCk7Cgl9CglmeE5vdyA9IHVuZGVmaW5lZDsKfTsKCmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHsKCWpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTsKCWpRdWVyeS5meC5zdGFydCgpOwp9OwoKalF1ZXJ5LmZ4LmludGVydmFsID0gMTM7CmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkgewoJaWYgKCBpblByb2dyZXNzICkgewoJCXJldHVybjsKCX0KCglpblByb2dyZXNzID0gdHJ1ZTsKCXNjaGVkdWxlKCk7Cn07CgpqUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkgewoJaW5Qcm9ncmVzcyA9IG51bGw7Cn07CgpqUXVlcnkuZnguc3BlZWRzID0gewoJc2xvdzogNjAwLAoJZmFzdDogMjAwLAoKCS8vIERlZmF1bHQgc3BlZWQKCV9kZWZhdWx0OiA0MDAKfTsKCgovLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgewoJdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTsKCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJcmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHsKCQl2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7CgkJaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgewoJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7CgkJfTsKCX0gKTsKfTsKCgooIGZ1bmN0aW9uKCkgewoJdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlucHV0IiApLAoJCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICksCgkJb3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAib3B0aW9uIiApICk7CgoJaW5wdXQudHlwZSA9ICJjaGVja2JveCI7CgoJLy8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5CgkvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSAib24iCglzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gIiI7CgoJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdAoJc3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDsKCgkvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHkKCS8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvCglpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJpbnB1dCIgKTsKCWlucHV0LnZhbHVlID0gInQiOwoJaW5wdXQudHlwZSA9ICJyYWRpbyI7CglzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gInQiOwp9ICkoKTsKCgp2YXIgYm9vbEhvb2ssCglhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9LAoKCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZAoJCWlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSAidW5kZWZpbmVkIiApIHsKCQkJcmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApOwoJCX0KCgkJLy8gQXR0cmlidXRlIGhvb2tzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlcmNhc2UgdmVyc2lvbgoJCS8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWQKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCQkJaG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fAoJCQkJKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZpbmVkICk7CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggdmFsdWUgPT09IG51bGwgKSB7CgkJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZiAoIGhvb2tzICYmICJzZXQiIGluIGhvb2tzICYmCgkJCQkoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyAiIiApOwoJCQlyZXR1cm4gdmFsdWU7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTsKCgkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKCQlyZXR1cm4gcmV0ID09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7Cgl9LAoKCWF0dHJIb29rczogewoJCXR5cGU6IHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQlpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYKCQkJCQlub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgewoJCQkJCXZhciB2YWwgPSBlbGVtLnZhbHVlOwoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7CgkJCQkJaWYgKCB2YWwgKSB7CgkJCQkJCWVsZW0udmFsdWUgPSB2YWw7CgkJCQkJfQoJCQkJCXJldHVybiB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCXZhciBuYW1lLAoJCQlpID0gMCwKCgkJCS8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKCQkJLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yCgkJCWF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7CgoJCWlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCXdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkgewoJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTsKCQkJfQoJCX0KCX0KfSApOwoKLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwpib29sSG9vayA9IHsKCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCWlmICggdmFsdWUgPT09IGZhbHNlICkgewoKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxzZSB7CgkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7CgkJfQoJCXJldHVybiBuYW1lOwoJfQp9OwoKalF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7Cgl2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7CgoJYXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkgewoJCXZhciByZXQsIGhhbmRsZSwKCQkJbG93ZXJjYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCgkJaWYgKCAhaXNYTUwgKSB7CgoJCQkvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyCgkJCWhhbmRsZSA9IGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXTsKCQkJYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0OwoJCQlyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/CgkJCQlsb3dlcmNhc2VOYW1lIDoKCQkJCW51bGw7CgkJCWF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gKTsKCgoKCnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSwKCXJjbGlja2FibGUgPSAvXig/OmF8YXJlYSkkL2k7CgpqUXVlcnkuZm4uZXh0ZW5kKCB7Cglwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwoJfSwKCglyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdOwoJCX0gKTsKCX0KfSApOwoKalF1ZXJ5LmV4dGVuZCggewoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLAoJCQluVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgoJCS8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMKCQlpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHsKCgkJCS8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3MKCQkJbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYKCQkJCSggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCXJldHVybiAoIGVsZW1bIG5hbWUgXSA9IHZhbHVlICk7CgkJfQoKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXJldHVybiBlbGVtWyBuYW1lIF07Cgl9LAoKCXByb3BIb29rczogewoJCXRhYkluZGV4OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJLy8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seQoJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlCgkJCQkvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQKCQkJCS8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJCQkJLy8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCMxMjA3MikKCQkJCXZhciB0YWJpbmRleCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ0YWJpbmRleCIgKTsKCgkJCQlpZiAoIHRhYmluZGV4ICkgewoJCQkJCXJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7CgkJCQl9CgoJCQkJaWYgKAoJCQkJCXJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8CgkJCQkJcmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYKCQkJCQllbGVtLmhyZWYKCQkJCSkgewoJCQkJCXJldHVybiAwOwoJCQkJfQoKCQkJCXJldHVybiAtMTsKCQkJfQoJCX0KCX0sCgoJcHJvcEZpeDogewoJCSJmb3IiOiAiaHRtbEZvciIsCgkJImNsYXNzIjogImNsYXNzTmFtZSIKCX0KfSApOwoKLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5Ci8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eQovLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkCi8vIG9uIHRoZSBvcHRpb24KLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWQKLy8gd2hlbiBpbiBhbiBvcHRncm91cAovLyBlc2xpbnQgcnVsZSAibm8tdW51c2VkLWV4cHJlc3Npb25zIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlCi8vIHNpbmNlIGl0IGNvbnNpZGVycyBzdWNoIGFjY2Vzc2lvbnMgbm9vcAppZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkgewoJalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoKCQkJLyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogIm9mZiIgKi8KCgkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgkJCWlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJcGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJfQoJCQlyZXR1cm4gbnVsbDsKCQl9LAoJCXNldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiAib2ZmIiAqLwoKCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJaWYgKCBwYXJlbnQgKSB7CgkJCQlwYXJlbnQuc2VsZWN0ZWRJbmRleDsKCgkJCQlpZiAoIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgpqUXVlcnkuZWFjaCggWwoJInRhYkluZGV4IiwKCSJyZWFkT25seSIsCgkibWF4TGVuZ3RoIiwKCSJjZWxsU3BhY2luZyIsCgkiY2VsbFBhZGRpbmciLAoJInJvd1NwYW4iLAoJImNvbFNwYW4iLAoJInVzZU1hcCIsCgkiZnJhbWVCb3JkZXIiLAoJImNvbnRlbnRFZGl0YWJsZSIKXSwgZnVuY3Rpb24oKSB7CglqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzOwp9ICk7CgoKCgoJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UgYWNjb3JkaW5nIHRvIEhUTUwgc3BlYwoJLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlCglmdW5jdGlvbiBzdHJpcEFuZENvbGxhcHNlKCB2YWx1ZSApIHsKCQl2YXIgdG9rZW5zID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTsKCQlyZXR1cm4gdG9rZW5zLmpvaW4oICIgIiApOwoJfQoKCmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkgewoJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCAiY2xhc3MiICkgfHwgIiI7Cn0KCmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHsKCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQlyZXR1cm4gdmFsdWU7Cgl9CglpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107Cgl9CglyZXR1cm4gW107Cn0KCmpRdWVyeS5mbi5leHRlbmQoIHsKCWFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJY2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApOwoKCQlpZiAoIGNsYXNzZXMubGVuZ3RoICkgewoJCQl3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7CgkJCQljdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7CgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgkJCQkJCWlmICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPCAwICkgewoJCQkJCQkJY3VyICs9IGNsYXp6ICsgIiAiOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLgoJCQkJCWZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTsKCQkJCQlpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkgewoJCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggImNsYXNzIiwgZmluYWxWYWx1ZSApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLAoJCQlpID0gMDsKCgkJaWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTsKCQkJfSApOwoJCX0KCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJcmV0dXJuIHRoaXMuYXR0ciggImNsYXNzIiwgIiIgKTsKCQl9CgoJCWNsYXNzZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJaWYgKCBjbGFzc2VzLmxlbmd0aCApIHsKCQkJd2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkgewoJCQkJY3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApOwoKCQkJCS8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpCgkJCQljdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggIiAiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArICIgIiApOwoKCQkJCWlmICggY3VyICkgewoJCQkJCWogPSAwOwoJCQkJCXdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7CgoJCQkJCQkvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzCgkJCQkJCXdoaWxlICggY3VyLmluZGV4T2YoICIgIiArIGNsYXp6ICsgIiAiICkgPiAtMSApIHsKCQkJCQkJCWN1ciA9IGN1ci5yZXBsYWNlKCAiICIgKyBjbGF6eiArICIgIiwgIiAiICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuCgkJCQkJZmluYWxWYWx1ZSA9IHN0cmlwQW5kQ29sbGFwc2UoIGN1ciApOwoJCQkJCWlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7CgkJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAiY2xhc3MiLCBmaW5hbFZhbHVlICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CgkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsCgkJCWlzVmFsaWRWYWx1ZSA9IHR5cGUgPT09ICJzdHJpbmciIHx8IEFycmF5LmlzQXJyYXkoIHZhbHVlICk7CgoJCWlmICggdHlwZW9mIHN0YXRlVmFsID09PSAiYm9vbGVhbiIgJiYgaXNWYWxpZFZhbHVlICkgewoJCQlyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTsKCQl9CgoJCWlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcygKCQkJCQl2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLAoJCQkJCXN0YXRlVmFsCgkJCQkpOwoJCQl9ICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJdmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lczsKCgkJCWlmICggaXNWYWxpZFZhbHVlICkgewoKCQkJCS8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzCgkJCQlpID0gMDsKCQkJCXNlbGYgPSBqUXVlcnkoIHRoaXMgKTsKCQkJCWNsYXNzTmFtZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTsKCgkJCQl3aGlsZSAoICggY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0gKSApIHsKCgkJCQkJLy8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0CgkJCQkJaWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHsKCQkJCQkJc2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJc2VsZi5hZGRDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJfQoJCQkJfQoKCQkJLy8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWUKCQkJfSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSAiYm9vbGVhbiIgKSB7CgkJCQljbGFzc05hbWUgPSBnZXRDbGFzcyggdGhpcyApOwoJCQkJaWYgKCBjbGFzc05hbWUgKSB7CgoJCQkJCS8vIFN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKCQkJCQlkYXRhUHJpdi5zZXQoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgY2xhc3NOYW1lICk7CgkJCQl9CgoJCQkJLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCwKCQkJCS8vIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBjbGFzc25hbWUgKGlmIHRoZXJlIHdhcyBvbmUsIHRoZSBhYm92ZSBzYXZlZCBpdCkuCgkJCQkvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLAoJCQkJLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLgoJCQkJaWYgKCB0aGlzLnNldEF0dHJpYnV0ZSApIHsKCQkJCQl0aGlzLnNldEF0dHJpYnV0ZSggImNsYXNzIiwKCQkJCQkJY2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/CgkJCQkJCSIiIDoKCQkJCQkJZGF0YVByaXYuZ2V0KCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIgoJCQkJCSk7CgkJCQl9CgkJCX0KCQl9ICk7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdmFyIGNsYXNzTmFtZSwgZWxlbSwKCQkJaSA9IDA7CgoJCWNsYXNzTmFtZSA9ICIgIiArIHNlbGVjdG9yICsgIiAiOwoJCXdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHsKCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmCgkJCQkoICIgIiArIHN0cmlwQW5kQ29sbGFwc2UoIGdldENsYXNzKCBlbGVtICkgKSArICIgIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KfSApOwoKCgoKdmFyIHJyZXR1cm4gPSAvXHIvZzsKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sCgkJCWVsZW0gPSB0aGlzWyAwIF07CgoJCWlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCWlmICggZWxlbSApIHsKCQkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fAoJCQkJCWpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkJaWYgKCBob29rcyAmJgoJCQkJCSJnZXQiIGluIGhvb2tzICYmCgkJCQkJKCByZXQgPSBob29rcy5nZXQoIGVsZW0sICJ2YWx1ZSIgKSApICE9PSB1bmRlZmluZWQKCQkJCSkgewoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgoJCQkJcmV0ID0gZWxlbS52YWx1ZTsKCgkJCQkvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzCgkJCQlpZiAoIHR5cGVvZiByZXQgPT09ICJzdHJpbmciICkgewoJCQkJCXJldHVybiByZXQucmVwbGFjZSggcnJldHVybiwgIiIgKTsKCQkJCX0KCgkJCQkvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKCQkJCXJldHVybiByZXQgPT0gbnVsbCA/ICIiIDogcmV0OwoJCQl9CgoJCQlyZXR1cm47CgkJfQoKCQl2YWx1ZUlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCB2YWx1ZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJdmFyIHZhbDsKCgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCB2YWx1ZUlzRnVuY3Rpb24gKSB7CgkJCQl2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApOwoJCQl9IGVsc2UgewoJCQkJdmFsID0gdmFsdWU7CgkJCX0KCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2YWwgPSAiIjsKCgkJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09ICJudW1iZXIiICkgewoJCQkJdmFsICs9ICIiOwoKCQkJfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7CgkJCQl2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKyAiIjsKCQkJCX0gKTsKCQkJfQoKCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZwoJCQlpZiAoICFob29rcyB8fCAhKCAic2V0IiBpbiBob29rcyApIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCAidmFsdWUiICkgPT09IHVuZGVmaW5lZCApIHsKCQkJCXRoaXMudmFsdWUgPSB2YWw7CgkJCX0KCQl9ICk7Cgl9Cn0gKTsKCmpRdWVyeS5leHRlbmQoIHsKCXZhbEhvb2tzOiB7CgkJb3B0aW9uOiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgoJCQkJdmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sICJ2YWx1ZSIgKTsKCQkJCXJldHVybiB2YWwgIT0gbnVsbCA/CgkJCQkJdmFsIDoKCgkJCQkJLy8gU3VwcG9ydDogSUUgPD0xMCAtIDExIG9ubHkKCQkJCQkvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAoIzE0Njg2LCAjMTQ4NTgpCgkJCQkJLy8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2UKCQkJCQkvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2Utd2hpdGVzcGFjZQoJCQkJCXN0cmlwQW5kQ29sbGFwc2UoIGpRdWVyeS50ZXh0KCBlbGVtICkgKTsKCQkJfQoJCX0sCgkJc2VsZWN0OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl2YXIgdmFsdWUsIG9wdGlvbiwgaSwKCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCWluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAoJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiLAoJCQkJCXZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSwKCQkJCQltYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDsKCgkJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCQlpID0gbWF4OwoKCQkJCX0gZWxzZSB7CgkJCQkJaSA9IG9uZSA/IGluZGV4IDogMDsKCQkJCX0KCgkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQlmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJLy8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpCgkJCQkJaWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmCgoJCQkJCQkJLy8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cAoJCQkJCQkJIW9wdGlvbi5kaXNhYmxlZCAmJgoJCQkJCQkJKCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwKCQkJCQkJCQkhbm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkgKSApIHsKCgkJCQkJCS8vIEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb24KCQkJCQkJdmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpOwoKCQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHMKCQkJCQkJaWYgKCBvbmUgKSB7CgkJCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQkJCX0KCgkJCQkJCS8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5CgkJCQkJCXZhbHVlcy5wdXNoKCB2YWx1ZSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9LAoKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQl2YXIgb3B0aW9uU2V0LCBvcHRpb24sCgkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKCQkJCQl2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLAoJCQkJCWkgPSBvcHRpb25zLmxlbmd0aDsKCgkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQlvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovCgoJCQkJCWlmICggb3B0aW9uLnNlbGVjdGVkID0KCQkJCQkJalF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29rcy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPiAtMQoJCQkJCSkgewoJCQkJCQlvcHRpb25TZXQgPSB0cnVlOwoJCQkJCX0KCgkJCQkJLyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqLwoJCQkJfQoKCQkJCS8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0CgkJCQlpZiAoICFvcHRpb25TZXQgKSB7CgkJCQkJZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7CgkJCQl9CgkJCQlyZXR1cm4gdmFsdWVzOwoJCQl9CgkJfQoJfQp9ICk7CgovLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlcgpqUXVlcnkuZWFjaCggWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewoJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCWlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHsKCQkJCXJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7CgkJCX0KCQl9Cgl9OwoJaWYgKCAhc3VwcG9ydC5jaGVja09uICkgewoJCWpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoICJ2YWx1ZSIgKSA9PT0gbnVsbCA/ICJvbiIgOiBlbGVtLnZhbHVlOwoJCX07Cgl9Cn0gKTsKCgoKCi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb24KCgpzdXBwb3J0LmZvY3VzaW4gPSAib25mb2N1c2luIiBpbiB3aW5kb3c7CgoKdmFyIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLAoJc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiggZSApIHsKCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJfTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5ldmVudCwgewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkgewoKCQl2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCwKCQkJZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sCgkJCXR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsICJ0eXBlIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LAoJCQluYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCAibmFtZXNwYWNlIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCAiLiIgKSA6IFtdOwoKCQljdXIgPSBsYXN0RWxlbWVudCA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50OwoKCQkvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3cKCQlpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCAiLiIgKSA+IC0xICkgewoKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCggIi4iICk7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCW5hbWVzcGFjZXMuc29ydCgpOwoJCX0KCQlvbnR5cGUgPSB0eXBlLmluZGV4T2YoICI6IiApIDwgMCAmJiAib24iICsgdHlwZTsKCgkJLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCgkJZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/CgkJCWV2ZW50IDoKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiAmJiBldmVudCApOwoKCQkvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpCgkJZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7CgkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCAiLiIgKTsKCQlldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID8KCQkJbmV3IFJlZ0V4cCggIihefFxcLikiICsgbmFtZXNwYWNlcy5qb2luKCAiXFwuKD86LipcXC58KSIgKSArICIoXFwufCQpIiApIDoKCQkJbnVsbDsKCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwoJCWlmICggIWV2ZW50LnRhcmdldCApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKCQl9CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKCQlkYXRhID0gZGF0YSA9PSBudWxsID8KCQkJWyBldmVudCBdIDoKCQkJalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7CgoJCS8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXMKCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpCgkJLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNCkKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQlidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTsKCQkJaWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHsKCQkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCQl9CgkJCWZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHsKCQkJCWV2ZW50UGF0aC5wdXNoKCBjdXIgKTsKCQkJCXRtcCA9IGN1cjsKCQkJfQoKCQkJLy8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pCgkJCWlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkgewoJCQkJZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApOwoJCQl9CgkJfQoKCQkvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoCgkJaSA9IDA7CgkJd2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJbGFzdEVsZW1lbnQgPSBjdXI7CgkJCWV2ZW50LnR5cGUgPSBpID4gMSA/CgkJCQlidWJibGVUeXBlIDoKCQkJCXNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTsKCgkJCS8vIGpRdWVyeSBoYW5kbGVyCgkJCWhhbmRsZSA9ICggZGF0YVByaXYuZ2V0KCBjdXIsICJldmVudHMiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmCgkJCQlkYXRhUHJpdi5nZXQoIGN1ciwgImhhbmRsZSIgKTsKCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQloYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApOwoJCQl9CgoJCQkvLyBOYXRpdmUgaGFuZGxlcgoJCQloYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTsKCQkJaWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkgewoJCQkJZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKCQkJCWlmICggZXZlbnQucmVzdWx0ID09PSBmYWxzZSApIHsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJfQoJCQl9CgkJfQoJCWV2ZW50LnR5cGUgPSB0eXBlOwoKCQkvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93CgkJaWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCgkJCWlmICggKCAhc3BlY2lhbC5fZGVmYXVsdCB8fAoJCQkJc3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiYKCQkJCWFjY2VwdERhdGEoIGVsZW0gKSApIHsKCgkJCQkvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgoJCQkJLy8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKQoJCQkJaWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7CgoJCQkJCS8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKCQkJCQl0bXAgPSBlbGVtWyBvbnR5cGUgXTsKCgkJCQkJaWYgKCB0bXAgKSB7CgkJCQkJCWVsZW1bIG9udHlwZSBdID0gbnVsbDsKCQkJCQl9CgoJCQkJCS8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlCgkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7CgoJCQkJCWlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJCQkJbGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTsKCQkJCQl9CgoJCQkJCWVsZW1bIHR5cGUgXSgpOwoKCQkJCQlpZiAoIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCQkJCWxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7CgkJCQkJfQoKCQkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkOwoKCQkJCQlpZiAoIHRtcCApIHsKCQkJCQkJZWxlbVsgb250eXBlIF0gPSB0bXA7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUKCS8vIFVzZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzCglzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50ICkgewoJCXZhciBlID0galF1ZXJ5LmV4dGVuZCgKCQkJbmV3IGpRdWVyeS5FdmVudCgpLAoJCQlldmVudCwKCQkJewoJCQkJdHlwZTogdHlwZSwKCQkJCWlzU2ltdWxhdGVkOiB0cnVlCgkJCX0KCQkpOwoKCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApOwoJfQoKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoKCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOwoJCX0gKTsKCX0sCgl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJdmFyIGVsZW0gPSB0aGlzWyAwIF07CgkJaWYgKCBlbGVtICkgewoJCQlyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTsKCQl9Cgl9Cn0gKTsKCgovLyBTdXBwb3J0OiBGaXJlZm94IDw9NDQKLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50cwovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4NwovLwovLyBTdXBwb3J0OiBDaHJvbWUgPD00OCAtIDQ5LCBTYWZhcmkgPD05LjAgLSA5LjEKLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsCi8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlcgovLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1NwppZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7CglqUXVlcnkuZWFjaCggeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CgoJCS8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciBvbiB0aGUgZG9jdW1lbnQgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0CgkJdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTsKCQl9OwoKCQlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CgkJCXNldHVwOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTsKCgkJCQlpZiAoICFhdHRhY2hlcyApIHsKCQkJCQlkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQkJZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCwgKCBhdHRhY2hlcyB8fCAwICkgKyAxICk7CgkJCX0sCgkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJCXZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcywKCQkJCQlhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7CgoJCQkJaWYgKCAhYXR0YWNoZXMgKSB7CgkJCQkJZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTsKCQkJCQlkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7CgoJCQkJfSBlbHNlIHsKCQkJCQlkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApOwoJCQkJfQoJCQl9CgkJfTsKCX0gKTsKfQp2YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247Cgp2YXIgbm9uY2UgPSBEYXRlLm5vdygpOwoKdmFyIHJxdWVyeSA9ICggL1w/LyApOwoKCgovLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nCmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkgewoJdmFyIHhtbDsKCWlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICJzdHJpbmciICkgewoJCXJldHVybiBudWxsOwoJfQoKCS8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5CgkvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC4KCXRyeSB7CgkJeG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCAidGV4dC94bWwiICk7Cgl9IGNhdGNoICggZSApIHsKCQl4bWwgPSB1bmRlZmluZWQ7Cgl9CgoJaWYgKCAheG1sIHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKCQlqUXVlcnkuZXJyb3IoICJJbnZhbGlkIFhNTDogIiArIGRhdGEgKTsKCX0KCXJldHVybiB4bWw7Cn07CgoKdmFyCglyYnJhY2tldCA9IC9cW1xdJC8sCglyQ1JMRiA9IC9ccj9cbi9nLAoJcnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLAoJcnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pOwoKZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkgewoJdmFyIG5hbWU7CgoJaWYgKCBBcnJheS5pc0FycmF5KCBvYmogKSApIHsKCgkJLy8gU2VyaWFsaXplIGFycmF5IGl0ZW0uCgkJalF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7CgkJCWlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7CgoJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgoJCQkJYWRkKCBwcmVmaXgsIHYgKTsKCgkJCX0gZWxzZSB7CgoJCQkJLy8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguCgkJCQlidWlsZFBhcmFtcygKCQkJCQlwcmVmaXggKyAiWyIgKyAoIHR5cGVvZiB2ID09PSAib2JqZWN0IiAmJiB2ICE9IG51bGwgPyBpIDogIiIgKSArICJdIiwKCQkJCQl2LAoJCQkJCXRyYWRpdGlvbmFsLAoJCQkJCWFkZAoJCQkJKTsKCQkJfQoJCX0gKTsKCgl9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gIm9iamVjdCIgKSB7CgoJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KCQlmb3IgKCBuYW1lIGluIG9iaiApIHsKCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArIG5hbWUgKyAiXSIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoKCX0gZWxzZSB7CgoJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KCQlhZGQoIHByZWZpeCwgb2JqICk7Cgl9Cn0KCi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwpqUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7Cgl2YXIgcHJlZml4LAoJCXMgPSBbXSwKCQlhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7CgoJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHVzZSBpdHMgcmV0dXJuIHZhbHVlCgkJCXZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID8KCQkJCXZhbHVlT3JGdW5jdGlvbigpIDoKCQkJCXZhbHVlT3JGdW5jdGlvbjsKCgkJCXNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgIj0iICsKCQkJCWVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUgKTsKCQl9OwoKCS8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCglpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7CgoJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cwoJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKCQl9ICk7CgoJfSBlbHNlIHsKCgkJLy8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCgkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCgkJZm9yICggcHJlZml4IGluIGEgKSB7CgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoJfQoKCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KCXJldHVybiBzLmpvaW4oICImIiApOwp9OwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5LnBhcmFtKCB0aGlzLnNlcmlhbGl6ZUFycmF5KCkgKTsKCX0sCglzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCgkJCS8vIENhbiBhZGQgcHJvcEhvb2sgZm9yICJlbGVtZW50cyIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzCgkJCXZhciBlbGVtZW50cyA9IGpRdWVyeS5wcm9wKCB0aGlzLCAiZWxlbWVudHMiICk7CgkJCXJldHVybiBlbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkoIGVsZW1lbnRzICkgOiB0aGlzOwoJCX0gKQoJCS5maWx0ZXIoIGZ1bmN0aW9uKCkgewoJCQl2YXIgdHlwZSA9IHRoaXMudHlwZTsKCgkJCS8vIFVzZSAuaXMoICI6ZGlzYWJsZWQiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3MKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhalF1ZXJ5KCB0aGlzICkuaXMoICI6ZGlzYWJsZWQiICkgJiYKCQkJCXJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiYKCQkJCSggdGhpcy5jaGVja2VkIHx8ICFyY2hlY2thYmxlVHlwZS50ZXN0KCB0eXBlICkgKTsKCQl9ICkKCQkubWFwKCBmdW5jdGlvbiggaSwgZWxlbSApIHsKCQkJdmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpOwoKCQkJaWYgKCB2YWwgPT0gbnVsbCApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgoJCQlpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJcmV0dXJuIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHsKCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CgkJCQl9ICk7CgkJCX0KCgkJCXJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKCQl9ICkuZ2V0KCk7Cgl9Cn0gKTsKCgp2YXIKCXIyMCA9IC8lMjAvZywKCXJoYXNoID0gLyMuKiQvLAoJcmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLywKCXJoZWFkZXJzID0gL14oLio/KTpbIFx0XSooW15cclxuXSopJC9tZywKCgkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sCglybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLywKCXJwcm90b2NvbCA9IC9eXC9cLy8sCgoJLyogUHJlZmlsdGVycwoJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CgkgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CgkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXByZWZpbHRlcnMgPSB7fSwKCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCgkgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAoJICovCgl0cmFuc3BvcnRzID0ge30sCgoJLy8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uCglhbGxUeXBlcyA9ICIqLyIuY29uY2F0KCAiKiIgKSwKCgkvLyBBbmNob3IgdGFnIGZvciBwYXJzaW5nIHRoZSBkb2N1bWVudCBvcmlnaW4KCW9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwoJb3JpZ2luQW5jaG9yLmhyZWYgPSBsb2NhdGlvbi5ocmVmOwoKLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CgoJLy8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewoKCQlpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgewoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwoJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CgkJfQoKCQl2YXIgZGF0YVR5cGUsCgkJCWkgPSAwLAoJCQlkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdOwoKCQlpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHsKCgkJCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb24KCQkJd2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkgewoKCQkJCS8vIFByZXBlbmQgaWYgcmVxdWVzdGVkCgkJCQlpZiAoIGRhdGFUeXBlWyAwIF0gPT09ICIrIiApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnNsaWNlKCAxICkgfHwgIioiOwoJCQkJCSggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApOwoKCQkJCS8vIE90aGVyd2lzZSBhcHBlbmQKCQkJCX0gZWxzZSB7CgkJCQkJKCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7CgkJCQl9CgkJCX0KCQl9Cgl9Owp9CgovLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHsKCgl2YXIgaW5zcGVjdGVkID0ge30sCgkJc2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7CgoJZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7CgkJdmFyIHNlbGVjdGVkOwoJCWluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7CgkJalF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHsKCQkJdmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTsKCQkJaWYgKCB0eXBlb2YgZGF0YVR5cGVPclRyYW5zcG9ydCA9PT0gInN0cmluZyIgJiYKCQkJCSFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHsKCgkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlpbnNwZWN0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSBpZiAoIHNlZWtpbmdUcmFuc3BvcnQgKSB7CgkJCQlyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7CgkJCX0KCQl9ICk7CgkJcmV0dXJuIHNlbGVjdGVkOwoJfQoKCXJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgIioiIF0gJiYgaW5zcGVjdCggIioiICk7Cn0KCi8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucwovLyB0aGF0IHRha2VzICJmbGF0IiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZCkKLy8gRml4ZXMgIzk4ODcKZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7Cgl2YXIga2V5LCBkZWVwLAoJCWZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTsKCglmb3IgKCBrZXkgaW4gc3JjICkgewoJCWlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgewoJCQkoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdOwoJCX0KCX0KCWlmICggZGVlcCApIHsKCQlqUXVlcnkuZXh0ZW5kKCB0cnVlLCB0YXJnZXQsIGRlZXAgKTsKCX0KCglyZXR1cm4gdGFyZ2V0Owp9CgovKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6CiAqIC0gZmluZHMgdGhlIHJpZ2h0IGRhdGFUeXBlIChtZWRpYXRlcyBiZXR3ZWVuIGNvbnRlbnQtdHlwZSBhbmQgZXhwZWN0ZWQgZGF0YVR5cGUpCiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQogKi8KZnVuY3Rpb24gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIHsKCgl2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsCgkJY29udGVudHMgPSBzLmNvbnRlbnRzLAoJCWRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzOwoKCS8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzCgl3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CgkJZGF0YVR5cGVzLnNoaWZ0KCk7CgkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgewoJCQljdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJDb250ZW50LVR5cGUiICk7CgkJfQoJfQoKCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQoJaWYgKCBjdCApIHsKCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgewoJCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewoJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQoJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CgkJZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwoJfSBlbHNlIHsKCgkJLy8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlcwoJCWZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewoJCQlpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyAiICIgKyBkYXRhVHlwZXNbIDAgXSBdICkgewoJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgewoJCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7CgkJCX0KCQl9CgoJCS8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZQoJCWZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7Cgl9CgoJLy8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZQoJLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKCS8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKCWlmICggZmluYWxEYXRhVHlwZSApIHsKCQlpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkgewoJCQlkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApOwoJCX0KCQlyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07Cgl9Cn0KCi8qIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UKICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlCiAqLwpmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKSB7Cgl2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldiwKCQljb252ZXJ0ZXJzID0ge30sCgoJCS8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb24KCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpOwoKCS8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5cwoJaWYgKCBkYXRhVHlwZXNbIDEgXSApIHsKCQlmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHsKCQkJY29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTsKCQl9Cgl9CgoJY3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpOwoKCS8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlCgl3aGlsZSAoIGN1cnJlbnQgKSB7CgoJCWlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkgewoJCQlqcVhIUlsgcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdIF0gPSByZXNwb25zZTsKCQl9CgoJCS8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkCgkJaWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkgewoJCQlyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTsKCQl9CgoJCXByZXYgPSBjdXJyZW50OwoJCWN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTsKCgkJaWYgKCBjdXJyZW50ICkgewoKCQkJLy8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0bwoJCQlpZiAoIGN1cnJlbnQgPT09ICIqIiApIHsKCgkJCQljdXJyZW50ID0gcHJldjsKCgkJCS8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnQKCQkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CgoJCQkJLy8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbICIqICIgKyBjdXJyZW50IF07CgoJCQkJLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKCQkJCWlmICggIWNvbnYgKSB7CgkJCQkJZm9yICggY29udjIgaW4gY29udmVydGVycyApIHsKCgkJCQkJCS8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudAoJCQkJCQl0bXAgPSBjb252Mi5zcGxpdCggIiAiICk7CgkJCQkJCWlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7CgoJCQkJCQkJLy8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0CgkJCQkJCQljb252ID0gY29udmVydGVyc1sgcHJldiArICIgIiArIHRtcFsgMCBdIF0gfHwKCQkJCQkJCQljb252ZXJ0ZXJzWyAiKiAiICsgdG1wWyAwIF0gXTsKCQkJCQkJCWlmICggY29udiApIHsKCgkJCQkJCQkJLy8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVycwoJCQkJCQkJCWlmICggY29udiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQkJY29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07CgoJCQkJCQkJCS8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGUKCQkJCQkJCQl9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgewoJCQkJCQkJCQljdXJyZW50ID0gdG1wWyAwIF07CgkJCQkJCQkJCWRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApOwoJCQkJCQkJCX0KCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQkvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSkKCQkJCWlmICggY29udiAhPT0gdHJ1ZSApIHsKCgkJCQkJLy8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbQoJCQkJCWlmICggY29udiAmJiBzLnRocm93cyApIHsKCQkJCQkJcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXRyeSB7CgkJCQkJCQlyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7CgkJCQkJCX0gY2F0Y2ggKCBlICkgewoJCQkJCQkJcmV0dXJuIHsKCQkJCQkJCQlzdGF0ZTogInBhcnNlcmVycm9yIiwKCQkJCQkJCQllcnJvcjogY29udiA/IGUgOiAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAiICsgY3VycmVudAoJCQkJCQkJfTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4geyBzdGF0ZTogInN1Y2Nlc3MiLCBkYXRhOiByZXNwb25zZSB9Owp9CgpqUXVlcnkuZXh0ZW5kKCB7CgoJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCglhY3RpdmU6IDAsCgoJLy8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdAoJbGFzdE1vZGlmaWVkOiB7fSwKCWV0YWc6IHt9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogbG9jYXRpb24uaHJlZiwKCQl0eXBlOiAiR0VUIiwKCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLAoJCWdsb2JhbDogdHJ1ZSwKCQlwcm9jZXNzRGF0YTogdHJ1ZSwKCQlhc3luYzogdHJ1ZSwKCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCgoJCS8qCgkJdGltZW91dDogMCwKCQlkYXRhOiBudWxsLAoJCWRhdGFUeXBlOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCWNhY2hlOiBudWxsLAoJCXRocm93czogZmFsc2UsCgkJdHJhZGl0aW9uYWw6IGZhbHNlLAoJCWhlYWRlcnM6IHt9LAoJCSovCgoJCWFjY2VwdHM6IHsKCQkJIioiOiBhbGxUeXBlcywKCQkJdGV4dDogInRleHQvcGxhaW4iLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCgkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiCgkJfSwKCgkJY29udGVudHM6IHsKCQkJeG1sOiAvXGJ4bWxcYi8sCgkJCWh0bWw6IC9cYmh0bWwvLAoJCQlqc29uOiAvXGJqc29uXGIvCgkJfSwKCgkJcmVzcG9uc2VGaWVsZHM6IHsKCQkJeG1sOiAicmVzcG9uc2VYTUwiLAoJCQl0ZXh0OiAicmVzcG9uc2VUZXh0IiwKCQkJanNvbjogInJlc3BvbnNlSlNPTiIKCQl9LAoKCQkvLyBEYXRhIGNvbnZlcnRlcnMKCQkvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgIioiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZQoJCWNvbnZlcnRlcnM6IHsKCgkJCS8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAoJCQkiKiB0ZXh0IjogU3RyaW5nLAoKCQkJLy8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pCgkJCSJ0ZXh0IGh0bWwiOiB0cnVlLAoKCQkJLy8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvbgoJCQkidGV4dCBqc29uIjogSlNPTi5wYXJzZSwKCgkJCS8vIFBhcnNlIHRleHQgYXMgeG1sCgkJCSJ0ZXh0IHhtbCI6IGpRdWVyeS5wYXJzZVhNTAoJCX0sCgoJCS8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6CgkJLy8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZgoJCS8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlCgkJLy8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpCgkJZmxhdE9wdGlvbnM6IHsKCQkJdXJsOiB0cnVlLAoJCQljb250ZXh0OiB0cnVlCgkJfQoJfSwKCgkvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldAoJLy8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLgoJLy8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy4KCWFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7CgkJcmV0dXJuIHNldHRpbmdzID8KCgkJCS8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0CgkJCWFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDoKCgkJCS8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3MKCQkJYWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7Cgl9LAoKCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAoJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCgoJLy8gTWFpbiBtZXRob2QKCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CgoJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCgkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKCQkJb3B0aW9ucyA9IHVybDsKCQkJdXJsID0gdW5kZWZpbmVkOwoJCX0KCgkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJdmFyIHRyYW5zcG9ydCwKCgkJCS8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW0KCQkJY2FjaGVVUkwsCgoJCQkvLyBSZXNwb25zZSBoZWFkZXJzCgkJCXJlc3BvbnNlSGVhZGVyc1N0cmluZywKCQkJcmVzcG9uc2VIZWFkZXJzLAoKCQkJLy8gdGltZW91dCBoYW5kbGUKCQkJdGltZW91dFRpbWVyLAoKCQkJLy8gVXJsIGNsZWFudXAgdmFyCgkJCXVybEFuY2hvciwKCgkJCS8vIFJlcXVlc3Qgc3RhdGUgKGJlY29tZXMgZmFsc2UgdXBvbiBzZW5kIGFuZCB0cnVlIHVwb24gY29tcGxldGlvbikKCQkJY29tcGxldGVkLAoKCQkJLy8gVG8ga25vdyBpZiBnbG9iYWwgZXZlbnRzIGFyZSB0byBiZSBkaXNwYXRjaGVkCgkJCWZpcmVHbG9iYWxzLAoKCQkJLy8gTG9vcCB2YXJpYWJsZQoJCQlpLAoKCQkJLy8gdW5jYWNoZWQgcGFydCBvZiB0aGUgdXJsCgkJCXVuY2FjaGVkLAoKCQkJLy8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdAoJCQlzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSwKCgkJCS8vIENhbGxiYWNrcyBjb250ZXh0CgkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAoKCQkJLy8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cyBpcyBjYWxsYmFja0NvbnRleHQgaWYgaXQgaXMgYSBET00gbm9kZSBvciBqUXVlcnkgY29sbGVjdGlvbgoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiYKCQkJCSggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dC5qcXVlcnkgKSA/CgkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6CgkJCQkJalF1ZXJ5LmV2ZW50LAoKCQkJLy8gRGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCAib25jZSBtZW1vcnkiICksCgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LAoKCQkJLy8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSkKCQkJcmVxdWVzdEhlYWRlcnMgPSB7fSwKCQkJcmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LAoKCQkJLy8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlCgkJCXN0ckFib3J0ID0gImNhbmNlbGVkIiwKCgkJCS8vIEZha2UgeGhyCgkJCWpxWEhSID0gewoJCQkJcmVhZHlTdGF0ZTogMCwKCgkJCQkvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCgkJCQlnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHsKCQkJCQl2YXIgbWF0Y2g7CgkJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OwoJCQkJCQkJd2hpbGUgKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHsKCQkJCQkJCQlyZXNwb25zZUhlYWRlcnNbIG1hdGNoWyAxIF0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQltYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKCQkJCQl9CgkJCQkJcmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7CgkJCQl9LAoKCQkJCS8vIFJhdyBzdHJpbmcKCQkJCWdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7CgkJCQl9LAoKCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyCgkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJCQkJaWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHsKCQkJCQkJbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdID0KCQkJCQkJCXJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IG5hbWU7CgkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCgkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkgewoJCQkJCQlzLm1pbWVUeXBlID0gdHlwZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCQlzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkgewoJCQkJCXZhciBjb2RlOwoJCQkJCWlmICggbWFwICkgewoJCQkJCQlpZiAoIGNvbXBsZXRlZCApIHsKCgkJCQkJCQkvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3MKCQkJCQkJCWpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApOwoJCQkJCQl9IGVsc2UgewoKCQkJCQkJCS8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzCgkJCQkJCQlmb3IgKCBjb2RlIGluIG1hcCApIHsKCQkJCQkJCQlzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gQ2FuY2VsIHRoZSByZXF1ZXN0CgkJCQlhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7CgkJCQkJdmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7CgkJCQkJaWYgKCB0cmFuc3BvcnQgKSB7CgkJCQkJCXRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7CgkJCQkJfQoJCQkJCWRvbmUoIDAsIGZpbmFsVGV4dCApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQl9OwoKCQkvLyBBdHRhY2ggZGVmZXJyZWRzCgkJZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKTsKCgkJLy8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpCgkJLy8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSkKCQkvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGUKCQlzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgIiIgKQoJCQkucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArICIvLyIgKTsKCgkJLy8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0CgkJcy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTsKCgkJLy8gRXh0cmFjdCBkYXRhVHlwZXMgbGlzdAoJCXMuZGF0YVR5cGVzID0gKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbICIiIF07CgoJCS8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLgoJCWlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkgewoJCQl1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiYSIgKTsKCgkJCS8vIFN1cHBvcnQ6IElFIDw9OCAtIDExLCBFZGdlIDEyIC0gMTUKCQkJLy8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCwKCQkJLy8gZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4LwoJCQl0cnkgewoJCQkJdXJsQW5jaG9yLmhyZWYgPSBzLnVybDsKCgkJCQkvLyBTdXBwb3J0OiBJRSA8PTggLSAxMSBvbmx5CgkJCQkvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZQoJCQkJdXJsQW5jaG9yLmhyZWYgPSB1cmxBbmNob3IuaHJlZjsKCQkJCXMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyAiLy8iICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09CgkJCQkJdXJsQW5jaG9yLnByb3RvY29sICsgIi8vIiArIHVybEFuY2hvci5ob3N0OwoJCQl9IGNhdGNoICggZSApIHsKCgkJCQkvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbiwKCQkJCS8vIGl0IGNhbiBiZSByZWplY3RlZCBieSB0aGUgdHJhbnNwb3J0IGlmIGl0IGlzIGludmFsaWQKCQkJCXMuY3Jvc3NEb21haW4gPSB0cnVlOwoJCQl9CgkJfQoKCQkvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKCQlpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09ICJzdHJpbmciICkgewoJCQlzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApOwoJCX0KCgkJLy8gQXBwbHkgcHJlZmlsdGVycwoJCWluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApOwoKCQkvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZQoJCWlmICggY29tcGxldGVkICkgewoJCQlyZXR1cm4ganFYSFI7CgkJfQoKCQkvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0bwoJCS8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpCgkJZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgkJfQoKCQkvLyBVcHBlcmNhc2UgdGhlIHR5cGUKCQlzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKCQlzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTsKCgkJLy8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlCgkJLy8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uCgkJLy8gUmVtb3ZlIGhhc2ggdG8gc2ltcGxpZnkgdXJsIG1hbmlwdWxhdGlvbgoJCWNhY2hlVVJMID0gcy51cmwucmVwbGFjZSggcmhhc2gsICIiICk7CgoJCS8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CgkJaWYgKCAhcy5oYXNDb250ZW50ICkgewoKCQkJLy8gUmVtZW1iZXIgdGhlIGhhc2ggc28gd2UgY2FuIHB1dCBpdCBiYWNrCgkJCXVuY2FjaGVkID0gcy51cmwuc2xpY2UoIGNhY2hlVVJMLmxlbmd0aCApOwoKCQkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQsIGFwcGVuZCBkYXRhIHRvIHVybAoJCQlpZiAoIHMuZGF0YSAmJiAoIHMucHJvY2Vzc0RhdGEgfHwgdHlwZW9mIHMuZGF0YSA9PT0gInN0cmluZyIgKSApIHsKCQkJCWNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YTsKCgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CgkJCQljYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsICIkMSIgKTsKCQkJCXVuY2FjaGVkID0gKCBycXVlcnkudGVzdCggY2FjaGVVUkwgKSA/ICImIiA6ICI/IiApICsgIl89IiArICggbm9uY2UrKyApICsgdW5jYWNoZWQ7CgkJCX0KCgkJCS8vIFB1dCBoYXNoIGFuZCBhbnRpLWNhY2hlIG9uIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCAoZ2gtMTczMikKCQkJcy51cmwgPSBjYWNoZVVSTCArIHVuY2FjaGVkOwoKCQkvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OCkKCQl9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJgoJCQkoIHMuY29udGVudFR5cGUgfHwgIiIgKS5pbmRleE9mKCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiApID09PSAwICkgewoJCQlzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCAiKyIgKTsKCQl9CgoJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgkJCWlmICggalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTsKCQkJfQoJCQlpZiAoIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICkgewoJCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIklmLU5vbmUtTWF0Y2giLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKCQl9CgoJCS8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKAoJCQkiQWNjZXB0IiwKCQkJcy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/CgkJCQlzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSArCgkJCQkJKCBzLmRhdGFUeXBlc1sgMCBdICE9PSAiKiIgPyAiLCAiICsgYWxsVHlwZXMgKyAiOyBxPTAuMDEiIDogIiIgKSA6CgkJCQlzLmFjY2VwdHNbICIqIiBdCgkJKTsKCgkJLy8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uCgkJZm9yICggaSBpbiBzLmhlYWRlcnMgKSB7CgkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIGksIHMuaGVhZGVyc1sgaSBdICk7CgkJfQoKCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CgkJaWYgKCBzLmJlZm9yZVNlbmQgJiYKCQkJKCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHsKCgkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVybgoJCQlyZXR1cm4ganFYSFIuYWJvcnQoKTsKCQl9CgoJCS8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvbgoJCXN0ckFib3J0ID0gImFib3J0IjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCgkJY29tcGxldGVEZWZlcnJlZC5hZGQoIHMuY29tcGxldGUgKTsKCQlqcVhIUi5kb25lKCBzLnN1Y2Nlc3MgKTsKCQlqcVhIUi5mYWlsKCBzLmVycm9yICk7CgoJCS8vIEdldCB0cmFuc3BvcnQKCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CgkJaWYgKCAhdHJhbnNwb3J0ICkgewoJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKCQl9IGVsc2UgewoJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKCgkJCS8vIFNlbmQgZ2xvYmFsIGV2ZW50CgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhTZW5kIiwgWyBqcVhIUiwgcyBdICk7CgkJCX0KCgkJCS8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGFqYXhTZW5kLCBzdG9wIHRoZXJlCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuIGpxWEhSOwoJCQl9CgoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCWpxWEhSLmFib3J0KCAidGltZW91dCIgKTsKCQkJCX0sIHMudGltZW91dCApOwoJCQl9CgoJCQl0cnkgewoJCQkJY29tcGxldGVkID0gZmFsc2U7CgkJCQl0cmFuc3BvcnQuc2VuZCggcmVxdWVzdEhlYWRlcnMsIGRvbmUgKTsKCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJLy8gUmV0aHJvdyBwb3N0LWNvbXBsZXRpb24gZXhjZXB0aW9ucwoJCQkJaWYgKCBjb21wbGV0ZWQgKSB7CgkJCQkJdGhyb3cgZTsKCQkJCX0KCgkJCQkvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHMKCQkJCWRvbmUoIC0xLCBlICk7CgkJCX0KCQl9CgoJCS8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZQoJCWZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkgewoJCQl2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLAoJCQkJc3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7CgoJCQkvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zCgkJCWlmICggY29tcGxldGVkICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQljb21wbGV0ZWQgPSB0cnVlOwoKCQkJLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKCQkJaWYgKCB0aW1lb3V0VGltZXIgKSB7CgkJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKCQkJfQoKCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24KCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwoKCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwoKCQkJLy8gU2V0IHJlYWR5U3RhdGUKCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKCgkJCS8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsCgkJCWlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0OwoKCQkJLy8gR2V0IHJlc3BvbnNlIGRhdGEKCQkJaWYgKCByZXNwb25zZXMgKSB7CgkJCQlyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTsKCQkJfQoKCQkJLy8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KQoJCQlyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApOwoKCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmcKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KCQkJCWlmICggcy5pZk1vZGlmaWVkICkgewoJCQkJCW1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJMYXN0LU1vZGlmaWVkIiApOwoJCQkJCWlmICggbW9kaWZpZWQgKSB7CgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQkJbW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggImV0YWciICk7CgkJCQkJaWYgKCBtb2RpZmllZCApIHsKCQkJCQkJalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gaWYgbm8gY29udGVudAoJCQkJaWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09ICJIRUFEIiApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vY29udGVudCI7CgoJCQkJLy8gaWYgbm90IG1vZGlmaWVkCgkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHsKCQkJCQlzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKCgkJCQkvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXQKCQkJCX0gZWxzZSB7CgkJCQkJc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXRlOwoJCQkJCXN1Y2Nlc3MgPSByZXNwb25zZS5kYXRhOwoJCQkJCWVycm9yID0gcmVzcG9uc2UuZXJyb3I7CgkJCQkJaXNTdWNjZXNzID0gIWVycm9yOwoJCQkJfQoJCQl9IGVsc2UgewoKCQkJCS8vIEV4dHJhY3QgZXJyb3IgZnJvbSBzdGF0dXNUZXh0IGFuZCBub3JtYWxpemUgZm9yIG5vbi1hYm9ydHMKCQkJCWVycm9yID0gc3RhdHVzVGV4dDsKCQkJCWlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkgewoJCQkJCXN0YXR1c1RleHQgPSAiZXJyb3IiOwoJCQkJCWlmICggc3RhdHVzIDwgMCApIHsKCQkJCQkJc3RhdHVzID0gMDsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFNldCBkYXRhIGZvciB0aGUgZmFrZSB4aHIgb2JqZWN0CgkJCWpxWEhSLnN0YXR1cyA9IHN0YXR1czsKCQkJanFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyAiIjsKCgkJCS8vIFN1Y2Nlc3MvRXJyb3IKCQkJaWYgKCBpc1N1Y2Nlc3MgKSB7CgkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIHN1Y2Nlc3MsIHN0YXR1c1RleHQsIGpxWEhSIF0gKTsKCQkJfSBlbHNlIHsKCQkJCWRlZmVycmVkLnJlamVjdFdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCwgZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7CgkJCXN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7CgoJCQlpZiAoIGZpcmVHbG9iYWxzICkgewoJCQkJZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIGlzU3VjY2VzcyA/ICJhamF4U3VjY2VzcyIgOiAiYWpheEVycm9yIiwKCQkJCQlbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApOwoJCQl9CgoJCQkvLyBDb21wbGV0ZQoJCQljb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgWyBqcVhIUiwgcyBdICk7CgoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBqcVhIUjsKCX0sCgoJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIiApOwoJfSwKCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Cgl9Cn0gKTsKCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCgkJLy8gU2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWQKCQlpZiAoIGlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgoJCS8vIFRoZSB1cmwgY2FuIGJlIGFuIG9wdGlvbnMgb2JqZWN0ICh3aGljaCB0aGVuIG11c3QgaGF2ZSAudXJsKQoJCXJldHVybiBqUXVlcnkuYWpheCggalF1ZXJ5LmV4dGVuZCggewoJCQl1cmw6IHVybCwKCQkJdHlwZTogbWV0aG9kLAoJCQlkYXRhVHlwZTogdHlwZSwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2sKCQl9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTsKCX07Cn0gKTsKCgpqUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkgewoJcmV0dXJuIGpRdWVyeS5hamF4KCB7CgkJdXJsOiB1cmwsCgoJCS8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAoIzExMjY0KQoJCXR5cGU6ICJHRVQiLAoJCWRhdGFUeXBlOiAic2NyaXB0IiwKCQljYWNoZTogdHJ1ZSwKCQlhc3luYzogZmFsc2UsCgkJZ2xvYmFsOiBmYWxzZSwKCQkidGhyb3dzIjogdHJ1ZQoJfSApOwp9OwoKCmpRdWVyeS5mbi5leHRlbmQoIHsKCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewoJCXZhciB3cmFwOwoKCQlpZiAoIHRoaXNbIDAgXSApIHsKCQkJaWYgKCBpc0Z1bmN0aW9uKCBodG1sICkgKSB7CgkJCQlodG1sID0gaHRtbC5jYWxsKCB0aGlzWyAwIF0gKTsKCQkJfQoKCQkJLy8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKCQkJd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7CgoJCQlpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgewoJCQkJd3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApOwoJCQl9CgoJCQl3cmFwLm1hcCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgZWxlbSA9IHRoaXM7CgoJCQkJd2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkgewoJCQkJCWVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtOwoJCQl9ICkuYXBwZW5kKCB0aGlzICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKCQlpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCggdGhpcywgaSApICk7CgkJCX0gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CgoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKCgkJCX0gZWxzZSB7CgkJCQlzZWxmLmFwcGVuZCggaHRtbCApOwoJCQl9CgkJfSApOwoJfSwKCgl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKCQl2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7CgoJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkgewoJCQlqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sSXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApOwoJCX0gKTsKCX0sCgoJdW53cmFwOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdGhpcy5wYXJlbnQoIHNlbGVjdG9yICkubm90KCAiYm9keSIgKS5lYWNoKCBmdW5jdGlvbigpIHsKCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOwoJCX0gKTsKCQlyZXR1cm4gdGhpczsKCX0KfSApOwoKCmpRdWVyeS5leHByLnBzZXVkb3MuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApOwp9OwpqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHsKCXJldHVybiAhISggZWxlbS5vZmZzZXRXaWR0aCB8fCBlbGVtLm9mZnNldEhlaWdodCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICk7Cn07CgoKCgpqUXVlcnkuYWpheFNldHRpbmdzLnhociA9IGZ1bmN0aW9uKCkgewoJdHJ5IHsKCQlyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOwoJfSBjYXRjaCAoIGUgKSB7fQp9OwoKdmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7CgoJCS8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwCgkJMDogMjAwLAoKCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCS8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCTEyMjM6IDIwNAoJfSwKCXhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7CgpzdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhoclN1cHBvcnRlZCApOwpzdXBwb3J0LmFqYXggPSB4aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDsKCmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHsKCXZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjazsKCgkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CglpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkgewoJCQkJdmFyIGksCgkJCQkJeGhyID0gb3B0aW9ucy54aHIoKTsKCgkJCQl4aHIub3BlbigKCQkJCQlvcHRpb25zLnR5cGUsCgkJCQkJb3B0aW9ucy51cmwsCgkJCQkJb3B0aW9ucy5hc3luYywKCQkJCQlvcHRpb25zLnVzZXJuYW1lLAoJCQkJCW9wdGlvbnMucGFzc3dvcmQKCQkJCSk7CgoJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJaWYgKCBvcHRpb25zLnhockZpZWxkcyApIHsKCQkJCQlmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkgewoJCQkJCQl4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07CgkJCQkJfQoJCQkJfQoKCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKCQkJCWlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHsKCQkJCQl4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApOwoJCQkJfQoKCQkJCS8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyCgkJCQkvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlCgkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgoJCQkJLy8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApCgkJCQkvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC4KCQkJCWlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdICkgewoJCQkJCWhlYWRlcnNbICJYLVJlcXVlc3RlZC1XaXRoIiBdID0gIlhNTEh0dHBSZXF1ZXN0IjsKCQkJCX0KCgkJCQkvLyBTZXQgaGVhZGVycwoJCQkJZm9yICggaSBpbiBoZWFkZXJzICkgewoJCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTsKCQkJCX0KCgkJCQkvLyBDYWxsYmFjawoJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlyZXR1cm4gZnVuY3Rpb24oKSB7CgkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQljYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID0KCQkJCQkJCQl4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9CgkJCQkJCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoKCQkJCQkJCWlmICggdHlwZSA9PT0gImFib3J0IiApIHsKCQkJCQkJCQl4aHIuYWJvcnQoKTsKCQkJCQkJCX0gZWxzZSBpZiAoIHR5cGUgPT09ICJlcnJvciIgKSB7CgoJCQkJCQkJCS8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5CgkJCQkJCQkJLy8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzCgkJCQkJCQkJLy8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZQoJCQkJCQkJCWlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09ICJudW1iZXIiICkgewoJCQkJCQkJCQljb21wbGV0ZSggMCwgImVycm9yIiApOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCWNvbXBsZXRlKAoKCQkJCQkJCQkJCS8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3CgkJCQkJCQkJCQl4aHIuc3RhdHVzLAoJCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQKCQkJCQkJCQkJKTsKCQkJCQkJCQl9CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCWNvbXBsZXRlKAoJCQkJCQkJCQl4aHJTdWNjZXNzU3RhdHVzWyB4aHIuc3RhdHVzIF0gfHwgeGhyLnN0YXR1cywKCQkJCQkJCQkJeGhyLnN0YXR1c1RleHQsCgoJCQkJCQkJCQkvLyBTdXBwb3J0OiBJRSA8PTkgb25seQoJCQkJCQkJCQkvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpCgkJCQkJCQkJCS8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpCgkJCQkJCQkJCSggeGhyLnJlc3BvbnNlVHlwZSB8fCAidGV4dCIgKSAhPT0gInRleHQiICB8fAoJCQkJCQkJCQl0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gInN0cmluZyIgPwoJCQkJCQkJCQkJeyBiaW5hcnk6IHhoci5yZXNwb25zZSB9IDoKCQkJCQkJCQkJCXsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LAoJCQkJCQkJCQl4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkKCQkJCQkJCQkpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfTsKCQkJCX07CgoJCQkJLy8gTGlzdGVuIHRvIGV2ZW50cwoJCQkJeGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7CgkJCQllcnJvckNhbGxiYWNrID0geGhyLm9uZXJyb3IgPSB4aHIub250aW1lb3V0ID0gY2FsbGJhY2soICJlcnJvciIgKTsKCgkJCQkvLyBTdXBwb3J0OiBJRSA5IG9ubHkKCQkJCS8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0CgkJCQkvLyB0byBoYW5kbGUgdW5jYXVnaHQgYWJvcnRzCgkJCQlpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJeGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrOwoJCQkJfSBlbHNlIHsKCQkJCQl4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CgoJCQkJCQkvLyBDaGVjayByZWFkeVN0YXRlIGJlZm9yZSB0aW1lb3V0IGFzIGl0IGNoYW5nZXMKCQkJCQkJaWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCgkJCQkJCQkvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCwKCQkJCQkJCS8vIGJ1dCB0aGF0IHdpbGwgbm90IGhhbmRsZSBhIG5hdGl2ZSBhYm9ydAoJCQkJCQkJLy8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGUKCQkJCQkJCS8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZAoJCQkJCQkJd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQkJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCQkJCWVycm9yQ2FsbGJhY2soKTsKCQkJCQkJCQl9CgkJCQkJCQl9ICk7CgkJCQkJCX0KCQkJCQl9OwoJCQkJfQoKCQkJCS8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2sKCQkJCWNhbGxiYWNrID0gY2FsbGJhY2soICJhYm9ydCIgKTsKCgkJCQl0cnkgewoKCQkJCQkvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pCgkJCQkJeGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApOwoJCQkJfSBjYXRjaCAoIGUgKSB7CgoJCQkJCS8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0CgkJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQkJdGhyb3cgZTsKCQkJCQl9CgkJCQl9CgkJCX0sCgoJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGNhbGxiYWNrICkgewoJCQkJCWNhbGxiYWNrKCk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9ICk7CgoKCgovLyBQcmV2ZW50IGF1dG8tZXhlY3V0aW9uIG9mIHNjcmlwdHMgd2hlbiBubyBleHBsaWNpdCBkYXRhVHlwZSB3YXMgcHJvdmlkZWQgKFNlZSBnaC0yNDMyKQpqUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJcy5jb250ZW50cy5zY3JpcHQgPSBmYWxzZTsKCX0KfSApOwoKLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGUKalF1ZXJ5LmFqYXhTZXR1cCggewoJYWNjZXB0czogewoJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgIiArCgkJCSJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiCgl9LAoJY29udGVudHM6IHsKCQlzY3JpcHQ6IC9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi8KCX0sCgljb252ZXJ0ZXJzOiB7CgkJInRleHQgc2NyaXB0IjogZnVuY3Rpb24oIHRleHQgKSB7CgkJCWpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7CgkJCXJldHVybiB0ZXh0OwoJCX0KCX0KfSApOwoKLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpbgpqUXVlcnkuYWpheFByZWZpbHRlciggInNjcmlwdCIsIGZ1bmN0aW9uKCBzICkgewoJaWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7CgkJcy5jYWNoZSA9IGZhbHNlOwoJfQoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoJCXMudHlwZSA9ICJHRVQiOwoJfQp9ICk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbiggcyApIHsKCgkvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzCglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJdmFyIHNjcmlwdCwgY2FsbGJhY2s7CgkJcmV0dXJuIHsKCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkgewoJCQkJc2NyaXB0ID0galF1ZXJ5KCAiPHNjcmlwdD4iICkucHJvcCggewoJCQkJCWNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCwKCQkJCQlzcmM6IHMudXJsCgkJCQl9ICkub24oCgkJCQkJImxvYWQgZXJyb3IiLAoJCQkJCWNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHsKCQkJCQkJc2NyaXB0LnJlbW92ZSgpOwoJCQkJCQljYWxsYmFjayA9IG51bGw7CgkJCQkJCWlmICggZXZ0ICkgewoJCQkJCQkJY29tcGxldGUoIGV2dC50eXBlID09PSAiZXJyb3IiID8gNDA0IDogMjAwLCBldnQudHlwZSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJKTsKCgkJCQkvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnkKCQkJCWRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7CgkJCX0sCgkJCWFib3J0OiBmdW5jdGlvbigpIHsKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJY2FsbGJhY2soKTsKCQkJCX0KCQkJfQoJCX07Cgl9Cn0gKTsKCgoKCnZhciBvbGRDYWxsYmFja3MgPSBbXSwKCXJqc29ucCA9IC8oPSlcPyg/PSZ8JCl8XD9cPy87CgovLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzCmpRdWVyeS5hamF4U2V0dXAoIHsKCWpzb25wOiAiY2FsbGJhY2siLAoJanNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CgkJdmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyAiXyIgKyAoIG5vbmNlKysgKSApOwoJCXRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlOwoJCXJldHVybiBjYWxsYmFjazsKCX0KfSApOwoKLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKCgl2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsCgkJanNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID8KCQkJInVybCIgOgoJCQl0eXBlb2Ygcy5kYXRhID09PSAic3RyaW5nIiAmJgoJCQkJKCBzLmNvbnRlbnRUeXBlIHx8ICIiICkKCQkJCQkuaW5kZXhPZiggImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgKSA9PT0gMCAmJgoJCQkJcmpzb25wLnRlc3QoIHMuZGF0YSApICYmICJkYXRhIgoJCSk7CgoJLy8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzICJqc29ucCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXQKCWlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiApIHsKCgkJLy8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdAoJCWNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID8KCQkJcy5qc29ucENhbGxiYWNrKCkgOgoJCQlzLmpzb25wQ2FsbGJhY2s7CgoJCS8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGEKCQlpZiAoIGpzb25Qcm9wICkgewoJCQlzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsKCQl9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKCQkJcy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/ICImIiA6ICI/IiApICsgcy5qc29ucCArICI9IiArIGNhbGxiYWNrTmFtZTsKCQl9CgoJCS8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb24KCQlzLmNvbnZlcnRlcnNbICJzY3JpcHQganNvbiIgXSA9IGZ1bmN0aW9uKCkgewoJCQlpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHsKCQkJCWpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKCQkJfQoJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKCQl9OwoKCQkvLyBGb3JjZSBqc29uIGRhdGFUeXBlCgkJcy5kYXRhVHlwZXNbIDAgXSA9ICJqc29uIjsKCgkJLy8gSW5zdGFsbCBjYWxsYmFjawoJCW92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTsKCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7CgkJCXJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzOwoJCX07CgoJCS8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQoJCWpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7CgoJCQkvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXQKCQkJaWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkgewoJCQkJalF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTsKCgkJCS8vIE90aGVyd2lzZSByZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlCgkJCX0gZWxzZSB7CgkJCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47CgkJCX0KCgkJCS8vIFNhdmUgYmFjayBhcyBmcmVlCgkJCWlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kCgkJCQlzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7CgoJCQkJLy8gU2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZQoJCQkJb2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApOwoJCQl9CgoJCQkvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2UKCQkJaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBpc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkgewoJCQkJb3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTsKCQkJfQoKCQkJcmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDsKCQl9ICk7CgoJCS8vIERlbGVnYXRlIHRvIHNjcmlwdAoJCXJldHVybiAic2NyaXB0IjsKCX0KfSApOwoKCgoKLy8gU3VwcG9ydDogU2FmYXJpIDggb25seQovLyBJbiBTYWZhcmkgOCBkb2N1bWVudHMgY3JlYXRlZCB2aWEgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50Ci8vIGNvbGxhcHNlIHNpYmxpbmcgZm9ybXM6IHRoZSBzZWNvbmQgb25lIGJlY29tZXMgYSBjaGlsZCBvZiB0aGUgZmlyc3Qgb25lLgovLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguCi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzczMzcKc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgPSAoIGZ1bmN0aW9uKCkgewoJdmFyIGJvZHkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICkuYm9keTsKCWJvZHkuaW5uZXJIVE1MID0gIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IjsKCXJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyOwp9ICkoKTsKCgovLyBBcmd1bWVudCAiZGF0YSIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sCi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCwKLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnQKLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZwpqUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkgewoJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgKSB7CgkJcmV0dXJuIFtdOwoJfQoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gImJvb2xlYW4iICkgewoJCWtlZXBTY3JpcHRzID0gY29udGV4dDsKCQljb250ZXh0ID0gZmFsc2U7Cgl9CgoJdmFyIGJhc2UsIHBhcnNlZCwgc2NyaXB0czsKCglpZiAoICFjb250ZXh0ICkgewoKCQkvLyBTdG9wIHNjcmlwdHMgb3IgaW5saW5lIGV2ZW50IGhhbmRsZXJzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW1tZWRpYXRlbHkKCQkvLyBieSB1c2luZyBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbgoJCWlmICggc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgKSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoICIiICk7CgoJCQkvLyBTZXQgdGhlIGJhc2UgaHJlZiBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnQKCQkJLy8gc28gYW55IHBhcnNlZCBlbGVtZW50cyB3aXRoIFVSTHMKCQkJLy8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSkKCQkJYmFzZSA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCggImJhc2UiICk7CgkJCWJhc2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7CgkJCWNvbnRleHQuaGVhZC5hcHBlbmRDaGlsZCggYmFzZSApOwoJCX0gZWxzZSB7CgkJCWNvbnRleHQgPSBkb2N1bWVudDsKCQl9Cgl9CgoJcGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICk7CglzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdOwoKCS8vIFNpbmdsZSB0YWcKCWlmICggcGFyc2VkICkgewoJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdOwoJfQoKCXBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7CgoJaWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkgewoJCWpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpOwoJfQoKCXJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApOwp9OwoKCi8qKgogKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlCiAqLwpqUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7Cgl2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLAoJCXNlbGYgPSB0aGlzLAoJCW9mZiA9IHVybC5pbmRleE9mKCAiICIgKTsKCglpZiAoIG9mZiA+IC0xICkgewoJCXNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApOwoJCXVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7Cgl9CgoJLy8gSWYgaXQncyBhIGZ1bmN0aW9uCglpZiAoIGlzRnVuY3Rpb24oIHBhcmFtcyApICkgewoKCQkvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFjawoJCWNhbGxiYWNrID0gcGFyYW1zOwoJCXBhcmFtcyA9IHVuZGVmaW5lZDsKCgkvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCgl9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CgkJdHlwZSA9ICJQT1NUIjsKCX0KCgkvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdAoJaWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7CgkJalF1ZXJ5LmFqYXgoIHsKCQkJdXJsOiB1cmwsCgoJCQkvLyBJZiAidHlwZSIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQuCgkJCS8vIE1ha2UgdmFsdWUgb2YgdGhpcyBmaWVsZCBleHBsaWNpdCBzaW5jZQoJCQkvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2QKCQkJdHlwZTogdHlwZSB8fCAiR0VUIiwKCQkJZGF0YVR5cGU6ICJodG1sIiwKCQkJZGF0YTogcGFyYW1zCgkJfSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7CgoJCQkvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2sKCQkJcmVzcG9uc2UgPSBhcmd1bWVudHM7CgoJCQlzZWxmLmh0bWwoIHNlbGVjdG9yID8KCgkJCQkvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXYKCQkJCS8vIEV4Y2x1ZGUgc2NyaXB0cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycwoJCQkJalF1ZXJ5KCAiPGRpdj4iICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOgoKCQkJCS8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0CgkJCQlyZXNwb25zZVRleHQgKTsKCgkJLy8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyAiZGF0YSIsICJzdGF0dXMiLCAianFYSFIiCgkJLy8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLgoJCS8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgImpxWEhSIiwgInN0YXR1cyIsICJlcnJvciIKCQl9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHsKCQkJc2VsZi5lYWNoKCBmdW5jdGlvbigpIHsKCQkJCWNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7CgkJCX0gKTsKCQl9ICk7Cgl9CgoJcmV0dXJuIHRoaXM7Cn07CgoKCgovLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cwpqUXVlcnkuZWFjaCggWwoJImFqYXhTdGFydCIsCgkiYWpheFN0b3AiLAoJImFqYXhDb21wbGV0ZSIsCgkiYWpheEVycm9yIiwKCSJhamF4U3VjY2VzcyIsCgkiYWpheFNlbmQiCl0sIGZ1bmN0aW9uKCBpLCB0eXBlICkgewoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7CgkJcmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7Cgl9Owp9ICk7CgoKCgpqUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmdyZXAoIGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKCQlyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTsKCX0gKS5sZW5ndGg7Cn07CgoKCgpqUXVlcnkub2Zmc2V0ID0gewoJc2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHsKCQl2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLAoJCQlwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSwKCQkJY3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLAoJCQlwcm9wcyA9IHt9OwoKCQkvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwoJCX0KCgkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTsKCQljdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCAidG9wIiApOwoJCWN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVmdCIgKTsKCQljYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgfHwgcG9zaXRpb24gPT09ICJmaXhlZCIgKSAmJgoJCQkoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCAiYXV0byIgKSA+IC0xOwoKCQkvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlcgoJCS8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZAoJCWlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7CgkJCWN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpOwoJCQljdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7CgkJCWN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0OwoKCQl9IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJfQoKCQlpZiAoIGlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHsKCgkJCS8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KQoJCQlvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTsKCQl9CgoJCWlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHsKCQkJcHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDsKCQl9CgkJaWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHsKCQkJcHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7CgkJfQoKCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwoKCQl9IGVsc2UgewoJCQljdXJFbGVtLmNzcyggcHJvcHMgKTsKCQl9Cgl9Cn07CgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJLy8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luCglvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkgewoKCQkvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQlyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8KCQkJCXRoaXMgOgoJCQkJdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHsKCQkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQkJfSApOwoJCX0KCgkJdmFyIHJlY3QsIHdpbiwKCQkJZWxlbSA9IHRoaXNbIDAgXTsKCgkJaWYgKCAhZWxlbSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApCgkJLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5CgkJLy8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYQoJCS8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvcgoJCWlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7CgkJCXJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgkJLy8gR2V0IGRvY3VtZW50LXJlbGF0aXZlIHBvc2l0aW9uIGJ5IGFkZGluZyB2aWV3cG9ydCBzY3JvbGwgdG8gdmlld3BvcnQtcmVsYXRpdmUgZ0JDUgoJCXJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCXdpbiA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldzsKCQlyZXR1cm4gewoJCQl0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LAoJCQlsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXQKCQl9OwoJfSwKCgkvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveAoJLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYmVoYXZpb3Igb2YgQ1NTIGFic29sdXRlIHBvc2l0aW9uaW5nCglwb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJaWYgKCAhdGhpc1sgMCBdICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYywKCQkJZWxlbSA9IHRoaXNbIDAgXSwKCQkJcGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCgkJLy8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXQKCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKSA9PT0gImZpeGVkIiApIHsKCgkJCS8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3QKCQkJb2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCgkJfSBlbHNlIHsKCQkJb2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTsKCgkJCS8vIEFjY291bnQgZm9yIHRoZSAqcmVhbCogb2Zmc2V0IHBhcmVudCwgd2hpY2ggY2FuIGJlIHRoZSBkb2N1bWVudCBvciBpdHMgcm9vdCBlbGVtZW50CgkJCS8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkCgkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDsKCQkJb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQgfHwgZG9jLmRvY3VtZW50RWxlbWVudDsKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYKCQkJCSggb2Zmc2V0UGFyZW50ID09PSBkb2MuYm9keSB8fCBvZmZzZXRQYXJlbnQgPT09IGRvYy5kb2N1bWVudEVsZW1lbnQgKSAmJgoJCQkJalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoKCQkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5wYXJlbnROb2RlOwoJCQl9CgkJCWlmICggb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudCAhPT0gZWxlbSAmJiBvZmZzZXRQYXJlbnQubm9kZVR5cGUgPT09IDEgKSB7CgoJCQkJLy8gSW5jb3Jwb3JhdGUgYm9yZGVycyBpbnRvIGl0cyBvZmZzZXQsIHNpbmNlIHRoZXkgYXJlIG91dHNpZGUgaXRzIGNvbnRlbnQgb3JpZ2luCgkJCQlwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpOwoJCQkJcGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsICJib3JkZXJUb3BXaWR0aCIsIHRydWUgKTsKCQkJCXBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgImJvcmRlckxlZnRXaWR0aCIsIHRydWUgKTsKCQkJfQoJCX0KCgkJLy8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2lucwoJCXJldHVybiB7CgkJCXRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCAibWFyZ2luVG9wIiwgdHJ1ZSApLAoJCQlsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgIm1hcmdpbkxlZnQiLCB0cnVlICkKCQl9OwoJfSwKCgkvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKCS8vIDEpIEZvciB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGlmcmFtZSB3aXRob3V0IG9mZnNldFBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4KCS8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvdwoJLy8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudAoJLy8gMykgRm9yIGJvZHkgb3IgaHRtbCBlbGVtZW50LCBpLmUuIGluIGNhc2Ugb2YgdGhlIGh0bWwgbm9kZSAtIGl0IHdpbGwgcmV0dXJuIGl0c2VsZgoJLy8KCS8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlcwoJLy8gYW5kIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYXMgbW9yZSBwcmVmZXJhYmxlIHJlc3VsdHMuCgkvLwoJLy8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHsKCQkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50OwoKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoJCQkJb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDsKCQkJfQoKCQkJcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7CgkJfSApOwoJfQp9ICk7CgovLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKalF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogInBhZ2VYT2Zmc2V0Iiwgc2Nyb2xsVG9wOiAicGFnZVlPZmZzZXQiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7Cgl2YXIgdG9wID0gInBhZ2VZT2Zmc2V0IiA9PT0gcHJvcDsKCglqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsKCQlyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7CgoJCQkvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3MKCQkJdmFyIHdpbjsKCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoJCQkJd2luID0gZWxlbTsKCQkJfSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCXdpbiA9IGVsZW0uZGVmYXVsdFZpZXc7CgkJCX0KCgkJCWlmICggdmFsID09PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTsKCQkJfQoKCQkJaWYgKCB3aW4gKSB7CgkJCQl3aW4uc2Nyb2xsVG8oCgkJCQkJIXRvcCA/IHZhbCA6IHdpbi5wYWdlWE9mZnNldCwKCQkJCQl0b3AgPyB2YWwgOiB3aW4ucGFnZVlPZmZzZXQKCQkJCSk7CgoJCQl9IGVsc2UgewoJCQkJZWxlbVsgbWV0aG9kIF0gPSB2YWw7CgkJCX0KCQl9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApOwoJfTsKfSApOwoKLy8gU3VwcG9ydDogU2FmYXJpIDw9NyAtIDkuMSwgQ2hyb21lIDw9MzcgLSA0OQovLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvbgovLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODQKLy8gQmxpbmsgYnVnOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01ODkzNDcKLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDsKLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmUKalF1ZXJ5LmVhY2goIFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHsKCWpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sCgkJZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJY29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTsKCgkJCQkvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXQKCQkJCXJldHVybiBybnVtbm9ucHgudGVzdCggY29tcHV0ZWQgKSA/CgkJCQkJalF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6CgkJCQkJY29tcHV0ZWQ7CgkJCX0KCQl9CgkpOwp9ICk7CgoKLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzCmpRdWVyeS5lYWNoKCB7IEhlaWdodDogImhlaWdodCIsIFdpZHRoOiAid2lkdGgiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkgewoJalF1ZXJ5LmVhY2goIHsgcGFkZGluZzogImlubmVyIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsICIiOiAib3V0ZXIiICsgbmFtZSB9LAoJCWZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkgewoKCQkvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGgKCQlqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKCQkJdmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gImJvb2xlYW4iICksCgkJCQlleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/ICJtYXJnaW4iIDogImJvcmRlciIgKTsKCgkJCXJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHsKCQkJCXZhciBkb2M7CgoJCQkJaWYgKCBpc1dpbmRvdyggZWxlbSApICkgewoKCQkJCQkvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KQoJCQkJCXJldHVybiBmdW5jTmFtZS5pbmRleE9mKCAib3V0ZXIiICkgPT09IDAgPwoJCQkJCQllbGVtWyAiaW5uZXIiICsgbmFtZSBdIDoKCQkJCQkJZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOwoJCQkJfQoKCQkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQlkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDsKCgkJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLAoJCQkJCS8vIHdoaWNoZXZlciBpcyBncmVhdGVzdAoJCQkJCXJldHVybiBNYXRoLm1heCgKCQkJCQkJZWxlbS5ib2R5WyAic2Nyb2xsIiArIG5hbWUgXSwgZG9jWyAic2Nyb2xsIiArIG5hbWUgXSwKCQkJCQkJZWxlbS5ib2R5WyAib2Zmc2V0IiArIG5hbWUgXSwgZG9jWyAib2Zmc2V0IiArIG5hbWUgXSwKCQkJCQkJZG9jWyAiY2xpZW50IiArIG5hbWUgXQoJCQkJCSk7CgkJCQl9CgoJCQkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoKCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0CgkJCQkJalF1ZXJ5LmNzcyggZWxlbSwgdHlwZSwgZXh0cmEgKSA6CgoJCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApOwoJCQl9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApOwoJCX07Cgl9ICk7Cn0gKTsKCgpqUXVlcnkuZWFjaCggKCAiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgIiArCgkibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCgkiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIgKS5zcGxpdCggIiAiICksCglmdW5jdGlvbiggaSwgbmFtZSApIHsKCgkvLyBIYW5kbGUgZXZlbnQgYmluZGluZwoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZGF0YSwgZm4gKSB7CgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID8KCQkJdGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6CgkJCXRoaXMudHJpZ2dlciggbmFtZSApOwoJfTsKfSApOwoKalF1ZXJ5LmZuLmV4dGVuZCggewoJaG92ZXI6IGZ1bmN0aW9uKCBmbk92ZXIsIGZuT3V0ICkgewoJCXJldHVybiB0aGlzLm1vdXNlZW50ZXIoIGZuT3ZlciApLm1vdXNlbGVhdmUoIGZuT3V0IHx8IGZuT3ZlciApOwoJfQp9ICk7CgoKCgpqUXVlcnkuZm4uZXh0ZW5kKCB7CgoJYmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7Cgl9LAoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgewoJCXJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7Cgl9LAoKCWRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApOwoJfSwKCXVuZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGZuICkgewoKCQkvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApCgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPwoJCQl0aGlzLm9mZiggc2VsZWN0b3IsICIqKiIgKSA6CgkJCXRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgIioqIiwgZm4gKTsKCX0KfSApOwoKLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55Ci8vIGFyZ3VtZW50cy4KLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKQovLyBIb3dldmVyLCBpdCBpcyBub3Qgc2xhdGVkIGZvciByZW1vdmFsIGFueSB0aW1lIHNvb24KalF1ZXJ5LnByb3h5ID0gZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewoJdmFyIHRtcCwgYXJncywgcHJveHk7CgoJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7CgkJdG1wID0gZm5bIGNvbnRleHQgXTsKCQljb250ZXh0ID0gZm47CgkJZm4gPSB0bXA7Cgl9CgoJLy8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWMKCS8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuCglpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkgewoJCXJldHVybiB1bmRlZmluZWQ7Cgl9CgoJLy8gU2ltdWxhdGVkIGJpbmQKCWFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKTsKCXByb3h5ID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7Cgl9OwoKCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAoJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7CgoJcmV0dXJuIHByb3h5Owp9OwoKalF1ZXJ5LmhvbGRSZWFkeSA9IGZ1bmN0aW9uKCBob2xkICkgewoJaWYgKCBob2xkICkgewoJCWpRdWVyeS5yZWFkeVdhaXQrKzsKCX0gZWxzZSB7CgkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7Cgl9Cn07CmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTsKalF1ZXJ5LnBhcnNlSlNPTiA9IEpTT04ucGFyc2U7CmpRdWVyeS5ub2RlTmFtZSA9IG5vZGVOYW1lOwpqUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247CmpRdWVyeS5pc1dpbmRvdyA9IGlzV2luZG93OwpqUXVlcnkuY2FtZWxDYXNlID0gY2FtZWxDYXNlOwpqUXVlcnkudHlwZSA9IHRvVHlwZTsKCmpRdWVyeS5ub3cgPSBEYXRlLm5vdzsKCmpRdWVyeS5pc051bWVyaWMgPSBmdW5jdGlvbiggb2JqICkgewoKCS8vIEFzIG9mIGpRdWVyeSAzLjAsIGlzTnVtZXJpYyBpcyBsaW1pdGVkIHRvCgkvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpCgkvLyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGZpbml0ZSBudW1iZXJzIChnaC0yNjYyKQoJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7CglyZXR1cm4gKCB0eXBlID09PSAibnVtYmVyIiB8fCB0eXBlID09PSAic3RyaW5nIiApICYmCgoJCS8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzICgiIikKCQkvLyAuLi5idXQgbWlzaW50ZXJwcmV0cyBsZWFkaW5nLW51bWJlciBzdHJpbmdzLCBwYXJ0aWN1bGFybHkgaGV4IGxpdGVyYWxzICgiMHguLi4iKQoJCS8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTgoJCSFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTsKfTsKCgoKCi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlcgovLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0Ci8vIHVuZGVyc3RhbmRzIGFub255bW91cyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdAovLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlCi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZQovLyBmaWxlIG5hbWUuIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHMKLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLgoKLy8gTm90ZSB0aGF0IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGpRdWVyeSBzaG91bGQKLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhbgovLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZQovLyBodHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvd2lraS9VcGRhdGluZy1leGlzdGluZy1saWJyYXJpZXMjd2lraS1hbm9uCgppZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKCWRlZmluZSggImpxdWVyeSIsIFtdLCBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5OwoJfSApOwp9CgoKCgp2YXIKCgkvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAoKCS8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlCglfJCA9IHdpbmRvdy4kOwoKalF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHsKCWlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHsKCQl3aW5kb3cuJCA9IF8kOwoJfQoKCWlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7CgkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7Cgl9CgoJcmV0dXJuIGpRdWVyeTsKfTsKCi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1ECi8vICgjNzEwMiNjb21tZW50OjEwLCBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzU1NykKLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KQppZiAoICFub0dsb2JhbCApIHsKCXdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTsKfQoKCgoKcmV0dXJuIGpRdWVyeTsKfSApOwo=" >
			</script>



	<script id="script_hoverdttm" >
		var app2 = new Vue({el: '#v_hoverdttm',
			data: {
				message: 'hoverdttm ' + new Date().toLocaleString()
				}
			})
		</script>






n		<script id="script_url">
			var url = document.createElement("a");
			url.href=location.href;
			var output = "output";
			url.pathname = url.pathname.replace(/(^\/?)/,"/");

			if( url.search != "" ) {
				script_tl_view( url.search );
				script_zm_view( url.search );
				script_pn_view( url.search );
				script_av_view( url.search );
				script_sl_view( url.search );
				}
//			alert(location.href)
//			alert(url.protocol)
//			alert(url.hostname)
//			alert(url.pathname)
//			alert(url.search)
//			alert(url.hash)


//			document.write( "hostname=" + url.hostname + " loc.href=" + location.href );
//			document.write( "pathname=" + url.pathname + " search=" + url.search );
			</script>
		</div>



		<script id="script_zmviewer" src="data:/text/plain;base64,KGZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30uY2FsbCgpO2EuWj17fX0pKCksWi5zaG93SW1hZ2U9ZnVuY3Rpb24oYSxiLGMpe1ouVXRpbHMuejEyOCgpLFouVXRpbHMuejEyNygpLFouVXRpbHMuejEyNigpLFouVXRpbHMuejE2MygpLFoucGFnZUNvbnRhaW5lcklEPWEsWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGIpLFoucGFyYW1ldGVycz1aLlV0aWxzLnoyMzMoYyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJET01Db250ZW50TG9hZGVkIixaLmluaXRpYWxpemUpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csImxvYWQiLFouaW5pdGlhbGl6ZSl9LFouaW5pdGlhbGl6ZT1mdW5jdGlvbigpe2FyZ3VtZW50cy5jYWxsZWUuZG9uZXx8KGFyZ3VtZW50cy5jYWxsZWUuZG9uZT0hMCxaLlV0aWxzLnoxNjQoKSxaLlV0aWxzLnoyNDkoWi5wYXJhbWV0ZXJzKSxaLlZpZXdlcj1uZXcgWi56MTIyLFouVXRpbHMuaXNTdHJWYWwoWi5jb3B5cmlnaHRQYXRoKT9aLlV0aWxzLmVuZm9yY2VDb3B5cmlnaHQoKTpaLlZpZXdlci56MTQ5KCksWi5kZWJ1ZyYmWi5VdGlscy50cmFjZShaLlV0aWxzLnoxODUoIno2NyIpKSl9LFouejEyMj1mdW5jdGlvbigpe1ouVmlld2VyRGlzcGxheT1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIlZpZXdlckRpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJyZWxhdGl2ZSIsImhpZGRlbiIsIjEwMCUiLCIxMDAlIiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJwb2ludGVyIiksWi5wYWdlQ29udGFpbmVyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFoucGFnZUNvbnRhaW5lcklEKTt2YXIgYT1aLlV0aWxzLnoxNzYoWi5wYWdlQ29udGFpbmVyKTtaLnZpZXdlclc9cGFyc2VGbG9hdChhLndpZHRoKSxaLnZpZXdlckg9cGFyc2VGbG9hdChhLmhlaWdodCksaXNOYU4oWi52aWV3ZXJXKSYmKFoudmlld2VyVz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKFoudmlld2VySCkmJihaLnZpZXdlckg9Wi5WaWV3ZXJEaXNwbGF5LmNsaWVudEhlaWdodCksWi5wYWdlQ29udGFpbmVyLmlubmVySFRNTD0iIixaLnBhZ2VDb250YWluZXIuYXBwZW5kQ2hpbGQoWi5WaWV3ZXJEaXNwbGF5KSx0aGlzLnoxNDk9ZnVuY3Rpb24oKXtaLlZpZXdwb3J0PW5ldyBaLnoxMjV9LHRoaXMuejE0OD1mdW5jdGlvbigpe1oudG9vbGJhclZpc2libGU+MCYmKFouVG9vbGJhcj1uZXcgWi56MTI0KFouVmlld3BvcnQpKSxaLm5hdmlnYXRvclZpc2libGU+MCYmKFouTmF2aWdhdG9yPW5ldyBaLnoxMjMoWi5WaWV3cG9ydCkpLFouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56Mjc3KCl9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQsZSl7Wi52aWV3ZXJXPWEsWi52aWV3ZXJIPWIsWi5WaWV3ZXJEaXNwbGF5LnN0eWxlLndpZHRoPWErInB4IixaLlZpZXdlckRpc3BsYXkuc3R5bGUuaGVpZ2h0PWIrInB4IixaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSYmWi5WaWV3cG9ydC5zZXRTaXplQW5kUG9zaXRpb24oYSxiLGMsZCk7dmFyIGY9Wi50b29sYmFyUG9zaXRpb249PTE/Yi1aLnRvb2xiYXJIOjA7Wi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmKFouVG9vbGJhci5zZXRTaXplQW5kUG9zaXRpb24oYSxudWxsLG51bGwsZiksWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMCkpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5OYXZpZ2F0b3IuejE4MCgpJiYoWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKG51bGwsbnVsbCxjLGQsWi5uYXZpZ2F0b3JGaXQpLFoubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSksZSYmWi5WaWV3cG9ydC56Mjc0KCEwKX0sdGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7Wi5WaWV3cG9ydC56MjkzQWxsU3RvcCghMCksWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGEpO3ZhciBiPW5ldyBaLnoxMDEsYz1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi8iKyJJbWFnZVByb3BlcnRpZXMueG1sIik7Yi5sb2FkWE1MKGMpfX0sWi56MTI1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gY2QoKXt6PTEsQT0wLEI9MCxGPVtdLEc9W10sSD1bXSxJPVtdLEo9W10sSz1bXSxMPVtdLE09W10sTj1bXSxPPVtdLFA9W10sUT1bXSxSPTB9ZnVuY3Rpb24gY2UoKXtyZXR1cm4gYn1mdW5jdGlvbiBjZihhKXtiPWF9ZnVuY3Rpb24gY2coKXtoPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwidmlld3BvcnRDb250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChoKSxpPWgsaz1pLnN0eWxlLGw9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydEJhY2tmaWxsRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZChsKSxtPWwsbj1tLnN0eWxlLHA9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydERpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLGguYXBwZW5kQ2hpbGQocCkscT1wLHI9cS5zdHlsZSxaLlV0aWxzLmlzU3RyVmFsKFoud2F0ZXJtYXJrUGF0aCkmJih0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2F0ZXJtYXJrRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh0KSx1PXQsdj11LnN0eWxlKSxaLlV0aWxzLmlzU3RyVmFsKFouaG90c3BvdFBhdGgpJiYodz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsImhvdHNwb3RzRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh3KSx4PXcseT14LnN0eWxlKSxaLnVzZUNhbnZhcz8obz1tLmdldENvbnRleHQoIjJkIikscz1xLmdldENvbnRleHQoIjJkIikpOihtLmlubmVySFRNTD0iIixxLmlubmVySFRNTD0iIiksdSYmKHUuaW5uZXJIVE1MPSIiKSx4JiYoeC5pbm5lckhUTUw9IiIpfWZ1bmN0aW9uIGNoKGEsYixjLGQpe2N8fChjPTApLGR8fChkPTApLFk9YSwkPWIsYmI9WSpYLGJjPSQqWCxiZD1iYi8yLGJlPWJjLzIsYmY9LSgoYmItWSkvMikrYyxiZz0oYmItWSkvMitjLGJoPS0oKGJjLSQpLzIpK2QsYmk9KGJjLSQpLzIrZCxpLndpZHRoPWJiLGkuaGVpZ2h0PWJjLGsud2lkdGg9YmIrInB4IixrLmhlaWdodD1iYysicHgiLGsubGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIscS53aWR0aD1iYixxLmhlaWdodD1iYyx1JiYodS53aWR0aD1iYix1LmhlaWdodD1iYyx2LndpZHRoPWJiKyJweCIsdi5oZWlnaHQ9YmMrInB4IiksWi51c2VDYW52YXMmJihzLnRyYW5zbGF0ZShiZCxiZSkscy5zYXZlKCkpfWZ1bmN0aW9uIGNpKCl7dmFyIGE9Wi5pbWFnZVcsYj1aLmltYWdlSDt3aGlsZShhPmN8fGI+YylhPWEvMixiPWIvMix6Kys7YT1aLmltYWdlVyxiPVouaW1hZ2VIO2Zvcih2YXIgZD16LTE7ZD49MDtkLS0pSFtkXT1hLElbZF09YixKW2RdPU1hdGguY2VpbChIW2RdL2MpLEtbZF09TWF0aC5jZWlsKElbZF0vYyksTFtkXT1KW2RdKktbZF0sYT1hLzIsYj1iLzJ9ZnVuY3Rpb24gY2ooKXtaLmluaXRpYWxYfHwoWi5pbml0aWFsWD1aLmltYWdlVy8yKSxaLmluaXRpYWxZfHwoWi5pbml0aWFsWT1aLmltYWdlSC8yKTt2YXIgYT1jUigpO1ouZml0WiYmWi5maXRaIT1hJiYoWi5pbml0aWFsWj09Wi5maXRaJiYoWi5pbml0aWFsWj1udWxsKSxaLm1pblo9PVouZml0WiYmKFoubWluWj1udWxsKSxaLm1heFo9PVouZml0WiYmKFoubWF4Wj1udWxsKSxaLmZpdFo9bnVsbCksWi5maXRafHwoWi5maXRaPWEpLFouaW5pdGlhbFp8fChaLmluaXRpYWxaPVouZml0WiksWi5taW5afHwoWi5taW5aPVouZml0WiksWi5tYXhafHwoWi5tYXhaPVouZml0WiksWi5pbml0aWFsWjxaLm1pblomJihaLmluaXRpYWxaPVoubWluWiksWi5pbml0aWFsWj5aLm1heFomJihaLmluaXRpYWxaPVoubWF4Wil9ZnVuY3Rpb24gY2soKXtjbChXKSx6PlQmJihjbChWKSx6PlMmJmNsKFUpKSxHLnNvcnQoKSxHPVouVXRpbHMuejI0MihHKSxjcyhHLGNKLDApfWZ1bmN0aW9uIGNsKGEpe3ZhciBiPUpbYV0tMSxjPUtbYV0tMTtmb3IodmFyIGQ9MDtkPD1jO2QrKylmb3IodmFyIGU9MDtlPD1iO2UrKylHLnB1c2goYSsiLSIrZSsiLSIrZCl9ZnVuY3Rpb24gY20oYSxiKXt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKSxkPWJmLXBhcnNlRmxvYXQoay5sZWZ0KSxlPWJoLXBhcnNlRmxvYXQoay50b3ApO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsWi5pbWFnZVg9Wi5pbWFnZVgrZC9aLmltYWdlWixaLmltYWdlWT1aLmltYWdlWStlL1ouaW1hZ2VaLGNyKG0sQixGLCExLCExKSxjcihxLEEsTywhMSwhMSksY1koKTt2YXIgZj1jdygpO2E+MD9mLnJpZ2h0PWYubGVmdDphPDAmJihmLmxlZnQ9Zi5yaWdodCksYj4wP2YuYm90dG9tPWYudG9wOmI8MCYmKGYudG9wPWYuYm90dG9tKTtmb3IodmFyIGc9Zi50b3A7Zzw9Zi5ib3R0b207ZysrKWZvcih2YXIgaD1mLmxlZnQ7aDw9Zi5yaWdodDtoKyspUS5wdXNoKEErIi0iK2grIi0iK2cpO3ZhciBpPVEubGVuZ3RoO2Zvcih2YXIgaj0wO2o8aTtqKyspe3ZhciBsPVFbal07aWYobCl7dmFyIG49bmV3IGNHKGwpO2NJKG4sYyxjSyl9fWk+MzAmJlEuc3BsaWNlKGktMzAsMzApfWZ1bmN0aW9uIGNuKCl7dmFyIGE9ITE7cGFyc2VGbG9hdChyLndpZHRoKSE9cS53aWR0aCYmKFoudXNlQ2FudmFzJiYoci53aWR0aD1xLndpZHRoKyJweCIsci5oZWlnaHQ9cS5oZWlnaHQrInB4IixyLmxlZnQ9IjBweCIsci50b3A9IjBweCIscy5yZXN0b3JlKCkscy5zYXZlKCkscy5zY2FsZShDLEMpKSxhPSEwKTtpZihwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymgpe3ZhciBiPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixjPXBhcnNlRmxvYXQoay50b3ApLWJoO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsYmw9cGFyc2VGbG9hdChuLmxlZnQpK2IsYm09cGFyc2VGbG9hdChuLnRvcCkrYyxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiO3ZhciBkPWNCKEEsQyk7Wi5pbWFnZVg9Wi5pbWFnZVgtYi9kLFouaW1hZ2VZPVouaW1hZ2VZLWMvZCxhPSEwfWEmJihjcihxLEEsTywhMCwhMSksY1koKSl9ZnVuY3Rpb24gY28oKXtDIT1EJiYoWi5pbWFnZVo9YnopLFouaW1hZ2VaPFoubWluWiYmKFouaW1hZ2VaPVoubWluWik7dmFyIGE9ZCxiPXo7d2hpbGUoYS8yPj1aLmltYWdlWiliLS0sYS89MjtiPWItMTwwPzA6Yi0xO3ZhciBjPWNDKGIsWi5pbWFnZVopO2lmKGIhPUF8fGMhPUMpWi51c2VDYW52YXMmJihzLnJlc3RvcmUoKSxzLnNhdmUoKSxzLnNjYWxlKGMsYykpLEE9YixDPWM7RD1DfWZ1bmN0aW9uIGNwKCl7Qj1BPlM/VTpBPlQ/VjpXLEU9Y0MoQixaLmltYWdlWiksdGllckJhY2tmaWxsVz1IW0JdLHRpZXJCYWNrZmlsbEg9SVtCXSxtLndpZHRoPXRpZXJCYWNrZmlsbFcsbS5oZWlnaHQ9dGllckJhY2tmaWxsSDt2YXIgYT10aWVyQmFja2ZpbGxXKkUsYj10aWVyQmFja2ZpbGxIKkUsYz1aLmltYWdlWCpaLmltYWdlWixkPVouaW1hZ2VZKlouaW1hZ2VaO2JqPWEsYms9YixibD1iZC1jLGJtPWJlLWQsWi51c2VDYW52YXMmJihuLndpZHRoPWJqKyJweCIsbi5oZWlnaHQ9YmsrInB4Iiksbi5sZWZ0PWJsKyJweCIsbi50b3A9Ym0rInB4In1mdW5jdGlvbiBjcSgpe3ZhciBhPWN3KCk7Zm9yKHZhciBiPWEudG9wLGM9YS5ib3R0b207Yjw9YztiKyspZm9yKHZhciBkPWEubGVmdCxlPWEucmlnaHQ7ZDw9ZTtkKyspTi5wdXNoKEErIi0iK2QrIi0iK2IpO1Auc29ydCgpLE4uc29ydCgpLFA9Wi5VdGlscy56MjQyKFApLE49Wi5VdGlscy56MjQyKE4pO3ZhciBmPVouVXRpbHMuaW50ZXJzZWN0KE4sUCk7Tj1aLlV0aWxzLnN1YnRyYWN0KE4sUCksUj10aWxlc0xvYWRpbmdOYW1lc0xlbmd0aD1OLmxlbmd0aCxaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpJiZaLlRvb2xiYXIuc2hvd1Byb2dyZXNzKFIsdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGgpLFA9Wi5VdGlscy5zdWJ0cmFjdChQLGYpLFA9UC5jb25jYXQoZiksdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGghPTAmJihNPVtdKX1mdW5jdGlvbiBjcihhLGIsYyxkLGUpe2V8fGN0KGEpO2lmKGQpe3ZhciBmPU1hdGguZmxvb3IoYy5sZW5ndGgvMik7Zm9yKHZhciBnPWYsaD1jLmxlbmd0aDtnPGg7ZysrKXt2YXIgaT1jW2ddO2kmJmkudD09YiYmY00oYSxiLGkpO2lmKGMubGVuZ3RoLWctMSE9Zyl7dmFyIGk9Y1tjLmxlbmd0aC1nLTFdO2kmJmkudD09YiYmY00oYSxiLGkpfX19ZWxzZSBmb3IodmFyIGc9MCxoPWMubGVuZ3RoO2c8aDtnKyspe3ZhciBpPWNbZ107aSYmaS50PT1iJiZjTShhLGIsaSl9fWZ1bmN0aW9uIGNzKGEsYixjKXtpZihhLmxlbmd0aD4wKXt2YXIgZD0obmV3IERhdGUpLmdldFRpbWUoKTtpZihjKXt2YXIgZT1NYXRoLmZsb29yKGEubGVuZ3RoLzIpO2Zvcih2YXIgZj1lLGc9YS5sZW5ndGg7ZjxnO2YrKyl7dmFyIGg9YVtmXTtpZihoKXt2YXIgaT1uZXcgY0coaCk7Y0koaSxkLGIpfWlmKGEubGVuZ3RoLWYtMSE9Zil7dmFyIGg9YVthLmxlbmd0aC1mLTFdO2lmKGgpe3ZhciBpPW5ldyBjRyhoKTtjSShpLGQsYil9fX19ZWxzZSBmb3IodmFyIGY9MCxnPWEubGVuZ3RoO2Y8ZztmKyspe3ZhciBoPWFbZl07aWYoaCl7dmFyIGk9bmV3IGNHKGgpO2NJKGksZCxiKX19fX1mdW5jdGlvbiBjdChhKXtpZihhKWlmKFoudXNlQ2FudmFzJiZhLnRhZ05hbWU9PSJDQU5WQVMiKXt2YXIgYj1hLmdldENvbnRleHQoIjJkIik7Yi5zYXZlKCksYi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLGIuY2xlYXJSZWN0KDAsMCxiLmNhbnZhcy53aWR0aCxiLmNhbnZhcy5oZWlnaHQpLGIucmVzdG9yZSgpfWVsc2UgaWYoYS5oYXNDaGlsZE5vZGVzKCkpd2hpbGUoYS5jaGlsZE5vZGVzLmxlbmd0aD49MSlhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gY3UoKXtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXt2YXIgYT1jQihBLEMpO1ouVG9vbGJhci56MjY2KGEpfX1mdW5jdGlvbiBjdigpe1ouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56MTgwKCkmJlouTmF2aWdhdG9yLnoyNjgoKX1mdW5jdGlvbiBjdygpe3JldHVybiBuZXcgY3ooY3goKSxBKX1mdW5jdGlvbiBjeCgpe3ZhciBhPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixiPXBhcnNlRmxvYXQoay50b3ApLWJoO2lmKFoudXNlQ2FudmFzKXt2YXIgYz1wYXJzZUZsb2F0KGsud2lkdGgpL2kud2lkdGg7YS89YyxiLz1jfXZhciBkPWNCKEEsQyk7cmV0dXJuIGEhPTAmJihhLz1kKSxiIT0wJiYoYi89ZCksbmV3IGNBKFouaW1hZ2VYLWEsWi5pbWFnZVktYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsZCl9ZnVuY3Rpb24gY3koKXt2YXIgYT1wYXJzZUZsb2F0KGsubGVmdCktYmYsYj1wYXJzZUZsb2F0KGsudG9wKS1iaDtpZihaLnVzZUNhbnZhcyl7dmFyIGM9cGFyc2VGbG9hdChrLndpZHRoKS9pLndpZHRoO2EvPWMsYi89Y312YXIgZD1jQihBLEMpO3JldHVybiBhIT0wJiYoYS89ZCksYiE9MCYmKGIvPWQpLG5ldyBjQShaLmltYWdlWC1hLFouaW1hZ2VZLWIsLShiYi8yKSxiYi8yLC0oYmMvMiksYmMvMixkKX1mdW5jdGlvbiBjeihhLGIpe3ZhciBkPWNCKGIsMSksZT1NYXRoLmZsb29yKGEubGVmdCpkL2MpLGY9TWF0aC5mbG9vcihhLnJpZ2h0KmQvYyksZz1NYXRoLmZsb29yKGEudG9wKmQvYyksaD1NYXRoLmZsb29yKGEuYm90dG9tKmQvYyk7ZTwwJiYoZT0wKSxmPkpbQV0tMSYmKGY9SltBXS0xKSxnPDAmJihnPTApLGg+S1tBXS0xJiYoaD1LW0FdLTEpLHRoaXMubGVmdD1lLHRoaXMucmlnaHQ9Zix0aGlzLnRvcD1nLHRoaXMuYm90dG9tPWh9ZnVuY3Rpb24gY0EoYSxiLGMsZCxlLGYsZyl7dGhpcy5sZWZ0PWErYy9nLHRoaXMucmlnaHQ9YStkL2csdGhpcy50b3A9YitlL2csdGhpcy5ib3R0b209YitmL2d9ZnVuY3Rpb24gY0IoYSxiKXt2YXIgYz1iKihIW2FdL1ouaW1hZ2VXKTtyZXR1cm4gY31mdW5jdGlvbiBjQyhhLGIpe3ZhciBjPWIvKEhbYV0vWi5pbWFnZVcpO3JldHVybiBjfWZ1bmN0aW9uIGNEKGEsYil7dmFyIGM9YS1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS54LGQ9Yi1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS55O3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChjLGQpfWZ1bmN0aW9uIGNFKGEsYil7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpK2JkLGQ9cGFyc2VGbG9hdChrLnRvcCkrYmUsZT1hLWMsZj1iLWQsZz1lL1ouaW1hZ2VaLGg9Zi9aLmltYWdlWixpPVouaW1hZ2VYK2csaj1aLmltYWdlWStoO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNGKGEsYil7dmFyIGM9Wi5pbWFnZVgtYSxkPVouaW1hZ2VZLWIsZT1jKlouaW1hZ2VaLGY9ZCpaLmltYWdlWixnPXBhcnNlRmxvYXQoay5sZWZ0KStiZCxoPXBhcnNlRmxvYXQoay50b3ApK2JlLGk9Zy1lLGo9aC1mO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNHKGEpe3RoaXMubmFtZT1hLHRoaXMudD1wYXJzZUludChhLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLSIpKSwxMCksdGhpcy5jPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEuaW5kZXhPZigiLSIpKzEsYS5sYXN0SW5kZXhPZigiLSIpKSwxMCksdGhpcy5yPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEubGFzdEluZGV4T2YoIi0iKSsxKSwxMCksdGhpcy54PU1hdGguZmxvb3IodGhpcy5jKmMpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMucipjKSx0aGlzLmltYWdlPW51bGwsdGhpcy5hbHBoYT0wLHRoaXMudXJsPVouVXRpbHMuejE0MChjSCh0aGlzLnQsdGhpcy5jLHRoaXMucix0aGlzLm5hbWUpKSx0aGlzLmVsbXQ9bnVsbCx0aGlzLnN0eWxlPW51bGx9ZnVuY3Rpb24gY0goYSxiLGQsZSl7dmFyIGY9ZCpKW2FdK2I7Zm9yKHZhciBnPTA7ZzxhO2crKylmKz1MW2ddO3ZhciBoPU1hdGguZmxvb3IoZi9jKSxpPVouaW1hZ2VQYXRoKyIvIisiVGlsZUdyb3VwIitoKyIvIitlKyIuanBnIjtyZXR1cm4gaX1mdW5jdGlvbiBjSShhLGIsYyl7YS5sb2FkaW5nPWNiLnoyMTJJbWFnZShhLnVybCxaLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsYyxhLGIpKX1mdW5jdGlvbiBjSihhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtGLnB1c2goYSk7dmFyIGU9Ry5pbmRleE9mKGQpO2UhPS0xJiZHLnNwbGljZShlLDEpLGEuYWxwaGE9MSxhLnQ9PUImJmNNKG0sQixhKX19ZnVuY3Rpb24gY0soYSxiLGMpe2lmKGEmJmImJmMpe2EuaW1hZ2U9Yzt2YXIgZD1hLm5hbWU7Y00ocSxBLGEpfX1mdW5jdGlvbiBjTChhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtPLnB1c2goYSksUC5wdXNoKGQpO3ZhciBlPU4uaW5kZXhPZihkKTtlIT0tMSYmTi5zcGxpY2UoZSwxKSxNLnB1c2goYSksYkZ8fChiRj13aW5kb3cuc2V0SW50ZXJ2YWwoY1AsNTApKTt2YXIgZz1OLmxlbmd0aDtnPT0wJiYoWi51c2VDYW52YXMmJmNyKHEsQSxPLCEwLCExKSxQLmxlbmd0aD5mJiZjUSgpLFI9MCksWi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmWi5Ub29sYmFyLnNob3dQcm9ncmVzcyhSLGcpfX1mdW5jdGlvbiBjTShhLGIsYyl7dmFyIGQ9Yy54LGU9Yy55LGY9Y0IoYiwxKTtpZihaLnVzZUNhbnZhcylhPT1xJiYoZC09Wi5pbWFnZVgqZixlLT1aLmltYWdlWSpmKSxjTihhLGMsZCxlKTtlbHNle3ZhciBnO2E9PXE/KGQtPVouaW1hZ2VYKmYtYmQvQyxlLT1aLmltYWdlWSpmLWJlL0MsZz1DKTpnPUUsY08oYSxjLGQsZSxnKX19ZnVuY3Rpb24gY04oYSxiLGMsZCl7dmFyIGU9YS5nZXRDb250ZXh0KCIyZCIpO1ouYWxwaGFTdXBwb3J0ZWQmJmIuYWxwaGE8MT8oZS5nbG9iYWxBbHBoYT1iLmFscGhhLGUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKSxlLmdsb2JhbEFscGhhPTEpOmUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKX1mdW5jdGlvbiBjTyhhLGIsYyxkLGUpe2IuZWxtdHx8KGIuZWxtdD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImltZyIpLGIuZWxtdC5vbm1vdXNlZG93bj1aLlV0aWxzLnByZXZlbnREZWZhdWx0LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihiLmVsbXQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxiLmVsbXQuc3JjPWIudXJsLGIuc3R5bGU9Yi5lbG10LnN0eWxlLGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixaLlV0aWxzLnJlbmRlclF1YWxpdHkoYixaLnJlbmRlclF1YWxpdHkpLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCYmKGIuc3R5bGVbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eSsiT3JpZ2luIl09IjBweCAwcHgiKSksYi5lbG10LnBhcmVudE5vZGUhPWEmJmEuYXBwZW5kQ2hpbGQoYi5lbG10KTt2YXIgZj1iLnN0eWxlO2YuZGlzcGxheT0ibm9uZSIsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkP2ZbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eV09WyJtYXRyaXgoIiwoYi5pbWFnZS53aWR0aC9iLmVsbXQud2lkdGgqZSkudG9GaXhlZCg4KSwiLDAsMCwiLChiLmltYWdlLmhlaWdodC9iLmVsbXQuaGVpZ2h0KmUpLnRvRml4ZWQoOCksIiwiLChjKmUpLnRvRml4ZWQoOCksWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPyIsIjoicHgsIiwoZCplKS50b0ZpeGVkKDgpLFouY3NzVHJhbnNmb3JtTm9Vbml0cz8iKSI6InB4KSJdLmpvaW4oIiIpOihmLndpZHRoPWIuaW1hZ2Uud2lkdGgqZSsicHgiLGYuaGVpZ2h0PWIuaW1hZ2UuaGVpZ2h0KmUrInB4IixmLmxlZnQ9YyplKyJweCIsZi50b3A9ZCplKyJweCIpLGYuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnNldE9wYWNpdHkoYixiLmFscGhhKX1mdW5jdGlvbiBjUChhKXt2YXIgYj1NLmxlbmd0aCxjPTA7Zm9yKHZhciBkPTA7ZDxiO2QrKyl7dmFyIGU9TVtkXTtlLnQ9PUEmJihlLmFscGhhPDE/KGUuYWxwaGErPWJFLGUuYWxwaGE+MSYmKGUuYWxwaGE9MSksY00ocSxBLGUpKTooYysrLGM+PWImJih3aW5kb3cuY2xlYXJJbnRlcnZhbChiRiksYkY9bnVsbCkpKX19ZnVuY3Rpb24gY1EoKXt2YXIgYT1QLmxlbmd0aC1mO2Zvcih2YXIgYj0wO2I8YTtiKyspaj1QLmluZGV4T2YoT1tiXS5uYW1lKSxqIT0tMSYmUC5zcGxpY2UoaiwxKSxPLnNwbGljZShiLDEpfWZ1bmN0aW9uIGNSKCl7cmV0dXJuIFouaW1hZ2VXL1ouaW1hZ2VIPlkvJD9ZL1ouaW1hZ2VXOiQvWi5pbWFnZUh9ZnVuY3Rpb24gY1MoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9bmV3IGNBKGEsYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGQ9Yy5sZWZ0LGU9Yy5yaWdodCxmPWMudG9wLGc9Yy5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9kPDA/YT1ZLzIvWi5pbWFnZVo6ZT5aLmltYWdlVyYmKGE9Wi5pbWFnZVctWS8yL1ouaW1hZ2VaKTphPVouaW1hZ2VXLzIsWi5pbWFnZUgqWi5pbWFnZVo+JD9mPDA/Yj0kLzIvWi5pbWFnZVo6Zz5aLmltYWdlSCYmKGI9Wi5pbWFnZUgtJC8yL1ouaW1hZ2VaKTpiPVouaW1hZ2VILzJ9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1QoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Y0IoQSxDKSxkPVouaW1hZ2VYLGU9Wi5pbWFnZVksZj1uZXcgY0EoZCxlLC0oWS8yKSxZLzIsLSgkLzIpLCQvMixjKSxnPWYubGVmdCxoPWYucmlnaHQsaT1mLnRvcCxqPWYuYm90dG9tO1ouaW1hZ2VXKmM+WT9nPDA/YSs9ZypjOmg+Wi5pbWFnZVcmJihhLT0oWi5pbWFnZVctaCkqYyk6YSs9KGQtWi5pbWFnZVcvMikqYyxaLmltYWdlSCpjPiQ/aTwwP2IrPWkqYzpqPlouaW1hZ2VIJiYoYi09KFouaW1hZ2VILWopKmMpOmIrPShlLVouaW1hZ2VILzIpKmN9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1UoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Wi5pbWFnZVgtKGEtYmYpL1ouaW1hZ2VaLGQ9Wi5pbWFnZVktKGItYmgpL1ouaW1hZ2VaLGU9bmV3IGNBKGMsZCwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGY9ZS5sZWZ0LGc9ZS5yaWdodCxoPWUudG9wLGk9ZS5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9mPDA/YSs9ZipaLmltYWdlWjpnPlouaW1hZ2VXJiYoYS09KFouaW1hZ2VXLWcpKlouaW1hZ2VaKTphKz0oYy1aLmltYWdlVy8yKSpaLmltYWdlWixaLmltYWdlSCpaLmltYWdlWj4kP2g8MD9iKz1oKlouaW1hZ2VaOmk+Wi5pbWFnZUgmJihiLT0oWi5pbWFnZUgtaSkqWi5pbWFnZVopOmIrPShkLVouaW1hZ2VILzIpKlouaW1hZ2VafXJldHVybiBuZXcgWi5VdGlscy5Qb2ludChhLGIpfWZ1bmN0aW9uIGNWKGEpe3JldHVybiBhPloubWF4Wj9hPVoubWF4WjphPFoubWluWiYmKGE9Wi5taW5aKSxhfWZ1bmN0aW9uIGNXKCl7Ylo9bmV3IEltYWdlLGIkPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzMiKSksYloudXJsPVoud2F0ZXJtYXJrUGF0aCxiWi5vbmxvYWQ9Y1gsYloub25lcnJvcj1jWixiWi5zcmM9Wi53YXRlcm1hcmtQYXRofWZ1bmN0aW9uIGNYKCl7aWYodSl7dmFyIGE9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno3NCIpKSxiPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzYiKSksYz1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejc1IikpLGQ9Y0IoQSxDKSxlPShaLmltYWdlVypkLXUud2lkdGgpLzIsZj0oWi5pbWFnZUgqZC11LmhlaWdodCkvMixnPShaLmltYWdlVy8yLVouaW1hZ2VYKSpkLGg9KFouaW1hZ2VILzItWi5pbWFnZVkpKmQsaT1kPGE/YTpkLGo9TWF0aC5yb3VuZChaLmltYWdlVy9iKSxrPU1hdGgucm91bmQoWi5pbWFnZUgvYyksbD1jeSgpO3dpU2NhbGVkVz1iWi53aWR0aCppLHdpU2NhbGVkSD1iWi5oZWlnaHQqaTt2YXIgbT0wLG49MDtmb3IodmFyIG89MTtvPD1qO28rKylmb3IodmFyIHA9MTtwPD1rO3ArKyl7dmFyIHE9TWF0aC5yb3VuZChaLmltYWdlVy8oaisxKSpvKSxyPU1hdGgucm91bmQoWi5pbWFnZUgvKGsrMSkqcCk7aWYocT5sLmxlZnQmJnE8bC5yaWdodCYmcj5sLnRvcCYmcjxsLmJvdHRvbSl7dmFyIHM9TWF0aC5yb3VuZChxKmQtd2lTY2FsZWRXLzItZStnKSx0PU1hdGgucm91bmQocipkLXdpU2NhbGVkSC8yLWYraCk7aWYoWi5pbWFnZVc+NGUzKXt2YXIgdj1tKzEwMCx3PW4rMTAwO2lmKHM8diYmdDx3KWNvbnRpbnVlO209cyxuPXR9dmFyIHg9YlouY2xvbmVOb2RlKCEwKTtaLlV0aWxzLnNldE9wYWNpdHkoeCxiJCkseC53aWR0aD13aVNjYWxlZFcseC5oZWlnaHQ9d2lTY2FsZWRIO3ZhciB5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2lDIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLHdpU2NhbGVkVysicHgiLHdpU2NhbGVkSCsicHgiLHMrInB4Iix0KyJweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7eS5hcHBlbmRDaGlsZCh4KSx1LmFwcGVuZENoaWxkKHkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHgsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9fX19ZnVuY3Rpb24gY1koKXt1JiYoY3QodSksY1goKSl9ZnVuY3Rpb24gY1ooKXtaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6OTciKSt0aGlzLnVybCl9ZnVuY3Rpb24gYyQoYixjLGQpe2EuejI5M0FsbFN0b3AoKSxaLmltYWdlWj1jVihkKTt2YXIgZT1jUyhiLGMpO1ouaW1hZ2VYPWUueCxaLmltYWdlWT1lLnksYS56Mjc0KCEwKX1mdW5jdGlvbiBjXygpe2lmKGJCKXtkYihidixidyxieCwhMSk7aWYoYnYhPT0wfHxidyE9PTB8fGJ4IT09MCliQj13aW5kb3cuc2V0VGltZW91dChjXyxiQSl9fWZ1bmN0aW9uIGRhKCl7Yk88Ykk/KGRiKGJKLGJLLGJMLCEwKSxiTysrLGJOPXdpbmRvdy5zZXRUaW1lb3V0KGRhLGJIKSk6KEM9Yk8qYkwrY0MoQSxaLmltYWdlWiksYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfWZ1bmN0aW9uIGRiKGEsYixkLGUpe3ZhciBmLGcsaCxpPSExLGo9ITEsbD0hMTtpZihkIT0wKXt2YXIgbT1DKigxK2QpO2UmJihtPUMrZCk7dmFyIG49Y0IoQSxtKTtoPWNWKG4pO2lmKGghPVouaW1hZ2VaKXt2YXIgbz1kZShoKTtvJiYoIWUsaj0hMCxsPSEwKX19aWYoYSE9MHx8YiE9MCl7dmFyIHA9cGFyc2VGbG9hdChrLmxlZnQpK2Escz1wYXJzZUZsb2F0KGsudG9wKStiLHQ9Y1UocCxzKTtmPXQueCxnPXQueSxrLmxlZnQ9ZisicHgiLGsudG9wPWcrInB4IixpPSEwLGw9ITB9dmFyIHU9YnklMj09MDt1JiYoY1koKSxqJiZjdSgpLGwmJmN2KCkpO2lmKGkpdmFyIHY9Wi51c2VDYW52YXM/cGFyc2VGbG9hdChyLndpZHRoKS9xLndpZHRoOjEsdz1NYXRoLnJvdW5kKGMvYnUqQyp2KSx4PWJ5JXc9PTAmJmJ5IT0wfWZ1bmN0aW9uIGRjKCl7YkImJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJCKSxiQj1udWxsKSxidj0wLGJ3PTAsYng9MCxieT0wfWZ1bmN0aW9uIGRkKCl7Yk4mJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJOKSxiTj1udWxsKX1mdW5jdGlvbiBkZShhKXt2YXIgYj0hMSxjPWNDKEEsYSk7aWYoYyE9Qyl7Qz1jLEU9Y0MoQixhKTt2YXIgZD1jL0QsZT1iYipkLGY9YmMqZCxnPShiYi1lKS8yLGg9KGJjLWYpLzI7aWYoYzxEKXt2YXIgaT1jVChnLGgpO2subGVmdD1iZitpLngtZysicHgiLGsudG9wPWJoK2kueS1oKyJweCJ9aWYoWi51c2VDYW52YXMpci53aWR0aD1lKyJweCIsci5oZWlnaHQ9ZisicHgiLHIubGVmdD1nKyJweCIsci50b3A9aCsicHgiLGU9YmoqZCxmPWJrKmQsZz1ibCtaLmltYWdlWCooMS1kKSpaLmltYWdlWixoPWJtK1ouaW1hZ2VZKigxLWQpKlouaW1hZ2VaLG4ud2lkdGg9ZSsicHgiLG4uaGVpZ2h0PWYrInB4IixuLmxlZnQ9ZysicHgiLG4udG9wPWgrInB4IjtlbHNle2NyKHEsQSxPLCEwLCExKSx0aWVyQmFja2ZpbGxXPUhbQl0sdGllckJhY2tmaWxsSD1JW0JdLG0ud2lkdGg9dGllckJhY2tmaWxsVyxtLmhlaWdodD10aWVyQmFja2ZpbGxIO3ZhciBqPXRpZXJCYWNrZmlsbFcqRSxsPXRpZXJCYWNrZmlsbEgqRSxvPVouaW1hZ2VYKmEscD1aLmltYWdlWSphO2JsPWJkLW8sYm09YmUtcCxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiLGNyKG0sQixGLCExLCExKX1iPSEwfXJldHVybiBifWZ1bmN0aW9uIGRmKGEpe2E/KGJYfHxkZygpLGJYLmVsbXQuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIik6YlgmJihiWC5lbG10LnN0eWxlLmRpc3BsYXk9Im5vbmUiKX1mdW5jdGlvbiBkZygpe3ZhciBhPVouVXRpbHMuejE4NSgiejIxIiksYj0zNCxjPTM0LGQ9MjAsZT1wYXJzZUZsb2F0KFoudmlld2VyVyktKGIrZCksZj1wYXJzZUZsb2F0KFoudmlld2VySCktKGMrZCksZz1aLlV0aWxzLnoxODUoInoyMCIpO2JYPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uRlBDYW5jZWwiLGEsbnVsbCxudWxsLG51bGwsbnVsbCxiKyJweCIsYysicHgiLGUrInB4IixmKyJweCIsIm1vdXNlZG93biIsZGgsInoxMDIiLCJzb2xpZCIsIjFweCIsZywiMHB4IiwiMHB4IiksWi5WaWV3ZXJEaXNwbGF5LmFwcGVuZENoaWxkKGJYLmVsbXQpfWZ1bmN0aW9uIGRoKCl7YS50b2dnbGVGdWxsUGFnZVZpZXcoITEpfWZ1bmN0aW9uIGRpKCl7Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXlkb3duIixkeiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXl1cCIsZEEpLFoubW9iaWxlRGV2aWNlPyhaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hzdGFydCIsZHApLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJ0b3VjaG1vdmUiLGRxKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hlbmQiLGRyKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hjYW5jZWwiLGRzKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZXN0YXJ0IixkdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksImdlc3R1cmVjaGFuZ2UiLGR1KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZWVuZCIsZHYpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0ub25vcmllbnRhdGlvbmNoYW5nZT1keSk6KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3ZlciIsZGopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3V0IixkbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKFouVmlld2VyRGlzcGxheSwibW91c2Vtb3ZlIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwibW91c2Vkb3duIixkayksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNlbW92ZSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihtLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHEsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSx1JiZaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLHgmJlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9ZnVuY3Rpb24gZGooYSl7dmFyIGI9Wi5VdGlscy56MjI1KFouVXRpbHMudGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKSxjPVouVXRpbHMuejIyNShaLlV0aWxzLnJlbGF0ZWRUYXJnZXQoYSkpO2lmKCFifHwhYylaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCEwKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSxibz1udWxsfWZ1bmN0aW9uIGRrKGEpe2lmKFouVXRpbHMuaXNSaWdodE1vdXNlQnV0dG9uKGEpKXJldHVybjtibj0hMDt2YXIgYj1aLlV0aWxzLnoxODEoYSk7cmV0dXJuIGJQPW5ldyBaLlV0aWxzLlBvaW50KGIueCxiLnkpLGkubW91c2VYUHJpb3I9Yi54LGkubW91c2VZUHJpb3I9Yi55LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixkbCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNldXAiLGRtKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLGRtKSwhMX1mdW5jdGlvbiBkbChiKXtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGI9Wi5VdGlscy5ldmVudChiKSxjPVouVXRpbHMuejE4MShiKSxkPWMueC1pLm1vdXNlWFByaW9yLGU9Yy55LWkubW91c2VZUHJpb3I7aWYoIWlzTmFOKGQpJiYhaXNOYU4oZSkpe3ZhciBmPXBhcnNlRmxvYXQoay5sZWZ0KStkLGc9cGFyc2VGbG9hdChrLnRvcCkrZSxoPWNVKGYsZyk7ay5sZWZ0PWgueCsicHgiLGsudG9wPWgueSsicHgiLGkubW91c2VYUHJpb3I9Yy54LGkubW91c2VZUHJpb3I9Yy55O2lmKFouTmF2aWdhdG9yKXt2YXIgaj1hLnoxNDEoaCk7Wi5OYXZpZ2F0b3IuejI2M1JlY3RhbmdsZVBvc2l0aW9uKGopfX1yZXR1cm4hMX1mdW5jdGlvbiBkbShiKXtibj0hMSxkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLGRsKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoaSwibW91c2V1cCIsZG0pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsZG0pO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1aLlV0aWxzLnoxODEoYiksZDtibz9kPWJvOmQ9bmV3IFouVXRpbHMuUG9pbnQoYy54LGMueSk7dmFyIGU9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZC54LDIpK01hdGgucG93KGJQLnktZC55LDIpKTtpZihlPDQpe3ZhciBmPWEuejE3MyhiLGQsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoZi54LGYueSxmLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhmLngsZi55LFouaW1hZ2VaKX1lbHNlIFoubW91c2VQYW4mJmEuejI3NCgpO2JvJiYoWi5Ub29sYmFyRGlzcGxheSYmWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMSksWi5OYXZpZ2F0b3JEaXNwbGF5JiZaLm5hdmlnYXRvclZpc2libGU+MSYmWi5OYXZpZ2F0b3Iuc2V0VmlzaWJpbGl0eSghMSkpfWZ1bmN0aW9uIGRuKGEpe3ZhciBiPVouVXRpbHMuejIyNShaLlV0aWxzLnRhcmdldChhKSksYz1aLlV0aWxzLnoyMjUoWi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKTtpZighYnx8IWMpaWYoIWJuKVouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITEpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2Vsc2V7dmFyIGQ9Wi5VdGlscy56MTgxKGEpO2JvPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX1mdW5jdGlvbiBkcChhKXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYiYmIWJwKXticj0hMTt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7YlA9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksaS5tb3VzZVhQcmlvcj1kLngsaS5tb3VzZVlQcmlvcj1kLnl9fWZ1bmN0aW9uIGRxKGIpe2IucHJldmVudERlZmF1bHQoKTtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGM9Wi5VdGlscy56MTc4KGIpO2lmKGMmJiFicCYmIWJyKXt2YXIgZD1jLnRhcmdldCxlPW5ldyBaLlV0aWxzLlBvaW50KGMucGFnZVgsYy5wYWdlWSksZj1lLngtaS5tb3VzZVhQcmlvcixnPWUueS1pLm1vdXNlWVByaW9yO2lmKCFpc05hTihmKSYmIWlzTmFOKGcpKXt2YXIgaD1wYXJzZUZsb2F0KGsubGVmdCkrZixqPXBhcnNlRmxvYXQoay50b3ApK2csbD1jVShoLGopO2subGVmdD1sLngrInB4IixrLnRvcD1sLnkrInB4IixpLm1vdXNlWFByaW9yPWUueCxpLm1vdXNlWVByaW9yPWUueTtpZihaLk5hdmlnYXRvcil7dmFyIG09YS56MTQxKGwpO1ouTmF2aWdhdG9yLnoyNjNSZWN0YW5nbGVQb3NpdGlvbihtKX19fXJldHVybiExfWZ1bmN0aW9uIGRyKGIpe2lmKCFicCYmIWJyKXt2YXIgYz0hMSxkPVouVXRpbHMuejE3OChiKTtpZihkKXt2YXIgZT1kLnRhcmdldCxmPW5ldyBaLlV0aWxzLlBvaW50KGQucGFnZVgsZC5wYWdlWSksZz1uZXcgWi5VdGlscy5Qb2ludChmLngsZi55KSxoPU1hdGguc3FydChNYXRoLnBvdyhiUC54LWcueCwyKStNYXRoLnBvdyhiUC55LWcueSwyKSk7aWYoaDw0KXt2YXIgaT1hLnoxNzMoYixnLEEsQyk7Wi5jbGlja1pvb20/YS56MjkzVG9WaWV3KGkueCxpLnksaS56KTpaLmNsaWNrUGFuJiZhLnoyOTNUb1ZpZXcoaS54LGkueSxaLmltYWdlWil9ZWxzZSBjPSEwfWVsc2UgYz0hMDtjJiZaLm1vdXNlUGFuJiZhLnoyNzQoKX19ZnVuY3Rpb24gZHMoYil7aWYoIWJwJiYhYnIpe3ZhciBjPSExLGQ9Wi5VdGlscy56MTc4KGIpO2lmKGQpe3ZhciBlPWQudGFyZ2V0LGY9bmV3IFouVXRpbHMuUG9pbnQoZC5wYWdlWCxkLnBhZ2VZKSxnPW5ldyBaLlV0aWxzLlBvaW50KGYueCxmLnkpLGg9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZy54LDIpK01hdGgucG93KGJQLnktZy55LDIpKTtpZihoPDQpe3ZhciBpPWEuejE3MyhiLGcsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoaS54LGkueSxpLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhpLngsaS55LFouaW1hZ2VaKX1lbHNlIGM9ITB9ZWxzZSBjPSEwO2MmJloubW91c2VQYW4mJmEuejI3NCgpfX1mdW5jdGlvbiBkdChhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpO2R1KGEpLGJwfHwoYnA9d2luZG93LnNldEludGVydmFsKGR3LGJzKSl9ZnVuY3Rpb24gZHUoYSl7dmFyIGE9Wi5VdGlscy5ldmVudChhKTthLnByZXZlbnREZWZhdWx0KCksYnE9TWF0aC5yb3VuZChhLnNjYWxlKjEwMCkvMTAwfWZ1bmN0aW9uIGR2KGIpe2JwJiYod2luZG93LmNsZWFySW50ZXJ2YWwoYnApLGJyPSEwLGJwPW51bGwpLFoubW91c2VQYW4mJmEuejI3NCgpfWZ1bmN0aW9uIGR3KGEpe2lmKCFaLm1vdXNlUGFuKXJldHVybjt2YXIgYj1keChBLEQsYnEpLGM9Y1YoYik7YiE9Wi5pbWFnZVomJmRlKGMpfWZ1bmN0aW9uIGR4KGEsYixjKXt2YXIgZD1iKmMsZT1jQihhLGQpO3JldHVybiBlfWZ1bmN0aW9uIGR5KGIpe1ouZnVsbFBhZ2UmJihaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCExKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKSxhLnRvZ2dsZUZ1bGxQYWdlVmlldyghMSksYS50b2dnbGVGdWxsUGFnZVZpZXcoITApLFouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITApLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApKX1mdW5jdGlvbiBkeihiKXtpZighWi5rZXlzKXJldHVybjt2YXIgYj1aLlV0aWxzLmV2ZW50KGIpO3N3aXRjaChiLmtleUNvZGUpe2Nhc2UgOTA6YS56b29tKCJvdXQiKTticmVhaztjYXNlIDE3OmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSA2NTphLnpvb20oImluIik7YnJlYWs7Y2FzZSAxNjphLnpvb20oImluIik7YnJlYWs7Y2FzZSAzNzphLnBhbigibGVmdCIpO2JyZWFrO2Nhc2UgMzg6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSA0MDphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UgMzk6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSAyNzpaLmZ1bGxQYWdlP2EudG9nZ2xlRnVsbFBhZ2VWaWV3KCExKTphLnJlc2V0KCl9fWZ1bmN0aW9uIGRBKGIpe2lmKCFaLmtleXMpcmV0dXJuO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1iLmtleUNvZGU7Yz09OTB8fGM9PTE3fHxjPT02NXx8Yz09MTY/YS56b29tKCJzdG9wIik6Yz09Mzd8fGM9PTM5P2EucGFuKCJob3Jpem9udGFsU3RvcCIpOihjPT0zOHx8Yz09NDApJiZhLnBhbigidmVydGljYWxTdG9wIil9dmFyIGE9dGhpcyxiPSExLGM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjEiKSwxMCksZD1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejU5IikpLGU9ZC8yLGY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjIiKSwxMCksZz1aLnRvb2xiYXJWaXNpYmxlPT0xP1oudG9vbGJhckg6MCxoLGksayxsLG0sbixvLHAscSxyLHMsdCx1LHYsdyx4LHk7Y2coKTt2YXIgej0xLEE9MCxCPTAsQyxELEUsRj1bXSxHPVtdLEg9W10sST1bXSxKPVtdLEs9W10sTD1bXSxNPVtdLE49W10sTz1bXSxQPVtdLFE9W10sUj0wLFM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NyIpLDEwKSxUPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejYiKSwxMCksVT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1IiksMTApLFY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NCIpLDEwKSxXPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejMiKSwxMCksWD1wYXJzZUludChaLlV0aWxzLnoxODUoIno0NSIpLDEwKSxZLCQsXyxiYSxiYixiYyxiZCxiZSxiZixiZyxiaCxiaSxiaixiayxibCxibTtZPVoudmlld2VyVywkPVoudmlld2VySCxfPWJhPTAsJC09ZyxaLnRvb2xiYXJQb3NpdGlvbj09MCYmKGJhKz1nKTt2YXIgYm49ITEsYm89bnVsbCxicD1udWxsLGJxPW51bGwsYnI9ITEsYnM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6MjQiKSwxMCksYnQ9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno4MSIpKSpaLnpvb21TcGVlZDtaLm1vYmlsZURldmljZSYmKGJ0Lz0yKTt2YXIgYnU9TWF0aC5yb3VuZChwYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejQ3IikpKloucGFuU3BlZWQpLGJ2PTAsYnc9MCxieD0wLGJ5PTAsYno9MCxiQT1wYXJzZUludChaLlV0aWxzLnoxODUoIno3NyIpLDEwKSxiQixiQyxiRCxiRT1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejE5IikpKlouZmFkZUluU3BlZWQsYkYsYkc9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzgiKSwxMCksYkg9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzkiKSwxMCksYkk9YkcvYkgsYkosYkssYkwsYk0sYk4sYk8sYlAsYlEsYlIsYlMsYlQsYlUsYlYsYlcsYlgsYlk7aWYoWi5VdGlscy5pc1N0clZhbChaLndhdGVybWFya1BhdGgpKXZhciBiWixiJCxiXz1bXSxjYT1bXTtjaChZLCQsXyxiYSk7dmFyIGNiPW5ldyBaLnoxMDEsY2M9Wi5VdGlscy56MTQwKFouaW1hZ2VQYXRoKyIvIisiSW1hZ2VQcm9wZXJ0aWVzLnhtbCIpO2NiLmxvYWRYTUwoY2MpLHRoaXMuejIwNj1mdW5jdGlvbihhLGIpe1ouaW1hZ2VXPWEsWi5pbWFnZUg9YixjaSgpLGNqKCksRT1jQyhCLFouaW5pdGlhbFopLEM9Y0MoQSxaLmluaXRpYWxaKSxEPUMsWi51c2VDYW52YXMmJnMuc2NhbGUoQyxDKSx1JiZjVygpLGNrKCksYyQoWi5pbml0aWFsWCxaLmluaXRpYWxZLFouaW5pdGlhbFopLGRpKCksY2YoITApLFouVmlld2VyLnoxNDgoKX0sdGhpcy5yZXoyMDY9ZnVuY3Rpb24oYSxiKXtjZighMSksY2QoKSxaLmltYWdlVz1hLFouaW1hZ2VIPWIsY2koKSxjaigpLEU9Y0MoQixaLmluaXRpYWxaKSxDPWNDKEEsWi5pbml0aWFsWiksRD1DLFoudXNlQ2FudmFzJiYocy5yZXN0b3JlKCkscy5zY2FsZShDLEMpKSxjaygpLGNoKFksJCxfLGJhKSxtJiZjdChtKSxxJiZjdChxKSx1JiZjdCh1KSxjJChaLmluaXRpYWxYLFouaW5pdGlhbFksWi5pbml0aWFsWiksY2YoITApLFoubmF2aWdhdG9yVmlzaWJsZT4wJiZaLk5hdmlnYXRvci5zZXRJbWFnZVBhdGgoWi5pbWFnZVBhdGgpfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gY2UoKX0sdGhpcy56MjAxPWZ1bmN0aW9uKCl7cmV0dXJuIGJifSx0aGlzLnoxNzk9ZnVuY3Rpb24oKXtyZXR1cm4gYmN9LHRoaXMuejE4Nj1mdW5jdGlvbigpe3JldHVybiB6fSx0aGlzLnoxOTU9ZnVuY3Rpb24oKXtyZXR1cm4gY30sdGhpcy56MTg3PWZ1bmN0aW9uKCl7cmV0dXJuIEF9LHRoaXMuejE4OT1mdW5jdGlvbigpe3JldHVybiBDfSx0aGlzLnoxODlBc1pvb209ZnVuY3Rpb24oKXt2YXIgYT1jQihBLEMpO3JldHVybiBhfSx0aGlzLnoxOTQ9ZnVuY3Rpb24oKXtyZXR1cm4gZH0sdGhpcy56MTkzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHRoaXMuejE5Nz1mdW5jdGlvbigpe3JldHVybiBmfSx0aGlzLnoxOTI9ZnVuY3Rpb24oKXtyZXR1cm4gSC5qb2luKCIsIil9LHRoaXMuejE4OD1mdW5jdGlvbigpe3JldHVybiBJLmpvaW4oIiwgIil9LHRoaXMuejE5MT1mdW5jdGlvbigpe3JldHVybiBMLmpvaW4oIiwgIil9LHRoaXMuejE5Nj1mdW5jdGlvbigpe3ZhciBhPU4uam9pbigiLCAiKT09IiI/IkN1cnJlbnQgdmlldyBsb2FkaW5nIGNvbXBsZXRlIjpOLmpvaW4oIiwgIik7cmV0dXJuIGF9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQpe2NoKGEsYixjLGQpfSx0aGlzLnoyNzQ9ZnVuY3Rpb24oYSl7aWYoQyE9RHx8Wi5pbWFnZVohPWJ6fHxwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymh8fGEpe2NuKCksYno9Y0IoQSxDKTt2YXIgYz0hMTtpZihDIT1EfHxaLmltYWdlWiE9Ynp8fCFifHxhKVouaW1hZ2VaPGJ6JiYhYSYmKGM9ITApLGNvKCksY3AoKSxjcihtLEIsRiwhMSwhMSk7Y3EoKSxjcihxLEEsTywhMCxjKSxjcyhOLGNMLDApLGN1KCksY3YoKX19LHRoaXMuc2V0Vmlldz1mdW5jdGlvbihhLGIsYyl7aWYoYT09dW5kZWZpbmVkfHxhPT1udWxsKWE9Wi5pbWFnZVcvMjtpZihiPT11bmRlZmluZWR8fGI9PW51bGwpYj1aLmltYWdlSC8yO2M9PXVuZGVmaW5lZHx8Yz09bnVsbD9jPVouZml0WjpjPjEmJihjPWMvMTAwKSxjJChhLGIsYyl9LHRoaXMuem9vbT1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJvdXQiOmJ4Pj0wJiYoYngtPWJ0KTticmVhaztjYXNlImluIjpieDw9MCYmKGJ4Kz1idCk7YnJlYWs7Y2FzZSJzdG9wIjpieD0wfVouem9vbWluZz1ieD09MD8ic3RvcCI6Yng+MD8iaW4iOiJvdXQiLGJ4IT0wP2JCfHwoKGJ4PDAmJlouaW1hZ2VaPloubWluWnx8Yng+MCYmWi5pbWFnZVo8Wi5tYXhaKSYmYS56MjczKCExKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnBhbj1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJsZWZ0Ijpidjw9MCYmKGJ2Kz1idSk7YnJlYWs7Y2FzZSJ1cCI6Ync8PTAmJihidys9YnUpO2JyZWFrO2Nhc2UiZG93biI6Ync+PTAmJihidy09YnUpO2JyZWFrO2Nhc2UicmlnaHQiOmJ2Pj0wJiYoYnYtPWJ1KTticmVhaztjYXNlImhvcml6b250YWxTdG9wIjpidj0wO2JyZWFrO2Nhc2UidmVydGljYWxTdG9wIjpidz0wO2JyZWFrO2Nhc2Uic3RvcCI6YnY9MCxidz0wfVoucGFubmluZ1g9YnY9PTA/InN0b3AiOmJ2PjA/ImxlZnQiOiJyaWdodCIsWi5wYW5uaW5nWT1idz09MD8ic3RvcCI6Ync+MD8idXAiOiJkb3duIixiQz1aLmltYWdlWCpjQihBLDEpLGJEPVouaW1hZ2VZKmNCKEEsMSksYnYhPTB8fGJ3IT0wP2JCfHwoYS56MjczKCEwKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnoyOTNUb1ZpZXc9ZnVuY3Rpb24oYixjLGQpe2EuejI5M0FsbFN0b3AoKTt2YXIgZT1jRihiLGMpLGY9YmQtZS54LGc9YmUtZS55LGg9Y0MoQSxkKSxpPWNDKEIsZCksaj1wYXJzZUZsb2F0KGsubGVmdCkrZixsPXBhcnNlRmxvYXQoay50b3ApK2csbT1oLUMsbj1pLUU7Yko9ai9iSSxiSz1sL2JJLGJMPW0vYkksYk09bi9iSSxhLnoyNzMoITEpLGJPPTAsYk49d2luZG93LnNldFRpbWVvdXQoZGEsYkgpfSx0aGlzLnoyOTNBbGxTdG9wPWZ1bmN0aW9uKGIpe2RjKCksZGQoKSxifHxhLnoyNzQoKX0sdGhpcy56MjQ1PWZ1bmN0aW9uKGEpe3ZhciBiPWRlKGEpO2ImJihjWSgpLGN2KCkpfSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7YS56MjkzVG9WaWV3KFouaW5pdGlhbFgsWi5pbml0aWFsWSxaLmluaXRpYWxaKX0sdGhpcy50b2dnbGVGdWxsUGFnZVZpZXdFeHRlcm5hbD1mdW5jdGlvbigpe2JZPSEwLGEudG9nZ2xlRnVsbFBhZ2VWaWV3KCl9LHRoaXMudG9nZ2xlRnVsbFBhZ2VWaWV3PWZ1bmN0aW9uKGIpe2EuejI5M0FsbFN0b3AoKSxaLmZ1bGxQYWdlPWI/YjohWi5mdWxsUGFnZTt2YXIgYz1kb2N1bWVudC5ib2R5LGQ9Yy5zdHlsZSxlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxmPVouVmlld2VyRGlzcGxheS5zdHlsZSxnPW51bGwsaD1udWxsO2lmKFouZnVsbFBhZ2Upe2JRPWQud2lkdGgsYlI9ZC5oZWlnaHQsYlM9ZC5vdmVyZmxvdyxiVD1lLm92ZXJmbG93LGJVPWYuYmFja2dyb3VuZENvbG9yLGJWPWYucG9zaXRpb24sYlc9Zi56SW5kZXg7dmFyIGk7Wi5tb2JpbGVEZXZpY2U/KGk9Wi5VdGlscy56MjAxaW5kb3dTaXplKCksZC53aWR0aD1pLngsZC5oZWlnaHQ9aS55KTooZC53aWR0aD0iMTAwJSIsZC5oZWlnaHQ9IjEwMCUiKSxkLm92ZXJmbG93PSJoaWRkZW4iLGUub3ZlcmZsb3c9ImhpZGRlbiIsZi5iYWNrZ3JvdW5kQ29sb3I9Wi5VdGlscy56MTg1KCJ6MjIiKSxmLnBvc2l0aW9uPSJmaXhlZCIsZi56SW5kZXg9Ijk5OTk5OTk5IixpPVouVXRpbHMuejIwMWluZG93U2l6ZSgpLGc9aS54LGg9aS55fWVsc2V7ZC53aWR0aD1iUSxkLmhlaWdodD1iUixkLm92ZXJmbG93PWJTLGUub3ZlcmZsb3c9YlQsZi5iYWNrZ3JvdW5kQ29sb3I9YlUsZi5wb3NpdGlvbj0icmVsYXRpdmUiLGYuekluZGV4PWJXO3ZhciBqPVouVXRpbHMuejE3NihaLnBhZ2VDb250YWluZXIpO2c9cGFyc2VGbG9hdChqLndpZHRoKSxoPXBhcnNlRmxvYXQoai5oZWlnaHQpLGlzTmFOKGcpJiYoZz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKGgpJiYoaD1aLlZpZXdlckRpc3BsYXkuY2xpZW50SGVpZ2h0KSxiWT0hMX1aLnZpZXdlclc9ZyxaLnZpZXdlckg9aCxjaChnLGgpLGRmKGJZKTtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXtaLnRvb2xiYXJDdXJyZW50Vz1aLnRvb2xiYXJXPT0tMT9nOloudG9vbGJhclc7dmFyIGw9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILVoudG9vbGJhckg6MDtaLlRvb2xiYXIuc2V0U2l6ZUFuZFBvc2l0aW9uKFoudG9vbGJhckN1cnJlbnRXLG51bGwsbnVsbCxsKX1aLk5hdmlnYXRvckRpc3BsYXkmJlouTmF2aWdhdG9yLnoxODAoKSYmWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKFoubmF2aWdhdG9yVyxaLm5hdmlnYXRvckgsWi5uYXZpZ2F0b3JMLTEsWi5uYXZpZ2F0b3JULTEpLGNqKCksWi5pbWFnZVo9Y1YoWi5pbWFnZVopO2lmKFouY29uc3RyYWluUGFuKXt2YXIgbT1wYXJzZUZsb2F0KGsubGVmdCksbj1wYXJzZUZsb2F0KGsudG9wKSxvPWNVKG0sbik7ay5sZWZ0PW8ueCsicHgiLGsudG9wPW8ueSsicHgifWEuejI3NCghMCl9LHRoaXMuejI3MT1mdW5jdGlvbigpe3ZhciBhPVouVmlld2VyRGlzcGxheS5maXJzdENoaWxkLmNoaWxkTm9kZXNbMF0uc3R5bGU7YS5kaXNwbGF5PWEuZGlzcGxheT09Im5vbmUiPyJpbmxpbmUtYmxvY2siOiJub25lIn0sdGhpcy56MjcyPWZ1bmN0aW9uKCl7dmFyIGE9Wi5WaWV3ZXJEaXNwbGF5LmZpcnN0Q2hpbGQuY2hpbGROb2Rlc1sxXS5zdHlsZTthLmRpc3BsYXk9YS5kaXNwbGF5PT0ibm9uZSI/ImlubGluZS1ibG9jayI6Im5vbmUifSx0aGlzLnoyNzM9ZnVuY3Rpb24oYSl7aWYodil7dmFyIGI9YT9hOnYuZGlzcGxheSE9ImlubGluZS1ibG9jayI7di5kaXNwbGF5PWI/ImlubGluZS1ibG9jayI6Im5vbmUifX0sdGhpcy50b2dnbGVDb25zdHJhaW5QYW49ZnVuY3Rpb24oKXtaLmNvbnN0cmFpblBhbj0hWi5jb25zdHJhaW5QYW47aWYoWi5jb25zdHJhaW5QYW4pe3ZhciBiPXBhcnNlRmxvYXQoci5sZWZ0KSxjPXBhcnNlRmxvYXQoci50b3ApLGQ9Y1UoYixjKTtrLmxlZnQ9ZC54KyJweCIsay50b3A9ZC55KyJweCIsYS56Mjc0KCl9fSx0aGlzLnoxNzM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoInoxMFRJRVJTS0lQVEhSRVNIT0xEIikpLGY9Y0QoYi54LGIueSksZz1jRShmLngsZi55KSxoPWNCKGMsZCk7cmV0dXJuIGEuYWx0S2V5PyhkPjErZT9oPWNCKGMsMSk6Yz4wJiYoaD1jQihjLTEsMSkpLGgtWi5maXRaPGUmJihoPVouZml0WikpOmQ8MS1lP2g9Y0IoYywxKTpjPHotMSYmKGg9Y0IoYysxLDEpKSxuZXcgWi5VdGlscy5Qb2ludDNEKGcueCxnLnksaCl9LHRoaXMuejI2Nz1mdW5jdGlvbihhLGIpe3ZhciBjPS0oYS1aLmltYWdlWCksZD0tKGItWi5pbWFnZVkpLGU9YypaLmltYWdlWixmPWQqWi5pbWFnZVosZz1lK2JmLGg9ZitiaCxpPWNVKGcsaCk7ay5sZWZ0PWkueCsicHgiLGsudG9wPWkueSsicHgifSx0aGlzLnoxNDE9ZnVuY3Rpb24oYSl7aWYoIWEpdmFyIGE9bmV3IFouVXRpbHMuUG9pbnQocGFyc2VGbG9hdChrLmxlZnQpLHBhcnNlRmxvYXQoay50b3ApKTt2YXIgYj1hLngtYmYsYz1hLnktYmgsZD1iL1ouaW1hZ2VaLGU9Yy9aLmltYWdlWixmPVouaW1hZ2VYLWQsZz1aLmltYWdlWS1lO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChmLGcpfX0sWi56MTI0PWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHUoKXt3aW5kb3cuY2xlYXJJbnRlcnZhbChxKSxxPW51bGw7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2dyZXNzVGV4dEJveCIpLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7YSYmKGEubm9kZVZhbHVlPSIiKX1mdW5jdGlvbiB2KCl7cmV0dXJuIGN9ZnVuY3Rpb24gdyhhKXtjPWF9ZnVuY3Rpb24geChhLGIsYyxkKXthfHwoYT1aLnRvb2xiYXJWaXNpYmxlPjA/Wi50b29sYmFyQ3VycmVudFc6MCksYnx8KGI9Wi50b29sYmFyVmlzaWJsZT4wP2Y6MCksY3x8KGM9MCksZHx8KGQ9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MCk7dmFyIGU9Wi5Ub29sYmFyRGlzcGxheS5zdHlsZTtlLndpZHRoPWErInB4IixlLmhlaWdodD1iKyJweCIsZS5sZWZ0PWMrInB4IixlLnRvcD1kKyJweCIseShhLGIpfWZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1hLGQ9YixlPXRvb2xiYXJTa2luU2l6ZXNbMl0sZj10b29sYmFyU2tpblNpemVzWzNdLGc9dG9vbGJhclNraW5TaXplc1s0XSxoPXRvb2xiYXJTa2luU2l6ZXNbNV0saT10b29sYmFyU2tpblNpemVzWzZdLGo9dG9vbGJhclNraW5TaXplc1s3XSxrPXRvb2xiYXJTa2luU2l6ZXNbOF0sbD10b29sYmFyU2tpblNpemVzWzldLG09dG9vbGJhclNraW5TaXplc1sxMF0sbj10b29sYmFyU2tpblNpemVzWzExXSxvPXRvb2xiYXJTa2luU2l6ZXNbMTJdLHA9dG9vbGJhclNraW5TaXplc1sxM10scT10b29sYmFyU2tpblNpemVzWzE0XSx1PXRvb2xiYXJTa2luU2l6ZXNbMTVdLHY9MCx3PShkLWYpLzIrMSx4PShkLWgpLzIseT0oZC1qKS8yLHo9eSoxLjMsQT15KzQsQj15KzIsQz1aLmxvZ29WaXNpYmxlPT0xPzA6ay8yLEQ9Wi5sb2dvVmlzaWJsZT09MT8wOmsvMixFPWstKGktZyksRj1aLmZ1bGxQYWdlVmlzaWJsZT84OjcsRz0yMCxIPUYqaysyKkU7Wi5zbGlkZXJWaXNpYmxlJiYoSCs9cCkscj1zPXQ9ITE7dmFyIEk9Wi5sb2dvVmlzaWJsZT09MT9lKzI6MCxKPVoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTE/azowLEs9SStKLEw9SytHK0grRytxO0w+YyYmKHI9ITAsTC1wPmMmJihzPSEwLEwtcC1xPmMmJih0PSEwLEs9MCkscT0wKSxILT1wKTt2YXIgTT1LKyhjLXEtSy1IKS8yLE49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJhY2tncm91bmQiKTtOLnN0eWxlLndpZHRoPWMrInB4IixOLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9Yys0MDArInB4IixOLnN0eWxlLmhlaWdodD1kKyJweCIsTi5maXJzdENoaWxkLnN0eWxlLmhlaWdodD1kKyJweCI7dmFyIE89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkNvbnRhaW5lciIpO08uc3R5bGUud2lkdGg9SCtHKjIrInB4IixPLnN0eWxlLmhlaWdodD1kKyJweCIsTy5zdHlsZS5sZWZ0PU0tRysicHgiO3ZhciBQPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25CYWNrZ3JvdW5kIik7Wi5VdGlscy56MjAzKFAscGFyc2VGbG9hdChPLnN0eWxlLndpZHRoKSxwYXJzZUZsb2F0KE8uc3R5bGUuaGVpZ2h0KSksUC5zdHlsZS5sZWZ0PSIwcHgiO3ZhciBRPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b29sYmFyTG9nbyIpO2lmKFEpe3ZhciBSPVEuc3R5bGU7aWYoUilpZighdCl7Ui5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejIwMyhRLGUsZiksUi5sZWZ0PXYrInB4IixSLnRvcD13KyJweCIsdis9ZSsyO3ZhciBTPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2dvRGl2aWRlciIpO2lmKFMpe1ouVXRpbHMuejIwMyhTLGcsaCk7dmFyIFQ9Uy5zdHlsZTtULmxlZnQ9disicHgiLFQudG9wPXgrInB4In19ZWxzZSBSLmRpc3BsYXk9Im5vbmUifWlmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTEpe3ZhciBVPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25NaW5pbWl6ZSIpLFY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkV4cGFuZCIpO2lmKFUmJlYpe3ZhciBXPVUuc3R5bGUsWD1WLnN0eWxlO1cmJlgmJih0PyhXLmRpc3BsYXk9Im5vbmUiLFguZGlzcGxheT0ibm9uZSIpOihXLmRpc3BsYXk9ImlubGluZS1ibG9jayIsWC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejEzOChVLGksaiksWi5VdGlscy56MTM4KFYsaSxqKSxXLmxlZnQ9ditDKyJweCIsVy50b3A9eisicHgiLFgubGVmdD12K0QrInB4IixYLnRvcD16KyJweCIpKX19dj1HO3ZhciBZPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25ab29tT3V0Iik7Wi5VdGlscy56MTM4KFksaSxqKTt2YXIgJD1ZLnN0eWxlOyQubGVmdD12KyJweCIsJC50b3A9eSsicHgiLHYrPWs7dmFyIF89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRyYWNrU2xpZGVyIiksYmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblNsaWRlciIpO2lmKF8mJmJhKXt2YXIgYmI9Xy5zdHlsZSxiYz1iYS5zdHlsZTtiYiYmYmMmJihyPyhiYi5kaXNwbGF5PSJub25lIixiYy5kaXNwbGF5PSJub25lIik6KGJiLmRpc3BsYXk9ImlubGluZS1ibG9jayIsYmMuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnoyMDMoXyxuLG8pLGJiLmxlZnQ9di0yKyJweCIsYmIudG9wPUErInB4IixaLlV0aWxzLnoxMzgoYmEsbCxtKSxiYy5sZWZ0PXBhcnNlRmxvYXQoYmIubGVmdCkrInB4IixiYy50b3A9QisicHgiLHYrPXApKX12YXIgYmQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblpvb21JbiIpO1ouVXRpbHMuejEzOChiZCxpLGopO3ZhciBiZT1iZC5zdHlsZTtiZS5sZWZ0PXYrInB4IixiZS50b3A9eSsicHgiLHYrPWsrMTt2YXIgYmY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBhbkRpdmlkZXIiKTtaLlV0aWxzLnoyMDMoYmYsZyxoKTt2YXIgYmc9YmYuc3R5bGU7YmcubGVmdD12KyJweCIsYmcudG9wPXgrInB4Iix2Kz1FO3ZhciBiaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uUGFuTGVmdCIpO1ouVXRpbHMuejEzOChiaCxpLGopO3ZhciBiaT1iaC5zdHlsZTtiaS5sZWZ0PXYrInB4IixiaS50b3A9eSsicHgiLHYrPWs7dmFyIGJqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5VcCIpO1ouVXRpbHMuejEzOChiaixpLGopO3ZhciBiaz1iai5zdHlsZTtiay5sZWZ0PXYrInB4Iixiay50b3A9eSsicHgiLHYrPWs7dmFyIGJsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5Eb3duIik7Wi5VdGlscy56MTM4KGJsLGksaik7dmFyIGJtPWJsLnN0eWxlO2JtLmxlZnQ9disicHgiLGJtLnRvcD15KyJweCIsdis9azt2YXIgYm49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblBhblJpZ2h0Iik7Wi5VdGlscy56MTM4KGJuLGksaik7dmFyIGJvPWJuLnN0eWxlO2JvLmxlZnQ9disicHgiLGJvLnRvcD15KyJweCIsdis9azt2YXIgYnA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblJlc2V0Iik7Wi5VdGlscy56MTM4KGJwLGksaik7dmFyIGJxPWJwLnN0eWxlO2JxLmxlZnQ9disicHgiLGJxLnRvcD15KyJweCIsdis9aysxO3ZhciBicj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZnVsbFBhZ2VEaXZpZGVyIik7aWYoYnIpe1ouVXRpbHMuejIwMyhicixnLGgpO3ZhciBicz1ici5zdHlsZTticy5sZWZ0PXYrInB4Iixicy50b3A9eCsicHgiLHYrPUU7dmFyIGJ0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25GdWxsUGFnZSIpO1ouVXRpbHMuejEzOChidCxpLGopO3ZhciBidT1idC5zdHlsZTtidS5sZWZ0PXYrInB4IixidS50b3A9eSsicHgifXZhciBidj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94Iik7aWYoYnYpe3ZhciBidz1idi5zdHlsZTtidyYmKHM/YncuZGlzcGxheT0ibm9uZSI6KGJ3LmRpc3BsYXk9ImlubGluZS1ibG9jayIsYncud2lkdGg9cSsicHgiLGJ3LmhlaWdodD11KyJweCIsYncubGVmdD1jLXBhcnNlRmxvYXQoTy5zdHlsZS5sZWZ0KS1wYXJzZUZsb2F0KGJ3LndpZHRoKSsicHgiLGJ3LnRvcD0oZC1wYXJzZUZsb2F0KGJ3LmhlaWdodCkpLzIrInB4IikpfX1mdW5jdGlvbiB6KGEpe1oudG9vbGJhclZpc2libGU8NCYmIVoubW9iaWxlRGV2aWNlP0EoYSk6QighYSl9ZnVuY3Rpb24gQShhKXtnJiYoYT9nLmRpc3BsYXk9ImlubGluZS1ibG9jayI6Zy5kaXNwbGF5PSJub25lIil9ZnVuY3Rpb24gQihhKXtpZihnKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQ29udGFpbmVyIiksYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYmFja2dyb3VuZCIpLGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbk1pbmltaXplIiksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhwYW5kIiksZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9nb0RpdmlkZXIiKSxoPTA7dHx8KGg9cGFyc2VGbG9hdChlLnN0eWxlLmxlZnQpK3BhcnNlRmxvYXQoZS5zdHlsZS53aWR0aCkrNCk7dmFyIGk9Wi50b29sYmFyQ3VycmVudFc7YT8oYi5zdHlsZS5kaXNwbGF5PSJub25lIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSxnLndpZHRoPWgrInB4IixjLnN0eWxlLndpZHRoPWgrInB4Iik6KGIuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIiksZC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGcud2lkdGg9aSsicHgiLGMuc3R5bGUud2lkdGg9aSsicHgiKX19ZnVuY3Rpb24gQyhhKXtpZihaLnNsaWRlclZpc2libGUpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmspe3ZhciBiPVoubWF4Wi1aLm1pblosYz0oYS1aLm1pblopL2I7dHJhY2tMPXBhcnNlRmxvYXQoaS5sZWZ0KSx0cmFja1I9cGFyc2VGbG9hdChpLmxlZnQpK3BhcnNlRmxvYXQoaS53aWR0aCktcGFyc2VGbG9hdChrLndpZHRoKTt2YXIgZD10cmFja1ItdHJhY2tMLGU9YypkK3RyYWNrTDtrLmxlZnQ9ZSsicHgifX19ZnVuY3Rpb24gRChiKXtofHwoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidHJhY2tTbGlkZXIiKSksaXx8KGk9aC5zdHlsZSk7aWYoaCYmaSl7dmFyIGMsZD1aLlV0aWxzLnoxNzQoaCk7Wi5tb2JpbGVEZXZpY2U/Yz1aLlV0aWxzLnoxODEoYikueC1kLng6Yz1iLmNsaWVudFgtZC54O3ZhciBlPUgoYywwLHBhcnNlRmxvYXQoaS53aWR0aCkpO2U8Wi5taW5aKy4xJiYoZT1aLm1pblopLGU+Wi5tYXhaLS4xJiYoZT1aLm1heFopLGEuejI0NShlKSxhLnoyNzQoKX19ZnVuY3Rpb24gRShhKXtuPSEwLGp8fChqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25TbGlkZXIiKSk7aWYoail7dmFyIGI9Wi5VdGlscy56MTgxKGEpO2oubW91c2VYUHJpb3I9Yi54LGoubW91c2VZUHJpb3I9Yi55fX1mdW5jdGlvbiBGKGIpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmomJmspe3RyYWNrTD1wYXJzZUZsb2F0KGkubGVmdCksdHJhY2tSPXBhcnNlRmxvYXQoaS5sZWZ0KStwYXJzZUZsb2F0KGkud2lkdGgpLXBhcnNlRmxvYXQoay53aWR0aCk7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpKyhwLngtai5tb3VzZVhQcmlvcik7Yzx0cmFja0w/Yz10cmFja0w6Yz50cmFja1I/Yz10cmFja1I6ai5tb3VzZVhQcmlvcj1wLngsay5sZWZ0PWMrInB4Ijt2YXIgZD1IKGMsdHJhY2tMLHRyYWNrUik7YS56MjQ1KGQpfX1mdW5jdGlvbiBHKCl7bj0hMSxhLnoyNzQoKX1mdW5jdGlvbiBIKGEsYixjKXt2YXIgZD1jLWIsZT0oYS1iKS9kLGY9Wi5tYXhaLVoubWluWixnPVoubWluWitmKmU7cmV0dXJuIGd9ZnVuY3Rpb24gSShhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpLGI9Wi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpO2lmKCFuJiZiKXt2YXIgYz1iLnBhcmVudE5vZGU7SyhjKX19ZnVuY3Rpb24gSihhKXtaLm1vYmlsZURldmljZSYmYS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBhPVouVXRpbHMuZXZlbnQoYSksYj1aLlV0aWxzLnRhcmdldChhKSxjPVouVXRpbHMucmVsYXRlZFRhcmdldChhKTtpZihiKXt2YXIgZD1iLnBhcmVudE5vZGU7ZCYmKHRhcmdldFBhcmVudElEPWQuaWQpfWlmKGMpe3ZhciBlPWMucGFyZW50Tm9kZTtlJiYocmVsYXRlZFRhcmdldFBhcmVudElEPWUuaWQpfWlmKCFufHxhLnR5cGU9PSJtb3VzZXVwInx8YS50eXBlPT0idG91Y2hlbmQifHxhLnR5cGU9PSJ0b3VjaGNhbmNlbCIpTigpLGImJiFaLlV0aWxzLmlzUmlnaHRNb3VzZUJ1dHRvbihhKSYmKHRhcmdldFBhcmVudElEJiZ0YXJnZXRQYXJlbnRJRCE9InRyYWNrU2xpZGVyIiYmYS50eXBlIT0ibW91c2Vtb3ZlIiYmKE8oYSksUChhKSksUShhKSl9ZnVuY3Rpb24gSyhiKXthJiZhLnoyOTNBbGxTdG9wKCksYi5pZCYmYi5pZC5pbmRleE9mKCJidXR0b24iKSE9LTE/KEwoYiksTShiKSk6Yi5pZCYmYi5pZC5pbmRleE9mKCJiYWNrZ3JvdW5kIikhPS0xJiZOKCl9ZnVuY3Rpb24gTChhKXtaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGEsIm1vdXNlb3V0IixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoYSwibW91c2VvdmVyIixKKX1mdW5jdGlvbiBNKGEpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ1VwSUQpLGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5faW1nT3ZlcklEKSxkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ0Rvd25JRCk7YiYmKGIuc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSIpLGMmJihjLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpLGQmJihkLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpfWZ1bmN0aW9uIE4oKXt2YXIgYT1aLlRvb2xiYXJEaXNwbGF5LmNoaWxkTm9kZXMsYj1udWxsO2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyl7Yj1hW2NdO2lmKGIuaWQmJmIuaWQuaW5kZXhPZigiYnV0dG9uIikhPS0xKWlmKGIuaWQhPSJidXR0b25Db250YWluZXIiKUwoYiksTShiKTtlbHNle3ZhciBlPWIuY2hpbGROb2RlcyxmPW51bGw7Zm9yKHZhciBnPTAsaD1lLmxlbmd0aDtnPGg7ZysrKWY9ZVtnXSxmLmlkJiZmLmlkLmluZGV4T2YoImJ1dHRvbiIpIT0tMSYmKEwoZiksTShmKSl9fX1mdW5jdGlvbiBPKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPWIucGFyZW50Tm9kZTtjJiYoWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaHN0YXJ0IixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywidG91Y2hlbmQiLEopLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaGNhbmNlbCIsSikpOihaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2VvdmVyIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGMsIm1vdXNlb3V0IixKKSkpfX1mdW5jdGlvbiBQKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPVouVXRpbHMudGFyZ2V0KGEpLnBhcmVudE5vZGU7aWYoYylpZighYy5faW1nVXBJRClLKGMpO2Vsc2V7dmFyIGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nVXBJRCksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChjLl9pbWdPdmVySUQpLGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nRG93bklEKTtpZihkJiZlJiZmKXt2YXIgZz1kLnN0eWxlLGg9ZS5zdHlsZSxpPWYuc3R5bGU7Zy52aXNpYmlsaXR5PSJoaWRkZW4iLGgudmlzaWJpbGl0eT0iaGlkZGVuIixpLnZpc2liaWxpdHk9ImhpZGRlbiI7c3dpdGNoKGEudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOmgudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZWRvd24iOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZW1vdmUiOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZXVwIjpoLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UibW91c2VvdXQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaHN0YXJ0IjppLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UidG91Y2hlbmQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Zy52aXNpYmlsaXR5PSJ2aXNpYmxlIn19fX19ZnVuY3Rpb24gUShjKXt2YXIgZD1aLlV0aWxzLnRhcmdldChjKS5wYXJlbnROb2RlO2lmKGQpe3ZhciBlPWQuaWQ7c3dpdGNoKGMudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZWRvd24iLEopO2JyZWFrO2Nhc2UibW91c2Vkb3duIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwibW91c2V1cCIsSik7aWYoYSlzd2l0Y2goZSl7Y2FzZSJidXR0b25NaW5pbWl6ZSI6Yi56MjE1KCEwKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKTticmVhaztjYXNlImJ1dHRvbkV4cGFuZCI6Yi56MjE1KCExKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKTticmVhaztjYXNlImJ1dHRvblpvb21PdXQiOmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSJidXR0b25TbGlkZXIiOkUoYyksUihjKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsUiksb3x8KG89d2luZG93LnNldEludGVydmFsKEYsbSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSik7YnJlYWs7Y2FzZSJ0cmFja1NsaWRlciI6RChjKTticmVhaztjYXNlImJ1dHRvblpvb21JbiI6YS56b29tKCJpbiIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuTGVmdCI6YS5wYW4oImxlZnQiKTticmVhaztjYXNlImJ1dHRvblBhblVwIjphLnBhbigidXAiKTticmVhaztjYXNlImJ1dHRvblBhbkRvd24iOmEucGFuKCJkb3duIik7YnJlYWs7Y2FzZSJidXR0b25QYW5SaWdodCI6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSJidXR0b25SZXNldCI6YS5yZXNldCgpfWJyZWFrO2Nhc2UibW91c2V1cCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsIm1vdXNlZG93biIsSiksYSYmKGU9PSJidXR0b25TbGlkZXIifHxuPyhvJiYod2luZG93LmNsZWFySW50ZXJ2YWwobyksbz1udWxsKSxHKCksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLFIpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSiksTigpKTplPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpO2JyZWFrO2Nhc2UibW91c2VvdXQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZW92ZXIiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTooZT09ImJ1dHRvblBhblVwInx8ZT09ImJ1dHRvblBhbkRvd24iKSYmYS5wYW4oInZlcnRpY2FsU3RvcCIpKTticmVhaztjYXNlInRvdWNoc3RhcnQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJ0b3VjaGVuZCIsSiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoY2FuY2VsIixKKTtpZihhKXN3aXRjaChlKXtjYXNlImJ1dHRvbk1pbmltaXplIjpiLnoyMTUoITApLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2JyZWFrO2Nhc2UiYnV0dG9uRXhwYW5kIjpiLnoyMTUoITEpLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApO2JyZWFrO2Nhc2UiYnV0dG9uWm9vbU91dCI6YS56b29tKCJvdXQiKTticmVhaztjYXNlImJ1dHRvblNsaWRlciI6RShjKSxTKGMpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSxvfHwobz13aW5kb3cuc2V0SW50ZXJ2YWwoRixtKSksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoZW5kIixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hjYW5jZWwiLEopO2JyZWFrO2Nhc2UidHJhY2tTbGlkZXIiOkQoYyk7YnJlYWs7Y2FzZSJidXR0b25ab29tSW4iOmEuem9vbSgiaW4iKTticmVhaztjYXNlImJ1dHRvblBhbkxlZnQiOmEucGFuKCJsZWZ0Iik7YnJlYWs7Y2FzZSJidXR0b25QYW5VcCI6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSJidXR0b25QYW5Eb3duIjphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuUmlnaHQiOmEucGFuKCJyaWdodCIpO2JyZWFrO2Nhc2UiYnV0dG9uUmVzZXQiOmEucmVzZXQoKX1icmVhaztjYXNlInRvdWNoZW5kIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hzdGFydCIsSiksYSYmKGU9PSJidXR0b25ab29tT3V0Inx8ZT09ImJ1dHRvblpvb21JbiI/KGEuem9vbSgic3RvcCIpLFouZGVidWcmJmU9PSJidXR0b25ab29tT3V0IiYmYy5hbHRLZXkmJlouVXRpbHMuejI1MygpKTplPT0iYnV0dG9uU2xpZGVyIj8obyYmKHdpbmRvdy5jbGVhckludGVydmFsKG8pLG89bnVsbCksRygpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSk6ZT09ImJ1dHRvblBhbkxlZnQifHxlPT0iYnV0dG9uUGFuUmlnaHQiP2EucGFuKCJob3Jpem9udGFsU3RvcCIpOmU9PSJidXR0b25QYW5VcCJ8fGU9PSJidXR0b25QYW5Eb3duIj9hLnBhbigidmVydGljYWxTdG9wIik6ZT09ImJ1dHRvbkZ1bGxQYWdlIiYmYS50b2dnbGVGdWxsUGFnZVZpZXcoKSk7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoc3RhcnQiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iPyhhLnpvb20oInN0b3AiKSxaLmRlYnVnJiZlPT0iYnV0dG9uWm9vbU91dCImJmMuYWx0S2V5JiZaLlV0aWxzLnoyNTMoKSk6ZT09ImJ1dHRvblNsaWRlciI/KG8mJih3aW5kb3cuY2xlYXJJbnRlcnZhbChvKSxvPW51bGwpLEcoKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsInRvdWNobW92ZSIsUykpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpfX19ZnVuY3Rpb24gUihhKXtwPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpfWZ1bmN0aW9uIFMoYSl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0O3A9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKX19dmFyIGI9dGhpcyxjPSExLGQ9bmV3IFouejEwMTtaLnNraW5QYXRoPVouVXRpbHMuejI0MyhaLnNraW5QYXRoKTt2YXIgZT1aLnNraW5QYXRoKyIvIjtkLmxvYWRYTUwoWi5za2luUGF0aCsiLyIrWi5VdGlscy56MTg1KCJ6NTUiKSk7dmFyIGYsZyxoLGksaixrLGw9W10sbT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1NyIpLDEwKSxuPSExLG89bnVsbCxwPW51bGwscT1udWxsLHIscyx0O3RoaXMuejIwNT1mdW5jdGlvbihhLGIpe1ouVG9vbGJhckRpc3BsYXk9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUb29sYmFyRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIiwiMXB4IiwiMXB4IiwiMHB4IiwiMXB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJkZWZhdWx0IiksZz1aLlRvb2xiYXJEaXNwbGF5LnN0eWxlO3ZhciBjPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChjLmVsbXQpLHRvb2xiYXJTa2luU2l6ZXM9YTtpZihaLmxvZ29WaXNpYmxlKXt2YXIgZDtpZighWi5VdGlscy5pc1N0clZhbChaLmxvZ29DdXN0b21QYXRoKSlkPW5ldyBaLlV0aWxzLkdyYXBoaWMoInRvb2xiYXJMb2dvIixlLGJbMV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO2Vsc2V7dmFyIGg9Wi5VdGlscy56MTQwKFoubG9nb0N1c3RvbVBhdGgpO2Q9bmV3IFouVXRpbHMuR3JhcGhpYygidG9vbGJhckxvZ28iLGgsbnVsbCwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iil9Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChkLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGU9PTB8fFoudG9vbGJhclZpc2libGU9PTEpe3ZhciBpPW5ldyBaLlV0aWxzLkdyYXBoaWMoImxvZ29EaXZpZGVyIixlLGJbMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQoaS5lbG10KX19dmFyIGo9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJidXR0b25Db250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIsImRlZmF1bHQiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKGopLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihqLCJ0b3VjaHN0YXJ0IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlb3ZlciIsSSkpO3ZhciBrPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJ1dHRvbkJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChrLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTF8fFoubW9iaWxlRGV2aWNlKXt2YXIgbD1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbk1pbmltaXplIixudWxsLGUsYlszXSxiWzRdLGJbNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwNyIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQobC5lbG10KTt2YXIgbT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4cGFuZCIsbnVsbCxlLGJbNl0sYls3XSxiWzhdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDUiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKG0uZWxtdCl9dmFyIG49bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25ab29tT3V0IixudWxsLGUsYls5XSxiWzEwXSxiWzExXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4IiwibW91c2VvdmVyIixKLCJ6MTIwIik7ai5hcHBlbmRDaGlsZChuLmVsbXQpO2lmKFouc2xpZGVyVmlzaWJsZSl7dmFyIG89bmV3IFouVXRpbHMuR3JhcGhpYygidHJhY2tTbGlkZXIiLGUsYlsxMl0sIjFweCIsIjFweCIsIjBweCIsIjBweCIpO2ouYXBwZW5kQ2hpbGQoby5lbG10KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoby5lbG10LCJtb3VzZWRvd24iLEopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLmVsbXQsInRvdWNoc3RhcnQiLEopO3ZhciBwPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uU2xpZGVyIixudWxsLGUsYlsxNF0sYlsxNV0sYlsxNl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExNCIpO2ouYXBwZW5kQ2hpbGQocC5lbG10KX12YXIgcT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblpvb21JbiIsbnVsbCxlLGJbMTddLGJbMThdLGJbMTldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTkiKTtqLmFwcGVuZENoaWxkKHEuZWxtdCk7dmFyIHI9bmV3IFouVXRpbHMuR3JhcGhpYygicGFuRGl2aWRlciIsZSxiWzIwXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iik7ai5hcHBlbmRDaGlsZChyLmVsbXQpO3ZhciBzPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uUGFuTGVmdCIsbnVsbCxlLGJbMjFdLGJbMjJdLGJbMjNdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDkiKTtqLmFwcGVuZENoaWxkKHMuZWxtdCk7dmFyIHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5VcCIsbnVsbCxlLGJbMjRdLGJbMjVdLGJbMjZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTEiKTtqLmFwcGVuZENoaWxkKHQuZWxtdCk7dmFyIHU9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5Eb3duIixudWxsLGUsYlsyN10sYlsyOF0sYlsyOV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwOCIpO2ouYXBwZW5kQ2hpbGQodS5lbG10KTt2YXIgdj1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblBhblJpZ2h0IixudWxsLGUsYlszMF0sYlszMV0sYlszMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMCIpO2ouYXBwZW5kQ2hpbGQodi5lbG10KTt2YXIgeT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblJlc2V0IixudWxsLGUsYlszM10sYlszNF0sYlszNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMiIpO2ouYXBwZW5kQ2hpbGQoeS5lbG10KTtpZihaLmZ1bGxQYWdlVmlzaWJsZSl7dmFyIEE9bmV3IFouVXRpbHMuR3JhcGhpYygiZnVsbFBhZ2VEaXZpZGVyIixlLGJbMzZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiKTtqLmFwcGVuZENoaWxkKEEuZWxtdCk7dmFyIEI9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25GdWxsUGFnZSIsbnVsbCxlLGJbMzddLGJbMzhdLGJbMzldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTgiKTtqLmFwcGVuZENoaWxkKEIuZWxtdCl9aWYoWi5wcm9ncmVzc1Zpc2libGUpe3ZhciBEPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwicHJvZ3Jlc3NUZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLEU9dG9vbGJhclNraW5TaXplc1sxNl0rInB4IjtqLmFwcGVuZENoaWxkKEQpO3ZhciBGPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFouVXRpbHMuejE4NSgiejUyIikpO0QuYXBwZW5kQ2hpbGQoWi5VdGlscy5jcmVhdGVDZW50ZXJlZEVsZW1lbnQoRikpLFouVXRpbHMuejI1MShGLCJibGFjayIsInZlcmRhbmEiLEUsIm5vbmUiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCIxZW0iLCJsZWZ0Iiwibm9uZSIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihELCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5kaXNhYmxlVGV4dEludGVyYWN0aW9uKEYpfVouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRvb2xiYXJEaXNwbGF5KSxaLnRvb2xiYXJXPXRvb2xiYXJTa2luU2l6ZXNbMF0sWi50b29sYmFyQ3VycmVudFc9Wi50b29sYmFyVz09LTE/Wi52aWV3ZXJXOloudG9vbGJhclcsWi50b29sYmFySD1mPXRvb2xiYXJTa2luU2l6ZXNbMV07dmFyIEc9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MDt4KFoudG9vbGJhckN1cnJlbnRXLFoudG9vbGJhckgsMCxHKTtpZihaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSl7dmFyIEg9Wi5WaWV3cG9ydC56MTg5QXNab29tKCk7QyhIKX16KFoudG9vbGJhclZpc2libGU9PTF8fFoudG9vbGJhclZpc2libGU9PTJ8fFoudG9vbGJhclZpc2libGU9PTQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlRvb2xiYXJEaXNwbGF5LCJtb3VzZW92ZXIiLFouVXRpbHMuc3RvcFByb3BhZ2F0aW9uKSx3KCEwKX0sdGhpcy56MTgwPWZ1bmN0aW9uKCl7cmV0dXJuIHYoKX0sdGhpcy5zZXRTaXplQW5kUG9zaXRpb249ZnVuY3Rpb24oYSxiLGMsZCl7eChhLGIsYyxkKX0sdGhpcy5zaG93PWZ1bmN0aW9uKGEpe3ooYSl9LHRoaXMuc2V0VmlzaWJpbGl0eT1mdW5jdGlvbihhKXtBKGEpfSx0aGlzLnoyMTU9ZnVuY3Rpb24oYSl7QihhKX0sdGhpcy5zaG93UHJvZ3Jlc3M9ZnVuY3Rpb24oYSxiKXtpZihaLnByb2dyZXNzVmlzaWJsZSl7cSYmd2luZG93LmNsZWFySW50ZXJ2YWwocSk7dmFyIGMsZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94IikuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDtkJiYoYT09MHx8Yj09MD8oZC5ub2RlVmFsdWU9ImxsbGxsbGxsbGwiLHE9d2luZG93LnNldEludGVydmFsKHUscGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NTEiKSksMTApKTooYz1NYXRoLnJvdW5kKDEwMC1iL2EqMTAwKSxkLm5vZGVWYWx1ZT0ibCIubXVsdGlwbHkoTWF0aC5yb3VuZChjLzEwKSkpKX19LHRoaXMuejI2Nj1mdW5jdGlvbihhKXtDKGEpfX0sWi56MTIzPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHgoYSl7Wi5OYXZpZ2F0b3JEaXNwbGF5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiTmF2aWdhdG9yRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixlKyJweCIsZisicHgiLGcrInB4IixoKyJweCIsInNvbGlkIiwiMXB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLG89Wi5OYXZpZ2F0b3JEaXNwbGF5LHA9by5zdHlsZTt2YXIgYj1aLlV0aWxzLnoxODUoInozNiIpLGM9Wi5VdGlscy56MTg1KCJ6MzZOT0FMUEhBIiksZD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckJhY2tncm91bmQiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsicHgiLGYrInB4IiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsYiwiMHB4IiwiMHB4Iik7Wi5VdGlscy5zZXRPcGFjaXR5KGQsbCxjKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoZCkscT1kLHI9cS5zdHlsZTt2YXIgaj1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckltYWdlQ29udGFpbmVyIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGUrInB4IixmKyJweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChuKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoaikscz1qLHQ9cy5zdHlsZSx1PW47dmFyIGs9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJuYXZpZ2F0b3JSZWN0YW5nbGUiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsxKyJweCIsZisxKyJweCIsZysicHgiLGgrInB4Iiwic29saWQiLCIxcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ay5zdHlsZS5ib3JkZXJDb2xvcj1aLlV0aWxzLnoxODUoIno0MSIpLFouTmF2aWdhdG9yRGlzcGxheS5hcHBlbmRDaGlsZChrKSx2PWssdz12LnN0eWxlLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLk5hdmlnYXRvckRpc3BsYXkpLEMoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCksWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaHN0YXJ0IixQKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2htb3ZlIixRKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2hlbmQiLFIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaGNhbmNlbCIsUykpOihaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2VvdmVyIixaLlV0aWxzLnN0b3BQcm9wYWdhdGlvbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKG8sIm1vdXNlZG93biIsTSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihuLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLEIoITApLEcoKX1mdW5jdGlvbiB5KGEpe0MoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCl9ZnVuY3Rpb24geigpe2lmKEEoKSl7ZCYmKHdpbmRvdy5jbGVhckludGVydmFsKGQpLGQ9bnVsbCk7aWYoIW98fCFwfHwhcXx8IXJ8fCFzfHwhdHx8IXV8fCF2fHwhdylvPVouTmF2aWdhdG9yRGlzcGxheSxwPW8uc3R5bGUscT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1swXSxyPXEuc3R5bGUscz1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXSx0PXMuc3R5bGUsdT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXS5maXJzdENoaWxkLHY9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMl0sdz12LnN0eWxlfX1mdW5jdGlvbiBBKCl7cmV0dXJuIGN9ZnVuY3Rpb24gQihhKXtjPWF9ZnVuY3Rpb24gQyhhLGIsYyxkLGUpe2F8fChhPVoubmF2aWdhdG9yVyksYnx8KGI9Wi5uYXZpZ2F0b3JIKSxjfHwoYz0wKSxkfHwoZD0wKSxvfHwobz1aLk5hdmlnYXRvckRpc3BsYXkpLHB8fChwPW8uc3R5bGUpLHU9by5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQ7aWYobyYmcCYmdSl7aWYoZSl7dmFyIGY9MSxnPTE7ZT09MD9nPVoudmlld2VyVy9aLnZpZXdlckg6Zz11LndpZHRoL3UuaGVpZ2h0LGY+MT8oYj1hLGIvPWcpOihhPWIsYSo9Zyl9cC53aWR0aD1hKyJweCIscC5oZWlnaHQ9YisicHgiLHAubGVmdD1jLTErInB4IixwLnRvcD1kLTErInB4IixEKGEsYil9fWZ1bmN0aW9uIEQoYSxiKXtyfHwocj1aLk5hdmlnYXRvckRpc3BsYXkuZmlyc3RDaGlsZC5zdHlsZSksdHx8KHQ9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMV0uc3R5bGUpLHV8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpLHImJnQmJnUmJihyLndpZHRoPWErInB4IixyLmhlaWdodD1iKyJweCIsRShhLGIsdS53aWR0aCx1LmhlaWdodCksdC53aWR0aD11LndpZHRoKyJweCIsdC5oZWlnaHQ9dS5oZWlnaHQrInB4Iix0LmxlZnQ9KGEtcGFyc2VGbG9hdCh0LndpZHRoKSkvMisicHgiLHQudG9wPShiLXBhcnNlRmxvYXQodC5oZWlnaHQpKS8yKyJweCIsRygpKX1mdW5jdGlvbiBFKGEsYixjLGQpe3V8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpO2lmKHUpe3ZhciBlPWMvZCxmPWEvYyxnPWIvZCxoPTAsaT0wO2Y8PWc/KGM9YSxkPWEvZSxpPShiLWQqKGEvYykpLzIpOmc8ZiYmKGQ9YixjPWIqZSxoPShhLWMqKGIvZCkpLzIpLHUud2lkdGg9Yyx1LmhlaWdodD1kfX1mdW5jdGlvbiBGKCl7cHx8KHA9Wi5OYXZpZ2F0b3JEaXNwbGF5LnN0eWxlKSxwJiYocC56SW5kZXg9cC56SW5kZXgrMTAwKX1mdW5jdGlvbiBHKCl7aWYoWi5WaWV3cG9ydCYmWi5WaWV3cG9ydC56MTgwKCkpe0koKTt2YXIgYT1aLlZpZXdwb3J0LnoxNDEoKTtKKGEpfX1mdW5jdGlvbiBIKGEpe3B8fChwPVouTmF2aWdhdG9yRGlzcGxheS5zdHlsZSkscCYmKGE/cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnAuZGlzcGxheT0ibm9uZSIpfWZ1bmN0aW9uIEkoKXtpZih1JiZ3KXt2YXIgYT11LndpZHRoL1ouaW1hZ2VXLGI9dS5oZWlnaHQvWi5pbWFnZUgsYz1aLlZpZXdwb3J0LnoxODlBc1pvb20oKSxkPVoudmlld2VyVyphL2MsZT1aLnZpZXdlckgqYi9jO3cud2lkdGg9ZCsicHgiLHcuaGVpZ2h0PWUrInB4In19ZnVuY3Rpb24gSihhKXtpZih1JiZ3JiZ0KXt2YXIgYj11LndpZHRoL1ouaW1hZ2VXLGM9dS5oZWlnaHQvWi5pbWFnZUgsZD1hLngqYixlPWEueSpjLGY9ZC1wYXJzZUZsb2F0KHcud2lkdGgpLzIsZz1lLXBhcnNlRmxvYXQody5oZWlnaHQpLzI7dy5sZWZ0PWYrcGFyc2VGbG9hdCh0LmxlZnQpKyJweCIsdy50b3A9ZytwYXJzZUZsb2F0KHQudG9wKSsicHgifX1mdW5jdGlvbiBLKCl7aWYodyYmdCYmdSl7dmFyIGE9cGFyc2VGbG9hdCh3LmxlZnQpLXBhcnNlRmxvYXQodC5sZWZ0KSxiPXBhcnNlRmxvYXQody50b3ApLXBhcnNlRmxvYXQodC50b3ApLGM9YSsocGFyc2VGbG9hdCh3LndpZHRoKS0xKS8yLGQ9YisocGFyc2VGbG9hdCh3LmhlaWdodCktMSkvMixlPVouaW1hZ2VXL3Uud2lkdGgsZj1aLmltYWdlSC91LmhlaWdodCxnPWMqZSxoPWQqZjtaLlZpZXdwb3J0LnoyNjcoZyxoKX19ZnVuY3Rpb24gTCgpe1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4OCIpKX1mdW5jdGlvbiBNKGEpe2lmKG8mJnYmJncpe3ZhciBhPVouVXRpbHMuZXZlbnQoYSk7di5tb3VzZVhQcmlvcj1hLmNsaWVudFgsdi5tb3VzZVlQcmlvcj1hLmNsaWVudFksemFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChhLmNsaWVudFgsYS5jbGllbnRZKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vtb3ZlIixOKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2V1cCIsTyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIixPKX19ZnVuY3Rpb24gTihhKXtpZih2JiZ3KXt2YXIgYj1wYXJzZUZsb2F0KHcubGVmdCksYz1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWIrKGEuY2xpZW50WC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWMrKGEuY2xpZW50WS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9YS5jbGllbnRYLHYubW91c2VZUHJpb3I9YS5jbGllbnRZLEsoKSwhMX19ZnVuY3Rpb24gTyhhKXtpZihvJiZ2JiZ3KXtkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNlbW92ZSIsTiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNldXAiLE8pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsTyk7dmFyIGE9Wi5VdGlscy5ldmVudChhKSxiPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpLGM9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1iLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWIueSwyKSk7aWYoYzw0KXt2YXIgZD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9YS5jbGllbnRYLWQueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1hLmNsaWVudFktZC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFAoYSl7YS5wcmV2ZW50RGVmYXVsdCgpO2lmKG8mJnYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7emFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChkLngsZC55KSx2Lm1vdXNlWFByaW9yPWQueCx2Lm1vdXNlWVByaW9yPWQueSx6YXB0dkRyYWdQdFN0YXJ0PW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX19ZnVuY3Rpb24gUShhKXthLnByZXZlbnREZWZhdWx0KCk7aWYoIVoubW91c2VQYW4pcmV0dXJuO2lmKHYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSksZT1wYXJzZUZsb2F0KHcubGVmdCksZj1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWUrKGQueC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWYrKGQueS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9ZC54LHYubW91c2VZUHJpb3I9ZC55LEsoKSwhMX19cmV0dXJuITF9ZnVuY3Rpb24gUihhKXtpZihvJiZ2JiZ3KXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYil7dmFyIGM9Yi50YXJnZXQsZD1uZXcgWi5VdGlscy5Qb2ludChiLnBhZ2VYLGIucGFnZVkpLGU9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksZj1NYXRoLnNxcnQoTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC54LWUueCwyKStNYXRoLnBvdyh6YXB0dkRyYWdQdFN0YXJ0LnktZS55LDIpKSxnPVoubW9iaWxlRGV2aWNlPzY6MztpZihmPGcpe3ZhciBoPVouVXRpbHMuejE3NChaLk5hdmlnYXRvckRpc3BsYXkpO3cubGVmdD1kLngtaC54LXBhcnNlRmxvYXQody53aWR0aCkvMisicHgiLHcudG9wPWQueS1oLnktcGFyc2VGbG9hdCh3LmhlaWdodCkvMisicHgifX1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFMoYSl7aWYobyYmdiYmdyl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0LGQ9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKSxlPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpLGY9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1lLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWUueSwyKSksZz1aLm1vYmlsZURldmljZT82OjM7aWYoZjxnKXt2YXIgaD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9ZC54LWgueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1kLnktaC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In19SygpLFouVmlld3BvcnQuejI3NCgpfX12YXIgYj10aGlzLGM9ITEsZCxlPVoubmF2aWdhdG9yVyxmPVoubmF2aWdhdG9ySCxnPVoubmF2aWdhdG9yTC0xLGg9Wi5uYXZpZ2F0b3JULTEsaT1aLm5hdmlnYXRvckZpdCxqLGs9bnVsbCxsPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6MzUiKSksbT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLG49bmV3IEltYWdlO24ub25sb2FkPXgsbi5vbmVycm9yPUwsbi5zcmM9bTt2YXIgbyxwLHEscixzLHQsdSx2LHc7dGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7bT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLHMucmVtb3ZlQ2hpbGQobiksbj1udWxsLG49bmV3IEltYWdlLHMuYXBwZW5kQ2hpbGQobiksbi5vbmxvYWQ9eSxuLm9uZXJyb3I9TCxuLnNyYz1tfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gQSgpfSx0aGlzLnNldFNpemVBbmRQb3NpdGlvbj1mdW5jdGlvbihhLGIsYyxkLGUpe2V8fChlPWkpLEMoYSxiLGMsZCxlKX0sdGhpcy5zZXRWaXNpYmlsaXR5PWZ1bmN0aW9uKGEpe0goYSl9LHRoaXMuejI2OD1mdW5jdGlvbigpe0coKX0sdGhpcy56MjYzUmVjdGFuZ2xlRGltZW5zaW9ucz1mdW5jdGlvbigpe0koKX0sdGhpcy56MjYzUmVjdGFuZ2xlUG9zaXRpb249ZnVuY3Rpb24oYSl7SihhKX0sdGhpcy56Mjc3PWZ1bmN0aW9uKCl7QSgpP3ooKTpkPXdpbmRvdy5zZXRJbnRlcnZhbCh6LDMwMCl9fSxaLnoxMDE9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhhLGIpe3ZhciBjPW51bGwsZD10eXBlb2YgYj09ImZ1bmN0aW9uIjtpZihkKXZhciBlPWIsYj1mdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KFouVXRpbHMuY3JlYXRlQ2FsbGJhY2sobnVsbCxlLGMpLDEpfTtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl7dmFyIGY9WyJNc3htbDIuWE1MSFRUUCIsIk1zeG1sMy5YTUxIVFRQIiwiTWljcm9zb2Z0LlhNTEhUVFAiXTtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl0cnl7Yz1uZXcgQWN0aXZlWE9iamVjdChmW2ddKTticmVha31jYXRjaChoKXtjb250aW51ZX19ZWxzZSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QmJihjPW5ldyBYTUxIdHRwUmVxdWVzdCk7Y3x8Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejk5IikpLGQmJihjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2MucmVhZHlTdGF0ZT09NCYmKGMub25yZWFkeXN0YXRlY2hhbmdlPW5ldyBGdW5jdGlvbixiKCkpfSk7dHJ5e2Mub3BlbigiR0VUIixhLGQpLGMuc2VuZChudWxsKX1jYXRjaChoKXthLmluZGV4T2YoIkltYWdlUHJvcGVydGllcy54bWwiKSE9LTE/Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg3LUlNQUdFWE1MIikpOmEuaW5kZXhPZigic2tpbkZpbGVzLnhtbCIpIT0tMT9aLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODctVE9PTEJBUlhNTCIpKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODciKSksYy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxjPW51bGx9cmV0dXJuIGQ/bnVsbDpjfWZ1bmN0aW9uIGQoYSl7aWYoYSl7aWYoIWEpWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg5IikpO2Vsc2UgaWYoYS5zdGF0dXMhPT0yMDAmJmEuc3RhdHVzIT09MCl7dmFyIGI9YS5zdGF0dXMsYz1iPT00MDQ/Ik5vdCBGb3VuZCI6YS5zdGF0dXNUZXh0O1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MCIpK2IrIiAtICIrYyl9dmFyIGQ9bnVsbDthLnJlc3BvbnNlWE1MJiZhLnJlc3BvbnNlWE1MLmRvY3VtZW50RWxlbWVudD9kPWEucmVzcG9uc2VYTUw6YS5yZXNwb25zZVRleHQmJihkPVouVXRpbHMuejE1OChhLnJlc3BvbnNlVGV4dCkpLGUoZCl9ZWxzZSBaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODQiKSl9ZnVuY3Rpb24gZShhKXtpZihhJiZhLmRvY3VtZW50RWxlbWVudCl7dmFyIGI9YS5kb2N1bWVudEVsZW1lbnQudGFnTmFtZTtiPT0iQ09QWVJJR0hUIj9mKCJjb3B5cmlnaHQiLGEpOmI9PSJJTUFHRV9QUk9QRVJUSUVTIj9mKCJpbWFnZSIsYSk6Yj09IlNLSU5EQVRBIj9mKCJza2luIixhKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6MTAwIikpfWVsc2UgWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejEwMCIpKX1mdW5jdGlvbiBmKGEsYil7aWYoYT09ImNvcHlyaWdodCIpe3ZhciBjPWIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiU1RBVEVNRU5UVEVYVCIpLGQ9Yi5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJERUNMSU5FRFRFWFQiKTtaLlV0aWxzLmlzU3RyVmFsKGMpP1ouVXRpbHMuejI1MighMCxjLGQpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJpbWFnZSIpe3ZhciBlPXBhcnNlSW50KGIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiV0lEVEgiKSwxMCksZj1wYXJzZUludChiLmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIkhFSUdIVCIpLDEwKTshaXNOYU4oZSkmJmU+MCYmIWlzTmFOKGYpJiZmPjA/Wi5WaWV3cG9ydCYmKFouVmlld3BvcnQuejE4MCgpP1ouVmlld3BvcnQucmV6MjA2KGUsZik6Wi5WaWV3cG9ydC56MjA2KGUsZikpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJza2luIil7Wi5za2luTW9kZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOTU9ERSIpLm5vZGVWYWx1ZTt2YXIgZyxoO1ouc2tpbk1vZGU9PTF8fFouc2tpbk1vZGU9PTAmJiFaLm1vYmlsZURldmljZT8oZz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJGT0xERVJTVEFOREFSRCIpLm5vZGVWYWx1ZSxoPSJTSVpFU1NUQU5EQVJEIik6KGc9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiU0VUVVAiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRk9MREVSTEFSR0UiKS5ub2RlVmFsdWUsaD0iU0laRVNMQVJHRSIpO3ZhciBpPVtdO2kucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlRPT0xCQVJXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiVE9PTEJBUkgiKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJMT0dPVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkxPR09IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRElWSURFUlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJESVZJREVSSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiQlVUVE9OU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNMSURFUkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTTElERVJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tIIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTRk9OVFNJWkUiKS5ub2RlVmFsdWUpKTt2YXIgaj1bXSxrPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZJTEVTIilbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNLSU4wIikubm9kZVZhbHVlLGw9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRklMRVMiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0tJTjM5Iikubm9kZVZhbHVlO2lmKFouVXRpbHMuaXNTdHJWYWwoaykmJlouVXRpbHMuaXNTdHJWYWwobCkpe3ZhciBtPSExO2Zvcih2YXIgbj0wO248NDA7bisrKXt2YXIgbz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJGSUxFUyIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOIituKS5ub2RlVmFsdWU7Wi5VdGlscy5pc1N0clZhbChvKT9qW25dPWcrIi8iK286KGpbbl09Im51bGwiLG09ITApfW0mJlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIkVSUk9SX1NLSU5TWE1MTUlTU0lOR05BTUVTIikpLFouVG9vbGJhciYmWi5Ub29sYmFyLnoyMDUoaSxqKX1lbHNlIFouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MSIpKX19ZnVuY3Rpb24gZyhhLGMsZCl7Yi0tO2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXRyeXthKGQpfWNhdGNoKGUpe1ouVXRpbHMuejI1NShlLm5hbWUrWi5VdGlscy56MTg1KCJ6ODMiKStjKyIgIitlLm1lc3NhZ2UpfX1mdW5jdGlvbiBoKGEsYil7ZnVuY3Rpb24gZShlKXtjLm9ubG9hZD1udWxsLGMub25hYm9ydD1udWxsLGMub25lcnJvcj1udWxsLGQmJndpbmRvdy5jbGVhclRpbWVvdXQoZCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtiKGEsZT9jOm51bGwpfSwxKX12YXIgYz1udWxsLGQ9bnVsbDt0aGlzLnN0YXJ0PWZ1bmN0aW9uKCl7Yz1uZXcgSW1hZ2U7dmFyIGI9ZnVuY3Rpb24oKXtlKCEwKX0sZj1mdW5jdGlvbigpe2UoITEpfSxnPWZ1bmN0aW9uKCl7ZSghMSl9O2Mub25sb2FkPWIsYy5vbmFib3J0PWYsYy5vbmVycm9yPWYsZD13aW5kb3cuc2V0VGltZW91dChnLHBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NjAiKSkpLGMuc3JjPWF9fXZhciBiPTA7dGhpcy5sb2FkWE1MPWZ1bmN0aW9uKGEpe2MoYSxkKX0sdGhpcy56MjEySW1hZ2U9ZnVuY3Rpb24oYSxjKXtpZihiPj1wYXJzZUludChaLlV0aWxzLnoxODUoInoyNSIpLDEwKSlyZXR1cm4hMTt2YXIgZD1aLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsZyxjKSxlPW5ldyBoKGEsZCk7cmV0dXJuIGIrKyxlLnN0YXJ0KCksITB9fSxaLlV0aWxzPXt6MTYzOmZ1bmN0aW9uKCl7Wi5wYWdlQ29udGFpbmVySUQ9bnVsbCxaLmltYWdlUGF0aD1udWxsLFouc2tpblBhdGg9bnVsbCxaLnNraW5Nb2RlPW51bGwsWi5wYXJhbWV0ZXJzPW51bGwsWi5icm93c2Vycz1udWxsLFouYnJvd3Nlcj1udWxsLFouYnJvd3NlclZlcnNpb249bnVsbCxaLmNhbnZhc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3JtUHJvcGVydHk9bnVsbCxaLmNzc1RyYW5zZm9ybU5vVW5pdHM9bnVsbCxaLmFscGhhU3VwcG9ydGVkPW51bGwsWi5yZW5kZXJRdWFsaXR5PW51bGwsWi5tb2JpbGVEZXZpY2U9bnVsbCxaLmluaXRpYWxYPW51bGwsWi5pbml0aWFsWT1udWxsLFouaW5pdGlhbFo9bnVsbCxaLm1pblo9bnVsbCxaLm1heFo9bnVsbCxaLnpvb21TcGVlZD1udWxsLFoucGFuU3BlZWQ9bnVsbCxaLmZhZGVJblNwZWVkPW51bGwsWi50b29sYmFyVmlzaWJsZT1udWxsLFoudG9vbGJhclc9bnVsbCxaLnRvb2xiYXJIPW51bGwsWi50b29sYmFyUG9zaXRpb249bnVsbCxaLm5hdmlnYXRvclZpc2libGU9bnVsbCxaLm5hdmlnYXRvclc9bnVsbCxaLm5hdmlnYXRvckg9bnVsbCxaLm5hdmlnYXRvckw9bnVsbCxaLm5hdmlnYXRvclQ9bnVsbCxaLm5hdmlnYXRvckZpdD1udWxsLFouY2xpY2tab29tPW51bGwsWi5jbGlja1Bhbj1udWxsLFoubW91c2VQYW49bnVsbCxaLmtleXM9bnVsbCxaLmNvbnN0cmFpblBhbj1udWxsLFoudG9vbHRpcHNWaXNpYmxlPW51bGwsWi5jb3B5cmlnaHRQYXRoPW51bGwsWi53YXRlcm1hcmtQYXRoPW51bGwsWi5zbGlkZXJWaXNpYmxlPW51bGwsWi5mdWxsUGFnZVZpc2libGU9bnVsbCxaLnByb2dyZXNzVmlzaWJsZT1udWxsLFoubG9nb1Zpc2libGU9bnVsbCxaLmxvZ29DdXN0b21QYXRoPW51bGwsWi5jYW52YXM9bnVsbCxaLmRlYnVnPW51bGwsWi5WaWV3ZXI9bnVsbCxaLlZpZXdlckRpc3BsYXk9bnVsbCxaLlZpZXdwb3J0PW51bGwsWi5Ub29sYmFyPW51bGwsWi5Ub29sYmFyRGlzcGxheT1udWxsLFouVG9vbHRpcERpc3BsYXk9bnVsbCxaLk5hdmlnYXRvcj1udWxsLFouTmF2aWdhdG9yRGlzcGxheT1udWxsLFouQ29weXJpZ2h0RGlzcGxheT1udWxsLFouaW1hZ2VXPW51bGwsWi5pbWFnZUg9bnVsbCxaLmltYWdlWD0wLFouaW1hZ2VZPTAsWi5pbWFnZVo9MCxaLmZpdFo9bnVsbCxaLnpvb21pbmc9InN0b3AiLFoucGFubmluZ1g9InN0b3AiLFoucGFubmluZ1k9InN0b3AiLFouZnVsbFBhZ2U9ITEsWi51c2VDYW52YXM9ITAsWi5UcmFjZURpc3BsYXk9bnVsbCxaLnRyYWNlcz1udWxsfSxlbmZvcmNlQ29weXJpZ2h0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy56MjM4KCJpbWFnZUNvcHlyaWdodCIpO2E/Wi5WaWV3ZXIuejE0OSgpOnRoaXMuejIxMCgpfSx6MjEwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFouejEwMTthLmxvYWRYTUwoWi5jb3B5cmlnaHRQYXRoKX0sejI1MjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy56MTg1KCJ6MTYiKSxlPXRoaXMuejE4NSgiejE0Iik7aWYoYSl7Wi5Db3B5cmlnaHREaXNwbGF5PXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiQ29weXJpZ2h0RGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixaLnZpZXdlclctMisicHgiLFoudmlld2VySC0yKyJweCIsIjBweCIsIjBweCIsInNvbGlkIiwiMXB4IixkLCIwcHgiLCIwcHgiKSxaLlZpZXdlckRpc3BsYXkuYXBwZW5kQ2hpbGQoWi5Db3B5cmlnaHREaXNwbGF5KTt2YXIgZj00NDAsZz0yMDAsaD1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS53aWR0aCkvMi1mLzIsaT1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS5oZWlnaHQpLzItZy8yLGo9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJ0ZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGYrInB4IixnKyJweCIsaCsicHgiLGkrInB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiKTtqLmlkPSJ0ZXh0Qm94IixaLkNvcHlyaWdodERpc3BsYXkuYXBwZW5kQ2hpbGQoaik7dmFyIGs9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7ai5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChrKSksdGhpcy56MjUxKGssImJsYWNrIiwidmVyZGFuYSIsIjE2cHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwianVzdGlmeSIsIm5vbmUiKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjKTtqLmFwcGVuZENoaWxkKGwpO3ZhciBtPTgwLG49MjAsbz0zMCxwPTIwLHE9aCtmLzItKG0qMitvKS8yLHI9aStnK3Ascz10aGlzLnoxODUoInoxMyIpLHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25BZ3JlZSIscyxudWxsLG51bGwsbnVsbCxudWxsLG0rInB4IixuKyJweCIscSsicHgiLHIrInB4IiwibW91c2Vkb3duIix0aGlzLnoxNjAsInoxMDMiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMHB4Iik7Wi5Db3B5cmlnaHREaXNwbGF5LmFwcGVuZENoaWxkKHQuZWxtdCkscSs9bStvLHM9dGhpcy56MTg1KCJ6MTUiKTt2YXIgdT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4aXQiLHMsbnVsbCxudWxsLG51bGwsbnVsbCxtKyJweCIsbisicHgiLHErInB4IixyKyJweCIsIm1vdXNlZG93biIsdGhpcy56MTYxLCJ6MTA0Iiwic29saWQiLCIxcHgiLGUsIjBweCIsIjBweCIpO1ouQ29weXJpZ2h0RGlzcGxheS5hcHBlbmRDaGlsZCh1LmVsbXQpfWVsc2V7dmFyIGo9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRleHRCb3giKSx2PWouY2hpbGROb2Rlc1sxXS50ZXh0Q29udGVudDtqLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQ9djt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQWdyZWUiKTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCwibW91c2Vkb3duIix0aGlzLnoxNjApLFouQ29weXJpZ2h0RGlzcGxheS5yZW1vdmVDaGlsZCh0KTt2YXIgdT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhpdCIpO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih1LCJtb3VzZWRvd24iLHRoaXMuejE2MSksWi5Db3B5cmlnaHREaXNwbGF5LnJlbW92ZUNoaWxkKHUpfX0sQnV0dG9uOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMpe3ZhciB0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsYSwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGcsaCxpLGosbixvLHAscSxyLHMpO2lmKCFaLlV0aWxzLmlzU3RyVmFsKGIpKXt2YXIgdT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGMrIi8iK2QpLHY9Wi5VdGlscy5jcmVhdGVHcmFwaGljRWxlbWVudChjKyIvIitlKSx3PVouVXRpbHMuY3JlYXRlR3JhcGhpY0VsZW1lbnQoYysiLyIrZik7dS5pZD10LmlkKyItaW1nVXAiLHYuaWQ9dC5pZCsiLWltZ092ZXIiLHcuaWQ9dC5pZCsiLWltZ0Rvd24iLHQuX2ltZ1VwSUQ9dS5pZCx0Ll9pbWdPdmVySUQ9di5pZCx0Ll9pbWdEb3duSUQ9dy5pZDt2YXIgeD11LnN0eWxlLHk9di5zdHlsZSx6PXcuc3R5bGU7eC5wb3NpdGlvbj15LnBvc2l0aW9uPXoucG9zaXRpb249ImFic29sdXRlIix4LndpZHRoPXkud2lkdGg9eS53aWR0aD1nLHguaGVpZ2h0PXkuaGVpZ2h0PXkuaGVpZ2h0PWgseC50b3A9eS50b3A9ei50b3A9IjBweCIseC5sZWZ0PXkubGVmdD16LmxlZnQ9IjBweCIsWi5icm93c2VyPT1aLmJyb3dzZXJzLkZJUkVGT1gmJlouYnJvd3NlclZlcnNpb248MyYmKHgudG9wPXkudG9wPXoudG9wPSIiKSx5LnZpc2liaWxpdHk9ImhpZGRlbiIsei52aXNpYmlsaXR5PSJoaWRkZW4iLHQuYXBwZW5kQ2hpbGQodSksdC5hcHBlbmRDaGlsZCh2KSx0LmFwcGVuZENoaWxkKHcpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih1LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHYsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfWVsc2V7dmFyIEE9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7dC5hcHBlbmRDaGlsZChaLlV0aWxzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChBKSksWi5VdGlscy56MjUxKEEsImJsYWNrIiwidmVyZGFuYSIsIjEzcHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwiY2VudGVyIiwibm9uZSIpLFouVXRpbHMuZGlzYWJsZVRleHRJbnRlcmFjdGlvbihBKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodCwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfVoudG9vbHRpcHNWaXNpYmxlJiZaLlV0aWxzLmlzU3RyVmFsKG0pJiYodC50aXRsZT1aLlV0aWxzLnoxODUobSkpLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJ0b3VjaHN0YXJ0IixsKTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlb3ZlciIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJtb3VzZW91dCIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LGssbCkpLHRoaXMuZWxtdD10fSx6MTM4OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLnN0eWxlO2Qud2lkdGg9YisicHgiLGQuaGVpZ2h0PWMrInB4Ijt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdVcElEKSxmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ092ZXJJRCksZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdEb3duSUQpO2lmKGUmJmYmJmcpe3ZhciBoPWUuc3R5bGUsaT1mLnN0eWxlLGo9Zy5zdHlsZTtoLndpZHRoPWIrInB4IixoLmhlaWdodD1jKyJweCIsaS53aWR0aD1iKyJweCIsaS5oZWlnaHQ9YysicHgiLGoud2lkdGg9YisicHgiLGouaGVpZ2h0PWMrInB4In19LEdyYXBoaWM6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9Yz9iKyIvIitjOmIsaT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGgpLGo9aS5zdHlsZTtqLndpZHRoPWQsai5oZWlnaHQ9ZTt2YXIgYz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoInNwYW4iLGEsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixkLGUsZixnLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpO2MuYXBwZW5kQ2hpbGQoaSksdGhpcy5lbG10PWMsWi5tb2JpbGVEZXZpY2U/Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksInRvdWNoc3RhcnQiLFouVXRpbHMucHJldmVudERlZmF1bHQpOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJtb3VzZWRvd24iLFouVXRpbHMucHJldmVudERlZmF1bHQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9LHoyMDM6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuc3R5bGU7ZC53aWR0aD1iKyJweCIsZC5oZWlnaHQ9YysicHgiO3ZhciBlPWEuZmlyc3RDaGlsZCxmPWUuc3R5bGU7Zi53aWR0aD1iKyJweCIsZi5oZWlnaHQ9YysicHgifSx6MTYwOmZ1bmN0aW9uKGEpe1ouVmlld2VyRGlzcGxheS5yZW1vdmVDaGlsZChaLkNvcHlyaWdodERpc3BsYXkpLGRvY3VtZW50LmNvb2tpZT0iaW1hZ2VDb3B5cmlnaHQ9Y29uZmlybWVkIixaLlZpZXdlci56MTQ5KCl9LHoxNjE6ZnVuY3Rpb24oYSl7Wi5VdGlscy56MjUyKCExKTtyZXR1cm59LHoxMjg6ZnVuY3Rpb24oKXtTdHJpbmcucHJvdG90eXBlLm11bHRpcGx5fHwoU3RyaW5nLnByb3RvdHlwZS5tdWx0aXBseT1mdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5qb2luLGI9e307cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBiLmxlbmd0aD1jKzEsYS5jYWxsKGIsdGhpcyl9fSgpKSxBcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8KEFycmF5LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGEsYil7Yj9iPDAmJihiPU1hdGgubWF4KDAsdGhpcy5sZW5ndGgrYikpOmI9MDtmb3IodmFyIGM9YixkPXRoaXMubGVuZ3RoO2M8ZDtjKyspaWYodGhpc1tjXT09PWEpcmV0dXJuIGM7cmV0dXJuLTF9KSxBcnJheS5wcm90b3R5cGUucHVzaHx8KEFycmF5LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEpe3RoaXNbdGhpcy5sZW5ndGhdPWF9KSxBcnJheS5wcm90b3R5cGUuc3BsaWNlfHwoQXJyYXkucHJvdG90eXBlLnN1YmFycj1mdW5jdGlvbihhLGIpe2lmKGE+PXRoaXMubGVuZ3RofHxiJiZiPD0wKXJldHVybltdO2E8MCYmKE1hdGguYWJzKGEpPnRoaXMubGVuZ3RoP2E9MDphPXRoaXMubGVuZ3RoK2EpO2lmKCFifHxiK2E+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aC1hO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YStiO2QrKyljLnB1c2godGhpc1tkXSk7cmV0dXJuIGN9LEFycmF5LnByb3RvdHlwZS5zdWJhcnJheT1mdW5jdGlvbihhLGIpe2E8MCYmKGE9MCk7aWYoIWJ8fGI+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aDtpZihhPT1iKXJldHVybltdO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YjtkKyspYy5wdXNoKHRoaXNbZF0pO3JldHVybiBjfSxBcnJheS5wcm90b3R5cGUuc3BsaWNlPWZ1bmN0aW9uKGEsYil7YjwwJiYoYj0wKTt2YXIgYz1bXTtpZihhcmd1bWVudHMubGVuZ3RoPjIpZm9yKHZhciBkPTIsZT1hcmd1bWVudHMubGVuZ3RoO2Q8ZTtkKyspYy5wdXNoKGFyZ3VtZW50c1tkXSk7dmFyIGY9dGhpcy5zdWJhcnJheSgwLGEpLGc9dGhpcy5zdWJhcnIoYSxiKSxoPXRoaXMuc3ViYXJyYXkoYStiKSxpPWYuY29uY2F0KGMsaCk7dGhpcy5sZW5ndGg9MDtmb3IodmFyIGQ9MCxlPWkubGVuZ3RoO2Q8ZTtkKyspdGhpcy5wdXNoKGlbZF0pO3JldHVybiBnfSl9LHoxMjc6ZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyPyh0aGlzLmRpc2FibGVUZXh0SW50ZXJhY3Rpb249ZnVuY3Rpb24oYSl7YSYmKHRuUz1hLnBhcmVudE5vZGUuc3R5bGUsdG5TJiYoYS5wYXJlbnROb2RlLnVuc2VsZWN0YWJsZT0ib24iLHRuUy51c2VyU2VsZWN0PSJub25lIix0blMuTW96VXNlclNlbGVjdD0ibm9uZSIsdG5TLndlYmtpdFVzZXJTZWxlY3Q9Im5vbmUiLHRuUy53ZWJraXRUb3VjaENhbGxvdXQ9Im5vbmUiLHRuUy53ZWJraXRUYXBIaWdobGlnaHRDb2xvcj0idHJhbnNwYXJlbnQiKSl9LHRoaXMucmVuZGVyUXVhbGl0eT1mdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPWI9PSJoaWdoIj8ib3B0aW1pemVRdWFsaXR5Ijoib3B0aW1pemVTcGVlZCI7YS5zdHlsZS5zZXRQcm9wZXJ0eSgiaW1hZ2UtcmVuZGVyaW5nIixjLG51bGwpfX0sdGhpcy5zZXRPcGFjaXR5PWZ1bmN0aW9uKGEsYixjKXtaLmFscGhhU3VwcG9ydGVkP2Euc3R5bGUub3BhY2l0eT1iOmMmJihhLnN0eWxlLmJhY2tncm91bmRDb2xvcj1jKX0pOmRvY3VtZW50LmF0dGFjaEV2ZW50JiYodGhpcy5kaXNhYmxlVGV4dEludGVyYWN0aW9uPWZ1bmN0aW9uKGEpe2EmJihhLnBhcmVudE5vZGUudW5zZWxlY3RhYmxlPSJvbiIsYS5wYXJlbnROb2RlLm9uc2VsZWN0c3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0pfSx0aGlzLnJlbmRlclF1YWxpdHk9ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1iPT0iaGlnaCI/ImJpY3ViaWMiOiJuZWFyZXN0LW5laWdoYm9yIjthLnN0eWxlLm1zSW50ZXJwb2xhdGlvbk1vZGU9Y319LHRoaXMuc2V0T3BhY2l0eT1mdW5jdGlvbihhLGIsYyl7Wi5hbHBoYVN1cHBvcnRlZD8oYS5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PScgKyB2YWx1ZSArICcpIixhLnN0eWxlLmZpbHRlcj0iYWxwaGEob3BhY2l0eT0iK2IrIikiKTpjJiYoYS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Yyl9KX0sejEyNjpmdW5jdGlvbigpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXI/KHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7Yj09Im1vdXNld2hlZWwiJiZlbG10LmFkZEV2ZW50TGlzdGVuZXIoIkRPTU1vdXNlU2Nyb2xsIixjLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX0sdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXtiPT0ibW91c2V3aGVlbCImJmVsbXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLGMsITEpLGEmJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSx0aGlzLmV2ZW50PWZ1bmN0aW9uKGEpe3JldHVybiBhfSx0aGlzLnRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LHRoaXMucmVsYXRlZFRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZWxhdGVkVGFyZ2V0fSx0aGlzLmlzUmlnaHRNb3VzZUJ1dHRvbj1mdW5jdGlvbihhKXt2YXIgYj0hMTtpZihhLndoaWNoPT0yfHxhLndoaWNoPT0zKWI9ITA7cmV0dXJuIGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk6ZG9jdW1lbnQuYXR0YWNoRXZlbnQmJih0aGlzLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYykhPS0xKXJldHVybjt2YXIgZD1mdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5ldmVudDtGdW5jdGlvbi5wcm90b3R5cGUuY2FsbD9jLmNhbGwoYSxiKTooYS5fY3VycmVudExpc3RlbmVyPWMsYS5fY3VycmVudExpc3RlbmVyKGIpLGEuX2N1cnJlbnRMaXN0ZW5lcj1udWxsKX07YS5hdHRhY2hFdmVudCgib24iK2IsZCk7dmFyIGU9e3RhcmdldDphLGV2ZW50TmFtZTpiLGhhbmRsZXI6YyxoYW5kbGVyMjpkfSxmPWEuZG9jdW1lbnR8fGEsZz1mLnBhcmVudFdpbmRvdyxoPSJsIit0aGlzLl9saXN0ZW5lckNvdW50ZXIrKztnLl9hbGxMaXN0ZW5lcnN8fChnLl9hbGxMaXN0ZW5lcnM9e30pLGcuX2FsbExpc3RlbmVyc1toXT1lLGEuX2xpc3RlbmVyc3x8KGEuX2xpc3RlbmVycz1bXSksYS5fbGlzdGVuZXJzW2EuX2xpc3RlbmVycy5sZW5ndGhdPWgsZy5fdW5sb2FkTGlzdGVuZXJBZGRlZHx8KGcuX3VubG9hZExpc3RlbmVyQWRkZWQ9ITAsZy5hdHRhY2hFdmVudCgib251bmxvYWQiLHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycykpfSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKGEpe3ZhciBkPXRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYyk7aWYoZD09LTEpcmV0dXJuO3ZhciBlPWEuZG9jdW1lbnR8fGEsZj1lLnBhcmVudFdpbmRvdyxnPWEuX2xpc3RlbmVyc1tkXSxoPWYuX2FsbExpc3RlbmVyc1tnXTthLmRldGFjaEV2ZW50KCJvbiIrYixoLmhhbmRsZXIyKSxhLl9saXN0ZW5lcnMuc3BsaWNlKGQsMSksZGVsZXRlIGYuX2FsbExpc3RlbmVyc1tnXX19LHRoaXMuZXZlbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5ldmVudH0sdGhpcy50YXJnZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3JjRWxlbWVudH0sdGhpcy5yZWxhdGVkVGFyZ2V0PWZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7cmV0dXJuIGEudHlwZT09Im1vdXNlb3ZlciI/Yj1hLmZyb21FbGVtZW50OmEudHlwZT09Im1vdXNlb3V0IiYmKGI9YS50b0VsZW1lbnQpLGJ9LHRoaXMuaXNSaWdodE1vdXNlQnV0dG9uPWZ1bmN0aW9uKGEpe3ZhciBiPSExO3JldHVybiBhLmJ1dHRvbj09MiYmKGI9ITApLGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YSYmKGEucmV0dXJuVmFsdWU9ITEpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLmNhbmNlbEJ1YmJsZT0hMH0sdGhpcy5fZmluZExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLl9saXN0ZW5lcnM7aWYoIWQpcmV0dXJuLTE7dmFyIGU9YS5kb2N1bWVudHx8YSxmPWUucGFyZW50V2luZG93O2Zvcih2YXIgZz1kLmxlbmd0aC0xO2c+PTA7Zy0tKXt2YXIgaD1kW2ddLGk9Zi5fYWxsTGlzdGVuZXJzW2hdO2lmKGkuZXZlbnROYW1lPT1iJiZpLmhhbmRsZXI9PWMpcmV0dXJuIGd9cmV0dXJuLTF9LHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7Zm9yKGlkIGluIGEuX2FsbExpc3RlbmVycyl7dmFyIGI9YS5fYWxsTGlzdGVuZXJzW2lkXTtiLnRhcmdldC5kZXRhY2hFdmVudCgib24iK2IuZXZlbnROYW1lLGIuaGFuZGxlcjIpLGRlbGV0ZSBhLl9hbGxMaXN0ZW5lcnNbaWRdfX0sdGhpcy5fbGlzdGVuZXJDb3VudGVyPTApfSx6MTY0OmZ1bmN0aW9uKCl7Wi5icm93c2Vycz17VU5LTk9XTjowLElFOjEsRklSRUZPWDoyLFNBRkFSSTozLENIUk9NRTo0LE9QRVJBOjV9O3ZhciBhPVouYnJvd3NlcnMuVU5LTk9XTixiPTAsYz1uYXZpZ2F0b3IuYXBwTmFtZSxkPW5hdmlnYXRvci5hcHBWZXJzaW9uLGU9ITEsZj0hMSxnPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtpZihjIT0iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyInx8IXdpbmRvdy5hdHRhY2hFdmVudHx8IXdpbmRvdy5BY3RpdmVYT2JqZWN0KWlmKGMhPSJOZXRzY2FwZSJ8fCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciljPT0iT3BlcmEiJiYhIXdpbmRvdy5vcGVyYSYmISF3aW5kb3cuYXR0YWNoRXZlbnQmJihhPVouYnJvd3NlcnMuT1BFUkEsYj1wYXJzZUZsb2F0KGQpKTtlbHNle3ZhciBpPWcuaW5kZXhPZigiZmlyZWZveCIpLGo9Zy5pbmRleE9mKCJzYWZhcmkiKSxrPWcuaW5kZXhPZigiY2hyb21lIik7aWYoaT49MClhPVouYnJvd3NlcnMuRklSRUZPWCxiPXBhcnNlRmxvYXQoZy5zdWJzdHJpbmcoaSs4KSk7ZWxzZSBpZihqPj0wKXt2YXIgbD1nLnN1YnN0cmluZygwLGopLmxhc3RJbmRleE9mKCIvIik7YT1rPj0wP1ouYnJvd3NlcnMuQ0hST01FOlouYnJvd3NlcnMuU0FGQVJJLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhsKzEsaikpfXZhciBtPW5ldyBJbWFnZTttLnN0eWxlLmdldFByb3BlcnR5VmFsdWUmJihmPW0uc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgiaW1hZ2UtcmVuZGVyaW5nIikpfWVsc2V7dmFyIGg9Zy5pbmRleE9mKCJtc2llIik7YT1aLmJyb3dzZXJzLklFLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhoKzUsZy5pbmRleE9mKCI7IixoKSkpLGU9dHlwZW9mIGRvY3VtZW50LmRvY3VtZW50TW9kZSE9InVuZGVmaW5lZCJ9dmFyIG49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxvPW4uc3R5bGV8fHt9LHA9ITEscT1bInRyYW5zZm9ybSIsIldlYmtpdFRyYW5zZm9ybSIsIk1velRyYW5zZm9ybSJdLHIsczt3aGlsZShyPXEuc2hpZnQoKSlpZih0eXBlb2Ygb1tyXSE9InVuZGVmaW5lZCIpe3A9ITAscz0vd2Via2l0L2kudGVzdChyKTticmVha312YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0JiZkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpLHU9IShhPT1aLmJyb3dzZXJzLlNBRkFSSSYmYjw0fHxhPT1aLmJyb3dzZXJzLkNIUk9NRSYmYjwyKSx2PXQmJnUsdz0hKGE9PVouYnJvd3NlcnMuSUV8fGE9PVouYnJvd3NlcnMuQ0hST01FJiZiPDIpLHg9ZXx8Zj8iaGlnaCI6bnVsbCx5PWcuaW5kZXhPZigiYW5kcm9pZCIpPi0xfHxnLmluZGV4T2YoImlwaG9uZSIpPi0xfHxnLmluZGV4T2YoImlwYWQiKT4tMXx8Zy5pbmRleE9mKCJpcG9kIik+LTE7Wi5icm93c2VyPWEsWi5icm93c2VyVmVyc2lvbj1iLFouY2FudmFzU3VwcG9ydGVkPXYsWi51c2VDYW52YXM9Wi5jYW52YXNTdXBwb3J0ZWQsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkPXAsWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eT1yLFouY3NzVHJhbnNmb3JtTm9Vbml0cz1zLFouYWxwaGFTdXBwb3J0ZWQ9dyxaLnJlbmRlclF1YWxpdHk9eCxaLm1vYmlsZURldmljZT15fSxpc1N0clZhbDpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbCYmYSE9IiJ9LHoxNzQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPTAsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKTt3aGlsZShlKXtiKz1hLm9mZnNldExlZnQsYys9YS5vZmZzZXRUb3A7aWYoZCl7dmFyIGY9dGhpcy56MTg0KCk7Yis9Zi54LGMrPWYueX1hPWUsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKX1yZXR1cm4gbmV3IHRoaXMuUG9pbnQoYixjKX0sejE4MzpmdW5jdGlvbihhLGIpe3JldHVybiBiJiZhIT1kb2N1bWVudC5ib2R5P2RvY3VtZW50LmJvZHk6YS5vZmZzZXRQYXJlbnR9LHoxNzU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB0aGlzLlBvaW50KGEuY2xpZW50V2lkdGgsYS5jbGllbnRIZWlnaHQpfSx6MTc2OmZ1bmN0aW9uKGEpe2lmKGEuY3VycmVudFN0eWxlKXJldHVybiBhLmN1cnJlbnRTdHlsZTtpZih3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSlyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoYSwiIik7dGhpcy56MjU1KHRoaXMuejE4NSgiejkzIikpfSx6MTc3OmZ1bmN0aW9uKGEpe3JldHVybiB6MTc0KFouVXRpbHMudGFyZ2V0KGEpKX0sejE3ODpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9YS50b3VjaGVzLGQ9YS5jaGFuZ2VkVG91Y2hlcztyZXR1cm4gYyE9PXVuZGVmaW5lZD9iPWNbMF06ZCE9PXVuZGVmaW5lZCYmKGI9ZFswXSksYn0sejE4MTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9MDtyZXR1cm4gYS50eXBlPT0iRE9NTW91c2VTY3JvbGwiJiZicm93c2VyPT1Ccm93c2VyLkZJUkVGT1gmJmJyb3dzZXJWZXJzaW9uPDM/KGI9YS5zY3JlZW5YLGM9YS5zY3JlZW5ZKTp0eXBlb2YgYS5wYWdlWD09Im51bWJlciI/KGI9YS5wYWdlWCxjPWEucGFnZVkpOnR5cGVvZiBhLmNsaWVudFg9PSJudW1iZXIiPyhiPWEuY2xpZW50WCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQrZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsYz1hLmNsaWVudFkrZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ArZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCk6dGhpcy56MjU1KHRoaXMuejE4NSgiejk0IikpLG5ldyB0aGlzLlBvaW50KGIsYyl9LHoxODI6ZnVuY3Rpb24oYSl7dmFyIGI9MDtyZXR1cm4gdHlwZW9mIGEud2hlZWxEZWx0YT09Im51bWJlciI/Yj1hLndoZWVsRGVsdGE6dHlwZW9mIGEuZGV0YWlsPT0ibnVtYmVyIj9iPWEuZGV0YWlsKi0xOnRoaXMuejI1NSh0aGlzLnoxODUoIno5NSIpKSxiP2IvTWF0aC5hYnMoYik6MH0sejE4NDpmdW5jdGlvbigpe3ZhciBhPTAsYj0wLGM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxkPWRvY3VtZW50LmJvZHl8fHt9O2lmKHR5cGVvZiB3aW5kb3cucGFnZVhPZmZzZXQ9PSJudW1iZXIiKWE9d2luZG93LnBhZ2VYT2Zmc2V0LGI9d2luZG93LnBhZ2VZT2Zmc2V0O2Vsc2UgaWYoZC5zY3JvbGxMZWZ0fHxkLnNjcm9sbFRvcClhPWQuc2Nyb2xsTGVmdCxiPWQuc2Nyb2xsVG9wO2Vsc2UgaWYoYy5zY3JvbGxMZWZ0fHxjLnNjcm9sbFRvcClhPWMuc2Nyb2xsTGVmdCxiPWMuc2Nyb2xsVG9wO3JldHVybiBuZXcgdGhpcy5Qb2ludChhLGIpfSx6MjAxaW5kb3dTaXplOmZ1bmN0aW9uKCl7dmFyIGE9MCxiPTAsYz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fHt9LGQ9ZG9jdW1lbnQuYm9keXx8e307cmV0dXJuIHR5cGVvZiB3aW5kb3cuaW5uZXJXaWR0aD09Im51bWJlciI/KGE9d2luZG93LmlubmVyV2lkdGgsYj13aW5kb3cuaW5uZXJIZWlnaHQpOmMuY2xpZW50V2lkdGh8fGMuY2xpZW50SGVpZ2h0PyhhPWMuY2xpZW50V2lkdGgsYj1jLmNsaWVudEhlaWdodCk6ZC5jbGllbnRXaWR0aHx8ZC5jbGllbnRIZWlnaHQ/KGE9ZC5jbGllbnRXaWR0aCxiPWQuY2xpZW50SGVpZ2h0KTp0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTYiKSksbmV3IHRoaXMuUG9pbnQoYSxiKX0sejIyNTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPWE7d2hpbGUoYj09ITEpaWYoYyljLmlkP2MuaWQ9PSJWaWV3ZXJEaXNwbGF5Ij9iPSEwOmM9Yy5wYXJlbnROb2RlOmM9Yy5wYXJlbnROb2RlO2Vsc2UgYnJlYWs7cmV0dXJuIGJ9LHoyMzg6ZnVuY3Rpb24oYSl7dmFyIGI9YSsiPSIsYz1kb2N1bWVudC5jb29raWUuc3BsaXQoIjsiKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTt3aGlsZShlLmNoYXJBdCgwKT09IiAiKWU9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aCk7aWYoZS5pbmRleE9mKGIpPT0wKXJldHVybiBlLnN1YnN0cmluZyhiLmxlbmd0aCxlLmxlbmd0aCl9cmV0dXJuIG51bGx9LHoyNDM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5zbGljZSgtMSxhLmxlbmd0aCk9PSIvIj9hLnNsaWNlKDAsYS5sZW5ndGgtMSk6YTtyZXR1cm4gYj1hLnNsaWNlKDAsMSk9PSIvIj9hLnNsaWNlKDEsYS5sZW5ndGgpOmEsYn0sejE0MDpmdW5jdGlvbihhKXtpZihaLmJyb3dzZXI9PVouYnJvd3NlcnMuSUUpe3ZhciBiPShuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCksYz1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCksZD1jK2I7YSs9Ij9zdWZmaXhUb0Jsb2NrUGF0aENhY2hpbmc9IitkfXJldHVybiBhfSx6MTcwOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybihhLz1kLzIpPDE/Yy8yKmEqYSphKmEqYStiOmMvMiooKGEtPTIpKmEqYSphKmErMikrYn0sejIzMzpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gYSYmKGI9YS5zcGxpdCgiJiIpKSxifSx6MjQ5OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuejE4NSgiejUwIiksYz10aGlzLnoxODUoIno0OSIpLGQ9dGhpcy56MTg1KCJ6NDgiKTtaLnNraW5QYXRoPXRoaXMuejE4NSgiejU2IiksWi5za2luTW9kZT10aGlzLnoxODUoIno1NCIpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjYiKSkpfHwoWi5pbml0aWFsWD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejI2IikpKSxpc05hTihwYXJzZUZsb2F0KHRoaXMuejE4NSgiejI3IikpKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdCh0aGlzLnoxODUoInoyNyIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoInoyOCIpKSl8fChaLmluaXRpYWxaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjgiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpfHwoWi5taW5aPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpfHwoWi5tYXhaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6ODAiKSkpfHwoWi56b29tU3BlZWQ9cGFyc2VGbG9hdCh0aGlzLnoxODUoIno4MCIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoIno0NiIpKSl8fChaLnBhblNwZWVkPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NDYiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MTgiKSkpfHwoWi5mYWRlSW5TcGVlZD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejE4IikpKSxaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KHRoaXMuejE4NSgiejY0IiksMTApLFoudG9vbGJhclBvc2l0aW9uPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NjMiKSksWi50b29sdGlwc1Zpc2libGU9dGhpcy56MTg1KCJ6NjUiKSE9IjAiLFoubmF2aWdhdG9yVmlzaWJsZT1wYXJzZUludCh0aGlzLnoxODUoIno0MyIpLDEwKSxaLm5hdmlnYXRvclc9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDQiKSwxMCksWi5uYXZpZ2F0b3JIPXBhcnNlSW50KHRoaXMuejE4NSgiejM5IiksMTApLFoubmF2aWdhdG9yTD1wYXJzZUludCh0aGlzLnoxODUoIno0MCIpLDEwKSxaLm5hdmlnYXRvclQ9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDIiKSwxMCksWi5uYXZpZ2F0b3JGaXQ9dGhpcy56MTg1KCJ6MzgiKSxaLmNsaWNrWm9vbT10aGlzLnoxODUoInoxMCIpIT0iMCIsWi5jbGlja1Bhbj10aGlzLnoxODUoIno5IikhPSIwIixaLm1vdXNlUGFuPXRoaXMuejE4NSgiejM0IikhPSIwIixaLmtleXM9dGhpcy56MTg1KCJ6MjkiKSE9IjAiLFouY29uc3RyYWluUGFuPXRoaXMuejE4NSgiejEyIikhPSIwIixaLnNsaWRlclZpc2libGU9dGhpcy56MTg1KCJ6NTgiKSE9IjAiLFouZnVsbFBhZ2VWaXNpYmxlPXRoaXMuejE4NSgiejIzIikhPSIwIixaLnByb2dyZXNzVmlzaWJsZT10aGlzLnoxODUoIno1MyIpIT0iMCIsWi5sb2dvVmlzaWJsZT10aGlzLnoxODUoInozMSIpIT0iMCIsWi5sb2dvQ3VzdG9tUGF0aD10aGlzLnoxODUoInozMCIpLFouY2FudmFzPXRoaXMuejE4NSgiejgiKSE9IjAiLFouZGVidWc9dGhpcy56MTg1KCJ6MTciKSE9IjAiO2lmKHRoaXMuaXNTdHJWYWwoYSkpZm9yKHZhciBlPTAsZj1hLmxlbmd0aDtlPGY7ZSsrKXt2YXIgZz1hW2VdLGg9Zy5pbmRleE9mKCI9Iik7aWYoaD4wKXt2YXIgaT1nLnN1YnN0cmluZygwLGgpLGo9Zy5zdWJzdHJpbmcoaCsxKTtpZih0aGlzLmlzU3RyVmFsKGopKXN3aXRjaChpKXtjYXNlInpJbml0aWFsWCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLmluaXRpYWxYPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2UiekluaXRpYWxZIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6SW5pdGlhbFpvb20iOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5pbml0aWFsWj1wYXJzZUZsb2F0KGopLFouaW5pdGlhbFomJihaLmluaXRpYWxaLz0xMDApKTticmVhaztjYXNlInpNaW5ab29tIjohaXNOYU4ocGFyc2VGbG9hdChqKSkmJnBhcnNlRmxvYXQoaik+LjAxJiYoWi5taW5aPXBhcnNlRmxvYXQoaiksWi5taW5aJiYoWi5taW5aLz0xMDApKTticmVhaztjYXNlInpNYXhab29tIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubWF4Wj1wYXJzZUZsb2F0KGopLFoubWF4WiYmKFoubWF4Wi89MTAwKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9yVmlzaWJsZSI6Wi5uYXZpZ2F0b3JWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UielRvb2xiYXJWaXNpYmxlIjpaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UiekxvZ29WaXNpYmxlIjpqPT0iMCImJihaLmxvZ29WaXNpYmxlPSExKTticmVhaztjYXNlInpTbGlkZXJWaXNpYmxlIjpqPT0iMCImJihaLnNsaWRlclZpc2libGU9ITEpO2JyZWFrO2Nhc2UiekZ1bGxQYWdlVmlzaWJsZSI6aj09IjAiJiYoWi5mdWxsUGFnZVZpc2libGU9ITEpO2JyZWFrO2Nhc2UielByb2dyZXNzVmlzaWJsZSI6aj09IjAiJiYoWi5wcm9ncmVzc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielRvb2x0aXBzVmlzaWJsZSI6aj09IjAiJiYoWi50b29sdGlwc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielNraW5QYXRoIjpaLnNraW5QYXRoPWo7YnJlYWs7ZGVmYXVsdDppZihiPT1jKWFsZXJ0KGQrIiAiK2kpO2Vsc2Ugc3dpdGNoKGkpe2Nhc2Uielpvb21TcGVlZCI6Wi56b29tU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6UGFuU3BlZWQiOloucGFuU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6RmFkZUluU3BlZWQiOlouZmFkZUluU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6VG9vbGJhclBvc2l0aW9uIjpaLnRvb2xiYXJQb3NpdGlvbj1wYXJzZUludChqLDEwKTticmVhaztjYXNlInpOYXZpZ2F0b3JXaWR0aCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvclc9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9ySGVpZ2h0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9ySD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JMZWZ0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9yTD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JUb3AiOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5uYXZpZ2F0b3JUPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2Uiek5hdmlnYXRvckZpdCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvckZpdD1wYXJzZUludChqLDEwKSk7YnJlYWs7Y2FzZSJ6Q2xpY2tab29tIjpqPT0iMCImJihaLmNsaWNrWm9vbT0hMSk7YnJlYWs7Y2FzZSJ6Q2xpY2tQYW4iOmo9PSIwIiYmKFouY2xpY2tQYW49ITEpO2JyZWFrO2Nhc2Uiek1vdXNlUGFuIjpqPT0iMCImJihaLm1vdXNlUGFuPSExKTticmVhaztjYXNlInpLZXlzIjpqPT0iMCImJihaLmtleXM9ITEpO2JyZWFrO2Nhc2UiekNvbnN0cmFpblBhbiI6aj09IjAiJiYoWi5jb25zdHJhaW5QYW49ITEpO2JyZWFrO2Nhc2UiekNvcHlyaWdodFBhdGgiOlouY29weXJpZ2h0UGF0aD1qO2JyZWFrO2Nhc2UieldhdGVybWFya1BhdGgiOloud2F0ZXJtYXJrUGF0aD1qO2JyZWFrO2Nhc2UiekxvZ29DdXN0b21QYXRoIjpaLmxvZ29DdXN0b21QYXRoPWo7YnJlYWs7Y2FzZSJ6Q2FudmFzIjpqPT0iMCImJihaLmNhbnZhcz0hMSk7aWYoIVouY2FudmFzU3VwcG9ydGVkfHwhWi5jYW52YXMpWi51c2VDYW52YXM9ITE7YnJlYWs7Y2FzZSJ6RGVidWciOmo9PSIxIiYmKFouZGVidWc9ITApfX19fX0sejI0MjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MTtiPGEubGVuZ3RoOylhW2ItMV09PWFbYl0/YS5zcGxpY2UoYiwxKTpiKys7cmV0dXJuIGF9LGludGVyc2VjdDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdLGY9ITE7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aCYmZT49KGVsbXQyPWJbZ10pO2crKylpZihlbG10Mj09ZSl7Zj0hMDticmVha31mJiZjLnB1c2goYVtkXSl9cmV0dXJuIGN9LHN1YnRyYWN0OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10sZT0hMTtmb3IodmFyIGY9MDtmPGIubGVuZ3RoJiZkPj0oZWxtdDI9YltmXSk7ZisrKWlmKGVsbXQyPT1kKXtlPSEwO2JyZWFrfWUmJmEuc3BsaWNlKGMtLSwxKX1yZXR1cm4gYX0sY3JlYXRlQ2FsbGJhY2s6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IodmFyIGQ9MixlPWFyZ3VtZW50cy5sZW5ndGg7ZDxlO2QrKyljLnB1c2goYXJndW1lbnRzW2RdKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1jLmNvbmNhdChbXSk7Zm9yKHZhciBlPTAsZj1hcmd1bWVudHMubGVuZ3RoO2U8ZjtlKyspZC5wdXNoKGFyZ3VtZW50c1tlXSk7cmV0dXJuIGIuYXBwbHkoYSxkKX19LHoyNTU6ZnVuY3Rpb24oYSl7YWxlcnQoYSl9LGNyZWF0ZUNvbnRhaW5lckVsZW1lbnQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8pe3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYSk7dGhpcy5pc1N0clZhbChiKSYmKHAuaWQ9Yik7dmFyIHE9cC5zdHlsZTtyZXR1cm4gcS5kaXNwbGF5PXRoaXMuaXNTdHJWYWwoYyk/YzoiaW5saW5lLWJsb2NrIixxLnBvc2l0aW9uPXRoaXMuaXNTdHJWYWwoZCk/ZDoic3RhdGljIixxLm92ZXJmbG93PXRoaXMuaXNTdHJWYWwoZSk/ZToiaGlkZGVuIixhPT0iY2FudmFzIj8odGhpcy5pc1N0clZhbChmKSYmcC5zZXRBdHRyaWJ1dGUoIndpZHRoIixmKSx0aGlzLmlzU3RyVmFsKGcpJiZwLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixnKSk6KHRoaXMuaXNTdHJWYWwoZikmJihxLndpZHRoPWYpLHRoaXMuaXNTdHJWYWwoZyYmZykmJihxLmhlaWdodD1nKSksdGhpcy5pc1N0clZhbChoKSYmKHEubGVmdD1oKSx0aGlzLmlzU3RyVmFsKGkpJiYocS50b3A9aSkscS5ib3JkZXJTdHlsZT10aGlzLmlzU3RyVmFsKGopP2o6Im5vbmUiLHEuYm9yZGVyV2lkdGg9dGhpcy5pc1N0clZhbChrKT9rOiIwcHgiLHEuYmFja2dyb3VuZD10aGlzLmlzU3RyVmFsKGwpP2w6InRyYW5zcGFyZW50IG5vbmUiLHEubWFyZ2luPXRoaXMuaXNTdHJWYWwobSk/bToiMHB4IixxLnBhZGRpbmc9dGhpcy5pc1N0clZhbChuKT9uOiIwcHgiLHRoaXMuaXNTdHJWYWwobykmJihxLmN1cnNvcj1vKSxwfSxjcmVhdGVDZW50ZXJlZEVsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiKSxjPVtdO2MucHVzaCgnPGRpdiBzdHlsZT0iZGlzcGxheTp0YWJsZTsgaGVpZ2h0OjEwMCU7IHdpZHRoOjEwMCU7JyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCcjcG9zaXRpb246cmVsYXRpdmU7IG92ZXJmbG93OmhpZGRlbjsgdGV4dC1hbGlnbjpsZWZ0OyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246YWJzb2x1dGU7ICN0b3A6NTAlOyB3aWR0aDoxMDAlOyAnKSxjLnB1c2goImJvcmRlcjpub25lOyBtYXJnaW46MHB4OyBwYWRkaW5nOjBweDsiKSxjLnB1c2goJ2Rpc3BsYXk6dGFibGUtY2VsbDsgdmVydGljYWwtYWxpZ246bWlkZGxlOyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246cmVsYXRpdmU7ICN0b3A6LTUwJTsgd2lkdGg6MTAwJTsgJyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCd0ZXh0LWFsaWduOmNlbnRlcjsiPjwvZGl2PjwvZGl2PjwvZGl2PicpLGIuaW5uZXJIVE1MPWMuam9pbigiIiksYj1iLmZpcnN0Q2hpbGQ7dmFyIGQ9YixlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO3doaWxlKGUubGVuZ3RoPjApZD1lWzBdLGU9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7cmV0dXJuIGQuYXBwZW5kQ2hpbGQoYSksYn0sY3JlYXRlR3JhcGhpY0VsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJpbWciKSxjPW51bGw7cmV0dXJuIFouYnJvd3Nlcj09Wi5icm93c2Vycy5JRSYmWi5icm93c2VyVmVyc2lvbjw3PyhjPXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsbnVsbCwiaW5saW5lLWJsb2NrIiksYi5vbmxvYWQ9ZnVuY3Rpb24oKXtjLnN0eWxlLndpZHRoPWMuc3R5bGUud2lkdGh8fGIud2lkdGgrInB4IixjLnN0eWxlLmhlaWdodD1jLnN0eWxlLmhlaWdodHx8Yi5oZWlnaHQrInB4IixiLm9ubG9hZD1udWxsLGI9bnVsbH0sYy5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKHNyYz0nIithKyInLCBzaXppbmdNZXRob2Q9J3NjYWxlJykiKTooYz1iLGMuc3JjPWEpLGN9LHoyNTE6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwpe3ZhciBtPWEucGFyZW50Tm9kZS5zdHlsZTttLmNvbG9yPWIsbS5mb250RmFtaWx5PWMsbS5mb250U2l6ZT1kLG0uZm9udFNpemVBZGp1c3Q9ZSxtLmZvbnRTdHlsZT1mLG0uZm9udFN0cmV0Y2g9ZyxtLmZvbnRWYXJpYW50PWgsbS5mb250V2VpZ2h0PWksbS5saW5lSGVpZ2h0PWosbS50ZXh0QWxpZ249ayxtLnRleHREZWNvcmF0aW9uPWx9LHoxNTg6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl0cnl7Yj1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGIuYXN5bmM9ITEsYi5sb2FkWE1MKGEpfWNhdGNoKGMpe3RoaXMuejI1NShjLm5hbWUrdGhpcy56MTg1KCJ6ODIiKStjLm1lc3NhZ2UpfWVsc2UgaWYod2luZG93LkRPTVBhcnNlcil0cnl7dmFyIGQ9bmV3IERPTVBhcnNlcjtiPWQucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIil9Y2F0Y2goYyl7dGhpcy56MjU1KGMubmFtZSt0aGlzLnoxODUoIno4MiIpK2MubWVzc2FnZSl9ZWxzZSB0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTgiKSk7cmV0dXJuIGJ9LFBvaW50OmZ1bmN0aW9uKGEsYil7dGhpcy54PXR5cGVvZiBhPT0ibnVtYmVyIj9hOjAsdGhpcy55PXR5cGVvZiBiPT0ibnVtYmVyIj9iOjB9LFBvaW50M0Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMueD10eXBlb2YgYT09Im51bWJlciI/YTowLHRoaXMueT10eXBlb2YgYj09Im51bWJlciI/YjowLHRoaXMuej10eXBlb2YgYz09Im51bWJlciI/YzowfSx6MTg1OmZ1bmN0aW9uKGEpe3ZhciBiPSIiO3N3aXRjaChhKXtjYXNlIno1MCI6Yj0iRW5hYmxlIERldmVsb3BlciBwYXJhbWV0ZXJzIjticmVhaztjYXNlIno0OSI6Yj0iQ2hhbmdpbmcgVGhpcyBWaW9sYXRlcyBMaWNlbnNlIEFncmVlbWVudCI7YnJlYWs7Y2FzZSJ6NDgiOmI9IlN1cHBvcnQgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIGVuYWJsZWQgb25seSBpbiB0aGUgWm9vbWlmeSBJbWFnZSBWaWV3ZXIgaW5jbHVkZWQgaW4gdGhlIFpvb21pZnkgSFRNTDUgRGV2ZWxvcGVyIGVkaXRpb246ICI7YnJlYWs7Y2FzZSJ6MjUiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NjAiOmI9IjMwMDAwIjticmVhaztjYXNlIno2MSI6Yj0iMjU2IjticmVhaztjYXNlIno1OSI6Yj0iMS4xNSI7YnJlYWs7Y2FzZSJ6NjIiOmI9IjMwMCI7YnJlYWs7Y2FzZSJ6NyI6Yj0iNiI7YnJlYWs7Y2FzZSJ6NiI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NSI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NCI6Yj0iMiI7YnJlYWs7Y2FzZSJ6MyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6NDUiOmI9IjIiO2JyZWFrO2Nhc2UiejQ2IjpiPSI1IjticmVhaztjYXNlIno0NyI6Yj0iMTAiO2JyZWFrO2Nhc2UiejgwIjpiPSI1IjticmVhaztjYXNlIno4MSI6Yj0iMC4wMiI7YnJlYWs7Y2FzZSJ6NzciOmI9IjMwIjticmVhaztjYXNlIno3OCI6Yj0iMjAwIjticmVhaztjYXNlIno3OSI6Yj0iMTAiO2JyZWFrO2Nhc2UiejEwVElFUlNLSVBUSFJFU0hPTEQiOmI9IjAxLiI7YnJlYWs7Y2FzZSJ6MjQiOmI9IjEwIjticmVhaztjYXNlInoxOCI6Yj0iNSI7YnJlYWs7Y2FzZSJ6MTkiOmI9IjAuMDY3IjticmVhaztjYXNlIno2NCI6Yj0iNCI7YnJlYWs7Y2FzZSJ6NjMiOmI9IjEiO2JyZWFrO2Nhc2UiejY1IjpiPSIxIjticmVhaztjYXNlIno0MyI6Yj0iMiI7YnJlYWs7Y2FzZSJ6NDQiOmI9IjE1MCI7YnJlYWs7Y2FzZSJ6MzkiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NDAiOmI9IjAiO2JyZWFrO2Nhc2UiejQyIjpiPSIwIjticmVhaztjYXNlInozOCI6Yj1udWxsO2JyZWFrO2Nhc2UiejM2IjpiPSIjZmZmZmZmIjticmVhaztjYXNlInozNk5PQUxQSEEiOmI9IiNmYmZhZmEiO2JyZWFrO2Nhc2UiejM1IjpiPSIwLjc1IjticmVhaztjYXNlIno0MSI6Yj0iYmx1ZSI7YnJlYWs7Y2FzZSJ6NTUiOmI9InNraW5GaWxlcy54bWwiO2JyZWFrO2Nhc2UiejU2IjpiPSJBc3NldHMvU2tpbnMvRGVmYXVsdCI7YnJlYWs7Y2FzZSJ6NTQiOmI9IjAiO2JyZWFrO2Nhc2UiejEyIjpiPSIxIjticmVhaztjYXNlIno1OCI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NTciOmI9IjEwIjticmVhaztjYXNlInoyMyI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MjIiOmI9IndoaXRlIjticmVhaztjYXNlInoyMSI6Yj0iWCI7YnJlYWs7Y2FzZSJ6MjAiOmI9Ilx0I0Y4RjhGOCI7YnJlYWs7Y2FzZSJ6NTMiOmI9IjEiO2JyZWFrO2Nhc2UiejUxIjpiPSI1MDAiO2JyZWFrO2Nhc2UiejUyIjpiPSIgIjticmVhaztjYXNlInozMSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MzAiOmI9bnVsbDticmVhaztjYXNlIno4IjpiPSIxIjticmVhaztjYXNlInoxNyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6MTYiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6MTQiOmI9IndoaXRlIjticmVhaztjYXNlInoxMyI6Yj0iQWdyZWUiO2JyZWFrO2Nhc2UiejE1IjpiPSJFeGl0IjticmVhaztjYXNlIno3MyI6Yj0iMC42IjticmVhaztjYXNlIno3NCI6Yj0iMC4zMyI7YnJlYWs7Y2FzZSJ6NzYiOmI9IjUxMiI7YnJlYWs7Y2FzZSJ6NzUiOmI9IjM4NCI7YnJlYWs7Y2FzZSJ6MjYiOmI9bnVsbDticmVhaztjYXNlInoyNyI6Yj1udWxsO2JyZWFrO2Nhc2UiejI4IjpiPW51bGw7YnJlYWs7Y2FzZSJ6MzMiOmI9bnVsbDticmVhaztjYXNlInozMiI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MTAiOmI9IjEiO2JyZWFrO2Nhc2UiejkiOmI9IjEiO2JyZWFrO2Nhc2UiejM0IjpiPSIxIjticmVhaztjYXNlInoyOSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NjciOmI9IlRoaXMgcGFuZWwgaXMgZW5hYmxlZCB1c2luZyB0aGUgSFRNTCBwYXJhbWV0ZXIgJ3pEZWJ1Zz0xJy4gSXQgY2FuIGJlIGNhbGxlZCBhcyBmb2xsb3dzOlxuXG4gICBaLlV0aWxzLnRyYWNlKCd2YWx1ZSB0byBkaXNwbGF5Jyk7ICBcblxuVGhlIGJ1dHRvbnMgYmVsb3cgZGlzcGxheSBvciBtb2RpZnkgaW1wb3J0YW50IHN0YXRlIHZhbHVlcy4gIFdlYiBkZXNpZ25lcnMgbmV3IHRvIEphdmFTY3JpcHQgd2lsbCBhbHNvIGJlbmVmaXQgZnJvbSB0aGUgY29uc29sZSwgdHJhY2UsIHByb2ZpbGluZywgYW5kIG90aGVyIGRlYnVnZ2luZyBmZWF0dXJlcyBvZiBsZWFkaW5nIGJyb3dzZXJzLiI7YnJlYWs7Y2FzZSJ6NjgiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6NjYiOmI9IndoaXRlIjticmVhaztjYXNlIno2OSI6Yj0iU2hvdyBHbG9iYWxzIjticmVhaztjYXNlIno3MiI6Yj0iVG9nZ2xlIERpc3BsYXkiO2JyZWFrO2Nhc2UiejcwIjpiPSJUb2dnbGUgQmFja2ZpbGwiO2JyZWFrO2Nhc2UiejcxIjpiPSJUb2dnbGUgQ29uc3RyYWluIFBhbiI7YnJlYWs7Y2FzZSJ6OTkiOmI9IkJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdC4iO2JyZWFrO2Nhc2Uiejg3LUlNQUdFWE1MIjpiPSJFcnJvciBsb2FkaW5nIGltYWdlOiBwbGVhc2UgbWFrZSBzdXJlIGltYWdlIHBhdGggaW4gd2ViIHBhZ2UgbWF0Y2hlcyBpbWFnZSBmb2xkZXIgbG9jYXRpb24gb24gd2Vic2VydmVyLiI7YnJlYWs7Y2FzZSJ6ODctVE9PTEJBUlhNTCI6Yj0iRXJyb3IgbG9hZGluZyB0b29sYmFyOiBwbGVhc2UgdmVyaWZ5IHNraW4gZmlsZXMgYXJlIG9uIHdlYnNlcnZlciBpbiBzYW1lIGZvbGRlciBhcyB6MTIyLmpzIGZpbGUgYW5kIGFyZSBpbiBkZWZhdWx0IGZvbGRlciBzdHJ1Y3R1cmUgJ0Fzc2V0cy9Ta2lucy9EZWZhdWx0Jywgb3IgYWRkIHpTa2luUGF0aCBwYXJhbWV0ZXIgdG8gd2VicGFnZS4iO2JyZWFrO2Nhc2Uiejg3IjpiPSJFcnJvciBtYWtpbmcgbmV0d29yayByZXF1ZXN0OiBwb3NzaWJsZSBpbnZhbGlkIHBhdGggb3IgbmV0d29yayBlcnJvci4iO2JyZWFrO2Nhc2Uiejg0IjpiPSJJbWFnZSBmYWlsZWQgdG8gbG9hZDogcG9zc2libGUgaW52YWxpZCBwYXRoLCBtaXNzaW5nIGltYWdlLCBvciBuZXR3b3JrIGVycm9yLiI7YnJlYWs7Y2FzZSJ6ODkiOmI9IkVycm9yIHJlbGF0ZWQgdG8gbmV0d29yayBzZWN1cml0eTogIjticmVhaztjYXNlIno5MCI6Yj0iRXJyb3IgcmVsYXRlZCB0byBuZXR3b3JrIHN0YXR1czogIjticmVhaztjYXNlIno4MiI6Yj0iIGNvbnZlcnRpbmcgWE1MIHRleHQgdG8gWE1MIGRvYyAoRE9NUGFyc2VyKTogIjticmVhaztjYXNlIno5OCI6Yj0iQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFhNTCBET00uIjticmVhaztjYXNlInoxMDAiOmI9IlhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODYiOmI9IkltYWdlIFhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODMiOmI9IiB3aGlsZSBleGVjdXRpbmcgY2FsbGJhY2s6ICI7YnJlYWs7Y2FzZSJ6ODUiOmI9IkltYWdlIHRpbWVkIG91dDogIjticmVhaztjYXNlIno4OCI6Yj0iTmF2aWdhdG9yIGltYWdlIGZhaWxlZCB0byBsb2FkOiBwb3NzaWJsZSBpbnZhbGlkIHBhdGgsIG1pc3NpbmcgaW1hZ2UsIG9yIG5ldHdvcmsgZXJyb3IuIjticmVhaztjYXNlIno5MSI6Yj0iU2tpbiBYTUwgaW52YWxpZC4iO2JyZWFrO2Nhc2UiejkyIjpiPSJUaGUgc2tpbiBYTUwgZmlsZSBoYXMgb25lIG9yIG1vcmUgZmF1bHR5IG5hbWUgbGluZXMuIjticmVhaztjYXNlIno5NyI6Yj0iV2F0ZXJtYXJrIGltYWdlIGZhaWxlZCB0byBsb2FkOiAiO2JyZWFrO2Nhc2UiejkzIjpiPSJVbmtub3duIGVsZW1lbnQgc3R5bGUgLSBubyBrbm93biBtZXRob2QgdG8gaWRlbnRpZnkuIjticmVhaztjYXNlIno5NCI6Yj0iVW5rbm93biBtb3VzZSBwb3NpdGlvbiAtIG5vIGtub3duIG1ldGhvZCB0byBjYWxjdWxhdGUuIjticmVhaztjYXNlIno5NSI6Yj0iVW5rbm93biBtb3VzZSBzY3JvbGwgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6OTYiOmI9IlVua25vd24gd2luZG93IHNpemUgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6MTA2IjpiPSJMYXVuY2ggWm9vbWlmeSBXZWJzaXRlIjticmVhaztjYXNlInoxMDciOmI9Ik1pbmltaXplIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEwNSI6Yj0iRXhwYW5kIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEyMCI6Yj0iWm9vbSBPdXQiO2JyZWFrO2Nhc2UiejExNCI6Yj0iWm9vbSBJbiBBbmQgT3V0IjticmVhaztjYXNlInoxMTkiOmI9Ilpvb20gSW4iO2JyZWFrO2Nhc2UiejEwOSI6Yj0iUGFuIExlZnQiO2JyZWFrO2Nhc2UiejExMSI6Yj0iUGFuIFVwIjticmVhaztjYXNlInoxMDgiOmI9IlBhbiBEb3duIjticmVhaztjYXNlInoxMTAiOmI9IlBhbiBSaWdodCI7YnJlYWs7Y2FzZSJ6MTEyIjpiPSJSZXNldCBJbml0aWFsIFZpZXciO2JyZWFrO2Nhc2UiejExOCI6Yj0iVG9nZ2xlIEZ1bGwgUGFnZSBWaWV3IjticmVhaztjYXNlInoxMDIiOmI9IkNhbmNlbCBGdWxsIFBhZ2UgVmlldyI7YnJlYWs7Y2FzZSJ6MTAzIjpiPSJBZ3JlZSB0byBjb3B5cmlnaHQgYW5kIHZpZXcgaW1hZ2VzIjticmVhaztjYXNlInoxMDQiOmI9IkV4aXQgYW5kIGRvIG5vdCB2aWV3IGltYWdlcyI7YnJlYWs7Y2FzZSJ6MTEzIjpiPSJUb2dnbGUgRnVsbCBQYWdlIFZpZXciO2JyZWFrO2Nhc2UiejExNyI6Yj0iVG9nZ2xlIFZpZXdwb3J0IERpc3BsYXkiO2JyZWFrO2Nhc2UiejExNSI6Yj0iVG9nZ2xlIFZpZXdwb3J0IEJhY2tmaWxsIjticmVhaztjYXNlInoxMTYiOmI9IlRvZ2dsZSBDb25zdHJhaW4gUGFuIjticmVhaztkZWZhdWx0OmI9IlVuZXhwZWN0ZWQgcmVzb3VyY2UgcmVxdWVzdCJ9cmV0dXJuIGJ9LHoyNTM6ZnVuY3Rpb24oKXt2YXIgYT0iIjthKz0iXG4iLGErPSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9PTUlGWSBJTUFHRSBWSUVXRVIgLSBDVVJSRU5UIFZBTFVFU1xuIixhKz0iXG4iLGErPSJJTUFHRSAmIFNLSU46ICAgICIsYSs9IlouaW1hZ2VQYXRoPSIrWi5pbWFnZVBhdGgrIiwgICAiLGErPSJaLnNraW5QYXRoPSIrWi5za2luUGF0aCsiLCAgICIsYSs9Ilouc2tpbk1vZGU9IitaLnNraW5Nb2RlKyIsICAgIixhKz0iWi5pbWFnZVc9IitaLmltYWdlVysiLCAgICIsYSs9IlouaW1hZ2VIPSIrWi5pbWFnZUgrIiwgICAiLGErPSJ0aWVyQ291bnQ9IitaLlZpZXdwb3J0LnoxODYoKSsiLCAgICIsYSs9IlRJTEVfU0laRT0iK1ouVmlld3BvcnQuejE5NSgpKyJcbiIsYSs9IlxuIixhKz0iUEFHRSAmIEJST1dTRVI6ICAgICIsYSs9IloucGFnZUNvbnRhaW5lcj0iK1oucGFnZUNvbnRhaW5lcisiLCAgICIsYSs9IlouYnJvd3Nlcj0iK1ouYnJvd3NlcisiLCAgICIsYSs9IlouYnJvd3NlclZlcnNpb249IitaLmJyb3dzZXJWZXJzaW9uKyIsICAgIixhKz0iWi5jYW52YXNTdXBwb3J0ZWQ9IitaLmNhbnZhc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD0iK1ouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3JtUHJvcGVydHk9IitaLmNzc1RyYW5zZm9ybVByb3BlcnR5KyIsICAgIixhKz0iWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPSIrWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzKyIsICAgIixhKz0iWi5hbHBoYVN1cHBvcnRlZD0iK1ouYWxwaGFTdXBwb3J0ZWQrIiwgICAiLGErPSJaLnJlbmRlclF1YWxpdHk9IitaLnJlbmRlclF1YWxpdHkrIiwgICAiLGErPSJaLm1vYmlsZURldmljZT0iK1oubW9iaWxlRGV2aWNlKyJcbiIsYSs9IlxuIixhKz0iVklFV0VSIE9QVElPTlMgJiBERUZBVUxUUzogICAgIixhKz0iWi5pbml0aWFsWD0iK1ouaW5pdGlhbFgrIiwgICAiLGErPSJaLmluaXRpYWxZPSIrWi5pbml0aWFsWSsiLCAgICIsYSs9IlouaW5pdGlhbFo9IitaLmluaXRpYWxaKyIsICAgIixhKz0iWi5taW5aPSIrWi5taW5aKyIsICAgIixhKz0iWi5tYXhaPSIrWi5tYXhaKyIsICAgIixhKz0iWi5maXRaPSIrWi5maXRaKyIsICAgIixhKz0iWi56b29tU3BlZWQ9IitaLnpvb21TcGVlZCsiLCAgICIsYSs9IloucGFuU3BlZWQ9IitaLnBhblNwZWVkKyIsICAgIixhKz0iWi5mYWRlSW5TcGVlZD0iK1ouZmFkZUluU3BlZWQrIiwgICAiLGErPSJaLnRvb2xiYXJWaXNpYmxlPSIrWi50b29sYmFyVmlzaWJsZSsiLCAgICIsYSs9IloudG9vbGJhclc9IitaLnRvb2xiYXJXKyIsICAgIixhKz0iWi50b29sYmFyQ3VycmVudFc9IitaLnRvb2xiYXJDdXJyZW50VysiLCAgICIsYSs9IloudG9vbGJhckg9IitaLnRvb2xiYXJIKyIsICAgIixhKz0iWi50b29sYmFyUG9zaXRpb249IitaLnRvb2xiYXJQb3NpdGlvbisiLCAgICIsYSs9IloudG9vbHRpcHNWaXNpYmxlPSIrWi50b29sdGlwc1Zpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclZpc2libGU9IitaLm5hdmlnYXRvclZpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclc9IitaLm5hdmlnYXRvclcrIiwgICAiLGErPSJaLm5hdmlnYXRvckg9IitaLm5hdmlnYXRvckgrIiwgICAiLGErPSJaLm5hdmlnYXRvckw9IitaLm5hdmlnYXRvckwrIiwgICAiLGErPSJaLm5hdmlnYXRvclQ9IitaLm5hdmlnYXRvclQrIiwgICAiLGErPSJaLm5hdmlnYXRvckZpdD0iK1oubmF2aWdhdG9yRml0KyIsICAgIixhKz0iWi5jbGlja1pvb209IitaLmNsaWNrWm9vbSsiLCAgICIsYSs9IlouY2xpY2tQYW49IitaLmNsaWNrUGFuKyIsICAgIixhKz0iWi5tb3VzZVBhbj0iK1oubW91c2VQYW4rIiwgICAiLGErPSJaLmtleXM9IitaLmtleXMrIiwgICAiLGErPSJaLmNvbnN0cmFpblBhbj0iK1ouY29uc3RyYWluUGFuKyIsICAgIixhKz0iV2F0ZXJtYXJrIGFscGhhID0gIitaLlV0aWxzLnoxODUoIno3MyIpKyIsICAgIixhKz0iWi53YXRlcm1hcmtQYXRoPSIrWi53YXRlcm1hcmtQYXRoKyIsICAgIixhKz0iWi5jb3B5cmlnaHRQYXRoPSIrWi5jb3B5cmlnaHRQYXRoKyIsICAgIixhKz0iWi5zbGlkZXJWaXNpYmxlPSIrWi5zbGlkZXJWaXNpYmxlKyIsICAgIixhKz0iWi5mdWxsUGFnZVZpc2libGU9IitaLmZ1bGxQYWdlVmlzaWJsZSsiLCAgICIsYSs9IloucHJvZ3Jlc3NWaXNpYmxlPSIrWi5wcm9ncmVzc1Zpc2libGUrIiwgICAiLGErPSJaLmxvZ29WaXNpYmxlPSIrWi5sb2dvVmlzaWJsZSsiLCAgICIsYSs9IloubG9nb0N1c3RvbVBhdGg9IitaLmxvZ29DdXN0b21QYXRoKyIsICAgIixhKz0iWi5jYW52YXM9IitaLmNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIFZBTFVFUzogICAgIixhKz0iXG4iLGErPSJkaXNwbGF5Vz0iK1ouVmlld3BvcnQuejIwMSgpKyIsICAgIixhKz0iZGlzcGxheUg9IitaLlZpZXdwb3J0LnoxNzkoKSsiLCAgICIsYSs9InRpZXJDdXJyZW50PSIrWi5WaWV3cG9ydC56MTg3KCkrIiwgICAiLGErPSJ0aWVyU2NhbGU9IitaLlZpZXdwb3J0LnoxODkoKSsiLCAgICIsYSs9IlRJRVJTX01BWF9TQ0FMRV9VUD0iK1ouVmlld3BvcnQuejE5NCgpKyIsICAgIixhKz0iVElFUlNfTUFYX1NDQUxFX0RPV049IitaLlZpZXdwb3J0LnoxOTMoKSsiLCAgICIsYSs9IlRJTEVTX01BWF9DQUNIRT0iK1ouVmlld3BvcnQuejE5NygpKyIsICAgIixhKz0iWi51c2VDYW52YXM9IitaLnVzZUNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIExJU1RTOiAgICAiLGErPSJ0aWVyV3M9IitaLlZpZXdwb3J0LnoxOTIoKSsiLCAgICIsYSs9InRpZXJIcz0iK1ouVmlld3BvcnQuejE4OCgpKyIsICAgIixhKz0idGllclRpbGVDb3VudHM9IitaLlZpZXdwb3J0LnoxOTEoKSsiLCAgICIsYSs9InRpbGVzTG9hZGluZ05hbWVzPSIrWi5WaWV3cG9ydC56MTk2KCkrIlxuIixhKz0iXG4iLGFsZXJ0KGEpfSx6MjU2OmZ1bmN0aW9uKCl7Wi5UcmFjZURpc3BsYXk/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT09ImlubGluZS1ibG9jayI/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0ibm9uZSI6Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0iaW5saW5lLWJsb2NrIjpaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpfSxjb25maWd1cmVUcmFjZURpc3BsYXk6ZnVuY3Rpb24oKXt2YXIgYT1aLnZpZXdlclcvMyxiPVoudmlld2VySC8zKzQ1LGM9MTAsZD1wYXJzZUZsb2F0KFoudmlld2VySCkvMyxlPXRoaXMuejE4NSgiejY4Iik7Wi5UcmFjZURpc3BsYXk9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUcmFjZURpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsYSsicHgiLGIrInB4IixjKyJweCIsZCsicHgiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMTBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRyYWNlRGlzcGxheSksWi50cmFjZXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEVYVEFSRUEiKTt2YXIgZj1aLnRyYWNlcy5zdHlsZTtmLndpZHRoPWEtMTUrInB4IixmLmhlaWdodD1iLTYwKyJweCIsZi5mb250RmFtaWx5PSJ2ZXJkYW5hIixmLmZvbnRTaXplPSIxMHB4IixmLmJvcmRlcj0ic29saWQiLGYuYm9yZGVyV2lkdGg9IjFweCIsZi5wYWRkaW5nPSI1cHgiLGYucmVzaXplPSJub25lIixaLnRyYWNlcy52YWx1ZT0iVHJhY2UgVmFsdWVzXG4iLFouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKFoudHJhY2VzKTt2YXIgZz01OCxoPTQyLGk9MjAsaj1iLWgvMi0xMCxrPTEwLGw9dGhpcy56MTg1KCJ6NjYiKSxtPXRoaXMuejE4NSgiejY5Iiksbj1uZXcgdGhpcy5CdXR0b24oImJ1dHRvblNob3dHbG9iYWxzIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLHRoaXMuejI1MywiejExMyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChuLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MiIpLG89bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVEaXNwbGF5IixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQuejI3MiwiejExNyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChvLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MCIpLHA9bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVCYWNrZmlsbCIsbSxudWxsLG51bGwsbnVsbCxudWxsLGcrInB4IixoKyJweCIsaSsicHgiLGorInB4IiwibW91c2Vkb3duIixaLlZpZXdwb3J0LnoyNzEsInoxMTUiLCJzb2xpZCIsIjFweCIsbCwiMHB4IiwiMHB4Iik7Wi5UcmFjZURpc3BsYXkuYXBwZW5kQ2hpbGQocC5lbG10KSxpKz1nK2ssZys9MTI7dmFyIG09dGhpcy56MTg1KCJ6NzEiKSxxPW5ldyB0aGlzLkJ1dHRvbigiYnV0dG9uVG9nZ2xlQ29uc3RyYWluUGFuIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQudG9nZ2xlQ29uc3RyYWluUGFuLCJ6MTE2Iiwic29saWQiLCIxcHgiLGwsIjBweCIsIjBweCIpO1ouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKHEuZWxtdCl9LHRyYWNlOmZ1bmN0aW9uKGEpe1ouVHJhY2VEaXNwbGF5fHxaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpLFoudHJhY2VzJiYoWi50cmFjZXMudmFsdWUrPSJcbiIrYSsiXG4iKX19"></script>

<!--
        <style type="text/css"> #myContainer { width: 900px; height: 550px } </style>
	-->
        <style type="text/css"> #myContainer { width: 1200px; height: 800px } </style>
        <script id="script_zm_mycontainer"  type="text/javascript"> 
		var zmid = "";
		var tlid = "";
		var pnid = "";
		var slid = "";
		var avid = "";
		var ytid = "";

		var tl_source = "";
		var tl_source_default = "tl.json";
		var tlid_default = "/tl_jtfdc.json";

		var zmid_default = "/zm/komap";
		var zmid_default = "/zm/hrc2011";
		var zmid_default = "/zm/zm_nasa/Curiosity-Murray-Buttes";
		var zmid_default = "/zm/space_2018/bennu";
		var zmid_default = "/zm/space_2018/bennu_face";

		var tlid_default = "/tl_jtfdc.json/";
		var pnid_default = "pn.jpg";
		var slid_default = "/sl/";
		var avid_default = "index.mp4";
		var ytid_default = "https://youtube.com";

		var protocol = window.location.protocol;
		var hostname = window.location.hostname;
		var search = window.location.search;
		var hast = window.location.hash;
		var zmurl = protocol+"//"+hostname+zmid_default;
		if( search.match("/?zmid=/")) {
			zmurl = protocol+"//"+hostname+search.replace("?zmid=","");
			}
		Z.showImage("myContainer", zmurl  ); 

		if( zmid == "" ) { zmid = zmid_default; }
		if( tlid == "" ) { tlid = tlid_default; }
		if( pnid == "" ) { pnld = pnid_default; }
		if( slid == "" ) { slid = slid_default; }
		if( avid == "" ) { avid = avid_default; }
		if( ytid == "" ) { ytid = ytid_default; }

		if( tl_source == "" ) { tl_source = tl_source_default; }
//		if( url.search.match( 'zmid' )) {
//			var zmid=url.search.replace('?zmid=','' );	
//			}
//		Z.showImage("myContainer", zmid  ); 

		if( url.search.match( 'tlid' )) {
			var tlid=url.search.replace('?tlid=','' );	
			tl_source = tlid;
//			alert( "BUGS_420 tlid=" + tlid );
			alert( "BUGS_430 BEG tl_source=" + tl_source );
			}
		if( url.search.match( 'pnid' )) {
			var pnid=url.search.replace('?pnid=','' );	
//			alert( "BUGS_350 pnid=" + pnid );
			}
		if( url.search.match( 'slid' )) {
			var slid=url.search.replace('?slid=','' );	
//			alert( "BUGS_350 slid=" + slid );
			}
		if( url.search.match( 'ytid' )) {
			var ytid=url.search.replace('?ytid=','' );	
//			document.location = "yt.php?ytid=DoThis";

//			alert( "BUGS_430 ytid=" + ytid );
			$(".div_zm").hide();
			$(".div_tl").hide();
			window.location.replace(ytid);
			}

//		var zmid= "/zm/zm_nasa/Curiosity-Murray-Buttes";



		if( url.search.match( 'avid' )) {
			var avid=url.search.replace('?avid=','' );	

//			script_avlist();
//			script_avlist_load();
//			script_avlist_show();
//			alert( "BUGS_331 avid=" + avid );
// JFA embed the window.location in a timeout function
// 			t1 = window.setTimeout( function(){ window.location.replace = avid; },3000);
//			window.location=avid;
// similar behavior as an HTTP redirect
//			window.location.replace(avid);
// similar behavior as clicking on a link
//			window.location.href = avid;
//			window.location.replace=avid;
//			window.open(URL,name,specs,replace)
// url: URL for new window
// name: (optional) default is _blank
// specs: (optional) Google JavaScript window.open for a complete list
// replace: (optional) [true|false] replace history or append
//			window.open(avid);
// cant redirect to a function 
// pass some flag on the URL
// check for flag server side
//			document.location = "MyPage.php?action=DoThis";
			window.location.replace(avid);
//			alert( "BUGS_450 avid=" + avid );
			}

//		var zmid= "/zm/zm_nasa/Curiosity-Murray-Buttes";
//		Z.showImage("myContainer", "/zm/Curiosity-Murray-Buttes"  ); 
//		document.write( "BUGS_90: url.search="+url.search );
//		document.write( "BUGS_92: zmid="+zmid );
// err		Z.showImage("myContainer", '"'+zmid +'"' ); 
//		alert( zmid );
//		zmid = zmid_default;
//		zmid = getParameterByName('zmid');
//		if( zmid == "" ) { zmid = zmid_default; }
//		alert( "getParameterByName(zmid)="+zmid );
//		Z.showImage("myContainer", zmid  ); 
//		Z.showImage("myContainer", + zmid  ); 
//		Z.showImage("myContainer", "/zm/hrc2011"); 
//		Z.showImage("myContainer", "/zm/komap"); 
//		Z.showImage("myContainer2", "/zm/nasa"); 
//		Z.showImage("myContainer", "/zm/Curiosity-Murray-Buttes"); 
//		Z.showImage("myContainer", "/zm/hrc2011"); 
		</script>


	<script id="script_url" >
//		function getParameterByName(name, url) {
//			if (!url) url = window.location.href;
//			name = name.replace(/[\[\]]/g, "\\$&");
//			var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
//			results = regex.exec(url);
//			if (!results) return null;
//			if (!results[2]) return '';
//			return decodeURIComponent(results[2].replace(/\+/g, " "));
//			}
//
// query string: ?foo=lorem&bar=&baz
// http://ko0.us/index_tl.html?zm=/zm/komap
//	/<div
	var foo = getParameterByName('foo'); // "lorem"
//		var bar = getParameterByName('bar'); // "" (present with empty value)
//		var baz = getParameterByName('baz'); // "" (present with no value)
//		var qux = getParameterByName('qux'); // null (absent)
//		var zmid = "/zm/komap";
//		var zmid = getParameterByName('zmid');
//		zmid = params.get('zmid');
//			let params = new URL('https://ko0.us/index_tl?zmid=/zm/komap&bar=2').searchParams;
//			zmid = params.get('zmid'); // "1"
//		var foo= params.get('bar'); // "2" 
//		var bar= params.get('bar'); // "2" 
//		alert( "params.get(zmid)="+zmid+"  foo="+foo+"  bar="+bar );
//		var first = getUrlVars()["zmid"];
//		var second = getUrlVars()["foo"];
//		var third = getUrlVars()["bar"];
//		alert(first);
//		alert(second);
//		alert(third);

		</script>



	<script type="text/javascript" src="/tl/lib/js/storyjs-embed.js"></script> 
	<script type="text/javascript" src="/tl/lib/js/jquery-min.js"></script>
<!--
	<script id="script_tl_jquery_172_min_js" url="data:text/plain;base64,LyohIGpRdWVyeSB2MS43LjEganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwooZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjeShhKXtyZXR1cm4gZi5pc1dpbmRvdyhhKT9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OiExfWZ1bmN0aW9uIGN2KGEpe2lmKCFja1thXSl7dmFyIGI9Yy5ib2R5LGQ9ZigiPCIrYSsiPiIpLmFwcGVuZFRvKGIpLGU9ZC5jc3MoImRpc3BsYXkiKTtkLnJlbW92ZSgpO2lmKGU9PT0ibm9uZSJ8fGU9PT0iIil7Y2x8fChjbD1jLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGNsLmZyYW1lQm9yZGVyPWNsLndpZHRoPWNsLmhlaWdodD0wKSxiLmFwcGVuZENoaWxkKGNsKTtpZighY218fCFjbC5jcmVhdGVFbGVtZW50KWNtPShjbC5jb250ZW50V2luZG93fHxjbC5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGNtLndyaXRlKChjLmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCI/IjwhZG9jdHlwZSBodG1sPiI6IiIpKyI8aHRtbD48Ym9keT4iKSxjbS5jbG9zZSgpO2Q9Y20uY3JlYXRlRWxlbWVudChhKSxjbS5ib2R5LmFwcGVuZENoaWxkKGQpLGU9Zi5jc3MoZCwiZGlzcGxheSIpLGIucmVtb3ZlQ2hpbGQoY2wpfWNrW2FdPWV9cmV0dXJuIGNrW2FdfWZ1bmN0aW9uIGN1KGEsYil7dmFyIGM9e307Zi5lYWNoKGNxLmNvbmNhdC5hcHBseShbXSxjcS5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2NbdGhpc109YX0pO3JldHVybiBjfWZ1bmN0aW9uIGN0KCl7Y3I9Yn1mdW5jdGlvbiBjcygpe3NldFRpbWVvdXQoY3QsMCk7cmV0dXJuIGNyPWYubm93KCl9ZnVuY3Rpb24gY2ooKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1mdW5jdGlvbiBjaSgpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBjYyhhLGMpe2EuZGF0YUZpbHRlciYmKGM9YS5kYXRhRmlsdGVyKGMsYS5kYXRhVHlwZSkpO3ZhciBkPWEuZGF0YVR5cGVzLGU9e30sZyxoLGk9ZC5sZW5ndGgsaixrPWRbMF0sbCxtLG4sbyxwO2ZvcihnPTE7ZzxpO2crKyl7aWYoZz09PTEpZm9yKGggaW4gYS5jb252ZXJ0ZXJzKXR5cGVvZiBoPT0ic3RyaW5nIiYmKGVbaC50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbaF0pO2w9ayxrPWRbZ107aWYoaz09PSIqIilrPWw7ZWxzZSBpZihsIT09IioiJiZsIT09ayl7bT1sKyIgIitrLG49ZVttXXx8ZVsiKiAiK2tdO2lmKCFuKXtwPWI7Zm9yKG8gaW4gZSl7aj1vLnNwbGl0KCIgIik7aWYoalswXT09PWx8fGpbMF09PT0iKiIpe3A9ZVtqWzFdKyIgIitrXTtpZihwKXtvPWVbb10sbz09PSEwP249cDpwPT09ITAmJihuPW8pO2JyZWFrfX19fSFuJiYhcCYmZi5lcnJvcigiTm8gY29udmVyc2lvbiBmcm9tICIrbS5yZXBsYWNlKCIgIiwiIHRvICIpKSxuIT09ITAmJihjPW4/bihjKTpwKG8oYykpKX19cmV0dXJuIGN9ZnVuY3Rpb24gY2IoYSxjLGQpe3ZhciBlPWEuY29udGVudHMsZj1hLmRhdGFUeXBlcyxnPWEucmVzcG9uc2VGaWVsZHMsaCxpLGosaztmb3IoaSBpbiBnKWkgaW4gZCYmKGNbZ1tpXV09ZFtpXSk7d2hpbGUoZlswXT09PSIqIilmLnNoaWZ0KCksaD09PWImJihoPWEubWltZVR5cGV8fGMuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpKTtpZihoKWZvcihpIGluIGUpaWYoZVtpXSYmZVtpXS50ZXN0KGgpKXtmLnVuc2hpZnQoaSk7YnJlYWt9aWYoZlswXWluIGQpaj1mWzBdO2Vsc2V7Zm9yKGkgaW4gZCl7aWYoIWZbMF18fGEuY29udmVydGVyc1tpKyIgIitmWzBdXSl7aj1pO2JyZWFrfWt8fChrPWkpfWo9anx8a31pZihqKXtqIT09ZlswXSYmZi51bnNoaWZ0KGopO3JldHVybiBkW2pdfX1mdW5jdGlvbiBjYShhLGIsYyxkKXtpZihmLmlzQXJyYXkoYikpZi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxiRS50ZXN0KGEpP2QoYSxlKTpjYShhKyJbIisodHlwZW9mIGU9PSJvYmplY3QifHxmLmlzQXJyYXkoZSk/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoIWMmJmIhPW51bGwmJnR5cGVvZiBiPT0ib2JqZWN0Iilmb3IodmFyIGUgaW4gYiljYShhKyJbIitlKyJdIixiW2VdLGMsZCk7ZWxzZSBkKGEsYil9ZnVuY3Rpb24gYl8oYSxjKXt2YXIgZCxlLGc9Zi5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGMpY1tkXSE9PWImJigoZ1tkXT9hOmV8fChlPXt9KSlbZF09Y1tkXSk7ZSYmZi5leHRlbmQoITAsYSxlKX1mdW5jdGlvbiBiJChhLGMsZCxlLGYsZyl7Zj1mfHxjLmRhdGFUeXBlc1swXSxnPWd8fHt9LGdbZl09ITA7dmFyIGg9YVtmXSxpPTAsaj1oP2gubGVuZ3RoOjAsaz1hPT09YlQsbDtmb3IoO2k8aiYmKGt8fCFsKTtpKyspbD1oW2ldKGMsZCxlKSx0eXBlb2YgbD09InN0cmluZyImJigha3x8Z1tsXT9sPWI6KGMuZGF0YVR5cGVzLnVuc2hpZnQobCksbD1iJChhLGMsZCxlLGwsZykpKTsoa3x8IWwpJiYhZ1siKiJdJiYobD1iJChhLGMsZCxlLCIqIixnKSk7cmV0dXJuIGx9ZnVuY3Rpb24gYlooYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7dHlwZW9mIGIhPSJzdHJpbmciJiYoYz1iLGI9IioiKTtpZihmLmlzRnVuY3Rpb24oYykpe3ZhciBkPWIudG9Mb3dlckNhc2UoKS5zcGxpdChiUCksZT0wLGc9ZC5sZW5ndGgsaCxpLGo7Zm9yKDtlPGc7ZSsrKWg9ZFtlXSxqPS9eXCsvLnRlc3QoaCksaiYmKGg9aC5zdWJzdHIoMSl8fCIqIiksaT1hW2hdPWFbaF18fFtdLGlbaj8idW5zaGlmdCI6InB1c2giXShjKX19fWZ1bmN0aW9uIGJDKGEsYixjKXt2YXIgZD1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGU9Yj09PSJ3aWR0aCI/Yng6YnksZz0wLGg9ZS5sZW5ndGg7aWYoZD4wKXtpZihjIT09ImJvcmRlciIpZm9yKDtnPGg7ZysrKWN8fChkLT1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2VbZ10pKXx8MCksYz09PSJtYXJnaW4iP2QrPXBhcnNlRmxvYXQoZi5jc3MoYSxjK2VbZ10pKXx8MDpkLT1wYXJzZUZsb2F0KGYuY3NzKGEsImJvcmRlciIrZVtnXSsiV2lkdGgiKSl8fDA7cmV0dXJuIGQrInB4In1kPWJ6KGEsYixiKTtpZihkPDB8fGQ9PW51bGwpZD1hLnN0eWxlW2JdfHwwO2Q9cGFyc2VGbG9hdChkKXx8MDtpZihjKWZvcig7ZzxoO2crKylkKz1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2VbZ10pKXx8MCxjIT09InBhZGRpbmciJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJib3JkZXIiK2VbZ10rIldpZHRoIikpfHwwKSxjPT09Im1hcmdpbiImJihkKz1wYXJzZUZsb2F0KGYuY3NzKGEsYytlW2ddKSl8fDApO3JldHVybiBkKyJweCJ9ZnVuY3Rpb24gYnAoYSxiKXtiLnNyYz9mLmFqYXgoe3VybDpiLnNyYyxhc3luYzohMSxkYXRhVHlwZToic2NyaXB0In0pOmYuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UoYmYsIi8qJDAqLyIpKSxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBibyhhKXt2YXIgYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2JoLmFwcGVuZENoaWxkKGIpLGIuaW5uZXJIVE1MPWEub3V0ZXJIVE1MO3JldHVybiBiLmZpcnN0Q2hpbGR9ZnVuY3Rpb24gYm4oYSl7dmFyIGI9KGEubm9kZU5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpO2I9PT0iaW5wdXQiP2JtKGEpOmIhPT0ic2NyaXB0IiYmdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiZmLmdyZXAoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxibSl9ZnVuY3Rpb24gYm0oYSl7aWYoYS50eXBlPT09ImNoZWNrYm94Inx8YS50eXBlPT09InJhZGlvIilhLmRlZmF1bHRDaGVja2VkPWEuY2hlY2tlZH1mdW5jdGlvbiBibChhKXtyZXR1cm4gdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTp0eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsIT0idW5kZWZpbmVkIj9hLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKTpbXX1mdW5jdGlvbiBiayhhLGIpe3ZhciBjO2lmKGIubm9kZVR5cGU9PT0xKXtiLmNsZWFyQXR0cmlidXRlcyYmYi5jbGVhckF0dHJpYnV0ZXMoKSxiLm1lcmdlQXR0cmlidXRlcyYmYi5tZXJnZUF0dHJpYnV0ZXMoYSksYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoYz09PSJvYmplY3QiKWIub3V0ZXJIVE1MPWEub3V0ZXJIVE1MO2Vsc2UgaWYoYyE9PSJpbnB1dCJ8fGEudHlwZSE9PSJjaGVja2JveCImJmEudHlwZSE9PSJyYWRpbyIpe2lmKGM9PT0ib3B0aW9uIiliLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkO2Vsc2UgaWYoYz09PSJpbnB1dCJ8fGM9PT0idGV4dGFyZWEiKWIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlfWVsc2UgYS5jaGVja2VkJiYoYi5kZWZhdWx0Q2hlY2tlZD1iLmNoZWNrZWQ9YS5jaGVja2VkKSxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSk7Yi5yZW1vdmVBdHRyaWJ1dGUoZi5leHBhbmRvKX19ZnVuY3Rpb24gYmooYSxiKXtpZihiLm5vZGVUeXBlPT09MSYmISFmLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxnPWYuX2RhdGEoYSksaD1mLl9kYXRhKGIsZyksaT1nLmV2ZW50cztpZihpKXtkZWxldGUgaC5oYW5kbGUsaC5ldmVudHM9e307Zm9yKGMgaW4gaSlmb3IoZD0wLGU9aVtjXS5sZW5ndGg7ZDxlO2QrKylmLmV2ZW50LmFkZChiLGMrKGlbY11bZF0ubmFtZXNwYWNlPyIuIjoiIikraVtjXVtkXS5uYW1lc3BhY2UsaVtjXVtkXSxpW2NdW2RdLmRhdGEpfWguZGF0YSYmKGguZGF0YT1mLmV4dGVuZCh7fSxoLmRhdGEpKX19ZnVuY3Rpb24gYmkoYSxiKXtyZXR1cm4gZi5ub2RlTmFtZShhLCJ0YWJsZSIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24gVShhKXt2YXIgYj1WLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfWZ1bmN0aW9uIFQoYSxiLGMpe2I9Ynx8MDtpZihmLmlzRnVuY3Rpb24oYikpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7dmFyIGU9ISFiLmNhbGwoYSxkLGEpO3JldHVybiBlPT09Y30pO2lmKGIubm9kZVR5cGUpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGE9PT1iPT09Y30pO2lmKHR5cGVvZiBiPT0ic3RyaW5nIil7dmFyIGQ9Zi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZVR5cGU9PT0xfSk7aWYoTy50ZXN0KGIpKXJldHVybiBmLmZpbHRlcihiLGQsIWMpO2I9Zi5maWx0ZXIoYixkKX1yZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gZi5pbkFycmF5KGEsYik+PTA9PT1jfSl9ZnVuY3Rpb24gUyhhKXtyZXR1cm4hYXx8IWEucGFyZW50Tm9kZXx8YS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTF9ZnVuY3Rpb24gSygpe3JldHVybiEwfWZ1bmN0aW9uIEooKXtyZXR1cm4hMX1mdW5jdGlvbiBuKGEsYixjKXt2YXIgZD1iKyJkZWZlciIsZT1iKyJxdWV1ZSIsZz1iKyJtYXJrIixoPWYuX2RhdGEoYSxkKTtoJiYoYz09PSJxdWV1ZSJ8fCFmLl9kYXRhKGEsZSkpJiYoYz09PSJtYXJrInx8IWYuX2RhdGEoYSxnKSkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXshZi5fZGF0YShhLGUpJiYhZi5fZGF0YShhLGcpJiYoZi5yZW1vdmVEYXRhKGEsZCwhMCksaC5maXJlKCkpfSwwKX1mdW5jdGlvbiBtKGEpe2Zvcih2YXIgYiBpbiBhKXtpZihiPT09ImRhdGEiJiZmLmlzRW1wdHlPYmplY3QoYVtiXSkpY29udGludWU7aWYoYiE9PSJ0b0pTT04iKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGwoYSxjLGQpe2lmKGQ9PT1iJiZhLm5vZGVUeXBlPT09MSl7dmFyIGU9ImRhdGEtIitjLnJlcGxhY2UoaywiLSQxIikudG9Mb3dlckNhc2UoKTtkPWEuZ2V0QXR0cmlidXRlKGUpO2lmKHR5cGVvZiBkPT0ic3RyaW5nIil7dHJ5e2Q9ZD09PSJ0cnVlIj8hMDpkPT09ImZhbHNlIj8hMTpkPT09Im51bGwiP251bGw6Zi5pc051bWVyaWMoZCk/cGFyc2VGbG9hdChkKTpqLnRlc3QoZCk/Zi5wYXJzZUpTT04oZCk6ZH1jYXRjaChnKXt9Zi5kYXRhKGEsYyxkKX1lbHNlIGQ9Yn1yZXR1cm4gZH1mdW5jdGlvbiBoKGEpe3ZhciBiPWdbYV09e30sYyxkO2E9YS5zcGxpdCgvXHMrLyk7Zm9yKGM9MCxkPWEubGVuZ3RoO2M8ZDtjKyspYlthW2NdXT0hMDtyZXR1cm4gYn12YXIgYz1hLmRvY3VtZW50LGQ9YS5uYXZpZ2F0b3IsZT1hLmxvY2F0aW9uLGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBKKCl7aWYoIWUuaXNSZWFkeSl7dHJ5e2MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7c2V0VGltZW91dChKLDEpO3JldHVybn1lLnJlYWR5KCl9fXZhciBlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBlLmZuLmluaXQoYSxiLGgpfSxmPWEualF1ZXJ5LGc9YS4kLGgsaT0vXig/OlteIzxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKikkKS8saj0vXFMvLGs9L15ccysvLGw9L1xzKyQvLG09L148KFx3KylccypcLz8+KD86PFwvXDE+KT8kLyxuPS9eW1xdLDp7fVxzXSokLyxvPS9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2cscD0vIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2cscT0vKD86Xnw6fCwpKD86XHMqXFspKy9nLHI9Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8scz0vKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8sdD0vKG1zaWUpIChbXHcuXSspLyx1PS8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sdj0vLShbYS16XXxbMC05XSkvaWcsdz0vXi1tcy0vLHg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYisiIikudG9VcHBlckNhc2UoKX0seT1kLnVzZXJBZ2VudCx6LEEsQixDPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsRD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEU9QXJyYXkucHJvdG90eXBlLnB1c2gsRj1BcnJheS5wcm90b3R5cGUuc2xpY2UsRz1TdHJpbmcucHJvdG90eXBlLnRyaW0sSD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZixJPXt9O2UuZm49ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmUsaW5pdDpmdW5jdGlvbihhLGQsZil7dmFyIGcsaCxqLGs7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSl7dGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKGE9PT0iYm9keSImJiFkJiZjLmJvZHkpe3RoaXMuY29udGV4dD1jLHRoaXNbMF09Yy5ib2R5LHRoaXMuc2VsZWN0b3I9YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT0ic3RyaW5nIil7YS5jaGFyQXQoMCkhPT0iPCJ8fGEuY2hhckF0KGEubGVuZ3RoLTEpIT09Ij4ifHxhLmxlbmd0aDwzP2c9aS5leGVjKGEpOmc9W251bGwsYSxudWxsXTtpZihnJiYoZ1sxXXx8IWQpKXtpZihnWzFdKXtkPWQgaW5zdGFuY2VvZiBlP2RbMF06ZCxrPWQ/ZC5vd25lckRvY3VtZW50fHxkOmMsaj1tLmV4ZWMoYSksaj9lLmlzUGxhaW5PYmplY3QoZCk/KGE9W2MuY3JlYXRlRWxlbWVudChqWzFdKV0sZS5mbi5hdHRyLmNhbGwoYSxkLCEwKSk6YT1bay5jcmVhdGVFbGVtZW50KGpbMV0pXTooaj1lLmJ1aWxkRnJhZ21lbnQoW2dbMV1dLFtrXSksYT0oai5jYWNoZWFibGU/ZS5jbG9uZShqLmZyYWdtZW50KTpqLmZyYWdtZW50KS5jaGlsZE5vZGVzKTtyZXR1cm4gZS5tZXJnZSh0aGlzLGEpfWg9Yy5nZXRFbGVtZW50QnlJZChnWzJdKTtpZihoJiZoLnBhcmVudE5vZGUpe2lmKGguaWQhPT1nWzJdKXJldHVybiBmLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWh9dGhpcy5jb250ZXh0PWMsdGhpcy5zZWxlY3Rvcj1hO3JldHVybiB0aGlzfXJldHVybiFkfHxkLmpxdWVyeT8oZHx8ZikuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGQpLmZpbmQoYSl9aWYoZS5pc0Z1bmN0aW9uKGEpKXJldHVybiBmLnJlYWR5KGEpO2Euc2VsZWN0b3IhPT1iJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpO3JldHVybiBlLm1ha2VBcnJheShhLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNy4xIixsZW5ndGg6MCxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIEYuY2FsbCh0aGlzLDApfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/dGhpcy50b0FycmF5KCk6YTwwP3RoaXNbdGhpcy5sZW5ndGgrYV06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLmNvbnN0cnVjdG9yKCk7ZS5pc0FycmF5KGEpP0UuYXBwbHkoZCxhKTplLm1lcmdlKGQsYSksZC5wcmV2T2JqZWN0PXRoaXMsZC5jb250ZXh0PXRoaXMuY29udGV4dCxiPT09ImZpbmQiP2Quc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK2M6YiYmKGQuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrYisiKCIrYysiKSIpO3JldHVybiBkfSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGUuZWFjaCh0aGlzLGEsYil9LHJlYWR5OmZ1bmN0aW9uKGEpe2UuYmluZFJlYWR5KCksQS5hZGQoYSk7cmV0dXJuIHRoaXN9LGVxOmZ1bmN0aW9uKGEpe2E9K2E7cmV0dXJuIGE9PT0tMT90aGlzLnNsaWNlKGEpOnRoaXMuc2xpY2UoYSxhKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhGLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLEYuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOkUsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LGUuZm4uaW5pdC5wcm90b3R5cGU9ZS5mbixlLmV4dGVuZD1lLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGMsZCxmLGcsaCxpPWFyZ3VtZW50c1swXXx8e30saj0xLGs9YXJndW1lbnRzLmxlbmd0aCxsPSExO3R5cGVvZiBpPT0iYm9vbGVhbiImJihsPWksaT1hcmd1bWVudHNbMV18fHt9LGo9MiksdHlwZW9mIGkhPSJvYmplY3QiJiYhZS5pc0Z1bmN0aW9uKGkpJiYoaT17fSksaz09PWomJihpPXRoaXMsLS1qKTtmb3IoO2o8aztqKyspaWYoKGE9YXJndW1lbnRzW2pdKSE9bnVsbClmb3IoYyBpbiBhKXtkPWlbY10sZj1hW2NdO2lmKGk9PT1mKWNvbnRpbnVlO2wmJmYmJihlLmlzUGxhaW5PYmplY3QoZil8fChnPWUuaXNBcnJheShmKSkpPyhnPyhnPSExLGg9ZCYmZS5pc0FycmF5KGQpP2Q6W10pOmg9ZCYmZS5pc1BsYWluT2JqZWN0KGQpP2Q6e30saVtjXT1lLmV4dGVuZChsLGgsZikpOmYhPT1iJiYoaVtjXT1mKX1yZXR1cm4gaX0sZS5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYil7YS4kPT09ZSYmKGEuJD1nKSxiJiZhLmpRdWVyeT09PWUmJihhLmpRdWVyeT1mKTtyZXR1cm4gZX0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9lLnJlYWR5V2FpdCsrOmUucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITAmJiEtLWUucmVhZHlXYWl0fHxhIT09ITAmJiFlLmlzUmVhZHkpe2lmKCFjLmJvZHkpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtlLmlzUmVhZHk9ITA7aWYoYSE9PSEwJiYtLWUucmVhZHlXYWl0PjApcmV0dXJuO0EuZmlyZVdpdGgoYyxbZV0pLGUuZm4udHJpZ2dlciYmZShjKS50cmlnZ2VyKCJyZWFkeSIpLm9mZigicmVhZHkiKX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCFBKXtBPWUuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpO2lmKGMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtpZihjLmFkZEV2ZW50TGlzdGVuZXIpYy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUucmVhZHksITEpO2Vsc2UgaWYoYy5hdHRhY2hFdmVudCl7Yy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGUucmVhZHkpO3ZhciBiPSExO3RyeXtiPWEuZnJhbWVFbGVtZW50PT1udWxsfWNhdGNoKGQpe31jLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYiYmSigpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZ0eXBlb2YgYT09Im9iamVjdCImJiJzZXRJbnRlcnZhbCJpbiBhfSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoYSkpJiZpc0Zpbml0ZShhKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD9TdHJpbmcoYSk6SVtDLmNhbGwoYSldfHwib2JqZWN0In0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXtpZighYXx8ZS50eXBlKGEpIT09Im9iamVjdCJ8fGEubm9kZVR5cGV8fGUuaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFELmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIUQuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfXZhciBkO2ZvcihkIGluIGEpO3JldHVybiBkPT09Ynx8RC5jYWxsKGEsZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcihhKX0scGFyc2VKU09OOmZ1bmN0aW9uKGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nInx8IWIpcmV0dXJuIG51bGw7Yj1lLnRyaW0oYik7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKTtpZihuLnRlc3QoYi5yZXBsYWNlKG8sIkAiKS5yZXBsYWNlKHAsIl0iKS5yZXBsYWNlKHEsIiIpKSlyZXR1cm4obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiKSkoKTtlLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LHBhcnNlWE1MOmZ1bmN0aW9uKGMpe3ZhciBkLGY7dHJ5e2EuRE9NUGFyc2VyPyhmPW5ldyBET01QYXJzZXIsZD1mLnBhcnNlRnJvbVN0cmluZyhjLCJ0ZXh0L3htbCIpKTooZD1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGQuYXN5bmM9ImZhbHNlIixkLmxvYWRYTUwoYykpfWNhdGNoKGcpe2Q9Yn0oIWR8fCFkLmRvY3VtZW50RWxlbWVudHx8ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZlLmVycm9yKCJJbnZhbGlkIFhNTDogIitjKTtyZXR1cm4gZH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZqLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UodywibXMtIikucmVwbGFjZSh2LHgpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGc9MCxoPWEubGVuZ3RoLGk9aD09PWJ8fGUuaXNGdW5jdGlvbihhKTtpZihkKXtpZihpKXtmb3IoZiBpbiBhKWlmKGMuYXBwbHkoYVtmXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuYXBwbHkoYVtnKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihpKXtmb3IoZiBpbiBhKWlmKGMuY2FsbChhW2ZdLGYsYVtmXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmNhbGwoYVtnXSxnLGFbZysrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpHP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOkcuY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6KGErIiIpLnJlcGxhY2UoaywiIikucmVwbGFjZShsLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107aWYoYSE9bnVsbCl7dmFyIGQ9ZS50eXBlKGEpO2EubGVuZ3RoPT1udWxsfHxkPT09InN0cmluZyJ8fGQ9PT0iZnVuY3Rpb24ifHxkPT09InJlZ2V4cCJ8fGUuaXNXaW5kb3coYSk/RS5jYWxsKGMsYSk6ZS5tZXJnZShjLGEpfXJldHVybiBjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihIKXJldHVybiBILmNhbGwoYixhLGMpO2Q9Yi5sZW5ndGgsYz1jP2M8MD9NYXRoLm1heCgwLGQrYyk6YzowO2Zvcig7YzxkO2MrKylpZihjIGluIGImJmJbY109PT1hKXJldHVybiBjfXJldHVybi0xfSxtZXJnZTpmdW5jdGlvbihhLGMpe3ZhciBkPWEubGVuZ3RoLGU9MDtpZih0eXBlb2YgYy5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZj1jLmxlbmd0aDtlPGY7ZSsrKWFbZCsrXT1jW2VdO2Vsc2Ugd2hpbGUoY1tlXSE9PWIpYVtkKytdPWNbZSsrXTthLmxlbmd0aD1kO3JldHVybiBhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlO2M9ISFjO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllPSEhYihhW2ZdLGYpLGMhPT1lJiZkLnB1c2goYVtmXSk7cmV0dXJuIGR9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoPVtdLGk9MCxqPWEubGVuZ3RoLGs9YSBpbnN0YW5jZW9mIGV8fGohPT1iJiZ0eXBlb2Ygaj09Im51bWJlciImJihqPjAmJmFbMF0mJmFbai0xXXx8aj09PTB8fGUuaXNBcnJheShhKSk7aWYoaylmb3IoO2k8ajtpKyspZj1jKGFbaV0saSxkKSxmIT1udWxsJiYoaFtoLmxlbmd0aF09Zik7ZWxzZSBmb3IoZyBpbiBhKWY9YyhhW2ddLGcsZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO3JldHVybiBoLmNvbmNhdC5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7aWYodHlwZW9mIGM9PSJzdHJpbmciKXt2YXIgZD1hW2NdO2M9YSxhPWR9aWYoIWUuaXNGdW5jdGlvbihhKSlyZXR1cm4gYjt2YXIgZj1GLmNhbGwoYXJndW1lbnRzLDIpLGc9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShjLGYuY29uY2F0KEYuY2FsbChhcmd1bWVudHMpKSl9O2cuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxnLmd1aWR8fGUuZ3VpZCsrO3JldHVybiBnfSxhY2Nlc3M6ZnVuY3Rpb24oYSxjLGQsZixnLGgpe3ZhciBpPWEubGVuZ3RoO2lmKHR5cGVvZiBjPT0ib2JqZWN0Iil7Zm9yKHZhciBqIGluIGMpZS5hY2Nlc3MoYSxqLGNbal0sZixnLGQpO3JldHVybiBhfWlmKGQhPT1iKXtmPSFoJiZmJiZlLmlzRnVuY3Rpb24oZCk7Zm9yKHZhciBrPTA7azxpO2srKylnKGFba10sYyxmP2QuY2FsbChhW2tdLGssZyhhW2tdLGMpKTpkLGgpO3JldHVybiBhfXJldHVybiBpP2coYVswXSxjKTpifSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihhKXthPWEudG9Mb3dlckNhc2UoKTt2YXIgYj1yLmV4ZWMoYSl8fHMuZXhlYyhhKXx8dC5leGVjKGEpfHxhLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiZ1LmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmJbMV18fCIiLHZlcnNpb246YlsyXXx8IjAifX0sc3ViOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMpe3JldHVybiBuZXcgYS5mbi5pbml0KGIsYyl9ZS5leHRlbmQoITAsYSx0aGlzKSxhLnN1cGVyY2xhc3M9dGhpcyxhLmZuPWEucHJvdG90eXBlPXRoaXMoKSxhLmZuLmNvbnN0cnVjdG9yPWEsYS5zdWI9dGhpcy5zdWIsYS5mbi5pbml0PWZ1bmN0aW9uKGQsZil7ZiYmZiBpbnN0YW5jZW9mIGUmJiEoZiBpbnN0YW5jZW9mIGEpJiYoZj1hKGYpKTtyZXR1cm4gZS5mbi5pbml0LmNhbGwodGhpcyxkLGYsYil9LGEuZm4uaW5pdC5wcm90b3R5cGU9YS5mbjt2YXIgYj1hKGMpO3JldHVybiBhfSxicm93c2VyOnt9fSksZS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7SVsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KSx6PWUudWFNYXRjaCh5KSx6LmJyb3dzZXImJihlLmJyb3dzZXJbei5icm93c2VyXT0hMCxlLmJyb3dzZXIudmVyc2lvbj16LnZlcnNpb24pLGUuYnJvd3Nlci53ZWJraXQmJihlLmJyb3dzZXIuc2FmYXJpPSEwKSxqLnRlc3QoIiAiKSYmKGs9L15bXHNceEEwXSsvLGw9L1tcc1x4QTBdKyQvKSxoPWUoYyksYy5hZGRFdmVudExpc3RlbmVyP0I9ZnVuY3Rpb24oKXtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIsITEpLGUucmVhZHkoKX06Yy5hdHRhY2hFdmVudCYmKEI9ZnVuY3Rpb24oKXtjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiJiYoYy5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxlLnJlYWR5KCkpfSk7cmV0dXJuIGV9KCksZz17fTtmLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPWE/Z1thXXx8aChhKTp7fTt2YXIgYz1bXSxkPVtdLGUsaSxqLGssbCxtPWZ1bmN0aW9uKGIpe3ZhciBkLGUsZyxoLGk7Zm9yKGQ9MCxlPWIubGVuZ3RoO2Q8ZTtkKyspZz1iW2RdLGg9Zi50eXBlKGcpLGg9PT0iYXJyYXkiP20oZyk6aD09PSJmdW5jdGlvbiImJighYS51bmlxdWV8fCFvLmhhcyhnKSkmJmMucHVzaChnKX0sbj1mdW5jdGlvbihiLGYpe2Y9Znx8W10sZT0hYS5tZW1vcnl8fFtiLGZdLGk9ITAsbD1qfHwwLGo9MCxrPWMubGVuZ3RoO2Zvcig7YyYmbDxrO2wrKylpZihjW2xdLmFwcGx5KGIsZik9PT0hMSYmYS5zdG9wT25GYWxzZSl7ZT0hMDticmVha31pPSExLGMmJihhLm9uY2U/ZT09PSEwP28uZGlzYWJsZSgpOmM9W106ZCYmZC5sZW5ndGgmJihlPWQuc2hpZnQoKSxvLmZpcmVXaXRoKGVbMF0sZVsxXSkpKX0sbz17YWRkOmZ1bmN0aW9uKCl7aWYoYyl7dmFyIGE9Yy5sZW5ndGg7bShhcmd1bWVudHMpLGk/az1jLmxlbmd0aDplJiZlIT09ITAmJihqPWEsbihlWzBdLGVbMV0pKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7aWYoYyl7dmFyIGI9YXJndW1lbnRzLGQ9MCxlPWIubGVuZ3RoO2Zvcig7ZDxlO2QrKylmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKylpZihiW2RdPT09Y1tmXSl7aSYmZjw9ayYmKGstLSxmPD1sJiZsLS0pLGMuc3BsaWNlKGYtLSwxKTtpZihhLnVuaXF1ZSlicmVha319cmV0dXJuIHRoaXN9LGhhczpmdW5jdGlvbihhKXtpZihjKXt2YXIgYj0wLGQ9Yy5sZW5ndGg7Zm9yKDtiPGQ7YisrKWlmKGE9PT1jW2JdKXJldHVybiEwfXJldHVybiExfSxlbXB0eTpmdW5jdGlvbigpe2M9W107cmV0dXJuIHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtjPWQ9ZT1iO3JldHVybiB0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFjfSxsb2NrOmZ1bmN0aW9uKCl7ZD1iLCghZXx8ZT09PSEwKSYmby5kaXNhYmxlKCk7cmV0dXJuIHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFkfSxmaXJlV2l0aDpmdW5jdGlvbihiLGMpe2QmJihpP2Eub25jZXx8ZC5wdXNoKFtiLGNdKTooIWEub25jZXx8IWUpJiZuKGIsYykpO3JldHVybiB0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7by5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFlfX07cmV0dXJuIG99O3ZhciBpPVtdLnNsaWNlO2YuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxjPWYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGQ9Zi5DYWxsYmFja3MoIm1lbW9yeSIpLGU9InBlbmRpbmciLGc9e3Jlc29sdmU6YixyZWplY3Q6Yyxub3RpZnk6ZH0saD17ZG9uZTpiLmFkZCxmYWlsOmMuYWRkLHByb2dyZXNzOmQuYWRkLHN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGV9LGlzUmVzb2x2ZWQ6Yi5maXJlZCxpc1JlamVjdGVkOmMuZmlyZWQsdGhlbjpmdW5jdGlvbihhLGIsYyl7aS5kb25lKGEpLmZhaWwoYikucHJvZ3Jlc3MoYyk7cmV0dXJuIHRoaXN9LGFsd2F5czpmdW5jdGlvbigpe2kuZG9uZS5hcHBseShpLGFyZ3VtZW50cykuZmFpbC5hcHBseShpLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LHBpcGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLkRlZmVycmVkKGZ1bmN0aW9uKGQpe2YuZWFjaCh7ZG9uZTpbYSwicmVzb2x2ZSJdLGZhaWw6W2IsInJlamVjdCJdLHByb2dyZXNzOltjLCJub3RpZnkiXX0sZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzBdLGU9YlsxXSxnO2YuaXNGdW5jdGlvbihjKT9pW2FdKGZ1bmN0aW9uKCl7Zz1jLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnJiZmLmlzRnVuY3Rpb24oZy5wcm9taXNlKT9nLnByb21pc2UoKS50aGVuKGQucmVzb2x2ZSxkLnJlamVjdCxkLm5vdGlmeSk6ZFtlKyJXaXRoIl0odGhpcz09PWk/ZDp0aGlzLFtnXSl9KTppW2FdKGRbZV0pfSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClhPWg7ZWxzZSBmb3IodmFyIGIgaW4gaClhW2JdPWhbYl07cmV0dXJuIGF9fSxpPWgucHJvbWlzZSh7fSksajtmb3IoaiBpbiBnKWlbal09Z1tqXS5maXJlLGlbaisiV2l0aCJdPWdbal0uZmlyZVdpdGg7aS5kb25lKGZ1bmN0aW9uKCl7ZT0icmVzb2x2ZWQifSxjLmRpc2FibGUsZC5sb2NrKS5mYWlsKGZ1bmN0aW9uKCl7ZT0icmVqZWN0ZWQifSxiLmRpc2FibGUsZC5sb2NrKSxhJiZhLmNhbGwoaSxpKTtyZXR1cm4gaX0sd2hlbjpmdW5jdGlvbihhKXtmdW5jdGlvbiBtKGEpe3JldHVybiBmdW5jdGlvbihiKXtlW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9pLmNhbGwoYXJndW1lbnRzLDApOmIsai5ub3RpZnlXaXRoKGssZSl9fWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGZ1bmN0aW9uKGMpe2JbYV09YXJndW1lbnRzLmxlbmd0aD4xP2kuY2FsbChhcmd1bWVudHMsMCk6YywtLWd8fGoucmVzb2x2ZVdpdGgoaixiKX19dmFyIGI9aS5jYWxsKGFyZ3VtZW50cywwKSxjPTAsZD1iLmxlbmd0aCxlPUFycmF5KGQpLGc9ZCxoPWQsaj1kPD0xJiZhJiZmLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hOmYuRGVmZXJyZWQoKSxrPWoucHJvbWlzZSgpO2lmKGQ+MSl7Zm9yKDtjPGQ7YysrKWJbY10mJmJbY10ucHJvbWlzZSYmZi5pc0Z1bmN0aW9uKGJbY10ucHJvbWlzZSk/YltjXS5wcm9taXNlKCkudGhlbihsKGMpLGoucmVqZWN0LG0oYykpOi0tZztnfHxqLnJlc29sdmVXaXRoKGosYil9ZWxzZSBqIT09YSYmai5yZXNvbHZlV2l0aChqLGQ/W2FdOltdKTtyZXR1cm4ga319KSxmLnN1cHBvcnQ9ZnVuY3Rpb24oKXt2YXIgYixkLGUsZyxoLGksaixrLGwsbSxuLG8scCxxPWMuY3JlYXRlRWxlbWVudCgiZGl2Iikscj1jLmRvY3VtZW50RWxlbWVudDtxLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLHEuaW5uZXJIVE1MPSIgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnIHN0eWxlPSd0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksZT1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07aWYoIWR8fCFkLmxlbmd0aHx8IWUpcmV0dXJue307Zz1jLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGg9Zy5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxpPXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0sYj17bGVhZGluZ1doaXRlc3BhY2U6cS5maXJzdENoaWxkLm5vZGVUeXBlPT09Myx0Ym9keTohcS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3RvcC8udGVzdChlLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIvYSIsb3BhY2l0eTovXjAuNTUvLnRlc3QoZS5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWUuc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjppLnZhbHVlPT09Im9uIixvcHRTZWxlY3RlZDpoLnNlbGVjdGVkLGdldFNldEF0dHJpYnV0ZTpxLmNsYXNzTmFtZSE9PSJ0IixlbmN0eXBlOiEhYy5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSxodG1sNUNsb25lOmMuY3JlYXRlRWxlbWVudCgibmF2IikuY2xvbmVOb2RlKCEwKS5vdXRlckhUTUwhPT0iPDpuYXY+PC86bmF2PiIsc3VibWl0QnViYmxlczohMCxjaGFuZ2VCdWJibGVzOiEwLGZvY3VzaW5CdWJibGVzOiExLGRlbGV0ZUV4cGFuZG86ITAsbm9DbG9uZUV2ZW50OiEwLGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6ITEsc2hyaW5rV3JhcEJsb2NrczohMSxyZWxpYWJsZU1hcmdpblJpZ2h0OiEwfSxpLmNoZWNrZWQ9ITAsYi5ub0Nsb25lQ2hlY2tlZD1pLmNsb25lTm9kZSghMCkuY2hlY2tlZCxnLmRpc2FibGVkPSEwLGIub3B0RGlzYWJsZWQ9IWguZGlzYWJsZWQ7dHJ5e2RlbGV0ZSBxLnRlc3R9Y2F0Y2gocyl7Yi5kZWxldGVFeHBhbmRvPSExfSFxLmFkZEV2ZW50TGlzdGVuZXImJnEuYXR0YWNoRXZlbnQmJnEuZmlyZUV2ZW50JiYocS5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24oKXtiLm5vQ2xvbmVFdmVudD0hMX0pLHEuY2xvbmVOb2RlKCEwKS5maXJlRXZlbnQoIm9uY2xpY2siKSksaT1jLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksaS52YWx1ZT0idCIsaS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGIucmFkaW9WYWx1ZT1pLnZhbHVlPT09InQiLGkuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLHEuYXBwZW5kQ2hpbGQoaSksaz1jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxrLmFwcGVuZENoaWxkKHEubGFzdENoaWxkKSxiLmNoZWNrQ2xvbmU9ay5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYi5hcHBlbmRDaGVja2VkPWkuY2hlY2tlZCxrLnJlbW92ZUNoaWxkKGkpLGsuYXBwZW5kQ2hpbGQocSkscS5pbm5lckhUTUw9IiIsYS5nZXRDb21wdXRlZFN0eWxlJiYoaj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGouc3R5bGUud2lkdGg9IjAiLGouc3R5bGUubWFyZ2luUmlnaHQ9IjAiLHEuc3R5bGUud2lkdGg9IjJweCIscS5hcHBlbmRDaGlsZChqKSxiLnJlbGlhYmxlTWFyZ2luUmlnaHQ9KHBhcnNlSW50KChhLmdldENvbXB1dGVkU3R5bGUoaixudWxsKXx8e21hcmdpblJpZ2h0OjB9KS5tYXJnaW5SaWdodCwxMCl8fDApPT09MCk7aWYocS5hdHRhY2hFdmVudClmb3IobyBpbntzdWJtaXQ6MSxjaGFuZ2U6MSxmb2N1c2luOjF9KW49Im9uIitvLHA9biBpbiBxLHB8fChxLnNldEF0dHJpYnV0ZShuLCJyZXR1cm47IikscD10eXBlb2YgcVtuXT09ImZ1bmN0aW9uIiksYltvKyJCdWJibGVzIl09cDtrLnJlbW92ZUNoaWxkKHEpLGs9Zz1oPWo9cT1pPW51bGwsZihmdW5jdGlvbigpe3ZhciBhLGQsZSxnLGgsaSxqLGssbSxuLG8scj1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07IXJ8fChqPTEsaz0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjFweDtoZWlnaHQ6MXB4O21hcmdpbjowOyIsbT0idmlzaWJpbGl0eTpoaWRkZW47Ym9yZGVyOjA7IixuPSJzdHlsZT0nIitrKyJib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowOyciLG89IjxkaXYgIituKyI+PGRpdj48L2Rpdj48L2Rpdj4iKyI8dGFibGUgIituKyIgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz4iKyI8dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiIsYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGEuc3R5bGUuY3NzVGV4dD1tKyJ3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOnN0YXRpYzt0b3A6MDttYXJnaW4tdG9wOiIraisicHgiLHIuaW5zZXJ0QmVmb3JlKGEsci5maXJzdENoaWxkKSxxPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksYS5hcHBlbmRDaGlsZChxKSxxLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQgc3R5bGU9J3BhZGRpbmc6MDtib3JkZXI6MDtkaXNwbGF5Om5vbmUnPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGw9cS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxwPWxbMF0ub2Zmc2V0SGVpZ2h0PT09MCxsWzBdLnN0eWxlLmRpc3BsYXk9IiIsbFsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixiLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cz1wJiZsWzBdLm9mZnNldEhlaWdodD09PTAscS5pbm5lckhUTUw9IiIscS5zdHlsZS53aWR0aD1xLnN0eWxlLnBhZGRpbmdMZWZ0PSIxcHgiLGYuYm94TW9kZWw9Yi5ib3hNb2RlbD1xLm9mZnNldFdpZHRoPT09Mix0eXBlb2YgcS5zdHlsZS56b29tIT0idW5kZWZpbmVkIiYmKHEuc3R5bGUuZGlzcGxheT0iaW5saW5lIixxLnN0eWxlLnpvb209MSxiLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9cS5vZmZzZXRXaWR0aD09PTIscS5zdHlsZS5kaXNwbGF5PSIiLHEuaW5uZXJIVE1MPSI8ZGl2IHN0eWxlPSd3aWR0aDo0cHg7Jz48L2Rpdj4iLGIuc2hyaW5rV3JhcEJsb2Nrcz1xLm9mZnNldFdpZHRoIT09MikscS5zdHlsZS5jc3NUZXh0PWsrbSxxLmlubmVySFRNTD1vLGQ9cS5maXJzdENoaWxkLGU9ZC5maXJzdENoaWxkLGg9ZC5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQsaT17ZG9lc05vdEFkZEJvcmRlcjplLm9mZnNldFRvcCE9PTUsZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHM6aC5vZmZzZXRUb3A9PT01fSxlLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsZS5zdHlsZS50b3A9IjIwcHgiLGkuZml4ZWRQb3NpdGlvbj1lLm9mZnNldFRvcD09PTIwfHxlLm9mZnNldFRvcD09PTE1LGUuc3R5bGUucG9zaXRpb249ZS5zdHlsZS50b3A9IiIsZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaS5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9ZS5vZmZzZXRUb3A9PT0tNSxpLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PXIub2Zmc2V0VG9wIT09aixyLnJlbW92ZUNoaWxkKGEpLHE9YT1udWxsLGYuZXh0ZW5kKGIsaSkpfSk7cmV0dXJuIGJ9KCk7dmFyIGo9L14oPzpcey4qXH18XFsuKlxdKSQvLGs9LyhbQS1aXSkvZztmLmV4dGVuZCh7Y2FjaGU6e30sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrKGYuZm4uanF1ZXJ5K01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vRGF0YTp7ZW1iZWQ6ITAsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDohMH0saGFzRGF0YTpmdW5jdGlvbihhKXthPWEubm9kZVR5cGU/Zi5jYWNoZVthW2YuZXhwYW5kb11dOmFbZi5leHBhbmRvXTtyZXR1cm4hIWEmJiFtKGEpfSxkYXRhOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKCEhZi5hY2NlcHREYXRhKGEpKXt2YXIgZyxoLGksaj1mLmV4cGFuZG8saz10eXBlb2YgYz09InN0cmluZyIsbD1hLm5vZGVUeXBlLG09bD9mLmNhY2hlOmEsbj1sP2Fbal06YVtqXSYmaixvPWM9PT0iZXZlbnRzIjtpZigoIW58fCFtW25dfHwhbyYmIWUmJiFtW25dLmRhdGEpJiZrJiZkPT09YilyZXR1cm47bnx8KGw/YVtqXT1uPSsrZi51dWlkOm49aiksbVtuXXx8KG1bbl09e30sbHx8KG1bbl0udG9KU09OPWYubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9tW25dPWYuZXh0ZW5kKG1bbl0sYyk6bVtuXS5kYXRhPWYuZXh0ZW5kKG1bbl0uZGF0YSxjKTtnPWg9bVtuXSxlfHwoaC5kYXRhfHwoaC5kYXRhPXt9KSxoPWguZGF0YSksZCE9PWImJihoW2YuY2FtZWxDYXNlKGMpXT1kKTtpZihvJiYhaFtjXSlyZXR1cm4gZy5ldmVudHM7az8oaT1oW2NdLGk9PW51bGwmJihpPWhbZi5jYW1lbENhc2UoYyldKSk6aT1oO3JldHVybiBpfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIsYyl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBkLGUsZyxoPWYuZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP2YuY2FjaGU6YSxrPWk/YVtoXTpoO2lmKCFqW2tdKXJldHVybjtpZihiKXtkPWM/altrXTpqW2tdLmRhdGE7aWYoZCl7Zi5pc0FycmF5KGIpfHwoYiBpbiBkP2I9W2JdOihiPWYuY2FtZWxDYXNlKGIpLGIgaW4gZD9iPVtiXTpiPWIuc3BsaXQoIiAiKSkpO2ZvcihlPTAsZz1iLmxlbmd0aDtlPGc7ZSsrKWRlbGV0ZSBkW2JbZV1dO2lmKCEoYz9tOmYuaXNFbXB0eU9iamVjdCkoZCkpcmV0dXJufX1pZighYyl7ZGVsZXRlIGpba10uZGF0YTtpZighbShqW2tdKSlyZXR1cm59Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG98fCFqLnNldEludGVydmFsP2RlbGV0ZSBqW2tdOmpba109bnVsbCxpJiYoZi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8/ZGVsZXRlIGFbaF06YS5yZW1vdmVBdHRyaWJ1dGU/YS5yZW1vdmVBdHRyaWJ1dGUoaCk6YVtoXT1udWxsKX19LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kYXRhKGEsYixjLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihhKXtpZihhLm5vZGVOYW1lKXt2YXIgYj1mLm5vRGF0YVthLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKGIpcmV0dXJuIGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9cmV0dXJuITB9fSksZi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGcsaD1udWxsO2lmKHR5cGVvZiBhPT0idW5kZWZpbmVkIil7aWYodGhpcy5sZW5ndGgpe2g9Zi5kYXRhKHRoaXNbMF0pO2lmKHRoaXNbMF0ubm9kZVR5cGU9PT0xJiYhZi5fZGF0YSh0aGlzWzBdLCJwYXJzZWRBdHRycyIpKXtlPXRoaXNbMF0uYXR0cmlidXRlcztmb3IodmFyIGk9MCxqPWUubGVuZ3RoO2k8ajtpKyspZz1lW2ldLm5hbWUsZy5pbmRleE9mKCJkYXRhLSIpPT09MCYmKGc9Zi5jYW1lbENhc2UoZy5zdWJzdHJpbmcoNSkpLGwodGhpc1swXSxnLGhbZ10pKTtmLl9kYXRhKHRoaXNbMF0sInBhcnNlZEF0dHJzIiwhMCl9fXJldHVybiBofWlmKHR5cGVvZiBhPT0ib2JqZWN0IilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kYXRhKHRoaXMsYSl9KTtkPWEuc3BsaXQoIi4iKSxkWzFdPWRbMV0/Ii4iK2RbMV06IiI7aWYoYz09PWIpe2g9dGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIrZFsxXSsiISIsW2RbMF1dKSxoPT09YiYmdGhpcy5sZW5ndGgmJihoPWYuZGF0YSh0aGlzWzBdLGEpLGg9bCh0aGlzWzBdLGEsaCkpO3JldHVybiBoPT09YiYmZFsxXT90aGlzLmRhdGEoZFswXSk6aH1yZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxlPVtkWzBdLGNdO2IudHJpZ2dlckhhbmRsZXIoInNldERhdGEiK2RbMV0rIiEiLGUpLGYuZGF0YSh0aGlzLGEsYyksYi50cmlnZ2VySGFuZGxlcigiY2hhbmdlRGF0YSIrZFsxXSsiISIsZSl9KX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5yZW1vdmVEYXRhKHRoaXMsYSl9KX19KSxmLmV4dGVuZCh7X21hcms6ZnVuY3Rpb24oYSxiKXthJiYoYj0oYnx8ImZ4IikrIm1hcmsiLGYuX2RhdGEoYSxiLChmLl9kYXRhKGEsYil8fDApKzEpKX0sX3VubWFyazpmdW5jdGlvbihhLGIsYyl7YSE9PSEwJiYoYz1iLGI9YSxhPSExKTtpZihiKXtjPWN8fCJmeCI7dmFyIGQ9YysibWFyayIsZT1hPzA6KGYuX2RhdGEoYixkKXx8MSktMTtlP2YuX2RhdGEoYixkLGUpOihmLnJlbW92ZURhdGEoYixkLCEwKSxuKGIsYywibWFyayIpKX19LHF1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihhKXtiPShifHwiZngiKSsicXVldWUiLGQ9Zi5fZGF0YShhLGIpLGMmJighZHx8Zi5pc0FycmF5KGMpP2Q9Zi5fZGF0YShhLGIsZi5tYWtlQXJyYXkoYykpOmQucHVzaChjKSk7cmV0dXJuIGR8fFtdfX0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1mLnF1ZXVlKGEsYiksZD1jLnNoaWZ0KCksZT17fTtkPT09ImlucHJvZ3Jlc3MiJiYoZD1jLnNoaWZ0KCkpLGQmJihiPT09ImZ4IiYmYy51bnNoaWZ0KCJpbnByb2dyZXNzIiksZi5fZGF0YShhLGIrIi5ydW4iLGUpLGQuY2FsbChhLGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKGEsYil9LGUpKSxjLmxlbmd0aHx8KGYucmVtb3ZlRGF0YShhLGIrInF1ZXVlICIrYisiLnJ1biIsITApLG4oYSxiLCJxdWV1ZSIpKX19KSxmLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxjKXt0eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT0iZngiKTtpZihjPT09YilyZXR1cm4gZi5xdWV1ZSh0aGlzWzBdLGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mLnF1ZXVlKHRoaXMsYSxjKTthPT09ImZ4IiYmYlswXSE9PSJpbnByb2dyZXNzIiYmZi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVsYXk6ZnVuY3Rpb24oYSxiKXthPWYuZng/Zi5meC5zcGVlZHNbYV18fGE6YSxiPWJ8fCJmeCI7cmV0dXJuIHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBtKCl7LS1ofHxkLnJlc29sdmVXaXRoKGUsW2VdKX10eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT1iKSxhPWF8fCJmeCI7dmFyIGQ9Zi5EZWZlcnJlZCgpLGU9dGhpcyxnPWUubGVuZ3RoLGg9MSxpPWErImRlZmVyIixqPWErInF1ZXVlIixrPWErIm1hcmsiLGw7d2hpbGUoZy0tKWlmKGw9Zi5kYXRhKGVbZ10saSxiLCEwKXx8KGYuZGF0YShlW2ddLGosYiwhMCl8fGYuZGF0YShlW2ddLGssYiwhMCkpJiZmLmRhdGEoZVtnXSxpLGYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCEwKSloKyssbC5hZGQobSk7bSgpO3JldHVybiBkLnByb21pc2UoKX19KTt2YXIgbz0vW1xuXHRccl0vZyxwPS9ccysvLHE9L1xyL2cscj0vXig/OmJ1dHRvbnxpbnB1dCkkL2kscz0vXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSx0PS9eYSg/OnJlYSk/JC9pLHU9L14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksdj1mLnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlLHcseCx5O2YuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGYuYWNjZXNzKHRoaXMsYSxiLCEwLGYuYXR0cil9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlQXR0cih0aGlzLGEpfSl9LHByb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGIsITAsZi5wcm9wKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXthPWYucHJvcEZpeFthXXx8YTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09YixkZWxldGUgdGhpc1thXX1jYXRjaChjKXt9fSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGcsaCxpO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmciKXtiPWEuc3BsaXQocCk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2U9dGhpc1tjXTtpZihlLm5vZGVUeXBlPT09MSlpZighZS5jbGFzc05hbWUmJmIubGVuZ3RoPT09MSllLmNsYXNzTmFtZT1hO2Vsc2V7Zz0iICIrZS5jbGFzc05hbWUrIiAiO2ZvcihoPTAsaT1iLmxlbmd0aDtoPGk7aCsrKX5nLmluZGV4T2YoIiAiK2JbaF0rIiAiKXx8KGcrPWJbaF0rIiAiKTtlLmNsYXNzTmFtZT1mLnRyaW0oZyl9fX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGMsZCxlLGcsaCxpLGo7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyJ8fGE9PT1iKXtjPShhfHwiIikuc3BsaXQocCk7Zm9yKGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe2c9dGhpc1tkXTtpZihnLm5vZGVUeXBlPT09MSYmZy5jbGFzc05hbWUpaWYoYSl7aD0oIiAiK2cuY2xhc3NOYW1lKyIgIikucmVwbGFjZShvLCIgIik7Zm9yKGk9MCxqPWMubGVuZ3RoO2k8ajtpKyspaD1oLnJlcGxhY2UoIiAiK2NbaV0rIiAiLCIgIik7Zy5jbGFzc05hbWU9Zi50cmltKGgpfWVsc2UgZy5jbGFzc05hbWU9IiJ9fXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhLGQ9dHlwZW9mIGI9PSJib29sZWFuIjtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoYz09PSJzdHJpbmciKXt2YXIgZSxnPTAsaD1mKHRoaXMpLGk9YixqPWEuc3BsaXQocCk7d2hpbGUoZT1qW2crK10paT1kP2k6IWguaGFzQ2xhc3MoZSksaFtpPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oZSl9ZWxzZSBpZihjPT09InVuZGVmaW5lZCJ8fGM9PT0iYm9vbGVhbiIpdGhpcy5jbGFzc05hbWUmJmYuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxhPT09ITE/IiI6Zi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIifSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiPSIgIithKyIgIixjPTAsZD10aGlzLmxlbmd0aDtmb3IoO2M8ZDtjKyspaWYodGhpc1tjXS5ub2RlVHlwZT09PTEmJigiICIrdGhpc1tjXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKG8sIiAiKS5pbmRleE9mKGIpPi0xKXJldHVybiEwO3JldHVybiExfSx2YWw6ZnVuY3Rpb24oYSl7dmFyIGMsZCxlLGc9dGhpc1swXTt7aWYoISFhcmd1bWVudHMubGVuZ3RoKXtlPWYuaXNGdW5jdGlvbihhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGQpe3ZhciBnPWYodGhpcyksaDtpZih0aGlzLm5vZGVUeXBlPT09MSl7ZT9oPWEuY2FsbCh0aGlzLGQsZy52YWwoKSk6aD1hLGg9PW51bGw/aD0iIjp0eXBlb2YgaD09Im51bWJlciI/aCs9IiI6Zi5pc0FycmF5KGgpJiYoaD1mLm1hcChoLGZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOmErIiJ9KSksYz1mLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV18fGYudmFsSG9va3NbdGhpcy50eXBlXTtpZighY3x8ISgic2V0ImluIGMpfHxjLnNldCh0aGlzLGgsInZhbHVlIik9PT1iKXRoaXMudmFsdWU9aH19KX1pZihnKXtjPWYudmFsSG9va3NbZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8Zi52YWxIb29rc1tnLnR5cGVdO2lmKGMmJiJnZXQiaW4gYyYmKGQ9Yy5nZXQoZywidmFsdWUiKSkhPT1iKXJldHVybiBkO2Q9Zy52YWx1ZTtyZXR1cm4gdHlwZW9mIGQ9PSJzdHJpbmciP2QucmVwbGFjZShxLCIiKTpkPT1udWxsPyIiOmR9fX19KSxmLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEuYXR0cmlidXRlcy52YWx1ZTtyZXR1cm4hYnx8Yi5zcGVjaWZpZWQ/YS52YWx1ZTphLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxnPWEuc2VsZWN0ZWRJbmRleCxoPVtdLGk9YS5vcHRpb25zLGo9YS50eXBlPT09InNlbGVjdC1vbmUiO2lmKGc8MClyZXR1cm4gbnVsbDtjPWo/ZzowLGQ9aj9nKzE6aS5sZW5ndGg7Zm9yKDtjPGQ7YysrKXtlPWlbY107aWYoZS5zZWxlY3RlZCYmKGYuc3VwcG9ydC5vcHREaXNhYmxlZD8hZS5kaXNhYmxlZDplLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKT09PW51bGwpJiYoIWUucGFyZW50Tm9kZS5kaXNhYmxlZHx8IWYubm9kZU5hbWUoZS5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7Yj1mKGUpLnZhbCgpO2lmKGopcmV0dXJuIGI7aC5wdXNoKGIpfX1pZihqJiYhaC5sZW5ndGgmJmkubGVuZ3RoKXJldHVybiBmKGlbZ10pLnZhbCgpO3JldHVybiBofSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1mLm1ha2VBcnJheShiKTtmKGEpLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPWYuaW5BcnJheShmKHRoaXMpLnZhbCgpLGMpPj0wfSksYy5sZW5ndGh8fChhLnNlbGVjdGVkSW5kZXg9LTEpO3JldHVybiBjfX19LGF0dHJGbjp7dmFsOiEwLGNzczohMCxodG1sOiEwLHRleHQ6ITAsZGF0YTohMCx3aWR0aDohMCxoZWlnaHQ6ITAsb2Zmc2V0OiEwfSxhdHRyOmZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBnLGgsaSxqPWEubm9kZVR5cGU7aWYoISFhJiZqIT09MyYmaiE9PTgmJmohPT0yKXtpZihlJiZjIGluIGYuYXR0ckZuKXJldHVybiBmKGEpW2NdKGQpO2lmKHR5cGVvZiBhLmdldEF0dHJpYnV0ZT09InVuZGVmaW5lZCIpcmV0dXJuIGYucHJvcChhLGMsZCk7aT1qIT09MXx8IWYuaXNYTUxEb2MoYSksaSYmKGM9Yy50b0xvd2VyQ2FzZSgpLGg9Zi5hdHRySG9va3NbY118fCh1LnRlc3QoYyk/eDp3KSk7aWYoZCE9PWIpe2lmKGQ9PT1udWxsKXtmLnJlbW92ZUF0dHIoYSxjKTtyZXR1cm59aWYoaCYmInNldCJpbiBoJiZpJiYoZz1oLnNldChhLGQsYykpIT09YilyZXR1cm4gZzthLnNldEF0dHJpYnV0ZShjLCIiK2QpO3JldHVybiBkfWlmKGgmJiJnZXQiaW4gaCYmaSYmKGc9aC5nZXQoYSxjKSkhPT1udWxsKXJldHVybiBnO2c9YS5nZXRBdHRyaWJ1dGUoYyk7cmV0dXJuIGc9PT1udWxsP2I6Z319LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZyxoPTA7aWYoYiYmYS5ub2RlVHlwZT09PTEpe2Q9Yi50b0xvd2VyQ2FzZSgpLnNwbGl0KHApLGc9ZC5sZW5ndGg7Zm9yKDtoPGc7aCsrKWU9ZFtoXSxlJiYoYz1mLnByb3BGaXhbZV18fGUsZi5hdHRyKGEsZSwiIiksYS5yZW1vdmVBdHRyaWJ1dGUodj9lOmMpLHUudGVzdChlKSYmYyBpbiBhJiYoYVtjXT0hMSkpfX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oYSxiKXtpZihyLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSlmLmVycm9yKCJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiKTtlbHNlIGlmKCFmLnN1cHBvcnQucmFkaW9WYWx1ZSYmYj09PSJyYWRpbyImJmYubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTthLnNldEF0dHJpYnV0ZSgidHlwZSIsYiksYyYmKGEudmFsdWU9Yyk7cmV0dXJuIGJ9fX0sdmFsdWU6e2dldDpmdW5jdGlvbihhLGIpe2lmKHcmJmYubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIHcuZ2V0KGEsYik7cmV0dXJuIGIgaW4gYT9hLnZhbHVlOm51bGx9LHNldDpmdW5jdGlvbihhLGIsYyl7aWYodyYmZi5ub2RlTmFtZShhLCJidXR0b24iKSlyZXR1cm4gdy5zZXQoYSxiLGMpO2EudmFsdWU9Yn19fSxwcm9wRml4Ont0YWJpbmRleDoidGFiSW5kZXgiLHJlYWRvbmx5OiJyZWFkT25seSIsImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIsY2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixyb3dzcGFuOiJyb3dTcGFuIixjb2xzcGFuOiJjb2xTcGFuIix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIixjb250ZW50ZWRpdGFibGU6ImNvbnRlbnRFZGl0YWJsZSJ9LHByb3A6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGcsaCxpPWEubm9kZVR5cGU7aWYoISFhJiZpIT09MyYmaSE9PTgmJmkhPT0yKXtoPWkhPT0xfHwhZi5pc1hNTERvYyhhKSxoJiYoYz1mLnByb3BGaXhbY118fGMsZz1mLnByb3BIb29rc1tjXSk7cmV0dXJuIGQhPT1iP2cmJiJzZXQiaW4gZyYmKGU9Zy5zZXQoYSxkLGMpKSE9PWI/ZTphW2NdPWQ6ZyYmImdldCJpbiBnJiYoZT1nLmdldChhLGMpKSE9PW51bGw/ZTphW2NdfX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTtyZXR1cm4gYyYmYy5zcGVjaWZpZWQ/cGFyc2VJbnQoYy52YWx1ZSwxMCk6cy50ZXN0KGEubm9kZU5hbWUpfHx0LnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOmJ9fX19KSxmLmF0dHJIb29rcy50YWJpbmRleD1mLnByb3BIb29rcy50YWJJbmRleCx4PXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlPWYucHJvcChhLGMpO3JldHVybiBlPT09ITB8fHR5cGVvZiBlIT0iYm9vbGVhbiImJihkPWEuZ2V0QXR0cmlidXRlTm9kZShjKSkmJmQubm9kZVZhbHVlIT09ITE/Yy50b0xvd2VyQ2FzZSgpOmJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7Yj09PSExP2YucmVtb3ZlQXR0cihhLGMpOihkPWYucHJvcEZpeFtjXXx8YyxkIGluIGEmJihhW2RdPSEwKSxhLnNldEF0dHJpYnV0ZShjLGMudG9Mb3dlckNhc2UoKSkpO3JldHVybiBjfX0sdnx8KHk9e25hbWU6ITAsaWQ6ITB9LHc9Zi52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkO2Q9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkJiYoeVtjXT9kLm5vZGVWYWx1ZSE9PSIiOmQuc3BlY2lmaWVkKT9kLm5vZGVWYWx1ZTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEuZ2V0QXR0cmlidXRlTm9kZShkKTtlfHwoZT1jLmNyZWF0ZUF0dHJpYnV0ZShkKSxhLnNldEF0dHJpYnV0ZU5vZGUoZSkpO3JldHVybiBlLm5vZGVWYWx1ZT1iKyIifX0sZi5hdHRySG9va3MudGFiaW5kZXguc2V0PXcuc2V0LGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmF0dHJIb29rc1tiXT1mLmV4dGVuZChmLmF0dHJIb29rc1tiXSx7c2V0OmZ1bmN0aW9uKGEsYyl7aWYoYz09PSIiKXthLnNldEF0dHJpYnV0ZShiLCJhdXRvIik7cmV0dXJuIGN9fX0pfSksZi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtnZXQ6dy5nZXQsc2V0OmZ1bmN0aW9uKGEsYixjKXtiPT09IiImJihiPSJmYWxzZSIpLHcuc2V0KGEsYixjKX19KSxmLnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fGYuZWFjaChbImhyZWYiLCJzcmMiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYyl7Zi5hdHRySG9va3NbY109Zi5leHRlbmQoZi5hdHRySG9va3NbY10se2dldDpmdW5jdGlvbihhKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShjLDIpO3JldHVybiBkPT09bnVsbD9iOmR9fSl9KSxmLnN1cHBvcnQuc3R5bGV8fChmLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKXx8Yn0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD0iIitifX0pLGYuc3VwcG9ydC5vcHRTZWxlY3RlZHx8KGYucHJvcEhvb2tzLnNlbGVjdGVkPWYuZXh0ZW5kKGYucHJvcEhvb2tzLnNlbGVjdGVkLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO2ImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCk7cmV0dXJuIG51bGx9fSkpLGYuc3VwcG9ydC5lbmN0eXBlfHwoZi5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIiksZi5zdXBwb3J0LmNoZWNrT258fGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6YS52YWx1ZX19fSksZi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT1mLmV4dGVuZChmLnZhbEhvb2tzW3RoaXNdLHtzZXQ6ZnVuY3Rpb24oYSxiKXtpZihmLmlzQXJyYXkoYikpcmV0dXJuIGEuY2hlY2tlZD1mLmluQXJyYXkoZihhKS52YWwoKSxiKT49MH19KX0pO3ZhciB6PS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSxBPS9eKFteXC5dKik/KD86XC4oLispKT8kLyxCPS9cYmhvdmVyKFwuXFMrKT9cYi8sQz0vXmtleS8sRD0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sRT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sRj0vXihcdyopKD86IyhbXHdcLV0rKSk/KD86XC4oW1x3XC1dKykpPyQvLEc9ZnVuY3Rpb24oYSl7dmFyIGI9Ri5leGVjKGEpO2ImJihiWzFdPShiWzFdfHwiIikudG9Mb3dlckNhc2UoKSxiWzNdPWJbM10mJm5ldyBSZWdFeHAoIig/Ol58XFxzKSIrYlszXSsiKD86XFxzfCQpIikpO3JldHVybiBifSxIPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5hdHRyaWJ1dGVzfHx7fTtyZXR1cm4oIWJbMV18fGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJbMV0pJiYoIWJbMl18fChjLmlkfHx7fSkudmFsdWU9PT1iWzJdKSYmKCFiWzNdfHxiWzNdLnRlc3QoKGNbImNsYXNzIl18fHt9KS52YWx1ZSkpfSxJPWZ1bmN0aW9uKGEpe3JldHVybiBmLmV2ZW50LnNwZWNpYWwuaG92ZXI/YTphLnJlcGxhY2UoQiwibW91c2VlbnRlciQxIG1vdXNlbGVhdmUkMSIpfTsKZi5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaSxqLGssbCxtLG4sbyxwLHEscixzO2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhY3x8IWR8fCEoaD1mLl9kYXRhKGEpKSkpe2QuaGFuZGxlciYmKHA9ZCxkPXAuaGFuZGxlciksZC5ndWlkfHwoZC5ndWlkPWYuZ3VpZCsrKSxqPWguZXZlbnRzLGp8fChoLmV2ZW50cz1qPXt9KSxpPWguaGFuZGxlLGl8fChoLmhhbmRsZT1pPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgZiE9InVuZGVmaW5lZCImJighYXx8Zi5ldmVudC50cmlnZ2VyZWQhPT1hLnR5cGUpP2YuZXZlbnQuZGlzcGF0Y2guYXBwbHkoaS5lbGVtLGFyZ3VtZW50cyk6Yn0saS5lbGVtPWEpLGM9Zi50cmltKEkoYykpLnNwbGl0KCIgIik7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKyl7bD1BLmV4ZWMoY1trXSl8fFtdLG09bFsxXSxuPShsWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCkscz1mLmV2ZW50LnNwZWNpYWxbbV18fHt9LG09KGc/cy5kZWxlZ2F0ZVR5cGU6cy5iaW5kVHlwZSl8fG0scz1mLmV2ZW50LnNwZWNpYWxbbV18fHt9LG89Zi5leHRlbmQoe3R5cGU6bSxvcmlnVHlwZTpsWzFdLGRhdGE6ZSxoYW5kbGVyOmQsZ3VpZDpkLmd1aWQsc2VsZWN0b3I6ZyxxdWljazpHKGcpLG5hbWVzcGFjZTpuLmpvaW4oIi4iKX0scCkscj1qW21dO2lmKCFyKXtyPWpbbV09W10sci5kZWxlZ2F0ZUNvdW50PTA7aWYoIXMuc2V0dXB8fHMuc2V0dXAuY2FsbChhLGUsbixpKT09PSExKWEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobSxpLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbSxpKX1zLmFkZCYmKHMuYWRkLmNhbGwoYSxvKSxvLmhhbmRsZXIuZ3VpZHx8KG8uaGFuZGxlci5ndWlkPWQuZ3VpZCkpLGc/ci5zcGxpY2Uoci5kZWxlZ2F0ZUNvdW50KyssMCxvKTpyLnB1c2gobyksZi5ldmVudC5nbG9iYWxbbV09ITB9YT1udWxsfX0sZ2xvYmFsOnt9LHJlbW92ZTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBnPWYuaGFzRGF0YShhKSYmZi5fZGF0YShhKSxoLGksaixrLGwsbSxuLG8scCxxLHIscztpZighIWcmJiEhKG89Zy5ldmVudHMpKXtiPWYudHJpbShJKGJ8fCIiKSkuc3BsaXQoIiAiKTtmb3IoaD0wO2g8Yi5sZW5ndGg7aCsrKXtpPUEuZXhlYyhiW2hdKXx8W10saj1rPWlbMV0sbD1pWzJdO2lmKCFqKXtmb3IoaiBpbiBvKWYuZXZlbnQucmVtb3ZlKGEsaitiW2hdLGMsZCwhMCk7Y29udGludWV9cD1mLmV2ZW50LnNwZWNpYWxbal18fHt9LGo9KGQ/cC5kZWxlZ2F0ZVR5cGU6cC5iaW5kVHlwZSl8fGoscj1vW2pdfHxbXSxtPXIubGVuZ3RoLGw9bD9uZXcgUmVnRXhwKCIoXnxcXC4pIitsLnNwbGl0KCIuIikuc29ydCgpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpOm51bGw7Zm9yKG49MDtuPHIubGVuZ3RoO24rKylzPXJbbl0sKGV8fGs9PT1zLm9yaWdUeXBlKSYmKCFjfHxjLmd1aWQ9PT1zLmd1aWQpJiYoIWx8fGwudGVzdChzLm5hbWVzcGFjZSkpJiYoIWR8fGQ9PT1zLnNlbGVjdG9yfHxkPT09IioqIiYmcy5zZWxlY3RvcikmJihyLnNwbGljZShuLS0sMSkscy5zZWxlY3RvciYmci5kZWxlZ2F0ZUNvdW50LS0scC5yZW1vdmUmJnAucmVtb3ZlLmNhbGwoYSxzKSk7ci5sZW5ndGg9PT0wJiZtIT09ci5sZW5ndGgmJigoIXAudGVhcmRvd258fHAudGVhcmRvd24uY2FsbChhLGwpPT09ITEpJiZmLnJlbW92ZUV2ZW50KGEsaixnLmhhbmRsZSksZGVsZXRlIG9bal0pfWYuaXNFbXB0eU9iamVjdChvKSYmKHE9Zy5oYW5kbGUscSYmKHEuZWxlbT1udWxsKSxmLnJlbW92ZURhdGEoYSxbImV2ZW50cyIsImhhbmRsZSJdLCEwKSl9fSxjdXN0b21FdmVudDp7Z2V0RGF0YTohMCxzZXREYXRhOiEwLGNoYW5nZURhdGE6ITB9LHRyaWdnZXI6ZnVuY3Rpb24oYyxkLGUsZyl7aWYoIWV8fGUubm9kZVR5cGUhPT0zJiZlLm5vZGVUeXBlIT09OCl7dmFyIGg9Yy50eXBlfHxjLGk9W10saixrLGwsbSxuLG8scCxxLHIscztpZihFLnRlc3QoaCtmLmV2ZW50LnRyaWdnZXJlZCkpcmV0dXJuO2guaW5kZXhPZigiISIpPj0wJiYoaD1oLnNsaWNlKDAsLTEpLGs9ITApLGguaW5kZXhPZigiLiIpPj0wJiYoaT1oLnNwbGl0KCIuIiksaD1pLnNoaWZ0KCksaS5zb3J0KCkpO2lmKCghZXx8Zi5ldmVudC5jdXN0b21FdmVudFtoXSkmJiFmLmV2ZW50Lmdsb2JhbFtoXSlyZXR1cm47Yz10eXBlb2YgYz09Im9iamVjdCI/Y1tmLmV4cGFuZG9dP2M6bmV3IGYuRXZlbnQoaCxjKTpuZXcgZi5FdmVudChoKSxjLnR5cGU9aCxjLmlzVHJpZ2dlcj0hMCxjLmV4Y2x1c2l2ZT1rLGMubmFtZXNwYWNlPWkuam9pbigiLiIpLGMubmFtZXNwYWNlX3JlPWMubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK2kuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIik6bnVsbCxvPWguaW5kZXhPZigiOiIpPDA/Im9uIitoOiIiO2lmKCFlKXtqPWYuY2FjaGU7Zm9yKGwgaW4gailqW2xdLmV2ZW50cyYmaltsXS5ldmVudHNbaF0mJmYuZXZlbnQudHJpZ2dlcihjLGQsaltsXS5oYW5kbGUuZWxlbSwhMCk7cmV0dXJufWMucmVzdWx0PWIsYy50YXJnZXR8fChjLnRhcmdldD1lKSxkPWQhPW51bGw/Zi5tYWtlQXJyYXkoZCk6W10sZC51bnNoaWZ0KGMpLHA9Zi5ldmVudC5zcGVjaWFsW2hdfHx7fTtpZihwLnRyaWdnZXImJnAudHJpZ2dlci5hcHBseShlLGQpPT09ITEpcmV0dXJuO3I9W1tlLHAuYmluZFR5cGV8fGhdXTtpZighZyYmIXAubm9CdWJibGUmJiFmLmlzV2luZG93KGUpKXtzPXAuZGVsZWdhdGVUeXBlfHxoLG09RS50ZXN0KHMraCk/ZTplLnBhcmVudE5vZGUsbj1udWxsO2Zvcig7bTttPW0ucGFyZW50Tm9kZSlyLnB1c2goW20sc10pLG49bTtuJiZuPT09ZS5vd25lckRvY3VtZW50JiZyLnB1c2goW24uZGVmYXVsdFZpZXd8fG4ucGFyZW50V2luZG93fHxhLHNdKX1mb3IobD0wO2w8ci5sZW5ndGgmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7bCsrKW09cltsXVswXSxjLnR5cGU9cltsXVsxXSxxPShmLl9kYXRhKG0sImV2ZW50cyIpfHx7fSlbYy50eXBlXSYmZi5fZGF0YShtLCJoYW5kbGUiKSxxJiZxLmFwcGx5KG0sZCkscT1vJiZtW29dLHEmJmYuYWNjZXB0RGF0YShtKSYmcS5hcHBseShtLGQpPT09ITEmJmMucHJldmVudERlZmF1bHQoKTtjLnR5cGU9aCwhZyYmIWMuaXNEZWZhdWx0UHJldmVudGVkKCkmJighcC5fZGVmYXVsdHx8cC5fZGVmYXVsdC5hcHBseShlLm93bmVyRG9jdW1lbnQsZCk9PT0hMSkmJihoIT09ImNsaWNrInx8IWYubm9kZU5hbWUoZSwiYSIpKSYmZi5hY2NlcHREYXRhKGUpJiZvJiZlW2hdJiYoaCE9PSJmb2N1cyImJmghPT0iYmx1ciJ8fGMudGFyZ2V0Lm9mZnNldFdpZHRoIT09MCkmJiFmLmlzV2luZG93KGUpJiYobj1lW29dLG4mJihlW29dPW51bGwpLGYuZXZlbnQudHJpZ2dlcmVkPWgsZVtoXSgpLGYuZXZlbnQudHJpZ2dlcmVkPWIsbiYmKGVbb109bikpO3JldHVybiBjLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGMpe2M9Zi5ldmVudC5maXgoY3x8YS5ldmVudCk7dmFyIGQ9KGYuX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVtjLnR5cGVdfHxbXSxlPWQuZGVsZWdhdGVDb3VudCxnPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLGg9IWMuZXhjbHVzaXZlJiYhYy5uYW1lc3BhY2UsaT1bXSxqLGssbCxtLG4sbyxwLHEscixzLHQ7Z1swXT1jLGMuZGVsZWdhdGVUYXJnZXQ9dGhpcztpZihlJiYhYy50YXJnZXQuZGlzYWJsZWQmJighYy5idXR0b258fGMudHlwZSE9PSJjbGljayIpKXttPWYodGhpcyksbS5jb250ZXh0PXRoaXMub3duZXJEb2N1bWVudHx8dGhpcztmb3IobD1jLnRhcmdldDtsIT10aGlzO2w9bC5wYXJlbnROb2RlfHx0aGlzKXtvPXt9LHE9W10sbVswXT1sO2ZvcihqPTA7ajxlO2orKylyPWRbal0scz1yLnNlbGVjdG9yLG9bc109PT1iJiYob1tzXT1yLnF1aWNrP0gobCxyLnF1aWNrKTptLmlzKHMpKSxvW3NdJiZxLnB1c2gocik7cS5sZW5ndGgmJmkucHVzaCh7ZWxlbTpsLG1hdGNoZXM6cX0pfX1kLmxlbmd0aD5lJiZpLnB1c2goe2VsZW06dGhpcyxtYXRjaGVzOmQuc2xpY2UoZSl9KTtmb3Ioaj0wO2o8aS5sZW5ndGgmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7aisrKXtwPWlbal0sYy5jdXJyZW50VGFyZ2V0PXAuZWxlbTtmb3Ioaz0wO2s8cC5tYXRjaGVzLmxlbmd0aCYmIWMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTtrKyspe3I9cC5tYXRjaGVzW2tdO2lmKGh8fCFjLm5hbWVzcGFjZSYmIXIubmFtZXNwYWNlfHxjLm5hbWVzcGFjZV9yZSYmYy5uYW1lc3BhY2VfcmUudGVzdChyLm5hbWVzcGFjZSkpYy5kYXRhPXIuZGF0YSxjLmhhbmRsZU9iaj1yLG49KChmLmV2ZW50LnNwZWNpYWxbci5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fHIuaGFuZGxlcikuYXBwbHkocC5lbGVtLGcpLG4hPT1iJiYoYy5yZXN1bHQ9bixuPT09ITEmJihjLnByZXZlbnREZWZhdWx0KCksYy5zdG9wUHJvcGFnYXRpb24oKSkpfX1yZXR1cm4gYy5yZXN1bHR9LHByb3BzOiJhdHRyQ2hhbmdlIGF0dHJOYW1lIHJlbGF0ZWROb2RlIHNyY0VsZW1lbnQgYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXthLndoaWNoPT1udWxsJiYoYS53aGljaD1iLmNoYXJDb2RlIT1udWxsP2IuY2hhckNvZGU6Yi5rZXlDb2RlKTtyZXR1cm4gYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsZCl7dmFyIGUsZixnLGg9ZC5idXR0b24saT1kLmZyb21FbGVtZW50O2EucGFnZVg9PW51bGwmJmQuY2xpZW50WCE9bnVsbCYmKGU9YS50YXJnZXQub3duZXJEb2N1bWVudHx8YyxmPWUuZG9jdW1lbnRFbGVtZW50LGc9ZS5ib2R5LGEucGFnZVg9ZC5jbGllbnRYKyhmJiZmLnNjcm9sbExlZnR8fGcmJmcuc2Nyb2xsTGVmdHx8MCktKGYmJmYuY2xpZW50TGVmdHx8ZyYmZy5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWQuY2xpZW50WSsoZiYmZi5zY3JvbGxUb3B8fGcmJmcuc2Nyb2xsVG9wfHwwKS0oZiYmZi5jbGllbnRUb3B8fGcmJmcuY2xpZW50VG9wfHwwKSksIWEucmVsYXRlZFRhcmdldCYmaSYmKGEucmVsYXRlZFRhcmdldD1pPT09YS50YXJnZXQ/ZC50b0VsZW1lbnQ6aSksIWEud2hpY2gmJmghPT1iJiYoYS53aGljaD1oJjE/MTpoJjI/MzpoJjQ/MjowKTtyZXR1cm4gYX19LGZpeDpmdW5jdGlvbihhKXtpZihhW2YuZXhwYW5kb10pcmV0dXJuIGE7dmFyIGQsZSxnPWEsaD1mLmV2ZW50LmZpeEhvb2tzW2EudHlwZV18fHt9LGk9aC5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChoLnByb3BzKTp0aGlzLnByb3BzO2E9Zi5FdmVudChnKTtmb3IoZD1pLmxlbmd0aDtkOyllPWlbLS1kXSxhW2VdPWdbZV07YS50YXJnZXR8fChhLnRhcmdldD1nLnNyY0VsZW1lbnR8fGMpLGEudGFyZ2V0Lm5vZGVUeXBlPT09MyYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT09PWImJihhLm1ldGFLZXk9YS5jdHJsS2V5KTtyZXR1cm4gaC5maWx0ZXI/aC5maWx0ZXIoYSxnKTphfSxzcGVjaWFsOntyZWFkeTp7c2V0dXA6Zi5iaW5kUmVhZHl9LGxvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7ZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7ZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGJlZm9yZXVubG9hZDp7c2V0dXA6ZnVuY3Rpb24oYSxiLGMpe2YuaXNXaW5kb3codGhpcykmJih0aGlzLm9uYmVmb3JldW5sb2FkPWMpfSx0ZWFyZG93bjpmdW5jdGlvbihhLGIpe3RoaXMub25iZWZvcmV1bmxvYWQ9PT1iJiYodGhpcy5vbmJlZm9yZXVubG9hZD1udWxsKX19fSxzaW11bGF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1mLmV4dGVuZChuZXcgZi5FdmVudCxjLHt0eXBlOmEsaXNTaW11bGF0ZWQ6ITAsb3JpZ2luYWxFdmVudDp7fX0pO2Q/Zi5ldmVudC50cmlnZ2VyKGUsbnVsbCxiKTpmLmV2ZW50LmRpc3BhdGNoLmNhbGwoYixlKSxlLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZjLnByZXZlbnREZWZhdWx0KCl9fSxmLmV2ZW50LmhhbmRsZT1mLmV2ZW50LmRpc3BhdGNoLGYucmVtb3ZlRXZlbnQ9Yy5yZW1vdmVFdmVudExpc3RlbmVyP2Z1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfTpmdW5jdGlvbihhLGIsYyl7YS5kZXRhY2hFdmVudCYmYS5kZXRhY2hFdmVudCgib24iK2IsYyl9LGYuRXZlbnQ9ZnVuY3Rpb24oYSxiKXtpZighKHRoaXMgaW5zdGFuY2VvZiBmLkV2ZW50KSlyZXR1cm4gbmV3IGYuRXZlbnQoYSxiKTthJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHxhLnJldHVyblZhbHVlPT09ITF8fGEuZ2V0UHJldmVudERlZmF1bHQmJmEuZ2V0UHJldmVudERlZmF1bHQoKT9LOkopOnRoaXMudHlwZT1hLGImJmYuZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fGYubm93KCksdGhpc1tmLmV4cGFuZG9dPSEwfSxmLkV2ZW50LnByb3RvdHlwZT17cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1LO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDshYXx8KGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUs7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50OyFhfHwoYS5zdG9wUHJvcGFnYXRpb24mJmEuc3RvcFByb3BhZ2F0aW9uKCksYS5jYW5jZWxCdWJibGU9ITApfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUssdGhpcy5zdG9wUHJvcGFnYXRpb24oKX0saXNEZWZhdWx0UHJldmVudGVkOkosaXNQcm9wYWdhdGlvblN0b3BwZWQ6Sixpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpKfSxmLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihhLGIpe2YuZXZlbnQuc3BlY2lhbFthXT17ZGVsZWdhdGVUeXBlOmIsYmluZFR5cGU6YixoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkPWEucmVsYXRlZFRhcmdldCxlPWEuaGFuZGxlT2JqLGc9ZS5zZWxlY3RvcixoO2lmKCFkfHxkIT09YyYmIWYuY29udGFpbnMoYyxkKSlhLnR5cGU9ZS5vcmlnVHlwZSxoPWUuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWI7cmV0dXJuIGh9fX0pLGYuc3VwcG9ydC5zdWJtaXRCdWJibGVzfHwoZi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtpZihmLm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTtmLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBjPWEudGFyZ2V0LGQ9Zi5ub2RlTmFtZShjLCJpbnB1dCIpfHxmLm5vZGVOYW1lKGMsImJ1dHRvbiIpP2MuZm9ybTpiO2QmJiFkLl9zdWJtaXRfYXR0YWNoZWQmJihmLmV2ZW50LmFkZChkLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiYhYS5pc1RyaWdnZXImJmYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksZC5fc3VibWl0X2F0dGFjaGVkPSEwKX0pfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKGYubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSksZi5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fChmLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe2lmKHoudGVzdCh0aGlzLm5vZGVOYW1lKSl7aWYodGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIilmLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXthLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lPT09ImNoZWNrZWQiJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLGYuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmIWEuaXNUcmlnZ2VyJiYodGhpcy5fanVzdF9jaGFuZ2VkPSExLGYuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKSl9KTtyZXR1cm4hMX1mLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDt6LnRlc3QoYi5ub2RlTmFtZSkmJiFiLl9jaGFuZ2VfYXR0YWNoZWQmJihmLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiYhYS5pc1NpbXVsYXRlZCYmIWEuaXNUcmlnZ2VyJiZmLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMucGFyZW50Tm9kZSxhLCEwKX0pLGIuX2NoYW5nZV9hdHRhY2hlZD0hMCl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMhPT1ifHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8Yi50eXBlIT09InJhZGlvIiYmYi50eXBlIT09ImNoZWNrYm94IilyZXR1cm4gYS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcywiLl9jaGFuZ2UiKTtyZXR1cm4gei50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGYuc3VwcG9ydC5mb2N1c2luQnViYmxlc3x8Zi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBkPTAsZT1mdW5jdGlvbihhKXtmLmV2ZW50LnNpbXVsYXRlKGIsYS50YXJnZXQsZi5ldmVudC5maXgoYSksITApfTtmLmV2ZW50LnNwZWNpYWxbYl09e3NldHVwOmZ1bmN0aW9uKCl7ZCsrPT09MCYmYy5hZGRFdmVudExpc3RlbmVyKGEsZSwhMCl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7LS1kPT09MCYmYy5yZW1vdmVFdmVudExpc3RlbmVyKGEsZSwhMCl9fX0pLGYuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGMsZCxlLGcpe3ZhciBoLGk7aWYodHlwZW9mIGE9PSJvYmplY3QiKXt0eXBlb2YgYyE9InN0cmluZyImJihkPWMsYz1iKTtmb3IoaSBpbiBhKXRoaXMub24oaSxjLGQsYVtpXSxnKTtyZXR1cm4gdGhpc31kPT1udWxsJiZlPT1udWxsPyhlPWMsZD1jPWIpOmU9PW51bGwmJih0eXBlb2YgYz09InN0cmluZyI/KGU9ZCxkPWIpOihlPWQsZD1jLGM9YikpO2lmKGU9PT0hMSllPUo7ZWxzZSBpZighZSlyZXR1cm4gdGhpcztnPT09MSYmKGg9ZSxlPWZ1bmN0aW9uKGEpe2YoKS5vZmYoYSk7cmV0dXJuIGguYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLmd1aWQ9aC5ndWlkfHwoaC5ndWlkPWYuZ3VpZCsrKSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQuYWRkKHRoaXMsYSxlLGQsYyl9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uLmNhbGwodGhpcyxhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxjLGQpe2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXt2YXIgZT1hLmhhbmRsZU9iajtmKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihlLm5hbWVzcGFjZT9lLnR5cGUrIi4iK2UubmFtZXNwYWNlOmUudHlwZSxlLnNlbGVjdG9yLGUuaGFuZGxlcik7cmV0dXJuIHRoaXN9aWYodHlwZW9mIGE9PSJvYmplY3QiKXtmb3IodmFyIGcgaW4gYSl0aGlzLm9mZihnLGMsYVtnXSk7cmV0dXJuIHRoaXN9aWYoYz09PSExfHx0eXBlb2YgYz09ImZ1bmN0aW9uIilkPWMsYz1iO2Q9PT0hMSYmKGQ9Sik7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQucmVtb3ZlKHRoaXMsYSxkLGMpfSl9LGJpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxsaXZlOmZ1bmN0aW9uKGEsYixjKXtmKHRoaXMuY29udGV4dCkub24oYSx0aGlzLnNlbGVjdG9yLGIsYyk7cmV0dXJuIHRoaXN9LGRpZTpmdW5jdGlvbihhLGIpe2YodGhpcy5jb250ZXh0KS5vZmYoYSx0aGlzLnNlbGVjdG9yfHwiKioiLGIpO3JldHVybiB0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PTE/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGEsYyl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXNbMF0pcmV0dXJuIGYuZXZlbnQudHJpZ2dlcihhLGIsdGhpc1swXSwhMCl9LHRvZ2dsZTpmdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMsYz1hLmd1aWR8fGYuZ3VpZCsrLGQ9MCxlPWZ1bmN0aW9uKGMpe3ZhciBlPShmLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCl8fDApJWQ7Zi5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQsZSsxKSxjLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGJbZV0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHwhMX07ZS5ndWlkPWM7d2hpbGUoZDxiLmxlbmd0aCliW2QrK10uZ3VpZD1jO3JldHVybiB0aGlzLmNsaWNrKGUpfSxob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KSxmLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEsYyl7Yz09bnVsbCYmKGM9YSxhPW51bGwpO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihiLG51bGwsYSxjKTp0aGlzLnRyaWdnZXIoYil9LGYuYXR0ckZuJiYoZi5hdHRyRm5bYl09ITApLEMudGVzdChiKSYmKGYuZXZlbnQuZml4SG9va3NbYl09Zi5ldmVudC5rZXlIb29rcyksRC50ZXN0KGIpJiYoZi5ldmVudC5maXhIb29rc1tiXT1mLmV2ZW50Lm1vdXNlSG9va3MpfSksZnVuY3Rpb24oKXtmdW5jdGlvbiB4KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWlmKGoubm9kZVR5cGU9PT0xKXtnfHwoaltkXT1jLGouc2l6c2V0PWgpO2lmKHR5cGVvZiBiIT0ic3RyaW5nIil7aWYoaj09PWIpe2s9ITA7YnJlYWt9fWVsc2UgaWYobS5maWx0ZXIoYixbal0pLmxlbmd0aD4wKXtrPWo7YnJlYWt9fWo9althXX1lW2hdPWt9fX1mdW5jdGlvbiB3KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWoubm9kZVR5cGU9PT0xJiYhZyYmKGpbZF09YyxqLnNpenNldD1oKTtpZihqLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iKXtrPWo7YnJlYWt9aj1qW2FdfWVbaF09a319fXZhciBhPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teXFtcXV0qXF18WyciXVteJyJdKlsnIl18W15cW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csZD0ic2l6Y2FjaGUiKyhNYXRoLnJhbmRvbSgpKyIiKS5yZXBsYWNlKCIuIiwiIiksZT0wLGc9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoPSExLGk9ITAsaj0vXFwvZyxrPS9cclxuL2csbD0vXFcvO1swLDBdLnNvcnQoZnVuY3Rpb24oKXtpPSExO3JldHVybiAwfSk7dmFyIG09ZnVuY3Rpb24oYixkLGUsZil7ZT1lfHxbXSxkPWR8fGM7dmFyIGg9ZDtpZihkLm5vZGVUeXBlIT09MSYmZC5ub2RlVHlwZSE9PTkpcmV0dXJuW107aWYoIWJ8fHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gZTt2YXIgaSxqLGssbCxuLHEscix0LHU9ITAsdj1tLmlzWE1MKGQpLHc9W10seD1iO2Rve2EuZXhlYygiIiksaT1hLmV4ZWMoeCk7aWYoaSl7eD1pWzNdLHcucHVzaChpWzFdKTtpZihpWzJdKXtsPWlbM107YnJlYWt9fX13aGlsZShpKTtpZih3Lmxlbmd0aD4xJiZwLmV4ZWMoYikpaWYody5sZW5ndGg9PT0yJiZvLnJlbGF0aXZlW3dbMF1dKWo9eSh3WzBdK3dbMV0sZCxmKTtlbHNle2o9by5yZWxhdGl2ZVt3WzBdXT9bZF06bSh3LnNoaWZ0KCksZCk7d2hpbGUody5sZW5ndGgpYj13LnNoaWZ0KCksby5yZWxhdGl2ZVtiXSYmKGIrPXcuc2hpZnQoKSksaj15KGIsaixmKX1lbHNleyFmJiZ3Lmxlbmd0aD4xJiZkLm5vZGVUeXBlPT09OSYmIXYmJm8ubWF0Y2guSUQudGVzdCh3WzBdKSYmIW8ubWF0Y2guSUQudGVzdCh3W3cubGVuZ3RoLTFdKSYmKG49bS5maW5kKHcuc2hpZnQoKSxkLHYpLGQ9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldClbMF06bi5zZXRbMF0pO2lmKGQpe249Zj97ZXhwcjp3LnBvcCgpLHNldDpzKGYpfTptLmZpbmQody5wb3AoKSx3Lmxlbmd0aD09PTEmJih3WzBdPT09In4ifHx3WzBdPT09IisiKSYmZC5wYXJlbnROb2RlP2QucGFyZW50Tm9kZTpkLHYpLGo9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldCk6bi5zZXQsdy5sZW5ndGg+MD9rPXMoaik6dT0hMTt3aGlsZSh3Lmxlbmd0aClxPXcucG9wKCkscj1xLG8ucmVsYXRpdmVbcV0/cj13LnBvcCgpOnE9IiIscj09bnVsbCYmKHI9ZCksby5yZWxhdGl2ZVtxXShrLHIsdil9ZWxzZSBrPXc9W119a3x8KGs9aiksa3x8bS5lcnJvcihxfHxiKTtpZihnLmNhbGwoayk9PT0iW29iamVjdCBBcnJheV0iKWlmKCF1KWUucHVzaC5hcHBseShlLGspO2Vsc2UgaWYoZCYmZC5ub2RlVHlwZT09PTEpZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiYoa1t0XT09PSEwfHxrW3RdLm5vZGVUeXBlPT09MSYmbS5jb250YWlucyhkLGtbdF0pKSYmZS5wdXNoKGpbdF0pO2Vsc2UgZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiZrW3RdLm5vZGVUeXBlPT09MSYmZS5wdXNoKGpbdF0pO2Vsc2UgcyhrLGUpO2wmJihtKGwsaCxlLGYpLG0udW5pcXVlU29ydChlKSk7cmV0dXJuIGV9O20udW5pcXVlU29ydD1mdW5jdGlvbihhKXtpZih1KXtoPWksYS5zb3J0KHUpO2lmKGgpZm9yKHZhciBiPTE7YjxhLmxlbmd0aDtiKyspYVtiXT09PWFbYi0xXSYmYS5zcGxpY2UoYi0tLDEpfXJldHVybiBhfSxtLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShhLG51bGwsbnVsbCxiKX0sbS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShiLG51bGwsbnVsbCxbYV0pLmxlbmd0aD4wfSxtLmZpbmQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaTtpZighYSlyZXR1cm5bXTtmb3IoZT0wLGY9by5vcmRlci5sZW5ndGg7ZTxmO2UrKyl7aD1vLm9yZGVyW2VdO2lmKGc9by5sZWZ0TWF0Y2hbaF0uZXhlYyhhKSl7aT1nWzFdLGcuc3BsaWNlKDEsMSk7aWYoaS5zdWJzdHIoaS5sZW5ndGgtMSkhPT0iXFwiKXtnWzFdPShnWzFdfHwiIikucmVwbGFjZShqLCIiKSxkPW8uZmluZFtoXShnLGIsYyk7aWYoZCE9bnVsbCl7YT1hLnJlcGxhY2Uoby5tYXRjaFtoXSwiIik7YnJlYWt9fX19ZHx8KGQ9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTpbXSk7cmV0dXJue3NldDpkLGV4cHI6YX19LG0uZmlsdGVyPWZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG4scCxxPWEscj1bXSxzPWMsdD1jJiZjWzBdJiZtLmlzWE1MKGNbMF0pO3doaWxlKGEmJmMubGVuZ3RoKXtmb3IoaCBpbiBvLmZpbHRlcilpZigoZj1vLmxlZnRNYXRjaFtoXS5leGVjKGEpKSE9bnVsbCYmZlsyXSl7az1vLmZpbHRlcltoXSxsPWZbMV0sZz0hMSxmLnNwbGljZSgxLDEpO2lmKGwuc3Vic3RyKGwubGVuZ3RoLTEpPT09IlxcIiljb250aW51ZTtzPT09ciYmKHI9W10pO2lmKG8ucHJlRmlsdGVyW2hdKXtmPW8ucHJlRmlsdGVyW2hdKGYscyxkLHIsZSx0KTtpZighZilnPWk9ITA7ZWxzZSBpZihmPT09ITApY29udGludWV9aWYoZilmb3Iobj0wOyhqPXNbbl0pIT1udWxsO24rKylqJiYoaT1rKGosZixuLHMpLHA9ZV5pLGQmJmkhPW51bGw/cD9nPSEwOnNbbl09ITE6cCYmKHIucHVzaChqKSxnPSEwKSk7aWYoaSE9PWIpe2R8fChzPXIpLGE9YS5yZXBsYWNlKG8ubWF0Y2hbaF0sIiIpO2lmKCFnKXJldHVybltdO2JyZWFrfX1pZihhPT09cSlpZihnPT1udWxsKW0uZXJyb3IoYSk7ZWxzZSBicmVhaztxPWF9cmV0dXJuIHN9LG0uZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2EpfTt2YXIgbj1tLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPWEubm9kZVR5cGUsZT0iIjtpZihkKXtpZihkPT09MXx8ZD09PTkpe2lmKHR5cGVvZiBhLnRleHRDb250ZW50PT0ic3RyaW5nIilyZXR1cm4gYS50ZXh0Q29udGVudDtpZih0eXBlb2YgYS5pbm5lclRleHQ9PSJzdHJpbmciKXJldHVybiBhLmlubmVyVGV4dC5yZXBsYWNlKGssIiIpO2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyllKz1uKGEpfWVsc2UgaWYoZD09PTN8fGQ9PT00KXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIGZvcihiPTA7Yz1hW2JdO2IrKyljLm5vZGVUeXBlIT09OCYmKGUrPW4oYykpO3JldHVybiBlfSxvPW0uc2VsZWN0b3JzPXtvcmRlcjpbIklEIiwiTkFNRSIsIlRBRyJdLG1hdGNoOntJRDovIygoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sQ0xBU1M6L1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLyxBVFRSOi9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVxzKig/OihcUz89KVxzKig/OihbJyJdKSguKj8pXDN8KCM/KD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKil8KXwpXHMqXF0vLFRBRzovXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpcLV18XFwuKSspLyxDSElMRDovOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoXHMqKGV2ZW58b2RkfCg/OlsrXC1dP1xkK3woPzpbK1wtXT9cZCopP25ccyooPzpbK1wtXVxzKlxkKyk/KSlccypcKSk/LyxQT1M6LzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXlwtXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspKD86XCgoWyciXT8pKCg/OlwoW15cKV0rXCl8W15cKFwpXSopKylcMlwpKT8vfSxsZWZ0TWF0Y2g6e30sYXR0ck1hcDp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGF0dHJIYW5kbGU6e2hyZWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJocmVmIil9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJ0eXBlIil9fSxyZWxhdGl2ZTp7IisiOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGI9PSJzdHJpbmciLGQ9YyYmIWwudGVzdChiKSxlPWMmJiFkO2QmJihiPWIudG9Mb3dlckNhc2UoKSk7Zm9yKHZhciBmPTAsZz1hLmxlbmd0aCxoO2Y8ZztmKyspaWYoaD1hW2ZdKXt3aGlsZSgoaD1oLnByZXZpb3VzU2libGluZykmJmgubm9kZVR5cGUhPT0xKTthW2ZdPWV8fGgmJmgubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/aHx8ITE6aD09PWJ9ZSYmbS5maWx0ZXIoYixhLCEwKX0sIj4iOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD10eXBlb2YgYj09InN0cmluZyIsZT0wLGY9YS5sZW5ndGg7aWYoZCYmIWwudGVzdChiKSl7Yj1iLnRvTG93ZXJDYXNlKCk7Zm9yKDtlPGY7ZSsrKXtjPWFbZV07aWYoYyl7dmFyIGc9Yy5wYXJlbnROb2RlO2FbZV09Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yj9nOiExfX19ZWxzZXtmb3IoO2U8ZjtlKyspYz1hW2VdLGMmJihhW2VdPWQ/Yy5wYXJlbnROb2RlOmMucGFyZW50Tm9kZT09PWIpO2QmJm0uZmlsdGVyKGIsYSwhMCl9fSwiIjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz14O3R5cGVvZiBiPT0ic3RyaW5nIiYmIWwudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXcpLGcoInBhcmVudE5vZGUiLGIsZixhLGQsYyl9LCJ+IjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz14O3R5cGVvZiBiPT0ic3RyaW5nIiYmIWwudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXcpLGcoInByZXZpb3VzU2libGluZyIsYixmLGEsZCxjKX19LGZpbmQ6e0lEOmZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50QnlJZCE9InVuZGVmaW5lZCImJiFjKXt2YXIgZD1iLmdldEVsZW1lbnRCeUlkKGFbMV0pO3JldHVybiBkJiZkLnBhcmVudE5vZGU/W2RdOltdfX0sTkFNRTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlOYW1lIT0idW5kZWZpbmVkIil7dmFyIGM9W10sZD1iLmdldEVsZW1lbnRzQnlOYW1lKGFbMV0pO2Zvcih2YXIgZT0wLGY9ZC5sZW5ndGg7ZTxmO2UrKylkW2VdLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09YVsxXSYmYy5wdXNoKGRbZV0pO3JldHVybiBjLmxlbmd0aD09PTA/bnVsbDpjfX0sVEFHOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiKXJldHVybiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGFbMV0pfX0scHJlRmlsdGVyOntDTEFTUzpmdW5jdGlvbihhLGIsYyxkLGUsZil7YT0iICIrYVsxXS5yZXBsYWNlKGosIiIpKyIgIjtpZihmKXJldHVybiBhO2Zvcih2YXIgZz0wLGg7KGg9YltnXSkhPW51bGw7ZysrKWgmJihlXihoLmNsYXNzTmFtZSYmKCIgIitoLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoL1tcdFxuXHJdL2csIiAiKS5pbmRleE9mKGEpPj0wKT9jfHxkLnB1c2goaCk6YyYmKGJbZ109ITEpKTtyZXR1cm4hMX0sSUQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV0ucmVwbGFjZShqLCIiKX0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGFbMV0ucmVwbGFjZShqLCIiKS50b0xvd2VyQ2FzZSgpfSxDSElMRDpmdW5jdGlvbihhKXtpZihhWzFdPT09Im50aCIpe2FbMl18fG0uZXJyb3IoYVswXSksYVsyXT1hWzJdLnJlcGxhY2UoL15cK3xccyovZywiIik7dmFyIGI9LygtPykoXGQqKSg/Om4oWytcLV0/XGQqKSk/Ly5leGVjKGFbMl09PT0iZXZlbiImJiIybiJ8fGFbMl09PT0ib2RkIiYmIjJuKzEifHwhL1xELy50ZXN0KGFbMl0pJiYiMG4rIithWzJdfHxhWzJdKTthWzJdPWJbMV0rKGJbMl18fDEpLTAsYVszXT1iWzNdLTB9ZWxzZSBhWzJdJiZtLmVycm9yKGFbMF0pO2FbMF09ZSsrO3JldHVybiBhfSxBVFRSOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz1hWzFdPWFbMV0ucmVwbGFjZShqLCIiKTshZiYmby5hdHRyTWFwW2ddJiYoYVsxXT1vLmF0dHJNYXBbZ10pLGFbNF09KGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGosIiIpLGFbMl09PT0ifj0iJiYoYVs0XT0iICIrYVs0XSsiICIpO3JldHVybiBhfSxQU0VVRE86ZnVuY3Rpb24oYixjLGQsZSxmKXtpZihiWzFdPT09Im5vdCIpaWYoKGEuZXhlYyhiWzNdKXx8IiIpLmxlbmd0aD4xfHwvXlx3Ly50ZXN0KGJbM10pKWJbM109bShiWzNdLG51bGwsbnVsbCxjKTtlbHNle3ZhciBnPW0uZmlsdGVyKGJbM10sYyxkLCEwXmYpO2R8fGUucHVzaC5hcHBseShlLGcpO3JldHVybiExfWVsc2UgaWYoby5tYXRjaC5QT1MudGVzdChiWzBdKXx8by5tYXRjaC5DSElMRC50ZXN0KGJbMF0pKXJldHVybiEwO3JldHVybiBifSxQT1M6ZnVuY3Rpb24oYSl7YS51bnNoaWZ0KCEwKTtyZXR1cm4gYX19LGZpbHRlcnM6e2VuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMSYmYS50eXBlIT09ImhpZGRlbiJ9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2hlY2tlZD09PSEwfSxzZWxlY3RlZDpmdW5jdGlvbihhKXthLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O3JldHVybiBhLnNlbGVjdGVkPT09ITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hIWEuZmlyc3RDaGlsZH0sZW1wdHk6ZnVuY3Rpb24oYSl7cmV0dXJuIWEuZmlyc3RDaGlsZH0saGFzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIW0oY1szXSxhKS5sZW5ndGh9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4vaFxkL2kudGVzdChhLm5vZGVOYW1lKX0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpLGM9YS50eXBlO3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYidGV4dCI9PT1jJiYoYj09PWN8fGI9PT1udWxsKX0scmFkaW86ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJyYWRpbyI9PT1hLnR5cGV9LGNoZWNrYm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiY2hlY2tib3giPT09YS50eXBlfSxmaWxlOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiZmlsZSI9PT1hLnR5cGV9LHBhc3N3b3JkOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicGFzc3dvcmQiPT09YS50eXBlfSxzdWJtaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInN1Ym1pdCI9PT1hLnR5cGV9LGltYWdlOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiaW1hZ2UiPT09YS50eXBlfSxyZXNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKGI9PT0iaW5wdXQifHxiPT09ImJ1dHRvbiIpJiYicmVzZXQiPT09YS50eXBlfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBiPT09ImlucHV0IiYmImJ1dHRvbiI9PT1hLnR5cGV8fGI9PT0iYnV0dG9uIn0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KGEubm9kZU5hbWUpfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PWEub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50fX0sc2V0RmlsdGVyczp7Zmlyc3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PTB9LGxhc3Q6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGI9PT1kLmxlbmd0aC0xfSxldmVuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIlMj09PTB9LG9kZDpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0xfSxsdDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI8Y1szXS0wfSxndDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI+Y1szXS0wfSxudGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifSxlcTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGNbM10tMD09PWJ9fSxmaWx0ZXI6e1BTRVVETzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzFdLGY9by5maWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCk7aWYoZT09PSJjb250YWlucyIpcmV0dXJuKGEudGV4dENvbnRlbnR8fGEuaW5uZXJUZXh0fHxuKFthXSl8fCIiKS5pbmRleE9mKGJbM10pPj0wO2lmKGU9PT0ibm90Iil7dmFyIGc9YlszXTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspaWYoZ1toXT09PWEpcmV0dXJuITE7cmV0dXJuITB9bS5lcnJvcihlKX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPWJbMV0sbD1hO3N3aXRjaChrKXtjYXNlIm9ubHkiOmNhc2UiZmlyc3QiOndoaWxlKGw9bC5wcmV2aW91c1NpYmxpbmcpaWYobC5ub2RlVHlwZT09PTEpcmV0dXJuITE7aWYoaz09PSJmaXJzdCIpcmV0dXJuITA7bD1hO2Nhc2UibGFzdCI6d2hpbGUobD1sLm5leHRTaWJsaW5nKWlmKGwubm9kZVR5cGU9PT0xKXJldHVybiExO3JldHVybiEwO2Nhc2UibnRoIjpjPWJbMl0sZT1iWzNdO2lmKGM9PT0xJiZlPT09MClyZXR1cm4hMDtmPWJbMF0sZz1hLnBhcmVudE5vZGU7aWYoZyYmKGdbZF0hPT1mfHwhYS5ub2RlSW5kZXgpKXtpPTA7Zm9yKGw9Zy5maXJzdENoaWxkO2w7bD1sLm5leHRTaWJsaW5nKWwubm9kZVR5cGU9PT0xJiYobC5ub2RlSW5kZXg9KytpKTtnW2RdPWZ9aj1hLm5vZGVJbmRleC1lO3JldHVybiBjPT09MD9qPT09MDpqJWM9PT0wJiZqL2M+PTB9fSxJRDpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVUeXBlPT09MSYmYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifSxUQUc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PSIqIiYmYS5ub2RlVHlwZT09PTF8fCEhYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn0sQ0xBU1M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oIiAiKyhhLmNsYXNzTmFtZXx8YS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpKyIgIikuaW5kZXhPZihiKT4tMX0sQVRUUjpmdW5jdGlvbihhLGIpe3ZhciBjPWJbMV0sZD1tLmF0dHI/bS5hdHRyKGEsYyk6by5hdHRySGFuZGxlW2NdP28uYXR0ckhhbmRsZVtjXShhKTphW2NdIT1udWxsP2FbY106YS5nZXRBdHRyaWJ1dGUoYyksZT1kKyIiLGY9YlsyXSxnPWJbNF07cmV0dXJuIGQ9PW51bGw/Zj09PSIhPSI6IWYmJm0uYXR0cj9kIT1udWxsOmY9PT0iPSI/ZT09PWc6Zj09PSIqPSI/ZS5pbmRleE9mKGcpPj0wOmY9PT0ifj0iPygiICIrZSsiICIpLmluZGV4T2YoZyk+PTA6Zz9mPT09IiE9Ij9lIT09ZzpmPT09Il49Ij9lLmluZGV4T2YoZyk9PT0wOmY9PT0iJD0iP2Uuc3Vic3RyKGUubGVuZ3RoLWcubGVuZ3RoKT09PWc6Zj09PSJ8PSI/ZT09PWd8fGUuc3Vic3RyKDAsZy5sZW5ndGgrMSk9PT1nKyItIjohMTplJiZkIT09ITF9LFBPUzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzJdLGY9by5zZXRGaWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCl9fX0scD1vLm1hdGNoLlBPUyxxPWZ1bmN0aW9uKGEsYil7cmV0dXJuIlxcIisoYi0wKzEpfTtmb3IodmFyIHIgaW4gby5tYXRjaClvLm1hdGNoW3JdPW5ldyBSZWdFeHAoby5tYXRjaFtyXS5zb3VyY2UrLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlKSxvLmxlZnRNYXRjaFtyXT1uZXcgUmVnRXhwKC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2Urby5tYXRjaFtyXS5zb3VyY2UucmVwbGFjZSgvXFwoXGQrKS9nLHEpKTt2YXIgcz1mdW5jdGlvbihhLGIpe2E9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKTtpZihiKXtiLnB1c2guYXBwbHkoYixhKTtyZXR1cm4gYn1yZXR1cm4gYX07dHJ5e0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2godCl7cz1mdW5jdGlvbihhLGIpe3ZhciBjPTAsZD1ifHxbXTtpZihnLmNhbGwoYSk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsYSk7ZWxzZSBpZih0eXBlb2YgYS5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZT1hLmxlbmd0aDtjPGU7YysrKWQucHVzaChhW2NdKTtlbHNlIGZvcig7YVtjXTtjKyspZC5wdXNoKGFbY10pO3JldHVybiBkfX12YXIgdSx2O2MuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP3U9ZnVuY3Rpb24oYSxiKXtpZihhPT09Yil7aD0hMDtyZXR1cm4gMH1pZighYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8IWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24pcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MTtyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0Py0xOjF9Oih1PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoYS5zb3VyY2VJbmRleCYmYi5zb3VyY2VJbmRleClyZXR1cm4gYS5zb3VyY2VJbmRleC1iLnNvdXJjZUluZGV4O3ZhciBjLGQsZT1bXSxmPVtdLGc9YS5wYXJlbnROb2RlLGk9Yi5wYXJlbnROb2RlLGo9ZztpZihnPT09aSlyZXR1cm4gdihhLGIpO2lmKCFnKXJldHVybi0xO2lmKCFpKXJldHVybiAxO3doaWxlKGopZS51bnNoaWZ0KGopLGo9ai5wYXJlbnROb2RlO2o9aTt3aGlsZShqKWYudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtjPWUubGVuZ3RoLGQ9Zi5sZW5ndGg7Zm9yKHZhciBrPTA7azxjJiZrPGQ7aysrKWlmKGVba10hPT1mW2tdKXJldHVybiB2KGVba10sZltrXSk7cmV0dXJuIGs9PT1jP3YoYSxmW2tdLC0xKTp2KGVba10sYiwxKX0sdj1mdW5jdGlvbihhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7dmFyIGQ9YS5uZXh0U2libGluZzt3aGlsZShkKXtpZihkPT09YilyZXR1cm4tMTtkPWQubmV4dFNpYmxpbmd9cmV0dXJuIDF9KSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKSxlPWMuZG9jdW1lbnRFbGVtZW50O2EuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIicvPiIsZS5pbnNlcnRCZWZvcmUoYSxlLmZpcnN0Q2hpbGQpLGMuZ2V0RWxlbWVudEJ5SWQoZCkmJihvLmZpbmQuSUQ9ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBjLmdldEVsZW1lbnRCeUlkIT0idW5kZWZpbmVkIiYmIWQpe3ZhciBlPWMuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGU/ZS5pZD09PWFbMV18fHR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09YVsxXT9bZV06YjpbXX19LG8uZmlsdGVyLklEPWZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9InVuZGVmaW5lZCImJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmMmJmMubm9kZVZhbHVlPT09Yn0pLGUucmVtb3ZlQ2hpbGQoYSksZT1hPW51bGx9KCksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQoYy5jcmVhdGVDb21tZW50KCIiKSksYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aD4wJiYoby5maW5kLlRBRz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSk7aWYoYVsxXT09PSIqIil7dmFyIGQ9W107Zm9yKHZhciBlPTA7Y1tlXTtlKyspY1tlXS5ub2RlVHlwZT09PTEmJmQucHVzaChjW2VdKTtjPWR9cmV0dXJuIGN9KSxhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsYS5maXJzdENoaWxkJiZ0eXBlb2YgYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9InVuZGVmaW5lZCImJmEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PSIjIiYmKG8uYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9KSxhPW51bGx9KCksYy5xdWVyeVNlbGVjdG9yQWxsJiZmdW5jdGlvbigpe3ZhciBhPW0sYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9Il9fc2l6emxlX18iO2IuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIWIucXVlcnlTZWxlY3RvckFsbHx8Yi5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aCE9PTApe209ZnVuY3Rpb24oYixlLGYsZyl7ZT1lfHxjO2lmKCFnJiYhbS5pc1hNTChlKSl7dmFyIGg9L14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoYik7aWYoaCYmKGUubm9kZVR5cGU9PT0xfHxlLm5vZGVUeXBlPT09OSkpe2lmKGhbMV0pcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKSxmKTtpZihoWzJdJiZvLmZpbmQuQ0xBU1MmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gcyhlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaFsyXSksZil9aWYoZS5ub2RlVHlwZT09PTkpe2lmKGI9PT0iYm9keSImJmUuYm9keSlyZXR1cm4gcyhbZS5ib2R5XSxmKTtpZihoJiZoWzNdKXt2YXIgaT1lLmdldEVsZW1lbnRCeUlkKGhbM10pO2lmKCFpfHwhaS5wYXJlbnROb2RlKXJldHVybiBzKFtdLGYpO2lmKGkuaWQ9PT1oWzNdKXJldHVybiBzKFtpXSxmKX10cnl7cmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKGIpLGYpfWNhdGNoKGope319ZWxzZSBpZihlLm5vZGVUeXBlPT09MSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im9iamVjdCIpe3ZhciBrPWUsbD1lLmdldEF0dHJpYnV0ZSgiaWQiKSxuPWx8fGQscD1lLnBhcmVudE5vZGUscT0vXlxzKlsrfl0vLnRlc3QoYik7bD9uPW4ucmVwbGFjZSgvJy9nLCJcXCQmIik6ZS5zZXRBdHRyaWJ1dGUoImlkIixuKSxxJiZwJiYoZT1lLnBhcmVudE5vZGUpO3RyeXtpZighcXx8cClyZXR1cm4gcyhlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZD0nIituKyInXSAiK2IpLGYpfWNhdGNoKHIpe31maW5hbGx5e2x8fGsucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGEoYixlLGYsZyl9O2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtiPW51bGx9fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5kb2N1bWVudEVsZW1lbnQsYj1hLm1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yO2lmKGIpe3ZhciBkPSFiLmNhbGwoYy5jcmVhdGVFbGVtZW50KCJkaXYiKSwiZGl2IiksZT0hMTt0cnl7Yi5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LCJbdGVzdCE9JyddOnNpenpsZSIpfWNhdGNoKGYpe2U9ITB9bS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxjKXtjPWMucmVwbGFjZSgvXD1ccyooW14nIlxdXSopXHMqXF0vZywiPSckMSddIik7aWYoIW0uaXNYTUwoYSkpdHJ5e2lmKGV8fCFvLm1hdGNoLlBTRVVETy50ZXN0KGMpJiYhLyE9Ly50ZXN0KGMpKXt2YXIgZj1iLmNhbGwoYSxjKTtpZihmfHwhZHx8YS5kb2N1bWVudCYmYS5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBmfX1jYXRjaChnKXt9cmV0dXJuIG0oYyxudWxsLG51bGwsW2FdKS5sZW5ndGg+MH19fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEhYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGghPT0wKXthLmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiO2lmKGEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTEpcmV0dXJuO28ub3JkZXIuc3BsaWNlKDEsMCwiQ0xBU1MiKSxvLmZpbmQuQ0xBU1M9ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPSJ1bmRlZmluZWQiJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGFbMV0pfSxhPW51bGx9fSgpLGMuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zP20uY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSE9PWImJihhLmNvbnRhaW5zP2EuY29udGFpbnMoYik6ITApfTpjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNil9Om0uY29udGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj0oYT9hLm93bmVyRG9jdW1lbnR8fGE6MCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiP2Iubm9kZU5hbWUhPT0iSFRNTCI6ITF9O3ZhciB5PWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPVtdLGY9IiIsZz1iLm5vZGVUeXBlP1tiXTpiO3doaWxlKGQ9by5tYXRjaC5QU0VVRE8uZXhlYyhhKSlmKz1kWzBdLGE9YS5yZXBsYWNlKG8ubWF0Y2guUFNFVURPLCIiKTthPW8ucmVsYXRpdmVbYV0/YSsiKiI6YTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspbShhLGdbaF0sZSxjKTtyZXR1cm4gbS5maWx0ZXIoZixlKX07bS5hdHRyPWYuYXR0cixtLnNlbGVjdG9ycy5hdHRyTWFwPXt9LGYuZmluZD1tLGYuZXhwcj1tLnNlbGVjdG9ycyxmLmV4cHJbIjoiXT1mLmV4cHIuZmlsdGVycyxmLnVuaXF1ZT1tLnVuaXF1ZVNvcnQsZi50ZXh0PW0uZ2V0VGV4dCxmLmlzWE1MRG9jPW0uaXNYTUwsZi5jb250YWlucz1tLmNvbnRhaW5zfSgpO3ZhciBMPS9VbnRpbCQvLE09L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sTj0vLC8sTz0vXi5bXjojXFtcLixdKiQvLFA9QXJyYXkucHJvdG90eXBlLnNsaWNlLFE9Zi5leHByLm1hdGNoLlBPUyxSPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYyxkO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihmLmNvbnRhaW5zKGJbY10sdGhpcykpcmV0dXJuITB9KTt2YXIgZT10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksZyxoLGk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2c9ZS5sZW5ndGgsZi5maW5kKGEsdGhpc1tjXSxlKTtpZihjPjApZm9yKGg9ZztoPGUubGVuZ3RoO2grKylmb3IoaT0wO2k8ZztpKyspaWYoZVtpXT09PWVbaF0pe2Uuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGV9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1mKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9Yi5sZW5ndGg7YTxjO2ErKylpZihmLmNvbnRhaW5zKHRoaXMsYlthXSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhUKHRoaXMsYSwhMSksIm5vdCIsYSl9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/US50ZXN0KGEpP2YoYSx0aGlzLmNvbnRleHQpLmluZGV4KHRoaXNbMF0pPj0wOmYuZmlsdGVyKGEsdGhpcykubGVuZ3RoPjA6dGhpcy5maWx0ZXIoYSkubGVuZ3RoPjApfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZCxlLGc9dGhpc1swXTtpZihmLmlzQXJyYXkoYSkpe3ZhciBoPTE7d2hpbGUoZyYmZy5vd25lckRvY3VtZW50JiZnIT09Yil7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmKGcpLmlzKGFbZF0pJiZjLnB1c2goe3NlbGVjdG9yOmFbZF0sZWxlbTpnLGxldmVsOmh9KTtnPWcucGFyZW50Tm9kZSxoKyt9cmV0dXJuIGN9dmFyIGk9US50ZXN0KGEpfHx0eXBlb2YgYSE9InN0cmluZyI/ZihhLGJ8fHRoaXMuY29udGV4dCk6MDtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO3doaWxlKGcpe2lmKGk/aS5pbmRleChnKT4tMTpmLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGcsYSkpe2MucHVzaChnKTticmVha31nPWcucGFyZW50Tm9kZTtpZighZ3x8IWcub3duZXJEb2N1bWVudHx8Zz09PWJ8fGcubm9kZVR5cGU9PT0xMSlicmVha319Yz1jLmxlbmd0aD4xP2YudW5pcXVlKGMpOmM7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGMsImNsb3Nlc3QiLGEpfSxpbmRleDpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMucHJldkFsbCgpLmxlbmd0aDotMTtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGYuaW5BcnJheSh0aGlzWzBdLGYoYSkpO3JldHVybiBmLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYT09InN0cmluZyI/ZihhLGIpOmYubWFrZUFycmF5KGEmJmEubm9kZVR5cGU/W2FdOmEpLGQ9Zi5tZXJnZSh0aGlzLmdldCgpLGMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhTKGNbMF0pfHxTKGRbMF0pP2Q6Zi51bmlxdWUoZCkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSksZi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLm5vZGVUeXBlIT09MTE/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubnRoKGEsMiwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpmLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMsZCl7dmFyIGU9Zi5tYXAodGhpcyxiLGMpO0wudGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1mLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFSW2FdP2YudW5pcXVlKGUpOmUsKHRoaXMubGVuZ3RoPjF8fE4udGVzdChkKSkmJk0udGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsUC5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSxmLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixjKXtjJiYoYT0iOm5vdCgiK2ErIikiKTtyZXR1cm4gYi5sZW5ndGg9PT0xP2YuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106Zi5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1bXSxnPWFbY107d2hpbGUoZyYmZy5ub2RlVHlwZSE9PTkmJihkPT09Ynx8Zy5ub2RlVHlwZSE9PTF8fCFmKGcpLmlzKGQpKSlnLm5vZGVUeXBlPT09MSYmZS5wdXNoKGcpLGc9Z1tjXTtyZXR1cm4gZX0sbnRoOmZ1bmN0aW9uKGEsYixjLGQpe2I9Ynx8MTt2YXIgZT0wO2Zvcig7YTthPWFbY10paWYoYS5ub2RlVHlwZT09PTEmJisrZT09PWIpYnJlYWs7cmV0dXJuIGF9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IoO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pO3ZhciBWPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98Y2FudmFzfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixXPS8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csWD0vXlxzKy8sWT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLFo9LzwoW1x3Ol0rKS8sJD0vPHRib2R5L2ksXz0vPHwmIz9cdys7LyxiYT0vPCg/OnNjcmlwdHxzdHlsZSkvaSxiYj0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLGJjPW5ldyBSZWdFeHAoIjwoPzoiK1YrIikiLCJpIiksYmQ9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksYmU9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSxiZj0vXlxzKjwhKD86XFtDREFUQVxbfFwtXC0pLyxiZz17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfSxiaD1VKGMpO2JnLm9wdGdyb3VwPWJnLm9wdGlvbixiZy50Ym9keT1iZy50Zm9vdD1iZy5jb2xncm91cD1iZy5jYXB0aW9uPWJnLnRoZWFkLGJnLnRoPWJnLnRkLGYuc3VwcG9ydC5odG1sU2VyaWFsaXplfHwoYmcuX2RlZmF1bHQ9WzEsImRpdjxkaXY+IiwiPC9kaXY+Il0pLGYuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Yy50ZXh0KGEuY2FsbCh0aGlzLGIsYy50ZXh0KCkpKX0pO2lmKHR5cGVvZiBhIT0ib2JqZWN0IiYmYSE9PWIpcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8YykuY3JlYXRlVGV4dE5vZGUoYSkpO3JldHVybiBmLnRleHQodGhpcyl9LHdyYXBBbGw6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPWYoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJmEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTEpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Zi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9Zi5jbGVhbihhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLHRoaXMudG9BcnJheSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYSwiYmVmb3JlIixhcmd1bWVudHMpfX0sYWZ0ZXI6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIixhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLGYuY2xlYW4oYXJndW1lbnRzKSk7cmV0dXJuIGF9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkOyhkPXRoaXNbY10pIT1udWxsO2MrKylpZighYXx8Zi5maWx0ZXIoYSxbZF0pLmxlbmd0aCkhYiYmZC5ub2RlVHlwZT09PTEmJihmLmNsZWFuRGF0YShkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLGYuY2xlYW5EYXRhKFtkXSkpLGQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpCntmb3IodmFyIGE9MCxiOyhiPXRoaXNbYV0pIT1udWxsO2ErKyl7Yi5ub2RlVHlwZT09PTEmJmYuY2xlYW5EYXRhKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7d2hpbGUoYi5maXJzdENoaWxkKWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXthPWE9PW51bGw/ITE6YSxiPWI9PW51bGw/YTpiO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBmLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe2lmKGE9PT1iKXJldHVybiB0aGlzWzBdJiZ0aGlzWzBdLm5vZGVUeXBlPT09MT90aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKFcsIiIpOm51bGw7aWYodHlwZW9mIGE9PSJzdHJpbmciJiYhYmEudGVzdChhKSYmKGYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZXx8IVgudGVzdChhKSkmJiFiZ1soWi5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1hLnJlcGxhY2UoWSwiPCQxPjwvJDI+Iik7dHJ5e2Zvcih2YXIgYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl0aGlzW2NdLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKHRoaXNbY10uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksdGhpc1tjXS5pbm5lckhUTUw9YSl9Y2F0Y2goZSl7dGhpcy5lbXB0eSgpLmFwcGVuZChhKX19ZWxzZSBmLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Yy5odG1sKGEuY2FsbCh0aGlzLGIsYy5odG1sKCkpKX0pOnRoaXMuZW1wdHkoKS5hcHBlbmQoYSk7cmV0dXJuIHRoaXN9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9Zih0aGlzKSxkPWMuaHRtbCgpO2MucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixkKSl9KTt0eXBlb2YgYSE9InN0cmluZyImJihhPWYoYSkuZGV0YWNoKCkpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5leHRTaWJsaW5nLGM9dGhpcy5wYXJlbnROb2RlO2YodGhpcykucmVtb3ZlKCksYj9mKGIpLmJlZm9yZShhKTpmKGMpLmFwcGVuZChhKX0pfXJldHVybiB0aGlzLmxlbmd0aD90aGlzLnB1c2hTdGFjayhmKGYuaXNGdW5jdGlvbihhKT9hKCk6YSksInJlcGxhY2VXaXRoIixhKTp0aGlzfSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVtb3ZlKGEsITApfSxkb21NYW5pcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZyxoLGksaj1hWzBdLGs9W107aWYoIWYuc3VwcG9ydC5jaGVja0Nsb25lJiZhcmd1bWVudHMubGVuZ3RoPT09MyYmdHlwZW9mIGo9PSJzdHJpbmciJiZiZC50ZXN0KGopKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmKHRoaXMpLmRvbU1hbmlwKGEsYyxkLCEwKX0pO2lmKGYuaXNGdW5jdGlvbihqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBnPWYodGhpcyk7YVswXT1qLmNhbGwodGhpcyxlLGM/Zy5odG1sKCk6YiksZy5kb21NYW5pcChhLGMsZCl9KTtpZih0aGlzWzBdKXtpPWomJmoucGFyZW50Tm9kZSxmLnN1cHBvcnQucGFyZW50Tm9kZSYmaSYmaS5ub2RlVHlwZT09PTExJiZpLmNoaWxkTm9kZXMubGVuZ3RoPT09dGhpcy5sZW5ndGg/ZT17ZnJhZ21lbnQ6aX06ZT1mLmJ1aWxkRnJhZ21lbnQoYSx0aGlzLGspLGg9ZS5mcmFnbWVudCxoLmNoaWxkTm9kZXMubGVuZ3RoPT09MT9nPWg9aC5maXJzdENoaWxkOmc9aC5maXJzdENoaWxkO2lmKGcpe2M9YyYmZi5ub2RlTmFtZShnLCJ0ciIpO2Zvcih2YXIgbD0wLG09dGhpcy5sZW5ndGgsbj1tLTE7bDxtO2wrKylkLmNhbGwoYz9iaSh0aGlzW2xdLGcpOnRoaXNbbF0sZS5jYWNoZWFibGV8fG0+MSYmbDxuP2YuY2xvbmUoaCwhMCwhMCk6aCl9ay5sZW5ndGgmJmYuZWFjaChrLGJwKX1yZXR1cm4gdGhpc319KSxmLmJ1aWxkRnJhZ21lbnQ9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGcsaCxpLGo9YVswXTtiJiZiWzBdJiYoaT1iWzBdLm93bmVyRG9jdW1lbnR8fGJbMF0pLGkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudHx8KGk9YyksYS5sZW5ndGg9PT0xJiZ0eXBlb2Ygaj09InN0cmluZyImJmoubGVuZ3RoPDUxMiYmaT09PWMmJmouY2hhckF0KDApPT09IjwiJiYhYmIudGVzdChqKSYmKGYuc3VwcG9ydC5jaGVja0Nsb25lfHwhYmQudGVzdChqKSkmJihmLnN1cHBvcnQuaHRtbDVDbG9uZXx8IWJjLnRlc3QoaikpJiYoZz0hMCxoPWYuZnJhZ21lbnRzW2pdLGgmJmghPT0xJiYoZT1oKSksZXx8KGU9aS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZi5jbGVhbihhLGksZSxkKSksZyYmKGYuZnJhZ21lbnRzW2pdPWg/ZToxKTtyZXR1cm57ZnJhZ21lbnQ6ZSxjYWNoZWFibGU6Z319LGYuZnJhZ21lbnRzPXt9LGYuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihjKXt2YXIgZD1bXSxlPWYoYyksZz10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtpZihnJiZnLm5vZGVUeXBlPT09MTEmJmcuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZlLmxlbmd0aD09PTEpe2VbYl0odGhpc1swXSk7cmV0dXJuIHRoaXN9Zm9yKHZhciBoPTAsaT1lLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj0oaD4wP3RoaXMuY2xvbmUoITApOnRoaXMpLmdldCgpO2YoZVtoXSlbYl0oaiksZD1kLmNvbmNhdChqKX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soZCxhLGUuc2VsZWN0b3IpfX0pLGYuZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxnLGg9Zi5zdXBwb3J0Lmh0bWw1Q2xvbmV8fCFiYy50ZXN0KCI8IithLm5vZGVOYW1lKT9hLmNsb25lTm9kZSghMCk6Ym8oYSk7aWYoKCFmLnN1cHBvcnQubm9DbG9uZUV2ZW50fHwhZi5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSYmKGEubm9kZVR5cGU9PT0xfHxhLm5vZGVUeXBlPT09MTEpJiYhZi5pc1hNTERvYyhhKSl7YmsoYSxoKSxkPWJsKGEpLGU9YmwoaCk7Zm9yKGc9MDtkW2ddOysrZyllW2ddJiZiayhkW2ddLGVbZ10pfWlmKGIpe2JqKGEsaCk7aWYoYyl7ZD1ibChhKSxlPWJsKGgpO2ZvcihnPTA7ZFtnXTsrK2cpYmooZFtnXSxlW2ddKX19ZD1lPW51bGw7cmV0dXJuIGh9LGNsZWFuOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBnO2I9Ynx8Yyx0eXBlb2YgYi5jcmVhdGVFbGVtZW50PT0idW5kZWZpbmVkIiYmKGI9Yi5vd25lckRvY3VtZW50fHxiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fGMpO3ZhciBoPVtdLGk7Zm9yKHZhciBqPTAsazsoaz1hW2pdKSE9bnVsbDtqKyspe3R5cGVvZiBrPT0ibnVtYmVyIiYmKGsrPSIiKTtpZighayljb250aW51ZTtpZih0eXBlb2Ygaz09InN0cmluZyIpaWYoIV8udGVzdChrKSlrPWIuY3JlYXRlVGV4dE5vZGUoayk7ZWxzZXtrPWsucmVwbGFjZShZLCI8JDE+PC8kMj4iKTt2YXIgbD0oWi5leGVjKGspfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLG09YmdbbF18fGJnLl9kZWZhdWx0LG49bVswXSxvPWIuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yj09PWM/YmguYXBwZW5kQ2hpbGQobyk6VShiKS5hcHBlbmRDaGlsZChvKSxvLmlubmVySFRNTD1tWzFdK2srbVsyXTt3aGlsZShuLS0pbz1vLmxhc3RDaGlsZDtpZighZi5zdXBwb3J0LnRib2R5KXt2YXIgcD0kLnRlc3QoaykscT1sPT09InRhYmxlIiYmIXA/by5maXJzdENoaWxkJiZvLmZpcnN0Q2hpbGQuY2hpbGROb2RlczptWzFdPT09Ijx0YWJsZT4iJiYhcD9vLmNoaWxkTm9kZXM6W107Zm9yKGk9cS5sZW5ndGgtMTtpPj0wOy0taSlmLm5vZGVOYW1lKHFbaV0sInRib2R5IikmJiFxW2ldLmNoaWxkTm9kZXMubGVuZ3RoJiZxW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocVtpXSl9IWYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmWC50ZXN0KGspJiZvLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKFguZXhlYyhrKVswXSksby5maXJzdENoaWxkKSxrPW8uY2hpbGROb2Rlc312YXIgcjtpZighZi5zdXBwb3J0LmFwcGVuZENoZWNrZWQpaWYoa1swXSYmdHlwZW9mIChyPWsubGVuZ3RoKT09Im51bWJlciIpZm9yKGk9MDtpPHI7aSsrKWJuKGtbaV0pO2Vsc2UgYm4oayk7ay5ub2RlVHlwZT9oLnB1c2goayk6aD1mLm1lcmdlKGgsayl9aWYoZCl7Zz1mdW5jdGlvbihhKXtyZXR1cm4hYS50eXBlfHxiZS50ZXN0KGEudHlwZSl9O2ZvcihqPTA7aFtqXTtqKyspaWYoZSYmZi5ub2RlTmFtZShoW2pdLCJzY3JpcHQiKSYmKCFoW2pdLnR5cGV8fGhbal0udHlwZS50b0xvd2VyQ2FzZSgpPT09InRleHQvamF2YXNjcmlwdCIpKWUucHVzaChoW2pdLnBhcmVudE5vZGU/aFtqXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGhbal0pOmhbal0pO2Vsc2V7aWYoaFtqXS5ub2RlVHlwZT09PTEpe3ZhciBzPWYuZ3JlcChoW2pdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxnKTtoLnNwbGljZS5hcHBseShoLFtqKzEsMF0uY29uY2F0KHMpKX1kLmFwcGVuZENoaWxkKGhbal0pfX1yZXR1cm4gaH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1mLmNhY2hlLGU9Zi5ldmVudC5zcGVjaWFsLGc9Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG87Zm9yKHZhciBoPTAsaTsoaT1hW2hdKSE9bnVsbDtoKyspe2lmKGkubm9kZU5hbWUmJmYubm9EYXRhW2kubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pY29udGludWU7Yz1pW2YuZXhwYW5kb107aWYoYyl7Yj1kW2NdO2lmKGImJmIuZXZlbnRzKXtmb3IodmFyIGogaW4gYi5ldmVudHMpZVtqXT9mLmV2ZW50LnJlbW92ZShpLGopOmYucmVtb3ZlRXZlbnQoaSxqLGIuaGFuZGxlKTtiLmhhbmRsZSYmKGIuaGFuZGxlLmVsZW09bnVsbCl9Zz9kZWxldGUgaVtmLmV4cGFuZG9dOmkucmVtb3ZlQXR0cmlidXRlJiZpLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pLGRlbGV0ZSBkW2NdfX19fSk7dmFyIGJxPS9hbHBoYVwoW14pXSpcKS9pLGJyPS9vcGFjaXR5PShbXildKikvLGJzPS8oW0EtWl18Xm1zKS9nLGJ0PS9eLT9cZCsoPzpweCk/JC9pLGJ1PS9eLT9cZC8sYnY9L14oW1wtK10pPShbXC0rLlxkZV0rKS8sYnc9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJ4PVsiTGVmdCIsIlJpZ2h0Il0sYnk9WyJUb3AiLCJCb3R0b20iXSxieixiQSxiQjtmLmZuLmNzcz1mdW5jdGlvbihhLGMpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yJiZjPT09YilyZXR1cm4gdGhpcztyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGMsITAsZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkIT09Yj9mLnN0eWxlKGEsYyxkKTpmLmNzcyhhLGMpfSl9LGYuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9YnooYSwib3BhY2l0eSIsIm9wYWNpdHkiKTtyZXR1cm4gYz09PSIiPyIxIjpjfXJldHVybiBhLnN0eWxlLm9wYWNpdHl9fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6Zi5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGMsZCxlKXtpZighIWEmJmEubm9kZVR5cGUhPT0zJiZhLm5vZGVUeXBlIT09OCYmISFhLnN0eWxlKXt2YXIgZyxoLGk9Zi5jYW1lbENhc2UoYyksaj1hLnN0eWxlLGs9Zi5jc3NIb29rc1tpXTtjPWYuY3NzUHJvcHNbaV18fGk7aWYoZD09PWIpe2lmKGsmJiJnZXQiaW4gayYmKGc9ay5nZXQoYSwhMSxlKSkhPT1iKXJldHVybiBnO3JldHVybiBqW2NdfWg9dHlwZW9mIGQsaD09PSJzdHJpbmciJiYoZz1idi5leGVjKGQpKSYmKGQ9KyhnWzFdKzEpKitnWzJdK3BhcnNlRmxvYXQoZi5jc3MoYSxjKSksaD0ibnVtYmVyIik7aWYoZD09bnVsbHx8aD09PSJudW1iZXIiJiZpc05hTihkKSlyZXR1cm47aD09PSJudW1iZXIiJiYhZi5jc3NOdW1iZXJbaV0mJihkKz0icHgiKTtpZigha3x8ISgic2V0ImluIGspfHwoZD1rLnNldChhLGQpKSE9PWIpdHJ5e2pbY109ZH1jYXRjaChsKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnO2M9Zi5jYW1lbENhc2UoYyksZz1mLmNzc0hvb2tzW2NdLGM9Zi5jc3NQcm9wc1tjXXx8YyxjPT09ImNzc0Zsb2F0IiYmKGM9ImZsb2F0Iik7aWYoZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGQpKSE9PWIpcmV0dXJuIGU7aWYoYnopcmV0dXJuIGJ6KGEsYyl9LHN3YXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9O2Zvcih2YXIgZSBpbiBiKWRbZV09YS5zdHlsZVtlXSxhLnN0eWxlW2VdPWJbZV07Yy5jYWxsKGEpO2ZvcihlIGluIGIpYS5zdHlsZVtlXT1kW2VdfX0pLGYuY3VyQ1NTPWYuY3NzLGYuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtmLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlO2lmKGMpe2lmKGEub2Zmc2V0V2lkdGghPT0wKXJldHVybiBiQyhhLGIsZCk7Zi5zd2FwKGEsYncsZnVuY3Rpb24oKXtlPWJDKGEsYixkKX0pO3JldHVybiBlfX0sc2V0OmZ1bmN0aW9uKGEsYil7aWYoIWJ0LnRlc3QoYikpcmV0dXJuIGI7Yj1wYXJzZUZsb2F0KGIpO2lmKGI+PTApcmV0dXJuIGIrInB4In19fSksZi5zdXBwb3J0Lm9wYWNpdHl8fChmLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBici50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlLGU9Zi5pc051bWVyaWMoYik/ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSI6IiIsZz1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2Muem9vbT0xO2lmKGI+PTEmJmYudHJpbShnLnJlcGxhY2UoYnEsIiIpKT09PSIiKXtjLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIik7aWYoZCYmIWQuZmlsdGVyKXJldHVybn1jLmZpbHRlcj1icS50ZXN0KGcpP2cucmVwbGFjZShicSxlKTpnKyIgIitlfX0pLGYoZnVuY3Rpb24oKXtmLnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KGYuY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihhLGIpe3ZhciBjO2Yuc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxmdW5jdGlvbigpe2I/Yz1ieihhLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW5SaWdodCIpOmM9YS5zdHlsZS5tYXJnaW5SaWdodH0pO3JldHVybiBjfX0pfSksYy5kZWZhdWx0VmlldyYmYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlJiYoYkE9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU7Yj1iLnJlcGxhY2UoYnMsIi0kMSIpLnRvTG93ZXJDYXNlKCksKGQ9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSYmKGU9ZC5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCkpJiYoYz1lLmdldFByb3BlcnR5VmFsdWUoYiksYz09PSIiJiYhZi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGEpJiYoYz1mLnN0eWxlKGEsYikpKTtyZXR1cm4gY30pLGMuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKGJCPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9YS5jdXJyZW50U3R5bGUmJmEuY3VycmVudFN0eWxlW2JdLGc9YS5zdHlsZTtmPT09bnVsbCYmZyYmKGU9Z1tiXSkmJihmPWUpLCFidC50ZXN0KGYpJiZidS50ZXN0KGYpJiYoYz1nLmxlZnQsZD1hLnJ1bnRpbWVTdHlsZSYmYS5ydW50aW1lU3R5bGUubGVmdCxkJiYoYS5ydW50aW1lU3R5bGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxnLmxlZnQ9Yj09PSJmb250U2l6ZSI/IjFlbSI6Znx8MCxmPWcucGl4ZWxMZWZ0KyJweCIsZy5sZWZ0PWMsZCYmKGEucnVudGltZVN0eWxlLmxlZnQ9ZCkpO3JldHVybiBmPT09IiI/ImF1dG8iOmZ9KSxiej1iQXx8YkIsZi5leHByJiZmLmV4cHIuZmlsdGVycyYmKGYuZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFdpZHRoLGM9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGI9PT0wJiZjPT09MHx8IWYuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMmJihhLnN0eWxlJiZhLnN0eWxlLmRpc3BsYXl8fGYuY3NzKGEsImRpc3BsYXkiKSk9PT0ibm9uZSJ9LGYuZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIWYuZXhwci5maWx0ZXJzLmhpZGRlbihhKX0pO3ZhciBiRD0vJTIwL2csYkU9L1xbXF0kLyxiRj0vXHI/XG4vZyxiRz0vIy4qJC8sYkg9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9tZyxiST0vXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksYko9L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxiSz0vXig/OkdFVHxIRUFEKSQvLGJMPS9eXC9cLy8sYk09L1w/LyxiTj0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxiTz0vXig/OnNlbGVjdHx0ZXh0YXJlYSkvaSxiUD0vXHMrLyxiUT0vKFs/Jl0pXz1bXiZdKi8sYlI9L14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKSk/KT8vLGJTPWYuZm4ubG9hZCxiVD17fSxiVT17fSxiVixiVyxiWD1bIiovIl0rWyIqIl07dHJ5e2JWPWUuaHJlZn1jYXRjaChiWSl7YlY9Yy5jcmVhdGVFbGVtZW50KCJhIiksYlYuaHJlZj0iIixiVj1iVi5ocmVmfWJXPWJSLmV4ZWMoYlYudG9Mb3dlckNhc2UoKSl8fFtdLGYuZm4uZXh0ZW5kKHtsb2FkOmZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYSE9InN0cmluZyImJmJTKXJldHVybiBiUy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzO3ZhciBlPWEuaW5kZXhPZigiICIpO2lmKGU+PTApe3ZhciBnPWEuc2xpY2UoZSxhLmxlbmd0aCk7YT1hLnNsaWNlKDAsZSl9dmFyIGg9IkdFVCI7YyYmKGYuaXNGdW5jdGlvbihjKT8oZD1jLGM9Yik6dHlwZW9mIGM9PSJvYmplY3QiJiYoYz1mLnBhcmFtKGMsZi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLGg9IlBPU1QiKSk7dmFyIGk9dGhpcztmLmFqYXgoe3VybDphLHR5cGU6aCxkYXRhVHlwZToiaHRtbCIsZGF0YTpjLGNvbXBsZXRlOmZ1bmN0aW9uKGEsYixjKXtjPWEucmVzcG9uc2VUZXh0LGEuaXNSZXNvbHZlZCgpJiYoYS5kb25lKGZ1bmN0aW9uKGEpe2M9YX0pLGkuaHRtbChnP2YoIjxkaXY+IikuYXBwZW5kKGMucmVwbGFjZShiTiwiIikpLmZpbmQoZyk6YykpLGQmJmkuZWFjaChkLFtjLGIsYV0pfX0pO3JldHVybiB0aGlzfSxzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP2YubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8Yk8udGVzdCh0aGlzLm5vZGVOYW1lKXx8YkkudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPWYodGhpcykudmFsKCk7cmV0dXJuIGM9PW51bGw/bnVsbDpmLmlzQXJyYXkoYyk/Zi5tYXAoYyxmdW5jdGlvbihhLGMpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYkYsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGJGLCJcclxuIil9fSkuZ2V0KCl9fSksZi5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxmLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxjKXtmW2NdPWZ1bmN0aW9uKGEsZCxlLGcpe2YuaXNGdW5jdGlvbihkKSYmKGc9Z3x8ZSxlPWQsZD1iKTtyZXR1cm4gZi5hamF4KHt0eXBlOmMsdXJsOmEsZGF0YTpkLHN1Y2Nlc3M6ZSxkYXRhVHlwZTpnfSl9fSksZi5leHRlbmQoe2dldFNjcmlwdDpmdW5jdGlvbihhLGMpe3JldHVybiBmLmdldChhLGIsYywic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmdldChhLGIsYywianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtiP2JfKGEsZi5hamF4U2V0dGluZ3MpOihiPWEsYT1mLmFqYXhTZXR0aW5ncyksYl8oYSxiKTtyZXR1cm4gYX0sYWpheFNldHRpbmdzOnt1cmw6YlYsaXNMb2NhbDpiSi50ZXN0KGJXWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6Ylh9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjphLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpmLnBhcnNlSlNPTiwidGV4dCB4bWwiOmYucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6YlooYlQpLGFqYXhUcmFuc3BvcnQ6YlooYlUpLGFqYXg6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiB3KGEsYyxsLG0pe2lmKHMhPT0yKXtzPTIscSYmY2xlYXJUaW1lb3V0KHEpLHA9YixuPW18fCIiLHYucmVhZHlTdGF0ZT1hPjA/NDowO3ZhciBvLHIsdSx3PWMseD1sP2NiKGQsdixsKTpiLHksejtpZihhPj0yMDAmJmE8MzAwfHxhPT09MzA0KXtpZihkLmlmTW9kaWZpZWQpe2lmKHk9di5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKWYubGFzdE1vZGlmaWVkW2tdPXk7aWYoej12LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIikpZi5ldGFnW2tdPXp9aWYoYT09PTMwNCl3PSJub3Rtb2RpZmllZCIsbz0hMDtlbHNlIHRyeXtyPWNjKGQseCksdz0ic3VjY2VzcyIsbz0hMH1jYXRjaChBKXt3PSJwYXJzZXJlcnJvciIsdT1BfX1lbHNle3U9dztpZighd3x8YSl3PSJlcnJvciIsYTwwJiYoYT0wKX12LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD0iIisoY3x8dyksbz9oLnJlc29sdmVXaXRoKGUsW3Isdyx2XSk6aC5yZWplY3RXaXRoKGUsW3Ysdyx1XSksdi5zdGF0dXNDb2RlKGopLGo9Yix0JiZnLnRyaWdnZXIoImFqYXgiKyhvPyJTdWNjZXNzIjoiRXJyb3IiKSxbdixkLG8/cjp1XSksaS5maXJlV2l0aChlLFt2LHddKSx0JiYoZy50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt2LGRdKSwtLWYuYWN0aXZlfHxmLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfX10eXBlb2YgYT09Im9iamVjdCImJihjPWEsYT1iKSxjPWN8fHt9O3ZhciBkPWYuYWpheFNldHVwKHt9LGMpLGU9ZC5jb250ZXh0fHxkLGc9ZSE9PWQmJihlLm5vZGVUeXBlfHxlIGluc3RhbmNlb2YgZik/ZihlKTpmLmV2ZW50LGg9Zi5EZWZlcnJlZCgpLGk9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksaj1kLnN0YXR1c0NvZGV8fHt9LGssbD17fSxtPXt9LG4sbyxwLHEscixzPTAsdCx1LHY9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7aWYoIXMpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTthPW1bY109bVtjXXx8YSxsW2FdPWJ9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBzPT09Mj9uOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBjO2lmKHM9PT0yKXtpZighbyl7bz17fTt3aGlsZShjPWJILmV4ZWMobikpb1tjWzFdLnRvTG93ZXJDYXNlKCldPWNbMl19Yz1vW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIGM9PT1iP251bGw6Y30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtzfHwoZC5taW1lVHlwZT1hKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7YT1hfHwiYWJvcnQiLHAmJnAuYWJvcnQoYSksdygwLGEpO3JldHVybiB0aGlzfX07aC5wcm9taXNlKHYpLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsdi5jb21wbGV0ZT1pLmFkZCx2LnN0YXR1c0NvZGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI7aWYoczwyKWZvcihiIGluIGEpaltiXT1baltiXSxhW2JdXTtlbHNlIGI9YVt2LnN0YXR1c10sdi50aGVuKGIsYil9cmV0dXJuIHRoaXN9LGQudXJsPSgoYXx8ZC51cmwpKyIiKS5yZXBsYWNlKGJHLCIiKS5yZXBsYWNlKGJMLGJXWzFdKyIvLyIpLGQuZGF0YVR5cGVzPWYudHJpbShkLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoYlApLGQuY3Jvc3NEb21haW49PW51bGwmJihyPWJSLmV4ZWMoZC51cmwudG9Mb3dlckNhc2UoKSksZC5jcm9zc0RvbWFpbj0hKCFyfHxyWzFdPT1iV1sxXSYmclsyXT09YldbMl0mJihyWzNdfHwoclsxXT09PSJodHRwOiI/ODA6NDQzKSk9PShiV1szXXx8KGJXWzFdPT09Imh0dHA6Ij84MDo0NDMpKSkpLGQuZGF0YSYmZC5wcm9jZXNzRGF0YSYmdHlwZW9mIGQuZGF0YSE9InN0cmluZyImJihkLmRhdGE9Zi5wYXJhbShkLmRhdGEsZC50cmFkaXRpb25hbCkpLGIkKGJULGQsYyx2KTtpZihzPT09MilyZXR1cm4hMTt0PWQuZ2xvYmFsLGQudHlwZT1kLnR5cGUudG9VcHBlckNhc2UoKSxkLmhhc0NvbnRlbnQ9IWJLLnRlc3QoZC50eXBlKSx0JiZmLmFjdGl2ZSsrPT09MCYmZi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtpZighZC5oYXNDb250ZW50KXtkLmRhdGEmJihkLnVybCs9KGJNLnRlc3QoZC51cmwpPyImIjoiPyIpK2QuZGF0YSxkZWxldGUgZC5kYXRhKSxrPWQudXJsO2lmKGQuY2FjaGU9PT0hMSl7dmFyIHg9Zi5ub3coKSx5PWQudXJsLnJlcGxhY2UoYlEsIiQxXz0iK3gpO2QudXJsPXkrKHk9PT1kLnVybD8oYk0udGVzdChkLnVybCk/IiYiOiI/IikrIl89Iit4OiIiKX19KGQuZGF0YSYmZC5oYXNDb250ZW50JiZkLmNvbnRlbnRUeXBlIT09ITF8fGMuY29udGVudFR5cGUpJiZ2LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZC5jb250ZW50VHlwZSksZC5pZk1vZGlmaWVkJiYoaz1rfHxkLnVybCxmLmxhc3RNb2RpZmllZFtrXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsZi5sYXN0TW9kaWZpZWRba10pLGYuZXRhZ1trXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixmLmV0YWdba10pKSx2LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZC5kYXRhVHlwZXNbMF0mJmQuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0/ZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXSsoZC5kYXRhVHlwZXNbMF0hPT0iKiI/IiwgIitiWCsiOyBxPTAuMDEiOiIiKTpkLmFjY2VwdHNbIioiXSk7Zm9yKHUgaW4gZC5oZWFkZXJzKXYuc2V0UmVxdWVzdEhlYWRlcih1LGQuaGVhZGVyc1t1XSk7aWYoZC5iZWZvcmVTZW5kJiYoZC5iZWZvcmVTZW5kLmNhbGwoZSx2LGQpPT09ITF8fHM9PT0yKSl7di5hYm9ydCgpO3JldHVybiExfWZvcih1IGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbdV0oZFt1XSk7cD1iJChiVSxkLGMsdik7aWYoIXApdygtMSwiTm8gVHJhbnNwb3J0Iik7ZWxzZXt2LnJlYWR5U3RhdGU9MSx0JiZnLnRyaWdnZXIoImFqYXhTZW5kIixbdixkXSksZC5hc3luYyYmZC50aW1lb3V0PjAmJihxPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2LmFib3J0KCJ0aW1lb3V0Iil9LGQudGltZW91dCkpO3RyeXtzPTEscC5zZW5kKGwsdyl9Y2F0Y2goeil7aWYoczwyKXcoLTEseik7ZWxzZSB0aHJvdyB6fX1yZXR1cm4gdn0scGFyYW06ZnVuY3Rpb24oYSxjKXt2YXIgZD1bXSxlPWZ1bmN0aW9uKGEsYil7Yj1mLmlzRnVuY3Rpb24oYik/YigpOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2M9PT1iJiYoYz1mLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7aWYoZi5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIWYuaXNQbGFpbk9iamVjdChhKSlmLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IodmFyIGcgaW4gYSljYShnLGFbZ10sYyxlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZShiRCwiKyIpfX0pLGYuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fX0pO3ZhciBjZD1mLm5vdygpLGNlPS8oXD0pXD8oJnwkKXxcP1w/L2k7Zi5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3JldHVybiBmLmV4cGFuZG8rIl8iK2NkKyt9fSksZi5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihiLGMsZCl7dmFyIGU9Yi5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiJiZ0eXBlb2YgYi5kYXRhPT0ic3RyaW5nIjtpZihiLmRhdGFUeXBlc1swXT09PSJqc29ucCJ8fGIuanNvbnAhPT0hMSYmKGNlLnRlc3QoYi51cmwpfHxlJiZjZS50ZXN0KGIuZGF0YSkpKXt2YXIgZyxoPWIuanNvbnBDYWxsYmFjaz1mLmlzRnVuY3Rpb24oYi5qc29ucENhbGxiYWNrKT9iLmpzb25wQ2FsbGJhY2soKTpiLmpzb25wQ2FsbGJhY2ssaT1hW2hdLGo9Yi51cmwsaz1iLmRhdGEsbD0iJDEiK2grIiQyIjtiLmpzb25wIT09ITEmJihqPWoucmVwbGFjZShjZSxsKSxiLnVybD09PWomJihlJiYoaz1rLnJlcGxhY2UoY2UsbCkpLGIuZGF0YT09PWsmJihqKz0oL1w/Ly50ZXN0KGopPyImIjoiPyIpK2IuanNvbnArIj0iK2gpKSksYi51cmw9aixiLmRhdGE9ayxhW2hdPWZ1bmN0aW9uKGEpe2c9W2FdfSxkLmFsd2F5cyhmdW5jdGlvbigpe2FbaF09aSxnJiZmLmlzRnVuY3Rpb24oaSkmJmFbaF0oZ1swXSl9KSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtnfHxmLmVycm9yKGgrIiB3YXMgbm90IGNhbGxlZCIpO3JldHVybiBnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiI7cmV0dXJuInNjcmlwdCJ9fSksZi5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe2YuZ2xvYmFsRXZhbChhKTtyZXR1cm4gYX19fSksZi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2EuY2FjaGU9PT1iJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KSxmLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGQsZT1jLmhlYWR8fGMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8Yy5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZixnKXtkPWMuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksZC5hc3luYz0iYXN5bmMiLGEuc2NyaXB0Q2hhcnNldCYmKGQuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGQuc3JjPWEudXJsLGQub25sb2FkPWQub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7aWYoY3x8IWQucmVhZHlTdGF0ZXx8L2xvYWRlZHxjb21wbGV0ZS8udGVzdChkLnJlYWR5U3RhdGUpKWQub25sb2FkPWQub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsZSYmZC5wYXJlbnROb2RlJiZlLnJlbW92ZUNoaWxkKGQpLGQ9YixjfHxnKDIwMCwic3VjY2VzcyIpfSxlLmluc2VydEJlZm9yZShkLGUuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7ZCYmZC5vbmxvYWQoMCwxKX19fX0pO3ZhciBjZj1hLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gY2gpY2hbYV0oMCwxKX06ITEsY2c9MCxjaDtmLmFqYXhTZXR0aW5ncy54aHI9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmY2koKXx8Y2ooKX06Y2ksZnVuY3Rpb24oYSl7Zi5leHRlbmQoZi5zdXBwb3J0LHthamF4OiEhYSxjb3JzOiEhYSYmIndpdGhDcmVkZW50aWFscyJpbiBhfSl9KGYuYWpheFNldHRpbmdzLnhocigpKSxmLnN1cHBvcnQuYWpheCYmZi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGMpe2lmKCFjLmNyb3NzRG9tYWlufHxmLnN1cHBvcnQuY29ycyl7dmFyIGQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxnKXt2YXIgaD1jLnhocigpLGksajtjLnVzZXJuYW1lP2gub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyxjLnVzZXJuYW1lLGMucGFzc3dvcmQpOmgub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyk7aWYoYy54aHJGaWVsZHMpZm9yKGogaW4gYy54aHJGaWVsZHMpaFtqXT1jLnhockZpZWxkc1tqXTtjLm1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUmJmgub3ZlcnJpZGVNaW1lVHlwZShjLm1pbWVUeXBlKSwhYy5jcm9zc0RvbWFpbiYmIWVbIlgtUmVxdWVzdGVkLVdpdGgiXSYmKGVbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKGogaW4gZSloLnNldFJlcXVlc3RIZWFkZXIoaixlW2pdKX1jYXRjaChrKXt9aC5zZW5kKGMuaGFzQ29udGVudCYmYy5kYXRhfHxudWxsKSxkPWZ1bmN0aW9uKGEsZSl7dmFyIGosayxsLG0sbjt0cnl7aWYoZCYmKGV8fGgucmVhZHlTdGF0ZT09PTQpKXtkPWIsaSYmKGgub25yZWFkeXN0YXRlY2hhbmdlPWYubm9vcCxjZiYmZGVsZXRlIGNoW2ldKTtpZihlKWgucmVhZHlTdGF0ZSE9PTQmJmguYWJvcnQoKTtlbHNle2o9aC5zdGF0dXMsbD1oLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLG09e30sbj1oLnJlc3BvbnNlWE1MLG4mJm4uZG9jdW1lbnRFbGVtZW50JiYobS54bWw9biksbS50ZXh0PWgucmVzcG9uc2VUZXh0O3RyeXtrPWguc3RhdHVzVGV4dH1jYXRjaChvKXtrPSIifSFqJiZjLmlzTG9jYWwmJiFjLmNyb3NzRG9tYWluP2o9bS50ZXh0PzIwMDo0MDQ6aj09PTEyMjMmJihqPTIwNCl9fX1jYXRjaChwKXtlfHxnKC0xLHApfW0mJmcoaixrLG0sbCl9LCFjLmFzeW5jfHxoLnJlYWR5U3RhdGU9PT00P2QoKTooaT0rK2NnLGNmJiYoY2h8fChjaD17fSxmKGEpLnVubG9hZChjZikpLGNoW2ldPWQpLGgub25yZWFkeXN0YXRlY2hhbmdlPWQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQoMCwxKX19fX0pO3ZhciBjaz17fSxjbCxjbSxjbj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sY289L14oWytcLV09KT8oW1xkKy5cLV0rKShbYS16JV0qKSQvaSxjcCxjcT1bWyJoZWlnaHQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLFsid2lkdGgiLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLFsib3BhY2l0eSJdXSxjcjtmLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN1KCJzaG93IiwzKSxhLGIsYyk7Zm9yKHZhciBnPTAsaD10aGlzLmxlbmd0aDtnPGg7ZysrKWQ9dGhpc1tnXSxkLnN0eWxlJiYoZT1kLnN0eWxlLmRpc3BsYXksIWYuX2RhdGEoZCwib2xkZGlzcGxheSIpJiZlPT09Im5vbmUiJiYoZT1kLnN0eWxlLmRpc3BsYXk9IiIpLGU9PT0iIiYmZi5jc3MoZCwiZGlzcGxheSIpPT09Im5vbmUiJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGN2KGQubm9kZU5hbWUpKSk7Zm9yKGc9MDtnPGg7ZysrKXtkPXRoaXNbZ107aWYoZC5zdHlsZSl7ZT1kLnN0eWxlLmRpc3BsYXk7aWYoZT09PSIifHxlPT09Im5vbmUiKWQuc3R5bGUuZGlzcGxheT1mLl9kYXRhKGQsIm9sZGRpc3BsYXkiKXx8IiJ9fXJldHVybiB0aGlzfSxoaWRlOmZ1bmN0aW9uKGEsYixjKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN1KCJoaWRlIiwzKSxhLGIsYyk7dmFyIGQsZSxnPTAsaD10aGlzLmxlbmd0aDtmb3IoO2c8aDtnKyspZD10aGlzW2ddLGQuc3R5bGUmJihlPWYuY3NzKGQsImRpc3BsYXkiKSxlIT09Im5vbmUiJiYhZi5fZGF0YShkLCJvbGRkaXNwbGF5IikmJmYuX2RhdGEoZCwib2xkZGlzcGxheSIsZSkpO2ZvcihnPTA7ZzxoO2crKyl0aGlzW2ddLnN0eWxlJiYodGhpc1tnXS5zdHlsZS5kaXNwbGF5PSJub25lIik7cmV0dXJuIHRoaXN9LF90b2dnbGU6Zi5mbi50b2dnbGUsdG9nZ2xlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10eXBlb2YgYT09ImJvb2xlYW4iO2YuaXNGdW5jdGlvbihhKSYmZi5pc0Z1bmN0aW9uKGIpP3RoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YT09bnVsbHx8ZD90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1kP2E6Zih0aGlzKS5pcygiOmhpZGRlbiIpO2YodGhpcylbYj8ic2hvdyI6ImhpZGUiXSgpfSk6dGhpcy5hbmltYXRlKGN1KCJ0b2dnbGUiLDMpLGEsYixjKTtyZXR1cm4gdGhpc30sZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGcoKXtlLnF1ZXVlPT09ITEmJmYuX21hcmsodGhpcyk7dmFyIGI9Zi5leHRlbmQoe30sZSksYz10aGlzLm5vZGVUeXBlPT09MSxkPWMmJmYodGhpcykuaXMoIjpoaWRkZW4iKSxnLGgsaSxqLGssbCxtLG4sbztiLmFuaW1hdGVkUHJvcGVydGllcz17fTtmb3IoaSBpbiBhKXtnPWYuY2FtZWxDYXNlKGkpLGkhPT1nJiYoYVtnXT1hW2ldLGRlbGV0ZSBhW2ldKSxoPWFbZ10sZi5pc0FycmF5KGgpPyhiLmFuaW1hdGVkUHJvcGVydGllc1tnXT1oWzFdLGg9YVtnXT1oWzBdKTpiLmFuaW1hdGVkUHJvcGVydGllc1tnXT1iLnNwZWNpYWxFYXNpbmcmJmIuc3BlY2lhbEVhc2luZ1tnXXx8Yi5lYXNpbmd8fCJzd2luZyI7aWYoaD09PSJoaWRlIiYmZHx8aD09PSJzaG93IiYmIWQpcmV0dXJuIGIuY29tcGxldGUuY2FsbCh0aGlzKTtjJiYoZz09PSJoZWlnaHQifHxnPT09IndpZHRoIikmJihiLm92ZXJmbG93PVt0aGlzLnN0eWxlLm92ZXJmbG93LHRoaXMuc3R5bGUub3ZlcmZsb3dYLHRoaXMuc3R5bGUub3ZlcmZsb3dZXSxmLmNzcyh0aGlzLCJkaXNwbGF5Iik9PT0iaW5saW5lIiYmZi5jc3ModGhpcywiZmxvYXQiKT09PSJub25lIiYmKCFmLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dHx8Y3YodGhpcy5ub2RlTmFtZSk9PT0iaW5saW5lIj90aGlzLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI6dGhpcy5zdHlsZS56b29tPTEpKX1iLm92ZXJmbG93IT1udWxsJiYodGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIik7Zm9yKGkgaW4gYSlqPW5ldyBmLmZ4KHRoaXMsYixpKSxoPWFbaV0sY24udGVzdChoKT8obz1mLl9kYXRhKHRoaXMsInRvZ2dsZSIraSl8fChoPT09InRvZ2dsZSI/ZD8ic2hvdyI6ImhpZGUiOjApLG8/KGYuX2RhdGEodGhpcywidG9nZ2xlIitpLG89PT0ic2hvdyI/ImhpZGUiOiJzaG93IiksaltvXSgpKTpqW2hdKCkpOihrPWNvLmV4ZWMoaCksbD1qLmN1cigpLGs/KG09cGFyc2VGbG9hdChrWzJdKSxuPWtbM118fChmLmNzc051bWJlcltpXT8iIjoicHgiKSxuIT09InB4IiYmKGYuc3R5bGUodGhpcyxpLChtfHwxKStuKSxsPShtfHwxKS9qLmN1cigpKmwsZi5zdHlsZSh0aGlzLGksbCtuKSksa1sxXSYmKG09KGtbMV09PT0iLT0iPy0xOjEpKm0rbCksai5jdXN0b20obCxtLG4pKTpqLmN1c3RvbShsLGgsIiIpKTtyZXR1cm4hMH12YXIgZT1mLnNwZWVkKGIsYyxkKTtpZihmLmlzRW1wdHlPYmplY3QoYSkpcmV0dXJuIHRoaXMuZWFjaChlLmNvbXBsZXRlLFshMV0pO2E9Zi5leHRlbmQoe30sYSk7cmV0dXJuIGUucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShlLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYyxkKXt0eXBlb2YgYSE9InN0cmluZyImJihkPWMsYz1hLGE9YiksYyYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fCJmeCIsW10pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGEsYixjKXt2YXIgZT1iW2NdO2YucmVtb3ZlRGF0YShhLGMsITApLGUuc3RvcChkKX12YXIgYixjPSExLGU9Zi50aW1lcnMsZz1mLl9kYXRhKHRoaXMpO2R8fGYuX3VubWFyayghMCx0aGlzKTtpZihhPT1udWxsKWZvcihiIGluIGcpZ1tiXSYmZ1tiXS5zdG9wJiZiLmluZGV4T2YoIi5ydW4iKT09PWIubGVuZ3RoLTQmJmgodGhpcyxnLGIpO2Vsc2UgZ1tiPWErIi5ydW4iXSYmZ1tiXS5zdG9wJiZoKHRoaXMsZyxiKTtmb3IoYj1lLmxlbmd0aDtiLS07KWVbYl0uZWxlbT09PXRoaXMmJihhPT1udWxsfHxlW2JdLnF1ZXVlPT09YSkmJihkP2VbYl0oITApOmVbYl0uc2F2ZVN0YXRlKCksYz0hMCxlLnNwbGljZShiLDEpKTsoIWR8fCFjKSYmZi5kZXF1ZXVlKHRoaXMsYSl9KX19KSxmLmVhY2goe3NsaWRlRG93bjpjdSgic2hvdyIsMSksc2xpZGVVcDpjdSgiaGlkZSIsMSksc2xpZGVUb2dnbGU6Y3UoInRvZ2dsZSIsMSksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe2YuZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksZi5leHRlbmQoe3NwZWVkOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiZ0eXBlb2YgYT09Im9iamVjdCI/Zi5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxmLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIWYuaXNGdW5jdGlvbihiKSYmYn07ZC5kdXJhdGlvbj1mLmZ4Lm9mZj8wOnR5cGVvZiBkLmR1cmF0aW9uPT0ibnVtYmVyIj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gZi5meC5zcGVlZHM/Zi5meC5zcGVlZHNbZC5kdXJhdGlvbl06Zi5meC5zcGVlZHMuX2RlZmF1bHQ7aWYoZC5xdWV1ZT09bnVsbHx8ZC5xdWV1ZT09PSEwKWQucXVldWU9ImZ4IjtkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oYSl7Zi5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlP2YuZGVxdWV1ZSh0aGlzLGQucXVldWUpOmEhPT0hMSYmZi5fdW5tYXJrKHRoaXMpfTtyZXR1cm4gZH0sZWFzaW5nOntsaW5lYXI6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGMrZCphfSxzd2luZzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4oLU1hdGguY29zKGEqTWF0aC5QSSkvMisuNSkqZCtjfX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixjKXt0aGlzLm9wdGlvbnM9Yix0aGlzLmVsZW09YSx0aGlzLnByb3A9YyxiLm9yaWc9Yi5vcmlnfHx7fX19KSxmLmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLChmLmZ4LnN0ZXBbdGhpcy5wcm9wXXx8Zi5meC5zdGVwLl9kZWZhdWx0KSh0aGlzKX0sY3VyOmZ1bmN0aW9uKCl7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpcmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO3ZhciBhLGI9Zi5jc3ModGhpcy5lbGVtLHRoaXMucHJvcCk7cmV0dXJuIGlzTmFOKGE9cGFyc2VGbG9hdChiKSk/IWJ8fGI9PT0iYXV0byI/MDpiOmF9LGN1c3RvbTpmdW5jdGlvbihhLGMsZCl7ZnVuY3Rpb24gaChhKXtyZXR1cm4gZS5zdGVwKGEpfXZhciBlPXRoaXMsZz1mLmZ4O3RoaXMuc3RhcnRUaW1lPWNyfHxjcygpLHRoaXMuZW5kPWMsdGhpcy5ub3c9dGhpcy5zdGFydD1hLHRoaXMucG9zPXRoaXMuc3RhdGU9MCx0aGlzLnVuaXQ9ZHx8dGhpcy51bml0fHwoZi5jc3NOdW1iZXJbdGhpcy5wcm9wXT8iIjoicHgiKSxoLnF1ZXVlPXRoaXMub3B0aW9ucy5xdWV1ZSxoLmVsZW09dGhpcy5lbGVtLGguc2F2ZVN0YXRlPWZ1bmN0aW9uKCl7ZS5vcHRpb25zLmhpZGUmJmYuX2RhdGEoZS5lbGVtLCJmeHNob3ciK2UucHJvcCk9PT1iJiZmLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3AsZS5zdGFydCl9LGgoKSYmZi50aW1lcnMucHVzaChoKSYmIWNwJiYoY3A9c2V0SW50ZXJ2YWwoZy50aWNrLGcuaW50ZXJ2YWwpKX0sc2hvdzpmdW5jdGlvbigpe3ZhciBhPWYuX2RhdGEodGhpcy5lbGVtLCJmeHNob3ciK3RoaXMucHJvcCk7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1hfHxmLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5zaG93PSEwLGEhPT1iP3RoaXMuY3VzdG9tKHRoaXMuY3VyKCksYSk6dGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9wPT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpLGYodGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWYuX2RhdGEodGhpcy5lbGVtLCJmeHNob3ciK3RoaXMucHJvcCl8fGYuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCksdGhpcy5vcHRpb25zLmhpZGU9ITAsdGhpcy5jdXN0b20odGhpcy5jdXIoKSwwKX0sc3RlcDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT1jcnx8Y3MoKSxnPSEwLGg9dGhpcy5lbGVtLGk9dGhpcy5vcHRpb25zO2lmKGF8fGU+PWkuZHVyYXRpb24rdGhpcy5zdGFydFRpbWUpe3RoaXMubm93PXRoaXMuZW5kLHRoaXMucG9zPXRoaXMuc3RhdGU9MSx0aGlzLnVwZGF0ZSgpLGkuYW5pbWF0ZWRQcm9wZXJ0aWVzW3RoaXMucHJvcF09ITA7Zm9yKGIgaW4gaS5hbmltYXRlZFByb3BlcnRpZXMpaS5hbmltYXRlZFByb3BlcnRpZXNbYl0hPT0hMCYmKGc9ITEpO2lmKGcpe2kub3ZlcmZsb3chPW51bGwmJiFmLnN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyYmZi5lYWNoKFsiIiwiWCIsIlkiXSxmdW5jdGlvbihhLGIpe2guc3R5bGVbIm92ZXJmbG93IitiXT1pLm92ZXJmbG93W2FdfSksaS5oaWRlJiZmKGgpLmhpZGUoKTtpZihpLmhpZGV8fGkuc2hvdylmb3IoYiBpbiBpLmFuaW1hdGVkUHJvcGVydGllcylmLnN0eWxlKGgsYixpLm9yaWdbYl0pLGYucmVtb3ZlRGF0YShoLCJmeHNob3ciK2IsITApLGYucmVtb3ZlRGF0YShoLCJ0b2dnbGUiK2IsITApO2Q9aS5jb21wbGV0ZSxkJiYoaS5jb21wbGV0ZT0hMSxkLmNhbGwoaCkpfXJldHVybiExfWkuZHVyYXRpb249PUluZmluaXR5P3RoaXMubm93PWU6KGM9ZS10aGlzLnN0YXJ0VGltZSx0aGlzLnN0YXRlPWMvaS5kdXJhdGlvbix0aGlzLnBvcz1mLmVhc2luZ1tpLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdXSh0aGlzLnN0YXRlLGMsMCwxLGkuZHVyYXRpb24pLHRoaXMubm93PXRoaXMuc3RhcnQrKHRoaXMuZW5kLXRoaXMuc3RhcnQpKnRoaXMucG9zKSx0aGlzLnVwZGF0ZSgpO3JldHVybiEwfX0sZi5leHRlbmQoZi5meCx7dGljazpmdW5jdGlvbigpe3ZhciBhLGI9Zi50aW1lcnMsYz0wO2Zvcig7YzxiLmxlbmd0aDtjKyspYT1iW2NdLCFhKCkmJmJbY109PT1hJiZiLnNwbGljZShjLS0sMSk7Yi5sZW5ndGh8fGYuZnguc3RvcCgpfSxpbnRlcnZhbDoxMyxzdG9wOmZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChjcCksY3A9bnVsbH0sc3BlZWRzOntzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHN0ZXA6e29wYWNpdHk6ZnVuY3Rpb24oYSl7Zi5zdHlsZShhLmVsZW0sIm9wYWNpdHkiLGEubm93KX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7YS5lbGVtLnN0eWxlJiZhLmVsZW0uc3R5bGVbYS5wcm9wXSE9bnVsbD9hLmVsZW0uc3R5bGVbYS5wcm9wXT1hLm5vdythLnVuaXQ6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0pLGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmZ4LnN0ZXBbYl09ZnVuY3Rpb24oYSl7Zi5zdHlsZShhLmVsZW0sYixNYXRoLm1heCgwLGEubm93KSthLnVuaXQpfX0pLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gZi5ncmVwKGYudGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofSk7dmFyIGN3PS9edCg/OmFibGV8ZHxoKSQvaSxjeD0vXig/OmJvZHl8aHRtbCkkL2k7ImdldEJvdW5kaW5nQ2xpZW50UmVjdCJpbiBjLmRvY3VtZW50RWxlbWVudD9mLmZuLm9mZnNldD1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdLGM7aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dHJ5e2M9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChkKXt9dmFyIGU9Yi5vd25lckRvY3VtZW50LGc9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoIWN8fCFmLmNvbnRhaW5zKGcsYikpcmV0dXJuIGM/e3RvcDpjLnRvcCxsZWZ0OmMubGVmdH06e3RvcDowLGxlZnQ6MH07dmFyIGg9ZS5ib2R5LGk9Y3koZSksaj1nLmNsaWVudFRvcHx8aC5jbGllbnRUb3B8fDAsaz1nLmNsaWVudExlZnR8fGguY2xpZW50TGVmdHx8MCxsPWkucGFnZVlPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmZy5zY3JvbGxUb3B8fGguc2Nyb2xsVG9wLG09aS5wYWdlWE9mZnNldHx8Zi5zdXBwb3J0LmJveE1vZGVsJiZnLnNjcm9sbExlZnR8fGguc2Nyb2xsTGVmdCxuPWMudG9wK2wtaixvPWMubGVmdCttLWs7cmV0dXJue3RvcDpuLGxlZnQ6b319OmYuZm4ub2Zmc2V0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dmFyIGMsZD1iLm9mZnNldFBhcmVudCxlPWIsZz1iLm93bmVyRG9jdW1lbnQsaD1nLmRvY3VtZW50RWxlbWVudCxpPWcuYm9keSxqPWcuZGVmYXVsdFZpZXcsaz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGw9Yi5vZmZzZXRUb3AsbT1iLm9mZnNldExlZnQ7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmYiE9PWkmJmIhPT1oKXtpZihmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmay5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7Yz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGwtPWIuc2Nyb2xsVG9wLG0tPWIuc2Nyb2xsTGVmdCxiPT09ZCYmKGwrPWIub2Zmc2V0VG9wLG0rPWIub2Zmc2V0TGVmdCxmLnN1cHBvcnQuZG9lc05vdEFkZEJvcmRlciYmKCFmLnN1cHBvcnQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHN8fCFjdy50ZXN0KGIubm9kZU5hbWUpKSYmKGwrPXBhcnNlRmxvYXQoYy5ib3JkZXJUb3BXaWR0aCl8fDAsbSs9cGFyc2VGbG9hdChjLmJvcmRlckxlZnRXaWR0aCl8fDApLGU9ZCxkPWIub2Zmc2V0UGFyZW50KSxmLnN1cHBvcnQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZjLm92ZXJmbG93IT09InZpc2libGUiJiYobCs9cGFyc2VGbG9hdChjLmJvcmRlclRvcFdpZHRoKXx8MCxtKz1wYXJzZUZsb2F0KGMuYm9yZGVyTGVmdFdpZHRoKXx8MCksaz1jfWlmKGsucG9zaXRpb249PT0icmVsYXRpdmUifHxrLnBvc2l0aW9uPT09InN0YXRpYyIpbCs9aS5vZmZzZXRUb3AsbSs9aS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5maXhlZFBvc2l0aW9uJiZrLnBvc2l0aW9uPT09ImZpeGVkIiYmKGwrPU1hdGgubWF4KGguc2Nyb2xsVG9wLGkuc2Nyb2xsVG9wKSxtKz1NYXRoLm1heChoLnNjcm9sbExlZnQsaS5zY3JvbGxMZWZ0KSk7cmV0dXJue3RvcDpsLGxlZnQ6bX19LGYub2Zmc2V0PXtib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGM9YS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKGIrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCk7cmV0dXJue3RvcDpiLGxlZnQ6Y319LHNldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Zi5jc3MoYSwicG9zaXRpb24iKTtkPT09InN0YXRpYyImJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBlPWYoYSksZz1lLm9mZnNldCgpLGg9Zi5jc3MoYSwidG9wIiksaT1mLmNzcyhhLCJsZWZ0Iiksaj0oZD09PSJhYnNvbHV0ZSJ8fGQ9PT0iZml4ZWQiKSYmZi5pbkFycmF5KCJhdXRvIixbaCxpXSk+LTEsaz17fSxsPXt9LG0sbjtqPyhsPWUucG9zaXRpb24oKSxtPWwudG9wLG49bC5sZWZ0KToobT1wYXJzZUZsb2F0KGgpfHwwLG49cGFyc2VGbG9hdChpKXx8MCksZi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGcpKSxiLnRvcCE9bnVsbCYmKGsudG9wPWIudG9wLWcudG9wK20pLGIubGVmdCE9bnVsbCYmKGsubGVmdD1iLmxlZnQtZy5sZWZ0K24pLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGspOmUuY3NzKGspfX0sZi5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuIG51bGw7dmFyIGE9dGhpc1swXSxiPXRoaXMub2Zmc2V0UGFyZW50KCksYz10aGlzLm9mZnNldCgpLGQ9Y3gudGVzdChiWzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTpiLm9mZnNldCgpO2MudG9wLT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjLmxlZnQtPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCxkLnRvcCs9cGFyc2VGbG9hdChmLmNzcyhiWzBdLCJib3JkZXJUb3BXaWR0aCIpKXx8MCxkLmxlZnQrPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyTGVmdFdpZHRoIikpfHwwO3JldHVybnt0b3A6Yy50b3AtZC50b3AsbGVmdDpjLmxlZnQtZC5sZWZ0fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fGMuYm9keTt3aGlsZShhJiYhY3gudGVzdChhLm5vZGVOYW1lKSYmZi5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF9KX19KSxmLmVhY2goWyJMZWZ0IiwiVG9wIl0sZnVuY3Rpb24oYSxjKXt2YXIgZD0ic2Nyb2xsIitjO2YuZm5bZF09ZnVuY3Rpb24oYyl7dmFyIGUsZztpZihjPT09Yil7ZT10aGlzWzBdO2lmKCFlKXJldHVybiBudWxsO2c9Y3koZSk7cmV0dXJuIGc/InBhZ2VYT2Zmc2V0ImluIGc/Z1thPyJwYWdlWU9mZnNldCI6InBhZ2VYT2Zmc2V0Il06Zi5zdXBwb3J0LmJveE1vZGVsJiZnLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8Zy5kb2N1bWVudC5ib2R5W2RdOmVbZF19cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2c9Y3kodGhpcyksZz9nLnNjcm9sbFRvKGE/ZihnKS5zY3JvbGxMZWZ0KCk6YyxhP2M6ZihnKS5zY3JvbGxUb3AoKSk6dGhpc1tkXT1jfSl9fSksZi5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGMpe3ZhciBkPWMudG9Mb3dlckNhc2UoKTtmLmZuWyJpbm5lciIrY109ZnVuY3Rpb24oKXt2YXIgYT10aGlzWzBdO3JldHVybiBhP2Euc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhhLGQsInBhZGRpbmciKSk6dGhpc1tkXSgpOm51bGx9LGYuZm5bIm91dGVyIitjXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO3JldHVybiBiP2Iuc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhiLGQsYT8ibWFyZ2luIjoiYm9yZGVyIikpOnRoaXNbZF0oKTpudWxsfSxmLmZuW2RdPWZ1bmN0aW9uKGEpe3ZhciBlPXRoaXNbMF07aWYoIWUpcmV0dXJuIGE9PW51bGw/bnVsbDp0aGlzO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Y1tkXShhLmNhbGwodGhpcyxiLGNbZF0oKSkpfSk7aWYoZi5pc1dpbmRvdyhlKSl7dmFyIGc9ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10saD1lLmRvY3VtZW50LmJvZHk7cmV0dXJuIGUuZG9jdW1lbnQuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0IiYmZ3x8aCYmaFsiY2xpZW50IitjXXx8Z31pZihlLm5vZGVUeXBlPT09OSlyZXR1cm4gTWF0aC5tYXgoZS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10sZS5ib2R5WyJzY3JvbGwiK2NdLGUuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2NdLGUuYm9keVsib2Zmc2V0IitjXSxlLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IitjXSk7aWYoYT09PWIpe3ZhciBpPWYuY3NzKGUsZCksaj1wYXJzZUZsb2F0KGkpO3JldHVybiBmLmlzTnVtZXJpYyhqKT9qOml9cmV0dXJuIHRoaXMuY3NzKGQsdHlwZW9mIGE9PSJzdHJpbmciP2E6YSsicHgiKX19KSxhLmpRdWVyeT1hLiQ9Zix0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeSYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KX0pKHdpbmRvdyk7"></script>
	<script id="script_tl_jquery_story-embed_js" url="data:text/plain;base64,LyohCglTdG9yeUpTCglEZXNpZ25lZCBhbmQgYnVpbHQgYnkgWmFjaCBXaXNlIGF0IFbDqXJpdMOpQ28KCglUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljCglMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCglmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLgoqLy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBCZWdpbiBMYXp5TG9hZC5qcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovLypqc2xpbnQgYnJvd3NlcjogdHJ1ZSwgZXFlcWVxOiB0cnVlLCBiaXR3aXNlOiB0cnVlLCBuZXdjYXA6IHRydWUsIGltbWVkOiB0cnVlLCByZWdleHA6IGZhbHNlICovLyoKTGF6eUxvYWQgbWFrZXMgaXQgZWFzeSBhbmQgcGFpbmxlc3MgdG8gbGF6aWx5IGxvYWQgb25lIG9yIG1vcmUgZXh0ZXJuYWwKSmF2YVNjcmlwdCBvciBDU1MgZmlsZXMgb24gZGVtYW5kIGVpdGhlciBkdXJpbmcgb3IgYWZ0ZXIgdGhlIHJlbmRlcmluZyBvZiBhIHdlYgpwYWdlLgoKU3VwcG9ydGVkIGJyb3dzZXJzIGluY2x1ZGUgRmlyZWZveCAyKywgSUU2KywgU2FmYXJpIDMrIChpbmNsdWRpbmcgTW9iaWxlClNhZmFyaSksIEdvb2dsZSBDaHJvbWUsIGFuZCBPcGVyYSA5Ky4gT3RoZXIgYnJvd3NlcnMgbWF5IG9yIG1heSBub3Qgd29yayBhbmQKYXJlIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZC4KClZpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS9yZ3JvdmUvbGF6eWxvYWQvIGZvciBtb3JlIGluZm8uCgpDb3B5cmlnaHQgKGMpIDIwMTEgUnlhbiBHcm92ZSA8cnlhbkB3b25rby5jb20+CkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICdTb2Z0d2FyZScpLCB0byBkZWFsIGluCnRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLApzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCkNPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgpJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgpDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKQG1vZHVsZSBsYXp5bG9hZApAY2xhc3MgTGF6eUxvYWQKQHN0YXRpYwpAdmVyc2lvbiAyLjAuMyAoZ2l0KQoqL2Z1bmN0aW9uIGdldEVtYmVkU2NyaXB0UGF0aChlKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iiksbj0iIixyPSIiO2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXRbaV0uc3JjLm1hdGNoKGUpJiYobj10W2ldLnNyYyk7biE9IiImJihyPSIvIik7cmV0dXJuIG4uc3BsaXQoIj8iKVswXS5zcGxpdCgiLyIpLnNsaWNlKDAsLTEpLmpvaW4oIi8iKStyfWZ1bmN0aW9uIGNyZWF0ZVN0b3J5SlMoZSx0KXtmdW5jdGlvbiBnKCl7TG9hZExpYi5qcyhoLmpzLHkpfWZ1bmN0aW9uIHkoKXtsLmpzPSEwO2gubGFuZyE9ImVuIj9MYXp5TG9hZC5qcyhjLmxvY2FsZSxiKTpsLmxhbmd1YWdlPSEwO3goKX1mdW5jdGlvbiBiKCl7bC5sYW5ndWFnZT0hMDt4KCl9ZnVuY3Rpb24gdygpe2wuY3NzPSEwO3goKX1mdW5jdGlvbiBFKCl7bC5mb250LmNzcz0hMDt4KCl9ZnVuY3Rpb24gUygpe2wuZm9udC5qcz0hMDt4KCl9ZnVuY3Rpb24geCgpe2lmKGwuY2hlY2tzPjQwKXJldHVybjtsLmNoZWNrcysrO2lmKGwuanMmJmwuY3NzJiZsLmZvbnQuY3NzJiZsLmZvbnQuanMmJmwubGFuZ3VhZ2Upe2lmKCFsLmZpbmlzaGVkKXtsLmZpbmlzaGVkPSEwO04oKX19ZWxzZSBsLnRpbWVvdXQ9c2V0VGltZW91dCgib25sb2FkZWRfY2hlY2tfYWdhaW4oKTsiLDI1MCl9ZnVuY3Rpb24gVCgpe3ZhciBlPSJzdG9yeWpzLWVtYmVkIjtyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guZW1iZWRfaWQhPSIiP2k9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaC5lbWJlZF9pZCk6aT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGltZWxpbmUtZW1iZWQiKTtpLmFwcGVuZENoaWxkKHIpO3Iuc2V0QXR0cmlidXRlKCJpZCIsaC5pZCk7aWYoaC53aWR0aC50b1N0cmluZygpLm1hdGNoKCIlIikpaS5zdHlsZS53aWR0aD1oLndpZHRoLnNwbGl0KCIlIilbMF0rIiUiO2Vsc2V7aC53aWR0aD1oLndpZHRoLTI7aS5zdHlsZS53aWR0aD1oLndpZHRoKyJweCJ9aWYoaC5oZWlnaHQudG9TdHJpbmcoKS5tYXRjaCgiJSIpKXtpLnN0eWxlLmhlaWdodD1oLmhlaWdodDtlKz0iIGZ1bGwtZW1iZWQiO2kuc3R5bGUuaGVpZ2h0PWguaGVpZ2h0LnNwbGl0KCIlIilbMF0rIiUifWVsc2V7ZSs9IiBzaXplZC1lbWJlZCI7aC5oZWlnaHQ9aC5oZWlnaHQtMTY7aS5zdHlsZS5oZWlnaHQ9aC5oZWlnaHQrInB4In1pLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGUpO2kuc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLGUpO3Iuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIn1mdW5jdGlvbiBOKCl7Vk1NLmRlYnVnPWguZGVidWc7bj1uZXcgVk1NLlRpbWVsaW5lKGguaWQpO24uaW5pdChoKTtvJiZWTU0uYmluZEV2ZW50KGdsb2JhbCxvbkhlYWRsaW5lLCJIRUFETElORSIpfXZhciBuLHIsaSxzLG89ITEsdT0iMi4xNyIsYT0iMS43LjEiLGY9IiIsbD17dGltZW91dDoiIixjaGVja3M6MCxmaW5pc2hlZDohMSxqczohMSxjc3M6ITEsanF1ZXJ5OiExLGhhc19qcXVlcnk6ITEsbGFuZ3VhZ2U6ITEsZm9udDp7Y3NzOiExLGpzOiExfX0sYz17YmFzZTplbWJlZF9wYXRoLGNzczplbWJlZF9wYXRoKyJjc3MvIixqczplbWJlZF9wYXRoKyJqcy8iLGxvY2FsZTplbWJlZF9wYXRoKyJqcy9sb2NhbGUvIixqcXVlcnk6Imh0dHA6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS43LjIvanF1ZXJ5Lm1pbi5qcyIsZm9udDp7Z29vZ2xlOiExLGNzczplbWJlZF9wYXRoKyJjc3MvdGhlbWVzL2ZvbnQvIixqczoiaHR0cDovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL3dlYmZvbnQvMS93ZWJmb250LmpzIn19LGg9e3ZlcnNpb246dSxkZWJ1ZzohMSx0eXBlOiJ0aW1lbGluZSIsaWQ6InN0b3J5anMiLGVtYmVkX2lkOiJ0aW1lbGluZS1lbWJlZCIsZW1iZWQ6ITAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsc291cmNlOiJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldC9wdWI/a2V5PTBBZ2xfRHY2aUViRGFkRll6UmpKUFVHa3RZME5rV1hGVVdrVklaRE5HUkhjJm91dHB1dD1odG1sIixsYW5nOiJlbiIsZm9udDoiZGVmYXVsdCIsY3NzOmMuY3NzKyJ0aW1lbGluZS5jc3M/Iit1LGpzOmMuanMrInRpbWVsaW5lLW1pbi5qcz8iK3UsYXBpX2tleXM6e2dvb2dsZToiIixmbGlja3I6IiIsdHdpdHRlcjoiIn0sZ21hcF9rZXk6IiJ9LHA9W3tuYW1lOiJNZXJyaXdlYXRoZXItTmV3c0N5Y2xlIixnb29nbGU6WyJOZXdzK0N5Y2xlOjQwMCw3MDA6bGF0aW4iLCJNZXJyaXdlYXRoZXI6NDAwLDcwMCw5MDA6bGF0aW4iXX0se25hbWU6Ik5ld3NDeWNsZS1NZXJyaXdlYXRoZXIiLGdvb2dsZTpbIk5ld3MrQ3ljbGU6NDAwLDcwMDpsYXRpbiIsIk1lcnJpd2VhdGhlcjozMDAsNDAwLDcwMDpsYXRpbiJdfSx7bmFtZToiUG9pcmV0T25lLU1vbGVuZ28iLGdvb2dsZTpbIlBvaXJldCtPbmU6OmxhdGluIiwiTW9sZW5nbzo6bGF0aW4iXX0se25hbWU6IkFydm8tUFRTYW5zIixnb29nbGU6WyJBcnZvOjQwMCw3MDAsNDAwaXRhbGljOmxhdGluIiwiUFQrU2Fuczo0MDAsNzAwLDQwMGl0YWxpYzpsYXRpbiJdfSx7bmFtZToiUFRTZXJpZi1QVFNhbnMiLGdvb2dsZTpbIlBUK1NhbnM6NDAwLDcwMCw0MDBpdGFsaWM6bGF0aW4iLCJQVCtTZXJpZjo0MDAsNzAwLDQwMGl0YWxpYzpsYXRpbiJdfSx7bmFtZToiUFQiLGdvb2dsZTpbIlBUK1NhbnMrTmFycm93OjQwMCw3MDA6bGF0aW4iLCJQVCtTYW5zOjQwMCw3MDAsNDAwaXRhbGljOmxhdGluIiwiUFQrU2VyaWY6NDAwLDcwMCw0MDBpdGFsaWM6bGF0aW4iXX0se25hbWU6IkRyb2lkU2VyaWYtRHJvaWRTYW5zIixnb29nbGU6WyJEcm9pZCtTYW5zOjQwMCw3MDA6bGF0aW4iLCJEcm9pZCtTZXJpZjo0MDAsNzAwLDQwMGl0YWxpYzpsYXRpbiJdfSx7bmFtZToiTGVrdG9uLU1vbGVuZ28iLGdvb2dsZTpbIkxla3Rvbjo0MDAsNzAwLDQwMGl0YWxpYzpsYXRpbiIsIk1vbGVuZ286OmxhdGluIl19LHtuYW1lOiJOaXhpZU9uZS1MZWRnZXIiLGdvb2dsZTpbIk5peGllK09uZTo6bGF0aW4iLCJMZWRnZXI6OmxhdGluIl19LHtuYW1lOiJBYnJpbEZhdGZhY2UtQXZlcmFnZSIsZ29vZ2xlOlsiQXZlcmFnZTo6bGF0aW4iLCJBYnJpbCtGYXRmYWNlOjpsYXRpbiJdfSx7bmFtZToiUGxheWZhaXJEaXNwbGF5LU11bGkiLGdvb2dsZTpbIlBsYXlmYWlyK0Rpc3BsYXk6NDAwLDQwMGl0YWxpYzpsYXRpbiIsIk11bGk6MzAwLDQwMCwzMDBpdGFsaWMsNDAwaXRhbGljOmxhdGluIl19LHtuYW1lOiJSYW5jaG8tR3VkZWEiLGdvb2dsZTpbIlJhbmNobzo6bGF0aW4iLCJHdWRlYTo0MDAsNzAwLDQwMGl0YWxpYzpsYXRpbiJdfSx7bmFtZToiQmV2YW4tUG90YW5vU2FucyIsZ29vZ2xlOlsiQmV2YW46OmxhdGluIiwiUG9udGFubytTYW5zOjpsYXRpbiJdfSx7bmFtZToiQnJlZVNlcmlmLU9wZW5TYW5zIixnb29nbGU6WyJCcmVlK1NlcmlmOjpsYXRpbiIsIk9wZW4rU2FuczozMDBpdGFsaWMsNDAwaXRhbGljLDYwMGl0YWxpYyw3MDBpdGFsaWMsODAwaXRhbGljLDQwMCwzMDAsNjAwLDcwMCw4MDA6bGF0aW4iXX0se25hbWU6IlNhbnNpdGFPbmUtS2FtZXJvbiIsZ29vZ2xlOlsiU2Fuc2l0YStPbmU6OmxhdGluIiwiS2FtZXJvbjo0MDAsNzAwOmxhdGluIl19LHtuYW1lOiJMb3JhLUlzdG9rIixnb29nbGU6WyJMb3JhOjQwMCw3MDAsNDAwaXRhbGljLDcwMGl0YWxpYzpsYXRpbiIsIklzdG9rK1dlYjo0MDAsNzAwLDQwMGl0YWxpYyw3MDBpdGFsaWM6bGF0aW4iXX0se25hbWU6IlBhY2lmaWNvLUFyaW1vIixnb29nbGU6WyJQYWNpZmljbzo6bGF0aW4iLCJBcmltbzo0MDAsNzAwLDQwMGl0YWxpYyw3MDBpdGFsaWM6bGF0aW4iXX1dO2lmKHR5cGVvZiBlPT0ib2JqZWN0Iilmb3IocyBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHMpJiYoaFtzXT1lW3NdKTt0eXBlb2YgdCE9InVuZGVmaW5lZCImJihoLnNvdXJjZT10KTtpZih0eXBlb2YgdXJsX2NvbmZpZz09Im9iamVjdCIpe289ITA7aC5zb3VyY2UubWF0Y2goImRvY3MuZ29vZ2xlLmNvbSIpfHxoLnNvdXJjZS5tYXRjaCgianNvbiIpfHxoLnNvdXJjZS5tYXRjaCgic3RvcmlmeSIpfHwoaC5zb3VyY2U9Imh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0L3B1Yj9rZXk9IitoLnNvdXJjZSsiJm91dHB1dD1odG1sIil9aWYoaC5qcy5tYXRjaCgibG9jYWxlIikpe2gubGFuZz1oLmpzLnNwbGl0KCJsb2NhbGUvIilbMV0ucmVwbGFjZSgiLmpzIiwiIik7aC5qcz1jLmpzKyJ0aW1lbGluZS1taW4uanM/Iit1fWlmKCFoLmpzLm1hdGNoKCIvIikpe2guY3NzPWMuY3NzK2gudHlwZSsiLmNzcz8iK3U7aC5qcz1jLmpzK2gudHlwZSsiLW1pbi5qcz8iK3U7aC5pZD0ic3Rvcnlqcy0iK2gudHlwZX1oLmxhbmcubWF0Y2goIi8iKT9jLmxvY2FsZT1oLmxhbmc6Yy5sb2NhbGU9Yy5sb2NhbGUraC5sYW5nKyIuanM/Iit1O1QoKTtMb2FkTGliLmNzcyhoLmNzcyx3KTtpZihoLmZvbnQ9PSJkZWZhdWx0Iil7bC5mb250LmpzPSEwO2wuZm9udC5jc3M9ITB9ZWxzZXt2YXIgZDtpZihoLmZvbnQubWF0Y2goIi8iKSl7ZD1oLmZvbnQuc3BsaXQoIi5jc3MiKVswXS5zcGxpdCgiLyIpO2MuZm9udC5uYW1lPWRbZC5sZW5ndGgtMV07Yy5mb250LmNzcz1oLmZvbnR9ZWxzZXtjLmZvbnQubmFtZT1oLmZvbnQ7Yy5mb250LmNzcz1jLmZvbnQuY3NzK2guZm9udCsiLmNzcz8iK3V9TG9hZExpYi5jc3MoYy5mb250LmNzcyxFKTtmb3IodmFyIHY9MDt2PHAubGVuZ3RoO3YrKylpZihjLmZvbnQubmFtZT09cFt2XS5uYW1lKXtjLmZvbnQuZ29vZ2xlPSEwO1dlYkZvbnRDb25maWc9e2dvb2dsZTp7ZmFtaWxpZXM6cFt2XS5nb29nbGV9fX1jLmZvbnQuZ29vZ2xlP0xvYWRMaWIuanMoYy5mb250LmpzLFMpOmwuZm9udC5qcz0hMH10cnl7bC5oYXNfanF1ZXJ5PWpRdWVyeTtsLmhhc19qcXVlcnk9ITA7aWYobC5oYXNfanF1ZXJ5KXt2YXIgZj1wYXJzZUZsb2F0KGpRdWVyeS5mbi5qcXVlcnkpO2Y8cGFyc2VGbG9hdChhKT9sLmpxdWVyeT0hMTpsLmpxdWVyeT0hMH19Y2F0Y2gobSl7bC5qcXVlcnk9ITF9bC5qcXVlcnk/ZygpOkxvYWRMaWIuanMoYy5qcXVlcnksZyk7dGhpcy5vbmxvYWRlZF9jaGVja19hZ2Fpbj1mdW5jdGlvbigpe3goKX19TGF6eUxvYWQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdSh0LG4pe3ZhciByPWUuY3JlYXRlRWxlbWVudCh0KSxpO2ZvcihpIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShpKSYmci5zZXRBdHRyaWJ1dGUoaSxuW2ldKTtyZXR1cm4gcn1mdW5jdGlvbiBhKGUpe3ZhciB0PXJbZV0sbixvO2lmKHQpe249dC5jYWxsYmFjaztvPXQudXJscztvLnNoaWZ0KCk7aT0wO2lmKCFvLmxlbmd0aCl7biYmbi5jYWxsKHQuY29udGV4dCx0Lm9iaik7cltlXT1udWxsO3NbZV0ubGVuZ3RoJiZsKGUpfX19ZnVuY3Rpb24gZigpe3ZhciBuPW5hdmlnYXRvci51c2VyQWdlbnQ7dD17YXN5bmM6ZS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKS5hc3luYz09PSEwfTsodC53ZWJraXQ9L0FwcGxlV2ViS2l0XC8vLnRlc3QobikpfHwodC5pZT0vTVNJRS8udGVzdChuKSl8fCh0Lm9wZXJhPS9PcGVyYS8udGVzdChuKSl8fCh0LmdlY2tvPS9HZWNrb1wvLy50ZXN0KG4pKXx8KHQudW5rbm93bj0hMCl9ZnVuY3Rpb24gbChpLG8sbCxwLGQpe3ZhciB2PWZ1bmN0aW9uKCl7YShpKX0sbT1pPT09ImNzcyIsZz1bXSx5LGIsdyxFLFMseDt0fHxmKCk7aWYobyl7bz10eXBlb2Ygbz09InN0cmluZyI/W29dOm8uY29uY2F0KCk7aWYobXx8dC5hc3luY3x8dC5nZWNrb3x8dC5vcGVyYSlzW2ldLnB1c2goe3VybHM6byxjYWxsYmFjazpsLG9iajpwLGNvbnRleHQ6ZH0pO2Vsc2UgZm9yKHk9MCxiPW8ubGVuZ3RoO3k8YjsrK3kpc1tpXS5wdXNoKHt1cmxzOltvW3ldXSxjYWxsYmFjazp5PT09Yi0xP2w6bnVsbCxvYmo6cCxjb250ZXh0OmR9KX1pZihyW2ldfHwhKEU9cltpXT1zW2ldLnNoaWZ0KCkpKXJldHVybjtufHwobj1lLmhlYWR8fGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSk7Uz1FLnVybHM7Zm9yKHk9MCxiPVMubGVuZ3RoO3k8YjsrK3kpe3g9U1t5XTtpZihtKXc9dC5nZWNrbz91KCJzdHlsZSIpOnUoImxpbmsiLHtocmVmOngscmVsOiJzdHlsZXNoZWV0In0pO2Vsc2V7dz11KCJzY3JpcHQiLHtzcmM6eH0pO3cuYXN5bmM9ITF9dy5jbGFzc05hbWU9Imxhenlsb2FkIjt3LnNldEF0dHJpYnV0ZSgiY2hhcnNldCIsInV0Zi04Iik7aWYodC5pZSYmIW0pdy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZigvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KHcucmVhZHlTdGF0ZSkpe3cub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7digpfX07ZWxzZSBpZihtJiYodC5nZWNrb3x8dC53ZWJraXQpKWlmKHQud2Via2l0KXtFLnVybHNbeV09dy5ocmVmO2goKX1lbHNle3cuaW5uZXJIVE1MPSdAaW1wb3J0ICInK3grJyI7JztjKHcpfWVsc2Ugdy5vbmxvYWQ9dy5vbmVycm9yPXY7Zy5wdXNoKHcpfWZvcih5PTAsYj1nLmxlbmd0aDt5PGI7Kyt5KW4uYXBwZW5kQ2hpbGQoZ1t5XSl9ZnVuY3Rpb24gYyhlKXt2YXIgdDt0cnl7dD0hIWUuc2hlZXQuY3NzUnVsZXN9Y2F0Y2gobil7aSs9MTtpPDIwMD9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyhlKX0sNTApOnQmJmEoImNzcyIpO3JldHVybn1hKCJjc3MiKX1mdW5jdGlvbiBoKCl7dmFyIGU9ci5jc3MsdDtpZihlKXt0PW8ubGVuZ3RoO3doaWxlKC0tdD49MClpZihvW3RdLmhyZWY9PT1lLnVybHNbMF0pe2EoImNzcyIpO2JyZWFrfWkrPTE7ZSYmKGk8MjAwP3NldFRpbWVvdXQoaCw1MCk6YSgiY3NzIikpfX12YXIgdCxuLHI9e30saT0wLHM9e2NzczpbXSxqczpbXX0sbz1lLnN0eWxlU2hlZXRzO3JldHVybntjc3M6ZnVuY3Rpb24oZSx0LG4scil7bCgiY3NzIixlLHQsbixyKX0sanM6ZnVuY3Rpb24oZSx0LG4scil7bCgianMiLGUsdCxuLHIpfX19KHRoaXMuZG9jdW1lbnQpO0xvYWRMaWI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihlKXt2YXIgbj0wLHI9ITE7Zm9yKG49MDtuPHQubGVuZ3RoO24rKyl0W25dPT1lJiYocj0hMCk7aWYocilyZXR1cm4hMDt0LnB1c2goZSk7cmV0dXJuITF9dmFyIHQ9W107cmV0dXJue2NzczpmdW5jdGlvbihlLHQscixpKXtuKGUpfHxMYXp5TG9hZC5jc3MoZSx0LHIsaSl9LGpzOmZ1bmN0aW9uKGUsdCxyLGkpe24oZSl8fExhenlMb2FkLmpzKGUsdCxyLGkpfX19KHRoaXMuZG9jdW1lbnQpO3ZhciBXZWJGb250Q29uZmlnO2lmKHR5cGVvZiBlbWJlZF9wYXRoPT0idW5kZWZpbmVkInx8dHlwZW9mIGVtYmVkX3BhdGg9PSJ1bmRlZmluZWQiKXZhciBlbWJlZF9wYXRoPWdldEVtYmVkU2NyaXB0UGF0aCgic3Rvcnlqcy1lbWJlZC5qcyIpLnNwbGl0KCJqcy8iKVswXTsoZnVuY3Rpb24oKXt0eXBlb2YgdXJsX2NvbmZpZz09Im9iamVjdCI/Y3JlYXRlU3RvcnlKUyh1cmxfY29uZmlnKTp0eXBlb2YgdGltZWxpbmVfY29uZmlnPT0ib2JqZWN0Ij9jcmVhdGVTdG9yeUpTKHRpbWVsaW5lX2NvbmZpZyk6dHlwZW9mIHN0b3J5anNfY29uZmlnPT0ib2JqZWN0Ij9jcmVhdGVTdG9yeUpTKHN0b3J5anNfY29uZmlnKTp0eXBlb2YgY29uZmlnPT0ib2JqZWN0IiYmY3JlYXRlU3RvcnlKUyhjb25maWcpfSkoKTs= "></script>
	-->
	<script id="script_div_views"  type="text/javascript">
		function div_tl() {alert( "div_tl" ); return;}
		function div_tlz() {alert( "div_tlz" ); return;}
		function div_zm() {alert( "div_zm" ); return;}
		function div_pn() {alert( "div_pn" ); return;}
		function div_sl() {alert( "div_sl" ); return;}
		function div_av() {alert( "div_av" ); return;}
		</script>





	<script id="script_div_tl_main"  type="text/javascript">

				tl_j=0;
//				ko_num=3;
				ko_num=0;

//				alert( "bugs_603 view="+ko_view+" ko_code="+ko_code+" ko_fmt="+ko_fmt+" ko_num="+ko_num+" ko_file="+ko_file );
//				alert( "bugs_560 tl_source="+tl_source+" ko_code="+ko_code+" ko_fmt="+ko_fmt+" ko_num="+ko_num+" ko_file="+ko_file );
//				alert( "bugs_605 tl_source="+tl_source );

			var tl_source;
			$(document).ready(function() {
				if( url.search.match( 'tlid' )) {
					var tlid=url.search.replace('?tlid=','' );	
					tl_source = tlid;
//					alert( "BUGS_561 tlid=" + tlid );
					alert( "BUGS_562 document_ready tl_source=" + tl_source );
					}
				else {
//					alert( "bugs_581_ready tl_source="+tl_source );
					var tl_source="/tl/tl.json";
					var tl_source="/tl/json/tl_jtf32.json";
					var tl_source="/tl.json";
//					alert( "bugs_570_ready tl_source="+tl_source );
//					var tl_source="/tl.php";
// bugs					var tl_source="/tl/tl_test9.json";
// bugs					var tl_source="/tl/tl_jtfdc.json";
//					var tl_source="/tl/tl_jtfdc_kids.json";
//					var tl_source="/tl/tl_jtfdc_stalkarounds.json";
//					var tl_source="/tl/tl_jtfinc_neighbors.json";
//					var tl_source='tl_test9.json';
//					var tl_source=tl_files[tl_f];
//					var tl_source=tl_data[tl_num];
//					var tl_source='/tl/json/tl.json';
//					alert( "bugs_580 tl_source="+tl_source );
					}

				createStoryJS({
					type:		'timeline',
					width:		'1400',
					height:		'800',
					source:		tl_source,
					embed_id:	'my-timeline',
					debug:		true
				});
			});
			</script>


	<script id="script_startup">
		function startup() {
//			alert( "BUGS_101 startup()" );
//			document.getElementById("div_av").style.display = 'inline';
//			document.getElementById("div_yt").style.display = 'inline';
//			document.getElementById("div_tl").style.display = 'inline';
//			document.getElementById("div_zm").style.display = 'inline';
//			document.getElementById("div_pn").style.display = 'inline';
//			document.getElementById("canvas_pn").style.display = 'inline';

//			document.getElementById("div_av").style.display = 'none';
//			document.getElementById("div_yt").style.display = 'none';
//			document.getElementById("my-timeline").style.display = 'none';
//			document.getElementById("div_tl").style.display = 'none';
//			document.getElementById("div_zm").style.display = 'none';
//			document.getElementById("div_pn").style.display = 'none';
//			document.getElementById("canvas_pn").style.display = 'none';
//			alert( "BUGS_102 startup()" );
			}
		</script>

	<script id="script_hide">
		function script_hide(element) {
//			alert( "BUGS_711 script_hide element="+element );
			if( document.getElementById(element).style.display == 'none' ) {
				document.getElementById(element).style.display = 'inline';
				}
			else {
				document.getElementById(element).style.display = 'none';
				}	
//			alert( "BUGS_712 script_hide element="+element );
			}
		function script_show(element) {
//			alert( "BUGS_721 script_hide element="+element );
			if( document.getElementById(element).style.display == 'inline' ) {
				document.getElementById(element).style.display = 'none';
				}
			else {
				document.getElementById(element).style.display = 'inline';
				}
//			alert( "BUGS_722 script_hide element="+element );
			}
		</script>


	<script id="script_youtube_player_api">
// Load the IFrame Player API code asynchronously.
// Replace the 'ytplayer' element with an <iframe> and
// YouTube player after the API code downloads.
//		var player_api = "if (!window['YT']) {var YT = {loading: 0,loaded: 0};}if (!window['YTConfig']) {var YTConfig = {'host': 'http://www.youtube.com'};}if (!YT.loading) {YT.loading = 1;(function(){var l = [];YT.ready = function(f) {if (YT.loaded) {f();} else {l.push(f);}};window.onYTReady = function() {YT.loaded = 1;for (var i = 0; i < l.length; i++) {try {l[i]();} catch (e) {}}};YT.setConfig = function(c) {for (var k in c) {if (c.hasOwnProperty(k)) {YTConfig[k] = c[k];}}};var a = document.createElement('script');a.type = 'text/javascript';a.id = 'www-widgetapi-script';a.src = 'https://s.ytimg.com/yts/jsbin/www-widgetapi-vflWjyjuR/www-widgetapi.js';a.async = true;var c = document.currentScript;if (c) {var n = c.nonce || c.getAttribute('nonce');if (n) {a.setAttribute('nonce', n);}}var b = document.getElementsByTagName('script')[0];b.parentNode.insertBefore(a, b);})();}";
		var tag = document.createElement('script');
//		tag.src = "https://www.youtube.com/player_api";
		tag.src = "if (!window['YT']) {var YT = {loading: 0,loaded: 0};}if (!window['YTConfig']) {var YTConfig = {'host': 'http://www.youtube.com'};}if (!YT.loading) {YT.loading = 1;(function(){var l = [];YT.ready = function(f) {if (YT.loaded) {f();} else {l.push(f);}};window.onYTReady = function() {YT.loaded = 1;for (var i = 0; i < l.length; i++) {try {l[i]();} catch (e) {}}};YT.setConfig = function(c) {for (var k in c) {if (c.hasOwnProperty(k)) {YTConfig[k] = c[k];}}};var a = document.createElement('script');a.type = 'text/javascript';a.id = 'www-widgetapi-script';a.src = 'https://s.ytimg.com/yts/jsbin/www-widgetapi-vflWjyjuR/www-widgetapi.js';a.async = true;var c = document.currentScript;if (c) {var n = c.nonce || c.getAttribute('nonce');if (n) {a.setAttribute('nonce', n);}}var b = document.getElementsByTagName('script')[0];b.parentNode.insertBefore(a, b);})();}";
		var firstScriptTag = document.getElementsByTagName('script')[0];
		firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
		var player;
		function onYouTubePlayerAPIReady() {
			player = new YT.Player('ytplayer', {
				height: '480',
				width: '853',
				videoId: 'JW5meKfy3fY',
				playerVars: {
					'autoplay': 1,
					'showinfo': 0,
					'controls': 0
					}
				});
			}
		</script>
	</head>
<!--
ffmpeg -i "test.mp4" -c:v libx264 -crf 51 -c:a aac -strict -2 "test_51.mp4"
ffmpeg -i example.mov -vf scale=320:180 -c:v libx264 -preset fast -c:a aac output.mp4 -hide_banner
	-->
<!-- <body onload="init_pano('canvas');  kogrids();"> -->


<body onload="startup(); init_pano('canvas');return false">
	<h1>index_vu.html preview 20200210_1200</h1>
	<a href=/index_vu.html class="popover" target=_blank>
<!--		<img src=/imgs/gif/view/giphy_view30.gif border=0> -->
		<img src=/imgs/gif/view/giphy_view19.gif border=0> 
		<span><img src=/imgs/gif/view/giphy_view22.gif border=0> <span>
		</a>
	<hr color=red><hr color=white><hr color=blue><hr color=black>
	<br><br><br><br><br><br><br><br>
	<div id="div_kogrids_w"></div>
	<div id="div_tl_head"></div>
	<div id="div_av_head"></div>
	<div id="div_fb_head"></div>
	<div id="div_us_head"></div>
	<div id="div_zm_head"></div>

	<br><br><br><br><br><br><br><br>
	<br><br><br><br><br><br><br><br>
	<br><br><br><br><br><br><br><br>
	<hr color=red><hr color=white><hr color=blue><hr color=black>
	<br><br><br><br><br><br><br><br>

	<div id="div_fb_slots"></div>

	<br><br><br><br><br><br><br><br>
	<br><br><br><br><br><br><br><br>
	<br><br><br><br><br><br><br><br>
	<br><br><br><br><br><br><br><br>
	<br><br><br><br><br><br><br><br>
	<br><br><br><br><br><br><br><br>
	<hr color=red><hr color=white><hr color=blue><hr color=black>
	<br><br><br><br><br><br><br><br>

<br><br><br><br>
<hr color=white>
	<button type="button" onclick="script_hide('div_av');return false">hide_av</button>
	<button type="button" onclick="script_hide('div_tl');return false">hide_tl</button>
	<button type="button" onclick="script_hide('div_zm');return false">hide_zm</button>
	<button type="button" onclick="script_hide('canvas_pn');return false">hide_pn</button>
	<br><br><br><br>
<!--
	<button type="button" onclick="script_show('div_av');return false">show_av</button>
	<button type="button" onclick="script_show('div_tl');return false">show_tl</button>
	<button type="button" onclick="script_show('canvas_pn');return false">show_pn</button>
	<button type="button" onclick="script_show('div_zm');return false">show_zm</button>
	-->


<!--
	<div id="v_hoverdate"> <span v-bind:title="message">hoverdate</span> </div>
	<h1>preview av timline 20200210_1200</h1>
	<a href=index_vu.html target=_blank> <img name="index_tl_png" height=50 src="/imgs/btn/koeye.png"> </a>
	-->

<!--
	<div id="div_pn" >
		<h2>pn</h2>
	        <script id="script_pn_mycontainer"  type="text/javascript"> 
			</script>
		</div>
	<div id="div_sl" >
		<h2>sl</h2>
	        <script id="script_sl_mycontainer"  type="text/javascript"> 
			</script>
		</div>
	-->


	<div id="div_av" >
		<hr color=black>	
		<hr color=white>	
		<h1>div_av preview 20200210_1200</h1>
		<script name="script_avid_video">
			var video_player_jtfdcr = "";
			var avlist_jtfdcr_text ="";
			var video_player_jtfdc = "";
			var avlist_jtfdc_text ="";
			var video_player_jtfinc = "";
			var avlist_jtfinc_text ="";
			var j = 0; var k = 0;
			var avlist = new Array();
// /ka1.mp4
// /jtfdc_20190516_0830_tiny.mp4

avlist_jtfdcr_text =
`/index.mp4
/index0.mp4
/kb/byrdpuckers/vid/huckleberry_hound_17_barbeque_hound.mp4
/kb/byrdpuckers/vid/doghead_video.mp4
/kb/vid/youb/willem_dethouars_kuntao_silat_1996_gulfport_school_tampa-0.mp4
/kb/vid/youb/willem_dethouars_kuntao_silat_1996_gulfport_school_tampa-1.mp4
/kb/vid/youb/willem_dethouars_kuntao_silat_1996_gulfport_school_tampa-2.mp4`;
// alert( "BUGS_780 avlist_jtfdcr_text="+avlist_jtfdcr_text );

avlist_jtfdc_text =
`/fb/law/skwii/vid/tn/tn_IMG_0695_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0696_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0697_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0698_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0699_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0700_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0701_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0702_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0703_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0704_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0705_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0706_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0707_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0708_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0709_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0710_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0711_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0712_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0713_20200212_1200_skwii_dolley_call.mp4
/fb/law/skwii/vid/tn/tn_IMG_0714_20200212_1200_skwii_dolley_call.mp4`;
// alert( "BUGS_800 avlist_jtfdc_text="+avlist_jtfdcr_text );

// /fb/law/skwii/vid/tn/tn_IMG_0676_20200212_1200_skwii_dolley_call.mp4
// /fb/law/skwii/vid/tn/tn_IMG_0677_20200212_1200_skwii_dolley_call.mp4
// /fb/law/skwii/vid/tn/tn_IMG_0684_20200212_1200_skwii_dolley_call.mp4';

avlist_jtfinc_text =
`/kb/jtfdcr/vid/jtfinc_neighbors_tiny/jtfdc_20160530_13279559_byrd_trustee_threat.mp4
/kb/jtfdcr/vid/jtfinc_neighbors_tiny/jtfdc_20170522_1841_byrdpair_taking_jtfdc_sawhorse.mp4
/kb/jtfdcr/vid/jtfinc_neighbors_tiny/jtfdc_20170805_1400_police_byrddog_call.mp4
/kb/jtfdcr/vid/jtfinc_neighbors_tiny/jtfdc_20180528_132537_byrd_court_pail_encounter.mp4
/kb/jtfdcr/vid/jtfinc_neighbors_tiny/jtfdc_20180606_1145_jtf40_driveway_byrdpucker_theft_threadt.mp4
/kb/jtfdcr/vid/jtfinc_neighbors_tiny/jtfdc_20190300_gardner_cant_control_his_dogs.mp4
/kb/jtfdcr/vid/jtfinc_neighbors_tiny/jtfdc_20190329_1216_byrd_stealing_milkcrates_court.mp4
/kb/jtfdcr/vid/jtfinc_neighbors_tiny/jtfdc_20190425_1912_jtf31_dogs_frolic_jkwii_outin.mp4
/kb/jtfdcr/vid/jtfinc_neighbors_tiny/jtfdc_20190509_1224_jkwii_police_officerbell.mp4
/kb/jtfdcr/vid/jtfinc_neighbors_tiny/jtfdc_20190516_0820_byrd_seagrest_tresspass_treats.mp4
/kb/jtfdcr/vid/jtfinc_neighbors_tiny/jtfdc_20190516_1856_skwii_byrdstalk_protection_order-may30_9am.mp4
/kb/jtfdcr/vid/jtfinc_neighbors_tiny/jtfdc_20190529__byrd_siegrist_dogpatrol.mp4
/kb/jtfdcr/vid/jtfinc_neighbors_tiny/jtfdc_20190706_1932_jkwii_jtf30_dog_in_our_yard_probems.mp4
/kb/jtfdcr/vid/jtfinc_neighbors_tiny/jtfdc_20190808_1211_stalkaround_jtf38_seagrist_n_bityelvis2_partyinvite2neighbors.mp4`;
// alert( "BUGS_820 avlist_jtfinc_text="+avlist_jtfinc_text );


			avlist=avlist_jtfdcr_text.split("\n");
//			alert( "BUGS_830 avlist_jtfdcr len="+avlist.length+" avlist="+avlist );
			video_player_jtfdcr += '<hr color=red>';
			video_player_jtfdcr += '<hr color=white>';
			video_player_jtfdcr += '<hr color=blue>';
			video_player_jtfdcr += '<hr color=black>';
			video_player_jtfdcr += '<h2>jtfdcr  jamestownfarms DEFFORD COURT REPORT</h2>';
//			alert( "BUGS_840 video_player_jtfdcr="+video_player_jtfdcr );
			for( j=0; j< avlist.length; j++ ) {
//				if( avid.match('#')) continue;
				if( j == 1 ) {video_player_jtfdcr += '<br><br><hr color=white><hr color=black>';}
				if( j == 4 ) {video_player_jtfdcr += '<br><br><hr color=white><hr color=black>';}
				avid=avlist[j];
				video_player_jtfdcr += '<video controls="controls_jtfdcr_'+j+'"';
//				video_player_jtfdcr += '<video controls="controls_jtfdcr"';
				video_player_jtfdcr += '	defaultmuted="" muted="true" ';
				video_player_jtfdcr += '	style="width:640px;height:360px;" ';
				video_player_jtfdcr += '	poster="/fb/law/imgs/kobubble_jtfdcr.png" ';
				video_player_jtfdcr += '	<source src="'+avid+'"';
				video_player_jtfdcr += ' type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">';
				video_player_jtfdcr += '	</video>';
				}
			video_player_jtfdcr += '	<hr color=black>';
			video_player_jtfdcr += '	<hr color=white>';
//			alert( "BUGS_850 avlist_jtfdcr video_player_jtfdcr="+video_player_jtfdcr );

			avlist=avlist_jtfdc_text.split("\n");
			video_player_jtfdc += '<hr color=black>';
			video_player_jtfdc += '<hr color=white>';
			video_player_jtfdc += '<h2>jtfdc 20200212_1200 SKWII_DOLLEY_CALL</h2>';
			for( j=0; j< avlist.length; j++ ) {
				avid=avlist[j];
				video_player_jtfdc += '<video controls="controls_jtfdc_'+j+'"';
				video_player_jtfdc += '	defaultmuted="" muted="true" ';
				video_player_jtfdc += '	style="width:640px;height:360px;" ';
				video_player_jtfdc += '	poster="/fb/law/imgs/kobubble_jtfdc.png" ';
				video_player_jtfdc += '   <source src="'+avid+'"';
				video_player_jtfdc += '		type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">';
				video_player_jtfdc += '	</video>';
				}

		avlist = avlist_jtfinc_text.split("\n");	
		video_player_jtfinc += '<hr color=white>';
		video_player_jtfinc += '<hr color=black>';
		video_player_jtfinc += '<h2>jtfinc: 2016-2020 DONUTVANLAW DOGS HORSES and BYRDS </h2>';
		for( j=0; j< avlist.length; j++ ) {
			avid=avlist[j];
			video_player_jtfinc += '<video controls="controls_jtfdcr_'+j+'"';
			video_player_jtfinc += '	defaultmuted="" muted="true" ';
			video_player_jtfinc += '	style="width:640px;height:360px;" ';
			video_player_jtfinc += '	poster="/fb/law/imgs/kobubble_jtfinc.png" ';
			video_player_jtfinc += '	<source src="'+avid+'"';
			video_player_jtfinc += ' 	  type="video/mp4;codecs=&quot;avc1.42E01E, mp4a.40.2&quot;">';
			video_player_jtfinc += '	</video>';
			}
		video_player_jtfinc += '<hr color=black>';
		video_player_jtfinc += '<hr color=red>';
		video_player_jtfinc += '<hr color=white>';
		video_player_jtfinc += '<hr color=blue>';

//			alert( "BUGS_805 video_player="+video_player );
//			document.write( video_player );
//			document.write( video_player );
//			document.getElementById('div_av').insertAdjacentHTML("afterbegin", video_player);

		document.getElementById('div_av').insertAdjacentHTML("afterbegin", video_player_jtfdc);
		document.getElementById('div_av').insertAdjacentHTML("afterbegin", video_player_jtfinc);
		document.getElementById('div_av').insertAdjacentHTML("afterbegin", video_player_jtfdcr);
		</script>
	<hr color=linen>
		<br><br>





		<br><br>
<!--		<button type="button" onclick="script_avlist_skwii('')">avlist_skwii</button> -->
		<button type="button" onclick="script_ytlist('')">ytlist</button> 
		<button onclick="jax('yt_20200207.txt');" >test_ytjax_test</button>
<!--		<button type="button" onclick="script_ytlist('ajax')">ytlist_ajax_bugs</button> -->
		<button type="button" onclick="script_avlist()">avlist</button> 
		<div id="div_ytlist" ></div>
		<div id="div_avlist" ></div>
		</div>

		<br><br>

<hr color=white>

	<div id="div_tl"> 
		<hr color=blue>	
		<hr color=white>	
		<hr color=red>	
		<hr color=black>	
		<div id="my-timeline"><h2>my-timeline</h2></div>
		<hr color=black>	
		<hr color=red>	
		<hr color=white>	
		<hr color=blue>	
		</div>

	<hr color=white>
	<hr color=black>
	<button type="button" onclick="script_tllist();return false">script_tllist</button>
	<div id="div_tllist">
		<h2>div_tllist</h2>
		</div>
	<br><br><br><br><br>
	<br><br><br><br><br>
	<hr color=black>
	<hr color=white>




	<div id="div_zm"> 
		<script name="script_zmid_title">
			document.write( "<h1>"+url.search.replace('?zmid=','') + "</h1>" );
			</script>
		<div align="center"><br>
			<table width="100" border="0" align="center" cellpadding="1" cellspacing="0" bgcolor="#000000" >
				<tr>
					<td>
<!--
						<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#ffffff"> 
						<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="darkslategrey">
						<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="slategrey">
	-->
						<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="slategrey">
						<tr>
							<td>
								<div id="myContainer"></div>
<!--								<div id="/zm/komap"></div> -->
								</td>
							</tr>
							</table>
						</td>
					</tr>
				</table>
			</div>
		</div>

		<script id="b64_zm_js" >
			var b64_zm_js = new Array();
			b64_zm_js[0] = "data:/text/plain;base64,KGZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30uY2FsbCgpO2EuWj17fX0pKCksWi5zaG93SW1hZ2U9ZnVuY3Rpb24oYSxiLGMpe1ouVXRpbHMuejEyOCgpLFouVXRpbHMuejEyNygpLFouVXRpbHMuejEyNigpLFouVXRpbHMuejE2MygpLFoucGFnZUNvbnRhaW5lcklEPWEsWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGIpLFoucGFyYW1ldGVycz1aLlV0aWxzLnoyMzMoYyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJET01Db250ZW50TG9hZGVkIixaLmluaXRpYWxpemUpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csImxvYWQiLFouaW5pdGlhbGl6ZSl9LFouaW5pdGlhbGl6ZT1mdW5jdGlvbigpe2FyZ3VtZW50cy5jYWxsZWUuZG9uZXx8KGFyZ3VtZW50cy5jYWxsZWUuZG9uZT0hMCxaLlV0aWxzLnoxNjQoKSxaLlV0aWxzLnoyNDkoWi5wYXJhbWV0ZXJzKSxaLlZpZXdlcj1uZXcgWi56MTIyLFouVXRpbHMuaXNTdHJWYWwoWi5jb3B5cmlnaHRQYXRoKT9aLlV0aWxzLmVuZm9yY2VDb3B5cmlnaHQoKTpaLlZpZXdlci56MTQ5KCksWi5kZWJ1ZyYmWi5VdGlscy50cmFjZShaLlV0aWxzLnoxODUoIno2NyIpKSl9LFouejEyMj1mdW5jdGlvbigpe1ouVmlld2VyRGlzcGxheT1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIlZpZXdlckRpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJyZWxhdGl2ZSIsImhpZGRlbiIsIjEwMCUiLCIxMDAlIiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJwb2ludGVyIiksWi5wYWdlQ29udGFpbmVyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFoucGFnZUNvbnRhaW5lcklEKTt2YXIgYT1aLlV0aWxzLnoxNzYoWi5wYWdlQ29udGFpbmVyKTtaLnZpZXdlclc9cGFyc2VGbG9hdChhLndpZHRoKSxaLnZpZXdlckg9cGFyc2VGbG9hdChhLmhlaWdodCksaXNOYU4oWi52aWV3ZXJXKSYmKFoudmlld2VyVz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKFoudmlld2VySCkmJihaLnZpZXdlckg9Wi5WaWV3ZXJEaXNwbGF5LmNsaWVudEhlaWdodCksWi5wYWdlQ29udGFpbmVyLmlubmVySFRNTD0iIixaLnBhZ2VDb250YWluZXIuYXBwZW5kQ2hpbGQoWi5WaWV3ZXJEaXNwbGF5KSx0aGlzLnoxNDk9ZnVuY3Rpb24oKXtaLlZpZXdwb3J0PW5ldyBaLnoxMjV9LHRoaXMuejE0OD1mdW5jdGlvbigpe1oudG9vbGJhclZpc2libGU+MCYmKFouVG9vbGJhcj1uZXcgWi56MTI0KFouVmlld3BvcnQpKSxaLm5hdmlnYXRvclZpc2libGU+MCYmKFouTmF2aWdhdG9yPW5ldyBaLnoxMjMoWi5WaWV3cG9ydCkpLFouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56Mjc3KCl9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQsZSl7Wi52aWV3ZXJXPWEsWi52aWV3ZXJIPWIsWi5WaWV3ZXJEaXNwbGF5LnN0eWxlLndpZHRoPWErInB4IixaLlZpZXdlckRpc3BsYXkuc3R5bGUuaGVpZ2h0PWIrInB4IixaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSYmWi5WaWV3cG9ydC5zZXRTaXplQW5kUG9zaXRpb24oYSxiLGMsZCk7dmFyIGY9Wi50b29sYmFyUG9zaXRpb249PTE/Yi1aLnRvb2xiYXJIOjA7Wi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmKFouVG9vbGJhci5zZXRTaXplQW5kUG9zaXRpb24oYSxudWxsLG51bGwsZiksWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMCkpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5OYXZpZ2F0b3IuejE4MCgpJiYoWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKG51bGwsbnVsbCxjLGQsWi5uYXZpZ2F0b3JGaXQpLFoubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSksZSYmWi5WaWV3cG9ydC56Mjc0KCEwKX0sdGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7Wi5WaWV3cG9ydC56MjkzQWxsU3RvcCghMCksWi5pbWFnZVBhdGg9Wi5VdGlscy56MjQzKGEpO3ZhciBiPW5ldyBaLnoxMDEsYz1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi8iKyJJbWFnZVByb3BlcnRpZXMueG1sIik7Yi5sb2FkWE1MKGMpfX0sWi56MTI1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gY2QoKXt6PTEsQT0wLEI9MCxGPVtdLEc9W10sSD1bXSxJPVtdLEo9W10sSz1bXSxMPVtdLE09W10sTj1bXSxPPVtdLFA9W10sUT1bXSxSPTB9ZnVuY3Rpb24gY2UoKXtyZXR1cm4gYn1mdW5jdGlvbiBjZihhKXtiPWF9ZnVuY3Rpb24gY2coKXtoPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwidmlld3BvcnRDb250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChoKSxpPWgsaz1pLnN0eWxlLGw9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydEJhY2tmaWxsRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZChsKSxtPWwsbj1tLnN0eWxlLHA9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KFoudXNlQ2FudmFzPyJjYW52YXMiOiJkaXYiLCJ2aWV3cG9ydERpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLGguYXBwZW5kQ2hpbGQocCkscT1wLHI9cS5zdHlsZSxaLlV0aWxzLmlzU3RyVmFsKFoud2F0ZXJtYXJrUGF0aCkmJih0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2F0ZXJtYXJrRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh0KSx1PXQsdj11LnN0eWxlKSxaLlV0aWxzLmlzU3RyVmFsKFouaG90c3BvdFBhdGgpJiYodz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsImhvdHNwb3RzRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwidmlzaWJsZSIsIjFweCIsIjFweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4IiksaC5hcHBlbmRDaGlsZCh3KSx4PXcseT14LnN0eWxlKSxaLnVzZUNhbnZhcz8obz1tLmdldENvbnRleHQoIjJkIikscz1xLmdldENvbnRleHQoIjJkIikpOihtLmlubmVySFRNTD0iIixxLmlubmVySFRNTD0iIiksdSYmKHUuaW5uZXJIVE1MPSIiKSx4JiYoeC5pbm5lckhUTUw9IiIpfWZ1bmN0aW9uIGNoKGEsYixjLGQpe2N8fChjPTApLGR8fChkPTApLFk9YSwkPWIsYmI9WSpYLGJjPSQqWCxiZD1iYi8yLGJlPWJjLzIsYmY9LSgoYmItWSkvMikrYyxiZz0oYmItWSkvMitjLGJoPS0oKGJjLSQpLzIpK2QsYmk9KGJjLSQpLzIrZCxpLndpZHRoPWJiLGkuaGVpZ2h0PWJjLGsud2lkdGg9YmIrInB4IixrLmhlaWdodD1iYysicHgiLGsubGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIscS53aWR0aD1iYixxLmhlaWdodD1iYyx1JiYodS53aWR0aD1iYix1LmhlaWdodD1iYyx2LndpZHRoPWJiKyJweCIsdi5oZWlnaHQ9YmMrInB4IiksWi51c2VDYW52YXMmJihzLnRyYW5zbGF0ZShiZCxiZSkscy5zYXZlKCkpfWZ1bmN0aW9uIGNpKCl7dmFyIGE9Wi5pbWFnZVcsYj1aLmltYWdlSDt3aGlsZShhPmN8fGI+YylhPWEvMixiPWIvMix6Kys7YT1aLmltYWdlVyxiPVouaW1hZ2VIO2Zvcih2YXIgZD16LTE7ZD49MDtkLS0pSFtkXT1hLElbZF09YixKW2RdPU1hdGguY2VpbChIW2RdL2MpLEtbZF09TWF0aC5jZWlsKElbZF0vYyksTFtkXT1KW2RdKktbZF0sYT1hLzIsYj1iLzJ9ZnVuY3Rpb24gY2ooKXtaLmluaXRpYWxYfHwoWi5pbml0aWFsWD1aLmltYWdlVy8yKSxaLmluaXRpYWxZfHwoWi5pbml0aWFsWT1aLmltYWdlSC8yKTt2YXIgYT1jUigpO1ouZml0WiYmWi5maXRaIT1hJiYoWi5pbml0aWFsWj09Wi5maXRaJiYoWi5pbml0aWFsWj1udWxsKSxaLm1pblo9PVouZml0WiYmKFoubWluWj1udWxsKSxaLm1heFo9PVouZml0WiYmKFoubWF4Wj1udWxsKSxaLmZpdFo9bnVsbCksWi5maXRafHwoWi5maXRaPWEpLFouaW5pdGlhbFp8fChaLmluaXRpYWxaPVouZml0WiksWi5taW5afHwoWi5taW5aPVouZml0WiksWi5tYXhafHwoWi5tYXhaPVouZml0WiksWi5pbml0aWFsWjxaLm1pblomJihaLmluaXRpYWxaPVoubWluWiksWi5pbml0aWFsWj5aLm1heFomJihaLmluaXRpYWxaPVoubWF4Wil9ZnVuY3Rpb24gY2soKXtjbChXKSx6PlQmJihjbChWKSx6PlMmJmNsKFUpKSxHLnNvcnQoKSxHPVouVXRpbHMuejI0MihHKSxjcyhHLGNKLDApfWZ1bmN0aW9uIGNsKGEpe3ZhciBiPUpbYV0tMSxjPUtbYV0tMTtmb3IodmFyIGQ9MDtkPD1jO2QrKylmb3IodmFyIGU9MDtlPD1iO2UrKylHLnB1c2goYSsiLSIrZSsiLSIrZCl9ZnVuY3Rpb24gY20oYSxiKXt2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKSxkPWJmLXBhcnNlRmxvYXQoay5sZWZ0KSxlPWJoLXBhcnNlRmxvYXQoay50b3ApO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsWi5pbWFnZVg9Wi5pbWFnZVgrZC9aLmltYWdlWixaLmltYWdlWT1aLmltYWdlWStlL1ouaW1hZ2VaLGNyKG0sQixGLCExLCExKSxjcihxLEEsTywhMSwhMSksY1koKTt2YXIgZj1jdygpO2E+MD9mLnJpZ2h0PWYubGVmdDphPDAmJihmLmxlZnQ9Zi5yaWdodCksYj4wP2YuYm90dG9tPWYudG9wOmI8MCYmKGYudG9wPWYuYm90dG9tKTtmb3IodmFyIGc9Zi50b3A7Zzw9Zi5ib3R0b207ZysrKWZvcih2YXIgaD1mLmxlZnQ7aDw9Zi5yaWdodDtoKyspUS5wdXNoKEErIi0iK2grIi0iK2cpO3ZhciBpPVEubGVuZ3RoO2Zvcih2YXIgaj0wO2o8aTtqKyspe3ZhciBsPVFbal07aWYobCl7dmFyIG49bmV3IGNHKGwpO2NJKG4sYyxjSyl9fWk+MzAmJlEuc3BsaWNlKGktMzAsMzApfWZ1bmN0aW9uIGNuKCl7dmFyIGE9ITE7cGFyc2VGbG9hdChyLndpZHRoKSE9cS53aWR0aCYmKFoudXNlQ2FudmFzJiYoci53aWR0aD1xLndpZHRoKyJweCIsci5oZWlnaHQ9cS5oZWlnaHQrInB4IixyLmxlZnQ9IjBweCIsci50b3A9IjBweCIscy5yZXN0b3JlKCkscy5zYXZlKCkscy5zY2FsZShDLEMpKSxhPSEwKTtpZihwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymgpe3ZhciBiPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixjPXBhcnNlRmxvYXQoay50b3ApLWJoO2subGVmdD1iZisicHgiLGsudG9wPWJoKyJweCIsYmw9cGFyc2VGbG9hdChuLmxlZnQpK2IsYm09cGFyc2VGbG9hdChuLnRvcCkrYyxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiO3ZhciBkPWNCKEEsQyk7Wi5pbWFnZVg9Wi5pbWFnZVgtYi9kLFouaW1hZ2VZPVouaW1hZ2VZLWMvZCxhPSEwfWEmJihjcihxLEEsTywhMCwhMSksY1koKSl9ZnVuY3Rpb24gY28oKXtDIT1EJiYoWi5pbWFnZVo9YnopLFouaW1hZ2VaPFoubWluWiYmKFouaW1hZ2VaPVoubWluWik7dmFyIGE9ZCxiPXo7d2hpbGUoYS8yPj1aLmltYWdlWiliLS0sYS89MjtiPWItMTwwPzA6Yi0xO3ZhciBjPWNDKGIsWi5pbWFnZVopO2lmKGIhPUF8fGMhPUMpWi51c2VDYW52YXMmJihzLnJlc3RvcmUoKSxzLnNhdmUoKSxzLnNjYWxlKGMsYykpLEE9YixDPWM7RD1DfWZ1bmN0aW9uIGNwKCl7Qj1BPlM/VTpBPlQ/VjpXLEU9Y0MoQixaLmltYWdlWiksdGllckJhY2tmaWxsVz1IW0JdLHRpZXJCYWNrZmlsbEg9SVtCXSxtLndpZHRoPXRpZXJCYWNrZmlsbFcsbS5oZWlnaHQ9dGllckJhY2tmaWxsSDt2YXIgYT10aWVyQmFja2ZpbGxXKkUsYj10aWVyQmFja2ZpbGxIKkUsYz1aLmltYWdlWCpaLmltYWdlWixkPVouaW1hZ2VZKlouaW1hZ2VaO2JqPWEsYms9YixibD1iZC1jLGJtPWJlLWQsWi51c2VDYW52YXMmJihuLndpZHRoPWJqKyJweCIsbi5oZWlnaHQ9YmsrInB4Iiksbi5sZWZ0PWJsKyJweCIsbi50b3A9Ym0rInB4In1mdW5jdGlvbiBjcSgpe3ZhciBhPWN3KCk7Zm9yKHZhciBiPWEudG9wLGM9YS5ib3R0b207Yjw9YztiKyspZm9yKHZhciBkPWEubGVmdCxlPWEucmlnaHQ7ZDw9ZTtkKyspTi5wdXNoKEErIi0iK2QrIi0iK2IpO1Auc29ydCgpLE4uc29ydCgpLFA9Wi5VdGlscy56MjQyKFApLE49Wi5VdGlscy56MjQyKE4pO3ZhciBmPVouVXRpbHMuaW50ZXJzZWN0KE4sUCk7Tj1aLlV0aWxzLnN1YnRyYWN0KE4sUCksUj10aWxlc0xvYWRpbmdOYW1lc0xlbmd0aD1OLmxlbmd0aCxaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpJiZaLlRvb2xiYXIuc2hvd1Byb2dyZXNzKFIsdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGgpLFA9Wi5VdGlscy5zdWJ0cmFjdChQLGYpLFA9UC5jb25jYXQoZiksdGlsZXNMb2FkaW5nTmFtZXNMZW5ndGghPTAmJihNPVtdKX1mdW5jdGlvbiBjcihhLGIsYyxkLGUpe2V8fGN0KGEpO2lmKGQpe3ZhciBmPU1hdGguZmxvb3IoYy5sZW5ndGgvMik7Zm9yKHZhciBnPWYsaD1jLmxlbmd0aDtnPGg7ZysrKXt2YXIgaT1jW2ddO2kmJmkudD09YiYmY00oYSxiLGkpO2lmKGMubGVuZ3RoLWctMSE9Zyl7dmFyIGk9Y1tjLmxlbmd0aC1nLTFdO2kmJmkudD09YiYmY00oYSxiLGkpfX19ZWxzZSBmb3IodmFyIGc9MCxoPWMubGVuZ3RoO2c8aDtnKyspe3ZhciBpPWNbZ107aSYmaS50PT1iJiZjTShhLGIsaSl9fWZ1bmN0aW9uIGNzKGEsYixjKXtpZihhLmxlbmd0aD4wKXt2YXIgZD0obmV3IERhdGUpLmdldFRpbWUoKTtpZihjKXt2YXIgZT1NYXRoLmZsb29yKGEubGVuZ3RoLzIpO2Zvcih2YXIgZj1lLGc9YS5sZW5ndGg7ZjxnO2YrKyl7dmFyIGg9YVtmXTtpZihoKXt2YXIgaT1uZXcgY0coaCk7Y0koaSxkLGIpfWlmKGEubGVuZ3RoLWYtMSE9Zil7dmFyIGg9YVthLmxlbmd0aC1mLTFdO2lmKGgpe3ZhciBpPW5ldyBjRyhoKTtjSShpLGQsYil9fX19ZWxzZSBmb3IodmFyIGY9MCxnPWEubGVuZ3RoO2Y8ZztmKyspe3ZhciBoPWFbZl07aWYoaCl7dmFyIGk9bmV3IGNHKGgpO2NJKGksZCxiKX19fX1mdW5jdGlvbiBjdChhKXtpZihhKWlmKFoudXNlQ2FudmFzJiZhLnRhZ05hbWU9PSJDQU5WQVMiKXt2YXIgYj1hLmdldENvbnRleHQoIjJkIik7Yi5zYXZlKCksYi5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLGIuY2xlYXJSZWN0KDAsMCxiLmNhbnZhcy53aWR0aCxiLmNhbnZhcy5oZWlnaHQpLGIucmVzdG9yZSgpfWVsc2UgaWYoYS5oYXNDaGlsZE5vZGVzKCkpd2hpbGUoYS5jaGlsZE5vZGVzLmxlbmd0aD49MSlhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gY3UoKXtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXt2YXIgYT1jQihBLEMpO1ouVG9vbGJhci56MjY2KGEpfX1mdW5jdGlvbiBjdigpe1ouTmF2aWdhdG9yJiZaLk5hdmlnYXRvci56MTgwKCkmJlouTmF2aWdhdG9yLnoyNjgoKX1mdW5jdGlvbiBjdygpe3JldHVybiBuZXcgY3ooY3goKSxBKX1mdW5jdGlvbiBjeCgpe3ZhciBhPXBhcnNlRmxvYXQoay5sZWZ0KS1iZixiPXBhcnNlRmxvYXQoay50b3ApLWJoO2lmKFoudXNlQ2FudmFzKXt2YXIgYz1wYXJzZUZsb2F0KGsud2lkdGgpL2kud2lkdGg7YS89YyxiLz1jfXZhciBkPWNCKEEsQyk7cmV0dXJuIGEhPTAmJihhLz1kKSxiIT0wJiYoYi89ZCksbmV3IGNBKFouaW1hZ2VYLWEsWi5pbWFnZVktYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsZCl9ZnVuY3Rpb24gY3koKXt2YXIgYT1wYXJzZUZsb2F0KGsubGVmdCktYmYsYj1wYXJzZUZsb2F0KGsudG9wKS1iaDtpZihaLnVzZUNhbnZhcyl7dmFyIGM9cGFyc2VGbG9hdChrLndpZHRoKS9pLndpZHRoO2EvPWMsYi89Y312YXIgZD1jQihBLEMpO3JldHVybiBhIT0wJiYoYS89ZCksYiE9MCYmKGIvPWQpLG5ldyBjQShaLmltYWdlWC1hLFouaW1hZ2VZLWIsLShiYi8yKSxiYi8yLC0oYmMvMiksYmMvMixkKX1mdW5jdGlvbiBjeihhLGIpe3ZhciBkPWNCKGIsMSksZT1NYXRoLmZsb29yKGEubGVmdCpkL2MpLGY9TWF0aC5mbG9vcihhLnJpZ2h0KmQvYyksZz1NYXRoLmZsb29yKGEudG9wKmQvYyksaD1NYXRoLmZsb29yKGEuYm90dG9tKmQvYyk7ZTwwJiYoZT0wKSxmPkpbQV0tMSYmKGY9SltBXS0xKSxnPDAmJihnPTApLGg+S1tBXS0xJiYoaD1LW0FdLTEpLHRoaXMubGVmdD1lLHRoaXMucmlnaHQ9Zix0aGlzLnRvcD1nLHRoaXMuYm90dG9tPWh9ZnVuY3Rpb24gY0EoYSxiLGMsZCxlLGYsZyl7dGhpcy5sZWZ0PWErYy9nLHRoaXMucmlnaHQ9YStkL2csdGhpcy50b3A9YitlL2csdGhpcy5ib3R0b209YitmL2d9ZnVuY3Rpb24gY0IoYSxiKXt2YXIgYz1iKihIW2FdL1ouaW1hZ2VXKTtyZXR1cm4gY31mdW5jdGlvbiBjQyhhLGIpe3ZhciBjPWIvKEhbYV0vWi5pbWFnZVcpO3JldHVybiBjfWZ1bmN0aW9uIGNEKGEsYil7dmFyIGM9YS1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS54LGQ9Yi1aLlV0aWxzLnoxNzQoWi5WaWV3ZXJEaXNwbGF5KS55O3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChjLGQpfWZ1bmN0aW9uIGNFKGEsYil7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpK2JkLGQ9cGFyc2VGbG9hdChrLnRvcCkrYmUsZT1hLWMsZj1iLWQsZz1lL1ouaW1hZ2VaLGg9Zi9aLmltYWdlWixpPVouaW1hZ2VYK2csaj1aLmltYWdlWStoO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNGKGEsYil7dmFyIGM9Wi5pbWFnZVgtYSxkPVouaW1hZ2VZLWIsZT1jKlouaW1hZ2VaLGY9ZCpaLmltYWdlWixnPXBhcnNlRmxvYXQoay5sZWZ0KStiZCxoPXBhcnNlRmxvYXQoay50b3ApK2JlLGk9Zy1lLGo9aC1mO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChpLGopfWZ1bmN0aW9uIGNHKGEpe3RoaXMubmFtZT1hLHRoaXMudD1wYXJzZUludChhLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLSIpKSwxMCksdGhpcy5jPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEuaW5kZXhPZigiLSIpKzEsYS5sYXN0SW5kZXhPZigiLSIpKSwxMCksdGhpcy5yPXBhcnNlSW50KGEuc3Vic3RyaW5nKGEubGFzdEluZGV4T2YoIi0iKSsxKSwxMCksdGhpcy54PU1hdGguZmxvb3IodGhpcy5jKmMpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMucipjKSx0aGlzLmltYWdlPW51bGwsdGhpcy5hbHBoYT0wLHRoaXMudXJsPVouVXRpbHMuejE0MChjSCh0aGlzLnQsdGhpcy5jLHRoaXMucix0aGlzLm5hbWUpKSx0aGlzLmVsbXQ9bnVsbCx0aGlzLnN0eWxlPW51bGx9ZnVuY3Rpb24gY0goYSxiLGQsZSl7dmFyIGY9ZCpKW2FdK2I7Zm9yKHZhciBnPTA7ZzxhO2crKylmKz1MW2ddO3ZhciBoPU1hdGguZmxvb3IoZi9jKSxpPVouaW1hZ2VQYXRoKyIvIisiVGlsZUdyb3VwIitoKyIvIitlKyIuanBnIjtyZXR1cm4gaX1mdW5jdGlvbiBjSShhLGIsYyl7YS5sb2FkaW5nPWNiLnoyMTJJbWFnZShhLnVybCxaLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsYyxhLGIpKX1mdW5jdGlvbiBjSihhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtGLnB1c2goYSk7dmFyIGU9Ry5pbmRleE9mKGQpO2UhPS0xJiZHLnNwbGljZShlLDEpLGEuYWxwaGE9MSxhLnQ9PUImJmNNKG0sQixhKX19ZnVuY3Rpb24gY0soYSxiLGMpe2lmKGEmJmImJmMpe2EuaW1hZ2U9Yzt2YXIgZD1hLm5hbWU7Y00ocSxBLGEpfX1mdW5jdGlvbiBjTChhLGIsYyl7aWYoYSYmYiYmYyl7YS5pbWFnZT1jO3ZhciBkPWEubmFtZTtPLnB1c2goYSksUC5wdXNoKGQpO3ZhciBlPU4uaW5kZXhPZihkKTtlIT0tMSYmTi5zcGxpY2UoZSwxKSxNLnB1c2goYSksYkZ8fChiRj13aW5kb3cuc2V0SW50ZXJ2YWwoY1AsNTApKTt2YXIgZz1OLmxlbmd0aDtnPT0wJiYoWi51c2VDYW52YXMmJmNyKHEsQSxPLCEwLCExKSxQLmxlbmd0aD5mJiZjUSgpLFI9MCksWi5Ub29sYmFyRGlzcGxheSYmWi5Ub29sYmFyLnoxODAoKSYmWi5Ub29sYmFyLnNob3dQcm9ncmVzcyhSLGcpfX1mdW5jdGlvbiBjTShhLGIsYyl7dmFyIGQ9Yy54LGU9Yy55LGY9Y0IoYiwxKTtpZihaLnVzZUNhbnZhcylhPT1xJiYoZC09Wi5pbWFnZVgqZixlLT1aLmltYWdlWSpmKSxjTihhLGMsZCxlKTtlbHNle3ZhciBnO2E9PXE/KGQtPVouaW1hZ2VYKmYtYmQvQyxlLT1aLmltYWdlWSpmLWJlL0MsZz1DKTpnPUUsY08oYSxjLGQsZSxnKX19ZnVuY3Rpb24gY04oYSxiLGMsZCl7dmFyIGU9YS5nZXRDb250ZXh0KCIyZCIpO1ouYWxwaGFTdXBwb3J0ZWQmJmIuYWxwaGE8MT8oZS5nbG9iYWxBbHBoYT1iLmFscGhhLGUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKSxlLmdsb2JhbEFscGhhPTEpOmUuZHJhd0ltYWdlKGIuaW1hZ2UsYyxkKX1mdW5jdGlvbiBjTyhhLGIsYyxkLGUpe2IuZWxtdHx8KGIuZWxtdD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImltZyIpLGIuZWxtdC5vbm1vdXNlZG93bj1aLlV0aWxzLnByZXZlbnREZWZhdWx0LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihiLmVsbXQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxiLmVsbXQuc3JjPWIudXJsLGIuc3R5bGU9Yi5lbG10LnN0eWxlLGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixaLlV0aWxzLnJlbmRlclF1YWxpdHkoYixaLnJlbmRlclF1YWxpdHkpLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCYmKGIuc3R5bGVbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eSsiT3JpZ2luIl09IjBweCAwcHgiKSksYi5lbG10LnBhcmVudE5vZGUhPWEmJmEuYXBwZW5kQ2hpbGQoYi5lbG10KTt2YXIgZj1iLnN0eWxlO2YuZGlzcGxheT0ibm9uZSIsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkP2ZbWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eV09WyJtYXRyaXgoIiwoYi5pbWFnZS53aWR0aC9iLmVsbXQud2lkdGgqZSkudG9GaXhlZCg4KSwiLDAsMCwiLChiLmltYWdlLmhlaWdodC9iLmVsbXQuaGVpZ2h0KmUpLnRvRml4ZWQoOCksIiwiLChjKmUpLnRvRml4ZWQoOCksWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPyIsIjoicHgsIiwoZCplKS50b0ZpeGVkKDgpLFouY3NzVHJhbnNmb3JtTm9Vbml0cz8iKSI6InB4KSJdLmpvaW4oIiIpOihmLndpZHRoPWIuaW1hZ2Uud2lkdGgqZSsicHgiLGYuaGVpZ2h0PWIuaW1hZ2UuaGVpZ2h0KmUrInB4IixmLmxlZnQ9YyplKyJweCIsZi50b3A9ZCplKyJweCIpLGYuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnNldE9wYWNpdHkoYixiLmFscGhhKX1mdW5jdGlvbiBjUChhKXt2YXIgYj1NLmxlbmd0aCxjPTA7Zm9yKHZhciBkPTA7ZDxiO2QrKyl7dmFyIGU9TVtkXTtlLnQ9PUEmJihlLmFscGhhPDE/KGUuYWxwaGErPWJFLGUuYWxwaGE+MSYmKGUuYWxwaGE9MSksY00ocSxBLGUpKTooYysrLGM+PWImJih3aW5kb3cuY2xlYXJJbnRlcnZhbChiRiksYkY9bnVsbCkpKX19ZnVuY3Rpb24gY1EoKXt2YXIgYT1QLmxlbmd0aC1mO2Zvcih2YXIgYj0wO2I8YTtiKyspaj1QLmluZGV4T2YoT1tiXS5uYW1lKSxqIT0tMSYmUC5zcGxpY2UoaiwxKSxPLnNwbGljZShiLDEpfWZ1bmN0aW9uIGNSKCl7cmV0dXJuIFouaW1hZ2VXL1ouaW1hZ2VIPlkvJD9ZL1ouaW1hZ2VXOiQvWi5pbWFnZUh9ZnVuY3Rpb24gY1MoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9bmV3IGNBKGEsYiwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGQ9Yy5sZWZ0LGU9Yy5yaWdodCxmPWMudG9wLGc9Yy5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9kPDA/YT1ZLzIvWi5pbWFnZVo6ZT5aLmltYWdlVyYmKGE9Wi5pbWFnZVctWS8yL1ouaW1hZ2VaKTphPVouaW1hZ2VXLzIsWi5pbWFnZUgqWi5pbWFnZVo+JD9mPDA/Yj0kLzIvWi5pbWFnZVo6Zz5aLmltYWdlSCYmKGI9Wi5pbWFnZUgtJC8yL1ouaW1hZ2VaKTpiPVouaW1hZ2VILzJ9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1QoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Y0IoQSxDKSxkPVouaW1hZ2VYLGU9Wi5pbWFnZVksZj1uZXcgY0EoZCxlLC0oWS8yKSxZLzIsLSgkLzIpLCQvMixjKSxnPWYubGVmdCxoPWYucmlnaHQsaT1mLnRvcCxqPWYuYm90dG9tO1ouaW1hZ2VXKmM+WT9nPDA/YSs9ZypjOmg+Wi5pbWFnZVcmJihhLT0oWi5pbWFnZVctaCkqYyk6YSs9KGQtWi5pbWFnZVcvMikqYyxaLmltYWdlSCpjPiQ/aTwwP2IrPWkqYzpqPlouaW1hZ2VIJiYoYi09KFouaW1hZ2VILWopKmMpOmIrPShlLVouaW1hZ2VILzIpKmN9cmV0dXJuIG5ldyBaLlV0aWxzLlBvaW50KGEsYil9ZnVuY3Rpb24gY1UoYSxiKXtpZihaLmNvbnN0cmFpblBhbil7dmFyIGM9Wi5pbWFnZVgtKGEtYmYpL1ouaW1hZ2VaLGQ9Wi5pbWFnZVktKGItYmgpL1ouaW1hZ2VaLGU9bmV3IGNBKGMsZCwtKFkvMiksWS8yLC0oJC8yKSwkLzIsWi5pbWFnZVopLGY9ZS5sZWZ0LGc9ZS5yaWdodCxoPWUudG9wLGk9ZS5ib3R0b207Wi5pbWFnZVcqWi5pbWFnZVo+WT9mPDA/YSs9ZipaLmltYWdlWjpnPlouaW1hZ2VXJiYoYS09KFouaW1hZ2VXLWcpKlouaW1hZ2VaKTphKz0oYy1aLmltYWdlVy8yKSpaLmltYWdlWixaLmltYWdlSCpaLmltYWdlWj4kP2g8MD9iKz1oKlouaW1hZ2VaOmk+Wi5pbWFnZUgmJihiLT0oWi5pbWFnZUgtaSkqWi5pbWFnZVopOmIrPShkLVouaW1hZ2VILzIpKlouaW1hZ2VafXJldHVybiBuZXcgWi5VdGlscy5Qb2ludChhLGIpfWZ1bmN0aW9uIGNWKGEpe3JldHVybiBhPloubWF4Wj9hPVoubWF4WjphPFoubWluWiYmKGE9Wi5taW5aKSxhfWZ1bmN0aW9uIGNXKCl7Ylo9bmV3IEltYWdlLGIkPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzMiKSksYloudXJsPVoud2F0ZXJtYXJrUGF0aCxiWi5vbmxvYWQ9Y1gsYloub25lcnJvcj1jWixiWi5zcmM9Wi53YXRlcm1hcmtQYXRofWZ1bmN0aW9uIGNYKCl7aWYodSl7dmFyIGE9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno3NCIpKSxiPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NzYiKSksYz1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejc1IikpLGQ9Y0IoQSxDKSxlPShaLmltYWdlVypkLXUud2lkdGgpLzIsZj0oWi5pbWFnZUgqZC11LmhlaWdodCkvMixnPShaLmltYWdlVy8yLVouaW1hZ2VYKSpkLGg9KFouaW1hZ2VILzItWi5pbWFnZVkpKmQsaT1kPGE/YTpkLGo9TWF0aC5yb3VuZChaLmltYWdlVy9iKSxrPU1hdGgucm91bmQoWi5pbWFnZUgvYyksbD1jeSgpO3dpU2NhbGVkVz1iWi53aWR0aCppLHdpU2NhbGVkSD1iWi5oZWlnaHQqaTt2YXIgbT0wLG49MDtmb3IodmFyIG89MTtvPD1qO28rKylmb3IodmFyIHA9MTtwPD1rO3ArKyl7dmFyIHE9TWF0aC5yb3VuZChaLmltYWdlVy8oaisxKSpvKSxyPU1hdGgucm91bmQoWi5pbWFnZUgvKGsrMSkqcCk7aWYocT5sLmxlZnQmJnE8bC5yaWdodCYmcj5sLnRvcCYmcjxsLmJvdHRvbSl7dmFyIHM9TWF0aC5yb3VuZChxKmQtd2lTY2FsZWRXLzItZStnKSx0PU1hdGgucm91bmQocipkLXdpU2NhbGVkSC8yLWYraCk7aWYoWi5pbWFnZVc+NGUzKXt2YXIgdj1tKzEwMCx3PW4rMTAwO2lmKHM8diYmdDx3KWNvbnRpbnVlO209cyxuPXR9dmFyIHg9YlouY2xvbmVOb2RlKCEwKTtaLlV0aWxzLnNldE9wYWNpdHkoeCxiJCkseC53aWR0aD13aVNjYWxlZFcseC5oZWlnaHQ9d2lTY2FsZWRIO3ZhciB5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2Iiwid2lDIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLHdpU2NhbGVkVysicHgiLHdpU2NhbGVkSCsicHgiLHMrInB4Iix0KyJweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7eS5hcHBlbmRDaGlsZCh4KSx1LmFwcGVuZENoaWxkKHkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHgsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9fX19ZnVuY3Rpb24gY1koKXt1JiYoY3QodSksY1goKSl9ZnVuY3Rpb24gY1ooKXtaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6OTciKSt0aGlzLnVybCl9ZnVuY3Rpb24gYyQoYixjLGQpe2EuejI5M0FsbFN0b3AoKSxaLmltYWdlWj1jVihkKTt2YXIgZT1jUyhiLGMpO1ouaW1hZ2VYPWUueCxaLmltYWdlWT1lLnksYS56Mjc0KCEwKX1mdW5jdGlvbiBjXygpe2lmKGJCKXtkYihidixidyxieCwhMSk7aWYoYnYhPT0wfHxidyE9PTB8fGJ4IT09MCliQj13aW5kb3cuc2V0VGltZW91dChjXyxiQSl9fWZ1bmN0aW9uIGRhKCl7Yk88Ykk/KGRiKGJKLGJLLGJMLCEwKSxiTysrLGJOPXdpbmRvdy5zZXRUaW1lb3V0KGRhLGJIKSk6KEM9Yk8qYkwrY0MoQSxaLmltYWdlWiksYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfWZ1bmN0aW9uIGRiKGEsYixkLGUpe3ZhciBmLGcsaCxpPSExLGo9ITEsbD0hMTtpZihkIT0wKXt2YXIgbT1DKigxK2QpO2UmJihtPUMrZCk7dmFyIG49Y0IoQSxtKTtoPWNWKG4pO2lmKGghPVouaW1hZ2VaKXt2YXIgbz1kZShoKTtvJiYoIWUsaj0hMCxsPSEwKX19aWYoYSE9MHx8YiE9MCl7dmFyIHA9cGFyc2VGbG9hdChrLmxlZnQpK2Escz1wYXJzZUZsb2F0KGsudG9wKStiLHQ9Y1UocCxzKTtmPXQueCxnPXQueSxrLmxlZnQ9ZisicHgiLGsudG9wPWcrInB4IixpPSEwLGw9ITB9dmFyIHU9YnklMj09MDt1JiYoY1koKSxqJiZjdSgpLGwmJmN2KCkpO2lmKGkpdmFyIHY9Wi51c2VDYW52YXM/cGFyc2VGbG9hdChyLndpZHRoKS9xLndpZHRoOjEsdz1NYXRoLnJvdW5kKGMvYnUqQyp2KSx4PWJ5JXc9PTAmJmJ5IT0wfWZ1bmN0aW9uIGRjKCl7YkImJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJCKSxiQj1udWxsKSxidj0wLGJ3PTAsYng9MCxieT0wfWZ1bmN0aW9uIGRkKCl7Yk4mJih3aW5kb3cuY2xlYXJUaW1lb3V0KGJOKSxiTj1udWxsKX1mdW5jdGlvbiBkZShhKXt2YXIgYj0hMSxjPWNDKEEsYSk7aWYoYyE9Qyl7Qz1jLEU9Y0MoQixhKTt2YXIgZD1jL0QsZT1iYipkLGY9YmMqZCxnPShiYi1lKS8yLGg9KGJjLWYpLzI7aWYoYzxEKXt2YXIgaT1jVChnLGgpO2subGVmdD1iZitpLngtZysicHgiLGsudG9wPWJoK2kueS1oKyJweCJ9aWYoWi51c2VDYW52YXMpci53aWR0aD1lKyJweCIsci5oZWlnaHQ9ZisicHgiLHIubGVmdD1nKyJweCIsci50b3A9aCsicHgiLGU9YmoqZCxmPWJrKmQsZz1ibCtaLmltYWdlWCooMS1kKSpaLmltYWdlWixoPWJtK1ouaW1hZ2VZKigxLWQpKlouaW1hZ2VaLG4ud2lkdGg9ZSsicHgiLG4uaGVpZ2h0PWYrInB4IixuLmxlZnQ9ZysicHgiLG4udG9wPWgrInB4IjtlbHNle2NyKHEsQSxPLCEwLCExKSx0aWVyQmFja2ZpbGxXPUhbQl0sdGllckJhY2tmaWxsSD1JW0JdLG0ud2lkdGg9dGllckJhY2tmaWxsVyxtLmhlaWdodD10aWVyQmFja2ZpbGxIO3ZhciBqPXRpZXJCYWNrZmlsbFcqRSxsPXRpZXJCYWNrZmlsbEgqRSxvPVouaW1hZ2VYKmEscD1aLmltYWdlWSphO2JsPWJkLW8sYm09YmUtcCxuLmxlZnQ9YmwrInB4IixuLnRvcD1ibSsicHgiLGNyKG0sQixGLCExLCExKX1iPSEwfXJldHVybiBifWZ1bmN0aW9uIGRmKGEpe2E/KGJYfHxkZygpLGJYLmVsbXQuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIik6YlgmJihiWC5lbG10LnN0eWxlLmRpc3BsYXk9Im5vbmUiKX1mdW5jdGlvbiBkZygpe3ZhciBhPVouVXRpbHMuejE4NSgiejIxIiksYj0zNCxjPTM0LGQ9MjAsZT1wYXJzZUZsb2F0KFoudmlld2VyVyktKGIrZCksZj1wYXJzZUZsb2F0KFoudmlld2VySCktKGMrZCksZz1aLlV0aWxzLnoxODUoInoyMCIpO2JYPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uRlBDYW5jZWwiLGEsbnVsbCxudWxsLG51bGwsbnVsbCxiKyJweCIsYysicHgiLGUrInB4IixmKyJweCIsIm1vdXNlZG93biIsZGgsInoxMDIiLCJzb2xpZCIsIjFweCIsZywiMHB4IiwiMHB4IiksWi5WaWV3ZXJEaXNwbGF5LmFwcGVuZENoaWxkKGJYLmVsbXQpfWZ1bmN0aW9uIGRoKCl7YS50b2dnbGVGdWxsUGFnZVZpZXcoITEpfWZ1bmN0aW9uIGRpKCl7Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXlkb3duIixkeiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJrZXl1cCIsZEEpLFoubW9iaWxlRGV2aWNlPyhaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hzdGFydCIsZHApLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJ0b3VjaG1vdmUiLGRxKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hlbmQiLGRyKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwidG91Y2hjYW5jZWwiLGRzKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZXN0YXJ0IixkdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksImdlc3R1cmVjaGFuZ2UiLGR1KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwiZ2VzdHVyZWVuZCIsZHYpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0ub25vcmllbnRhdGlvbmNoYW5nZT1keSk6KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3ZlciIsZGopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlZpZXdlckRpc3BsYXksIm1vdXNlb3V0IixkbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKFouVmlld2VyRGlzcGxheSwibW91c2Vtb3ZlIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaSwibW91c2Vkb3duIixkayksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNlbW92ZSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihtLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHEsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSx1JiZaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLHgmJlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih4LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9ZnVuY3Rpb24gZGooYSl7dmFyIGI9Wi5VdGlscy56MjI1KFouVXRpbHMudGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKSxjPVouVXRpbHMuejIyNShaLlV0aWxzLnJlbGF0ZWRUYXJnZXQoYSkpO2lmKCFifHwhYylaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCEwKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKSxibz1udWxsfWZ1bmN0aW9uIGRrKGEpe2lmKFouVXRpbHMuaXNSaWdodE1vdXNlQnV0dG9uKGEpKXJldHVybjtibj0hMDt2YXIgYj1aLlV0aWxzLnoxODEoYSk7cmV0dXJuIGJQPW5ldyBaLlV0aWxzLlBvaW50KGIueCxiLnkpLGkubW91c2VYUHJpb3I9Yi54LGkubW91c2VZUHJpb3I9Yi55LFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixkbCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksIm1vdXNldXAiLGRtKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLGRtKSwhMX1mdW5jdGlvbiBkbChiKXtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGI9Wi5VdGlscy5ldmVudChiKSxjPVouVXRpbHMuejE4MShiKSxkPWMueC1pLm1vdXNlWFByaW9yLGU9Yy55LWkubW91c2VZUHJpb3I7aWYoIWlzTmFOKGQpJiYhaXNOYU4oZSkpe3ZhciBmPXBhcnNlRmxvYXQoay5sZWZ0KStkLGc9cGFyc2VGbG9hdChrLnRvcCkrZSxoPWNVKGYsZyk7ay5sZWZ0PWgueCsicHgiLGsudG9wPWgueSsicHgiLGkubW91c2VYUHJpb3I9Yy54LGkubW91c2VZUHJpb3I9Yy55O2lmKFouTmF2aWdhdG9yKXt2YXIgaj1hLnoxNDEoaCk7Wi5OYXZpZ2F0b3IuejI2M1JlY3RhbmdsZVBvc2l0aW9uKGopfX1yZXR1cm4hMX1mdW5jdGlvbiBkbShiKXtibj0hMSxkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLGRsKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoaSwibW91c2V1cCIsZG0pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsZG0pO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1aLlV0aWxzLnoxODEoYiksZDtibz9kPWJvOmQ9bmV3IFouVXRpbHMuUG9pbnQoYy54LGMueSk7dmFyIGU9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZC54LDIpK01hdGgucG93KGJQLnktZC55LDIpKTtpZihlPDQpe3ZhciBmPWEuejE3MyhiLGQsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoZi54LGYueSxmLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhmLngsZi55LFouaW1hZ2VaKX1lbHNlIFoubW91c2VQYW4mJmEuejI3NCgpO2JvJiYoWi5Ub29sYmFyRGlzcGxheSYmWi50b29sYmFyVmlzaWJsZT4xJiZaLlRvb2xiYXIuc2hvdyghMSksWi5OYXZpZ2F0b3JEaXNwbGF5JiZaLm5hdmlnYXRvclZpc2libGU+MSYmWi5OYXZpZ2F0b3Iuc2V0VmlzaWJpbGl0eSghMSkpfWZ1bmN0aW9uIGRuKGEpe3ZhciBiPVouVXRpbHMuejIyNShaLlV0aWxzLnRhcmdldChhKSksYz1aLlV0aWxzLnoyMjUoWi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpKTtpZighYnx8IWMpaWYoIWJuKVouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITEpLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2Vsc2V7dmFyIGQ9Wi5VdGlscy56MTgxKGEpO2JvPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX1mdW5jdGlvbiBkcChhKXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYiYmIWJwKXticj0hMTt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7YlA9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksaS5tb3VzZVhQcmlvcj1kLngsaS5tb3VzZVlQcmlvcj1kLnl9fWZ1bmN0aW9uIGRxKGIpe2IucHJldmVudERlZmF1bHQoKTtpZighWi5tb3VzZVBhbilyZXR1cm47dmFyIGM9Wi5VdGlscy56MTc4KGIpO2lmKGMmJiFicCYmIWJyKXt2YXIgZD1jLnRhcmdldCxlPW5ldyBaLlV0aWxzLlBvaW50KGMucGFnZVgsYy5wYWdlWSksZj1lLngtaS5tb3VzZVhQcmlvcixnPWUueS1pLm1vdXNlWVByaW9yO2lmKCFpc05hTihmKSYmIWlzTmFOKGcpKXt2YXIgaD1wYXJzZUZsb2F0KGsubGVmdCkrZixqPXBhcnNlRmxvYXQoay50b3ApK2csbD1jVShoLGopO2subGVmdD1sLngrInB4IixrLnRvcD1sLnkrInB4IixpLm1vdXNlWFByaW9yPWUueCxpLm1vdXNlWVByaW9yPWUueTtpZihaLk5hdmlnYXRvcil7dmFyIG09YS56MTQxKGwpO1ouTmF2aWdhdG9yLnoyNjNSZWN0YW5nbGVQb3NpdGlvbihtKX19fXJldHVybiExfWZ1bmN0aW9uIGRyKGIpe2lmKCFicCYmIWJyKXt2YXIgYz0hMSxkPVouVXRpbHMuejE3OChiKTtpZihkKXt2YXIgZT1kLnRhcmdldCxmPW5ldyBaLlV0aWxzLlBvaW50KGQucGFnZVgsZC5wYWdlWSksZz1uZXcgWi5VdGlscy5Qb2ludChmLngsZi55KSxoPU1hdGguc3FydChNYXRoLnBvdyhiUC54LWcueCwyKStNYXRoLnBvdyhiUC55LWcueSwyKSk7aWYoaDw0KXt2YXIgaT1hLnoxNzMoYixnLEEsQyk7Wi5jbGlja1pvb20/YS56MjkzVG9WaWV3KGkueCxpLnksaS56KTpaLmNsaWNrUGFuJiZhLnoyOTNUb1ZpZXcoaS54LGkueSxaLmltYWdlWil9ZWxzZSBjPSEwfWVsc2UgYz0hMDtjJiZaLm1vdXNlUGFuJiZhLnoyNzQoKX19ZnVuY3Rpb24gZHMoYil7aWYoIWJwJiYhYnIpe3ZhciBjPSExLGQ9Wi5VdGlscy56MTc4KGIpO2lmKGQpe3ZhciBlPWQudGFyZ2V0LGY9bmV3IFouVXRpbHMuUG9pbnQoZC5wYWdlWCxkLnBhZ2VZKSxnPW5ldyBaLlV0aWxzLlBvaW50KGYueCxmLnkpLGg9TWF0aC5zcXJ0KE1hdGgucG93KGJQLngtZy54LDIpK01hdGgucG93KGJQLnktZy55LDIpKTtpZihoPDQpe3ZhciBpPWEuejE3MyhiLGcsQSxDKTtaLmNsaWNrWm9vbT9hLnoyOTNUb1ZpZXcoaS54LGkueSxpLnopOlouY2xpY2tQYW4mJmEuejI5M1RvVmlldyhpLngsaS55LFouaW1hZ2VaKX1lbHNlIGM9ITB9ZWxzZSBjPSEwO2MmJloubW91c2VQYW4mJmEuejI3NCgpfX1mdW5jdGlvbiBkdChhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpO2R1KGEpLGJwfHwoYnA9d2luZG93LnNldEludGVydmFsKGR3LGJzKSl9ZnVuY3Rpb24gZHUoYSl7dmFyIGE9Wi5VdGlscy5ldmVudChhKTthLnByZXZlbnREZWZhdWx0KCksYnE9TWF0aC5yb3VuZChhLnNjYWxlKjEwMCkvMTAwfWZ1bmN0aW9uIGR2KGIpe2JwJiYod2luZG93LmNsZWFySW50ZXJ2YWwoYnApLGJyPSEwLGJwPW51bGwpLFoubW91c2VQYW4mJmEuejI3NCgpfWZ1bmN0aW9uIGR3KGEpe2lmKCFaLm1vdXNlUGFuKXJldHVybjt2YXIgYj1keChBLEQsYnEpLGM9Y1YoYik7YiE9Wi5pbWFnZVomJmRlKGMpfWZ1bmN0aW9uIGR4KGEsYixjKXt2YXIgZD1iKmMsZT1jQihhLGQpO3JldHVybiBlfWZ1bmN0aW9uIGR5KGIpe1ouZnVsbFBhZ2UmJihaLlRvb2xiYXJEaXNwbGF5JiZaLnRvb2xiYXJWaXNpYmxlPjEmJlouVG9vbGJhci5zaG93KCExKSxaLk5hdmlnYXRvckRpc3BsYXkmJloubmF2aWdhdG9yVmlzaWJsZT4xJiZaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKSxhLnRvZ2dsZUZ1bGxQYWdlVmlldyghMSksYS50b2dnbGVGdWxsUGFnZVZpZXcoITApLFouVG9vbGJhckRpc3BsYXkmJloudG9vbGJhclZpc2libGU+MSYmWi5Ub29sYmFyLnNob3coITApLFouTmF2aWdhdG9yRGlzcGxheSYmWi5uYXZpZ2F0b3JWaXNpYmxlPjEmJlouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApKX1mdW5jdGlvbiBkeihiKXtpZighWi5rZXlzKXJldHVybjt2YXIgYj1aLlV0aWxzLmV2ZW50KGIpO3N3aXRjaChiLmtleUNvZGUpe2Nhc2UgOTA6YS56b29tKCJvdXQiKTticmVhaztjYXNlIDE3OmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSA2NTphLnpvb20oImluIik7YnJlYWs7Y2FzZSAxNjphLnpvb20oImluIik7YnJlYWs7Y2FzZSAzNzphLnBhbigibGVmdCIpO2JyZWFrO2Nhc2UgMzg6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSA0MDphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UgMzk6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSAyNzpaLmZ1bGxQYWdlP2EudG9nZ2xlRnVsbFBhZ2VWaWV3KCExKTphLnJlc2V0KCl9fWZ1bmN0aW9uIGRBKGIpe2lmKCFaLmtleXMpcmV0dXJuO3ZhciBiPVouVXRpbHMuZXZlbnQoYiksYz1iLmtleUNvZGU7Yz09OTB8fGM9PTE3fHxjPT02NXx8Yz09MTY/YS56b29tKCJzdG9wIik6Yz09Mzd8fGM9PTM5P2EucGFuKCJob3Jpem9udGFsU3RvcCIpOihjPT0zOHx8Yz09NDApJiZhLnBhbigidmVydGljYWxTdG9wIil9dmFyIGE9dGhpcyxiPSExLGM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjEiKSwxMCksZD1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejU5IikpLGU9ZC8yLGY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NjIiKSwxMCksZz1aLnRvb2xiYXJWaXNpYmxlPT0xP1oudG9vbGJhckg6MCxoLGksayxsLG0sbixvLHAscSxyLHMsdCx1LHYsdyx4LHk7Y2coKTt2YXIgej0xLEE9MCxCPTAsQyxELEUsRj1bXSxHPVtdLEg9W10sST1bXSxKPVtdLEs9W10sTD1bXSxNPVtdLE49W10sTz1bXSxQPVtdLFE9W10sUj0wLFM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NyIpLDEwKSxUPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejYiKSwxMCksVT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1IiksMTApLFY9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NCIpLDEwKSxXPXBhcnNlSW50KFouVXRpbHMuejE4NSgiejMiKSwxMCksWD1wYXJzZUludChaLlV0aWxzLnoxODUoIno0NSIpLDEwKSxZLCQsXyxiYSxiYixiYyxiZCxiZSxiZixiZyxiaCxiaSxiaixiayxibCxibTtZPVoudmlld2VyVywkPVoudmlld2VySCxfPWJhPTAsJC09ZyxaLnRvb2xiYXJQb3NpdGlvbj09MCYmKGJhKz1nKTt2YXIgYm49ITEsYm89bnVsbCxicD1udWxsLGJxPW51bGwsYnI9ITEsYnM9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6MjQiKSwxMCksYnQ9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoIno4MSIpKSpaLnpvb21TcGVlZDtaLm1vYmlsZURldmljZSYmKGJ0Lz0yKTt2YXIgYnU9TWF0aC5yb3VuZChwYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejQ3IikpKloucGFuU3BlZWQpLGJ2PTAsYnc9MCxieD0wLGJ5PTAsYno9MCxiQT1wYXJzZUludChaLlV0aWxzLnoxODUoIno3NyIpLDEwKSxiQixiQyxiRCxiRT1wYXJzZUZsb2F0KFouVXRpbHMuejE4NSgiejE5IikpKlouZmFkZUluU3BlZWQsYkYsYkc9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzgiKSwxMCksYkg9cGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NzkiKSwxMCksYkk9YkcvYkgsYkosYkssYkwsYk0sYk4sYk8sYlAsYlEsYlIsYlMsYlQsYlUsYlYsYlcsYlgsYlk7aWYoWi5VdGlscy5pc1N0clZhbChaLndhdGVybWFya1BhdGgpKXZhciBiWixiJCxiXz1bXSxjYT1bXTtjaChZLCQsXyxiYSk7dmFyIGNiPW5ldyBaLnoxMDEsY2M9Wi5VdGlscy56MTQwKFouaW1hZ2VQYXRoKyIvIisiSW1hZ2VQcm9wZXJ0aWVzLnhtbCIpO2NiLmxvYWRYTUwoY2MpLHRoaXMuejIwNj1mdW5jdGlvbihhLGIpe1ouaW1hZ2VXPWEsWi5pbWFnZUg9YixjaSgpLGNqKCksRT1jQyhCLFouaW5pdGlhbFopLEM9Y0MoQSxaLmluaXRpYWxaKSxEPUMsWi51c2VDYW52YXMmJnMuc2NhbGUoQyxDKSx1JiZjVygpLGNrKCksYyQoWi5pbml0aWFsWCxaLmluaXRpYWxZLFouaW5pdGlhbFopLGRpKCksY2YoITApLFouVmlld2VyLnoxNDgoKX0sdGhpcy5yZXoyMDY9ZnVuY3Rpb24oYSxiKXtjZighMSksY2QoKSxaLmltYWdlVz1hLFouaW1hZ2VIPWIsY2koKSxjaigpLEU9Y0MoQixaLmluaXRpYWxaKSxDPWNDKEEsWi5pbml0aWFsWiksRD1DLFoudXNlQ2FudmFzJiYocy5yZXN0b3JlKCkscy5zY2FsZShDLEMpKSxjaygpLGNoKFksJCxfLGJhKSxtJiZjdChtKSxxJiZjdChxKSx1JiZjdCh1KSxjJChaLmluaXRpYWxYLFouaW5pdGlhbFksWi5pbml0aWFsWiksY2YoITApLFoubmF2aWdhdG9yVmlzaWJsZT4wJiZaLk5hdmlnYXRvci5zZXRJbWFnZVBhdGgoWi5pbWFnZVBhdGgpfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gY2UoKX0sdGhpcy56MjAxPWZ1bmN0aW9uKCl7cmV0dXJuIGJifSx0aGlzLnoxNzk9ZnVuY3Rpb24oKXtyZXR1cm4gYmN9LHRoaXMuejE4Nj1mdW5jdGlvbigpe3JldHVybiB6fSx0aGlzLnoxOTU9ZnVuY3Rpb24oKXtyZXR1cm4gY30sdGhpcy56MTg3PWZ1bmN0aW9uKCl7cmV0dXJuIEF9LHRoaXMuejE4OT1mdW5jdGlvbigpe3JldHVybiBDfSx0aGlzLnoxODlBc1pvb209ZnVuY3Rpb24oKXt2YXIgYT1jQihBLEMpO3JldHVybiBhfSx0aGlzLnoxOTQ9ZnVuY3Rpb24oKXtyZXR1cm4gZH0sdGhpcy56MTkzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHRoaXMuejE5Nz1mdW5jdGlvbigpe3JldHVybiBmfSx0aGlzLnoxOTI9ZnVuY3Rpb24oKXtyZXR1cm4gSC5qb2luKCIsIil9LHRoaXMuejE4OD1mdW5jdGlvbigpe3JldHVybiBJLmpvaW4oIiwgIil9LHRoaXMuejE5MT1mdW5jdGlvbigpe3JldHVybiBMLmpvaW4oIiwgIil9LHRoaXMuejE5Nj1mdW5jdGlvbigpe3ZhciBhPU4uam9pbigiLCAiKT09IiI/IkN1cnJlbnQgdmlldyBsb2FkaW5nIGNvbXBsZXRlIjpOLmpvaW4oIiwgIik7cmV0dXJuIGF9LHRoaXMuc2V0U2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKGEsYixjLGQpe2NoKGEsYixjLGQpfSx0aGlzLnoyNzQ9ZnVuY3Rpb24oYSl7aWYoQyE9RHx8Wi5pbWFnZVohPWJ6fHxwYXJzZUZsb2F0KGsubGVmdCkhPWJmfHxwYXJzZUZsb2F0KGsudG9wKSE9Ymh8fGEpe2NuKCksYno9Y0IoQSxDKTt2YXIgYz0hMTtpZihDIT1EfHxaLmltYWdlWiE9Ynp8fCFifHxhKVouaW1hZ2VaPGJ6JiYhYSYmKGM9ITApLGNvKCksY3AoKSxjcihtLEIsRiwhMSwhMSk7Y3EoKSxjcihxLEEsTywhMCxjKSxjcyhOLGNMLDApLGN1KCksY3YoKX19LHRoaXMuc2V0Vmlldz1mdW5jdGlvbihhLGIsYyl7aWYoYT09dW5kZWZpbmVkfHxhPT1udWxsKWE9Wi5pbWFnZVcvMjtpZihiPT11bmRlZmluZWR8fGI9PW51bGwpYj1aLmltYWdlSC8yO2M9PXVuZGVmaW5lZHx8Yz09bnVsbD9jPVouZml0WjpjPjEmJihjPWMvMTAwKSxjJChhLGIsYyl9LHRoaXMuem9vbT1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJvdXQiOmJ4Pj0wJiYoYngtPWJ0KTticmVhaztjYXNlImluIjpieDw9MCYmKGJ4Kz1idCk7YnJlYWs7Y2FzZSJzdG9wIjpieD0wfVouem9vbWluZz1ieD09MD8ic3RvcCI6Yng+MD8iaW4iOiJvdXQiLGJ4IT0wP2JCfHwoKGJ4PDAmJlouaW1hZ2VaPloubWluWnx8Yng+MCYmWi5pbWFnZVo8Wi5tYXhaKSYmYS56MjczKCExKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnBhbj1mdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSJsZWZ0Ijpidjw9MCYmKGJ2Kz1idSk7YnJlYWs7Y2FzZSJ1cCI6Ync8PTAmJihidys9YnUpO2JyZWFrO2Nhc2UiZG93biI6Ync+PTAmJihidy09YnUpO2JyZWFrO2Nhc2UicmlnaHQiOmJ2Pj0wJiYoYnYtPWJ1KTticmVhaztjYXNlImhvcml6b250YWxTdG9wIjpidj0wO2JyZWFrO2Nhc2UidmVydGljYWxTdG9wIjpidz0wO2JyZWFrO2Nhc2Uic3RvcCI6YnY9MCxidz0wfVoucGFubmluZ1g9YnY9PTA/InN0b3AiOmJ2PjA/ImxlZnQiOiJyaWdodCIsWi5wYW5uaW5nWT1idz09MD8ic3RvcCI6Ync+MD8idXAiOiJkb3duIixiQz1aLmltYWdlWCpjQihBLDEpLGJEPVouaW1hZ2VZKmNCKEEsMSksYnYhPTB8fGJ3IT0wP2JCfHwoYS56MjczKCEwKSxaLnVzZUNhbnZhc3x8Y3QodSksYkI9d2luZG93LnNldFRpbWVvdXQoY18sYkEpKTooYS56MjkzQWxsU3RvcCgpLGEuejI3MyghMCkpfSx0aGlzLnoyOTNUb1ZpZXc9ZnVuY3Rpb24oYixjLGQpe2EuejI5M0FsbFN0b3AoKTt2YXIgZT1jRihiLGMpLGY9YmQtZS54LGc9YmUtZS55LGg9Y0MoQSxkKSxpPWNDKEIsZCksaj1wYXJzZUZsb2F0KGsubGVmdCkrZixsPXBhcnNlRmxvYXQoay50b3ApK2csbT1oLUMsbj1pLUU7Yko9ai9iSSxiSz1sL2JJLGJMPW0vYkksYk09bi9iSSxhLnoyNzMoITEpLGJPPTAsYk49d2luZG93LnNldFRpbWVvdXQoZGEsYkgpfSx0aGlzLnoyOTNBbGxTdG9wPWZ1bmN0aW9uKGIpe2RjKCksZGQoKSxifHxhLnoyNzQoKX0sdGhpcy56MjQ1PWZ1bmN0aW9uKGEpe3ZhciBiPWRlKGEpO2ImJihjWSgpLGN2KCkpfSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7YS56MjkzVG9WaWV3KFouaW5pdGlhbFgsWi5pbml0aWFsWSxaLmluaXRpYWxaKX0sdGhpcy50b2dnbGVGdWxsUGFnZVZpZXdFeHRlcm5hbD1mdW5jdGlvbigpe2JZPSEwLGEudG9nZ2xlRnVsbFBhZ2VWaWV3KCl9LHRoaXMudG9nZ2xlRnVsbFBhZ2VWaWV3PWZ1bmN0aW9uKGIpe2EuejI5M0FsbFN0b3AoKSxaLmZ1bGxQYWdlPWI/YjohWi5mdWxsUGFnZTt2YXIgYz1kb2N1bWVudC5ib2R5LGQ9Yy5zdHlsZSxlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxmPVouVmlld2VyRGlzcGxheS5zdHlsZSxnPW51bGwsaD1udWxsO2lmKFouZnVsbFBhZ2Upe2JRPWQud2lkdGgsYlI9ZC5oZWlnaHQsYlM9ZC5vdmVyZmxvdyxiVD1lLm92ZXJmbG93LGJVPWYuYmFja2dyb3VuZENvbG9yLGJWPWYucG9zaXRpb24sYlc9Zi56SW5kZXg7dmFyIGk7Wi5tb2JpbGVEZXZpY2U/KGk9Wi5VdGlscy56MjAxaW5kb3dTaXplKCksZC53aWR0aD1pLngsZC5oZWlnaHQ9aS55KTooZC53aWR0aD0iMTAwJSIsZC5oZWlnaHQ9IjEwMCUiKSxkLm92ZXJmbG93PSJoaWRkZW4iLGUub3ZlcmZsb3c9ImhpZGRlbiIsZi5iYWNrZ3JvdW5kQ29sb3I9Wi5VdGlscy56MTg1KCJ6MjIiKSxmLnBvc2l0aW9uPSJmaXhlZCIsZi56SW5kZXg9Ijk5OTk5OTk5IixpPVouVXRpbHMuejIwMWluZG93U2l6ZSgpLGc9aS54LGg9aS55fWVsc2V7ZC53aWR0aD1iUSxkLmhlaWdodD1iUixkLm92ZXJmbG93PWJTLGUub3ZlcmZsb3c9YlQsZi5iYWNrZ3JvdW5kQ29sb3I9YlUsZi5wb3NpdGlvbj0icmVsYXRpdmUiLGYuekluZGV4PWJXO3ZhciBqPVouVXRpbHMuejE3NihaLnBhZ2VDb250YWluZXIpO2c9cGFyc2VGbG9hdChqLndpZHRoKSxoPXBhcnNlRmxvYXQoai5oZWlnaHQpLGlzTmFOKGcpJiYoZz1aLlZpZXdlckRpc3BsYXkuY2xpZW50V2lkdGgpLGlzTmFOKGgpJiYoaD1aLlZpZXdlckRpc3BsYXkuY2xpZW50SGVpZ2h0KSxiWT0hMX1aLnZpZXdlclc9ZyxaLnZpZXdlckg9aCxjaChnLGgpLGRmKGJZKTtpZihaLlRvb2xiYXJEaXNwbGF5JiZaLlRvb2xiYXIuejE4MCgpKXtaLnRvb2xiYXJDdXJyZW50Vz1aLnRvb2xiYXJXPT0tMT9nOloudG9vbGJhclc7dmFyIGw9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILVoudG9vbGJhckg6MDtaLlRvb2xiYXIuc2V0U2l6ZUFuZFBvc2l0aW9uKFoudG9vbGJhckN1cnJlbnRXLG51bGwsbnVsbCxsKX1aLk5hdmlnYXRvckRpc3BsYXkmJlouTmF2aWdhdG9yLnoxODAoKSYmWi5OYXZpZ2F0b3Iuc2V0U2l6ZUFuZFBvc2l0aW9uKFoubmF2aWdhdG9yVyxaLm5hdmlnYXRvckgsWi5uYXZpZ2F0b3JMLTEsWi5uYXZpZ2F0b3JULTEpLGNqKCksWi5pbWFnZVo9Y1YoWi5pbWFnZVopO2lmKFouY29uc3RyYWluUGFuKXt2YXIgbT1wYXJzZUZsb2F0KGsubGVmdCksbj1wYXJzZUZsb2F0KGsudG9wKSxvPWNVKG0sbik7ay5sZWZ0PW8ueCsicHgiLGsudG9wPW8ueSsicHgifWEuejI3NCghMCl9LHRoaXMuejI3MT1mdW5jdGlvbigpe3ZhciBhPVouVmlld2VyRGlzcGxheS5maXJzdENoaWxkLmNoaWxkTm9kZXNbMF0uc3R5bGU7YS5kaXNwbGF5PWEuZGlzcGxheT09Im5vbmUiPyJpbmxpbmUtYmxvY2siOiJub25lIn0sdGhpcy56MjcyPWZ1bmN0aW9uKCl7dmFyIGE9Wi5WaWV3ZXJEaXNwbGF5LmZpcnN0Q2hpbGQuY2hpbGROb2Rlc1sxXS5zdHlsZTthLmRpc3BsYXk9YS5kaXNwbGF5PT0ibm9uZSI/ImlubGluZS1ibG9jayI6Im5vbmUifSx0aGlzLnoyNzM9ZnVuY3Rpb24oYSl7aWYodil7dmFyIGI9YT9hOnYuZGlzcGxheSE9ImlubGluZS1ibG9jayI7di5kaXNwbGF5PWI/ImlubGluZS1ibG9jayI6Im5vbmUifX0sdGhpcy50b2dnbGVDb25zdHJhaW5QYW49ZnVuY3Rpb24oKXtaLmNvbnN0cmFpblBhbj0hWi5jb25zdHJhaW5QYW47aWYoWi5jb25zdHJhaW5QYW4pe3ZhciBiPXBhcnNlRmxvYXQoci5sZWZ0KSxjPXBhcnNlRmxvYXQoci50b3ApLGQ9Y1UoYixjKTtrLmxlZnQ9ZC54KyJweCIsay50b3A9ZC55KyJweCIsYS56Mjc0KCl9fSx0aGlzLnoxNzM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9cGFyc2VGbG9hdChaLlV0aWxzLnoxODUoInoxMFRJRVJTS0lQVEhSRVNIT0xEIikpLGY9Y0QoYi54LGIueSksZz1jRShmLngsZi55KSxoPWNCKGMsZCk7cmV0dXJuIGEuYWx0S2V5PyhkPjErZT9oPWNCKGMsMSk6Yz4wJiYoaD1jQihjLTEsMSkpLGgtWi5maXRaPGUmJihoPVouZml0WikpOmQ8MS1lP2g9Y0IoYywxKTpjPHotMSYmKGg9Y0IoYysxLDEpKSxuZXcgWi5VdGlscy5Qb2ludDNEKGcueCxnLnksaCl9LHRoaXMuejI2Nz1mdW5jdGlvbihhLGIpe3ZhciBjPS0oYS1aLmltYWdlWCksZD0tKGItWi5pbWFnZVkpLGU9YypaLmltYWdlWixmPWQqWi5pbWFnZVosZz1lK2JmLGg9ZitiaCxpPWNVKGcsaCk7ay5sZWZ0PWkueCsicHgiLGsudG9wPWkueSsicHgifSx0aGlzLnoxNDE9ZnVuY3Rpb24oYSl7aWYoIWEpdmFyIGE9bmV3IFouVXRpbHMuUG9pbnQocGFyc2VGbG9hdChrLmxlZnQpLHBhcnNlRmxvYXQoay50b3ApKTt2YXIgYj1hLngtYmYsYz1hLnktYmgsZD1iL1ouaW1hZ2VaLGU9Yy9aLmltYWdlWixmPVouaW1hZ2VYLWQsZz1aLmltYWdlWS1lO3JldHVybiBuZXcgWi5VdGlscy5Qb2ludChmLGcpfX0sWi56MTI0PWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHUoKXt3aW5kb3cuY2xlYXJJbnRlcnZhbChxKSxxPW51bGw7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2dyZXNzVGV4dEJveCIpLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7YSYmKGEubm9kZVZhbHVlPSIiKX1mdW5jdGlvbiB2KCl7cmV0dXJuIGN9ZnVuY3Rpb24gdyhhKXtjPWF9ZnVuY3Rpb24geChhLGIsYyxkKXthfHwoYT1aLnRvb2xiYXJWaXNpYmxlPjA/Wi50b29sYmFyQ3VycmVudFc6MCksYnx8KGI9Wi50b29sYmFyVmlzaWJsZT4wP2Y6MCksY3x8KGM9MCksZHx8KGQ9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MCk7dmFyIGU9Wi5Ub29sYmFyRGlzcGxheS5zdHlsZTtlLndpZHRoPWErInB4IixlLmhlaWdodD1iKyJweCIsZS5sZWZ0PWMrInB4IixlLnRvcD1kKyJweCIseShhLGIpfWZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1hLGQ9YixlPXRvb2xiYXJTa2luU2l6ZXNbMl0sZj10b29sYmFyU2tpblNpemVzWzNdLGc9dG9vbGJhclNraW5TaXplc1s0XSxoPXRvb2xiYXJTa2luU2l6ZXNbNV0saT10b29sYmFyU2tpblNpemVzWzZdLGo9dG9vbGJhclNraW5TaXplc1s3XSxrPXRvb2xiYXJTa2luU2l6ZXNbOF0sbD10b29sYmFyU2tpblNpemVzWzldLG09dG9vbGJhclNraW5TaXplc1sxMF0sbj10b29sYmFyU2tpblNpemVzWzExXSxvPXRvb2xiYXJTa2luU2l6ZXNbMTJdLHA9dG9vbGJhclNraW5TaXplc1sxM10scT10b29sYmFyU2tpblNpemVzWzE0XSx1PXRvb2xiYXJTa2luU2l6ZXNbMTVdLHY9MCx3PShkLWYpLzIrMSx4PShkLWgpLzIseT0oZC1qKS8yLHo9eSoxLjMsQT15KzQsQj15KzIsQz1aLmxvZ29WaXNpYmxlPT0xPzA6ay8yLEQ9Wi5sb2dvVmlzaWJsZT09MT8wOmsvMixFPWstKGktZyksRj1aLmZ1bGxQYWdlVmlzaWJsZT84OjcsRz0yMCxIPUYqaysyKkU7Wi5zbGlkZXJWaXNpYmxlJiYoSCs9cCkscj1zPXQ9ITE7dmFyIEk9Wi5sb2dvVmlzaWJsZT09MT9lKzI6MCxKPVoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTE/azowLEs9SStKLEw9SytHK0grRytxO0w+YyYmKHI9ITAsTC1wPmMmJihzPSEwLEwtcC1xPmMmJih0PSEwLEs9MCkscT0wKSxILT1wKTt2YXIgTT1LKyhjLXEtSy1IKS8yLE49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJhY2tncm91bmQiKTtOLnN0eWxlLndpZHRoPWMrInB4IixOLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9Yys0MDArInB4IixOLnN0eWxlLmhlaWdodD1kKyJweCIsTi5maXJzdENoaWxkLnN0eWxlLmhlaWdodD1kKyJweCI7dmFyIE89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkNvbnRhaW5lciIpO08uc3R5bGUud2lkdGg9SCtHKjIrInB4IixPLnN0eWxlLmhlaWdodD1kKyJweCIsTy5zdHlsZS5sZWZ0PU0tRysicHgiO3ZhciBQPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25CYWNrZ3JvdW5kIik7Wi5VdGlscy56MjAzKFAscGFyc2VGbG9hdChPLnN0eWxlLndpZHRoKSxwYXJzZUZsb2F0KE8uc3R5bGUuaGVpZ2h0KSksUC5zdHlsZS5sZWZ0PSIwcHgiO3ZhciBRPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0b29sYmFyTG9nbyIpO2lmKFEpe3ZhciBSPVEuc3R5bGU7aWYoUilpZighdCl7Ui5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejIwMyhRLGUsZiksUi5sZWZ0PXYrInB4IixSLnRvcD13KyJweCIsdis9ZSsyO3ZhciBTPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2dvRGl2aWRlciIpO2lmKFMpe1ouVXRpbHMuejIwMyhTLGcsaCk7dmFyIFQ9Uy5zdHlsZTtULmxlZnQ9disicHgiLFQudG9wPXgrInB4In19ZWxzZSBSLmRpc3BsYXk9Im5vbmUifWlmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTEpe3ZhciBVPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25NaW5pbWl6ZSIpLFY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbkV4cGFuZCIpO2lmKFUmJlYpe3ZhciBXPVUuc3R5bGUsWD1WLnN0eWxlO1cmJlgmJih0PyhXLmRpc3BsYXk9Im5vbmUiLFguZGlzcGxheT0ibm9uZSIpOihXLmRpc3BsYXk9ImlubGluZS1ibG9jayIsWC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLFouVXRpbHMuejEzOChVLGksaiksWi5VdGlscy56MTM4KFYsaSxqKSxXLmxlZnQ9ditDKyJweCIsVy50b3A9eisicHgiLFgubGVmdD12K0QrInB4IixYLnRvcD16KyJweCIpKX19dj1HO3ZhciBZPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25ab29tT3V0Iik7Wi5VdGlscy56MTM4KFksaSxqKTt2YXIgJD1ZLnN0eWxlOyQubGVmdD12KyJweCIsJC50b3A9eSsicHgiLHYrPWs7dmFyIF89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRyYWNrU2xpZGVyIiksYmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblNsaWRlciIpO2lmKF8mJmJhKXt2YXIgYmI9Xy5zdHlsZSxiYz1iYS5zdHlsZTtiYiYmYmMmJihyPyhiYi5kaXNwbGF5PSJub25lIixiYy5kaXNwbGF5PSJub25lIik6KGJiLmRpc3BsYXk9ImlubGluZS1ibG9jayIsYmMuZGlzcGxheT0iaW5saW5lLWJsb2NrIixaLlV0aWxzLnoyMDMoXyxuLG8pLGJiLmxlZnQ9di0yKyJweCIsYmIudG9wPUErInB4IixaLlV0aWxzLnoxMzgoYmEsbCxtKSxiYy5sZWZ0PXBhcnNlRmxvYXQoYmIubGVmdCkrInB4IixiYy50b3A9QisicHgiLHYrPXApKX12YXIgYmQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblpvb21JbiIpO1ouVXRpbHMuejEzOChiZCxpLGopO3ZhciBiZT1iZC5zdHlsZTtiZS5sZWZ0PXYrInB4IixiZS50b3A9eSsicHgiLHYrPWsrMTt2YXIgYmY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBhbkRpdmlkZXIiKTtaLlV0aWxzLnoyMDMoYmYsZyxoKTt2YXIgYmc9YmYuc3R5bGU7YmcubGVmdD12KyJweCIsYmcudG9wPXgrInB4Iix2Kz1FO3ZhciBiaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uUGFuTGVmdCIpO1ouVXRpbHMuejEzOChiaCxpLGopO3ZhciBiaT1iaC5zdHlsZTtiaS5sZWZ0PXYrInB4IixiaS50b3A9eSsicHgiLHYrPWs7dmFyIGJqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5VcCIpO1ouVXRpbHMuejEzOChiaixpLGopO3ZhciBiaz1iai5zdHlsZTtiay5sZWZ0PXYrInB4Iixiay50b3A9eSsicHgiLHYrPWs7dmFyIGJsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25QYW5Eb3duIik7Wi5VdGlscy56MTM4KGJsLGksaik7dmFyIGJtPWJsLnN0eWxlO2JtLmxlZnQ9disicHgiLGJtLnRvcD15KyJweCIsdis9azt2YXIgYm49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblBhblJpZ2h0Iik7Wi5VdGlscy56MTM4KGJuLGksaik7dmFyIGJvPWJuLnN0eWxlO2JvLmxlZnQ9disicHgiLGJvLnRvcD15KyJweCIsdis9azt2YXIgYnA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvblJlc2V0Iik7Wi5VdGlscy56MTM4KGJwLGksaik7dmFyIGJxPWJwLnN0eWxlO2JxLmxlZnQ9disicHgiLGJxLnRvcD15KyJweCIsdis9aysxO3ZhciBicj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZnVsbFBhZ2VEaXZpZGVyIik7aWYoYnIpe1ouVXRpbHMuejIwMyhicixnLGgpO3ZhciBicz1ici5zdHlsZTticy5sZWZ0PXYrInB4Iixicy50b3A9eCsicHgiLHYrPUU7dmFyIGJ0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25GdWxsUGFnZSIpO1ouVXRpbHMuejEzOChidCxpLGopO3ZhciBidT1idC5zdHlsZTtidS5sZWZ0PXYrInB4IixidS50b3A9eSsicHgifXZhciBidj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94Iik7aWYoYnYpe3ZhciBidz1idi5zdHlsZTtidyYmKHM/YncuZGlzcGxheT0ibm9uZSI6KGJ3LmRpc3BsYXk9ImlubGluZS1ibG9jayIsYncud2lkdGg9cSsicHgiLGJ3LmhlaWdodD11KyJweCIsYncubGVmdD1jLXBhcnNlRmxvYXQoTy5zdHlsZS5sZWZ0KS1wYXJzZUZsb2F0KGJ3LndpZHRoKSsicHgiLGJ3LnRvcD0oZC1wYXJzZUZsb2F0KGJ3LmhlaWdodCkpLzIrInB4IikpfX1mdW5jdGlvbiB6KGEpe1oudG9vbGJhclZpc2libGU8NCYmIVoubW9iaWxlRGV2aWNlP0EoYSk6QighYSl9ZnVuY3Rpb24gQShhKXtnJiYoYT9nLmRpc3BsYXk9ImlubGluZS1ibG9jayI6Zy5kaXNwbGF5PSJub25lIil9ZnVuY3Rpb24gQihhKXtpZihnKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQ29udGFpbmVyIiksYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYmFja2dyb3VuZCIpLGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbk1pbmltaXplIiksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhwYW5kIiksZj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9nb0RpdmlkZXIiKSxoPTA7dHx8KGg9cGFyc2VGbG9hdChlLnN0eWxlLmxlZnQpK3BhcnNlRmxvYXQoZS5zdHlsZS53aWR0aCkrNCk7dmFyIGk9Wi50b29sYmFyQ3VycmVudFc7YT8oYi5zdHlsZS5kaXNwbGF5PSJub25lIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSxnLndpZHRoPWgrInB4IixjLnN0eWxlLndpZHRoPWgrInB4Iik6KGIuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIix0fHwoZiYmKGYuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIiksZC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siLGUuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGcud2lkdGg9aSsicHgiLGMuc3R5bGUud2lkdGg9aSsicHgiKX19ZnVuY3Rpb24gQyhhKXtpZihaLnNsaWRlclZpc2libGUpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmspe3ZhciBiPVoubWF4Wi1aLm1pblosYz0oYS1aLm1pblopL2I7dHJhY2tMPXBhcnNlRmxvYXQoaS5sZWZ0KSx0cmFja1I9cGFyc2VGbG9hdChpLmxlZnQpK3BhcnNlRmxvYXQoaS53aWR0aCktcGFyc2VGbG9hdChrLndpZHRoKTt2YXIgZD10cmFja1ItdHJhY2tMLGU9YypkK3RyYWNrTDtrLmxlZnQ9ZSsicHgifX19ZnVuY3Rpb24gRChiKXtofHwoaD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidHJhY2tTbGlkZXIiKSksaXx8KGk9aC5zdHlsZSk7aWYoaCYmaSl7dmFyIGMsZD1aLlV0aWxzLnoxNzQoaCk7Wi5tb2JpbGVEZXZpY2U/Yz1aLlV0aWxzLnoxODEoYikueC1kLng6Yz1iLmNsaWVudFgtZC54O3ZhciBlPUgoYywwLHBhcnNlRmxvYXQoaS53aWR0aCkpO2U8Wi5taW5aKy4xJiYoZT1aLm1pblopLGU+Wi5tYXhaLS4xJiYoZT1aLm1heFopLGEuejI0NShlKSxhLnoyNzQoKX19ZnVuY3Rpb24gRShhKXtuPSEwLGp8fChqPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25TbGlkZXIiKSk7aWYoail7dmFyIGI9Wi5VdGlscy56MTgxKGEpO2oubW91c2VYUHJpb3I9Yi54LGoubW91c2VZUHJpb3I9Yi55fX1mdW5jdGlvbiBGKGIpe2h8fChoPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmFja1NsaWRlciIpKSxpfHwoaT1oLnN0eWxlKSxqfHwoaj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uU2xpZGVyIikpLGt8fChrPWouc3R5bGUpO2lmKGkmJmomJmspe3RyYWNrTD1wYXJzZUZsb2F0KGkubGVmdCksdHJhY2tSPXBhcnNlRmxvYXQoaS5sZWZ0KStwYXJzZUZsb2F0KGkud2lkdGgpLXBhcnNlRmxvYXQoay53aWR0aCk7dmFyIGM9cGFyc2VGbG9hdChrLmxlZnQpKyhwLngtai5tb3VzZVhQcmlvcik7Yzx0cmFja0w/Yz10cmFja0w6Yz50cmFja1I/Yz10cmFja1I6ai5tb3VzZVhQcmlvcj1wLngsay5sZWZ0PWMrInB4Ijt2YXIgZD1IKGMsdHJhY2tMLHRyYWNrUik7YS56MjQ1KGQpfX1mdW5jdGlvbiBHKCl7bj0hMSxhLnoyNzQoKX1mdW5jdGlvbiBIKGEsYixjKXt2YXIgZD1jLWIsZT0oYS1iKS9kLGY9Wi5tYXhaLVoubWluWixnPVoubWluWitmKmU7cmV0dXJuIGd9ZnVuY3Rpb24gSShhKXt2YXIgYT1aLlV0aWxzLmV2ZW50KGEpLGI9Wi5VdGlscy5yZWxhdGVkVGFyZ2V0KFouVXRpbHMuZXZlbnQoYSkpO2lmKCFuJiZiKXt2YXIgYz1iLnBhcmVudE5vZGU7SyhjKX19ZnVuY3Rpb24gSihhKXtaLm1vYmlsZURldmljZSYmYS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBhPVouVXRpbHMuZXZlbnQoYSksYj1aLlV0aWxzLnRhcmdldChhKSxjPVouVXRpbHMucmVsYXRlZFRhcmdldChhKTtpZihiKXt2YXIgZD1iLnBhcmVudE5vZGU7ZCYmKHRhcmdldFBhcmVudElEPWQuaWQpfWlmKGMpe3ZhciBlPWMucGFyZW50Tm9kZTtlJiYocmVsYXRlZFRhcmdldFBhcmVudElEPWUuaWQpfWlmKCFufHxhLnR5cGU9PSJtb3VzZXVwInx8YS50eXBlPT0idG91Y2hlbmQifHxhLnR5cGU9PSJ0b3VjaGNhbmNlbCIpTigpLGImJiFaLlV0aWxzLmlzUmlnaHRNb3VzZUJ1dHRvbihhKSYmKHRhcmdldFBhcmVudElEJiZ0YXJnZXRQYXJlbnRJRCE9InRyYWNrU2xpZGVyIiYmYS50eXBlIT0ibW91c2Vtb3ZlIiYmKE8oYSksUChhKSksUShhKSl9ZnVuY3Rpb24gSyhiKXthJiZhLnoyOTNBbGxTdG9wKCksYi5pZCYmYi5pZC5pbmRleE9mKCJidXR0b24iKSE9LTE/KEwoYiksTShiKSk6Yi5pZCYmYi5pZC5pbmRleE9mKCJiYWNrZ3JvdW5kIikhPS0xJiZOKCl9ZnVuY3Rpb24gTChhKXtaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSwibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGEsIm1vdXNlb3V0IixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoYSwibW91c2VvdmVyIixKKX1mdW5jdGlvbiBNKGEpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ1VwSUQpLGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5faW1nT3ZlcklEKSxkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ0Rvd25JRCk7YiYmKGIuc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSIpLGMmJihjLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpLGQmJihkLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpfWZ1bmN0aW9uIE4oKXt2YXIgYT1aLlRvb2xiYXJEaXNwbGF5LmNoaWxkTm9kZXMsYj1udWxsO2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyl7Yj1hW2NdO2lmKGIuaWQmJmIuaWQuaW5kZXhPZigiYnV0dG9uIikhPS0xKWlmKGIuaWQhPSJidXR0b25Db250YWluZXIiKUwoYiksTShiKTtlbHNle3ZhciBlPWIuY2hpbGROb2RlcyxmPW51bGw7Zm9yKHZhciBnPTAsaD1lLmxlbmd0aDtnPGg7ZysrKWY9ZVtnXSxmLmlkJiZmLmlkLmluZGV4T2YoImJ1dHRvbiIpIT0tMSYmKEwoZiksTShmKSl9fX1mdW5jdGlvbiBPKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPWIucGFyZW50Tm9kZTtjJiYoWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaHN0YXJ0IixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywidG91Y2hlbmQiLEopLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLCJ0b3VjaGNhbmNlbCIsSikpOihaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2VvdmVyIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2Vkb3duIixKKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYywibW91c2V1cCIsSiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGMsIm1vdXNlb3V0IixKKSkpfX1mdW5jdGlvbiBQKGEpe3ZhciBiPVouVXRpbHMudGFyZ2V0KGEpO2lmKGIpe3ZhciBjPVouVXRpbHMudGFyZ2V0KGEpLnBhcmVudE5vZGU7aWYoYylpZighYy5faW1nVXBJRClLKGMpO2Vsc2V7dmFyIGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nVXBJRCksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChjLl9pbWdPdmVySUQpLGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYy5faW1nRG93bklEKTtpZihkJiZlJiZmKXt2YXIgZz1kLnN0eWxlLGg9ZS5zdHlsZSxpPWYuc3R5bGU7Zy52aXNpYmlsaXR5PSJoaWRkZW4iLGgudmlzaWJpbGl0eT0iaGlkZGVuIixpLnZpc2liaWxpdHk9ImhpZGRlbiI7c3dpdGNoKGEudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOmgudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZWRvd24iOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZW1vdmUiOmkudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJtb3VzZXVwIjpoLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UibW91c2VvdXQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaHN0YXJ0IjppLnZpc2liaWxpdHk9InZpc2libGUiO2JyZWFrO2Nhc2UidG91Y2hlbmQiOmcudmlzaWJpbGl0eT0idmlzaWJsZSI7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Zy52aXNpYmlsaXR5PSJ2aXNpYmxlIn19fX19ZnVuY3Rpb24gUShjKXt2YXIgZD1aLlV0aWxzLnRhcmdldChjKS5wYXJlbnROb2RlO2lmKGQpe3ZhciBlPWQuaWQ7c3dpdGNoKGMudHlwZSl7Y2FzZSJtb3VzZW92ZXIiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZWRvd24iLEopO2JyZWFrO2Nhc2UibW91c2Vkb3duIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwibW91c2V1cCIsSik7aWYoYSlzd2l0Y2goZSl7Y2FzZSJidXR0b25NaW5pbWl6ZSI6Yi56MjE1KCEwKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCExKTticmVhaztjYXNlImJ1dHRvbkV4cGFuZCI6Yi56MjE1KCExKSxaLk5hdmlnYXRvci5zZXRWaXNpYmlsaXR5KCEwKTticmVhaztjYXNlImJ1dHRvblpvb21PdXQiOmEuem9vbSgib3V0Iik7YnJlYWs7Y2FzZSJidXR0b25TbGlkZXIiOkUoYyksUihjKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsUiksb3x8KG89d2luZG93LnNldEludGVydmFsKEYsbSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSik7YnJlYWs7Y2FzZSJ0cmFja1NsaWRlciI6RChjKTticmVhaztjYXNlImJ1dHRvblpvb21JbiI6YS56b29tKCJpbiIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuTGVmdCI6YS5wYW4oImxlZnQiKTticmVhaztjYXNlImJ1dHRvblBhblVwIjphLnBhbigidXAiKTticmVhaztjYXNlImJ1dHRvblBhbkRvd24iOmEucGFuKCJkb3duIik7YnJlYWs7Y2FzZSJidXR0b25QYW5SaWdodCI6YS5wYW4oInJpZ2h0Iik7YnJlYWs7Y2FzZSJidXR0b25SZXNldCI6YS5yZXNldCgpfWJyZWFrO2Nhc2UibW91c2V1cCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsIm1vdXNlZG93biIsSiksYSYmKGU9PSJidXR0b25TbGlkZXIifHxuPyhvJiYod2luZG93LmNsZWFySW50ZXJ2YWwobyksbz1udWxsKSxHKCksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLFIpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsSiksTigpKTplPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpO2JyZWFrO2Nhc2UibW91c2VvdXQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJtb3VzZW92ZXIiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iP2Euem9vbSgic3RvcCIpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTooZT09ImJ1dHRvblBhblVwInx8ZT09ImJ1dHRvblBhbkRvd24iKSYmYS5wYW4oInZlcnRpY2FsU3RvcCIpKTticmVhaztjYXNlInRvdWNoc3RhcnQiOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkLCJ0b3VjaGVuZCIsSiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoY2FuY2VsIixKKTtpZihhKXN3aXRjaChlKXtjYXNlImJ1dHRvbk1pbmltaXplIjpiLnoyMTUoITApLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITEpO2JyZWFrO2Nhc2UiYnV0dG9uRXhwYW5kIjpiLnoyMTUoITEpLFouTmF2aWdhdG9yLnNldFZpc2liaWxpdHkoITApO2JyZWFrO2Nhc2UiYnV0dG9uWm9vbU91dCI6YS56b29tKCJvdXQiKTticmVhaztjYXNlImJ1dHRvblNsaWRlciI6RShjKSxTKGMpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSxvfHwobz13aW5kb3cuc2V0SW50ZXJ2YWwoRixtKSksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoZW5kIixKKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hjYW5jZWwiLEopO2JyZWFrO2Nhc2UidHJhY2tTbGlkZXIiOkQoYyk7YnJlYWs7Y2FzZSJidXR0b25ab29tSW4iOmEuem9vbSgiaW4iKTticmVhaztjYXNlImJ1dHRvblBhbkxlZnQiOmEucGFuKCJsZWZ0Iik7YnJlYWs7Y2FzZSJidXR0b25QYW5VcCI6YS5wYW4oInVwIik7YnJlYWs7Y2FzZSJidXR0b25QYW5Eb3duIjphLnBhbigiZG93biIpO2JyZWFrO2Nhc2UiYnV0dG9uUGFuUmlnaHQiOmEucGFuKCJyaWdodCIpO2JyZWFrO2Nhc2UiYnV0dG9uUmVzZXQiOmEucmVzZXQoKX1icmVhaztjYXNlInRvdWNoZW5kIjpaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoZCwidG91Y2hzdGFydCIsSiksYSYmKGU9PSJidXR0b25ab29tT3V0Inx8ZT09ImJ1dHRvblpvb21JbiI/KGEuem9vbSgic3RvcCIpLFouZGVidWcmJmU9PSJidXR0b25ab29tT3V0IiYmYy5hbHRLZXkmJlouVXRpbHMuejI1MygpKTplPT0iYnV0dG9uU2xpZGVyIj8obyYmKHdpbmRvdy5jbGVhckludGVydmFsKG8pLG89bnVsbCksRygpLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwidG91Y2htb3ZlIixTKSk6ZT09ImJ1dHRvblBhbkxlZnQifHxlPT0iYnV0dG9uUGFuUmlnaHQiP2EucGFuKCJob3Jpem9udGFsU3RvcCIpOmU9PSJidXR0b25QYW5VcCJ8fGU9PSJidXR0b25QYW5Eb3duIj9hLnBhbigidmVydGljYWxTdG9wIik6ZT09ImJ1dHRvbkZ1bGxQYWdlIiYmYS50b2dnbGVGdWxsUGFnZVZpZXcoKSk7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsInRvdWNoc3RhcnQiLEopLGEmJihlPT0iYnV0dG9uWm9vbU91dCJ8fGU9PSJidXR0b25ab29tSW4iPyhhLnpvb20oInN0b3AiKSxaLmRlYnVnJiZlPT0iYnV0dG9uWm9vbU91dCImJmMuYWx0S2V5JiZaLlV0aWxzLnoyNTMoKSk6ZT09ImJ1dHRvblNsaWRlciI/KG8mJih3aW5kb3cuY2xlYXJJbnRlcnZhbChvKSxvPW51bGwpLEcoKSxaLlV0aWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsInRvdWNobW92ZSIsUykpOmU9PSJidXR0b25QYW5MZWZ0Inx8ZT09ImJ1dHRvblBhblJpZ2h0Ij9hLnBhbigiaG9yaXpvbnRhbFN0b3AiKTplPT0iYnV0dG9uUGFuVXAifHxlPT0iYnV0dG9uUGFuRG93biI/YS5wYW4oInZlcnRpY2FsU3RvcCIpOmU9PSJidXR0b25GdWxsUGFnZSImJmEudG9nZ2xlRnVsbFBhZ2VWaWV3KCkpfX19ZnVuY3Rpb24gUihhKXtwPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpfWZ1bmN0aW9uIFMoYSl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0O3A9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKX19dmFyIGI9dGhpcyxjPSExLGQ9bmV3IFouejEwMTtaLnNraW5QYXRoPVouVXRpbHMuejI0MyhaLnNraW5QYXRoKTt2YXIgZT1aLnNraW5QYXRoKyIvIjtkLmxvYWRYTUwoWi5za2luUGF0aCsiLyIrWi5VdGlscy56MTg1KCJ6NTUiKSk7dmFyIGYsZyxoLGksaixrLGw9W10sbT1wYXJzZUludChaLlV0aWxzLnoxODUoIno1NyIpLDEwKSxuPSExLG89bnVsbCxwPW51bGwscT1udWxsLHIscyx0O3RoaXMuejIwNT1mdW5jdGlvbihhLGIpe1ouVG9vbGJhckRpc3BsYXk9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUb29sYmFyRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIiwiMXB4IiwiMXB4IiwiMHB4IiwiMXB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiLCJkZWZhdWx0IiksZz1aLlRvb2xiYXJEaXNwbGF5LnN0eWxlO3ZhciBjPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChjLmVsbXQpLHRvb2xiYXJTa2luU2l6ZXM9YTtpZihaLmxvZ29WaXNpYmxlKXt2YXIgZDtpZighWi5VdGlscy5pc1N0clZhbChaLmxvZ29DdXN0b21QYXRoKSlkPW5ldyBaLlV0aWxzLkdyYXBoaWMoInRvb2xiYXJMb2dvIixlLGJbMV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO2Vsc2V7dmFyIGg9Wi5VdGlscy56MTQwKFoubG9nb0N1c3RvbVBhdGgpO2Q9bmV3IFouVXRpbHMuR3JhcGhpYygidG9vbGJhckxvZ28iLGgsbnVsbCwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iil9Wi5Ub29sYmFyRGlzcGxheS5hcHBlbmRDaGlsZChkLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGU9PTB8fFoudG9vbGJhclZpc2libGU9PTEpe3ZhciBpPW5ldyBaLlV0aWxzLkdyYXBoaWMoImxvZ29EaXZpZGVyIixlLGJbMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQoaS5lbG10KX19dmFyIGo9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJidXR0b25Db250YWluZXIiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsInZpc2libGUiLCIxcHgiLCIxcHgiLCIwcHgiLCIwcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIsImRlZmF1bHQiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKGopLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihqLCJ0b3VjaHN0YXJ0IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGosIm1vdXNlb3ZlciIsSSkpO3ZhciBrPW5ldyBaLlV0aWxzLkdyYXBoaWMoImJ1dHRvbkJhY2tncm91bmQiLGUsYlswXSwiMXB4IiwiMXB4IiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChrLmVsbXQpO2lmKFoudG9vbGJhclZpc2libGUhPTAmJloudG9vbGJhclZpc2libGUhPTF8fFoubW9iaWxlRGV2aWNlKXt2YXIgbD1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbk1pbmltaXplIixudWxsLGUsYlszXSxiWzRdLGJbNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwNyIpO1ouVG9vbGJhckRpc3BsYXkuYXBwZW5kQ2hpbGQobC5lbG10KTt2YXIgbT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4cGFuZCIsbnVsbCxlLGJbNl0sYls3XSxiWzhdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDUiKTtaLlRvb2xiYXJEaXNwbGF5LmFwcGVuZENoaWxkKG0uZWxtdCl9dmFyIG49bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25ab29tT3V0IixudWxsLGUsYls5XSxiWzEwXSxiWzExXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4IiwibW91c2VvdmVyIixKLCJ6MTIwIik7ai5hcHBlbmRDaGlsZChuLmVsbXQpO2lmKFouc2xpZGVyVmlzaWJsZSl7dmFyIG89bmV3IFouVXRpbHMuR3JhcGhpYygidHJhY2tTbGlkZXIiLGUsYlsxMl0sIjFweCIsIjFweCIsIjBweCIsIjBweCIpO2ouYXBwZW5kQ2hpbGQoby5lbG10KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoby5lbG10LCJtb3VzZWRvd24iLEopLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLmVsbXQsInRvdWNoc3RhcnQiLEopO3ZhciBwPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uU2xpZGVyIixudWxsLGUsYlsxNF0sYlsxNV0sYlsxNl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExNCIpO2ouYXBwZW5kQ2hpbGQocC5lbG10KX12YXIgcT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblpvb21JbiIsbnVsbCxlLGJbMTddLGJbMThdLGJbMTldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTkiKTtqLmFwcGVuZENoaWxkKHEuZWxtdCk7dmFyIHI9bmV3IFouVXRpbHMuR3JhcGhpYygicGFuRGl2aWRlciIsZSxiWzIwXSwiMXB4IiwiMXB4IiwiMXB4IiwiMXB4Iik7ai5hcHBlbmRDaGlsZChyLmVsbXQpO3ZhciBzPW5ldyBaLlV0aWxzLkJ1dHRvbigiYnV0dG9uUGFuTGVmdCIsbnVsbCxlLGJbMjFdLGJbMjJdLGJbMjNdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMDkiKTtqLmFwcGVuZENoaWxkKHMuZWxtdCk7dmFyIHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5VcCIsbnVsbCxlLGJbMjRdLGJbMjVdLGJbMjZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTEiKTtqLmFwcGVuZENoaWxkKHQuZWxtdCk7dmFyIHU9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25QYW5Eb3duIixudWxsLGUsYlsyN10sYlsyOF0sYlsyOV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejEwOCIpO2ouYXBwZW5kQ2hpbGQodS5lbG10KTt2YXIgdj1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblBhblJpZ2h0IixudWxsLGUsYlszMF0sYlszMV0sYlszMl0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMCIpO2ouYXBwZW5kQ2hpbGQodi5lbG10KTt2YXIgeT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvblJlc2V0IixudWxsLGUsYlszM10sYlszNF0sYlszNV0sIjFweCIsIjFweCIsIjFweCIsIjFweCIsIm1vdXNlb3ZlciIsSiwiejExMiIpO2ouYXBwZW5kQ2hpbGQoeS5lbG10KTtpZihaLmZ1bGxQYWdlVmlzaWJsZSl7dmFyIEE9bmV3IFouVXRpbHMuR3JhcGhpYygiZnVsbFBhZ2VEaXZpZGVyIixlLGJbMzZdLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiKTtqLmFwcGVuZENoaWxkKEEuZWxtdCk7dmFyIEI9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25GdWxsUGFnZSIsbnVsbCxlLGJbMzddLGJbMzhdLGJbMzldLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJtb3VzZW92ZXIiLEosInoxMTgiKTtqLmFwcGVuZENoaWxkKEIuZWxtdCl9aWYoWi5wcm9ncmVzc1Zpc2libGUpe3ZhciBEPVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwicHJvZ3Jlc3NUZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLCIxcHgiLCIxcHgiLCIxcHgiLCIxcHgiLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLEU9dG9vbGJhclNraW5TaXplc1sxNl0rInB4IjtqLmFwcGVuZENoaWxkKEQpO3ZhciBGPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFouVXRpbHMuejE4NSgiejUyIikpO0QuYXBwZW5kQ2hpbGQoWi5VdGlscy5jcmVhdGVDZW50ZXJlZEVsZW1lbnQoRikpLFouVXRpbHMuejI1MShGLCJibGFjayIsInZlcmRhbmEiLEUsIm5vbmUiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCJub3JtYWwiLCIxZW0iLCJsZWZ0Iiwibm9uZSIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihELCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5kaXNhYmxlVGV4dEludGVyYWN0aW9uKEYpfVouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRvb2xiYXJEaXNwbGF5KSxaLnRvb2xiYXJXPXRvb2xiYXJTa2luU2l6ZXNbMF0sWi50b29sYmFyQ3VycmVudFc9Wi50b29sYmFyVz09LTE/Wi52aWV3ZXJXOloudG9vbGJhclcsWi50b29sYmFySD1mPXRvb2xiYXJTa2luU2l6ZXNbMV07dmFyIEc9Wi50b29sYmFyUG9zaXRpb249PTE/Wi52aWV3ZXJILWY6MDt4KFoudG9vbGJhckN1cnJlbnRXLFoudG9vbGJhckgsMCxHKTtpZihaLlZpZXdwb3J0JiZaLlZpZXdwb3J0LnoxODAoKSl7dmFyIEg9Wi5WaWV3cG9ydC56MTg5QXNab29tKCk7QyhIKX16KFoudG9vbGJhclZpc2libGU9PTF8fFoudG9vbGJhclZpc2libGU9PTJ8fFoudG9vbGJhclZpc2libGU9PTQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihaLlRvb2xiYXJEaXNwbGF5LCJtb3VzZW92ZXIiLFouVXRpbHMuc3RvcFByb3BhZ2F0aW9uKSx3KCEwKX0sdGhpcy56MTgwPWZ1bmN0aW9uKCl7cmV0dXJuIHYoKX0sdGhpcy5zZXRTaXplQW5kUG9zaXRpb249ZnVuY3Rpb24oYSxiLGMsZCl7eChhLGIsYyxkKX0sdGhpcy5zaG93PWZ1bmN0aW9uKGEpe3ooYSl9LHRoaXMuc2V0VmlzaWJpbGl0eT1mdW5jdGlvbihhKXtBKGEpfSx0aGlzLnoyMTU9ZnVuY3Rpb24oYSl7QihhKX0sdGhpcy5zaG93UHJvZ3Jlc3M9ZnVuY3Rpb24oYSxiKXtpZihaLnByb2dyZXNzVmlzaWJsZSl7cSYmd2luZG93LmNsZWFySW50ZXJ2YWwocSk7dmFyIGMsZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3NUZXh0Qm94IikuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDtkJiYoYT09MHx8Yj09MD8oZC5ub2RlVmFsdWU9ImxsbGxsbGxsbGwiLHE9d2luZG93LnNldEludGVydmFsKHUscGFyc2VJbnQoWi5VdGlscy56MTg1KCJ6NTEiKSksMTApKTooYz1NYXRoLnJvdW5kKDEwMC1iL2EqMTAwKSxkLm5vZGVWYWx1ZT0ibCIubXVsdGlwbHkoTWF0aC5yb3VuZChjLzEwKSkpKX19LHRoaXMuejI2Nj1mdW5jdGlvbihhKXtDKGEpfX0sWi56MTIzPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIHgoYSl7Wi5OYXZpZ2F0b3JEaXNwbGF5PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiTmF2aWdhdG9yRGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixlKyJweCIsZisicHgiLGcrInB4IixoKyJweCIsInNvbGlkIiwiMXB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpLG89Wi5OYXZpZ2F0b3JEaXNwbGF5LHA9by5zdHlsZTt2YXIgYj1aLlV0aWxzLnoxODUoInozNiIpLGM9Wi5VdGlscy56MTg1KCJ6MzZOT0FMUEhBIiksZD1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckJhY2tncm91bmQiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsicHgiLGYrInB4IiwiMHB4IiwiMHB4Iiwibm9uZSIsIjBweCIsYiwiMHB4IiwiMHB4Iik7Wi5VdGlscy5zZXRPcGFjaXR5KGQsbCxjKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoZCkscT1kLHI9cS5zdHlsZTt2YXIgaj1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoImRpdiIsIm5hdmlnYXRvckltYWdlQ29udGFpbmVyIiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGUrInB4IixmKyJweCIsIjBweCIsIjBweCIsIm5vbmUiLCIwcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ai5hcHBlbmRDaGlsZChuKSxaLk5hdmlnYXRvckRpc3BsYXkuYXBwZW5kQ2hpbGQoaikscz1qLHQ9cy5zdHlsZSx1PW47dmFyIGs9Wi5VdGlscy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJuYXZpZ2F0b3JSZWN0YW5nbGUiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsZSsxKyJweCIsZisxKyJweCIsZysicHgiLGgrInB4Iiwic29saWQiLCIxcHgiLCJ0cmFuc3BhcmVudCBub25lIiwiMHB4IiwiMHB4Iik7ay5zdHlsZS5ib3JkZXJDb2xvcj1aLlV0aWxzLnoxODUoIno0MSIpLFouTmF2aWdhdG9yRGlzcGxheS5hcHBlbmRDaGlsZChrKSx2PWssdz12LnN0eWxlLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLk5hdmlnYXRvckRpc3BsYXkpLEMoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCksWi5tb2JpbGVEZXZpY2U/KFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaHN0YXJ0IixQKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2htb3ZlIixRKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywidG91Y2hlbmQiLFIpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihvLCJ0b3VjaGNhbmNlbCIsUykpOihaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodSwibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vkb3duIixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2VvdmVyIixaLlV0aWxzLnN0b3BQcm9wYWdhdGlvbiksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKG8sIm1vdXNlZG93biIsTSkpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihuLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGQsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIoaywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpLEIoITApLEcoKX1mdW5jdGlvbiB5KGEpe0MoZSxmLGcsaCxpKSxIKFoubmF2aWdhdG9yVmlzaWJsZT09MXx8Wi5uYXZpZ2F0b3JWaXNpYmxlPT0yKSxGKCl9ZnVuY3Rpb24geigpe2lmKEEoKSl7ZCYmKHdpbmRvdy5jbGVhckludGVydmFsKGQpLGQ9bnVsbCk7aWYoIW98fCFwfHwhcXx8IXJ8fCFzfHwhdHx8IXV8fCF2fHwhdylvPVouTmF2aWdhdG9yRGlzcGxheSxwPW8uc3R5bGUscT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1swXSxyPXEuc3R5bGUscz1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXSx0PXMuc3R5bGUsdT1aLk5hdmlnYXRvckRpc3BsYXkuY2hpbGROb2Rlc1sxXS5maXJzdENoaWxkLHY9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMl0sdz12LnN0eWxlfX1mdW5jdGlvbiBBKCl7cmV0dXJuIGN9ZnVuY3Rpb24gQihhKXtjPWF9ZnVuY3Rpb24gQyhhLGIsYyxkLGUpe2F8fChhPVoubmF2aWdhdG9yVyksYnx8KGI9Wi5uYXZpZ2F0b3JIKSxjfHwoYz0wKSxkfHwoZD0wKSxvfHwobz1aLk5hdmlnYXRvckRpc3BsYXkpLHB8fChwPW8uc3R5bGUpLHU9by5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQ7aWYobyYmcCYmdSl7aWYoZSl7dmFyIGY9MSxnPTE7ZT09MD9nPVoudmlld2VyVy9aLnZpZXdlckg6Zz11LndpZHRoL3UuaGVpZ2h0LGY+MT8oYj1hLGIvPWcpOihhPWIsYSo9Zyl9cC53aWR0aD1hKyJweCIscC5oZWlnaHQ9YisicHgiLHAubGVmdD1jLTErInB4IixwLnRvcD1kLTErInB4IixEKGEsYil9fWZ1bmN0aW9uIEQoYSxiKXtyfHwocj1aLk5hdmlnYXRvckRpc3BsYXkuZmlyc3RDaGlsZC5zdHlsZSksdHx8KHQ9Wi5OYXZpZ2F0b3JEaXNwbGF5LmNoaWxkTm9kZXNbMV0uc3R5bGUpLHV8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpLHImJnQmJnUmJihyLndpZHRoPWErInB4IixyLmhlaWdodD1iKyJweCIsRShhLGIsdS53aWR0aCx1LmhlaWdodCksdC53aWR0aD11LndpZHRoKyJweCIsdC5oZWlnaHQ9dS5oZWlnaHQrInB4Iix0LmxlZnQ9KGEtcGFyc2VGbG9hdCh0LndpZHRoKSkvMisicHgiLHQudG9wPShiLXBhcnNlRmxvYXQodC5oZWlnaHQpKS8yKyJweCIsRygpKX1mdW5jdGlvbiBFKGEsYixjLGQpe3V8fCh1PVouTmF2aWdhdG9yRGlzcGxheS5jaGlsZE5vZGVzWzFdLmZpcnN0Q2hpbGQpO2lmKHUpe3ZhciBlPWMvZCxmPWEvYyxnPWIvZCxoPTAsaT0wO2Y8PWc/KGM9YSxkPWEvZSxpPShiLWQqKGEvYykpLzIpOmc8ZiYmKGQ9YixjPWIqZSxoPShhLWMqKGIvZCkpLzIpLHUud2lkdGg9Yyx1LmhlaWdodD1kfX1mdW5jdGlvbiBGKCl7cHx8KHA9Wi5OYXZpZ2F0b3JEaXNwbGF5LnN0eWxlKSxwJiYocC56SW5kZXg9cC56SW5kZXgrMTAwKX1mdW5jdGlvbiBHKCl7aWYoWi5WaWV3cG9ydCYmWi5WaWV3cG9ydC56MTgwKCkpe0koKTt2YXIgYT1aLlZpZXdwb3J0LnoxNDEoKTtKKGEpfX1mdW5jdGlvbiBIKGEpe3B8fChwPVouTmF2aWdhdG9yRGlzcGxheS5zdHlsZSkscCYmKGE/cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnAuZGlzcGxheT0ibm9uZSIpfWZ1bmN0aW9uIEkoKXtpZih1JiZ3KXt2YXIgYT11LndpZHRoL1ouaW1hZ2VXLGI9dS5oZWlnaHQvWi5pbWFnZUgsYz1aLlZpZXdwb3J0LnoxODlBc1pvb20oKSxkPVoudmlld2VyVyphL2MsZT1aLnZpZXdlckgqYi9jO3cud2lkdGg9ZCsicHgiLHcuaGVpZ2h0PWUrInB4In19ZnVuY3Rpb24gSihhKXtpZih1JiZ3JiZ0KXt2YXIgYj11LndpZHRoL1ouaW1hZ2VXLGM9dS5oZWlnaHQvWi5pbWFnZUgsZD1hLngqYixlPWEueSpjLGY9ZC1wYXJzZUZsb2F0KHcud2lkdGgpLzIsZz1lLXBhcnNlRmxvYXQody5oZWlnaHQpLzI7dy5sZWZ0PWYrcGFyc2VGbG9hdCh0LmxlZnQpKyJweCIsdy50b3A9ZytwYXJzZUZsb2F0KHQudG9wKSsicHgifX1mdW5jdGlvbiBLKCl7aWYodyYmdCYmdSl7dmFyIGE9cGFyc2VGbG9hdCh3LmxlZnQpLXBhcnNlRmxvYXQodC5sZWZ0KSxiPXBhcnNlRmxvYXQody50b3ApLXBhcnNlRmxvYXQodC50b3ApLGM9YSsocGFyc2VGbG9hdCh3LndpZHRoKS0xKS8yLGQ9YisocGFyc2VGbG9hdCh3LmhlaWdodCktMSkvMixlPVouaW1hZ2VXL3Uud2lkdGgsZj1aLmltYWdlSC91LmhlaWdodCxnPWMqZSxoPWQqZjtaLlZpZXdwb3J0LnoyNjcoZyxoKX19ZnVuY3Rpb24gTCgpe1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4OCIpKX1mdW5jdGlvbiBNKGEpe2lmKG8mJnYmJncpe3ZhciBhPVouVXRpbHMuZXZlbnQoYSk7di5tb3VzZVhQcmlvcj1hLmNsaWVudFgsdi5tb3VzZVlQcmlvcj1hLmNsaWVudFksemFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChhLmNsaWVudFgsYS5jbGllbnRZKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2Vtb3ZlIixOKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIobywibW91c2V1cCIsTyksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIixPKX19ZnVuY3Rpb24gTihhKXtpZih2JiZ3KXt2YXIgYj1wYXJzZUZsb2F0KHcubGVmdCksYz1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWIrKGEuY2xpZW50WC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWMrKGEuY2xpZW50WS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9YS5jbGllbnRYLHYubW91c2VZUHJpb3I9YS5jbGllbnRZLEsoKSwhMX19ZnVuY3Rpb24gTyhhKXtpZihvJiZ2JiZ3KXtkb2N1bWVudC5tb3VzZW1vdmU9bnVsbCxkb2N1bWVudC5tb3VzZXVwPW51bGwsWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNlbW92ZSIsTiksWi5VdGlscy5yZW1vdmVFdmVudExpc3RlbmVyKG8sIm1vdXNldXAiLE8pLFouVXRpbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsTyk7dmFyIGE9Wi5VdGlscy5ldmVudChhKSxiPW5ldyBaLlV0aWxzLlBvaW50KGEuY2xpZW50WCxhLmNsaWVudFkpLGM9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1iLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWIueSwyKSk7aWYoYzw0KXt2YXIgZD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9YS5jbGllbnRYLWQueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1hLmNsaWVudFktZC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFAoYSl7YS5wcmV2ZW50RGVmYXVsdCgpO2lmKG8mJnYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSk7emFwdHZEcmFnUHRTdGFydD1uZXcgWi5VdGlscy5Qb2ludChkLngsZC55KSx2Lm1vdXNlWFByaW9yPWQueCx2Lm1vdXNlWVByaW9yPWQueSx6YXB0dkRyYWdQdFN0YXJ0PW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpfX19ZnVuY3Rpb24gUShhKXthLnByZXZlbnREZWZhdWx0KCk7aWYoIVoubW91c2VQYW4pcmV0dXJuO2lmKHYmJncpe3ZhciBiPVouVXRpbHMuejE3OChhKTtpZihiKXt2YXIgYz1iLnRhcmdldCxkPW5ldyBaLlV0aWxzLlBvaW50KGIucGFnZVgsYi5wYWdlWSksZT1wYXJzZUZsb2F0KHcubGVmdCksZj1wYXJzZUZsb2F0KHcudG9wKTtyZXR1cm4gdy5sZWZ0PWUrKGQueC12Lm1vdXNlWFByaW9yKSsicHgiLHcudG9wPWYrKGQueS12Lm1vdXNlWVByaW9yKSsicHgiLHYubW91c2VYUHJpb3I9ZC54LHYubW91c2VZUHJpb3I9ZC55LEsoKSwhMX19cmV0dXJuITF9ZnVuY3Rpb24gUihhKXtpZihvJiZ2JiZ3KXt2YXIgYj1aLlV0aWxzLnoxNzgoYSk7aWYoYil7dmFyIGM9Yi50YXJnZXQsZD1uZXcgWi5VdGlscy5Qb2ludChiLnBhZ2VYLGIucGFnZVkpLGU9bmV3IFouVXRpbHMuUG9pbnQoZC54LGQueSksZj1NYXRoLnNxcnQoTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC54LWUueCwyKStNYXRoLnBvdyh6YXB0dkRyYWdQdFN0YXJ0LnktZS55LDIpKSxnPVoubW9iaWxlRGV2aWNlPzY6MztpZihmPGcpe3ZhciBoPVouVXRpbHMuejE3NChaLk5hdmlnYXRvckRpc3BsYXkpO3cubGVmdD1kLngtaC54LXBhcnNlRmxvYXQody53aWR0aCkvMisicHgiLHcudG9wPWQueS1oLnktcGFyc2VGbG9hdCh3LmhlaWdodCkvMisicHgifX1LKCksWi5WaWV3cG9ydC56Mjc0KCl9fWZ1bmN0aW9uIFMoYSl7aWYobyYmdiYmdyl7dmFyIGI9Wi5VdGlscy56MTc4KGEpO2lmKGIpe3ZhciBjPWIudGFyZ2V0LGQ9bmV3IFouVXRpbHMuUG9pbnQoYi5wYWdlWCxiLnBhZ2VZKSxlPW5ldyBaLlV0aWxzLlBvaW50KGQueCxkLnkpLGY9TWF0aC5zcXJ0KE1hdGgucG93KHphcHR2RHJhZ1B0U3RhcnQueC1lLngsMikrTWF0aC5wb3coemFwdHZEcmFnUHRTdGFydC55LWUueSwyKSksZz1aLm1vYmlsZURldmljZT82OjM7aWYoZjxnKXt2YXIgaD1aLlV0aWxzLnoxNzQoWi5OYXZpZ2F0b3JEaXNwbGF5KTt3LmxlZnQ9ZC54LWgueC1wYXJzZUZsb2F0KHcud2lkdGgpLzIrInB4Iix3LnRvcD1kLnktaC55LXBhcnNlRmxvYXQody5oZWlnaHQpLzIrInB4In19SygpLFouVmlld3BvcnQuejI3NCgpfX12YXIgYj10aGlzLGM9ITEsZCxlPVoubmF2aWdhdG9yVyxmPVoubmF2aWdhdG9ySCxnPVoubmF2aWdhdG9yTC0xLGg9Wi5uYXZpZ2F0b3JULTEsaT1aLm5hdmlnYXRvckZpdCxqLGs9bnVsbCxsPXBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6MzUiKSksbT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLG49bmV3IEltYWdlO24ub25sb2FkPXgsbi5vbmVycm9yPUwsbi5zcmM9bTt2YXIgbyxwLHEscixzLHQsdSx2LHc7dGhpcy5zZXRJbWFnZVBhdGg9ZnVuY3Rpb24oYSl7bT1aLlV0aWxzLnoxNDAoWi5pbWFnZVBhdGgrIi9UaWxlR3JvdXAwLyIrIjAtMC0wLmpwZyIpLHMucmVtb3ZlQ2hpbGQobiksbj1udWxsLG49bmV3IEltYWdlLHMuYXBwZW5kQ2hpbGQobiksbi5vbmxvYWQ9eSxuLm9uZXJyb3I9TCxuLnNyYz1tfSx0aGlzLnoxODA9ZnVuY3Rpb24oKXtyZXR1cm4gQSgpfSx0aGlzLnNldFNpemVBbmRQb3NpdGlvbj1mdW5jdGlvbihhLGIsYyxkLGUpe2V8fChlPWkpLEMoYSxiLGMsZCxlKX0sdGhpcy5zZXRWaXNpYmlsaXR5PWZ1bmN0aW9uKGEpe0goYSl9LHRoaXMuejI2OD1mdW5jdGlvbigpe0coKX0sdGhpcy56MjYzUmVjdGFuZ2xlRGltZW5zaW9ucz1mdW5jdGlvbigpe0koKX0sdGhpcy56MjYzUmVjdGFuZ2xlUG9zaXRpb249ZnVuY3Rpb24oYSl7SihhKX0sdGhpcy56Mjc3PWZ1bmN0aW9uKCl7QSgpP3ooKTpkPXdpbmRvdy5zZXRJbnRlcnZhbCh6LDMwMCl9fSxaLnoxMDE9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhhLGIpe3ZhciBjPW51bGwsZD10eXBlb2YgYj09ImZ1bmN0aW9uIjtpZihkKXZhciBlPWIsYj1mdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KFouVXRpbHMuY3JlYXRlQ2FsbGJhY2sobnVsbCxlLGMpLDEpfTtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl7dmFyIGY9WyJNc3htbDIuWE1MSFRUUCIsIk1zeG1sMy5YTUxIVFRQIiwiTWljcm9zb2Z0LlhNTEhUVFAiXTtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl0cnl7Yz1uZXcgQWN0aXZlWE9iamVjdChmW2ddKTticmVha31jYXRjaChoKXtjb250aW51ZX19ZWxzZSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QmJihjPW5ldyBYTUxIdHRwUmVxdWVzdCk7Y3x8Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejk5IikpLGQmJihjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2MucmVhZHlTdGF0ZT09NCYmKGMub25yZWFkeXN0YXRlY2hhbmdlPW5ldyBGdW5jdGlvbixiKCkpfSk7dHJ5e2Mub3BlbigiR0VUIixhLGQpLGMuc2VuZChudWxsKX1jYXRjaChoKXthLmluZGV4T2YoIkltYWdlUHJvcGVydGllcy54bWwiKSE9LTE/Wi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg3LUlNQUdFWE1MIikpOmEuaW5kZXhPZigic2tpbkZpbGVzLnhtbCIpIT0tMT9aLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODctVE9PTEJBUlhNTCIpKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODciKSksYy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxjPW51bGx9cmV0dXJuIGQ/bnVsbDpjfWZ1bmN0aW9uIGQoYSl7aWYoYSl7aWYoIWEpWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejg5IikpO2Vsc2UgaWYoYS5zdGF0dXMhPT0yMDAmJmEuc3RhdHVzIT09MCl7dmFyIGI9YS5zdGF0dXMsYz1iPT00MDQ/Ik5vdCBGb3VuZCI6YS5zdGF0dXNUZXh0O1ouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MCIpK2IrIiAtICIrYyl9dmFyIGQ9bnVsbDthLnJlc3BvbnNlWE1MJiZhLnJlc3BvbnNlWE1MLmRvY3VtZW50RWxlbWVudD9kPWEucmVzcG9uc2VYTUw6YS5yZXNwb25zZVRleHQmJihkPVouVXRpbHMuejE1OChhLnJlc3BvbnNlVGV4dCkpLGUoZCl9ZWxzZSBaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6ODQiKSl9ZnVuY3Rpb24gZShhKXtpZihhJiZhLmRvY3VtZW50RWxlbWVudCl7dmFyIGI9YS5kb2N1bWVudEVsZW1lbnQudGFnTmFtZTtiPT0iQ09QWVJJR0hUIj9mKCJjb3B5cmlnaHQiLGEpOmI9PSJJTUFHRV9QUk9QRVJUSUVTIj9mKCJpbWFnZSIsYSk6Yj09IlNLSU5EQVRBIj9mKCJza2luIixhKTpaLlV0aWxzLnoyNTUoWi5VdGlscy56MTg1KCJ6MTAwIikpfWVsc2UgWi5VdGlscy56MjU1KFouVXRpbHMuejE4NSgiejEwMCIpKX1mdW5jdGlvbiBmKGEsYil7aWYoYT09ImNvcHlyaWdodCIpe3ZhciBjPWIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiU1RBVEVNRU5UVEVYVCIpLGQ9Yi5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJERUNMSU5FRFRFWFQiKTtaLlV0aWxzLmlzU3RyVmFsKGMpP1ouVXRpbHMuejI1MighMCxjLGQpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJpbWFnZSIpe3ZhciBlPXBhcnNlSW50KGIuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiV0lEVEgiKSwxMCksZj1wYXJzZUludChiLmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIkhFSUdIVCIpLDEwKTshaXNOYU4oZSkmJmU+MCYmIWlzTmFOKGYpJiZmPjA/Wi5WaWV3cG9ydCYmKFouVmlld3BvcnQuejE4MCgpP1ouVmlld3BvcnQucmV6MjA2KGUsZik6Wi5WaWV3cG9ydC56MjA2KGUsZikpOlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno4NiIpKX1lbHNlIGlmKGE9PSJza2luIil7Wi5za2luTW9kZT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOTU9ERSIpLm5vZGVWYWx1ZTt2YXIgZyxoO1ouc2tpbk1vZGU9PTF8fFouc2tpbk1vZGU9PTAmJiFaLm1vYmlsZURldmljZT8oZz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJTRVRVUCIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJGT0xERVJTVEFOREFSRCIpLm5vZGVWYWx1ZSxoPSJTSVpFU1NUQU5EQVJEIik6KGc9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiU0VUVVAiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRk9MREVSTEFSR0UiKS5ub2RlVmFsdWUsaD0iU0laRVNMQVJHRSIpO3ZhciBpPVtdO2kucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlRPT0xCQVJXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiVE9PTEJBUkgiKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJMT0dPVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkxPR09IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiRElWSURFUlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJESVZJREVSSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiQlVUVE9OU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNMSURFUkJVVFRPTlciKS5ub2RlVmFsdWUpKSxpLnB1c2gocGFyc2VGbG9hdChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGgpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTTElERVJCVVRUT05IIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tXIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSVFJBQ0tIIikubm9kZVZhbHVlKSksaS5wdXNoKHBhcnNlRmxvYXQoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0xJREVSU1BBTiIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTVyIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTSCIpLm5vZGVWYWx1ZSkpLGkucHVzaChwYXJzZUZsb2F0KGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaClbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlBST0dSRVNTRk9OVFNJWkUiKS5ub2RlVmFsdWUpKTt2YXIgaj1bXSxrPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZJTEVTIilbMF0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIlNLSU4wIikubm9kZVZhbHVlLGw9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRklMRVMiKVswXS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiU0tJTjM5Iikubm9kZVZhbHVlO2lmKFouVXRpbHMuaXNTdHJWYWwoaykmJlouVXRpbHMuaXNTdHJWYWwobCkpe3ZhciBtPSExO2Zvcih2YXIgbj0wO248NDA7bisrKXt2YXIgbz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJGSUxFUyIpWzBdLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJTS0lOIituKS5ub2RlVmFsdWU7Wi5VdGlscy5pc1N0clZhbChvKT9qW25dPWcrIi8iK286KGpbbl09Im51bGwiLG09ITApfW0mJlouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIkVSUk9SX1NLSU5TWE1MTUlTU0lOR05BTUVTIikpLFouVG9vbGJhciYmWi5Ub29sYmFyLnoyMDUoaSxqKX1lbHNlIFouVXRpbHMuejI1NShaLlV0aWxzLnoxODUoIno5MSIpKX19ZnVuY3Rpb24gZyhhLGMsZCl7Yi0tO2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXRyeXthKGQpfWNhdGNoKGUpe1ouVXRpbHMuejI1NShlLm5hbWUrWi5VdGlscy56MTg1KCJ6ODMiKStjKyIgIitlLm1lc3NhZ2UpfX1mdW5jdGlvbiBoKGEsYil7ZnVuY3Rpb24gZShlKXtjLm9ubG9hZD1udWxsLGMub25hYm9ydD1udWxsLGMub25lcnJvcj1udWxsLGQmJndpbmRvdy5jbGVhclRpbWVvdXQoZCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtiKGEsZT9jOm51bGwpfSwxKX12YXIgYz1udWxsLGQ9bnVsbDt0aGlzLnN0YXJ0PWZ1bmN0aW9uKCl7Yz1uZXcgSW1hZ2U7dmFyIGI9ZnVuY3Rpb24oKXtlKCEwKX0sZj1mdW5jdGlvbigpe2UoITEpfSxnPWZ1bmN0aW9uKCl7ZSghMSl9O2Mub25sb2FkPWIsYy5vbmFib3J0PWYsYy5vbmVycm9yPWYsZD13aW5kb3cuc2V0VGltZW91dChnLHBhcnNlRmxvYXQoWi5VdGlscy56MTg1KCJ6NjAiKSkpLGMuc3JjPWF9fXZhciBiPTA7dGhpcy5sb2FkWE1MPWZ1bmN0aW9uKGEpe2MoYSxkKX0sdGhpcy56MjEySW1hZ2U9ZnVuY3Rpb24oYSxjKXtpZihiPj1wYXJzZUludChaLlV0aWxzLnoxODUoInoyNSIpLDEwKSlyZXR1cm4hMTt2YXIgZD1aLlV0aWxzLmNyZWF0ZUNhbGxiYWNrKG51bGwsZyxjKSxlPW5ldyBoKGEsZCk7cmV0dXJuIGIrKyxlLnN0YXJ0KCksITB9fSxaLlV0aWxzPXt6MTYzOmZ1bmN0aW9uKCl7Wi5wYWdlQ29udGFpbmVySUQ9bnVsbCxaLmltYWdlUGF0aD1udWxsLFouc2tpblBhdGg9bnVsbCxaLnNraW5Nb2RlPW51bGwsWi5wYXJhbWV0ZXJzPW51bGwsWi5icm93c2Vycz1udWxsLFouYnJvd3Nlcj1udWxsLFouYnJvd3NlclZlcnNpb249bnVsbCxaLmNhbnZhc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD1udWxsLFouY3NzVHJhbnNmb3JtUHJvcGVydHk9bnVsbCxaLmNzc1RyYW5zZm9ybU5vVW5pdHM9bnVsbCxaLmFscGhhU3VwcG9ydGVkPW51bGwsWi5yZW5kZXJRdWFsaXR5PW51bGwsWi5tb2JpbGVEZXZpY2U9bnVsbCxaLmluaXRpYWxYPW51bGwsWi5pbml0aWFsWT1udWxsLFouaW5pdGlhbFo9bnVsbCxaLm1pblo9bnVsbCxaLm1heFo9bnVsbCxaLnpvb21TcGVlZD1udWxsLFoucGFuU3BlZWQ9bnVsbCxaLmZhZGVJblNwZWVkPW51bGwsWi50b29sYmFyVmlzaWJsZT1udWxsLFoudG9vbGJhclc9bnVsbCxaLnRvb2xiYXJIPW51bGwsWi50b29sYmFyUG9zaXRpb249bnVsbCxaLm5hdmlnYXRvclZpc2libGU9bnVsbCxaLm5hdmlnYXRvclc9bnVsbCxaLm5hdmlnYXRvckg9bnVsbCxaLm5hdmlnYXRvckw9bnVsbCxaLm5hdmlnYXRvclQ9bnVsbCxaLm5hdmlnYXRvckZpdD1udWxsLFouY2xpY2tab29tPW51bGwsWi5jbGlja1Bhbj1udWxsLFoubW91c2VQYW49bnVsbCxaLmtleXM9bnVsbCxaLmNvbnN0cmFpblBhbj1udWxsLFoudG9vbHRpcHNWaXNpYmxlPW51bGwsWi5jb3B5cmlnaHRQYXRoPW51bGwsWi53YXRlcm1hcmtQYXRoPW51bGwsWi5zbGlkZXJWaXNpYmxlPW51bGwsWi5mdWxsUGFnZVZpc2libGU9bnVsbCxaLnByb2dyZXNzVmlzaWJsZT1udWxsLFoubG9nb1Zpc2libGU9bnVsbCxaLmxvZ29DdXN0b21QYXRoPW51bGwsWi5jYW52YXM9bnVsbCxaLmRlYnVnPW51bGwsWi5WaWV3ZXI9bnVsbCxaLlZpZXdlckRpc3BsYXk9bnVsbCxaLlZpZXdwb3J0PW51bGwsWi5Ub29sYmFyPW51bGwsWi5Ub29sYmFyRGlzcGxheT1udWxsLFouVG9vbHRpcERpc3BsYXk9bnVsbCxaLk5hdmlnYXRvcj1udWxsLFouTmF2aWdhdG9yRGlzcGxheT1udWxsLFouQ29weXJpZ2h0RGlzcGxheT1udWxsLFouaW1hZ2VXPW51bGwsWi5pbWFnZUg9bnVsbCxaLmltYWdlWD0wLFouaW1hZ2VZPTAsWi5pbWFnZVo9MCxaLmZpdFo9bnVsbCxaLnpvb21pbmc9InN0b3AiLFoucGFubmluZ1g9InN0b3AiLFoucGFubmluZ1k9InN0b3AiLFouZnVsbFBhZ2U9ITEsWi51c2VDYW52YXM9ITAsWi5UcmFjZURpc3BsYXk9bnVsbCxaLnRyYWNlcz1udWxsfSxlbmZvcmNlQ29weXJpZ2h0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy56MjM4KCJpbWFnZUNvcHlyaWdodCIpO2E/Wi5WaWV3ZXIuejE0OSgpOnRoaXMuejIxMCgpfSx6MjEwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFouejEwMTthLmxvYWRYTUwoWi5jb3B5cmlnaHRQYXRoKX0sejI1MjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy56MTg1KCJ6MTYiKSxlPXRoaXMuejE4NSgiejE0Iik7aWYoYSl7Wi5Db3B5cmlnaHREaXNwbGF5PXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgiZGl2IiwiQ29weXJpZ2h0RGlzcGxheSIsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixaLnZpZXdlclctMisicHgiLFoudmlld2VySC0yKyJweCIsIjBweCIsIjBweCIsInNvbGlkIiwiMXB4IixkLCIwcHgiLCIwcHgiKSxaLlZpZXdlckRpc3BsYXkuYXBwZW5kQ2hpbGQoWi5Db3B5cmlnaHREaXNwbGF5KTt2YXIgZj00NDAsZz0yMDAsaD1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS53aWR0aCkvMi1mLzIsaT1wYXJzZUZsb2F0KFouQ29weXJpZ2h0RGlzcGxheS5zdHlsZS5oZWlnaHQpLzItZy8yLGo9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJ0ZXh0Qm94IiwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGYrInB4IixnKyJweCIsaCsicHgiLGkrInB4Iiwibm9uZSIsIjBweCIsInRyYW5zcGFyZW50IG5vbmUiLCIwcHgiLCIwcHgiKTtqLmlkPSJ0ZXh0Qm94IixaLkNvcHlyaWdodERpc3BsYXkuYXBwZW5kQ2hpbGQoaik7dmFyIGs9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7ai5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChrKSksdGhpcy56MjUxKGssImJsYWNrIiwidmVyZGFuYSIsIjE2cHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwianVzdGlmeSIsIm5vbmUiKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjKTtqLmFwcGVuZENoaWxkKGwpO3ZhciBtPTgwLG49MjAsbz0zMCxwPTIwLHE9aCtmLzItKG0qMitvKS8yLHI9aStnK3Ascz10aGlzLnoxODUoInoxMyIpLHQ9bmV3IFouVXRpbHMuQnV0dG9uKCJidXR0b25BZ3JlZSIscyxudWxsLG51bGwsbnVsbCxudWxsLG0rInB4IixuKyJweCIscSsicHgiLHIrInB4IiwibW91c2Vkb3duIix0aGlzLnoxNjAsInoxMDMiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMHB4Iik7Wi5Db3B5cmlnaHREaXNwbGF5LmFwcGVuZENoaWxkKHQuZWxtdCkscSs9bStvLHM9dGhpcy56MTg1KCJ6MTUiKTt2YXIgdT1uZXcgWi5VdGlscy5CdXR0b24oImJ1dHRvbkV4aXQiLHMsbnVsbCxudWxsLG51bGwsbnVsbCxtKyJweCIsbisicHgiLHErInB4IixyKyJweCIsIm1vdXNlZG93biIsdGhpcy56MTYxLCJ6MTA0Iiwic29saWQiLCIxcHgiLGUsIjBweCIsIjBweCIpO1ouQ29weXJpZ2h0RGlzcGxheS5hcHBlbmRDaGlsZCh1LmVsbXQpfWVsc2V7dmFyIGo9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRleHRCb3giKSx2PWouY2hpbGROb2Rlc1sxXS50ZXh0Q29udGVudDtqLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQ9djt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uQWdyZWUiKTt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCwibW91c2Vkb3duIix0aGlzLnoxNjApLFouQ29weXJpZ2h0RGlzcGxheS5yZW1vdmVDaGlsZCh0KTt2YXIgdT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uRXhpdCIpO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih1LCJtb3VzZWRvd24iLHRoaXMuejE2MSksWi5Db3B5cmlnaHREaXNwbGF5LnJlbW92ZUNoaWxkKHUpfX0sQnV0dG9uOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMpe3ZhciB0PVouVXRpbHMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsYSwiaW5saW5lLWJsb2NrIiwiYWJzb2x1dGUiLCJoaWRkZW4iLGcsaCxpLGosbixvLHAscSxyLHMpO2lmKCFaLlV0aWxzLmlzU3RyVmFsKGIpKXt2YXIgdT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGMrIi8iK2QpLHY9Wi5VdGlscy5jcmVhdGVHcmFwaGljRWxlbWVudChjKyIvIitlKSx3PVouVXRpbHMuY3JlYXRlR3JhcGhpY0VsZW1lbnQoYysiLyIrZik7dS5pZD10LmlkKyItaW1nVXAiLHYuaWQ9dC5pZCsiLWltZ092ZXIiLHcuaWQ9dC5pZCsiLWltZ0Rvd24iLHQuX2ltZ1VwSUQ9dS5pZCx0Ll9pbWdPdmVySUQ9di5pZCx0Ll9pbWdEb3duSUQ9dy5pZDt2YXIgeD11LnN0eWxlLHk9di5zdHlsZSx6PXcuc3R5bGU7eC5wb3NpdGlvbj15LnBvc2l0aW9uPXoucG9zaXRpb249ImFic29sdXRlIix4LndpZHRoPXkud2lkdGg9eS53aWR0aD1nLHguaGVpZ2h0PXkuaGVpZ2h0PXkuaGVpZ2h0PWgseC50b3A9eS50b3A9ei50b3A9IjBweCIseC5sZWZ0PXkubGVmdD16LmxlZnQ9IjBweCIsWi5icm93c2VyPT1aLmJyb3dzZXJzLkZJUkVGT1gmJlouYnJvd3NlclZlcnNpb248MyYmKHgudG9wPXkudG9wPXoudG9wPSIiKSx5LnZpc2liaWxpdHk9ImhpZGRlbiIsei52aXNpYmlsaXR5PSJoaWRkZW4iLHQuYXBwZW5kQ2hpbGQodSksdC5hcHBlbmRDaGlsZCh2KSx0LmFwcGVuZENoaWxkKHcpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih1LCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHYsImNvbnRleHRtZW51IixaLlV0aWxzLnByZXZlbnREZWZhdWx0KSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodywiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfWVsc2V7dmFyIEE9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYik7dC5hcHBlbmRDaGlsZChaLlV0aWxzLmNyZWF0ZUNlbnRlcmVkRWxlbWVudChBKSksWi5VdGlscy56MjUxKEEsImJsYWNrIiwidmVyZGFuYSIsIjEzcHgiLCJub25lIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwibm9ybWFsIiwiMWVtIiwiY2VudGVyIiwibm9uZSIpLFouVXRpbHMuZGlzYWJsZVRleHRJbnRlcmFjdGlvbihBKSxaLlV0aWxzLmFkZEV2ZW50TGlzdGVuZXIodCwiY29udGV4dG1lbnUiLFouVXRpbHMucHJldmVudERlZmF1bHQpfVoudG9vbHRpcHNWaXNpYmxlJiZaLlV0aWxzLmlzU3RyVmFsKG0pJiYodC50aXRsZT1aLlV0aWxzLnoxODUobSkpLFoubW9iaWxlRGV2aWNlP1ouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJ0b3VjaHN0YXJ0IixsKTooWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlZG93biIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCksWi5VdGlscy5hZGRFdmVudExpc3RlbmVyKHQsIm1vdXNlb3ZlciIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LCJtb3VzZW91dCIsWi5VdGlscy5zdG9wUHJvcGFnYXRpb24pLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcih0LGssbCkpLHRoaXMuZWxtdD10fSx6MTM4OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLnN0eWxlO2Qud2lkdGg9YisicHgiLGQuaGVpZ2h0PWMrInB4Ijt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdVcElEKSxmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuX2ltZ092ZXJJRCksZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLl9pbWdEb3duSUQpO2lmKGUmJmYmJmcpe3ZhciBoPWUuc3R5bGUsaT1mLnN0eWxlLGo9Zy5zdHlsZTtoLndpZHRoPWIrInB4IixoLmhlaWdodD1jKyJweCIsaS53aWR0aD1iKyJweCIsaS5oZWlnaHQ9YysicHgiLGoud2lkdGg9YisicHgiLGouaGVpZ2h0PWMrInB4In19LEdyYXBoaWM6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9Yz9iKyIvIitjOmIsaT1aLlV0aWxzLmNyZWF0ZUdyYXBoaWNFbGVtZW50KGgpLGo9aS5zdHlsZTtqLndpZHRoPWQsai5oZWlnaHQ9ZTt2YXIgYz1aLlV0aWxzLmNyZWF0ZUNvbnRhaW5lckVsZW1lbnQoInNwYW4iLGEsImlubGluZS1ibG9jayIsImFic29sdXRlIiwiaGlkZGVuIixkLGUsZixnLCJub25lIiwiMHB4IiwidHJhbnNwYXJlbnQgbm9uZSIsIjBweCIsIjBweCIpO2MuYXBwZW5kQ2hpbGQoaSksdGhpcy5lbG10PWMsWi5tb2JpbGVEZXZpY2U/Wi5VdGlscy5hZGRFdmVudExpc3RlbmVyKGksInRvdWNoc3RhcnQiLFouVXRpbHMucHJldmVudERlZmF1bHQpOlouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJtb3VzZWRvd24iLFouVXRpbHMucHJldmVudERlZmF1bHQpLFouVXRpbHMuYWRkRXZlbnRMaXN0ZW5lcihpLCJjb250ZXh0bWVudSIsWi5VdGlscy5wcmV2ZW50RGVmYXVsdCl9LHoyMDM6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuc3R5bGU7ZC53aWR0aD1iKyJweCIsZC5oZWlnaHQ9YysicHgiO3ZhciBlPWEuZmlyc3RDaGlsZCxmPWUuc3R5bGU7Zi53aWR0aD1iKyJweCIsZi5oZWlnaHQ9YysicHgifSx6MTYwOmZ1bmN0aW9uKGEpe1ouVmlld2VyRGlzcGxheS5yZW1vdmVDaGlsZChaLkNvcHlyaWdodERpc3BsYXkpLGRvY3VtZW50LmNvb2tpZT0iaW1hZ2VDb3B5cmlnaHQ9Y29uZmlybWVkIixaLlZpZXdlci56MTQ5KCl9LHoxNjE6ZnVuY3Rpb24oYSl7Wi5VdGlscy56MjUyKCExKTtyZXR1cm59LHoxMjg6ZnVuY3Rpb24oKXtTdHJpbmcucHJvdG90eXBlLm11bHRpcGx5fHwoU3RyaW5nLnByb3RvdHlwZS5tdWx0aXBseT1mdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS5qb2luLGI9e307cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBiLmxlbmd0aD1jKzEsYS5jYWxsKGIsdGhpcyl9fSgpKSxBcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8KEFycmF5LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGEsYil7Yj9iPDAmJihiPU1hdGgubWF4KDAsdGhpcy5sZW5ndGgrYikpOmI9MDtmb3IodmFyIGM9YixkPXRoaXMubGVuZ3RoO2M8ZDtjKyspaWYodGhpc1tjXT09PWEpcmV0dXJuIGM7cmV0dXJuLTF9KSxBcnJheS5wcm90b3R5cGUucHVzaHx8KEFycmF5LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEpe3RoaXNbdGhpcy5sZW5ndGhdPWF9KSxBcnJheS5wcm90b3R5cGUuc3BsaWNlfHwoQXJyYXkucHJvdG90eXBlLnN1YmFycj1mdW5jdGlvbihhLGIpe2lmKGE+PXRoaXMubGVuZ3RofHxiJiZiPD0wKXJldHVybltdO2E8MCYmKE1hdGguYWJzKGEpPnRoaXMubGVuZ3RoP2E9MDphPXRoaXMubGVuZ3RoK2EpO2lmKCFifHxiK2E+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aC1hO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YStiO2QrKyljLnB1c2godGhpc1tkXSk7cmV0dXJuIGN9LEFycmF5LnByb3RvdHlwZS5zdWJhcnJheT1mdW5jdGlvbihhLGIpe2E8MCYmKGE9MCk7aWYoIWJ8fGI+dGhpcy5sZW5ndGgpYj10aGlzLmxlbmd0aDtpZihhPT1iKXJldHVybltdO3ZhciBjPVtdO2Zvcih2YXIgZD1hO2Q8YjtkKyspYy5wdXNoKHRoaXNbZF0pO3JldHVybiBjfSxBcnJheS5wcm90b3R5cGUuc3BsaWNlPWZ1bmN0aW9uKGEsYil7YjwwJiYoYj0wKTt2YXIgYz1bXTtpZihhcmd1bWVudHMubGVuZ3RoPjIpZm9yKHZhciBkPTIsZT1hcmd1bWVudHMubGVuZ3RoO2Q8ZTtkKyspYy5wdXNoKGFyZ3VtZW50c1tkXSk7dmFyIGY9dGhpcy5zdWJhcnJheSgwLGEpLGc9dGhpcy5zdWJhcnIoYSxiKSxoPXRoaXMuc3ViYXJyYXkoYStiKSxpPWYuY29uY2F0KGMsaCk7dGhpcy5sZW5ndGg9MDtmb3IodmFyIGQ9MCxlPWkubGVuZ3RoO2Q8ZTtkKyspdGhpcy5wdXNoKGlbZF0pO3JldHVybiBnfSl9LHoxMjc6ZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyPyh0aGlzLmRpc2FibGVUZXh0SW50ZXJhY3Rpb249ZnVuY3Rpb24oYSl7YSYmKHRuUz1hLnBhcmVudE5vZGUuc3R5bGUsdG5TJiYoYS5wYXJlbnROb2RlLnVuc2VsZWN0YWJsZT0ib24iLHRuUy51c2VyU2VsZWN0PSJub25lIix0blMuTW96VXNlclNlbGVjdD0ibm9uZSIsdG5TLndlYmtpdFVzZXJTZWxlY3Q9Im5vbmUiLHRuUy53ZWJraXRUb3VjaENhbGxvdXQ9Im5vbmUiLHRuUy53ZWJraXRUYXBIaWdobGlnaHRDb2xvcj0idHJhbnNwYXJlbnQiKSl9LHRoaXMucmVuZGVyUXVhbGl0eT1mdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPWI9PSJoaWdoIj8ib3B0aW1pemVRdWFsaXR5Ijoib3B0aW1pemVTcGVlZCI7YS5zdHlsZS5zZXRQcm9wZXJ0eSgiaW1hZ2UtcmVuZGVyaW5nIixjLG51bGwpfX0sdGhpcy5zZXRPcGFjaXR5PWZ1bmN0aW9uKGEsYixjKXtaLmFscGhhU3VwcG9ydGVkP2Euc3R5bGUub3BhY2l0eT1iOmMmJihhLnN0eWxlLmJhY2tncm91bmRDb2xvcj1jKX0pOmRvY3VtZW50LmF0dGFjaEV2ZW50JiYodGhpcy5kaXNhYmxlVGV4dEludGVyYWN0aW9uPWZ1bmN0aW9uKGEpe2EmJihhLnBhcmVudE5vZGUudW5zZWxlY3RhYmxlPSJvbiIsYS5wYXJlbnROb2RlLm9uc2VsZWN0c3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0pfSx0aGlzLnJlbmRlclF1YWxpdHk9ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1iPT0iaGlnaCI/ImJpY3ViaWMiOiJuZWFyZXN0LW5laWdoYm9yIjthLnN0eWxlLm1zSW50ZXJwb2xhdGlvbk1vZGU9Y319LHRoaXMuc2V0T3BhY2l0eT1mdW5jdGlvbihhLGIsYyl7Wi5hbHBoYVN1cHBvcnRlZD8oYS5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PScgKyB2YWx1ZSArICcpIixhLnN0eWxlLmZpbHRlcj0iYWxwaGEob3BhY2l0eT0iK2IrIikiKTpjJiYoYS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Yyl9KX0sejEyNjpmdW5jdGlvbigpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXI/KHRoaXMuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7Yj09Im1vdXNld2hlZWwiJiZlbG10LmFkZEV2ZW50TGlzdGVuZXIoIkRPTU1vdXNlU2Nyb2xsIixjLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX0sdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXtiPT0ibW91c2V3aGVlbCImJmVsbXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTW91c2VTY3JvbGwiLGMsITEpLGEmJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSx0aGlzLmV2ZW50PWZ1bmN0aW9uKGEpe3JldHVybiBhfSx0aGlzLnRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LHRoaXMucmVsYXRlZFRhcmdldD1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZWxhdGVkVGFyZ2V0fSx0aGlzLmlzUmlnaHRNb3VzZUJ1dHRvbj1mdW5jdGlvbihhKXt2YXIgYj0hMTtpZihhLndoaWNoPT0yfHxhLndoaWNoPT0zKWI9ITA7cmV0dXJuIGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk6ZG9jdW1lbnQuYXR0YWNoRXZlbnQmJih0aGlzLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKHRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYykhPS0xKXJldHVybjt2YXIgZD1mdW5jdGlvbigpe3ZhciBiPXdpbmRvdy5ldmVudDtGdW5jdGlvbi5wcm90b3R5cGUuY2FsbD9jLmNhbGwoYSxiKTooYS5fY3VycmVudExpc3RlbmVyPWMsYS5fY3VycmVudExpc3RlbmVyKGIpLGEuX2N1cnJlbnRMaXN0ZW5lcj1udWxsKX07YS5hdHRhY2hFdmVudCgib24iK2IsZCk7dmFyIGU9e3RhcmdldDphLGV2ZW50TmFtZTpiLGhhbmRsZXI6YyxoYW5kbGVyMjpkfSxmPWEuZG9jdW1lbnR8fGEsZz1mLnBhcmVudFdpbmRvdyxoPSJsIit0aGlzLl9saXN0ZW5lckNvdW50ZXIrKztnLl9hbGxMaXN0ZW5lcnN8fChnLl9hbGxMaXN0ZW5lcnM9e30pLGcuX2FsbExpc3RlbmVyc1toXT1lLGEuX2xpc3RlbmVyc3x8KGEuX2xpc3RlbmVycz1bXSksYS5fbGlzdGVuZXJzW2EuX2xpc3RlbmVycy5sZW5ndGhdPWgsZy5fdW5sb2FkTGlzdGVuZXJBZGRlZHx8KGcuX3VubG9hZExpc3RlbmVyQWRkZWQ9ITAsZy5hdHRhY2hFdmVudCgib251bmxvYWQiLHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycykpfSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKGEpe3ZhciBkPXRoaXMuX2ZpbmRMaXN0ZW5lcihhLGIsYyk7aWYoZD09LTEpcmV0dXJuO3ZhciBlPWEuZG9jdW1lbnR8fGEsZj1lLnBhcmVudFdpbmRvdyxnPWEuX2xpc3RlbmVyc1tkXSxoPWYuX2FsbExpc3RlbmVyc1tnXTthLmRldGFjaEV2ZW50KCJvbiIrYixoLmhhbmRsZXIyKSxhLl9saXN0ZW5lcnMuc3BsaWNlKGQsMSksZGVsZXRlIGYuX2FsbExpc3RlbmVyc1tnXX19LHRoaXMuZXZlbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5ldmVudH0sdGhpcy50YXJnZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3JjRWxlbWVudH0sdGhpcy5yZWxhdGVkVGFyZ2V0PWZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7cmV0dXJuIGEudHlwZT09Im1vdXNlb3ZlciI/Yj1hLmZyb21FbGVtZW50OmEudHlwZT09Im1vdXNlb3V0IiYmKGI9YS50b0VsZW1lbnQpLGJ9LHRoaXMuaXNSaWdodE1vdXNlQnV0dG9uPWZ1bmN0aW9uKGEpe3ZhciBiPSExO3JldHVybiBhLmJ1dHRvbj09MiYmKGI9ITApLGJ9LHRoaXMucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oYSl7YSYmKGEucmV0dXJuVmFsdWU9ITEpfSx0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihhKXthLmNhbmNlbEJ1YmJsZT0hMH0sdGhpcy5fZmluZExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLl9saXN0ZW5lcnM7aWYoIWQpcmV0dXJuLTE7dmFyIGU9YS5kb2N1bWVudHx8YSxmPWUucGFyZW50V2luZG93O2Zvcih2YXIgZz1kLmxlbmd0aC0xO2c+PTA7Zy0tKXt2YXIgaD1kW2ddLGk9Zi5fYWxsTGlzdGVuZXJzW2hdO2lmKGkuZXZlbnROYW1lPT1iJiZpLmhhbmRsZXI9PWMpcmV0dXJuIGd9cmV0dXJuLTF9LHRoaXMuX3JlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7Zm9yKGlkIGluIGEuX2FsbExpc3RlbmVycyl7dmFyIGI9YS5fYWxsTGlzdGVuZXJzW2lkXTtiLnRhcmdldC5kZXRhY2hFdmVudCgib24iK2IuZXZlbnROYW1lLGIuaGFuZGxlcjIpLGRlbGV0ZSBhLl9hbGxMaXN0ZW5lcnNbaWRdfX0sdGhpcy5fbGlzdGVuZXJDb3VudGVyPTApfSx6MTY0OmZ1bmN0aW9uKCl7Wi5icm93c2Vycz17VU5LTk9XTjowLElFOjEsRklSRUZPWDoyLFNBRkFSSTozLENIUk9NRTo0LE9QRVJBOjV9O3ZhciBhPVouYnJvd3NlcnMuVU5LTk9XTixiPTAsYz1uYXZpZ2F0b3IuYXBwTmFtZSxkPW5hdmlnYXRvci5hcHBWZXJzaW9uLGU9ITEsZj0hMSxnPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtpZihjIT0iTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyInx8IXdpbmRvdy5hdHRhY2hFdmVudHx8IXdpbmRvdy5BY3RpdmVYT2JqZWN0KWlmKGMhPSJOZXRzY2FwZSJ8fCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciljPT0iT3BlcmEiJiYhIXdpbmRvdy5vcGVyYSYmISF3aW5kb3cuYXR0YWNoRXZlbnQmJihhPVouYnJvd3NlcnMuT1BFUkEsYj1wYXJzZUZsb2F0KGQpKTtlbHNle3ZhciBpPWcuaW5kZXhPZigiZmlyZWZveCIpLGo9Zy5pbmRleE9mKCJzYWZhcmkiKSxrPWcuaW5kZXhPZigiY2hyb21lIik7aWYoaT49MClhPVouYnJvd3NlcnMuRklSRUZPWCxiPXBhcnNlRmxvYXQoZy5zdWJzdHJpbmcoaSs4KSk7ZWxzZSBpZihqPj0wKXt2YXIgbD1nLnN1YnN0cmluZygwLGopLmxhc3RJbmRleE9mKCIvIik7YT1rPj0wP1ouYnJvd3NlcnMuQ0hST01FOlouYnJvd3NlcnMuU0FGQVJJLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhsKzEsaikpfXZhciBtPW5ldyBJbWFnZTttLnN0eWxlLmdldFByb3BlcnR5VmFsdWUmJihmPW0uc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgiaW1hZ2UtcmVuZGVyaW5nIikpfWVsc2V7dmFyIGg9Zy5pbmRleE9mKCJtc2llIik7YT1aLmJyb3dzZXJzLklFLGI9cGFyc2VGbG9hdChnLnN1YnN0cmluZyhoKzUsZy5pbmRleE9mKCI7IixoKSkpLGU9dHlwZW9mIGRvY3VtZW50LmRvY3VtZW50TW9kZSE9InVuZGVmaW5lZCJ9dmFyIG49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxvPW4uc3R5bGV8fHt9LHA9ITEscT1bInRyYW5zZm9ybSIsIldlYmtpdFRyYW5zZm9ybSIsIk1velRyYW5zZm9ybSJdLHIsczt3aGlsZShyPXEuc2hpZnQoKSlpZih0eXBlb2Ygb1tyXSE9InVuZGVmaW5lZCIpe3A9ITAscz0vd2Via2l0L2kudGVzdChyKTticmVha312YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0JiZkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpLHU9IShhPT1aLmJyb3dzZXJzLlNBRkFSSSYmYjw0fHxhPT1aLmJyb3dzZXJzLkNIUk9NRSYmYjwyKSx2PXQmJnUsdz0hKGE9PVouYnJvd3NlcnMuSUV8fGE9PVouYnJvd3NlcnMuQ0hST01FJiZiPDIpLHg9ZXx8Zj8iaGlnaCI6bnVsbCx5PWcuaW5kZXhPZigiYW5kcm9pZCIpPi0xfHxnLmluZGV4T2YoImlwaG9uZSIpPi0xfHxnLmluZGV4T2YoImlwYWQiKT4tMXx8Zy5pbmRleE9mKCJpcG9kIik+LTE7Wi5icm93c2VyPWEsWi5icm93c2VyVmVyc2lvbj1iLFouY2FudmFzU3VwcG9ydGVkPXYsWi51c2VDYW52YXM9Wi5jYW52YXNTdXBwb3J0ZWQsWi5jc3NUcmFuc2Zvcm1zU3VwcG9ydGVkPXAsWi5jc3NUcmFuc2Zvcm1Qcm9wZXJ0eT1yLFouY3NzVHJhbnNmb3JtTm9Vbml0cz1zLFouYWxwaGFTdXBwb3J0ZWQ9dyxaLnJlbmRlclF1YWxpdHk9eCxaLm1vYmlsZURldmljZT15fSxpc1N0clZhbDpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbCYmYSE9IiJ9LHoxNzQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPTAsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKTt3aGlsZShlKXtiKz1hLm9mZnNldExlZnQsYys9YS5vZmZzZXRUb3A7aWYoZCl7dmFyIGY9dGhpcy56MTg0KCk7Yis9Zi54LGMrPWYueX1hPWUsZD10aGlzLnoxNzYoYSkucG9zaXRpb249PSJmaXhlZCIsZT10aGlzLnoxODMoYSxkKX1yZXR1cm4gbmV3IHRoaXMuUG9pbnQoYixjKX0sejE4MzpmdW5jdGlvbihhLGIpe3JldHVybiBiJiZhIT1kb2N1bWVudC5ib2R5P2RvY3VtZW50LmJvZHk6YS5vZmZzZXRQYXJlbnR9LHoxNzU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB0aGlzLlBvaW50KGEuY2xpZW50V2lkdGgsYS5jbGllbnRIZWlnaHQpfSx6MTc2OmZ1bmN0aW9uKGEpe2lmKGEuY3VycmVudFN0eWxlKXJldHVybiBhLmN1cnJlbnRTdHlsZTtpZih3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSlyZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoYSwiIik7dGhpcy56MjU1KHRoaXMuejE4NSgiejkzIikpfSx6MTc3OmZ1bmN0aW9uKGEpe3JldHVybiB6MTc0KFouVXRpbHMudGFyZ2V0KGEpKX0sejE3ODpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9YS50b3VjaGVzLGQ9YS5jaGFuZ2VkVG91Y2hlcztyZXR1cm4gYyE9PXVuZGVmaW5lZD9iPWNbMF06ZCE9PXVuZGVmaW5lZCYmKGI9ZFswXSksYn0sejE4MTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9MDtyZXR1cm4gYS50eXBlPT0iRE9NTW91c2VTY3JvbGwiJiZicm93c2VyPT1Ccm93c2VyLkZJUkVGT1gmJmJyb3dzZXJWZXJzaW9uPDM/KGI9YS5zY3JlZW5YLGM9YS5zY3JlZW5ZKTp0eXBlb2YgYS5wYWdlWD09Im51bWJlciI/KGI9YS5wYWdlWCxjPWEucGFnZVkpOnR5cGVvZiBhLmNsaWVudFg9PSJudW1iZXIiPyhiPWEuY2xpZW50WCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQrZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsYz1hLmNsaWVudFkrZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ArZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCk6dGhpcy56MjU1KHRoaXMuejE4NSgiejk0IikpLG5ldyB0aGlzLlBvaW50KGIsYyl9LHoxODI6ZnVuY3Rpb24oYSl7dmFyIGI9MDtyZXR1cm4gdHlwZW9mIGEud2hlZWxEZWx0YT09Im51bWJlciI/Yj1hLndoZWVsRGVsdGE6dHlwZW9mIGEuZGV0YWlsPT0ibnVtYmVyIj9iPWEuZGV0YWlsKi0xOnRoaXMuejI1NSh0aGlzLnoxODUoIno5NSIpKSxiP2IvTWF0aC5hYnMoYik6MH0sejE4NDpmdW5jdGlvbigpe3ZhciBhPTAsYj0wLGM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx7fSxkPWRvY3VtZW50LmJvZHl8fHt9O2lmKHR5cGVvZiB3aW5kb3cucGFnZVhPZmZzZXQ9PSJudW1iZXIiKWE9d2luZG93LnBhZ2VYT2Zmc2V0LGI9d2luZG93LnBhZ2VZT2Zmc2V0O2Vsc2UgaWYoZC5zY3JvbGxMZWZ0fHxkLnNjcm9sbFRvcClhPWQuc2Nyb2xsTGVmdCxiPWQuc2Nyb2xsVG9wO2Vsc2UgaWYoYy5zY3JvbGxMZWZ0fHxjLnNjcm9sbFRvcClhPWMuc2Nyb2xsTGVmdCxiPWMuc2Nyb2xsVG9wO3JldHVybiBuZXcgdGhpcy5Qb2ludChhLGIpfSx6MjAxaW5kb3dTaXplOmZ1bmN0aW9uKCl7dmFyIGE9MCxiPTAsYz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fHt9LGQ9ZG9jdW1lbnQuYm9keXx8e307cmV0dXJuIHR5cGVvZiB3aW5kb3cuaW5uZXJXaWR0aD09Im51bWJlciI/KGE9d2luZG93LmlubmVyV2lkdGgsYj13aW5kb3cuaW5uZXJIZWlnaHQpOmMuY2xpZW50V2lkdGh8fGMuY2xpZW50SGVpZ2h0PyhhPWMuY2xpZW50V2lkdGgsYj1jLmNsaWVudEhlaWdodCk6ZC5jbGllbnRXaWR0aHx8ZC5jbGllbnRIZWlnaHQ/KGE9ZC5jbGllbnRXaWR0aCxiPWQuY2xpZW50SGVpZ2h0KTp0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTYiKSksbmV3IHRoaXMuUG9pbnQoYSxiKX0sejIyNTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPWE7d2hpbGUoYj09ITEpaWYoYyljLmlkP2MuaWQ9PSJWaWV3ZXJEaXNwbGF5Ij9iPSEwOmM9Yy5wYXJlbnROb2RlOmM9Yy5wYXJlbnROb2RlO2Vsc2UgYnJlYWs7cmV0dXJuIGJ9LHoyMzg6ZnVuY3Rpb24oYSl7dmFyIGI9YSsiPSIsYz1kb2N1bWVudC5jb29raWUuc3BsaXQoIjsiKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTt3aGlsZShlLmNoYXJBdCgwKT09IiAiKWU9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aCk7aWYoZS5pbmRleE9mKGIpPT0wKXJldHVybiBlLnN1YnN0cmluZyhiLmxlbmd0aCxlLmxlbmd0aCl9cmV0dXJuIG51bGx9LHoyNDM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5zbGljZSgtMSxhLmxlbmd0aCk9PSIvIj9hLnNsaWNlKDAsYS5sZW5ndGgtMSk6YTtyZXR1cm4gYj1hLnNsaWNlKDAsMSk9PSIvIj9hLnNsaWNlKDEsYS5sZW5ndGgpOmEsYn0sejE0MDpmdW5jdGlvbihhKXtpZihaLmJyb3dzZXI9PVouYnJvd3NlcnMuSUUpe3ZhciBiPShuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCksYz1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCksZD1jK2I7YSs9Ij9zdWZmaXhUb0Jsb2NrUGF0aENhY2hpbmc9IitkfXJldHVybiBhfSx6MTcwOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybihhLz1kLzIpPDE/Yy8yKmEqYSphKmEqYStiOmMvMiooKGEtPTIpKmEqYSphKmErMikrYn0sejIzMzpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gYSYmKGI9YS5zcGxpdCgiJiIpKSxifSx6MjQ5OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuejE4NSgiejUwIiksYz10aGlzLnoxODUoIno0OSIpLGQ9dGhpcy56MTg1KCJ6NDgiKTtaLnNraW5QYXRoPXRoaXMuejE4NSgiejU2IiksWi5za2luTW9kZT10aGlzLnoxODUoIno1NCIpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjYiKSkpfHwoWi5pbml0aWFsWD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejI2IikpKSxpc05hTihwYXJzZUZsb2F0KHRoaXMuejE4NSgiejI3IikpKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdCh0aGlzLnoxODUoInoyNyIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoInoyOCIpKSl8fChaLmluaXRpYWxaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MjgiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpfHwoWi5taW5aPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzMiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpfHwoWi5tYXhaPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MzIiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6ODAiKSkpfHwoWi56b29tU3BlZWQ9cGFyc2VGbG9hdCh0aGlzLnoxODUoIno4MCIpKSksaXNOYU4ocGFyc2VGbG9hdCh0aGlzLnoxODUoIno0NiIpKSl8fChaLnBhblNwZWVkPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NDYiKSkpLGlzTmFOKHBhcnNlRmxvYXQodGhpcy56MTg1KCJ6MTgiKSkpfHwoWi5mYWRlSW5TcGVlZD1wYXJzZUZsb2F0KHRoaXMuejE4NSgiejE4IikpKSxaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KHRoaXMuejE4NSgiejY0IiksMTApLFoudG9vbGJhclBvc2l0aW9uPXBhcnNlRmxvYXQodGhpcy56MTg1KCJ6NjMiKSksWi50b29sdGlwc1Zpc2libGU9dGhpcy56MTg1KCJ6NjUiKSE9IjAiLFoubmF2aWdhdG9yVmlzaWJsZT1wYXJzZUludCh0aGlzLnoxODUoIno0MyIpLDEwKSxaLm5hdmlnYXRvclc9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDQiKSwxMCksWi5uYXZpZ2F0b3JIPXBhcnNlSW50KHRoaXMuejE4NSgiejM5IiksMTApLFoubmF2aWdhdG9yTD1wYXJzZUludCh0aGlzLnoxODUoIno0MCIpLDEwKSxaLm5hdmlnYXRvclQ9cGFyc2VJbnQodGhpcy56MTg1KCJ6NDIiKSwxMCksWi5uYXZpZ2F0b3JGaXQ9dGhpcy56MTg1KCJ6MzgiKSxaLmNsaWNrWm9vbT10aGlzLnoxODUoInoxMCIpIT0iMCIsWi5jbGlja1Bhbj10aGlzLnoxODUoIno5IikhPSIwIixaLm1vdXNlUGFuPXRoaXMuejE4NSgiejM0IikhPSIwIixaLmtleXM9dGhpcy56MTg1KCJ6MjkiKSE9IjAiLFouY29uc3RyYWluUGFuPXRoaXMuejE4NSgiejEyIikhPSIwIixaLnNsaWRlclZpc2libGU9dGhpcy56MTg1KCJ6NTgiKSE9IjAiLFouZnVsbFBhZ2VWaXNpYmxlPXRoaXMuejE4NSgiejIzIikhPSIwIixaLnByb2dyZXNzVmlzaWJsZT10aGlzLnoxODUoIno1MyIpIT0iMCIsWi5sb2dvVmlzaWJsZT10aGlzLnoxODUoInozMSIpIT0iMCIsWi5sb2dvQ3VzdG9tUGF0aD10aGlzLnoxODUoInozMCIpLFouY2FudmFzPXRoaXMuejE4NSgiejgiKSE9IjAiLFouZGVidWc9dGhpcy56MTg1KCJ6MTciKSE9IjAiO2lmKHRoaXMuaXNTdHJWYWwoYSkpZm9yKHZhciBlPTAsZj1hLmxlbmd0aDtlPGY7ZSsrKXt2YXIgZz1hW2VdLGg9Zy5pbmRleE9mKCI9Iik7aWYoaD4wKXt2YXIgaT1nLnN1YnN0cmluZygwLGgpLGo9Zy5zdWJzdHJpbmcoaCsxKTtpZih0aGlzLmlzU3RyVmFsKGopKXN3aXRjaChpKXtjYXNlInpJbml0aWFsWCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLmluaXRpYWxYPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2UiekluaXRpYWxZIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFouaW5pdGlhbFk9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6SW5pdGlhbFpvb20iOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5pbml0aWFsWj1wYXJzZUZsb2F0KGopLFouaW5pdGlhbFomJihaLmluaXRpYWxaLz0xMDApKTticmVhaztjYXNlInpNaW5ab29tIjohaXNOYU4ocGFyc2VGbG9hdChqKSkmJnBhcnNlRmxvYXQoaik+LjAxJiYoWi5taW5aPXBhcnNlRmxvYXQoaiksWi5taW5aJiYoWi5taW5aLz0xMDApKTticmVhaztjYXNlInpNYXhab29tIjppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubWF4Wj1wYXJzZUZsb2F0KGopLFoubWF4WiYmKFoubWF4Wi89MTAwKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9yVmlzaWJsZSI6Wi5uYXZpZ2F0b3JWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UielRvb2xiYXJWaXNpYmxlIjpaLnRvb2xiYXJWaXNpYmxlPXBhcnNlSW50KGosMTApO2JyZWFrO2Nhc2UiekxvZ29WaXNpYmxlIjpqPT0iMCImJihaLmxvZ29WaXNpYmxlPSExKTticmVhaztjYXNlInpTbGlkZXJWaXNpYmxlIjpqPT0iMCImJihaLnNsaWRlclZpc2libGU9ITEpO2JyZWFrO2Nhc2UiekZ1bGxQYWdlVmlzaWJsZSI6aj09IjAiJiYoWi5mdWxsUGFnZVZpc2libGU9ITEpO2JyZWFrO2Nhc2UielByb2dyZXNzVmlzaWJsZSI6aj09IjAiJiYoWi5wcm9ncmVzc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielRvb2x0aXBzVmlzaWJsZSI6aj09IjAiJiYoWi50b29sdGlwc1Zpc2libGU9ITEpO2JyZWFrO2Nhc2UielNraW5QYXRoIjpaLnNraW5QYXRoPWo7YnJlYWs7ZGVmYXVsdDppZihiPT1jKWFsZXJ0KGQrIiAiK2kpO2Vsc2Ugc3dpdGNoKGkpe2Nhc2Uielpvb21TcGVlZCI6Wi56b29tU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6UGFuU3BlZWQiOloucGFuU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6RmFkZUluU3BlZWQiOlouZmFkZUluU3BlZWQ9cGFyc2VJbnQoaiwxMCk7YnJlYWs7Y2FzZSJ6VG9vbGJhclBvc2l0aW9uIjpaLnRvb2xiYXJQb3NpdGlvbj1wYXJzZUludChqLDEwKTticmVhaztjYXNlInpOYXZpZ2F0b3JXaWR0aCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvclc9cGFyc2VGbG9hdChqKSk7YnJlYWs7Y2FzZSJ6TmF2aWdhdG9ySGVpZ2h0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9ySD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JMZWZ0Ijppc05hTihwYXJzZUZsb2F0KGopKXx8KFoubmF2aWdhdG9yTD1wYXJzZUZsb2F0KGopKTticmVhaztjYXNlInpOYXZpZ2F0b3JUb3AiOmlzTmFOKHBhcnNlRmxvYXQoaikpfHwoWi5uYXZpZ2F0b3JUPXBhcnNlRmxvYXQoaikpO2JyZWFrO2Nhc2Uiek5hdmlnYXRvckZpdCI6aXNOYU4ocGFyc2VGbG9hdChqKSl8fChaLm5hdmlnYXRvckZpdD1wYXJzZUludChqLDEwKSk7YnJlYWs7Y2FzZSJ6Q2xpY2tab29tIjpqPT0iMCImJihaLmNsaWNrWm9vbT0hMSk7YnJlYWs7Y2FzZSJ6Q2xpY2tQYW4iOmo9PSIwIiYmKFouY2xpY2tQYW49ITEpO2JyZWFrO2Nhc2Uiek1vdXNlUGFuIjpqPT0iMCImJihaLm1vdXNlUGFuPSExKTticmVhaztjYXNlInpLZXlzIjpqPT0iMCImJihaLmtleXM9ITEpO2JyZWFrO2Nhc2UiekNvbnN0cmFpblBhbiI6aj09IjAiJiYoWi5jb25zdHJhaW5QYW49ITEpO2JyZWFrO2Nhc2UiekNvcHlyaWdodFBhdGgiOlouY29weXJpZ2h0UGF0aD1qO2JyZWFrO2Nhc2UieldhdGVybWFya1BhdGgiOloud2F0ZXJtYXJrUGF0aD1qO2JyZWFrO2Nhc2UiekxvZ29DdXN0b21QYXRoIjpaLmxvZ29DdXN0b21QYXRoPWo7YnJlYWs7Y2FzZSJ6Q2FudmFzIjpqPT0iMCImJihaLmNhbnZhcz0hMSk7aWYoIVouY2FudmFzU3VwcG9ydGVkfHwhWi5jYW52YXMpWi51c2VDYW52YXM9ITE7YnJlYWs7Y2FzZSJ6RGVidWciOmo9PSIxIiYmKFouZGVidWc9ITApfX19fX0sejI0MjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MTtiPGEubGVuZ3RoOylhW2ItMV09PWFbYl0/YS5zcGxpY2UoYiwxKTpiKys7cmV0dXJuIGF9LGludGVyc2VjdDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdLGY9ITE7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aCYmZT49KGVsbXQyPWJbZ10pO2crKylpZihlbG10Mj09ZSl7Zj0hMDticmVha31mJiZjLnB1c2goYVtkXSl9cmV0dXJuIGN9LHN1YnRyYWN0OmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10sZT0hMTtmb3IodmFyIGY9MDtmPGIubGVuZ3RoJiZkPj0oZWxtdDI9YltmXSk7ZisrKWlmKGVsbXQyPT1kKXtlPSEwO2JyZWFrfWUmJmEuc3BsaWNlKGMtLSwxKX1yZXR1cm4gYX0sY3JlYXRlQ2FsbGJhY2s6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IodmFyIGQ9MixlPWFyZ3VtZW50cy5sZW5ndGg7ZDxlO2QrKyljLnB1c2goYXJndW1lbnRzW2RdKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1jLmNvbmNhdChbXSk7Zm9yKHZhciBlPTAsZj1hcmd1bWVudHMubGVuZ3RoO2U8ZjtlKyspZC5wdXNoKGFyZ3VtZW50c1tlXSk7cmV0dXJuIGIuYXBwbHkoYSxkKX19LHoyNTU6ZnVuY3Rpb24oYSl7YWxlcnQoYSl9LGNyZWF0ZUNvbnRhaW5lckVsZW1lbnQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8pe3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYSk7dGhpcy5pc1N0clZhbChiKSYmKHAuaWQ9Yik7dmFyIHE9cC5zdHlsZTtyZXR1cm4gcS5kaXNwbGF5PXRoaXMuaXNTdHJWYWwoYyk/YzoiaW5saW5lLWJsb2NrIixxLnBvc2l0aW9uPXRoaXMuaXNTdHJWYWwoZCk/ZDoic3RhdGljIixxLm92ZXJmbG93PXRoaXMuaXNTdHJWYWwoZSk/ZToiaGlkZGVuIixhPT0iY2FudmFzIj8odGhpcy5pc1N0clZhbChmKSYmcC5zZXRBdHRyaWJ1dGUoIndpZHRoIixmKSx0aGlzLmlzU3RyVmFsKGcpJiZwLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixnKSk6KHRoaXMuaXNTdHJWYWwoZikmJihxLndpZHRoPWYpLHRoaXMuaXNTdHJWYWwoZyYmZykmJihxLmhlaWdodD1nKSksdGhpcy5pc1N0clZhbChoKSYmKHEubGVmdD1oKSx0aGlzLmlzU3RyVmFsKGkpJiYocS50b3A9aSkscS5ib3JkZXJTdHlsZT10aGlzLmlzU3RyVmFsKGopP2o6Im5vbmUiLHEuYm9yZGVyV2lkdGg9dGhpcy5pc1N0clZhbChrKT9rOiIwcHgiLHEuYmFja2dyb3VuZD10aGlzLmlzU3RyVmFsKGwpP2w6InRyYW5zcGFyZW50IG5vbmUiLHEubWFyZ2luPXRoaXMuaXNTdHJWYWwobSk/bToiMHB4IixxLnBhZGRpbmc9dGhpcy5pc1N0clZhbChuKT9uOiIwcHgiLHRoaXMuaXNTdHJWYWwobykmJihxLmN1cnNvcj1vKSxwfSxjcmVhdGVDZW50ZXJlZEVsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiKSxjPVtdO2MucHVzaCgnPGRpdiBzdHlsZT0iZGlzcGxheTp0YWJsZTsgaGVpZ2h0OjEwMCU7IHdpZHRoOjEwMCU7JyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCcjcG9zaXRpb246cmVsYXRpdmU7IG92ZXJmbG93OmhpZGRlbjsgdGV4dC1hbGlnbjpsZWZ0OyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246YWJzb2x1dGU7ICN0b3A6NTAlOyB3aWR0aDoxMDAlOyAnKSxjLnB1c2goImJvcmRlcjpub25lOyBtYXJnaW46MHB4OyBwYWRkaW5nOjBweDsiKSxjLnB1c2goJ2Rpc3BsYXk6dGFibGUtY2VsbDsgdmVydGljYWwtYWxpZ246bWlkZGxlOyI+JyksYy5wdXNoKCc8ZGl2IHN0eWxlPSIjcG9zaXRpb246cmVsYXRpdmU7ICN0b3A6LTUwJTsgd2lkdGg6MTAwJTsgJyksYy5wdXNoKCJib3JkZXI6bm9uZTsgbWFyZ2luOjBweDsgcGFkZGluZzowcHg7IiksYy5wdXNoKCd0ZXh0LWFsaWduOmNlbnRlcjsiPjwvZGl2PjwvZGl2PjwvZGl2PicpLGIuaW5uZXJIVE1MPWMuam9pbigiIiksYj1iLmZpcnN0Q2hpbGQ7dmFyIGQ9YixlPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO3doaWxlKGUubGVuZ3RoPjApZD1lWzBdLGU9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7cmV0dXJuIGQuYXBwZW5kQ2hpbGQoYSksYn0sY3JlYXRlR3JhcGhpY0VsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJpbWciKSxjPW51bGw7cmV0dXJuIFouYnJvd3Nlcj09Wi5icm93c2Vycy5JRSYmWi5icm93c2VyVmVyc2lvbjw3PyhjPXRoaXMuY3JlYXRlQ29udGFpbmVyRWxlbWVudCgic3BhbiIsbnVsbCwiaW5saW5lLWJsb2NrIiksYi5vbmxvYWQ9ZnVuY3Rpb24oKXtjLnN0eWxlLndpZHRoPWMuc3R5bGUud2lkdGh8fGIud2lkdGgrInB4IixjLnN0eWxlLmhlaWdodD1jLnN0eWxlLmhlaWdodHx8Yi5oZWlnaHQrInB4IixiLm9ubG9hZD1udWxsLGI9bnVsbH0sYy5zdHlsZS5maWx0ZXI9InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKHNyYz0nIithKyInLCBzaXppbmdNZXRob2Q9J3NjYWxlJykiKTooYz1iLGMuc3JjPWEpLGN9LHoyNTE6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksaixrLGwpe3ZhciBtPWEucGFyZW50Tm9kZS5zdHlsZTttLmNvbG9yPWIsbS5mb250RmFtaWx5PWMsbS5mb250U2l6ZT1kLG0uZm9udFNpemVBZGp1c3Q9ZSxtLmZvbnRTdHlsZT1mLG0uZm9udFN0cmV0Y2g9ZyxtLmZvbnRWYXJpYW50PWgsbS5mb250V2VpZ2h0PWksbS5saW5lSGVpZ2h0PWosbS50ZXh0QWxpZ249ayxtLnRleHREZWNvcmF0aW9uPWx9LHoxNTg6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDtpZih3aW5kb3cuQWN0aXZlWE9iamVjdCl0cnl7Yj1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGIuYXN5bmM9ITEsYi5sb2FkWE1MKGEpfWNhdGNoKGMpe3RoaXMuejI1NShjLm5hbWUrdGhpcy56MTg1KCJ6ODIiKStjLm1lc3NhZ2UpfWVsc2UgaWYod2luZG93LkRPTVBhcnNlcil0cnl7dmFyIGQ9bmV3IERPTVBhcnNlcjtiPWQucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIil9Y2F0Y2goYyl7dGhpcy56MjU1KGMubmFtZSt0aGlzLnoxODUoIno4MiIpK2MubWVzc2FnZSl9ZWxzZSB0aGlzLnoyNTUodGhpcy56MTg1KCJ6OTgiKSk7cmV0dXJuIGJ9LFBvaW50OmZ1bmN0aW9uKGEsYil7dGhpcy54PXR5cGVvZiBhPT0ibnVtYmVyIj9hOjAsdGhpcy55PXR5cGVvZiBiPT0ibnVtYmVyIj9iOjB9LFBvaW50M0Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMueD10eXBlb2YgYT09Im51bWJlciI/YTowLHRoaXMueT10eXBlb2YgYj09Im51bWJlciI/YjowLHRoaXMuej10eXBlb2YgYz09Im51bWJlciI/YzowfSx6MTg1OmZ1bmN0aW9uKGEpe3ZhciBiPSIiO3N3aXRjaChhKXtjYXNlIno1MCI6Yj0iRW5hYmxlIERldmVsb3BlciBwYXJhbWV0ZXJzIjticmVhaztjYXNlIno0OSI6Yj0iQ2hhbmdpbmcgVGhpcyBWaW9sYXRlcyBMaWNlbnNlIEFncmVlbWVudCI7YnJlYWs7Y2FzZSJ6NDgiOmI9IlN1cHBvcnQgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIGVuYWJsZWQgb25seSBpbiB0aGUgWm9vbWlmeSBJbWFnZSBWaWV3ZXIgaW5jbHVkZWQgaW4gdGhlIFpvb21pZnkgSFRNTDUgRGV2ZWxvcGVyIGVkaXRpb246ICI7YnJlYWs7Y2FzZSJ6MjUiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NjAiOmI9IjMwMDAwIjticmVhaztjYXNlIno2MSI6Yj0iMjU2IjticmVhaztjYXNlIno1OSI6Yj0iMS4xNSI7YnJlYWs7Y2FzZSJ6NjIiOmI9IjMwMCI7YnJlYWs7Y2FzZSJ6NyI6Yj0iNiI7YnJlYWs7Y2FzZSJ6NiI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NSI6Yj0iMyI7YnJlYWs7Y2FzZSJ6NCI6Yj0iMiI7YnJlYWs7Y2FzZSJ6MyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6NDUiOmI9IjIiO2JyZWFrO2Nhc2UiejQ2IjpiPSI1IjticmVhaztjYXNlIno0NyI6Yj0iMTAiO2JyZWFrO2Nhc2UiejgwIjpiPSI1IjticmVhaztjYXNlIno4MSI6Yj0iMC4wMiI7YnJlYWs7Y2FzZSJ6NzciOmI9IjMwIjticmVhaztjYXNlIno3OCI6Yj0iMjAwIjticmVhaztjYXNlIno3OSI6Yj0iMTAiO2JyZWFrO2Nhc2UiejEwVElFUlNLSVBUSFJFU0hPTEQiOmI9IjAxLiI7YnJlYWs7Y2FzZSJ6MjQiOmI9IjEwIjticmVhaztjYXNlInoxOCI6Yj0iNSI7YnJlYWs7Y2FzZSJ6MTkiOmI9IjAuMDY3IjticmVhaztjYXNlIno2NCI6Yj0iNCI7YnJlYWs7Y2FzZSJ6NjMiOmI9IjEiO2JyZWFrO2Nhc2UiejY1IjpiPSIxIjticmVhaztjYXNlIno0MyI6Yj0iMiI7YnJlYWs7Y2FzZSJ6NDQiOmI9IjE1MCI7YnJlYWs7Y2FzZSJ6MzkiOmI9IjEwMCI7YnJlYWs7Y2FzZSJ6NDAiOmI9IjAiO2JyZWFrO2Nhc2UiejQyIjpiPSIwIjticmVhaztjYXNlInozOCI6Yj1udWxsO2JyZWFrO2Nhc2UiejM2IjpiPSIjZmZmZmZmIjticmVhaztjYXNlInozNk5PQUxQSEEiOmI9IiNmYmZhZmEiO2JyZWFrO2Nhc2UiejM1IjpiPSIwLjc1IjticmVhaztjYXNlIno0MSI6Yj0iYmx1ZSI7YnJlYWs7Y2FzZSJ6NTUiOmI9InNraW5GaWxlcy54bWwiO2JyZWFrO2Nhc2UiejU2IjpiPSJBc3NldHMvU2tpbnMvRGVmYXVsdCI7YnJlYWs7Y2FzZSJ6NTQiOmI9IjAiO2JyZWFrO2Nhc2UiejEyIjpiPSIxIjticmVhaztjYXNlIno1OCI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NTciOmI9IjEwIjticmVhaztjYXNlInoyMyI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MjIiOmI9IndoaXRlIjticmVhaztjYXNlInoyMSI6Yj0iWCI7YnJlYWs7Y2FzZSJ6MjAiOmI9Ilx0I0Y4RjhGOCI7YnJlYWs7Y2FzZSJ6NTMiOmI9IjEiO2JyZWFrO2Nhc2UiejUxIjpiPSI1MDAiO2JyZWFrO2Nhc2UiejUyIjpiPSIgIjticmVhaztjYXNlInozMSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MzAiOmI9bnVsbDticmVhaztjYXNlIno4IjpiPSIxIjticmVhaztjYXNlInoxNyI6Yj0iMCI7YnJlYWs7Y2FzZSJ6MTYiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6MTQiOmI9IndoaXRlIjticmVhaztjYXNlInoxMyI6Yj0iQWdyZWUiO2JyZWFrO2Nhc2UiejE1IjpiPSJFeGl0IjticmVhaztjYXNlIno3MyI6Yj0iMC42IjticmVhaztjYXNlIno3NCI6Yj0iMC4zMyI7YnJlYWs7Y2FzZSJ6NzYiOmI9IjUxMiI7YnJlYWs7Y2FzZSJ6NzUiOmI9IjM4NCI7YnJlYWs7Y2FzZSJ6MjYiOmI9bnVsbDticmVhaztjYXNlInoyNyI6Yj1udWxsO2JyZWFrO2Nhc2UiejI4IjpiPW51bGw7YnJlYWs7Y2FzZSJ6MzMiOmI9bnVsbDticmVhaztjYXNlInozMiI6Yj0iMSI7YnJlYWs7Y2FzZSJ6MTAiOmI9IjEiO2JyZWFrO2Nhc2UiejkiOmI9IjEiO2JyZWFrO2Nhc2UiejM0IjpiPSIxIjticmVhaztjYXNlInoyOSI6Yj0iMSI7YnJlYWs7Y2FzZSJ6NjciOmI9IlRoaXMgcGFuZWwgaXMgZW5hYmxlZCB1c2luZyB0aGUgSFRNTCBwYXJhbWV0ZXIgJ3pEZWJ1Zz0xJy4gSXQgY2FuIGJlIGNhbGxlZCBhcyBmb2xsb3dzOlxuXG4gICBaLlV0aWxzLnRyYWNlKCd2YWx1ZSB0byBkaXNwbGF5Jyk7ICBcblxuVGhlIGJ1dHRvbnMgYmVsb3cgZGlzcGxheSBvciBtb2RpZnkgaW1wb3J0YW50IHN0YXRlIHZhbHVlcy4gIFdlYiBkZXNpZ25lcnMgbmV3IHRvIEphdmFTY3JpcHQgd2lsbCBhbHNvIGJlbmVmaXQgZnJvbSB0aGUgY29uc29sZSwgdHJhY2UsIHByb2ZpbGluZywgYW5kIG90aGVyIGRlYnVnZ2luZyBmZWF0dXJlcyBvZiBsZWFkaW5nIGJyb3dzZXJzLiI7YnJlYWs7Y2FzZSJ6NjgiOmI9ImxpZ2h0Z3JheSI7YnJlYWs7Y2FzZSJ6NjYiOmI9IndoaXRlIjticmVhaztjYXNlIno2OSI6Yj0iU2hvdyBHbG9iYWxzIjticmVhaztjYXNlIno3MiI6Yj0iVG9nZ2xlIERpc3BsYXkiO2JyZWFrO2Nhc2UiejcwIjpiPSJUb2dnbGUgQmFja2ZpbGwiO2JyZWFrO2Nhc2UiejcxIjpiPSJUb2dnbGUgQ29uc3RyYWluIFBhbiI7YnJlYWs7Y2FzZSJ6OTkiOmI9IkJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdC4iO2JyZWFrO2Nhc2Uiejg3LUlNQUdFWE1MIjpiPSJFcnJvciBsb2FkaW5nIGltYWdlOiBwbGVhc2UgbWFrZSBzdXJlIGltYWdlIHBhdGggaW4gd2ViIHBhZ2UgbWF0Y2hlcyBpbWFnZSBmb2xkZXIgbG9jYXRpb24gb24gd2Vic2VydmVyLiI7YnJlYWs7Y2FzZSJ6ODctVE9PTEJBUlhNTCI6Yj0iRXJyb3IgbG9hZGluZyB0b29sYmFyOiBwbGVhc2UgdmVyaWZ5IHNraW4gZmlsZXMgYXJlIG9uIHdlYnNlcnZlciBpbiBzYW1lIGZvbGRlciBhcyB6MTIyLmpzIGZpbGUgYW5kIGFyZSBpbiBkZWZhdWx0IGZvbGRlciBzdHJ1Y3R1cmUgJ0Fzc2V0cy9Ta2lucy9EZWZhdWx0Jywgb3IgYWRkIHpTa2luUGF0aCBwYXJhbWV0ZXIgdG8gd2VicGFnZS4iO2JyZWFrO2Nhc2Uiejg3IjpiPSJFcnJvciBtYWtpbmcgbmV0d29yayByZXF1ZXN0OiBwb3NzaWJsZSBpbnZhbGlkIHBhdGggb3IgbmV0d29yayBlcnJvci4iO2JyZWFrO2Nhc2Uiejg0IjpiPSJJbWFnZSBmYWlsZWQgdG8gbG9hZDogcG9zc2libGUgaW52YWxpZCBwYXRoLCBtaXNzaW5nIGltYWdlLCBvciBuZXR3b3JrIGVycm9yLiI7YnJlYWs7Y2FzZSJ6ODkiOmI9IkVycm9yIHJlbGF0ZWQgdG8gbmV0d29yayBzZWN1cml0eTogIjticmVhaztjYXNlIno5MCI6Yj0iRXJyb3IgcmVsYXRlZCB0byBuZXR3b3JrIHN0YXR1czogIjticmVhaztjYXNlIno4MiI6Yj0iIGNvbnZlcnRpbmcgWE1MIHRleHQgdG8gWE1MIGRvYyAoRE9NUGFyc2VyKTogIjticmVhaztjYXNlIno5OCI6Yj0iQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFhNTCBET00uIjticmVhaztjYXNlInoxMDAiOmI9IlhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODYiOmI9IkltYWdlIFhNTCBpbnZhbGlkLiI7YnJlYWs7Y2FzZSJ6ODMiOmI9IiB3aGlsZSBleGVjdXRpbmcgY2FsbGJhY2s6ICI7YnJlYWs7Y2FzZSJ6ODUiOmI9IkltYWdlIHRpbWVkIG91dDogIjticmVhaztjYXNlIno4OCI6Yj0iTmF2aWdhdG9yIGltYWdlIGZhaWxlZCB0byBsb2FkOiBwb3NzaWJsZSBpbnZhbGlkIHBhdGgsIG1pc3NpbmcgaW1hZ2UsIG9yIG5ldHdvcmsgZXJyb3IuIjticmVhaztjYXNlIno5MSI6Yj0iU2tpbiBYTUwgaW52YWxpZC4iO2JyZWFrO2Nhc2UiejkyIjpiPSJUaGUgc2tpbiBYTUwgZmlsZSBoYXMgb25lIG9yIG1vcmUgZmF1bHR5IG5hbWUgbGluZXMuIjticmVhaztjYXNlIno5NyI6Yj0iV2F0ZXJtYXJrIGltYWdlIGZhaWxlZCB0byBsb2FkOiAiO2JyZWFrO2Nhc2UiejkzIjpiPSJVbmtub3duIGVsZW1lbnQgc3R5bGUgLSBubyBrbm93biBtZXRob2QgdG8gaWRlbnRpZnkuIjticmVhaztjYXNlIno5NCI6Yj0iVW5rbm93biBtb3VzZSBwb3NpdGlvbiAtIG5vIGtub3duIG1ldGhvZCB0byBjYWxjdWxhdGUuIjticmVhaztjYXNlIno5NSI6Yj0iVW5rbm93biBtb3VzZSBzY3JvbGwgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6OTYiOmI9IlVua25vd24gd2luZG93IHNpemUgLSBubyBrbm93biBtZXRob2QgdG8gY2FsY3VsYXRlLiI7YnJlYWs7Y2FzZSJ6MTA2IjpiPSJMYXVuY2ggWm9vbWlmeSBXZWJzaXRlIjticmVhaztjYXNlInoxMDciOmI9Ik1pbmltaXplIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEwNSI6Yj0iRXhwYW5kIFRvb2xiYXIiO2JyZWFrO2Nhc2UiejEyMCI6Yj0iWm9vbSBPdXQiO2JyZWFrO2Nhc2UiejExNCI6Yj0iWm9vbSBJbiBBbmQgT3V0IjticmVhaztjYXNlInoxMTkiOmI9Ilpvb20gSW4iO2JyZWFrO2Nhc2UiejEwOSI6Yj0iUGFuIExlZnQiO2JyZWFrO2Nhc2UiejExMSI6Yj0iUGFuIFVwIjticmVhaztjYXNlInoxMDgiOmI9IlBhbiBEb3duIjticmVhaztjYXNlInoxMTAiOmI9IlBhbiBSaWdodCI7YnJlYWs7Y2FzZSJ6MTEyIjpiPSJSZXNldCBJbml0aWFsIFZpZXciO2JyZWFrO2Nhc2UiejExOCI6Yj0iVG9nZ2xlIEZ1bGwgUGFnZSBWaWV3IjticmVhaztjYXNlInoxMDIiOmI9IkNhbmNlbCBGdWxsIFBhZ2UgVmlldyI7YnJlYWs7Y2FzZSJ6MTAzIjpiPSJBZ3JlZSB0byBjb3B5cmlnaHQgYW5kIHZpZXcgaW1hZ2VzIjticmVhaztjYXNlInoxMDQiOmI9IkV4aXQgYW5kIGRvIG5vdCB2aWV3IGltYWdlcyI7YnJlYWs7Y2FzZSJ6MTEzIjpiPSJUb2dnbGUgRnVsbCBQYWdlIFZpZXciO2JyZWFrO2Nhc2UiejExNyI6Yj0iVG9nZ2xlIFZpZXdwb3J0IERpc3BsYXkiO2JyZWFrO2Nhc2UiejExNSI6Yj0iVG9nZ2xlIFZpZXdwb3J0IEJhY2tmaWxsIjticmVhaztjYXNlInoxMTYiOmI9IlRvZ2dsZSBDb25zdHJhaW4gUGFuIjticmVhaztkZWZhdWx0OmI9IlVuZXhwZWN0ZWQgcmVzb3VyY2UgcmVxdWVzdCJ9cmV0dXJuIGJ9LHoyNTM6ZnVuY3Rpb24oKXt2YXIgYT0iIjthKz0iXG4iLGErPSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9PTUlGWSBJTUFHRSBWSUVXRVIgLSBDVVJSRU5UIFZBTFVFU1xuIixhKz0iXG4iLGErPSJJTUFHRSAmIFNLSU46ICAgICIsYSs9IlouaW1hZ2VQYXRoPSIrWi5pbWFnZVBhdGgrIiwgICAiLGErPSJaLnNraW5QYXRoPSIrWi5za2luUGF0aCsiLCAgICIsYSs9Ilouc2tpbk1vZGU9IitaLnNraW5Nb2RlKyIsICAgIixhKz0iWi5pbWFnZVc9IitaLmltYWdlVysiLCAgICIsYSs9IlouaW1hZ2VIPSIrWi5pbWFnZUgrIiwgICAiLGErPSJ0aWVyQ291bnQ9IitaLlZpZXdwb3J0LnoxODYoKSsiLCAgICIsYSs9IlRJTEVfU0laRT0iK1ouVmlld3BvcnQuejE5NSgpKyJcbiIsYSs9IlxuIixhKz0iUEFHRSAmIEJST1dTRVI6ICAgICIsYSs9IloucGFnZUNvbnRhaW5lcj0iK1oucGFnZUNvbnRhaW5lcisiLCAgICIsYSs9IlouYnJvd3Nlcj0iK1ouYnJvd3NlcisiLCAgICIsYSs9IlouYnJvd3NlclZlcnNpb249IitaLmJyb3dzZXJWZXJzaW9uKyIsICAgIixhKz0iWi5jYW52YXNTdXBwb3J0ZWQ9IitaLmNhbnZhc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZD0iK1ouY3NzVHJhbnNmb3Jtc1N1cHBvcnRlZCsiLCAgICIsYSs9IlouY3NzVHJhbnNmb3JtUHJvcGVydHk9IitaLmNzc1RyYW5zZm9ybVByb3BlcnR5KyIsICAgIixhKz0iWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzPSIrWi5jc3NUcmFuc2Zvcm1Ob1VuaXRzKyIsICAgIixhKz0iWi5hbHBoYVN1cHBvcnRlZD0iK1ouYWxwaGFTdXBwb3J0ZWQrIiwgICAiLGErPSJaLnJlbmRlclF1YWxpdHk9IitaLnJlbmRlclF1YWxpdHkrIiwgICAiLGErPSJaLm1vYmlsZURldmljZT0iK1oubW9iaWxlRGV2aWNlKyJcbiIsYSs9IlxuIixhKz0iVklFV0VSIE9QVElPTlMgJiBERUZBVUxUUzogICAgIixhKz0iWi5pbml0aWFsWD0iK1ouaW5pdGlhbFgrIiwgICAiLGErPSJaLmluaXRpYWxZPSIrWi5pbml0aWFsWSsiLCAgICIsYSs9IlouaW5pdGlhbFo9IitaLmluaXRpYWxaKyIsICAgIixhKz0iWi5taW5aPSIrWi5taW5aKyIsICAgIixhKz0iWi5tYXhaPSIrWi5tYXhaKyIsICAgIixhKz0iWi5maXRaPSIrWi5maXRaKyIsICAgIixhKz0iWi56b29tU3BlZWQ9IitaLnpvb21TcGVlZCsiLCAgICIsYSs9IloucGFuU3BlZWQ9IitaLnBhblNwZWVkKyIsICAgIixhKz0iWi5mYWRlSW5TcGVlZD0iK1ouZmFkZUluU3BlZWQrIiwgICAiLGErPSJaLnRvb2xiYXJWaXNpYmxlPSIrWi50b29sYmFyVmlzaWJsZSsiLCAgICIsYSs9IloudG9vbGJhclc9IitaLnRvb2xiYXJXKyIsICAgIixhKz0iWi50b29sYmFyQ3VycmVudFc9IitaLnRvb2xiYXJDdXJyZW50VysiLCAgICIsYSs9IloudG9vbGJhckg9IitaLnRvb2xiYXJIKyIsICAgIixhKz0iWi50b29sYmFyUG9zaXRpb249IitaLnRvb2xiYXJQb3NpdGlvbisiLCAgICIsYSs9IloudG9vbHRpcHNWaXNpYmxlPSIrWi50b29sdGlwc1Zpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclZpc2libGU9IitaLm5hdmlnYXRvclZpc2libGUrIiwgICAiLGErPSJaLm5hdmlnYXRvclc9IitaLm5hdmlnYXRvclcrIiwgICAiLGErPSJaLm5hdmlnYXRvckg9IitaLm5hdmlnYXRvckgrIiwgICAiLGErPSJaLm5hdmlnYXRvckw9IitaLm5hdmlnYXRvckwrIiwgICAiLGErPSJaLm5hdmlnYXRvclQ9IitaLm5hdmlnYXRvclQrIiwgICAiLGErPSJaLm5hdmlnYXRvckZpdD0iK1oubmF2aWdhdG9yRml0KyIsICAgIixhKz0iWi5jbGlja1pvb209IitaLmNsaWNrWm9vbSsiLCAgICIsYSs9IlouY2xpY2tQYW49IitaLmNsaWNrUGFuKyIsICAgIixhKz0iWi5tb3VzZVBhbj0iK1oubW91c2VQYW4rIiwgICAiLGErPSJaLmtleXM9IitaLmtleXMrIiwgICAiLGErPSJaLmNvbnN0cmFpblBhbj0iK1ouY29uc3RyYWluUGFuKyIsICAgIixhKz0iV2F0ZXJtYXJrIGFscGhhID0gIitaLlV0aWxzLnoxODUoIno3MyIpKyIsICAgIixhKz0iWi53YXRlcm1hcmtQYXRoPSIrWi53YXRlcm1hcmtQYXRoKyIsICAgIixhKz0iWi5jb3B5cmlnaHRQYXRoPSIrWi5jb3B5cmlnaHRQYXRoKyIsICAgIixhKz0iWi5zbGlkZXJWaXNpYmxlPSIrWi5zbGlkZXJWaXNpYmxlKyIsICAgIixhKz0iWi5mdWxsUGFnZVZpc2libGU9IitaLmZ1bGxQYWdlVmlzaWJsZSsiLCAgICIsYSs9IloucHJvZ3Jlc3NWaXNpYmxlPSIrWi5wcm9ncmVzc1Zpc2libGUrIiwgICAiLGErPSJaLmxvZ29WaXNpYmxlPSIrWi5sb2dvVmlzaWJsZSsiLCAgICIsYSs9IloubG9nb0N1c3RvbVBhdGg9IitaLmxvZ29DdXN0b21QYXRoKyIsICAgIixhKz0iWi5jYW52YXM9IitaLmNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIFZBTFVFUzogICAgIixhKz0iXG4iLGErPSJkaXNwbGF5Vz0iK1ouVmlld3BvcnQuejIwMSgpKyIsICAgIixhKz0iZGlzcGxheUg9IitaLlZpZXdwb3J0LnoxNzkoKSsiLCAgICIsYSs9InRpZXJDdXJyZW50PSIrWi5WaWV3cG9ydC56MTg3KCkrIiwgICAiLGErPSJ0aWVyU2NhbGU9IitaLlZpZXdwb3J0LnoxODkoKSsiLCAgICIsYSs9IlRJRVJTX01BWF9TQ0FMRV9VUD0iK1ouVmlld3BvcnQuejE5NCgpKyIsICAgIixhKz0iVElFUlNfTUFYX1NDQUxFX0RPV049IitaLlZpZXdwb3J0LnoxOTMoKSsiLCAgICIsYSs9IlRJTEVTX01BWF9DQUNIRT0iK1ouVmlld3BvcnQuejE5NygpKyIsICAgIixhKz0iWi51c2VDYW52YXM9IitaLnVzZUNhbnZhcysiXG4iLGErPSJcbiIsYSs9IklOVEVSTkFMIExJU1RTOiAgICAiLGErPSJ0aWVyV3M9IitaLlZpZXdwb3J0LnoxOTIoKSsiLCAgICIsYSs9InRpZXJIcz0iK1ouVmlld3BvcnQuejE4OCgpKyIsICAgIixhKz0idGllclRpbGVDb3VudHM9IitaLlZpZXdwb3J0LnoxOTEoKSsiLCAgICIsYSs9InRpbGVzTG9hZGluZ05hbWVzPSIrWi5WaWV3cG9ydC56MTk2KCkrIlxuIixhKz0iXG4iLGFsZXJ0KGEpfSx6MjU2OmZ1bmN0aW9uKCl7Wi5UcmFjZURpc3BsYXk/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT09ImlubGluZS1ibG9jayI/Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0ibm9uZSI6Wi5UcmFjZURpc3BsYXkuZGlzcGxheT0iaW5saW5lLWJsb2NrIjpaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpfSxjb25maWd1cmVUcmFjZURpc3BsYXk6ZnVuY3Rpb24oKXt2YXIgYT1aLnZpZXdlclcvMyxiPVoudmlld2VySC8zKzQ1LGM9MTAsZD1wYXJzZUZsb2F0KFoudmlld2VySCkvMyxlPXRoaXMuejE4NSgiejY4Iik7Wi5UcmFjZURpc3BsYXk9dGhpcy5jcmVhdGVDb250YWluZXJFbGVtZW50KCJkaXYiLCJUcmFjZURpc3BsYXkiLCJpbmxpbmUtYmxvY2siLCJhYnNvbHV0ZSIsImhpZGRlbiIsYSsicHgiLGIrInB4IixjKyJweCIsZCsicHgiLCJzb2xpZCIsIjFweCIsZSwiMHB4IiwiMTBweCIpLFouVmlld2VyRGlzcGxheS5hcHBlbmRDaGlsZChaLlRyYWNlRGlzcGxheSksWi50cmFjZXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEVYVEFSRUEiKTt2YXIgZj1aLnRyYWNlcy5zdHlsZTtmLndpZHRoPWEtMTUrInB4IixmLmhlaWdodD1iLTYwKyJweCIsZi5mb250RmFtaWx5PSJ2ZXJkYW5hIixmLmZvbnRTaXplPSIxMHB4IixmLmJvcmRlcj0ic29saWQiLGYuYm9yZGVyV2lkdGg9IjFweCIsZi5wYWRkaW5nPSI1cHgiLGYucmVzaXplPSJub25lIixaLnRyYWNlcy52YWx1ZT0iVHJhY2UgVmFsdWVzXG4iLFouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKFoudHJhY2VzKTt2YXIgZz01OCxoPTQyLGk9MjAsaj1iLWgvMi0xMCxrPTEwLGw9dGhpcy56MTg1KCJ6NjYiKSxtPXRoaXMuejE4NSgiejY5Iiksbj1uZXcgdGhpcy5CdXR0b24oImJ1dHRvblNob3dHbG9iYWxzIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLHRoaXMuejI1MywiejExMyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChuLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MiIpLG89bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVEaXNwbGF5IixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQuejI3MiwiejExNyIsInNvbGlkIiwiMXB4IixsLCIwcHgiLCIwcHgiKTtaLlRyYWNlRGlzcGxheS5hcHBlbmRDaGlsZChvLmVsbXQpLGkrPWcrazt2YXIgbT10aGlzLnoxODUoIno3MCIpLHA9bmV3IHRoaXMuQnV0dG9uKCJidXR0b25Ub2dnbGVCYWNrZmlsbCIsbSxudWxsLG51bGwsbnVsbCxudWxsLGcrInB4IixoKyJweCIsaSsicHgiLGorInB4IiwibW91c2Vkb3duIixaLlZpZXdwb3J0LnoyNzEsInoxMTUiLCJzb2xpZCIsIjFweCIsbCwiMHB4IiwiMHB4Iik7Wi5UcmFjZURpc3BsYXkuYXBwZW5kQ2hpbGQocC5lbG10KSxpKz1nK2ssZys9MTI7dmFyIG09dGhpcy56MTg1KCJ6NzEiKSxxPW5ldyB0aGlzLkJ1dHRvbigiYnV0dG9uVG9nZ2xlQ29uc3RyYWluUGFuIixtLG51bGwsbnVsbCxudWxsLG51bGwsZysicHgiLGgrInB4IixpKyJweCIsaisicHgiLCJtb3VzZWRvd24iLFouVmlld3BvcnQudG9nZ2xlQ29uc3RyYWluUGFuLCJ6MTE2Iiwic29saWQiLCIxcHgiLGwsIjBweCIsIjBweCIpO1ouVHJhY2VEaXNwbGF5LmFwcGVuZENoaWxkKHEuZWxtdCl9LHRyYWNlOmZ1bmN0aW9uKGEpe1ouVHJhY2VEaXNwbGF5fHxaLlV0aWxzLmNvbmZpZ3VyZVRyYWNlRGlzcGxheSgpLFoudHJhY2VzJiYoWi50cmFjZXMudmFsdWUrPSJcbiIrYSsiXG4iKX19";
			";
		</script>




	<script id="script_addChild" >
		var childNumber_zm = 3;
		var zmx = new Array(); 
		var z = 0;
		zmx[z++] = "/zm/space_2019/";
		zmx[z++] = "/zm/nasa_2018/";
		zmx[z++] = "/zm/nasa/";
		zmx[z++] = "/zm/appolo/";
		zmx[z++] = "/zm/appolo17_4800/";
		zmx[z++] = "/zm/zm5_planets/";
		zmx[z++] = "/zm/zm_nasa/";
		zmx[z++] = "/ko_jtf/jft_parcels/";
//		alert( "addChild zmx len="+zmx.length );
		var childNumber = 3;
		function addChild() {
			alert( "addChild() zmx len="+zmx.length );
			var parent = document.getElementById('div_addchild');
			var newChild = '<p>Child ' + childNumber + '</p>';
			newChild += "<h1>addChild one</h1>";
			newChild += "<h1>addChild two</h1>";
			parent.insertAdjacentHTML('beforeend', newChild);
			childNumber++;
			}
		</script>

	<script id="script_addChild_zm" >
		var childNumber_zm = 3;
		var zmx = new Array(); 
		var z = 0;
		alert( "addChild_zm zmx len="+zmx.length );
//		zmx[z++] = "/zm/nasa/";
//		zmx[z++] = "/zm/appolo/";
//		zmx[z++] = "/zm/appolo17_4800/";
//		zmx[z++] = "/zm/zm5_planets/";
//		zmx[z++] = "/zm/zm_nasa/";
//		zmx[z++] = "/ko_jtf/jft_parcels/";
		
		
		function addChild_zm() {
//			alert( "BUGS_176: addChild_zm" );
			
			var parent = document.getElementById('div_zmlist');
			var newChild_zm = '<p>zm ' + childNumber_zm + '</p>';
			newChild_zm += "<h1>addChild_zm one</h1>";

			for( z = 0: z < zmx.length; z++ ) {
				newChild_zm += "<a href='" + zmx[z] + "/index.html' target=_blank>"
				newChild_zm += "<img src='"+ zmx[z] + "/index.png' alt='/zm/index.png' border=0></a>";
				}
			parent.insertAdjacentHTML('beforeend', newChild_zm);
			childNumber++;
			}
		</script>

	<script id="script_zmlist" >
		var childNumber_zm = 3;
		function script_zmlist() {
			script_zmlist_load();
//			alert( "bugs177 script_zmlist_load OK" );
			script_zmlist_show();
//			var parent = document.getElementById('div_zmlist');
//			var newChild_zm = '<p>zm ' + childNumber_zm + '</p>';
//			newChild_zm += "<hr color=white><h1>zmlist one</h1><hr color=white>";
//			parent.insertAdjacentHTML('beforeend', newChild_zm);
//			childNumber++;
			}
		</script>

	<script id="script_tllist" >
		var childNumber_tl = 3;
		function script_tllist() {
			script_tllist_load();
//			alert( "bugs_700 script_tllist_load OK" );
			script_tllist_show();
//			var parent = document.getElementById('div_tllist');
//			var newChild_tl = '<p>tl ' + childNumber_tl + '</p>';
//			newChild_tl += "<hr color=white><h1>tllist one</h1><hr color=white>";
//			parent.insertAdjacentHTML('beforeend', newChild_tl);
//			childNumber++;
			}
		</script>

	<script id="script_ytlist" >
		var childNumber_yt = 3;
		var ytlist = new Array();
		function script_ytlist(src) {
			ytlist=script_ytlist_load(src);
//			alert( "BUGS_945 script_ytlist_load src="+src );
			script_ytlist_show(ytlist);
			}
		function script_ytlist_ajax(src) {
//			ytlist=script_ytlist_load(src);
			script_ytlist_show(ytlist);
			alert( "BUGS_950 src="+src+" ytlist="+ytlist );
			}
		</script>

	<script id="script_avlist" >
		var childNumber_av = 3;
		function script_avlist() {
			script_avlist_load();
			script_avlist_show();
//			var parent = document.getElementById('div_tllist');
//			var newChild_tl = '<p>tl ' + childNumber_tl + '</p>';
//			newChild_tl += "<hr color=white><h1>tllist one</h1><hr color=white>";
//			parent.insertAdjacentHTML('beforeend', newChild_tl);
//			childNumber++;
			}
		</script>



	<style name="style_zm">
		body { text-align: center; background-color: "slategrey"; color:"white"; }
		button {
//		visibility: hidden;
//		background: rgba(7, 99, 53, .1);
		background: transparent;
		border: 3px solid rgba(7, 99, 53, 1);
		border-radius: 5px;
		color: rgba(7, 99, 53, 1);
		cursor: pointer;
		line-height: 40px;
		font-size: 30px;
		outline: none;
		padding: 0 20px;
		transition: all .3s;
		}
	button:hover {
//		background: rgba(7, 99, 53, 1);
		background: darkgreyslate;
		background: yellow;
		color: rgba(255,255,255,1);
		}
	p {font-size: 20px; font-weight: bold;
	</style>

<!--
	<button type="button" onclick="script_ytlist()">script_ytlist</button>
	<button type="button" onclick="script_avlist()">script_avlist</button>
	<button type="button" onclick="script_pnlist()">script_pnlist</button>
	<button type="button" onclick="script_tllist()">script_tllist</button>
	-->

	<button type="button" onclick="script_zmlist();return false">script_zmlist</button>
<!--
	<button type="button" onclick="addChild_zm()">addChild_zm</button>
	<button type="button" onclick="addChild()">addChild</button>
	<hr>
	-->

	<script > function imgWindow() {window.open("image") } </script>
		<img src="/imgs/btn/koeye_handhither.gif" height="50" size="150" alt="koeye" onclick="script_zmlist()"> 
<!--
		<img src="/imgs/btn/koeyeb.png" height="50" size="150" alt="koeyeb" onclick="addChild_zm();return false"> 
		<img src="/imgs/btn/koeyew.png" height="50" size="150" alt="koeyew" onclick="addChild()"> 

	<div id="div_addchild">
		<p>Child 1</p>
		<p>Child 2</p>	
		</div>
	-->

<!--	<div id="div_tllist1"> <h2>div_tllist1</h2> </div> -->

	<div id="div_zmlist">
		<h2>div_zmlist</h2>
		</div>

<!--
	<div id="div_avlist1">
		<h1>div_avlist1</h1>
		<p>Child_av 1</p>
		<p>Child_av 2</p>	
		</div>
	-->



		<script id="script_tllist" >

			var tllist = new Array();

//			function script_tllist_hover() {body { background-color: blue; }}

			function script_tllist_load() {
			var z=0;
			tllist[z++] = "/tl.json";
			tllist[z++] = "/tl/json/tl.json";
			tllist[z++] = "/tl/json/tl_test.json";
			tllist[z++] = "/tl/json/tl_jkwii.json";
			tllist[z++] = "/tl/json/tl_jtfdc.json";
			tllist[z++] = "/tl/json/tl_jtfinc.json";
			tllist[z++] = "/tl/json/tl_konet.json";
			tllist[z++] = "/tl/json/tl_iperms.json";
			tllist[z++] = '/tl/json/tl_byrdpuckers.json';
			tllist[z++] = '/tl/json/tl_kou.json';
			tllist[z++] = '/tl/json/tl_konabus.json';
			tllist[z++] = '/tl/json/tl_jtfdc_swat.json';
			tllist[z++] = '/tl/json/tl_jtfdc_flee1.json';
			tllist[z++] = '/tl/json/tl_jtfdc_flee2.json';
			tllist[z++] = '/tl/json/tl_jtfdc_flee3.json';
			tllist[z++] = '/tl/json/tl_jtfdc_trial1.json';
			tllist[z++] = '/tl/json/tl_jtfdc_trial2.json';
			tllist[z++] = '/tl/json/tl_jtfdc_trial3.json';
			tllist[z++] = '/tl/json/tl_jtf22.json';
			tllist[z++] = '/tl/json/tl_jtf28.json';
			tllist[z++] = '/tl/json/tl_jtf29.json';
			tllist[z++] = '/tl/json/tl_jtf30.json';
			tllist[z++] = '/tl/json/tl_jtf31.json';
			tllist[z++] = '/tl/json/tl_jtf32.json';
			tllist[z++] = '/tl/json/tl_jtf38.json';
			tllist[z++] = '/tl/json/tl_jtf39.json';
			tllist[z++] = '/tl/json/tl_jtf00.json';
			tllist[z++] = '/tl/json/tl_bdo.json';
			tllist[z++] = '/tl/json/tl_saic.json';
			tllist[z++] = '/tl/json/tl_saic_contract1.json';
			tllist[z++] = '/tl/json/tl_saic_contract2.json';
			tllist[z++] = '/tl/json/tl_law.json';
			tllist[z++] = '/tl/json/tl_kassil.json';
			tllist[z++] = '/tl/json/tl_jk.json';
			tllist[z++] = '/tl/json/tl_sk.json';
			tllist[z++] = '/tl/json/tl_jsk.json';
			tllist[z++] = '/tl/json/tl_jak1.json';
			tllist[z++] = '/tl/json/tl_jak2.json';
			tllist[z++] = '/tl/json/tl_jak3.json';
			tllist[z++] = '/tl/json/tl_test9.json';


//			z--;
//			alert( "BUGS_830_load tllist("+z+")="+tllist[z] + " len="+tllist.length );
//			document.write( "tllist_lost tllist_length="+tllist.length+" z="+z );
				return(tllist);
				}

		function script_tllist_show() {
			var z = 0; var tlout=""; var len=tllist.length;
			var tlid = ""; var tlurl = "";
//			alert( "bugs178 script_tllist_show IN" );
			for( z=0; z< tllist.length; z++ ) {
				tlid = tllist[z];
				tlid_code = tllist[z].replace('.json','' );
				img_tlid = tllist[z].replace('.json','.jpg' );
				tn_tlid = tllist[z].replace('.json','.png' );
//				tlout += "<h1><b>tllist_"+z+"</b><h1>";
//				tlout += "<a href='/index_vu.html?tlid="+tlid+"' target=_blank>";
//				tlout += "	<img name='img_" + tlid + "' src='"+tn_tlid+"' border=0 height=100 >\n";
//				tlout += "	</a>";
//				tlout += "<a href='"+tlid+".html' class="thumbnail"  target=_blank>";

// bugs				tlout += "<a href='"+tlid+".html' class='thumbnail'  target=_blank>";
				tlout += "<a href='/index_vu.html?tlid="+tlid+"' class='thumbnail' target=_blank>";
				tlout += "	<img name='img_" + tlid + "' height=25 src='"+tn_tlid+"' border=0 height=100 >\n";
				tlout += "	<span><img name='img_" + tlid + "' src='"+img_tlid+"' border=0 height=100 ></span>\n";
				tlout += "	</a>";
//				alert( "bugs430 tlid=" + tlid + " tn_tlid=" + tn_tlid );
				}
//			document.write( "bugs435 tlout=" + tlout );

//			alert( "BUGS432_show tllist("+len+")="+tllist[z] + " len="+tllist.length );
// 			document.getElementById('div_tllist').innerHTML += tlout;
			var parent = document.getElementById('div_tllist');
			parent.insertAdjacentHTML('beforeend', tlout);
			}
//		function script_tllist() {
//			script_tllist_load();
//			alert( "bugs_437: script_tllist len="+zmlist.length );
//			script_tllist_show();
//			}
		function script_tl_view( search ) {
			document.write( "script_tl_view search="+search );
			}
		</script>

	<script id="script_load_ajax" type="text/javascript">
		function load_ajax(src) {
//			alert( "BUGS_1130 load_ajax src="+src );
			var xmlhttp = new XMLHttpRequest();
			xmlhttp.onreadystatechange = function() {
				if (xmlhttp.readyState == XMLHttpRequest.DONE) {   // XMLHttpRequest.DONE == 4
					if (xmlhttp.status == 200) {
//						document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
//						alert( "BUGS_1140 load_ajax src="+src );
//						alert( "BUGS_1141 load_ajax responseText="+xmlhttp.responseText );
						return(xmlhttp.responseText);
						}
					else if (xmlhttp.status == 400) {
//						alert('ERR_1140: load_ajax error 400 src='+src);
						}
					else {
//						alert('ERR_1145: load_ajax not 200 src='+src);
						}
					}
				};

			src="/yt.txt";
//			alert( "BUGS_1150 load_ajax src="+src );
//			xmlhttp.open("GET", "ajax_info.txt", true);
//			xmlhttp.open("GET", "yt.txt", true);
			xmlhttp.open("GET", src, true);
			xmlhttp.send();
			}
		</script>

	<script id="script_startjax" type='text/javascript'>
//AJAX function
		function startjax(url) {
			var default_url="vu.php";
			if( url == "" ) { url = default_url; }
			$.ajax({
				type: "POST",
				url: "vu.php",
				data: "name=name&location=location",
				success: function(msg){
					alert( "MSG_1170 startjax msg=" + msg );
					}
				});
			}
        
//Call AJAX:
//		$(document).ready(startjax);
		</script>



		<script id="script_ytlist_load" >
			var ytlist = new Array();
			function script_ytlist_load(src) {

				if( src != "" ) {
var ytlist_text_ajax =
`https://youtube.com
yt_outerlight_20200130_kobe_bryant_crash_predicated_simpsons|yt_outerlight_20200130_kobe_bryant_crash_predicted_simpsons|https://www.youtube.com/watch?v=Bp2zJ5U31Ow
yt_mcduff_20200130_1000_mindfields_ep7_friends_family|https://www.youtube.com/watch?v=C5eYnfvHZEQ
yt_webb_20200130_1000_hunter_biden_submarine_base_kingsbay_georgia|https://www.youtube.com/watch?v=du9foZDmpm8
`;

//					alert( "BUGS_1171 script_ytlist_load src="+src+" ytlist_text_ajax="+ytlist_text_ajax );
					ytlist_text_ajax = load_ajax(src);
//					alert( "BUGS_1172 script_ytlist_load src="+src+" ytlist_text_ajax="+ytlist_text_ajax );
					return( ytlist_text_ajax.split("\n"));
					}

var ytlist_text =
` https://www.youtube.com/watch?v=RvfUylIdYVc
https://www.youtube.com/watch?v=T7BksoPrkl0
https://www.youtube.com/watch?v=WYtzCr_ao_Q
https://www.youtube.com/watch?v=Xg7eYWSGxNY
https://www.youtube.com/watch?v=ZToW9rkYuFk
https://www.youtube.com/watch?v=jEOiLaWooVk
abba_doc|https://www.youtube.com/watch?v=x6Ntwx4IsCs
anton_space_star_explodes|https://www.youtube.com/watch?v=U1JPGPmxqBU
aron_nevill_tellitlikeitis|https://www.youtube.com/watch?v=RPtImg9oYyc
audacity_editing_16tips_9min|https://www.youtube.com/watch?v=WWFvG1-AmNk
chapel_oprah_preg|https://www.youtube.com/watch?v=q7upGsFhoHY
chilean_swedis_military|https://www.youtube.com/watch?v=RvfUylIdYVc
dahboo77_starlink_elon_musk|https://www.youtube.com/watch?v=XOo4lqk0PVM
dave_chappell_2019_marktwain|https://www.youtube.com/watch?v=FwyeYmXjD1A
dave_chappelle_marktwain_prize_2019|https://www.youtube.com/watch?v=FwyeYmXjD1A
doors_gloria|https://www.youtube.com/watch?v=xis84YBN5F0
doors_the_end|https://www.youtube.com/watch?v=BXqPNlng6uI
doors_when_musics_over|https://www.youtube.com/watch?v=YkKRU1ajKFA
editinaudhttps://www.youtube.com/watch?v=GHe_Og-yEow
gato_barbieri_europa|https://www.youtube.com/watch?v=FIRI6CvtO6o&list=PLG9jLl6Ldd_hO6Vxkc5xL6XgUam2ZrNjP
hoagland_space_force_impeached_discloseure|https://www.youtube.com/watch?v=ErBRYujMOA8
how_to_make_honey_mead|https://www.youtube.com/watch?v=VTudpZD3uLo
icke_who_driving_war_on_iran|https://www.youtube.com/watch?v=C-HKkhsfOcg
jkwii_is_me.txt:waits - green grass|https://www.youtube.com/watch?v=KRfNj2njwTg
jkwii_notes_20200108.txt:abba_doc|https://www.youtube.com/watch?v=x6Ntwx4IsCs
jkwii_notes_20200108.txt:anton_space_star_explodes|https://www.youtube.com/watch?v=U1JPGPmxqBU
jkwii_notes_20200108.txt:aron_nevill_tellitlikeitis|https://www.youtube.com/watch?v=RPtImg9oYyc
jkwii_notes_20200108.txt:audacity_editing_16tips_9min|https://www.youtube.com/watch?v=WWFvG1-AmNk
jkwii_notes_20200108.txt:chapel_oprah_preg|https://www.youtube.com/watch?v=q7upGsFhoHY
jkwii_notes_20200108.txt:dahboo77_starlink_elon_musk|https://www.youtube.com/watch?v=XOo4lqk0PVM
jkwii_notes_20200108.txt:dave_chappell_2019_marktwain|https://www.youtube.com/watch?v=FwyeYmXjD1A
jkwii_notes_20200108.txt:dave_chappelle_marktwain_prize_2019|https://www.youtube.com/watch?v=FwyeYmXjD1A
jkwii_notes_20200108.txt:doors_gloria|https://www.youtube.com/watch?v=xis84YBN5F0
jkwii_notes_20200108.txt:doors_the_end|https://www.youtube.com/watch?v=BXqPNlng6uI
jkwii_notes_20200108.txt:doors_when_musics_over|https://www.youtube.com/watch?v=YkKRU1ajKFA
jkwii_notes_20200108.txt:editinaudhttps://www.youtube.com/watch?v=GHe_Og-yEow
jkwii_notes_20200108.txt:hoagland_space_force_impeached_discloseure|https://www.youtube.com/watch?v=ErBRYujMOA8
jkwii_notes_20200108.txt:how_to_make_honey_mead|https://www.youtube.com/watch?v=VTudpZD3uLo
jkwii_notes_20200108.txt:icke_who_driving_war_on_iran|https://www.youtube.com/watch?v=C-HKkhsfOcg
jkwii_notes_20200108.txt:kovcheg_song_volga_boatmen|https://www.youtube.com/watch?v=SRe1dsXs6_s
jkwii_notes_20200108.txt:maharajah_of_bikaner_bday_1946|https://www.youtube.com/watch?v=Yu0q1j18KLg
jkwii_notes_20200108.txt:mcduff_climate_catastrophe|https://www.youtube.com/watch?v=UQ0FSB_mTZo
jkwii_notes_20200108.txt:mcduff_webb_20200109_1400_trump_is_right|https://www.youtube.com/watch?v=EC3_jApc96c
jkwii_notes_20200108.txt:mcduff_webb_20200109_trump_is_right|https://www.youtube.com/watch?v=EC3_jApc96c
jkwii_notes_20200108.txt:mcduff_webb_20200110_2200_rise_4reich_wonderweapons|https://www.youtube.com/watch?v=Bmb9giWjLXg
jkwii_notes_20200108.txt:mother_pinkfloyd|https://www.youtube.com/watch?v=JkGbB0XtH1w
jkwii_notes_20200108.txt:munder_20200110_airplane_on_fire|https://www.youtube.com/watch?v=PmKMIhl8avE
jkwii_notes_20200108.txt:munder_20200111_2200_huge_protest_iran|https://www.youtube.com/watch?v=MctIMW9XEWM
jkwii_notes_20200108.txt:munder_20200111_2201_child_bones_syrian_bath|https://www.youtube.com/watch?v=LP3HqjdgJbA
jkwii_notes_20200108.txt:outerlight_20200108_strange_thing_noose|https://www.youtube.com/watch?v=YaC3sFdQjVk
jkwii_notes_20200108.txt:outerlight_missing_camera_footage|https://www.youtube.com/watch?v=XRn6M9QSEtE
jkwii_notes_20200108.txt:paul_harvey|https://www.youtube.com/watch?v=MEW2fWO7dgM
jkwii_notes_20200108.txt:quinn_20200108_1230|https://www.youtube.com/watch?v=InuLa4GsQe8
jkwii_notes_20200108.txt:quinn_20200108_what_happened_after_2006|https://www.youtube.com/watch?v=awZhdhXScFA
jkwii_notes_20200108.txt:quinn_20200109_0001_newfeatures_ready4tommorrow|https://www.youtube.com/watch?v=YWRE-LnBXcs
jkwii_notes_20200108.txt:quinn_20200110_2200_finallyate_afteraweek|https://www.youtube.com/watch?v=MQL669d8tH0
jkwii_notes_20200108.txt:quinn_20200111_200_going_nana|https://www.youtube.com/watch?v=GmvCIUpzXE4
jkwii_notes_20200108.txt:quinn_20200111_2100_whats_up_saturday|https://www.youtube.com/watch?v=dhpR-Q4du8w
jkwii_notes_20200108.txt:quinn_20200112_comment_from_anonavelli|https://www.youtube.com/watch?v=StY1GYmBigU
jkwii_notes_20200108.txt:quinn_michael_darknet_fentanyl|https://www.youtube.com/watch?v=ULMbiyuCfwY
jkwii_notes_20200108.txt:salvador_dali|https://www.youtube.com/watch?v=WixEvXAkrZo
jkwii_notes_20200108.txt:stroppy_20200110_2331_economy_really_doing|https://www.youtube.com/watch?v=ABO8qJFXUI0
jkwii_notes_20200108.txt:stroppyme_20200110_distractions_abound|https://www.youtube.com/watch?v=CKdqmE0OGyE
jkwii_notes_20200108.txt:stroppyme_20200110_trust_huber|https://www.youtube.com/watch?v=AWkHmiYzgNg
jkwii_notes_20200108.txt:tech_ingredients_banana_brand_moonshine|https://www.youtube.com/watch?v=LDtcRnIhzi8
jkwii_notes_20200108.txt:vlad9vt_megaliths_peru_processing_4|https://www.youtube.com/watch?v=JxGQ-dwEARk
jkwii_notes_20200108.txt:webb_20191202_1130_roadreport_mcduff|	https://www.youtube.com/watch?v=0Iv235TMIhA&list=PLOYxBFbeVv55lADMc5e9r0mqZjANIFKRF
jkwii_notes_20200108.txt:wire_wrapping_tutorial|https://www.youtube.com/watch?v=OXpRLXn4Y5Q
jkwii_notes_20200116.txt:<a href=https://www.youtube.com/watch?v=RvfUylIdYVc target=_blank>
jkwii_notes_20200116.txt:<a href=https://www.youtube.com/watch?v=T7BksoPrkl0 target=_blank>
jkwii_notes_20200116.txt:<a href=https://www.youtube.com/watch?v=WYtzCr_ao_Q target=_blank>
jkwii_notes_20200116.txt:<a href=https://www.youtube.com/watch?v=Xg7eYWSGxNY target=_blank>
jkwii_notes_20200116.txt:<a href=https://www.youtube.com/watch?v=ZToW9rkYuFk target=_blank>
jkwii_notes_20200116.txt:<a href=https://www.youtube.com/watch?v=jEOiLaWooVk target=_blank>
jkwii_notes_20200116.txt:<iframe width="1241" height="526" src="https://www.youtube.com/embed/KY_7174afQU" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
jkwii_notes_20200116.txt:abba_doc|https://www.youtube.com/watch?v=x6Ntwx4IsCs
jkwii_notes_20200116.txt:anton_space_star_explodes|https://www.youtube.com/watch?v=U1JPGPmxqBU
jkwii_notes_20200116.txt:aron_nevill_tellitlikeitis|https://www.youtube.com/watch?v=RPtImg9oYyc
jkwii_notes_20200116.txt:audacity_editing_16tips_9min|https://www.youtube.com/watch?v=WWFvG1-AmNk
jkwii_notes_20200116.txt:chapel_oprah_preg|https://www.youtube.com/watch?v=q7upGsFhoHY
jkwii_notes_20200116.txt:chilean_swedis_military|https://www.youtube.com/watch?v=RvfUylIdYVc
jkwii_notes_20200116.txt:dahboo77_starlink_elon_musk|https://www.youtube.com/watch?v=XOo4lqk0PVM
jkwii_notes_20200116.txt:dave_chappell_2019_marktwain|https://www.youtube.com/watch?v=FwyeYmXjD1A
jkwii_notes_20200116.txt:dave_chappelle_marktwain_prize_2019|https://www.youtube.com/watch?v=FwyeYmXjD1A
jkwii_notes_20200116.txt:doors_gloria|https://www.youtube.com/watch?v=xis84YBN5F0
jkwii_notes_20200116.txt:doors_the_end|https://www.youtube.com/watch?v=BXqPNlng6uI
jkwii_notes_20200116.txt:doors_when_musics_over|https://www.youtube.com/watch?v=YkKRU1ajKFA
jkwii_notes_20200116.txt:editinaudhttps://www.youtube.com/watch?v=GHe_Og-yEow
jkwii_notes_20200116.txt:gato_barbieri_europa|https://www.youtube.com/watch?v=FIRI6CvtO6o&list=PLG9jLl6Ldd_hO6Vxkc5xL6XgUam2ZrNjP
jkwii_notes_20200116.txt:hoagland_space_force_impeached_discloseure|https://www.youtube.com/watch?v=ErBRYujMOA8
jkwii_notes_20200116.txt:how_to_make_honey_mead|https://www.youtube.com/watch?v=VTudpZD3uLo
jkwii_notes_20200116.txt:icke_who_driving_war_on_iran|https://www.youtube.com/watch?v=C-HKkhsfOcg
jkwii_notes_20200116.txt:kovcheg_song_volga_boatmen|https://www.youtube.com/watch?v=SRe1dsXs6_s
jkwii_notes_20200116.txt:maharajah_of_bikaner_bday_1946|https://www.youtube.com/watch?v=Yu0q1j18KLg
jkwii_notes_20200116.txt:mcduff_climate_catastrophe|https://www.youtube.com/watch?v=UQ0FSB_mTZo
jkwii_notes_20200116.txt:mcduff_jack_sophisticated_funk_1974|https://www.youtube.com/watch?v=6YC48xLTHgg
jkwii_notes_20200116.txt:mcduff_webb_20200109_1400_trump_is_right|https://www.youtube.com/watch?v=EC3_jApc96c
jkwii_notes_20200116.txt:mcduff_webb_20200109_trump_is_right|https://www.youtube.com/watch?v=EC3_jApc96c
jkwii_notes_20200116.txt:mcduff_webb_20200110_2200_rise_4reich_wonderweapons|https://www.youtube.com/watch?v=Bmb9giWjLXg
jkwii_notes_20200116.txt:mother_pinkfloyd|https://www.youtube.com/watch?v=JkGbB0XtH1w
jkwii_notes_20200116.txt:multi-camer_live_stream_obs|https://www.youtube.com/watch?v=8UtXvJq-l5M
jkwii_notes_20200116.txt:munder_20200110_airplane_on_fire|https://www.youtube.com/watch?v=PmKMIhl8avE
jkwii_notes_20200116.txt:munder_20200111_2200_huge_protest_iran|https://www.youtube.com/watch?v=MctIMW9XEWM
jkwii_notes_20200116.txt:munder_20200111_2201_child_bones_syrian_bath|https://www.youtube.com/watch?v=LP3HqjdgJbA
jkwii_notes_20200116.txt:other german_army_chiles_prussian_tradition|https://www.youtube.com/watch?v=adzg_iMg9Sc
jkwii_notes_20200116.txt:outerlight_20200108_strange_thing_noose|https://www.youtube.com/watch?v=YaC3sFdQjVk
jkwii_notes_20200116.txt:outerlight_missing_camera_footage|https://www.youtube.com/watch?v=XRn6M9QSEtE
jkwii_notes_20200116.txt:paul_harvey|https://www.youtube.com/watch?v=MEW2fWO7dgM
jkwii_notes_20200116.txt:prussian_parade_style_2016|https://www.youtube.com/watch?v=ASViZeNnEk0
jkwii_notes_20200116.txt:prussias_gloria|https://www.youtube.com/watch?v=VkUP8hXa-Rg
jkwii_notes_20200116.txt:quinn_20200108_1230|https://www.youtube.com/watch?v=InuLa4GsQe8
jkwii_notes_20200116.txt:quinn_20200108_what_happened_after_2006|https://www.youtube.com/watch?v=awZhdhXScFA
jkwii_notes_20200116.txt:quinn_20200109_0001_newfeatures_ready4tommorrow|https://www.youtube.com/watch?v=YWRE-LnBXcs
jkwii_notes_20200116.txt:quinn_20200110_2200_finallyate_afteraweek|https://www.youtube.com/watch?v=MQL669d8tH0
jkwii_notes_20200116.txt:quinn_20200111_200_going_nana|https://www.youtube.com/watch?v=GmvCIUpzXE4
jkwii_notes_20200116.txt:quinn_20200111_2100_whats_up_saturday|https://www.youtube.com/watch?v=dhpR-Q4du8w
jkwii_notes_20200116.txt:quinn_20200112_comment_from_anonavelli|https://www.youtube.com/watch?v=StY1GYmBigU
jkwii_notes_20200116.txt:quinn_michael_darknet_fentanyl|https://www.youtube.com/watch?v=ULMbiyuCfwY
jkwii_notes_20200116.txt:salvador_dali|https://www.youtube.com/watch?v=WixEvXAkrZo
jkwii_notes_20200116.txt:stroppy_20200110_2331_economy_really_doing|https://www.youtube.com/watch?v=ABO8qJFXUI0
jkwii_notes_20200116.txt:stroppyme_20200110_distractions_abound|https://www.youtube.com/watch?v=CKdqmE0OGyE
jkwii_notes_20200116.txt:stroppyme_20200110_trust_huber|https://www.youtube.com/watch?v=AWkHmiYzgNg
jkwii_notes_20200116.txt:targ_russel_psychic_abilities_banned_tedtalk_psychic_abilities|https://www.youtube.com/watch?v=hBl0cwyn5GY|
jkwii_notes_20200116.txt:targ_russel_psychic_abilities_scientific_spiritual_implication|https://www.youtube.com/watch?v=zgyYms376Mg
jkwii_notes_20200116.txt:tech_ingredients_banana_brand_moonshine|https://www.youtube.com/watch?v=LDtcRnIhzi8
jkwii_notes_20200116.txt:vlad9vt_megaliths_peru_processing_4|https://www.youtube.com/watch?v=JxGQ-dwEARk
jkwii_notes_20200116.txt:vortexmath_rodin|https://www.youtube.com/watch?v=OXbVZc10lnk
jkwii_notes_20200116.txt:webb_20191202_1130_roadreport_mcduff|	https://www.youtube.com/watch?v=0Iv235TMIhA&list=PLOYxBFbeVv55lADMc5e9r0mqZjANIFKRF
jkwii_notes_20200116.txt:wire_wrapping_tutorial|https://www.youtube.com/watch?v=OXpRLXn4Y5Q
jkwii_notes_20200116.txt:yt_12_most_incredible_finds_kou|https://www.youtube.com/watch?v=x1MPkV9EFGM
jkwii_notes_20200116.txt:yt_20190408_electric_universe_theory_alt_cosmology|https://www.youtube.com/watch?v=Uzw6s4nbTZA
jkwii_notes_20200116.txt:yt_20191030_in_the_air_tonight_piano_cover_colins|https://www.youtube.com/watch?v=qNYNNrpyhEE
jkwii_notes_20200116.txt:yt_20200109_quantum_locking_how_does_it_work|https://www.youtube.com/watch?v=8GY4m022tgo
jkwii_notes_20200116.txt:yt_20200110_universe_made_of_math_p3|https://www.youtube.com/watch?v=xfgf7DOv2Dw
jkwii_notes_20200116.txt:yt_20200124_ferrero_rocher_icecream_asmr|https://www.youtube.com/watch?v=PXJ_z-mYLPk
jkwii_notes_20200116.txt:yt_20200127_how_bad_radiation_mars|https://www.youtube.com/watch?v=_GeapdGbGEc
jkwii_notes_20200116.txt:yt_2ndsouthcarolina_string_band_20170906|https://www.youtube.com/watch?v=NpSR0oI5zy8
jkwii_notes_20200116.txt:yt_adamsavagestested_20200123_boston_dynamics_spsot_robot|https://www.youtube.com/watch?v=k7s1sr4JdlI
jkwii_notes_20200116.txt:yt_amazing_polly_20200123_1600_growing_up_deep_state_censored_reupload|https://www.youtube.com/watch?v=pSN_sZZovFA
jkwii_notes_20200116.txt:yt_amazing_polly_virginia_again|https://www.youtube.com/watch?v=VDAD1CR5xdk
jkwii_notes_20200116.txt:yt_amazing_underground_mansion_ancient_skills|https://www.youtube.com/watch?v=BYwazHyAq6k
jkwii_notes_20200116.txt:yt_amazingpolly_20200119_0000_virginia|https://www.youtube.com/watch?v=VDAD1CR5xdk
jkwii_notes_20200116.txt:yt_amazingpolly_20200127_2300_theyhateus|https://www.youtube.com/watch?v=4M8LB--H50M
jkwii_notes_20200116.txt:yt_amazingpolly_20201816_iranada_swamp2|https://www.youtube.com/watch?v=GJV0bd_DfnQ
jkwii_notes_20200116.txt:yt_amazingpolly_20201817_33178view_fireside_chat_virtue_virtue_signalling|https://www.youtube.com/watch?v=sVUA1hMCtMg
jkwii_notes_20200116.txt:yt_amoslee_arms_ofa_woman_official|https://www.youtube.com/watch?v=Th4SwSpaRWU
jkwii_notes_20200116.txt:yt_anton_petrov_20200115_missing_stars|https://www.youtube.com/watch?v=XJzH1tB-BdI
jkwii_notes_20200116.txt:yt_antonpetrov_20200128_1822_oldest_crater_onearth|https://www.youtube.com/watch?v=W_GD34nNaco
jkwii_notes_20200116.txt:yt_antonpetrov_gravitaion_waves betelguse_dit_it_explode|https://www.youtube.com/watch?v=m0ZoKV5KK5s
jkwii_notes_20200116.txt:yt_avikaplan_it_knows_me_official|https://www.youtube.com/watch?v=53utaSYQnuY
jkwii_notes_20200116.txt:yt_bek_tuvan_throat_singing|https://www.youtube.com/watch?v=AMIx9zO3xJg
jkwii_notes_20200116.txt:yt_beth_joe_love_you_more_than_ever|https://www.youtube.com/watch?v=bOQ07fVVDJQ
jkwii_notes_20200116.txt:yt_blacklewis_20200122_1730_hattiesburg_drycounty|https://www.youtube.com/watch?v=RxO6wlWTMQM
jkwii_notes_20200116.txt:yt_borealisforum_farrel_jfk_spider|https://www.youtube.com/watch?v=Dhsh5bbZPls&list=PLTUotXVWHCqonqRZbadp5A4gJrHgQ6iV5&index=1
jkwii_notes_20200116.txt:yt_borealusforum_20200120_0000|https://www.youtube.com/channel/UCug8wpoDb2KWBLD6nx8Qe8A
jkwii_notes_20200116.txt:yt_breautube_20150911_smotherbrothers5|https://www.youtube.com/watch?v=AmhHsPCBI_Y
jkwii_notes_20200116.txt:yt_buildeverything_dager|https://www.youtube.com/watch?v=jNMntMJP0ZA
jkwii_notes_20200116.txt:yt_canesword|https://www.youtube.com/watch?v=meprj994e1A
jkwii_notes_20200116.txt:yt_carless_whisper_original_major_key|https://www.youtube.com/watch?v=K5IWzIqpWqQ
jkwii_notes_20200116.txt:yt_carless_whispers_video|https://www.youtube.com/watch?v=izGwDsrQ1eQ
jkwii_notes_20200116.txt:yt_carolbrnett_virgin_prince|https://www.youtube.com/watch?v=PdU8dnA6Itc
jkwii_notes_20200116.txt:yt_chaseeaglson_20200125_elton_john_your_song|https://www.youtube.com/watch?v=BnQ_NihUrZU
jkwii_notes_20200116.txt:yt_cohen_20120105_show_me_the_place_official|https://www.youtube.com/watch?v=WCtoVoE5Mm4
jkwii_notes_20200116.txt:yt_cowboy_coffee|https://www.youtube.com/watch?v=7UAoT21eqXI
jkwii_notes_20200116.txt:yt_crazy_gnarls_barkley_streetfunk|https://www.youtube.com/watch?v=JZQzAWzSsn4&list=PLL3xcB0B80KV06T2lqZhG5zUZuwojwuex
jkwii_notes_20200116.txt:yt_crazypockets_aint_got_you_funk|https://www.youtube.com/watch?v=g_xcxu0TTvo&list=PLL3xcB0B80KV06T2lqZhG5zUZuwojwuex&index=2
jkwii_notes_20200116.txt:yt_crazypockets_wonderwall_oasis_funk_darren_criss|https://www.youtube.com/watch?v=jftpg_6SUYk&list=PLL3xcB0B80KV06T2lqZhG5zUZuwojwuex&index=6
jkwii_notes_20200116.txt:yt_crimson_clover|https://www.youtube.com/watch?v=kNjHJeVXxjI&list=PLo2aaBamFnLTfvcYnkey4tPuGhB-DenVx
jkwii_notes_20200116.txt:yt_dahb007_20200119_0000_two_massive_blobs_under_africa_pacific|https://www.youtube.com/watch?v=pA-VLQ4_ANY
jkwii_notes_20200116.txt:yt_dahb007_20200121_2000_washington_state_cdc_coronavirus|https://www.youtube.com/watch?v=mg4yySpsbbs
jkwii_notes_20200116.txt:yt_dahb007_20200124_2200_coronavirus_timeline|https://www.youtube.com/watch?v=JIGvAVXsfLU
jkwii_notes_20200116.txt:yt_dahboo7_20200114_1501_xenobots_robots_from_living_cells|https://www.youtube.com/watch?v=c35qNyenqsY
jkwii_notes_20200116.txt:yt_dahboo7_20200114_explosion_spain_chemplant|https://www.youtube.com/watch?v=QuWkdTV26CI
jkwii_notes_20200116.txt:yt_dahboo7_20200115_0000_hearbeat_tracking_longrange_facialrecognition|https://www.youtube.com/watch?v=GOMqWQpKW1A
jkwii_notes_20200116.txt:yt_dahboo7_20200117_0000_antifa_siding_progun_conservatives_virgina|https://www.youtube.com/watch?v=nc0UYfylt38
jkwii_notes_20200116.txt:yt_dahboo7_20200119_richmon|https://www.youtube.com/watch?v=Nk7RR0df3V0
jkwii_notes_20200116.txt:yt_dahboo7_20200123_1600_coronavirus_lockdown_7cities_23million_quarantine|https://www.youtube.com/watch?v=qTBVnemezQo
jkwii_notes_20200116.txt:yt_dahboo7_20200127_2300_hongkong_riots|https://www.youtube.com/watch?v=Yo4yCn4qwjs
jkwii_notes_20200116.txt:yt_dahboo7_2020912_kobe_radar_dropped_40000|https://www.youtube.com/watch?v=BE5GqjYo15w
jkwii_notes_20200116.txt:yt_dalailama_gere_converstikon.jpg|His Holiness the Dalai Lama in Conversation with Richard Gere|https://www.youtube.com/watch?v=bkRgYRA7JnA
jkwii_notes_20200116.txt:yt_dalailama_gere_innerhappiness|https://www.youtube.com/watch?v=tGkuBFHTpMM
jkwii_notes_20200116.txt:yt_dion_abraham_martin_john|https://www.youtube.com/watch?v=a5hFMy4pTrs
jkwii_notes_20200116.txt:yt_earthfiles_20200123_1600_wuhan_coronavirus_drones|https://www.youtube.com/watch?v=ZJQ-0-eXgkI
jkwii_notes_20200116.txt:yt_eliselegrow_20130606_drinking_inthe_day_live|https://www.youtube.com/watch?v=oCuXXpcPpFA
jkwii_notes_20200116.txt:yt_eliselegrow_20150728_aint_no_shunshine|https://www.youtube.com/watch?v=PvMDwJkvZaw
jkwii_notes_20200116.txt:yt_fixotronic_secret_profile_pipe|https://www.youtube.com/watch?v=LHiPMLELjUE
jkwii_notes_20200116.txt:yt_fox10phoenix_20200127_1800_pam_bondi_biden_ukraine|https://www.youtube.com/watch?v=6kqmojRRqB0
jkwii_notes_20200116.txt:yt_foxnews_20200124_guliani_sold_outby_biden|https://www.youtube.com/watch?v=hCm9HkVaVYk
jkwii_notes_20200116.txt:yt_foxnews_20200126_marklevin_impeachment_embarrassment|https://www.youtube.com/watch?v=NOhnrLhyOtU
jkwii_notes_20200116.txt:yt_fulford_20200120_0000|https://www.youtube.com/watch?v=joYB8fpwnuE
jkwii_notes_20200116.txt:yt_fulford_20200127_2300_coronavirus|https://www.youtube.com/watch?v=-_ZpU0kHXLs
jkwii_notes_20200116.txt:yt_garageband_beinners_guide|https://www.youtube.com/watch?v=QJnfGjVEspU
jkwii_notes_20200116.txt:yt_gato_babieri_shie_is_michelle|https://www.youtube.com/watch?v=G0SZ4rE-QJo
jkwii_notes_20200116.txt:yt_gato_barbierie_brazil|https://www.youtube.com/watch?v=kmCYirclZR8
jkwii_notes_20200116.txt:yt_gato_barbierie_europa|https://www.youtube.com/watch?v=gRIbuIeTew4
jkwii_notes_20200116.txt:yt_gato_barbierie_michelle|https://www.youtube.com/watch?v=G0SZ4rE-QJo
jkwii_notes_20200116.txt:yt_gato_bareieri_20090627_eruopa|https://www.youtube.com/watch?v=gRIbuIeTew4
jkwii_notes_20200116.txt:yt_gato_bareria_santana_europa_samba|https://www.youtube.com/watch?v=RVGMMUglVC4
jkwii_notes_20200116.txt:yt_gentri_20190916_dannyboy_irish_anthem|https://www.youtube.com/watch?v=KZ3E7kIYtR0
jkwii_notes_20200116.txt:yt_gingerbeer|https://www.youtube.com/watch?v=mfnHCdc3BgA
jkwii_notes_20200116.txt:yt_glenfriends_20200125_1930_rootbeer_from_scratch|https://www.youtube.com/watch?v=VdZ4C4gAYto
jkwii_notes_20200116.txt:yt_glenfriendscooking_20190426_cremesoda_recipe|https://www.youtube.com/watch?v=NOhnrLhyOtU
jkwii_notes_20200116.txt:yt_goats_declassified_true_story_men_who_stare_at_goats|https://www.youtube.com/watch?v=EbbtiCbPPts
jkwii_notes_20200116.txt:yt_grandpa_arnu_20191019_longbench|https://www.youtube.com/watch?v=Pk6sEyyAmfU
jkwii_notes_20200116.txt:yt_hamond_leslie_sound|https://www.youtube.com/watch?v=G5fI3X9BdrQ
jkwii_notes_20200116.txt:yt_hoagland_20200120_0000|https://www.youtube.com/results?search_query=hoagland+richard
jkwii_notes_20200116.txt:yt_hodgens_projection_mask|https://www.youtube.com/watch?v=WefSub8qesQ
jkwii_notes_20200116.txt:yt_howtoyodel_20200122_1735|https://www.youtube.com/watch?v=wPBWac-JFls
jkwii_notes_20200116.txt:yt_ipad_beatbox|https://www.youtube.com/watch?v=HPz8Jhd917M
jkwii_notes_20200116.txt:yt_issy_emeney_20100602_appalachian_flatfooting|https://www.youtube.com/watch?v=xyqcHMPa1O8
jkwii_notes_20200116.txt:yt_kirstendirksen_20200126_pitsburgh_incremental_hous_grow_withu|https://www.youtube.com/watch?v=eXlJOq_twEk
jkwii_notes_20200116.txt:yt_kou_proproducer_tries_audacity|https://www.youtube.com/watch?v=uav_7l5WaH4
jkwii_notes_20200116.txt:yt_kou_vortex_math_p3_computer_simulation|https://www.youtube.com/watch?v=fHViShTeo-4
jkwii_notes_20200116.txt:yt_landumcgoesthere_20200121_catwoman_cut_batman_tb|https://www.youtube.com/watch?v=ss2EM1m29gQ
jkwii_notes_20200116.txt:yt_levenda_20110502_secret_space_program_farrel_marrs|https://www.youtube.com/watch?v=2wvpbHBXKV8&list=PLFD58C4FC606194E8
jkwii_notes_20200116.txt:yt_looneytoons_trump_derangement_syndrome|https://www.youtube.com/watch?v=sAo19bthvWI
jkwii_notes_20200116.txt:yt_makeeverything_wildflower_rubber|https://www.youtube.com/watch?v=VqgH5zkKTKc
jkwii_notes_20200116.txt:yt_mangione_chuck_feels_so_good|https://www.youtube.com/watch?v=FExBwfQHXlE
jkwii_notes_20200116.txt:yt_mcduff_20200117|https://www.youtube.com/watch?v=pkn12dl6Ex0
jkwii_notes_20200116.txt:yt_mcduff_20200118_1900_fourthreich8_mindcontrol|https://www.youtube.com/watch?v=5gicoRwgwpw
jkwii_notes_20200116.txt:yt_mcduff_20200120_0000_home|https://www.youtube.com/channel/UCiAai8IYbDua9mujrNfIVbg
jkwii_notes_20200116.txt:yt_mcduff_20200120_0100_wyne_madsen|https://www.youtube.com/watch?v=uQapuFDXHv8
jkwii_notes_20200116.txt:yt_mcduff_20200121_1200_mindfields_ep2_impeach_tuesday|https://www.youtube.com/watch?v=SLEZtLm0fMo
jkwii_notes_20200116.txt:yt_mcduff_20200121_1900_fourthreich_ch8_nazi_mindcontrol_mkultra|https://www.youtube.com/watch?v=tp_KbqmcdhM
jkwii_notes_20200116.txt:yt_mcduff_20200124_2300_fourthreich_kennedy_nazis|https://www.youtube.com/watch?v=QGbMf6JbkyA0
jkwii_notes_20200116.txt:yt_mcduff_20200125_1200_mindfields_green_swann_event|https://www.youtube.com/watch?v=P8AuoANj1KM
jkwii_notes_20200116.txt:yt_mcduff_20200125_1630_fourthreich_ch10_kennedy_nazis|https://www.youtube.com/watch?v=QGbMf6JbkyA
jkwii_notes_20200116.txt:yt_mcduff_20200127_1100_mindfields_e5_cantbelieve_im_doing_this|https://www.youtube.com/watch?v=YMyMpQ_Fc-8
jkwii_notes_20200116.txt:yt_mcduff_20200127_2300_fourthreich_ch12p2_americanstyle|https://www.youtube.com/watch?v=pb8b4aGEPoo
jkwii_notes_20200116.txt:yt_mcduff_20200128_1400_mindfields_ep6_double_envelopment|https://www.youtube.com/watch?v=KY_7174afQU
jkwii_notes_20200116.txt:yt_mcduff_fourthreich_ch9_business_as_usual|https://www.youtube.com/watch?v=Lf33G2klvLg
jkwii_notes_20200116.txt:yt_mcduff_mark_kulacz|https://www.youtube.com/watch?v=sdI1TOSUXZg
jkwii_notes_20200116.txt:yt_mdcuff_20200120_0200_mindfied_e1_white_nationalists|https://www.youtube.com/watch?v=kG_to54SGcQ
jkwii_notes_20200116.txt:yt_misicians_tiny_hous_studion|https://www.youtube.com/watch?v=cargPBU2Ocs
jkwii_notes_20200116.txt:yt_missyou_brickinthewall|https://www.youtube.com/watch?v=ErHo_oCkspc
jkwii_notes_20200116.txt:yt_moemialcazar_20160414_adagio_flamenco|https://www.youtube.com/watch?v=TiXts24KhYU
jkwii_notes_20200116.txt:yt_montypython_adventures_martin_luther|https://www.youtube.com/watch?v=YXzubuENjHk
jkwii_notes_20200116.txt:yt_munder_20200119_terminators_unleashed|https://www.youtube.com/watch?v=bSeZbpUQ5Pk
jkwii_notes_20200116.txt:yt_munder_20200120_1701_mystery_china_corona_virus|https://www.youtube.com/watch?v=ltA9BmYMFi0
jkwii_notes_20200116.txt:yt_munder_20200120_1702_googlecritic_robert_epstein_wife_accident|https://www.youtube.com/watch?v=WuKPhJMWNJ4
jkwii_notes_20200116.txt:yt_munder_20200124_0000_stalite_boeing_directtv_explode|https://www.youtube.com/watch?v=Mmg_kkt4c48
jkwii_notes_20200116.txt:yt_munder_20200124_2200_canada_china_trained_staff_biolab|https://www.youtube.com/watch?v=s9JAuF6hRy8
jkwii_notes_20200116.txt:yt_munder_20200124_turkey_earthquake_68|https://www.youtube.com/watch?v=uN2CHNuHPn4
jkwii_notes_20200116.txt:yt_munder_20200126_2109_wuhan_fog_byrant_fog|https://www.youtube.com/watch?v=5hbe3wxkCnI
jkwii_notes_20200116.txt:yt_munder_20200127_1100_backlash_kobe_rapist_tweets|https://www.youtube.com/watch?v=oX53kRTw0gY
jkwii_notes_20200116.txt:yt_munder_20200128_1400_2ciashotdown|https://www.youtube.com/watch?v=bONj6zJ1roM
jkwii_notes_20200116.txt:yt_munder_20200128_1700_77earthquake_guantanamo_msg_delivered_received|https://www.youtube.com/watch?v=XaCbzXWfbGk
jkwii_notes_20200116.txt:yt_munder_20200128_lindsey_graham_51_witnesses|https://www.youtube.com/watch?v=HMUA92GqXn4
jkwii_notes_20200116.txt:yt_munder_qpotus_protecting_fro_prosecution|https://www.youtube.com/watch?v=3UDpfrUtH_A
jkwii_notes_20200116.txt:yt_newearth_20200119_sardina|https://www.youtube.com/watch?v=o6mAT-xNxhI
jkwii_notes_20200116.txt:yt_newearth_20200121_freespeech_reality_videoplatforms|https://www.youtube.com/watch?v=FtGGbutDAOw
jkwii_notes_20200116.txt:yt_newearth_20200123_1600_cagliani_necropolises_p7_2019_sardinia|https://www.youtube.com/watch?v=qawcfxt_QOA
jkwii_notes_20200116.txt:yt_newearth_20200125_1915_paintings_lucky_draw|https://www.youtube.com/watch?v=EeOJlLFYeyA
jkwii_notes_20200116.txt:yt_outerlight_20200112_2200_5thngs_coronavirus_wuhan|https://www.youtube.com/watch?v=t0hIcbIBwJM
jkwii_notes_20200116.txt:yt_outerlight_20200124_1900_coronoavirus_wuhan|https://www.youtube.com/watch?v=OsYsLGqhPGw
jkwii_notes_20200116.txt:yt_outerlight_20200128)1616_wuhan coronavirus_news_starts_disappear|https://www.youtube.com/watch?v=4iLkc1u3QfI
jkwii_notes_20200116.txt:yt_outerlight_epstein_mit_youngas11|https://www.youtube.com/watch?v=b0kPZjQUOWk
jkwii_notes_20200116.txt:yt_outerlight_rober_epstein_wife_car_accident|https://www.youtube.com/watch?v=MEPTepOQSYI
jkwii_notes_20200116.txt:yt_patsy_cline_3cigaretts|https://www.youtube.com/watch?v=Pb2oXxvvfMw
jkwii_notes_20200116.txt:yt_prince_crimson_clover|https://www.youtube.com/watch?v=a4RPkoURwL8
jkwii_notes_20200116.txt:yt_pursuitoftruth_ipot_sweet_virginia_pursuit_truth_20200118|https://www.youtube.com/watch?v=6FRTq6LvNgU
jkwii_notes_20200116.txt:yt_qanon_eisenhower_military_inddustrial_complex|https://www.youtube.com/watch?v=8y06NSBBRtY
jkwii_notes_20200116.txt:yt_quantastic_20200128_woodcarving_another_level|https://www.youtube.com/watch?v=UF7Ty_q_MAs
jkwii_notes_20200116.txt:yt_quantum_tech_hd_20180302_15_crazy_inventions_existed|https://www.youtube.com/watch?v=9jj8j3HCevA
jkwii_notes_20200116.txt:yt_quantumtech|efficiency_home_logs|https://www.youtube.com/watch?v=NMjtvSABQ3Q
jkwii_notes_20200116.txt:yt_quinn_20200118_0001_more_sounds|https://www.youtube.com/watch?v=JAjxzbjCexI
jkwii_notes_20200116.txt:yt_quinn_20200120_0000_indra_live_sculpture|https://www.youtube.com/watch?v=AbonpvIAshU
jkwii_notes_20200116.txt:yt_quinn_20200120_0100_indralive|https://www.youtube.com/watch?v=G3RUgFvKuHA
jkwii_notes_20200116.txt:yt_quinn_20200122_1700_indra_rescue_deva_lds|https://www.youtube.com/watch?v=xQkczDHmbUk
jkwii_notes_20200116.txt:yt_quinn_20200122_1800_singing_bowl_from_target|https://www.youtube.com/watch?v=d4NxYCLwVLM
jkwii_notes_20200116.txt:yt_quinn_20200122_2300_indra_deva_singing_bowl|zhttps://www.youtube.com/watch?v=y9OuOZAEcyo
jkwii_notes_20200116.txt:yt_quinn_20200123_1600_indra_youtubers_at_it_agin|https://www.youtube.com/watch?v=tOB2PGU8Grs
jkwii_notes_20200116.txt:yt_quinn_20200124_1400_indra_deva_light_saber|https://www.youtube.com/watch?v=cEwKMMWMyQE
jkwii_notes_20200116.txt:yt_quinn_20200124_1450_indra_deva_doing_it_again|https://www.youtube.com/watch?v=c_nUt8tFV1o
jkwii_notes_20200116.txt:yt_quinn_20200124_2300_sandlesocks_indra_deva_mail_offering|https://www.youtube.com/watch?v=eWrBBr0lQ1I
jkwii_notes_20200116.txt:yt_quinn_20200125_1600_indra_eyes|https://www.youtube.com/watch?v=WCpGbP_paXM
jkwii_notes_20200116.txt:yt_quinn_20200125_1630_indra_third_eye_chakra|https://www.youtube.com/watch?v=J5vE5azIZSk
jkwii_notes_20200116.txt:yt_quinn_20200126_1130_indra_work|https://www.youtube.com/watch?v=I441ZkMQ2YE
jkwii_notes_20200116.txt:yt_quinn_20200126_1630_indra_indrani_jayanta_jayanti|https://www.youtube.com/watch?v=BX2BuiZZYi0
jkwii_notes_20200116.txt:yt_quinn_20200127_indra_deva_chitragupta|https://www.youtube.com/watch?v=h5arq5sMgn4
jkwii_notes_20200116.txt:yt_quinn_20200128_1400_indra_deva_good_morning|https://www.youtube.com/watch?v=YF8Ln33wmzs
jkwii_notes_20200116.txt:yt_quinn_20200138_2230_indra_deva_copper_hemp|https://www.youtube.com/watch?v=rXv96LprPGY
jkwii_notes_20200116.txt:yt_quinn_20200177_buddhist_code|https://www.youtube.com/watch?v=V_yh3CEAxpA
jkwii_notes_20200116.txt:yt_quinn_20200177_got_most_pieces_indra_device|https://www.youtube.com/watch?v=hIi6B0bTFzU
jkwii_notes_20200116.txt:yt_quinn_20201818_0002_getingbetter_dont_ask what_ucando|https://www.youtube.com/watch?v=CcGAaLsXhGs
jkwii_notes_20200116.txt:yt_quinn_indra_deva_flowers|https://www.youtube.com/watch?v=-lMKVe04aW8
jkwii_notes_20200116.txt:yt_ronnie_barker_mispronunciation_sketch|https://www.youtube.com/watch?v=aJ0nFQgRApY
jkwii_notes_20200116.txt:yt_rozzi_kiss_prince_cover|https://www.youtube.com/watch?v=Y63m5JqCziE
jkwii_notes_20200116.txt:yt_sather_20200128_1400_mms_shtstirrer|https://www.youtube.com/watch?v=TamNV4ngkKY
jkwii_notes_20200116.txt:yt_scarypockets_vultpeck_wait_forthe_moment|https://www.youtube.com/watch?v=myzNf5kW1kQ
jkwii_notes_20200116.txt:yt_sctv_5neat_guys|https://www.youtube.com/watch?v=NMjtvSABQ3Q
jkwii_notes_20200116.txt:yt_secureteam_20200120_0000_willreturn|https://www.youtube.com/watch?v=jboig7qvUVI
jkwii_notes_20200116.txt:yt_segmentd_woodturning_vase_1025_pieces|https://www.youtube.com/watch?v=LgCs5uSbSBQ
jkwii_notes_20200116.txt:yt_shift_looneytoons_trump|https://www.youtube.com/watch?v=uQJoar17jyo
jkwii_notes_20200116.txt:yt_shortoftheweek_negative_space|https://www.youtube.com/watch?v=KI2lsdXJQ40
jkwii_notes_20200116.txt:yt_shosahana_zuboff_surveillance_capaitalis|https://www.youtube.com/watch?v=hIXhnWUmMvw
jkwii_notes_20200116.txt:yt_sierraeagleson_20160619_simpleman_lynyrdskyrd_cover|https://www.youtube.com/watch?v=hFOk2AMpuwA
jkwii_notes_20200116.txt:yt_sofitukker_awoo_betta_lemme_bardo_la_20160216|https://www.youtube.com/watch?v=T1-OehhtpWM
jkwii_notes_20200116.txt:yt_sofitukker_awoo_betta_lemme_offical|https://www.youtube.com/watch?v=x7g_SWE90O8
jkwii_notes_20200116.txt:yt_sofitukker_bestfriend_2019_grammys|https://www.youtube.com/watch?v=p_gt-OF3Pno
jkwii_notes_20200116.txt:yt_soikl5_arnold_schw_asia|https://www.youtube.com/watch?v=C247JvgKExM
jkwii_notes_20200116.txt:yt_stroppy_20200121_2000_and_were_away|https://www.youtube.com/watch?v=opOQ5UpTkTY
jkwii_notes_20200116.txt:yt_stroppyme_20200120_2000_q_allswell_that_endswell|https://www.youtube.com/watch?v=Mci6dD3Biik
jkwii_notes_20200116.txt:yt_stroppyme_20200123_1600_declass|https://www.youtube.com/results?search_query=stroppyme
jkwii_notes_20200116.txt:yt_stroppyme_20200123_is_someon_about_to_die|https://www.youtube.com/watch?v=UeOWeY7S3Q0
jkwii_notes_20200116.txt:yt_stroppyme_20200125_1600_stefan_halper_spy|https://www.youtube.com/watch?v=98qwruaNgmk
jkwii_notes_20200116.txt:yt_stroppyme_20200125_1900_dtupid_dems|https://www.youtube.com/watch?v=n2atjW-LUoo
jkwii_notes_20200116.txt:yt_stroppyme_20200126_2000_another_distration|https://www.youtube.com/watch?v=RSMUl_OF6Hg
jkwii_notes_20200116.txt:yt_stroppyme_20200127_2300_rinos_centrestage|https://www.youtube.com/watch?v=4M8LB--H50M
jkwii_notes_20200116.txt:yt_stroppyme_20200128_1818_qpost9new|https://www.youtube.com/watch?v=sfhTKxWmLM0
jkwii_notes_20200116.txt:yt_stroppyme_20200128_2019_isit_happening|https://www.youtube.com/watch?v=r8hQcsryp7s
jkwii_notes_20200116.txt:yt_targ_russel_mind_matter|https://www.youtube.com/watch?v=AEAGsaLADig
jkwii_notes_20200116.txt:yt_time_youve_finished_coffee_20170816|https://www.youtube.com/watch?v=2mj5JrBxwqA
jkwii_notes_20200116.txt:yt_tinyhouse_lord_ofthe_rings_conversion_van|https://www.youtube.com/watch?v=IBNVYFnxGOg
jkwii_notes_20200116.txt:yt_townsends_20200124_1900_cats_tavern|https://www.youtube.com/watch?v=5ped60E6nOY
jkwii_notes_20200116.txt:yt_universeinsideyou_mind_power_mystery_teaching|https://www.youtube.com/watch?v=nucKEm2m-BQ&list=PLqIfsK_gZ7ZHBguYs1pJhI2tfKuwwP-Ez
jkwii_notes_20200116.txt:yt_vipertv_20190907_sumeriantablets_decoded_extraordinary|https://www.youtube.com/watch?v=NNa5g_d_IJA
jkwii_notes_20200116.txt:yt_vipertv_20200126_1200_ancient_sumerian_tech|https://www.youtube.com/watch?v=Rw5wXTJ3ybo
jkwii_notes_20200116.txt:yt_vipertv_sumerians_peru|https://www.youtube.com/watch?v=-Iak_DNVxWU
jkwii_notes_20200116.txt:yt_viscounts_harlem_nacturn|https://www.youtube.com/watch?v=qfWbRWTfKFg
jkwii_notes_20200116.txt:yt_vlad9vt_20200119_grandiose_mingun_stupa|https://www.youtube.com/watch?v=UfDQGY92BYo
jkwii_notes_20200116.txt:yt_vlad9vt_geoglyphs_mexico_p1|https://www.youtube.com/watch?v=DMLZGFLrz-E
jkwii_notes_20200116.txt:yt_vlad9vt_megalithic_japan_p2_20200113|https://www.youtube.com/watch?v=UDzbNCOhrVI
jkwii_notes_20200116.txt:yt_vlad9vt|bazda_quarries_caves|https://www.youtube.com/watch?v=vQ008VqCd9E
jkwii_notes_20200116.txt:yt_vpro_vriije_geluiden_20170422|https://www.youtube.com/watch?v=HIAOG9nhrt8
jkwii_notes_20200116.txt:yt_webb_20200118_odeh_100b_iraq|https://www.youtube.com/watch?v=EPrFzIE9Shc
jkwii_notes_20200116.txt:yt_webb_20200120_0000_dan_hopsikker_strzok_parnas_redstone|https://www.youtube.com/watch?v=C2RX0jT0BdI
jkwii_notes_20200116.txt:yt_webb_20200121_1600_vindman|https://www.youtube.com/watch?v=0cQzIy7l0kA
jkwii_notes_20200116.txt:yt_webb_20200121_2000_1stwitness_leonid_vidman|https://www.youtube.com/watch?v=oz0oLLj23p8
jkwii_notes_20200116.txt:yt_webb_20200122_1700_biden_material_witness|https://www.youtube.com/watch?v=hK7iCiEvePg
jkwii_notes_20200116.txt:yt_webb_20200124_1900_matt_gonter_g4s_ft_pierce|https://www.youtube.com/watch?v=yNjELyQYVIQ
jkwii_notes_20200116.txt:yt_webb_20200126_2027_jupiter_island_misfit_toys|https://www.youtube.com/watch?v=gIfWzjlB1lo
jkwii_notes_20200116.txt:yt_webb_20200128_1700_matt_tina_gonter_blackberries_kids_pelosi_romney_biden|https://www.youtube.com/watch?v=NFcNwF6qFhQ
jkwii_notes_20200116.txt:yt_what_are_grown_knwwes_for_trees|https://www.youtube.com/watch?v=USv8xhQHWiY
jkwii_notes_20200116.txt:yt_youarefreetv_20200119_trump_ds_richmond|https://www.youtube.com/watch?v=uEy8mqZww_g
jkwii_notes_20200129.txt:<a href=https://www.youtube.com/watch?v=RvfUylIdYVc target=_blank>
jkwii_notes_20200129.txt:<a href=https://www.youtube.com/watch?v=T7BksoPrkl0 target=_blank>
jkwii_notes_20200129.txt:<a href=https://www.youtube.com/watch?v=WYtzCr_ao_Q target=_blank>
jkwii_notes_20200129.txt:<a href=https://www.youtube.com/watch?v=Xg7eYWSGxNY target=_blank>
jkwii_notes_20200129.txt:<a href=https://www.youtube.com/watch?v=ZToW9rkYuFk target=_blank>
jkwii_notes_20200129.txt:<a href=https://www.youtube.com/watch?v=jEOiLaWooVk target=_blank>
jkwii_notes_20200129.txt:<iframe width="1241" height="526" src="https://www.youtube.com/embed/KY_7174afQU" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
jkwii_notes_20200129.txt:abba_doc|https://www.youtube.com/watch?v=x6Ntwx4IsCs
jkwii_notes_20200129.txt:anton_space_star_explodes|https://www.youtube.com/watch?v=U1JPGPmxqBU
jkwii_notes_20200129.txt:aron_nevill_tellitlikeitis|https://www.youtube.com/watch?v=RPtImg9oYyc
jkwii_notes_20200129.txt:audacity_editing_16tips_9min|https://www.youtube.com/watch?v=WWFvG1-AmNk
jkwii_notes_20200129.txt:chapel_oprah_preg|https://www.youtube.com/watch?v=q7upGsFhoHY
jkwii_notes_20200129.txt:chilean_swedis_military|https://www.youtube.com/watch?v=RvfUylIdYVc
jkwii_notes_20200129.txt:dahboo77_starlink_elon_musk|https://www.youtube.com/watch?v=XOo4lqk0PVM
jkwii_notes_20200129.txt:dave_chappell_2019_marktwain|https://www.youtube.com/watch?v=FwyeYmXjD1A
jkwii_notes_20200129.txt:dave_chappelle_marktwain_prize_2019|https://www.youtube.com/watch?v=FwyeYmXjD1A
jkwii_notes_20200129.txt:doors_gloria|https://www.youtube.com/watch?v=xis84YBN5F0
jkwii_notes_20200129.txt:doors_the_end|https://www.youtube.com/watch?v=BXqPNlng6uI
jkwii_notes_20200129.txt:doors_when_musics_over|https://www.youtube.com/watch?v=YkKRU1ajKFA
jkwii_notes_20200129.txt:editinaudhttps://www.youtube.com/watch?v=GHe_Og-yEow
jkwii_notes_20200129.txt:hoagland_space_force_impeached_discloseure|https://www.youtube.com/watch?v=ErBRYujMOA8
jkwii_notes_20200129.txt:how_to_make_honey_mead|https://www.youtube.com/watch?v=VTudpZD3uLo
jkwii_notes_20200129.txt:icke_who_driving_war_on_iran|https://www.youtube.com/watch?v=C-HKkhsfOcg
jkwii_notes_20200129.txt:kovcheg_song_volga_boatmen|https://www.youtube.com/watch?v=SRe1dsXs6_s
jkwii_notes_20200129.txt:maharajah_of_bikaner_bday_1946|https://www.youtube.com/watch?v=Yu0q1j18KLg
jkwii_notes_20200129.txt:mcduff_climate_catastrophe|https://www.youtube.com/watch?v=UQ0FSB_mTZo
jkwii_notes_20200129.txt:mcduff_webb_20200109_1400_trump_is_right|https://www.youtube.com/watch?v=EC3_jApc96c
jkwii_notes_20200129.txt:mcduff_webb_20200109_trump_is_right|https://www.youtube.com/watch?v=EC3_jApc96c
jkwii_notes_20200129.txt:mcduff_webb_20200110_2200_rise_4reich_wonderweapons|https://www.youtube.com/watch?v=Bmb9giWjLXg
jkwii_notes_20200129.txt:mother_pinkfloyd|https://www.youtube.com/watch?v=JkGbB0XtH1w
jkwii_notes_20200129.txt:munder_20200110_airplane_on_fire|https://www.youtube.com/watch?v=PmKMIhl8avE
jkwii_notes_20200129.txt:munder_20200111_2200_huge_protest_iran|https://www.youtube.com/watch?v=MctIMW9XEWM
jkwii_notes_20200129.txt:munder_20200111_2201_child_bones_syrian_bath|https://www.youtube.com/watch?v=LP3HqjdgJbA
jkwii_notes_20200129.txt:other german_army_chiles_prussian_tradition|https://www.youtube.com/watch?v=adzg_iMg9Sc
jkwii_notes_20200129.txt:outerlight_20200108_strange_thing_noose|https://www.youtube.com/watch?v=YaC3sFdQjVk
jkwii_notes_20200129.txt:outerlight_missing_camera_footage|https://www.youtube.com/watch?v=XRn6M9QSEtE
jkwii_notes_20200129.txt:paul_harvey|https://www.youtube.com/watch?v=MEW2fWO7dgM
jkwii_notes_20200129.txt:prussian_parade_style_2016|https://www.youtube.com/watch?v=ASViZeNnEk0
jkwii_notes_20200129.txt:prussias_gloria|https://www.youtube.com/watch?v=VkUP8hXa-Rg
jkwii_notes_20200129.txt:quinn_20200108_1230|https://www.youtube.com/watch?v=InuLa4GsQe8
jkwii_notes_20200129.txt:quinn_20200108_what_happened_after_2006|https://www.youtube.com/watch?v=awZhdhXScFA
jkwii_notes_20200129.txt:quinn_20200109_0001_newfeatures_ready4tommorrow|https://www.youtube.com/watch?v=YWRE-LnBXcs
jkwii_notes_20200129.txt:quinn_20200110_2200_finallyate_afteraweek|https://www.youtube.com/watch?v=MQL669d8tH0
jkwii_notes_20200129.txt:quinn_20200111_200_going_nana|https://www.youtube.com/watch?v=GmvCIUpzXE4
jkwii_notes_20200129.txt:quinn_20200111_2100_whats_up_saturday|https://www.youtube.com/watch?v=dhpR-Q4du8w
jkwii_notes_20200129.txt:quinn_20200112_comment_from_anonavelli|https://www.youtube.com/watch?v=StY1GYmBigU
jkwii_notes_20200129.txt:quinn_michael_darknet_fentanyl|https://www.youtube.com/watch?v=ULMbiyuCfwY
jkwii_notes_20200129.txt:salvador_dali|https://www.youtube.com/watch?v=WixEvXAkrZo
jkwii_notes_20200129.txt:stroppy_20200110_2331_economy_really_doing|https://www.youtube.com/watch?v=ABO8qJFXUI0
jkwii_notes_20200129.txt:stroppyme_20200110_distractions_abound|https://www.youtube.com/watch?v=CKdqmE0OGyE
jkwii_notes_20200129.txt:stroppyme_20200110_trust_huber|https://www.youtube.com/watch?v=AWkHmiYzgNg
jkwii_notes_20200129.txt:targ_russel_psychic_abilities_banned_tedtalk_psychic_abilities|https://www.youtube.com/watch?v=hBl0cwyn5GY|
jkwii_notes_20200129.txt:targ_russel_psychic_abilities_scientific_spiritual_implication|https://www.youtube.com/watch?v=zgyYms376Mg
jkwii_notes_20200129.txt:tech_ingredients_banana_brand_moonshine|https://www.youtube.com/watch?v=LDtcRnIhzi8
jkwii_notes_20200129.txt:vlad9vt_megaliths_peru_processing_4|https://www.youtube.com/watch?v=JxGQ-dwEARk
jkwii_notes_20200129.txt:webb_20191202_1130_roadreport_mcduff|	https://www.youtube.com/watch?v=0Iv235TMIhA&list=PLOYxBFbeVv55lADMc5e9r0mqZjANIFKRF
jkwii_notes_20200129.txt:wire_wrapping_tutorial|https://www.youtube.com/watch?v=OXpRLXn4Y5Q
jkwii_notes_20200129.txt:yt_munder_20200129_0500_wuhan_bat_boy_busted|https://www.youtube.com/watch?v=16SZPn7SrJc
jkwii_notes_20200129.txt:yt_seeker_20200129_mini_nuclear_reactors_are_coming|https://www.youtube.com/watch?v=Nh5Tx1QLKBI
jkwii_notes_20200129.txt:yt_sixtysymbols_20200126_x17_new_partical|https://www.youtube.com/watch?v=8k6dKfmOufI
jkwii_notes_20200129.txt:yt_wiara_20170707_alan_watts_one_thing_never_taught|https://www.youtube.com/watch?v=RKwkQs3NRKQ
jkwiiisme.txt:waits - green grass|https://www.youtube.com/watch?v=KRfNj2njwTg
kovcheg_song_volga_boatmen|https://www.youtube.com/watch?v=SRe1dsXs6_s
maharajah_of_bikaner_bday_1946|https://www.youtube.com/watch?v=Yu0q1j18KLg
mcduff_climate_catastrophe|https://www.youtube.com/watch?v=UQ0FSB_mTZo
mcduff_jack_sophisticated_funk_1974|https://www.youtube.com/watch?v=6YC48xLTHgg
mcduff_webb_20200109_1400_trump_is_right|https://www.youtube.com/watch?v=EC3_jApc96c
mcduff_webb_20200109_trump_is_right|https://www.youtube.com/watch?v=EC3_jApc96c
mcduff_webb_20200110_2200_rise_4reich_wonderweapons|https://www.youtube.com/watch?v=Bmb9giWjLXg
mother_pinkfloyd|https://www.youtube.com/watch?v=JkGbB0XtH1w
multi-camer_live_stream_obs|https://www.youtube.com/watch?v=8UtXvJq-l5M
munder_20200110_airplane_on_fire|https://www.youtube.com/watch?v=PmKMIhl8avE
munder_20200111_2200_huge_protest_iran|https://www.youtube.com/watch?v=MctIMW9XEWM
munder_20200111_2201_child_bones_syrian_bath|https://www.youtube.com/watch?v=LP3HqjdgJbA
other german_army_chiles_prussian_tradition|https://www.youtube.com/watch?v=adzg_iMg9Sc
outerlight_20200108_strange_thing_noose|https://www.youtube.com/watch?v=YaC3sFdQjVk
outerlight_missing_camera_footage|https://www.youtube.com/watch?v=XRn6M9QSEtE
paul_harvey|https://www.youtube.com/watch?v=MEW2fWO7dgM
prussian_parade_style_2016|https://www.youtube.com/watch?v=ASViZeNnEk0
prussias_gloria|https://www.youtube.com/watch?v=VkUP8hXa-Rg
quinn_20200108_1230|https://www.youtube.com/watch?v=InuLa4GsQe8
quinn_20200108_what_happened_after_2006|https://www.youtube.com/watch?v=awZhdhXScFA
quinn_20200109_0001_newfeatures_ready4tommorrow|https://www.youtube.com/watch?v=YWRE-LnBXcs
quinn_20200110_2200_finallyate_afteraweek|https://www.youtube.com/watch?v=MQL669d8tH0
quinn_20200111_200_going_nana|https://www.youtube.com/watch?v=GmvCIUpzXE4
quinn_20200111_2100_whats_up_saturday|https://www.youtube.com/watch?v=dhpR-Q4du8w
quinn_20200112_comment_from_anonavelli|https://www.youtube.com/watch?v=StY1GYmBigU
quinn_michael_darknet_fentanyl|https://www.youtube.com/watch?v=ULMbiyuCfwY
salvador_dali|https://www.youtube.com/watch?v=WixEvXAkrZo
stroppy_20200110_2331_economy_really_doing|https://www.youtube.com/watch?v=ABO8qJFXUI0
stroppyme_20200110_distractions_abound|https://www.youtube.com/watch?v=CKdqmE0OGyE
stroppyme_20200110_trust_huber|https://www.youtube.com/watch?v=AWkHmiYzgNg
targ_russel_psychic_abilities_banned_tedtalk_psychic_abilities|https://www.youtube.com/watch?v=hBl0cwyn5GY|
targ_russel_psychic_abilities_scientific_spiritual_implication|https://www.youtube.com/watch?v=zgyYms376Mg
tech_ingredients_banana_brand_moonshine|https://www.youtube.com/watch?v=LDtcRnIhzi8
vlad9vt_megaliths_peru_processing_4|https://www.youtube.com/watch?v=JxGQ-dwEARk
vortexmath_rodin|https://www.youtube.com/watch?v=OXbVZc10lnk
webb_20191202_1130_roadreport_mcduff|	https://www.youtube.com/watch?v=0Iv235TMIhA&list=PLOYxBFbeVv55lADMc5e9r0mqZjANIFKRF
wire_wrapping_tutorial|https://www.youtube.com/watch?v=OXpRLXn4Y5Q
yt_12_most_incredible_finds_kou|https://www.youtube.com/watch?v=x1MPkV9EFGM
yt_20080507_maye_ni_maye_hum_aapke_hain_koun_classic_cult_song|https://www.youtube.com/watch?v=Ua5AW2czRAE
yt_20200124_ferrero_rocher_icecream_asmr|https://www.youtube.com/watch?v=PXJ_z-mYLPk
yt_20200129_modern_tech_fast_construction_housing2|https://www.youtube.com/watch?v=R7z3iilbHYg
yt_2ndsouthcarolina_string_band_20170906|https://www.youtube.com/watch?v=NpSR0oI5zy8
yt_909thebridge_20160810_lola_kinks_cover|https://www.youtube.com/watch?v=A7_Lg5dd_9g
yt_actionlab_20190214_crazy_material_bends_light|https://www.youtube.com/watch?v=968gVUAY9Mg
yt_adamsavagestested_20200123_boston_dynamics_spsot_robot|https://www.youtube.com/watch?v=k7s1sr4JdlI
yt_ahtoht_20191121_russian_dance|https://www.youtube.com/watch?v=RP25HLnAfHg
yt_airinr_20120901_anita_kelsey_sway|https://www.youtube.com/watch?v=IDEIol3cgF4
yt_amazing_polly_20200123_1600_growing_up_deep_state_censored_reupload|https://www.youtube.com/watch?v=pSN_sZZovFA
yt_amazing_polly_virginia_again|https://www.youtube.com/watch?v=VDAD1CR5xdk
yt_amazing_underground_mansion_ancient_skills|https://www.youtube.com/watch?v=BYwazHyAq6k
yt_amazingplaces_ourplanet_20180824_ancient_sites_sri_lanka_4k|https://www.youtube.com/watch?v=lZjfkmu3mSg
yt_amazingpolly_20200119_0000_virginia|https://www.youtube.com/watch?v=VDAD1CR5xdk
yt_amazingpolly_20200131_fight_small_battles|https://www.youtube.com/watch?v=yben1U0tVk4
yt_amazingpolly_20200202_comments_openmail|https://www.youtube.com/watch?v=pW8daGkL9wo
yt_amazingpolly_20200204_0900_
yt_amazingpolly_20200207_cyber_laundry|https://www.youtube.com/watch?v=YxaMnWGc3_Q
yt_amazingpolly_20201816_iranada_swamp2|https://www.youtube.com/watch?v=GJV0bd_DfnQ
yt_amazingpolly_20201817_33178view_fireside_chat_virtue_virtue_signalling|https://www.youtube.com/watch?v=sVUA1hMCtMg
yt_ambientlife_20151205_alan_watts_nature_of_god|https://www.youtube.com/watch?v=aLg4AV60uWY
yt_amoslee_arms_ofa_woman_official|https://www.youtube.com/watch?v=Th4SwSpaRWU
yt_anaalcaide_20140828_luna_sefardita_en_samarkanda|https://www.youtube.com/watch?v=KSM8K0yC_Lw
yt_andreaburiani_20160408_tumbalaka_canto_ebraico_italiano_slides|https://www.youtube.com/watch?v=IlGDNXBoTew
yt_andreajohnson_20140420_craig_pruess_anuradha_paudwl_sacred_chants_shakti|https://www.youtube.com/watch?v=M8TZ-f2DT4A
yt_annarevive_20160313_supreme_shimmies|https://www.youtube.com/watch?v=Dx1dFZDt0FU
yt_annbrun_20110608_ane_brun_do_you_remember_official|https://www.youtube.com/watch?v=1lI30Qw69AQ
yt_anton_petrov_20200115_missing_stars|https://www.youtube.com/watch?v=XJzH1tB-BdI
yt_antonpetrov_20200201_earths_magnetosphere|https://www.youtube.com/watch?v=2ZMcYT62-ew
yt_antonpetrov_20200204_meteorites_ribose_found_genetic|https://www.youtube.com/watch?v=jkxee_mpEEc
yt_antonpetrov_20200209_star_drag_fabric_universe_einstein_right_again|https://www.youtube.com/watch?v=v30oszbPH-k
yt_antonpetrov_gravitaion_waves betelguse_dit_it_explode|https://www.youtube.com/watch?v=m0ZoKV5KK5s
yt_arstechnica_20190212_blad_runner_reinvented_adventur_games_war_stories|https://www.youtube.com/watch?v=Zkwpa5YPhx8
yt_arstechnica_20200128_myst_cdrom_almost_couldnt_run|https://www.youtube.com/watch?v=EWX5B6cD4_4
yt_artenisa78rp_20190427_timbalalaika_prendimi_lanima|https://www.youtube.com/watch?v=wqs7sGPV2TU
yt_artenuzunov_20130504_bellydance_drum_solo|https://www.youtube.com/watch?v=s_sToZjPyHY
yt_astra_20200205_lunar_orbiter_unusual_terrain|https://www.youtube.com/watch?v=JnbQ02S2gVk
yt_astracigano_20160826_sloome_1953|https://www.youtube.com/watch?v=7uPYSoNNGeg
yt_astrum_20150602_scott_manley_astonishing_asteroids|https://www.youtube.com/watch?v=mQHfGP5kpr8
yt_astrum_20190925_nasa_dawn_vesta|https://www.youtube.com/watch?v=24RfWMymkJo
yt_astrum_20191204_osirisrex_bennu|https://www.youtube.com/watch?v=vzpN5VDMzns
yt_auntiesoul34_20120407_sylvia_pillow_talk|https://www.youtube.com/watch?v=NA2X1040_gY
yt_avalonjaxxbanc_20200107_sidney_bechet_avalon_si_tu_vois_ma_mere|https://www.youtube.com/watch?v=Qn3BExSUafs
yt_avalonjazz_20200202_souvenirs_johnny_hallyday|https://www.youtube.com/watch?v=AnK3kv21Gik
yt_avclub_20170926_0000_ahas_take_on_me_lake_street_dive|https://www.youtube.com/watch?v=y5z7cYSbsFU
yt_avengertv_20110112_emma_peel_first_appearance|https://www.youtube.com/watch?v=v4g3zvz8fgo
yt_avikaplan_it_knows_me_official|https://www.youtube.com/watch?v=53utaSYQnuY
yt_bek_tuvan_throat_singing|https://www.youtube.com/watch?v=AMIx9zO3xJg
yt_beth_joe_love_you_more_than_ever|https://www.youtube.com/watch?v=bOQ07fVVDJQ
yt_betweenworlds_20160210_nagasita_cave_ritual_between_worlds_telaviv|https://www.youtube.com/watch?v=GbRY-iPzR18
yt_bfi_dame_diana_rigg_avangers|https://www.youtube.com/watch?v=DFsPJSpk17A
yt_billypaulvevo_20151024_me_mrs_jones|https://www.youtube.com/watch?v=NYOQDnWFXYI
yt_billyrees_20150819_avangers_mustseetv|https://www.youtube.com/watch?v=2Qj58KYbEPo
yt_bioneers_20191111_olox_neoshamanivc_arctic_sounds|https://www.youtube.com/watch?v=RigbvMvKEFk
yt_blacklewis_20200122_1730_hattiesburg_drycounty|https://www.youtube.com/watch?v=RxO6wlWTMQM
yt_blazetv_20200206_glenn_beck_ukrain_final_piece|https://www.youtube.com/watch?v=dCSwqca8KXU
yt_bobsartgallery_20170906_those_were_the_days_russian|https://www.youtube.com/watch?v=bMly5NzZ5Ek
yt_borealisforum_farrel_jfk_spider|https://www.youtube.com/watch?v=Dhsh5bbZPls&list=PLTUotXVWHCqonqRZbadp5A4gJrHgQ6iV5&index=1
yt_borealusforum_20200120_0000|https://www.youtube.com/channel/UCug8wpoDb2KWBLD6nx8Qe8A
yt_breautube_20150911_smotherbrothers5|https://www.youtube.com/watch?v=AmhHsPCBI_Y
yt_brienfoerster_20200131_paracas_elongated_skulls_peru|https://www.youtube.com/watch?v=sApoMx763MA
yt_brienfoerster_20200205_tunnels_above_inca_cusco_peru|https://www.youtube.com/watch?v=t8i46K-6JdE
yt_buildeverything_dager|https://www.youtube.com/watch?v=jNMntMJP0ZA
yt_canesword|https://www.youtube.com/watch?v=meprj994e1A
yt_cappynj_20170803_george_carlin_similarities|https://www.youtube.com/watch?v=cgps85scy1g
yt_carless_whisper_original_major_key|https://www.youtube.com/watch?v=K5IWzIqpWqQ
yt_carless_whispers_video|https://www.youtube.com/watch?v=izGwDsrQ1eQ
yt_carolbrnett_virgin_prince|https://www.youtube.com/watch?v=PdU8dnA6Itc
yt_caseyspring_20151105_lalas_burlesque_kalamazoo_state_theater|https://www.youtube.com/watch?v=64LcYDzGD_w
yt_catholicworld_20140623_bishop_fulton_j_sheen_superiority_complex|https://www.youtube.com/watch?v=iqzJ009Q4xg
yt_catholicworld_20140624_bishop_fulton_j_sheen_excerpt_rom_loneliness|https://www.youtube.com/watch?v=1kYVrTPMBCQ
yt_catholicworld_20140624_bishop_fulton_j_sheen_nice_people|https://www.youtube.com/watch?v=tAW2I0pTlsw
yt_catholicworld_20140624_bishop_fulton_j_sheen_soul|https://www.youtube.com/watch?v=oUekzqmZVEI
yt_cernovich_20200202_trumps_superbowl_ad|https://www.youtube.com/watch?v=NauTtrrNT2Q
yt_cinemascopexxx_20170912_flatfoot_dance_contest_prelim_happy_valley|https://www.youtube.com/watch?v=0tJHrxOfp9I
yt_cnn_20200127_old_conspiracy_theories_novel_legal_theories|https://www.youtube.com/watch?v=x6_Aqp091rE
yt_collardvalleycooks_20190814_fried_salmon_patties_old_fashined|https://www.youtube.com/watch?v=ZMWxCoZZ3qM
yt_comedycentral_kristen_schaal_language_sx|https://www.youtube.com/watch?v=GP-orRj2XCE
yt_comedycentralstandup_20191113_sx_advice_middle_school_rachel_mac_spade|https://www.youtube.com/watch?v=70d22_haOiU
yt_cowboy_coffee|https://www.youtube.com/watch?v=7UAoT21eqXI
yt_crazy_gnarls_barkley_streetfunk|https://www.youtube.com/watch?v=JZQzAWzSsn4&list=PLL3xcB0B80KV06T2lqZhG5zUZuwojwuex
yt_crazypockets_aint_got_you_funk|https://www.youtube.com/watch?v=g_xcxu0TTvo&list=PLL3xcB0B80KV06T2lqZhG5zUZuwojwuex&index=2
yt_crazypockets_wonderwall_oasis_funk_darren_criss|https://www.youtube.com/watch?v=jftpg_6SUYk&list=PLL3xcB0B80KV06T2lqZhG5zUZuwojwuex&index=6
yt_crimson_clover|https://www.youtube.com/watch?v=kNjHJeVXxjI&list=PLo2aaBamFnLTfvcYnkey4tPuGhB-DenVx
yt_cursedhexfusion_20120630_george_carlin_how_to_handle_a_cop|https://www.youtube.com/watch?v=SEeVFhKz4UY
yt_dahb007_20200119_0000_two_massive_blobs_under_africa_pacific|https://www.youtube.com/watch?v=pA-VLQ4_ANY
yt_dahb007_20200121_2000_washington_state_cdc_coronavirus|https://www.youtube.com/watch?v=mg4yySpsbbs
yt_dahb007_20200124_2200_coronavirus_timeline|https://www.youtube.com/watch?v=JIGvAVXsfLU
yt_dahbo7_20200201_2020_florida_sinkhole|https://www.youtube.com/watch?v=oQSMvXt1XC8
yt_dahboo7_20200114_1501_xenobots_robots_from_living_cells|https://www.youtube.com/watch?v=c35qNyenqsY
yt_dahboo7_20200114_explosion_spain_chemplant|https://www.youtube.com/watch?v=QuWkdTV26CI
yt_dahboo7_20200115_0000_hearbeat_tracking_longrange_facialrecognition|https://www.youtube.com/watch?v=GOMqWQpKW1A
yt_dahboo7_20200117_0000_antifa_siding_progun_conservatives_virgina|https://www.youtube.com/watch?v=nc0UYfylt38
yt_dahboo7_20200119_richmon|https://www.youtube.com/watch?v=Nk7RR0df3V0
yt_dahboo7_20200123_1600_coronavirus_lockdown_7cities_23million_quarantine|https://www.youtube.com/watch?v=qTBVnemezQo
yt_dahboo7_20200131_cdc_mandatory_quarantine_wyhan_ca|https://www.youtube.com/watch?v=WKO-fORWORg
yt_dahboo7_20200131_shots_maralago_trump|https://www.youtube.com/watch?v=JR4Ipx_XLdo
yt_dahboo7_20200201_apple_china_coronavirus_boston|https://www.youtube.com/watch?v=xA7emX_dqX4
yt_dahboo7_20200203_0900_putin_evacuate_100s_wuhan|https://www.youtube.com/watch?v=tFkgh4OzpbU
yt_dahboo7_20200204_hoodie_ross_never_too_late_official|https://www.youtube.com/watch?v=K4fw5Ku_fKU
yt_dahboo7_20200206_spacerace_us_china_rusia_europe_moon_bases|https://www.youtube.com/watch?v=c1A-n_y-qLw
yt_dahboo7_20200207_1700_outages_downdetector_twitter_directtv_spectrum|https://www.youtube.com/watch?v=JL-KHPDMfSg
yt_dahboo7_20200207_400_million_lockdown_quarantined_china|https://www.youtube.com/watch?v=gfiezX0IWLc
yt_dahboo7_20200207_larg_sinkhole_fire_china_subterr_coalfire|https://www.youtube.com/watch?v=4wpru1jU2IQ
yt_dahboo7_20200209_man_arrested_outside_whitehouse|https://www.youtube.com/watch?v=qX1Tla9VAwk
yt_dalailama_gere_converstikon.jpg|His Holiness the Dalai Lama in Conversation with Richard Gere|https://www.youtube.com/watch?v=bkRgYRA7JnA
yt_dalailama_gere_innerhappiness|https://www.youtube.com/watch?v=tGkuBFHTpMM
yt_danamonicanae_20150806_klezmer_conservatory_tumbalalaika|https://www.youtube.com/watch?v=J1OVP_E6Sng
yt_darmavand_20150916_classical_iran_santur_hossein_farjami|https://www.youtube.com/watch?v=MbmkP4r5ODk
yt_dayboo7_20200201_china_bird_virus_too|https://www.youtube.com/watch?v=oyvUtDoaCxo
yt_demianzx48_20090506_ataikai_kapa_cyy_russian|https://www.youtube.com/watch?v=-WEJxqS91aA
yt_digitalheritageservice_20190220_hammerstocksetzen_in_der_sensenschmiede|https://www.youtube.com/watch?v=TpSbp1OJwtg
yt_dion_abraham_martin_john|https://www.youtube.com/watch?v=a5hFMy4pTrs
yt_divinocecepto_20171220_crazy_andrean_motis_joan_chamorro|https://www.youtube.com/watch?v=O00B76tfK7U
yt_donstunes_20170525_jt_coldfire_shes_crazy|https://www.youtube.com/watch?v=UiHmeHZAc0s
yt_doristunes_20180114_luce_dufault_damn_your_eyes|https://www.youtube.com/watch?v=_KVyorYFcXg
yt_doristunes_20190630_kirk_fletcher_silver_spoon|https://www.youtube.com/watch?v=r3cmXIbiPww
yt_doritunes_20200119_dave_riley_lets_straighten_it_out|https://www.youtube.com/watch?v=jUmVBv1seyU
yt_dresdendelsurchile_20161123_marlene_dietrick_wenn_die_soldaten|https://www.youtube.com/watch?v=4fIxhl0BVt4
yt_drienfoerster_20200206_abu_rawash_pyramid_egypt|https://www.youtube.com/watch?v=jP8Y_ejrS3E
yt_drkoncertuset_20180126_good_bad_ugly|https://www.youtube.com/watch?v=enuOArEfqGo
yt_drludwig_20180819_palastinalied_crusader_song_german|https://www.youtube.com/watch?v=L2UBQArOa5c
yt_drukpa_20150116_0000_dragon_yogis_uncommon_path|https://www.youtube.com/watch?v=ete0HXY2yYs
yt_earthfiles_20200123_1600_wuhan_coronavirus_drones|https://www.youtube.com/watch?v=ZJQ-0-eXgkI
yt_earthfiles_20200129_new_sun_images_coronavirus|https://www.youtube.com/watch?v=KmGtAgIR3JU
yt_earthfiles_20200205_wuhan_coronavirus|https://www.youtube.com/watch?v=N-NBMKBTui8
yt_erutan_20130719_willow_mad_katethegreat19|https://www.youtube.com/watch?v=E52rxz2sjRs
yt_erutan_20180114_jabberwocky|https://www.youtube.com/watch?v=TlyrweRsILk
yt_ethelanima_20160713_tara_veleria_chudaeva|https://www.youtube.com/watch?v=NsMhPy94sYM
yt_ethelanima_20170701_turkey_ottoman_empire_olga_meos_belarus|https://www.youtube.com/watch?v=TUGinrX_sDI
yt_ethelanima_20170702_celts_druids_belarus_2017|https://www.youtube.com/watch?v=F4zi7bJ-dRY
yt_ethelanima_20171204_kira_lebedeva_tribal_fusion_birthdayparty|https://www.youtube.com/watch?v=JL_NhJnwqZ8
yt_ethelanima_20180729_gargoyle_fairytale_concert|https://www.youtube.com/watch?v=SgNZ9cWeXHo
yt_ethelanima_20190710_ghost_past_olga_meos_belarus_2019|https://www.youtube.com/watch?v=crRDR4U0f_w
yt_eurielle_20140908_eurielle_carry_me_official|https://www.youtube.com/watch?v=7QPtFy7OnGE
yt_ewtn_20191209_bishop_fulton_j_sheen_beatification_postponement_raymond_arroyo|https://www.youtube.com/watch?v=6lq-v1JmwxM
yt_fenkow_20100516_tumbalalaika_karsten_troyke_suzanna|https://www.youtube.com/watch?v=UPCRFTJG7WM
yt_fernandomartins_20170501_danca_do_ventre|https://www.youtube.com/watch?v=moFsawMO4Ck
yt_firingline_19700106_williamfbuckley_jr_bishop_fulton_j_sheen|https://www.youtube.com/watch?v=-ZwcU4EfJYM
yt_fixotronic_secret_profile_pipe|https://www.youtube.com/watch?v=LHiPMLELjUE
yt_fox_20200131_nunes_trump_acquitted_but_badnews_tucker|https://www.youtube.com/watch?v=6ZIuSqxZiuY
yt_framupfest_20171027_nastya_yurasova_ira_podshivalova|https://www.youtube.com/watch?v=sviOC6X7-Mg
yt_frenchcookingacad_20180713_creme_brulee_essential_guide|https://www.youtube.com/watch?v=25NHHLXwGrU
yt_frenchcookingacademy_20150703_french_mayonnaise_saice_in_minutes|https://www.youtube.com/watch?v=AHGpyrRRlx0
yt_freshlysqueezed_20130428_swingrowers_via_con_me_its_wonderfull|https://www.youtube.com/watch?v=_vjU-EqwMSo
yt_freshlysqueezed_20130624_swing_republic_fall|https://www.youtube.com/watch?v=BT1KzpthAtM
yt_freshlysqueezed_20190107_minnie_moocher_speakeasy_three_official|https://www.youtube.com/watch?v=UYoATL_ymw8
yt_fulford_20200120_0000|https://www.youtube.com/watch?v=joYB8fpwnuE
yt_gaborhefvel_20140429_george_carlin_language_you_will_not_be_hearing_tonight|https://www.youtube.com/watch?v=z2TjIb4UkBk
yt_gabrielycarijo_20180116_coreografiea_15_anos_gabriety_danca_do_ventre|https://www.youtube.com/watch?v=kH_0S92o8c0
yt_gangstercity_20200117_halsey_new_americana_girls_cars_showtime|https://www.youtube.com/watch?v=Sw4ei0-5kIc
yt_garageband_beinners_guide|https://www.youtube.com/watch?v=QJnfGjVEspU
yt_gato_babieri_shie_is_michelle|https://www.youtube.com/watch?v=G0SZ4rE-QJo
yt_gato_barbierie_brazil|https://www.youtube.com/watch?v=kmCYirclZR8
yt_gato_barbierie_europa|https://www.youtube.com/watch?v=gRIbuIeTew4
yt_gato_barbierie_michelle|https://www.youtube.com/watch?v=G0SZ4rE-QJo
yt_gato_bareieri_20090627_eruopa|https://www.youtube.com/watch?v=gRIbuIeTew4
yt_gato_bareria_santana_europa_samba|https://www.youtube.com/watch?v=RVGMMUglVC4
yt_genaroarteaga_20160912_12fantasia_flamenca_claro_de_luna_beerthoven|https://www.youtube.com/watch?v=aQR6ttLJs1Q
yt_generationclubdo_20140605_helene_amour_secret|https://www.youtube.com/watch?v=bTpr3WNUgKI
yt_gentri_20190916_dannyboy_irish_anthem|https://www.youtube.com/watch?v=KZ3E7kIYtR0
yt_gingerbeer|https://www.youtube.com/watch?v=mfnHCdc3BgA
yt_glenbeck_20200206_obamas_secret_wars_final_piece_ukraine_puzzle|https://www.youtube.com/watch?v=SOvHSfVsLwo
yt_glenbeck_20200207_home|https://www.youtube.com/user/glennbeck
yt_glenfriends_20200125_1930_rootbeer_from_scratch|https://www.youtube.com/watch?v=VdZ4C4gAYto
yt_goats_declassified_true_story_men_who_stare_at_goats|https://www.youtube.com/watch?v=EbbtiCbPPts
yt_goodfootdance_20150910_bellydance_wings|https://www.youtube.com/watch?v=gxodl8HdKzg
yt_gravitasone_20100901_whats_my_line_bishop_fulton_j_sheen|https://www.youtube.com/watch?v=6MRKqYhEUI8
yt_grunge_20200102_little_known_truth_nikola_tesla|https://www.youtube.com/watch?v=ps59lvx0DAU
yt_haleyslays_20140629_hit_the_road_jack_abrams_ballas_zigler|https://www.youtube.com/watch?v=_VCFd32KUVw
yt_hamond_leslie_sound|https://www.youtube.com/watch?v=G5fI3X9BdrQ
yt_hangar18b_20141021_lloyd_pye_starchild_skull_zurich_2010|https://www.youtube.com/watch?v=sZg26L1Y-NE
yt_hdpinkfloyd_20200111_pinkfloyd_3tracks_pulse_remastered|https://www.youtube.com/watch?v=gkLU_He910Y
yt_heftyjaxxatoband_20180224_volare_nel_blu_dipinto_di_blu|https://www.youtube.com/watch?v=4Q1xpCN-vhA
yt_hepburned_20170528_avengers_short_skirt_long_jacket_emma_peel|https://www.youtube.com/watch?v=idtYckLIZnI
yt_hettyjazzatoband_20180210_tintarella_di_luna_hetty|https://www.youtube.com/watch?v=BzB071_VhO4
yt_hipitoninjarez_20180210_national_geographic_2017_starchild_skull_lloyd_pye_2017|https://www.youtube.com/watch?v=t2Kz4ePe8EY
yt_hoagland_20200120_0000|https://www.youtube.com/results?search_query=hoagland+richard
yt_hoagland_20200201_hiding_scared_feminine_dr_boulter|https://www.youtube.com/watch?v=hqv7EUTWDM8
yt_hoagland_20200202_12days_xmas_special_interviewing_jesus|https://www.youtube.com/watch?v=bzNMLakhFU4
yt_hodgens_projection_mask|https://www.youtube.com/watch?v=WefSub8qesQ
yt_hooverinstitute_20090527_andrew_breibart_politics_hollywood|https://www.youtube.com/watch?v=0mTxpFIw-3g
yt_hotsardines_20140910_bei_mir_bist_du_schoen_official|https://www.youtube.com/watch?v=Q4-XIKt-ADs
yt_housatonic_20200100_mark_kulacz_home|https://www.youtube.com/channel/UCVyQ9AtoZYjS8VDyQUu-VtA
yt_housatonic_20200129_ep222b_revisiting_gibson_island_bill_taylor_island_tales|https://www.youtube.com/watch?v=kmzqrh54mjU
yt_housatonic_20200131_ep223_revisiting_gibson_island_neff_is_enough|https://www.youtube.com/watch?v=vAIkHTPXnSQ
yt_howtomakeeverything_20209130_brewing_beer_dirt_grass|https://www.youtube.com/watch?v=QN6BTetUm7g
yt_howtoyodel_20200122_1735|https://www.youtube.com/watch?v=wPBWac-JFls
yt_innefitterosa_20081123_george_carlin_expressions_sayings|https://www.youtube.com/watch?v=k3Zad39QXL4
yt_ipad_beatbox|https://www.youtube.com/watch?v=HPz8Jhd917M
yt_iyla_20181016_juice_official|https://www.youtube.com/watch?v=PPtFBCs9s5Y
yt_jaberwockysuperfly_20171006_george_carlin_persian_gulf_war|https://www.youtube.com/watch?v=CjRQwvnjpPw
yt_jacobgurevitsch_20130628_four_your_love_jacob_gurevitsch_spanish_acoutic_guitar|https://www.youtube.com/watch?v=bGPo1Nm66Rw
yt_jacobkoller_20180329_pink_panther_jazz_piano_sheetmusic|https://www.youtube.com/watch?v=a9QofW0mf4w
yt_jasongoodman_20200202_superb_owl_sunday_charles_operation_dope_upinsmoke|https://www.youtube.com/watch?v=tZizE53-1pw
yt_jausaru_20101210_boodstone_natural_high|https://www.youtube.com/watch?v=t0KzLo0-6Ro
yt_jayeskar_20200102_1300_8free_vst_instruments|https://www.youtube.com/watch?v=YTLQnlN_u50
yt_jennycancook_20140722_no_knead_bread_crusty_artisan_bread|https://www.youtube.com/watch?v=I0t8ZAhb8lQ
yt_jeremy613_20091230_naftali_herstik_alberto_mizrachi_tumbalalaika|https://www.youtube.com/watch?v=H4IF8OmLOMw
yt_jimshorts_20150203_diana_rigg_simply_irresistible|https://www.youtube.com/watch?v=tUy_4M8_ZJI
yt_johnnyferreira_20141028_harlem_nocturn_sax_|https://www.youtube.com/watch?v=jGBVQp14kFo
yt_joyofthefaith_20191211_bishop_fulton_j_sheen_funniest_moments_p1|https://www.youtube.com/watch?v=FZJAgwFCqkg
yt_joyofthefaith_20191211_bishop_fulton_j_sheen_funniest_moments_p2|https://www.youtube.com/watch?v=NCAMqDP1lA4
yt_jsdemon_20120602_esoragoto_sawai_kikanu|https://www.youtube.com/watch?v=HmY1WieykpE
yt_judemcallister_20070619_donovan_sunshine_superman|https://www.youtube.com/watch?v=hTuPbJLqFKI
yt_juditvirag_20131105_nagasita_temple_guardian_dance|https://www.youtube.com/watch?v=sPXiZOg0hdI
yt_kameradkorona_20190322_wenn_die_soldaten_east_german_version|https://www.youtube.com/watch?v=m_6tneTeA1s
yt_killtheweak_20090818_george_carlin_advertising_bull_shit|https://www.youtube.com/watch?v=AtK_YsVInw8
yt_kingsandthings_20180712_5_preserved_roman_buildings|https://www.youtube.com/watch?v=HPzgGW6Cfsk
yt_kiralebedeva_20140324_habibi_lal_ultraviolet_fest|https://www.youtube.com/watch?v=IYMweayzhHU
yt_kiralebedeva_20161017_habibi_lal_tribalsalon_vol2_dance|https://www.youtube.com/watch?v=l48nzJyF8Ac
yt_kiralebedeva_20171207_nicolay_roerich_turn_Mo_on_tos_fullmoon_tf17|https://www.youtube.com/watch?v=sR_CANcz__c
yt_kiralebedeva_20180615_fusion_night|https://www.youtube.com/watch?v=OCjxfnKizcE
yt_kirstendirksen_20200126_pitsburgh_incremental_hous_grow_withu|https://www.youtube.com/watch?v=eXlJOq_twEk
yt_knowhow_20200115_vortex_math_p6_cheatcode_law_attraction|https://www.youtube.com/watch?v=Rhq_Pik0BSs
yt_komaid_20161218_beyond_dr_marys_monkey_2015_edward_t_haslam|https://www.youtube.com/watch?v=ux0QXwUdQQI
yt_kou_proproducer_tries_audacity|https://www.youtube.com/watch?v=uav_7l5WaH4
yt_kou_vortex_math_p3_computer_simulation|https://www.youtube.com/watch?v=fHViShTeo-4
yt_larsheigerash_20120905_keith_emerson_fanfare_forthe_common_man|https://www.youtube.com/watch?v=hqQyLsnSz9s
yt_lasvitaminas_20180224_havana_camila_cabello_youn_thug|https://www.youtube.com/watch?v=WL0iqixMnDc
yt_ledeckyfilm_20141101_ederliezi_lily_jung|https://www.youtube.com/watch?v=SEwVhidIWrU
yt_leonwaves_20181214_largest_chord|https://www.youtube.com/watch?v=HeTygKpi6pI
yt_levenda_20110502_secret_space_program_farrel_marrs|https://www.youtube.com/watch?v=2wvpbHBXKV8&list=PLFD58C4FC606194E8
yt_levenda_20110502_secret_space_program_freedom_central|https://www.youtube.com/watch?v=2wvpbHBXKV8&list=PLFD58C4FC606194E8
yt_lewisblack_20200131_rants_due_mtpleasant_mi|https://www.youtube.com/watch?v=YXnDiku0VjM
yt_lightinbabylon_20170515_ya_sahra_babylon|https://www.youtube.com/watch?v=UwgmqPzVadM
yt_lionelnation_20200129_inmpeachment_no_similarity_rational_thought|https://www.youtube.com/watch?v=rPbBcpCJuv0
yt_lionelnation_20200129_january_homan_trafficking_awareness_tvpa|https://www.youtube.com/watch?v=dhBOnWAxL34
yt_lionelnation_20200202_no_interest_in_superbowl|https://www.youtube.com/watch?v=EkZG_eslAbU
yt_lionelnation_20200203_0900_
yt_lionelnation_20200204_1800_prep_greatest_sotu_ever|https://www.youtube.com/watch?v=ThXvFnn3KZs
yt_lionelnation_20200204_2300_greatest_sotu_ever|https://www.youtube.com/watch?v=ZkSsbxmMzyw
yt_lionelnation_20200204_rush_limbauh_saved_radio_america|https://www.youtube.com/watch?v=z-pJOuv10Wk
yt_lloydpye_20090413_climate_and_maps|https://www.youtube.com/watch?v=HktMEQIx7FY
yt_lloydpye_20130705_everything_you_know_is_wrong|https://www.youtube.com/watch?v=e5qJYwfAju8
yt_lloydpye_20161208_alan_stokes_lloydpye_explains_bigfoot|https://www.youtube.com/watch?v=p3vjoY8Lj0E
yt_lloydpye_20171204_amyvickers_lloyd_pye_rip_best_documentary|https://www.youtube.com/watch?v=jozoul8jHHA
yt_lloydpye_20181025_lloyd_pye_hominids|https://www.youtube.com/watch?v=ZLoL63NXfUs
yt_looneytoons_trump_derangement_syndrome|https://www.youtube.com/watch?v=sAo19bthvWI
yt_lopezrepetto_20120724_club_des_belugas_straight_to_memphis|https://www.youtube.com/watch?v=trnoxBOo-hI
yt_lopezrepetto_20151208_club_des_belugas_lets_go|https://www.youtube.com/watch?v=NgU7RcZ4BWU
yt_louvergnyedition_20151225_jacques_offenbach_les_contes_dhoffman_patricia_janeckova|https://www.youtube.com/watch?v=ybPQKhrQaJ4
yt_makeeverything_wildflower_rubber|https://www.youtube.com/watch?v=VqgH5zkKTKc
yt_malaizkraja_20150403_beth_hart_caught_out_in_the_rain|https://www.youtube.com/watch?v=nCp4HK3FZDg
yt_manboytaipei_20180914_taichung_taiwan_bodybuilding_163cm_no5_chen_jiaxiu|https://www.youtube.com/watch?v=EOKLDn97J8k
yt_mangione_chuck_feels_so_good|https://www.youtube.com/watch?v=FExBwfQHXlE
yt_marcbroussard_20161103_these_arms_of_mine_otis_reddingcover|https://www.youtube.com/watch?v=hV5_zd8Txbo
yt_marcbroussard_20171023_baton_rouge_acoustic|https://www.youtube.com/watch?v=ocw1TzLNytU
yt_marcbroussard_20190510_bring_it_on_home_jamie_mclean_cooke|https://www.youtube.com/watch?v=8dKaIU2R89I
yt_marknewman_20150627_circle_of_fifths_made_clear|https://www.youtube.com/watch?v=_UxzDjU3-hM
yt_maryamshakiba_20140807_maryam_shakiba_odissi_dance_vandana|https://www.youtube.com/watch?v=52bscmW8x80
yt_mcduff_20190921_dr_marys_monkey_ed_haslam_p1_unsolved_murder|https://www.youtube.com/watch?v=47ZE0StYX3I&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc
yt_mcduff_20190923_dr_marys_monkey_ed_haslam_p2_pirate_monkeys|https://www.youtube.com/watch?v=i8ytDQ06QE0&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=2
yt_mcduff_20190924_dr_marys_monkey_ed_haslam_p3_monkey_business_enter_cia|https://www.youtube.com/watch?v=6iLHpOUXuEA&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=3
yt_mcduff_20190925_dr_marys_monkey_ed_haslam_p4_how_could_they_induce_cancer|https://www.youtube.com/watch?v=c2dKL_EQYMY&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=4
yt_mcduff_20190926_dr_marys_monkey_ed_haslam_p5_david_ferrie_and_dr_mary|https://www.youtube.com/watch?v=QbcX85gniUM&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=5
yt_mcduff_20190927_dr_marys_monkey_ed_haslam_p6_ferrie_jesuits_cia|https://www.youtube.com/watch?v=52bVG9hMMgw&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=6
yt_mcduff_20190928_dr_marys_monkey_ed_haslam_p7_ferries_little_lab|https://www.youtube.com/watch?v=vaFg9vQosxI&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=7
yt_mcduff_20190930_dr_marys_monkey_ed_haslam_p8_a_damn_fine_woman|https://www.youtube.com/watch?v=ZIYCbxNh-9Q&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=8
yt_mcduff_20191002_dr_marys_monkey_ed_haslam_p9_oswald_and_dr_o|https://www.youtube.com/watch?v=itYEd-SkDuY&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=9
yt_mcduff_20191003_dr_marys_monkey_ed_haslam_p10_sensitive_position_ochsner_cuba_nixon|https://www.youtube.com/watch?v=bQeL3srdCLU&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=10
yt_mcduff_20191004_dr_marys_monkey_ed_haslam_p11_monkey_viruses|https://www.youtube.com/watch?v=VYjvx1KW5CU&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=11
yt_mcduff_20191007_dr_marys_monkey_ed_haslam_p12_an_ongoing_cancer_epidemic|https://www.youtube.com/watch?v=YP2H96JvOHo&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=12
yt_mcduff_20191009_dr_marys_monkey_ed_haslam_p13_the_fire|https://www.youtube.com/watch?v=yVtZQWL96kc&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=13
yt_mcduff_20191011_dr_marys_monkey_ed_haslam_p14_the_machine|https://www.youtube.com/watch?v=nXhd9BbfpFg&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=14
yt_mcduff_20191015_dr_marys_monkey_ed_haslam_p15_medical_manhattan_project_101419|https://www.youtube.com/watch?v=07489d6A0w0&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=15
yt_mcduff_20191015_dr_marys_monkey_ed_haslam_p16_aids_that_other_epidemic|https://www.youtube.com/watch?v=ZnPHELoFjnQ&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=16
yt_mcduff_20191016_dr_marys_monkey_ed_haslam_p17_biological_weapon|https://www.youtube.com/watch?v=oL_2vB7W6Q0&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=17
yt_mcduff_20191017_dr_marys_monkey_ed_haslam_p18_murdered_within_a_week|https://www.youtube.com/watch?v=hUJQcfMAAyc&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=18
yt_mcduff_20191211_dr_marys_monkey_ed_haslam_judyths_islandhttps://www.youtube.com/watch?v=UB3iRdjI5pY&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=20
yt_mcduff_20200106_marrs_fourth_reich_intro_reading_comments|https://www.youtube.com/watch?v=bUYr-9LMjY8
yt_mcduff_20200107_marrs_rourth_reich_ch02_a_new_reich_begins|https://www.youtube.com/watch?v=fYDPwZhw928
yt_mcduff_20200110_marrs_rourth_reich_ch04_nazi_wonder_weapons|https://www.youtube.com/watch?v=Bmb9giWjLXg
yt_mcduff_20200111_marrs_rourth_reich_ch05_writing_on_the_wall|https://www.youtube.com/watch?v=EDvlg3z04zY
yt_mcduff_20200113_marrs_rourth_reich_ch6_ratlines|https://www.youtube.com/watch?v=ajLC86Fa8po
yt_mcduff_20200117_marrs_rourth_reich_ch07_space_nazis_p2|https://www.youtube.com/watch?v=i95XZbMj29k
yt_mcduff_20200117|https://www.youtube.com/watch?v=pkn12dl6Ex0
yt_mcduff_20200118_1900_fourthreich8_mindcontrol|https://www.youtube.com/watch?v=5gicoRwgwpw
yt_mcduff_20200118_marrs_rourth_reich_ch08_nazi_mind_control|https://www.youtube.com/watch?v=5gicoRwgwpw
yt_mcduff_20200120_0000_home|https://www.youtube.com/channel/UCiAai8IYbDua9mujrNfIVbg
yt_mcduff_20200120_0100_wyne_madsen|https://www.youtube.com/watch?v=uQapuFDXHv8
yt_mcduff_20200121_1200_mindfields_ep2_impeach_tuesday|https://www.youtube.com/watch?v=SLEZtLm0fMo
yt_mcduff_20200121_1900_fourthreich_ch8_nazi_mindcontrol_mkultra|https://www.youtube.com/watch?v=tp_KbqmcdhM
yt_mcduff_20200121_marrs_rourth_reich_ch08_nazi_mind_control_mkultra|https://www.youtube.com/watch?v=tp_KbqmcdhM
yt_mcduff_20200122_marrs_rourth_reich_ch09_business_as_usual_with_nazis|https://www.youtube.com/watch?v=Lf33G2klvLg
yt_mcduff_20200124_2300_fourthreich_kennedy_nazis|https://www.youtube.com/watch?v=QGbMf6JbkyA0
yt_mcduff_20200124_marrs_rourth_reich_ch10_kennedy_and_nazis|https://www.youtube.com/watch?v=QGbMf6JbkyA
yt_mcduff_20200125_1200_mindfields_green_swann_event|https://www.youtube.com/watch?v=P8AuoANj1KM
yt_mcduff_20200125_1630_fourthreich_ch10_kennedy_nazis|https://www.youtube.com/watch?v=QGbMf6JbkyA
yt_mcduff_20200125_marrs_rourth_reich_ch11_nazification_of_america|https://www.youtube.com/watch?v=XudhH9XAZt0
yt_mcduff_20200127_marrs_rourth_reich_ch11_p2_reich_american_style|https://www.youtube.com/watch?v=pb8b4aGEPoo
yt_mcduff_20200128_marrs_rourth_reich_ch12_guns_drugs_eugenics|https://www.youtube.com/watch?v=95NULnl9v1M
yt_mcduff_20200129_0000_fourthreich_ch12p2_population_reduction|https://www.youtube.com/watch?v=KPf4BQIsdaI
yt_mcduff_20200130_1000_mindfields_ep7_friends_family|https://www.youtube.com/watch?v=C5eYnfvHZEQ
yt_mcduff_20200130_hamamoto_|https://www.youtube.com/watch?v=HE7QwXMfekY
yt_mcduff_20200131_2000_fourthreich_ch14_education|https://www.youtube.com/watch?v=PWGDq_Pfjck
yt_mcduff_20200131_fourthreich_ch14_education|https://www.youtube.com/watch?v=PWGDq_Pfjck
yt_mcduff_20200131_marrs_rourth_reich_ch14_education|https://www.youtube.com/watch?v=PWGDq_Pfjck
yt_mcduff_20200201_fourthreich_ch14_education|https://www.youtube.com/watch?v=PWGDq_Pfjck
yt_mcduff_20200203_0900_mindfields_webb|https://www.youtube.com/watch?v=jwYYxeivRxE
yt_mcduff_20200204_1900_mark_kulacz_11am|https://www.youtube.com/watch?v=_fxmjBr4odA
yt_mcduff_20200204_marrs_rourth_reich_ch14_p2_nazi_education_in_america|https://www.youtube.com/watch?v=_vZokVA2u7g
yt_mcduff_20200205_fourthreich_ch14p2_nazi_education_in_america|https://www.youtube.com/watch?v=_vZokVA2u7g
yt_mcduff_20200205_marrs_rourth_reich_ch15_psychology_public_control|https://www.youtube.com/watch?v=Szf30BFeDLs
yt_mcduff_20200207_fourthreich_finalchapter_epilogue|https://www.youtube.com/watch?v=3z33_Zr3N5g
yt_mcduff_20200207_mark_kulacz_kludge_neff_brothers_more|https://www.youtube.com/watch?v=oiJe_LjPoRs
yt_mcduff_20200207_marrs_rourth_reich_ch99_final_chapter_epilogue|https://www.youtube.com/watch?v=3z33_Zr3N5g
yt_mcduff_20200207_mcduffs_mindfields_ep8_bob_marleys_75_birthday|https://www.youtube.com/watch?v=MkBNISHHD8A
yt_mcduff_20200208_american_princelings_peter_schwetzers_secret_empires|https://www.youtube.com/watch?v=NYJUzqJzAVE
yt_mcduff_20200208_mobie_test2_thomas_manor_port_tobacco_river|https://www.youtube.com/watch?v=dUtniknRSCA
yt_mcduff_fourthreich_ch9_business_as_usual|https://www.youtube.com/watch?v=Lf33G2klvLg
yt_mcduff_mark_kulacz|https://www.youtube.com/watch?v=sdI1TOSUXZg
yt_mdcuff_20200120_0200_mindfied_e1_white_nationalists|https://www.youtube.com/watch?v=kG_to54SGcQ
yt_mentar99_20100927_george_carlin_stupid_people|https://www.youtube.com/watch?v=8rh6qqsmxNs
yt_mentrol4664_20110430_tumbalalajka|https://www.youtube.com/watch?v=Zfil4kbGN5U
yt_mermaidmotel_20171223_lana_del_rey_cola|https://www.youtube.com/watch?v=3zgdxI7W_Q4
yt_mgmusic_20160624_kid_creole_coconuts_stoolpigeon_rockpalas|https://www.youtube.com/watch?v=kfEU6YdlL5Y
yt_milelisieux_20110409_tumbalalaika_tzion_yevarechecha|https://www.youtube.com/watch?v=3VEA1XtEDH8
yt_misicians_tiny_hous_studion|https://www.youtube.com/watch?v=cargPBU2Ocs
yt_montypython_adventures_martin_luther|https://www.youtube.com/watch?v=YXzubuENjHk
yt_morganjames_20200131_give_you_up_morgan_james_official|https://www.youtube.com/watch?v=vQYvTBkWkW8
yt_motvmate_20180717_alan_watts_principle_of_not_forcing|https://www.youtube.com/watch?v=ZzaUGhhnlQ8
yt_movieclips_20110528_sirens_o_brother_where_art_thou_5-10|https://www.youtube.com/watch?v=_dl2L4v6ecM
yt_mrpresident420_20130717_america_one_big_lie_fool_for_bellieving|https://www.youtube.com/watch?v=YqdsNxS_fk8
yt_mucduff_20200206_1800_mark_kulacz_john_kluge_neff_brothers|https://www.youtube.com/watch?v=oiJe_LjPoRs
yt_mulliganbrothers_20171114_alan_watts_most_epic_speech|https://www.youtube.com/watch?v=fxRo8qHjJaw
yt_munder_20200119_terminators_unleashed|https://www.youtube.com/watch?v=bSeZbpUQ5Pk
yt_munder_20200120_1701_mystery_china_corona_virus|https://www.youtube.com/watch?v=ltA9BmYMFi0
yt_munder_20200120_1702_googlecritic_robert_epstein_wife_accident|https://www.youtube.com/watch?v=WuKPhJMWNJ4
yt_munder_20200124_0000_stalite_boeing_directtv_explode|https://www.youtube.com/watch?v=Mmg_kkt4c48
yt_munder_20200124_2200_canada_china_trained_staff_biolab|https://www.youtube.com/watch?v=s9JAuF6hRy8
yt_munder_20200124_turkey_earthquake_68|https://www.youtube.com/watch?v=uN2CHNuHPn4
yt_munder_20200131_1300_shits_fired_maralago|https://www.youtube.com/watch?v=b3iWO60Rr3g
yt_munder_20200131_wuhan_sealed_off_roads_blocked_cdc_can_detain|https://www.youtube.com/watch?v=cr5NAlSv8ZQ
yt_munder_20200201_2000_wuhan_body_count_coverup|https://www.youtube.com/watch?v=yben1U0tVk4
yt_munder_20200201_striesand_nyc_subway_protestors|https://www.youtube.com/watch?v=U3z-yqptj70
yt_munder_20200202_2000_joker_predicts_chiefs_win|https://www.youtube.com/watch?v=WmgnPYIWHyM
yt_munder_20200204_people_ripped_out_houses_mandatory_quarantine_time_china|https://www.youtube.com/watch?v=70COaGPOpRs
yt_munder_20200204_wuhan_death_smoke_fog|https://www.youtube.com/watch?v=rXAJL1jUbjE
yt_munder_20200205_1800_lindsay_graphm_come_back_your_way|https://www.youtube.com/watch?v=wVIwYbxvxlI
yt_munder_20200205_1900_pelos_broke_law_sotu|https://www.youtube.com/watch?v=ms1P6L3ej0Y
yt_munder_20200205_pelosi_rips_trumps_sotu_speech|https://www.youtube.com/watch?v=sg4kXr7Lgp0
yt_munder_20200207_alexander_vindman_nsc_brother_fired_escorted|https://www.youtube.com/watch?v=5Mxl6Y3wky0
yt_munder_20200207_sotu_timetravel_12monkies_femacruis|https://www.youtube.com/watch?v=thVBK7ZAm9E
yt_munder_20200208_1500_usa_troops_take_fire_afghanistan_green_on_blue|https://www.youtube.com/watch?v=CRoUDdjMZ9E
yt_munder_20200208_french_town_names_contamination_breakout_ncov|https://www.youtube.com/watch?v=eEtbthj0-Ds
yt_munder_20200209_irans_zafar_satellite_launch_failure|https://www.youtube.com/watch?v=Aqn9IhkAQRg
yt_munder_qpotus_protecting_fro_prosecution|https://www.youtube.com/watch?v=3UDpfrUtH_A
yt_neweaerth_20200205_unknown_sicily_megalith_pyramids_grottoes_p1|https://www.youtube.com/watch?v=rz1GdL2Z1Jc
yt_newearth_20200119_sardina|https://www.youtube.com/watch?v=o6mAT-xNxhI
yt_newearth_20200121_freespeech_reality_videoplatforms|https://www.youtube.com/watch?v=FtGGbutDAOw
yt_newearth_20200123_1600_cagliani_necropolises_p7_2019_sardinia|https://www.youtube.com/watch?v=qawcfxt_QOA
yt_newearth_20200123_caglian_rock_cut_necropolises_sardinia|https://www.youtube.com/watch?v=qawcfxt_QOA
yt_newearth_20200125_1915_paintings_lucky_draw|https://www.youtube.com/watch?v=EeOJlLFYeyA
yt_newearth_20200209_holistic_cure_p1_physical_health_problems|https://www.youtube.com/watch?v=y66cp_rW9GU
yt_nightbirdsobsession_20150603_postmodern_jukebox_morgan_james_take_me_to_church|https://www.youtube.com/watch?v=bwHVmgJXdoo
yt_nnigani_20091117_pink_martini_una_note_a_napoli|https://www.youtube.com/watch?v=by67NOZLPWI
yt_nnigani_20140423_sophie_zelmani_stay_whith_my_heart|https://www.youtube.com/watch?v=VEgyDYS-iEY
yt_nnigani_20161118_hotsardines_petite_fleur|https://www.youtube.com/watch?v=o10AM5-NpMk
yt_nytimes|20130926_sinkhole_louisiana|https://www.youtube.com/watch?v=a7cOSzEKvrQ
yt_oldguitarmonkey_20180208_welcom_to_my_world_reeves_cover_dave_monk|https://www.youtube.com/watch?v=lJ82BLfiCjg
yt_orhonline_20191205_bishop_fulton_j_sheen_denied_again|https://www.youtube.com/watch?v=NMdge6H3PmA
yt_osaka_20200130_osaka_kongou_sudare_bamboo_craft|https://www.youtube.com/watch?v=9bW26CcjlQc
yt_outerlight_20200112_2200_5thngs_coronavirus_wuhan|https://www.youtube.com/watch?v=t0hIcbIBwJM
yt_outerlight_20200124_1900_coronoavirus_wuhan|https://www.youtube.com/watch?v=OsYsLGqhPGw
yt_outerlight_20200130_kobe_bryant_crash_predicated_simpsons|yt_outerlight_20200130_kobe_bryant_crash_predicted_simpsons|https://www.youtube.com/watch?v=Bp2zJ5U31Ow
yt_outerlight_20200130_wuhan_whistleblower|https://www.youtube.com/watch?v=E7-iUoxnaiY
yt_outerlight_20200131_indian_scientists_claim_hiv_insertions_coronavirus|https://www.youtube.com/watch?v=ma9JqR4eW_k
yt_outerlight_20200204_0900_problems_testing_2019ncov_virus|https://www.youtube.com/watch?v=WKVH1A47Sr8
yt_outerlight_20200204_iowas_infamous_coin_toss_shadow|https://www.youtube.com/watch?v=G3sCKGfoztk
yt_outerlight_20200206_wikipedia_deletes_phd_in_pathology__coronavirus|https://www.youtube.com/watch?v=iKkQ_I-BqOY
yt_outerlight_20200207_video_wuhan_plane_coronavirus|https://www.youtube.com/watch?v=9JDIbZMl7xU
yt_outerlight_epstein_mit_youngas11|https://www.youtube.com/watch?v=b0kPZjQUOWk
yt_outerlight_rober_epstein_wife_car_accident|https://www.youtube.com/watch?v=MEPTepOQSYI
yt_paracordguild_20200119_bullhitch|https://www.youtube.com/watch?v=5Chlmy0vRMs
yt_parshwanahupadhye_20200122_varnam_kamboji_ata_tala|https://www.youtube.com/watch?v=9JomYw6co_U
yt_patsy_cline_3cigaretts|https://www.youtube.com/watch?v=Pb2oXxvvfMw
yt_paulbarton_20200122_beethoven_moonlight_sonata_old_elephant|https://www.youtube.com/watch?v=_4AcjvsVn5k
yt_pbshewshour_20200127_pam_bondi_biden_corruption_concerns_legitimate_impeachment|https://www.youtube.com/watch?v=oPvMuzyVOig
yt_petergundry_20191205_norse_viking_lady_ofthe_dawn_extended|https://www.youtube.com/watch?v=3aMKnHkeJEQ
yt_playingforchange_20200131_turn_your_lights_down_low|https://www.youtube.com/watch?v=UsYQ1h7hcWo
yt_politico_20200127_impeachment_trial_day6_defense_bidens|https://www.youtube.com/watch?v=ncgko-ZA3JA
yt_pomplamoose_20180504_bulletproof_la_roux|https://www.youtube.com/watch?v=CKeVQca3kQo
yt_pomplamoosemusic_20180726_beatles_eleanor_rigby_pomplamoose|https://www.youtube.com/watch?v=QVz65Phjqbc
yt_pomplamoosemusic_20191212_sous_le_ciel_de_paris_edith_piaf|https://www.youtube.com/watch?v=Vol9dZ-t93s
yt_pomplamousemusic_20190607_french_tune_brassens_schroeder|https://www.youtube.com/watch?v=kTP246fnKAI
yt_postmodermjukebox_dreamon|https://www.youtube.com/watch?v=Yq4KA0mUnC8
yt_postmodernjukebox_20131022_blurredlines_robin_thicke_bluegrass_barn_dance|https://www.youtube.com/watch?v=Nz-OMn1o22Y
yt_postmodernjukebox_20140826_mans_world_orchestralfunk_morgan_james|https://www.youtube.com/watch?v=mPimt0Zu_To
yt_postmodernjukebox_20150407_creep_haley_reinhart|https://www.youtube.com/watch?v=m3lF2qEA2cw
yt_postmodernjukebox_20150709_opps_did_it_again_vintage_monroestyle|https://www.youtube.com/watch?v=g_HN50TLuaI
yt_postmodernjukebox_20151029_austinpowers_rhcp_aubrey_logan|https://www.youtube.com/watch?v=ufvZzhK_3X8
yt_postmodernjukebox_20160616_blackholesun_soundgarden_cover_haley_reinhart|https://www.youtube.com/watch?v=R6RD6mjiIZE
yt_postmodernjukebox_20190222_kings_leon_sx_on_fire_adanna_duru|https://www.youtube.com/watch?v=MhmpfPvpKaA
yt_postmodernjukebox_just_what_i_needed_sara_miemietz|https://www.youtube.com/watch?v=fNTtEntQ-oM
yt_prince_crimson_clover|https://www.youtube.com/watch?v=a4RPkoURwL8
yt_pstmodernjukebox_20200131_99_lufballons_jazz_vibes_aly_ryan|https://www.youtube.com/watch?v=TliE9rTrzXg
yt_pursuitoftruth_ipot_sweet_virginia_pursuit_truth_20200118|https://www.youtube.com/watch?v=6FRTq6LvNgU
yt_qanon_eisenhower_military_inddustrial_complex|https://www.youtube.com/watch?v=8y06NSBBRtY
yt_quantastic_20200128_woodcarving_another_level|https://www.youtube.com/watch?v=UF7Ty_q_MAs
yt_quantum_tech_hd_20180302_15_crazy_inventions_existed|https://www.youtube.com/watch?v=9jj8j3HCevA
yt_quantumtech|efficiency_home_logs|https://www.youtube.com/watch?v=NMjtvSABQ3Q
yt_queenherby_20190820_sos_vignette|https://www.youtube.com/watch?v=vAsogan9JTI
yt_quinn_20200118_0001_more_sounds|https://www.youtube.com/watch?v=JAjxzbjCexI
yt_quinn_20200120_0000_indra_live_sculpture|https://www.youtube.com/watch?v=AbonpvIAshU
yt_quinn_20200120_0100_indralive|https://www.youtube.com/watch?v=G3RUgFvKuHA
yt_quinn_20200122_1700_indra_rescue_deva_lds|https://www.youtube.com/watch?v=xQkczDHmbUk
yt_quinn_20200122_1800_singing_bowl_from_target|https://www.youtube.com/watch?v=d4NxYCLwVLM
yt_quinn_20200122_2300_indra_deva_singing_bowl|zhttps://www.youtube.com/watch?v=y9OuOZAEcyo
yt_quinn_20200123_1600_indra_youtubers_at_it_agin|https://www.youtube.com/watch?v=tOB2PGU8Grs
yt_quinn_20200124_1400_indra_deva_light_saber|https://www.youtube.com/watch?v=cEwKMMWMyQE
yt_quinn_20200124_1450_indra_deva_doing_it_again|https://www.youtube.com/watch?v=c_nUt8tFV1o
yt_quinn_20200124_2300_sandlesocks_indra_deva_mail_offering|https://www.youtube.com/watch?v=eWrBBr0lQ1I
yt_quinn_20200125_1600_indra_eyes|https://www.youtube.com/watch?v=WCpGbP_paXM
yt_quinn_20200125_1630_indra_third_eye_chakra|https://www.youtube.com/watch?v=J5vE5azIZSk
yt_quinn_20200126_1130_indra_work|https://www.youtube.com/watch?v=I441ZkMQ2YE
yt_quinn_20200126_1630_indra_indrani_jayanta_jayanti|https://www.youtube.com/watch?v=BX2BuiZZYi0
yt_quinn_20200129_1300_indra_deva_particle_accelerator|https://www.youtube.com/watch?v=GlE1n7ubQ4A
yt_quinn_20200130_1000_indra_deva_great_morning_keyboards|https://www.youtube.com/watch?v=4CV9mou8QRs
yt_quinn_20200131_1300_indra_deva_doing_shuffle_up|https://www.youtube.com/watch?v=y703WH2jRFk
yt_quinn_20200177_buddhist_code|https://www.youtube.com/watch?v=V_yh3CEAxpA
yt_quinn_20200177_got_most_pieces_indra_device|https://www.youtube.com/watch?v=hIi6B0bTFzU
yt_quinn_20200201_1300_indra_deva_core_power|https://www.youtube.com/watch?v=eqm2aBoLKbY
yt_quinn_20200201_1900_indra_deva_confused_goddess_and_trolls|https://www.youtube.com/watch?v=fTHHJS47qKA
yt_quinn_20200201_2000_indra_deva_up_close_and_personal|https://www.youtube.com/watch?v=B9RuGAwm14Q
yt_quinn_20200202_2000_indra_please_protect_ofering|https://www.youtube.com/watch?v=NudPsJ9k2vg
yt_quinn_20200202_2400_indra_patreon_trees|https://www.youtube.com/watch?v=Uvf__q-od1o
yt_quinn_20200203_0900_indra_deva_stick1|https://www.youtube.com/watch?v=CGER4z30_N8
yt_quinn_20200204_1900_
yt_quinn_20200205_1200_800sqmi_40mi_good_diamonds_nopoop|https://www.youtube.com/watch?v=75TFqf3eT_I
yt_quinn_20200205_1600_indra_deva_million_dollar_chocolate|https://www.youtube.com/watch?v=Dyyht4tG9tQ
yt_quinn_20200207_1700_indra_deva_dumplings|https://www.youtube.com/watch?v=gfYT_d8bUAA
yt_quinn_20200207_thanks_tyler_qanon_merit_marma_indra_deva_warning|https://www.youtube.com/watch?v=aK8iKqY4Mn4
yt_quinn_20200208_1100_indra_deva_saturday_in_the_park|https://www.youtube.com/watch?v=eclE3eZPY50
yt_quinn_20200209_indra_deva_what_if_tyler_made_fair_exchange_offing|https://www.youtube.com/watch?v=Jyf9dYHPFH0
yt_quinn_20200209_only_ever_worked_with_tyler_deva_no_other_tyler|https://www.youtube.com/watch?v=V03X5v5d6rI
yt_quinn_20200209_see_ya_later_twitter_deleting_app|https://www.youtube.com/watch?v=p2RkhTBAyG0
yt_quinn_20201818_0002_getingbetter_dont_ask what_ucando|https://www.youtube.com/watch?v=CcGAaLsXhGs
yt_quinn_indra_deva_flowers|https://www.youtube.com/watch?v=-lMKVe04aW8
yt_recordkickscatalogue_20130427_link_quartet_rubber_monkey|https://www.youtube.com/watch?v=L-Cd40tVqYE:w
yt_reneedominique_20180621_somewhere_only_we_know_keane_cover|https://www.youtube.com/watch?v=LCHRBn2hoOk
yt_restorationstation_20200207_push_reel_mower_restoration|https://www.youtube.com/watch?v=e5vCJz3mK6w
yt_robertlandry_20161115_bishop_fulton_j_sheen_three_drunks_worth_knowing|https://www.youtube.com/watch?v=o2V7oQBGOfc
yt_robynadeleanderson_20171121_suerte_whenever_wherever_shakira|https://www.youtube.com/watch?v=DIGVWsXKOEs
yt_robynadeleanderson_20180410_bawitdaba_1940_kristina_nieskens_krauss|https://www.youtube.com/watch?v=q-t3FXjHfsU
yt_robynadeleanderson_20190806_breg_me_to_life_evanescence_swing_robyn_adele|https://www.youtube.com/watch?v=Odcv_KwFQ90
yt_robynadeleanderson_20200128_paint_it_back|https://www.youtube.com/watch?v=jQYOQOBc57A
yt_ronaldrock_20150219_talking_heads_life_during_wartime_live_83|https://www.youtube.com/watch?v=jShMQw2H2cM
yt_ronnie_barker_mispronunciation_sketch|https://www.youtube.com/watch?v=aJ0nFQgRApY
yt_roseerna_20171112_arbian_belly_dance_music|https://www.youtube.com/watch?v=-doBnvQEmEc
yt_rozzi_kiss_prince_cover|https://www.youtube.com/watch?v=Y63m5JqCziE
yt_russelscott_20170329_melanie_young_question_legitimacy_starchild_skull_lloyd_pye|https://www.youtube.com/watch?v=fSB4WkUc1LU
yt_sather_20200208_back_channel_censorship_qanon|https://www.youtube.com/watch?v=VLxlCXAuo08
yt_scarypockets_vultpeck_wait_forthe_moment|https://www.youtube.com/watch?v=myzNf5kW1kQ
yt_scharpachmasterguitars_20161102_oblivion_nadja_kossinskaja|https://www.youtube.com/watch?v=Ez62cQPYyI8
yt_scienceandnonduality_20191122_paul_stamets_treasure_called_psilocybes|https://www.youtube.com/watch?v=-4zsJAADuxY
yt_scienceasylum_20200115_what_heck_is_a_tensor|https://www.youtube.com/watch?v=bpG3gqDM80w
yt_scottdw_20150323_oldwest_dance_battle|https://www.youtube.com/watch?v=GwMFEtgkvP4
yt_sctv_5neat_guys|https://www.youtube.com/watch?v=NMjtvSABQ3Q
yt_secureteam_20200120_0000_willreturn|https://www.youtube.com/watch?v=jboig7qvUVI
yt_secureteam_20200201_returns_tonight|https://www.youtube.com/watch?v=OfxnQRSFRZQ
yt_seeker_20190908_synthetic_dna_new_forms_life|https://www.youtube.com/watch?v=DxoLoOtyllU
yt_seeker_20200129_1300_race_mine_moon_whats_coming|https://www.youtube.com/watch?v=5vbiiI2Y7_Q
yt_seeker_20200203_xenobot_first_very_living_robot|https://www.youtube.com/watch?v=wL64jqYn4CE
yt_segmentd_woodturning_vase_1025_pieces|https://www.youtube.com/watch?v=LgCs5uSbSBQ
yt_sensusfidelium_20141002_bishop_fulton_j_sheen_sympath_for_the_mentally_sick|https://www.youtube.com/watch?v=FZJAgwFCqkg
yt_sensusfidelium_divine_sense_of_humor_bishop_fulton_j_sheen|https://www.youtube.com/watch?v=xGSsPFw52b8
yt_seribusatu_20170806_thousand_hands_dance|https://www.youtube.com/watch?v=Yk5eCbMzetU
yt_shanjolasinas_20160313_joana_deutsch|https://www.youtube.com/watch?v=YU4OYQJd2lU
yt_sheelaunnissridevi_nrithyalaya_20200203_ganesa_pancharatham_group_present|https://www.youtube.com/watch?v=j0azu4hPaD8
yt_sheetmusicboss_20190525_mozarts_most_terrifying_aria|https://www.youtube.com/watch?v=IadMiijgNFo
yt_shift_looneytoons_trump|https://www.youtube.com/watch?v=uQJoar17jyo
yt_shortoftheweek_negative_space|https://www.youtube.com/watch?v=KI2lsdXJQ40
yt_shosahana_zuboff_surveillance_capaitalis|https://www.youtube.com/watch?v=hIXhnWUmMvw
yt_silviaslamonca_20180504_cues_tattoos_dance|https://www.youtube.com/watch?v=-bPm7WOUAS0
yt_simasf_20150101_mtv_into_amy_whinehouse_complete|https://www.youtube.com/watch?v=gkUIu7Fs1JY
yt_skivbolagetnational_20120612_missli_heart_goes_boom_official|https://www.youtube.com/watch?v=58nmD7Yu1Og
yt_skylargrey_20180201_stand_by_me_official|https://www.youtube.com/watch?v=T2bcUxUOUQg
yt_smithsonian_20131024_wasnt_supposed_sphinx|https://www.youtube.com/watch?v=FcgL0Is-pVU
yt_soikl5_arnold_schw_asia|https://www.youtube.com/watch?v=C247JvgKExM
yt_soundsofpower_20170907_sounds_of_power_music|https://www.youtube.com/watch?v=f78n1eHYrIE
yt_spreadgreen_20181225_polygon_1_method_draw|https://www.youtube.com/watch?v=rt7qTvPYVXE
yt_stancostanchev_20100505_tumbalaka_slides|https://www.youtube.com/watch?v=He3efzCCwfA
yt_standupmaths_20160303_there_is_only_one_true_parabola|https://www.youtube.com/watch?v=hoh4TmPzu1w
yt_stroppy_20200121_2000_and_were_away|https://www.youtube.com/watch?v=opOQ5UpTkTY
yt_stroppyme_20200120_2000_q_allswell_that_endswell|https://www.youtube.com/watch?v=Mci6dD3Biik
yt_stroppyme_20200123_1600_declass|https://www.youtube.com/results?search_query=stroppyme
yt_stroppyme_20200123_is_someon_about_to_die|https://www.youtube.com/watch?v=UeOWeY7S3Q0
yt_stroppyme_20200125_1600_stefan_halper_spy|https://www.youtube.com/watch?v=98qwruaNgmk
yt_stroppyme_20200125_1900_dtupid_dems|https://www.youtube.com/watch?v=n2atjW-LUoo
yt_stroppyme_20200130_justice_roberts_independent|https://www.youtube.com/watch?v=a5QhoV3UY-E
yt_stroppyme_20200130_ukraine_investigates_obama_biden|https://www.youtube.com/watch?v=xAFeZl1ST3g
yt_stroppyme_20200131_qanon_can_we_move_on_yet|https://www.youtube.com/watch?v=EQjP7DGUMDg
yt_stroppyme_20200201_schiff_ukraine_connection|https://www.youtube.com/watch?v=p5tdnyrpaG8
yt_stroppyme_20200203_1800_qanon_posts_related_news|https://www.youtube.com/watch?v=QKTecrGczOQ
yt_stroppyme_20200204_0900_whats_next_cruz_graham_speculate|https://www.youtube.com/watch?v=oQPJMuZKssY
yt_stroppyme_20200204_childish_nasty_nancy|https://www.youtube.com/watch?v=aE_zW4HYAN0
yt_stroppyme_20200205_2300_panic_in_dc|https://www.youtube.com/watch?v=bQ-8sNUURaA
yt_stroppyme_20200205_nasty_nancys_antics_backfire_big_time|https://www.youtube.com/watch?v=mOD8dn32gU0
yt_stroppyme_20200207_0500_trump_wins_again|https://www.youtube.com/watch?v=qysYH_0f3-g
yt_stroppyme_20200207_2000_your_fired_and_youre_fired_next|https://www.youtube.com/watch?v=Q2gtDcdtVKU
yt_stroppyme_20200207_hunter_becomes_hunted|https://www.youtube.com/watch?v=Piy8yZt3Jes
yt_stroppyme_20200207_sorry_to_let_you_down_email_stroppy@internode.on.net|https://www.youtube.com/watch?v=w1U6dhQfH7o
yt_stroppyme_20200209_qanon_update|https://www.youtube.com/watch?v=efJwilXzfKM
yt_studiobrussel_20160704_drinkee_sofi_tukker|https://www.youtube.com/watch?v=ZJlDcFpB4WI
yt_tahitinu_20160812_oceane_ehrhardt_dance|https://www.youtube.com/watch?v=J7lz4F1sBQA
yt_tapioski_20180510_agata_lys_somos_dios|https://www.youtube.com/watch?v=ONcELKWPdbk
yt_targ_russel_mind_matter|https://www.youtube.com/watch?v=AEAGsaLADig
yt_tauturneitas_20180622_raganu_nakts|https://www.youtube.com/watch?v=LsgO5OTUsRU
yt_ted_20110629_rejesh_rao_computing_rosetta_stone_indus_script|https://www.youtube.com/watch?v=kwYxHPXIaao
yt_ted_20160426_habits_original_thinkers_adam_grant|https://www.youtube.com/watch?v=fxbCHn6gE3U
yt_ted_20170913_why_we_believe_things_that_arent_tru_philip_fernbach|https://www.youtube.com/watch?v=jobYTQTgeUE
yt_ted_20190918_oliver_sacks_what_hallucination_reveals_about_our_minds|https://www.youtube.com/watch?v=SgOTaXhbqPQ
yt_ted_2020141021_why_majority_always_wrong_paul_rulkens|https://www.youtube.com/watch?v=VNGFep6rncY
yt_tedxtalks_20130201_power_seduction_everyday_lives_chen_lizra|https://www.youtube.com/watch?v=TBIL2sdfoVc
yt_tengizmosidze_20140413_tango_los_mareados_mulia_winar_kirill_parshakov|https://www.youtube.com/watch?v=v3_ZG-BpFDA
yt_thiojoe_20191204_20_keyboard_shortchuts_moron_not_using|https://www.youtube.com/watch?v=RQaTIS85VKE
yt_timeline_20170407_cocaine_mummies_egypt|https://www.youtube.com/watch?v=57gaB1VtJiQ
yt_tinyhouse_lord_ofthe_rings_conversion_van|https://www.youtube.com/watch?v=IBNVYFnxGOg
yt_tonyfree_20120908_emma_peel_man_appeal|https://www.youtube.com/watch?v=CfP5c4jlQBM
yt_townsends_20170626_simple_quick_bread|https://www.youtube.com/watch?v=ecnSW1t4dLk
yt_townsends_20200124_1900_cats_tavern|https://www.youtube.com/watch?v=5ped60E6nOY
yt_traditionalchina_20171210_tong_li_beautiful_chinese_song_longsleve|https://www.youtube.com/watch?v=eXrxVsomD_k
yt_tribalbeatdanceco_20190424_tribal_beat_fest_dance|https://www.youtube.com/watch?v=joqlO-UcHzs
yt_tribalmafia_20160418_anastasia_minashkina_soqotra|https://www.youtube.com/watch?v=UdQshRbiX0Q
yt_tribalmafia_20170815_tnaha_dance|https://www.youtube.com/watch?v=_DTMoZf1jis
yt_trile_20190809_ornaments_painting|https://www.youtube.com/watch?v=RAideQvR5c0
yt_trinityorchestra_20120816_dark_side_moon_pink_floyds|https://www.youtube.com/watch?v=UnB4spzCVEc&list=RDUnB4spzCVEc&start_radio=1
yt_twominutepapers_20200128_differentiable_physics|https://www.youtube.com/watch?v=T7w7QuYa4SQ
yt_twominutepapers_20200201_near_perfect_face_synthesis_more|https://www.youtube.com/watch?v=SWoravHhsUU
yt_twominutepapers_20200208_neural_network_restores_old_videos|https://www.youtube.com/watch?v=EjVzjxihGvU
yt_universeinsideyou_mind_power_mystery_teaching|https://www.youtube.com/watch?v=nucKEm2m-BQ&list=PLqIfsK_gZ7ZHBguYs1pJhI2tfKuwwP-Ez
yt_vald9vt_20200205_1800_honshan_mexico_figurines|https://www.youtube.com/watch?v=M0RE-zVSaTQ
yt_vektormusic_20110308_wicked_game_chris_isaak_cover|https://www.youtube.com/watch?v=XSXh_L8IUvA
yt_vertasium_20200129_equation_see_the_world|https://www.youtube.com/watch?v=ovJcsL7vyrk
yt_vipertv_20180701_sumerian_tablets_texts_exposed|https://www.youtube.com/watch?v=ykVwsJaHqik
yt_vipertv_20180702_sumerian_tablets_incredible_puzzling_secrets|https://www.youtube.com/watch?v=AB0IE0P-kuM
yt_vipertv_20190120_enki_sumerian_records_wide_open|https://www.youtube.com/watch?v=Ibd4Q5K1aqw
yt_vipertv_20200107_eqyptians_nephilim_meeting_ramses|https://www.youtube.com/watch?v=ASSoKoU_FxM
yt_vipertv_20200126_1200_ancient_sumerian_tech|https://www.youtube.com/watch?v=Rw5wXTJ3ybo
yt_vipertv_20200202_newly_decoded_aztec_history|https://www.youtube.com/watch?v=FWMRqEJRJAQ
yt_vipertv_20200208_golden_city_found_peru|https://www.youtube.com/watch?v=9IrPEnuFOps
yt_vipertv_sumerians_peru|https://www.youtube.com/watch?v=-Iak_DNVxWU
yt_viscounts_harlem_nacturn|https://www.youtube.com/watch?v=qfWbRWTfKFg
yt_vlad9tv_20200207_ancient_celestial_events_p2|https://www.youtube.com/watch?v=E8oVTQY7WxI
yt_vlad9vt_20200119_grandiose_mingun_stupa|https://www.youtube.com/watch?v=UfDQGY92BYo
yt_vlad9vt_20200129_unknown_symbols_tassili_naijer_p2|https://www.youtube.com/watch?v=NFVSjr4UHRc
yt_vlad9vt_20200203_egil_kalesini_mystery_anatolia|https://www.youtube.com/watch?v=E_pR95DRooU
yt_vlad9vt_20200209_yonaguni_mysterious_underwater_structure|https://www.youtube.com/watch?v=S-UGC-gkyCU
yt_vlad9vt_geoglyphs_mexico_p1|https://www.youtube.com/watch?v=DMLZGFLrz-E
yt_vlad9vt_megalithic_japan_p2_20200113|https://www.youtube.com/watch?v=UDzbNCOhrVI
yt_vlad9vt|bazda_quarries_caves|https://www.youtube.com/watch?v=vQ008VqCd9E
yt_vox_20160921_1996_hubble_phot_changed_astonomy|https://www.youtube.com/watch?v=95Tc0Rk2cNg
yt_vpro_vriije_geluiden_20170422|https://www.youtube.com/watch?v=HIAOG9nhrt8
yt_webb_20191004_trump_takedown_team_same_as_iran_contra_blood_trail|https://www.youtube.com/watch?v=AN5Gu2rrRUc&list=PLgK98A09pSTJP96qAAoCg93KWq7jRhxzc&index=19
yt_webb_20200118_odeh_100b_iraq|https://www.youtube.com/watch?v=EPrFzIE9Shc
yt_webb_20200120_0000_dan_hopsikker_strzok_parnas_redstone|https://www.youtube.com/watch?v=C2RX0jT0BdI
yt_webb_20200121_1600_vindman|https://www.youtube.com/watch?v=0cQzIy7l0kA
yt_webb_20200121_2000_1stwitness_leonid_vidman|https://www.youtube.com/watch?v=oz0oLLj23p8
yt_webb_20200122_1700_biden_material_witness|https://www.youtube.com/watch?v=hK7iCiEvePg
yt_webb_20200124_1900_matt_gonter_g4s_ft_pierce|https://www.youtube.com/watch?v=yNjELyQYVIQ
yt_webb_20200130_1000_hunter_biden_submarine_base_kingsbay_georgia|https://www.youtube.com/watch?v=du9foZDmpm8
yt_webb_20200201_bden_front_men_real_covert_actors|https://www.youtube.com/watch?v=lomwVIkANrI
yt_webb_20200202_hunter_how_to_stop_next_schiff|https://www.youtube.com/watch?v=IRYWKXjL_kU
yt_webb_20200203_1600_schiffs_next_move|https://www.youtube.com/watch?v=gxDN08q3qr8
yt_webb_20200204_1900_iowaimran_awan_code_again_butegig|https://www.youtube.com/watch?v=XbAar3oIb7E
yt_webb_20200205_romneys_vote_easy_prediction_uranium_one|https://www.youtube.com/watch?v=QqBsoMQRg7E
yt_webb_20200206_1800_trump_victory_lap_subpoena_teneos_blackberries_hunter_devon|https://www.youtube.com/watch?v=hf8sS0xsJZw
yt_webb_20200207_hunter_biden_life_like_box_of_teneo_blackberries|https://www.youtube.com/watch?v=Hx_in2lrnSw
yt_webb_20200208_trump_hotel_where_schiff_strzok_lure_teneo_emails|https://www.youtube.com/watch?v=mUbwfDWu36A
yt_what_are_grown_knwwes_for_trees|https://www.youtube.com/watch?v=USv8xhQHWiY
yt_whatdoyoudesire_20170203_alan_watts_you_are_not_who_you_think_you_are|https://www.youtube.com/watch?v=JrvT2jNhF30
yt_wiara_20170901_alan_watts_silent_mind_importance_meditation|https://www.youtube.com/watch?v=M5awJGdKPCg
yt_wiara_20170901_alan_watts_silent_mind_meditation|https://www.youtube.com/watch?v=M5awJGdKPCg
yt_wiara_20170908_alan_watts_how_calam_mind_meditation|https://www.youtube.com/watch?v=qPUpCFn_Cl4
yt_wiara_20170922_alan_watts_tired_playing_social_game|https://www.youtube.com/watch?v=LXVrNRo1Zj8
yt_wiara_20171028_alan_watts_hypocrisy_around_money|https://www.youtube.com/watch?v=qeLh29-scdk
yt_wildchild_20131009_crazy_bird_official|https://www.youtube.com/watch?v=87PZgweY-gY
yt_worlddancenewyork_20100126_irina_akulenko_justice_tarot_fantesy_belly_dance|https://www.youtube.com/watch?v=8XGIRLwcw4o
yt_yanagiyadaisanji_20130120_kashmir_|https://www.youtube.com/watch?v=xriCZzyaC7Q
yt_yearsofsilence_20190206_dzivia_rujnuj_full_album|https://www.youtube.com/watch?v=XMggvPIeVlU
yt_youarefreetv_20200119_trump_ds_richmond|https://www.youtube.com/watch?v=uEy8mqZww_g
yt_youarefreetv_20200129_usmca_5g_durham|https://www.youtube.com/watch?v=oKF6cfPzaYs
yt_youarefreetv_20200206_viraltruth_v_ccines_p4labs_dr_judy_m_kovits|https://www.youtube.com/watch?v=ALHm8WTGOkA
yt_zachstar_20190405_parabola_hyperbola_elipse|https://www.youtube.com/watch?v=8nPMlW5NZSo
yt_zachstar_20190515_eulers_number_everywhere_important|https://www.youtube.com/watch?v=AAir4vcxRPU
yt_zachstar_20190607_things_in_higher_dimensions|https://www.youtube.com/watch?v=dr2sIoD7eeU
yt_zachstar_20190827_modular_arithmetic_visually_expplained|https://www.youtube.com/watch?v=lJ3CD9M3nEQ
yt_zachstar_20190913_second_beautiful_equation_applications|https://www.youtube.com/watch?v=z-GlM7eTFq8
yt_zachstar_20191129_complex_numbers_actually_apply_control_systems|https://www.youtube.com/watch?v=8tiQl6T-inE
yt_zachstar_20200118_fbi_fingerprints_storage_mathematics_compression|https://www.youtube.com/watch?v=fRjFwTbJfes
yt_zachstar_20200724_mathematics_of_universe|https://www.youtube.com/watch?v=KT5Sk-62-pg
yt_zackstar_20191011_application_matrices|https://www.youtube.com/watch?v=rowWM-MijXU `;
//				alert( "BUGS_1400 script_ytlist_load ytlist_text="+ytlist_text );
				return( ytlist_text.split("\n"));
				}
			</script>

		<script id="script_ytlist_show">
		function script_ytlist_show(ytlist) {
//			var ytlist = new Array();
//			ytlist=script_ytlist_load(src);
//			alert( "BUGS_1410 script_ytlist_show ytlist="+ytlist );
			var ytout='';
			var z = 0; var ytout=""; var len=ytlist.length;
			var ytid = ""; var yturl = "";
			var ytid_default = "https://youtube.com";
			var ytid_img_default = "/imgs/links/yt.png";
			var ytid_tn_default = "/imgs/links/tn/tn_yt.png";
			var ytid_img = ytid_img_default;
			var ytid_tn = ytid_tn_default;
			var ytline = new Array(); var f=0;
			var ytid_filename = "";
//			alert( "bugs_1010 script_avlist_show ytlist.length="+ytlist.length );
			var ytid_text="";
			for( z=0; z< ytlist.length; z++ ) {
				ytline = ytlist[z].split("|");
//				alert( "BUGS_1425 ytline="+ytline+" len="+ytline.length );
				if( ytline.length == 1 ) { 
					ytid = ytline; 
					}
				for( f=0; f< ytline.length; f++ ) {
					ytid_text = ytline[0];
					ytid = ytline[f];
//					alert( "BUGS_1429 ytid="+ytid+"  f="+f+" ytline="+ytline[f] );
					}

//				ytid = ytline;
//				ytid = ytline[1];
//				ytid = ytlist[z];

//				alert( "BUGS_1430 ytid="+ytid );
//				ytid_filename = ytid.substring(ytid.lastIndexOf('/')+1);
//				alert( "BUGS_1431 ytid_filename="+ytid_filename );

//				ytid_ext = ytid_filename.split(".")[1];
//				ytid_pathname = ytid.replace( ytid_filename, "" );
//				alert( "BUGS_1440 ytid_pathname="+ytid_pathname );

//				ytid_code = ytid_filename.replace(".mp4", "" );
//				ytid_code = ytid_filename.replace(ytid_ext, "" ).replace(".","");


				ytid_tn = "/imgs/links/tn/tn_yt.png";
				var ytid_id = ytid.split("=")[1];
				ytid_img = "http://i.ytimg.com/vi/" + ytid_id + "/default.jpg";
//				ytid_img = "http://i.ytimg.com/vi/" + ytid_id + "/maxresdefault.jpg";


//				ytid_img = ytid_pathname + "/imgs/" + ytid_code + ".png";
//				ytid_tn = ytid_pathname + "tn/tn_" + ytid_code + ".gif";
//				if( ytid_pathname == "" ) {
//					ytid_img = ytid_pathname + ytid_code + ".png";
//					ytid_tn = ytid_pathname +  ytid_code + ".gif";
//					}
//				if( ytid_pathname == "/" ) {
//					ytid_img = ytid_pathname + "" + ytid_code + ".png";
//					ytid_tn = ytid_pathname + "" + ytid_code + ".gif";
//					}

				ytout += "<a href='?ytid="+ytid+"' class='thumbnail' target=_blank>";

//				alert( "bugs_1060 script_ytlist_show ytout="+ytout );
////				if( gif ) {				
////					avout += "	<img name='" + avid_img + "' height=25 src='"+avid_tn+"' border=0 height=100 >\n";
////					avout += "	<span><img name='img_" + avid + "' src='"+avid_img+"' border=0 height=100 ></span>\n";
////					avout += "	</a>";
////					}
//
				ytout += "	<img name='" + ytid_tn + "' src='"+ytid_tn_default+"' border=0 height=25 >\n";
//				ytout += "	<span><img name='" + ytid_tn + "' src='"+ytid_tn+"' border=0 height=50 ></span>\n";
				ytout += "	<span><img name='" + ytid_img + "' src='"+ytid_img+"' border=0 height=300 alt='"+ytid_text+"' ></span>\n";
				ytout += "	</a>";
				}

//			alert( "BUGS_1035 script_ytlist_show ytout="+ytout );
			var parent = document.getElementById('div_ytlist');
			parent.insertAdjacentHTML('beforeend', ytout);
			}
			</script>


		<script id="script_ytlist_show_bugs" >
//		function script_ytlist_show_bugs() {
//			alerlt( "BUGS_901 script_ytlist_show" );
//			var ytlist = new Array();
//			ytlist = script_ytlist_load();
//			alert( "BUGS_902 script_ytlist_show ytlist="+ytlist );

//			var ytout='';
//			var z = 0; var ytout=""; var len=ytlist.length;
//			var ytid = ""; var yturl = "";
//			var ytid_default = "https://youtube.com";
//			var ytid_img_default = "/imgs/links/yt.png";
//			var ytid_tn_default = "/imgs/links/tn/tn_yt.png";
//			var ytid_img = ytid_img_default;
//			var ytid_tn = ytid_tn_default;
//			alert( "bugs_1000 script_avlist_show IN" );
//			for( z=0; z< ytlist.length; z++ ) {
//				ytid = ytlist[z];
//				ytid_filename = ytid.substring(ytid.lastIndexOf('/')+1);
//				ytid_ext = ytid_filename.split(".")[1];
//				ytid_pathname = yttid.replace( ytid_filename, "" );
////				ytid_code = ytid_filename.replace(".mp4", "" );
//				ytid_code = ytid_filename.replace(ytid_ext, "" ).replace(".","");


//				ytid_img = ytid_pathname + "/imgs/" + ytid_code + ".png";
//				ytid_tn = ytid_pathname + "tn/tn_" + ytid_code + ".gif";
//				if( ytid_pathname == "" ) {
//					ytid_img = ytid_pathname + ytid_code + ".png";
//					ytid_tn = ytid_pathname +  ytid_code + ".gif";
//					}
//				if( ytid_pathname == "/" ) {
//					ytid_img = ytid_pathname + "" + ytid_code + ".png";
//					ytid_tn = ytid_pathname + "" + ytid_code + ".gif";
//					}
//
//				ytout += "<a href='?ytid="+ytid+"' class='thumbnail' target=_blank>";
//
////				if( gif ) {				
////					avout += "	<img name='" + avid_img + "' height=25 src='"+avid_tn+"' border=0 height=100 >\n";
////					avout += "	<span><img name='img_" + avid + "' src='"+avid_img+"' border=0 height=100 ></span>\n";
////					avout += "	</a>";
////					}
//
//				ytout += "	<img name='" + ytid_code + "' height=25 src='"+ytid_tn_default+"' border=0 height=100 >\n";
//				ytout += "	<span><img name='" + ytid_code + "' src='"+ytid_tn+"' border=0 height=100 ></span>\n";
//				ytout += "	</a>";
//
//			var parent = document.getElementById('div_ytlist');
//			parent.insertAdjacentHTML('beforeend', ytout);
//			}
			</script>




		<script id="script_avlist_load" >
			var avlist = new Array();
			function script_avlist_load() {
			var z=0;
			avlist[z++] = "/kb/jtfdc/vid/jtfdc_20190122_2200_stalkaround_jtf28in_drivewaytraffic.mp4";
			avlist[z++] = "/av.mp4";
			avlist[z++] = "/index.mp4";
			avlist[z++] = "/index1.mp4";
			avlist[z++] = "/index2.mp4";
			avlist[z++] = "/index3.mp4";
			avlist[z++] = "/index4.mp4";


			avlist[z++] = '/kb/jtfdc/vid/jtfdc_20190124_1350_stalkaround_lwhitesuv_jtf3     0in_jkwii.mp4';
			avlist[z++] = '/kb/jtfdc/vid/jtfdc_20190122_2200_stalkaround_jtf28in_drivew     aytraffic.mp4';
			avlist[z++] = '/kb/vid/youb/01_sixto_rodriguez_sandrevan_lullabylifestyles_[coming_from_.mp4';
			avlist[z++] = '/kb/vid/youb/02_sixto_rodriguez_i_think_of_you.mp4';
			avlist[z++] = '/kb/vid/youb/48_roses_mariachi_el_bronx_jay_leno_2011.mp4';
			avlist[z++] = '/kb/vid/youb/Andy_Griffith_Down_In_The_Valley.flv';
			avlist[z++] = '/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-0.mp4';
			avlist[z++] = '/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-1.mp4';
			avlist[z++] = '/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-2.mp4.filepart';
			avlist[z++] = '/kb/vid/youb/bonnie_raitt_aaron_neville_gregg_allman_tell_it_like_it.mp4';
			avlist[z++] = '/kb/vid/youb/dori_caymmi-o_bem_do_mar.flv';
			avlist[z++] = '/kb/vid/youb/eva_cassidyaint_no_sunshine.mp4';
			avlist[z++] = '/kb/vid/youb/eva_cassidyfields_of_gold.mp4';
			avlist[z++] = '/kb/vid/youb/faithfullworking_class_hero-live.mp4';
			avlist[z++] = '/kb/vid/youb/official_chrysler_and_bob_dylan_super_bowl_commercial_2017.mp4';
			avlist[z++] = '/kb/vid/youb/richie_havens_i_was_educated_by_myself_with_lyrics.mp4';
			avlist[z++] = '/kb/vid/youb/river_run_file24160428.mp4';
			avlist[z++] = '/kb/vid/youb/steal_away_by_the_fureys.mp4';
			avlist[z++] = '/kb/vid/youb/the_last_farewell_lyrics_roger_whittaker.mp4';
			avlist[z++] = '/kb/vid/youb/we_believe_in_happy_ending_emmylou_harris_earl_thomas_co.mp4';
			avlist[z++] = '/kb/vid/youb/yogis_Tibetan_Buddhism__Secrets_of_the_Yogis_of_Tibet_-_Part_5.mp4';


		avlist[z++] = "/ko/svc/jsdoit/preload/_assets/static/video.mp4";
		avlist[z++] = "/ko/svc/js/threejs/examples/textures/sintel.mp4";
		avlist[z++] = "/3.mp4";
		avlist[z++] = "/konet/index6.mp4";
		avlist[z++] = "/konet/index2.mp4";
		avlist[z++] = "/konet/index.mp4";
		avlist[z++] = "/konet/index1.mp4";
		avlist[z++] = "/konet/index3.mp4";
		avlist[z++] = "/jkwii/jkwii.mp4";
		avlist[z++] = "/jkwii/js/threejs/examples/textures/sintel.mp4";
		avlist[z++] = "/index4.mp4";
		avlist[z++] = "/ka1.mp4";
		avlist[z++] = "/index8.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtfdc_20171214_1215_jtf32out_jtf32_lyinglawerin.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/huckleberry_hound_17_barbeque_hound.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtfdc_201802261524_fiona_freeroam.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtfdc_20180605_0500_jtf31_fiona_roam_go_home_doberwoofs_jkwiiabout.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/roy_rogers_dont_fence_me_in.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtf31.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtfdc_20180604_1015_jtf31_fiona_qualitytime_unexpected_jkwii.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtfdc_20180605_1956_bigtruck_n_cabletrailer_stalkback.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/doghead_video.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtfdc_20180607_1813_jtf31_fiona_freeroom_inyourface.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtfdc_20180530_2034_jkwii_meet_househunters_nice.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtfdc_20180505_1944_jkwiinkids_center_court.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtfdc_20180605_1130_jkwii_lost_cable_truck.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtf30.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtfdc_20180226_1524_jtf31_fiona_freeroam.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtfdc_20180605_1130_jkwii_lost_cabletrailer.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtfdc_20171216_0610_woof.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtfdc_20180606_1145_jtf40_driveway_byrdpucker_theft_threadt.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtfdc_20180604_0630_jtf31_fiona_courttime_jkwii.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/roy_rogers_dale_evans_sons_of_pioneers_medley.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/jtfdc_20180605_1956_cabletrailer_backnice.mp4";
		avlist[z++] = "/kb/byrdpuckers/vid/index1.mp4";
		avlist[z++] = "/kb/vid/dutch/dutch_jacksonnocout_get_my_weight_up.mp4";
		avlist[z++] = "/kb/vid/dutch/dutch_jackson_feat_jibbscity_on_fire_off_then.mp4";
		avlist[z++] = "/kb/vid/dutch/dutch_jackson_39_new_single.mp4";
		avlist[z++] = "/kb/vid/youb/Luciano Pavarotti & James Brown - It_s a man_s world (1080pHD).mp4";
		avlist[z++] = "/kb/vid/youb/REAL_Men_Who_Stare_At_Goats.mp4";
		avlist[z++] = "/kb/vid/youb/REAL_MEN_WHO_STARE_AT_GOATS_part_2.mp4";
		avlist[z++] = "/kb/vid/youb/The_Magus_of_Denver.mp4";
		avlist[z++] = "/kb/vid/youb/PAPA-OOM-MOW-MOW!.mp4";
		avlist[z++] = "/kb/vid/youb/romania_lalala.mp4";
		avlist[z++] = "/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-0.mp4";
		avlist[z++] = "/kb/vid/youb/Zappa_Plays_Zappa_-_Joe_s_Garage.mp4";
		avlist[z++] = "/kb/vid/youb/dietric_coffee_ifile-164376962.mp4";
		avlist[z++] = "/kb/vid/youb/Perhaps_Love_-_John_Denver_Placido_Domingo_legendado.mp4";
		avlist[z++] = "/kb/vid/youb/Big_Data_-_Tim_Smith.mp4";
		avlist[z++] = "/kb/vid/youb/OFFICIAL_Chrysler_and_Bob_Dylan_Super_Bowl_Commercial_2014.mp4";
		avlist[z++] = "/kb/vid/youb/02_Sixto_Rodriguez_-_I_Think_Of_You_.wmv.mp4";
		avlist[z++] = "/kb/vid/youb/waits-lullaby-1.mp4";
		avlist[z++] = "/kb/vid/youb/Maria_Muldaur_-_Don_t_You_Feel_My_Leg.mp4";
		avlist[z++] = "/kb/vid/youb/Wenn die Soldaten - Marlene Dietrich.mp4";
		avlist[z++] = "/kb/vid/youb/REAL_MEN_WHO_STARE_AT_GOATS_part_3.mp4";
		avlist[z++] = "/kb/vid/youb/Time ( Tom Waits Cover ).mp4";
		avlist[z++] = "/kb/vid/youb/sharon_jones_100_days.mp4";
		avlist[z++] = "/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-1.mp4";
		avlist[z++] = "/kb/vid/youb/dori_caymmi-o_bem_do_mar.mp4";
		avlist[z++] = "/kb/vid/youb/01_Sixto_Rodriguez_-_Sandrevan_Lullaby-Lifestyles_[Coming_From_.mp4";
		avlist[z++] = "/kb/vid/youb/Eleni_Mandell_-__quot_my_twin_quot__-_Live_at_The_EARL.mp4";
		avlist[z++] = "/kb/vid/youb/Nat_King_Cole_All_Over_The_World.mp4";
		avlist[z++] = "/kb/vid/youb/shania_tTwain_forever_and_for_always-world.mp4";
		avlist[z++] = "/kb/vid/youb/Donovan _ Crystal Gayle - Catch The Wind.mp4";
		avlist[z++] = "/kb/vid/youb/harris_together_again_file-249732345.mp4";
		avlist[z++] = "/kb/vid/youb/doghead_video.mp4";
		avlist[z++] = "/kb/vid/youb/03_Rodriguez_-_I_ll_Slip_Away.mp4";
		avlist[z++] = "/kb/vid/youb/Maria_Muldaur_-_My_Tennessee_Mountain_Home__Live_Recording_.mp4";
		avlist[z++] = "/kb/vid/youb/Leonard Cohen -  Slow.mp4";
		avlist[z++] = "/kb/vid/youb/Trio_-_Sabine.mp4";
		avlist[z++] = "/kb/vid/youb/WHENEVER GOD SHINES HIS LIGHT - VAN MORRISON.mp4";
		avlist[z++] = "/kb/vid/youb/eva_cassidy-aint_no_sunshine.mp4";
		avlist[z++] = "/kb/vid/youb/Van Morrison - Moondance.mp4";
		avlist[z++] = "/kb/vid/youb/Maria_Muldaur_-_A_Good_Man_is_Hard_To_Find.mp4";
		avlist[z++] = "/kb/vid/youb/Eleni_Mandell_-__quot_makeout_king_quot_.mp4";
		avlist[z++] = "/kb/vid/youb/Perhaps Love - John Denver & Placido Domingo.mp4";
		avlist[z++] = "/kb/vid/youb/put_the_lime_in_the_coconut.mp4";
		avlist[z++] = "/kb/vid/youb/amywinehouse_love_losing_game_file-235773700.mp4";
		avlist[z++] = "/kb/vid/youb/romania_hat.mp4";
		avlist[z++] = "/kb/vid/youb/freddy_dreamers_telling_you_now_file-570139451.mp4";
		avlist[z++] = "/kb/vid/youb/Leonard Cohen - Lullaby (Old Ideas,2012).mp4";
		avlist[z++] = "/kb/vid/youb/Family Tree - Kings of Leon.mp4";
		avlist[z++] = "/kb/vid/youb/Rodriguez_-_I_Wonder.mp4";
		avlist[z++] = "/kb/vid/youb/Dreaming As One - Richie Havens.mp4";
		avlist[z++] = "/kb/vid/youb/trio_Vogel_der_Nacht.mp4";
		avlist[z++] = "/kb/vid/youb/zara_leander_psycadeylic_file-252228034.mp4";
		avlist[z++] = "/kb/vid/youb/waits-time3.mp4";
		avlist[z++] = "/kb/vid/youb/My Prayer  (Ink Spots, 1939).mp4";
		avlist[z++] = "/kb/vid/youb/lovers_concerto_file-380426037.mp4";
		avlist[z++] = "/kb/vid/youb/mclean_starry_nights_file-805110482.mp4";
		avlist[z++] = "/kb/vid/youb/harris_wheels_of_love_file-54997698.mp4";
		avlist[z++] = "/kb/vid/youb/Nat_King_Cole_-_Je_Vous_Aime_Beaucoup.mp4";
		avlist[z++] = "/kb/vid/youb/Master_Guy_Savelli_s_Kun_Tao__U.S._Special_Forces_SERE_Train.mp4";
		avlist[z++] = "/kb/vid/youb/Rodriguez_cf11_Rich_Folks_Hoax.mp4";
		avlist[z++] = "/kb/vid/youb/48_Roses_-_Mariachi_El_Bronx_(Jay_Leno,_2011).mp4";
		avlist[z++] = "/kb/vid/youb/TRIO_-_Du_ich_w_r_so_gern_bei_dir.mp4";
		avlist[z++] = "/kb/vid/youb/YouTube_-_Amy_Winehouse_-_You_Know_I_m_No_Good.mp4";
		avlist[z++] = "/kb/vid/youb/waits-come_on_up_to_the_house.mp4";
		avlist[z++] = "/kb/vid/youb/Maria_Muldaur_-_Handy_Man.mp4";
		avlist[z++] = "/kb/vid/youb/nina_simone-dont_let_me_be_misunderstood.mp4";
		avlist[z++] = "/kb/vid/youb/Iris Dement - These Hills.mp4";
		avlist[z++] = "/kb/vid/youb/pendekar paul silat master.mp4";
		avlist[z++] = "/kb/vid/youb/Petula Clark - Look to the rainbow (Live Olympia).mp4";
		avlist[z++] = "/kb/vid/youb/_Firedoglake_sen_byrd_fiddle.mp4";
		avlist[z++] = "/kb/vid/youb/Eleni_Mandell_-__quot_girls_quot_.mp4";
		avlist[z++] = "/kb/vid/youb/Trio_-_Turaluraluralu.mp4";
		avlist[z++] = "/kb/vid/youb/yogis_Tibetan_Buddhism__Secrets_of_the_Yogis_of_Tibet_-_Part_5.mp4";
		avlist[z++] = "/kb/vid/youb/Mayssa Karaa - White Rabbit (American Hustle OST).mp4";
		avlist[z++] = "/kb/vid/youb/eva_cassidy-fields_of_gold.mp4";
		avlist[z++] = "/kb/vid/youb/Van Morrison - The Way Young Lovers Do.mp4";
		avlist[z++] = "/kb/vid/youb/Paul_Simon_-_You_Can_Call_Me_Al.mp4";
		avlist[z++] = "/kb/vid/youb/river_run_file-24160428.mp4";
		avlist[z++] = "/kb/vid/youb/The_Large_Hadron_Rap.mp4";
		avlist[z++] = "/kb/vid/youb/Petula Clark-Windmills Of Your Mind (lyrics).mp4";
		avlist[z++] = "/kb/vid/youb/waits-time_full.mp4";
		avlist[z++] = "/kb/vid/youb/joe_south_want_to_go_home.mp4";
		avlist[z++] = "/kb/vid/youb/you_dont_own_me.mp4";
		avlist[z++] = "/kb/vid/youb/iris_sweet_is_thr_melody.mp4";
		avlist[z++] = "/kb/vid/youb/thai_bowie.mp4";
		avlist[z++] = "/kb/vid/youb/femme_pencak silat.mp4";
		avlist[z++] = "/kb/vid/youb/Huckleberry_Hound_17_Barbeque_Hound_-_YouTube.mp4";
		avlist[z++] = "/kb/vid/youb/Leonard Cohen - The Land of Plenty Lyrics.mp4";
		avlist[z++] = "/kb/vid/youb/harris_nobodys_darlin_file-996617010.mp4";
		avlist[z++] = "/kb/vid/youb/buckingham_nicks-say_goodbye-live.mp4";
		avlist[z++] = "/kb/vid/youb/Paul_Simon_~__Diamonds_on_the_Soles_of_Her_Shoes_.mp4";
		avlist[z++] = "/kb/vid/Mary Tyler Moore/PAPA-OOM-MOW-MOW!.mp4";
		avlist[z++] = "/kb/vid/Mary Tyler Moore/The Mary Tyler Moore Show S06E13 The Happy Homemaker Takes Lou Home.mp4";
		avlist[z++] = "/kb/vid/Mary Tyler Moore/The Mary Tyler Moore Show S05E01 Will Mary Richards Go to Jail.mp4";
		avlist[z++] = "/kb/vid/Mary Tyler Moore/The Mary Tyler Moore Show S06E07 Chuckles Bites the Dust.mp4";
		avlist[z++] = "/kb/vid/Mary Tyler Moore/Mary Tyler Moore ugly green dress.mp4";
		avlist[z++] = "/kb/vid/Mary Tyler Moore/Big Chuck & Lil John - A Half A Head Of Lettuce.mp4";
		avlist[z++] = "/kb/vid/deepmind/breilmeyer_mower_jtfdc_lawncare.mp4";
		avlist[z++] = "/kb/vid/deepmind/How To Get Started With Machine Learning    Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/Neural Network Learns The Physics of Fluids and Smoke   Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/WaveNet by Google DeepMind   Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/Guinness World Record  Most Whip cracks with Two Whips in One Minute.mp4";
		avlist[z++] = "/kb/vid/deepmind/Adaptive Fluid Simulations   Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/Image Synthesis From Text With Deep Learning   Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/Game AI Development With OpenAI Universe   Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/ka1.mp4";
		avlist[z++] = "/kb/vid/deepmind/Synchronizing Animations To Sound   Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/eva_cassidy-aint_no_sunshine.mp4";
		avlist[z++] = "/kb/vid/deepmind/Automatic Creation of Sketch Tutorials   Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/Interactive Hair-Solid Simulations   Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/7 Days of Artificial Intelligence.mp4";
		avlist[z++] = "/kb/vid/deepmind/Structural Image Editing With PatchMatch   Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/Stunning Video Game Graphics With Voxel Cone Tracing (VXGI)   Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/AI Makes Stunning Photos From Your Drawings (Pix2pix)   Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/Breaking DeepMind's Game AI System   Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/Narrow Band Liquid Simulations   Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/Amazing Slow Motion Videos With Optical Flow   Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/Instant 3D Floorplans From Your Photos   Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/AI Makes 3D Models From Photos   Two Minute Papers.mp4";
		avlist[z++] = "/kb/vid/deepmind/Procedural Yarn Models for Cloth Rendering   Two Minute Papers.mp4";
		avlist[z++] = "/kb/kt/Muhammad_ali_freddy_starr.mp4";
		avlist[z++] = "/kb/kt/000_Pakua_master_of_94_year_s_old.mp4";
		avlist[z++] = "/kb/kt/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-0.mp4";
		avlist[z++] = "/kb/kt/willem_de_thouars_kuntao_silat_1996_gulfport_School_of_ta.mp4";
		avlist[z++] = "/kb/kt/Grand_Master_TRAN_TIEN_-_Vietnam_Kung_Fu.mp4";
		avlist[z++] = "/kb/kt/yogis_Of_Tibet_-_Rare_Documentary.mp4";
		avlist[z++] = "/kb/kt/6_Magic_Moves_-_To_Win_a_STREET_FIGHT.mp4";
		avlist[z++] = "/kb/kt/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-1.mp4";
		avlist[z++] = "/kb/kt/kt_000229_037.mp4";
		avlist[z++] = "/kb/kt/Push_Hands_-_Tui_Shou.mp4";
		avlist[z++] = "/kb/kt/muhammad_ali funny moments.mp4";
		avlist[z++] = "/kb/kt/GOATS_DECLASSIFIED__The_True_Story_Behind_The_Men_Who_Stare_.mp4";
		avlist[z++] = "/kb/kt/master_ken_Seminar_uk_2013.mp4";
		avlist[z++] = "/kb/kt/funny_monkeys_vs_dogs_cats_compilation_2017.mp4";
		avlist[z++] = "/kb/kt/kt_000229_033.mp4";
		avlist[z++] = "/kb/kt/THE_DAY_THE_EARTH_STOOD_STILL_-_1951_KLAATU_S_FINAL_SPEECH.mp4";
		avlist[z++] = "/kb/kt/kt_000229_013.mp4";
		avlist[z++] = "/kb/kt/muhammad_ali_beutiful_interview_rip.mp4";
		avlist[z++] = "/kb/kt/femme_pencak_silat.mp4";
		avlist[z++] = "/kb/kt/kt_000229_019.mp4";
		avlist[z++] = "/kb/kt/wudang_vibrating_palm.mp4";
		avlist[z++] = "/kb/kt/kt_000229_014.mp4";
		avlist[z++] = "/kb/kt/baguazhang_turning_the_circle_tree.mp4";
		avlist[z++] = "/kb/kt/S01E23_the_testament_of_arkadia.mp4";
		avlist[z++] = "/kb/kt/dethouars_willem_de_thouars_uncle_bill_in_Verona_NJ_1-11-18.mp4";
		avlist[z++] = "/kb/kt/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-2.mp4";
		avlist[z++] = "/kb/kt/Aikido_-_Demo_by_founder_-_Moriteru_Uesiba.mp4";
		avlist[z++] = "/kb/kt/kt_000229_007.mp4";
		avlist[z++] = "/kb/kt/Shaolin_Monk_Master_Super_Speed.mp4";
		avlist[z++] = "/kb/kt/Jim Channon Natural Security Future First Earth Battalion.mp4";
		avlist[z++] = "/kb/kt/cgi_quantum_jump_hayk_sahakyants.mp4";
		avlist[z++] = "/kb/kt/kt_000229_022.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181226_1215_jtf31_teachyourdogsnothere_jkwii.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20180104_1113_fedexexpress_blackchallenger_meetgreet.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181222_0945_jtf31_fiona_plumber_threats_n_stones.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20170609_1810_burgess_assessmen.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtdfinc_2013mmdd_jtf39_trustee_byrd_threats.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1639_jtf31_darkpickup_backupout.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1641_police2_pierce_pickup_jak3in.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1551_jtf31_tresspas.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1634_jtf31_plannin.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1637_jtf31_meeting_hahah.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1540_jtf31_jkwii_threat.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1638_jtf26_upmail.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1542_wofffren.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181224_2307_jkwii_whyuhere_your_scaringus.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181120_1519_jtf30_doogy_jkwii_romppatro.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181225_1352_jkwii_kids_jtf31_andy_dog.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20180411_1436_segrist_dog_fedex_stalk.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181225_1951_jsk2in_maverics_santaride.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181225_1936_jtf31_thanks4sign_meryxmas_woofs.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181225_2250_200yr_stillenact_merryxmas.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181224_2349_jkwii_jtf31in_fiona_unleashe_street_charge.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181223_1821_jtf30_woofs_allnightling.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181121_1123_jtf31_fiona_hadly_jkwii_romppatrol.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20171216_1520_skkids_jtf31rake_jtf27fedex.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1533_jtf31in_newblu.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1525_jtf30in.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1530_ffiretruck_xmaslight.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1533_fireatruck_suvdonw.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181226_1200_jtf31_2xfiona_streetchargn_dogwalkeers.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20180308_2034_fedexs_flatbed_courtstalking.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181226_1236_byrds_up_quiet .mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181222_1357_jtf31_trespass_jkwii_liveyouronwlives.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181226_1205_jtf31_oureasment_dogtraing.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20160702_1641_jtf31_josh_4asshole_gobackinside.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181225_1345_kids_jtf31_freeroam_dogs.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181210_1540_jtf31_jkwii_threats_n_stones.mp4";
		avlist[z++] = "/kb/jtfdc/vid/jtfdc_20181226_1235_bigtruck_byrds_damage_assessmen.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04051_20150716_0643.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04044_20150716_0634.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04057_20150716_0701.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04059_20150716_0709.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04045_20150716_0635.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04064_20150716_0813.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04052_20150716_0644.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04046_20150716_0640_jackie_yelling_at_josh.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04053_20150716_0644.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04043_20150716_0616.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04066_20150716_0816.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04056_20150716_0646_josh_jackie_yelling.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04048_20150716_0641.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04063_20150716_0812.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04054_20150716_0644.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04055_20150716_0644.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04049_20150716_0642.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04050_20150716_0642.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04062_20150716_0738.mp4";
		avlist[z++] = "/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04065_20150716_0815.mp4";
		avlist[z++] = "/kb/music/ink spots/The Ink spots -  I don't want to set the world on fire.mp4";
		avlist[z++] = "/kb/music/ink spots/The Ink Spots - We'll Meet Again.mp4";
		avlist[z++] = "/kb/music/ink spots/The Ink Spots - Address Unknown.mp4";
		avlist[z++] = "/kb/music/Caro Emerald Live - A Night Like This @ Sziget 2012.mp4";
		avlist[z++] = "/kb/music/Caro Emerald - Mistaken identity.mp4";
		avlist[z++] = "/kb/music/fureys/The Fureys- The First Leaves Of Autumn.mp4";
		avlist[z++] = "/kb/music/fureys/The Fureys- I Will Love You Ev'ry Time.mp4";
		avlist[z++] = "/kb/music/fureys/The last Great love Song Performed by Finbar furey.mp4";
		avlist[z++] = "/kb/music/fureys/The Fureys-Red Rose Cafe.mp4";
		avlist[z++] = "/kb/music/fureys/The Fureys - The Old Man.mp4";
		avlist[z++] = "/kb/music/fureys/I Will Love You Ev'ry Time - The Fureys & Davey Arthur.mp4";
		avlist[z++] = "/1.mp4";
		avlist[z++] = "/index7.mp4";
		avlist[z++] = "/4.mp4";
		avlist[z++] = "/2.mp4";
		avlist[z++] = "/index6.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170411_1858_bumblebee_out 34-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170412_1510__fionastakout_andy 254-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170412_1500_bus_fionastakout 244-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20160817_0855_animalcontrol_closed _8-17-16_1111 AM5.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170412_1401_car_stalkaround 214-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170412_1514_jtf30_gonger_fiona_in 264-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170412_1341_message_animalcontrol 194-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170411_1843_jtf28in_lenny 14-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170412_1315_jtf32_pickup_fiona 144-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170411_1854_pickup_drivearound 24-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170411_2022_woofs_dark 74-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170411_22104_woofs 114-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170411_1921_jtf28out_lenny 54-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170412_1329_jtf31in_fiona_setloose 164-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170412_1445_fiona_afternoon_stakout 224-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170412_1317_speeding_old_darkvan 154-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/Comet Pizza Kill RoomsBasement Shown in 2014 Korean Music Vi.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20160817_0940_jtf32_woofs_animalcontrol_closed _8-17-16_1111 AM8.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170412_1302_kali_woof 124-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170412_1459_jtf30_leashwalk_fionawoofs 234-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20160817_0900_animalcontrol_closed _8-17-16_1111 AM6.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170412_1516_fiona_in 274-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170411_2025_jtf28out 84-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170411_1904_pickupin 44-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170411_2021_woofs_dark 64-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170412_1357_jtf27in_speedy_nostop 204-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170411_2142_drive_past 104-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170411_2027_+jak2in 94-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170412_1305_jtf30in 134-12-17319 PM.mp4";
		avlist[z++] = "/dd/jtfdc_20170412_1335_stl_animalcontrol 174-12-17319 PM/jtfdc_20170412_1337_stl_animalcontrol 184-12-17319 PM.mp4";
		avlist[z++] = "/index2.mp4";
		avlist[z++] = "/index.mp4";
		avlist[z++] = "/koh5.mp4";
		avlist[z++] = "/index1.mp4";
		avlist[z++] = "/iperms/doghead_video.mp4";
		avlist[z++] = "/iperms/Huckleberry_Hound_17_Barbeque_Hound.mp4";
		avlist[z++] = "/iperms/index2.mp4";
		avlist[z++] = "/iperms/index1.mp4";
		avlist[z++] = "/iperms/index3.mp4";
		avlist[z++] = "/ko_jtf/jtf30/mov/Clip14.mp4";
		avlist[z++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent2/04055_20150716_0644.mp4";
		avlist[z++] = "/ko_jtf/wg/mp4_20150716/04051_20150716_0643.mp4";
		avlist[z++] = "/ko_jtf/wg/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4";
		avlist[z++] = "/ko_jtf/wg/mp4_20150716/04044_20150716_0634.mp4";
		avlist[z++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04052_20150716_0644.mp4";
		avlist[z++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04054_20150716_0644.mp4";
		avlist[z++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04050_20150716_0642.mp4";
		avlist[z++] = "/ko_jtf/wg/mp4_20150716/04053_20150716_0644.mp4";
		avlist[z++] = "/ko_jtf/wg/mp4_20150716/04048_20150716_0641.mp4";
		avlist[z++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04052_20150716_0644.mp4";
		avlist[z++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04054_20150716_0644.mp4";
		avlist[z++] = "/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04050_20150716_0642.mp4";
		avlist[z++] = "/ko_jtf/wg/mp4_20150716/04049_20150716_0642.mp4";
		avlist[z++] = "/ko_jtf/wg/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4";
		avlist[z++] = "/ko_jtf/wg/videos_to_lighten_the_mood/Huckleberry_Hound_17_Barbeque_Hound.mp4";
		avlist[z++] = "/ko_jtf/wg/videos_to_lighten_the_mood/executive_summary_doghead_video 3-23-16738 PM1.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150806/mt4_20150806/3637_car_drivein_lights_off_20150807.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150806/mt4_20150806/3638_josh_walkin_house_20150807.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0475_20150928_0747.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0471_20150928_0737.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0472_20150928_0737.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04051_20150716_0643.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04044_20150716_0634.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04057_20150716_0701.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04059_20150716_0709.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04045_20150716_0635.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04064_20150716_0813.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04052_20150716_0644.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04053_20150716_0644.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04043_20150716_0616.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04066_20150716_0816.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04048_20150716_0641.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04063_20150716_0812.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04054_20150716_0644.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04055_20150716_0644.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04049_20150716_0642.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04050_20150716_0642.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04062_20150716_0738.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04065_20150716_0815.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00027_20150919_2205_josh_walking.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00026_20150919_2102.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00025_20150919_1947.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00028_20150919_2230.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00023_20150919_1910.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00045_20150919_1601.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00041_20150919_1311.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00043_20150919_1530.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00037_20150919_1235.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00036_20150919_1235.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00042_20150919_1520.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/videos_to_lighten_the_mood/Huckleberry_Hound_17_Barbeque_Hound.mp4";
		avlist[z++] = "/ko_jtf/wg/pictures_for_court_20160602/videos_to_lighten_the_mood/executive_summary_doghead_video 3-23-16738 PM1.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04051_20150716_0643.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04044_20150716_0634.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04057_20150716_0701.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04059_20150716_0709.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04045_20150716_0635.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04064_20150716_0813.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04052_20150716_0644.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04053_20150716_0644.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04043_20150716_0616.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04066_20150716_0816.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04048_20150716_0641.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04063_20150716_0812.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04054_20150716_0644.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04055_20150716_0644.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04049_20150716_0642.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04050_20150716_0642.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04062_20150716_0738.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4";
		avlist[z++] = "/ko_jtf/kb/sd_20150720/mp4_20150716/04065_20150716_0815.mp4";
		avlist[z++] = "/ko_jtf/kb/v/jtfinc_9558_byrd_trustee_threat_201505.mp4";
		avlist[z++] = "/ko_jtf/kb/v/9557_fiona_runs_201506.mp4";
		avlist[z++] = "/ko_jtf/kb/v/index5.mp4";
		avlist[z++] = "/ko_jtf/kb/v/index4.mp4";
		avlist[z++] = "/ko_jtf/kb/v/ka1.mp4";
		avlist[z++] = "/ko_jtf/kb/v/doghead_video.mp4";
		avlist[z++] = "/ko_jtf/kb/v/Huckleberry_Hound_17_Barbeque_Hound.mp4";
		avlist[z++] = "/ko_jtf/kb/v/9559_byrd_trustee_threat_201505.mp4";
		avlist[z++] = "/ko_jtf/kb/v/jtdfinc_byrd2013.mp4";
		avlist[z++] = "/ko_jtf/kb/v/index6.mp4";
		avlist[z++] = "/ko_jtf/kb/v/index2.mp4";
		avlist[z++] = "/ko_jtf/kb/v/jtf31_fiona_runs_201506.mp4";
		avlist[z++] = "/ko_jtf/kb/v/9558_byrd_trustee_threat_201505.mp4";
		avlist[z++] = "/ko_jtf/kb/v/index.mp4";
		avlist[z++] = "/ko_jtf/kb/v/jtfinc_9559_byrd_trustee_threat_201505.mp4";
		avlist[z++] = "/ko_jtf/kb/v/index1.mp4";
		avlist[z++] = "/ko_jtf/kb/v/ko_jtf.mp4";
		avlist[z++] = "/ko_jtf/kb/v/index3.mp4";


//			z--;
//			alert( "BUGS_890_load avlist("+z+")="+avlist[z] + " len="+avlist.length );
//			document.write( "avlist_lost avlist_length="+avlist.length+" z="+z );
				return(avlist);
				}

		function script_avlist_show() {
			var z = 0; var avout=""; var len=avlist.length;
			var avid = ""; var avurl = "";
			var avid_default = "index.mp4";
			var avid_img_default = "/imgs/links/av.png";
//			var avid_tn_default = "/imgs/links/koeye_av.png";
			var avid_tn_default = "/imgs/links/tn/tn_av.png";
			var avid_img = avid_img_default;
			var avid_tn = avid_tn_default;
//			alert( "bugs_900 script_avlist_show IN" );
			for( z=0; z< avlist.length; z++ ) {
				avid = avlist[z];
				avid_filename = avid.substring(avid.lastIndexOf('/')+1);
				avid_ext = avid_filename.split(".")[1];
				avid_pathname = avid.replace( avid_filename, "" );
//				avid_code = avid_filename.replace(".mp4", "" );
				avid_code = avid_filename.replace(avid_ext, "" ).replace(".","");


				avid_img = avid_pathname + "/imgs/" + avid_code + ".png";
				avid_tn = avid_pathname + "tn/tn_" + avid_code + ".gif";
				if( avid_pathname == "" ) {
					avid_img = avid_pathname + avid_code + ".png";
					avid_tn = avid_pathname +  avid_code + ".gif";
					}
				if( avid_pathname == "/" ) {
					avid_img = avid_pathname + "" + avid_code + ".png";
					avid_tn = avid_pathname + "" + avid_code + ".gif";
					}
/////////////////////
// This Immediately Invoked Function Expression is invoked via call.
// call() takes 1 or more arguments: the first being the scope you want the 
// invoked function be in; the other arguments become arguments of the function
// itself.
// In this case, the scope of our function is an empty object ({}).
// This object allows us to attach functions using the this.* syntax and call the 
// functions with this["string"]() without ever polluting the global namespace. 
// It is also forward compatible with ECMAScript 5's scrict-mode as it does not
// use arguments.callee.
//		(function(document, window){
//		    var functionName = "myFunction";
// you'll need to define the function _before_ you call it.
//			    this.myFunction = function(){
//	Do some stuff
//			        alert('me');
//				    };
//			    this[functionName]();
//////////////////





//				alert( "BUGS_1360 avid="+avid+" ext="+avid_ext+" avid_pathname="+avid_pathname+" avid_filename="+avid_filename );
//				alert( "BUGS_1361 avid="+avid+" avid_ext="+avid_ext+ " avid_code="+avid_code+" avid_tn="+avid_tn );
//				alert( "BUGS_1350 avid="+avid+" avid_code="+avid_code+" avid_tn="+avid_tn );
//				tlout += "<h1><b>tllist_"+z+"</b><h1>";
//				tlout += "<a href='/index_vu.html?tlid="+tlid+"' target=_blank>";
//				tlout += "	<img name='img_" + tlid + "' src='"+tn_tlid+"' border=0 height=100 >\n";
//				tlout += "	</a>";
//				tlout += "<a href='"+tlid+".html' class="thumbnail"  target=_blank>";

// bugs				tlout += "<a href='"+tlid+".html' class='thumbnail'  target=_blank>";
//				avout += "<a href='/index_av.html?avid="+avid+"' class='thumbnail' target=_blank>";

				avout += "<a href='?avid="+avid+"' class='thumbnail' target=_blank>";

//				if( gif ) {				
//					avout += "	<img name='" + avid_img + "' height=25 src='"+avid_tn+"' border=0 height=100 >\n";
//					avout += "	<span><img name='img_" + avid + "' src='"+avid_img+"' border=0 height=100 ></span>\n";
//					avout += "	</a>";
//					}

				avout += "	<img name='" + avid_code + "' height=25 src='"+avid_tn_default+"' border=0 height=100 >\n";
				avout += "	<span><img name='" + avid_code + "' src='"+avid_tn+"' border=0 height=100 ></span>\n";
				avout += "	</a>";



//				alert( "bugs430 avid=" + avid + " tn_avid=" + tn_avid );
				}
//			document.write( "bugs435 avout=" + avout );

//			alert( "BUGS432_show avlist("+len+")="+avlist[z] + " len="+avlist.length );
// 			document.getElementById('div_avlist').innerHTML += avout;
			var parent = document.getElementById('div_avlist');
			parent.insertAdjacentHTML('beforeend', avout);
			}
//		function script_tllist() {
//			script_tllist_load();
//			alert( "bugs_437: script_tllist len="+zmlist.length );
//			script_tllist_show();
//			}
		function script_av_view( search ) {
			document.write( "script_av_view search="+search );
			}
		</script>

	<div id="div_avlist"><h1>div_avlist</h1></div>



		<script id="script_zmlist" >
			var zmlist = new Array();

//			function script_zmlist_hover() {body { background-color: blue; }}

			function script_zmlist_load() {
			var z=0;
			zmlist[z++] = "/fb/law/jkwiiv_byrdbell/zm/donutvanlaw_takings/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/space_2019/thule/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/space_2019/thule1/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/space_2019/thule2/TileGroup0/0-0-0.jpg";

			zmlist[z++] = "/zm/space_2018/bennu/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/space_2018/bennu_face/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/space_2018/mars_rebar_mouldings/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/space_2018/mars_pouch_rings/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/space_2018/pano_mars_mtsharp/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/space_2018/pano_caralperu/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/space_2018/pano_jtfinc/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/space_2018/pano_jtfdc/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg";

			zmlist[z++] = "/zm/zm_nasa/mars_zigzag_panels2400/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/nasa/1-scientistsfl/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/nasa/Echus-Chasma-On-Mars/TileGroup0/0-0-0.jpg";
//			alert( "zmlist"+z+" zmlist("+z+")="+zmlist[z] );
			zmlist[z++] = "/zm/zm_nasa/nasa/mars_zigzag_panels/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/zm/Curiosity-Murray-Buttes/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/venus_400/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/zm5_planets/1-scientistsfl/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/zm5_planets/1-scientistsfl/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/hrc2009stl/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/hrc2011/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/komap/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/070214_val_marineris_02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/071010-msl-site1-02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/071127-venus-surface-02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/080409-phobos-02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/081016-crater-mound-02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/081103-mars-ripples-02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/081204-rock-layers-02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/090331-mars-starburst-02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/090813-mars-crater-02.jpg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/100113-mars-illusion-02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/20070507_185501_1010108/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/365430main_nacl000000fd_middle_540x540/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/367307main_cracked_hahn_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/369230main_apollolandinglocator_full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/388038main_milichius_full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/393992main_ejecta_20091014_full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/400202main_lroc_apollo11_20091109_full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/403330main_cabeus_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/414923main_wrinkle-ridge-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/416286main_new-images-1-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/417415main_tychocloseup-20100115-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/417417main_tychofull-20100115-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/417869main_arist_bands321-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/417873main_M111918050R_thumb-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/419421main_AS16-M-0891-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/419425main_M106088433R-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/421320main_hadley_rille/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/421615main_plato_2_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/421619main_plato_crater_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/422349main_byrgius-a-20100203-full/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/422590-mars-taber-ansigt-/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/424828main_LunarOrbiterIII_3085_med/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/433446main_20100311_crisium_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/445016main_anax3600_500/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/445021main_anax_wac_500/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/449172main_WAC_crop_context/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/449174main_M104376385_thumb/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/450800main_tsiol_2_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/450994main_full_moon_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/453514main_meteor_crater2_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/453516main_meteor_crater_az_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/455939main_holeinone_far_lg/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/463365main_M128202846LE/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/503670main_120210a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/521685main_022111a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/521691main_022111b/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/524173main_022511a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/524220main_030211b/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/528087main_031110a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/529214main_031611a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/529221main_031611c/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/531407main_031811b/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/533097main_033111b/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/534165main_040511a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/536801main_041311aa/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/539777main_042111b/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/541041main_042711a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/555516main_053111a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/558017main_060211a/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/561423main_060811b/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/576849main_062811b/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/576883main_062911b/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/58-pluto-3-large/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap11_landinJSC2007e045375/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap12_landsitea_JSC2011e118358/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap15_9aa_JSC2007e045378/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap15_lmnortha_JSC2007e045379/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap15_s2a_JSC2011e118359/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap16_lmviewa_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap16_lmwesat_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap16_s10a_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap16_s11a_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap16_s13_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap16_s13a_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap16_s1a_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap16_s1ba_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap16_slandsitea_JSC2007e045380/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap17_alsepa_JSC2004e52772/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap17_eva1a_JSC2007e045384/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap17_evaalsepa_JSC2007e045385/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap17_s1easta_JSC2004e52773/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap17_s1westa_JSC2004e52776/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap17_s2a_JSC2004e52777/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap17_s2eva2a_JSC2004e52774/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap17_s3a_JSC2004e52778/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap17_s3a_JSC2007e045386/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap17_s4a_JSC2007e045388/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap17_s5_JSC2004e20304/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap17_s5a_JSC2004e20304/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap17_s6a_JSC2007e045387/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap17_s6southa_JSC2004e52779/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/ap17_s7a_JSC2004e52775/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/apll-5_JSC2008e040725/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/AS14-68-9450HR/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/apollo/lunar-recon-orbiter-apollo-12-surveyor-3-sites-1/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/appollo17_4800/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/Curiosity-Murray-Buttes/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/zm/zm_nasa/zm5_planets/2MASS-Redshift-Survey/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/us/realtor/ky/zoom/map_doevalley/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf01/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf02/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf03/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf04/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf05/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf06/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf07/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf08/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf09/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf10/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf11/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf12/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf14/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf15/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf16/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf17510/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf17570/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf21/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf22/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf23/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf24/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf26/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf27/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf28/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf29 copy/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf30/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf31/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf32/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf34/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf35/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf36/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf38/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf40/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf41/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf42/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf43/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf44/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf_n/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtf_ne/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtfdc/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtfdc_012/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtfdc_e/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtfdc_greater/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtfdc_inc/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtfdc_n/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtfdc_s/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtfdc_w/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtfinc/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jtfinc_proper/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jttf37/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/jyf44/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/souixp/TileGroup0/0-0-0.jpg";
			zmlist[z++] = "/ko_jtf/zm/jtf_parcels/souixp_boat/TileGroup0/0-0-0.jpg";
//			z--;
//			alert( "BUGS_load zmlist("+z+")="+zmlist[z] + " len="+zmlist.length );
//			document.write( "zmlist_lost zmlist_length="+zmlist.length+" z="+z );
				return(zmlist);
				}

		function script_zmlist_show() {
			var z = 0; var zmout=""; var len=zmlist.length;
			var zmid = ""; var zmurl = "";
//			alert( "bugs178 script_zmlist_show IN" );
			for( z=0; z< zmlist.length; z++ ) {
				zmid = zmlist[z].replace('/TileGroup0/0-0-0.jpg','' );
//				zmout += "<h1><b>zmlist_"+z+"</b><h1>";
				zmout += "<a href='/index_vu.html?zmid="+zmid+"' target=_blank>";
				zmout += "	<img name='img_" + zmid + "' src='"+zmlist[z]+"' border=0 height=100 >\n";
				zmout += "	</a>";
				zmout += "<a href='"+zmid+".html'  target=_blank>";
				zmout += "	<img name='img_" + zmid + "' height=25 src='"+zmlist[z]+"' border=0 height=100 >\n";
				zmout += "	</a>";
//				alert( "bugs430 zmid=" + zmid );
				}
//			document.write( "bugs435 zmout=" + zmout );

//			alert( "BUGS432_show zmlist("+len+")="+zmlist[z] + " len="+zmlist.length );
// 			document.getElementById('div_zmlist').innerHTML += zmout;
			var parent = document.getElementById('div_zmlist');
			parent.insertAdjacentHTML('beforeend', zmout);
			}
//		function script_zmlist() {
//			script_zmlist_load();
//			alert( "bugs_437: script_zmlist len="+zmlist.length );
//			script_zmlist_show();
//			}
		function script_zm_view( search ) {
			document.write( "script_zm_view search="+search );




			}
		</script>
<!--
	</body>
	</html>
<html>
	<head>
		<title>index_vu.html 20180629_0100 jpl swim tn2img </title>
	-->
<!--
		<title>index_vu.html 20180623_0900 jpl swim tn2img </title>
		<title>index_vu.html 20180620_1930 </title>
		<title>index_vu.html 20180605_0500 </title>
		<title>index.html 20180603_0800</title>
		<title>index.html 20180603_0600</title>
		<title>index_links.html 20180602_0100</title>
	-->
		<style>
			body{ background-color:slategrey; }
			</style>

<style>
	@font-face {
		font-family: yokkmokkOT;
		src: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
		}

	@font-face {
		font-family: 'yokkmokkOT_file';
		src: url('/fonts/yokkmokkOT.otf'); /* IE 5-8 */ 
		src: local('?'),             /* sneakily trick IE */
	        url('/fonts/yokkmokk.ttf') format('truetype'), /* Opera, Safari */
	        url('/fonts/yokkmokkOT.woff') format('woff'),    /* FF 3.6, Chrome 5, IE9 */
	        url('/fonts/yokkmokkOT.svg#font') format('svg'); /* iOS */
		}

		body { 
//			background: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
			background-color: lightblue;
			background-color: darkslategrey;
			background-color: darkgreyslate;
//			color: black;
			color: white;
			font-size:62.5%; 
			font-family: "New Times Roman";
			font-family: "serif";
			font-family: "sans-serif";
			font-family: "courier";
			font-family: "monospace";
			font-family: cursive;
			font-family: fantasy;
			font-family: yokkmokkOT;
			font-family: "arial";
			font-size: 38pt;
			}

//		h1 { font-size: 2.4em; } /* =24px */
		h1 { font-size: 14pt; } /* =24px */
		h2 { font-size: 12pt; } /* =24px */
		p  { font-size: 10pt; } /* =14px */
		li { font-size: 20pt; } /* =14px? */
			}

		</style>

	<div id="div_url">
		<script id="script_url">
			var url = document.createElement("a");
			url.href=location.href;
			var output = "output";
			url.pathname = url.pathname.replace(/(^\/?)/,"/");



			var pnlist_psv = new Array();
			var pnlist_csv = new Array();
			var pnlist_tn = new Array();
			var pnlist = new Array();

			script_pnlist_load();
			script_pnlist_psv_load();
//			script_pnlist_csv_load();
			alert( "BUGS_81 pnlist_psv_len="+pnlist_psv.length );
//			alert( "BUGS_81 pnlist_csv_len="+pnlist_csv.length );
//			script_pnlist_tn_load();
			script_pnlist_show();

//			script_pnlist();

//			pnlist_psv = script_pnlist_psv_load();
//			alert( "BUGS_70b pnlist_len="+pnlist_psv.length );

//			pnlist_tn = script_pnlist_tn_load();
//			alert( "BUGS_71 pnlist_len="+pnlist_tn.length );

//			pnlist = script_pnlist_load();
//			alert( "BUGS_72 pnlist_len="+pnlist.length );

			var default_idx = 19;
			var idx=default_idx;
			if( url.search != "" ) {
//				script_zm_view( url.search );
				var q_val = url.search.split('&')[0];
				var idx_val = url.search.split('&')[1];
				var pnid_val = url.search.split('&')[2];
				idx = idx_val.split('=')[1];
				alert( "BUGS_100 idx="+idx+" pnid_val="+pnid_val );
//				script_pn_view( url.search );
				}
			script_pn_view( idx );
//			alert(location.href)
//			alert(url.protocol)
//			alert(url.hostname)
//			alert(url.pathname)
//			alert(url.search)
//			alert(url.hash)


//			document.write( "hostname=" + url.hostname + " loc.href=" + location.href );
//			document.write( "pathname=" + url.pathname + " search=" + url.search );
			</script>
		</div>



<!--
	<style id="style_input">
		.fileContainer {
		    overflow: hidden;
		    position: relative;
			}
		
		.fileContainer [type=file] {
		    cursor: inherit;
		    display: block;
		    font-size: 999px;
		    filter: alpha(opacity=0);
		    min-height: 100%;
		    min-width: 100%;
		    opacity: 0;
		    position: absolute;
		    right: 0;
		    text-align: right;
		    top: 0;
			}
		</style>
	-->

<!--
	<style id="style_input2">
		input[type=text] {
			background-color: #BFBDBD;
			border:solid 1px #BFBDBD;
			color: #979797;
			height: 28px;
			padding-left:10px;
			width: 191px;
			box-shadow: 2px 2px 0 #828181 inset;
			}
		input[type=button] {
			background-color: #1E1E1E;
			color: #979797;
			height: 24px;
			width: 103px;
			color: #bbbbbb;
			text-transform:uppercase;
			box-shadow:-1px 2px #6E6B6A inset;
			}
		input[type=button], input[type=text]
			{border-radius: 5px; font-family: Sansation;}
			{border-radius: 5px; font-family: yokkmokkOT;}
		</style>
	-->





	<style id="style_popover" >
		.popover  {
			position: relative;
			float: left;
			padding: 5px;
			/*z-index: 0;*/
			}
		.popover:hover {
			background-color: slategrey;
//			background-color: #e9e9e2;
			/*z-index: 50;*/
			color: white;
//			color: #335500;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.popover span { 
			position: absolute; 
//			background-color: #e5e5e5;
			background-color: slategrey;
			padding: 5px;
			/*left: -1000px;*/
			border: 1px solid #666;
			visibility: hidden;
			color: black;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.popover span img { 
			border-width: 0px; 
			/*padding: 2px;*/
			}
		
/*CSS for enlarged image on hover*/
		.popover:hover span { 
			visibility: visible; 
//			width: 200px;
			top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 5px;/*position where enlarged image should offset horizontally */
			}
		</style>


	<style id="style_thumbnail" >
		.thumbnail  {
			position: relative;
			float: left;
			padding: 5px;
			/*z-index: 0;*/
			}
		.thumbnail:hover {
			background-color: #e9e9e2;
			/*z-index: 50;*/
			color: #335500;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.thumbnail span { 
			position: absolute; 
			background-color: #e5e5e5;
			padding: 5px;
			/*left: -1000px;*/
			border: 1px solid #666;
			visibility: hidden;
			color: black;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.thumbnail span img { 
			border-width: 0px; 
			/*padding: 2px;*/
			}
		
/*CSS for enlarged image on hover*/
		.thumbnail:hover span { 
			visibility: visible; 
			width: 200px;
			top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 300px;/*position where enlarged image should offset horizontally */
			}
		
		/*THUMBNAIL2 - thumbnail2 has border and border on hover*/
		.thumbnail2 {
			position: relative;
			float: left;
			padding: 5px;
			/*z-index: 0;*/
			}
		.thumbnail2:hover { 
			background-color: #e9e9e2;
			/*z-index: 50;*/
			color: #335500;
			text-decoration: none;
			}
		.thumbnail2 span { /*CSS for enlarged image*/
			position: absolute;
			background-color: #e5e5e5;
			padding: 5px;
			/*left: -1000px;*/
			border: 1px solid #666;
			visibility: hidden;
			color: black;
			text-decoration: none;
			}
		
/*CSS for enlarged image*/
		.thumbnail2 span img { border-width: 0px;}
/*CSS for enlarged image on hover*/
		.thumbnail2:hover span { 
			visibility: visible; width: 208px;
			top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 300px;/*position where enlarged image should offset horizontally */
			}
		a.thumbnail2 img { text-decoration:none; z-index: 50; }
		
/*if same attribute for all 4 states, then declare here in a.thumbnail2*/ 
		a.thumbnail2 img:link { border: 2px solid #e9e9e2; background: transparent; }
		a.thumbnail2 img:visited { border: 2px solid #e9e9e2; background : transparent; }
		a.thumbnail2 img:hover { border: 2px solid #f00; background : transparent; }
		a.thumbnail2 img:active { border: 2px solid #e9e9e2; background : transparent; }
		a.thumbnail2 img { border: 2px solid #e9e9e2; }
		</style>

	<style id="style_buttons" >
                body { text-align: center; background-color: "slategrey"; color:"white"; }
                button {
//			visibility: hidden;
//			background: rgba(7, 99, 53, .1);
			background: transparent;
//	                border: 3px solid rgba(7, 99, 53, 1);
	                border: 3px solid slategrey;
			border-radius: 5px;
//			color: rgba(7, 99, 53, 1);
			color: slategrey;
			cursor: pointer;
			line-height: 40px;
			font-size: 20px;
			outline: none;
			padding: 0 20px;
			transition: all .3s;
                	}
	        button:hover {
//	              background: rgba(7, 99, 53, 1);
  	              background: darkgreyslate;
//  	              background: yellow;
//  	              background: white;
//  	              color: rgba(255,255,255,1);
  	              color: white;
  	              }
		p {font-size: 20px; font-weight: bold;
		</style>

	<style id="style_input" >
                body { text-align: center; background-color: "slategrey"; color:"white"; }
                input {
//			visibility: hidden;
//			background: rgba(7, 99, 53, .1);
			background: transparent;
//	                border: 3px solid rgba(7, 99, 53, 1);
	                border: 3px solid slategrey;
			border-radius: 5px;
//			color: rgba(7, 99, 53, 1);
			color: slategrey;
			cursor: pointer;
			line-height: 40px;
			font-size: 10px;
			outline: none;
			padding: 0 20px;
			transition: all .3s;
                	}
	        button:hover {
//	              background: rgba(7, 99, 53, 1);
  	              background: darkgreyslate;
//  	              background: yellow;
//  	              background: white;
//  	              color: rgba(255,255,255,1);
  	              color: white;
  	              }
		p {font-size: 10px; font-weight: bold;
		</style>





<style type="text/css"><!--
#drop {
 width:400px;
 height:300px;
 margin:3px auto;
 background:#eddaa8;
 font-size:16px;
}
#drop #sw { text-decoration:underline; cursor:pointer; }
#drag {
 width:450px;
 height:180px;
 margin:12px auto;
 border:1px solid silver;
 font-size:16px;
}
#drag .drg { margin:10px 12px; }
#drag div.drg {
 width:150px;
 height:50px;
 background:#07da08;
 border:2px solid blue;
}
--></style>

<script type="text/javascript"><!--

$(document).ready(function() {
  // sets the draggable
   $('#drag .drg').draggable({
    cursor: 'move',          // sets the cursor apperance
    revert: 'valid'
  });

  // sets droppable
  $('#drop').droppable({
    drop: function(event, ui) {
      // after the draggable is droped, hides it with a hide() effect
      ui.draggable.hide(1000);
    }
  });

  // when the "#sw" element (inside the "#drop") is clicked
  // show the items with class "drg", contained in "#drag"
  $('#drop #sw').click(function(){
  //   $('#drag .drg').slideDown(1000);
   var url = "https://ka6//ko_center/ko_center.php?q=jqui/dragdrop1/"
   $(location).attr('href',url);
  });
});

--></script>









<!--
		</head>
	<body onload="init_pano('canvas')"> 
	-->

	<script id="script_load_liks" >
		var ko_links = new Array();
		var svc_links = new Array();
		var srv_links = new Array();
		function load_svc_links() {
			var j=0;
			svc_links[j++]="/index_av.html|/imgs/links/index_av.png|index_av|/imgs/btn/kob.png";
			svc_links[j++]="/index_bb.html|/imgs/links/index_bb.png|index_bb|/imgs/btn/kob.png";
			svc_links[j++]="/index_dd.html|/imgs/links/index_dd.png|index_dd|/imgs/btn/kob.png";
			svc_links[j++]="/index_fl.html|/imgs/links/index_fl.png|index_fl|/imgs/btn/kob.png";
			svc_links[j++]="/index_sl.html|/imgs/links/index_sl.png|index_sl|/imgs/btn/kob.png";
			svc_links[j++]="/index_vu.html|/imgs/links/index_tl.png|index_tl|/imgs/btn/kob.png";
			svc_links[j++]="/index_tm.html|/imgs/links/index_tm.png|index_tm|/imgs/btn/kob.png";
			svc_links[j++]="/index_av.html|/imgs/links/index_av.png|index_av|/imgs/btn/kob.png";
			svc_links[j++]="/index_zm.html|/imgs/links/index_zm.png|index_zm|/imgs/btn/kob.png";
			svc_links[j++]="/index_vu.html|/imgs/links/index_vu.png|index_vu|/imgs/btn/kob.png";
			return( svc_links );
			}

		function load_srv_links() {
			srv_links[0]="ko0.us/index.html|/imgs/btn/koeyeb.png|ko0us|/imgs/btn/kob.png";
			srv_links[1]="ko1.us/index.html|/imgs/btn/koeye.png|ko1us|/imgs/btn/kop1234.png";
			srv_links[2]="ko2.us/index.html|/imgs/btn/koeyew.png|ko2us|/imgs/btn/kow.png";
			srv_links[3]="konet.org/index.html|/imgs/btn/ko.png|konet-org|/imgs/btn/kib.png";
			srv_links[4]="iperms.com/index.html|/imgs/links/iperms.png|iperms-com|/imgs/btn/kop34.png";
			srv_links[5]="kassil.com/index.html|/imgs/links/kassil.png|kassil-com|/imgs/btn/kop12.png";
			return( srv_links );
			}

		function load_ko_links() {
			var j=0;
			ko_links[j++]="/jkwii/blackboard.html|/imgs/links/blackboard.png|blackboard|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/js/threejs/examples/index.html|/imgs/links/index_js3d.png|index_js3d|/imgs/btn/koeye.png";
			ko_links[j++]="/ko/svc/js/stemkoskijs/Three.js/index.html|/imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/js/gojs/index.html|/imgs/links/index_jsgo.png|index_jsgo|/imgs/btn/koeye.png";
			ko_links[j++]="/index_jsdk.html|/imgs/links/index_jsdk.png|index_jsdk|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/koh5_globe/koh5_globe.html|/imgs/links/koh5_globe.png|koh5_globe|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/aud/keybd/index.html|/imgs/links/index_jskb.png|index_jskb|/imgs/btn/koeye.png";
			ko_links[j++]="/svc/kokbdm/index.html|/imgs/links/index_jskb-dm.png|index_jskb-dm|/imgs/btn/koeye.png";
			ko_links[j++]="/svc/kokbdms/index.html|/imgs/links/index_jskb-dms.png|index_jskb-dms|/imgs/btn/koeye.png";
			ko_links[j++]="/piano.html|/imgs/links/index_piano.png|index_piano|/imgs/btn/koeye.png";
			ko_links[j++]="/jkwii/aud/piano_uri/koh5_piano_uri.html|/imgs/links/index_jskb-uri.png|index_jskb_uri|/imgs/btn/koeye.png";
			ko_links[j++]="/ko/svc/js/stemkoskijs/index.html|/imgs/links/index_js3d-stemkoski.png|index_js3d-stemkoski|/imgs/btn/koeye.png";
			ko_links[j++]="/ko/svc/aud/mrcoles/koh5_mrcoles.html|/imgs/links/mrcoles.png|mrcoles|/imgs/btn/koeye.png";
			ko_links[j++]="http://effectgames.com/demos/canvascycle/|/imgs/links/index_effectgames.png|index_effectgames|/imgs/btn/koeye.png";
			ko_links[j++]="https://www.leshylabs.com/apps/sfMaker/|/imgs/links/index_sfmaker.png|index_sfmaker|/imgs/btn/koeye.png";
			ko_links[j++]="https://dragongoserver.net/|/imgs/links/index_dgs.png|index_dgs|/imgs/btn/koeye.png";
			ko_links[j++]="/ko_center/ko_center.php|/imgs/links/ko_center.png|ko_center|/imgs/btn/kob.png";
			ko_links[j++]="/ko_saic/ko_saic.php|/imgs/links/ko_saic.png|ko_saic|/imgs/btn/kob.png";
			ko_links[j++]="/index_kt.html|/imgs/links/index_kt.png|index_kt|/imgs/btn/kob.png";
			ko_links[j++]="/index_jtf.html|/imgs/links/index_jtf.png|index_jtf|/imgs/btn/kob.png";
			ko_links[j++]="/index2big.html|/imgs/links/index2big.png|index2big|/imgs/btn/kob.png";
			ko_links[j++]="/index2big.htm|/imgs/links/index2big_noel.png|index2big_noel|/imgs/btn/kob.png";
			ko_links[j++]="/jkwii/whiteboard.html|/imgs/links/whiteboard.png|whiteboard|/imgs/btn/koeye.png";
			return( ko_links );
			}

		function show_svc_links(mode) {
			svc_links = load_svc_links();
			htmout_svc_links = "";
			htmout_svc_linkz = "";
			for (i = 0; i < svc_links.length; i++) {
				my_btnimg = "/imgs/btn/kib.png";
				my_href = svc_links[i].split("|")[0];
				my_popimg = svc_links[i].split("|")[1];
				my_alt = svc_links[i].split("|")[2];

//				htmout_svc_linkz += '<div  class="drag" name="'+my_alt+'" >\n';
				htmout_svc_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_svc_linkz += '<img id="drg" src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';
//				htmout_svc_linkz += '</div >';

//				htmout_svc_links += '<div  class="drag" name="'+my_alt+'" >\n';
				htmout_svc_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_svc_links += '<img class="drag" id="drg" src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_svc_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
//				htmout_svc_links += '</div >';
				}
			if( mode === 'pop' ) {
				htmout_svc_links += "<br><br>\n";
				var div_svc_links = document.getElementById('div_svc_links');
				div_svc_links.insertAdjacentHTML('beforeend', htmout_svc_links);
				return( htmout_svc_links );
				}

			htmout_svc_linkz += "<br><br>\n";
			var div_svc_linkz = document.getElementById('div_svc_linkz');
			div_svc_linkz.insertAdjacentHTML('beforeend', htmout_svc_linkz);
			return( htmout_svc_linkz );
			}

		function show_ko_links(mode) {
			ko_links = load_ko_links();
			htmout_ko_links = "";
			htmout_ko_linkz = "";
			for (i = 0; i < ko_links.length; i++) {
				my_btnimg = "/imgs/btn/koeye.png";
				my_href = ko_links[i].split("|")[0];
				my_popimg = ko_links[i].split("|")[1];
				my_alt = ko_links[i].split("|")[2];

				htmout_ko_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_ko_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';

				htmout_ko_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_ko_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_ko_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
				}

			if( mode === 'pop' ) {
				htmout_ko_links += "<br><br>";
				var div_ko_links = document.getElementById('div_ko_links');
				div_ko_links.insertAdjacentHTML('beforeend', htmout_ko_links);
				return( htmout_ko_links );
				}

			htmout_ko_linkz += "<br><br>";
			var div_ko_linkz = document.getElementById('div_ko_linkz');
			div_ko_linkz.insertAdjacentHTML('beforeend', htmout_ko_linkz);
			return( htmout_ko_linkz );
			}

		function show_srv_links(mode) {
			srv_links = load_srv_links();
			htmout_srv_links = "";
			htmout_srv_linkz = "";
			for (i = 0; i < srv_links.length; i++) {
				my_btnimg = "/imgs/btn/kiw.png";
				my_href = srv_links[i].split("|")[0];
				my_popimg = srv_links[i].split("|")[1];
				my_alt = srv_links[i].split("|")[2];

				htmout_srv_linkz += '<a class="drag" href="' + my_href + '" target=_blank>"';
				htmout_srv_linkz += '<img src="' + my_popimg + '" alt="' + my_alt + '" height=100></a>';

				htmout_srv_links += '<a class="thumbnail" href="' + my_href + '" target=_blank>"';
				htmout_srv_links += '<img src="' + my_btnimg + '" alt="' + my_alt + '" width=25px height=14px border=0>';
				htmout_srv_links += '<span><img src="' + my_popimg + '" alt="' + my_alt + '"></span></a>';
				}
			if( mode === 'pop' ) {
				htmout_srv_links += "<br><br>\n"
				var div_srv_links = document.getElementById('div_srv_links');
				div_srv_links.insertAdjacentHTML('beforeend', htmout_srv_links);
				return( htmout_srv_links );
				}

			htmout_srv_linkz += "<br><br>\n"
			var div_srv_linkz = document.getElementById('div_srv_linkz');
			div_srv_linkz.insertAdjacentHTML('beforeend', htmout_srv_linkz);
			return( htmout_srv_linkz );
			}

//			document.write( htmout_svc_links );
//			document.write( htmout_ko_links );
//			document.write( htmout_srv_links );

//			var div_ko_links = document.getElementById("div_ko_links");
//			var div_ko_links_orig = div_ko_links.innerHTML;
//			alert( "BUGS_500 div_ko_links_orig="+div_ko_links_orig );

//			div_ko_links.innerHTML = "";
//			div_ko_links.appendChild( htmout_ko_links);


// pqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq
//
// getElementById("foo").insertAdjacentHTML
// <!-- beforebegin / before -->
// <p>
//   <!-- afterbegin / prepend -->
//   foo
//   <!-- beforeend / append -->
// </p>
// <!-- afterend / after-->
//
//		document.getElementById('foo').insertAdjacentHTML("beforebegin", "<hr>")
//		$('#foo').before("<hr>")
//		document.getElementById('foo').insertAdjacentHTML("afterend", "<hr>")
//		$('#foo').append("<hr>")
//		document.getElementById('foo').insertAdjacentHTML("beforeend", "<hr>")
//		$('#foo').append("<hr>")
//		document.getElementById('foo').insertAdjacentHTML("afterbegin", "<hr>")
//		$('#foo').prepend("<hr>")
//
//	var btn = document.getElementById('btn'); // The button itself with an ID of 'btn'
//	var newButton = '<button>New button</button>'; // New button to be inserted
//	btn.insertAdjacentHTML('afterend', newButton);
//
// bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdb
		function show_all_links(mode) {
			show_svc_links(mode);
			show_ko_links(mode);
			show_srv_links(mode);
			}

		</script>

	<div id="div_links" >
		<hr color=red>
		<div id="div_svc_links" > </div>
		<hr color=red>
	
		<hr color=white>
		<div id="div_ko_links" > </div>
		<hr color=white>

		<hr color=blue>
		<div id="div_srv_links" > </div>
		<hr color=blue>
		</div>

	<div id="div_linkz" >
		<hr color=red>
		<div id="div_svc_linkz" > </div>
		<hr color=red>

		<hr color=black>
		<div id="div_ko_linkz" > </div>
		<hr color=black>

		<hr color=blue>
		<div id="div_srv_linkz" > </div>
		<hr color=blue>
		</div>

	<div id="div_cfaa" class=ko>
<!--
		<style id=style_craa>
			body { 
//			background: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
			background-color: darkslategrey;
			color: white;
			font-size:62.5%; 
//			font-family: yokkmokkOT;
			font-size: 38pt;
			}

		</style>


		<script id=script_htm>
			if( url.pathname == "/index.htm" ) {
				body { background-color: slategrey; color: white; }
				}
			</script>

		<script id=script_cfaa>

			</script>
	-->

	<script id="script_cfaa">
		var text_cfaa = 
`
pqpqpqpqpqpqpqpqpqpq Warning pqpqpqpqpqpqpqpqpqpq<br>
<br>
This site may be protected under the 
<br>
<br>
<b>CFAA</b> 
<br>
Computer Fraud and Abuse Act 
<br>
<br>
your attemped access has been logged 
<br>
repeated attemps by unauthorized guests will be reported 
<br>
<br>
By continuing You are acknowledging 
<br>
you are fully authorized and 
<br>
understand the responsibilites to access the content on the site 
<br>
<br>
This page must not be removed 
<br>
bdbdbdbdbdbdbdbdbdbd Warning bdbdbdbdbdbdbdbdbdbd
<br>
<br>
unauthoriced users should
<br>
consider browsing elsewhere: 


<hr color=black>
<hr color=ivory>
<hr color=red>
<hr color=blue>
<hr color=ebony>
<hr color=white>

<a href=duckduckgo.com > <img src="ok.png" alt="duckduckgo" height=10 border=0></a>
&nbsp &nbsp &nbsp
<a href=bing.com > <img src="ok.png" alt="bing" height=10 border=0></a>
&nbsp &nbsp &nbsp
<a href=google.com > <img src="ok.png" alt="google" height=10 border=0></a>
&nbsp &nbsp &nbsp
<a href=yahoo.com > <img src="ok.png" alt="yahoo" height=10 border=0></a>
&nbsp &nbsp &nbsp
	<a href=https://mars.jpl.nasa.gov/msl/multimedia/raw target=_blank>
		<img src="ok.png" border=0 height=10>
		</a>
&nbsp &nbsp &nbsp
	<a href=http://youtube.com target=_blank>
		<img src="ok.png" border=0 height=10>
		</a>

<hr color=white>
<hr color=ebony>
<hr color=blue>
<hr color=red>
<hr color=ivory>
<hr color=black>

	<div id=warn2 class=ko> 
		<p id=p_warn2 class=ko>
			<hr color=black>
			<hr color=white>
			<hr color=red>
				If you are seeing this page
				<br>
				you are probably unauthorized 
				<br>
				you should <b>NOT</b> continue 
				<br>
				accessing site content here may be 
				<br>
				protected under <b>CFAA</b>
			<hr color=red>
			<hr color=white>
			<hr color=black>
			</p>

		authorized sites are available from bluehost 

		<a href=http://bluehost.com/track/konet/ko2.us target=_blank>
		<img src=/imgs/bh/bh_anim.gif height=30 border=0 alt=bluehost.com affiliate></a>
		<div id=kobh_offer class=ko>
			bluehost offers 
			50 gb space 
			999 gb bandwidth 

			6 domains on 1 account 
			and more for only $6.95/month 
			</div>
		</div>
`;
		var text_cfaa = '';
		
		</script>



	<script id="script_url">
			var url = document.createElement("a");
			url.href=location.href
			var output = "output"
			url.pathname = url.pathname.replace(/(^\/?)/,"/");
//			alert(location.href)
//			alert(url.protocol)
//			alert(url.hostname)
//			alert(url.pathname)
//			alert(url.search)
//			alert(url.hash)

			if( url.search == "" ) {document.write( text_cfaa );}
			if( url.search == "?q=cfaa" ) {document.write( text_cfaa ); }
			</script>
		</div>



<!--
		<iframe id="myframe" src="/svc/kokbdm/index.html" width="1000" height="500"
        		frameborder="0" scrolling="yes"></iframe>
	-->

	<hr color=red><hr color=black><hr color=white>
	        <button type="button" onclick="show_all_links('pop');return false">show_all_links</button>
<!--		<button type="button" id="upload" value="Upload" onclick="Upload()">upload</button> -->
	<hr color=red><hr color=white><hr color=blue>
	        <button type="button" onclick="show_svc_links('pop');return false">show_svc_links</button>
	        <button type="button" onclick="show_ko_links('pop');return false">show_ko_links</button>
	        <button type="button" onclick="show_srv_links('pop');return false">show_srv_links</button>
	<hr color=blue><hr color=white><hr color=black>

<!--
	<img src="/imgs/btn/kib.png" height="50" size="150" alt="koeye" onclick="show_svc_links(); return false"> 
        <img src="/imgs/btn/ko.png" height="50" size="150" alt="koeyeb" onclick="show_ko_links();return false;"> 
        <img src="/imgs/btn/kiw.png" height="50" size="150" alt="koeyew" onclick="show_srv_links();return false">
	-->


	<a href=# class="popover" onclick="show_svc_links();return false">
	        <img src="/imgs/btn/kib.png" height="100" width="200" alt="koeyew" >
	        <span><img src="/imgs/btn/kiw.png" height="100" width="200" alt="koeyew" ></span>
		</a>

	<a href=# class="popover" onclick="show_ko_links();return false">
        	<img src="/imgs/btn/ko.png" height="100" size="200" alt="koeyeb" > 
        	<span><img src="/imgs/btn/ok.png" height="100" size="200" alt="koeyeb" ></span>
		</a>

	<a href=# class="popover" onclick="show_srv_links();return false">
	        <img src="/imgs/btn/kiw.png" height="100" width="200" alt="koeyew" >
	        <span><img src="/imgs/btn/kib.png" height="100" width="200" alt="koeyew" ></span>
		</a>

	<br><br>
	<br><br>
	<br><br>
	<br><br>
	<br><br>


	<hr color=blue><hr color=white><hr color=red>
<!--
	<div id="div_neave_wobble" >
		<iframe frameborder='0' height='150' marginheight='0' marginwidth='0' scrolling='no' 
			src='index.html' 
			style='margin-bottom: 20px; box-shadow: 0 2px 2px rgba(0,0,0,0.3)' width='100%'>
			</iframe>
		</div>
	-->




	<div id="div_files" >
		<output id="zonelist"></output>
		<div id="dropzone">
			dropzone
			<div id="div_canvas" style="position:relative; width:400px; height:200px background:white">
				<canvas id="canvas_dropzone" style="z-index: 1;
					position:absolute;
					left:0px;
					top:0px;
					" height="100px" width="200" background-color="white" color="white">
					WARN_1387 unauthorized access has been logged
					</canvas>
			</div>

		<script name="script_fileselect">
			function handleFileSelect(evt) {
				evt.stopPropagation();
				evt.preventDefault();

				var files = evt.dataTransfer.files; // FileList object.

// files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                  f.size, ' bytes, last modified: ',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  '</li>');
    }
    document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
  }

  function handleDragOver(evt) {
    evt.stopPropagation();
    evt.preventDefault();
    evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
  }

  // Setup the dnd listeners.
  var dropZone = document.getElementById('dropzone');
  dropZone.addEventListener('dragover', handleDragOver, false);
  dropZone.addEventListener('drop', handleFileSelect, false);
</script>

<hr><hr><hr>
<style>
  .thumb {
    height: 75px;
    border: 1px solid #000;
    margin: 10px 5px 0 0;
  }
</style>


	<label class="fileContainer">
		files
		<input id="files" name="files[]" multiple="" type="file">
		</label>


<output id="zonelist"></output>

<script>
  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object

    // files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                  f.size, ' bytes, last modified: ',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  '</li>');
    }
    document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
  }

	  document.getElementById('files').addEventListener('change', handleFileSelect, false);
	</script>

	<div id="div_files2" hidden >
		<label class="fileContainer">
			files2
			<input id="files" name="files[]" multiple="" type="file">
			</label>
		<output id="zonelist"></output>
		</div>

<script>
  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object

    // Loop through the FileList and render image files as thumbnails.
    for (var i = 0, f; f = files[i]; i++) {

// Only process image files.
	if (!f.type.match('image.*')) { continue; }

      var reader = new FileReader();

      // Closure to capture the file information.
      reader.onload = (function(theFile) {
        return function(e) {
          // Render thumbnail.
          var span = document.createElement('span');
          span.innerHTML = ['<img class="thumb" src="', e.target.result,
                            '" title="', escape(theFile.name), '"/>'].join('');
          document.getElementById('zonelist').insertBefore(span, null);
        };
      })(f);

      // Read in the image file as a data URL.
      reader.readAsDataURL(f);
    }
  }

  document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>

<hr color=black><hr color=black><hr color=black>

<style>
  #byte_content {
    margin: 5px 0;
    max-height: 100px;
    overflow-y: auto;
    overflow-x: hidden;
  }
  #byte_range { margin-top: 5px; }
</style>
<script id="script_previewfile">
			function previewfile(file) {
				if (tests.filereader === true && acceptedTypes[file.type] === true) {
					var reader = new FileReader();
					reader.onload = function (event) {
						var image = new Image();
						image.src = event.target.result;
						image.width = 250; // a fake resize
						holder.appendChild(image);
						};

					reader.readAsDataURL(file);
					}  
				else {
					holder.innerHTML += 
						'<p>done:  koupload' 
							+ file.name 
							+ ' ' 
							+ (file.size ? (file.size/1024|0) + 'K' : ''); 
						console.log(file);
					}
				}

			function readfiles(files) {
				debugger;
				var formData = tests.formdata ? new FormData() : null;
				for (var i = 0; i < files.length; i++) {
					if (tests.formdata) formData.append('file', files[i]);
					previewfile(files[i]);
					}

// now post a new XHR request
				if (tests.formdata) {
					var xhr = new XMLHttpRequest();
					xhr.open('POST', 'http://ka6/ko/bin/php/ko.php?ko=ajax,upload,filenames,phpi,ok');
//					xhr.open('POST', 'ka6/ko/bin/php/index.php?q=upload,filenames');
					xhr.onload = function() {
						progress.value = progress.innerHTML = 100;
						};

				if (tests.progress) {
					xhr.upload.onprogress = function (event) {
						if (event.lengthComputable) {
							var complete = (event.loaded / event.total * 100 | 0);
							progress.value = progress.innerHTML = complete;
							}
						}
					}

				xhr.send(formData);
				}
			}

			if (tests.dnd) { 
				holder.ondragover = function () { this.className = 'hover'; return false; };
				holder.ondragend = function () { this.className = ''; return false; };
				holder.ondrop = function (e) {
					this.className = '';
					e.preventDefault();
					readfiles(e.dataTransfer.files);
					}
				} 
			else {
				fileupload.className = 'hidden';
				fileupload.querySelector('input').onchange = function () {
				readfiles(this.files);
				};
			}
		</script>

	<script id="script_myfilework>

		funtion myfilework( j, file ) {

			alert( j+" file="+file );
			}

		</script>





		<script id="script_upload_input">>
			var upload = document.getElementsByTagName('input')[0],
			holder2 = document.getElementById('holder2'),
			state = document.getElementById('status');

			if (typeof window.FileReader === 'undefined') {
				state.className = 'fail';
				} 
			else {
				state.className = 'success';
				state.innerHTML = 'File API & FileReader available';
				}
 
			upload.onchange = function (e) {
				e.preventDefault();

				var file = upload.files[0],
				reader = new FileReader();
				reader.onload = function (event) {
					var img = new Image();
					img.src = event.target.result;
// note: no onload required since we've got the dataurl...I think! :)
					if (img.width > 560) { // holder width
						img.width = 560;
						}
					holder2.innerHTML = '';
					holder.appendChild(img);
					};
				reader.readAsDataURL(file);

				return false;
				};

//			var formData = new FormData();
//			formData.append("part_num", "123ABC"); 
//			formData.append("part_price", 7.95);
//				formData.append("part_image", somefile)
//
//			var xhr = new XMLHttpRequest();
//			xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload/");  
//			xhr.send(formData);
			</script>

	<canvas color="darkslatgrey" height="100" width="400"></canvas>
	<script>
		var canvas = document.getElementsByTagName('canvas')[0],
    ctx = null,
    grad = null,
    body = document.getElementsByTagName('body')[0],
    color = 255;
    color = lightblue;
    
if (canvas.getContext('2d')) {
  ctx = canvas.getContext('2d');
  ctx.clearRect(0, 0, 600, 600);
  ctx.save();

// Create radial gradient
//  grad = ctx.createRadialGradient(0,0,0,0,0,600); 
//  grad.addColorStop(0, '#000');
//  grad.addColorStop(1, 'rgb(' + color + ', ' + color + ', ' + color + ')');

  // assign gradients to fill
//  ctx.fillStyle = grad;
	ctx.fillstyle = "lightblue";

  // draw 600x600 fill
  ctx.fillRect(0,0,600,600);
  ctx.save();
  
  body.onmousemove = function (event) {
    var width = window.innerWidth, 
        height = window.innerHeight, 
        x = event.clientX, 
        y = event.clientY,
        rx = 600 * x / width,
        ry = 600 * y / height;
        
    var xc = ~~(256 * x / width);
    var yc = ~~(256 * y / height);

    grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600); 
    grad.addColorStop(0, '#000');
    grad.addColorStop(1, ['rgb(', xc, ', ', (255 - xc), ', ', yc, ')'].join(''));
    // ctx.restore();
//    ctx.fillStyle = grad;
	ctx.fillstyle="lightblue";
    ctx.fillRect(0,0,600,600);
    // ctx.save();
  };
}
	</script>

	<div id="div_csv">
	<style type="text/css">
		body {
			font-family: Arial;
			font-size: 10pt;
			}
		table {
			border: 1px solid #ccc;
			}
		table th {
			background-color: #F7F7F7;
			color: #333;
			font-weight: bold;
			}
		table th, table td {
			padding: 5px;
			border-color: #ccc;
			}
		</style>
	
	<script type="text/javascript">
		function Upload() {
			var fileUpload = document.getElementById("fileUpload");
			var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt|.psv|.py|.htm|.html|.php)$/;
			if (regex.test(fileUpload.value.toLowerCase())) {
				if (typeof (FileReader) != "undefined") {
					var reader = new FileReader();
					reader.onload = function (e) {
						var table = document.createElement("table");
						var rows = e.target.result.split("\n");
						for (var i = 0; i < rows.length; i++) {
							var row = table.insertRow(-1);
					
//							var cells = rows[i].split("|");
							var cells = rows[i].split(",");
							for (var j = 0; j < cells.length; j++) {
								var cell = row.insertCell(-1);
								cell.innerHTML = cells[j];
								}
							}
						var csv2tbl = document.getElementById("csv2tbl");
						csv2tbl.innerHTML = "";
						csv2tbl.appendChild(table);
						}
					reader.readAsText(fileUpload.files[0]);
					} 
				else {
					alert("csv2tbl warn:  unauthorized access noted");
					}
				} 
			else {
				alert("csv2tbl fail:  unsuppoted format");
				}
			}
			</script>
				<label class="fileContainer">
					files_csv_psv_ssv_tsv
					<input id="fileUpload" type="file">
					</label>

				&nbsp &nbsp &nbsp
				<label class="fileContainer">
					parse_csv_psv_ssv_tsv
					<input id="upload" value="Upload" onclick="Upload()" type="button">
					</label>
				</div>
			<div id="csv2tbl"> </div>
<!--        		<button type="button" id="fileUpload" type="file" >select</button> -->
<!--        		<button type="button" id="upload" value="Upload" onclick="Upload()">upload</button> -->
			</div>
		</div>
	<div id="div_showhide" hidden>
		<script id="script_showhide" >
			function show_files() {
				var div_files = document.getElementbyID("div_files");
				div_files.show();
				}
			function hide_files() {
				var div_files = document.getElementbyID("div_files");
				div_files.hide();
				}
			</script>
		<button type="button" id="show">show</button>
		<button type="button" id="hide">hide</button>
		<button type="show_files" id="show_files" onclick="show_files()">Show_files</button>
		<button type="hide_files" id="hide_files" onclick="hide_files()">Hide_files</button>
		<button type="show_neave_wobble" id="show_neave_wobble">Show_neave_wobble</button>
		<button type="hide_neave_wobble" id="hide_neave_wobble">Hide_neave_wobble</button>
<!--
		<button type="show_dd" id="show_dd">Show_dd</button>
		<button type="hide_dd" id="hide_dd">Hide_dd</button>
		<button type="show_bb" id="show_bb">Show_bb</button>
		<button type="hide_bb" id="hide_bb">Hide_bb</button>
		<button type="show_tl" id="show_tl">Show_tl</button>
		<button type="hide_tl" id="hide_tl">Hide_tl</button>
		<button type="show_colors" id="show_colors">Show_colors</button>
		<button type="hide_colors" id="hide_colors">Hide_colors</button>
		<button type="show_fonts" id="show_fonts">Show_fonts</button>
		<button type="hide_fonts" id="hide_fonts">Hide_fonts</button>
		<button type="show_alldivs" id="show_alldivs">Show_alldivs</button>
		<button type="hide_alldivs" id="hide_alldivs">Hide_alldivs</button>
		-->
		</div>
	<div id="item" > </div>

	<script id="script_showhide">
		$( "#show" ).click(function() {$('#item').show(); });
		$( "#hide" ).click(function() {$('#item').hide();});
		$( "#show_files" ).click(function() {$('#div_files').show(); });
		$( "#hide_files" ).click(function() {$('#div_files').hide();});
		$( "#show_neave_wobble" ).click(function() {$('#div_neave_wobble').show(); });
		$( "#hide_neave_wobble" ).click(function() {$('#div_neave_wobble').hide();});
//		$( "#show_dd" ).click(function() {$('#div_dd').show(); });
//		$( "#hide_dd" ).click(function() {$('#div_dd').hide();});
//		$( "#show_bb" ).click(function() {$('#div_bb').show(); });
//		$( "#hide_bb" ).click(function() {$('#div_bb').hide();});
//		$( "#show_tl" ).click(function() {$('#div_tl').show(); });
//		$( "#hide_tl" ).click(function() {$('#div_tl').hide();});
//		$( "#show_jkwii" ).click(function() {$('#div_jkwii').show(); });
//		$( "#hide_jkwii" ).click(function() {$('#div_jkwii').hide();});
//		$( "#show_colors" ).click(function() {$('#div_colors').show(); });
//		$( "#hide_colors" ).click(function() {$('#div_colors').hide();});
//		$( "#show_fonts" ).click(function() {$('#div_fonts').show(); });
//		$( "#hide_fonts" ).click(function() {$('#div_fonts').hide();});
//		$( "#show_alldivs" ).click(function() {$('#div_alldivs').show(); });
//		$( "#hide_alldivs" ).click(function() {$('#div_alldivs').hide();});
		</script>
	</div>


<!-- <script type="text/javascript" src="html5pano.js" ></script> -->
<script id="script_panoview" type="text/javascript"  >

/*
Copyright (c) 2010, Martin Wengenmayer ( www.cheetah3d.com )
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are 
permitted provided that the following conditions are met:

-Redistributions of source code must retain the above copyright notice, this list of 
conditions and the following disclaimer. 

-Redistributions in binary form must reproduce the above copyright notice, this list 
of conditions and the following disclaimer in the documentation and/or other materials 
provided with the distribution. 

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS 
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
POSSIBILITY OF SUCH DAMAGE.
*/

const 	FPS = 30;
const	DEG2RAD=Math.PI/180.0;

//Canvas to which to draw the panorama
var		pano_canvas=null;
 
//Event state
var		mouseIsDown=false;
var		mouseDownPosLastX=0;
var		mouseDownPosLastY=0;
var		displayInfo=false;
var		highquality=true;

//Camera state
var		cam_heading=90.0;
var		cam_pitch=90.0;
var 	cam_fov=90;

//Load image 
		var pnid=19;
		var img_buffer=null;
		var img = new Image();

		var j=0;

				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||558953|Jun|6|21:56|2018|/pn/imgs/pano_creek5.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||4100818|Dec|7||2008|/pn/imgs/pano_burmuda.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||18936775|Apr|6|1:25|2018|/pn/imgs/PIA22313_pano.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1892489|Mar|27|11:50|2018|/pn/imgs/Sol83-PremiersGivres-pano.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||49100075|Feb|10|13:13|2018|/pn/imgs/Taipo_pano.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1920795|Nov|23||2017|/pn/imgs/Opportunity-Mars-Rover-Lander-pia19112.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||17090384|Nov|23||2017|/pn/imgs/mars-rover-opportunity-pia19111_Sol3902B_Cape_Tribulation_L2R2ana.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||20422151|Nov|23||2017|/pn/imgs/mars-rover-opportunity-pia19110_Sol3902B_Cape_Tribulation_L257F.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||18009851|Jul|17||2017|/pn/imgs/mars-gale-crater-panorama-pia11241-full.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1869852|Jan|21||2017|/pn/imgs/opportunity-panorama-warton-ridge-enhanced-pia20850-full.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||13323398|Jan|21||2017|/pn/imgs/mars-panoramic-mt-sharp-rover-curiosity-pia19662.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||595490|Sep|28||2009|/pn/imgs/pano_jtf_entrance_jtf.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||726437|Jun|7||2008|/pn/imgs/pano_jtf_entrance.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1031370|Jun|1||2007|/pn/imgs/pano_fork_grass.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||583043|Jun|1||2007|/pn/imgs/pano_jtfarms_entrance_9700x100.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||559318|Jun|1||2007|/pn/imgs/pano_backyard_all.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||249208|Jun|1||2007|/pn/imgs/pano_jtfarms_enter_hi.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||316986|May|13||2007|/pn/imgs/pano_falls.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1046328|May|13||2007|/pn/imgs/pano_falls1_4000.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||282735|May|13||2007|/pn/imgs/pano_courtyard2.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||127540|May|13||2007|/pn/imgs/pano_courtyard1.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||171929|May|12||2007|/pn/imgs/pano_closeline.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||470566|May|12||2007|/pn/imgs/pano_falls_south.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||386103|May|12||2007|/pn/imgs/pano_falls_north.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||992548|May|12||2007|/pn/imgs/pano_falls_015-285.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||505577|May|11||2007|/pn/imgs/pano_creek.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||100790|May|10||2007|/pn/imgs/yard.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||154451|May|10||2007|/pn/imgs/veneer.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||81569|May|10||2007|/pn/imgs/sphere.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||80726|May|10||2007|/pn/imgs/pano.jpg";

		var z=0;
<!--
	-->

	function script_pnlist_csv_load() {
		var j=0;
		pnlist_csv[j++] = "recno,appcode,status,dttm,pathfile,path,base,file,ext,filsiz,ctime,desc1,status,index,2018-06-23_09:17:29,/pn/imgs/mars-gale-crater-panorama-pia11241-full.jpg,/pn/imgs,mars-gale-crater-panorama-pia11241-full.jpg,mars-gale-crater-panorama-pia11241-full,.jpg,18009851,2017-07-17_07:37:49,";
		pnlist_csv[j++] = "30,status,index,2018-06-23_09:17:56,/pn/imgs/yard.jpg,/pn/imgs,yard.jpg,yard,.jpg,100790,2007-05-10_20:35:18,";
		return( pnlist_csv );
		}

	function script_pnlist_load() {
		var z=0;

		pnlist[z++] = "/pn/imgs/pano_creek5.jpg";
		pnlist[z++] = "/pn/imgs/pano_burmuda.jpg";
		pnlist[z++] = "/pn/imgs/PIA22313_pano.jpg";
		pnlist[z++] = "/pn/imgs/Sol83-PremiersGivres-pano.jpg";
		pnlist[z++] = "/pn/imgs/Taipo_pano.jpg";
		pnlist[z++] = "/pn/imgs/Opportunity-Mars-Rover-Lander-pia19112.jpg";
		pnlist[z++] = "/pn/imgs/mars-rover-opportunity-pia19111_Sol3902B_Cape_Tribulation_L2R2ana.jpg";
		pnlist[z++] = "/pn/imgs/mars-rover-opportunity-pia19110_Sol3902B_Cape_Tribulation_L257F.jpg";
		pnlist[z++] = "/pn/imgs/mars-gale-crater-panorama-pia11241-full.jpg";
		pnlist[z++] = "/pn/imgs/opportunity-panorama-warton-ridge-enhanced-pia20850-full.jpg";
		pnlist[z++] = "/pn/imgs/mars-panoramic-mt-sharp-rover-curiosity-pia19662.jpg";
		pnlist[z++] = "/pn/imgs/pano_jtf_entrance_jtf.jpg";
		pnlist[z++] = "/pn/imgs/pano_jtf_entrance.jpg";
		pnlist[z++] = "/pn/imgs/pano_fork_grass.jpg";
		pnlist[z++] = "/pn/imgs/pano_jtfarms_entrance_9700x100.jpg";
		pnlist[z++] = "/pn/imgs/pano_backyard_all.jpg";
		pnlist[z++] = "/pn/imgs/pano_jtfarms_enter_hi.jpg";
		pnlist[z++] = "/pn/imgs/pano_falls.jpg";
		pnlist[z++] = "/pn/imgs/pano_falls1_4000.jpg";
		pnlist[z++] = "/pn/imgs/pano_courtyard2.jpg";
		pnlist[z++] = "/pn/imgs/pano_courtyard1.jpg";
		pnlist[z++] = "/pn/imgs/pano_closeline.jpg";
		pnlist[z++] = "/pn/imgs/pano_falls_south.jpg";
		pnlist[z++] = "/pn/imgs/pano_falls_north.jpg";
		pnlist[z++] = "/pn/imgs/pano_falls_015-285.jpg";
		pnlist[z++] = "/pn/imgs/pano_creek.jpg";
		pnlist[z++] = "/pn/imgs/yard.jpg";
		pnlist[z++] = "/pn/imgs/veneer.jpg";
		pnlist[z++] = "/pn/imgs/sphere.jpg";
		pnlist[z++] = "/pn/imgs/pano.jpg";
		return(pnlist)
		}


		img.onload = imageLoaded;

		var idx_default = 19;
		var idx = idx_default;
		var pano_img = "";
		var pano_tn = "";
		var pnid = "";
		var url_args = "";
		var pano_paths = new Array();
		var pano_paths_len = 0;
		var psv_len = pnlist_psv.length;
		var url_search = url.search;
		var base = "base";
		var path = "path";
		if( url.search != "" ) {
			url_args = url_search.split( "&" );
			idx = url_args[1].split( "=" )[1];
			pnid = url_args[2].split( "=" )[1];
			}
		pano_img = pnlist_psv[idx].split("|")[12];
//		alert( "BUGS_1400 idx="+idx+"  pano_img="+pano_img+"  url_search="+url_search );

		pano_paths = pano_img.split("/");
		pano_paths_len = pano_paths.length;
//		alert( "BUGS_1550 pano_paths_len="+pano_paths_len+"  path="+path+'  base="+base );
//		base = pano_paths[ pano_paths_len -1];
//		path = pano_img.replace("base","");
//		alert( "BUGS_1550 pano_img="+pano_img+"  path="+path+'  base="+base );

		
//		pano_tn = pano_img;
//		pano_id = pano_img;
//		alert( "BUGS_1441 len="+psv_len+"  psv="+pnlist_psv[psv_len-1] );

// 		img.src = '/pn/imgs/pano_falls.jpg';
// 		img.src = '/pn/imgs/pano_jtf_sky.jpg';
// 		img.src = '/pn/imgs/pano_falls1_4000.jpg';
// 		img.src = '/pn/imgs/pano_falls_north.jpg';
//		alert( "BUGS_1420 idx="+idx+" psv_len="+psv_len+"  pano_img="+pano_img+" url_search="+url_search );

		img.src = pano_img;
//		alert( "BUGS_1421 idx="+idx+"  pano_img="+pano_img );

//		img.src = pnlist_psv[idx].split("|")[13];
// 		img.src = '/pn/imgs/pano_falls_south.jpg';
// 		img.src = '/pn/imgs/pano_jtf_entrance.jpg';
// 		img.src = '/pn/imgs/pano_courtyard1_12b.jpg';		

//		var idx=4;
//		alert( "BUGS_100 url.search="+url.search );
		if( url.search != "" ) {
			var urlarg_q = url.search.split('&')[0];
			var urlarg_id = url.search.split('&')[1];
			var urlarg_pnid = url.search.split('&')[2];
			var id = urlarg_id.split('=')[1];
			}

//		alert( "BUGS_1488 urlarg_id="+urlarg_id );
//		alert( "BUGS_1489 id="+id );
//		var filnam_psv =	pnlist_psv[id].split('|')[ pnlist_psv[id].split('|').length -1 ];
//		script_pnlist();


		var pano_img = pnlist_psv[idx].split("|")[12];
//		alert( "BUGS_1444 idx="+idx+" url_search="+url.search );
		img.src = pano_img;
//		alert( "BUGS_1445 idx="+idx+" pano_img="+pano_img );

//		img.src = '/pn/imgs/pano_falls1_4000.jpg';		
//		img.src = pnlist_psv[idx].split("|")[12];
//		img.src = pnlist[id];
//		img.src = pnlist_psv[id];
//		img.src = filnam;
//		img.src = pnlist_psv[id].split('|')[ pnlist_psv[id].split('|').length -1 ];


function init_pano(canvasid){
//get canvas and set up call backs
	pano_canvas = document.getElementById('canvas');
	pano_canvas.onmousedown = mouseDown;
	window.onmousemove = mouseMove;
	window.onmouseup = mouseUp;
	window.onmousewheel = mouseScroll;
	window.onkeydown = keyDown;
	draw();

//	setInterval(draw, 1000/FPS);
	}
	
function imageLoaded(){
	var   buffer = document.createElement("canvas");
	var   buffer_ctx = buffer.getContext ("2d");
	
	//set buffer size
	buffer.width = img.width;
	buffer.height = img.height;
 	
 	//draw image
	buffer_ctx.drawImage(img,0,0);
 		
 	//get pixels
 	var buffer_imgdata = buffer_ctx.getImageData(0, 0,buffer.width,buffer.height);
 	var buffer_pixels = buffer_imgdata.data;
 		
 	//convert imgdata to float image buffer
 	img_buffer = new Array(img.width*img.height*3);
 	for(var i=0,j=0;i<buffer_pixels.length;i+=4, j+=3){
		img_buffer[j] 	= buffer_pixels[i];
		img_buffer[j+1] = buffer_pixels[i+1];
		img_buffer[j+2] = buffer_pixels[i+2];
 		}
	}


function mouseDown(e){
	mouseIsDown=true;
	mouseDownPosLastX=e.clientX;
	mouseDownPosLastY=e.clientY;	
}

function mouseMove(e){
	if(mouseIsDown==true){
		cam_heading-=(e.clientX-mouseDownPosLastX);
		cam_pitch+=0.5*(e.clientY-mouseDownPosLastY);
		cam_pitch=Math.min(180,Math.max(0,cam_pitch));
		mouseDownPosLastX=e.clientX;
		mouseDownPosLastY=e.clientY;	
		draw();
		}
}

function mouseUp(e){
	mouseIsDown=false;
	draw();
}

function mouseScroll(e){
	cam_fov+=e.wheelDelta/120;
	cam_fov=Math.min(90,Math.max(30,cam_fov));
	draw();
}

function keyDown(e){
	if(e.keyCode==73){	//i==73 Info
		displayInfo = !displayInfo;
		draw();
		}
}

function renderPanorama(canvas){
	if(canvas!=null && img_buffer!=null){
		var ctx = canvas.getContext("2d");
		var imgdata = ctx.getImageData(0, 0,canvas.width,canvas.height);
		var pixels = imgdata.data;
	
		var src_width=img.width;
		var src_height=img.height;
		var dest_width=canvas.width;
		var dest_height=canvas.height;
		
		//calculate camera plane
		var theta_fac=src_height/Math.PI;
		var phi_fac=src_width*0.5/Math.PI
		var ratioUp=2.0*Math.tan(cam_fov*DEG2RAD/2.0);
		var ratioRight=ratioUp*1.33;
		var camDirX=Math.sin(cam_pitch*DEG2RAD)*Math.sin(cam_heading*DEG2RAD);
		var camDirY=Math.cos(cam_pitch*DEG2RAD);
		var camDirZ=Math.sin(cam_pitch*DEG2RAD)*Math.cos(cam_heading*DEG2RAD);
		var camUpX=ratioUp*Math.sin((cam_pitch-90.0)*DEG2RAD)*Math.sin(cam_heading*DEG2RAD);
		var camUpY=ratioUp*Math.cos((cam_pitch-90.0)*DEG2RAD);
		var camUpZ=ratioUp*Math.sin((cam_pitch-90.0)*DEG2RAD)*Math.cos(cam_heading*DEG2RAD);
		var camRightX=ratioRight*Math.sin((cam_heading-90.0)*DEG2RAD);
		var camRightY=0.0;
		var camRightZ=ratioRight*Math.cos((cam_heading-90.0)*DEG2RAD);
		var camPlaneOriginX=camDirX + 0.5*camUpX - 0.5*camRightX;
		var camPlaneOriginY=camDirY + 0.5*camUpY - 0.5*camRightY;
		var camPlaneOriginZ=camDirZ + 0.5*camUpZ - 0.5*camRightZ;
		
		//render image
		var	i,j;
		for(i=0;i<dest_height;i++){
			for(j=0;j<dest_width;j++){
				var	fx=j/dest_width;
				var	fy=i/dest_height;
				
				var	rayX=camPlaneOriginX + fx*camRightX - fy*camUpX;
				var	rayY=camPlaneOriginY + fx*camRightY - fy*camUpY;
				var	rayZ=camPlaneOriginZ + fx*camRightZ - fy*camUpZ;
				var	rayNorm=1.0/Math.sqrt(rayX*rayX + rayY*rayY + rayZ*rayZ);
				
				var	theta=Math.acos(rayY*rayNorm);
    			var	phi=Math.atan2(rayZ,rayX) + Math.PI;
    			var	theta_i=Math.floor(theta_fac*theta);
    			var	phi_i=Math.floor(phi_fac*phi);
    			
    			var	dest_offset=4*(i*dest_width+j);
				var	src_offset=3*(theta_i*src_width + phi_i);
				
				pixels[dest_offset]     = img_buffer[src_offset];
				pixels[dest_offset+1]   = img_buffer[src_offset+1];
				pixels[dest_offset+2]   = img_buffer[src_offset+2];
				//pixels[dest_offset+3] = img_buffer[src_offset+3];
				}
			}
 		
 		//upload image data
 		ctx.putImageData(imgdata, 0, 0);
	}
}


function drawRoundedRect(ctx,ox,oy,w,h,radius){
	ctx.beginPath();
	ctx.moveTo(ox + radius,oy);
	ctx.lineTo(ox + w - radius,oy);
	ctx.arc(ox +w-radius,oy+ radius, radius,-Math.PI/2,0, false);
	ctx.lineTo(ox + w,oy + h - radius);
	ctx.arc(ox +w-radius,oy + h - radius, radius,0,Math.PI/2, false);
	ctx.lineTo(ox + radius,oy + h);
	ctx.arc(ox + radius,oy + h - radius, radius,Math.PI/2,Math.PI, false);
	ctx.lineTo(ox,oy + radius);
	ctx.arc(ox + radius,oy + radius, radius,Math.PI,3*Math.PI/2, false);
	ctx.fill();	
}


function draw(){
    if(pano_canvas!=null && pano_canvas.getContext!=null){
    	var ctx = pano_canvas.getContext("2d");
    	
    	//clear canvas
    	ctx.fillStyle = "rgba(0, 0, 0, 1)";
    	ctx.fillRect(0,0,pano_canvas.width,pano_canvas.height);
			
		//render paromana direct
		var startTime = new Date();
			renderPanorama(pano_canvas);
		var endTime = new Date();
		
		//draw info text
		if(displayInfo==true){	
			ctx.fillStyle = "rgba(255,255,255,0.75)";
			drawRoundedRect(ctx,20,pano_canvas.height-60-20,180,60,7);
			
			ctx.fillStyle = "rgba(0, 0, 0, 1)";
			ctx.font="10pt helvetica";
			ctx.fillText("Canvas = " +  pano_canvas.width + "x" + pano_canvas.height,30,pano_canvas.height-60);
			ctx.fillText("Image size = " + img.width + "x" + img.height,30,pano_canvas.height-45);
			ctx.fillText("FPS = " + (1000.0/(endTime.getTime()-startTime.getTime())).toFixed(1),30,pano_canvas.height-30);
			}
    	}
   }
   
     


		</script>


	<div align="center"> <br>		
		<br>		
		<h1>panorama viewer</h1>		</div>


	<div id="canvas_pn" align="center">
		<br>
		<br>
<!--		<canvas id="canvas" width="640" height="480"> -->
		<canvas id="canvas" width="1000" height="600">
        		<p>unauthorized access logged</p>			
			</canvas> 

		<br>
		======== pano ========
		</div>


	<br><br><br><br>
	<hr color=white>
	<hr color=black>
	<button type="button" onclick="script_pnlist()">script_pnlist</button>
	<hr color=black>
	<hr color=white>
	<br><br><br><br>

	<div id="div_pnlist">
		<h2>div_pnlist</h2>
		</div>
<!--
	<div id="div_addchild_pn" >
		<h1>div_addchild_pn</h1>
		addchild_pn <br>
		</div>
	-->



	<div style="padding:50px;" align="left">

<!--      
		<h2>Description</h2>      Experimental HTML5 panorama viewer using the new HTLM5 canvas element.      This script displays equirectangular (360x180) panoramas. So just one      image is necessary to display a complete 360x180 panorama.      <h2>Purpose</h2>      I mainly was curious how fast equirectangular panorama image can be      displayed with a HTML5 canvas. So the script isn't cleaned up very well,      but it gave me at least an idea that it is possible. On my an Intel Core      i7 CPU I get more than 20 frames per second. That is of course not very      fast but usable. And the best of all it doesn't require any Plug-Ins :)      <h2>Navigation</h2>      <ul>        <li>Left/Right Mouse drag: Changes camera heading. </li>        <li>Up/Sown Mouse drag: Changes camera pitch. </li>        <li>Scroll wheel: Changes camera field of view. </li>        <li>I-Key: Displays Info panel with canvas size, image size and FPS. </li>      </ul>      <h2>Requirements</h2>      I've tested this HTML5 panorama script with the latest versions of Safari,      Firefox and Chrome on Mac OS X. But it should also run on other platforms      supporting HTML5. <br>      <br>      <h2>License</h2>      The html5pano.js script is released under the Simplified BSD License.      Please see comments within the script.<br>      <br>      <h2>Dowload</h2>      Please use the following link to download the script including a sample      panorama image. <br>      <br>      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;      &nbsp;&nbsp;&nbsp; <a href="http://www.cheetah3d.com/download/HTML5pano/HTML5pano.zip">http://www.cheetah3d.com/download/HTML5pano/HTML5pano.zip</a><br>      <br>      <br>      <br>      <br>

		<a href="http://cheetah3d.com">17.Aug.2010, Martin Wengenmayer</a> 
	-->
		</div>



	<label for="input_pano">pano: </label>
	<input id="input_pano" list="panos" name="panos" type="text" />
		<datalist id="panos">
			<option value="1-pano">
			<option value="2-pano_closeline">
			<option value="3-pano_courtyard1">
			<option value="4-pano_courtyard1_12b">
			<option value="5-pano_courtyard1a">
			<option value="6-pano_courtyard2">
			<option value="7-pano_creek">
			<option value="8-pano_creek5">
			<option value="9-pano_falls">
			<option value="10-pano_falls1_4000">
			<option value="11-pano_falls_015-285">
			<option value="12-pano_falls_north">
			<option value="13-pano_falls_south">
			<option value="14-pano_jtf_entrance">
			<option value="15-pano_jtf_entrance_jtf">
			<option value="16-pano_jtf_sky">
			<option value="17-sphere">
			<option value="18-veneer">
			<option value="19-yard">
			<option value="jakwii3">
			<option value="timejack">
			<option value="pano">
			<option value="courtyard">
			<option value="closeline">
			<option value="jkwii">
			<option value="jakwii1">
			<option value="jakwii2">
			<option value="skwii">
			</datalist>

	&nbsp &nbsp &nbsp &nbsp

	<label for="input_choctype">chocolates</label>
		<input id="input_choctype" list="choctypes" type="text">
		<datalist id="choctypes">
			<option value="white" />
			<option value="milk" />
			<option value="dark" />
			<option value="semisweet" />
			<option value="herseys" />
			</datalist>


	<hr color=black>
	<hr color=white>


	<div id="div_show_pn-imgs-jpg" hidden >
		<a href=index_vu.html?q=pn&idx=0 id="0-pano-.jpg" target=_blank >
			<img name="pano" src=/pn/imgs/tn/tn_pano.png border=0>
			</a>

		<a href=?q=pn&idx=2-pano_closeline-.jpg id="2-pano_closeline-.jpg" target=_blank >
			<img name="pano" src=/pn/imgs/tn/tn_pano_closeline.png border=0>
			</a>

		<a href=?q=pn&idx=3-pano_courtyard1-.jpg id="3-pano_courtyard1-.jpg" target=_blank >
			<img name="pano" src=/pn/imgs/tn/tn_pano_courtyard1.png border=0>
			</a>

		</div>
			

	<hr color=white>
	<hr color=black>

	<button type="button" onclick="script_pnlist();return false">script_pnlist</button>
<!--
	<button type="button" onclick="addChild_pn()">addChild_pn</button>
	<button type="button" onclick="addChild()">addChild</button>
	-->


	<hr color=black>
	<hr color=white>

	<script > function imgWindow() {window.open("image") } </script>

	
	<img src="/imgs/btn/koeye.png" height="50" size="150" alt="koeye" onclick="script_pnlist()"> 
	<img src="/imgs/btn/koeyeb.png" height="50" size="150" alt="koeyeb" onclick="addChild_pn()"> 
	<img src="/imgs/btn/koeyew.png" height="50" size="150" alt="koeyew" onclick="addChild()"> 

		<script id="script_pnlist" >
//			function script_pnlist_hover() {body { background-color: blue; }}

//			var pnlist_psv = new Array();
			function script_pnlist_psv_load() {
				var j=0;

				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||558953|Jun|6|21:56|2018|/pn/imgs/pano_creek5.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||4100818|Dec|7||2008|/pn/imgs/pano_burmuda.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||18936775|Apr|6|1:25|2018|/pn/imgs/PIA22313_pano.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1892489|Mar|27|11:50|2018|/pn/imgs/Sol83-PremiersGivres-pano.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||49100075|Feb|10|13:13|2018|/pn/imgs/Taipo_pano.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1920795|Nov|23||2017|/pn/imgs/Opportunity-Mars-Rover-Lander-pia19112.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||17090384|Nov|23||2017|/pn/imgs/mars-rover-opportunity-pia19111_Sol3902B_Cape_Tribulation_L2R2ana.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||20422151|Nov|23||2017|/pn/imgs/mars-rover-opportunity-pia19110_Sol3902B_Cape_Tribulation_L257F.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||18009851|Jul|17||2017|/pn/imgs/mars-gale-crater-panorama-pia11241-full.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1869852|Jan|21||2017|/pn/imgs/opportunity-panorama-warton-ridge-enhanced-pia20850-full.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||13323398|Jan|21||2017|/pn/imgs/mars-panoramic-mt-sharp-rover-curiosity-pia19662.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||595490|Sep|28||2009|/pn/imgs/pano_jtf_entrance_jtf.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||726437|Jun|7||2008|/pn/imgs/pano_jtf_entrance.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1031370|Jun|1||2007|/pn/imgs/pano_fork_grass.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||583043|Jun|1||2007|/pn/imgs/pano_jtfarms_entrance_9700x100.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||559318|Jun|1||2007|/pn/imgs/pano_backyard_all.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||249208|Jun|1||2007|/pn/imgs/pano_jtfarms_enter_hi.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||316986|May|13||2007|/pn/imgs/pano_falls.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||1046328|May|13||2007|/pn/imgs/pano_falls1_4000.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||282735|May|13||2007|/pn/imgs/pano_courtyard2.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||127540|May|13||2007|/pn/imgs/pano_courtyard1.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||171929|May|12||2007|/pn/imgs/pano_closeline.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||470566|May|12||2007|/pn/imgs/pano_falls_south.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||386103|May|12||2007|/pn/imgs/pano_falls_north.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||992548|May|12||2007|/pn/imgs/pano_falls_015-285.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||505577|May|11||2007|/pn/imgs/pano_creek.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||100790|May|10||2007|/pn/imgs/yard.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||154451|May|10||2007|/pn/imgs/veneer.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||81569|May|10||2007|/pn/imgs/sphere.jpg";
				pnlist_psv[j++] = "-rw-r--r--||1|konet||staff||80726|May|10||2007|/pn/imgs/pano.jpg"		;
				return( pnlist_psv );
				}


//			var pnlist = new Array();
			function script_pnlist_load() {
				var z=0;
<!--
	-->

//				z--;
//				alert( "BUGS_load pnlist("+z+")="+pnlist[z] + " len="+pnlist.length );
//				document.write( "pnlist_lost pnlist_length="+pnlist.length+" z="+z );
					return(pnlist);
					}

			function script_pnlist_show() {
				var z = 0; var pnout=""; var len=pnlist.length;
				var pnid = ""; var pnurl = ""; 
				var pnlist_psv = script_pnlist_psv_load();
//				var pnlist_csv = script_pnlist_csv_load();
				var len_psv = pnlist_psv.length;
//				var len_csv = pnlist_csv.length;
				var nf = 0;
//				alert( "bugs_1924 script_pnlist_show IN len_psv="+len_psv );
//				alert( "BUGS_1925 pnlist_psv10="+pnlist_psv[10] );
//				alert( "BUGS_1925 pnlist_psv30="+pnlist_psv[30] );
//				alert( "bugs_1764 script_pnlist_show IN len_csv="+len_csv );
				var pano_img = "";
				var pano_tn = "";
				var pano_id = "";
				var idx = 0;


//				for( z=0; z< pnlist.length; z++ ) {
				for( z=0; z< pnlist_psv.length; z++ ) {
					pano_img = pnlist_psv[z].split("|")[12];
//					alert( "BUGS_1953 z="+z+" pnlist_psv="+pnlist_psv[z] );

					var basename = pano_img.replace(/^.*[\\\/]/, '');
					var basepath = pano_img.replace( basename, "" );
					var pnid = pano_img;
					pnid = pnid.replace( '/',"-" );
					pnid = pnid.replace(/.jpg/,"" );
					pnid = pnid.replace(/^-/,"" );
					pano_tn = basepath+"tn/tn_"+basename;
//					pano_tn = pano_tn.replace( ".jpg", ".png" );
//					alert( "BUGS_1900 pano_tn="+pano_tn+"  idx="+z );

					nf = pnlist_psv[z].split('|').length -1;
//					alert( "BUGS_1960 z="+z+" nf="+nf+" pano_img="+pano_img );
//					alert( "BUGS_1961 z="+z+" nf="+nf+" basename="+basename );
//					alert( "BUGS_1962 z="+z+" nf="+nf+" basepath="+basepath );
//					alert( "BUGS_1945 z="+z+" nf="+nf+" pano_tn="+pano_tn );
//					alert( "BUGS_1945 z="+z+" nf="+nf+" pnid="+pnid );

//					pnout += "<h1><b>pnlist_"+z+"</b><h1>";
					pnout += "<a href='/index_vu.html?q=pn&idx="+z+"&pnid="+pnid+"' target=_blank>";
					pnout += "	<img name='" + pnid + "' src='"+pano_tn+"' border=0 height=100 >\n";
					pnout += "	</a>";
					pnout += "<a href='/index_vu.html?q=img&idx="+z+"&pnid="+pnid+"' target=_blank>";
					pnout += "	<img name='" + pano_tn + "' height=25 src='"+pano_tn+"' border=0 height=100 >\n";
					pnout += "	</a>";
//					alert( "bugs_1923 pano_img=" + pano_img );
					}
//				document.write( "bugs435 pnout=" + pnout );
//				alert( "BUGS432_show pnlist("+len+")="+pnlist[z] + " len="+pnlist.length );
//	 			document.getElementById('div_pnlist').innerHTML += pnout;
				var parent = document.getElementById('div_pnlist');
				parent.insertAdjacentHTML('beforeend', pnout);
				}

			function script_pnlist() {
				script_pnlist_load();
				script_pnlist_psv_load();
				script_pnlist_tn_load();
//				alert( "bugs_1840: script_pnlist len="+pnlist.length );
//				alert( "bugs_1841: script_pnlist_psv len="+pnlist_psv.length );
//				alert( "bugs_1842: script_pnlist_tn len="+pnlist_tn.length );
				script_pnlist_show();
				}
			function script_pn_view( idx ) {
				alert( "BUGS_1890 script_pn_view idx="+idx );
				document.write( "script_pn_view idx="+idx );
				}
			</script>

	<script id='script_load_pnlist_tn' >
//		var pnlist_tn = new array();
		function script_pnlist_tn_load() {
			var j=0;
			return(pnlist_tn);
			}
//		pnlist_tn = script_pnlist_tn_load();
	</script>

<!--<title>index_yt.html 20180531_1200</title> -->
<!-- <link rel="stylesheet" href="/weblog/weblog_css"> -->
<!-- <script src="/ytembed.js"></script> -->
<script src="data:/text/plain;base64,PCEtLQ0KDQovKiBTb3VyY2U6IGh0dHA6Ly95dm9zY2hhYXAuY29tICovDQovKiBCdWlsZCBmaXJzdCBpbiAnMDYgKi8NCi8qIDEvNC8yMDE1OiB1cGdyYWRlZCB0byBZb3VUdWJlIEFQSSB2MyAqLw0KLyogNi81LzIwMTU6IGFkZGVkIGJhY2sgdmlld3MgYW5kIGR1cmF0aW9uICAqLw0KDQpGdW5jdGlvbi5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uKG9iaiwgYXJncykgew0KICAgIHZhciBtZXRob2QgPSB0aGlzLA0KICAgICAgICB0ZW1wID0gZnVuY3Rpb24oKSB7DQogICAgICAgICAgICByZXR1cm4gbWV0aG9kLmNhbGwob2JqLCBhcmdzKTsNCiAgICAgICAgfTsNCg0KICAgIHJldHVybiB0ZW1wOw0KfQ0KDQp2YXIgeXRFbWJlZCA9IHsNCg0KICAgIHl0UXVlcnk6IDAsDQogICAgY2w6IDAsDQogICAgY2FsbGJhY2s6IHt9LA0KICAgIGNmZzoge30sDQogICAgcGxheWVyOiBmYWxzZSwNCg0KICAgIC8qKg0KICAgICAqIE1haW4gSW5pdCBNZXRob2QNCiAgICAgKi8NCiAgICBpbml0OiBmdW5jdGlvbihjZmcpIHsNCg0KICAgICAgICB0aGlzLmNmZyA9IGNmZyB8fCB7fTsNCg0KICAgICAgICAvLyB0ZW1wIGhhcmRjb2RlIG91ciBvd24ga2V5IGlmIG5vdCBwcm92aWRlZA0KICAgICAgICBpZiAoIXRoaXMuY2ZnLmtleSkgew0KICAgICAgICAgICAgICAgIHRoaXMuY2ZnLmtleSA9ICdBSXphU3lBOE9tS2N3MkRNTmtKaWN5Q0owdnF2ZjkweGdlSDUyekUnOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCF0aGlzLmNmZy5ibG9jaykgew0KICAgICAgICAgICAgdGhpcy5tZXNzYWdlKCdQbGVhc2Ugc2V0IHRoZSBibG9jayBlbGVtZW50IGluIHRoZSBjb25maWcgZmlsZS4nKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5jZmcudHlwZSkgew0KICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSgnWW91IG11c3QgcHJvdmlkZSBhIHR5cGU6IHNlYXJjaCwgdXNlciwgcGxheWxpc3QsIGZlYXR1cmVkIGluIHRoZSBpbnNlcnRWaWRlb3MgZnVuY3Rpb24uJyk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmNmZy5xICYmICF0aGlzLmNmZy5pZCkgew0KICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSgnWW91IG11c3QgcHJvdmlkZSBhIHF1ZXJ5OiBzZWFyY2gga2V5d29yZHMsIHBsYXlsaXN0IElELCBvciB1c2VybmFtZS4nKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuY2ZnLmtleSkgew0KICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSgnTmV3OiBZb3UgbXVzdCBwcm92aWRlIGEgR29vZ2xlIERldmVsb3BlciBBUEkga2V5OiA8c3Ryb25nPjxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3lvdXR1YmUvcmVnaXN0ZXJpbmdfYW5fYXBwbGljYXRpb24iPmdldCBrZXk8L2E+PC9zdHJvbmc+LicpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAvL3RoaXMubWVzc2FnZSgnTG9hZGluZyBZb3VUdWJlIHZpZGVvcy4gUGxlYXNlIHdhaXQuLi4nKTsNCg0KICAgICAgICAgICAgICAgIC8vY3JlYXRlIGEgamF2YXNjcmlwdCBlbGVtZW50IHRoYXQgcmV0dXJucyBvdXIgSlNPTnAgZGF0YS4NCiAgICAgICAgICAgICAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7DQogICAgICAgICAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTsNCg0KICAgICAgICAgICAgICAgIC8vYSBjb3VudGVyDQogICAgICAgICAgICAgICAgdGhpcy55dFF1ZXJ5Kys7DQoNCiAgICAgICAgICAgICAgICAvL3NldHRpbmdzDQoNCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2ZnLnBhZ2luZykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNmZy5wYWdpbmcgPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2ZnLnJlc3VsdHMpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZmcucmVzdWx0cyA9IDEwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2ZnLm1ldGEpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZmcubWV0YSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5jZmcub3JkZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy9kZXByZWNhdGVkIGluIHYzDQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2ZnLm9yZGVyYnkgPSAncmVsZXZhbmNlJzsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZmcuc29ydG9yZGVyID0gJ2Rlc2NlbmRpbmcnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2ZnLnRodW1ibmFpbCkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNmZy50aHVtYm5haWwgPSAyMDA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5jZmcuaGVpZ2h0KSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2ZnLmhlaWdodCA9IDM5MDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNmZy53aWR0aCkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNmZy53aWR0aCA9IDY0MDsNCiAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jZmcub3JkZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAibmV3X2ZpcnN0IjoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2ZnLm9yZGVyYnkgPSAnZGF0ZSc7DQogICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMuY2ZnLnNvcnRvcmRlciA9ICdhc2NlbmRpbmcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAiaGlnaGVzdF9yYXRpbmciOg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZmcub3JkZXJieSA9ICdyYXRpbmcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLmNmZy5zb3J0b3JkZXIgPSAnZGVzY2VuZGluZyc7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJtb3N0X3JlbGV2YW5jZSI6DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNmZy5vcmRlcmJ5ID0gJ3JlbGV2YW5jZSc7DQogICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMuY2ZnLnNvcnRvcmRlciA9ICdkZXNjZW5kaW5nJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YXIgdXJsID0gImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tIjsNCg0KICAgICAgICAgICAgICAgIC8vd2hhdCBkYXRhIGRvIHdlIG5lZWQ6IGEgc2VhcmNoLCBhIHVzZXIgc2VhcmNoLCBhIHBsYXlsaXN0DQogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmNmZy50eXBlKSB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgInNlYXJjaCI6DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy95b3V0dWJlL3YzL3NlYXJjaD9xPScgKyB0aGlzLmNmZy5xICsgJyZ0eXBlPXZpZGVvJmNhbGxiYWNrPXl0RW1iZWQuY2FsbGJhY2tbJyArIHRoaXMueXRRdWVyeSArICddJm9yZGVyPScgKyB0aGlzLmNmZy5vcmRlcmJ5Ow0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAidXNlciI6DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy95b3V0dWJlL3YzL2NoYW5uZWxzP2ZvclVzZXJuYW1lPScgKyB0aGlzLmNmZy5xICsgJyZjYWxsYmFjaz15dEVtYmVkLmNhbGxiYWNrWycgKyB0aGlzLnl0UXVlcnkgKyAnXSc7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJwbGF5bGlzdCI6DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy95b3V0dWJlL3YzL3BsYXlsaXN0SXRlbXM/cGxheWxpc3RJZD0nICsgdGhpcy5jZmcucSArICcmY2FsbGJhY2s9eXRFbWJlZC5jYWxsYmFja1snICsgdGhpcy55dFF1ZXJ5ICsgJ10mb3JkZXI9JyArIHRoaXMuY2ZnLm9yZGVyYnk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJ2aWRlb3MiOg0KICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcveW91dHViZS92My92aWRlb3M/aWQ9JyArIHRoaXMuY2ZnLnEgKyAnJmNhbGxiYWNrPXl0RW1iZWQuY2FsbGJhY2tbJyArIHRoaXMueXRRdWVyeSArICddJm9yZGVyPScgKyB0aGlzLmNmZy5vcmRlcmJ5Ow0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZmVhdHVyZWQiOg0KICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcveW91dHViZS92My92aWRlb3M/Y2hhcnQ9bW9zdFBvcHVsYXImY2FsbGJhY2s9eXRFbWJlZC5jYWxsYmFja1snICsgdGhpcy55dFF1ZXJ5ICsgJ10nOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAiY2hhbm5lbCI6DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy95b3V0dWJlL3YzL2NoYW5uZWxzP2lkPScgKyB0aGlzLmNmZy5xICsgJyZjYWxsYmFjaz15dEVtYmVkLmNhbGxiYWNrWycgKyB0aGlzLnl0UXVlcnkgKyAnXSc7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlKCdVbmtub3duIHNldHRpbmcgdHlwZS4gVXNlOiBzZWFyY2gsIHBsYXlsaXN0IG9yIHVzZXIuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcudHlwZSA9PSAidXNlciJ8fHRoaXMuY2ZnLnR5cGUgPT0gImNoYW5uZWwiKSB7DQogICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnBhcnQ9Y29udGVudERldGFpbHMnOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jZmcudHlwZSA9PSAic2VhcmNoIiAmJiB0aGlzLmNmZy5tZXRhKSB7DQogICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnBhcnQ9aWQnOyAvL25vdGUgcGFydD1pZCBkb2VzbnQgd29yayBmb3IgcGxheWxpc3QuIGdldCBsaXN0IC92aWRlb3Mgd2l0aCBtZXRhZGF0YQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jZmcudHlwZSA9PSAic2VhcmNoIikgew0KICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwYXJ0PXNuaXBwZXQnOyAvL29ubHkgdGhpbmcgaXQgcmV0dXJucw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jZmcudHlwZSA9PSAidmlkZW9zIikgew0KICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwYXJ0PXNuaXBwZXQsY29udGVudERldGFpbHMsc3RhdGlzdGljcyc7IC8vYWxsIGRldGFpbHMNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwYXJ0PXNuaXBwZXQsY29udGVudERldGFpbHMnOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmNmZy50eXBlID09ICJ1c2VyInx8dGhpcy5jZmcudHlwZSA9PSAiY2hhbm5lbCIpIHsNCiAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmbWF4UmVzdWx0cz0xJzsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2ZnLnJlc3VsdHMpIHsNCiAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmbWF4UmVzdWx0cz0nICsgdGhpcy5jZmcucmVzdWx0czsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcucGFnZVRva2VuKSB7DQogICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnBhZ2VUb2tlbj0nICsgdGhpcy5jZmcucGFnZVRva2VuOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHVybCArPSAnJmtleT0nICsgdGhpcy5jZmcua2V5Ow0KICAgICAgICAgICAgICAgIHVybCArPSAnJnByZXR0eVByaW50PWZhbHNlJzsNCg0KICAgICAgICAgICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3NyYycsIHVybCk7DQoNCg0KICAgICAgICAgICAgICAgIGNmZy5tQyA9IHRoaXMueXRRdWVyeTsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcudHlwZSA9PSAidXNlciJ8fHRoaXMuY2ZnLnR5cGUgPT0gImNoYW5uZWwiKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tbdGhpcy55dFF1ZXJ5XSA9IGZ1bmN0aW9uKGpzb24pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBmaXJzdCByZXN1bHQgZm9yIHVzZXJuYW1lLCBhbmQgY3JlYXRlIGEgY2hhbm5lbElkIHJlcXVlc3QNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc29uLnBhZ2VJbmZvLnRvdGFsUmVzdWx0cyA9PSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBsYXlsaXN0SWQgPSBqc29uLml0ZW1zWzBdLmNvbnRlbnREZXRhaWxzLnJlbGF0ZWRQbGF5bGlzdHMudXBsb2FkczsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmcudHlwZSA9ICdwbGF5bGlzdCc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLnEgPSBwbGF5bGlzdElkOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl0RW1iZWQuaW5pdChjZmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dEVtYmVkLm1lc3NhZ2UoJ0NhblwndCBmaW5kIHRoaXMgdXNlciBkZWZpbmVkIGluIHEnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuY2ZnLnR5cGUgPT0gInBsYXlsaXN0IiB8fCB0aGlzLmNmZy50eXBlID09ICJzZWFyY2giKSAmJiB0aGlzLmNmZy5tZXRhKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tbdGhpcy55dFF1ZXJ5XSA9IGZ1bmN0aW9uKGpzb24pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IG1ldGEgZGF0YSBvZiBwbGF5bGlzdCB2aWRlb3MNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAvL2dyYWIgSURzIG9mIHBsYXlsaXN0LiAvcGxheWxpc3QgbmVlZHMgZXh0cmFjdCBpZCBmcm9tIHNuaXBwZXQsIGVsc2UgZGVmYXVsdCBvbiBpZA0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24uaXRlbXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWRzID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBqc29uLml0ZW1zLmxlbmd0aDsgaSsrKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24uaXRlbXNbaV0uc25pcHBldCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzICs9IGpzb24uaXRlbXNbaV0uc25pcHBldC5yZXNvdXJjZUlkLnZpZGVvSWQgKyAiLCI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoanNvbi5pdGVtc1tpXS5pZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzICs9IGpzb24uaXRlbXNbaV0uaWQudmlkZW9JZCArICIsIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXF1ZXN0IHZpZGVvIGRldGFpbHMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmcudHlwZSA9ICd2aWRlb3MnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy5xID0gaWRzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl0RW1iZWQuaW5pdChjZmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dEVtYmVkLm1lc3NhZ2UoJ0FuIGVycm9yIG9jY3VyZWQ6PGJyPicgKyBqc29uLmVycm9yLm1lc3NhZ2UpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFja1t0aGlzLnl0UXVlcnldID0gZnVuY3Rpb24oanNvbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgeXRFbWJlZC5saXN0VmlkZW9zKGpzb24sIGNmZyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgIC8vYXR0YWNoIHNjcmlwdCB0byBwYWdlLCB0aGlzIHdpbGwgbG9hZCB0aGUgZGF0YSBpbnRvIG91ciBwYWdlIGFuZCBjYWxsIHRoZSBmdW50aW9uIHl0SW5pdFt5dFF1ZXJ5XQ0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgfSwNCg0KDQogICAgLyoqDQogICAgICogQnVpbGQgdmlkZW9zIChzdGF0aWMpDQogICAgICovDQogICAgbGlzdFZpZGVvczogZnVuY3Rpb24oanNvbiwgY2ZnKSB7DQogICAgICAgIHRoaXMuY2ZnID0gY2ZnOw0KICAgICAgICBpZiAoIXRoaXMuY2ZnLnBsYXllcikgew0KICAgICAgICAgICAgdGhpcy5jZmcucGxheWVyID0gJ2VtYmVkJzsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIXRoaXMuY2ZnLmxheW91dCkgew0KICAgICAgICAgICAgdGhpcy5jZmcubGF5b3V0ID0gJ2Z1bGwnOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuY2ZnLmJsb2NrKTsNCg0KICAgICAgICB2YXIgY2hpbGRyZW4gPSBkaXYuY2hpbGROb2RlczsNCiAgICAgICAgZm9yICh2YXIgaSA9IGNoaWxkcmVuLmxlbmd0aDsgaSA+IC0xOyBpLS0pIHsNCiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXSAmJiAoY2hpbGRyZW5baV0uY2xhc3NOYW1lLmluZGV4T2YoImVycm9yIikgIT09IC0xIHx8IGNoaWxkcmVuW2ldLnRhZ05hbWUgPT09ICJVTCIpKSB7IC8qIGlzIGVycm9yIG1lc3NhZ2Ugb3IgcmVzdWx0IGxpc3QgKi8NCiAgICAgICAgICAgICAgICBkaXYucmVtb3ZlQ2hpbGQoY2hpbGRyZW5baV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCg0KICAgICAgICAvL2Rpdi5pbm5lckhUTUwgPSAnJzsgLy9jbGVhciB1bA0KICAgICAgICBpZiAoanNvbi5lcnJvcikgew0KICAgICAgICAgICAgdGhpcy5tZXNzYWdlKCdBbiBlcnJvciBvY2N1cmVkOjxicj4nICsganNvbi5lcnJvci5tZXNzYWdlKTsNCiAgICAgICAgfSBlbHNlIGlmIChqc29uLml0ZW1zKSB7DQogICAgICAgICAgICB2YXIgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpOw0KICAgICAgICAgICAgdWwuY2xhc3NOYW1lID0gJ3l0bGlzdCc7DQoNCiAgICAgICAgICAgIHZhciBwbGF5bGlzdCA9ICIiOw0KDQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGpzb24uaXRlbXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBqc29uLml0ZW1zW2ldOw0KDQogICAgICAgICAgICAgICAgLy9wbGF5bGlzdCBuZWVkIHRoaXMNCg0KICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zbmlwcGV0ICYmIGVudHJ5LnNuaXBwZXQucmVzb3VyY2VJZCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBlbnRyeS5zbmlwcGV0LnJlc291cmNlSWQudmlkZW9JZDsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LmlkLnZpZGVvSWQpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gZW50cnkuaWQudmlkZW9JZDsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBlbnRyeS5pZDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoaWQpIHsNCiAgICAgICAgICAgICAgICAgICAgcGxheWxpc3QgKz0gaWQgKyAiLCI7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgdmFyIGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsNCg0KICAgICAgICAgICAgICAgIC8vYSBsaW5rIHRvIG91ciBqYXZhc2NyaXB0IG92ZXJsYXkgZnVuY3Rpb24NCiAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCiAgICAgICAgICAgICAgICBhLmNsYXNzTmFtZSA9ICdjbGlwJzsNCg0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmNmZy5wbGF5ZXIgPT0gJ2VtYmVkJykgew0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcucGFyZW50KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvL2Euc2V0QXR0cmlidXRlKCdocmVmJywnIycrdGhpcy5jZmcucGFyZW50KydQbGF5ZXInKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCcjJyt0aGlzLmNmZy5ibG9jaysnUGxheWVyJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYS5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKGEuYWRkRXZlbnRMaXN0ZW5lcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgYS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMucGxheVZpZGVvLmJpbmQodGhpcywgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6IGlkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjZmcnOiBjZmcNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmYWxzZSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYS5hdHRhY2hFdmVudCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgYS5hdHRhY2hFdmVudCgnb25jbGljaycsIHRoaXMucGxheVZpZGVvLmJpbmQodGhpcywgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6IGlkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjZmcnOiBjZmcNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGEuc2V0QXR0cmlidXRlKCdocmVmJywgJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9JyArIGlkKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCiAgICAgICAgICAgICAgICBhLmFwcGVuZENoaWxkKHNwYW4pOw0KICAgICAgICAgICAgICAgIHZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCiAgICAgICAgICAgICAgICBpbWcuc2V0QXR0cmlidXRlKCdzcmMnLCAoZW50cnkuc25pcHBldC50aHVtYm5haWxzID8gZW50cnkuc25pcHBldC50aHVtYm5haWxzLm1lZGl1bS51cmwgOiAnJykpOw0KICAgICAgICAgICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoaW1nKTsNCiAgICAgICAgICAgICAgICB2YXIgZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdlbScpOw0KICAgICAgICAgICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZW0pOw0KDQogICAgICAgICAgICAgICAgLy91cGxvYWRlZA0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmNmZy5sYXlvdXQgPT0gJ3RodW1ibmFpbHMnKSB7DQogICAgICAgICAgICAgICAgICAgIGxpLmNsYXNzTmFtZSA9ICdzbWFsbCc7DQogICAgICAgICAgICAgICAgICAgIGxpLmFwcGVuZENoaWxkKGEpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIC8vdGhpcy5jZmcubGF5b3V0ID0gZnVsbA0KICAgICAgICAgICAgICAgICAgICBsaS5pbm5lckhUTUwgPSAnPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYm9yZGVyPSIwIj48dHI+PHRkIHZhbGlnbj0idG9wIiByb3dzcGFuPSIyIj48L3RkPjx0ZCB2YWxpZ249InRvcCI+PGgzPicgKyBlbnRyeS5zbmlwcGV0LnRpdGxlICsgJzwvaDM+PHNwYW4+JyArIHRoaXMuZm9ybWF0RGVzY3JpcHRpb24oZW50cnkuc25pcHBldC5kZXNjcmlwdGlvbikgKyAnPC9zcGFuPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiBzdHlsZT0id2lkdGg6IDE1MHB4IiBjbGFzcz0ibWV0YSI+PGRpdj4nICsgKGVudHJ5LmNvbnRlbnREZXRhaWxzID8gJ0R1cmF0aW9uOiAnICsgeXRFbWJlZC5mb3JtYXREdXJhdGlvbihlbnRyeS5jb250ZW50RGV0YWlscy5kdXJhdGlvbikgKyAnPGJyPicgOiAnJykgKyAoZW50cnkuc3RhdGlzdGljcyA/ICdWaWV3czogJyArIGVudHJ5LnN0YXRpc3RpY3Mudmlld0NvdW50ICsgJzxicj4nIDogJycpICsgJ0Zyb206IDxhIGhyZWY9Imh0dHA6Ly93d3cueW91dHViZS5jb20vcHJvZmlsZT91c2VyPScgKyBlbnRyeS5zbmlwcGV0LmNoYW5uZWxUaXRsZSArICciPicgKyBlbnRyeS5zbmlwcGV0LmNoYW5uZWxUaXRsZSArICc8L2E+PC9kaXY+PC90ZD48L3RyPjwvdGFibGU+JzsNCiAgICAgICAgICAgICAgICAgICAgbGkuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5hcHBlbmRDaGlsZChhKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdWwuYXBwZW5kQ2hpbGQobGkpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL2ZvciBmaXhlZCB0byBib3R0b20gdmlkZW9zDQogICAgICAgICAgICBpZiAodGhpcy5jZmcucG9zaXRpb24gPT0gImZpeGVkX2JvdHRvbSIpIHsNCiAgICAgICAgICAgICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAiZml4ZWQiOw0KICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5ib3R0b20gPSAnMHB4JzsNCiAgICAgICAgICAgICAgICBkaXYuc3R5bGUubGVmdCA9ICcwcHgnOw0KICAgICAgICAgICAgICAgIC8vZG9jdW1lbnQgYm90dG9tIGFkZCBYIChoZWlnaHQpIHBpeGVscyBtYXJnaW4NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZCh1bCk7DQoNCiAgICAgICAgICAgIC8vcGxheWxpc3QNCiAgICAgICAgICAgIGlmICh0aGlzLmNmZy5wbGF5bGlzdCA9PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgdGhpcy5jZmcucGxheWVyVmFycy5wbGF5bGlzdCA9IHBsYXlsaXN0LnN1YnN0cigwLCBwbGF5bGlzdC5sZW5ndGggLSAxKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHRoaXMuY2ZnLnBsYXllciA9PSAiZW1iZWQiICYmIHRoaXMuY2ZnLmRpc3BsYXlfZmlyc3QgPT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgIC8vc2V0IHNldHRpbmdzDQoNCiAgICAgICAgICAgICAgICB5dFBsYXllclBhcmFtcy52aWRlb0lkID0gaWQ7DQoNCg0KICAgICAgICAgICAgICAgIC8vb3RoZXIgc2V0dGluZ3MNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcucGxheWVyVmFycykgew0KICAgICAgICAgICAgICAgICAgICB5dFBsYXllclBhcmFtcy5wbGF5ZXJWYXJzID0gdGhpcy5jZmcucGxheWVyVmFyczsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB0aGlzLnBsYXllciA9IHRoaXMuY3JlYXRlUGxheWVyKHRoaXMuY2ZnKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHRoaXMuY2ZnLnBhZ2luZyA9PSB0cnVlICYmIGpzb24ubmV4dFBhZ2VUb2tlbikgew0KICAgICAgICAgICAgICAgIHRoaXMuY2ZnLmRpc3BsYXlfZmlyc3QgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB2YXIgcHVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTsNCiAgICAgICAgICAgICAgICBwdWwuc2V0QXR0cmlidXRlKCdpZCcsICd5dFBhZ2UnKTsNCiAgICAgICAgICAgICAgICBpZiAoanNvbi5uZXh0UGFnZVRva2VuKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQogICAgICAgICAgICAgICAgICAgIGEuY2xhc3NOYW1lID0gJ3l0TmV4dCc7DQogICAgICAgICAgICAgICAgICAgIGEuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOw0KDQogICAgICAgICAgICAgICAgICAgIGxpLmFwcGVuZENoaWxkKGEpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoYS5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgeXRFbWJlZC5sb2FkTmV4dC5iaW5kKHRoaXMsIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmc6IGNmZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjoganNvbi5uZXh0UGFnZVRva2VuDQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZmFsc2UpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGEuaW5uZXJIVE1MID0gJ0xvYWQgbmV4dC4uLic7DQogICAgICAgICAgICAgICAgICAgIGxpLmFwcGVuZENoaWxkKGEpOyAvL2RvIHRocm91Z2ggYmluZA0KICAgICAgICAgICAgICAgICAgICBwdWwuYXBwZW5kQ2hpbGQobGkpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChqc29uLnByZXZQYWdlVG9rZW4pIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCiAgICAgICAgICAgICAgICAgICAgYS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3l0UHJldicpOw0KICAgICAgICAgICAgICAgICAgICBhLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJzsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoYS5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgeXRFbWJlZC5sb2FkUHJldmlvdXMuYmluZCh0aGlzLCB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnOiBjZmcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IGpzb24ucHJldlBhZ2VUb2tlbg0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBhLmlubmVySFRNTCA9ICdMb2FkIHByZXZpb3VzLi4uJzsNCiAgICAgICAgICAgICAgICAgICAgbGkuYXBwZW5kQ2hpbGQoYSk7DQogICAgICAgICAgICAgICAgICAgIHB1bC5hcHBlbmRDaGlsZChsaSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHB1bCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMubWVzc2FnZSgnTm8gWW91VHViZSB2aWRlb3MgZm91bmQgZm9yIHlvdXIgcXVlcnk6PGJyPlR5cGU6XCcnICsgdGhpcy5jZmcudHlwZSArICdcJzxicj5RdWVyeTogXCcnICsgdGhpcy5jZmcucSArICdcJycpOw0KICAgICAgICB9DQogICAgfSwNCiAgICAvKioNCiAgICAgKiBDcmVhdGUgdGhlIGlubGluZSBwbGF5ZXIgc3VwcG9ydGluZyBodG1sNSBhbmQgZmxhc2ggdGhyb3VnaCBpZnJhbWUNCiAgICAgKi8NCiAgICBjcmVhdGVQbGF5ZXI6IGZ1bmN0aW9uKGNmZykgew0KICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2ZnLmJsb2NrKTsNCg0KICAgICAgICB2YXIgaG9sZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgICBob2xkLmNsYXNzTmFtZSA9ICd5dFBsYXllcic7DQoNCiAgICAgICAgdmFyIGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOw0KICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdpZCcsIGNmZy5ibG9jayArICdQbGF5ZXInKTsNCiAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBjZmcud2lkdGgpOw0KICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBjZmcuaGVpZ2h0KTsNCiAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnZnJhbWVCb3JkZXInLCAnMCcpOw0KICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdzcmMnLCAnaHR0cDovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8nICsgeXRQbGF5ZXJQYXJhbXMudmlkZW9JZCArICc/YXV0b3BsYXk9JyArIHl0UGxheWVyUGFyYW1zLmF1dG9wbGF5ICsgJyZtb2Rlc3RicmFuZGluZz0xJyk7IC8vY29udHJvbGJhciBzZXQNCg0KICAgICAgICBob2xkLmFwcGVuZENoaWxkKGlmcmFtZSk7DQogICAgICAgIGRpdi5pbnNlcnRCZWZvcmUoaG9sZCwgZGl2LmZpcnN0Q2hpbGQpOw0KDQogICAgICAgIHJldHVybiBpZnJhbWU7DQogICAgfSwNCiAgICAvKioNCiAgICAgKiBGb3JtYXQgcmF0aW5nIChyYXRpbmcvcmF0aW5nQ291bnQpDQogICAgICovDQogICAgZm9ybWF0UmF0aW5nOiBmdW5jdGlvbihydCwgcmMpIHsNCg0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBGb3JtYXQgZHVyYXRpb24gKHNlYyB0byBtaW4pIHVzaW5nIHZpZGVvcyNjb250ZW50RGV0YWlscy5kdXJhdGlvbg0KICAgICAqLw0KICAgIGZvcm1hdER1cmF0aW9uOiBmdW5jdGlvbihkcikgew0KICAgICAgICByZXR1cm4gZHIucmVwbGFjZSgvKE18SCkvZywgJzonKS5yZXBsYWNlKCJTIiwgIiIpLnN1YnN0cigyKTsNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogRm9ybWF0IGRlc2NyaXB0aW9uIChkZXNjcmlwdGlvbiB0byBzbmlwcGV0KSAocmVhZCBtb3JlIGV4cGFuZCkNCiAgICAgKi8NCiAgICBmb3JtYXREZXNjcmlwdGlvbjogZnVuY3Rpb24oZHMpIHsNCiAgICAgICAgaWYgKGRzKSB7DQogICAgICAgICAgICBpZiAoZHMubGVuZ3RoID4gMjU1KSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRzLnN1YnN0cigwLCAyNTIpICsgJy4uLic7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBkczsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiAiTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlLiI7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgLyoqDQogICAgICogRm9ybWF0IGRhdGUgKDIwMDktMDgtMTBUMDk6MDQ6MjAuMDAwWiB0byB0aW1lKQ0KICAgICAqLw0KICAgIGZvcm1hdERhdGU6IGZ1bmN0aW9uKGR0KSB7DQogICAgICAgIGlmIChkdCkgew0KICAgICAgICAgICAgcmV0dXJuIGR0LnN1YnN0cigwLCAxMCkNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiAidW5rbm93biI7DQogICAgICAgIH0NCiAgICB9LA0KICAgIC8qKg0KICAgICAqIERlcHJlY2lhdGVkDQogICAgICovDQogICAgbW91c092ZXJJbWFnZTogZnVuY3Rpb24oYSwgYiwgYykgew0KDQogICAgfSwNCiAgICAvKioNCiAgICAgKiBEZXByZWNpYXRlZA0KICAgICAqLw0KICAgIG1vdXNlT3V0SW1hZ2U6IGZ1bmN0aW9uKGEsIGIpIHsNCg0KICAgIH0sDQogICAgLyoqDQogICAgICogTG9hZCBuZXh0IChwYWdlKQ0KICAgICAqLw0KICAgIGxvYWROZXh0OiBmdW5jdGlvbihkYXRhKSB7DQogICAgICAgIGRhdGEuY2ZnLnBhZ2VUb2tlbiA9IGRhdGEudG9rZW47DQogICAgICAgIHl0RW1iZWQuaW5pdChkYXRhLmNmZyk7DQogICAgfSwNCiAgICAvKioNCiAgICAgKiBMb2FkIHByZXZpb3VzIChwYWdlKQ0KICAgICAqLw0KICAgIGxvYWRQcmV2aW91czogZnVuY3Rpb24oZGF0YSkgew0KICAgICAgICBkYXRhLmNmZy5wYWdlVG9rZW4gPSBkYXRhLnRva2VuOw0KICAgICAgICB5dEVtYmVkLmluaXQoZGF0YS5jZmcpOw0KICAgIH0sDQogICAgLyoqDQogICAgICogU29ydGluZyBieSBjb21tdG5zLCB2aWV3cywgZGF0ZQ0KICAgICAqLw0KICAgIHNvcnRMaXN0OiBmdW5jdGlvbihqc29uKSB7DQoNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUGxheSB2aWRlbyAoc3RhdGljKQ0KICAgICAqLw0KICAgIHBsYXlWaWRlbzogZnVuY3Rpb24oZGF0YSkgew0KICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTsNCiAgICAgICAgaWYgKGRhdGEuY2ZnLnBhcmVudCkgew0KICAgICAgICAgICAgdmFyIHBsYXllciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRhdGEuY2ZnLnBhcmVudCArICJQbGF5ZXIiKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHZhciBwbGF5ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkYXRhLmNmZy5ibG9jayArICJQbGF5ZXIiKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghcGxheWVyKSB7DQogICAgICAgICAgICB5dFBsYXllclBhcmFtcy52aWRlb0lkID0gZGF0YS5pZDsNCiAgICAgICAgICAgIHl0UGxheWVyUGFyYW1zLmF1dG9wbGF5ID0gMTsNCg0KICAgICAgICAgICAgdGhpcy5jcmVhdGVQbGF5ZXIoZGF0YS5jZmcpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcGxheWVyLnNldEF0dHJpYnV0ZSgnc3JjJywgJ2h0dHA6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJyArIGRhdGEuaWQgKyAnP2F1dG9wbGF5PTEmbW9kZXN0YnJhbmRpbmc9MSZvcmlnaW49JyArIGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGRvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lKTsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgLyoqDQogICAgICogVGVzdA0KICAgICAqLw0KICAgIHRlc3Q6IGZ1bmN0aW9uKGUsIGIpIHsNCiAgICAgICAgY29uc29sZS5sb2coZSk7DQogICAgICAgIGNvbnNvbGUubG9nKGIpOw0KICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmNmZy5ibG9jayk7DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIG9uUGxheWVyUmVhZHkgdmlkZW8NCiAgICAgKi8NCiAgICBvblBsYXllclJlYWR5OiBmdW5jdGlvbihpZCkgew0KICAgICAgICAvL3NldCBmbGFnDQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIG9uUGxheWVyU3RhdGVDaGFuZ2UgdmlkZW8NCiAgICAgKi8NCiAgICBvblBsYXllclN0YXRlQ2hhbmdlOiBmdW5jdGlvbihpZCkgew0KICAgICAgICAvLw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBNZXNzYWdlcyBsb2cNCiAgICAgKi8NCiAgICBtZXNzYWdlOiBmdW5jdGlvbihtc2cpIHsNCiAgICAgICAgaWYgKCF5dEVtYmVkLmNmZy5ibG9jaykgew0KICAgICAgICAgICAgLy9hdHRhY2ggbWVzc2FnZSB0byBib2R5Pw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoeXRFbWJlZC5jZmcuYmxvY2spLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJlcnJvciI+JyArIG1zZyArICc8L2Rpdj4nOw0KICAgICAgICB9DQogICAgfQ0KfTsNCg0KLyoqDQogKiBVc2luZyB0aGUgZW1iZWQgcGxheWVyDQogKi8NCnZhciB5dFBsYXllcjsNCnZhciB5dFBsYXllclBhcmFtcyA9IHsNCiAgICBhdXRvcGxheTogMCwNCiAgICBtb2Rlc3RicmFuZGluZzogMSwNCiAgICBldmVudHM6IHsNCiAgICAgICAgJ29uUmVhZHknOiB5dEVtYmVkLm9uUGxheWVyUmVhZHksDQogICAgICAgICdvblN0YXRlQ2hhbmdlJzogeXRFbWJlZC5vblBsYXllclN0YXRlQ2hhbmdlDQogICAgfQ0KfTsNCg0KLS0+DQo=" ></script>

	<div id="div_url">
		<script id="script_url">
			var url = document.createElement("a");
			url.href=location.href;
			var output = "output";
			url.pathname = url.pathname.replace(/(^\/?)/,"/");

			if( url.search != "" ) {
				script_zm_view( url.search );
				}
//			alert(location.href)
//			alert(url.protocol)
//			alert(url.hostname)
//			alert(url.pathname)
//			alert(url.search)
//			alert(url.hash)


//			document.write( "hostname=" + url.hostname + " loc.href=" + location.href );
//			document.write( "pathname=" + url.pathname + " search=" + url.search );
			</script>
		</div>


<script> 
<!--
 
function updateField(){
	var nada = '';
 
//	var code = '<sc'+ nada +'ript src="http://www.yvoschaap.com/ytpage/ytembed.js" ></sc'+ nada +'ript>';
	var code = '<sc'+ nada +'ript src="data:/text/plain;base64,PCEtLQ0KDQovKiBTb3VyY2U6IGh0dHA6Ly95dm9zY2hhYXAuY29tICovDQovKiBCdWlsZCBmaXJzdCBpbiAnMDYgKi8NCi8qIDEvNC8yMDE1OiB1cGdyYWRlZCB0byBZb3VUdWJlIEFQSSB2MyAqLw0KLyogNi81LzIwMTU6IGFkZGVkIGJhY2sgdmlld3MgYW5kIGR1cmF0aW9uICAqLw0KDQpGdW5jdGlvbi5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uKG9iaiwgYXJncykgew0KICAgIHZhciBtZXRob2QgPSB0aGlzLA0KICAgICAgICB0ZW1wID0gZnVuY3Rpb24oKSB7DQogICAgICAgICAgICByZXR1cm4gbWV0aG9kLmNhbGwob2JqLCBhcmdzKTsNCiAgICAgICAgfTsNCg0KICAgIHJldHVybiB0ZW1wOw0KfQ0KDQp2YXIgeXRFbWJlZCA9IHsNCg0KICAgIHl0UXVlcnk6IDAsDQogICAgY2w6IDAsDQogICAgY2FsbGJhY2s6IHt9LA0KICAgIGNmZzoge30sDQogICAgcGxheWVyOiBmYWxzZSwNCg0KICAgIC8qKg0KICAgICAqIE1haW4gSW5pdCBNZXRob2QNCiAgICAgKi8NCiAgICBpbml0OiBmdW5jdGlvbihjZmcpIHsNCg0KICAgICAgICB0aGlzLmNmZyA9IGNmZyB8fCB7fTsNCg0KICAgICAgICAvLyB0ZW1wIGhhcmRjb2RlIG91ciBvd24ga2V5IGlmIG5vdCBwcm92aWRlZA0KICAgICAgICBpZiAoIXRoaXMuY2ZnLmtleSkgew0KICAgICAgICAgICAgICAgIHRoaXMuY2ZnLmtleSA9ICdBSXphU3lBOE9tS2N3MkRNTmtKaWN5Q0owdnF2ZjkweGdlSDUyekUnOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCF0aGlzLmNmZy5ibG9jaykgew0KICAgICAgICAgICAgdGhpcy5tZXNzYWdlKCdQbGVhc2Ugc2V0IHRoZSBibG9jayBlbGVtZW50IGluIHRoZSBjb25maWcgZmlsZS4nKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5jZmcudHlwZSkgew0KICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSgnWW91IG11c3QgcHJvdmlkZSBhIHR5cGU6IHNlYXJjaCwgdXNlciwgcGxheWxpc3QsIGZlYXR1cmVkIGluIHRoZSBpbnNlcnRWaWRlb3MgZnVuY3Rpb24uJyk7DQogICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmNmZy5xICYmICF0aGlzLmNmZy5pZCkgew0KICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSgnWW91IG11c3QgcHJvdmlkZSBhIHF1ZXJ5OiBzZWFyY2gga2V5d29yZHMsIHBsYXlsaXN0IElELCBvciB1c2VybmFtZS4nKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuY2ZnLmtleSkgew0KICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSgnTmV3OiBZb3UgbXVzdCBwcm92aWRlIGEgR29vZ2xlIERldmVsb3BlciBBUEkga2V5OiA8c3Ryb25nPjxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3lvdXR1YmUvcmVnaXN0ZXJpbmdfYW5fYXBwbGljYXRpb24iPmdldCBrZXk8L2E+PC9zdHJvbmc+LicpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAvL3RoaXMubWVzc2FnZSgnTG9hZGluZyBZb3VUdWJlIHZpZGVvcy4gUGxlYXNlIHdhaXQuLi4nKTsNCg0KICAgICAgICAgICAgICAgIC8vY3JlYXRlIGEgamF2YXNjcmlwdCBlbGVtZW50IHRoYXQgcmV0dXJucyBvdXIgSlNPTnAgZGF0YS4NCiAgICAgICAgICAgICAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7DQogICAgICAgICAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTsNCg0KICAgICAgICAgICAgICAgIC8vYSBjb3VudGVyDQogICAgICAgICAgICAgICAgdGhpcy55dFF1ZXJ5Kys7DQoNCiAgICAgICAgICAgICAgICAvL3NldHRpbmdzDQoNCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2ZnLnBhZ2luZykgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNmZy5wYWdpbmcgPSB0cnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2ZnLnJlc3VsdHMpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZmcucmVzdWx0cyA9IDEwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2ZnLm1ldGEpIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZmcubWV0YSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5jZmcub3JkZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgLy9kZXByZWNhdGVkIGluIHYzDQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2ZnLm9yZGVyYnkgPSAncmVsZXZhbmNlJzsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZmcuc29ydG9yZGVyID0gJ2Rlc2NlbmRpbmcnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2ZnLnRodW1ibmFpbCkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNmZy50aHVtYm5haWwgPSAyMDA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5jZmcuaGVpZ2h0KSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2ZnLmhlaWdodCA9IDM5MDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNmZy53aWR0aCkgew0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNmZy53aWR0aCA9IDY0MDsNCiAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jZmcub3JkZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAibmV3X2ZpcnN0IjoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2ZnLm9yZGVyYnkgPSAnZGF0ZSc7DQogICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMuY2ZnLnNvcnRvcmRlciA9ICdhc2NlbmRpbmcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAiaGlnaGVzdF9yYXRpbmciOg0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZmcub3JkZXJieSA9ICdyYXRpbmcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLmNmZy5zb3J0b3JkZXIgPSAnZGVzY2VuZGluZyc7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJtb3N0X3JlbGV2YW5jZSI6DQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNmZy5vcmRlcmJ5ID0gJ3JlbGV2YW5jZSc7DQogICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMuY2ZnLnNvcnRvcmRlciA9ICdkZXNjZW5kaW5nJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YXIgdXJsID0gImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tIjsNCg0KICAgICAgICAgICAgICAgIC8vd2hhdCBkYXRhIGRvIHdlIG5lZWQ6IGEgc2VhcmNoLCBhIHVzZXIgc2VhcmNoLCBhIHBsYXlsaXN0DQogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmNmZy50eXBlKSB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgInNlYXJjaCI6DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy95b3V0dWJlL3YzL3NlYXJjaD9xPScgKyB0aGlzLmNmZy5xICsgJyZ0eXBlPXZpZGVvJmNhbGxiYWNrPXl0RW1iZWQuY2FsbGJhY2tbJyArIHRoaXMueXRRdWVyeSArICddJm9yZGVyPScgKyB0aGlzLmNmZy5vcmRlcmJ5Ow0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAidXNlciI6DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy95b3V0dWJlL3YzL2NoYW5uZWxzP2ZvclVzZXJuYW1lPScgKyB0aGlzLmNmZy5xICsgJyZjYWxsYmFjaz15dEVtYmVkLmNhbGxiYWNrWycgKyB0aGlzLnl0UXVlcnkgKyAnXSc7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJwbGF5bGlzdCI6DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy95b3V0dWJlL3YzL3BsYXlsaXN0SXRlbXM/cGxheWxpc3RJZD0nICsgdGhpcy5jZmcucSArICcmY2FsbGJhY2s9eXRFbWJlZC5jYWxsYmFja1snICsgdGhpcy55dFF1ZXJ5ICsgJ10mb3JkZXI9JyArIHRoaXMuY2ZnLm9yZGVyYnk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBjYXNlICJ2aWRlb3MiOg0KICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcveW91dHViZS92My92aWRlb3M/aWQ9JyArIHRoaXMuY2ZnLnEgKyAnJmNhbGxiYWNrPXl0RW1iZWQuY2FsbGJhY2tbJyArIHRoaXMueXRRdWVyeSArICddJm9yZGVyPScgKyB0aGlzLmNmZy5vcmRlcmJ5Ow0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZmVhdHVyZWQiOg0KICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcveW91dHViZS92My92aWRlb3M/Y2hhcnQ9bW9zdFBvcHVsYXImY2FsbGJhY2s9eXRFbWJlZC5jYWxsYmFja1snICsgdGhpcy55dFF1ZXJ5ICsgJ10nOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAiY2hhbm5lbCI6DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy95b3V0dWJlL3YzL2NoYW5uZWxzP2lkPScgKyB0aGlzLmNmZy5xICsgJyZjYWxsYmFjaz15dEVtYmVkLmNhbGxiYWNrWycgKyB0aGlzLnl0UXVlcnkgKyAnXSc7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlKCdVbmtub3duIHNldHRpbmcgdHlwZS4gVXNlOiBzZWFyY2gsIHBsYXlsaXN0IG9yIHVzZXIuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcudHlwZSA9PSAidXNlciJ8fHRoaXMuY2ZnLnR5cGUgPT0gImNoYW5uZWwiKSB7DQogICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnBhcnQ9Y29udGVudERldGFpbHMnOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jZmcudHlwZSA9PSAic2VhcmNoIiAmJiB0aGlzLmNmZy5tZXRhKSB7DQogICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnBhcnQ9aWQnOyAvL25vdGUgcGFydD1pZCBkb2VzbnQgd29yayBmb3IgcGxheWxpc3QuIGdldCBsaXN0IC92aWRlb3Mgd2l0aCBtZXRhZGF0YQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jZmcudHlwZSA9PSAic2VhcmNoIikgew0KICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwYXJ0PXNuaXBwZXQnOyAvL29ubHkgdGhpbmcgaXQgcmV0dXJucw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jZmcudHlwZSA9PSAidmlkZW9zIikgew0KICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwYXJ0PXNuaXBwZXQsY29udGVudERldGFpbHMsc3RhdGlzdGljcyc7IC8vYWxsIGRldGFpbHMNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJyZwYXJ0PXNuaXBwZXQsY29udGVudERldGFpbHMnOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmNmZy50eXBlID09ICJ1c2VyInx8dGhpcy5jZmcudHlwZSA9PSAiY2hhbm5lbCIpIHsNCiAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmbWF4UmVzdWx0cz0xJzsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2ZnLnJlc3VsdHMpIHsNCiAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmbWF4UmVzdWx0cz0nICsgdGhpcy5jZmcucmVzdWx0czsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcucGFnZVRva2VuKSB7DQogICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnBhZ2VUb2tlbj0nICsgdGhpcy5jZmcucGFnZVRva2VuOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHVybCArPSAnJmtleT0nICsgdGhpcy5jZmcua2V5Ow0KICAgICAgICAgICAgICAgIHVybCArPSAnJnByZXR0eVByaW50PWZhbHNlJzsNCg0KICAgICAgICAgICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3NyYycsIHVybCk7DQoNCg0KICAgICAgICAgICAgICAgIGNmZy5tQyA9IHRoaXMueXRRdWVyeTsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcudHlwZSA9PSAidXNlciJ8fHRoaXMuY2ZnLnR5cGUgPT0gImNoYW5uZWwiKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tbdGhpcy55dFF1ZXJ5XSA9IGZ1bmN0aW9uKGpzb24pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBmaXJzdCByZXN1bHQgZm9yIHVzZXJuYW1lLCBhbmQgY3JlYXRlIGEgY2hhbm5lbElkIHJlcXVlc3QNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc29uLnBhZ2VJbmZvLnRvdGFsUmVzdWx0cyA9PSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBsYXlsaXN0SWQgPSBqc29uLml0ZW1zWzBdLmNvbnRlbnREZXRhaWxzLnJlbGF0ZWRQbGF5bGlzdHMudXBsb2FkczsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmcudHlwZSA9ICdwbGF5bGlzdCc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLnEgPSBwbGF5bGlzdElkOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl0RW1iZWQuaW5pdChjZmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dEVtYmVkLm1lc3NhZ2UoJ0NhblwndCBmaW5kIHRoaXMgdXNlciBkZWZpbmVkIGluIHEnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuY2ZnLnR5cGUgPT0gInBsYXlsaXN0IiB8fCB0aGlzLmNmZy50eXBlID09ICJzZWFyY2giKSAmJiB0aGlzLmNmZy5tZXRhKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tbdGhpcy55dFF1ZXJ5XSA9IGZ1bmN0aW9uKGpzb24pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IG1ldGEgZGF0YSBvZiBwbGF5bGlzdCB2aWRlb3MNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAvL2dyYWIgSURzIG9mIHBsYXlsaXN0LiAvcGxheWxpc3QgbmVlZHMgZXh0cmFjdCBpZCBmcm9tIHNuaXBwZXQsIGVsc2UgZGVmYXVsdCBvbiBpZA0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24uaXRlbXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWRzID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBqc29uLml0ZW1zLmxlbmd0aDsgaSsrKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24uaXRlbXNbaV0uc25pcHBldCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzICs9IGpzb24uaXRlbXNbaV0uc25pcHBldC5yZXNvdXJjZUlkLnZpZGVvSWQgKyAiLCI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoanNvbi5pdGVtc1tpXS5pZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzICs9IGpzb24uaXRlbXNbaV0uaWQudmlkZW9JZCArICIsIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXF1ZXN0IHZpZGVvIGRldGFpbHMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmcudHlwZSA9ICd2aWRlb3MnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy5xID0gaWRzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl0RW1iZWQuaW5pdChjZmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dEVtYmVkLm1lc3NhZ2UoJ0FuIGVycm9yIG9jY3VyZWQ6PGJyPicgKyBqc29uLmVycm9yLm1lc3NhZ2UpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFja1t0aGlzLnl0UXVlcnldID0gZnVuY3Rpb24oanNvbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgeXRFbWJlZC5saXN0VmlkZW9zKGpzb24sIGNmZyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgIC8vYXR0YWNoIHNjcmlwdCB0byBwYWdlLCB0aGlzIHdpbGwgbG9hZCB0aGUgZGF0YSBpbnRvIG91ciBwYWdlIGFuZCBjYWxsIHRoZSBmdW50aW9uIHl0SW5pdFt5dFF1ZXJ5XQ0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgfSwNCg0KDQogICAgLyoqDQogICAgICogQnVpbGQgdmlkZW9zIChzdGF0aWMpDQogICAgICovDQogICAgbGlzdFZpZGVvczogZnVuY3Rpb24oanNvbiwgY2ZnKSB7DQogICAgICAgIHRoaXMuY2ZnID0gY2ZnOw0KICAgICAgICBpZiAoIXRoaXMuY2ZnLnBsYXllcikgew0KICAgICAgICAgICAgdGhpcy5jZmcucGxheWVyID0gJ2VtYmVkJzsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIXRoaXMuY2ZnLmxheW91dCkgew0KICAgICAgICAgICAgdGhpcy5jZmcubGF5b3V0ID0gJ2Z1bGwnOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuY2ZnLmJsb2NrKTsNCg0KICAgICAgICB2YXIgY2hpbGRyZW4gPSBkaXYuY2hpbGROb2RlczsNCiAgICAgICAgZm9yICh2YXIgaSA9IGNoaWxkcmVuLmxlbmd0aDsgaSA+IC0xOyBpLS0pIHsNCiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXSAmJiAoY2hpbGRyZW5baV0uY2xhc3NOYW1lLmluZGV4T2YoImVycm9yIikgIT09IC0xIHx8IGNoaWxkcmVuW2ldLnRhZ05hbWUgPT09ICJVTCIpKSB7IC8qIGlzIGVycm9yIG1lc3NhZ2Ugb3IgcmVzdWx0IGxpc3QgKi8NCiAgICAgICAgICAgICAgICBkaXYucmVtb3ZlQ2hpbGQoY2hpbGRyZW5baV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCg0KICAgICAgICAvL2Rpdi5pbm5lckhUTUwgPSAnJzsgLy9jbGVhciB1bA0KICAgICAgICBpZiAoanNvbi5lcnJvcikgew0KICAgICAgICAgICAgdGhpcy5tZXNzYWdlKCdBbiBlcnJvciBvY2N1cmVkOjxicj4nICsganNvbi5lcnJvci5tZXNzYWdlKTsNCiAgICAgICAgfSBlbHNlIGlmIChqc29uLml0ZW1zKSB7DQogICAgICAgICAgICB2YXIgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpOw0KICAgICAgICAgICAgdWwuY2xhc3NOYW1lID0gJ3l0bGlzdCc7DQoNCiAgICAgICAgICAgIHZhciBwbGF5bGlzdCA9ICIiOw0KDQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGpzb24uaXRlbXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBqc29uLml0ZW1zW2ldOw0KDQogICAgICAgICAgICAgICAgLy9wbGF5bGlzdCBuZWVkIHRoaXMNCg0KICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zbmlwcGV0ICYmIGVudHJ5LnNuaXBwZXQucmVzb3VyY2VJZCkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBlbnRyeS5zbmlwcGV0LnJlc291cmNlSWQudmlkZW9JZDsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LmlkLnZpZGVvSWQpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gZW50cnkuaWQudmlkZW9JZDsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBlbnRyeS5pZDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoaWQpIHsNCiAgICAgICAgICAgICAgICAgICAgcGxheWxpc3QgKz0gaWQgKyAiLCI7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgdmFyIGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsNCg0KICAgICAgICAgICAgICAgIC8vYSBsaW5rIHRvIG91ciBqYXZhc2NyaXB0IG92ZXJsYXkgZnVuY3Rpb24NCiAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCiAgICAgICAgICAgICAgICBhLmNsYXNzTmFtZSA9ICdjbGlwJzsNCg0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmNmZy5wbGF5ZXIgPT0gJ2VtYmVkJykgew0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcucGFyZW50KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvL2Euc2V0QXR0cmlidXRlKCdocmVmJywnIycrdGhpcy5jZmcucGFyZW50KydQbGF5ZXInKTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCcjJyt0aGlzLmNmZy5ibG9jaysnUGxheWVyJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgYS5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKGEuYWRkRXZlbnRMaXN0ZW5lcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgYS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMucGxheVZpZGVvLmJpbmQodGhpcywgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6IGlkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjZmcnOiBjZmcNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmYWxzZSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYS5hdHRhY2hFdmVudCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgYS5hdHRhY2hFdmVudCgnb25jbGljaycsIHRoaXMucGxheVZpZGVvLmJpbmQodGhpcywgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6IGlkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjZmcnOiBjZmcNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGEuc2V0QXR0cmlidXRlKCdocmVmJywgJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9JyArIGlkKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCiAgICAgICAgICAgICAgICBhLmFwcGVuZENoaWxkKHNwYW4pOw0KICAgICAgICAgICAgICAgIHZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsNCiAgICAgICAgICAgICAgICBpbWcuc2V0QXR0cmlidXRlKCdzcmMnLCAoZW50cnkuc25pcHBldC50aHVtYm5haWxzID8gZW50cnkuc25pcHBldC50aHVtYm5haWxzLm1lZGl1bS51cmwgOiAnJykpOw0KICAgICAgICAgICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoaW1nKTsNCiAgICAgICAgICAgICAgICB2YXIgZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdlbScpOw0KICAgICAgICAgICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZW0pOw0KDQogICAgICAgICAgICAgICAgLy91cGxvYWRlZA0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmNmZy5sYXlvdXQgPT0gJ3RodW1ibmFpbHMnKSB7DQogICAgICAgICAgICAgICAgICAgIGxpLmNsYXNzTmFtZSA9ICdzbWFsbCc7DQogICAgICAgICAgICAgICAgICAgIGxpLmFwcGVuZENoaWxkKGEpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIC8vdGhpcy5jZmcubGF5b3V0ID0gZnVsbA0KICAgICAgICAgICAgICAgICAgICBsaS5pbm5lckhUTUwgPSAnPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYm9yZGVyPSIwIj48dHI+PHRkIHZhbGlnbj0idG9wIiByb3dzcGFuPSIyIj48L3RkPjx0ZCB2YWxpZ249InRvcCI+PGgzPicgKyBlbnRyeS5zbmlwcGV0LnRpdGxlICsgJzwvaDM+PHNwYW4+JyArIHRoaXMuZm9ybWF0RGVzY3JpcHRpb24oZW50cnkuc25pcHBldC5kZXNjcmlwdGlvbikgKyAnPC9zcGFuPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiBzdHlsZT0id2lkdGg6IDE1MHB4IiBjbGFzcz0ibWV0YSI+PGRpdj4nICsgKGVudHJ5LmNvbnRlbnREZXRhaWxzID8gJ0R1cmF0aW9uOiAnICsgeXRFbWJlZC5mb3JtYXREdXJhdGlvbihlbnRyeS5jb250ZW50RGV0YWlscy5kdXJhdGlvbikgKyAnPGJyPicgOiAnJykgKyAoZW50cnkuc3RhdGlzdGljcyA/ICdWaWV3czogJyArIGVudHJ5LnN0YXRpc3RpY3Mudmlld0NvdW50ICsgJzxicj4nIDogJycpICsgJ0Zyb206IDxhIGhyZWY9Imh0dHA6Ly93d3cueW91dHViZS5jb20vcHJvZmlsZT91c2VyPScgKyBlbnRyeS5zbmlwcGV0LmNoYW5uZWxUaXRsZSArICciPicgKyBlbnRyeS5zbmlwcGV0LmNoYW5uZWxUaXRsZSArICc8L2E+PC9kaXY+PC90ZD48L3RyPjwvdGFibGU+JzsNCiAgICAgICAgICAgICAgICAgICAgbGkuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5hcHBlbmRDaGlsZChhKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdWwuYXBwZW5kQ2hpbGQobGkpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL2ZvciBmaXhlZCB0byBib3R0b20gdmlkZW9zDQogICAgICAgICAgICBpZiAodGhpcy5jZmcucG9zaXRpb24gPT0gImZpeGVkX2JvdHRvbSIpIHsNCiAgICAgICAgICAgICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAiZml4ZWQiOw0KICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5ib3R0b20gPSAnMHB4JzsNCiAgICAgICAgICAgICAgICBkaXYuc3R5bGUubGVmdCA9ICcwcHgnOw0KICAgICAgICAgICAgICAgIC8vZG9jdW1lbnQgYm90dG9tIGFkZCBYIChoZWlnaHQpIHBpeGVscyBtYXJnaW4NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZCh1bCk7DQoNCiAgICAgICAgICAgIC8vcGxheWxpc3QNCiAgICAgICAgICAgIGlmICh0aGlzLmNmZy5wbGF5bGlzdCA9PSB0cnVlKSB7DQogICAgICAgICAgICAgICAgdGhpcy5jZmcucGxheWVyVmFycy5wbGF5bGlzdCA9IHBsYXlsaXN0LnN1YnN0cigwLCBwbGF5bGlzdC5sZW5ndGggLSAxKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHRoaXMuY2ZnLnBsYXllciA9PSAiZW1iZWQiICYmIHRoaXMuY2ZnLmRpc3BsYXlfZmlyc3QgPT0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgIC8vc2V0IHNldHRpbmdzDQoNCiAgICAgICAgICAgICAgICB5dFBsYXllclBhcmFtcy52aWRlb0lkID0gaWQ7DQoNCg0KICAgICAgICAgICAgICAgIC8vb3RoZXIgc2V0dGluZ3MNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZmcucGxheWVyVmFycykgew0KICAgICAgICAgICAgICAgICAgICB5dFBsYXllclBhcmFtcy5wbGF5ZXJWYXJzID0gdGhpcy5jZmcucGxheWVyVmFyczsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB0aGlzLnBsYXllciA9IHRoaXMuY3JlYXRlUGxheWVyKHRoaXMuY2ZnKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHRoaXMuY2ZnLnBhZ2luZyA9PSB0cnVlICYmIGpzb24ubmV4dFBhZ2VUb2tlbikgew0KICAgICAgICAgICAgICAgIHRoaXMuY2ZnLmRpc3BsYXlfZmlyc3QgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICB2YXIgcHVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTsNCiAgICAgICAgICAgICAgICBwdWwuc2V0QXR0cmlidXRlKCdpZCcsICd5dFBhZ2UnKTsNCiAgICAgICAgICAgICAgICBpZiAoanNvbi5uZXh0UGFnZVRva2VuKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQogICAgICAgICAgICAgICAgICAgIGEuY2xhc3NOYW1lID0gJ3l0TmV4dCc7DQogICAgICAgICAgICAgICAgICAgIGEuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOw0KDQogICAgICAgICAgICAgICAgICAgIGxpLmFwcGVuZENoaWxkKGEpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoYS5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgeXRFbWJlZC5sb2FkTmV4dC5iaW5kKHRoaXMsIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmc6IGNmZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjoganNvbi5uZXh0UGFnZVRva2VuDQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZmFsc2UpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGEuaW5uZXJIVE1MID0gJ0xvYWQgbmV4dC4uLic7DQogICAgICAgICAgICAgICAgICAgIGxpLmFwcGVuZENoaWxkKGEpOyAvL2RvIHRocm91Z2ggYmluZA0KICAgICAgICAgICAgICAgICAgICBwdWwuYXBwZW5kQ2hpbGQobGkpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChqc29uLnByZXZQYWdlVG9rZW4pIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCiAgICAgICAgICAgICAgICAgICAgYS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3l0UHJldicpOw0KICAgICAgICAgICAgICAgICAgICBhLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJzsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoYS5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgeXRFbWJlZC5sb2FkUHJldmlvdXMuYmluZCh0aGlzLCB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnOiBjZmcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IGpzb24ucHJldlBhZ2VUb2tlbg0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBhLmlubmVySFRNTCA9ICdMb2FkIHByZXZpb3VzLi4uJzsNCiAgICAgICAgICAgICAgICAgICAgbGkuYXBwZW5kQ2hpbGQoYSk7DQogICAgICAgICAgICAgICAgICAgIHB1bC5hcHBlbmRDaGlsZChsaSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHB1bCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHRoaXMubWVzc2FnZSgnTm8gWW91VHViZSB2aWRlb3MgZm91bmQgZm9yIHlvdXIgcXVlcnk6PGJyPlR5cGU6XCcnICsgdGhpcy5jZmcudHlwZSArICdcJzxicj5RdWVyeTogXCcnICsgdGhpcy5jZmcucSArICdcJycpOw0KICAgICAgICB9DQogICAgfSwNCiAgICAvKioNCiAgICAgKiBDcmVhdGUgdGhlIGlubGluZSBwbGF5ZXIgc3VwcG9ydGluZyBodG1sNSBhbmQgZmxhc2ggdGhyb3VnaCBpZnJhbWUNCiAgICAgKi8NCiAgICBjcmVhdGVQbGF5ZXI6IGZ1bmN0aW9uKGNmZykgew0KICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2ZnLmJsb2NrKTsNCg0KICAgICAgICB2YXIgaG9sZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgICBob2xkLmNsYXNzTmFtZSA9ICd5dFBsYXllcic7DQoNCiAgICAgICAgdmFyIGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOw0KICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdpZCcsIGNmZy5ibG9jayArICdQbGF5ZXInKTsNCiAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBjZmcud2lkdGgpOw0KICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBjZmcuaGVpZ2h0KTsNCiAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnZnJhbWVCb3JkZXInLCAnMCcpOw0KICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKCdzcmMnLCAnaHR0cDovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8nICsgeXRQbGF5ZXJQYXJhbXMudmlkZW9JZCArICc/YXV0b3BsYXk9JyArIHl0UGxheWVyUGFyYW1zLmF1dG9wbGF5ICsgJyZtb2Rlc3RicmFuZGluZz0xJyk7IC8vY29udHJvbGJhciBzZXQNCg0KICAgICAgICBob2xkLmFwcGVuZENoaWxkKGlmcmFtZSk7DQogICAgICAgIGRpdi5pbnNlcnRCZWZvcmUoaG9sZCwgZGl2LmZpcnN0Q2hpbGQpOw0KDQogICAgICAgIHJldHVybiBpZnJhbWU7DQogICAgfSwNCiAgICAvKioNCiAgICAgKiBGb3JtYXQgcmF0aW5nIChyYXRpbmcvcmF0aW5nQ291bnQpDQogICAgICovDQogICAgZm9ybWF0UmF0aW5nOiBmdW5jdGlvbihydCwgcmMpIHsNCg0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBGb3JtYXQgZHVyYXRpb24gKHNlYyB0byBtaW4pIHVzaW5nIHZpZGVvcyNjb250ZW50RGV0YWlscy5kdXJhdGlvbg0KICAgICAqLw0KICAgIGZvcm1hdER1cmF0aW9uOiBmdW5jdGlvbihkcikgew0KICAgICAgICByZXR1cm4gZHIucmVwbGFjZSgvKE18SCkvZywgJzonKS5yZXBsYWNlKCJTIiwgIiIpLnN1YnN0cigyKTsNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogRm9ybWF0IGRlc2NyaXB0aW9uIChkZXNjcmlwdGlvbiB0byBzbmlwcGV0KSAocmVhZCBtb3JlIGV4cGFuZCkNCiAgICAgKi8NCiAgICBmb3JtYXREZXNjcmlwdGlvbjogZnVuY3Rpb24oZHMpIHsNCiAgICAgICAgaWYgKGRzKSB7DQogICAgICAgICAgICBpZiAoZHMubGVuZ3RoID4gMjU1KSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRzLnN1YnN0cigwLCAyNTIpICsgJy4uLic7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHJldHVybiBkczsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiAiTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlLiI7DQogICAgICAgIH0NCiAgICB9LA0KDQogICAgLyoqDQogICAgICogRm9ybWF0IGRhdGUgKDIwMDktMDgtMTBUMDk6MDQ6MjAuMDAwWiB0byB0aW1lKQ0KICAgICAqLw0KICAgIGZvcm1hdERhdGU6IGZ1bmN0aW9uKGR0KSB7DQogICAgICAgIGlmIChkdCkgew0KICAgICAgICAgICAgcmV0dXJuIGR0LnN1YnN0cigwLCAxMCkNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHJldHVybiAidW5rbm93biI7DQogICAgICAgIH0NCiAgICB9LA0KICAgIC8qKg0KICAgICAqIERlcHJlY2lhdGVkDQogICAgICovDQogICAgbW91c092ZXJJbWFnZTogZnVuY3Rpb24oYSwgYiwgYykgew0KDQogICAgfSwNCiAgICAvKioNCiAgICAgKiBEZXByZWNpYXRlZA0KICAgICAqLw0KICAgIG1vdXNlT3V0SW1hZ2U6IGZ1bmN0aW9uKGEsIGIpIHsNCg0KICAgIH0sDQogICAgLyoqDQogICAgICogTG9hZCBuZXh0IChwYWdlKQ0KICAgICAqLw0KICAgIGxvYWROZXh0OiBmdW5jdGlvbihkYXRhKSB7DQogICAgICAgIGRhdGEuY2ZnLnBhZ2VUb2tlbiA9IGRhdGEudG9rZW47DQogICAgICAgIHl0RW1iZWQuaW5pdChkYXRhLmNmZyk7DQogICAgfSwNCiAgICAvKioNCiAgICAgKiBMb2FkIHByZXZpb3VzIChwYWdlKQ0KICAgICAqLw0KICAgIGxvYWRQcmV2aW91czogZnVuY3Rpb24oZGF0YSkgew0KICAgICAgICBkYXRhLmNmZy5wYWdlVG9rZW4gPSBkYXRhLnRva2VuOw0KICAgICAgICB5dEVtYmVkLmluaXQoZGF0YS5jZmcpOw0KICAgIH0sDQogICAgLyoqDQogICAgICogU29ydGluZyBieSBjb21tdG5zLCB2aWV3cywgZGF0ZQ0KICAgICAqLw0KICAgIHNvcnRMaXN0OiBmdW5jdGlvbihqc29uKSB7DQoNCiAgICB9LA0KDQogICAgLyoqDQogICAgICogUGxheSB2aWRlbyAoc3RhdGljKQ0KICAgICAqLw0KICAgIHBsYXlWaWRlbzogZnVuY3Rpb24oZGF0YSkgew0KICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTsNCiAgICAgICAgaWYgKGRhdGEuY2ZnLnBhcmVudCkgew0KICAgICAgICAgICAgdmFyIHBsYXllciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRhdGEuY2ZnLnBhcmVudCArICJQbGF5ZXIiKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHZhciBwbGF5ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkYXRhLmNmZy5ibG9jayArICJQbGF5ZXIiKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghcGxheWVyKSB7DQogICAgICAgICAgICB5dFBsYXllclBhcmFtcy52aWRlb0lkID0gZGF0YS5pZDsNCiAgICAgICAgICAgIHl0UGxheWVyUGFyYW1zLmF1dG9wbGF5ID0gMTsNCg0KICAgICAgICAgICAgdGhpcy5jcmVhdGVQbGF5ZXIoZGF0YS5jZmcpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcGxheWVyLnNldEF0dHJpYnV0ZSgnc3JjJywgJ2h0dHA6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJyArIGRhdGEuaWQgKyAnP2F1dG9wbGF5PTEmbW9kZXN0YnJhbmRpbmc9MSZvcmlnaW49JyArIGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGRvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lKTsNCiAgICAgICAgfQ0KICAgIH0sDQogICAgLyoqDQogICAgICogVGVzdA0KICAgICAqLw0KICAgIHRlc3Q6IGZ1bmN0aW9uKGUsIGIpIHsNCiAgICAgICAgY29uc29sZS5sb2coZSk7DQogICAgICAgIGNvbnNvbGUubG9nKGIpOw0KICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmNmZy5ibG9jayk7DQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIG9uUGxheWVyUmVhZHkgdmlkZW8NCiAgICAgKi8NCiAgICBvblBsYXllclJlYWR5OiBmdW5jdGlvbihpZCkgew0KICAgICAgICAvL3NldCBmbGFnDQogICAgfSwNCg0KICAgIC8qKg0KICAgICAqIG9uUGxheWVyU3RhdGVDaGFuZ2UgdmlkZW8NCiAgICAgKi8NCiAgICBvblBsYXllclN0YXRlQ2hhbmdlOiBmdW5jdGlvbihpZCkgew0KICAgICAgICAvLw0KICAgIH0sDQoNCiAgICAvKioNCiAgICAgKiBNZXNzYWdlcyBsb2cNCiAgICAgKi8NCiAgICBtZXNzYWdlOiBmdW5jdGlvbihtc2cpIHsNCiAgICAgICAgaWYgKCF5dEVtYmVkLmNmZy5ibG9jaykgew0KICAgICAgICAgICAgLy9hdHRhY2ggbWVzc2FnZSB0byBib2R5Pw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoeXRFbWJlZC5jZmcuYmxvY2spLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJlcnJvciI+JyArIG1zZyArICc8L2Rpdj4nOw0KICAgICAgICB9DQogICAgfQ0KfTsNCg0KLyoqDQogKiBVc2luZyB0aGUgZW1iZWQgcGxheWVyDQogKi8NCnZhciB5dFBsYXllcjsNCnZhciB5dFBsYXllclBhcmFtcyA9IHsNCiAgICBhdXRvcGxheTogMCwNCiAgICBtb2Rlc3RicmFuZGluZzogMSwNCiAgICBldmVudHM6IHsNCiAgICAgICAgJ29uUmVhZHknOiB5dEVtYmVkLm9uUGxheWVyUmVhZHksDQogICAgICAgICdvblN0YXRlQ2hhbmdlJzogeXRFbWJlZC5vblBsYXllclN0YXRlQ2hhbmdlDQogICAgfQ0KfTsNCg0KLS0+DQo=" ></sc'+ nada +'ript>';
	code += "\n";
	//code += '<di'+ nada +'v id="ytPlayer"></div>\n';
	code += '<di'+ nada +'v id="ytThumbs"></div>';
	code += "\n";
		
	var string = '\'block\':\'ytThumbs\',';

 	string += '\'key\':\'your-youtube-developer-key\',';
	var codeQ = document.getElementById('codeQ').value;
	string += '\'q\':\''+codeQ+'\',';	
	var codeType = document.getElementById('codeType').options[document.getElementById('codeType').selectedIndex].value;
	string += '\'type\':\''+codeType+'\',';
	var codeResults = document.getElementById('codeResults').options[document.getElementById('codeResults').selectedIndex].value;
	string += '\'results\':'+codeResults+',';
	//var codeOrder = document.getElementById('codeOrder').options[document.getElementById('codeOrder').selectedIndex].value;
	//string += '\'order\':\''+codeOrder+'\',';
	var codeMeta = document.getElementById('codeMeta').options[document.getElementById('codeMeta').selectedIndex].value;
	string += '\'meta\':'+codeMeta+',';
	var codePlayer = document.getElementById('codePlayer').options[document.getElementById('codePlayer').selectedIndex].value;
	string += '\'player\':\''+codePlayer+'\',';
	var codeLayout = document.getElementById('codeLayout').options[document.getElementById('codeLayout').selectedIndex].value;
	string += '\'layout\':\''+codeLayout+'\'';
	code += "\n";
	code += '<sc'+ nada+'ript>';
	code += "\n";
	code += '	ytEmbed'+nada +'.init({'+string+'});';
	code += "\n";
	code += '</sc'+nada +'ript>';
	
	document.getElementById('codeResult').value = code;
	
	var execute = {'q': codeQ, 'type': codeType, 'results': codeResults, 'block': 'youtubeDivResults', 'meta': codeMeta, 'player': codePlayer, 'layout': codeLayout};
	ytEmbed.init(execute);
}
//-->
</script>
<style>
/* needed for the thumbs to show correctly */
.ytPlayer{
	margin: auto;
	text-align: center;
}
.ytlist {
	list-style: none outside none;
	margin: 0;
	padding: 0;
}

/* float fix */
.ytlist:after {
	content:".";
	display:block;
	height:0;
	clear:both;
	visibility:hidden
}

.ytlist li{
	display: inline;
	float: left;
	margin: 5px; /* some space */
}

.ytlist table {
	width: 100%;
}

.ytlist td{
	padding: 5px; /* some space */
	vertical-align: top;
}

.ytlist h3{
	margin: 0;
	line-height: 1.55em;
}


.ytlist a {
	padding:0px;
}
/* hd */
.clip span {
	position: relative;
	width: 288px;
	overflow: hidden;
}
.clip img{
	width: 288px;
	display: block;

}

/* thumbs */
.small .clip span {
	position: relative;
	width: 100px;
	overflow: hidden;
}
.small .clip img{
	width: 100px;
	display: block;

}

/* for paging UL */
#ytPage{
	list-style: none inside;
	margin: 0;
	padding: 0;
	height: 20px;
}

#ytPage .ytNext{
	float: right; /* aligns to the right of ul */
}

#ytPage .ytPrev{
	display: inline-block; /* blocks keeps our ul height */
}

/* generator css */
input,select,textarea{
	padding: 3px;
	font-size: 1.1em;	
}
		</style>

<hr color=red>
<hr color=white>
<hr color=blue>

<h3>disabled simple youtube search</h3>
<form onsubmit="ytEmbed.init({'block':'youtubeDivSearch','type':'search','q':document.getElementById('ytSearchField').value,'results': 5,'meta':true}); return false;">
  <input  type="text" id="ytSearchField">
  <input type="submit" value="  SimpleSearch  ">
</form>
<div id="youtubeDivSearch"></div>

<hr color=red>
<hr color=white>
<hr color=blue>



<div id="blog">

<!--
<h1>Youtube Simple Embed - Youtube for any page</h1>
<p>Easily embed YouTube functionality on your site by integrating a search query, playlist or your account's videos. Integrate the video player. Page through the results. All  simple as plug and play. Interested? Read on and check out the examples below.</p>
<p>Best is to try out the generator and check out the results.</p>
<h1>Generator</h1>
<p>This generator will help you create the full code needed to get this all working. You can copy &amp; paste this into your website, optimize to your layout (css) and you're done.</p>
<p><strong>Update '15:</strong> YouTube changed the API again significantly. They force us now to use the new slower, and more difficult data API. Worst of all, you now need a YouTube API key: <a href="https://developers.google.com/youtube/registering_an_application">get your own stupid key</a>. It works for YouTube API v3, but I won't longer actively support this code.</p>
-->



<h3>poweruser youtube search</h3>
<form onsubmit="updateField(); return false;">
  <input id="codeQ" type="text" value="">
	<input type="submit" value="poweruser youtube search"><br>
		<textarea style="width: 100%" rows="8" id="codeResult"></textarea><br>
		</form>
<p>Action:
	<select id="codeType">
		<option value="search">Search</option>
		<option value="playlist">Playlist</option>
		<option value="user">User</option>
		<option value="channel">Channel</option>
		</select>

  Query:
  Results:
	<select id="codeResults">
		<option value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
		<option value="4">4</option>
		<option value="5" selected="selected">5</option>
		<option value="10">10</option>
		<option value="20">20</option>
		<option value="50">50</option>
		</select>

   Order:
   <select id="codeOrder">
     <option value="new_first">newly published</option>
     <option value="highest_rating" >highest rated</option>
     <option value="most_relevance" selected="selected">most relevant</option>
    </select>-->
   Views & duration:
   <select id="codeMeta">
     <option value="true">Display</option>
     <option value="false" >No (faster)</option>
    </select>
   <br>
   Player:
   <select id="codePlayer">
     <option value="embed">embed into site</option>
     <option value="link">link to youtube</option>
    </select>
   Results:
   <select id="codeLayout">
     <option value="thumbnails">thumbnails</option>
     <option value="full" selected="selected">full format</option>
    </select>


>!--
	<input type="submit" value="poweruser youtube search"><br>
		<textarea style="width: 100%" rows="8" id="codeResult"></textarea><br>
		</form>
	-->

<div id="youtubeDivResults"></div>



<!--
<hr>
<p>The installation is very simple, provides super fast results, and has a wide set of features. Lets continue with some examples:</p>
<h3>All YouTube videos about: "music video"</h3>
<div id="youtubeDiv"></div>
	<script>
		ytEmbed.init({'block':'youtubeDiv','type':'search','q':'music video','results': 3});
		</script>


<textarea cols="70" rows="3">&lt;div id="youtubeDiv">&lt;/div>
&lt;script>ytEmbed.init({'block':'youtubeDiv','type':'search','q':'music video','results': 3});&lt;/script></textarea>
<hr>
<h3>A YouTube playlist: Music Videos by VEVO </h3>
<div id="youtubeDivPlaylist"></div>
<script>ytEmbed.init({'block':'youtubeDivPlaylist','type':'playlist','q':'LL2pmfLm7iq6Ov1UwYrWYkZA','results': 3, 'meta':true});</script>
<textarea cols="70" rows="4">&lt;div id="youtubeDivPlaylist">&lt;/div>
&lt;script>ytEmbed.init({'block':'youtubeDivPlaylist','type':'playlist','q':'LL2pmfLm7iq6Ov1UwYrWYkZA','results': 3, 'meta':true});&lt;/script></textarea>


<hr>
<h3>YouTube User videos: yvo</h3>
<div id="youtubeDivUser"></div>
<script>
	ytEmbed.init({'block':'youtubeDivUser','type':'user','q':'yvo','results': 6,'layout':'thumbnails','player':'embed','height':250,'width':300,'display_first':true});
	</script>
<textarea cols="70" rows="4">&lt;div id="youtubeDivUser">&lt;/div>
&lt;script>ytEmbed.init({'block':'youtubeDivUser','type':'user','q':'yvo','results': 6,'layout':'thumbnails','player':'embed','height':250,'width':300,'display_first':true});&lt;/script></textarea>

		-->
<!--


<textarea cols="70" rows="5">&lt;form onsubmit="ytEmbed.init({'block':'youtubeDivSearch','type':'search','q':document.getElementById('ytSearchField').value,'results': 5,'meta':true}); return false;">
  &lt;input type="text" id="ytSearchField">  &lt;input type="submit" value="  Search   ">
&lt;/form>
&lt;div id="youtubeDivSearch">&lt;/div></textarea>

<hr color=blue>
<hr color=white>
<hr color=red>

<h1>Installation</h1>
	-->
<!--
<p>To install the YouTube video thumbnail results you can use the <a href="#top">generator</a> or follow the instruction below.</p>
<p>First: download this <a href="/ytpage/ytembed.js">javascript</a> file (4kb), and upload it to your server. On the page that you want the YouTube  video thumbnail results to appear include this line in your documen<em>t</em>:</p>
<p><strong>&lt;script src='/ytembed.js'&gt;&lt;/script&gt;</strong></p>
<p>Up next is finding a nice spot where you want to have the YouTube  video thumbnails. Insert there this html code that creates a block with the ID youtubeDiv (must be unique).</p>
<p><strong>&lt;div id=&quot;youtubeDiv&quot;&gt;&lt;/div&gt;</strong></p>
<p>Directly below the code provide the configuration of the YouTube  video thumbnails you want to show. An example:</p>
<p><strong>&lt;script&gt;ytEmbed.init({'block':'youtubeDiv','type':'search','q':'baby laughing','results':'4','meta':'true'});&lt;/script&gt;</strong></p>
<p>The detailed explanation is below, but this code will do a YouTube video search on the newest videos uploaded on &quot;baby laughing&quot; and have 4 thumbnails returned that link to the YouTube video player.</p>
<p>And now comes the part to configure the script to your liking. You must tell the script what kind of videos you want to display on your page, this is done by providing several settings. You can do this by hand as explained below, or with our <a href="#top">generator</a>. The  settings that are available:</p>
<ul>
  <li><strong>key</strong> - obligated YouTube developer API key.</li>
  <li><strong>block</strong> - obligated ID of the html element (&lt;div id='this_is_the_block_id'&gt;) where you want the results thumbnails to appear.</li>
  <li><strong>type</strong> - obligated setting that provides the function you want to execute:
    <ul>
      <li><em><strong>search</strong></em> - YouTube searches for a video with the string set by 'q'.</li>
      <li><em><strong>playlist</strong></em> - results of a YouTube playlist set by playlist id in 'q'.</li>
      <li><em><strong>user</strong></em> - results of a YouTube user videos set by user name in 'q'.</li>
    </ul>
  </li>
  <li><strong>q</strong> - obligated string to identify your results, see '<strong>type</strong>' above.</li>
  <li><strong>results</strong> - the number of results you want to show.</li>
  <li><strong>meta</strong> - set to true to display duration and views.</li>
	-->

<!--
  <li><strong>order</strong> - what comes first:
    <ul>
        <li><strong>new_first</strong> - newest videos published on top</li>
      <li><strong>highest_rating</strong> - highest rated videos on top</li>
      <li><strong>most_relevance</strong> - most relevant videos on top</li>
    </ul>
  </li>
-->
<!--
  <li><strong>player</strong> - decide if you want to play the video on youtube.com or embed on your page:
    <ul>
      <li><em><strong>embed</strong></em> - plays the video on your page.</li>
      <li><em><strong>link</strong></em> - plays the video on youtube.com</li>
    </ul>
  </li>
  <li><strong>display_first</strong> - display the player and queu first video results (needs <strong>player</strong> set to <strong><em>embed</em></strong>)
    <ul>
      <li><strong><em>true</em></strong></li>
    </ul>
  </li>
  <li><strong>width</strong>: embed player width</li>
  <li><strong>height</strong>: embed player height</li>
  <li><strong>layout</strong> - how do you want the results to appear:
    <ul>
      <li><em><strong>thumbnails</strong></em> - only a list of thumbnails as result.</li>
      <li><em><strong>full</strong></em> - list of results with thumbnail, description, rating and user  </li>
      </ul>
  </li>
  </ul>
<p>You use these settings by placing them in this template style 'what':'value'. Separated by a comma. This is then placed within this function ytEmbed.init({'what':'value','what2':'value2'}); surrounded by &lt;script&gt; tags, again an example below:</p>
<p><strong>&lt;script&gt;<br>
  ytEmbed.init({'block':'youtubeDiv','type':'search','q':'baby laughing'});<br>
  &lt;/script&gt;</strong></p>
<p>This piece of script is added below your &lt;div id=&quot;youtubeDiv&gt;&lt;/div&gt;.</p>

</div>
<hr color=red>
<hr color=white>
<hr color=blue>
<a href=www.yvoschaap.com target=_blank>yvoschaap.com</a>
<hr color=blue>
<hr color=white>
<hr color=red>
	-->


		</div>



 	<div id="kov_old">
		<div>
			old:  kov_old
			</div>
		<button v-on:click="showhide_kov_old">showhide_kov_old</button>
		<img v-on:click="showhide_kov_old" src="imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_old1" src="imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_old2" src="imgs/btn/kow.png" >

		<div v-show="collapsed" class="detail_old">	

			old
			<hr>
			<a href=https://meet.jit.si/old class="thumbnail" target=_blank>
			<div id="drag"> old:<br />
				<img src="/images/jtf/jtf_takes/jtf29_eagle_north.png" alt="jtf29_eagle_north" width="50" class="drg"/>

				<div class="drg"><h1>konet llc </h1>
					<pre>timejask jkwii</pre>
					<img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
					<img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
					<pre>timesak skwii</pre>
					</div>

					<img height=200 src=/imgs/links/tn/tn_meet.png border=0>
					<span><img height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
					</a>
				<div id="drag"> old:<br />
					<a class="drg" href=/imgs/links/warning_light.gif class="thumbnail" target=_blank>
						<img height=200 src=/imgs/links/warning_light.gif border=0>
						<span><img src=/links/warning_light.gif border=0></span>
						</a>
					</div>
					</div>
				</div>	
			<hr>


			</div>
		</div>

	<script>var kov_old = new Vue({ el: "#kov_old",
		data: {collapsed: false},
		methods: {
			showhide_kov_old: function() {
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family

//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
				},
			showhide_kov_old1: function() {
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				},
			showhide_kov_old2: function() {
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				}
			}
		}); 
		</script>


	<div id="kov_av">
		<div>
			av:  kov_av
			</div>
		<button v-on:click="showhide_kov_av">showhide_kov_av</button>
		<img v-on:click="showhide_kov_av" src="imgs/btn/koeye.png" >
		<img v-on:click="showhide_kov_av1" src="imgs/btn/kob.png" >
		<img v-on:click="showhide_kov_av2" src="imgs/btn/kow.png" >

		<div v-show="collapsed" class="detail_av">	

			av
			<hr>
			<div id="drag"> old:<br />

				<div class="drg"><h1>konet llc </h1>
					<pre>timejask jkwii</pre>
					<img class="drg" src="/imgs/btn/ko.png" alt="ko.png" width="50" >
					<img class="drg" src="/imgs/btn/ok.png" alt="ok.png" width="50" >
					<pre>timesak skwii</pre>
					</div>

					<img height=200 src=/imgs/links/tn/tn_meet.png border=0>
					<span><img height=400 src=/imgs/links/tn/tn_meet.png border=0></span>
					</a>
				<div id="drag"> old:<br />
					<a class="drg" href=/imgs/links/warning_light.gif class="thumbnail" target=_blank>
						<img height=200 src=/imgs/links/warning_light.gif border=0>
						<span><img src=/links/warning_light.gif border=0></span>
						</a>
					</div>
					</div>
				</div>	
			<hr>


			</div>
		</div>

	<script>var kov_av = new Vue({ el: "#kov_av",
		data: {collapsed: false},
		methods: {
			showhide_kov_av: function() {
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				document.getElementById("kov_konet").style.font = "italic bold 20px arial,serif"; 
//				font-style font-variant font-weight font-size line-height font-family

//				document.body.style.background = "darkslategrey";
//				document.body.style.color = "black";
//				document.body.style.fontfamily = "yokkmokkOT";
//				document.body.style.fontsize = "24pt";
				},
			showhide_kov_av1: function() {
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				},
			showhide_kov_av2: function() {
				if (!this.collapsed) this.collapsed = true;
				else this.collapsed = false;
				}
			}
		}); 
		</script>


	<hr color=black>
	<hr color=red>
	<hr color=white>
	<hr color=blue>
	<h2>jax<h2>
	<button onclick="jax('jax.html');" >jax</button>
	<button onclick="jax('jax1.html');" >jax1</button>
	<button onclick="jax('jax2.html');" >jax2</button>
	<button onclick="jax('jax.php');" >jaxphp</button>
	<div id="div_jax"></div>
	<script type="text/javascript">
			var default_jaxurl = "jax.html";
			var jaxurl = default_jaxurl;
//			alert( "BUGS_5120 jax default_jaxurl="+default_jaxurl );
//			alert( "BUGS_5120 jax jaxurl="+jaxurl );
			function jax(jaxurl) {
				$.ajax({
					url: jaxurl,
					context: document.body,
					success: function(responseText) {
						alert( "BUGS_5141 jax responseText="+responseText );
						$("#div_jax").html(responseText);
						$("#div_jax").find("script").each(function(i) {
						eval($(this).text());
						alert( "BUGS_5142 jax responseText="+responseText );
						});
					}
				});
			};
		</script>

<!--
jax.html
	<p class="ajax-result info">
		jax.html
		The contents of this message were loaded via Ajax.
		A piece of JavaScript also included in the Ajax responseText
		will change the background color of this message in a few seconds.
		</p>
	<script id="script_jaxnew" type="text/javascript">
		var timerId = setTimeout(function() {
			$("#div_jax")
				.find("p")
				.removeClass("info")
				.addClass("success");
			}, 7000);
		</script>
	-->
	<hr color=black>
	<hr color=red>
	<hr color=white>
	<hr color=blue>
	</body>
	</html>
av.html
ht.html
kc.html
ko.html
pl.html
py.html
sl.html
tl.html
vu.html
yt.html
//


koh5_pano



Your browser does not support the HTML5 canvas element.


Drag mouse to navigate.

Navigation





17.Aug.2010, Martin Wengenmayer