DIR : /home/kozerus/public_html/ko/ko_tl.html

/home/kozerus/public_html/ko

<!DOCTYPE html>
	<head>
		<title>index_tl.html 20190112_0400 width=1400</title>
<!--        
					width:		'1400',
		<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_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_new {          
			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="/js/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_hoverdate" >
		var app2 = new Vue({el: '#v_hoverdate',
			data: {
				message: 'hoverdate ' + new Date().toLocaleString()
				}
			})
		</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_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 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/"
		var slid_default = "./sl/"
		var avid_default = "./av/"



		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( 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_350 tlid=" + tlid );
			}
		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( 'avid' )) {
			var avid=url.search.replace('?avid=','' );	
//			alert( "BUGS_350 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>

	<div id="div_pn" >
	        <script id="script_pn_mycontainer"  type="text/javascript"> 
			<h2>pn</h2
			</script>
		</div>
	<div id="div_pn" >
	        <script id="script_sl_mycontainer"  type="text/javascript"> 
			<h2>sl</h2>
			</script>
		</div>
	<div id="div_pn" >
	        <script id="script_av_mycontainer"  type="text/javascript"> 
			<h2>av</h2>
			</script>
		</div>
	
	<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
//		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">
//				alert( "bugs_1529 view="+tl_view+" tl_code="+tl_code+" tl_fmt="+tl_fmt+" tl_num="+tl_num+" tl_file=" );
//				alert( "BUGS_1530  url_search=".url.search." tl_num=".tl_num )
//				tl_addchild();

//				args=ko_args();
//				ko_view=args[0];
//				ko_code=args[1];
//				ko_fmt=args[2];
//				ko_num=args[3];
//				ko_file=args[4];
//				ko_file=ko_isfile(ko_file);
//				alert( "bugs_1538 view="+ko_view+" ko_code="+ko_code+" ko_fmt="+ko_fmt+" ko_num="+ko_num+" ko_file="+ko_file );

//				if( ko_view == "tl" ) {tl_source=tl_files[ 0 ];
//				if( ko_fmt == "json" ) {tl_source=tl_files[ ko_code ];
//				if( ko_fmt == "jsn" ) {tl_source=tl_jsons[ ko_code ];
//				if( ko_fmt == "f" ) {tl_source=ko_file;}
//				if( ko_fmt == "fil" ) {tl_source=ko_file;}
//				if( ko_fmt == "file" ) {tl_source=ko_file;}
//				if( ko_num != "" ) {
//					if( ko_fmt == "json" ) { tl_source=tl_files[ ko_num ]; }
//					if( ko_fmt == "jsn" ) { tl_source=tl_jsons[ ko_num ]; }
//					}

				tl_j=0;
//				ko_num=3;
				ko_num=0;
//				tl_source=tl_jsons[ko_num];
//				tl_source=tl_files[ko_num];
//				tl_source="tl.json";

//				alert( "bugs_1560 view="+ko_view+" ko_code="+ko_code+" ko_fmt="+ko_fmt+" ko_num="+ko_num+" ko_file="+ko_file );
//				alert( "bugs_1561 tl_source="+tl_source+" ko_code="+ko_code+" ko_fmt="+ko_fmt+" ko_num="+ko_num+" ko_file="+ko_file );

//				tl_source=tl_jsons[ tl_num ];
//				tl_source=tl_files[ 40 ];
//				tl_source=tl_b64s[1];
//				tl_source=btoa(tl_b64s[0]);
//				tl_source=tl_b64s[0];
//				tl_source="tl_konet.json";
//				tl_source="./tl/json/tl.json";
//				tl_source="./tl/json/tl_test9.json";
//				tl_source="./tl/json/tl.json";

//				alert( "bugs_1561 tl_source="+tl_source );

			$(document).ready(function() {
				createStoryJS({
					type:		'timeline',
					width:		'1400',
					height:		'800',
//					source:		'tl_test9.json',
//					source:		tl_files[tl_f];
//					source:		tl_data[tl_num],
//					source:		'./tl/json/tl.json',
					source:		tl_source,
					embed_id:	'my-timeline',
					debug:		true
				});
			});

			</script>



	</head>
<body>
<!--
	<div id="v_hoverdate">
		<span v-bind:title="message">hoverdate</span>
		</div>
	-->

	<h1>preview timline 20190109_2000</h1>
	<a href=index_tl.html target=_blank>
		<img name="index_tl_png" height=50 src="/imgs/btn/koeye.png">
		</a>

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



	<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( "bugs177 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>







	<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>

<body>


	<button type="button" onclick="script_tllist()">script_tllist</button>

	<button type="button" onclick="script_zmlist()">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()"> 
		<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_tllist">
		<h1>div_tllist</h1>
		<p>Child_tl 1</p>
		<p>Child_tl 2</p>	
		</div>

	<div id="div_zmlist">
		<h1>div_zmlist</h1>
		<p>Child_zm 1</p>
		<p>Child_zm 2</p>	
		</div>

<!--
	<div id="div_addchild_zm" >
		<h1>div_addchild_zm</h1>
		addchild_zm <br>
		</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_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_tl.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_tl.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_zmlist" >
			var zmlist = new Array();

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

			function script_zmlist_load() {
			var z=0;
			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_tl.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>/ko/index.html 20230219_1030  rm div_??</title>

<!--
	<title>/ko/index.html 20230217_1330 link file plupload.html </title>
	<title>/ko/index.html 20230217_0330 ?lists=items contacts letter leds postturtles monkeytraps floods coffee </title>
	<title>/ko/index.html 20230217_0030 div_dd </title>
	<title>/ko/index.html 20230216_2230 div_dd </title>
	<title>/ko/index.html 20230213_1011 topnav </title>
	<title>/ko/index.html 20230212_1500 topnav </title>
	<title>/ko/index.html 20230212_1430 ko_mobile.html </title>
	<title>/ko/index.html 20230212_0945 </title>
	<title>/ko/index.html 20230210_1830 </title>
	<title>/ko/index.html 20230208_1600 jax files</title>
	<title>/ko/index.html 20230208_0900 contacts() items() pre</title>
	<title>/ko/index.html 20230207_1630 contacts() items() pre</title>
	<title>/ko/index.html 20230206_1730 contacts() items() pre</title>
	<title>/ko/index.html 20230206_1715 ../ko/ko_toggles.html ../js/wz/wz_scripts.js</title>
	<title>/ko/help.html 20230127_0127</title>
	-->

<!-- js fileupload
	let file = document.getElementById('input').files[0];
	let formData = new FormData();

	formData.append('file', file);
	fetch('/upload/image', {method: "POST", body: formData});

	-->


	<script id=script_ddtexttip>
// <!--

/*
Textual Tooltip Script- 
(c) Dynamic Drive (www.dynamicdrive.com)
For full source code, installation instructions,
100's more DHTML scripts, and Terms Of
Use, visit dynamicdrive.com
*/


var content=new Array()
//change the array below to the text associated with your links Expand or contract the array, depending on how many links you have
content[0]='<br><big><b>Menus and navigation systems</b></big><br>Click here for DHTML scripts that help enhance your site\'s navigability, such as collapsible menus, sliding menu bars etc.'
content[1]='<br><big><b>Special document effects</b></big><br>With the advent of DHTML, webpages are one step closer to its cousin, TV, in terms of special effects...'
content[2]='<br><big><b>Scrollers</b></big><br>Up until now, adding a scroller or tickertape to your website usually meant using a slow Java applet. Not anymore. Click here for DHTML scrollers that accomplish the same task with minimal download time.'
content[3]='<br><big><b>Image effects</b></big><br>Add lightweight effects to your existing images using these scripts. Make them fly, light up, turn static, all without paying the cost of slow downloading time.'
content[4]='<br><big><b>Links and buttons</b></big><br>Add tooltips to your text links, rollover effects to your form buttons, keyboard features to your document, and more.'
content[5]='<br><big><b>Dynamic clocks and dates</b></big><br>Time is never static, so why should your time script be? Enter for DHTML scripts that actually understand this simple truth.'
content[6]='<br><big><b>Text animations</b></big><br>Text have been silent for too long- DHTML promises to free them, with flying text, typing text, dragable text, and more.'
content[7]='<br><big><b>Browser window</b></big><br>Click here scripts related to the browser window and frames.'
content[8]='<br><big><b>Other</b></big><br>All scripts that don\'t comfortably fit in any of the above categories go here...'
content[9]='<br><big><b>Other</b></big><br>test_01...<hr color=white><img id=img_item_9 title="          item_9" src=/fb/pages/1.jpg height=400>'

content[10]='<br><big><b>Other</b></big><br>test_02...<hr color=white><img id=img_item_10 title="          item_10" src=/fb/jtfdcr/pages/10.jpg height=400>'
content[11]='<br><big><b>Other</b></big><br>test_03... <hr color=white><img id=img_item_11 title="          item_11" src=/fb/jtfdcr/pages/11.jpg height=400>'


		function changetext(whichcontent) {
			document.getElementById("div_descriptions").innerHTML=whichcontent
			}

//-->
		</script id=script_ddtexttip_end>



	<style id="style_mobile">
/* Style the navigation menu */
/* Hide the links inside the navigation menu (except for logo/home) */
/* Style navigation menu links */
/* Style the hamburger menu */
/* Add a grey background color on mouse-over */
/* Style the active link (or home/logo) */
		.topnav {
			overflow: hidden;
			background-color: #333;
			position: relative;
			}
		.topnav #myLinks {display: none;}
		.topnav a {
			color: white; 
			padding: 14px 16px;
			text-decoration: none;
			font-size: 17px;
			display: block;
			}
		.topnav a.icon {
			background: black;
			display: block;
			position: absolute;
			right: 0;
			top: 0;
			}
		.topnav a:hover {
			background-color: #ddd;
			color: black;
			}
		.active {
			background-color: #4CAF50;
			color: white;
			} 
		</style>

	<script id="script_mobile">
/* Toggle between showing and hiding the navigation menu links when the user clicks on the hamburger menu / bar icon */
		function myFunction() {
			var x = document.getElementById("myLinks");
			if (x.style.display === "block") {
				x.style.display = "none";
				} 
			else {
				x.style.display = "block";
				}
			} 
		</script>



	<script id="script_ko_mobile_links">
/* Toggle between showing and hiding the navigation menu links when the user clicks on the hamburger menu / bar icon */
		function myFunction() {
			var x = document.getElementById("myLinks");
			if (x.style.display === "block") {
				x.style.display = "none";
				} 
			else {
				x.style.display = "block";
  				}
			} 
		</script id=script_ko_mobile_links_end>



	<script id="fb_extras_jquery_min_17_js" src='data:/text/plain;base64,LyohIGpRdWVyeSB2MS43IGpxdWVyeS5jb20gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gY0EoYSl7cmV0dXJuIGYuaXNXaW5kb3coYSk/YTphLm5vZGVUeXBlPT09OT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1mdW5jdGlvbiBjeChhKXtpZighY21bYV0pe3ZhciBiPWMuYm9keSxkPWYoIjwiK2ErIj4iKS5hcHBlbmRUbyhiKSxlPWQuY3NzKCJkaXNwbGF5Iik7ZC5yZW1vdmUoKTtpZihlPT09Im5vbmUifHxlPT09IiIpe2NufHwoY249Yy5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSxjbi5mcmFtZUJvcmRlcj1jbi53aWR0aD1jbi5oZWlnaHQ9MCksYi5hcHBlbmRDaGlsZChjbik7aWYoIWNvfHwhY24uY3JlYXRlRWxlbWVudCljbz0oY24uY29udGVudFdpbmRvd3x8Y24uY29udGVudERvY3VtZW50KS5kb2N1bWVudCxjby53cml0ZSgoYy5jb21wYXRNb2RlPT09IkNTUzFDb21wYXQiPyI8IWRvY3R5cGUgaHRtbD4iOiIiKSsiPGh0bWw+PGJvZHk+IiksY28uY2xvc2UoKTtkPWNvLmNyZWF0ZUVsZW1lbnQoYSksY28uYm9keS5hcHBlbmRDaGlsZChkKSxlPWYuY3NzKGQsImRpc3BsYXkiKSxiLnJlbW92ZUNoaWxkKGNuKX1jbVthXT1lfXJldHVybiBjbVthXX1mdW5jdGlvbiBjdyhhLGIpe3ZhciBjPXt9O2YuZWFjaChjcy5jb25jYXQuYXBwbHkoW10sY3Muc2xpY2UoMCxiKSksZnVuY3Rpb24oKXtjW3RoaXNdPWF9KTtyZXR1cm4gY31mdW5jdGlvbiBjdigpe2N0PWJ9ZnVuY3Rpb24gY3UoKXtzZXRUaW1lb3V0KGN2LDApO3JldHVybiBjdD1mLm5vdygpfWZ1bmN0aW9uIGNsKCl7dHJ5e3JldHVybiBuZXcgYS5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpfWNhdGNoKGIpe319ZnVuY3Rpb24gY2soKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gY2UoYSxjKXthLmRhdGFGaWx0ZXImJihjPWEuZGF0YUZpbHRlcihjLGEuZGF0YVR5cGUpKTt2YXIgZD1hLmRhdGFUeXBlcyxlPXt9LGcsaCxpPWQubGVuZ3RoLGosaz1kWzBdLGwsbSxuLG8scDtmb3IoZz0xO2c8aTtnKyspe2lmKGc9PT0xKWZvcihoIGluIGEuY29udmVydGVycyl0eXBlb2YgaD09InN0cmluZyImJihlW2gudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2hdKTtsPWssaz1kW2ddO2lmKGs9PT0iKiIpaz1sO2Vsc2UgaWYobCE9PSIqIiYmbCE9PWspe209bCsiICIrayxuPWVbbV18fGVbIiogIitrXTtpZighbil7cD1iO2ZvcihvIGluIGUpe2o9by5zcGxpdCgiICIpO2lmKGpbMF09PT1sfHxqWzBdPT09IioiKXtwPWVbalsxXSsiICIra107aWYocCl7bz1lW29dLG89PT0hMD9uPXA6cD09PSEwJiYobj1vKTticmVha319fX0hbiYmIXAmJmYuZXJyb3IoIk5vIGNvbnZlcnNpb24gZnJvbSAiK20ucmVwbGFjZSgiICIsIiB0byAiKSksbiE9PSEwJiYoYz1uP24oYyk6cChvKGMpKSl9fXJldHVybiBjfWZ1bmN0aW9uIGNkKGEsYyxkKXt2YXIgZT1hLmNvbnRlbnRzLGY9YS5kYXRhVHlwZXMsZz1hLnJlc3BvbnNlRmllbGRzLGgsaSxqLGs7Zm9yKGkgaW4gZylpIGluIGQmJihjW2dbaV1dPWRbaV0pO3doaWxlKGZbMF09PT0iKiIpZi5zaGlmdCgpLGg9PT1iJiYoaD1hLm1pbWVUeXBlfHxjLmdldFJlc3BvbnNlSGVhZGVyKCJjb250ZW50LXR5cGUiKSk7aWYoaClmb3IoaSBpbiBlKWlmKGVbaV0mJmVbaV0udGVzdChoKSl7Zi51bnNoaWZ0KGkpO2JyZWFrfWlmKGZbMF1pbiBkKWo9ZlswXTtlbHNle2ZvcihpIGluIGQpe2lmKCFmWzBdfHxhLmNvbnZlcnRlcnNbaSsiICIrZlswXV0pe2o9aTticmVha31rfHwoaz1pKX1qPWp8fGt9aWYoail7aiE9PWZbMF0mJmYudW5zaGlmdChqKTtyZXR1cm4gZFtqXX19ZnVuY3Rpb24gY2MoYSxiLGMsZCl7aWYoZi5pc0FycmF5KGIpKWYuZWFjaChiLGZ1bmN0aW9uKGIsZSl7Y3x8YkcudGVzdChhKT9kKGEsZSk6Y2MoYSsiWyIrKHR5cGVvZiBlPT0ib2JqZWN0Inx8Zi5pc0FycmF5KGUpP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKCFjJiZiIT1udWxsJiZ0eXBlb2YgYj09Im9iamVjdCIpZm9yKHZhciBlIGluIGIpY2MoYSsiWyIrZSsiXSIsYltlXSxjLGQpO2Vsc2UgZChhLGIpfWZ1bmN0aW9uIGNiKGEsYyl7dmFyIGQsZSxnPWYuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IoZCBpbiBjKWNbZF0hPT1iJiYoKGdbZF0/YTplfHwoZT17fSkpW2RdPWNbZF0pO2UmJmYuZXh0ZW5kKCEwLGEsZSl9ZnVuY3Rpb24gY2EoYSxjLGQsZSxmLGcpe2Y9Znx8Yy5kYXRhVHlwZXNbMF0sZz1nfHx7fSxnW2ZdPSEwO3ZhciBoPWFbZl0saT0wLGo9aD9oLmxlbmd0aDowLGs9YT09PWJWLGw7Zm9yKDtpPGomJihrfHwhbCk7aSsrKWw9aFtpXShjLGQsZSksdHlwZW9mIGw9PSJzdHJpbmciJiYoIWt8fGdbbF0/bD1iOihjLmRhdGFUeXBlcy51bnNoaWZ0KGwpLGw9Y2EoYSxjLGQsZSxsLGcpKSk7KGt8fCFsKSYmIWdbIioiXSYmKGw9Y2EoYSxjLGQsZSwiKiIsZykpO3JldHVybiBsfWZ1bmN0aW9uIGJfKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe3R5cGVvZiBiIT0ic3RyaW5nIiYmKGM9YixiPSIqIik7aWYoZi5pc0Z1bmN0aW9uKGMpKXt2YXIgZD1iLnRvTG93ZXJDYXNlKCkuc3BsaXQoYlIpLGU9MCxnPWQubGVuZ3RoLGgsaSxqO2Zvcig7ZTxnO2UrKyloPWRbZV0saj0vXlwrLy50ZXN0KGgpLGomJihoPWguc3Vic3RyKDEpfHwiKiIpLGk9YVtoXT1hW2hdfHxbXSxpW2o/InVuc2hpZnQiOiJwdXNoIl0oYyl9fX1mdW5jdGlvbiBiRShhLGIsYyl7dmFyIGQ9Yj09PSJ3aWR0aCI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxlPWI9PT0id2lkdGgiP2J6OmJBO2lmKGQ+MCl7YyE9PSJib3JkZXIiJiZmLmVhY2goZSxmdW5jdGlvbigpe2N8fChkLT1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK3RoaXMpKXx8MCksYz09PSJtYXJnaW4iP2QrPXBhcnNlRmxvYXQoZi5jc3MoYSxjK3RoaXMpKXx8MDpkLT1wYXJzZUZsb2F0KGYuY3NzKGEsImJvcmRlciIrdGhpcysiV2lkdGgiKSl8fDB9KTtyZXR1cm4gZCsicHgifWQ9YkIoYSxiLGIpO2lmKGQ8MHx8ZD09bnVsbClkPWEuc3R5bGVbYl18fDA7ZD1wYXJzZUZsb2F0KGQpfHwwLGMmJmYuZWFjaChlLGZ1bmN0aW9uKCl7ZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJwYWRkaW5nIit0aGlzKSl8fDAsYyE9PSJwYWRkaW5nIiYmKGQrPXBhcnNlRmxvYXQoZi5jc3MoYSwiYm9yZGVyIit0aGlzKyJXaWR0aCIpKXx8MCksYz09PSJtYXJnaW4iJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLGMrdGhpcykpfHwwKX0pO3JldHVybiBkKyJweCJ9ZnVuY3Rpb24gYnIoYSxiKXtiLnNyYz9mLmFqYXgoe3VybDpiLnNyYyxhc3luYzohMSxkYXRhVHlwZToic2NyaXB0In0pOmYuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UoYmksIi8qJDAqLyIpKSxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBicShhKXt2YXIgYj0oYS5ub2RlTmFtZXx8IiIpLnRvTG93ZXJDYXNlKCk7Yj09PSJpbnB1dCI/YnAoYSk6YiE9PSJzY3JpcHQiJiZ0eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCImJmYuZ3JlcChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLGJwKX1mdW5jdGlvbiBicChhKXtpZihhLnR5cGU9PT0iY2hlY2tib3gifHxhLnR5cGU9PT0icmFkaW8iKWEuZGVmYXVsdENoZWNrZWQ9YS5jaGVja2VkfWZ1bmN0aW9uIGJvKGEpe3JldHVybiB0eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCI/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOnR5cGVvZiBhLnF1ZXJ5U2VsZWN0b3JBbGwhPSJ1bmRlZmluZWQiP2EucXVlcnlTZWxlY3RvckFsbCgiKiIpOltdfWZ1bmN0aW9uIGJuKGEsYil7dmFyIGM7aWYoYi5ub2RlVHlwZT09PTEpe2IuY2xlYXJBdHRyaWJ1dGVzJiZiLmNsZWFyQXR0cmlidXRlcygpLGIubWVyZ2VBdHRyaWJ1dGVzJiZiLm1lcmdlQXR0cmlidXRlcyhhKSxjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihjPT09Im9iamVjdCIpYi5vdXRlckhUTUw9YS5vdXRlckhUTUw7ZWxzZSBpZihjIT09ImlucHV0Inx8YS50eXBlIT09ImNoZWNrYm94IiYmYS50eXBlIT09InJhZGlvIil7aWYoYz09PSJvcHRpb24iKWIuc2VsZWN0ZWQ9YS5kZWZhdWx0U2VsZWN0ZWQ7ZWxzZSBpZihjPT09ImlucHV0Inx8Yz09PSJ0ZXh0YXJlYSIpYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWV9ZWxzZSBhLmNoZWNrZWQmJihiLmRlZmF1bHRDaGVja2VkPWIuY2hlY2tlZD1hLmNoZWNrZWQpLGIudmFsdWUhPT1hLnZhbHVlJiYoYi52YWx1ZT1hLnZhbHVlKTtiLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pfX1mdW5jdGlvbiBibShhLGIpe2lmKGIubm9kZVR5cGU9PT0xJiYhIWYuaGFzRGF0YShhKSl7dmFyIGMsZCxlLGc9Zi5fZGF0YShhKSxoPWYuX2RhdGEoYixnKSxpPWcuZXZlbnRzO2lmKGkpe2RlbGV0ZSBoLmhhbmRsZSxoLmV2ZW50cz17fTtmb3IoYyBpbiBpKWZvcihkPTAsZT1pW2NdLmxlbmd0aDtkPGU7ZCsrKWYuZXZlbnQuYWRkKGIsYysoaVtjXVtkXS5uYW1lc3BhY2U/Ii4iOiIiKStpW2NdW2RdLm5hbWVzcGFjZSxpW2NdW2RdLGlbY11bZF0uZGF0YSl9aC5kYXRhJiYoaC5kYXRhPWYuZXh0ZW5kKHt9LGguZGF0YSkpfX1mdW5jdGlvbiBibChhLGIpe3JldHVybiBmLm5vZGVOYW1lKGEsInRhYmxlIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiBYKGEpe3ZhciBiPVkuc3BsaXQoIiAiKSxjPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2lmKGMuY3JlYXRlRWxlbWVudCl3aGlsZShiLmxlbmd0aCljLmNyZWF0ZUVsZW1lbnQoYi5wb3AoKSk7cmV0dXJuIGN9ZnVuY3Rpb24gVyhhLGIsYyl7Yj1ifHwwO2lmKGYuaXNGdW5jdGlvbihiKSlyZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXt2YXIgZT0hIWIuY2FsbChhLGQsYSk7cmV0dXJuIGU9PT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gYT09PWI9PT1jfSk7aWYodHlwZW9mIGI9PSJzdHJpbmciKXt2YXIgZD1mLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PTF9KTtpZihSLnRlc3QoYikpcmV0dXJuIGYuZmlsdGVyKGIsZCwhYyk7Yj1mLmZpbHRlcihiLGQpfXJldHVybiBmLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiBmLmluQXJyYXkoYSxiKT49MD09PWN9KX1mdW5jdGlvbiBWKGEpe3JldHVybiFhfHwhYS5wYXJlbnROb2RlfHxhLnBhcmVudE5vZGUubm9kZVR5cGU9PT0xMX1mdW5jdGlvbiBOKCl7cmV0dXJuITB9ZnVuY3Rpb24gTSgpe3JldHVybiExfWZ1bmN0aW9uIG4oYSxiLGMpe3ZhciBkPWIrImRlZmVyIixlPWIrInF1ZXVlIixnPWIrIm1hcmsiLGg9Zi5fZGF0YShhLGQpO2gmJihjPT09InF1ZXVlInx8IWYuX2RhdGEoYSxlKSkmJihjPT09Im1hcmsifHwhZi5fZGF0YShhLGcpKSYmc2V0VGltZW91dChmdW5jdGlvbigpeyFmLl9kYXRhKGEsZSkmJiFmLl9kYXRhKGEsZykmJihmLnJlbW92ZURhdGEoYSxkLCEwKSxoLmZpcmUoKSl9LDApfWZ1bmN0aW9uIG0oYSl7Zm9yKHZhciBiIGluIGEpe2lmKGI9PT0iZGF0YSImJmYuaXNFbXB0eU9iamVjdChhW2JdKSljb250aW51ZTtpZihiIT09InRvSlNPTiIpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gbChhLGMsZCl7aWYoZD09PWImJmEubm9kZVR5cGU9PT0xKXt2YXIgZT0iZGF0YS0iK2MucmVwbGFjZShrLCItJDEiKS50b0xvd2VyQ2FzZSgpO2Q9YS5nZXRBdHRyaWJ1dGUoZSk7aWYodHlwZW9mIGQ9PSJzdHJpbmciKXt0cnl7ZD1kPT09InRydWUiPyEwOmQ9PT0iZmFsc2UiPyExOmQ9PT0ibnVsbCI/bnVsbDpmLmlzTnVtZXJpYyhkKT9wYXJzZUZsb2F0KGQpOmoudGVzdChkKT9mLnBhcnNlSlNPTihkKTpkfWNhdGNoKGcpe31mLmRhdGEoYSxjLGQpfWVsc2UgZD1ifXJldHVybiBkfWZ1bmN0aW9uIGgoYSl7dmFyIGI9Z1thXT17fSxjLGQ7YT1hLnNwbGl0KC9ccysvKTtmb3IoYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyliW2FbY11dPSEwO3JldHVybiBifXZhciBjPWEuZG9jdW1lbnQsZD1hLm5hdmlnYXRvcixlPWEubG9jYXRpb24sZj1mdW5jdGlvbigpe2Z1bmN0aW9uIEsoKXtpZighZS5pc1JlYWR5KXt0cnl7Yy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKX1jYXRjaChhKXtzZXRUaW1lb3V0KEssMSk7cmV0dXJufWUucmVhZHkoKX19dmFyIGU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IGUuZm4uaW5pdChhLGIsaCl9LGY9YS5qUXVlcnksZz1hLiQsaCxpPS9eKD86W14jPF0qKDxbXHdcV10rPilbXj5dKiR8IyhbXHdcLV0qKSQpLyxqPS9cUy8saz0vXlxzKy8sbD0vXHMrJC8sbT0vXGQvLG49L148KFx3KylccypcLz8+KD86PFwvXDE+KT8kLyxvPS9eW1xdLDp7fVxzXSokLyxwPS9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2cscT0vIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2cscj0vKD86Xnw6fCwpKD86XHMqXFspKy9nLHM9Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8sdD0vKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8sdT0vKG1zaWUpIChbXHcuXSspLyx2PS8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sdz0vLShbYS16XXxbMC05XSkvaWcseD0vXi1tcy0vLHk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYisiIikudG9VcHBlckNhc2UoKX0sej1kLnVzZXJBZ2VudCxBLEIsQyxEPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsRT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEY9QXJyYXkucHJvdG90eXBlLnB1c2gsRz1BcnJheS5wcm90b3R5cGUuc2xpY2UsSD1TdHJpbmcucHJvdG90eXBlLnRyaW0sST1BcnJheS5wcm90b3R5cGUuaW5kZXhPZixKPXt9O2UuZm49ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmUsaW5pdDpmdW5jdGlvbihhLGQsZil7dmFyIGcsaCxqLGs7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSl7dGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKGE9PT0iYm9keSImJiFkJiZjLmJvZHkpe3RoaXMuY29udGV4dD1jLHRoaXNbMF09Yy5ib2R5LHRoaXMuc2VsZWN0b3I9YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT0ic3RyaW5nIil7YS5jaGFyQXQoMCkhPT0iPCJ8fGEuY2hhckF0KGEubGVuZ3RoLTEpIT09Ij4ifHxhLmxlbmd0aDwzP2c9aS5leGVjKGEpOmc9W251bGwsYSxudWxsXTtpZihnJiYoZ1sxXXx8IWQpKXtpZihnWzFdKXtkPWQgaW5zdGFuY2VvZiBlP2RbMF06ZCxrPWQ/ZC5vd25lckRvY3VtZW50fHxkOmMsaj1uLmV4ZWMoYSksaj9lLmlzUGxhaW5PYmplY3QoZCk/KGE9W2MuY3JlYXRlRWxlbWVudChqWzFdKV0sZS5mbi5hdHRyLmNhbGwoYSxkLCEwKSk6YT1bay5jcmVhdGVFbGVtZW50KGpbMV0pXTooaj1lLmJ1aWxkRnJhZ21lbnQoW2dbMV1dLFtrXSksYT0oai5jYWNoZWFibGU/ZS5jbG9uZShqLmZyYWdtZW50KTpqLmZyYWdtZW50KS5jaGlsZE5vZGVzKTtyZXR1cm4gZS5tZXJnZSh0aGlzLGEpfWg9Yy5nZXRFbGVtZW50QnlJZChnWzJdKTtpZihoJiZoLnBhcmVudE5vZGUpe2lmKGguaWQhPT1nWzJdKXJldHVybiBmLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWh9dGhpcy5jb250ZXh0PWMsdGhpcy5zZWxlY3Rvcj1hO3JldHVybiB0aGlzfXJldHVybiFkfHxkLmpxdWVyeT8oZHx8ZikuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGQpLmZpbmQoYSl9aWYoZS5pc0Z1bmN0aW9uKGEpKXJldHVybiBmLnJlYWR5KGEpO2Euc2VsZWN0b3IhPT1iJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpO3JldHVybiBlLm1ha2VBcnJheShhLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNyIsbGVuZ3RoOjAsc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBHLmNhbGwodGhpcywwKX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP3RoaXMudG9BcnJheSgpOmE8MD90aGlzW3RoaXMubGVuZ3RoK2FdOnRoaXNbYV19LHB1c2hTdGFjazpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5jb25zdHJ1Y3RvcigpO2UuaXNBcnJheShhKT9GLmFwcGx5KGQsYSk6ZS5tZXJnZShkLGEpLGQucHJldk9iamVjdD10aGlzLGQuY29udGV4dD10aGlzLmNvbnRleHQsYj09PSJmaW5kIj9kLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrKHRoaXMuc2VsZWN0b3I/IiAiOiIiKStjOmImJihkLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrIi4iK2IrIigiK2MrIikiKTtyZXR1cm4gZH0sZWFjaDpmdW5jdGlvbihhLGIpe3JldHVybiBlLmVhY2godGhpcyxhLGIpfSxyZWFkeTpmdW5jdGlvbihhKXtlLmJpbmRSZWFkeSgpLEIuYWRkKGEpO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbihhKXtyZXR1cm4gYT09PS0xP3RoaXMuc2xpY2UoYSk6dGhpcy5zbGljZShhLCthKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhHLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLEcuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOkYsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LGUuZm4uaW5pdC5wcm90b3R5cGU9ZS5mbixlLmV4dGVuZD1lLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGMsZCxmLGcsaCxpPWFyZ3VtZW50c1swXXx8e30saj0xLGs9YXJndW1lbnRzLmxlbmd0aCxsPSExO3R5cGVvZiBpPT0iYm9vbGVhbiImJihsPWksaT1hcmd1bWVudHNbMV18fHt9LGo9MiksdHlwZW9mIGkhPSJvYmplY3QiJiYhZS5pc0Z1bmN0aW9uKGkpJiYoaT17fSksaz09PWomJihpPXRoaXMsLS1qKTtmb3IoO2o8aztqKyspaWYoKGE9YXJndW1lbnRzW2pdKSE9bnVsbClmb3IoYyBpbiBhKXtkPWlbY10sZj1hW2NdO2lmKGk9PT1mKWNvbnRpbnVlO2wmJmYmJihlLmlzUGxhaW5PYmplY3QoZil8fChnPWUuaXNBcnJheShmKSkpPyhnPyhnPSExLGg9ZCYmZS5pc0FycmF5KGQpP2Q6W10pOmg9ZCYmZS5pc1BsYWluT2JqZWN0KGQpP2Q6e30saVtjXT1lLmV4dGVuZChsLGgsZikpOmYhPT1iJiYoaVtjXT1mKX1yZXR1cm4gaX0sZS5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYil7YS4kPT09ZSYmKGEuJD1nKSxiJiZhLmpRdWVyeT09PWUmJihhLmpRdWVyeT1mKTtyZXR1cm4gZX0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9lLnJlYWR5V2FpdCsrOmUucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITAmJiEtLWUucmVhZHlXYWl0fHxhIT09ITAmJiFlLmlzUmVhZHkpe2lmKCFjLmJvZHkpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtlLmlzUmVhZHk9ITA7aWYoYSE9PSEwJiYtLWUucmVhZHlXYWl0PjApcmV0dXJuO0IuZmlyZVdpdGgoYyxbZV0pLGUuZm4udHJpZ2dlciYmZShjKS50cmlnZ2VyKCJyZWFkeSIpLnVuYmluZCgicmVhZHkiKX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCFCKXtCPWUuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpO2lmKGMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtpZihjLmFkZEV2ZW50TGlzdGVuZXIpYy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixDLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUucmVhZHksITEpO2Vsc2UgaWYoYy5hdHRhY2hFdmVudCl7Yy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixDKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGUucmVhZHkpO3ZhciBiPSExO3RyeXtiPWEuZnJhbWVFbGVtZW50PT1udWxsfWNhdGNoKGQpe31jLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYiYmSygpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZ0eXBlb2YgYT09Im9iamVjdCImJiJzZXRJbnRlcnZhbCJpbiBhfSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPW51bGwmJm0udGVzdChhKSYmIWlzTmFOKGEpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP1N0cmluZyhhKTpKW0QuY2FsbChhKV18fCJvYmplY3QifSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe2lmKCFhfHxlLnR5cGUoYSkhPT0ib2JqZWN0Inx8YS5ub2RlVHlwZXx8ZS5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIUUuY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhRS5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9dmFyIGQ7Zm9yKGQgaW4gYSk7cmV0dXJuIGQ9PT1ifHxFLmNhbGwoYSxkKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0sZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgYX0scGFyc2VKU09OOmZ1bmN0aW9uKGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nInx8IWIpcmV0dXJuIG51bGw7Yj1lLnRyaW0oYik7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKTtpZihvLnRlc3QoYi5yZXBsYWNlKHAsIkAiKS5yZXBsYWNlKHEsIl0iKS5yZXBsYWNlKHIsIiIpKSlyZXR1cm4obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiKSkoKTtlLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LHBhcnNlWE1MOmZ1bmN0aW9uKGMpe3ZhciBkLGY7dHJ5e2EuRE9NUGFyc2VyPyhmPW5ldyBET01QYXJzZXIsZD1mLnBhcnNlRnJvbVN0cmluZyhjLCJ0ZXh0L3htbCIpKTooZD1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGQuYXN5bmM9ImZhbHNlIixkLmxvYWRYTUwoYykpfWNhdGNoKGcpe2Q9Yn0oIWR8fCFkLmRvY3VtZW50RWxlbWVudHx8ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZlLmVycm9yKCJJbnZhbGlkIFhNTDogIitjKTtyZXR1cm4gZH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZqLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoeCwibXMtIikucmVwbGFjZSh3LHkpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGc9MCxoPWEubGVuZ3RoLGk9aD09PWJ8fGUuaXNGdW5jdGlvbihhKTtpZihkKXtpZihpKXtmb3IoZiBpbiBhKWlmKGMuYXBwbHkoYVtmXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuYXBwbHkoYVtnKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihpKXtmb3IoZiBpbiBhKWlmKGMuY2FsbChhW2ZdLGYsYVtmXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmNhbGwoYVtnXSxnLGFbZysrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpIP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOkguY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6KGErIiIpLnJlcGxhY2UoaywiIikucmVwbGFjZShsLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107aWYoYSE9bnVsbCl7dmFyIGQ9ZS50eXBlKGEpO2EubGVuZ3RoPT1udWxsfHxkPT09InN0cmluZyJ8fGQ9PT0iZnVuY3Rpb24ifHxkPT09InJlZ2V4cCJ8fGUuaXNXaW5kb3coYSk/Ri5jYWxsKGMsYSk6ZS5tZXJnZShjLGEpfXJldHVybiBjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihJKXJldHVybiBJLmNhbGwoYixhLGMpO2Q9Yi5sZW5ndGgsYz1jP2M8MD9NYXRoLm1heCgwLGQrYyk6YzowO2Zvcig7YzxkO2MrKylpZihjIGluIGImJmJbY109PT1hKXJldHVybiBjfXJldHVybi0xfSxtZXJnZTpmdW5jdGlvbihhLGMpe3ZhciBkPWEubGVuZ3RoLGU9MDtpZih0eXBlb2YgYy5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZj1jLmxlbmd0aDtlPGY7ZSsrKWFbZCsrXT1jW2VdO2Vsc2Ugd2hpbGUoY1tlXSE9PWIpYVtkKytdPWNbZSsrXTthLmxlbmd0aD1kO3JldHVybiBhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlO2M9ISFjO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllPSEhYihhW2ZdLGYpLGMhPT1lJiZkLnB1c2goYVtmXSk7cmV0dXJuIGR9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoPVtdLGk9MCxqPWEubGVuZ3RoLGs9YSBpbnN0YW5jZW9mIGV8fGohPT1iJiZ0eXBlb2Ygaj09Im51bWJlciImJihqPjAmJmFbMF0mJmFbai0xXXx8aj09PTB8fGUuaXNBcnJheShhKSk7aWYoaylmb3IoO2k8ajtpKyspZj1jKGFbaV0saSxkKSxmIT1udWxsJiYoaFtoLmxlbmd0aF09Zik7ZWxzZSBmb3IoZyBpbiBhKWY9YyhhW2ddLGcsZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO3JldHVybiBoLmNvbmNhdC5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7aWYodHlwZW9mIGM9PSJzdHJpbmciKXt2YXIgZD1hW2NdO2M9YSxhPWR9aWYoIWUuaXNGdW5jdGlvbihhKSlyZXR1cm4gYjt2YXIgZj1HLmNhbGwoYXJndW1lbnRzLDIpLGc9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShjLGYuY29uY2F0KEcuY2FsbChhcmd1bWVudHMpKSl9O2cuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxnLmd1aWR8fGUuZ3VpZCsrO3JldHVybiBnfSxhY2Nlc3M6ZnVuY3Rpb24oYSxjLGQsZixnLGgpe3ZhciBpPWEubGVuZ3RoO2lmKHR5cGVvZiBjPT0ib2JqZWN0Iil7Zm9yKHZhciBqIGluIGMpZS5hY2Nlc3MoYSxqLGNbal0sZixnLGQpO3JldHVybiBhfWlmKGQhPT1iKXtmPSFoJiZmJiZlLmlzRnVuY3Rpb24oZCk7Zm9yKHZhciBrPTA7azxpO2srKylnKGFba10sYyxmP2QuY2FsbChhW2tdLGssZyhhW2tdLGMpKTpkLGgpO3JldHVybiBhfXJldHVybiBpP2coYVswXSxjKTpifSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihhKXthPWEudG9Mb3dlckNhc2UoKTt2YXIgYj1zLmV4ZWMoYSl8fHQuZXhlYyhhKXx8dS5leGVjKGEpfHxhLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiZ2LmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmJbMV18fCIiLHZlcnNpb246YlsyXXx8IjAifX0sc3ViOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMpe3JldHVybiBuZXcgYS5mbi5pbml0KGIsYyl9ZS5leHRlbmQoITAsYSx0aGlzKSxhLnN1cGVyY2xhc3M9dGhpcyxhLmZuPWEucHJvdG90eXBlPXRoaXMoKSxhLmZuLmNvbnN0cnVjdG9yPWEsYS5zdWI9dGhpcy5zdWIsYS5mbi5pbml0PWZ1bmN0aW9uKGQsZil7ZiYmZiBpbnN0YW5jZW9mIGUmJiEoZiBpbnN0YW5jZW9mIGEpJiYoZj1hKGYpKTtyZXR1cm4gZS5mbi5pbml0LmNhbGwodGhpcyxkLGYsYil9LGEuZm4uaW5pdC5wcm90b3R5cGU9YS5mbjt2YXIgYj1hKGMpO3JldHVybiBhfSxicm93c2VyOnt9fSksZS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7SlsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KSxBPWUudWFNYXRjaCh6KSxBLmJyb3dzZXImJihlLmJyb3dzZXJbQS5icm93c2VyXT0hMCxlLmJyb3dzZXIudmVyc2lvbj1BLnZlcnNpb24pLGUuYnJvd3Nlci53ZWJraXQmJihlLmJyb3dzZXIuc2FmYXJpPSEwKSxqLnRlc3QoIsKgIikmJihrPS9eW1xzXHhBMF0rLyxsPS9bXHNceEEwXSskLyksaD1lKGMpLGMuYWRkRXZlbnRMaXN0ZW5lcj9DPWZ1bmN0aW9uKCl7Yy5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixDLCExKSxlLnJlYWR5KCl9OmMuYXR0YWNoRXZlbnQmJihDPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIiYmKGMuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQyksZS5yZWFkeSgpKX0pLHR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQmJmRlZmluZS5hbWQualF1ZXJ5JiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gZX0pO3JldHVybiBlfSgpLGc9e307Zi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT1hP2dbYV18fGgoYSk6e307dmFyIGM9W10sZD1bXSxlLGksaixrLGwsbT1mdW5jdGlvbihiKXt2YXIgZCxlLGcsaCxpO2ZvcihkPTAsZT1iLmxlbmd0aDtkPGU7ZCsrKWc9YltkXSxoPWYudHlwZShnKSxoPT09ImFycmF5Ij9tKGcpOmg9PT0iZnVuY3Rpb24iJiYoIWEudW5pcXVlfHwhby5oYXMoZykpJiZjLnB1c2goZyl9LG49ZnVuY3Rpb24oYixmKXtmPWZ8fFtdLGU9IWEubWVtb3J5fHxbYixmXSxpPSEwLGw9anx8MCxqPTAsaz1jLmxlbmd0aDtmb3IoO2MmJmw8aztsKyspaWYoY1tsXS5hcHBseShiLGYpPT09ITEmJmEuc3RvcE9uRmFsc2Upe2U9ITA7YnJlYWt9aT0hMSxjJiYoYS5vbmNlP2U9PT0hMD9vLmRpc2FibGUoKTpjPVtdOmQmJmQubGVuZ3RoJiYoZT1kLnNoaWZ0KCksby5maXJlV2l0aChlWzBdLGVbMV0pKSl9LG89e2FkZDpmdW5jdGlvbigpe2lmKGMpe3ZhciBhPWMubGVuZ3RoO20oYXJndW1lbnRzKSxpP2s9Yy5sZW5ndGg6ZSYmZSE9PSEwJiYoaj1hLG4oZVswXSxlWzFdKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe2lmKGMpe3ZhciBiPWFyZ3VtZW50cyxkPTAsZT1iLmxlbmd0aDtmb3IoO2Q8ZTtkKyspZm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspaWYoYltkXT09PWNbZl0pe2kmJmY8PWsmJihrLS0sZjw9bCYmbC0tKSxjLnNwbGljZShmLS0sMSk7aWYoYS51bmlxdWUpYnJlYWt9fXJldHVybiB0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7aWYoYyl7dmFyIGI9MCxkPWMubGVuZ3RoO2Zvcig7YjxkO2IrKylpZihhPT09Y1tiXSlyZXR1cm4hMH1yZXR1cm4hMX0sZW1wdHk6ZnVuY3Rpb24oKXtjPVtdO3JldHVybiB0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7Yz1kPWU9YjtyZXR1cm4gdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hY30sbG9jazpmdW5jdGlvbigpe2Q9YiwoIWV8fGU9PT0hMCkmJm8uZGlzYWJsZSgpO3JldHVybiB0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hZH0sZmlyZVdpdGg6ZnVuY3Rpb24oYixjKXtkJiYoaT9hLm9uY2V8fGQucHVzaChbYixjXSk6KCFhLm9uY2V8fCFlKSYmbihiLGMpKTtyZXR1cm4gdGhpc30sZmlyZTpmdW5jdGlvbigpe28uZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpO3JldHVybiB0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZX19O3JldHVybiBvfTt2YXIgaT1bXS5zbGljZTtmLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksYz1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxkPWYuQ2FsbGJhY2tzKCJtZW1vcnkiKSxlPSJwZW5kaW5nIixnPXtyZXNvbHZlOmIscmVqZWN0OmMsbm90aWZ5OmR9LGg9e2RvbmU6Yi5hZGQsZmFpbDpjLmFkZCxwcm9ncmVzczpkLmFkZCxzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBlfSxpc1Jlc29sdmVkOmIuZmlyZWQsaXNSZWplY3RlZDpjLmZpcmVkLHRoZW46ZnVuY3Rpb24oYSxiLGMpe2kuZG9uZShhKS5mYWlsKGIpLnByb2dyZXNzKGMpO3JldHVybiB0aGlzfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gaS5kb25lLmFwcGx5KGksYXJndW1lbnRzKS5mYWlsLmFwcGx5KGksYXJndW1lbnRzKX0scGlwZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuRGVmZXJyZWQoZnVuY3Rpb24oZCl7Zi5lYWNoKHtkb25lOlthLCJyZXNvbHZlIl0sZmFpbDpbYiwicmVqZWN0Il0scHJvZ3Jlc3M6W2MsIm5vdGlmeSJdfSxmdW5jdGlvbihhLGIpe3ZhciBjPWJbMF0sZT1iWzFdLGc7Zi5pc0Z1bmN0aW9uKGMpP2lbYV0oZnVuY3Rpb24oKXtnPWMuYXBwbHkodGhpcyxhcmd1bWVudHMpLGcmJmYuaXNGdW5jdGlvbihnLnByb21pc2UpP2cucHJvbWlzZSgpLnRoZW4oZC5yZXNvbHZlLGQucmVqZWN0LGQubm90aWZ5KTpkW2UrIldpdGgiXSh0aGlzPT09aT9kOnRoaXMsW2ddKX0pOmlbYV0oZFtlXSl9KX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtpZihhPT1udWxsKWE9aDtlbHNlIGZvcih2YXIgYiBpbiBoKWFbYl09aFtiXTtyZXR1cm4gYX19LGk9aC5wcm9taXNlKHt9KSxqO2ZvcihqIGluIGcpaVtqXT1nW2pdLmZpcmUsaVtqKyJXaXRoIl09Z1tqXS5maXJlV2l0aDtpLmRvbmUoZnVuY3Rpb24oKXtlPSJyZXNvbHZlZCJ9LGMuZGlzYWJsZSxkLmxvY2spLmZhaWwoZnVuY3Rpb24oKXtlPSJyZWplY3RlZCJ9LGIuZGlzYWJsZSxkLmxvY2spLGEmJmEuY2FsbChpLGkpO3JldHVybiBpfSx3aGVuOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIG0oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2VbYV09YXJndW1lbnRzLmxlbmd0aD4xP2kuY2FsbChhcmd1bWVudHMsMCk6YixqLm5vdGlmeVdpdGgoayxlKX19ZnVuY3Rpb24gbChhKXtyZXR1cm4gZnVuY3Rpb24oYyl7YlthXT1hcmd1bWVudHMubGVuZ3RoPjE/aS5jYWxsKGFyZ3VtZW50cywwKTpjLC0tZ3x8ai5yZXNvbHZlV2l0aChqLGIpfX12YXIgYj1pLmNhbGwoYXJndW1lbnRzLDApLGM9MCxkPWIubGVuZ3RoLGU9QXJyYXkoZCksZz1kLGg9ZCxqPWQ8PTEmJmEmJmYuaXNGdW5jdGlvbihhLnByb21pc2UpP2E6Zi5EZWZlcnJlZCgpLGs9ai5wcm9taXNlKCk7aWYoZD4xKXtmb3IoO2M8ZDtjKyspYltjXSYmYltjXS5wcm9taXNlJiZmLmlzRnVuY3Rpb24oYltjXS5wcm9taXNlKT9iW2NdLnByb21pc2UoKS50aGVuKGwoYyksai5yZWplY3QsbShjKSk6LS1nO2d8fGoucmVzb2x2ZVdpdGgoaixiKX1lbHNlIGohPT1hJiZqLnJlc29sdmVXaXRoKGosZD9bYV06W10pO3JldHVybiBrfX0pLGYuc3VwcG9ydD1mdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksYj1jLmRvY3VtZW50RWxlbWVudCxkLGUsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHU7YS5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxhLmlubmVySFRNTD0iICAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJyBzdHlsZT0ndG9wOjFweDtmbG9hdDpsZWZ0O29wYWNpdHk6LjU1Oyc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz48bmF2PjwvbmF2PiIsZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07aWYoIWR8fCFkLmxlbmd0aHx8IWUpcmV0dXJue307Zz1jLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGg9Zy5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxpPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0saz17bGVhZGluZ1doaXRlc3BhY2U6YS5maXJzdENoaWxkLm5vZGVUeXBlPT09Myx0Ym9keTohYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3RvcC8udGVzdChlLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIvYSIsb3BhY2l0eTovXjAuNTUvLnRlc3QoZS5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWUuc3R5bGUuY3NzRmxvYXQsdW5rbm93bkVsZW1zOiEhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibmF2IikubGVuZ3RoLGNoZWNrT246aS52YWx1ZT09PSJvbiIsb3B0U2VsZWN0ZWQ6aC5zZWxlY3RlZCxnZXRTZXRBdHRyaWJ1dGU6YS5jbGFzc05hbWUhPT0idCIsZW5jdHlwZTohIWMuY3JlYXRlRWxlbWVudCgiZm9ybSIpLmVuY3R5cGUsc3VibWl0QnViYmxlczohMCxjaGFuZ2VCdWJibGVzOiEwLGZvY3VzaW5CdWJibGVzOiExLGRlbGV0ZUV4cGFuZG86ITAsbm9DbG9uZUV2ZW50OiEwLGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6ITEsc2hyaW5rV3JhcEJsb2NrczohMSxyZWxpYWJsZU1hcmdpblJpZ2h0OiEwfSxpLmNoZWNrZWQ9ITAsay5ub0Nsb25lQ2hlY2tlZD1pLmNsb25lTm9kZSghMCkuY2hlY2tlZCxnLmRpc2FibGVkPSEwLGsub3B0RGlzYWJsZWQ9IWguZGlzYWJsZWQ7dHJ5e2RlbGV0ZSBhLnRlc3R9Y2F0Y2godil7ay5kZWxldGVFeHBhbmRvPSExfSFhLmFkZEV2ZW50TGlzdGVuZXImJmEuYXR0YWNoRXZlbnQmJmEuZmlyZUV2ZW50JiYoYS5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24oKXtrLm5vQ2xvbmVFdmVudD0hMX0pLGEuY2xvbmVOb2RlKCEwKS5maXJlRXZlbnQoIm9uY2xpY2siKSksaT1jLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksaS52YWx1ZT0idCIsaS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGsucmFkaW9WYWx1ZT1pLnZhbHVlPT09InQiLGkuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLGEuYXBwZW5kQ2hpbGQoaSksbD1jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxsLmFwcGVuZENoaWxkKGEubGFzdENoaWxkKSxrLmNoZWNrQ2xvbmU9bC5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYS5pbm5lckhUTUw9IiIsYS5zdHlsZS53aWR0aD1hLnN0eWxlLnBhZGRpbmdMZWZ0PSIxcHgiLG09Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLG89Yy5jcmVhdGVFbGVtZW50KG0/ImRpdiI6ImJvZHkiKSxwPXt2aXNpYmlsaXR5OiJoaWRkZW4iLHdpZHRoOjAsaGVpZ2h0OjAsYm9yZGVyOjAsbWFyZ2luOjAsYmFja2dyb3VuZDoibm9uZSJ9LG0mJmYuZXh0ZW5kKHAse3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDoiLTk5OXB4Iix0b3A6Ii05OTlweCJ9KTtmb3IodCBpbiBwKW8uc3R5bGVbdF09cFt0XTtvLmFwcGVuZENoaWxkKGEpLG49bXx8YixuLmluc2VydEJlZm9yZShvLG4uZmlyc3RDaGlsZCksay5hcHBlbmRDaGVja2VkPWkuY2hlY2tlZCxrLmJveE1vZGVsPWEub2Zmc2V0V2lkdGg9PT0yLCJ6b29tImluIGEuc3R5bGUmJihhLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsYS5zdHlsZS56b29tPTEsay5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWEub2Zmc2V0V2lkdGg9PT0yLGEuc3R5bGUuZGlzcGxheT0iIixhLmlubmVySFRNTD0iPGRpdiBzdHlsZT0nd2lkdGg6NHB4Oyc+PC9kaXY+IixrLnNocmlua1dyYXBCbG9ja3M9YS5vZmZzZXRXaWR0aCE9PTIpLGEuaW5uZXJIVE1MPSI8dGFibGU+PHRyPjx0ZCBzdHlsZT0ncGFkZGluZzowO2JvcmRlcjowO2Rpc3BsYXk6bm9uZSc+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIscT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLHU9cVswXS5vZmZzZXRIZWlnaHQ9PT0wLHFbMF0uc3R5bGUuZGlzcGxheT0iIixxWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGsucmVsaWFibGVIaWRkZW5PZmZzZXRzPXUmJnFbMF0ub2Zmc2V0SGVpZ2h0PT09MCxhLmlubmVySFRNTD0iIixjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihqPWMuY3JlYXRlRWxlbWVudCgiZGl2Iiksai5zdHlsZS53aWR0aD0iMCIsai5zdHlsZS5tYXJnaW5SaWdodD0iMCIsYS5hcHBlbmRDaGlsZChqKSxrLnJlbGlhYmxlTWFyZ2luUmlnaHQ9KHBhcnNlSW50KChjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoaixudWxsKXx8e21hcmdpblJpZ2h0OjB9KS5tYXJnaW5SaWdodCwxMCl8fDApPT09MCk7aWYoYS5hdHRhY2hFdmVudClmb3IodCBpbntzdWJtaXQ6MSxjaGFuZ2U6MSxmb2N1c2luOjF9KXM9Im9uIit0LHU9cyBpbiBhLHV8fChhLnNldEF0dHJpYnV0ZShzLCJyZXR1cm47IiksdT10eXBlb2YgYVtzXT09ImZ1bmN0aW9uIiksa1t0KyJCdWJibGVzIl09dTtmKGZ1bmN0aW9uKCl7dmFyIGEsYixkLGUsZyxoLGk9MSxqPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7bWFyZ2luOjA7IixsPSJ2aXNpYmlsaXR5OmhpZGRlbjtib3JkZXI6MDsiLG49InN0eWxlPSciK2orImJvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7JyIscD0iPGRpdiAiK24rIj48ZGl2PjwvZGl2PjwvZGl2PiIrIjx0YWJsZSAiK24rIiBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnPiIrIjx0cj48dGQ+PC90ZD48L3RyPjwvdGFibGU+IjttPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTshbXx8KGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxhLnN0eWxlLmNzc1RleHQ9bCsid2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjpzdGF0aWM7dG9wOjA7bWFyZ2luLXRvcDoiK2krInB4IixtLmluc2VydEJlZm9yZShhLG0uZmlyc3RDaGlsZCksbz1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG8uc3R5bGUuY3NzVGV4dD1qK2wsby5pbm5lckhUTUw9cCxhLmFwcGVuZENoaWxkKG8pLGI9by5maXJzdENoaWxkLGQ9Yi5maXJzdENoaWxkLGc9Yi5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQsaD17ZG9lc05vdEFkZEJvcmRlcjpkLm9mZnNldFRvcCE9PTUsZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHM6Zy5vZmZzZXRUb3A9PT01fSxkLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsZC5zdHlsZS50b3A9IjIwcHgiLGguZml4ZWRQb3NpdGlvbj1kLm9mZnNldFRvcD09PTIwfHxkLm9mZnNldFRvcD09PTE1LGQuc3R5bGUucG9zaXRpb249ZC5zdHlsZS50b3A9IiIsYi5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9ZC5vZmZzZXRUb3A9PT0tNSxoLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PW0ub2Zmc2V0VG9wIT09aSxtLnJlbW92ZUNoaWxkKGEpLG89YT1udWxsLGYuZXh0ZW5kKGssaCkpfSksby5pbm5lckhUTUw9IiIsbi5yZW1vdmVDaGlsZChvKSxvPWw9Zz1oPW09aj1hPWk9bnVsbDtyZXR1cm4ga30oKSxmLmJveE1vZGVsPWYuc3VwcG9ydC5ib3hNb2RlbDt2YXIgaj0vXig/Olx7LipcfXxcWy4qXF0pJC8saz0vKFtBLVpdKS9nO2YuZXh0ZW5kKHtjYWNoZTp7fSx1dWlkOjAsZXhwYW5kbzoialF1ZXJ5IisoZi5mbi5qcXVlcnkrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksbm9EYXRhOntlbWJlZDohMCxvYmplY3Q6ImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsYXBwbGV0OiEwfSxoYXNEYXRhOmZ1bmN0aW9uKGEpe2E9YS5ub2RlVHlwZT9mLmNhY2hlW2FbZi5leHBhbmRvXV06YVtmLmV4cGFuZG9dO3JldHVybiEhYSYmIW0oYSl9LGRhdGE6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBnLGgsaSxqPWYuZXhwYW5kbyxrPXR5cGVvZiBjPT0ic3RyaW5nIixsPWEubm9kZVR5cGUsbT1sP2YuY2FjaGU6YSxuPWw/YVtmLmV4cGFuZG9dOmFbZi5leHBhbmRvXSYmZi5leHBhbmRvLG89Yz09PSJldmVudHMiO2lmKCghbnx8IW1bbl18fCFvJiYhZSYmIW1bbl0uZGF0YSkmJmsmJmQ9PT1iKXJldHVybjtufHwobD9hW2YuZXhwYW5kb109bj0rK2YudXVpZDpuPWYuZXhwYW5kbyksbVtuXXx8KG1bbl09e30sbHx8KG1bbl0udG9KU09OPWYubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9tW25dPWYuZXh0ZW5kKG1bbl0sYyk6bVtuXS5kYXRhPWYuZXh0ZW5kKG1bbl0uZGF0YSxjKTtnPWg9bVtuXSxlfHwoaC5kYXRhfHwoaC5kYXRhPXt9KSxoPWguZGF0YSksZCE9PWImJihoW2YuY2FtZWxDYXNlKGMpXT1kKTtpZihvJiYhaFtjXSlyZXR1cm4gZy5ldmVudHM7az8oaT1oW2NdLGk9PW51bGwmJihpPWhbZi5jYW1lbENhc2UoYyldKSk6aT1oO3JldHVybiBpfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIsYyl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBkLGUsZyxoPWYuZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP2YuY2FjaGU6YSxrPWk/YVtmLmV4cGFuZG9dOmYuZXhwYW5kbztpZighaltrXSlyZXR1cm47aWYoYil7ZD1jP2pba106altrXS5kYXRhO2lmKGQpe2YuaXNBcnJheShiKT9iPWI6YiBpbiBkP2I9W2JdOihiPWYuY2FtZWxDYXNlKGIpLGIgaW4gZD9iPVtiXTpiPWIuc3BsaXQoIiAiKSk7Zm9yKGU9MCxnPWIubGVuZ3RoO2U8ZztlKyspZGVsZXRlIGRbYltlXV07aWYoIShjP206Zi5pc0VtcHR5T2JqZWN0KShkKSlyZXR1cm59fWlmKCFjKXtkZWxldGUgaltrXS5kYXRhO2lmKCFtKGpba10pKXJldHVybn1mLnN1cHBvcnQuZGVsZXRlRXhwYW5kb3x8IWouc2V0SW50ZXJ2YWw/ZGVsZXRlIGpba106altrXT1udWxsLGkmJihmLnN1cHBvcnQuZGVsZXRlRXhwYW5kbz9kZWxldGUgYVtmLmV4cGFuZG9dOmEucmVtb3ZlQXR0cmlidXRlP2EucmVtb3ZlQXR0cmlidXRlKGYuZXhwYW5kbyk6YVtmLmV4cGFuZG9dPW51bGwpfX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRhdGEoYSxiLGMsITApfSxhY2NlcHREYXRhOmZ1bmN0aW9uKGEpe2lmKGEubm9kZU5hbWUpe3ZhciBiPWYubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoYilyZXR1cm4gYiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn1yZXR1cm4hMH19KSxmLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGMpe3ZhciBkLGUsZyxoPW51bGw7aWYodHlwZW9mIGE9PSJ1bmRlZmluZWQiKXtpZih0aGlzLmxlbmd0aCl7aD1mLmRhdGEodGhpc1swXSk7aWYodGhpc1swXS5ub2RlVHlwZT09PTEmJiFmLl9kYXRhKHRoaXNbMF0sInBhcnNlZEF0dHJzIikpe2U9dGhpc1swXS5hdHRyaWJ1dGVzO2Zvcih2YXIgaT0wLGo9ZS5sZW5ndGg7aTxqO2krKylnPWVbaV0ubmFtZSxnLmluZGV4T2YoImRhdGEtIik9PT0wJiYoZz1mLmNhbWVsQ2FzZShnLnN1YnN0cmluZyg1KSksbCh0aGlzWzBdLGcsaFtnXSkpO2YuX2RhdGEodGhpc1swXSwicGFyc2VkQXR0cnMiLCEwKX19cmV0dXJuIGh9aWYodHlwZW9mIGE9PSJvYmplY3QiKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmRhdGEodGhpcyxhKX0pO2Q9YS5zcGxpdCgiLiIpLGRbMV09ZFsxXT8iLiIrZFsxXToiIjtpZihjPT09Yil7aD10aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIitkWzFdKyIhIixbZFswXV0pLGg9PT1iJiZ0aGlzLmxlbmd0aCYmKGg9Zi5kYXRhKHRoaXNbMF0sYSksaD1sKHRoaXNbMF0sYSxoKSk7cmV0dXJuIGg9PT1iJiZkWzFdP3RoaXMuZGF0YShkWzBdKTpofXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mKHRoaXMpLGU9W2RbMF0sY107Yi50cmlnZ2VySGFuZGxlcigic2V0RGF0YSIrZFsxXSsiISIsZSksZi5kYXRhKHRoaXMsYSxjKSxiLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitkWzFdKyIhIixlKX0pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLGYuZXh0ZW5kKHtfbWFyazpmdW5jdGlvbihhLGIpe2EmJihiPShifHwiZngiKSsibWFyayIsZi5fZGF0YShhLGIsKGYuX2RhdGEoYSxiKXx8MCkrMSkpfSxfdW5tYXJrOmZ1bmN0aW9uKGEsYixjKXthIT09ITAmJihjPWIsYj1hLGE9ITEpO2lmKGIpe2M9Y3x8ImZ4Ijt2YXIgZD1jKyJtYXJrIixlPWE/MDooZi5fZGF0YShiLGQpfHwxKS0xO2U/Zi5fZGF0YShiLGQsZSk6KGYucmVtb3ZlRGF0YShiLGQsITApLG4oYixjLCJtYXJrIikpfX0scXVldWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGEpe2I9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1mLl9kYXRhKGEsYiksYyYmKCFkfHxmLmlzQXJyYXkoYyk/ZD1mLl9kYXRhKGEsYixmLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKTtyZXR1cm4gZHx8W119fSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPWYucXVldWUoYSxiKSxkPWMuc2hpZnQoKSxlPXt9O2Q9PT0iaW5wcm9ncmVzcyImJihkPWMuc2hpZnQoKSksZCYmKGI9PT0iZngiJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxmLl9kYXRhKGEsYisiLnJ1biIsZSksZC5jYWxsKGEsZnVuY3Rpb24oKXtmLmRlcXVldWUoYSxiKX0sZSkpLGMubGVuZ3RofHwoZi5yZW1vdmVEYXRhKGEsYisicXVldWUgIitiKyIucnVuIiwhMCksbihhLGIsInF1ZXVlIikpfX0pLGYuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGMpe3R5cGVvZiBhIT0ic3RyaW5nIiYmKGM9YSxhPSJmeCIpO2lmKGM9PT1iKXJldHVybiBmLnF1ZXVlKHRoaXNbMF0sYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYucXVldWUodGhpcyxhLGMpO2E9PT0iZngiJiZiWzBdIT09ImlucHJvZ3Jlc3MiJiZmLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmRlcXVldWUodGhpcyxhKX0pfSxkZWxheTpmdW5jdGlvbihhLGIpe2E9Zi5meD9mLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4IjtyZXR1cm4gdGhpcy5xdWV1ZShiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9c2V0VGltZW91dChiLGEpO2Muc3RvcD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChkKX19KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIG0oKXstLWh8fGQucmVzb2x2ZVdpdGgoZSxbZV0pfXR5cGVvZiBhIT0ic3RyaW5nIiYmKGM9YSxhPWIpLGE9YXx8ImZ4Ijt2YXIgZD1mLkRlZmVycmVkKCksZT10aGlzLGc9ZS5sZW5ndGgsaD0xLGk9YSsiZGVmZXIiLGo9YSsicXVldWUiLGs9YSsibWFyayIsbDt3aGlsZShnLS0paWYobD1mLmRhdGEoZVtnXSxpLGIsITApfHwoZi5kYXRhKGVbZ10saixiLCEwKXx8Zi5kYXRhKGVbZ10sayxiLCEwKSkmJmYuZGF0YShlW2ddLGksZi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksITApKWgrKyxsLmFkZChtKTttKCk7cmV0dXJuIGQucHJvbWlzZSgpfX0pO3ZhciBvPS9bXG5cdFxyXS9nLHA9L1xzKy8scT0vXHIvZyxyPS9eKD86YnV0dG9ufGlucHV0KSQvaSxzPS9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLHQ9L15hKD86cmVhKT8kL2ksdT0vXig/OmF1dG9mb2N1c3xhdXRvcGxheXxhc3luY3xjaGVja2VkfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkfHNlbGVjdGVkKSQvaSx2PWYuc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGUsdyx4LHk7Zi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGIsITAsZi5hdHRyKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5yZW1vdmVBdHRyKHRoaXMsYSl9KX0scHJvcDpmdW5jdGlvbihhLGIpe3JldHVybiBmLmFjY2Vzcyh0aGlzLGEsYiwhMCxmLnByb3ApfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGEpe2E9Zi5wcm9wRml4W2FdfHxhO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0cnl7dGhpc1thXT1iLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGMpe319KX0sYWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZyxoLGk7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyIpe2I9YS5zcGxpdChwKTtmb3IoYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl7ZT10aGlzW2NdO2lmKGUubm9kZVR5cGU9PT0xKWlmKCFlLmNsYXNzTmFtZSYmYi5sZW5ndGg9PT0xKWUuY2xhc3NOYW1lPWE7ZWxzZXtnPSIgIitlLmNsYXNzTmFtZSsiICI7Zm9yKGg9MCxpPWIubGVuZ3RoO2g8aTtoKyspfmcuaW5kZXhPZigiICIrYltoXSsiICIpfHwoZys9YltoXSsiICIpO2UuY2xhc3NOYW1lPWYudHJpbShnKX19fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZyxoLGksajtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGEmJnR5cGVvZiBhPT0ic3RyaW5nInx8YT09PWIpe2M9KGF8fCIiKS5zcGxpdChwKTtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO2lmKGcubm9kZVR5cGU9PT0xJiZnLmNsYXNzTmFtZSlpZihhKXtoPSgiICIrZy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKG8sIiAiKTtmb3IoaT0wLGo9Yy5sZW5ndGg7aTxqO2krKyloPWgucmVwbGFjZSgiICIrY1tpXSsiICIsIiAiKTtnLmNsYXNzTmFtZT1mLnRyaW0oaCl9ZWxzZSBnLmNsYXNzTmFtZT0iIn19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEsZD10eXBlb2YgYj09ImJvb2xlYW4iO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe2YodGhpcykudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsYyx0aGlzLmNsYXNzTmFtZSxiKSxiKX0pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihjPT09InN0cmluZyIpe3ZhciBlLGc9MCxoPWYodGhpcyksaT1iLGo9YS5zcGxpdChwKTt3aGlsZShlPWpbZysrXSlpPWQ/aTohaC5oYXNDbGFzcyhlKSxoW2k/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXShlKX1lbHNlIGlmKGM9PT0idW5kZWZpbmVkInx8Yz09PSJib29sZWFuIil0aGlzLmNsYXNzTmFtZSYmZi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjpmLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiJ9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGI9IiAiK2ErIiAiLGM9MCxkPXRoaXMubGVuZ3RoO2Zvcig7YzxkO2MrKylpZih0aGlzW2NdLm5vZGVUeXBlPT09MSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UobywiICIpLmluZGV4T2YoYik+LTEpcmV0dXJuITA7cmV0dXJuITF9LHZhbDpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZz10aGlzWzBdO2lmKCFhcmd1bWVudHMubGVuZ3RoKXtpZihnKXtjPWYudmFsSG9va3NbZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8Zi52YWxIb29rc1tnLnR5cGVdO2lmKGMmJiJnZXQiaW4gYyYmKGQ9Yy5nZXQoZywidmFsdWUiKSkhPT1iKXJldHVybiBkO2Q9Zy52YWx1ZTtyZXR1cm4gdHlwZW9mIGQ9PSJzdHJpbmciP2QucmVwbGFjZShxLCIiKTpkPT1udWxsPyIiOmR9cmV0dXJuIGJ9ZT1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihkKXt2YXIgZz1mKHRoaXMpLGg7aWYodGhpcy5ub2RlVHlwZT09PTEpe2U/aD1hLmNhbGwodGhpcyxkLGcudmFsKCkpOmg9YSxoPT1udWxsP2g9IiI6dHlwZW9mIGg9PSJudW1iZXIiP2grPSIiOmYuaXNBcnJheShoKSYmKGg9Zi5tYXAoaCxmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjphKyIifSkpLGM9Zi52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldfHxmLnZhbEhvb2tzW3RoaXMudHlwZV07aWYoIWN8fCEoInNldCJpbiBjKXx8Yy5zZXQodGhpcyxoLCJ2YWx1ZSIpPT09Yil0aGlzLnZhbHVlPWh9fSl9fSksZi5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIWJ8fGIuc3BlY2lmaWVkP2EudmFsdWU6YS50ZXh0fX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZz1hLnNlbGVjdGVkSW5kZXgsaD1bXSxpPWEub3B0aW9ucyxqPWEudHlwZT09PSJzZWxlY3Qtb25lIjtpZihnPDApcmV0dXJuIG51bGw7Yz1qP2c6MCxkPWo/ZysxOmkubGVuZ3RoO2Zvcig7YzxkO2MrKyl7ZT1pW2NdO2lmKGUuc2VsZWN0ZWQmJihmLnN1cHBvcnQub3B0RGlzYWJsZWQ/IWUuZGlzYWJsZWQ6ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PT1udWxsKSYmKCFlLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFmLm5vZGVOYW1lKGUucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2I9ZihlKS52YWwoKTtpZihqKXJldHVybiBiO2gucHVzaChiKX19aWYoaiYmIWgubGVuZ3RoJiZpLmxlbmd0aClyZXR1cm4gZihpW2ddKS52YWwoKTtyZXR1cm4gaH0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9Zi5tYWtlQXJyYXkoYik7ZihhKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD1mLmluQXJyYXkoZih0aGlzKS52YWwoKSxjKT49MH0pLGMubGVuZ3RofHwoYS5zZWxlY3RlZEluZGV4PS0xKTtyZXR1cm4gY319fSxhdHRyRm46e3ZhbDohMCxjc3M6ITAsaHRtbDohMCx0ZXh0OiEwLGRhdGE6ITAsd2lkdGg6ITAsaGVpZ2h0OiEwLG9mZnNldDohMH0sYXR0cjpmdW5jdGlvbihhLGMsZCxlKXt2YXIgZyxoLGksaj1hLm5vZGVUeXBlO2lmKCFhfHxqPT09M3x8aj09PTh8fGo9PT0yKXJldHVybiBiO2lmKGUmJmMgaW4gZi5hdHRyRm4pcmV0dXJuIGYoYSlbY10oZCk7aWYoISgiZ2V0QXR0cmlidXRlImluIGEpKXJldHVybiBmLnByb3AoYSxjLGQpO2k9aiE9PTF8fCFmLmlzWE1MRG9jKGEpLGkmJihjPWMudG9Mb3dlckNhc2UoKSxoPWYuYXR0ckhvb2tzW2NdfHwodS50ZXN0KGMpP3g6dykpO2lmKGQhPT1iKXtpZihkPT09bnVsbCl7Zi5yZW1vdmVBdHRyKGEsYyk7cmV0dXJuIGJ9aWYoaCYmInNldCJpbiBoJiZpJiYoZz1oLnNldChhLGQsYykpIT09YilyZXR1cm4gZzthLnNldEF0dHJpYnV0ZShjLCIiK2QpO3JldHVybiBkfWlmKGgmJiJnZXQiaW4gaCYmaSYmKGc9aC5nZXQoYSxjKSkhPT1udWxsKXJldHVybiBnO2c9YS5nZXRBdHRyaWJ1dGUoYyk7cmV0dXJuIGc9PT1udWxsP2I6Z30scmVtb3ZlQXR0cjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxnLGg9MDtpZihhLm5vZGVUeXBlPT09MSl7ZD0oYnx8IiIpLnNwbGl0KHApLGc9ZC5sZW5ndGg7Zm9yKDtoPGc7aCsrKWU9ZFtoXS50b0xvd2VyQ2FzZSgpLGM9Zi5wcm9wRml4W2VdfHxlLGYuYXR0cihhLGUsIiIpLGEucmVtb3ZlQXR0cmlidXRlKHY/ZTpjKSx1LnRlc3QoZSkmJmMgaW4gYSYmKGFbY109ITEpfX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oYSxiKXtpZihyLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSlmLmVycm9yKCJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiKTtlbHNlIGlmKCFmLnN1cHBvcnQucmFkaW9WYWx1ZSYmYj09PSJyYWRpbyImJmYubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTthLnNldEF0dHJpYnV0ZSgidHlwZSIsYiksYyYmKGEudmFsdWU9Yyk7cmV0dXJuIGJ9fX0sdmFsdWU6e2dldDpmdW5jdGlvbihhLGIpe2lmKHcmJmYubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIHcuZ2V0KGEsYik7cmV0dXJuIGIgaW4gYT9hLnZhbHVlOm51bGx9LHNldDpmdW5jdGlvbihhLGIsYyl7aWYodyYmZi5ub2RlTmFtZShhLCJidXR0b24iKSlyZXR1cm4gdy5zZXQoYSxiLGMpO2EudmFsdWU9Yn19fSxwcm9wRml4Ont0YWJpbmRleDoidGFiSW5kZXgiLHJlYWRvbmx5OiJyZWFkT25seSIsImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIsY2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixyb3dzcGFuOiJyb3dTcGFuIixjb2xzcGFuOiJjb2xTcGFuIix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIixjb250ZW50ZWRpdGFibGU6ImNvbnRlbnRFZGl0YWJsZSJ9LHByb3A6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGcsaCxpPWEubm9kZVR5cGU7aWYoIWF8fGk9PT0zfHxpPT09OHx8aT09PTIpcmV0dXJuIGI7aD1pIT09MXx8IWYuaXNYTUxEb2MoYSksaCYmKGM9Zi5wcm9wRml4W2NdfHxjLGc9Zi5wcm9wSG9va3NbY10pO3JldHVybiBkIT09Yj9nJiYic2V0ImluIGcmJihlPWcuc2V0KGEsZCxjKSkhPT1iP2U6YVtjXT1kOmcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSxjKSkhPT1udWxsP2U6YVtjXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTtyZXR1cm4gYyYmYy5zcGVjaWZpZWQ/cGFyc2VJbnQoYy52YWx1ZSwxMCk6cy50ZXN0KGEubm9kZU5hbWUpfHx0LnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOmJ9fX19KSxmLmF0dHJIb29rcy50YWJpbmRleD1mLnByb3BIb29rcy50YWJJbmRleCx4PXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlPWYucHJvcChhLGMpO3JldHVybiBlPT09ITB8fHR5cGVvZiBlIT0iYm9vbGVhbiImJihkPWEuZ2V0QXR0cmlidXRlTm9kZShjKSkmJmQubm9kZVZhbHVlIT09ITE/Yy50b0xvd2VyQ2FzZSgpOmJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7Yj09PSExP2YucmVtb3ZlQXR0cihhLGMpOihkPWYucHJvcEZpeFtjXXx8YyxkIGluIGEmJihhW2RdPSEwKSxhLnNldEF0dHJpYnV0ZShjLGMudG9Mb3dlckNhc2UoKSkpO3JldHVybiBjfX0sdnx8KHk9e25hbWU6ITAsaWQ6ITB9LHc9Zi52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkO2Q9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkJiYoeVtjXT9kLm5vZGVWYWx1ZSE9PSIiOmQuc3BlY2lmaWVkKT9kLm5vZGVWYWx1ZTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEuZ2V0QXR0cmlidXRlTm9kZShkKTtlfHwoZT1jLmNyZWF0ZUF0dHJpYnV0ZShkKSxhLnNldEF0dHJpYnV0ZU5vZGUoZSkpO3JldHVybiBlLm5vZGVWYWx1ZT1iKyIifX0sZi5hdHRySG9va3MudGFiaW5kZXguc2V0PXcuc2V0LGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmF0dHJIb29rc1tiXT1mLmV4dGVuZChmLmF0dHJIb29rc1tiXSx7c2V0OmZ1bmN0aW9uKGEsYyl7aWYoYz09PSIiKXthLnNldEF0dHJpYnV0ZShiLCJhdXRvIik7cmV0dXJuIGN9fX0pfSksZi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtnZXQ6dy5nZXQsc2V0OmZ1bmN0aW9uKGEsYixjKXtiPT09IiImJihiPSJmYWxzZSIpLHcuc2V0KGEsYixjKX19KSxmLnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fGYuZWFjaChbImhyZWYiLCJzcmMiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYyl7Zi5hdHRySG9va3NbY109Zi5leHRlbmQoZi5hdHRySG9va3NbY10se2dldDpmdW5jdGlvbihhKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShjLDIpO3JldHVybiBkPT09bnVsbD9iOmR9fSl9KSxmLnN1cHBvcnQuc3R5bGV8fChmLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKXx8Yn0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD0iIitifX0pLGYuc3VwcG9ydC5vcHRTZWxlY3RlZHx8KGYucHJvcEhvb2tzLnNlbGVjdGVkPWYuZXh0ZW5kKGYucHJvcEhvb2tzLnNlbGVjdGVkLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO2ImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCk7cmV0dXJuIG51bGx9fSkpLGYuc3VwcG9ydC5lbmN0eXBlfHwoZi5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIiksZi5zdXBwb3J0LmNoZWNrT258fGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6YS52YWx1ZX19fSksZi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT1mLmV4dGVuZChmLnZhbEhvb2tzW3RoaXNdLHtzZXQ6ZnVuY3Rpb24oYSxiKXtpZihmLmlzQXJyYXkoYikpcmV0dXJuIGEuY2hlY2tlZD1mLmluQXJyYXkoZihhKS52YWwoKSxiKT49MH19KX0pO3ZhciB6PS9cLiguKikkLyxBPS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSxCPS9cLi9nLEM9LyAvZyxEPS9bXlx3XHMufGBdL2csRT0vXihbXlwuXSopPyg/OlwuKC4rKSk/JC8sRj0vXGJob3ZlcihcLlxTKyk/LyxHPS9ea2V5LyxIPS9eKD86bW91c2V8Y29udGV4dG1lbnUpfGNsaWNrLyxJPS9eKFx3KikoPzojKFtcd1wtXSspKT8oPzpcLihbXHdcLV0rKSk/JC8sSj1mdW5jdGlvbihhKXt2YXIgYj1JLmV4ZWMoYSk7YiYmCihiWzFdPShiWzFdfHwiIikudG9Mb3dlckNhc2UoKSxiWzNdPWJbM10mJm5ldyBSZWdFeHAoIig/Ol58XFxzKSIrYlszXSsiKD86XFxzfCQpIikpO3JldHVybiBifSxLPWZ1bmN0aW9uKGEsYil7cmV0dXJuKCFiWzFdfHxhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iWzFdKSYmKCFiWzJdfHxhLmlkPT09YlsyXSkmJighYlszXXx8YlszXS50ZXN0KGEuY2xhc3NOYW1lKSl9LEw9ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZXZlbnQuc3BlY2lhbC5ob3Zlcj9hOmEucmVwbGFjZShGLCJtb3VzZWVudGVyJDEgbW91c2VsZWF2ZSQxIil9O2YuZXZlbnQ9e2FkZDpmdW5jdGlvbihhLGMsZCxlLGcpe3ZhciBoLGksaixrLGwsbSxuLG8scCxxLHIscztpZighKGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OHx8IWN8fCFkfHwhKGg9Zi5fZGF0YShhKSkpKXtkLmhhbmRsZXImJihwPWQsZD1wLmhhbmRsZXIpLGQuZ3VpZHx8KGQuZ3VpZD1mLmd1aWQrKyksaj1oLmV2ZW50cyxqfHwoaC5ldmVudHM9aj17fSksaT1oLmhhbmRsZSxpfHwoaC5oYW5kbGU9aT1mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGYhPSJ1bmRlZmluZWQiJiYoIWF8fGYuZXZlbnQudHJpZ2dlcmVkIT09YS50eXBlKT9mLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGkuZWxlbSxhcmd1bWVudHMpOmJ9LGkuZWxlbT1hKSxjPUwoYykuc3BsaXQoIiAiKTtmb3Ioaz0wO2s8Yy5sZW5ndGg7aysrKXtsPUUuZXhlYyhjW2tdKXx8W10sbT1sWzFdLG49KGxbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxzPWYuZXZlbnQuc3BlY2lhbFttXXx8e30sbT0oZz9zLmRlbGVnYXRlVHlwZTpzLmJpbmRUeXBlKXx8bSxzPWYuZXZlbnQuc3BlY2lhbFttXXx8e30sbz1mLmV4dGVuZCh7dHlwZTptLG9yaWdUeXBlOmxbMV0sZGF0YTplLGhhbmRsZXI6ZCxndWlkOmQuZ3VpZCxzZWxlY3RvcjpnLG5hbWVzcGFjZTpuLmpvaW4oIi4iKX0scCksZyYmKG8ucXVpY2s9SihnKSwhby5xdWljayYmZi5leHByLm1hdGNoLlBPUy50ZXN0KGcpJiYoby5pc1Bvc2l0aW9uYWw9ITApKSxyPWpbbV07aWYoIXIpe3I9alttXT1bXSxyLmRlbGVnYXRlQ291bnQ9MDtpZighcy5zZXR1cHx8cy5zZXR1cC5jYWxsKGEsZSxuLGkpPT09ITEpYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihtLGksITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIittLGkpfXMuYWRkJiYocy5hZGQuY2FsbChhLG8pLG8uaGFuZGxlci5ndWlkfHwoby5oYW5kbGVyLmd1aWQ9ZC5ndWlkKSksZz9yLnNwbGljZShyLmRlbGVnYXRlQ291bnQrKywwLG8pOnIucHVzaChvKSxmLmV2ZW50Lmdsb2JhbFttXT0hMH1hPW51bGx9fSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWYuaGFzRGF0YShhKSYmZi5fZGF0YShhKSxnLGgsaSxqLGssbCxtLG4sbyxwLHE7aWYoISFlJiYhIShtPWUuZXZlbnRzKSl7Yj1MKGJ8fCIiKS5zcGxpdCgiICIpO2ZvcihnPTA7ZzxiLmxlbmd0aDtnKyspe2g9RS5leGVjKGJbZ10pfHxbXSxpPWhbMV0saj1oWzJdO2lmKCFpKXtqPWo/Ii4iK2o6IiI7Zm9yKGwgaW4gbSlmLmV2ZW50LnJlbW92ZShhLGwraixjLGQpO3JldHVybn1uPWYuZXZlbnQuc3BlY2lhbFtpXXx8e30saT0oZD9uLmRlbGVnYXRlVHlwZTpuLmJpbmRUeXBlKXx8aSxwPW1baV18fFtdLGs9cC5sZW5ndGgsaj1qP25ldyBSZWdFeHAoIihefFxcLikiK2ouc3BsaXQoIi4iKS5zb3J0KCkuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIik6bnVsbDtpZihjfHxqfHxkfHxuLnJlbW92ZSlmb3IobD0wO2w8cC5sZW5ndGg7bCsrKXtxPXBbbF07aWYoIWN8fGMuZ3VpZD09PXEuZ3VpZClpZighanx8ai50ZXN0KHEubmFtZXNwYWNlKSlpZighZHx8ZD09PXEuc2VsZWN0b3J8fGQ9PT0iKioiJiZxLnNlbGVjdG9yKXAuc3BsaWNlKGwtLSwxKSxxLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxuLnJlbW92ZSYmbi5yZW1vdmUuY2FsbChhLHEpfWVsc2UgcC5sZW5ndGg9MDtwLmxlbmd0aD09PTAmJmshPT1wLmxlbmd0aCYmKCghbi50ZWFyZG93bnx8bi50ZWFyZG93bi5jYWxsKGEsaik9PT0hMSkmJmYucmVtb3ZlRXZlbnQoYSxpLGUuaGFuZGxlKSxkZWxldGUgbVtpXSl9Zi5pc0VtcHR5T2JqZWN0KG0pJiYobz1lLmhhbmRsZSxvJiYoby5lbGVtPW51bGwpLGYucmVtb3ZlRGF0YShhLFsiZXZlbnRzIiwiaGFuZGxlIl0sITApKX19LGN1c3RvbUV2ZW50OntnZXREYXRhOiEwLHNldERhdGE6ITAsY2hhbmdlRGF0YTohMH0sdHJpZ2dlcjpmdW5jdGlvbihjLGQsZSxnKXtpZighZXx8ZS5ub2RlVHlwZSE9PTMmJmUubm9kZVR5cGUhPT04KXt2YXIgaD1jLnR5cGV8fGMsaT1bXSxqLGssbCxtLG4sbyxwLHEscixzO2guaW5kZXhPZigiISIpPj0wJiYoaD1oLnNsaWNlKDAsLTEpLGs9ITApLGguaW5kZXhPZigiLiIpPj0wJiYoaT1oLnNwbGl0KCIuIiksaD1pLnNoaWZ0KCksaS5zb3J0KCkpO2lmKCghZXx8Zi5ldmVudC5jdXN0b21FdmVudFtoXSkmJiFmLmV2ZW50Lmdsb2JhbFtoXSlyZXR1cm47Yz10eXBlb2YgYz09Im9iamVjdCI/Y1tmLmV4cGFuZG9dP2M6bmV3IGYuRXZlbnQoaCxjKTpuZXcgZi5FdmVudChoKSxjLnR5cGU9aCxjLmlzVHJpZ2dlcj0hMCxjLmV4Y2x1c2l2ZT1rLGMubmFtZXNwYWNlPWkuam9pbigiLiIpLGMubmFtZXNwYWNlX3JlPWMubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK2kuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIik6bnVsbCxvPWguaW5kZXhPZigiOiIpPDA/Im9uIitoOiIiLChnfHwhZSkmJmMucHJldmVudERlZmF1bHQoKTtpZighZSl7aj1mLmNhY2hlO2ZvcihsIGluIGopaltsXS5ldmVudHMmJmpbbF0uZXZlbnRzW2hdJiZmLmV2ZW50LnRyaWdnZXIoYyxkLGpbbF0uaGFuZGxlLmVsZW0sITApO3JldHVybn1jLnJlc3VsdD1iLGMudGFyZ2V0fHwoYy50YXJnZXQ9ZSksZD1kIT1udWxsP2YubWFrZUFycmF5KGQpOltdLGQudW5zaGlmdChjKSxwPWYuZXZlbnQuc3BlY2lhbFtoXXx8e307aWYocC50cmlnZ2VyJiZwLnRyaWdnZXIuYXBwbHkoZSxkKT09PSExKXJldHVybjtyPVtbZSxwLmJpbmRUeXBlfHxoXV07aWYoIWcmJiFwLm5vQnViYmxlJiYhZi5pc1dpbmRvdyhlKSl7cz1wLmRlbGVnYXRlVHlwZXx8aCxuPW51bGw7Zm9yKG09ZS5wYXJlbnROb2RlO207bT1tLnBhcmVudE5vZGUpci5wdXNoKFttLHNdKSxuPW07biYmbj09PWUub3duZXJEb2N1bWVudCYmci5wdXNoKFtuLmRlZmF1bHRWaWV3fHxuLnBhcmVudFdpbmRvd3x8YSxzXSl9Zm9yKGw9MDtsPHIubGVuZ3RoO2wrKyl7bT1yW2xdWzBdLGMudHlwZT1yW2xdWzFdLHE9KGYuX2RhdGEobSwiZXZlbnRzIil8fHt9KVtjLnR5cGVdJiZmLl9kYXRhKG0sImhhbmRsZSIpLHEmJnEuYXBwbHkobSxkKSxxPW8mJm1bb10scSYmZi5hY2NlcHREYXRhKG0pJiZxLmFwcGx5KG0sZCk7aWYoYy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrfWMudHlwZT1oLGMuaXNEZWZhdWx0UHJldmVudGVkKCl8fCghcC5fZGVmYXVsdHx8cC5fZGVmYXVsdC5hcHBseShlLm93bmVyRG9jdW1lbnQsZCk9PT0hMSkmJihoIT09ImNsaWNrInx8IWYubm9kZU5hbWUoZSwiYSIpKSYmZi5hY2NlcHREYXRhKGUpJiZvJiZlW2hdJiYoaCE9PSJmb2N1cyImJmghPT0iYmx1ciJ8fGMudGFyZ2V0Lm9mZnNldFdpZHRoIT09MCkmJiFmLmlzV2luZG93KGUpJiYobj1lW29dLG4mJihlW29dPW51bGwpLGYuZXZlbnQudHJpZ2dlcmVkPWgsZVtoXSgpLGYuZXZlbnQudHJpZ2dlcmVkPWIsbiYmKGVbb109bikpO3JldHVybiBjLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGMpe2M9Zi5ldmVudC5maXgoY3x8YS5ldmVudCk7dmFyIGQ9KGYuX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVtjLnR5cGVdfHxbXSxlPWQuZGVsZWdhdGVDb3VudCxnPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLGg9IWMuZXhjbHVzaXZlJiYhYy5uYW1lc3BhY2UsaT0oZi5ldmVudC5zcGVjaWFsW2MudHlwZV18fHt9KS5oYW5kbGUsaj1bXSxrLGwsbSxuLG8scCxxLHIscyx0LHU7Z1swXT1jLGMuZGVsZWdhdGVUYXJnZXQ9dGhpcztpZihlJiYhYy50YXJnZXQuZGlzYWJsZWQmJighYy5idXR0b258fGMudHlwZSE9PSJjbGljayIpKWZvcihtPWMudGFyZ2V0O20hPXRoaXM7bT1tLnBhcmVudE5vZGV8fHRoaXMpe289e30scT1bXTtmb3Ioaz0wO2s8ZTtrKyspcj1kW2tdLHM9ci5zZWxlY3Rvcix0PW9bc10sci5pc1Bvc2l0aW9uYWw/dD0odHx8KG9bc109ZihzKSkpLmluZGV4KG0pPj0wOnQ9PT1iJiYodD1vW3NdPXIucXVpY2s/SyhtLHIucXVpY2spOmYobSkuaXMocykpLHQmJnEucHVzaChyKTtxLmxlbmd0aCYmai5wdXNoKHtlbGVtOm0sbWF0Y2hlczpxfSl9ZC5sZW5ndGg+ZSYmai5wdXNoKHtlbGVtOnRoaXMsbWF0Y2hlczpkLnNsaWNlKGUpfSk7Zm9yKGs9MDtrPGoubGVuZ3RoJiYhYy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO2srKyl7cD1qW2tdLGMuY3VycmVudFRhcmdldD1wLmVsZW07Zm9yKGw9MDtsPHAubWF0Y2hlcy5sZW5ndGgmJiFjLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7bCsrKXtyPXAubWF0Y2hlc1tsXTtpZihofHwhYy5uYW1lc3BhY2UmJiFyLm5hbWVzcGFjZXx8Yy5uYW1lc3BhY2VfcmUmJmMubmFtZXNwYWNlX3JlLnRlc3Qoci5uYW1lc3BhY2UpKWMuZGF0YT1yLmRhdGEsYy5oYW5kbGVPYmo9cixuPShpfHxyLmhhbmRsZXIpLmFwcGx5KHAuZWxlbSxnKSxuIT09YiYmKGMucmVzdWx0PW4sbj09PSExJiYoYy5wcmV2ZW50RGVmYXVsdCgpLGMuc3RvcFByb3BhZ2F0aW9uKCkpKX19cmV0dXJuIGMucmVzdWx0fSxwcm9wczoiYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50IGFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7YS53aGljaD09bnVsbCYmKGEud2hpY2g9Yi5jaGFyQ29kZSE9bnVsbD9iLmNoYXJDb2RlOmIua2V5Q29kZSk7cmV0dXJuIGF9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50IHdoZWVsRGVsdGEiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsZCl7dmFyIGUsZixnLGg9ZC5idXR0b24saT1kLmZyb21FbGVtZW50O2EucGFnZVg9PW51bGwmJmQuY2xpZW50WCE9bnVsbCYmKGU9YS50YXJnZXQub3duZXJEb2N1bWVudHx8YyxmPWUuZG9jdW1lbnRFbGVtZW50LGc9ZS5ib2R5LGEucGFnZVg9ZC5jbGllbnRYKyhmJiZmLnNjcm9sbExlZnR8fGcmJmcuc2Nyb2xsTGVmdHx8MCktKGYmJmYuY2xpZW50TGVmdHx8ZyYmZy5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWQuY2xpZW50WSsoZiYmZi5zY3JvbGxUb3B8fGcmJmcuc2Nyb2xsVG9wfHwwKS0oZiYmZi5jbGllbnRUb3B8fGcmJmcuY2xpZW50VG9wfHwwKSksIWEucmVsYXRlZFRhcmdldCYmaSYmKGEucmVsYXRlZFRhcmdldD1pPT09YS50YXJnZXQ/ZC50b0VsZW1lbnQ6aSksIWEud2hpY2gmJmghPT1iJiYoYS53aGljaD1oJjE/MTpoJjI/MzpoJjQ/MjowKTtyZXR1cm4gYX19LGZpeDpmdW5jdGlvbihhKXtpZihhW2YuZXhwYW5kb10pcmV0dXJuIGE7dmFyIGQsZSxnPWEsaD1mLmV2ZW50LmZpeEhvb2tzW2EudHlwZV18fHt9LGk9aC5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChoLnByb3BzKTp0aGlzLnByb3BzO2E9Zi5FdmVudChnKTtmb3IoZD1pLmxlbmd0aDtkOyllPWlbLS1kXSxhW2VdPWdbZV07YS50YXJnZXR8fChhLnRhcmdldD1nLnNyY0VsZW1lbnR8fGMpLGEudGFyZ2V0Lm5vZGVUeXBlPT09MyYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT09PWImJihhLm1ldGFLZXk9YS5jdHJsS2V5KTtyZXR1cm4gaC5maWx0ZXI/aC5maWx0ZXIoYSxnKTphfSxzcGVjaWFsOntyZWFkeTp7c2V0dXA6Zi5iaW5kUmVhZHl9LGZvY3VzOntkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4iLG5vQnViYmxlOiEwfSxibHVyOntkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0Iixub0J1YmJsZTohMH0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihhLGIsYyl7Zi5pc1dpbmRvdyh0aGlzKSYmKHRoaXMub25iZWZvcmV1bmxvYWQ9Yyl9LHRlYXJkb3duOmZ1bmN0aW9uKGEsYil7dGhpcy5vbmJlZm9yZXVubG9hZD09PWImJih0aGlzLm9uYmVmb3JldW5sb2FkPW51bGwpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWYuZXh0ZW5kKG5ldyBmLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7ZD9mLmV2ZW50LnRyaWdnZXIoZSxudWxsLGIpOmYuZXZlbnQuZGlzcGF0Y2guY2FsbChiLGUpLGUuaXNEZWZhdWx0UHJldmVudGVkKCkmJmMucHJldmVudERlZmF1bHQoKX19LGYuZXZlbnQuaGFuZGxlPWYuZXZlbnQuZGlzcGF0Y2gsZi5yZW1vdmVFdmVudD1jLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXthLmRldGFjaEV2ZW50JiZhLmRldGFjaEV2ZW50KCJvbiIrYixjKX0sZi5FdmVudD1mdW5jdGlvbihhLGIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGYuRXZlbnQpKXJldHVybiBuZXcgZi5FdmVudChhLGIpO2EmJmEudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWEsdGhpcy50eXBlPWEudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1hLmRlZmF1bHRQcmV2ZW50ZWR8fGEucmV0dXJuVmFsdWU9PT0hMXx8YS5nZXRQcmV2ZW50RGVmYXVsdCYmYS5nZXRQcmV2ZW50RGVmYXVsdCgpP046TSk6dGhpcy50eXBlPWEsYiYmZi5leHRlbmQodGhpcyxiKSx0aGlzLnRpbWVTdGFtcD1hJiZhLnRpbWVTdGFtcHx8Zi5ub3coKSx0aGlzW2YuZXhwYW5kb109ITB9LGYuRXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPU47dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50OyFhfHwoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6YS5yZXR1cm5WYWx1ZT0hMSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9Tjt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7IWF8fChhLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKSxhLmNhbmNlbEJ1YmJsZT0hMCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9Tix0aGlzLnN0b3BQcm9wYWdhdGlvbigpfSxpc0RlZmF1bHRQcmV2ZW50ZWQ6TSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpNLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOk19LGYuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7Zi5ldmVudC5zcGVjaWFsW2FdPWYuZXZlbnQuc3BlY2lhbFtiXT17ZGVsZWdhdGVUeXBlOmIsYmluZFR5cGU6YixoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWEucmVsYXRlZFRhcmdldCxkPWEuaGFuZGxlT2JqLGU9ZC5zZWxlY3RvcixnLGg7aWYoIWN8fGQub3JpZ1R5cGU9PT1hLnR5cGV8fGMhPT1iJiYhZi5jb250YWlucyhiLGMpKWc9YS50eXBlLGEudHlwZT1kLm9yaWdUeXBlLGg9ZC5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9ZztyZXR1cm4gaH19fSksZi5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXN8fChmLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe2lmKGYubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2YuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGM9YS50YXJnZXQsZD1mLm5vZGVOYW1lKGMsImlucHV0Iil8fGYubm9kZU5hbWUoYywiYnV0dG9uIik/Yy5mb3JtOmI7ZCYmIWQuX3N1Ym1pdF9hdHRhY2hlZCYmKGYuZXZlbnQuYWRkKGQsInN1Ym1pdC5fc3VibWl0IixmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJmYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksZC5fc3VibWl0X2F0dGFjaGVkPSEwKX0pfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKGYubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSksZi5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fChmLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe2lmKEEudGVzdCh0aGlzLm5vZGVOYW1lKSl7aWYodGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIilmLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXthLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lPT09ImNoZWNrZWQiJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLGYuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMSxmLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSwhMCkpfSk7cmV0dXJuITF9Zi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7QS50ZXN0KGIubm9kZU5hbWUpJiYhYi5fY2hhbmdlX2F0dGFjaGVkJiYoZi5ldmVudC5hZGQoYiwiY2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmIWEuaXNTaW11bGF0ZWQmJmYuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksYi5fY2hhbmdlX2F0dGFjaGVkPSEwKX0pfSxoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7aWYodGhpcyE9PWJ8fGEuaXNTaW11bGF0ZWR8fGEuaXNUcmlnZ2VyfHxiLnR5cGUhPT0icmFkaW8iJiZiLnR5cGUhPT0iY2hlY2tib3giKXJldHVybiBhLmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtmLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpO3JldHVybiBBLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksZi5zdXBwb3J0LmZvY3VzaW5CdWJibGVzfHxmLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPWZ1bmN0aW9uKGEpe2YuZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxmLmV2ZW50LmZpeChhKSwhMCl9O2YuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXtkKys9PT0wJiZjLmFkZEV2ZW50TGlzdGVuZXIoYSxlLCEwKX0sdGVhcmRvd246ZnVuY3Rpb24oKXstLWQ9PT0wJiZjLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxlLCEwKX19fSksZi5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaTtpZih0eXBlb2YgYT09Im9iamVjdCIpe3R5cGVvZiBjIT0ic3RyaW5nIiYmKGQ9YyxjPWIpO2ZvcihpIGluIGEpdGhpcy5vbihpLGMsZCxhW2ldLGcpO3JldHVybiB0aGlzfWQ9PW51bGwmJmU9PW51bGw/KGU9YyxkPWM9Yik6ZT09bnVsbCYmKHR5cGVvZiBjPT0ic3RyaW5nIj8oZT1kLGQ9Yik6KGU9ZCxkPWMsYz1iKSk7aWYoZT09PSExKWU9TTtlbHNlIGlmKCFlKXJldHVybiB0aGlzO2c9PT0xJiYoaD1lLGU9ZnVuY3Rpb24oYSl7ZigpLm9mZihhKTtyZXR1cm4gaC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUuZ3VpZD1oLmd1aWR8fChoLmd1aWQ9Zi5ndWlkKyspKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC5hZGQodGhpcyxhLGUsZCxjKX0pfSxvbmU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24uY2FsbCh0aGlzLGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGMsZCl7aWYoYSYmYS5wcmV2ZW50RGVmYXVsdCYmYS5oYW5kbGVPYmope3ZhciBlPWEuaGFuZGxlT2JqO2YoYS5kZWxlZ2F0ZVRhcmdldCkub2ZmKGUubmFtZXNwYWNlP2UudHlwZSsiLiIrZS5uYW1lc3BhY2U6ZS50eXBlLGUuc2VsZWN0b3IsZS5oYW5kbGVyKTtyZXR1cm4gdGhpc31pZih0eXBlb2YgYT09Im9iamVjdCIpe2Zvcih2YXIgZyBpbiBhKXRoaXMub2ZmKGcsYyxhW2ddKTtyZXR1cm4gdGhpc31pZihjPT09ITF8fHR5cGVvZiBjPT0iZnVuY3Rpb24iKWQ9YyxjPWI7ZD09PSExJiYoZD1NKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcyxhLGQsYyl9KX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGxpdmU6ZnVuY3Rpb24oYSxiLGMpe2YodGhpcy5jb250ZXh0KS5vbihhLHRoaXMuc2VsZWN0b3IsYixjKTtyZXR1cm4gdGhpc30sZGllOmZ1bmN0aW9uKGEsYil7Zih0aGlzLmNvbnRleHQpLm9mZihhLHRoaXMuc2VsZWN0b3J8fCIqKiIsYik7cmV0dXJuIHRoaXN9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09MT90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYSxjKX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7aWYodGhpc1swXSlyZXR1cm4gZi5ldmVudC50cmlnZ2VyKGEsYix0aGlzWzBdLCEwKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cyxjPWEuZ3VpZHx8Zi5ndWlkKyssZD0wLGU9ZnVuY3Rpb24oYyl7dmFyIGU9KGYuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkKXx8MCklZDtmLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCxlKzEpLGMucHJldmVudERlZmF1bHQoKTtyZXR1cm4gYltlXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fCExfTtlLmd1aWQ9Yzt3aGlsZShkPGIubGVuZ3RoKWJbZCsrXS5ndWlkPWM7cmV0dXJuIHRoaXMuY2xpY2soZSl9LGhvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfX0pLGYuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSxjKXtjPT1udWxsJiYoYz1hLGE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLmJpbmQoYixhLGMpOnRoaXMudHJpZ2dlcihiKX0sZi5hdHRyRm4mJihmLmF0dHJGbltiXT0hMCksRy50ZXN0KGIpJiYoZi5ldmVudC5maXhIb29rc1tiXT1mLmV2ZW50LmtleUhvb2tzKSxILnRlc3QoYikmJihmLmV2ZW50LmZpeEhvb2tzW2JdPWYuZXZlbnQubW91c2VIb29rcyl9KSxmdW5jdGlvbigpe2Z1bmN0aW9uIHgoYSxiLGMsZSxmLGcpe2Zvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9ZVtoXTtpZihqKXt2YXIgaz0hMTtqPWpbYV07d2hpbGUoail7aWYoaltkXT09PWMpe2s9ZVtqLnNpenNldF07YnJlYWt9aWYoai5ub2RlVHlwZT09PTEpe2d8fChqW2RdPWMsai5zaXpzZXQ9aCk7aWYodHlwZW9mIGIhPSJzdHJpbmciKXtpZihqPT09Yil7az0hMDticmVha319ZWxzZSBpZihtLmZpbHRlcihiLFtqXSkubGVuZ3RoPjApe2s9ajticmVha319aj1qW2FdfWVbaF09a319fWZ1bmN0aW9uIHcoYSxiLGMsZSxmLGcpe2Zvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9ZVtoXTtpZihqKXt2YXIgaz0hMTtqPWpbYV07d2hpbGUoail7aWYoaltkXT09PWMpe2s9ZVtqLnNpenNldF07YnJlYWt9ai5ub2RlVHlwZT09PTEmJiFnJiYoaltkXT1jLGouc2l6c2V0PWgpO2lmKGoubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIpe2s9ajticmVha31qPWpbYV19ZVtoXT1rfX19dmFyIGE9LygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZyxkPSJzaXpjYWNoZSIrKE1hdGgucmFuZG9tKCkrIiIpLnJlcGxhY2UoIi4iLCIiKSxlPTAsZz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGg9ITEsaT0hMCxqPS9cXC9nLGs9L1xyXG4vZyxsPS9cVy87WzAsMF0uc29ydChmdW5jdGlvbigpe2k9ITE7cmV0dXJuIDB9KTt2YXIgbT1mdW5jdGlvbihiLGQsZSxmKXtlPWV8fFtdLGQ9ZHx8Yzt2YXIgaD1kO2lmKGQubm9kZVR5cGUhPT0xJiZkLm5vZGVUeXBlIT09OSlyZXR1cm5bXTtpZighYnx8dHlwZW9mIGIhPSJzdHJpbmciKXJldHVybiBlO3ZhciBpLGosayxsLG4scSxyLHQsdT0hMCx2PW0uaXNYTUwoZCksdz1bXSx4PWI7ZG97YS5leGVjKCIiKSxpPWEuZXhlYyh4KTtpZihpKXt4PWlbM10sdy5wdXNoKGlbMV0pO2lmKGlbMl0pe2w9aVszXTticmVha319fXdoaWxlKGkpO2lmKHcubGVuZ3RoPjEmJnAuZXhlYyhiKSlpZih3Lmxlbmd0aD09PTImJm8ucmVsYXRpdmVbd1swXV0paj15KHdbMF0rd1sxXSxkLGYpO2Vsc2V7aj1vLnJlbGF0aXZlW3dbMF1dP1tkXTptKHcuc2hpZnQoKSxkKTt3aGlsZSh3Lmxlbmd0aCliPXcuc2hpZnQoKSxvLnJlbGF0aXZlW2JdJiYoYis9dy5zaGlmdCgpKSxqPXkoYixqLGYpfWVsc2V7IWYmJncubGVuZ3RoPjEmJmQubm9kZVR5cGU9PT05JiYhdiYmby5tYXRjaC5JRC50ZXN0KHdbMF0pJiYhby5tYXRjaC5JRC50ZXN0KHdbdy5sZW5ndGgtMV0pJiYobj1tLmZpbmQody5zaGlmdCgpLGQsdiksZD1uLmV4cHI/bS5maWx0ZXIobi5leHByLG4uc2V0KVswXTpuLnNldFswXSk7aWYoZCl7bj1mP3tleHByOncucG9wKCksc2V0OnMoZil9Om0uZmluZCh3LnBvcCgpLHcubGVuZ3RoPT09MSYmKHdbMF09PT0ifiJ8fHdbMF09PT0iKyIpJiZkLnBhcmVudE5vZGU/ZC5wYXJlbnROb2RlOmQsdiksaj1uLmV4cHI/bS5maWx0ZXIobi5leHByLG4uc2V0KTpuLnNldCx3Lmxlbmd0aD4wP2s9cyhqKTp1PSExO3doaWxlKHcubGVuZ3RoKXE9dy5wb3AoKSxyPXEsby5yZWxhdGl2ZVtxXT9yPXcucG9wKCk6cT0iIixyPT1udWxsJiYocj1kKSxvLnJlbGF0aXZlW3FdKGsscix2KX1lbHNlIGs9dz1bXX1rfHwoaz1qKSxrfHxtLmVycm9yKHF8fGIpO2lmKGcuY2FsbChrKT09PSJbb2JqZWN0IEFycmF5XSIpaWYoIXUpZS5wdXNoLmFwcGx5KGUsayk7ZWxzZSBpZihkJiZkLm5vZGVUeXBlPT09MSlmb3IodD0wO2tbdF0hPW51bGw7dCsrKWtbdF0mJihrW3RdPT09ITB8fGtbdF0ubm9kZVR5cGU9PT0xJiZtLmNvbnRhaW5zKGQsa1t0XSkpJiZlLnB1c2goalt0XSk7ZWxzZSBmb3IodD0wO2tbdF0hPW51bGw7dCsrKWtbdF0mJmtbdF0ubm9kZVR5cGU9PT0xJiZlLnB1c2goalt0XSk7ZWxzZSBzKGssZSk7bCYmKG0obCxoLGUsZiksbS51bmlxdWVTb3J0KGUpKTtyZXR1cm4gZX07bS51bmlxdWVTb3J0PWZ1bmN0aW9uKGEpe2lmKHUpe2g9aSxhLnNvcnQodSk7aWYoaClmb3IodmFyIGI9MTtiPGEubGVuZ3RoO2IrKylhW2JdPT09YVtiLTFdJiZhLnNwbGljZShiLS0sMSl9cmV0dXJuIGF9LG0ubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBtKGEsbnVsbCxudWxsLGIpfSxtLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe3JldHVybiBtKGIsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9LG0uZmluZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpO2lmKCFhKXJldHVybltdO2ZvcihlPTAsZj1vLm9yZGVyLmxlbmd0aDtlPGY7ZSsrKXtoPW8ub3JkZXJbZV07aWYoZz1vLmxlZnRNYXRjaFtoXS5leGVjKGEpKXtpPWdbMV0sZy5zcGxpY2UoMSwxKTtpZihpLnN1YnN0cihpLmxlbmd0aC0xKSE9PSJcXCIpe2dbMV09KGdbMV18fCIiKS5yZXBsYWNlKGosIiIpLGQ9by5maW5kW2hdKGcsYixjKTtpZihkIT1udWxsKXthPWEucmVwbGFjZShvLm1hdGNoW2hdLCIiKTticmVha319fX1kfHwoZD10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCI/Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOltdKTtyZXR1cm57c2V0OmQsZXhwcjphfX0sbS5maWx0ZXI9ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixwLHE9YSxyPVtdLHM9Yyx0PWMmJmNbMF0mJm0uaXNYTUwoY1swXSk7d2hpbGUoYSYmYy5sZW5ndGgpe2ZvcihoIGluIG8uZmlsdGVyKWlmKChmPW8ubGVmdE1hdGNoW2hdLmV4ZWMoYSkpIT1udWxsJiZmWzJdKXtrPW8uZmlsdGVyW2hdLGw9ZlsxXSxnPSExLGYuc3BsaWNlKDEsMSk7aWYobC5zdWJzdHIobC5sZW5ndGgtMSk9PT0iXFwiKWNvbnRpbnVlO3M9PT1yJiYocj1bXSk7aWYoby5wcmVGaWx0ZXJbaF0pe2Y9by5wcmVGaWx0ZXJbaF0oZixzLGQscixlLHQpO2lmKCFmKWc9aT0hMDtlbHNlIGlmKGY9PT0hMCljb250aW51ZX1pZihmKWZvcihuPTA7KGo9c1tuXSkhPW51bGw7bisrKWomJihpPWsoaixmLG4scykscD1lXmksZCYmaSE9bnVsbD9wP2c9ITA6c1tuXT0hMTpwJiYoci5wdXNoKGopLGc9ITApKTtpZihpIT09Yil7ZHx8KHM9ciksYT1hLnJlcGxhY2Uoby5tYXRjaFtoXSwiIik7aWYoIWcpcmV0dXJuW107YnJlYWt9fWlmKGE9PT1xKWlmKGc9PW51bGwpbS5lcnJvcihhKTtlbHNlIGJyZWFrO3E9YX1yZXR1cm4gc30sbS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2F9O3ZhciBuPW0uZ2V0VGV4dD1mdW5jdGlvbihhKXt2YXIgYixjLGQ9YS5ub2RlVHlwZSxlPSIiO2lmKGQpe2lmKGQ9PT0xKXtpZih0eXBlb2YgYS50ZXh0Q29udGVudD09InN0cmluZyIpcmV0dXJuIGEudGV4dENvbnRlbnQ7aWYodHlwZW9mIGEuaW5uZXJUZXh0PT0ic3RyaW5nIilyZXR1cm4gYS5pbm5lclRleHQucmVwbGFjZShrLCIiKTtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpZSs9bihhKX1lbHNlIGlmKGQ9PT0zfHxkPT09NClyZXR1cm4gYS5ub2RlVmFsdWV9ZWxzZSBmb3IoYj0wO2M9YVtiXTtiKyspYy5ub2RlVHlwZSE9PTgmJihlKz1uKGMpKTtyZXR1cm4gZX0sbz1tLnNlbGVjdG9ycz17b3JkZXI6WyJJRCIsIk5BTUUiLCJUQUciXSxtYXRjaDp7SUQ6LyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLENMQVNTOi9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sTkFNRTovXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspWyciXSpcXS8sQVRUUjovXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooPzooWyciXSkoLio/KVwzfCgjPyg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSopfCl8KVxzKlxdLyxUQUc6L14oKD86W1x3XHUwMGMwLVx1RkZGRlwqXC1dfFxcLikrKS8sQ0hJTEQ6Lzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKFxzKihldmVufG9kZHwoPzpbK1wtXT9cZCt8KD86WytcLV0/XGQqKT9uXHMqKD86WytcLV1ccypcZCspPykpXHMqXCkpPy8sUE9TOi86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLFBTRVVETzovOigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKSg/OlwoKFsnIl0/KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk/L30sbGVmdE1hdGNoOnt9LGF0dHJNYXA6eyJjbGFzcyI6ImNsYXNzTmFtZSIsImZvciI6Imh0bWxGb3IifSxhdHRySGFuZGxlOntocmVmOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidHlwZSIpfX0scmVsYXRpdmU6eyIrIjpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBiPT0ic3RyaW5nIixkPWMmJiFsLnRlc3QoYiksZT1jJiYhZDtkJiYoYj1iLnRvTG93ZXJDYXNlKCkpO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGgsaDtmPGc7ZisrKWlmKGg9YVtmXSl7d2hpbGUoKGg9aC5wcmV2aW91c1NpYmxpbmcpJiZoLm5vZGVUeXBlIT09MSk7YVtmXT1lfHxoJiZoLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iP2h8fCExOmg9PT1ifWUmJm0uZmlsdGVyKGIsYSwhMCl9LCI+IjpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9dHlwZW9mIGI9PSJzdHJpbmciLGU9MCxmPWEubGVuZ3RoO2lmKGQmJiFsLnRlc3QoYikpe2I9Yi50b0xvd2VyQ2FzZSgpO2Zvcig7ZTxmO2UrKyl7Yz1hW2VdO2lmKGMpe3ZhciBnPWMucGFyZW50Tm9kZTthW2VdPWcubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/ZzohMX19fWVsc2V7Zm9yKDtlPGY7ZSsrKWM9YVtlXSxjJiYoYVtlXT1kP2MucGFyZW50Tm9kZTpjLnBhcmVudE5vZGU9PT1iKTtkJiZtLmZpbHRlcihiLGEsITApfX0sIiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9ZSsrLGc9eDt0eXBlb2YgYj09InN0cmluZyImJiFsLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz13KSxnKCJwYXJlbnROb2RlIixiLGYsYSxkLGMpfSwifiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9ZSsrLGc9eDt0eXBlb2YgYj09InN0cmluZyImJiFsLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz13KSxnKCJwcmV2aW91c1NpYmxpbmciLGIsZixhLGQsYyl9fSxmaW5kOntJRDpmdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQhPSJ1bmRlZmluZWQiJiYhYyl7dmFyIGQ9Yi5nZXRFbGVtZW50QnlJZChhWzFdKTtyZXR1cm4gZCYmZC5wYXJlbnROb2RlP1tkXTpbXX19LE5BTUU6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5TmFtZSE9InVuZGVmaW5lZCIpe3ZhciBjPVtdLGQ9Yi5nZXRFbGVtZW50c0J5TmFtZShhWzFdKTtmb3IodmFyIGU9MCxmPWQubGVuZ3RoO2U8ZjtlKyspZFtlXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKT09PWFbMV0mJmMucHVzaChkW2VdKTtyZXR1cm4gYy5sZW5ndGg9PT0wP251bGw6Y319LFRBRzpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIilyZXR1cm4gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhWzFdKX19LHByZUZpbHRlcjp7Q0xBU1M6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2E9IiAiK2FbMV0ucmVwbGFjZShqLCIiKSsiICI7aWYoZilyZXR1cm4gYTtmb3IodmFyIGc9MCxoOyhoPWJbZ10pIT1udWxsO2crKyloJiYoZV4oaC5jbGFzc05hbWUmJigiICIraC5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKC9bXHRcblxyXS9nLCIgIikuaW5kZXhPZihhKT49MCk/Y3x8ZC5wdXNoKGgpOmMmJihiW2ddPSExKSk7cmV0dXJuITF9LElEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdLnJlcGxhY2UoaiwiIil9LFRBRzpmdW5jdGlvbihhLGIpe3JldHVybiBhWzFdLnJlcGxhY2UoaiwiIikudG9Mb3dlckNhc2UoKX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7aWYoYVsxXT09PSJudGgiKXthWzJdfHxtLmVycm9yKGFbMF0pLGFbMl09YVsyXS5yZXBsYWNlKC9eXCt8XHMqL2csIiIpO3ZhciBiPS8oLT8pKFxkKikoPzpuKFsrXC1dP1xkKikpPy8uZXhlYyhhWzJdPT09ImV2ZW4iJiYiMm4ifHxhWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChhWzJdKSYmIjBuKyIrYVsyXXx8YVsyXSk7YVsyXT1iWzFdKyhiWzJdfHwxKS0wLGFbM109YlszXS0wfWVsc2UgYVsyXSYmbS5lcnJvcihhWzBdKTthWzBdPWUrKztyZXR1cm4gYX0sQVRUUjpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9YVsxXT1hWzFdLnJlcGxhY2UoaiwiIik7IWYmJm8uYXR0ck1hcFtnXSYmKGFbMV09by5hdHRyTWFwW2ddKSxhWzRdPShhWzRdfHxhWzVdfHwiIikucmVwbGFjZShqLCIiKSxhWzJdPT09In49IiYmKGFbNF09IiAiK2FbNF0rIiAiKTtyZXR1cm4gYX0sUFNFVURPOmZ1bmN0aW9uKGIsYyxkLGUsZil7aWYoYlsxXT09PSJub3QiKWlmKChhLmV4ZWMoYlszXSl8fCIiKS5sZW5ndGg+MXx8L15cdy8udGVzdChiWzNdKSliWzNdPW0oYlszXSxudWxsLG51bGwsYyk7ZWxzZXt2YXIgZz1tLmZpbHRlcihiWzNdLGMsZCwhMF5mKTtkfHxlLnB1c2guYXBwbHkoZSxnKTtyZXR1cm4hMX1lbHNlIGlmKG8ubWF0Y2guUE9TLnRlc3QoYlswXSl8fG8ubWF0Y2guQ0hJTEQudGVzdChiWzBdKSlyZXR1cm4hMDtyZXR1cm4gYn0sUE9TOmZ1bmN0aW9uKGEpe2EudW5zaGlmdCghMCk7cmV0dXJuIGF9fSxmaWx0ZXJzOntlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITEmJmEudHlwZSE9PSJoaWRkZW4ifSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNoZWNrZWQ9PT0hMH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7YS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtyZXR1cm4gYS5zZWxlY3RlZD09PSEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuISFhLmZpcnN0Q2hpbGR9LGVtcHR5OmZ1bmN0aW9uKGEpe3JldHVybiFhLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihhLGIsYyl7cmV0dXJuISFtKGNbM10sYSkubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuL2hcZC9pLnRlc3QoYS5ub2RlTmFtZSl9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxjPWEudHlwZTtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInRleHQiPT09YyYmKGI9PT1jfHxiPT09bnVsbCl9LHJhZGlvOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicmFkaW8iPT09YS50eXBlfSxjaGVja2JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImNoZWNrYm94Ij09PWEudHlwZX0sZmlsZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImZpbGUiPT09YS50eXBlfSxwYXNzd29yZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInBhc3N3b3JkIj09PWEudHlwZX0sc3VibWl0OmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oYj09PSJpbnB1dCJ8fGI9PT0iYnV0dG9uIikmJiJzdWJtaXQiPT09YS50eXBlfSxpbWFnZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImltYWdlIj09PWEudHlwZX0scmVzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInJlc2V0Ij09PWEudHlwZX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYj09PSJpbnB1dCImJiJidXR0b24iPT09YS50eXBlfHxiPT09ImJ1dHRvbiJ9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybi9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChhLm5vZGVOYW1lKX0sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1hLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudH19LHNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0wfSxsYXN0OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBiPT09ZC5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0wfSxvZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYiUyPT09MX0sbHQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPGNbM10tMH0sZ3Q6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPmNbM10tMH0sbnRoOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gY1szXS0wPT09Yn0sZXE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifX0sZmlsdGVyOntQU0VVRE86ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsxXSxmPW8uZmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpO2lmKGU9PT0iY29udGFpbnMiKXJldHVybihhLnRleHRDb250ZW50fHxhLmlubmVyVGV4dHx8bihbYV0pfHwiIikuaW5kZXhPZihiWzNdKT49MDtpZihlPT09Im5vdCIpe3ZhciBnPWJbM107Zm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKWlmKGdbaF09PT1hKXJldHVybiExO3JldHVybiEwfW0uZXJyb3IoZSl9LENISUxEOmZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz1iWzFdLGw9YTtzd2l0Y2goayl7Y2FzZSJvbmx5IjpjYXNlImZpcnN0Ijp3aGlsZShsPWwucHJldmlvdXNTaWJsaW5nKWlmKGwubm9kZVR5cGU9PT0xKXJldHVybiExO2lmKGs9PT0iZmlyc3QiKXJldHVybiEwO2w9YTtjYXNlImxhc3QiOndoaWxlKGw9bC5uZXh0U2libGluZylpZihsLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtyZXR1cm4hMDtjYXNlIm50aCI6Yz1iWzJdLGU9YlszXTtpZihjPT09MSYmZT09PTApcmV0dXJuITA7Zj1iWzBdLGc9YS5wYXJlbnROb2RlO2lmKGcmJihnW2RdIT09Znx8IWEubm9kZUluZGV4KSl7aT0wO2ZvcihsPWcuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZylsLm5vZGVUeXBlPT09MSYmKGwubm9kZUluZGV4PSsraSk7Z1tkXT1mfWo9YS5ub2RlSW5kZXgtZTtyZXR1cm4gYz09PTA/aj09PTA6aiVjPT09MCYmai9jPj0wfX0sSUQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0iKiImJmEubm9kZVR5cGU9PT0xfHwhIWEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJ9LENMQVNTOmZ1bmN0aW9uKGEsYil7cmV0dXJuKCIgIisoYS5jbGFzc05hbWV8fGEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoYik+LTF9LEFUVFI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzFdLGQ9bS5hdHRyP20uYXR0cihhLGMpOm8uYXR0ckhhbmRsZVtjXT9vLmF0dHJIYW5kbGVbY10oYSk6YVtjXSE9bnVsbD9hW2NdOmEuZ2V0QXR0cmlidXRlKGMpLGU9ZCsiIixmPWJbMl0sZz1iWzRdO3JldHVybiBkPT1udWxsP2Y9PT0iIT0iOiFmJiZtLmF0dHI/ZCE9bnVsbDpmPT09Ij0iP2U9PT1nOmY9PT0iKj0iP2UuaW5kZXhPZihnKT49MDpmPT09In49Ij8oIiAiK2UrIiAiKS5pbmRleE9mKGcpPj0wOmc/Zj09PSIhPSI/ZSE9PWc6Zj09PSJePSI/ZS5pbmRleE9mKGcpPT09MDpmPT09IiQ9Ij9lLnN1YnN0cihlLmxlbmd0aC1nLmxlbmd0aCk9PT1nOmY9PT0ifD0iP2U9PT1nfHxlLnN1YnN0cigwLGcubGVuZ3RoKzEpPT09ZysiLSI6ITE6ZSYmZCE9PSExfSxQT1M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsyXSxmPW8uc2V0RmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpfX19LHA9by5tYXRjaC5QT1MscT1mdW5jdGlvbihhLGIpe3JldHVybiJcXCIrKGItMCsxKX07Zm9yKHZhciByIGluIG8ubWF0Y2gpby5tYXRjaFtyXT1uZXcgUmVnRXhwKG8ubWF0Y2hbcl0uc291cmNlKy8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSksby5sZWZ0TWF0Y2hbcl09bmV3IFJlZ0V4cCgvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlK28ubWF0Y2hbcl0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZyxxKSk7dmFyIHM9ZnVuY3Rpb24oYSxiKXthPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsMCk7aWYoYil7Yi5wdXNoLmFwcGx5KGIsYSk7cmV0dXJuIGJ9cmV0dXJuIGF9O3RyeXtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzLDApWzBdLm5vZGVUeXBlfWNhdGNoKHQpe3M9ZnVuY3Rpb24oYSxiKXt2YXIgYz0wLGQ9Ynx8W107aWYoZy5jYWxsKGEpPT09IltvYmplY3QgQXJyYXldIilBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShkLGEpO2Vsc2UgaWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilmb3IodmFyIGU9YS5sZW5ndGg7YzxlO2MrKylkLnB1c2goYVtjXSk7ZWxzZSBmb3IoO2FbY107YysrKWQucHVzaChhW2NdKTtyZXR1cm4gZH19dmFyIHUsdjtjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj91PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb258fCFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPy0xOjE7cmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmND8tMToxfToodT1mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXtoPSEwO3JldHVybiAwfWlmKGEuc291cmNlSW5kZXgmJmIuc291cmNlSW5kZXgpcmV0dXJuIGEuc291cmNlSW5kZXgtYi5zb3VyY2VJbmRleDt2YXIgYyxkLGU9W10sZj1bXSxnPWEucGFyZW50Tm9kZSxpPWIucGFyZW50Tm9kZSxqPWc7aWYoZz09PWkpcmV0dXJuIHYoYSxiKTtpZighZylyZXR1cm4tMTtpZighaSlyZXR1cm4gMTt3aGlsZShqKWUudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtqPWk7d2hpbGUoailmLnVuc2hpZnQoaiksaj1qLnBhcmVudE5vZGU7Yz1lLmxlbmd0aCxkPWYubGVuZ3RoO2Zvcih2YXIgaz0wO2s8YyYmazxkO2srKylpZihlW2tdIT09ZltrXSlyZXR1cm4gdihlW2tdLGZba10pO3JldHVybiBrPT09Yz92KGEsZltrXSwtMSk6dihlW2tdLGIsMSl9LHY9ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PT1iKXJldHVybiBjO3ZhciBkPWEubmV4dFNpYmxpbmc7d2hpbGUoZCl7aWYoZD09PWIpcmV0dXJuLTE7ZD1kLm5leHRTaWJsaW5nfXJldHVybiAxfSksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9InNjcmlwdCIrKG5ldyBEYXRlKS5nZXRUaW1lKCksZT1jLmRvY3VtZW50RWxlbWVudDthLmlubmVySFRNTD0iPGEgbmFtZT0nIitkKyInLz4iLGUuaW5zZXJ0QmVmb3JlKGEsZS5maXJzdENoaWxkKSxjLmdldEVsZW1lbnRCeUlkKGQpJiYoby5maW5kLklEPWZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYy5nZXRFbGVtZW50QnlJZCE9InVuZGVmaW5lZCImJiFkKXt2YXIgZT1jLmdldEVsZW1lbnRCeUlkKGFbMV0pO3JldHVybiBlP2UuaWQ9PT1hWzFdfHx0eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlIT0idW5kZWZpbmVkIiYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZT09PWFbMV0/W2VdOmI6W119fSxvLmZpbHRlci5JRD1mdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGEubm9kZVR5cGU9PT0xJiZjJiZjLm5vZGVWYWx1ZT09PWJ9KSxlLnJlbW92ZUNoaWxkKGEpLGU9YT1udWxsfSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmFwcGVuZENoaWxkKGMuY3JlYXRlQ29tbWVudCgiIikpLGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg+MCYmKG8uZmluZC5UQUc9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGFbMV0pO2lmKGFbMV09PT0iKiIpe3ZhciBkPVtdO2Zvcih2YXIgZT0wO2NbZV07ZSsrKWNbZV0ubm9kZVR5cGU9PT0xJiZkLnB1c2goY1tlXSk7Yz1kfXJldHVybiBjfSksYS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLGEuZmlyc3RDaGlsZCYmdHlwZW9mIGEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUhPSJ1bmRlZmluZWQiJiZhLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikhPT0iIyImJihvLmF0dHJIYW5kbGUuaHJlZj1mdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImhyZWYiLDIpfSksYT1udWxsfSgpLGMucXVlcnlTZWxlY3RvckFsbCYmZnVuY3Rpb24oKXt2YXIgYT1tLGI9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPSJfX3NpenpsZV9fIjtiLmlubmVySFRNTD0iPHAgY2xhc3M9J1RFU1QnPjwvcD4iO2lmKCFiLnF1ZXJ5U2VsZWN0b3JBbGx8fGIucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGghPT0wKXttPWZ1bmN0aW9uKGIsZSxmLGcpe2U9ZXx8YztpZighZyYmIW0uaXNYTUwoZSkpe3ZhciBoPS9eKFx3KyQpfF5cLihbXHdcLV0rJCl8XiMoW1x3XC1dKyQpLy5leGVjKGIpO2lmKGgmJihlLm5vZGVUeXBlPT09MXx8ZS5ub2RlVHlwZT09PTkpKXtpZihoWzFdKXJldHVybiBzKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYiksZik7aWYoaFsyXSYmby5maW5kLkNMQVNTJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGhbMl0pLGYpfWlmKGUubm9kZVR5cGU9PT05KXtpZihiPT09ImJvZHkiJiZlLmJvZHkpcmV0dXJuIHMoW2UuYm9keV0sZik7aWYoaCYmaFszXSl7dmFyIGk9ZS5nZXRFbGVtZW50QnlJZChoWzNdKTtpZighaXx8IWkucGFyZW50Tm9kZSlyZXR1cm4gcyhbXSxmKTtpZihpLmlkPT09aFszXSlyZXR1cm4gcyhbaV0sZil9dHJ5e3JldHVybiBzKGUucXVlcnlTZWxlY3RvckFsbChiKSxmKX1jYXRjaChqKXt9fWVsc2UgaWYoZS5ub2RlVHlwZT09PTEmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJvYmplY3QiKXt2YXIgaz1lLGw9ZS5nZXRBdHRyaWJ1dGUoImlkIiksbj1sfHxkLHA9ZS5wYXJlbnROb2RlLHE9L15ccypbK35dLy50ZXN0KGIpO2w/bj1uLnJlcGxhY2UoLycvZywiXFwkJiIpOmUuc2V0QXR0cmlidXRlKCJpZCIsbikscSYmcCYmKGU9ZS5wYXJlbnROb2RlKTt0cnl7aWYoIXF8fHApcmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWQ9JyIrbisiJ10gIitiKSxmKX1jYXRjaChyKXt9ZmluYWxseXtsfHxrLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBhKGIsZSxmLGcpfTtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07Yj1udWxsfX0oKSxmdW5jdGlvbigpe3ZhciBhPWMuZG9jdW1lbnRFbGVtZW50LGI9YS5tYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8YS5tc01hdGNoZXNTZWxlY3RvcjtpZihiKXt2YXIgZD0hYi5jYWxsKGMuY3JlYXRlRWxlbWVudCgiZGl2IiksImRpdiIpLGU9ITE7dHJ5e2IuY2FsbChjLmRvY3VtZW50RWxlbWVudCwiW3Rlc3QhPScnXTpzaXp6bGUiKX1jYXRjaChmKXtlPSEwfW0ubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYyl7Yz1jLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csIj0nJDEnXSIpO2lmKCFtLmlzWE1MKGEpKXRyeXtpZihlfHwhby5tYXRjaC5QU0VVRE8udGVzdChjKSYmIS8hPS8udGVzdChjKSl7dmFyIGY9Yi5jYWxsKGEsYyk7aWYoZnx8IWR8fGEuZG9jdW1lbnQmJmEuZG9jdW1lbnQubm9kZVR5cGUhPT0xMSlyZXR1cm4gZn19Y2F0Y2goZyl7fXJldHVybiBtKGMsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9fX0oKSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J3Rlc3QgZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjtpZighIWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoIT09MCl7YS5sYXN0Q2hpbGQuY2xhc3NOYW1lPSJlIjtpZihhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg9PT0xKXJldHVybjtvLm9yZGVyLnNwbGljZSgxLDAsIkNMQVNTIiksby5maW5kLkNMQVNTPWZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT0idW5kZWZpbmVkIiYmIWMpcmV0dXJuIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhWzFdKX0sYT1udWxsfX0oKSxjLmRvY3VtZW50RWxlbWVudC5jb250YWlucz9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEhPT1iJiYoYS5jb250YWlucz9hLmNvbnRhaW5zKGIpOiEwKX06Yy5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/bS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybiEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpfTptLmNvbnRhaW5zPWZ1bmN0aW9uKCl7cmV0dXJuITF9LG0uaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9KGE/YS5vd25lckRvY3VtZW50fHxhOjApLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj9iLm5vZGVOYW1lIT09IkhUTUwiOiExfTt2YXIgeT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZT1bXSxmPSIiLGc9Yi5ub2RlVHlwZT9bYl06Yjt3aGlsZShkPW8ubWF0Y2guUFNFVURPLmV4ZWMoYSkpZis9ZFswXSxhPWEucmVwbGFjZShvLm1hdGNoLlBTRVVETywiIik7YT1vLnJlbGF0aXZlW2FdP2ErIioiOmE7Zm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKW0oYSxnW2hdLGUsYyk7cmV0dXJuIG0uZmlsdGVyKGYsZSl9O20uYXR0cj1mLmF0dHIsbS5zZWxlY3RvcnMuYXR0ck1hcD17fSxmLmZpbmQ9bSxmLmV4cHI9bS5zZWxlY3RvcnMsZi5leHByWyI6Il09Zi5leHByLmZpbHRlcnMsZi51bmlxdWU9bS51bmlxdWVTb3J0LGYudGV4dD1tLmdldFRleHQsZi5pc1hNTERvYz1tLmlzWE1MLGYuY29udGFpbnM9bS5jb250YWluc30oKTt2YXIgTz0vVW50aWwkLyxQPS9eKD86cGFyZW50c3xwcmV2VW50aWx8cHJldkFsbCkvLFE9LywvLFI9L14uW146I1xbXC4sXSokLyxTPUFycmF5LnByb3RvdHlwZS5zbGljZSxUPWYuZXhwci5tYXRjaC5QT1MsVT17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLGMsZDtpZih0eXBlb2YgYSE9InN0cmluZyIpcmV0dXJuIGYoYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGM9MCxkPWIubGVuZ3RoO2M8ZDtjKyspaWYoZi5jb250YWlucyhiW2NdLHRoaXMpKXJldHVybiEwfSk7dmFyIGU9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpLGcsaCxpO2ZvcihjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKXtnPWUubGVuZ3RoLGYuZmluZChhLHRoaXNbY10sZSk7aWYoYz4wKWZvcihoPWc7aDxlLmxlbmd0aDtoKyspZm9yKGk9MDtpPGc7aSsrKWlmKGVbaV09PT1lW2hdKXtlLnNwbGljZShoLS0sMSk7YnJlYWt9fXJldHVybiBlfSxoYXM6ZnVuY3Rpb24oYSl7dmFyIGI9ZihhKTtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxjPWIubGVuZ3RoO2E8YzthKyspaWYoZi5jb250YWlucyh0aGlzLGJbYV0pKXJldHVybiEwfSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVyh0aGlzLGEsITEpLCJub3QiLGEpfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFcodGhpcyxhLCEwKSwiZmlsdGVyIixhKX0saXM6ZnVuY3Rpb24oYSl7cmV0dXJuISFhJiYodHlwZW9mIGE9PSJzdHJpbmciP1QudGVzdChhKT9mKGEsdGhpcy5jb250ZXh0KS5pbmRleCh0aGlzWzBdKT49MDpmLmZpbHRlcihhLHRoaXMpLmxlbmd0aD4wOnRoaXMuZmlsdGVyKGEpLmxlbmd0aD4wKX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQsZSxnPXRoaXNbMF07aWYoZi5pc0FycmF5KGEpKXt2YXIgaD0xO3doaWxlKGcmJmcub3duZXJEb2N1bWVudCYmZyE9PWIpe2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZihnKS5pcyhhW2RdKSYmYy5wdXNoKHtzZWxlY3RvcjphW2RdLGVsZW06ZyxsZXZlbDpofSk7Zz1nLnBhcmVudE5vZGUsaCsrfXJldHVybiBjfXZhciBpPVQudGVzdChhKXx8dHlwZW9mIGEhPSJzdHJpbmciP2YoYSxifHx0aGlzLmNvbnRleHQpOjA7Zm9yKGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe2c9dGhpc1tkXTt3aGlsZShnKXtpZihpP2kuaW5kZXgoZyk+LTE6Zi5maW5kLm1hdGNoZXNTZWxlY3RvcihnLGEpKXtjLnB1c2goZyk7YnJlYWt9Zz1nLnBhcmVudE5vZGU7aWYoIWd8fCFnLm93bmVyRG9jdW1lbnR8fGc9PT1ifHxnLm5vZGVUeXBlPT09MTEpYnJlYWt9fWM9Yy5sZW5ndGg+MT9mLnVuaXF1ZShjKTpjO3JldHVybiB0aGlzLnB1c2hTdGFjayhjLCJjbG9zZXN0IixhKX0saW5kZXg6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuIHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLnByZXZBbGwoKS5sZW5ndGg6LTE7aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBmLmluQXJyYXkodGhpc1swXSxmKGEpKTtyZXR1cm4gZi5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKX0sYWRkOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE9PSJzdHJpbmciP2YoYSxiKTpmLm1ha2VBcnJheShhJiZhLm5vZGVUeXBlP1thXTphKSxkPWYubWVyZ2UodGhpcy5nZXQoKSxjKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVihjWzBdKXx8VihkWzBdKT9kOmYudW5pcXVlKGQpKX0sYW5kU2VsZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFkZCh0aGlzLnByZXZPYmplY3QpfX0pLGYuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmYi5ub2RlVHlwZSE9PTExP2I6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gZi5kaXIoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIixjKX0sbmV4dDpmdW5jdGlvbihhKXtyZXR1cm4gZi5udGgoYSwyLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kaXIoYSwibmV4dFNpYmxpbmciLGMpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJwcmV2aW91c1NpYmxpbmciLGMpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gZi5zaWJsaW5nKGEucGFyZW50Tm9kZS5maXJzdENoaWxkLGEpfSxjaGlsZHJlbjpmdW5jdGlvbihhKXtyZXR1cm4gZi5zaWJsaW5nKGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLm5vZGVOYW1lKGEsImlmcmFtZSIpP2EuY29udGVudERvY3VtZW50fHxhLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ6Zi5tYWtlQXJyYXkoYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPWYubWFwKHRoaXMsYixjKSxnPVMuY2FsbChhcmd1bWVudHMpO08udGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1mLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFVW2FdP2YudW5pcXVlKGUpOmUsKHRoaXMubGVuZ3RoPjF8fFEudGVzdChkKSkmJlAudGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsZy5qb2luKCIsIikpfX0pLGYuZXh0ZW5kKHtmaWx0ZXI6ZnVuY3Rpb24oYSxiLGMpe2MmJihhPSI6bm90KCIrYSsiKSIpO3JldHVybiBiLmxlbmd0aD09PTE/Zi5maW5kLm1hdGNoZXNTZWxlY3RvcihiWzBdLGEpP1tiWzBdXTpbXTpmLmZpbmQubWF0Y2hlcyhhLGIpfSxkaXI6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPVtdLGc9YVtjXTt3aGlsZShnJiZnLm5vZGVUeXBlIT09OSYmKGQ9PT1ifHxnLm5vZGVUeXBlIT09MXx8IWYoZykuaXMoZCkpKWcubm9kZVR5cGU9PT0xJiZlLnB1c2goZyksZz1nW2NdO3JldHVybiBlfSxudGg6ZnVuY3Rpb24oYSxiLGMsZCl7Yj1ifHwxO3ZhciBlPTA7Zm9yKDthO2E9YVtjXSlpZihhLm5vZGVUeXBlPT09MSYmKytlPT09YilicmVhaztyZXR1cm4gYX0sc2libGluZzpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO2Zvcig7YTthPWEubmV4dFNpYmxpbmcpYS5ub2RlVHlwZT09PTEmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9fSk7dmFyIFk9ImFiYnIgYXJ0aWNsZSBhc2lkZSBhdWRpbyBjYW52YXMgZGF0YWxpc3QgZGV0YWlscyBmaWdjYXB0aW9uIGZpZ3VyZSBmb290ZXIgaGVhZGVyIGhncm91cCBtYXJrIG1ldGVyIG5hdiBvdXRwdXQgcHJvZ3Jlc3Mgc2VjdGlvbiBzdW1tYXJ5IHRpbWUgdmlkZW8iLFo9LyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywkPS9eXHMrLyxfPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vaWcsYmE9LzwoW1x3Ol0rKS8sYmI9Lzx0Ym9keS9pLGJjPS88fCYjP1x3KzsvLGJkPS88KD86c2NyaXB0fHN0eWxlKS9pLGJlPS88KD86c2NyaXB0fG9iamVjdHxlbWJlZHxvcHRpb258c3R5bGUpL2ksYmY9bmV3IFJlZ0V4cCgiPCg/OiIrWS5yZXBsYWNlKCIgIiwifCIpKyIpIiwiaSIpLGJnPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGJoPS9cLyhqYXZhfGVjbWEpc2NyaXB0L2ksYmk9L15ccyo8ISg/OlxbQ0RBVEFcW3xcLVwtKS8sYmo9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0OlswLCIiLCIiXX0sYms9WChjKTtiai5vcHRncm91cD1iai5vcHRpb24sYmoudGJvZHk9YmoudGZvb3Q9YmouY29sZ3JvdXA9YmouY2FwdGlvbj1iai50aGVhZCxiai50aD1iai50ZCxmLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8KGJqLl9kZWZhdWx0PVsxLCJkaXY8ZGl2PiIsIjwvZGl2PiJdKSxmLmZuLmV4dGVuZCh7dGV4dDpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpO2MudGV4dChhLmNhbGwodGhpcyxiLGMudGV4dCgpKSl9KTtpZih0eXBlb2YgYSE9Im9iamVjdCImJmEhPT1iKXJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGMpLmNyZWF0ZVRleHROb2RlKGEpKTtyZXR1cm4gZi50ZXh0KHRoaXMpfSx3cmFwQWxsOmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxiKSl9KTtpZih0aGlzWzBdKXt2YXIgYj1mKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKSxiLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXM7d2hpbGUoYS5maXJzdENoaWxkJiZhLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0xKWE9YS5maXJzdENoaWxkO3JldHVybiBhfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYodGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YodGhpcykud3JhcEFsbChhKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Zi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9Zihhcmd1bWVudHNbMF0pO2EucHVzaC5hcHBseShhLHRoaXMudG9BcnJheSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYSwiYmVmb3JlIixhcmd1bWVudHMpfX0sYWZ0ZXI6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIgosYXJndW1lbnRzKTthLnB1c2guYXBwbHkoYSxmKGFyZ3VtZW50c1swXSkudG9BcnJheSgpKTtyZXR1cm4gYX19LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ7KGQ9dGhpc1tjXSkhPW51bGw7YysrKWlmKCFhfHxmLmZpbHRlcihhLFtkXSkubGVuZ3RoKSFiJiZkLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksZi5jbGVhbkRhdGEoW2RdKSksZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYjsoYj10aGlzW2FdKSE9bnVsbDthKyspe2Iubm9kZVR5cGU9PT0xJiZmLmNsZWFuRGF0YShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpO3doaWxlKGIuZmlyc3RDaGlsZCliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7YT1hPT1udWxsPyExOmEsYj1iPT1udWxsP2E6YjtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtpZihhPT09YilyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5ub2RlVHlwZT09PTE/dGhpc1swXS5pbm5lckhUTUwucmVwbGFjZShaLCIiKTpudWxsO2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmIWJkLnRlc3QoYSkmJihmLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2V8fCEkLnRlc3QoYSkpJiYhYmpbKGJhLmV4ZWMoYSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXthPWEucmVwbGFjZShfLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKHZhciBjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKXRoaXNbY10ubm9kZVR5cGU9PT0xJiYoZi5jbGVhbkRhdGEodGhpc1tjXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKSx0aGlzW2NdLmlubmVySFRNTD1hKX1jYXRjaChlKXt0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfX1lbHNlIGYuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9Zih0aGlzKTtjLmh0bWwoYS5jYWxsKHRoaXMsYixjLmh0bWwoKSkpfSk6dGhpcy5lbXB0eSgpLmFwcGVuZChhKTtyZXR1cm4gdGhpc30scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpLGQ9Yy5odG1sKCk7Yy5yZXBsYWNlV2l0aChhLmNhbGwodGhpcyxiLGQpKX0pO3R5cGVvZiBhIT0ic3RyaW5nIiYmKGE9ZihhKS5kZXRhY2goKSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXRoaXMubmV4dFNpYmxpbmcsYz10aGlzLnBhcmVudE5vZGU7Zih0aGlzKS5yZW1vdmUoKSxiP2YoYikuYmVmb3JlKGEpOmYoYykuYXBwZW5kKGEpfSl9cmV0dXJuIHRoaXMubGVuZ3RoP3RoaXMucHVzaFN0YWNrKGYoZi5pc0Z1bmN0aW9uKGEpP2EoKTphKSwicmVwbGFjZVdpdGgiLGEpOnRoaXN9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnLGgsaSxqPWFbMF0saz1bXTtpZighZi5zdXBwb3J0LmNoZWNrQ2xvbmUmJmFyZ3VtZW50cy5sZW5ndGg9PT0zJiZ0eXBlb2Ygaj09InN0cmluZyImJmJnLnRlc3QoaikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YodGhpcykuZG9tTWFuaXAoYSxjLGQsITApfSk7aWYoZi5pc0Z1bmN0aW9uKGopKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIGc9Zih0aGlzKTthWzBdPWouY2FsbCh0aGlzLGUsYz9nLmh0bWwoKTpiKSxnLmRvbU1hbmlwKGEsYyxkKX0pO2lmKHRoaXNbMF0pe2k9aiYmai5wYXJlbnROb2RlLGYuc3VwcG9ydC5wYXJlbnROb2RlJiZpJiZpLm5vZGVUeXBlPT09MTEmJmkuY2hpbGROb2Rlcy5sZW5ndGg9PT10aGlzLmxlbmd0aD9lPXtmcmFnbWVudDppfTplPWYuYnVpbGRGcmFnbWVudChhLHRoaXMsayksaD1lLmZyYWdtZW50LGguY2hpbGROb2Rlcy5sZW5ndGg9PT0xP2c9aD1oLmZpcnN0Q2hpbGQ6Zz1oLmZpcnN0Q2hpbGQ7aWYoZyl7Yz1jJiZmLm5vZGVOYW1lKGcsInRyIik7Zm9yKHZhciBsPTAsbT10aGlzLmxlbmd0aCxuPW0tMTtsPG07bCsrKWQuY2FsbChjP2JsKHRoaXNbbF0sZyk6dGhpc1tsXSxlLmNhY2hlYWJsZXx8bT4xJiZsPG4/Zi5jbG9uZShoLCEwLCEwKTpoKX1rLmxlbmd0aCYmZi5lYWNoKGssYnIpfXJldHVybiB0aGlzfX0pLGYuYnVpbGRGcmFnbWVudD1mdW5jdGlvbihhLGIsZCl7dmFyIGUsZyxoLGksaj1hWzBdO2ImJmJbMF0mJihpPWJbMF0ub3duZXJEb2N1bWVudHx8YlswXSksaS5jcmVhdGVEb2N1bWVudEZyYWdtZW50fHwoaT1jKSxhLmxlbmd0aD09PTEmJnR5cGVvZiBqPT0ic3RyaW5nIiYmai5sZW5ndGg8NTEyJiZpPT09YyYmai5jaGFyQXQoMCk9PT0iPCImJiFiZS50ZXN0KGopJiYoZi5zdXBwb3J0LmNoZWNrQ2xvbmV8fCFiZy50ZXN0KGopKSYmIWYuc3VwcG9ydC51bmtub3duRWxlbXMmJmJmLnRlc3QoaikmJihnPSEwLGg9Zi5mcmFnbWVudHNbal0saCYmaCE9PTEmJihlPWgpKSxlfHwoZT1pLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxmLmNsZWFuKGEsaSxlLGQpKSxnJiYoZi5mcmFnbWVudHNbal09aD9lOjEpO3JldHVybntmcmFnbWVudDplLGNhY2hlYWJsZTpnfX0sZi5mcmFnbWVudHM9e30sZi5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMpe3ZhciBkPVtdLGU9ZihjKSxnPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2lmKGcmJmcubm9kZVR5cGU9PT0xMSYmZy5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJmUubGVuZ3RoPT09MSl7ZVtiXSh0aGlzWzBdKTtyZXR1cm4gdGhpc31mb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPShoPjA/dGhpcy5jbG9uZSghMCk6dGhpcykuZ2V0KCk7ZihlW2hdKVtiXShqKSxkPWQuY29uY2F0KGopfXJldHVybiB0aGlzLnB1c2hTdGFjayhkLGEsZS5zZWxlY3Rvcil9fSksZi5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmNsb25lTm9kZSghMCksZSxnLGg7aWYoKCFmLnN1cHBvcnQubm9DbG9uZUV2ZW50fHwhZi5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSYmKGEubm9kZVR5cGU9PT0xfHxhLm5vZGVUeXBlPT09MTEpJiYhZi5pc1hNTERvYyhhKSl7Ym4oYSxkKSxlPWJvKGEpLGc9Ym8oZCk7Zm9yKGg9MDtlW2hdOysraClnW2hdJiZibihlW2hdLGdbaF0pfWlmKGIpe2JtKGEsZCk7aWYoYyl7ZT1ibyhhKSxnPWJvKGQpO2ZvcihoPTA7ZVtoXTsrK2gpYm0oZVtoXSxnW2hdKX19ZT1nPW51bGw7cmV0dXJuIGR9LGNsZWFuOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBnO2I9Ynx8Yyx0eXBlb2YgYi5jcmVhdGVFbGVtZW50PT0idW5kZWZpbmVkIiYmKGI9Yi5vd25lckRvY3VtZW50fHxiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fGMpO3ZhciBoPVtdLGk7Zm9yKHZhciBqPTAsazsoaz1hW2pdKSE9bnVsbDtqKyspe3R5cGVvZiBrPT0ibnVtYmVyIiYmKGsrPSIiKTtpZighayljb250aW51ZTtpZih0eXBlb2Ygaz09InN0cmluZyIpaWYoIWJjLnRlc3Qoaykpaz1iLmNyZWF0ZVRleHROb2RlKGspO2Vsc2V7az1rLnJlcGxhY2UoXywiPCQxPjwvJDI+Iik7dmFyIGw9KGJhLmV4ZWMoayl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksbT1ialtsXXx8YmouX2RlZmF1bHQsbj1tWzBdLG89Yi5jcmVhdGVFbGVtZW50KCJkaXYiKTtiPT09Yz9iay5hcHBlbmRDaGlsZChvKTpYKGIpLmFwcGVuZENoaWxkKG8pLG8uaW5uZXJIVE1MPW1bMV0rayttWzJdO3doaWxlKG4tLSlvPW8ubGFzdENoaWxkO2lmKCFmLnN1cHBvcnQudGJvZHkpe3ZhciBwPWJiLnRlc3QoaykscT1sPT09InRhYmxlIiYmIXA/by5maXJzdENoaWxkJiZvLmZpcnN0Q2hpbGQuY2hpbGROb2RlczptWzFdPT09Ijx0YWJsZT4iJiYhcD9vLmNoaWxkTm9kZXM6W107Zm9yKGk9cS5sZW5ndGgtMTtpPj0wOy0taSlmLm5vZGVOYW1lKHFbaV0sInRib2R5IikmJiFxW2ldLmNoaWxkTm9kZXMubGVuZ3RoJiZxW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocVtpXSl9IWYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmJC50ZXN0KGspJiZvLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKCQuZXhlYyhrKVswXSksby5maXJzdENoaWxkKSxrPW8uY2hpbGROb2Rlc312YXIgcjtpZighZi5zdXBwb3J0LmFwcGVuZENoZWNrZWQpaWYoa1swXSYmdHlwZW9mIChyPWsubGVuZ3RoKT09Im51bWJlciIpZm9yKGk9MDtpPHI7aSsrKWJxKGtbaV0pO2Vsc2UgYnEoayk7ay5ub2RlVHlwZT9oLnB1c2goayk6aD1mLm1lcmdlKGgsayl9aWYoZCl7Zz1mdW5jdGlvbihhKXtyZXR1cm4hYS50eXBlfHxiaC50ZXN0KGEudHlwZSl9O2ZvcihqPTA7aFtqXTtqKyspaWYoZSYmZi5ub2RlTmFtZShoW2pdLCJzY3JpcHQiKSYmKCFoW2pdLnR5cGV8fGhbal0udHlwZS50b0xvd2VyQ2FzZSgpPT09InRleHQvamF2YXNjcmlwdCIpKWUucHVzaChoW2pdLnBhcmVudE5vZGU/aFtqXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGhbal0pOmhbal0pO2Vsc2V7aWYoaFtqXS5ub2RlVHlwZT09PTEpe3ZhciBzPWYuZ3JlcChoW2pdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxnKTtoLnNwbGljZS5hcHBseShoLFtqKzEsMF0uY29uY2F0KHMpKX1kLmFwcGVuZENoaWxkKGhbal0pfX1yZXR1cm4gaH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1mLmNhY2hlLGU9Zi5ldmVudC5zcGVjaWFsLGc9Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG87Zm9yKHZhciBoPTAsaTsoaT1hW2hdKSE9bnVsbDtoKyspe2lmKGkubm9kZU5hbWUmJmYubm9EYXRhW2kubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pY29udGludWU7Yz1pW2YuZXhwYW5kb107aWYoYyl7Yj1kW2NdO2lmKGImJmIuZXZlbnRzKXtmb3IodmFyIGogaW4gYi5ldmVudHMpZVtqXT9mLmV2ZW50LnJlbW92ZShpLGopOmYucmVtb3ZlRXZlbnQoaSxqLGIuaGFuZGxlKTtiLmhhbmRsZSYmKGIuaGFuZGxlLmVsZW09bnVsbCl9Zz9kZWxldGUgaVtmLmV4cGFuZG9dOmkucmVtb3ZlQXR0cmlidXRlJiZpLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pLGRlbGV0ZSBkW2NdfX19fSk7dmFyIGJzPS9hbHBoYVwoW14pXSpcKS9pLGJ0PS9vcGFjaXR5PShbXildKikvLGJ1PS8oW0EtWl18Xm1zKS9nLGJ2PS9eLT9cZCsoPzpweCk/JC9pLGJ3PS9eLT9cZC8sYng9L14oW1wtK10pPShbXC0rLlxkZV0rKS8sYnk9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJ6PVsiTGVmdCIsIlJpZ2h0Il0sYkE9WyJUb3AiLCJCb3R0b20iXSxiQixiQyxiRDtmLmZuLmNzcz1mdW5jdGlvbihhLGMpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yJiZjPT09YilyZXR1cm4gdGhpcztyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGMsITAsZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkIT09Yj9mLnN0eWxlKGEsYyxkKTpmLmNzcyhhLGMpfSl9LGYuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9YkIoYSwib3BhY2l0eSIsIm9wYWNpdHkiKTtyZXR1cm4gYz09PSIiPyIxIjpjfXJldHVybiBhLnN0eWxlLm9wYWNpdHl9fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6Zi5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGMsZCxlKXtpZighIWEmJmEubm9kZVR5cGUhPT0zJiZhLm5vZGVUeXBlIT09OCYmISFhLnN0eWxlKXt2YXIgZyxoLGk9Zi5jYW1lbENhc2UoYyksaj1hLnN0eWxlLGs9Zi5jc3NIb29rc1tpXTtjPWYuY3NzUHJvcHNbaV18fGk7aWYoZD09PWIpe2lmKGsmJiJnZXQiaW4gayYmKGc9ay5nZXQoYSwhMSxlKSkhPT1iKXJldHVybiBnO3JldHVybiBqW2NdfWg9dHlwZW9mIGQsaD09PSJzdHJpbmciJiYoZz1ieC5leGVjKGQpKSYmKGQ9KyhnWzFdKzEpKitnWzJdK3BhcnNlRmxvYXQoZi5jc3MoYSxjKSksaD0ibnVtYmVyIik7aWYoZD09bnVsbHx8aD09PSJudW1iZXIiJiZpc05hTihkKSlyZXR1cm47aD09PSJudW1iZXIiJiYhZi5jc3NOdW1iZXJbaV0mJihkKz0icHgiKTtpZigha3x8ISgic2V0ImluIGspfHwoZD1rLnNldChhLGQpKSE9PWIpdHJ5e2pbY109ZH1jYXRjaChsKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnO2M9Zi5jYW1lbENhc2UoYyksZz1mLmNzc0hvb2tzW2NdLGM9Zi5jc3NQcm9wc1tjXXx8YyxjPT09ImNzc0Zsb2F0IiYmKGM9ImZsb2F0Iik7aWYoZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGQpKSE9PWIpcmV0dXJuIGU7aWYoYkIpcmV0dXJuIGJCKGEsYyl9LHN3YXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9O2Zvcih2YXIgZSBpbiBiKWRbZV09YS5zdHlsZVtlXSxhLnN0eWxlW2VdPWJbZV07Yy5jYWxsKGEpO2ZvcihlIGluIGIpYS5zdHlsZVtlXT1kW2VdfX0pLGYuY3VyQ1NTPWYuY3NzLGYuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtmLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlO2lmKGMpe2lmKGEub2Zmc2V0V2lkdGghPT0wKXJldHVybiBiRShhLGIsZCk7Zi5zd2FwKGEsYnksZnVuY3Rpb24oKXtlPWJFKGEsYixkKX0pO3JldHVybiBlfX0sc2V0OmZ1bmN0aW9uKGEsYil7aWYoIWJ2LnRlc3QoYikpcmV0dXJuIGI7Yj1wYXJzZUZsb2F0KGIpO2lmKGI+PTApcmV0dXJuIGIrInB4In19fSksZi5zdXBwb3J0Lm9wYWNpdHl8fChmLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBidC50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlLGU9Zi5pc051bWVyaWMoYik/ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSI6IiIsZz1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2Muem9vbT0xO2lmKGI+PTEmJmYudHJpbShnLnJlcGxhY2UoYnMsIiIpKT09PSIiKXtjLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIik7aWYoZCYmIWQuZmlsdGVyKXJldHVybn1jLmZpbHRlcj1icy50ZXN0KGcpP2cucmVwbGFjZShicyxlKTpnKyIgIitlfX0pLGYoZnVuY3Rpb24oKXtmLnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KGYuY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihhLGIpe3ZhciBjO2Yuc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxmdW5jdGlvbigpe2I/Yz1iQihhLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW5SaWdodCIpOmM9YS5zdHlsZS5tYXJnaW5SaWdodH0pO3JldHVybiBjfX0pfSksYy5kZWZhdWx0VmlldyYmYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlJiYoYkM9ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGc7Yz1jLnJlcGxhY2UoYnUsIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoIShlPWEub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykpcmV0dXJuIGI7aWYoZz1lLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKSlkPWcuZ2V0UHJvcGVydHlWYWx1ZShjKSxkPT09IiImJiFmLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYSkmJihkPWYuc3R5bGUoYSxjKSk7cmV0dXJuIGR9KSxjLmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihiRD1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPWEuY3VycmVudFN0eWxlJiZhLmN1cnJlbnRTdHlsZVtiXSxnPWEuc3R5bGU7Zj09PW51bGwmJmcmJihlPWdbYl0pJiYoZj1lKSwhYnYudGVzdChmKSYmYncudGVzdChmKSYmKGM9Zy5sZWZ0LGQ9YS5ydW50aW1lU3R5bGUmJmEucnVudGltZVN0eWxlLmxlZnQsZCYmKGEucnVudGltZVN0eWxlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdCksZy5sZWZ0PWI9PT0iZm9udFNpemUiPyIxZW0iOmZ8fDAsZj1nLnBpeGVsTGVmdCsicHgiLGcubGVmdD1jLGQmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWQpKTtyZXR1cm4gZj09PSIiPyJhdXRvIjpmfSksYkI9YkN8fGJELGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRXaWR0aCxjPWEub2Zmc2V0SGVpZ2h0O3JldHVybiBiPT09MCYmYz09PTB8fCFmLnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzJiYoYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxmLmNzcyhhLCJkaXNwbGF5IikpPT09Im5vbmUifSxmLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFmLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9KTt2YXIgYkY9LyUyMC9nLGJHPS9cW1xdJC8sYkg9L1xyP1xuL2csYkk9LyMuKiQvLGJKPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsYks9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGRhdGV0aW1lLWxvY2FsfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGJMPS9eKD86YWJvdXR8YXBwfGFwcFwtc3RvcmFnZXwuK1wtZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sYk09L14oPzpHRVR8SEVBRCkkLyxiTj0vXlwvXC8vLGJPPS9cPy8sYlA9LzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksYlE9L14oPzpzZWxlY3R8dGV4dGFyZWEpL2ksYlI9L1xzKy8sYlM9LyhbPyZdKV89W14mXSovLGJUPS9eKFtcd1wrXC5cLV0rOikoPzpcL1wvKFteXC8/IzpdKikoPzo6KFxkKykpPyk/LyxiVT1mLmZuLmxvYWQsYlY9e30sYlc9e30sYlgsYlksYlo9WyIqLyJdK1siKiJdO3RyeXtiWD1lLmhyZWZ9Y2F0Y2goYiQpe2JYPWMuY3JlYXRlRWxlbWVudCgiYSIpLGJYLmhyZWY9IiIsYlg9YlguaHJlZn1iWT1iVC5leGVjKGJYLnRvTG93ZXJDYXNlKCkpfHxbXSxmLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGMsZCl7aWYodHlwZW9mIGEhPSJzdHJpbmciJiZiVSlyZXR1cm4gYlUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZT1hLmluZGV4T2YoIiAiKTtpZihlPj0wKXt2YXIgZz1hLnNsaWNlKGUsYS5sZW5ndGgpO2E9YS5zbGljZSgwLGUpfXZhciBoPSJHRVQiO2MmJihmLmlzRnVuY3Rpb24oYyk/KGQ9YyxjPWIpOnR5cGVvZiBjPT0ib2JqZWN0IiYmKGM9Zi5wYXJhbShjLGYuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKSxoPSJQT1NUIikpO3ZhciBpPXRoaXM7Zi5hamF4KHt1cmw6YSx0eXBlOmgsZGF0YVR5cGU6Imh0bWwiLGRhdGE6Yyxjb21wbGV0ZTpmdW5jdGlvbihhLGIsYyl7Yz1hLnJlc3BvbnNlVGV4dCxhLmlzUmVzb2x2ZWQoKSYmKGEuZG9uZShmdW5jdGlvbihhKXtjPWF9KSxpLmh0bWwoZz9mKCI8ZGl2PiIpLmFwcGVuZChjLnJlcGxhY2UoYlAsIiIpKS5maW5kKGcpOmMpKSxkJiZpLmVhY2goZCxbYyxiLGFdKX19KTtyZXR1cm4gdGhpc30sc2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGYucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cz9mLm1ha2VBcnJheSh0aGlzLmVsZW1lbnRzKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZSYmIXRoaXMuZGlzYWJsZWQmJih0aGlzLmNoZWNrZWR8fGJRLnRlc3QodGhpcy5ub2RlTmFtZSl8fGJLLnRlc3QodGhpcy50eXBlKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1mKHRoaXMpLnZhbCgpO3JldHVybiBjPT1udWxsP251bGw6Zi5pc0FycmF5KGMpP2YubWFwKGMsZnVuY3Rpb24oYSxjKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKGJILCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZShiSCwiXHJcbiIpfX0pLmdldCgpfX0pLGYuZWFjaCgiYWpheFN0YXJ0IGFqYXhTdG9wIGFqYXhDb21wbGV0ZSBhamF4RXJyb3IgYWpheFN1Y2Nlc3MgYWpheFNlbmQiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJpbmQoYixhKX19KSxmLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxjKXtmW2NdPWZ1bmN0aW9uKGEsZCxlLGcpe2YuaXNGdW5jdGlvbihkKSYmKGc9Z3x8ZSxlPWQsZD1iKTtyZXR1cm4gZi5hamF4KHt0eXBlOmMsdXJsOmEsZGF0YTpkLHN1Y2Nlc3M6ZSxkYXRhVHlwZTpnfSl9fSksZi5leHRlbmQoe2dldFNjcmlwdDpmdW5jdGlvbihhLGMpe3JldHVybiBmLmdldChhLGIsYywic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmdldChhLGIsYywianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtiP2NiKGEsZi5hamF4U2V0dGluZ3MpOihiPWEsYT1mLmFqYXhTZXR0aW5ncyksY2IoYSxiKTtyZXR1cm4gYX0sYWpheFNldHRpbmdzOnt1cmw6YlgsaXNMb2NhbDpiTC50ZXN0KGJZWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6Ylp9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjphLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpmLnBhcnNlSlNPTiwidGV4dCB4bWwiOmYucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6Yl8oYlYpLGFqYXhUcmFuc3BvcnQ6Yl8oYlcpLGFqYXg6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiB3KGEsYyxsLG0pe2lmKHMhPT0yKXtzPTIscSYmY2xlYXJUaW1lb3V0KHEpLHA9YixuPW18fCIiLHYucmVhZHlTdGF0ZT1hPjA/NDowO3ZhciBvLHIsdSx3PWMseD1sP2NkKGQsdixsKTpiLHksejtpZihhPj0yMDAmJmE8MzAwfHxhPT09MzA0KXtpZihkLmlmTW9kaWZpZWQpe2lmKHk9di5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKWYubGFzdE1vZGlmaWVkW2tdPXk7aWYoej12LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIikpZi5ldGFnW2tdPXp9aWYoYT09PTMwNCl3PSJub3Rtb2RpZmllZCIsbz0hMDtlbHNlIHRyeXtyPWNlKGQseCksdz0ic3VjY2VzcyIsbz0hMH1jYXRjaChBKXt3PSJwYXJzZXJlcnJvciIsdT1BfX1lbHNle3U9dztpZighd3x8YSl3PSJlcnJvciIsYTwwJiYoYT0wKX12LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD0iIisoY3x8dyksbz9oLnJlc29sdmVXaXRoKGUsW3Isdyx2XSk6aC5yZWplY3RXaXRoKGUsW3Ysdyx1XSksdi5zdGF0dXNDb2RlKGopLGo9Yix0JiZnLnRyaWdnZXIoImFqYXgiKyhvPyJTdWNjZXNzIjoiRXJyb3IiKSxbdixkLG8/cjp1XSksaS5maXJlV2l0aChlLFt2LHddKSx0JiYoZy50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt2LGRdKSwtLWYuYWN0aXZlfHxmLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfX10eXBlb2YgYT09Im9iamVjdCImJihjPWEsYT1iKSxjPWN8fHt9O3ZhciBkPWYuYWpheFNldHVwKHt9LGMpLGU9ZC5jb250ZXh0fHxkLGc9ZSE9PWQmJihlLm5vZGVUeXBlfHxlIGluc3RhbmNlb2YgZik/ZihlKTpmLmV2ZW50LGg9Zi5EZWZlcnJlZCgpLGk9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksaj1kLnN0YXR1c0NvZGV8fHt9LGssbD17fSxtPXt9LG4sbyxwLHEscixzPTAsdCx1LHY9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7aWYoIXMpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTthPW1bY109bVtjXXx8YSxsW2FdPWJ9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBzPT09Mj9uOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBjO2lmKHM9PT0yKXtpZighbyl7bz17fTt3aGlsZShjPWJKLmV4ZWMobikpb1tjWzFdLnRvTG93ZXJDYXNlKCldPWNbMl19Yz1vW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIGM9PT1iP251bGw6Y30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtzfHwoZC5taW1lVHlwZT1hKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7YT1hfHwiYWJvcnQiLHAmJnAuYWJvcnQoYSksdygwLGEpO3JldHVybiB0aGlzfX07aC5wcm9taXNlKHYpLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsdi5jb21wbGV0ZT1pLmFkZCx2LnN0YXR1c0NvZGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI7aWYoczwyKWZvcihiIGluIGEpaltiXT1baltiXSxhW2JdXTtlbHNlIGI9YVt2LnN0YXR1c10sdi50aGVuKGIsYil9cmV0dXJuIHRoaXN9LGQudXJsPSgoYXx8ZC51cmwpKyIiKS5yZXBsYWNlKGJJLCIiKS5yZXBsYWNlKGJOLGJZWzFdKyIvLyIpLGQuZGF0YVR5cGVzPWYudHJpbShkLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoYlIpLGQuY3Jvc3NEb21haW49PW51bGwmJihyPWJULmV4ZWMoZC51cmwudG9Mb3dlckNhc2UoKSksZC5jcm9zc0RvbWFpbj0hKCFyfHxyWzFdPT1iWVsxXSYmclsyXT09YllbMl0mJihyWzNdfHwoclsxXT09PSJodHRwOiI/ODA6NDQzKSk9PShiWVszXXx8KGJZWzFdPT09Imh0dHA6Ij84MDo0NDMpKSkpLGQuZGF0YSYmZC5wcm9jZXNzRGF0YSYmdHlwZW9mIGQuZGF0YSE9InN0cmluZyImJihkLmRhdGE9Zi5wYXJhbShkLmRhdGEsZC50cmFkaXRpb25hbCkpLGNhKGJWLGQsYyx2KTtpZihzPT09MilyZXR1cm4hMTt0PWQuZ2xvYmFsLGQudHlwZT1kLnR5cGUudG9VcHBlckNhc2UoKSxkLmhhc0NvbnRlbnQ9IWJNLnRlc3QoZC50eXBlKSx0JiZmLmFjdGl2ZSsrPT09MCYmZi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtpZighZC5oYXNDb250ZW50KXtkLmRhdGEmJihkLnVybCs9KGJPLnRlc3QoZC51cmwpPyImIjoiPyIpK2QuZGF0YSxkZWxldGUgZC5kYXRhKSxrPWQudXJsO2lmKGQuY2FjaGU9PT0hMSl7dmFyIHg9Zi5ub3coKSx5PWQudXJsLnJlcGxhY2UoYlMsIiQxXz0iK3gpO2QudXJsPXkrKHk9PT1kLnVybD8oYk8udGVzdChkLnVybCk/IiYiOiI/IikrIl89Iit4OiIiKX19KGQuZGF0YSYmZC5oYXNDb250ZW50JiZkLmNvbnRlbnRUeXBlIT09ITF8fGMuY29udGVudFR5cGUpJiZ2LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZC5jb250ZW50VHlwZSksZC5pZk1vZGlmaWVkJiYoaz1rfHxkLnVybCxmLmxhc3RNb2RpZmllZFtrXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsZi5sYXN0TW9kaWZpZWRba10pLGYuZXRhZ1trXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixmLmV0YWdba10pKSx2LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZC5kYXRhVHlwZXNbMF0mJmQuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0/ZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXSsoZC5kYXRhVHlwZXNbMF0hPT0iKiI/IiwgIitiWisiOyBxPTAuMDEiOiIiKTpkLmFjY2VwdHNbIioiXSk7Zm9yKHUgaW4gZC5oZWFkZXJzKXYuc2V0UmVxdWVzdEhlYWRlcih1LGQuaGVhZGVyc1t1XSk7aWYoZC5iZWZvcmVTZW5kJiYoZC5iZWZvcmVTZW5kLmNhbGwoZSx2LGQpPT09ITF8fHM9PT0yKSl7di5hYm9ydCgpO3JldHVybiExfWZvcih1IGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbdV0oZFt1XSk7cD1jYShiVyxkLGMsdik7aWYoIXApdygtMSwiTm8gVHJhbnNwb3J0Iik7ZWxzZXt2LnJlYWR5U3RhdGU9MSx0JiZnLnRyaWdnZXIoImFqYXhTZW5kIixbdixkXSksZC5hc3luYyYmZC50aW1lb3V0PjAmJihxPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2LmFib3J0KCJ0aW1lb3V0Iil9LGQudGltZW91dCkpO3RyeXtzPTEscC5zZW5kKGwsdyl9Y2F0Y2goeil7czwyP3coLTEseik6Zi5lcnJvcih6KX19cmV0dXJuIHZ9LHBhcmFtOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9Zi5pc0Z1bmN0aW9uKGIpP2IoKTpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtjPT09YiYmKGM9Zi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2lmKGYuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFmLmlzUGxhaW5PYmplY3QoYSkpZi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHZhciBnIGluIGEpY2MoZyxhW2ddLGMsZSk7cmV0dXJuIGQuam9pbigiJiIpLnJlcGxhY2UoYkYsIisiKX19KSxmLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e319KTt2YXIgY2Y9Zi5ub3coKSxjZz0vKFw9KVw/KCZ8JCl8XD9cPy9pO2YuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZi5leHBhbmRvKyJfIitjZisrfX0pLGYuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlPWIuY29udGVudFR5cGU9PT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiYmdHlwZW9mIGIuZGF0YT09InN0cmluZyI7aWYoYi5kYXRhVHlwZXNbMF09PT0ianNvbnAifHxiLmpzb25wIT09ITEmJihjZy50ZXN0KGIudXJsKXx8ZSYmY2cudGVzdChiLmRhdGEpKSl7dmFyIGcsaD1iLmpzb25wQ2FsbGJhY2s9Zi5pc0Z1bmN0aW9uKGIuanNvbnBDYWxsYmFjayk/Yi5qc29ucENhbGxiYWNrKCk6Yi5qc29ucENhbGxiYWNrLGk9YVtoXSxqPWIudXJsLGs9Yi5kYXRhLGw9IiQxIitoKyIkMiI7Yi5qc29ucCE9PSExJiYoaj1qLnJlcGxhY2UoY2csbCksYi51cmw9PT1qJiYoZSYmKGs9ay5yZXBsYWNlKGNnLGwpKSxiLmRhdGE9PT1rJiYoais9KC9cPy8udGVzdChqKT8iJiI6Ij8iKStiLmpzb25wKyI9IitoKSkpLGIudXJsPWosYi5kYXRhPWssYVtoXT1mdW5jdGlvbihhKXtnPVthXX0sZC5hbHdheXMoZnVuY3Rpb24oKXthW2hdPWksZyYmZi5pc0Z1bmN0aW9uKGkpJiZhW2hdKGdbMF0pfSksYi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7Z3x8Zi5lcnJvcihoKyIgd2FzIG5vdCBjYWxsZWQiKTtyZXR1cm4gZ1swXX0sYi5kYXRhVHlwZXNbMF09Impzb24iO3JldHVybiJzY3JpcHQifX0pLGYuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovamF2YXNjcmlwdHxlY21hc2NyaXB0L30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtmLmdsb2JhbEV2YWwoYSk7cmV0dXJuIGF9fX0pLGYuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXthLmNhY2hlPT09YiYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIsYS5nbG9iYWw9ITEpfSksZi5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBkLGU9Yy5oZWFkfHxjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGMuZG9jdW1lbnRFbGVtZW50O3JldHVybntzZW5kOmZ1bmN0aW9uKGYsZyl7ZD1jLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGQuYXN5bmM9ImFzeW5jIixhLnNjcmlwdENoYXJzZXQmJihkLmNoYXJzZXQ9YS5zY3JpcHRDaGFyc2V0KSxkLnNyYz1hLnVybCxkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihhLGMpe2lmKGN8fCFkLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZC5yZWFkeVN0YXRlKSlkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGUmJmQucGFyZW50Tm9kZSYmZS5yZW1vdmVDaGlsZChkKSxkPWIsY3x8ZygyMDAsInN1Y2Nlc3MiKX0sZS5pbnNlcnRCZWZvcmUoZCxlLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQub25sb2FkKDAsMSl9fX19KTt2YXIgY2g9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGNqKWNqW2FdKDAsMSl9OiExLGNpPTAsY2o7Zi5hamF4U2V0dGluZ3MueGhyPWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzTG9jYWwmJmNrKCl8fGNsKCl9OmNrLGZ1bmN0aW9uKGEpe2YuZXh0ZW5kKGYuc3VwcG9ydCx7YWpheDohIWEsY29yczohIWEmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gYX0pfShmLmFqYXhTZXR0aW5ncy54aHIoKSksZi5zdXBwb3J0LmFqYXgmJmYuYWpheFRyYW5zcG9ydChmdW5jdGlvbihjKXtpZighYy5jcm9zc0RvbWFpbnx8Zi5zdXBwb3J0LmNvcnMpe3ZhciBkO3JldHVybntzZW5kOmZ1bmN0aW9uKGUsZyl7dmFyIGg9Yy54aHIoKSxpLGo7Yy51c2VybmFtZT9oLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMsYy51c2VybmFtZSxjLnBhc3N3b3JkKTpoLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMpO2lmKGMueGhyRmllbGRzKWZvcihqIGluIGMueGhyRmllbGRzKWhbal09Yy54aHJGaWVsZHNbal07Yy5taW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUoYy5taW1lVHlwZSksIWMuY3Jvc3NEb21haW4mJiFlWyJYLVJlcXVlc3RlZC1XaXRoIl0mJihlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e2ZvcihqIGluIGUpaC5zZXRSZXF1ZXN0SGVhZGVyKGosZVtqXSl9Y2F0Y2goayl7fWguc2VuZChjLmhhc0NvbnRlbnQmJmMuZGF0YXx8bnVsbCksZD1mdW5jdGlvbihhLGUpe3ZhciBqLGssbCxtLG47dHJ5e2lmKGQmJihlfHxoLnJlYWR5U3RhdGU9PT00KSl7ZD1iLGkmJihoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mLm5vb3AsY2gmJmRlbGV0ZSBjaltpXSk7aWYoZSloLnJlYWR5U3RhdGUhPT00JiZoLmFib3J0KCk7ZWxzZXtqPWguc3RhdHVzLGw9aC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSxtPXt9LG49aC5yZXNwb25zZVhNTCxuJiZuLmRvY3VtZW50RWxlbWVudCYmKG0ueG1sPW4pLG0udGV4dD1oLnJlc3BvbnNlVGV4dDt0cnl7az1oLnN0YXR1c1RleHR9Y2F0Y2gobyl7az0iIn0haiYmYy5pc0xvY2FsJiYhYy5jcm9zc0RvbWFpbj9qPW0udGV4dD8yMDA6NDA0Omo9PT0xMjIzJiYoaj0yMDQpfX19Y2F0Y2gocCl7ZXx8ZygtMSxwKX1tJiZnKGosayxtLGwpfSwhYy5hc3luY3x8aC5yZWFkeVN0YXRlPT09ND9kKCk6KGk9KytjaSxjaCYmKGNqfHwoY2o9e30sZihhKS51bmxvYWQoY2gpKSxjaltpXT1kKSxoLm9ucmVhZHlzdGF0ZWNoYW5nZT1kKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkKDAsMSl9fX19KTt2YXIgY209e30sY24sY28sY3A9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGNxPS9eKFsrXC1dPSk/KFtcZCsuXC1dKykoW2EteiVdKikkL2ksY3IsY3M9W1siaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxbIndpZHRoIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxbIm9wYWNpdHkiXV0sY3Q7Zi5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjdygic2hvdyIsMyksYSxiLGMpO2Zvcih2YXIgZz0wLGg9dGhpcy5sZW5ndGg7ZzxoO2crKylkPXRoaXNbZ10sZC5zdHlsZSYmKGU9ZC5zdHlsZS5kaXNwbGF5LCFmLl9kYXRhKGQsIm9sZGRpc3BsYXkiKSYmZT09PSJub25lIiYmKGU9ZC5zdHlsZS5kaXNwbGF5PSIiKSxlPT09IiImJmYuY3NzKGQsImRpc3BsYXkiKT09PSJub25lIiYmZi5fZGF0YShkLCJvbGRkaXNwbGF5IixjeChkLm5vZGVOYW1lKSkpO2ZvcihnPTA7ZzxoO2crKyl7ZD10aGlzW2ddO2lmKGQuc3R5bGUpe2U9ZC5zdHlsZS5kaXNwbGF5O2lmKGU9PT0iInx8ZT09PSJub25lIilkLnN0eWxlLmRpc3BsYXk9Zi5fZGF0YShkLCJvbGRkaXNwbGF5Iil8fCIifX1yZXR1cm4gdGhpc30saGlkZTpmdW5jdGlvbihhLGIsYyl7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjdygiaGlkZSIsMyksYSxiLGMpO3ZhciBkLGUsZz0wLGg9dGhpcy5sZW5ndGg7Zm9yKDtnPGg7ZysrKWQ9dGhpc1tnXSxkLnN0eWxlJiYoZT1mLmNzcyhkLCJkaXNwbGF5IiksZSE9PSJub25lIiYmIWYuX2RhdGEoZCwib2xkZGlzcGxheSIpJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGUpKTtmb3IoZz0wO2c8aDtnKyspdGhpc1tnXS5zdHlsZSYmKHRoaXNbZ10uc3R5bGUuZGlzcGxheT0ibm9uZSIpO3JldHVybiB0aGlzfSxfdG9nZ2xlOmYuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dHlwZW9mIGE9PSJib29sZWFuIjtmLmlzRnVuY3Rpb24oYSkmJmYuaXNGdW5jdGlvbihiKT90aGlzLl90b2dnbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpOmE9PW51bGx8fGQ/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ZD9hOmYodGhpcykuaXMoIjpoaWRkZW4iKTtmKHRoaXMpW2I/InNob3ciOiJoaWRlIl0oKX0pOnRoaXMuYW5pbWF0ZShjdygidG9nZ2xlIiwzKSxhLGIsYyk7cmV0dXJuIHRoaXN9LGZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoIjpoaWRkZW4iKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXtmdW5jdGlvbiBnKCl7ZS5xdWV1ZT09PSExJiZmLl9tYXJrKHRoaXMpO3ZhciBiPWYuZXh0ZW5kKHt9LGUpLGM9dGhpcy5ub2RlVHlwZT09PTEsZD1jJiZmKHRoaXMpLmlzKCI6aGlkZGVuIiksZyxoLGksaixrLGwsbSxuLG87Yi5hbmltYXRlZFByb3BlcnRpZXM9e307Zm9yKGkgaW4gYSl7Zz1mLmNhbWVsQ2FzZShpKSxpIT09ZyYmKGFbZ109YVtpXSxkZWxldGUgYVtpXSksaD1hW2ddLGYuaXNBcnJheShoKT8oYi5hbmltYXRlZFByb3BlcnRpZXNbZ109aFsxXSxoPWFbZ109aFswXSk6Yi5hbmltYXRlZFByb3BlcnRpZXNbZ109Yi5zcGVjaWFsRWFzaW5nJiZiLnNwZWNpYWxFYXNpbmdbZ118fGIuZWFzaW5nfHwic3dpbmciO2lmKGg9PT0iaGlkZSImJmR8fGg9PT0ic2hvdyImJiFkKXJldHVybiBiLmNvbXBsZXRlLmNhbGwodGhpcyk7YyYmKGc9PT0iaGVpZ2h0Inx8Zz09PSJ3aWR0aCIpJiYoYi5vdmVyZmxvdz1bdGhpcy5zdHlsZS5vdmVyZmxvdyx0aGlzLnN0eWxlLm92ZXJmbG93WCx0aGlzLnN0eWxlLm92ZXJmbG93WV0sZi5jc3ModGhpcywiZGlzcGxheSIpPT09ImlubGluZSImJmYuY3NzKHRoaXMsImZsb2F0Iik9PT0ibm9uZSImJighZi5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXR8fGN4KHRoaXMubm9kZU5hbWUpPT09ImlubGluZSI/dGhpcy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnRoaXMuc3R5bGUuem9vbT0xKSl9Yi5vdmVyZmxvdyE9bnVsbCYmKHRoaXMuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpO2ZvcihpIGluIGEpaj1uZXcgZi5meCh0aGlzLGIsaSksaD1hW2ldLGNwLnRlc3QoaCk/KG89Zi5fZGF0YSh0aGlzLCJ0b2dnbGUiK2kpfHwoaD09PSJ0b2dnbGUiP2Q/InNob3ciOiJoaWRlIjowKSxvPyhmLl9kYXRhKHRoaXMsInRvZ2dsZSIraSxvPT09InNob3ciPyJoaWRlIjoic2hvdyIpLGpbb10oKSk6altoXSgpKTooaz1jcS5leGVjKGgpLGw9ai5jdXIoKSxrPyhtPXBhcnNlRmxvYXQoa1syXSksbj1rWzNdfHwoZi5jc3NOdW1iZXJbaV0/IiI6InB4IiksbiE9PSJweCImJihmLnN0eWxlKHRoaXMsaSwobXx8MSkrbiksbD0obXx8MSkvai5jdXIoKSpsLGYuc3R5bGUodGhpcyxpLGwrbikpLGtbMV0mJihtPShrWzFdPT09Ii09Ij8tMToxKSptK2wpLGouY3VzdG9tKGwsbSxuKSk6ai5jdXN0b20obCxoLCIiKSk7cmV0dXJuITB9dmFyIGU9Zi5zcGVlZChiLGMsZCk7aWYoZi5pc0VtcHR5T2JqZWN0KGEpKXJldHVybiB0aGlzLmVhY2goZS5jb21wbGV0ZSxbITFdKTthPWYuZXh0ZW5kKHt9LGEpO3JldHVybiBlLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZS5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGMsZCl7dHlwZW9mIGEhPSJzdHJpbmciJiYoZD1jLGM9YSxhPWIpLGMmJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChhLGIsYyl7dmFyIGU9YltjXTtmLnJlbW92ZURhdGEoYSxjLCEwKSxlLnN0b3AoZCl9dmFyIGIsYz0hMSxlPWYudGltZXJzLGc9Zi5fZGF0YSh0aGlzKTtkfHxmLl91bm1hcmsoITAsdGhpcyk7aWYoYT09bnVsbClmb3IoYiBpbiBnKWdbYl0uc3RvcCYmYi5pbmRleE9mKCIucnVuIik9PT1iLmxlbmd0aC00JiZoKHRoaXMsZyxiKTtlbHNlIGdbYj1hKyIucnVuIl0mJmdbYl0uc3RvcCYmaCh0aGlzLGcsYik7Zm9yKGI9ZS5sZW5ndGg7Yi0tOyllW2JdLmVsZW09PT10aGlzJiYoYT09bnVsbHx8ZVtiXS5xdWV1ZT09PWEpJiYoZD9lW2JdKCEwKTplW2JdLnNhdmVTdGF0ZSgpLGM9ITAsZS5zcGxpY2UoYiwxKSk7KCFkfHwhYykmJmYuZGVxdWV1ZSh0aGlzLGEpfSl9fSksZi5lYWNoKHtzbGlkZURvd246Y3coInNob3ciLDEpLHNsaWRlVXA6Y3coImhpZGUiLDEpLHNsaWRlVG9nZ2xlOmN3KCJ0b2dnbGUiLDEpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsYSxjLGQpfX0pLGYuZXh0ZW5kKHtzcGVlZDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmdHlwZW9mIGE9PSJvYmplY3QiP2YuZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8Zi5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFmLmlzRnVuY3Rpb24oYikmJmJ9O2QuZHVyYXRpb249Zi5meC5vZmY/MDp0eXBlb2YgZC5kdXJhdGlvbj09Im51bWJlciI/ZC5kdXJhdGlvbjpkLmR1cmF0aW9uIGluIGYuZnguc3BlZWRzP2YuZnguc3BlZWRzW2QuZHVyYXRpb25dOmYuZnguc3BlZWRzLl9kZWZhdWx0O2lmKGQucXVldWU9PW51bGx8fGQucXVldWU9PT0hMClkLnF1ZXVlPSJmeCI7ZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKGEpe2YuaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZT9mLmRlcXVldWUodGhpcyxkLnF1ZXVlKTphIT09ITEmJmYuX3VubWFyayh0aGlzKX07cmV0dXJuIGR9LGVhc2luZzp7bGluZWFyOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBjK2QqYX0sc3dpbmc6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuKC1NYXRoLmNvcyhhKk1hdGguUEkpLzIrLjUpKmQrY319LHRpbWVyczpbXSxmeDpmdW5jdGlvbihhLGIsYyl7dGhpcy5vcHRpb25zPWIsdGhpcy5lbGVtPWEsdGhpcy5wcm9wPWMsYi5vcmlnPWIub3JpZ3x8e319fSksZi5meC5wcm90b3R5cGU9e3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSwoZi5meC5zdGVwW3RoaXMucHJvcF18fGYuZnguc3RlcC5fZGVmYXVsdCkodGhpcyl9LGN1cjpmdW5jdGlvbigpe2lmKHRoaXMuZWxlbVt0aGlzLnByb3BdIT1udWxsJiYoIXRoaXMuZWxlbS5zdHlsZXx8dGhpcy5lbGVtLnN0eWxlW3RoaXMucHJvcF09PW51bGwpKXJldHVybiB0aGlzLmVsZW1bdGhpcy5wcm9wXTt2YXIgYSxiPWYuY3NzKHRoaXMuZWxlbSx0aGlzLnByb3ApO3JldHVybiBpc05hTihhPXBhcnNlRmxvYXQoYikpPyFifHxiPT09ImF1dG8iPzA6YjphfSxjdXN0b206ZnVuY3Rpb24oYSxjLGQpe2Z1bmN0aW9uIGgoYSl7cmV0dXJuIGUuc3RlcChhKX12YXIgZT10aGlzLGc9Zi5meDt0aGlzLnN0YXJ0VGltZT1jdHx8Y3UoKSx0aGlzLmVuZD1jLHRoaXMubm93PXRoaXMuc3RhcnQ9YSx0aGlzLnBvcz10aGlzLnN0YXRlPTAsdGhpcy51bml0PWR8fHRoaXMudW5pdHx8KGYuY3NzTnVtYmVyW3RoaXMucHJvcF0/IiI6InB4IiksaC5xdWV1ZT10aGlzLm9wdGlvbnMucXVldWUsaC5lbGVtPXRoaXMuZWxlbSxoLnNhdmVTdGF0ZT1mdW5jdGlvbigpe2Uub3B0aW9ucy5oaWRlJiZmLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3ApPT09YiYmZi5fZGF0YShlLmVsZW0sImZ4c2hvdyIrZS5wcm9wLGUuc3RhcnQpfSxoKCkmJmYudGltZXJzLnB1c2goaCkmJiFjciYmKGNyPXNldEludGVydmFsKGcudGljayxnLmludGVydmFsKSl9LHNob3c6ZnVuY3Rpb24oKXt2YXIgYT1mLl9kYXRhKHRoaXMuZWxlbSwiZnhzaG93Iit0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09YXx8Zi5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKSx0aGlzLm9wdGlvbnMuc2hvdz0hMCxhIT09Yj90aGlzLmN1c3RvbSh0aGlzLmN1cigpLGEpOnRoaXMuY3VzdG9tKHRoaXMucHJvcD09PSJ3aWR0aCJ8fHRoaXMucHJvcD09PSJoZWlnaHQiPzE6MCx0aGlzLmN1cigpKSxmKHRoaXMuZWxlbSkuc2hvdygpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1mLl9kYXRhKHRoaXMuZWxlbSwiZnhzaG93Iit0aGlzLnByb3ApfHxmLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5oaWRlPSEwLHRoaXMuY3VzdG9tKHRoaXMuY3VyKCksMCl9LHN0ZXA6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9Y3R8fGN1KCksZz0hMCxoPXRoaXMuZWxlbSxpPXRoaXMub3B0aW9ucztpZihhfHxlPj1pLmR1cmF0aW9uK3RoaXMuc3RhcnRUaW1lKXt0aGlzLm5vdz10aGlzLmVuZCx0aGlzLnBvcz10aGlzLnN0YXRlPTEsdGhpcy51cGRhdGUoKSxpLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdPSEwO2ZvcihiIGluIGkuYW5pbWF0ZWRQcm9wZXJ0aWVzKWkuYW5pbWF0ZWRQcm9wZXJ0aWVzW2JdIT09ITAmJihnPSExKTtpZihnKXtpLm92ZXJmbG93IT1udWxsJiYhZi5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3MmJmYuZWFjaChbIiIsIlgiLCJZIl0sZnVuY3Rpb24oYSxiKXtoLnN0eWxlWyJvdmVyZmxvdyIrYl09aS5vdmVyZmxvd1thXX0pLGkuaGlkZSYmZihoKS5oaWRlKCk7aWYoaS5oaWRlfHxpLnNob3cpZm9yKGIgaW4gaS5hbmltYXRlZFByb3BlcnRpZXMpZi5zdHlsZShoLGIsaS5vcmlnW2JdKSxmLnJlbW92ZURhdGEoaCwiZnhzaG93IitiLCEwKSxmLnJlbW92ZURhdGEoaCwidG9nZ2xlIitiLCEwKTtkPWkuY29tcGxldGUsZCYmKGkuY29tcGxldGU9ITEsZC5jYWxsKGgpKX1yZXR1cm4hMX1pLmR1cmF0aW9uPT1JbmZpbml0eT90aGlzLm5vdz1lOihjPWUtdGhpcy5zdGFydFRpbWUsdGhpcy5zdGF0ZT1jL2kuZHVyYXRpb24sdGhpcy5wb3M9Zi5lYXNpbmdbaS5hbmltYXRlZFByb3BlcnRpZXNbdGhpcy5wcm9wXV0odGhpcy5zdGF0ZSxjLDAsMSxpLmR1cmF0aW9uKSx0aGlzLm5vdz10aGlzLnN0YXJ0Kyh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0aGlzLnBvcyksdGhpcy51cGRhdGUoKTtyZXR1cm4hMH19LGYuZXh0ZW5kKGYuZngse3RpY2s6ZnVuY3Rpb24oKXt2YXIgYSxiPWYudGltZXJzLGM9MDtmb3IoO2M8Yi5sZW5ndGg7YysrKWE9YltjXSwhYSgpJiZiW2NdPT09YSYmYi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxmLmZ4LnN0b3AoKX0saW50ZXJ2YWw6MTMsc3RvcDpmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoY3IpLGNyPW51bGx9LHNwZWVkczp7c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxzdGVwOntvcGFjaXR5OmZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLCJvcGFjaXR5IixhLm5vdyl9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe2EuZWxlbS5zdHlsZSYmYS5lbGVtLnN0eWxlW2EucHJvcF0hPW51bGw/YS5lbGVtLnN0eWxlW2EucHJvcF09YS5ub3crYS51bml0OmEuZWxlbVthLnByb3BdPWEubm93fX19KSxmLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7Zi5meC5zdGVwW2JdPWZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLGIsTWF0aC5tYXgoMCxhLm5vdykpfX0pLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gZi5ncmVwKGYudGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofSk7dmFyIGN5PS9edCg/OmFibGV8ZHxoKSQvaSxjej0vXig/OmJvZHl8aHRtbCkkL2k7ImdldEJvdW5kaW5nQ2xpZW50UmVjdCJpbiBjLmRvY3VtZW50RWxlbWVudD9mLmZuLm9mZnNldD1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdLGM7aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dHJ5e2M9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChkKXt9dmFyIGU9Yi5vd25lckRvY3VtZW50LGc9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoIWN8fCFmLmNvbnRhaW5zKGcsYikpcmV0dXJuIGM/e3RvcDpjLnRvcCxsZWZ0OmMubGVmdH06e3RvcDowLGxlZnQ6MH07dmFyIGg9ZS5ib2R5LGk9Y0EoZSksaj1nLmNsaWVudFRvcHx8aC5jbGllbnRUb3B8fDAsaz1nLmNsaWVudExlZnR8fGguY2xpZW50TGVmdHx8MCxsPWkucGFnZVlPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmZy5zY3JvbGxUb3B8fGguc2Nyb2xsVG9wLG09aS5wYWdlWE9mZnNldHx8Zi5zdXBwb3J0LmJveE1vZGVsJiZnLnNjcm9sbExlZnR8fGguc2Nyb2xsTGVmdCxuPWMudG9wK2wtaixvPWMubGVmdCttLWs7cmV0dXJue3RvcDpuLGxlZnQ6b319OmYuZm4ub2Zmc2V0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dmFyIGMsZD1iLm9mZnNldFBhcmVudCxlPWIsZz1iLm93bmVyRG9jdW1lbnQsaD1nLmRvY3VtZW50RWxlbWVudCxpPWcuYm9keSxqPWcuZGVmYXVsdFZpZXcsaz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGw9Yi5vZmZzZXRUb3AsbT1iLm9mZnNldExlZnQ7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmYiE9PWkmJmIhPT1oKXtpZihmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmay5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7Yz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGwtPWIuc2Nyb2xsVG9wLG0tPWIuc2Nyb2xsTGVmdCxiPT09ZCYmKGwrPWIub2Zmc2V0VG9wLG0rPWIub2Zmc2V0TGVmdCxmLnN1cHBvcnQuZG9lc05vdEFkZEJvcmRlciYmKCFmLnN1cHBvcnQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHN8fCFjeS50ZXN0KGIubm9kZU5hbWUpKSYmKGwrPXBhcnNlRmxvYXQoYy5ib3JkZXJUb3BXaWR0aCl8fDAsbSs9cGFyc2VGbG9hdChjLmJvcmRlckxlZnRXaWR0aCl8fDApLGU9ZCxkPWIub2Zmc2V0UGFyZW50KSxmLnN1cHBvcnQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZjLm92ZXJmbG93IT09InZpc2libGUiJiYobCs9cGFyc2VGbG9hdChjLmJvcmRlclRvcFdpZHRoKXx8MCxtKz1wYXJzZUZsb2F0KGMuYm9yZGVyTGVmdFdpZHRoKXx8MCksaz1jfWlmKGsucG9zaXRpb249PT0icmVsYXRpdmUifHxrLnBvc2l0aW9uPT09InN0YXRpYyIpbCs9aS5vZmZzZXRUb3AsbSs9aS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5maXhlZFBvc2l0aW9uJiZrLnBvc2l0aW9uPT09ImZpeGVkIiYmKGwrPU1hdGgubWF4KGguc2Nyb2xsVG9wLGkuc2Nyb2xsVG9wKSxtKz1NYXRoLm1heChoLnNjcm9sbExlZnQsaS5zY3JvbGxMZWZ0KSk7cmV0dXJue3RvcDpsLGxlZnQ6bX19LGYub2Zmc2V0PXtib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGM9YS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKGIrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCk7cmV0dXJue3RvcDpiLGxlZnQ6Y319LHNldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Zi5jc3MoYSwicG9zaXRpb24iKTtkPT09InN0YXRpYyImJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBlPWYoYSksZz1lLm9mZnNldCgpLGg9Zi5jc3MoYSwidG9wIiksaT1mLmNzcyhhLCJsZWZ0Iiksaj0oZD09PSJhYnNvbHV0ZSJ8fGQ9PT0iZml4ZWQiKSYmZi5pbkFycmF5KCJhdXRvIixbaCxpXSk+LTEsaz17fSxsPXt9LG0sbjtqPyhsPWUucG9zaXRpb24oKSxtPWwudG9wLG49bC5sZWZ0KToobT1wYXJzZUZsb2F0KGgpfHwwLG49cGFyc2VGbG9hdChpKXx8MCksZi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGcpKSxiLnRvcCE9bnVsbCYmKGsudG9wPWIudG9wLWcudG9wK20pLGIubGVmdCE9bnVsbCYmKGsubGVmdD1iLmxlZnQtZy5sZWZ0K24pLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGspOmUuY3NzKGspfX0sZi5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuIG51bGw7dmFyIGE9dGhpc1swXSxiPXRoaXMub2Zmc2V0UGFyZW50KCksYz10aGlzLm9mZnNldCgpLGQ9Y3oudGVzdChiWzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTpiLm9mZnNldCgpO2MudG9wLT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjLmxlZnQtPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCxkLnRvcCs9cGFyc2VGbG9hdChmLmNzcyhiWzBdLCJib3JkZXJUb3BXaWR0aCIpKXx8MCxkLmxlZnQrPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyTGVmdFdpZHRoIikpfHwwO3JldHVybnt0b3A6Yy50b3AtZC50b3AsbGVmdDpjLmxlZnQtZC5sZWZ0fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fGMuYm9keTt3aGlsZShhJiYhY3oudGVzdChhLm5vZGVOYW1lKSYmZi5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF9KX19KSxmLmVhY2goWyJMZWZ0IiwiVG9wIl0sZnVuY3Rpb24oYSxjKXt2YXIgZD0ic2Nyb2xsIitjO2YuZm5bZF09ZnVuY3Rpb24oYyl7dmFyIGUsZztpZihjPT09Yil7ZT10aGlzWzBdO2lmKCFlKXJldHVybiBudWxsO2c9Y0EoZSk7cmV0dXJuIGc/InBhZ2VYT2Zmc2V0ImluIGc/Z1thPyJwYWdlWU9mZnNldCI6InBhZ2VYT2Zmc2V0Il06Zi5zdXBwb3J0LmJveE1vZGVsJiZnLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8Zy5kb2N1bWVudC5ib2R5W2RdOmVbZF19cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2c9Y0EodGhpcyksZz9nLnNjcm9sbFRvKGE/ZihnKS5zY3JvbGxMZWZ0KCk6YyxhP2M6ZihnKS5zY3JvbGxUb3AoKSk6dGhpc1tkXT1jfSl9fSksZi5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGMpe3ZhciBkPWMudG9Mb3dlckNhc2UoKTtmLmZuWyJpbm5lciIrY109ZnVuY3Rpb24oKXt2YXIgYT10aGlzWzBdO3JldHVybiBhP2Euc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhhLGQsInBhZGRpbmciKSk6dGhpc1tkXSgpOm51bGx9LGYuZm5bIm91dGVyIitjXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO3JldHVybiBiP2Iuc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhiLGQsYT8ibWFyZ2luIjoiYm9yZGVyIikpOnRoaXNbZF0oKTpudWxsfSxmLmZuW2RdPWZ1bmN0aW9uKGEpe3ZhciBlPXRoaXNbMF07aWYoIWUpcmV0dXJuIGE9PW51bGw/bnVsbDp0aGlzO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Y1tkXShhLmNhbGwodGhpcyxiLGNbZF0oKSkpfSk7aWYoZi5pc1dpbmRvdyhlKSl7dmFyIGc9ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10saD1lLmRvY3VtZW50LmJvZHk7cmV0dXJuIGUuZG9jdW1lbnQuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0IiYmZ3x8aCYmaFsiY2xpZW50IitjXXx8Z31pZihlLm5vZGVUeXBlPT09OSlyZXR1cm4gTWF0aC5tYXgoZS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10sZS5ib2R5WyJzY3JvbGwiK2NdLGUuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2NdLGUuYm9keVsib2Zmc2V0IitjXSxlLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IitjXSk7aWYoYT09PWIpe3ZhciBpPWYuY3NzKGUsZCksaj1wYXJzZUZsb2F0KGkpO3JldHVybiBmLmlzTnVtZXJpYyhqKT9qOml9cmV0dXJuIHRoaXMuY3NzKGQsdHlwZW9mIGE9PSJzdHJpbmciP2E6YSsicHgiKX19KSxhLmpRdWVyeT1hLiQ9Zn0pKHdpbmRvdyk7'></script>



	<script id=script_head>
		var myb64=new Array();
		var myb64_js=new Array();
		var myb64_png=new Array();
		var myb64_jpg=new Array();
		var myb64_pdf=new Array();
		var myb64_csv=new Array();
		var myb64_psv=new Array();
		var mylinks=new Array();
		</script>


<style type="text/css">
	.exampleserif {font-family: Times, "Times New Roman", Georgia, serif;}
	.examplesansserif {font-family: Verdana, Arial, Helvetica, sans-serif;}
	.examplemonospace {font-family: "Lucida Console", Courier, monospace;}
	.examplecursive {font-family: cursive;}
	.examplefantasy {font-family: fantasy;}
	.exampleyokkmokk {font-family: yokkmokkOT; font-size:38pt;}
	.exampleyokkmokk_small {font-family: yokkmokkOT_file; font-size:20pt;}
	.exampleyokkmokk_file {font-family: yokkmokkOT_file; font-size:50pt;}
	</style>





<style id="popups">
	/*HOVER POPUP LINKS*/
	/*hoverpopups type 1*/

	#popup { color: #000; background-color: #c0c0c0; }

	#popup a, #popup a:visited {
		position: relative;
		display: block;
		width: 130px;
		line-height: 30px;
		text-align: right;
		padding: 0 10px;
		margin: 0;
		border: 1px solid #666;
		text-decoration: none;
		font-size: 1em;
		font-weight: bold;
		}

	#popup a span {display: none;}
	#popup a:hover { background-color: #e9e9e2; }

/* the IE correction rule */
	#popup a:hover	{color: #f00; background-color: #e9e9e2; text-indent: 0; /* added the default value */
	#popup a:hover span {
		display: block;
		position: absolute;
		top: 0px;
		left: 170px;
		width: 320px;
		margin: 0px;
		padding: 10px;
		color: #335500;
		font-weight: normal;
		background: #e5e5e5;
		text-align: left;
		border: 1px solid #666;
		}

	</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: goldenrod;
//			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>
		.thumbnail  {
			position: relative;
			float: left;
			padding: 5px;
			/*z-index: 0;*/
			}

		.thumbnail:hover {
			background-color: #e9e9e2;
			/*z-index: 50;*/
			color: #335500;
			text-decoration: none;
			}

		.thumbnail 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;
				}

		.thumbnail span img { /*CSS for enlarged image*/
			border-width: 0px; 
			/*padding: 2px;*/
		}
		
		.thumbnail:hover span { /*CSS for enlarged image on hover*/
			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;
		}
		
		.thumbnail2 span img { /*CSS for enlarged image*/
			border-width: 0px;
			/*padding: 2px;*/
		}
		
		.thumbnail2:hover span { /*CSS for enlarged image on hover*/
			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; 
			}
		
		/*end of hover popup links*/
		
		</style>
		
		<script id="script_fileexists">
			function html_error() {
				document.write("<hr><h1>ERR_206</h1><hr>");
				exit();
				}
			function myfileexists(myfilename) {
				var fs = require('fs'),
				filename = process.args[2];
				filename = "index.png";
				fs.exists(filename, function(exists) {
				if (exists) {
					fs.stat(filename, function(err, stats) { 
					if (stats.isDirectory()) {
//						console.log(filename + ": is a directory");
						document.write(filename + ": is a directory");
						} 
					else {
        // do something with file
//						console.log(filename);
						document.write(filename);
						}
					});
					} 
				else {
//					console.log(filename + ": no such file");
					document.write(filename + ": disabled<hr><hr><hr><hr><hr><hr><hr>");
					html_error();
					}
				});

			</script id=script_fileexists_end>





		<script id=index_js_terminal>
//	var util = util || {};
//	util.toArray = function(list) {
//			return Array.prototype.slice.call(list || [], 0);
//			};

	var Terminal = Terminal || function(cmdLineContainer, outputContainer) {
	window.URL = window.URL || window.webkitURL;
	window.requestFileSystem = window.requestFileSystem ||
                             window.webkitRequestFileSystem;

	var cmdLine_ = document.querySelector(cmdLineContainer);
	var output_ = document.querySelector(outputContainer);
	const VERSION_ = '0.0.1';

	const CMDS_ = [
		'\.', '\.\.', '\:', '/', '\?', '+', '-', '\$', '\^', '\`', char(27), 
		'n', 'i', 'o', 'a', 'I', 'O', 'A', 'h', 
		'go', 'go1', 'ok', 'ok1',
		'cat', 'cd', 'cp', 'clear', 'date', 'help', 'ls', 'mkdir', 'mv', 'open',
		'pwd', 'rm', 'rmdir', 'theme', 'version', 'who'
		];

	const THEMES_ = ['default', 'cream'];
		var fs_ = null;
		var cwd_ = null;
		var history_ = [];
		var histpos_ = 0;
		var histtemp_ = 0;

		window.addEventListener('click', function(e) {
			cmdLine_.focus();
			}, false);

// Always force text cursor to end of input line.
		cmdLine_.addEventListener('click', inputTextClick_, false);

// Handle up/down key presses for shell history and enter for new command.
		cmdLine_.addEventListener('keydown', historyHandler_, false);
		cmdLine_.addEventListener('keydown', processNewCommand_, false);

	function inputTextClick_(e) {
		this.value = this.value;
		}

	function historyHandler_(e) { // Tab needs to be keydown.

		if (history_.length) {
			if (e.keyCode == 38 || e.keyCode == 40) {
				if (history_[histpos_]) {
					history_[histpos_] = this.value;
					} 
				else {
					histtemp_ = this.value;
					}
				}

		if (e.keyCode == 38) { // up
			histpos_--;
			if (histpos_ < 0) {
				histpos_ = 0;
				}
			} 
		else if (e.keyCode == 40) { // down
			histpos_++;
			if (histpos_ > history_.length) {
				histpos_ = history_.length;
				}
			}

		if (e.keyCode == 38 || e.keyCode == 40) {
			this.value = history_[histpos_] ? history_[histpos_] : histtemp_;
			this.value = this.value; // Sets cursor to end of input.
			}
		}
	}

		function processNewCommand_(e) {
			if (e.keyCode == 9) { // tab
				e.preventDefault();
// TODO(ericbidelman): Implement tab suggest.
				} else if (e.keyCode == 13) { // enter

// Save shell history.
			if (this.value) {
				history_[history_.length] = this.value;
				histpos_ = history_.length;
				}


// Duplicate current input and append to output section.
			var line = this.parentNode.parentNode.cloneNode(true);
			line.removeAttribute('id')
			line.classList.add('line');
			var input = line.querySelector('input.cmdline');
			input.autofocus = false;
			input.readOnly = true;
			output_.appendChild(line);

// Parse out command, args, and trim off whitespace.
// TODO(ericbidelman): Support multiple comma separated commands.
			if (this.value && this.value.trim()) {
				var args = this.value.split(' ').filter(function(val, i) {
					return val;
					});
				var cmd = args[0].toLowerCase();
			args = args.splice(1); // Remove cmd from arg list.
				}

			switch (cmd) {
				case 'cat':
					var fileName = args.join(' ');

					if (!fileName) {
						output('usage: ' + cmd + ' filename');
						break;
						}

					read_(cmd, fileName, function(result) {
					output('<pre>' + result + '</pre>');
					});

					break;
				case 'clear':
					output_.innerHTML = '';
					this.value = '';
					return;
				case 'date':
					output((new Date()).toLocaleString());
					break;
				case '.':
					script_dd_new();
					break;
				case '..':
					script_dd_new();
					break;
				case 'help':
					output('<div class="ls-files">' + CMDS_.join('<br>') + '</div>');
<!--					output('<p>drag</p>');	-->
					break;
				case 'ls':
					ls_(function(entries) {
					if (entries.length) {
						var html = formatColumns_(entries);
						util.toArray(entries).forEach(function(entry, i) {
							html.push(
							'<span class="', entry.isDirectory ? 'folder' : 'file',
							'">', entry.name, '</span><br>');
							});
						html.push('</div>');
						output(html.join(''));
						}
					});
					break;
				case 'pwd':
					output(cwd_.fullPath);
					break;
				case 'cd':
					var dest = args.join(' ') || '/';

					cwd_.getDirectory(dest, {}, function(dirEntry) {
						cwd_ = dirEntry;
						output('<div>' + dirEntry.fullPath + '</div>');
						}, function(e) { invalidOpForEntryType_(e, cmd, dest); });

					break;
				case 'mkdir':
					var dashP = false;
					var index = args.indexOf('-p');
					if (index != -1) {
						args.splice(index, 1);
						dashP = true;
						}

					if (!args.length) {
						output('usage: ' + cmd + ' [-p] directory<br>');
						break;
						}

// Create each directory passed as an argument.
				args.forEach(function(dirName, i) {
					if (dashP) {
						var folders = dirName.split('/');

// Throw out './' or '/' if present on the beginning of our path.
						if (folders[0] == '.' || folders[0] == '') {
							folders = folders.slice(1);
							}

						createDir_(cwd_, folders);
						} 
					else {
						cwd_.getDirectory(dirName, {create: true, exclusive: true}, null,
						function(e) { invalidOpForEntryType_(e, cmd, dirName); });
						}
					});
					break;

				case 'cp':
				case 'mv':
					var src = args[0];
					var dest = args[1];

					if (!src || !dest) {
						output(['usage: ', cmd, ' source target<br>',
						'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', cmd,
						' source directory/'].join(''));
						break;
						}

						var runAction = function(cmd, srcDirEntry, destDirEntry, opt_newName) {
						var newName = opt_newName || null;
						if (cmd == 'mv') {
							srcDirEntry.moveTo(destDirEntry, newName, function(e) {
// UNIX doesn't display output on successful move.
							}, function(e) {
								errorHandler_(e);
								});
							} 
						else {
							srcDirEntry.copyTo(destDirEntry, newName, function(e) {
// UNIX doesn't display output on successful copy.
								}, function(e) {
									errorHandler_(e);
								});
							}
						};

// Moving to a folder? (e.g. second arg ends in '/').
					if (dest[dest.length - 1] == '/') {
						cwd_.getDirectory(src, {}, function(srcDirEntry) {
// Create blacklist for dirs we can't re-create.
							var create = [
								'.', './', '..', '../', '/'].indexOf(dest) != -1 ? false : true;

							cwd_.getDirectory(dest, {create: create}, function(destDirEntry) {
								runAction(cmd, srcDirEntry, destDirEntry);
								}, errorHandler_);
							}, function(e) {
// Try the src entry as a file instead.
								cwd_.getFile(src, {}, function(srcDirEntry) {
									cwd_.getDirectory(dest, {}, function(destDirEntry) {
									runAction(cmd, srcDirEntry, destDirEntry);
									}, errorHandler_);
								}, errorHandler_);
							});
						} 
					else { // Treat src/destination as files.
						cwd_.getFile(src, {}, function(srcFileEntry) {
							srcFileEntry.getParent(function(parentDirEntry) {
							runAction(cmd, srcFileEntry, parentDirEntry, dest);
							}, errorHandler_);
						}, errorHandler_);
					}

					break;



				case 'open':
					var fileName = args.join(' ');

					if (!fileName) {
						output('usage: ' + cmd + ' filename');
						break;
						}

					open_(cmd, fileName, function(fileEntry) {
						var myWin = window.open(fileEntry.toURL(), 'mywin');
						});

					break;

				case 'rm':
// Remove recursively? If so, remove the flag(s) from the arg list.
					var recursive = false;
					['-r', '-f', '-rf', '-fr'].forEach(function(arg, i) {
						var index = args.indexOf(arg);
						if (index != -1) {
							args.splice(index, 1);
							recursive = true;
							}
						});

// Remove each file passed as an argument.
					args.forEach(function(fileName, i) {
						cwd_.getFile(fileName, {}, function(fileEntry) {
							fileEntry.remove(function() {}, errorHandler_);
							}, function(e) {
								if (recursive && e.code == FileError.TYPE_MISMATCH_ERR) {
									cwd_.getDirectory(fileName, {}, function(dirEntry) {
										dirEntry.removeRecursively(function() {}, errorHandler_);
										}, errorHandler_);
									} 
								else if (e.code == FileError.INVALID_STATE_ERR) {
									output(cmd + ': ' + fileName + ': is a directory<br>');
									} 
								else {
									errorHandler_(e);
									}
								});
							});
						break;

				case 'rmdir':
// Remove each directory passed as an argument.
					args.forEach(function(dirName, i) {
						cwd_.getDirectory(dirName, {}, function(dirEntry) {
							dirEntry.remove(function() {}, function(e) {
								if (e.code == FileError.INVALID_MODIFICATION_ERR) {
									output(cmd + ': ' + dirName + ': Directory not empty<br>');
									} 
								else {
									errorHandler_(e);
									}
								});
							}, function(e) { invalidOpForEntryType_(e, cmd, dirName); });
						});
					break;
				case 'theme':
					var theme = args.join(' ');
					if (!theme) {
						output(['usage: ', cmd, ' ' + THEMES_.join('|')].join(''));
						} 
					else {
						var matchedThemes = THEMES_.join('|').match(theme);
						if (matchedThemes && matchedThemes.length) {
							setTheme_(theme);
							} 
						else {
							output('Error - Unrecognized theme used');
							}
						}
					break;
				case 'version':
				case 'ver':
					output(VERSION_);
					break;
				case 'who':
					output(document.title +
					' - By: Eric Bidelman &lt;ericbidelman@chromium.org&gt;');
					break;
					break;
				default:
					if (cmd) {
						output(cmd + ': command not found');
						}
					};

				window.scrollTo(0, getDocHeight_());
				this.value = ''; // Clear/setup line for next input.
				}
			}


		function formatColumns_(entries) {
			var maxName = entries[0].name;
			util.toArray(entries).forEach(function(entry, i) {
				if (entry.name.length > maxName.length) {
					maxName = entry.name;
					}
				});

// If we have 3 or less entires, shorten the output container's height.
// 15 is the pixel height with a monospace font-size of 12px;
			var height = entries.length <= 3 ?
			'height: ' + (entries.length * 15) + 'px;' : '';

// 12px monospace font yields ~7px screen width.
			var colWidth = maxName.length * 7;

			return ['<div class="ls-files" style="-webkit-column-width:',
			colWidth, 'px;', height, '">'];
			}

		function invalidOpForEntryType_(e, cmd, dest) {
			if (e.code == FileError.NOT_FOUND_ERR) {
				output(cmd + ': ' + dest + ': No such file or directory<br>');
				} 
			else if (e.code == FileError.INVALID_STATE_ERR) {
				output(cmd + ': ' + dest + ': Not a directory<br>');
				} 
			else if (e.code == FileError.INVALID_MODIFICATION_ERR) {
				output(cmd + ': ' + dest + ': File already exists<br>');
				} 
			else {
				errorHandler_(e);
				}
			}


		function errorHandler_(e) {
			var msg = '';
			switch (e.code) {
				case FileError.QUOTA_EXCEEDED_ERR:
					msg = 'QUOTA_EXCEEDED_ERR';
					break;
				case FileError.NOT_FOUND_ERR:
					msg = 'NOT_FOUND_ERR';
					break;
				case FileError.SECURITY_ERR:
					msg = 'SECURITY_ERR';
					break;
				case FileError.INVALID_MODIFICATION_ERR:
					msg = 'INVALID_MODIFICATION_ERR';
					break;
				case FileError.INVALID_STATE_ERR:
					msg = 'INVALID_STATE_ERR';
					break;
				default:
					msg = 'Unknown Error';
					break;
					};
				output('<div>Error: ' + msg + '</div>');
				}


		function createDir_(rootDirEntry, folders, opt_errorCallback) {
			var errorCallback = opt_errorCallback || errorHandler_;

			rootDirEntry.getDirectory(folders[0], {create: true}, function(dirEntry) {
// Recursively add the new subfolder if we still have a subfolder to create.
				if (folders.length) {
					createDir_(dirEntry, folders.slice(1));
					}
				}, errorCallback);
			}

		function open_(cmd, path, successCallback) {
			if (!fs_) {return;}

			cwd_.getFile(path, {}, successCallback, function(e) {
				if (e.code == FileError.NOT_FOUND_ERR) {
					output(cmd + ': ' + path + ': No such file or directory<br>');
					}
				});
			}

		function read_(cmd, path, successCallback) {
			if (!fs_) {return;}

			cwd_.getFile(path, {}, function(fileEntry) {
				fileEntry.file(function(file) {
					var reader = new FileReader();

					reader.onloadend = function(e) {
						successCallback(this.result);
						};

					reader.readAsText(file);
					}, errorHandler_);
				}, function(e) {
					if (e.code == FileError.INVALID_STATE_ERR) {
						output(cmd + ': ' + path + ': is a directory<br>');
						} 
					else if (e.code == FileError.NOT_FOUND_ERR) {
						output(cmd + ': ' + path + ': No such file or directory<br>');
						}
					});
			}

		function ls_(successCallback) {
			if (!fs_) {return;}

// Read contents of current working directory. According to spec, need to
// keep calling readEntries() until length of result array is 0. We're
// guarenteed the same entry won't be returned again.
			var entries = [];
			var reader = cwd_.createReader();

			var readEntries = function() {
				reader.readEntries(function(results) {
					if (!results.length) {
						successCallback(entries.sort());
						} 
					else {
						entries = entries.concat(util.toArray(results));
						readEntries();
						}
					}, errorHandler_);
				};

			readEntries();
			}

		function setTheme_(theme) {
			var currentUrl = document.location.pathname;

			if (!theme || theme == 'default') {
// history.replaceState({}, '', currentUrl);
				localStorage.removeItem('theme');
				document.body.className = '';
				return;
				}

			if (theme) {
				document.body.classList.add(theme);
				localStorage.theme = theme;
//history.replaceState({}, '', currentUrl + '#theme=' + theme);
				}
			}

		function output(html) {
			output_.insertAdjacentHTML('beforeEnd', html);
			}

// Cross-browser impl to get document's height.
		function getDocHeight_() {
			var d = document;
			return Math.max(
				Math.max(d.body.scrollHeight, d.documentElement.scrollHeight),
				Math.max(d.body.offsetHeight, d.documentElement.offsetHeight),
				Math.max(d.body.clientHeight, d.documentElement.clientHeight)
				);
			}

		return {
			initFS: function(persistent, size) {
			output('<div>ko ' + document.title +
			'! (v' + VERSION_ + ')</div>');
			output((new Date()).toLocaleString());
			output('<p>...</p>');

			if (!!!window.requestFileSystem) {
				output('<div>unauthorized access has been logged! </div>');
				return;
				}

			var type = persistent ? window.PERSISTENT : window.TEMPORARY;
			window.requestFileSystem(type, size, function(filesystem) {
				fs_ = filesystem;
				cwd_ = fs_.root;

// Attempt to create a folder to test if we can.
				cwd_.getDirectory('testquotaforfsfolder', {create: true}, function(dirEntry) {
					dirEntry.remove(function() { // If successfully created, just delete it.
// noop.
						});
					}, function(e) {
						if (e.code == FileError.QUOTA_EXCEEDED_ERR) {
							output('fail: fs unavailable. ' + ' ' + ' ');
							} 
						else {
							errorHandler_(e);
							}
						});

					}, errorHandler_);
				},
			output: output,
			setTheme: setTheme_,
			addDroppedFiles: function(files) {
				util.toArray(files).forEach(function(file, i) {
					cwd_.getFile(file.name, {create: true, exclusive: true}, function(fileEntry) {
						fileEntry.createWriter(function(fileWriter) {
							fileWriter.onerror = function(e) {
								errorHandler_(e.currentTarget.error);
								};
							fileWriter.write(file);
							}, errorHandler_);
						}, errorHandler_);
					});
				}
			}
		};

		</script>


	<script>
		function degToRad(degree) {
			var factor = Math.PI/180;
			return degree*factor;
			}

		function renderTime() {
  
		  var now = new Date();
		  var today = now.toDateString();
		  var time = now.toLocaleTimeString();
		  var hours = now.getHours();
		  var minutes = now.getMinutes();
		  var seconds = now.getSeconds();
		  var milliseconds = now.getMilliseconds();
		  var newSeconds = seconds+ (milliseconds/1000);
		</script>


	<div class="div_offerings" hidden>
		<div class="title"><h3><font size=2>Want to Donate?</font></h3></div>
		<div class="content"><font size=1>To test and donate.
				We suggest $1000.00 but any amount would be most welcome.</font>
		<form action="http://www.paypal.com/cgi-bin/webscr" method="post">
		<table >
				<tr align="center">
				<td>Amount $ <input name="amount" size="3" value="20.00">
				</td>
				</tr>
				<tr align="center">
		<td>
				<input type="hidden" name="cmd" value="_xclick">
				<input type="hidden" name="business" value="ekonet@konet.org">
				<input type="hidden" name="item_name" value="donate money down the toilet to konet llc">
				<input type="hidden" name="notify_url" value="http://konet.org/index.php?ipn">
				<input type="hidden" name="no_shipping" value="1">
				<input type="hidden" name="return" value="http://konet.org//index.php?donation_thanks">
				<input type="hidden" name="currency_code" value="USD">
				<input type="hidden" name="no_note" value="1">
				<input type="hidden" name="lc" value="US">
				<input type="hidden" name="tax" value="0">
				<input type="hidden" name="bn" value="PP-DonationsBF">
				<input type="hidden" name="custom" value="0">
				<input type="image" src="http://konet.org/imgs/x-click-butcc-donate.gif" border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
				</td></tr></table>
				</form>
			</div>
		</div>














	<script id=script_lists>
lists=[];
lists['items']=`
item|id|grp|path|desc|dt|link
item0|id|grp|path|desc|dt|link
item1|id|grp|path|desc|dt|link
item2|id|grp|path|desc|dt|link
item3|id|grp|path|desc|dt|link
item4|id|grp|path|desc|dt|link
`.split('\n');

lists['contacts']=`
item|id|grp|path|desc|dt|link
item0|id|grp|path|desc|dt|link
item1|id|grp|path|desc|dt|link
item2|id|grp|path|desc|dt|link
item3|id|grp|path|desc|dt|link
item4|id|grp|path|desc|dt|link
`.split('\n');

lists['letter']=`
subject: letter
Dear M.:
line1
line2
line3
thank you
jkwii
123-456-7890
jkwii@ko1.us
`.split("\n");

lists['wz']=`
CURSOR_MOVE
RESIZABLE
NO_ALT
SCROLL
TRANSPARENT
VERTICAL
HORIZONTAL
CURSOR_DEFAULT
'.split("\n");



lists['wz_static']=`
CURSOR_MOVE,
 RESIZABLE,
 NO_ALT,
 SCROLL,
 "img_item_1"+TRANSPARENT,
 "img_item_2"+TRANSPARENT,
 "button"+VERTICAL+HORIZONTAL+CURSOR_DEFAULT,
 "cat"+TRANSPARENT,
 "img_item_3",
 "counter",
 "img_item_3"+TRANSPARENT,
 "img_item_4",
 "img_item_5",
 "img_item_6",
 "img_item_7"+TRANSPARENT+COPY+4,
 "img_item_8"+TRANSPARENT,
 "redarrow",
 "reldiv",
 "reldivn4",
 "reldiv2"+TRANSPARENT,
 "reldiv2n4"+TRANSPARENT,
 "reltab",
 "sepline1"+NO_DRAG,
 "skitour"+TRANSPARENT,
 "slidercanvas",
 "smile1"+SCALABLE,
 "thumb"+HORIZONTAL+MAXOFFLEFT+45+MAXOFFRIGHT+45,
 "track"+NO_DRAG,
 "tryit",
`.split("\n");
		</script id=script_lists_end>

	<script id=script_dhtml>
		function dhtml(args) {
			divid="div_dhtml";
			htmout="";

//			wz_len=lists['wz'].length;
//			wz_static_len=lists['wz_static'].length;
//			htmout += "BUGS_101 DHTML divid="+divid+" len="+wz_len+" lists_wz="+lists['wz']+"\n";
//			htmout += "BUGS_102 DHTML divid="+divid+" len="+wz_static_len+" lists_wz_static="+lists['wz_static']+"\n";
			set_dhtmls="";
			list=lists['items'];
			for (j=0; j<list.length; j++) {
				item += lists['items'][j];
				src=item;
				divid="div_item_"+j;
				imgid="img_item_"+j;
				set_dhtmls += "'"+divid+"',";
				set_dhtmls += "'"+imgid+"',";
				htmout += "<div id="+divid+" ";
				htmout += " style=\"";
				htmout += "position: absolute;";
				htmout += "left: 1123px;";
				htmout += "top: 3361px;";
				htmout += "width: 97px;";
				htmout += "height: 41px;";
				htmout += "z-index: 0;";
				htmout += "cursor: move;";
				htmout += "\">";
				htmout += "	<img id="+imgid+" name="+imgid+" src="+src+" width=97 height=41>";
				htmout += "	</div>\n";

// <div id="koIi15v" style="position: absolute; left: 1123px; top: 3361px; width: 97px; height: 41px; z-index: 0; cursor: move;">
	<img name="koIi15vNI1m6G" src="/imgs/btn/ko.png" width="97" height="41"></div>

				}

			if( document.getElementById('div_wz')) {
				document.getElementById('div_wz').innerHTML=htmout;
				}

			set_dhtmls += "'"+divid+"'";
			set_dhtmls += "'"+imgid+"'";
//			SET_DHTML( set_dhtmls );
			alert(htmout);
			
			return(htmout);
			}
		</script id=script_dhtml_end>
<!--
// BUGS_140				SET_DHTML(CURSOR_MOVE,
 RESIZABLE, NO_ALT, SCROLL, "img_item_1"+TRANSPARENT, "img_item_2"+TRANSPARENT, "button"+VERTICAL+HORIZONTAL+CURSOR_DEFAULT, "cat"+TRANSPARENT, "img_item_3", "counter", "img_item_3"+TRANSPARENT, "img_item_4", "img_item_5", "img_item_6", "img_item_7"+TRANSPARENT+COPY+4, "img_item_8"+TRANSPARENT, "redarrow", "reldiv", "reldivn4", "reldiv2"+TRANSPARENT, "reldiv2n4"+TRANSPARENT, "reltab", "sepline1"+NO_DRAG, "skitour"+TRANSPARENT, "slidercanvas", "smile1"+SCALABLE, "thumb"+HORIZONTAL+MAXOFFLEFT+45+MAXOFFRIGHT+45, "track"+NO_DRAG, "tryit", "upleft");
	-->


	<script id=script_head1>
		function head1(args) {
			alert( "BUGS_110 head1 args="+args );
			}
		function head0(args) {
			txtfil="main.txt";
			divid_main="div_main";
			divid_kojax="div_kojax";
			alert("BUGS_110 head args="+args+" txtfil=+txtfil+" divid_main="+divid_main+" divid_kojax="+div_kojax );
		

			htmout=""; j=0; k=0;
//			if(! document.getElementById(divid_main)) {
//				alert( "BUGS_111 head NOTFOUND divid_main="+divid_main );
//				return("");
//				}
//			if(! document.getElementById(divid_main)) {
//				alert( "BUGS_112 head NOTFOUND divid_kojax="+divid_kojax );
//				return("");
//				}
//			if(! filecheck(txtfil)) {
//				alert( "BUGS_113 head NOTFOUND txtfil="+txtfil );
//				return("");
//				}
//
//			htmout="<div id=div_lists>\n";
//			htmout="	<h1>div_lists</h1>>\n";
//			alert( "BUGS_115 BEFORE kojax_text txtfil="+txtfil );
//			kojax_text=jax(txtfil);
//			div_kojax_html=document.getElementById(div_koajax).innerHTML;
//			div_main_html=document.getElementById(div_main).innerHTML;

//			htmout+="<br>\n";
//			htmout+="<div_main>\n";
//			htmout+="<h2>div_main<\h2>\n";
//			htmout+="<h3>20230211_1433<\h3>\n";
//			htmout+="<h2>txtfil="+txtfil+" divid_kojax="+div_kojax+" divid_main="+divid_man+"<h2>\n";
//			htmout+="<hr color=black>\n";
//			htmout+="<hr color=white>\n";
//			htmout+="<h2>kojax_text</h2>\n"
//			htmout+=kojax_text;
//			htmout+="<hr color=white>\n";
//			htmout+="<h2>div_kojax_html</h2>\n"
//			htmout+=div_kojax_html;
//			htmout+="<hr color=white>\n";
//			htmout+="<h2>div_main_html</h2>\n"
//			htmout+=div_main_html;
//			htmout+="<hr color=white>\n";
//			htmout+="<hr color=black>\n";
//			htmout+="	</div id=div_main_end>\n";

			htmout+="<h1>HEAD div_main HEAD</h1>\n";
			if( document.getElementById(div_main)) {
				document.getElementById(div_main).innerHTML=htmout;
				}
//
//			
//			htmout += "<h1>BUGS_11 HEAD args="+args;
//			htmout += "lists_items="+lists['items'];
//			htmout += "lists_letter="+lists['letter'];
//			htmout += "lists_contacts="+lists['contacts'];
//			htmout += "lists_wz="+lists['wz'];
			alert(htmout);
			return(htmout);
			}
		</script id=script_head_end>




	<script id="wz_library" src='data:/text/plain;base64,DQoNCi8vSW50ZWdyYXRlZCB0byBXYWx0ZXIgWm9ybiBodG1sIGxpYnJhcnkNCg0KLy8gZnVuY3Rpb24gZXhlY3V0ZVRlc3Q6IGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9uIGxheWVyT2JqZWN0Lmh0bQ0KZnVuY3Rpb24gZXhlY3V0ZVRlc3QoKXsNCg0KdHJhbnNmb3JtTGF5ZXIgKGRvY3VtZW50LmZvcm1zWzBdLngudmFsdWUsZG9jdW1lbnQuZm9ybXNbMF0ueS52YWx1ZSxkb2N1bWVudC5mb3Jtc1swXS53LnZhbHVlLGRvY3VtZW50LmZvcm1zWzBdLmgudmFsdWUsIkJsb3F1ZSIsMTAwLDEwKTsNCg0KDQp9DQoNCi8vIFVzZXMgV1ogZGh0bWwgbGlicmFyeSB0byBtYWtlIHRpbWVkIHRyYW5zZm9ybWF0aW9ucyBvZiBkaHRtbCwNCi8vIHNvIG1pbmltaXppbmcsIG1heGltaXppbmcgbGF5ZXJzIGNhbiBiZSByYXRoZXIgInNtb290IiBmb3IgdXNlciwNCi8vIHNpbXVsYXRpbmcgd2luZG93cyBvcy4NCg0KLy9GdW5jdGlvbiB0cmFuc2Zvcm1MYXllcg0KLy94LHkgPSBQb3NpdGlvbi4gVG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGVzDQovL3csaCA9IFNpemUuIHdpZHRoIGFuZCBoZWlnaHQgb2YgPGRpdj48L2Rpdj4gbGF5ZXINCi8vaWQgPSBpZCBvZiB0aGUgRGl2IChpLmUuOiBpZD0ibXlMYXllciIsIHRoZW4sIHVzZSAibXlMYXllciIsIFdJVEggcXVvdGVzISkNCi8vZHVyYXRpb24gPSBEdXJhdGlvbiwgaW4gbWlsaXNlY29uZHMNCi8vc3RlcHMgPSBUcmFuc2l0aW9uIGludGVydmFscw0KDQpmdW5jdGlvbiB0cmFuc2Zvcm1MYXllciAoeCx5LHcsaCxpZCxkdXJhdGlvbixzdGVwcykgew0KICANCiAgLy9kdXJhdGlvbiBpcyBpbiBzZWNvbmRzDQogIHN0ZXBEdXJhdGlvbiA9IE1hdGgucm91bmQoZHVyYXRpb24vc3RlcHMpIDsgLy8gVmFsdWUgaXMgaW4gbWlsaXNlY29uZHMuDQoNCiAgb2JqID0gZGQuZWxlbWVudHNbaWRdOw0KICANCg0KICAvLyBHZXQgb3JpZ2luYWwgdmFsdWVzOiB4LHkgPSB0b3AgbGVmdCBjb3JuZXI7ICB3LGggPSB3aWR0aCBoZWlnaHQgICANCiAgDQogIHgxID0gb2JqLng7ICANCiAgeTEgPSBvYmoueTsgIA0KICB3MSA9IG9iai53OyAgDQogIGgxID0gb2JqLmg7ICANCg0KDQogIC8vIElmIHZhbHVlcyBub3Qgc2V0LCBvciB6ZXJvLCB3ZSBkbyBub3QgbW9kaWZ5IHRoZW0sIGFuZCB0YWtlIG9yaWdpbmFsIGFzIGZpbmFsIGFzIHdlbGwNCiAgeCA9ICh4KT94OngxOw0KICB5ID0gKHkpP3k6eTE7DQogIHcgPSAodyk/dzp3MTsNCiAgaCA9IChoKT9oOmgxOw0KDQogIC8vIGhvdyBtdWNoIGRvIHdlIG5lZWQgdG8gbW9kaWZ5IG91ciB2YWx1ZXMgZm9yIGVhY2ggc3RlcD8NCiAgLy8gVGhlIFdaIGxpYnJhcnkgbW92ZUJ5IGFuZCByZXNpemVCeSB0YWtlcyB0aGUgZGlmZiB3aXRoIGludmVydGVkIHNpZ24gYXMgZnJvbSBvcmlnaW5hbCBjZSBzY3JpcHQ6DQogIGRpZlggPSAoeCAtIHgxKS9zdGVwczsgIA0KICBkaWZZID0gKHkgLSB5MSkvc3RlcHM7ICANCiAgZGlmVyA9ICh3IC0gdzEpL3N0ZXBzOyAgDQogIGRpZkggPSAoaCAtIGgxKS9zdGVwczsgIA0KICANCiAgDQogIA0KICBpZih0b3AuZGVidWc9PXRydWUpICB3aW5kb3cuYWxlcnQoJ3gxOicreDErJywgeTE6Jyt5MSsnLCB3MTonK3cxKycsIGgxOicraDErJyw8YnI+eDonK3grJywgeTonK3krJywgdzonK3crJywgaDonK2grJywgPGJyPmRpZlg6JytkaWZYKycsIGRpZlk6JytkaWZZKycsIGRpZlc6JytkaWZXKycsIGRpZkg6JytkaWZIKycsPGJyPmR1cmF0aW9uOicrZHVyYXRpb24rJywgPGJyPnN0ZXBzOicrc3RlcHMrJyw8YnI+c3RlcER1cmF0aW9uOicrc3RlcER1cmF0aW9uKycnKTsNCiANCiAgb2JqLm1vdmVCeShkaWZYLGRpZlkpOw0KICBvYmoucmVzaXplQnkoZGlmVyxkaWZIKTsNCg0KICAvL1dlIHRha2Ugb3V0IHRoZSBhbW91bnQgb2YgdGltZSB1c2VkLCBhbmQgYSBzdGVwIGFscmVhZHkgYmVpbmcgZXhlY3V0ZWQNCiAgZHVyYXRpb24gPSAoZHVyYXRpb24gLSBzdGVwRHVyYXRpb24pOw0KICBzdGVwcyAtLTsNCg0KCS8vSWYgdGhlcmUgaXMgYW55IHN0ZXAgbGVmdCwgd2UgZXhlY3V0ZSBhZ2Fpbg0KCWlmKHN0ZXBzPj0wKXsNCgkgc2V0VGltZW91dCgndHJhbnNmb3JtTGF5ZXIoJyt4KycsJyt5KycsJyt3KycsJytoKycsIicraWQrJyIsJytkdXJhdGlvbisnLCcrc3RlcHMrJyknLHN0ZXBEdXJhdGlvbik7DQoJIH0NCiAgLy9JZiBSZXR1cm4uLi4gd2UgY291bGQgc2V0IHNvbWUgYXBpIGhlcmUgYXMgdG8gY2FsbCBhIGZ1bmN0aW9uIHRvIGJlIGV2YWx1YXRlZCBieSB0aGUgamF2YXNjcmlwdCxpZiBzZXQsIG9uIHJldHVybg0KICAvL2ZvciBleGFtcGxlIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIHRoYXQgaGFzIHRvIHBvcHVsYXRlIHRoZSBkaXYgd2l0aCBjb250ZW50DQogIC8vYnV0IFdaIGhhcyBhbHJlYWR5IHRob3VnaHQgb24gaXQgOi0pDQogIHJldHVybjsNCg0KfQ0KDQo='></script>


	<script id="wz_dragdrop" src='data:/text/plain;base64,LyogVGhpcyBub3RpY2UgbXVzdCBiZSB1bnRvdWNoZWQgYXQgYWxsIHRpbWVzLCBhbmQgbXVzdCBub3QgYmUgcmVtb3ZlZC4KCnd6X2RyYWdkcm9wLmpzCXYuIDQuOTEKVGhlIGxhdGVzdCB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBhdApodHRwOi8vd3d3LndhbHRlcnpvcm4uY29tCm9yIGh0dHA6Ly93d3cuZGV2aXJhLmNvbQpvciBodHRwOi8vd3d3LndhbHRlcnpvcm4uZGUKCkNvcHlyaWdodCAoYykgV2FsdGVyIFpvcm4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkNyZWF0ZWQgMjYuIDguIDIwMDIgYnkgV2FsdGVyIFpvcm4gKFdlYjogaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmNvbSApCkxhc3QgbW9kaWZpZWQ6IDEwLjEwLjIwMDgKClRoaXMgREhUTUwgJiBEcmFnJkRyb3AgTGlicmFyeSBhZGRzIERyYWcmRHJvcCBmdW5jdGlvbmFsaXR5IHRvOgotIGltYWdlcywgZXZlbiB0aG9zZSBub3QgcG9zaXRpb25lZCB2aWEgbGF5ZXJzLAogIG5vciB2aWEgc3R5bGVzaGVldHMgb3IgYW55IG90aGVyIGtpbmQgb2YgImhhcmQtY29kaW5nIjsKLSByZWxhdGl2ZWx5IGFuZCBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgbGF5ZXJzIChESVYgZWxlbWVudHMpLgpNb3Jlb3ZlciwgaXQgcHJvdmlkZXMgZXh0ZW5kZWQgREhUTUwgY2FwYWJpbGl0aWVzLgoKTElDRU5TRTogTEdQTAoKVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgKExHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgoKRm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApzZWUgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2xlc3Nlci5odG1sCiovCgoKLy8gUEFUSCBUTyBUSEUgVFJBTlNQQVJFTlQgMSoxIFBYIElNQUdFIChyZXF1aXJlZCBieSBOUyA0IGFzIHNwYWNlcikKdmFyIHNwYWNlciA9ICd0cmFuc3BhcmVudHBpeGVsLmdpZic7CgoKCgovL3dpbmRvdy5vbmVycm9yID0gbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdHJ1ZTsnKTsKCgovLyBPcHRpb25hbCBjb21tYW5kcyBwYXNzZWQgdG8gU0VUX0RIVE1MKCkgb24gdGhlIGh0bWwtcGFnZSAoZzogbWF5IGJlIGFwcGxpZWQgZ2xvYmFsbHksIGk6IGluZGl2aWR1YWxseSkKdmFyIENMT05FCQkJPSAnQzEwbkUnOyAgIC8vIGkgIGltZwkgIGNsb25lIGltYWdlCnZhciBDT1BZCQkJPSAnQzBwWSc7CS8vIGkgIGltZwkgIGNyZWF0ZSBjb3BpZXMKdmFyIERFVEFDSF9DSElMRFJFTiA9ICdkMzdhQ0gnOyAgLy8gaSAgbHlyCSAgZGV0YWNoIGltYWdlcwp2YXIgSE9SSVpPTlRBTAkJPSAnSDByMVonOyAgIC8vIGkgIGltZyxseXIgIGhvcml6b250YWxseSBkcmFnZ2FibGUgb25seQp2YXIgTUFYSEVJR0hUCQk9ICdtN3g4SSc7ICAgLy8gaSAgaW1nLGx5ciAgbWF4aW11bSBoZWlnaHQgbGltaXQsICIKdmFyIE1BWE9GRkJPVFRPTQk9ICdtN3hkMHdOJzsgLy8gaSAgaW1nLGx5ciAgZG93bndhcmQgb2Zmc2V0IGxpbWl0CnZhciBNQVhPRkZMRUZUCQk9ICdtN3gyM0Z0JzsgLy8gaSAgaW1nLGx5ciAgbGVmdHdhcmQgb2Zmc2V0IGxpbWl0CnZhciBNQVhPRkZSSUdIVAkJPSAnbTd4MEZmOCc7IC8vIGkgIGltZyxseXIgIHJpZ2h0d2FyZCBvZmZzZXQgbGltaXQKdmFyIE1BWE9GRlRPUAkJPSAnbTd4dTknOyAgIC8vIGkgIGltZyxseXIgIHVwd2FyZCBvZmZzZXQgbGltaXQKdmFyIE1BWFdJRFRICQk9ICdtN3hXMSc7ICAgLy8gaSAgaW1nLGx5ciAgbWF4aW11bSB3aWR0aCBsaW1pdCwgdXNlIHdpdGggcmVzaXphYmxlIG9yIHNjYWxhYmxlCnZhciBNSU5XSURUSAkJPSAnbTFudzEnOyAgIC8vIGkgIGltZyxseXIgIG1pbmltdW0gd2lkdGggbGltaXQsICIKdmFyIE1JTkhFSUdIVAkJPSAnbTFuOEknOyAgIC8vIGkgIGltZyxseXIgIG1pbmltdW0gaGVpZ2h0IGxpbWl0LCAiCnZhciBOT19BTFQJCQk9ICdubzgxVCc7ICAgLy8gZ2kgaW1nCSAgZGlzYWJsZSBhbHQgYW5kIHRpdGxlIGF0dHJpYnV0ZXMKdmFyIE5PX0RSQUcJCQk9ICdOMGQ0QWcnOyAgLy8gaSAgaW1nLGx5ciAgZGlzYWJsZSBkcmFnZ2FiaWxpdHkKdmFyIFJFU0VUX1oJCQk9ICdyMzVFN3onOyAgLy8gZ2kgaW1nLGx5ciAgcmVzZXQgei1pbmRleCB3aGVuIGRyb3BwZWQKdmFyIFJFU0laQUJMRQkJPSAncjVJWmJsJzsgIC8vIGdpIGltZyxseXIgIHJlc2l6YWJsZSBpZiA8Y3RybD4gb3IgPHNoaWZ0PiBwcmVzc2VkCnZhciBTQ0FMQUJMRQkJPSAnU0NMYmwnOyAgIC8vIGdpIGltZyxseXIgIHNjYWxhYmxlCQkgICAiCnZhciBTQ1JPTEwJCQk9ICdzQzhsTCc7ICAgLy8gZ2kgaW1nLGx5ciAgZW5hYmxlIGF1dG8gc2Nyb2xsIGZ1bmN0aW9uYWxpdHkKdmFyIFRSQU5TUEFSRU5UCQk9ICdkSUFwSEFuJzsgLy8gZ2kgaW1nLGx5ciAgdHJhbnNsdWNlbnQgd2hpbGUgZHJhZ2dlZAp2YXIgVkVSVElDQUwJCT0gJ1YzUnQxQyc7ICAvLyBpICBpbWcsbHlyICB2ZXJ0aWNhbGx5IGRyYWdnYWJsZSBvbmx5CnZhciBkZF9jdXJzb3JzID0gbmV3IEFycmF5KAoJJ2M6ZGVmYXVsdCcsCgknYzpjcm9zc2hhaXInLAoJJ2M6ZS1yZXNpemUnLAoJJ2M6aGFuZCcsCgknYzpoZWxwJywKCSdjOm1vdmUnLAoJJ2M6bi1yZXNpemUnLAoJJ2M6bmUtcmVzaXplJywKCSdjOm53LXJlc2l6ZScsCgknYzpzLXJlc2l6ZScsCgknYzpzZS1yZXNpemUnLAoJJ2M6c3ctcmVzaXplJywKCSdjOnRleHQnLAoJJ2M6dy1yZXNpemUnLAoJJ2M6d2FpdCcKKTsKZm9yKHZhciBkZF9pID0gZGRfY3Vyc29ycy5sZW5ndGg7IGRkX2k7KQp7LS1kZF9pOwoJZXZhbCgndmFyIENVUlNPUl8nICsgKGRkX2N1cnNvcnNbZGRfaV0uc3Vic3RyaW5nKDIpLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgnLScsICdfJykpICsgJyA9ICInICsgZGRfY3Vyc29yc1tkZF9pXSArICciOycpOwp9CnZhciBkZF91ID0gInVuZGVmaW5lZCI7CmZ1bmN0aW9uIFdaREQoKQp7Cgl0aGlzLmVsZW1lbnRzID0gbmV3IEFycmF5KDApOwoJdGhpcy5vYmogPSBudWxsOwoJdGhpcy5uID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOwoJdGhpcy5kYiA9IChkb2N1bWVudC5jb21wYXRNb2RlICYmIGRvY3VtZW50LmNvbXBhdE1vZGUudG9Mb3dlckNhc2UoKSAhPSAiYmFja2NvbXBhdCIpPwoJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudAoJCTogKGRvY3VtZW50LmJvZHkgfHwgbnVsbCk7Cgl0aGlzLm9wID0gISEod2luZG93Lm9wZXJhICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKTsKCWlmKHRoaXMub3ApIGRvY3VtZW50Lm9ubW91c2Vkb3duID0gbmV3IEZ1bmN0aW9uKCdlJywKCQknaWYoKChlID0gZSB8fCB3aW5kb3cuZXZlbnQpLnRhcmdldCB8fCBlLnNyY0VsZW1lbnQpLnRhZ05hbWUgPT0gIklNQUdFIikgcmV0dXJuIGZhbHNlOycpOwoJdGhpcy5pZSA9ICEhKHRoaXMubi5pbmRleE9mKCJtc2llIikgPj0gMCAmJiBkb2N1bWVudC5hbGwgJiYgdGhpcy5kYiAmJiAhdGhpcy5vcCk7Cgl0aGlzLmllbWFjID0gISEodGhpcy5pZSAmJiB0aGlzLm4uaW5kZXhPZigibWFjIikgPj0gMCk7Cgl0aGlzLmllNCA9ICEhKHRoaXMuaWUgJiYgIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKTsKCXRoaXMubjQgPSAhIShkb2N1bWVudC5sYXllcnMgJiYgdHlwZW9mIGRvY3VtZW50LmNsYXNzZXMgIT0gZGRfdSk7Cgl0aGlzLm42ID0gISEodHlwZW9mIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlICE9IGRkX3UgJiYgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZVJhbmdlICE9IGRkX3UpOwoJdGhpcy53M2MgPSAhISghdGhpcy5vcCAmJiAhdGhpcy5pZSAmJiAhdGhpcy5uNiAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCk7Cgl0aGlzLmNlID0gISEoZG9jdW1lbnQuY2FwdHVyZUV2ZW50cyAmJiBkb2N1bWVudC5yZWxlYXNlRXZlbnRzICYmICF0aGlzLm42KTsKCXRoaXMucHggPSB0aGlzLm40PyAnJyA6ICdweCc7Cgl0aGlzLnRXYWl0ID0gdGhpcy53M2M/IDQwIDogMTA7Cgl0aGlzLm5vUmVjYWxjID0gZmFsc2U7Cn0KdmFyIGRkID0gbmV3IFdaREQoKTsKCmRkLkludCA9IGZ1bmN0aW9uKGRfeCwgZF95KQp7CglyZXR1cm4gaXNOYU4oZF95ID0gcGFyc2VJbnQoZF94KSk/IDAgOiBkX3k7Cn07CmRkLmdldFduZFcgPSBmdW5jdGlvbigpCnsKCXJldHVybiBkZC5JbnQoCgkJKGRkLmRiICYmICFkZC5vcCAmJiAhZGQudzNjICYmIGRkLmRiLmNsaWVudFdpZHRoKT8gZGQuZGIuY2xpZW50V2lkdGgKCQk6ICh3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKQoJKTsKfTsKZGQuZ2V0V25kSCA9IGZ1bmN0aW9uKCkKewoJcmV0dXJuIGRkLkludCgKCQkoZGQuZGIgJiYgIWRkLm9wICYmICFkZC53M2MgJiYgZGQuZGIuY2xpZW50SGVpZ2h0KT8gZGQuZGIuY2xpZW50SGVpZ2h0CgkJOiAod2luZG93LmlubmVySGVpZ2h0IHx8IDApCgkpOwp9OwpkZC5nZXRTY3JvbGxYID0gZnVuY3Rpb24oKQp7CglyZXR1cm4gZGQuSW50KHdpbmRvdy5wYWdlWE9mZnNldCB8fCAoZGQuZGI/IGRkLmRiLnNjcm9sbExlZnQgOiAwKSk7Cn07CmRkLmdldFNjcm9sbFkgPSBmdW5jdGlvbigpCnsKCXJldHVybiBkZC5JbnQod2luZG93LnBhZ2VZT2Zmc2V0IHx8IChkZC5kYj8gZGQuZGIuc2Nyb2xsVG9wIDogMCkpOwp9OwpkZC5nZXRQYWdlWFkgPSBmdW5jdGlvbihkX28pCnsKCWlmKGRkLm40ICYmIGRfbykKCXsKCQlkZC54ID0gZF9vLnBhZ2VYIHx8IDA7CgkJZGQueSA9IGRfby5wYWdlWSB8fCAwOwoJfQoJZWxzZQoJewoJCWRkLnggPSBkZC55ID0gMDsgLy9nbG9iYWwgaGVscGVyIHZhcnMKCQl3aGlsZShkX28pCgkJewoJCQlkZC54ICs9IGRkLkludChkX28ub2Zmc2V0TGVmdCk7CgkJCWRkLnkgKz0gZGQuSW50KGRfby5vZmZzZXRUb3ApOwoJCQlkX28gPSBkX28ub2Zmc2V0UGFyZW50IHx8IG51bGw7CgkJfQoJfQp9OwpkZC5nZXRDc3NYWSA9IGZ1bmN0aW9uKGRfbykKewoJaWYoZF9vLmRpdikKCXsKCQlpZihkZC5uNCkKCQl7CgkJCWRfby5jc3N4ID0gZF9vLmRpdi54OwoJCQlkX28uY3NzeSA9IGRfby5kaXYueTsKCQl9CgkJZWxzZSBpZihkZC5pZTQpCgkJewoJCQlkX28uY3NzeCA9IGRfby5jc3MucGl4ZWxMZWZ0OwoJCQlkX28uY3NzeSA9IGRfby5jc3MucGl4ZWxUb3A7CgkJfQoJCWVsc2UKCQl7CgkJCWRfby5jc3MubGVmdCA9IGRfby5jc3MudG9wID0gMCArIGRkLnB4OwoJCQlkZC5nZXRQYWdlWFkoZF9vLmRpdik7CgkJCWRfby5jc3N4ID0gZF9vLnggLSBkZC54OwoJCQlkX28uY3NzeSA9IGRfby55IC0gZGQueTsKCQkJZF9vLmNzcy5sZWZ0ID0gZF9vLmNzc3ggKyBkZC5weDsKCQkJZF9vLmNzcy50b3AgPSBkX28uY3NzeSArIGRkLnB4OwoJCX0KCX0KCWVsc2UKCXsKCQlkX28uY3NzeCA9IDA7CgkJZF9vLmNzc3kgPSAwOwoJfQp9OwpkZC5nZXRJbWdXID0gZnVuY3Rpb24oZF9vKQp7CglyZXR1cm4gZF9vPyBkZC5JbnQoZF9vLndpZHRoKSA6IDA7Cn07CmRkLmdldEltZ0ggPSBmdW5jdGlvbihkX28pCnsKCXJldHVybiBkX28/IGRkLkludChkX28uaGVpZ2h0KSA6IDA7Cn07CmRkLmdldERpdlcgPSBmdW5jdGlvbihkX28pCnsKCXJldHVybiBkZC5JbnQoCgkJZGQubjQ/IChkX28uZGl2PyBkX28uZGl2LmNsaXAud2lkdGggOiAwKQoJCTogZF9vLmRpdj8gKGRfby5kaXYub2Zmc2V0V2lkdGggfHwgZF9vLmNzcy5waXhlbFdpZHRoIHx8IGRfby5jc3Mud2lkdGggfHwgMCkKCQk6IDAKCSk7Cn07CmRkLmdldERpdkggPSBmdW5jdGlvbihkX28pCnsKCXJldHVybiBkZC5JbnQoCgkJZGQubjQ/IChkX28uZGl2PyBkX28uZGl2LmNsaXAuaGVpZ2h0IDogMCkKCQk6IGRfby5kaXY/IChkX28uZGl2Lm9mZnNldEhlaWdodCB8fCBkX28uY3NzLnBpeGVsSGVpZ2h0IHx8IGRfby5jc3MuaGVpZ2h0IHx8IDApCgkJOiAwCgkpOwp9OwpkZC5nZXRXSCA9IGZ1bmN0aW9uKGRfbykKewoJZF9vLncgPSBkZC5nZXREaXZXKGRfbyk7CglkX28uaCA9IGRkLmdldERpdkgoZF9vKTsKCWlmKGRfby5jc3MpCgl7CgkJZF9vLmNzcy53aWR0aCA9IGRfby53ICsgZGQucHg7CgkJZF9vLmNzcy5oZWlnaHQgPSBkX28uaCArIGRkLnB4OwoJCWRfby5kdyA9IGRkLmdldERpdlcoZF9vKS1kX28udzsKCQlkX28uZGggPSBkZC5nZXREaXZIKGRfbyktZF9vLmg7CgkJZF9vLmNzcy53aWR0aCA9IChkX28udy1kX28uZHcpICsgZGQucHg7CgkJZF9vLmNzcy5oZWlnaHQgPSAoZF9vLmgtZF9vLmRoKSArIGRkLnB4OwoJfQoJZWxzZSBkX28uZHcgPSBkX28uZGggPSAwOwp9OwpkZC5nZXRDc3NQcm9wID0gZnVuY3Rpb24oZF9vLCBkX3BuNiwgZF9wc3R5bGUsIGRfcG40KQp7CglpZihkX28gJiYgZGQubjYpIHJldHVybiAnJyt3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkX28sIG51bGwpLmdldFByb3BlcnR5VmFsdWUoZF9wbjYpOwoJaWYoZF9vICYmIGRfby5jdXJyZW50U3R5bGUpIHJldHVybiAnJytldmFsKCdkX28uY3VycmVudFN0eWxlLicrZF9wc3R5bGUpOwoJaWYoZF9vICYmIGRfby5zdHlsZSkgcmV0dXJuICcnK2V2YWwoJ2Rfby5zdHlsZS4nK2RfcHN0eWxlKTsKCWlmKGRfbyAmJiBkZC5uNCkgcmV0dXJuICcnK2V2YWwoJ2Rfby4nK2RfcG40KTsKCXJldHVybiAnJzsKfTsKZGQuZ2V0RGl2ID0gZnVuY3Rpb24oZF94LCBkX2QpCnsKCWRfZCA9IGRfZCB8fCBkb2N1bWVudDsKCWlmKGRkLm40KQoJewoJCWlmKGRfZC5sYXllcnNbZF94XSkgcmV0dXJuIGRfZC5sYXllcnNbZF94XTsKCQlmb3IodmFyIGRfaSA9IGRfZC5sYXllcnMubGVuZ3RoOyBkX2k7KQoJCXsKCQkJdmFyIGRfeSA9IGRkLmdldERpdihkX3gsIGRfZC5sYXllcnNbLS1kX2ldLmRvY3VtZW50KTsKCQkJaWYoZF95KSByZXR1cm4gZF95OwoJCX0KCX0KCWlmKGRkLmllKSByZXR1cm4gZF9kLmFsbFtkX3hdIHx8IG51bGw7CglpZihkX2QuZ2V0RWxlbWVudEJ5SWQpIHJldHVybiBkX2QuZ2V0RWxlbWVudEJ5SWQoZF94KSB8fCBudWxsOwoJcmV0dXJuIG51bGw7Cn07CmRkLmdldEltZyA9IGZ1bmN0aW9uKGRfbywgZF9ubSwgZF94eSwgZF93KQp7CglkX3cgPSBkX3cgfHwgd2luZG93OwoJdmFyIGRfaW1nOwoJaWYoZG9jdW1lbnQuaW1hZ2VzICYmIChkX2ltZyA9IGRfdy5kb2N1bWVudC5pbWFnZXNbZF9ubV0pKQoJewoJCWlmKGRfeHkpCgkJewoJCQlpZihkZC5uNCkKCQkJewoJCQkJZGQuZ2V0UGFnZVhZKGRfdyk7CgkJCQlkX28uZGVmeCA9IGRfaW1nLnggKyBkZC54OwoJCQkJZF9vLmRlZnkgPSBkX2ltZy55ICsgZGQueTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRkLmdldFBhZ2VYWShkX2ltZyk7CgkJCQlkX28uZGVmeCA9IGRkLng7CgkJCQlkX28uZGVmeSA9IGRkLnk7CgkJCX0KCQl9CgkJcmV0dXJuIGRfaW1nOwoJfQoJaWYoZGQubjQpIGZvcih2YXIgZF9pID0gZF93LmRvY3VtZW50LmxheWVycy5sZW5ndGg7IGRfaTspCgl7CgkJdmFyIGRfeSA9IGRkLmdldEltZyhkX28sIGRfbm0sIGRfeHksIGRfdy5kb2N1bWVudC5sYXllcnNbLS1kX2ldKTsKCQlpZihkX3kpIHJldHVybiBkX3k7Cgl9CglyZXR1cm4gbnVsbDsKfTsKZGQuZ2V0UGFyZW50ID0gZnVuY3Rpb24oZF9vLCBkX3ApCnsKCWlmKGRkLm40KQoJewoJCWZvcih2YXIgZF9pID0gZGQuZWxlbWVudHMubGVuZ3RoOyBkX2k7KQoJCXsKCQkJaWYoISgoZF9wID0gZGQuZWxlbWVudHNbLS1kX2ldKS5pc19pbWFnZSkgJiYgZF9wLmRpdiAmJiAoZF9wLmRpdi5kb2N1bWVudC5sYXllcnNbZF9vLm5hbWVdIHx8IGRfby5vaW1nICYmIGRfcC5kaXYuZG9jdW1lbnQuaW1hZ2VzW2Rfby5vaW1nLm5hbWVdKSkKCQkJCWRfcC5hZGRDaGlsZChkX28sIGRfcC5kZXRhY2gsIDEpOwoJCX0KCX0KCWVsc2UKCXsKCQlkX3AgPSBkX28uaXNfaW1hZ2U/IGRkLmdldEltZyhkX28sIGRfby5vaW1nLm5hbWUpIDogKGRfby5kaXYgfHwgbnVsbCk7CgkJd2hpbGUoZF9wICYmICEhKGRfcCA9IGRfcC5vZmZzZXRQYXJlbnQgfHwgZF9wLnBhcmVudE5vZGUgfHwgbnVsbCkpCgkJewoJCQlpZihkX3AuZGRPYmopCgkJCXsKCQkJCWRfcC5kZE9iai5hZGRDaGlsZChkX28sIGRfcC5kZE9iai5kZXRhY2gsIDEpOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn07CmRkLmdldENtZCA9IGZ1bmN0aW9uKGRfbywgZF9jbWQsIGRfY21kU3RyKQp7Cgl2YXIgZF9pID0gZF9vLmlkLmluZGV4T2YoZF9jbWQpLCBkX2osCglkX3kgPSAoZF9pID49IDApKjE7CglpZihkX3kpCgl7CgkJZF9qID0gZF9pK2RfY21kLmxlbmd0aDsKCQlpZihkX2NtZFN0cikgZF9vLmNtZCArPSBkX28uaWQuc3Vic3RyaW5nKGRfaSwgZF9qKTsKCQlkX28uaWQgPSBkX28uaWQuc3Vic3RyaW5nKDAsIGRfaSkgKyBkX28uaWQuc3Vic3RyaW5nKGRfaik7Cgl9CglyZXR1cm4gZF95Owp9OwpkZC5nZXRDbWRWYWwgPSBmdW5jdGlvbihkX28sIGRfY21kLCBkX2NtZFN0ciwgaW50MCkKewoJdmFyIGRfaSA9IGRfby5pZC5pbmRleE9mKGRfY21kKSwgZF9qLAoJZF95ID0gKGRfby5pZC5pbmRleE9mKGRfY21kKSA+PSAwKT8gZGQuSW50KGRfby5pZC5zdWJzdHJpbmcoZF9vLmlkLmluZGV4T2YoZF9jbWQpK2RfY21kLmxlbmd0aCkpIDogaW50MD8gLTEgOiAwOwoJaWYoIWludDAgJiYgZF95IHx8IGludDAgJiYgZF95ID49IDApCgl7CgkJZF9qID0gZF9pK2RfY21kLmxlbmd0aCsoIiIrZF95KS5sZW5ndGg7CgkJaWYoZF9jbWRTdHIpIGRfby5jbWQgKz0gZF9vLmlkLnN1YnN0cmluZyhkX2ksIGRfaik7CgkJZF9vLmlkID0gZF9vLmlkLnN1YnN0cmluZygwLCBkX2kpICsgZF9vLmlkLnN1YnN0cmluZyhkX2opOwoJfQoJcmV0dXJuIGRfeTsKfTsKZGQuYWRkRWx0ID0gZnVuY3Rpb24oZF9vLCBkX3ApCnsKCWRkLmVsZW1lbnRzW2Rfby5uYW1lXSA9IGRkLmVsZW1lbnRzW2Rfby5pbmRleCA9IGRkLmVsZW1lbnRzLmxlbmd0aF0gPSBkX287CglpZihkX3ApIGRfcC5jb3BpZXNbZF9vLm5hbWVdID0gZF9wLmNvcGllc1tkX3AuY29waWVzLmxlbmd0aF0gPSBkX287Cn07CmRkLm1rV3pEb20gPSBmdW5jdGlvbigpCnsKCXZhciBkX28sIGRfbCA9IGRkLmVsZW1lbnRzLmxlbmd0aCwgZF9pOwoJZm9yKGRfaSA9IGRfbDsgZF9pOykgZGQuZ2V0UGFyZW50KGRkLmVsZW1lbnRzWy0tZF9pXSk7Cglmb3IoZF9pID0gZF9sOyBkX2k7KQoJewoJCWlmKChkX28gPSBkZC5lbGVtZW50c1stLWRfaV0pLmNoaWxkcmVuICYmICFkX28ucGFyZW50KQoJCXsKCQkJZm9yKHZhciBkX2ogPSBkX28uY2hpbGRyZW4ubGVuZ3RoOyBkX2o7KQoJCQl7LS1kX2o7CgkJCQlkX28uY2hpbGRyZW5bZF9qXS5zZXRaKGRfby56K2Rfby5jaGlsZHJlbltkX2pdLnosIDEpOwoJCQl9CgkJfQoJfQp9OwpkZC5hZGRQcm9wcyA9IGZ1bmN0aW9uKGRfbykKewoJaWYoZF9vLmlzX2ltYWdlKQoJewoJCWRfby5kaXYgPSBkZC5nZXREaXYoZF9vLmlkKTsKCQlkX28uY3NzID0gKGRfby5kaXYgJiYgdHlwZW9mIGRfby5kaXYuc3R5bGUgIT0gZGRfdSk/IGRfby5kaXYuc3R5bGUgOiBudWxsOwoJCWRfby5uaW1nID0gKGRkLm40ICYmIGRfby5kaXYpPyBkX28uZGl2LmRvY3VtZW50LmltYWdlc1swXSA6IChkb2N1bWVudC5pbWFnZXNbZF9vLmlkKyJOSTFtNkciXSB8fCBudWxsKTsKCQlpZighZF9vLm5vYWx0ICYmICFkZC5ub2FsdCAmJiBkX28ubmltZyAmJiBkX28ub2ltZykKCQl7CgkJCWRfby5uaW1nLmFsdCA9IGRfby5vaW1nLmFsdCB8fCAnJzsKCQkJZF9vLm5pbWcudGl0bGUgPSBkX28ub2ltZy50aXRsZTsKCQkJZF9vLm5pbWcub25tb3VzZW92ZXIgPSBkX28ub2ltZy5vbm1vdXNlb3ZlcjsKCQkJZF9vLm5pbWcub25tb3VzZW91dCA9IGRfby5vaW1nLm9ubW91c2VvdXQ7CgkJfQoJCWRfby5iZ0NvbG9yID0gJyc7Cgl9CgllbHNlCgl7CgkJZF9vLmJnQ29sb3IgPSBkZC5nZXRDc3NQcm9wKGRfby5kaXYsICdiYWNrZ3JvdW5kLWNvbG9yJywnYmFja2dyb3VuZENvbG9yJywnYmdDb2xvcicpLnRvTG93ZXJDYXNlKCk7CgkJaWYoZGQubjYgJiYgZF9vLmRpdikKCQl7CgkJCXZhciBkX2MgPSBkX28uYmdDb2xvci50b0xvd2VyQ2FzZSgpOwoJCQlpZihkX2MuaW5kZXhPZigncmdiJykgPj0gMCkKCQkJewoJCQkJZF9jID0gZF9jLnN1YnN0cmluZyg0LCBkX2MubGVuZ3RoLTEpLnNwbGl0KCcsJyk7CgkJCQlkX28uYmdDb2xvciA9ICcjJzsKCQkJCWZvcih2YXIgZF9sID0gZF9jLmxlbmd0aCwgZF9pID0gMDsgZF9pIDwgZF9sOyBkX2krKykgZF9vLmJnQ29sb3IgKz0gcGFyc2VJbnQoZF9jW2RfaV0pLnRvU3RyaW5nKDB4MTApOwoJCQl9CgkJCWVsc2UgZF9vLmJnQ29sb3IgPSBkX2M7CgkJfQoJfQoJaWYoZGQuc2NhbGFibGUpIGRfby5zY2FsYWJsZSA9IGRfby5yZXNpemFibGVeMTsKCWVsc2UgaWYoZGQucmVzaXphYmxlKSBkX28ucmVzaXphYmxlID0gZF9vLnNjYWxhYmxlXjE7CglkX28uc2V0WihkX28uZGVmeik7CglkX28uY3Vyc29yID0gZF9vLmN1cnNvciB8fCBkZC5jdXJzb3IgfHwgJ2F1dG8nOwoJZF9vLl9zZXRDcnMoZF9vLm5vZHJhZz8gJ2F1dG8nIDogZF9vLmN1cnNvcik7CglkX28uZGlhcGhhbiA9IGRfby5kaWFwaGFuIHx8IGRkLmRpYXBoYW4gfHwgMDsKCWRfby5vcGFjaXR5ID0gMS4wOwoJZF9vLnZpc2libGUgPSB0cnVlOwp9OwpkZC5pbml0eiA9IGZ1bmN0aW9uKCkKewoJaWYoIShkZCAmJiAoZGQubjQgfHwgZGQubjYgfHwgZGQuaWUgfHwgZGQub3AgfHwgZGQudzNjKSkpIHJldHVybjsKCWVsc2UgaWYoZGQubjYgfHwgZGQuaWUgfHwgZGQub3AgfHwgZGQudzNjKSBkZC5yZWNhbGMoMSk7Cgl2YXIgZF9kcmFnID0gKGRvY3VtZW50Lm9ubW91c2Vtb3ZlID09IERSQUcpLAoJZF9yZXNpemUgPSAoZG9jdW1lbnQub25tb3VzZW1vdmUgPT0gUkVTSVpFKTsKCWlmKGRkLmxvYWRGdW5jKSBkZC5sb2FkRnVuYygpOwoJaWYoZF9kcmFnKSBkZC5zZXRNb3ZIZGwoRFJBRyk7CgllbHNlIGlmKGRfcmVzaXplKSBkZC5zZXRNb3ZIZGwoUkVTSVpFKTsKCWlmKGRfZHJhZyB8fCBkX3Jlc2l6ZSkgZGQuc2V0VXBIZGwoRFJPUCk7CglkZC5zZXREd25IZGwoUElDSyk7Cn07CmRkLmZpbmx6ID0gZnVuY3Rpb24oKQp7CglpZihkZC5pZSAmJiBkZC5lbGVtZW50cykKCXsKCQlkZC5ub1JlY2FsYyA9IHRydWU7CgkJZm9yKHZhciBkX2kgPSBkZC5lbGVtZW50cy5sZW5ndGg7IGRfaTspCgkJCWRkLmVsZW1lbnRzWy0tZF9pXS5kZWwoKTsKCQlkZC5ub1JlY2FsYyA9IGZhbHNlOwoJfQoJaWYoZGQudWxvYWRGdW5jKSBkZC51bG9hZEZ1bmMoKTsKfTsKZGQuc2V0Q2UgPSBmdW5jdGlvbihkX2UsIGRfZm5jKQp7CglkX2ZuYz8gZG9jdW1lbnQuY2FwdHVyZUV2ZW50cyhkX2UpIDogZG9jdW1lbnQucmVsZWFzZUV2ZW50cyhkX2UpOwp9OwpkZC5zZXREd25IZGwgPSBmdW5jdGlvbihkX3gpCnsKCWlmKGRvY3VtZW50Lm9ubW91c2Vkb3duICE9IGRfeCkKCXsKCQlkZC5kb3duRnVuYyA9IGRvY3VtZW50Lm9ubW91c2Vkb3duOwoJCWRvY3VtZW50Lm9ubW91c2Vkb3duID0gZF94OwoJCWlmKGRkLmNlKSBkZC5zZXRDZShFdmVudC5NT1VTRURPV04sIGRfeCk7Cgl9Cn07CmRkLnNldE1vdkhkbCA9IGZ1bmN0aW9uKGRfeCkKewoJaWYoZG9jdW1lbnQub25tb3VzZW1vdmUgIT0gZF94KQoJewoJCWRkLm1vdmVGdW5jID0gZG9jdW1lbnQub25tb3VzZW1vdmU7CgkJZG9jdW1lbnQub25tb3VzZW1vdmUgPSBkX3g7CgkJaWYoZGQuY2UpIGRkLnNldENlKEV2ZW50Lk1PVVNFTU9WRSwgZF94KTsKCX0KfTsKZGQuc2V0VXBIZGwgPSBmdW5jdGlvbihkX3gpCnsKCWlmKGRvY3VtZW50Lm9ubW91c2V1cCAhPSBkX3gpCgl7CgkJZGQudXBGdW5jID0gZG9jdW1lbnQub25tb3VzZXVwOwoJCWRvY3VtZW50Lm9ubW91c2V1cCA9IGRfeDsKCQlpZihkZC5jZSkgZGQuc2V0Q2UoRXZlbnQuTU9VU0VVUCwgZF94KTsKCX0KfTsKZGQuZXZ0ID0gZnVuY3Rpb24oZF9lKQp7Cgl0aGlzLmJ1dCA9ICh0aGlzLmUgPSBkX2UgfHwgd2luZG93LmV2ZW50KS53aGljaCB8fCB0aGlzLmUuYnV0dG9uIHx8IDA7Cgl0aGlzLmJ1dHRvbiA9ICh0aGlzLmUudHlwZSA9PSAnbW91c2Vkb3duJyk/IHRoaXMuYnV0CgkJOiAoZGQuZSAmJiBkZC5lLmJ1dHRvbik/IGRkLmUuYnV0dG9uCgkJOiAwOwoJdGhpcy5zcmMgPSB0aGlzLmUudGFyZ2V0IHx8IHRoaXMuZS5zcmNFbGVtZW50IHx8IG51bGw7Cgl0aGlzLnNyYy50YWcgPSAoIiIgKyAodGhpcy5zcmMudGFnTmFtZSB8fCB0aGlzLnNyYykpLnRvTG93ZXJDYXNlKCk7Cgl0aGlzLnggPSBkZC5JbnQodGhpcy5lLnBhZ2VYIHx8IHRoaXMuZS5jbGllbnRYIHx8IDApOwoJdGhpcy55ID0gZGQuSW50KHRoaXMuZS5wYWdlWSB8fCB0aGlzLmUuY2xpZW50WSB8fCAwKTsKCWlmKGRkLmllKQoJewoJCXRoaXMueCArPSBkZC5nZXRTY3JvbGxYKCkgLSAoZGQuaWUgJiYgIWRkLmllbWFjKSoxOwoJCXRoaXMueSArPSBkZC5nZXRTY3JvbGxZKCkgLSAoZGQuaWUgJiYgIWRkLmllbWFjKSoxOwoJfQoJdGhpcy5tb2RpZktleSA9IHRoaXMuZS5tb2RpZmllcnM/IHRoaXMuZS5tb2RpZmllcnMmRXZlbnQuU0hJRlRfTUFTSyA6ICh0aGlzLmUuc2hpZnRLZXkgfHwgZmFsc2UpOwp9OwpkZC5nZXRFdmVudFRhcmdldCA9IGZ1bmN0aW9uKGRfZSwgZF9zLCBkX24pCnsKCWRfZSA9IGRfZSB8fCB3aW5kb3cuZXZlbnQ7CglpZihkX2UgJiYgKGRfcyA9IGRfZS50YXJnZXQgfHwgZF9lLnNyY0VsZW1lbnQgfHwgbnVsbCkgIT0gbnVsbCkKCXsKCQlpZihudWxsICE9IChkX24gPSBkX3MuaWQgfHwgZF9zLm5hbWUgfHwgbnVsbCkpCgkJewoJCQlpZihkX24uaW5kZXhPZigiZElpMTV2TkkxbTZHIikgPT0gZF9uLmxlbmd0aC0xMikKCQkJCXJldHVybiBkZC5lbGVtZW50c1tkX24uc3Vic3RyaW5nKDAsIGRfbi5sZW5ndGgtMTIpXSB8fCBudWxsOwoJCQlpZihkX24uaW5kZXhPZigiZElpMTV2IikgPT0gZF9uLmxlbmd0aC02KQoJCQkJcmV0dXJuIGRkLmVsZW1lbnRzW2Rfbi5zdWJzdHJpbmcoMCwgZF9uLmxlbmd0aC02KV0gfHwgbnVsbDsKCQkJcmV0dXJuIGRkLmVsZW1lbnRzW2Rfbl0gfHwgbnVsbDsKCQl9Cgl9CglyZXR1cm4gbnVsbDsKfTsKZGQucmVjYWxjID0gZnVuY3Rpb24oZF94KQp7CglpZihkZC5ub1JlY2FsYykgcmV0dXJuOwoJZm9yKHZhciBkX28sIGRfaSA9IGRkLmVsZW1lbnRzLmxlbmd0aDsgZF9pOykKCXsKCQlpZighKGRfbyA9IGRkLmVsZW1lbnRzWy0tZF9pXSkuaXNfaW1hZ2UgJiYgZF9vLmRpdikKCQl7CgkJCWRkLmdldFdIKGRfbyk7CgkJCWlmKGRfby5kaXYucG9zX3JlbCkKCQkJewoJCQkJZGQuZ2V0UGFnZVhZKGRfby5kaXYpOwoJCQkJdmFyIGRfZHggPSBkZC54IC0gZF9vLngsIGRfZHkgPSBkZC55IC0gZF9vLnk7CgkJCQlkX28uZGVmeCArPSBkX2R4OwoJCQkJZF9vLnggKz0gZF9keDsKCQkJCWRfby5kZWZ5ICs9IGRfZHk7CgkJCQlkX28ueSArPSBkX2R5OwoJCQkJZm9yKHZhciBkX3AsIGRfaiA9IGRfby5jaGlsZHJlbi5sZW5ndGg7IGRfajspCgkJCQl7CgkJCQkJaWYoIShkX3AgPSBkX28uY2hpbGRyZW5bLS1kX2pdKS5kZXRhY2hlZCAmJiAoZF9vICE9IGRfcC5kZWZwYXJlbnQgfHwgIShkX3AuaXNfaW1hZ2UgJiYgZGQuZ2V0SW1nKGRfcCwgZF9wLm9pbWcubmFtZSwgMSkpKSkKCQkJCQl7CgkJCQkJCWRfcC5kZWZ4ICs9IGRfZHg7CgkJCQkJCWRfcC5kZWZ5ICs9IGRfZHk7CgkJCQkJCWRfcC5tb3ZlQnkoZF9keCwgZF9keSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCWVsc2UgaWYoZF9vLmlzX2ltYWdlICYmICFkZC5uNCkKCQl7CgkJCWlmKGRkLm42ICYmIGRfeCAmJiAhZF9vLmRlZncpIGRfby5yZXNpemVUbyhkX28uZGVmdyA9IGRkLmdldEltZ1coZF9vLm9pbWcpLCBkX28uZGVmaCA9IGRkLmdldEltZ0goZF9vLm9pbWcpKTsKCQkJdmFyIGRfZGVmeCA9IGRfby5kZWZ4LCBkX2RlZnkgPSBkX28uZGVmeTsKCQkJaWYoIShkX28ucGFyZW50ICYmIGRfby5wYXJlbnQgIT0gZF9vLmRlZnBhcmVudCkgJiYgKGRfeCB8fCAhZF9vLmRldGFjaGVkIHx8IGRfby5ob3Jpem9udGFsIHx8IGRfby52ZXJ0aWNhbCkgJiYgZGQuZ2V0SW1nKGRfbywgZF9vLm9pbWcubmFtZSwgMSkpCgkJCQlkX28ubW92ZUJ5KGRfby5kZWZ4LWRfZGVmeCwgZF9vLmRlZnktZF9kZWZ5KTsKCQl9Cgl9Cn07CmZ1bmN0aW9uIFdJTlNaKGRfeCkKewoJaWYoZF94KQoJewoJCWlmKGRkLm40KQoJCXsKCQkJZGQuaVcgPSBpbm5lcldpZHRoOwoJCQlkZC5pSCA9IGlubmVySGVpZ2h0OwoJCX0KCQl3aW5kb3cub25yZXNpemUgPSBuZXcgRnVuY3Rpb24oJ1dJTlNaKCk7Jyk7Cgl9CgllbHNlIGlmKGRkLm40ICYmIChpbm5lcldpZHRoICE9IGRkLmlXIHx8IGlubmVySGVpZ2h0ICE9IGRkLmlIKSkgbG9jYXRpb24ucmVsb2FkKCk7CgllbHNlIGlmKCFkZC5uNCkgc2V0VGltZW91dCgnZGQucmVjYWxjKCknLCAweGEpOwp9CldJTlNaKDEpOwoKZnVuY3Rpb24gRERPYmooZF9vLCBkX2kpCnsKCXRoaXMuaWQgPSBkX287Cgl0aGlzLmNtZCA9ICcnOwoJdGhpcy5jcHlfbiA9IGRkLmdldENtZFZhbCh0aGlzLCBDT1BZKTsKCXRoaXMubWF4b2ZmYiA9IGRkLmdldENtZFZhbCh0aGlzLCBNQVhPRkZCT1RUT00sIDAsIDEpOwoJdGhpcy5tYXhvZmZsID0gZGQuZ2V0Q21kVmFsKHRoaXMsIE1BWE9GRkxFRlQsIDAsIDEpOwoJdGhpcy5tYXhvZmZyID0gZGQuZ2V0Q21kVmFsKHRoaXMsIE1BWE9GRlJJR0hULCAwLCAxKTsKCXRoaXMubWF4b2ZmdCA9IGRkLmdldENtZFZhbCh0aGlzLCBNQVhPRkZUT1AsIDAsIDEpOwoJdmFyIGRfaiA9IGRkX2N1cnNvcnMubGVuZ3RoOyB3aGlsZShkX2otLSkKCQlpZihkZC5nZXRDbWQodGhpcywgZGRfY3Vyc29yc1tkX2pdLCAxKSkgdGhpcy5jdXJzb3IgPSBkZF9jdXJzb3JzW2Rfal0uc3Vic3RyaW5nKDIpOwoJdGhpcy5jbG9uZSA9IGRkLmdldENtZCh0aGlzLCBDTE9ORSwgMSk7Cgl0aGlzLmRldGFjaCA9IGRkLmdldENtZCh0aGlzLCBERVRBQ0hfQ0hJTERSRU4pOwoJdGhpcy5zY2FsYWJsZSA9IGRkLmdldENtZCh0aGlzLCBTQ0FMQUJMRSwgMSk7Cgl0aGlzLmhvcml6b250YWwgPSBkZC5nZXRDbWQodGhpcywgSE9SSVpPTlRBTCk7Cgl0aGlzLm5vYWx0ID0gZGQuZ2V0Q21kKHRoaXMsIE5PX0FMVCwgMSk7Cgl0aGlzLm5vZHJhZyA9IGRkLmdldENtZCh0aGlzLCBOT19EUkFHKTsKCXRoaXMuc2Nyb2xsID0gZGQuZ2V0Q21kKHRoaXMsIFNDUk9MTCwgMSk7Cgl0aGlzLnJlc2l6YWJsZSA9IGRkLmdldENtZCh0aGlzLCBSRVNJWkFCTEUsIDEpOwoJdGhpcy5yZV96ID0gZGQuZ2V0Q21kKHRoaXMsIFJFU0VUX1osIDEpOwoJdGhpcy5kaWFwaGFuID0gZGQuZ2V0Q21kKHRoaXMsIFRSQU5TUEFSRU5ULCAxKTsKCXRoaXMudmVydGljYWwgPSBkZC5nZXRDbWQodGhpcywgVkVSVElDQUwpOwoJdGhpcy5tYXh3ID0gZGQuZ2V0Q21kVmFsKHRoaXMsIE1BWFdJRFRILCAxLCAxKTsKCXRoaXMubWludyA9IE1hdGguYWJzKGRkLmdldENtZFZhbCh0aGlzLCBNSU5XSURUSCwgMSwgMSkpOwoJdGhpcy5tYXhoID0gZGQuZ2V0Q21kVmFsKHRoaXMsIE1BWEhFSUdIVCwgMSwgMSk7Cgl0aGlzLm1pbmggPSBNYXRoLmFicyhkZC5nZXRDbWRWYWwodGhpcywgTUlOSEVJR0hULCAxLCAxKSk7Cgl0aGlzLnBpY2tGdW5jID0gdGhpcy5kcmFnRnVuYyA9IHRoaXMucmVzaXplRnVuYyA9IHRoaXMuZHJvcEZ1bmMgPSBudWxsOwoKCXRoaXMubmFtZSA9IHRoaXMuaWQgKyAoZF9pIHx8ICcnKTsKCXRoaXMub2ltZyA9IGRkLmdldEltZyh0aGlzLCB0aGlzLmlkLCAxKTsKCXRoaXMuaXNfaW1hZ2UgPSAhIXRoaXMub2ltZzsKCXRoaXMuY29waWVzID0gbmV3IEFycmF5KCk7Cgl0aGlzLmNoaWxkcmVuID0gbmV3IEFycmF5KCk7Cgl0aGlzLnBhcmVudCA9IHRoaXMub3JpZ2luYWwgPSBudWxsOwoJaWYodGhpcy5vaW1nKQoJewoJCXRoaXMuaWQgPSB0aGlzLm5hbWUgKyAiZElpMTV2IjsKCQl0aGlzLncgPSBkZC5nZXRJbWdXKHRoaXMub2ltZyk7CgkJdGhpcy5oID0gZGQuZ2V0SW1nSCh0aGlzLm9pbWcpOwoJCXRoaXMuZHcgPSB0aGlzLmRoID0gMDsKCQl0aGlzLmRlZnogPSBkZC5JbnQoZGQuZ2V0Q3NzUHJvcCh0aGlzLm9pbWcsICd6LWluZGV4JywnekluZGV4JywnekluZGV4JykpIHx8IDE7CgkJdGhpcy5kZWZzcmMgPSB0aGlzLnNyYyA9IHRoaXMub2ltZy5zcmM7CgkJdGhpcy5odG0gPSAnPGltZyBuYW1lPSInICsgdGhpcy5pZCArICdOSTFtNkciJysKCQkJJyBzcmM9IicgKyB0aGlzLm9pbWcuc3JjICsgJyIgJysKCQkJJ3dpZHRoPSInICsgdGhpcy53ICsgJyIgaGVpZ2h0PSInICsgdGhpcy5oICsgJyI+JzsKCQl0aGlzLnRfaHRtID0gJzxkaXYgaWQ9IicgKyB0aGlzLmlkICsKCQkJJyIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOycrCgkJCSdsZWZ0OicgKyAodGhpcy5jc3N4ID0gdGhpcy54ID0gdGhpcy5kZWZ4KSArICdweDsnKwoJCQkndG9wOicgKyAodGhpcy5jc3N5ID0gdGhpcy55ID0gdGhpcy5kZWZ5KSArICdweDsnKwoJCQknd2lkdGg6JyArIHRoaXMudyArICdweDsnKwoJCQknaGVpZ2h0OicgKyB0aGlzLmggKyAncHg7Ij4nKwoJCQl0aGlzLmh0bSArICc8L2Rpdj4nOwoJfQoJZWxzZQoJewoJCWlmKCEhKHRoaXMuZGl2ID0gZGQuZ2V0RGl2KHRoaXMuaWQpKSAmJiB0eXBlb2YgdGhpcy5kaXYuc3R5bGUgIT0gZGRfdSkgdGhpcy5jc3MgPSB0aGlzLmRpdi5zdHlsZTsKCQlkZC5nZXRXSCh0aGlzKTsKCQlpZih0aGlzLmRpdikKCQl7CgkJCXRoaXMuZGl2LmRkT2JqID0gdGhpczsKCQkJdGhpcy5kaXYucG9zX3JlbCA9IGRkLmdldENzc1Byb3AodGhpcy5kaXYsICdwb3NpdGlvbicsJ3Bvc2l0aW9uJywncG9zaXRpb24nKSA9PSAicmVsYXRpdmUiOwoJCX0KCQlkZC5nZXRQYWdlWFkodGhpcy5kaXYpOwoJCXRoaXMuZGVmeCA9IHRoaXMueCA9IGRkLng7CgkJdGhpcy5kZWZ5ID0gdGhpcy55ID0gZGQueTsKCQlkZC5nZXRDc3NYWSh0aGlzKTsKCQl0aGlzLmRlZnogPSBkZC5JbnQoZGQuZ2V0Q3NzUHJvcCh0aGlzLmRpdiwgJ3otaW5kZXgnLCd6SW5kZXgnLCd6SW5kZXgnKSk7Cgl9Cgl0aGlzLmRlZncgPSB0aGlzLncgfHwgMDsKCXRoaXMuZGVmaCA9IHRoaXMuaCB8fCAwOwp9CkRET2JqLnByb3RvdHlwZS5zZXRQaWNrRnVuYyA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5waWNrRnVuYyA9IGRfeDsKfTsKRERPYmoucHJvdG90eXBlLnNldERyYWdGdW5jID0gZnVuY3Rpb24oZF94KQp7Cgl0aGlzLmRyYWdGdW5jID0gZF94Owp9OwpERE9iai5wcm90b3R5cGUuc2V0UmVzaXplRnVuYyA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5yZXNpemVGdW5jID0gZF94Owp9OwpERE9iai5wcm90b3R5cGUuc2V0RHJvcEZ1bmMgPSBmdW5jdGlvbihkX3gpCnsKCXRoaXMuZHJvcEZ1bmMgPSBkX3g7Cn07CkRET2JqLnByb3RvdHlwZS5tb3ZlQnkgPSBmdW5jdGlvbihkX3gsIGRfeSwgZF9rZHMsIGRfbykKewoJaWYoIXRoaXMuZGl2KSByZXR1cm47Cgl0aGlzLnggKz0gKGRfeCA9IGRkLkludChkX3gpKTsKCXRoaXMueSArPSAoZF95ID0gZGQuSW50KGRfeSkpOwoJaWYoIWRfa2RzIHx8IHRoaXMuaXNfaW1hZ2UgfHwgdGhpcy5wYXJlbnQgIT0gdGhpcy5kZWZwYXJlbnQpCgl7CgkJKGRfbyA9IHRoaXMuY3NzIHx8IHRoaXMuZGl2KS5sZWZ0ID0gKHRoaXMuY3NzeCArPSBkX3gpICsgZGQucHg7CgkJZF9vLnRvcCA9ICh0aGlzLmNzc3kgKz0gZF95KSArIGRkLnB4OwoJfQoJZm9yKHZhciBkX2kgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgZF9pOykKCXsKCQlpZighKGRfbyA9IHRoaXMuY2hpbGRyZW5bLS1kX2ldKS5kZXRhY2hlZCkgZF9vLm1vdmVCeShkX3gsIGRfeSwgMSk7CgkJZF9vLmRlZnggKz0gZF94OwoJCWRfby5kZWZ5ICs9IGRfeTsKCX0KfTsKCkRET2JqLnByb3RvdHlwZS5tb3ZlVG8gPSBmdW5jdGlvbihkX3gsIGRfeSkKewoJdGhpcy5tb3ZlQnkoZGQuSW50KGRfeCktdGhpcy54LCBkZC5JbnQoZF95KS10aGlzLnkpOwp9OwpERE9iai5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uKGRfbSwgZF9vLCBkX3ApCnsKCWlmKHRoaXMuZGl2ICYmIHRoaXMudmlzaWJsZSkKCXsKCQlkX3AgPSB0aGlzLmNzcyB8fCB0aGlzLmRpdjsKCQlpZihkX20gJiYgIWRkLm40KQoJCXsKCQkJdGhpcy5kaXNwbGF5ID0gZGQuZ2V0Q3NzUHJvcCh0aGlzLmRpdiwgImRpc3BsYXkiLCAiZGlzcGxheSIsICJkaXNwbGF5Iik7CgkJCWlmKHRoaXMub2ltZykKCQkJewoJCQkJdGhpcy5vaW1nLmRpc3BsYXkgPSBkZC5nZXRDc3NQcm9wKHRoaXMub2ltZywgImRpc3BsYXkiLCAiZGlzcGxheSIsICJkaXNwbGF5Iik7CgkJCQl0aGlzLm9pbWcuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCQkJfQoJCQlkX3AuZGlzcGxheSA9ICJub25lIjsKCQkJZGQucmVjYWxjKCk7CgkJfQoJCWVsc2UgZF9wLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKCX0KCXRoaXMudmlzaWJsZSA9IGZhbHNlOwoJZm9yKHZhciBkX2kgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgZF9pOykKCQlpZighKGRfbyA9IHRoaXMuY2hpbGRyZW5bLS1kX2ldKS5kZXRhY2hlZCkgZF9vLmhpZGUoZF9tKTsKfTsKRERPYmoucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbihkX28sIGRfcCkKewoJaWYodGhpcy5kaXYpCgl7CgkJZF9wID0gdGhpcy5jc3MgfHwgdGhpcy5kaXY7CgkJaWYoZF9wLmRpc3BsYXkgJiYgZF9wLmRpc3BsYXkgPT0gIm5vbmUiKQoJCXsKCQkJZF9wLmRpc3BsYXkgPSB0aGlzLmRpc3BsYXkgfHwgImJsb2NrIjsKCQkJaWYodGhpcy5vaW1nKSB0aGlzLm9pbWcuc3R5bGUuZGlzcGxheSA9IHRoaXMub2ltZy5kaXNwbGF5IHx8ICJpbmxpbmUiOwoJCQlkZC5yZWNhbGMoKTsKCQl9CgkJZWxzZSBkX3AudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKCX0KCXRoaXMudmlzaWJsZSA9IHRydWU7Cglmb3IodmFyIGRfaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBkX2k7KQoJCWlmKCEoZF9vID0gdGhpcy5jaGlsZHJlblstLWRfaV0pLmRldGFjaGVkKSBkX28uc2hvdygpOwp9OwpERE9iai5wcm90b3R5cGUucmVzaXplVG8gPSBmdW5jdGlvbihkX3csIGRfaCwgZF9vKQp7CglpZighdGhpcy5kaXYpIHJldHVybjsKCWRfdyA9ICh0aGlzLncgPSBkZC5JbnQoZF93KSktdGhpcy5kdzsKCWRfaCA9ICh0aGlzLmggPSBkZC5JbnQoZF9oKSktdGhpcy5kaDsKCWlmKGRkLm40KQoJewoJCXRoaXMuZGl2LnJlc2l6ZVRvKGRfdywgZF9oKTsKCQlpZih0aGlzLmlzX2ltYWdlKQoJCXsKCQkJdGhpcy53cml0ZSgnPGltZyBzcmM9IicgKyB0aGlzLnNyYyArICciIHdpZHRoPSInICsgZF93ICsgJyIgaGVpZ2h0PSInICsgZF9oICsgJyI+Jyk7CgkJCSh0aGlzLm5pbWcgPSB0aGlzLmRpdi5kb2N1bWVudC5pbWFnZXNbMF0pLnNyYyA9IHRoaXMuc3JjOwoJCX0KCX0KCWVsc2UgaWYodHlwZW9mIHRoaXMuY3NzLnBpeGVsV2lkdGggIT0gZGRfdSkKCXsKCQl0aGlzLmNzcy5waXhlbFdpZHRoID0gZF93OwoJCXRoaXMuY3NzLnBpeGVsSGVpZ2h0ID0gZF9oOwoJCWlmKHRoaXMuaXNfaW1hZ2UpCgkJewoJCQkoZF9vID0gdGhpcy5uaW1nLnN0eWxlKS5waXhlbFdpZHRoID0gZF93OwoJCQlkX28ucGl4ZWxIZWlnaHQgPSBkX2g7CgkJfQoJfQoJZWxzZQoJewoJCXRoaXMuY3NzLndpZHRoID0gZF93ICsgZGQucHg7CgkJdGhpcy5jc3MuaGVpZ2h0ID0gZF9oICsgZGQucHg7CgkJaWYodGhpcy5pc19pbWFnZSkKCQl7CgkJCShkX28gPSB0aGlzLm5pbWcpLndpZHRoID0gZF93OwoJCQlkX28uaGVpZ2h0ID0gZF9oOwoJCQlpZighZF9vLmNvbXBsZXRlKSBkX28uc3JjID0gdGhpcy5zcmM7CgkJfQoJfQp9OwpERE9iai5wcm90b3R5cGUucmVzaXplQnkgPSBmdW5jdGlvbihkX2R3LCBkX2RoKQp7Cgl0aGlzLnJlc2l6ZVRvKHRoaXMudytkZC5JbnQoZF9kdyksIHRoaXMuaCtkZC5JbnQoZF9kaCkpOwp9OwpERE9iai5wcm90b3R5cGUuc3dhcEltYWdlID0gZnVuY3Rpb24oZF94LCBkX2NwKQp7CglpZighdGhpcy5uaW1nKSByZXR1cm47Cgl0aGlzLm5pbWcuc3JjID0gZF94OwoJdGhpcy5zcmMgPSB0aGlzLm5pbWcuc3JjOwoJaWYoZF9jcCkKCXsKCQlmb3IodmFyIGRfaSA9IHRoaXMuY29waWVzLmxlbmd0aDsgZF9pOykKCQl7LS1kX2k7CgkJCXRoaXMuY29waWVzW2RfaV0uc3JjID0gdGhpcy5jb3BpZXNbZF9pXS5uaW1nLnNyYyA9IHRoaXMubmltZy5zcmM7CgkJfQoJfQp9OwpERE9iai5wcm90b3R5cGUuc2V0QmdDb2xvciA9IGZ1bmN0aW9uKGRfeCkKewoJaWYoZGQubjQgJiYgdGhpcy5kaXYpIHRoaXMuZGl2LmJnQ29sb3IgPSBkX3g7CgllbHNlIGlmKHRoaXMuY3NzKSB0aGlzLmNzcy5iYWNrZ3JvdW5kID0gZF94OwoJdGhpcy5iZ0NvbG9yID0gZF94Owp9OwpERE9iai5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihkX3gsIGRfbykKewoJdGhpcy50ZXh0ID0gZF94OwoJaWYoIXRoaXMuZGl2KSByZXR1cm47CglpZihkZC5uNCkKCXsKCQkoZF9vID0gdGhpcy5kaXYuZG9jdW1lbnQpLm9wZW4oKTsKCQlkX28ud3JpdGUoZF94KTsKCQlkX28uY2xvc2UoKTsKCQlkZC5nZXRXSCh0aGlzKTsKCX0KCWVsc2UKCXsKCQl0aGlzLmNzcy5oZWlnaHQgPSAnYXV0byc7CgkJdGhpcy5kaXYuaW5uZXJIVE1MID0gZF94OwoJCWlmKCFkZC5pZTQpIGRkLnJlY2FsYygpOwoJCWlmKGRkLmllNCB8fCBkZC5uNikgc2V0VGltZW91dCgnZGQucmVjYWxjKCk7JywgMCk7IC8vIG42LjA6IHJlY2FsYyB0d2ljZQoJfQp9OwpERE9iai5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKGRfbiwgZF9wLCBkX2IpCnsKCWlmKCF0aGlzLm9pbWcpIHJldHVybjsKCWRfYiA9IChkZC5pZSAmJiBkb2N1bWVudC5hbGwudGFncygnYm9keScpKT8gZG9jdW1lbnQuYWxsLnRhZ3MoJ2JvZHknKVswXSA6IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lPyAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXSB8fCBkZC5kYikgOiBkZC5kYjsKCWZvcihkX24gPSBkX24gfHwgMTsgZF9uID4gMDsgLS1kX24pCgl7CgkJdmFyIGRfbCA9IHRoaXMuY29waWVzLmxlbmd0aCwKCQlkX28gPSBuZXcgRERPYmoodGhpcy5uYW1lK3RoaXMuY21kLCBkX2wrMSk7CgkJaWYoZGQubjQpCgkJewoJCQlkX28uaWQgPSAoZF9wID0gbmV3IExheWVyKGRfby53KSkubmFtZTsKCQkJZF9wLmNsaXAuaGVpZ2h0ID0gZF9vLmg7CgkJCWRfcC52aXNpYmlsaXR5ID0gJ3Nob3cnOwoJCQkoZF9wID0gZF9wLmRvY3VtZW50KS5vcGVuKCk7CgkJCWRfcC53cml0ZShkX28uaHRtKTsKCQkJZF9wLmNsb3NlKCk7CgkJfQoJCWVsc2UgaWYoZF9iICYmIGRfYi5pbnNlcnRBZGphY2VudEhUTUwpIGRfYi5pbnNlcnRBZGphY2VudEhUTUwoIkFmdGVyQmVnaW4iLCBkX28udF9odG0pOwoJCWVsc2UgaWYoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiBkX2IgJiYgZF9iLmFwcGVuZENoaWxkKQoJCXsKCQkJZF9iLmFwcGVuZENoaWxkKGRfcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRJaTE1diIpKTsKCQkJZF9wLmlubmVySFRNTCA9IGRfby5odG07CgkJCWRfcC5pZCA9IGRfby5pZDsKCQkJZF9wLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKCQkJZF9wLnN0eWxlLndpZHRoID0gZF9vLncgKyAncHgnOwoJCQlkX3Auc3R5bGUuaGVpZ2h0ID0gZF9vLmggKyAncHgnOwoJCX0KCQllbHNlIGlmKGRfYiAmJiBkX2IuaW5uZXJIVE1MKSBkX2IuaW5uZXJIVE1MICs9IGRfby50X2h0bTsKCQlkX28uZGVmeiA9IHRoaXMuZGVmeisxK2RfbDsKCQlkZC5hZGRQcm9wcyhkX28pOwoJCWRfby5vcmlnaW5hbCA9IHRoaXM7CgkJZGQuYWRkRWx0KGRfbywgdGhpcyk7CgkJaWYodGhpcy5wYXJlbnQpCgkJewoJCQl0aGlzLnBhcmVudC5hZGRDaGlsZChkX28sIHRoaXMuZGV0YWNoZWQpOwoJCQlkX28uZGVmcGFyZW50ID0gdGhpcy5kZWZwYXJlbnQ7CgkJfQoJCWRfby5tb3ZlVG8oZF9vLmRlZnggPSB0aGlzLmRlZngsIGRfby5kZWZ5ID0gdGhpcy5kZWZ5KTsKCQlpZihkZC5uNCkgZF9vLmRlZnNyYyA9IGRfby5zcmMgPSB0aGlzLmRlZnNyYzsKCQlkX28uc3dhcEltYWdlKHRoaXMuc3JjKTsKCX0KfTsKRERPYmoucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24oZF9rZCwgZGV0YWNoLCBkZWZwKQp7CglpZih0eXBlb2YgZF9rZCAhPSAib2JqZWN0IikgZF9rZCA9IGRkLmVsZW1lbnRzW2Rfa2RdOwoJaWYoZF9rZC5wYXJlbnQgJiYgZF9rZC5wYXJlbnQgPT0gdGhpcyB8fCBkX2tkID09IHRoaXMgfHwgIWRfa2QuaXNfaW1hZ2UgJiYgZF9rZC5kZWZwYXJlbnQgJiYgIWRlZnApIHJldHVybjsKCgl0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoXSA9IHRoaXMuY2hpbGRyZW5bZF9rZC5uYW1lXSA9IGRfa2Q7CglkX2tkLmRldGFjaGVkID0gZGV0YWNoIHx8IDA7CglpZihkZWZwKSBkX2tkLmRlZnBhcmVudCA9IHRoaXM7CgllbHNlIGlmKHRoaXMgPT0gZF9rZC5kZWZwYXJlbnQgJiYgZF9rZC5pc19pbWFnZSkgZGQuZ2V0SW1nKHRoaXMsIGRfa2Qub2ltZy5uYW1lLCAxKTsKCWlmKCFkX2tkLmRlZnBhcmVudCB8fCB0aGlzICE9IGRfa2QuZGVmcGFyZW50KQoJewoJCWRfa2QuZGVmeCA9IGRfa2QueDsKCQlkX2tkLmRlZnkgPSBkX2tkLnk7Cgl9CglpZighZGV0YWNoKQoJewoJCWRfa2QuZGVmeiA9IGRfa2QuZGVmeit0aGlzLmRlZnotKGRfa2QucGFyZW50PyBkX2tkLnBhcmVudC5kZWZ6IDogMCkrKCFkX2tkLmlzX2ltYWdlKjEpOwoJCWRfa2Quc2V0WihkX2tkLnordGhpcy56LShkX2tkLnBhcmVudD8gZF9rZC5wYXJlbnQueiA6IDApKyghZF9rZC5pc19pbWFnZSoxKSwgMSk7Cgl9CglpZihkX2tkLnBhcmVudCkgZF9rZC5wYXJlbnQucmVtb3ZlQ2hpbGQoZF9rZCwgMSk7CglkX2tkLnBhcmVudCA9IHRoaXM7Cn07CkRET2JqLnByb3RvdHlwZS5yZW1vdmVDaGlsZCA9IGZ1bmN0aW9uKGRfa2QsIGRfbmV3cCkKewoJaWYodHlwZW9mIGRfa2QgIT0gIm9iamVjdCIpIGRfa2QgPSB0aGlzLmNoaWxkcmVuW2Rfa2RdOwoJdmFyIGRfb2MgPSB0aGlzLmNoaWxkcmVuLCBkX25jID0gbmV3IEFycmF5KCk7Cglmb3IodmFyIGRfaSA9IDA7IGRfaSA8IGRfb2MubGVuZ3RoOyBkX2krKykKCQlpZihkX29jW2RfaV0gIT0gZF9rZCkgZF9uY1tkX25jLmxlbmd0aF0gPSBkX29jW2RfaV07Cgl0aGlzLmNoaWxkcmVuID0gZF9uYzsKCWRfa2QucGFyZW50ID0gbnVsbDsKCWlmKCFkX25ld3ApCgl7CgkJZF9rZC5kZXRhY2hlZCA9IGRfa2QuZGVmcCA9IDA7CgkJaWYoZF9rZC5pc19pbWFnZSkgZGQuZ2V0SW1nKGRfa2QsIGRfa2Qub2ltZy5uYW1lLCAxKTsKCX0KfTsKRERPYmoucHJvdG90eXBlLmF0dGFjaENoaWxkID0gZnVuY3Rpb24oZF9rZCkKewoJKGRfa2QgPSAodHlwZW9mIGRfa2QgIT0gIm9iamVjdCIpPyB0aGlzLmNoaWxkcmVuW2Rfa2RdOiBkX2tkKS5kZXRhY2hlZCA9IDA7CglkX2tkLnNldFooZF9rZC5kZWZ6ICsgdGhpcy56LXRoaXMuZGVmeiwgMSk7Cn07CkRET2JqLnByb3RvdHlwZS5kZXRhY2hDaGlsZCA9IGZ1bmN0aW9uKGRfa2QpCnsKCShkX2tkID0gKHR5cGVvZiBkX2tkICE9ICJvYmplY3QiKT8gdGhpcy5jaGlsZHJlbltkX2tkXTogZF9rZCkuZGV0YWNoZWQgPSAxOwp9OwpERE9iai5wcm90b3R5cGUuc2V0WiA9IGZ1bmN0aW9uKGRfeCwgZF9rZHMsIGRfbykKewoJaWYoZF9rZHMpCgl7CgkJZm9yKHZhciBkX2R6ID0gZF94LXRoaXMueiwgZF9pID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGRfaTspCgkJCWlmKCEoZF9vID0gdGhpcy5jaGlsZHJlblstLWRfaV0pLmRldGFjaGVkKSBkX28uc2V0WihkX28ueitkX2R6LCAxKTsKCX0KCWRkLnogPSBNYXRoLm1heChkZC56LCB0aGlzLnogPSB0aGlzLmRpdj8gKCh0aGlzLmNzcyB8fCB0aGlzLmRpdikuekluZGV4ID0gZF94KSA6IDApOwp9OwpERE9iai5wcm90b3R5cGUubWF4aW1pemVaID0gZnVuY3Rpb24oKQp7Cgl0aGlzLnNldFooZGQueisxLCAxKTsKfTsKRERPYmoucHJvdG90eXBlLl9yZXNldFogPSBmdW5jdGlvbihkX28pCnsKCWlmKHRoaXMucmVfeiB8fCBkZC5yZV96KQoJewoJCXRoaXMuc2V0Wih0aGlzLmRlZnopOwoJCWZvcih2YXIgZF9pID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGRfaTspCgkJCWlmKCEoZF9vID0gdGhpcy5jaGlsZHJlblstLWRfaV0pLmRldGFjaGVkKSBkX28uc2V0WihkX28uZGVmeik7Cgl9Cn07CkRET2JqLnByb3RvdHlwZS5zZXRPcGFjaXR5ID0gZnVuY3Rpb24oZF94KQp7Cgl0aGlzLm9wYWNpdHkgPSBkX3g7Cgl0aGlzLl9zZXRPcGFSZWwoMS4wLCAxKTsKfTsKRERPYmoucHJvdG90eXBlLl9zZXRPcGFSZWwgPSBmdW5jdGlvbihkX3gsIGRfa2QsIGRfeSwgZF9vKQp7CglpZih0aGlzLmNzcyAmJiAodGhpcy5kaWFwaGFuIHx8IGRfa2QpKQoJewoJCWRfeSA9IHRoaXMub3BhY2l0eSpkX3g7CgkJaWYodHlwZW9mIHRoaXMuY3NzLk1vek9wYWNpdHkgIT0gZGRfdSkgdGhpcy5jc3MuTW96T3BhY2l0eSA9IGRfeTsKCQllbHNlIGlmICh0eXBlb2YgdGhpcy5jc3Mub3BhY2l0eSAhPSBkZF91KSB0aGlzLmNzcy5vcGFjaXR5ID0gZF95OwoJCWVsc2UgaWYodHlwZW9mIHRoaXMuY3NzLmZpbHRlciAhPSBkZF91KQoJCQl0aGlzLmNzcy5maWx0ZXIgPSAiQWxwaGEob3BhY2l0eT0iK3BhcnNlSW50KDEwMCpkX3kpKyIpIjsKCQlmb3IodmFyIGRfaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBkX2k7KQoJCQlpZighKGRfbyA9IHRoaXMuY2hpbGRyZW5bLS1kX2ldKS5kZXRhY2hlZCkgZF9vLl9zZXRPcGFSZWwoZF94LCAxKTsKCX0KfTsKRERPYmoucHJvdG90eXBlLnNldEN1cnNvciA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5fc2V0Q3JzKHRoaXMuY3Vyc29yID0gKGRfeC5pbmRleE9mKCdjOicpKzEpPyBkX3guc3Vic3RyaW5nKDIpIDogZF94KTsKfTsKRERPYmoucHJvdG90eXBlLl9zZXRDcnMgPSBmdW5jdGlvbihkX3gpCnsKCWlmKHRoaXMuY3NzKSB0aGlzLmNzcy5jdXJzb3IgPSAoKCFkZC5pZSB8fCBkZC5pZW1hYykgJiYgZF94ID09ICdoYW5kJyk/ICdwb2ludGVyJyA6IGRfeDsKfTsKRERPYmoucHJvdG90eXBlLnNldERyYWdnYWJsZSA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5ub2RyYWcgPSAhZF94KjE7Cgl0aGlzLl9zZXRDcnMoZF94PyB0aGlzLmN1cnNvciA6ICdhdXRvJyk7Cn07CkRET2JqLnByb3RvdHlwZS5zZXRSZXNpemFibGUgPSBmdW5jdGlvbihkX3gpCnsKCXRoaXMucmVzaXphYmxlID0gZF94KjE7CglpZihkX3gpIHRoaXMuc2NhbGFibGUgPSAwOwp9OwpERE9iai5wcm90b3R5cGUuc2V0U2NhbGFibGUgPSBmdW5jdGlvbihkX3gpCnsKCXRoaXMuc2NhbGFibGUgPSBkX3gqMTsKCWlmKGRfeCkgdGhpcy5yZXNpemFibGUgPSAwOwp9OwpERE9iai5wcm90b3R5cGUuc2V0SG9yaXpvbnRhbCA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5ob3Jpem9udGFsID0gZF94KjE7Cn07CkRET2JqLnByb3RvdHlwZS5zZXRWZXJ0aWNhbCA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy52ZXJ0aWNhbCA9IGRfeCoxOwp9OwpERE9iai5wcm90b3R5cGUuZ2V0RWx0QmVsb3cgPSBmdW5jdGlvbihkX3JldCwgZF94LCBkX3kpCnsKCXZhciBkX28sIGRfY21wID0gLTEsIGRfaSA9IGRkLmVsZW1lbnRzLmxlbmd0aDsgd2hpbGUoZF9pLS0pCgl7CgkJZF9vID0gZGQuZWxlbWVudHNbZF9pXTsKCQlkX3ggPSBkX28ueC10aGlzLncvMjsKCQlkX3kgPSBkX28ueS10aGlzLmgvMjsKCQlpZihkX28udmlzaWJsZSAmJiBkX28ueiA8IHRoaXMueiAmJiB0aGlzLnggPj0gZF94ICYmIHRoaXMueCA8PSBkX3grZF9vLncgJiYgdGhpcy55ID49IGRfeSAmJiB0aGlzLnkgPD0gZF95K2Rfby5oKQoJCXsKCQkJaWYoZF9vLnogPiBkX2NtcCkKCQkJewoJCQkJZF9jbXAgPSBkX28uejsKCQkJCWRfcmV0ID0gZF9vOwoJCQl9CgkJfQoJfQoJcmV0dXJuIGRfcmV0Owp9OwpERE9iai5wcm90b3R5cGUuZGVsID0gZnVuY3Rpb24oZF9vcywgZF9vKQp7Cgl2YXIgZF9pLCBkX2w7CglpZih0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5yZW1vdmVDaGlsZCkgdGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CglpZih0aGlzLm9yaWdpbmFsKQoJewoJCXRoaXMuaGlkZSgpOwoJCWlmKHRoaXMub3JpZ2luYWwuY29waWVzKQoJCXsKCQkJZF9vcyA9IG5ldyBBcnJheSgpOwoJCQlmb3IoZF9sID0gdGhpcy5vcmlnaW5hbC5jb3BpZXMubGVuZ3RoLCBkX2kgPSAwOyBkX2kgPCBkX2w7IGRfaSsrKQoJCQkJaWYoKGRfbyA9IHRoaXMub3JpZ2luYWwuY29waWVzW2RfaV0pICE9IHRoaXMpIGRfb3NbZF9vLm5hbWVdID0gZF9vc1tkX29zLmxlbmd0aF0gPSBkX287CgkJCXRoaXMub3JpZ2luYWwuY29waWVzID0gZF9vczsKCQl9Cgl9CgllbHNlIGlmKHRoaXMuaXNfaW1hZ2UpCgl7CgkJdGhpcy5oaWRlKCk7CgkJaWYodGhpcy5vaW1nKQoJCXsKCQkgIGlmKGRkLm40KSB0aGlzLm9pbWcuc3JjID0gdGhpcy5kZWZzcmM7CgkJICBlbHNlIHRoaXMub2ltZy5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnOwoJCX0KCX0KCWVsc2UgaWYodGhpcy5tb3ZlVG8pCgl7CgkJaWYodGhpcy5jc3MpIHRoaXMuY3NzLmN1cnNvciA9ICdkZWZhdWx0JzsKCQl0aGlzLm1vdmVUbyh0aGlzLmRlZngsIHRoaXMuZGVmeSk7CgkJdGhpcy5yZXNpemVUbyh0aGlzLmRlZncsIHRoaXMuZGVmaCk7Cgl9CglkX29zID0gbmV3IEFycmF5KCk7Cglmb3IoZF9sID0gZGQuZWxlbWVudHMubGVuZ3RoLCBkX2kgPSAwOyBkX2kgPCBkX2w7IGRfaSsrKQoJewoJCWlmKChkX28gPSBkZC5lbGVtZW50c1tkX2ldKSAhPSB0aGlzKSBkX29zW2Rfby5uYW1lXSA9IGRfb3NbZF9vLmluZGV4ID0gZF9vcy5sZW5ndGhdID0gZF9vOwoJCWVsc2UgZF9vLl9mcmVlKCk7Cgl9CglkZC5lbGVtZW50cyA9IGRfb3M7CglpZighZGQubjQpIGRkLnJlY2FsYygpOwp9OwpERE9iai5wcm90b3R5cGUuX2ZyZWUgPSBmdW5jdGlvbigpCnsKCWZvcih2YXIgZF9pIGluIHRoaXMpCgkJdGhpc1tkX2ldID0gbnVsbDsKCWRkLmVsZW1lbnRzW3RoaXMubmFtZV0gPSBudWxsOwp9OwpkZC5uNFJlY3RWaXMgPSBmdW5jdGlvbih2aXMpCnsKCWZvcih2YXIgZF9pID0gNDsgZF9pOykKCXstLWRfaTsKCQlkZC5yZWN0SVtkX2ldLnZpc2liaWxpdHkgPSBkZC5yZWN0QVtkX2ldLnZpc2liaWxpdHkgPSB2aXM/ICdzaG93JyA6ICdoaWRlJzsKCQlpZih2aXMpIGRkLnJlY3RJW2RfaV0uekluZGV4ID0gZGQucmVjdEFbZF9pXS56SW5kZXggPSBkZC56KzI7Cgl9Cn07CmRkLm40UmVjdFBvcyA9IGZ1bmN0aW9uKGRfbywgZF94LCBkX3ksIGRfdywgZF9oKQp7CglkX28ueCA9IGRfeDsKCWRfby55ID0gZF95OwoJZF9vLmNsaXAud2lkdGggPSBkX3c7CglkX28uY2xpcC5oZWlnaHQgPSBkX2g7Cn07Ci8vIE5ONDogRHJhdyBpbWcgc2l6aW5nIHJlY3QKZGQubjRSZWN0ID0gZnVuY3Rpb24oZF93LCBkX2gpCnsKCXZhciBkX2k7CglpZighZGQucmVjdEkpCgl7CgkJZGQucmVjdEkgPSBuZXcgQXJyYXkoKTsKCQlkZC5yZWN0QSA9IG5ldyBBcnJheSgpOwoJfQoJaWYoIWRkLnJlY3RJWzBdKQoJewoJCWZvcihkX2kgPSA0OyBkX2k7KQoJCXsKCQkJKGRkLnJlY3RJWy0tZF9pXSA9IG5ldyBMYXllcigxKSkuYmdDb2xvciA9ICcjMDAwMDAwJzsKCQkJKGRkLnJlY3RBW2RfaV0gPSBuZXcgTGF5ZXIoMSkpLmJnQ29sb3IgPSAnI2ZmZmZmZic7CgkJfQoJfQoJaWYoIWRkLnJlY3RJWzBdLnZpc2liaWxpdHkgfHwgZGQucmVjdElbMF0udmlzaWJpbGl0eSA9PSAnaGlkZScpIGRkLm40UmVjdFZpcygxKTsKCWRkLm9iai53ID0gZF93OwoJZGQub2JqLmggPSBkX2g7Cglmb3IoZF9pID0gNDsgZF9pOykKCXstLWRfaTsKCQlkZC5uNFJlY3RQb3MoZGQucmVjdElbZF9pXSwgZGQub2JqLnggKyAoIShkX2ktMSk/IChkZC5vYmoudy0xKSA6IDApLCBkZC5vYmoueSArICghKGRfaS0yKT8gKGRkLm9iai5oLTEpIDogMCksIGRfaSYxIHx8IGRkLm9iai53LCAhKGRfaSYxKSB8fCBkZC5vYmouaCk7CgkJZGQubjRSZWN0UG9zKGRkLnJlY3RBW2RfaV0sICEoZF9pLTEpPyBkZC5yZWN0SVsxXS54KzEgOiAoZGQub2JqLngtMSksICEoZF9pLTIpPyBkZC5yZWN0SVsyXS55KzEgOiAoZGQub2JqLnktMSksIGRfaSYxIHx8IGRkLm9iai53KzIsICEoZF9pJjEpIHx8IGRkLm9iai5oKzIpOwoJfQp9OwpkZC5yZXN6VG8gPSBmdW5jdGlvbihkX3csIGRfaCkKewoJaWYoZGQubjQgJiYgZGQub2JqLmlzX2ltYWdlKSBkZC5uNFJlY3QoZF93LCBkX2gpOwoJZWxzZSBkZC5vYmoucmVzaXplVG8oZF93LCBkX2gpOwp9OwpkZC5lbWJlZFZpcyA9IGZ1bmN0aW9uKGRfdmlzKQp7Cgl2YXIgZF9vID0gbmV3IEFycmF5KCdpZnJhbWUnLCAnYXBwbGV0JywgJ2VtYmVkJywgJ29iamVjdCcpOwoJZm9yKHZhciBkX2kgPSBkX28ubGVuZ3RoOyBkX2k7KQoJey0tZF9pOwoJCXZhciBkX3AgPSBkZC5pZT8gZG9jdW1lbnQuYWxsLnRhZ3MoZF9vW2RfaV0pIDogZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWU/IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGRfb1tkX2ldKSA6IG51bGw7CgkJaWYoZF9wKQoJCXsKCQkJZm9yKHZhciBkX2ogPSBkX3AubGVuZ3RoOyBkX2o7KQoJCQl7CgkJCQl2YXIgZF9xID0gZF9wWy0tZF9qXTsKCQkJCXdoaWxlKGRfcS5vZmZzZXRQYXJlbnQgfHwgZF9xLnBhcmVudE5vZGUpCgkJCQl7CgkJCQkJaWYoKGRfcSA9IGRfcS5wYXJlbnROb2RlIHx8IGRfcS5vZmZzZXRQYXJlbnQgfHwgbnVsbCkgPT0gZGQub2JqLmRpdikKCQkJCQl7CgkJCQkJCWRfcFtkX2pdLnN0eWxlLnZpc2liaWxpdHkgPSBkX3ZpczsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKZGQubWF4T2ZmWCA9IGZ1bmN0aW9uKGRfeCwgZF95KQp7CglyZXR1cm4oCgkJKGRkLm9iai5tYXhvZmZsKzEgJiYgKGRfeSA9IGRkLm9iai5kZWZ4LWRkLm9iai5tYXhvZmZsKS1kX3ggPiAwCgkJfHwgZGQub2JqLm1heG9mZnIrMSAmJiAoZF95ID0gZGQub2JqLmRlZngrZGQub2JqLm1heG9mZnIpLWRfeCA8IDApPyBkX3kKCQk6IGRfeAoJKTsKfTsKZGQubWF4T2ZmWSA9IGZ1bmN0aW9uKGRfeCwgZF95KQp7CglyZXR1cm4oCgkJKGRkLm9iai5tYXhvZmZ0KzEgJiYgKGRfeSA9IGRkLm9iai5kZWZ5LWRkLm9iai5tYXhvZmZ0KS1kX3ggPiAwCgkJfHwgZGQub2JqLm1heG9mZmIrMSAmJiAoZF95ID0gZGQub2JqLmRlZnkrZGQub2JqLm1heG9mZmIpLWRfeCA8IDApPyBkX3kKCQk6IGRfeAoJKTsKfTsKZGQuaW5XbmRXID0gZnVuY3Rpb24oZF94LCBkX3kpCnsKCXZhciBkX3d4ID0gZGQuZ2V0U2Nyb2xsWCgpLAoJZF93dyA9IGRkLmdldFduZFcoKTsKCXJldHVybigKCQkoKGRfeSA9IGRfd3grMiktZF94ID4gMCkgfHwgKChkX3kgPSBkX3d4K2Rfd3crZGQub2JqLnctMiktZF94IDwgMCk/IGRfeQoJCTogZF94CgkpOwp9OwpkZC5pblduZEggPSBmdW5jdGlvbihkX3gsIGRfeSkKewoJdmFyIGRfd3kgPSBkZC5nZXRTY3JvbGxZKCksCglkX3doID0gZGQuZ2V0V25kSCgpOwoJcmV0dXJuKAoJCSgoZF95ID0gZF93eSsyKS1kX3ggPiAwKSB8fCAoKGRfeSA9IGRfd3krZF93aCtkZC5vYmouaC0yKS1kX3ggPCAwKT8gZF95CgkJOiBkX3gKCSk7Cn07Ci8vIFRoZXNlIHR3byBmdW5jcyBsaW1pdCB0aGUgc2l6ZSBvZiBlbGVtZW50IHdoZW4gbW91c2VyZXNpemVkLgovLyBJbXBsZW1lbnRlZCAyMi41LjIwMDMgYnkgR3JlZ29yIEx0b2xmLCBtb2RpZmllZCBieSBXYWx0ZXIgWm9ybgpkZC5saW1XID0gZnVuY3Rpb24oZF93KQp7CglyZXR1cm4oCgkJKGRkLm9iai5taW53LWRfdyA+IDApPyBkZC5vYmoubWludwoJCTogKGRkLm9iai5tYXh3ID4gMCAmJiBkZC5vYmoubWF4dy1kX3cgPCAwKT8gZGQub2JqLm1heHcKCQk6IGRfdwoJKTsKfTsKZGQubGltSCA9IGZ1bmN0aW9uKGRfaCkKewoJcmV0dXJuKAoJCShkZC5vYmoubWluaC1kX2ggPiAwKT8gZGQub2JqLm1pbmgKCQk6IChkZC5vYmoubWF4aCA+IDAgJiYgZGQub2JqLm1heGgtZF9oIDwgMCk/IGRkLm9iai5tYXhoCgkJOiBkX2gKCSk7Cn07Ci8vIE9wdGlvbmFsIGF1dG9zY3JvbGwtcGFnZSBmdW5jdGlvbmFsaXR5LiBDb3VydGVzeSBDZWRyaWMgU2F2YXJlc2UuCi8vIE1vZGlmaWVkIGJ5IFdhbHRlciBab3JuLgpmdW5jdGlvbiBERFNjcm9sbCgpCnsKCWlmKCFkZC5vYmogfHwgIWRkLm9iai5zY3JvbGwgJiYgIWRkLnNjcm9sbCB8fCBkZC5pZTQgfHwgZGQud2hyYXRpbykKCXsKCQlkZC5zY3J4ID0gZGQuc2NyeSA9IDA7CgkJcmV0dXJuOwoJfQoJdmFyIGRfYm5kID0gMHgxYywKCWRfd3ggPSBkZC5nZXRTY3JvbGxYKCksIGRfd3kgPSBkZC5nZXRTY3JvbGxZKCk7CglpZihkZC5tc21vdmVkKQoJewoJCXZhciBkX3d3ID0gZGQuZ2V0V25kVygpLCBkX3doID0gZGQuZ2V0V25kSCgpLCBkX3k7CgkJZGQuc2NyeCA9ICgoZF95ID0gZGQuZS54LWRfd3ctZF93eCtkX2JuZCkgPiAwKT8gKGRfeT4+PTIpKmRfeQoJCQk6ICgoZF95ID0gZF93eCtkX2JuZC1kZC5lLngpID4gMCk/IC0oZF95Pj49MikqZF95CgkJCTogMDsKCQlkZC5zY3J5ID0gKChkX3kgPSBkZC5lLnktZF93aC1kX3d5K2RfYm5kKSA+IDApPyAoZF95Pj49MikqZF95CgkJCTogKChkX3kgPSBkX3d5K2RfYm5kLWRkLmUueSkgPiAwKT8gLShkX3k+Pj0yKSpkX3kKCQkJOiAwOwoJfQoJaWYoZGQuc2NyeCB8fCBkZC5zY3J5KQoJewoJCXdpbmRvdy5zY3JvbGxUbygKCQkJZF93eCArIChkZC5zY3J4ID0gZGQub2JqLmlzX3Jlc2l6ZWQ/IGRkLmxpbVcoZGQub2JqLncrZGQuc2NyeCktZGQub2JqLncgOiBkZC5vYmoudmVydGljYWw/IDAgOiAoZGQubWF4T2ZmWChkZC5vYmoueCtkZC5zY3J4KS1kZC5vYmoueCkpLAoJCQlkX3d5ICsgKGRkLnNjcnkgPSBkZC5vYmouaXNfcmVzaXplZD8gZGQubGltSChkZC5vYmouaCtkZC5zY3J5KS1kZC5vYmouaCA6IGRkLm9iai5ob3Jpem9udGFsPyAwIDogKGRkLm1heE9mZlkoZGQub2JqLnkrZGQuc2NyeSktZGQub2JqLnkpKQoJCSk7CgkJZGQub2JqLmlzX2RyYWdnZWQ/IGRkLm9iai5tb3ZlVG8oZGQub2JqLngrZGQuZ2V0U2Nyb2xsWCgpLWRfd3gsIGRkLm9iai55K2RkLmdldFNjcm9sbFkoKS1kX3d5KQoJCQk6IGRkLnJlc3pUbyhkZC5vYmoudytkZC5nZXRTY3JvbGxYKCktZF93eCwgZGQub2JqLmgrZGQuZ2V0U2Nyb2xsWSgpLWRfd3kpOwoJfQoJZGQubXNtb3ZlZCA9IDA7Cgl3aW5kb3cuc2V0VGltZW91dCgnRERTY3JvbGwoKScsIDB4MzMpOwp9CmZ1bmN0aW9uIFBJQ0soZF9ldikKewoJZGQuZSA9IG5ldyBkZC5ldnQoZF9ldik7CglpZihkZC5lLnggPj0gZGQuZ2V0V25kVygpK2RkLmdldFNjcm9sbFgoKSB8fCBkZC5lLnkgPj0gZGQuZ2V0V25kSCgpK2RkLmdldFNjcm9sbFkoKSkgcmV0dXJuIHRydWU7IC8vIG9uIHNjcm9sbGJhcgoJZm9yKHZhciBkX28sIGRfdCwgZF9jbXAgPSAtMSwgZF9pID0gZGQuZWxlbWVudHMubGVuZ3RoOyBkX2k7KQoJewoJCWRfbyA9IGRkLmVsZW1lbnRzWy0tZF9pXTsKCQlpZihkZC5uNCAmJiBkZC5lLmJ1dCA+IDEgJiYgZGQuZS5zcmMgPT0gZF9vLm9pbWcgJiYgIWRfby5jbG9uZSkgcmV0dXJuIGZhbHNlOwoJCWlmKGRfby52aXNpYmxlICYmIGRkLmUuYnV0IDw9IDEgJiYgZGQuZS54ID49IGRfby54ICYmIGRkLmUueCA8PSBkX28ueCtkX28udyAmJiBkZC5lLnkgPj0gZF9vLnkgJiYgZGQuZS55IDw9IGRfby55K2Rfby5oKQoJCXsKCQkJaWYoZF9vLnogPiBkX2NtcCAmJiAoZF90ID0gZGQuZS5zcmMudGFnKS5pbmRleE9mKCdpbnB1JykgPCAwICYmIGRfdC5pbmRleE9mKCd0ZXh0YScpIDwgMCAmJiBkX3QuaW5kZXhPZignc2VsZScpIDwgMCAmJiBkX3QuaW5kZXhPZignb3B0aScpIDwgMCAmJiBkX3QuaW5kZXhPZignc2Nyb2wnKSA8IDApCgkJCXsKCQkJCWRfY21wID0gZF9vLno7CgkJCQlkZC5vYmogPSBkX287CgkJCX0KCQl9Cgl9CglpZihkZC5vYmopCgl7CgkJaWYoZGQub2JqLm5vZHJhZykgZGQub2JqID0gbnVsbDsKCQllbHNlCgkJewoJCQlkZC5lLmUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKCQkJdmFyIGRfcnN6ID0gZGQuZS5tb2RpZktleSAmJiAoZGQub2JqLnJlc2l6YWJsZSB8fCBkZC5vYmouc2NhbGFibGUpOwoJCQlpZihkZC5vcCkKCQkJewoJCQkJKGRfbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdPcEJsVXInKSkuc3R5bGUucGl4ZWxMZWZ0ID0gZGQuZS54OwoJCQkJZF9vLnN0eWxlLnBpeGVsVG9wID0gZGQuZS55OwoJCQkJKGRfbyA9IGRfby5jaGlsZHJlblswXS5jaGlsZHJlblswXSkuZm9jdXMoKTsKCQkJCWRfby5ibHVyKCk7CgkJCX0KCQkJZWxzZSBpZihkZC5pZSAmJiAhZGQuaWU0KQoJCQl7CgkJCQlpZihkb2N1bWVudC5zZWxlY3Rpb24gJiYgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KSBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKCQkJCWRkLmRiLm9uc2VsZWN0c3RhcnQgPSBmdW5jdGlvbigpCgkJCQl7CgkJCQkJZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKCQkJCX07CgkJCX0KCQkJaWYoZF9yc3opCgkJCXsKCQkJCWRkLm9iai5fc2V0Q3JzKCdzZS1yZXNpemUnKTsKCQkJCWRkLm9iai5pc19yZXNpemVkID0gMTsKCQkJCWRkLndocmF0aW8gPSBkZC5vYmouc2NhbGFibGU/IGRkLm9iai5kZWZ3L2RkLm9iai5kZWZoIDogMDsKCQkJCWlmKGRkLmllKQoJCQkJewoJCQkJCWlmKGRkLmllNCkKCQkJCQl7CgkJCQkJCXdpbmRvdy5kZF94ID0gZGQuZ2V0U2Nyb2xsWCgpOwoJCQkJCQl3aW5kb3cuZGRfeSA9IGRkLmdldFNjcm9sbFkoKTsKCQkJCQl9CgkJCQkJc2V0VGltZW91dCgKCQkJCQkJJ2lmKGRkLm9iaiAmJiBkb2N1bWVudC5zZWxlY3Rpb24gJiYgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KScrCgkJCQkJCSd7JysKCQkJCQkJCSdkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsnKwoJCQkJCQkJJ2lmKGRkLmllNCkgd2luZG93LnNjcm9sbFRvKHdpbmRvdy5kZF94LCB3aW5kb3cuZGRfeSk7JysKCQkJCQkJJ30nCgkJCQkJLDApOwoJCQkJfQoJCQkJZGQuc2V0TW92SGRsKFJFU0laRSk7CgkJCQlkZC5yZXN6VG8oZGQub2JqLncsIGRkLm9iai5oKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRkLm9iai5pc19kcmFnZ2VkID0gMTsKCQkJCWRkLnNldE1vdkhkbChEUkFHKTsKCQkJfQoJCQlkZC5zZXRVcEhkbChEUk9QKTsKCQkJZGQuZW1iZWRWaXMoJ2hpZGRlbicpOwoJCQlkZC5vYmouX3NldE9wYVJlbCgwLjcpOwoJCQlkZC5vYmoubWF4aW1pemVaKCk7CgkJCWRkLm9meCA9IGRkLm9iai54K2RkLm9iai53LWRkLmUueDsKCQkJZGQub2Z5ID0gZGQub2JqLnkrZGQub2JqLmgtZGQuZS55OwoJCQlpZih3aW5kb3cubXlfUGlja0Z1bmMpIG15X1BpY2tGdW5jKCk7CgkJCWlmKGRkLm9iai5waWNrRnVuYykgZGQub2JqLnBpY2tGdW5jKCk7CgkJCUREU2Nyb2xsKCk7CgkJCXJldHVybiAhKAoJCQkJZGQub2JqLmlzX3Jlc2l6ZWQKCQkJCXx8IGRkLm40ICYmIGRkLm9iai5pc19pbWFnZQoJCQkJfHwgZGQubjYgfHwgZGQudzNjCgkJCSk7CgkJfQoJfQoJaWYoZGQuZG93bkZ1bmMpIHJldHVybiBkZC5kb3duRnVuYyhkX2V2KTsKCXJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIERSQUcoZF9ldikKewoJaWYoIWRkLm9iaiB8fCAhZGQub2JqLnZpc2libGUpIHJldHVybiB0cnVlOwoJaWYoZGQuaWU0IHx8IGRkLnczYyB8fCBkZC5uNiB8fCBkZC5vYmouY2hpbGRyZW4ubGVuZ3RoID4gMHhmKQoJewoJCWlmKGRkLndhaXQpIHJldHVybiBmYWxzZTsKCQlkZC53YWl0ID0gMTsKCQlzZXRUaW1lb3V0KCdkZC53YWl0ID0gMDsnLCBkZC50V2FpdCk7Cgl9CglkZC5lID0gbmV3IGRkLmV2dChkX2V2KTsKCWlmKGRkLmllICYmICFkZC5lLmJ1dCkKCXsKCQlEUk9QKGRfZXYpOwoJCXJldHVybiB0cnVlOwoJfQoJZGQubXNtb3ZlZCA9IDE7CglkZC5vYmoubW92ZVRvKAoJCWRkLm9iai52ZXJ0aWNhbD8gZGQub2JqLnggOiBkZC5tYXhPZmZYKGRkLmluV25kVyhkZC5vZngrZGQuZS54KS1kZC5vYmoudyksCgkJZGQub2JqLmhvcml6b250YWw/IGRkLm9iai55IDogZGQubWF4T2ZmWShkZC5pblduZEgoZGQub2Z5K2RkLmUueSktZGQub2JqLmgpCgkpOwoKCWlmKHdpbmRvdy5teV9EcmFnRnVuYykgbXlfRHJhZ0Z1bmMoKTsKCWlmKGRkLm9iai5kcmFnRnVuYykgZGQub2JqLmRyYWdGdW5jKCk7CglpZihkZC5tb3ZlRnVuYykgcmV0dXJuIGRkLm1vdmVGdW5jKGRfZXYpOwoJcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIFJFU0laRShkX2V2KQp7CglpZighZGQub2JqIHx8ICFkZC5vYmoudmlzaWJsZSkgcmV0dXJuIHRydWU7CglpZihkZC53YWl0KSByZXR1cm4gZmFsc2U7CglkZC53YWl0ID0gMTsKCXNldFRpbWVvdXQoJ2RkLndhaXQgPSAwOycsIGRkLnRXYWl0KTsKCWRkLmUgPSBuZXcgZGQuZXZ0KGRfZXYpOwoJaWYoZGQuaWUgJiYgIWRkLmUuYnV0KQoJewoJCURST1AoZF9ldik7CgkJcmV0dXJuIHRydWU7Cgl9CglkZC5tc21vdmVkID0gMTsKCXZhciBkX3cgPSBkZC5saW1XKGRkLmluV25kVyhkZC5vZngrZGQuZS54KS1kZC5vYmoueCksIGRfaDsKCWlmKCFkZC53aHJhdGlvKSBkX2ggPSBkZC5saW1IKGRkLmluV25kSChkZC5vZnkrZGQuZS55KS1kZC5vYmoueSk7CgllbHNlCgl7CgkJZF9oID0gZGQubGltSChkZC5pblduZEgoTWF0aC5yb3VuZChkX3cvZGQud2hyYXRpbykrZGQub2JqLnkpLWRkLm9iai55KTsKCQlkX3cgPSBNYXRoLnJvdW5kKGRfaCpkZC53aHJhdGlvKTsKCX0KCWRkLnJlc3pUbyhkX3csIGRfaCk7CglpZih3aW5kb3cubXlfUmVzaXplRnVuYykgbXlfUmVzaXplRnVuYygpOwoJaWYoZGQub2JqLnJlc2l6ZUZ1bmMpIGRkLm9iai5yZXNpemVGdW5jKCk7CglpZihkZC5tb3ZlRnVuYykgcmV0dXJuIGRkLm1vdmVGdW5jKGRfZXYpOwoJcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIERST1AoZF9ldikKewoJaWYoZGQub2JqKQoJewoJCWlmKGRkLm9iai5pc19kcmFnZ2VkKQoJCXsKCQkJaWYoIWRkLm9iai5pc19pbWFnZSkgZGQuZ2V0V0goZGQub2JqKTsKCQl9CgkJZWxzZSBpZihkZC5uNCkKCQl7CgkJCWlmKGRkLm9iai5pc19pbWFnZSkKCQkJewoJCQkJZGQubjRSZWN0VmlzKDApOwoJCQkJZGQub2JqLnJlc2l6ZVRvKGRkLm9iai53LCBkZC5vYmouaCk7CgkJCX0KCQl9CgkJaWYoIWRkLm40IHx8ICFkZC5vYmouaXNfaW1hZ2UpIGRkLnJlY2FsYygpOwoJCWRkLnNldE1vdkhkbChkZC5tb3ZlRnVuYyk7CgkJZGQuc2V0VXBIZGwoZGQudXBGdW5jKTsKCQlpZihkZC5kYikgZGQuZGIub25zZWxlY3RzdGFydCA9IG51bGw7CgkJZGQub2JqLl9zZXRPcGFSZWwoMS4wKTsKCQlkZC5vYmouX3NldENycyhkZC5vYmouY3Vyc29yKTsKCQlkZC5lbWJlZFZpcygndmlzaWJsZScpOwoJCWRkLm9iai5fcmVzZXRaKCk7CgkJZGQuZSA9IG5ldyBkZC5ldnQoZF9ldik7CgkJaWYod2luZG93Lm15X0Ryb3BGdW5jKSBteV9Ecm9wRnVuYygpOwoJCWlmKGRkLm9iai5kcm9wRnVuYykgZGQub2JqLmRyb3BGdW5jKCk7CgkJZGQubXNtb3ZlZCA9IGRkLm9iai5pc19kcmFnZ2VkID0gZGQub2JqLmlzX3Jlc2l6ZWQgPSBkZC53aHJhdGlvID0gMDsKCQlkZC5vYmogPSBudWxsOwoJfQoJZGQuc2V0RHduSGRsKFBJQ0spOwp9CmZ1bmN0aW9uIFNFVF9ESFRNTCgpCnsKCXZhciBkX2EgPSBhcmd1bWVudHMsIGRfYWksIGRfaHRtID0gJycsIGRfbywgZF9pID0gZF9hLmxlbmd0aDsKCXdoaWxlKGRfaSkKCXsKCQlpZighKGRfYWkgPSBkX2FbLS1kX2ldKS5pbmRleE9mKCdjOicpKSBkZC5jdXJzb3IgPSBkX2FpLnN1YnN0cmluZygyKTsKCQllbHNlIGlmKGRfYWkgPT0gTk9fQUxUKSBkZC5ub2FsdCA9IDE7CgkJZWxzZSBpZihkX2FpID09IFNDUk9MTCkgZGQuc2Nyb2xsID0gMTsKCQllbHNlIGlmKGRfYWkgPT0gUkVTRVRfWikgZGQucmVfeiA9IDE7CgkJZWxzZSBpZihkX2FpID09IFJFU0laQUJMRSkgZGQucmVzaXphYmxlID0gMTsKCQllbHNlIGlmKGRfYWkgPT0gU0NBTEFCTEUpIGRkLnNjYWxhYmxlID0gMTsKCQllbHNlIGlmKGRfYWkgPT0gVFJBTlNQQVJFTlQpIGRkLmRpYXBoYW4gPSAxOwoJCWVsc2UKCQl7CgkJCWRfbyA9IG5ldyBERE9iaihkX2FpKTsKCQkJZGQuYWRkRWx0KGRfbyk7CgkJCWRfaHRtICs9IGRfby50X2h0bSB8fCAnJzsKCQkJaWYoZF9vLm9pbWcgJiYgZF9vLmNweV9uKQoJCQl7CgkJCQlmb3IodmFyIGRfbCA9IGRfby5jcHlfbiwgZF9qID0gMDsgZF9qIDwgZF9sOykKCQkJCXsKCQkJCQl2YXIgZF9wID0gbmV3IERET2JqKGRfby5uYW1lK2Rfby5jbWQsICsrZF9qKTsKCQkJCQlkZC5hZGRFbHQoZF9wLCBkX28pOwoJCQkJCWRfcC5kZWZ6ID0gZF9vLmRlZnorZF9qOwoJCQkJCWRfcC5vcmlnaW5hbCA9IGRfbzsKCQkJCQlkX2h0bSArPSBkX3AudF9odG07CgkJCQl9CgkJCX0KCQl9Cgl9CglpZiAoZGQubjQgfHwgZGQubjYgfHwgZGQuaWUgfHwgZGQub3AgfHwgZGQudzNjKSBkb2N1bWVudC53cml0ZSgKCQkoZGQubjQ/ICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsiPjxcL2Rpdj5cbicKCQk6IChkZC5vcCAmJiAhZGQub3A2KT8gJzxkaXYgaWQ9Ik9wQmxVciIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3Zpc2liaWxpdHk6aGlkZGVuO3dpZHRoOjBweDtoZWlnaHQ6MHB4OyI+PGZvcm0+PGlucHV0IHR5cGU9InRleHQiIHN0eWxlPSJ3aWR0aDowcHg7aGVpZ2h0OjBweDsiPjxcL2Zvcm0+PFwvZGl2PicKCQk6ICcnKSArIGRfaHRtCgkpOwoJZGQueiA9IDB4MzM7Cglmb3IoZF9pID0gZGQuZWxlbWVudHMubGVuZ3RoOyBkX2k7KQoJewoJCWRkLmFkZFByb3BzKGRfbyA9IGRkLmVsZW1lbnRzWy0tZF9pXSk7CgkJaWYoZF9vLmlzX2ltYWdlICYmICFkX28ub3JpZ2luYWwgJiYgIWRfby5jbG9uZSkKCQkJZGQubjQ/IGRfby5vaW1nLnNyYyA9IHNwYWNlciA6IGRfby5vaW1nLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKCX0KCWRkLm1rV3pEb20oKTsKCWlmKHdpbmRvdy5vbmxvYWQpIGRkLmxvYWRGdW5jID0gd2luZG93Lm9ubG9hZDsKCWlmKHdpbmRvdy5vbnVubG9hZCkgZGQudWxvYWRGdW5jID0gd2luZG93Lm9udW5sb2FkOwoJd2luZG93Lm9ubG9hZCA9IGRkLmluaXR6OwoJd2luZG93Lm9udW5sb2FkID0gZGQuZmlubHo7CglkZC5zZXREd25IZGwoUElDSyk7Cn0KZnVuY3Rpb24gQUREX0RIVE1MKCkgLy8gbGF5ZXJzIG9ubHkhCnsKCXZhciBkX2EgPSBhcmd1bWVudHMsIGRfbywgZF9pID0gZF9hLmxlbmd0aDsgd2hpbGUoZF9pKQoJewoJCWRfbyA9IG5ldyBERE9iaihkX2FbLS1kX2ldKTsKCQlkZC5hZGRFbHQoZF9vKTsKCQlkZC5hZGRQcm9wcyhkX28pOwoJfQoJZGQubWtXekRvbSgpOwp9CgoKCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gSWYgbm90IG5lZWRlZCwgYWxsIGNvZGUgYmVsb3cgdGhpcyBsaW5lIG1heSBiZSByZW1vdmVkCgoKLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKZGQuZCA9IGRvY3VtZW50OwkJCS8vIDwgdi4gMi43Mgp2YXIgUkVTRVRfWklOREVYID0gUkVTRVRfWjsgLy8gPCAzLjQ0CnZhciBLRVlET1dOX1JFU0laRSA9IFJFU0laQUJMRTsgLy8gPCA0LjQzCnZhciBDVVJTT1JfUE9JTlRFUiA9IENVUlNPUl9IQU5EOyAvLyA8IDQuNDQKdmFyIE5PX1NDUk9MTCA9ICcnOwkJIC8vIDwgdi4gNC40OQoKCgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIEZVTkNUSU9OUyBGT1IgRVhURU5ERUQgU0NSSVBUSU5HCi8vIFVzZSB0aGVzZSBmb3IgeW91ciBvd24gZXh0ZW5zaW9ucywKLy8gb3IgdG8gY2FsbCBmdW5jdGlvbnMgZGVmaW5lZCBlbHNld2hlcmUKCgoKLyogbXlfUGlja0Z1bmMgSVMgQVVUT01BVElDQUxMWSBDQUxMRUQgV0hFTiBBTiBJVEVNIFNUQVJUUyBUTyBCRSBEUkFHR0VELgpUaGUgZm9sbG93aW5nIG9iamVjdHMvcHJvcGVydGllcyBhcmUgYWNjZXNzaWJsZSBmcm9tIGhlcmU6CgotIGRkLmU6IGN1cnJlbnQgbW91c2UgZXZlbnQKLSBkZC5lLnByb3BlcnR5OiBhY2Nlc3MgdG8gYSBwcm9wZXJ0eSBvZiB0aGUgY3VycmVudCBtb3VzZSBldmVudC4KICBNb3N0bHkgcmVxdWVzdGVkIHByb3BlcnRpZXM6CiAgLSBkZC5lLng6IGRvY3VtZW50LXJlbGF0ZWQgeCBjby1vcmRpbmF0ZQogIC0gZGQuZS55OiBkb2N1bWVudC1yZWxhdGVkIHkgY28tb3JkCiAgLSBkZC5lLnNyYzogdGFyZ2V0IG9mIG1vdXNlIGV2ZW50IChub3QgaWRlbnRpY2FsIHdpdGggdGhlIGRyYWcgZHJvcCBvYmplY3QgaXRzZWxmKS4KICAtIGRkLmUuYnV0dG9uOiBjdXJyZW50bHkgcHJlc3NlZCBtb3VzZSBidXR0b24uIExlZnQgYnV0dG9uOiBkZC5lLmJ1dHRvbiA8PSAxCgotIGRkLm9iajogcmVmZXJlbmNlIHRvIGN1cnJlbnRseSBkcmFnZ2VkIGl0ZW0uCi0gZGQub2JqLnByb3BlcnR5OiBhY2Nlc3MgdG8gYW55IHByb3BlcnR5IG9mIHRoYXQgaXRlbS4KLSBkZC5vYmoubWV0aG9kKCk6IGZvciBleGFtcGxlIGRkLm9iai5yZXNpemVUbygpIG9yIGRkLm9iai5zd2FwSW1hZ2UoKSAuCiAgTW9zdGx5IHJlcXVlc3RlZCBwcm9wZXJ0aWVzOgoJLSBkZC5vYmoubmFtZTogaW1hZ2UgbmFtZSBvciBsYXllciBJRCBwYXNzZWQgdG8gU0VUX0RIVE1MKCk7CgktIGRkLm9iai54IGFuZCBkZC5vYmoueTogY28tb3JkaW5hdGVzOwoJLSBkZC5vYmoudyBhbmQgZGQub2JqLmg6IHNpemU7CgktIGRkLm9iai5pc19kcmFnZ2VkOiAxIHdoaWxlIGl0ZW0gaXMgZHJhZ2dlZCwgZWxzZSAwOwoJLSBkZC5vYmouaXNfcmVzaXplZDogMSB3aGlsZSBpdGVtIGlzIHJlc2l6ZWQsIGkuZS4gaWYgPGN0cmw+IG9yIDxzaGlmdD4gaXMgcHJlc3NlZCwgZWxzZSAwCgpGb3IgbW9yZSBwcm9wZXJ0aWVzIGFuZCBkZXRhaWxzLCB2aXNpdCB0aGUgQVBJIGRvY3VtZW50YXRpb24KYXQgaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmNvbS9kcmFnZHJvcC9hcGlfZS5odG0gKGVuZ2xpc2gpIG9yCmh0dHA6Ly93d3cud2FsdGVyem9ybi5kZS9kcmFnZHJvcC9hcGkuaHRtIChnZXJtYW4pCSovCmZ1bmN0aW9uIG15X1BpY2tGdW5jKCkKewp9CgoKCgovKiBteV9EcmFnRnVuYyBJUyBDQUxMRUQgV0hJTEUgQU4gSVRFTSBJUyBEUkFHR0VEClNlZSB0aGUgZGVzY3JpcHRpb24gb2YgbXlfUGlja0Z1bmMgYWJvdmUgZm9yIHdoYXQncyBhY2Nlc3NpYmxlIGZyb20gaGVyZS4gKi8KZnVuY3Rpb24gbXlfRHJhZ0Z1bmMoKQp7CgkvL3dpbmRvdy5zdGF0dXMgPSAnZGQuZWxlbWVudHMuJyArIGRkLm9iai5uYW1lICsgJy54ICA9ICcgKyBkZC5vYmoueCArICcJIGRkLmVsZW1lbnRzLicgKyBkZC5vYmoubmFtZSArICcueSA9ICcgKyBkZC5vYmoueTsKfQoKCgoKLyogbXlfUmVzaXplRnVuYyBJUyBDQUxMRUQgV0hJTEUgQU4gSVRFTSBJUyBSRVNJWkVEClNlZSB0aGUgZGVzY3JpcHRpb24gb2YgbXlfUGlja0Z1bmMgYWJvdmUgZm9yIHdoYXQncyBhY2Nlc3NpYmxlIGZyb20gaGVyZS4gKi8KZnVuY3Rpb24gbXlfUmVzaXplRnVuYygpCnsKCS8vd2luZG93LnN0YXR1cyA9ICdkZC5lbGVtZW50cy4nICsgZGQub2JqLm5hbWUgKyAnLncgID0gJyArIGRkLm9iai53ICsgJwkgZGQuZWxlbWVudHMuJyArIGRkLm9iai5uYW1lICsgJy5oID0gJyArIGRkLm9iai5oOwp9CgoKCgovKiBUSElTIE9ORSBJUyBDQUxMRUQgT05DRSBBTiBJVEVNIElTIERST1BQRUQKU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBteV9QaWNrRnVuYyBmb3Igd2hhdCdzIGFjY2Vzc2libGUgZnJvbSBoZXJlLgpIZXJlIG1heSBiZSBpbnZlc3RpZ2F0ZWQsIGZvciBleGFtcGxlLCB3aGF0J3MgdGhlIG5hbWUgKGRkLm9iai5uYW1lKQpvZiB0aGUgZHJvcHBlZCBpdGVtLCBhbmQgd2hlcmUgKGRkLm9iai54LCBkZC5vYmoueSkgaXQgaGFzIGJlZW4gZHJvcHBlZC4uLiAqLwpmdW5jdGlvbiBteV9Ecm9wRnVuYygpCnsKfQo='></script>


	<script id="wz_graphics" src='data:/text/plain;base64,LyogVGhpcyBub3RpY2UgbXVzdCBiZSB1bnRvdWNoZWQgYXQgYWxsIHRpbWVzLg0KDQp3el9qc2dyYXBoaWNzLmpzICAgIHYuIDMuMDUNClRoZSBsYXRlc3QgdmVyc2lvbiBpcyBhdmFpbGFibGUgYXQNCmh0dHA6Ly93d3cud2FsdGVyem9ybi5jb20NCm9yIGh0dHA6Ly93d3cuZGV2aXJhLmNvbQ0Kb3IgaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmRlDQoNCkNvcHlyaWdodCAoYykgMjAwMi0yMDA5IFdhbHRlciBab3JuLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KQ3JlYXRlZCAzLiAxMS4gMjAwMiBieSBXYWx0ZXIgWm9ybiAoV2ViOiBodHRwOi8vd3d3LndhbHRlcnpvcm4uY29tICkNCkxhc3QgbW9kaWZpZWQ6IDIuIDIuIDIwMDkNCg0KUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyBmb3IgSW50ZXJuZXQgRXhwbG9yZXINCmJ5IFRob21hcyBGcmFuayBhbmQgSm9obiBIb2xkc3dvcnRoLg0KZmlsbFBvbHlnb24gbWV0aG9kIGltcGxlbWVudGVkIGJ5IE1hdHRoaWV1IEhhbGxlci4NCg0KSGlnaCBQZXJmb3JtYW5jZSBKYXZhU2NyaXB0IEdyYXBoaWNzIExpYnJhcnkuDQpQcm92aWRlcyBtZXRob2RzDQotIHRvIGRyYXcgbGluZXMsIHJlY3RhbmdsZXMsIGVsbGlwc2VzLCBwb2x5Z29ucw0KCXdpdGggc3BlY2lmaWFibGUgbGluZSB0aGlja25lc3MsDQotIHRvIGZpbGwgcmVjdGFuZ2xlcywgcG9seWdvbnMsIGVsbGlwc2VzIGFuZCBhcmNzDQotIHRvIGRyYXcgdGV4dC4NCk5PVEU6IE9wZXJhdGlvbnMsIGZ1bmN0aW9ucyBhbmQgYnJhbmNoaW5nIGhhdmUgcmF0aGVyIGJlZW4gb3B0aW1pemVkDQp0byBlZmZpY2llbmN5IGFuZCBzcGVlZCB0aGFuIHRvIHNob3J0bmVzcyBvZiBzb3VyY2UgY29kZS4NCg0KTElDRU5TRTogTEdQTA0KDQpUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQpMaWNlbnNlIChMR1BMKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyDQp2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCg0KVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQpidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUNCkxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQoNCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCkxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EsDQpvciBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2xlc3Nlci5odG1sDQoqLw0KDQoNCnZhciBqZ19vaywgamdfaWUsIGpnX2Zhc3QsIGpnX2RvbSwgamdfbW96Ow0KDQoNCmZ1bmN0aW9uIF9jaGtESFRNKHduZCwgeCwgaSkNCi8vIFVuZGVyIFhVTCwgb3duZXIgb2YgJ2RvY3VtZW50JyBtdXN0IGJlIHNwZWNpZmllZCBleHBsaWNpdGx5DQp7DQoJeCA9IHduZC5kb2N1bWVudC5ib2R5IHx8IG51bGw7DQoJamdfaWUgPSB4ICYmIHR5cGVvZiB4Lmluc2VydEFkamFjZW50SFRNTCAhPSAidW5kZWZpbmVkIiAmJiB3bmQuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDsNCglqZ19kb20gPSAoeCAmJiAhamdfaWUgJiYNCgkJdHlwZW9mIHguYXBwZW5kQ2hpbGQgIT0gInVuZGVmaW5lZCIgJiYNCgkJdHlwZW9mIHduZC5kb2N1bWVudC5jcmVhdGVSYW5nZSAhPSAidW5kZWZpbmVkIiAmJg0KCQl0eXBlb2YgKGkgPSB3bmQuZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSkuc2V0U3RhcnRCZWZvcmUgIT0gInVuZGVmaW5lZCIgJiYNCgkJdHlwZW9mIGkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50ICE9ICJ1bmRlZmluZWQiKTsNCglqZ19mYXN0ID0gamdfaWUgJiYgd25kLmRvY3VtZW50LmFsbCAmJiAhd25kLm9wZXJhOw0KCWpnX21veiA9IGpnX2RvbSAmJiB0eXBlb2YgeC5zdHlsZS5Nb3pPcGFjaXR5ICE9ICJ1bmRlZmluZWQiOw0KCWpnX29rID0gISEoamdfaWUgfHwgamdfZG9tKTsNCn0NCg0KZnVuY3Rpb24gX3BudENudkRvbSgpDQp7DQoJdmFyIHggPSB0aGlzLnduZC5kb2N1bWVudC5jcmVhdGVSYW5nZSgpOw0KCXguc2V0U3RhcnRCZWZvcmUodGhpcy5jbnYpOw0KCXggPSB4LmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChqZ19mYXN0PyB0aGlzLl9odG1ScGMoKSA6IHRoaXMuaHRtKTsNCglpZih0aGlzLmNudikgdGhpcy5jbnYuYXBwZW5kQ2hpbGQoeCk7DQoJdGhpcy5odG0gPSAiIjsNCn0NCg0KZnVuY3Rpb24gX3BudENudkllKCkNCnsNCglpZih0aGlzLmNudikgdGhpcy5jbnYuaW5zZXJ0QWRqYWNlbnRIVE1MKCJCZWZvcmVFbmQiLCBqZ19mYXN0PyB0aGlzLl9odG1ScGMoKSA6IHRoaXMuaHRtKTsNCgl0aGlzLmh0bSA9ICIiOw0KfQ0KDQpmdW5jdGlvbiBfcG50RG9jKCkNCnsNCgl0aGlzLnduZC5kb2N1bWVudC53cml0ZShqZ19mYXN0PyB0aGlzLl9odG1ScGMoKSA6IHRoaXMuaHRtKTsNCgl0aGlzLmh0bSA9ICcnOw0KfQ0KDQpmdW5jdGlvbiBfcG50TigpDQp7DQoJOw0KfQ0KDQpmdW5jdGlvbiBfbWtEaXYoeCwgeSwgdywgaCkNCnsNCgl0aGlzLmh0bSArPSAnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7JysNCgkJJ2xlZnQ6JyArIHggKyAncHg7JysNCgkJJ3RvcDonICsgeSArICdweDsnKw0KCQknd2lkdGg6JyArIHcgKyAncHg7JysNCgkJJ2hlaWdodDonICsgaCArICdweDsnKw0KCQknY2xpcDpyZWN0KDAsJyt3KydweCwnK2grJ3B4LDApOycrDQoJCSdiYWNrZ3JvdW5kLWNvbG9yOicgKyB0aGlzLmNvbG9yICsNCgkJKCFqZ19tb3o/ICc7b3ZlcmZsb3c6aGlkZGVuJyA6ICcnKSsNCgkJJzsiPjxcL2Rpdj4nOw0KfQ0KDQpmdW5jdGlvbiBfbWtEaXZJZSh4LCB5LCB3LCBoKQ0Kew0KCXRoaXMuaHRtICs9ICclJScrdGhpcy5jb2xvcisnOycreCsnOycreSsnOycrdysnOycraCsnOyc7DQp9DQoNCmZ1bmN0aW9uIF9ta0RpdlBydCh4LCB5LCB3LCBoKQ0Kew0KCXRoaXMuaHRtICs9ICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsnKw0KCQknYm9yZGVyLWxlZnQ6JyArIHcgKyAncHggc29saWQgJyArIHRoaXMuY29sb3IgKyAnOycrDQoJCSdsZWZ0OicgKyB4ICsgJ3B4OycrDQoJCSd0b3A6JyArIHkgKyAncHg7JysNCgkJJ3dpZHRoOjBweDsnKw0KCQknaGVpZ2h0OicgKyBoICsgJ3B4OycrDQoJCSdjbGlwOnJlY3QoMCwnK3crJ3B4LCcraCsncHgsMCk7JysNCgkJJ2JhY2tncm91bmQtY29sb3I6JyArIHRoaXMuY29sb3IgKw0KCQkoIWpnX21vej8gJztvdmVyZmxvdzpoaWRkZW4nIDogJycpKw0KCQknOyI+PFwvZGl2Pic7DQp9DQoNCnZhciBfcmVnZXggPSAgLyUlKFteO10rKTsoW147XSspOyhbXjtdKyk7KFteO10rKTsoW147XSspOy9nOw0KZnVuY3Rpb24gX2h0bVJwYygpDQp7DQoJcmV0dXJuIHRoaXMuaHRtLnJlcGxhY2UoDQoJCV9yZWdleCwNCgkJJzxkaXYgc3R5bGU9Im92ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kLWNvbG9yOicrDQoJCSckMTtsZWZ0OiQycHg7dG9wOiQzcHg7d2lkdGg6JDRweDtoZWlnaHQ6JDVweCI+PC9kaXY+XG4nKTsNCn0NCg0KZnVuY3Rpb24gX2h0bVBydFJwYygpDQp7DQoJcmV0dXJuIHRoaXMuaHRtLnJlcGxhY2UoDQoJCV9yZWdleCwNCgkJJzxkaXYgc3R5bGU9Im92ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kLWNvbG9yOicrDQoJCSckMTtsZWZ0OiQycHg7dG9wOiQzcHg7d2lkdGg6JDRweDtoZWlnaHQ6JDVweDtib3JkZXItbGVmdDokNHB4IHNvbGlkICQxIj48L2Rpdj5cbicpOw0KfQ0KDQpmdW5jdGlvbiBfbWtMaW4oeDEsIHkxLCB4MiwgeTIpDQp7DQoJaWYoeDEgPiB4MikNCgl7DQoJCXZhciBfeDIgPSB4MjsNCgkJdmFyIF95MiA9IHkyOw0KCQl4MiA9IHgxOw0KCQl5MiA9IHkxOw0KCQl4MSA9IF94MjsNCgkJeTEgPSBfeTI7DQoJfQ0KCXZhciBkeCA9IHgyLXgxLCBkeSA9IE1hdGguYWJzKHkyLXkxKSwNCgl4ID0geDEsIHkgPSB5MSwNCgl5SW5jciA9ICh5MSA+IHkyKT8gLTEgOiAxOw0KDQoJaWYoZHggPj0gZHkpDQoJew0KCQl2YXIgcHIgPSBkeTw8MSwNCgkJcHJ1ID0gcHIgLSAoZHg8PDEpLA0KCQlwID0gcHItZHgsDQoJCW94ID0geDsNCgkJd2hpbGUoZHggPiAwKQ0KCQl7LS1keDsNCgkJCSsreDsNCgkJCWlmKHAgPiAwKQ0KCQkJew0KCQkJCXRoaXMuX21rRGl2KG94LCB5LCB4LW94LCAxKTsNCgkJCQl5ICs9IHlJbmNyOw0KCQkJCXAgKz0gcHJ1Ow0KCQkJCW94ID0geDsNCgkJCX0NCgkJCWVsc2UgcCArPSBwcjsNCgkJfQ0KCQl0aGlzLl9ta0RpdihveCwgeSwgeDItb3grMSwgMSk7DQoJfQ0KDQoJZWxzZQ0KCXsNCgkJdmFyIHByID0gZHg8PDEsDQoJCXBydSA9IHByIC0gKGR5PDwxKSwNCgkJcCA9IHByLWR5LA0KCQlveSA9IHk7DQoJCWlmKHkyIDw9IHkxKQ0KCQl7DQoJCQl3aGlsZShkeSA+IDApDQoJCQl7LS1keTsNCgkJCQlpZihwID4gMCkNCgkJCQl7DQoJCQkJCXRoaXMuX21rRGl2KHgrKywgeSwgMSwgb3kteSsxKTsNCgkJCQkJeSArPSB5SW5jcjsNCgkJCQkJcCArPSBwcnU7DQoJCQkJCW95ID0geTsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJeSArPSB5SW5jcjsNCgkJCQkJcCArPSBwcjsNCgkJCQl9DQoJCQl9DQoJCQl0aGlzLl9ta0Rpdih4MiwgeTIsIDEsIG95LXkyKzEpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJd2hpbGUoZHkgPiAwKQ0KCQkJey0tZHk7DQoJCQkJeSArPSB5SW5jcjsNCgkJCQlpZihwID4gMCkNCgkJCQl7DQoJCQkJCXRoaXMuX21rRGl2KHgrKywgb3ksIDEsIHktb3kpOw0KCQkJCQlwICs9IHBydTsNCgkJCQkJb3kgPSB5Ow0KCQkJCX0NCgkJCQllbHNlIHAgKz0gcHI7DQoJCQl9DQoJCQl0aGlzLl9ta0Rpdih4Miwgb3ksIDEsIHkyLW95KzEpOw0KCQl9DQoJfQ0KfQ0KDQpmdW5jdGlvbiBfbWtMaW4yRCh4MSwgeTEsIHgyLCB5MikNCnsNCglpZih4MSA+IHgyKQ0KCXsNCgkJdmFyIF94MiA9IHgyOw0KCQl2YXIgX3kyID0geTI7DQoJCXgyID0geDE7DQoJCXkyID0geTE7DQoJCXgxID0gX3gyOw0KCQl5MSA9IF95MjsNCgl9DQoJdmFyIGR4ID0geDIteDEsIGR5ID0gTWF0aC5hYnMoeTIteTEpLA0KCXggPSB4MSwgeSA9IHkxLA0KCXlJbmNyID0gKHkxID4geTIpPyAtMSA6IDE7DQoNCgl2YXIgcyA9IHRoaXMuc3Ryb2tlOw0KCWlmKGR4ID49IGR5KQ0KCXsNCgkJaWYoZHggPiAwICYmIHMtMyA+IDApDQoJCXsNCgkJCXZhciBfcyA9IChzKmR4Kk1hdGguc3FydCgxK2R5KmR5LyhkeCpkeCkpLWR4LShzPj4xKSpkeSkgLyBkeDsNCgkJCV9zID0gKCEocy00KT8gTWF0aC5jZWlsKF9zKSA6IE1hdGgucm91bmQoX3MpKSArIDE7DQoJCX0NCgkJZWxzZSB2YXIgX3MgPSBzOw0KCQl2YXIgYWQgPSBNYXRoLmNlaWwocy8yKTsNCg0KCQl2YXIgcHIgPSBkeTw8MSwNCgkJcHJ1ID0gcHIgLSAoZHg8PDEpLA0KCQlwID0gcHItZHgsDQoJCW94ID0geDsNCgkJd2hpbGUoZHggPiAwKQ0KCQl7LS1keDsNCgkJCSsreDsNCgkJCWlmKHAgPiAwKQ0KCQkJew0KCQkJCXRoaXMuX21rRGl2KG94LCB5LCB4LW94K2FkLCBfcyk7DQoJCQkJeSArPSB5SW5jcjsNCgkJCQlwICs9IHBydTsNCgkJCQlveCA9IHg7DQoJCQl9DQoJCQllbHNlIHAgKz0gcHI7DQoJCX0NCgkJdGhpcy5fbWtEaXYob3gsIHksIHgyLW94K2FkKzEsIF9zKTsNCgl9DQoNCgllbHNlDQoJew0KCQlpZihzLTMgPiAwKQ0KCQl7DQoJCQl2YXIgX3MgPSAocypkeSpNYXRoLnNxcnQoMStkeCpkeC8oZHkqZHkpKS0ocz4+MSkqZHgtZHkpIC8gZHk7DQoJCQlfcyA9ICghKHMtNCk/IE1hdGguY2VpbChfcykgOiBNYXRoLnJvdW5kKF9zKSkgKyAxOw0KCQl9DQoJCWVsc2UgdmFyIF9zID0gczsNCgkJdmFyIGFkID0gTWF0aC5yb3VuZChzLzIpOw0KDQoJCXZhciBwciA9IGR4PDwxLA0KCQlwcnUgPSBwciAtIChkeTw8MSksDQoJCXAgPSBwci1keSwNCgkJb3kgPSB5Ow0KCQlpZih5MiA8PSB5MSkNCgkJew0KCQkJKythZDsNCgkJCXdoaWxlKGR5ID4gMCkNCgkJCXstLWR5Ow0KCQkJCWlmKHAgPiAwKQ0KCQkJCXsNCgkJCQkJdGhpcy5fbWtEaXYoeCsrLCB5LCBfcywgb3kteSthZCk7DQoJCQkJCXkgKz0geUluY3I7DQoJCQkJCXAgKz0gcHJ1Ow0KCQkJCQlveSA9IHk7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCXkgKz0geUluY3I7DQoJCQkJCXAgKz0gcHI7DQoJCQkJfQ0KCQkJfQ0KCQkJdGhpcy5fbWtEaXYoeDIsIHkyLCBfcywgb3kteTIrYWQpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJd2hpbGUoZHkgPiAwKQ0KCQkJey0tZHk7DQoJCQkJeSArPSB5SW5jcjsNCgkJCQlpZihwID4gMCkNCgkJCQl7DQoJCQkJCXRoaXMuX21rRGl2KHgrKywgb3ksIF9zLCB5LW95K2FkKTsNCgkJCQkJcCArPSBwcnU7DQoJCQkJCW95ID0geTsNCgkJCQl9DQoJCQkJZWxzZSBwICs9IHByOw0KCQkJfQ0KCQkJdGhpcy5fbWtEaXYoeDIsIG95LCBfcywgeTItb3krYWQrMSk7DQoJCX0NCgl9DQp9DQoNCmZ1bmN0aW9uIF9ta0xpbkRvdHQoeDEsIHkxLCB4MiwgeTIpDQp7DQoJaWYoeDEgPiB4MikNCgl7DQoJCXZhciBfeDIgPSB4MjsNCgkJdmFyIF95MiA9IHkyOw0KCQl4MiA9IHgxOw0KCQl5MiA9IHkxOw0KCQl4MSA9IF94MjsNCgkJeTEgPSBfeTI7DQoJfQ0KCXZhciBkeCA9IHgyLXgxLCBkeSA9IE1hdGguYWJzKHkyLXkxKSwNCgl4ID0geDEsIHkgPSB5MSwNCgl5SW5jciA9ICh5MSA+IHkyKT8gLTEgOiAxLA0KCWRydyA9IHRydWU7DQoJaWYoZHggPj0gZHkpDQoJew0KCQl2YXIgcHIgPSBkeTw8MSwNCgkJcHJ1ID0gcHIgLSAoZHg8PDEpLA0KCQlwID0gcHItZHg7DQoJCXdoaWxlKGR4ID4gMCkNCgkJey0tZHg7DQoJCQlpZihkcncpIHRoaXMuX21rRGl2KHgsIHksIDEsIDEpOw0KCQkJZHJ3ID0gIWRydzsNCgkJCWlmKHAgPiAwKQ0KCQkJew0KCQkJCXkgKz0geUluY3I7DQoJCQkJcCArPSBwcnU7DQoJCQl9DQoJCQllbHNlIHAgKz0gcHI7DQoJCQkrK3g7DQoJCX0NCgl9DQoJZWxzZQ0KCXsNCgkJdmFyIHByID0gZHg8PDEsDQoJCXBydSA9IHByIC0gKGR5PDwxKSwNCgkJcCA9IHByLWR5Ow0KCQl3aGlsZShkeSA+IDApDQoJCXstLWR5Ow0KCQkJaWYoZHJ3KSB0aGlzLl9ta0Rpdih4LCB5LCAxLCAxKTsNCgkJCWRydyA9ICFkcnc7DQoJCQl5ICs9IHlJbmNyOw0KCQkJaWYocCA+IDApDQoJCQl7DQoJCQkJKyt4Ow0KCQkJCXAgKz0gcHJ1Ow0KCQkJfQ0KCQkJZWxzZSBwICs9IHByOw0KCQl9DQoJfQ0KCWlmKGRydykgdGhpcy5fbWtEaXYoeCwgeSwgMSwgMSk7DQp9DQoNCmZ1bmN0aW9uIF9ta092KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkNCnsNCgl2YXIgYSA9ICgrK3dpZHRoKT4+MSwgYiA9ICgrK2hlaWdodCk+PjEsDQoJd29kID0gd2lkdGgmMSwgaG9kID0gaGVpZ2h0JjEsDQoJY3ggPSBsZWZ0K2EsIGN5ID0gdG9wK2IsDQoJeCA9IDAsIHkgPSBiLA0KCW94ID0gMCwgb3kgPSBiLA0KCWFhMiA9IChhKmEpPDwxLCBhYTQgPSBhYTI8PDEsIGJiMiA9IChiKmIpPDwxLCBiYjQgPSBiYjI8PDEsDQoJc3QgPSAoYWEyPj4xKSooMS0oYjw8MSkpICsgYmIyLA0KCXR0ID0gKGJiMj4+MSkgLSBhYTIqKChiPDwxKS0xKSwNCgl3LCBoOw0KCXdoaWxlKHkgPiAwKQ0KCXsNCgkJaWYoc3QgPCAwKQ0KCQl7DQoJCQlzdCArPSBiYjIqKCh4PDwxKSszKTsNCgkJCXR0ICs9IGJiNCooKyt4KTsNCgkJfQ0KCQllbHNlIGlmKHR0IDwgMCkNCgkJew0KCQkJc3QgKz0gYmIyKigoeDw8MSkrMykgLSBhYTQqKHktMSk7DQoJCQl0dCArPSBiYjQqKCsreCkgLSBhYTIqKCgoeS0tKTw8MSktMyk7DQoJCQl3ID0geC1veDsNCgkJCWggPSBveS15Ow0KCQkJaWYoKHcmMikgJiYgKGgmMikpDQoJCQl7DQoJCQkJdGhpcy5fbWtPdlFkcyhjeCwgY3ksIHgtMiwgeSsyLCAxLCAxLCB3b2QsIGhvZCk7DQoJCQkJdGhpcy5fbWtPdlFkcyhjeCwgY3ksIHgtMSwgeSsxLCAxLCAxLCB3b2QsIGhvZCk7DQoJCQl9DQoJCQllbHNlIHRoaXMuX21rT3ZRZHMoY3gsIGN5LCB4LTEsIG95LCB3LCBoLCB3b2QsIGhvZCk7DQoJCQlveCA9IHg7DQoJCQlveSA9IHk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQl0dCAtPSBhYTIqKCh5PDwxKS0zKTsNCgkJCXN0IC09IGFhNCooLS15KTsNCgkJfQ0KCX0NCgl3ID0gYS1veCsxOw0KCWggPSAob3k8PDEpK2hvZDsNCgl5ID0gY3ktb3k7DQoJdGhpcy5fbWtEaXYoY3gtYSwgeSwgdywgaCk7DQoJdGhpcy5fbWtEaXYoY3grb3grd29kLTEsIHksIHcsIGgpOw0KfQ0KDQpmdW5jdGlvbiBfbWtPdjJEKGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkNCnsNCgl2YXIgcyA9IHRoaXMuc3Ryb2tlOw0KCXdpZHRoICs9IHMrMTsNCgloZWlnaHQgKz0gcysxOw0KCXZhciBhID0gd2lkdGg+PjEsIGIgPSBoZWlnaHQ+PjEsDQoJd29kID0gd2lkdGgmMSwgaG9kID0gaGVpZ2h0JjEsDQoJY3ggPSBsZWZ0K2EsIGN5ID0gdG9wK2IsDQoJeCA9IDAsIHkgPSBiLA0KCWFhMiA9IChhKmEpPDwxLCBhYTQgPSBhYTI8PDEsIGJiMiA9IChiKmIpPDwxLCBiYjQgPSBiYjI8PDEsDQoJc3QgPSAoYWEyPj4xKSooMS0oYjw8MSkpICsgYmIyLA0KCXR0ID0gKGJiMj4+MSkgLSBhYTIqKChiPDwxKS0xKTsNCg0KCWlmKHMtNCA8IDAgJiYgKCEocy0yKSB8fCB3aWR0aC01MSA+IDAgJiYgaGVpZ2h0LTUxID4gMCkpDQoJew0KCQl2YXIgb3ggPSAwLCBveSA9IGIsDQoJCXcsIGgsDQoJCXB4dzsNCgkJd2hpbGUoeSA+IDApDQoJCXsNCgkJCWlmKHN0IDwgMCkNCgkJCXsNCgkJCQlzdCArPSBiYjIqKCh4PDwxKSszKTsNCgkJCQl0dCArPSBiYjQqKCsreCk7DQoJCQl9DQoJCQllbHNlIGlmKHR0IDwgMCkNCgkJCXsNCgkJCQlzdCArPSBiYjIqKCh4PDwxKSszKSAtIGFhNCooeS0xKTsNCgkJCQl0dCArPSBiYjQqKCsreCkgLSBhYTIqKCgoeS0tKTw8MSktMyk7DQoJCQkJdyA9IHgtb3g7DQoJCQkJaCA9IG95LXk7DQoNCgkJCQlpZih3LTEpDQoJCQkJew0KCQkJCQlweHcgPSB3KzErKHMmMSk7DQoJCQkJCWggPSBzOw0KCQkJCX0NCgkJCQllbHNlIGlmKGgtMSkNCgkJCQl7DQoJCQkJCXB4dyA9IHM7DQoJCQkJCWggKz0gMSsocyYxKTsNCgkJCQl9DQoJCQkJZWxzZSBweHcgPSBoID0gczsNCgkJCQl0aGlzLl9ta092UWRzKGN4LCBjeSwgeC0xLCBveSwgcHh3LCBoLCB3b2QsIGhvZCk7DQoJCQkJb3ggPSB4Ow0KCQkJCW95ID0geTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQl0dCAtPSBhYTIqKCh5PDwxKS0zKTsNCgkJCQlzdCAtPSBhYTQqKC0teSk7DQoJCQl9DQoJCX0NCgkJdGhpcy5fbWtEaXYoY3gtYSwgY3ktb3ksIHMsIChveTw8MSkraG9kKTsNCgkJdGhpcy5fbWtEaXYoY3grYSt3b2QtcywgY3ktb3ksIHMsIChveTw8MSkraG9kKTsNCgl9DQoNCgllbHNlDQoJew0KCQl2YXIgX2EgPSAod2lkdGgtKHM8PDEpKT4+MSwNCgkJX2IgPSAoaGVpZ2h0LShzPDwxKSk+PjEsDQoJCV94ID0gMCwgX3kgPSBfYiwNCgkJX2FhMiA9IChfYSpfYSk8PDEsIF9hYTQgPSBfYWEyPDwxLCBfYmIyID0gKF9iKl9iKTw8MSwgX2JiNCA9IF9iYjI8PDEsDQoJCV9zdCA9IChfYWEyPj4xKSooMS0oX2I8PDEpKSArIF9iYjIsDQoJCV90dCA9IChfYmIyPj4xKSAtIF9hYTIqKChfYjw8MSktMSksDQoNCgkJcHhsID0gbmV3IEFycmF5KCksDQoJCXB4dCA9IG5ldyBBcnJheSgpLA0KCQlfcHhiID0gbmV3IEFycmF5KCk7DQoJCXB4bFswXSA9IDA7DQoJCXB4dFswXSA9IGI7DQoJCV9weGJbMF0gPSBfYi0xOw0KCQl3aGlsZSh5ID4gMCkNCgkJew0KCQkJaWYoc3QgPCAwKQ0KCQkJew0KCQkJCXB4bFtweGwubGVuZ3RoXSA9IHg7DQoJCQkJcHh0W3B4dC5sZW5ndGhdID0geTsNCgkJCQlzdCArPSBiYjIqKCh4PDwxKSszKTsNCgkJCQl0dCArPSBiYjQqKCsreCk7DQoJCQl9DQoJCQllbHNlIGlmKHR0IDwgMCkNCgkJCXsNCgkJCQlweGxbcHhsLmxlbmd0aF0gPSB4Ow0KCQkJCXN0ICs9IGJiMiooKHg8PDEpKzMpIC0gYWE0Kih5LTEpOw0KCQkJCXR0ICs9IGJiNCooKyt4KSAtIGFhMiooKCh5LS0pPDwxKS0zKTsNCgkJCQlweHRbcHh0Lmxlbmd0aF0gPSB5Ow0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCXR0IC09IGFhMiooKHk8PDEpLTMpOw0KCQkJCXN0IC09IGFhNCooLS15KTsNCgkJCX0NCg0KCQkJaWYoX3kgPiAwKQ0KCQkJew0KCQkJCWlmKF9zdCA8IDApDQoJCQkJew0KCQkJCQlfc3QgKz0gX2JiMiooKF94PDwxKSszKTsNCgkJCQkJX3R0ICs9IF9iYjQqKCsrX3gpOw0KCQkJCQlfcHhiW19weGIubGVuZ3RoXSA9IF95LTE7DQoJCQkJfQ0KCQkJCWVsc2UgaWYoX3R0IDwgMCkNCgkJCQl7DQoJCQkJCV9zdCArPSBfYmIyKigoX3g8PDEpKzMpIC0gX2FhNCooX3ktMSk7DQoJCQkJCV90dCArPSBfYmI0KigrK194KSAtIF9hYTIqKCgoX3ktLSk8PDEpLTMpOw0KCQkJCQlfcHhiW19weGIubGVuZ3RoXSA9IF95LTE7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCV90dCAtPSBfYWEyKigoX3k8PDEpLTMpOw0KCQkJCQlfc3QgLT0gX2FhNCooLS1feSk7DQoJCQkJCV9weGJbX3B4Yi5sZW5ndGgtMV0tLTsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQl2YXIgb3ggPSAtd29kLCBveSA9IGIsDQoJCV9veSA9IF9weGJbMF0sDQoJCWwgPSBweGwubGVuZ3RoLA0KCQl3LCBoOw0KCQlmb3IodmFyIGkgPSAwOyBpIDwgbDsgaSsrKQ0KCQl7DQoJCQlpZih0eXBlb2YgX3B4YltpXSAhPSAidW5kZWZpbmVkIikNCgkJCXsNCgkJCQlpZihfcHhiW2ldIDwgX295IHx8IHB4dFtpXSA8IG95KQ0KCQkJCXsNCgkJCQkJeCA9IHB4bFtpXTsNCgkJCQkJdGhpcy5fbWtPdlFkcyhjeCwgY3ksIHgsIG95LCB4LW94LCBveS1fb3ksIHdvZCwgaG9kKTsNCgkJCQkJb3ggPSB4Ow0KCQkJCQlveSA9IHB4dFtpXTsNCgkJCQkJX295ID0gX3B4YltpXTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJeCA9IHB4bFtpXTsNCgkJCQl0aGlzLl9ta0RpdihjeC14LCBjeS1veSwgMSwgKG95PDwxKStob2QpOw0KCQkJCXRoaXMuX21rRGl2KGN4K294K3dvZCwgY3ktb3ksIDEsIChveTw8MSkraG9kKTsNCgkJCQlveCA9IHg7DQoJCQkJb3kgPSBweHRbaV07DQoJCQl9DQoJCX0NCgkJdGhpcy5fbWtEaXYoY3gtYSwgY3ktb3ksIDEsIChveTw8MSkraG9kKTsNCgkJdGhpcy5fbWtEaXYoY3grb3grd29kLCBjeS1veSwgMSwgKG95PDwxKStob2QpOw0KCX0NCn0NCg0KZnVuY3Rpb24gX21rT3ZEb3R0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkNCnsNCgl2YXIgYSA9ICgrK3dpZHRoKT4+MSwgYiA9ICgrK2hlaWdodCk+PjEsDQoJd29kID0gd2lkdGgmMSwgaG9kID0gaGVpZ2h0JjEsIGhvZHUgPSBob2ReMSwNCgljeCA9IGxlZnQrYSwgY3kgPSB0b3ArYiwNCgl4ID0gMCwgeSA9IGIsDQoJYWEyID0gKGEqYSk8PDEsIGFhNCA9IGFhMjw8MSwgYmIyID0gKGIqYik8PDEsIGJiNCA9IGJiMjw8MSwNCglzdCA9IChhYTI+PjEpKigxLShiPDwxKSkgKyBiYjIsDQoJdHQgPSAoYmIyPj4xKSAtIGFhMiooKGI8PDEpLTEpLA0KCWRydyA9IHRydWU7DQoJd2hpbGUoeSA+IDApDQoJew0KCQlpZihzdCA8IDApDQoJCXsNCgkJCXN0ICs9IGJiMiooKHg8PDEpKzMpOw0KCQkJdHQgKz0gYmI0KigrK3gpOw0KCQl9DQoJCWVsc2UgaWYodHQgPCAwKQ0KCQl7DQoJCQlzdCArPSBiYjIqKCh4PDwxKSszKSAtIGFhNCooeS0xKTsNCgkJCXR0ICs9IGJiNCooKyt4KSAtIGFhMiooKCh5LS0pPDwxKS0zKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXR0IC09IGFhMiooKHk8PDEpLTMpOw0KCQkJc3QgLT0gYWE0KigtLXkpOw0KCQl9DQoJCWlmKGRydyAmJiB5ID49IGhvZHUpIHRoaXMuX21rT3ZRZHMoY3gsIGN5LCB4LCB5LCAxLCAxLCB3b2QsIGhvZCk7DQoJCWRydyA9ICFkcnc7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBfbWtSZWN0KHgsIHksIHcsIGgpDQp7DQoJdmFyIHMgPSB0aGlzLnN0cm9rZTsNCgl0aGlzLl9ta0Rpdih4LCB5LCB3LCBzKTsNCgl0aGlzLl9ta0Rpdih4K3csIHksIHMsIGgpOw0KCXRoaXMuX21rRGl2KHgsIHkraCwgdytzLCBzKTsNCgl0aGlzLl9ta0Rpdih4LCB5K3MsIHMsIGgtcyk7DQp9DQoNCmZ1bmN0aW9uIF9ta1JlY3REb3R0KHgsIHksIHcsIGgpDQp7DQoJdGhpcy5kcmF3TGluZSh4LCB5LCB4K3csIHkpOw0KCXRoaXMuZHJhd0xpbmUoeCt3LCB5LCB4K3csIHkraCk7DQoJdGhpcy5kcmF3TGluZSh4LCB5K2gsIHgrdywgeStoKTsNCgl0aGlzLmRyYXdMaW5lKHgsIHksIHgsIHkraCk7DQp9DQoNCmZ1bmN0aW9uIGpzZ0ZvbnQoKQ0Kew0KCXRoaXMuUExBSU4gPSAnZm9udC13ZWlnaHQ6bm9ybWFsOyc7DQoJdGhpcy5CT0xEID0gJ2ZvbnQtd2VpZ2h0OmJvbGQ7JzsNCgl0aGlzLklUQUxJQyA9ICdmb250LXN0eWxlOml0YWxpYzsnOw0KCXRoaXMuSVRBTElDX0JPTEQgPSB0aGlzLklUQUxJQyArIHRoaXMuQk9MRDsNCgl0aGlzLkJPTERfSVRBTElDID0gdGhpcy5JVEFMSUNfQk9MRDsNCn0NCnZhciBGb250ID0gbmV3IGpzZ0ZvbnQoKTsNCg0KZnVuY3Rpb24ganNnU3Ryb2tlKCkNCnsNCgl0aGlzLkRPVFRFRCA9IC0xOw0KfQ0KdmFyIFN0cm9rZSA9IG5ldyBqc2dTdHJva2UoKTsNCg0KZnVuY3Rpb24ganNHcmFwaGljcyhjbnYsIHduZCkNCnsNCgl0aGlzLnNldENvbG9yID0gZnVuY3Rpb24oeCkNCgl7DQoJCXRoaXMuY29sb3IgPSB4LnRvTG93ZXJDYXNlKCk7DQoJfTsNCg0KCXRoaXMuc2V0U3Ryb2tlID0gZnVuY3Rpb24oeCkNCgl7DQoJCXRoaXMuc3Ryb2tlID0geDsNCgkJaWYoISh4KzEpKQ0KCQl7DQoJCQl0aGlzLmRyYXdMaW5lID0gX21rTGluRG90dDsNCgkJCXRoaXMuX21rT3YgPSBfbWtPdkRvdHQ7DQoJCQl0aGlzLmRyYXdSZWN0ID0gX21rUmVjdERvdHQ7DQoJCX0NCgkJZWxzZSBpZih4LTEgPiAwKQ0KCQl7DQoJCQl0aGlzLmRyYXdMaW5lID0gX21rTGluMkQ7DQoJCQl0aGlzLl9ta092ID0gX21rT3YyRDsNCgkJCXRoaXMuZHJhd1JlY3QgPSBfbWtSZWN0Ow0KCQl9DQoJCWVsc2UNCgkJew0KCQkJdGhpcy5kcmF3TGluZSA9IF9ta0xpbjsNCgkJCXRoaXMuX21rT3YgPSBfbWtPdjsNCgkJCXRoaXMuZHJhd1JlY3QgPSBfbWtSZWN0Ow0KCQl9DQoJfTsNCg0KCXRoaXMuc2V0UHJpbnRhYmxlID0gZnVuY3Rpb24oYXJnKQ0KCXsNCgkJdGhpcy5wcmludGFibGUgPSBhcmc7DQoJCWlmKGpnX2Zhc3QpDQoJCXsNCgkJCXRoaXMuX21rRGl2ID0gX21rRGl2SWU7DQoJCQl0aGlzLl9odG1ScGMgPSBhcmc/IF9odG1QcnRScGMgOiBfaHRtUnBjOw0KCQl9DQoJCWVsc2UgdGhpcy5fbWtEaXYgPSBhcmc/IF9ta0RpdlBydCA6IF9ta0RpdjsNCgl9Ow0KDQoJdGhpcy5zZXRGb250ID0gZnVuY3Rpb24oZmFtLCBzeiwgc3R5KQ0KCXsNCgkJdGhpcy5mdEZhbSA9IGZhbTsNCgkJdGhpcy5mdFN6ID0gc3o7DQoJCXRoaXMuZnRTdHkgPSBzdHkgfHwgRm9udC5QTEFJTjsNCgl9Ow0KDQoJdGhpcy5kcmF3UG9seWxpbmUgPSB0aGlzLmRyYXdQb2x5TGluZSA9IGZ1bmN0aW9uKHgsIHkpDQoJew0KCQlmb3IgKHZhciBpPXgubGVuZ3RoIC0gMTsgaTspDQoJCXstLWk7DQoJCQl0aGlzLmRyYXdMaW5lKHhbaV0sIHlbaV0sIHhbaSsxXSwgeVtpKzFdKTsNCgkJfQ0KCX07DQoNCgl0aGlzLmZpbGxSZWN0ID0gZnVuY3Rpb24oeCwgeSwgdywgaCkNCgl7DQoJCXRoaXMuX21rRGl2KHgsIHksIHcsIGgpOw0KCX07DQoNCgl0aGlzLmRyYXdQb2x5Z29uID0gZnVuY3Rpb24oeCwgeSkNCgl7DQoJCXRoaXMuZHJhd1BvbHlsaW5lKHgsIHkpOw0KCQl0aGlzLmRyYXdMaW5lKHhbeC5sZW5ndGgtMV0sIHlbeC5sZW5ndGgtMV0sIHhbMF0sIHlbMF0pOw0KCX07DQoNCgl0aGlzLmRyYXdFbGxpcHNlID0gdGhpcy5kcmF3T3ZhbCA9IGZ1bmN0aW9uKHgsIHksIHcsIGgpDQoJew0KCQl0aGlzLl9ta092KHgsIHksIHcsIGgpOw0KCX07DQoNCgl0aGlzLmZpbGxFbGxpcHNlID0gdGhpcy5maWxsT3ZhbCA9IGZ1bmN0aW9uKGxlZnQsIHRvcCwgdywgaCkNCgl7DQoJCXZhciBhID0gdz4+MSwgYiA9IGg+PjEsDQoJCXdvZCA9IHcmMSwgaG9kID0gaCYxLA0KCQljeCA9IGxlZnQrYSwgY3kgPSB0b3ArYiwNCgkJeCA9IDAsIHkgPSBiLCBveSA9IGIsDQoJCWFhMiA9IChhKmEpPDwxLCBhYTQgPSBhYTI8PDEsIGJiMiA9IChiKmIpPDwxLCBiYjQgPSBiYjI8PDEsDQoJCXN0ID0gKGFhMj4+MSkqKDEtKGI8PDEpKSArIGJiMiwNCgkJdHQgPSAoYmIyPj4xKSAtIGFhMiooKGI8PDEpLTEpLA0KCQl4bCwgZHcsIGRoOw0KCQlpZih3KSB3aGlsZSh5ID4gMCkNCgkJew0KCQkJaWYoc3QgPCAwKQ0KCQkJew0KCQkJCXN0ICs9IGJiMiooKHg8PDEpKzMpOw0KCQkJCXR0ICs9IGJiNCooKyt4KTsNCgkJCX0NCgkJCWVsc2UgaWYodHQgPCAwKQ0KCQkJew0KCQkJCXN0ICs9IGJiMiooKHg8PDEpKzMpIC0gYWE0Kih5LTEpOw0KCQkJCXhsID0gY3gteDsNCgkJCQlkdyA9ICh4PDwxKSt3b2Q7DQoJCQkJdHQgKz0gYmI0KigrK3gpIC0gYWEyKigoKHktLSk8PDEpLTMpOw0KCQkJCWRoID0gb3kteTsNCgkJCQl0aGlzLl9ta0Rpdih4bCwgY3ktb3ksIGR3LCBkaCk7DQoJCQkJdGhpcy5fbWtEaXYoeGwsIGN5K3kraG9kLCBkdywgZGgpOw0KCQkJCW95ID0geTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQl0dCAtPSBhYTIqKCh5PDwxKS0zKTsNCgkJCQlzdCAtPSBhYTQqKC0teSk7DQoJCQl9DQoJCX0NCgkJdGhpcy5fbWtEaXYoY3gtYSwgY3ktb3ksIHcsIChveTw8MSkraG9kKTsNCgl9Ow0KDQoJdGhpcy5maWxsQXJjID0gZnVuY3Rpb24oaUwsIGlULCBpVywgaUgsIGZBbmdBLCBmQW5nWikNCgl7DQoJCXZhciBhID0gaVc+PjEsIGIgPSBpSD4+MSwNCgkJaU9kZHMgPSAoaVcmMSkgfCAoKGlIJjEpIDw8IDE2KSwNCgkJY3ggPSBpTCthLCBjeSA9IGlUK2IsDQoJCXggPSAwLCB5ID0gYiwgb3ggPSB4LCBveSA9IHksDQoJCWFhMiA9IChhKmEpPDwxLCBhYTQgPSBhYTI8PDEsIGJiMiA9IChiKmIpPDwxLCBiYjQgPSBiYjI8PDEsDQoJCXN0ID0gKGFhMj4+MSkqKDEtKGI8PDEpKSArIGJiMiwNCgkJdHQgPSAoYmIyPj4xKSAtIGFhMiooKGI8PDEpLTEpLA0KCQkvLyBWYXJzIGZvciByYWRpYWwgYm91bmRhcnkgbGluZXMNCgkJeEVuZEEsIHlFbmRBLCB4RW5kWiwgeUVuZFosDQoJCWlTZWN0cyA9ICgxIDw8IChNYXRoLmZsb29yKChmQW5nQSAlPSAzNjAuMCkvMTgwLjApIDw8IDMpKQ0KCQkJCXwgKDIgPDwgKE1hdGguZmxvb3IoKGZBbmdaICU9IDM2MC4wKS8xODAuMCkgPDwgMykpDQoJCQkJfCAoKGZBbmdBID49IGZBbmdaKSA8PCAxNiksDQoJCWFCbmRBID0gbmV3IEFycmF5KGIrMSksIGFCbmRaID0gbmV3IEFycmF5KGIrMSk7DQoJCQ0KCQkvLyBTZXQgdXAgcmFkaWFsIGJvdW5kYXJ5IGxpbmVzDQoJCWZBbmdBICo9IE1hdGguUEkvMTgwLjA7DQoJCWZBbmdaICo9IE1hdGguUEkvMTgwLjA7DQoJCXhFbmRBID0gY3grTWF0aC5yb3VuZChhKk1hdGguY29zKGZBbmdBKSk7DQoJCXlFbmRBID0gY3krTWF0aC5yb3VuZCgtYipNYXRoLnNpbihmQW5nQSkpOw0KCQlfbWtMaW5WaXJ0KGFCbmRBLCBjeCwgY3ksIHhFbmRBLCB5RW5kQSk7DQoJCXhFbmRaID0gY3grTWF0aC5yb3VuZChhKk1hdGguY29zKGZBbmdaKSk7DQoJCXlFbmRaID0gY3krTWF0aC5yb3VuZCgtYipNYXRoLnNpbihmQW5nWikpOw0KCQlfbWtMaW5WaXJ0KGFCbmRaLCBjeCwgY3ksIHhFbmRaLCB5RW5kWik7DQoNCgkJd2hpbGUoeSA+IDApDQoJCXsNCgkJCWlmKHN0IDwgMCkgLy8gQWR2YW5jZSB4DQoJCQl7DQoJCQkJc3QgKz0gYmIyKigoeDw8MSkrMyk7DQoJCQkJdHQgKz0gYmI0KigrK3gpOw0KCQkJfQ0KCQkJZWxzZSBpZih0dCA8IDApIC8vIEFkdmFuY2UgeCBhbmQgeQ0KCQkJew0KCQkJCXN0ICs9IGJiMiooKHg8PDEpKzMpIC0gYWE0Kih5LTEpOw0KCQkJCW94ID0geDsNCgkJCQl0dCArPSBiYjQqKCsreCkgLSBhYTIqKCgoeS0tKTw8MSktMyk7DQoJCQkJdGhpcy5fbWtBcmNEaXYob3gsIHksIG95LCBjeCwgY3ksIGlPZGRzLCBhQm5kQSwgYUJuZFosIGlTZWN0cyk7DQoJCQkJb3kgPSB5Ow0KCQkJfQ0KCQkJZWxzZSAvLyBBZHZhbmNlIHkNCgkJCXsNCgkJCQl0dCAtPSBhYTIqKCh5PDwxKS0zKTsNCgkJCQlzdCAtPSBhYTQqKC0teSk7DQoJCQkJaWYoeSAmJiAoYUJuZEFbeV0gIT0gYUJuZEFbeS0xXSB8fCBhQm5kWlt5XSAhPSBhQm5kWlt5LTFdKSkNCgkJCQl7DQoJCQkJCXRoaXMuX21rQXJjRGl2KHgsIHksIG95LCBjeCwgY3ksIGlPZGRzLCBhQm5kQSwgYUJuZFosIGlTZWN0cyk7DQoJCQkJCW94ID0geDsNCgkJCQkJb3kgPSB5Ow0KCQkJCX0NCgkJCX0NCgkJfQ0KCQl0aGlzLl9ta0FyY0Rpdih4LCAwLCBveSwgY3gsIGN5LCBpT2RkcywgYUJuZEEsIGFCbmRaLCBpU2VjdHMpOw0KCQlpZihpT2RkcyA+PiAxNikgLy8gT2RkIGhlaWdodA0KCQl7DQoJCQlpZihpU2VjdHMgPj4gMTYpIC8vIFN0YXJ0LWFuZ2xlID4gZW5kLWFuZ2xlDQoJCQl7DQoJCQkJdmFyIHhsID0gKHlFbmRBIDw9IGN5IHx8IHlFbmRaID4gY3kpPyAoY3ggLSB4KSA6IGN4Ow0KCQkJCXRoaXMuX21rRGl2KHhsLCBjeSwgeCArIGN4IC0geGwgKyAoaU9kZHMgJiAweGZmZmYpLCAxKTsNCgkJCX0NCgkJCWVsc2UgaWYoKGlTZWN0cyAmIDB4MDEpICYmIHlFbmRaID4gY3kpDQoJCQkJdGhpcy5fbWtEaXYoY3ggLSB4LCBjeSwgeCwgMSk7DQoJCX0NCgl9Ow0KDQovKiBmaWxsUG9seWdvbiBtZXRob2QsIGltcGxlbWVudGVkIGJ5IE1hdHRoaWV1IEhhbGxlci4NClRoaXMgamF2YXNjcmlwdCBmdW5jdGlvbiBpcyBhbiBhZGFwdGF0aW9uIG9mIHRoZSBnZEltYWdlRmlsbGVkUG9seWdvbiBmb3IgV2FsdGVyIFpvcm4gbGliLg0KQyBzb3VyY2Ugb2YgR0QgMS44LjQgZm91bmQgYXQgaHR0cDovL3d3dy5ib3V0ZWxsLmNvbS9nZC8NCg0KVEhBTktTIHRvIEtpcnN0ZW4gU2NodWx6IGZvciB0aGUgcG9seWdvbiBmaXhlcyENCg0KVGhlIGludGVyc2VjdGlvbiBmaW5kaW5nIHRlY2huaXF1ZSBvZiB0aGlzIGNvZGUgY291bGQgYmUgaW1wcm92ZWQNCmJ5IHJlbWVtYmVyaW5nIHRoZSBwcmV2aW91cyBpbnRlcnRlcnNlY3Rpb24sIGFuZCBieSB1c2luZyB0aGUgc2xvcGUuDQpUaGF0IGNvdWxkIGhlbHAgdG8gYWRqdXN0IGludGVyc2VjdGlvbnMgdG8gcHJvZHVjZSBhIG5pY2UNCmludGVyaW9yX2V4dHJlbWEuICovDQoJdGhpcy5maWxsUG9seWdvbiA9IGZ1bmN0aW9uKGFycmF5X3gsIGFycmF5X3kpDQoJew0KCQl2YXIgaTsNCgkJdmFyIHk7DQoJCXZhciBtaW55LCBtYXh5Ow0KCQl2YXIgeDEsIHkxOw0KCQl2YXIgeDIsIHkyOw0KCQl2YXIgaW5kMSwgaW5kMjsNCgkJdmFyIGludHM7DQoNCgkJdmFyIG4gPSBhcnJheV94Lmxlbmd0aDsNCgkJaWYoIW4pIHJldHVybjsNCg0KCQltaW55ID0gYXJyYXlfeVswXTsNCgkJbWF4eSA9IGFycmF5X3lbMF07DQoJCWZvcihpID0gMTsgaSA8IG47IGkrKykNCgkJew0KCQkJaWYoYXJyYXlfeVtpXSA8IG1pbnkpDQoJCQkJbWlueSA9IGFycmF5X3lbaV07DQoNCgkJCWlmKGFycmF5X3lbaV0gPiBtYXh5KQ0KCQkJCW1heHkgPSBhcnJheV95W2ldOw0KCQl9DQoJCWZvcih5ID0gbWlueTsgeSA8PSBtYXh5OyB5KyspDQoJCXsNCgkJCXZhciBwb2x5SW50cyA9IG5ldyBBcnJheSgpOw0KCQkJaW50cyA9IDA7DQoJCQlmb3IoaSA9IDA7IGkgPCBuOyBpKyspDQoJCQl7DQoJCQkJaWYoIWkpDQoJCQkJew0KCQkJCQlpbmQxID0gbi0xOw0KCQkJCQlpbmQyID0gMDsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJaW5kMSA9IGktMTsNCgkJCQkJaW5kMiA9IGk7DQoJCQkJfQ0KCQkJCXkxID0gYXJyYXlfeVtpbmQxXTsNCgkJCQl5MiA9IGFycmF5X3lbaW5kMl07DQoJCQkJaWYoeTEgPCB5MikNCgkJCQl7DQoJCQkJCXgxID0gYXJyYXlfeFtpbmQxXTsNCgkJCQkJeDIgPSBhcnJheV94W2luZDJdOw0KCQkJCX0NCgkJCQllbHNlIGlmKHkxID4geTIpDQoJCQkJew0KCQkJCQl5MiA9IGFycmF5X3lbaW5kMV07DQoJCQkJCXkxID0gYXJyYXlfeVtpbmQyXTsNCgkJCQkJeDIgPSBhcnJheV94W2luZDFdOw0KCQkJCQl4MSA9IGFycmF5X3hbaW5kMl07DQoJCQkJfQ0KCQkJCWVsc2UgY29udGludWU7DQoNCgkJCQkgLy8gIE1vZGlmaWVkIDExLiAyLiAyMDA0IFdhbHRlciBab3JuDQoJCQkJaWYoKHkgPj0geTEpICYmICh5IDwgeTIpKQ0KCQkJCQlwb2x5SW50c1tpbnRzKytdID0gTWF0aC5yb3VuZCgoeS15MSkgKiAoeDIteDEpIC8gKHkyLXkxKSArIHgxKTsNCg0KCQkJCWVsc2UgaWYoKHkgPT0gbWF4eSkgJiYgKHkgPiB5MSkgJiYgKHkgPD0geTIpKQ0KCQkJCQlwb2x5SW50c1tpbnRzKytdID0gTWF0aC5yb3VuZCgoeS15MSkgKiAoeDIteDEpIC8gKHkyLXkxKSArIHgxKTsNCgkJCX0NCgkJCXBvbHlJbnRzLnNvcnQoX0NvbXBJbnQpOw0KCQkJZm9yKGkgPSAwOyBpIDwgaW50czsgaSs9MikNCgkJCQl0aGlzLl9ta0Rpdihwb2x5SW50c1tpXSwgeSwgcG9seUludHNbaSsxXS1wb2x5SW50c1tpXSsxLCAxKTsNCgkJfQ0KCX07DQoNCgl0aGlzLmRyYXdTdHJpbmcgPSBmdW5jdGlvbih0eHQsIHgsIHkpDQoJew0KCQl0aGlzLmh0bSArPSAnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7d2hpdGUtc3BhY2U6bm93cmFwOycrDQoJCQknbGVmdDonICsgeCArICdweDsnKw0KCQkJJ3RvcDonICsgeSArICdweDsnKw0KCQkJJ2ZvbnQtZmFtaWx5OicgKyAgdGhpcy5mdEZhbSArICc7JysNCgkJCSdmb250LXNpemU6JyArIHRoaXMuZnRTeiArICc7JysNCgkJCSdjb2xvcjonICsgdGhpcy5jb2xvciArICc7JyArIHRoaXMuZnRTdHkgKyAnIj4nKw0KCQkJdHh0ICsNCgkJCSc8XC9kaXY+JzsNCgl9Ow0KDQovKiBkcmF3U3RyaW5nUmVjdCgpIGFkZGVkIGJ5IFJpY2sgQmxvbW1lcnMuDQpBbGxvd3MgdG8gc3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgdGV4dCByZWN0YW5nbGUgYW5kIHRvIGFsaWduIHRoZQ0KdGV4dCBib3RoIGhvcml6b250YWxseSAoZS5nLiByaWdodCkgYW5kIHZlcnRpY2FsbHkgd2l0aGluIHRoYXQgcmVjdGFuZ2xlICovDQoJdGhpcy5kcmF3U3RyaW5nUmVjdCA9IGZ1bmN0aW9uKHR4dCwgeCwgeSwgd2lkdGgsIGhhbGlnbikNCgl7DQoJCXRoaXMuaHRtICs9ICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTtvdmVyZmxvdzpoaWRkZW47JysNCgkJCSdsZWZ0OicgKyB4ICsgJ3B4OycrDQoJCQkndG9wOicgKyB5ICsgJ3B4OycrDQoJCQknd2lkdGg6Jyt3aWR0aCArJ3B4OycrDQoJCQkndGV4dC1hbGlnbjonK2hhbGlnbisnOycrDQoJCQknZm9udC1mYW1pbHk6JyArICB0aGlzLmZ0RmFtICsgJzsnKw0KCQkJJ2ZvbnQtc2l6ZTonICsgdGhpcy5mdFN6ICsgJzsnKw0KCQkJJ2NvbG9yOicgKyB0aGlzLmNvbG9yICsgJzsnICsgdGhpcy5mdFN0eSArICciPicrDQoJCQl0eHQgKw0KCQkJJzxcL2Rpdj4nOw0KCX07DQoNCgl0aGlzLmRyYXdJbWFnZSA9IGZ1bmN0aW9uKGltZ1NyYywgeCwgeSwgdywgaCwgYSkNCgl7DQoJCXRoaXMuaHRtICs9ICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsnKw0KCQkJJ2xlZnQ6JyArIHggKyAncHg7JysNCgkJCSd0b3A6JyArIHkgKyAncHg7JysNCgkJCS8vIHcgKHdpZHRoKSBhbmQgaCAoaGVpZ2h0KSBhcmd1bWVudHMgYXJlIG5vdyBvcHRpb25hbC4NCgkJCS8vIEFkZGVkIGJ5IE1haG11dCBLZXlndWJhdGxpLCAxNC4xLjIwMDgNCgkJCSh3PyAoJ3dpZHRoOicgKyAgdyArICdweDsnKSA6ICcnKSArDQoJCQkoaD8gKCdoZWlnaHQ6JyArIGggKyAncHg7Jyk6JycpKyciPicrDQoJCQknPGltZyBzcmM9IicgKyBpbWdTcmMgKyciJysgKHcgPyAoJyB3aWR0aD0iJyArIHcgKyAnIicpOicnKSsgKGggPyAoJyBoZWlnaHQ9IicgKyBoICsgJyInKTonJykgKyAoYT8gKCcgJythKSA6ICcnKSArICc+JysNCgkJCSc8XC9kaXY+JzsNCgl9Ow0KDQoJdGhpcy5jbGVhciA9IGZ1bmN0aW9uKCkNCgl7DQoJCXRoaXMuaHRtID0gIiI7DQoJCWlmKHRoaXMuY252KSB0aGlzLmNudi5pbm5lckhUTUwgPSAiIjsNCgl9Ow0KDQoJdGhpcy5fbWtPdlFkcyA9IGZ1bmN0aW9uKGN4LCBjeSwgeCwgeSwgdywgaCwgd29kLCBob2QpDQoJew0KCQl2YXIgeGwgPSBjeCAtIHgsIHhyID0gY3ggKyB4ICsgd29kIC0gdywgeXQgPSBjeSAtIHksIHliID0gY3kgKyB5ICsgaG9kIC0gaDsNCgkJaWYoeHIgPiB4bCt3KQ0KCQl7DQoJCQl0aGlzLl9ta0Rpdih4ciwgeXQsIHcsIGgpOw0KCQkJdGhpcy5fbWtEaXYoeHIsIHliLCB3LCBoKTsNCgkJfQ0KCQllbHNlDQoJCQl3ID0geHIgLSB4bCArIHc7DQoJCXRoaXMuX21rRGl2KHhsLCB5dCwgdywgaCk7DQoJCXRoaXMuX21rRGl2KHhsLCB5YiwgdywgaCk7DQoJfTsNCgkNCgl0aGlzLl9ta0FyY0RpdiA9IGZ1bmN0aW9uKHgsIHksIG95LCBjeCwgY3ksIGlPZGRzLCBhQm5kQSwgYUJuZFosIGlTZWN0cykNCgl7DQoJCXZhciB4ckRlZiA9IGN4ICsgeCArIChpT2RkcyAmIDB4ZmZmZiksIHkyLCBoID0gb3kgLSB5LCB4bCwgeHIsIHc7DQoNCgkJaWYoIWgpIGggPSAxOw0KCQl4ID0gY3ggLSB4Ow0KDQoJCWlmKGlTZWN0cyAmIDB4ZmYwMDAwKSAvLyBTdGFydC1hbmdsZSA+IGVuZC1hbmdsZQ0KCQl7DQoJCQl5MiA9IGN5IC0geSAtIGg7DQoJCQlpZihpU2VjdHMgJiAweDAwZmYpDQoJCQl7DQoJCQkJaWYoaVNlY3RzICYgMHgwMikNCgkJCQl7DQoJCQkJCXhsID0gTWF0aC5tYXgoeCwgYUJuZFpbeV0pOw0KCQkJCQl3ID0geHJEZWYgLSB4bDsNCgkJCQkJaWYodyA+IDApIHRoaXMuX21rRGl2KHhsLCB5MiwgdywgaCk7DQoJCQkJfQ0KCQkJCWlmKGlTZWN0cyAmIDB4MDEpDQoJCQkJew0KCQkJCQl4ciA9IE1hdGgubWluKHhyRGVmLCBhQm5kQVt5XSk7DQoJCQkJCXcgPSB4ciAtIHg7DQoJCQkJCWlmKHcgPiAwKSB0aGlzLl9ta0Rpdih4LCB5MiwgdywgaCk7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJCXRoaXMuX21rRGl2KHgsIHkyLCB4ckRlZiAtIHgsIGgpOw0KCQkJeTIgPSBjeSArIHkgKyAoaU9kZHMgPj4gMTYpOw0KCQkJaWYoaVNlY3RzICYgMHhmZjAwKQ0KCQkJew0KCQkJCWlmKGlTZWN0cyAmIDB4MDEwMCkNCgkJCQl7DQoJCQkJCXhsID0gTWF0aC5tYXgoeCwgYUJuZEFbeV0pOw0KCQkJCQl3ID0geHJEZWYgLSB4bDsNCgkJCQkJaWYodyA+IDApIHRoaXMuX21rRGl2KHhsLCB5MiwgdywgaCk7DQoJCQkJfQ0KCQkJCWlmKGlTZWN0cyAmIDB4MDIwMCkNCgkJCQl7DQoJCQkJCXhyID0gTWF0aC5taW4oeHJEZWYsIGFCbmRaW3ldKTsNCgkJCQkJdyA9IHhyIC0geDsNCgkJCQkJaWYodyA+IDApIHRoaXMuX21rRGl2KHgsIHkyLCB3LCBoKTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlDQoJCQkJdGhpcy5fbWtEaXYoeCwgeTIsIHhyRGVmIC0geCwgaCk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQlpZihpU2VjdHMgJiAweDAwZmYpDQoJCQl7DQoJCQkJaWYoaVNlY3RzICYgMHgwMikNCgkJCQkJeGwgPSBNYXRoLm1heCh4LCBhQm5kWlt5XSk7DQoJCQkJZWxzZQ0KCQkJCQl4bCA9IHg7DQoJCQkJaWYoaVNlY3RzICYgMHgwMSkNCgkJCQkJeHIgPSBNYXRoLm1pbih4ckRlZiwgYUJuZEFbeV0pOw0KCQkJCWVsc2UNCgkJCQkJeHIgPSB4ckRlZjsNCgkJCQl5MiA9IGN5IC0geSAtIGg7DQoJCQkJdyA9IHhyIC0geGw7DQoJCQkJaWYodyA+IDApIHRoaXMuX21rRGl2KHhsLCB5MiwgdywgaCk7DQoJCQl9DQoJCQlpZihpU2VjdHMgJiAweGZmMDApDQoJCQl7DQoJCQkJaWYoaVNlY3RzICYgMHgwMTAwKQ0KCQkJCQl4bCA9IE1hdGgubWF4KHgsIGFCbmRBW3ldKTsNCgkJCQllbHNlDQoJCQkJCXhsID0geDsNCgkJCQlpZihpU2VjdHMgJiAweDAyMDApDQoJCQkJCXhyID0gTWF0aC5taW4oeHJEZWYsIGFCbmRaW3ldKTsNCgkJCQllbHNlDQoJCQkJCXhyID0geHJEZWY7DQoJCQkJeTIgPSBjeSArIHkgKyAoaU9kZHMgPj4gMTYpOw0KCQkJCXcgPSB4ciAtIHhsOw0KCQkJCWlmKHcgPiAwKSB0aGlzLl9ta0Rpdih4bCwgeTIsIHcsIGgpOw0KCQkJfQ0KCQl9DQoJfTsNCg0KCXRoaXMuc2V0U3Ryb2tlKDEpOw0KCXRoaXMuc2V0Rm9udCgidmVyZGFuYSxnZW5ldmEsaGVsdmV0aWNhLHNhbnMtc2VyaWYiLCAiMTJweCIsIEZvbnQuUExBSU4pOw0KCXRoaXMuY29sb3IgPSAiIzAwMDAwMCI7DQoJdGhpcy5odG0gPSAiIjsNCgl0aGlzLnduZCA9IHduZCB8fCB3aW5kb3c7DQoNCglpZighamdfb2spIF9jaGtESFRNKHRoaXMud25kKTsNCglpZihqZ19vaykNCgl7DQoJCWlmKGNudikNCgkJew0KCQkJaWYodHlwZW9mKGNudikgPT0gInN0cmluZyIpDQoJCQkJdGhpcy5jb250ID0gZG9jdW1lbnQuYWxsPyAodGhpcy53bmQuZG9jdW1lbnQuYWxsW2Nudl0gfHwgbnVsbCkNCgkJCQkJOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZD8gKHRoaXMud25kLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNudikgfHwgbnVsbCkNCgkJCQkJOiBudWxsOw0KCQkJZWxzZSBpZihjbnYgPT0gd2luZG93LmRvY3VtZW50KQ0KCQkJCXRoaXMuY29udCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07DQoJCQkvLyBJZiBjbnYgaXMgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIGEgY2FudmFzIERPTSBub2RlDQoJCQkvLyAob3B0aW9uIHN1Z2dlc3RlZCBieSBBbmRyZWFzIEx1bGVpY2gpDQoJCQllbHNlIHRoaXMuY29udCA9IGNudjsNCgkJCS8vIENyZWF0ZSBuZXcgY2FudmFzIGluc2lkZSBjb250YWluZXIgRElWLiBUaHVzIHRoZSBkcmF3aW5nIGFuZCBjbGVhcmluZw0KCQkJLy8gbWV0aG9kcyB3b24ndCBpbnRlcmZlcmUgd2l0aCB0aGUgY29udGFpbmVyJ3MgaW5uZXIgaHRtbC4NCgkJCS8vIFNvbHV0aW9uIHN1Z2dlc3RlZCBieSBWbGFkaW1pci4NCgkJCXRoaXMuY252ID0gdGhpcy53bmQuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQoJCQl0aGlzLmNudi5zdHlsZS5mb250U2l6ZT0wOw0KCQkJdGhpcy5jb250LmFwcGVuZENoaWxkKHRoaXMuY252KTsNCgkJCXRoaXMucGFpbnQgPSBqZ19kb20/IF9wbnRDbnZEb20gOiBfcG50Q252SWU7DQoJCX0NCgkJZWxzZQ0KCQkJdGhpcy5wYWludCA9IF9wbnREb2M7DQoJfQ0KCWVsc2UNCgkJdGhpcy5wYWludCA9IF9wbnROOw0KDQoJdGhpcy5zZXRQcmludGFibGUoZmFsc2UpOw0KfQ0KDQpmdW5jdGlvbiBfbWtMaW5WaXJ0KGFMaW4sIHgxLCB5MSwgeDIsIHkyKQ0Kew0KCXZhciBkeCA9IE1hdGguYWJzKHgyLXgxKSwgZHkgPSBNYXRoLmFicyh5Mi15MSksDQoJeCA9IHgxLCB5ID0geTEsDQoJeEluY3IgPSAoeDEgPiB4Mik/IC0xIDogMSwNCgl5SW5jciA9ICh5MSA+IHkyKT8gLTEgOiAxLA0KCXAsDQoJaSA9IDA7DQoJaWYoZHggPj0gZHkpDQoJew0KCQl2YXIgcHIgPSBkeTw8MSwNCgkJcHJ1ID0gcHIgLSAoZHg8PDEpOw0KCQlwID0gcHItZHg7DQoJCXdoaWxlKGR4ID4gMCkNCgkJey0tZHg7DQoJCQlpZihwID4gMCkgICAgLy8gIEluY3JlbWVudCB5DQoJCQl7DQoJCQkJYUxpbltpKytdID0geDsNCgkJCQl5ICs9IHlJbmNyOw0KCQkJCXAgKz0gcHJ1Ow0KCQkJfQ0KCQkJZWxzZSBwICs9IHByOw0KCQkJeCArPSB4SW5jcjsNCgkJfQ0KCX0NCgllbHNlDQoJew0KCQl2YXIgcHIgPSBkeDw8MSwNCgkJcHJ1ID0gcHIgLSAoZHk8PDEpOw0KCQlwID0gcHItZHk7DQoJCXdoaWxlKGR5ID4gMCkNCgkJey0tZHk7DQoJCQl5ICs9IHlJbmNyOw0KCQkJYUxpbltpKytdID0geDsNCgkJCWlmKHAgPiAwKSAgICAvLyAgSW5jcmVtZW50IHgNCgkJCXsNCgkJCQl4ICs9IHhJbmNyOw0KCQkJCXAgKz0gcHJ1Ow0KCQkJfQ0KCQkJZWxzZSBwICs9IHByOw0KCQl9DQoJfQ0KCWZvcih2YXIgbGVuID0gYUxpbi5sZW5ndGgsIGkgPSBsZW4taTsgaTspDQoJCWFMaW5bbGVuLShpLS0pXSA9IHg7DQp9Ow0KDQpmdW5jdGlvbiBfQ29tcEludCh4LCB5KQ0Kew0KCXJldHVybih4IC0geSk7DQp9DQoNCg=='></script>


	<script id="wz_tooltip" src='data:/text/plain;base64,LyogVGhpcyBub3RpY2UgbXVzdCBiZSB1bnRvdWNoZWQgYXQgYWxsIHRpbWVzLgoKd3pfdG9vbHRpcC5qcyAgICB2LiAzLjQ1CgpUaGUgbGF0ZXN0IHZlcnNpb24gaXMgYXZhaWxhYmxlIGF0Cmh0dHA6Ly93d3cud2FsdGVyem9ybi5jb20Kb3IgaHR0cDovL3d3dy5kZXZpcmEuY29tCm9yIGh0dHA6Ly93d3cud2FsdGVyem9ybi5kZQoKQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgV2FsdGVyIFpvcm4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkNyZWF0ZWQgMS4gMTIuIDIwMDIgYnkgV2FsdGVyIFpvcm4gKFdlYjogaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmNvbSApCkxhc3QgbW9kaWZpZWQ6IDE3LiAyLiAyMDA3CgpDcm9zcy1icm93c2VyIHRvb2x0aXBzIHdvcmtpbmcgZXZlbiBpbiBPcGVyYSA1IGFuZCA2LAphcyB3ZWxsIGFzIGluIE5OIDQsIEdlY2tvLUJyb3dzZXJzLCBJRTQrLCBPcGVyYSA3KyBhbmQgS29ucXVlcm9yLgpObyBvbm1vdXNlb3V0cyByZXF1aXJlZC4KQXBwZWFyYW5jZSBvZiB0b29sdGlwcyBjYW4gYmUgaW5kaXZpZHVhbGx5IGNvbmZpZ3VyZWQKdmlhIGNvbW1hbmRzIHdpdGhpbiB0aGUgb25tb3VzZW92ZXJzLgoKTElDRU5TRTogTEdQTAoKVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgKExHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgoKRm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApzZWUgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2xlc3Nlci5odG1sCiovCgoKCi8vLy8vLy8vLy8vLy8vLy8gIEdMT0JBTCBUT09QVElQIENPTkZJR1VSQVRJT04gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLwp2YXIgdHRBYm92ZSAgICAgICA9IGZhbHNlOyAgICAgICAgLy8gdG9vbHRpcCBhYm92ZSBtb3VzZXBvaW50ZXI/IEFsdGVybmF0aXZlOiB0cnVlCnZhciB0dEJnQ29sb3IgICAgID0gIiNlNmVjZmYiOwp2YXIgdHRCZ0ltZyAgICAgICA9ICIiOyAgICAgICAgICAgLy8gcGF0aCB0byBiYWNrZ3JvdW5kIGltYWdlOwp2YXIgdHRCb3JkZXJDb2xvciA9ICIjMDAzMzk5IjsKdmFyIHR0Qm9yZGVyV2lkdGggPSAxOwp2YXIgdHRDbGlja0Nsb3NlICA9IGZhbHNlOwp2YXIgdHREZWxheSAgICAgICA9IDUwMDsgICAgICAgICAgLy8gdGltZSBzcGFuIHVudGlsIHRvb2x0aXAgc2hvd3MgdXAgW21pbGxpc2Vjb25kc10KdmFyIHR0Rm9udENvbG9yICAgPSAiIzAwMDA2NiI7CnZhciB0dEZvbnRGYWNlICAgID0gImFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmIjsKdmFyIHR0Rm9udFNpemUgICAgPSAiMTFweCI7CnZhciB0dEZvbnRXZWlnaHQgID0gIm5vcm1hbCI7ICAgICAvLyBhbHRlcm5hdGl2ZTogImJvbGQiOwp2YXIgdHRMZWZ0ICAgICAgICA9IGZhbHNlOyAgICAgICAgLy8gdG9vbHRpcCBvbiB0aGUgbGVmdCBvZiB0aGUgbW91c2U/IEFsdGVybmF0aXZlOiB0cnVlCnZhciB0dE9mZnNldFggICAgID0gMTI7ICAgICAgICAgICAvLyBob3Jpem9udGFsIG9mZnNldCBvZiBsZWZ0LXRvcCBjb3JuZXIgZnJvbSBtb3VzZXBvaW50ZXIKdmFyIHR0T2Zmc2V0WSAgICAgPSAxNTsgICAgICAgICAgIC8vIHZlcnRpY2FsIG9mZnNldCAgICAgICAgICAgICAgICAgICAiCnZhciB0dE9wYWNpdHkgICAgID0gMTAwOyAgICAgICAgICAvLyBvcGFjaXR5IG9mIHRvb2x0aXAgaW4gcGVyY2VudCAobXVzdCBiZSBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTAwKQp2YXIgdHRQYWRkaW5nICAgICA9IDM7ICAgICAgICAgICAgLy8gc3BhY2luZyBiZXR3ZWVuIGJvcmRlciBhbmQgY29udGVudAp2YXIgdHRTaGFkb3dDb2xvciA9ICIiOwp2YXIgdHRTaGFkb3dXaWR0aCA9IDA7CnZhciB0dFN0YXRpYyAgICAgID0gZmFsc2U7ICAgICAgICAvLyB0b29sdGlwIE5PVCBtb3ZlIHdpdGggdGhlIG1vdXNlPyBBbHRlcm5hdGl2ZTogdHJ1ZQp2YXIgdHRTdGlja3kgICAgICA9IGZhbHNlOyAgICAgICAgLy8gZG8gTk9UIGhpZGUgdG9vbHRpcCBvbiBtb3VzZW91dD8gQWx0ZXJuYXRpdmU6IHRydWUKdmFyIHR0VGVtcCAgICAgICAgPSAwOyAgICAgICAgICAgIC8vIHRpbWUgc3BhbiBhZnRlciB3aGljaCB0aGUgdG9vbHRpcCBkaXNhcHBlYXJzOyAwICh6ZXJvKSBtZWFucyAiaW5maW5pdGUgdGltZXNwYW4iCnZhciB0dFRleHRBbGlnbiAgID0gImxlZnQiOwp2YXIgdHRUaXRsZUNvbG9yICA9ICIjZmZmZmZmIjsgICAgLy8gY29sb3Igb2YgY2FwdGlvbiB0ZXh0CnZhciB0dFdpZHRoICAgICAgID0gMzAwOwovLy8vLy8vLy8vLy8vLy8vLy8vLyAgRU5EIE9GIFRPT0xUSVAgQ09ORklHICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgoKLy8vLy8vLy8vLy8vLy8gIFRBR1MgV0lUSCBUT09MVElQIEZVTkNUSU9OQUxJVFkgIC8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIExpc3QgbWF5IGJlIGV4dGVuZGVkIG9yIHNob3J0ZW5lZDoKdmFyIHR0X3RhZ3MgPSBuZXcgQXJyYXkoImEiLCJhcmVhIiwiYiIsImJpZyIsImNhcHRpb24iLCJjZW50ZXIiLCJjb2RlIiwiZGQiLCJkaXYiLCJkbCIsImR0IiwiZW0iLCJoMSIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiLCJpIiwiaW1nIiwiaW5wdXQiLCJsaSIsIm1hcCIsIm9sIiwicCIsInByZSIsInMiLCAic2VsZWN0IiwgInNtYWxsIiwic3BhbiIsInN0cmlrZSIsInN0cm9uZyIsInN1YiIsInN1cCIsInRhYmxlIiwidGQiLCJ0ZXh0YXJlYSIsInRoIiwidHIiLCJ0dCIsInUiLCJ2YXIiLCJ1bCIsImxheWVyIik7Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCgovLy8vLy8vLy8gRE9OJ1QgQ0hBTkdFIEFOWVRISU5HIEJFTE9XIFRISVMgTElORSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KdmFyIHR0X29iaiA9IG51bGwsICAgICAgICAgLy8gY3VycmVudCB0b29sdGlwCnR0X2lmcm0gPSBudWxsLCAgICAgICAgICAgIC8vIGlmcmFtZSB0byBjb3ZlciB3aW5kb3dlZCBjb250cm9scyBpbiBJRQp0dF9vYmpXID0gMCwgdHRfb2JqSCA9IDAsICAvLyB3aWR0aCBhbmQgaGVpZ2h0IG9mIHR0X29iagp0dF9vYmpYID0gMCwgdHRfb2JqWSA9IDAsCnR0X29mZlggPSAwLCB0dF9vZmZZID0gMCwKeGxpbSA9IDAsIHlsaW0gPSAwLCAgICAgICAgLy8gcmlnaHQgYW5kIGJvdHRvbSBib3JkZXJzIG9mIHZpc2libGUgY2xpZW50IGFyZWEKdHRfc3VwID0gZmFsc2UsICAgICAgICAgICAgLy8gdHJ1ZSBpZiBUX0FCT1ZFIGNtZAp0dF9zdGlja3kgPSBmYWxzZSwgICAgICAgICAvLyB0dF9vYmogc3RpY2t5Pwp0dF93YWl0ID0gZmFsc2UsCnR0X2FjdCA9IGZhbHNlLCAgICAgICAgICAgIC8vIHRvb2x0aXAgdmlzaWJpbGl0eSBmbGFnCnR0X3N1YiA9IGZhbHNlLCAgICAgICAgICAgIC8vIHRydWUgd2hpbGUgdG9vbHRpcCBiZWxvdyBtb3VzZXBvaW50ZXIKdHRfdSA9ICJ1bmRlZmluZWQiLAp0dF9tZiA9IG51bGwsICAgICAgICAgICAgICAvLyBzdG9yZXMgcHJldmlvdXMgbW91c2Vtb3ZlIGV2dGhhbmRsZXIKLy8gT3BlcmE6IGRpc2FibGUgaHJlZiB3aGVuIGhvdmVyaW5nIDxhPgp0dF90YWcgPSBudWxsOyAgICAgICAgICAgICAvLyBzdG9yZXMgaG92ZXJlZCBkb20gbm9kZSwgaHJlZiBhbmQgcHJldmlvdXMgc3RhdHVzYmFyIHR4dAoKCnZhciB0dF9kYiA9IChkb2N1bWVudC5jb21wYXRNb2RlICYmIGRvY3VtZW50LmNvbXBhdE1vZGUgIT0gIkJhY2tDb21wYXQiKT8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IDogZG9jdW1lbnQuYm9keT8gZG9jdW1lbnQuYm9keSA6IG51bGwsCnR0X24gPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksCnR0X252ID0gbmF2aWdhdG9yLmFwcFZlcnNpb247Ci8vIEJyb3dzZXIgZmxhZ3MKdmFyIHR0X29wID0gISEod2luZG93Lm9wZXJhICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKSwKdHRfb3A2ID0gdHRfb3AgJiYgIWRvY3VtZW50LmRlZmF1bHRWaWV3LAp0dF9vcDcgPSB0dF9vcCAmJiAhdHRfb3A2LAp0dF9pZSA9IHR0X24uaW5kZXhPZigibXNpZSIpICE9IC0xICYmIGRvY3VtZW50LmFsbCAmJiB0dF9kYiAmJiAhdHRfb3AsCnR0X2llNyA9IHR0X2llICYmIHR5cGVvZiBkb2N1bWVudC5ib2R5LnN0eWxlLm1heEhlaWdodCAhPSB0dF91LAp0dF9pZTYgPSB0dF9pZSAmJiAhdHRfaWU3ICYmIHBhcnNlRmxvYXQodHRfbnYuc3Vic3RyaW5nKHR0X252LmluZGV4T2YoIk1TSUUiKSs1KSkgPj0gNS41LAp0dF9uNCA9IChkb2N1bWVudC5sYXllcnMgJiYgdHlwZW9mIGRvY3VtZW50LmNsYXNzZXMgIT0gdHRfdSksCnR0X242ID0gKCF0dF9vcCAmJiBkb2N1bWVudC5kZWZhdWx0VmlldyAmJiB0eXBlb2YgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSAhPSB0dF91KSwKdHRfdzNjID0gIXR0X2llICYmICF0dF9uNiAmJiAhdHRfb3AgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQsCnR0X2NlID0gZG9jdW1lbnQuY2FwdHVyZUV2ZW50cyAmJiAhdHRfbjY7CgpmdW5jdGlvbiB0dF9JbnQodF94KQp7Cgl2YXIgdF95OwoJcmV0dXJuIGlzTmFOKHRfeSA9IHBhcnNlSW50KHRfeCkpPyAwIDogdF95Owp9CmZ1bmN0aW9uIHd6UmVwbGFjZSh0X3gsIHRfeSkKewoJdmFyIHRfcmV0ID0gIiIsCgl0X3N0ciA9IHRoaXMsCgl0X3hJOwoJd2hpbGUoKHRfeEkgPSB0X3N0ci5pbmRleE9mKHRfeCkpICE9IC0xKQoJewoJCXRfcmV0ICs9IHRfc3RyLnN1YnN0cmluZygwLCB0X3hJKSArIHRfeTsKCQl0X3N0ciA9IHRfc3RyLnN1YnN0cmluZyh0X3hJICsgdF94Lmxlbmd0aCk7Cgl9CglyZXR1cm4gdF9yZXQrdF9zdHI7Cn0KU3RyaW5nLnByb3RvdHlwZS53elJlcGxhY2UgPSB3elJlcGxhY2U7CmZ1bmN0aW9uIHR0X040VGFncyh0YWd0eXAsIHRfZCwgdF95KQp7Cgl0X2QgPSB0X2QgfHwgZG9jdW1lbnQ7Cgl0X3kgPSB0X3kgfHwgbmV3IEFycmF5KCk7Cgl2YXIgdF94ID0gKHRhZ3R5cD09ImEiKT8gdF9kLmxpbmtzIDogdF9kLmxheWVyczsKCWZvcih2YXIgeiA9IHRfeC5sZW5ndGg7IHotLTspIHRfeVt0X3kubGVuZ3RoXSA9IHRfeFt6XTsKCWZvcih6ID0gdF9kLmxheWVycy5sZW5ndGg7IHotLTspIHRfeSA9IHR0X040VGFncyh0YWd0eXAsIHRfZC5sYXllcnNbel0uZG9jdW1lbnQsIHRfeSk7CglyZXR1cm4gdF95Owp9CmZ1bmN0aW9uIHR0X0h0bSh0dCwgdF9pZCwgdHh0KQp7Cgl2YXIgdF9iZ2MgPSAodHlwZW9mIHR0LlRfQkdDT0xPUiAhPSB0dF91KT8gdHQuVF9CR0NPTE9SIDogdHRCZ0NvbG9yLAoJdF9iZ2ltZyAgID0gKHR5cGVvZiB0dC5UX0JHSU1HICE9IHR0X3UpPyB0dC5UX0JHSU1HIDogdHRCZ0ltZywKCXRfYmMgICAgICA9ICh0eXBlb2YgdHQuVF9CT1JERVJDT0xPUiAhPSB0dF91KT8gdHQuVF9CT1JERVJDT0xPUiA6IHR0Qm9yZGVyQ29sb3IsCgl0X2J3ICAgICAgPSAodHlwZW9mIHR0LlRfQk9SREVSV0lEVEggIT0gdHRfdSk/IHR0LlRfQk9SREVSV0lEVEggOiB0dEJvcmRlcldpZHRoLAoJdF9mZiAgICAgID0gKHR5cGVvZiB0dC5UX0ZPTlRGQUNFICE9IHR0X3UpPyB0dC5UX0ZPTlRGQUNFIDogdHRGb250RmFjZSwKCXRfZmMgICAgICA9ICh0eXBlb2YgdHQuVF9GT05UQ09MT1IgIT0gdHRfdSk/IHR0LlRfRk9OVENPTE9SIDogdHRGb250Q29sb3IsCgl0X2ZzeiAgICAgPSAodHlwZW9mIHR0LlRfRk9OVFNJWkUgIT0gdHRfdSk/IHR0LlRfRk9OVFNJWkUgOiB0dEZvbnRTaXplLAoJdF9md2dodCAgID0gKHR5cGVvZiB0dC5UX0ZPTlRXRUlHSFQgIT0gdHRfdSk/IHR0LlRfRk9OVFdFSUdIVCA6IHR0Rm9udFdlaWdodCwKCXRfb3BhICAgICA9ICh0eXBlb2YgdHQuVF9PUEFDSVRZICE9IHR0X3UpPyB0dC5UX09QQUNJVFkgOiB0dE9wYWNpdHksCgl0X3BhZGQgICAgPSAodHlwZW9mIHR0LlRfUEFERElORyAhPSB0dF91KT8gdHQuVF9QQURESU5HIDogdHRQYWRkaW5nLAoJdF9zaGMgICAgID0gKHR5cGVvZiB0dC5UX1NIQURPV0NPTE9SICE9IHR0X3UpPyB0dC5UX1NIQURPV0NPTE9SIDogKHR0U2hhZG93Q29sb3IgfHwgMCksCgl0X3NodyAgICAgPSAodHlwZW9mIHR0LlRfU0hBRE9XV0lEVEggIT0gdHRfdSk/IHR0LlRfU0hBRE9XV0lEVEggOiAodHRTaGFkb3dXaWR0aCB8fCAwKSwKCXRfYWxnbiAgICA9ICh0eXBlb2YgdHQuVF9URVhUQUxJR04gIT0gdHRfdSk/IHR0LlRfVEVYVEFMSUdOIDogdHRUZXh0QWxpZ24sCgl0X3RpdCAgICAgPSAodHlwZW9mIHR0LlRfVElUTEUgIT0gdHRfdSk/IHR0LlRfVElUTEUgOiAiIiwKCXRfdGl0YyAgICA9ICh0eXBlb2YgdHQuVF9USVRMRUNPTE9SICE9IHR0X3UpPyB0dC5UX1RJVExFQ09MT1IgOiB0dFRpdGxlQ29sb3IsCgl0X3cgICAgICAgPSAodHlwZW9mIHR0LlRfV0lEVEggIT0gdHRfdSk/IHR0LlRfV0lEVEggIDogdHRXaWR0aDsKCWlmKHRfc2hjIHx8IHRfc2h3KQoJewoJCXRfc2hjID0gdF9zaGMgfHwgIiNjMGMwYzAiOwoJCXRfc2h3ID0gdF9zaHcgfHwgNTsKCX0KCWlmKHR0X240ICYmICh0X2ZzeiA9PSAiMTBweCIgfHwgdF9mc3ogPT0gIjExcHgiKSkgdF9mc3ogPSAiMTJweCI7CgoJdmFyIHRfb3B0eCA9ICh0dF9uND8gJycgOiB0dF9uNj8gKCctbW96LW9wYWNpdHk6JysodF9vcGEvMTAwLjApKSA6IHR0X2llPyAoJ2ZpbHRlcjpBbHBoYShvcGFjaXR5PScrdF9vcGErJyknKSA6ICgnb3BhY2l0eTonKyh0X29wYS8xMDAuMCkpKSArICc7JzsKCXZhciB0X3kgPSAnPGRpdiBpZD0iJyt0X2lkKyciIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMTA7JzsKCXRfeSArPSAnbGVmdDowcHg7dG9wOjBweDt3aWR0aDonKyh0X3crdF9zaHcpKydweDt2aXNpYmlsaXR5OicrKHR0X240PyAnaGlkZScgOiAnaGlkZGVuJykrJzsnK3Rfb3B0eCsnIj4nICsKCQknPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIicrKHRfYmM/ICgnIGJnY29sb3I9IicrdF9iYysnIiBzdHlsZT0iYmFja2dyb3VuZDonK3RfYmMrJzsiJykgOiAnJykrJyB3aWR0aD0iJyt0X3crJyI+JzsKCWlmKHRfdGl0KQoJewoJCXRfeSArPSAnPHRyPjx0ZCBzdHlsZT0icGFkZGluZy1sZWZ0OjNweDtwYWRkaW5nLXJpZ2h0OjNweDsiIGFsaWduPSInK3RfYWxnbisnIj48Zm9udCBjb2xvcj0iJyt0X3RpdGMrJyIgZmFjZT0iJyt0X2ZmKyciICcgKwoJCQknc3R5bGU9ImNvbG9yOicrdF90aXRjKyc7Zm9udC1mYW1pbHk6Jyt0X2ZmKyc7Zm9udC1zaXplOicrdF9mc3orJzsiPjxiPicgKwoJCQkodHRfbjQ/ICcmbmJzcDsnIDogJycpK3RfdGl0Kyc8L2I+PC9mb250PjwvdGQ+PC90cj4nOwoJfQoJdF95ICs9ICc8dHI+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSInK3RfcGFkZCsnIiBjZWxsc3BhY2luZz0iJyt0X2J3KyciIHdpZHRoPSIxMDAlIj4nICsKCQknPHRyPjx0ZCcrKHRfYmdjPyAoJyBiZ2NvbG9yPSInK3RfYmdjKyciJykgOiAnJykrKHRfYmdpbWc/ICcgYmFja2dyb3VuZD0iJyt0X2JnaW1nKyciJyA6ICcnKSsnIHN0eWxlPSJ0ZXh0LWFsaWduOicrdF9hbGduKyc7JzsKCWlmKHR0X242KSB0X3kgKz0gJ3BhZGRpbmc6Jyt0X3BhZGQrJ3B4Oyc7Cgl0X3kgKz0gJyIgYWxpZ249IicrdF9hbGduKyciPjxmb250IGNvbG9yPSInK3RfZmMrJyIgZmFjZT0iJyt0X2ZmKyciJyArCgkJJyBzdHlsZT0iY29sb3I6Jyt0X2ZjKyc7Zm9udC1mYW1pbHk6Jyt0X2ZmKyc7Zm9udC1zaXplOicrdF9mc3orJztmb250LXdlaWdodDonK3RfZndnaHQrJzsiPic7CglpZih0X2Z3Z2h0ID09ICdib2xkJykgdF95ICs9ICc8Yj4nOwoJdF95ICs9IHR4dDsKCWlmKHRfZndnaHQgPT0gJ2JvbGQnKSB0X3kgKz0gJzwvYj4nOwoJdF95ICs9ICc8L2ZvbnQ+PC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPjwvdGFibGU+JzsKCWlmKHRfc2h3KQoJewoJCXZhciB0X3NwY3QgPSBNYXRoLnJvdW5kKHRfc2h3KjEuMyk7CgkJaWYodHRfbjQpCgkJewoJCQl0X3kgKz0gJzxsYXllciBiZ2NvbG9yPSInK3Rfc2hjKyciIGxlZnQ9IicrdF93KyciIHRvcD0iJyt0X3NwY3QrJyIgd2lkdGg9IicrdF9zaHcrJyIgaGVpZ2h0PSIwIj48L2xheWVyPicgKwoJCQkJJzxsYXllciBiZ2NvbG9yPSInK3Rfc2hjKyciIGxlZnQ9IicrdF9zcGN0KyciIGFsaWduPSJib3R0b20iIHdpZHRoPSInKyh0X3ctdF9zcGN0KSsnIiBoZWlnaHQ9IicrdF9zaHcrJyI+PC9sYXllcj4nOwoJCX0KCQllbHNlCgkJewoJCQl0X29wdHggPSB0dF9uNj8gJy1tb3otb3BhY2l0eTowLjg1OycgOiB0dF9pZT8gJ2ZpbHRlcjpBbHBoYShvcGFjaXR5PTg1KTsnIDogJ29wYWNpdHk6MC44NTsnOwoJCQl0X3kgKz0gJzxkaXYgaWQ9IicrdF9pZCsnUiIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO2JhY2tncm91bmQ6Jyt0X3NoYysnO2xlZnQ6Jyt0X3crJ3B4O3RvcDonK3Rfc3BjdCsncHg7d2lkdGg6Jyt0X3NodysncHg7aGVpZ2h0OjFweDtvdmVyZmxvdzpoaWRkZW47Jyt0X29wdHgrJyI+PC9kaXY+JyArCgkJCQknPGRpdiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7YmFja2dyb3VuZDonK3Rfc2hjKyc7bGVmdDonK3Rfc3BjdCsncHg7dG9wOjBweDt3aWR0aDonKyh0X3ctdF9zcGN0KSsncHg7aGVpZ2h0OicrdF9zaHcrJ3B4O292ZXJmbG93OmhpZGRlbjsnK3Rfb3B0eCsnIj48L2Rpdj4nOwoJCX0KCX0KCXJldHVybih0X3krJzwvZGl2PicpOwp9CmZ1bmN0aW9uIHR0X0V2WCh0X2UpCnsKCXZhciB0X3kgPSB0dF9JbnQodF9lLnBhZ2VYIHx8IHRfZS5jbGllbnRYIHx8IDApICsKCQl0dF9JbnQodHRfaWU/IHR0X2RiLnNjcm9sbExlZnQgOiAwKSArCgkJdHRfb2ZmWDsKCWlmKHRfeSA+IHhsaW0pIHRfeSA9IHhsaW07Cgl2YXIgdF9zY3IgPSB0dF9JbnQod2luZG93LnBhZ2VYT2Zmc2V0IHx8ICh0dF9kYj8gdHRfZGIuc2Nyb2xsTGVmdCA6IDApIHx8IDApOwoJaWYodF95IDwgdF9zY3IpIHRfeSA9IHRfc2NyOwoJcmV0dXJuIHRfeTsKfQpmdW5jdGlvbiB0dF9FdlkodF9lKQp7Cgl2YXIgdF95MjsKCgl2YXIgdF95ID0gdHRfSW50KHRfZS5wYWdlWSB8fCB0X2UuY2xpZW50WSB8fCAwKSArCgkJdHRfSW50KHR0X2llPyB0dF9kYi5zY3JvbGxUb3AgOiAwKTsKCWlmKHR0X3N1cCAmJiAodF95MiA9IHRfeSAtICh0dF9vYmpIICsgdHRfb2ZmWSAtIDE1KSkgPj0gdHRfSW50KHdpbmRvdy5wYWdlWU9mZnNldCB8fCAodHRfZGI/IHR0X2RiLnNjcm9sbFRvcCA6IDApIHx8IDApKQoJCXRfeSAtPSAodHRfb2JqSCArIHR0X29mZlkgLSAxNSk7CgllbHNlIGlmKHRfeSA+IHlsaW0gfHwgIXR0X3N1YiAmJiB0X3kgPiB5bGltLTI0KQoJewoJCXRfeSAtPSAodHRfb2JqSCArIDUpOwoJCXR0X3N1YiA9IGZhbHNlOwoJfQoJZWxzZQoJewoJCXRfeSArPSB0dF9vZmZZOwoJCXR0X3N1YiA9IHRydWU7Cgl9CglyZXR1cm4gdF95Owp9CmZ1bmN0aW9uIHR0X1JlbGVhc01vdigpCnsKCWlmKGRvY3VtZW50Lm9ubW91c2Vtb3ZlID09IHR0X01vdmUpCgl7CgkJaWYoIXR0X21mICYmIHR0X2NlKSBkb2N1bWVudC5yZWxlYXNlRXZlbnRzKEV2ZW50Lk1PVVNFTU9WRSk7CgkJZG9jdW1lbnQub25tb3VzZW1vdmUgPSB0dF9tZjsKCX0KfQpmdW5jdGlvbiB0dF9TaG93SWZybSh0X3gpCnsKCWlmKCF0dF9vYmogfHwgIXR0X2lmcm0pIHJldHVybjsKCWlmKHRfeCkKCXsKCQl0dF9pZnJtLnN0eWxlLndpZHRoID0gdHRfb2JqVysncHgnOwoJCXR0X2lmcm0uc3R5bGUuaGVpZ2h0ID0gdHRfb2JqSCsncHgnOwoJCXR0X2lmcm0uc3R5bGUuZGlzcGxheSA9ICJibG9jayI7Cgl9CgllbHNlIHR0X2lmcm0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKfQpmdW5jdGlvbiB0dF9HZXREaXYodF9pZCkKewoJcmV0dXJuKAoJCXR0X240PyAoZG9jdW1lbnQubGF5ZXJzW3RfaWRdIHx8IG51bGwpCgkJOiB0dF9pZT8gKGRvY3VtZW50LmFsbFt0X2lkXSB8fCBudWxsKQoJCTogKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRfaWQpIHx8IG51bGwpCgkpOwp9CmZ1bmN0aW9uIHR0X0dldERpdlcoKQp7CglyZXR1cm4gdHRfSW50KAoJCXR0X240PyB0dF9vYmouY2xpcC53aWR0aAoJCTogKHR0X29iai5vZmZzZXRXaWR0aCB8fCB0dF9vYmouc3R5bGUucGl4ZWxXaWR0aCkKCSk7Cn0KZnVuY3Rpb24gdHRfR2V0RGl2SCgpCnsKCXJldHVybiB0dF9JbnQoCgkJdHRfbjQ/IHR0X29iai5jbGlwLmhlaWdodAoJCTogKHR0X29iai5vZmZzZXRIZWlnaHQgfHwgdHRfb2JqLnN0eWxlLnBpeGVsSGVpZ2h0KQoJKTsKfQoKLy8gQ29tcGF0IHdpdGggRHJhZ0Ryb3AgTGliOiBFbnN1cmUgdGhhdCB6LWluZGV4IG9mIHRvb2x0aXAgaXMgbGlmdGVkIGJleW9uZCB0b3BsZXZlbCBkcmFnZHJvcCBlbGVtZW50CmZ1bmN0aW9uIHR0X1NldERpdlooKQp7Cgl2YXIgdF9pID0gdHRfb2JqLnN0eWxlIHx8IHR0X29iajsKCWlmKHRfaSkKCXsKCQlpZih3aW5kb3cuZGQgJiYgZGQueikKCQkJdF9pLnpJbmRleCA9IE1hdGgubWF4KGRkLnorMSwgdF9pLnpJbmRleCk7CgkJaWYodHRfaWZybSkgdHRfaWZybS5zdHlsZS56SW5kZXggPSB0X2kuekluZGV4LTE7Cgl9Cn0KZnVuY3Rpb24gdHRfU2V0RGl2UG9zKHRfeCwgdF95KQp7Cgl2YXIgdF9pID0gdHRfb2JqLnN0eWxlIHx8IHR0X29iajsKCXZhciB0X3B4ID0gKHR0X29wNiB8fCB0dF9uNCk/ICcnIDogJ3B4JzsKCXRfaS5sZWZ0ID0gKHR0X29ialggPSB0X3gpICsgdF9weDsKCXRfaS50b3AgPSAodHRfb2JqWSA9IHRfeSkgKyB0X3B4OwoJLy8gIHdpbmRvdy4uLiB0byBjaXJjdW12ZW50IHRoZSBGaXJlRm94IEFsemhlaW1lciBCdWcKCWlmKHdpbmRvdy50dF9pZnJtKQoJewoJCXR0X2lmcm0uc3R5bGUubGVmdCA9IHRfaS5sZWZ0OwoJCXR0X2lmcm0uc3R5bGUudG9wID0gdF9pLnRvcDsKCX0KfQpmdW5jdGlvbiB0dF9TaG93RGl2KHRfeCkKewoJdHRfU2hvd0lmcm0odF94KTsKCWlmKHR0X240KSB0dF9vYmoudmlzaWJpbGl0eSA9IHRfeD8gJ3Nob3cnIDogJ2hpZGUnOwoJZWxzZSB0dF9vYmouc3R5bGUudmlzaWJpbGl0eSA9IHRfeD8gJ3Zpc2libGUnIDogJ2hpZGRlbic7Cgl0dF9hY3QgPSB0X3g7Cn0KZnVuY3Rpb24gdHRfRGVBbHQodF90YWcpCnsKCWlmKHRfdGFnKQoJewoJCWlmKHRfdGFnLmFsdCkgdF90YWcuYWx0ID0gIiI7CgkJaWYodF90YWcudGl0bGUpIHRfdGFnLnRpdGxlID0gIiI7CgkJdmFyIHRfYyA9IHRfdGFnLmNoaWxkcmVuIHx8IHRfdGFnLmNoaWxkTm9kZXMgfHwgbnVsbDsKCQlpZih0X2MpCgkJewoJCQlmb3IodmFyIHRfaSA9IHRfYy5sZW5ndGg7IHRfaTsgKQoJCQkJdHRfRGVBbHQodF9jWy0tdF9pXSk7CgkJfQoJfQp9CmZ1bmN0aW9uIHR0X09wRGVIcmVmKHRfZSkKewoJdmFyIHRfdGFnOwoJaWYodF9lKQoJewoJCXRfdGFnID0gdF9lLnRhcmdldDsKCQl3aGlsZSh0X3RhZykKCQl7CgkJCWlmKHRfdGFnLmhhc0F0dHJpYnV0ZSgiaHJlZiIpKQoJCQl7CgkJCQl0dF90YWcgPSB0X3RhZwoJCQkJdHRfdGFnLnRfaHJlZiA9IHR0X3RhZy5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKCQkJCXR0X3RhZy5yZW1vdmVBdHRyaWJ1dGUoImhyZWYiKTsKCQkJCXR0X3RhZy5zdHlsZS5jdXJzb3IgPSAiaGFuZCI7CgkJCQl0dF90YWcub25tb3VzZWRvd24gPSB0dF9PcFJlSHJlZjsKCQkJCXR0X3RhZy5zdGF0cyA9IHdpbmRvdy5zdGF0dXM7CgkJCQl3aW5kb3cuc3RhdHVzID0gdHRfdGFnLnRfaHJlZjsKCQkJCWJyZWFrOwoJCQl9CgkJCXRfdGFnID0gdF90YWcucGFyZW50RWxlbWVudDsKCQl9Cgl9Cn0KZnVuY3Rpb24gdHRfT3BSZUhyZWYoKQp7CglpZih0dF90YWcpCgl7CgkJdHRfdGFnLnNldEF0dHJpYnV0ZSgiaHJlZiIsIHR0X3RhZy50X2hyZWYpOwoJCXdpbmRvdy5zdGF0dXMgPSB0dF90YWcuc3RhdHM7CgkJdHRfdGFnID0gbnVsbDsKCX0KfQpmdW5jdGlvbiB0dF9TaG93KHRfZSwgdF9pZCwgdF9zdXAsIHRfY2xrLCB0X2RlbGF5LCB0X2ZpeCwgdF9sZWZ0LCB0X29mZngsIHRfb2ZmeSwgdF9zdGF0aWMsIHRfc3RpY2t5LCB0X3RlbXApCnsKCWlmKHR0X29iaikgdHRfSGlkZSgpOwoJdHRfbWYgPSBkb2N1bWVudC5vbm1vdXNlbW92ZSB8fCBudWxsOwoJaWYod2luZG93LmRkICYmICh3aW5kb3cuRFJBRyAmJiB0dF9tZiA9PSBEUkFHIHx8IHdpbmRvdy5SRVNJWkUgJiYgdHRfbWYgPT0gUkVTSVpFKSkgcmV0dXJuOwoJdmFyIHRfc2gsIHRfaDsKCgl0dF9vYmogPSB0dF9HZXREaXYodF9pZCk7CglpZih0dF9vYmopCgl7CgkJdF9lID0gdF9lIHx8IHdpbmRvdy5ldmVudDsKCQl0dF9zdWIgPSAhKHR0X3N1cCA9IHRfc3VwKTsKCQl0dF9zdGlja3kgPSB0X3N0aWNreTsKCQl0dF9vYmpXID0gdHRfR2V0RGl2VygpOwoJCXR0X29iakggPSB0dF9HZXREaXZIKCk7CgkJdHRfb2ZmWCA9IHRfbGVmdD8gLSh0dF9vYmpXK3Rfb2ZmeCkgOiB0X29mZng7CgkJdHRfb2ZmWSA9IHRfb2ZmeTsKCQlpZih0dF9vcDcpIHR0X09wRGVIcmVmKHRfZSk7CgkJaWYodHRfbjQpCgkJewoJCQlpZih0dF9vYmouZG9jdW1lbnQubGF5ZXJzLmxlbmd0aCkKCQkJewoJCQkJdF9zaCA9IHR0X29iai5kb2N1bWVudC5sYXllcnNbMF07CgkJCQl0X3NoLmNsaXAuaGVpZ2h0ID0gdHRfb2JqSCAtIE1hdGgucm91bmQodF9zaC5jbGlwLndpZHRoKjEuMyk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJdF9zaCA9IHR0X0dldERpdih0X2lkKydSJyk7CgkJCWlmKHRfc2gpCgkJCXsKCQkJCXRfaCA9IHR0X29iakggLSB0dF9JbnQodF9zaC5zdHlsZS5waXhlbFRvcCB8fCB0X3NoLnN0eWxlLnRvcCB8fCAwKTsKCQkJCWlmKHR5cGVvZiB0X3NoLnN0eWxlLnBpeGVsSGVpZ2h0ICE9IHR0X3UpIHRfc2guc3R5bGUucGl4ZWxIZWlnaHQgPSB0X2g7CgkJCQllbHNlIHRfc2guc3R5bGUuaGVpZ2h0ID0gdF9oKydweCc7CgkJCX0KCQl9CgoJCXhsaW0gPSB0dF9JbnQoKHR0X2RiICYmIHR0X2RiLmNsaWVudFdpZHRoKT8gdHRfZGIuY2xpZW50V2lkdGggOiB3aW5kb3cuaW5uZXJXaWR0aCkgKwoJCQl0dF9JbnQod2luZG93LnBhZ2VYT2Zmc2V0IHx8ICh0dF9kYj8gdHRfZGIuc2Nyb2xsTGVmdCA6IDApIHx8IDApIC0KCQkJdHRfb2JqVyAtCgkJCSh0dF9uND8gMjEgOiAwKTsKCQl5bGltID0gdHRfSW50KHdpbmRvdy5pbm5lckhlaWdodCB8fCB0dF9kYi5jbGllbnRIZWlnaHQpICsKCQkJdHRfSW50KHdpbmRvdy5wYWdlWU9mZnNldCB8fCAodHRfZGI/IHR0X2RiLnNjcm9sbFRvcCA6IDApIHx8IDApIC0KCQkJdHRfb2JqSCAtIHR0X29mZlk7CgoJCXR0X1NldERpdlooKTsKCQlpZih0X2ZpeCkgdHRfU2V0RGl2UG9zKHR0X0ludCgodF9maXggPSB0X2ZpeC5zcGxpdCgnLCcpKVswXSksIHR0X0ludCh0X2ZpeFsxXSkpOwoJCWVsc2UgdHRfU2V0RGl2UG9zKHR0X0V2WCh0X2UpLCB0dF9FdlkodF9lKSk7CgoJCXZhciB0X3R4dCA9ICd0dF9TaG93RGl2KFwndHJ1ZVwnKTsnOwoJCWlmKHRfc3RpY2t5KSB0X3R4dCArPSAneycrCgkJCQkndHRfUmVsZWFzTW92KCk7JysKCQkJCSh0X2Nsaz8gKCd3aW5kb3cudHRfdXBGdW5jID0gZG9jdW1lbnQub25tb3VzZXVwIHx8IG51bGw7JysKCQkJCSdpZih0dF9jZSkgZG9jdW1lbnQuY2FwdHVyZUV2ZW50cyhFdmVudC5NT1VTRVVQKTsnKwoJCQkJJ2RvY3VtZW50Lm9ubW91c2V1cCA9IG5ldyBGdW5jdGlvbigid2luZG93LnNldFRpbWVvdXQoXCd0dF9IaWRlKCk7XCcsIDEwKTsiKTsnKSA6ICcnKSsKCQkJJ30nOwoJCWVsc2UgaWYodF9zdGF0aWMpIHRfdHh0ICs9ICd0dF9SZWxlYXNNb3YoKTsnOwoJCWlmKHRfdGVtcCA+IDApIHRfdHh0ICs9ICd3aW5kb3cudHRfcnRtID0gd2luZG93LnNldFRpbWVvdXQoXCd0dF9zdGlja3kgPSBmYWxzZTsgdHRfSGlkZSgpO1wnLCcrdF90ZW1wKycpOyc7CgkJd2luZG93LnR0X3JkbCA9IHdpbmRvdy5zZXRUaW1lb3V0KHRfdHh0LCB0X2RlbGF5KTsKCgkJaWYoIXRfZml4KQoJCXsKCQkJaWYodHRfY2UpIGRvY3VtZW50LmNhcHR1cmVFdmVudHMoRXZlbnQuTU9VU0VNT1ZFKTsKCQkJZG9jdW1lbnQub25tb3VzZW1vdmUgPSB0dF9Nb3ZlOwoJCX0KCX0KfQp2YXIgdHRfYXJlYSA9IGZhbHNlOwpmdW5jdGlvbiB0dF9Nb3ZlKHRfZXYpCnsKCWlmKCF0dF9vYmopIHJldHVybjsKCWlmKHR0X242IHx8IHR0X3czYykKCXsKCQlpZih0dF93YWl0KSByZXR1cm47CgkJdHRfd2FpdCA9IHRydWU7CgkJc2V0VGltZW91dCgndHRfd2FpdCA9IGZhbHNlOycsIDUpOwoJfQoJdmFyIHRfZSA9IHRfZXYgfHwgd2luZG93LmV2ZW50OwoJdHRfU2V0RGl2UG9zKHR0X0V2WCh0X2UpLCB0dF9FdlkodF9lKSk7CglpZih3aW5kb3cudHRfb3A2KQoJewoJCWlmKHR0X2FyZWEgJiYgdF9lLnRhcmdldC50YWdOYW1lICE9ICdBUkVBJykgdHRfSGlkZSgpOwoJCWVsc2UgaWYodF9lLnRhcmdldC50YWdOYW1lID09ICdBUkVBJykgdHRfYXJlYSA9IHRydWU7Cgl9Cn0KZnVuY3Rpb24gdHRfSGlkZSgpCnsKCWlmKHdpbmRvdy50dF9vYmopCgl7CgkJaWYod2luZG93LnR0X3JkbCkgd2luZG93LmNsZWFyVGltZW91dCh0dF9yZGwpOwoJCWlmKCF0dF9zdGlja3kgfHwgIXR0X2FjdCkKCQl7CgkJCWlmKHdpbmRvdy50dF9ydG0pIHdpbmRvdy5jbGVhclRpbWVvdXQodHRfcnRtKTsKCQkJdHRfU2hvd0RpdihmYWxzZSk7CgkJCXR0X1NldERpdlBvcygtdHRfb2JqVywgLXR0X29iakgpOwoJCQl0dF9vYmogPSBudWxsOwoJCQlpZih0eXBlb2Ygd2luZG93LnR0X3VwRnVuYyAhPSB0dF91KSBkb2N1bWVudC5vbm1vdXNldXAgPSB3aW5kb3cudHRfdXBGdW5jOwoJCX0KCQl0dF9zdGlja3kgPSBmYWxzZTsKCQlpZih0dF9vcDYgJiYgdHRfYXJlYSkgdHRfYXJlYSA9IGZhbHNlOwoJCXR0X1JlbGVhc01vdigpOwoJCWlmKHR0X29wNykgdHRfT3BSZUhyZWYoKTsKCX0KfQpmdW5jdGlvbiB0dF9Jbml0KCkKewoJaWYoISh0dF9vcCB8fCB0dF9uNCB8fCB0dF9uNiB8fCB0dF9pZSB8fCB0dF93M2MpKSByZXR1cm47CgoJdmFyIGh0bSA9IHR0X240PyAnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7Ij48L2Rpdj4nIDogJycsCgl0YWdzLAoJdF90aiwKCW92ZXIsCgl0X2IsCgllc2MgPSAncmV0dXJuIGVzY2FwZSgnOwoJZm9yKHZhciBpID0gdHRfdGFncy5sZW5ndGg7IGk7KQoJey0taTsKCQl0YWdzID0gdHRfaWU/IChkb2N1bWVudC5hbGwudGFncyh0dF90YWdzW2ldKSB8fCAxKQoJCQk6IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lPyAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHRfdGFnc1tpXSkgfHwgMSkKCQkJOiAoIXR0X240ICYmIHR0X3RhZ3NbaV09PSJhIik/IGRvY3VtZW50LmxpbmtzCgkJCTogMTsKCQlpZih0dF9uNCAmJiAodHRfdGFnc1tpXSA9PSAiYSIgfHwgdHRfdGFnc1tpXSA9PSAibGF5ZXIiKSkgdGFncyA9IHR0X040VGFncyh0dF90YWdzW2ldKTsKCQlmb3IodmFyIGogPSB0YWdzLmxlbmd0aDsgajspCgkJey0tajsKCQkJaWYodHlwZW9mICh0X3RqID0gdGFnc1tqXSkub25tb3VzZW92ZXIgPT0gImZ1bmN0aW9uIiAmJiB0X3RqLm9ubW91c2VvdmVyLnRvU3RyaW5nKCkuaW5kZXhPZihlc2MpICE9IC0xICYmICF0dF9uNiB8fCB0dF9uNiAmJiAob3ZlciA9IHRfdGouZ2V0QXR0cmlidXRlKCJvbm1vdXNlb3ZlciIpKSAmJiBvdmVyLmluZGV4T2YoZXNjKSAhPSAtMSkKCQkJewoJCQkJaWYob3ZlcikgdF90ai5vbm1vdXNlb3ZlciA9IG5ldyBGdW5jdGlvbihvdmVyKTsKCQkJCXZhciB0eHQgPSB1bmVzY2FwZSh0X3RqLm9ubW91c2VvdmVyKCkpOwoJCQkJaHRtICs9IHR0X0h0bSgKCQkJCQl0X3RqLAoJCQkJCSJ0T29MdElwIitpKyIiK2osCgkJCQkJdHh0Lnd6UmVwbGFjZSgiJiAiLCImIikKCQkJCSk7CgkJCQkvLyB3aW5kb3cuIHRvIGNpcmN1bXZlbnQgdGhlIEZGIEFsemhlaW1lciBCdWcKCQkJCXRfdGoub25tb3VzZW92ZXIgPSBuZXcgRnVuY3Rpb24oJ2UnLAoJCQkJCSdpZih3aW5kb3cudHRfU2hvdyAmJiB0dF9TaG93KSB0dF9TaG93KGUsJysKCQkJCQknInRPb0x0SXAnICtpKycnK2orICciLCcrCgkJCQkJKCh0eXBlb2YgdF90ai5UX0FCT1ZFICE9IHR0X3UpPyB0X3RqLlRfQUJPVkUgOiB0dEFib3ZlKSsnLCcrCgkJCQkJKCh0eXBlb2YgdF90ai5UX0NMSUNLQ0xPU0UgIT0gdHRfdSk/IHRfdGouVF9DTElDS0NMT1NFIDogdHRDbGlja0Nsb3NlKSsnLCcrCgkJCQkJKCh0eXBlb2YgdF90ai5UX0RFTEFZICE9IHR0X3UpPyB0X3RqLlRfREVMQVkgOiB0dERlbGF5KSsnLCcrCgkJCQkJKCh0eXBlb2YgdF90ai5UX0ZJWCAhPSB0dF91KT8gJyInK3RfdGouVF9GSVgrJyInIDogJyIiJykrJywnKwoJCQkJCSgodHlwZW9mIHRfdGouVF9MRUZUICE9IHR0X3UpPyB0X3RqLlRfTEVGVCA6IHR0TGVmdCkrJywnKwoJCQkJCSgodHlwZW9mIHRfdGouVF9PRkZTRVRYICE9IHR0X3UpPyB0X3RqLlRfT0ZGU0VUWCA6IHR0T2Zmc2V0WCkrJywnKwoJCQkJCSgodHlwZW9mIHRfdGouVF9PRkZTRVRZICE9IHR0X3UpPyB0X3RqLlRfT0ZGU0VUWSA6IHR0T2Zmc2V0WSkrJywnKwoJCQkJCSgodHlwZW9mIHRfdGouVF9TVEFUSUMgIT0gdHRfdSk/IHRfdGouVF9TVEFUSUMgOiB0dFN0YXRpYykrJywnKwoJCQkJCSgodHlwZW9mIHRfdGouVF9TVElDS1kgIT0gdHRfdSk/IHRfdGouVF9TVElDS1kgOiB0dFN0aWNreSkrJywnKwoJCQkJCSgodHlwZW9mIHRfdGouVF9URU1QICE9IHR0X3UpPyB0X3RqLlRfVEVNUCA6IHR0VGVtcCkrCgkJCQkJJyk7JwoJCQkJKTsKCQkJCXRfdGoub25tb3VzZW91dCA9IHR0X0hpZGU7CgkJCQl0dF9EZUFsdCh0X3RqKTsKCQkJfQoJCX0KCX0KCWlmKHR0X2llNikgaHRtICs9ICc8aWZyYW1lIGlkPSJUVGlFaUZyTSIgc3JjPSJqYXZhc2NyaXB0OmZhbHNlIiBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0iMCIgc3R5bGU9ImZpbHRlcjpBbHBoYShvcGFjaXR5PTApO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowcHg7bGVmdDowcHg7ZGlzcGxheTpub25lOyI+PC9pZnJhbWU+JzsKCXRfYiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lPyBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdIDogdHRfZGI7CglpZih0X2IgJiYgdF9iLmluc2VydEFkamFjZW50SFRNTCkgdF9iLmluc2VydEFkamFjZW50SFRNTCgiQWZ0ZXJCZWdpbiIsIGh0bSk7CgllbHNlIGlmKHRfYiAmJiB0eXBlb2YgdF9iLmlubmVySFRNTCAhPSB0dF91ICYmIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgdF9iLmFwcGVuZENoaWxkKQoJewoJCXZhciB0X2VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgkJdF9iLmFwcGVuZENoaWxkKHRfZWwpOwoJCXRfZWwuaW5uZXJIVE1MID0gaHRtOwoJfQoJZWxzZQoJCWRvY3VtZW50LndyaXRlKGh0bSk7CglpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCkgdHRfaWZybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJUVGlFaUZyTSIpOwp9CnR0X0luaXQoKTsK'></script>


        <script id=script_toggle>
                function toggle(divid) {
                        var imgid=divid.replace("div_","img_" );
                        if(! document.getElementById(divid)) { return; }

                        var imgid=divid.replace("div_","img_" );
                        style_display=document.getElementById(divid).style.display;

                        if( style_display == "none" ) {
                                img="<img src=/imgs/btn/koeyew.png id="+imgid+" height=75 onclick=\"toggle('"+divid+"'); return false;\" >";
                                document.getElementById(divid).style.display="inline";
                                document.getElementById(imgid).innerHTML=img;
                                document.getElementById(imgid).src="/imgs/btn/koeyew.png";
//                              alert( "BUGS_37891 INLINE img="+img );
                                }
                       else {
                                img="<img src=/imgs/btn/koeyeb.png id="+imgid+" height=75 onclick=\"toggle('"+divid+"'); return false;\" >";

                                document.getElementById(divid).style.display="none";
                                document.getElementById(imgid).innerHTML=img;
                                document.getElementById(imgid).src="/imgs/btn/koeyeb.png";
                                }
                        }
                </script id=script_toggle_end>





	<script id="toggles">
		function toggles(div_ids,cmd) {
			htmout=0; j=0; k=0; divid=""; divids="".split(" ");
//			alert( "BUGS_200 toggles div_ids="+div_ids+" cmd="+cmd );
			var ids = "letter contacts items kojax files parse cfg main help wz konet iperms jtfdcr fb pdf pn tm tl zm file forms lists lists_letters lists_contacts lists_items lists_postturtles lists_monkeytraps lists_floods koslots views fb pdf pn tl zm mp3 mp4";

			if( div_ids == "" ) {
				for(j=0; j<ids.split(" ").length; j++ ) {
					divids[j]="div_"+ids.split(" ")[j];
//					alert( "BUGS_210 j="+j+" divid="+divid)
					}
//				alert( "BUGS_211 j="+j+" div_ids="+div_ids+" divids0="+divids[0] );
				}
			else {
				divids=div_ids.split(" ")
//				alert( "BUGS_212 j="+j+" div_ids="+div_ids+" divids0="+divids[0] );
				}
//			alert( "BUGS_220 toggles divids_length="+divids.length+" cmd="+cmd );

			for( j=0; j<divids.length; j++ ) {
				divid=divids[j];
				imgid=divid.replace("div_","img_");
//				alert( "BUGS_221 toggles j="+j+" divid="+divid+" cmd="+cmd+" imgid="+imgid );

				if( ! document.getElementById(divid)) { continue; }
//				alert( "BUGS_222 toggles j="+j+" FOUND divid="+divid+" cmd="+cmd+" imgid="+imgid );

				if( cmd == "allon" ) {
//					alert( "BUGS_230 toggles ALLON div_ids="+div_ids+" cmd="+cmd );
					document.getElementById(divid).style.display="inline";
					if (! document.getElementById(imgid)) { continue; }
					document.getElementById(imgid).src="/imgs/btn/koeyew.png";

//					if( document.getElementById('img_toggle_allon')) {
//						document.getElementById('img_toggle_allon').style.display="inline";
//						}
//					if( document.getElementById('img_toggle_toggle')) {
//						document.getElementById('img_toggle_toggle').style.display="inline";
//						}
//					if( document.getElementById('img_toggle_alloff')) {
//						document.getElementById('img_toggle_alloff').style.display="inline";
//						}
					}


				if(( cmd == "toggle" ) || ( cmd == "" )) {
					display=document.getElementById(divid).style.display;
					if( display == "none" ) {
						document.getElementById(divid).style.display="inline";
						if (document.getElementById(imgid)) { 
							document.getElementById(imgid).src="/imgs/btn/koeyew.png";
							}
						}
					else {
						document.getElementById(divid).style.display="none";
						if (document.getElementById(imgid)) { 
							document.getElementById(imgid).src="/imgs/btn/koeyeb.png";
							}
						}
					}

				if( cmd == "alloff" ) {
					document.getElementById(divid).style.display="none";
					if (! document.getElementById(imgid)) { continue; }
					document.getElementById(imgid).src="/imgs/btn/koeyeb.png";
//					if( document.getElementById('img_toggle_allon')) {
//						document.getElementById('img_toggle_allon').style.display="inline";
//						}
//					if( document.getElementById('img_toggle_toggle')) {
//						document.getElementById('img_toggle_toggle').style.display="none";
//						}
//					if( document.getElementById('img_toggle_alloff')) {
//						document.getElementById('img_toggle_alloff').style.display="none";
//						}
					}


				}

			return("");



			var htmout = ""; var htmout_b = ""; 
			var j=0; var k=0;
			var htmbugs = ""; 
			htmbugs += '<div id="div_htmbugs">';
			htmbugs += '	<h1>div_htmbugs</h1>';
			htmbugs += '	<pre>';

			var style_d = "_style_d";
			var style_v = "_style_v";
			var divid = "";
			var div_divid = "";
//			var divids = "konet iperms <hr> jkwii jk sk skwii <hr> jtfdc jtfinc jtfdcr <hr> law med kou kids <hr> av db dd fb pn sl tl tm yt zm <hr> abc media files misc mess xyz".split(" ");
			var divids = "konet iperms jtfdcr <hr> fb pdf pn tm tl zm <hr> file forms".split(" ");

			
//			alert( "BUGS_102 divids="+divids );
			htmout += '<div id="div_buttons_toggle">';
			htmout_b += '<div id="div_buttons_toggle_b">';


			if(( element == "div_alloff" )) {
				for( j=0; j<divids.length; j++ ) {
//					htmout = ""; htmout_b="";
					divid=divids[j];
					div_divid="div_"+divid;
					if( divid == "<br>" ) { 
						htmout += divid; 
						htmout_b += divid; 
						continue; 
						}
					if( divid == "<hr>" ) { 
						htmout += divid; 
						htmout_b += divid; 
						continue; 
						}

					if(! document.getElementById(div_divid)) { continue; }
					if( document.getElementById(div_divid)) {
						document.getElementById(div_divid).style.display="none";
						}
					htmout += '<img src="/imgs/btn/koeyeb_'+divid+'.png" height=50 onclick="toggles(\''+divid+'\');return false;" alt="btn_'+divid+'">';
					htmout_b += '<img src="/imgs/btn/koeyeb_'+divid+'.png" height=50 onclick="toggles(\''+divid+'\');return false;" alt="btn_'+divid+'">';

					}
				htmout += "	</div>\n";
				htmout_b += "	</div>\n";
				document.getElementById("div_buttons_toggle").innerHTML = htmout;
				document.getElementById("div_buttons_toggle_b").innerHTML = htmout_b;
				return;
				}


			if(( element == "div_toggle" )) {
//				htmout = ""; htmout_b="";
 				for( j=0; j<divids.length; j++ ) {
 					divid=divids[j];
					div_divid="div_"+divid;
					if( divid == "<br>" ) { 
						htmout += divid; 
						htmout_b += divid; 
						continue; 
						}
					if( divid == "<hr>" ) { 
						htmout += divid; 
						htmout_b += divid; 
						continue; 
						}

//					alert( "BUGS_1770 toggle toggle j="+j+" element="+element );

					if(! document.getElementById(div_divid)) { continue; }
					if( document.getElementById(div_divid)) {
						if( document.getElementById(div_divid).style.display == "none" ) {
							document.getElementById(div_divid).style.display="inline";
							htmout += '<img src="/imgs/btn/koeyew_'+divid+'.png" height=50 onclick="toggles(\''+divid+'\');return false;" alt="btn_'+divid+'">';
							htmout_b += '<img src="/imgs/btn/koeyew_'+divid+'.png" height=50 onclick="toggles(\''+divid+'\');return false;" alt="btn_'+divid+'">';
							}
						else {
							document.getElementById(div_divid).style.display="none";
							htmout += '<img src="/imgs/btn/koeyeb_'+divid+'.png" height=50 onclick="toggles(\''+divid+'\');return false;" alt="btn_'+divid+'">';
							htmout_b += '<img src="/imgs/btn/koeyeb_'+divid+'.png" height=50 onclick="toggles(\''+divid+'\');return false;" alt="btn_'+divid+'">';
							}
						}
					}
				htmout += "	</div>\n";
				htmout_b += "	</div>\n";
				document.getElementById("div_buttons_toggle").innerHTML = htmout;
				document.getElementById("div_buttons_toggle_b").innerHTML = htmout_b;
				return;
				}




			if( element == "div_allon" )  {
//				htmout = ""; htmout_b = "";
 				for( j=0; j<divids.length; j++ ) {
 					divid=divids[j];
					div_divid="div_"+divid;
					if( divid == "<br>" ) { 
						htmout += divid; 
						htmout_b += divid;
//						alert( "BUGS_105 <BR> divid="+divid+" htmout="+htmout );
						continue; 
						}
					if( divid == "<hr>" ) { 
						htmout += divid; 
						htmout_b += divid; 
//						alert( "BUGS_105 <HR> divid="+divid+" htmout="+htmout );
						continue; 
						}


					if(! document.getElementById(div_divid)) { continue; }
					if( document.getElementById(div_divid)) {
						document.getElementById(div_divid).style.display="inline";
						}

					htmout += '<img src="/imgs/btn/koeyew_'+divid+'.png" height=50 onclick="toggles(\''+divid+'\');return false;" alt="btn_'+divid+'">\n';
					htmout_b += '<img src="/imgs/btn/koeyew_'+divid+'.png" height=50 onclick="toggles(\''+divid+'\');return false;" alt="btn_'+divid+'">\n';
//					alert( "BUGS_115 j="+j+" divid="+divid+" htmout="+htmout+ "element="+element );

					}
				document.getElementById("div_buttons_toggle").innerHTML = htmout;
				document.getElementById("div_buttons_toggle_b").innerHTML = htmout_b;
				return;
				}

//			alert( "BUGS_1800 toggle element="+element );


 			for( j=0; j<divids.length; j++ ) {
 				divid=divids[j];
				div_divid="div_"+divid;
				if( divid == "<br>" ) { 
//					alert( "BUGS_151 <BR> divid="+divid+" element="+element );
					htmout += divid;
					continue; 
					}
				if( divid == "<hr>" ) { 
//					alert( "BUGS_152 <HR> divid="+divid+" element="+element );
					htmout += divid;
					continue; 
					}

				if(! document.getElementById(div_divid)) { continue; }

				style_v = document.getElementById(div_divid).style.visibility;
//				alert( "BUGS_132 j="+j+" style_d="+style_d+"  style_v="+style_v );
//				document.getElementById(div_divid).style.display = "none";

				style_d = document.getElementById(div_divid).style.display;
//				alert( "BUGS_133 j="+j+" style_d="+style_d+" style_v="+style_v );

				htmbugs += "htmbugs j="+j+" divid="+divid;
				htmbugs += " -== div_divid="+div_divid;
				htmbugs += " element="+element;
				htmbugs += " =- -=";
				htmbugs += " style_d="+style_d+"";
				htmbugs += " style_v="+style_v+"";
				htmbugs += "====================\n";


//				if( div_divid.match(/element/) != '') {
//				if( div_divid.match(element)) {
//				if( div_divid == element ) {
//					alert( "BUGS_141 _MATCH_ div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v );
//					htmbugs += "BUGS_141 _MATCH_ div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v;
//					}
//				else {
//					alert( "BUGS_142 nomatch div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v );
//					htmbugs += "BUGS_142 _match_ div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v;
//					}


// selected button
//				if( div_divid.match(element) ) {
				if( div_divid == element ) {
					style_d = document.getElementById(div_divid).style.display;
//					alert( "BUGS_160 MATCH div_divid="+div_divid+" element="+element+" style_d="+style_d );
					if( document.getElementById(div_divid).style.display == "none" ) {
						htmout += '<img src="/imgs/btn/koeyew_'+divid+'.png" height=50 onclick="toggles(\''+div_divid+'\');return false;" alt="btn_'+divid+'_hide">';
						htmbugs += "BUGS_161 _DIV_DIVID-NONE div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v;
						document.getElementById(div_divid).style.display="inline";
						}
					else {
						htmout += '<img src="/imgs/btn/koeyeb_'+divid+'.png" height=50 onclick="toggles(\''+div_divid+'\');return false;" alt="btn_'+divid+'_hide">';
						htmbugs += "BUGS_162 DIV_DIVID-INLINE div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v;
						document.getElementById(div_divid).style.display="none";
						}
					}


// other buttons
//				else {
				if( div_divid != element ) {
//					alert( "BUGS_170 rest div_divid="+div_divid+" element="+element );
					if( document.getElementById(div_divid).style.display == "none" ) {
						htmout += '<img src="/imgs/btn/koeyeb_'+divid+'.png" height=50 onclick="toggles(\''+div_divid+'\');return false;" alt="btn_'+divid+'_hide">';
						htmbugs += "BUGS_171 div_divid_none div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v;
						}
					else {
						htmout += '<img src="/imgs/btn/koeyew_'+divid+'.png" height=50 onclick="toggles(\''+div_divid+'\');return false;" alt="btn_'+divid+'_hide">';
						htmbugs += "BUGS_172 div_divid_inline div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v;
						}
					}
				if( divid == "pn" ) { htmout += "<br>"; }
				if( divid == "<br>" ) { htmout += "<br>\n"; }
				if( divid == "<hr>" ) { htmout += "<hr>\n"; }
				}  
			htmout += '	</div>';

			htmbugs += "	</pre>";
			htmbugs += "	</div>";			

//			alert( "BUGS_181 toggles divid="+divid+" htmout="+htmout );
//			alert( "BUGS_200 htmbugs="+htmbugs );	
//			document.getElementById("div_htmbugs").innerHTML = htmbugs;
			document.getElementById("div_buttons_toggle").innerHTML = htmout;
			document.getElementById("div_buttons_toggle_b").innerHTML = htmout;
			}
 		</script>




	<script id=script_startup>
		function startup(args) {
//			alert( "BUGS_1540 startup args="+args );
			htmout="";
//			htmout += banner(args)
//			alert( "BUGS_1541 startup letter args="+args );
			htmout += letter(args);
//			alert( "BUGS_1542 startup contacts args="+args );
			htmout += contacts(args);
//			alert( "BUGS_1543 startup items args="+args );
			htmout += items(args);
//			alert( "BUGS_1545 startup args="+args );

//			htmout += dhtml(args);
//			alert(htmout);
//			htmout += head(args);
//			alert(htmout);
//			htmout += tail(args);
//			alert(htmout);
//			return(htmout);
			}
		</script id=script_head_end>

	<script id=script_items1>
		function items1(args) {
			htmout=""; j=0; k=0; i=0;
			alert(htmout);
			divid="div_items";



items=`
/imgs/btn/koeye_handhither.gif|koeye_handhither
/byrdbellvjk/imgs/01.jpg|/imgs/01
/byrdbellvjk/imgs/100.jpg|/imgs/100
/byrdbellvjk/imgs/100_jtfdcr_2013_byrd_threat.jpg|/imgs/100_jtfdcr_2013_byrd_threat
/byrdbellvjk/imgs/100_jtfdcr_byrd_seigrist_2dogs_trespas.jpg|/imgs/100_jtfdcr_byrd_seigrist_2dogs_trespas
/byrdbellvjk/imgs/100_jtfdcr_byrd_seigrist_2dogs_trespass2.jpg|/imgs/100_jtfdcr_byrd_seigrist_2dogs_trespass2
/byrdbellvjk/imgs/100_jtfdcr_byrd_seigrist_3dogs_after_heartrequest.jpg|/imgs/100_jtfdcr_byrd_seigrist_3dogs_after_heartrequest
/byrdbellvjk/imgs/100_jtfdcr_byrds_theft_sawhorse.jpg|/imgs/100_jtfdcr_byrds_theft_sawhorse
/byrdbellvjk/imgs/100_zn_16.jpg|/imgs/100_zn_16
/byrdbellvjk/imgs/100_zn_21.jpg|/imgs/100_zn_21
/byrdbellvjk/imgs/113.jpg|/imgs/113
/byrdbellvjk/imgs/115.jpg|/imgs/115
/byrdbellvjk/imgs/116.jpg|/imgs/116
/byrdbellvjk/imgs/124.jpg|/imgs/124
/byrdbellvjk/imgs/170.jpg|/imgs/170
/byrdbellvjk/imgs/171.jpg|/imgs/171
/byrdbellvjk/imgs/202.jpg|/imgs/202
/byrdbellvjk/imgs/203.jpg|/imgs/203
/byrdbellvjk/imgs/204.jpg|/imgs/204
/byrdbellvjk/imgs/205.jpg|/imgs/205
/byrdbellvjk/imgs/206.jpg|/imgs/206
/byrdbellvjk/imgs/207.jpg|/imgs/207
/byrdbellvjk/imgs/208.jpg|/imgs/208
/byrdbellvjk/imgs/209.jpg|/imgs/209
/byrdbellvjk/imgs/210.jpg|/imgs/210
/byrdbellvjk/imgs/211.jpg|/imgs/211
/byrdbellvjk/imgs/212.jpg|/imgs/212
/byrdbellvjk/imgs/22.jpg|/imgs/22
/byrdbellvjk/imgs/222.jpg|/imgs/222
/byrdbellvjk/imgs/229.jpg|/imgs/229
/byrdbellvjk/imgs/232.jpg|/imgs/232
/byrdbellvjk/imgs/233.jpg|/imgs/233
/byrdbellvjk/imgs/26.jpg|/imgs/26
/byrdbellvjk/imgs/27.jpg|/imgs/27
/byrdbellvjk/imgs/28.jpg|/imgs/28
/byrdbellvjk/imgs/29.jpg|/imgs/29
/byrdbellvjk/imgs/30.jpg|/imgs/30
/byrdbellvjk/imgs/31.jpg|/imgs/31
/byrdbellvjk/imgs/32.jpg|/imgs/32
/byrdbellvjk/imgs/33.jpg|/imgs/33
/byrdbellvjk/imgs/34.jpg|/imgs/34
/byrdbellvjk/imgs/36.jpg|/imgs/36
/byrdbellvjk/imgs/42.jpg|/imgs/42
/byrdbellvjk/imgs/43.jpg|/imgs/43
/byrdbellvjk/imgs/44.jpg|/imgs/44
/byrdbellvjk/imgs/46.jpg|/imgs/46
/byrdbellvjk/imgs/550_head_jtfdcr_police_neiborhood.jpg|/imgs/550_head_jtfdcr_police_neiborhood
/byrdbellvjk/imgs/63.jpg|/imgs/63
/byrdbellvjk/imgs/66.jpg|/imgs/66
/byrdbellvjk/imgs/71.jpg|/imgs/71
/byrdbellvjk/imgs/900_136.jpg|/imgs/900_136
/byrdbellvjk/imgs/900_68.jpg|/imgs/900_68
/byrdbellvjk/imgs/900_byrdbell_20200916.jpg|/imgs/900_byrdbell_20200916
/byrdbellvjk/imgs/900_byrdbell_20200916_1.jpg|/imgs/900_byrdbell_20200916_1
/byrdbellvjk/imgs/900_emh_20160911_056.jpg|/imgs/900_emh_20160911_056
/byrdbellvjk/imgs/900_emh_20160911_058.jpg|/imgs/900_emh_20160911_058
/byrdbellvjk/imgs/900_emh_20160911_059.jpg|/imgs/900_emh_20160911_059
/byrdbellvjk/imgs/900_IMG_0574.jpg|/imgs/900_IMG_0574
/byrdbellvjk/imgs/900_IMG_0577.jpg|/imgs/900_IMG_0577
/byrdbellvjk/imgs/900_jtfdc_private_court_since_1979_viewin.jpg|/imgs/900_jtfdc_private_court_since_1979_viewin
/byrdbellvjk/imgs/900_jtfinc.jpg|/imgs/900_jtfinc
/byrdbellvjk/imgs/900_snap_20170123_187559_jtfdc_kids_cycle_laps.jpg|/imgs/900_snap_20170123_187559_jtfdc_kids_cycle_laps
/byrdbellvjk/imgs/900_snap_20170123_187576_jtf32_preservation_police_yellowsticker_frenzy.jpg|/imgs/900_snap_20170123_187576_jtf32_preservation_police_yellowsticker_frenzy
/byrdbellvjk/imgs/900_snap_20170123_197616_law_donovan_joann1.jpg|/imgs/900_snap_20170123_197616_law_donovan_joann1
/byrdbellvjk/imgs/900_stlcounty_kassil_bench_probaton_20170918-1818_001.jpg|/imgs/900_stlcounty_kassil_bench_probaton_20170918-1818_001
/byrdbellvjk/imgs/900_topos.jpg|/imgs/900_topos
/byrdbellvjk/imgs/900_topos_20160505_031.jpg|/imgs/900_topos_20160505_031
/byrdbellvjk/imgs/900_zn_4.jpg|/imgs/900_zn_4
/byrdbellvjk/imgs/jtfdc_sawhorse_2020.jpg|/imgs/jtfdc_sawhorse_2020
/byrdbellvjk/imgs/snap_202209156950.png|/imgs/snap_202209156950
/byrdbellvjk/imgs/snap_202209156951.png|/imgs/snap_202209156951
/byrdbellvjk/imgs/snap_202209156952.png|/imgs/snap_202209156952
/byrdbellvjk/imgs/snap_202209156953.png|/imgs/snap_202209156953
/byrdbellvjk/imgs/snap_202209156954.png|/imgs/snap_202209156954
/byrdbellvjk/imgs/snap_202209156955.png|/imgs/snap_202209156955
/byrdbellvjk/imgs/snap_202209156956.png|/imgs/snap_202209156956
/byrdbellvjk/imgs/snap_202209156957.png|/imgs/snap_202209156957
/byrdbellvjk/imgs/snap_202209156958.png|/imgs/snap_202209156958
/byrdbellvjk/imgs/snap_202209156959.png|/imgs/snap_202209156959
/byrdbellvjk/imgs/snap_202209156960.png|/imgs/snap_202209156960
/byrdbellvjk/imgs/snap_202209156961.png|/imgs/snap_202209156961
/byrdbellvjk/imgs/snap_202209156962.png|/imgs/snap_202209156962
/byrdbellvjk/imgs/snap_202209156963.png|/imgs/snap_202209156963
/byrdbellvjk/imgs/snap_202209156964.png|/imgs/snap_202209156964
/byrdbellvjk/imgs/snap_202209156965.png|/imgs/snap_202209156965
/byrdbellvjk/imgs/snap_202209156966.png|/imgs/snap_202209156966
/byrdbellvjk/imgs/snap_202209156967.png|/imgs/snap_202209156967
/byrdbellvjk/imgs/snap_202209156968.png|/imgs/snap_202209156968
/byrdbellvjk/imgs/snap_202209156969.png|/imgs/snap_202209156969
`.split("\n");



items1=`
170.jpg|jtfdc_sawhorse_original
171.jpg|jtfinc_entrance
900_jtfdc_private_court_since_1979_viewin.jpg|jtfdc_viewin
900_jtfinc.jpg|
900_snap_20170123_187559_jtfdc_kids_cycle_laps|jtfdc_cycle_kids
900_snap_20170123_187576_jtf32_preservation_police_yellowsticker_frenzy
jtfdc_sawhorse_2020.jpg|jtfdc_sawhorse_2020
100_jtfdcr_2013_byrd_threat.jpg|jtfdcr_2013_byrd_threat
116.jpg|sign_private|jtfdc_sign_private_green
100.jpg|jtfdc_birdview|jtfdc_birdview
44.jpg|byrd_siegrist_dogs3.jpg|byrd_sieggrist_dogs3
66.jpg|jtf28-30-32_eagle_theft.jpg|jtf29_eagle_theft_jtf28-30-32
46.jpg|byrds_sawhorse_theft|jtf29_byrds_sawhorse_theft
32.jpg|jtfdcr_cover|jtfdcr_cover
31.jpg|who2jail
900_byrdbell_20200916.jpg|jkmed_eyes
900_emh_20160911_056.jpg|jkmed_heart
100_jtfdcr_byrd_seigrist_2dogs_trespass2|100_jtfdcr_byrd_seigrist_2dogs_trespass2
900_IMG_0577.jpg|jtf29_police_door_entry
900_IMG_0574.jpg|jtf29_doorchimes
229.jpg|trial3_brown_bench_probation_nocameras_notrespass
900_topos_20160505_031.jpg|police_jahns_card
`.split("\n");

			htmout+="<div id=div_items>\n";
			htmout+="<h1>div_items</h1>\n";
			htmout+="<table id=table_items>\n";
			htmout+="<tr>\n";
			htmout+="	<td>num</td>";
			htmout+="	<td>link</td>";
			htmout+="<	td>desc</td>";
			htmout+="	</tr>\n";
			alert( "BUGS_360 IIIIIIIIIIIIIIII htmout="+htmout );

 			for( j=0; j<items.length; j++ ) {
 				file=""; desc="";
 				file=items[j].split("|")[0];
 				desc=items[j].split("|")[1];
 				pathfile="/byrdbellvjk/imgs/"+file;
				alert( "BUGS_360 j="+j+" file="+file+" JJJJJJJJJJJJJJ\n" );
 				url="";
 				url+="<a href="+pathfile+" target=_blank>";
 				url+="	<img id=img_item_"+j+" src="+tn+" height=100 border=0>";
 				url+= "	</a>";

				id=name;
				tn="/imgs/btn/kow.png";
				alert( "BUGS_505 LETTER id="+id+" tn="+tn );
 				url_letter=""; 
				url_letter=url;

 
 				htmout += "<tr>\n";
 				htmout += "	<td>"+j+"</td>";
 				htmout += "	<td>"+url+"</td>";
 				htmout += "	<td>"+desc+"</td>";
 				htmout += "	</tr>\n";
 				}
 			htmout += "	</table id=table_items>\n";
 			htmout += "	</div id=div_items>\n";
			htmout += "<h1>BUGS_ABC xxxxxxxxxxxxxxxx</h1>\n";

			alert( "<h1>BUGS_370 ITEMS JJJJJJJJJJJJJJJJJJJ htmout="+htmout+"<h1>\n";
 			divid="div_items";
			htmout += "<h1>div_items</h1>\n";
 			if( document.getElementById(divid)) {
				document.getElementById(divid).innerHTML=htmout;
 				}
			return(htmout);
			}
		</script id=script_items_end>

	<script id=script_items>
		function items(args) {
			divid="div_items";
			alert( "BUGS_1740 items args="+args );
			htmout=""; j=0; k=0;
			ht="/byrdbellvjk/imgs/";
			divid="div_items";
//			htmout += "<h1>BUGS_21 CONTACTS args="+args+"</h1>\n";
//			alert(htmout);
//			return(htmout);

//			alert( "BUGS_710 ITEMS args="+args+"\n");
			htmout=""; j=0; k=0; i=0;
			htmout_wz="";
			divid="div_item"+i;
			imgid="img_item"+i;
			src="/imgs/btn/koeye.png";
			divids = new Array();
			imgids = new Array();
			divids[0]=divid;
			imgids[0]=imgid;
//			alert( "BUGS_720 items args="+args );

items=`
file|desc|
170.jpg|jtfdc_sawhorse_original
171.jpg|jtfinc_entrance
900_jtfdc_private_court_since_1979_viewin.jpg|jtfdc_viewin
900_jtfinc.jpg|
900_snap_20170123_187559_jtfdc_kids_cycle_laps|jtfdc_cycle_kids
900_snap_20170123_187576_jtf32_preservation_police_yellowsticker_frenzy
jtfdc_sawhorse_2020.jpg|jtfdc_sawhorse_2020
100_jtfdcr_2013_byrd_threat.jpg|jtfdcr_2013_byrd_threat
116.jpg|sign_private|jtfdc_sign_private_green
100.jpg|jtfdc_birdview|jtfdc_birdview
44.jpg|byrd_siegrist_dogs3.jpg|byrd_sieggrist_dogs3
66.jpg|jtf28-30-32_eagle_theft.jpg|jtf29_eagle_theft_jtf28-30-32
46.jpg|byrds_sawhorse_theft|jtf29_byrds_sawhorse_theft
32.jpg|jtfdcr_cover|jtfdcr_cover
31.jpg|who2jail
900_byrdbell_20200916.jpg|jkmed_eyes
900_emh_20160911_056.jpg|jkmed_heart
100_jtfdcr_byrd_seigrist_2dogs_trespass2|100_jtfdcr_byrd_seigrist_2dogs_trespass2
900_IMG_0577.jpg|jtf29_police_door_entry
900_IMG_0574.jpg|jtf29_doorchimes
229.jpg|trial3_brown_bench_probation_nocameras_notrespass
900_topos_20160505_031.jpg|police_jahns_card
`.split("\n");

// items=`
// name|phn|url|email|note|action
// greg luber|314-|https://501law.com|email|note|action|
// henry elster|314-|https://elsterlaw.com|email|note|action|
// dan diemer|314-863-8833|https://diemerlawfirm.com/|email|note|action|
// joe whitner|314-354-8484|https://rsblawfirm.com|email|note|action|
// todo|phn|url|email|note|action
// brown|314-|https://brown..com|email|note|action
// keuhlig|314-|https://keyhlig..com|email|note|action
// walters|314-|https://walters|email|note|action
// columbo|314-|https://columbo|email|note|action
// fail|phn|url|email|note|action
// mccloskey|314-721-4000|https://www.mccloskeylaw.com/|email|note|action|
// richard woolf|314-345-5030|https://bakersterchi.com|rwoolf@bakersterchi.com|email|note|action|
// keven dolley|314-293-4884|https://www.missouriemploymentlawattorney.com|email|note|action|
// richard sindel|314-721-6040|https://sindellaw.com|email|note|action|
// evelyn lewis|314-721-6040|https://evelynlewislawllc.com|email|note|action|
// `.split("\n");
 
//			alert( "BUGS_431 items items="+items[0] );
//			alert( "BUGS_432 items items="+items[1] );
//			alert( "BUGS_433 items items="+items[2] );
//			alert( "BUGS_775 items items.length="+items.length );

			htmout = ""; j=0; k=0; i=0;
			htmout += "<div id=div_items>\n";
			htmout += "<h1>div_items</h1>\n";
			htmout += "	<table id=table_items>\n";
			htmout += "	<tr>";
			htmout += "		<td width=10>num</td>";
			htmout += "		<td width=200>id</td>";
			htmout += "		<td width=200>name</td>";
			htmout += "		<td width=300>url</td>";
			htmout += "		<td width=400>desc</td>";

//			htmout += "		<td>phn</td>";
//			htmout += "		<td>firm</td>";
//			htmout += "		<td>email</td>";
//			htmout += "		<td>action</td>";
			htmout += "		</tr>";

//			alert( "BUGS_800 items args="+args );


			for ( j=0; j<items.length; j++ ) {
				name = items[j].split("|")[0];
//				alert( "BUGS_801 name="+name+" j="+j );
				if( name == undefined ) { continue; }
				if( name == "undefined" ) { continue; }
				if( name == "name" ) { continue; }
				if( name == "" ) { continue; }



				file = items[j].split("|")[0];

				if( file == "file" ) { continue; }
				if( file == "" ) { continue; }

				htfile=ht+file;
				desc = items[j].split("|")[1];

//				phn = items[j].split("|")[1];
//				firm = items[j].split("|")[2];
//				email = items[j].split("|")[3];
//				note = items[j].split("|")[5];
//				action = items[j].split("|")[6];

				url="";
				url+="<a href="+htfile+" target=_blank>";
				url+="<img name=img_item_"+j+" id=img_item_"+j+" src="+htfile+" height=100 width=80 border=0>";
				url+="</a>";


				htmout += "	<tr>";
				htmout += "		<td>"+j+"</td>";
				htmout += "		<td>"+url+"</td>";
				htmout += "		<td><b>"+desc+"</b></td>";
				htmout += "		<td>"+file+"</td>";
				htmout += "		</tr>";
//				alert( "BUGS_822 items j="+j+" name="+name+"\n" );
				}
//			alert( "BUGS_831 j="+j );
			htmout += "		</table id=table_items_end>\n";
			htmout += "	</div id=div_items_end>\n";
//			alert( "BUGS_832 divid="+divid );

			if( document.getElementById('div_items')) {
				document.getElementById('div_items').innerHTML=htmout;
				}
			return(htmout);
			}
        	</script id=script_items_end>

	<script id=script_contacts>
		function contacts(args) {
			divid="div_contacts";
			htmout=""; j=0; k=0; i=0;
			alert( "BUGS_1880 contacts args="+args );
//			htmout += "<h1>BUGS_21 CONTACTS args="+args+"</h1>\n";
//			alert(htmout);
//			return(htmout);


// items=`
// file|desc|
// 170.jpg|jtfdc_sawhorse_original
// 171.jpg|jtfinc_entrance
// 900_jtfdc_private_court_since_1979_viewin.jpg|jtfdc_viewin
// 900_jtfinc.jpg|
// 900_snap_20170123_187559_jtfdc_kids_cycle_laps|jtfdc_cycle_kids
// 900_snap_20170123_187576_jtf32_preservation_police_yellowsticker_frenzy
// jtfdc_sawhorse_2020.jpg|jtfdc_sawhorse_2020
// 100_jtfdcr_2013_byrd_threat.jpg|jtfdcr_2013_byrd_threat
// 116.jpg|sign_private|jtfdc_sign_private_green
// 100.jpg|jtfdc_birdview|jtfdc_birdview
// 44.jpg|byrd_siegrist_dogs3.jpg|byrd_sieggrist_dogs3
// 66.jpg|jtf28-30-32_eagle_theft.jpg|jtf29_eagle_theft_jtf28-30-32
// 46.jpg|byrds_sawhorse_theft|jtf29_byrds_sawhorse_theft
// 32.jpg|jtfdcr_cover|jtfdcr_cover
// 31.jpg|who2jail
// 900_byrdbell_20200916.jpg|jkmed_eyes
// 900_emh_20160911_056.jpg|jkmed_heart
// 100_jtfdcr_byrd_seigrist_2dogs_trespass2|100_jtfdcr_byrd_seigrist_2dogs_trespass2
// 900_IMG_0577.jpg|jtf29_police_door_entry
// 900_IMG_0574.jpg|jtf29_doorchimes
// 229.jpg|trial3_brown_bench_probation_nocameras_notrespass
// 900_topos_20160505_031.jpg|police_jahns_card
// `.split("\n");

contacts=`
id|name|phn|firm|url|email|note|action
jak3|jenna|314-123-456|konet|konet.org|admin@konet.org|note|action
huschblackwell|gregoroy r smith|314-480-1720|huschblack|huschblackwell.com|gregory.smith@huschblackwell.com|note|action
smithj|melvin j smith|314-726-2141|melvinjsmith|www.melvinjsmithlaw.com|@melvinjsmithlaw.com|note|action
smithr|rudman smith|phn|rudmansmith|www.rudmansmithlaw.com|@rudmansmithlaw.com|note|action
fleddermann|fleddermann|636-947-4343|fleddermann|www.fleddermannlawoffice.com|fleddermann@.fleddermannlawoffice.com|note|action
smithmeuler|smith meuler|314-266-6515|smithmeuller|smithmeuller.com|mgoodman@smithmeuller.com|note|action
goldenhersh|ben goldenhershlaw|314-707-7789|goldenhersh|http://goldenhershlaw.com|ben@goldenhershlaw.com|personal injury|action
<br>|<br>|phn|url|email|note|action
tc|thompson coburn|314-552-6000|thompsoncoburn|thompsoncoburn.com|email|note|action
archcity|archcitydefenders|855-724-2489|archcitydefenders|www.archcitydefenders.org|mail@archcitydefenters.org|savannah downs|action
bb|brown brown|314-333-333|brown|brownlawoffice.com|@brownlawoffice.com|note|action
bc|brown crouppen|314-501-9510|brownandcrouppen|https://www.brownandcrouppen.com/st-louis/|https://www.brownandcrouppen.com/st-louis/|note|action
<br>|
<br>|<br>|phn|url|email|note|action
<br>|<hr>|phn|url|email|note|action
keyhlig|alexander keuhlig|314-726-6868|rosenblumgoldenhersh|rosenblumgoldenhersh.com|@rosenblumgoldenhersh.com|note|20160826
walters|alan p walters|314-227-1943|url|email|note|action
donovan|joann c donovan|314-921-6600|donovan|lawdonovan.com|jdonovan@lawdonovan.com|note|action
cohena|alan cohen|314-|firm|url|email|retired|action
cohenn|nathan cohen|314-|firm|url|email|note|action
luber|greg luber|636-947-1122|501law|https://501law.com|email|debtlaw|action|
elster|henry elster|314-|elster|https://elsterlaw.com|email|note|action|
diemer|dan diemer|314-863-8833|diemer|https://diemerlawfirm.com/|email|note|action|
whitner|joe whitner|314-354-8484|https://rsblawfirm.com|email|note|action|
<br>|todo|phn|url|email|note|action||
mccloskey|mccloskey|314-721-4000|mccloskey|https://www.mccloskeylaw.com/|email|note|action|
woolf|richard woolf|314-345-5030|bakersterchi|https://bakersterchi.com|rwoolf@bakersterchi.com|email|note|action|
dolley|keven dolley|314-293-4884|dolley|https://www.missouriemploymentlawattorney.com|email|note|action|
sindel|richard sindel|314-721-6040|sindel|https://sindellaw.com|email|note|action|
id|evelyn lewis|314-721-6040|evelynlewis|https://evelynlewislawllc.com|email|note|action|
id|`.split("\n");



contacts1=`
name|phn|url|email|note|action
greg luber|314-|https://501law.com|email|note|action|
henry elster|314-|https://elsterlaw.com|email|note|action|
dan diemer|314-863-8833|https://diemerlawfirm.com/|email|note|action|
joe whitner|314-354-8484|https://rsblawfirm.com|email|note|action|
todo|phn|url|email|note|action
brown|314-|https://brown..com|email|note|action
keuhlig|314-|https://keyhlig..com|email|note|action
walters|314-|https://walters|email|note|action
columbo|314-|https://columbo|email|note|action
fail|phn|url|email|note|action
mccloskey|314-721-4000|https://www.mccloskeylaw.com/|email|note|action|
richard woolf|314-345-5030|https://bakersterchi.com|rwoolf@bakersterchi.com|email|note|action|
keven dolley|314-293-4884|https://www.missouriemploymentlawattorney.com|email|note|action|
richard sindel|314-721-6040|https://sindellaw.com|email|note|action|
evelyn lewis|314-721-6040|https://evelynlewislawllc.com|email|note|action|
`.split("\n");

//			alert( "BUGS_200 contacts contacts0="+contacts[0] );
//			alert( "BUGS_200 contacts contacts1="+contacts[1] );
//			alert( "BUGS_200 contacts contacts2="+contacts[2] );
//			alert( "BUGS_200 contacts contacts.length="+contacts.length );

			htmout = ""; j=0; k=0; i=0;
			htmout += "<div id=div_contacts>\n";
			htmout += "<h1>div_contacts</h1>\n";
			htmout += "	<table id=table_contacts>\n";
			htmout += "	<tr>";
			htmout += "		<td>num</td>";
			htmout += "		<td>name</td>";
			htmout += "		<td>phn</td>";
			htmout += "		<td>url</td>";
			htmout += "		<td>url_letter</td>";
			htmout += "		<td>firm</td>";
			htmout += "		<td>email</td>";
			htmout += "		<td>note</td>";
			htmout += "		<td>action</td>";
			htmout += "		</tr>";



			for ( j=0; j<contacts.length; j++ ) {
				name = contacts[j].split("|")[0];
				if( name == undefined ) { continue; }
				if( name == "undefined" ) { continue; }
				if( name == "name" ) { continue; }
				if( name == "" ) { continue; }

				id = contacts[j].split("|")[0];
				phn = contacts[j].split("|")[1];
				firm = contacts[j].split("|")[2];
				site = contacts[j].split("|")[3];
				email = contacts[j].split("|")[4];
				date = contacts[j].split("|")[5];
				note = contacts[j].split("|")[6];
				action = contacts[j].split("|")[7];
				url="";
				url+="<a href="+site+" target=_blank>";
				url+="<img src=/imgs/btn/kob.png height=20 border=0>";
				url+="</a>";
				url_letter="";
				url_letter+="<img src=/imgs/btn/kow.png ";
//				url_letter+=" onclick=\"letter('"+id+"'); return false;\" "
				url_letter+=" onclick=\"letter('"+contacts[j]+"'); return false;\" "
				url_letter+=" height=20 border=0>";

//				alert( "BUGS_650 url="+url+" firm="+firm+"\n" );


				htmout += "	<tr>";
				htmout += "		<td>"+j+"</td>";
				htmout += "		<td><b>"+id+"</b></td>";
				htmout += "		<td><b>"+name+"</b></td>";
				htmout += "		<td><b>"+phn+"</b></td>";
				htmout += "		<td>"+firm+"</td>";
				htmout += "		<td>"+url+"</td>";
				htmout += "		<td>"+url_letter+"</td>";
				htmout += "		<td>"+email+"</td>";
				htmout += "		<td>"+note+"</td>";
				htmout += "		<td>"+action+"</td>";
				htmout += "		</tr>";
//				alert( "BUGS_201 contacts j="+j+" name="+name+"phn= "+phn+"\n" );
				}

			htmout += "		</table id=table_contacts_end>\n";
			htmout += "	</div id=div_contacts_end>\n";

			if( document.getElementById(divid)) {
				document.getElementById(divid).innerHTML=htmout;
				}
			return(htmout);
			}
        	</script id=script_contacts_end>



	<script id=script_letter>
		function letter(contact) {
//			alert( "BUGS_2050 LETTER contact="+contact );
			divid="div_letter";
			htmout="";
			default_contact="id|phn|name|firm|site|email|date|note|action";
			if(contact == "" ) contact=default_contact;

//			alert( "BUGS_930 contact="+contact );
			id = contact.split("|")[0];
			name = contact.split("|")[1];
			phn = contact.split("|")[2];
			firm = contact.split("|")[3];
			site = contact.split("|")[4];
			email = contact.split("|")[5];
			date = contact.split("|")[6];
			note = contact.split("|")[7];
			action = contact.split("|")[8];

//			alert( "BUS_950 id="+id+" name="+name+" phn="+phn );
			contact_info="";
			contact_info+="<div id=div_contacts_info>\n";
			contact_info+="<hr color=goldenrod>\n";


			contact_info+="<table id=table_contact_info1>\n";
			contact_info+="<tr><td>id</td><td>="+id+"</td></tr>\n";
			contact_info+="<tr><td>name</td><td>"+name+"</td></tr>\n";
			contact_info+="<tr><td>phn</td><td>="+phn+"</td></tr>\n";
			contact_info+="<tr><td>firm</td><td>="+firm+"</td></tr>\n";
			contact_info+="<tr><td>site</td><td>"+site+"</td></tr>\n";
			contact_info+="<tr><td>email</td><td>"+email+"</td></tr>\n";
			contact_info+="<tr><td>date</td><td>"+date+"</td></tr>\n";
			contact_info+="<tr><td>note</td><td>"+note+"</td></tr>\n";
			contact_info+="<tr><td>action</td><td>"+action+"</td></tr>\n";
			contact_info+="	</table id=table_contact_info_end>\n";
			contact_info+="<br>\n";
			contact_info+="<hr color=goldenrod>\n";
			contact_info+="	</div id=div_contacts_info_end>\n";

//			alert( "BUGS_2090 contact_info="+contact_info );
			if ( document.getElementById('div_contact_info')) {
				document.getElementById('div_contact_info').innerHTML=contact_info;
				}
			id=args
			htmout += "<h1>BUGS_2091 LETTER  id="+id;
//			alert(htmout);

letter_body=`
we need time

- new grandaughter born 20230227 is in ICU with oxigen problems
- doctor requested medical tests for me
- internet cable problems too

can you reschedule/dismiss out Feb 9 summons court date?
ko2.us/law

- jtfdc_20190516_0880_policereport.pdf (summons and police report)
- jtfdc_20190516_1700_sk_protect.pdf (wifes order of protection from G. Byrd)
- videos of my police calls for help and the police tazor response


the case is about a 20190516 alleged "chestbump" assault against
Gary Byrd and a "door" assault against a "special person" (stlc police)

the allegation are unsupported by the actual
videos of my police calls for help, police tazor response and Mr Byrds pattern and practice
of threats, bullying and trespass over the last 10 years.

our situation is really all about a 10 year dispute over
big dogs, property and safety of small children

We have been targeted by
Ms Joan Donovan Family Law and her a handful of recruited client neighbors
attempts to force us from our home in a private 3 house court .

Ms Donovans legal strategy involving
false police reports, endless legal fees, 
thier 9 freeroaming big dogs and redirected traffic thru our driveway,
has disrupted our lives and business for 10 year.

all documentation, summons, police report, sk order of protection from G. Byrd,
videos, maps, photos are available somewhere online at:

ko2.us/law

Due to the scope and volume of the documentation
the site is evolving into a general
knowledgebase/case managment system portal
that could eventually include aggregated local law news.

you are invited to explore and imagine the potential of this work in progress.

If you are unable to help us,
can you provide a referal for someone to simply 
reschedule/dismiss the Feb 9 court date.

thank you again for your time and consideration

jsk
ko2.us/law
`;

			htmout_pre ="";
			htmout_pre += "<pre id=pre_letter>\n";
			htmout_pre += "Dear "+id+":\n";
			htmout_pre += letter_body;
			htmout_pre += "	</pre id=pre_letter_end>\n";

			htmout="";
			htmout += "Dear "+id+":\n";
			htmout += letter_body;

//			alert( "BUGS_750 LETTER id="+id+" htmout="+htmout );

//			divid="div_letter";
//			if( document.getElementById(divid)) {
//				document.getElementById(divid).innerHTML=htmout;
//				}

			divid="pre_letter";
			if( document.getElementById(divid)) {
				document.getElementById(divid).innerHTML=htmout_pre;
				}


			return(htmout);
			}
		</script id=script_letter_end>

	<script id=script_links>
		function links(args) {
			htmout="";
			htmout += "<h1>BUGS_1170 links args="+args+"</h1>\n;



			alert(htmout);
			return(htmout);
			}
		</script id=script_links>


	<script id=script_k9>
		function k9(args) {
			htmout=""; j=0; k=0;
			alert( "BUGS_2110 k9 args="+args );
			return(htmout);
			}
		</script id=script_k9_end>

	<script id="script_grid_toggle">
		function grid_toggle(args) {
//			alert("BUGS_200 grid args="+args );

			div_divid="div_grid";
			if( document.getElementById('div_grid')) {
				if( document.getElementById('div_grid').style.display == "inline" ) {
					document.getElementById('div_grid').style.display="none";
					if( document.getElementById('img_grid_toggle')) {
						document.getElementById('img_grid_toggle').src="/imgs/btn/btn_keyhole1.png";
						}
					if( document.getElementById('img_grid_keys')) {
						document.getElementById('img_grid_keys').src="/imgs/btn/btn_keys1.png";
						}
					}
				else{
					document.getElementById('div_grid').style.display="inline";
					if( document.getElementById('img_grid_toggle')) {
						document.getElementById('img_grid_toggle').src="/imgs/btn/btn_keyhole2heaven.png";
						}
//					if( document.getElementById('img_grid_keys')) {
//						document.getElementById('img_grid_keys').src="/imgs/btn/btn_keys2.png";
//						}
//					return('');
					}
				}



			return(args);
			}
		</script id=script_grid_toggle_end>

	<script id="script_grid">
		function grid(args) {
//			alert("BUGS_200 grid args="+args );
//			var ctx = document.getElementById('canvas_table_top').getContext('2d');
			if( document.getElementById('img_grid_keys')) {
				document.getElementById('img_grid_keys').src="/imgs/btn/btn_keys_string1.png";
				}
			if(args=="") {
				}
			tokens=args;
			k9s=tokens;
			j=0; k=0;
			if( args == '' ) {
				tokens = '';
				tokens += '-';
				for( k=1; k<11; k++ ) {
//					token = random_int(9,0);
					token = random_int(9,0);
					token = random_int(99,00);
					token = random_int(999,100);
					token = random_int(9999,1000);
					token = random_int(999999,100000);
					token = random_int(99999999,10000000);

					k9=token;
//					alert("BUGS_9010 grid j="+j+" k="+k+" token="+token+" k9="+k9 );
					k9=keine(token);
//					alert("BUGS_9020 grid j="+j+" k="+k+" token="+token+" k9="+k9 );
					token_str = token.toString();
					tokens += token.toString(); tokens += '-';
//					tokens += token_str; tokens += '-';
					}
//				tokens += '-';
				}
		k9s=tokens;
	
		var tokes = tokens.split(/-/);
		tokes_len = tokes.length;
		head=0; tail=tokes_len-1;

		if(( tokes[head] != "" ) && ( tokes[tail] != "" )) {
			k9head=keine(tokes[head]);
			status=0;
			for( j=1; j<tail; j++ ) {
				if( tokes[tail] == tokes[j] ) {
					if( j == k9head ) { status=1; }				
					break;
					}
				}
			if( status == 1 ) {
				htmout  = '';
				htmout += '<img src="/imgs/btn/btn_key_happiness.png" ';
				htmout += '	onclick="window.open(\'/imgs/btn/btn_key_happiness.png\');return false;"';
				htmout += '	height=400 border=0>';
				}
			else {
				htmout  = '';
				htmout += '<img src="/imgs/btn/btn_keyhole_us.png" ';
				htmout += '	onclick="window.open(\'/imgs/btn/btn_key_happiness.png\');return false;"';
				htmout += '	height=400 border=0>';
				}
			if( document.getElementById('div_grid1')) {
				document.getElementById('div_grid1').innerHTML = htmout;
				}

			return(args);
			}




		grid1 = '';
		grid1 += '<div id="div_grid1" >';
		grid1 += '	<h1>div_grid1</h1>';
		grid1 += '	<h3>'+tokens+'</h3>';
		grid1 += '	<br>';
		grid1 += '	<table id="table_grid">';
//		alert( "BUGS_150 grid1="+grid1+"  tokes="+tokes );
		j=0;
		for(r=1; r<4; r++) {
			grid1 += '<tr>';
			for(c=1; c<4; c++) {
//				alert( "BUGS_150 j="+j+"-"+r+"-"+c+" tokens="+tokens );
				j=j+1;
				grid1 += '<td>';
				grid1 += j;
				if((tokes[head]=="")&&(tokes[tail]=="")) {
					grid1 += '<img src="/imgs/btn/kob.png" onclick=';
//					grid1 += '	"grid(\''+j+tokens+'\'); return false;" ';
					grid1 += '	"grid(\''+tokes[j]+tokens+'\'); return false;" ';
					grid1 += '	height=50 border=0>';
					grid1 += '<br>';
//					grid1 += tokes[j];
//					grid1 += '<br>';
//					grid1 += keine(tokes[j]);
//					alert( "BUGS_151 j="+j+"-"+r+"-"+c+" tokens="+tokens );
					}
				if((tokes[head]!="")&&(tokes[tail]=="")) {
//					if( tokes[head] == j ) {
					if( tokes[head] == tokes[j] ) {
						grid1 += '<img src="/imgs/btn/kow.png" ';
//						grid1 += '	onclick="grid(\''+tokens+j+'\'); return false;" ';
						grid1 += '	onclick="grid(\''+tokens+tokes[j]+'\'); return false;" ';
						grid1 += '	height=50 border=0>';
						grid1 += '<br>';
//						grid1 += tokes[j];
//						grid1 += '<br>';
//						grid1 += keine(tokes[j]);
						}
					else {
						grid1 += '<img src="/imgs/btn/kob.png" ';
						grid1 += '	onclick="grid(\''+tokens+tokes[j]+'\'); return false;" ';
						grid1 += '	height=50 border=0>';
						grid1 += '<br>';
//						grid1 += tokes[j];
//						grid1 += '<br>';
//						grid1 += keine(tokes[j]);
						}
//					alert( "BUGS_152 j="+j+"-"+r+"-"+c+" tokens="+tokens );
					}
				if((tokes[head]!="")&&(tokes[tail]!="")) {
//					if( tokes[head] == keine(tokes[tokes[tail]]) ) {
//					if( tokes[ tokes[head]] == keine(tokes[tokes[tail]]) ) {
					if( tokes[ tokes[head]] == tokes[tokes[tail]] ) {
						grid1 += '<img src="/imgs/btn/btn_key_happiness.png" ';
						grid1 += '	onclick="grid(\''+tokens+'\'); return false;" ';
						grid1 += '	height=50 border=0>';
						grid1 += '<br>';
						grid1 += tokes[head]+'='+tokes[tail]+'<br>';
//						grid1 += tokes[j]+<br>;
//						grid1 += '<br>';
//						grid1 += keine(tokes[tokes[tail]]);
						}
					else {
						grid1 += '<img src="/imgs/btn/kob.png" ';
						grid1 += '	onclick="grid(\''+tokens+'\'); return false;" ';
						grid1 += '	height=50 border=0>';
						grid1 += '<br>';
						grid1 += tokes[j];
//						grid1 += '<br>';
//						grid1 += keine(tokes[j]);
						}

//					alert( "BUGS_153 j="+j+"-"+r+"-"+c+" tokens="+tokens );
					}





				grid1 += '<br>'+tokes[j];
//				grid1 += '<br>'+keine(tokes[j]);
				grid1 += '<br>';
				grid1 += '	</td>';

//				grid1 += '-'+k9;
//				grid1 += '-'+keine(tokes[j]);
//				alert( "BUGS_65 j="+j+" toke="+tokes[j] );
//				grid1 += 	tokes[j].toString();
				}
			grid1 += '	</tr>';	
			}
		grid1 += '	</table>';
		grid1 += '	</div>';

//		alert( "BUGS_111 grid1="+grid1 );

		if( document.getElementById('div_grid')) {
			document.getElementById('div_grid').innerHTML=grid1;
			}
//		alert( "BUGS_71 grid1="+grid1 );

		return(args);


			htmout = '';
			htmout += '<div id="div_tokens">';
			htmout += '<h1>div_tokens</h1>';
			htmout += '<br>';
			htmout += '	</div>';	
			if( document.getElementById('div_tokens')) {
				document.getElementById('div_tokens').innerHTML=tokens;
				}


			htmout += '<div id="div_grid">';
			htmout += '<h1>div_grid</h1>';

			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-1\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-2\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-3\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<br>';
			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-4\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-5\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-6\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<br>';
			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-7\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-8\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-9\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<br><br><br><br>';
			htmout += '<hr color=goldenrod';


//			htmout += '<table>';
//
//			j=0;
//			for(r=0; r<3; r++ ) {
//				htmout += '	<tr>';
//				for( c=0; c<3; c++ ) {
//					rand=random_int(99999999,0);
////					alert( "BUGS_202 j="+j+"  rand="+rand );
//					kolists[j] = rand;
//					htmout += '	<td>';
//					htmout += '<img src="/imgs/btn/kob.png"';
//					htmout += '	alt="/imgs/btn/kob.png"';
//					htmout += '	onclick="grid(\''j+'|'+kolists[j]+'\');return false;" ';
//					htmout += '	height=50 border=0>';
//					htmout += '	'+kolists[j];
//					htmout += '		</td>';
//					}
//				htmout += '		</tr>';
//				}
//			htmout += '	</table>';
//			htmout += '	</div>';
//
//			htmout="<h1>BUGS_HTML</h1>";	
//			alert("BUGS_201 grid htmout="+htmout );
			if( document.getElementById('div_grid')) {
				document.getElementById('div_grid').innerHTML=htmout;
				}
			return(args);
			}
		</script>

	<script id="script_startup1">
		function startup1(args) {
			htmout=""; j=0; k=0;
			alert("BUGS_2480 startup1 args="+args );
			htmout=banner('');			
			grid(args);
			return(args);
			}
		</script>

<script id=script_drawgrid >
	function drawgrid() {
		if(document.getElementById('canvas_grid_table_top')) {;
			var canvas = document.getElementById('canvas_grid_table_top');
			}
		if (canvas.getContext) {
			var ctx = canvas.getContext('2d');
               
// Create a pattern
			for (var i = 0;i<7;i++) {
				for (var j = 0;j<7;j++) {   
					ctx.fillStyle = 'rgb(' + Math.floor(255-20.5*i)+ ','+ 
					Math.floor(255 - 42.5*j) + ',255)';
					ctx.fillRect( j*25, i* 25, 55, 55 );
        				}
				}
			} 
		else {
			alert('ALERT_100: unauthorized access logged !!');
			}
		}
	</script id=script_drawgrid_end>







	<script id="script_keine">
              function keine(i) {
//			alert( "BUGS_8980 keine i="+i );
			j=0; o=0;
			is=i.toString().split("");
			islen=is.length;
//			alert( "BUGS_8995 keine j="+j+" islen="+islen+" is="+is );
			for( j=0; j<islen; j++ ) {
				o=o+parseInt(is[j]);
				if( o>9 ) { 
//					alert( "BUGS_8996 TOBIG j="+j+" i="+i+" o="+o );
					o=o-9; 
//					alert( "BUGS_8997 tobig j="+j+" i="+i+" o="+o );
					}
				}
//			alert( "BUGS_9000 keine j="+j+" i="+i+" o="+o );
			return(o);
			}
		</script id=script_keine_end>


	<script id="script_grid_k9">
		function k9_grid(args) {
			alert("BUGS_2120 k9_grid args="+args );
//			var ctx = document.getElementById('canvas_table_top').getContext('2d');
			if( document.getElementById('img_grid_keys')) {
				document.getElementById('img_grid_keys').src="/imgs/btn/btn_keys_string1.png";
				}
			if(args=="") {
				}
			tokens=args;
			k9s=tokens;
			j=0; k=0;
			if( args == '' ) {
				tokens = '';
				tokens += '-';
				for( k=1; k<11; k++ ) {
//					token = random_int(9,0);
					token = random_int(9,0);
					token = random_int(99,00);
					token = random_int(999,100);
					token = random_int(9999,1000);
					token = random_int(999999,100000);
					token = random_int(99999999,10000000);

					k9=token;
//					alert("BUGS_9010 grid j="+j+" k="+k+" token="+token+" k9="+k9 );
					k9=keine(token);
//					alert("BUGS_9020 grid j="+j+" k="+k+" token="+token+" k9="+k9 );
					token_str = token.toString();
					tokens += token.toString(); tokens += '-';
//					tokens += token_str; tokens += '-';
					}
//				tokens += '-';
				}
		k9s=tokens;
	
		var tokes = tokens.split(/-/);
		tokes_len = tokes.length;
		head=0; tail=tokes_len-1;

		if(( tokes[head] != "" ) && ( tokes[tail] != "" )) {
			k9head=keine(tokes[head]);
			status=0;
			for( j=1; j<tail; j++ ) {
				if( tokes[tail] == tokes[j] ) {
					if( j == k9head ) { status=1; }				
					break;
					}
				}
			if( status == 1 ) {
				htmout  = '';
				htmout += '<img src="/imgs/btn/btn_key_happiness.png" ';
				htmout += '	onclick="window.open(\'/imgs/btn/btn_key_happiness.png\');return false;"';
				htmout += '	height=400 border=0>';
				}
			else {
				htmout  = '';
				htmout += '<img src="/imgs/btn/btn_keyhole_us.png" ';
				htmout += '	onclick="window.open(\'/imgs/btn/btn_key_happiness.png\');return false;"';
				htmout += '	height=400 border=0>';
				}
			if( document.getElementById('div_grid1')) {
				document.getElementById('div_grid1').innerHTML = htmout;
				}

			return(args);
			}




		grid1 = '';
		grid1 += '<div id="div_grid1" >';
		grid1 += '	<h1>div_grid1</h1>';
		grid1 += '	<h3>'+tokens+'</h3>';
		grid1 += '	<br>';
		grid1 += '	<table id="table_grid">';
//		alert( "BUGS_150 grid1="+grid1+"  tokes="+tokes );
		j=0;
		for(r=1; r<4; r++) {
			grid1 += '<tr>';
			for(c=1; c<4; c++) {
//				alert( "BUGS_150 j="+j+"-"+r+"-"+c+" tokens="+tokens );
				j=j+1;
				grid1 += '<td>';
				grid1 += j;
				if((tokes[head]=="")&&(tokes[tail]=="")) {
					grid1 += '<img src="/imgs/btn/kob.png" onclick=';
//					grid1 += '	"grid(\''+j+tokens+'\'); return false;" ';
					grid1 += '	"grid(\''+tokes[j]+tokens+'\'); return false;" ';
					grid1 += '	height=50 border=0>';
					grid1 += '<br>';
//					grid1 += tokes[j];
//					grid1 += '<br>';
//					grid1 += keine(tokes[j]);
//					alert( "BUGS_151 j="+j+"-"+r+"-"+c+" tokens="+tokens );
					}
				if((tokes[head]!="")&&(tokes[tail]=="")) {
//					if( tokes[head] == j ) {
					if( tokes[head] == tokes[j] ) {
						grid1 += '<img src="/imgs/btn/kow.png" ';
//						grid1 += '	onclick="grid(\''+tokens+j+'\'); return false;" ';
						grid1 += '	onclick="grid(\''+tokens+tokes[j]+'\'); return false;" ';
						grid1 += '	height=50 border=0>';
						grid1 += '<br>';
//						grid1 += tokes[j];
//						grid1 += '<br>';
//						grid1 += keine(tokes[j]);
						}
					else {
						grid1 += '<img src="/imgs/btn/kob.png" ';
						grid1 += '	onclick="grid(\''+tokens+tokes[j]+'\'); return false;" ';
						grid1 += '	height=50 border=0>';
						grid1 += '<br>';
//						grid1 += tokes[j];
//						grid1 += '<br>';
//						grid1 += keine(tokes[j]);
						}
//					alert( "BUGS_152 j="+j+"-"+r+"-"+c+" tokens="+tokens );
					}
				if((tokes[head]!="")&&(tokes[tail]!="")) {
//					if( tokes[head] == keine(tokes[tokes[tail]]) ) {
//					if( tokes[ tokes[head]] == keine(tokes[tokes[tail]]) ) {
					if( tokes[ tokes[head]] == tokes[tokes[tail]] ) {
						grid1 += '<img src="/imgs/btn/btn_key_happiness.png" ';
						grid1 += '	onclick="grid(\''+tokens+'\'); return false;" ';
						grid1 += '	height=50 border=0>';
						grid1 += '<br>';
						grid1 += tokes[head]+'='+tokes[tail]+'<br>';
//						grid1 += tokes[j]+<br>;
//						grid1 += '<br>';
//						grid1 += keine(tokes[tokes[tail]]);
						}
					else {
						grid1 += '<img src="/imgs/btn/kob.png" ';
						grid1 += '	onclick="grid(\''+tokens+'\'); return false;" ';
						grid1 += '	height=50 border=0>';
						grid1 += '<br>';
						grid1 += tokes[j];
//						grid1 += '<br>';
//						grid1 += keine(tokes[j]);
						}

//					alert( "BUGS_153 j="+j+"-"+r+"-"+c+" tokens="+tokens );
					}





				grid1 += '<br>'+tokes[j];
//				grid1 += '<br>'+keine(tokes[j]);
				grid1 += '<br>';
				grid1 += '	</td>';

//				grid1 += '-'+k9;
//				grid1 += '-'+keine(tokes[j]);
//				alert( "BUGS_65 j="+j+" toke="+tokes[j] );
//				grid1 += 	tokes[j].toString();
				}
			grid1 += '	</tr>';	
			}
		grid1 += '	</table>';
		grid1 += '	</div>';

//		alert( "BUGS_111 grid1="+grid1 );

		if( document.getElementById('div_grid')) {
			document.getElementById('div_grid').innerHTML=grid1;
			}
//		alert( "BUGS_71 grid1="+grid1 );

		return(args);


			htmout = '';
			htmout += '<div id="div_tokens">';
			htmout += '<h1>div_tokens</h1>';
			htmout += '<br>';
			htmout += '	</div>';	
			if( document.getElementById('div_tokens')) {
				document.getElementById('div_tokens').innerHTML=tokens;
				}


			htmout += '<div id="div_grid">';
			htmout += '<h1>div_grid</h1>';

			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-1\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-2\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-3\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<br>';
			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-4\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-5\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-6\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<br>';
			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-7\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-8\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<img src="/imgs/btn/kob.png" ';
			htmout += '	onclick="grid(\'grid-9\');return false;" ';
			htmout += '	height=50 border=0>';
			htmout += '<br><br><br><br>';
			htmout += '<hr color=goldenrod';


//			htmout += '<table>';
//
//			j=0;
//			for(r=0; r<3; r++ ) {
//				htmout += '	<tr>';
//				for( c=0; c<3; c++ ) {
//					rand=random_int(99999999,0);
////					alert( "BUGS_202 j="+j+"  rand="+rand );
//					kolists[j] = rand;
//					htmout += '	<td>';
//					htmout += '<img src="/imgs/btn/kob.png"';
//					htmout += '	alt="/imgs/btn/kob.png"';
//					htmout += '	onclick="grid(\''j+'|'+kolists[j]+'\');return false;" ';
//					htmout += '	height=50 border=0>';
//					htmout += '	'+kolists[j];
//					htmout += '		</td>';
//					}
//				htmout += '		</tr>';
//				}
//			htmout += '	</table>';
//			htmout += '	</div>';
//
//			htmout="<h1>BUGS_HTML</h1>";	
//			alert("BUGS_201 grid htmout="+htmout );
			if( document.getElementById('div_grid')) {
				document.getElementById('div_grid').innerHTML=htmout;
				}
			return(args);
			}
		</script id=script_grid_end>


	<script id=script_banner>
		function banner(args) {
			htmout=""; j=0; k=0;
			alert( "BUGS_2790 banner args="+args);
			return(htmout);
			}

		function banner1(args) {
			htmout=""; j=0; k=0;
			alert( "BUGS_2800 banner args="+args );
			psvrec=protocol+"|"+hostname+"|"+port+"|"+pathname+"|"+search+"|"+hash+"|"+host+"|"+dttm+"|";
			protocol=psvrec.split("|")[0];
			hostname=psvrec.split("|")[1];
			port=psvrec.split("|")[2];
			pathname=psvrec.split("|")[3];
			search=psvrec.split("|")[4];
			hash=psvrec.split("|")[5];
			host=psvrec.split("|")[6];
//			dttm=psvrec.split("|")[7];
			dttm = new Date().toISOString().slice(0, 10);

			htmout+="<a href=/k9.html target=_blank><img id=img_k9 src=/imgs/keys/keys00_hole.png height=20 border=0></a>";
			htmout+="<a href=/leds/leds.php target=_blank><img id=img_leds_php src=/imgs/btn/tn_leds.png height=20 border=0></a>";
			htmout+="d r a f t ";
			htmout+="&nbsp &nbsp &nbsp &nbsp";
			htmout+=hostname;
			htmout+="&nbsp &nbsp &nbsp &nbsp";
			htmout+="P R E V I E W";
			htmout+="<img src=/imgs/btn/kop12.png height=20>";
			htmout+=" K O ";
//			htmout+=" K A ";
//			htmout+=" L A W ";
//			htmout+=" B Y R D B E L L V J K ";
//			htmout+=" M E D ";
//			htmout+=" K O N E T ";
//			htmout+=" I P E R M S ";
//			htmout+=" J T F D C ";
//			htmout+=" J T F D C R ";
//			htmout+=" J T F I N C";
//			htmout+=" K O 1 ";
//			htmout+=" K O 2 ";
//			htmout+=" K O 0 ";
			htmout+=pathname;
			htmout+="<img src=/imgs/btn/kop34.png height=20>";
			htmout+="&nbsp &nbsp &nbsp &nbsp";
			htmout+="<font style=\"font-size:18\">"+dttm_"</font>";

<!--
		<a href=/ko/leds/leds.php target=_blank><img id=img_leds_dhtml src=/imgs/btn/tn_leds.png height=20 border=0></a>
		<a href=/k9.html target=_blank><img id=img_k9_dhtml src=/imgs/keys/keys00_hole.png height=20 border=0></a>
		<a href=./ target=_blank><img id=img_ok_dhtml src=/imgs/btn/ok.png height=20 border=0></a>
	-->


			if( document.getElementById('div_banner')) {
				alert( "BUGS_2831 ___FOUND divid=div_banner" );
				document.getElementById('div_banner').innerHTML=htmout;
				}
			else {
				alert( "BUGS_2831 NOTFOUND divid=div_banner" );
				}
			return(htmout);
			}
		</script id=script_banner_end>



	<script id=script_head>
		function head(args) {
			alert( "BUGS_2840 head args="+args );
			htmout="";
			htmout += "<h1>BUGS_1031 HEAD args="+args;
			alert(htmout);
			return(htmout);
			}
		</script id=script_head_end>

	<script id=script_startup2>
		function startup2(args) {
			alert( "BUGS_2850 startup2 args="+args );
			htmout=""; j=0; k=0;
			htmout += "<h1>BUGS_2350 startup3 args="+args;
			alert(htmout);
			return(htmout);
			}
		</script id=script_startup_end>

	<script id=script_tail>
		function tail(args) {
			htmout="";
			htmout += "<h1>BUGS_1031 TAIL args="+args;
			alert(htmout);
			return(htmout);
			}
		</script id=script_tail_end>

	</head>

<body bgcolor=linen onload="startup('startup'); return false;" >


<!-- Load an icon library to show a hamburger menu (bars) on small screens -->
<!-- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> -->

<!-- Top Navigation Menu -->
		<div class="topnav">
<!--			<a href="#home" class="active">Logo</a>  -->
<img id=topnav_ko title="          home" src=/imgs/btn/ko.png onclick="window.open('./'); return false;"
<img id=topnav_bh title="          bluehost" src=/imgs/bh/bluehost_grid00.jpg onclick="window.open('https://bluehost.com/?utm_source=%28direct%29utm_medium=affiliate&utm_campaign=affiliate-link_konet_notype&affiliate=konet'); return false;" height=20 border=0>
<img id=topnav_k9 title="          k9" src=/imgs/keys/keys00_hole.png onclick="window.open('/k9.htm'); return false;" height=20 border=0>
<img id=topnav_leds title="          leds" src=/imgs/btn/tn_leds.png onclick="window.open('/leds/leds.php'); return false;" height=15 width=15 border=0>

	
<!-- Navigation links (hidden by default) -->
		<div id="myLinks">
			<a href="#news">News</a>
			<a href="#contact">Contact</a>
			<a href="#about">About</a>
			<hr color=white>
			<hr color=black>
			<a href="/notes.txt">notes</a>

			<a href="/index_vu.html">vu</a>
			<a href="#about">About</a>
			</div>
<!-- "Hamburger menu" / "Bar icon" to toggle the navigation links -->
			<a href="javascript:void(0);" class="icon" onclick="myFunction()">
				<i class="fa fa-bars"></i>
			</a>
		</div id=myLinks_end>


	<br>
	<hr color=yellow>
	<h3>new fun ko_sailboat <h3>
	
&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp
&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp
&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp &nbsp
	<a href=/ko/ko_sailboat.html target=_blank> 
		<img id=img_wz_tryit title="          ko_sailboat" src=/js/wz/wz_tryit.gif height=10 border=0> 
		<img id=img_ko_sailboat title="          ko_sailboat" src=/js/wz/sailboat.png height=100 border=0> 
		<img id=img_wz_tryit title="          ko_sailboat" src=/js/wz/wz_tryit.gif height=10 border=0> 
		</a>
	<hr color=yellow>
	<br>





<!--
	<a href=help_20230209_0840.html target=_blank>help_20230209_0840.html</a><br>
	<br>
	<a href=help_20230208_1600.html target=_blank>help_20230208_1600.html</a><br>
	<a href=help_20230208_2030.html target=_blank>help_20230208_2030.html</a><br>
	<a href=help_20230209_0130.html target=_blank>help_20230209_0130.html</a><br>
	<a href=help_20230209_0215.html target=_blank>help_20230209_0215.html</a><br>
	<a href=help_20230209_0230.html target=_blank>help_20230209_0230.html</a><br>
	<a href=help_20230209_0300.html target=_blank>help_20230209_0300.html</a><br>
	<a href=help_20230209_0500.html target=_blank>help_20230209_0500.html</a><br>
	
	
	<a href=help_20230210_1130.html target=_blank>help_20230210_1130.html</a><br>
	<a href=help_20230210_1800.html target=_blank>help_20230210_1800.html</a><br>
	<a href=help_2023082300.html target=_blank>help_2023082300.html</a><br>
	<a href=help_202309_0630.html target=_blank>help_202309_0630.html</a><br>
	<a href=help_20232009_0900.html target=_blank>help_20232009_0900.html</a><br>
	
	<br>
	<hr coloc=black>
	-->

<div id=notice style="width: 122px; height: 305px; top: 337px; left: 1399px; z-index: 0; cursor: move; visibility: visible;">
	<a name=demolyr> </a>
	<div id=innotice>
	<center>
		<img name="button" src=/imgs/btn/koeyew.png alt="wz_dd" style="visibility: hidden;" height=20>
<hr color=black>
<hr color=white>


	<a href=/ko/ko_sailboat.html target=_blank> 
		<img id=img_wz_tryit src=/js/wz/wz_tryit.gif height=5 border=0>
		<img id=img_ko_sailboat title="          ko_sailboat" src=/js/wz/sailboat.png height=25 border=0>
		<img id=img_wz_tryit src=/js/wz/wz_tryit.gif height=5 border=0>

		 </a>
	<br>

	<a href=/pdf/web/viewer.html?file=/byrdbellvjk/pdf/jtfdcr_20150821_cohena_policeletter.pdf target=_blank> 
	<img title="          jtfdcr_20150821_cohena_policeletter" 
src=/byrdbellvjk/pdf/tn_jtfdcr_20150821_cohena_policeletter.png height=30 border=0> </a>

	<a href=/pdf/web/viewer.html?file=/byrdbellvjk/pdf/jtfdcr_20190516_luber_policereport.pdf target=_blank> <img title="          jtfdcr_20190516_luber_policereport" src=/byrdbellvjk/pdf/tn_jtfdcr_20190516_luber_policereport.png height=30 border=0> </a>

	<a href=/pdf/web/viewer.html?file=/byrdbellvjk/pdf/jtfdcr_20190516_1700_sk_protect.pdf target=_blank> <img title="          jtfdcr_20190516_1700_sk_protect" src=/byrdbellvjk/pdf/tn_jtfdcr_20190516_1700_sk_protect.png height=30 border=0> </a>
	<br>
	<hr color=white>
<!--
	. <font style="font-size:6">20150812_cohena_policeletter</font>
	<br>
	. . <font style="font-size:6">jtfdcr_20190516_luber_policereport</font>
	<br>
	. . . <font style="font-size:6">jtfdcr_20190516_1700_sk_protect</font>
	<br>
	-->

	<a href=/byrdbellvjk/mp3/jtfdc_20190516_0830_1m23-1m33.mp3 target=_blank> <img title="          jtfdc_20190516_0830_1m23-1m33" src=/imgs/btn/koeye_mp3.png height=10 border=0></a>

	<a href=/byrdbellvjk/txt/jtfdc_20190516_0820_policecall.txt target=_blank> <img title="          jtfdc_20190516_0820_policecall" src=/imgs/btn/koeye_txt.png height=10 border=0> </a>

	<a href=/byrdbellvjk/txt/skbyrd_protect_20190516.txt target=_blank> <img title="          skbyrd_protect_20190516" src=/imgs/btn/koeye_txt.png height=10 border=0> </a>

	<br>
	<hr color=white>
	<a href=/byrdbellvjk/mp4/jtfdc_byrd_20190516_0820.mp4 target=_blank > <img title="          20190516_0820_jk_policecall" src=/byrdbellvjk/mp4/tn_jtfdc_byrd_20190516_0820.png height=20 border=0> </a>
 -
	<a href=/byrdbellvjk/mp4/jtfdc_byrd_20190516_0830.mp4 target=_blank > <img title="           20190516_0830_jk_police_response" src=/byrdbellvjk/mp4/tn_jtfdc_byrd_20190516_0830.png height=20 border=0> </a>
	<br>
	<hr color=white>
<a href=/byrdbellvjk/mp4/jtfdc_20160530_1327_byrd_trustee_threat.mp4 target=_blank> <img title="      20160530_1327_byrd_threat" src=/byrdbellvjk/mp4/jtfdc_20160530_1317_byrd_trustee_threat.jpg height=15 border=0></a>

<a href=/byrdbellvjk/mp4/jtfdc_byrd_20180606_1648_threats_bucket_theft.mp4 target=_blank> <img title="          byrd_20180606_1648_threats_bucket_theft" src=/byrdbellvjk/mp4/jtfdc_byrd_20180606_1648_threats_bucket_theft.jpg height=15 border=0></a>

<a href=/byrdbellvjk/mp4/jtfdc_20190528_1636_stalkaround_byrd_siegrist_dogs_marshall_yourself.mp4 target=_blank > <img title=20190528_1636_byrd_marshall_yourself src=/byrdbellvjk/mp4/jtfdc_20190528_1636_stalkaround_byrd_siegrist_dogs_marshal_yourself.jpg height=15 border=0> </a>
	<br>
	<hr color=white>
	<a href=/law/tls.html target=_blank> <img title="         timelines" src=/imgs/btn/tl.png height=30 border=0> </a>
	<br>
	<hr color=white>
<a href=/fb/law/jkwiiv_byrdbell/zm/zm_donutvanlaw_takings.html target=_blank>
<img title="          donutvanlaw_takings"
src=/fb/law/jkwiiv_byrdbell/zm/donutvanlaw_takings/TileGroup0/0-0-0.jpg
height=25 border=0></a>

<a href=/fb/law/jkwiiv_byrdbell/zm/zm_jtfinc.html target=_blank>
<img title="          jtfinc"
src=/fb/law/jkwiiv_byrdbell/zm/jtfinc/TileGroup0/0-0-0.jpg
height=25 border=0></a>

<a href=/fb/law/jkwiiv_byrdbell/zm/zm_jtf2930.html  target=_blank>
<img title="          jtf2930" src=/fb/law/jkwiiv_byrdbell/zm/jtf2930/TileGroup0/0-0-0.jpg height=25 border=0></a>
<hr color=white>
<hr color=black>

	</center>
		</div id=innotice_end>
	</div id=div_notice_end >







<br>

<!--
	<script id="wz_library" src='data:/text/plain;base64,DQoNCi8vSW50ZWdyYXRlZCB0byBXYWx0ZXIgWm9ybiBodG1sIGxpYnJhcnkNCg0KLy8gZnVuY3Rpb24gZXhlY3V0ZVRlc3Q6IGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9uIGxheWVyT2JqZWN0Lmh0bQ0KZnVuY3Rpb24gZXhlY3V0ZVRlc3QoKXsNCg0KdHJhbnNmb3JtTGF5ZXIgKGRvY3VtZW50LmZvcm1zWzBdLngudmFsdWUsZG9jdW1lbnQuZm9ybXNbMF0ueS52YWx1ZSxkb2N1bWVudC5mb3Jtc1swXS53LnZhbHVlLGRvY3VtZW50LmZvcm1zWzBdLmgudmFsdWUsIkJsb3F1ZSIsMTAwLDEwKTsNCg0KDQp9DQoNCi8vIFVzZXMgV1ogZGh0bWwgbGlicmFyeSB0byBtYWtlIHRpbWVkIHRyYW5zZm9ybWF0aW9ucyBvZiBkaHRtbCwNCi8vIHNvIG1pbmltaXppbmcsIG1heGltaXppbmcgbGF5ZXJzIGNhbiBiZSByYXRoZXIgInNtb290IiBmb3IgdXNlciwNCi8vIHNpbXVsYXRpbmcgd2luZG93cyBvcy4NCg0KLy9GdW5jdGlvbiB0cmFuc2Zvcm1MYXllcg0KLy94LHkgPSBQb3NpdGlvbi4gVG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGVzDQovL3csaCA9IFNpemUuIHdpZHRoIGFuZCBoZWlnaHQgb2YgPGRpdj48L2Rpdj4gbGF5ZXINCi8vaWQgPSBpZCBvZiB0aGUgRGl2IChpLmUuOiBpZD0ibXlMYXllciIsIHRoZW4sIHVzZSAibXlMYXllciIsIFdJVEggcXVvdGVzISkNCi8vZHVyYXRpb24gPSBEdXJhdGlvbiwgaW4gbWlsaXNlY29uZHMNCi8vc3RlcHMgPSBUcmFuc2l0aW9uIGludGVydmFscw0KDQpmdW5jdGlvbiB0cmFuc2Zvcm1MYXllciAoeCx5LHcsaCxpZCxkdXJhdGlvbixzdGVwcykgew0KICANCiAgLy9kdXJhdGlvbiBpcyBpbiBzZWNvbmRzDQogIHN0ZXBEdXJhdGlvbiA9IE1hdGgucm91bmQoZHVyYXRpb24vc3RlcHMpIDsgLy8gVmFsdWUgaXMgaW4gbWlsaXNlY29uZHMuDQoNCiAgb2JqID0gZGQuZWxlbWVudHNbaWRdOw0KICANCg0KICAvLyBHZXQgb3JpZ2luYWwgdmFsdWVzOiB4LHkgPSB0b3AgbGVmdCBjb3JuZXI7ICB3LGggPSB3aWR0aCBoZWlnaHQgICANCiAgDQogIHgxID0gb2JqLng7ICANCiAgeTEgPSBvYmoueTsgIA0KICB3MSA9IG9iai53OyAgDQogIGgxID0gb2JqLmg7ICANCg0KDQogIC8vIElmIHZhbHVlcyBub3Qgc2V0LCBvciB6ZXJvLCB3ZSBkbyBub3QgbW9kaWZ5IHRoZW0sIGFuZCB0YWtlIG9yaWdpbmFsIGFzIGZpbmFsIGFzIHdlbGwNCiAgeCA9ICh4KT94OngxOw0KICB5ID0gKHkpP3k6eTE7DQogIHcgPSAodyk/dzp3MTsNCiAgaCA9IChoKT9oOmgxOw0KDQogIC8vIGhvdyBtdWNoIGRvIHdlIG5lZWQgdG8gbW9kaWZ5IG91ciB2YWx1ZXMgZm9yIGVhY2ggc3RlcD8NCiAgLy8gVGhlIFdaIGxpYnJhcnkgbW92ZUJ5IGFuZCByZXNpemVCeSB0YWtlcyB0aGUgZGlmZiB3aXRoIGludmVydGVkIHNpZ24gYXMgZnJvbSBvcmlnaW5hbCBjZSBzY3JpcHQ6DQogIGRpZlggPSAoeCAtIHgxKS9zdGVwczsgIA0KICBkaWZZID0gKHkgLSB5MSkvc3RlcHM7ICANCiAgZGlmVyA9ICh3IC0gdzEpL3N0ZXBzOyAgDQogIGRpZkggPSAoaCAtIGgxKS9zdGVwczsgIA0KICANCiAgDQogIA0KICBpZih0b3AuZGVidWc9PXRydWUpICB3aW5kb3cuYWxlcnQoJ3gxOicreDErJywgeTE6Jyt5MSsnLCB3MTonK3cxKycsIGgxOicraDErJyw8YnI+eDonK3grJywgeTonK3krJywgdzonK3crJywgaDonK2grJywgPGJyPmRpZlg6JytkaWZYKycsIGRpZlk6JytkaWZZKycsIGRpZlc6JytkaWZXKycsIGRpZkg6JytkaWZIKycsPGJyPmR1cmF0aW9uOicrZHVyYXRpb24rJywgPGJyPnN0ZXBzOicrc3RlcHMrJyw8YnI+c3RlcER1cmF0aW9uOicrc3RlcER1cmF0aW9uKycnKTsNCiANCiAgb2JqLm1vdmVCeShkaWZYLGRpZlkpOw0KICBvYmoucmVzaXplQnkoZGlmVyxkaWZIKTsNCg0KICAvL1dlIHRha2Ugb3V0IHRoZSBhbW91bnQgb2YgdGltZSB1c2VkLCBhbmQgYSBzdGVwIGFscmVhZHkgYmVpbmcgZXhlY3V0ZWQNCiAgZHVyYXRpb24gPSAoZHVyYXRpb24gLSBzdGVwRHVyYXRpb24pOw0KICBzdGVwcyAtLTsNCg0KCS8vSWYgdGhlcmUgaXMgYW55IHN0ZXAgbGVmdCwgd2UgZXhlY3V0ZSBhZ2Fpbg0KCWlmKHN0ZXBzPj0wKXsNCgkgc2V0VGltZW91dCgndHJhbnNmb3JtTGF5ZXIoJyt4KycsJyt5KycsJyt3KycsJytoKycsIicraWQrJyIsJytkdXJhdGlvbisnLCcrc3RlcHMrJyknLHN0ZXBEdXJhdGlvbik7DQoJIH0NCiAgLy9JZiBSZXR1cm4uLi4gd2UgY291bGQgc2V0IHNvbWUgYXBpIGhlcmUgYXMgdG8gY2FsbCBhIGZ1bmN0aW9uIHRvIGJlIGV2YWx1YXRlZCBieSB0aGUgamF2YXNjcmlwdCxpZiBzZXQsIG9uIHJldHVybg0KICAvL2ZvciBleGFtcGxlIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIHRoYXQgaGFzIHRvIHBvcHVsYXRlIHRoZSBkaXYgd2l0aCBjb250ZW50DQogIC8vYnV0IFdaIGhhcyBhbHJlYWR5IHRob3VnaHQgb24gaXQgOi0pDQogIHJldHVybjsNCg0KfQ0KDQo='></script>
	-->
<!--

	<script id=script_wz_dragdrop src=/js/wz/wz_dragdrop.js></script>
	<script id=script_wz_graphics src=/js/wz/wz_graphics.js></script>
	<script id=script_wz_tooltip src=/js/wz/wz_tooltip.js></script>
	-->

<!--	
	<script id="wz_dragdrop" src='data:/text/plain;base64,LyogVGhpcyBub3RpY2UgbXVzdCBiZSB1bnRvdWNoZWQgYXQgYWxsIHRpbWVzLCBhbmQgbXVzdCBub3QgYmUgcmVtb3ZlZC4KCnd6X2RyYWdkcm9wLmpzCXYuIDQuOTEKVGhlIGxhdGVzdCB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBhdApodHRwOi8vd3d3LndhbHRlcnpvcm4uY29tCm9yIGh0dHA6Ly93d3cuZGV2aXJhLmNvbQpvciBodHRwOi8vd3d3LndhbHRlcnpvcm4uZGUKCkNvcHlyaWdodCAoYykgV2FsdGVyIFpvcm4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkNyZWF0ZWQgMjYuIDguIDIwMDIgYnkgV2FsdGVyIFpvcm4gKFdlYjogaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmNvbSApCkxhc3QgbW9kaWZpZWQ6IDEwLjEwLjIwMDgKClRoaXMgREhUTUwgJiBEcmFnJkRyb3AgTGlicmFyeSBhZGRzIERyYWcmRHJvcCBmdW5jdGlvbmFsaXR5IHRvOgotIGltYWdlcywgZXZlbiB0aG9zZSBub3QgcG9zaXRpb25lZCB2aWEgbGF5ZXJzLAogIG5vciB2aWEgc3R5bGVzaGVldHMgb3IgYW55IG90aGVyIGtpbmQgb2YgImhhcmQtY29kaW5nIjsKLSByZWxhdGl2ZWx5IGFuZCBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgbGF5ZXJzIChESVYgZWxlbWVudHMpLgpNb3Jlb3ZlciwgaXQgcHJvdmlkZXMgZXh0ZW5kZWQgREhUTUwgY2FwYWJpbGl0aWVzLgoKTElDRU5TRTogTEdQTAoKVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgKExHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgoKRm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApzZWUgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2xlc3Nlci5odG1sCiovCgoKLy8gUEFUSCBUTyBUSEUgVFJBTlNQQVJFTlQgMSoxIFBYIElNQUdFIChyZXF1aXJlZCBieSBOUyA0IGFzIHNwYWNlcikKdmFyIHNwYWNlciA9ICd0cmFuc3BhcmVudHBpeGVsLmdpZic7CgoKCgovL3dpbmRvdy5vbmVycm9yID0gbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdHJ1ZTsnKTsKCgovLyBPcHRpb25hbCBjb21tYW5kcyBwYXNzZWQgdG8gU0VUX0RIVE1MKCkgb24gdGhlIGh0bWwtcGFnZSAoZzogbWF5IGJlIGFwcGxpZWQgZ2xvYmFsbHksIGk6IGluZGl2aWR1YWxseSkKdmFyIENMT05FCQkJPSAnQzEwbkUnOyAgIC8vIGkgIGltZwkgIGNsb25lIGltYWdlCnZhciBDT1BZCQkJPSAnQzBwWSc7CS8vIGkgIGltZwkgIGNyZWF0ZSBjb3BpZXMKdmFyIERFVEFDSF9DSElMRFJFTiA9ICdkMzdhQ0gnOyAgLy8gaSAgbHlyCSAgZGV0YWNoIGltYWdlcwp2YXIgSE9SSVpPTlRBTAkJPSAnSDByMVonOyAgIC8vIGkgIGltZyxseXIgIGhvcml6b250YWxseSBkcmFnZ2FibGUgb25seQp2YXIgTUFYSEVJR0hUCQk9ICdtN3g4SSc7ICAgLy8gaSAgaW1nLGx5ciAgbWF4aW11bSBoZWlnaHQgbGltaXQsICIKdmFyIE1BWE9GRkJPVFRPTQk9ICdtN3hkMHdOJzsgLy8gaSAgaW1nLGx5ciAgZG93bndhcmQgb2Zmc2V0IGxpbWl0CnZhciBNQVhPRkZMRUZUCQk9ICdtN3gyM0Z0JzsgLy8gaSAgaW1nLGx5ciAgbGVmdHdhcmQgb2Zmc2V0IGxpbWl0CnZhciBNQVhPRkZSSUdIVAkJPSAnbTd4MEZmOCc7IC8vIGkgIGltZyxseXIgIHJpZ2h0d2FyZCBvZmZzZXQgbGltaXQKdmFyIE1BWE9GRlRPUAkJPSAnbTd4dTknOyAgIC8vIGkgIGltZyxseXIgIHVwd2FyZCBvZmZzZXQgbGltaXQKdmFyIE1BWFdJRFRICQk9ICdtN3hXMSc7ICAgLy8gaSAgaW1nLGx5ciAgbWF4aW11bSB3aWR0aCBsaW1pdCwgdXNlIHdpdGggcmVzaXphYmxlIG9yIHNjYWxhYmxlCnZhciBNSU5XSURUSAkJPSAnbTFudzEnOyAgIC8vIGkgIGltZyxseXIgIG1pbmltdW0gd2lkdGggbGltaXQsICIKdmFyIE1JTkhFSUdIVAkJPSAnbTFuOEknOyAgIC8vIGkgIGltZyxseXIgIG1pbmltdW0gaGVpZ2h0IGxpbWl0LCAiCnZhciBOT19BTFQJCQk9ICdubzgxVCc7ICAgLy8gZ2kgaW1nCSAgZGlzYWJsZSBhbHQgYW5kIHRpdGxlIGF0dHJpYnV0ZXMKdmFyIE5PX0RSQUcJCQk9ICdOMGQ0QWcnOyAgLy8gaSAgaW1nLGx5ciAgZGlzYWJsZSBkcmFnZ2FiaWxpdHkKdmFyIFJFU0VUX1oJCQk9ICdyMzVFN3onOyAgLy8gZ2kgaW1nLGx5ciAgcmVzZXQgei1pbmRleCB3aGVuIGRyb3BwZWQKdmFyIFJFU0laQUJMRQkJPSAncjVJWmJsJzsgIC8vIGdpIGltZyxseXIgIHJlc2l6YWJsZSBpZiA8Y3RybD4gb3IgPHNoaWZ0PiBwcmVzc2VkCnZhciBTQ0FMQUJMRQkJPSAnU0NMYmwnOyAgIC8vIGdpIGltZyxseXIgIHNjYWxhYmxlCQkgICAiCnZhciBTQ1JPTEwJCQk9ICdzQzhsTCc7ICAgLy8gZ2kgaW1nLGx5ciAgZW5hYmxlIGF1dG8gc2Nyb2xsIGZ1bmN0aW9uYWxpdHkKdmFyIFRSQU5TUEFSRU5UCQk9ICdkSUFwSEFuJzsgLy8gZ2kgaW1nLGx5ciAgdHJhbnNsdWNlbnQgd2hpbGUgZHJhZ2dlZAp2YXIgVkVSVElDQUwJCT0gJ1YzUnQxQyc7ICAvLyBpICBpbWcsbHlyICB2ZXJ0aWNhbGx5IGRyYWdnYWJsZSBvbmx5CnZhciBkZF9jdXJzb3JzID0gbmV3IEFycmF5KAoJJ2M6ZGVmYXVsdCcsCgknYzpjcm9zc2hhaXInLAoJJ2M6ZS1yZXNpemUnLAoJJ2M6aGFuZCcsCgknYzpoZWxwJywKCSdjOm1vdmUnLAoJJ2M6bi1yZXNpemUnLAoJJ2M6bmUtcmVzaXplJywKCSdjOm53LXJlc2l6ZScsCgknYzpzLXJlc2l6ZScsCgknYzpzZS1yZXNpemUnLAoJJ2M6c3ctcmVzaXplJywKCSdjOnRleHQnLAoJJ2M6dy1yZXNpemUnLAoJJ2M6d2FpdCcKKTsKZm9yKHZhciBkZF9pID0gZGRfY3Vyc29ycy5sZW5ndGg7IGRkX2k7KQp7LS1kZF9pOwoJZXZhbCgndmFyIENVUlNPUl8nICsgKGRkX2N1cnNvcnNbZGRfaV0uc3Vic3RyaW5nKDIpLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgnLScsICdfJykpICsgJyA9ICInICsgZGRfY3Vyc29yc1tkZF9pXSArICciOycpOwp9CnZhciBkZF91ID0gInVuZGVmaW5lZCI7CmZ1bmN0aW9uIFdaREQoKQp7Cgl0aGlzLmVsZW1lbnRzID0gbmV3IEFycmF5KDApOwoJdGhpcy5vYmogPSBudWxsOwoJdGhpcy5uID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOwoJdGhpcy5kYiA9IChkb2N1bWVudC5jb21wYXRNb2RlICYmIGRvY3VtZW50LmNvbXBhdE1vZGUudG9Mb3dlckNhc2UoKSAhPSAiYmFja2NvbXBhdCIpPwoJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudAoJCTogKGRvY3VtZW50LmJvZHkgfHwgbnVsbCk7Cgl0aGlzLm9wID0gISEod2luZG93Lm9wZXJhICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKTsKCWlmKHRoaXMub3ApIGRvY3VtZW50Lm9ubW91c2Vkb3duID0gbmV3IEZ1bmN0aW9uKCdlJywKCQknaWYoKChlID0gZSB8fCB3aW5kb3cuZXZlbnQpLnRhcmdldCB8fCBlLnNyY0VsZW1lbnQpLnRhZ05hbWUgPT0gIklNQUdFIikgcmV0dXJuIGZhbHNlOycpOwoJdGhpcy5pZSA9ICEhKHRoaXMubi5pbmRleE9mKCJtc2llIikgPj0gMCAmJiBkb2N1bWVudC5hbGwgJiYgdGhpcy5kYiAmJiAhdGhpcy5vcCk7Cgl0aGlzLmllbWFjID0gISEodGhpcy5pZSAmJiB0aGlzLm4uaW5kZXhPZigibWFjIikgPj0gMCk7Cgl0aGlzLmllNCA9ICEhKHRoaXMuaWUgJiYgIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKTsKCXRoaXMubjQgPSAhIShkb2N1bWVudC5sYXllcnMgJiYgdHlwZW9mIGRvY3VtZW50LmNsYXNzZXMgIT0gZGRfdSk7Cgl0aGlzLm42ID0gISEodHlwZW9mIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlICE9IGRkX3UgJiYgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZVJhbmdlICE9IGRkX3UpOwoJdGhpcy53M2MgPSAhISghdGhpcy5vcCAmJiAhdGhpcy5pZSAmJiAhdGhpcy5uNiAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCk7Cgl0aGlzLmNlID0gISEoZG9jdW1lbnQuY2FwdHVyZUV2ZW50cyAmJiBkb2N1bWVudC5yZWxlYXNlRXZlbnRzICYmICF0aGlzLm42KTsKCXRoaXMucHggPSB0aGlzLm40PyAnJyA6ICdweCc7Cgl0aGlzLnRXYWl0ID0gdGhpcy53M2M/IDQwIDogMTA7Cgl0aGlzLm5vUmVjYWxjID0gZmFsc2U7Cn0KdmFyIGRkID0gbmV3IFdaREQoKTsKCmRkLkludCA9IGZ1bmN0aW9uKGRfeCwgZF95KQp7CglyZXR1cm4gaXNOYU4oZF95ID0gcGFyc2VJbnQoZF94KSk/IDAgOiBkX3k7Cn07CmRkLmdldFduZFcgPSBmdW5jdGlvbigpCnsKCXJldHVybiBkZC5JbnQoCgkJKGRkLmRiICYmICFkZC5vcCAmJiAhZGQudzNjICYmIGRkLmRiLmNsaWVudFdpZHRoKT8gZGQuZGIuY2xpZW50V2lkdGgKCQk6ICh3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKQoJKTsKfTsKZGQuZ2V0V25kSCA9IGZ1bmN0aW9uKCkKewoJcmV0dXJuIGRkLkludCgKCQkoZGQuZGIgJiYgIWRkLm9wICYmICFkZC53M2MgJiYgZGQuZGIuY2xpZW50SGVpZ2h0KT8gZGQuZGIuY2xpZW50SGVpZ2h0CgkJOiAod2luZG93LmlubmVySGVpZ2h0IHx8IDApCgkpOwp9OwpkZC5nZXRTY3JvbGxYID0gZnVuY3Rpb24oKQp7CglyZXR1cm4gZGQuSW50KHdpbmRvdy5wYWdlWE9mZnNldCB8fCAoZGQuZGI/IGRkLmRiLnNjcm9sbExlZnQgOiAwKSk7Cn07CmRkLmdldFNjcm9sbFkgPSBmdW5jdGlvbigpCnsKCXJldHVybiBkZC5JbnQod2luZG93LnBhZ2VZT2Zmc2V0IHx8IChkZC5kYj8gZGQuZGIuc2Nyb2xsVG9wIDogMCkpOwp9OwpkZC5nZXRQYWdlWFkgPSBmdW5jdGlvbihkX28pCnsKCWlmKGRkLm40ICYmIGRfbykKCXsKCQlkZC54ID0gZF9vLnBhZ2VYIHx8IDA7CgkJZGQueSA9IGRfby5wYWdlWSB8fCAwOwoJfQoJZWxzZQoJewoJCWRkLnggPSBkZC55ID0gMDsgLy9nbG9iYWwgaGVscGVyIHZhcnMKCQl3aGlsZShkX28pCgkJewoJCQlkZC54ICs9IGRkLkludChkX28ub2Zmc2V0TGVmdCk7CgkJCWRkLnkgKz0gZGQuSW50KGRfby5vZmZzZXRUb3ApOwoJCQlkX28gPSBkX28ub2Zmc2V0UGFyZW50IHx8IG51bGw7CgkJfQoJfQp9OwpkZC5nZXRDc3NYWSA9IGZ1bmN0aW9uKGRfbykKewoJaWYoZF9vLmRpdikKCXsKCQlpZihkZC5uNCkKCQl7CgkJCWRfby5jc3N4ID0gZF9vLmRpdi54OwoJCQlkX28uY3NzeSA9IGRfby5kaXYueTsKCQl9CgkJZWxzZSBpZihkZC5pZTQpCgkJewoJCQlkX28uY3NzeCA9IGRfby5jc3MucGl4ZWxMZWZ0OwoJCQlkX28uY3NzeSA9IGRfby5jc3MucGl4ZWxUb3A7CgkJfQoJCWVsc2UKCQl7CgkJCWRfby5jc3MubGVmdCA9IGRfby5jc3MudG9wID0gMCArIGRkLnB4OwoJCQlkZC5nZXRQYWdlWFkoZF9vLmRpdik7CgkJCWRfby5jc3N4ID0gZF9vLnggLSBkZC54OwoJCQlkX28uY3NzeSA9IGRfby55IC0gZGQueTsKCQkJZF9vLmNzcy5sZWZ0ID0gZF9vLmNzc3ggKyBkZC5weDsKCQkJZF9vLmNzcy50b3AgPSBkX28uY3NzeSArIGRkLnB4OwoJCX0KCX0KCWVsc2UKCXsKCQlkX28uY3NzeCA9IDA7CgkJZF9vLmNzc3kgPSAwOwoJfQp9OwpkZC5nZXRJbWdXID0gZnVuY3Rpb24oZF9vKQp7CglyZXR1cm4gZF9vPyBkZC5JbnQoZF9vLndpZHRoKSA6IDA7Cn07CmRkLmdldEltZ0ggPSBmdW5jdGlvbihkX28pCnsKCXJldHVybiBkX28/IGRkLkludChkX28uaGVpZ2h0KSA6IDA7Cn07CmRkLmdldERpdlcgPSBmdW5jdGlvbihkX28pCnsKCXJldHVybiBkZC5JbnQoCgkJZGQubjQ/IChkX28uZGl2PyBkX28uZGl2LmNsaXAud2lkdGggOiAwKQoJCTogZF9vLmRpdj8gKGRfby5kaXYub2Zmc2V0V2lkdGggfHwgZF9vLmNzcy5waXhlbFdpZHRoIHx8IGRfby5jc3Mud2lkdGggfHwgMCkKCQk6IDAKCSk7Cn07CmRkLmdldERpdkggPSBmdW5jdGlvbihkX28pCnsKCXJldHVybiBkZC5JbnQoCgkJZGQubjQ/IChkX28uZGl2PyBkX28uZGl2LmNsaXAuaGVpZ2h0IDogMCkKCQk6IGRfby5kaXY/IChkX28uZGl2Lm9mZnNldEhlaWdodCB8fCBkX28uY3NzLnBpeGVsSGVpZ2h0IHx8IGRfby5jc3MuaGVpZ2h0IHx8IDApCgkJOiAwCgkpOwp9OwpkZC5nZXRXSCA9IGZ1bmN0aW9uKGRfbykKewoJZF9vLncgPSBkZC5nZXREaXZXKGRfbyk7CglkX28uaCA9IGRkLmdldERpdkgoZF9vKTsKCWlmKGRfby5jc3MpCgl7CgkJZF9vLmNzcy53aWR0aCA9IGRfby53ICsgZGQucHg7CgkJZF9vLmNzcy5oZWlnaHQgPSBkX28uaCArIGRkLnB4OwoJCWRfby5kdyA9IGRkLmdldERpdlcoZF9vKS1kX28udzsKCQlkX28uZGggPSBkZC5nZXREaXZIKGRfbyktZF9vLmg7CgkJZF9vLmNzcy53aWR0aCA9IChkX28udy1kX28uZHcpICsgZGQucHg7CgkJZF9vLmNzcy5oZWlnaHQgPSAoZF9vLmgtZF9vLmRoKSArIGRkLnB4OwoJfQoJZWxzZSBkX28uZHcgPSBkX28uZGggPSAwOwp9OwpkZC5nZXRDc3NQcm9wID0gZnVuY3Rpb24oZF9vLCBkX3BuNiwgZF9wc3R5bGUsIGRfcG40KQp7CglpZihkX28gJiYgZGQubjYpIHJldHVybiAnJyt3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkX28sIG51bGwpLmdldFByb3BlcnR5VmFsdWUoZF9wbjYpOwoJaWYoZF9vICYmIGRfby5jdXJyZW50U3R5bGUpIHJldHVybiAnJytldmFsKCdkX28uY3VycmVudFN0eWxlLicrZF9wc3R5bGUpOwoJaWYoZF9vICYmIGRfby5zdHlsZSkgcmV0dXJuICcnK2V2YWwoJ2Rfby5zdHlsZS4nK2RfcHN0eWxlKTsKCWlmKGRfbyAmJiBkZC5uNCkgcmV0dXJuICcnK2V2YWwoJ2Rfby4nK2RfcG40KTsKCXJldHVybiAnJzsKfTsKZGQuZ2V0RGl2ID0gZnVuY3Rpb24oZF94LCBkX2QpCnsKCWRfZCA9IGRfZCB8fCBkb2N1bWVudDsKCWlmKGRkLm40KQoJewoJCWlmKGRfZC5sYXllcnNbZF94XSkgcmV0dXJuIGRfZC5sYXllcnNbZF94XTsKCQlmb3IodmFyIGRfaSA9IGRfZC5sYXllcnMubGVuZ3RoOyBkX2k7KQoJCXsKCQkJdmFyIGRfeSA9IGRkLmdldERpdihkX3gsIGRfZC5sYXllcnNbLS1kX2ldLmRvY3VtZW50KTsKCQkJaWYoZF95KSByZXR1cm4gZF95OwoJCX0KCX0KCWlmKGRkLmllKSByZXR1cm4gZF9kLmFsbFtkX3hdIHx8IG51bGw7CglpZihkX2QuZ2V0RWxlbWVudEJ5SWQpIHJldHVybiBkX2QuZ2V0RWxlbWVudEJ5SWQoZF94KSB8fCBudWxsOwoJcmV0dXJuIG51bGw7Cn07CmRkLmdldEltZyA9IGZ1bmN0aW9uKGRfbywgZF9ubSwgZF94eSwgZF93KQp7CglkX3cgPSBkX3cgfHwgd2luZG93OwoJdmFyIGRfaW1nOwoJaWYoZG9jdW1lbnQuaW1hZ2VzICYmIChkX2ltZyA9IGRfdy5kb2N1bWVudC5pbWFnZXNbZF9ubV0pKQoJewoJCWlmKGRfeHkpCgkJewoJCQlpZihkZC5uNCkKCQkJewoJCQkJZGQuZ2V0UGFnZVhZKGRfdyk7CgkJCQlkX28uZGVmeCA9IGRfaW1nLnggKyBkZC54OwoJCQkJZF9vLmRlZnkgPSBkX2ltZy55ICsgZGQueTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRkLmdldFBhZ2VYWShkX2ltZyk7CgkJCQlkX28uZGVmeCA9IGRkLng7CgkJCQlkX28uZGVmeSA9IGRkLnk7CgkJCX0KCQl9CgkJcmV0dXJuIGRfaW1nOwoJfQoJaWYoZGQubjQpIGZvcih2YXIgZF9pID0gZF93LmRvY3VtZW50LmxheWVycy5sZW5ndGg7IGRfaTspCgl7CgkJdmFyIGRfeSA9IGRkLmdldEltZyhkX28sIGRfbm0sIGRfeHksIGRfdy5kb2N1bWVudC5sYXllcnNbLS1kX2ldKTsKCQlpZihkX3kpIHJldHVybiBkX3k7Cgl9CglyZXR1cm4gbnVsbDsKfTsKZGQuZ2V0UGFyZW50ID0gZnVuY3Rpb24oZF9vLCBkX3ApCnsKCWlmKGRkLm40KQoJewoJCWZvcih2YXIgZF9pID0gZGQuZWxlbWVudHMubGVuZ3RoOyBkX2k7KQoJCXsKCQkJaWYoISgoZF9wID0gZGQuZWxlbWVudHNbLS1kX2ldKS5pc19pbWFnZSkgJiYgZF9wLmRpdiAmJiAoZF9wLmRpdi5kb2N1bWVudC5sYXllcnNbZF9vLm5hbWVdIHx8IGRfby5vaW1nICYmIGRfcC5kaXYuZG9jdW1lbnQuaW1hZ2VzW2Rfby5vaW1nLm5hbWVdKSkKCQkJCWRfcC5hZGRDaGlsZChkX28sIGRfcC5kZXRhY2gsIDEpOwoJCX0KCX0KCWVsc2UKCXsKCQlkX3AgPSBkX28uaXNfaW1hZ2U/IGRkLmdldEltZyhkX28sIGRfby5vaW1nLm5hbWUpIDogKGRfby5kaXYgfHwgbnVsbCk7CgkJd2hpbGUoZF9wICYmICEhKGRfcCA9IGRfcC5vZmZzZXRQYXJlbnQgfHwgZF9wLnBhcmVudE5vZGUgfHwgbnVsbCkpCgkJewoJCQlpZihkX3AuZGRPYmopCgkJCXsKCQkJCWRfcC5kZE9iai5hZGRDaGlsZChkX28sIGRfcC5kZE9iai5kZXRhY2gsIDEpOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn07CmRkLmdldENtZCA9IGZ1bmN0aW9uKGRfbywgZF9jbWQsIGRfY21kU3RyKQp7Cgl2YXIgZF9pID0gZF9vLmlkLmluZGV4T2YoZF9jbWQpLCBkX2osCglkX3kgPSAoZF9pID49IDApKjE7CglpZihkX3kpCgl7CgkJZF9qID0gZF9pK2RfY21kLmxlbmd0aDsKCQlpZihkX2NtZFN0cikgZF9vLmNtZCArPSBkX28uaWQuc3Vic3RyaW5nKGRfaSwgZF9qKTsKCQlkX28uaWQgPSBkX28uaWQuc3Vic3RyaW5nKDAsIGRfaSkgKyBkX28uaWQuc3Vic3RyaW5nKGRfaik7Cgl9CglyZXR1cm4gZF95Owp9OwpkZC5nZXRDbWRWYWwgPSBmdW5jdGlvbihkX28sIGRfY21kLCBkX2NtZFN0ciwgaW50MCkKewoJdmFyIGRfaSA9IGRfby5pZC5pbmRleE9mKGRfY21kKSwgZF9qLAoJZF95ID0gKGRfby5pZC5pbmRleE9mKGRfY21kKSA+PSAwKT8gZGQuSW50KGRfby5pZC5zdWJzdHJpbmcoZF9vLmlkLmluZGV4T2YoZF9jbWQpK2RfY21kLmxlbmd0aCkpIDogaW50MD8gLTEgOiAwOwoJaWYoIWludDAgJiYgZF95IHx8IGludDAgJiYgZF95ID49IDApCgl7CgkJZF9qID0gZF9pK2RfY21kLmxlbmd0aCsoIiIrZF95KS5sZW5ndGg7CgkJaWYoZF9jbWRTdHIpIGRfby5jbWQgKz0gZF9vLmlkLnN1YnN0cmluZyhkX2ksIGRfaik7CgkJZF9vLmlkID0gZF9vLmlkLnN1YnN0cmluZygwLCBkX2kpICsgZF9vLmlkLnN1YnN0cmluZyhkX2opOwoJfQoJcmV0dXJuIGRfeTsKfTsKZGQuYWRkRWx0ID0gZnVuY3Rpb24oZF9vLCBkX3ApCnsKCWRkLmVsZW1lbnRzW2Rfby5uYW1lXSA9IGRkLmVsZW1lbnRzW2Rfby5pbmRleCA9IGRkLmVsZW1lbnRzLmxlbmd0aF0gPSBkX287CglpZihkX3ApIGRfcC5jb3BpZXNbZF9vLm5hbWVdID0gZF9wLmNvcGllc1tkX3AuY29waWVzLmxlbmd0aF0gPSBkX287Cn07CmRkLm1rV3pEb20gPSBmdW5jdGlvbigpCnsKCXZhciBkX28sIGRfbCA9IGRkLmVsZW1lbnRzLmxlbmd0aCwgZF9pOwoJZm9yKGRfaSA9IGRfbDsgZF9pOykgZGQuZ2V0UGFyZW50KGRkLmVsZW1lbnRzWy0tZF9pXSk7Cglmb3IoZF9pID0gZF9sOyBkX2k7KQoJewoJCWlmKChkX28gPSBkZC5lbGVtZW50c1stLWRfaV0pLmNoaWxkcmVuICYmICFkX28ucGFyZW50KQoJCXsKCQkJZm9yKHZhciBkX2ogPSBkX28uY2hpbGRyZW4ubGVuZ3RoOyBkX2o7KQoJCQl7LS1kX2o7CgkJCQlkX28uY2hpbGRyZW5bZF9qXS5zZXRaKGRfby56K2Rfby5jaGlsZHJlbltkX2pdLnosIDEpOwoJCQl9CgkJfQoJfQp9OwpkZC5hZGRQcm9wcyA9IGZ1bmN0aW9uKGRfbykKewoJaWYoZF9vLmlzX2ltYWdlKQoJewoJCWRfby5kaXYgPSBkZC5nZXREaXYoZF9vLmlkKTsKCQlkX28uY3NzID0gKGRfby5kaXYgJiYgdHlwZW9mIGRfby5kaXYuc3R5bGUgIT0gZGRfdSk/IGRfby5kaXYuc3R5bGUgOiBudWxsOwoJCWRfby5uaW1nID0gKGRkLm40ICYmIGRfby5kaXYpPyBkX28uZGl2LmRvY3VtZW50LmltYWdlc1swXSA6IChkb2N1bWVudC5pbWFnZXNbZF9vLmlkKyJOSTFtNkciXSB8fCBudWxsKTsKCQlpZighZF9vLm5vYWx0ICYmICFkZC5ub2FsdCAmJiBkX28ubmltZyAmJiBkX28ub2ltZykKCQl7CgkJCWRfby5uaW1nLmFsdCA9IGRfby5vaW1nLmFsdCB8fCAnJzsKCQkJZF9vLm5pbWcudGl0bGUgPSBkX28ub2ltZy50aXRsZTsKCQkJZF9vLm5pbWcub25tb3VzZW92ZXIgPSBkX28ub2ltZy5vbm1vdXNlb3ZlcjsKCQkJZF9vLm5pbWcub25tb3VzZW91dCA9IGRfby5vaW1nLm9ubW91c2VvdXQ7CgkJfQoJCWRfby5iZ0NvbG9yID0gJyc7Cgl9CgllbHNlCgl7CgkJZF9vLmJnQ29sb3IgPSBkZC5nZXRDc3NQcm9wKGRfby5kaXYsICdiYWNrZ3JvdW5kLWNvbG9yJywnYmFja2dyb3VuZENvbG9yJywnYmdDb2xvcicpLnRvTG93ZXJDYXNlKCk7CgkJaWYoZGQubjYgJiYgZF9vLmRpdikKCQl7CgkJCXZhciBkX2MgPSBkX28uYmdDb2xvci50b0xvd2VyQ2FzZSgpOwoJCQlpZihkX2MuaW5kZXhPZigncmdiJykgPj0gMCkKCQkJewoJCQkJZF9jID0gZF9jLnN1YnN0cmluZyg0LCBkX2MubGVuZ3RoLTEpLnNwbGl0KCcsJyk7CgkJCQlkX28uYmdDb2xvciA9ICcjJzsKCQkJCWZvcih2YXIgZF9sID0gZF9jLmxlbmd0aCwgZF9pID0gMDsgZF9pIDwgZF9sOyBkX2krKykgZF9vLmJnQ29sb3IgKz0gcGFyc2VJbnQoZF9jW2RfaV0pLnRvU3RyaW5nKDB4MTApOwoJCQl9CgkJCWVsc2UgZF9vLmJnQ29sb3IgPSBkX2M7CgkJfQoJfQoJaWYoZGQuc2NhbGFibGUpIGRfby5zY2FsYWJsZSA9IGRfby5yZXNpemFibGVeMTsKCWVsc2UgaWYoZGQucmVzaXphYmxlKSBkX28ucmVzaXphYmxlID0gZF9vLnNjYWxhYmxlXjE7CglkX28uc2V0WihkX28uZGVmeik7CglkX28uY3Vyc29yID0gZF9vLmN1cnNvciB8fCBkZC5jdXJzb3IgfHwgJ2F1dG8nOwoJZF9vLl9zZXRDcnMoZF9vLm5vZHJhZz8gJ2F1dG8nIDogZF9vLmN1cnNvcik7CglkX28uZGlhcGhhbiA9IGRfby5kaWFwaGFuIHx8IGRkLmRpYXBoYW4gfHwgMDsKCWRfby5vcGFjaXR5ID0gMS4wOwoJZF9vLnZpc2libGUgPSB0cnVlOwp9OwpkZC5pbml0eiA9IGZ1bmN0aW9uKCkKewoJaWYoIShkZCAmJiAoZGQubjQgfHwgZGQubjYgfHwgZGQuaWUgfHwgZGQub3AgfHwgZGQudzNjKSkpIHJldHVybjsKCWVsc2UgaWYoZGQubjYgfHwgZGQuaWUgfHwgZGQub3AgfHwgZGQudzNjKSBkZC5yZWNhbGMoMSk7Cgl2YXIgZF9kcmFnID0gKGRvY3VtZW50Lm9ubW91c2Vtb3ZlID09IERSQUcpLAoJZF9yZXNpemUgPSAoZG9jdW1lbnQub25tb3VzZW1vdmUgPT0gUkVTSVpFKTsKCWlmKGRkLmxvYWRGdW5jKSBkZC5sb2FkRnVuYygpOwoJaWYoZF9kcmFnKSBkZC5zZXRNb3ZIZGwoRFJBRyk7CgllbHNlIGlmKGRfcmVzaXplKSBkZC5zZXRNb3ZIZGwoUkVTSVpFKTsKCWlmKGRfZHJhZyB8fCBkX3Jlc2l6ZSkgZGQuc2V0VXBIZGwoRFJPUCk7CglkZC5zZXREd25IZGwoUElDSyk7Cn07CmRkLmZpbmx6ID0gZnVuY3Rpb24oKQp7CglpZihkZC5pZSAmJiBkZC5lbGVtZW50cykKCXsKCQlkZC5ub1JlY2FsYyA9IHRydWU7CgkJZm9yKHZhciBkX2kgPSBkZC5lbGVtZW50cy5sZW5ndGg7IGRfaTspCgkJCWRkLmVsZW1lbnRzWy0tZF9pXS5kZWwoKTsKCQlkZC5ub1JlY2FsYyA9IGZhbHNlOwoJfQoJaWYoZGQudWxvYWRGdW5jKSBkZC51bG9hZEZ1bmMoKTsKfTsKZGQuc2V0Q2UgPSBmdW5jdGlvbihkX2UsIGRfZm5jKQp7CglkX2ZuYz8gZG9jdW1lbnQuY2FwdHVyZUV2ZW50cyhkX2UpIDogZG9jdW1lbnQucmVsZWFzZUV2ZW50cyhkX2UpOwp9OwpkZC5zZXREd25IZGwgPSBmdW5jdGlvbihkX3gpCnsKCWlmKGRvY3VtZW50Lm9ubW91c2Vkb3duICE9IGRfeCkKCXsKCQlkZC5kb3duRnVuYyA9IGRvY3VtZW50Lm9ubW91c2Vkb3duOwoJCWRvY3VtZW50Lm9ubW91c2Vkb3duID0gZF94OwoJCWlmKGRkLmNlKSBkZC5zZXRDZShFdmVudC5NT1VTRURPV04sIGRfeCk7Cgl9Cn07CmRkLnNldE1vdkhkbCA9IGZ1bmN0aW9uKGRfeCkKewoJaWYoZG9jdW1lbnQub25tb3VzZW1vdmUgIT0gZF94KQoJewoJCWRkLm1vdmVGdW5jID0gZG9jdW1lbnQub25tb3VzZW1vdmU7CgkJZG9jdW1lbnQub25tb3VzZW1vdmUgPSBkX3g7CgkJaWYoZGQuY2UpIGRkLnNldENlKEV2ZW50Lk1PVVNFTU9WRSwgZF94KTsKCX0KfTsKZGQuc2V0VXBIZGwgPSBmdW5jdGlvbihkX3gpCnsKCWlmKGRvY3VtZW50Lm9ubW91c2V1cCAhPSBkX3gpCgl7CgkJZGQudXBGdW5jID0gZG9jdW1lbnQub25tb3VzZXVwOwoJCWRvY3VtZW50Lm9ubW91c2V1cCA9IGRfeDsKCQlpZihkZC5jZSkgZGQuc2V0Q2UoRXZlbnQuTU9VU0VVUCwgZF94KTsKCX0KfTsKZGQuZXZ0ID0gZnVuY3Rpb24oZF9lKQp7Cgl0aGlzLmJ1dCA9ICh0aGlzLmUgPSBkX2UgfHwgd2luZG93LmV2ZW50KS53aGljaCB8fCB0aGlzLmUuYnV0dG9uIHx8IDA7Cgl0aGlzLmJ1dHRvbiA9ICh0aGlzLmUudHlwZSA9PSAnbW91c2Vkb3duJyk/IHRoaXMuYnV0CgkJOiAoZGQuZSAmJiBkZC5lLmJ1dHRvbik/IGRkLmUuYnV0dG9uCgkJOiAwOwoJdGhpcy5zcmMgPSB0aGlzLmUudGFyZ2V0IHx8IHRoaXMuZS5zcmNFbGVtZW50IHx8IG51bGw7Cgl0aGlzLnNyYy50YWcgPSAoIiIgKyAodGhpcy5zcmMudGFnTmFtZSB8fCB0aGlzLnNyYykpLnRvTG93ZXJDYXNlKCk7Cgl0aGlzLnggPSBkZC5JbnQodGhpcy5lLnBhZ2VYIHx8IHRoaXMuZS5jbGllbnRYIHx8IDApOwoJdGhpcy55ID0gZGQuSW50KHRoaXMuZS5wYWdlWSB8fCB0aGlzLmUuY2xpZW50WSB8fCAwKTsKCWlmKGRkLmllKQoJewoJCXRoaXMueCArPSBkZC5nZXRTY3JvbGxYKCkgLSAoZGQuaWUgJiYgIWRkLmllbWFjKSoxOwoJCXRoaXMueSArPSBkZC5nZXRTY3JvbGxZKCkgLSAoZGQuaWUgJiYgIWRkLmllbWFjKSoxOwoJfQoJdGhpcy5tb2RpZktleSA9IHRoaXMuZS5tb2RpZmllcnM/IHRoaXMuZS5tb2RpZmllcnMmRXZlbnQuU0hJRlRfTUFTSyA6ICh0aGlzLmUuc2hpZnRLZXkgfHwgZmFsc2UpOwp9OwpkZC5nZXRFdmVudFRhcmdldCA9IGZ1bmN0aW9uKGRfZSwgZF9zLCBkX24pCnsKCWRfZSA9IGRfZSB8fCB3aW5kb3cuZXZlbnQ7CglpZihkX2UgJiYgKGRfcyA9IGRfZS50YXJnZXQgfHwgZF9lLnNyY0VsZW1lbnQgfHwgbnVsbCkgIT0gbnVsbCkKCXsKCQlpZihudWxsICE9IChkX24gPSBkX3MuaWQgfHwgZF9zLm5hbWUgfHwgbnVsbCkpCgkJewoJCQlpZihkX24uaW5kZXhPZigiZElpMTV2TkkxbTZHIikgPT0gZF9uLmxlbmd0aC0xMikKCQkJCXJldHVybiBkZC5lbGVtZW50c1tkX24uc3Vic3RyaW5nKDAsIGRfbi5sZW5ndGgtMTIpXSB8fCBudWxsOwoJCQlpZihkX24uaW5kZXhPZigiZElpMTV2IikgPT0gZF9uLmxlbmd0aC02KQoJCQkJcmV0dXJuIGRkLmVsZW1lbnRzW2Rfbi5zdWJzdHJpbmcoMCwgZF9uLmxlbmd0aC02KV0gfHwgbnVsbDsKCQkJcmV0dXJuIGRkLmVsZW1lbnRzW2Rfbl0gfHwgbnVsbDsKCQl9Cgl9CglyZXR1cm4gbnVsbDsKfTsKZGQucmVjYWxjID0gZnVuY3Rpb24oZF94KQp7CglpZihkZC5ub1JlY2FsYykgcmV0dXJuOwoJZm9yKHZhciBkX28sIGRfaSA9IGRkLmVsZW1lbnRzLmxlbmd0aDsgZF9pOykKCXsKCQlpZighKGRfbyA9IGRkLmVsZW1lbnRzWy0tZF9pXSkuaXNfaW1hZ2UgJiYgZF9vLmRpdikKCQl7CgkJCWRkLmdldFdIKGRfbyk7CgkJCWlmKGRfby5kaXYucG9zX3JlbCkKCQkJewoJCQkJZGQuZ2V0UGFnZVhZKGRfby5kaXYpOwoJCQkJdmFyIGRfZHggPSBkZC54IC0gZF9vLngsIGRfZHkgPSBkZC55IC0gZF9vLnk7CgkJCQlkX28uZGVmeCArPSBkX2R4OwoJCQkJZF9vLnggKz0gZF9keDsKCQkJCWRfby5kZWZ5ICs9IGRfZHk7CgkJCQlkX28ueSArPSBkX2R5OwoJCQkJZm9yKHZhciBkX3AsIGRfaiA9IGRfby5jaGlsZHJlbi5sZW5ndGg7IGRfajspCgkJCQl7CgkJCQkJaWYoIShkX3AgPSBkX28uY2hpbGRyZW5bLS1kX2pdKS5kZXRhY2hlZCAmJiAoZF9vICE9IGRfcC5kZWZwYXJlbnQgfHwgIShkX3AuaXNfaW1hZ2UgJiYgZGQuZ2V0SW1nKGRfcCwgZF9wLm9pbWcubmFtZSwgMSkpKSkKCQkJCQl7CgkJCQkJCWRfcC5kZWZ4ICs9IGRfZHg7CgkJCQkJCWRfcC5kZWZ5ICs9IGRfZHk7CgkJCQkJCWRfcC5tb3ZlQnkoZF9keCwgZF9keSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCWVsc2UgaWYoZF9vLmlzX2ltYWdlICYmICFkZC5uNCkKCQl7CgkJCWlmKGRkLm42ICYmIGRfeCAmJiAhZF9vLmRlZncpIGRfby5yZXNpemVUbyhkX28uZGVmdyA9IGRkLmdldEltZ1coZF9vLm9pbWcpLCBkX28uZGVmaCA9IGRkLmdldEltZ0goZF9vLm9pbWcpKTsKCQkJdmFyIGRfZGVmeCA9IGRfby5kZWZ4LCBkX2RlZnkgPSBkX28uZGVmeTsKCQkJaWYoIShkX28ucGFyZW50ICYmIGRfby5wYXJlbnQgIT0gZF9vLmRlZnBhcmVudCkgJiYgKGRfeCB8fCAhZF9vLmRldGFjaGVkIHx8IGRfby5ob3Jpem9udGFsIHx8IGRfby52ZXJ0aWNhbCkgJiYgZGQuZ2V0SW1nKGRfbywgZF9vLm9pbWcubmFtZSwgMSkpCgkJCQlkX28ubW92ZUJ5KGRfby5kZWZ4LWRfZGVmeCwgZF9vLmRlZnktZF9kZWZ5KTsKCQl9Cgl9Cn07CmZ1bmN0aW9uIFdJTlNaKGRfeCkKewoJaWYoZF94KQoJewoJCWlmKGRkLm40KQoJCXsKCQkJZGQuaVcgPSBpbm5lcldpZHRoOwoJCQlkZC5pSCA9IGlubmVySGVpZ2h0OwoJCX0KCQl3aW5kb3cub25yZXNpemUgPSBuZXcgRnVuY3Rpb24oJ1dJTlNaKCk7Jyk7Cgl9CgllbHNlIGlmKGRkLm40ICYmIChpbm5lcldpZHRoICE9IGRkLmlXIHx8IGlubmVySGVpZ2h0ICE9IGRkLmlIKSkgbG9jYXRpb24ucmVsb2FkKCk7CgllbHNlIGlmKCFkZC5uNCkgc2V0VGltZW91dCgnZGQucmVjYWxjKCknLCAweGEpOwp9CldJTlNaKDEpOwoKZnVuY3Rpb24gRERPYmooZF9vLCBkX2kpCnsKCXRoaXMuaWQgPSBkX287Cgl0aGlzLmNtZCA9ICcnOwoJdGhpcy5jcHlfbiA9IGRkLmdldENtZFZhbCh0aGlzLCBDT1BZKTsKCXRoaXMubWF4b2ZmYiA9IGRkLmdldENtZFZhbCh0aGlzLCBNQVhPRkZCT1RUT00sIDAsIDEpOwoJdGhpcy5tYXhvZmZsID0gZGQuZ2V0Q21kVmFsKHRoaXMsIE1BWE9GRkxFRlQsIDAsIDEpOwoJdGhpcy5tYXhvZmZyID0gZGQuZ2V0Q21kVmFsKHRoaXMsIE1BWE9GRlJJR0hULCAwLCAxKTsKCXRoaXMubWF4b2ZmdCA9IGRkLmdldENtZFZhbCh0aGlzLCBNQVhPRkZUT1AsIDAsIDEpOwoJdmFyIGRfaiA9IGRkX2N1cnNvcnMubGVuZ3RoOyB3aGlsZShkX2otLSkKCQlpZihkZC5nZXRDbWQodGhpcywgZGRfY3Vyc29yc1tkX2pdLCAxKSkgdGhpcy5jdXJzb3IgPSBkZF9jdXJzb3JzW2Rfal0uc3Vic3RyaW5nKDIpOwoJdGhpcy5jbG9uZSA9IGRkLmdldENtZCh0aGlzLCBDTE9ORSwgMSk7Cgl0aGlzLmRldGFjaCA9IGRkLmdldENtZCh0aGlzLCBERVRBQ0hfQ0hJTERSRU4pOwoJdGhpcy5zY2FsYWJsZSA9IGRkLmdldENtZCh0aGlzLCBTQ0FMQUJMRSwgMSk7Cgl0aGlzLmhvcml6b250YWwgPSBkZC5nZXRDbWQodGhpcywgSE9SSVpPTlRBTCk7Cgl0aGlzLm5vYWx0ID0gZGQuZ2V0Q21kKHRoaXMsIE5PX0FMVCwgMSk7Cgl0aGlzLm5vZHJhZyA9IGRkLmdldENtZCh0aGlzLCBOT19EUkFHKTsKCXRoaXMuc2Nyb2xsID0gZGQuZ2V0Q21kKHRoaXMsIFNDUk9MTCwgMSk7Cgl0aGlzLnJlc2l6YWJsZSA9IGRkLmdldENtZCh0aGlzLCBSRVNJWkFCTEUsIDEpOwoJdGhpcy5yZV96ID0gZGQuZ2V0Q21kKHRoaXMsIFJFU0VUX1osIDEpOwoJdGhpcy5kaWFwaGFuID0gZGQuZ2V0Q21kKHRoaXMsIFRSQU5TUEFSRU5ULCAxKTsKCXRoaXMudmVydGljYWwgPSBkZC5nZXRDbWQodGhpcywgVkVSVElDQUwpOwoJdGhpcy5tYXh3ID0gZGQuZ2V0Q21kVmFsKHRoaXMsIE1BWFdJRFRILCAxLCAxKTsKCXRoaXMubWludyA9IE1hdGguYWJzKGRkLmdldENtZFZhbCh0aGlzLCBNSU5XSURUSCwgMSwgMSkpOwoJdGhpcy5tYXhoID0gZGQuZ2V0Q21kVmFsKHRoaXMsIE1BWEhFSUdIVCwgMSwgMSk7Cgl0aGlzLm1pbmggPSBNYXRoLmFicyhkZC5nZXRDbWRWYWwodGhpcywgTUlOSEVJR0hULCAxLCAxKSk7Cgl0aGlzLnBpY2tGdW5jID0gdGhpcy5kcmFnRnVuYyA9IHRoaXMucmVzaXplRnVuYyA9IHRoaXMuZHJvcEZ1bmMgPSBudWxsOwoKCXRoaXMubmFtZSA9IHRoaXMuaWQgKyAoZF9pIHx8ICcnKTsKCXRoaXMub2ltZyA9IGRkLmdldEltZyh0aGlzLCB0aGlzLmlkLCAxKTsKCXRoaXMuaXNfaW1hZ2UgPSAhIXRoaXMub2ltZzsKCXRoaXMuY29waWVzID0gbmV3IEFycmF5KCk7Cgl0aGlzLmNoaWxkcmVuID0gbmV3IEFycmF5KCk7Cgl0aGlzLnBhcmVudCA9IHRoaXMub3JpZ2luYWwgPSBudWxsOwoJaWYodGhpcy5vaW1nKQoJewoJCXRoaXMuaWQgPSB0aGlzLm5hbWUgKyAiZElpMTV2IjsKCQl0aGlzLncgPSBkZC5nZXRJbWdXKHRoaXMub2ltZyk7CgkJdGhpcy5oID0gZGQuZ2V0SW1nSCh0aGlzLm9pbWcpOwoJCXRoaXMuZHcgPSB0aGlzLmRoID0gMDsKCQl0aGlzLmRlZnogPSBkZC5JbnQoZGQuZ2V0Q3NzUHJvcCh0aGlzLm9pbWcsICd6LWluZGV4JywnekluZGV4JywnekluZGV4JykpIHx8IDE7CgkJdGhpcy5kZWZzcmMgPSB0aGlzLnNyYyA9IHRoaXMub2ltZy5zcmM7CgkJdGhpcy5odG0gPSAnPGltZyBuYW1lPSInICsgdGhpcy5pZCArICdOSTFtNkciJysKCQkJJyBzcmM9IicgKyB0aGlzLm9pbWcuc3JjICsgJyIgJysKCQkJJ3dpZHRoPSInICsgdGhpcy53ICsgJyIgaGVpZ2h0PSInICsgdGhpcy5oICsgJyI+JzsKCQl0aGlzLnRfaHRtID0gJzxkaXYgaWQ9IicgKyB0aGlzLmlkICsKCQkJJyIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOycrCgkJCSdsZWZ0OicgKyAodGhpcy5jc3N4ID0gdGhpcy54ID0gdGhpcy5kZWZ4KSArICdweDsnKwoJCQkndG9wOicgKyAodGhpcy5jc3N5ID0gdGhpcy55ID0gdGhpcy5kZWZ5KSArICdweDsnKwoJCQknd2lkdGg6JyArIHRoaXMudyArICdweDsnKwoJCQknaGVpZ2h0OicgKyB0aGlzLmggKyAncHg7Ij4nKwoJCQl0aGlzLmh0bSArICc8L2Rpdj4nOwoJfQoJZWxzZQoJewoJCWlmKCEhKHRoaXMuZGl2ID0gZGQuZ2V0RGl2KHRoaXMuaWQpKSAmJiB0eXBlb2YgdGhpcy5kaXYuc3R5bGUgIT0gZGRfdSkgdGhpcy5jc3MgPSB0aGlzLmRpdi5zdHlsZTsKCQlkZC5nZXRXSCh0aGlzKTsKCQlpZih0aGlzLmRpdikKCQl7CgkJCXRoaXMuZGl2LmRkT2JqID0gdGhpczsKCQkJdGhpcy5kaXYucG9zX3JlbCA9IGRkLmdldENzc1Byb3AodGhpcy5kaXYsICdwb3NpdGlvbicsJ3Bvc2l0aW9uJywncG9zaXRpb24nKSA9PSAicmVsYXRpdmUiOwoJCX0KCQlkZC5nZXRQYWdlWFkodGhpcy5kaXYpOwoJCXRoaXMuZGVmeCA9IHRoaXMueCA9IGRkLng7CgkJdGhpcy5kZWZ5ID0gdGhpcy55ID0gZGQueTsKCQlkZC5nZXRDc3NYWSh0aGlzKTsKCQl0aGlzLmRlZnogPSBkZC5JbnQoZGQuZ2V0Q3NzUHJvcCh0aGlzLmRpdiwgJ3otaW5kZXgnLCd6SW5kZXgnLCd6SW5kZXgnKSk7Cgl9Cgl0aGlzLmRlZncgPSB0aGlzLncgfHwgMDsKCXRoaXMuZGVmaCA9IHRoaXMuaCB8fCAwOwp9CkRET2JqLnByb3RvdHlwZS5zZXRQaWNrRnVuYyA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5waWNrRnVuYyA9IGRfeDsKfTsKRERPYmoucHJvdG90eXBlLnNldERyYWdGdW5jID0gZnVuY3Rpb24oZF94KQp7Cgl0aGlzLmRyYWdGdW5jID0gZF94Owp9OwpERE9iai5wcm90b3R5cGUuc2V0UmVzaXplRnVuYyA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5yZXNpemVGdW5jID0gZF94Owp9OwpERE9iai5wcm90b3R5cGUuc2V0RHJvcEZ1bmMgPSBmdW5jdGlvbihkX3gpCnsKCXRoaXMuZHJvcEZ1bmMgPSBkX3g7Cn07CkRET2JqLnByb3RvdHlwZS5tb3ZlQnkgPSBmdW5jdGlvbihkX3gsIGRfeSwgZF9rZHMsIGRfbykKewoJaWYoIXRoaXMuZGl2KSByZXR1cm47Cgl0aGlzLnggKz0gKGRfeCA9IGRkLkludChkX3gpKTsKCXRoaXMueSArPSAoZF95ID0gZGQuSW50KGRfeSkpOwoJaWYoIWRfa2RzIHx8IHRoaXMuaXNfaW1hZ2UgfHwgdGhpcy5wYXJlbnQgIT0gdGhpcy5kZWZwYXJlbnQpCgl7CgkJKGRfbyA9IHRoaXMuY3NzIHx8IHRoaXMuZGl2KS5sZWZ0ID0gKHRoaXMuY3NzeCArPSBkX3gpICsgZGQucHg7CgkJZF9vLnRvcCA9ICh0aGlzLmNzc3kgKz0gZF95KSArIGRkLnB4OwoJfQoJZm9yKHZhciBkX2kgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgZF9pOykKCXsKCQlpZighKGRfbyA9IHRoaXMuY2hpbGRyZW5bLS1kX2ldKS5kZXRhY2hlZCkgZF9vLm1vdmVCeShkX3gsIGRfeSwgMSk7CgkJZF9vLmRlZnggKz0gZF94OwoJCWRfby5kZWZ5ICs9IGRfeTsKCX0KfTsKCkRET2JqLnByb3RvdHlwZS5tb3ZlVG8gPSBmdW5jdGlvbihkX3gsIGRfeSkKewoJdGhpcy5tb3ZlQnkoZGQuSW50KGRfeCktdGhpcy54LCBkZC5JbnQoZF95KS10aGlzLnkpOwp9OwpERE9iai5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uKGRfbSwgZF9vLCBkX3ApCnsKCWlmKHRoaXMuZGl2ICYmIHRoaXMudmlzaWJsZSkKCXsKCQlkX3AgPSB0aGlzLmNzcyB8fCB0aGlzLmRpdjsKCQlpZihkX20gJiYgIWRkLm40KQoJCXsKCQkJdGhpcy5kaXNwbGF5ID0gZGQuZ2V0Q3NzUHJvcCh0aGlzLmRpdiwgImRpc3BsYXkiLCAiZGlzcGxheSIsICJkaXNwbGF5Iik7CgkJCWlmKHRoaXMub2ltZykKCQkJewoJCQkJdGhpcy5vaW1nLmRpc3BsYXkgPSBkZC5nZXRDc3NQcm9wKHRoaXMub2ltZywgImRpc3BsYXkiLCAiZGlzcGxheSIsICJkaXNwbGF5Iik7CgkJCQl0aGlzLm9pbWcuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCQkJfQoJCQlkX3AuZGlzcGxheSA9ICJub25lIjsKCQkJZGQucmVjYWxjKCk7CgkJfQoJCWVsc2UgZF9wLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKCX0KCXRoaXMudmlzaWJsZSA9IGZhbHNlOwoJZm9yKHZhciBkX2kgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgZF9pOykKCQlpZighKGRfbyA9IHRoaXMuY2hpbGRyZW5bLS1kX2ldKS5kZXRhY2hlZCkgZF9vLmhpZGUoZF9tKTsKfTsKRERPYmoucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbihkX28sIGRfcCkKewoJaWYodGhpcy5kaXYpCgl7CgkJZF9wID0gdGhpcy5jc3MgfHwgdGhpcy5kaXY7CgkJaWYoZF9wLmRpc3BsYXkgJiYgZF9wLmRpc3BsYXkgPT0gIm5vbmUiKQoJCXsKCQkJZF9wLmRpc3BsYXkgPSB0aGlzLmRpc3BsYXkgfHwgImJsb2NrIjsKCQkJaWYodGhpcy5vaW1nKSB0aGlzLm9pbWcuc3R5bGUuZGlzcGxheSA9IHRoaXMub2ltZy5kaXNwbGF5IHx8ICJpbmxpbmUiOwoJCQlkZC5yZWNhbGMoKTsKCQl9CgkJZWxzZSBkX3AudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKCX0KCXRoaXMudmlzaWJsZSA9IHRydWU7Cglmb3IodmFyIGRfaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBkX2k7KQoJCWlmKCEoZF9vID0gdGhpcy5jaGlsZHJlblstLWRfaV0pLmRldGFjaGVkKSBkX28uc2hvdygpOwp9OwpERE9iai5wcm90b3R5cGUucmVzaXplVG8gPSBmdW5jdGlvbihkX3csIGRfaCwgZF9vKQp7CglpZighdGhpcy5kaXYpIHJldHVybjsKCWRfdyA9ICh0aGlzLncgPSBkZC5JbnQoZF93KSktdGhpcy5kdzsKCWRfaCA9ICh0aGlzLmggPSBkZC5JbnQoZF9oKSktdGhpcy5kaDsKCWlmKGRkLm40KQoJewoJCXRoaXMuZGl2LnJlc2l6ZVRvKGRfdywgZF9oKTsKCQlpZih0aGlzLmlzX2ltYWdlKQoJCXsKCQkJdGhpcy53cml0ZSgnPGltZyBzcmM9IicgKyB0aGlzLnNyYyArICciIHdpZHRoPSInICsgZF93ICsgJyIgaGVpZ2h0PSInICsgZF9oICsgJyI+Jyk7CgkJCSh0aGlzLm5pbWcgPSB0aGlzLmRpdi5kb2N1bWVudC5pbWFnZXNbMF0pLnNyYyA9IHRoaXMuc3JjOwoJCX0KCX0KCWVsc2UgaWYodHlwZW9mIHRoaXMuY3NzLnBpeGVsV2lkdGggIT0gZGRfdSkKCXsKCQl0aGlzLmNzcy5waXhlbFdpZHRoID0gZF93OwoJCXRoaXMuY3NzLnBpeGVsSGVpZ2h0ID0gZF9oOwoJCWlmKHRoaXMuaXNfaW1hZ2UpCgkJewoJCQkoZF9vID0gdGhpcy5uaW1nLnN0eWxlKS5waXhlbFdpZHRoID0gZF93OwoJCQlkX28ucGl4ZWxIZWlnaHQgPSBkX2g7CgkJfQoJfQoJZWxzZQoJewoJCXRoaXMuY3NzLndpZHRoID0gZF93ICsgZGQucHg7CgkJdGhpcy5jc3MuaGVpZ2h0ID0gZF9oICsgZGQucHg7CgkJaWYodGhpcy5pc19pbWFnZSkKCQl7CgkJCShkX28gPSB0aGlzLm5pbWcpLndpZHRoID0gZF93OwoJCQlkX28uaGVpZ2h0ID0gZF9oOwoJCQlpZighZF9vLmNvbXBsZXRlKSBkX28uc3JjID0gdGhpcy5zcmM7CgkJfQoJfQp9OwpERE9iai5wcm90b3R5cGUucmVzaXplQnkgPSBmdW5jdGlvbihkX2R3LCBkX2RoKQp7Cgl0aGlzLnJlc2l6ZVRvKHRoaXMudytkZC5JbnQoZF9kdyksIHRoaXMuaCtkZC5JbnQoZF9kaCkpOwp9OwpERE9iai5wcm90b3R5cGUuc3dhcEltYWdlID0gZnVuY3Rpb24oZF94LCBkX2NwKQp7CglpZighdGhpcy5uaW1nKSByZXR1cm47Cgl0aGlzLm5pbWcuc3JjID0gZF94OwoJdGhpcy5zcmMgPSB0aGlzLm5pbWcuc3JjOwoJaWYoZF9jcCkKCXsKCQlmb3IodmFyIGRfaSA9IHRoaXMuY29waWVzLmxlbmd0aDsgZF9pOykKCQl7LS1kX2k7CgkJCXRoaXMuY29waWVzW2RfaV0uc3JjID0gdGhpcy5jb3BpZXNbZF9pXS5uaW1nLnNyYyA9IHRoaXMubmltZy5zcmM7CgkJfQoJfQp9OwpERE9iai5wcm90b3R5cGUuc2V0QmdDb2xvciA9IGZ1bmN0aW9uKGRfeCkKewoJaWYoZGQubjQgJiYgdGhpcy5kaXYpIHRoaXMuZGl2LmJnQ29sb3IgPSBkX3g7CgllbHNlIGlmKHRoaXMuY3NzKSB0aGlzLmNzcy5iYWNrZ3JvdW5kID0gZF94OwoJdGhpcy5iZ0NvbG9yID0gZF94Owp9OwpERE9iai5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihkX3gsIGRfbykKewoJdGhpcy50ZXh0ID0gZF94OwoJaWYoIXRoaXMuZGl2KSByZXR1cm47CglpZihkZC5uNCkKCXsKCQkoZF9vID0gdGhpcy5kaXYuZG9jdW1lbnQpLm9wZW4oKTsKCQlkX28ud3JpdGUoZF94KTsKCQlkX28uY2xvc2UoKTsKCQlkZC5nZXRXSCh0aGlzKTsKCX0KCWVsc2UKCXsKCQl0aGlzLmNzcy5oZWlnaHQgPSAnYXV0byc7CgkJdGhpcy5kaXYuaW5uZXJIVE1MID0gZF94OwoJCWlmKCFkZC5pZTQpIGRkLnJlY2FsYygpOwoJCWlmKGRkLmllNCB8fCBkZC5uNikgc2V0VGltZW91dCgnZGQucmVjYWxjKCk7JywgMCk7IC8vIG42LjA6IHJlY2FsYyB0d2ljZQoJfQp9OwpERE9iai5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKGRfbiwgZF9wLCBkX2IpCnsKCWlmKCF0aGlzLm9pbWcpIHJldHVybjsKCWRfYiA9IChkZC5pZSAmJiBkb2N1bWVudC5hbGwudGFncygnYm9keScpKT8gZG9jdW1lbnQuYWxsLnRhZ3MoJ2JvZHknKVswXSA6IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lPyAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXSB8fCBkZC5kYikgOiBkZC5kYjsKCWZvcihkX24gPSBkX24gfHwgMTsgZF9uID4gMDsgLS1kX24pCgl7CgkJdmFyIGRfbCA9IHRoaXMuY29waWVzLmxlbmd0aCwKCQlkX28gPSBuZXcgRERPYmoodGhpcy5uYW1lK3RoaXMuY21kLCBkX2wrMSk7CgkJaWYoZGQubjQpCgkJewoJCQlkX28uaWQgPSAoZF9wID0gbmV3IExheWVyKGRfby53KSkubmFtZTsKCQkJZF9wLmNsaXAuaGVpZ2h0ID0gZF9vLmg7CgkJCWRfcC52aXNpYmlsaXR5ID0gJ3Nob3cnOwoJCQkoZF9wID0gZF9wLmRvY3VtZW50KS5vcGVuKCk7CgkJCWRfcC53cml0ZShkX28uaHRtKTsKCQkJZF9wLmNsb3NlKCk7CgkJfQoJCWVsc2UgaWYoZF9iICYmIGRfYi5pbnNlcnRBZGphY2VudEhUTUwpIGRfYi5pbnNlcnRBZGphY2VudEhUTUwoIkFmdGVyQmVnaW4iLCBkX28udF9odG0pOwoJCWVsc2UgaWYoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiBkX2IgJiYgZF9iLmFwcGVuZENoaWxkKQoJCXsKCQkJZF9iLmFwcGVuZENoaWxkKGRfcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRJaTE1diIpKTsKCQkJZF9wLmlubmVySFRNTCA9IGRfby5odG07CgkJCWRfcC5pZCA9IGRfby5pZDsKCQkJZF9wLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKCQkJZF9wLnN0eWxlLndpZHRoID0gZF9vLncgKyAncHgnOwoJCQlkX3Auc3R5bGUuaGVpZ2h0ID0gZF9vLmggKyAncHgnOwoJCX0KCQllbHNlIGlmKGRfYiAmJiBkX2IuaW5uZXJIVE1MKSBkX2IuaW5uZXJIVE1MICs9IGRfby50X2h0bTsKCQlkX28uZGVmeiA9IHRoaXMuZGVmeisxK2RfbDsKCQlkZC5hZGRQcm9wcyhkX28pOwoJCWRfby5vcmlnaW5hbCA9IHRoaXM7CgkJZGQuYWRkRWx0KGRfbywgdGhpcyk7CgkJaWYodGhpcy5wYXJlbnQpCgkJewoJCQl0aGlzLnBhcmVudC5hZGRDaGlsZChkX28sIHRoaXMuZGV0YWNoZWQpOwoJCQlkX28uZGVmcGFyZW50ID0gdGhpcy5kZWZwYXJlbnQ7CgkJfQoJCWRfby5tb3ZlVG8oZF9vLmRlZnggPSB0aGlzLmRlZngsIGRfby5kZWZ5ID0gdGhpcy5kZWZ5KTsKCQlpZihkZC5uNCkgZF9vLmRlZnNyYyA9IGRfby5zcmMgPSB0aGlzLmRlZnNyYzsKCQlkX28uc3dhcEltYWdlKHRoaXMuc3JjKTsKCX0KfTsKRERPYmoucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24oZF9rZCwgZGV0YWNoLCBkZWZwKQp7CglpZih0eXBlb2YgZF9rZCAhPSAib2JqZWN0IikgZF9rZCA9IGRkLmVsZW1lbnRzW2Rfa2RdOwoJaWYoZF9rZC5wYXJlbnQgJiYgZF9rZC5wYXJlbnQgPT0gdGhpcyB8fCBkX2tkID09IHRoaXMgfHwgIWRfa2QuaXNfaW1hZ2UgJiYgZF9rZC5kZWZwYXJlbnQgJiYgIWRlZnApIHJldHVybjsKCgl0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoXSA9IHRoaXMuY2hpbGRyZW5bZF9rZC5uYW1lXSA9IGRfa2Q7CglkX2tkLmRldGFjaGVkID0gZGV0YWNoIHx8IDA7CglpZihkZWZwKSBkX2tkLmRlZnBhcmVudCA9IHRoaXM7CgllbHNlIGlmKHRoaXMgPT0gZF9rZC5kZWZwYXJlbnQgJiYgZF9rZC5pc19pbWFnZSkgZGQuZ2V0SW1nKHRoaXMsIGRfa2Qub2ltZy5uYW1lLCAxKTsKCWlmKCFkX2tkLmRlZnBhcmVudCB8fCB0aGlzICE9IGRfa2QuZGVmcGFyZW50KQoJewoJCWRfa2QuZGVmeCA9IGRfa2QueDsKCQlkX2tkLmRlZnkgPSBkX2tkLnk7Cgl9CglpZighZGV0YWNoKQoJewoJCWRfa2QuZGVmeiA9IGRfa2QuZGVmeit0aGlzLmRlZnotKGRfa2QucGFyZW50PyBkX2tkLnBhcmVudC5kZWZ6IDogMCkrKCFkX2tkLmlzX2ltYWdlKjEpOwoJCWRfa2Quc2V0WihkX2tkLnordGhpcy56LShkX2tkLnBhcmVudD8gZF9rZC5wYXJlbnQueiA6IDApKyghZF9rZC5pc19pbWFnZSoxKSwgMSk7Cgl9CglpZihkX2tkLnBhcmVudCkgZF9rZC5wYXJlbnQucmVtb3ZlQ2hpbGQoZF9rZCwgMSk7CglkX2tkLnBhcmVudCA9IHRoaXM7Cn07CkRET2JqLnByb3RvdHlwZS5yZW1vdmVDaGlsZCA9IGZ1bmN0aW9uKGRfa2QsIGRfbmV3cCkKewoJaWYodHlwZW9mIGRfa2QgIT0gIm9iamVjdCIpIGRfa2QgPSB0aGlzLmNoaWxkcmVuW2Rfa2RdOwoJdmFyIGRfb2MgPSB0aGlzLmNoaWxkcmVuLCBkX25jID0gbmV3IEFycmF5KCk7Cglmb3IodmFyIGRfaSA9IDA7IGRfaSA8IGRfb2MubGVuZ3RoOyBkX2krKykKCQlpZihkX29jW2RfaV0gIT0gZF9rZCkgZF9uY1tkX25jLmxlbmd0aF0gPSBkX29jW2RfaV07Cgl0aGlzLmNoaWxkcmVuID0gZF9uYzsKCWRfa2QucGFyZW50ID0gbnVsbDsKCWlmKCFkX25ld3ApCgl7CgkJZF9rZC5kZXRhY2hlZCA9IGRfa2QuZGVmcCA9IDA7CgkJaWYoZF9rZC5pc19pbWFnZSkgZGQuZ2V0SW1nKGRfa2QsIGRfa2Qub2ltZy5uYW1lLCAxKTsKCX0KfTsKRERPYmoucHJvdG90eXBlLmF0dGFjaENoaWxkID0gZnVuY3Rpb24oZF9rZCkKewoJKGRfa2QgPSAodHlwZW9mIGRfa2QgIT0gIm9iamVjdCIpPyB0aGlzLmNoaWxkcmVuW2Rfa2RdOiBkX2tkKS5kZXRhY2hlZCA9IDA7CglkX2tkLnNldFooZF9rZC5kZWZ6ICsgdGhpcy56LXRoaXMuZGVmeiwgMSk7Cn07CkRET2JqLnByb3RvdHlwZS5kZXRhY2hDaGlsZCA9IGZ1bmN0aW9uKGRfa2QpCnsKCShkX2tkID0gKHR5cGVvZiBkX2tkICE9ICJvYmplY3QiKT8gdGhpcy5jaGlsZHJlbltkX2tkXTogZF9rZCkuZGV0YWNoZWQgPSAxOwp9OwpERE9iai5wcm90b3R5cGUuc2V0WiA9IGZ1bmN0aW9uKGRfeCwgZF9rZHMsIGRfbykKewoJaWYoZF9rZHMpCgl7CgkJZm9yKHZhciBkX2R6ID0gZF94LXRoaXMueiwgZF9pID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGRfaTspCgkJCWlmKCEoZF9vID0gdGhpcy5jaGlsZHJlblstLWRfaV0pLmRldGFjaGVkKSBkX28uc2V0WihkX28ueitkX2R6LCAxKTsKCX0KCWRkLnogPSBNYXRoLm1heChkZC56LCB0aGlzLnogPSB0aGlzLmRpdj8gKCh0aGlzLmNzcyB8fCB0aGlzLmRpdikuekluZGV4ID0gZF94KSA6IDApOwp9OwpERE9iai5wcm90b3R5cGUubWF4aW1pemVaID0gZnVuY3Rpb24oKQp7Cgl0aGlzLnNldFooZGQueisxLCAxKTsKfTsKRERPYmoucHJvdG90eXBlLl9yZXNldFogPSBmdW5jdGlvbihkX28pCnsKCWlmKHRoaXMucmVfeiB8fCBkZC5yZV96KQoJewoJCXRoaXMuc2V0Wih0aGlzLmRlZnopOwoJCWZvcih2YXIgZF9pID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGRfaTspCgkJCWlmKCEoZF9vID0gdGhpcy5jaGlsZHJlblstLWRfaV0pLmRldGFjaGVkKSBkX28uc2V0WihkX28uZGVmeik7Cgl9Cn07CkRET2JqLnByb3RvdHlwZS5zZXRPcGFjaXR5ID0gZnVuY3Rpb24oZF94KQp7Cgl0aGlzLm9wYWNpdHkgPSBkX3g7Cgl0aGlzLl9zZXRPcGFSZWwoMS4wLCAxKTsKfTsKRERPYmoucHJvdG90eXBlLl9zZXRPcGFSZWwgPSBmdW5jdGlvbihkX3gsIGRfa2QsIGRfeSwgZF9vKQp7CglpZih0aGlzLmNzcyAmJiAodGhpcy5kaWFwaGFuIHx8IGRfa2QpKQoJewoJCWRfeSA9IHRoaXMub3BhY2l0eSpkX3g7CgkJaWYodHlwZW9mIHRoaXMuY3NzLk1vek9wYWNpdHkgIT0gZGRfdSkgdGhpcy5jc3MuTW96T3BhY2l0eSA9IGRfeTsKCQllbHNlIGlmICh0eXBlb2YgdGhpcy5jc3Mub3BhY2l0eSAhPSBkZF91KSB0aGlzLmNzcy5vcGFjaXR5ID0gZF95OwoJCWVsc2UgaWYodHlwZW9mIHRoaXMuY3NzLmZpbHRlciAhPSBkZF91KQoJCQl0aGlzLmNzcy5maWx0ZXIgPSAiQWxwaGEob3BhY2l0eT0iK3BhcnNlSW50KDEwMCpkX3kpKyIpIjsKCQlmb3IodmFyIGRfaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBkX2k7KQoJCQlpZighKGRfbyA9IHRoaXMuY2hpbGRyZW5bLS1kX2ldKS5kZXRhY2hlZCkgZF9vLl9zZXRPcGFSZWwoZF94LCAxKTsKCX0KfTsKRERPYmoucHJvdG90eXBlLnNldEN1cnNvciA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5fc2V0Q3JzKHRoaXMuY3Vyc29yID0gKGRfeC5pbmRleE9mKCdjOicpKzEpPyBkX3guc3Vic3RyaW5nKDIpIDogZF94KTsKfTsKRERPYmoucHJvdG90eXBlLl9zZXRDcnMgPSBmdW5jdGlvbihkX3gpCnsKCWlmKHRoaXMuY3NzKSB0aGlzLmNzcy5jdXJzb3IgPSAoKCFkZC5pZSB8fCBkZC5pZW1hYykgJiYgZF94ID09ICdoYW5kJyk/ICdwb2ludGVyJyA6IGRfeDsKfTsKRERPYmoucHJvdG90eXBlLnNldERyYWdnYWJsZSA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5ub2RyYWcgPSAhZF94KjE7Cgl0aGlzLl9zZXRDcnMoZF94PyB0aGlzLmN1cnNvciA6ICdhdXRvJyk7Cn07CkRET2JqLnByb3RvdHlwZS5zZXRSZXNpemFibGUgPSBmdW5jdGlvbihkX3gpCnsKCXRoaXMucmVzaXphYmxlID0gZF94KjE7CglpZihkX3gpIHRoaXMuc2NhbGFibGUgPSAwOwp9OwpERE9iai5wcm90b3R5cGUuc2V0U2NhbGFibGUgPSBmdW5jdGlvbihkX3gpCnsKCXRoaXMuc2NhbGFibGUgPSBkX3gqMTsKCWlmKGRfeCkgdGhpcy5yZXNpemFibGUgPSAwOwp9OwpERE9iai5wcm90b3R5cGUuc2V0SG9yaXpvbnRhbCA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5ob3Jpem9udGFsID0gZF94KjE7Cn07CkRET2JqLnByb3RvdHlwZS5zZXRWZXJ0aWNhbCA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy52ZXJ0aWNhbCA9IGRfeCoxOwp9OwpERE9iai5wcm90b3R5cGUuZ2V0RWx0QmVsb3cgPSBmdW5jdGlvbihkX3JldCwgZF94LCBkX3kpCnsKCXZhciBkX28sIGRfY21wID0gLTEsIGRfaSA9IGRkLmVsZW1lbnRzLmxlbmd0aDsgd2hpbGUoZF9pLS0pCgl7CgkJZF9vID0gZGQuZWxlbWVudHNbZF9pXTsKCQlkX3ggPSBkX28ueC10aGlzLncvMjsKCQlkX3kgPSBkX28ueS10aGlzLmgvMjsKCQlpZihkX28udmlzaWJsZSAmJiBkX28ueiA8IHRoaXMueiAmJiB0aGlzLnggPj0gZF94ICYmIHRoaXMueCA8PSBkX3grZF9vLncgJiYgdGhpcy55ID49IGRfeSAmJiB0aGlzLnkgPD0gZF95K2Rfby5oKQoJCXsKCQkJaWYoZF9vLnogPiBkX2NtcCkKCQkJewoJCQkJZF9jbXAgPSBkX28uejsKCQkJCWRfcmV0ID0gZF9vOwoJCQl9CgkJfQoJfQoJcmV0dXJuIGRfcmV0Owp9OwpERE9iai5wcm90b3R5cGUuZGVsID0gZnVuY3Rpb24oZF9vcywgZF9vKQp7Cgl2YXIgZF9pLCBkX2w7CglpZih0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5yZW1vdmVDaGlsZCkgdGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CglpZih0aGlzLm9yaWdpbmFsKQoJewoJCXRoaXMuaGlkZSgpOwoJCWlmKHRoaXMub3JpZ2luYWwuY29waWVzKQoJCXsKCQkJZF9vcyA9IG5ldyBBcnJheSgpOwoJCQlmb3IoZF9sID0gdGhpcy5vcmlnaW5hbC5jb3BpZXMubGVuZ3RoLCBkX2kgPSAwOyBkX2kgPCBkX2w7IGRfaSsrKQoJCQkJaWYoKGRfbyA9IHRoaXMub3JpZ2luYWwuY29waWVzW2RfaV0pICE9IHRoaXMpIGRfb3NbZF9vLm5hbWVdID0gZF9vc1tkX29zLmxlbmd0aF0gPSBkX287CgkJCXRoaXMub3JpZ2luYWwuY29waWVzID0gZF9vczsKCQl9Cgl9CgllbHNlIGlmKHRoaXMuaXNfaW1hZ2UpCgl7CgkJdGhpcy5oaWRlKCk7CgkJaWYodGhpcy5vaW1nKQoJCXsKCQkgIGlmKGRkLm40KSB0aGlzLm9pbWcuc3JjID0gdGhpcy5kZWZzcmM7CgkJICBlbHNlIHRoaXMub2ltZy5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnOwoJCX0KCX0KCWVsc2UgaWYodGhpcy5tb3ZlVG8pCgl7CgkJaWYodGhpcy5jc3MpIHRoaXMuY3NzLmN1cnNvciA9ICdkZWZhdWx0JzsKCQl0aGlzLm1vdmVUbyh0aGlzLmRlZngsIHRoaXMuZGVmeSk7CgkJdGhpcy5yZXNpemVUbyh0aGlzLmRlZncsIHRoaXMuZGVmaCk7Cgl9CglkX29zID0gbmV3IEFycmF5KCk7Cglmb3IoZF9sID0gZGQuZWxlbWVudHMubGVuZ3RoLCBkX2kgPSAwOyBkX2kgPCBkX2w7IGRfaSsrKQoJewoJCWlmKChkX28gPSBkZC5lbGVtZW50c1tkX2ldKSAhPSB0aGlzKSBkX29zW2Rfby5uYW1lXSA9IGRfb3NbZF9vLmluZGV4ID0gZF9vcy5sZW5ndGhdID0gZF9vOwoJCWVsc2UgZF9vLl9mcmVlKCk7Cgl9CglkZC5lbGVtZW50cyA9IGRfb3M7CglpZighZGQubjQpIGRkLnJlY2FsYygpOwp9OwpERE9iai5wcm90b3R5cGUuX2ZyZWUgPSBmdW5jdGlvbigpCnsKCWZvcih2YXIgZF9pIGluIHRoaXMpCgkJdGhpc1tkX2ldID0gbnVsbDsKCWRkLmVsZW1lbnRzW3RoaXMubmFtZV0gPSBudWxsOwp9OwpkZC5uNFJlY3RWaXMgPSBmdW5jdGlvbih2aXMpCnsKCWZvcih2YXIgZF9pID0gNDsgZF9pOykKCXstLWRfaTsKCQlkZC5yZWN0SVtkX2ldLnZpc2liaWxpdHkgPSBkZC5yZWN0QVtkX2ldLnZpc2liaWxpdHkgPSB2aXM/ICdzaG93JyA6ICdoaWRlJzsKCQlpZih2aXMpIGRkLnJlY3RJW2RfaV0uekluZGV4ID0gZGQucmVjdEFbZF9pXS56SW5kZXggPSBkZC56KzI7Cgl9Cn07CmRkLm40UmVjdFBvcyA9IGZ1bmN0aW9uKGRfbywgZF94LCBkX3ksIGRfdywgZF9oKQp7CglkX28ueCA9IGRfeDsKCWRfby55ID0gZF95OwoJZF9vLmNsaXAud2lkdGggPSBkX3c7CglkX28uY2xpcC5oZWlnaHQgPSBkX2g7Cn07Ci8vIE5ONDogRHJhdyBpbWcgc2l6aW5nIHJlY3QKZGQubjRSZWN0ID0gZnVuY3Rpb24oZF93LCBkX2gpCnsKCXZhciBkX2k7CglpZighZGQucmVjdEkpCgl7CgkJZGQucmVjdEkgPSBuZXcgQXJyYXkoKTsKCQlkZC5yZWN0QSA9IG5ldyBBcnJheSgpOwoJfQoJaWYoIWRkLnJlY3RJWzBdKQoJewoJCWZvcihkX2kgPSA0OyBkX2k7KQoJCXsKCQkJKGRkLnJlY3RJWy0tZF9pXSA9IG5ldyBMYXllcigxKSkuYmdDb2xvciA9ICcjMDAwMDAwJzsKCQkJKGRkLnJlY3RBW2RfaV0gPSBuZXcgTGF5ZXIoMSkpLmJnQ29sb3IgPSAnI2ZmZmZmZic7CgkJfQoJfQoJaWYoIWRkLnJlY3RJWzBdLnZpc2liaWxpdHkgfHwgZGQucmVjdElbMF0udmlzaWJpbGl0eSA9PSAnaGlkZScpIGRkLm40UmVjdFZpcygxKTsKCWRkLm9iai53ID0gZF93OwoJZGQub2JqLmggPSBkX2g7Cglmb3IoZF9pID0gNDsgZF9pOykKCXstLWRfaTsKCQlkZC5uNFJlY3RQb3MoZGQucmVjdElbZF9pXSwgZGQub2JqLnggKyAoIShkX2ktMSk/IChkZC5vYmoudy0xKSA6IDApLCBkZC5vYmoueSArICghKGRfaS0yKT8gKGRkLm9iai5oLTEpIDogMCksIGRfaSYxIHx8IGRkLm9iai53LCAhKGRfaSYxKSB8fCBkZC5vYmouaCk7CgkJZGQubjRSZWN0UG9zKGRkLnJlY3RBW2RfaV0sICEoZF9pLTEpPyBkZC5yZWN0SVsxXS54KzEgOiAoZGQub2JqLngtMSksICEoZF9pLTIpPyBkZC5yZWN0SVsyXS55KzEgOiAoZGQub2JqLnktMSksIGRfaSYxIHx8IGRkLm9iai53KzIsICEoZF9pJjEpIHx8IGRkLm9iai5oKzIpOwoJfQp9OwpkZC5yZXN6VG8gPSBmdW5jdGlvbihkX3csIGRfaCkKewoJaWYoZGQubjQgJiYgZGQub2JqLmlzX2ltYWdlKSBkZC5uNFJlY3QoZF93LCBkX2gpOwoJZWxzZSBkZC5vYmoucmVzaXplVG8oZF93LCBkX2gpOwp9OwpkZC5lbWJlZFZpcyA9IGZ1bmN0aW9uKGRfdmlzKQp7Cgl2YXIgZF9vID0gbmV3IEFycmF5KCdpZnJhbWUnLCAnYXBwbGV0JywgJ2VtYmVkJywgJ29iamVjdCcpOwoJZm9yKHZhciBkX2kgPSBkX28ubGVuZ3RoOyBkX2k7KQoJey0tZF9pOwoJCXZhciBkX3AgPSBkZC5pZT8gZG9jdW1lbnQuYWxsLnRhZ3MoZF9vW2RfaV0pIDogZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWU/IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGRfb1tkX2ldKSA6IG51bGw7CgkJaWYoZF9wKQoJCXsKCQkJZm9yKHZhciBkX2ogPSBkX3AubGVuZ3RoOyBkX2o7KQoJCQl7CgkJCQl2YXIgZF9xID0gZF9wWy0tZF9qXTsKCQkJCXdoaWxlKGRfcS5vZmZzZXRQYXJlbnQgfHwgZF9xLnBhcmVudE5vZGUpCgkJCQl7CgkJCQkJaWYoKGRfcSA9IGRfcS5wYXJlbnROb2RlIHx8IGRfcS5vZmZzZXRQYXJlbnQgfHwgbnVsbCkgPT0gZGQub2JqLmRpdikKCQkJCQl7CgkJCQkJCWRfcFtkX2pdLnN0eWxlLnZpc2liaWxpdHkgPSBkX3ZpczsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKZGQubWF4T2ZmWCA9IGZ1bmN0aW9uKGRfeCwgZF95KQp7CglyZXR1cm4oCgkJKGRkLm9iai5tYXhvZmZsKzEgJiYgKGRfeSA9IGRkLm9iai5kZWZ4LWRkLm9iai5tYXhvZmZsKS1kX3ggPiAwCgkJfHwgZGQub2JqLm1heG9mZnIrMSAmJiAoZF95ID0gZGQub2JqLmRlZngrZGQub2JqLm1heG9mZnIpLWRfeCA8IDApPyBkX3kKCQk6IGRfeAoJKTsKfTsKZGQubWF4T2ZmWSA9IGZ1bmN0aW9uKGRfeCwgZF95KQp7CglyZXR1cm4oCgkJKGRkLm9iai5tYXhvZmZ0KzEgJiYgKGRfeSA9IGRkLm9iai5kZWZ5LWRkLm9iai5tYXhvZmZ0KS1kX3ggPiAwCgkJfHwgZGQub2JqLm1heG9mZmIrMSAmJiAoZF95ID0gZGQub2JqLmRlZnkrZGQub2JqLm1heG9mZmIpLWRfeCA8IDApPyBkX3kKCQk6IGRfeAoJKTsKfTsKZGQuaW5XbmRXID0gZnVuY3Rpb24oZF94LCBkX3kpCnsKCXZhciBkX3d4ID0gZGQuZ2V0U2Nyb2xsWCgpLAoJZF93dyA9IGRkLmdldFduZFcoKTsKCXJldHVybigKCQkoKGRfeSA9IGRfd3grMiktZF94ID4gMCkgfHwgKChkX3kgPSBkX3d4K2Rfd3crZGQub2JqLnctMiktZF94IDwgMCk/IGRfeQoJCTogZF94CgkpOwp9OwpkZC5pblduZEggPSBmdW5jdGlvbihkX3gsIGRfeSkKewoJdmFyIGRfd3kgPSBkZC5nZXRTY3JvbGxZKCksCglkX3doID0gZGQuZ2V0V25kSCgpOwoJcmV0dXJuKAoJCSgoZF95ID0gZF93eSsyKS1kX3ggPiAwKSB8fCAoKGRfeSA9IGRfd3krZF93aCtkZC5vYmouaC0yKS1kX3ggPCAwKT8gZF95CgkJOiBkX3gKCSk7Cn07Ci8vIFRoZXNlIHR3byBmdW5jcyBsaW1pdCB0aGUgc2l6ZSBvZiBlbGVtZW50IHdoZW4gbW91c2VyZXNpemVkLgovLyBJbXBsZW1lbnRlZCAyMi41LjIwMDMgYnkgR3JlZ29yIEx0b2xmLCBtb2RpZmllZCBieSBXYWx0ZXIgWm9ybgpkZC5saW1XID0gZnVuY3Rpb24oZF93KQp7CglyZXR1cm4oCgkJKGRkLm9iai5taW53LWRfdyA+IDApPyBkZC5vYmoubWludwoJCTogKGRkLm9iai5tYXh3ID4gMCAmJiBkZC5vYmoubWF4dy1kX3cgPCAwKT8gZGQub2JqLm1heHcKCQk6IGRfdwoJKTsKfTsKZGQubGltSCA9IGZ1bmN0aW9uKGRfaCkKewoJcmV0dXJuKAoJCShkZC5vYmoubWluaC1kX2ggPiAwKT8gZGQub2JqLm1pbmgKCQk6IChkZC5vYmoubWF4aCA+IDAgJiYgZGQub2JqLm1heGgtZF9oIDwgMCk/IGRkLm9iai5tYXhoCgkJOiBkX2gKCSk7Cn07Ci8vIE9wdGlvbmFsIGF1dG9zY3JvbGwtcGFnZSBmdW5jdGlvbmFsaXR5LiBDb3VydGVzeSBDZWRyaWMgU2F2YXJlc2UuCi8vIE1vZGlmaWVkIGJ5IFdhbHRlciBab3JuLgpmdW5jdGlvbiBERFNjcm9sbCgpCnsKCWlmKCFkZC5vYmogfHwgIWRkLm9iai5zY3JvbGwgJiYgIWRkLnNjcm9sbCB8fCBkZC5pZTQgfHwgZGQud2hyYXRpbykKCXsKCQlkZC5zY3J4ID0gZGQuc2NyeSA9IDA7CgkJcmV0dXJuOwoJfQoJdmFyIGRfYm5kID0gMHgxYywKCWRfd3ggPSBkZC5nZXRTY3JvbGxYKCksIGRfd3kgPSBkZC5nZXRTY3JvbGxZKCk7CglpZihkZC5tc21vdmVkKQoJewoJCXZhciBkX3d3ID0gZGQuZ2V0V25kVygpLCBkX3doID0gZGQuZ2V0V25kSCgpLCBkX3k7CgkJZGQuc2NyeCA9ICgoZF95ID0gZGQuZS54LWRfd3ctZF93eCtkX2JuZCkgPiAwKT8gKGRfeT4+PTIpKmRfeQoJCQk6ICgoZF95ID0gZF93eCtkX2JuZC1kZC5lLngpID4gMCk/IC0oZF95Pj49MikqZF95CgkJCTogMDsKCQlkZC5zY3J5ID0gKChkX3kgPSBkZC5lLnktZF93aC1kX3d5K2RfYm5kKSA+IDApPyAoZF95Pj49MikqZF95CgkJCTogKChkX3kgPSBkX3d5K2RfYm5kLWRkLmUueSkgPiAwKT8gLShkX3k+Pj0yKSpkX3kKCQkJOiAwOwoJfQoJaWYoZGQuc2NyeCB8fCBkZC5zY3J5KQoJewoJCXdpbmRvdy5zY3JvbGxUbygKCQkJZF93eCArIChkZC5zY3J4ID0gZGQub2JqLmlzX3Jlc2l6ZWQ/IGRkLmxpbVcoZGQub2JqLncrZGQuc2NyeCktZGQub2JqLncgOiBkZC5vYmoudmVydGljYWw/IDAgOiAoZGQubWF4T2ZmWChkZC5vYmoueCtkZC5zY3J4KS1kZC5vYmoueCkpLAoJCQlkX3d5ICsgKGRkLnNjcnkgPSBkZC5vYmouaXNfcmVzaXplZD8gZGQubGltSChkZC5vYmouaCtkZC5zY3J5KS1kZC5vYmouaCA6IGRkLm9iai5ob3Jpem9udGFsPyAwIDogKGRkLm1heE9mZlkoZGQub2JqLnkrZGQuc2NyeSktZGQub2JqLnkpKQoJCSk7CgkJZGQub2JqLmlzX2RyYWdnZWQ/IGRkLm9iai5tb3ZlVG8oZGQub2JqLngrZGQuZ2V0U2Nyb2xsWCgpLWRfd3gsIGRkLm9iai55K2RkLmdldFNjcm9sbFkoKS1kX3d5KQoJCQk6IGRkLnJlc3pUbyhkZC5vYmoudytkZC5nZXRTY3JvbGxYKCktZF93eCwgZGQub2JqLmgrZGQuZ2V0U2Nyb2xsWSgpLWRfd3kpOwoJfQoJZGQubXNtb3ZlZCA9IDA7Cgl3aW5kb3cuc2V0VGltZW91dCgnRERTY3JvbGwoKScsIDB4MzMpOwp9CmZ1bmN0aW9uIFBJQ0soZF9ldikKewoJZGQuZSA9IG5ldyBkZC5ldnQoZF9ldik7CglpZihkZC5lLnggPj0gZGQuZ2V0V25kVygpK2RkLmdldFNjcm9sbFgoKSB8fCBkZC5lLnkgPj0gZGQuZ2V0V25kSCgpK2RkLmdldFNjcm9sbFkoKSkgcmV0dXJuIHRydWU7IC8vIG9uIHNjcm9sbGJhcgoJZm9yKHZhciBkX28sIGRfdCwgZF9jbXAgPSAtMSwgZF9pID0gZGQuZWxlbWVudHMubGVuZ3RoOyBkX2k7KQoJewoJCWRfbyA9IGRkLmVsZW1lbnRzWy0tZF9pXTsKCQlpZihkZC5uNCAmJiBkZC5lLmJ1dCA+IDEgJiYgZGQuZS5zcmMgPT0gZF9vLm9pbWcgJiYgIWRfby5jbG9uZSkgcmV0dXJuIGZhbHNlOwoJCWlmKGRfby52aXNpYmxlICYmIGRkLmUuYnV0IDw9IDEgJiYgZGQuZS54ID49IGRfby54ICYmIGRkLmUueCA8PSBkX28ueCtkX28udyAmJiBkZC5lLnkgPj0gZF9vLnkgJiYgZGQuZS55IDw9IGRfby55K2Rfby5oKQoJCXsKCQkJaWYoZF9vLnogPiBkX2NtcCAmJiAoZF90ID0gZGQuZS5zcmMudGFnKS5pbmRleE9mKCdpbnB1JykgPCAwICYmIGRfdC5pbmRleE9mKCd0ZXh0YScpIDwgMCAmJiBkX3QuaW5kZXhPZignc2VsZScpIDwgMCAmJiBkX3QuaW5kZXhPZignb3B0aScpIDwgMCAmJiBkX3QuaW5kZXhPZignc2Nyb2wnKSA8IDApCgkJCXsKCQkJCWRfY21wID0gZF9vLno7CgkJCQlkZC5vYmogPSBkX287CgkJCX0KCQl9Cgl9CglpZihkZC5vYmopCgl7CgkJaWYoZGQub2JqLm5vZHJhZykgZGQub2JqID0gbnVsbDsKCQllbHNlCgkJewoJCQlkZC5lLmUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKCQkJdmFyIGRfcnN6ID0gZGQuZS5tb2RpZktleSAmJiAoZGQub2JqLnJlc2l6YWJsZSB8fCBkZC5vYmouc2NhbGFibGUpOwoJCQlpZihkZC5vcCkKCQkJewoJCQkJKGRfbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdPcEJsVXInKSkuc3R5bGUucGl4ZWxMZWZ0ID0gZGQuZS54OwoJCQkJZF9vLnN0eWxlLnBpeGVsVG9wID0gZGQuZS55OwoJCQkJKGRfbyA9IGRfby5jaGlsZHJlblswXS5jaGlsZHJlblswXSkuZm9jdXMoKTsKCQkJCWRfby5ibHVyKCk7CgkJCX0KCQkJZWxzZSBpZihkZC5pZSAmJiAhZGQuaWU0KQoJCQl7CgkJCQlpZihkb2N1bWVudC5zZWxlY3Rpb24gJiYgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KSBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKCQkJCWRkLmRiLm9uc2VsZWN0c3RhcnQgPSBmdW5jdGlvbigpCgkJCQl7CgkJCQkJZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKCQkJCX07CgkJCX0KCQkJaWYoZF9yc3opCgkJCXsKCQkJCWRkLm9iai5fc2V0Q3JzKCdzZS1yZXNpemUnKTsKCQkJCWRkLm9iai5pc19yZXNpemVkID0gMTsKCQkJCWRkLndocmF0aW8gPSBkZC5vYmouc2NhbGFibGU/IGRkLm9iai5kZWZ3L2RkLm9iai5kZWZoIDogMDsKCQkJCWlmKGRkLmllKQoJCQkJewoJCQkJCWlmKGRkLmllNCkKCQkJCQl7CgkJCQkJCXdpbmRvdy5kZF94ID0gZGQuZ2V0U2Nyb2xsWCgpOwoJCQkJCQl3aW5kb3cuZGRfeSA9IGRkLmdldFNjcm9sbFkoKTsKCQkJCQl9CgkJCQkJc2V0VGltZW91dCgKCQkJCQkJJ2lmKGRkLm9iaiAmJiBkb2N1bWVudC5zZWxlY3Rpb24gJiYgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KScrCgkJCQkJCSd7JysKCQkJCQkJCSdkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsnKwoJCQkJCQkJJ2lmKGRkLmllNCkgd2luZG93LnNjcm9sbFRvKHdpbmRvdy5kZF94LCB3aW5kb3cuZGRfeSk7JysKCQkJCQkJJ30nCgkJCQkJLDApOwoJCQkJfQoJCQkJZGQuc2V0TW92SGRsKFJFU0laRSk7CgkJCQlkZC5yZXN6VG8oZGQub2JqLncsIGRkLm9iai5oKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRkLm9iai5pc19kcmFnZ2VkID0gMTsKCQkJCWRkLnNldE1vdkhkbChEUkFHKTsKCQkJfQoJCQlkZC5zZXRVcEhkbChEUk9QKTsKCQkJZGQuZW1iZWRWaXMoJ2hpZGRlbicpOwoJCQlkZC5vYmouX3NldE9wYVJlbCgwLjcpOwoJCQlkZC5vYmoubWF4aW1pemVaKCk7CgkJCWRkLm9meCA9IGRkLm9iai54K2RkLm9iai53LWRkLmUueDsKCQkJZGQub2Z5ID0gZGQub2JqLnkrZGQub2JqLmgtZGQuZS55OwoJCQlpZih3aW5kb3cubXlfUGlja0Z1bmMpIG15X1BpY2tGdW5jKCk7CgkJCWlmKGRkLm9iai5waWNrRnVuYykgZGQub2JqLnBpY2tGdW5jKCk7CgkJCUREU2Nyb2xsKCk7CgkJCXJldHVybiAhKAoJCQkJZGQub2JqLmlzX3Jlc2l6ZWQKCQkJCXx8IGRkLm40ICYmIGRkLm9iai5pc19pbWFnZQoJCQkJfHwgZGQubjYgfHwgZGQudzNjCgkJCSk7CgkJfQoJfQoJaWYoZGQuZG93bkZ1bmMpIHJldHVybiBkZC5kb3duRnVuYyhkX2V2KTsKCXJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIERSQUcoZF9ldikKewoJaWYoIWRkLm9iaiB8fCAhZGQub2JqLnZpc2libGUpIHJldHVybiB0cnVlOwoJaWYoZGQuaWU0IHx8IGRkLnczYyB8fCBkZC5uNiB8fCBkZC5vYmouY2hpbGRyZW4ubGVuZ3RoID4gMHhmKQoJewoJCWlmKGRkLndhaXQpIHJldHVybiBmYWxzZTsKCQlkZC53YWl0ID0gMTsKCQlzZXRUaW1lb3V0KCdkZC53YWl0ID0gMDsnLCBkZC50V2FpdCk7Cgl9CglkZC5lID0gbmV3IGRkLmV2dChkX2V2KTsKCWlmKGRkLmllICYmICFkZC5lLmJ1dCkKCXsKCQlEUk9QKGRfZXYpOwoJCXJldHVybiB0cnVlOwoJfQoJZGQubXNtb3ZlZCA9IDE7CglkZC5vYmoubW92ZVRvKAoJCWRkLm9iai52ZXJ0aWNhbD8gZGQub2JqLnggOiBkZC5tYXhPZmZYKGRkLmluV25kVyhkZC5vZngrZGQuZS54KS1kZC5vYmoudyksCgkJZGQub2JqLmhvcml6b250YWw/IGRkLm9iai55IDogZGQubWF4T2ZmWShkZC5pblduZEgoZGQub2Z5K2RkLmUueSktZGQub2JqLmgpCgkpOwoKCWlmKHdpbmRvdy5teV9EcmFnRnVuYykgbXlfRHJhZ0Z1bmMoKTsKCWlmKGRkLm9iai5kcmFnRnVuYykgZGQub2JqLmRyYWdGdW5jKCk7CglpZihkZC5tb3ZlRnVuYykgcmV0dXJuIGRkLm1vdmVGdW5jKGRfZXYpOwoJcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIFJFU0laRShkX2V2KQp7CglpZighZGQub2JqIHx8ICFkZC5vYmoudmlzaWJsZSkgcmV0dXJuIHRydWU7CglpZihkZC53YWl0KSByZXR1cm4gZmFsc2U7CglkZC53YWl0ID0gMTsKCXNldFRpbWVvdXQoJ2RkLndhaXQgPSAwOycsIGRkLnRXYWl0KTsKCWRkLmUgPSBuZXcgZGQuZXZ0KGRfZXYpOwoJaWYoZGQuaWUgJiYgIWRkLmUuYnV0KQoJewoJCURST1AoZF9ldik7CgkJcmV0dXJuIHRydWU7Cgl9CglkZC5tc21vdmVkID0gMTsKCXZhciBkX3cgPSBkZC5saW1XKGRkLmluV25kVyhkZC5vZngrZGQuZS54KS1kZC5vYmoueCksIGRfaDsKCWlmKCFkZC53aHJhdGlvKSBkX2ggPSBkZC5saW1IKGRkLmluV25kSChkZC5vZnkrZGQuZS55KS1kZC5vYmoueSk7CgllbHNlCgl7CgkJZF9oID0gZGQubGltSChkZC5pblduZEgoTWF0aC5yb3VuZChkX3cvZGQud2hyYXRpbykrZGQub2JqLnkpLWRkLm9iai55KTsKCQlkX3cgPSBNYXRoLnJvdW5kKGRfaCpkZC53aHJhdGlvKTsKCX0KCWRkLnJlc3pUbyhkX3csIGRfaCk7CglpZih3aW5kb3cubXlfUmVzaXplRnVuYykgbXlfUmVzaXplRnVuYygpOwoJaWYoZGQub2JqLnJlc2l6ZUZ1bmMpIGRkLm9iai5yZXNpemVGdW5jKCk7CglpZihkZC5tb3ZlRnVuYykgcmV0dXJuIGRkLm1vdmVGdW5jKGRfZXYpOwoJcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIERST1AoZF9ldikKewoJaWYoZGQub2JqKQoJewoJCWlmKGRkLm9iai5pc19kcmFnZ2VkKQoJCXsKCQkJaWYoIWRkLm9iai5pc19pbWFnZSkgZGQuZ2V0V0goZGQub2JqKTsKCQl9CgkJZWxzZSBpZihkZC5uNCkKCQl7CgkJCWlmKGRkLm9iai5pc19pbWFnZSkKCQkJewoJCQkJZGQubjRSZWN0VmlzKDApOwoJCQkJZGQub2JqLnJlc2l6ZVRvKGRkLm9iai53LCBkZC5vYmouaCk7CgkJCX0KCQl9CgkJaWYoIWRkLm40IHx8ICFkZC5vYmouaXNfaW1hZ2UpIGRkLnJlY2FsYygpOwoJCWRkLnNldE1vdkhkbChkZC5tb3ZlRnVuYyk7CgkJZGQuc2V0VXBIZGwoZGQudXBGdW5jKTsKCQlpZihkZC5kYikgZGQuZGIub25zZWxlY3RzdGFydCA9IG51bGw7CgkJZGQub2JqLl9zZXRPcGFSZWwoMS4wKTsKCQlkZC5vYmouX3NldENycyhkZC5vYmouY3Vyc29yKTsKCQlkZC5lbWJlZFZpcygndmlzaWJsZScpOwoJCWRkLm9iai5fcmVzZXRaKCk7CgkJZGQuZSA9IG5ldyBkZC5ldnQoZF9ldik7CgkJaWYod2luZG93Lm15X0Ryb3BGdW5jKSBteV9Ecm9wRnVuYygpOwoJCWlmKGRkLm9iai5kcm9wRnVuYykgZGQub2JqLmRyb3BGdW5jKCk7CgkJZGQubXNtb3ZlZCA9IGRkLm9iai5pc19kcmFnZ2VkID0gZGQub2JqLmlzX3Jlc2l6ZWQgPSBkZC53aHJhdGlvID0gMDsKCQlkZC5vYmogPSBudWxsOwoJfQoJZGQuc2V0RHduSGRsKFBJQ0spOwp9CmZ1bmN0aW9uIFNFVF9ESFRNTCgpCnsKCXZhciBkX2EgPSBhcmd1bWVudHMsIGRfYWksIGRfaHRtID0gJycsIGRfbywgZF9pID0gZF9hLmxlbmd0aDsKCXdoaWxlKGRfaSkKCXsKCQlpZighKGRfYWkgPSBkX2FbLS1kX2ldKS5pbmRleE9mKCdjOicpKSBkZC5jdXJzb3IgPSBkX2FpLnN1YnN0cmluZygyKTsKCQllbHNlIGlmKGRfYWkgPT0gTk9fQUxUKSBkZC5ub2FsdCA9IDE7CgkJZWxzZSBpZihkX2FpID09IFNDUk9MTCkgZGQuc2Nyb2xsID0gMTsKCQllbHNlIGlmKGRfYWkgPT0gUkVTRVRfWikgZGQucmVfeiA9IDE7CgkJZWxzZSBpZihkX2FpID09IFJFU0laQUJMRSkgZGQucmVzaXphYmxlID0gMTsKCQllbHNlIGlmKGRfYWkgPT0gU0NBTEFCTEUpIGRkLnNjYWxhYmxlID0gMTsKCQllbHNlIGlmKGRfYWkgPT0gVFJBTlNQQVJFTlQpIGRkLmRpYXBoYW4gPSAxOwoJCWVsc2UKCQl7CgkJCWRfbyA9IG5ldyBERE9iaihkX2FpKTsKCQkJZGQuYWRkRWx0KGRfbyk7CgkJCWRfaHRtICs9IGRfby50X2h0bSB8fCAnJzsKCQkJaWYoZF9vLm9pbWcgJiYgZF9vLmNweV9uKQoJCQl7CgkJCQlmb3IodmFyIGRfbCA9IGRfby5jcHlfbiwgZF9qID0gMDsgZF9qIDwgZF9sOykKCQkJCXsKCQkJCQl2YXIgZF9wID0gbmV3IERET2JqKGRfby5uYW1lK2Rfby5jbWQsICsrZF9qKTsKCQkJCQlkZC5hZGRFbHQoZF9wLCBkX28pOwoJCQkJCWRfcC5kZWZ6ID0gZF9vLmRlZnorZF9qOwoJCQkJCWRfcC5vcmlnaW5hbCA9IGRfbzsKCQkJCQlkX2h0bSArPSBkX3AudF9odG07CgkJCQl9CgkJCX0KCQl9Cgl9CglpZiAoZGQubjQgfHwgZGQubjYgfHwgZGQuaWUgfHwgZGQub3AgfHwgZGQudzNjKSBkb2N1bWVudC53cml0ZSgKCQkoZGQubjQ/ICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsiPjxcL2Rpdj5cbicKCQk6IChkZC5vcCAmJiAhZGQub3A2KT8gJzxkaXYgaWQ9Ik9wQmxVciIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3Zpc2liaWxpdHk6aGlkZGVuO3dpZHRoOjBweDtoZWlnaHQ6MHB4OyI+PGZvcm0+PGlucHV0IHR5cGU9InRleHQiIHN0eWxlPSJ3aWR0aDowcHg7aGVpZ2h0OjBweDsiPjxcL2Zvcm0+PFwvZGl2PicKCQk6ICcnKSArIGRfaHRtCgkpOwoJZGQueiA9IDB4MzM7Cglmb3IoZF9pID0gZGQuZWxlbWVudHMubGVuZ3RoOyBkX2k7KQoJewoJCWRkLmFkZFByb3BzKGRfbyA9IGRkLmVsZW1lbnRzWy0tZF9pXSk7CgkJaWYoZF9vLmlzX2ltYWdlICYmICFkX28ub3JpZ2luYWwgJiYgIWRfby5jbG9uZSkKCQkJZGQubjQ/IGRfby5vaW1nLnNyYyA9IHNwYWNlciA6IGRfby5vaW1nLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKCX0KCWRkLm1rV3pEb20oKTsKCWlmKHdpbmRvdy5vbmxvYWQpIGRkLmxvYWRGdW5jID0gd2luZG93Lm9ubG9hZDsKCWlmKHdpbmRvdy5vbnVubG9hZCkgZGQudWxvYWRGdW5jID0gd2luZG93Lm9udW5sb2FkOwoJd2luZG93Lm9ubG9hZCA9IGRkLmluaXR6OwoJd2luZG93Lm9udW5sb2FkID0gZGQuZmlubHo7CglkZC5zZXREd25IZGwoUElDSyk7Cn0KZnVuY3Rpb24gQUREX0RIVE1MKCkgLy8gbGF5ZXJzIG9ubHkhCnsKCXZhciBkX2EgPSBhcmd1bWVudHMsIGRfbywgZF9pID0gZF9hLmxlbmd0aDsgd2hpbGUoZF9pKQoJewoJCWRfbyA9IG5ldyBERE9iaihkX2FbLS1kX2ldKTsKCQlkZC5hZGRFbHQoZF9vKTsKCQlkZC5hZGRQcm9wcyhkX28pOwoJfQoJZGQubWtXekRvbSgpOwp9CgoKCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gSWYgbm90IG5lZWRlZCwgYWxsIGNvZGUgYmVsb3cgdGhpcyBsaW5lIG1heSBiZSByZW1vdmVkCgoKLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKZGQuZCA9IGRvY3VtZW50OwkJCS8vIDwgdi4gMi43Mgp2YXIgUkVTRVRfWklOREVYID0gUkVTRVRfWjsgLy8gPCAzLjQ0CnZhciBLRVlET1dOX1JFU0laRSA9IFJFU0laQUJMRTsgLy8gPCA0LjQzCnZhciBDVVJTT1JfUE9JTlRFUiA9IENVUlNPUl9IQU5EOyAvLyA8IDQuNDQKdmFyIE5PX1NDUk9MTCA9ICcnOwkJIC8vIDwgdi4gNC40OQoKCgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIEZVTkNUSU9OUyBGT1IgRVhURU5ERUQgU0NSSVBUSU5HCi8vIFVzZSB0aGVzZSBmb3IgeW91ciBvd24gZXh0ZW5zaW9ucywKLy8gb3IgdG8gY2FsbCBmdW5jdGlvbnMgZGVmaW5lZCBlbHNld2hlcmUKCgoKLyogbXlfUGlja0Z1bmMgSVMgQVVUT01BVElDQUxMWSBDQUxMRUQgV0hFTiBBTiBJVEVNIFNUQVJUUyBUTyBCRSBEUkFHR0VELgpUaGUgZm9sbG93aW5nIG9iamVjdHMvcHJvcGVydGllcyBhcmUgYWNjZXNzaWJsZSBmcm9tIGhlcmU6CgotIGRkLmU6IGN1cnJlbnQgbW91c2UgZXZlbnQKLSBkZC5lLnByb3BlcnR5OiBhY2Nlc3MgdG8gYSBwcm9wZXJ0eSBvZiB0aGUgY3VycmVudCBtb3VzZSBldmVudC4KICBNb3N0bHkgcmVxdWVzdGVkIHByb3BlcnRpZXM6CiAgLSBkZC5lLng6IGRvY3VtZW50LXJlbGF0ZWQgeCBjby1vcmRpbmF0ZQogIC0gZGQuZS55OiBkb2N1bWVudC1yZWxhdGVkIHkgY28tb3JkCiAgLSBkZC5lLnNyYzogdGFyZ2V0IG9mIG1vdXNlIGV2ZW50IChub3QgaWRlbnRpY2FsIHdpdGggdGhlIGRyYWcgZHJvcCBvYmplY3QgaXRzZWxmKS4KICAtIGRkLmUuYnV0dG9uOiBjdXJyZW50bHkgcHJlc3NlZCBtb3VzZSBidXR0b24uIExlZnQgYnV0dG9uOiBkZC5lLmJ1dHRvbiA8PSAxCgotIGRkLm9iajogcmVmZXJlbmNlIHRvIGN1cnJlbnRseSBkcmFnZ2VkIGl0ZW0uCi0gZGQub2JqLnByb3BlcnR5OiBhY2Nlc3MgdG8gYW55IHByb3BlcnR5IG9mIHRoYXQgaXRlbS4KLSBkZC5vYmoubWV0aG9kKCk6IGZvciBleGFtcGxlIGRkLm9iai5yZXNpemVUbygpIG9yIGRkLm9iai5zd2FwSW1hZ2UoKSAuCiAgTW9zdGx5IHJlcXVlc3RlZCBwcm9wZXJ0aWVzOgoJLSBkZC5vYmoubmFtZTogaW1hZ2UgbmFtZSBvciBsYXllciBJRCBwYXNzZWQgdG8gU0VUX0RIVE1MKCk7CgktIGRkLm9iai54IGFuZCBkZC5vYmoueTogY28tb3JkaW5hdGVzOwoJLSBkZC5vYmoudyBhbmQgZGQub2JqLmg6IHNpemU7CgktIGRkLm9iai5pc19kcmFnZ2VkOiAxIHdoaWxlIGl0ZW0gaXMgZHJhZ2dlZCwgZWxzZSAwOwoJLSBkZC5vYmouaXNfcmVzaXplZDogMSB3aGlsZSBpdGVtIGlzIHJlc2l6ZWQsIGkuZS4gaWYgPGN0cmw+IG9yIDxzaGlmdD4gaXMgcHJlc3NlZCwgZWxzZSAwCgpGb3IgbW9yZSBwcm9wZXJ0aWVzIGFuZCBkZXRhaWxzLCB2aXNpdCB0aGUgQVBJIGRvY3VtZW50YXRpb24KYXQgaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmNvbS9kcmFnZHJvcC9hcGlfZS5odG0gKGVuZ2xpc2gpIG9yCmh0dHA6Ly93d3cud2FsdGVyem9ybi5kZS9kcmFnZHJvcC9hcGkuaHRtIChnZXJtYW4pCSovCmZ1bmN0aW9uIG15X1BpY2tGdW5jKCkKewp9CgoKCgovKiBteV9EcmFnRnVuYyBJUyBDQUxMRUQgV0hJTEUgQU4gSVRFTSBJUyBEUkFHR0VEClNlZSB0aGUgZGVzY3JpcHRpb24gb2YgbXlfUGlja0Z1bmMgYWJvdmUgZm9yIHdoYXQncyBhY2Nlc3NpYmxlIGZyb20gaGVyZS4gKi8KZnVuY3Rpb24gbXlfRHJhZ0Z1bmMoKQp7CgkvL3dpbmRvdy5zdGF0dXMgPSAnZGQuZWxlbWVudHMuJyArIGRkLm9iai5uYW1lICsgJy54ICA9ICcgKyBkZC5vYmoueCArICcJIGRkLmVsZW1lbnRzLicgKyBkZC5vYmoubmFtZSArICcueSA9ICcgKyBkZC5vYmoueTsKfQoKCgoKLyogbXlfUmVzaXplRnVuYyBJUyBDQUxMRUQgV0hJTEUgQU4gSVRFTSBJUyBSRVNJWkVEClNlZSB0aGUgZGVzY3JpcHRpb24gb2YgbXlfUGlja0Z1bmMgYWJvdmUgZm9yIHdoYXQncyBhY2Nlc3NpYmxlIGZyb20gaGVyZS4gKi8KZnVuY3Rpb24gbXlfUmVzaXplRnVuYygpCnsKCS8vd2luZG93LnN0YXR1cyA9ICdkZC5lbGVtZW50cy4nICsgZGQub2JqLm5hbWUgKyAnLncgID0gJyArIGRkLm9iai53ICsgJwkgZGQuZWxlbWVudHMuJyArIGRkLm9iai5uYW1lICsgJy5oID0gJyArIGRkLm9iai5oOwp9CgoKCgovKiBUSElTIE9ORSBJUyBDQUxMRUQgT05DRSBBTiBJVEVNIElTIERST1BQRUQKU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBteV9QaWNrRnVuYyBmb3Igd2hhdCdzIGFjY2Vzc2libGUgZnJvbSBoZXJlLgpIZXJlIG1heSBiZSBpbnZlc3RpZ2F0ZWQsIGZvciBleGFtcGxlLCB3aGF0J3MgdGhlIG5hbWUgKGRkLm9iai5uYW1lKQpvZiB0aGUgZHJvcHBlZCBpdGVtLCBhbmQgd2hlcmUgKGRkLm9iai54LCBkZC5vYmoueSkgaXQgaGFzIGJlZW4gZHJvcHBlZC4uLiAqLwpmdW5jdGlvbiBteV9Ecm9wRnVuYygpCnsKfQo='></script> 
	-->

<!--
	<script id="wz_graphics" src='data:/text/plain;base64,LyogVGhpcyBub3RpY2UgbXVzdCBiZSB1bnRvdWNoZWQgYXQgYWxsIHRpbWVzLg0KDQp3el9qc2dyYXBoaWNzLmpzICAgIHYuIDMuMDUNClRoZSBsYXRlc3QgdmVyc2lvbiBpcyBhdmFpbGFibGUgYXQNCmh0dHA6Ly93d3cud2FsdGVyem9ybi5jb20NCm9yIGh0dHA6Ly93d3cuZGV2aXJhLmNvbQ0Kb3IgaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmRlDQoNCkNvcHlyaWdodCAoYykgMjAwMi0yMDA5IFdhbHRlciBab3JuLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KQ3JlYXRlZCAzLiAxMS4gMjAwMiBieSBXYWx0ZXIgWm9ybiAoV2ViOiBodHRwOi8vd3d3LndhbHRlcnpvcm4uY29tICkNCkxhc3QgbW9kaWZpZWQ6IDIuIDIuIDIwMDkNCg0KUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyBmb3IgSW50ZXJuZXQgRXhwbG9yZXINCmJ5IFRob21hcyBGcmFuayBhbmQgSm9obiBIb2xkc3dvcnRoLg0KZmlsbFBvbHlnb24gbWV0aG9kIGltcGxlbWVudGVkIGJ5IE1hdHRoaWV1IEhhbGxlci4NCg0KSGlnaCBQZXJmb3JtYW5jZSBKYXZhU2NyaXB0IEdyYXBoaWNzIExpYnJhcnkuDQpQcm92aWRlcyBtZXRob2RzDQotIHRvIGRyYXcgbGluZXMsIHJlY3RhbmdsZXMsIGVsbGlwc2VzLCBwb2x5Z29ucw0KCXdpdGggc3BlY2lmaWFibGUgbGluZSB0aGlja25lc3MsDQotIHRvIGZpbGwgcmVjdGFuZ2xlcywgcG9seWdvbnMsIGVsbGlwc2VzIGFuZCBhcmNzDQotIHRvIGRyYXcgdGV4dC4NCk5PVEU6IE9wZXJhdGlvbnMsIGZ1bmN0aW9ucyBhbmQgYnJhbmNoaW5nIGhhdmUgcmF0aGVyIGJlZW4gb3B0aW1pemVkDQp0byBlZmZpY2llbmN5IGFuZCBzcGVlZCB0aGFuIHRvIHNob3J0bmVzcyBvZiBzb3VyY2UgY29kZS4NCg0KTElDRU5TRTogTEdQTA0KDQpUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQpMaWNlbnNlIChMR1BMKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyDQp2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCg0KVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQpidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUNCkxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQoNCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCkxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EsDQpvciBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2xlc3Nlci5odG1sDQoqLw0KDQoNCnZhciBqZ19vaywgamdfaWUsIGpnX2Zhc3QsIGpnX2RvbSwgamdfbW96Ow0KDQoNCmZ1bmN0aW9uIF9jaGtESFRNKHduZCwgeCwgaSkNCi8vIFVuZGVyIFhVTCwgb3duZXIgb2YgJ2RvY3VtZW50JyBtdXN0IGJlIHNwZWNpZmllZCBleHBsaWNpdGx5DQp7DQoJeCA9IHduZC5kb2N1bWVudC5ib2R5IHx8IG51bGw7DQoJamdfaWUgPSB4ICYmIHR5cGVvZiB4Lmluc2VydEFkamFjZW50SFRNTCAhPSAidW5kZWZpbmVkIiAmJiB3bmQuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDsNCglqZ19kb20gPSAoeCAmJiAhamdfaWUgJiYNCgkJdHlwZW9mIHguYXBwZW5kQ2hpbGQgIT0gInVuZGVmaW5lZCIgJiYNCgkJdHlwZW9mIHduZC5kb2N1bWVudC5jcmVhdGVSYW5nZSAhPSAidW5kZWZpbmVkIiAmJg0KCQl0eXBlb2YgKGkgPSB3bmQuZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSkuc2V0U3RhcnRCZWZvcmUgIT0gInVuZGVmaW5lZCIgJiYNCgkJdHlwZW9mIGkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50ICE9ICJ1bmRlZmluZWQiKTsNCglqZ19mYXN0ID0gamdfaWUgJiYgd25kLmRvY3VtZW50LmFsbCAmJiAhd25kLm9wZXJhOw0KCWpnX21veiA9IGpnX2RvbSAmJiB0eXBlb2YgeC5zdHlsZS5Nb3pPcGFjaXR5ICE9ICJ1bmRlZmluZWQiOw0KCWpnX29rID0gISEoamdfaWUgfHwgamdfZG9tKTsNCn0NCg0KZnVuY3Rpb24gX3BudENudkRvbSgpDQp7DQoJdmFyIHggPSB0aGlzLnduZC5kb2N1bWVudC5jcmVhdGVSYW5nZSgpOw0KCXguc2V0U3RhcnRCZWZvcmUodGhpcy5jbnYpOw0KCXggPSB4LmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChqZ19mYXN0PyB0aGlzLl9odG1ScGMoKSA6IHRoaXMuaHRtKTsNCglpZih0aGlzLmNudikgdGhpcy5jbnYuYXBwZW5kQ2hpbGQoeCk7DQoJdGhpcy5odG0gPSAiIjsNCn0NCg0KZnVuY3Rpb24gX3BudENudkllKCkNCnsNCglpZih0aGlzLmNudikgdGhpcy5jbnYuaW5zZXJ0QWRqYWNlbnRIVE1MKCJCZWZvcmVFbmQiLCBqZ19mYXN0PyB0aGlzLl9odG1ScGMoKSA6IHRoaXMuaHRtKTsNCgl0aGlzLmh0bSA9ICIiOw0KfQ0KDQpmdW5jdGlvbiBfcG50RG9jKCkNCnsNCgl0aGlzLnduZC5kb2N1bWVudC53cml0ZShqZ19mYXN0PyB0aGlzLl9odG1ScGMoKSA6IHRoaXMuaHRtKTsNCgl0aGlzLmh0bSA9ICcnOw0KfQ0KDQpmdW5jdGlvbiBfcG50TigpDQp7DQoJOw0KfQ0KDQpmdW5jdGlvbiBfbWtEaXYoeCwgeSwgdywgaCkNCnsNCgl0aGlzLmh0bSArPSAnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7JysNCgkJJ2xlZnQ6JyArIHggKyAncHg7JysNCgkJJ3RvcDonICsgeSArICdweDsnKw0KCQknd2lkdGg6JyArIHcgKyAncHg7JysNCgkJJ2hlaWdodDonICsgaCArICdweDsnKw0KCQknY2xpcDpyZWN0KDAsJyt3KydweCwnK2grJ3B4LDApOycrDQoJCSdiYWNrZ3JvdW5kLWNvbG9yOicgKyB0aGlzLmNvbG9yICsNCgkJKCFqZ19tb3o/ICc7b3ZlcmZsb3c6aGlkZGVuJyA6ICcnKSsNCgkJJzsiPjxcL2Rpdj4nOw0KfQ0KDQpmdW5jdGlvbiBfbWtEaXZJZSh4LCB5LCB3LCBoKQ0Kew0KCXRoaXMuaHRtICs9ICclJScrdGhpcy5jb2xvcisnOycreCsnOycreSsnOycrdysnOycraCsnOyc7DQp9DQoNCmZ1bmN0aW9uIF9ta0RpdlBydCh4LCB5LCB3LCBoKQ0Kew0KCXRoaXMuaHRtICs9ICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsnKw0KCQknYm9yZGVyLWxlZnQ6JyArIHcgKyAncHggc29saWQgJyArIHRoaXMuY29sb3IgKyAnOycrDQoJCSdsZWZ0OicgKyB4ICsgJ3B4OycrDQoJCSd0b3A6JyArIHkgKyAncHg7JysNCgkJJ3dpZHRoOjBweDsnKw0KCQknaGVpZ2h0OicgKyBoICsgJ3B4OycrDQoJCSdjbGlwOnJlY3QoMCwnK3crJ3B4LCcraCsncHgsMCk7JysNCgkJJ2JhY2tncm91bmQtY29sb3I6JyArIHRoaXMuY29sb3IgKw0KCQkoIWpnX21vej8gJztvdmVyZmxvdzpoaWRkZW4nIDogJycpKw0KCQknOyI+PFwvZGl2Pic7DQp9DQoNCnZhciBfcmVnZXggPSAgLyUlKFteO10rKTsoW147XSspOyhbXjtdKyk7KFteO10rKTsoW147XSspOy9nOw0KZnVuY3Rpb24gX2h0bVJwYygpDQp7DQoJcmV0dXJuIHRoaXMuaHRtLnJlcGxhY2UoDQoJCV9yZWdleCwNCgkJJzxkaXYgc3R5bGU9Im92ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kLWNvbG9yOicrDQoJCSckMTtsZWZ0OiQycHg7dG9wOiQzcHg7d2lkdGg6JDRweDtoZWlnaHQ6JDVweCI+PC9kaXY+XG4nKTsNCn0NCg0KZnVuY3Rpb24gX2h0bVBydFJwYygpDQp7DQoJcmV0dXJuIHRoaXMuaHRtLnJlcGxhY2UoDQoJCV9yZWdleCwNCgkJJzxkaXYgc3R5bGU9Im92ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kLWNvbG9yOicrDQoJCSckMTtsZWZ0OiQycHg7dG9wOiQzcHg7d2lkdGg6JDRweDtoZWlnaHQ6JDVweDtib3JkZXItbGVmdDokNHB4IHNvbGlkICQxIj48L2Rpdj5cbicpOw0KfQ0KDQpmdW5jdGlvbiBfbWtMaW4oeDEsIHkxLCB4MiwgeTIpDQp7DQoJaWYoeDEgPiB4MikNCgl7DQoJCXZhciBfeDIgPSB4MjsNCgkJdmFyIF95MiA9IHkyOw0KCQl4MiA9IHgxOw0KCQl5MiA9IHkxOw0KCQl4MSA9IF94MjsNCgkJeTEgPSBfeTI7DQoJfQ0KCXZhciBkeCA9IHgyLXgxLCBkeSA9IE1hdGguYWJzKHkyLXkxKSwNCgl4ID0geDEsIHkgPSB5MSwNCgl5SW5jciA9ICh5MSA+IHkyKT8gLTEgOiAxOw0KDQoJaWYoZHggPj0gZHkpDQoJew0KCQl2YXIgcHIgPSBkeTw8MSwNCgkJcHJ1ID0gcHIgLSAoZHg8PDEpLA0KCQlwID0gcHItZHgsDQoJCW94ID0geDsNCgkJd2hpbGUoZHggPiAwKQ0KCQl7LS1keDsNCgkJCSsreDsNCgkJCWlmKHAgPiAwKQ0KCQkJew0KCQkJCXRoaXMuX21rRGl2KG94LCB5LCB4LW94LCAxKTsNCgkJCQl5ICs9IHlJbmNyOw0KCQkJCXAgKz0gcHJ1Ow0KCQkJCW94ID0geDsNCgkJCX0NCgkJCWVsc2UgcCArPSBwcjsNCgkJfQ0KCQl0aGlzLl9ta0RpdihveCwgeSwgeDItb3grMSwgMSk7DQoJfQ0KDQoJZWxzZQ0KCXsNCgkJdmFyIHByID0gZHg8PDEsDQoJCXBydSA9IHByIC0gKGR5PDwxKSwNCgkJcCA9IHByLWR5LA0KCQlveSA9IHk7DQoJCWlmKHkyIDw9IHkxKQ0KCQl7DQoJCQl3aGlsZShkeSA+IDApDQoJCQl7LS1keTsNCgkJCQlpZihwID4gMCkNCgkJCQl7DQoJCQkJCXRoaXMuX21rRGl2KHgrKywgeSwgMSwgb3kteSsxKTsNCgkJCQkJeSArPSB5SW5jcjsNCgkJCQkJcCArPSBwcnU7DQoJCQkJCW95ID0geTsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJeSArPSB5SW5jcjsNCgkJCQkJcCArPSBwcjsNCgkJCQl9DQoJCQl9DQoJCQl0aGlzLl9ta0Rpdih4MiwgeTIsIDEsIG95LXkyKzEpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJd2hpbGUoZHkgPiAwKQ0KCQkJey0tZHk7DQoJCQkJeSArPSB5SW5jcjsNCgkJCQlpZihwID4gMCkNCgkJCQl7DQoJCQkJCXRoaXMuX21rRGl2KHgrKywgb3ksIDEsIHktb3kpOw0KCQkJCQlwICs9IHBydTsNCgkJCQkJb3kgPSB5Ow0KCQkJCX0NCgkJCQllbHNlIHAgKz0gcHI7DQoJCQl9DQoJCQl0aGlzLl9ta0Rpdih4Miwgb3ksIDEsIHkyLW95KzEpOw0KCQl9DQoJfQ0KfQ0KDQpmdW5jdGlvbiBfbWtMaW4yRCh4MSwgeTEsIHgyLCB5MikNCnsNCglpZih4MSA+IHgyKQ0KCXsNCgkJdmFyIF94MiA9IHgyOw0KCQl2YXIgX3kyID0geTI7DQoJCXgyID0geDE7DQoJCXkyID0geTE7DQoJCXgxID0gX3gyOw0KCQl5MSA9IF95MjsNCgl9DQoJdmFyIGR4ID0geDIteDEsIGR5ID0gTWF0aC5hYnMoeTIteTEpLA0KCXggPSB4MSwgeSA9IHkxLA0KCXlJbmNyID0gKHkxID4geTIpPyAtMSA6IDE7DQoNCgl2YXIgcyA9IHRoaXMuc3Ryb2tlOw0KCWlmKGR4ID49IGR5KQ0KCXsNCgkJaWYoZHggPiAwICYmIHMtMyA+IDApDQoJCXsNCgkJCXZhciBfcyA9IChzKmR4Kk1hdGguc3FydCgxK2R5KmR5LyhkeCpkeCkpLWR4LShzPj4xKSpkeSkgLyBkeDsNCgkJCV9zID0gKCEocy00KT8gTWF0aC5jZWlsKF9zKSA6IE1hdGgucm91bmQoX3MpKSArIDE7DQoJCX0NCgkJZWxzZSB2YXIgX3MgPSBzOw0KCQl2YXIgYWQgPSBNYXRoLmNlaWwocy8yKTsNCg0KCQl2YXIgcHIgPSBkeTw8MSwNCgkJcHJ1ID0gcHIgLSAoZHg8PDEpLA0KCQlwID0gcHItZHgsDQoJCW94ID0geDsNCgkJd2hpbGUoZHggPiAwKQ0KCQl7LS1keDsNCgkJCSsreDsNCgkJCWlmKHAgPiAwKQ0KCQkJew0KCQkJCXRoaXMuX21rRGl2KG94LCB5LCB4LW94K2FkLCBfcyk7DQoJCQkJeSArPSB5SW5jcjsNCgkJCQlwICs9IHBydTsNCgkJCQlveCA9IHg7DQoJCQl9DQoJCQllbHNlIHAgKz0gcHI7DQoJCX0NCgkJdGhpcy5fbWtEaXYob3gsIHksIHgyLW94K2FkKzEsIF9zKTsNCgl9DQoNCgllbHNlDQoJew0KCQlpZihzLTMgPiAwKQ0KCQl7DQoJCQl2YXIgX3MgPSAocypkeSpNYXRoLnNxcnQoMStkeCpkeC8oZHkqZHkpKS0ocz4+MSkqZHgtZHkpIC8gZHk7DQoJCQlfcyA9ICghKHMtNCk/IE1hdGguY2VpbChfcykgOiBNYXRoLnJvdW5kKF9zKSkgKyAxOw0KCQl9DQoJCWVsc2UgdmFyIF9zID0gczsNCgkJdmFyIGFkID0gTWF0aC5yb3VuZChzLzIpOw0KDQoJCXZhciBwciA9IGR4PDwxLA0KCQlwcnUgPSBwciAtIChkeTw8MSksDQoJCXAgPSBwci1keSwNCgkJb3kgPSB5Ow0KCQlpZih5MiA8PSB5MSkNCgkJew0KCQkJKythZDsNCgkJCXdoaWxlKGR5ID4gMCkNCgkJCXstLWR5Ow0KCQkJCWlmKHAgPiAwKQ0KCQkJCXsNCgkJCQkJdGhpcy5fbWtEaXYoeCsrLCB5LCBfcywgb3kteSthZCk7DQoJCQkJCXkgKz0geUluY3I7DQoJCQkJCXAgKz0gcHJ1Ow0KCQkJCQlveSA9IHk7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCXkgKz0geUluY3I7DQoJCQkJCXAgKz0gcHI7DQoJCQkJfQ0KCQkJfQ0KCQkJdGhpcy5fbWtEaXYoeDIsIHkyLCBfcywgb3kteTIrYWQpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJd2hpbGUoZHkgPiAwKQ0KCQkJey0tZHk7DQoJCQkJeSArPSB5SW5jcjsNCgkJCQlpZihwID4gMCkNCgkJCQl7DQoJCQkJCXRoaXMuX21rRGl2KHgrKywgb3ksIF9zLCB5LW95K2FkKTsNCgkJCQkJcCArPSBwcnU7DQoJCQkJCW95ID0geTsNCgkJCQl9DQoJCQkJZWxzZSBwICs9IHByOw0KCQkJfQ0KCQkJdGhpcy5fbWtEaXYoeDIsIG95LCBfcywgeTItb3krYWQrMSk7DQoJCX0NCgl9DQp9DQoNCmZ1bmN0aW9uIF9ta0xpbkRvdHQoeDEsIHkxLCB4MiwgeTIpDQp7DQoJaWYoeDEgPiB4MikNCgl7DQoJCXZhciBfeDIgPSB4MjsNCgkJdmFyIF95MiA9IHkyOw0KCQl4MiA9IHgxOw0KCQl5MiA9IHkxOw0KCQl4MSA9IF94MjsNCgkJeTEgPSBfeTI7DQoJfQ0KCXZhciBkeCA9IHgyLXgxLCBkeSA9IE1hdGguYWJzKHkyLXkxKSwNCgl4ID0geDEsIHkgPSB5MSwNCgl5SW5jciA9ICh5MSA+IHkyKT8gLTEgOiAxLA0KCWRydyA9IHRydWU7DQoJaWYoZHggPj0gZHkpDQoJew0KCQl2YXIgcHIgPSBkeTw8MSwNCgkJcHJ1ID0gcHIgLSAoZHg8PDEpLA0KCQlwID0gcHItZHg7DQoJCXdoaWxlKGR4ID4gMCkNCgkJey0tZHg7DQoJCQlpZihkcncpIHRoaXMuX21rRGl2KHgsIHksIDEsIDEpOw0KCQkJZHJ3ID0gIWRydzsNCgkJCWlmKHAgPiAwKQ0KCQkJew0KCQkJCXkgKz0geUluY3I7DQoJCQkJcCArPSBwcnU7DQoJCQl9DQoJCQllbHNlIHAgKz0gcHI7DQoJCQkrK3g7DQoJCX0NCgl9DQoJZWxzZQ0KCXsNCgkJdmFyIHByID0gZHg8PDEsDQoJCXBydSA9IHByIC0gKGR5PDwxKSwNCgkJcCA9IHByLWR5Ow0KCQl3aGlsZShkeSA+IDApDQoJCXstLWR5Ow0KCQkJaWYoZHJ3KSB0aGlzLl9ta0Rpdih4LCB5LCAxLCAxKTsNCgkJCWRydyA9ICFkcnc7DQoJCQl5ICs9IHlJbmNyOw0KCQkJaWYocCA+IDApDQoJCQl7DQoJCQkJKyt4Ow0KCQkJCXAgKz0gcHJ1Ow0KCQkJfQ0KCQkJZWxzZSBwICs9IHByOw0KCQl9DQoJfQ0KCWlmKGRydykgdGhpcy5fbWtEaXYoeCwgeSwgMSwgMSk7DQp9DQoNCmZ1bmN0aW9uIF9ta092KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkNCnsNCgl2YXIgYSA9ICgrK3dpZHRoKT4+MSwgYiA9ICgrK2hlaWdodCk+PjEsDQoJd29kID0gd2lkdGgmMSwgaG9kID0gaGVpZ2h0JjEsDQoJY3ggPSBsZWZ0K2EsIGN5ID0gdG9wK2IsDQoJeCA9IDAsIHkgPSBiLA0KCW94ID0gMCwgb3kgPSBiLA0KCWFhMiA9IChhKmEpPDwxLCBhYTQgPSBhYTI8PDEsIGJiMiA9IChiKmIpPDwxLCBiYjQgPSBiYjI8PDEsDQoJc3QgPSAoYWEyPj4xKSooMS0oYjw8MSkpICsgYmIyLA0KCXR0ID0gKGJiMj4+MSkgLSBhYTIqKChiPDwxKS0xKSwNCgl3LCBoOw0KCXdoaWxlKHkgPiAwKQ0KCXsNCgkJaWYoc3QgPCAwKQ0KCQl7DQoJCQlzdCArPSBiYjIqKCh4PDwxKSszKTsNCgkJCXR0ICs9IGJiNCooKyt4KTsNCgkJfQ0KCQllbHNlIGlmKHR0IDwgMCkNCgkJew0KCQkJc3QgKz0gYmIyKigoeDw8MSkrMykgLSBhYTQqKHktMSk7DQoJCQl0dCArPSBiYjQqKCsreCkgLSBhYTIqKCgoeS0tKTw8MSktMyk7DQoJCQl3ID0geC1veDsNCgkJCWggPSBveS15Ow0KCQkJaWYoKHcmMikgJiYgKGgmMikpDQoJCQl7DQoJCQkJdGhpcy5fbWtPdlFkcyhjeCwgY3ksIHgtMiwgeSsyLCAxLCAxLCB3b2QsIGhvZCk7DQoJCQkJdGhpcy5fbWtPdlFkcyhjeCwgY3ksIHgtMSwgeSsxLCAxLCAxLCB3b2QsIGhvZCk7DQoJCQl9DQoJCQllbHNlIHRoaXMuX21rT3ZRZHMoY3gsIGN5LCB4LTEsIG95LCB3LCBoLCB3b2QsIGhvZCk7DQoJCQlveCA9IHg7DQoJCQlveSA9IHk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQl0dCAtPSBhYTIqKCh5PDwxKS0zKTsNCgkJCXN0IC09IGFhNCooLS15KTsNCgkJfQ0KCX0NCgl3ID0gYS1veCsxOw0KCWggPSAob3k8PDEpK2hvZDsNCgl5ID0gY3ktb3k7DQoJdGhpcy5fbWtEaXYoY3gtYSwgeSwgdywgaCk7DQoJdGhpcy5fbWtEaXYoY3grb3grd29kLTEsIHksIHcsIGgpOw0KfQ0KDQpmdW5jdGlvbiBfbWtPdjJEKGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkNCnsNCgl2YXIgcyA9IHRoaXMuc3Ryb2tlOw0KCXdpZHRoICs9IHMrMTsNCgloZWlnaHQgKz0gcysxOw0KCXZhciBhID0gd2lkdGg+PjEsIGIgPSBoZWlnaHQ+PjEsDQoJd29kID0gd2lkdGgmMSwgaG9kID0gaGVpZ2h0JjEsDQoJY3ggPSBsZWZ0K2EsIGN5ID0gdG9wK2IsDQoJeCA9IDAsIHkgPSBiLA0KCWFhMiA9IChhKmEpPDwxLCBhYTQgPSBhYTI8PDEsIGJiMiA9IChiKmIpPDwxLCBiYjQgPSBiYjI8PDEsDQoJc3QgPSAoYWEyPj4xKSooMS0oYjw8MSkpICsgYmIyLA0KCXR0ID0gKGJiMj4+MSkgLSBhYTIqKChiPDwxKS0xKTsNCg0KCWlmKHMtNCA8IDAgJiYgKCEocy0yKSB8fCB3aWR0aC01MSA+IDAgJiYgaGVpZ2h0LTUxID4gMCkpDQoJew0KCQl2YXIgb3ggPSAwLCBveSA9IGIsDQoJCXcsIGgsDQoJCXB4dzsNCgkJd2hpbGUoeSA+IDApDQoJCXsNCgkJCWlmKHN0IDwgMCkNCgkJCXsNCgkJCQlzdCArPSBiYjIqKCh4PDwxKSszKTsNCgkJCQl0dCArPSBiYjQqKCsreCk7DQoJCQl9DQoJCQllbHNlIGlmKHR0IDwgMCkNCgkJCXsNCgkJCQlzdCArPSBiYjIqKCh4PDwxKSszKSAtIGFhNCooeS0xKTsNCgkJCQl0dCArPSBiYjQqKCsreCkgLSBhYTIqKCgoeS0tKTw8MSktMyk7DQoJCQkJdyA9IHgtb3g7DQoJCQkJaCA9IG95LXk7DQoNCgkJCQlpZih3LTEpDQoJCQkJew0KCQkJCQlweHcgPSB3KzErKHMmMSk7DQoJCQkJCWggPSBzOw0KCQkJCX0NCgkJCQllbHNlIGlmKGgtMSkNCgkJCQl7DQoJCQkJCXB4dyA9IHM7DQoJCQkJCWggKz0gMSsocyYxKTsNCgkJCQl9DQoJCQkJZWxzZSBweHcgPSBoID0gczsNCgkJCQl0aGlzLl9ta092UWRzKGN4LCBjeSwgeC0xLCBveSwgcHh3LCBoLCB3b2QsIGhvZCk7DQoJCQkJb3ggPSB4Ow0KCQkJCW95ID0geTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQl0dCAtPSBhYTIqKCh5PDwxKS0zKTsNCgkJCQlzdCAtPSBhYTQqKC0teSk7DQoJCQl9DQoJCX0NCgkJdGhpcy5fbWtEaXYoY3gtYSwgY3ktb3ksIHMsIChveTw8MSkraG9kKTsNCgkJdGhpcy5fbWtEaXYoY3grYSt3b2QtcywgY3ktb3ksIHMsIChveTw8MSkraG9kKTsNCgl9DQoNCgllbHNlDQoJew0KCQl2YXIgX2EgPSAod2lkdGgtKHM8PDEpKT4+MSwNCgkJX2IgPSAoaGVpZ2h0LShzPDwxKSk+PjEsDQoJCV94ID0gMCwgX3kgPSBfYiwNCgkJX2FhMiA9IChfYSpfYSk8PDEsIF9hYTQgPSBfYWEyPDwxLCBfYmIyID0gKF9iKl9iKTw8MSwgX2JiNCA9IF9iYjI8PDEsDQoJCV9zdCA9IChfYWEyPj4xKSooMS0oX2I8PDEpKSArIF9iYjIsDQoJCV90dCA9IChfYmIyPj4xKSAtIF9hYTIqKChfYjw8MSktMSksDQoNCgkJcHhsID0gbmV3IEFycmF5KCksDQoJCXB4dCA9IG5ldyBBcnJheSgpLA0KCQlfcHhiID0gbmV3IEFycmF5KCk7DQoJCXB4bFswXSA9IDA7DQoJCXB4dFswXSA9IGI7DQoJCV9weGJbMF0gPSBfYi0xOw0KCQl3aGlsZSh5ID4gMCkNCgkJew0KCQkJaWYoc3QgPCAwKQ0KCQkJew0KCQkJCXB4bFtweGwubGVuZ3RoXSA9IHg7DQoJCQkJcHh0W3B4dC5sZW5ndGhdID0geTsNCgkJCQlzdCArPSBiYjIqKCh4PDwxKSszKTsNCgkJCQl0dCArPSBiYjQqKCsreCk7DQoJCQl9DQoJCQllbHNlIGlmKHR0IDwgMCkNCgkJCXsNCgkJCQlweGxbcHhsLmxlbmd0aF0gPSB4Ow0KCQkJCXN0ICs9IGJiMiooKHg8PDEpKzMpIC0gYWE0Kih5LTEpOw0KCQkJCXR0ICs9IGJiNCooKyt4KSAtIGFhMiooKCh5LS0pPDwxKS0zKTsNCgkJCQlweHRbcHh0Lmxlbmd0aF0gPSB5Ow0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCXR0IC09IGFhMiooKHk8PDEpLTMpOw0KCQkJCXN0IC09IGFhNCooLS15KTsNCgkJCX0NCg0KCQkJaWYoX3kgPiAwKQ0KCQkJew0KCQkJCWlmKF9zdCA8IDApDQoJCQkJew0KCQkJCQlfc3QgKz0gX2JiMiooKF94PDwxKSszKTsNCgkJCQkJX3R0ICs9IF9iYjQqKCsrX3gpOw0KCQkJCQlfcHhiW19weGIubGVuZ3RoXSA9IF95LTE7DQoJCQkJfQ0KCQkJCWVsc2UgaWYoX3R0IDwgMCkNCgkJCQl7DQoJCQkJCV9zdCArPSBfYmIyKigoX3g8PDEpKzMpIC0gX2FhNCooX3ktMSk7DQoJCQkJCV90dCArPSBfYmI0KigrK194KSAtIF9hYTIqKCgoX3ktLSk8PDEpLTMpOw0KCQkJCQlfcHhiW19weGIubGVuZ3RoXSA9IF95LTE7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCV90dCAtPSBfYWEyKigoX3k8PDEpLTMpOw0KCQkJCQlfc3QgLT0gX2FhNCooLS1feSk7DQoJCQkJCV9weGJbX3B4Yi5sZW5ndGgtMV0tLTsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQl2YXIgb3ggPSAtd29kLCBveSA9IGIsDQoJCV9veSA9IF9weGJbMF0sDQoJCWwgPSBweGwubGVuZ3RoLA0KCQl3LCBoOw0KCQlmb3IodmFyIGkgPSAwOyBpIDwgbDsgaSsrKQ0KCQl7DQoJCQlpZih0eXBlb2YgX3B4YltpXSAhPSAidW5kZWZpbmVkIikNCgkJCXsNCgkJCQlpZihfcHhiW2ldIDwgX295IHx8IHB4dFtpXSA8IG95KQ0KCQkJCXsNCgkJCQkJeCA9IHB4bFtpXTsNCgkJCQkJdGhpcy5fbWtPdlFkcyhjeCwgY3ksIHgsIG95LCB4LW94LCBveS1fb3ksIHdvZCwgaG9kKTsNCgkJCQkJb3ggPSB4Ow0KCQkJCQlveSA9IHB4dFtpXTsNCgkJCQkJX295ID0gX3B4YltpXTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJeCA9IHB4bFtpXTsNCgkJCQl0aGlzLl9ta0RpdihjeC14LCBjeS1veSwgMSwgKG95PDwxKStob2QpOw0KCQkJCXRoaXMuX21rRGl2KGN4K294K3dvZCwgY3ktb3ksIDEsIChveTw8MSkraG9kKTsNCgkJCQlveCA9IHg7DQoJCQkJb3kgPSBweHRbaV07DQoJCQl9DQoJCX0NCgkJdGhpcy5fbWtEaXYoY3gtYSwgY3ktb3ksIDEsIChveTw8MSkraG9kKTsNCgkJdGhpcy5fbWtEaXYoY3grb3grd29kLCBjeS1veSwgMSwgKG95PDwxKStob2QpOw0KCX0NCn0NCg0KZnVuY3Rpb24gX21rT3ZEb3R0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkNCnsNCgl2YXIgYSA9ICgrK3dpZHRoKT4+MSwgYiA9ICgrK2hlaWdodCk+PjEsDQoJd29kID0gd2lkdGgmMSwgaG9kID0gaGVpZ2h0JjEsIGhvZHUgPSBob2ReMSwNCgljeCA9IGxlZnQrYSwgY3kgPSB0b3ArYiwNCgl4ID0gMCwgeSA9IGIsDQoJYWEyID0gKGEqYSk8PDEsIGFhNCA9IGFhMjw8MSwgYmIyID0gKGIqYik8PDEsIGJiNCA9IGJiMjw8MSwNCglzdCA9IChhYTI+PjEpKigxLShiPDwxKSkgKyBiYjIsDQoJdHQgPSAoYmIyPj4xKSAtIGFhMiooKGI8PDEpLTEpLA0KCWRydyA9IHRydWU7DQoJd2hpbGUoeSA+IDApDQoJew0KCQlpZihzdCA8IDApDQoJCXsNCgkJCXN0ICs9IGJiMiooKHg8PDEpKzMpOw0KCQkJdHQgKz0gYmI0KigrK3gpOw0KCQl9DQoJCWVsc2UgaWYodHQgPCAwKQ0KCQl7DQoJCQlzdCArPSBiYjIqKCh4PDwxKSszKSAtIGFhNCooeS0xKTsNCgkJCXR0ICs9IGJiNCooKyt4KSAtIGFhMiooKCh5LS0pPDwxKS0zKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXR0IC09IGFhMiooKHk8PDEpLTMpOw0KCQkJc3QgLT0gYWE0KigtLXkpOw0KCQl9DQoJCWlmKGRydyAmJiB5ID49IGhvZHUpIHRoaXMuX21rT3ZRZHMoY3gsIGN5LCB4LCB5LCAxLCAxLCB3b2QsIGhvZCk7DQoJCWRydyA9ICFkcnc7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBfbWtSZWN0KHgsIHksIHcsIGgpDQp7DQoJdmFyIHMgPSB0aGlzLnN0cm9rZTsNCgl0aGlzLl9ta0Rpdih4LCB5LCB3LCBzKTsNCgl0aGlzLl9ta0Rpdih4K3csIHksIHMsIGgpOw0KCXRoaXMuX21rRGl2KHgsIHkraCwgdytzLCBzKTsNCgl0aGlzLl9ta0Rpdih4LCB5K3MsIHMsIGgtcyk7DQp9DQoNCmZ1bmN0aW9uIF9ta1JlY3REb3R0KHgsIHksIHcsIGgpDQp7DQoJdGhpcy5kcmF3TGluZSh4LCB5LCB4K3csIHkpOw0KCXRoaXMuZHJhd0xpbmUoeCt3LCB5LCB4K3csIHkraCk7DQoJdGhpcy5kcmF3TGluZSh4LCB5K2gsIHgrdywgeStoKTsNCgl0aGlzLmRyYXdMaW5lKHgsIHksIHgsIHkraCk7DQp9DQoNCmZ1bmN0aW9uIGpzZ0ZvbnQoKQ0Kew0KCXRoaXMuUExBSU4gPSAnZm9udC13ZWlnaHQ6bm9ybWFsOyc7DQoJdGhpcy5CT0xEID0gJ2ZvbnQtd2VpZ2h0OmJvbGQ7JzsNCgl0aGlzLklUQUxJQyA9ICdmb250LXN0eWxlOml0YWxpYzsnOw0KCXRoaXMuSVRBTElDX0JPTEQgPSB0aGlzLklUQUxJQyArIHRoaXMuQk9MRDsNCgl0aGlzLkJPTERfSVRBTElDID0gdGhpcy5JVEFMSUNfQk9MRDsNCn0NCnZhciBGb250ID0gbmV3IGpzZ0ZvbnQoKTsNCg0KZnVuY3Rpb24ganNnU3Ryb2tlKCkNCnsNCgl0aGlzLkRPVFRFRCA9IC0xOw0KfQ0KdmFyIFN0cm9rZSA9IG5ldyBqc2dTdHJva2UoKTsNCg0KZnVuY3Rpb24ganNHcmFwaGljcyhjbnYsIHduZCkNCnsNCgl0aGlzLnNldENvbG9yID0gZnVuY3Rpb24oeCkNCgl7DQoJCXRoaXMuY29sb3IgPSB4LnRvTG93ZXJDYXNlKCk7DQoJfTsNCg0KCXRoaXMuc2V0U3Ryb2tlID0gZnVuY3Rpb24oeCkNCgl7DQoJCXRoaXMuc3Ryb2tlID0geDsNCgkJaWYoISh4KzEpKQ0KCQl7DQoJCQl0aGlzLmRyYXdMaW5lID0gX21rTGluRG90dDsNCgkJCXRoaXMuX21rT3YgPSBfbWtPdkRvdHQ7DQoJCQl0aGlzLmRyYXdSZWN0ID0gX21rUmVjdERvdHQ7DQoJCX0NCgkJZWxzZSBpZih4LTEgPiAwKQ0KCQl7DQoJCQl0aGlzLmRyYXdMaW5lID0gX21rTGluMkQ7DQoJCQl0aGlzLl9ta092ID0gX21rT3YyRDsNCgkJCXRoaXMuZHJhd1JlY3QgPSBfbWtSZWN0Ow0KCQl9DQoJCWVsc2UNCgkJew0KCQkJdGhpcy5kcmF3TGluZSA9IF9ta0xpbjsNCgkJCXRoaXMuX21rT3YgPSBfbWtPdjsNCgkJCXRoaXMuZHJhd1JlY3QgPSBfbWtSZWN0Ow0KCQl9DQoJfTsNCg0KCXRoaXMuc2V0UHJpbnRhYmxlID0gZnVuY3Rpb24oYXJnKQ0KCXsNCgkJdGhpcy5wcmludGFibGUgPSBhcmc7DQoJCWlmKGpnX2Zhc3QpDQoJCXsNCgkJCXRoaXMuX21rRGl2ID0gX21rRGl2SWU7DQoJCQl0aGlzLl9odG1ScGMgPSBhcmc/IF9odG1QcnRScGMgOiBfaHRtUnBjOw0KCQl9DQoJCWVsc2UgdGhpcy5fbWtEaXYgPSBhcmc/IF9ta0RpdlBydCA6IF9ta0RpdjsNCgl9Ow0KDQoJdGhpcy5zZXRGb250ID0gZnVuY3Rpb24oZmFtLCBzeiwgc3R5KQ0KCXsNCgkJdGhpcy5mdEZhbSA9IGZhbTsNCgkJdGhpcy5mdFN6ID0gc3o7DQoJCXRoaXMuZnRTdHkgPSBzdHkgfHwgRm9udC5QTEFJTjsNCgl9Ow0KDQoJdGhpcy5kcmF3UG9seWxpbmUgPSB0aGlzLmRyYXdQb2x5TGluZSA9IGZ1bmN0aW9uKHgsIHkpDQoJew0KCQlmb3IgKHZhciBpPXgubGVuZ3RoIC0gMTsgaTspDQoJCXstLWk7DQoJCQl0aGlzLmRyYXdMaW5lKHhbaV0sIHlbaV0sIHhbaSsxXSwgeVtpKzFdKTsNCgkJfQ0KCX07DQoNCgl0aGlzLmZpbGxSZWN0ID0gZnVuY3Rpb24oeCwgeSwgdywgaCkNCgl7DQoJCXRoaXMuX21rRGl2KHgsIHksIHcsIGgpOw0KCX07DQoNCgl0aGlzLmRyYXdQb2x5Z29uID0gZnVuY3Rpb24oeCwgeSkNCgl7DQoJCXRoaXMuZHJhd1BvbHlsaW5lKHgsIHkpOw0KCQl0aGlzLmRyYXdMaW5lKHhbeC5sZW5ndGgtMV0sIHlbeC5sZW5ndGgtMV0sIHhbMF0sIHlbMF0pOw0KCX07DQoNCgl0aGlzLmRyYXdFbGxpcHNlID0gdGhpcy5kcmF3T3ZhbCA9IGZ1bmN0aW9uKHgsIHksIHcsIGgpDQoJew0KCQl0aGlzLl9ta092KHgsIHksIHcsIGgpOw0KCX07DQoNCgl0aGlzLmZpbGxFbGxpcHNlID0gdGhpcy5maWxsT3ZhbCA9IGZ1bmN0aW9uKGxlZnQsIHRvcCwgdywgaCkNCgl7DQoJCXZhciBhID0gdz4+MSwgYiA9IGg+PjEsDQoJCXdvZCA9IHcmMSwgaG9kID0gaCYxLA0KCQljeCA9IGxlZnQrYSwgY3kgPSB0b3ArYiwNCgkJeCA9IDAsIHkgPSBiLCBveSA9IGIsDQoJCWFhMiA9IChhKmEpPDwxLCBhYTQgPSBhYTI8PDEsIGJiMiA9IChiKmIpPDwxLCBiYjQgPSBiYjI8PDEsDQoJCXN0ID0gKGFhMj4+MSkqKDEtKGI8PDEpKSArIGJiMiwNCgkJdHQgPSAoYmIyPj4xKSAtIGFhMiooKGI8PDEpLTEpLA0KCQl4bCwgZHcsIGRoOw0KCQlpZih3KSB3aGlsZSh5ID4gMCkNCgkJew0KCQkJaWYoc3QgPCAwKQ0KCQkJew0KCQkJCXN0ICs9IGJiMiooKHg8PDEpKzMpOw0KCQkJCXR0ICs9IGJiNCooKyt4KTsNCgkJCX0NCgkJCWVsc2UgaWYodHQgPCAwKQ0KCQkJew0KCQkJCXN0ICs9IGJiMiooKHg8PDEpKzMpIC0gYWE0Kih5LTEpOw0KCQkJCXhsID0gY3gteDsNCgkJCQlkdyA9ICh4PDwxKSt3b2Q7DQoJCQkJdHQgKz0gYmI0KigrK3gpIC0gYWEyKigoKHktLSk8PDEpLTMpOw0KCQkJCWRoID0gb3kteTsNCgkJCQl0aGlzLl9ta0Rpdih4bCwgY3ktb3ksIGR3LCBkaCk7DQoJCQkJdGhpcy5fbWtEaXYoeGwsIGN5K3kraG9kLCBkdywgZGgpOw0KCQkJCW95ID0geTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQl0dCAtPSBhYTIqKCh5PDwxKS0zKTsNCgkJCQlzdCAtPSBhYTQqKC0teSk7DQoJCQl9DQoJCX0NCgkJdGhpcy5fbWtEaXYoY3gtYSwgY3ktb3ksIHcsIChveTw8MSkraG9kKTsNCgl9Ow0KDQoJdGhpcy5maWxsQXJjID0gZnVuY3Rpb24oaUwsIGlULCBpVywgaUgsIGZBbmdBLCBmQW5nWikNCgl7DQoJCXZhciBhID0gaVc+PjEsIGIgPSBpSD4+MSwNCgkJaU9kZHMgPSAoaVcmMSkgfCAoKGlIJjEpIDw8IDE2KSwNCgkJY3ggPSBpTCthLCBjeSA9IGlUK2IsDQoJCXggPSAwLCB5ID0gYiwgb3ggPSB4LCBveSA9IHksDQoJCWFhMiA9IChhKmEpPDwxLCBhYTQgPSBhYTI8PDEsIGJiMiA9IChiKmIpPDwxLCBiYjQgPSBiYjI8PDEsDQoJCXN0ID0gKGFhMj4+MSkqKDEtKGI8PDEpKSArIGJiMiwNCgkJdHQgPSAoYmIyPj4xKSAtIGFhMiooKGI8PDEpLTEpLA0KCQkvLyBWYXJzIGZvciByYWRpYWwgYm91bmRhcnkgbGluZXMNCgkJeEVuZEEsIHlFbmRBLCB4RW5kWiwgeUVuZFosDQoJCWlTZWN0cyA9ICgxIDw8IChNYXRoLmZsb29yKChmQW5nQSAlPSAzNjAuMCkvMTgwLjApIDw8IDMpKQ0KCQkJCXwgKDIgPDwgKE1hdGguZmxvb3IoKGZBbmdaICU9IDM2MC4wKS8xODAuMCkgPDwgMykpDQoJCQkJfCAoKGZBbmdBID49IGZBbmdaKSA8PCAxNiksDQoJCWFCbmRBID0gbmV3IEFycmF5KGIrMSksIGFCbmRaID0gbmV3IEFycmF5KGIrMSk7DQoJCQ0KCQkvLyBTZXQgdXAgcmFkaWFsIGJvdW5kYXJ5IGxpbmVzDQoJCWZBbmdBICo9IE1hdGguUEkvMTgwLjA7DQoJCWZBbmdaICo9IE1hdGguUEkvMTgwLjA7DQoJCXhFbmRBID0gY3grTWF0aC5yb3VuZChhKk1hdGguY29zKGZBbmdBKSk7DQoJCXlFbmRBID0gY3krTWF0aC5yb3VuZCgtYipNYXRoLnNpbihmQW5nQSkpOw0KCQlfbWtMaW5WaXJ0KGFCbmRBLCBjeCwgY3ksIHhFbmRBLCB5RW5kQSk7DQoJCXhFbmRaID0gY3grTWF0aC5yb3VuZChhKk1hdGguY29zKGZBbmdaKSk7DQoJCXlFbmRaID0gY3krTWF0aC5yb3VuZCgtYipNYXRoLnNpbihmQW5nWikpOw0KCQlfbWtMaW5WaXJ0KGFCbmRaLCBjeCwgY3ksIHhFbmRaLCB5RW5kWik7DQoNCgkJd2hpbGUoeSA+IDApDQoJCXsNCgkJCWlmKHN0IDwgMCkgLy8gQWR2YW5jZSB4DQoJCQl7DQoJCQkJc3QgKz0gYmIyKigoeDw8MSkrMyk7DQoJCQkJdHQgKz0gYmI0KigrK3gpOw0KCQkJfQ0KCQkJZWxzZSBpZih0dCA8IDApIC8vIEFkdmFuY2UgeCBhbmQgeQ0KCQkJew0KCQkJCXN0ICs9IGJiMiooKHg8PDEpKzMpIC0gYWE0Kih5LTEpOw0KCQkJCW94ID0geDsNCgkJCQl0dCArPSBiYjQqKCsreCkgLSBhYTIqKCgoeS0tKTw8MSktMyk7DQoJCQkJdGhpcy5fbWtBcmNEaXYob3gsIHksIG95LCBjeCwgY3ksIGlPZGRzLCBhQm5kQSwgYUJuZFosIGlTZWN0cyk7DQoJCQkJb3kgPSB5Ow0KCQkJfQ0KCQkJZWxzZSAvLyBBZHZhbmNlIHkNCgkJCXsNCgkJCQl0dCAtPSBhYTIqKCh5PDwxKS0zKTsNCgkJCQlzdCAtPSBhYTQqKC0teSk7DQoJCQkJaWYoeSAmJiAoYUJuZEFbeV0gIT0gYUJuZEFbeS0xXSB8fCBhQm5kWlt5XSAhPSBhQm5kWlt5LTFdKSkNCgkJCQl7DQoJCQkJCXRoaXMuX21rQXJjRGl2KHgsIHksIG95LCBjeCwgY3ksIGlPZGRzLCBhQm5kQSwgYUJuZFosIGlTZWN0cyk7DQoJCQkJCW94ID0geDsNCgkJCQkJb3kgPSB5Ow0KCQkJCX0NCgkJCX0NCgkJfQ0KCQl0aGlzLl9ta0FyY0Rpdih4LCAwLCBveSwgY3gsIGN5LCBpT2RkcywgYUJuZEEsIGFCbmRaLCBpU2VjdHMpOw0KCQlpZihpT2RkcyA+PiAxNikgLy8gT2RkIGhlaWdodA0KCQl7DQoJCQlpZihpU2VjdHMgPj4gMTYpIC8vIFN0YXJ0LWFuZ2xlID4gZW5kLWFuZ2xlDQoJCQl7DQoJCQkJdmFyIHhsID0gKHlFbmRBIDw9IGN5IHx8IHlFbmRaID4gY3kpPyAoY3ggLSB4KSA6IGN4Ow0KCQkJCXRoaXMuX21rRGl2KHhsLCBjeSwgeCArIGN4IC0geGwgKyAoaU9kZHMgJiAweGZmZmYpLCAxKTsNCgkJCX0NCgkJCWVsc2UgaWYoKGlTZWN0cyAmIDB4MDEpICYmIHlFbmRaID4gY3kpDQoJCQkJdGhpcy5fbWtEaXYoY3ggLSB4LCBjeSwgeCwgMSk7DQoJCX0NCgl9Ow0KDQovKiBmaWxsUG9seWdvbiBtZXRob2QsIGltcGxlbWVudGVkIGJ5IE1hdHRoaWV1IEhhbGxlci4NClRoaXMgamF2YXNjcmlwdCBmdW5jdGlvbiBpcyBhbiBhZGFwdGF0aW9uIG9mIHRoZSBnZEltYWdlRmlsbGVkUG9seWdvbiBmb3IgV2FsdGVyIFpvcm4gbGliLg0KQyBzb3VyY2Ugb2YgR0QgMS44LjQgZm91bmQgYXQgaHR0cDovL3d3dy5ib3V0ZWxsLmNvbS9nZC8NCg0KVEhBTktTIHRvIEtpcnN0ZW4gU2NodWx6IGZvciB0aGUgcG9seWdvbiBmaXhlcyENCg0KVGhlIGludGVyc2VjdGlvbiBmaW5kaW5nIHRlY2huaXF1ZSBvZiB0aGlzIGNvZGUgY291bGQgYmUgaW1wcm92ZWQNCmJ5IHJlbWVtYmVyaW5nIHRoZSBwcmV2aW91cyBpbnRlcnRlcnNlY3Rpb24sIGFuZCBieSB1c2luZyB0aGUgc2xvcGUuDQpUaGF0IGNvdWxkIGhlbHAgdG8gYWRqdXN0IGludGVyc2VjdGlvbnMgdG8gcHJvZHVjZSBhIG5pY2UNCmludGVyaW9yX2V4dHJlbWEuICovDQoJdGhpcy5maWxsUG9seWdvbiA9IGZ1bmN0aW9uKGFycmF5X3gsIGFycmF5X3kpDQoJew0KCQl2YXIgaTsNCgkJdmFyIHk7DQoJCXZhciBtaW55LCBtYXh5Ow0KCQl2YXIgeDEsIHkxOw0KCQl2YXIgeDIsIHkyOw0KCQl2YXIgaW5kMSwgaW5kMjsNCgkJdmFyIGludHM7DQoNCgkJdmFyIG4gPSBhcnJheV94Lmxlbmd0aDsNCgkJaWYoIW4pIHJldHVybjsNCg0KCQltaW55ID0gYXJyYXlfeVswXTsNCgkJbWF4eSA9IGFycmF5X3lbMF07DQoJCWZvcihpID0gMTsgaSA8IG47IGkrKykNCgkJew0KCQkJaWYoYXJyYXlfeVtpXSA8IG1pbnkpDQoJCQkJbWlueSA9IGFycmF5X3lbaV07DQoNCgkJCWlmKGFycmF5X3lbaV0gPiBtYXh5KQ0KCQkJCW1heHkgPSBhcnJheV95W2ldOw0KCQl9DQoJCWZvcih5ID0gbWlueTsgeSA8PSBtYXh5OyB5KyspDQoJCXsNCgkJCXZhciBwb2x5SW50cyA9IG5ldyBBcnJheSgpOw0KCQkJaW50cyA9IDA7DQoJCQlmb3IoaSA9IDA7IGkgPCBuOyBpKyspDQoJCQl7DQoJCQkJaWYoIWkpDQoJCQkJew0KCQkJCQlpbmQxID0gbi0xOw0KCQkJCQlpbmQyID0gMDsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJaW5kMSA9IGktMTsNCgkJCQkJaW5kMiA9IGk7DQoJCQkJfQ0KCQkJCXkxID0gYXJyYXlfeVtpbmQxXTsNCgkJCQl5MiA9IGFycmF5X3lbaW5kMl07DQoJCQkJaWYoeTEgPCB5MikNCgkJCQl7DQoJCQkJCXgxID0gYXJyYXlfeFtpbmQxXTsNCgkJCQkJeDIgPSBhcnJheV94W2luZDJdOw0KCQkJCX0NCgkJCQllbHNlIGlmKHkxID4geTIpDQoJCQkJew0KCQkJCQl5MiA9IGFycmF5X3lbaW5kMV07DQoJCQkJCXkxID0gYXJyYXlfeVtpbmQyXTsNCgkJCQkJeDIgPSBhcnJheV94W2luZDFdOw0KCQkJCQl4MSA9IGFycmF5X3hbaW5kMl07DQoJCQkJfQ0KCQkJCWVsc2UgY29udGludWU7DQoNCgkJCQkgLy8gIE1vZGlmaWVkIDExLiAyLiAyMDA0IFdhbHRlciBab3JuDQoJCQkJaWYoKHkgPj0geTEpICYmICh5IDwgeTIpKQ0KCQkJCQlwb2x5SW50c1tpbnRzKytdID0gTWF0aC5yb3VuZCgoeS15MSkgKiAoeDIteDEpIC8gKHkyLXkxKSArIHgxKTsNCg0KCQkJCWVsc2UgaWYoKHkgPT0gbWF4eSkgJiYgKHkgPiB5MSkgJiYgKHkgPD0geTIpKQ0KCQkJCQlwb2x5SW50c1tpbnRzKytdID0gTWF0aC5yb3VuZCgoeS15MSkgKiAoeDIteDEpIC8gKHkyLXkxKSArIHgxKTsNCgkJCX0NCgkJCXBvbHlJbnRzLnNvcnQoX0NvbXBJbnQpOw0KCQkJZm9yKGkgPSAwOyBpIDwgaW50czsgaSs9MikNCgkJCQl0aGlzLl9ta0Rpdihwb2x5SW50c1tpXSwgeSwgcG9seUludHNbaSsxXS1wb2x5SW50c1tpXSsxLCAxKTsNCgkJfQ0KCX07DQoNCgl0aGlzLmRyYXdTdHJpbmcgPSBmdW5jdGlvbih0eHQsIHgsIHkpDQoJew0KCQl0aGlzLmh0bSArPSAnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7d2hpdGUtc3BhY2U6bm93cmFwOycrDQoJCQknbGVmdDonICsgeCArICdweDsnKw0KCQkJJ3RvcDonICsgeSArICdweDsnKw0KCQkJJ2ZvbnQtZmFtaWx5OicgKyAgdGhpcy5mdEZhbSArICc7JysNCgkJCSdmb250LXNpemU6JyArIHRoaXMuZnRTeiArICc7JysNCgkJCSdjb2xvcjonICsgdGhpcy5jb2xvciArICc7JyArIHRoaXMuZnRTdHkgKyAnIj4nKw0KCQkJdHh0ICsNCgkJCSc8XC9kaXY+JzsNCgl9Ow0KDQovKiBkcmF3U3RyaW5nUmVjdCgpIGFkZGVkIGJ5IFJpY2sgQmxvbW1lcnMuDQpBbGxvd3MgdG8gc3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgdGV4dCByZWN0YW5nbGUgYW5kIHRvIGFsaWduIHRoZQ0KdGV4dCBib3RoIGhvcml6b250YWxseSAoZS5nLiByaWdodCkgYW5kIHZlcnRpY2FsbHkgd2l0aGluIHRoYXQgcmVjdGFuZ2xlICovDQoJdGhpcy5kcmF3U3RyaW5nUmVjdCA9IGZ1bmN0aW9uKHR4dCwgeCwgeSwgd2lkdGgsIGhhbGlnbikNCgl7DQoJCXRoaXMuaHRtICs9ICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTtvdmVyZmxvdzpoaWRkZW47JysNCgkJCSdsZWZ0OicgKyB4ICsgJ3B4OycrDQoJCQkndG9wOicgKyB5ICsgJ3B4OycrDQoJCQknd2lkdGg6Jyt3aWR0aCArJ3B4OycrDQoJCQkndGV4dC1hbGlnbjonK2hhbGlnbisnOycrDQoJCQknZm9udC1mYW1pbHk6JyArICB0aGlzLmZ0RmFtICsgJzsnKw0KCQkJJ2ZvbnQtc2l6ZTonICsgdGhpcy5mdFN6ICsgJzsnKw0KCQkJJ2NvbG9yOicgKyB0aGlzLmNvbG9yICsgJzsnICsgdGhpcy5mdFN0eSArICciPicrDQoJCQl0eHQgKw0KCQkJJzxcL2Rpdj4nOw0KCX07DQoNCgl0aGlzLmRyYXdJbWFnZSA9IGZ1bmN0aW9uKGltZ1NyYywgeCwgeSwgdywgaCwgYSkNCgl7DQoJCXRoaXMuaHRtICs9ICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsnKw0KCQkJJ2xlZnQ6JyArIHggKyAncHg7JysNCgkJCSd0b3A6JyArIHkgKyAncHg7JysNCgkJCS8vIHcgKHdpZHRoKSBhbmQgaCAoaGVpZ2h0KSBhcmd1bWVudHMgYXJlIG5vdyBvcHRpb25hbC4NCgkJCS8vIEFkZGVkIGJ5IE1haG11dCBLZXlndWJhdGxpLCAxNC4xLjIwMDgNCgkJCSh3PyAoJ3dpZHRoOicgKyAgdyArICdweDsnKSA6ICcnKSArDQoJCQkoaD8gKCdoZWlnaHQ6JyArIGggKyAncHg7Jyk6JycpKyciPicrDQoJCQknPGltZyBzcmM9IicgKyBpbWdTcmMgKyciJysgKHcgPyAoJyB3aWR0aD0iJyArIHcgKyAnIicpOicnKSsgKGggPyAoJyBoZWlnaHQ9IicgKyBoICsgJyInKTonJykgKyAoYT8gKCcgJythKSA6ICcnKSArICc+JysNCgkJCSc8XC9kaXY+JzsNCgl9Ow0KDQoJdGhpcy5jbGVhciA9IGZ1bmN0aW9uKCkNCgl7DQoJCXRoaXMuaHRtID0gIiI7DQoJCWlmKHRoaXMuY252KSB0aGlzLmNudi5pbm5lckhUTUwgPSAiIjsNCgl9Ow0KDQoJdGhpcy5fbWtPdlFkcyA9IGZ1bmN0aW9uKGN4LCBjeSwgeCwgeSwgdywgaCwgd29kLCBob2QpDQoJew0KCQl2YXIgeGwgPSBjeCAtIHgsIHhyID0gY3ggKyB4ICsgd29kIC0gdywgeXQgPSBjeSAtIHksIHliID0gY3kgKyB5ICsgaG9kIC0gaDsNCgkJaWYoeHIgPiB4bCt3KQ0KCQl7DQoJCQl0aGlzLl9ta0Rpdih4ciwgeXQsIHcsIGgpOw0KCQkJdGhpcy5fbWtEaXYoeHIsIHliLCB3LCBoKTsNCgkJfQ0KCQllbHNlDQoJCQl3ID0geHIgLSB4bCArIHc7DQoJCXRoaXMuX21rRGl2KHhsLCB5dCwgdywgaCk7DQoJCXRoaXMuX21rRGl2KHhsLCB5YiwgdywgaCk7DQoJfTsNCgkNCgl0aGlzLl9ta0FyY0RpdiA9IGZ1bmN0aW9uKHgsIHksIG95LCBjeCwgY3ksIGlPZGRzLCBhQm5kQSwgYUJuZFosIGlTZWN0cykNCgl7DQoJCXZhciB4ckRlZiA9IGN4ICsgeCArIChpT2RkcyAmIDB4ZmZmZiksIHkyLCBoID0gb3kgLSB5LCB4bCwgeHIsIHc7DQoNCgkJaWYoIWgpIGggPSAxOw0KCQl4ID0gY3ggLSB4Ow0KDQoJCWlmKGlTZWN0cyAmIDB4ZmYwMDAwKSAvLyBTdGFydC1hbmdsZSA+IGVuZC1hbmdsZQ0KCQl7DQoJCQl5MiA9IGN5IC0geSAtIGg7DQoJCQlpZihpU2VjdHMgJiAweDAwZmYpDQoJCQl7DQoJCQkJaWYoaVNlY3RzICYgMHgwMikNCgkJCQl7DQoJCQkJCXhsID0gTWF0aC5tYXgoeCwgYUJuZFpbeV0pOw0KCQkJCQl3ID0geHJEZWYgLSB4bDsNCgkJCQkJaWYodyA+IDApIHRoaXMuX21rRGl2KHhsLCB5MiwgdywgaCk7DQoJCQkJfQ0KCQkJCWlmKGlTZWN0cyAmIDB4MDEpDQoJCQkJew0KCQkJCQl4ciA9IE1hdGgubWluKHhyRGVmLCBhQm5kQVt5XSk7DQoJCQkJCXcgPSB4ciAtIHg7DQoJCQkJCWlmKHcgPiAwKSB0aGlzLl9ta0Rpdih4LCB5MiwgdywgaCk7DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJCXRoaXMuX21rRGl2KHgsIHkyLCB4ckRlZiAtIHgsIGgpOw0KCQkJeTIgPSBjeSArIHkgKyAoaU9kZHMgPj4gMTYpOw0KCQkJaWYoaVNlY3RzICYgMHhmZjAwKQ0KCQkJew0KCQkJCWlmKGlTZWN0cyAmIDB4MDEwMCkNCgkJCQl7DQoJCQkJCXhsID0gTWF0aC5tYXgoeCwgYUJuZEFbeV0pOw0KCQkJCQl3ID0geHJEZWYgLSB4bDsNCgkJCQkJaWYodyA+IDApIHRoaXMuX21rRGl2KHhsLCB5MiwgdywgaCk7DQoJCQkJfQ0KCQkJCWlmKGlTZWN0cyAmIDB4MDIwMCkNCgkJCQl7DQoJCQkJCXhyID0gTWF0aC5taW4oeHJEZWYsIGFCbmRaW3ldKTsNCgkJCQkJdyA9IHhyIC0geDsNCgkJCQkJaWYodyA+IDApIHRoaXMuX21rRGl2KHgsIHkyLCB3LCBoKTsNCgkJCQl9DQoJCQl9DQoJCQllbHNlDQoJCQkJdGhpcy5fbWtEaXYoeCwgeTIsIHhyRGVmIC0geCwgaCk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQlpZihpU2VjdHMgJiAweDAwZmYpDQoJCQl7DQoJCQkJaWYoaVNlY3RzICYgMHgwMikNCgkJCQkJeGwgPSBNYXRoLm1heCh4LCBhQm5kWlt5XSk7DQoJCQkJZWxzZQ0KCQkJCQl4bCA9IHg7DQoJCQkJaWYoaVNlY3RzICYgMHgwMSkNCgkJCQkJeHIgPSBNYXRoLm1pbih4ckRlZiwgYUJuZEFbeV0pOw0KCQkJCWVsc2UNCgkJCQkJeHIgPSB4ckRlZjsNCgkJCQl5MiA9IGN5IC0geSAtIGg7DQoJCQkJdyA9IHhyIC0geGw7DQoJCQkJaWYodyA+IDApIHRoaXMuX21rRGl2KHhsLCB5MiwgdywgaCk7DQoJCQl9DQoJCQlpZihpU2VjdHMgJiAweGZmMDApDQoJCQl7DQoJCQkJaWYoaVNlY3RzICYgMHgwMTAwKQ0KCQkJCQl4bCA9IE1hdGgubWF4KHgsIGFCbmRBW3ldKTsNCgkJCQllbHNlDQoJCQkJCXhsID0geDsNCgkJCQlpZihpU2VjdHMgJiAweDAyMDApDQoJCQkJCXhyID0gTWF0aC5taW4oeHJEZWYsIGFCbmRaW3ldKTsNCgkJCQllbHNlDQoJCQkJCXhyID0geHJEZWY7DQoJCQkJeTIgPSBjeSArIHkgKyAoaU9kZHMgPj4gMTYpOw0KCQkJCXcgPSB4ciAtIHhsOw0KCQkJCWlmKHcgPiAwKSB0aGlzLl9ta0Rpdih4bCwgeTIsIHcsIGgpOw0KCQkJfQ0KCQl9DQoJfTsNCg0KCXRoaXMuc2V0U3Ryb2tlKDEpOw0KCXRoaXMuc2V0Rm9udCgidmVyZGFuYSxnZW5ldmEsaGVsdmV0aWNhLHNhbnMtc2VyaWYiLCAiMTJweCIsIEZvbnQuUExBSU4pOw0KCXRoaXMuY29sb3IgPSAiIzAwMDAwMCI7DQoJdGhpcy5odG0gPSAiIjsNCgl0aGlzLnduZCA9IHduZCB8fCB3aW5kb3c7DQoNCglpZighamdfb2spIF9jaGtESFRNKHRoaXMud25kKTsNCglpZihqZ19vaykNCgl7DQoJCWlmKGNudikNCgkJew0KCQkJaWYodHlwZW9mKGNudikgPT0gInN0cmluZyIpDQoJCQkJdGhpcy5jb250ID0gZG9jdW1lbnQuYWxsPyAodGhpcy53bmQuZG9jdW1lbnQuYWxsW2Nudl0gfHwgbnVsbCkNCgkJCQkJOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZD8gKHRoaXMud25kLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNudikgfHwgbnVsbCkNCgkJCQkJOiBudWxsOw0KCQkJZWxzZSBpZihjbnYgPT0gd2luZG93LmRvY3VtZW50KQ0KCQkJCXRoaXMuY29udCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07DQoJCQkvLyBJZiBjbnYgaXMgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIGEgY2FudmFzIERPTSBub2RlDQoJCQkvLyAob3B0aW9uIHN1Z2dlc3RlZCBieSBBbmRyZWFzIEx1bGVpY2gpDQoJCQllbHNlIHRoaXMuY29udCA9IGNudjsNCgkJCS8vIENyZWF0ZSBuZXcgY2FudmFzIGluc2lkZSBjb250YWluZXIgRElWLiBUaHVzIHRoZSBkcmF3aW5nIGFuZCBjbGVhcmluZw0KCQkJLy8gbWV0aG9kcyB3b24ndCBpbnRlcmZlcmUgd2l0aCB0aGUgY29udGFpbmVyJ3MgaW5uZXIgaHRtbC4NCgkJCS8vIFNvbHV0aW9uIHN1Z2dlc3RlZCBieSBWbGFkaW1pci4NCgkJCXRoaXMuY252ID0gdGhpcy53bmQuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQoJCQl0aGlzLmNudi5zdHlsZS5mb250U2l6ZT0wOw0KCQkJdGhpcy5jb250LmFwcGVuZENoaWxkKHRoaXMuY252KTsNCgkJCXRoaXMucGFpbnQgPSBqZ19kb20/IF9wbnRDbnZEb20gOiBfcG50Q252SWU7DQoJCX0NCgkJZWxzZQ0KCQkJdGhpcy5wYWludCA9IF9wbnREb2M7DQoJfQ0KCWVsc2UNCgkJdGhpcy5wYWludCA9IF9wbnROOw0KDQoJdGhpcy5zZXRQcmludGFibGUoZmFsc2UpOw0KfQ0KDQpmdW5jdGlvbiBfbWtMaW5WaXJ0KGFMaW4sIHgxLCB5MSwgeDIsIHkyKQ0Kew0KCXZhciBkeCA9IE1hdGguYWJzKHgyLXgxKSwgZHkgPSBNYXRoLmFicyh5Mi15MSksDQoJeCA9IHgxLCB5ID0geTEsDQoJeEluY3IgPSAoeDEgPiB4Mik/IC0xIDogMSwNCgl5SW5jciA9ICh5MSA+IHkyKT8gLTEgOiAxLA0KCXAsDQoJaSA9IDA7DQoJaWYoZHggPj0gZHkpDQoJew0KCQl2YXIgcHIgPSBkeTw8MSwNCgkJcHJ1ID0gcHIgLSAoZHg8PDEpOw0KCQlwID0gcHItZHg7DQoJCXdoaWxlKGR4ID4gMCkNCgkJey0tZHg7DQoJCQlpZihwID4gMCkgICAgLy8gIEluY3JlbWVudCB5DQoJCQl7DQoJCQkJYUxpbltpKytdID0geDsNCgkJCQl5ICs9IHlJbmNyOw0KCQkJCXAgKz0gcHJ1Ow0KCQkJfQ0KCQkJZWxzZSBwICs9IHByOw0KCQkJeCArPSB4SW5jcjsNCgkJfQ0KCX0NCgllbHNlDQoJew0KCQl2YXIgcHIgPSBkeDw8MSwNCgkJcHJ1ID0gcHIgLSAoZHk8PDEpOw0KCQlwID0gcHItZHk7DQoJCXdoaWxlKGR5ID4gMCkNCgkJey0tZHk7DQoJCQl5ICs9IHlJbmNyOw0KCQkJYUxpbltpKytdID0geDsNCgkJCWlmKHAgPiAwKSAgICAvLyAgSW5jcmVtZW50IHgNCgkJCXsNCgkJCQl4ICs9IHhJbmNyOw0KCQkJCXAgKz0gcHJ1Ow0KCQkJfQ0KCQkJZWxzZSBwICs9IHByOw0KCQl9DQoJfQ0KCWZvcih2YXIgbGVuID0gYUxpbi5sZW5ndGgsIGkgPSBsZW4taTsgaTspDQoJCWFMaW5bbGVuLShpLS0pXSA9IHg7DQp9Ow0KDQpmdW5jdGlvbiBfQ29tcEludCh4LCB5KQ0Kew0KCXJldHVybih4IC0geSk7DQp9DQoNCg=='></script>
	-->

<!--
	<script id="wz_tooltip" src='data:/text/plain;base64,LyogVGhpcyBub3RpY2UgbXVzdCBiZSB1bnRvdWNoZWQgYXQgYWxsIHRpbWVzLgoKd3pfdG9vbHRpcC5qcyAgICB2LiAzLjQ1CgpUaGUgbGF0ZXN0IHZlcnNpb24gaXMgYXZhaWxhYmxlIGF0Cmh0dHA6Ly93d3cud2FsdGVyem9ybi5jb20Kb3IgaHR0cDovL3d3dy5kZXZpcmEuY29tCm9yIGh0dHA6Ly93d3cud2FsdGVyem9ybi5kZQoKQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgV2FsdGVyIFpvcm4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkNyZWF0ZWQgMS4gMTIuIDIwMDIgYnkgV2FsdGVyIFpvcm4gKFdlYjogaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmNvbSApCkxhc3QgbW9kaWZpZWQ6IDE3LiAyLiAyMDA3CgpDcm9zcy1icm93c2VyIHRvb2x0aXBzIHdvcmtpbmcgZXZlbiBpbiBPcGVyYSA1IGFuZCA2LAphcyB3ZWxsIGFzIGluIE5OIDQsIEdlY2tvLUJyb3dzZXJzLCBJRTQrLCBPcGVyYSA3KyBhbmQgS29ucXVlcm9yLgpObyBvbm1vdXNlb3V0cyByZXF1aXJlZC4KQXBwZWFyYW5jZSBvZiB0b29sdGlwcyBjYW4gYmUgaW5kaXZpZHVhbGx5IGNvbmZpZ3VyZWQKdmlhIGNvbW1hbmRzIHdpdGhpbiB0aGUgb25tb3VzZW92ZXJzLgoKTElDRU5TRTogTEdQTAoKVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgKExHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgoKRm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApzZWUgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2xlc3Nlci5odG1sCiovCgoKCi8vLy8vLy8vLy8vLy8vLy8gIEdMT0JBTCBUT09QVElQIENPTkZJR1VSQVRJT04gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLwp2YXIgdHRBYm92ZSAgICAgICA9IGZhbHNlOyAgICAgICAgLy8gdG9vbHRpcCBhYm92ZSBtb3VzZXBvaW50ZXI/IEFsdGVybmF0aXZlOiB0cnVlCnZhciB0dEJnQ29sb3IgICAgID0gIiNlNmVjZmYiOwp2YXIgdHRCZ0ltZyAgICAgICA9ICIiOyAgICAgICAgICAgLy8gcGF0aCB0byBiYWNrZ3JvdW5kIGltYWdlOwp2YXIgdHRCb3JkZXJDb2xvciA9ICIjMDAzMzk5IjsKdmFyIHR0Qm9yZGVyV2lkdGggPSAxOwp2YXIgdHRDbGlja0Nsb3NlICA9IGZhbHNlOwp2YXIgdHREZWxheSAgICAgICA9IDUwMDsgICAgICAgICAgLy8gdGltZSBzcGFuIHVudGlsIHRvb2x0aXAgc2hvd3MgdXAgW21pbGxpc2Vjb25kc10KdmFyIHR0Rm9udENvbG9yICAgPSAiIzAwMDA2NiI7CnZhciB0dEZvbnRGYWNlICAgID0gImFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmIjsKdmFyIHR0Rm9udFNpemUgICAgPSAiMTFweCI7CnZhciB0dEZvbnRXZWlnaHQgID0gIm5vcm1hbCI7ICAgICAvLyBhbHRlcm5hdGl2ZTogImJvbGQiOwp2YXIgdHRMZWZ0ICAgICAgICA9IGZhbHNlOyAgICAgICAgLy8gdG9vbHRpcCBvbiB0aGUgbGVmdCBvZiB0aGUgbW91c2U/IEFsdGVybmF0aXZlOiB0cnVlCnZhciB0dE9mZnNldFggICAgID0gMTI7ICAgICAgICAgICAvLyBob3Jpem9udGFsIG9mZnNldCBvZiBsZWZ0LXRvcCBjb3JuZXIgZnJvbSBtb3VzZXBvaW50ZXIKdmFyIHR0T2Zmc2V0WSAgICAgPSAxNTsgICAgICAgICAgIC8vIHZlcnRpY2FsIG9mZnNldCAgICAgICAgICAgICAgICAgICAiCnZhciB0dE9wYWNpdHkgICAgID0gMTAwOyAgICAgICAgICAvLyBvcGFjaXR5IG9mIHRvb2x0aXAgaW4gcGVyY2VudCAobXVzdCBiZSBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTAwKQp2YXIgdHRQYWRkaW5nICAgICA9IDM7ICAgICAgICAgICAgLy8gc3BhY2luZyBiZXR3ZWVuIGJvcmRlciBhbmQgY29udGVudAp2YXIgdHRTaGFkb3dDb2xvciA9ICIiOwp2YXIgdHRTaGFkb3dXaWR0aCA9IDA7CnZhciB0dFN0YXRpYyAgICAgID0gZmFsc2U7ICAgICAgICAvLyB0b29sdGlwIE5PVCBtb3ZlIHdpdGggdGhlIG1vdXNlPyBBbHRlcm5hdGl2ZTogdHJ1ZQp2YXIgdHRTdGlja3kgICAgICA9IGZhbHNlOyAgICAgICAgLy8gZG8gTk9UIGhpZGUgdG9vbHRpcCBvbiBtb3VzZW91dD8gQWx0ZXJuYXRpdmU6IHRydWUKdmFyIHR0VGVtcCAgICAgICAgPSAwOyAgICAgICAgICAgIC8vIHRpbWUgc3BhbiBhZnRlciB3aGljaCB0aGUgdG9vbHRpcCBkaXNhcHBlYXJzOyAwICh6ZXJvKSBtZWFucyAiaW5maW5pdGUgdGltZXNwYW4iCnZhciB0dFRleHRBbGlnbiAgID0gImxlZnQiOwp2YXIgdHRUaXRsZUNvbG9yICA9ICIjZmZmZmZmIjsgICAgLy8gY29sb3Igb2YgY2FwdGlvbiB0ZXh0CnZhciB0dFdpZHRoICAgICAgID0gMzAwOwovLy8vLy8vLy8vLy8vLy8vLy8vLyAgRU5EIE9GIFRPT0xUSVAgQ09ORklHICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgoKLy8vLy8vLy8vLy8vLy8gIFRBR1MgV0lUSCBUT09MVElQIEZVTkNUSU9OQUxJVFkgIC8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIExpc3QgbWF5IGJlIGV4dGVuZGVkIG9yIHNob3J0ZW5lZDoKdmFyIHR0X3RhZ3MgPSBuZXcgQXJyYXkoImEiLCJhcmVhIiwiYiIsImJpZyIsImNhcHRpb24iLCJjZW50ZXIiLCJjb2RlIiwiZGQiLCJkaXYiLCJkbCIsImR0IiwiZW0iLCJoMSIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiLCJpIiwiaW1nIiwiaW5wdXQiLCJsaSIsIm1hcCIsIm9sIiwicCIsInByZSIsInMiLCAic2VsZWN0IiwgInNtYWxsIiwic3BhbiIsInN0cmlrZSIsInN0cm9uZyIsInN1YiIsInN1cCIsInRhYmxlIiwidGQiLCJ0ZXh0YXJlYSIsInRoIiwidHIiLCJ0dCIsInUiLCJ2YXIiLCJ1bCIsImxheWVyIik7Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCgovLy8vLy8vLy8gRE9OJ1QgQ0hBTkdFIEFOWVRISU5HIEJFTE9XIFRISVMgTElORSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8KdmFyIHR0X29iaiA9IG51bGwsICAgICAgICAgLy8gY3VycmVudCB0b29sdGlwCnR0X2lmcm0gPSBudWxsLCAgICAgICAgICAgIC8vIGlmcmFtZSB0byBjb3ZlciB3aW5kb3dlZCBjb250cm9scyBpbiBJRQp0dF9vYmpXID0gMCwgdHRfb2JqSCA9IDAsICAvLyB3aWR0aCBhbmQgaGVpZ2h0IG9mIHR0X29iagp0dF9vYmpYID0gMCwgdHRfb2JqWSA9IDAsCnR0X29mZlggPSAwLCB0dF9vZmZZID0gMCwKeGxpbSA9IDAsIHlsaW0gPSAwLCAgICAgICAgLy8gcmlnaHQgYW5kIGJvdHRvbSBib3JkZXJzIG9mIHZpc2libGUgY2xpZW50IGFyZWEKdHRfc3VwID0gZmFsc2UsICAgICAgICAgICAgLy8gdHJ1ZSBpZiBUX0FCT1ZFIGNtZAp0dF9zdGlja3kgPSBmYWxzZSwgICAgICAgICAvLyB0dF9vYmogc3RpY2t5Pwp0dF93YWl0ID0gZmFsc2UsCnR0X2FjdCA9IGZhbHNlLCAgICAgICAgICAgIC8vIHRvb2x0aXAgdmlzaWJpbGl0eSBmbGFnCnR0X3N1YiA9IGZhbHNlLCAgICAgICAgICAgIC8vIHRydWUgd2hpbGUgdG9vbHRpcCBiZWxvdyBtb3VzZXBvaW50ZXIKdHRfdSA9ICJ1bmRlZmluZWQiLAp0dF9tZiA9IG51bGwsICAgICAgICAgICAgICAvLyBzdG9yZXMgcHJldmlvdXMgbW91c2Vtb3ZlIGV2dGhhbmRsZXIKLy8gT3BlcmE6IGRpc2FibGUgaHJlZiB3aGVuIGhvdmVyaW5nIDxhPgp0dF90YWcgPSBudWxsOyAgICAgICAgICAgICAvLyBzdG9yZXMgaG92ZXJlZCBkb20gbm9kZSwgaHJlZiBhbmQgcHJldmlvdXMgc3RhdHVzYmFyIHR4dAoKCnZhciB0dF9kYiA9IChkb2N1bWVudC5jb21wYXRNb2RlICYmIGRvY3VtZW50LmNvbXBhdE1vZGUgIT0gIkJhY2tDb21wYXQiKT8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IDogZG9jdW1lbnQuYm9keT8gZG9jdW1lbnQuYm9keSA6IG51bGwsCnR0X24gPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksCnR0X252ID0gbmF2aWdhdG9yLmFwcFZlcnNpb247Ci8vIEJyb3dzZXIgZmxhZ3MKdmFyIHR0X29wID0gISEod2luZG93Lm9wZXJhICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKSwKdHRfb3A2ID0gdHRfb3AgJiYgIWRvY3VtZW50LmRlZmF1bHRWaWV3LAp0dF9vcDcgPSB0dF9vcCAmJiAhdHRfb3A2LAp0dF9pZSA9IHR0X24uaW5kZXhPZigibXNpZSIpICE9IC0xICYmIGRvY3VtZW50LmFsbCAmJiB0dF9kYiAmJiAhdHRfb3AsCnR0X2llNyA9IHR0X2llICYmIHR5cGVvZiBkb2N1bWVudC5ib2R5LnN0eWxlLm1heEhlaWdodCAhPSB0dF91LAp0dF9pZTYgPSB0dF9pZSAmJiAhdHRfaWU3ICYmIHBhcnNlRmxvYXQodHRfbnYuc3Vic3RyaW5nKHR0X252LmluZGV4T2YoIk1TSUUiKSs1KSkgPj0gNS41LAp0dF9uNCA9IChkb2N1bWVudC5sYXllcnMgJiYgdHlwZW9mIGRvY3VtZW50LmNsYXNzZXMgIT0gdHRfdSksCnR0X242ID0gKCF0dF9vcCAmJiBkb2N1bWVudC5kZWZhdWx0VmlldyAmJiB0eXBlb2YgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSAhPSB0dF91KSwKdHRfdzNjID0gIXR0X2llICYmICF0dF9uNiAmJiAhdHRfb3AgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQsCnR0X2NlID0gZG9jdW1lbnQuY2FwdHVyZUV2ZW50cyAmJiAhdHRfbjY7CgpmdW5jdGlvbiB0dF9JbnQodF94KQp7Cgl2YXIgdF95OwoJcmV0dXJuIGlzTmFOKHRfeSA9IHBhcnNlSW50KHRfeCkpPyAwIDogdF95Owp9CmZ1bmN0aW9uIHd6UmVwbGFjZSh0X3gsIHRfeSkKewoJdmFyIHRfcmV0ID0gIiIsCgl0X3N0ciA9IHRoaXMsCgl0X3hJOwoJd2hpbGUoKHRfeEkgPSB0X3N0ci5pbmRleE9mKHRfeCkpICE9IC0xKQoJewoJCXRfcmV0ICs9IHRfc3RyLnN1YnN0cmluZygwLCB0X3hJKSArIHRfeTsKCQl0X3N0ciA9IHRfc3RyLnN1YnN0cmluZyh0X3hJICsgdF94Lmxlbmd0aCk7Cgl9CglyZXR1cm4gdF9yZXQrdF9zdHI7Cn0KU3RyaW5nLnByb3RvdHlwZS53elJlcGxhY2UgPSB3elJlcGxhY2U7CmZ1bmN0aW9uIHR0X040VGFncyh0YWd0eXAsIHRfZCwgdF95KQp7Cgl0X2QgPSB0X2QgfHwgZG9jdW1lbnQ7Cgl0X3kgPSB0X3kgfHwgbmV3IEFycmF5KCk7Cgl2YXIgdF94ID0gKHRhZ3R5cD09ImEiKT8gdF9kLmxpbmtzIDogdF9kLmxheWVyczsKCWZvcih2YXIgeiA9IHRfeC5sZW5ndGg7IHotLTspIHRfeVt0X3kubGVuZ3RoXSA9IHRfeFt6XTsKCWZvcih6ID0gdF9kLmxheWVycy5sZW5ndGg7IHotLTspIHRfeSA9IHR0X040VGFncyh0YWd0eXAsIHRfZC5sYXllcnNbel0uZG9jdW1lbnQsIHRfeSk7CglyZXR1cm4gdF95Owp9CmZ1bmN0aW9uIHR0X0h0bSh0dCwgdF9pZCwgdHh0KQp7Cgl2YXIgdF9iZ2MgPSAodHlwZW9mIHR0LlRfQkdDT0xPUiAhPSB0dF91KT8gdHQuVF9CR0NPTE9SIDogdHRCZ0NvbG9yLAoJdF9iZ2ltZyAgID0gKHR5cGVvZiB0dC5UX0JHSU1HICE9IHR0X3UpPyB0dC5UX0JHSU1HIDogdHRCZ0ltZywKCXRfYmMgICAgICA9ICh0eXBlb2YgdHQuVF9CT1JERVJDT0xPUiAhPSB0dF91KT8gdHQuVF9CT1JERVJDT0xPUiA6IHR0Qm9yZGVyQ29sb3IsCgl0X2J3ICAgICAgPSAodHlwZW9mIHR0LlRfQk9SREVSV0lEVEggIT0gdHRfdSk/IHR0LlRfQk9SREVSV0lEVEggOiB0dEJvcmRlcldpZHRoLAoJdF9mZiAgICAgID0gKHR5cGVvZiB0dC5UX0ZPTlRGQUNFICE9IHR0X3UpPyB0dC5UX0ZPTlRGQUNFIDogdHRGb250RmFjZSwKCXRfZmMgICAgICA9ICh0eXBlb2YgdHQuVF9GT05UQ09MT1IgIT0gdHRfdSk/IHR0LlRfRk9OVENPTE9SIDogdHRGb250Q29sb3IsCgl0X2ZzeiAgICAgPSAodHlwZW9mIHR0LlRfRk9OVFNJWkUgIT0gdHRfdSk/IHR0LlRfRk9OVFNJWkUgOiB0dEZvbnRTaXplLAoJdF9md2dodCAgID0gKHR5cGVvZiB0dC5UX0ZPTlRXRUlHSFQgIT0gdHRfdSk/IHR0LlRfRk9OVFdFSUdIVCA6IHR0Rm9udFdlaWdodCwKCXRfb3BhICAgICA9ICh0eXBlb2YgdHQuVF9PUEFDSVRZICE9IHR0X3UpPyB0dC5UX09QQUNJVFkgOiB0dE9wYWNpdHksCgl0X3BhZGQgICAgPSAodHlwZW9mIHR0LlRfUEFERElORyAhPSB0dF91KT8gdHQuVF9QQURESU5HIDogdHRQYWRkaW5nLAoJdF9zaGMgICAgID0gKHR5cGVvZiB0dC5UX1NIQURPV0NPTE9SICE9IHR0X3UpPyB0dC5UX1NIQURPV0NPTE9SIDogKHR0U2hhZG93Q29sb3IgfHwgMCksCgl0X3NodyAgICAgPSAodHlwZW9mIHR0LlRfU0hBRE9XV0lEVEggIT0gdHRfdSk/IHR0LlRfU0hBRE9XV0lEVEggOiAodHRTaGFkb3dXaWR0aCB8fCAwKSwKCXRfYWxnbiAgICA9ICh0eXBlb2YgdHQuVF9URVhUQUxJR04gIT0gdHRfdSk/IHR0LlRfVEVYVEFMSUdOIDogdHRUZXh0QWxpZ24sCgl0X3RpdCAgICAgPSAodHlwZW9mIHR0LlRfVElUTEUgIT0gdHRfdSk/IHR0LlRfVElUTEUgOiAiIiwKCXRfdGl0YyAgICA9ICh0eXBlb2YgdHQuVF9USVRMRUNPTE9SICE9IHR0X3UpPyB0dC5UX1RJVExFQ09MT1IgOiB0dFRpdGxlQ29sb3IsCgl0X3cgICAgICAgPSAodHlwZW9mIHR0LlRfV0lEVEggIT0gdHRfdSk/IHR0LlRfV0lEVEggIDogdHRXaWR0aDsKCWlmKHRfc2hjIHx8IHRfc2h3KQoJewoJCXRfc2hjID0gdF9zaGMgfHwgIiNjMGMwYzAiOwoJCXRfc2h3ID0gdF9zaHcgfHwgNTsKCX0KCWlmKHR0X240ICYmICh0X2ZzeiA9PSAiMTBweCIgfHwgdF9mc3ogPT0gIjExcHgiKSkgdF9mc3ogPSAiMTJweCI7CgoJdmFyIHRfb3B0eCA9ICh0dF9uND8gJycgOiB0dF9uNj8gKCctbW96LW9wYWNpdHk6JysodF9vcGEvMTAwLjApKSA6IHR0X2llPyAoJ2ZpbHRlcjpBbHBoYShvcGFjaXR5PScrdF9vcGErJyknKSA6ICgnb3BhY2l0eTonKyh0X29wYS8xMDAuMCkpKSArICc7JzsKCXZhciB0X3kgPSAnPGRpdiBpZD0iJyt0X2lkKyciIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMTA7JzsKCXRfeSArPSAnbGVmdDowcHg7dG9wOjBweDt3aWR0aDonKyh0X3crdF9zaHcpKydweDt2aXNpYmlsaXR5OicrKHR0X240PyAnaGlkZScgOiAnaGlkZGVuJykrJzsnK3Rfb3B0eCsnIj4nICsKCQknPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIicrKHRfYmM/ICgnIGJnY29sb3I9IicrdF9iYysnIiBzdHlsZT0iYmFja2dyb3VuZDonK3RfYmMrJzsiJykgOiAnJykrJyB3aWR0aD0iJyt0X3crJyI+JzsKCWlmKHRfdGl0KQoJewoJCXRfeSArPSAnPHRyPjx0ZCBzdHlsZT0icGFkZGluZy1sZWZ0OjNweDtwYWRkaW5nLXJpZ2h0OjNweDsiIGFsaWduPSInK3RfYWxnbisnIj48Zm9udCBjb2xvcj0iJyt0X3RpdGMrJyIgZmFjZT0iJyt0X2ZmKyciICcgKwoJCQknc3R5bGU9ImNvbG9yOicrdF90aXRjKyc7Zm9udC1mYW1pbHk6Jyt0X2ZmKyc7Zm9udC1zaXplOicrdF9mc3orJzsiPjxiPicgKwoJCQkodHRfbjQ/ICcmbmJzcDsnIDogJycpK3RfdGl0Kyc8L2I+PC9mb250PjwvdGQ+PC90cj4nOwoJfQoJdF95ICs9ICc8dHI+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSInK3RfcGFkZCsnIiBjZWxsc3BhY2luZz0iJyt0X2J3KyciIHdpZHRoPSIxMDAlIj4nICsKCQknPHRyPjx0ZCcrKHRfYmdjPyAoJyBiZ2NvbG9yPSInK3RfYmdjKyciJykgOiAnJykrKHRfYmdpbWc/ICcgYmFja2dyb3VuZD0iJyt0X2JnaW1nKyciJyA6ICcnKSsnIHN0eWxlPSJ0ZXh0LWFsaWduOicrdF9hbGduKyc7JzsKCWlmKHR0X242KSB0X3kgKz0gJ3BhZGRpbmc6Jyt0X3BhZGQrJ3B4Oyc7Cgl0X3kgKz0gJyIgYWxpZ249IicrdF9hbGduKyciPjxmb250IGNvbG9yPSInK3RfZmMrJyIgZmFjZT0iJyt0X2ZmKyciJyArCgkJJyBzdHlsZT0iY29sb3I6Jyt0X2ZjKyc7Zm9udC1mYW1pbHk6Jyt0X2ZmKyc7Zm9udC1zaXplOicrdF9mc3orJztmb250LXdlaWdodDonK3RfZndnaHQrJzsiPic7CglpZih0X2Z3Z2h0ID09ICdib2xkJykgdF95ICs9ICc8Yj4nOwoJdF95ICs9IHR4dDsKCWlmKHRfZndnaHQgPT0gJ2JvbGQnKSB0X3kgKz0gJzwvYj4nOwoJdF95ICs9ICc8L2ZvbnQ+PC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPjwvdGFibGU+JzsKCWlmKHRfc2h3KQoJewoJCXZhciB0X3NwY3QgPSBNYXRoLnJvdW5kKHRfc2h3KjEuMyk7CgkJaWYodHRfbjQpCgkJewoJCQl0X3kgKz0gJzxsYXllciBiZ2NvbG9yPSInK3Rfc2hjKyciIGxlZnQ9IicrdF93KyciIHRvcD0iJyt0X3NwY3QrJyIgd2lkdGg9IicrdF9zaHcrJyIgaGVpZ2h0PSIwIj48L2xheWVyPicgKwoJCQkJJzxsYXllciBiZ2NvbG9yPSInK3Rfc2hjKyciIGxlZnQ9IicrdF9zcGN0KyciIGFsaWduPSJib3R0b20iIHdpZHRoPSInKyh0X3ctdF9zcGN0KSsnIiBoZWlnaHQ9IicrdF9zaHcrJyI+PC9sYXllcj4nOwoJCX0KCQllbHNlCgkJewoJCQl0X29wdHggPSB0dF9uNj8gJy1tb3otb3BhY2l0eTowLjg1OycgOiB0dF9pZT8gJ2ZpbHRlcjpBbHBoYShvcGFjaXR5PTg1KTsnIDogJ29wYWNpdHk6MC44NTsnOwoJCQl0X3kgKz0gJzxkaXYgaWQ9IicrdF9pZCsnUiIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO2JhY2tncm91bmQ6Jyt0X3NoYysnO2xlZnQ6Jyt0X3crJ3B4O3RvcDonK3Rfc3BjdCsncHg7d2lkdGg6Jyt0X3NodysncHg7aGVpZ2h0OjFweDtvdmVyZmxvdzpoaWRkZW47Jyt0X29wdHgrJyI+PC9kaXY+JyArCgkJCQknPGRpdiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7YmFja2dyb3VuZDonK3Rfc2hjKyc7bGVmdDonK3Rfc3BjdCsncHg7dG9wOjBweDt3aWR0aDonKyh0X3ctdF9zcGN0KSsncHg7aGVpZ2h0OicrdF9zaHcrJ3B4O292ZXJmbG93OmhpZGRlbjsnK3Rfb3B0eCsnIj48L2Rpdj4nOwoJCX0KCX0KCXJldHVybih0X3krJzwvZGl2PicpOwp9CmZ1bmN0aW9uIHR0X0V2WCh0X2UpCnsKCXZhciB0X3kgPSB0dF9JbnQodF9lLnBhZ2VYIHx8IHRfZS5jbGllbnRYIHx8IDApICsKCQl0dF9JbnQodHRfaWU/IHR0X2RiLnNjcm9sbExlZnQgOiAwKSArCgkJdHRfb2ZmWDsKCWlmKHRfeSA+IHhsaW0pIHRfeSA9IHhsaW07Cgl2YXIgdF9zY3IgPSB0dF9JbnQod2luZG93LnBhZ2VYT2Zmc2V0IHx8ICh0dF9kYj8gdHRfZGIuc2Nyb2xsTGVmdCA6IDApIHx8IDApOwoJaWYodF95IDwgdF9zY3IpIHRfeSA9IHRfc2NyOwoJcmV0dXJuIHRfeTsKfQpmdW5jdGlvbiB0dF9FdlkodF9lKQp7Cgl2YXIgdF95MjsKCgl2YXIgdF95ID0gdHRfSW50KHRfZS5wYWdlWSB8fCB0X2UuY2xpZW50WSB8fCAwKSArCgkJdHRfSW50KHR0X2llPyB0dF9kYi5zY3JvbGxUb3AgOiAwKTsKCWlmKHR0X3N1cCAmJiAodF95MiA9IHRfeSAtICh0dF9vYmpIICsgdHRfb2ZmWSAtIDE1KSkgPj0gdHRfSW50KHdpbmRvdy5wYWdlWU9mZnNldCB8fCAodHRfZGI/IHR0X2RiLnNjcm9sbFRvcCA6IDApIHx8IDApKQoJCXRfeSAtPSAodHRfb2JqSCArIHR0X29mZlkgLSAxNSk7CgllbHNlIGlmKHRfeSA+IHlsaW0gfHwgIXR0X3N1YiAmJiB0X3kgPiB5bGltLTI0KQoJewoJCXRfeSAtPSAodHRfb2JqSCArIDUpOwoJCXR0X3N1YiA9IGZhbHNlOwoJfQoJZWxzZQoJewoJCXRfeSArPSB0dF9vZmZZOwoJCXR0X3N1YiA9IHRydWU7Cgl9CglyZXR1cm4gdF95Owp9CmZ1bmN0aW9uIHR0X1JlbGVhc01vdigpCnsKCWlmKGRvY3VtZW50Lm9ubW91c2Vtb3ZlID09IHR0X01vdmUpCgl7CgkJaWYoIXR0X21mICYmIHR0X2NlKSBkb2N1bWVudC5yZWxlYXNlRXZlbnRzKEV2ZW50Lk1PVVNFTU9WRSk7CgkJZG9jdW1lbnQub25tb3VzZW1vdmUgPSB0dF9tZjsKCX0KfQpmdW5jdGlvbiB0dF9TaG93SWZybSh0X3gpCnsKCWlmKCF0dF9vYmogfHwgIXR0X2lmcm0pIHJldHVybjsKCWlmKHRfeCkKCXsKCQl0dF9pZnJtLnN0eWxlLndpZHRoID0gdHRfb2JqVysncHgnOwoJCXR0X2lmcm0uc3R5bGUuaGVpZ2h0ID0gdHRfb2JqSCsncHgnOwoJCXR0X2lmcm0uc3R5bGUuZGlzcGxheSA9ICJibG9jayI7Cgl9CgllbHNlIHR0X2lmcm0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKfQpmdW5jdGlvbiB0dF9HZXREaXYodF9pZCkKewoJcmV0dXJuKAoJCXR0X240PyAoZG9jdW1lbnQubGF5ZXJzW3RfaWRdIHx8IG51bGwpCgkJOiB0dF9pZT8gKGRvY3VtZW50LmFsbFt0X2lkXSB8fCBudWxsKQoJCTogKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRfaWQpIHx8IG51bGwpCgkpOwp9CmZ1bmN0aW9uIHR0X0dldERpdlcoKQp7CglyZXR1cm4gdHRfSW50KAoJCXR0X240PyB0dF9vYmouY2xpcC53aWR0aAoJCTogKHR0X29iai5vZmZzZXRXaWR0aCB8fCB0dF9vYmouc3R5bGUucGl4ZWxXaWR0aCkKCSk7Cn0KZnVuY3Rpb24gdHRfR2V0RGl2SCgpCnsKCXJldHVybiB0dF9JbnQoCgkJdHRfbjQ/IHR0X29iai5jbGlwLmhlaWdodAoJCTogKHR0X29iai5vZmZzZXRIZWlnaHQgfHwgdHRfb2JqLnN0eWxlLnBpeGVsSGVpZ2h0KQoJKTsKfQoKLy8gQ29tcGF0IHdpdGggRHJhZ0Ryb3AgTGliOiBFbnN1cmUgdGhhdCB6LWluZGV4IG9mIHRvb2x0aXAgaXMgbGlmdGVkIGJleW9uZCB0b3BsZXZlbCBkcmFnZHJvcCBlbGVtZW50CmZ1bmN0aW9uIHR0X1NldERpdlooKQp7Cgl2YXIgdF9pID0gdHRfb2JqLnN0eWxlIHx8IHR0X29iajsKCWlmKHRfaSkKCXsKCQlpZih3aW5kb3cuZGQgJiYgZGQueikKCQkJdF9pLnpJbmRleCA9IE1hdGgubWF4KGRkLnorMSwgdF9pLnpJbmRleCk7CgkJaWYodHRfaWZybSkgdHRfaWZybS5zdHlsZS56SW5kZXggPSB0X2kuekluZGV4LTE7Cgl9Cn0KZnVuY3Rpb24gdHRfU2V0RGl2UG9zKHRfeCwgdF95KQp7Cgl2YXIgdF9pID0gdHRfb2JqLnN0eWxlIHx8IHR0X29iajsKCXZhciB0X3B4ID0gKHR0X29wNiB8fCB0dF9uNCk/ICcnIDogJ3B4JzsKCXRfaS5sZWZ0ID0gKHR0X29ialggPSB0X3gpICsgdF9weDsKCXRfaS50b3AgPSAodHRfb2JqWSA9IHRfeSkgKyB0X3B4OwoJLy8gIHdpbmRvdy4uLiB0byBjaXJjdW12ZW50IHRoZSBGaXJlRm94IEFsemhlaW1lciBCdWcKCWlmKHdpbmRvdy50dF9pZnJtKQoJewoJCXR0X2lmcm0uc3R5bGUubGVmdCA9IHRfaS5sZWZ0OwoJCXR0X2lmcm0uc3R5bGUudG9wID0gdF9pLnRvcDsKCX0KfQpmdW5jdGlvbiB0dF9TaG93RGl2KHRfeCkKewoJdHRfU2hvd0lmcm0odF94KTsKCWlmKHR0X240KSB0dF9vYmoudmlzaWJpbGl0eSA9IHRfeD8gJ3Nob3cnIDogJ2hpZGUnOwoJZWxzZSB0dF9vYmouc3R5bGUudmlzaWJpbGl0eSA9IHRfeD8gJ3Zpc2libGUnIDogJ2hpZGRlbic7Cgl0dF9hY3QgPSB0X3g7Cn0KZnVuY3Rpb24gdHRfRGVBbHQodF90YWcpCnsKCWlmKHRfdGFnKQoJewoJCWlmKHRfdGFnLmFsdCkgdF90YWcuYWx0ID0gIiI7CgkJaWYodF90YWcudGl0bGUpIHRfdGFnLnRpdGxlID0gIiI7CgkJdmFyIHRfYyA9IHRfdGFnLmNoaWxkcmVuIHx8IHRfdGFnLmNoaWxkTm9kZXMgfHwgbnVsbDsKCQlpZih0X2MpCgkJewoJCQlmb3IodmFyIHRfaSA9IHRfYy5sZW5ndGg7IHRfaTsgKQoJCQkJdHRfRGVBbHQodF9jWy0tdF9pXSk7CgkJfQoJfQp9CmZ1bmN0aW9uIHR0X09wRGVIcmVmKHRfZSkKewoJdmFyIHRfdGFnOwoJaWYodF9lKQoJewoJCXRfdGFnID0gdF9lLnRhcmdldDsKCQl3aGlsZSh0X3RhZykKCQl7CgkJCWlmKHRfdGFnLmhhc0F0dHJpYnV0ZSgiaHJlZiIpKQoJCQl7CgkJCQl0dF90YWcgPSB0X3RhZwoJCQkJdHRfdGFnLnRfaHJlZiA9IHR0X3RhZy5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKCQkJCXR0X3RhZy5yZW1vdmVBdHRyaWJ1dGUoImhyZWYiKTsKCQkJCXR0X3RhZy5zdHlsZS5jdXJzb3IgPSAiaGFuZCI7CgkJCQl0dF90YWcub25tb3VzZWRvd24gPSB0dF9PcFJlSHJlZjsKCQkJCXR0X3RhZy5zdGF0cyA9IHdpbmRvdy5zdGF0dXM7CgkJCQl3aW5kb3cuc3RhdHVzID0gdHRfdGFnLnRfaHJlZjsKCQkJCWJyZWFrOwoJCQl9CgkJCXRfdGFnID0gdF90YWcucGFyZW50RWxlbWVudDsKCQl9Cgl9Cn0KZnVuY3Rpb24gdHRfT3BSZUhyZWYoKQp7CglpZih0dF90YWcpCgl7CgkJdHRfdGFnLnNldEF0dHJpYnV0ZSgiaHJlZiIsIHR0X3RhZy50X2hyZWYpOwoJCXdpbmRvdy5zdGF0dXMgPSB0dF90YWcuc3RhdHM7CgkJdHRfdGFnID0gbnVsbDsKCX0KfQpmdW5jdGlvbiB0dF9TaG93KHRfZSwgdF9pZCwgdF9zdXAsIHRfY2xrLCB0X2RlbGF5LCB0X2ZpeCwgdF9sZWZ0LCB0X29mZngsIHRfb2ZmeSwgdF9zdGF0aWMsIHRfc3RpY2t5LCB0X3RlbXApCnsKCWlmKHR0X29iaikgdHRfSGlkZSgpOwoJdHRfbWYgPSBkb2N1bWVudC5vbm1vdXNlbW92ZSB8fCBudWxsOwoJaWYod2luZG93LmRkICYmICh3aW5kb3cuRFJBRyAmJiB0dF9tZiA9PSBEUkFHIHx8IHdpbmRvdy5SRVNJWkUgJiYgdHRfbWYgPT0gUkVTSVpFKSkgcmV0dXJuOwoJdmFyIHRfc2gsIHRfaDsKCgl0dF9vYmogPSB0dF9HZXREaXYodF9pZCk7CglpZih0dF9vYmopCgl7CgkJdF9lID0gdF9lIHx8IHdpbmRvdy5ldmVudDsKCQl0dF9zdWIgPSAhKHR0X3N1cCA9IHRfc3VwKTsKCQl0dF9zdGlja3kgPSB0X3N0aWNreTsKCQl0dF9vYmpXID0gdHRfR2V0RGl2VygpOwoJCXR0X29iakggPSB0dF9HZXREaXZIKCk7CgkJdHRfb2ZmWCA9IHRfbGVmdD8gLSh0dF9vYmpXK3Rfb2ZmeCkgOiB0X29mZng7CgkJdHRfb2ZmWSA9IHRfb2ZmeTsKCQlpZih0dF9vcDcpIHR0X09wRGVIcmVmKHRfZSk7CgkJaWYodHRfbjQpCgkJewoJCQlpZih0dF9vYmouZG9jdW1lbnQubGF5ZXJzLmxlbmd0aCkKCQkJewoJCQkJdF9zaCA9IHR0X29iai5kb2N1bWVudC5sYXllcnNbMF07CgkJCQl0X3NoLmNsaXAuaGVpZ2h0ID0gdHRfb2JqSCAtIE1hdGgucm91bmQodF9zaC5jbGlwLndpZHRoKjEuMyk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJdF9zaCA9IHR0X0dldERpdih0X2lkKydSJyk7CgkJCWlmKHRfc2gpCgkJCXsKCQkJCXRfaCA9IHR0X29iakggLSB0dF9JbnQodF9zaC5zdHlsZS5waXhlbFRvcCB8fCB0X3NoLnN0eWxlLnRvcCB8fCAwKTsKCQkJCWlmKHR5cGVvZiB0X3NoLnN0eWxlLnBpeGVsSGVpZ2h0ICE9IHR0X3UpIHRfc2guc3R5bGUucGl4ZWxIZWlnaHQgPSB0X2g7CgkJCQllbHNlIHRfc2guc3R5bGUuaGVpZ2h0ID0gdF9oKydweCc7CgkJCX0KCQl9CgoJCXhsaW0gPSB0dF9JbnQoKHR0X2RiICYmIHR0X2RiLmNsaWVudFdpZHRoKT8gdHRfZGIuY2xpZW50V2lkdGggOiB3aW5kb3cuaW5uZXJXaWR0aCkgKwoJCQl0dF9JbnQod2luZG93LnBhZ2VYT2Zmc2V0IHx8ICh0dF9kYj8gdHRfZGIuc2Nyb2xsTGVmdCA6IDApIHx8IDApIC0KCQkJdHRfb2JqVyAtCgkJCSh0dF9uND8gMjEgOiAwKTsKCQl5bGltID0gdHRfSW50KHdpbmRvdy5pbm5lckhlaWdodCB8fCB0dF9kYi5jbGllbnRIZWlnaHQpICsKCQkJdHRfSW50KHdpbmRvdy5wYWdlWU9mZnNldCB8fCAodHRfZGI/IHR0X2RiLnNjcm9sbFRvcCA6IDApIHx8IDApIC0KCQkJdHRfb2JqSCAtIHR0X29mZlk7CgoJCXR0X1NldERpdlooKTsKCQlpZih0X2ZpeCkgdHRfU2V0RGl2UG9zKHR0X0ludCgodF9maXggPSB0X2ZpeC5zcGxpdCgnLCcpKVswXSksIHR0X0ludCh0X2ZpeFsxXSkpOwoJCWVsc2UgdHRfU2V0RGl2UG9zKHR0X0V2WCh0X2UpLCB0dF9FdlkodF9lKSk7CgoJCXZhciB0X3R4dCA9ICd0dF9TaG93RGl2KFwndHJ1ZVwnKTsnOwoJCWlmKHRfc3RpY2t5KSB0X3R4dCArPSAneycrCgkJCQkndHRfUmVsZWFzTW92KCk7JysKCQkJCSh0X2Nsaz8gKCd3aW5kb3cudHRfdXBGdW5jID0gZG9jdW1lbnQub25tb3VzZXVwIHx8IG51bGw7JysKCQkJCSdpZih0dF9jZSkgZG9jdW1lbnQuY2FwdHVyZUV2ZW50cyhFdmVudC5NT1VTRVVQKTsnKwoJCQkJJ2RvY3VtZW50Lm9ubW91c2V1cCA9IG5ldyBGdW5jdGlvbigid2luZG93LnNldFRpbWVvdXQoXCd0dF9IaWRlKCk7XCcsIDEwKTsiKTsnKSA6ICcnKSsKCQkJJ30nOwoJCWVsc2UgaWYodF9zdGF0aWMpIHRfdHh0ICs9ICd0dF9SZWxlYXNNb3YoKTsnOwoJCWlmKHRfdGVtcCA+IDApIHRfdHh0ICs9ICd3aW5kb3cudHRfcnRtID0gd2luZG93LnNldFRpbWVvdXQoXCd0dF9zdGlja3kgPSBmYWxzZTsgdHRfSGlkZSgpO1wnLCcrdF90ZW1wKycpOyc7CgkJd2luZG93LnR0X3JkbCA9IHdpbmRvdy5zZXRUaW1lb3V0KHRfdHh0LCB0X2RlbGF5KTsKCgkJaWYoIXRfZml4KQoJCXsKCQkJaWYodHRfY2UpIGRvY3VtZW50LmNhcHR1cmVFdmVudHMoRXZlbnQuTU9VU0VNT1ZFKTsKCQkJZG9jdW1lbnQub25tb3VzZW1vdmUgPSB0dF9Nb3ZlOwoJCX0KCX0KfQp2YXIgdHRfYXJlYSA9IGZhbHNlOwpmdW5jdGlvbiB0dF9Nb3ZlKHRfZXYpCnsKCWlmKCF0dF9vYmopIHJldHVybjsKCWlmKHR0X242IHx8IHR0X3czYykKCXsKCQlpZih0dF93YWl0KSByZXR1cm47CgkJdHRfd2FpdCA9IHRydWU7CgkJc2V0VGltZW91dCgndHRfd2FpdCA9IGZhbHNlOycsIDUpOwoJfQoJdmFyIHRfZSA9IHRfZXYgfHwgd2luZG93LmV2ZW50OwoJdHRfU2V0RGl2UG9zKHR0X0V2WCh0X2UpLCB0dF9FdlkodF9lKSk7CglpZih3aW5kb3cudHRfb3A2KQoJewoJCWlmKHR0X2FyZWEgJiYgdF9lLnRhcmdldC50YWdOYW1lICE9ICdBUkVBJykgdHRfSGlkZSgpOwoJCWVsc2UgaWYodF9lLnRhcmdldC50YWdOYW1lID09ICdBUkVBJykgdHRfYXJlYSA9IHRydWU7Cgl9Cn0KZnVuY3Rpb24gdHRfSGlkZSgpCnsKCWlmKHdpbmRvdy50dF9vYmopCgl7CgkJaWYod2luZG93LnR0X3JkbCkgd2luZG93LmNsZWFyVGltZW91dCh0dF9yZGwpOwoJCWlmKCF0dF9zdGlja3kgfHwgIXR0X2FjdCkKCQl7CgkJCWlmKHdpbmRvdy50dF9ydG0pIHdpbmRvdy5jbGVhclRpbWVvdXQodHRfcnRtKTsKCQkJdHRfU2hvd0RpdihmYWxzZSk7CgkJCXR0X1NldERpdlBvcygtdHRfb2JqVywgLXR0X29iakgpOwoJCQl0dF9vYmogPSBudWxsOwoJCQlpZih0eXBlb2Ygd2luZG93LnR0X3VwRnVuYyAhPSB0dF91KSBkb2N1bWVudC5vbm1vdXNldXAgPSB3aW5kb3cudHRfdXBGdW5jOwoJCX0KCQl0dF9zdGlja3kgPSBmYWxzZTsKCQlpZih0dF9vcDYgJiYgdHRfYXJlYSkgdHRfYXJlYSA9IGZhbHNlOwoJCXR0X1JlbGVhc01vdigpOwoJCWlmKHR0X29wNykgdHRfT3BSZUhyZWYoKTsKCX0KfQpmdW5jdGlvbiB0dF9Jbml0KCkKewoJaWYoISh0dF9vcCB8fCB0dF9uNCB8fCB0dF9uNiB8fCB0dF9pZSB8fCB0dF93M2MpKSByZXR1cm47CgoJdmFyIGh0bSA9IHR0X240PyAnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7Ij48L2Rpdj4nIDogJycsCgl0YWdzLAoJdF90aiwKCW92ZXIsCgl0X2IsCgllc2MgPSAncmV0dXJuIGVzY2FwZSgnOwoJZm9yKHZhciBpID0gdHRfdGFncy5sZW5ndGg7IGk7KQoJey0taTsKCQl0YWdzID0gdHRfaWU/IChkb2N1bWVudC5hbGwudGFncyh0dF90YWdzW2ldKSB8fCAxKQoJCQk6IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lPyAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHRfdGFnc1tpXSkgfHwgMSkKCQkJOiAoIXR0X240ICYmIHR0X3RhZ3NbaV09PSJhIik/IGRvY3VtZW50LmxpbmtzCgkJCTogMTsKCQlpZih0dF9uNCAmJiAodHRfdGFnc1tpXSA9PSAiYSIgfHwgdHRfdGFnc1tpXSA9PSAibGF5ZXIiKSkgdGFncyA9IHR0X040VGFncyh0dF90YWdzW2ldKTsKCQlmb3IodmFyIGogPSB0YWdzLmxlbmd0aDsgajspCgkJey0tajsKCQkJaWYodHlwZW9mICh0X3RqID0gdGFnc1tqXSkub25tb3VzZW92ZXIgPT0gImZ1bmN0aW9uIiAmJiB0X3RqLm9ubW91c2VvdmVyLnRvU3RyaW5nKCkuaW5kZXhPZihlc2MpICE9IC0xICYmICF0dF9uNiB8fCB0dF9uNiAmJiAob3ZlciA9IHRfdGouZ2V0QXR0cmlidXRlKCJvbm1vdXNlb3ZlciIpKSAmJiBvdmVyLmluZGV4T2YoZXNjKSAhPSAtMSkKCQkJewoJCQkJaWYob3ZlcikgdF90ai5vbm1vdXNlb3ZlciA9IG5ldyBGdW5jdGlvbihvdmVyKTsKCQkJCXZhciB0eHQgPSB1bmVzY2FwZSh0X3RqLm9ubW91c2VvdmVyKCkpOwoJCQkJaHRtICs9IHR0X0h0bSgKCQkJCQl0X3RqLAoJCQkJCSJ0T29MdElwIitpKyIiK2osCgkJCQkJdHh0Lnd6UmVwbGFjZSgiJiAiLCImIikKCQkJCSk7CgkJCQkvLyB3aW5kb3cuIHRvIGNpcmN1bXZlbnQgdGhlIEZGIEFsemhlaW1lciBCdWcKCQkJCXRfdGoub25tb3VzZW92ZXIgPSBuZXcgRnVuY3Rpb24oJ2UnLAoJCQkJCSdpZih3aW5kb3cudHRfU2hvdyAmJiB0dF9TaG93KSB0dF9TaG93KGUsJysKCQkJCQknInRPb0x0SXAnICtpKycnK2orICciLCcrCgkJCQkJKCh0eXBlb2YgdF90ai5UX0FCT1ZFICE9IHR0X3UpPyB0X3RqLlRfQUJPVkUgOiB0dEFib3ZlKSsnLCcrCgkJCQkJKCh0eXBlb2YgdF90ai5UX0NMSUNLQ0xPU0UgIT0gdHRfdSk/IHRfdGouVF9DTElDS0NMT1NFIDogdHRDbGlja0Nsb3NlKSsnLCcrCgkJCQkJKCh0eXBlb2YgdF90ai5UX0RFTEFZICE9IHR0X3UpPyB0X3RqLlRfREVMQVkgOiB0dERlbGF5KSsnLCcrCgkJCQkJKCh0eXBlb2YgdF90ai5UX0ZJWCAhPSB0dF91KT8gJyInK3RfdGouVF9GSVgrJyInIDogJyIiJykrJywnKwoJCQkJCSgodHlwZW9mIHRfdGouVF9MRUZUICE9IHR0X3UpPyB0X3RqLlRfTEVGVCA6IHR0TGVmdCkrJywnKwoJCQkJCSgodHlwZW9mIHRfdGouVF9PRkZTRVRYICE9IHR0X3UpPyB0X3RqLlRfT0ZGU0VUWCA6IHR0T2Zmc2V0WCkrJywnKwoJCQkJCSgodHlwZW9mIHRfdGouVF9PRkZTRVRZICE9IHR0X3UpPyB0X3RqLlRfT0ZGU0VUWSA6IHR0T2Zmc2V0WSkrJywnKwoJCQkJCSgodHlwZW9mIHRfdGouVF9TVEFUSUMgIT0gdHRfdSk/IHRfdGouVF9TVEFUSUMgOiB0dFN0YXRpYykrJywnKwoJCQkJCSgodHlwZW9mIHRfdGouVF9TVElDS1kgIT0gdHRfdSk/IHRfdGouVF9TVElDS1kgOiB0dFN0aWNreSkrJywnKwoJCQkJCSgodHlwZW9mIHRfdGouVF9URU1QICE9IHR0X3UpPyB0X3RqLlRfVEVNUCA6IHR0VGVtcCkrCgkJCQkJJyk7JwoJCQkJKTsKCQkJCXRfdGoub25tb3VzZW91dCA9IHR0X0hpZGU7CgkJCQl0dF9EZUFsdCh0X3RqKTsKCQkJfQoJCX0KCX0KCWlmKHR0X2llNikgaHRtICs9ICc8aWZyYW1lIGlkPSJUVGlFaUZyTSIgc3JjPSJqYXZhc2NyaXB0OmZhbHNlIiBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0iMCIgc3R5bGU9ImZpbHRlcjpBbHBoYShvcGFjaXR5PTApO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowcHg7bGVmdDowcHg7ZGlzcGxheTpub25lOyI+PC9pZnJhbWU+JzsKCXRfYiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lPyBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdIDogdHRfZGI7CglpZih0X2IgJiYgdF9iLmluc2VydEFkamFjZW50SFRNTCkgdF9iLmluc2VydEFkamFjZW50SFRNTCgiQWZ0ZXJCZWdpbiIsIGh0bSk7CgllbHNlIGlmKHRfYiAmJiB0eXBlb2YgdF9iLmlubmVySFRNTCAhPSB0dF91ICYmIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgdF9iLmFwcGVuZENoaWxkKQoJewoJCXZhciB0X2VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgkJdF9iLmFwcGVuZENoaWxkKHRfZWwpOwoJCXRfZWwuaW5uZXJIVE1MID0gaHRtOwoJfQoJZWxzZQoJCWRvY3VtZW50LndyaXRlKGh0bSk7CglpZihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCkgdHRfaWZybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJUVGlFaUZyTSIpOwp9CnR0X0luaXQoKTsK'></script>
	-->


	<hr color=black>
	<hr color=white>
	<div id=div_banner>
		<h1>div_banner</h1>
	<h1>
		<a href=./ target=_blank><img id=img_ko src=/imgs/btn/ko.png height=20 border=0></a>




		<a href="https://www.bluehost.com/?utm_source=%28direct%29&utm_medium=affiliate&utm_campaign=affiliate-link_konet_notype&affiliate=konet" class="ko_thumbnail" target=_blank>
		<img id=img_bluehost title="          bluehost.com" src=/imgs/bh/bluehost_grid00.jpg height=20 alt=bluehost.com border=0>
<!--
		<img id=img_bluehost title="          bluehost.com" src=/imgs/bh/bh_anim.gif height=20 alt=bluehost.com border=0>
		<img id=img_bluehost title="          bluehost.com" src=/imgs/bh/bh_anim.gif height=20 alt=bluehost.com border=0>
	-->




		<a href=/k9.html target=_blank><img id=img_k9 src=/imgs/keys/keys00_hole.png height=20 border=0></a>
		<a href=/leds/leds.php target=_blank><img id=img_leds_php src=/imgs/btn/tn_leds.png height=20 border=0></a>
		d r a f t 
		&nbsp &nbsp &nbsp &nbsp
		P R E V I E W
		<img src=/imgs/btn/kop12.png height=20>
		K O
<!--		L A W -->
<!--		M E D -->
<!--		B Y R D B E L L V J K -->
<!--		K A -->
<!--		K O 1 -->
<!--		K O 2 -->
<!--		K O N E T -->
<!--		I P E R M S -->
<!--		J T F D C -->
<!--		J T F D C R -->
<!--		J T F I N C -->
<!--		J A K 1 -->
<!--		J A K 2 -->
<!--		J A K 3 -->

		<img src=/imgs/btn/kop34.png height=20>
		&nbsp &nbsp &nbsp &nbsp
		<font style="font-size:18">20230212_1815</font>
			</h1>
		</div id=div_banner_end>
		<hr color=white>
		<hr color=black>

<!--

/*
Link Extractor Script- 
(c) Dynamic Drive (www.dynamicdrive.com)
For full source code, installation instructions,
100's more DHTML scripts, and Terms Of
Use, visit dynamicdrive.com
*/
<script id=script_dynamicdrive language="JavaScript1.2">
	function extractlinks(){
		if (document.all||document.getElementById){
			if (document.all)
				var links=document.all.tags("A")
			else if (document.getElementById)
				var links=document.getElementsByTagName("A")
			var total=links.length
			var win2=window.open("","","menubar,scrollbars,status")
			win2.document.write("<h2>Total Links="+total+"</h2><br>")
			for (i=0;i<total;i++){
				win2.document.write('<a href="'+links[i]+'">'+links[i].innerHTML+'</a><br>')
				}
			win2.document.close() 
			}
		}
//-->
		</script id=script_dynamicdrive_end>



<!-- <button onClick="extractlinks()">Extract Links</button>
 -->
<br>
<hr color=black>
<hr color=white>
	<img id=img_leds title="          leds" src=/imgs/btn/koeye.png onclick="toggle('div_leds',''); return false;" height=15 border=0>leds
	<br>
	<hr color=white>
	<div id=div_leds>
		<h1>div_leds</h1>
		<img id=img_leds_go title="          leds_go" src=/imgs/btn/kobrd.png onclick="leds('click'); return false;" height=15 border=0>leds_go


		<div id=scriptmenu hidden>
			<p><strong><a href="../dynamicindex1/index.html" onMouseover="changetext(content[0])">Menus and Navigation Systems</a><br> 
			<a href="../dynamicindex3/index.html" onMouseover="changetext(content[1])">Special document effects</a><br>
			<a href="../dynamicindex2/index.html" onMouseover="changetext(content[2])">Scrollers</a><br>
			<a href="../dynamicindex4/index.html" onMouseover="changetext(content[3])">Image effects</a><br>
			<a href="index.html" onMouseover="changetext(content[4])">Links and buttons</a><br>
			<a href="../dynamicindex6/index.html" onMouseover="changetext(content[5])">Dynamic Clocks and dates</a><br>
			<a href="../dynamicindex10/index.html" onMouseover="changetext(content[6])">Text animations</a><br>
			<a href="../dynamicindex8/index.html" onMouseover="changetext(content[7])">Browser Window</a><br>
			<a href="../dynamicindex11/index.html" onMouseover="changetext(content[8])">Other</a></strong></p>
			</div id=scriptmenu_end>


		<br>
		<hr color=black>
		<div id=div_leds_out>
			<a href="index.html?leds=led0 target=_blank
				onclick="window.open('/fb/jtfdc/pages/1.jpg'); return false;"
				onMouseout="tipout(); return false;"
				onMouseover="changetext(content[0])">
				<img id=img_led1 title="          led1" src=/imgs/leds/hal/hal000.gif height=10 border=0>
				</a>
			<a href="index.html?leds=led1 target=_blank onclick="window.open('/fb/jtfdc/pages/1.jpg'); return false;" onMouseout="tipout(); return false;" onMouseover="changetext(content[1])"> <img id=img_led1 title="          led1" src=/imgs/leds/hal/hal000.gif height=10 border=0> </a>
			<a href="index.html?leds=led2 target=_blank
				onclick="window.open('/fb/jtfdc/pages/2.jpg'); return false;"
				onMouseout="tipout(); return false;"
				onMouseover="changetext(content[2])">
				<img id=img_led2 title="          led2" src=/imgs/leds/hal/hal000.gif height=10 border=0>
				</a>
			<a href="index.html?leds=led3 target=_blank
				onclick="window.open('/fb/jtfdc/pages/3.jpg'); return false;"
				onMouseout="tipout(); return false;"
				onMouseover="changetext(content[3])">
				<img id=img_led3 title="          led3" src=/imgs/leds/hal/hal000.gif height=10 border=0>
				</a>
			<a href="index.html?leds=led4 target=_blank
				onclick="window.open('/fb/jtfdc/pages/4.jpg'); return false;"
				onMouseout="tipout(); return false;"
				onMouseover="changetext(content[4])">
				<img id=img_led4 title="          led4" src=/imgs/leds/hal/hal000.gif height=10 border=0>
				</a>
			<a href="index.html?leds=led5 target=_blank
				onclick="window.open('/fb/jtfdc/pages/5.jpg'); return false;"
				onMouseout="tipout(); return false;"
				onMouseover="changetext(content[5])">
				<img id=img_led5 title="          led5" src=/imgs/leds/hal/hal000.gif height=10 border=0>
				</a>
			<a href="index.html?leds=led6 target=_blank
				onclick="window.open('/fb/jtfdc/pages/6.jpg'); return false;"
				onMouseout="tipout(); return false;"
				onMouseover="changetext(content[6])">
				<img id=img_led6 title="          led6" src=/imgs/leds/hal/hal000.gif height=10 border=0>
				</a>
			<a href="index.html?leds=led7 target=_blank
				onclick="window.open('/fb/jtfdc/pages/7.jpg'); return false;"
				onMouseout="tipout(); return false;"
				onMouseover="changetext(content[7])">
				<img id=img_led7 title="          led7" src=/imgs/leds/hal/hal000.gif height=10 border=0>
				</a>
			<a href="index.html?leds=led8 target=_blank
				onclick="window.open('/fb/jtfdc/pages/8.jpg'); return false;"
				onMouseout="tipout(); return false;"
				onMouseover="changetext(content[8])">
				<img id=img_led8 title="          led8" src=/imgs/leds/hal/hal000.gif height=10 border=0>
				</a>
			<a href="index.html?leds=led9 target=_blank
				onclick="window.open('/fb/jtfdc/pages/9.jpg'); return false;"
				onMouseout="tipout(); return false;"
				onMouseover="changetext(content[9])">
				<img id=img_led9 title="          led9" src=/imgs/leds/hal/hal000.gif height=10 border=0>
				</a>
			<a href="index.html?leds=led10 target=_blank
				onclick="window.open('/fb/jtfdc/pages/10.jpg'); return false;"
				onMouseout="tipout(); return false;"
				onMouseover="changetext(content[10])">
				<img id=img_led10 title="          led10" src=/imgs/leds/hal/hal000.gif height=10 border=0>
				</a>
			<a href="index.html?leds=led11 target=_blank
				onclick="window.open('/fb/jtfdc/pages/11.jpg'); return false;"
				onMouseout="tipout(); return false;"
				onMouseover="changetext(content[11])">
				<img id=img_led11 title="          led11" src=/imgs/leds/hal/hal000.gif height=10 border=0>
				</a>
			<a href="index.html?leds=led12 target=_blank
				onclick="window.open('/fb/jtfdc/pages/12.jpg'); return false;"
				onMouseout="tipout(); return false;"
				onMouseover="changetext(content[12])">
				<img id=img_led12 title="          led12" src=/imgs/leds/hal/hal000.gif height=10 border=0>
				</a>

<img id=img_led_1 title="          led_1" 
	src=/imgs/leds/hal/hal000.gif  
	onclick="window.open('/animalcontrol/animal_control_booklet/imgs/preview.jpg'); return false;"  
	onMouseover="changetext(content[1])" 
	height=10 border=0> 
<img id=img_led_2 title="          led_2" 
	src=/imgs/leds/hal/hal000.gif  
	onclick="window.open(''); return false;"  
	onMouseover="changetext(content[2])" 
	height=10 border=0>
<img id=img_led_3 title="          led_3" 
	src=/imgs/leds/hal/hal000.gif  
	onclick="window.open(''); return false;"  
	onMouseover="changetext(content[3])" 
	height=10 border=0>
<img id=img_led_4 title="          led_4" 
	src=/imgs/leds/hal/hal000.gif  
	onclick="window.open(''); return false;"  
	onMouseover="changetext(content[4])" 
	height=10 border=0>
<img id=img_led_5 title="          led_5" 
	src=/imgs/leds/hal/hal000.gif  
	onclick="window.open(''); return false;"  
	onMouseover="changetext(content[5])" 
	height=10 border=0>
<img id=img_led_6 title="          led_6" 
	src=/imgs/leds/hal/hal000.gif  
	onclick="window.open('/fb/jtfdcr/pages/1.jpg'); return false;"  
	onMouseover="changetext(content[6])" 
	height=10 border=0>


			</div id=div_leds_out_end>

		<div id=div_descriptions></div id=div_descriptions_end>
		<hr color=black>
		<hr color=black>
		</div id=div_leds_end>


	<script id=script_leds>
//		content=new Array();
		function leds(args) {
			var content=new Array();
			htmout=""; j=0; k=0;
//			alert( "BUGS_17871 leds args="+args );
			if( document.getElementById('pre_lists_items')) {
				pre_items=document.getElementById('pre_lists_items').innerHTML.split("\n");
//				alert( "BUGS_17811 pre_items.length="+pre_items.length);
//				pre_item=document.getElementById('pre_lists_items').innerHTML;
				}
//			alert( "BUGS_17872 leds items.length="+items.length );
//			alert( "BUGS_17872 leds items="+items );
items=`
/fb/jtfdcr/pages/1.jpg
/byrdbellvjk/imgs/jtfdcr_police/jtfdc_20190516_0830_22_terror_what_are_you_doing_here.mp3
/byrdbellvjk/imgs/jtfdcr_police/jtfdc_20190516_0830.mp3
/byrdbellvjk/imgs/jtfdcr_police/jtfdc_20190516_0820_policecall.mp3
/byrdbellvjk/mp4/jtfdc_byrd_20180606_1648_threats_bucket_theft.mp4
/imgs/btn/koeye_handhither.gif|koeye_handhither
/byrdbellvjk/imgs/01.jpg|desc_01
/byrdbellvjk/imgs/100.jpg|desc_100
/byrdbellvjk/imgs/100_jtfdcr_2013_byrd_threat.jpg|desc_100_jtfdcr_2013_byrd_threat
/byrdbellvjk/imgs/100_jtfdcr_byrd_seigrist_2dogs_trespas.jpg|desc_100_jtfdcr_byrd_seigrist_2dogs_trespas
/byrdbellvjk/imgs/100_jtfdcr_byrd_seigrist_2dogs_trespass2.jpg|desc_100_jtfdcr_byrd_seigrist_2dogs_trespass2
/byrdbellvjk/imgs/100_jtfdcr_byrd_seigrist_3dogs_after_heartrequest.jpg|desc_100_jtfdcr_byrd_seigrist_3dogs_after_heartrequest
/byrdbellvjk/imgs/100_jtfdcr_byrds_theft_sawhorse.jpg|desc_100_jtfdcr_byrds_theft_sawhorse
/byrdbellvjk/imgs/100_zn_16.jpg|desc_100_zn_16
/byrdbellvjk/imgs/100_zn_21.jpg|desc_100_zn_21
/byrdbellvjk/imgs/113.jpg|desc_113
/byrdbellvjk/imgs/115.jpg|desc_115
/byrdbellvjk/imgs/116.jpg|desc_116
/byrdbellvjk/imgs/124.jpg|desc_124
/byrdbellvjk/imgs/170.jpg|desc_170
/byrdbellvjk/imgs/171.jpg|desc_171
/byrdbellvjk/imgs/202.jpg|desc_202
/byrdbellvjk/imgs/203.jpg|desc_203
/byrdbellvjk/imgs/204.jpg|desc_204
/byrdbellvjk/imgs/205.jpg|desc_205
/byrdbellvjk/imgs/206.jpg|desc_206
/byrdbellvjk/imgs/207.jpg|desc_207
/byrdbellvjk/imgs/208.jpg|desc_208
/byrdbellvjk/imgs/209.jpg|desc_209
/byrdbellvjk/imgs/210.jpg|desc_210
/byrdbellvjk/imgs/211.jpg|desc_211
/byrdbellvjk/imgs/212.jpg|desc_212
/byrdbellvjk/imgs/22.jpg|desc_22
/byrdbellvjk/imgs/222.jpg|desc_222
/byrdbellvjk/imgs/229.jpg|desc_229
/byrdbellvjk/imgs/232.jpg|desc_232
/byrdbellvjk/imgs/233.jpg|desc_233
/byrdbellvjk/imgs/26.jpg|desc_26
/byrdbellvjk/imgs/27.jpg|desc_27
/byrdbellvjk/imgs/28.jpg|desc_28
/byrdbellvjk/imgs/29.jpg|desc_29
/byrdbellvjk/imgs/30.jpg|desc_30
/byrdbellvjk/imgs/31.jpg|desc_31
/byrdbellvjk/imgs/32.jpg|desc_32
/byrdbellvjk/imgs/33.jpg|desc_33
/byrdbellvjk/imgs/34.jpg|desc_34
/byrdbellvjk/imgs/36.jpg|desc_36
/byrdbellvjk/imgs/42.jpg|desc_42
/byrdbellvjk/imgs/43.jpg|desc_43
/byrdbellvjk/imgs/44.jpg|desc_44
/byrdbellvjk/imgs/46.jpg|desc_46
/byrdbellvjk/imgs/550_head_jtfdcr_police_neiborhood.jpg|desc_550_head_jtfdcr_police_neiborhood
/byrdbellvjk/imgs/63.jpg|desc_63
/byrdbellvjk/imgs/66.jpg|desc_66
/byrdbellvjk/imgs/71.jpg|desc_71
/byrdbellvjk/imgs/900_136.jpg|desc_900_136
/byrdbellvjk/imgs/900_68.jpg|desc_900_68
/byrdbellvjk/imgs/900_byrdbell_20200916.jpg|desc_900_byrdbell_20200916
/byrdbellvjk/imgs/900_byrdbell_20200916_1.jpg|desc_900_byrdbell_20200916_1
/byrdbellvjk/imgs/900_emh_20160911_056.jpg|desc_900_emh_20160911_056
/byrdbellvjk/imgs/900_emh_20160911_058.jpg|desc_900_emh_20160911_058
/byrdbellvjk/imgs/900_emh_20160911_059.jpg|desc_900_emh_20160911_059
/byrdbellvjk/imgs/900_IMG_0574.jpg|desc_900_IMG_0574
/byrdbellvjk/imgs/900_IMG_0577.jpg|desc_900_IMG_0577
/byrdbellvjk/imgs/900_jtfdc_private_court_since_1979_viewin.jpg|desc_900_jtfdc_private_court_since_1979_viewin
/byrdbellvjk/imgs/900_jtfinc.jpg|desc_900_jtfinc
/byrdbellvjk/imgs/900_snap_20170123_187559_jtfdc_kids_cycle_laps.jpg|desc_900_snap_20170123_187559_jtfdc_kids_cycle_laps
/byrdbellvjk/imgs/900_snap_20170123_187576_jtf32_preservation_police_yellowsticker_frenzy.jpg|desc_900_snap_20170123_187576_jtf32_preservation_police_yellowsticker_frenzy
/byrdbellvjk/imgs/900_snap_20170123_197616_law_donovan_joann1.jpg|desc_900_snap_20170123_197616_law_donovan_joann1
/byrdbellvjk/imgs/900_stlcounty_kassil_bench_probaton_20170918-1818_001.jpg|desc_900_stlcounty_kassil_bench_probaton_20170918-1818_001
/byrdbellvjk/imgs/900_topos.jpg|desc_900_topos
/byrdbellvjk/imgs/900_topos_20160505_031.jpg|desc_900_topos_20160505_031
/byrdbellvjk/imgs/900_zn_4.jpg|desc_900_zn_4
/byrdbellvjk/imgs/jtfdc_sawhorse_2020.jpg|desc_jtfdc_sawhorse_2020
/byrdbellvjk/imgs/snap_202209156950.png|desc_snap_202209156950
/byrdbellvjk/imgs/snap_202209156951.png|desc_snap_202209156951
/byrdbellvjk/imgs/snap_202209156952.png|desc_snap_202209156952
/byrdbellvjk/imgs/snap_202209156953.png|desc_snap_202209156953
/byrdbellvjk/imgs/snap_202209156954.png|desc_snap_202209156954
/byrdbellvjk/imgs/snap_202209156955.png|desc_snap_202209156955
/byrdbellvjk/imgs/snap_202209156956.png|desc_snap_202209156956
/byrdbellvjk/imgs/snap_202209156957.png|desc_snap_202209156957
/byrdbellvjk/imgs/snap_202209156958.png|desc_snap_202209156958
/byrdbellvjk/imgs/snap_202209156959.png|desc_snap_202209156959
/byrdbellvjk/imgs/snap_202209156960.png|desc_snap_202209156960
/byrdbellvjk/imgs/snap_202209156961.png|desc_snap_202209156961
/byrdbellvjk/imgs/snap_202209156962.png|desc_snap_202209156962
/byrdbellvjk/imgs/snap_202209156963.png|desc_snap_202209156963
/byrdbellvjk/imgs/snap_202209156964.png|desc_snap_202209156964
/byrdbellvjk/imgs/snap_202209156965.png|desc_snap_202209156965
/byrdbellvjk/imgs/snap_202209156966.png|desc_snap_202209156966
/byrdbellvjk/imgs/snap_202209156967.png|desc_snap_202209156967
/byrdbellvjk/imgs/snap_202209156968.png|desc_snap_202209156968
/byrdbellvjk/imgs/snap_202209156969.png|desc_snap_202209156969

/byrdbellvjk/imgs/jtfdcr_police/jtfdc_20170805_1400_police_byrddog_call.mp3
/byrdbellvjk/imgs/jtfdcr_police/jtfdc_20190516_0820_policecall.mp3
/byrdbellvjk/imgs/jtfdcr_police/jtfdc_20190516_0830.mp3
/byrdbellvjk/imgs/jtfdcr_police/jtfdc_20190516_0830_016_when_they_move_the_sawhorsetweets.mp3
/byrdbellvjk/imgs/jtfdcr_police/jtfdc_20190516_0830_026_tweets.mp3
/byrdbellvjk/imgs/jtfdcr_police/jtfdc_20190516_0830_1m23-1m33.mp3
/byrdbellvjk/imgs/jtfdcr_police/jtfdc_20190516_0830_22_terror_what_are_you_doing_here.mp3
/byrdbellvjk/mp3/jtfdc_20160530_1317_byrd_trustee_threat.mp3
/byrdbellvjk/mp3/jtfdc_20160530_1327_byrd_trustee_threat.mp3
/byrdbellvjk/mp3/jtfdc_20160530_1916_byrd_threat.mp3
/byrdbellvjk/mp3/jtfdc_20160610_2030_01234567890_waiting_police_byrd_baily.mp3
/byrdbellvjk/mp3/jtfdc_20170805_1400_police_byrddog_call.mp3
/byrdbellvjk/mp3/jtfdc_20190509_1224_jkwii_police_officerbell.mp3
/byrdbellvjk/mp3/jtfdc_20190516_0820_byrd_waiting4police.mp3
/byrdbellvjk/mp3/jtfdc_20190516_0820_policecall.mp3
/byrdbellvjk/mp3/jtfdc_20190516_0830.mp3
/byrdbellvjk/mp3/jtfdc_20190516_0830_026_tweets.mp3
/byrdbellvjk/mp3/jtfdc_20190516_0830_1m23-1m33.mp3
/byrdbellvjk/mp3/jtfdc_20190516_0830_terror_what_are_you_doing_here.mp3
/byrdbellvjk/mp3/jtfdc_20190516_0830_when_they_move_the_sawhorsetweets.mp3
/byrdbellvjk/mp3/jtfdc_20190528_1636_stalkaround_byrd_siegrist_dogs_marshall_yourself.mp3
/byrdbellvjk/mp3/jtfdc_20190908_0030_still_toadog.mp3
/byrdbellvjk/mp3/jtfdc_20191109_1604_skpout_jkwiigo_jtf31_fiona_nice.mp3
/byrdbellvjk/mp3/jtfdc_20191209_1529_stalkaround_bus.mp3
/byrdbellvjk/mp3/jtfdc_20200109_0648_jhappy_bday_jk2.mp3
/byrdbellvjk/mp3/jtfdc_20200119_1752_stalkaround_twins_suv_n_pickup.mp3
/byrdbellvjk/mp3/jtfdc_20200316_1756_jtf30_vickky_only1doggy.mp3
/byrdbellvjk/mp3/jtfdc_20200322_1222_jhout2.mp3
/byrdbellvjk/mp3/jtfdc_20200330_1200_jkwiigo_jtf3839_byrd_dr_hilldown.mp3
/byrdbellvjk/mp3/jtfdc_byrd_20180423_1320_trespass_bullies.mp3
/byrdbellvjk/mp3/jtfdc_byrd_20180606_1648_threats_bucket_theft.mp3
/byrdbellvjk/mp3/jtfdc_byrd_20190516_0820.mp3
/byrdbellvjk/mp3/jtfdc_byrd_20190516_0830.mp3
/byrdbellvjk/mp3/library_of_congress.mp3
/byrdbellvjk/imgs/jtfdcr_police/jtfdc_20170805_1400_police_byrddog_call.mp4
/byrdbellvjk/imgs/jtfdcr_police/jtfdc_20190516_0830.mp4
/byrdbellvjk/imgs/jtfdcr_police/tn_jtfdc_20190509_1224_jkwii_police_officerbell.mp4
/byrdbellvjk/imgs/jtfdcr_police/tn_jtfdc_20190516_0820_byrd_waiting4police.mp4
/byrdbellvjk/mp4/jtfdc_20160530_1317_byrd_trustee_threat.mp4
/byrdbellvjk/mp4/jtfdc_20160530_1327_byrd_trustee_threat.mp4
/byrdbellvjk/mp4/jtfdc_20160530_1916_byrd_threat.mp4
/byrdbellvjk/mp4/jtfdc_20160610_2030_01234567890_waiting_police_byrd_baily.mp4
/byrdbellvjk/mp4/jtfdc_20170805_1400_police_byrddog_call.mp4
/byrdbellvjk/mp4/jtfdc_20190509_1224_jkwii_police_officerbell.mp4
/byrdbellvjk/mp4/jtfdc_20190516_0820_byrd_waiting4police.mp4
/byrdbellvjk/mp4/jtfdc_20190516_0830.mp4
/byrdbellvjk/mp4/jtfdc_20190528_1636_stalkaround_byrd_siegrist_dogs_marshall_yourself.mp4
/byrdbellvjk/mp4/jtfdc_20190908_0030_still_toadog.mp4
/byrdbellvjk/mp4/jtfdc_20191109_1604_skpout_jkwiigo_jtf31_fiona_nice.mp4
/byrdbellvjk/mp4/jtfdc_20191209_1529_stalkaround_bus.mp4
/byrdbellvjk/mp4/jtfdc_20200109_0648_jhappy_bday_jk2.mp4
/byrdbellvjk/mp4/jtfdc_20200119_1752_stalkaround_twins_suv_n_pickup.mp4
/byrdbellvjk/mp4/jtfdc_20200316_1756_jtf30_vickky_only1doggy.mp4
/byrdbellvjk/mp4/jtfdc_20200322_1222_jhout2.mp4
/byrdbellvjk/mp4/jtfdc_20200330_1200_jkwiigo_jtf3839_byrd_dr_hilldown.mp4
/byrdbellvjk/mp4/jtfdc_byrd_20180423_1320_trespass_bullies.mp4
/byrdbellvjk/mp4/jtfdc_byrd_20180606_1648_threats_bucket_theft.mp4
/byrdbellvjk/mp4/jtfdc_byrd_20190516_0820.mp4
/byrdbellvjk/mp4/jtfdc_byrd_20190516_0830.mp4
/byrdbellvjk/byrdbellvjk.pdf
/byrdbellvjk/fb.pdf
/byrdbellvjk/imgs/jk/dr_richard_gestring_internal_medicine.pdf
/byrdbellvjk/imgs/jk/dr_richard_gestring_psychiatry.pdf
/byrdbellvjk/imgs/jtfdcr/ko.pdf
/byrdbellvjk/imgs/jtfdcr_20190516_protect/102_jk_restrain_donovan_pg1.pdf
/byrdbellvjk/imgs/jtfdcr_20190516_protect/103_jk_restrain_donovan_pg2.pdf
/byrdbellvjk/imgs/jtfdcr_20190516_protect/104_jk_restrain_donovan_pg3.pdf
/byrdbellvjk/imgs/jtfdcr_20190516_protect/105_jk_restrain_donovan_pg6.pdf
/byrdbellvjk/imgs/jtfdcr_20190516_protect/106_jk_restrain_donovan_pg7.pdf
/byrdbellvjk/imgs/jtfdcr_20190516_protect/jkassil_case(s)_details.doc.pdf
/byrdbellvjk/ko.pdf
/byrdbellvjk/pdf/102_jk_restrain_donovan_pg1.pdf
/byrdbellvjk/pdf/103_jk_restrain_donovan_pg2.pdf
/byrdbellvjk/pdf/104_jk_restrain_donovan_pg3.pdf
/byrdbellvjk/pdf/105_jk_restrain_donovan_pg6.pdf
/byrdbellvjk/pdf/106_jk_restrain_donovan_pg7.pdf
/byrdbellvjk/pdf/500_jtfdcr_cohena_2013_cases.pdf
/byrdbellvjk/pdf/byrdbellvjk.pdf
/byrdbellvjk/pdf/byrdbellvjk_bell.pdf
/byrdbellvjk/pdf/byrdbellvjk_byrd.pdf
/byrdbellvjk/pdf/byrdbellvjk_donovan.pdf
/byrdbellvjk/pdf/byrdbellvjk_gardner.pdf
/byrdbellvjk/pdf/byrdbellvjk_jk.pdf
/byrdbellvjk/pdf/byrdbellvjk_jkmed.pdf
/byrdbellvjk/pdf/byrdbellvjk_jtf28.pdf
/byrdbellvjk/pdf/byrdbellvjk_jtf29.pdf
/byrdbellvjk/pdf/byrdbellvjk_jtf30.pdf
/byrdbellvjk/pdf/byrdbellvjk_jtf31.pdf
/byrdbellvjk/pdf/byrdbellvjk_jtf32.pdf
/byrdbellvjk/pdf/byrdbellvjk_jtf39.pdf
/byrdbellvjk/pdf/byrdbellvjk_jtf40.pdf
/byrdbellvjk/pdf/byrdbellvjk_jtfdc.pdf
/byrdbellvjk/pdf/byrdbellvjk_trial1.pdf
/byrdbellvjk/pdf/byrdbellvjk_trial2.pdf
/byrdbellvjk/pdf/byrdbellvjk_trial3.pdf
/byrdbellvjk/pdf/byrdbellvjk_trial4.pdf
/byrdbellvjk/pdf/byrdbellvjk_trial5.pdf
/byrdbellvjk/pdf/byrdbellvjk_trial6.pdf
/byrdbellvjk/pdf/coffee.pdf
/byrdbellvjk/pdf/cohen_15403521_15445941_comb_151203.pdf
/byrdbellvjk/pdf/cohen_15403521_15445941_cont_160121.pdf
/byrdbellvjk/pdf/cohen_15403521_continued_151203.pdf
/byrdbellvjk/pdf/cohen_affidavit_records_151030.pdf
/byrdbellvjk/pdf/incrpt_1530736_citincident_150526_pg1.pdf
/byrdbellvjk/pdf/incrpt_1530736_citincident_150526_pg2.pdf
/byrdbellvjk/pdf/incrpt_1530736_citincident_150526_pg3.pdf
/byrdbellvjk/pdf/incrpt_1530736_citincident_150526_pg4.pdf
/byrdbellvjk/pdf/incrpt_1530736_citincident_150526_pg5.pdf
/byrdbellvjk/pdf/incrpt_1530736_citincident_150526_pg6.pdf
/byrdbellvjk/pdf/incrpt_1530736_citincident_150526_pg7.pdf
/byrdbellvjk/pdf/incrpt_1530736_citincident_150526_pg8.pdf
/byrdbellvjk/pdf/incrpt_1540352_martin_150716_pg1.pdf
/byrdbellvjk/pdf/incrpt_1540352_martin_150716_pg2.pdf
/byrdbellvjk/pdf/incrpt_1540352_martin_150716_pg3.pdf
/byrdbellvjk/pdf/incrpt_1544594_gardner_150807_pg1.pdf
/byrdbellvjk/pdf/incrpt_1544594_gardner_150807_pg2.pdf
/byrdbellvjk/pdf/incrpt_1552246_gardner_150919_pg1.pdf
/byrdbellvjk/pdf/incrpt_1552246_gardner_150919_pg2.pdf
/byrdbellvjk/pdf/incrpt_1552246_supplement1_gardner_150919_pg1.pdf
/byrdbellvjk/pdf/incrpt_1552326_gardner_150919_pg1.pdf
/byrdbellvjk/pdf/incrpt_1552326_gardner_150919_pg2.pdf
/byrdbellvjk/pdf/incrpt_1553710_martin_150928_pg1.pdf
/byrdbellvjk/pdf/incrpt_1553710_martin_150928_pg2.pdf
/byrdbellvjk/pdf/incrpt_1558386_gardner_151023_pg1.pdf
/byrdbellvjk/pdf/incrpt_1558386_gardner_151023_pg2.pdf
/byrdbellvjk/pdf/jk.pdf
/byrdbellvjk/pdf/jtfdc.pdf
/byrdbellvjk/pdf/jtfdc_20160530_1317_byrd_trustee_threat.pdf
/byrdbellvjk/pdf/jtfdc_20160530_1327_byrd_trustee_threat.pdf
/byrdbellvjk/pdf/jtfdc_20160530_1916_byrd_threat.pdf
/byrdbellvjk/pdf/jtfdc_20160610_2030_01234567890_waiting_police_byrd_baily.pdf
/byrdbellvjk/pdf/jtfdc_20170805_1400_police_byrddog_call.pdf
/byrdbellvjk/pdf/jtfdc_20190509_1224_jkwii_police_officerbell.pdf
/byrdbellvjk/pdf/jtfdc_20190516_0820_byrd_waiting4police.pdf
/byrdbellvjk/pdf/jtfdc_20190516_0830.pdf
/byrdbellvjk/pdf/jtfdc_20190528_1636_stalkaround_byrd_siegrist_dogs_marshall_yourself.pdf
/byrdbellvjk/pdf/jtfdc_20190908_0030_still_toadog.pdf
/byrdbellvjk/pdf/jtfdc_20191109_1604_skpout_jkwiigo_jtf31_fiona_nice.pdf
/byrdbellvjk/pdf/jtfdc_20191209_1529_stalkaround_bus.pdf
/byrdbellvjk/pdf/jtfdc_byrd_20180423_1320_trespass_bullies.pdf
/byrdbellvjk/pdf/jtfdc_byrd_20180606_1648_threats_bucket_theft.pdf
/byrdbellvjk/pdf/jtfdc_byrd_20190516_0820.pdf
/byrdbellvjk/pdf/jtfdc_byrd_20190516_0830.pdf
/byrdbellvjk/pdf/jtfdcr.pdf
/byrdbellvjk/pdf/jtfdcr_20150000_jk_protect_martin.pdf
/byrdbellvjk/pdf/jtfdcr_20150000_jtfinc_contacts.pdf
/byrdbellvjk/pdf/jtfdcr_20150000_lawers.pdf
/byrdbellvjk/pdf/jtfdcr_20150000_request_legal_assistance.pdf
/byrdbellvjk/pdf/jtfdcr_201500_cohena_cases.pdf
/byrdbellvjk/pdf/jtfdcr_20150611_martin_protect_jk.pdf
/byrdbellvjk/pdf/jtfdcr_20150611_martin_protect_jk1.pdf
/byrdbellvjk/pdf/jtfdcr_20150821_cohena_policeletter.pdf
/byrdbellvjk/pdf/jtfdcr_20150910_jk_protect_donovan.pdf
/byrdbellvjk/pdf/jtfdcr_20151012_stlc_yard_violations.pdf
/byrdbellvjk/pdf/jtfdcr_20160519_1700_sk_protect.pdf
/byrdbellvjk/pdf/jtfdcr_20160826_keuhlig_common_drive.pdf
/byrdbellvjk/pdf/jtfdcr_20170908_cohenn_trial3.pdf
/byrdbellvjk/pdf/jtfdcr_20190516.pdf
/byrdbellvjk/pdf/jtfdcr_20190516_1700_sk_protect.pdf
/byrdbellvjk/pdf/jtfdcr_20190516_big.pdf
/byrdbellvjk/pdf/jtfdcr_20190516_jkmed.pdf
/byrdbellvjk/pdf/jtfdcr_20190516_luber_policereport.pdf
/byrdbellvjk/pdf/jtfdcr_20190516_protect.pdf
/byrdbellvjk/pdf/jtfdcr_20191204_dolley_trial5.pdf
/byrdbellvjk/pdf/jtfdcr_20191204_dolley_trial5_jtfinc.pdf
/byrdbellvjk/pdf/jtfdcr_20200916_jkmed_status.pdf
/byrdbellvjk/pdf/jtfdcr_20230126_byrd_threats_n_thefts.pdf
/byrdbellvjk/pdf/jtfdcr_cohena.pdf
/byrdbellvjk/pdf/jtfdcr_cohenn.pdf
/byrdbellvjk/pdf/jtfdcr_dogs.pdf
/byrdbellvjk/pdf/jtfdcr_dolly.pdf
/byrdbellvjk/pdf/jtfdcr_keuhlig.pdf
/byrdbellvjk/pdf/jtfdcr_police.pdf
/byrdbellvjk/pdf/mp4.pdf
/byrdbellvjk/pdf/police_call_summary_29jamestown.pdf
/byrdbellvjk/pdf/police_call_summary_jamestown_pg1.pdf
/byrdbellvjk/pdf/police_call_summary_jamestown_pg2.pdf
/byrdbellvjk/pdf/police_call_summary_jamestown_pg3.pdf
/byrdbellvjk/pdf/summons_15445941_gardner_pg1.pdf
/byrdbellvjk/pdf/summons_15445941_gardner_pg2.pdf
/byrdbellvjk/pdf/summons_15445941_gardner_pg3.pdf
/byrdbellvjk/pdf/summons_15445941_gardner_pg4.pdf
/byrdbellvjk/pdf/who2jail.pdf
/byrdbellvjk/pdf/zn_byrdbellvjk.pdf
/byrdbellvjk/pj/byrdbellvjk.pdf
/byrdbellvjk/pj/gs.pdf
/byrdbellvjk/pj/gs_byrdbellvjk.pdf
/byrdbellvjk/pj/gs_police.pdf
/byrdbellvjk/pj/zn_byrdbellvjk.pdf
/byrdbellvjk/tn_byrdbellvjk.pdf
/byrdbellvjk/txt/2014_taxdetails.xls.pdf
/byrdbellvjk/txt/jk_restrain_donovan_pg1.pdf
/byrdbellvjk/txt/jk_restrain_donovan_pg2.pdf
/byrdbellvjk/txt/jk_restrain_donovan_pg3.pdf
/byrdbellvjk/txt/jk_restrain_donovan_pg4.pdf
/byrdbellvjk/txt/jk_restrain_donovan_pg5.pdf
/byrdbellvjk/txt/jk_restrain_donovan_pg6.pdf
/byrdbellvjk/txt/jk_restrain_donovan_pg7.pdf
/byrdbellvjk/txt/jk_restrain_donovan_pg8.pdf
/byrdbellvjk/txt/jk_restrain_gardner_pg1.pdf
/byrdbellvjk/txt/jk_restrain_gardner_pg2.pdf
/byrdbellvjk/txt/jk_restrain_gardner_pg3.pdf
/byrdbellvjk/txt/jk_restrain_gardner_pg4.pdf
/byrdbellvjk/txt/jk_restrain_gardner_pg5.pdf
/byrdbellvjk/txt/jk_restrain_gardner_pg6.pdf
/byrdbellvjk/txt/jk_restrain_gardner_pg7.pdf
/byrdbellvjk/txt/jk_restrain_gardner_pg8.pdf
/byrdbellvjk/txt/jk_restrain_martin_pg1.pdf
/byrdbellvjk/txt/jk_restrain_martin_pg2.pdf
/byrdbellvjk/txt/jk_restrain_martin_pg3.pdf
/byrdbellvjk/txt/jk_restrain_martin_pg4.pdf
/byrdbellvjk/txt/jk_restrain_martin_pg5.pdf
/byrdbellvjk/txt/jk_restrain_martin_pg6.pdf
/byrdbellvjk/txt/jk_restrain_martin_pg7.pdf
/byrdbellvjk/txt/jk_restrain_martin_pg8.pdf
/byrdbellvjk/zn_byrdbellvjk.pdf
/byrdbellvjk/fb/byrdbellvjk/imgs_orig/byrdbellvjk.txt
/byrdbellvjk/fb/byrdbellvjk/imgs_orig/exiftool_byrdbellvjk.txt
/byrdbellvjk/fb/byrdbellvjk/imgs_orig/outline.txt
/byrdbellvjk/fb/byrdbellvjk/pages.txt
/byrdbellvjk/fb/notes/notes.txt
/byrdbellvjk/fb/who2jail/jkwii_20190516_policemen_byrdbell_takeaneighbor2jail_day.txt
/byrdbellvjk/fb/who2jail/pages/js/b64_arrows_png.txt
/byrdbellvjk/fb/who2jail/pages/js/b64_loader_gif.txt
/byrdbellvjk/fb/who2jail/pages/js/b64_magazine_js.txt
/byrdbellvjk/fb/who2jail/pages/js/b64_pics.txt
/byrdbellvjk/fb/who2jail/pages/js/b64_zoom-icons-editable_png.txt
/byrdbellvjk/fb/who2jail/pages/js/b64_zoom-icons_png.txt
/byrdbellvjk/fb/who2jail/who2jail.txt
/byrdbellvjk/find_byrd.txt
/byrdbellvjk/find_dogs.txt
/byrdbellvjk/find_gif_jtf.txt
/byrdbellvjk/find_jtf.txt
/byrdbellvjk/find_kb_byrd_mp4.txt
/byrdbellvjk/find_kbvid_byrd.txt
/byrdbellvjk/find_kbvid_tnmp4.txt
/byrdbellvjk/find_mp3_jtf.txt
/byrdbellvjk/find_mp4_byrd.txt
/byrdbellvjk/find_mp4_jtf.txt
/byrdbellvjk/find_mp4_police.txt
/byrdbellvjk/find_police.txt
/byrdbellvjk/help.txt
/byrdbellvjk/imgs/imgs.txt
/byrdbellvjk/imgs/jtfdcr/tn_mp4.txt
/byrdbellvjk/imgs/jtfdcr_police/find_ht_mp4.txt
/byrdbellvjk/imgs/jtfdcr_police/find_ht_pdf.txt
/byrdbellvjk/imgs/jtfdcr_police/find_ht_snap.txt
/byrdbellvjk/imgs/jtfdcr_police/find_jtf.txt
/byrdbellvjk/imgs/jtfdcr_police/find_jtf_ht.txt
/byrdbellvjk/imgs/jtfdcr_police/find_jtf_mp4.txt
/byrdbellvjk/imgs/jtfdcr_police/find_jtfdc.txt
/byrdbellvjk/imgs/jtfdcr_police/find_jtfmp3.txt
/byrdbellvjk/imgs/jtfdcr_police/find_jtfmp4.txt
/byrdbellvjk/imgs/jtfdcr_police/find_kb.txt
/byrdbellvjk/imgs/jtfdcr_police/find_snap.txt
/byrdbellvjk/imgs/jtfdcr_police/find_youb.txt
/byrdbellvjk/imgs/jtfdcr_police/jkwii_20150513_police_flee2cleveland.txt
/byrdbellvjk/imgs/jtfdcr_police/jkwiisme.txt
/byrdbellvjk/imgs/jtfdcr_police/jkwiiv_byrdbell.txt
/byrdbellvjk/imgs/jtfdcr_police/jkwiiv_byrdbell_raw.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfdc_20170805_1400_police_byrddog_call.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfdc_20190516_0820_policecall.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfdc_20190516_0830.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfinc_20200102_jtfinc_byrd.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfinc_20200102_jtfinc_byrd_02.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfinc_20200102_jtfinc_byrd_03.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfinc_20200102_jtfinc_byrd_04.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfinc_20200102_jtfinc_byrd_05.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfinc_20200102_jtfinc_byrd_06.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfinc_20200102_jtfinc_byrd_07.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfinc_20200102_jtfinc_byrd_07_jkwii.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfinc_20200102_jtfinc_byrd_08.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfinc_20200102_jtfinc_byrd_10.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfinc_20200102_jtfinc_byrd_11.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfinc_20200102_jtfinc_dolley_1.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfinc_20200102_jtfinc_dolley_2.txt
/byrdbellvjk/imgs/jtfdcr_police/jtfinc_20200102_jtfinc_dolley_3.txt
/byrdbellvjk/imgs/jtfdcr_police/pagelist.txt
/byrdbellvjk/imgs/jtfdcr_police/pagelist_byrdbell.txt
/byrdbellvjk/imgs/jtfdcr_police/pagelist_kb_jtfdcr_vid.txt
/byrdbellvjk/imgs/jtfdcr_police/pagelist_mp3.txt
/byrdbellvjk/imgs/jtfdcr_police/pcalls.txt
/byrdbellvjk/imgs/jtfdcr_police/pcalls_notes.txt
/byrdbellvjk/imgs/jtfdcr_police/policereport.txt
/byrdbellvjk/imgs/jtfdcr_police/sel_files.txt
/byrdbellvjk/imgs/jtfdcr_police/snap_1.txt
/byrdbellvjk/imgs/jtfdcr_police/tn_mp4.txt
/byrdbellvjk/imgs/jtfdcr_police/who2jail.txt
/byrdbellvjk/imgs/jtfdcr_police/who2jail_raw.txt
/byrdbellvjk/jk.txt
/byrdbellvjk/jk1.txt
/byrdbellvjk/ko.txt
/byrdbellvjk/notes.txt
/byrdbellvjk/pj/byrdbellvjk.txt
/byrdbellvjk/pj/dates.txt
/byrdbellvjk/pj/exiftool_byrdbellvjk.txt
/byrdbellvjk/pj/find_fb.txt
/byrdbellvjk/pj/find_gif.txt
/byrdbellvjk/pj/find_jpg.txt
/byrdbellvjk/pj/find_kbjtf.txt
/byrdbellvjk/pj/find_mp3.txt
/byrdbellvjk/pj/find_mp4.txt
/byrdbellvjk/pj/find_mp4_jtf.txt
/byrdbellvjk/pj/find_mp4tn.txt
/byrdbellvjk/pj/find_mp4tn_jtf.txt
/byrdbellvjk/pj/find_pdf.txt
/byrdbellvjk/pj/find_png.txt
/byrdbellvjk/pj/find_tl.txt
/byrdbellvjk/pj/find_txt.txt
/byrdbellvjk/pj/find_zm.txt
/byrdbellvjk/pj/finds.txt
/byrdbellvjk/pj/mp4tns.txt
/byrdbellvjk/pj/notes.txt
/byrdbellvjk/pj/outline.txt
/byrdbellvjk/pj/pages.txt
/byrdbellvjk/todo.txt
/byrdbellvjk/txt/ajaks_ka12_mp4.txt
/byrdbellvjk/txt/ajaks_ka1_htkb_jpg.txt
/byrdbellvjk/txt/ajaks_ka1_jtfdc_mp4.txt
/byrdbellvjk/txt/ajaks_ka1_kb_jpg.txt
/byrdbellvjk/txt/ajaks_ko2_fb_jpg.txt
/byrdbellvjk/txt/ajaks_ko2_jpg.txt
/byrdbellvjk/txt/ajaks_ko2_kb_jpg.txt
/byrdbellvjk/txt/ajaks_ko2_mp4.txt
/byrdbellvjk/txt/ajaks_ko2_sl_jpg.txt
/byrdbellvjk/txt/ajaks_ko2_tl_jpg.txt
/byrdbellvjk/txt/ajaks_ko2_us_jpg.txt
/byrdbellvjk/txt/ajax.txt
/byrdbellvjk/txt/ajax1.txt
/byrdbellvjk/txt/ajax2.txt
/byrdbellvjk/txt/ajax_info.txt
/byrdbellvjk/txt/anim.txt
/byrdbellvjk/txt/anim_cute.txt
/byrdbellvjk/txt/anim_orbs.txt
/byrdbellvjk/txt/anim_tek.txt
/byrdbellvjk/txt/b64_h5gallery_jquery_js.txt
/byrdbellvjk/txt/b64_h5gallery_js.txt
/byrdbellvjk/txt/b64_ko_js.txt
/byrdbellvjk/txt/b64_turnjs.txt
/byrdbellvjk/txt/b64_turnminjs.txt
/byrdbellvjk/txt/b64btn.txt
/byrdbellvjk/txt/brew_link_dryrun_py.txt
/byrdbellvjk/txt/bugs.txt
/byrdbellvjk/txt/callodes4.rxr.txt
/byrdbellvjk/txt/codes1.txt
/byrdbellvjk/txt/find_ht_mp4.txt
/byrdbellvjk/txt/find_ht_pdf.txt
/byrdbellvjk/txt/find_ht_snap.txt
/byrdbellvjk/txt/find_jtf.txt
/byrdbellvjk/txt/find_jtf_ht.txt
/byrdbellvjk/txt/find_jtf_mp4.txt
/byrdbellvjk/txt/find_jtfdc.txt
/byrdbellvjk/txt/find_jtfmp3.txt
/byrdbellvjk/txt/find_jtfmp4.txt
/byrdbellvjk/txt/find_kb.txt
/byrdbellvjk/txt/find_snap.txt
/byrdbellvjk/txt/find_youb.txt
/byrdbellvjk/txt/jkresume_1990_01.txt
/byrdbellvjk/txt/jkresume_1990_02.txt
/byrdbellvjk/txt/jkresume_1990_skillset.txt
/byrdbellvjk/txt/jkresume_2000_01.txt
/byrdbellvjk/txt/jkresume_2000_02.txt
/byrdbellvjk/txt/jkresume_2000_03.txt
/byrdbellvjk/txt/jkresume_2000_detail_buie.txt
/byrdbellvjk/txt/jkresume_2000_detail_bw.txt
/byrdbellvjk/txt/jkresume_2000_detail_konet.txt
/byrdbellvjk/txt/jkresume_2000_detail_preview.txt
/byrdbellvjk/txt/jkresume_2000_detail_sasc.txt
/byrdbellvjk/txt/jkwii_20150513_police_flee2cleveland.txt
/byrdbellvjk/txt/jkwiisme.txt
/byrdbellvjk/txt/jkwiiv_byrdbell.txt
/byrdbellvjk/txt/jkwiiv_byrdbell_raw.txt
/byrdbellvjk/txt/jtf_ie_200909.txt
/byrdbellvjk/txt/jtf_ie_200909_ocr.txt
/byrdbellvjk/txt/jtf_min.txt
/byrdbellvjk/txt/jtf_min_200909.txt
/byrdbellvjk/txt/jtf_min_200909_ocr.txt
/byrdbellvjk/txt/jtf_us_20070530_ocr.txt
/byrdbellvjk/txt/jtf_us_200909.txt
/byrdbellvjk/txt/jtf_us_200909_01_ocr.txt
/byrdbellvjk/txt/jtf_us_200909_02_ocr.txt
/byrdbellvjk/txt/jtf_videos.txt
/byrdbellvjk/txt/jtfdc_20160530_1317_byrd_trustee_threat.txt
/byrdbellvjk/txt/jtfdc_20160530_1327_byrd_trustee_threat.txt
/byrdbellvjk/txt/jtfdc_20160530_1916_byrd_threat.txt
/byrdbellvjk/txt/jtfdc_20160610_2030_01234567890_waiting_police_byrd_baily.txt
/byrdbellvjk/txt/jtfdc_20170805_1400_police_byrddog_call.txt
/byrdbellvjk/txt/jtfdc_20190509_1224_jkwii_police_officerbell.txt
/byrdbellvjk/txt/jtfdc_20190516_0820_byrd_waiting4police.txt
/byrdbellvjk/txt/jtfdc_20190516_0820_policecall.txt
/byrdbellvjk/txt/jtfdc_20190516_0830.txt
/byrdbellvjk/txt/jtfdc_20190516_0830_026_tweets.txt
/byrdbellvjk/txt/jtfdc_20190516_0830_1m23-1m33.txt
/byrdbellvjk/txt/jtfdc_20190516_0830_terror_what_are_you_doing_here.txt
/byrdbellvjk/txt/jtfdc_20190516_0830_when_they_move_the_sawhorsetweets.txt
/byrdbellvjk/txt/jtfdc_20190528_1636_stalkaround_byrd_siegrist_dogs_marshal_yourself.txt
/byrdbellvjk/txt/jtfdc_20190528_1636_stalkaround_byrd_siegrist_dogs_marshall_yourself.txt
/byrdbellvjk/txt/jtfdc_20190908_0030_still_toadog.txt
/byrdbellvjk/txt/jtfdc_20191109_1604_skpout_jkwiigo_jtf31_fiona_nice.txt
/byrdbellvjk/txt/jtfdc_20191209_1529_stalkaround_bus.txt
/byrdbellvjk/txt/jtfdc_20200109_0648_jhappy_bday_jk2.txt
/byrdbellvjk/txt/jtfdc_20200119_1752_stalkaround_twins_suv_n_pickup.txt
/byrdbellvjk/txt/jtfdc_20200316_1756_jtf30_vickky_only1doggy.txt
/byrdbellvjk/txt/jtfdc_20200322_1222_jhout2.txt
/byrdbellvjk/txt/jtfdc_20200330_1200_jkwiigo_jtf3839_byrd_dr_hilldown.txt
/byrdbellvjk/txt/jtfdc_byrd_20180423_1320_trespass_bullies.txt
/byrdbellvjk/txt/jtfdc_byrd_20180606_1648_threats_bucket_theft.txt
/byrdbellvjk/txt/jtfdc_byrd_20190516_0820.txt
/byrdbellvjk/txt/jtfdc_byrd_20190516_0830.txt
/byrdbellvjk/txt/jtfinc_20200102_jtfinc_byrd.txt
/byrdbellvjk/txt/jtfinc_20200102_jtfinc_byrd_02.txt
/byrdbellvjk/txt/jtfinc_20200102_jtfinc_byrd_03.txt
/byrdbellvjk/txt/jtfinc_20200102_jtfinc_byrd_04.txt
/byrdbellvjk/txt/jtfinc_20200102_jtfinc_byrd_05.txt
/byrdbellvjk/txt/jtfinc_20200102_jtfinc_byrd_06.txt
/byrdbellvjk/txt/jtfinc_20200102_jtfinc_byrd_07.txt
/byrdbellvjk/txt/jtfinc_20200102_jtfinc_byrd_07_jkwii.txt
/byrdbellvjk/txt/jtfinc_20200102_jtfinc_byrd_08.txt
/byrdbellvjk/txt/jtfinc_20200102_jtfinc_byrd_10.txt
/byrdbellvjk/txt/jtfinc_20200102_jtfinc_byrd_11.txt
/byrdbellvjk/txt/jtfinc_20200102_jtfinc_dolley_1.txt
/byrdbellvjk/txt/jtfinc_20200102_jtfinc_dolley_2.txt
/byrdbellvjk/txt/jtfinc_20200102_jtfinc_dolley_3.txt
/byrdbellvjk/txt/library_of_congress.txt
/byrdbellvjk/txt/mp4.txt
/byrdbellvjk/txt/pagelist.txt
/byrdbellvjk/txt/pagelist_byrdbell.txt
/byrdbellvjk/txt/pagelist_kb_jtfdcr_vid.txt
/byrdbellvjk/txt/pagelist_mp3.txt
/byrdbellvjk/txt/pcalls.txt
/byrdbellvjk/txt/policereport.txt
/byrdbellvjk/txt/report2.txt
/byrdbellvjk/txt/sel_files.txt
/byrdbellvjk/txt/skbyrd_protect_20190516.txt
/byrdbellvjk/txt/snap_1.txt
/byrdbellvjk/txt/text_testimon.txt
/byrdbellvjk/txt/textsrkc_calp2,txt.txt
/byrdbellvjk/txt/textsrkc_calp3,txt.txt
/byrdbellvjk/txt/textxodes2.rxr.txt
/byrdbellvjk/txt/tn_mp4.txt
/byrdbellvjk/txt/who2jail.txt
/byrdbellvjk/txt/who2jail_raw.txt
/byrdbellvjk/vi.txt
/byrdbellvjk/vi1.txt
/byrdbellvjk/vi2.txt
/fb/jtfdc/pages/1.jpg
/fb/jtfdcr/pages/1.jpg
/fb/jtfinc/pages/1.jpg
/fb/konet/pages/1.jpg
/fb/iperms/pages/1.jpg
/fb/ka/pages/1.jpg
/fb/kitiworks/pages/1.jpg
# lists_items.txt end 
`.split("\n");

colorids="000 050 100 110 120 150 190 000".split(" ");
colornum=0;


//			alert( "BUGS_17871 items="+items.length+" pre_items="+pre_items.length );

//			alert( "BUGS_17872 leds items.length="+items.length );
			collim=50; colnum=0;
			for( j=0; j<items.length; j++ ) {
				desc="desc_"+j;
				item=items[j];
//				alert( "BUGS_17872 leds j="+j+" item="+item );
//				if( /^#/.test(search)) { continue; }
//				if( item.match(/^#/)) { continue; }

//				if( colornum > colorids.length-1 ) { colornum=0; }
				colornum=random_int(0,colorids.length-1);
				led="/imgs/leds/hal/hal"+colorids[colornum]+".gif";	
//				colornum=colornum+1;
		
				pathfile=item.split("|")[0];
//				alert( "BUGS_17873 leds item="+item );
				if( item.split("|").length > 1 ) {
					desc=item.split("|")[1];
					}
				colnum=colnum+1;
				if( colnum > collim ) { htmout+="<br>\n"; colnum=1; }

				content[j]="<hr color=black><img src="+pathfile+" height=100><hr color=black>"+desc+"<hr color=black><br>\n";
//				htmout+="<h1>j="+j+" content="+content[j]+"</h1>\n";
//				htmout+="<img id=img_leds"+j+" title=\"          leds"+j+"\" ";
//				htmout+="src=/imgs/leds/hal/hal100.gif ";
//				htmout+=" onclick=\"windeo.open('"+pathfile+"'); return false;\" ";
//				htmout+=" onMouseOver=\"content["+j+"]\" ";
//				htmout+="  onMouseOut=\"tipout(); return false;\" ";
//				htmout+=" height=10 border=0>";

				htmout+="<img id=img_item_"+j+" title=\"          item_"+j+"\" ";
//				htmout+="src=/imgs/leds/hal/hal150.gif ";
				htmout+="src="+led+" ";
				htmout+=" onclick=\"window.open('ko_tooltips_txt.html?id=hal_"+j+"'); return false;\" ";
//				htmout+=" onMouseover=\"changetext(content["+j+"])\" height=10 border=0>";
				htmout+=" onMouseover=\"changetext('"+content[j]+"')\" height=10 border=0>";
				}


//			htmout+="<h1>CONTENT length="+content.length+"</h1>\n";
//			for j=0; j< content.length; j++ ) {
//				htmout+="<h3>j="+j+" "+content[j]+"</h3>\n";
//				}
				
			if( document.getElementById('div_leds_out')) {
				document.getElementById('div_leds_out').innerHTML=htmout;
				}
			return(htmout);
			}
		</script id=script_leds_end>


<!--
	<img src=/imgs/btn/brdb.png onclick="dhtml('onclick'); return false" height=100 border=0>dhtml
	-->

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

	<img id=img_toggles title="          toggles" src=/imgs/btn/koeyew.png onclick="toggle('div_toggles',''); return false;" height=20 border=0>toggles
	<br>
	<hr color=white>
	<div id=div_toggles hidden>
		<img id=img_toggle_alloff title="          alloff" src=/imgs/btn/koeyeb.png onclick="toggles('','alloff'); return false;" height=20 border=0>
		<img id=img_toggle_toggle title="          toggle" src=/imgs/btn/koeye.png onclick="toggles('','toggle'); return false;" height=20 border=0>
		<img id=img_toggle_allon title="          allon" src=/imgs/btn/koeyew.png onclick="toggles('','allon'); return false;" height=20 border=0>
		<br>
		<img id=img_letter title="          letter" src=/imgs/btn/koeye.png onclick="toggles('div_letter',''); return false;" height=20 border=0>
		<img id=img_contacts title="          contacts" src=/imgs/btn/koeye.png onclick="toggles('div_contacts',''); return false;" height=20 border=0>
		<img id=img_items title="          items" src=/imgs/btn/koeye.png onclick="toggles('div_items',''); return false;" height=20 border=0>
		<br>
		<img id=img_main title="          main" src=/imgs/btn/koeye.png onclick="toggles('div_main',''); return false;" height=20 border=0>
		<img id=img_help title="          help" src=/imgs/btn/koeye.png onclick="toggles('div_help',''); return false;" height=20 border=0>
<!--		<img id=img_wz title="          wz" src=/imgs/btn/koeye.png onclick="toggles('div_wz',''); return false;" height=20 border=0> -->
		<img id=img_kojax title="          kojax" src=/imgs/btn/koeye.png onclick="toggles('div_kojax',''); return false;" height=20 border=0>
		<img id=img_files title="          files" src=/imgs/btn/koeye.png onclick="toggles('div_files',''); return false;" height=20 border=0>
		<img id=img_parse title="          parse" src=/imgs/btn/koeye.png onclick="toggles('div_parse',''); return false;" height=20 border=0>
		<img id=img_cfg title="          cfg" src=/imgs/btn/koeye.png onclick="toggles('div_cfg',''); return false;" height=20 border=0>
		<br>
		<img id=img_lists title="          lists" src=/imgs/btn/koeye.png onclick="toggles('div_lists',''); return false;" height=20 border=0>lists


		<img id=img_lists_letter title="          lists_letter" src=/imgs/btn/koeye.png onclick="toggles('div_lists_letter',''); return false;" height=20 border=0>lists_letter
		<img id=img_lists_contacts title="          lists_contacts" src=/imgs/btn/koeye.png onclick="toggles('div_lists_contacts',''); return false;" height=20 border=0>lists_contacts
		<img id=img_items title="          items" src=/imgs/btn/koeye.png onclick="toggles('div_items',''); return false;" height=20 border=0>items
		<img id=img_lists_postturtles title="          lists_postturtles" src=/imgs/btn/koeye.png onclick="toggles('div_lists_postturtles',''); return false;" height=20 border=0>lists_postturtles
		<img id=img_lists_monkeytraps title="          lists_monkeytraps" src=/imgs/btn/koeye.png onclick="toggles('div_lists_monkeytraps',''); return false;" height=20 border=0>lists_monkeytraps
		<img id=img_lists_floods title="          lists_floods" src=/imgs/btn/koeye.png onclick="toggles('div_lists_floods',''); return false;" height=20 border=0>lists_floods

		<br>

		<img id=img_views0 title="          views" src=/imgs/btn/koeye.png onclick="toggles('div_views',''); return false;" height=20 border=0>views
		<img id=img_fb title="          fb" src=/imgs/btn/koeye.png onclick="toggles('div_fb',''); return false;" height=20 border=0>fb
		<img id=img_pdf title="          pdf" src=/imgs/btn/koeye.png onclick="toggles('div_pdf',''); return false;" height=20 border=0>pdf
		<img id=img_pn title="          pn" src=/imgs/btn/koeye.png onclick="toggles('div_pn',''); return false;" height=20 border=0>pn
		<img id=img_tl title="          tl" src=/imgs/btn/koeye.png onclick="toggles('div_tl',''); return false;" height=20 border=0>tl
		<img id=img_zm title="          zm" src=/imgs/btn/koeye.png onclick="toggles('div_zm',''); return false;" height=20 border=0>zm
		<img id=img_mp3 title="          mp3" src=/imgs/btn/koeye.png onclick="toggles('div_mp3',''); return false;" height=20 border=0>mp3
		<img id=img_yt title="          mp4" src=/imgs/btn/koeye.png onclick="toggles('div_mp4',''); return false;" height=20 border=0>mp4

		<img id=img_yt title="          yt" src=/imgs/btn/koeye.png onclick="toggles('div_yt',''); return false;" height=20 border=0>yt

		</div id=div_toggles_end>
		<br>
		<hr color=white>

	<img id=img_main src=/imgs/btn/koeyew.png onclick="toggle('div_main',''); return false;" height=20 border=0>div_main
	<br>
	<div id=div_main>
		<h1>div_main</h1>
		</div id=div_main>


	<br>
	<hr color=white>
	<img id=img_help src=/imgs/btn/koeyew.png onclick="toggle('div_help',''); return false;" height=20 border=0>div_help
	<br>
	<div id=div_help>
		<h1>div_help</h1>



	<br>
	<hr color=goldenrod>

		<img id=img_letter src=/imgs/btn/koeye.png onclick="toggle('div_letter',''); return false;" height=20 border=0>div_letter
		<br>
		<div id=div_letter hidden>	

			<div id=div_contact_info>
				<h1>div_contact_info</h1>
				</div id=div_contact_info_end>

			<pre id=pre_letter>
				<h1>letter</h1>

Dear M. 
we need time

- new grandaughter born 20230227 is in ICU with oxigen problems
- doctor requested medical tests for me
- internet cable problems too

can you reschedule/dismiss out Feb 9 summons court date?
ko2.us/law

- jtfdc_20190516_0880_policereport.pdf (summons and police report)
- jtfdc_20190516_1700_sk_protect.pdf (wifes order of protection from G. Byrd)
- videos of my police calls for help and the police tazor response


the case is about a 20190516 alleged "chestbump" assault against
Gary Byrd and a "door" assault against a "special person" (stlc police)

the allegation are unsupported by the actual
videos of my police calls for help, police tazor response and Mr Byrds pattern and practice
of threats, bullying and trespass over the last 10 years.

our situation is really all about a 10 year dispute over
big dogs, property and safety of small children

We have been targeted by
Ms Joan Donovan Family Law and her a handful of recruited client neighbors
attempts to force us from our home in a private 3 house court .

Ms Donovans legal strategy involving
false police reports, endless legal fees, 
thier 9 freeroaming big dogs and redirected traffic thru our driveway,
has disrupted our lives and business for 10 year.

all documentation, summons, police report, sk order of protection from G. Byrd,
videos, maps, photos are available somewhere online at:

ko2.us/law

Due to the scope and volume of the documentation
the site is evolving into a general
knowledgebase/case managment system portal
that could eventually include aggregated local law news.

you are invited to explore and imagine the potential of this work in progress.

If you are unable to help us,
can you provide a referal for someone to simply 
reschedule/dismiss the Feb 9 court date.

thank you again for your time and consideration

jsk
ko2.us/law


				</pre id=pre_letter_end>
			</div id=div_letter_end>
		</div id=div_help_end>
	<hr color=goldenrod>
	<br>
	<hr color=black>
	<hr color=white>



	<br>
	<hr color=goldenrod>

		<img id=img_items src=/imgs/btn/koeyew.png onclick="toggle('div_items',''); return false;" height=20 border=0>div_items
		<br>
		<div id=div_items hidden>	
			<h1>div_items</h1>
<!--			SET_DHTML( 'img_item_1', 'img_item_2', 'img_item_3','img_item_4', 'img_item_5'); -->
			</div id=div_items_end>
	<hr color=goldenrod>
	<br>
	<hr color=black>
	<hr color=white>
	<br>
	<hr color=goldenrod>
		<img id=img_contacts src=/imgs/btn/koeyew.png onclick="toggle('div_contacts',''); return false;" height=20 border=0>div_contacts
		<br>
		<div id=div_contacts hidden >	
			<h1>div_contacts</h1>
			</div id=div_contacts_end>
		</div id=div_help_end>
	<hr color=goldenrod>
	<br>
	<hr color=black>
	<hr color=white>

		<hr color=goldenrod>
		<a href=/pdf/web/viewer.html?file=/byrdbellvjk/byrdbellvjk.pdf target=_blank>
			<img src=/imgs/btn/koeye_pdf.png height=20>
			</a>byrdbellvjk.pdf
		<a href=/byrdbellvjk/ target=_blank>
			<img src=/byrdbellvjk/pages/1.jpg height=50>
			</a>byrdbellvjk
		<a href=/pdf/web/viewer.html?file=/byrdbellvjk/who2jail.pdf target=_blank>
			<img src=/imgs/btn/koeye_pdf.png height=20>
			</a>byrdbellvjk.pdf
		<hr color=goldenrod>
		<hr color=white>
		<hr color=black>
		</div id=div_help_end>

	





	
	<script id=script_dhtml>
		function dhtml(args) {
//			alert( "BUGS_1000 dhtml args="+args );
			htmout="";
			htmout += "<h1>BUGS_31 DHTML args="+args+"</h1>\n";
//				'img_k9_dhtml',
//				'img_leds_dhtml',
//				'img_ok_dhtml'

<!-- //				SET_DHTML(CURSOR_MOVE, RESIZABLE, NO_ALT, SCROLL, "img_item_1"+TRANSPARENT, "img_item_2"+TRANSPARENT, "button"+VERTICAL+HORIZONTAL+CURSOR_DEFAULT, "cat"+TRANSPARENT, "img_item_3", "counter", "img_item_3"+TRANSPARENT, "img_item_4", "img_item_5", "img_item_6", "img_item_7"+TRANSPARENT+COPY+4, "img_item_8"+TRANSPARENT, "redarrow", "reldiv", "reldivn4", "reldiv2"+TRANSPARENT, "reldiv2n4"+TRANSPARENT, "reltab", "sepline1"+NO_DRAG, "skitour"+TRANSPARENT, "slidercanvas", "smile1"+SCALABLE, "thumb"+HORIZONTAL+MAXOFFLEFT+45+MAXOFFRIGHT+45, "track"+NO_DRAG, "tryit", "upleft"); -->

//			dhtml_divids ="CURSOR_MORE,RESIZABLE,NO_ALT,SCROLL,"; dhtml_length=50;
//			for( j=1; j<dhtml_length; j++ ) {
//				alert( "BUGS_1406 j="+j+" dhtml_divids="+dhtml_divids );
//				dhtml_divids += "'img_item_"+j+"'";
//				dhtml_divids += "+TRANSPARENT+",";
//				}

//			dhtml_divids += "'img_ko_dhtml'";
//			alert( "BUGS_702 dhtml_divids="+dhtml_divids );			
//			SET_DHTML( dhtml_divids );
//			SET_DHTML( 'img_item_1', 'img_item_2', 'img_item_3', 'img_item_4', 'img_item_5', 'img_item_6', 'img_item_7', 'img_item_8');

//			SET_DHTML( 'img_k9_dhtml', 'img_leds_dhtml', 'img_ok_dhtml' );

			return(htmout);
			}
		</script id=script_dhtml_end>

<!--
	<div id="catdIi15v" style="position: absolute; left: 26px; top: 152px; widt    h: 129px; height: 154px; z-index: 1; cursor: move;">
		<img name="catdIi15vNI1m6G" src="/js/wz/wz_ddcat.jpg" width="129" h    eight="154">
		</div>

	<div id="bikegoeteborgdIi15v" style="position: absolute; left: 171px; top:     522px; width: 426px; height: 444px; z-index: 1; cursor: move;">
		<img name="bikegoeteborgdIi15vNI1m6G" src="/js/wz/wz_northcapetrip_goeteborg.jpg" width="426" height="444"></div>
		</div id=div_330_end>
	-->

<link rel="stylesheet" type="text/css" href="/js/wz/newwalterzorn.css">
<style type="text/css">
<!--
#reltab {
  position:relative;
  border:1px solid #000099;
  background:#d3e3f9;
  layer-background-color:#d3e3f9;
}

#notice {
  position:absolute;
  left:6px;
  top:380px;
  width:122px;
  border:1px solid #000099;
  background:#eeeeee;
  layer-background-color:#eeeeee;
  overflow:hidden;
  visibility:hidden;
}

#innotice {
  padding:3px;
}

#bluelyr {
  position:absolute;
  visibility:hidden;
  left:0px;
  top:2000px;
  width:460px;
  padding:20px;
  border:1px solid #000099;
  background:#d3e3f9;
  layer-background-color:#d3e3f9;
  visibility:hidden;
}
-->
	</style>



	<img id=img_wz name=img_wz src=/imgs/btn/koeye.png onclick="toggle('div_wz',''); return false;" height=15 border=0>wz
	<br>
	<hr color=goldenrod>
	<div id=div_wz>





<script id=script_set_dhtml>
	function set_dhtmls(args) {
// SET_DHTML1(
dhtmls='CURSOR_MOVE, RESIZABLE, NO_ALT, SCROLL, "bikegoeteborg"+TRANSPARENT, "bluelyr"+TRANSPARENT, "button"+VERTICAL+HORIZONTAL+CURSOR_DEFAULT, "cat"+TRANSPARENT, "chameleon", "counter", "notice"+TRANSPARENT, "koala", "leop", "low", "muckl"+TRANSPARENT+COPY+4, "wz_northcape"+TRANSPARENT, "redarrow", "reldiv", "reldivn4", "reldiv2"+TRANSPARENT, "reldiv2n4"+TRANSPARENT, "reltab", "sepline1"+NO_DRAG, "skitour"+TRANSPARENT, "slidercanvas", "smile1"+SCALABLE, "thumb"+HORIZONTAL+MAXOFFLEFT+45+MAXOFFRIGHT+45, "track"+NO_DRAG, "tryit", "upleft");';
// );
		return(htmout);
		}
	</script id_script_set_dhtml>


<h1>/ko/help.html 20230210_2030</h1>
<hr color=black>

<!--
	<a id=href_koeye_handhither name=href_koeye_handhither href=/imgs/btn/koeye_handhither.gif target=_blank>
		<img id=img_koeye_handhither name=img_koeye_handhither src=/imgs/btn/koeye_handhither.gif height=100 border=0>
		</a>
	-->

	<img name="cat" src="/byrdbellvjk/imgs/170.jpg" alt="DragnDrop Image" style="visibility: hidden;" width="129" height="154" onclick="window.open('/byrdbellvjk/imgs/170.jpg'); return false">

	<img name="chameleon" src="/byrdbellvjk/imgs/171.jpg" alt="JavaScript, DHTML: Drag&amp;Drop Images" style="visibility: hidden;" width="155" height="95" align="left" onclick="window.open('/byrdbellvjk/imgs171.jpg'); return false;">
	<img name="bikegoeteborg" src="/fb/jtfdcr/pages/1.jpg" alt="bikegoeteborg" title="bikegoeteborg" style="visibility: hidden;" width="426" height="444" border="0" align="left">


<!--
	<img name="cat" src="/js/wz/wz_ddcat.jpg" alt="DragnDrop Image" style="visibility: hidden;" width="129" height="154" onclick="window.open('/js/wz/wz_ddcat.jpg'); return false">
	<img name="chameleon" src="/js/wz/wz_ddcham.jpg" alt="JavaScript, DHTML: Drag&amp;Drop Images" style="visibility: hidden;" width="155" height="95" align="left" onclick="window.open('/js/wz/wz_ddcham.jpg'); return false;">
	<img name="bikegoeteborg" src="/js/wz/wz_northcapetrip_goeteborg.jpg" alt="On my first bicycle trip to Northcape" title="On my first bicycle trip to Northcape" style="visibility: hidden;" width="426" height="444" border="0" align="left">
	-->
<!--
<div id="div_notice_old" style="width: 122px; height: 305px; top: 337px; left: 1399px; z-index: 0; cursor: move; visibility: visible;">
	<a name="demolyr"> </a>
	<div id=div_innotice_old>
	<h1>BUGS_1660 DIV_NOTICE_OLD</h1>
	<center>
		<img name="button" src=/imgs/btn/koeyew.png alt="wz_dd" style="visibility: hidden;" height=20>
<hr color=black>
<hr color=white>
	-->
<!--
    <small>capabilities...
	<br>&nbsp;<br>
	timelines flipbooks zooms pdfs video 
	<br>&nbsp;<br>
	-->
<!--

	<a href=/pdf/web/viewer.html?file=/byrdbellvjk/byrdbellvjk.pdf target=_blank> 
	<img title="          byrdbellvjk.pdf" src=/imgs/btn/koeye_pdf.png height=15 border=0> </a>
	<br>
	<a href=/law/tls.html target=_blank> <img title="         timelines" src=/imgs/btn/tl.png height=40 border=0> </a>
	<br>
	<hr color=white>
	<font style="font-size:6">20190516 08:20 08:30</font>
	<a href=/byrdbellvjk/mp3/jtfdc_20190516_0830_1m23-1m33.mp3 target=_blank>
<img title=jtfdc_20190516_0830_1m23-1m33 src=/imgs/btn/koeye_mp3.png height=15 border=0></a>
<br> <br>
	<a href=/byrdbellvjk/mp4/jtfdc_byrd_20190516_0820.mp4 target=_blank > <img title=20190516_0820_jk_policecall src=/byrdbellvjk/mp4/tn_jtfdc_byrd_20190516_0820.png height=20 border=0> </a>
	<a href=/byrdbellvjk/mp4/jtfdc_byrd_20190516_0830.mp4 target=_blank > <img title=20190516_0830_jk_police_response src=/byrdbellvjk/mp4/tn_jtfdc_byrd_20190516_0830.png height=20 border=0> </a>
	<br>
	<hr color=white>
<font style="font-size:8">byrd</font>
<br>
<font style="font-size:6">20150530 20180606 20190528</font>
<br>
	-->
<!--
<a href=/byrdbellvjk/mp4/jtfdc_20160530_1317_byrd_trustee_threat.mp4 target=_blank> <img title="      20160530_1317_byrd_threat" src=/byrdbellvjk/mp4/jtfdc_20160530_1317_byrd_trustee_threat.jpg height=40 border=0></a>
	-->
<!--
<a href=/byrdbellvjk/mp4/jtfdc_20160530_1327_byrd_trustee_threat.mp4 target=_blank> <img title="      20160530_1327_byrd_threat" src=/byrdbellvjk/mp4/jtfdc_20160530_1317_byrd_trustee_threat.jpg height=20 border=0></a>

<a href=/byrdbellvjk/mp4/jtfdc_byrd_20180606_1648_threats_bucket_theft.mp4 target=_blank> <img title="          byrd_20180606_1648_threats_bucket_theft" src=/byrdbellvjk/mp4/jtfdc_byrd_20180606_1648_threats_bucket_theft.jpg height=20 border=0></a>

	<a href=/byrdbellvjk/mp4/jtfdc_20190528_1636_stalkaround_byrd_siegrist_dogs_marshall_yourself.mp4 target=_blank > <img title=20190528_1636_byrd_marshall_yourself src=/byrdbellvjk/mp4/jtfdc_20190528_1636_stalkaround_byrd_siegrist_dogs_marshal_yourself.jpg height=20 border=0> </a>
<hr color=white>
<hr color=black>


<a href=/fb/law/jkwiiv_byrdbell/zm/zm_donutvanlaw_takings.html target=_blank>
<img title="          donutvanlaw_takings"
src=/fb/law/jkwiiv_byrdbell/zm/donutvanlaw_takings/TileGroup0/0-0-0.jpg
height=25 border=0></a>

<a href=/fb/law/jkwiiv_byrdbell/zm/zm_jtfinc.html target=_blank>
<img title="          jtfinc"
src=/fb/law/jkwiiv_byrdbell/zm/jtfinc/TileGroup0/0-0-0.jpg
height=25 border=0></a>

<a href=/fb/law/jkwiiv_byrdbell/zm/zm_jtf2930.html  target=_blank>
<img title="          jtf2930" src=/fb/law/jkwiiv_byrdbell/zm/jtf2930/TileGroup0/0-0-0.jpg height=25 border=0></a>
<hr color=white>
<hr color=black>




		</center>


	-->
<!--
	<a href="#flexlyr">flexlyr </a><br>
	<a href="#div_letter">letter </a><br>
	<a href="#div_items">items </a><br>
	<a href="#div_contacts">contacts </a><br>
	-->
<!--
	<br>&nbsp;<br>&nbsp;
    </small>





		</div id=innotice_end>
	</div id=div_unknown >
	-->

<!--
<div id="div_bluelyr" hidden style="width: 460px; height: 77px; top: -149px; left: 519px; z-index: 0; cursor: move; visibility: visible;">
  <a name="flexlyr"> </a>
  <center>
    Check out if links in drag&amp;drop layers work correctly.
    And if they connect to their targets correctly, even after the layers have been dragged around...
    <small><br>&nbsp;<br><a href="#demolyr">Back to first layer</a></small>
  </center>
	</div id=div_bluelyr_end>
	-->

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

SET_DHTML(CURSOR_MOVE, RESIZABLE, NO_ALT, SCROLL, "bikegoeteborg"+TRANSPARENT, "bluelyr"+TRANSPARENT, "button"+VERTICAL+HORIZONTAL+CURSOR_DEFAULT, "cat"+TRANSPARENT, "chameleon", "counter", "notice"+TRANSPARENT, "koala", "leop", "low", "muckl"+TRANSPARENT+COPY+4, "wz_northcape"+TRANSPARENT, "redarrow", "reldiv", "reldivn4", "reldiv2"+TRANSPARENT, "reldiv2n4"+TRANSPARENT, "reltab", "sepline1"+NO_DRAG, "skitour"+TRANSPARENT, "slidercanvas", "smile1"+SCALABLE, "thumb"+HORIZONTAL+MAXOFFLEFT+45+MAXOFFRIGHT+45, "track"+NO_DRAG, "tryit", "upleft");

// Kreuzotter-vs-Uplefts Animation, demonstrating how to use the API of the DragDrop-Library
function ANIM()
{
    if (!dd.obj || !dd.op6)
    {
        if (dd.elements.low.z <= dd.elements.upleft.z)
            dd.elements.upleft.setZ(dd.elements.low.z - 1);

        dd.elements.upleft.moveTo(
            dd.elements.upleft.x <= -dd.elements.upleft.w?
                iW - dd.elements.upleft.w - 20 :
                (dd.elements.upleft.x - 3),
            (dd.obj==dd.elements.upleft)?
                dd.elements.upleft.y :
                (dd.elements.low.y - dh)
        );

        dd.elements.low.moveTo(
            dd.elements.low.x <= -dd.elements.low.w?
                iW-dd.elements.low.w-20 :
                (dd.elements.low.x-5),
            dd.elements.upleft.y + dh
        );
    }
    setTimeout("ANIM()", dd.kq? 200 : 100);
}


// override funcs defined within the Lib
function my_PickFunc()
{
    if (dd.obj.name == 'button') dd.obj.swapImage(insetbutton.src);
    if (!dd.obj.name.indexOf('muckl') && dd.obj.x == dd.obj.defx)
    {
        if (dd.elements.muckl.copies.length < 80) dd.elements.muckl.copy();
    }
}

function my_DragFunc()
{
    if (dd.obj.name == 'thumb')
    {
        var red = parseInt((dd.elements.thumb.x-dd.elements.thumb.defx)*255/45),
        blue = -red,
        green = (255-Math.abs(red)).toString(16);
        red = (red > 0? red : 0).toString(16);
        blue = (blue > 0? blue : 0).toString(16);
        while (red.length < 2) red = '0'+red;
        while (blue.length < 2) blue = '0'+blue;
        while (green.length < 2) green = '0'+green;
        dd.elements.slidercanvas.setBgColor("#"+red+green+blue);
    }
}

function my_DropFunc()
{
    if (dd.obj.name == 'button')
    {
        dd.obj.swapImage(outsetbutton.src);
        var minh = dd.elements.button.h+((dd.elements.button.y-dd.elements.notice.y)<<1);
        dd.elements.notice.resizeTo(
            dd.elements.notice.w,
            (dd.elements.notice.h != minh)? minh : 300
        );
    }
}


var outsetbutton = new Image();
outsetbutton.src = '/imgs/btn/koeyeb.png';
var insetbutton = new Image();
insetbutton.src = '/imgs/btn/koeyew.png';



var iW = dd.getWndW(),
dh = dd.elements.upleft.h - dd.elements.low.h;
ANIM();

dd.elements.bluelyr.moveTo(
    (iW-dd.elements.bluelyr.w)>>1,
    dd.elements.counter.defy-dd.elements.bluelyr.h-30
);
dd.elements.notice.moveTo(dd.elements.sepline1.x-2, dd.elements.sepline1.y+110);
dd.elements.bluelyr.show();
dd.elements.notice.show();

dd.elements.thumb.moveTo(dd.elements.track.x+36, dd.elements.track.y);
dd.elements.thumb.setZ(dd.elements.track.z+1);
dd.elements.track.addChild('thumb');
dd.elements.thumb.defx = dd.elements.track.x+36;
//-->
	</script id=script_script1_end>


<div id="koIi15v" style="position: absolute; left: 1123px; top: 3361px; width: 97px; height: 41px; z-index: 0; cursor: move;">
	<img name="koIi15vNI1m6G" src="/imgs/btn/ko.png" width="97" height="41"></div>

<div id=div_330 hidden>
<div id="upleftdIi15v" style="position: absolute; left: 1123px; top: 3361px; width: 97px; height: 41px; z-index: 0; cursor: move;">
	<img name="upleftdIi15vNI1m6G" src="/js/wz/wz_upleft.gif" width="97" height="41"></div>
<div id="tryitdIi15v" style="position: absolute; left: 320px; top: 469px; width: 50px; height: 17px; z-index: 1; cursor: move;">
	<img name="tryitdIi15vNI1m6G" src="/js/wz/wz_tryit.gif" width="50" height="17"></div>
<div id="trackdIi15v" style="position: absolute; left: 0px; top: 0px; width: 94px; height: 35px; z-index: 1; cursor: auto;">
	<img name="trackdIi15vNI1m6G" src="/js/wz/wz_track.gif" style="display: none !important;" width="94" hidden="" height="35"></div>
<div id="thumbdIi15v" style="position: absolute; left: 36px; top: 0px; width: 22px; height: 35px; z-index: 3; cursor: move;">
	<img name="thumbdIi15vNI1m6G" src="/js/wz/wz_sliderthumb.gif" width="22" height="35"></div>
<div id="smile1dIi15v" style="position: absolute; left: 1317px; top: 200px; width: 11px; height: 11px; z-index: 1; cursor: move;">
	<img name="smile1dIi15vNI1m6G" src="/js/wz/wz_smile.gif" width="11" height="11"></div>
<div id="slidercanvasdIi15v" style="position: absolute; left: 1088px; top: 3041px; width: 300px; height: 120px; z-index: 1; cursor: move;">
	<img name="slidercanvasdIi15vNI1m6G" src="/js/wz/transparent_300_120.gif" width="300" height="120"></div>
<div id="skitourdIi15v" style="position: absolute; left: 171px; top: 1517px; width: 550px; height: 298px; z-index: 1; cursor: move;">
	<img name="skitourdIi15vNI1m6G" src="/js/wz/wz_skitour_suedtirol_2.jpg" width="550" height="298"></div>
<div id="sepline1dIi15v" style="position: absolute; left: 1401px; top: 227px; width: 1px; height: 1px; z-index: 1; cursor: auto;">
	<img name="sepline1dIi15vNI1m6G" src="/js/wz/transparentpixel.gif" width="1" height="1"></div>
<div id="redarrowdIi15v" style="position: absolute; left: 171px; top: 3637px; width: 15px; height: 13px; z-index: 1; cursor: move;">
	<img name="redarrowdIi15vNI1m6G" src="/js/wz/wz_redarrow.gif" width="15" height="13"></div>
<div id="northcapedIi15v" style="position: absolute; left: 1123px; top: 2364px; width: 265px; height: 410px; z-index: 1; cursor: move;">
	<img name="northcapedIi15vNI1m6G" src="/js/wz/wz_nothcapetrip2_northcape.jpg" width="265" height="410"></div>
<div id="muckldIi15v" style="position: absolute; left: 171px; top: 3166px; width: 100px; height: 130px; z-index: 1; cursor: move;">
	<img name="muckldIi15vNI1m6G" src="/js/wz/wz_muckl.jpg" width="100" height="130"></div>
<div id="muckl1dIi15v" style="position: absolute; left: 171px; top: 3166px; width: 100px; height: 130px; z-index: 2; cursor: move;">
	<img name="muckl1dIi15vNI1m6G" src="/js/wz/wz_muckl.jpg" width="100" height="130"></div>
<div id="muckl2dIi15v" style="position: absolute; left: 171px; top: 3166px; width: 100px; height: 130px; z-index: 3; cursor: move;">
	<img name="muckl2dIi15vNI1m6G" src="/js/wz/wz_muckl.jpg" width="100" height="130"></div>
<div id="muckl3dIi15v" style="position: absolute; left: 171px; top: 3166px; width: 100px; height: 130px; z-index: 4; cursor: move;">
	<img name="muckl3dIi15vNI1m6G" src="/js/wz/wz_muckl.jpg" width="100" height="130"></div>
<div id="muckl4dIi15v" style="position: absolute; left: 171px; top: 3166px; width: 100px; height: 130px; z-index: 5; cursor: move;">
	<img name="muckl4dIi15vNI1m6G" src="/js/wz/wz_muckl.jpg" width="100" height="130"></div>
<div id="lowdIi15v" style="position: absolute; left: 643px; top: 3377px; width: 62px; height: 25px; z-index: 1; cursor: move;">
	<img name="lowdIi15vNI1m6G" src="/js/wz/zn_low.gif" width="62" height="25"></div>
<div id="leopdIi15v" style="position: absolute; left: 1084px; top: 1145px; width: 300px; height: 205px; z-index: 1; cursor: move;">
	<img name="leopdIi15vNI1m6G" src="/js/wz/wz_ddleop.jpg" width="300" height="205"></div>
<div id="koaladIi15v" style="position: absolute; left: 1228px; top: 3594px; width: 160px; height: 213px; z-index: 1; cursor: move;">
	<img name="koaladIi15vNI1m6G" src="/js/wz/wz_ddkoala.jpg" width="160" height="213"></div>
<div id="chameleondIi15v" style="position: absolute; left: 171px; top: 1969px; width: 155px; height: 95px; z-index: 1; cursor: move;">
	<img name="chameleondIi15vNI1m6G" src="/js/wz/wz_ddcham.jpg" width="155" height="95"></div>
<div id="catdIi15v" style="position: absolute; left: 26px; top: 152px; width: 129px; height: 154px; z-index: 1; cursor: move;">
	<img name="catdIi15vNI1m6G" src="/js/wz/wz_ddcat.jpg" width="129" height="154"></div>
	<div id="buttondIi15v" style="position: absolute; left: 1430px; top: 340px; width: 60px; height: 17px; z-index: 1; cursor: default; visibility: visible;">
	<img name="buttondIi15vNI1m6G" src="/js/wz/wz_button_outset.gif" width="60" height="17"></div>
<div id="bikegoeteborgdIi15v" style="position: absolute; left: 171px; top: 522px; width: 426px; height: 444px; z-index: 1; cursor: move;">
	<img name="bikegoeteborgdIi15vNI1m6G" src="/js/wz/wz_northcapetrip_goeteborg.jpg" width="426" height="444"></div>
	</div id=div_330_end>


	<br>
	<hr color=black>
	<hr color=white>
<!--
	<img id=img_wz name=img_wz src=/imgs/btn/koeye.png onclick="toggle('div_wz',''); return false;" height=15 border=0>wz
	<br>
	<hr color=goldenrod>
	<div id=div_wz>
	-->


		<h1>div_wz<h1>
<!--
	<img id=img_dhtml name=img_dhtml src=/imgs/btn/koeye.png onclick="toggle('div_dhtml',''); return false;" height=15 border=0>dhtml
	<br>
	<hr color=goldenrod>
	<div id=div_dhtml hidden>
		<h1>div_dhtml</h1>
		</div id=div_dhtml_end>
	<img id=img_set_dhtml name=img_set_dhtml src=/imgs/btn/koeye.png onclick="toggle('div_set_dhtml',''); return false;" height=15 border=0>set_dhtml
	<br>
	<hr color=goldenrod>
	<div id=div_set_dhtml hidden >
		<h1>div_set_dhtml</h1>
		</div id=div_set_dhtml_end>
<title>JavaScript: DHTML Library, Drag &amp; Drop for Images and Layers</title>
	-->

	<hr color=black>
	<hr color=white>
	</div id=div_wz_end>
	<br>
	<hr color=white>
	<hr color=black>




	<script id="script_jaxs" type="text/javascript">
//			var kolists = new Array();
//		`	kolists[''] = '';
			kolists['default'] = 'pages/1.jpg\npages/2.jpg\npages/3.jpg';
			kolists['blobs2'] = '
blob|/imgs/btn/blob.png|name_blob|color|size|link|
blob1|/imgs/btn/blob1.png|name_blob1|color|size|link|
blob2|/imgs/btn/blob2.png|name_blob2|color|size|link|
blob3|/imgs/btn/blob3.png|name_blob3|color|size|link|
blob0|/imgs/btn/blob0.png|name_blob0|color|size|link|
blob_w|/imgs/btn/blob_w.png|name_blob_w|color|size|link|
blob_b|/imgs/btn/blob_b.png|name_blob_b|color|size|link|
blob_m|/imgs/btn/blob_m.png|name_blob_m|color|size|link|
blob_default|/imgs/btn/blob_default.png|name_blob_default|color|size|link|
';
			kolists['jax'] = 'jax/pages/1.jpg\njax/pages/2.jpg\njax/pages/3.jpg';
//			kolists['jax'] = kolists['default'];
			kolists['fb'] = '/fb/pages/1.jpg\n/fb/pages/2.jpg\n/fb/pages/3.jpg';
			kolists['konet'] = '/fb/jtfdcr/pages/1.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
			kolists['iperms'] = '/fb/jtfdcr/pages/1.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
			kolists['jtfdcr'] = '/fb/jtfdcr/pages/1.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
kolists['av'] = `

`;

kolists['fb'] = 
`pages/1.jpg
pages/2.jpg
pages/3.jpg
pages/4.jpg
pages/5.jpg
pages/6.jpg
pages/7.jpg
pages/8.jpg
pages/9.jpg
`;

kolists['bb'] = ``;
kolists['dd'] = ``;

kolists['sl'] = `

`;
kolists['tm'] = ``;

kolists['tl'] = `

`;

kolists['us'] = 
`usid|us_name|us_img|us_tn|us_desc|us_link
usid|us_name1|us_img1|us_tn1|us_desc1|us_link1
`;

kolists['yt'] = `
yt_20200408_mcduff|https://www.youtube.com/watch?v=baK-7kr-zoo
yt_20200408_webb|https://www.youtube.com/watch?v=QdZ-vfJSE9U
yt_20200407_webb|https://www.youtube.com/watch?v=R4dLXs0PIrI
yt_20200406_webb|https://www.youtube.com/watch?v=xgtAHyssRmo
yt_20150625_chrisrea_somewhere_between_stars_santo_spirito|https://www.youtube.com/watch?v=0RF1mXxAhys
yt_20200331_carlin_germs|https://www.youtube.com/watch?v=l_L6AS1Huno
yt_20190311_bob_dylan_gotta_serve_somebody_audio|https://www.youtube.com/watch?v=wC10VWDTzmU
yt_20200407_stroppyme|https://www.youtube.com/watch?v=unNuvGJ3ses
yt_20200406_autodidactic_chinese_tartate_1729|https://www.youtube.com/watch?v=bwoF1MlckRw
yt_20190905_quinn_timothy_oneil_band_let_it_rain_official|https://www.youtube.com/watch?v=CHedk8yAF_g
yt_20200407_housitonic|https://www.youtube.com/watch?v=_pBsL0qW2Vs
yt_20200407_amazingpolly|https://www.youtube.com/watch?v=zoK6h4Mg7E8
yt_20200406_vlad9vt_sicily_polygonal_ancient_masonry|https://www.youtube.com/watch?v=sVMjRmpdUIw
yt_20200404_vlad9vt_malta_magalith|https://www.youtube.com/watch?v=zpHy1Q-fqCU
yt_20200326_borealusforum_wal_thornhil_this_is_our_electric_univers_p1of2|https://www.youtube.com/watch?v=u7peR-2m8XI`;


// kolists['zm'] = ``;









//			alert( "BUGS_5120 jax default_jaxurl="+default_jaxurl );
//			alert( "BUGS_5120 jax jaxurl="+jaxurl );
//			alert( "BUGS_12700 jax kolists_ticktick="+kolists[''] );
//			alert( "BUGS_12700 jax fb="+kolists['fb'] );
//			alert( "BUGS_12701 jax kolists_default="+kolists['default'] );
//			alert( "BUGS_12702 jax kolists_konet="+kolists['default'] );
//			alert( "BUGS_12703 jax kolists_iperms="+kolists['default'] );
//			alert( "BUGS_12704 jax kolists_jtfdcr="+kolists['default'] );
//			alert( "BUGS_12700 jax kolists_jax="+kolists['jax'] );
			</script id=script_lists>



		<script id=script_kojax>
			var default_jaxurl = "main.html";
			var jaxurl = default_jaxurl;
			function kojaxs(jaxurl,divid,callback) {
				if( divid == "" ) { divid="pre_kojax"; }
//				alert( "BUGS_3000 jax jaxurl="+jaxurl+" divid="+divid+" callback="+callback );
				$.ajax({
					url: jaxurl,
					context: document.body,
					success: function(responseText) {
//						alert( "BUGS_12661 jax len="+responseText.split("\n").length+"  responseText="+responseText );
						kolists['jax'] = responseText;
						alert( "BUGS_12662 jax kolists_jax="+kolists['jax'] );
						alert( "BUGS_12663 jax kolists_default="+kolists['default'] );
						alert( "BUGS_12664 jax kolists_fb="+kolists['fb'] );
						alert( "BUGS_12665 jax kolists_konet="+kolists['konet'] );
						alert( "BUGS_12666 jax kolists_iperms="+kolists['iperms'] );
						alert( "BUGS_12667 jax kolists_jtfdcr="+kolists['jtfdcr'] );
						$("#div_jax").html(responseText);
						$("#div_jax").find("script").each(function(i) {
						eval($(this).text());
						alert( "BUGS_12662 jax responseText="+responseText );
						return( responseText );
						});
					}
				});
			};
		</script id=script_jax_end>


		<script id="script_jax">
//			alert( "BUGS_5120 jax default_jaxurl="+default_jaxurl );
//			alert( "BUGS_5120 jax jaxurl="+jaxurl );
//			alert( "BUGS_12700 jax kolists_ticktick="+kolists[''] );
//			alert( "BUGS_12700 jax fb="+kolists['fb'] );
//			alert( "BUGS_12701 jax kolists_default="+kolists['default'] );
//			alert( "BUGS_12702 jax kolists_konet="+kolists['default'] );
//			alert( "BUGS_12703 jax kolists_iperms="+kolists['default'] );
//			alert( "BUGS_12704 jax kolists_jtfdcr="+kolists['default'] );
//			alert( "BUGS_12700 jax kolists_jax="+kolists['jax'] );
			var default_jaxurl = "jax.html";
			var jaxurl = default_jaxurl;
			function kojax(jaxurl,divid,callback) {
				if( divid == "" ) { divid="pre_kojax"; }
//				alert( "BUGS_3030 kojax jaxurl="+jaxurl+" divid="+divid+" callback="+callback );
				if(!filecheck(jaxurl)) {
					alert( "BUGS_3001 kojax NOTFOUND jaxurl="+jaxurl );
					return("NOTFOUND="+jaxurl );
					}
				var jaxbak = '-=jaxbak=-';
				kolists['jax'] = '-=jax=-';
//				alert( "BUGS_19500 FOUND jaxurl="+jaxurl );
				$.ajax({
					url: jaxurl,
					context: document.body,
					success: function(responseText) {
// 						alert( "BUGS_19501 jax TXT URL="+jaxurl+" LEN="+responseText.split("\n").length+"  responseText="+responseText );
//						kolists['jax'] = responseText;
						jaxbak = responseText;
// 						alert( "BUGS_19503 jax JAXBAK URL="+jaxurl+" LEN="+jaxbak.split("\n").length+"  responseText="+jaxbak );


						if( document.getElementById(divid)) {
							document.getElementById(divid).innerHTML=responseText;
							}
//						$("#div_jax").html(responseText);
//						$("#pre_kojax").html(responseText);

						var scriptflag = "true";
						if( scriptflag == "true" ) {
							$("#div_jax").find("script").each(function(i) {
								eval($(this).text());
								});
							}
						if( callback == "dd" ) { dd(''); }
						if( callback == "letter" ) { letter(''); }
						if( callback == "contacts" ) { contacts(''); }
						if( callback == "items" ) { items(''); }
					}
				});
// alert( "BUGS_19538 jax end" );
// alert( "BUGS_19601 jax TXT URL="+jaxurl+" LEN="+responseText.split("\n").length+"  responseText="+responseText );
// alert( "BUGS_19602 jax KOL URL="+jaxurl+" LEN="+kolists['jax'].split("\n").length+"  responseText="+kolists['jax'] );
// alert( "BUGS_19603 jax JAXBAK URL="+jaxurl+" LEN="+jaxbak.split("\n").length+"  responseText="+jaxbak );
// 			alert( "BUGS_19539 jax END" );
			return( jaxbak );
			alert( "BUGS_19540 jax END END" );
			};
		</script id=script_jax_end>

	<script id="script_startup3">
		function startup3(args) {
			alert("BUGS_3870 startup3 args="+args );
			var jaxurl=args;
			var href=window.location.href;
			var search=window.location.search;

// http://ka12/fb/stlc/index.html  = index_stlc.html
//			alert( "BUGS_21511 startup args="+args+" href="+href );
			href="/fb/stlc";
			var hrefdirs = href.split("/");
			hrefdirs_len=hrefdirs.length;
			dirnam = hrefdirs[hrefdirs_len-1];
//			alert( "BUGS_21512 startup hrefdirs="+hrefdirs+" href="+href );

			var indexname = href.replace("http://","").replace("/index.html","");
			var indexname_html = "index_"+indexname+".html";
			if( filecheck( indexname_html)) {
//				alert( "BUGS_21512 startup __FOUND indexname_html="+indexname_html+" href="+href );
//				window.open(indexname_html);
//				document.location.href=indexname_html;
				}			
//			alert( "BUGS_21512 startup NOTFOUND indexname_html="+indexname_html+" href="+href );
			htmout_banner=banner('');			
			htmout_grip=grid(args);


			if( /jax/.test(search)) {
				jaxurl = search.split("=")[1];
//				alert( "BUGS_17240 startup jaxurl="+jaxurl );
				}


//			var host=window.location.host;
//			var pathname=window.location.pathname;
//			url_default="fb.json";
//			alert( "BUGS_2591 url_default="+url_default );
//			var replaced =  pathname.replace(/(^\.+|\.+$)/mg, '');
//			if( pathname.endsWith(".htm")) {
//			url_default=pathname.replace(".html",".json" );
//			jaxurl="/av.txt";
//			if(filecheck(jaxurl)) { kolists['av'] = jax(jaxurl); }

//			load_kolists(args);
//			show_kolists(args);
			}
			
		</script id=script_startup_end>



	<style id="style_body_scroll">
		body{ overflow-y:scroll; }
		</style>

	<script id="script_filecheck" >
		function filecheck(url) {
			if(url) {
				var req = new XMLHttpRequest();
				req.open('GET', url, false);
				req.send();
				return req.status==200;
				} 
			else {
				return false;
				}
			}
		</script>

	<script id="script_imgcheck" >
		function imgcheck(url) {
			var img = new Image();
			img.src = url;
			return img.height != 0;
			}
		</script>

	<script id="script_linkcheck" >
		function linkcheck(url) {
			var http = new XMLHttpRequest();
			http.open('HEAD', url, false);
			http.send();
			return http.status!=404;
			}
		</script>

	<script id="script_urlexists" >
		function UrlExists(url) {
			var http = new XMLHttpRequest();
			http.open('HEAD', url, false);
			http.send();
			return http.status!=404;
			}
		</script>

		<script id="script_jax1" >
			function jax1(url) {
				alert( "MSG_11970 jax1 url="+url );
				return("jax1\njax2\njax3" );
				}
			</script>	

		<script id="script_jax2" >
//			function jax2(jaxurl) {
//				alert( "BUGS_12360 jax jaxurl="+jaxurl );
//				$.ajax({
//					url: jaxurl,
//					context: document.body,
//					success: function(responseText) {
//						alert( "BUGS_12661 jax len="+responseText.split("\n").length+"  responseText="+responseText );
////						kolists['jax'] = responseText;
//						alert( "BUGS_12667 jax kolists_jtfdcr="+kolists['jtfdcr'] );
//						}
//					});
//				}
			</script>

	<script id="script_kolists" type="text/javascript">
			var kolists = new Array();
			var divids = "";
//		`	kolists[''] = '';
			divids = 'alloff toggle allon <br> hl av bb dd fb fs pn sl <br> tl tm us yt zm <br> jtfdcr jtfdc jtfinc <br> head body memes kov tail <br> pdfs media cards oklahoma turbulence us2 edu hoa law tclaw zpid fb_law postturtle_monkeytrap soul_lewis';
//			divids = 'alloff toggle allon <br> hl av bb dd fb fs pn sl <br> tl tm us yt zm <br> jtfdcr jtfdc jtfinc <br> head body memes kov tail';
			kolists['divids'] = divids;
//			kolists['divids'] = 'alloff toggle allon <br> hl av bb dd fb fs pn sl tl tm yt zm <br> jtfdcr jtfdc jtfinc <br> head body memes kov tail';
			 
			kolists['default'] = 'pages/1.jpg\npages/2.jpg\npages/3.jpg';
			kolists['jax'] = 'jax/pages/1.jpg\njax/pages/2.jpg\njax/pages/3.jpg';
//			kolists['jax'] = kolists['default'];
			kolists['fb'] = '/fb/pages/1.jpg\n/fb/pages/2.jpg\n/fb/pages/3.jpg';
			kolists['av'] = '/fb/pages/2.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
			kolists['pn'] = '/fb/pages/3.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
			kolists['sl'] = '/fb/pages/4.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
			kolists['tl'] = '/fb/pages/5.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
			kolists['us'] = 'us|link\nus0|uslink0\nus1|uslink1\nus2|uslink2\nus3|uslink3';
			kolists['yt'] = '/fb/pages/6.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
//			kolists['zm'] = '/fb/pages/7.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
			kolists['konet'] = '/fb/konet/pages/1.jpg\n/fb/konet/pages/2.jpg\n/fb/konet/pages/3.jpg';
			kolists['iperms'] = '/fb/iperms/pages/1.jpg\n/fb/iperms/pages/2.jpg\n/fb/iperms/pages/3.jpg';
			kolists['jtfdcr'] = '/fb/jtfdcr/pages/1.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';

kolists['imgs_jukebox'] = 
`/imgs/imgs_jukebox/giphy_us_20.gif
/imgs/imgs_jukebox/jukebox_00.jpg
/imgs/imgs_jukebox/jukebox_01.jpg
/imgs/imgs_jukebox/jukebox_02.jpg
/imgs/imgs_jukebox/jukebox_03.jpg
/imgs/imgs_jukebox/jukebox_05.jpg
/imgs/imgs_jukebox/jukebox_06.jpg
/imgs/imgs_jukebox/jukebox_07.jpg
/imgs/imgs_jukebox/jukebox_08.jpg
/imgs/imgs_jukebox/jukebox_10.jpg
/imgs/imgs_jukebox/jukebox_12.jpg
/imgs/imgs_jukebox/jukebox_14.jpg
/imgs/imgs_jukebox/jukebox_20.gif
/imgs/imgs_jukebox/jukebox_shuttle.gif
/imgs/imgs_jukebox/jukebox_vintage.gif
/imgs/imgs_jukebox/radio02.jpg
/imgs/imgs_jukebox/radio03.jpg
/imgs/imgs_jukebox/radio04.jpg
/imgs/imgs_jukebox/radio06.jpg
/imgs/imgs_jukebox/radio08.jpg
/imgs/imgs_jukebox/radio09.jpg
/imgs/imgs_jukebox/radio10.jpg
/imgs/imgs_jukebox/radio_wave.gif
/imgs/imgs_jukebox/radiowave2.gif
/imgs/imgs_jukebox/record_01.gif
/imgs/imgs_jukebox/record_02.gif
/imgs/imgs_jukebox/record_03.gif
/imgs/imgs_jukebox/record_04.gif
/imgs/imgs_jukebox/record_05.gif
/imgs/imgs_jukebox/record_06.gif
/imgs/imgs_jukebox/record_08.gif
/imgs/imgs_jukebox/record_089gif.gif
/imgs/imgs_jukebox/records_bins.gif
`;	

kolists['blob_img_default'] = `/fb/jtfdc/imgs/tn_jtfdc_sawhorse`;


kolists['blobs'] = 
`ka12|wheat|burlywood|brown|50|/yt/imgs/yt_quinn.png
ka21|yellow|orange|pink|25|/yt/imgs/yt_polly.png
ko0|pink|yellow|red|1|/yt/imgs/yt_paityn.png
ko1|brown|tan|black|2|/yt/imgs/yt_black.png
ko2|tan|brown|white|3|/yt/imgs/yt_carter.png
paityn|#ff2c55|#a0ddff|#ff70a6|10|/yt/imgs/yt_quinn.png|#3bc14a
carter|#8eedf7|#a1cdf1|#9d695a|05|/yt/imgs/yt_quinn.png|orange
jenna|#f05363|#6ef9f5|#8f3985|05|/yt/imgs/yt_quinn.png|#efd9ce
blake|#61a0af|#7dce82|#ff8360|05|/yt/imgs/yt_quinn.png|#daffef
josh|#ef626c|#61e786|#990033|10|/yt/imgs/yt_quinn.png|#edffec
stacey|#63ccca|#ff86c8|#23c0f9|10|/yt/imgs/yt_quinn.png|45f0df
iperms|wheat|burlywood|brown|50|/yt/imgs/yt_quinn.png
iperms|wheat|burlywood|brown|50|/yt/imgs/yt_quinn.png
iperms|wheat|burlywood|brown|50|/yt/imgs/yt_quinn.png
iperms|wheat|burlywood|brown|50|/yt/imgs/yt_quinn.png
konet|linen|darkslategray|gray|50|/imgs/btn/btn_501law.png
law|linen|darkslategray|gray|10|/imgs/btn/btn_501law.png
law_sl|linen|darkslategray|gray|20|/imgs/btn/btn_law_sl.png
law_tc|linen|darkslategray|gray|20|/imgs/btn/btn_law_tc.png
law_tc_kk|linen|darkslategray|gray|50|/imgs/btn/btn_law_tc_kk.png
law_tc_db|linen|darkslategray|gray|50|/imgs/btn/btn_law_tc_db.png
med_kaytel|linen|darkslategray|gray|50|/imgs/btn/btn_med_kaytel.png
med_lele|linen|darkslategray|gray|50|/imgs/btn/btn_med_lele.png
# /imgs/btn/btn_501law.png
# /imgs/btn/btn_dolleylaw.png
# /imgs/btn/btn_paityn.png
# /imgs/btn/btn_carter.png
# /imgs/btn/btn_blake.png
jkwii|blue|red|black|5|/imgs/btn/btn_jkwii.png
skwii|blue|red|black|5|/imgs/btn/btn_skwii.png
jak1|blue|red|black|5|/imgs/btn/btn_jak1.png
jak2|blue|red|black|5|/imgs/btn/btn_jak2.png
jak3|blue|red|black|5|/imgs/btn/btn_jak3.png
`;



kolists['blobs_orig'] = 
`ka12|wheat|burlywood|brown|50|/yt/imgs/yt_quinn.png
ka21|yellow|orange|pink|25|/yt/imgs/yt_polly.png
ko0|pink|yellow|red|1|/yt/imgs/yt_paityn.png
ko1|brown|tan|black|2|/yt/imgs/yt_black.png
ko2|tan|brown|white|3|/yt/imgs/yt_carter.png
iperms|wheat|burlywood|brown|50|/yt/imgs/yt_quinn.png
konet|linen|darkslategray|gray|50|/imgs/btn/btn_501law.png
law|linen|darkslategray|gray|10|/imgs/btn/btn_501law.png
law_tc|linen|darkslategray|gray|20|/imgs/btn/btn_501law.png
law_tc_kk|linen|darkslategray|gray|50|/imgs/btn/btn_501law.png
# /imgs/btn/btn_501law.png
# /imgs/btn/btn_dolleylaw.png
# /imgs/btn/btn_paityn.png
# /imgs/btn/btn_carter.png
# /imgs/btn/btn_blake.png
jkwii|blue|red|black|5|/imgs/btn/btn_jkwii.png
skwii|blue|red|black|5|/imgs/btn/btn_skwii.png
jak1|blue|red|black|5|/imgs/btn/btn_jak1.png
jak2|blue|red|black|5|/imgs/btn/btn_jak2.png
jak3|blue|red|black|5|/imgs/btn/btn_jak3.png
`;

kolists['sounds'] = 
`/gm/sounds/bubbles.mp3
/gm/sounds/giggle_explosion.mp3
/gm/sounds/explosion.wav
/gm/sounds/shoot.wav
/gm/sounds/space_explosion.wav
/gm/sounds/space_shoot.wav
/gm/sounds/giggle_explosion.wav
/gm/sounds/giggle_shoot.mp3
/gm/sounds/giggle_shoot.wav
/gm/sounds/explosion.mp3
/gm/sounds/shoot.mp3
/gm/sounds/space_explosion.mp3
/gm/sounds/space_shoot.mp3
/gm/sounds/giggle_explosion.mp3
/gm/sounds/alarm.mp3
/gm/sounds/apprehensive.mp3
/gm/sounds/aww.mp3
/gm/sounds/ballbounce-172648817.mp3
/gm/sounds/bat_taps.mp3
/gm/sounds/beach_talking_teens.mp3
/gm/sounds/beep.mp3
/gm/sounds/bells.mp3
/gm/sounds/bird_in_Rain.mp3
/gm/sounds/birds_after_rain.mp3
/gm/sounds/bleep.mp3
/gm/sounds/bluejay.mp3
/gm/sounds/bluejay_call2.mp3
/gm/sounds/bounce.mp3
/gm/sounds/breathing.mp3
/gm/sounds/bubbles.mp3
/gm/sounds/bump_large.mp3
/gm/sounds/busy.mp3
/gm/sounds/canadian_geese.mp3
/gm/sounds/cashregister.mp3
/gm/sounds/catch.mp3
/gm/sounds/chain_fence_jump.mp3
/gm/sounds/chains_spooky.mp3
/gm/sounds/charge.mp3
/gm/sounds/charge_2.mp3
/gm/sounds/cheer.mp3
/gm/sounds/chord.mp3
/gm/sounds/clap_stomp.mp3
/gm/sounds/click2.mp3
/gm/sounds/computer_error.mp3
/gm/sounds/cork.mp3
/gm/sounds/countdown.mp3
/gm/sounds/crow.mp3
/gm/sounds/crowd.mp3
/gm/sounds/crumpling.mp3
/gm/sounds/cymbal.mp3
/gm/sounds/day_sunny.mp3
/gm/sounds/demon_girls_mockingbird_hi.mp3
/gm/sounds/digging_in.mp3
/gm/sounds/dooropen.mp3
/gm/sounds/doorslam.mp3
/gm/sounds/drop_fork.mp3
/gm/sounds/dropped_bat.mp3
/gm/sounds/duck_mallard.mp3
/gm/sounds/duck_mallard_quack.mp3
/gm/sounds/duck_pissed.mp3
/gm/sounds/earthquake.mp3
/gm/sounds/exclamation.mp3
/gm/sounds/exhale.mp3
/gm/sounds/explosion.mp3
/gm/sounds/falcon.mp3
/gm/sounds/fall.mp3
/gm/sounds/farm.mp3
/gm/sounds/field.mp3
/gm/sounds/flipflop.mp3
/gm/sounds/frog.mp3
/gm/sounds/fryingpan_hit.mp3
/gm/sounds/fryingpan_impact.mp3
/gm/sounds/giggle.mp3
/gm/sounds/giggle_funny_kid.mp3
/gm/sounds/giggle_kid.mp3
/gm/sounds/gong.mp3
/gm/sounds/hit.mp3
/gm/sounds/horned_owl.mp3
/gm/sounds/laugh_goofy.mp3
/gm/sounds/laugh_monster.mp3
/gm/sounds/laughing_kookaburra_birds.mp3
/gm/sounds/lets_go.mp3
/gm/sounds/mars_attacks.mp3
/gm/sounds/meadowlark.mp3
/gm/sounds/meoutake.mp3
/gm/sounds/merlin.mp3
/gm/sounds/moan.mp3
/gm/sounds/panica.mp3
/gm/sounds/parots_talking.mp3
/gm/sounds/phaser.mp3
/gm/sounds/phone.mp3
/gm/sounds/ping.mp3
/gm/sounds/pterodactyl_screech.mp3
/gm/sounds/rainstorm_april_45m.mp3
/gm/sounds/rooster_crow.mp3
/gm/sounds/sewing_machine.mp3
/gm/sounds/shampoo_hair.mp3
/gm/sounds/shoot.mp3
/gm/sounds/sigh.mp3
/gm/sounds/sigh_female.mp3
/gm/sounds/sigh_heavy.mp3
/gm/sounds/sigh_little_girl.mp3
/gm/sounds/siren_tornado.mp3
/gm/sounds/skipping_cd.mp3
/gm/sounds/slide.mp3
/gm/sounds/slip.mp3
/gm/sounds/slip_bananapeel.mp3
/gm/sounds/slip_strange.mp3
/gm/sounds/sonar.mp3
/gm/sounds/sonar_ping.mp3
/gm/sounds/space_explosion.mp3
/gm/sounds/space_shoot.mp3
/gm/sounds/spli_funny.mp3
/gm/sounds/starting_pistol.mp3
/gm/sounds/suspense_climactic.mp3
/gm/sounds/termites_and_ants.mp3
/gm/sounds/tree_fall_small.mp3
/gm/sounds/walking_snow.mp3
/gm/sounds/warbling_vireo.mp3
/gm/sounds/whoosh.mp3
/gm/sounds/whoosh_pitch.mp3
/gm/sounds/yahoo.mp3
/gm/sounds/bounce.wav
/gm/sounds/explosion.wav
/gm/sounds/shoot.wav
/gm/sounds/space_explosion.wav
/gm/sounds/space_shoot.wav
/gm/sounds/giggle_shoot.mp3
`;

kolists['mp3_bavaria'] = 
`/kb/mp3/bavaria/bavaria04a.mp3
/kb/mp3/bavaria/bavaria04b.mp3
/kb/mp3/bavaria/bavaria06a.mp3
/kb/mp3/bavaria/bavaria_01_b02.mp3
/kb/mp3/bavaria/bavaria_03_b12.mp3
/kb/mp3/bavaria/bavaria_04_b13.mp3
/kb/mp3/bavaria/bavaria_a15.mp3
/kb/mp3/bavaria/bavaria_a17.mp3
/kb/mp3/bavaria/bavaria_b01.mp3
/kb/mp3/bavaria/bavaria_b05.mp3
/kb/mp3/bavaria/bavaria_b09.mp3
/kb/mp3/bavaria/bavaria_b10.mp3
/kb/mp3/bavaria/bavaria_b18.mp3
/kb/mp3/dj_ethnic/dj_ethnic_barry_sisters-fargess_mich_nit.mp3
/kb/mp3/dj_ethnic/dj_ethnic_barry_sisters-ja_mein_liebe_tochter.mp3
/kb/mp3/dj_ethnic/dj_ethnic_barry_sisters-papirossen.mp3
/kb/mp3/dj_ethnic/dj_ethnic_barry_sisters-tum_balalaika.mp3
/kb/mp3/dj_ethnic/dj_ethnic_eli_eli.mp3
/kb/mp3/dj_ethnic/dj_ethnic_kibbutz_wedding.mp3
/kb/mp3/dj_ethnic/dj_ethnic_meshuggeneh-rumania.mp3
/kb/mp3/dj_ethnic/dj_ethnic_russian_gypsy_balalaika.mp3
/kb/mp3/dj_ethnic/dj_ethnic_tumalalaika-herschel_bernardi.mp3
/kb/mp3/doris_day/danny_kaye-inchworm.mp3
/kb/mp3/doris_day/danny_kaye-thumbelina.mp3
/kb/mp3/doris_day/debbie_reynolds-tammy.mp3
/kb/mp3/doris_day/doris_day-buttons_and_bows.mp3
/kb/mp3/doris_day/doris_day-que_sera_sera.mp3
/kb/mp3/doris_day/doris_day-secret_love.mp3
/kb/mp3/doris_day/doris_day-you_are_my_sunshine.mp3
/kb/mp3/eva_casidy/eva_cassidy-aint_no_sunshine.mp3
/kb/mp3/eva_casidy/eva_cassidy-kathys_song.mp3
/kb/mp3/eva_casidy/eva_cassidy-track_10.mp3
/kb/mp3/eva_casidy/eva_cassidy-track__1.mp3
/kb/mp3/eva_casidy/eva_cassidy-track__3.mp3
/kb/mp3/eva_casidy/eva_cassidy-what_a_wonderful_world.mp3
/kb/mp3/eva_casidy/eva_cassidy_-fever.mp3
/kb/mp3/favs/oscar_brand-bless_em_all.mp3
/kb/mp3/inkspots/ink_spots-i_dont_want_to_set_the_world_on_fire_1941.mp3
/kb/mp3/inkspots/ink_spots-if_i_didnt_care.mp3
/kb/mp3/inkspots/ink_spots-ill_never_smile_again.mp3
/kb/mp3/kids/disney-electric_light_parade.mp3
/kb/mp3/kids/disney-its_a_small_world_after_all.mp3
/kb/mp3/notfound.mp3
/kb/mp3/richie_havens/richie_havens-03-my_fathers_shoes.mp3
/kb/mp3/richie_havens/richie_havens-05-the_hawk.mp3
/kb/mp3/richie_havens/richie_havens-07-the_times_they_are_a-changin.mp3
/kb/mp3/richie_havens/richie_havens-10-how_the_nights_can_fly.mp3
/kb/mp3/richie_havens/richie_havens-13-at_a_glance.mp3
/kb/mp3/rupert_hine/rupert_hine-01-landscape.mp3
/kb/mp3/rupert_hine/rupert_hine-02-ass_all.mp3
/kb/mp3/rupert_hine/rupert_hine-03-me_you_mine.mp3
/kb/mp3/rupert_hine/rupert_hine-04-scarecrow.mp3
/kb/mp3/rupert_hine/rupert_hine-05-kerosene.mp3
/kb/mp3/rupert_hine/rupert_hine-06-running_away.mp3
/kb/mp3/rupert_hine/rupert_hine-07-medicine_munday.mp3
/kb/mp3/rupert_hine/rupert_hine-08-more_than_one_less_then_five.mp3
/kb/mp3/rupert_hine/rupert_hine-09-boo_boos_faux_pas.mp3
/kb/mp3/rupert_hine/rupert_hine-10-pick_up_a_bone.mp3
/kb/mp3/rupert_hine/rupert_hine-11-instant_muse.mp3
/kb/mp3/start_today_again/01-if_i_could_start_today_again.mp3
/kb/mp3/start_today_again/01-lonely_girls.mp3
/kb/mp3/start_today_again/02-change_your_mind.mp3
/kb/mp3/start_today_again/02-steal_your_love.mp3
/kb/mp3/start_today_again/03-i_envy_the_wind.mp3
/kb/mp3/start_today_again/03-midnight_rain.mp3
/kb/mp3/start_today_again/04-blue.mp3
/kb/mp3/start_today_again/04-i_close_my_eyes_and_think_of_you.mp3
/kb/mp3/start_today_again/05-out_of_touch.mp3
/kb/mp3/start_today_again/05-somewhere_in_the_city.mp3
/kb/mp3/start_today_again/06-are_you_down.mp3
/kb/mp3/start_today_again/06-just_about_to_break.mp3
/kb/mp3/start_today_again/07-essence.mp3
/kb/mp3/start_today_again/07-love_is_the_law.mp3
/kb/mp3/start_today_again/08-reason_to_cry.mp3
/kb/mp3/start_today_again/08-the_pretty_place.mp3
/kb/mp3/start_today_again/09-get_right_with_god.mp3
/kb/mp3/start_today_again/09-i_wasted_time.mp3
/kb/mp3/start_today_again/10-bus_to_baton_rouge.mp3
/kb/mp3/start_today_again/10-would_you_be_my_friend.mp3
/kb/mp3/start_today_again/11-broken_butterflies.mp3
/kb/mp3/start_today_again/11-smoke_under_the_bridge.mp3
/kb/mp3/sweethearts_rodeo/sweethearts_of_the_rodeo-catch_the_wind.mp3
/kb/mp3/sweethearts_rodeo/sweethearts_of_the_rodeo-i_wont_cry_-s.mp3
/kb/mp3/sweethearts_rodeo/sweethearts_of_the_rodeo-the_inn_at_innisfre.mp3
`;	

kolists['mp3_jkwii'] =
`/kb/mp3/jkwii/30_FredEstaire_PuttinOnTheRitz.mp3
/kb/mp3/jkwii/39_KateSmith_GodBlessAmerica.mp3
/kb/mp3/jkwii/39_KayKyser_ThreeLittleFishies.mp3
/kb/mp3/jkwii/39_LouisArmstrongDannyKaye_WhenTheSaintsGoMarchingIn.mp3
/kb/mp3/jkwii/40_PaulRobeson_BalladForAmericans.mp3
/kb/mp3/jkwii/44_AndrewSisters_ShooShooBaby.mp3
/kb/mp3/jkwii/45_BingCrosby_AndrewsSisters-DontFenceMeIn.mp3
/kb/mp3/jkwii/46_BettyHutton_PaulWeston-doctor_lawyer_indianchief.mp3
/kb/mp3/jkwii/47_AlJolson_AnniversarySong.mp3
/kb/mp3/jkwii/49_DinahShore_ButtonsAndBows.mp3
/kb/mp3/jkwii/51_DebbieReynolds_AbbaDabbaHoneymoon.mp3
/kb/mp3/jkwii/51_RosemaryClooney_ComeOnAMyHouse.mp3
/kb/mp3/jkwii/AccentuateThePositive.mp3
/kb/mp3/jkwii/Auctioneer.mp3
/kb/mp3/jkwii/BalladOfDavyCrockett.mp3
/kb/mp3/jkwii/Battle_New_Orleans.mp3
/kb/mp3/jkwii/beatles+i_want_to_hold_your_hand.mp3
/kb/mp3/jkwii/beatles-i_wanna_hold_your_hand.mp3
/kb/mp3/jkwii/beatles-youve_got_to_hide_your_love_away.mp3
/kb/mp3/jkwii/beatles_i_want_to_hold_your_hand.mp3
/kb/mp3/jkwii/beatles_let_it_be.mp3
/kb/mp3/jkwii/beatles_morwegian_wood.mp3
/kb/mp3/jkwii/beethovens-fifth_symphony.mp3
/kb/mp3/jkwii/Bellamy_Brothers-let_your_Love_Flow.mp3
/kb/mp3/jkwii/benny_boodman-swingtime_inthe_rockies.mp3
/kb/mp3/jkwii/bett_midler-bless_the_beasts_and_children.mp3
/kb/mp3/jkwii/bing_crosby_n_andrews_sisters-accentuate_the_positive.mp3
/kb/mp3/jkwii/brenda_lee-if_you_love_me.mp3
/kb/mp3/jkwii/buddy_holly-great_balls_of_fire.mp3
/kb/mp3/jkwii/buddy_holly-true_love_ways.mp3
/kb/mp3/jkwii/catch_a_falling_star.mp3
/kb/mp3/jkwii/chordettes-lollipop.mp3
/kb/mp3/jkwii/clarinet_polka.mp3
/kb/mp3/jkwii/danny_kaye-inchworm.mp3
/kb/mp3/jkwii/danny_kaye-thumbelina.mp3
/kb/mp3/jkwii/dayo.mp3
/kb/mp3/jkwii/dean_martin-memories_are_made_of_this.mp3
/kb/mp3/jkwii/disney-electric_light_parade.mp3
/kb/mp3/jkwii/donovan-catch_the_wind_original_single_with_strings.mp3
/kb/mp3/jkwii/doris_day-que_sera_sera.mp3
/kb/mp3/jkwii/dusty_springfield-windmills_of_your_mind.mp3
/kb/mp3/jkwii/eddie_cantor-makin_whoopee.mp3
/kb/mp3/jkwii/emmylou_harris-like_an_old_fashioned_waltz.mp3
/kb/mp3/jkwii/emmylou_harris-my_baby_needs_a_shepherd.mp3
/kb/mp3/jkwii/emmylou_harris-pledging_my_love.mp3
/kb/mp3/jkwii/emmylou_harris_n_john_denver-wild_montana_skies.mp3
/kb/mp3/jkwii/eva_cassidy-aint_no_sunshine.mp3
/kb/mp3/jkwii/eva_cassidy-kathys_song.mp3
/kb/mp3/jkwii/forrest_gump_theme.mp3
/kb/mp3/jkwii/frankie_lane-mule_train.mp3
/kb/mp3/jkwii/Freddie_n_the_dreamers-im_telling_you_now.mp3
/kb/mp3/jkwii/gail_garnet-well_sing_in_the_sunshine.mp3
/kb/mp3/jkwii/girls_just_want_to_have_fun.mp3
/kb/mp3/jkwii/glaube_mir.mp3
/kb/mp3/jkwii/glaube_mir3.mp3
/kb/mp3/jkwii/goodygoody.mp3
/kb/mp3/jkwii/grateful_dead-ripple.mp3
/kb/mp3/jkwii/great_balls_of_fire.mp3
/kb/mp3/jkwii/hand_jive.mp3
/kb/mp3/jkwii/hes_got_the_whole_world_in_his_hands.mp3
/kb/mp3/jkwii/honeycomb.mp3
/kb/mp3/jkwii/im_all_shook_up.mp3
/kb/mp3/jkwii/im_beginning_to_see_the_light.mp3
/kb/mp3/jkwii/in_the_good_old_summertime.mp3
/kb/mp3/jkwii/ink_spots-i_dont_want_to_set_the_world_on_fire_1941.mp3
/kb/mp3/jkwii/iris_dement-sweet_is_the_melody_incomplete.mp3
/kb/mp3/jkwii/killing_me_softly_with_his_song.mp3
/kb/mp3/jkwii/king_of_the_road.mp3
/kb/mp3/jkwii/kingsmen-louie_louie.mp3
/kb/mp3/jkwii/little_brown_jug.mp3
/kb/mp3/jkwii/little_grass_shack.mp3
/kb/mp3/jkwii/little_sir_echo-horace_heidt.mp3
/kb/mp3/jkwii/loony_tunes_bugs_bunny-the_rabbit_of_seville.mp3
/kb/mp3/jkwii/louie_armstrong-what_a_wonderful_world.mp3
/kb/mp3/jkwii/louis_armstrong-ive_got_a_pocket_full_of_dreams.mp3
/kb/mp3/jkwii/louis_prima_n_keely_smith-that_old_black.mp3
/kb/mp3/jkwii/lullaby_of_birdland.mp3
/kb/mp3/jkwii/LullabyOfBirdland.mp3
/kb/mp3/jkwii/macarena.mp3
/kb/mp3/jkwii/marlene_dietrich-lili_marlene.mp3
/kb/mp3/jkwii/marvin_gaye-lets_get_it_on.mp3
/kb/mp3/jkwii/maurice_chevalier_n_hermione_gingold-i_remember_it_well_gigi.mp3
/kb/mp3/jkwii/mills_brothers-glowworm.mp3
/kb/mp3/jkwii/millsBrothers-glowworm.mp3
/kb/mp3/jkwii/mitch_miller-battle_Hymn_Of_The_republic.mp3
/kb/mp3/jkwii/mitch_miller-camptown_races_oh_susanna.mp3
/kb/mp3/jkwii/mitch_miller-you_are_my_sunshine.mp3
/kb/mp3/jkwii/mona_lisa.mp3
/kb/mp3/jkwii/monkeys-daydream_believer.mp3
/kb/mp3/jkwii/nancy_sinartra-these_boots_are_made_for_walkin.mp3
/kb/mp3/jkwii/on_the_street_where_you_live.mp3
/kb/mp3/jkwii/open_the_door_richard.mp3
/kb/mp3/jkwii/oscar_brand-bless_em_all.mp3
/kb/mp3/jkwii/patsy_cline-back_in_babys_arms.mp3
/kb/mp3/jkwii/patti_page-mocking_bird_hill.mp3
/kb/mp3/jkwii/pattie_page-how_much_is_that_doggie_in_the_window.mp3
/kb/mp3/jkwii/peggy_Lee_n_benny_goodman-on_the_sunny_side_of_the_street.mp3
/kb/mp3/jkwii/people.mp3
/kb/mp3/jkwii/perry_como-round_and_round.mp3
/kb/mp3/jkwii/raindrops_keep_falling_on_my_head_1969.mp3
/kb/mp3/jkwii/ray_charles-georgia_on_my_mind.mp3
/kb/mp3/jkwii/simon_garfunkle-mrs_robinson.mp3
/kb/mp3/jkwii/sons_of_the_pioneers-cool_water.mp3
/kb/mp3/jkwii/supremes_you_cant_hurry_love.mp3
/kb/mp3/jkwii/texas_tornados-rueda_de_fuego_ring_of_fire.mp3
/kb/mp3/jkwii/tiny_bubbles_n_Pparly_shells.mp3
/kb/mp3/jkwii/tom_rush-the_circle_game.mp3
/kb/mp3/jkwii/tommy_dorsey-smoke_gets_in_your_eyes.mp3
/kb/mp3/jkwii/two_cigarettes_in_the_dark.mp3
/kb/mp3/jkwii/van_morrison-have_i_told_you_lately.mp3
/kb/mp3/jkwii/village_people-ymca.mp3
/kb/mp3/jkwii/Volare.mp3
/kb/mp3/jkwii/willy_nelson-on_the_road_again.mp3
/kb/mp3/jkwii/winchester_cathedral_petula_clark.mp3
/kb/mp3/jkwii/windy.mp3
/kb/mp3/jkwii/Yesterday.mp3`;



kolists['gifwave'] =
`/imgs/sound/ringworm_1.gif
/imgs/sound/ringworm_2.gif
/imgs/sound/ringworm_5.gif
/imgs/sound/ringworm_10.gif
/imgs/sound/ringworm_20.gif
/imgs/gif/alien_tek/wave.gif
/imgs/gif/crazy/giphy_fingerwave.gif
/imgs/gif/ducks/gif/alien_tek/wave.gif
/imgs/gif/ducks/gif/gif_spinners/giphy_go_gridwaves.gif
/imgs/gif/ducks/gif/gif_spinners/giphy_waveup.gif
/imgs/gif/gif_202004/giphy_orbwave.gif
/imgs/gif/gif_202004/giphy_wave00.gif
/imgs/gif/gif_202004/giphy_wave02.gif
/imgs/sound/giphy_wave03t.gif
/imgs/gif/gif_202004/giphy_wave03.gif
/imgs/gif/gif_202004/giphy_wave04.gif
/imgs/gif/gif_202004/giphy_wave07.gif
/imgs/gif/gif_202004/giphy_wave08.gif
/imgs/gif/gif_202004/giphy_wave_cbs.gif
/imgs/gif/gif_bugs/giphy_dogewaves.gif
/imgs/gif/gif_bugs/giphy_orb_wave.gif
/imgs/gif/gif_spinners/giphy_go_gridwaves.gif
/imgs/gif/gif_spinners/giphy_waveup.gif
/imgs/gif/giphy_dollars/giphygowave'.gif
/imgs/gif/giphy_us_news_focus/giph_tinkerbell_wavey.gif
/imgs/gif/giphy_us_news_focus/giphy_mouth_wavy.gif
/imgs/gif/giphy_us_news_focus/giphy_us_girlwave.gif
/imgs/gif/giphy_us_news_focus/giphy_us_polewave.gif
/imgs/gif/iperms/giphy_armywave.gif
/imgs/gif/iperms/giphy_armywave_barrel.gif
/imgs/gif/kt/giphy_headwaves.gif
/imgs/gif/notes/waves_blue.gif
/imgs/gif/notes/waves_circle.gif
/imgs/gif/notes/waves_interfere.gif
/imgs/gif/notes/waves_linedrop.gif
/imgs/gif/notes/waves_undulate.gif
/imgs/gif/notes/waves_water.gif
/imgs/gif/us/giphy_jkwii_headwave2.gif
/imgs/gif/us/giphy_orb_wave.gif
/imgs/gif/us/giphy_us_headwave.gif
/imgs/gif/us/tn/tn_giphy_jkwii_headwave2.gif
/imgs/gif/us/tn/tn_giphy_orb_wave.gif
/imgs/gif/us/tn/tn_giphy_us_headwave.gif
/imgs/gif/us_big/giphy_jkwii_headwaves2.gif
/imgs/gif/us_big/giphy_keyboard_wavepanel.gif
`;
	

kolists['ka1_mp3'] =
`/fl/ko_builder/alarm.mp3
/fl/ko_builder/bat_taps.mp3
/fl/ko_builder/bells.mp3
/fl/ko_builder/bubbles.mp3
/fl/ko_builder/busy.mp3
/fl/ko_builder/cashregister.mp3
/fl/ko_builder/catch.mp3
/fl/ko_builder/charge.mp3
/fl/ko_builder/charge_2.mp3
/fl/ko_builder/cheer.mp3
/fl/ko_builder/chord.mp3
/fl/ko_builder/clap_stomp.mp3
/fl/ko_builder/click2.mp3
/fl/ko_builder/cork.mp3
/fl/ko_builder/crowd.mp3
/fl/ko_builder/crumpling.mp3
/fl/ko_builder/cymbal.mp3
/fl/ko_builder/digging_in.mp3
/fl/ko_builder/dooropen.mp3
/fl/ko_builder/doorslam.mp3
/fl/ko_builder/dropped_bat.mp3
/fl/ko_builder/exclamation.mp3
/fl/ko_builder/fall.mp3
/fl/ko_builder/field_of.mp3
/fl/ko_builder/flipflop.mp3
/fl/ko_builder/gong.mp3
/fl/ko_builder/hit.mp3
/fl/ko_builder/lets_go.mp3
/fl/ko_builder/phaser.mp3
/fl/ko_builder/phone.mp3
/fl/ko_builder/ping.mp3
/fl/ko_builder/pitch_whoosh.mp3
/fl/ko_builder/slide.mp3
/fl/ko_builder/slip.mp3
/fl/ko_builder/Takemeou.mp3
/fl/ko_builder/whoosh.mp3
/fl/ko_typo/bubbles.mp3
/fl/ko_typo/click2.mp3
/fl/ko_typo/crumpling.mp3
/fl/ko_typo/phaser.mp3
/fl/ko_typo/ping.mp3
/gm/explosion.mp3
/gm/giggle_explosion.mp3
/gm/giggle_shoot.mp3
/gm/shoot.mp3
/gm/sounds/alarm.mp3
/gm/sounds/apprehensive.mp3
/gm/sounds/aww.mp3
/gm/sounds/ballbounce-172648817.mp3
/gm/sounds/Banging Radiator-SoundBible.com-715716895.mp3
/gm/sounds/bat_taps.mp3
/gm/sounds/beach_talking_teens.mp3
/gm/sounds/beep.mp3
/gm/sounds/bells.mp3
/gm/sounds/bird_in_Rain.mp3
/gm/sounds/birds_after_rain.mp3
/gm/sounds/bleep.mp3
/gm/sounds/bluejay.mp3
/gm/sounds/bluejay_call2.mp3
/gm/sounds/bounce.mp3
/gm/sounds/breathing.mp3
/gm/sounds/bubbles.mp3
/gm/sounds/bump_large.mp3
/gm/sounds/busy.mp3
/gm/sounds/canadian_geese.mp3
/gm/sounds/cashregister.mp3
/gm/sounds/catch.mp3
/gm/sounds/chain_fence_jump.mp3
/gm/sounds/chains_spooky.mp3
/gm/sounds/charge.mp3
/gm/sounds/charge_2.mp3
/gm/sounds/cheer.mp3
/gm/sounds/chord.mp3
/gm/sounds/clap_stomp.mp3
/gm/sounds/click2.mp3
/gm/sounds/computer_error.mp3
/gm/sounds/cork.mp3
/gm/sounds/countdown.mp3
/gm/sounds/Crash Large-SoundBible.com-2049318973.mp3
/gm/sounds/crow.mp3
/gm/sounds/crowd.mp3
/gm/sounds/crumpling.mp3
/gm/sounds/cymbal.mp3
/gm/sounds/day_sunny.mp3
/gm/sounds/demon_girls_mockingbird_hi.mp3
/gm/sounds/digging_in.mp3
/gm/sounds/dooropen.mp3
/gm/sounds/doorslam.mp3
/gm/sounds/drop_fork.mp3
/gm/sounds/dropped_bat.mp3
/gm/sounds/duck_mallard.mp3
/gm/sounds/duck_mallard_quack.mp3
/gm/sounds/duck_pissed.mp3
/gm/sounds/earthquake.mp3
/gm/sounds/exclamation.mp3
/gm/sounds/exhale.mp3
/gm/sounds/explosion.mp3
/gm/sounds/falcon.mp3
/gm/sounds/fall.mp3
/gm/sounds/farm.mp3
/gm/sounds/field.mp3
/gm/sounds/flipflop.mp3
/gm/sounds/frog.mp3
/gm/sounds/fryingpan_hit.mp3
/gm/sounds/fryingpan_impact.mp3
/gm/sounds/giggle.mp3
/gm/sounds/giggle_explosion.mp3
/gm/sounds/giggle_funny_kid.mp3
/gm/sounds/giggle_kid.mp3
/gm/sounds/giggle_shoot.mp3
/gm/sounds/gong.mp3
/gm/sounds/hit.mp3
/gm/sounds/horned_owl.mp3
/gm/sounds/Laugh To Self-SoundBible.com-468656860.mp3
/gm/sounds/laugh_goofy.mp3
/gm/sounds/laugh_monster.mp3
/gm/sounds/laughing_kookaburra_birds.mp3
/gm/sounds/lets_go.mp3
/gm/sounds/mars_attacks.mp3
/gm/sounds/meadowlark.mp3
/gm/sounds/meoutake.mp3
/gm/sounds/merlin.mp3
/gm/sounds/moan.mp3
/gm/sounds/panica.mp3
/gm/sounds/parots_talking.mp3
/gm/sounds/phaser.mp3
/gm/sounds/Phone Off Hook-SoundBible.com-701991146.mp3
/gm/sounds/phone.mp3
/gm/sounds/ping.mp3
/gm/sounds/pterodactyl_screech.mp3
/gm/sounds/rainstorm_april_45m.mp3
/gm/sounds/rooster_crow.mp3
/gm/sounds/sewing_machine.mp3
/gm/sounds/shampoo_hair.mp3
/gm/sounds/shoot.mp3
/gm/sounds/sigh.mp3
/gm/sounds/sigh_female.mp3
/gm/sounds/sigh_heavy.mp3
/gm/sounds/sigh_little_girl.mp3
/gm/sounds/siren_tornado.mp3
/gm/sounds/skipping_cd.mp3
/gm/sounds/slide.mp3
/gm/sounds/slip.mp3
/gm/sounds/slip_bananapeel.mp3
/gm/sounds/slip_strange.mp3
/gm/sounds/sonar.mp3
/gm/sounds/sonar_ping.mp3
/gm/sounds/space_explosion.mp3
/gm/sounds/space_shoot.mp3
/gm/sounds/spli_funny.mp3
/gm/sounds/starting_pistol.mp3
/gm/sounds/suspense_climactic.mp3
/gm/sounds/termites_and_ants.mp3
/gm/sounds/tree_fall_small.mp3
/gm/sounds/walking_snow.mp3
/gm/sounds/warbling_vireo.mp3
/gm/sounds/whoosh.mp3
/gm/sounds/whoosh_pitch.mp3
/gm/sounds/yahoo.mp3
/gm/space/sounds/explosion.mp3
/gm/space/sounds/shoot.mp3
/gm/space/sounds/space_explosion.mp3
/gm/space/sounds/space_shoot.mp3
/im/achat/sounds/sound_1.mp3
/im/achat/sounds/sound_2.mp3
/im/achat/sounds/sound_3.mp3
/im/achat/sounds/sound_4.mp3
/im/achat/sounds/sound_5.mp3
/im/achat/sounds/sound_6.mp3
/im/mibew/sounds/new_message.mp3
/im/mibew/sounds/new_user.mp3
/kb/a/piano/piano_0As.mp3
/kb/a/piano/piano_0B.mp3
/kb/a/piano/piano_0C.mp3
/kb/a/piano/piano_0Cs.mp3
/kb/a/piano/piano_0D.mp3
/kb/a/piano/piano_0Ds.mp3
/kb/a/piano/piano_0E.mp3
/kb/a/piano/piano_0F.mp3
/kb/a/piano/piano_0Fs.mp3
/kb/a/piano/piano_0G.mp3
/kb/a/piano/piano_0Gs.mp3
/kb/a/piano/piano_1A.mp3
/kb/a/piano/piano_1As.mp3
/kb/a/piano/piano_1B.mp3
/kb/a/piano/piano_1C.mp3
/kb/a/piano/piano_1Cs.mp3
/kb/a/piano/piano_1D.mp3
/kb/a/piano/piano_1Ds.mp3
/kb/a/piano/piano_1E.mp3
/kb/a/piano/piano_1F.mp3
/kb/a/piano/piano_1Fs.mp3
/kb/a/piano/piano_1G.mp3
/kb/a/piano/piano_1Gs.mp3
/kb/a/piano/piano_2A.mp3
/kb/a/piano/piano_2As.mp3
/kb/a/piano/piano_2B.mp3
/kb/a/piano/piano_2C.mp3
/kb/a/piano/piano_2Cs.mp3
/kb/a/piano/piano_2D.mp3
/kb/a/piano/piano_2Ds.mp3
/kb/a/piano/piano_2F.mp3
/kb/a/piano/piano_2Fs.mp3
/kb/a/piano/piano_2G.mp3
/kb/a/piano/piano_2Gs.mp3
/kb/a/piano/piano_3A.mp3
/kb/a/piano/piano_3As.mp3
/kb/a/piano/piano_3B.mp3
/kb/a/piano/piano_3C.mp3
/kb/a/piano/piano_3Cs.mp3
/kb/a/piano/piano_3D.mp3
/kb/a/piano/piano_3Ds.mp3
/kb/a/piano/piano_3E.mp3
/kb/a/piano/piano_3F.mp3
/kb/a/piano/piano_3Fs.mp3
/kb/a/piano/piano_3G.mp3
/kb/a/piano/piano_3Gs.mp3
/kb/a/piano/piano_40s.mp3
/kb/a/piano/piano_4A.mp3
/kb/a/piano/piano_4As.mp3
/kb/a/piano/piano_4B.mp3
/kb/a/piano/piano_4C.mp3
/kb/a/piano/piano_4Cs.mp3
/kb/a/piano/piano_4D.mp3
/kb/a/piano/piano_4E.mp3
/kb/a/piano/piano_4F.mp3
/kb/a/piano/piano_4Fs.mp3
/kb/a/piano/piano_4G.mp3
/kb/a/piano/piano_4Gs.mp3
/kb/a/piano/piano_56s.mp3
/kb/a/piano/piano_5A.mp3
/kb/a/piano/piano_5As.mp3
/kb/a/piano/piano_5B.mp3
/kb/a/piano/piano_5C.mp3
/kb/a/piano/piano_5Cs.mp3
/kb/a/piano/piano_5D.mp3
/kb/a/piano/piano_5Ds.mp3
/kb/a/piano/piano_5E.mp3
/kb/a/piano/piano_5F.mp3
/kb/a/piano/piano_5Fs.mp3
/kb/a/piano/piano_5G.mp3
/kb/a/piano/piano_6A.mp3
/kb/a/piano/piano_6As.mp3
/kb/a/piano/piano_6B.mp3
/kb/a/piano/piano_7C.mp3


/kb/aud/mp3/abba-andante_andante.mp3
/kb/aud/mp3/abba-fernando.mp3
/kb/aud/mp3/Beatles - You've Got To Hide Your Love Away.mp3
/kb/aud/mp3/caberet-money,_money.mp3
/kb/aud/mp3/caberet-wilkommen.mp3
/kb/aud/mp3/Can't Help Falling In Love.mp3
/kb/aud/mp3/cold-stupid_girl.mp3
/kb/aud/mp3/crystal-stevie_nicks_1.mp3
/kb/aud/mp3/danny_kaye-inchworm.mp3
/kb/aud/mp3/david_bowie-changes.mp3
/kb/aud/mp3/david_bowie-golden_years.mp3
/kb/aud/mp3/dietrich-lili_marleen-german.mp3
/kb/aud/mp3/dj_ethnic_barry_sisters_-_bei_mir_bistu_shain.mp3
/kb/aud/mp3/dj_ethnic_barry_sisters_-_ich_hob_dich_zifeel_lieb.mp3
/kb/aud/mp3/dj_ethnic_barry_sisters_-_main_glick.mp3
/kb/aud/mp3/dj_ethnic_barry_sisters_-_my_yiddishe_mama.mp3
/kb/aud/mp3/dj_opera_carreras_domingo_pavarotti_-_nessun_dorma.mp3
/kb/aud/mp3/dj_opera_rodgers_&_hammerstein_-_the_sound_of_music_-_edelweiss.mp3
/kb/aud/mp3/dori_caymmi-o_bem_do_mar.mp3
/kb/aud/mp3/doris_day-que_sera_sera.mp3
/kb/aud/mp3/doris_day-secret_love.mp3
/kb/aud/mp3/doris_day-you_are_my_sunshine.mp3
/kb/aud/mp3/elton_jhon-nikita.mp3
/kb/aud/mp3/emmylou_harris-here,_there_and_everywhere.mp3
/kb/aud/mp3/emmylou_harris-like_an_old_fashioned_waltz.mp3
/kb/aud/mp3/emmylou_harris_john_denver-wild_montana_skies.mp3
/kb/aud/mp3/Eva Cassidy - Ain't No Sunshine.mp3
/kb/aud/mp3/eva_cassidy-fever.mp3
/kb/aud/mp3/fuck.mp3
/kb/aud/mp3/glad_all_over.mp3
/kb/aud/mp3/glen_campbell-gentle_on_my_mind_1968.mp3
/kb/aud/mp3/grantorino_full.mp3
/kb/aud/mp3/i_want_to_hold_your_hand.mp3
/kb/aud/mp3/incomplete_eva_cassidy-nightbird.mp3
/kb/aud/mp3/Iris Dement - Easy's Getting Harder Every Day.mp3
/kb/aud/mp3/jesse_colin_young-songbird.mp3
/kb/aud/mp3/jesse_colin_young_sunlight-1976.mp3
/kb/aud/mp3/jimi_hendrix-national_anthem.mp3
/kb/aud/mp3/john_denver_placido_doming-perhaps_love.mp3
/kb/aud/mp3/ka2.mp3
/kb/aud/mp3/king_of_the_road.mp3
/kb/aud/mp3/kingston_town-harry_belafonte.mp3
/kb/aud/mp3/Lady Antebellum - American Honey.mp3
/kb/aud/mp3/lady_antebellum-need_you_now_hq_[lyrics].mp3
/kb/aud/mp3/louie_armstrong-what_a_wonderful_world.mp3
/kb/aud/mp3/love_me_tender.mp3
/kb/aud/mp3/Marlene Dietrich - Muss i' denn.mp3
/kb/aud/mp3/marlene_dietrich_falling_in_love_again_english.mp3
/kb/aud/mp3/mitch_miller-you_are_my_sunshine.mp3
/kb/aud/mp3/mockin_bird_hill_patti_page.mp3
/kb/aud/mp3/mona_lisa.mp3
/kb/aud/mp3/music_13119_benny_benassi_satisfaction.mp3
/kb/aud/mp3/music_141639_pure_beauty.mp3
/kb/aud/mp3/music_145075_bas_couture.mp3
/kb/aud/mp3/music_922401610_beauty_on_fire.mp3
/kb/aud/mp3/music_you_dont_own_me_235310380.mp3
/kb/aud/mp3/never_alone-lady_antebellum..mp3
/kb/aud/mp3/patsy_cline-the_wayward_wind.mp3
/kb/aud/mp3/pattie_page-how_much_is_that_doggie_in_the_window.mp3
/kb/aud/mp3/procol_harem-a_whiter_shade_of_pale.mp3
/kb/aud/mp3/quando,_quando,_quando-engelberthumperdinck.mp3
/kb/aud/mp3/Richie_Havens_-_03_-_My_Father's_Shoes.mp3
/kb/aud/mp3/Richie_Havens_-_05_-_The_Hawk.mp3
/kb/aud/mp3/Richie_Havens_-_07_-_The_Times_They_Are_a-Changin'.mp3
/kb/aud/mp3/Richie_Havens_-_10_-_How_the_Nights_Can_Fly.mp3
/kb/aud/mp3/Richie_Havens_-_13_-_At_a_Glance.mp3
/kb/aud/mp3/righteous_brothers-soul_and_inspiration.mp3
/kb/aud/mp3/scatterbrain-freddy_martin_orch.mp3
/kb/aud/mp3/smokey_robinson-ooh_baby_baby.mp3
/kb/aud/mp3/sound.mp3
/kb/aud/mp3/supermassive_black_hole_lyrics_and_twilight_videos.mp3
/kb/aud/mp3/the_platters_the_great_pretender.mp3
/kb/aud/mp3/third_eye_blind-_never_let_you_go.mp3
/kb/aud/mp3/trick_daddy-take_it_to_the_house.mp3
/kb/aud/mp3/Trio_-_Bum_Bum_1983_NDW.mp3
/kb/aud/mp3/Trio_-_Da_Da_Da_clipe_.mp3
/kb/aud/mp3/TRIO_-_Girl_Girl_Girl.mp3
/kb/aud/mp3/Trio_-_Herz_ist_Trumpf_-_1983.mp3
/kb/aud/mp3/Trio_-_Sabine.mp3
/kb/aud/mp3/Trio_-_Turaluraluralu.mp3
/kb/aud/mp3/Trio_-_Tutti-Frutti_-_NDW_-_1984.mp3
/kb/aud/mp3/trio_Vogel_der_Nacht.mp3
/kb/aud/mp3/twilight_soundtrack.mp3
/kb/aud/mp3/Volare.mp3
/kb/aud/mp3/waits-cemetery_polka-full.mp3
/kb/aud/mp3/waits-come_on_up_to_the_house.mp3
/kb/aud/mp3/waits-house_where_nobody_lives.mp3
/kb/aud/mp3/waits-long_way_home.mp3
/kb/aud/mp3/waits-lullaby-1.mp3
/kb/aud/mp3/waits-time.mp3
/kb/aud/mp3/weihnachtslieder-nicole-still_still_still.mp3
/kb/aud/mp3/wenn_die_soldaten-marlene_dietrich.mp3
/kb/aud/mp3/What's new pussycat.mp3
/kb/aud/mp3/Why_Dont_You_Do_Right_.mp3
/kb/aud/mp3/wish_we_were_back_in_missouri_em.mp3
/kb/aud/mp3/yellow_bird.mp3
/kb/aud/mp3/You Can't Hurry Love.mp3
/kb/aud/mp3/young_love.mp3
/ko/h5/lib/av/aud/effects/beeps/alarm.mp3
/ko/h5/lib/av/aud/effects/beeps/alarm2.mp3
/ko/h5/lib/av/aud/effects/beeps/alarm3.mp3
/ko/h5/lib/av/aud/effects/beeps/buzz.mp3
/ko/h5/lib/av/aud/effects/beeps/compute_ack.mp3
/ko/h5/lib/av/aud/effects/beeps/compute_ack_long.mp3
/ko/h5/lib/av/aud/effects/beeps/ping.mp3
/ko/h5/lib/av/aud/effects/beeps/ping2.mp3
/ko/h5/lib/av/aud/effects/beeps/retro_beep1.mp3
/ko/h5/lib/av/aud/effects/beeps/retro_beep2.mp3
/ko/h5/lib/av/aud/effects/beeps/super_ping.mp3
/ko/h5/lib/av/aud/effects/comm/alien_comm.mp3
/ko/h5/lib/av/aud/effects/comm/alien_comm2.mp3
/ko/h5/lib/av/aud/effects/comm/radio_noise.mp3
/ko/h5/lib/av/aud/effects/comm/radio_signal.mp3
/ko/h5/lib/av/aud/effects/comm/radio_tune.mp3
/ko/h5/lib/av/aud/effects/environmental/cloaking_device.mp3
/ko/h5/lib/av/aud/effects/environmental/computing.mp3
/ko/h5/lib/av/aud/effects/environmental/drop_item.mp3
/ko/h5/lib/av/aud/effects/environmental/engine.mp3
/ko/h5/lib/av/aud/effects/environmental/lightning1.mp3
/ko/h5/lib/av/aud/effects/environmental/lost_in_time.mp3
/ko/h5/lib/av/aud/effects/environmental/low_bass_note.mp3
/ko/h5/lib/av/aud/effects/environmental/low_flange_rez.mp3
/ko/h5/lib/av/aud/effects/environmental/low_hum.mp3
/ko/h5/lib/av/aud/effects/environmental/onimous_echo.mp3
/ko/h5/lib/av/aud/effects/environmental/quasar.mp3
/ko/h5/lib/av/aud/effects/environmental/scanner.mp3
/ko/h5/lib/av/aud/effects/environmental/war_drum.mp3
/ko/h5/lib/av/aud/effects/explosions/explosion2.mp3
/ko/h5/lib/av/aud/effects/explosions/explosion3.mp3
/ko/h5/lib/av/aud/effects/explosions/explosion4.mp3
/ko/h5/lib/av/aud/effects/explosions/explosion5.mp3
/ko/h5/lib/av/aud/effects/explosions/explosion6.mp3
/ko/h5/lib/av/aud/effects/explosions/explosion7.mp3
/ko/h5/lib/av/aud/effects/explosions/explosion8.mp3
/ko/h5/lib/av/aud/effects/explosions/low_explosion.mp3
/ko/h5/lib/av/aud/effects/misc/boss_transform.mp3
/ko/h5/lib/av/aud/effects/misc/boup.mp3
/ko/h5/lib/av/aud/effects/misc/brain_fry.mp3
/ko/h5/lib/av/aud/effects/misc/deploy_mine.mp3
/ko/h5/lib/av/aud/effects/misc/deploy_radio.mp3
/ko/h5/lib/av/aud/effects/misc/deploy_web.mp3
/ko/h5/lib/av/aud/effects/misc/electric_drop.mp3
/ko/h5/lib/av/aud/effects/misc/final_boss_die.mp3
/ko/h5/lib/av/aud/effects/misc/get_item.mp3
/ko/h5/lib/av/aud/effects/misc/get_item2.mp3
/ko/h5/lib/av/aud/effects/misc/item_appear.mp3
/ko/h5/lib/av/aud/effects/misc/item_appear2.mp3
/ko/h5/lib/av/aud/effects/misc/lock_on.mp3
/ko/h5/lib/av/aud/effects/misc/materialize.mp3
/ko/h5/lib/av/aud/effects/misc/power_up.mp3
/ko/h5/lib/av/aud/effects/misc/robot_error.mp3
/ko/h5/lib/av/aud/effects/misc/robot_no.mp3
/ko/h5/lib/av/aud/effects/misc/whiplash.mp3
/ko/h5/lib/av/aud/effects/misc/wobble.mp3
/ko/h5/lib/av/aud/effects/misc/wobble2.mp3
/ko/h5/lib/av/aud/effects/projectiles/alien_shot1.mp3
/ko/h5/lib/av/aud/effects/projectiles/alien_shot2.mp3
/ko/h5/lib/av/aud/effects/projectiles/alien_shot3.mp3
/ko/h5/lib/av/aud/effects/projectiles/alien_shot4.mp3
/ko/h5/lib/av/aud/effects/projectiles/alien_shot5.mp3
/ko/h5/lib/av/aud/effects/projectiles/alien_shot6.mp3
/ko/h5/lib/av/aud/effects/projectiles/alien_shot7.mp3
/ko/h5/lib/av/aud/effects/projectiles/clash_ricochet.mp3
/ko/h5/lib/av/aud/effects/projectiles/hit2.mp3
/ko/h5/lib/av/aud/effects/projectiles/hit3.mp3
/ko/h5/lib/av/aud/effects/projectiles/hit4.mp3
/ko/h5/lib/av/aud/effects/projectiles/hit5.mp3
/ko/h5/lib/av/aud/effects/projectiles/ion_cannon.mp3
/ko/h5/lib/av/aud/effects/projectiles/ion_cannon_light.mp3
/ko/h5/lib/av/aud/effects/projectiles/laser.mp3
/ko/h5/lib/av/aud/effects/projectiles/missile.mp3
/ko/h5/lib/av/aud/effects/projectiles/pea_shooter.mp3
/ko/h5/lib/av/aud/effects/projectiles/photon.mp3
/ko/h5/lib/av/aud/effects/projectiles/quantum_missile.mp3
/ko/h5/lib/av/aud/effects/projectiles/ricochet2.mp3
/ko/h5/lib/av/aud/effects/projectiles/ricochet3.mp3
/ko/h5/lib/av/aud/effects/projectiles/ricochet4.mp3
/ko/h5/lib/av/aud/effects/projectiles/ricochet5.mp3
/ko/h5/lib/av/aud/effects/projectiles/ricochet6.mp3
/ko/h5/lib/av/aud/effects/projectiles/scatter_shot.mp3
/ko/h5/lib/av/aud/effects/projectiles/scatter_shot2.mp3
/ko/h5/lib/av/aud/effects/projectiles/super_missile.mp3
/ko/h5/lib/av/aud/effects/projectiles/super_missile2.mp3
/ko/h5/lib/av/aud/effects/space/black_hole.mp3
/ko/h5/lib/av/aud/effects/space/cosmic_string.mp3
/ko/h5/lib/av/aud/effects/space/enemy_launch_warmup.mp3
/ko/h5/lib/av/aud/effects/space/enemy_swoop_down.mp3
/ko/h5/lib/av/aud/effects/space/enemy_wake_up.mp3
/ko/h5/lib/av/aud/effects/space/engine_damage.mp3
/ko/h5/lib/av/aud/effects/space/engine_warmup.mp3
/ko/h5/lib/av/aud/effects/space/flush_garbage.mp3
/ko/h5/lib/av/aud/effects/space/hyperdrive_abort.mp3
/ko/h5/lib/av/aud/effects/space/hyperdrive_abort2.mp3
/ko/h5/lib/av/aud/effects/space/hyperdrive_warmup.mp3
/ko/h5/lib/av/aud/effects/space/pressurize_airlock.mp3
/ko/h5/lib/av/aud/effects/space/shield_activate.mp3
/ko/h5/lib/av/aud/effects/space/shields_recharged.mp3
/ko/h5/lib/av/aud/effects/space/shields_recharged2.mp3
/ko/h5/lib/av/aud/effects/space/ship_dock.mp3
/ko/h5/lib/av/aud/effects/space/ships_collide.mp3
/ko/h5/lib/av/aud/effects/space/space_bug_scream.mp3
/ko/h5/lib/av/aud/effects/space/space_clank.mp3
/ko/h5/lib/av/aud/effects/space/space_dog_bark.mp3
/ko/h5/lib/av/aud/effects/space/space_drip.mp3
/ko/h5/lib/av/aud/effects/space/space_glug.mp3
/ko/h5/lib/av/aud/effects/space/space_ribbit.mp3
/ko/h5/lib/av/aud/effects/space/space_vacuum.mp3
/ko/h5/lib/av/aud/effects/space/space_wind.mp3
/ko/h5/lib/av/aud/effects/space/super_web_active.mp3
/ko/h5/lib/av/aud/effects/switches/switch.mp3
/ko/h5/lib/av/aud/effects/switches/switch2.mp3
/ko/h5/lib/av/aud/effects/switches/switch3.mp3
/ko/h5/lib/av/aud/effects/switches/switch4.mp3
/ko/h5/lib/av/aud/effects/switches/switch5.mp3
/ko/h5/lib/av/aud/effects/ui/blurn.mp3
/ko/h5/lib/av/aud/effects/ui/blurn_shhh.mp3
/ko/h5/lib/av/aud/effects/ui/notify.mp3
/ko/h5/lib/av/aud/effects/ui/select.mp3
/ko/h5/lib/av/aud/effects/ui/select2.mp3
/ko/h5/lib/av/aud/effects/ui/select3.mp3
/ko/h5/lib/av/aud/effects/ui/select4.mp3
/ko/h5/lib/av/aud/effects/ui/select5.mp3
/ko/h5/lib/av/aud/effects/ui/shunt.mp3
/ko/srv/blab/aud_blab7/sound_001.mp3
/ko/srv/blab/aud_blab7/sound_002.mp3
/ko/srv/blab/aud_blab7/sound_003.mp3
/ko/srv/blab/aud_blab7/sound_004.mp3
/ko/srv/blab/aud_blab7/sound_005.mp3
/ko/srv/blab/aud_blab7/sound_006.mp3
/ko/srv/blab/aud_blab7/sound_007.mp3
/ko/srv/blab/aud_blab7/sound_008.mp3
/ko/srv/blab/aud_blab7/sound_009.mp3
/ko/srv/blab/aud_blab7/sound_010.mp3
/ko/srv/blab/aud_blab7/sound_011.mp3
/ko/srv/blab/aud_blab7/sound_012.mp3
/ko/srv/blab/aud_blab7/sound_013.mp3
/ko/srv/blab/aud_blab7/sound_014.mp3
/ko/srv/blab/aud_blab7/sound_015.mp3
/ko/srv/blab/aud_blab7/sound_016.mp3
/ko/srv/blab/aud_blab7/sound_017.mp3
/ko/srv/blab/aud_blab7/sound_018.mp3
/ko/srv/blab/aud_blab7/sound_019.mp3
/ko/srv/blab/aud_blab7/sound_020.mp3
/ko/srv/blab/aud_blab7/sound_021.mp3
/ko/srv/blab/aud_blab7/sound_022.mp3
/ko/srv/blab/aud_blab7/sound_023.mp3
/ko/srv/blab/aud_blab7/sound_024.mp3
/ko/srv/blab/aud_blab7/sound_025.mp3
/ko/srv/blab/aud_blab7/sound_026.mp3
/ko/srv/blab/aud_blab7/sound_027.mp3
/ko/srv/blab/aud_blab7/sound_028.mp3
/ko/srv/blab/aud_blab7/sound_029.mp3
/ko/srv/blab/aud_blab7/sound_030.mp3
/ko/srv/blab/aud_blab7/sound_031.mp3
/ko/srv/blab/aud_blab7/sound_032.mp3
/ko/srv/blab/aud_blab7/sound_033.mp3
/ko/srv/blab/aud_blab7/sound_034.mp3
/ko/srv/blab/aud_blab7/sound_035.mp3
/ko/srv/blab/aud_blab7/sound_036.mp3
/ko/srv/blab/aud_blab7/sound_037.mp3
/ko/srv/blab/aud_blab7/sound_038.mp3
/ko/srv/blab/aud_blab7/sound_039.mp3
/ko/srv/blab/aud_blab7/sound_040.mp3
/ko/srv/blab/aud_blab7/sound_041.mp3
/ko/srv/blab/aud_blab7/sound_042.mp3
/ko/srv/blab/aud_blab7/sound_043.mp3
/ko/srv/blab/aud_blab7/sound_044.mp3
/ko/srv/blab/aud_blab7/sound_045.mp3
/ko/srv/blab/aud_blab7/sound_046.mp3
/ko/srv/blab/aud_blab7/sound_047.mp3
/ko/srv/blab/aud_blab7/sound_048.mp3
/ko/srv/blab/aud_blab7/sound_049.mp3
/ko/srv/blab/aud_blab7/sound_050.mp3
/ko/srv/blab/aud_blab7/sound_051.mp3
/ko/srv/blab/aud_blab7/sound_052.mp3
/ko/srv/blab/aud_blab7/sound_053.mp3
/ko/srv/blab/aud_blab7/sound_054.mp3
/ko/srv/blab/aud_blab7/sound_055.mp3
/ko/srv/blab/aud_blab7/sound_056.mp3
/ko/srv/blab/aud_blab7/sound_057.mp3
/ko/srv/blab/aud_blab7/sound_058.mp3
/ko/srv/blab/aud_blab7/sound_059.mp3
/ko/srv/blab/aud_blab7/sound_060.mp3
/ko/srv/blab/aud_blab7/sound_061.mp3
/ko/srv/blab/aud_blab7/sound_062.mp3
/ko/srv/blab/aud_blab7/sound_063.mp3
/ko/srv/blab/aud_blab7/sound_064.mp3
/ko/srv/blab/aud_blab7/sound_065.mp3
/ko/srv/blab/aud_blab7/sound_066.mp3
/ko/srv/blab/aud_blab7/sound_067.mp3
/ko/srv/blab/aud_blab7/sound_068.mp3
/ko/srv/blab/aud_blab7/sound_069.mp3
/ko/srv/blab/aud_blab7/sound_070.mp3
/ko/srv/blab/aud_blab7/sound_071.mp3
/ko/srv/blab/aud_blab7/sound_072.mp3
/ko/srv/blab/aud_blab7/sound_073.mp3
/ko/srv/blab/aud_blab7/sound_074.mp3
/ko/srv/blab/aud_blab7/sound_075.mp3
/ko/srv/blab/aud_blab7/sound_076.mp3
/ko/srv/blab/aud_blab7/sound_077.mp3
/ko/srv/blab/aud_blab7/sound_078.mp3
/ko/srv/blab/aud_blab7/sound_079.mp3
/ko/srv/blab/aud_blab7/sound_080.mp3
/ko/srv/blab/aud_blab7/sound_081.mp3
/ko/srv/blab/aud_blab7/sound_082.mp3
/ko/srv/blab/aud_blab7/sound_083.mp3
/ko/srv/blab/aud_blab7/sound_084.mp3
/ko/srv/blab/aud_blab7/sound_085.mp3
/ko/srv/blab/aud_blab7/sound_086.mp3
/ko/srv/blab/aud_blab7/sound_087.mp3
/ko/srv/blab/aud_blab7/sound_088.mp3
/ko/srv/blab/aud_blab7/sound_089.mp3
/ko/srv/blab/aud_blab7/sound_090.mp3
/ko/srv/blab/aud_blab7/sound_091.mp3
/ko/srv/blab/aud_blab7/sound_092.mp3
/ko/srv/blab/aud_blab7/sound_093.mp3
/ko/srv/blab/aud_blab7/sound_094.mp3
/ko/srv/blab/aud_blab7/sound_095.mp3
/ko/srv/blab/aud_blab7/sound_096.mp3
/ko/srv/blab/aud_blab7/sound_097.mp3
/ko/srv/blab/aud_blab7/sound_098.mp3
/ko/srv/blab/aud_blab7/sound_099.mp3
/ko/srv/blab/aud_blab7/sound_100.mp3
/ko/srv/blab/aud_blab7/sound_101.mp3
/ko/srv/blab/ui/sounds/1.mp3
/ko/srv/blab/ui/sounds/2.mp3
/ko/srv/blab/ui/sounds/3.mp3
/ko/srv/blab/ui/sounds/4.mp3
/ko/srv/blab/ui/sounds/5.mp3
/ko/srv/blab/ui/sounds/6.mp3
/ko/srv/blab/ui/sounds/7.mp3
/ko/srv/blab/ui/sounds/8.mp3
/ko/srv/blab/ui/sounds/9.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/alarm.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/alarm2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/alarm3.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/buzz.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/compute_ack.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/compute_ack_long.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/ping.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/ping2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/retro_beep1.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/retro_beep2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/super_ping.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/comm/alien_comm.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/comm/alien_comm2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/comm/radio_noise.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/comm/radio_signal.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/comm/radio_tune.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/cloaking_device.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/computing.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/drop_item.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/engine.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/lightning1.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/lost_in_time.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/low_bass_note.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/low_flange_rez.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/low_hum.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/onimous_echo.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/quasar.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/scanner.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/war_drum.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/explosions/explosion2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/explosions/explosion3.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/explosions/explosion4.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/explosions/explosion5.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/explosions/explosion6.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/explosions/explosion7.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/explosions/explosion8.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/explosions/low_explosion.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/boss_transform.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/boup.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/brain_fry.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/deploy_mine.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/deploy_radio.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/deploy_web.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/electric_drop.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/final_boss_die.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/get_item.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/get_item2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/item_appear.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/item_appear2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/lock_on.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/materialize.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/power_up.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/robot_error.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/robot_no.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/whiplash.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/wobble.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/wobble2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/alien_shot1.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/alien_shot2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/alien_shot3.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/alien_shot4.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/alien_shot5.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/alien_shot6.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/alien_shot7.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/clash_ricochet.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/hit2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/hit3.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/hit4.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/hit5.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/ion_cannon.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/ion_cannon_light.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/laser.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/missile.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/pea_shooter.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/photon.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/quantum_missile.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/ricochet2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/ricochet3.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/ricochet4.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/ricochet5.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/ricochet6.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/scatter_shot.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/scatter_shot2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/super_missile.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/super_missile2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/black_hole.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/cosmic_string.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/enemy_launch_warmup.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/enemy_swoop_down.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/enemy_wake_up.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/engine_damage.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/engine_warmup.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/flush_garbage.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/hyperdrive_abort.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/hyperdrive_abort2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/hyperdrive_warmup.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/pressurize_airlock.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/shield_activate.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/shields_recharged.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/shields_recharged2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/ship_dock.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/ships_collide.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/space_bug_scream.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/space_clank.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/space_dog_bark.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/space_drip.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/space_glug.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/space_ribbit.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/space_vacuum.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/space_wind.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/super_web_active.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/switches/switch.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/switches/switch2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/switches/switch3.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/switches/switch4.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/switches/switch5.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/blurn.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/blurn_shhh.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/notify.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/select.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/select2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/select3.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/select4.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/select5.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/shunt.mp3
/ko/svc/effectgames/ht/sounds/shutter.mp3
/ko/svc/js/effectgm/htdocs/sounds/shutter.mp3
/ko/svc/js/kojs/kojs_3js_stemkoski/7DFPS/audio/deep-solar-wind.mp3
/ko/svc/js/kojs/kojs_threejs/examples/sounds/358232_j_s_song.mp3
/ko/svc/js/kojs/kojs_threejs/examples/sounds/376737_Skullbeatz___Bad_Cat_Maste.mp3
/ko/svc/js/stemkoskijs/7DFPS/audio/deep-solar-wind.mp3
/ko/svc/js/threejs/examples/sounds/358232_j_s_song.mp3
/ko/svc/js/threejs/examples/sounds/376737_Skullbeatz___Bad_Cat_Maste.mp3
/ko/svc/js/threejs-tetris/music/cash.mp3
/ko/svc/js/threejs-tetris/music/collision.mp3
/ko/svc/js/threejs-tetris/music/gameover.mp3
/ko/svc/js/threejs-tetris/music/move.mp3
/ko/svc/jsdoit/preload/_assets/audio/Thunder.mp3
/ko/svc/jsdoit/preload/_assets/static/CabinBoy.mp3
/ko/svc/tests/easeljs/_assets/audio/bionic.mp3
/ko/svc/tests/easeljs/examples/Game/sounds/break.mp3
/ko/svc/tests/easeljs/examples/Game/sounds/death.mp3
/ko/svc/tests/easeljs/examples/Game/sounds/music.mp3
/ko/svc/tests/easeljs/examples/Game/sounds/shot.mp3
/ko/svc/tests/easeljs/examples/Game/sounds/spawn.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/BodySlam.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/DirtSlide.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/EnemyHit.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/garywalk_chill.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/HitHard4.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/jump4.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/LaserGunShot.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/PressPlay.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/TunnelCollision.mp3
/ko/svc/tests/sandbox/ToolkitBannerAd/sounds/EnemyHit.mp3
/ko/svc/tests/sandbox/ToolkitBannerAd/sounds/LaserGunShot.mp3
/ko/svc/tests/soundjs/_assets/audio/05-Binrpilot-Underground.mp3
/ko/svc/tests/soundjs/_assets/audio/Game-AudioSprite.mp3
/ko/svc/tests/soundjs/_assets/audio/Game-Break.mp3
/ko/svc/tests/soundjs/_assets/audio/Game-Death.mp3
/ko/svc/tests/soundjs/_assets/audio/Game-Shot.mp3
/ko/svc/tests/soundjs/_assets/audio/Game-Spawn.mp3
/ko/svc/tests/soundjs/_assets/audio/GU-StealDaisy.mp3
/ko/svc/tests/soundjs/_assets/audio/Humm.mp3
/ko/svc/tests/soundjs/_assets/audio/M-GameBG.mp3
/ko/svc/tests/soundjs/_assets/audio/R-Damage.mp3
/ko/svc/tests/soundjs/_assets/audio/S-Damage.mp3
/ko/svc/tests/soundjs/_assets/audio/Thunder1.mp3
/ko/svc/tests/soundjs/_assets/audio/ToneWobble.mp3
/ko/svc/tests/soundjs/_assets/audio/U-CabinBoy3.mp3
/ko/svc/tests/soundjs/examples/Game/sounds/break.mp3
/ko/svc/tests/soundjs/examples/Game/sounds/death.mp3
/ko/svc/tests/soundjs/examples/Game/sounds/music.mp3
/ko/svc/tests/soundjs/examples/Game/sounds/shot.mp3
/ko/svc/tests/soundjs/examples/Game/sounds/spawn.mp3
/us0/2007/konet.ka5/httpdocs/mp3/net/silent.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND1.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND104.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND105.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND108.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND111.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND112.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND12.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND13.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND131.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND136.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND14.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND16.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND17.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND18.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND181.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND19.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND20.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND21.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND22.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND24.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND240.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND243.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND25.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND26.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND27.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND28.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND29.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND3.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND30.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND34.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND35.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND36.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND38.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND39.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND4.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND42.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND43.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND45.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND49.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND49D.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND5.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND50.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND528.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND53.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND54.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND55.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND560.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND563.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND57.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND58.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND6.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND65.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND68.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND7.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND713.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND735.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND8.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND827.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND9.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND999.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/delete_space1.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/delete_space2.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/delete_tek1.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/delete_tek2.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/delete_tek3.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/delete_tek4.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qabitem.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qabmenu.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qclick.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qdelete.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qdelete1.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qdelete2.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qdelete3.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qdelete4.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qmem.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qmem2.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qmem3.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qmem4.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen1.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen10.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen2.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen3.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen4.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen5.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen6.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen7.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen8.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen9.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen_2000.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen_99.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen_bell.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen_birds.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen_chimes.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen_IPO.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen_newsbreak.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen_rickety_mineshaft_of_riches.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qrecord.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qrecord1.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/alarm.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/beep.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/bell.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/bells.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/blip.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/bubbles.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/busy.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/chord.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/click.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/click2.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/click3.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/clink.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/clonk.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/cork.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/crumpling.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/cymbal.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/doorbell.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/exclamation.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/fall.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/flipflop.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/gong.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/metalcling.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/metalclonk.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/phaser.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/ping.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/sissors.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/slip.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/taps.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/toilet.mp3
/us0/2007/konet.ka5/httpdocs/mp3/ts3/BEAM.mp3
/us0/2007/konet.ka5/httpdocs/mp3/ts3/BIRDS.mp3
/us0/2007/konet.ka5/httpdocs/mp3/ts3/CRICKET.mp3
/us0/2007/konet.ka5/httpdocs/mp3/ts3/KNOCK.mp3
/us0/2007/konet.ka5/httpdocs/mp3/ts3/MACHINE.mp3
/us0/2007/konet.ka5/httpdocs/mp3/ts3/PUTER.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_001.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_002.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_003.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_004.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_005.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_006.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_007.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_008.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_009.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_010.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_011.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_012.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_013.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_014.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_015.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_016.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_017.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_018.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_019.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_020.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_021.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_022.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_023.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_024.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_025.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_026.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_027.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_028.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_029.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_030.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_031.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_032.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_033.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_034.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_035.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_036.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_037.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_038.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_039.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_040.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_041.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_042.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_043.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_044.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_045.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_046.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_047.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_048.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_049.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_050.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_051.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_052.mp3
/vhosts1/chapel.ka6/httpdocs/ko/shoutcast/Start_Today_Again.mp3
/vhosts1/ka5/httpdocs/doctorjoe/docjoe_dan_Tori_Amos_-_Yes,_Anastasia.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/A Hard Day's Night.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Always On My Mind.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Andrew Sisters- Bei Mir Bist du Schon.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Auctioneer.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Banana Boat Song.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Benny Goodman - Bei Mir Bist Du Schon.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Big girls don't cry.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Bless The Beasts And Children.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Cab Calloway - Minnie The Moocher.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Can't Help Falling In Love.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Cherry Pink & Apple Blossom White.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/CherryCherry.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Connie Frances - Who's Sorry Now.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Connie Frances Where the boys ARE.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Connie Francis - Mama.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Crazy.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_bach_-_air_for_g_string.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_bach_-_brandenburg_concerto_3_allegro.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_canon_in_d.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_chopin_-_nocturne_in_e_flat.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_eugene_ormandy_-_grande_valse.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_humoresque.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_hungarian_dance_no_16_-_con_moto.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_hungarian_dance_no_5.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_hungarian_dance_no_7_in_a_-_brahms.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_monti-csardas.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_mozart-variation.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_mozart_-_moonlight_sonata.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_offenbach_-_tales_of_hoffmann,_barcarolle.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_rhapsody_on_a_theme_of_paganini.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_andrew_sisters-_bei_mir_bist_du_schon.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_a_byssele.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_bei_mir_bistu_shain.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_chiribim_chiribom.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_fargess_mich_nit.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_ich_hob_dich_zifeel_lieb.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_main_glick.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_ochy_chernye.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_papirossen.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_rumeine.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_shabes_lich.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_tum_balalaika.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_vie_a_heen_zol_ich_gayn.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_chassidic_melody__-_netania_davrath.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_chieu_matxcova.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_ein_keloheinu.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_eli_eli.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_eretz_eretz.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_exodus-havah-nagilah_-_connie-francis.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_inzenyrska.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_theodore_bikel_-_mayn_shtetele_belz.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_tumalalaika_-_herschel_bernardi.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_yome,_yome_-_shoshana_damari.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_andrea_bocelli_&_celine_dion_-_the_prayer.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_andrea_bocelli_&_sarah_brightman_-_time_to_say_goodbye.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_andrea_bocelli_-_puccini_-_nessun_dorma.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_beverly_sills_-_richard_strauss_-_breit_uber_mein_haupt.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_carreras_domingo_pavarotti_-_nessun_dorma.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_libiamo-libiamo-carlo-de-monte-victoria-de-los-angeles.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_luciano-pavarotti-una-furtiva-lagrima.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_mario_lanza_-_arriverderci_roma.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_rodgers_&_hammerstein_-_the_sound_of_music_-_edelweiss.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_sarah_brightman_&_andrea_bocelli_-_time_to_say_goodbye.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_sarah_brightman_-_hijo_de_la_luna.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Doris Day - Que Sera Sera.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Doris Day - Secret Love.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Doris Day - You Are My Sunshine.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Ella Fitzgerald - Heart and Soul.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Frank Sinatra - One for my baby (and one more for the road) .mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Frank Sinatra - The Way You Look Tonight.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Frankie Lane - Cry of the wild goose.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Girl, You[ll Be a WomanSoon.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Good Night Irene.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Great Pretender (Platters).mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Green Green Grass Of Home.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/High Noon - Frankie Lane.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Honeycomb.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/I Want To Hold Your Hand.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/If you love me-BrendaLee.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/In The Good Old Summertime.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Kay Kyser,with Ish Kabibble, Harry Babbitt, Sally Mason - Three little Fishies.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/King of the Road.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/la-paloma - connie-francis.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Lili Marlene - Marlene Dietrich.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Little Sir Echo - Horace Heidt.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Louie Armstrong - What a Wonderful World.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Louie Louie - Kingsmen.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Love Me Tender.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Memories Are Made Of This.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Mister Sandman - The Chordettes .mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/mockin_bird_hill_patti_page.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Mona Lisa.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/My Heart Belongs To DaddyK.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Norwegian Wood.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/oh_lonesome_me_connie_francis.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Pattie Page - How Much Is That Doggie In The Window.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Pattie Page - Tennessee Waltz.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Quando, Quando, Quando-EngelbertHumperdinck.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Ramblin'_Rose.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Rosemary Clooney - This Ole House.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Scatterbrain - Freddy Martin Orch.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/September Morn.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/sherry.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Sons of The Pioneers _ Cool Water.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Springtime in the Rockies - Will Carter .mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Standing On The Corner.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Sukiyaki.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Tennessee  Waltz.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/That's Amore.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/The Platters  The Great Pretender.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/The Platters - Unchained Melody.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/They Can't Take That Away From Me.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Tiny Bubbles & Pearly shells.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/topsy.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Volare.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/What's new pussycat.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Why_Dont_You_Do_Right_.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/winchester_cathedral_petula_clark.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/windy.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Yellow Bird.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Yesterday.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/You Can't Hurry Love.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/You've lost That Lovin' Feeling .mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/you-send-me.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/YouDon'tBringMeFlowers.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/young_love.mp3
/vhosts1/ka5/httpdocs/zencart/media/thehunter.mp3
/vhosts1/ka5/inbox/brell77_snip22_carousel.mp3
/vhosts1/ka5/ko/shoutcast/scpromo.mp3
/vhosts1/ka5/ko/shoutcast/Start_Today_Again.mp3
/vhosts1/ka5/ko/shoutcast/test1.mp3
/vhosts1/konet.org/public_html/ko/shoutcast/scpromo.mp3
/vhosts1/konet.org/public_html/ko/shoutcast/Start_Today_Again.mp3
/vhosts1/konet.org/public_html/ko/shoutcast/test1.mp3
/vhosts1/konet.org/public_html/zencart/media/thehunter.mp3
`;







kolists['av'] = 
`/index1_avril.mp4
/index0.mp4
/index1.mp4
/index2.mp4
/index3.mp4
/index4.mp4
/index5.mp4
/index6.mp4
/index7.mp4
/index8.mp4
/index9.mp4
/index10.mp4
/index11.mp4
/av.mp4
/index.mp4
/index1.mp4
/index2.mp4
/index3.mp4
/index4.mp4
/kb/vid/youb/tech_petdrone_skydio_r1_review.mp4
/kb/vid/youb/tech_unboxing_led_500.mp4
/kb/vid/youb/tech_thermoelectric_cooler_pelier.mp4
/kb/vid/youb/dance_rtsf2019_dietmar_n_nellia?never_stop_jiving.mp4
/kb/vid/youb/ dance_butoh_japan.mp4
/kb/vid/youb/dance_peeping_tom_le_salon.mp4
/kb/jtfdc/vid/jtfdc_20190124_1350_stalkaround_lwhitesuv_jtf30in_jkwii.mp4
/kb/jtfdc/vid/jtfdc_20190122_2200_stalkaround_jtf28in_drivewaytraffic.mp4
/kb/vid/youb/01_sixto_rodriguez_sandrevan_lullabylifestyles_[coming_from_.mp4
/kb/vid/youb/02_sixto_rodriguez_i_think_of_you.mp4
/kb/vid/youb/48_roses_mariachi_el_bronx_jay_leno_2011.mp4
/kb/vid/youb/bonnie_raitt_aaron_neville_gregg_allman_tell_it_like_it.mp4
/kb/vid/youb/eva_cassidyaint_no_sunshine.mp4
/kb/vid/youb/eva_cassidyfields_of_gold.mp4
/kb/vid/youb/faithfullworking_class_hero-live.mp4
/kb/vid/youb/official_chrysler_and_bob_dylan_super_bowl_commercial_2017.mp4
/kb/vid/youb/richie_havens_i_was_educated_by_myself_with_lyrics.mp4
/kb/vid/youb/river_run_file24160428.mp4
/kb/vid/youb/steal_away_by_the_fureys.mp4
/kb/vid/youb/the_last_farewell_lyrics_roger_whittaker.mp4
/kb/vid/youb/we_believe_in_happy_ending_emmylou_harris_earl_thomas_co.mp4
/kb/vid/youb/yogis_Tibetan_Buddhism__Secrets_of_the_Yogis_of_Tibet_-_Part_5.mp4
/ko/svc/jsdoit/preload/_assets/static/video.mp4
/ko/svc/js/threejs/examples/textures/sintel.mp4
/3.mp4
/konet/index6.mp4
/konet/index2.mp4
/konet/index.mp4
/konet/index1.mp4
/konet/index3.mp4
/jkwii/jkwii.mp4
/jkwii/js/threejs/examples/textures/sintel.mp4
/index4.mp4
/ka1.mp4
/index8.mp4
/kb/byrdpuckers/vid/jtfdc_20171214_1215_jtf32out_jtf32_lyinglawerin.mp4
/kb/byrdpuckers/vid/huckleberry_hound_17_barbeque_hound.mp4
/kb/byrdpuckers/vid/jtfdc_201802261524_fiona_freeroam.mp4
/kb/byrdpuckers/vid/jtfdc_20180605_0500_jtf31_fiona_roam_go_home_doberwoofs_jkwiiabout.mp4
/kb/byrdpuckers/vid/roy_rogers_dont_fence_me_in.mp4
/kb/byrdpuckers/vid/jtf31.mp4
/kb/byrdpuckers/vid/jtfdc_20180604_1015_jtf31_fiona_qualitytime_unexpected_jkwii.mp4
/kb/byrdpuckers/vid/jtfdc_20180605_1956_bigtruck_n_cabletrailer_stalkback.mp4
/kb/byrdpuckers/vid/doghead_video.mp4
/kb/byrdpuckers/vid/jtfdc_20180607_1813_jtf31_fiona_freeroom_inyourface.mp4
/kb/byrdpuckers/vid/jtfdc_20180530_2034_jkwii_meet_househunters_nice.mp4
/kb/byrdpuckers/vid/jtfdc_20180505_1944_jkwiinkids_center_court.mp4
/kb/byrdpuckers/vid/jtfdc_20180605_1130_jkwii_lost_cable_truck.mp4
/kb/byrdpuckers/vid/jtf30.mp4
/kb/byrdpuckers/vid/jtfdc_20180226_1524_jtf31_fiona_freeroam.mp4
/kb/byrdpuckers/vid/jtfdc_20180605_1130_jkwii_lost_cabletrailer.mp4
/kb/byrdpuckers/vid/jtfdc_20171216_0610_woof.mp4
/kb/byrdpuckers/vid/jtfdc_20180606_1145_jtf40_driveway_byrdpucker_theft_threadt.mp4
/kb/byrdpuckers/vid/jtfdc_20180604_0630_jtf31_fiona_courttime_jkwii.mp4
/kb/byrdpuckers/vid/roy_rogers_dale_evans_sons_of_pioneers_medley.mp4
/kb/byrdpuckers/vid/jtfdc_20180605_1956_cabletrailer_backnice.mp4
/kb/byrdpuckers/vid/index1.mp4
/kb/vid/dutch/dutch_jacksonnocout_get_my_weight_up.mp4
/kb/vid/dutch/dutch_jackson_feat_jibbscity_on_fire_off_then.mp4
/kb/vid/dutch/dutch_jackson_39_new_single.mp4
/kb/vid/youb/Luciano Pavarotti & James Brown - It_s a man_s world (1080pHD).mp4
/kb/vid/youb/REAL_Men_Who_Stare_At_Goats.mp4
/kb/vid/youb/REAL_MEN_WHO_STARE_AT_GOATS_part_2.mp4
/kb/vid/youb/The_Magus_of_Denver.mp4
/kb/vid/youb/PAPA-OOM-MOW-MOW!.mp4
/kb/vid/youb/romania_lalala.mp4
/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-0.mp4
/kb/vid/youb/Zappa_Plays_Zappa_-_Joe_s_Garage.mp4
/kb/vid/youb/dietric_coffee_ifile-164376962.mp4
/kb/vid/youb/Perhaps_Love_-_John_Denver_Placido_Domingo_legendado.mp4
/kb/vid/youb/Big_Data_-_Tim_Smith.mp4
/kb/vid/youb/OFFICIAL_Chrysler_and_Bob_Dylan_Super_Bowl_Commercial_2014.mp4
/kb/vid/youb/02_Sixto_Rodriguez_-_I_Think_Of_You_.wmv.mp4
/kb/vid/youb/waits-lullaby-1.mp4
/kb/vid/youb/Maria_Muldaur_-_Don_t_You_Feel_My_Leg.mp4
/kb/vid/youb/REAL_MEN_WHO_STARE_AT_GOATS_part_3.mp4
/kb/vid/youb/sharon_jones_100_days.mp4
/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-1.mp4
/kb/vid/youb/dori_caymmi-o_bem_do_mar.mp4
/kb/vid/youb/01_Sixto_Rodriguez_-_Sandrevan_Lullaby-Lifestyles_[Coming_From_.mp4
/kb/vid/youb/Eleni_Mandell_-__quot_my_twin_quot__-_Live_at_The_EARL.mp4
/kb/vid/youb/Nat_King_Cole_All_Over_The_World.mp4
/kb/vid/youb/shania_tTwain_forever_and_for_always-world.mp4
/kb/vid/youb/harris_together_again_file-249732345.mp4
/kb/vid/youb/doghead_video.mp4
/kb/vid/youb/03_Rodriguez_-_I_ll_Slip_Away.mp4
/kb/vid/youb/Maria_Muldaur_-_My_Tennessee_Mountain_Home__Live_Recording_.mp4
/kb/vid/youb/Trio_-_Sabine.mp4
/kb/vid/youb/WHENEVER GOD SHINES HIS LIGHT - VAN MORRISON.mp4
/kb/vid/youb/eva_cassidy-aint_no_sunshine.mp4
/kb/vid/youb/Maria_Muldaur_-_A_Good_Man_is_Hard_To_Find.mp4
/kb/vid/youb/Eleni_Mandell_-__quot_makeout_king_quot_.mp4
/kb/vid/youb/put_the_lime_in_the_coconut.mp4
/kb/vid/youb/amywinehouse_love_losing_game_file-235773700.mp4
/kb/vid/youb/romania_hat.mp4
/kb/vid/youb/freddy_dreamers_telling_you_now_file-570139451.mp4
/kb/vid/youb/Rodriguez_-_I_Wonder.mp4
/kb/vid/youb/Dreaming As One - Richie Havens.mp4
/kb/vid/youb/trio_Vogel_der_Nacht.mp4
/kb/vid/youb/zara_leander_psycadeylic_file-252228034.mp4
/kb/vid/youb/waits-time3.mp4
/kb/vid/youb/lovers_concerto_file-380426037.mp4
/kb/vid/youb/mclean_starry_nights_file-805110482.mp4
/kb/vid/youb/harris_wheels_of_love_file-54997698.mp4
/kb/vid/youb/Nat_King_Cole_-_Je_Vous_Aime_Beaucoup.mp4
/kb/vid/youb/Master_Guy_Savelli_s_Kun_Tao__U.S._Special_Forces_SERE_Train.mp4
/kb/vid/youb/Rodriguez_cf11_Rich_Folks_Hoax.mp4
/kb/vid/youb/48_Roses_-_Mariachi_El_Bronx_(Jay_Leno,_2011).mp4
/kb/vid/youb/TRIO_-_Du_ich_w_r_so_gern_bei_dir.mp4
/kb/vid/youb/YouTube_-_Amy_Winehouse_-_You_Know_I_m_No_Good.mp4
/kb/vid/youb/waits-come_on_up_to_the_house.mp4
/kb/vid/youb/Maria_Muldaur_-_Handy_Man.mp4
/kb/vid/youb/nina_simone-dont_let_me_be_misunderstood.mp4
/kb/vid/youb/_Firedoglake_sen_byrd_fiddle.mp4
/kb/vid/youb/Trio_-_Turaluraluralu.mp4
/kb/vid/youb/yogis_Tibetan_Buddhism__Secrets_of_the_Yogis_of_Tibet_-_Part_5.mp4
/kb/vid/youb/eva_cassidy-fields_of_gold.mp4
/kb/vid/youb/Paul_Simon_-_You_Can_Call_Me_Al.mp4
/kb/vid/youb/river_run_file-24160428.mp4
/kb/vid/youb/The_Large_Hadron_Rap.mp4
/kb/vid/youb/Petula Clark-Windmills Of Your Mind (lyrics).mp4
/kb/vid/youb/waits-time_full.mp4
/kb/vid/youb/joe_south_want_to_go_home.mp4
/kb/vid/youb/you_dont_own_me.mp4
/kb/vid/youb/iris_sweet_is_thr_melody.mp4
/kb/vid/youb/thai_bowie.mp4
/kb/vid/youb/femme_pencak silat.mp4
/kb/vid/youb/Huckleberry_Hound_17_Barbeque_Hound_-_YouTube.mp4
/kb/vid/youb/harris_nobodys_darlin_file-996617010.mp4
/kb/vid/youb/buckingham_nicks-say_goodbye-live.mp4
/kb/vid/deepmind/ka1.mp4
/kb/vid/deepmind/eva_cassidy-aint_no_sunshine.mp4
/kb/kt/Muhammad_ali_freddy_starr.mp4
/kb/kt/000_Pakua_master_of_94_year_s_old.mp4
/kb/kt/willem_de_thouars_kuntao_silat_1996_gulfport_School_of_ta.mp4
/kb/kt/Grand_Master_TRAN_TIEN_-_Vietnam_Kung_Fu.mp4
/kb/kt/yogis_Of_Tibet_-_Rare_Documentary.mp4
/kb/kt/6_Magic_Moves_-_To_Win_a_STREET_FIGHT.mp4
/kb/kt/kt_000229_037.mp4
/kb/kt/Push_Hands_-_Tui_Shou.mp4
/kb/kt/muhammad_ali funny moments.mp4
/kb/kt/GOATS_DECLASSIFIED__The_True_Story_Behind_The_Men_Who_Stare_.mp4
/kb/kt/master_ken_Seminar_uk_2013.mp4
/kb/kt/funny_monkeys_vs_dogs_cats_compilation_2017.mp4
/kb/kt/kt_000229_033.mp4
/kb/kt/THE_DAY_THE_EARTH_STOOD_STILL_-_1951_KLAATU_S_FINAL_SPEECH.mp4
/kb/kt/kt_000229_013.mp4
/kb/kt/muhammad_ali_beutiful_interview_rip.mp4
/kb/kt/femme_pencak_silat.mp4
/kb/kt/kt_000229_019.mp4
/kb/kt/wudang_vibrating_palm.mp4
/kb/kt/kt_000229_014.mp4
/kb/kt/baguazhang_turning_the_circle_tree.mp4
/kb/kt/S01E23_the_testament_of_arkadia.mp4
/kb/kt/dethouars_willem_de_thouars_uncle_bill_in_Verona_NJ_1-11-18.mp4
/kb/kt/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-2.mp4
/kb/kt/Aikido_-_Demo_by_founder_-_Moriteru_Uesiba.mp4
/kb/kt/kt_000229_007.mp4
/kb/kt/Shaolin_Monk_Master_Super_Speed.mp4
/kb/kt/Jim Channon Natural Security Future First Earth Battalion.mp4
/kb/kt/cgi_quantum_jump_hayk_sahakyants.mp4
/kb/kt/kt_000229_022.mp4
/kb/jtfdc/vid/jtfdc_20181226_1215_jtf31_teachyourdogsnothere_jkwii.mp4
/kb/jtfdc/vid/jtfdc_20180104_1113_fedexexpress_blackchallenger_meetgreet.mp4
/kb/jtfdc/vid/jtfdc_20181222_0945_jtf31_fiona_plumber_threats_n_stones.mp4
/kb/jtfdc/vid/jtfdc_20170609_1810_burgess_assessmen.mp4
/kb/jtfdc/vid/jtdfinc_2013mmdd_jtf39_trustee_byrd_threats.mp4
/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1639_jtf31_darkpickup_backupout.mp4
/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1641_police2_pierce_pickup_jak3in.mp4
/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1551_jtf31_tresspas.mp4
/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1634_jtf31_plannin.mp4
/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1637_jtf31_meeting_hahah.mp4
/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1540_jtf31_jkwii_threat.mp4
/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1638_jtf26_upmail.mp4
/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1542_wofffren.mp4
/kb/jtfdc/vid/jtfdc_20181224_2307_jkwii_whyuhere_your_scaringus.mp4
/kb/jtfdc/vid/jtfdc_20181120_1519_jtf30_doogy_jkwii_romppatro.mp4
/kb/jtfdc/vid/jtfdc_20181225_1352_jkwii_kids_jtf31_andy_dog.mp4
/kb/jtfdc/vid/jtfdc_20180411_1436_segrist_dog_fedex_stalk.mp4
/kb/jtfdc/vid/jtfdc_20181225_1951_jsk2in_maverics_santaride.mp4
/kb/jtfdc/vid/jtfdc_20181225_1936_jtf31_thanks4sign_meryxmas_woofs.mp4
/kb/jtfdc/vid/jtfdc_20181225_2250_200yr_stillenact_merryxmas.mp4
/kb/jtfdc/vid/jtfdc_20181224_2349_jkwii_jtf31in_fiona_unleashe_street_charge.mp4
/kb/jtfdc/vid/jtfdc_20181223_1821_jtf30_woofs_allnightling.mp4
/kb/jtfdc/vid/jtfdc_20181121_1123_jtf31_fiona_hadly_jkwii_romppatrol.mp4
/kb/jtfdc/vid/jtfdc_20171216_1520_skkids_jtf31rake_jtf27fedex.mp4
/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1533_jtf31in_newblu.mp4
/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1525_jtf30in.mp4
/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1530_ffiretruck_xmaslight.mp4
/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1533_fireatruck_suvdonw.mp4
/kb/jtfdc/vid/jtfdc_20181226_1200_jtf31_2xfiona_streetchargn_dogwalkeers.mp4
/kb/jtfdc/vid/jtfdc_20180308_2034_fedexs_flatbed_courtstalking.mp4
/kb/jtfdc/vid/jtfdc_20181226_1236_byrds_up_quiet .mp4
/kb/jtfdc/vid/jtfdc_20181222_1357_jtf31_trespass_jkwii_liveyouronwlives.mp4
/kb/jtfdc/vid/jtfdc_20181226_1205_jtf31_oureasment_dogtraing.mp4
/kb/jtfdc/vid/jtfdc_20160702_1641_jtf31_josh_4asshole_gobackinside.mp4
/kb/jtfdc/vid/jtfdc_20181225_1345_kids_jtf31_freeroam_dogs.mp4
/kb/jtfdc/vid/jtfdc_20181210_1540_jtf31_jkwii_threats_n_stones.mp4
/kb/jtfdc/vid/jtfdc_20181226_1235_bigtruck_byrds_damage_assessmen.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04051_20150716_0643.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04044_20150716_0634.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04057_20150716_0701.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04059_20150716_0709.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04045_20150716_0635.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04064_20150716_0813.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04052_20150716_0644.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04046_20150716_0640_jackie_yelling_at_josh.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04053_20150716_0644.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04043_20150716_0616.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04066_20150716_0816.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04056_20150716_0646_josh_jackie_yelling.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04048_20150716_0641.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04063_20150716_0812.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04054_20150716_0644.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04055_20150716_0644.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04049_20150716_0642.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04050_20150716_0642.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04062_20150716_0738.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04065_20150716_0815.mp4
/1.mp4
/index7.mp4
/4.mp4
/2.mp4
/index6.mp4
/index2.mp4
/index.mp4
/koh5.mp4
/index1.mp4
/iperms/doghead_video.mp4
/iperms/Huckleberry_Hound_17_Barbeque_Hound.mp4
/iperms/index2.mp4
/iperms/index1.mp4
/iperms/index3.mp4
/ko_jtf/jtf30/mov/Clip14.mp4
/ko_jtf/wg/mp4_20150716/mp4_email_sent2/04055_20150716_0644.mp4
/ko_jtf/wg/mp4_20150716/04051_20150716_0643.mp4
/ko_jtf/wg/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4
/ko_jtf/wg/mp4_20150716/04044_20150716_0634.mp4
/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04052_20150716_0644.mp4
/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04054_20150716_0644.mp4
/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04050_20150716_0642.mp4
/ko_jtf/wg/mp4_20150716/04053_20150716_0644.mp4
/ko_jtf/wg/mp4_20150716/04048_20150716_0641.mp4
/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04052_20150716_0644.mp4
/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04054_20150716_0644.mp4
/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04050_20150716_0642.mp4
/ko_jtf/wg/mp4_20150716/04049_20150716_0642.mp4
/ko_jtf/wg/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4
/ko_jtf/wg/videos_to_lighten_the_mood/Huckleberry_Hound_17_Barbeque_Hound.mp4
/ko_jtf/wg/videos_to_lighten_the_mood/executive_summary_doghead_video 3-23-16738 PM1.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150806/mt4_20150806/3637_car_drivein_lights_off_20150807.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150806/mt4_20150806/3638_josh_walkin_house_20150807.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0475_20150928_0747.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0471_20150928_0737.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0472_20150928_0737.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04051_20150716_0643.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04044_20150716_0634.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04057_20150716_0701.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04059_20150716_0709.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04045_20150716_0635.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04064_20150716_0813.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04052_20150716_0644.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04053_20150716_0644.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04043_20150716_0616.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04066_20150716_0816.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04048_20150716_0641.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04063_20150716_0812.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04054_20150716_0644.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04055_20150716_0644.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04049_20150716_0642.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04050_20150716_0642.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04062_20150716_0738.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04065_20150716_0815.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00027_20150919_2205_josh_walking.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00026_20150919_2102.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00025_20150919_1947.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00028_20150919_2230.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00023_20150919_1910.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00045_20150919_1601.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00041_20150919_1311.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00043_20150919_1530.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00037_20150919_1235.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00036_20150919_1235.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00042_20150919_1520.mp4
/ko_jtf/wg/pictures_for_court_20160602/videos_to_lighten_the_mood/Huckleberry_Hound_17_Barbeque_Hound.mp4
/ko_jtf/wg/pictures_for_court_20160602/videos_to_lighten_the_mood/executive_summary_doghead_video 3-23-16738 PM1.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04051_20150716_0643.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04044_20150716_0634.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04057_20150716_0701.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04059_20150716_0709.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04045_20150716_0635.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04064_20150716_0813.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04052_20150716_0644.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04053_20150716_0644.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04043_20150716_0616.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04066_20150716_0816.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04048_20150716_0641.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04063_20150716_0812.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04054_20150716_0644.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04055_20150716_0644.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04049_20150716_0642.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04050_20150716_0642.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04062_20150716_0738.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04065_20150716_0815.mp4
/ko_jtf/kb/v/jtfinc_9558_byrd_trustee_threat_201505.mp4
/ko_jtf/kb/v/9557_fiona_runs_201506.mp4
/ko_jtf/kb/v/index5.mp4
/ko_jtf/kb/v/index4.mp4
/ko_jtf/kb/v/ka1.mp4
/ko_jtf/kb/v/doghead_video.mp4
/ko_jtf/kb/v/Huckleberry_Hound_17_Barbeque_Hound.mp4
/ko_jtf/kb/v/9559_byrd_trustee_threat_201505.mp4
/ko_jtf/kb/v/jtdfinc_byrd2013.mp4
/ko_jtf/kb/v/index6.mp4
/ko_jtf/kb/v/index2.mp4
/ko_jtf/kb/v/jtf31_fiona_runs_201506.mp4
/ko_jtf/kb/v/9558_byrd_trustee_threat_201505.mp4
/ko_jtf/kb/v/index.mp4
/ko_jtf/kb/v/jtfinc_9559_byrd_trustee_threat_201505.mp4
/ko_jtf/kb/v/index1.mp4
/ko_jtf/kb/v/ko_jtf.mp4
`;

kolists['fb'] = 
`pages/1.jpg
pages/2.jpg
pages/3.jpg
pages/4.jpg
pages/5.jpg
pages/6.jpg
pages/7.jpg
pages/8.jpg
pages/9.jpg
/imgs/gif/alien_tek/a11_flipbook.gif
/imgs/gif/alien_tek/afda.gif
/imgs/gif/alien_tek/applewait.gif
/imgs/gif/alien_tek/asdfadfad.gif
/imgs/gif/alien_tek/cityspiral.gif
/imgs/gif/alien_tek/cobe4.gif
/imgs/gif/alien_tek/donujt.gif
/imgs/gif/alien_tek/drip1.gif
/imgs/gif/alien_tek/floaters.gif
/imgs/gif/alien_tek/icepalace.gif
/imgs/gif/alien_tek/lit2.gif
/imgs/gif/alien_tek/lite1.gif
/imgs/gif/alien_tek/litecrystle.gif
/imgs/gif/alien_tek/med1.gif
/imgs/gif/alien_tek/med19.gif
/imgs/gif/alien_tek/med3.gif
/imgs/gif/alien_tek/med5.gif
/imgs/gif/alien_tek/med6.gif
/imgs/gif/alien_tek/medpump.gif
/imgs/gif/alien_tek/medskin.gif
/imgs/gif/alien_tek/mek1.gif
/imgs/gif/alien_tek/mek12.gif
/imgs/gif/alien_tek/mek17.gif
/imgs/gif/alien_tek/mek2.gif
/imgs/gif/alien_tek/mek3.gif
/imgs/gif/alien_tek/mek5.gif
/imgs/gif/alien_tek/mek7.gif
/imgs/gif/alien_tek/mek8.gif
/imgs/gif/alien_tek/mek9.gif
/imgs/gif/alien_tek/memcore.gif
/imgs/gif/alien_tek/merd2.gif
/imgs/gif/alien_tek/octopus.gif
/imgs/gif/alien_tek/org1.gif
/imgs/gif/alien_tek/photons.gif
/imgs/gif/alien_tek/pip2.gif
/imgs/gif/alien_tek/pulsehelix.gif
/imgs/gif/alien_tek/smoke.gif
/imgs/gif/alien_tek/static4.gif
/imgs/gif/alien_tek/su5_67_h_1340.gif
/imgs/gif/alien_tek/tesla.gif
/imgs/gif/alien_tek/wave.gif
/imgs/gif/byrdpucker/giph_horse_distotiony.gif
/imgs/gif/byrdpucker/giph_horse_smerky.gif
/imgs/gif/byrdpucker/giphy._horse_glittergif.gif
/imgs/gif/byrdpucker/giphy._horse_koballsgif.gif
/imgs/gif/byrdpucker/giphy_bugs_boundry.gif
/imgs/gif/byrdpucker/giphy_bugs_jaildoors.gif
/imgs/gif/byrdpucker/giphy_bugs_pase.gif
/imgs/gif/byrdpucker/giphy_bugs_sstop.gif
/imgs/gif/byrdpucker/giphy_bugs_takaway.gif
/imgs/gif/byrdpucker/giphy_bugs_wakeup.gif
/imgs/gif/byrdpucker/giphy_byrdpucker_dog_n_pony_show.gif
/imgs/gif/byrdpucker/giphy_cruella_1.gif
/imgs/gif/byrdpucker/giphy_cruella_2.gif
/imgs/gif/byrdpucker/giphy_cubemembrain.gif
/imgs/gif/byrdpucker/giphy_cycle.gif
/imgs/gif/byrdpucker/giphy_cycle_circle.gif
/imgs/gif/byrdpucker/giphy_cycle_dog.gif
/imgs/gif/byrdpucker/giphy_cycle_jtf39.gif
/imgs/gif/byrdpucker/giphy_cycle_legs.gif
/imgs/gif/byrdpucker/giphy_cycle_rodent.gif
/imgs/gif/byrdpucker/giphy_dogpaddle.gif
/imgs/gif/byrdpucker/giphy_dogs1.gif
/imgs/gif/byrdpucker/giphy_dogygym.gif
/imgs/gif/byrdpucker/giphy_horse_soccor.gif
/imgs/gif/byrdpucker/giphy_horse_views.gif
/imgs/gif/byrdpucker/giphy_horsefish.gif
/imgs/gif/byrdpucker/giphy_horseg_girl_vintage.gif
/imgs/gif/byrdpucker/giphy_horseguy_pranser.gif
/imgs/gif/byrdpucker/giphy_horserun_pencil.gif
/imgs/gif/byrdpucker/giphy_horserun_vintage.gif
/imgs/gif/byrdpucker/giphy_koponies.gif
/imgs/gif/byrdpucker/giphy_magicdoors2.gif
/imgs/gif/byrdpucker/giphy_magicscary_shadows.gif
/imgs/gif/byrdpucker/giphy_magicspecter2.gif
/imgs/gif/byrdpucker/giphy_mrevil.gif
/imgs/gif/byrdpucker/giphy_mtfail.gif
/imgs/gif/byrdpucker/giphy_pinocio_1.gif
/imgs/gif/byrdpucker/giphy_pinocioa_2.gif
/imgs/gif/byrdpucker/giphy_pinocioa_4.gif
/imgs/gif/byrdpucker/giphy_wicked_curtains_closel_.gif
/imgs/gif/crazy/giph_imnotcrazyy.gif
/imgs/gif/crazy/giphy_containment.gif
/imgs/gif/crazy/giphy_crazy3.gif
/imgs/gif/crazy/giphy_crazy5.gif
/imgs/gif/crazy/giphy_crazy_blond.gif
/imgs/gif/crazy/giphy_crazy_mickey.gif
/imgs/gif/crazy/giphy_crazy_princess.gif
/imgs/gif/crazy/giphy_crazy_simsoncalass.gif
/imgs/gif/crazy/giphy_crazy_smilyface.gif
/imgs/gif/crazy/giphy_crazyguy.gif
/imgs/gif/crazy/giphy_crazylady.gif
/imgs/gif/crazy/giphy_crazyorb.gif
/imgs/gif/crazy/giphy_crazytoon.gif
/imgs/gif/crazy/giphy_derbyguy.gif
/imgs/gif/crazy/giphy_dracual_onoff.gif
/imgs/gif/crazy/giphy_duck_crazy.gif
/imgs/gif/crazy/giphy_duckcrash.gif
/imgs/gif/crazy/giphy_einstein.gif
/imgs/gif/crazy/giphy_einstein_wabblehead.gif
/imgs/gif/crazy/giphy_expression_dancer.gif
/imgs/gif/crazy/giphy_fingerwave.gif
/imgs/gif/crazy/giphy_ladyscarey.gif
/imgs/gif/crazy/giphy_magicorb_laddle.gif
/imgs/gif/crazy/giphy_nerdy.gif
/imgs/gif/crazy/giphy_rumshower.gif
/imgs/gif/crazy/giphy_science_frank.gif
/imgs/gif/crazy/giphy_screamer.gif
/imgs/gif/crazy/giphy_showergirl.gif
/imgs/gif/crazy/giphy_smile.gif
/imgs/gif/crazy/giphy_smileyshark.gif
/imgs/gif/crazy/giphy_time_waites.gif
/imgs/gif/crazy/giphy_timeguy_late.gif
/imgs/gif/crazy/giphy_zoom_crazyguy.gif
/imgs/gif/cute/bee.gif
/imgs/gif/cute/boop.gif
/imgs/gif/cute/CA 4th 027 copy.gif
/imgs/gif/cute/CA 4th 027.gif
/imgs/gif/cute/catas.gif
/imgs/gif/cute/cats.gif
/imgs/gif/cute/cd81506101b9407dec74b5635a70fb16.gif
/imgs/gif/cute/crayons.gif
/imgs/gif/cute/disb.gif
/imgs/gif/cute/dogconfusion.gif
/imgs/gif/cute/fireworks.gif
/imgs/gif/cute/fireworks13.gif
/imgs/gif/cute/fireworks3.gif
/imgs/gif/cute/fireworks4.gif
/imgs/gif/cute/fish-swimming.gif
/imgs/gif/cute/fish.gif
/imgs/gif/cute/gipdicehy.gif
/imgs/gif/cute/gipdisneyhy.gif
/imgs/gif/cute/gipfadfahy.gif
/imgs/gif/cute/giphy.gif
/imgs/gif/cute/kid.gif
/imgs/gif/cute/party.gif
/imgs/gif/cute/photonorb.gif
/imgs/gif/cute/sfg.gif
/imgs/gif/cute/spinning-arrow-right.gif
/imgs/gif/firebubbles.gif
/imgs/gif/firebubblesb.gif
/imgs/gif/firebubblesd.gif
/imgs/gif/firebubblesp.gif
/imgs/gif/firebubblesq.gif
/imgs/gif/focus/giph_focus_kidy.gif
/imgs/gif/focus/giph_focus_simpson.gif
/imgs/gif/focus/giph_watchery.gif
/imgs/gif/focus/giphy._eyeball_glossygif.gif
/imgs/gif/focus/giphy_eye_1.gif
/imgs/gif/focus/giphy_eye_owl.gif
/imgs/gif/focus/giphy_eyes2mouth.gif
/imgs/gif/focus/giphy_eyes_linedraw.gif
/imgs/gif/focus/giphy_facemasks.gif
/imgs/gif/focus/giphy_focus_3dglasses.gif
/imgs/gif/focus/giphy_focus_dali.gif
/imgs/gif/focus/giphy_focus_goggles.gif
/imgs/gif/focus/giphy_focus_iris.gif
/imgs/gif/focus/giphy_focus_koglasses.gif
/imgs/gif/focus/giphy_focus_sleuth.gif
/imgs/gif/gif_bugs/giph_bugs_bellydancery.gif
/imgs/gif/gif_bugs/giph_bugs_monster_outy.gif
/imgs/gif/gif_bugs/giph_bugs_peppy_heartsy.gif
/imgs/gif/gif_bugs/giph_kiti_earthrise.gif
/imgs/gif/gif_bugs/giph_kiti_flyingsaucersy.gif
/imgs/gif/gif_bugs/giph_kiti_unicorn.gif
/imgs/gif/gif_bugs/giph_the_end1y.gif
/imgs/gif/gif_bugs/giphy.=_bugs_beepbeep_cliff.gif
/imgs/gif/gif_bugs/giphy._bugs_apple_androidgif.gif
/imgs/gif/gif_bugs/giphy4.gif
/imgs/gif/gif_bugs/giphy_alien_tek0721.gif
/imgs/gif/gif_bugs/giphy_anthead.gif
/imgs/gif/gif_bugs/giphy_beepbeep_ropebride.gif
/imgs/gif/gif_bugs/giphy_box_conveyor.gif
/imgs/gif/gif_bugs/giphy_box_spinners.gif
/imgs/gif/gif_bugs/giphy_boxhop.gif
/imgs/gif/gif_bugs/giphy_boxopen.gif
/imgs/gif/gif_bugs/giphy_boxs_amazon.gif
/imgs/gif/gif_bugs/giphy_boxtoon.gif
/imgs/gif/gif_bugs/giphy_bugs_alian_upskirt.gif
/imgs/gif/gif_bugs/giphy_bugs_alien.gif
/imgs/gif/gif_bugs/giphy_bugs_alien_bodyscan.gif
/imgs/gif/gif_bugs/giphy_bugs_alien_digits.gif
/imgs/gif/gif_bugs/giphy_bugs_alien_dog.gif
/imgs/gif/gif_bugs/giphy_bugs_alien_flagplan.gif
/imgs/gif/gif_bugs/giphy_bugs_alien_judge.gif
/imgs/gif/gif_bugs/giphy_bugs_attention.gif
/imgs/gif/gif_bugs/giphy_bugs_beepbeep_bizcard.gif
/imgs/gif/gif_bugs/giphy_bugs_beepbeep_byrdman.gif
/imgs/gif/gif_bugs/giphy_bugs_beepbeep_dont_have_the_heart.gif
/imgs/gif/gif_bugs/giphy_bugs_beepbeep_fallin.gif
/imgs/gif/gif_bugs/giphy_bugs_birdcat.gif
/imgs/gif/gif_bugs/giphy_bugs_bow.gif
/imgs/gif/gif_bugs/giphy_bugs_brunhilda.gif
/imgs/gif/gif_bugs/giphy_bugs_bugattack.gif
/imgs/gif/gif_bugs/giphy_bugs_bull.gif
/imgs/gif/gif_bugs/giphy_bugs_deal_with_it.gif
/imgs/gif/gif_bugs/giphy_bugs_ducklightergif.gif
/imgs/gif/gif_bugs/giphy_bugs_evil_castle.gif
/imgs/gif/gif_bugs/giphy_bugs_excuse_me.gif
/imgs/gif/gif_bugs/giphy_bugs_eyeroll.gif
/imgs/gif/gif_bugs/giphy_bugs_fire.gif
/imgs/gif/gif_bugs/giphy_bugs_heart_skipping.gif
/imgs/gif/gif_bugs/giphy_bugs_heaven_fall.gif
/imgs/gif/gif_bugs/giphy_bugs_hencook.gif
/imgs/gif/gif_bugs/giphy_bugs_heyyou.gif
/imgs/gif/gif_bugs/giphy_bugs_inspiration.gif
/imgs/gif/gif_bugs/giphy_bugs_jailbuny.gif
/imgs/gif/gif_bugs/giphy_bugs_jailsam.gif
/imgs/gif/gif_bugs/giphy_bugs_jitters_sip.gif
/imgs/gif/gif_bugs/giphy_bugs_kiti_jitters.gif
/imgs/gif/gif_bugs/giphy_bugs_mess.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_conon.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_contained.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_doorbar.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_flee.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_grab.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_scare.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_stalk.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_stalk2.gif
/imgs/gif/gif_bugs/giphy_bugs_now_we_dance.gif
/imgs/gif/gif_bugs/giphy_bugs_one_more_time.gif
/imgs/gif/gif_bugs/giphy_bugs_pagecut.gif
/imgs/gif/gif_bugs/giphy_bugs_peppy_kiss.gif
/imgs/gif/gif_bugs/giphy_bugs_piano.gif
/imgs/gif/gif_bugs/giphy_bugs_play_this_game.gif
/imgs/gif/gif_bugs/giphy_bugs_pot.gif
/imgs/gif/gif_bugs/giphy_bugs_rockette.gif
/imgs/gif/gif_bugs/giphy_bugs_rocky.gif
/imgs/gif/gif_bugs/giphy_bugs_season.gif
/imgs/gif/gif_bugs/giphy_bugs_shave.gif
/imgs/gif/gif_bugs/giphy_bugs_slots.gif
/imgs/gif/gif_bugs/giphy_bugs_start.gif
/imgs/gif/gif_bugs/giphy_bugs_target.gif
/imgs/gif/gif_bugs/giphy_bugs_thats_all_folks.gif
/imgs/gif/gif_bugs/giphy_bugs_tooth.gif
/imgs/gif/gif_bugs/giphy_bugs_tv_western.gif
/imgs/gif/gif_bugs/giphy_bugs_tweetybird.gif
/imgs/gif/gif_bugs/giphy_bugs_wanted.gif
/imgs/gif/gif_bugs/giphy_bugs_what_a_maroon.gif
/imgs/gif/gif_bugs/giphy_bugs_whitehorse.gif
/imgs/gif/gif_bugs/giphy_bugs_yipe.gif
/imgs/gif/gif_bugs/giphy_chain_n_torus.gif
/imgs/gif/gif_bugs/giphy_chaos.gif
/imgs/gif/gif_bugs/giphy_checkerboard.gif
/imgs/gif/gif_bugs/giphy_choc_girl_tomuch.gif
/imgs/gif/gif_bugs/giphy_choc_kid.gif
/imgs/gif/gif_bugs/giphy_choc_kid2.gif
/imgs/gif/gif_bugs/giphy_choc_lucy.gif
/imgs/gif/gif_bugs/giphy_choc_pour1.gif
/imgs/gif/gif_bugs/giphy_choc_princess.gif
/imgs/gif/gif_bugs/giphy_choc_selfmed.gif
/imgs/gif/gif_bugs/giphy_clapguy.gif
/imgs/gif/gif_bugs/giphy_corners.gif
/imgs/gif/gif_bugs/giphy_corners2.gif
/imgs/gif/gif_bugs/giphy_crown.gif
/imgs/gif/gif_bugs/giphy_diamond_tubing.gif
/imgs/gif/gif_bugs/giphy_digit_copypaste.gif
/imgs/gif/gif_bugs/giphy_dog_fan.gif
/imgs/gif/gif_bugs/giphy_dogewaves.gif
/imgs/gif/gif_bugs/giphy_escalator.gif
/imgs/gif/gif_bugs/giphy_eyebug_hover.gif
/imgs/gif/gif_bugs/giphy_eyefly.gif
/imgs/gif/gif_bugs/giphy_fantube.gif
/imgs/gif/gif_bugs/giphy_gillligan.gif
/imgs/gif/gif_bugs/giphy_go__barbells.gif
/imgs/gif/gif_bugs/giphy_godtwiddle.gif
/imgs/gif/gif_bugs/giphy_kali_0721_a.gif
/imgs/gif/gif_bugs/giphy_kali_boxs.gif
/imgs/gif/gif_bugs/giphy_kali_cirles.gif
/imgs/gif/gif_bugs/giphy_kiti_boxclose.gif
/imgs/gif/gif_bugs/giphy_kiti_boxlid.gif
/imgs/gif/gif_bugs/giphy_kiti_boxthru.gif
/imgs/gif/gif_bugs/giphy_kiti_inabox.gif
/imgs/gif/gif_bugs/giphy_kiti_lightning.gif
/imgs/gif/gif_bugs/giphy_kitisews.gif
/imgs/gif/gif_bugs/giphy_kity_wings.gif
/imgs/gif/gif_bugs/giphy_konabus_loosewheels.gif
/imgs/gif/gif_bugs/giphy_kt_baseball.gif
/imgs/gif/gif_bugs/giphy_lineart.gif
/imgs/gif/gif_bugs/giphy_lineart2.gif
/imgs/gif/gif_bugs/giphy_mouthballs.gif
/imgs/gif/gif_bugs/giphy_mouthtube.gif
/imgs/gif/gif_bugs/giphy_orb_stamper.gif
/imgs/gif/gif_bugs/giphy_orb_stars_.gif
/imgs/gif/gif_bugs/giphy_orb_wave.gif
/imgs/gif/gif_bugs/giphy_orbs_0721b.gif
/imgs/gif/gif_bugs/giphy_orbs_bubbles.gif
/imgs/gif/gif_bugs/giphy_orbs_pods.gif
/imgs/gif/gif_bugs/giphy_org0721a.gif
/imgs/gif/gif_bugs/giphy_ringman.gif
/imgs/gif/gif_bugs/giphy_skateboard_torus.gif
/imgs/gif/gif_bugs/giphy_sketch_laps.gif
/imgs/gif/gif_bugs/giphy_spinner_white.gif
/imgs/gif/gif_bugs/giphy_star_bounce.gif
/imgs/gif/gif_bugs/giphy_tanklite.gif
/imgs/gif/gif_bugs/giphy_thats_all_folks_porky.gif
/imgs/gif/gif_bugs/giphy_the_end2.gif
/imgs/gif/gif_bugs/giphy_the_end_shade.gif
/imgs/gif/gif_bugs/giphy_thinkguy.gif
/imgs/gif/gif_bugs/giphy_triangles.gif
/imgs/gif/gif_bugs/giphy_undulator.gif
/imgs/gif/gif_bugs/giphy_wrap_it_up.gif
/imgs/gif/gif_spinners/giph_headsy.gif
/imgs/gif/gif_spinners/giphy_0rbs21.gif
/imgs/gif/gif_spinners/giphy_ali_ropeadope.gif
/imgs/gif/gif_spinners/giphy_ball_in_box.gif
/imgs/gif/gif_spinners/giphy_barcoede.gif
/imgs/gif/gif_spinners/giphy_blow_the_house_down.gif
/imgs/gif/gif_spinners/giphy_bookdeamon.gif
/imgs/gif/gif_spinners/giphy_box_dancing.gif
/imgs/gif/gif_spinners/giphy_box_of_shame.gif
/imgs/gif/gif_spinners/giphy_box_of_shane2.gif
/imgs/gif/gif_spinners/giphy_boxes_in_boxes.gif
/imgs/gif/gif_spinners/giphy_boxes_up.gif
/imgs/gif/gif_spinners/giphy_bugout.gif
/imgs/gif/gif_spinners/giphy_bugs_alien_hothead.gif
/imgs/gif/gif_spinners/giphy_bugs_beepbeep_cliffdoor.gif
/imgs/gif/gif_spinners/giphy_bugs_beepbeep_crusin.gif
/imgs/gif/gif_spinners/giphy_bugs_beepbeep_crusin_sketch.gif
/imgs/gif/gif_spinners/giphy_bugs_piano_finger.gif
/imgs/gif/gif_spinners/giphy_bugwalker.gif
/imgs/gif/gif_spinners/giphy_cinderella_shoe_not4u.gif
/imgs/gif/gif_spinners/giphy_control_panel.gif
/imgs/gif/gif_spinners/giphy_crosses.gif
/imgs/gif/gif_spinners/giphy_cube_undulate.gif
/imgs/gif/gif_spinners/giphy_cubefalls.gif
/imgs/gif/gif_spinners/giphy_cubeline.gif
/imgs/gif/gif_spinners/giphy_evenplaning.gif
/imgs/gif/gif_spinners/giphy_eyet_ears.gif
/imgs/gif/gif_spinners/giphy_finders_eye_heart.gif
/imgs/gif/gif_spinners/giphy_fixit.gif
/imgs/gif/gif_spinners/giphy_fractals.gif
/imgs/gif/gif_spinners/giphy_fuzzy_orb.gif
/imgs/gif/gif_spinners/giphy_fuzzyv.gif
/imgs/gif/gif_spinners/giphy_girl_pokadots.gif
/imgs/gif/gif_spinners/giphy_go_gridwaves.gif
/imgs/gif/gif_spinners/giphy_go_lites_around.gif
/imgs/gif/gif_spinners/giphy_go_square_crosses.gif
/imgs/gif/gif_spinners/giphy_go_squares.gif
/imgs/gif/gif_spinners/giphy_go_squares_3d.gif
/imgs/gif/gif_spinners/giphy_go_wobbles.gif
/imgs/gif/gif_spinners/giphy_gorays.gif
/imgs/gif/gif_spinners/giphy_gradient.gif
/imgs/gif/gif_spinners/giphy_gush.gif
/imgs/gif/gif_spinners/giphy_gushpipes.gif
/imgs/gif/gif_spinners/giphy_guy_fingertalk.gif
/imgs/gif/gif_spinners/giphy_guy_salute.gif
/imgs/gif/gif_spinners/giphy_guy_stand_proud.gif
/imgs/gif/gif_spinners/giphy_guy_thumbs_down.gif
/imgs/gif/gif_spinners/giphy_hallway_wiggle.gif
/imgs/gif/gif_spinners/giphy_hand2sand.gif
/imgs/gif/gif_spinners/giphy_head_androidspin.gif
/imgs/gif/gif_spinners/giphy_head_dog.gif
/imgs/gif/gif_spinners/giphy_head_milkbob.gif
/imgs/gif/gif_spinners/giphy_head_oz.gif
/imgs/gif/gif_spinners/giphy_head_rings.gif
/imgs/gif/gif_spinners/giphy_head_running.gif
/imgs/gif/gif_spinners/giphy_head_spin.gif
/imgs/gif/gif_spinners/giphy_head_thinker.gif
/imgs/gif/gif_spinners/giphy_head_trippy.gif
/imgs/gif/gif_spinners/giphy_head_trippy_suit.gif
/imgs/gif/gif_spinners/giphy_headtoo.gif
/imgs/gif/gif_spinners/giphy_heart.gif
/imgs/gif/gif_spinners/giphy_heart_sunny.gif
/imgs/gif/gif_spinners/giphy_hex_mnaggots.gif
/imgs/gif/gif_spinners/giphy_hockey_snoopy.gif
/imgs/gif/gif_spinners/giphy_js.gif
/imgs/gif/gif_spinners/giphy_jumpher.gif
/imgs/gif/gif_spinners/giphy_kali22.gif
/imgs/gif/gif_spinners/giphy_kali_eyeball.gif
/imgs/gif/gif_spinners/giphy_kids_out_of_boxes.gif
/imgs/gif/gif_spinners/giphy_ko_ali.gif
/imgs/gif/gif_spinners/giphy_konabus_catpillar.gif
/imgs/gif/gif_spinners/giphy_kt_circlemovie.gif
/imgs/gif/gif_spinners/giphy_kt_orb_boxers.gif
/imgs/gif/gif_spinners/giphy_kt_wooky.gif
/imgs/gif/gif_spinners/giphy_laptops.gif
/imgs/gif/gif_spinners/giphy_latern.gif
/imgs/gif/gif_spinners/giphy_layers.gif
/imgs/gif/gif_spinners/giphy_litedisplay.gif
/imgs/gif/gif_spinners/giphy_litehouse_pyramid.gif
/imgs/gif/gif_spinners/giphy_longdress.gif
/imgs/gif/gif_spinners/giphy_man_siluet.gif
/imgs/gif/gif_spinners/giphy_manlaser.gif
/imgs/gif/gif_spinners/giphy_mesh_popcorn.gif
/imgs/gif/gif_spinners/giphy_meshwrap.gif
/imgs/gif/gif_spinners/giphy_network_grid.gif
/imgs/gif/gif_spinners/giphy_network_wiggle.gif
/imgs/gif/gif_spinners/giphy_noise3.gif
/imgs/gif/gif_spinners/giphy_orb_cicle.gif
/imgs/gif/gif_spinners/giphy_orb_drips.gif
/imgs/gif/gif_spinners/giphy_orb_fuzzy.gif
/imgs/gif/gif_spinners/giphy_orb_hary.gif
/imgs/gif/gif_spinners/giphy_orb_in_cube.gif
/imgs/gif/gif_spinners/giphy_orb_jar.gif
/imgs/gif/gif_spinners/giphy_orb_layers.gif
/imgs/gif/gif_spinners/giphy_orb_noise1.gif
/imgs/gif/gif_spinners/giphy_orb_noise2.gif
/imgs/gif/gif_spinners/giphy_orb_noise3.gif
/imgs/gif/gif_spinners/giphy_orb_slow.gif
/imgs/gif/gif_spinners/giphy_orb_spiral.gif
/imgs/gif/gif_spinners/giphy_orb_torus.gif
/imgs/gif/gif_spinners/giphy_orb_tubemesh.gif
/imgs/gif/gif_spinners/giphy_orb_undulate.gif
/imgs/gif/gif_spinners/giphy_orbnois4.gif
/imgs/gif/gif_spinners/giphy_orbtubes.gif
/imgs/gif/gif_spinners/giphy_pagedown.gif
/imgs/gif/gif_spinners/giphy_pastryroad_dunes.gif
/imgs/gif/gif_spinners/giphy_pdf.gif
/imgs/gif/gif_spinners/giphy_pyramid_spirals.gif
/imgs/gif/gif_spinners/giphy_radar.gif
/imgs/gif/gif_spinners/giphy_rectanges.gif
/imgs/gif/gif_spinners/giphy_runningman2.gif
/imgs/gif/gif_spinners/giphy_runningman_atyou.gif
/imgs/gif/gif_spinners/giphy_shades.gif
/imgs/gif/gif_spinners/giphy_spinner2.gif
/imgs/gif/gif_spinners/giphy_spinner3.gif
/imgs/gif/gif_spinners/giphy_spinner8.gif
/imgs/gif/gif_spinners/giphy_spinner9.gif
/imgs/gif/gif_spinners/giphy_spinner_disk.gif
/imgs/gif/gif_spinners/giphy_spinner_orb.gif
/imgs/gif/gif_spinners/giphy_spinner_sumi.gif
/imgs/gif/gif_spinners/giphy_spinners.gif
/imgs/gif/gif_spinners/giphy_spinners_cubes.gif
/imgs/gif/gif_spinners/giphy_spiral.gif
/imgs/gif/gif_spinners/giphy_spiraltwists.gif
/imgs/gif/gif_spinners/giphy_spotlite.gif
/imgs/gif/gif_spinners/giphy_sprial_ripples.gif
/imgs/gif/gif_spinners/giphy_stickynotes.gif
/imgs/gif/gif_spinners/giphy_tetertotter.gif
/imgs/gif/gif_spinners/giphy_toiletpaper.gif
/imgs/gif/gif_spinners/giphy_torusstripes.gif
/imgs/gif/gif_spinners/giphy_tvwatcher.gif
/imgs/gif/gif_spinners/giphy_undulate2.gif
/imgs/gif/gif_spinners/giphy_waveup.gif
/imgs/gif/gif_spinners/giphy_wirebouncer.gif
/imgs/gif/gif_spinners/tumblr_nbuxxtxV3w1tre1zbo1_500.gif
/imgs/gif/gifset_b/apple.gif
/imgs/gif/gifset_b/appleb.gif
/imgs/gif/gifset_b/appleb_1.gif
/imgs/gif/gifset_b/appleb_10.gif
/imgs/gif/gifset_b/appleb_100.gif
/imgs/gif/gifset_b/appleb_2.gif
/imgs/gif/gifset_b/appleb_20.gif
/imgs/gif/gifset_b/appleb_3.gif
/imgs/gif/gifset_b/appleb_30.gif
/imgs/gif/gifset_b/appleb_4.gif
/imgs/gif/gifset_b/appleb_40.gif
/imgs/gif/gifset_b/appleb_5.gif
/imgs/gif/gifset_b/appleb_50.gif
/imgs/gif/gifset_b/appleb_6.gif
/imgs/gif/gifset_b/appleb_7.gif
/imgs/gif/gifset_b/appleb_70.gif
/imgs/gif/gifset_b/appleb_8.gif
/imgs/gif/gifset_b/appleb_80.gif
/imgs/gif/gifset_b/appleb_9.gif
/imgs/gif/gifset_b/appleb_90.gif
/imgs/gif/gifset_b/appled.gif
/imgs/gif/gifset_b/appled_1.gif
/imgs/gif/gifset_b/appled_10.gif
/imgs/gif/gifset_b/appled_100.gif
/imgs/gif/gifset_b/appled_2.gif
/imgs/gif/gifset_b/appled_20.gif
/imgs/gif/gifset_b/appled_3.gif
/imgs/gif/gifset_b/appled_30.gif
/imgs/gif/gifset_b/appled_4.gif
/imgs/gif/gifset_b/appled_40.gif
/imgs/gif/gifset_b/appled_5.gif
/imgs/gif/gifset_b/appled_50.gif
/imgs/gif/gifset_b/appled_6.gif
/imgs/gif/gifset_b/appled_7.gif
/imgs/gif/gifset_b/appled_70.gif
/imgs/gif/gifset_b/appled_8.gif
/imgs/gif/gifset_b/appled_80.gif
/imgs/gif/gifset_b/appled_9.gif
/imgs/gif/gifset_b/appled_90.gif
/imgs/gif/gifset_b/applep.gif
/imgs/gif/gifset_b/applep_1.gif
/imgs/gif/gifset_b/applep_10.gif
/imgs/gif/gifset_b/applep_100.gif
/imgs/gif/gifset_b/applep_2.gif
/imgs/gif/gifset_b/applep_20.gif
/imgs/gif/gifset_b/applep_3.gif
/imgs/gif/gifset_b/applep_30.gif
/imgs/gif/gifset_b/applep_4.gif
/imgs/gif/gifset_b/applep_40.gif
/imgs/gif/gifset_b/applep_5.gif
/imgs/gif/gifset_b/applep_50.gif
/imgs/gif/gifset_b/applep_6.gif
/imgs/gif/gifset_b/applep_7.gif
/imgs/gif/gifset_b/applep_70.gif
/imgs/gif/gifset_b/applep_8.gif
/imgs/gif/gifset_b/applep_80.gif
/imgs/gif/gifset_b/applep_9.gif
/imgs/gif/gifset_b/applep_90.gif
/imgs/gif/gifset_b/appleq.gif
/imgs/gif/gifset_b/appleq_1.gif
/imgs/gif/gifset_b/appleq_10.gif
/imgs/gif/gifset_b/appleq_100.gif
/imgs/gif/gifset_b/appleq_2.gif
/imgs/gif/gifset_b/appleq_20.gif
/imgs/gif/gifset_b/appleq_3.gif
/imgs/gif/gifset_b/appleq_30.gif
/imgs/gif/gifset_b/appleq_4.gif
/imgs/gif/gifset_b/appleq_40.gif
/imgs/gif/gifset_b/appleq_5.gif
/imgs/gif/gifset_b/appleq_50.gif
/imgs/gif/gifset_b/appleq_6.gif
/imgs/gif/gifset_b/appleq_7.gif
/imgs/gif/gifset_b/appleq_70.gif
/imgs/gif/gifset_b/appleq_8.gif
/imgs/gif/gifset_b/appleq_80.gif
/imgs/gif/gifset_b/appleq_9.gif
/imgs/gif/gifset_b/appleq_90.gif
/imgs/gif/gifset_b/awards.gif
/imgs/gif/gifset_b/bh.gif
/imgs/gif/gifset_b/bhb.gif
/imgs/gif/gifset_b/bhb_1.gif
/imgs/gif/gifset_b/bhb_10.gif
/imgs/gif/gifset_b/bhb_100.gif
/imgs/gif/gifset_b/bhb_2.gif
/imgs/gif/gifset_b/bhb_20.gif
/imgs/gif/gifset_b/bhb_3.gif
/imgs/gif/gifset_b/bhb_30.gif
/imgs/gif/gifset_b/bhb_4.gif
/imgs/gif/gifset_b/bhb_40.gif
/imgs/gif/gifset_b/bhb_5.gif
/imgs/gif/gifset_b/bhb_50.gif
/imgs/gif/gifset_b/bhb_6.gif
/imgs/gif/gifset_b/bhb_7.gif
/imgs/gif/gifset_b/bhb_70.gif
/imgs/gif/gifset_b/bhb_8.gif
/imgs/gif/gifset_b/bhb_80.gif
/imgs/gif/gifset_b/bhb_9.gif
/imgs/gif/gifset_b/bhb_90.gif
/imgs/gif/gifset_b/bhd.gif
/imgs/gif/gifset_b/bhd_1.gif
/imgs/gif/gifset_b/bhd_10.gif
/imgs/gif/gifset_b/bhd_100.gif
/imgs/gif/gifset_b/bhd_2.gif
/imgs/gif/gifset_b/bhd_20.gif
/imgs/gif/gifset_b/bhd_3.gif
/imgs/gif/gifset_b/bhd_30.gif
/imgs/gif/gifset_b/bhd_4.gif
/imgs/gif/gifset_b/bhd_40.gif
/imgs/gif/gifset_b/bhd_5.gif
/imgs/gif/gifset_b/bhd_50.gif
/imgs/gif/gifset_b/bhd_6.gif
/imgs/gif/gifset_b/bhd_7.gif
/imgs/gif/gifset_b/bhd_70.gif
/imgs/gif/gifset_b/bhd_8.gif
/imgs/gif/gifset_b/bhd_80.gif
/imgs/gif/gifset_b/bhd_9.gif
/imgs/gif/gifset_b/bhd_90.gif
/imgs/gif/gifset_b/bhp.gif
/imgs/gif/gifset_b/bhp_1.gif
/imgs/gif/gifset_b/bhp_10.gif
/imgs/gif/gifset_b/bhp_100.gif
/imgs/gif/gifset_b/bhp_2.gif
/imgs/gif/gifset_b/bhp_20.gif
/imgs/gif/gifset_b/bhp_3.gif
/imgs/gif/gifset_b/bhp_30.gif
/imgs/gif/gifset_b/bhp_4.gif
/imgs/gif/gifset_b/bhp_40.gif
/imgs/gif/gifset_b/bhp_5.gif
/imgs/gif/gifset_b/bhp_50.gif
/imgs/gif/gifset_b/bhp_6.gif
/imgs/gif/gifset_b/bhp_7.gif
/imgs/gif/gifset_b/bhp_70.gif
/imgs/gif/gifset_b/bhp_8.gif
/imgs/gif/gifset_b/bhp_80.gif
/imgs/gif/gifset_b/bhp_9.gif
/imgs/gif/gifset_b/bhp_90.gif
/imgs/gif/gifset_b/bhq.gif
/imgs/gif/gifset_b/bhq_1.gif
/imgs/gif/gifset_b/bhq_10.gif
/imgs/gif/gifset_b/bhq_100.gif
/imgs/gif/gifset_b/bhq_2.gif
/imgs/gif/gifset_b/bhq_20.gif
/imgs/gif/gifset_b/bhq_3.gif
/imgs/gif/gifset_b/bhq_30.gif
/imgs/gif/gifset_b/bhq_4.gif
/imgs/gif/gifset_b/bhq_40.gif
/imgs/gif/gifset_b/bhq_5.gif
/imgs/gif/gifset_b/bhq_50.gif
/imgs/gif/gifset_b/bhq_6.gif
/imgs/gif/gifset_b/bhq_7.gif
/imgs/gif/gifset_b/bhq_70.gif
/imgs/gif/gifset_b/bhq_8.gif
/imgs/gif/gifset_b/bhq_80.gif
/imgs/gif/gifset_b/bhq_9.gif
/imgs/gif/gifset_b/bhq_90.gif
/imgs/gif/gifset_f/dollars.gif
/imgs/gif/gifset_f/dollarsb.gif
/imgs/gif/gifset_f/dollarsb_1.gif
/imgs/gif/gifset_f/dollarsb_10.gif
/imgs/gif/gifset_f/dollarsb_100.gif
/imgs/gif/gifset_f/dollarsb_2.gif
/imgs/gif/gifset_f/dollarsb_20.gif
/imgs/gif/gifset_f/dollarsb_3.gif
/imgs/gif/gifset_f/dollarsb_30.gif
/imgs/gif/gifset_f/dollarsb_4.gif
/imgs/gif/gifset_f/dollarsb_40.gif
/imgs/gif/gifset_f/dollarsb_5.gif
/imgs/gif/gifset_f/dollarsb_50.gif
/imgs/gif/gifset_f/dollarsb_6.gif
/imgs/gif/gifset_f/dollarsb_7.gif
/imgs/gif/gifset_f/dollarsb_70.gif
/imgs/gif/gifset_f/dollarsb_8.gif
/imgs/gif/gifset_f/dollarsb_80.gif
/imgs/gif/gifset_f/dollarsb_9.gif
/imgs/gif/gifset_f/dollarsb_90.gif
/imgs/gif/gifset_f/dollarsd.gif
/imgs/gif/gifset_f/dollarsd_1.gif
/imgs/gif/gifset_f/dollarsd_10.gif
/imgs/gif/gifset_f/dollarsd_100.gif
/imgs/gif/gifset_f/dollarsd_2.gif
/imgs/gif/gifset_f/dollarsd_20.gif
/imgs/gif/gifset_f/dollarsd_3.gif
/imgs/gif/gifset_f/dollarsd_30.gif
/imgs/gif/gifset_f/dollarsd_4.gif
/imgs/gif/gifset_f/dollarsd_40.gif
/imgs/gif/gifset_f/dollarsd_5.gif
/imgs/gif/gifset_f/dollarsd_50.gif
/imgs/gif/gifset_f/dollarsd_6.gif
/imgs/gif/gifset_f/dollarsd_7.gif
/imgs/gif/gifset_f/dollarsd_70.gif
/imgs/gif/gifset_f/dollarsd_8.gif
/imgs/gif/gifset_f/dollarsd_80.gif
/imgs/gif/gifset_f/dollarsd_9.gif
/imgs/gif/gifset_f/dollarsd_90.gif
/imgs/gif/gifset_f/dollarsp.gif
/imgs/gif/gifset_f/dollarsp_1.gif
/imgs/gif/gifset_f/dollarsp_10.gif
/imgs/gif/gifset_f/dollarsp_100.gif
/imgs/gif/gifset_f/dollarsp_2.gif
/imgs/gif/gifset_f/dollarsp_20.gif
/imgs/gif/gifset_f/dollarsp_3.gif
/imgs/gif/gifset_f/dollarsp_30.gif
/imgs/gif/gifset_f/dollarsp_4.gif
/imgs/gif/gifset_f/dollarsp_40.gif
/imgs/gif/gifset_f/dollarsp_5.gif
/imgs/gif/gifset_f/dollarsp_50.gif
/imgs/gif/gifset_f/dollarsp_6.gif
/imgs/gif/gifset_f/dollarsp_7.gif
/imgs/gif/gifset_f/dollarsp_70.gif
/imgs/gif/gifset_f/dollarsp_8.gif
/imgs/gif/gifset_f/dollarsp_80.gif
/imgs/gif/gifset_f/dollarsp_9.gif
/imgs/gif/gifset_f/dollarsp_90.gif
/imgs/gif/gifset_f/dollarsq.gif
/imgs/gif/gifset_f/dollarsq_1.gif
/imgs/gif/gifset_f/dollarsq_10.gif
/imgs/gif/gifset_f/dollarsq_100.gif
/imgs/gif/gifset_f/dollarsq_2.gif
/imgs/gif/gifset_f/dollarsq_20.gif
/imgs/gif/gifset_f/dollarsq_3.gif
/imgs/gif/gifset_f/dollarsq_30.gif
/imgs/gif/gifset_f/dollarsq_4.gif
/imgs/gif/gifset_f/dollarsq_40.gif
/imgs/gif/gifset_f/dollarsq_5.gif
/imgs/gif/gifset_f/dollarsq_50.gif
/imgs/gif/gifset_f/dollarsq_6.gif
/imgs/gif/gifset_f/dollarsq_7.gif
/imgs/gif/gifset_f/dollarsq_70.gif
/imgs/gif/gifset_f/dollarsq_8.gif
/imgs/gif/gifset_f/dollarsq_80.gif
/imgs/gif/gifset_f/dollarsq_9.gif
/imgs/gif/gifset_f/dollarsq_90.gif
/imgs/gif/gifset_f/eye1.gif
/imgs/gif/gifset_f/eye1b.gif
/imgs/gif/gifset_f/eye1b_1.gif
/imgs/gif/gifset_f/eye1b_10.gif
/imgs/gif/gifset_f/eye1b_100.gif
/imgs/gif/gifset_f/eye1b_2.gif
/imgs/gif/gifset_f/eye1b_20.gif
/imgs/gif/gifset_f/eye1b_3.gif
/imgs/gif/gifset_f/eye1b_30.gif
/imgs/gif/gifset_f/eye1b_4.gif
/imgs/gif/gifset_f/eye1b_40.gif
/imgs/gif/gifset_f/eye1b_5.gif
/imgs/gif/gifset_f/eye1b_50.gif
/imgs/gif/gifset_f/eye1b_6.gif
/imgs/gif/gifset_f/eye1b_7.gif
/imgs/gif/gifset_f/eye1b_70.gif
/imgs/gif/gifset_f/eye1b_8.gif
/imgs/gif/gifset_f/eye1b_80.gif
/imgs/gif/gifset_f/eye1b_9.gif
/imgs/gif/gifset_f/eye1b_90.gif
/imgs/gif/gifset_f/eye1d.gif
/imgs/gif/gifset_f/eye1d_1.gif
/imgs/gif/gifset_f/eye1d_10.gif
/imgs/gif/gifset_f/eye1d_100.gif
/imgs/gif/gifset_f/eye1d_2.gif
/imgs/gif/gifset_f/eye1d_20.gif
/imgs/gif/gifset_f/eye1d_3.gif
/imgs/gif/gifset_f/eye1d_30.gif
/imgs/gif/gifset_f/eye1d_4.gif
/imgs/gif/gifset_f/eye1d_40.gif
/imgs/gif/gifset_f/eye1d_5.gif
/imgs/gif/gifset_f/eye1d_50.gif
/imgs/gif/gifset_f/eye1d_6.gif
/imgs/gif/gifset_f/eye1d_7.gif
/imgs/gif/gifset_f/eye1d_70.gif
/imgs/gif/gifset_f/eye1d_8.gif
/imgs/gif/gifset_f/eye1d_80.gif
/imgs/gif/gifset_f/eye1d_9.gif
/imgs/gif/gifset_f/eye1d_90.gif
/imgs/gif/gifset_f/eye1p.gif
/imgs/gif/gifset_f/eye1p_1.gif
/imgs/gif/gifset_f/eye1p_10.gif
/imgs/gif/gifset_f/eye1p_100.gif
/imgs/gif/gifset_f/eye1p_2.gif
/imgs/gif/gifset_f/eye1p_20.gif
/imgs/gif/gifset_f/eye1p_3.gif
/imgs/gif/gifset_f/eye1p_30.gif
/imgs/gif/gifset_f/eye1p_4.gif
/imgs/gif/gifset_f/eye1p_40.gif
/imgs/gif/gifset_f/eye1p_5.gif
/imgs/gif/gifset_f/eye1p_50.gif
/imgs/gif/gifset_f/eye1p_6.gif
/imgs/gif/gifset_f/eye1p_7.gif
/imgs/gif/gifset_f/eye1p_70.gif
/imgs/gif/gifset_f/eye1p_8.gif
/imgs/gif/gifset_f/eye1p_80.gif
/imgs/gif/gifset_f/eye1p_9.gif
/imgs/gif/gifset_f/eye1p_90.gif
/imgs/gif/gifset_f/eye1q.gif
/imgs/gif/gifset_f/eye1q_1.gif
/imgs/gif/gifset_f/eye1q_10.gif
/imgs/gif/gifset_f/eye1q_100.gif
/imgs/gif/gifset_f/eye1q_2.gif
/imgs/gif/gifset_f/eye1q_20.gif
/imgs/gif/gifset_f/eye1q_3.gif
/imgs/gif/gifset_f/eye1q_30.gif
/imgs/gif/gifset_f/eye1q_4.gif
/imgs/gif/gifset_f/eye1q_40.gif
/imgs/gif/gifset_f/eye1q_5.gif
/imgs/gif/gifset_f/eye1q_50.gif
/imgs/gif/gifset_f/eye1q_6.gif
/imgs/gif/gifset_f/eye1q_7.gif
/imgs/gif/gifset_f/eye1q_70.gif
/imgs/gif/gifset_f/eye1q_8.gif
/imgs/gif/gifset_f/eye1q_80.gif
/imgs/gif/gifset_f/eye1q_9.gif
/imgs/gif/gifset_f/eye1q_90.gif
/imgs/gif/gifset_f/eye2.gif
/imgs/gif/gifset_f/eye2b.gif
/imgs/gif/gifset_f/eye2b_1.gif
/imgs/gif/gifset_f/eye2b_10.gif
/imgs/gif/gifset_f/eye2b_100.gif
/imgs/gif/gifset_f/eye2b_2.gif
/imgs/gif/gifset_f/eye2b_20.gif
/imgs/gif/gifset_f/eye2b_3.gif
/imgs/gif/gifset_f/eye2b_30.gif
/imgs/gif/gifset_f/eye2b_4.gif
/imgs/gif/gifset_f/eye2b_40.gif
/imgs/gif/gifset_f/eye2b_5.gif
/imgs/gif/gifset_f/eye2b_50.gif
/imgs/gif/gifset_f/eye2b_6.gif
/imgs/gif/gifset_f/eye2b_7.gif
/imgs/gif/gifset_f/eye2b_70.gif
/imgs/gif/gifset_f/eye2b_8.gif
/imgs/gif/gifset_f/eye2b_80.gif
/imgs/gif/gifset_f/eye2b_9.gif
/imgs/gif/gifset_f/eye2b_90.gif
/imgs/gif/gifset_f/eye2d.gif
/imgs/gif/gifset_f/eye2d_1.gif
/imgs/gif/gifset_f/eye2d_10.gif
/imgs/gif/gifset_f/eye2d_100.gif
/imgs/gif/gifset_f/eye2d_2.gif
/imgs/gif/gifset_f/eye2d_20.gif
/imgs/gif/gifset_f/eye2d_3.gif
/imgs/gif/gifset_f/eye2d_30.gif
/imgs/gif/gifset_f/eye2d_4.gif
/imgs/gif/gifset_f/eye2d_40.gif
/imgs/gif/gifset_f/eye2d_5.gif
/imgs/gif/gifset_f/eye2d_50.gif
/imgs/gif/gifset_f/eye2d_6.gif
/imgs/gif/gifset_f/eye2d_7.gif
/imgs/gif/gifset_f/eye2d_70.gif
/imgs/gif/gifset_f/eye2d_8.gif
/imgs/gif/gifset_f/eye2d_80.gif
/imgs/gif/gifset_f/eye2d_9.gif
/imgs/gif/gifset_f/eye2d_90.gif
/imgs/gif/gifset_f/eye2p.gif
/imgs/gif/gifset_f/eye2p_1.gif
/imgs/gif/gifset_f/eye2p_10.gif
/imgs/gif/gifset_f/eye2p_100.gif
/imgs/gif/gifset_f/eye2p_2.gif
/imgs/gif/gifset_f/eye2p_20.gif
/imgs/gif/gifset_f/eye2p_3.gif
/imgs/gif/gifset_f/eye2p_30.gif
/imgs/gif/gifset_f/eye2p_4.gif
/imgs/gif/gifset_f/eye2p_40.gif
/imgs/gif/gifset_f/eye2p_5.gif
/imgs/gif/gifset_f/eye2p_50.gif
/imgs/gif/gifset_f/eye2p_6.gif
/imgs/gif/gifset_f/eye2p_7.gif
/imgs/gif/gifset_f/eye2p_70.gif
/imgs/gif/gifset_f/eye2p_8.gif
/imgs/gif/gifset_f/eye2p_80.gif
/imgs/gif/gifset_f/eye2p_9.gif
/imgs/gif/gifset_f/eye2p_90.gif
/imgs/gif/gifset_f/eye2q.gif
/imgs/gif/gifset_f/eye2q_1.gif
/imgs/gif/gifset_f/eye2q_10.gif
/imgs/gif/gifset_f/eye2q_100.gif
/imgs/gif/gifset_f/eye2q_2.gif
/imgs/gif/gifset_f/eye2q_20.gif
/imgs/gif/gifset_f/eye2q_3.gif
/imgs/gif/gifset_f/eye2q_30.gif
/imgs/gif/gifset_f/eye2q_4.gif
/imgs/gif/gifset_f/eye2q_40.gif
/imgs/gif/gifset_f/eye2q_5.gif
/imgs/gif/gifset_f/eye2q_50.gif
/imgs/gif/gifset_f/eye2q_6.gif
/imgs/gif/gifset_f/eye2q_7.gif
/imgs/gif/gifset_f/eye2q_70.gif
/imgs/gif/gifset_f/eye2q_8.gif
/imgs/gif/gifset_f/eye2q_80.gif
/imgs/gif/gifset_f/eye2q_9.gif
/imgs/gif/gifset_f/eye2q_90.gif
/imgs/gif/gifset_f/eye3.gif
/imgs/gif/gifset_f/eye3b.gif
/imgs/gif/gifset_f/eye3b_1.gif
/imgs/gif/gifset_f/eye3b_10.gif
/imgs/gif/gifset_f/eye3b_100.gif
/imgs/gif/gifset_f/eye3b_2.gif
/imgs/gif/gifset_f/eye3b_20.gif
/imgs/gif/gifset_f/eye3b_3.gif
/imgs/gif/gifset_f/eye3b_30.gif
/imgs/gif/gifset_f/eye3b_4.gif
/imgs/gif/gifset_f/eye3b_40.gif
/imgs/gif/gifset_f/eye3b_5.gif
/imgs/gif/gifset_f/eye3b_50.gif
/imgs/gif/gifset_f/eye3b_6.gif
/imgs/gif/gifset_f/eye3b_7.gif
/imgs/gif/gifset_f/eye3b_70.gif
/imgs/gif/gifset_f/eye3b_8.gif
/imgs/gif/gifset_f/eye3b_80.gif
/imgs/gif/gifset_f/eye3b_9.gif
/imgs/gif/gifset_f/eye3b_90.gif
/imgs/gif/gifset_f/eye3d.gif
/imgs/gif/gifset_f/eye3d_1.gif
/imgs/gif/gifset_f/eye3d_10.gif
/imgs/gif/gifset_f/eye3d_100.gif
/imgs/gif/gifset_f/eye3d_2.gif
/imgs/gif/gifset_f/eye3d_20.gif
/imgs/gif/gifset_f/eye3d_3.gif
/imgs/gif/gifset_f/eye3d_30.gif
/imgs/gif/gifset_f/eye3d_4.gif
/imgs/gif/gifset_f/eye3d_40.gif
/imgs/gif/gifset_f/eye3d_5.gif
/imgs/gif/gifset_f/eye3d_50.gif
/imgs/gif/gifset_f/eye3d_6.gif
/imgs/gif/gifset_f/eye3d_7.gif
/imgs/gif/gifset_f/eye3d_70.gif
/imgs/gif/gifset_f/eye3d_8.gif
/imgs/gif/gifset_f/eye3d_80.gif
/imgs/gif/gifset_f/eye3d_9.gif
/imgs/gif/gifset_f/eye3d_90.gif
/imgs/gif/gifset_f/eye3p.gif
/imgs/gif/gifset_f/eye3p_1.gif
/imgs/gif/gifset_f/eye3p_10.gif
/imgs/gif/gifset_f/eye3p_100.gif
/imgs/gif/gifset_f/eye3p_2.gif
/imgs/gif/gifset_f/eye3p_20.gif
/imgs/gif/gifset_f/eye3p_3.gif
/imgs/gif/gifset_f/eye3p_30.gif
/imgs/gif/gifset_f/eye3p_4.gif
/imgs/gif/gifset_f/eye3p_40.gif
/imgs/gif/gifset_f/eye3p_5.gif
/imgs/gif/gifset_f/eye3p_50.gif
/imgs/gif/gifset_f/eye3p_6.gif
/imgs/gif/gifset_f/eye3p_7.gif
/imgs/gif/gifset_f/eye3p_70.gif
/imgs/gif/gifset_f/eye3p_8.gif
/imgs/gif/gifset_f/eye3p_80.gif
/imgs/gif/gifset_f/eye3p_9.gif
/imgs/gif/gifset_f/eye3p_90.gif
/imgs/gif/gifset_f/eye3q.gif
/imgs/gif/gifset_f/eye3q_1.gif
/imgs/gif/gifset_f/eye3q_10.gif
/imgs/gif/gifset_f/eye3q_100.gif
/imgs/gif/gifset_f/eye3q_2.gif
/imgs/gif/gifset_f/eye3q_20.gif
/imgs/gif/gifset_f/eye3q_3.gif
/imgs/gif/gifset_f/eye3q_30.gif
/imgs/gif/gifset_f/eye3q_4.gif
/imgs/gif/gifset_f/eye3q_40.gif
/imgs/gif/gifset_f/eye3q_5.gif
/imgs/gif/gifset_f/eye3q_50.gif
/imgs/gif/gifset_f/eye3q_6.gif
/imgs/gif/gifset_f/eye3q_7.gif
/imgs/gif/gifset_f/eye3q_70.gif
/imgs/gif/gifset_f/eye3q_8.gif
/imgs/gif/gifset_f/eye3q_80.gif
/imgs/gif/gifset_f/eye3q_9.gif
/imgs/gif/gifset_f/eye3q_90.gif
/imgs/gif/gifset_f/film.gif
/imgs/gif/gifset_f/filmb.gif
/imgs/gif/gifset_f/filmb_1.gif
/imgs/gif/gifset_f/filmb_10.gif
/imgs/gif/gifset_f/filmb_100.gif
/imgs/gif/gifset_f/filmb_2.gif
/imgs/gif/gifset_f/filmb_20.gif
/imgs/gif/gifset_f/filmb_3.gif
/imgs/gif/gifset_f/filmb_30.gif
/imgs/gif/gifset_f/filmb_4.gif
/imgs/gif/gifset_f/filmb_40.gif
/imgs/gif/gifset_f/filmb_5.gif
/imgs/gif/gifset_f/filmb_50.gif
/imgs/gif/gifset_f/filmb_6.gif
/imgs/gif/gifset_f/filmb_7.gif
/imgs/gif/gifset_f/filmb_70.gif
/imgs/gif/gifset_f/filmb_8.gif
/imgs/gif/gifset_f/filmb_80.gif
/imgs/gif/gifset_f/filmb_9.gif
/imgs/gif/gifset_f/filmb_90.gif
/imgs/gif/gifset_f/filmd.gif
/imgs/gif/gifset_f/filmd_1.gif
/imgs/gif/gifset_f/filmd_10.gif
/imgs/gif/gifset_f/filmd_100.gif
/imgs/gif/gifset_f/filmd_2.gif
/imgs/gif/gifset_f/filmd_20.gif
/imgs/gif/gifset_f/filmd_3.gif
/imgs/gif/gifset_f/filmd_30.gif
/imgs/gif/gifset_f/filmd_4.gif
/imgs/gif/gifset_f/filmd_40.gif
/imgs/gif/gifset_f/filmd_5.gif
/imgs/gif/gifset_f/filmd_50.gif
/imgs/gif/gifset_f/filmd_6.gif
/imgs/gif/gifset_f/filmd_7.gif
/imgs/gif/gifset_f/filmd_70.gif
/imgs/gif/gifset_f/filmd_8.gif
/imgs/gif/gifset_f/filmd_80.gif
/imgs/gif/gifset_f/filmd_9.gif
/imgs/gif/gifset_f/filmd_90.gif
/imgs/gif/gifset_f/filmp.gif
/imgs/gif/gifset_f/filmp_1.gif
/imgs/gif/gifset_f/filmp_10.gif
/imgs/gif/gifset_f/filmp_100.gif
/imgs/gif/gifset_f/filmp_2.gif
/imgs/gif/gifset_f/filmp_20.gif
/imgs/gif/gifset_f/filmp_3.gif
/imgs/gif/gifset_f/filmp_30.gif
/imgs/gif/gifset_f/filmp_4.gif
/imgs/gif/gifset_f/filmp_40.gif
/imgs/gif/gifset_f/filmp_5.gif
/imgs/gif/gifset_f/filmp_50.gif
/imgs/gif/gifset_f/filmp_6.gif
/imgs/gif/gifset_f/filmp_7.gif
/imgs/gif/gifset_f/filmp_70.gif
/imgs/gif/gifset_f/filmp_8.gif
/imgs/gif/gifset_f/filmp_80.gif
/imgs/gif/gifset_f/filmp_9.gif
/imgs/gif/gifset_f/filmp_90.gif
/imgs/gif/gifset_f/filmq.gif
/imgs/gif/gifset_f/filmq_1.gif
/imgs/gif/gifset_f/filmq_10.gif
/imgs/gif/gifset_f/filmq_100.gif
/imgs/gif/gifset_f/filmq_2.gif
/imgs/gif/gifset_f/filmq_20.gif
/imgs/gif/gifset_f/filmq_3.gif
/imgs/gif/gifset_f/filmq_30.gif
/imgs/gif/gifset_f/filmq_4.gif
/imgs/gif/gifset_f/filmq_40.gif
/imgs/gif/gifset_f/filmq_5.gif
/imgs/gif/gifset_f/filmq_50.gif
/imgs/gif/gifset_f/filmq_6.gif
/imgs/gif/gifset_f/filmq_7.gif
/imgs/gif/gifset_f/filmq_70.gif
/imgs/gif/gifset_f/filmq_8.gif
/imgs/gif/gifset_f/filmq_80.gif
/imgs/gif/gifset_f/filmq_9.gif
/imgs/gif/gifset_f/filmq_90.gif
/imgs/gif/gifset_f/firebubblesb_1.gif
/imgs/gif/gifset_f/firebubblesb_10.gif
/imgs/gif/gifset_f/firebubblesb_100.gif
/imgs/gif/gifset_f/firebubblesb_2.gif
/imgs/gif/gifset_f/firebubblesb_20.gif
/imgs/gif/gifset_f/firebubblesb_3.gif
/imgs/gif/gifset_f/firebubblesb_30.gif
/imgs/gif/gifset_f/firebubblesb_4.gif
/imgs/gif/gifset_f/firebubblesb_40.gif
/imgs/gif/gifset_f/firebubblesb_5.gif
/imgs/gif/gifset_f/firebubblesb_50.gif
/imgs/gif/gifset_f/firebubblesb_6.gif
/imgs/gif/gifset_f/firebubblesb_7.gif
/imgs/gif/gifset_f/firebubblesb_70.gif
/imgs/gif/gifset_f/firebubblesb_8.gif
/imgs/gif/gifset_f/firebubblesb_80.gif
/imgs/gif/gifset_f/firebubblesb_9.gif
/imgs/gif/gifset_f/firebubblesb_90.gif
/imgs/gif/gifset_f/firebubblesd_1.gif
/imgs/gif/gifset_f/firebubblesd_10.gif
/imgs/gif/gifset_f/firebubblesd_100.gif
/imgs/gif/gifset_f/firebubblesd_2.gif
/imgs/gif/gifset_f/firebubblesd_20.gif
/imgs/gif/gifset_f/firebubblesd_3.gif
/imgs/gif/gifset_f/firebubblesd_30.gif
/imgs/gif/gifset_f/firebubblesd_4.gif
/imgs/gif/gifset_f/firebubblesd_40.gif
/imgs/gif/gifset_f/firebubblesd_5.gif
/imgs/gif/gifset_f/firebubblesd_50.gif
/imgs/gif/gifset_f/firebubblesd_6.gif
/imgs/gif/gifset_f/firebubblesd_7.gif
/imgs/gif/gifset_f/firebubblesd_70.gif
/imgs/gif/gifset_f/firebubblesd_8.gif
/imgs/gif/gifset_f/firebubblesd_80.gif
/imgs/gif/gifset_f/firebubblesd_9.gif
/imgs/gif/gifset_f/firebubblesd_90.gif
/imgs/gif/gifset_f/firebubblesp_1.gif
/imgs/gif/gifset_f/firebubblesp_10.gif
/imgs/gif/gifset_f/firebubblesp_100.gif
/imgs/gif/gifset_f/firebubblesp_2.gif
/imgs/gif/gifset_f/firebubblesp_20.gif
/imgs/gif/gifset_f/firebubblesp_3.gif
/imgs/gif/gifset_f/firebubblesp_30.gif
/imgs/gif/gifset_f/firebubblesp_4.gif
/imgs/gif/gifset_f/firebubblesp_40.gif
/imgs/gif/gifset_f/firebubblesp_5.gif
/imgs/gif/gifset_f/firebubblesp_50.gif
/imgs/gif/gifset_f/firebubblesp_6.gif
/imgs/gif/gifset_f/firebubblesp_7.gif
/imgs/gif/gifset_f/firebubblesp_70.gif
/imgs/gif/gifset_f/firebubblesp_8.gif
/imgs/gif/gifset_f/firebubblesp_80.gif
/imgs/gif/gifset_f/firebubblesp_9.gif
/imgs/gif/gifset_f/firebubblesp_90.gif
/imgs/gif/gifset_firebubbles/firework.gif
/imgs/gif/gifset_firebubbles/fireworkb.gif
/imgs/gif/gifset_firebubbles/fireworkb_1.gif
/imgs/gif/gifset_firebubbles/fireworkb_10.gif
/imgs/gif/gifset_firebubbles/fireworkb_100.gif
/imgs/gif/gifset_firebubbles/fireworkb_2.gif
/imgs/gif/gifset_firebubbles/fireworkb_20.gif
/imgs/gif/gifset_firebubbles/fireworkb_3.gif
/imgs/gif/gifset_firebubbles/fireworkb_30.gif
/imgs/gif/gifset_firebubbles/fireworkb_4.gif
/imgs/gif/gifset_firebubbles/fireworkb_40.gif
/imgs/gif/gifset_firebubbles/fireworkb_5.gif
/imgs/gif/gifset_firebubbles/fireworkb_50.gif
/imgs/gif/gifset_firebubbles/fireworkb_6.gif
/imgs/gif/gifset_firebubbles/fireworkb_7.gif
/imgs/gif/gifset_firebubbles/fireworkb_70.gif
/imgs/gif/gifset_firebubbles/fireworkb_8.gif
/imgs/gif/gifset_firebubbles/fireworkb_80.gif
/imgs/gif/gifset_firebubbles/fireworkb_9.gif
/imgs/gif/gifset_firebubbles/fireworkb_90.gif
/imgs/gif/gifset_firebubbles/fireworkd.gif
/imgs/gif/gifset_firebubbles/fireworkd_1.gif
/imgs/gif/gifset_firebubbles/fireworkd_10.gif
/imgs/gif/gifset_firebubbles/fireworkd_100.gif
/imgs/gif/gifset_firebubbles/fireworkd_2.gif
/imgs/gif/gifset_firebubbles/fireworkd_20.gif
/imgs/gif/gifset_firebubbles/fireworkd_3.gif
/imgs/gif/gifset_firebubbles/fireworkd_30.gif
/imgs/gif/gifset_firebubbles/fireworkd_4.gif
/imgs/gif/gifset_firebubbles/fireworkd_40.gif
/imgs/gif/gifset_firebubbles/fireworkd_5.gif
/imgs/gif/gifset_firebubbles/fireworkd_50.gif
/imgs/gif/gifset_firebubbles/fireworkd_6.gif
/imgs/gif/gifset_firebubbles/fireworkd_7.gif
/imgs/gif/gifset_firebubbles/fireworkd_70.gif
/imgs/gif/gifset_firebubbles/fireworkd_8.gif
/imgs/gif/gifset_firebubbles/fireworkd_80.gif
/imgs/gif/gifset_firebubbles/fireworkd_9.gif
/imgs/gif/gifset_firebubbles/fireworkd_90.gif
/imgs/gif/gifset_firebubbles/fireworkp.gif
/imgs/gif/gifset_firebubbles/fireworkp_1.gif
/imgs/gif/gifset_firebubbles/fireworkp_10.gif
/imgs/gif/gifset_firebubbles/fireworkp_100.gif
/imgs/gif/gifset_firebubbles/fireworkp_2.gif
/imgs/gif/gifset_firebubbles/fireworkp_20.gif
/imgs/gif/gifset_firebubbles/fireworkp_3.gif
/imgs/gif/gifset_firebubbles/fireworkp_30.gif
/imgs/gif/gifset_firebubbles/fireworkp_4.gif
/imgs/gif/gifset_firebubbles/fireworkp_40.gif
/imgs/gif/gifset_firebubbles/fireworkp_5.gif
/imgs/gif/gifset_firebubbles/fireworkp_50.gif
/imgs/gif/gifset_firebubbles/fireworkp_6.gif
/imgs/gif/gifset_firebubbles/fireworkp_7.gif
/imgs/gif/gifset_firebubbles/fireworkp_70.gif
/imgs/gif/gifset_firebubbles/fireworkp_8.gif
/imgs/gif/gifset_firebubbles/fireworkp_80.gif
/imgs/gif/gifset_firebubbles/fireworkp_9.gif
/imgs/gif/gifset_firebubbles/fireworkp_90.gif
/imgs/gif/gifset_firebubbles/fireworkq.gif
/imgs/gif/gifset_firebubbles/fireworkq_1.gif
/imgs/gif/gifset_firebubbles/fireworkq_10.gif
/imgs/gif/gifset_firebubbles/fireworkq_100.gif
/imgs/gif/gifset_firebubbles/fireworkq_2.gif
/imgs/gif/gifset_firebubbles/fireworkq_20.gif
/imgs/gif/gifset_firebubbles/fireworkq_3.gif
/imgs/gif/gifset_firebubbles/fireworkq_30.gif
/imgs/gif/gifset_firebubbles/fireworkq_4.gif
/imgs/gif/gifset_firebubbles/fireworkq_40.gif
/imgs/gif/gifset_firebubbles/fireworkq_5.gif
/imgs/gif/gifset_firebubbles/fireworkq_50.gif
/imgs/gif/gifset_firebubbles/fireworkq_6.gif
/imgs/gif/gifset_firebubbles/fireworkq_7.gif
/imgs/gif/gifset_firebubbles/fireworkq_70.gif
/imgs/gif/gifset_firebubbles/fireworkq_8.gif
/imgs/gif/gifset_firebubbles/fireworkq_80.gif
/imgs/gif/gifset_firebubbles/fireworkq_9.gif
/imgs/gif/gifset_firebubbles/fireworkq_90.gif
/imgs/gif/gifset_h/geard2.gif
/imgs/gif/gifset_h/geard2b.gif
/imgs/gif/gifset_h/geard2b_1.gif
/imgs/gif/gifset_h/geard2b_10.gif
/imgs/gif/gifset_h/geard2b_100.gif
/imgs/gif/gifset_h/geard2b_2.gif
/imgs/gif/gifset_h/geard2b_20.gif
/imgs/gif/gifset_h/geard2b_3.gif
/imgs/gif/gifset_h/geard2b_30.gif
/imgs/gif/gifset_h/geard2b_4.gif
/imgs/gif/gifset_h/geard2b_40.gif
/imgs/gif/gifset_h/geard2b_5.gif
/imgs/gif/gifset_h/geard2b_50.gif
/imgs/gif/gifset_h/geard2b_6.gif
/imgs/gif/gifset_h/geard2b_7.gif
/imgs/gif/gifset_h/geard2b_70.gif
/imgs/gif/gifset_h/geard2b_8.gif
/imgs/gif/gifset_h/geard2b_80.gif
/imgs/gif/gifset_h/geard2b_9.gif
/imgs/gif/gifset_h/geard2b_90.gif
/imgs/gif/gifset_h/geard2d.gif
/imgs/gif/gifset_h/geard2d_1.gif
/imgs/gif/gifset_h/geard2d_10.gif
/imgs/gif/gifset_h/geard2d_100.gif
/imgs/gif/gifset_h/geard2d_2.gif
/imgs/gif/gifset_h/geard2d_20.gif
/imgs/gif/gifset_h/geard2d_3.gif
/imgs/gif/gifset_h/geard2d_30.gif
/imgs/gif/gifset_h/geard2d_4.gif
/imgs/gif/gifset_h/geard2d_40.gif
/imgs/gif/gifset_h/geard2d_5.gif
/imgs/gif/gifset_h/geard2d_50.gif
/imgs/gif/gifset_h/geard2d_6.gif
/imgs/gif/gifset_h/geard2d_7.gif
/imgs/gif/gifset_h/geard2d_70.gif
/imgs/gif/gifset_h/geard2d_8.gif
/imgs/gif/gifset_h/geard2d_80.gif
/imgs/gif/gifset_h/geard2d_9.gif
/imgs/gif/gifset_h/geard2d_90.gif
/imgs/gif/gifset_h/geard2p.gif
/imgs/gif/gifset_h/geard2p_1.gif
/imgs/gif/gifset_h/geard2p_10.gif
/imgs/gif/gifset_h/geard2p_100.gif
/imgs/gif/gifset_h/geard2p_2.gif
/imgs/gif/gifset_h/geard2p_20.gif
/imgs/gif/gifset_h/geard2p_3.gif
/imgs/gif/gifset_h/geard2p_30.gif
/imgs/gif/gifset_h/geard2p_4.gif
/imgs/gif/gifset_h/geard2p_40.gif
/imgs/gif/gifset_h/geard2p_5.gif
/imgs/gif/gifset_h/geard2p_50.gif
/imgs/gif/gifset_h/geard2p_6.gif
/imgs/gif/gifset_h/geard2p_7.gif
/imgs/gif/gifset_h/geard2p_70.gif
/imgs/gif/gifset_h/geard2p_8.gif
/imgs/gif/gifset_h/geard2p_80.gif
/imgs/gif/gifset_h/geard2p_9.gif
/imgs/gif/gifset_h/geard2p_90.gif
/imgs/gif/gifset_h/geard2q.gif
/imgs/gif/gifset_h/geard2q_1.gif
/imgs/gif/gifset_h/geard2q_10.gif
/imgs/gif/gifset_h/geard2q_100.gif
/imgs/gif/gifset_h/geard2q_2.gif
/imgs/gif/gifset_h/geard2q_20.gif
/imgs/gif/gifset_h/geard2q_3.gif
/imgs/gif/gifset_h/geard2q_30.gif
/imgs/gif/gifset_h/geard2q_4.gif
/imgs/gif/gifset_h/geard2q_40.gif
/imgs/gif/gifset_h/geard2q_5.gif
/imgs/gif/gifset_h/geard2q_50.gif
/imgs/gif/gifset_h/geard2q_6.gif
/imgs/gif/gifset_h/geard2q_7.gif
/imgs/gif/gifset_h/geard2q_70.gif
/imgs/gif/gifset_h/geard2q_8.gif
/imgs/gif/gifset_h/geard2q_80.gif
/imgs/gif/gifset_h/geard2q_9.gif
/imgs/gif/gifset_h/geard2q_90.gif
/imgs/gif/gifset_h/gears2.gif
/imgs/gif/gifset_h/gears2b.gif
/imgs/gif/gifset_h/gears2b_1.gif
/imgs/gif/gifset_h/gears2b_10.gif
/imgs/gif/gifset_h/gears2b_100.gif
/imgs/gif/gifset_h/gears2b_2.gif
/imgs/gif/gifset_h/gears2b_20.gif
/imgs/gif/gifset_h/gears2b_3.gif
/imgs/gif/gifset_h/gears2b_30.gif
/imgs/gif/gifset_h/gears2b_4.gif
/imgs/gif/gifset_h/gears2b_40.gif
/imgs/gif/gifset_h/gears2b_5.gif
/imgs/gif/gifset_h/gears2b_50.gif
/imgs/gif/gifset_h/gears2b_6.gif
/imgs/gif/gifset_h/gears2b_7.gif
/imgs/gif/gifset_h/gears2b_70.gif
/imgs/gif/gifset_h/gears2b_8.gif
/imgs/gif/gifset_h/gears2b_80.gif
/imgs/gif/gifset_h/gears2b_9.gif
/imgs/gif/gifset_h/gears2b_90.gif
/imgs/gif/gifset_h/gears2d.gif
/imgs/gif/gifset_h/gears2d_1.gif
/imgs/gif/gifset_h/gears2d_10.gif
/imgs/gif/gifset_h/gears2d_100.gif
/imgs/gif/gifset_h/gears2d_2.gif
/imgs/gif/gifset_h/gears2d_20.gif
/imgs/gif/gifset_h/gears2d_3.gif
/imgs/gif/gifset_h/gears2d_30.gif
/imgs/gif/gifset_h/gears2d_4.gif
/imgs/gif/gifset_h/gears2d_40.gif
/imgs/gif/gifset_h/gears2d_5.gif
/imgs/gif/gifset_h/gears2d_50.gif
/imgs/gif/gifset_h/gears2d_6.gif
/imgs/gif/gifset_h/gears2d_7.gif
/imgs/gif/gifset_h/gears2d_70.gif
/imgs/gif/gifset_h/gears2d_8.gif
/imgs/gif/gifset_h/gears2d_80.gif
/imgs/gif/gifset_h/gears2d_9.gif
/imgs/gif/gifset_h/gears2d_90.gif
/imgs/gif/gifset_h/gears2p.gif
/imgs/gif/gifset_h/gears2p_1.gif
/imgs/gif/gifset_h/gears2p_10.gif
/imgs/gif/gifset_h/gears2p_100.gif
/imgs/gif/gifset_h/gears2p_2.gif
/imgs/gif/gifset_h/gears2p_20.gif
/imgs/gif/gifset_h/gears2p_3.gif
/imgs/gif/gifset_h/gears2p_30.gif
/imgs/gif/gifset_h/gears2p_4.gif
/imgs/gif/gifset_h/gears2p_40.gif
/imgs/gif/gifset_h/gears2p_5.gif
/imgs/gif/gifset_h/gears2p_50.gif
/imgs/gif/gifset_h/gears2p_6.gif
/imgs/gif/gifset_h/gears2p_7.gif
/imgs/gif/gifset_h/gears2p_70.gif
/imgs/gif/gifset_h/gears2p_8.gif
/imgs/gif/gifset_h/gears2p_80.gif
/imgs/gif/gifset_h/gears2p_9.gif
/imgs/gif/gifset_h/gears2p_90.gif
/imgs/gif/gifset_h/gears2q.gif
/imgs/gif/gifset_h/gears2q_1.gif
/imgs/gif/gifset_h/gears2q_10.gif
/imgs/gif/gifset_h/gears2q_100.gif
/imgs/gif/gifset_h/gears2q_2.gif
/imgs/gif/gifset_h/gears2q_20.gif
/imgs/gif/gifset_h/gears2q_3.gif
/imgs/gif/gifset_h/gears2q_30.gif
/imgs/gif/gifset_h/gears2q_4.gif
/imgs/gif/gifset_h/gears2q_40.gif
/imgs/gif/gifset_h/gears2q_5.gif
/imgs/gif/gifset_h/gears2q_50.gif
/imgs/gif/gifset_h/gears2q_6.gif
/imgs/gif/gifset_h/gears2q_7.gif
/imgs/gif/gifset_h/gears2q_70.gif
/imgs/gif/gifset_h/gears2q_8.gif
/imgs/gif/gifset_h/gears2q_80.gif
/imgs/gif/gifset_h/gears2q_9.gif
/imgs/gif/gifset_h/gears2q_90.gif
/imgs/gif/gifset_h/header.gif
/imgs/gif/gifset_h/headerb.gif
/imgs/gif/gifset_h/headerb_1.gif
/imgs/gif/gifset_h/headerb_10.gif
/imgs/gif/gifset_h/headerb_100.gif
/imgs/gif/gifset_h/headerb_2.gif
/imgs/gif/gifset_h/headerb_20.gif
/imgs/gif/gifset_h/headerb_3.gif
/imgs/gif/gifset_h/headerb_30.gif
/imgs/gif/gifset_h/headerb_4.gif
/imgs/gif/gifset_h/headerb_40.gif
/imgs/gif/gifset_h/headerb_5.gif
/imgs/gif/gifset_h/headerb_50.gif
/imgs/gif/gifset_h/headerb_6.gif
/imgs/gif/gifset_h/headerb_7.gif
/imgs/gif/gifset_h/headerb_70.gif
/imgs/gif/gifset_h/headerb_8.gif
/imgs/gif/gifset_h/headerb_80.gif
/imgs/gif/gifset_h/headerb_9.gif
/imgs/gif/gifset_h/headerb_90.gif
/imgs/gif/gifset_h/headerd.gif
/imgs/gif/gifset_h/headerd_1.gif
/imgs/gif/gifset_h/headerd_10.gif
/imgs/gif/gifset_h/headerd_100.gif
/imgs/gif/gifset_h/headerd_2.gif
/imgs/gif/gifset_h/headerd_20.gif
/imgs/gif/gifset_h/headerd_3.gif
/imgs/gif/gifset_h/headerd_30.gif
/imgs/gif/gifset_h/headerd_4.gif
/imgs/gif/gifset_h/headerd_40.gif
/imgs/gif/gifset_h/headerd_5.gif
/imgs/gif/gifset_h/headerd_50.gif
/imgs/gif/gifset_h/headerd_6.gif
/imgs/gif/gifset_h/headerd_7.gif
/imgs/gif/gifset_h/headerd_70.gif
/imgs/gif/gifset_h/headerd_8.gif
/imgs/gif/gifset_h/headerd_80.gif
/imgs/gif/gifset_h/headerd_9.gif
/imgs/gif/gifset_h/headerd_90.gif
/imgs/gif/gifset_h/headerp.gif
/imgs/gif/gifset_h/headerp_1.gif
/imgs/gif/gifset_h/headerp_10.gif
/imgs/gif/gifset_h/headerp_100.gif
/imgs/gif/gifset_h/headerp_2.gif
/imgs/gif/gifset_h/headerp_20.gif
/imgs/gif/gifset_h/headerp_3.gif
/imgs/gif/gifset_h/headerp_30.gif
/imgs/gif/gifset_h/headerp_4.gif
/imgs/gif/gifset_h/headerp_40.gif
/imgs/gif/gifset_h/headerp_5.gif
/imgs/gif/gifset_h/headerp_50.gif
/imgs/gif/gifset_h/headerp_6.gif
/imgs/gif/gifset_h/headerp_7.gif
/imgs/gif/gifset_h/headerp_70.gif
/imgs/gif/gifset_h/headerp_8.gif
/imgs/gif/gifset_h/headerp_80.gif
/imgs/gif/gifset_h/headerp_9.gif
/imgs/gif/gifset_h/headerp_90.gif
/imgs/gif/gifset_h/headerq.gif
/imgs/gif/gifset_h/headerq_1.gif
/imgs/gif/gifset_h/headerq_10.gif
/imgs/gif/gifset_h/headerq_100.gif
/imgs/gif/gifset_h/headerq_2.gif
/imgs/gif/gifset_h/headerq_20.gif
/imgs/gif/gifset_h/headerq_3.gif
/imgs/gif/gifset_h/headerq_30.gif
/imgs/gif/gifset_h/headerq_4.gif
/imgs/gif/gifset_h/headerq_40.gif
/imgs/gif/gifset_h/headerq_5.gif
/imgs/gif/gifset_h/headerq_50.gif
/imgs/gif/gifset_h/headerq_6.gif
/imgs/gif/gifset_h/headerq_7.gif
/imgs/gif/gifset_h/headerq_70.gif
/imgs/gif/gifset_h/headerq_8.gif
/imgs/gif/gifset_h/headerq_80.gif
/imgs/gif/gifset_h/headerq_9.gif
/imgs/gif/gifset_h/headerq_90.gif
/imgs/gif/gifset_h/heart.gif
/imgs/gif/gifset_h/heartb.gif
/imgs/gif/gifset_h/heartb_1.gif
/imgs/gif/gifset_h/heartb_10.gif
/imgs/gif/gifset_h/heartb_100.gif
/imgs/gif/gifset_h/heartb_2.gif
/imgs/gif/gifset_h/heartb_20.gif
/imgs/gif/gifset_h/heartb_3.gif
/imgs/gif/gifset_h/heartb_30.gif
/imgs/gif/gifset_h/heartb_4.gif
/imgs/gif/gifset_h/heartb_40.gif
/imgs/gif/gifset_h/heartb_5.gif
/imgs/gif/gifset_h/heartb_50.gif
/imgs/gif/gifset_h/heartb_6.gif
/imgs/gif/gifset_h/heartb_7.gif
/imgs/gif/gifset_h/heartb_70.gif
/imgs/gif/gifset_h/heartb_8.gif
/imgs/gif/gifset_h/heartb_80.gif
/imgs/gif/gifset_h/heartb_9.gif
/imgs/gif/gifset_h/heartb_90.gif
/imgs/gif/gifset_h/heartd.gif
/imgs/gif/gifset_h/heartd_1.gif
/imgs/gif/gifset_h/heartd_10.gif
/imgs/gif/gifset_h/heartd_100.gif
/imgs/gif/gifset_h/heartd_2.gif
/imgs/gif/gifset_h/heartd_20.gif
/imgs/gif/gifset_h/heartd_3.gif
/imgs/gif/gifset_h/heartd_30.gif
/imgs/gif/gifset_h/heartd_4.gif
/imgs/gif/gifset_h/heartd_40.gif
/imgs/gif/gifset_h/heartd_5.gif
/imgs/gif/gifset_h/heartd_50.gif
/imgs/gif/gifset_h/heartd_6.gif
/imgs/gif/gifset_h/heartd_7.gif
/imgs/gif/gifset_h/heartd_70.gif
/imgs/gif/gifset_h/heartd_8.gif
/imgs/gif/gifset_h/heartd_80.gif
/imgs/gif/gifset_h/heartd_9.gif
/imgs/gif/gifset_h/heartd_90.gif
/imgs/gif/gifset_h/heartp.gif
/imgs/gif/gifset_h/heartp_1.gif
/imgs/gif/gifset_h/heartp_10.gif
/imgs/gif/gifset_h/heartp_100.gif
/imgs/gif/gifset_h/heartp_2.gif
/imgs/gif/gifset_h/heartp_20.gif
/imgs/gif/gifset_h/heartp_3.gif
/imgs/gif/gifset_h/heartp_30.gif
/imgs/gif/gifset_h/heartp_4.gif
/imgs/gif/gifset_h/heartp_40.gif
/imgs/gif/gifset_h/heartp_5.gif
/imgs/gif/gifset_h/heartp_50.gif
/imgs/gif/gifset_h/heartp_6.gif
/imgs/gif/gifset_h/heartp_7.gif
/imgs/gif/gifset_h/heartp_70.gif
/imgs/gif/gifset_h/heartp_8.gif
/imgs/gif/gifset_h/heartp_80.gif
/imgs/gif/gifset_h/heartp_9.gif
/imgs/gif/gifset_h/heartp_90.gif
/imgs/gif/gifset_h/heartq.gif
/imgs/gif/gifset_h/heartq_1.gif
/imgs/gif/gifset_h/heartq_10.gif
/imgs/gif/gifset_h/heartq_100.gif
/imgs/gif/gifset_h/heartq_2.gif
/imgs/gif/gifset_h/heartq_20.gif
/imgs/gif/gifset_h/heartq_3.gif
/imgs/gif/gifset_h/heartq_30.gif
/imgs/gif/gifset_h/heartq_4.gif
/imgs/gif/gifset_h/heartq_40.gif
/imgs/gif/gifset_h/heartq_5.gif
/imgs/gif/gifset_h/heartq_50.gif
/imgs/gif/gifset_h/heartq_6.gif
/imgs/gif/gifset_h/heartq_7.gif
/imgs/gif/gifset_h/heartq_70.gif
/imgs/gif/gifset_h/heartq_8.gif
/imgs/gif/gifset_h/heartq_80.gif
/imgs/gif/gifset_h/heartq_9.gif
/imgs/gif/gifset_h/heartq_90.gif
/imgs/gif/gifset_h/helpbean.gif
/imgs/gif/gifset_knots/knot.gif
/imgs/gif/gifset_knots/knot_koeye.gif
/imgs/gif/gifset_knots/knotb.gif
/imgs/gif/gifset_knots/knotb_1.gif
/imgs/gif/gifset_knots/knotb_10.gif
/imgs/gif/gifset_knots/knotb_100.gif
/imgs/gif/gifset_knots/knotb_2.gif
/imgs/gif/gifset_knots/knotb_20.gif
/imgs/gif/gifset_knots/knotb_3.gif
/imgs/gif/gifset_knots/knotb_30.gif
/imgs/gif/gifset_knots/knotb_4.gif
/imgs/gif/gifset_knots/knotb_40.gif
/imgs/gif/gifset_knots/knotb_5.gif
/imgs/gif/gifset_knots/knotb_50.gif
/imgs/gif/gifset_knots/knotb_6.gif
/imgs/gif/gifset_knots/knotb_7.gif
/imgs/gif/gifset_knots/knotb_70.gif
/imgs/gif/gifset_knots/knotb_8.gif
/imgs/gif/gifset_knots/knotb_80.gif
/imgs/gif/gifset_knots/knotb_9.gif
/imgs/gif/gifset_knots/knotb_90.gif
/imgs/gif/gifset_knots/knotd.gif
/imgs/gif/gifset_knots/knotd_1.gif
/imgs/gif/gifset_knots/knotd_10.gif
/imgs/gif/gifset_knots/knotd_100.gif
/imgs/gif/gifset_knots/knotd_2.gif
/imgs/gif/gifset_knots/knotd_20.gif
/imgs/gif/gifset_knots/knotd_3.gif
/imgs/gif/gifset_knots/knotd_30.gif
/imgs/gif/gifset_knots/knotd_4.gif
/imgs/gif/gifset_knots/knotd_40.gif
/imgs/gif/gifset_knots/knotd_5.gif
/imgs/gif/gifset_knots/knotd_50.gif
/imgs/gif/gifset_knots/knotd_6.gif
/imgs/gif/gifset_knots/knotd_7.gif
/imgs/gif/gifset_knots/knotd_70.gif
/imgs/gif/gifset_knots/knotd_8.gif
/imgs/gif/gifset_knots/knotd_80.gif
/imgs/gif/gifset_knots/knotd_9.gif
/imgs/gif/gifset_knots/knotd_90.gif
/imgs/gif/gifset_knots/knotl.gif
/imgs/gif/gifset_knots/knotp.gif
/imgs/gif/gifset_knots/knotp_1.gif
/imgs/gif/gifset_knots/knotp_10.gif
/imgs/gif/gifset_knots/knotp_100.gif
/imgs/gif/gifset_knots/knotp_2.gif
/imgs/gif/gifset_knots/knotp_20.gif
/imgs/gif/gifset_knots/knotp_3.gif
/imgs/gif/gifset_knots/knotp_30.gif
/imgs/gif/gifset_knots/knotp_4.gif
/imgs/gif/gifset_knots/knotp_40.gif
/imgs/gif/gifset_knots/knotp_5.gif
/imgs/gif/gifset_knots/knotp_50.gif
/imgs/gif/gifset_knots/knotp_6.gif
/imgs/gif/gifset_knots/knotp_7.gif
/imgs/gif/gifset_knots/knotp_70.gif
/imgs/gif/gifset_knots/knotp_8.gif
/imgs/gif/gifset_knots/knotp_80.gif
/imgs/gif/gifset_knots/knotp_9.gif
/imgs/gif/gifset_knots/knotp_90.gif
/imgs/gif/gifset_knots/knotq.gif
/imgs/gif/gifset_knots/knotq_1.gif
/imgs/gif/gifset_knots/knotq_10.gif
/imgs/gif/gifset_knots/knotq_100.gif
/imgs/gif/gifset_knots/knotq_2.gif
/imgs/gif/gifset_knots/knotq_20.gif
/imgs/gif/gifset_knots/knotq_3.gif
/imgs/gif/gifset_knots/knotq_30.gif
/imgs/gif/gifset_knots/knotq_4.gif
/imgs/gif/gifset_knots/knotq_40.gif
/imgs/gif/gifset_knots/knotq_5.gif
/imgs/gif/gifset_knots/knotq_50.gif
/imgs/gif/gifset_knots/knotq_6.gif
/imgs/gif/gifset_knots/knotq_7.gif
/imgs/gif/gifset_knots/knotq_70.gif
/imgs/gif/gifset_knots/knotq_8.gif
/imgs/gif/gifset_knots/knotq_80.gif
/imgs/gif/gifset_knots/knotq_9.gif
/imgs/gif/gifset_knots/knotq_90.gif
/imgs/gif/gifset_knots/koeye_knot.gif
/imgs/gif/gifset_knots/koeye_knot_100x40.gif
/imgs/gif/gifset_knots/koeye_knot_200x80.gif
/imgs/gif/gifset_knots/koeye_knot_400x160.gif
/imgs/gif/gifset_knots/koeye_rings.gif
/imgs/gif/gifset_m/laser1.gif
/imgs/gif/gifset_m/laser1b.gif
/imgs/gif/gifset_m/laser1b_1.gif
/imgs/gif/gifset_m/laser1b_10.gif
/imgs/gif/gifset_m/laser1b_100.gif
/imgs/gif/gifset_m/laser1b_2.gif
/imgs/gif/gifset_m/laser1b_20.gif
/imgs/gif/gifset_m/laser1b_3.gif
/imgs/gif/gifset_m/laser1b_30.gif
/imgs/gif/gifset_m/laser1b_4.gif
/imgs/gif/gifset_m/laser1b_40.gif
/imgs/gif/gifset_m/laser1b_5.gif
/imgs/gif/gifset_m/laser1b_50.gif
/imgs/gif/gifset_m/laser1b_6.gif
/imgs/gif/gifset_m/laser1b_7.gif
/imgs/gif/gifset_m/laser1b_70.gif
/imgs/gif/gifset_m/laser1b_8.gif
/imgs/gif/gifset_m/laser1b_80.gif
/imgs/gif/gifset_m/laser1b_9.gif
/imgs/gif/gifset_m/laser1b_90.gif
/imgs/gif/gifset_m/laser1d.gif
/imgs/gif/gifset_m/laser1d_1.gif
/imgs/gif/gifset_m/laser1d_10.gif
/imgs/gif/gifset_m/laser1d_100.gif
/imgs/gif/gifset_m/laser1d_2.gif
/imgs/gif/gifset_m/laser1d_20.gif
/imgs/gif/gifset_m/laser1d_3.gif
/imgs/gif/gifset_m/laser1d_30.gif
/imgs/gif/gifset_m/laser1d_4.gif
/imgs/gif/gifset_m/laser1d_40.gif
/imgs/gif/gifset_m/laser1d_5.gif
/imgs/gif/gifset_m/laser1d_50.gif
/imgs/gif/gifset_m/laser1d_6.gif
/imgs/gif/gifset_m/laser1d_7.gif
/imgs/gif/gifset_m/laser1d_70.gif
/imgs/gif/gifset_m/laser1d_8.gif
/imgs/gif/gifset_m/laser1d_80.gif
/imgs/gif/gifset_m/laser1d_9.gif
/imgs/gif/gifset_m/laser1d_90.gif
/imgs/gif/gifset_m/laser1p.gif
/imgs/gif/gifset_m/laser1p_1.gif
/imgs/gif/gifset_m/laser1p_10.gif
/imgs/gif/gifset_m/laser1p_100.gif
/imgs/gif/gifset_m/laser1p_2.gif
/imgs/gif/gifset_m/laser1p_20.gif
/imgs/gif/gifset_m/laser1p_3.gif
/imgs/gif/gifset_m/laser1p_30.gif
/imgs/gif/gifset_m/laser1p_4.gif
/imgs/gif/gifset_m/laser1p_40.gif
/imgs/gif/gifset_m/laser1p_5.gif
/imgs/gif/gifset_m/laser1p_50.gif
/imgs/gif/gifset_m/laser1p_6.gif
/imgs/gif/gifset_m/laser1p_7.gif
/imgs/gif/gifset_m/laser1p_70.gif
/imgs/gif/gifset_m/laser1p_8.gif
/imgs/gif/gifset_m/laser1p_80.gif
/imgs/gif/gifset_m/laser1p_9.gif
/imgs/gif/gifset_m/laser1p_90.gif
/imgs/gif/gifset_m/laser1q.gif
/imgs/gif/gifset_m/laser1q_1.gif
/imgs/gif/gifset_m/laser1q_10.gif
/imgs/gif/gifset_m/laser1q_100.gif
/imgs/gif/gifset_m/laser1q_2.gif
/imgs/gif/gifset_m/laser1q_20.gif
/imgs/gif/gifset_m/laser1q_3.gif
/imgs/gif/gifset_m/laser1q_30.gif
/imgs/gif/gifset_m/laser1q_4.gif
/imgs/gif/gifset_m/laser1q_40.gif
/imgs/gif/gifset_m/laser1q_5.gif
/imgs/gif/gifset_m/laser1q_50.gif
/imgs/gif/gifset_m/laser1q_6.gif
/imgs/gif/gifset_m/laser1q_7.gif
/imgs/gif/gifset_m/laser1q_70.gif
/imgs/gif/gifset_m/laser1q_8.gif
/imgs/gif/gifset_m/laser1q_80.gif
/imgs/gif/gifset_m/laser1q_9.gif
/imgs/gif/gifset_m/laser1q_90.gif
/imgs/gif/gifset_m/laser2.gif
/imgs/gif/gifset_m/laser2b.gif
/imgs/gif/gifset_m/laser2b_1.gif
/imgs/gif/gifset_m/laser2b_10.gif
/imgs/gif/gifset_m/laser2b_100.gif
/imgs/gif/gifset_m/laser2b_2.gif
/imgs/gif/gifset_m/laser2b_20.gif
/imgs/gif/gifset_m/laser2b_3.gif
/imgs/gif/gifset_m/laser2b_30.gif
/imgs/gif/gifset_m/laser2b_4.gif
/imgs/gif/gifset_m/laser2b_40.gif
/imgs/gif/gifset_m/laser2b_5.gif
/imgs/gif/gifset_m/laser2b_50.gif
/imgs/gif/gifset_m/laser2b_6.gif
/imgs/gif/gifset_m/laser2b_7.gif
/imgs/gif/gifset_m/laser2b_70.gif
/imgs/gif/gifset_m/laser2b_8.gif
/imgs/gif/gifset_m/laser2b_80.gif
/imgs/gif/gifset_m/laser2b_9.gif
/imgs/gif/gifset_m/laser2b_90.gif
/imgs/gif/gifset_m/laser2d.gif
/imgs/gif/gifset_m/laser2d_1.gif
/imgs/gif/gifset_m/laser2d_10.gif
/imgs/gif/gifset_m/laser2d_100.gif
/imgs/gif/gifset_m/laser2d_2.gif
/imgs/gif/gifset_m/laser2d_20.gif
/imgs/gif/gifset_m/laser2d_3.gif
/imgs/gif/gifset_m/laser2d_30.gif
/imgs/gif/gifset_m/laser2d_4.gif
/imgs/gif/gifset_m/laser2d_40.gif
/imgs/gif/gifset_m/laser2d_5.gif
/imgs/gif/gifset_m/laser2d_50.gif
/imgs/gif/gifset_m/laser2d_6.gif
/imgs/gif/gifset_m/laser2d_7.gif
/imgs/gif/gifset_m/laser2d_70.gif
/imgs/gif/gifset_m/laser2d_8.gif
/imgs/gif/gifset_m/laser2d_80.gif
/imgs/gif/gifset_m/laser2d_9.gif
/imgs/gif/gifset_m/laser2d_90.gif
/imgs/gif/gifset_m/laser2p.gif
/imgs/gif/gifset_m/laser2p_1.gif
/imgs/gif/gifset_m/laser2p_10.gif
/imgs/gif/gifset_m/laser2p_100.gif
/imgs/gif/gifset_m/laser2p_2.gif
/imgs/gif/gifset_m/laser2p_20.gif
/imgs/gif/gifset_m/laser2p_3.gif
/imgs/gif/gifset_m/laser2p_30.gif
/imgs/gif/gifset_m/laser2p_4.gif
/imgs/gif/gifset_m/laser2p_40.gif
/imgs/gif/gifset_m/laser2p_5.gif
/imgs/gif/gifset_m/laser2p_50.gif
/imgs/gif/gifset_m/laser2p_6.gif
/imgs/gif/gifset_m/laser2p_7.gif
/imgs/gif/gifset_m/laser2p_70.gif
/imgs/gif/gifset_m/laser2p_8.gif
/imgs/gif/gifset_m/laser2p_80.gif
/imgs/gif/gifset_m/laser2p_9.gif
/imgs/gif/gifset_m/laser2p_90.gif
/imgs/gif/gifset_m/laser2q.gif
/imgs/gif/gifset_m/laser2q_1.gif
/imgs/gif/gifset_m/laser2q_10.gif
/imgs/gif/gifset_m/laser2q_100.gif
/imgs/gif/gifset_m/laser2q_2.gif
/imgs/gif/gifset_m/laser2q_20.gif
/imgs/gif/gifset_m/laser2q_3.gif
/imgs/gif/gifset_m/laser2q_30.gif
/imgs/gif/gifset_m/laser2q_4.gif
/imgs/gif/gifset_m/laser2q_40.gif
/imgs/gif/gifset_m/laser2q_5.gif
/imgs/gif/gifset_m/laser2q_50.gif
/imgs/gif/gifset_m/laser2q_6.gif
/imgs/gif/gifset_m/laser2q_7.gif
/imgs/gif/gifset_m/laser2q_70.gif
/imgs/gif/gifset_m/laser2q_8.gif
/imgs/gif/gifset_m/laser2q_80.gif
/imgs/gif/gifset_m/laser2q_9.gif
/imgs/gif/gifset_m/laser2q_90.gif
/imgs/gif/gifset_m/laser3.gif
/imgs/gif/gifset_m/laser3b.gif
/imgs/gif/gifset_m/laser3b_1.gif
/imgs/gif/gifset_m/laser3b_10.gif
/imgs/gif/gifset_m/laser3b_100.gif
/imgs/gif/gifset_m/laser3b_2.gif
/imgs/gif/gifset_m/laser3b_20.gif
/imgs/gif/gifset_m/laser3b_3.gif
/imgs/gif/gifset_m/laser3b_30.gif
/imgs/gif/gifset_m/laser3b_4.gif
/imgs/gif/gifset_m/laser3b_40.gif
/imgs/gif/gifset_m/laser3b_5.gif
/imgs/gif/gifset_m/laser3b_50.gif
/imgs/gif/gifset_m/laser3b_6.gif
/imgs/gif/gifset_m/laser3b_7.gif
/imgs/gif/gifset_m/laser3b_70.gif
/imgs/gif/gifset_m/laser3b_8.gif
/imgs/gif/gifset_m/laser3b_80.gif
/imgs/gif/gifset_m/laser3b_9.gif
/imgs/gif/gifset_m/laser3b_90.gif
/imgs/gif/gifset_m/laser3d.gif
/imgs/gif/gifset_m/laser3d_1.gif
/imgs/gif/gifset_m/laser3d_10.gif
/imgs/gif/gifset_m/laser3d_100.gif
/imgs/gif/gifset_m/laser3d_2.gif
/imgs/gif/gifset_m/laser3d_20.gif
/imgs/gif/gifset_m/laser3d_3.gif
/imgs/gif/gifset_m/laser3d_30.gif
/imgs/gif/gifset_m/laser3d_4.gif
/imgs/gif/gifset_m/laser3d_40.gif
/imgs/gif/gifset_m/laser3d_5.gif
/imgs/gif/gifset_m/laser3d_50.gif
/imgs/gif/gifset_m/laser3d_6.gif
/imgs/gif/gifset_m/laser3d_7.gif
/imgs/gif/gifset_m/laser3d_70.gif
/imgs/gif/gifset_m/laser3d_8.gif
/imgs/gif/gifset_m/laser3d_80.gif
/imgs/gif/gifset_m/laser3d_9.gif
/imgs/gif/gifset_m/laser3d_90.gif
/imgs/gif/gifset_m/laser3p.gif
/imgs/gif/gifset_m/laser3p_1.gif
/imgs/gif/gifset_m/laser3p_10.gif
/imgs/gif/gifset_m/laser3p_100.gif
/imgs/gif/gifset_m/laser3p_2.gif
/imgs/gif/gifset_m/laser3p_20.gif
/imgs/gif/gifset_m/laser3p_3.gif
/imgs/gif/gifset_m/laser3p_30.gif
/imgs/gif/gifset_m/laser3p_4.gif
/imgs/gif/gifset_m/laser3p_40.gif
/imgs/gif/gifset_m/laser3p_5.gif
/imgs/gif/gifset_m/laser3p_50.gif
/imgs/gif/gifset_m/laser3p_6.gif
/imgs/gif/gifset_m/laser3p_7.gif
/imgs/gif/gifset_m/laser3p_70.gif
/imgs/gif/gifset_m/laser3p_8.gif
/imgs/gif/gifset_m/laser3p_80.gif
/imgs/gif/gifset_m/laser3p_9.gif
/imgs/gif/gifset_m/laser3p_90.gif
/imgs/gif/gifset_m/laser3q.gif
/imgs/gif/gifset_m/laser3q_1.gif
/imgs/gif/gifset_m/laser3q_10.gif
/imgs/gif/gifset_m/laser3q_100.gif
/imgs/gif/gifset_m/laser3q_2.gif
/imgs/gif/gifset_m/laser3q_20.gif
/imgs/gif/gifset_m/laser3q_3.gif
/imgs/gif/gifset_m/laser3q_30.gif
/imgs/gif/gifset_m/laser3q_4.gif
/imgs/gif/gifset_m/laser3q_40.gif
/imgs/gif/gifset_m/laser3q_5.gif
/imgs/gif/gifset_m/laser3q_50.gif
/imgs/gif/gifset_m/laser3q_6.gif
/imgs/gif/gifset_m/laser3q_7.gif
/imgs/gif/gifset_m/laser3q_70.gif
/imgs/gif/gifset_m/laser3q_8.gif
/imgs/gif/gifset_m/laser3q_80.gif
/imgs/gif/gifset_m/laser3q_9.gif
/imgs/gif/gifset_m/laser3q_90.gif
/imgs/gif/gifset_m/meterbars.gif
/imgs/gif/gifset_m/meterbarsb.gif
/imgs/gif/gifset_m/meterbarsb_1.gif
/imgs/gif/gifset_m/meterbarsb_10.gif
/imgs/gif/gifset_m/meterbarsb_100.gif
/imgs/gif/gifset_m/meterbarsb_2.gif
/imgs/gif/gifset_m/meterbarsb_20.gif
/imgs/gif/gifset_m/meterbarsb_3.gif
/imgs/gif/gifset_m/meterbarsb_30.gif
/imgs/gif/gifset_m/meterbarsb_4.gif
/imgs/gif/gifset_m/meterbarsb_40.gif
/imgs/gif/gifset_m/meterbarsb_5.gif
/imgs/gif/gifset_m/meterbarsb_50.gif
/imgs/gif/gifset_m/meterbarsb_6.gif
/imgs/gif/gifset_m/meterbarsb_7.gif
/imgs/gif/gifset_m/meterbarsb_70.gif
/imgs/gif/gifset_m/meterbarsb_8.gif
/imgs/gif/gifset_m/meterbarsb_80.gif
/imgs/gif/gifset_m/meterbarsb_9.gif
/imgs/gif/gifset_m/meterbarsb_90.gif
/imgs/gif/gifset_m/meterbarsd.gif
/imgs/gif/gifset_m/meterbarsd_1.gif
/imgs/gif/gifset_m/meterbarsd_10.gif
/imgs/gif/gifset_m/meterbarsd_100.gif
/imgs/gif/gifset_m/meterbarsd_2.gif
/imgs/gif/gifset_m/meterbarsd_20.gif
/imgs/gif/gifset_m/meterbarsd_3.gif
/imgs/gif/gifset_m/meterbarsd_30.gif
/imgs/gif/gifset_m/meterbarsd_4.gif
/imgs/gif/gifset_m/meterbarsd_40.gif
/imgs/gif/gifset_m/meterbarsd_5.gif
/imgs/gif/gifset_m/meterbarsd_50.gif
/imgs/gif/gifset_m/meterbarsd_6.gif
/imgs/gif/gifset_m/meterbarsd_7.gif
/imgs/gif/gifset_m/meterbarsd_70.gif
/imgs/gif/gifset_m/meterbarsd_8.gif
/imgs/gif/gifset_m/meterbarsd_80.gif
/imgs/gif/gifset_m/meterbarsd_9.gif
/imgs/gif/gifset_m/meterbarsd_90.gif
/imgs/gif/gifset_m/meterbarsp.gif
/imgs/gif/gifset_m/meterbarsp_1.gif
/imgs/gif/gifset_m/meterbarsp_10.gif
/imgs/gif/gifset_m/meterbarsp_100.gif
/imgs/gif/gifset_m/meterbarsp_2.gif
/imgs/gif/gifset_m/meterbarsp_20.gif
/imgs/gif/gifset_m/meterbarsp_3.gif
/imgs/gif/gifset_m/meterbarsp_30.gif
/imgs/gif/gifset_m/meterbarsp_4.gif
/imgs/gif/gifset_m/meterbarsp_40.gif
/imgs/gif/gifset_m/meterbarsp_5.gif
/imgs/gif/gifset_m/meterbarsp_50.gif
/imgs/gif/gifset_m/meterbarsp_6.gif
/imgs/gif/gifset_m/meterbarsp_7.gif
/imgs/gif/gifset_m/meterbarsp_70.gif
/imgs/gif/gifset_m/meterbarsp_8.gif
/imgs/gif/gifset_m/meterbarsp_80.gif
/imgs/gif/gifset_m/meterbarsp_9.gif
/imgs/gif/gifset_m/meterbarsp_90.gif
/imgs/gif/gifset_m/meterbarsq.gif
/imgs/gif/gifset_m/meterbarsq_1.gif
/imgs/gif/gifset_m/meterbarsq_10.gif
/imgs/gif/gifset_m/meterbarsq_100.gif
/imgs/gif/gifset_m/meterbarsq_2.gif
/imgs/gif/gifset_m/meterbarsq_20.gif
/imgs/gif/gifset_m/meterbarsq_3.gif
/imgs/gif/gifset_m/meterbarsq_30.gif
/imgs/gif/gifset_m/meterbarsq_4.gif
/imgs/gif/gifset_m/meterbarsq_40.gif
/imgs/gif/gifset_m/meterbarsq_5.gif
/imgs/gif/gifset_m/meterbarsq_50.gif
/imgs/gif/gifset_m/meterbarsq_6.gif
/imgs/gif/gifset_m/meterbarsq_7.gif
/imgs/gif/gifset_m/meterbarsq_70.gif
/imgs/gif/gifset_m/meterbarsq_8.gif
/imgs/gif/gifset_m/meterbarsq_80.gif
/imgs/gif/gifset_m/meterbarsq_9.gif
/imgs/gif/gifset_m/meterbarsq_90.gif
/imgs/gif/gifset_m/meterdots.gif
/imgs/gif/gifset_m/meterdotsb.gif
/imgs/gif/gifset_m/meterdotsb_1.gif
/imgs/gif/gifset_m/meterdotsb_10.gif
/imgs/gif/gifset_m/meterdotsb_100.gif
/imgs/gif/gifset_m/meterdotsb_2.gif
/imgs/gif/gifset_m/meterdotsb_20.gif
/imgs/gif/gifset_m/meterdotsb_3.gif
/imgs/gif/gifset_m/meterdotsb_30.gif
/imgs/gif/gifset_m/meterdotsb_4.gif
/imgs/gif/gifset_m/meterdotsb_40.gif
/imgs/gif/gifset_m/meterdotsb_5.gif
/imgs/gif/gifset_m/meterdotsb_50.gif
/imgs/gif/gifset_m/meterdotsb_6.gif
/imgs/gif/gifset_m/meterdotsb_7.gif
/imgs/gif/gifset_m/meterdotsb_70.gif
/imgs/gif/gifset_m/meterdotsb_8.gif
/imgs/gif/gifset_m/meterdotsb_80.gif
/imgs/gif/gifset_m/meterdotsb_9.gif
/imgs/gif/gifset_m/meterdotsb_90.gif
/imgs/gif/gifset_m/meterdotsd.gif
/imgs/gif/gifset_m/meterdotsd_1.gif
/imgs/gif/gifset_m/meterdotsd_10.gif
/imgs/gif/gifset_m/meterdotsd_100.gif
/imgs/gif/gifset_m/meterdotsd_2.gif
/imgs/gif/gifset_m/meterdotsd_20.gif
/imgs/gif/gifset_m/meterdotsd_3.gif
/imgs/gif/gifset_m/meterdotsd_30.gif
/imgs/gif/gifset_m/meterdotsd_4.gif
/imgs/gif/gifset_m/meterdotsd_40.gif
/imgs/gif/gifset_m/meterdotsd_5.gif
/imgs/gif/gifset_m/meterdotsd_50.gif
/imgs/gif/gifset_m/meterdotsd_6.gif
/imgs/gif/gifset_m/meterdotsd_7.gif
/imgs/gif/gifset_m/meterdotsd_70.gif
/imgs/gif/gifset_m/meterdotsd_8.gif
/imgs/gif/gifset_m/meterdotsd_80.gif
/imgs/gif/gifset_m/meterdotsd_9.gif
/imgs/gif/gifset_m/meterdotsd_90.gif
/imgs/gif/gifset_m/meterdotsp.gif
/imgs/gif/gifset_m/meterdotsp_1.gif
/imgs/gif/gifset_m/meterdotsp_10.gif
/imgs/gif/gifset_m/meterdotsp_100.gif
/imgs/gif/gifset_m/meterdotsp_2.gif
/imgs/gif/gifset_m/meterdotsp_20.gif
/imgs/gif/gifset_m/meterdotsp_3.gif
/imgs/gif/gifset_m/meterdotsp_30.gif
/imgs/gif/gifset_m/meterdotsp_4.gif
/imgs/gif/gifset_m/meterdotsp_40.gif
/imgs/gif/gifset_m/meterdotsp_5.gif
/imgs/gif/gifset_m/meterdotsp_50.gif
/imgs/gif/gifset_m/meterdotsp_6.gif
/imgs/gif/gifset_m/meterdotsp_7.gif
/imgs/gif/gifset_m/meterdotsp_70.gif
/imgs/gif/gifset_m/meterdotsp_8.gif
/imgs/gif/gifset_m/meterdotsp_80.gif
/imgs/gif/gifset_m/meterdotsp_9.gif
/imgs/gif/gifset_m/meterdotsp_90.gif
/imgs/gif/gifset_m/meterdotsq.gif
/imgs/gif/gifset_m/meterdotsq_1.gif
/imgs/gif/gifset_m/meterdotsq_10.gif
/imgs/gif/gifset_m/meterdotsq_100.gif
/imgs/gif/gifset_m/meterdotsq_2.gif
/imgs/gif/gifset_m/meterdotsq_20.gif
/imgs/gif/gifset_m/meterdotsq_3.gif
/imgs/gif/gifset_m/meterdotsq_30.gif
/imgs/gif/gifset_m/meterdotsq_4.gif
/imgs/gif/gifset_m/meterdotsq_40.gif
/imgs/gif/gifset_m/meterdotsq_5.gif
/imgs/gif/gifset_m/meterdotsq_50.gif
/imgs/gif/gifset_m/meterdotsq_6.gif
/imgs/gif/gifset_m/meterdotsq_7.gif
/imgs/gif/gifset_m/meterdotsq_70.gif
/imgs/gif/gifset_m/meterdotsq_8.gif
/imgs/gif/gifset_m/meterdotsq_80.gif
/imgs/gif/gifset_m/meterdotsq_9.gif
/imgs/gif/gifset_m/meterdotsq_90.gif
/imgs/gif/gifset_r/firebubblesq_1.gif
/imgs/gif/gifset_r/firebubblesq_10.gif
/imgs/gif/gifset_r/firebubblesq_100.gif
/imgs/gif/gifset_r/firebubblesq_2.gif
/imgs/gif/gifset_r/firebubblesq_20.gif
/imgs/gif/gifset_r/firebubblesq_3.gif
/imgs/gif/gifset_r/firebubblesq_30.gif
/imgs/gif/gifset_r/firebubblesq_4.gif
/imgs/gif/gifset_r/firebubblesq_40.gif
/imgs/gif/gifset_r/firebubblesq_5.gif
/imgs/gif/gifset_r/firebubblesq_50.gif
/imgs/gif/gifset_r/firebubblesq_6.gif
/imgs/gif/gifset_r/firebubblesq_7.gif
/imgs/gif/gifset_r/firebubblesq_70.gif
/imgs/gif/gifset_r/firebubblesq_8.gif
/imgs/gif/gifset_r/firebubblesq_80.gif
/imgs/gif/gifset_r/firebubblesq_9.gif
/imgs/gif/gifset_r/firebubblesq_90.gif
/imgs/gif/gifset_r/penny.gif
/imgs/gif/gifset_r/pennyb.gif
/imgs/gif/gifset_r/pennyb_1.gif
/imgs/gif/gifset_r/pennyb_10.gif
/imgs/gif/gifset_r/pennyb_100.gif
/imgs/gif/gifset_r/pennyb_2.gif
/imgs/gif/gifset_r/pennyb_20.gif
/imgs/gif/gifset_r/pennyb_3.gif
/imgs/gif/gifset_r/pennyb_30.gif
/imgs/gif/gifset_r/pennyb_4.gif
/imgs/gif/gifset_r/pennyb_40.gif
/imgs/gif/gifset_r/pennyb_5.gif
/imgs/gif/gifset_r/pennyb_50.gif
/imgs/gif/gifset_r/pennyb_6.gif
/imgs/gif/gifset_r/pennyb_7.gif
/imgs/gif/gifset_r/pennyb_70.gif
/imgs/gif/gifset_r/pennyb_8.gif
/imgs/gif/gifset_r/pennyb_80.gif
/imgs/gif/gifset_r/pennyb_9.gif
/imgs/gif/gifset_r/pennyb_90.gif
/imgs/gif/gifset_r/pennyd.gif
/imgs/gif/gifset_r/pennyd_1.gif
/imgs/gif/gifset_r/pennyd_10.gif
/imgs/gif/gifset_r/pennyd_100.gif
/imgs/gif/gifset_r/pennyd_2.gif
/imgs/gif/gifset_r/pennyd_20.gif
/imgs/gif/gifset_r/pennyd_3.gif
/imgs/gif/gifset_r/pennyd_30.gif
/imgs/gif/gifset_r/pennyd_4.gif
/imgs/gif/gifset_r/pennyd_40.gif
/imgs/gif/gifset_r/pennyd_5.gif
/imgs/gif/gifset_r/pennyd_50.gif
/imgs/gif/gifset_r/pennyd_6.gif
/imgs/gif/gifset_r/pennyd_7.gif
/imgs/gif/gifset_r/pennyd_70.gif
/imgs/gif/gifset_r/pennyd_8.gif
/imgs/gif/gifset_r/pennyd_80.gif
/imgs/gif/gifset_r/pennyd_9.gif
/imgs/gif/gifset_r/pennyd_90.gif
/imgs/gif/gifset_r/pennyp.gif
/imgs/gif/gifset_r/pennyp_1.gif
/imgs/gif/gifset_r/pennyp_10.gif
/imgs/gif/gifset_r/pennyp_100.gif
/imgs/gif/gifset_r/pennyp_2.gif
/imgs/gif/gifset_r/pennyp_20.gif
/imgs/gif/gifset_r/pennyp_3.gif
/imgs/gif/gifset_r/pennyp_30.gif
/imgs/gif/gifset_r/pennyp_4.gif
/imgs/gif/gifset_r/pennyp_40.gif
/imgs/gif/gifset_r/pennyp_5.gif
/imgs/gif/gifset_r/pennyp_50.gif
/imgs/gif/gifset_r/pennyp_6.gif
/imgs/gif/gifset_r/pennyp_7.gif
/imgs/gif/gifset_r/pennyp_70.gif
/imgs/gif/gifset_r/pennyp_8.gif
/imgs/gif/gifset_r/pennyp_80.gif
/imgs/gif/gifset_r/pennyp_9.gif
/imgs/gif/gifset_r/pennyp_90.gif
/imgs/gif/gifset_r/pennyq.gif
/imgs/gif/gifset_r/pennyq_1.gif
/imgs/gif/gifset_r/pennyq_10.gif
/imgs/gif/gifset_r/pennyq_100.gif
/imgs/gif/gifset_r/pennyq_2.gif
/imgs/gif/gifset_r/pennyq_20.gif
/imgs/gif/gifset_r/pennyq_3.gif
/imgs/gif/gifset_r/pennyq_30.gif
/imgs/gif/gifset_r/pennyq_4.gif
/imgs/gif/gifset_r/pennyq_40.gif
/imgs/gif/gifset_r/pennyq_5.gif
/imgs/gif/gifset_r/pennyq_50.gif
/imgs/gif/gifset_r/pennyq_6.gif
/imgs/gif/gifset_r/pennyq_7.gif
/imgs/gif/gifset_r/pennyq_70.gif
/imgs/gif/gifset_r/pennyq_8.gif
/imgs/gif/gifset_r/pennyq_80.gif
/imgs/gif/gifset_r/pennyq_9.gif
/imgs/gif/gifset_r/pennyq_90.gif
/imgs/gif/gifset_r/ringsb_1.gif
/imgs/gif/gifset_r/ringsb_10.gif
/imgs/gif/gifset_r/ringsb_100.gif
/imgs/gif/gifset_r/ringsb_2.gif
/imgs/gif/gifset_r/ringsb_20.gif
/imgs/gif/gifset_r/ringsb_3.gif
/imgs/gif/gifset_r/ringsb_30.gif
/imgs/gif/gifset_r/ringsb_4.gif
/imgs/gif/gifset_r/ringsb_40.gif
/imgs/gif/gifset_r/ringsb_5.gif
/imgs/gif/gifset_r/ringsb_50.gif
/imgs/gif/gifset_r/ringsb_6.gif
/imgs/gif/gifset_r/ringsb_7.gif
/imgs/gif/gifset_r/ringsb_70.gif
/imgs/gif/gifset_r/ringsb_8.gif
/imgs/gif/gifset_r/ringsb_80.gif
/imgs/gif/gifset_r/ringsb_9.gif
/imgs/gif/gifset_r/ringsb_90.gif
/imgs/gif/gifset_r/ringsd_1.gif
/imgs/gif/gifset_r/ringsd_10.gif
/imgs/gif/gifset_r/ringsd_100.gif
/imgs/gif/gifset_r/ringsd_2.gif
/imgs/gif/gifset_r/ringsd_20.gif
/imgs/gif/gifset_r/ringsd_3.gif
/imgs/gif/gifset_r/ringsd_30.gif
/imgs/gif/gifset_r/ringsd_4.gif
/imgs/gif/gifset_r/ringsd_40.gif
/imgs/gif/gifset_r/ringsd_5.gif
/imgs/gif/gifset_r/ringsd_50.gif
/imgs/gif/gifset_r/ringsd_6.gif
/imgs/gif/gifset_r/ringsd_7.gif
/imgs/gif/gifset_r/ringsd_70.gif
/imgs/gif/gifset_r/ringsd_8.gif
/imgs/gif/gifset_r/ringsd_80.gif
/imgs/gif/gifset_r/ringsd_9.gif
/imgs/gif/gifset_r/ringsd_90.gif
/imgs/gif/gifset_r/ringsp_1.gif
/imgs/gif/gifset_r/ringsp_10.gif
/imgs/gif/gifset_r/ringsp_100.gif
/imgs/gif/gifset_r/ringsp_2.gif
/imgs/gif/gifset_r/ringsp_20.gif
/imgs/gif/gifset_r/ringsp_3.gif
/imgs/gif/gifset_r/ringsp_30.gif
/imgs/gif/gifset_r/ringsp_4.gif
/imgs/gif/gifset_r/ringsp_40.gif
/imgs/gif/gifset_r/ringsp_5.gif
/imgs/gif/gifset_r/ringsp_50.gif
/imgs/gif/gifset_r/ringsp_6.gif
/imgs/gif/gifset_r/ringsp_7.gif
/imgs/gif/gifset_r/ringsp_70.gif
/imgs/gif/gifset_r/ringsp_8.gif
/imgs/gif/gifset_r/ringsp_80.gif
/imgs/gif/gifset_r/ringsp_9.gif
/imgs/gif/gifset_r/ringsp_90.gif
/imgs/gif/gifset_r/ringsq_1.gif
/imgs/gif/gifset_r/ringsq_10.gif
/imgs/gif/gifset_r/ringsq_100.gif
/imgs/gif/gifset_r/ringsq_2.gif
/imgs/gif/gifset_r/ringsq_20.gif
/imgs/gif/gifset_r/ringsq_3.gif
/imgs/gif/gifset_r/ringsq_30.gif
/imgs/gif/gifset_r/ringsq_4.gif
/imgs/gif/gifset_r/ringsq_40.gif
/imgs/gif/gifset_r/ringsq_5.gif
/imgs/gif/gifset_r/ringsq_50.gif
/imgs/gif/gifset_r/ringsq_6.gif
/imgs/gif/gifset_r/ringsq_7.gif
/imgs/gif/gifset_r/ringsq_70.gif
/imgs/gif/gifset_r/ringsq_8.gif
/imgs/gif/gifset_r/ringsq_80.gif
/imgs/gif/gifset_r/ringsq_9.gif
/imgs/gif/gifset_r/ringsq_90.gif
/imgs/gif/gifset_r/rotate.gif
/imgs/gif/gifset_r/rotateb.gif
/imgs/gif/gifset_r/rotateb_1.gif
/imgs/gif/gifset_r/rotateb_10.gif
/imgs/gif/gifset_r/rotateb_100.gif
/imgs/gif/gifset_r/rotateb_2.gif
/imgs/gif/gifset_r/rotateb_20.gif
/imgs/gif/gifset_r/rotateb_3.gif
/imgs/gif/gifset_r/rotateb_30.gif
/imgs/gif/gifset_r/rotateb_4.gif
/imgs/gif/gifset_r/rotateb_40.gif
/imgs/gif/gifset_r/rotateb_5.gif
/imgs/gif/gifset_r/rotateb_50.gif
/imgs/gif/gifset_r/rotateb_6.gif
/imgs/gif/gifset_r/rotateb_7.gif
/imgs/gif/gifset_r/rotateb_70.gif
/imgs/gif/gifset_r/rotateb_8.gif
/imgs/gif/gifset_r/rotateb_80.gif
/imgs/gif/gifset_r/rotateb_9.gif
/imgs/gif/gifset_r/rotateb_90.gif
/imgs/gif/gifset_r/rotated.gif
/imgs/gif/gifset_r/rotated_1.gif
/imgs/gif/gifset_r/rotated_10.gif
/imgs/gif/gifset_r/rotated_100.gif
/imgs/gif/gifset_r/rotated_2.gif
/imgs/gif/gifset_r/rotated_20.gif
/imgs/gif/gifset_r/rotated_3.gif
/imgs/gif/gifset_r/rotated_30.gif
/imgs/gif/gifset_r/rotated_4.gif
/imgs/gif/gifset_r/rotated_40.gif
/imgs/gif/gifset_r/rotated_5.gif
/imgs/gif/gifset_r/rotated_50.gif
/imgs/gif/gifset_r/rotated_6.gif
/imgs/gif/gifset_r/rotated_7.gif
/imgs/gif/gifset_r/rotated_70.gif
/imgs/gif/gifset_r/rotated_8.gif
/imgs/gif/gifset_r/rotated_80.gif
/imgs/gif/gifset_r/rotated_9.gif
/imgs/gif/gifset_r/rotated_90.gif
/imgs/gif/gifset_r/rotatep.gif
/imgs/gif/gifset_r/rotatep_1.gif
/imgs/gif/gifset_r/rotatep_10.gif
/imgs/gif/gifset_r/rotatep_100.gif
/imgs/gif/gifset_r/rotatep_2.gif
/imgs/gif/gifset_r/rotatep_20.gif
/imgs/gif/gifset_r/rotatep_3.gif
/imgs/gif/gifset_r/rotatep_30.gif
/imgs/gif/gifset_r/rotatep_4.gif
/imgs/gif/gifset_r/rotatep_40.gif
/imgs/gif/gifset_r/rotatep_5.gif
/imgs/gif/gifset_r/rotatep_50.gif
/imgs/gif/gifset_r/rotatep_6.gif
/imgs/gif/gifset_r/rotatep_7.gif
/imgs/gif/gifset_r/rotatep_70.gif
/imgs/gif/gifset_r/rotatep_8.gif
/imgs/gif/gifset_r/rotatep_80.gif
/imgs/gif/gifset_r/rotatep_9.gif
/imgs/gif/gifset_r/rotatep_90.gif
/imgs/gif/gifset_r/rotateq.gif
/imgs/gif/gifset_r/rotateq_1.gif
/imgs/gif/gifset_r/rotateq_10.gif
/imgs/gif/gifset_r/rotateq_100.gif
/imgs/gif/gifset_r/rotateq_2.gif
/imgs/gif/gifset_r/rotateq_20.gif
/imgs/gif/gifset_r/rotateq_3.gif
/imgs/gif/gifset_r/rotateq_30.gif
/imgs/gif/gifset_r/rotateq_4.gif
/imgs/gif/gifset_r/rotateq_40.gif
/imgs/gif/gifset_r/rotateq_5.gif
/imgs/gif/gifset_r/rotateq_50.gif
/imgs/gif/gifset_r/rotateq_6.gif
/imgs/gif/gifset_r/rotateq_7.gif
/imgs/gif/gifset_r/rotateq_70.gif
/imgs/gif/gifset_r/rotateq_8.gif
/imgs/gif/gifset_r/rotateq_80.gif
/imgs/gif/gifset_r/rotateq_9.gif
/imgs/gif/gifset_r/rotateq_90.gif
/imgs/gif/gifset_t/soccorball.gif
/imgs/gif/gifset_t/soccorballb.gif
/imgs/gif/gifset_t/soccorballb_1.gif
/imgs/gif/gifset_t/soccorballb_10.gif
/imgs/gif/gifset_t/soccorballb_100.gif
/imgs/gif/gifset_t/soccorballb_2.gif
/imgs/gif/gifset_t/soccorballb_20.gif
/imgs/gif/gifset_t/soccorballb_3.gif
/imgs/gif/gifset_t/soccorballb_30.gif
/imgs/gif/gifset_t/soccorballb_4.gif
/imgs/gif/gifset_t/soccorballb_40.gif
/imgs/gif/gifset_t/soccorballb_5.gif
/imgs/gif/gifset_t/soccorballb_50.gif
/imgs/gif/gifset_t/soccorballb_6.gif
/imgs/gif/gifset_t/soccorballb_7.gif
/imgs/gif/gifset_t/soccorballb_70.gif
/imgs/gif/gifset_t/soccorballb_8.gif
/imgs/gif/gifset_t/soccorballb_80.gif
/imgs/gif/gifset_t/soccorballb_9.gif
/imgs/gif/gifset_t/soccorballb_90.gif
/imgs/gif/gifset_t/soccorballd.gif
/imgs/gif/gifset_t/soccorballd_1.gif
/imgs/gif/gifset_t/soccorballd_10.gif
/imgs/gif/gifset_t/soccorballd_100.gif
/imgs/gif/gifset_t/soccorballd_2.gif
/imgs/gif/gifset_t/soccorballd_20.gif
/imgs/gif/gifset_t/soccorballd_3.gif
/imgs/gif/gifset_t/soccorballd_30.gif
/imgs/gif/gifset_t/soccorballd_4.gif
/imgs/gif/gifset_t/soccorballd_40.gif
/imgs/gif/gifset_t/soccorballd_5.gif
/imgs/gif/gifset_t/soccorballd_50.gif
/imgs/gif/gifset_t/soccorballd_6.gif
/imgs/gif/gifset_t/soccorballd_7.gif
/imgs/gif/gifset_t/soccorballd_70.gif
/imgs/gif/gifset_t/soccorballd_8.gif
/imgs/gif/gifset_t/soccorballd_80.gif
/imgs/gif/gifset_t/soccorballd_9.gif
/imgs/gif/gifset_t/soccorballd_90.gif
/imgs/gif/gifset_t/soccorballp.gif
/imgs/gif/gifset_t/soccorballp_1.gif
/imgs/gif/gifset_t/soccorballp_10.gif
/imgs/gif/gifset_t/soccorballp_100.gif
/imgs/gif/gifset_t/soccorballp_2.gif
/imgs/gif/gifset_t/soccorballp_20.gif
/imgs/gif/gifset_t/soccorballp_3.gif
/imgs/gif/gifset_t/soccorballp_30.gif
/imgs/gif/gifset_t/soccorballp_4.gif
/imgs/gif/gifset_t/soccorballp_40.gif
/imgs/gif/gifset_t/soccorballp_5.gif
/imgs/gif/gifset_t/soccorballp_50.gif
/imgs/gif/gifset_t/soccorballp_6.gif
/imgs/gif/gifset_t/soccorballp_7.gif
/imgs/gif/gifset_t/soccorballp_70.gif
/imgs/gif/gifset_t/soccorballp_8.gif
/imgs/gif/gifset_t/soccorballp_80.gif
/imgs/gif/gifset_t/soccorballp_9.gif
/imgs/gif/gifset_t/soccorballp_90.gif
/imgs/gif/gifset_t/soccorballq.gif
/imgs/gif/gifset_t/soccorballq_1.gif
/imgs/gif/gifset_t/soccorballq_10.gif
/imgs/gif/gifset_t/soccorballq_100.gif
/imgs/gif/gifset_t/soccorballq_2.gif
/imgs/gif/gifset_t/soccorballq_20.gif
/imgs/gif/gifset_t/soccorballq_3.gif
/imgs/gif/gifset_t/soccorballq_30.gif
/imgs/gif/gifset_t/soccorballq_4.gif
/imgs/gif/gifset_t/soccorballq_40.gif
/imgs/gif/gifset_t/soccorballq_5.gif
/imgs/gif/gifset_t/soccorballq_50.gif
/imgs/gif/gifset_t/soccorballq_6.gif
/imgs/gif/gifset_t/soccorballq_7.gif
/imgs/gif/gifset_t/soccorballq_70.gif
/imgs/gif/gifset_t/soccorballq_8.gif
/imgs/gif/gifset_t/soccorballq_80.gif
/imgs/gif/gifset_t/soccorballq_9.gif
/imgs/gif/gifset_t/soccorballq_90.gif
/imgs/gif/gifset_t/sun.gif
/imgs/gif/gifset_t/sunb.gif
/imgs/gif/gifset_t/sunb_1.gif
/imgs/gif/gifset_t/sunb_10.gif
/imgs/gif/gifset_t/sunb_100.gif
/imgs/gif/gifset_t/sunb_2.gif
/imgs/gif/gifset_t/sunb_20.gif
/imgs/gif/gifset_t/sunb_3.gif
/imgs/gif/gifset_t/sunb_30.gif
/imgs/gif/gifset_t/sunb_4.gif
/imgs/gif/gifset_t/sunb_40.gif
/imgs/gif/gifset_t/sunb_5.gif
/imgs/gif/gifset_t/sunb_50.gif
/imgs/gif/gifset_t/sunb_6.gif
/imgs/gif/gifset_t/sunb_7.gif
/imgs/gif/gifset_t/sunb_70.gif
/imgs/gif/gifset_t/sunb_8.gif
/imgs/gif/gifset_t/sunb_80.gif
/imgs/gif/gifset_t/sunb_9.gif
/imgs/gif/gifset_t/sunb_90.gif
/imgs/gif/gifset_t/sund.gif
/imgs/gif/gifset_t/sund_1.gif
/imgs/gif/gifset_t/sund_10.gif
/imgs/gif/gifset_t/sund_100.gif
/imgs/gif/gifset_t/sund_2.gif
/imgs/gif/gifset_t/sund_20.gif
/imgs/gif/gifset_t/sund_3.gif
/imgs/gif/gifset_t/sund_30.gif
/imgs/gif/gifset_t/sund_4.gif
/imgs/gif/gifset_t/sund_40.gif
/imgs/gif/gifset_t/sund_5.gif
/imgs/gif/gifset_t/sund_50.gif
/imgs/gif/gifset_t/sund_6.gif
/imgs/gif/gifset_t/sund_7.gif
/imgs/gif/gifset_t/sund_70.gif
/imgs/gif/gifset_t/sund_8.gif
/imgs/gif/gifset_t/sund_80.gif
/imgs/gif/gifset_t/sund_9.gif
/imgs/gif/gifset_t/sund_90.gif
/imgs/gif/gifset_t/sunp.gif
/imgs/gif/gifset_t/sunp_1.gif
/imgs/gif/gifset_t/sunp_10.gif
/imgs/gif/gifset_t/sunp_100.gif
/imgs/gif/gifset_t/sunp_2.gif
/imgs/gif/gifset_t/sunp_20.gif
/imgs/gif/gifset_t/sunp_3.gif
/imgs/gif/gifset_t/sunp_30.gif
/imgs/gif/gifset_t/sunp_4.gif
/imgs/gif/gifset_t/sunp_40.gif
/imgs/gif/gifset_t/sunp_5.gif
/imgs/gif/gifset_t/sunp_50.gif
/imgs/gif/gifset_t/sunp_6.gif
/imgs/gif/gifset_t/sunp_7.gif
/imgs/gif/gifset_t/sunp_70.gif
/imgs/gif/gifset_t/sunp_8.gif
/imgs/gif/gifset_t/sunp_80.gif
/imgs/gif/gifset_t/sunp_9.gif
/imgs/gif/gifset_t/sunp_90.gif
/imgs/gif/gifset_t/sunq.gif
/imgs/gif/gifset_t/sunq_1.gif
/imgs/gif/gifset_t/sunq_10.gif
/imgs/gif/gifset_t/sunq_100.gif
/imgs/gif/gifset_t/sunq_2.gif
/imgs/gif/gifset_t/sunq_20.gif
/imgs/gif/gifset_t/sunq_3.gif
/imgs/gif/gifset_t/sunq_30.gif
/imgs/gif/gifset_t/sunq_4.gif
/imgs/gif/gifset_t/sunq_40.gif
/imgs/gif/gifset_t/sunq_5.gif
/imgs/gif/gifset_t/sunq_50.gif
/imgs/gif/gifset_t/sunq_6.gif
/imgs/gif/gifset_t/sunq_7.gif
/imgs/gif/gifset_t/sunq_70.gif
/imgs/gif/gifset_t/sunq_8.gif
/imgs/gif/gifset_t/sunq_80.gif
/imgs/gif/gifset_t/sunq_9.gif
/imgs/gif/gifset_t/sunq_90.gif
/imgs/gif/gifset_t/taz.gif
/imgs/gif/gifset_t/tazb.gif
/imgs/gif/gifset_t/tazb_1.gif
/imgs/gif/gifset_t/tazb_10.gif
/imgs/gif/gifset_t/tazb_100.gif
/imgs/gif/gifset_t/tazb_2.gif
/imgs/gif/gifset_t/tazb_20.gif
/imgs/gif/gifset_t/tazb_3.gif
/imgs/gif/gifset_t/tazb_30.gif
/imgs/gif/gifset_t/tazb_4.gif
/imgs/gif/gifset_t/tazb_40.gif
/imgs/gif/gifset_t/tazb_5.gif
/imgs/gif/gifset_t/tazb_50.gif
/imgs/gif/gifset_t/tazb_6.gif
/imgs/gif/gifset_t/tazb_7.gif
/imgs/gif/gifset_t/tazb_70.gif
/imgs/gif/gifset_t/tazb_8.gif
/imgs/gif/gifset_t/tazb_80.gif
/imgs/gif/gifset_t/tazb_9.gif
/imgs/gif/gifset_t/tazb_90.gif
/imgs/gif/gifset_t/tazd.gif
/imgs/gif/gifset_t/tazd_1.gif
/imgs/gif/gifset_t/tazd_10.gif
/imgs/gif/gifset_t/tazd_100.gif
/imgs/gif/gifset_t/tazd_2.gif
/imgs/gif/gifset_t/tazd_20.gif
/imgs/gif/gifset_t/tazd_3.gif
/imgs/gif/gifset_t/tazd_30.gif
/imgs/gif/gifset_t/tazd_4.gif
/imgs/gif/gifset_t/tazd_40.gif
/imgs/gif/gifset_t/tazd_5.gif
/imgs/gif/gifset_t/tazd_50.gif
/imgs/gif/gifset_t/tazd_6.gif
/imgs/gif/gifset_t/tazd_7.gif
/imgs/gif/gifset_t/tazd_70.gif
/imgs/gif/gifset_t/tazd_8.gif
/imgs/gif/gifset_t/tazd_80.gif
/imgs/gif/gifset_t/tazd_9.gif
/imgs/gif/gifset_t/tazd_90.gif
/imgs/gif/gifset_t/tazp.gif
/imgs/gif/gifset_t/tazp_1.gif
/imgs/gif/gifset_t/tazp_10.gif
/imgs/gif/gifset_t/tazp_100.gif
/imgs/gif/gifset_t/tazp_2.gif
/imgs/gif/gifset_t/tazp_20.gif
/imgs/gif/gifset_t/tazp_3.gif
/imgs/gif/gifset_t/tazp_30.gif
/imgs/gif/gifset_t/tazp_4.gif
/imgs/gif/gifset_t/tazp_40.gif
/imgs/gif/gifset_t/tazp_5.gif
/imgs/gif/gifset_t/tazp_50.gif
/imgs/gif/gifset_t/tazp_6.gif
/imgs/gif/gifset_t/tazp_7.gif
/imgs/gif/gifset_t/tazp_70.gif
/imgs/gif/gifset_t/tazp_8.gif
/imgs/gif/gifset_t/tazp_80.gif
/imgs/gif/gifset_t/tazp_9.gif
/imgs/gif/gifset_t/tazp_90.gif
/imgs/gif/gifset_t/tazq.gif
/imgs/gif/gifset_t/tazq_1.gif
/imgs/gif/gifset_t/tazq_10.gif
/imgs/gif/gifset_t/tazq_100.gif
/imgs/gif/gifset_t/tazq_2.gif
/imgs/gif/gifset_t/tazq_20.gif
/imgs/gif/gifset_t/tazq_3.gif
/imgs/gif/gifset_t/tazq_30.gif
/imgs/gif/gifset_t/tazq_4.gif
/imgs/gif/gifset_t/tazq_40.gif
/imgs/gif/gifset_t/tazq_5.gif
/imgs/gif/gifset_t/tazq_50.gif
/imgs/gif/gifset_t/tazq_6.gif
/imgs/gif/gifset_t/tazq_7.gif
/imgs/gif/gifset_t/tazq_70.gif
/imgs/gif/gifset_t/tazq_8.gif
/imgs/gif/gifset_t/tazq_80.gif
/imgs/gif/gifset_t/tazq_9.gif
/imgs/gif/gifset_t/tazq_90.gif
/imgs/gif/gifset_w/trophy.gif
/imgs/gif/gifset_w/trophyb.gif
/imgs/gif/gifset_w/trophyb_1.gif
/imgs/gif/gifset_w/trophyb_10.gif
/imgs/gif/gifset_w/trophyb_100.gif
/imgs/gif/gifset_w/trophyb_2.gif
/imgs/gif/gifset_w/trophyb_20.gif
/imgs/gif/gifset_w/trophyb_3.gif
/imgs/gif/gifset_w/trophyb_30.gif
/imgs/gif/gifset_w/trophyb_4.gif
/imgs/gif/gifset_w/trophyb_40.gif
/imgs/gif/gifset_w/trophyb_5.gif
/imgs/gif/gifset_w/trophyb_50.gif
/imgs/gif/gifset_w/trophyb_6.gif
/imgs/gif/gifset_w/trophyb_7.gif
/imgs/gif/gifset_w/trophyb_70.gif
/imgs/gif/gifset_w/trophyb_8.gif
/imgs/gif/gifset_w/trophyb_80.gif
/imgs/gif/gifset_w/trophyb_9.gif
/imgs/gif/gifset_w/trophyb_90.gif
/imgs/gif/gifset_w/trophyd.gif
/imgs/gif/gifset_w/trophyd_1.gif
/imgs/gif/gifset_w/trophyd_10.gif
/imgs/gif/gifset_w/trophyd_100.gif
/imgs/gif/gifset_w/trophyd_2.gif
/imgs/gif/gifset_w/trophyd_20.gif
/imgs/gif/gifset_w/trophyd_3.gif
/imgs/gif/gifset_w/trophyd_30.gif
/imgs/gif/gifset_w/trophyd_4.gif
/imgs/gif/gifset_w/trophyd_40.gif
/imgs/gif/gifset_w/trophyd_5.gif
/imgs/gif/gifset_w/trophyd_50.gif
/imgs/gif/gifset_w/trophyd_6.gif
/imgs/gif/gifset_w/trophyd_7.gif
/imgs/gif/gifset_w/trophyd_70.gif
/imgs/gif/gifset_w/trophyd_8.gif
/imgs/gif/gifset_w/trophyd_80.gif
/imgs/gif/gifset_w/trophyd_9.gif
/imgs/gif/gifset_w/trophyd_90.gif
/imgs/gif/gifset_w/trophyp.gif
/imgs/gif/gifset_w/trophyp_1.gif
/imgs/gif/gifset_w/trophyp_10.gif
/imgs/gif/gifset_w/trophyp_100.gif
/imgs/gif/gifset_w/trophyp_2.gif
/imgs/gif/gifset_w/trophyp_20.gif
/imgs/gif/gifset_w/trophyp_3.gif
/imgs/gif/gifset_w/trophyp_30.gif
/imgs/gif/gifset_w/trophyp_4.gif
/imgs/gif/gifset_w/trophyp_40.gif
/imgs/gif/gifset_w/trophyp_5.gif
/imgs/gif/gifset_w/trophyp_50.gif
/imgs/gif/gifset_w/trophyp_6.gif
/imgs/gif/gifset_w/trophyp_7.gif
/imgs/gif/gifset_w/trophyp_70.gif
/imgs/gif/gifset_w/trophyp_8.gif
/imgs/gif/gifset_w/trophyp_80.gif
/imgs/gif/gifset_w/trophyp_9.gif
/imgs/gif/gifset_w/trophyp_90.gif
/imgs/gif/gifset_w/trophyq.gif
/imgs/gif/gifset_w/trophyq_1.gif
/imgs/gif/gifset_w/trophyq_10.gif
/imgs/gif/gifset_w/trophyq_100.gif
/imgs/gif/gifset_w/trophyq_2.gif
/imgs/gif/gifset_w/trophyq_20.gif
/imgs/gif/gifset_w/trophyq_3.gif
/imgs/gif/gifset_w/trophyq_30.gif
/imgs/gif/gifset_w/trophyq_4.gif
/imgs/gif/gifset_w/trophyq_40.gif
/imgs/gif/gifset_w/trophyq_5.gif
/imgs/gif/gifset_w/trophyq_50.gif
/imgs/gif/gifset_w/trophyq_6.gif
/imgs/gif/gifset_w/trophyq_7.gif
/imgs/gif/gifset_w/trophyq_70.gif
/imgs/gif/gifset_w/trophyq_8.gif
/imgs/gif/gifset_w/trophyq_80.gif
/imgs/gif/gifset_w/trophyq_9.gif
/imgs/gif/gifset_w/trophyq_90.gif
/imgs/gif/gifset_w/warning.gif
/imgs/gif/gifset_w/warningb.gif
/imgs/gif/gifset_w/warningb_1.gif
/imgs/gif/gifset_w/warningb_10.gif
/imgs/gif/gifset_w/warningb_100.gif
/imgs/gif/gifset_w/warningb_2.gif
/imgs/gif/gifset_w/warningb_20.gif
/imgs/gif/gifset_w/warningb_3.gif
/imgs/gif/gifset_w/warningb_30.gif
/imgs/gif/gifset_w/warningb_4.gif
/imgs/gif/gifset_w/warningb_40.gif
/imgs/gif/gifset_w/warningb_5.gif
/imgs/gif/gifset_w/warningb_50.gif
/imgs/gif/gifset_w/warningb_6.gif
/imgs/gif/gifset_w/warningb_7.gif
/imgs/gif/gifset_w/warningb_70.gif
/imgs/gif/gifset_w/warningb_8.gif
/imgs/gif/gifset_w/warningb_80.gif
/imgs/gif/gifset_w/warningb_9.gif
/imgs/gif/gifset_w/warningb_90.gif
/imgs/gif/gifset_w/warningd.gif
/imgs/gif/gifset_w/warningd_1.gif
/imgs/gif/gifset_w/warningd_10.gif
/imgs/gif/gifset_w/warningd_100.gif
/imgs/gif/gifset_w/warningd_2.gif
/imgs/gif/gifset_w/warningd_20.gif
/imgs/gif/gifset_w/warningd_3.gif
/imgs/gif/gifset_w/warningd_30.gif
/imgs/gif/gifset_w/warningd_4.gif
/imgs/gif/gifset_w/warningd_40.gif
/imgs/gif/gifset_w/warningd_5.gif
/imgs/gif/gifset_w/warningd_50.gif
/imgs/gif/gifset_w/warningd_6.gif
/imgs/gif/gifset_w/warningd_7.gif
/imgs/gif/gifset_w/warningd_70.gif
/imgs/gif/gifset_w/warningd_8.gif
/imgs/gif/gifset_w/warningd_80.gif
/imgs/gif/gifset_w/warningd_9.gif
/imgs/gif/gifset_w/warningd_90.gif
/imgs/gif/gifset_w/warningp.gif
/imgs/gif/gifset_w/warningp_1.gif
/imgs/gif/gifset_w/warningp_10.gif
/imgs/gif/gifset_w/warningp_100.gif
/imgs/gif/gifset_w/warningp_2.gif
/imgs/gif/gifset_w/warningp_20.gif
/imgs/gif/gifset_w/warningp_3.gif
/imgs/gif/gifset_w/warningp_30.gif
/imgs/gif/gifset_w/warningp_4.gif
/imgs/gif/gifset_w/warningp_40.gif
/imgs/gif/gifset_w/warningp_5.gif
/imgs/gif/gifset_w/warningp_50.gif
/imgs/gif/gifset_w/warningp_6.gif
/imgs/gif/gifset_w/warningp_7.gif
/imgs/gif/gifset_w/warningp_70.gif
/imgs/gif/gifset_w/warningp_8.gif
/imgs/gif/gifset_w/warningp_80.gif
/imgs/gif/gifset_w/warningp_9.gif
/imgs/gif/gifset_w/warningp_90.gif
/imgs/gif/gifset_w/warningq.gif
/imgs/gif/gifset_w/warningq_1.gif
/imgs/gif/gifset_w/warningq_10.gif
/imgs/gif/gifset_w/warningq_100.gif
/imgs/gif/gifset_w/warningq_2.gif
/imgs/gif/gifset_w/warningq_20.gif
/imgs/gif/gifset_w/warningq_3.gif
/imgs/gif/gifset_w/warningq_30.gif
/imgs/gif/gifset_w/warningq_4.gif
/imgs/gif/gifset_w/warningq_40.gif
/imgs/gif/gifset_w/warningq_5.gif
/imgs/gif/gifset_w/warningq_50.gif
/imgs/gif/gifset_w/warningq_6.gif
/imgs/gif/gifset_w/warningq_7.gif
/imgs/gif/gifset_w/warningq_70.gif
/imgs/gif/gifset_w/warningq_8.gif
/imgs/gif/gifset_w/warningq_80.gif
/imgs/gif/gifset_w/warningq_9.gif
/imgs/gif/gifset_w/warningq_90.gif
/imgs/gif/gifset_w/welcome.gif
/imgs/gif/gifset_w/welcomeb.gif
/imgs/gif/gifset_w/welcomeb_1.gif
/imgs/gif/gifset_w/welcomeb_10.gif
/imgs/gif/gifset_w/welcomeb_100.gif
/imgs/gif/gifset_w/welcomeb_2.gif
/imgs/gif/gifset_w/welcomeb_20.gif
/imgs/gif/gifset_w/welcomeb_3.gif
/imgs/gif/gifset_w/welcomeb_30.gif
/imgs/gif/gifset_w/welcomeb_4.gif
/imgs/gif/gifset_w/welcomeb_40.gif
/imgs/gif/gifset_w/welcomeb_5.gif
/imgs/gif/gifset_w/welcomeb_50.gif
/imgs/gif/gifset_w/welcomeb_6.gif
/imgs/gif/gifset_w/welcomeb_7.gif
/imgs/gif/gifset_w/welcomeb_70.gif
/imgs/gif/gifset_w/welcomeb_8.gif
/imgs/gif/gifset_w/welcomeb_80.gif
/imgs/gif/gifset_w/welcomeb_9.gif
/imgs/gif/gifset_w/welcomeb_90.gif
/imgs/gif/gifset_w/welcomed.gif
/imgs/gif/gifset_w/welcomed_1.gif
/imgs/gif/gifset_w/welcomed_10.gif
/imgs/gif/gifset_w/welcomed_100.gif
/imgs/gif/gifset_w/welcomed_2.gif
/imgs/gif/gifset_w/welcomed_20.gif
/imgs/gif/gifset_w/welcomed_3.gif
/imgs/gif/gifset_w/welcomed_30.gif
/imgs/gif/gifset_w/welcomed_4.gif
/imgs/gif/gifset_w/welcomed_40.gif
/imgs/gif/gifset_w/welcomed_5.gif
/imgs/gif/gifset_w/welcomed_50.gif
/imgs/gif/gifset_w/welcomed_6.gif
/imgs/gif/gifset_w/welcomed_7.gif
/imgs/gif/gifset_w/welcomed_70.gif
/imgs/gif/gifset_w/welcomed_8.gif
/imgs/gif/gifset_w/welcomed_80.gif
/imgs/gif/gifset_w/welcomed_9.gif
/imgs/gif/gifset_w/welcomed_90.gif
/imgs/gif/gifset_w/welcomep.gif
/imgs/gif/gifset_w/welcomep_1.gif
/imgs/gif/gifset_w/welcomep_10.gif
/imgs/gif/gifset_w/welcomep_100.gif
/imgs/gif/gifset_w/welcomep_2.gif
/imgs/gif/gifset_w/welcomep_20.gif
/imgs/gif/gifset_w/welcomep_3.gif
/imgs/gif/gifset_w/welcomep_30.gif
/imgs/gif/gifset_w/welcomep_4.gif
/imgs/gif/gifset_w/welcomep_40.gif
/imgs/gif/gifset_w/welcomep_5.gif
/imgs/gif/gifset_w/welcomep_50.gif
/imgs/gif/gifset_w/welcomep_6.gif
/imgs/gif/gifset_w/welcomep_7.gif
/imgs/gif/gifset_w/welcomep_70.gif
/imgs/gif/gifset_w/welcomep_8.gif
/imgs/gif/gifset_w/welcomep_80.gif
/imgs/gif/gifset_w/welcomep_9.gif
/imgs/gif/gifset_w/welcomep_90.gif
/imgs/gif/gifset_w/welcomeq.gif
/imgs/gif/gifset_w/welcomeq_1.gif
/imgs/gif/gifset_w/welcomeq_10.gif
/imgs/gif/gifset_w/welcomeq_100.gif
/imgs/gif/gifset_w/welcomeq_2.gif
/imgs/gif/gifset_w/welcomeq_20.gif
/imgs/gif/gifset_w/welcomeq_3.gif
/imgs/gif/gifset_w/welcomeq_30.gif
/imgs/gif/gifset_w/welcomeq_4.gif
/imgs/gif/gifset_w/welcomeq_40.gif
/imgs/gif/gifset_w/welcomeq_5.gif
/imgs/gif/gifset_w/welcomeq_50.gif
/imgs/gif/gifset_w/welcomeq_6.gif
/imgs/gif/gifset_w/welcomeq_7.gif
/imgs/gif/gifset_w/welcomeq_70.gif
/imgs/gif/gifset_w/welcomeq_8.gif
/imgs/gif/gifset_w/welcomeq_80.gif
/imgs/gif/gifset_w/welcomeq_9.gif
/imgs/gif/gifset_w/welcomeq_90.gif
/imgs/gif/gifset_w/worksign.gif
/imgs/gif/gifset_w/worksignb.gif
/imgs/gif/gifset_w/worksignb_1.gif
/imgs/gif/gifset_w/worksignb_10.gif
/imgs/gif/gifset_w/worksignb_100.gif
/imgs/gif/gifset_w/worksignb_2.gif
/imgs/gif/gifset_w/worksignb_20.gif
/imgs/gif/gifset_w/worksignb_3.gif
/imgs/gif/gifset_w/worksignb_30.gif
/imgs/gif/gifset_w/worksignb_4.gif
/imgs/gif/gifset_w/worksignb_40.gif
/imgs/gif/gifset_w/worksignb_5.gif
/imgs/gif/gifset_w/worksignb_50.gif
/imgs/gif/gifset_w/worksignb_6.gif
/imgs/gif/gifset_w/worksignb_7.gif
/imgs/gif/gifset_w/worksignb_70.gif
/imgs/gif/gifset_w/worksignb_8.gif
/imgs/gif/gifset_w/worksignb_80.gif
/imgs/gif/gifset_w/worksignb_9.gif
/imgs/gif/gifset_w/worksignb_90.gif
/imgs/gif/gifset_w/worksignd.gif
/imgs/gif/gifset_w/worksignd_1.gif
/imgs/gif/gifset_w/worksignd_10.gif
/imgs/gif/gifset_w/worksignd_100.gif
/imgs/gif/gifset_w/worksignd_2.gif
/imgs/gif/gifset_w/worksignd_20.gif
/imgs/gif/gifset_w/worksignd_3.gif
/imgs/gif/gifset_w/worksignd_30.gif
/imgs/gif/gifset_w/worksignd_4.gif
/imgs/gif/gifset_w/worksignd_40.gif
/imgs/gif/gifset_w/worksignd_5.gif
/imgs/gif/gifset_w/worksignd_50.gif
/imgs/gif/gifset_w/worksignd_6.gif
/imgs/gif/gifset_w/worksignd_7.gif
/imgs/gif/gifset_w/worksignd_70.gif
/imgs/gif/gifset_w/worksignd_8.gif
/imgs/gif/gifset_w/worksignd_80.gif
/imgs/gif/gifset_w/worksignd_9.gif
/imgs/gif/gifset_w/worksignd_90.gif
/imgs/gif/gifset_w/worksignp.gif
/imgs/gif/gifset_w/worksignp_1.gif
/imgs/gif/gifset_w/worksignp_10.gif
/imgs/gif/gifset_w/worksignp_100.gif
/imgs/gif/gifset_w/worksignp_2.gif
/imgs/gif/gifset_w/worksignp_20.gif
/imgs/gif/gifset_w/worksignp_3.gif
/imgs/gif/gifset_w/worksignp_30.gif
/imgs/gif/gifset_w/worksignp_4.gif
/imgs/gif/gifset_w/worksignp_40.gif
/imgs/gif/gifset_w/worksignp_5.gif
/imgs/gif/gifset_w/worksignp_50.gif
/imgs/gif/gifset_w/worksignp_6.gif
/imgs/gif/gifset_w/worksignp_7.gif
/imgs/gif/gifset_w/worksignp_70.gif
/imgs/gif/gifset_w/worksignp_8.gif
/imgs/gif/gifset_w/worksignp_80.gif
/imgs/gif/gifset_w/worksignp_9.gif
/imgs/gif/gifset_w/worksignp_90.gif
/imgs/gif/gifset_w/worksignq.gif
/imgs/gif/gifset_w/worksignq_1.gif
/imgs/gif/gifset_w/worksignq_10.gif
/imgs/gif/gifset_w/worksignq_100.gif
/imgs/gif/gifset_w/worksignq_2.gif
/imgs/gif/gifset_w/worksignq_20.gif
/imgs/gif/gifset_w/worksignq_3.gif
/imgs/gif/gifset_w/worksignq_30.gif
/imgs/gif/gifset_w/worksignq_4.gif
/imgs/gif/gifset_w/worksignq_40.gif
/imgs/gif/gifset_w/worksignq_5.gif
/imgs/gif/gifset_w/worksignq_50.gif
/imgs/gif/gifset_w/worksignq_6.gif
/imgs/gif/gifset_w/worksignq_7.gif
/imgs/gif/gifset_w/worksignq_70.gif
/imgs/gif/gifset_w/worksignq_8.gif
/imgs/gif/gifset_w/worksignq_80.gif
/imgs/gif/gifset_w/worksignq_9.gif
/imgs/gif/gifset_w/worksignq_90.gif
/imgs/gif/giphy_dollars/giph_weight.gif
/imgs/gif/giphy_dollars/giphy._hands2gif.gif
/imgs/gif/giphy_dollars/giphy.gif
/imgs/gif/giphy_dollars/giphy001.gif
/imgs/gif/giphy_dollars/giphy002.gif
/imgs/gif/giphy_dollars/giphy003.gif
/imgs/gif/giphy_dollars/giphy006.gif
/imgs/gif/giphy_dollars/giphy_005.gif
/imgs/gif/giphy_dollars/giphy_armodillo.gif
/imgs/gif/giphy_dollars/giphy_arrors.gif
/imgs/gif/giphy_dollars/giphy_bitcoikn.gif
/imgs/gif/giphy_dollars/giphy_bounce.gif
/imgs/gif/giphy_dollars/giphy_circl30.gif
/imgs/gif/giphy_dollars/giphy_compassion.gif
/imgs/gif/giphy_dollars/giphy_dolla.gif
/imgs/gif/giphy_dollars/giphy_dollar.gif
/imgs/gif/giphy_dollars/giphy_dollar11.gif
/imgs/gif/giphy_dollars/giphy_dolrpool.gif
/imgs/gif/giphy_dollars/giphy_droll_wimsy.gif
/imgs/gif/giphy_dollars/giphy_expression.gif
/imgs/gif/giphy_dollars/giphy_getalawyer_horns.gif
/imgs/gif/giphy_dollars/giphy_go20.gif
/imgs/gif/giphy_dollars/giphy_go3.gif
/imgs/gif/giphy_dollars/giphy_gold.gif
/imgs/gif/giphy_dollars/giphy_gov.gif
/imgs/gif/giphy_dollars/giphy_graph2.gif
/imgs/gif/giphy_dollars/giphy_hallway.gif
/imgs/gif/giphy_dollars/giphy_hands.gif
/imgs/gif/giphy_dollars/giphy_hands2.gif
/imgs/gif/giphy_dollars/giphy_hugs.gif
/imgs/gif/giphy_dollars/giphy_kalidis.gif
/imgs/gif/giphy_dollars/giphy_kinetic.gif
/imgs/gif/giphy_dollars/giphy_konabus.gif
/imgs/gif/giphy_dollars/giphy_konabus_stickr.gif
/imgs/gif/giphy_dollars/giphy_kt30.gif
/imgs/gif/giphy_dollars/giphy_law.gif
/imgs/gif/giphy_dollars/giphy_law01.gif
/imgs/gif/giphy_dollars/giphy_law02.gif
/imgs/gif/giphy_dollars/giphy_letter.gif
/imgs/gif/giphy_dollars/giphy_littletipper.gif
/imgs/gif/giphy_dollars/giphy_makechange.gif
/imgs/gif/giphy_dollars/giphy_moneyclap.gif
/imgs/gif/giphy_dollars/giphy_moneyeye.gif
/imgs/gif/giphy_dollars/giphy_moneymachine.gif
/imgs/gif/giphy_dollars/giphy_moneymonkey.gif
/imgs/gif/giphy_dollars/giphy_moneyspiral.gif
/imgs/gif/giphy_dollars/giphy_monydog.gif
/imgs/gif/giphy_dollars/giphy_mouse/giph_phone04y.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy._nophonegif.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy.gif_construction06.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_constrion20.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction01.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction02.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction03.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction04.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction08.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction09.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction11.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction12.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction15.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction21.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction25.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction_10.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction_dogs.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling01.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling02.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling03.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling04.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling06.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling07.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling08.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling09.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_filecabinat.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_focus10.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_mouse01.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_mouse02.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_mouse03.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_mouse06.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_mouse_konabus.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_phone05.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_phone06.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_snap.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphyfu.gif
/imgs/gif/giphy_dollars/giphy_pano.gif
/imgs/gif/giphy_dollars/giphy_pencil.gif
/imgs/gif/giphy_dollars/giphy_phonepage.gif
/imgs/gif/giphy_dollars/giphy_presentermedia.gif
/imgs/gif/giphy_dollars/giphy_presentermedia2.gif
/imgs/gif/giphy_dollars/giphy_ropeup.gif
/imgs/gif/giphy_dollars/giphy_scrollstats.gif
/imgs/gif/giphy_dollars/giphy_trsansform.gif
/imgs/gif/giphy_dollars/giphy_typer.gif
/imgs/gif/giphy_dollars/giphy_verified.gif
/imgs/gif/giphy_dollars/giphy_water.gif
/imgs/gif/giphy_dollars/giphy_weaigh5.gif
/imgs/gif/giphy_dollars/giphy_weight3.gif
/imgs/gif/giphy_dollars/giphyarrowfire.gif
/imgs/gif/giphy_dollars/giphybuslt.gif
/imgs/gif/giphy_dollars/giphyfocuseyes.gif
/imgs/gif/giphy_dollars/giphygowave'.gif
/imgs/gif/giphy_dollars/giphygraph.gif
/imgs/gif/giphy_dollars/giphymoney_smerf.gif
/imgs/gif/giphy_dollars/giphytwist.gif
/imgs/gif/giphy_dollars/giphyvortex.gif
/imgs/gif/giphy_dollars/giphyweaight2.gif
/imgs/gif/giphy_us_news_focus/5kYpl7hIHEKwNOhjgU1_gV84APypkdg-yYH09H0fkS0.gif
/imgs/gif/giphy_us_news_focus/gip_falls3hy.gif
/imgs/gif/giphy_us_news_focus/giph_applebitesy.gif
/imgs/gif/giphy_us_news_focus/giph_armymovie_dancing.gif
/imgs/gif/giphy_us_news_focus/giph_auroa1y.gif
/imgs/gif/giphy_us_news_focus/giph_cloudlipsy.gif
/imgs/gif/giphy_us_news_focus/giph_crazy_chipndale.gif
/imgs/gif/giphy_us_news_focus/giph_cuberolly.gif
/imgs/gif/giphy_us_news_focus/giph_droopywalkery.gif
/imgs/gif/giphy_us_news_focus/giph_ducks_hatchety.gif
/imgs/gif/giphy_us_news_focus/giph_fallsy.gif
/imgs/gif/giphy_us_news_focus/giph_fradykaty.gif
/imgs/gif/giphy_us_news_focus/giph_hand6y.gif
/imgs/gif/giphy_us_news_focus/giph_handsignxy.gif
/imgs/gif/giphy_us_news_focus/giph_homer_skippingy.gif
/imgs/gif/giphy_us_news_focus/giph_kiti_dancey.gif
/imgs/gif/giphy_us_news_focus/giph_labthinker_startle.gif
/imgs/gif/giphy_us_news_focus/giph_mouthorbsy.gif
/imgs/gif/giphy_us_news_focus/giph_mrrogers_fingersy.gif
/imgs/gif/giphy_us_news_focus/giph_officer_byrdbelly.gif
/imgs/gif/giphy_us_news_focus/giph_pastryroad_food_strollersy.gif
/imgs/gif/giphy_us_news_focus/giph_portalguyy.gif
/imgs/gif/giphy_us_news_focus/giph_roullett2y.gif
/imgs/gif/giphy_us_news_focus/giph_tinkerbell_sity.gif
/imgs/gif/giphy_us_news_focus/giph_tinkerbell_wavey.gif
/imgs/gif/giphy_us_news_focus/giph_yoga_gloey.gif
/imgs/gif/giphy_us_news_focus/giphroullettey.gif
/imgs/gif/giphy_us_news_focus/giphy._andy_pilllession.gif
/imgs/gif/giphy_us_news_focus/giphy._astricgif.gif
/imgs/gif/giphy_us_news_focus/giphy._bigcombgif.gif
/imgs/gif/giphy_us_news_focus/giphy._bugs_blueprintgif.gif
/imgs/gif/giphy_us_news_focus/giphy._bugs_survalgif.gif
/imgs/gif/giphy_us_news_focus/giphy._byrdpucker_newsgif.gif
/imgs/gif/giphy_us_news_focus/giphy._crazy_belegosygif.gif
/imgs/gif/giphy_us_news_focus/giphy._hallwaygif.gif
/imgs/gif/giphy_us_news_focus/giphy._handripplesgif.gif
/imgs/gif/giphy_us_news_focus/giphy._headnhandsgif.gif
/imgs/gif/giphy_us_news_focus/giphy._horse_dancygif.gif
/imgs/gif/giphy_us_news_focus/giphy._horsegirl_toongif.gif
/imgs/gif/giphy_us_news_focus/giphy._jak1gif.gif
/imgs/gif/giphy_us_news_focus/giphy._jumpropegif.gif
/imgs/gif/giphy_us_news_focus/giphy._kitihahagif.gif
/imgs/gif/giphy_us_news_focus/giphy._musicgif.gif
/imgs/gif/giphy_us_news_focus/giphy._oldknobegif.gif
/imgs/gif/giphy_us_news_focus/giphy._orbcube2gif.gif
/imgs/gif/giphy_us_news_focus/giphy._orbsgif.gif
/imgs/gif/giphy_us_news_focus/giphy._ponygirl_runninggif.gif
/imgs/gif/giphy_us_news_focus/giphy._sniffergif.gif
/imgs/gif/giphy_us_news_focus/giphy._timefacegif.gif
/imgs/gif/giphy_us_news_focus/giphy._zoom_creepygif.gif
/imgs/gif/giphy_us_news_focus/giphy._zoom_microgif.gif
/imgs/gif/giphy_us_news_focus/giphy.gif
/imgs/gif/giphy_us_news_focus/giphy.gif_duckbottom.gif
/imgs/gif/giphy_us_news_focus/giphy_321run.gif
/imgs/gif/giphy_us_news_focus/giphy_al_ankovick_handflail.gif
/imgs/gif/giphy_us_news_focus/giphy_alien_bio2.gif
/imgs/gif/giphy_us_news_focus/giphy_alien_dancer.gif
/imgs/gif/giphy_us_news_focus/giphy_alien_handflal.gif
/imgs/gif/giphy_us_news_focus/giphy_alien_heads.gif
/imgs/gif/giphy_us_news_focus/giphy_alien_pause.gif
/imgs/gif/giphy_us_news_focus/giphy_android_breath.gif
/imgs/gif/giphy_us_news_focus/giphy_arm_n_hand.gif
/imgs/gif/giphy_us_news_focus/giphy_army_dancehands.gif
/imgs/gif/giphy_us_news_focus/giphy_armydance_rusia.gif
/imgs/gif/giphy_us_news_focus/giphy_bananahat.gif
/imgs/gif/giphy_us_news_focus/giphy_bettyboop_accounting.gif
/imgs/gif/giphy_us_news_focus/giphy_bigjoger.gif
/imgs/gif/giphy_us_news_focus/giphy_bird_jogger.gif
/imgs/gif/giphy_us_news_focus/giphy_birdgirl_vinage.gif
/imgs/gif/giphy_us_news_focus/giphy_blocks.gif
/imgs/gif/giphy_us_news_focus/giphy_bluecircle.gif
/imgs/gif/giphy_us_news_focus/giphy_bugs_mirror.gif
/imgs/gif/giphy_us_news_focus/giphy_buzznduck.gif
/imgs/gif/giphy_us_news_focus/giphy_byrdpucker_cowgirl_yodkle.gif
/imgs/gif/giphy_us_news_focus/giphy_calwheel.gif
/imgs/gif/giphy_us_news_focus/giphy_carterwalk.gif
/imgs/gif/giphy_us_news_focus/giphy_catglasses.gif
/imgs/gif/giphy_us_news_focus/giphy_chain.gif
/imgs/gif/giphy_us_news_focus/giphy_chap2act.gif
/imgs/gif/giphy_us_news_focus/giphy_charleybrown_depressesd.gif
/imgs/gif/giphy_us_news_focus/giphy_circlecircle.gif
/imgs/gif/giphy_us_news_focus/giphy_clouds.gif
/imgs/gif/giphy_us_news_focus/giphy_clubbing.gif
/imgs/gif/giphy_us_news_focus/giphy_connect.gif
/imgs/gif/giphy_us_news_focus/giphy_cowgirl_hat.gif
/imgs/gif/giphy_us_news_focus/giphy_cowgirl_hips.gif
/imgs/gif/giphy_us_news_focus/giphy_crazy_flowergirl.gif
/imgs/gif/giphy_us_news_focus/giphy_crazy_manson.gif
/imgs/gif/giphy_us_news_focus/giphy_crazy_simson1.gif
/imgs/gif/giphy_us_news_focus/giphy_crazycats.gif
/imgs/gif/giphy_us_news_focus/giphy_crazydanc1.gif
/imgs/gif/giphy_us_news_focus/giphy_crazydanse2.gif
/imgs/gif/giphy_us_news_focus/giphy_crazyeyes.gif
/imgs/gif/giphy_us_news_focus/giphy_crazyguy2.gif
/imgs/gif/giphy_us_news_focus/giphy_crazyhead3.gif
/imgs/gif/giphy_us_news_focus/giphy_curealla_doorflash.gif
/imgs/gif/giphy_us_news_focus/giphy_cute_ponygirl.gif
/imgs/gif/giphy_us_news_focus/giphy_cute_ponytoon.gif
/imgs/gif/giphy_us_news_focus/giphy_cutekiti3.gif
/imgs/gif/giphy_us_news_focus/giphy_cutekity.gif
/imgs/gif/giphy_us_news_focus/giphy_cycklebars.gif
/imgs/gif/giphy_us_news_focus/giphy_cycle2.gif
/imgs/gif/giphy_us_news_focus/giphy_dance_pinocio.gif
/imgs/gif/giphy_us_news_focus/giphy_dancerbears.gif
/imgs/gif/giphy_us_news_focus/giphy_daneworm2.gif
/imgs/gif/giphy_us_news_focus/giphy_derbys.gif
/imgs/gif/giphy_us_news_focus/giphy_dogdron.gif
/imgs/gif/giphy_us_news_focus/giphy_dresswalking.gif
/imgs/gif/giphy_us_news_focus/giphy_drummerboy.gif
/imgs/gif/giphy_us_news_focus/giphy_duck_hotpic.gif
/imgs/gif/giphy_us_news_focus/giphy_duck_refusal.gif
/imgs/gif/giphy_us_news_focus/giphy_duckdance.gif
/imgs/gif/giphy_us_news_focus/giphy_duckdance_1.gif
/imgs/gif/giphy_us_news_focus/giphy_duckwalking.gif
/imgs/gif/giphy_us_news_focus/giphy_dwaf_.gif
/imgs/gif/giphy_us_news_focus/giphy_eyes_cat.gif
/imgs/gif/giphy_us_news_focus/giphy_faint.gif
/imgs/gif/giphy_us_news_focus/giphy_falls2.gif
/imgs/gif/giphy_us_news_focus/giphy_fasttalker.gif
/imgs/gif/giphy_us_news_focus/giphy_feet_aquarium.gif
/imgs/gif/giphy_us_news_focus/giphy_fileburn.gif
/imgs/gif/giphy_us_news_focus/giphy_floatorbe_n_alien.gif
/imgs/gif/giphy_us_news_focus/giphy_focus_pendulum.gif
/imgs/gif/giphy_us_news_focus/giphy_funnwalker.gif
/imgs/gif/giphy_us_news_focus/giphy_gear1.gif
/imgs/gif/giphy_us_news_focus/giphy_goathead.gif
/imgs/gif/giphy_us_news_focus/giphy_goflow.gif
/imgs/gif/giphy_us_news_focus/giphy_gonoard_water.gif
/imgs/gif/giphy_us_news_focus/giphy_handeyes.gif
/imgs/gif/giphy_us_news_focus/giphy_handshadows.gif
/imgs/gif/giphy_us_news_focus/giphy_head3.gif
/imgs/gif/giphy_us_news_focus/giphy_headbank.gif
/imgs/gif/giphy_us_news_focus/giphy_headinhead.gif
/imgs/gif/giphy_us_news_focus/giphy_holloween_waited2long.gif
/imgs/gif/giphy_us_news_focus/giphy_horse_champ.gif
/imgs/gif/giphy_us_news_focus/giphy_horse_circle.gif
/imgs/gif/giphy_us_news_focus/giphy_horse_connelly.gif
/imgs/gif/giphy_us_news_focus/giphy_horseguy.gif
/imgs/gif/giphy_us_news_focus/giphy_horseguy_dancer.gif
/imgs/gif/giphy_us_news_focus/giphy_horseguy_greekdance.gif
/imgs/gif/giphy_us_news_focus/giphy_horsehead2head.gif
/imgs/gif/giphy_us_news_focus/giphy_hotdogs_woof.gif
/imgs/gif/giphy_us_news_focus/giphy_hummingbird.gif
/imgs/gif/giphy_us_news_focus/giphy_icecreamman.gif
/imgs/gif/giphy_us_news_focus/giphy_jkwiitree.gif
/imgs/gif/giphy_us_news_focus/giphy_jtf30_sinkhole.gif
/imgs/gif/giphy_us_news_focus/giphy_jumproap.gif
/imgs/gif/giphy_us_news_focus/giphy_kids_teatertater.gif
/imgs/gif/giphy_us_news_focus/giphy_kiti_piano1.gif
/imgs/gif/giphy_us_news_focus/giphy_kitisocks.gif
/imgs/gif/giphy_us_news_focus/giphy_klatu_visor.gif
/imgs/gif/giphy_us_news_focus/giphy_ko_air_gituar.gif
/imgs/gif/giphy_us_news_focus/giphy_konabus_bigroll.gif
/imgs/gif/giphy_us_news_focus/giphy_kt_closereflex.gif
/imgs/gif/giphy_us_news_focus/giphy_kt_dance.gif
/imgs/gif/giphy_us_news_focus/giphy_kt_warmup.gif
/imgs/gif/giphy_us_news_focus/giphy_kt_wip.gif
/imgs/gif/giphy_us_news_focus/giphy_lab_thinker.gif
/imgs/gif/giphy_us_news_focus/giphy_labthinker_gotit.gif
/imgs/gif/giphy_us_news_focus/giphy_labthinker_happydance.gif
/imgs/gif/giphy_us_news_focus/giphy_labthinker_nod.gif
/imgs/gif/giphy_us_news_focus/giphy_labthinker_poof.gif
/imgs/gif/giphy_us_news_focus/giphy_labthinker_v.gif
/imgs/gif/giphy_us_news_focus/giphy_lawguy_crazy.gif
/imgs/gif/giphy_us_news_focus/giphy_lawguy_doublecrazy.gif
/imgs/gif/giphy_us_news_focus/giphy_lawguy_doublefinders.gif
/imgs/gif/giphy_us_news_focus/giphy_lawguy_singlefinger.gif
/imgs/gif/giphy_us_news_focus/giphy_loopdeloop.gif
/imgs/gif/giphy_us_news_focus/giphy_lovegyro.gif
/imgs/gif/giphy_us_news_focus/giphy_magicdress1.gif
/imgs/gif/giphy_us_news_focus/giphy_magicdress_1.gif
/imgs/gif/giphy_us_news_focus/giphy_magicdress_2.gif
/imgs/gif/giphy_us_news_focus/giphy_magicdress_carage.gif
/imgs/gif/giphy_us_news_focus/giphy_magicfingers.gif
/imgs/gif/giphy_us_news_focus/giphy_magicgeometry.gif
/imgs/gif/giphy_us_news_focus/giphy_mcclown.gif
/imgs/gif/giphy_us_news_focus/giphy_mickey_boatwistle.gif
/imgs/gif/giphy_us_news_focus/giphy_mickey_devildance.gif
/imgs/gif/giphy_us_news_focus/giphy_mickey_magic.gif
/imgs/gif/giphy_us_news_focus/giphy_mickeymagic_hands1.gif
/imgs/gif/giphy_us_news_focus/giphy_mickeymagic_hands2.gif
/imgs/gif/giphy_us_news_focus/giphy_mickeypiano2.gif
/imgs/gif/giphy_us_news_focus/giphy_mickeypiano_32.gif
/imgs/gif/giphy_us_news_focus/giphy_mickymagic_hat1.gif
/imgs/gif/giphy_us_news_focus/giphy_mickymagic_haton.gif
/imgs/gif/giphy_us_news_focus/giphy_mikey_piano.gif
/imgs/gif/giphy_us_news_focus/giphy_miky_magic_stars.gif
/imgs/gif/giphy_us_news_focus/giphy_monkeytrap_release.gif
/imgs/gif/giphy_us_news_focus/giphy_mousedance_1.gif
/imgs/gif/giphy_us_news_focus/giphy_mousedance_2.gif
/imgs/gif/giphy_us_news_focus/giphy_mouth_wavy.gif
/imgs/gif/giphy_us_news_focus/giphy_nosign.gif
/imgs/gif/giphy_us_news_focus/giphy_oragatang_hairblower.gif
/imgs/gif/giphy_us_news_focus/giphy_orbs_n_arcs.gif
/imgs/gif/giphy_us_news_focus/giphy_ozcouple.gif
/imgs/gif/giphy_us_news_focus/giphy_peterpan_closecall.gif
/imgs/gif/giphy_us_news_focus/giphy_piano_mouses.gif
/imgs/gif/giphy_us_news_focus/giphy_pills.gif
/imgs/gif/giphy_us_news_focus/giphy_pinocia_danc2.gif
/imgs/gif/giphy_us_news_focus/giphy_pinup_barbq.gif
/imgs/gif/giphy_us_news_focus/giphy_ponyride.gif
/imgs/gif/giphy_us_news_focus/giphy_potion_head.gif
/imgs/gif/giphy_us_news_focus/giphy_potterywheel.gif
/imgs/gif/giphy_us_news_focus/giphy_powerwoamn.gif
/imgs/gif/giphy_us_news_focus/giphy_pperms_stars_stripes.gif
/imgs/gif/giphy_us_news_focus/giphy_ripples.gif
/imgs/gif/giphy_us_news_focus/giphy_simpsons_takemeaway.gif
/imgs/gif/giphy_us_news_focus/giphy_sitter.gif
/imgs/gif/giphy_us_news_focus/giphy_sitter_pondeyes.gif
/imgs/gif/giphy_us_news_focus/giphy_sloop.gif
/imgs/gif/giphy_us_news_focus/giphy_slots.gif
/imgs/gif/giphy_us_news_focus/giphy_slowwalker.gif
/imgs/gif/giphy_us_news_focus/giphy_soupstorm.gif
/imgs/gif/giphy_us_news_focus/giphy_spion_walker.gif
/imgs/gif/giphy_us_news_focus/giphy_spiral.gif
/imgs/gif/giphy_us_news_focus/giphy_spiralss.gif
/imgs/gif/giphy_us_news_focus/giphy_sprialss.gif
/imgs/gif/giphy_us_news_focus/giphy_starwar_evilhood.gif
/imgs/gif/giphy_us_news_focus/giphy_sumi_gospinner.gif
/imgs/gif/giphy_us_news_focus/giphy_sumo_bodyhead.gif
/imgs/gif/giphy_us_news_focus/giphy_swinggirls.gif
/imgs/gif/giphy_us_news_focus/giphy_tetertater_gus2.gif
/imgs/gif/giphy_us_news_focus/giphy_tetertater_spiners.gif
/imgs/gif/giphy_us_news_focus/giphy_time_bugs.gif
/imgs/gif/giphy_us_news_focus/giphy_time_clockhands.gif
/imgs/gif/giphy_us_news_focus/giphy_timeguy2.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_.kickgif.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_2.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_4.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_crazy.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_mad.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_mapout.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_riverdance.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_starstreamers.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_surprise.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_thimble.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_turnn.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_wall.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_waterfall.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_woops.gif
/imgs/gif/giphy_us_news_focus/giphy_tinrtbell_turm.gif
/imgs/gif/giphy_us_news_focus/giphy_toiletpaper.gif
/imgs/gif/giphy_us_news_focus/giphy_toothout.gif
/imgs/gif/giphy_us_news_focus/giphy_train_justintime.gif
/imgs/gif/giphy_us_news_focus/giphy_trainview.gif
/imgs/gif/giphy_us_news_focus/giphy_trcx_horsewip.gif
/imgs/gif/giphy_us_news_focus/giphy_tvstatic_drips.gif
/imgs/gif/giphy_us_news_focus/giphy_uphill.gif
/imgs/gif/giphy_us_news_focus/giphy_us_chatter.gif
# /imgs/gif/giphy_view30.gif
/imgs/gif/iperms/giphy_army_cleanfun.gif
/imgs/gif/iperms/giphy_army_kiti.gif
/imgs/gif/iperms/giphy_army_marksync.gif
/imgs/gif/iperms/giphy_army_pushups_nohands.gif
/imgs/gif/iperms/giphy_army_seal_sparkle.gif
/imgs/gif/iperms/giphy_army_shake_salure.gif
/imgs/gif/iperms/giphy_army_tankroll.gif
/imgs/gif/iperms/giphy_armydance1.gif
/imgs/gif/iperms/giphy_armymarchn.gif
/imgs/gif/iperms/giphy_armytoon_late.gif
/imgs/gif/iperms/giphy_armywave.gif
/imgs/gif/iperms/giphy_armywave_barrel.gif
/imgs/gif/iperms/giphy_iperms.gif
/imgs/gif/iperms/giphy_iperms_bell.gif
/imgs/gif/iperms/giphy_iperms_strips.gif
/imgs/gif/kali/adfaf.gif
/imgs/gif/kali/kali16.gif
/imgs/gif/kali/kali2.gif
/imgs/gif/kali/kali25.gif
/imgs/gif/kali/kali3.gif
/imgs/gif/kali/kali4.gif
/imgs/gif/kali/kali5.gif
/imgs/gif/kali/kali8].gif
/imgs/gif/kali/kalid1.gif
/imgs/gif/kali/maskflash.gif
/imgs/gif/kali/staic20.gif
/imgs/gif/kali/static1.gif
/imgs/gif/kali/static3.gif
/imgs/gif/kali/static6.gif
/imgs/gif/kitiworks/giphy._kitiworks_read.gif
/imgs/gif/kitiworks/giphy_kiti_ipadfish.gif
/imgs/gif/kitiworks/giphy_kiti_purfect.gif
/imgs/gif/kitiworks/giphy_kitimail.gif
/imgs/gif/kitiworks/giphy_kitionline.gif
/imgs/gif/kitiworks/giphy_kitirunning.gif
/imgs/gif/kitiworks/giphy_kitiwork_bounce.gif
/imgs/gif/kitiworks/giphy_kitiworks_trail.gif
/imgs/gif/kitiworks/giphy_kitiwrites.gif
/imgs/gif/kitiworks/giphy_kocats.gif
/imgs/gif/kitiworks/giphy_news_kitiworks.gif
/imgs/gif/konabus/giphy_konabus10.gif
/imgs/gif/konabus/giphy_konabus11.gif
/imgs/gif/konabus/giphy_konabus13.gif
/imgs/gif/konabus/giphy_konabus14.gif
/imgs/gif/konabus/giphy_konabus20.gif
/imgs/gif/konabus/giphy_skullflowers.gif
/imgs/gif/konabus/giphy_vkonabus03.gif
/imgs/gif/konet/giphy_weave.gif
/imgs/gif/kt/giphy_finger_arat.gif
/imgs/gif/kt/giphy_funnywalking.gif
/imgs/gif/kt/giphy_gymtoss.gif
/imgs/gif/kt/giphy_hand2s.gif
/imgs/gif/kt/giphy_handhither_gloves.gif
/imgs/gif/kt/giphy_hands1.gif
/imgs/gif/kt/giphy_headwaves.gif
/imgs/gif/kt/giphy_homerhandflaling.gif
/imgs/gif/kt/giphy_kt01.gif
/imgs/gif/kt/giphy_kt02.gif
/imgs/gif/kt/giphy_kt03.gif
/imgs/gif/kt/giphy_notes20.gif
/imgs/gif/med/giphy_eyeline.gif
/imgs/gif/med/giphy_eyes_line.gif
/imgs/gif/med/giphy_eyeworms.gif
/imgs/gif/med/giphy_heart01.gif
/imgs/gif/med/giphy_heart02.gif
/imgs/gif/med/giphy_heart04.gif
/imgs/gif/med/giphy_heart06.gif
/imgs/gif/med/giphy_heart10.gif
/imgs/gif/med/giphy_heart11.gif
/imgs/gif/med/giphy_heart12.gif
/imgs/gif/med/giphy_heart13.gif
/imgs/gif/med/giphy_heart15.gif
/imgs/gif/med/giphy_heart16.gif
/imgs/gif/med/giphy_heart17.gif
/imgs/gif/med/giphy_heart18.gif
/imgs/gif/med/giphy_heart19.gif
/imgs/gif/med/giphy_heart20.gif
/imgs/gif/med/giphy_heart21.gif
/imgs/gif/med/giphy_heart22.gif
/imgs/gif/med/giphy_heart23.gif
/imgs/gif/med/giphy_heart24.gif
/imgs/gif/med/giphy_heart25.gif
/imgs/gif/med/giphy_heart26.gif
/imgs/gif/med/giphy_heart27.gif
/imgs/gif/med/giphy_heart28.gif
/imgs/gif/med/giphy_heart29.gif
/imgs/gif/mouse/giphy.gif
/imgs/gif/mouse/giphy_construction01.gif
/imgs/gif/mouse/giphy_construction02.gif
/imgs/gif/mouse/giphy_construction03.gif
/imgs/gif/mouse/giphy_construction04.gif
/imgs/gif/mouse/giphy_construction05.gif
/imgs/gif/mouse/giphy_construction06.gif
/imgs/gif/mouse/giphy_construction07.gif
/imgs/gif/mouse/giphy_construction08.gif
/imgs/gif/mouse/giphy_construction09.gif
/imgs/gif/mouse/giphy_construction10.gif
/imgs/gif/mouse/giphy_construction11.gif
/imgs/gif/mouse/giphy_construction12.gif
/imgs/gif/mouse/giphy_construction13.gif
/imgs/gif/mouse/giphy_construction14.gif
/imgs/gif/mouse/giphy_construction15.gif
/imgs/gif/mouse/giphy_falling01.gif
/imgs/gif/mouse/giphy_falling02.gif
/imgs/gif/mouse/giphy_falling03.gif
/imgs/gif/mouse/giphy_falling04.gif
/imgs/gif/mouse/giphy_falling06.gif
/imgs/gif/mouse/giphy_falling07.gif
/imgs/gif/mouse/giphy_falling08.gif
/imgs/gif/mouse/giphy_falling09.gif
/imgs/gif/mouse/giphy_filecabinat.gif
/imgs/gif/mouse/giphy_focus10.gif
/imgs/gif/mouse/giphy_fu.gif
/imgs/gif/mouse/giphy_mouse01.gif
/imgs/gif/mouse/giphy_mouse02.gif
/imgs/gif/mouse/giphy_mouse03.gif
/imgs/gif/mouse/giphy_mouse06.gif
/imgs/gif/mouse/giphy_mouse_konabus.gif
/imgs/gif/mouse/giphy_phone01.gif
/imgs/gif/mouse/giphy_phone04.gif
/imgs/gif/mouse/giphy_phone05.gif
/imgs/gif/mouse/giphy_phone06.gif
/imgs/gif/mouse/giphy_snap.gif
/imgs/gif/new.gif
/imgs/gif/notes/giphy_konabus16.gif
/imgs/gif/notes/giphy_kt10.gif
/imgs/gif/notes/giphy_notes00.gif
/imgs/gif/notes/giphy_notes01.gif
/imgs/gif/notes/giphy_notes02.gif
/imgs/gif/notes/giphy_notes03.gif
/imgs/gif/notes/giphy_notes04.gif
/imgs/gif/notes/giphy_notes05.gif
/imgs/gif/notes/giphy_notes06.gif
/imgs/gif/notes/giphy_notes07.gif
/imgs/gif/notes/giphy_notes08.gif
/imgs/gif/notes/giphy_notes09.gif
/imgs/gif/notes/giphy_notes10.gif
/imgs/gif/notes/giphy_notes11.gif
/imgs/gif/notes/giphy_notes13.gif
/imgs/gif/notes/giphy_notes15.gif
/imgs/gif/notes/giphy_notes16.gif
/imgs/gif/notes/giphy_notes18.gif
/imgs/gif/notes/giphy_notes19.gif
/imgs/gif/notes/giphy_notes19b.gif
/imgs/gif/notes/giphy_notes23.gif
/imgs/gif/notes/giphy_notes24.gif
/imgs/gif/notes/giphy_notes25.gif
/imgs/gif/notes/giphy_notes26.gif
/imgs/gif/notes/giphy_notes27.gif
/imgs/gif/orbs/balls3.gif
/imgs/gif/orbs/balls4.gif
/imgs/gif/orbs/ballsrainbow.gif
/imgs/gif/orbs/cub1.gif
/imgs/gif/orbs/dia3.gif
/imgs/gif/orbs/diam1.gif
/imgs/gif/orbs/godots.gif
/imgs/gif/orbs/godotss.gif
/imgs/gif/orbs/goripple.gif
/imgs/gif/orbs/helix1.gif
/imgs/gif/orbs/jellyfish.gif
/imgs/gif/orbs/kali11.gif
/imgs/gif/orbs/kali15.gif
/imgs/gif/orbs/kali20.gif
/imgs/gif/orbs/laki21.gif
/imgs/gif/orbs/orb1.gif
/imgs/gif/orbs/orb10.gif
/imgs/gif/orbs/orb11.gif
/imgs/gif/orbs/orb3.gif
/imgs/gif/orbs/orb43.gif
/imgs/gif/orbs/orb6.gif
/imgs/gif/orbs/orb8.gif
/imgs/gif/orbs/orbcryst_alpulse.gif
/imgs/gif/orbs/orbdrip.gif
/imgs/gif/orbs/orbrainbow.gif
/imgs/gif/orbs/orbring.gif
/imgs/gif/orbs/orbspiral.gif
/imgs/gif/orbs/ringcube.gif
/imgs/gif/orbs/rings.gif
/imgs/gif/orbs/rings2.gif
/imgs/gif/orbs/ringworm.gif
/imgs/gif/orbs/rubix.gif
/imgs/gif/orbs/soccorball.gif
/imgs/gif/orbs/sprayfountain.gif
/imgs/gif/orbs/sssfg.gif
/imgs/gif/pastryroad/cakelite.gif
/imgs/gif/pastryroad/giphy._crazycookgif.gif
/imgs/gif/pastryroad/giphy_canydrops.gif
/imgs/gif/pastryroad/giphy_honeydrip.gif
/imgs/gif/pastryroad/giphy_pastryroad_frosting.gif
/imgs/gif/pastryroad/giphy_pastryroad_mixer.gif
/imgs/gif/pastryroad/giphy_woohoo.gif
/imgs/gif/ring.gif
/imgs/gif/ringb.gif
/imgs/gif/ringd.gif
/imgs/gif/ringp.gif
/imgs/gif/ringq.gif
/imgs/gif/rings.gif
/imgs/gif/ringsb.gif
/imgs/gif/ringsd.gif
/imgs/gif/ringsp.gif
/imgs/gif/ringsq.gif
/imgs/gif/spacers/giphy_handkither.gif
/imgs/gif/spacers/giphy_jkwii_head.gif
/imgs/gif/spacers/giphy_jkwii_head2.gif
/imgs/gif/spacers/giphy_spacer_01.gif
/imgs/gif/spacers/giphy_spacer_02.gif
/imgs/gif/spacers/giphy_spacer_03.gif
/imgs/gif/spacers/giphy_spacer_04.gif
/imgs/gif/spacers/giphy_spacer_05.gif
/imgs/gif/spacers/giphy_spacer_07.gif
/imgs/gif/spacers/giphy_spacer_08.gif
/imgs/gif/spacers/giphy_spacer_09.gif
/imgs/gif/spacers/giphy_spacer_10.gif
/imgs/gif/spacers/giphy_spacer_11.gif
/imgs/gif/spacers/giphy_spacer_12.gif
/imgs/gif/spacers/giphy_spacer_13.gif
/imgs/gif/spacers/giphy_spacer_15.gif
/imgs/gif/spacers/giphy_spacer_17.gif
/imgs/gif/spacers/giphy_spacer_19.gif
/imgs/gif/spacers/giphy_spacer_20.gif
/imgs/gif/spacers/giphy_spacer_21.gif
/imgs/gif/spacers/giphy_spacer_22.gif
/imgs/gif/spacers/tn/tn_giphy_handkither.gif
/imgs/gif/spacers/tn/tn_giphy_jkwii_head.gif
/imgs/gif/spacers/tn/tn_giphy_jkwii_head2.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_01.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_02.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_03.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_04.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_05.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_07.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_08.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_09.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_10.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_11.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_12.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_13.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_15.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_17.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_19.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_20.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_21.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_22.gif
/imgs/gif/time/giph_time_ticktocky.gif
/imgs/gif/time/giphy+flag_fireworks.gif
/imgs/gif/time/giphy_circlenumbers.gif
/imgs/gif/time/giphy_kititail.gif
/imgs/gif/time/giphy_konabus_kitibong.gif
/imgs/gif/time/giphy_paperhandling.gif
/imgs/gif/time/giphy_recordtime.gif
/imgs/gif/time/giphy_time1.gif
/imgs/gif/time/giphy_time_1213.gif
/imgs/gif/time/giphy_time_clockrays.gif
/imgs/gif/time/giphy_time_clocks.gif
/imgs/gif/time/giphy_time_cubist.gif
/imgs/gif/time/giphy_time_cycle.gif
/imgs/gif/time/giphy_time_flywheel.gif
/imgs/gif/time/giphy_time_gears.gif
/imgs/gif/time/giphy_time_goo.gif
/imgs/gif/time/giphy_time_hotsand.gif
/imgs/gif/time/giphy_time_kiti_ticktail.gif
/imgs/gif/time/giphy_time_numbers.gif
/imgs/gif/time/giphy_time_running.gif
/imgs/gif/time/giphy_time_schedule.gif
/imgs/gif/time/giphy_time_silouette.gif
/imgs/gif/time/giphy_time_spinn.gif
/imgs/gif/time/giphy_time_spiral.gif
/imgs/gif/time/giphy_time_spiral_up.gif
/imgs/gif/time/giphy_time_strobe.gif
/imgs/gif/time/giphy_time_swingers.gif
/imgs/gif/time/giphy_time_toons.gif
/imgs/gif/time/giphy_time_up.gif
/imgs/gif/time/giphy_timebench.gif
/imgs/gif/time/giphy_timeferro.gif
/imgs/gif/time/giphy_timegirls.gif
/imgs/gif/time/giphy_timeguy.gif
/imgs/gif/time/giphy_timegym.gif
/imgs/gif/time/giphy_timeinky.gif
/imgs/gif/time/giphy_timerunning.gif
/imgs/gif/time/giphy_timespinner.gif
/imgs/gif/time/giphy_timespiral_gold.gif
/imgs/gif/time/giphy_yellowbird_lookin.gif
/imgs/gif/time/stoptheclock.gif
/imgs/gif/time/tn/tn_giph_time_ticktocky.gif
/imgs/gif/time/tn/tn_giphy+flag_fireworks.gif
/imgs/gif/time/tn/tn_giphy_circlenumbers.gif
/imgs/gif/time/tn/tn_giphy_kititail.gif
/imgs/gif/time/tn/tn_giphy_konabus_kitibong.gif
/imgs/gif/time/tn/tn_giphy_paperhandling.gif
/imgs/gif/time/tn/tn_giphy_recordtime.gif
/imgs/gif/time/tn/tn_giphy_time1.gif
/imgs/gif/time/tn/tn_giphy_time_1213.gif
/imgs/gif/time/tn/tn_giphy_time_clockrays.gif
/imgs/gif/time/tn/tn_giphy_time_clocks.gif
/imgs/gif/time/tn/tn_giphy_time_cubist.gif
/imgs/gif/time/tn/tn_giphy_time_cycle.gif
/imgs/gif/time/tn/tn_giphy_time_flywheel.gif
/imgs/gif/time/tn/tn_giphy_time_gears.gif
/imgs/gif/time/tn/tn_giphy_time_goo.gif
/imgs/gif/time/tn/tn_giphy_time_hotsand.gif
/imgs/gif/time/tn/tn_giphy_time_kiti_ticktail.gif
/imgs/gif/time/tn/tn_giphy_time_numbers.gif
/imgs/gif/time/tn/tn_giphy_time_running.gif
/imgs/gif/time/tn/tn_giphy_time_schedule.gif
/imgs/gif/time/tn/tn_giphy_time_silouette.gif
/imgs/gif/time/tn/tn_giphy_time_spinn.gif
/imgs/gif/time/tn/tn_giphy_time_spiral.gif
/imgs/gif/time/tn/tn_giphy_time_spiral_up.gif
/imgs/gif/time/tn/tn_giphy_time_strobe.gif
/imgs/gif/time/tn/tn_giphy_time_swingers.gif
/imgs/gif/time/tn/tn_giphy_time_toons.gif
/imgs/gif/time/tn/tn_giphy_time_up.gif
/imgs/gif/time/tn/tn_giphy_timebench.gif
/imgs/gif/time/tn/tn_giphy_timeferro.gif
/imgs/gif/time/tn/tn_giphy_timegirls.gif
/imgs/gif/time/tn/tn_giphy_timeguy.gif
/imgs/gif/time/tn/tn_giphy_timegym.gif
/imgs/gif/time/tn/tn_giphy_timeinky.gif
/imgs/gif/time/tn/tn_giphy_timerunning.gif
/imgs/gif/time/tn/tn_giphy_timespinner.gif
/imgs/gif/time/tn/tn_giphy_timespiral_gold.gif
/imgs/gif/time/tn/tn_giphy_yellowbird_lookin.gif
/imgs/gif/time/tn/tn_stoptheclock.gif
/imgs/gif/us/giph_jkwii_handglowy.gif
/imgs/gif/us/giph_jkwii_popcorny.gif
/imgs/gif/us/giph_us_snapshot.gif
/imgs/gif/us/giphy_alien_bio3.gif
/imgs/gif/us/giphy_alien_worms.gif
/imgs/gif/us/giphy_book_flipblank.gif
/imgs/gif/us/giphy_book_flipedge.gif
/imgs/gif/us/giphy_book_flipfast.gif
/imgs/gif/us/giphy_book_flipflat.gif
/imgs/gif/us/giphy_book_flipold.gif
/imgs/gif/us/giphy_books_shelf.gif
/imgs/gif/us/giphy_bugs_jaildoorsgif.gif
/imgs/gif/us/giphy_bugs_paper.gif
/imgs/gif/us/giphy_bugs_typer.gif
/imgs/gif/us/giphy_bugs_umbrellagif.gif
/imgs/gif/us/giphy_bugsmugs.gif
/imgs/gif/us/giphy_bulbfire.gif
/imgs/gif/us/giphy_byrdpucker_donutlaw_simpsons.gif
/imgs/gif/us/giphy_byrdpucker_hatgirls.gif
/imgs/gif/us/giphy_byrdpucker_horseheadsgif.gif
/imgs/gif/us/giphy_byrdpucker_scan.gif
/imgs/gif/us/giphy_circles_n_bbs.gif
/imgs/gif/us/giphy_coffee_drip.gif
/imgs/gif/us/giphy_coffee_steam.gif
/imgs/gif/us/giphy_demonhorns.gif
/imgs/gif/us/giphy_flagybanner.gif
/imgs/gif/us/giphy_flipbook.gif
/imgs/gif/us/giphy_flipbook2.gif
/imgs/gif/us/giphy_flipbook_glow.gif
/imgs/gif/us/giphy_flipbooks.gif
/imgs/gif/us/giphy_focus_eyeball_hivey.gif
/imgs/gif/us/giphy_g.gif
/imgs/gif/us/giphy_go_crystalcube.gif
/imgs/gif/us/giphy_gridpart.gif
/imgs/gif/us/giphy_jkwii_glance.gif
/imgs/gif/us/giphy_jkwii_handorb.gif
/imgs/gif/us/giphy_jkwii_headwave2.gif
/imgs/gif/us/giphy_k.gif
/imgs/gif/us/giphy_keyboard_onoff_handtoggle.gif
/imgs/gif/us/giphy_keyboard_round.gif
/imgs/gif/us/giphy_kids_arcstrollers.gif
/imgs/gif/us/giphy_kids_tinkerbel_block.gif
/imgs/gif/us/giphy_kids_tinkerbell_laughblock.gif
/imgs/gif/us/giphy_kids_tinkerbell_leafdoor.gif
/imgs/gif/us/giphy_kids_tinkerbell_stare.gif
/imgs/gif/us/giphy_konabus_bugs_rolln.gif
/imgs/gif/us/giphy_konabus_headsmokn.gif
/imgs/gif/us/giphy_konabus_mushrooms.gif
/imgs/gif/us/giphy_konabus_schrooms.gif
/imgs/gif/us/giphy_koswell50.gif
/imgs/gif/us/giphy_kou_elbowpipes.gif
/imgs/gif/us/giphy_kou_magnets1.gif
/imgs/gif/us/giphy_kou_mercury_steps.gif
/imgs/gif/us/giphy_kou_newschool100.gif
/imgs/gif/us/giphy_kou_science_pour.gif
/imgs/gif/us/giphy_med_headknock1.gif
/imgs/gif/us/giphy_med_heart.gif
/imgs/gif/us/giphy_med_teethgif.gif
/imgs/gif/us/giphy_mistspray.gif
/imgs/gif/us/giphy_news_bookworm.gif
/imgs/gif/us/giphy_news_phone.gif
/imgs/gif/us/giphy_news_presses.gif
/imgs/gif/us/giphy_news_slow.gif
/imgs/gif/us/giphy_news_toon.gif
/imgs/gif/us/giphy_orb7.gif
/imgs/gif/us/giphy_orb_caravan.gif
/imgs/gif/us/giphy_orb_coat.gif
/imgs/gif/us/giphy_orb_crystal.gif
/imgs/gif/us/giphy_orb_cubepulse.gif
/imgs/gif/us/giphy_orb_forward.gif
/imgs/gif/us/giphy_orb_glow.gif
/imgs/gif/us/giphy_orb_linear.gif
/imgs/gif/us/giphy_orb_outgif.gif
/imgs/gif/us/giphy_orb_particles.gif
/imgs/gif/us/giphy_orb_plasmagif.gif
/imgs/gif/us/giphy_orb_spirorbgif.gif
/imgs/gif/us/giphy_orb_static.gif
/imgs/gif/us/giphy_orb_wave.gif
/imgs/gif/us/giphy_orbs_birdseye.gif
/imgs/gif/us/giphy_pastryroad_layersgif.gif
/imgs/gif/us/giphy_pulse.gif
/imgs/gif/us/giphy_pulse_big.gif
/imgs/gif/us/giphy_pulse_cube.gif
/imgs/gif/us/giphy_ringshadows.gif
/imgs/gif/us/giphy_runningman_draw.gif
/imgs/gif/us/giphy_scene_medow_butterfly.gif
/imgs/gif/us/giphy_scene_medow_sky.gif
/imgs/gif/us/giphy_scene_moonpond.gif
/imgs/gif/us/giphy_scene_motiongallery.gif
/imgs/gif/us/giphy_slinky_treadmill.gif
/imgs/gif/us/giphy_spinner1.gif
/imgs/gif/us/giphy_spinner_dark.gif
/imgs/gif/us/giphy_time_platters.gif
/imgs/gif/us/giphy_us_alien_dancers.gif
/imgs/gif/us/giphy_us_babyheads.gif
/imgs/gif/us/giphy_us_ballhead2.gif
/imgs/gif/us/giphy_us_ballheads.gif
/imgs/gif/us/giphy_us_flirty1.gif
/imgs/gif/us/giphy_us_flirty2.gif
/imgs/gif/us/giphy_us_headblinkers.gif
/imgs/gif/us/giphy_us_headline.gif
/imgs/gif/us/giphy_us_headwave.gif
/imgs/gif/us/giphy_us_hive.gif
/imgs/gif/us/giphy_us_hive_walkers.gif
/imgs/gif/us/giphy_us_joggers.gif
/imgs/gif/us/giphy_us_pacer.gif
/imgs/gif/us/giphy_us_toons2.gif
/imgs/gif/us/giphy_us_touch1.gif
/imgs/gif/us/giphy_us_walkers.gif
/imgs/gif/us/giphy_woohoo_mickey.gif
/imgs/gif/us/giphy_xmastrees.gif
/imgs/gif/us/giphy_zensitter.gif
/imgs/gif/us/giphy_zoom_earth.gif
/imgs/gif/us/giphy_zoom_typos_fold.gif
/imgs/gif/us/tn/tn_giph_jkwii_handglowy.gif
/imgs/gif/us/tn/tn_giph_jkwii_popcorny.gif
/imgs/gif/us/tn/tn_giph_us_snapshot.gif
/imgs/gif/us/tn/tn_giphy_alien_bio3.gif
/imgs/gif/us/tn/tn_giphy_alien_worms.gif
/imgs/gif/us/tn/tn_giphy_book_flipblank.gif
/imgs/gif/us/tn/tn_giphy_book_flipedge.gif
/imgs/gif/us/tn/tn_giphy_book_flipfast.gif
/imgs/gif/us/tn/tn_giphy_book_flipflat.gif
/imgs/gif/us/tn/tn_giphy_book_flipold.gif
/imgs/gif/us/tn/tn_giphy_books_shelf.gif
/imgs/gif/us/tn/tn_giphy_bugs_jaildoorsgif.gif
/imgs/gif/us/tn/tn_giphy_bugs_paper.gif
/imgs/gif/us/tn/tn_giphy_bugs_typer.gif
/imgs/gif/us/tn/tn_giphy_bugs_umbrellagif.gif
/imgs/gif/us/tn/tn_giphy_bugsmugs.gif
/imgs/gif/us/tn/tn_giphy_bulbfire.gif
/imgs/gif/us/tn/tn_giphy_byrdpucker_donutlaw_simpsons.gif
/imgs/gif/us/tn/tn_giphy_byrdpucker_hatgirls.gif
/imgs/gif/us/tn/tn_giphy_byrdpucker_horseheadsgif.gif
/imgs/gif/us/tn/tn_giphy_byrdpucker_scan.gif
/imgs/gif/us/tn/tn_giphy_circles_n_bbs.gif
/imgs/gif/us/tn/tn_giphy_coffee_drip.gif
/imgs/gif/us/tn/tn_giphy_coffee_steam.gif
/imgs/gif/us/tn/tn_giphy_demonhorns.gif
/imgs/gif/us/tn/tn_giphy_flagybanner.gif
/imgs/gif/us/tn/tn_giphy_flipbook.gif
/imgs/gif/us/tn/tn_giphy_flipbook2.gif
/imgs/gif/us/tn/tn_giphy_flipbook_glow.gif
/imgs/gif/us/tn/tn_giphy_flipbooks.gif
/imgs/gif/us/tn/tn_giphy_focus_eyeball_hivey.gif
/imgs/gif/us/tn/tn_giphy_g.gif
/imgs/gif/us/tn/tn_giphy_go_crystalcube.gif
/imgs/gif/us/tn/tn_giphy_gridpart.gif
/imgs/gif/us/tn/tn_giphy_jkwii_glance.gif
/imgs/gif/us/tn/tn_giphy_jkwii_handorb.gif
/imgs/gif/us/tn/tn_giphy_jkwii_headwave2.gif
/imgs/gif/us/tn/tn_giphy_k.gif
/imgs/gif/us/tn/tn_giphy_keyboard_onoff_handtoggle.gif
/imgs/gif/us/tn/tn_giphy_keyboard_round.gif
/imgs/gif/us/tn/tn_giphy_kids_arcstrollers.gif
/imgs/gif/us/tn/tn_giphy_kids_tinkerbel_block.gif
/imgs/gif/us/tn/tn_giphy_kids_tinkerbell_laughblock.gif
/imgs/gif/us/tn/tn_giphy_kids_tinkerbell_leafdoor.gif
/imgs/gif/us/tn/tn_giphy_kids_tinkerbell_stare.gif
/imgs/gif/us/tn/tn_giphy_konabus_bugs_rolln.gif
/imgs/gif/us/tn/tn_giphy_konabus_headsmokn.gif
/imgs/gif/us/tn/tn_giphy_konabus_mushrooms.gif
/imgs/gif/us/tn/tn_giphy_konabus_schrooms.gif
/imgs/gif/us/tn/tn_giphy_koswell50.gif
/imgs/gif/us/tn/tn_giphy_kou_elbowpipes.gif
/imgs/gif/us/tn/tn_giphy_kou_magnets1.gif
/imgs/gif/us/tn/tn_giphy_kou_mercury_steps.gif
/imgs/gif/us/tn/tn_giphy_kou_newschool100.gif
/imgs/gif/us/tn/tn_giphy_kou_science_pour.gif
/imgs/gif/us/tn/tn_giphy_med_headknock1.gif
/imgs/gif/us/tn/tn_giphy_med_heart.gif
/imgs/gif/us/tn/tn_giphy_med_teethgif.gif
/imgs/gif/us/tn/tn_giphy_mistspray.gif
/imgs/gif/us/tn/tn_giphy_news_bookworm.gif
/imgs/gif/us/tn/tn_giphy_news_phone.gif
/imgs/gif/us/tn/tn_giphy_news_presses.gif
/imgs/gif/us/tn/tn_giphy_news_slow.gif
/imgs/gif/us/tn/tn_giphy_news_toon.gif
/imgs/gif/us/tn/tn_giphy_orb7.gif
/imgs/gif/us/tn/tn_giphy_orb_caravan.gif
/imgs/gif/us/tn/tn_giphy_orb_coat.gif
/imgs/gif/us/tn/tn_giphy_orb_crystal.gif
/imgs/gif/us/tn/tn_giphy_orb_cubepulse.gif
/imgs/gif/us/tn/tn_giphy_orb_forward.gif
/imgs/gif/us/tn/tn_giphy_orb_glow.gif
/imgs/gif/us/tn/tn_giphy_orb_linear.gif
/imgs/gif/us/tn/tn_giphy_orb_outgif.gif
/imgs/gif/us/tn/tn_giphy_orb_particles.gif
/imgs/gif/us/tn/tn_giphy_orb_plasmagif.gif
/imgs/gif/us/tn/tn_giphy_orb_spirorbgif.gif
/imgs/gif/us/tn/tn_giphy_orb_static.gif
/imgs/gif/us/tn/tn_giphy_orb_wave.gif
/imgs/gif/us/tn/tn_giphy_orbs_birdseye.gif
/imgs/gif/us/tn/tn_giphy_pastryroad_layersgif.gif
/imgs/gif/us/tn/tn_giphy_pulse.gif
/imgs/gif/us/tn/tn_giphy_pulse_big.gif
/imgs/gif/us/tn/tn_giphy_pulse_cube.gif
/imgs/gif/us/tn/tn_giphy_ringshadows.gif
/imgs/gif/us/tn/tn_giphy_runningman_draw.gif
/imgs/gif/us/tn/tn_giphy_scene_medow_butterfly.gif
/imgs/gif/us/tn/tn_giphy_scene_medow_sky.gif
/imgs/gif/us/tn/tn_giphy_scene_moonpond.gif
/imgs/gif/us/tn/tn_giphy_scene_motiongallery.gif
/imgs/gif/us/tn/tn_giphy_slinky_treadmill.gif
/imgs/gif/us/tn/tn_giphy_spinner1.gif
/imgs/gif/us/tn/tn_giphy_spinner_dark.gif
/imgs/gif/us/tn/tn_giphy_time_platters.gif
/imgs/gif/us/tn/tn_giphy_us_alien_dancers.gif
/imgs/gif/us/tn/tn_giphy_us_babyheads.gif
/imgs/gif/us/tn/tn_giphy_us_ballhead2.gif
/imgs/gif/us/tn/tn_giphy_us_ballheads.gif
/imgs/gif/us/tn/tn_giphy_us_flirty1.gif
/imgs/gif/us/tn/tn_giphy_us_flirty2.gif
/imgs/gif/us/tn/tn_giphy_us_headblinkers.gif
/imgs/gif/us/tn/tn_giphy_us_headline.gif
/imgs/gif/us/tn/tn_giphy_us_headwave.gif
/imgs/gif/us/tn/tn_giphy_us_hive.gif
/imgs/gif/us/tn/tn_giphy_us_hive_walkers.gif
/imgs/gif/us/tn/tn_giphy_us_joggers.gif
/imgs/gif/us/tn/tn_giphy_us_pacer.gif
/imgs/gif/us/tn/tn_giphy_us_toons2.gif
/imgs/gif/us/tn/tn_giphy_us_touch1.gif
/imgs/gif/us/tn/tn_giphy_us_walkers.gif
/imgs/gif/us/tn/tn_giphy_woohoo_mickey.gif
/imgs/gif/us/tn/tn_giphy_xmastrees.gif
/imgs/gif/us/tn/tn_giphy_zensitter.gif
/imgs/gif/us/tn/tn_giphy_zoom_earth.gif
/imgs/gif/us/tn/tn_giphy_zoom_typos_fold.gif
/imgs/gif/us_big/giph_us_touch_arms.gif
/imgs/gif/us_big/giphy_alien_bigdancer1.gif
/imgs/gif/us_big/giphy_alien_bigdancer2.gif
/imgs/gif/us_big/giphy_android_anatomy.gif
/imgs/gif/us_big/giphy_boxinbox.gif
/imgs/gif/us_big/giphy_faces2.gif
/imgs/gif/us_big/giphy_finger_team.gif
/imgs/gif/us_big/giphy_focus_android.gif
/imgs/gif/us_big/giphy_jkwii_finger.gif
/imgs/gif/us_big/giphy_jkwii_headwaves2.gif
/imgs/gif/us_big/giphy_keyboard_wavepanel.gif
/imgs/gif/us_big/giphy_kids_bouncedown.gif
/imgs/gif/us_big/giphy_konabus_exhale.gif
/imgs/gif/us_big/giphy_kou_magnet_arc.gif
/imgs/gif/us_big/giphy_kou_magnet_ring.gif
/imgs/gif/us_big/giphy_magnet_link.gif
/imgs/gif/us_big/giphy_med_alien_bio.gif
/imgs/gif/us_big/giphy_med_heart3.gif
/imgs/gif/us_big/giphy_med_implosion.gif
/imgs/gif/us_big/giphy_news_keaton_bignews.gif
/imgs/gif/us_big/giphy_orb_sandripple.gif
/imgs/gif/us_big/giphy_orb_square.gif
/imgs/gif/us_big/giphy_orb_static2.gif
/imgs/gif/us_big/giphy_orbs_concavering.gif
/imgs/gif/us_big/giphy_pastryroad_flipn.gif
/imgs/gif/us_big/giphy_spinner_copper.gif
/imgs/gif/us_big/giphy_us_ballhead_bouncers.gif
/imgs/gif/us_big/giphy_us_gooddeed.gif
/imgs/gif/us_big/giphy_us_hatshake.gif
/imgs/gif/us_big/giphy_us_meet_latex_portal.gif
/imgs/gif/us_big/giphy_us_morph1.gif
/imgs/gif/us_big/giphy_us_morph2.gif
/imgs/gif/us_big/giphy_us_sarandancer.gif
/imgs/gif/us_big/giphy_us_toons1.gif
/imgs/gif/us_big/giphy_zoom_bug.gif
/imgs/gif/view/giphy_us01.gif
/imgs/gif/view/giphy_view00.gif
/imgs/gif/view/giphy_view01.gif
/imgs/gif/view/giphy_view02.gif
/imgs/gif/view/giphy_view03.gif
/imgs/gif/view/giphy_view04.gif
/imgs/gif/view/giphy_view05.gif
/imgs/gif/view/giphy_view06.gif
/imgs/gif/view/giphy_view08.gif
/imgs/gif/view/giphy_view09.gif
/imgs/gif/view/giphy_view10.gif
/imgs/gif/view/giphy_view11.gif
/imgs/gif/view/giphy_view12.gif
/imgs/gif/view/giphy_view13.gif
/imgs/gif/view/giphy_view14.gif
/imgs/gif/view/giphy_view15y.gif
/imgs/gif/view/giphy_view16.gif
/imgs/gif/view/giphy_view17.gif
/imgs/gif/view/giphy_view19.gif
/imgs/gif/view/giphy_view20.gif
/imgs/gif/view/giphy_view21.gif
/imgs/gif/view/giphy_view22.gif
/imgs/gif/view/giphy_view25.gif
/imgs/gif/view/giphy_view26.gif
/imgs/gif/view/giphy_view27.gif
/imgs/gif/view/giphy_view28.gif
/imgs/gif/view/giphy_view29.gif
/imgs/gif/view/giphy_view30.gif
/imgs/gif/view/giphy_view31.gif
/imgs/gif/view/giphy_view32.gif
/imgs/gif/view/giphy_view33.gif
/imgs/gif/view/giphy_view34.gif
/imgs/gif/view/giphy_view35.gif
`;

kolists['bb'] = ``;
kolists['dd'] = ``;

kolists['pn'] = 
`/pn/imgs/pano_creek5.jpg
/pn/imgs/pano_burmuda.jpg
/pn/imgs/PIA22313_pano.jpg
/pn/imgs/Sol83-PremiersGivres-pano.jpg
/pn/imgs/Taipo_pano.jpg
/pn/imgs/Opportunity-Mars-Rover-Lander-pia19112.jpg
/pn/imgs/mars-rover-opportunity-pia19111_Sol3902B_Cape_Tribulation_L2R2ana.jpg
/pn/imgs/mars-rover-opportunity-pia19110_Sol3902B_Cape_Tribulation_L257F.jpg
/pn/imgs/mars-gale-crater-panorama-pia11241-full.jpg
/pn/imgs/opportunity-panorama-warton-ridge-enhanced-pia20850-full.jpg
/pn/imgs/mars-panoramic-mt-sharp-rover-curiosity-pia19662.jpg
/pn/imgs/pano_jtf_entrance_jtf.jpg
/pn/imgs/pano_jtf_entrance.jpg
/pn/imgs/pano_fork_grass.jpg
/pn/imgs/pano_jtfarms_entrance_9700x100.jpg
/pn/imgs/pano_backyard_all.jpg
/pn/imgs/pano_jtfarms_enter_hi.jpg
/pn/imgs/pano_falls.jpg
/pn/imgs/pano_falls1_4000.jpg
/pn/imgs/pano_courtyard2.jpg
/pn/imgs/pano_courtyard1.jpg
/pn/imgs/pano_closeline.jpg
/pn/imgs/pano_falls_south.jpg
/pn/imgs/pano_falls_north.jpg
/pn/imgs/pano_falls_015-285.jpg
/pn/imgs/pano_creek.jpg
/pn/imgs/yard.jpg
/pn/imgs/veneer.jpg
/pn/imgs/sphere.jpg
/pn/imgs/pano.jpg
/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,
/pn/imgs/yard.jpg,.
/pn/imgs,yard.jpg,yard,.jpg,100790,2007-05-10_20:35:18,
/pn/imgs/pano_creek5.jpg
/pn/imgs/pano_burmuda.jpg
/pn/imgs/PIA22313_pano.jpg
/pn/imgs/Sol83-PremiersGivres-pano.jpg
/pn/imgs/Taipo_pano.jpg
/pn/imgs/Opportunity-Mars-Rover-Lander-pia19112.jpg
/pn/imgs/mars-rover-opportunity-pia19111_Sol3902B_Cape_Tribulation_L2R2ana.jpg
/pn/imgs/mars-rover-opportunity-pia19110_Sol3902B_Cape_Tribulation_L257F.jpg
/pn/imgs/mars-gale-crater-panorama-pia11241-full.jpg
/pn/imgs/opportunity-panorama-warton-ridge-enhanced-pia20850-full.jpg
/pn/imgs/mars-panoramic-mt-sharp-rover-curiosity-pia19662.jpg
/pn/imgs/pano_jtf_entrance_jtf.jpg
/pn/imgs/pano_jtf_entrance.jpg
/pn/imgs/pano_fork_grass.jpg
/pn/imgs/pano_jtfarms_entrance_9700x100.jpg
/pn/imgs/pano_backyard_all.jpg
/pn/imgs/pano_jtfarms_enter_hi.jpg
/pn/imgs/pano_falls.jpg
/pn/imgs/pano_falls1_4000.jpg
/pn/imgs/pano_courtyard2.jpg
/pn/imgs/pano_courtyard1.jpg
/pn/imgs/pano_closeline.jpg
/pn/imgs/pano_falls_south.jpg
/pn/imgs/pano_falls_north.jpg
/pn/imgs/pano_falls_015-285.jpg
/pn/imgs/pano_creek.jpg
/pn/imgs/yard.jpg
/pn/imgs/veneer.jpg
/pn/imgs/sphere.jpg
/pn/imgs/pano.jpg
// 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';
// img.src = '
/pn/imgs/pano_falls_south.jpg';
// img.src = '
/pn/imgs/pano_jtf_entrance.jpg';
// img.src = '
/pn/imgs/pano_courtyard1_12b.jpg';
//img.src = '
/pn/imgs/pano_falls1_4000.jpg';
<img name="pano" src=
/pn/imgs/tn/tn_pano.png border=0>
<img name="pano" src=
/pn/imgs/tn/tn_pano_closeline.png border=0>
<img name="pano" src=
/pn/imgs/tn/tn_pano_courtyard1.png border=0>
/pn/imgs/pano_creek5.jpg
/pn/imgs/pano_burmuda.jpg
/pn/imgs/PIA22313_pano.jpg
/pn/imgs/Sol83-PremiersGivres-pano.jpg
/pn/imgs/Taipo_pano.jpg
/pn/imgs/Opportunity-Mars-Rover-Lander-pia19112.jpg
/pn/imgs/mars-rover-opportunity-pia19111_Sol3902B_Cape_Tribulation_L2R2ana.jpg
/pn/imgs/mars-rover-opportunity-pia19110_Sol3902B_Cape_Tribulation_L257F.jpg
/pn/imgs/mars-gale-crater-panorama-pia11241-full.jpg
/pn/imgs/opportunity-panorama-warton-ridge-enhanced-pia20850-full.jpg
/pn/imgs/mars-panoramic-mt-sharp-rover-curiosity-pia19662.jpg
/pn/imgs/pano_jtf_entrance_jtf.jpg
/pn/imgs/pano_jtf_entrance.jpg
/pn/imgs/pano_fork_grass.jpg
/pn/imgs/pano_jtfarms_entrance_9700x100.jpg
/pn/imgs/pano_backyard_all.jpg
/pn/imgs/pano_jtfarms_enter_hi.jpg
/pn/imgs/pano_falls.jpg
/pn/imgs/pano_falls1_4000.jpg
/pn/imgs/pano_courtyard2.jpg
/pn/imgs/pano_courtyard1.jpg
/pn/imgs/pano_closeline.jpg
/pn/imgs/pano_falls_south.jpg
/pn/imgs/pano_falls_north.jpg
/pn/imgs/pano_falls_015-285.jpg
/pn/imgs/yard.jpg
/pn/imgs/veneer.jpg
/pn/imgs/sphere.jpg
/pn/imgs/pano.jpg

`;
kolists['sl'] = 
`/sl/html/index_sl.html
/sl/html/index_sl_20180509.html
/sl/html/index_sl_20180514.html
/sl/html/index_sl_20180515_2000.html
/sl/html/index_sl_20180516_0145.html
/sl/html/index_sl_20180516_0330.html
/sl/html/index_sl_20180517.html
/sl/html/index_sl_20180518.html
/sl/html/index_sl_20180520_2000_debugs.html
/sl/html/index_sl_20180521_1200.html
/sl/html/index_sl_20180701.html
/sl/html/index_sl_i.html
/sl/html/index_sl_imgs-anim.html
/sl/html/index_sl_imgs-bg.html
/sl/html/index_sl_imgs-btn.html
/sl/html/index_sl_imgs-links.html
/sl/html/index_sl_jtfdc-kb-animal_control.html
/sl/html/index_sl_jtfdc-kb-court-jpg_eagles_theft.html
/sl/html/index_sl_jtfdc-kb-court-pdf2jpg_20151215_acd.html
/sl/html/index_sl_jtfdc-kb-jpg_20161007_jtflaw_alexander.html
/sl/html/index_sl_jtfdc-kb-jtf_takes.html
/sl/html/index_sl_jtfdc-kb-jtfdc_v_jtfinc.html
/sl/html/index_sl_jtfdc-kb-ka_jtf29_title.html
/sl/html/index_sl_jtfdc-kb-restraining.html
/sl/html/index_sl_jtfdc.html
/sl/html/index_sl_kb-books-go-200807.html
/sl/html/index_sl_kb-books-go-200808.html
/sl/html/index_sl_kb-books-go-20130726.html
/sl/html/index_sl_kb-books-jmh-cleveland copy.html
/sl/html/index_sl_kb-books-jmh-cleveland.html
/sl/html/index_sl_kb-books-jmh-jmh2015 copy.html
/sl/html/index_sl_kb-books-jmh-jmh2015.html
/sl/html/index_sl_kb-books-jmh-jmh71-jmh71a copy.html
/sl/html/index_sl_kb-books-jmh-jmh71-jmh71a.html
/sl/html/index_sl_kb-books-jmh-jmh71-jmh71b copy.html
/sl/html/index_sl_kb-books-jmh-jmh71-jmh71b.html
/sl/html/index_sl_kb-books-jmh-userguide_80_bw copy.html
/sl/html/index_sl_kb-books-jmh-userguide_80_bw.html
/sl/html/index_sl_kb-books-kids-rumplestiltskin.html
/sl/html/index_sl_kb-books-kids-schruvelpeter.html
/sl/html/index_sl_kb-books-mil-iperms.html
/sl/html/index_sl_kb-books-mil-korea74.html
/sl/html/index_sl_kb-books-mil-leonardwood90.html
/sl/html/index_sl_kb-books-mil-saic.html
/sl/html/index_sl_kb-books-tech-astronomy_lacross_menschic.html
/sl/html/index_sl_kb-books-tech-calculus.html
/sl/html/index_sl_kb-books-tech-digitalmag.html
/sl/html/index_sl_kb-books-tech-duden.html
/sl/html/index_sl_kb-books-tech-physics.html
/sl/html/index_sl_kb-books-tech-time.html
/sl/html/index_sl_kb-intl-deutsche_memories.html
/sl/html/index_sl_kb-intl-ein_hundes_leben.html
/sl/html/index_sl_kb-intl-romanian_bocc.html
/sl/html/index_sl_kb-jmh71.html
/sl/html/index_sl_kb-kt-aikido_dynamic_sphere.html
/sl/html/index_sl_kb-kt-asian_fighting_arats_dragger.html
/sl/html/index_sl_kb-kt-chinesemed.html
/sl/html/index_sl_kb-kt-masters.html
/sl/html/index_sl_kb-kt-muschi_five_rings.html
/sl/html/index_sl_links.html
/sl/html/index_sl_medcan_bible.html
`;

kolists['tm'] = ``;

kolists['tl'] = 
`/tl/avg.json
/tl/avg_kt.json
/tl/codekit-config.json
/tl/example_json.json
/tl/iperms.json
/tl/jtfdc.json
/tl/jtfinc.json
/tl/ka.json
/tl/ko_json.json
/tl/ko_json_orig.json
/tl/konet.json
/tl/model.json
/tl/saic.json
/tl/t.json
/tl/tl.json
/tl/tl00.json
/tl/tl1.json
/tl/tl1_json.json
/tl/tl2.json
/tl/tl2_json.json
/tl/tl3.json
/tl/tl3_json.json
/tl/tl4_json.json
/tl/tl_best.json
/tl/tl_best1.json
/tl/tl_db.json
/tl/tl_db_cli.json
/tl/tl_db_jpg.json
/tl/tl_db_mp4.json
/tl/tl_fb_law.json
/tl/tl_fb_law_jkwiiv_byrdbell.json
/tl/tl_jenna_json.json
/tl/tl_jpg.json
/tl/tl_jtfdc_kids.json
/tl/tl_jtfdc_stalkarounds.json
/tl/tl_jtfinc_neighbors.json
/tl/tl_mp4.json
/tl/tl_ne.json
/tl/tl_st.json
/tl/tl_templet.json
/tl/tldb.json
/tl/tldb1.json
/tl/tldb2.json
/tl/tli.json
/tl/tll.json
/tl/tlphp.json
`;

kolists['yt'] = 
`yt_20200408_mcduff|https://www.youtube.com/watch?v=baK-7kr-zoo
yt_20200408_webb|https://www.youtube.com/watch?v=QdZ-vfJSE9U
yt_20200407_webb|https://www.youtube.com/watch?v=R4dLXs0PIrI
yt_20200406_webb|https://www.youtube.com/watch?v=xgtAHyssRmo
yt_20150625_chrisrea_somewhere_between_stars_santo_spirito|https://www.youtube.com/watch?v=0RF1mXxAhys
yt_20200331_carlin_germs|https://www.youtube.com/watch?v=l_L6AS1Huno
yt_20190311_bob_dylan_gotta_serve_somebody_audio|https://www.youtube.com/watch?v=wC10VWDTzmU
yt_20200407_stroppyme|https://www.youtube.com/watch?v=unNuvGJ3ses
yt_20200406_autodidactic_chinese_tartate_1729|https://www.youtube.com/watch?v=bwoF1MlckRw
yt_20190905_quinn_timothy_oneil_band_let_it_rain_official|https://www.youtube.com/watch?v=CHedk8yAF_g
yt_20200407_housitonic|https://www.youtube.com/watch?v=_pBsL0qW2Vs
yt_20200407_amazingpolly|https://www.youtube.com/watch?v=zoK6h4Mg7E8
yt_20200406_vlad9vt_sicily_polygonal_ancient_masonry|https://www.youtube.com/watch?v=sVMjRmpdUIw
yt_20200404_vlad9vt_malta_magalith|https://www.youtube.com/watch?v=zpHy1Q-fqCU
yt_20200326_borealusforum_wal_thornhil_this_is_our_electric_univers_p1of2|https://www.youtube.com/watch?v=u7peR-2m8XI
yt_szigetfestival_20120811_caro_emerald_mistaken_identiy|https://www.youtube.com/watch?v=qV8CV475WHw
yt_szigetfestival_20120811_caro_emerald_night_like_this|https://www.youtube.com/watch?v=Fc6izYdLhNE
yt_caroemerald_20130826_caro_emerald_paris_acoustic|https://www.youtube.com/watch?v=B3aWlt81EwU
yt_caroemerald_20100715_caro_emerald_back_it_up|https://www.youtube.com/watch?v=jo1cyl0QbWo
yt_caroemerald_20100701_caro_emerald_that_man|https://www.youtube.com/watch?v=CFA6dEwWOb4
yt_hotsardines_20160616_when_i_get_low_i_get_high_alan_cumming|https://www.youtube.com/watch?v=rPnXCPmrV3Y
yt_bigbadvoodoodaddy_20121016_diga_diga_doo_official|https://www.youtube.com/watch?v=ufvmD9s76X0
yt_hartandbonamassa_20130707_strange_fruit_official_beht_n_joe|https://www.youtube.com/watch?v=3Qf_aytrlpQ
yt_doristunes_20191201_twelve_bar_blues_band_you_gonna_need_my_help_someday|https://www.youtube.com/watch?v=x1dBWRybOxc
yt_postmodernjukebos_2081115_purple_rain_prince_cover_miche_braden|https://www.youtube.com/watch?v=LT8dW7bGuuM
yt_sanbornsessions_20200129_michael_mcdonald_find_it_in_your_heard_brian_owens|https://www.youtube.com/watch?v=yt4zhbE07Cg
yt_bjork_20200210_ociania_bjork|https://www.youtube.com/watch?v=thnTE2e341g
yt_webb 20200210_streaming_to_joe_biden_water_island_with_sub_base|https://www.youtube.com/watch?v=3wAy4lMjpVU
yt_mcduff_20200210_mindfields_ep5_vatican_assassins|https://www.youtube.com/watch?v=YX2HWrnPZQ4
yt_quinn_20200210_see_ya_later_twitter_deleting_app|https://www.youtube.com/watch?v=p2RkhTBAyG0
yt_newsbud_20200207_turkey_russia_marriage_convenience_nearing_end|https://www.youtube.com/watch?v=XkiOgnu4Ifs
yt_munder_20200210_china_burning_bright_signatures_from_space|https://www.youtube.com/watch?v=LEcj3cBagCQ
yt_dahboo7_20200120_germany_reports_outbreak_h5n8_bird_flu|https://www.youtube.com/watch?v=4tSZN7r6g5U
yt_dahboo7_20200120_20200210_brazil_virus_unknown_origin_genes|https://www.youtube.com/watch?v=pd6oqf-lzNE
yt_vlad9vt_20200210_yonaguni_underwater_structure|https://www.youtube.com/watch?v=S-UGC-gkyCU
yt_instituetofnoeticsciences_20160707_experiments_consciousness_affects_matter_dean_radin_phd|https://www.youtube.com/watch?v=nRSBaq3vAeY
yt_zachstar_20200210_calculus_optimization_beyond|https://www.youtube.com/watch?v=6O8Jyrr9LRc
yt_vipertv_20200210_olmec_orgins_odd_conclusion|https://www.youtube.com/watch?v=pSE9m9jQKpk
yt_liziqi_20190906_liziqi_channel_corn_chinese|https://www.youtube.com/watch?v=bZsfEwr9i6I
yt_ted_20120312_david_gallo_deep_ocean_mysteries_n_wonders|https://www.youtube.com/watch?v=Uqly8ERIkHM
yt_foodwishes_20150422_greek_lemon_chicken_potatoes|https://www.youtube.com/watch?v=h6OSMbfhIao
`;

kolists['zm'] = 
`/zm/space_2019/thule/TileGroup0/0-0-0.jpg
/zm/space_2019/thule1/TileGroup0/0-0-0.jpg
/zm/space_2019/thule2/TileGroup0/0-0-0.jpg
/zm/space_2018/bennu/TileGroup0/0-0-0.jpg
/zm/space_2018/bennu_face/TileGroup0/0-0-0.jpg
/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg
/zm/space_2019/mars_barcode10000/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12364080-6929643-An_interior_view_of_the_dpi600_Notre_Dame_Cathedral_in_Paris_in_the_aft-a-88_1555453712194/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12375020-6929643-image-a-1_1555482644826/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12375022-6929643-image-a-4_1555482679561/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12375026-6929643-image-a-8_1555482902378/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12375032-6929643-image-a-14_1555482936340/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12375036-6929643-One_of_the_cathedral_s_many_intricate_fdpi_acades_around_where_the_t-a-1_1555486099469/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12381954-6929643-image-m-20_1555496529559/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12358952-6929643-Pictured_the_blaze_at_Notre_Dame_yesterday_Much_of_the_roof_was_-/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_a-91_1555453712206/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12361102-6929643-How_did_it_escape_the_flames_The_gdpi_olden_crucifix_standing_above_-a-2_1555486099472/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12354988-6928937-Plumes_of_smoke_quickly_billowed_from_the_cathedral_and_could_be-a-22_1555440231597/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12356584-6928937-The_fire_swiftly_ripped_through_the_cathedral_s_oak_roof_support-a-35_1555440231801/TileGroup0/0-0-0.jpg
/zm/space_2018/mars_rebar_mouldings/TileGroup0/0-0-0.jpg
/zm/space_2018/mars_pouch_rings/TileGroup0/0-0-0.jpg
/zm/space_2018/pano_mars_mtsharp/TileGroup0/0-0-0.jpg
/zm/space_2018/pano_caralperu/TileGroup0/0-0-0.jpg
/zm/space_2018/pano_jtfinc/TileGroup0/0-0-0.jpg
/zm/space_2018/pano_jtfdc/TileGroup0/0-0-0.jpg
/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg
/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg
/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg
/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg
/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg
/zm/zm_nasa/mars_zigzag_panels2400/TileGroup0/0-0-0.jpg
/zm/zm_nasa/nasa/1-scientistsfl/TileGroup0/0-0-0.jpg
/zm/zm_nasa/nasa/Echus-Chasma-On-Mars/TileGroup0/0-0-0.jpg
/zm/zm_nasa/nasa/mars_zigzag_panels/TileGroup0/0-0-0.jpg
/zm/zm_nasa/zm/Curiosity-Murray-Buttes/TileGroup0/0-0-0.jpg
/zm/zm_nasa/venus_400/TileGroup0/0-0-0.jpg
/zm/zm_nasa/zm5_planets/1-scientistsfl/TileGroup0/0-0-0.jpg
/zm/zm_nasa/zm5_planets/1-scientistsfl/TileGroup0/0-0-0.jpg
/zm/hrc2009stl/TileGroup0/0-0-0.jpg
/zm/hrc2011/TileGroup0/0-0-0.jpg
/zm/komap/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/070214_val_marineris_02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/071010-msl-site1-02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/071127-venus-surface-02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/080409-phobos-02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/081016-crater-mound-02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/081103-mars-ripples-02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/081204-rock-layers-02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/090331-mars-starburst-02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/090813-mars-crater-02.jpg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/100113-mars-illusion-02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/20070507_185501_1010108/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/365430main_nacl000000fd_middle_540x540/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/367307main_cracked_hahn_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/369230main_apollolandinglocator_full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/388038main_milichius_full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/393992main_ejecta_20091014_full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/400202main_lroc_apollo11_20091109_full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/403330main_cabeus_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/414923main_wrinkle-ridge-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/416286main_new-images-1-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/417415main_tychocloseup-20100115-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/417417main_tychofull-20100115-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/417869main_arist_bands321-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/417873main_M111918050R_thumb-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/419421main_AS16-M-0891-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/419425main_M106088433R-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/421320main_hadley_rille/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/421615main_plato_2_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/421619main_plato_crater_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/422349main_byrgius-a-20100203-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/422590-mars-taber-ansigt-/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/424828main_LunarOrbiterIII_3085_med/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/433446main_20100311_crisium_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/445016main_anax3600_500/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/445021main_anax_wac_500/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/449172main_WAC_crop_context/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/449174main_M104376385_thumb/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/450800main_tsiol_2_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/450994main_full_moon_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/453514main_meteor_crater2_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/453516main_meteor_crater_az_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/455939main_holeinone_far_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/463365main_M128202846LE/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/503670main_120210a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/521685main_022111a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/521691main_022111b/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/524173main_022511a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/524220main_030211b/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/528087main_031110a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/529214main_031611a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/529221main_031611c/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/531407main_031811b/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/533097main_033111b/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/534165main_040511a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/536801main_041311aa/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/539777main_042111b/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/541041main_042711a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/555516main_053111a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/558017main_060211a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/561423main_060811b/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/576849main_062811b/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/576883main_062911b/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/58-pluto-3-large/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap11_landinJSC2007e045375/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap12_landsitea_JSC2011e118358/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap15_9aa_JSC2007e045378/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap15_lmnortha_JSC2007e045379/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap15_s2a_JSC2011e118359/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_lmviewa_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_lmwesat_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_s10a_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_s11a_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_s13_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_s13a_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_s1a_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_s1ba_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_slandsitea_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_alsepa_JSC2004e52772/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_eva1a_JSC2007e045384/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_evaalsepa_JSC2007e045385/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s1easta_JSC2004e52773/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s1westa_JSC2004e52776/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s2a_JSC2004e52777/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s2eva2a_JSC2004e52774/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s3a_JSC2004e52778/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s3a_JSC2007e045386/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s4a_JSC2007e045388/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s5_JSC2004e20304/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s5a_JSC2004e20304/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s6a_JSC2007e045387/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s6southa_JSC2004e52779/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s7a_JSC2004e52775/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/apll-5_JSC2008e040725/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/AS14-68-9450HR/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/lunar-recon-orbiter-apollo-12-surveyor-3-sites-1/TileGroup0/0-0-0.jpg
/zm/zm_nasa/appollo17_4800/TileGroup0/0-0-0.jpg
/zm/zm_nasa/Curiosity-Murray-Buttes/TileGroup0/0-0-0.jpg
/zm/zm_nasa/zm5_planets/2MASS-Redshift-Survey/TileGroup0/0-0-0.jpg
/us/realtor/ky/zoom/map_doevalley/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf01/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf02/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf03/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf04/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf05/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf06/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf07/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf08/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf09/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf10/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf11/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf12/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf14/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf15/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf16/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf17510/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf17570/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf21/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf22/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf23/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf24/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf26/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf27/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf28/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf29 copy/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf30/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf31/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf32/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf34/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf35/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf36/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf38/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf40/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf41/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf42/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf43/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf44/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf_n/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf_ne/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc_012/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc_e/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc_greater/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc_inc/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc_n/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc_s/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc_w/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfinc/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfinc_proper/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jttf37/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jyf44/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/souixp/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/souixp_boat/TileGroup0/0-0-0.jpg
`;

// kolists['default'] = "neuz konet iperms kids kitiworks pastryroad konabus jtfdc jtfdcr jtfinc jtfdcr dogs memes";
			kolists['divs'] = "av bb fb gm pn sl tl yt zm";
			kolists['kovs'] = "neuz konet iperms kids kitiworks pastryroad konabus jtfdc jtfdcr jtfinc jtfdcr dogs memes";
			kolists['kov'] = "neuz konet iperms kids kitiworks pastryroad konabus jtfdc jtfdcr jtfinc jtfdcr dogs memes";
//			kolists['av'] = jax('/av.txt');
//			kolists['fb'] = jax('/fb.txt');
//			kolists['pn'] = jax('/pn.txt');
//			kolists['sl'] = jax('/sl.txt');
//			kolists['tl'] = jax('/tl.txt');
//			kolists['zm'] = jax('/zm.txt');
			</script>












	<script id="script_load_kolists">
kolists['listids'] = 
`av|/txt/avlist.txt
fb|/txt/fblist.txt
pn|/txt/pnlist.txt
sl|/txt/sllist.txt
tl|/txt/tllist.txt
yt|/txt/ytlist_today.txt
zm|/txt/zmlist.txt
`;
		function load_kolists(args) {
//			args='txt/ytlist_todays.txt';
//			alert( "BUGS_19541 load_kolists args="+args);
//			var ytlist_url='ytlist.txt';
//			if( args ) {ytlist_url=args; }
//			alert( "BUGS_19550 load_kolists ytlist_url="+ytlist_url);
//			alert( "BUGS_19550 show_kolists kolists_ytlist="+kolists['ytlist']);

			var listids=kolists['listids'].split("\n");
			for( j=0; j< listids.length; j++ ) {
				if( /^#/.test(listids[j])) { continue; }
				var len = listids[j].split("|").length;
				var id=listids[j].split("|")[0];
				if( id == undefined ) { continue; }
				if( id == "" ) { continue; }

				var url=listids[j].split("|")[len-1];
				if(! filecheck(url)) { 
//					alert( "BUGS_19573 NOTFOUND j="+j+" id="+id+" url="+url );
					continue; 
					}

				
				var listid=id+"list";
				kolists[listid] = '';
				kolists[listid] = "HEAD listid="+listid;
//				alert( "BUGS_19591 j="+j+" id="+id+" url="+url );
				jax(url);
				kolists[listid] = jax(url);
// alert( "BUGS_19601 load_kolists j="+j+" ID="+id+" URL="+url+"\n\nLIST="+kolists[listid] );
				kolists[listid] = kolists['jax'];
// alert( "BUGS_19602 load_kolists j="+j+" ID="+id+" URL="+url+"\n\nLIST="+kolists[listid] );

//				jax(url); kolists[listid]=kolists['jax'];
//				alert( "BUGS_19603 load_kolists FOUND LEN="+kolists[listid].length+"  listid="+listid+" url="+url );
//				len = kolists[listid].split("\n").length;
//				alert( "BUGS_19604 load_kolists FOUND j="+j+" URL="+url+" LEN="+len+"\n\n LIST="+kolists[listid].split("\n"));
				}
//			alert( "BUGS_19611 jaxbak="+jaxbak );
//			alert( "BUGS_19612 kolists_jax="+kolists['jax'] );
//			alert( "BUGS_19613 kolists_fblist="+kolists['fblist'] );
//			alert( "BUGS_19614 kolists_ytlist="+kolists['ytlist'] );
//			alert( "BUGS_19615 kolists_pnlist="+kolists['pnlist'] );
			return(args);
			}
		</script>

	<script id="script_show_kolists">
		function show_kolists(args) {
//			alert( "BUGS_1961 show_kolists args="+args);
//			alert( "BUGS_1961 show_kolists kolists_listids="+kolists['listids']);
//			alert( "BUGS_1961 show_kolists kolists_fblist="+kolists['fblist']);
//			alert( "BUGS_1962 show_kolists kolists_ytlist="+kolists['ytlist']);
//			alert( "BUGS_1963 show_kolists kolists_avlist="+kolists['avlist']);
//			alert( "BUGS_1963 show_kolists args="+args);
			return(args);
			}
		</script>




	<script id="script_startup">
//		if( filecheck(url_yt)) { 
//			alert( "BUGS_12111 ___FOUND url_yt="+url_yt);
//			kolists['yt'] = jax(url_yt); 
//			alert( "BUGS_11982 kolists="+kolists['yt'];
//			}
//		else {
//			alert( "BUGS_11983 NOTFOUND url_yt="+url_yt );
//			}

		function kludge(args) {
			alert( "BUGS_19850 kludge args="+args );
			}
		
		function blob_sound(args) {
//			alert( "BUGS_19900 blob_sound args="+args );

			if( document.getElementById('img_blob_sound')) {
//				alert( "BUGS_19900 blob_sound args="+args );
//				document.getElementById('audio_sound').src=sound;
//				document.getElementById('audio_sound').play();
//				alert( "BUGS_19900 blob_sound args="+args );

//				document.getElementById('img_blob_sound').src="/imgs/sound/btn_sound13.png";
//				document.getElementById('img_blob_sound').src="/imgs/gif/spacers/giphy_spacer_21.gif";
				document.getElementById('img_blob_sound').src=random_gif;
				if( args != "" ) { sound=args; }
				var sound = "/gm/sounds/bubbles.mp3";
				var sounds = kolists['sounds'];
				sounds += kolists['mp3'];
				sounds += kolists['mp3_bavaria']; 
				sounds += kolists['mp3_jkwii'];

				sounds = sounds.split("\n");
//				var sounds = kolists['sounds'].split("\n");
//				var sounds = kolists['mp3'].split("\n");
				
				sound_max = sounds.length;
//					alert( "BUGS_501 blob_sound sound_max="+sound_max );
				soundid = random_int(sound_max,0);
//					alert( "BUGS_502 blob_sound soundid="+soundid );
				var sound = sounds[soundid];
//					alert( "BUGS_503 blob_sound sound="+sound );

				if(filecheck(sound)) {
//					alert( "BUGS_504 blob_sound FOUND sound="+sound );
					if( document.getElementById('audio_sound')) {
//						alert( "BUGS_505 blob_sound SRC sound="+sound );
						document.getElementById('audio_sound').src=sound;
						document.getElementById('audio_sound').play();
//						alert( "BUGS_506 blob_sound PLAY sound="+sound );
						}
					if( document.getElementById('div_blob_playlist')) {
						var htout = "";
						htout += '<div id="div_blob_playlist">';
						var sound=document.getElementById('audio_sound').src;
						htout += '<h2>'+sound+'</h2>';
						htout += '<h3>'+random_gif+'</h3>';
						htout += '	</div>';
						document.getElementById('div_blob_playlist').innerHTML=htout;
						document.getElementById('div_blob_playlist').style.display="inline";
						}




					}
				}
			else {
//				document.getElementById('img_blob_sound').src="/imgs/sound/btn_sound2.png";
//				document.getElementById('img_blob_sound').src="/imgs/sound/btn_sound10.png";
//				document.getElementById('img_blob_sound').src="/imgs/gif/spacers/giphy_spacer_21.gif";
				if( filecheck(random_gif)) {
					document.getElementById('img_blob_sound').src=random_gif;
					}
				else {
					document.getElementById('img_blob_sound').src="/imgs/gif/notfound.gif";
					}
				}
			}
		</script>

	<br>
	<hr color=black>
	<img id=img_links src=/imgs/btn/koeye.png onclick="toggle('div_links',''); return false;" height=20 border=0>links
	<div id=div_links hidden>
		<h1>div_links</h1>

		<br>
		<h2>hosts: ko2.us konet.org iperms.com ko1.us </h2>
		<img id=img_ko2 title="          ko2.us" src=/imgs/btn/brdb.png onclick="window.open('https://ko2.us');return false;" height=20>
		<img id=img_ko1 title="          ko1.us" src=/imgs/btn/brdb.png onclick="window.open('https://ko1.us'); return false;" height=20>
		<img id=img_konet title="          konet.org" src=/imgs/btn/brdb.png onclick="window.open('https://konet.org'); return false;" height=20>
		<img id=img_iperms title="          iperms.com" src=/imgs/btn/brdb.png onclick="window.open('https://iperms.com'); return false;" height=20>
		<br>
		<h2>categories: ka kt go sw law med</h2>
		<img id=img_ka title="          ka" src=/imgs/btn/brdb.png onclick="window.open('/ka'); return false;" height=20>
		<img id=img_law title="          law" src=/imgs/btn/brdb.png onclick="window.open('/law'); return false;" height=20>
		<img id=img_med title="          med" src=/imgs/btn/brdb.png onclick="window.open('/med'); return false;" height=20>
		<img id=img_kids title="          kids" src=/imgs/btn/brdb.png onclick="window.open('/kids'); return false;" height=20>
		<img id=img_kou title="          kou" src=/imgs/btn/brdb.png onclick="window.open('/kou'); return false;" height=20>
		<img id=img_kt title="          kt" src=/imgs/btn/brdb.png onclick="window.open('/kt'); return false;" height=20>
		<img id=img_go title="          go" src=/imgs/btn/brdb.png onclick="window.open('/go'); return false;" height=20>
		<img id=img_sw title="          sw" src=/imgs/btn/brdb.png onclick="window.open('/sw'); return false;" height=20>
		
		<br>
		<h2>jtfdc jtfdcr jtfinc</h2>
		<img id=img_jtfdc title="          jtfdc" src=/imgs/btn/brdb.png onclick="window.open('/jtfdc'); return false;" height=20>
		<img id=img_jtfdcr title="          jtfdcr" src=/imgs/btn/brdb.png onclick="window.open('/jtfdcr'); return false;" height=20>
		<img id=img_byrdbellvjk title="          byrdbellvjk" src=/imgs/btn/brdb.png onclick="window.open('/byrdbellvjk'); return false;" height=20>
		<img id=img_jtdinc title="          jtfinc" src=/imgs/btn/brdb.png onclick="window.open('/jtfinc'); return false;" height=20>
		<br>
		<h2>views: fb pdf av pn tm tl sl yt zm</h2>
		<img id=img_views_fb1 title="          fb" src=/imgs/btn/brdb.png onclick="window.open('/fb'); return false;" height=20>
		<img id=img_views_pdf1 title="          pdf" src=/imgs/btn/brdb.png onclick="window.open('/pdf'); return false;" height=20>
		<img id=img_views_av1 title="          av" src=/imgs/btn/brdb.png onclick="window.open('/av'); return false;" height=20>
		<img id=img_views_pn1 title="          pn" src=/imgs/btn/brdb.png onclick="window.open('/pn'); return false;" height=20>
		<img id=img_views_tm1 title="          tm" src=/imgs/btn/brdb.png onclick="window.open('/tm'); return false;" height=20>
		<img id=img_views_tl1 title="          tl" src=/imgs/btn/brdb.png onclick="window.open('/tl'); return false;" height=20>
		<img id=img_views_sl1 title="          sl" src=/imgs/btn/brdb.png onclick="window.open('/sl'); return false;" height=20>
		<img id=img_views_yt1 title="          yt" src=/imgs/btn/brdb.png onclick="window.open('/yt'); return false;" height=20>
		<img id=img_views_zm1 title="          zm" src=/imgs/btn/brdb.png onclick="window.open('/zm'); return false;" height=20>
		
		<br>
		<h2>kofe newz neuz</h2>
		<img id=kofe title="          kofe" src=/imgs/btn/brdb.png onclick="window.open('/kofe'); return false;" height=20>
		<img id=newz title="          newz" src=/imgs/btn/brdb.png onclick="window.open('/newz'); return false;" height=20>
		<img id=neuz title="          neuz" src=/imgs/btn/brdb.png onclick="window.open('/neuz'); return false;" height=20>
		<br>
		<img id=turnjs title="          turnjs" src=/imgs/btn/brdb.png onclick="window.open('/js/turnjs/demos'); return false;" height=20>
		<img id=sql title="          sql" src=/imgs/btn/brdb.png onclick="window.open('/js/sql'); return false;" height=20>

		<img id=tablesorter title="          tablesorter" src=/imgs/btn/brdb.png onclick="window.open('/js/tablesorter/tests'); return false;" height=20>

		<img id=ol title="          ol" src=/imgs/btn/brdb.png onclick="window.open('/js/ol/ht'); return false;" height=20>
		<img id=doit title="          doit" src=/imgs/btn/brdb.png onclick="window.open('/js/doit'); return false;" height=20>
		<img id=svc_effectgames title="          svc_effectgames" src=/imgs/btn/brdb.png onclick="window.open('/svc/effectgames'); return false;" height=20>
		<img id=svc_emchat title="          svc_emchat" src=/imgs/btn/brdb.png onclick="window.open('/svc/emchat'); return false;" height=20>
		<img id=svc_grid3 title="          svc_grid3" src=/imgs/btn/brdb.png onclick="window.open('/svc/grid3'); return false;" height=20>
		<img id=svc_jqgrid title="          svc_jqgrid" src=/imgs/btn/brdb.png onclick="window.open('/svc/jqgrid'); return false;" height=20>
		<img id=svc_jsLabel2PDF title="          svc_jsLabel2PDF" src=/imgs/btn/brdb.png onclick="window.open('/svc/jsLabel2PDF'); return false;" height=20>
		<img id=svc_jslibs title="          svc_jslibs" src=/imgs/btn/brdb.png onclick="window.open('/svc/jslibs'); return false;" height=20>
		<img id=svc_jssql title="          svc_jssql" src=/imgs/btn/brdb.png onclick="window.open('/svc/jssql'); return false;" height=20>
	<br>
		<img id=svc_emchat title="          svc_emchat" src=/imgs/btn/brdb.png onclick="window.open('/svc/emchat'); return false;" height=20>
		<img id=srvchat_a title="          srvchat_a" src=/imgs/btn/brdb.png onclick="window.open('/srv/chat/a'); return false;" height=20>
		<img id=srvchat_a title="          srvchat_a_achat" src=/imgs/btn/brdb.png onclick="window.open('/srv/chat/a/achat'); return false;" height=20>
		<img id=srvchat_e title="          srvchat_e" src=/imgs/btn/brdb.png onclick="window.open('/srv/chat/e'); return false;" height=20>
		<img id=srvchat_echat title="          srvchat_e_echat" src=/imgs/btn/brdb.png onclick="window.open('/srv/chat/e/echat'); return false;" height=20>
		<img id=srvchat_f title="          srvchat_f" src=/imgs/btn/brdb.png onclick="window.open('/srv/chat/f'); return false;" height=20>
		<img id=srvchat_j title="          srvchat_j" src=/imgs/btn/brdb.png onclick="window.open('/srv/chat/j'); return false;" height=20>
		<img id=srvchat_j_ajaxhat1 title="          srvchat_j_ajaxhat1" src=/imgs/btn/brdb.png onclick="window.open('/srv/chat/j/ajaxchat1'); return false;" height=20>
		<img id=srvchat_a title="          srvchat_l" src=/imgs/btn/brdb.png onclick="window.open('/srv/chat/l'); return false;" height=20>
		<img id=srvchat_a title="          srvchat_s" src=/imgs/btn/brdb.png onclick="window.open('/srv/chat/s'); return false;" height=20>
		<img id=srvchat_x title="          srvchat_x" src=/imgs/btn/brdb.png onclick="window.open('/srv/chat/x'); return false;" height=20>
		<hr color=white>
		<hr color=black>
		</div id=div_links_end>
	<br>
	<hr color=black>
	<hr color=white>

	<img id=img_kojax src=/imgs/btn/koeye.png onclick="toggle('div_kojax',''); return false;" height=20 border=0>kojax
	<hr color=goldenrod>
	<div id=div_kojax hidden >
		<hr color=black>
		<h3>pre_kojax</h3>
		<hr color=black>
		<hr color=white>
		<h2>ko.php?leds kov contacts</h2>
		<button onclick="kojax('ko.php?leds','','');" >kophp_leds</button>
		<button onclick="kojax('ko.php?kov','','');" >kophp_kov</button>
		<button onclick="kojax('ko.php?contacts','','');" >kophp_contacts</button>
		<h2>ko.php? &fmt=json</h2>
		<button onclick="kojax('ko.php?leds&fmt=json','pre_kojax','');" >kophp_leds_json</button>
		<button onclick="window.open('ko.php?leds&fmt=json');" >php_leds_json</button>
		<button onclick="kojax('ko.php?kov&fmt=json','pre_kojax','');" >kophp_kov_json</button>
		<button onclick="window.open('ko.php?kov&fmt=json');" >php_leds_json</button>
		<button onclick="kojax('ko.php?contacts&fmt=json','pre_kojax','');" >kophp_contacts_json</button>
		<button onclick="window.open('ko.php?contacts&fmt=json');" >php_leds_json</button>
		<h2>ko.php? &fmt=psv</h2>
		<button onclick="kojax('ko.php?leds&fmt=psv','','');" >kophp_leds_psv</button>
		<button onclick="kojax('ko.php?kov&fmt=psv','','');" >kophp_kov_psv</button>
		<button onclick="kojax('ko.php?contacts&fmt=psv','','');" >kophp_contacts_psv</button>


		<br>
		<br>
		<button onclick="kojax('help_items.txt','','');" >items</button>
		<button onclick="kojax('help_contacts.txt','','');" >contacts</button>
		<button onclick="kojax('help_letter.txt','','');" >letter</button>
		<button onclick="kojax('pages/imgs.txt','','');" >pages</button>
		<button onclick="kojax('imgs/imgs.txt','','');" >imgs</button>
		<br>
		<button onclick="kojax('./ko.php?lists=items','','');" >ko.php?lists=items</button>
		<button onclick="kojax('./ko.php?lists=contacts','','');" >ko.php?lists=contacts</button>
		<button onclick="kojax('./ko.php?lists=letter','','');" >ko.php?lists=letter</button>
		<button onclick="kojax('./ko.php?lists=postturtles','','');" >ko.php?lists=postturtles</button>
		<button onclick="kojax('./ko.php?lists=monkeytraps','','');" >ko.php?lists=monkeytraps</button>
		<button onclick="kojax('./ko.php?lists=floods','','');" >ko.php?lists=floods</button>
		<button onclick="kojax('./ko.php?lists=coffee','','');" >ko.php?lists=coffee</button>
		<br>
		<button onclick="kojax('./ko.php?lists=leds&db3=/ko/ko.db3','','');" >ko.php?lists=leds&db3=/ko/ko.db3</button>
		<button onclick="kojax('./ko.php?lists=items&db3=/ko/ko.db3','','');" >ko.php?lists=items&db3=/ko/ko.db3</button>
		<button onclick="kojax('./ko.php?lists=contacts&db3=/ko/ko.db3','','');" >ko.php?lists=contacts&db3=/ko/ko.db3</button>
		<button onclick="kojax('./ko.php?lists=letter&db3=/ko/ko.db3','','');" >ko.php?lists=letter&db3=/ko/ko.db3</button>
		<button onclick="kojax('./ko.php?lists=postturtles&db3=/ko/ko.db3','','');" >ko.php?lists=postturtles&db3=/ko/ko.db3</button>
		<button onclick="kojax('./ko.php?lists=monkeytraps&db3=/ko/ko.db3','','');" >ko.php?lists=monkeytraps&db3=/ko/ko.db3</button>
		<button onclick="kojax('./ko.php?lists=floods&db3=/ko/ko.db3','','');" >ko.php?lists=floods&db3=/ko/ko.db3</button>
		<button onclick="kojax('./ko.php?lists=coffee&db3=/ko/ko.db3','','');" >ko.php?lists=coffee&db3=/ko/ko.db3</button>
		<br>
		<button onclick="kojax('lists_letter.txt','','');" >lists_letter.txt</button>
		<button onclick="kojax('lists_contacts.txt','','');" >lists_contactx.txt</button>
		<button onclick="kojax('lists_items.txt','','');" >lists_items.txt</button>
		<br>
		<button onclick="kojax('lists_postturtles.txt','','');" >lists_postturtles.txt</button>
		<button onclick="kojax('lists_monkeytraps.txt','','');" >lists_monkeytraps.txt</button>
		<button onclick="kojax('lists_floods.txt','','');" >lists_floods.txt</button>
		<button onclick="kojax('lists_coffee.txt','','');" >lists_coffee.txt</button>
		<hr color=white>
		<button onclick="kojax('main.txt','','');" >main.txt</button>
		<button onclick="kojax('main_ka.txt','','');" >main_ka.txt</button>

<hr color=white> 
<button onclick="kojax('main_law.txt','','');" >main_law.txt</button>
<button onclick="kojax('main_jtfdcr.txt','','');" >main_jtfdcr.txt</button>
<button onclick="kojax('main_byrdbellvj.txt','','');" >main_byrdbellvj.txt</button>
<button onclick="kojax('main_jtfinc.txt','','');" >main_jtfinc.txt</button>

<hr color=white>
<button onclick="kojax('main_med.txt','','');" >main_med.txt</button>
<button onclick="kojax('main_jtfdc.txt','','');" >main_jtfdc.txt</button>
<button onclick="kojax('main_konet.txt','','');" >main_konet.txt</button>
<button onclick="kojax('main_iperms.txt','','');" >main_iperms.txt</button>

<hr color=white>
<button onclick="kojax('main_kofe.txt','','');" >main_kofe.txt</button>
<button onclick="kojax('main_neuz.txt','','');" >main_neuz.txt</button>
<button onclick="kojax('main_newz.txt','','');" >main_newz.txt</button>
<hr color=white>
<button onclick="kojax('main_fb.txt','','');" >main_fb.txt</button>
<button onclick="kojax('main_pdf.txt','','');" >main_pdf.txt</button>
<button onclick="kojax('main_go.txt','','');" >main_go.txt</button>
<button onclick="kojax('main_tl.txt','','');" >main_tl.txt</button>
<button onclick="kojax('main_zm.txt','','');" >main_zm.txt</button>

<pre id=pre_kojax></pre id=pre_kojax_end>
<hr color=white>
<button onclick="window.open('/ko.php?todo');" >ko.php?todo</button>
<button onclick="window.open('/ko.php?todo=mp3s');" >ko.php?todo=mp3s</button>
<button onclick="window.open('/ko.php?todo=mp4s');" >ko.php?todo=mp4s</button>
<button onclick="window.open('/ko.php?todo=pdfs');" >ko.php?todo=pdfs</button>
<button onclick="window.open('/ko.php?todo=fbs');" >ko.php?todo=fbs</button>
<button onclick="window.open('/ko.php?todo=yts');" >ko.php?todo=yts</button>
<h3>ko_</h3>
<button onclick="window.open('ko_fb.html');" >ko_fb.html</button>
<button onclick="window.open('ko_form.html');" >ko_form.html</button>
<button onclick="window.open('ko_graphgame.html');" >ko_graphgame.html</button>
<button onclick="window.open('ko_k9.html');" >ko_k9.html</button>
<button onclick="window.open('ko_vi.html');" >ko_vi.html</button>
<button onclick="window.open('ko_tm.html');" >ko_tm.html</button>
<button onclick="window.open('ko_tl.html');" >ko_tl.html</button>
<button onclick="window.open('ko_style.html');" >ko_style.html</button>
<button onclick="window.open('ko_slots.html');" >ko_slots.html</button>
<button onclick="window.open('ko_canvas.html');" >ko_canvas.html</button>
<br>
<hr color=white>
<h3>walter zorn dhtml</h3>
<button onclick="window.open('/js/wz/index.html');" >/js/wz/index.html</button>
<button onclick="window.open('/index_sailboat.html');" >/index_sailboat.html</button>
<button onclick="window.open('/ko_sailboat.html');" >/ko_sailboat.html</button>
<button onclick="window.open('/koblobs.html');" >/koblobs.html</button>
<button onclick="window.open('/index_blob.html');" >/index_blob.html</button>
<button onclick="window.open('/js/wz/wz_anim.html');" >/js/wz/wz_anim.html</button>
<button onclick="window.open('/js/wz/wz_sailboat.html');" >/js/wz/wz_sailboat.html</button>
<button onclick="window.open('/js/wz/wz_blob.html');" >/js/wz/wz_blob.html</button>
&nbsp &nbsp





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

		<div id=div_jax> <h1>div_jax</h1> </div id=div_jax_end>
		</div id=div_kojax_end>

	<br>
	<hr color=goldenrod>

	<img id=img_files src=/imgs/btn/koeye.png onclick="toggle('div_files',''); return false;" height=20 border=0>files
	<hr color=goldenrod>
	<div id=div_files hidden>
		<hr color=white>
		<a href=./plupload.html target=_blank>
			<img id=img_plupload title="          plupload" src=/imgs/btn/btn_plupload.png
>
			</a>
		<br>
		<hr color=white>
		<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="darkSlategrey" color="ivory">
					WARN_1387 unauthorized access has been logged
					</canvas>
				</div id=div_canvas_end>
			</div id=dropzone_end>

		<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>
	<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 id=div_files2_end>

<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>

	<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="darkSlategrey" 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"><h3>div_csv 300</h3></div>
	
	<script id="script_upload"  type="text/javascript">
//		function upload_csv() {
		function Upload() {
//			var files = evt.dataTransfer.files; // FileList object.
//			var fileUpload = document.getElementById("upload_files");
			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 (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]);
					file_csv=fileUpload.files[0];
					file_csvlen = fileUpload.files.length;
					alert( "BUGS_4390 CSV file_csvlen="+file_csvlen+" file_csv="+file_csv );
					load_file_csv(file_csv);
					} 
				else {
					alert("csv2tbl warn:  unauthorized access noted");
					}
				} 
			else {
				alert("csv2tbl fail:  unsuppoted format");
				}
			}
		</script>

	<script id="script_load_file_csv">
		function load_file_csv(file_csv) {
			alert( "BUGS_4400 load_file_csv file_csv="+file_csv" );
			file_psv=file_csv;
			return(file_psv);
			}
		</script>

	<label class="fileContainer">
		files.csv.psv.txt
		<input id="fileUpload" type="file"></input>
		</label>

	&nbsp &nbsp &nbsp
	<label class="fileContainer">
		parse.csv.psv.txt
		<input id="upload" value="Upload" onclick="Upload()" type="button"></input>
		</label>



	<div id="csv2tbl"><h3>csv2tbl MSG_367</h3></div>



		<script id=script_files type="text/javascript">
			$(function() {
// grab the file input and bind a change event onto it
				$('#file').bind("change", function() {
// new html5 formdata object.
					var formData = new FormData();
// for each entry, add to formdata to later access via $_FILES["file" + i]
					for (var i = 0, len = document.getElementById('file').files.length; i < len; i++) {
						formData.append("file" + i, document.getElementById('file').files[i]);
						}
 
//send formdata to server-side
					$.ajax({
//						url: "file-upload.php", // our php file
//						url: "ka1_fileupload.php", // our php file
//						nurl: "http://ka1/ka1.php?q=up", // our php file
//						url: "/kup.php", // our php file
//						url: "/ka1_up.php", // our php file
//						url: "/ka1.php?q=kup", // our php file
//						url: "/ko0.php?q=kup", // our php file
//						url: "/ko1.php?q=kup", // our php file
						url: "/ko.php?todo=mp3s", // our php file
// bugs						url: "10.0.0.112:/ka1.php?q=up", // our php file
						type: 'post',
						data: formData,
						dataType: 'html', // we return html from our php file
						async: true,
						processData: false,  // tell jQuery not to process the data
						contentType: false,   // tell jQuery not to set contentType
						success : function(data) {
							$('#upload-result').append('<div class="alert alert-success"><p>File(s) uploaded successfully!</p><br />');
							$('#upload-result .alert').append(data);
							},
						error : function(request) {
							console.log(request.responseText);
							}
						});
					});
				});
			</script id=script_files_end>




	<hr color=white>
	<hr color=black>
	<div id='editableDiv' contenteditable='true'>paste</div>
	<hr color=black>
	<hr color=white>
	<hr color=black>
	<div id='div' contenteditable='true'>ffpaste</div>
	<hr color=black>
	<hr color=white>

	<script id="script_clipboard" >
		function handlePaste (e) {
			var clipboardData, pastedData;

// Stop data actually being pasted into div
			e.stopPropagation();
			e.preventDefault();

// Get pasted data via clipboard API
			clipboardData = e.clipboardData || window.clipboardData;
			pastedData = clipboardData.getData('Text');

// Do whatever with pasteddata
			alert(pastedData);
			}

		document.getElementById('editableDiv').addEventListener('paste', handlePaste);
		</script>


	<script id="script_clipboard_ff" >
		function handlepaste_ff (e) {
			var types, pastedData, savedContent;

// Browsers that support the 'text/html' type in the Clipboard API (Chrome, Firefox 22+)
			if (e && e.clipboardData && e.clipboardData.types && e.clipboardData.getData) {

// Check for 'text/html' in types list. See abligh's answer below for deatils on
// why the DOMStringList bit is needed. We cannot fall back to 'text/plain' as
// Safari/Edge don't advertise HTML data even if it is available
				types = e.clipboardData.types;
				if (((types instanceof DOMStringList) && types.contains("text/html")) || (types.indexOf && types.indexOf('text/html') !== -1)) {

// Extract data and pass it to callback
					pastedData = e.clipboardData.getData('text/html');
//					processPaste(editableDiv, pastedData);
					processPaste_ff(editableDiv, pastedData);

// Stop the data from actually being pasted
					e.stopPropagation();
					e.preventDefault();
					return false;
					}
				}

// Everything else: Move existing element contents to a DocumentFragment for safekeeping
			savedContent = document.createDocumentFragment();
			while(editableDiv.childNodes.length > 0) {
				savedContent.appendChild(editableDiv.childNodes[0]);
				}

// Then wait for browser to paste content into it and cleanup
			waitForPastedData(editableDiv, savedContent);
			return true;
			}

		function waitForPastedData (elem, savedContent) {

// If data has been processes by browser, process it
			if (elem.childNodes && elem.childNodes.length > 0) {

// Retrieve pasted content via innerHTML
// (Alternatively loop through elem.childNodes or elem.getElementsByTagName here)
				var pastedData = elem.innerHTML;

// Restore saved content
				elem.innerHTML = "";
				elem.appendChild(savedContent);

// Call callback
				processPaste_ff(elem, pastedData);
				}

// Else wait 20ms and try again
			else {
				setTimeout(function () {
					waitForPastedData(elem, savedContent)
					}, 20);
				}
			}

		function processPaste_ff (elem, pastedData) {
// Do whatever with gathered data;
			alert(pastedData);
			elem.focus();
			}

// Modern browsers. Note: 3rd argument is required for Firefox <= 6
		if (editableDiv.addEventListener) {
			editableDiv.addEventListener('paste', handlepaste, false);
			}
// IE <= 8
		else {
			editableDiv.attachEvent('onpaste', handlepaste);
			}

		$(document).on('paste','[contenteditable]',function(e) {
			e.preventDefault();
			var text = (e.originalEvent || e).clipboardData.getData('text/plain');
			window.document.execCommand('insertText', false, text);
			});
		</script>

	<script id="script_clipboard_jskit" >
		function getSelectionText(){
			var selectedText = ""
			if (window.getSelection){ // all modern browsers and IE9+
				selectedText = window.getSelection().toString()
				}
			return selectedText
			}


		document.addEventListener('mouseup', function(){
			var thetext = getSelectionText()
			if (thetext.length > 0){ // check there's some text selected
				console.log(thetext) // logs whatever textual content the user has selected on the page
				}
			}, false)

		function copySelectionText(){
			var copysuccess // var to check whether execCommand successfully executed
			try{
				copysuccess = document.execCommand("copy") // run command to copy selected text to clipboard
    				} 
			catch(e){
				copysuccess = false
				}
			return copysuccess
			}

		</script id=script_ffpaste_end>
		</div id=div_files>

	<script id="script_parse_ext">
		function parse_ext(path) {
			var filename = path.split('\\').pop().split('/').pop();
			var lastIndex = filename.lastIndexOf(".");
			if (lastIndex < 1) return "";
			return filename.substr(lastIndex + 1);
			}
		function getFilePathExtension(path) {
			var filename = path.split('\\').pop().split('/').pop();
			return filename.substr(( Math.max(0, filename.lastIndexOf(".")) || Infinity) + 1);
			}
		</script id=script_parse_ext_end>


	<script id="script_parse">
		var jklists = new Array();
		var jkid="";
		function parse(args) {
//			alert( "BUGS_20 parse args="+args);
			var parser = document.createElement('a');
//			parser.href = "/";
//			parser.href = "http://example.com:3000/pathname/?search=test#hash";
			parser.href=document.location;
			
//			parser.protocol; // => "http:"
//			parser.hostname; // => "example.com"
//			parser.port;     // => "3000"
//			parser.pathname; // => "/pathname/"
//			parser.search;   // => "?search=test"
//			parser.hash;     // => "#hash"
//			parser.host;     // => "example.com:3000"

			protocol=parser.protocol; // => "http:"
			hostname=parser.hostname; // => "example.com"
			port=parser.port;     // => "3000"
			pathname=parser.pathname; // => "/pathname/"
			search=parser.search;   // => "?search=test"
			hash=parser.hash;     // => "#hash"
			host=parser.host;     // => "example.com:3000"

			htmout += "<br>\n";
			htmout += "<hr color=black>\n";
			htmout += "<hr color=white>\n";
			htmout += "protocol="+protocol+"<br>\n"
			htmout += "hostname="+hostname+"<br>\n"
			htmout += "port="+port+"<br>\n"
			htmout += "pathname="+pathname+"<br>\n"
			htmout += "search="+search+"<br>\n"
			htmout += "hash="+hash+"<br>\n"
			htmout += "host="+host+"<br>\n"
			if ( document.getElementById('div_parsed')) {
				document.getElementById('div_parsed').innerHTML=htmout;
				}
//			alert( "BUGS_60 parser htmout="+htmout );
			psvrec=protocol+"|"+hostname+"|"+port+"|"+pathname+"|"+search+"|"+hash+"|"+host+"|"+dttm+"|";
			return(psvrec);
//			return(htmout);



//			if( parser.search != "" ) {
//				var jkid = parser.search.split("=")[1];
//				var jklist = new Array();
//				jklist = jkload(jkid);
//				var htmout = "";
//				for( j=0; j< jklist.length; j++ ) {
//					if( jklist[j] == "" ) { continue; }
//					if( jklist[j] == "#" ) { continue; }
//					htmout += jklist[j]+"<br>\n";
//					}
//				document.write( htmout );
//				return;
//				}

//			var str = "jkwii is me"
			var regx = /is/g;
			var result = regx.test(str);
//			alert( "BUGS_80 str="+str+" regx="+regx+" result="+result );
			id=geturlparameter('id');
			}
		</script id=script_parse_end>


       <script id="script_geturlvars" >
//              var number = geturlvars()["x"];
//              var mytext = geturlvars()["text"];
//              var mytext = geturlparam('text','Empty');
                function geturlvars() {
                        var vars = {};
                        var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
                                vars[key] = value;
                                });
                        return vars;
                        }
		</script id=script_geturlvars_end>

               <script id=script_geturlparam >
                        function geturlparam(parameter, defaultvalue){
                                var urlparameter = defaultvalue;
                                if(window.location.href.indexOf(parameter) > -1) {
                                        urlparameter = getUrlVars()[parameter];
                                        }
                                return urlparameter;
                                }
//                      var mytext = getUrlParam('text','Empty');
                        </script id=script_geturlparam_end>

        <script id=script_keypress >
                function keypress(e) {
// Ensure event is not null
                        e = e || window.event;
                        if ((e.which == 90 || e.keyCode == 90) && e.ctrlKey) {alert( "MSG_090 keypress  ctrl-z" );
                                return('ctrl-z');
                                }
                        if ((e.which == 89 || e.keyCode == 89) && e.ctrlKey) {alert( "MSG_089 keypress  ctrl-y" );
                                return('ctrl-y');
                                }
                        if ((e.which == 54 || e.keyCode == 54) && e.ctrlKey) {
                                alert( "MSG_054 keypress  ctrl-hat" );
                                return('ctrl-hat');
                                }
                        if ((e.which == 54 || e.keyCode == 54) && e.shiftKey) {
                                alert( "MSG_054 keypress  shift-hat" );
                                return('shift-hat');
                                }
                        if ((e.which == 60 || e.keyCode == 60) && e.shiftKey) {
                                alert( "MSG_090 keypress dollar shift-4" );
                                }

// case 59: alert( "MSG_191 colon keycode="+keyCode ); break;
// case 54: alert( "MSG_54 hat keycode="+keyCode ); break;
// case 52: alert( "MSG_191 dollar keycode="+keyCode ); break;
// case 107: alert( "MSG_107 plus keycode="+keyCode ); break;
// case 109: alert( "MSG_109 minus keycode="+keyCode ); break;
                        }
        	</script id=script_keypress >

        <script id="script_trigger" >
// A handler called preventDefault.
// None of the handlers called preventDefault.

                function trigger_mouse(args) {
                        alert( "BUGS_901 trigger _mouse args="+args );
                        var event = new MouseEvent('click', {
                                view: window,
                                bubbles: true,
                                cancelable: true
                                });

                        if(document.getElementById('checkbox')) {
                                var cb = document.getElementById('checkbox');
                                var cancelled = !cb.dispatchEvent(event);
                                if (cancelled) {alert("cancelled");}
                                else {alert("not cancelled");}
                                }
                        }
                </script>
	<script id="script_replace_key" type="text/javascript">
                function replace(e) {
                        if (e.keyCode==13) e.keyCode=9
                        }
                </script>

	<script id="script_geturlparameter" >
                function geturlparameter(name) {
//			alert( "BUGS_170 geturlparameter name="+name );
                        return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search) || [null, ''])[1].replace(/\+/g, '%20')) || null;
                        }
		</script id=script_geturlparameter_end >


		</script id=script_geturlparameter_end>





	<script id=script_startup_parse>
		function startup_parse(args) {
			htmout=""; j=0; k=0;
			parsed=parse('');	
			a=""; a1=""; a2=""; cmd=""; cmd1=""; cmd2="";
			id="", file=""; dir=""; 
			if( geturlparameter('a')) { a=geturlparameter('a'); }
			if( geturlparameter('a1')) { a=geturlparameter('a1'); }
			if( geturlparameter('a2')) { a=geturlparameter('a2'); }
			if( geturlparameter('cmd')) { a=geturlparameter('cmd'); }
			if( geturlparameter('cmd1')) { a=geturlparameter('cmd1'); }
			if( geturlparameter('cmd2')) { a=geturlparameter('cmd2'); }
			if( geturlparameter('id')) { a=geturlparameter('id'); }
			if( geturlparameter('file')) { a=geturlparameter('file'); }
			if( geturlparameter('dir')) { a=geturlparameter('dir'); }

			htmout += "<hr color=goldenrod>";
//			if( a != "" ) 
			htmout += "a="+a+"<br>\n"; 
//			if( a1 != "" ) 
			htmout += "a1="+a1+"<br>\n"; 
//			if( a2 != "" ) 
			htmout += "a2="+a2+"<br>\n"; 
//			if( cmd != "" ) 
			htmout += "cmd="+cmd+"<br>\n"; 
//			if( cmd1 != "" ) 
			htmout += "cmd1="+cmd1+"<br>\n"; 
//			if( cmd2 != "" ) 
			htmout += "cmd2="+cmd2+"<br>\n"; 
//			if( id != "" ) 
			htmout += "id="+id+"<br>\n"; 
//			if( file != "" ) 
			htmout += "file="+file+"<br>\n"; 
//			if( dir != "" ) 
			htmout += "dir="+dir+"<br>\n"; 
			htmout += "<hr color=goldenrod>";

			if( document.getElementById('div_parsed')) {
//				document.getElementById('div_parsed').insertAdjacentHTML('afterend',htmout);
				document.getElementById('div_parsed').insertAdjacentHTML('afterbegin',htmout);
//				document.getElementById('div_parsed').insertAdjacentHTML('beforeend',htmout);
//				document.getElementById('div_parsed').insertAdjacentHTML('beforebegin',htmout);

				document.getElementById('div_parsed').innerHTML=htmout;
				}
//			alert( "BUGS_9020 STARTUP parsed="+parsed+" args="+args );
			return("");
			}
		</script id=script_startup_parse_end>


	<hr color=black>
	<hr color=white>
	<img id=img_parse src=/imgs/btn/koeye.png onclick="toggle('div_parse','');return false;" height=20 border=0>parse
	<div id=div_parse hidden>
		<h1>ko_parse</h1>
		<a href=./help.html?cmd target=_blank><img src=/imgs/btn/kobrd.png height=20 title=./help.html?cmd ></a>
		<a href=./help.html?cmd1 target=_blank><img src=/imgs/btn/kobrd.png height=20 title=./help.html?cmd1></a>
		<a href=./help.html?cmd2 target=_blank><img src=/imgs/btn/kobrd.png height=20 title=./help.html?cmd2></a>
		<br>
		<a href=./help.html?q=q target=_blank><img src=/imgs/btn/kobrd.png height=20 title=helhelp.html?q=q></a>
		<a href=./help.html?q=q1 target=_blank><img src=/imgs/btn/kobrd.png height=20 title=help.html?q=q1></a>
		<a href=./help.html?q=q1&a=arg&a1=arg1&a2=arg2&a3=arg3 target=_blank><img src=/imgs/btn/kobrd.png height=20 title=help.html?q=q1&a=arg></a>
		<br>
		<br>
		<a href=./help.html?cmd&a=arg&a1=arg1 target=_blank><img src=/imgs/btn/kobrd.png height=20 title=help.html?cmd&a=arg&a1=arg1></a>
		<a href=./help.html?cmd1&a=arg&a1=arg1 target=_blank><img src=/imgs/btn/kobrd.png height=20 title=help.html?cmd1&a=arg&a1=arg1></a>
		<a href=./help.html?cmd2&a=arg&a1=arg1 target=_blank><img src=/imgs/btn/kobrd.png height=20 title=help.html?cmd2&a=arg&a1=arg1></a>
		<br>
		<a href=./help.html?q=q&a=arg&a1=arg1&a2=arg2 target=_blank><img src=/imgs/btn/kobrd.png height=20 title=q=q&a=arg&a1=arg1&a2=arg2></a>
		<a href=./help.html?q=q1&arg target=_blank><img src=/imgs/btn/kobrd.png height=20 title=q=q&a=arg&a1=arg1&a2=arg2></a>
		<a href=./help.html?q=q2&arg target=_blank><img src=/imgs/btn/kobrd.png height=20 title=q=q2&arg></a>

		<hr color=goldenrod>
		<div id=div_parsed >	
			<h2>div_parsed</h2>
			</div id=div_parsed_end>	
		</div id=div_parse>
	<br>
	<hr color=black>

	<img id=img_cfg title="          cfg" src=/imgs/btn/koeye.png onclick="toggle('div_cfg',''); return false;" height=20 border=0>cfg
	<hr color=white>
	<div id=div_cfg hidden >
		<h1>div_cfg</h1>

<!--
<img id=img_head title="          head" src=/imgs/btn/brdb.png onclick="head('click'); return false;" height=20 border=0>head
<img id=img_banner title="          banner" src=/imgs/btn/brdb.png onclick="banner('click'); return false;" height=20 border=0>banner
&nbsp &nbsp &nbsp &nbsp

<img id=img_startup title="          startup" src=/imgs/btn/brdb.png onclick="startup('click'); return false;" height=20 border=0>startup
<img id=img_startup1 title="          startup1" src=/imgs/btn/brdb.png onclick="startup1('click'); return false;" height=20 border=0>startup1
<img id=img_startup2 title="          startup2" src=/imgs/btn/brdb.png onclick="startup2('click'); return false;" height=20 border=0>startup2
<img id=img_startup3 title="          startup3" src=/imgs/btn/brdb.png onclick="startup3('click'); return false;" height=20 border=0>startup3
&nbsp &nbsp &nbsp &nbsp
<img id=img_tail title="          tail" src=/imgs/btn/brdb.png onclick="tail('click'); return false;" height=20 border=0>tail
<br>
<img id=img_letter title="          letter" src=/imgs/btn/brdb.png onclick="letter('click'); return false;" height=20 border=0>letter
<img id=img_contacts title="          contacts" src=/imgs/btn/brdb.png onclick="contacts('click'); return false;" height=20 border=0>contacts
<img id=img_items title="          items" src=/imgs/btn/brdb.png onclick="items('click'); return false;" height=20 border=0>items

	-->


		<hr color=black>
		<hr color=white>
		<img id=img_font title="          font" src=/imgs/btn/koeye.png onclick="toggle('div_font',''); return false;" height=20 border=0>font
		<hr color=white>
		<div id=div_font hidden >
			<h1>div_cfg</h1>
			ABCDEFGHIJKLMNOPQRSTUVWXYZ
			<br>
			01234567890
			<br>
			abcdefghijklmnopqrstuvwxyz
			</div id=div_font_end >


		<img id=img_cfg_font title="          cfg_font" src=/imgs/btn/koeye.png onclick="toggle('div_cfg_font',''); return false;" height=20 border=0>cfg_font
		<div id=div_cfg_font>
			<h1>div_cfg_fong</h1>
	                <select onchange="set_font(this);" size="13">
                        <option>yokkmokkOT</option>
	                        <option>PAPYRUS</option>
	                        <option>Papyrus</option>
	                        <option>papyrus</option>
	                        <option>montserrat</option>
	                        <option>Georgia</option>
	                        <option>Palatino Linotype</option>
	                        <option>Book Antiqua</option>
	                        <option>Times New Roman</option>
	                        <option>Arial</option>
	                        <option>Helvetica</option>
	                        <option>Arial Black</option>
	                        <option>Impact</option>
	                        <option>Lucida Sans Unicode</option>
	                        <option>Tahoma</option>
	                        <option>Verdana</option>
	                        <option>Courier New</option>
	                        <option>Lucida Console</option>
	                        </select>
	                </div id=div_cfg_font_end>


		<hr color=white>
		<hr color=black>
			<img id=img_qsall title="          qsall" src=/imgs/btn/koeyeb.png onclick="toggle('div_qsall',''); return false;" height=15 border=0>qsall
			<br>
			<hr color=white>
			<div id=div_qsall hidden>
				<h1>div_qsall</h1>
			<img id=img_qsall_div title="          leds" src=/imgs/btn/kobrd.png onclick="qsall('div'); return false;" height=15 border=0>qsall_div_go
			<br>
			<img id=img_qsall_script title="          leds" src=/imgs/btn/kobrd.png onclick="qsall('script'); return false;" height=15 border=0>qsall_script_go
			<br>
			<img id=img_qsall_img title="          leds" src=/imgs/btn/kobrd.png onclick="qsall('img'); return false;" height=15 border=0>qsall_img_go
			<br>
				<hr color=white>
				<div id=div_qsall_out> </div id=div_qsall_out_end>
				<hr color=white>
				</div id=div_qsall_end>
					<script id=script_qsall>
		                function qsall(args) {
		                        qsmatch=args;
		                        if( qsmatch == "" ) { qsmatch="div"; }
		                        if( qsmatch == "" ) { qsmatch="img"; }
		                        if( qsmatch == "" ) { qsmatch="script"; }
//					alert( "BUGS_1010 qsall qsmatch="+qsmatch );
		                        htmout=""; j=0; k=0;
//					var arrFiltered = document.querySelectorAll('input[value=F2][type=submit][class=c1]');
//					arrFiltered.forEach(function (el) {
		                        qss=document.querySelectorAll(qsmatch);
//					qss.forEach( item => {
//						item.style = "background-color: yellow";
//						item.style = "font-size: 24";
//						}
		
//					qss.forEach(function (el) {
//						var node = document.createElement("p");
//						node.innerHTML = el.getAttribute('id');
//						node.id = el.getAttribute('id');
//						window.document.body.appendChild(node);
//						});
//

//     		                 alert( "BUGS_1011 qsall qss.length="+qss.length );
				htmout+="<div id=div_"+qsmatch+">\n";
				htmout+="       <table id=table_"+qsmatch+">\n";
				htmout+="               <tr><td>num</td><td>match</td></tr>\n";
				for( j=0; j< qss.length; j++ ) {
//                              qs=qss[j].innerHTML;
                                qs=qss[j].id;
//                              alert( "BUGS_1020 qsall j="+j+" qs="+qs );
                                htmout+="               <tr><td>"+j+"</td><td>"+qs+"</td></tr>\n";
                                if( qs == "pre_item2href" ) { htmout+=qss[j].innerHTML; }
//				if( qs == "" ) { htmout+=qss[j].innerHTML; }
                                }

                        htmout+="               </table id=table_"+qsmatch+">\n";
                        htmout+="       </div id=div_"+qsmatch+">\n";
                        if( document.getElementById("div_qsall_out")) {
                                document.getElementById("div_qsall_out").innerHTML=htmout;
                                }
			return(htmout);
			}
		</script id=script_qssall_end>





		</div id=div_cfg_end>
	
        <script id=script_set_font>
                function set_font(selectTag) {
			divid="div_font";
//			alert( "BUGS_701 set_font selectTag="+selectTag+" divid="+divid );
                        var listValue = selectTag.options[selectTag.selectedIndex].text;
//                      document.getElementById("div_fonts").style.fontFamily = listValue;
			if ( document.getElementById(divid)) {
//				alert( "BUGS_702 FOUND set_font selectTag="+selectTag+" divid="+divid );
                        	document.getElementById(divid).style.fontFamily = listValue;
				}
			else {
				alert( "BUGS_703 ___FOUND set_font selectTag="+selectTag+" divid="+divid );
				}
                        }
                </script id=script_set_font_end>


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

	<img id=img_kludge title="          kludge" src=/imgs/btn/koeye.png onclick="toggle('div_kludge',''); return false;" height=20 border=0>kludge
	<div id=div_kludge>
		<h1>div_kludge</h1>
		</div id=div_kludge_end>
	<br>
	<hr color=black>

	<img id=img_lists title="          lists" src=/imgs/btn/koeye.png onclick="toggle('div_lists',''); return false;" height=20 border=0>lists
	<br>
	<hr color=white>
	<div id=div_lists hidden>
		<h2>div_lists</h2>


		<img id=img_lists_letter title="          lists_letter" src=/imgs/btn/koeyeb.png onclick="toggle('div_lists_letter',''); return false;" height=15 border=0>lists_letter
		<div id=div_lists_letter hidden>
			<h3>div_lists_letter</h3>
			<pre id=pre_lists_letter_end>
letter_body=`
we need time

- new grandaughter born 20230227 is in ICU with oxigen problems
- doctor requested medical tests for me
- internet cable problems too

can you reschedule/dismiss out Feb 9 summons court date?
ko2.us/law

- jtfdc_20190516_0880_policereport.pdf (summons and police report)
- jtfdc_20190516_1700_sk_protect.pdf (wifes order of protection from G. Byrd)
- videos of my police calls for help and the police tazor response


the case is about a 20190516 alleged "chestbump" assault against
Gary Byrd and a "door" assault against a "special person" (stlc police)

the allegation are unsupported by the actual
videos of my police calls for help, police tazor response and Mr Byrds pattern and practice
of threats, bullying and trespass over the last 10 years.

our situation is really all about a 10 year dispute over
big dogs, property and safety of small children

We have been targeted by
Ms Joan Donovan Family Law and her a handful of recruited client neighbors
attempts to force us from our home in a private 3 house court .

Ms Donovans legal strategy involving
false police reports, endless legal fees, 
thier 9 freeroaming big dogs and redirected traffic thru our driveway,
has disrupted our lives and business for 10 year.

all documentation, summons, police report, sk order of protection from G. Byrd,
videos, maps, photos are available somewhere online at:

ko2.us/law

Due to the scope and volume of the documentation
the site is evolving into a general
knowledgebase/case managment system portal
that could eventually include aggregated local law news.

you are invited to explore and imagine the potential of this work in progress.

If you are unable to help us,
can you provide a referal for someone to simply 
reschedule/dismiss the Feb 9 court date.

thank you again for your time and consideration

jsk
ko2.us/law
`;
				</pre id=pre_lists_letter_end>
			</div id=div_lists_letter_end>

		<img id=img_lists_contacts title="          lists_contacts" src=/imgs/btn/koeye.png onclick="toggle('div_lists_contacts',''); return false;" height=15 border=0>lists_contacts
		<div id=div_lists_contacts hidden>
			<pre id=pre_lists_contacts_end>
id|name|phn|firm|url|email|note|action
jak3|jenna|314-123-456|konet|konet.org|admin@konet.org|note|action
huschblackwell|gregoroy r smith|314-480-1720|huschblack|huschblackwell.com|gregory.smith@huschblackwell.com|note|action
smithj|melvin j smith|314-726-2141|melvinjsmith|www.melvinjsmithlaw.com|@melvinjsmithlaw.com|note|action
smithr|rudman smith|phn|rudmansmith|www.rudmansmithlaw.com|@rudmansmithlaw.com|note|action
fleddermann|fleddermann|636-947-4343|fleddermann|www.fleddermannlawoffice.com|fleddermann@.fleddermannlawoffice.com|note|action
smithmeuler|smith meuler|314-266-6515|smithmeuller|smithmeuller.com|mgoodman@smithmeuller.com|note|action
goldenhersh|ben goldenhershlaw|314-707-7789|goldenhersh|http://goldenhershlaw.com|ben@goldenhershlaw.com|personal injury|action
<br>|<br>|phn|url|email|note|action
tc|thompson coburn|314-552-6000|thompsoncoburn|thompsoncoburn.com|email|note|action
archcity|archcitydefenders|855-724-2489|archcitydefenders|www.archcitydefenders.org|mail@archcitydefenters.org|savannah downs|action
bb|brown brown|314-333-333|brown|brownlawoffice.com|@brownlawoffice.com|note|action
bc|brown crouppen|314-501-9510|brownandcrouppen|https://www.brownandcrouppen.com/st-louis/|https://www.brownandcrouppen.com/st-louis/|note|action
<br>|
<br>|<br>|phn|url|email|note|action
<br>|<hr>|phn|url|email|note|action
keyhlig|alexander keuhlig|314-726-6868|rosenblumgoldenhersh|rosenblumgoldenhersh.com|@rosenblumgoldenhersh.com|note|20160826
walters|alan p walters|314-227-1943|url|email|note|action
donovan|joann c donovan|314-921-6600|donovan|lawdonovan.com|jdonovan@lawdonovan.com|note|action
cohena|alan cohen|314-|firm|url|email|retired|action
cohenn|nathan cohen|314-|firm|url|email|note|action
luber|greg luber|636-947-1122|501law|https://501law.com|email|debtlaw|action|
elster|henry elster|314-|elster|https://elsterlaw.com|email|note|action|
diemer|dan diemer|314-863-8833|diemer|https://diemerlawfirm.com/|email|note|action|
whitner|joe whitner|314-354-8484|https://rsblawfirm.com|email|note|action|
<br>|todo|phn|url|email|note|action||
mccloskey|mccloskey|314-721-4000|mccloskey|https://www.mccloskeylaw.com/|email|note|action|
woolf|richard woolf|314-345-5030|bakersterchi|https://bakersterchi.com|rwoolf@bakersterchi.com|email|note|action|
dolley|keven dolley|314-293-4884|dolley|https://www.missouriemploymentlawattorney.com|email|note|action|
sindel|richard sindel|314-721-6040|sindel|https://sindellaw.com|email|note|action|
id|evelyn lewis|314-721-6040|evelynlewis|https://evelynlewislawllc.com|email|note|action|
				</pre id=pre_lists_contacts_end>
			</div id=div_lists_contacts_end>

		<img id=img_lists_items title="          lists_items" src=/imgs/btn/koeye.png onclick="toggle('div_lists_items',''); return false;" height=15 border=0>lists_items
		<div id=div_lists_items hidden>
			<pre id=pre_lists_items>
/imgs/btn/koeye_handhither.gif|koeye_handhither
/byrdbellvjk/imgs/01.jpg|/imgs/01
/byrdbellvjk/imgs/100.jpg|/imgs/100
/byrdbellvjk/imgs/100_jtfdcr_2013_byrd_threat.jpg|/imgs/100_jtfdcr_2013_byrd_threat
/byrdbellvjk/imgs/100_jtfdcr_byrd_seigrist_2dogs_trespas.jpg|/imgs/100_jtfdcr_byrd_seigrist_2dogs_trespas
/byrdbellvjk/imgs/100_jtfdcr_byrd_seigrist_2dogs_trespass2.jpg|/imgs/100_jtfdcr_byrd_seigrist_2dogs_trespass2
/byrdbellvjk/imgs/100_jtfdcr_byrd_seigrist_3dogs_after_heartrequest.jpg|/imgs/100_jtfdcr_byrd_seigrist_3dogs_after_heartrequest
/byrdbellvjk/imgs/100_jtfdcr_byrds_theft_sawhorse.jpg|/imgs/100_jtfdcr_byrds_theft_sawhorse
/byrdbellvjk/imgs/100_zn_16.jpg|/imgs/100_zn_16
/byrdbellvjk/imgs/100_zn_21.jpg|/imgs/100_zn_21
/byrdbellvjk/imgs/113.jpg|/imgs/113
/byrdbellvjk/imgs/115.jpg|/imgs/115
/byrdbellvjk/imgs/116.jpg|/imgs/116
/byrdbellvjk/imgs/124.jpg|/imgs/124
/byrdbellvjk/imgs/170.jpg|/imgs/170
/byrdbellvjk/imgs/171.jpg|/imgs/171
/byrdbellvjk/imgs/202.jpg|/imgs/202
/byrdbellvjk/imgs/203.jpg|/imgs/203
/byrdbellvjk/imgs/204.jpg|/imgs/204
/byrdbellvjk/imgs/205.jpg|/imgs/205
/byrdbellvjk/imgs/206.jpg|/imgs/206
/byrdbellvjk/imgs/207.jpg|/imgs/207
/byrdbellvjk/imgs/208.jpg|/imgs/208
/byrdbellvjk/imgs/209.jpg|/imgs/209
/byrdbellvjk/imgs/210.jpg|/imgs/210
/byrdbellvjk/imgs/211.jpg|/imgs/211
/byrdbellvjk/imgs/212.jpg|/imgs/212
/byrdbellvjk/imgs/22.jpg|/imgs/22
/byrdbellvjk/imgs/222.jpg|/imgs/222
/byrdbellvjk/imgs/229.jpg|/imgs/229
/byrdbellvjk/imgs/232.jpg|/imgs/232
/byrdbellvjk/imgs/233.jpg|/imgs/233
/byrdbellvjk/imgs/26.jpg|/imgs/26
/byrdbellvjk/imgs/27.jpg|/imgs/27
/byrdbellvjk/imgs/28.jpg|/imgs/28
/byrdbellvjk/imgs/29.jpg|/imgs/29
/byrdbellvjk/imgs/30.jpg|/imgs/30
/byrdbellvjk/imgs/31.jpg|/imgs/31
/byrdbellvjk/imgs/32.jpg|/imgs/32
/byrdbellvjk/imgs/33.jpg|/imgs/33
/byrdbellvjk/imgs/34.jpg|/imgs/34
/byrdbellvjk/imgs/36.jpg|/imgs/36
/byrdbellvjk/imgs/42.jpg|/imgs/42
/byrdbellvjk/imgs/43.jpg|/imgs/43
/byrdbellvjk/imgs/44.jpg|/imgs/44
/byrdbellvjk/imgs/46.jpg|/imgs/46
/byrdbellvjk/imgs/550_head_jtfdcr_police_neiborhood.jpg|/imgs/550_head_jtfdcr_police_neiborhood
/byrdbellvjk/imgs/63.jpg|/imgs/63
/byrdbellvjk/imgs/66.jpg|/imgs/66
/byrdbellvjk/imgs/71.jpg|/imgs/71
/byrdbellvjk/imgs/900_136.jpg|/imgs/900_136
/byrdbellvjk/imgs/900_68.jpg|/imgs/900_68
/byrdbellvjk/imgs/900_byrdbell_20200916.jpg|/imgs/900_byrdbell_20200916
/byrdbellvjk/imgs/900_byrdbell_20200916_1.jpg|/imgs/900_byrdbell_20200916_1
/byrdbellvjk/imgs/900_emh_20160911_056.jpg|/imgs/900_emh_20160911_056
/byrdbellvjk/imgs/900_emh_20160911_058.jpg|/imgs/900_emh_20160911_058
/byrdbellvjk/imgs/900_emh_20160911_059.jpg|/imgs/900_emh_20160911_059
/byrdbellvjk/imgs/900_IMG_0574.jpg|/imgs/900_IMG_0574
/byrdbellvjk/imgs/900_IMG_0577.jpg|/imgs/900_IMG_0577
/byrdbellvjk/imgs/900_jtfdc_private_court_since_1979_viewin.jpg|/imgs/900_jtfdc_private_court_since_1979_viewin
/byrdbellvjk/imgs/900_jtfinc.jpg|/imgs/900_jtfinc
/byrdbellvjk/imgs/900_snap_20170123_187559_jtfdc_kids_cycle_laps.jpg|/imgs/900_snap_20170123_187559_jtfdc_kids_cycle_laps
/byrdbellvjk/imgs/900_snap_20170123_187576_jtf32_preservation_police_yellowsticker_frenzy.jpg|/imgs/900_snap_20170123_187576_jtf32_preservation_police_yellowsticker_frenzy
/byrdbellvjk/imgs/900_snap_20170123_197616_law_donovan_joann1.jpg|/imgs/900_snap_20170123_197616_law_donovan_joann1
/byrdbellvjk/imgs/900_stlcounty_kassil_bench_probaton_20170918-1818_001.jpg|/imgs/900_stlcounty_kassil_bench_probaton_20170918-1818_001
/byrdbellvjk/imgs/900_topos.jpg|/imgs/900_topos
/byrdbellvjk/imgs/900_topos_20160505_031.jpg|/imgs/900_topos_20160505_031
/byrdbellvjk/imgs/900_zn_4.jpg|/imgs/900_zn_4
/byrdbellvjk/imgs/jtfdc_sawhorse_2020.jpg|/imgs/jtfdc_sawhorse_2020
/byrdbellvjk/imgs/snap_202209156950.png|/imgs/snap_202209156950
/byrdbellvjk/imgs/snap_202209156951.png|/imgs/snap_202209156951
/byrdbellvjk/imgs/snap_202209156952.png|/imgs/snap_202209156952
/byrdbellvjk/imgs/snap_202209156953.png|/imgs/snap_202209156953
/byrdbellvjk/imgs/snap_202209156954.png|/imgs/snap_202209156954
/byrdbellvjk/imgs/snap_202209156955.png|/imgs/snap_202209156955
/byrdbellvjk/imgs/snap_202209156956.png|/imgs/snap_202209156956
/byrdbellvjk/imgs/snap_202209156957.png|/imgs/snap_202209156957
/byrdbellvjk/imgs/snap_202209156958.png|/imgs/snap_202209156958
/byrdbellvjk/imgs/snap_202209156959.png|/imgs/snap_202209156959
/byrdbellvjk/imgs/snap_202209156960.png|/imgs/snap_202209156960
/byrdbellvjk/imgs/snap_202209156961.png|/imgs/snap_202209156961
/byrdbellvjk/imgs/snap_202209156962.png|/imgs/snap_202209156962
/byrdbellvjk/imgs/snap_202209156963.png|/imgs/snap_202209156963
/byrdbellvjk/imgs/snap_202209156964.png|/imgs/snap_202209156964
/byrdbellvjk/imgs/snap_202209156965.png|/imgs/snap_202209156965
/byrdbellvjk/imgs/snap_202209156966.png|/imgs/snap_202209156966
/byrdbellvjk/imgs/snap_202209156967.png|/imgs/snap_202209156967
/byrdbellvjk/imgs/snap_202209156968.png|/imgs/snap_202209156968
/byrdbellvjk/imgs/snap_202209156969.png|/imgs/snap_202209156969
				</pre id=pre_lists_items_end>
			</div id=div_lists_items_end>

		<div id=div_lists_pre hidden>
			<pre id=pre_lists_pre>
pre_lists_pre_line1
pre_lists_pre_line2
pre_lists_pre_line3
				</pre id=pre_lists_pre_end>
			</div id=div_lists_pre_end>



		<img id=img_lists_postturtles title="          lists_postturtles" src=/imgs/btn/koeye.png onclick="toggle('div_lists_postturtles',''); return false;" height=15 border=0>lists_postturtles
		<div id=div_lists_postturtles hidden>
			<pre id=pre_lists_postturtles>
/imgs/postturtle_moneytrap/postturtl10.jpg
/imgs/postturtle_moneytrap/postturtl11.jpg
/imgs/postturtle_moneytrap/postturtl12.jpg
/imgs/postturtle_moneytrap/postturtl13.jpg
/imgs/postturtle_moneytrap/postturtl14.jpg
/imgs/postturtle_moneytrap/postturtl15.png
/imgs/postturtle_moneytrap/postturtl16.jpg
/imgs/postturtle_moneytrap/postturtl17.gif
/imgs/postturtle_moneytrap/postturtl18.jpg
/imgs/postturtle_moneytrap/postturtl2.jpg
/imgs/postturtle_moneytrap/postturtl20.jpg
/imgs/postturtle_moneytrap/postturtl21.jpg
/imgs/postturtle_moneytrap/postturtl22.jpg
/imgs/postturtle_moneytrap/postturtl23.jpg
/imgs/postturtle_moneytrap/postturtl24.jpg
/imgs/postturtle_moneytrap/postturtl25.png
/imgs/postturtle_moneytrap/postturtl26.gif
/imgs/postturtle_moneytrap/postturtl27.jpg
/imgs/postturtle_moneytrap/postturtl3.jpg
/imgs/postturtle_moneytrap/postturtl31.png
/imgs/postturtle_moneytrap/postturtl4.jpg
/imgs/postturtle_moneytrap/postturtl5.jpg
/imgs/postturtle_moneytrap/postturtl6.jpg
/imgs/postturtle_moneytrap/postturtl7.jpg
/imgs/postturtle_moneytrap/postturtl8.jpg
/imgs/postturtle_moneytrap/postturtl9.jpg
/imgs/postturtle_moneytrap/postturtle_caption.jpg
/imgs/postturtle_moneytrap/rose.jpg
				</pre id=pre_lists_postturtles_pre_end>
			</div id=div_lists_postturtles_end>

		<img id=img_lists_monkeytraps title="          lists_monkeytraps" src=/imgs/btn/koeye.png onclick="toggle('div_lists_monkeytraps',''); return false;" height=15 border=0>lists_monkeytraps
		<div id=div_lists_monkeytraps hidden>
			<pre id=pre_lists_monkeytraps>
/fb/bh/pages/1.jpg|/fb/bh
/fb/birthday/pages/1.jpg|/fb/birthday
/fb/bookmarkusb/pages/1.jpg|/ffb/bookmarkusb
/fb/books/pages/1.jpg|/fb/books
/fb/byrdpucker/pages/1.jpg|/fb/byrdpucker
/fb/cards/pages/1.jpg|/fb/cards
/fb/che/pages/1.jpg|/fb/che
/fb/comics/pages/1.jpg|/fb/comics
/fb/cpa/pages/1.jpg|/fb/cpa
/fb/donutvanlaw/pages/1.jpg|/fb/donutvanlaw
/fb/edu/pages/1.jpg|/fb/edu
/fb/focus/pages/1.jpg|/fb/focus
/fb/gifs/pages/1.jpg|/fb/gifs
/fb/gnome/pages/1.jpg|/fb/gnome
/fb/go/pages/1.jpg|/fb/go
/fb/gofunwii/pages/1.jpg|//fb/gofunwii
/fb/gov/pages/1.jpg|//fb/gov
/fb/heart/pages/1.jpg|//fb/heart
/fb/hl/pages/1.jpg|//fb/hl
/fb/hoa/pages/1.jpg|//fb/hoa
/fb/hydro/pages/1.jpg|//fb/hydro
/fb/iperms/pages/1.jpg|/fb/iperms
//fb/jak1/pages/1.jpg|/fb/jak1
/fb/jak2/pages/1.jpg|/fb/jak2
/fb/jak3/pages/1.jpg|/fb/jak3
/fb/jhf/pages/1.jpg|/fb/jhf
/fb/jk/pages/1.jpg|/fb/jk
/fb/jkwii/pages/1.jpg|/fb/jkwii
/fb/jmh/pages/1.jpg|/fb/jmh
/fb/jtfdc/pages/1.jpg|/fb/jtfdc
/fb/jtfdcr/pages/1.jpg|/fb/jtfdcr
/imgs/btn/btn_fb.png|/fb/jtfdcr
/fb/jtfinc/pages/1.jpg|/fb/jtfinc
/fb/ka/pages/1.jpg|/fb/ka
/fb/kids/pages/1.jpg|/fb/kids
/fb/kitiworks/pages/1.jpg|/fb/kitiworks
/fb/konabus/pages/1.jpg|/fb/konabus
/fb/konet/pages/1.jpg|/fb/konet
/fb/kou/pages/1.jpg|/fb/kou
/fb/kowebb/pages/1.jpg|/fb/kowebb
/fb/kt/pages/1.jpg|/fb/kt
/fb/law/pages/1.jpg|/fb/law
/fb/mars/pages/1.jpg|/fb/mars
/fb/mars_2022/pages/1.jpg|/fb/mars_2022
/fb/med/pages/1.jpg|/fb/med
/fb/myco/pages/1.jpg|/fb/myco
/fb/netpix/pages/1.jpg|/fb/netpix
/fb/neuz/pages/1.jpg|/fb/neuz
/fb/miniraptors/pages/1.jpg|/fb/miniraptors
/fb/nwm/pages/1.jpg|/fb/nwm
/fb/operation/pages/1.jpg|/fb/operation
/fb/pastryroad/pages/1.jpg|/fb/pastryroad
/fb/royal1/pages/1.jpg|/fb/royal1
/fb/sk/pages/1.jpg|/fb/sk
/fb/skwii/pages/1.jpg|/fb/skwii
/fb/smileworthy/pages/1.jpg|/fb/smileworthy
/fb/soul/pages/1.jpg|/fb/soul
/fb/space/pages/1.jpg|/fb/space
/fb/ssstl/pages/1.jpg|/fb/ssstl
/fb/stlc/pages/1.jpg|/fb/stlc
/fb/us/pages/1.jpg|/fb/us
/fb/weds/pages/1.jpg|/fb/weds
/fb/who2jail/pages/1.jpg|/fb/who2jail
/fb/zc/pages/1.jpg|/fb/zc
/fb/zines/pages/1.jpg|/fb/zines
/imgs/postturtle_moneytrap/monkeytrap1.png
/imgs/postturtle_moneytrap/monkeytrap2.jpg
/imgs/postturtle_moneytrap/monkeytrap3.jpg
/imgs/postturtle_moneytrap/monkeytrap10.jpg
/imgs/postturtle_moneytrap/monkeytrap11.jpg
/imgs/postturtle_moneytrap/monkeytrap12.jpg
/imgs/postturtle_moneytrap/monkeytrap13.jpg
/imgs/postturtle_moneytrap/monkeytrap14.jpg
/imgs/postturtle_moneytrap/monkeytrap17.jpg
/imgs/postturtle_moneytrap/monkeytrap18.jpg
/imgs/postturtle_moneytrap/monkeytrap20.jpg
/imgs/postturtle_moneytrap/monkeytrap21.png
/imgs/postturtle_moneytrap/monkeytrap22.png
/imgs/postturtle_moneytrap/monkeytrap24.jpg
/imgs/postturtle_moneytrap/monkeytrap28.jpg
/imgs/postturtle_moneytrap/monkeytrap29.jpg
/imgs/postturtle_moneytrap/monkeytrap30.jpg
/imgs/postturtle_moneytrap/monkeytrap31.jpg
/imgs/postturtle_moneytrap/monkeytrap34.png
/imgs/postturtle_moneytrap/monkeytrap36.jpg
/imgs/postturtle_moneytrap/monkeytrap37.jpg
/imgs/postturtle_moneytrap/monkeytrap37.png
/imgs/postturtle_moneytrap/monkeytrap4.png
/imgs/postturtle_moneytrap/monkeytrap5.jpg
/imgs/postturtle_moneytrap/monkeytrap54.jpg
/imgs/postturtle_moneytrap/monkeytrap6.jpg
/imgs/postturtle_moneytrap/monkeytrap7.png
/imgs/postturtle_moneytrap/monkeytrap8.jpg
/imgs/postturtle_moneytrap/monkeytrap9.jpg
				</pre id=pre_lists_monkeytraps_end>
			</div id=div_lists_monkeytraps_end>


		<img id=img_lists_floods title="          lists_floods" src=/imgs/btn/koeye.png onclick="toggle('div_lists_floods',''); return false;" height=15 border=0>lists_floods
		<div id=div_lists_floods hidden>
			<pre id=pre_lists_floods>
/fb/bh/pages/1.jpg|/pdf/bh.pdf
/fb/birthday/pages/1.jpg|/pdf/birthday.pdf
/fb/bookmarkusb/pages/1.jpg|/pdf/bookmarkusb.pdf
/fb/books/pages/1.jpg|/pdf/books.pdf
/fb/byrdpucker/pages/1.jpg|/pdf/byrdpucker.pdf
/fb/cards/pages/1.jpg|/pdf/cards.pdf
/fb/che/pages/1.jpg|/pdf/che.pdf
/fb/comics/pages/1.jpg|/pdf/comics.pdf
/fb/cpa/pages/1.jpg|/pdf/cpa.pdf
/fb/donutvanlaw/pages/1.jpg|/pdf/donutvanlaw.pdf
/fb/edu/pages/1.jpg|/pdf/edu.pdf
/fb/focus/pages/1.jpg|/pdf/focus.pdf
/fb/gifs/pages/1.jpg|/pdf/gifs.pdf
/fb/gnome/pages/1.jpg|/pdf/gnome.pdf
/fb/go/pages/1.jpg|/pdf/go.pdf
/fb/gofunwii/pages/1.jpg|//pdf/gofunwii.pdf
/fb/gov/pages/1.jpg|//pdf/gov.pdf
/fb/heart/pages/1.jpg|//pdf/heart.pdf
/fb/hl/pages/1.jpg|//pdf/hl.pdf
/fb/hoa/pages/1.jpg|//pdf/hoa.pdf
/fb/hydro/pages/1.jpg|//pdf/hydro.pdf
/fb/iperms/pages/1.jpg|/pdf/iperms.pdf
//fb/jak1/pages/1.jpg|/pdf/jak1.pdf
/fb/jak2/pages/1.jpg|/pdf/jak2.pdf
/fb/jak3/pages/1.jpg|/pdf/jak3.pdf
/fb/jhf/pages/1.jpg|/pdf/jhf.pdf
/fb/jk/pages/1.jpg|/pdf/jk.pdf
/fb/jkwii/pages/1.jpg|/pdf/jkwii.pdf
/fb/jmh/pages/1.jpg|/pdf/jmh.pdf
/fb/jtfdc/pages/1.jpg|/pdf/jtfdc.pdf
/fb/jtfdcr/pages/1.jpg|/pdf/jtfdcr.pdf
/imgs/btn/btn_pdf1.png|/pdf/jtfdcr.pdf.pdf
/fb/jtfinc/pages/1.jpg|/pdf/jtfinc.pdf
/fb/ka/pages/1.jpg|/pdf/ka.pdf
/fb/kids/pages/1.jpg|/pdf/kids.pdf
/fb/kitiworks/pages/1.jpg|/pdf/kitiworks.pdf
/fb/konabus/pages/1.jpg|/pdf/konabus.pdf
/fb/konet/pages/1.jpg|/pdf/konet.pdf
/fb/kou/pages/1.jpg|/pdf/kou.pdf
/fb/kowebb/pages/1.jpg|/pdf/kowebb.pdf
/fb/kt/pages/1.jpg|/pdf/kt.pdf
/fb/law/pages/1.jpg|/pdf/law.pdf
/fb/mars/pages/1.jpg|/pdf/mars.pdf
/fb/mars_2022/pages/1.jpg|/pdf/mars_2022.pdf
/fb/med/pages/1.jpg|/pdf/med.pdf
/fb/myco/pages/1.jpg|/pdf/myco.pdf
/fb/netpix/pages/1.jpg|/fb/netpix.pdf
/fb/neuz/pages/1.jpg|/fb/neuz.pdf
/fb/miniraptors/pages/1.jpg|/fb/miniraptors.pdf
/fb/nwm/pages/1.jpg|/fb/nwm.pdf
/fb/operation/pages/1.jpg|/fb/operation.pdf
/fb/pastryroad/pages/1.jpg|/fb/pastryroad.pdf
/fb/royal1/pages/1.jpg|/fb/royal1.pdf
/fb/sk/pages/1.jpg|/fb/sk.pdf
/fb/skwii/pages/1.jpg|/fb/skwii.pdf
/fb/smileworthy/pages/1.jpg|/fb/smileworthy.pdf
/fb/soul/pages/1.jpg|/fb/soul.pdf
/fb/space/pages/1.jpg|/fb/space.pdf
/fb/ssstl/pages/1.jpg|/fb/ssstl.pdf
/fb/stlc/pages/1.jpg|/fb/stlc.pdf
/fb/us/pages/1.jpg|/fb/us.pdf
/fb/weds/pages/1.jpg|/fb/weds.pdf
/fb/who2jail/pages/1.jpg|/fb/who2jail.pdf
/fb/zc/pages/1.jpg|/fb/zc.pdf
/fb/zines/pages/1.jpg|/fb/zines.pdf
/fb/zpid/pages/1.jpg|/fb/zpid.pdf
/imgs/postturtle_moneytrap//floop_rooftop.jpg
/imgs/postturtle_moneytrap//floop_rooftop1.jpg
/imgs/postturtle_moneytrap//floop_rooftop11.jpg
/imgs/postturtle_moneytrap//floop_rooftop12.jpg
/imgs/postturtle_moneytrap//floop_rooftop13.jpg
/imgs/postturtle_moneytrap//floop_rooftop14.jpg
/imgs/postturtle_moneytrap//floop_rooftop15.jpg
/imgs/postturtle_moneytrap//floop_rooftop2.jpg
/imgs/postturtle_moneytrap//floop_rooftop20.jpg
/imgs/postturtle_moneytrap//floop_rooftop21.jpg
/imgs/postturtle_moneytrap//floop_rooftop3.jpg
/imgs/postturtle_moneytrap//floop_rooftop5.jpg
/imgs/postturtle_moneytrap//floop_rooftop6.jpg
/imgs/postturtle_moneytrap//floop_rooftop7.jpg
/imgs/postturtle_moneytrap//floop_rooftop8.jpg
/imgs/postturtle_moneytrap//floop_rooftop9.jpg
				</pre id=pre_lists_floods_end>
			</div id=div_lists_floods_end>

		<img id=img_lists_coffee title="          lists_coffee" src=/imgs/btn/koeye.png onclick="toggle('div_lists_coffee',''); return false;" height=15 border=0>lists_coffee
		<div id=div_lists_coffee hidden>
			<pre id=pre_lists_coffee>
/imgs/coffee/jpeg/391824b4b09012ae.jpeg
/imgs/coffee/jpeg/9580e63428b6f77a.jpeg
/imgs/coffee/jpeg/pexels-photo-10003711.jpeg
/imgs/coffee/jpeg/pexels-photo-11071354.jpeg
/imgs/coffee/jpeg/pexels-photo-11110090.jpeg
/imgs/coffee/jpeg/pexels-photo-11175664.jpeg
/imgs/coffee/jpeg/pexels-photo-11175665.jpeg
/imgs/coffee/jpeg/pexels-photo-11175667.jpeg
/imgs/coffee/jpeg/pexels-photo-11278370.jpeg
/imgs/coffee/jpeg/pexels-photo-11417203.jpeg
/imgs/coffee/jpeg/pexels-photo-11556062.jpeg
/imgs/coffee/jpeg/pexels-photo-1239399.jpeg
/imgs/coffee/jpeg/pexels-photo-1252194.jpeg
/imgs/coffee/jpeg/pexels-photo-1422286.jpeg
/imgs/coffee/jpeg/pexels-photo-1443384.jpeg
/imgs/coffee/jpeg/pexels-photo-1526049.jpeg
/imgs/coffee/jpeg/pexels-photo-1541216.jpeg
/imgs/coffee/jpeg/pexels-photo-1550648.jpeg
/imgs/coffee/jpeg/pexels-photo-1627933.jpeg
/imgs/coffee/jpeg/pexels-photo-1827548.jpeg
/imgs/coffee/jpeg/pexels-photo-2074130.jpeg
/imgs/coffee/jpeg/pexels-photo-2092557.jpeg
/imgs/coffee/jpeg/pexels-photo-2102818.jpeg
/imgs/coffee/jpeg/pexels-photo-2228889.jpeg
/imgs/coffee/jpeg/pexels-photo-2318005.jpeg
/imgs/coffee/jpeg/pexels-photo-2386687.jpeg
/imgs/coffee/jpeg/pexels-photo-2659387.jpeg
/imgs/coffee/jpeg/pexels-photo-2662180.jpeg
/imgs/coffee/jpeg/pexels-photo-2678301.jpeg
/imgs/coffee/jpeg/pexels-photo-2878709.jpeg
/imgs/coffee/jpeg/pexels-photo-2878710.jpeg
/imgs/coffee/jpeg/pexels-photo-2910874.jpeg
/imgs/coffee/jpeg/pexels-photo-3178767.jpeg
/imgs/coffee/jpeg/pexels-photo-3278765.jpeg
/imgs/coffee/jpeg/pexels-photo-3309949.jpeg
/imgs/coffee/jpeg/pexels-photo-3389608.jpeg
/imgs/coffee/jpeg/pexels-photo-3472693.jpeg
/imgs/coffee/jpeg/pexels-photo-3473488.jpeg
/imgs/coffee/jpeg/pexels-photo-3563636.jpeg
/imgs/coffee/jpeg/pexels-photo-359991.jpeg
/imgs/coffee/jpeg/pexels-photo-3617078.jpeg
/imgs/coffee/jpeg/pexels-photo-3640930.jpeg
/imgs/coffee/jpeg/pexels-photo-3695401.jpeg
/imgs/coffee/jpeg/pexels-photo-3704614.jpeg
/imgs/coffee/jpeg/pexels-photo-3749174.jpeg
/imgs/coffee/jpeg/pexels-photo-3820688.jpeg
/imgs/coffee/jpeg/pexels-photo-3944418.jpeg
/imgs/coffee/jpeg/pexels-photo-3944425.jpeg
/imgs/coffee/jpeg/pexels-photo-3944426.jpeg
/imgs/coffee/jpeg/pexels-photo-4066041.jpeg
/imgs/coffee/jpeg/pexels-photo-414551.jpeg
/imgs/coffee/jpeg/pexels-photo-414565.jpeg
/imgs/coffee/jpeg/pexels-photo-4257118.jpeg
/imgs/coffee/jpeg/pexels-photo-5357428.jpeg
/imgs/coffee/jpeg/pexels-photo-539432.jpeg
/imgs/coffee/jpeg/pexels-photo-5554704.jpeg
/imgs/coffee/jpeg/pexels-photo-585752.jpeg
/imgs/coffee/jpeg/pexels-photo-6682875.jpeg
/imgs/coffee/jpeg/pexels-photo-6763897.jpeg
/imgs/coffee/jpeg/pexels-photo-6763900.jpeg
/imgs/coffee/jpeg/pexels-photo-6968356.jpeg
/imgs/coffee/jpeg/pexels-photo-7304961.jpeg
/imgs/coffee/jpeg/pexels-photo-754958.jpeg
/imgs/coffee/jpeg/pexels-photo-850384.jpeg
/imgs/coffee/jpeg/pexels-photo-8554317.jpeg
/imgs/coffee/jpeg/pexels-photo-9430774.jpeg
/imgs/coffee/jpeg/pexels-photo-9430779.jpeg
/imgs/coffee/jpeg/pexels-photo-9532643.jpeg
/imgs/coffee/jpeg/pexels-photo-9532644.jpeg
/imgs/coffee/jpeg/pexels-photo-9944529.jpeg
/imgs/coffee/jpg/coffee-cup-802757__340.jpg
/imgs/coffee/jpg/istockphoto-1022148452-612x612.jpg
/imgs/coffee/jpg/istockphoto-1045444176-612x612.jpg
/imgs/coffee/jpg/istockphoto-1126871442-612x612.jpg
/imgs/coffee/jpg/istockphoto-1148733827-612x612.jpg
/imgs/coffee/jpg/istockphoto-1150907214-612x612.jpg
/imgs/coffee/jpg/istockphoto-1163941624-612x612.jpg
/imgs/coffee/jpg/istockphoto-1163942162-612x612.jpg
/imgs/coffee/jpg/istockphoto-1169132256-612x612.jpg
/imgs/coffee/jpg/istockphoto-1169132284-612x612.jpg
/imgs/coffee/jpg/istockphoto-1217152011-612x612.jpg
/imgs/coffee/jpg/istockphoto-1227354066-612x612.jpg
/imgs/coffee/jpg/istockphoto-1256489412-612x612.jpg
/imgs/coffee/jpg/istockphoto-1262293120-612x612.jpg
/imgs/coffee/jpg/istockphoto-1277354169-612x612.jpg
/imgs/coffee/jpg/istockphoto-1280138901-612x612.jpg
/imgs/coffee/jpg/istockphoto-1280953401-612x612.jpg
/imgs/coffee/jpg/istockphoto-1286808993-612x612.jpg
/imgs/coffee/jpg/istockphoto-1297456339-612x612.jpg
/imgs/coffee/jpg/istockphoto-1362522234-612x612.jpg
/imgs/coffee/jpg/istockphoto-144287394-612x612.jpg
/imgs/coffee/jpg/istockphoto-454323299-612x612.jpg
/imgs/coffee/jpg/istockphoto-472338869-612x612.jpg
/imgs/coffee/jpg/istockphoto-664587996-612x612.jpg
/imgs/coffee/jpg/istockphoto-674493404-612x612.jpg
/imgs/coffee/jpg/istockphoto-681239620-612x612.jpg
/imgs/coffee/jpg/istockphoto-685135578-612x612.jpg
/imgs/coffee/jpg/istockphoto-694274558-612x612.jpg
/imgs/coffee/jpg/istockphoto-821282266-612x612.jpg
/imgs/coffee/jpg/istockphoto-825154518-612x612.jpg
/imgs/coffee/jpg/istockphoto-840443226-612x612.jpg
/imgs/coffee/jpg/istockphoto-843178108-612x612.jpg
/imgs/coffee/jpg/istockphoto-910619624-612x612.jpg
/imgs/coffee/jpg/istockphoto-923127406-612x612.jpg
/imgs/coffee/jpg/istockphoto-928414210-612x612.jpg
/imgs/coffee/png/coffee-tea-4849436_960_720.png
/imgs/coffee/png/cup-of-coffee-5017443__340.png
/imgs/coffee/webp/black-2024946__340.webp
/imgs/coffee/webp/blue-coffee-cups-4221856__340.webp
/imgs/coffee/webp/coffee-1390800__340.webp
/imgs/coffee/webp/coffee-155311__340.webp
/imgs/coffee/webp/cup-153171__340.webp
/imgs/coffee/webp/depositphotos_173485988-free-stock-photo-woman-drinking-coffee-on-windowsill.webp
/imgs/coffee/webp/depositphotos_19027659-stock-photo-colorful-coffee-cups.webp
/imgs/coffee/webp/depositphotos_254821360-stock-photo-top-view-coffee-cup-jug.webp
/imgs/coffee/webp/depositphotos_79241836-stock-photo-woman-hands-holding-mug-of.webp
/imgs/coffee/webp/pexels-photo-10080409.webp
/imgs/coffee/webp/pexels-photo-1011292.webp
/imgs/coffee/webp/pexels-photo-10466456.webp
/imgs/coffee/webp/pexels-photo-1092392.webp
/imgs/coffee/webp/pexels-photo-1177510.webp
/imgs/coffee/webp/pexels-photo-1235706.webp
/imgs/coffee/webp/pexels-photo-1239422.webp
/imgs/coffee/webp/pexels-photo-1239470.webp
/imgs/coffee/webp/pexels-photo-12733904.webp
/imgs/coffee/webp/pexels-photo-1309778.webp
/imgs/coffee/webp/pexels-photo-131893.webp
/imgs/coffee/webp/pexels-photo-1656025.webp
/imgs/coffee/webp/pexels-photo-1684149.webp
/imgs/coffee/webp/pexels-photo-1749303.webp
/imgs/coffee/webp/pexels-photo-1752806.webp
/imgs/coffee/webp/pexels-photo-1793042.webp
/imgs/coffee/webp/pexels-photo-1809127.webp
/imgs/coffee/webp/pexels-photo-1967535.webp
/imgs/coffee/webp/pexels-photo-1974875.webp
/imgs/coffee/webp/pexels-photo-2008140.webp
/imgs/coffee/webp/pexels-photo-2013701.webp
/imgs/coffee/webp/pexels-photo-2067432.webp
/imgs/coffee/webp/pexels-photo-2067628.webp
/imgs/coffee/webp/pexels-photo-2092551.webp
/imgs/coffee/webp/pexels-photo-2092558.webp
/imgs/coffee/webp/pexels-photo-2128023.webp
/imgs/coffee/webp/pexels-photo-2249342.webp
/imgs/coffee/webp/pexels-photo-2255355.webp
/imgs/coffee/webp/pexels-photo-2299028.webp
/imgs/coffee/webp/pexels-photo-2312369.webp
/imgs/coffee/webp/pexels-photo-2316543.webp
/imgs/coffee/webp/pexels-photo-236699.webp
/imgs/coffee/webp/pexels-photo-2456429.webp
/imgs/coffee/webp/pexels-photo-2478349.webp
/imgs/coffee/webp/pexels-photo-2616175.webp
/imgs/coffee/webp/pexels-photo-266755.webp
/imgs/coffee/webp/pexels-photo-2672859.webp
/imgs/coffee/webp/pexels-photo-302888.webp
/imgs/coffee/webp/pexels-photo-312418.webp
/imgs/coffee/webp/pexels-photo-3124422.webp
/imgs/coffee/webp/pexels-photo-3151775.webp
/imgs/coffee/webp/pexels-photo-3571947.webp
/imgs/coffee/webp/pexels-photo-3680186.webp
/imgs/coffee/webp/pexels-photo-3709090.webp
/imgs/coffee/webp/pexels-photo-3709094.webp
/imgs/coffee/webp/pexels-photo-3714960.webp
/imgs/coffee/webp/pexels-photo-4012966.webp
/imgs/coffee/webp/pexels-photo-4046148.webp
/imgs/coffee/webp/pexels-photo-4065616.webp
/imgs/coffee/webp/pexels-photo-4065905.webp
/imgs/coffee/webp/pexels-photo-4065910.webp
/imgs/coffee/webp/pexels-photo-4079289.webp
/imgs/coffee/webp/pexels-photo-414630.webp
/imgs/coffee/webp/pexels-photo-4264049.webp
/imgs/coffee/webp/pexels-photo-5357424.webp
/imgs/coffee/webp/pexels-photo-593334.webp
/imgs/coffee/webp/pexels-photo-6193131.webp
/imgs/coffee/webp/pexels-photo-6193649.webp
/imgs/coffee/webp/pexels-photo-6312156.webp
/imgs/coffee/webp/pexels-photo-6894105.webp
/imgs/coffee/webp/pexels-photo-7660561.webp
/imgs/coffee/webp/pexels-photo-830912.webp
/imgs/coffee/webp/pexels-photo-851555.webp
/imgs/coffee/webp/pexels-photo-885021.webp
/imgs/coffee/webp/pexels-photo-894608.webp
/imgs/coffee/webp/pexels-photo-923368.webp
/imgs/coffee/webp/pexels-photo-9478157.webp
/imgs/coffee/webp/pexels-photo-999305.webp
				</pre id=pre_lists_coffee_end>
			</div id=div_lists_coffee_end>




		<img id=img_lists_json title="          lists_json" src=/imgs/btn/koeye.png onclick="toggle('div_lists_json',''); return false;" height=15 border=0>lists_json
		<div id=div_lists_json hidden>
			<pre id=pre_lists_json_end>
{ "timeline": {
"headline":"jtfdc_20210917_1627_mail_speedy_notime2talk.mp4",
"type":"default",
"text":"<a href='/fb/usps/mp4/jtfdc_20210917_1627_mail_speedy_notime2talk.mp4' target=_blank><img src='/imgs/btn/btn_mp4.png' height=200></a>",
"startDate":"1900,1,1",
"endDate":"1900,1,1",
"date": [ 
	{
	"startDate":"1900,1,1",
	"endDate":"1900,1,1",
	"headline":"jtfdc_20210917_1609_jtf30_bigups_stalkaroundout.mp4",
	"text":"<a href='/fb/usps/mp4/jtfdc_20210917_1609_jtf30_bigups_stalkaroundout.mp4' target=_blank><img src='/imgs/btn/btn_mp4.png' height=200></a>",
	"asset": {
		"media":"/fb/usps/mp4/jtfdc_20210917_1609_jtf30_bigups_stalkaroundout.mp4",
		"credit":" credit 4",
		"caption":"caption"
		} },
	{
	"startDate":"1900,1,1",
	"endDate":"1900,1,1",
	"headline":"jtfdc_20210917_1607_jtf30_bigups.mp4",
	"text":"<a href='/fb/usps/mp4/jtfdc_20210917_1607_jtf30_bigups.mp4' target=_blank><img src='/imgs/btn/btn_mp4.png' height=200></a>",
	"asset": {
		"media":"/fb/usps/mp4/jtfdc_20210917_1607_jtf30_bigups.mp4",
		"credit":" credit 4",
		"caption":"caption"
		} },
	{
	"startDate":"1900,1,1",
	"endDate":"1900,1,1",
	"headline":"jtfdc_20210917_1606_jtf31_bigups.mp4",
	"text":"<a href='/fb/usps/mp4/jtfdc_20210917_1606_jtf31_bigups.mp4' target=_blank><img src='/imgs/btn/btn_mp4.png' height=200></a>",
	"asset": {
		"media":"/fb/usps/mp4/jtfdc_20210917_1606_jtf31_bigups.mp4",
		"credit":" credit 4",
		"caption":"caption"
		} },
	{
	"startDate":"1900,1,1",
	"endDate":"1900,1,1",
	"headline":"jtfdc_20210918_1508_mail_driveway_buckerplowing.mp4",
	"text":"<a href='/fb/usps/mp4/jtfdc_20210918_1508_mail_driveway_buckerplowing.mp4' target=_blank><img src='/imgs/btn/btn_mp4.png' height=200></a>",
	"asset": {
		"media":"/fb/usps/mp4/jtfdc_20210918_1508_mail_driveway_buckerplowing.mp4",
		"credit":" credit 4",
		"caption":"caption"
		} },
	{
	"startDate":"1900,1,1",
	"endDate":"1900,1,1",
	"headline":"jtfdc_20210918_1413_jtf30_bigamazon_outnice.mp4",
	"text":"<a href='/fb/usps/mp4/jtfdc_20210918_1413_jtf30_bigamazon_outnice.mp4' target=_blank><img src='/imgs/btn/btn_mp4.png' height=200></a>",
	"asset": {
		"media":"/fb/usps/mp4/jtfdc_20210918_1413_jtf30_bigamazon_outnice.mp4",
		"credit":" credit 4",
		"caption":"caption"
		} },
	{
	"startDate":"1900,1,1",
	"endDate":"1900,1,1",
	"headline":"jtfdc_20210918_1413_jtf30_bigamazon_outnice.mp4",
	"text":"<a href='/fb/usps/mp4/jtfdc_20210918_1413_jtf30_bigamazon_outnice.mp4' target=_blank><img src='/imgs/btn/btn_mp4.png' height=200></a>",
	"asset": {
		"media":"/fb/usps/mp4/jtfdc_20210918_1413_jtf30_bigamazon_outnice.mp4",
		"credit":" credit 4",
		"caption":"caption"
		} } ] } }
				</pre id=pre_lists_json_end>
			</div id=div_lists_json_end>




		<img id=img_lists_pages title="          lists_pages" src=/imgs/btn/koeye.png onclick="toggle('div_lists_pages',''); return false;" height=15 border=0>lists_pages
		<div id=div_lists_pages hidden>
			<h3>div_lists_pages</h3>
			<pre id=pre_lists_pages>
/fb/konet/pages/1.jpg
/fb/iperms/pages/1.jpg
/fb/anniversary/pages/1.jpg
/fb/bh/pages/1.jpg
/fb/birthday/pages/1.jpg
/fb/bookmarkusb/pages/1.jpg
/fb/books/pages/1.jpg
/fb/byrdbellvjk/pages/1.jpg
/fb/byrdpucker/pages/1.jpg
/fb/cards/pages/1.jpg
/fb/comics/pages/1.jpg
/fb/cpa/pages/1.jpg
/fb/donutvanlaw/pages/1.jpg
/fb/edu/pages/1.jpg
/fb/fahtersday/pages/1.jpg
/fb/gifs/pages/1.jpg
/fb/gnome/pages/1.jpg
/fb/go/pages/1.jpg
/fb/gofunwii/pages/1.jpg
/fb/gov/pages/1.jpg
/fb/hl/pages/1.jpg
/fb/hoa/pages/1.jpg
/fb/hydro/pages/1.jpg
/fb/ipad/pages/1.jpg
/fb/jak1/pages/1.jpg
/fb/jak2/pages/1.jpg
/fb/jak3/pages/1.jpg
/fb/jhf/pages/1.jpg
/fb/jk/pages/1.jpg
/fb/jkwii/pages/1.jpg
/fb/jmh/pages/1.jpg
/fb/jtfdc/pages/1.jpg
/fb/jtfdcr/pages/1.jpg
/fb/jtfinc/pages/1.jpg
/fb/ka/pages/1.jpg
/fb/kassil/pages/1.jpg
/fb/kids/pages/1.jpg
/fb/kitiworks/pages/1.jpg
/fb/konabus/pages/1.jpg
/fb/konet/pages/1.jpg
/fb/kou/pages/1.jpg
/fb/kowebb/pages/1.jpg
/fb/kt/pages/1.jpg
/fb/law/pages/1.jpg
/fb/mars/pages/1.jpg
/fb/mars_2022/pages/1.jpg
/fb/med/pages/1.jpg
/fb/miniraptors/pages/1.jpg
/fb/mothersday/pages/1.jpg
/fb/myco/pages/1.jpg
/fb/netpix/pages/1.jpg
/fb/neuz/pages/1.jpg
/fb/nwm/pages/1.jpg
/fb/operation/pages/1.jpg
/fb/pastryroad/pages/1.jpg
/fb/royal1/pages/1.jpg
/fb/sk/pages/1.jpg
/fb/skwii/pages/1.jpg
/fb/smileworthy/pages/1.jpg
/fb/ssstl/pages/1.jpg
/fb/stlc/pages/1.jpg
/fb/usps/pages/1.jpg
/fb/weds/pages/1.jpg
/fb/who2jail/pages/1.jpg
/fb/zc/pages/1.jpg
/fb/zpid/pages/1.jpg
/fb/kt/pages/1.jpg
/fb/go/pages/1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg
1.jpg
1.jpg
1.jpg
1.jpg
1.jpg
1.jpg
1.jpg
1.jpg
1.jpg
1.jpg
				</pre id=pre_lists_pages_end>
			</div id=div_lists_pages_end>


		</div id=div_lists_end>
		<br>
		<hr color=white>
		<hr color=black>
		<hr color=white>

		<img id=img_koslots title="          koslots" src=/imgs/btn/koeyeb.png onclick="toggle('div_koslots',''); return false;" height=20 border=0>koslots
		<div id=div_koslots hidden>
			<h3>div_koslots</h3>
			</div id=div_koslots_end>
			<br>
			<hr color=white>



	<img id=img_gojs title="          gojs" src=/imgs/btn/koeye.png onclick="toggle('div_gojs',''); return false;" height=15 border=0>gojs
	<br>
	<hr color=white>
	<div id=div_gojs hidden>
		<h1>div_gojs</h1>
		<h2>jtfdcr</h2>
		<a href=/ko/gojs/orgChartEditor.html target=_blank> <img id=img_orgcharteditor /ko/gojs/orgChartEditor.png height=100 border=0></a>
		<a href=/ko/gojs/dogy_monitor.html target=_blank> <img id=img_dogy_monitor /ko/gojs/dogy_monitor.pnpng height=100 border=0></a>
		<br>
		<h2>orgmaps</h2>
		<a href=/js/gojs/samples/orgChartEditor.html target=_blank> <img id=img_gojs_orgChartEditor src=/js/gojs/samples/orgChartEditor.png height=100 border=0></a>
		<a href=/js/gojs/samples/localView.html target=_blank> <img id=img_localView src=/js/gojs/samples/localView.png height=100 border=0></a>
		<a href=/js/gojs/samples/kittenMonitoTreeMap.html target=_blank> <img id=img_gojs_kittenMonitorTreeMap src=/js/gojs/samples/kittenMonitoTreeMap.png height=100 border=0></a>
		<a href=/js/gojs/extensions/TablTreeMap.html target=_blank> <img id=img_gojs_TableTreeMap src=/js/gojs/extensions/TablTreeMap.png height=100 border=0></a>
		<a href=/js/gojs/extensions/TreeMap.html target=_blank> <img id=img_gojs_TreeMap /js/gojs/extensions/TreeMap.png height=100 border=0></a>
		<a href=/js/gojs/samples/orgChartStatic.html target=_blank> <img id=img_gojf_orgChartStatic src=/js/gojs/samples/orgChartStatic.png height=100 border=0></a>
		<br>
		<h2>fun</h2> 
		<a href=/js/gojs/samples/pipeTreeMap.html target=_blank> <img id=img_gojs_pipTreeMap src=/js/gojs/samples/pipeTreeMap.png height=100 border=0></a>
		<a href=/js/gojs/samples/gameOfLife.html target=_blank> <img id=img-gojs_gamoeOfLife src=/js/gojs/samples/gameOfLife.png height=100 border=0></a>
		<a href=/js/gojs/samples/controlGaugeTreeMap.html target=_blank> <img id=img_gojs_controlGaugeTreeMap src=/js/gojs/samples/controlGaugeTreeMap.png height=100 border=0></a>
		<a href=/js/gojs/samples/controlGauges.html target=_blank> <img id=img_gojs_controlGauges src=/js/gojs/samples/controlGauges.png height=100 border=0></a>
		<a href=/js/gojs/samples/planogram.html target=_blank> <img id=img_gojs_panogram src=/js/gojs/samples/planogram.png height=100 border=0></a>
		<a href=/js/gojs/samples/seatingChart.html target=_blank> <img id=img_gojs_seatingCart src=/js/gojs/samples/seatingChart.png height=100 border=0></a>
		<a href=/js/gojs/samples/leaflet.html target=_blank> <img id=img_gojs_leflet src=/js/gojs/samples/leaflet.png height=100 border=0></a>
		<a href=/js/gojs/samples/timeline.html target=_blank> <img id=img_gojs_timeline /js/gojs/samples/timeline.png height=100 border=0></a>
		<a href=/js/gojs/samples/belts.html target=_blank> <img id=img_gojs_belts src=/js/gojs/samples/belts.png height=100 border=0></a>
		
		<a href=/js/gojs/samples/kanban.html target=_blanks> <img id=img_gojs_kanban title="          gojs_kanban" src=/js/gojs/samples/kanban.png height=100></a>

		</div id=div_gojs>
		<br>
	<hr color=white>
	<img id=img_threejs title="          threejs" src=/imgs/btn/koeye.png onclick="toggle('div_threejs',''); return false;" height=15 border=0>threejs
	<br>
	<hr color=white>
	<div id=div_threejs hidden>
		<h1>div_threejs</h1>
<a href=/js/threejs/examples/#webgl_animation_keyframes target=_blank> <img id=img_threejs_animation src=/js/threejs/webgl_animation_keyframes.png height=100 border=0></a>
<a href=/js/threejs/examples/#webgl_animation_skinning_blending target=_blank> <img id=img_threejs_animation src=/js/threejs/webgl_animation_skinning_blending.png height=100 border=0></a>
<a href=/js/threejs/examples/#webgl_animation_skinning_additive_blending target=_blank> <img id=img_threejs_animation src=/js/threejs/webgl_animation_skinning_additive_blending.png height=100 border=0></a>
<a href=/js/threejs/examples/#webgl_decals target=_blank> <img id=img_threejs_decals src=/js/threejs/webgl_decals.png height=100 border=0></a>
<a href=/js/threejs/examples/#webgl_effects_anaglyph target=_blank> <img id=img_threejs_effects_anaglyph src=/js/threejs/webgl_effects_anaglyph.png height=100 border=0></a>
<a href=/js/threejs/examples/#webgl_effects_stereo target=_blank> <img id=img_threejs_effects_stereo src=/js/threejs/webgl_effects_stereo.png height=100 border=0></a>
<a href=/js/threejs/examples/#webgl_decals target=_blank> <img id=img_threejs_decals src=/js/threejs/webgl_decals.png height=100 border=0></a>

<a href=/js/threejs/examples/#webgl_interactive_voxelpainter target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_geometry_teapot target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_geometry_text target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_lights_pointlights target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_lights_spotlight target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_loader_bvh target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_geometry_text target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_loader_gltf_compressed target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_loader_md2 target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_loader_mmd_pose target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_marchingcubes target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_geometry_text target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_buffergeometry_drawrange target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_gpgpu_birds target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_geometry_text target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_geometry_text target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_geometry_text target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_shadowmap_csm target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#css3d_sprites target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/#css3d_periodictable target=_blank><img src=/imgs/btn/kob.png height=25></a>
<a href=/js/threejs/examples/#webgl_shadowmap_csm target=_blank><img src=/imgs/btn/kob.png height=25></a>


		</div id=div_threejs_end>
	<br>
	<hr color=black>
	<hr color=white>
	<img id=img_views title="          views" src=/imgs/btn/koeye.png onclick="toggle('div_views',''); return false;" height=20 border=0>views
	<div id=div_views hidden>
		<h1>div_views</h1>
		<br>
		<br>
		<hr color=white>
		<hr color=white>
		<img id=img_fb title="          div_fb" src=/imgs/btn/koeye.png onclick="toggle('div_fb',''); return false;" height=20 border=0>div_fb
		<div id=div_fb hidden>
			<h1>div_fb</h1>
			</div id=div_fb_end>
		<br>
		<hr color=white>
		<hr color=white>
		<img id=img_dd title="          div_dd" src=/imgs/btn/koeye.png onclick="toggle('div_dd',''); return false;" height=20 border=0>div_dd
		<div id=div_dd hidden>
			<h1>div_dd</h1>
			</div id=div_dd>
		<br>
		<hr color=white>
		<hr color=white>
		<img id=img_tl title="          div_tl" src=/imgs/btn/koeye.png onclick="toggle('div_tl',''); return false;" height=20 border=0>div_tl
		<div id=div_tl hidden>
			<h1>div_tl</h1>
			</div id=div_tl>
		<br>
		<hr color=white>
		<hr color=white>
		<img id=img_zm title="          div_zm" src=/imgs/btn/koeye.png onclick="toggle('div_zm',''); return false;" height=20 border=0>div_zm
		<div id=div_zm hidden>
			<h1>div_zm</h1>
			</div id=div_zm>
		<br>
		<hr color=white>
		<hr color=white>
		<img id=img_pn title="          div_pn" src=/imgs/btn/koeye.png onclick="toggle('div_pn',''); return false;" height=20 border=0>div_pn
		<div id=div_pn hidden>
			<h1>div_pn</h1>
			</div id=div_pn_end>
		<br>


		</div id=div_view_end>
	<br>
	<hr color=white>
	<hr color=black>
	<br>


	</body>
	</html>
//


koh5_pano



Your browser does not support the HTML5 canvas element.


Drag mouse to navigate.

Navigation





17.Aug.2010, Martin Wengenmayer