PageSourceSearch

https://anr.fr/typo3temp/compressor/merged-0616f0da75f7486fed0f401…59827196f6d78df12b96a7257fa2a.js?1790781173

js anr.fr collected 2026-10-01 09:26:12 UTC 3,821,221 bytes, 23,829 lines download raw bytes

1
2document.addEventListener('scroll', () => {
3    let search = document.getElementsByClassName('primary-menu__item__search')[0];
4    let logo = document.getElementsByClassName('primary-menu__item__logo')[0];
5    if (window.innerHeight < 900 && window.innerWidth > 1090 && window.innerWidth < 1330) {
6        if (window.scrollY >= window.innerHeight - 44) {
7            search.classList.add('scroll-show');
8            logo.classList.add('scroll-show');
9        } else {
10            search.classList.remove('scroll-show');
11            logo.classList.remove('scroll-show');
12        }
13    } else {
14        search.classList.remove('scroll-show');
15        logo.classList.remove('scroll-show');
16    }
17});
18
19window.addEventListener('resize', () => {
20    let search = document.getElementsByClassName('primary-menu__item__search')[0];
21    let logo = document.getElementsByClassName('primary-menu__item__logo')[0];
22    if (window.innerHeight < 900 && window.innerWidth > 1090 && window.innerWidth < 1330) {
23        if (window.scrollY >= window.innerHeight - 44) {
24            search.classList.add('scroll-show');
25            logo.classList.add('scroll-show');
26        } else {
27            search.classList.remove('scroll-show');
28            logo.classList.remove('scroll-show');
29        }
30    } else {
31        search.classList.remove('scroll-show');
32        logo.classList.remove('scroll-show');
33    }
34});
35
vendor: 42,881 bytes, lines 36-1624
36/*!
37 * jQuery JavaScript Library v3.3.1
38 * https://jquery.com/
39 *
40 * Includes Sizzle.js
41 * https://sizzlejs.com/
42 *
43 * Copyright JS Foundation and other contributors
44 * Released under the MIT license
45 * https://jquery.org/license
46 *
47 * Date: 2018-01-20T17:24Z
48 */
49( function( global, factory ) {
50
51	"use strict";
52
53	if ( typeof module === "object" && typeof module.exports === "object" ) {
54
55		// For CommonJS and CommonJS-like environments where a proper `window`
56		// is present, execute the factory and get jQuery.
57		// For environments that do not have a `window` with a `document`
58		// (such as Node.js), expose a factory as module.exports.
59		// This accentuates the need for the creation of a real `window`.
60		// e.g. var jQuery = require("jquery")(window);
61		// See ticket #14549 for more info.
62		module.exports = global.document ?
63			factory( global, true ) :
64			function( w ) {
65				if ( !w.document ) {
66					throw new Error( "jQuery requires a window with a document" );
67				}
68				return factory( w );
69			};
70	} else {
71		factory( global );
72	}
73
74// Pass this if window is not defined yet
75} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
76
77// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
78// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
79// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
80// enough that all such attempts are guarded in a try block.
81"use strict";
82
83var arr = [];
84
85var document = window.document;
86
87var getProto = Object.getPrototypeOf;
88
89var slice = arr.slice;
90
91var concat = arr.concat;
92
93var push = arr.push;
94
95var indexOf = arr.indexOf;
96
97var class2type = {};
98
99var toString = class2type.toString;
100
101var hasOwn = class2type.hasOwnProperty;
102
103var fnToString = hasOwn.toString;
104
105var ObjectFunctionString = fnToString.call( Object );
106
107var support = {};
108
109var isFunction = function isFunction( obj ) {
110
111      // Support: Chrome <=57, Firefox <=52
112      // In some browsers, typeof returns "function" for HTML <object> elements
113      // (i.e., `typeof document.createElement( "object" ) === "function"`).
114      // We don't want to classify *any* DOM node as a function.
115      return typeof obj === "function" && typeof obj.nodeType !== "number";
116  };
117
118
119var isWindow = function isWindow( obj ) {
120		return obj != null && obj === obj.window;
121	};
122
123
124
125
126	var preservedScriptAttributes = {
127		type: true,
128		src: true,
129		noModule: true
130	};
131
132	function DOMEval( code, doc, node ) {
133		doc = doc || document;
134
135		var i,
136			script = doc.createElement( "script" );
137
138		script.text = code;
139		if ( node ) {
140			for ( i in preservedScriptAttributes ) {
141				if ( node[ i ] ) {
142					script[ i ] = node[ i ];
143				}
144			}
145		}
146		doc.head.appendChild( script ).parentNode.removeChild( script );
147	}
148
149
150function toType( obj ) {
151	if ( obj == null ) {
152		return obj + "";
153	}
154
155	// Support: Android <=2.3 only (functionish RegExp)
156	return typeof obj === "object" || typeof obj === "function" ?
157		class2type[ toString.call( obj ) ] || "object" :
158		typeof obj;
159}
160/* global Symbol */
161// Defining this global in .eslintrc.json would create a danger of using the global
162// unguarded in another place, it seems safer to define global only for this module
163
164
165
166var
167	version = "3.3.1",
168
169	// Define a local copy of jQuery
170	jQuery = function( selector, context ) {
171
172		// The jQuery object is actually just the init constructor 'enhanced'
173		// Need init if jQuery is called (just allow error to be thrown if not included)
174		return new jQuery.fn.init( selector, context );
175	},
176
177	// Support: Android <=4.0 only
178	// Make sure we trim BOM and NBSP
179	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
180
181jQuery.fn = jQuery.prototype = {
182
183	// The current version of jQuery being used
184	jquery: version,
185
186	constructor: jQuery,
187
188	// The default length of a jQuery object is 0
189	length: 0,
190
191	toArray: function() {
192		return slice.call( this );
193	},
194
195	// Get the Nth element in the matched element set OR
196	// Get the whole matched element set as a clean array
197	get: function( num ) {
198
199		// Return all the elements in a clean array
200		if ( num == null ) {
201			return slice.call( this );
202		}
203
204		// Return just the one element from the set
205		return num < 0 ? this[ num + this.length ] : this[ num ];
206	},
207
208	// Take an array of elements and push it onto the stack
209	// (returning the new matched element set)
210	pushStack: function( elems ) {
211
212		// Build a new jQuery matched element set
213		var ret = jQuery.merge( this.constructor(), elems );
214
215		// Add the old object onto the stack (as a reference)
216		ret.prevObject = this;
217
218		// Return the newly-formed element set
219		return ret;
220	},
221
222	// Execute a callback for every element in the matched set.
223	each: function( callback ) {
224		return jQuery.each( this, callback );
225	},
226
227	map: function( callback ) {
228		return this.pushStack( jQuery.map( this, function( elem, i ) {
229			return callback.call( elem, i, elem );
230		} ) );
231	},
232
233	slice: function() {
234		return this.pushStack( slice.apply( this, arguments ) );
235	},
236
237	first: function() {
238		return this.eq( 0 );
239	},
240
241	last: function() {
242		return this.eq( -1 );
243	},
244
245	eq: function( i ) {
246		var len = this.length,
247			j = +i + ( i < 0 ? len : 0 );
248		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
249	},
250
251	end: function() {
252		return this.prevObject || this.constructor();
253	},
254
255	// For internal use only.
256	// Behaves like an Array's method, not like a jQuery method.
257	push: push,
258	sort: arr.sort,
259	splice: arr.splice
260};
261
262jQuery.extend = jQuery.fn.extend = function() {
263	var options, name, src, copy, copyIsArray, clone,
264		target = arguments[ 0 ] || {},
265		i = 1,
266		length = arguments.length,
267		deep = false;
268
269	// Handle a deep copy situation
270	if ( typeof target === "boolean" ) {
271		deep = target;
272
273		// Skip the boolean and the target
274		target = arguments[ i ] || {};
275		i++;
276	}
277
278	// Handle case when target is a string or something (possible in deep copy)
279	if ( typeof target !== "object" && !isFunction( target ) ) {
280		target = {};
281	}
282
283	// Extend jQuery itself if only one argument is passed
284	if ( i === length ) {
285		target = this;
286		i--;
287	}
288
289	for ( ; i < length; i++ ) {
290
291		// Only deal with non-null/undefined values
292		if ( ( options = arguments[ i ] ) != null ) {
293
294			// Extend the base object
295			for ( name in options ) {
296				src = target[ name ];
297				copy = options[ name ];
298
299				// Prevent never-ending loop
300				if ( target === copy ) {
301					continue;
302				}
303
304				// Recurse if we're merging plain objects or arrays
305				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
306					( copyIsArray = Array.isArray( copy ) ) ) ) {
307
308					if ( copyIsArray ) {
309						copyIsArray = false;
310						clone = src && Array.isArray( src ) ? src : [];
311
312					} else {
313						clone = src && jQuery.isPlainObject( src ) ? src : {};
314					}
315
316					// Never move original objects, clone them
317					target[ name ] = jQuery.extend( deep, clone, copy );
318
319				// Don't bring in undefined values
320				} else if ( copy !== undefined ) {
321					target[ name ] = copy;
322				}
323			}
324		}
325	}
326
327	// Return the modified object
328	return target;
329};
330
331jQuery.extend( {
332
333	// Unique for each copy of jQuery on the page
334	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
335
336	// Assume jQuery is ready without the ready module
337	isReady: true,
338
339	error: function( msg ) {
340		throw new Error( msg );
341	},
342
343	noop: function() {},
344
345	isPlainObject: function( obj ) {
346		var proto, Ctor;
347
348		// Detect obvious negatives
349		// Use toString instead of jQuery.type to catch host objects
350		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
351			return false;
352		}
353
354		proto = getProto( obj );
355
356		// Objects with no prototype (e.g., `Object.create( null )`) are plain
357		if ( !proto ) {
358			return true;
359		}
360
361		// Objects with prototype are plain iff they were constructed by a global Object function
362		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
363		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
364	},
365
366	isEmptyObject: function( obj ) {
367
368		/* eslint-disable no-unused-vars */
369		// See https://github.com/eslint/eslint/issues/6125
370		var name;
371
372		for ( name in obj ) {
373			return false;
374		}
375		return true;
376	},
377
378	// Evaluates a script in a global context
379	globalEval: function( code ) {
380		DOMEval( code );
381	},
382
383	each: function( obj, callback ) {
384		var length, i = 0;
385
386		if ( isArrayLike( obj ) ) {
387			length = obj.length;
388			for ( ; i < length; i++ ) {
389				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
390					break;
391				}
392			}
393		} else {
394			for ( i in obj ) {
395				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
396					break;
397				}
398			}
399		}
400
401		return obj;
402	},
403
404	// Support: Android <=4.0 only
405	trim: function( text ) {
406		return text == null ?
407			"" :
408			( text + "" ).replace( rtrim, "" );
409	},
410
411	// results is for internal usage only
412	makeArray: function( arr, results ) {
413		var ret = results || [];
414
415		if ( arr != null ) {
416			if ( isArrayLike( Object( arr ) ) ) {
417				jQuery.merge( ret,
418					typeof arr === "string" ?
419					[ arr ] : arr
420				);
421			} else {
422				push.call( ret, arr );
423			}
424		}
425
426		return ret;
427	},
428
429	inArray: function( elem, arr, i ) {
430		return arr == null ? -1 : indexOf.call( arr, elem, i );
431	},
432
433	// Support: Android <=4.0 only, PhantomJS 1 only
434	// push.apply(_, arraylike) throws on ancient WebKit
435	merge: function( first, second ) {
436		var len = +second.length,
437			j = 0,
438			i = first.length;
439
440		for ( ; j < len; j++ ) {
441			first[ i++ ] = second[ j ];
442		}
443
444		first.length = i;
445
446		return first;
447	},
448
449	grep: function( elems, callback, invert ) {
450		var callbackInverse,
451			matches = [],
452			i = 0,
453			length = elems.length,
454			callbackExpect = !invert;
455
456		// Go through the array, only saving the items
457		// that pass the validator function
458		for ( ; i < length; i++ ) {
459			callbackInverse = !callback( elems[ i ], i );
460			if ( callbackInverse !== callbackExpect ) {
461				matches.push( elems[ i ] );
462			}
463		}
464
465		return matches;
466	},
467
468	// arg is for internal usage only
469	map: function( elems, callback, arg ) {
470		var length, value,
471			i = 0,
472			ret = [];
473
474		// Go through the array, translating each of the items to their new values
475		if ( isArrayLike( elems ) ) {
476			length = elems.length;
477			for ( ; i < length; i++ ) {
478				value = callback( elems[ i ], i, arg );
479
480				if ( value != null ) {
481					ret.push( value );
482				}
483			}
484
485		// Go through every key on the object,
486		} else {
487			for ( i in elems ) {
488				value = callback( elems[ i ], i, arg );
489
490				if ( value != null ) {
491					ret.push( value );
492				}
493			}
494		}
495
496		// Flatten any nested arrays
497		return concat.apply( [], ret );
498	},
499
500	// A global GUID counter for objects
501	guid: 1,
502
503	// jQuery.support is not used in Core but other projects attach their
504	// properties to it so it needs to exist.
505	support: support
506} );
507
508if ( typeof Symbol === "function" ) {
509	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
510}
511
512// Populate the class2type map
513jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
514function( i, name ) {
515	class2type[ "[object " + name + "]" ] = name.toLowerCase();
516} );
517
518function isArrayLike( obj ) {
519
520	// Support: real iOS 8.2 only (not reproducible in simulator)
521	// `in` check used to prevent JIT error (gh-2145)
522	// hasOwn isn't used here due to false negatives
523	// regarding Nodelist length in IE
524	var length = !!obj && "length" in obj && obj.length,
525		type = toType( obj );
526
527	if ( isFunction( obj ) || isWindow( obj ) ) {
528		return false;
529	}
530
531	return type === "array" || length === 0 ||
532		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
533}
534var Sizzle =
535/*!
536 * Sizzle CSS Selector Engine v2.3.3
537 * https://sizzlejs.com/
538 *
539 * Copyright jQuery Foundation and other contributors
540 * Released under the MIT license
541 * http://jquery.org/license
542 *
543 * Date: 2016-08-08
544 */
545(function( window ) {
546
547var i,
548	support,
549	Expr,
550	getText,
551	isXML,
552	tokenize,
553	compile,
554	select,
555	outermostContext,
556	sortInput,
557	hasDuplicate,
558
559	// Local document vars
560	setDocument,
561	document,
562	docElem,
563	documentIsHTML,
564	rbuggyQSA,
565	rbuggyMatches,
566	matches,
567	contains,
568
569	// Instance-specific data
570	expando = "sizzle" + 1 * new Date(),
571	preferredDoc = window.document,
572	dirruns = 0,
573	done = 0,
574	classCache = createCache(),
575	tokenCache = createCache(),
576	compilerCache = createCache(),
577	sortOrder = function( a, b ) {
578		if ( a === b ) {
579			hasDuplicate = true;
580		}
581		return 0;
582	},
583
584	// Instance methods
585	hasOwn = ({}).hasOwnProperty,
586	arr = [],
587	pop = arr.pop,
588	push_native = arr.push,
589	push = arr.push,
590	slice = arr.slice,
591	// Use a stripped-down indexOf as it's faster than native
592	// https://jsperf.com/thor-indexof-vs-for/5
593	indexOf = function( list, elem ) {
594		var i = 0,
595			len = list.length;
596		for ( ; i < len; i++ ) {
597			if ( list[i] === elem ) {
598				return i;
599			}
600		}
601		return -1;
602	},
603
604	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
605
606	// Regular expressions
607
608	// http://www.w3.org/TR/css3-selectors/#whitespace
609	whitespace = "[\\x20\\t\\r\\n\\f]",
610
611	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
612	identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
613
614	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
615	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
616		// Operator (capture 2)
617		"*([*^$|!~]?=)" + whitespace +
618		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
619		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
620		"*\\]",
621
622	pseudos = ":(" + identifier + ")(?:\\((" +
623		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
624		// 1. quoted (capture 3; capture 4 or capture 5)
625		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
626		// 2. simple (capture 6)
627		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
628		// 3. anything else (capture 2)
629		".*" +
630		")\\)|)",
631
632	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
633	rwhitespace = new RegExp( whitespace + "+", "g" ),
634	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
635
636	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
637	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
638
639	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
640
641	rpseudo = new RegExp( pseudos ),
642	ridentifier = new RegExp( "^" + identifier + "$" ),
643
644	matchExpr = {
645		"ID": new RegExp( "^#(" + identifier + ")" ),
646		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
647		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
648		"ATTR": new RegExp( "^" + attributes ),
649		"PSEUDO": new RegExp( "^" + pseudos ),
650		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
651			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
652			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
653		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
654		// For use in libraries implementing .is()
655		// We use this for POS matching in `select`
656		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
657			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
658	},
659
660	rinputs = /^(?:input|select|textarea|button)$/i,
661	rheader = /^h\d$/i,
662
663	rnative = /^[^{]+\{\s*\[native \w/,
664
665	// Easily-parseable/retrievable ID or TAG or CLASS selectors
666	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
667
668	rsibling = /[+~]/,
669
670	// CSS escapes
671	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
672	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
673	funescape = function( _, escaped, escapedWhitespace ) {
674		var high = "0x" + escaped - 0x10000;
675		// NaN means non-codepoint
676		// Support: Firefox<24
677		// Workaround erroneous numeric interpretation of +"0x"
678		return high !== high || escapedWhitespace ?
679			escaped :
680			high < 0 ?
681				// BMP codepoint
682				String.fromCharCode( high + 0x10000 ) :
683				// Supplemental Plane codepoint (surrogate pair)
684				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
685	},
686
687	// CSS string/identifier serialization
688	// https://drafts.csswg.org/cssom/#common-serializing-idioms
689	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
690	fcssescape = function( ch, asCodePoint ) {
691		if ( asCodePoint ) {
692
693			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
694			if ( ch === "\0" ) {
695				return "\uFFFD";
696			}
697
698			// Control characters and (dependent upon position) numbers get escaped as code points
699			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
700		}
701
702		// Other potentially-special ASCII characters get backslash-escaped
703		return "\\" + ch;
704	},
705
706	// Used for iframes
707	// See setDocument()
708	// Removing the function wrapper causes a "Permission Denied"
709	// error in IE
710	unloadHandler = function() {
711		setDocument();
712	},
713
714	disabledAncestor = addCombinator(
715		function( elem ) {
716			return elem.disabled === true && ("form" in elem || "label" in elem);
717		},
718		{ dir: "parentNode", next: "legend" }
719	);
720
721// Optimize for push.apply( _, NodeList )
722try {
723	push.apply(
724		(arr = slice.call( preferredDoc.childNodes )),
725		preferredDoc.childNodes
726	);
727	// Support: Android<4.0
728	// Detect silently failing push.apply
729	arr[ preferredDoc.childNodes.length ].nodeType;
730} catch ( e ) {
731	push = { apply: arr.length ?
732
733		// Leverage slice if possible
734		function( target, els ) {
735			push_native.apply( target, slice.call(els) );
736		} :
737
738		// Support: IE<9
739		// Otherwise append directly
740		function( target, els ) {
741			var j = target.length,
742				i = 0;
743			// Can't trust NodeList.length
744			while ( (target[j++] = els[i++]) ) {}
745			target.length = j - 1;
746		}
747	};
748}
749
750function Sizzle( selector, context, results, seed ) {
751	var m, i, elem, nid, match, groups, newSelector,
752		newContext = context && context.ownerDocument,
753
754		// nodeType defaults to 9, since context defaults to document
755		nodeType = context ? context.nodeType : 9;
756
757	results = results || [];
758
759	// Return early from calls with invalid selector or context
760	if ( typeof selector !== "string" || !selector ||
761		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
762
763		return results;
764	}
765
766	// Try to shortcut find operations (as opposed to filters) in HTML documents
767	if ( !seed ) {
768
769		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
770			setDocument( context );
771		}
772		context = context || document;
773
774		if ( documentIsHTML ) {
775
776			// If the selector is sufficiently simple, try using a "get*By*" DOM method
777			// (excepting DocumentFragment context, where the methods don't exist)
778			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
779
780				// ID selector
781				if ( (m = match[1]) ) {
782
783					// Document context
784					if ( nodeType === 9 ) {
785						if ( (elem = context.getElementById( m )) ) {
786
787							// Support: IE, Opera, Webkit
788							// TODO: identify versions
789							// getElementById can match elements by name instead of ID
790							if ( elem.id === m ) {
791								results.push( elem );
792								return results;
793							}
794						} else {
795							return results;
796						}
797
798					// Element context
799					} else {
800
801						// Support: IE, Opera, Webkit
802						// TODO: identify versions
803						// getElementById can match elements by name instead of ID
804						if ( newContext && (elem = newContext.getElementById( m )) &&
805							contains( context, elem ) &&
806							elem.id === m ) {
807
808							results.push( elem );
809							return results;
810						}
811					}
812
813				// Type selector
814				} else if ( match[2] ) {
815					push.apply( results, context.getElementsByTagName( selector ) );
816					return results;
817
818				// Class selector
819				} else if ( (m = match[3]) && support.getElementsByClassName &&
820					context.getElementsByClassName ) {
821
822					push.apply( results, context.getElementsByClassName( m ) );
823					return results;
824				}
825			}
826
827			// Take advantage of querySelectorAll
828			if ( support.qsa &&
829				!compilerCache[ selector + " " ] &&
830				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
831
832				if ( nodeType !== 1 ) {
833					newContext = context;
834					newSelector = selector;
835
836				// qSA looks outside Element context, which is not what we want
837				// Thanks to Andrew Dupont for this workaround technique
838				// Support: IE <=8
839				// Exclude object elements
840				} else if ( context.nodeName.toLowerCase() !== "object" ) {
841
842					// Capture the context ID, setting it first if necessary
843					if ( (nid = context.getAttribute( "id" )) ) {
844						nid = nid.replace( rcssescape, fcssescape );
845					} else {
846						context.setAttribute( "id", (nid = expando) );
847					}
848
849					// Prefix every selector in the list
850					groups = tokenize( selector );
851					i = groups.length;
852					while ( i-- ) {
853						groups[i] = "#" + nid + " " + toSelector( groups[i] );
854					}
855					newSelector = groups.join( "," );
856
857					// Expand context for sibling selectors
858					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
859						context;
860				}
861
862				if ( newSelector ) {
863					try {
864						push.apply( results,
865							newContext.querySelectorAll( newSelector )
866						);
867						return results;
868					} catch ( qsaError ) {
869					} finally {
870						if ( nid === expando ) {
871							context.removeAttribute( "id" );
872						}
873					}
874				}
875			}
876		}
877	}
878
879	// All others
880	return select( selector.replace( rtrim, "$1" ), context, results, seed );
881}
882
883/**
884 * Create key-value caches of limited size
885 * @returns {function(string, object)} Returns the Object data after storing it on itself with
886 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
887 *	deleting the oldest entry
888 */
889function createCache() {
890	var keys = [];
891
892	function cache( key, value ) {
893		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
894		if ( keys.push( key + " " ) > Expr.cacheLength ) {
895			// Only keep the most recent entries
896			delete cache[ keys.shift() ];
897		}
898		return (cache[ key + " " ] = value);
899	}
900	return cache;
901}
902
903/**
904 * Mark a function for special use by Sizzle
905 * @param {Function} fn The function to mark
906 */
907function markFunction( fn ) {
908	fn[ expando ] = true;
909	return fn;
910}
911
912/**
913 * Support testing using an element
914 * @param {Function} fn Passed the created element and returns a boolean result
915 */
916function assert( fn ) {
917	var el = document.createElement("fieldset");
918
919	try {
920		return !!fn( el );
921	} catch (e) {
922		return false;
923	} finally {
924		// Remove from its parent by default
925		if ( el.parentNode ) {
926			el.parentNode.removeChild( el );
927		}
928		// release memory in IE
929		el = null;
930	}
931}
932
933/**
934 * Adds the same handler for all of the specified attrs
935 * @param {String} attrs Pipe-separated list of attributes
936 * @param {Function} handler The method that will be applied
937 */
938function addHandle( attrs, handler ) {
939	var arr = attrs.split("|"),
940		i = arr.length;
941
942	while ( i-- ) {
943		Expr.attrHandle[ arr[i] ] = handler;
944	}
945}
946
947/**
948 * Checks document order of two siblings
949 * @param {Element} a
950 * @param {Element} b
951 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
952 */
953function siblingCheck( a, b ) {
954	var cur = b && a,
955		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
956			a.sourceIndex - b.sourceIndex;
957
958	// Use IE sourceIndex if available on both nodes
959	if ( diff ) {
960		return diff;
961	}
962
963	// Check if b follows a
964	if ( cur ) {
965		while ( (cur = cur.nextSibling) ) {
966			if ( cur === b ) {
967				return -1;
968			}
969		}
970	}
971
972	return a ? 1 : -1;
973}
974
975/**
976 * Returns a function to use in pseudos for input types
977 * @param {String} type
978 */
979function createInputPseudo( type ) {
980	return function( elem ) {
981		var name = elem.nodeName.toLowerCase();
982		return name === "input" && elem.type === type;
983	};
984}
985
986/**
987 * Returns a function to use in pseudos for buttons
988 * @param {String} type
989 */
990function createButtonPseudo( type ) {
991	return function( elem ) {
992		var name = elem.nodeName.toLowerCase();
993		return (name === "input" || name === "button") && elem.type === type;
994	};
995}
996
997/**
998 * Returns a function to use in pseudos for :enabled/:disabled
999 * @param {Boolean} disabled true for :disabled; false for :enabled
1000 */
1001function createDisabledPseudo( disabled ) {
1002
1003	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
1004	return function( elem ) {
1005
1006		// Only certain elements can match :enabled or :disabled
1007		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
1008		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
1009		if ( "form" in elem ) {
1010
1011			// Check for inherited disabledness on relevant non-disabled elements:
1012			// * listed form-associated elements in a disabled fieldset
1013			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
1014			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
1015			// * option elements in a disabled optgroup
1016			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
1017			// All such elements have a "form" property.
1018			if ( elem.parentNode && elem.disabled === false ) {
1019
1020				// Option elements defer to a parent optgroup if present
1021				if ( "label" in elem ) {
1022					if ( "label" in elem.parentNode ) {
1023						return elem.parentNode.disabled === disabled;
1024					} else {
1025						return elem.disabled === disabled;
1026					}
1027				}
1028
1029				// Support: IE 6 - 11
1030				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
1031				return elem.isDisabled === disabled ||
1032
1033					// Where there is no isDisabled, check manually
1034					/* jshint -W018 */
1035					elem.isDisabled !== !disabled &&
1036						disabledAncestor( elem ) === disabled;
1037			}
1038
1039			return elem.disabled === disabled;
1040
1041		// Try to winnow out elements that can't be disabled before trusting the disabled property.
1042		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
1043		// even exist on them, let alone have a boolean value.
1044		} else if ( "label" in elem ) {
1045			return elem.disabled === disabled;
1046		}
1047
1048		// Remaining elements are neither :enabled nor :disabled
1049		return false;
1050	};
1051}
1052
1053/**
1054 * Returns a function to use in pseudos for positionals
1055 * @param {Function} fn
1056 */
1057function createPositionalPseudo( fn ) {
1058	return markFunction(function( argument ) {
1059		argument = +argument;
1060		return markFunction(function( seed, matches ) {
1061			var j,
1062				matchIndexes = fn( [], seed.length, argument ),
1063				i = matchIndexes.length;
1064
1065			// Match elements found at the specified indexes
1066			while ( i-- ) {
1067				if ( seed[ (j = matchIndexes[i]) ] ) {
1068					seed[j] = !(matches[j] = seed[j]);
1069				}
1070			}
1071		});
1072	});
1073}
1074
1075/**
1076 * Checks a node for validity as a Sizzle context
1077 * @param {Element|Object=} context
1078 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1079 */
1080function testContext( context ) {
1081	return context && typeof context.getElementsByTagName !== "undefined" && context;
1082}
1083
1084// Expose support vars for convenience
1085support = Sizzle.support = {};
1086
1087/**
1088 * Detects XML nodes
1089 * @param {Element|Object} elem An element or a document
1090 * @returns {Boolean} True iff elem is a non-HTML XML node
1091 */
1092isXML = Sizzle.isXML = function( elem ) {
1093	// documentElement is verified for cases where it doesn't yet exist
1094	// (such as loading iframes in IE - #4833)
1095	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1096	return documentElement ? documentElement.nodeName !== "HTML" : false;
1097};
1098
1099/**
1100 * Sets document-related variables once based on the current document
1101 * @param {Element|Object} [doc] An element or document object to use to set the document
1102 * @returns {Object} Returns the current document
1103 */
1104setDocument = Sizzle.setDocument = function( node ) {
1105	var hasCompare, subWindow,
1106		doc = node ? node.ownerDocument || node : preferredDoc;
1107
1108	// Return early if doc is invalid or already selected
1109	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1110		return document;
1111	}
1112
1113	// Update global variables
1114	document = doc;
1115	docElem = document.documentElement;
1116	documentIsHTML = !isXML( document );
1117
1118	// Support: IE 9-11, Edge
1119	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1120	if ( preferredDoc !== document &&
1121		(subWindow = document.defaultView) && subWindow.top !== subWindow ) {
1122
1123		// Support: IE 11, Edge
1124		if ( subWindow.addEventListener ) {
1125			subWindow.addEventListener( "unload", unloadHandler, false );
1126
1127		// Support: IE 9 - 10 only
1128		} else if ( subWindow.attachEvent ) {
1129			subWindow.attachEvent( "onunload", unloadHandler );
1130		}
1131	}
1132
1133	/* Attributes
1134	---------------------------------------------------------------------- */
1135
1136	// Support: IE<8
1137	// Verify that getAttribute really returns attributes and not properties
1138	// (excepting IE8 booleans)
1139	support.attributes = assert(function( el ) {
1140		el.className = "i";
1141		return !el.getAttribute("className");
1142	});
1143
1144	/* getElement(s)By*
1145	---------------------------------------------------------------------- */
1146
1147	// Check if getElementsByTagName("*") returns only elements
1148	support.getElementsByTagName = assert(function( el ) {
1149		el.appendChild( document.createComment("") );
1150		return !el.getElementsByTagName("*").length;
1151	});
1152
1153	// Support: IE<9
1154	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
1155
1156	// Support: IE<10
1157	// Check if getElementById returns elements by name
1158	// The broken getElementById methods don't pick up programmatically-set names,
1159	// so use a roundabout getElementsByName test
1160	support.getById = assert(function( el ) {
1161		docElem.appendChild( el ).id = expando;
1162		return !document.getElementsByName || !document.getElementsByName( expando ).length;
1163	});
1164
1165	// ID filter and find
1166	if ( support.getById ) {
1167		Expr.filter["ID"] = function( id ) {
1168			var attrId = id.replace( runescape, funescape );
1169			return function( elem ) {
1170				return elem.getAttribute("id") === attrId;
1171			};
1172		};
1173		Expr.find["ID"] = function( id, context ) {
1174			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1175				var elem = context.getElementById( id );
1176				return elem ? [ elem ] : [];
1177			}
1178		};
1179	} else {
1180		Expr.filter["ID"] =  function( id ) {
1181			var attrId = id.replace( runescape, funescape );
1182			return function( elem ) {
1183				var node = typeof elem.getAttributeNode !== "undefined" &&
1184					elem.getAttributeNode("id");
1185				return node && node.value === attrId;
1186			};
1187		};
1188
1189		// Support: IE 6 - 7 only
1190		// getElementById is not reliable as a find shortcut
1191		Expr.find["ID"] = function( id, context ) {
1192			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1193				var node, i, elems,
1194					elem = context.getElementById( id );
1195
1196				if ( elem ) {
1197
1198					// Verify the id attribute
1199					node = elem.getAttributeNode("id");
1200					if ( node && node.value === id ) {
1201						return [ elem ];
1202					}
1203
1204					// Fall back on getElementsByName
1205					elems = context.getElementsByName( id );
1206					i = 0;
1207					while ( (elem = elems[i++]) ) {
1208						node = elem.getAttributeNode("id");
1209						if ( node && node.value === id ) {
1210							return [ elem ];
1211						}
1212					}
1213				}
1214
1215				return [];
1216			}
1217		};
1218	}
1219
1220	// Tag
1221	Expr.find["TAG"] = support.getElementsByTagName ?
1222		function( tag, context ) {
1223			if ( typeof context.getElementsByTagName !== "undefined" ) {
1224				return context.getElementsByTagName( tag );
1225
1226			// DocumentFragment nodes don't have gEBTN
1227			} else if ( support.qsa ) {
1228				return context.querySelectorAll( tag );
1229			}
1230		} :
1231
1232		function( tag, context ) {
1233			var elem,
1234				tmp = [],
1235				i = 0,
1236				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1237				results = context.getElementsByTagName( tag );
1238
1239			// Filter out possible comments
1240			if ( tag === "*" ) {
1241				while ( (elem = results[i++]) ) {
1242					if ( elem.nodeType === 1 ) {
1243						tmp.push( elem );
1244					}
1245				}
1246
1247				return tmp;
1248			}
1249			return results;
1250		};
1251
1252	// Class
1253	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1254		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1255			return context.getElementsByClassName( className );
1256		}
1257	};
1258
1259	/* QSA/matchesSelector
1260	---------------------------------------------------------------------- */
1261
1262	// QSA and matchesSelector support
1263
1264	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1265	rbuggyMatches = [];
1266
1267	// qSa(:focus) reports false when true (Chrome 21)
1268	// We allow this because of a bug in IE8/9 that throws an error
1269	// whenever `document.activeElement` is accessed on an iframe
1270	// So, we allow :focus to pass through QSA all the time to avoid the IE error
1271	// See https://bugs.jquery.com/ticket/13378
1272	rbuggyQSA = [];
1273
1274	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
1275		// Build QSA regex
1276		// Regex strategy adopted from Diego Perini
1277		assert(function( el ) {
1278			// Select is set to empty string on purpose
1279			// This is to test IE's treatment of not explicitly
1280			// setting a boolean content attribute,
1281			// since its presence should be enough
1282			// https://bugs.jquery.com/ticket/12359
1283			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
1284				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
1285				"<option selected=''></option></select>";
1286
1287			// Support: IE8, Opera 11-12.16
1288			// Nothing should be selected when empty strings follow ^= or $= or *=
1289			// The test attribute must be unknown in Opera but "safe" for WinRT
1290			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1291			if ( el.querySelectorAll("[msallowcapture^='']").length ) {
1292				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1293			}
1294
1295			// Support: IE8
1296			// Boolean attributes and "value" are not treated correctly
1297			if ( !el.querySelectorAll("[selected]").length ) {
1298				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1299			}
1300
1301			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1302			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1303				rbuggyQSA.push("~=");
1304			}
1305
1306			// Webkit/Opera - :checked should return selected option elements
1307			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1308			// IE8 throws error here and will not see later tests
1309			if ( !el.querySelectorAll(":checked").length ) {
1310				rbuggyQSA.push(":checked");
1311			}
1312
1313			// Support: Safari 8+, iOS 8+
1314			// https://bugs.webkit.org/show_bug.cgi?id=136851
1315			// In-page `selector#id sibling-combinator selector` fails
1316			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1317				rbuggyQSA.push(".#.+[+~]");
1318			}
1319		});
1320
1321		assert(function( el ) {
1322			el.innerHTML = "<a href='' disabled='disabled'></a>" +
1323				"<select disabled='disabled'><option/></select>";
1324
1325			// Support: Windows 8 Native Apps
1326			// The type and name attributes are restricted during .innerHTML assignment
1327			var input = document.createElement("input");
1328			input.setAttribute( "type", "hidden" );
1329			el.appendChild( input ).setAttribute( "name", "D" );
1330
1331			// Support: IE8
1332			// Enforce case-sensitivity of name attribute
1333			if ( el.querySelectorAll("[name=d]").length ) {
1334				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1335			}
1336
1337			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1338			// IE8 throws error here and will not see later tests
1339			if ( el.querySelectorAll(":enabled").length !== 2 ) {
1340				rbuggyQSA.push( ":enabled", ":disabled" );
1341			}
1342
1343			// Support: IE9-11+
1344			// IE's :disabled selector does not pick up the children of disabled fieldsets
1345			docElem.appendChild( el ).disabled = true;
1346			if ( el.querySelectorAll(":disabled").length !== 2 ) {
1347				rbuggyQSA.push( ":enabled", ":disabled" );
1348			}
1349
1350			// Opera 10-11 does not throw on post-comma invalid pseudos
1351			el.querySelectorAll("*,:x");
1352			rbuggyQSA.push(",.*:");
1353		});
1354	}
1355
1356	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1357		docElem.webkitMatchesSelector ||
1358		docElem.mozMatchesSelector ||
1359		docElem.oMatchesSelector ||
1360		docElem.msMatchesSelector) )) ) {
1361
1362		assert(function( el ) {
1363			// Check to see if it's possible to do matchesSelector
1364			// on a disconnected node (IE 9)
1365			support.disconnectedMatch = matches.call( el, "*" );
1366
1367			// This should fail with an exception
1368			// Gecko does not error, returns false instead
1369			matches.call( el, "[s!='']:x" );
1370			rbuggyMatches.push( "!=", pseudos );
1371		});
1372	}
1373
1374	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1375	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1376
1377	/* Contains
1378	---------------------------------------------------------------------- */
1379	hasCompare = rnative.test( docElem.compareDocumentPosition );
1380
1381	// Element contains another
1382	// Purposefully self-exclusive
1383	// As in, an element does not contain itself
1384	contains = hasCompare || rnative.test( docElem.contains ) ?
1385		function( a, b ) {
1386			var adown = a.nodeType === 9 ? a.documentElement : a,
1387				bup = b && b.parentNode;
1388			return a === bup || !!( bup && bup.nodeType === 1 && (
1389				adown.contains ?
1390					adown.contains( bup ) :
1391					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1392			));
1393		} :
1394		function( a, b ) {
1395			if ( b ) {
1396				while ( (b = b.parentNode) ) {
1397					if ( b === a ) {
1398						return true;
1399					}
1400				}
1401			}
1402			return false;
1403		};
1404
1405	/* Sorting
1406	---------------------------------------------------------------------- */
1407
1408	// Document order sorting
1409	sortOrder = hasCompare ?
1410	function( a, b ) {
1411
1412		// Flag for duplicate removal
1413		if ( a === b ) {
1414			hasDuplicate = true;
1415			return 0;
1416		}
1417
1418		// Sort on method existence if only one input has compareDocumentPosition
1419		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1420		if ( compare ) {
1421			return compare;
1422		}
1423
1424		// Calculate position if both inputs belong to the same document
1425		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1426			a.compareDocumentPosition( b ) :
1427
1428			// Otherwise we know they are disconnected
1429			1;
1430
1431		// Disconnected nodes
1432		if ( compare & 1 ||
1433			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1434
1435			// Choose the first element that is related to our preferred document
1436			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1437				return -1;
1438			}
1439			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1440				return 1;
1441			}
1442
1443			// Maintain original order
1444			return sortInput ?
1445				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1446				0;
1447		}
1448
1449		return compare & 4 ? -1 : 1;
1450	} :
1451	function( a, b ) {
1452		// Exit early if the nodes are identical
1453		if ( a === b ) {
1454			hasDuplicate = true;
1455			return 0;
1456		}
1457
1458		var cur,
1459			i = 0,
1460			aup = a.parentNode,
1461			bup = b.parentNode,
1462			ap = [ a ],
1463			bp = [ b ];
1464
1465		// Parentless nodes are either documents or disconnected
1466		if ( !aup || !bup ) {
1467			return a === document ? -1 :
1468				b === document ? 1 :
1469				aup ? -1 :
1470				bup ? 1 :
1471				sortInput ?
1472				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1473				0;
1474
1475		// If the nodes are siblings, we can do a quick check
1476		} else if ( aup === bup ) {
1477			return siblingCheck( a, b );
1478		}
1479
1480		// Otherwise we need full lists of their ancestors for comparison
1481		cur = a;
1482		while ( (cur = cur.parentNode) ) {
1483			ap.unshift( cur );
1484		}
1485		cur = b;
1486		while ( (cur = cur.parentNode) ) {
1487			bp.unshift( cur );
1488		}
1489
1490		// Walk down the tree looking for a discrepancy
1491		while ( ap[i] === bp[i] ) {
1492			i++;
1493		}
1494
1495		return i ?
1496			// Do a sibling check if the nodes have a common ancestor
1497			siblingCheck( ap[i], bp[i] ) :
1498
1499			// Otherwise nodes in our document sort first
1500			ap[i] === preferredDoc ? -1 :
1501			bp[i] === preferredDoc ? 1 :
1502			0;
1503	};
1504
1505	return document;
1506};
1507
1508Sizzle.matches = function( expr, elements ) {
1509	return Sizzle( expr, null, null, elements );
1510};
1511
1512Sizzle.matchesSelector = function( elem, expr ) {
1513	// Set document vars if needed
1514	if ( ( elem.ownerDocument || elem ) !== document ) {
1515		setDocument( elem );
1516	}
1517
1518	// Make sure that attribute selectors are quoted
1519	expr = expr.replace( rattributeQuotes, "='$1']" );
1520
1521	if ( support.matchesSelector && documentIsHTML &&
1522		!compilerCache[ expr + " " ] &&
1523		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1524		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
1525
1526		try {
1527			var ret = matches.call( elem, expr );
1528
1529			// IE 9's matchesSelector returns false on disconnected nodes
1530			if ( ret || support.disconnectedMatch ||
1531					// As well, disconnected nodes are said to be in a document
1532					// fragment in IE 9
1533					elem.document && elem.document.nodeType !== 11 ) {
1534				return ret;
1535			}
1536		} catch (e) {}
1537	}
1538
1539	return Sizzle( expr, document, null, [ elem ] ).length > 0;
1540};
1541
1542Sizzle.contains = function( context, elem ) {
1543	// Set document vars if needed
1544	if ( ( context.ownerDocument || context ) !== document ) {
1545		setDocument( context );
1546	}
1547	return contains( context, elem );
1548};
1549
1550Sizzle.attr = function( elem, name ) {
1551	// Set document vars if needed
1552	if ( ( elem.ownerDocument || elem ) !== document ) {
1553		setDocument( elem );
1554	}
1555
1556	var fn = Expr.attrHandle[ name.toLowerCase() ],
1557		// Don't get fooled by Object.prototype properties (jQuery #13807)
1558		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1559			fn( elem, name, !documentIsHTML ) :
1560			undefined;
1561
1562	return val !== undefined ?
1563		val :
1564		support.attributes || !documentIsHTML ?
1565			elem.getAttribute( name ) :
1566			(val = elem.getAttributeNode(name)) && val.specified ?
1567				val.value :
1568				null;
1569};
1570
1571Sizzle.escape = function( sel ) {
1572	return (sel + "").replace( rcssescape, fcssescape );
1573};
1574
1575Sizzle.error = function( msg ) {
1576	throw new Error( "Syntax error, unrecognized expression: " + msg );
1577};
1578
1579/**
1580 * Document sorting and removing duplicates
1581 * @param {ArrayLike} results
1582 */
1583Sizzle.uniqueSort = function( results ) {
1584	var elem,
1585		duplicates = [],
1586		j = 0,
1587		i = 0;
1588
1589	// Unless we *know* we can detect duplicates, assume their presence
1590	hasDuplicate = !support.detectDuplicates;
1591	sortInput = !support.sortStable && results.slice( 0 );
1592	results.sort( sortOrder );
1593
1594	if ( hasDuplicate ) {
1595		while ( (elem = results[i++]) ) {
1596			if ( elem === results[ i ] ) {
1597				j = duplicates.push( i );
1598			}
1599		}
1600		while ( j-- ) {
1601			results.splice( duplicates[ j ], 1 );
1602		}
1603	}
1604
1605	// Clear input after sorting to release objects
1606	// See https://github.com/jquery/sizzle/pull/225
1607	sortInput = null;
1608
1609	return results;
1610};
1611
1612/**
1613 * Utility function for retrieving the text value of an array of DOM nodes
1614 * @param {Array|Element} elem
1615 */
1616getText = Sizzle.getText = function( elem ) {
1617	var node,
1618		ret = "",
1619		i = 0,
1620		nodeType = elem.nodeType;
1621
1622	if ( !nodeType ) {
1623		// If no nodeType, this is expected to be an array
1624		while ( (node = elem[i++]) ) {
vendor: 11,976 bytes, lines 1625-2023
1625			// Do not traverse comment nodes
1626			ret += getText( node );
1627		}
1628	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1629		// Use textContent for elements
1630		// innerText usage removed for consistency of new lines (jQuery #11153)
1631		if ( typeof elem.textContent === "string" ) {
1632			return elem.textContent;
1633		} else {
1634			// Traverse its children
1635			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1636				ret += getText( elem );
1637			}
1638		}
1639	} else if ( nodeType === 3 || nodeType === 4 ) {
1640		return elem.nodeValue;
1641	}
1642	// Do not include comment or processing instruction nodes
1643
1644	return ret;
1645};
1646
1647Expr = Sizzle.selectors = {
1648
1649	// Can be adjusted by the user
1650	cacheLength: 50,
1651
1652	createPseudo: markFunction,
1653
1654	match: matchExpr,
1655
1656	attrHandle: {},
1657
1658	find: {},
1659
1660	relative: {
1661		">": { dir: "parentNode", first: true },
1662		" ": { dir: "parentNode" },
1663		"+": { dir: "previousSibling", first: true },
1664		"~": { dir: "previousSibling" }
1665	},
1666
1667	preFilter: {
1668		"ATTR": function( match ) {
1669			match[1] = match[1].replace( runescape, funescape );
1670
1671			// Move the given value to match[3] whether quoted or unquoted
1672			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1673
1674			if ( match[2] === "~=" ) {
1675				match[3] = " " + match[3] + " ";
1676			}
1677
1678			return match.slice( 0, 4 );
1679		},
1680
1681		"CHILD": function( match ) {
1682			/* matches from matchExpr["CHILD"]
1683				1 type (only|nth|...)
1684				2 what (child|of-type)
1685				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1686				4 xn-component of xn+y argument ([+-]?\d*n|)
1687				5 sign of xn-component
1688				6 x of xn-component
1689				7 sign of y-component
1690				8 y of y-component
1691			*/
1692			match[1] = match[1].toLowerCase();
1693
1694			if ( match[1].slice( 0, 3 ) === "nth" ) {
1695				// nth-* requires argument
1696				if ( !match[3] ) {
1697					Sizzle.error( match[0] );
1698				}
1699
1700				// numeric x and y parameters for Expr.filter.CHILD
1701				// remember that false/true cast respectively to 0/1
1702				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1703				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1704
1705			// other types prohibit arguments
1706			} else if ( match[3] ) {
1707				Sizzle.error( match[0] );
1708			}
1709
1710			return match;
1711		},
1712
1713		"PSEUDO": function( match ) {
1714			var excess,
1715				unquoted = !match[6] && match[2];
1716
1717			if ( matchExpr["CHILD"].test( match[0] ) ) {
1718				return null;
1719			}
1720
1721			// Accept quoted arguments as-is
1722			if ( match[3] ) {
1723				match[2] = match[4] || match[5] || "";
1724
1725			// Strip excess characters from unquoted arguments
1726			} else if ( unquoted && rpseudo.test( unquoted ) &&
1727				// Get excess from tokenize (recursively)
1728				(excess = tokenize( unquoted, true )) &&
1729				// advance to the next closing parenthesis
1730				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1731
1732				// excess is a negative index
1733				match[0] = match[0].slice( 0, excess );
1734				match[2] = unquoted.slice( 0, excess );
1735			}
1736
1737			// Return only captures needed by the pseudo filter method (type and argument)
1738			return match.slice( 0, 3 );
1739		}
1740	},
1741
1742	filter: {
1743
1744		"TAG": function( nodeNameSelector ) {
1745			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1746			return nodeNameSelector === "*" ?
1747				function() { return true; } :
1748				function( elem ) {
1749					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1750				};
1751		},
1752
1753		"CLASS": function( className ) {
1754			var pattern = classCache[ className + " " ];
1755
1756			return pattern ||
1757				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1758				classCache( className, function( elem ) {
1759					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
1760				});
1761		},
1762
1763		"ATTR": function( name, operator, check ) {
1764			return function( elem ) {
1765				var result = Sizzle.attr( elem, name );
1766
1767				if ( result == null ) {
1768					return operator === "!=";
1769				}
1770				if ( !operator ) {
1771					return true;
1772				}
1773
1774				result += "";
1775
1776				return operator === "=" ? result === check :
1777					operator === "!=" ? result !== check :
1778					operator === "^=" ? check && result.indexOf( check ) === 0 :
1779					operator === "*=" ? check && result.indexOf( check ) > -1 :
1780					operator === "$=" ? check && result.slice( -check.length ) === check :
1781					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1782					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1783					false;
1784			};
1785		},
1786
1787		"CHILD": function( type, what, argument, first, last ) {
1788			var simple = type.slice( 0, 3 ) !== "nth",
1789				forward = type.slice( -4 ) !== "last",
1790				ofType = what === "of-type";
1791
1792			return first === 1 && last === 0 ?
1793
1794				// Shortcut for :nth-*(n)
1795				function( elem ) {
1796					return !!elem.parentNode;
1797				} :
1798
1799				function( elem, context, xml ) {
1800					var cache, uniqueCache, outerCache, node, nodeIndex, start,
1801						dir = simple !== forward ? "nextSibling" : "previousSibling",
1802						parent = elem.parentNode,
1803						name = ofType && elem.nodeName.toLowerCase(),
1804						useCache = !xml && !ofType,
1805						diff = false;
1806
1807					if ( parent ) {
1808
1809						// :(first|last|only)-(child|of-type)
1810						if ( simple ) {
1811							while ( dir ) {
1812								node = elem;
1813								while ( (node = node[ dir ]) ) {
1814									if ( ofType ?
1815										node.nodeName.toLowerCase() === name :
1816										node.nodeType === 1 ) {
1817
1818										return false;
1819									}
1820								}
1821								// Reverse direction for :only-* (if we haven't yet done so)
1822								start = dir = type === "only" && !start && "nextSibling";
1823							}
1824							return true;
1825						}
1826
1827						start = [ forward ? parent.firstChild : parent.lastChild ];
1828
1829						// non-xml :nth-child(...) stores cache data on `parent`
1830						if ( forward && useCache ) {
1831
1832							// Seek `elem` from a previously-cached index
1833
1834							// ...in a gzip-friendly way
1835							node = parent;
1836							outerCache = node[ expando ] || (node[ expando ] = {});
1837
1838							// Support: IE <9 only
1839							// Defend against cloned attroperties (jQuery gh-1709)
1840							uniqueCache = outerCache[ node.uniqueID ] ||
1841								(outerCache[ node.uniqueID ] = {});
1842
1843							cache = uniqueCache[ type ] || [];
1844							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1845							diff = nodeIndex && cache[ 2 ];
1846							node = nodeIndex && parent.childNodes[ nodeIndex ];
1847
1848							while ( (node = ++nodeIndex && node && node[ dir ] ||
1849
1850								// Fallback to seeking `elem` from the start
1851								(diff = nodeIndex = 0) || start.pop()) ) {
1852
1853								// When found, cache indexes on `parent` and break
1854								if ( node.nodeType === 1 && ++diff && node === elem ) {
1855									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
1856									break;
1857								}
1858							}
1859
1860						} else {
1861							// Use previously-cached element index if available
1862							if ( useCache ) {
1863								// ...in a gzip-friendly way
1864								node = elem;
1865								outerCache = node[ expando ] || (node[ expando ] = {});
1866
1867								// Support: IE <9 only
1868								// Defend against cloned attroperties (jQuery gh-1709)
1869								uniqueCache = outerCache[ node.uniqueID ] ||
1870									(outerCache[ node.uniqueID ] = {});
1871
1872								cache = uniqueCache[ type ] || [];
1873								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1874								diff = nodeIndex;
1875							}
1876
1877							// xml :nth-child(...)
1878							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
1879							if ( diff === false ) {
1880								// Use the same loop as above to seek `elem` from the start
1881								while ( (node = ++nodeIndex && node && node[ dir ] ||
1882									(diff = nodeIndex = 0) || start.pop()) ) {
1883
1884									if ( ( ofType ?
1885										node.nodeName.toLowerCase() === name :
1886										node.nodeType === 1 ) &&
1887										++diff ) {
1888
1889										// Cache the index of each encountered element
1890										if ( useCache ) {
1891											outerCache = node[ expando ] || (node[ expando ] = {});
1892
1893											// Support: IE <9 only
1894											// Defend against cloned attroperties (jQuery gh-1709)
1895											uniqueCache = outerCache[ node.uniqueID ] ||
1896												(outerCache[ node.uniqueID ] = {});
1897
1898											uniqueCache[ type ] = [ dirruns, diff ];
1899										}
1900
1901										if ( node === elem ) {
1902											break;
1903										}
1904									}
1905								}
1906							}
1907						}
1908
1909						// Incorporate the offset, then check against cycle size
1910						diff -= last;
1911						return diff === first || ( diff % first === 0 && diff / first >= 0 );
1912					}
1913				};
1914		},
1915
1916		"PSEUDO": function( pseudo, argument ) {
1917			// pseudo-class names are case-insensitive
1918			// http://www.w3.org/TR/selectors/#pseudo-classes
1919			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1920			// Remember that setFilters inherits from pseudos
1921			var args,
1922				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
1923					Sizzle.error( "unsupported pseudo: " + pseudo );
1924
1925			// The user may use createPseudo to indicate that
1926			// arguments are needed to create the filter function
1927			// just as Sizzle does
1928			if ( fn[ expando ] ) {
1929				return fn( argument );
1930			}
1931
1932			// But maintain support for old signatures
1933			if ( fn.length > 1 ) {
1934				args = [ pseudo, pseudo, "", argument ];
1935				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1936					markFunction(function( seed, matches ) {
1937						var idx,
1938							matched = fn( seed, argument ),
1939							i = matched.length;
1940						while ( i-- ) {
1941							idx = indexOf( seed, matched[i] );
1942							seed[ idx ] = !( matches[ idx ] = matched[i] );
1943						}
1944					}) :
1945					function( elem ) {
1946						return fn( elem, 0, args );
1947					};
1948			}
1949
1950			return fn;
1951		}
1952	},
1953
1954	pseudos: {
1955		// Potentially complex pseudos
1956		"not": markFunction(function( selector ) {
1957			// Trim the selector passed to compile
1958			// to avoid treating leading and trailing
1959			// spaces as combinators
1960			var input = [],
1961				results = [],
1962				matcher = compile( selector.replace( rtrim, "$1" ) );
1963
1964			return matcher[ expando ] ?
1965				markFunction(function( seed, matches, context, xml ) {
1966					var elem,
1967						unmatched = matcher( seed, null, xml, [] ),
1968						i = seed.length;
1969
1970					// Match elements unmatched by `matcher`
1971					while ( i-- ) {
1972						if ( (elem = unmatched[i]) ) {
1973							seed[i] = !(matches[i] = elem);
1974						}
1975					}
1976				}) :
1977				function( elem, context, xml ) {
1978					input[0] = elem;
1979					matcher( input, null, xml, results );
1980					// Don't keep the element (issue #299)
1981					input[0] = null;
1982					return !results.pop();
1983				};
1984		}),
1985
1986		"has": markFunction(function( selector ) {
1987			return function( elem ) {
1988				return Sizzle( selector, elem ).length > 0;
1989			};
1990		}),
1991
1992		"contains": markFunction(function( text ) {
1993			text = text.replace( runescape, funescape );
1994			return function( elem ) {
1995				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
1996			};
1997		}),
1998
1999		// "Whether an element is represented by a :lang() selector
2000		// is based solely on the element's language value
2001		// being equal to the identifier C,
2002		// or beginning with the identifier C immediately followed by "-".
2003		// The matching of C against the element's language value is performed case-insensitively.
2004		// The identifier C does not have to be a valid language name."
2005		// http://www.w3.org/TR/selectors/#lang-pseudo
2006		"lang": markFunction( function( lang ) {
2007			// lang value must be a valid identifier
2008			if ( !ridentifier.test(lang || "") ) {
2009				Sizzle.error( "unsupported lang: " + lang );
2010			}
2011			lang = lang.replace( runescape, funescape ).toLowerCase();
2012			return function( elem ) {
2013				var elemLang;
2014				do {
2015					if ( (elemLang = documentIsHTML ?
2016						elem.lang :
2017						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
2018
2019						elemLang = elemLang.toLowerCase();
2020						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2021					}
2022				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
2023				return false;
vendor: 23,967 bytes, lines 2024-2895
2024			};
2025		}),
2026
2027		// Miscellaneous
2028		"target": function( elem ) {
2029			var hash = window.location && window.location.hash;
2030			return hash && hash.slice( 1 ) === elem.id;
2031		},
2032
2033		"root": function( elem ) {
2034			return elem === docElem;
2035		},
2036
2037		"focus": function( elem ) {
2038			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
2039		},
2040
2041		// Boolean properties
2042		"enabled": createDisabledPseudo( false ),
2043		"disabled": createDisabledPseudo( true ),
2044
2045		"checked": function( elem ) {
2046			// In CSS3, :checked should return both checked and selected elements
2047			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2048			var nodeName = elem.nodeName.toLowerCase();
2049			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
2050		},
2051
2052		"selected": function( elem ) {
2053			// Accessing this property makes selected-by-default
2054			// options in Safari work properly
2055			if ( elem.parentNode ) {
2056				elem.parentNode.selectedIndex;
2057			}
2058
2059			return elem.selected === true;
2060		},
2061
2062		// Contents
2063		"empty": function( elem ) {
2064			// http://www.w3.org/TR/selectors/#empty-pseudo
2065			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2066			//   but not by others (comment: 8; processing instruction: 7; etc.)
2067			// nodeType < 6 works because attributes (2) do not appear as children
2068			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
2069				if ( elem.nodeType < 6 ) {
2070					return false;
2071				}
2072			}
2073			return true;
2074		},
2075
2076		"parent": function( elem ) {
2077			return !Expr.pseudos["empty"]( elem );
2078		},
2079
2080		// Element/input types
2081		"header": function( elem ) {
2082			return rheader.test( elem.nodeName );
2083		},
2084
2085		"input": function( elem ) {
2086			return rinputs.test( elem.nodeName );
2087		},
2088
2089		"button": function( elem ) {
2090			var name = elem.nodeName.toLowerCase();
2091			return name === "input" && elem.type === "button" || name === "button";
2092		},
2093
2094		"text": function( elem ) {
2095			var attr;
2096			return elem.nodeName.toLowerCase() === "input" &&
2097				elem.type === "text" &&
2098
2099				// Support: IE<8
2100				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2101				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
2102		},
2103
2104		// Position-in-collection
2105		"first": createPositionalPseudo(function() {
2106			return [ 0 ];
2107		}),
2108
2109		"last": createPositionalPseudo(function( matchIndexes, length ) {
2110			return [ length - 1 ];
2111		}),
2112
2113		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
2114			return [ argument < 0 ? argument + length : argument ];
2115		}),
2116
2117		"even": createPositionalPseudo(function( matchIndexes, length ) {
2118			var i = 0;
2119			for ( ; i < length; i += 2 ) {
2120				matchIndexes.push( i );
2121			}
2122			return matchIndexes;
2123		}),
2124
2125		"odd": createPositionalPseudo(function( matchIndexes, length ) {
2126			var i = 1;
2127			for ( ; i < length; i += 2 ) {
2128				matchIndexes.push( i );
2129			}
2130			return matchIndexes;
2131		}),
2132
2133		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2134			var i = argument < 0 ? argument + length : argument;
2135			for ( ; --i >= 0; ) {
2136				matchIndexes.push( i );
2137			}
2138			return matchIndexes;
2139		}),
2140
2141		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2142			var i = argument < 0 ? argument + length : argument;
2143			for ( ; ++i < length; ) {
2144				matchIndexes.push( i );
2145			}
2146			return matchIndexes;
2147		})
2148	}
2149};
2150
2151Expr.pseudos["nth"] = Expr.pseudos["eq"];
2152
2153// Add button/input type pseudos
2154for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2155	Expr.pseudos[ i ] = createInputPseudo( i );
2156}
2157for ( i in { submit: true, reset: true } ) {
2158	Expr.pseudos[ i ] = createButtonPseudo( i );
2159}
2160
2161// Easy API for creating new setFilters
2162function setFilters() {}
2163setFilters.prototype = Expr.filters = Expr.pseudos;
2164Expr.setFilters = new setFilters();
2165
2166tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2167	var matched, match, tokens, type,
2168		soFar, groups, preFilters,
2169		cached = tokenCache[ selector + " " ];
2170
2171	if ( cached ) {
2172		return parseOnly ? 0 : cached.slice( 0 );
2173	}
2174
2175	soFar = selector;
2176	groups = [];
2177	preFilters = Expr.preFilter;
2178
2179	while ( soFar ) {
2180
2181		// Comma and first run
2182		if ( !matched || (match = rcomma.exec( soFar )) ) {
2183			if ( match ) {
2184				// Don't consume trailing commas as valid
2185				soFar = soFar.slice( match[0].length ) || soFar;
2186			}
2187			groups.push( (tokens = []) );
2188		}
2189
2190		matched = false;
2191
2192		// Combinators
2193		if ( (match = rcombinators.exec( soFar )) ) {
2194			matched = match.shift();
2195			tokens.push({
2196				value: matched,
2197				// Cast descendant combinators to space
2198				type: match[0].replace( rtrim, " " )
2199			});
2200			soFar = soFar.slice( matched.length );
2201		}
2202
2203		// Filters
2204		for ( type in Expr.filter ) {
2205			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2206				(match = preFilters[ type ]( match ))) ) {
2207				matched = match.shift();
2208				tokens.push({
2209					value: matched,
2210					type: type,
2211					matches: match
2212				});
2213				soFar = soFar.slice( matched.length );
2214			}
2215		}
2216
2217		if ( !matched ) {
2218			break;
2219		}
2220	}
2221
2222	// Return the length of the invalid excess
2223	// if we're just parsing
2224	// Otherwise, throw an error or return tokens
2225	return parseOnly ?
2226		soFar.length :
2227		soFar ?
2228			Sizzle.error( selector ) :
2229			// Cache the tokens
2230			tokenCache( selector, groups ).slice( 0 );
2231};
2232
2233function toSelector( tokens ) {
2234	var i = 0,
2235		len = tokens.length,
2236		selector = "";
2237	for ( ; i < len; i++ ) {
2238		selector += tokens[i].value;
2239	}
2240	return selector;
2241}
2242
2243function addCombinator( matcher, combinator, base ) {
2244	var dir = combinator.dir,
2245		skip = combinator.next,
2246		key = skip || dir,
2247		checkNonElements = base && key === "parentNode",
2248		doneName = done++;
2249
2250	return combinator.first ?
2251		// Check against closest ancestor/preceding element
2252		function( elem, context, xml ) {
2253			while ( (elem = elem[ dir ]) ) {
2254				if ( elem.nodeType === 1 || checkNonElements ) {
2255					return matcher( elem, context, xml );
2256				}
2257			}
2258			return false;
2259		} :
2260
2261		// Check against all ancestor/preceding elements
2262		function( elem, context, xml ) {
2263			var oldCache, uniqueCache, outerCache,
2264				newCache = [ dirruns, doneName ];
2265
2266			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2267			if ( xml ) {
2268				while ( (elem = elem[ dir ]) ) {
2269					if ( elem.nodeType === 1 || checkNonElements ) {
2270						if ( matcher( elem, context, xml ) ) {
2271							return true;
2272						}
2273					}
2274				}
2275			} else {
2276				while ( (elem = elem[ dir ]) ) {
2277					if ( elem.nodeType === 1 || checkNonElements ) {
2278						outerCache = elem[ expando ] || (elem[ expando ] = {});
2279
2280						// Support: IE <9 only
2281						// Defend against cloned attroperties (jQuery gh-1709)
2282						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
2283
2284						if ( skip && skip === elem.nodeName.toLowerCase() ) {
2285							elem = elem[ dir ] || elem;
2286						} else if ( (oldCache = uniqueCache[ key ]) &&
2287							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2288
2289							// Assign to newCache so results back-propagate to previous elements
2290							return (newCache[ 2 ] = oldCache[ 2 ]);
2291						} else {
2292							// Reuse newcache so results back-propagate to previous elements
2293							uniqueCache[ key ] = newCache;
2294
2295							// A match means we're done; a fail means we have to keep checking
2296							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2297								return true;
2298							}
2299						}
2300					}
2301				}
2302			}
2303			return false;
2304		};
2305}
2306
2307function elementMatcher( matchers ) {
2308	return matchers.length > 1 ?
2309		function( elem, context, xml ) {
2310			var i = matchers.length;
2311			while ( i-- ) {
2312				if ( !matchers[i]( elem, context, xml ) ) {
2313					return false;
2314				}
2315			}
2316			return true;
2317		} :
2318		matchers[0];
2319}
2320
2321function multipleContexts( selector, contexts, results ) {
2322	var i = 0,
2323		len = contexts.length;
2324	for ( ; i < len; i++ ) {
2325		Sizzle( selector, contexts[i], results );
2326	}
2327	return results;
2328}
2329
2330function condense( unmatched, map, filter, context, xml ) {
2331	var elem,
2332		newUnmatched = [],
2333		i = 0,
2334		len = unmatched.length,
2335		mapped = map != null;
2336
2337	for ( ; i < len; i++ ) {
2338		if ( (elem = unmatched[i]) ) {
2339			if ( !filter || filter( elem, context, xml ) ) {
2340				newUnmatched.push( elem );
2341				if ( mapped ) {
2342					map.push( i );
2343				}
2344			}
2345		}
2346	}
2347
2348	return newUnmatched;
2349}
2350
2351function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2352	if ( postFilter && !postFilter[ expando ] ) {
2353		postFilter = setMatcher( postFilter );
2354	}
2355	if ( postFinder && !postFinder[ expando ] ) {
2356		postFinder = setMatcher( postFinder, postSelector );
2357	}
2358	return markFunction(function( seed, results, context, xml ) {
2359		var temp, i, elem,
2360			preMap = [],
2361			postMap = [],
2362			preexisting = results.length,
2363
2364			// Get initial elements from seed or context
2365			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2366
2367			// Prefilter to get matcher input, preserving a map for seed-results synchronization
2368			matcherIn = preFilter && ( seed || !selector ) ?
2369				condense( elems, preMap, preFilter, context, xml ) :
2370				elems,
2371
2372			matcherOut = matcher ?
2373				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2374				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2375
2376					// ...intermediate processing is necessary
2377					[] :
2378
2379					// ...otherwise use results directly
2380					results :
2381				matcherIn;
2382
2383		// Find primary matches
2384		if ( matcher ) {
2385			matcher( matcherIn, matcherOut, context, xml );
2386		}
2387
2388		// Apply postFilter
2389		if ( postFilter ) {
2390			temp = condense( matcherOut, postMap );
2391			postFilter( temp, [], context, xml );
2392
2393			// Un-match failing elements by moving them back to matcherIn
2394			i = temp.length;
2395			while ( i-- ) {
2396				if ( (elem = temp[i]) ) {
2397					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2398				}
2399			}
2400		}
2401
2402		if ( seed ) {
2403			if ( postFinder || preFilter ) {
2404				if ( postFinder ) {
2405					// Get the final matcherOut by condensing this intermediate into postFinder contexts
2406					temp = [];
2407					i = matcherOut.length;
2408					while ( i-- ) {
2409						if ( (elem = matcherOut[i]) ) {
2410							// Restore matcherIn since elem is not yet a final match
2411							temp.push( (matcherIn[i] = elem) );
2412						}
2413					}
2414					postFinder( null, (matcherOut = []), temp, xml );
2415				}
2416
2417				// Move matched elements from seed to results to keep them synchronized
2418				i = matcherOut.length;
2419				while ( i-- ) {
2420					if ( (elem = matcherOut[i]) &&
2421						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
2422
2423						seed[temp] = !(results[temp] = elem);
2424					}
2425				}
2426			}
2427
2428		// Add elements to results, through postFinder if defined
2429		} else {
2430			matcherOut = condense(
2431				matcherOut === results ?
2432					matcherOut.splice( preexisting, matcherOut.length ) :
2433					matcherOut
2434			);
2435			if ( postFinder ) {
2436				postFinder( null, results, matcherOut, xml );
2437			} else {
2438				push.apply( results, matcherOut );
2439			}
2440		}
2441	});
2442}
2443
2444function matcherFromTokens( tokens ) {
2445	var checkContext, matcher, j,
2446		len = tokens.length,
2447		leadingRelative = Expr.relative[ tokens[0].type ],
2448		implicitRelative = leadingRelative || Expr.relative[" "],
2449		i = leadingRelative ? 1 : 0,
2450
2451		// The foundational matcher ensures that elements are reachable from top-level context(s)
2452		matchContext = addCombinator( function( elem ) {
2453			return elem === checkContext;
2454		}, implicitRelative, true ),
2455		matchAnyContext = addCombinator( function( elem ) {
2456			return indexOf( checkContext, elem ) > -1;
2457		}, implicitRelative, true ),
2458		matchers = [ function( elem, context, xml ) {
2459			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2460				(checkContext = context).nodeType ?
2461					matchContext( elem, context, xml ) :
2462					matchAnyContext( elem, context, xml ) );
2463			// Avoid hanging onto element (issue #299)
2464			checkContext = null;
2465			return ret;
2466		} ];
2467
2468	for ( ; i < len; i++ ) {
2469		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2470			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2471		} else {
2472			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2473
2474			// Return special upon seeing a positional matcher
2475			if ( matcher[ expando ] ) {
2476				// Find the next relative operator (if any) for proper handling
2477				j = ++i;
2478				for ( ; j < len; j++ ) {
2479					if ( Expr.relative[ tokens[j].type ] ) {
2480						break;
2481					}
2482				}
2483				return setMatcher(
2484					i > 1 && elementMatcher( matchers ),
2485					i > 1 && toSelector(
2486						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
2487						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2488					).replace( rtrim, "$1" ),
2489					matcher,
2490					i < j && matcherFromTokens( tokens.slice( i, j ) ),
2491					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2492					j < len && toSelector( tokens )
2493				);
2494			}
2495			matchers.push( matcher );
2496		}
2497	}
2498
2499	return elementMatcher( matchers );
2500}
2501
2502function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2503	var bySet = setMatchers.length > 0,
2504		byElement = elementMatchers.length > 0,
2505		superMatcher = function( seed, context, xml, results, outermost ) {
2506			var elem, j, matcher,
2507				matchedCount = 0,
2508				i = "0",
2509				unmatched = seed && [],
2510				setMatched = [],
2511				contextBackup = outermostContext,
2512				// We must always have either seed elements or outermost context
2513				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2514				// Use integer dirruns iff this is the outermost matcher
2515				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2516				len = elems.length;
2517
2518			if ( outermost ) {
2519				outermostContext = context === document || context || outermost;
2520			}
2521
2522			// Add elements passing elementMatchers directly to results
2523			// Support: IE<9, Safari
2524			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2525			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2526				if ( byElement && elem ) {
2527					j = 0;
2528					if ( !context && elem.ownerDocument !== document ) {
2529						setDocument( elem );
2530						xml = !documentIsHTML;
2531					}
2532					while ( (matcher = elementMatchers[j++]) ) {
2533						if ( matcher( elem, context || document, xml) ) {
2534							results.push( elem );
2535							break;
2536						}
2537					}
2538					if ( outermost ) {
2539						dirruns = dirrunsUnique;
2540					}
2541				}
2542
2543				// Track unmatched elements for set filters
2544				if ( bySet ) {
2545					// They will have gone through all possible matchers
2546					if ( (elem = !matcher && elem) ) {
2547						matchedCount--;
2548					}
2549
2550					// Lengthen the array for every element, matched or not
2551					if ( seed ) {
2552						unmatched.push( elem );
2553					}
2554				}
2555			}
2556
2557			// `i` is now the count of elements visited above, and adding it to `matchedCount`
2558			// makes the latter nonnegative.
2559			matchedCount += i;
2560
2561			// Apply set filters to unmatched elements
2562			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
2563			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
2564			// no element matchers and no seed.
2565			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
2566			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
2567			// numerically zero.
2568			if ( bySet && i !== matchedCount ) {
2569				j = 0;
2570				while ( (matcher = setMatchers[j++]) ) {
2571					matcher( unmatched, setMatched, context, xml );
2572				}
2573
2574				if ( seed ) {
2575					// Reintegrate element matches to eliminate the need for sorting
2576					if ( matchedCount > 0 ) {
2577						while ( i-- ) {
2578							if ( !(unmatched[i] || setMatched[i]) ) {
2579								setMatched[i] = pop.call( results );
2580							}
2581						}
2582					}
2583
2584					// Discard index placeholder values to get only actual matches
2585					setMatched = condense( setMatched );
2586				}
2587
2588				// Add matches to results
2589				push.apply( results, setMatched );
2590
2591				// Seedless set matches succeeding multiple successful matchers stipulate sorting
2592				if ( outermost && !seed && setMatched.length > 0 &&
2593					( matchedCount + setMatchers.length ) > 1 ) {
2594
2595					Sizzle.uniqueSort( results );
2596				}
2597			}
2598
2599			// Override manipulation of globals by nested matchers
2600			if ( outermost ) {
2601				dirruns = dirrunsUnique;
2602				outermostContext = contextBackup;
2603			}
2604
2605			return unmatched;
2606		};
2607
2608	return bySet ?
2609		markFunction( superMatcher ) :
2610		superMatcher;
2611}
2612
2613compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2614	var i,
2615		setMatchers = [],
2616		elementMatchers = [],
2617		cached = compilerCache[ selector + " " ];
2618
2619	if ( !cached ) {
2620		// Generate a function of recursive functions that can be used to check each element
2621		if ( !match ) {
2622			match = tokenize( selector );
2623		}
2624		i = match.length;
2625		while ( i-- ) {
2626			cached = matcherFromTokens( match[i] );
2627			if ( cached[ expando ] ) {
2628				setMatchers.push( cached );
2629			} else {
2630				elementMatchers.push( cached );
2631			}
2632		}
2633
2634		// Cache the compiled function
2635		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2636
2637		// Save selector and tokenization
2638		cached.selector = selector;
2639	}
2640	return cached;
2641};
2642
2643/**
2644 * A low-level selection function that works with Sizzle's compiled
2645 *  selector functions
2646 * @param {String|Function} selector A selector or a pre-compiled
2647 *  selector function built with Sizzle.compile
2648 * @param {Element} context
2649 * @param {Array} [results]
2650 * @param {Array} [seed] A set of elements to match against
2651 */
2652select = Sizzle.select = function( selector, context, results, seed ) {
2653	var i, tokens, token, type, find,
2654		compiled = typeof selector === "function" && selector,
2655		match = !seed && tokenize( (selector = compiled.selector || selector) );
2656
2657	results = results || [];
2658
2659	// Try to minimize operations if there is only one selector in the list and no seed
2660	// (the latter of which guarantees us context)
2661	if ( match.length === 1 ) {
2662
2663		// Reduce context if the leading compound selector is an ID
2664		tokens = match[0] = match[0].slice( 0 );
2665		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2666				context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
2667
2668			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2669			if ( !context ) {
2670				return results;
2671
2672			// Precompiled matchers will still verify ancestry, so step up a level
2673			} else if ( compiled ) {
2674				context = context.parentNode;
2675			}
2676
2677			selector = selector.slice( tokens.shift().value.length );
2678		}
2679
2680		// Fetch a seed set for right-to-left matching
2681		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2682		while ( i-- ) {
2683			token = tokens[i];
2684
2685			// Abort if we hit a combinator
2686			if ( Expr.relative[ (type = token.type) ] ) {
2687				break;
2688			}
2689			if ( (find = Expr.find[ type ]) ) {
2690				// Search, expanding context for leading sibling combinators
2691				if ( (seed = find(
2692					token.matches[0].replace( runescape, funescape ),
2693					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2694				)) ) {
2695
2696					// If seed is empty or no tokens remain, we can return early
2697					tokens.splice( i, 1 );
2698					selector = seed.length && toSelector( tokens );
2699					if ( !selector ) {
2700						push.apply( results, seed );
2701						return results;
2702					}
2703
2704					break;
2705				}
2706			}
2707		}
2708	}
2709
2710	// Compile and execute a filtering function if one is not provided
2711	// Provide `match` to avoid retokenization if we modified the selector above
2712	( compiled || compile( selector, match ) )(
2713		seed,
2714		context,
2715		!documentIsHTML,
2716		results,
2717		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2718	);
2719	return results;
2720};
2721
2722// One-time assignments
2723
2724// Sort stability
2725support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2726
2727// Support: Chrome 14-35+
2728// Always assume duplicates if they aren't passed to the comparison function
2729support.detectDuplicates = !!hasDuplicate;
2730
2731// Initialize against the default document
2732setDocument();
2733
2734// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2735// Detached nodes confoundingly follow *each other*
2736support.sortDetached = assert(function( el ) {
2737	// Should return 1, but returns 4 (following)
2738	return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
2739});
2740
2741// Support: IE<8
2742// Prevent attribute/property "interpolation"
2743// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2744if ( !assert(function( el ) {
2745	el.innerHTML = "<a href='#'></a>";
2746	return el.firstChild.getAttribute("href") === "#" ;
2747}) ) {
2748	addHandle( "type|href|height|width", function( elem, name, isXML ) {
2749		if ( !isXML ) {
2750			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2751		}
2752	});
2753}
2754
2755// Support: IE<9
2756// Use defaultValue in place of getAttribute("value")
2757if ( !support.attributes || !assert(function( el ) {
2758	el.innerHTML = "<input/>";
2759	el.firstChild.setAttribute( "value", "" );
2760	return el.firstChild.getAttribute( "value" ) === "";
2761}) ) {
2762	addHandle( "value", function( elem, name, isXML ) {
2763		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2764			return elem.defaultValue;
2765		}
2766	});
2767}
2768
2769// Support: IE<9
2770// Use getAttributeNode to fetch booleans when getAttribute lies
2771if ( !assert(function( el ) {
2772	return el.getAttribute("disabled") == null;
2773}) ) {
2774	addHandle( booleans, function( elem, name, isXML ) {
2775		var val;
2776		if ( !isXML ) {
2777			return elem[ name ] === true ? name.toLowerCase() :
2778					(val = elem.getAttributeNode( name )) && val.specified ?
2779					val.value :
2780				null;
2781		}
2782	});
2783}
2784
2785return Sizzle;
2786
2787})( window );
2788
2789
2790
2791jQuery.find = Sizzle;
2792jQuery.expr = Sizzle.selectors;
2793
2794// Deprecated
2795jQuery.expr[ ":" ] = jQuery.expr.pseudos;
2796jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
2797jQuery.text = Sizzle.getText;
2798jQuery.isXMLDoc = Sizzle.isXML;
2799jQuery.contains = Sizzle.contains;
2800jQuery.escapeSelector = Sizzle.escape;
2801
2802
2803
2804
2805var dir = function( elem, dir, until ) {
2806	var matched = [],
2807		truncate = until !== undefined;
2808
2809	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
2810		if ( elem.nodeType === 1 ) {
2811			if ( truncate && jQuery( elem ).is( until ) ) {
2812				break;
2813			}
2814			matched.push( elem );
2815		}
2816	}
2817	return matched;
2818};
2819
2820
2821var siblings = function( n, elem ) {
2822	var matched = [];
2823
2824	for ( ; n; n = n.nextSibling ) {
2825		if ( n.nodeType === 1 && n !== elem ) {
2826			matched.push( n );
2827		}
2828	}
2829
2830	return matched;
2831};
2832
2833
2834var rneedsContext = jQuery.expr.match.needsContext;
2835
2836
2837
2838function nodeName( elem, name ) {
2839
2840  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
2841
2842};
2843var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
2844
2845
2846
2847// Implement the identical functionality for filter and not
2848function winnow( elements, qualifier, not ) {
2849	if ( isFunction( qualifier ) ) {
2850		return jQuery.grep( elements, function( elem, i ) {
2851			return !!qualifier.call( elem, i, elem ) !== not;
2852		} );
2853	}
2854
2855	// Single element
2856	if ( qualifier.nodeType ) {
2857		return jQuery.grep( elements, function( elem ) {
2858			return ( elem === qualifier ) !== not;
2859		} );
2860	}
2861
2862	// Arraylike of elements (jQuery, arguments, Array)
2863	if ( typeof qualifier !== "string" ) {
2864		return jQuery.grep( elements, function( elem ) {
2865			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
2866		} );
2867	}
2868
2869	// Filtered directly for both simple and complex selectors
2870	return jQuery.filter( qualifier, elements, not );
2871}
2872
2873jQuery.filter = function( expr, elems, not ) {
2874	var elem = elems[ 0 ];
2875
2876	if ( not ) {
2877		expr = ":not(" + expr + ")";
2878	}
2879
2880	if ( elems.length === 1 && elem.nodeType === 1 ) {
2881		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
2882	}
2883
2884	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
2885		return elem.nodeType === 1;
2886	} ) );
2887};
2888
2889jQuery.fn.extend( {
2890	find: function( selector ) {
2891		var i, ret,
2892			len = this.length,
2893			self = this;
2894
2895		if ( typeof selector !== "string" ) {
vendor: 4,662 bytes, lines 2896-3081
2896			return this.pushStack( jQuery( selector ).filter( function() {
2897				for ( i = 0; i < len; i++ ) {
2898					if ( jQuery.contains( self[ i ], this ) ) {
2899						return true;
2900					}
2901				}
2902			} ) );
2903		}
2904
2905		ret = this.pushStack( [] );
2906
2907		for ( i = 0; i < len; i++ ) {
2908			jQuery.find( selector, self[ i ], ret );
2909		}
2910
2911		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
2912	},
2913	filter: function( selector ) {
2914		return this.pushStack( winnow( this, selector || [], false ) );
2915	},
2916	not: function( selector ) {
2917		return this.pushStack( winnow( this, selector || [], true ) );
2918	},
2919	is: function( selector ) {
2920		return !!winnow(
2921			this,
2922
2923			// If this is a positional/relative selector, check membership in the returned set
2924			// so $("p:first").is("p:last") won't return true for a doc with two "p".
2925			typeof selector === "string" && rneedsContext.test( selector ) ?
2926				jQuery( selector ) :
2927				selector || [],
2928			false
2929		).length;
2930	}
2931} );
2932
2933
2934// Initialize a jQuery object
2935
2936
2937// A central reference to the root jQuery(document)
2938var rootjQuery,
2939
2940	// A simple way to check for HTML strings
2941	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
2942	// Strict HTML recognition (#11290: must start with <)
2943	// Shortcut simple #id case for speed
2944	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
2945
2946	init = jQuery.fn.init = function( selector, context, root ) {
2947		var match, elem;
2948
2949		// HANDLE: $(""), $(null), $(undefined), $(false)
2950		if ( !selector ) {
2951			return this;
2952		}
2953
2954		// Method init() accepts an alternate rootjQuery
2955		// so migrate can support jQuery.sub (gh-2101)
2956		root = root || rootjQuery;
2957
2958		// Handle HTML strings
2959		if ( typeof selector === "string" ) {
2960			if ( selector[ 0 ] === "<" &&
2961				selector[ selector.length - 1 ] === ">" &&
2962				selector.length >= 3 ) {
2963
2964				// Assume that strings that start and end with <> are HTML and skip the regex check
2965				match = [ null, selector, null ];
2966
2967			} else {
2968				match = rquickExpr.exec( selector );
2969			}
2970
2971			// Match html or make sure no context is specified for #id
2972			if ( match && ( match[ 1 ] || !context ) ) {
2973
2974				// HANDLE: $(html) -> $(array)
2975				if ( match[ 1 ] ) {
2976					context = context instanceof jQuery ? context[ 0 ] : context;
2977
2978					// Option to run scripts is true for back-compat
2979					// Intentionally let the error be thrown if parseHTML is not present
2980					jQuery.merge( this, jQuery.parseHTML(
2981						match[ 1 ],
2982						context && context.nodeType ? context.ownerDocument || context : document,
2983						true
2984					) );
2985
2986					// HANDLE: $(html, props)
2987					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
2988						for ( match in context ) {
2989
2990							// Properties of context are called as methods if possible
2991							if ( isFunction( this[ match ] ) ) {
2992								this[ match ]( context[ match ] );
2993
2994							// ...and otherwise set as attributes
2995							} else {
2996								this.attr( match, context[ match ] );
2997							}
2998						}
2999					}
3000
3001					return this;
3002
3003				// HANDLE: $(#id)
3004				} else {
3005					elem = document.getElementById( match[ 2 ] );
3006
3007					if ( elem ) {
3008
3009						// Inject the element directly into the jQuery object
3010						this[ 0 ] = elem;
3011						this.length = 1;
3012					}
3013					return this;
3014				}
3015
3016			// HANDLE: $(expr, $(...))
3017			} else if ( !context || context.jquery ) {
3018				return ( context || root ).find( selector );
3019
3020			// HANDLE: $(expr, context)
3021			// (which is just equivalent to: $(context).find(expr)
3022			} else {
3023				return this.constructor( context ).find( selector );
3024			}
3025
3026		// HANDLE: $(DOMElement)
3027		} else if ( selector.nodeType ) {
3028			this[ 0 ] = selector;
3029			this.length = 1;
3030			return this;
3031
3032		// HANDLE: $(function)
3033		// Shortcut for document ready
3034		} else if ( isFunction( selector ) ) {
3035			return root.ready !== undefined ?
3036				root.ready( selector ) :
3037
3038				// Execute immediately if ready is not present
3039				selector( jQuery );
3040		}
3041
3042		return jQuery.makeArray( selector, this );
3043	};
3044
3045// Give the init function the jQuery prototype for later instantiation
3046init.prototype = jQuery.fn;
3047
3048// Initialize central reference
3049rootjQuery = jQuery( document );
3050
3051
3052var rparentsprev = /^(?:parents|prev(?:Until|All))/,
3053
3054	// Methods guaranteed to produce a unique set when starting from a unique set
3055	guaranteedUnique = {
3056		children: true,
3057		contents: true,
3058		next: true,
3059		prev: true
3060	};
3061
3062jQuery.fn.extend( {
3063	has: function( target ) {
3064		var targets = jQuery( target, this ),
3065			l = targets.length;
3066
3067		return this.filter( function() {
3068			var i = 0;
3069			for ( ; i < l; i++ ) {
3070				if ( jQuery.contains( this, targets[ i ] ) ) {
3071					return true;
3072				}
3073			}
3074		} );
3075	},
3076
3077	closest: function( selectors, context ) {
3078		var cur,
3079			i = 0,
3080			l = this.length,
3081			matched = [],
vendor: 6,003 bytes, lines 3082-3308
3082			targets = typeof selectors !== "string" && jQuery( selectors );
3083
3084		// Positional selectors never match, since there's no _selection_ context
3085		if ( !rneedsContext.test( selectors ) ) {
3086			for ( ; i < l; i++ ) {
3087				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
3088
3089					// Always skip document fragments
3090					if ( cur.nodeType < 11 && ( targets ?
3091						targets.index( cur ) > -1 :
3092
3093						// Don't pass non-elements to Sizzle
3094						cur.nodeType === 1 &&
3095							jQuery.find.matchesSelector( cur, selectors ) ) ) {
3096
3097						matched.push( cur );
3098						break;
3099					}
3100				}
3101			}
3102		}
3103
3104		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
3105	},
3106
3107	// Determine the position of an element within the set
3108	index: function( elem ) {
3109
3110		// No argument, return index in parent
3111		if ( !elem ) {
3112			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
3113		}
3114
3115		// Index in selector
3116		if ( typeof elem === "string" ) {
3117			return indexOf.call( jQuery( elem ), this[ 0 ] );
3118		}
3119
3120		// Locate the position of the desired element
3121		return indexOf.call( this,
3122
3123			// If it receives a jQuery object, the first element is used
3124			elem.jquery ? elem[ 0 ] : elem
3125		);
3126	},
3127
3128	add: function( selector, context ) {
3129		return this.pushStack(
3130			jQuery.uniqueSort(
3131				jQuery.merge( this.get(), jQuery( selector, context ) )
3132			)
3133		);
3134	},
3135
3136	addBack: function( selector ) {
3137		return this.add( selector == null ?
3138			this.prevObject : this.prevObject.filter( selector )
3139		);
3140	}
3141} );
3142
3143function sibling( cur, dir ) {
3144	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
3145	return cur;
3146}
3147
3148jQuery.each( {
3149	parent: function( elem ) {
3150		var parent = elem.parentNode;
3151		return parent && parent.nodeType !== 11 ? parent : null;
3152	},
3153	parents: function( elem ) {
3154		return dir( elem, "parentNode" );
3155	},
3156	parentsUntil: function( elem, i, until ) {
3157		return dir( elem, "parentNode", until );
3158	},
3159	next: function( elem ) {
3160		return sibling( elem, "nextSibling" );
3161	},
3162	prev: function( elem ) {
3163		return sibling( elem, "previousSibling" );
3164	},
3165	nextAll: function( elem ) {
3166		return dir( elem, "nextSibling" );
3167	},
3168	prevAll: function( elem ) {
3169		return dir( elem, "previousSibling" );
3170	},
3171	nextUntil: function( elem, i, until ) {
3172		return dir( elem, "nextSibling", until );
3173	},
3174	prevUntil: function( elem, i, until ) {
3175		return dir( elem, "previousSibling", until );
3176	},
3177	siblings: function( elem ) {
3178		return siblings( ( elem.parentNode || {} ).firstChild, elem );
3179	},
3180	children: function( elem ) {
3181		return siblings( elem.firstChild );
3182	},
3183	contents: function( elem ) {
3184        if ( nodeName( elem, "iframe" ) ) {
3185            return elem.contentDocument;
3186        }
3187
3188        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3189        // Treat the template element as a regular one in browsers that
3190        // don't support it.
3191        if ( nodeName( elem, "template" ) ) {
3192            elem = elem.content || elem;
3193        }
3194
3195        return jQuery.merge( [], elem.childNodes );
3196	}
3197}, function( name, fn ) {
3198	jQuery.fn[ name ] = function( until, selector ) {
3199		var matched = jQuery.map( this, fn, until );
3200
3201		if ( name.slice( -5 ) !== "Until" ) {
3202			selector = until;
3203		}
3204
3205		if ( selector && typeof selector === "string" ) {
3206			matched = jQuery.filter( selector, matched );
3207		}
3208
3209		if ( this.length > 1 ) {
3210
3211			// Remove duplicates
3212			if ( !guaranteedUnique[ name ] ) {
3213				jQuery.uniqueSort( matched );
3214			}
3215
3216			// Reverse order for parents* and prev-derivatives
3217			if ( rparentsprev.test( name ) ) {
3218				matched.reverse();
3219			}
3220		}
3221
3222		return this.pushStack( matched );
3223	};
3224} );
3225var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
3226
3227
3228
3229// Convert String-formatted options into Object-formatted ones
3230function createOptions( options ) {
3231	var object = {};
3232	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
3233		object[ flag ] = true;
3234	} );
3235	return object;
3236}
3237
3238/*
3239 * Create a callback list using the following parameters:
3240 *
3241 *	options: an optional list of space-separated options that will change how
3242 *			the callback list behaves or a more traditional option object
3243 *
3244 * By default a callback list will act like an event callback list and can be
3245 * "fired" multiple times.
3246 *
3247 * Possible options:
3248 *
3249 *	once:			will ensure the callback list can only be fired once (like a Deferred)
3250 *
3251 *	memory:			will keep track of previous values and will call any callback added
3252 *					after the list has been fired right away with the latest "memorized"
3253 *					values (like a Deferred)
3254 *
3255 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
3256 *
3257 *	stopOnFalse:	interrupt callings when a callback returns false
3258 *
3259 */
3260jQuery.Callbacks = function( options ) {
3261
3262	// Convert options from String-formatted to Object-formatted if needed
3263	// (we check in cache first)
3264	options = typeof options === "string" ?
3265		createOptions( options ) :
3266		jQuery.extend( {}, options );
3267
3268	var // Flag to know if list is currently firing
3269		firing,
3270
3271		// Last fire value for non-forgettable lists
3272		memory,
3273
3274		// Flag to know if list was already fired
3275		fired,
3276
3277		// Flag to prevent firing
3278		locked,
3279
3280		// Actual callback list
3281		list = [],
3282
3283		// Queue of execution data for repeatable lists
3284		queue = [],
3285
3286		// Index of currently firing callback (modified by add/remove as needed)
3287		firingIndex = -1,
3288
3289		// Fire callbacks
3290		fire = function() {
3291
3292			// Enforce single-firing
3293			locked = locked || options.once;
3294
3295			// Execute callbacks for all pending executions,
3296			// respecting firingIndex overrides and runtime changes
3297			fired = firing = true;
3298			for ( ; queue.length; firingIndex = -1 ) {
3299				memory = queue.shift();
3300				while ( ++firingIndex < list.length ) {
3301
3302					// Run callback and check for early termination
3303					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
3304						options.stopOnFalse ) {
3305
3306						// Jump to end and forget the data so .add doesn't re-fire
3307						firingIndex = list.length;
3308						memory = false;
vendor: 4,918 bytes, lines 3309-3518
3309					}
3310				}
3311			}
3312
3313			// Forget the data if we're done with it
3314			if ( !options.memory ) {
3315				memory = false;
3316			}
3317
3318			firing = false;
3319
3320			// Clean up if we're done firing for good
3321			if ( locked ) {
3322
3323				// Keep an empty list if we have data for future add calls
3324				if ( memory ) {
3325					list = [];
3326
3327				// Otherwise, this object is spent
3328				} else {
3329					list = "";
3330				}
3331			}
3332		},
3333
3334		// Actual Callbacks object
3335		self = {
3336
3337			// Add a callback or a collection of callbacks to the list
3338			add: function() {
3339				if ( list ) {
3340
3341					// If we have memory from a past run, we should fire after adding
3342					if ( memory && !firing ) {
3343						firingIndex = list.length - 1;
3344						queue.push( memory );
3345					}
3346
3347					( function add( args ) {
3348						jQuery.each( args, function( _, arg ) {
3349							if ( isFunction( arg ) ) {
3350								if ( !options.unique || !self.has( arg ) ) {
3351									list.push( arg );
3352								}
3353							} else if ( arg && arg.length && toType( arg ) !== "string" ) {
3354
3355								// Inspect recursively
3356								add( arg );
3357							}
3358						} );
3359					} )( arguments );
3360
3361					if ( memory && !firing ) {
3362						fire();
3363					}
3364				}
3365				return this;
3366			},
3367
3368			// Remove a callback from the list
3369			remove: function() {
3370				jQuery.each( arguments, function( _, arg ) {
3371					var index;
3372					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3373						list.splice( index, 1 );
3374
3375						// Handle firing indexes
3376						if ( index <= firingIndex ) {
3377							firingIndex--;
3378						}
3379					}
3380				} );
3381				return this;
3382			},
3383
3384			// Check if a given callback is in the list.
3385			// If no argument is given, return whether or not list has callbacks attached.
3386			has: function( fn ) {
3387				return fn ?
3388					jQuery.inArray( fn, list ) > -1 :
3389					list.length > 0;
3390			},
3391
3392			// Remove all callbacks from the list
3393			empty: function() {
3394				if ( list ) {
3395					list = [];
3396				}
3397				return this;
3398			},
3399
3400			// Disable .fire and .add
3401			// Abort any current/pending executions
3402			// Clear all callbacks and values
3403			disable: function() {
3404				locked = queue = [];
3405				list = memory = "";
3406				return this;
3407			},
3408			disabled: function() {
3409				return !list;
3410			},
3411
3412			// Disable .fire
3413			// Also disable .add unless we have memory (since it would have no effect)
3414			// Abort any pending executions
3415			lock: function() {
3416				locked = queue = [];
3417				if ( !memory && !firing ) {
3418					list = memory = "";
3419				}
3420				return this;
3421			},
3422			locked: function() {
3423				return !!locked;
3424			},
3425
3426			// Call all callbacks with the given context and arguments
3427			fireWith: function( context, args ) {
3428				if ( !locked ) {
3429					args = args || [];
3430					args = [ context, args.slice ? args.slice() : args ];
3431					queue.push( args );
3432					if ( !firing ) {
3433						fire();
3434					}
3435				}
3436				return this;
3437			},
3438
3439			// Call all the callbacks with the given arguments
3440			fire: function() {
3441				self.fireWith( this, arguments );
3442				return this;
3443			},
3444
3445			// To know if the callbacks have already been called at least once
3446			fired: function() {
3447				return !!fired;
3448			}
3449		};
3450
3451	return self;
3452};
3453
3454
3455function Identity( v ) {
3456	return v;
3457}
3458function Thrower( ex ) {
3459	throw ex;
3460}
3461
3462function adoptValue( value, resolve, reject, noValue ) {
3463	var method;
3464
3465	try {
3466
3467		// Check for promise aspect first to privilege synchronous behavior
3468		if ( value && isFunction( ( method = value.promise ) ) ) {
3469			method.call( value ).done( resolve ).fail( reject );
3470
3471		// Other thenables
3472		} else if ( value && isFunction( ( method = value.then ) ) ) {
3473			method.call( value, resolve, reject );
3474
3475		// Other non-thenables
3476		} else {
3477
3478			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
3479			// * false: [ value ].slice( 0 ) => resolve( value )
3480			// * true: [ value ].slice( 1 ) => resolve()
3481			resolve.apply( undefined, [ value ].slice( noValue ) );
3482		}
3483
3484	// For Promises/A+, convert exceptions into rejections
3485	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
3486	// Deferred#then to conditionally suppress rejection.
3487	} catch ( value ) {
3488
3489		// Support: Android 4.0 only
3490		// Strict mode functions invoked without .call/.apply get global-object context
3491		reject.apply( undefined, [ value ] );
3492	}
3493}
3494
3495jQuery.extend( {
3496
3497	Deferred: function( func ) {
3498		var tuples = [
3499
3500				// action, add listener, callbacks,
3501				// ... .then handlers, argument index, [final state]
3502				[ "notify", "progress", jQuery.Callbacks( "memory" ),
3503					jQuery.Callbacks( "memory" ), 2 ],
3504				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
3505					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
3506				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
3507					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
3508			],
3509			state = "pending",
3510			promise = {
3511				state: function() {
3512					return state;
3513				},
3514				always: function() {
3515					deferred.done( arguments ).fail( arguments );
3516					return this;
3517				},
3518				"catch": function( fn ) {
vendor: 15,167 bytes, lines 3519-4110
3519					return promise.then( null, fn );
3520				},
3521
3522				// Keep pipe for back-compat
3523				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
3524					var fns = arguments;
3525
3526					return jQuery.Deferred( function( newDefer ) {
3527						jQuery.each( tuples, function( i, tuple ) {
3528
3529							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
3530							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3531
3532							// deferred.progress(function() { bind to newDefer or newDefer.notify })
3533							// deferred.done(function() { bind to newDefer or newDefer.resolve })
3534							// deferred.fail(function() { bind to newDefer or newDefer.reject })
3535							deferred[ tuple[ 1 ] ]( function() {
3536								var returned = fn && fn.apply( this, arguments );
3537								if ( returned && isFunction( returned.promise ) ) {
3538									returned.promise()
3539										.progress( newDefer.notify )
3540										.done( newDefer.resolve )
3541										.fail( newDefer.reject );
3542								} else {
3543									newDefer[ tuple[ 0 ] + "With" ](
3544										this,
3545										fn ? [ returned ] : arguments
3546									);
3547								}
3548							} );
3549						} );
3550						fns = null;
3551					} ).promise();
3552				},
3553				then: function( onFulfilled, onRejected, onProgress ) {
3554					var maxDepth = 0;
3555					function resolve( depth, deferred, handler, special ) {
3556						return function() {
3557							var that = this,
3558								args = arguments,
3559								mightThrow = function() {
3560									var returned, then;
3561
3562									// Support: Promises/A+ section 2.3.3.3.3
3563									// https://promisesaplus.com/#point-59
3564									// Ignore double-resolution attempts
3565									if ( depth < maxDepth ) {
3566										return;
3567									}
3568
3569									returned = handler.apply( that, args );
3570
3571									// Support: Promises/A+ section 2.3.1
3572									// https://promisesaplus.com/#point-48
3573									if ( returned === deferred.promise() ) {
3574										throw new TypeError( "Thenable self-resolution" );
3575									}
3576
3577									// Support: Promises/A+ sections 2.3.3.1, 3.5
3578									// https://promisesaplus.com/#point-54
3579									// https://promisesaplus.com/#point-75
3580									// Retrieve `then` only once
3581									then = returned &&
3582
3583										// Support: Promises/A+ section 2.3.4
3584										// https://promisesaplus.com/#point-64
3585										// Only check objects and functions for thenability
3586										( typeof returned === "object" ||
3587											typeof returned === "function" ) &&
3588										returned.then;
3589
3590									// Handle a returned thenable
3591									if ( isFunction( then ) ) {
3592
3593										// Special processors (notify) just wait for resolution
3594										if ( special ) {
3595											then.call(
3596												returned,
3597												resolve( maxDepth, deferred, Identity, special ),
3598												resolve( maxDepth, deferred, Thrower, special )
3599											);
3600
3601										// Normal processors (resolve) also hook into progress
3602										} else {
3603
3604											// ...and disregard older resolution values
3605											maxDepth++;
3606
3607											then.call(
3608												returned,
3609												resolve( maxDepth, deferred, Identity, special ),
3610												resolve( maxDepth, deferred, Thrower, special ),
3611												resolve( maxDepth, deferred, Identity,
3612													deferred.notifyWith )
3613											);
3614										}
3615
3616									// Handle all other returned values
3617									} else {
3618
3619										// Only substitute handlers pass on context
3620										// and multiple values (non-spec behavior)
3621										if ( handler !== Identity ) {
3622											that = undefined;
3623											args = [ returned ];
3624										}
3625
3626										// Process the value(s)
3627										// Default process is resolve
3628										( special || deferred.resolveWith )( that, args );
3629									}
3630								},
3631
3632								// Only normal processors (resolve) catch and reject exceptions
3633								process = special ?
3634									mightThrow :
3635									function() {
3636										try {
3637											mightThrow();
3638										} catch ( e ) {
3639
3640											if ( jQuery.Deferred.exceptionHook ) {
3641												jQuery.Deferred.exceptionHook( e,
3642													process.stackTrace );
3643											}
3644
3645											// Support: Promises/A+ section 2.3.3.3.4.1
3646											// https://promisesaplus.com/#point-61
3647											// Ignore post-resolution exceptions
3648											if ( depth + 1 >= maxDepth ) {
3649
3650												// Only substitute handlers pass on context
3651												// and multiple values (non-spec behavior)
3652												if ( handler !== Thrower ) {
3653													that = undefined;
3654													args = [ e ];
3655												}
3656
3657												deferred.rejectWith( that, args );
3658											}
3659										}
3660									};
3661
3662							// Support: Promises/A+ section 2.3.3.3.1
3663							// https://promisesaplus.com/#point-57
3664							// Re-resolve promises immediately to dodge false rejection from
3665							// subsequent errors
3666							if ( depth ) {
3667								process();
3668							} else {
3669
3670								// Call an optional hook to record the stack, in case of exception
3671								// since it's otherwise lost when execution goes async
3672								if ( jQuery.Deferred.getStackHook ) {
3673									process.stackTrace = jQuery.Deferred.getStackHook();
3674								}
3675								window.setTimeout( process );
3676							}
3677						};
3678					}
3679
3680					return jQuery.Deferred( function( newDefer ) {
3681
3682						// progress_handlers.add( ... )
3683						tuples[ 0 ][ 3 ].add(
3684							resolve(
3685								0,
3686								newDefer,
3687								isFunction( onProgress ) ?
3688									onProgress :
3689									Identity,
3690								newDefer.notifyWith
3691							)
3692						);
3693
3694						// fulfilled_handlers.add( ... )
3695						tuples[ 1 ][ 3 ].add(
3696							resolve(
3697								0,
3698								newDefer,
3699								isFunction( onFulfilled ) ?
3700									onFulfilled :
3701									Identity
3702							)
3703						);
3704
3705						// rejected_handlers.add( ... )
3706						tuples[ 2 ][ 3 ].add(
3707							resolve(
3708								0,
3709								newDefer,
3710								isFunction( onRejected ) ?
3711									onRejected :
3712									Thrower
3713							)
3714						);
3715					} ).promise();
3716				},
3717
3718				// Get a promise for this deferred
3719				// If obj is provided, the promise aspect is added to the object
3720				promise: function( obj ) {
3721					return obj != null ? jQuery.extend( obj, promise ) : promise;
3722				}
3723			},
3724			deferred = {};
3725
3726		// Add list-specific methods
3727		jQuery.each( tuples, function( i, tuple ) {
3728			var list = tuple[ 2 ],
3729				stateString = tuple[ 5 ];
3730
3731			// promise.progress = list.add
3732			// promise.done = list.add
3733			// promise.fail = list.add
3734			promise[ tuple[ 1 ] ] = list.add;
3735
3736			// Handle state
3737			if ( stateString ) {
3738				list.add(
3739					function() {
3740
3741						// state = "resolved" (i.e., fulfilled)
3742						// state = "rejected"
3743						state = stateString;
3744					},
3745
3746					// rejected_callbacks.disable
3747					// fulfilled_callbacks.disable
3748					tuples[ 3 - i ][ 2 ].disable,
3749
3750					// rejected_handlers.disable
3751					// fulfilled_handlers.disable
3752					tuples[ 3 - i ][ 3 ].disable,
3753
3754					// progress_callbacks.lock
3755					tuples[ 0 ][ 2 ].lock,
3756
3757					// progress_handlers.lock
3758					tuples[ 0 ][ 3 ].lock
3759				);
3760			}
3761
3762			// progress_handlers.fire
3763			// fulfilled_handlers.fire
3764			// rejected_handlers.fire
3765			list.add( tuple[ 3 ].fire );
3766
3767			// deferred.notify = function() { deferred.notifyWith(...) }
3768			// deferred.resolve = function() { deferred.resolveWith(...) }
3769			// deferred.reject = function() { deferred.rejectWith(...) }
3770			deferred[ tuple[ 0 ] ] = function() {
3771				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
3772				return this;
3773			};
3774
3775			// deferred.notifyWith = list.fireWith
3776			// deferred.resolveWith = list.fireWith
3777			// deferred.rejectWith = list.fireWith
3778			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
3779		} );
3780
3781		// Make the deferred a promise
3782		promise.promise( deferred );
3783
3784		// Call given func if any
3785		if ( func ) {
3786			func.call( deferred, deferred );
3787		}
3788
3789		// All done!
3790		return deferred;
3791	},
3792
3793	// Deferred helper
3794	when: function( singleValue ) {
3795		var
3796
3797			// count of uncompleted subordinates
3798			remaining = arguments.length,
3799
3800			// count of unprocessed arguments
3801			i = remaining,
3802
3803			// subordinate fulfillment data
3804			resolveContexts = Array( i ),
3805			resolveValues = slice.call( arguments ),
3806
3807			// the master Deferred
3808			master = jQuery.Deferred(),
3809
3810			// subordinate callback factory
3811			updateFunc = function( i ) {
3812				return function( value ) {
3813					resolveContexts[ i ] = this;
3814					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
3815					if ( !( --remaining ) ) {
3816						master.resolveWith( resolveContexts, resolveValues );
3817					}
3818				};
3819			};
3820
3821		// Single- and empty arguments are adopted like Promise.resolve
3822		if ( remaining <= 1 ) {
3823			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
3824				!remaining );
3825
3826			// Use .then() to unwrap secondary thenables (cf. gh-3000)
3827			if ( master.state() === "pending" ||
3828				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
3829
3830				return master.then();
3831			}
3832		}
3833
3834		// Multiple arguments are aggregated like Promise.all array elements
3835		while ( i-- ) {
3836			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
3837		}
3838
3839		return master.promise();
3840	}
3841} );
3842
3843
3844// These usually indicate a programmer mistake during development,
3845// warn about them ASAP rather than swallowing them by default.
3846var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
3847
3848jQuery.Deferred.exceptionHook = function( error, stack ) {
3849
3850	// Support: IE 8 - 9 only
3851	// Console exists when dev tools are open, which can happen at any time
3852	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
3853		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
3854	}
3855};
3856
3857
3858
3859
3860jQuery.readyException = function( error ) {
3861	window.setTimeout( function() {
3862		throw error;
3863	} );
3864};
3865
3866
3867
3868
3869// The deferred used on DOM ready
3870var readyList = jQuery.Deferred();
3871
3872jQuery.fn.ready = function( fn ) {
3873
3874	readyList
3875		.then( fn )
3876
3877		// Wrap jQuery.readyException in a function so that the lookup
3878		// happens at the time of error handling instead of callback
3879		// registration.
3880		.catch( function( error ) {
3881			jQuery.readyException( error );
3882		} );
3883
3884	return this;
3885};
3886
3887jQuery.extend( {
3888
3889	// Is the DOM ready to be used? Set to true once it occurs.
3890	isReady: false,
3891
3892	// A counter to track how many items to wait for before
3893	// the ready event fires. See #6781
3894	readyWait: 1,
3895
3896	// Handle when the DOM is ready
3897	ready: function( wait ) {
3898
3899		// Abort if there are pending holds or we're already ready
3900		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
3901			return;
3902		}
3903
3904		// Remember that the DOM is ready
3905		jQuery.isReady = true;
3906
3907		// If a normal DOM Ready event fired, decrement, and wait if need be
3908		if ( wait !== true && --jQuery.readyWait > 0 ) {
3909			return;
3910		}
3911
3912		// If there are functions bound, to execute
3913		readyList.resolveWith( document, [ jQuery ] );
3914	}
3915} );
3916
3917jQuery.ready.then = readyList.then;
3918
3919// The ready event handler and self cleanup method
3920function completed() {
3921	document.removeEventListener( "DOMContentLoaded", completed );
3922	window.removeEventListener( "load", completed );
3923	jQuery.ready();
3924}
3925
3926// Catch cases where $(document).ready() is called
3927// after the browser event has already occurred.
3928// Support: IE <=9 - 10 only
3929// Older IE sometimes signals "interactive" too soon
3930if ( document.readyState === "complete" ||
3931	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
3932
3933	// Handle it asynchronously to allow scripts the opportunity to delay ready
3934	window.setTimeout( jQuery.ready );
3935
3936} else {
3937
3938	// Use the handy event callback
3939	document.addEventListener( "DOMContentLoaded", completed );
3940
3941	// A fallback to window.onload, that will always work
3942	window.addEventListener( "load", completed );
3943}
3944
3945
3946
3947
3948// Multifunctional method to get and set values of a collection
3949// The value/s can optionally be executed if it's a function
3950var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3951	var i = 0,
3952		len = elems.length,
3953		bulk = key == null;
3954
3955	// Sets many values
3956	if ( toType( key ) === "object" ) {
3957		chainable = true;
3958		for ( i in key ) {
3959			access( elems, fn, i, key[ i ], true, emptyGet, raw );
3960		}
3961
3962	// Sets one value
3963	} else if ( value !== undefined ) {
3964		chainable = true;
3965
3966		if ( !isFunction( value ) ) {
3967			raw = true;
3968		}
3969
3970		if ( bulk ) {
3971
3972			// Bulk operations run against the entire set
3973			if ( raw ) {
3974				fn.call( elems, value );
3975				fn = null;
3976
3977			// ...except when executing function values
3978			} else {
3979				bulk = fn;
3980				fn = function( elem, key, value ) {
3981					return bulk.call( jQuery( elem ), value );
3982				};
3983			}
3984		}
3985
3986		if ( fn ) {
3987			for ( ; i < len; i++ ) {
3988				fn(
3989					elems[ i ], key, raw ?
3990					value :
3991					value.call( elems[ i ], i, fn( elems[ i ], key ) )
3992				);
3993			}
3994		}
3995	}
3996
3997	if ( chainable ) {
3998		return elems;
3999	}
4000
4001	// Gets
4002	if ( bulk ) {
4003		return fn.call( elems );
4004	}
4005
4006	return len ? fn( elems[ 0 ], key ) : emptyGet;
4007};
4008
4009
4010// Matches dashed string for camelizing
4011var rmsPrefix = /^-ms-/,
4012	rdashAlpha = /-([a-z])/g;
4013
4014// Used by camelCase as callback to replace()
4015function fcamelCase( all, letter ) {
4016	return letter.toUpperCase();
4017}
4018
4019// Convert dashed to camelCase; used by the css and data modules
4020// Support: IE <=9 - 11, Edge 12 - 15
4021// Microsoft forgot to hump their vendor prefix (#9572)
4022function camelCase( string ) {
4023	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
4024}
4025var acceptData = function( owner ) {
4026
4027	// Accepts only:
4028	//  - Node
4029	//    - Node.ELEMENT_NODE
4030	//    - Node.DOCUMENT_NODE
4031	//  - Object
4032	//    - Any
4033	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
4034};
4035
4036
4037
4038
4039function Data() {
4040	this.expando = jQuery.expando + Data.uid++;
4041}
4042
4043Data.uid = 1;
4044
4045Data.prototype = {
4046
4047	cache: function( owner ) {
4048
4049		// Check if the owner object already has a cache
4050		var value = owner[ this.expando ];
4051
4052		// If not, create one
4053		if ( !value ) {
4054			value = {};
4055
4056			// We can accept data for non-element nodes in modern browsers,
4057			// but we should not, see #8335.
4058			// Always return an empty object.
4059			if ( acceptData( owner ) ) {
4060
4061				// If it is a node unlikely to be stringify-ed or looped over
4062				// use plain assignment
4063				if ( owner.nodeType ) {
4064					owner[ this.expando ] = value;
4065
4066				// Otherwise secure it in a non-enumerable property
4067				// configurable must be true to allow the property to be
4068				// deleted when data is removed
4069				} else {
4070					Object.defineProperty( owner, this.expando, {
4071						value: value,
4072						configurable: true
4073					} );
4074				}
4075			}
4076		}
4077
4078		return value;
4079	},
4080	set: function( owner, data, value ) {
4081		var prop,
4082			cache = this.cache( owner );
4083
4084		// Handle: [ owner, key, value ] args
4085		// Always use camelCase key (gh-2257)
4086		if ( typeof data === "string" ) {
4087			cache[ camelCase( data ) ] = value;
4088
4089		// Handle: [ owner, { properties } ] args
4090		} else {
4091
4092			// Copy the properties one-by-one to the cache object
4093			for ( prop in data ) {
4094				cache[ camelCase( prop ) ] = data[ prop ];
4095			}
4096		}
4097		return cache;
4098	},
4099	get: function( owner, key ) {
4100		return key === undefined ?
4101			this.cache( owner ) :
4102
4103			// Always use camelCase key (gh-2257)
4104			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
4105	},
4106	access: function( owner, key, value ) {
4107
4108		// In cases where either:
4109		//
4110		//   1. No key was specified
vendor: 8,694 bytes, lines 4111-4469
4111		//   2. A string key was specified, but no value provided
4112		//
4113		// Take the "read" path and allow the get method to determine
4114		// which value to return, respectively either:
4115		//
4116		//   1. The entire cache object
4117		//   2. The data stored at the key
4118		//
4119		if ( key === undefined ||
4120				( ( key && typeof key === "string" ) && value === undefined ) ) {
4121
4122			return this.get( owner, key );
4123		}
4124
4125		// When the key is not a string, or both a key and value
4126		// are specified, set or extend (existing objects) with either:
4127		//
4128		//   1. An object of properties
4129		//   2. A key and value
4130		//
4131		this.set( owner, key, value );
4132
4133		// Since the "set" path can have two possible entry points
4134		// return the expected data based on which path was taken[*]
4135		return value !== undefined ? value : key;
4136	},
4137	remove: function( owner, key ) {
4138		var i,
4139			cache = owner[ this.expando ];
4140
4141		if ( cache === undefined ) {
4142			return;
4143		}
4144
4145		if ( key !== undefined ) {
4146
4147			// Support array or space separated string of keys
4148			if ( Array.isArray( key ) ) {
4149
4150				// If key is an array of keys...
4151				// We always set camelCase keys, so remove that.
4152				key = key.map( camelCase );
4153			} else {
4154				key = camelCase( key );
4155
4156				// If a key with the spaces exists, use it.
4157				// Otherwise, create an array by matching non-whitespace
4158				key = key in cache ?
4159					[ key ] :
4160					( key.match( rnothtmlwhite ) || [] );
4161			}
4162
4163			i = key.length;
4164
4165			while ( i-- ) {
4166				delete cache[ key[ i ] ];
4167			}
4168		}
4169
4170		// Remove the expando if there's no more data
4171		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
4172
4173			// Support: Chrome <=35 - 45
4174			// Webkit & Blink performance suffers when deleting properties
4175			// from DOM nodes, so set to undefined instead
4176			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
4177			if ( owner.nodeType ) {
4178				owner[ this.expando ] = undefined;
4179			} else {
4180				delete owner[ this.expando ];
4181			}
4182		}
4183	},
4184	hasData: function( owner ) {
4185		var cache = owner[ this.expando ];
4186		return cache !== undefined && !jQuery.isEmptyObject( cache );
4187	}
4188};
4189var dataPriv = new Data();
4190
4191var dataUser = new Data();
4192
4193
4194
4195//	Implementation Summary
4196//
4197//	1. Enforce API surface and semantic compatibility with 1.9.x branch
4198//	2. Improve the module's maintainability by reducing the storage
4199//		paths to a single mechanism.
4200//	3. Use the same single mechanism to support "private" and "user" data.
4201//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
4202//	5. Avoid exposing implementation details on user objects (eg. expando properties)
4203//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
4204
4205var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
4206	rmultiDash = /[A-Z]/g;
4207
4208function getData( data ) {
4209	if ( data === "true" ) {
4210		return true;
4211	}
4212
4213	if ( data === "false" ) {
4214		return false;
4215	}
4216
4217	if ( data === "null" ) {
4218		return null;
4219	}
4220
4221	// Only convert to a number if it doesn't change the string
4222	if ( data === +data + "" ) {
4223		return +data;
4224	}
4225
4226	if ( rbrace.test( data ) ) {
4227		return JSON.parse( data );
4228	}
4229
4230	return data;
4231}
4232
4233function dataAttr( elem, key, data ) {
4234	var name;
4235
4236	// If nothing was found internally, try to fetch any
4237	// data from the HTML5 data-* attribute
4238	if ( data === undefined && elem.nodeType === 1 ) {
4239		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
4240		data = elem.getAttribute( name );
4241
4242		if ( typeof data === "string" ) {
4243			try {
4244				data = getData( data );
4245			} catch ( e ) {}
4246
4247			// Make sure we set the data so it isn't changed later
4248			dataUser.set( elem, key, data );
4249		} else {
4250			data = undefined;
4251		}
4252	}
4253	return data;
4254}
4255
4256jQuery.extend( {
4257	hasData: function( elem ) {
4258		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
4259	},
4260
4261	data: function( elem, name, data ) {
4262		return dataUser.access( elem, name, data );
4263	},
4264
4265	removeData: function( elem, name ) {
4266		dataUser.remove( elem, name );
4267	},
4268
4269	// TODO: Now that all calls to _data and _removeData have been replaced
4270	// with direct calls to dataPriv methods, these can be deprecated.
4271	_data: function( elem, name, data ) {
4272		return dataPriv.access( elem, name, data );
4273	},
4274
4275	_removeData: function( elem, name ) {
4276		dataPriv.remove( elem, name );
4277	}
4278} );
4279
4280jQuery.fn.extend( {
4281	data: function( key, value ) {
4282		var i, name, data,
4283			elem = this[ 0 ],
4284			attrs = elem && elem.attributes;
4285
4286		// Gets all values
4287		if ( key === undefined ) {
4288			if ( this.length ) {
4289				data = dataUser.get( elem );
4290
4291				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
4292					i = attrs.length;
4293					while ( i-- ) {
4294
4295						// Support: IE 11 only
4296						// The attrs elements can be null (#14894)
4297						if ( attrs[ i ] ) {
4298							name = attrs[ i ].name;
4299							if ( name.indexOf( "data-" ) === 0 ) {
4300								name = camelCase( name.slice( 5 ) );
4301								dataAttr( elem, name, data[ name ] );
4302							}
4303						}
4304					}
4305					dataPriv.set( elem, "hasDataAttrs", true );
4306				}
4307			}
4308
4309			return data;
4310		}
4311
4312		// Sets multiple values
4313		if ( typeof key === "object" ) {
4314			return this.each( function() {
4315				dataUser.set( this, key );
4316			} );
4317		}
4318
4319		return access( this, function( value ) {
4320			var data;
4321
4322			// The calling jQuery object (element matches) is not empty
4323			// (and therefore has an element appears at this[ 0 ]) and the
4324			// `value` parameter was not undefined. An empty jQuery object
4325			// will result in `undefined` for elem = this[ 0 ] which will
4326			// throw an exception if an attempt to read a data cache is made.
4327			if ( elem && value === undefined ) {
4328
4329				// Attempt to get data from the cache
4330				// The key will always be camelCased in Data
4331				data = dataUser.get( elem, key );
4332				if ( data !== undefined ) {
4333					return data;
4334				}
4335
4336				// Attempt to "discover" the data in
4337				// HTML5 custom data-* attrs
4338				data = dataAttr( elem, key );
4339				if ( data !== undefined ) {
4340					return data;
4341				}
4342
4343				// We tried really hard, but the data doesn't exist.
4344				return;
4345			}
4346
4347			// Set the data...
4348			this.each( function() {
4349
4350				// We always store the camelCased key
4351				dataUser.set( this, key, value );
4352			} );
4353		}, null, value, arguments.length > 1, null, true );
4354	},
4355
4356	removeData: function( key ) {
4357		return this.each( function() {
4358			dataUser.remove( this, key );
4359		} );
4360	}
4361} );
4362
4363
4364jQuery.extend( {
4365	queue: function( elem, type, data ) {
4366		var queue;
4367
4368		if ( elem ) {
4369			type = ( type || "fx" ) + "queue";
4370			queue = dataPriv.get( elem, type );
4371
4372			// Speed up dequeue by getting out quickly if this is just a lookup
4373			if ( data ) {
4374				if ( !queue || Array.isArray( data ) ) {
4375					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
4376				} else {
4377					queue.push( data );
4378				}
4379			}
4380			return queue || [];
4381		}
4382	},
4383
4384	dequeue: function( elem, type ) {
4385		type = type || "fx";
4386
4387		var queue = jQuery.queue( elem, type ),
4388			startLength = queue.length,
4389			fn = queue.shift(),
4390			hooks = jQuery._queueHooks( elem, type ),
4391			next = function() {
4392				jQuery.dequeue( elem, type );
4393			};
4394
4395		// If the fx queue is dequeued, always remove the progress sentinel
4396		if ( fn === "inprogress" ) {
4397			fn = queue.shift();
4398			startLength--;
4399		}
4400
4401		if ( fn ) {
4402
4403			// Add a progress sentinel to prevent the fx queue from being
4404			// automatically dequeued
4405			if ( type === "fx" ) {
4406				queue.unshift( "inprogress" );
4407			}
4408
4409			// Clear up the last queue stop function
4410			delete hooks.stop;
4411			fn.call( elem, next, hooks );
4412		}
4413
4414		if ( !startLength && hooks ) {
4415			hooks.empty.fire();
4416		}
4417	},
4418
4419	// Not public - generate a queueHooks object, or return the current one
4420	_queueHooks: function( elem, type ) {
4421		var key = type + "queueHooks";
4422		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
4423			empty: jQuery.Callbacks( "once memory" ).add( function() {
4424				dataPriv.remove( elem, [ type + "queue", key ] );
4425			} )
4426		} );
4427	}
4428} );
4429
4430jQuery.fn.extend( {
4431	queue: function( type, data ) {
4432		var setter = 2;
4433
4434		if ( typeof type !== "string" ) {
4435			data = type;
4436			type = "fx";
4437			setter--;
4438		}
4439
4440		if ( arguments.length < setter ) {
4441			return jQuery.queue( this[ 0 ], type );
4442		}
4443
4444		return data === undefined ?
4445			this :
4446			this.each( function() {
4447				var queue = jQuery.queue( this, type, data );
4448
4449				// Ensure a hooks for this queue
4450				jQuery._queueHooks( this, type );
4451
4452				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
4453					jQuery.dequeue( this, type );
4454				}
4455			} );
4456	},
4457	dequeue: function( type ) {
4458		return this.each( function() {
4459			jQuery.dequeue( this, type );
4460		} );
4461	},
4462	clearQueue: function( type ) {
4463		return this.queue( type || "fx", [] );
4464	},
4465
4466	// Get a promise resolved when queues of a certain type
4467	// are emptied (fx is the type by default)
4468	promise: function( type, obj ) {
4469		var tmp,
vendor: 37,137 bytes, lines 4470-5895
4470			count = 1,
4471			defer = jQuery.Deferred(),
4472			elements = this,
4473			i = this.length,
4474			resolve = function() {
4475				if ( !( --count ) ) {
4476					defer.resolveWith( elements, [ elements ] );
4477				}
4478			};
4479
4480		if ( typeof type !== "string" ) {
4481			obj = type;
4482			type = undefined;
4483		}
4484		type = type || "fx";
4485
4486		while ( i-- ) {
4487			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
4488			if ( tmp && tmp.empty ) {
4489				count++;
4490				tmp.empty.add( resolve );
4491			}
4492		}
4493		resolve();
4494		return defer.promise( obj );
4495	}
4496} );
4497var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
4498
4499var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
4500
4501
4502var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4503
4504var isHiddenWithinTree = function( elem, el ) {
4505
4506		// isHiddenWithinTree might be called from jQuery#filter function;
4507		// in that case, element will be second argument
4508		elem = el || elem;
4509
4510		// Inline style trumps all
4511		return elem.style.display === "none" ||
4512			elem.style.display === "" &&
4513
4514			// Otherwise, check computed style
4515			// Support: Firefox <=43 - 45
4516			// Disconnected elements can have computed display: none, so first confirm that elem is
4517			// in the document.
4518			jQuery.contains( elem.ownerDocument, elem ) &&
4519
4520			jQuery.css( elem, "display" ) === "none";
4521	};
4522
4523var swap = function( elem, options, callback, args ) {
4524	var ret, name,
4525		old = {};
4526
4527	// Remember the old values, and insert the new ones
4528	for ( name in options ) {
4529		old[ name ] = elem.style[ name ];
4530		elem.style[ name ] = options[ name ];
4531	}
4532
4533	ret = callback.apply( elem, args || [] );
4534
4535	// Revert the old values
4536	for ( name in options ) {
4537		elem.style[ name ] = old[ name ];
4538	}
4539
4540	return ret;
4541};
4542
4543
4544
4545
4546function adjustCSS( elem, prop, valueParts, tween ) {
4547	var adjusted, scale,
4548		maxIterations = 20,
4549		currentValue = tween ?
4550			function() {
4551				return tween.cur();
4552			} :
4553			function() {
4554				return jQuery.css( elem, prop, "" );
4555			},
4556		initial = currentValue(),
4557		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4558
4559		// Starting value computation is required for potential unit mismatches
4560		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4561			rcssNum.exec( jQuery.css( elem, prop ) );
4562
4563	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
4564
4565		// Support: Firefox <=54
4566		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
4567		initial = initial / 2;
4568
4569		// Trust units reported by jQuery.css
4570		unit = unit || initialInUnit[ 3 ];
4571
4572		// Iteratively approximate from a nonzero starting point
4573		initialInUnit = +initial || 1;
4574
4575		while ( maxIterations-- ) {
4576
4577			// Evaluate and update our best guess (doubling guesses that zero out).
4578			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
4579			jQuery.style( elem, prop, initialInUnit + unit );
4580			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
4581				maxIterations = 0;
4582			}
4583			initialInUnit = initialInUnit / scale;
4584
4585		}
4586
4587		initialInUnit = initialInUnit * 2;
4588		jQuery.style( elem, prop, initialInUnit + unit );
4589
4590		// Make sure we update the tween properties later on
4591		valueParts = valueParts || [];
4592	}
4593
4594	if ( valueParts ) {
4595		initialInUnit = +initialInUnit || +initial || 0;
4596
4597		// Apply relative offset (+=/-=) if specified
4598		adjusted = valueParts[ 1 ] ?
4599			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
4600			+valueParts[ 2 ];
4601		if ( tween ) {
4602			tween.unit = unit;
4603			tween.start = initialInUnit;
4604			tween.end = adjusted;
4605		}
4606	}
4607	return adjusted;
4608}
4609
4610
4611var defaultDisplayMap = {};
4612
4613function getDefaultDisplay( elem ) {
4614	var temp,
4615		doc = elem.ownerDocument,
4616		nodeName = elem.nodeName,
4617		display = defaultDisplayMap[ nodeName ];
4618
4619	if ( display ) {
4620		return display;
4621	}
4622
4623	temp = doc.body.appendChild( doc.createElement( nodeName ) );
4624	display = jQuery.css( temp, "display" );
4625
4626	temp.parentNode.removeChild( temp );
4627
4628	if ( display === "none" ) {
4629		display = "block";
4630	}
4631	defaultDisplayMap[ nodeName ] = display;
4632
4633	return display;
4634}
4635
4636function showHide( elements, show ) {
4637	var display, elem,
4638		values = [],
4639		index = 0,
4640		length = elements.length;
4641
4642	// Determine new display value for elements that need to change
4643	for ( ; index < length; index++ ) {
4644		elem = elements[ index ];
4645		if ( !elem.style ) {
4646			continue;
4647		}
4648
4649		display = elem.style.display;
4650		if ( show ) {
4651
4652			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
4653			// check is required in this first loop unless we have a nonempty display value (either
4654			// inline or about-to-be-restored)
4655			if ( display === "none" ) {
4656				values[ index ] = dataPriv.get( elem, "display" ) || null;
4657				if ( !values[ index ] ) {
4658					elem.style.display = "";
4659				}
4660			}
4661			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
4662				values[ index ] = getDefaultDisplay( elem );
4663			}
4664		} else {
4665			if ( display !== "none" ) {
4666				values[ index ] = "none";
4667
4668				// Remember what we're overwriting
4669				dataPriv.set( elem, "display", display );
4670			}
4671		}
4672	}
4673
4674	// Set the display of the elements in a second loop to avoid constant reflow
4675	for ( index = 0; index < length; index++ ) {
4676		if ( values[ index ] != null ) {
4677			elements[ index ].style.display = values[ index ];
4678		}
4679	}
4680
4681	return elements;
4682}
4683
4684jQuery.fn.extend( {
4685	show: function() {
4686		return showHide( this, true );
4687	},
4688	hide: function() {
4689		return showHide( this );
4690	},
4691	toggle: function( state ) {
4692		if ( typeof state === "boolean" ) {
4693			return state ? this.show() : this.hide();
4694		}
4695
4696		return this.each( function() {
4697			if ( isHiddenWithinTree( this ) ) {
4698				jQuery( this ).show();
4699			} else {
4700				jQuery( this ).hide();
4701			}
4702		} );
4703	}
4704} );
4705var rcheckableType = ( /^(?:checkbox|radio)$/i );
4706
4707var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
4708
4709var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
4710
4711
4712
4713// We have to close these tags to support XHTML (#13200)
4714var wrapMap = {
4715
4716	// Support: IE <=9 only
4717	option: [ 1, "<select multiple='multiple'>", "</select>" ],
4718
4719	// XHTML parsers do not magically insert elements in the
4720	// same way that tag soup parsers do. So we cannot shorten
4721	// this by omitting <tbody> or other required elements.
4722	thead: [ 1, "<table>", "</table>" ],
4723	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
4724	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4725	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4726
4727	_default: [ 0, "", "" ]
4728};
4729
4730// Support: IE <=9 only
4731wrapMap.optgroup = wrapMap.option;
4732
4733wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4734wrapMap.th = wrapMap.td;
4735
4736
4737function getAll( context, tag ) {
4738
4739	// Support: IE <=9 - 11 only
4740	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
4741	var ret;
4742
4743	if ( typeof context.getElementsByTagName !== "undefined" ) {
4744		ret = context.getElementsByTagName( tag || "*" );
4745
4746	} else if ( typeof context.querySelectorAll !== "undefined" ) {
4747		ret = context.querySelectorAll( tag || "*" );
4748
4749	} else {
4750		ret = [];
4751	}
4752
4753	if ( tag === undefined || tag && nodeName( context, tag ) ) {
4754		return jQuery.merge( [ context ], ret );
4755	}
4756
4757	return ret;
4758}
4759
4760
4761// Mark scripts as having already been evaluated
4762function setGlobalEval( elems, refElements ) {
4763	var i = 0,
4764		l = elems.length;
4765
4766	for ( ; i < l; i++ ) {
4767		dataPriv.set(
4768			elems[ i ],
4769			"globalEval",
4770			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
4771		);
4772	}
4773}
4774
4775
4776var rhtml = /<|&#?\w+;/;
4777
4778function buildFragment( elems, context, scripts, selection, ignored ) {
4779	var elem, tmp, tag, wrap, contains, j,
4780		fragment = context.createDocumentFragment(),
4781		nodes = [],
4782		i = 0,
4783		l = elems.length;
4784
4785	for ( ; i < l; i++ ) {
4786		elem = elems[ i ];
4787
4788		if ( elem || elem === 0 ) {
4789
4790			// Add nodes directly
4791			if ( toType( elem ) === "object" ) {
4792
4793				// Support: Android <=4.0 only, PhantomJS 1 only
4794				// push.apply(_, arraylike) throws on ancient WebKit
4795				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
4796
4797			// Convert non-html into a text node
4798			} else if ( !rhtml.test( elem ) ) {
4799				nodes.push( context.createTextNode( elem ) );
4800
4801			// Convert html into DOM nodes
4802			} else {
4803				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
4804
4805				// Deserialize a standard representation
4806				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
4807				wrap = wrapMap[ tag ] || wrapMap._default;
4808				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
4809
4810				// Descend through wrappers to the right content
4811				j = wrap[ 0 ];
4812				while ( j-- ) {
4813					tmp = tmp.lastChild;
4814				}
4815
4816				// Support: Android <=4.0 only, PhantomJS 1 only
4817				// push.apply(_, arraylike) throws on ancient WebKit
4818				jQuery.merge( nodes, tmp.childNodes );
4819
4820				// Remember the top-level container
4821				tmp = fragment.firstChild;
4822
4823				// Ensure the created nodes are orphaned (#12392)
4824				tmp.textContent = "";
4825			}
4826		}
4827	}
4828
4829	// Remove wrapper from fragment
4830	fragment.textContent = "";
4831
4832	i = 0;
4833	while ( ( elem = nodes[ i++ ] ) ) {
4834
4835		// Skip elements already in the context collection (trac-4087)
4836		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
4837			if ( ignored ) {
4838				ignored.push( elem );
4839			}
4840			continue;
4841		}
4842
4843		contains = jQuery.contains( elem.ownerDocument, elem );
4844
4845		// Append to fragment
4846		tmp = getAll( fragment.appendChild( elem ), "script" );
4847
4848		// Preserve script evaluation history
4849		if ( contains ) {
4850			setGlobalEval( tmp );
4851		}
4852
4853		// Capture executables
4854		if ( scripts ) {
4855			j = 0;
4856			while ( ( elem = tmp[ j++ ] ) ) {
4857				if ( rscriptType.test( elem.type || "" ) ) {
4858					scripts.push( elem );
4859				}
4860			}
4861		}
4862	}
4863
4864	return fragment;
4865}
4866
4867
4868( function() {
4869	var fragment = document.createDocumentFragment(),
4870		div = fragment.appendChild( document.createElement( "div" ) ),
4871		input = document.createElement( "input" );
4872
4873	// Support: Android 4.0 - 4.3 only
4874	// Check state lost if the name is set (#11217)
4875	// Support: Windows Web Apps (WWA)
4876	// `name` and `type` must use .setAttribute for WWA (#14901)
4877	input.setAttribute( "type", "radio" );
4878	input.setAttribute( "checked", "checked" );
4879	input.setAttribute( "name", "t" );
4880
4881	div.appendChild( input );
4882
4883	// Support: Android <=4.1 only
4884	// Older WebKit doesn't clone checked state correctly in fragments
4885	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4886
4887	// Support: IE <=11 only
4888	// Make sure textarea (and checkbox) defaultValue is properly cloned
4889	div.innerHTML = "<textarea>x</textarea>";
4890	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4891} )();
4892var documentElement = document.documentElement;
4893
4894
4895
4896var
4897	rkeyEvent = /^key/,
4898	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
4899	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
4900
4901function returnTrue() {
4902	return true;
4903}
4904
4905function returnFalse() {
4906	return false;
4907}
4908
4909// Support: IE <=9 only
4910// See #13393 for more info
4911function safeActiveElement() {
4912	try {
4913		return document.activeElement;
4914	} catch ( err ) { }
4915}
4916
4917function on( elem, types, selector, data, fn, one ) {
4918	var origFn, type;
4919
4920	// Types can be a map of types/handlers
4921	if ( typeof types === "object" ) {
4922
4923		// ( types-Object, selector, data )
4924		if ( typeof selector !== "string" ) {
4925
4926			// ( types-Object, data )
4927			data = data || selector;
4928			selector = undefined;
4929		}
4930		for ( type in types ) {
4931			on( elem, type, selector, data, types[ type ], one );
4932		}
4933		return elem;
4934	}
4935
4936	if ( data == null && fn == null ) {
4937
4938		// ( types, fn )
4939		fn = selector;
4940		data = selector = undefined;
4941	} else if ( fn == null ) {
4942		if ( typeof selector === "string" ) {
4943
4944			// ( types, selector, fn )
4945			fn = data;
4946			data = undefined;
4947		} else {
4948
4949			// ( types, data, fn )
4950			fn = data;
4951			data = selector;
4952			selector = undefined;
4953		}
4954	}
4955	if ( fn === false ) {
4956		fn = returnFalse;
4957	} else if ( !fn ) {
4958		return elem;
4959	}
4960
4961	if ( one === 1 ) {
4962		origFn = fn;
4963		fn = function( event ) {
4964
4965			// Can use an empty set, since event contains the info
4966			jQuery().off( event );
4967			return origFn.apply( this, arguments );
4968		};
4969
4970		// Use same guid so caller can remove using origFn
4971		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
4972	}
4973	return elem.each( function() {
4974		jQuery.event.add( this, types, fn, data, selector );
4975	} );
4976}
4977
4978/*
4979 * Helper functions for managing events -- not part of the public interface.
4980 * Props to Dean Edwards' addEvent library for many of the ideas.
4981 */
4982jQuery.event = {
4983
4984	global: {},
4985
4986	add: function( elem, types, handler, data, selector ) {
4987
4988		var handleObjIn, eventHandle, tmp,
4989			events, t, handleObj,
4990			special, handlers, type, namespaces, origType,
4991			elemData = dataPriv.get( elem );
4992
4993		// Don't attach events to noData or text/comment nodes (but allow plain objects)
4994		if ( !elemData ) {
4995			return;
4996		}
4997
4998		// Caller can pass in an object of custom data in lieu of the handler
4999		if ( handler.handler ) {
5000			handleObjIn = handler;
5001			handler = handleObjIn.handler;
5002			selector = handleObjIn.selector;
5003		}
5004
5005		// Ensure that invalid selectors throw exceptions at attach time
5006		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
5007		if ( selector ) {
5008			jQuery.find.matchesSelector( documentElement, selector );
5009		}
5010
5011		// Make sure that the handler has a unique ID, used to find/remove it later
5012		if ( !handler.guid ) {
5013			handler.guid = jQuery.guid++;
5014		}
5015
5016		// Init the element's event structure and main handler, if this is the first
5017		if ( !( events = elemData.events ) ) {
5018			events = elemData.events = {};
5019		}
5020		if ( !( eventHandle = elemData.handle ) ) {
5021			eventHandle = elemData.handle = function( e ) {
5022
5023				// Discard the second event of a jQuery.event.trigger() and
5024				// when an event is called after a page has unloaded
5025				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
5026					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
5027			};
5028		}
5029
5030		// Handle multiple events separated by a space
5031		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5032		t = types.length;
5033		while ( t-- ) {
5034			tmp = rtypenamespace.exec( types[ t ] ) || [];
5035			type = origType = tmp[ 1 ];
5036			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5037
5038			// There *must* be a type, no attaching namespace-only handlers
5039			if ( !type ) {
5040				continue;
5041			}
5042
5043			// If event changes its type, use the special event handlers for the changed type
5044			special = jQuery.event.special[ type ] || {};
5045
5046			// If selector defined, determine special event api type, otherwise given type
5047			type = ( selector ? special.delegateType : special.bindType ) || type;
5048
5049			// Update special based on newly reset type
5050			special = jQuery.event.special[ type ] || {};
5051
5052			// handleObj is passed to all event handlers
5053			handleObj = jQuery.extend( {
5054				type: type,
5055				origType: origType,
5056				data: data,
5057				handler: handler,
5058				guid: handler.guid,
5059				selector: selector,
5060				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
5061				namespace: namespaces.join( "." )
5062			}, handleObjIn );
5063
5064			// Init the event handler queue if we're the first
5065			if ( !( handlers = events[ type ] ) ) {
5066				handlers = events[ type ] = [];
5067				handlers.delegateCount = 0;
5068
5069				// Only use addEventListener if the special events handler returns false
5070				if ( !special.setup ||
5071					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
5072
5073					if ( elem.addEventListener ) {
5074						elem.addEventListener( type, eventHandle );
5075					}
5076				}
5077			}
5078
5079			if ( special.add ) {
5080				special.add.call( elem, handleObj );
5081
5082				if ( !handleObj.handler.guid ) {
5083					handleObj.handler.guid = handler.guid;
5084				}
5085			}
5086
5087			// Add to the element's handler list, delegates in front
5088			if ( selector ) {
5089				handlers.splice( handlers.delegateCount++, 0, handleObj );
5090			} else {
5091				handlers.push( handleObj );
5092			}
5093
5094			// Keep track of which events have ever been used, for event optimization
5095			jQuery.event.global[ type ] = true;
5096		}
5097
5098	},
5099
5100	// Detach an event or set of events from an element
5101	remove: function( elem, types, handler, selector, mappedTypes ) {
5102
5103		var j, origCount, tmp,
5104			events, t, handleObj,
5105			special, handlers, type, namespaces, origType,
5106			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
5107
5108		if ( !elemData || !( events = elemData.events ) ) {
5109			return;
5110		}
5111
5112		// Once for each type.namespace in types; type may be omitted
5113		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5114		t = types.length;
5115		while ( t-- ) {
5116			tmp = rtypenamespace.exec( types[ t ] ) || [];
5117			type = origType = tmp[ 1 ];
5118			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5119
5120			// Unbind all events (on this namespace, if provided) for the element
5121			if ( !type ) {
5122				for ( type in events ) {
5123					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
5124				}
5125				continue;
5126			}
5127
5128			special = jQuery.event.special[ type ] || {};
5129			type = ( selector ? special.delegateType : special.bindType ) || type;
5130			handlers = events[ type ] || [];
5131			tmp = tmp[ 2 ] &&
5132				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
5133
5134			// Remove matching events
5135			origCount = j = handlers.length;
5136			while ( j-- ) {
5137				handleObj = handlers[ j ];
5138
5139				if ( ( mappedTypes || origType === handleObj.origType ) &&
5140					( !handler || handler.guid === handleObj.guid ) &&
5141					( !tmp || tmp.test( handleObj.namespace ) ) &&
5142					( !selector || selector === handleObj.selector ||
5143						selector === "**" && handleObj.selector ) ) {
5144					handlers.splice( j, 1 );
5145
5146					if ( handleObj.selector ) {
5147						handlers.delegateCount--;
5148					}
5149					if ( special.remove ) {
5150						special.remove.call( elem, handleObj );
5151					}
5152				}
5153			}
5154
5155			// Remove generic event handler if we removed something and no more handlers exist
5156			// (avoids potential for endless recursion during removal of special event handlers)
5157			if ( origCount && !handlers.length ) {
5158				if ( !special.teardown ||
5159					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
5160
5161					jQuery.removeEvent( elem, type, elemData.handle );
5162				}
5163
5164				delete events[ type ];
5165			}
5166		}
5167
5168		// Remove data and the expando if it's no longer used
5169		if ( jQuery.isEmptyObject( events ) ) {
5170			dataPriv.remove( elem, "handle events" );
5171		}
5172	},
5173
5174	dispatch: function( nativeEvent ) {
5175
5176		// Make a writable jQuery.Event from the native event object
5177		var event = jQuery.event.fix( nativeEvent );
5178
5179		var i, j, ret, matched, handleObj, handlerQueue,
5180			args = new Array( arguments.length ),
5181			handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
5182			special = jQuery.event.special[ event.type ] || {};
5183
5184		// Use the fix-ed jQuery.Event rather than the (read-only) native event
5185		args[ 0 ] = event;
5186
5187		for ( i = 1; i < arguments.length; i++ ) {
5188			args[ i ] = arguments[ i ];
5189		}
5190
5191		event.delegateTarget = this;
5192
5193		// Call the preDispatch hook for the mapped type, and let it bail if desired
5194		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
5195			return;
5196		}
5197
5198		// Determine handlers
5199		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
5200
5201		// Run delegates first; they may want to stop propagation beneath us
5202		i = 0;
5203		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
5204			event.currentTarget = matched.elem;
5205
5206			j = 0;
5207			while ( ( handleObj = matched.handlers[ j++ ] ) &&
5208				!event.isImmediatePropagationStopped() ) {
5209
5210				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
5211				// a subset or equal to those in the bound event (both can have no namespace).
5212				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
5213
5214					event.handleObj = handleObj;
5215					event.data = handleObj.data;
5216
5217					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
5218						handleObj.handler ).apply( matched.elem, args );
5219
5220					if ( ret !== undefined ) {
5221						if ( ( event.result = ret ) === false ) {
5222							event.preventDefault();
5223							event.stopPropagation();
5224						}
5225					}
5226				}
5227			}
5228		}
5229
5230		// Call the postDispatch hook for the mapped type
5231		if ( special.postDispatch ) {
5232			special.postDispatch.call( this, event );
5233		}
5234
5235		return event.result;
5236	},
5237
5238	handlers: function( event, handlers ) {
5239		var i, handleObj, sel, matchedHandlers, matchedSelectors,
5240			handlerQueue = [],
5241			delegateCount = handlers.delegateCount,
5242			cur = event.target;
5243
5244		// Find delegate handlers
5245		if ( delegateCount &&
5246
5247			// Support: IE <=9
5248			// Black-hole SVG <use> instance trees (trac-13180)
5249			cur.nodeType &&
5250
5251			// Support: Firefox <=42
5252			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
5253			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
5254			// Support: IE 11 only
5255			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
5256			!( event.type === "click" && event.button >= 1 ) ) {
5257
5258			for ( ; cur !== this; cur = cur.parentNode || this ) {
5259
5260				// Don't check non-elements (#13208)
5261				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5262				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
5263					matchedHandlers = [];
5264					matchedSelectors = {};
5265					for ( i = 0; i < delegateCount; i++ ) {
5266						handleObj = handlers[ i ];
5267
5268						// Don't conflict with Object.prototype properties (#13203)
5269						sel = handleObj.selector + " ";
5270
5271						if ( matchedSelectors[ sel ] === undefined ) {
5272							matchedSelectors[ sel ] = handleObj.needsContext ?
5273								jQuery( sel, this ).index( cur ) > -1 :
5274								jQuery.find( sel, this, null, [ cur ] ).length;
5275						}
5276						if ( matchedSelectors[ sel ] ) {
5277							matchedHandlers.push( handleObj );
5278						}
5279					}
5280					if ( matchedHandlers.length ) {
5281						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
5282					}
5283				}
5284			}
5285		}
5286
5287		// Add the remaining (directly-bound) handlers
5288		cur = this;
5289		if ( delegateCount < handlers.length ) {
5290			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
5291		}
5292
5293		return handlerQueue;
5294	},
5295
5296	addProp: function( name, hook ) {
5297		Object.defineProperty( jQuery.Event.prototype, name, {
5298			enumerable: true,
5299			configurable: true,
5300
5301			get: isFunction( hook ) ?
5302				function() {
5303					if ( this.originalEvent ) {
5304							return hook( this.originalEvent );
5305					}
5306				} :
5307				function() {
5308					if ( this.originalEvent ) {
5309							return this.originalEvent[ name ];
5310					}
5311				},
5312
5313			set: function( value ) {
5314				Object.defineProperty( this, name, {
5315					enumerable: true,
5316					configurable: true,
5317					writable: true,
5318					value: value
5319				} );
5320			}
5321		} );
5322	},
5323
5324	fix: function( originalEvent ) {
5325		return originalEvent[ jQuery.expando ] ?
5326			originalEvent :
5327			new jQuery.Event( originalEvent );
5328	},
5329
5330	special: {
5331		load: {
5332
5333			// Prevent triggered image.load events from bubbling to window.load
5334			noBubble: true
5335		},
5336		focus: {
5337
5338			// Fire native event if possible so blur/focus sequence is correct
5339			trigger: function() {
5340				if ( this !== safeActiveElement() && this.focus ) {
5341					this.focus();
5342					return false;
5343				}
5344			},
5345			delegateType: "focusin"
5346		},
5347		blur: {
5348			trigger: function() {
5349				if ( this === safeActiveElement() && this.blur ) {
5350					this.blur();
5351					return false;
5352				}
5353			},
5354			delegateType: "focusout"
5355		},
5356		click: {
5357
5358			// For checkbox, fire native event so checked state will be right
5359			trigger: function() {
5360				if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
5361					this.click();
5362					return false;
5363				}
5364			},
5365
5366			// For cross-browser consistency, don't fire native .click() on links
5367			_default: function( event ) {
5368				return nodeName( event.target, "a" );
5369			}
5370		},
5371
5372		beforeunload: {
5373			postDispatch: function( event ) {
5374
5375				// Support: Firefox 20+
5376				// Firefox doesn't alert if the returnValue field is not set.
5377				if ( event.result !== undefined && event.originalEvent ) {
5378					event.originalEvent.returnValue = event.result;
5379				}
5380			}
5381		}
5382	}
5383};
5384
5385jQuery.removeEvent = function( elem, type, handle ) {
5386
5387	// This "if" is needed for plain objects
5388	if ( elem.removeEventListener ) {
5389		elem.removeEventListener( type, handle );
5390	}
5391};
5392
5393jQuery.Event = function( src, props ) {
5394
5395	// Allow instantiation without the 'new' keyword
5396	if ( !( this instanceof jQuery.Event ) ) {
5397		return new jQuery.Event( src, props );
5398	}
5399
5400	// Event object
5401	if ( src && src.type ) {
5402		this.originalEvent = src;
5403		this.type = src.type;
5404
5405		// Events bubbling up the document may have been marked as prevented
5406		// by a handler lower down the tree; reflect the correct value.
5407		this.isDefaultPrevented = src.defaultPrevented ||
5408				src.defaultPrevented === undefined &&
5409
5410				// Support: Android <=2.3 only
5411				src.returnValue === false ?
5412			returnTrue :
5413			returnFalse;
5414
5415		// Create target properties
5416		// Support: Safari <=6 - 7 only
5417		// Target should not be a text node (#504, #13143)
5418		this.target = ( src.target && src.target.nodeType === 3 ) ?
5419			src.target.parentNode :
5420			src.target;
5421
5422		this.currentTarget = src.currentTarget;
5423		this.relatedTarget = src.relatedTarget;
5424
5425	// Event type
5426	} else {
5427		this.type = src;
5428	}
5429
5430	// Put explicitly provided properties onto the event object
5431	if ( props ) {
5432		jQuery.extend( this, props );
5433	}
5434
5435	// Create a timestamp if incoming event doesn't have one
5436	this.timeStamp = src && src.timeStamp || Date.now();
5437
5438	// Mark it as fixed
5439	this[ jQuery.expando ] = true;
5440};
5441
5442// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5443// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5444jQuery.Event.prototype = {
5445	constructor: jQuery.Event,
5446	isDefaultPrevented: returnFalse,
5447	isPropagationStopped: returnFalse,
5448	isImmediatePropagationStopped: returnFalse,
5449	isSimulated: false,
5450
5451	preventDefault: function() {
5452		var e = this.originalEvent;
5453
5454		this.isDefaultPrevented = returnTrue;
5455
5456		if ( e && !this.isSimulated ) {
5457			e.preventDefault();
5458		}
5459	},
5460	stopPropagation: function() {
5461		var e = this.originalEvent;
5462
5463		this.isPropagationStopped = returnTrue;
5464
5465		if ( e && !this.isSimulated ) {
5466			e.stopPropagation();
5467		}
5468	},
5469	stopImmediatePropagation: function() {
5470		var e = this.originalEvent;
5471
5472		this.isImmediatePropagationStopped = returnTrue;
5473
5474		if ( e && !this.isSimulated ) {
5475			e.stopImmediatePropagation();
5476		}
5477
5478		this.stopPropagation();
5479	}
5480};
5481
5482// Includes all common event props including KeyEvent and MouseEvent specific props
5483jQuery.each( {
5484	altKey: true,
5485	bubbles: true,
5486	cancelable: true,
5487	changedTouches: true,
5488	ctrlKey: true,
5489	detail: true,
5490	eventPhase: true,
5491	metaKey: true,
5492	pageX: true,
5493	pageY: true,
5494	shiftKey: true,
5495	view: true,
5496	"char": true,
5497	charCode: true,
5498	key: true,
5499	keyCode: true,
5500	button: true,
5501	buttons: true,
5502	clientX: true,
5503	clientY: true,
5504	offsetX: true,
5505	offsetY: true,
5506	pointerId: true,
5507	pointerType: true,
5508	screenX: true,
5509	screenY: true,
5510	targetTouches: true,
5511	toElement: true,
5512	touches: true,
5513
5514	which: function( event ) {
5515		var button = event.button;
5516
5517		// Add which for key events
5518		if ( event.which == null && rkeyEvent.test( event.type ) ) {
5519			return event.charCode != null ? event.charCode : event.keyCode;
5520		}
5521
5522		// Add which for click: 1 === left; 2 === middle; 3 === right
5523		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
5524			if ( button & 1 ) {
5525				return 1;
5526			}
5527
5528			if ( button & 2 ) {
5529				return 3;
5530			}
5531
5532			if ( button & 4 ) {
5533				return 2;
5534			}
5535
5536			return 0;
5537		}
5538
5539		return event.which;
5540	}
5541}, jQuery.event.addProp );
5542
5543// Create mouseenter/leave events using mouseover/out and event-time checks
5544// so that event delegation works in jQuery.
5545// Do the same for pointerenter/pointerleave and pointerover/pointerout
5546//
5547// Support: Safari 7 only
5548// Safari sends mouseenter too often; see:
5549// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
5550// for the description of the bug (it existed in older Chrome versions as well).
5551jQuery.each( {
5552	mouseenter: "mouseover",
5553	mouseleave: "mouseout",
5554	pointerenter: "pointerover",
5555	pointerleave: "pointerout"
5556}, function( orig, fix ) {
5557	jQuery.event.special[ orig ] = {
5558		delegateType: fix,
5559		bindType: fix,
5560
5561		handle: function( event ) {
5562			var ret,
5563				target = this,
5564				related = event.relatedTarget,
5565				handleObj = event.handleObj;
5566
5567			// For mouseenter/leave call the handler if related is outside the target.
5568			// NB: No relatedTarget if the mouse left/entered the browser window
5569			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
5570				event.type = handleObj.origType;
5571				ret = handleObj.handler.apply( this, arguments );
5572				event.type = fix;
5573			}
5574			return ret;
5575		}
5576	};
5577} );
5578
5579jQuery.fn.extend( {
5580
5581	on: function( types, selector, data, fn ) {
5582		return on( this, types, selector, data, fn );
5583	},
5584	one: function( types, selector, data, fn ) {
5585		return on( this, types, selector, data, fn, 1 );
5586	},
5587	off: function( types, selector, fn ) {
5588		var handleObj, type;
5589		if ( types && types.preventDefault && types.handleObj ) {
5590
5591			// ( event )  dispatched jQuery.Event
5592			handleObj = types.handleObj;
5593			jQuery( types.delegateTarget ).off(
5594				handleObj.namespace ?
5595					handleObj.origType + "." + handleObj.namespace :
5596					handleObj.origType,
5597				handleObj.selector,
5598				handleObj.handler
5599			);
5600			return this;
5601		}
5602		if ( typeof types === "object" ) {
5603
5604			// ( types-object [, selector] )
5605			for ( type in types ) {
5606				this.off( type, selector, types[ type ] );
5607			}
5608			return this;
5609		}
5610		if ( selector === false || typeof selector === "function" ) {
5611
5612			// ( types [, fn] )
5613			fn = selector;
5614			selector = undefined;
5615		}
5616		if ( fn === false ) {
5617			fn = returnFalse;
5618		}
5619		return this.each( function() {
5620			jQuery.event.remove( this, types, fn, selector );
5621		} );
5622	}
5623} );
5624
5625
5626var
5627
5628	/* eslint-disable max-len */
5629
5630	// See https://github.com/eslint/eslint/issues/3229
5631	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
5632
5633	/* eslint-enable */
5634
5635	// Support: IE <=10 - 11, Edge 12 - 13 only
5636	// In IE/Edge using regex groups here causes severe slowdowns.
5637	// See https://connect.microsoft.com/IE/feedback/details/1736512/
5638	rnoInnerhtml = /<script|<style|<link/i,
5639
5640	// checked="checked" or checked
5641	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5642	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
5643
5644// Prefer a tbody over its parent table for containing new rows
5645function manipulationTarget( elem, content ) {
5646	if ( nodeName( elem, "table" ) &&
5647		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
5648
5649		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
5650	}
5651
5652	return elem;
5653}
5654
5655// Replace/restore the type attribute of script elements for safe DOM manipulation
5656function disableScript( elem ) {
5657	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
5658	return elem;
5659}
5660function restoreScript( elem ) {
5661	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
5662		elem.type = elem.type.slice( 5 );
5663	} else {
5664		elem.removeAttribute( "type" );
5665	}
5666
5667	return elem;
5668}
5669
5670function cloneCopyEvent( src, dest ) {
5671	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
5672
5673	if ( dest.nodeType !== 1 ) {
5674		return;
5675	}
5676
5677	// 1. Copy private data: events, handlers, etc.
5678	if ( dataPriv.hasData( src ) ) {
5679		pdataOld = dataPriv.access( src );
5680		pdataCur = dataPriv.set( dest, pdataOld );
5681		events = pdataOld.events;
5682
5683		if ( events ) {
5684			delete pdataCur.handle;
5685			pdataCur.events = {};
5686
5687			for ( type in events ) {
5688				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
5689					jQuery.event.add( dest, type, events[ type ][ i ] );
5690				}
5691			}
5692		}
5693	}
5694
5695	// 2. Copy user data
5696	if ( dataUser.hasData( src ) ) {
5697		udataOld = dataUser.access( src );
5698		udataCur = jQuery.extend( {}, udataOld );
5699
5700		dataUser.set( dest, udataCur );
5701	}
5702}
5703
5704// Fix IE bugs, see support tests
5705function fixInput( src, dest ) {
5706	var nodeName = dest.nodeName.toLowerCase();
5707
5708	// Fails to persist the checked state of a cloned checkbox or radio button.
5709	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
5710		dest.checked = src.checked;
5711
5712	// Fails to return the selected option to the default selected state when cloning options
5713	} else if ( nodeName === "input" || nodeName === "textarea" ) {
5714		dest.defaultValue = src.defaultValue;
5715	}
5716}
5717
5718function domManip( collection, args, callback, ignored ) {
5719
5720	// Flatten any nested arrays
5721	args = concat.apply( [], args );
5722
5723	var fragment, first, scripts, hasScripts, node, doc,
5724		i = 0,
5725		l = collection.length,
5726		iNoClone = l - 1,
5727		value = args[ 0 ],
5728		valueIsFunction = isFunction( value );
5729
5730	// We can't cloneNode fragments that contain checked, in WebKit
5731	if ( valueIsFunction ||
5732			( l > 1 && typeof value === "string" &&
5733				!support.checkClone && rchecked.test( value ) ) ) {
5734		return collection.each( function( index ) {
5735			var self = collection.eq( index );
5736			if ( valueIsFunction ) {
5737				args[ 0 ] = value.call( this, index, self.html() );
5738			}
5739			domManip( self, args, callback, ignored );
5740		} );
5741	}
5742
5743	if ( l ) {
5744		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
5745		first = fragment.firstChild;
5746
5747		if ( fragment.childNodes.length === 1 ) {
5748			fragment = first;
5749		}
5750
5751		// Require either new content or an interest in ignored elements to invoke the callback
5752		if ( first || ignored ) {
5753			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
5754			hasScripts = scripts.length;
5755
5756			// Use the original fragment for the last item
5757			// instead of the first because it can end up
5758			// being emptied incorrectly in certain situations (#8070).
5759			for ( ; i < l; i++ ) {
5760				node = fragment;
5761
5762				if ( i !== iNoClone ) {
5763					node = jQuery.clone( node, true, true );
5764
5765					// Keep references to cloned scripts for later restoration
5766					if ( hasScripts ) {
5767
5768						// Support: Android <=4.0 only, PhantomJS 1 only
5769						// push.apply(_, arraylike) throws on ancient WebKit
5770						jQuery.merge( scripts, getAll( node, "script" ) );
5771					}
5772				}
5773
5774				callback.call( collection[ i ], node, i );
5775			}
5776
5777			if ( hasScripts ) {
5778				doc = scripts[ scripts.length - 1 ].ownerDocument;
5779
5780				// Reenable scripts
5781				jQuery.map( scripts, restoreScript );
5782
5783				// Evaluate executable scripts on first document insertion
5784				for ( i = 0; i < hasScripts; i++ ) {
5785					node = scripts[ i ];
5786					if ( rscriptType.test( node.type || "" ) &&
5787						!dataPriv.access( node, "globalEval" ) &&
5788						jQuery.contains( doc, node ) ) {
5789
5790						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
5791
5792							// Optional AJAX dependency, but won't run scripts if not present
5793							if ( jQuery._evalUrl ) {
5794								jQuery._evalUrl( node.src );
5795							}
5796						} else {
5797							DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node );
5798						}
5799					}
5800				}
5801			}
5802		}
5803	}
5804
5805	return collection;
5806}
5807
5808function remove( elem, selector, keepData ) {
5809	var node,
5810		nodes = selector ? jQuery.filter( selector, elem ) : elem,
5811		i = 0;
5812
5813	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
5814		if ( !keepData && node.nodeType === 1 ) {
5815			jQuery.cleanData( getAll( node ) );
5816		}
5817
5818		if ( node.parentNode ) {
5819			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
5820				setGlobalEval( getAll( node, "script" ) );
5821			}
5822			node.parentNode.removeChild( node );
5823		}
5824	}
5825
5826	return elem;
5827}
5828
5829jQuery.extend( {
5830	htmlPrefilter: function( html ) {
5831		return html.replace( rxhtmlTag, "<$1></$2>" );
5832	},
5833
5834	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5835		var i, l, srcElements, destElements,
5836			clone = elem.cloneNode( true ),
5837			inPage = jQuery.contains( elem.ownerDocument, elem );
5838
5839		// Fix IE cloning issues
5840		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
5841				!jQuery.isXMLDoc( elem ) ) {
5842
5843			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
5844			destElements = getAll( clone );
5845			srcElements = getAll( elem );
5846
5847			for ( i = 0, l = srcElements.length; i < l; i++ ) {
5848				fixInput( srcElements[ i ], destElements[ i ] );
5849			}
5850		}
5851
5852		// Copy the events from the original to the clone
5853		if ( dataAndEvents ) {
5854			if ( deepDataAndEvents ) {
5855				srcElements = srcElements || getAll( elem );
5856				destElements = destElements || getAll( clone );
5857
5858				for ( i = 0, l = srcElements.length; i < l; i++ ) {
5859					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
5860				}
5861			} else {
5862				cloneCopyEvent( elem, clone );
5863			}
5864		}
5865
5866		// Preserve script evaluation history
5867		destElements = getAll( clone, "script" );
5868		if ( destElements.length > 0 ) {
5869			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
5870		}
5871
5872		// Return the cloned set
5873		return clone;
5874	},
5875
5876	cleanData: function( elems ) {
5877		var data, elem, type,
5878			special = jQuery.event.special,
5879			i = 0;
5880
5881		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
5882			if ( acceptData( elem ) ) {
5883				if ( ( data = elem[ dataPriv.expando ] ) ) {
5884					if ( data.events ) {
5885						for ( type in data.events ) {
5886							if ( special[ type ] ) {
5887								jQuery.event.remove( elem, type );
5888
5889							// This is a shortcut to avoid jQuery.event.remove's overhead
5890							} else {
5891								jQuery.removeEvent( elem, type, data.handle );
5892							}
5893						}
5894					}
5895
vendor: 1,119 bytes, lines 5896-5940
5896					// Support: Chrome <=35 - 45+
5897					// Assign undefined instead of using delete, see Data#remove
5898					elem[ dataPriv.expando ] = undefined;
5899				}
5900				if ( elem[ dataUser.expando ] ) {
5901
5902					// Support: Chrome <=35 - 45+
5903					// Assign undefined instead of using delete, see Data#remove
5904					elem[ dataUser.expando ] = undefined;
5905				}
5906			}
5907		}
5908	}
5909} );
5910
5911jQuery.fn.extend( {
5912	detach: function( selector ) {
5913		return remove( this, selector, true );
5914	},
5915
5916	remove: function( selector ) {
5917		return remove( this, selector );
5918	},
5919
5920	text: function( value ) {
5921		return access( this, function( value ) {
5922			return value === undefined ?
5923				jQuery.text( this ) :
5924				this.empty().each( function() {
5925					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5926						this.textContent = value;
5927					}
5928				} );
5929		}, null, value, arguments.length );
5930	},
5931
5932	append: function() {
5933		return domManip( this, arguments, function( elem ) {
5934			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5935				var target = manipulationTarget( this, elem );
5936				target.appendChild( elem );
5937			}
5938		} );
5939	},
5940
vendor: 52,786 bytes, lines 5941-7995
5941	prepend: function() {
5942		return domManip( this, arguments, function( elem ) {
5943			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5944				var target = manipulationTarget( this, elem );
5945				target.insertBefore( elem, target.firstChild );
5946			}
5947		} );
5948	},
5949
5950	before: function() {
5951		return domManip( this, arguments, function( elem ) {
5952			if ( this.parentNode ) {
5953				this.parentNode.insertBefore( elem, this );
5954			}
5955		} );
5956	},
5957
5958	after: function() {
5959		return domManip( this, arguments, function( elem ) {
5960			if ( this.parentNode ) {
5961				this.parentNode.insertBefore( elem, this.nextSibling );
5962			}
5963		} );
5964	},
5965
5966	empty: function() {
5967		var elem,
5968			i = 0;
5969
5970		for ( ; ( elem = this[ i ] ) != null; i++ ) {
5971			if ( elem.nodeType === 1 ) {
5972
5973				// Prevent memory leaks
5974				jQuery.cleanData( getAll( elem, false ) );
5975
5976				// Remove any remaining nodes
5977				elem.textContent = "";
5978			}
5979		}
5980
5981		return this;
5982	},
5983
5984	clone: function( dataAndEvents, deepDataAndEvents ) {
5985		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
5986		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
5987
5988		return this.map( function() {
5989			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
5990		} );
5991	},
5992
5993	html: function( value ) {
5994		return access( this, function( value ) {
5995			var elem = this[ 0 ] || {},
5996				i = 0,
5997				l = this.length;
5998
5999			if ( value === undefined && elem.nodeType === 1 ) {
6000				return elem.innerHTML;
6001			}
6002
6003			// See if we can take a shortcut and just use innerHTML
6004			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6005				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
6006
6007				value = jQuery.htmlPrefilter( value );
6008
6009				try {
6010					for ( ; i < l; i++ ) {
6011						elem = this[ i ] || {};
6012
6013						// Remove element nodes and prevent memory leaks
6014						if ( elem.nodeType === 1 ) {
6015							jQuery.cleanData( getAll( elem, false ) );
6016							elem.innerHTML = value;
6017						}
6018					}
6019
6020					elem = 0;
6021
6022				// If using innerHTML throws an exception, use the fallback method
6023				} catch ( e ) {}
6024			}
6025
6026			if ( elem ) {
6027				this.empty().append( value );
6028			}
6029		}, null, value, arguments.length );
6030	},
6031
6032	replaceWith: function() {
6033		var ignored = [];
6034
6035		// Make the changes, replacing each non-ignored context element with the new content
6036		return domManip( this, arguments, function( elem ) {
6037			var parent = this.parentNode;
6038
6039			if ( jQuery.inArray( this, ignored ) < 0 ) {
6040				jQuery.cleanData( getAll( this ) );
6041				if ( parent ) {
6042					parent.replaceChild( elem, this );
6043				}
6044			}
6045
6046		// Force callback invocation
6047		}, ignored );
6048	}
6049} );
6050
6051jQuery.each( {
6052	appendTo: "append",
6053	prependTo: "prepend",
6054	insertBefore: "before",
6055	insertAfter: "after",
6056	replaceAll: "replaceWith"
6057}, function( name, original ) {
6058	jQuery.fn[ name ] = function( selector ) {
6059		var elems,
6060			ret = [],
6061			insert = jQuery( selector ),
6062			last = insert.length - 1,
6063			i = 0;
6064
6065		for ( ; i <= last; i++ ) {
6066			elems = i === last ? this : this.clone( true );
6067			jQuery( insert[ i ] )[ original ]( elems );
6068
6069			// Support: Android <=4.0 only, PhantomJS 1 only
6070			// .get() because push.apply(_, arraylike) throws on ancient WebKit
6071			push.apply( ret, elems.get() );
6072		}
6073
6074		return this.pushStack( ret );
6075	};
6076} );
6077var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6078
6079var getStyles = function( elem ) {
6080
6081		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
6082		// IE throws on elements created in popups
6083		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6084		var view = elem.ownerDocument.defaultView;
6085
6086		if ( !view || !view.opener ) {
6087			view = window;
6088		}
6089
6090		return view.getComputedStyle( elem );
6091	};
6092
6093var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6094
6095
6096
6097( function() {
6098
6099	// Executing both pixelPosition & boxSizingReliable tests require only one layout
6100	// so they're executed at the same time to save the second computation.
6101	function computeStyleTests() {
6102
6103		// This is a singleton, we need to execute it only once
6104		if ( !div ) {
6105			return;
6106		}
6107
6108		container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
6109			"margin-top:1px;padding:0;border:0";
6110		div.style.cssText =
6111			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
6112			"margin:auto;border:1px;padding:1px;" +
6113			"width:60%;top:1%";
6114		documentElement.appendChild( container ).appendChild( div );
6115
6116		var divStyle = window.getComputedStyle( div );
6117		pixelPositionVal = divStyle.top !== "1%";
6118
6119		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
6120		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
6121
6122		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
6123		// Some styles come back with percentage values, even though they shouldn't
6124		div.style.right = "60%";
6125		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
6126
6127		// Support: IE 9 - 11 only
6128		// Detect misreporting of content dimensions for box-sizing:border-box elements
6129		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
6130
6131		// Support: IE 9 only
6132		// Detect overflow:scroll screwiness (gh-3699)
6133		div.style.position = "absolute";
6134		scrollboxSizeVal = div.offsetWidth === 36 || "absolute";
6135
6136		documentElement.removeChild( container );
6137
6138		// Nullify the div so it wouldn't be stored in the memory and
6139		// it will also be a sign that checks already performed
6140		div = null;
6141	}
6142
6143	function roundPixelMeasures( measure ) {
6144		return Math.round( parseFloat( measure ) );
6145	}
6146
6147	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
6148		reliableMarginLeftVal,
6149		container = document.createElement( "div" ),
6150		div = document.createElement( "div" );
6151
6152	// Finish early in limited (non-browser) environments
6153	if ( !div.style ) {
6154		return;
6155	}
6156
6157	// Support: IE <=9 - 11 only
6158	// Style of cloned element affects source element cloned (#8908)
6159	div.style.backgroundClip = "content-box";
6160	div.cloneNode( true ).style.backgroundClip = "";
6161	support.clearCloneStyle = div.style.backgroundClip === "content-box";
6162
6163	jQuery.extend( support, {
6164		boxSizingReliable: function() {
6165			computeStyleTests();
6166			return boxSizingReliableVal;
6167		},
6168		pixelBoxStyles: function() {
6169			computeStyleTests();
6170			return pixelBoxStylesVal;
6171		},
6172		pixelPosition: function() {
6173			computeStyleTests();
6174			return pixelPositionVal;
6175		},
6176		reliableMarginLeft: function() {
6177			computeStyleTests();
6178			return reliableMarginLeftVal;
6179		},
6180		scrollboxSize: function() {
6181			computeStyleTests();
6182			return scrollboxSizeVal;
6183		}
6184	} );
6185} )();
6186
6187
6188function curCSS( elem, name, computed ) {
6189	var width, minWidth, maxWidth, ret,
6190
6191		// Support: Firefox 51+
6192		// Retrieving style before computed somehow
6193		// fixes an issue with getting wrong values
6194		// on detached elements
6195		style = elem.style;
6196
6197	computed = computed || getStyles( elem );
6198
6199	// getPropertyValue is needed for:
6200	//   .css('filter') (IE 9 only, #12537)
6201	//   .css('--customProperty) (#3144)
6202	if ( computed ) {
6203		ret = computed.getPropertyValue( name ) || computed[ name ];
6204
6205		if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
6206			ret = jQuery.style( elem, name );
6207		}
6208
6209		// A tribute to the "awesome hack by Dean Edwards"
6210		// Android Browser returns percentage for some values,
6211		// but width seems to be reliably pixels.
6212		// This is against the CSSOM draft spec:
6213		// https://drafts.csswg.org/cssom/#resolved-values
6214		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
6215
6216			// Remember the original values
6217			width = style.width;
6218			minWidth = style.minWidth;
6219			maxWidth = style.maxWidth;
6220
6221			// Put in the new values to get a computed value out
6222			style.minWidth = style.maxWidth = style.width = ret;
6223			ret = computed.width;
6224
6225			// Revert the changed values
6226			style.width = width;
6227			style.minWidth = minWidth;
6228			style.maxWidth = maxWidth;
6229		}
6230	}
6231
6232	return ret !== undefined ?
6233
6234		// Support: IE <=9 - 11 only
6235		// IE returns zIndex value as an integer.
6236		ret + "" :
6237		ret;
6238}
6239
6240
6241function addGetHookIf( conditionFn, hookFn ) {
6242
6243	// Define the hook, we'll check on the first run if it's really needed.
6244	return {
6245		get: function() {
6246			if ( conditionFn() ) {
6247
6248				// Hook not needed (or it's not possible to use it due
6249				// to missing dependency), remove it.
6250				delete this.get;
6251				return;
6252			}
6253
6254			// Hook needed; redefine it so that the support test is not executed again.
6255			return ( this.get = hookFn ).apply( this, arguments );
6256		}
6257	};
6258}
6259
6260
6261var
6262
6263	// Swappable if display is none or starts with table
6264	// except "table", "table-cell", or "table-caption"
6265	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6266	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6267	rcustomProp = /^--/,
6268	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6269	cssNormalTransform = {
6270		letterSpacing: "0",
6271		fontWeight: "400"
6272	},
6273
6274	cssPrefixes = [ "Webkit", "Moz", "ms" ],
6275	emptyStyle = document.createElement( "div" ).style;
6276
6277// Return a css property mapped to a potentially vendor prefixed property
6278function vendorPropName( name ) {
6279
6280	// Shortcut for names that are not vendor prefixed
6281	if ( name in emptyStyle ) {
6282		return name;
6283	}
6284
6285	// Check for vendor prefixed names
6286	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6287		i = cssPrefixes.length;
6288
6289	while ( i-- ) {
6290		name = cssPrefixes[ i ] + capName;
6291		if ( name in emptyStyle ) {
6292			return name;
6293		}
6294	}
6295}
6296
6297// Return a property mapped along what jQuery.cssProps suggests or to
6298// a vendor prefixed property.
6299function finalPropName( name ) {
6300	var ret = jQuery.cssProps[ name ];
6301	if ( !ret ) {
6302		ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
6303	}
6304	return ret;
6305}
6306
6307function setPositiveNumber( elem, value, subtract ) {
6308
6309	// Any relative (+/-) values have already been
6310	// normalized at this point
6311	var matches = rcssNum.exec( value );
6312	return matches ?
6313
6314		// Guard against undefined "subtract", e.g., when used as in cssHooks
6315		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
6316		value;
6317}
6318
6319function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
6320	var i = dimension === "width" ? 1 : 0,
6321		extra = 0,
6322		delta = 0;
6323
6324	// Adjustment may not be necessary
6325	if ( box === ( isBorderBox ? "border" : "content" ) ) {
6326		return 0;
6327	}
6328
6329	for ( ; i < 4; i += 2 ) {
6330
6331		// Both box models exclude margin
6332		if ( box === "margin" ) {
6333			delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6334		}
6335
6336		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
6337		if ( !isBorderBox ) {
6338
6339			// Add padding
6340			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6341
6342			// For "border" or "margin", add border
6343			if ( box !== "padding" ) {
6344				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6345
6346			// But still keep track of it otherwise
6347			} else {
6348				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6349			}
6350
6351		// If we get here with a border-box (content + padding + border), we're seeking "content" or
6352		// "padding" or "margin"
6353		} else {
6354
6355			// For "content", subtract padding
6356			if ( box === "content" ) {
6357				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6358			}
6359
6360			// For "content" or "padding", subtract border
6361			if ( box !== "margin" ) {
6362				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6363			}
6364		}
6365	}
6366
6367	// Account for positive content-box scroll gutter when requested by providing computedVal
6368	if ( !isBorderBox && computedVal >= 0 ) {
6369
6370		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
6371		// Assuming integer scroll gutter, subtract the rest and round down
6372		delta += Math.max( 0, Math.ceil(
6373			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6374			computedVal -
6375			delta -
6376			extra -
6377			0.5
6378		) );
6379	}
6380
6381	return delta;
6382}
6383
6384function getWidthOrHeight( elem, dimension, extra ) {
6385
6386	// Start with computed style
6387	var styles = getStyles( elem ),
6388		val = curCSS( elem, dimension, styles ),
6389		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6390		valueIsBorderBox = isBorderBox;
6391
6392	// Support: Firefox <=54
6393	// Return a confounding non-pixel value or feign ignorance, as appropriate.
6394	if ( rnumnonpx.test( val ) ) {
6395		if ( !extra ) {
6396			return val;
6397		}
6398		val = "auto";
6399	}
6400
6401	// Check for style in case a browser which returns unreliable values
6402	// for getComputedStyle silently falls back to the reliable elem.style
6403	valueIsBorderBox = valueIsBorderBox &&
6404		( support.boxSizingReliable() || val === elem.style[ dimension ] );
6405
6406	// Fall back to offsetWidth/offsetHeight when value is "auto"
6407	// This happens for inline elements with no explicit setting (gh-3571)
6408	// Support: Android <=4.1 - 4.3 only
6409	// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6410	if ( val === "auto" ||
6411		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) {
6412
6413		val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];
6414
6415		// offsetWidth/offsetHeight provide border-box values
6416		valueIsBorderBox = true;
6417	}
6418
6419	// Normalize "" and auto
6420	val = parseFloat( val ) || 0;
6421
6422	// Adjust for the element's box model
6423	return ( val +
6424		boxModelAdjustment(
6425			elem,
6426			dimension,
6427			extra || ( isBorderBox ? "border" : "content" ),
6428			valueIsBorderBox,
6429			styles,
6430
6431			// Provide the current computed size to request scroll gutter calculation (gh-3589)
6432			val
6433		)
6434	) + "px";
6435}
6436
6437jQuery.extend( {
6438
6439	// Add in style property hooks for overriding the default
6440	// behavior of getting and setting a style property
6441	cssHooks: {
6442		opacity: {
6443			get: function( elem, computed ) {
6444				if ( computed ) {
6445
6446					// We should always get a number back from opacity
6447					var ret = curCSS( elem, "opacity" );
6448					return ret === "" ? "1" : ret;
6449				}
6450			}
6451		}
6452	},
6453
6454	// Don't automatically add "px" to these possibly-unitless properties
6455	cssNumber: {
6456		"animationIterationCount": true,
6457		"columnCount": true,
6458		"fillOpacity": true,
6459		"flexGrow": true,
6460		"flexShrink": true,
6461		"fontWeight": true,
6462		"lineHeight": true,
6463		"opacity": true,
6464		"order": true,
6465		"orphans": true,
6466		"widows": true,
6467		"zIndex": true,
6468		"zoom": true
6469	},
6470
6471	// Add in properties whose names you wish to fix before
6472	// setting or getting the value
6473	cssProps: {},
6474
6475	// Get and set the style property on a DOM Node
6476	style: function( elem, name, value, extra ) {
6477
6478		// Don't set styles on text and comment nodes
6479		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6480			return;
6481		}
6482
6483		// Make sure that we're working with the right name
6484		var ret, type, hooks,
6485			origName = camelCase( name ),
6486			isCustomProp = rcustomProp.test( name ),
6487			style = elem.style;
6488
6489		// Make sure that we're working with the right name. We don't
6490		// want to query the value if it is a CSS custom property
6491		// since they are user-defined.
6492		if ( !isCustomProp ) {
6493			name = finalPropName( origName );
6494		}
6495
6496		// Gets hook for the prefixed version, then unprefixed version
6497		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6498
6499		// Check if we're setting a value
6500		if ( value !== undefined ) {
6501			type = typeof value;
6502
6503			// Convert "+=" or "-=" to relative numbers (#7345)
6504			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
6505				value = adjustCSS( elem, name, ret );
6506
6507				// Fixes bug #9237
6508				type = "number";
6509			}
6510
6511			// Make sure that null and NaN values aren't set (#7116)
6512			if ( value == null || value !== value ) {
6513				return;
6514			}
6515
6516			// If a number was passed in, add the unit (except for certain CSS properties)
6517			if ( type === "number" ) {
6518				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6519			}
6520
6521			// background-* props affect original clone's values
6522			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
6523				style[ name ] = "inherit";
6524			}
6525
6526			// If a hook was provided, use that value, otherwise just set the specified value
6527			if ( !hooks || !( "set" in hooks ) ||
6528				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
6529
6530				if ( isCustomProp ) {
6531					style.setProperty( name, value );
6532				} else {
6533					style[ name ] = value;
6534				}
6535			}
6536
6537		} else {
6538
6539			// If a hook was provided get the non-computed value from there
6540			if ( hooks && "get" in hooks &&
6541				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
6542
6543				return ret;
6544			}
6545
6546			// Otherwise just get the value from the style object
6547			return style[ name ];
6548		}
6549	},
6550
6551	css: function( elem, name, extra, styles ) {
6552		var val, num, hooks,
6553			origName = camelCase( name ),
6554			isCustomProp = rcustomProp.test( name );
6555
6556		// Make sure that we're working with the right name. We don't
6557		// want to modify the value if it is a CSS custom property
6558		// since they are user-defined.
6559		if ( !isCustomProp ) {
6560			name = finalPropName( origName );
6561		}
6562
6563		// Try prefixed name followed by the unprefixed name
6564		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6565
6566		// If a hook was provided get the computed value from there
6567		if ( hooks && "get" in hooks ) {
6568			val = hooks.get( elem, true, extra );
6569		}
6570
6571		// Otherwise, if a way to get the computed value exists, use that
6572		if ( val === undefined ) {
6573			val = curCSS( elem, name, styles );
6574		}
6575
6576		// Convert "normal" to computed value
6577		if ( val === "normal" && name in cssNormalTransform ) {
6578			val = cssNormalTransform[ name ];
6579		}
6580
6581		// Make numeric if forced or a qualifier was provided and val looks numeric
6582		if ( extra === "" || extra ) {
6583			num = parseFloat( val );
6584			return extra === true || isFinite( num ) ? num || 0 : val;
6585		}
6586
6587		return val;
6588	}
6589} );
6590
6591jQuery.each( [ "height", "width" ], function( i, dimension ) {
6592	jQuery.cssHooks[ dimension ] = {
6593		get: function( elem, computed, extra ) {
6594			if ( computed ) {
6595
6596				// Certain elements can have dimension info if we invisibly show them
6597				// but it must have a current display style that would benefit
6598				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
6599
6600					// Support: Safari 8+
6601					// Table columns in Safari have non-zero offsetWidth & zero
6602					// getBoundingClientRect().width unless display is changed.
6603					// Support: IE <=11 only
6604					// Running getBoundingClientRect on a disconnected node
6605					// in IE throws an error.
6606					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
6607						swap( elem, cssShow, function() {
6608							return getWidthOrHeight( elem, dimension, extra );
6609						} ) :
6610						getWidthOrHeight( elem, dimension, extra );
6611			}
6612		},
6613
6614		set: function( elem, value, extra ) {
6615			var matches,
6616				styles = getStyles( elem ),
6617				isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6618				subtract = extra && boxModelAdjustment(
6619					elem,
6620					dimension,
6621					extra,
6622					isBorderBox,
6623					styles
6624				);
6625
6626			// Account for unreliable border-box dimensions by comparing offset* to computed and
6627			// faking a content-box to get border and padding (gh-3699)
6628			if ( isBorderBox && support.scrollboxSize() === styles.position ) {
6629				subtract -= Math.ceil(
6630					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6631					parseFloat( styles[ dimension ] ) -
6632					boxModelAdjustment( elem, dimension, "border", false, styles ) -
6633					0.5
6634				);
6635			}
6636
6637			// Convert to pixels if value adjustment is needed
6638			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
6639				( matches[ 3 ] || "px" ) !== "px" ) {
6640
6641				elem.style[ dimension ] = value;
6642				value = jQuery.css( elem, dimension );
6643			}
6644
6645			return setPositiveNumber( elem, value, subtract );
6646		}
6647	};
6648} );
6649
6650jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
6651	function( elem, computed ) {
6652		if ( computed ) {
6653			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
6654				elem.getBoundingClientRect().left -
6655					swap( elem, { marginLeft: 0 }, function() {
6656						return elem.getBoundingClientRect().left;
6657					} )
6658				) + "px";
6659		}
6660	}
6661);
6662
6663// These hooks are used by animate to expand properties
6664jQuery.each( {
6665	margin: "",
6666	padding: "",
6667	border: "Width"
6668}, function( prefix, suffix ) {
6669	jQuery.cssHooks[ prefix + suffix ] = {
6670		expand: function( value ) {
6671			var i = 0,
6672				expanded = {},
6673
6674				// Assumes a single number if not a string
6675				parts = typeof value === "string" ? value.split( " " ) : [ value ];
6676
6677			for ( ; i < 4; i++ ) {
6678				expanded[ prefix + cssExpand[ i ] + suffix ] =
6679					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
6680			}
6681
6682			return expanded;
6683		}
6684	};
6685
6686	if ( prefix !== "margin" ) {
6687		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
6688	}
6689} );
6690
6691jQuery.fn.extend( {
6692	css: function( name, value ) {
6693		return access( this, function( elem, name, value ) {
6694			var styles, len,
6695				map = {},
6696				i = 0;
6697
6698			if ( Array.isArray( name ) ) {
6699				styles = getStyles( elem );
6700				len = name.length;
6701
6702				for ( ; i < len; i++ ) {
6703					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
6704				}
6705
6706				return map;
6707			}
6708
6709			return value !== undefined ?
6710				jQuery.style( elem, name, value ) :
6711				jQuery.css( elem, name );
6712		}, name, value, arguments.length > 1 );
6713	}
6714} );
6715
6716
6717function Tween( elem, options, prop, end, easing ) {
6718	return new Tween.prototype.init( elem, options, prop, end, easing );
6719}
6720jQuery.Tween = Tween;
6721
6722Tween.prototype = {
6723	constructor: Tween,
6724	init: function( elem, options, prop, end, easing, unit ) {
6725		this.elem = elem;
6726		this.prop = prop;
6727		this.easing = easing || jQuery.easing._default;
6728		this.options = options;
6729		this.start = this.now = this.cur();
6730		this.end = end;
6731		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
6732	},
6733	cur: function() {
6734		var hooks = Tween.propHooks[ this.prop ];
6735
6736		return hooks && hooks.get ?
6737			hooks.get( this ) :
6738			Tween.propHooks._default.get( this );
6739	},
6740	run: function( percent ) {
6741		var eased,
6742			hooks = Tween.propHooks[ this.prop ];
6743
6744		if ( this.options.duration ) {
6745			this.pos = eased = jQuery.easing[ this.easing ](
6746				percent, this.options.duration * percent, 0, 1, this.options.duration
6747			);
6748		} else {
6749			this.pos = eased = percent;
6750		}
6751		this.now = ( this.end - this.start ) * eased + this.start;
6752
6753		if ( this.options.step ) {
6754			this.options.step.call( this.elem, this.now, this );
6755		}
6756
6757		if ( hooks && hooks.set ) {
6758			hooks.set( this );
6759		} else {
6760			Tween.propHooks._default.set( this );
6761		}
6762		return this;
6763	}
6764};
6765
6766Tween.prototype.init.prototype = Tween.prototype;
6767
6768Tween.propHooks = {
6769	_default: {
6770		get: function( tween ) {
6771			var result;
6772
6773			// Use a property on the element directly when it is not a DOM element,
6774			// or when there is no matching style property that exists.
6775			if ( tween.elem.nodeType !== 1 ||
6776				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
6777				return tween.elem[ tween.prop ];
6778			}
6779
6780			// Passing an empty string as a 3rd parameter to .css will automatically
6781			// attempt a parseFloat and fallback to a string if the parse fails.
6782			// Simple values such as "10px" are parsed to Float;
6783			// complex values such as "rotate(1rad)" are returned as-is.
6784			result = jQuery.css( tween.elem, tween.prop, "" );
6785
6786			// Empty strings, null, undefined and "auto" are converted to 0.
6787			return !result || result === "auto" ? 0 : result;
6788		},
6789		set: function( tween ) {
6790
6791			// Use step hook for back compat.
6792			// Use cssHook if its there.
6793			// Use .style if available and use plain properties where available.
6794			if ( jQuery.fx.step[ tween.prop ] ) {
6795				jQuery.fx.step[ tween.prop ]( tween );
6796			} else if ( tween.elem.nodeType === 1 &&
6797				( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
6798					jQuery.cssHooks[ tween.prop ] ) ) {
6799				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
6800			} else {
6801				tween.elem[ tween.prop ] = tween.now;
6802			}
6803		}
6804	}
6805};
6806
6807// Support: IE <=9 only
6808// Panic based approach to setting things on disconnected nodes
6809Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
6810	set: function( tween ) {
6811		if ( tween.elem.nodeType && tween.elem.parentNode ) {
6812			tween.elem[ tween.prop ] = tween.now;
6813		}
6814	}
6815};
6816
6817jQuery.easing = {
6818	linear: function( p ) {
6819		return p;
6820	},
6821	swing: function( p ) {
6822		return 0.5 - Math.cos( p * Math.PI ) / 2;
6823	},
6824	_default: "swing"
6825};
6826
6827jQuery.fx = Tween.prototype.init;
6828
6829// Back compat <1.8 extension point
6830jQuery.fx.step = {};
6831
6832
6833
6834
6835var
6836	fxNow, inProgress,
6837	rfxtypes = /^(?:toggle|show|hide)$/,
6838	rrun = /queueHooks$/;
6839
6840function schedule() {
6841	if ( inProgress ) {
6842		if ( document.hidden === false && window.requestAnimationFrame ) {
6843			window.requestAnimationFrame( schedule );
6844		} else {
6845			window.setTimeout( schedule, jQuery.fx.interval );
6846		}
6847
6848		jQuery.fx.tick();
6849	}
6850}
6851
6852// Animations created synchronously will run synchronously
6853function createFxNow() {
6854	window.setTimeout( function() {
6855		fxNow = undefined;
6856	} );
6857	return ( fxNow = Date.now() );
6858}
6859
6860// Generate parameters to create a standard animation
6861function genFx( type, includeWidth ) {
6862	var which,
6863		i = 0,
6864		attrs = { height: type };
6865
6866	// If we include width, step value is 1 to do all cssExpand values,
6867	// otherwise step value is 2 to skip over Left and Right
6868	includeWidth = includeWidth ? 1 : 0;
6869	for ( ; i < 4; i += 2 - includeWidth ) {
6870		which = cssExpand[ i ];
6871		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
6872	}
6873
6874	if ( includeWidth ) {
6875		attrs.opacity = attrs.width = type;
6876	}
6877
6878	return attrs;
6879}
6880
6881function createTween( value, prop, animation ) {
6882	var tween,
6883		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
6884		index = 0,
6885		length = collection.length;
6886	for ( ; index < length; index++ ) {
6887		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
6888
6889			// We're done with this property
6890			return tween;
6891		}
6892	}
6893}
6894
6895function defaultPrefilter( elem, props, opts ) {
6896	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
6897		isBox = "width" in props || "height" in props,
6898		anim = this,
6899		orig = {},
6900		style = elem.style,
6901		hidden = elem.nodeType && isHiddenWithinTree( elem ),
6902		dataShow = dataPriv.get( elem, "fxshow" );
6903
6904	// Queue-skipping animations hijack the fx hooks
6905	if ( !opts.queue ) {
6906		hooks = jQuery._queueHooks( elem, "fx" );
6907		if ( hooks.unqueued == null ) {
6908			hooks.unqueued = 0;
6909			oldfire = hooks.empty.fire;
6910			hooks.empty.fire = function() {
6911				if ( !hooks.unqueued ) {
6912					oldfire();
6913				}
6914			};
6915		}
6916		hooks.unqueued++;
6917
6918		anim.always( function() {
6919
6920			// Ensure the complete handler is called before this completes
6921			anim.always( function() {
6922				hooks.unqueued--;
6923				if ( !jQuery.queue( elem, "fx" ).length ) {
6924					hooks.empty.fire();
6925				}
6926			} );
6927		} );
6928	}
6929
6930	// Detect show/hide animations
6931	for ( prop in props ) {
6932		value = props[ prop ];
6933		if ( rfxtypes.test( value ) ) {
6934			delete props[ prop ];
6935			toggle = toggle || value === "toggle";
6936			if ( value === ( hidden ? "hide" : "show" ) ) {
6937
6938				// Pretend to be hidden if this is a "show" and
6939				// there is still data from a stopped show/hide
6940				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
6941					hidden = true;
6942
6943				// Ignore all other no-op show/hide data
6944				} else {
6945					continue;
6946				}
6947			}
6948			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
6949		}
6950	}
6951
6952	// Bail out if this is a no-op like .hide().hide()
6953	propTween = !jQuery.isEmptyObject( props );
6954	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
6955		return;
6956	}
6957
6958	// Restrict "overflow" and "display" styles during box animations
6959	if ( isBox && elem.nodeType === 1 ) {
6960
6961		// Support: IE <=9 - 11, Edge 12 - 15
6962		// Record all 3 overflow attributes because IE does not infer the shorthand
6963		// from identically-valued overflowX and overflowY and Edge just mirrors
6964		// the overflowX value there.
6965		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
6966
6967		// Identify a display type, preferring old show/hide data over the CSS cascade
6968		restoreDisplay = dataShow && dataShow.display;
6969		if ( restoreDisplay == null ) {
6970			restoreDisplay = dataPriv.get( elem, "display" );
6971		}
6972		display = jQuery.css( elem, "display" );
6973		if ( display === "none" ) {
6974			if ( restoreDisplay ) {
6975				display = restoreDisplay;
6976			} else {
6977
6978				// Get nonempty value(s) by temporarily forcing visibility
6979				showHide( [ elem ], true );
6980				restoreDisplay = elem.style.display || restoreDisplay;
6981				display = jQuery.css( elem, "display" );
6982				showHide( [ elem ] );
6983			}
6984		}
6985
6986		// Animate inline elements as inline-block
6987		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
6988			if ( jQuery.css( elem, "float" ) === "none" ) {
6989
6990				// Restore the original display value at the end of pure show/hide animations
6991				if ( !propTween ) {
6992					anim.done( function() {
6993						style.display = restoreDisplay;
6994					} );
6995					if ( restoreDisplay == null ) {
6996						display = style.display;
6997						restoreDisplay = display === "none" ? "" : display;
6998					}
6999				}
7000				style.display = "inline-block";
7001			}
7002		}
7003	}
7004
7005	if ( opts.overflow ) {
7006		style.overflow = "hidden";
7007		anim.always( function() {
7008			style.overflow = opts.overflow[ 0 ];
7009			style.overflowX = opts.overflow[ 1 ];
7010			style.overflowY = opts.overflow[ 2 ];
7011		} );
7012	}
7013
7014	// Implement show/hide animations
7015	propTween = false;
7016	for ( prop in orig ) {
7017
7018		// General show/hide setup for this element animation
7019		if ( !propTween ) {
7020			if ( dataShow ) {
7021				if ( "hidden" in dataShow ) {
7022					hidden = dataShow.hidden;
7023				}
7024			} else {
7025				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
7026			}
7027
7028			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
7029			if ( toggle ) {
7030				dataShow.hidden = !hidden;
7031			}
7032
7033			// Show elements before animating them
7034			if ( hidden ) {
7035				showHide( [ elem ], true );
7036			}
7037
7038			/* eslint-disable no-loop-func */
7039
7040			anim.done( function() {
7041
7042			/* eslint-enable no-loop-func */
7043
7044				// The final step of a "hide" animation is actually hiding the element
7045				if ( !hidden ) {
7046					showHide( [ elem ] );
7047				}
7048				dataPriv.remove( elem, "fxshow" );
7049				for ( prop in orig ) {
7050					jQuery.style( elem, prop, orig[ prop ] );
7051				}
7052			} );
7053		}
7054
7055		// Per-property setup
7056		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
7057		if ( !( prop in dataShow ) ) {
7058			dataShow[ prop ] = propTween.start;
7059			if ( hidden ) {
7060				propTween.end = propTween.start;
7061				propTween.start = 0;
7062			}
7063		}
7064	}
7065}
7066
7067function propFilter( props, specialEasing ) {
7068	var index, name, easing, value, hooks;
7069
7070	// camelCase, specialEasing and expand cssHook pass
7071	for ( index in props ) {
7072		name = camelCase( index );
7073		easing = specialEasing[ name ];
7074		value = props[ index ];
7075		if ( Array.isArray( value ) ) {
7076			easing = value[ 1 ];
7077			value = props[ index ] = value[ 0 ];
7078		}
7079
7080		if ( index !== name ) {
7081			props[ name ] = value;
7082			delete props[ index ];
7083		}
7084
7085		hooks = jQuery.cssHooks[ name ];
7086		if ( hooks && "expand" in hooks ) {
7087			value = hooks.expand( value );
7088			delete props[ name ];
7089
7090			// Not quite $.extend, this won't overwrite existing keys.
7091			// Reusing 'index' because we have the correct "name"
7092			for ( index in value ) {
7093				if ( !( index in props ) ) {
7094					props[ index ] = value[ index ];
7095					specialEasing[ index ] = easing;
7096				}
7097			}
7098		} else {
7099			specialEasing[ name ] = easing;
7100		}
7101	}
7102}
7103
7104function Animation( elem, properties, options ) {
7105	var result,
7106		stopped,
7107		index = 0,
7108		length = Animation.prefilters.length,
7109		deferred = jQuery.Deferred().always( function() {
7110
7111			// Don't match elem in the :animated selector
7112			delete tick.elem;
7113		} ),
7114		tick = function() {
7115			if ( stopped ) {
7116				return false;
7117			}
7118			var currentTime = fxNow || createFxNow(),
7119				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7120
7121				// Support: Android 2.3 only
7122				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
7123				temp = remaining / animation.duration || 0,
7124				percent = 1 - temp,
7125				index = 0,
7126				length = animation.tweens.length;
7127
7128			for ( ; index < length; index++ ) {
7129				animation.tweens[ index ].run( percent );
7130			}
7131
7132			deferred.notifyWith( elem, [ animation, percent, remaining ] );
7133
7134			// If there's more to do, yield
7135			if ( percent < 1 && length ) {
7136				return remaining;
7137			}
7138
7139			// If this was an empty animation, synthesize a final progress notification
7140			if ( !length ) {
7141				deferred.notifyWith( elem, [ animation, 1, 0 ] );
7142			}
7143
7144			// Resolve the animation and report its conclusion
7145			deferred.resolveWith( elem, [ animation ] );
7146			return false;
7147		},
7148		animation = deferred.promise( {
7149			elem: elem,
7150			props: jQuery.extend( {}, properties ),
7151			opts: jQuery.extend( true, {
7152				specialEasing: {},
7153				easing: jQuery.easing._default
7154			}, options ),
7155			originalProperties: properties,
7156			originalOptions: options,
7157			startTime: fxNow || createFxNow(),
7158			duration: options.duration,
7159			tweens: [],
7160			createTween: function( prop, end ) {
7161				var tween = jQuery.Tween( elem, animation.opts, prop, end,
7162						animation.opts.specialEasing[ prop ] || animation.opts.easing );
7163				animation.tweens.push( tween );
7164				return tween;
7165			},
7166			stop: function( gotoEnd ) {
7167				var index = 0,
7168
7169					// If we are going to the end, we want to run all the tweens
7170					// otherwise we skip this part
7171					length = gotoEnd ? animation.tweens.length : 0;
7172				if ( stopped ) {
7173					return this;
7174				}
7175				stopped = true;
7176				for ( ; index < length; index++ ) {
7177					animation.tweens[ index ].run( 1 );
7178				}
7179
7180				// Resolve when we played the last frame; otherwise, reject
7181				if ( gotoEnd ) {
7182					deferred.notifyWith( elem, [ animation, 1, 0 ] );
7183					deferred.resolveWith( elem, [ animation, gotoEnd ] );
7184				} else {
7185					deferred.rejectWith( elem, [ animation, gotoEnd ] );
7186				}
7187				return this;
7188			}
7189		} ),
7190		props = animation.props;
7191
7192	propFilter( props, animation.opts.specialEasing );
7193
7194	for ( ; index < length; index++ ) {
7195		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
7196		if ( result ) {
7197			if ( isFunction( result.stop ) ) {
7198				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
7199					result.stop.bind( result );
7200			}
7201			return result;
7202		}
7203	}
7204
7205	jQuery.map( props, createTween, animation );
7206
7207	if ( isFunction( animation.opts.start ) ) {
7208		animation.opts.start.call( elem, animation );
7209	}
7210
7211	// Attach callbacks from options
7212	animation
7213		.progress( animation.opts.progress )
7214		.done( animation.opts.done, animation.opts.complete )
7215		.fail( animation.opts.fail )
7216		.always( animation.opts.always );
7217
7218	jQuery.fx.timer(
7219		jQuery.extend( tick, {
7220			elem: elem,
7221			anim: animation,
7222			queue: animation.opts.queue
7223		} )
7224	);
7225
7226	return animation;
7227}
7228
7229jQuery.Animation = jQuery.extend( Animation, {
7230
7231	tweeners: {
7232		"*": [ function( prop, value ) {
7233			var tween = this.createTween( prop, value );
7234			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
7235			return tween;
7236		} ]
7237	},
7238
7239	tweener: function( props, callback ) {
7240		if ( isFunction( props ) ) {
7241			callback = props;
7242			props = [ "*" ];
7243		} else {
7244			props = props.match( rnothtmlwhite );
7245		}
7246
7247		var prop,
7248			index = 0,
7249			length = props.length;
7250
7251		for ( ; index < length; index++ ) {
7252			prop = props[ index ];
7253			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
7254			Animation.tweeners[ prop ].unshift( callback );
7255		}
7256	},
7257
7258	prefilters: [ defaultPrefilter ],
7259
7260	prefilter: function( callback, prepend ) {
7261		if ( prepend ) {
7262			Animation.prefilters.unshift( callback );
7263		} else {
7264			Animation.prefilters.push( callback );
7265		}
7266	}
7267} );
7268
7269jQuery.speed = function( speed, easing, fn ) {
7270	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7271		complete: fn || !fn && easing ||
7272			isFunction( speed ) && speed,
7273		duration: speed,
7274		easing: fn && easing || easing && !isFunction( easing ) && easing
7275	};
7276
7277	// Go to the end state if fx are off
7278	if ( jQuery.fx.off ) {
7279		opt.duration = 0;
7280
7281	} else {
7282		if ( typeof opt.duration !== "number" ) {
7283			if ( opt.duration in jQuery.fx.speeds ) {
7284				opt.duration = jQuery.fx.speeds[ opt.duration ];
7285
7286			} else {
7287				opt.duration = jQuery.fx.speeds._default;
7288			}
7289		}
7290	}
7291
7292	// Normalize opt.queue - true/undefined/null -> "fx"
7293	if ( opt.queue == null || opt.queue === true ) {
7294		opt.queue = "fx";
7295	}
7296
7297	// Queueing
7298	opt.old = opt.complete;
7299
7300	opt.complete = function() {
7301		if ( isFunction( opt.old ) ) {
7302			opt.old.call( this );
7303		}
7304
7305		if ( opt.queue ) {
7306			jQuery.dequeue( this, opt.queue );
7307		}
7308	};
7309
7310	return opt;
7311};
7312
7313jQuery.fn.extend( {
7314	fadeTo: function( speed, to, easing, callback ) {
7315
7316		// Show any hidden elements after setting opacity to 0
7317		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
7318
7319			// Animate to the value specified
7320			.end().animate( { opacity: to }, speed, easing, callback );
7321	},
7322	animate: function( prop, speed, easing, callback ) {
7323		var empty = jQuery.isEmptyObject( prop ),
7324			optall = jQuery.speed( speed, easing, callback ),
7325			doAnimation = function() {
7326
7327				// Operate on a copy of prop so per-property easing won't be lost
7328				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7329
7330				// Empty animations, or finishing resolves immediately
7331				if ( empty || dataPriv.get( this, "finish" ) ) {
7332					anim.stop( true );
7333				}
7334			};
7335			doAnimation.finish = doAnimation;
7336
7337		return empty || optall.queue === false ?
7338			this.each( doAnimation ) :
7339			this.queue( optall.queue, doAnimation );
7340	},
7341	stop: function( type, clearQueue, gotoEnd ) {
7342		var stopQueue = function( hooks ) {
7343			var stop = hooks.stop;
7344			delete hooks.stop;
7345			stop( gotoEnd );
7346		};
7347
7348		if ( typeof type !== "string" ) {
7349			gotoEnd = clearQueue;
7350			clearQueue = type;
7351			type = undefined;
7352		}
7353		if ( clearQueue && type !== false ) {
7354			this.queue( type || "fx", [] );
7355		}
7356
7357		return this.each( function() {
7358			var dequeue = true,
7359				index = type != null && type + "queueHooks",
7360				timers = jQuery.timers,
7361				data = dataPriv.get( this );
7362
7363			if ( index ) {
7364				if ( data[ index ] && data[ index ].stop ) {
7365					stopQueue( data[ index ] );
7366				}
7367			} else {
7368				for ( index in data ) {
7369					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7370						stopQueue( data[ index ] );
7371					}
7372				}
7373			}
7374
7375			for ( index = timers.length; index--; ) {
7376				if ( timers[ index ].elem === this &&
7377					( type == null || timers[ index ].queue === type ) ) {
7378
7379					timers[ index ].anim.stop( gotoEnd );
7380					dequeue = false;
7381					timers.splice( index, 1 );
7382				}
7383			}
7384
7385			// Start the next in the queue if the last step wasn't forced.
7386			// Timers currently will call their complete callbacks, which
7387			// will dequeue but only if they were gotoEnd.
7388			if ( dequeue || !gotoEnd ) {
7389				jQuery.dequeue( this, type );
7390			}
7391		} );
7392	},
7393	finish: function( type ) {
7394		if ( type !== false ) {
7395			type = type || "fx";
7396		}
7397		return this.each( function() {
7398			var index,
7399				data = dataPriv.get( this ),
7400				queue = data[ type + "queue" ],
7401				hooks = data[ type + "queueHooks" ],
7402				timers = jQuery.timers,
7403				length = queue ? queue.length : 0;
7404
7405			// Enable finishing flag on private data
7406			data.finish = true;
7407
7408			// Empty the queue first
7409			jQuery.queue( this, type, [] );
7410
7411			if ( hooks && hooks.stop ) {
7412				hooks.stop.call( this, true );
7413			}
7414
7415			// Look for any active animations, and finish them
7416			for ( index = timers.length; index--; ) {
7417				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
7418					timers[ index ].anim.stop( true );
7419					timers.splice( index, 1 );
7420				}
7421			}
7422
7423			// Look for any animations in the old queue and finish them
7424			for ( index = 0; index < length; index++ ) {
7425				if ( queue[ index ] && queue[ index ].finish ) {
7426					queue[ index ].finish.call( this );
7427				}
7428			}
7429
7430			// Turn off finishing flag
7431			delete data.finish;
7432		} );
7433	}
7434} );
7435
7436jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
7437	var cssFn = jQuery.fn[ name ];
7438	jQuery.fn[ name ] = function( speed, easing, callback ) {
7439		return speed == null || typeof speed === "boolean" ?
7440			cssFn.apply( this, arguments ) :
7441			this.animate( genFx( name, true ), speed, easing, callback );
7442	};
7443} );
7444
7445// Generate shortcuts for custom animations
7446jQuery.each( {
7447	slideDown: genFx( "show" ),
7448	slideUp: genFx( "hide" ),
7449	slideToggle: genFx( "toggle" ),
7450	fadeIn: { opacity: "show" },
7451	fadeOut: { opacity: "hide" },
7452	fadeToggle: { opacity: "toggle" }
7453}, function( name, props ) {
7454	jQuery.fn[ name ] = function( speed, easing, callback ) {
7455		return this.animate( props, speed, easing, callback );
7456	};
7457} );
7458
7459jQuery.timers = [];
7460jQuery.fx.tick = function() {
7461	var timer,
7462		i = 0,
7463		timers = jQuery.timers;
7464
7465	fxNow = Date.now();
7466
7467	for ( ; i < timers.length; i++ ) {
7468		timer = timers[ i ];
7469
7470		// Run the timer and safely remove it when done (allowing for external removal)
7471		if ( !timer() && timers[ i ] === timer ) {
7472			timers.splice( i--, 1 );
7473		}
7474	}
7475
7476	if ( !timers.length ) {
7477		jQuery.fx.stop();
7478	}
7479	fxNow = undefined;
7480};
7481
7482jQuery.fx.timer = function( timer ) {
7483	jQuery.timers.push( timer );
7484	jQuery.fx.start();
7485};
7486
7487jQuery.fx.interval = 13;
7488jQuery.fx.start = function() {
7489	if ( inProgress ) {
7490		return;
7491	}
7492
7493	inProgress = true;
7494	schedule();
7495};
7496
7497jQuery.fx.stop = function() {
7498	inProgress = null;
7499};
7500
7501jQuery.fx.speeds = {
7502	slow: 600,
7503	fast: 200,
7504
7505	// Default speed
7506	_default: 400
7507};
7508
7509
7510// Based off of the plugin by Clint Helfers, with permission.
7511// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
7512jQuery.fn.delay = function( time, type ) {
7513	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7514	type = type || "fx";
7515
7516	return this.queue( type, function( next, hooks ) {
7517		var timeout = window.setTimeout( next, time );
7518		hooks.stop = function() {
7519			window.clearTimeout( timeout );
7520		};
7521	} );
7522};
7523
7524
7525( function() {
7526	var input = document.createElement( "input" ),
7527		select = document.createElement( "select" ),
7528		opt = select.appendChild( document.createElement( "option" ) );
7529
7530	input.type = "checkbox";
7531
7532	// Support: Android <=4.3 only
7533	// Default value for a checkbox should be "on"
7534	support.checkOn = input.value !== "";
7535
7536	// Support: IE <=11 only
7537	// Must access selectedIndex to make default options select
7538	support.optSelected = opt.selected;
7539
7540	// Support: IE <=11 only
7541	// An input loses its value after becoming a radio
7542	input = document.createElement( "input" );
7543	input.value = "t";
7544	input.type = "radio";
7545	support.radioValue = input.value === "t";
7546} )();
7547
7548
7549var boolHook,
7550	attrHandle = jQuery.expr.attrHandle;
7551
7552jQuery.fn.extend( {
7553	attr: function( name, value ) {
7554		return access( this, jQuery.attr, name, value, arguments.length > 1 );
7555	},
7556
7557	removeAttr: function( name ) {
7558		return this.each( function() {
7559			jQuery.removeAttr( this, name );
7560		} );
7561	}
7562} );
7563
7564jQuery.extend( {
7565	attr: function( elem, name, value ) {
7566		var ret, hooks,
7567			nType = elem.nodeType;
7568
7569		// Don't get/set attributes on text, comment and attribute nodes
7570		if ( nType === 3 || nType === 8 || nType === 2 ) {
7571			return;
7572		}
7573
7574		// Fallback to prop when attributes are not supported
7575		if ( typeof elem.getAttribute === "undefined" ) {
7576			return jQuery.prop( elem, name, value );
7577		}
7578
7579		// Attribute hooks are determined by the lowercase version
7580		// Grab necessary hook if one is defined
7581		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7582			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
7583				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
7584		}
7585
7586		if ( value !== undefined ) {
7587			if ( value === null ) {
7588				jQuery.removeAttr( elem, name );
7589				return;
7590			}
7591
7592			if ( hooks && "set" in hooks &&
7593				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
7594				return ret;
7595			}
7596
7597			elem.setAttribute( name, value + "" );
7598			return value;
7599		}
7600
7601		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
7602			return ret;
7603		}
7604
7605		ret = jQuery.find.attr( elem, name );
7606
7607		// Non-existent attributes return null, we normalize to undefined
7608		return ret == null ? undefined : ret;
7609	},
7610
7611	attrHooks: {
7612		type: {
7613			set: function( elem, value ) {
7614				if ( !support.radioValue && value === "radio" &&
7615					nodeName( elem, "input" ) ) {
7616					var val = elem.value;
7617					elem.setAttribute( "type", value );
7618					if ( val ) {
7619						elem.value = val;
7620					}
7621					return value;
7622				}
7623			}
7624		}
7625	},
7626
7627	removeAttr: function( elem, value ) {
7628		var name,
7629			i = 0,
7630
7631			// Attribute names can contain non-HTML whitespace characters
7632			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
7633			attrNames = value && value.match( rnothtmlwhite );
7634
7635		if ( attrNames && elem.nodeType === 1 ) {
7636			while ( ( name = attrNames[ i++ ] ) ) {
7637				elem.removeAttribute( name );
7638			}
7639		}
7640	}
7641} );
7642
7643// Hooks for boolean attributes
7644boolHook = {
7645	set: function( elem, value, name ) {
7646		if ( value === false ) {
7647
7648			// Remove boolean attributes when set to false
7649			jQuery.removeAttr( elem, name );
7650		} else {
7651			elem.setAttribute( name, name );
7652		}
7653		return name;
7654	}
7655};
7656
7657jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
7658	var getter = attrHandle[ name ] || jQuery.find.attr;
7659
7660	attrHandle[ name ] = function( elem, name, isXML ) {
7661		var ret, handle,
7662			lowercaseName = name.toLowerCase();
7663
7664		if ( !isXML ) {
7665
7666			// Avoid an infinite loop by temporarily removing this function from the getter
7667			handle = attrHandle[ lowercaseName ];
7668			attrHandle[ lowercaseName ] = ret;
7669			ret = getter( elem, name, isXML ) != null ?
7670				lowercaseName :
7671				null;
7672			attrHandle[ lowercaseName ] = handle;
7673		}
7674		return ret;
7675	};
7676} );
7677
7678
7679
7680
7681var rfocusable = /^(?:input|select|textarea|button)$/i,
7682	rclickable = /^(?:a|area)$/i;
7683
7684jQuery.fn.extend( {
7685	prop: function( name, value ) {
7686		return access( this, jQuery.prop, name, value, arguments.length > 1 );
7687	},
7688
7689	removeProp: function( name ) {
7690		return this.each( function() {
7691			delete this[ jQuery.propFix[ name ] || name ];
7692		} );
7693	}
7694} );
7695
7696jQuery.extend( {
7697	prop: function( elem, name, value ) {
7698		var ret, hooks,
7699			nType = elem.nodeType;
7700
7701		// Don't get/set properties on text, comment and attribute nodes
7702		if ( nType === 3 || nType === 8 || nType === 2 ) {
7703			return;
7704		}
7705
7706		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7707
7708			// Fix name and attach hooks
7709			name = jQuery.propFix[ name ] || name;
7710			hooks = jQuery.propHooks[ name ];
7711		}
7712
7713		if ( value !== undefined ) {
7714			if ( hooks && "set" in hooks &&
7715				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
7716				return ret;
7717			}
7718
7719			return ( elem[ name ] = value );
7720		}
7721
7722		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
7723			return ret;
7724		}
7725
7726		return elem[ name ];
7727	},
7728
7729	propHooks: {
7730		tabIndex: {
7731			get: function( elem ) {
7732
7733				// Support: IE <=9 - 11 only
7734				// elem.tabIndex doesn't always return the
7735				// correct value when it hasn't been explicitly set
7736				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
7737				// Use proper attribute retrieval(#12072)
7738				var tabindex = jQuery.find.attr( elem, "tabindex" );
7739
7740				if ( tabindex ) {
7741					return parseInt( tabindex, 10 );
7742				}
7743
7744				if (
7745					rfocusable.test( elem.nodeName ) ||
7746					rclickable.test( elem.nodeName ) &&
7747					elem.href
7748				) {
7749					return 0;
7750				}
7751
7752				return -1;
7753			}
7754		}
7755	},
7756
7757	propFix: {
7758		"for": "htmlFor",
7759		"class": "className"
7760	}
7761} );
7762
7763// Support: IE <=11 only
7764// Accessing the selectedIndex property
7765// forces the browser to respect setting selected
7766// on the option
7767// The getter ensures a default option is selected
7768// when in an optgroup
7769// eslint rule "no-unused-expressions" is disabled for this code
7770// since it considers such accessions noop
7771if ( !support.optSelected ) {
7772	jQuery.propHooks.selected = {
7773		get: function( elem ) {
7774
7775			/* eslint no-unused-expressions: "off" */
7776
7777			var parent = elem.parentNode;
7778			if ( parent && parent.parentNode ) {
7779				parent.parentNode.selectedIndex;
7780			}
7781			return null;
7782		},
7783		set: function( elem ) {
7784
7785			/* eslint no-unused-expressions: "off" */
7786
7787			var parent = elem.parentNode;
7788			if ( parent ) {
7789				parent.selectedIndex;
7790
7791				if ( parent.parentNode ) {
7792					parent.parentNode.selectedIndex;
7793				}
7794			}
7795		}
7796	};
7797}
7798
7799jQuery.each( [
7800	"tabIndex",
7801	"readOnly",
7802	"maxLength",
7803	"cellSpacing",
7804	"cellPadding",
7805	"rowSpan",
7806	"colSpan",
7807	"useMap",
7808	"frameBorder",
7809	"contentEditable"
7810], function() {
7811	jQuery.propFix[ this.toLowerCase() ] = this;
7812} );
7813
7814
7815
7816
7817	// Strip and collapse whitespace according to HTML spec
7818	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
7819	function stripAndCollapse( value ) {
7820		var tokens = value.match( rnothtmlwhite ) || [];
7821		return tokens.join( " " );
7822	}
7823
7824
7825function getClass( elem ) {
7826	return elem.getAttribute && elem.getAttribute( "class" ) || "";
7827}
7828
7829function classesToArray( value ) {
7830	if ( Array.isArray( value ) ) {
7831		return value;
7832	}
7833	if ( typeof value === "string" ) {
7834		return value.match( rnothtmlwhite ) || [];
7835	}
7836	return [];
7837}
7838
7839jQuery.fn.extend( {
7840	addClass: function( value ) {
7841		var classes, elem, cur, curValue, clazz, j, finalValue,
7842			i = 0;
7843
7844		if ( isFunction( value ) ) {
7845			return this.each( function( j ) {
7846				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
7847			} );
7848		}
7849
7850		classes = classesToArray( value );
7851
7852		if ( classes.length ) {
7853			while ( ( elem = this[ i++ ] ) ) {
7854				curValue = getClass( elem );
7855				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
7856
7857				if ( cur ) {
7858					j = 0;
7859					while ( ( clazz = classes[ j++ ] ) ) {
7860						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
7861							cur += clazz + " ";
7862						}
7863					}
7864
7865					// Only assign if different to avoid unneeded rendering.
7866					finalValue = stripAndCollapse( cur );
7867					if ( curValue !== finalValue ) {
7868						elem.setAttribute( "class", finalValue );
7869					}
7870				}
7871			}
7872		}
7873
7874		return this;
7875	},
7876
7877	removeClass: function( value ) {
7878		var classes, elem, cur, curValue, clazz, j, finalValue,
7879			i = 0;
7880
7881		if ( isFunction( value ) ) {
7882			return this.each( function( j ) {
7883				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
7884			} );
7885		}
7886
7887		if ( !arguments.length ) {
7888			return this.attr( "class", "" );
7889		}
7890
7891		classes = classesToArray( value );
7892
7893		if ( classes.length ) {
7894			while ( ( elem = this[ i++ ] ) ) {
7895				curValue = getClass( elem );
7896
7897				// This expression is here for better compressibility (see addClass)
7898				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
7899
7900				if ( cur ) {
7901					j = 0;
7902					while ( ( clazz = classes[ j++ ] ) ) {
7903
7904						// Remove *all* instances
7905						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
7906							cur = cur.replace( " " + clazz + " ", " " );
7907						}
7908					}
7909
7910					// Only assign if different to avoid unneeded rendering.
7911					finalValue = stripAndCollapse( cur );
7912					if ( curValue !== finalValue ) {
7913						elem.setAttribute( "class", finalValue );
7914					}
7915				}
7916			}
7917		}
7918
7919		return this;
7920	},
7921
7922	toggleClass: function( value, stateVal ) {
7923		var type = typeof value,
7924			isValidValue = type === "string" || Array.isArray( value );
7925
7926		if ( typeof stateVal === "boolean" && isValidValue ) {
7927			return stateVal ? this.addClass( value ) : this.removeClass( value );
7928		}
7929
7930		if ( isFunction( value ) ) {
7931			return this.each( function( i ) {
7932				jQuery( this ).toggleClass(
7933					value.call( this, i, getClass( this ), stateVal ),
7934					stateVal
7935				);
7936			} );
7937		}
7938
7939		return this.each( function() {
7940			var className, i, self, classNames;
7941
7942			if ( isValidValue ) {
7943
7944				// Toggle individual class names
7945				i = 0;
7946				self = jQuery( this );
7947				classNames = classesToArray( value );
7948
7949				while ( ( className = classNames[ i++ ] ) ) {
7950
7951					// Check each className given, space separated list
7952					if ( self.hasClass( className ) ) {
7953						self.removeClass( className );
7954					} else {
7955						self.addClass( className );
7956					}
7957				}
7958
7959			// Toggle whole class name
7960			} else if ( value === undefined || type === "boolean" ) {
7961				className = getClass( this );
7962				if ( className ) {
7963
7964					// Store className if set
7965					dataPriv.set( this, "__className__", className );
7966				}
7967
7968				// If the element has a class name or if we're passed `false`,
7969				// then remove the whole classname (if there was one, the above saved it).
7970				// Otherwise bring back whatever was previously saved (if anything),
7971				// falling back to the empty string if nothing was stored.
7972				if ( this.setAttribute ) {
7973					this.setAttribute( "class",
7974						className || value === false ?
7975						"" :
7976						dataPriv.get( this, "__className__" ) || ""
7977					);
7978				}
7979			}
7980		} );
7981	},
7982
7983	hasClass: function( selector ) {
7984		var className, elem,
7985			i = 0;
7986
7987		className = " " + selector + " ";
7988		while ( ( elem = this[ i++ ] ) ) {
7989			if ( elem.nodeType === 1 &&
7990				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
7991					return true;
7992			}
7993		}
7994
7995		return false;
vendor: 5,544 bytes, lines 7996-8231
7996	}
7997} );
7998
7999
8000
8001
8002var rreturn = /\r/g;
8003
8004jQuery.fn.extend( {
8005	val: function( value ) {
8006		var hooks, ret, valueIsFunction,
8007			elem = this[ 0 ];
8008
8009		if ( !arguments.length ) {
8010			if ( elem ) {
8011				hooks = jQuery.valHooks[ elem.type ] ||
8012					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
8013
8014				if ( hooks &&
8015					"get" in hooks &&
8016					( ret = hooks.get( elem, "value" ) ) !== undefined
8017				) {
8018					return ret;
8019				}
8020
8021				ret = elem.value;
8022
8023				// Handle most common string cases
8024				if ( typeof ret === "string" ) {
8025					return ret.replace( rreturn, "" );
8026				}
8027
8028				// Handle cases where value is null/undef or number
8029				return ret == null ? "" : ret;
8030			}
8031
8032			return;
8033		}
8034
8035		valueIsFunction = isFunction( value );
8036
8037		return this.each( function( i ) {
8038			var val;
8039
8040			if ( this.nodeType !== 1 ) {
8041				return;
8042			}
8043
8044			if ( valueIsFunction ) {
8045				val = value.call( this, i, jQuery( this ).val() );
8046			} else {
8047				val = value;
8048			}
8049
8050			// Treat null/undefined as ""; convert numbers to string
8051			if ( val == null ) {
8052				val = "";
8053
8054			} else if ( typeof val === "number" ) {
8055				val += "";
8056
8057			} else if ( Array.isArray( val ) ) {
8058				val = jQuery.map( val, function( value ) {
8059					return value == null ? "" : value + "";
8060				} );
8061			}
8062
8063			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
8064
8065			// If set returns undefined, fall back to normal setting
8066			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
8067				this.value = val;
8068			}
8069		} );
8070	}
8071} );
8072
8073jQuery.extend( {
8074	valHooks: {
8075		option: {
8076			get: function( elem ) {
8077
8078				var val = jQuery.find.attr( elem, "value" );
8079				return val != null ?
8080					val :
8081
8082					// Support: IE <=10 - 11 only
8083					// option.text throws exceptions (#14686, #14858)
8084					// Strip and collapse whitespace
8085					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8086					stripAndCollapse( jQuery.text( elem ) );
8087			}
8088		},
8089		select: {
8090			get: function( elem ) {
8091				var value, option, i,
8092					options = elem.options,
8093					index = elem.selectedIndex,
8094					one = elem.type === "select-one",
8095					values = one ? null : [],
8096					max = one ? index + 1 : options.length;
8097
8098				if ( index < 0 ) {
8099					i = max;
8100
8101				} else {
8102					i = one ? index : 0;
8103				}
8104
8105				// Loop through all the selected options
8106				for ( ; i < max; i++ ) {
8107					option = options[ i ];
8108
8109					// Support: IE <=9 only
8110					// IE8-9 doesn't update selected after form reset (#2551)
8111					if ( ( option.selected || i === index ) &&
8112
8113							// Don't return options that are disabled or in a disabled optgroup
8114							!option.disabled &&
8115							( !option.parentNode.disabled ||
8116								!nodeName( option.parentNode, "optgroup" ) ) ) {
8117
8118						// Get the specific value for the option
8119						value = jQuery( option ).val();
8120
8121						// We don't need an array for one selects
8122						if ( one ) {
8123							return value;
8124						}
8125
8126						// Multi-Selects return an array
8127						values.push( value );
8128					}
8129				}
8130
8131				return values;
8132			},
8133
8134			set: function( elem, value ) {
8135				var optionSet, option,
8136					options = elem.options,
8137					values = jQuery.makeArray( value ),
8138					i = options.length;
8139
8140				while ( i-- ) {
8141					option = options[ i ];
8142
8143					/* eslint-disable no-cond-assign */
8144
8145					if ( option.selected =
8146						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
8147					) {
8148						optionSet = true;
8149					}
8150
8151					/* eslint-enable no-cond-assign */
8152				}
8153
8154				// Force browsers to behave consistently when non-matching value is set
8155				if ( !optionSet ) {
8156					elem.selectedIndex = -1;
8157				}
8158				return values;
8159			}
8160		}
8161	}
8162} );
8163
8164// Radios and checkboxes getter/setter
8165jQuery.each( [ "radio", "checkbox" ], function() {
8166	jQuery.valHooks[ this ] = {
8167		set: function( elem, value ) {
8168			if ( Array.isArray( value ) ) {
8169				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
8170			}
8171		}
8172	};
8173	if ( !support.checkOn ) {
8174		jQuery.valHooks[ this ].get = function( elem ) {
8175			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
8176		};
8177	}
8178} );
8179
8180
8181
8182
8183// Return jQuery for attributes-only inclusion
8184
8185
8186support.focusin = "onfocusin" in window;
8187
8188
8189var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
8190	stopPropagationCallback = function( e ) {
8191		e.stopPropagation();
8192	};
8193
8194jQuery.extend( jQuery.event, {
8195
8196	trigger: function( event, data, elem, onlyHandlers ) {
8197
8198		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
8199			eventPath = [ elem || document ],
8200			type = hasOwn.call( event, "type" ) ? event.type : event,
8201			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
8202
8203		cur = lastElement = tmp = elem = elem || document;
8204
8205		// Don't do events on text and comment nodes
8206		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
8207			return;
8208		}
8209
8210		// focus/blur morphs to focusin/out; ensure we're not firing them right now
8211		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
8212			return;
8213		}
8214
8215		if ( type.indexOf( "." ) > -1 ) {
8216
8217			// Namespaced trigger; create a regexp to match event type in handle()
8218			namespaces = type.split( "." );
8219			type = namespaces.shift();
8220			namespaces.sort();
8221		}
8222		ontype = type.indexOf( ":" ) < 0 && "on" + type;
8223
8224		// Caller can pass in a jQuery.Event object, Object, or just an event type string
8225		event = event[ jQuery.expando ] ?
8226			event :
8227			new jQuery.Event( type, typeof event === "object" && event );
8228
8229		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
8230		event.isTrigger = onlyHandlers ? 2 : 3;
8231		event.namespace = namespaces.join( "." );
vendor: 32,532 bytes, lines 8232-9503
8232		event.rnamespace = event.namespace ?
8233			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
8234			null;
8235
8236		// Clean up the event in case it is being reused
8237		event.result = undefined;
8238		if ( !event.target ) {
8239			event.target = elem;
8240		}
8241
8242		// Clone any incoming data and prepend the event, creating the handler arg list
8243		data = data == null ?
8244			[ event ] :
8245			jQuery.makeArray( data, [ event ] );
8246
8247		// Allow special events to draw outside the lines
8248		special = jQuery.event.special[ type ] || {};
8249		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
8250			return;
8251		}
8252
8253		// Determine event propagation path in advance, per W3C events spec (#9951)
8254		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
8255		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
8256
8257			bubbleType = special.delegateType || type;
8258			if ( !rfocusMorph.test( bubbleType + type ) ) {
8259				cur = cur.parentNode;
8260			}
8261			for ( ; cur; cur = cur.parentNode ) {
8262				eventPath.push( cur );
8263				tmp = cur;
8264			}
8265
8266			// Only add window if we got to document (e.g., not plain obj or detached DOM)
8267			if ( tmp === ( elem.ownerDocument || document ) ) {
8268				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
8269			}
8270		}
8271
8272		// Fire handlers on the event path
8273		i = 0;
8274		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
8275			lastElement = cur;
8276			event.type = i > 1 ?
8277				bubbleType :
8278				special.bindType || type;
8279
8280			// jQuery handler
8281			handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
8282				dataPriv.get( cur, "handle" );
8283			if ( handle ) {
8284				handle.apply( cur, data );
8285			}
8286
8287			// Native handler
8288			handle = ontype && cur[ ontype ];
8289			if ( handle && handle.apply && acceptData( cur ) ) {
8290				event.result = handle.apply( cur, data );
8291				if ( event.result === false ) {
8292					event.preventDefault();
8293				}
8294			}
8295		}
8296		event.type = type;
8297
8298		// If nobody prevented the default action, do it now
8299		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
8300
8301			if ( ( !special._default ||
8302				special._default.apply( eventPath.pop(), data ) === false ) &&
8303				acceptData( elem ) ) {
8304
8305				// Call a native DOM method on the target with the same name as the event.
8306				// Don't do default actions on window, that's where global variables be (#6170)
8307				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
8308
8309					// Don't re-trigger an onFOO event when we call its FOO() method
8310					tmp = elem[ ontype ];
8311
8312					if ( tmp ) {
8313						elem[ ontype ] = null;
8314					}
8315
8316					// Prevent re-triggering of the same event, since we already bubbled it above
8317					jQuery.event.triggered = type;
8318
8319					if ( event.isPropagationStopped() ) {
8320						lastElement.addEventListener( type, stopPropagationCallback );
8321					}
8322
8323					elem[ type ]();
8324
8325					if ( event.isPropagationStopped() ) {
8326						lastElement.removeEventListener( type, stopPropagationCallback );
8327					}
8328
8329					jQuery.event.triggered = undefined;
8330
8331					if ( tmp ) {
8332						elem[ ontype ] = tmp;
8333					}
8334				}
8335			}
8336		}
8337
8338		return event.result;
8339	},
8340
8341	// Piggyback on a donor event to simulate a different one
8342	// Used only for `focus(in | out)` events
8343	simulate: function( type, elem, event ) {
8344		var e = jQuery.extend(
8345			new jQuery.Event(),
8346			event,
8347			{
8348				type: type,
8349				isSimulated: true
8350			}
8351		);
8352
8353		jQuery.event.trigger( e, null, elem );
8354	}
8355
8356} );
8357
8358jQuery.fn.extend( {
8359
8360	trigger: function( type, data ) {
8361		return this.each( function() {
8362			jQuery.event.trigger( type, data, this );
8363		} );
8364	},
8365	triggerHandler: function( type, data ) {
8366		var elem = this[ 0 ];
8367		if ( elem ) {
8368			return jQuery.event.trigger( type, data, elem, true );
8369		}
8370	}
8371} );
8372
8373
8374// Support: Firefox <=44
8375// Firefox doesn't have focus(in | out) events
8376// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
8377//
8378// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
8379// focus(in | out) events fire after focus & blur events,
8380// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
8381// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
8382if ( !support.focusin ) {
8383	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
8384
8385		// Attach a single capturing handler on the document while someone wants focusin/focusout
8386		var handler = function( event ) {
8387			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
8388		};
8389
8390		jQuery.event.special[ fix ] = {
8391			setup: function() {
8392				var doc = this.ownerDocument || this,
8393					attaches = dataPriv.access( doc, fix );
8394
8395				if ( !attaches ) {
8396					doc.addEventListener( orig, handler, true );
8397				}
8398				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8399			},
8400			teardown: function() {
8401				var doc = this.ownerDocument || this,
8402					attaches = dataPriv.access( doc, fix ) - 1;
8403
8404				if ( !attaches ) {
8405					doc.removeEventListener( orig, handler, true );
8406					dataPriv.remove( doc, fix );
8407
8408				} else {
8409					dataPriv.access( doc, fix, attaches );
8410				}
8411			}
8412		};
8413	} );
8414}
8415var location = window.location;
8416
8417var nonce = Date.now();
8418
8419var rquery = ( /\?/ );
8420
8421
8422
8423// Cross-browser xml parsing
8424jQuery.parseXML = function( data ) {
8425	var xml;
8426	if ( !data || typeof data !== "string" ) {
8427		return null;
8428	}
8429
8430	// Support: IE 9 - 11 only
8431	// IE throws on parseFromString with invalid input.
8432	try {
8433		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8434	} catch ( e ) {
8435		xml = undefined;
8436	}
8437
8438	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
8439		jQuery.error( "Invalid XML: " + data );
8440	}
8441	return xml;
8442};
8443
8444
8445var
8446	rbracket = /\[\]$/,
8447	rCRLF = /\r?\n/g,
8448	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
8449	rsubmittable = /^(?:input|select|textarea|keygen)/i;
8450
8451function buildParams( prefix, obj, traditional, add ) {
8452	var name;
8453
8454	if ( Array.isArray( obj ) ) {
8455
8456		// Serialize array item.
8457		jQuery.each( obj, function( i, v ) {
8458			if ( traditional || rbracket.test( prefix ) ) {
8459
8460				// Treat each array item as a scalar.
8461				add( prefix, v );
8462
8463			} else {
8464
8465				// Item is non-scalar (array or object), encode its numeric index.
8466				buildParams(
8467					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
8468					v,
8469					traditional,
8470					add
8471				);
8472			}
8473		} );
8474
8475	} else if ( !traditional && toType( obj ) === "object" ) {
8476
8477		// Serialize object item.
8478		for ( name in obj ) {
8479			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
8480		}
8481
8482	} else {
8483
8484		// Serialize scalar item.
8485		add( prefix, obj );
8486	}
8487}
8488
8489// Serialize an array of form elements or a set of
8490// key/values into a query string
8491jQuery.param = function( a, traditional ) {
8492	var prefix,
8493		s = [],
8494		add = function( key, valueOrFunction ) {
8495
8496			// If value is a function, invoke it and use its return value
8497			var value = isFunction( valueOrFunction ) ?
8498				valueOrFunction() :
8499				valueOrFunction;
8500
8501			s[ s.length ] = encodeURIComponent( key ) + "=" +
8502				encodeURIComponent( value == null ? "" : value );
8503		};
8504
8505	// If an array was passed in, assume that it is an array of form elements.
8506	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8507
8508		// Serialize the form elements
8509		jQuery.each( a, function() {
8510			add( this.name, this.value );
8511		} );
8512
8513	} else {
8514
8515		// If traditional, encode the "old" way (the way 1.3.2 or older
8516		// did it), otherwise encode params recursively.
8517		for ( prefix in a ) {
8518			buildParams( prefix, a[ prefix ], traditional, add );
8519		}
8520	}
8521
8522	// Return the resulting serialization
8523	return s.join( "&" );
8524};
8525
8526jQuery.fn.extend( {
8527	serialize: function() {
8528		return jQuery.param( this.serializeArray() );
8529	},
8530	serializeArray: function() {
8531		return this.map( function() {
8532
8533			// Can add propHook for "elements" to filter or add form elements
8534			var elements = jQuery.prop( this, "elements" );
8535			return elements ? jQuery.makeArray( elements ) : this;
8536		} )
8537		.filter( function() {
8538			var type = this.type;
8539
8540			// Use .is( ":disabled" ) so that fieldset[disabled] works
8541			return this.name && !jQuery( this ).is( ":disabled" ) &&
8542				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8543				( this.checked || !rcheckableType.test( type ) );
8544		} )
8545		.map( function( i, elem ) {
8546			var val = jQuery( this ).val();
8547
8548			if ( val == null ) {
8549				return null;
8550			}
8551
8552			if ( Array.isArray( val ) ) {
8553				return jQuery.map( val, function( val ) {
8554					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8555				} );
8556			}
8557
8558			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8559		} ).get();
8560	}
8561} );
8562
8563
8564var
8565	r20 = /%20/g,
8566	rhash = /#.*$/,
8567	rantiCache = /([?&])_=[^&]*/,
8568	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
8569
8570	// #7653, #8125, #8152: local protocol detection
8571	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
8572	rnoContent = /^(?:GET|HEAD)$/,
8573	rprotocol = /^\/\//,
8574
8575	/* Prefilters
8576	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
8577	 * 2) These are called:
8578	 *    - BEFORE asking for a transport
8579	 *    - AFTER param serialization (s.data is a string if s.processData is true)
8580	 * 3) key is the dataType
8581	 * 4) the catchall symbol "*" can be used
8582	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
8583	 */
8584	prefilters = {},
8585
8586	/* Transports bindings
8587	 * 1) key is the dataType
8588	 * 2) the catchall symbol "*" can be used
8589	 * 3) selection will start with transport dataType and THEN go to "*" if needed
8590	 */
8591	transports = {},
8592
8593	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
8594	allTypes = "*/".concat( "*" ),
8595
8596	// Anchor tag for parsing the document origin
8597	originAnchor = document.createElement( "a" );
8598	originAnchor.href = location.href;
8599
8600// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
8601function addToPrefiltersOrTransports( structure ) {
8602
8603	// dataTypeExpression is optional and defaults to "*"
8604	return function( dataTypeExpression, func ) {
8605
8606		if ( typeof dataTypeExpression !== "string" ) {
8607			func = dataTypeExpression;
8608			dataTypeExpression = "*";
8609		}
8610
8611		var dataType,
8612			i = 0,
8613			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
8614
8615		if ( isFunction( func ) ) {
8616
8617			// For each dataType in the dataTypeExpression
8618			while ( ( dataType = dataTypes[ i++ ] ) ) {
8619
8620				// Prepend if requested
8621				if ( dataType[ 0 ] === "+" ) {
8622					dataType = dataType.slice( 1 ) || "*";
8623					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
8624
8625				// Otherwise append
8626				} else {
8627					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
8628				}
8629			}
8630		}
8631	};
8632}
8633
8634// Base inspection function for prefilters and transports
8635function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
8636
8637	var inspected = {},
8638		seekingTransport = ( structure === transports );
8639
8640	function inspect( dataType ) {
8641		var selected;
8642		inspected[ dataType ] = true;
8643		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
8644			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
8645			if ( typeof dataTypeOrTransport === "string" &&
8646				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
8647
8648				options.dataTypes.unshift( dataTypeOrTransport );
8649				inspect( dataTypeOrTransport );
8650				return false;
8651			} else if ( seekingTransport ) {
8652				return !( selected = dataTypeOrTransport );
8653			}
8654		} );
8655		return selected;
8656	}
8657
8658	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
8659}
8660
8661// A special extend for ajax options
8662// that takes "flat" options (not to be deep extended)
8663// Fixes #9887
8664function ajaxExtend( target, src ) {
8665	var key, deep,
8666		flatOptions = jQuery.ajaxSettings.flatOptions || {};
8667
8668	for ( key in src ) {
8669		if ( src[ key ] !== undefined ) {
8670			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
8671		}
8672	}
8673	if ( deep ) {
8674		jQuery.extend( true, target, deep );
8675	}
8676
8677	return target;
8678}
8679
8680/* Handles responses to an ajax request:
8681 * - finds the right dataType (mediates between content-type and expected dataType)
8682 * - returns the corresponding response
8683 */
8684function ajaxHandleResponses( s, jqXHR, responses ) {
8685
8686	var ct, type, finalDataType, firstDataType,
8687		contents = s.contents,
8688		dataTypes = s.dataTypes;
8689
8690	// Remove auto dataType and get content-type in the process
8691	while ( dataTypes[ 0 ] === "*" ) {
8692		dataTypes.shift();
8693		if ( ct === undefined ) {
8694			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
8695		}
8696	}
8697
8698	// Check if we're dealing with a known content-type
8699	if ( ct ) {
8700		for ( type in contents ) {
8701			if ( contents[ type ] && contents[ type ].test( ct ) ) {
8702				dataTypes.unshift( type );
8703				break;
8704			}
8705		}
8706	}
8707
8708	// Check to see if we have a response for the expected dataType
8709	if ( dataTypes[ 0 ] in responses ) {
8710		finalDataType = dataTypes[ 0 ];
8711	} else {
8712
8713		// Try convertible dataTypes
8714		for ( type in responses ) {
8715			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
8716				finalDataType = type;
8717				break;
8718			}
8719			if ( !firstDataType ) {
8720				firstDataType = type;
8721			}
8722		}
8723
8724		// Or just use first one
8725		finalDataType = finalDataType || firstDataType;
8726	}
8727
8728	// If we found a dataType
8729	// We add the dataType to the list if needed
8730	// and return the corresponding response
8731	if ( finalDataType ) {
8732		if ( finalDataType !== dataTypes[ 0 ] ) {
8733			dataTypes.unshift( finalDataType );
8734		}
8735		return responses[ finalDataType ];
8736	}
8737}
8738
8739/* Chain conversions given the request and the original response
8740 * Also sets the responseXXX fields on the jqXHR instance
8741 */
8742function ajaxConvert( s, response, jqXHR, isSuccess ) {
8743	var conv2, current, conv, tmp, prev,
8744		converters = {},
8745
8746		// Work with a copy of dataTypes in case we need to modify it for conversion
8747		dataTypes = s.dataTypes.slice();
8748
8749	// Create converters map with lowercased keys
8750	if ( dataTypes[ 1 ] ) {
8751		for ( conv in s.converters ) {
8752			converters[ conv.toLowerCase() ] = s.converters[ conv ];
8753		}
8754	}
8755
8756	current = dataTypes.shift();
8757
8758	// Convert to each sequential dataType
8759	while ( current ) {
8760
8761		if ( s.responseFields[ current ] ) {
8762			jqXHR[ s.responseFields[ current ] ] = response;
8763		}
8764
8765		// Apply the dataFilter if provided
8766		if ( !prev && isSuccess && s.dataFilter ) {
8767			response = s.dataFilter( response, s.dataType );
8768		}
8769
8770		prev = current;
8771		current = dataTypes.shift();
8772
8773		if ( current ) {
8774
8775			// There's only work to do if current dataType is non-auto
8776			if ( current === "*" ) {
8777
8778				current = prev;
8779
8780			// Convert response if prev dataType is non-auto and differs from current
8781			} else if ( prev !== "*" && prev !== current ) {
8782
8783				// Seek a direct converter
8784				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
8785
8786				// If none found, seek a pair
8787				if ( !conv ) {
8788					for ( conv2 in converters ) {
8789
8790						// If conv2 outputs current
8791						tmp = conv2.split( " " );
8792						if ( tmp[ 1 ] === current ) {
8793
8794							// If prev can be converted to accepted input
8795							conv = converters[ prev + " " + tmp[ 0 ] ] ||
8796								converters[ "* " + tmp[ 0 ] ];
8797							if ( conv ) {
8798
8799								// Condense equivalence converters
8800								if ( conv === true ) {
8801									conv = converters[ conv2 ];
8802
8803								// Otherwise, insert the intermediate dataType
8804								} else if ( converters[ conv2 ] !== true ) {
8805									current = tmp[ 0 ];
8806									dataTypes.unshift( tmp[ 1 ] );
8807								}
8808								break;
8809							}
8810						}
8811					}
8812				}
8813
8814				// Apply converter (if not an equivalence)
8815				if ( conv !== true ) {
8816
8817					// Unless errors are allowed to bubble, catch and return them
8818					if ( conv && s.throws ) {
8819						response = conv( response );
8820					} else {
8821						try {
8822							response = conv( response );
8823						} catch ( e ) {
8824							return {
8825								state: "parsererror",
8826								error: conv ? e : "No conversion from " + prev + " to " + current
8827							};
8828						}
8829					}
8830				}
8831			}
8832		}
8833	}
8834
8835	return { state: "success", data: response };
8836}
8837
8838jQuery.extend( {
8839
8840	// Counter for holding the number of active queries
8841	active: 0,
8842
8843	// Last-Modified header cache for next request
8844	lastModified: {},
8845	etag: {},
8846
8847	ajaxSettings: {
8848		url: location.href,
8849		type: "GET",
8850		isLocal: rlocalProtocol.test( location.protocol ),
8851		global: true,
8852		processData: true,
8853		async: true,
8854		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
8855
8856		/*
8857		timeout: 0,
8858		data: null,
8859		dataType: null,
8860		username: null,
8861		password: null,
8862		cache: null,
8863		throws: false,
8864		traditional: false,
8865		headers: {},
8866		*/
8867
8868		accepts: {
8869			"*": allTypes,
8870			text: "text/plain",
8871			html: "text/html",
8872			xml: "application/xml, text/xml",
8873			json: "application/json, text/javascript"
8874		},
8875
8876		contents: {
8877			xml: /\bxml\b/,
8878			html: /\bhtml/,
8879			json: /\bjson\b/
8880		},
8881
8882		responseFields: {
8883			xml: "responseXML",
8884			text: "responseText",
8885			json: "responseJSON"
8886		},
8887
8888		// Data converters
8889		// Keys separate source (or catchall "*") and destination types with a single space
8890		converters: {
8891
8892			// Convert anything to text
8893			"* text": String,
8894
8895			// Text to html (true = no transformation)
8896			"text html": true,
8897
8898			// Evaluate text as a json expression
8899			"text json": JSON.parse,
8900
8901			// Parse text as xml
8902			"text xml": jQuery.parseXML
8903		},
8904
8905		// For options that shouldn't be deep extended:
8906		// you can add your own custom options here if
8907		// and when you create one that shouldn't be
8908		// deep extended (see ajaxExtend)
8909		flatOptions: {
8910			url: true,
8911			context: true
8912		}
8913	},
8914
8915	// Creates a full fledged settings object into target
8916	// with both ajaxSettings and settings fields.
8917	// If target is omitted, writes into ajaxSettings.
8918	ajaxSetup: function( target, settings ) {
8919		return settings ?
8920
8921			// Building a settings object
8922			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
8923
8924			// Extending ajaxSettings
8925			ajaxExtend( jQuery.ajaxSettings, target );
8926	},
8927
8928	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
8929	ajaxTransport: addToPrefiltersOrTransports( transports ),
8930
8931	// Main method
8932	ajax: function( url, options ) {
8933
8934		// If url is an object, simulate pre-1.5 signature
8935		if ( typeof url === "object" ) {
8936			options = url;
8937			url = undefined;
8938		}
8939
8940		// Force options to be an object
8941		options = options || {};
8942
8943		var transport,
8944
8945			// URL without anti-cache param
8946			cacheURL,
8947
8948			// Response headers
8949			responseHeadersString,
8950			responseHeaders,
8951
8952			// timeout handle
8953			timeoutTimer,
8954
8955			// Url cleanup var
8956			urlAnchor,
8957
8958			// Request state (becomes false upon send and true upon completion)
8959			completed,
8960
8961			// To know if global events are to be dispatched
8962			fireGlobals,
8963
8964			// Loop variable
8965			i,
8966
8967			// uncached part of the url
8968			uncached,
8969
8970			// Create the final options object
8971			s = jQuery.ajaxSetup( {}, options ),
8972
8973			// Callbacks context
8974			callbackContext = s.context || s,
8975
8976			// Context for global events is callbackContext if it is a DOM node or jQuery collection
8977			globalEventContext = s.context &&
8978				( callbackContext.nodeType || callbackContext.jquery ) ?
8979					jQuery( callbackContext ) :
8980					jQuery.event,
8981
8982			// Deferreds
8983			deferred = jQuery.Deferred(),
8984			completeDeferred = jQuery.Callbacks( "once memory" ),
8985
8986			// Status-dependent callbacks
8987			statusCode = s.statusCode || {},
8988
8989			// Headers (they are sent all at once)
8990			requestHeaders = {},
8991			requestHeadersNames = {},
8992
8993			// Default abort message
8994			strAbort = "canceled",
8995
8996			// Fake xhr
8997			jqXHR = {
8998				readyState: 0,
8999
9000				// Builds headers hashtable if needed
9001				getResponseHeader: function( key ) {
9002					var match;
9003					if ( completed ) {
9004						if ( !responseHeaders ) {
9005							responseHeaders = {};
9006							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
9007								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
9008							}
9009						}
9010						match = responseHeaders[ key.toLowerCase() ];
9011					}
9012					return match == null ? null : match;
9013				},
9014
9015				// Raw string
9016				getAllResponseHeaders: function() {
9017					return completed ? responseHeadersString : null;
9018				},
9019
9020				// Caches the header
9021				setRequestHeader: function( name, value ) {
9022					if ( completed == null ) {
9023						name = requestHeadersNames[ name.toLowerCase() ] =
9024							requestHeadersNames[ name.toLowerCase() ] || name;
9025						requestHeaders[ name ] = value;
9026					}
9027					return this;
9028				},
9029
9030				// Overrides response content-type header
9031				overrideMimeType: function( type ) {
9032					if ( completed == null ) {
9033						s.mimeType = type;
9034					}
9035					return this;
9036				},
9037
9038				// Status-dependent callbacks
9039				statusCode: function( map ) {
9040					var code;
9041					if ( map ) {
9042						if ( completed ) {
9043
9044							// Execute the appropriate callbacks
9045							jqXHR.always( map[ jqXHR.status ] );
9046						} else {
9047
9048							// Lazy-add the new callbacks in a way that preserves old ones
9049							for ( code in map ) {
9050								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
9051							}
9052						}
9053					}
9054					return this;
9055				},
9056
9057				// Cancel the request
9058				abort: function( statusText ) {
9059					var finalText = statusText || strAbort;
9060					if ( transport ) {
9061						transport.abort( finalText );
9062					}
9063					done( 0, finalText );
9064					return this;
9065				}
9066			};
9067
9068		// Attach deferreds
9069		deferred.promise( jqXHR );
9070
9071		// Add protocol if not provided (prefilters might expect it)
9072		// Handle falsy url in the settings object (#10093: consistency with old signature)
9073		// We also use the url parameter if available
9074		s.url = ( ( url || s.url || location.href ) + "" )
9075			.replace( rprotocol, location.protocol + "//" );
9076
9077		// Alias method option to type as per ticket #12004
9078		s.type = options.method || options.type || s.method || s.type;
9079
9080		// Extract dataTypes list
9081		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
9082
9083		// A cross-domain request is in order when the origin doesn't match the current origin.
9084		if ( s.crossDomain == null ) {
9085			urlAnchor = document.createElement( "a" );
9086
9087			// Support: IE <=8 - 11, Edge 12 - 15
9088			// IE throws exception on accessing the href property if url is malformed,
9089			// e.g. http://example.com:80x/
9090			try {
9091				urlAnchor.href = s.url;
9092
9093				// Support: IE <=8 - 11 only
9094				// Anchor's host property isn't correctly set when s.url is relative
9095				urlAnchor.href = urlAnchor.href;
9096				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
9097					urlAnchor.protocol + "//" + urlAnchor.host;
9098			} catch ( e ) {
9099
9100				// If there is an error parsing the URL, assume it is crossDomain,
9101				// it can be rejected by the transport if it is invalid
9102				s.crossDomain = true;
9103			}
9104		}
9105
9106		// Convert data if not already a string
9107		if ( s.data && s.processData && typeof s.data !== "string" ) {
9108			s.data = jQuery.param( s.data, s.traditional );
9109		}
9110
9111		// Apply prefilters
9112		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9113
9114		// If request was aborted inside a prefilter, stop there
9115		if ( completed ) {
9116			return jqXHR;
9117		}
9118
9119		// We can fire global events as of now if asked to
9120		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9121		fireGlobals = jQuery.event && s.global;
9122
9123		// Watch for a new set of requests
9124		if ( fireGlobals && jQuery.active++ === 0 ) {
9125			jQuery.event.trigger( "ajaxStart" );
9126		}
9127
9128		// Uppercase the type
9129		s.type = s.type.toUpperCase();
9130
9131		// Determine if request has content
9132		s.hasContent = !rnoContent.test( s.type );
9133
9134		// Save the URL in case we're toying with the If-Modified-Since
9135		// and/or If-None-Match header later on
9136		// Remove hash to simplify url manipulation
9137		cacheURL = s.url.replace( rhash, "" );
9138
9139		// More options handling for requests with no content
9140		if ( !s.hasContent ) {
9141
9142			// Remember the hash so we can put it back
9143			uncached = s.url.slice( cacheURL.length );
9144
9145			// If data is available and should be processed, append data to url
9146			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
9147				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9148
9149				// #9682: remove data so that it's not used in an eventual retry
9150				delete s.data;
9151			}
9152
9153			// Add or update anti-cache param if needed
9154			if ( s.cache === false ) {
9155				cacheURL = cacheURL.replace( rantiCache, "$1" );
9156				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
9157			}
9158
9159			// Put hash and anti-cache on the URL that will be requested (gh-1732)
9160			s.url = cacheURL + uncached;
9161
9162		// Change '%20' to '+' if this is encoded form body content (gh-2658)
9163		} else if ( s.data && s.processData &&
9164			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
9165			s.data = s.data.replace( r20, "+" );
9166		}
9167
9168		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9169		if ( s.ifModified ) {
9170			if ( jQuery.lastModified[ cacheURL ] ) {
9171				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9172			}
9173			if ( jQuery.etag[ cacheURL ] ) {
9174				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9175			}
9176		}
9177
9178		// Set the correct header, if data is being sent
9179		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9180			jqXHR.setRequestHeader( "Content-Type", s.contentType );
9181		}
9182
9183		// Set the Accepts header for the server, depending on the dataType
9184		jqXHR.setRequestHeader(
9185			"Accept",
9186			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
9187				s.accepts[ s.dataTypes[ 0 ] ] +
9188					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9189				s.accepts[ "*" ]
9190		);
9191
9192		// Check for headers option
9193		for ( i in s.headers ) {
9194			jqXHR.setRequestHeader( i, s.headers[ i ] );
9195		}
9196
9197		// Allow custom headers/mimetypes and early abort
9198		if ( s.beforeSend &&
9199			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
9200
9201			// Abort if not done already and return
9202			return jqXHR.abort();
9203		}
9204
9205		// Aborting is no longer a cancellation
9206		strAbort = "abort";
9207
9208		// Install callbacks on deferreds
9209		completeDeferred.add( s.complete );
9210		jqXHR.done( s.success );
9211		jqXHR.fail( s.error );
9212
9213		// Get transport
9214		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9215
9216		// If no transport, we auto-abort
9217		if ( !transport ) {
9218			done( -1, "No Transport" );
9219		} else {
9220			jqXHR.readyState = 1;
9221
9222			// Send global event
9223			if ( fireGlobals ) {
9224				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9225			}
9226
9227			// If request was aborted inside ajaxSend, stop there
9228			if ( completed ) {
9229				return jqXHR;
9230			}
9231
9232			// Timeout
9233			if ( s.async && s.timeout > 0 ) {
9234				timeoutTimer = window.setTimeout( function() {
9235					jqXHR.abort( "timeout" );
9236				}, s.timeout );
9237			}
9238
9239			try {
9240				completed = false;
9241				transport.send( requestHeaders, done );
9242			} catch ( e ) {
9243
9244				// Rethrow post-completion exceptions
9245				if ( completed ) {
9246					throw e;
9247				}
9248
9249				// Propagate others as results
9250				done( -1, e );
9251			}
9252		}
9253
9254		// Callback for when everything is done
9255		function done( status, nativeStatusText, responses, headers ) {
9256			var isSuccess, success, error, response, modified,
9257				statusText = nativeStatusText;
9258
9259			// Ignore repeat invocations
9260			if ( completed ) {
9261				return;
9262			}
9263
9264			completed = true;
9265
9266			// Clear timeout if it exists
9267			if ( timeoutTimer ) {
9268				window.clearTimeout( timeoutTimer );
9269			}
9270
9271			// Dereference transport for early garbage collection
9272			// (no matter how long the jqXHR object will be used)
9273			transport = undefined;
9274
9275			// Cache response headers
9276			responseHeadersString = headers || "";
9277
9278			// Set readyState
9279			jqXHR.readyState = status > 0 ? 4 : 0;
9280
9281			// Determine if successful
9282			isSuccess = status >= 200 && status < 300 || status === 304;
9283
9284			// Get response data
9285			if ( responses ) {
9286				response = ajaxHandleResponses( s, jqXHR, responses );
9287			}
9288
9289			// Convert no matter what (that way responseXXX fields are always set)
9290			response = ajaxConvert( s, response, jqXHR, isSuccess );
9291
9292			// If successful, handle type chaining
9293			if ( isSuccess ) {
9294
9295				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9296				if ( s.ifModified ) {
9297					modified = jqXHR.getResponseHeader( "Last-Modified" );
9298					if ( modified ) {
9299						jQuery.lastModified[ cacheURL ] = modified;
9300					}
9301					modified = jqXHR.getResponseHeader( "etag" );
9302					if ( modified ) {
9303						jQuery.etag[ cacheURL ] = modified;
9304					}
9305				}
9306
9307				// if no content
9308				if ( status === 204 || s.type === "HEAD" ) {
9309					statusText = "nocontent";
9310
9311				// if not modified
9312				} else if ( status === 304 ) {
9313					statusText = "notmodified";
9314
9315				// If we have data, let's convert it
9316				} else {
9317					statusText = response.state;
9318					success = response.data;
9319					error = response.error;
9320					isSuccess = !error;
9321				}
9322			} else {
9323
9324				// Extract error from statusText and normalize for non-aborts
9325				error = statusText;
9326				if ( status || !statusText ) {
9327					statusText = "error";
9328					if ( status < 0 ) {
9329						status = 0;
9330					}
9331				}
9332			}
9333
9334			// Set data for the fake xhr object
9335			jqXHR.status = status;
9336			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9337
9338			// Success/Error
9339			if ( isSuccess ) {
9340				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
9341			} else {
9342				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
9343			}
9344
9345			// Status-dependent callbacks
9346			jqXHR.statusCode( statusCode );
9347			statusCode = undefined;
9348
9349			if ( fireGlobals ) {
9350				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9351					[ jqXHR, s, isSuccess ? success : error ] );
9352			}
9353
9354			// Complete
9355			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9356
9357			if ( fireGlobals ) {
9358				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9359
9360				// Handle the global AJAX counter
9361				if ( !( --jQuery.active ) ) {
9362					jQuery.event.trigger( "ajaxStop" );
9363				}
9364			}
9365		}
9366
9367		return jqXHR;
9368	},
9369
9370	getJSON: function( url, data, callback ) {
9371		return jQuery.get( url, data, callback, "json" );
9372	},
9373
9374	getScript: function( url, callback ) {
9375		return jQuery.get( url, undefined, callback, "script" );
9376	}
9377} );
9378
9379jQuery.each( [ "get", "post" ], function( i, method ) {
9380	jQuery[ method ] = function( url, data, callback, type ) {
9381
9382		// Shift arguments if data argument was omitted
9383		if ( isFunction( data ) ) {
9384			type = type || callback;
9385			callback = data;
9386			data = undefined;
9387		}
9388
9389		// The url can be an options object (which then must have .url)
9390		return jQuery.ajax( jQuery.extend( {
9391			url: url,
9392			type: method,
9393			dataType: type,
9394			data: data,
9395			success: callback
9396		}, jQuery.isPlainObject( url ) && url ) );
9397	};
9398} );
9399
9400
9401jQuery._evalUrl = function( url ) {
9402	return jQuery.ajax( {
9403		url: url,
9404
9405		// Make this explicit, since user can override this through ajaxSetup (#11264)
9406		type: "GET",
9407		dataType: "script",
9408		cache: true,
9409		async: false,
9410		global: false,
9411		"throws": true
9412	} );
9413};
9414
9415
9416jQuery.fn.extend( {
9417	wrapAll: function( html ) {
9418		var wrap;
9419
9420		if ( this[ 0 ] ) {
9421			if ( isFunction( html ) ) {
9422				html = html.call( this[ 0 ] );
9423			}
9424
9425			// The elements to wrap the target around
9426			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
9427
9428			if ( this[ 0 ].parentNode ) {
9429				wrap.insertBefore( this[ 0 ] );
9430			}
9431
9432			wrap.map( function() {
9433				var elem = this;
9434
9435				while ( elem.firstElementChild ) {
9436					elem = elem.firstElementChild;
9437				}
9438
9439				return elem;
9440			} ).append( this );
9441		}
9442
9443		return this;
9444	},
9445
9446	wrapInner: function( html ) {
9447		if ( isFunction( html ) ) {
9448			return this.each( function( i ) {
9449				jQuery( this ).wrapInner( html.call( this, i ) );
9450			} );
9451		}
9452
9453		return this.each( function() {
9454			var self = jQuery( this ),
9455				contents = self.contents();
9456
9457			if ( contents.length ) {
9458				contents.wrapAll( html );
9459
9460			} else {
9461				self.append( html );
9462			}
9463		} );
9464	},
9465
9466	wrap: function( html ) {
9467		var htmlIsFunction = isFunction( html );
9468
9469		return this.each( function( i ) {
9470			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
9471		} );
9472	},
9473
9474	unwrap: function( selector ) {
9475		this.parent( selector ).not( "body" ).each( function() {
9476			jQuery( this ).replaceWith( this.childNodes );
9477		} );
9478		return this;
9479	}
9480} );
9481
9482
9483jQuery.expr.pseudos.hidden = function( elem ) {
9484	return !jQuery.expr.pseudos.visible( elem );
9485};
9486jQuery.expr.pseudos.visible = function( elem ) {
9487	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
9488};
9489
9490
9491
9492
9493jQuery.ajaxSettings.xhr = function() {
9494	try {
9495		return new window.XMLHttpRequest();
9496	} catch ( e ) {}
9497};
9498
9499var xhrSuccessStatus = {
9500
9501		// File protocol always yields status code 0, assume 200
9502		0: 200,
9503
vendor: 1,240 bytes, lines 9504-9546
9504		// Support: IE <=9 only
9505		// #1450: sometimes IE returns 1223 when it should be 204
9506		1223: 204
9507	},
9508	xhrSupported = jQuery.ajaxSettings.xhr();
9509
9510support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
9511support.ajax = xhrSupported = !!xhrSupported;
9512
9513jQuery.ajaxTransport( function( options ) {
9514	var callback, errorCallback;
9515
9516	// Cross domain only allowed if supported through XMLHttpRequest
9517	if ( support.cors || xhrSupported && !options.crossDomain ) {
9518		return {
9519			send: function( headers, complete ) {
9520				var i,
9521					xhr = options.xhr();
9522
9523				xhr.open(
9524					options.type,
9525					options.url,
9526					options.async,
9527					options.username,
9528					options.password
9529				);
9530
9531				// Apply custom fields if provided
9532				if ( options.xhrFields ) {
9533					for ( i in options.xhrFields ) {
9534						xhr[ i ] = options.xhrFields[ i ];
9535					}
9536				}
9537
9538				// Override mime type if needed
9539				if ( options.mimeType && xhr.overrideMimeType ) {
9540					xhr.overrideMimeType( options.mimeType );
9541				}
9542
9543				// X-Requested-With header
9544				// For cross-domain requests, seeing as conditions for a preflight are
9545				// akin to a jigsaw puzzle, we simply never set it to be sure.
9546				// (it can always be set on a per-request basis or even using ajaxSetup)
vendor: 5,627 bytes, lines 9547-9768
9547				// For same-domain requests, won't change header if already provided.
9548				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
9549					headers[ "X-Requested-With" ] = "XMLHttpRequest";
9550				}
9551
9552				// Set headers
9553				for ( i in headers ) {
9554					xhr.setRequestHeader( i, headers[ i ] );
9555				}
9556
9557				// Callback
9558				callback = function( type ) {
9559					return function() {
9560						if ( callback ) {
9561							callback = errorCallback = xhr.onload =
9562								xhr.onerror = xhr.onabort = xhr.ontimeout =
9563									xhr.onreadystatechange = null;
9564
9565							if ( type === "abort" ) {
9566								xhr.abort();
9567							} else if ( type === "error" ) {
9568
9569								// Support: IE <=9 only
9570								// On a manual native abort, IE9 throws
9571								// errors on any property access that is not readyState
9572								if ( typeof xhr.status !== "number" ) {
9573									complete( 0, "error" );
9574								} else {
9575									complete(
9576
9577										// File: protocol always yields status 0; see #8605, #14207
9578										xhr.status,
9579										xhr.statusText
9580									);
9581								}
9582							} else {
9583								complete(
9584									xhrSuccessStatus[ xhr.status ] || xhr.status,
9585									xhr.statusText,
9586
9587									// Support: IE <=9 only
9588									// IE9 has no XHR2 but throws on binary (trac-11426)
9589									// For XHR2 non-text, let the caller handle it (gh-2498)
9590									( xhr.responseType || "text" ) !== "text"  ||
9591									typeof xhr.responseText !== "string" ?
9592										{ binary: xhr.response } :
9593										{ text: xhr.responseText },
9594									xhr.getAllResponseHeaders()
9595								);
9596							}
9597						}
9598					};
9599				};
9600
9601				// Listen to events
9602				xhr.onload = callback();
9603				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
9604
9605				// Support: IE 9 only
9606				// Use onreadystatechange to replace onabort
9607				// to handle uncaught aborts
9608				if ( xhr.onabort !== undefined ) {
9609					xhr.onabort = errorCallback;
9610				} else {
9611					xhr.onreadystatechange = function() {
9612
9613						// Check readyState before timeout as it changes
9614						if ( xhr.readyState === 4 ) {
9615
9616							// Allow onerror to be called first,
9617							// but that will not handle a native abort
9618							// Also, save errorCallback to a variable
9619							// as xhr.onerror cannot be accessed
9620							window.setTimeout( function() {
9621								if ( callback ) {
9622									errorCallback();
9623								}
9624							} );
9625						}
9626					};
9627				}
9628
9629				// Create the abort callback
9630				callback = callback( "abort" );
9631
9632				try {
9633
9634					// Do send the request (this may raise an exception)
9635					xhr.send( options.hasContent && options.data || null );
9636				} catch ( e ) {
9637
9638					// #14683: Only rethrow if this hasn't been notified as an error yet
9639					if ( callback ) {
9640						throw e;
9641					}
9642				}
9643			},
9644
9645			abort: function() {
9646				if ( callback ) {
9647					callback();
9648				}
9649			}
9650		};
9651	}
9652} );
9653
9654
9655
9656
9657// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
9658jQuery.ajaxPrefilter( function( s ) {
9659	if ( s.crossDomain ) {
9660		s.contents.script = false;
9661	}
9662} );
9663
9664// Install script dataType
9665jQuery.ajaxSetup( {
9666	accepts: {
9667		script: "text/javascript, application/javascript, " +
9668			"application/ecmascript, application/x-ecmascript"
9669	},
9670	contents: {
9671		script: /\b(?:java|ecma)script\b/
9672	},
9673	converters: {
9674		"text script": function( text ) {
9675			jQuery.globalEval( text );
9676			return text;
9677		}
9678	}
9679} );
9680
9681// Handle cache's special case and crossDomain
9682jQuery.ajaxPrefilter( "script", function( s ) {
9683	if ( s.cache === undefined ) {
9684		s.cache = false;
9685	}
9686	if ( s.crossDomain ) {
9687		s.type = "GET";
9688	}
9689} );
9690
9691// Bind script tag hack transport
9692jQuery.ajaxTransport( "script", function( s ) {
9693
9694	// This transport only deals with cross domain requests
9695	if ( s.crossDomain ) {
9696		var script, callback;
9697		return {
9698			send: function( _, complete ) {
9699				script = jQuery( "<script>" ).prop( {
9700					charset: s.scriptCharset,
9701					src: s.url
9702				} ).on(
9703					"load error",
9704					callback = function( evt ) {
9705						script.remove();
9706						callback = null;
9707						if ( evt ) {
9708							complete( evt.type === "error" ? 404 : 200, evt.type );
9709						}
9710					}
9711				);
9712
9713				// Use native DOM manipulation to avoid our domManip AJAX trickery
9714				document.head.appendChild( script[ 0 ] );
9715			},
9716			abort: function() {
9717				if ( callback ) {
9718					callback();
9719				}
9720			}
9721		};
9722	}
9723} );
9724
9725
9726
9727
9728var oldCallbacks = [],
9729	rjsonp = /(=)\?(?=&|$)|\?\?/;
9730
9731// Default jsonp settings
9732jQuery.ajaxSetup( {
9733	jsonp: "callback",
9734	jsonpCallback: function() {
9735		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
9736		this[ callback ] = true;
9737		return callback;
9738	}
9739} );
9740
9741// Detect, normalize options and install callbacks for jsonp requests
9742jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
9743
9744	var callbackName, overwritten, responseContainer,
9745		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
9746			"url" :
9747			typeof s.data === "string" &&
9748				( s.contentType || "" )
9749					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
9750				rjsonp.test( s.data ) && "data"
9751		);
9752
9753	// Handle iff the expected data type is "jsonp" or we have a parameter to set
9754	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
9755
9756		// Get callback name, remembering preexisting value associated with it
9757		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
9758			s.jsonpCallback() :
9759			s.jsonpCallback;
9760
9761		// Insert callback into url or form data
9762		if ( jsonProp ) {
9763			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
9764		} else if ( s.jsonp !== false ) {
9765			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
9766		}
9767
9768		// Use data converter to retrieve json after script execution
vendor: 2,987 bytes, lines 9769-9878
9769		s.converters[ "script json" ] = function() {
9770			if ( !responseContainer ) {
9771				jQuery.error( callbackName + " was not called" );
9772			}
9773			return responseContainer[ 0 ];
9774		};
9775
9776		// Force json dataType
9777		s.dataTypes[ 0 ] = "json";
9778
9779		// Install callback
9780		overwritten = window[ callbackName ];
9781		window[ callbackName ] = function() {
9782			responseContainer = arguments;
9783		};
9784
9785		// Clean-up function (fires after converters)
9786		jqXHR.always( function() {
9787
9788			// If previous value didn't exist - remove it
9789			if ( overwritten === undefined ) {
9790				jQuery( window ).removeProp( callbackName );
9791
9792			// Otherwise restore preexisting value
9793			} else {
9794				window[ callbackName ] = overwritten;
9795			}
9796
9797			// Save back as free
9798			if ( s[ callbackName ] ) {
9799
9800				// Make sure that re-using the options doesn't screw things around
9801				s.jsonpCallback = originalSettings.jsonpCallback;
9802
9803				// Save the callback name for future use
9804				oldCallbacks.push( callbackName );
9805			}
9806
9807			// Call if it was a function and we have a response
9808			if ( responseContainer && isFunction( overwritten ) ) {
9809				overwritten( responseContainer[ 0 ] );
9810			}
9811
9812			responseContainer = overwritten = undefined;
9813		} );
9814
9815		// Delegate to script
9816		return "script";
9817	}
9818} );
9819
9820
9821
9822
9823// Support: Safari 8 only
9824// In Safari 8 documents created via document.implementation.createHTMLDocument
9825// collapse sibling forms: the second one becomes a child of the first one.
9826// Because of that, this security measure has to be disabled in Safari 8.
9827// https://bugs.webkit.org/show_bug.cgi?id=137337
9828support.createHTMLDocument = ( function() {
9829	var body = document.implementation.createHTMLDocument( "" ).body;
9830	body.innerHTML = "<form></form><form></form>";
9831	return body.childNodes.length === 2;
9832} )();
9833
9834
9835// Argument "data" should be string of html
9836// context (optional): If specified, the fragment will be created in this context,
9837// defaults to document
9838// keepScripts (optional): If true, will include scripts passed in the html string
9839jQuery.parseHTML = function( data, context, keepScripts ) {
9840	if ( typeof data !== "string" ) {
9841		return [];
9842	}
9843	if ( typeof context === "boolean" ) {
9844		keepScripts = context;
9845		context = false;
9846	}
9847
9848	var base, parsed, scripts;
9849
9850	if ( !context ) {
9851
9852		// Stop scripts or inline event handlers from being executed immediately
9853		// by using document.implementation
9854		if ( support.createHTMLDocument ) {
9855			context = document.implementation.createHTMLDocument( "" );
9856
9857			// Set the base href for the created document
9858			// so any parsed elements with URLs
9859			// are based on the document's URL (gh-2965)
9860			base = context.createElement( "base" );
9861			base.href = document.location.href;
9862			context.head.appendChild( base );
9863		} else {
9864			context = document;
9865		}
9866	}
9867
9868	parsed = rsingleTag.exec( data );
9869	scripts = !keepScripts && [];
9870
9871	// Single tag
9872	if ( parsed ) {
9873		return [ context.createElement( parsed[ 1 ] ) ];
9874	}
9875
9876	parsed = buildFragment( [ data ], context, scripts );
9877
9878	if ( scripts && scripts.length ) {
vendor: 14,511 bytes, lines 9879-10399
9879		jQuery( scripts ).remove();
9880	}
9881
9882	return jQuery.merge( [], parsed.childNodes );
9883};
9884
9885
9886/**
9887 * Load a url into a page
9888 */
9889jQuery.fn.load = function( url, params, callback ) {
9890	var selector, type, response,
9891		self = this,
9892		off = url.indexOf( " " );
9893
9894	if ( off > -1 ) {
9895		selector = stripAndCollapse( url.slice( off ) );
9896		url = url.slice( 0, off );
9897	}
9898
9899	// If it's a function
9900	if ( isFunction( params ) ) {
9901
9902		// We assume that it's the callback
9903		callback = params;
9904		params = undefined;
9905
9906	// Otherwise, build a param string
9907	} else if ( params && typeof params === "object" ) {
9908		type = "POST";
9909	}
9910
9911	// If we have elements to modify, make the request
9912	if ( self.length > 0 ) {
9913		jQuery.ajax( {
9914			url: url,
9915
9916			// If "type" variable is undefined, then "GET" method will be used.
9917			// Make value of this field explicit since
9918			// user can override it through ajaxSetup method
9919			type: type || "GET",
9920			dataType: "html",
9921			data: params
9922		} ).done( function( responseText ) {
9923
9924			// Save response for use in complete callback
9925			response = arguments;
9926
9927			self.html( selector ?
9928
9929				// If a selector was specified, locate the right elements in a dummy div
9930				// Exclude scripts to avoid IE 'Permission Denied' errors
9931				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
9932
9933				// Otherwise use the full result
9934				responseText );
9935
9936		// If the request succeeds, this function gets "data", "status", "jqXHR"
9937		// but they are ignored because response was set above.
9938		// If it fails, this function gets "jqXHR", "status", "error"
9939		} ).always( callback && function( jqXHR, status ) {
9940			self.each( function() {
9941				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
9942			} );
9943		} );
9944	}
9945
9946	return this;
9947};
9948
9949
9950
9951
9952// Attach a bunch of functions for handling common AJAX events
9953jQuery.each( [
9954	"ajaxStart",
9955	"ajaxStop",
9956	"ajaxComplete",
9957	"ajaxError",
9958	"ajaxSuccess",
9959	"ajaxSend"
9960], function( i, type ) {
9961	jQuery.fn[ type ] = function( fn ) {
9962		return this.on( type, fn );
9963	};
9964} );
9965
9966
9967
9968
9969jQuery.expr.pseudos.animated = function( elem ) {
9970	return jQuery.grep( jQuery.timers, function( fn ) {
9971		return elem === fn.elem;
9972	} ).length;
9973};
9974
9975
9976
9977
9978jQuery.offset = {
9979	setOffset: function( elem, options, i ) {
9980		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
9981			position = jQuery.css( elem, "position" ),
9982			curElem = jQuery( elem ),
9983			props = {};
9984
9985		// Set position first, in-case top/left are set even on static elem
9986		if ( position === "static" ) {
9987			elem.style.position = "relative";
9988		}
9989
9990		curOffset = curElem.offset();
9991		curCSSTop = jQuery.css( elem, "top" );
9992		curCSSLeft = jQuery.css( elem, "left" );
9993		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
9994			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
9995
9996		// Need to be able to calculate position if either
9997		// top or left is auto and position is either absolute or fixed
9998		if ( calculatePosition ) {
9999			curPosition = curElem.position();
10000			curTop = curPosition.top;
10001			curLeft = curPosition.left;
10002
10003		} else {
10004			curTop = parseFloat( curCSSTop ) || 0;
10005			curLeft = parseFloat( curCSSLeft ) || 0;
10006		}
10007
10008		if ( isFunction( options ) ) {
10009
10010			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
10011			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
10012		}
10013
10014		if ( options.top != null ) {
10015			props.top = ( options.top - curOffset.top ) + curTop;
10016		}
10017		if ( options.left != null ) {
10018			props.left = ( options.left - curOffset.left ) + curLeft;
10019		}
10020
10021		if ( "using" in options ) {
10022			options.using.call( elem, props );
10023
10024		} else {
10025			curElem.css( props );
10026		}
10027	}
10028};
10029
10030jQuery.fn.extend( {
10031
10032	// offset() relates an element's border box to the document origin
10033	offset: function( options ) {
10034
10035		// Preserve chaining for setter
10036		if ( arguments.length ) {
10037			return options === undefined ?
10038				this :
10039				this.each( function( i ) {
10040					jQuery.offset.setOffset( this, options, i );
10041				} );
10042		}
10043
10044		var rect, win,
10045			elem = this[ 0 ];
10046
10047		if ( !elem ) {
10048			return;
10049		}
10050
10051		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
10052		// Support: IE <=11 only
10053		// Running getBoundingClientRect on a
10054		// disconnected node in IE throws an error
10055		if ( !elem.getClientRects().length ) {
10056			return { top: 0, left: 0 };
10057		}
10058
10059		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
10060		rect = elem.getBoundingClientRect();
10061		win = elem.ownerDocument.defaultView;
10062		return {
10063			top: rect.top + win.pageYOffset,
10064			left: rect.left + win.pageXOffset
10065		};
10066	},
10067
10068	// position() relates an element's margin box to its offset parent's padding box
10069	// This corresponds to the behavior of CSS absolute positioning
10070	position: function() {
10071		if ( !this[ 0 ] ) {
10072			return;
10073		}
10074
10075		var offsetParent, offset, doc,
10076			elem = this[ 0 ],
10077			parentOffset = { top: 0, left: 0 };
10078
10079		// position:fixed elements are offset from the viewport, which itself always has zero offset
10080		if ( jQuery.css( elem, "position" ) === "fixed" ) {
10081
10082			// Assume position:fixed implies availability of getBoundingClientRect
10083			offset = elem.getBoundingClientRect();
10084
10085		} else {
10086			offset = this.offset();
10087
10088			// Account for the *real* offset parent, which can be the document or its root element
10089			// when a statically positioned element is identified
10090			doc = elem.ownerDocument;
10091			offsetParent = elem.offsetParent || doc.documentElement;
10092			while ( offsetParent &&
10093				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
10094				jQuery.css( offsetParent, "position" ) === "static" ) {
10095
10096				offsetParent = offsetParent.parentNode;
10097			}
10098			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
10099
10100				// Incorporate borders into its offset, since they are outside its content origin
10101				parentOffset = jQuery( offsetParent ).offset();
10102				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
10103				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
10104			}
10105		}
10106
10107		// Subtract parent offsets and element margins
10108		return {
10109			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10110			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
10111		};
10112	},
10113
10114	// This method will return documentElement in the following cases:
10115	// 1) For the element inside the iframe without offsetParent, this method will return
10116	//    documentElement of the parent window
10117	// 2) For the hidden or detached element
10118	// 3) For body or html element, i.e. in case of the html node - it will return itself
10119	//
10120	// but those exceptions were never presented as a real life use-cases
10121	// and might be considered as more preferable results.
10122	//
10123	// This logic, however, is not guaranteed and can change at any point in the future
10124	offsetParent: function() {
10125		return this.map( function() {
10126			var offsetParent = this.offsetParent;
10127
10128			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
10129				offsetParent = offsetParent.offsetParent;
10130			}
10131
10132			return offsetParent || documentElement;
10133		} );
10134	}
10135} );
10136
10137// Create scrollLeft and scrollTop methods
10138jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
10139	var top = "pageYOffset" === prop;
10140
10141	jQuery.fn[ method ] = function( val ) {
10142		return access( this, function( elem, method, val ) {
10143
10144			// Coalesce documents and windows
10145			var win;
10146			if ( isWindow( elem ) ) {
10147				win = elem;
10148			} else if ( elem.nodeType === 9 ) {
10149				win = elem.defaultView;
10150			}
10151
10152			if ( val === undefined ) {
10153				return win ? win[ prop ] : elem[ method ];
10154			}
10155
10156			if ( win ) {
10157				win.scrollTo(
10158					!top ? val : win.pageXOffset,
10159					top ? val : win.pageYOffset
10160				);
10161
10162			} else {
10163				elem[ method ] = val;
10164			}
10165		}, method, val, arguments.length );
10166	};
10167} );
10168
10169// Support: Safari <=7 - 9.1, Chrome <=37 - 49
10170// Add the top/left cssHooks using jQuery.fn.position
10171// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10172// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10173// getComputedStyle returns percent when specified for top/left/bottom/right;
10174// rather than make the css module depend on the offset module, just check for it here
10175jQuery.each( [ "top", "left" ], function( i, prop ) {
10176	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10177		function( elem, computed ) {
10178			if ( computed ) {
10179				computed = curCSS( elem, prop );
10180
10181				// If curCSS returns percentage, fallback to offset
10182				return rnumnonpx.test( computed ) ?
10183					jQuery( elem ).position()[ prop ] + "px" :
10184					computed;
10185			}
10186		}
10187	);
10188} );
10189
10190
10191// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10192jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10193	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
10194		function( defaultExtra, funcName ) {
10195
10196		// Margin is only for outerHeight, outerWidth
10197		jQuery.fn[ funcName ] = function( margin, value ) {
10198			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10199				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10200
10201			return access( this, function( elem, type, value ) {
10202				var doc;
10203
10204				if ( isWindow( elem ) ) {
10205
10206					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
10207					return funcName.indexOf( "outer" ) === 0 ?
10208						elem[ "inner" + name ] :
10209						elem.document.documentElement[ "client" + name ];
10210				}
10211
10212				// Get document width or height
10213				if ( elem.nodeType === 9 ) {
10214					doc = elem.documentElement;
10215
10216					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
10217					// whichever is greatest
10218					return Math.max(
10219						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10220						elem.body[ "offset" + name ], doc[ "offset" + name ],
10221						doc[ "client" + name ]
10222					);
10223				}
10224
10225				return value === undefined ?
10226
10227					// Get width or height on the element, requesting but not forcing parseFloat
10228					jQuery.css( elem, type, extra ) :
10229
10230					// Set width or height on the element
10231					jQuery.style( elem, type, value, extra );
10232			}, type, chainable ? margin : undefined, chainable );
10233		};
10234	} );
10235} );
10236
10237
10238jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
10239	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10240	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
10241	function( i, name ) {
10242
10243	// Handle event binding
10244	jQuery.fn[ name ] = function( data, fn ) {
10245		return arguments.length > 0 ?
10246			this.on( name, null, data, fn ) :
10247			this.trigger( name );
10248	};
10249} );
10250
10251jQuery.fn.extend( {
10252	hover: function( fnOver, fnOut ) {
10253		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
10254	}
10255} );
10256
10257
10258
10259
10260jQuery.fn.extend( {
10261
10262	bind: function( types, data, fn ) {
10263		return this.on( types, null, data, fn );
10264	},
10265	unbind: function( types, fn ) {
10266		return this.off( types, null, fn );
10267	},
10268
10269	delegate: function( selector, types, data, fn ) {
10270		return this.on( types, selector, data, fn );
10271	},
10272	undelegate: function( selector, types, fn ) {
10273
10274		// ( namespace ) or ( selector, types [, fn] )
10275		return arguments.length === 1 ?
10276			this.off( selector, "**" ) :
10277			this.off( types, selector || "**", fn );
10278	}
10279} );
10280
10281// Bind a function to a context, optionally partially applying any
10282// arguments.
10283// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
10284// However, it is not slated for removal any time soon
10285jQuery.proxy = function( fn, context ) {
10286	var tmp, args, proxy;
10287
10288	if ( typeof context === "string" ) {
10289		tmp = fn[ context ];
10290		context = fn;
10291		fn = tmp;
10292	}
10293
10294	// Quick check to determine if target is callable, in the spec
10295	// this throws a TypeError, but we will just return undefined.
10296	if ( !isFunction( fn ) ) {
10297		return undefined;
10298	}
10299
10300	// Simulated bind
10301	args = slice.call( arguments, 2 );
10302	proxy = function() {
10303		return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
10304	};
10305
10306	// Set the guid of unique handler to the same of original handler, so it can be removed
10307	proxy.guid = fn.guid = fn.guid || jQuery.guid++;
10308
10309	return proxy;
10310};
10311
10312jQuery.holdReady = function( hold ) {
10313	if ( hold ) {
10314		jQuery.readyWait++;
10315	} else {
10316		jQuery.ready( true );
10317	}
10318};
10319jQuery.isArray = Array.isArray;
10320jQuery.parseJSON = JSON.parse;
10321jQuery.nodeName = nodeName;
10322jQuery.isFunction = isFunction;
10323jQuery.isWindow = isWindow;
10324jQuery.camelCase = camelCase;
10325jQuery.type = toType;
10326
10327jQuery.now = Date.now;
10328
10329jQuery.isNumeric = function( obj ) {
10330
10331	// As of jQuery 3.0, isNumeric is limited to
10332	// strings and numbers (primitives or objects)
10333	// that can be coerced to finite numbers (gh-2662)
10334	var type = jQuery.type( obj );
10335	return ( type === "number" || type === "string" ) &&
10336
10337		// parseFloat NaNs numeric-cast false positives ("")
10338		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
10339		// subtraction forces infinities to NaN
10340		!isNaN( obj - parseFloat( obj ) );
10341};
10342
10343
10344
10345
10346// Register as a named AMD module, since jQuery can be concatenated with other
10347// files that may use define, but not via a proper concatenation script that
10348// understands anonymous AMD modules. A named AMD is safest and most robust
10349// way to register. Lowercase jquery is used because AMD module names are
10350// derived from file names, and jQuery is normally delivered in a lowercase
10351// file name. Do this after creating the global so that if an AMD module wants
10352// to call noConflict to hide this version of jQuery, it will work.
10353
10354// Note that for maximum portability, libraries that are not jQuery should
10355// declare themselves as anonymous modules, and avoid setting a global if an
10356// AMD loader is present. jQuery is a special case. For more information, see
10357// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10358
10359if ( typeof define === "function" && define.amd ) {
10360	define( "jquery", [], function() {
10361		return jQuery;
10362	} );
10363}
10364
10365
10366
10367
10368var
10369
10370	// Map over jQuery in case of overwrite
10371	_jQuery = window.jQuery,
10372
10373	// Map over the $ in case of overwrite
10374	_$ = window.$;
10375
10376jQuery.noConflict = function( deep ) {
10377	if ( window.$ === jQuery ) {
10378		window.$ = _$;
10379	}
10380
10381	if ( deep && window.jQuery === jQuery ) {
10382		window.jQuery = _jQuery;
10383	}
10384
10385	return jQuery;
10386};
10387
10388// Expose jQuery and $ identifiers, even in AMD
10389// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10390// and CommonJS for browser emulators (#13566)
10391if ( !noGlobal ) {
10392	window.jQuery = window.$ = jQuery;
10393}
10394
10395
10396
10397
10398return jQuery;
10399} );
10400
10401/*
10402 Copyright (C) Federico Zivolo 2018
10403 Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT).
10404 */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=getComputedStyle(e,null);return t?o[t]:o}
vendor: 18,627 bytes, line 10404
10404function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function r(e){return 11===e?re:10===e?pe:re||pe}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:'top',o='top'===t?'scrollTop':'scrollLeft',n=e.nodeName;if('BODY'===n||'HTML'===n){var i=e.ownerDocument.documentElement,r=e.ownerDocument.scrollingElement||i;return r[o]}return e[o]}function f(e,t){var o=2<arguments.length&&void 0!==arguments[2]&&arguments[2],n=l(t,'top'),i=l(t,'left'),r=o?-1:1;return e.top+=n*r,e.bottom+=n*r,e.left+=i*r,e.right+=i*r,e}function m(e,t){var o='x'===t?'Left':'Top',n='Left'==o?'Right':'Bottom';return parseFloat(e['border'+o+'Width'],10)+parseFloat(e['border'+n+'Width'],10)}function h(e,t,o,n){return J(t['offset'+e],t['scroll'+e],o['client'+e],o['offset'+e],o['scroll'+e],r(10)?parseInt(o['offset'+e])+parseInt(n['margin'+('Height'===e?'Top':'Left')])+parseInt(n['margin'+('Height'===e?'Bottom':'Right')]):0)}function c(e){var t=e.body,o=e.documentElement,n=r(10)&&getComputedStyle(o);return{height:h('Height',t,o,n),width:h('Width',t,o,n)}}function g(e){return le({},e,{right:e.left+e.width,bottom:e.top+e.height})}function u(e){var o={};try{if(r(10)){o=e.getBoundingClientRect();var n=l(e,'top'),i=l(e,'left');o.top+=n,o.left+=i,o.bottom+=n,o.right+=i}else o=e.getBoundingClientRect()}catch(t){}var p={left:o.left,top:o.top,width:o.right-o.left,height:o.bottom-o.top},s='HTML'===e.nodeName?c(e.ownerDocument):{},d=s.width||e.clientWidth||p.right-p.left,a=s.height||e.clientHeight||p.bottom-p.top,f=e.offsetWidth-d,h=e.offsetHeight-a;if(f||h){var u=t(e);f-=m(u,'x'),h-=m(u,'y'),p.width-=f,p.height-=h}return g(p)}function b(e,o){var i=2<arguments.length&&void 0!==arguments[2]&&arguments[2],p=r(10),s='HTML'===o.nodeName,d=u(e),a=u(o),l=n(e),m=t(o),h=parseFloat(m.borderTopWidth,10),c=parseFloat(m.borderLeftWidth,10);i&&s&&(a.top=J(a.top,0),a.left=J(a.left,0));var b=g({top:d.top-a.top-h,left:d.left-a.left-c,width:d.width,height:d.height});if(b.marginTop=0,b.marginLeft=0,!p&&s){var y=parseFloat(m.marginTop,10),w=parseFloat(m.marginLeft,10);b.top-=h-y,b.bottom-=h-y,b.left-=c-w,b.right-=c-w,b.marginTop=y,b.marginLeft=w}return(p&&!i?o.contains(l):o===l&&'BODY'!==l.nodeName)&&(b=f(b,o)),b}function y(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],o=e.ownerDocument.documentElement,n=b(e,o),i=J(o.clientWidth,window.innerWidth||0),r=J(o.clientHeight,window.innerHeight||0),p=t?0:l(o),s=t?0:l(o,'left'),d={top:p-n.top+n.marginTop,left:s-n.left+n.marginLeft,width:i,height:r};return g(d)}function w(e){var n=e.nodeName;return'BODY'===n||'HTML'===n?!1:'fixed'===t(e,'position')||w(o(e))}function E(e){if(!e||!e.parentElement||r())return document.documentElement;for(var o=e.parentElement;o&&'none'===t(o,'transform');)o=o.parentElement;return o||document.documentElement}function v(e,t,i,r){var p=4<arguments.length&&void 0!==arguments[4]&&arguments[4],s={top:0,left:0},d=p?E(e):a(e,t);if('viewport'===r)s=y(d,p);else{var l;'scrollParent'===r?(l=n(o(t)),'BODY'===l.nodeName&&(l=e.ownerDocument.documentElement)):'window'===r?l=e.ownerDocument.documentElement:l=r;var f=b(l,d,p);if('HTML'===l.nodeName&&!w(d)){var m=c(e.ownerDocument),h=m.height,g=m.width;s.top+=f.top-f.marginTop,s.bottom=h+f.top,s.left+=f.left-f.marginLeft,s.right=g+f.left}else s=f}i=i||0;var u='number'==typeof i;return s.left+=u?i:i.left||0,s.top+=u?i:i.top||0,s.right-=u?i:i.right||0,s.bottom-=u?i:i.bottom||0,s}function x(e){var t=e.width,o=e.height;return t*o}function O(e,t,o,n,i){var r=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf('auto'))return e;var p=v(o,n,r,i),s={top:{width:p.width,height:t.top-p.top},right:{width:p.right-t.right,height:p.height},bottom:{width:p.width,height:p.bottom-t.bottom},left:{width:t.left-p.left,height:p.height}},d=Object.keys(s).map(function(e){return le({key:e},s[e],{area:x(s[e])})}).sort(function(e,t){return t.area-e.area}),a=d.filter(function(e){var t=e.width,n=e.height;return t>=o.clientWidth&&n>=o.clientHeight}),l=0<a.length?a[0].key:d[0].key,f=e.split('-')[1];return l+(f?'-'+f:'')}function L(e,t,o){var n=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null,i=n?E(t):a(t,o);return b(o,i,n)}function S(e){var t=getComputedStyle(e),o=parseFloat(t.marginTop)+parseFloat(t.marginBottom),n=parseFloat(t.marginLeft)+parseFloat(t.marginRight),i={width:e.offsetWidth+n,height:e.offsetHeight+o};return i}function T(e){var t={left:'right',right:'left',bottom:'top',top:'bottom'};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function D(e,t,o){o=o.split('-')[0];var n=S(e),i={width:n.width,height:n.height},r=-1!==['right','left'].indexOf(o),p=r?'top':'left',s=r?'left':'top',d=r?'height':'width',a=r?'width':'height';return i[p]=t[p]+t[d]/2-n[d]/2,i[s]=o===s?t[s]-n[a]:t[T(s)],i}function C(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function N(e,t,o){if(Array.prototype.findIndex)return e.findIndex(function(e){return e[t]===o});var n=C(e,function(e){return e[t]===o});return e.indexOf(n)}function P(t,o,n){var i=void 0===n?t:t.slice(0,N(t,'name',n));return i.forEach(function(t){t['function']&&console.warn('`modifier.function` is deprecated, use `modifier.fn`!');var n=t['function']||t.fn;t.enabled&&e(n)&&(o.offsets.popper=g(o.offsets.popper),o.offsets.reference=g(o.offsets.reference),o=n(o,t))}),o}function k(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=L(this.state,this.popper,this.reference,this.options.positionFixed),e.placement=O(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.positionFixed=this.options.positionFixed,e.offsets.popper=D(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position=this.options.positionFixed?'fixed':'absolute',e=P(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}function W(e,t){return e.some(function(e){var o=e.name,n=e.enabled;return n&&o===t})}function H(e){for(var t=[!1,'ms','Webkit','Moz','O'],o=e.charAt(0).toUpperCase()+e.slice(1),n=0;n<t.length;n++){var i=t[n],r=i?''+i+o:e;if('undefined'!=typeof document.body.style[r])return r}return null}function B(){return this.state.isDestroyed=!0,W(this.modifiers,'applyStyle')&&(this.popper.removeAttribute('x-placement'),this.popper.style.position='',this.popper.style.top='',this.popper.style.left='',this.popper.style.right='',this.popper.style.bottom='',this.popper.style.willChange='',this.popper.style[H('transform')]=''),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}function A(e){var t=e.ownerDocument;return t?t.defaultView:window}function M(e,t,o,i){var r='BODY'===e.nodeName,p=r?e.ownerDocument.defaultView:e;p.addEventListener(t,o,{passive:!0}),r||M(n(p.parentNode),t,o,i),i.push(p)}function F(e,t,o,i){o.updateBound=i,A(e).addEventListener('resize',o.updateBound,{passive:!0});var r=n(e);return M(r,'scroll',o.updateBound,o.scrollParents),o.scrollElement=r,o.eventsEnabled=!0,o}function I(){this.state.eventsEnabled||(this.state=F(this.reference,this.options,this.state,this.scheduleUpdate))}function R(e,t){return A(e).removeEventListener('resize',t.updateBound),t.scrollParents.forEach(function(e){e.removeEventListener('scroll',t.updateBound)}),t.updateBound=null,t.scrollParents=[],t.scrollElement=null,t.eventsEnabled=!1,t}function U(){this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=R(this.reference,this.state))}function Y(e){return''!==e&&!isNaN(parseFloat(e))&&isFinite(e)}function j(e,t){Object.keys(t).forEach(function(o){var n='';-1!==['width','height','top','right','bottom','left'].indexOf(o)&&Y(t[o])&&(n='px'),e.style[o]=t[o]+n})}function K(e,t){Object.keys(t).forEach(function(o){var n=t[o];!1===n?e.removeAttribute(o):e.setAttribute(o,t[o])})}function q(e,t,o){var n=C(e,function(e){var o=e.name;return o===t}),i=!!n&&e.some(function(e){return e.name===o&&e.enabled&&e.order<n.order});if(!i){var r='`'+t+'`';console.warn('`'+o+'`'+' modifier is required by '+r+' modifier in order to work, be sure to include it before '+r+'!')}return i}function G(e){return'end'===e?'start':'start'===e?'end':e}function V(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],o=me.indexOf(e),n=me.slice(o+1).concat(me.slice(0,o));return t?n.reverse():n}function z(e,t,o,n){var i=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+i[1],p=i[2];if(!r)return e;if(0===p.indexOf('%')){var s;switch(p){case'%p':s=o;break;case'%':case'%r':default:s=n;}var d=g(s);return d[t]/100*r}if('vh'===p||'vw'===p){var a;return a='vh'===p?J(document.documentElement.clientHeight,window.innerHeight||0):J(document.documentElement.clientWidth,window.innerWidth||0),a/100*r}return r}function _(e,t,o,n){var i=[0,0],r=-1!==['right','left'].indexOf(n),p=e.split(/(\+|\-)/).map(function(e){return e.trim()}),s=p.indexOf(C(p,function(e){return-1!==e.search(/,|\s/)}));p[s]&&-1===p[s].indexOf(',')&&console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');var d=/\s*,\s*|\s+/,a=-1===s?[p]:[p.slice(0,s).concat([p[s].split(d)[0]]),[p[s].split(d)[1]].concat(p.slice(s+1))];return a=a.map(function(e,n){var i=(1===n?!r:r)?'height':'width',p=!1;return e.reduce(function(e,t){return''===e[e.length-1]&&-1!==['+','-'].indexOf(t)?(e[e.length-1]=t,p=!0,e):p?(e[e.length-1]+=t,p=!1,e):e.concat(t)},[]).map(function(e){return z(e,i,t,o)})}),a.forEach(function(e,t){e.forEach(function(o,n){Y(o)&&(i[t]+=o*('-'===e[n-1]?-1:1))})}),i}function X(e,t){var o,n=t.offset,i=e.placement,r=e.offsets,p=r.popper,s=r.reference,d=i.split('-')[0];return o=Y(+n)?[+n,0]:_(n,p,s,d),'left'===d?(p.top+=o[0],p.left-=o[1]):'right'===d?(p.top+=o[0],p.left+=o[1]):'top'===d?(p.left+=o[0],p.top-=o[1]):'bottom'===d&&(p.left+=o[0],p.top+=o[1]),e.popper=p,e}for(var Q=Math.min,Z=Math.round,$=Math.floor,J=Math.max,ee='undefined'!=typeof window&&'undefined'!=typeof document,te=['Edge','Trident','Firefox'],oe=0,ne=0;ne<te.length;ne+=1)if(ee&&0<=navigator.userAgent.indexOf(te[ne])){oe=1;break}var i=ee&&window.Promise,ie=i?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then(function(){t=!1,e()}))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout(function(){t=!1,e()},oe))}},re=ee&&!!(window.MSInputMethodContext&&document.documentMode),pe=ee&&/MSIE 10/.test(navigator.userAgent),se=function(e,t){if(!(e instanceof t))throw new TypeError('Cannot call a class as a function')},de=function(){function e(e,t){for(var o,n=0;n<t.length;n++)o=t[n],o.enumerable=o.enumerable||!1,o.configurable=!0,'value'in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),ae=function(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e},le=Object.assign||function(e){for(var t,o=1;o<arguments.length;o++)for(var n in t=arguments[o],t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},fe=['auto-start','auto','auto-end','top-start','top','top-end','right-start','right','right-end','bottom-end','bottom','bottom-start','left-end','left','left-start'],me=fe.slice(3),he={FLIP:'flip',CLOCKWISE:'clockwise',COUNTERCLOCKWISE:'counterclockwise'},ce=function(){function t(o,n){var i=this,r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};se(this,t),this.scheduleUpdate=function(){return requestAnimationFrame(i.update)},this.update=ie(this.update.bind(this)),this.options=le({},t.Defaults,r),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=o&&o.jquery?o[0]:o,this.popper=n&&n.jquery?n[0]:n,this.options.modifiers={},Object.keys(le({},t.Defaults.modifiers,r.modifiers)).forEach(function(e){i.options.modifiers[e]=le({},t.Defaults.modifiers[e]||{},r.modifiers?r.modifiers[e]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(e){return le({name:e},i.options.modifiers[e])}).sort(function(e,t){return e.order-t.order}),this.modifiers.forEach(function(t){t.enabled&&e(t.onLoad)&&t.onLoad(i.reference,i.popper,i.options,t,i.state)}),this.update();var p=this.options.eventsEnabled;p&&this.enableEventListeners(),this.state.eventsEnabled=p}return de(t,[{key:'update',value:function(){return k.call(this)}},{key:'destroy',value:function(){return B.call(this)}},{key:'enableEventListeners',value:function(){return I.call(this)}},{key:'disableEventListeners',value:function(){return U.call(this)}}]),t}();return ce.Utils=('undefined'==typeof window?global:window).PopperUtils,ce.placements=fe,ce.Defaults={placement:'bottom',positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,o=t.split('-')[0],n=t.split('-')[1];if(n){var i=e.offsets,r=i.reference,p=i.popper,s=-1!==['bottom','top'].indexOf(o),d=s?'left':'top',a=s?'width':'height',l={start:ae({},d,r[d]),end:ae({},d,r[d]+r[a]-p[a])};e.offsets.popper=le({},p,l[n])}return e}},offset:{order:200,enabled:!0,fn:X,offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,t){var o=t.boundariesElement||p(e.instance.popper);e.instance.reference===o&&(o=p(o));var n=H('transform'),i=e.instance.popper.style,r=i.top,s=i.left,d=i[n];i.top='',i.left='',i[n]='';var a=v(e.instance.popper,e.instance.reference,t.padding,o,e.positionFixed);i.top=r,i.left=s,i[n]=d,t.boundaries=a;var l=t.priority,f=e.offsets.popper,m={primary:function(e){var o=f[e];return f[e]<a[e]&&!t.escapeWithReference&&(o=J(f[e],a[e])),ae({},e,o)},secondary:function(e){var o='right'===e?'left':'top',n=f[o];return f[e]>a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),ae({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=le({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=$,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]<r(n[d])&&(e.offsets.popper[d]=r(n[d])-o[a]),o[d]>r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!q(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-u<s[m]&&(e.offsets.popper[m]-=s[m]-(d[c]-u)),d[m]+u>s[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,y=t(e.instance.popper),w=parseFloat(y['margin'+f],10),E=parseFloat(y['border'+f+'Width'],10),v=b-e.offsets.popper[m]-w-E;return v=J(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},ae(n,m,Z(v)),ae(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case he.FLIP:p=[n,i];break;case he.CLOCKWISE:p=V(n);break;case he.COUNTERCLOCKWISE:p=V(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=$,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)<f(l.right)||'top'===n&&f(a.bottom)>f(l.top)||'bottom'===n&&f(a.top)<f(l.bottom),h=f(a.left)<f(o.left),c=f(a.right)>f(o.right),g=f(a.top)<f(o.top),u=f(a.bottom)>f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,y=-1!==['top','bottom'].indexOf(n),w=!!t.flipVariations&&(y&&'start'===r&&h||y&&'end'===r&&c||!y&&'start'===r&&g||!y&&'end'===r&&u);(m||b||w)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),w&&(r=G(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=le({},e.offsets.popper,D(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!q(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=C(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottom<o.top||t.left>o.right||t.top>o.bottom||t.right<o.left){if(!0===e.hide)return e;e.hide=!0,e.attributes['x-out-of-boundaries']=''}else{if(!1===e.hide)return e;e.hide=!1,e.attributes['x-out-of-boundaries']=!1}return e}},computeStyle:{order:850,enabled:!0,fn:function(e,t){var o=t.x,n=t.y,i=e.offsets.popper,r=C(e.instance.modifiers,function(e){return'applyStyle'===e.name}).gpuAcceleration;
10404void 0!==r&&console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');var s,d,a=void 0===r?t.gpuAcceleration:r,l=p(e.instance.popper),f=u(l),m={position:i.position},h={left:$(i.left),top:Z(i.top),bottom:Z(i.bottom),right:$(i.right)},c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=H('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var y='bottom'==c?-1:1,w='right'==g?-1:1;m[c]=d*y,m[g]=s*w,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=le({},E,e.attributes),e.styles=le({},m,e.styles),e.arrowStyles=le({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return j(e.instance.popper,e.styles),K(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&j(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),j(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ce});
10405//# sourceMappingURL=popper.min.js.map
10406
10407/**
10408 * --------------------------------------------------------------------------
10409 * Bootstrap (v4.0.0-alpha.6): index.js
10410 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
10411 * --------------------------------------------------------------------------
10412 */
10413(function ($) {
10414  if (typeof $ === 'undefined') {
10415    throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
10416  }
10417
10418  var version = $.fn.jquery.split(' ')[0].split('.');
10419  var minMajor = 1;
10420  var ltMajor = 2;
10421  var minMinor = 9;
10422  var minPatch = 1;
10423  var maxMajor = 4;
10424
10425  if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
10426    throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
10427  }
10428})($);
10429//# sourceMappingURL=index.js.map
10430/**
10431 * --------------------------------------------------------------------------
10432 * Bootstrap (v4.0.0): util.js
10433 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
10434 * --------------------------------------------------------------------------
10435 */
10436var Util = function ($) {
10437  /**
10438   * ------------------------------------------------------------------------
10439   * Private TransitionEnd Helpers
10440   * ------------------------------------------------------------------------
10441   */
10442  var transition = false;
10443  var MAX_UID = 1000000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
10444
10445  function toType(obj) {
10446    return {}.toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
10447  }
10448
10449  function getSpecialTransitionEndEvent() {
10450    return {
10451      bindType: transition.end,
10452      delegateType: transition.end,
10453      handle: function handle(event) {
10454        if ($(event.target).is(this)) {
10455          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
10456        }
10457
10458        return undefined; // eslint-disable-line no-undefined
10459      }
10460    };
10461  }
10462
10463  function transitionEndTest() {
10464    if (typeof window !== 'undefined' && window.QUnit) {
10465      return false;
10466    }
10467
10468    return {
10469      end: 'transitionend'
10470    };
10471  }
10472
10473  function transitionEndEmulator(duration) {
10474    var _this = this;
10475
10476    var called = false;
10477    $(this).one(Util.TRANSITION_END, function () {
10478      called = true;
10479    });
10480    setTimeout(function () {
10481      if (!called) {
10482        Util.triggerTransitionEnd(_this);
10483      }
10484    }, duration);
10485    return this;
10486  }
10487
10488  function setTransitionEndSupport() {
10489    transition = transitionEndTest();
10490    $.fn.emulateTransitionEnd = transitionEndEmulator;
10491
10492    if (Util.supportsTransitionEnd()) {
10493      $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
10494    }
10495  }
10496
10497  function escapeId(selector) {
10498    // We escape IDs in case of special selectors (selector = '#myId:something')
10499    // $.escapeSelector does not exist in jQuery < 3
10500    selector = typeof $.escapeSelector === 'function' ? $.escapeSelector(selector).substr(1) : selector.replace(/(:|\.|\[|\]|,|=|@)/g, '\\$1');
10501    return selector;
10502  }
10503  /**
10504   * --------------------------------------------------------------------------
10505   * Public Util Api
10506   * --------------------------------------------------------------------------
10507   */
10508
10509
10510  var Util = {
10511    TRANSITION_END: 'bsTransitionEnd',
10512    getUID: function getUID(prefix) {
10513      do {
10514        // eslint-disable-next-line no-bitwise
10515        prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
10516      } while (document.getElementById(prefix));
10517
10518      return prefix;
10519    },
10520    getSelectorFromElement: function getSelectorFromElement(element) {
10521      var selector = element.getAttribute('data-target');
10522
10523      if (!selector || selector === '#') {
10524        selector = element.getAttribute('href') || '';
10525      } // If it's an ID
10526
10527
10528      if (selector.charAt(0) === '#') {
10529        selector = escapeId(selector);
10530      }
10531
10532      try {
10533        var $selector = $(document).find(selector);
10534        return $selector.length > 0 ? selector : null;
10535      } catch (err) {
10536        return null;
10537      }
10538    },
10539    reflow: function reflow(element) {
10540      return element.offsetHeight;
10541    },
10542    triggerTransitionEnd: function triggerTransitionEnd(element) {
10543      $(element).trigger(transition.end);
10544    },
10545    supportsTransitionEnd: function supportsTransitionEnd() {
10546      return Boolean(transition);
10547    },
10548    isElement: function isElement(obj) {
10549      return (obj[0] || obj).nodeType;
10550    },
10551    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
10552      for (var property in configTypes) {
10553        if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
10554          var expectedTypes = configTypes[property];
10555          var value = config[property];
10556          var valueType = value && Util.isElement(value) ? 'element' : toType(value);
10557
10558          if (!new RegExp(expectedTypes).test(valueType)) {
10559            throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
10560          }
10561        }
10562      }
10563    }
10564  };
10565  setTransitionEndSupport();
10566  return Util;
10567}($);
10568//# sourceMappingURL=util.js.map
10569function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
10570
10571function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
10572
10573/**
10574 * --------------------------------------------------------------------------
10575 * Bootstrap (v4.0.0): button.js
10576 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
10577 * --------------------------------------------------------------------------
10578 */
10579var Button = function ($) {
10580  /**
10581   * ------------------------------------------------------------------------
10582   * Constants
10583   * ------------------------------------------------------------------------
10584   */
10585  var NAME = 'button';
10586  var VERSION = '4.0.0';
10587  var DATA_KEY = 'bs.button';
10588  var EVENT_KEY = "." + DATA_KEY;
10589  var DATA_API_KEY = '.data-api';
10590  var JQUERY_NO_CONFLICT = $.fn[NAME];
10591  var ClassName = {
10592    ACTIVE: 'active',
10593    BUTTON: 'btn',
10594    FOCUS: 'focus'
10595  };
10596  var Selector = {
10597    DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
10598    DATA_TOGGLE: '[data-toggle="buttons"]',
10599    INPUT: 'input',
10600    ACTIVE: '.active',
10601    BUTTON: '.btn'
10602  };
10603  var Event = {
10604    CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY,
10605    FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY + DATA_API_KEY + " " + ("blur" + EVENT_KEY + DATA_API_KEY)
10606    /**
10607     * ------------------------------------------------------------------------
10608     * Class Definition
10609     * ------------------------------------------------------------------------
10610     */
10611
10612  };
10613
10614  var Button =
10615  /*#__PURE__*/
10616  function () {
10617    function Button(element) {
10618      this._element = element;
10619    } // Getters
10620
10621
10622    var _proto = Button.prototype;
10623
10624    // Public
10625    _proto.toggle = function toggle() {
10626      var triggerChangeEvent = true;
10627      var addAriaPressed = true;
10628      var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0];
10629
10630      if (rootElement) {
10631        var input = $(this._element).find(Selector.INPUT)[0];
10632
10633        if (input) {
10634          if (input.type === 'radio') {
10635            if (input.checked && $(this._element).hasClass(ClassName.ACTIVE)) {
10636              triggerChangeEvent = false;
10637            } else {
10638              var activeElement = $(rootElement).find(Selector.ACTIVE)[0];
10639
10640              if (activeElement) {
10641                $(activeElement).removeClass(ClassName.ACTIVE);
10642              }
10643            }
10644          }
10645
10646          if (triggerChangeEvent) {
10647            if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {
10648              return;
10649            }
10650
10651            input.checked = !$(this._element).hasClass(ClassName.ACTIVE);
10652            $(input).trigger('change');
10653          }
10654
10655          input.focus();
10656          addAriaPressed = false;
vendor: 4,587 bytes, lines 10657-10801
10657        }
10658      }
10659
10660      if (addAriaPressed) {
10661        this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE));
10662      }
10663
10664      if (triggerChangeEvent) {
10665        $(this._element).toggleClass(ClassName.ACTIVE);
10666      }
10667    };
10668
10669    _proto.dispose = function dispose() {
10670      $.removeData(this._element, DATA_KEY);
10671      this._element = null;
10672    }; // Static
10673
10674
10675    Button._jQueryInterface = function _jQueryInterface(config) {
10676      return this.each(function () {
10677        var data = $(this).data(DATA_KEY);
10678
10679        if (!data) {
10680          data = new Button(this);
10681          $(this).data(DATA_KEY, data);
10682        }
10683
10684        if (config === 'toggle') {
10685          data[config]();
10686        }
10687      });
10688    };
10689
10690    _createClass(Button, null, [{
10691      key: "VERSION",
10692      get: function get() {
10693        return VERSION;
10694      }
10695    }]);
10696
10697    return Button;
10698  }();
10699  /**
10700   * ------------------------------------------------------------------------
10701   * Data Api implementation
10702   * ------------------------------------------------------------------------
10703   */
10704
10705
10706  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
10707    event.preventDefault();
10708    var button = event.target;
10709
10710    if (!$(button).hasClass(ClassName.BUTTON)) {
10711      button = $(button).closest(Selector.BUTTON);
10712    }
10713
10714    Button._jQueryInterface.call($(button), 'toggle');
10715  }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
10716    var button = $(event.target).closest(Selector.BUTTON)[0];
10717    $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));
10718  });
10719  /**
10720   * ------------------------------------------------------------------------
10721   * jQuery
10722   * ------------------------------------------------------------------------
10723   */
10724
10725  $.fn[NAME] = Button._jQueryInterface;
10726  $.fn[NAME].Constructor = Button;
10727
10728  $.fn[NAME].noConflict = function () {
10729    $.fn[NAME] = JQUERY_NO_CONFLICT;
10730    return Button._jQueryInterface;
10731  };
10732
10733  return Button;
10734}($);
10735//# sourceMappingURL=button.js.map
10736function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
10737
10738function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
10739
10740function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
10741
10742/**
10743 * --------------------------------------------------------------------------
10744 * Bootstrap (v4.0.0): collapse.js
10745 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
10746 * --------------------------------------------------------------------------
10747 */
10748var Collapse = function ($) {
10749  /**
10750   * ------------------------------------------------------------------------
10751   * Constants
10752   * ------------------------------------------------------------------------
10753   */
10754  var NAME = 'collapse';
10755  var VERSION = '4.0.0';
10756  var DATA_KEY = 'bs.collapse';
10757  var EVENT_KEY = "." + DATA_KEY;
10758  var DATA_API_KEY = '.data-api';
10759  var JQUERY_NO_CONFLICT = $.fn[NAME];
10760  var TRANSITION_DURATION = 600;
10761  var Default = {
10762    toggle: true,
10763    parent: ''
10764  };
10765  var DefaultType = {
10766    toggle: 'boolean',
10767    parent: '(string|element)'
10768  };
10769  var Event = {
10770    SHOW: "show" + EVENT_KEY,
10771    SHOWN: "shown" + EVENT_KEY,
10772    HIDE: "hide" + EVENT_KEY,
10773    HIDDEN: "hidden" + EVENT_KEY,
10774    CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
10775  };
10776  var ClassName = {
10777    SHOW: 'show',
10778    COLLAPSE: 'collapse',
10779    COLLAPSING: 'collapsing',
10780    COLLAPSED: 'collapsed'
10781  };
10782  var Dimension = {
10783    WIDTH: 'width',
10784    HEIGHT: 'height'
10785  };
10786  var Selector = {
10787    ACTIVES: '.show, .collapsing',
10788    DATA_TOGGLE: '[data-toggle="collapse"]'
10789    /**
10790     * ------------------------------------------------------------------------
10791     * Class Definition
10792     * ------------------------------------------------------------------------
10793     */
10794
10795  };
10796
10797  var Collapse =
10798  /*#__PURE__*/
10799  function () {
10800    function Collapse(element, config) {
10801      this._isTransitioning = false;
10802      this._element = element;
10803      this._config = this._getConfig(config);
10804      this._triggerArray = $.makeArray($("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
10805      var tabToggles = $(Selector.DATA_TOGGLE);
10806
10807      for (var i = 0; i < tabToggles.length; i++) {
10808        var elem = tabToggles[i];
10809        var selector = Util.getSelectorFromElement(elem);
10810
10811        if (selector !== null && $(selector).filter(element).length > 0) {
10812          this._selector = selector;
10813
10814          this._triggerArray.push(elem);
10815        }
10816      }
10817
10818      this._parent = this._config.parent ? this._getParent() : null;
10819
10820      if (!this._config.parent) {
10821        this._addAriaAndCollapsedClass(this._element, this._triggerArray);
10822      }
10823
10824      if (this._config.toggle) {
10825        this.toggle();
10826      }
10827    } // Getters
10828
10829
10830    var _proto = Collapse.prototype;
10831
10832    // Public
10833    _proto.toggle = function toggle() {
10834      if ($(this._element).hasClass(ClassName.SHOW)) {
10835        this.hide();
10836      } else {
10837        this.show();
10838      }
10839    };
10840
10841    _proto.show = function show() {
10842      var _this = this;
10843
10844      if (this._isTransitioning || $(this._element).hasClass(ClassName.SHOW)) {
10845        return;
10846      }
10847
10848      var actives;
10849      var activesData;
10850
10851      if (this._parent) {
10852        actives = $.makeArray($(this._parent).find(Selector.ACTIVES).filter("[data-parent=\"" + this._config.parent + "\"]"));
10853
10854        if (actives.length === 0) {
10855          actives = null;
10856        }
10857      }
10858
10859      if (actives) {
10860        activesData = $(actives).not(this._selector).data(DATA_KEY);
10861
10862        if (activesData && activesData._isTransitioning) {
10863          return;
10864        }
10865      }
10866
10867      var startEvent = $.Event(Event.SHOW);
10868      $(this._element).trigger(startEvent);
10869
10870      if (startEvent.isDefaultPrevented()) {
10871        return;
10872      }
10873
10874      if (actives) {
10875        Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');
10876
10877        if (!activesData) {
10878          $(actives).data(DATA_KEY, null);
10879        }
10880      }
10881
10882      var dimension = this._getDimension();
10883
10884      $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
10885      this._element.style[dimension] = 0;
10886
10887      if (this._triggerArray.length > 0) {
10888        $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
10889      }
10890
10891      this.setTransitioning(true);
10892
10893      var complete = function complete() {
10894        $(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
10895        _this._element.style[dimension] = '';
10896
10897        _this.setTransitioning(false);
10898
10899        $(_this._element).trigger(Event.SHOWN);
10900      };
10901
10902      if (!Util.supportsTransitionEnd()) {
10903        complete();
10904        return;
10905      }
10906
10907      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
10908      var scrollSize = "scroll" + capitalizedDimension;
10909      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
10910      this._element.style[dimension] = this._element[scrollSize] + "px";
10911    };
10912
10913    _proto.hide = function hide() {
10914      var _this2 = this;
10915
10916      if (this._isTransitioning || !$(this._element).hasClass(ClassName.SHOW)) {
10917        return;
10918      }
10919
10920      var startEvent = $.Event(Event.HIDE);
10921      $(this._element).trigger(startEvent);
10922
10923      if (startEvent.isDefaultPrevented()) {
10924        return;
10925      }
10926
10927      var dimension = this._getDimension();
10928
10929      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
10930      Util.reflow(this._element);
10931      $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
10932
10933      if (this._triggerArray.length > 0) {
10934        for (var i = 0; i < this._triggerArray.length; i++) {
10935          var trigger = this._triggerArray[i];
10936          var selector = Util.getSelectorFromElement(trigger);
10937
10938          if (selector !== null) {
10939            var $elem = $(selector);
10940
10941            if (!$elem.hasClass(ClassName.SHOW)) {
10942              $(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
10943            }
10944          }
10945        }
10946      }
10947
10948      this.setTransitioning(true);
10949
10950      var complete = function complete() {
10951        _this2.setTransitioning(false);
10952
10953        $(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
10954      };
10955
10956      this._element.style[dimension] = '';
10957
10958      if (!Util.supportsTransitionEnd()) {
10959        complete();
10960        return;
10961      }
10962
10963      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
10964    };
10965
10966    _proto.setTransitioning = function setTransitioning(isTransitioning) {
10967      this._isTransitioning = isTransitioning;
10968    };
10969
10970    _proto.dispose = function dispose() {
10971      $.removeData(this._element, DATA_KEY);
10972      this._config = null;
10973      this._parent = null;
10974      this._element = null;
10975      this._triggerArray = null;
10976      this._isTransitioning = null;
10977    }; // Private
10978
10979
10980    _proto._getConfig = function _getConfig(config) {
10981      config = _extends({}, Default, config);
10982      config.toggle = Boolean(config.toggle); // Coerce string values
10983
10984      Util.typeCheckConfig(NAME, config, DefaultType);
10985      return config;
10986    };
10987
10988    _proto._getDimension = function _getDimension() {
10989      var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
10990      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
10991    };
10992
10993    _proto._getParent = function _getParent() {
10994      var _this3 = this;
10995
10996      var parent = null;
10997
10998      if (Util.isElement(this._config.parent)) {
10999        parent = this._config.parent; // It's a jQuery object
11000
11001        if (typeof this._config.parent.jquery !== 'undefined') {
11002          parent = this._config.parent[0];
11003        }
11004      } else {
11005        parent = $(this._config.parent)[0];
11006      }
11007
11008      var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
11009      $(parent).find(selector).each(function (i, element) {
11010        _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
11011      });
11012      return parent;
11013    };
11014
11015    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
11016      if (element) {
11017        var isOpen = $(element).hasClass(ClassName.SHOW);
11018
11019        if (triggerArray.length > 0) {
11020          $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
11021        }
11022      }
11023    }; // Static
11024
11025
11026    Collapse._getTargetFromElement = function _getTargetFromElement(element) {
11027      var selector = Util.getSelectorFromElement(element);
11028      return selector ? $(selector)[0] : null;
11029    };
11030
11031    Collapse._jQueryInterface = function _jQueryInterface(config) {
11032      return this.each(function () {
11033        var $this = $(this);
11034        var data = $this.data(DATA_KEY);
11035
11036        var _config = _extends({}, Default, $this.data(), typeof config === 'object' && config);
11037
11038        if (!data && _config.toggle && /show|hide/.test(config)) {
11039          _config.toggle = false;
11040        }
11041
11042        if (!data) {
11043          data = new Collapse(this, _config);
11044          $this.data(DATA_KEY, data);
11045        }
11046
11047        if (typeof config === 'string') {
11048          if (typeof data[config] === 'undefined') {
11049            throw new TypeError("No method named \"" + config + "\"");
11050          }
11051
11052          data[config]();
11053        }
11054      });
11055    };
11056
11057    _createClass(Collapse, null, [{
11058      key: "VERSION",
11059      get: function get() {
11060        return VERSION;
11061      }
11062    }, {
11063      key: "Default",
11064      get: function get() {
11065        return Default;
11066      }
11067    }]);
11068
11069    return Collapse;
11070  }();
11071  /**
11072   * ------------------------------------------------------------------------
11073   * Data Api implementation
11074   * ------------------------------------------------------------------------
11075   */
11076
11077
11078  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
11079    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
11080    if (event.currentTarget.tagName === 'A') {
11081      event.preventDefault();
11082    }
11083
11084    var $trigger = $(this);
11085    var selector = Util.getSelectorFromElement(this);
11086    $(selector).each(function () {
11087      var $target = $(this);
11088      var data = $target.data(DATA_KEY);
11089      var config = data ? 'toggle' : $trigger.data();
11090
11091      Collapse._jQueryInterface.call($target, config);
11092    });
11093  });
11094  /**
11095   * ------------------------------------------------------------------------
11096   * jQuery
11097   * ------------------------------------------------------------------------
11098   */
11099
11100  $.fn[NAME] = Collapse._jQueryInterface;
11101  $.fn[NAME].Constructor = Collapse;
11102
11103  $.fn[NAME].noConflict = function () {
11104    $.fn[NAME] = JQUERY_NO_CONFLICT;
11105    return Collapse._jQueryInterface;
11106  };
11107
11108  return Collapse;
11109}($);
11110//# sourceMappingURL=collapse.js.map
11111function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
11112
11113function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
11114
11115function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
11116
11117/**
11118 * --------------------------------------------------------------------------
11119 * Bootstrap (v4.0.0): tooltip.js
11120 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
11121 * --------------------------------------------------------------------------
11122 */
11123var Tooltip = function ($) {
11124  /**
11125   * ------------------------------------------------------------------------
11126   * Constants
11127   * ------------------------------------------------------------------------
11128   */
11129  var NAME = 'tooltip';
11130  var VERSION = '4.0.0';
11131  var DATA_KEY = 'bs.tooltip';
11132  var EVENT_KEY = "." + DATA_KEY;
11133  var JQUERY_NO_CONFLICT = $.fn[NAME];
11134  var TRANSITION_DURATION = 150;
11135  var CLASS_PREFIX = 'bs-tooltip';
11136  var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
11137  var DefaultType = {
11138    animation: 'boolean',
11139    template: 'string',
11140    title: '(string|element|function)',
11141    trigger: 'string',
11142    delay: '(number|object)',
11143    html: 'boolean',
11144    selector: '(string|boolean)',
11145    placement: '(string|function)',
11146    offset: '(number|string)',
11147    container: '(string|element|boolean)',
11148    fallbackPlacement: '(string|array)',
11149    boundary: '(string|element)'
11150  };
11151  var AttachmentMap = {
11152    AUTO: 'auto',
11153    TOP: 'top',
11154    RIGHT: 'right',
11155    BOTTOM: 'bottom',
11156    LEFT: 'left'
11157  };
11158  var Default = {
11159    animation: true,
11160    template: '<div class="tooltip" role="tooltip">' + '<div class="arrow"></div>' + '<div class="tooltip-inner"></div></div>',
11161    trigger: 'hover focus',
11162    title: '',
11163    delay: 0,
11164    html: false,
11165    selector: false,
11166    placement: 'top',
11167    offset: 0,
11168    container: false,
11169    fallbackPlacement: 'flip',
11170    boundary: 'scrollParent'
11171  };
11172  var HoverState = {
11173    SHOW: 'show',
11174    OUT: 'out'
11175  };
11176  var Event = {
11177    HIDE: "hide" + EVENT_KEY,
11178    HIDDEN: "hidden" + EVENT_KEY,
11179    SHOW: "show" + EVENT_KEY,
11180    SHOWN: "shown" + EVENT_KEY,
11181    INSERTED: "inserted" + EVENT_KEY,
11182    CLICK: "click" + EVENT_KEY,
11183    FOCUSIN: "focusin" + EVENT_KEY,
11184    FOCUSOUT: "focusout" + EVENT_KEY,
11185    MOUSEENTER: "mouseenter" + EVENT_KEY,
11186    MOUSELEAVE: "mouseleave" + EVENT_KEY
11187  };
11188  var ClassName = {
11189    FADE: 'fade',
11190    SHOW: 'show'
11191  };
11192  var Selector = {
11193    TOOLTIP: '.tooltip',
11194    TOOLTIP_INNER: '.tooltip-inner',
11195    ARROW: '.arrow'
11196  };
11197  var Trigger = {
11198    HOVER: 'hover',
11199    FOCUS: 'focus',
11200    CLICK: 'click',
11201    MANUAL: 'manual'
11202    /**
11203     * ------------------------------------------------------------------------
11204     * Class Definition
11205     * ------------------------------------------------------------------------
11206     */
11207
11208  };
11209
11210  var Tooltip =
11211  /*#__PURE__*/
11212  function () {
11213    function Tooltip(element, config) {
11214      /**
11215       * Check for Popper dependency
11216       * Popper - https://popper.js.org
11217       */
11218      if (typeof Popper === 'undefined') {
11219        throw new TypeError('Bootstrap tooltips require Popper.js (https://popper.js.org)');
11220      } // private
11221
11222
11223      this._isEnabled = true;
11224      this._timeout = 0;
11225      this._hoverState = '';
11226      this._activeTrigger = {};
11227      this._popper = null; // Protected
11228
11229      this.element = element;
11230      this.config = this._getConfig(config);
11231      this.tip = null;
11232
11233      this._setListeners();
11234    } // Getters
11235
11236
11237    var _proto = Tooltip.prototype;
11238
11239    // Public
11240    _proto.enable = function enable() {
11241      this._isEnabled = true;
11242    };
11243
11244    _proto.disable = function disable() {
11245      this._isEnabled = false;
11246    };
11247
11248    _proto.toggleEnabled = function toggleEnabled() {
11249      this._isEnabled = !this._isEnabled;
11250    };
11251
11252    _proto.toggle = function toggle(event) {
11253      if (!this._isEnabled) {
11254        return;
11255      }
11256
11257      if (event) {
11258        var dataKey = this.constructor.DATA_KEY;
11259        var context = $(event.currentTarget).data(dataKey);
11260
11261        if (!context) {
11262          context = new this.constructor(event.currentTarget, this._getDelegateConfig());
11263          $(event.currentTarget).data(dataKey, context);
11264        }
11265
11266        context._activeTrigger.click = !context._activeTrigger.click;
11267
11268        if (context._isWithActiveTrigger()) {
11269          context._enter(null, context);
11270        } else {
11271          context._leave(null, context);
11272        }
11273      } else {
11274        if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {
11275          this._leave(null, this);
11276
11277          return;
11278        }
11279
11280        this._enter(null, this);
11281      }
11282    };
11283
11284    _proto.dispose = function dispose() {
11285      clearTimeout(this._timeout);
11286      $.removeData(this.element, this.constructor.DATA_KEY);
11287      $(this.element).off(this.constructor.EVENT_KEY);
11288      $(this.element).closest('.modal').off('hide.bs.modal');
11289
11290      if (this.tip) {
11291        $(this.tip).remove();
11292      }
11293
11294      this._isEnabled = null;
11295      this._timeout = null;
11296      this._hoverState = null;
11297      this._activeTrigger = null;
11298
11299      if (this._popper !== null) {
11300        this._popper.destroy();
11301      }
11302
11303      this._popper = null;
11304      this.element = null;
11305      this.config = null;
11306      this.tip = null;
11307    };
11308
11309    _proto.show = function show() {
11310      var _this = this;
11311
11312      if ($(this.element).css('display') === 'none') {
11313        throw new Error('Please use show on visible elements');
11314      }
11315
11316      var showEvent = $.Event(this.constructor.Event.SHOW);
11317
11318      if (this.isWithContent() && this._isEnabled) {
11319        $(this.element).trigger(showEvent);
11320        var isInTheDom = $.contains(this.element.ownerDocument.documentElement, this.element);
11321
11322        if (showEvent.isDefaultPrevented() || !isInTheDom) {
11323          return;
11324        }
11325
11326        var tip = this.getTipElement();
11327        var tipId = Util.getUID(this.constructor.NAME);
11328        tip.setAttribute('id', tipId);
11329        this.element.setAttribute('aria-describedby', tipId);
11330        this.setContent();
11331
11332        if (this.config.animation) {
11333          $(tip).addClass(ClassName.FADE);
11334        }
11335
11336        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;
11337
11338        var attachment = this._getAttachment(placement);
11339
11340        this.addAttachmentClass(attachment);
11341        var container = this.config.container === false ? document.body : $(this.config.container);
11342        $(tip).data(this.constructor.DATA_KEY, this);
11343
11344        if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {
11345          $(tip).appendTo(container);
11346        }
11347
11348        $(this.element).trigger(this.constructor.Event.INSERTED);
11349        this._popper = new Popper(this.element, tip, {
11350          placement: attachment,
11351          modifiers: {
11352            offset: {
11353              offset: this.config.offset
11354            },
11355            flip: {
11356              behavior: this.config.fallbackPlacement
11357            },
11358            arrow: {
11359              element: Selector.ARROW
11360            },
11361            preventOverflow: {
11362              boundariesElement: this.config.boundary
11363            }
11364          },
11365          onCreate: function onCreate(data) {
11366            if (data.originalPlacement !== data.placement) {
11367              _this._handlePopperPlacementChange(data);
11368            }
11369          },
11370          onUpdate: function onUpdate(data) {
11371            _this._handlePopperPlacementChange(data);
11372          }
11373        });
11374        $(tip).addClass(ClassName.SHOW); // If this is a touch-enabled device we add extra
11375        // empty mouseover listeners to the body's immediate children;
11376        // only needed because of broken event delegation on iOS
11377        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
11378
11379        if ('ontouchstart' in document.documentElement) {
11380          $('body').children().on('mouseover', null, $.noop);
11381        }
11382
11383        var complete = function complete() {
11384          if (_this.config.animation) {
11385            _this._fixTransition();
11386          }
11387
11388          var prevHoverState = _this._hoverState;
11389          _this._hoverState = null;
11390          $(_this.element).trigger(_this.constructor.Event.SHOWN);
11391
11392          if (prevHoverState === HoverState.OUT) {
11393            _this._leave(null, _this);
11394          }
11395        };
11396
11397        if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
11398          $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION);
11399        } else {
11400          complete();
11401        }
11402      }
11403    };
11404
11405    _proto.hide = function hide(callback) {
11406      var _this2 = this;
11407
11408      var tip = this.getTipElement();
11409      var hideEvent = $.Event(this.constructor.Event.HIDE);
11410
11411      var complete = function complete() {
11412        if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {
11413          tip.parentNode.removeChild(tip);
11414        }
11415
11416        _this2._cleanTipClass();
11417
11418        _this2.element.removeAttribute('aria-describedby');
11419
11420        $(_this2.element).trigger(_this2.constructor.Event.HIDDEN);
11421
11422        if (_this2._popper !== null) {
11423          _this2._popper.destroy();
11424        }
11425
11426        if (callback) {
11427          callback();
11428        }
11429      };
11430
11431      $(this.element).trigger(hideEvent);
11432
11433      if (hideEvent.isDefaultPrevented()) {
11434        return;
11435      }
11436
11437      $(tip).removeClass(ClassName.SHOW); // If this is a touch-enabled device we remove the extra
11438      // empty mouseover listeners we added for iOS support
11439
11440      if ('ontouchstart' in document.documentElement) {
11441        $('body').children().off('mouseover', null, $.noop);
11442      }
11443
11444      this._activeTrigger[Trigger.CLICK] = false;
11445      this._activeTrigger[Trigger.FOCUS] = false;
11446      this._activeTrigger[Trigger.HOVER] = false;
11447
11448      if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
11449        $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
11450      } else {
11451        complete();
11452      }
11453
11454      this._hoverState = '';
11455    };
11456
11457    _proto.update = function update() {
11458      if (this._popper !== null) {
11459        this._popper.scheduleUpdate();
11460      }
11461    }; // Protected
11462
11463
11464    _proto.isWithContent = function isWithContent() {
11465      return Boolean(this.getTitle());
11466    };
11467
11468    _proto.addAttachmentClass = function addAttachmentClass(attachment) {
11469      $(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
11470    };
11471
11472    _proto.getTipElement = function getTipElement() {
11473      this.tip = this.tip || $(this.config.template)[0];
11474      return this.tip;
11475    };
11476
11477    _proto.setContent = function setContent() {
11478      var $tip = $(this.getTipElement());
11479      this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());
11480      $tip.removeClass(ClassName.FADE + " " + ClassName.SHOW);
11481    };
11482
11483    _proto.setElementContent = function setElementContent($element, content) {
11484      var html = this.config.html;
11485
11486      if (typeof content === 'object' && (content.nodeType || content.jquery)) {
11487        // Content is a DOM node or a jQuery
11488        if (html) {
11489          if (!$(content).parent().is($element)) {
11490            $element.empty().append(content);
11491          }
11492        } else {
11493          $element.text($(content).text());
11494        }
11495      } else {
11496        $element[html ? 'html' : 'text'](content);
11497      }
11498    };
11499
11500    _proto.getTitle = function getTitle() {
11501      var title = this.element.getAttribute('data-original-title');
11502
11503      if (!title) {
11504        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
11505      }
11506
11507      return title;
11508    }; // Private
11509
11510
11511    _proto._getAttachment = function _getAttachment(placement) {
11512      return AttachmentMap[placement.toUpperCase()];
11513    };
11514
11515    _proto._setListeners = function _setListeners() {
11516      var _this3 = this;
11517
11518      var triggers = this.config.trigger.split(' ');
11519      triggers.forEach(function (trigger) {
11520        if (trigger === 'click') {
11521          $(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, function (event) {
11522            return _this3.toggle(event);
11523          });
11524        } else if (trigger !== Trigger.MANUAL) {
11525          var eventIn = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN;
11526          var eventOut = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT;
11527          $(_this3.element).on(eventIn, _this3.config.selector, function (event) {
11528            return _this3._enter(event);
11529          }).on(eventOut, _this3.config.selector, function (event) {
11530            return _this3._leave(event);
11531          });
11532        }
11533
11534        $(_this3.element).closest('.modal').on('hide.bs.modal', function () {
11535          return _this3.hide();
11536        });
11537      });
11538
11539      if (this.config.selector) {
11540        this.config = _extends({}, this.config, {
11541          trigger: 'manual',
11542          selector: ''
11543        });
11544      } else {
11545        this._fixTitle();
11546      }
11547    };
11548
11549    _proto._fixTitle = function _fixTitle() {
11550      var titleType = typeof this.element.getAttribute('data-original-title');
11551
11552      if (this.element.getAttribute('title') || titleType !== 'string') {
11553        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
11554        this.element.setAttribute('title', '');
11555      }
11556    };
11557
11558    _proto._enter = function _enter(event, context) {
11559      var dataKey = this.constructor.DATA_KEY;
11560      context = context || $(event.currentTarget).data(dataKey);
11561
11562      if (!context) {
11563        context = new this.constructor(event.currentTarget, this._getDelegateConfig());
11564        $(event.currentTarget).data(dataKey, context);
11565      }
11566
11567      if (event) {
11568        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
11569      }
11570
11571      if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {
11572        context._hoverState = HoverState.SHOW;
11573        return;
11574      }
11575
11576      clearTimeout(context._timeout);
11577      context._hoverState = HoverState.SHOW;
11578
11579      if (!context.config.delay || !context.config.delay.show) {
11580        context.show();
11581        return;
11582      }
11583
11584      context._timeout = setTimeout(function () {
11585        if (context._hoverState === HoverState.SHOW) {
11586          context.show();
11587        }
11588      }, context.config.delay.show);
11589    };
11590
11591    _proto._leave = function _leave(event, context) {
11592      var dataKey = this.constructor.DATA_KEY;
11593      context = context || $(event.currentTarget).data(dataKey);
11594
11595      if (!context) {
11596        context = new this.constructor(event.currentTarget, this._getDelegateConfig());
11597        $(event.currentTarget).data(dataKey, context);
11598      }
11599
11600      if (event) {
11601        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
vendor: 8,286 bytes, lines 11602-11889
11602      }
11603
11604      if (context._isWithActiveTrigger()) {
11605        return;
11606      }
11607
11608      clearTimeout(context._timeout);
11609      context._hoverState = HoverState.OUT;
11610
11611      if (!context.config.delay || !context.config.delay.hide) {
11612        context.hide();
11613        return;
11614      }
11615
11616      context._timeout = setTimeout(function () {
11617        if (context._hoverState === HoverState.OUT) {
11618          context.hide();
11619        }
11620      }, context.config.delay.hide);
11621    };
11622
11623    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {
11624      for (var trigger in this._activeTrigger) {
11625        if (this._activeTrigger[trigger]) {
11626          return true;
11627        }
11628      }
11629
11630      return false;
11631    };
11632
11633    _proto._getConfig = function _getConfig(config) {
11634      config = _extends({}, this.constructor.Default, $(this.element).data(), config);
11635
11636      if (typeof config.delay === 'number') {
11637        config.delay = {
11638          show: config.delay,
11639          hide: config.delay
11640        };
11641      }
11642
11643      if (typeof config.title === 'number') {
11644        config.title = config.title.toString();
11645      }
11646
11647      if (typeof config.content === 'number') {
11648        config.content = config.content.toString();
11649      }
11650
11651      Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
11652      return config;
11653    };
11654
11655    _proto._getDelegateConfig = function _getDelegateConfig() {
11656      var config = {};
11657
11658      if (this.config) {
11659        for (var key in this.config) {
11660          if (this.constructor.Default[key] !== this.config[key]) {
11661            config[key] = this.config[key];
11662          }
11663        }
11664      }
11665
11666      return config;
11667    };
11668
11669    _proto._cleanTipClass = function _cleanTipClass() {
11670      var $tip = $(this.getTipElement());
11671      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);
11672
11673      if (tabClass !== null && tabClass.length > 0) {
11674        $tip.removeClass(tabClass.join(''));
11675      }
11676    };
11677
11678    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(data) {
11679      this._cleanTipClass();
11680
11681      this.addAttachmentClass(this._getAttachment(data.placement));
11682    };
11683
11684    _proto._fixTransition = function _fixTransition() {
11685      var tip = this.getTipElement();
11686      var initConfigAnimation = this.config.animation;
11687
11688      if (tip.getAttribute('x-placement') !== null) {
11689        return;
11690      }
11691
11692      $(tip).removeClass(ClassName.FADE);
11693      this.config.animation = false;
11694      this.hide();
11695      this.show();
11696      this.config.animation = initConfigAnimation;
11697    }; // Static
11698
11699
11700    Tooltip._jQueryInterface = function _jQueryInterface(config) {
11701      return this.each(function () {
11702        var data = $(this).data(DATA_KEY);
11703
11704        var _config = typeof config === 'object' && config;
11705
11706        if (!data && /dispose|hide/.test(config)) {
11707          return;
11708        }
11709
11710        if (!data) {
11711          data = new Tooltip(this, _config);
11712          $(this).data(DATA_KEY, data);
11713        }
11714
11715        if (typeof config === 'string') {
11716          if (typeof data[config] === 'undefined') {
11717            throw new TypeError("No method named \"" + config + "\"");
11718          }
11719
11720          data[config]();
11721        }
11722      });
11723    };
11724
11725    _createClass(Tooltip, null, [{
11726      key: "VERSION",
11727      get: function get() {
11728        return VERSION;
11729      }
11730    }, {
11731      key: "Default",
11732      get: function get() {
11733        return Default;
11734      }
11735    }, {
11736      key: "NAME",
11737      get: function get() {
11738        return NAME;
11739      }
11740    }, {
11741      key: "DATA_KEY",
11742      get: function get() {
11743        return DATA_KEY;
11744      }
11745    }, {
11746      key: "Event",
11747      get: function get() {
11748        return Event;
11749      }
11750    }, {
11751      key: "EVENT_KEY",
11752      get: function get() {
11753        return EVENT_KEY;
11754      }
11755    }, {
11756      key: "DefaultType",
11757      get: function get() {
11758        return DefaultType;
11759      }
11760    }]);
11761
11762    return Tooltip;
11763  }();
11764  /**
11765   * ------------------------------------------------------------------------
11766   * jQuery
11767   * ------------------------------------------------------------------------
11768   */
11769
11770
11771  $.fn[NAME] = Tooltip._jQueryInterface;
11772  $.fn[NAME].Constructor = Tooltip;
11773
11774  $.fn[NAME].noConflict = function () {
11775    $.fn[NAME] = JQUERY_NO_CONFLICT;
11776    return Tooltip._jQueryInterface;
11777  };
11778
11779  return Tooltip;
11780}($, Popper);
11781//# sourceMappingURL=tooltip.js.map
11782function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
11783
11784function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
11785
11786function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
11787
11788/**
11789 * --------------------------------------------------------------------------
11790 * Bootstrap (v4.0.0): dropdown.js
11791 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
11792 * --------------------------------------------------------------------------
11793 */
11794var Dropdown = function ($) {
11795  /**
11796   * ------------------------------------------------------------------------
11797   * Constants
11798   * ------------------------------------------------------------------------
11799   */
11800  var NAME = 'dropdown';
11801  var VERSION = '4.0.0';
11802  var DATA_KEY = 'bs.dropdown';
11803  var EVENT_KEY = "." + DATA_KEY;
11804  var DATA_API_KEY = '.data-api';
11805  var JQUERY_NO_CONFLICT = $.fn[NAME];
11806  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
11807
11808  var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
11809
11810  var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key
11811
11812  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
11813
11814  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
11815
11816  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
11817
11818  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE);
11819  var Event = {
11820    HIDE: "hide" + EVENT_KEY,
11821    HIDDEN: "hidden" + EVENT_KEY,
11822    SHOW: "show" + EVENT_KEY,
11823    SHOWN: "shown" + EVENT_KEY,
11824    CLICK: "click" + EVENT_KEY,
11825    CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY,
11826    KEYDOWN_DATA_API: "keydown" + EVENT_KEY + DATA_API_KEY,
11827    KEYUP_DATA_API: "keyup" + EVENT_KEY + DATA_API_KEY
11828  };
11829  var ClassName = {
11830    DISABLED: 'disabled',
11831    SHOW: 'show',
11832    DROPUP: 'dropup',
11833    DROPRIGHT: 'dropright',
11834    DROPLEFT: 'dropleft',
11835    MENURIGHT: 'dropdown-menu-right',
11836    MENULEFT: 'dropdown-menu-left',
11837    POSITION_STATIC: 'position-static'
11838  };
11839  var Selector = {
11840    DATA_TOGGLE: '[data-toggle="dropdown"]',
11841    FORM_CHILD: '.dropdown form',
11842    MENU: '.dropdown-menu',
11843    NAVBAR_NAV: '.navbar-nav',
11844    VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled)'
11845  };
11846  var AttachmentMap = {
11847    TOP: 'top-start',
11848    TOPEND: 'top-end',
11849    BOTTOM: 'bottom-start',
11850    BOTTOMEND: 'bottom-end',
11851    RIGHT: 'right-start',
11852    RIGHTEND: 'right-end',
11853    LEFT: 'left-start',
11854    LEFTEND: 'left-end'
11855  };
11856  var Default = {
11857    offset: 0,
11858    flip: true,
11859    boundary: 'scrollParent'
11860  };
11861  var DefaultType = {
11862    offset: '(number|string|function)',
11863    flip: 'boolean',
11864    boundary: '(string|element)'
11865    /**
11866     * ------------------------------------------------------------------------
11867     * Class Definition
11868     * ------------------------------------------------------------------------
11869     */
11870
11871  };
11872
11873  var Dropdown =
11874  /*#__PURE__*/
11875  function () {
11876    function Dropdown(element, config) {
11877      this._element = element;
11878      this._popper = null;
11879      this._config = this._getConfig(config);
11880      this._menu = this._getMenuElement();
11881      this._inNavbar = this._detectNavbar();
11882
11883      this._addEventListeners();
11884    } // Getters
11885
11886
11887    var _proto = Dropdown.prototype;
11888
11889    // Public
11890    _proto.toggle = function toggle() {
11891      if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {
11892        return;
11893      }
11894
11895      var parent = Dropdown._getParentFromElement(this._element);
11896
11897      var isActive = $(this._menu).hasClass(ClassName.SHOW);
11898
11899      Dropdown._clearMenus();
11900
11901      if (isActive) {
11902        return;
11903      }
11904
11905      var relatedTarget = {
11906        relatedTarget: this._element
11907      };
11908      var showEvent = $.Event(Event.SHOW, relatedTarget);
11909      $(parent).trigger(showEvent);
11910
11911      if (showEvent.isDefaultPrevented()) {
11912        return;
11913      } // Disable totally Popper.js for Dropdown in Navbar
11914
11915
11916      if (!this._inNavbar) {
11917        /**
11918         * Check for Popper dependency
11919         * Popper - https://popper.js.org
11920         */
11921        if (typeof Popper === 'undefined') {
11922          throw new TypeError('Bootstrap dropdown require Popper.js (https://popper.js.org)');
11923        }
11924
11925        var element = this._element; // For dropup with alignment we use the parent as popper container
11926
11927        if ($(parent).hasClass(ClassName.DROPUP)) {
11928          if ($(this._menu).hasClass(ClassName.MENULEFT) || $(this._menu).hasClass(ClassName.MENURIGHT)) {
11929            element = parent;
11930          }
11931        } // If boundary is not `scrollParent`, then set position to `static`
11932        // to allow the menu to "escape" the scroll parent's boundaries
11933        // https://github.com/twbs/bootstrap/issues/24251
11934
11935
11936        if (this._config.boundary !== 'scrollParent') {
11937          $(parent).addClass(ClassName.POSITION_STATIC);
11938        }
11939
11940        this._popper = new Popper(element, this._menu, this._getPopperConfig());
11941      } // If this is a touch-enabled device we add extra
11942      // empty mouseover listeners to the body's immediate children;
11943      // only needed because of broken event delegation on iOS
11944      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
11945
11946
11947      if ('ontouchstart' in document.documentElement && $(parent).closest(Selector.NAVBAR_NAV).length === 0) {
11948        $('body').children().on('mouseover', null, $.noop);
11949      }
11950
11951      this._element.focus();
11952
11953      this._element.setAttribute('aria-expanded', true);
11954
11955      $(this._menu).toggleClass(ClassName.SHOW);
11956      $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.SHOWN, relatedTarget));
11957    };
11958
11959    _proto.dispose = function dispose() {
11960      $.removeData(this._element, DATA_KEY);
11961      $(this._element).off(EVENT_KEY);
11962      this._element = null;
11963      this._menu = null;
11964
11965      if (this._popper !== null) {
11966        this._popper.destroy();
11967
11968        this._popper = null;
11969      }
11970    };
11971
11972    _proto.update = function update() {
11973      this._inNavbar = this._detectNavbar();
11974
11975      if (this._popper !== null) {
11976        this._popper.scheduleUpdate();
11977      }
11978    }; // Private
11979
11980
11981    _proto._addEventListeners = function _addEventListeners() {
11982      var _this = this;
11983
11984      $(this._element).on(Event.CLICK, function (event) {
11985        event.preventDefault();
11986        event.stopPropagation();
11987
11988        _this.toggle();
11989      });
11990    };
11991
11992    _proto._getConfig = function _getConfig(config) {
11993      config = _extends({}, this.constructor.Default, $(this._element).data(), config);
11994      Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
11995      return config;
11996    };
11997
11998    _proto._getMenuElement = function _getMenuElement() {
11999      if (!this._menu) {
12000        var parent = Dropdown._getParentFromElement(this._element);
12001
12002        this._menu = $(parent).find(Selector.MENU)[0];
12003      }
12004
12005      return this._menu;
12006    };
12007
12008    _proto._getPlacement = function _getPlacement() {
12009      var $parentDropdown = $(this._element).parent();
12010      var placement = AttachmentMap.BOTTOM; // Handle dropup
12011
12012      if ($parentDropdown.hasClass(ClassName.DROPUP)) {
12013        placement = AttachmentMap.TOP;
12014
12015        if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
12016          placement = AttachmentMap.TOPEND;
12017        }
12018      } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {
12019        placement = AttachmentMap.RIGHT;
12020      } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {
12021        placement = AttachmentMap.LEFT;
12022      } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
12023        placement = AttachmentMap.BOTTOMEND;
12024      }
12025
12026      return placement;
12027    };
12028
12029    _proto._detectNavbar = function _detectNavbar() {
12030      return $(this._element).closest('.navbar').length > 0;
12031    };
12032
12033    _proto._getPopperConfig = function _getPopperConfig() {
12034      var _this2 = this;
12035
12036      var offsetConf = {};
12037
12038      if (typeof this._config.offset === 'function') {
12039        offsetConf.fn = function (data) {
12040          data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets) || {});
12041          return data;
12042        };
12043      } else {
12044        offsetConf.offset = this._config.offset;
12045      }
12046
12047      var popperConfig = {
12048        placement: this._getPlacement(),
12049        modifiers: {
12050          offset: offsetConf,
12051          flip: {
12052            enabled: this._config.flip
12053          },
12054          preventOverflow: {
12055            boundariesElement: this._config.boundary
12056          }
12057        }
12058      };
12059      return popperConfig;
12060    }; // Static
12061
12062
12063    Dropdown._jQueryInterface = function _jQueryInterface(config) {
12064      return this.each(function () {
12065        var data = $(this).data(DATA_KEY);
12066
12067        var _config = typeof config === 'object' ? config : null;
12068
12069        if (!data) {
12070          data = new Dropdown(this, _config);
12071          $(this).data(DATA_KEY, data);
12072        }
12073
12074        if (typeof config === 'string') {
12075          if (typeof data[config] === 'undefined') {
12076            throw new TypeError("No method named \"" + config + "\"");
12077          }
12078
12079          data[config]();
12080        }
12081      });
12082    };
12083
12084    Dropdown._clearMenus = function _clearMenus(event) {
12085      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
12086        return;
12087      }
12088
12089      var toggles = $.makeArray($(Selector.DATA_TOGGLE));
12090
12091      for (var i = 0; i < toggles.length; i++) {
12092        var parent = Dropdown._getParentFromElement(toggles[i]);
12093
12094        var context = $(toggles[i]).data(DATA_KEY);
12095        var relatedTarget = {
12096          relatedTarget: toggles[i]
12097        };
12098
12099        if (!context) {
12100          continue;
12101        }
12102
12103        var dropdownMenu = context._menu;
12104
12105        if (!$(parent).hasClass(ClassName.SHOW)) {
12106          continue;
12107        }
12108
12109        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {
12110          continue;
12111        }
12112
12113        var hideEvent = $.Event(Event.HIDE, relatedTarget);
12114        $(parent).trigger(hideEvent);
12115
12116        if (hideEvent.isDefaultPrevented()) {
12117          continue;
12118        } // If this is a touch-enabled device we remove the extra
12119        // empty mouseover listeners we added for iOS support
12120
12121
12122        if ('ontouchstart' in document.documentElement) {
12123          $('body').children().off('mouseover', null, $.noop);
12124        }
12125
12126        toggles[i].setAttribute('aria-expanded', 'false');
12127        $(dropdownMenu).removeClass(ClassName.SHOW);
12128        $(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
12129      }
12130    };
12131
12132    Dropdown._getParentFromElement = function _getParentFromElement(element) {
12133      var parent;
12134      var selector = Util.getSelectorFromElement(element);
12135
12136      if (selector) {
12137        parent = $(selector)[0];
12138      }
12139
12140      return parent || element.parentNode;
12141    }; // eslint-disable-next-line complexity
12142
12143
12144    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
12145      // If not input/textarea:
12146      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command
12147      // If input/textarea:
12148      //  - If space key => not a dropdown command
12149      //  - If key is other than escape
12150      //    - If key is not up or down => not a dropdown command
12151      //    - If trigger inside the menu => not a dropdown command
12152      if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
12153        return;
12154      }
12155
12156      event.preventDefault();
12157      event.stopPropagation();
12158
12159      if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
12160        return;
12161      }
12162
12163      var parent = Dropdown._getParentFromElement(this);
12164
12165      var isActive = $(parent).hasClass(ClassName.SHOW);
12166
12167      if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
12168        if (event.which === ESCAPE_KEYCODE) {
12169          var toggle = $(parent).find(Selector.DATA_TOGGLE)[0];
12170          $(toggle).trigger('focus');
12171        }
12172
12173        $(this).trigger('click');
12174        return;
12175      }
12176
12177      var items = $(parent).find(Selector.VISIBLE_ITEMS).get();
12178
12179      if (items.length === 0) {
12180        return;
12181      }
12182
12183      var index = items.indexOf(event.target);
12184
12185      if (event.which === ARROW_UP_KEYCODE && index > 0) {
12186        // Up
12187        index--;
12188      }
12189
12190      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
12191        // Down
12192        index++;
12193      }
12194
12195      if (index < 0) {
12196        index = 0;
12197      }
12198
12199      items[index].focus();
12200    };
12201
12202    _createClass(Dropdown, null, [{
12203      key: "VERSION",
12204      get: function get() {
12205        return VERSION;
12206      }
12207    }, {
12208      key: "Default",
12209      get: function get() {
12210        return Default;
12211      }
12212    }, {
12213      key: "DefaultType",
12214      get: function get() {
12215        return DefaultType;
12216      }
12217    }]);
12218
12219    return Dropdown;
12220  }();
12221  /**
12222   * ------------------------------------------------------------------------
12223   * Data Api implementation
12224   * ------------------------------------------------------------------------
12225   */
12226
12227
12228  $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + " " + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
12229    event.preventDefault();
12230    event.stopPropagation();
12231
12232    Dropdown._jQueryInterface.call($(this), 'toggle');
12233  }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
12234    e.stopPropagation();
12235  });
12236  /**
12237   * ------------------------------------------------------------------------
12238   * jQuery
12239   * ------------------------------------------------------------------------
12240   */
12241
12242  $.fn[NAME] = Dropdown._jQueryInterface;
12243  $.fn[NAME].Constructor = Dropdown;
12244
12245  $.fn[NAME].noConflict = function () {
12246    $.fn[NAME] = JQUERY_NO_CONFLICT;
12247    return Dropdown._jQueryInterface;
12248  };
12249
12250  return Dropdown;
12251}($, Popper);
12252//# sourceMappingURL=dropdown.js.map
12253function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
12254
12255function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
12256
12257function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
12258
12259/**
12260 * --------------------------------------------------------------------------
12261 * Bootstrap (v4.0.0): modal.js
12262 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
12263 * --------------------------------------------------------------------------
12264 */
12265var Modal = function ($) {
12266  /**
12267   * ------------------------------------------------------------------------
12268   * Constants
12269   * ------------------------------------------------------------------------
12270   */
12271  var NAME = 'modal';
12272  var VERSION = '4.0.0';
12273  var DATA_KEY = 'bs.modal';
12274  var EVENT_KEY = "." + DATA_KEY;
12275  var DATA_API_KEY = '.data-api';
12276  var JQUERY_NO_CONFLICT = $.fn[NAME];
12277  var TRANSITION_DURATION = 300;
12278  var BACKDROP_TRANSITION_DURATION = 150;
12279  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
12280
12281  var Default = {
12282    backdrop: true,
12283    keyboard: true,
12284    focus: true,
12285    show: true
12286  };
12287  var DefaultType = {
12288    backdrop: '(boolean|string)',
12289    keyboard: 'boolean',
12290    focus: 'boolean',
12291    show: 'boolean'
12292  };
12293  var Event = {
12294    HIDE: "hide" + EVENT_KEY,
12295    HIDDEN: "hidden" + EVENT_KEY,
12296    SHOW: "show" + EVENT_KEY,
12297    SHOWN: "shown" + EVENT_KEY,
12298    FOCUSIN: "focusin" + EVENT_KEY,
12299    RESIZE: "resize" + EVENT_KEY,
12300    CLICK_DISMISS: "click.dismiss" + EVENT_KEY,
12301    KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY,
12302    MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY,
12303    MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY,
12304    CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
12305  };
12306  var ClassName = {
12307    SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
12308    BACKDROP: 'modal-backdrop',
12309    OPEN: 'modal-open',
12310    FADE: 'fade',
12311    SHOW: 'show'
12312  };
12313  var Selector = {
12314    DIALOG: '.modal-dialog',
12315    DATA_TOGGLE: '[data-toggle="modal"]',
12316    DATA_DISMISS: '[data-dismiss="modal"]',
12317    FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
12318    STICKY_CONTENT: '.sticky-top',
12319    NAVBAR_TOGGLER: '.navbar-toggler'
12320    /**
12321     * ------------------------------------------------------------------------
12322     * Class Definition
12323     * ------------------------------------------------------------------------
12324     */
12325
12326  };
12327
12328  var Modal =
12329  /*#__PURE__*/
12330  function () {
12331    function Modal(element, config) {
12332      this._config = this._getConfig(config);
12333      this._element = element;
12334      this._dialog = $(element).find(Selector.DIALOG)[0];
12335      this._backdrop = null;
12336      this._isShown = false;
12337      this._isBodyOverflowing = false;
12338      this._ignoreBackdropClick = false;
12339      this._originalBodyPadding = 0;
12340      this._scrollbarWidth = 0;
12341    } // Getters
12342
12343
12344    var _proto = Modal.prototype;
12345
12346    // Public
12347    _proto.toggle = function toggle(relatedTarget) {
12348      return this._isShown ? this.hide() : this.show(relatedTarget);
12349    };
12350
12351    _proto.show = function show(relatedTarget) {
12352      var _this = this;
12353
12354      if (this._isTransitioning || this._isShown) {
12355        return;
12356      }
12357
12358      if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
12359        this._isTransitioning = true;
12360      }
12361
12362      var showEvent = $.Event(Event.SHOW, {
12363        relatedTarget: relatedTarget
12364      });
12365      $(this._element).trigger(showEvent);
12366
12367      if (this._isShown || showEvent.isDefaultPrevented()) {
12368        return;
12369      }
12370
12371      this._isShown = true;
12372
12373      this._checkScrollbar();
12374
12375      this._setScrollbar();
12376
12377      this._adjustDialog();
12378
12379      $(document.body).addClass(ClassName.OPEN);
12380
12381      this._setEscapeEvent();
12382
12383      this._setResizeEvent();
12384
12385      $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {
12386        return _this.hide(event);
12387      });
12388      $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
12389        $(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
12390          if ($(event.target).is(_this._element)) {
12391            _this._ignoreBackdropClick = true;
12392          }
12393        });
12394      });
12395
12396      this._showBackdrop(function () {
12397        return _this._showElement(relatedTarget);
12398      });
12399    };
12400
12401    _proto.hide = function hide(event) {
12402      var _this2 = this;
12403
12404      if (event) {
12405        event.preventDefault();
12406      }
12407
12408      if (this._isTransitioning || !this._isShown) {
12409        return;
12410      }
12411
12412      var hideEvent = $.Event(Event.HIDE);
12413      $(this._element).trigger(hideEvent);
12414
12415      if (!this._isShown || hideEvent.isDefaultPrevented()) {
12416        return;
12417      }
12418
12419      this._isShown = false;
12420      var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
12421
12422      if (transition) {
12423        this._isTransitioning = true;
12424      }
12425
12426      this._setEscapeEvent();
12427
12428      this._setResizeEvent();
12429
12430      $(document).off(Event.FOCUSIN);
12431      $(this._element).removeClass(ClassName.SHOW);
12432      $(this._element).off(Event.CLICK_DISMISS);
12433      $(this._dialog).off(Event.MOUSEDOWN_DISMISS);
12434
12435      if (transition) {
12436        $(this._element).one(Util.TRANSITION_END, function (event) {
12437          return _this2._hideModal(event);
12438        }).emulateTransitionEnd(TRANSITION_DURATION);
12439      } else {
12440        this._hideModal();
12441      }
12442    };
12443
12444    _proto.dispose = function dispose() {
12445      $.removeData(this._element, DATA_KEY);
12446      $(window, document, this._element, this._backdrop).off(EVENT_KEY);
12447      this._config = null;
12448      this._element = null;
12449      this._dialog = null;
12450      this._backdrop = null;
12451      this._isShown = null;
12452      this._isBodyOverflowing = null;
12453      this._ignoreBackdropClick = null;
12454      this._scrollbarWidth = null;
12455    };
12456
12457    _proto.handleUpdate = function handleUpdate() {
12458      this._adjustDialog();
12459    }; // Private
12460
12461
12462    _proto._getConfig = function _getConfig(config) {
12463      config = _extends({}, Default, config);
12464      Util.typeCheckConfig(NAME, config, DefaultType);
12465      return config;
12466    };
12467
12468    _proto._showElement = function _showElement(relatedTarget) {
12469      var _this3 = this;
12470
12471      var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
12472
12473      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
12474        // Don't move modal's DOM position
12475        document.body.appendChild(this._element);
12476      }
12477
12478      this._element.style.display = 'block';
12479
12480      this._element.removeAttribute('aria-hidden');
12481
12482      this._element.scrollTop = 0;
12483
12484      if (transition) {
12485        Util.reflow(this._element);
12486      }
12487
12488      $(this._element).addClass(ClassName.SHOW);
12489
12490      if (this._config.focus) {
12491        this._enforceFocus();
12492      }
12493
12494      var shownEvent = $.Event(Event.SHOWN, {
12495        relatedTarget: relatedTarget
12496      });
12497
12498      var transitionComplete = function transitionComplete() {
12499        if (_this3._config.focus) {
12500          _this3._element.focus();
12501        }
12502
12503        _this3._isTransitioning = false;
12504        $(_this3._element).trigger(shownEvent);
12505      };
12506
12507      if (transition) {
12508        $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION);
12509      } else {
12510        transitionComplete();
12511      }
12512    };
12513
12514    _proto._enforceFocus = function _enforceFocus() {
12515      var _this4 = this;
12516
12517      $(document).off(Event.FOCUSIN) // Guard against infinite focus loop
12518      .on(Event.FOCUSIN, function (event) {
12519        if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {
12520          _this4._element.focus();
12521        }
12522      });
12523    };
12524
12525    _proto._setEscapeEvent = function _setEscapeEvent() {
12526      var _this5 = this;
12527
12528      if (this._isShown && this._config.keyboard) {
12529        $(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
12530          if (event.which === ESCAPE_KEYCODE) {
12531            event.preventDefault();
12532
12533            _this5.hide();
12534          }
12535        });
12536      } else if (!this._isShown) {
12537        $(this._element).off(Event.KEYDOWN_DISMISS);
12538      }
12539    };
12540
12541    _proto._setResizeEvent = function _setResizeEvent() {
12542      var _this6 = this;
12543
12544      if (this._isShown) {
12545        $(window).on(Event.RESIZE, function (event) {
12546          return _this6.handleUpdate(event);
12547        });
12548      } else {
12549        $(window).off(Event.RESIZE);
12550      }
12551    };
12552
12553    _proto._hideModal = function _hideModal() {
12554      var _this7 = this;
12555
12556      this._element.style.display = 'none';
12557
12558      this._element.setAttribute('aria-hidden', true);
12559
12560      this._isTransitioning = false;
12561
12562      this._showBackdrop(function () {
12563        $(document.body).removeClass(ClassName.OPEN);
12564
12565        _this7._resetAdjustments();
12566
12567        _this7._resetScrollbar();
12568
12569        $(_this7._element).trigger(Event.HIDDEN);
12570      });
12571    };
12572
12573    _proto._removeBackdrop = function _removeBackdrop() {
12574      if (this._backdrop) {
12575        $(this._backdrop).remove();
12576        this._backdrop = null;
12577      }
12578    };
12579
12580    _proto._showBackdrop = function _showBackdrop(callback) {
12581      var _this8 = this;
12582
12583      var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
12584
12585      if (this._isShown && this._config.backdrop) {
12586        var doAnimate = Util.supportsTransitionEnd() && animate;
12587        this._backdrop = document.createElement('div');
12588        this._backdrop.className = ClassName.BACKDROP;
12589
12590        if (animate) {
12591          $(this._backdrop).addClass(animate);
12592        }
12593
12594        $(this._backdrop).appendTo(document.body);
12595        $(this._element).on(Event.CLICK_DISMISS, function (event) {
12596          if (_this8._ignoreBackdropClick) {
12597            _this8._ignoreBackdropClick = false;
12598            return;
12599          }
12600
12601          if (event.target !== event.currentTarget) {
12602            return;
12603          }
12604
12605          if (_this8._config.backdrop === 'static') {
12606            _this8._element.focus();
12607          } else {
12608            _this8.hide();
12609          }
12610        });
12611
12612        if (doAnimate) {
12613          Util.reflow(this._backdrop);
12614        }
12615
12616        $(this._backdrop).addClass(ClassName.SHOW);
12617
12618        if (!callback) {
12619          return;
12620        }
12621
12622        if (!doAnimate) {
12623          callback();
12624          return;
12625        }
12626
12627        $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
12628      } else if (!this._isShown && this._backdrop) {
12629        $(this._backdrop).removeClass(ClassName.SHOW);
12630
12631        var callbackRemove = function callbackRemove() {
12632          _this8._removeBackdrop();
12633
12634          if (callback) {
12635            callback();
12636          }
12637        };
12638
12639        if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
12640          $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
12641        } else {
12642          callbackRemove();
12643        }
12644      } else if (callback) {
12645        callback();
12646      }
12647    }; // ----------------------------------------------------------------------
12648    // the following methods are used to handle overflowing modals
12649    // todo (fat): these should probably be refactored out of modal.js
12650    // ----------------------------------------------------------------------
12651
12652
12653    _proto._adjustDialog = function _adjustDialog() {
12654      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
12655
12656      if (!this._isBodyOverflowing && isModalOverflowing) {
12657        this._element.style.paddingLeft = this._scrollbarWidth + "px";
12658      }
12659
12660      if (this._isBodyOverflowing && !isModalOverflowing) {
12661        this._element.style.paddingRight = this._scrollbarWidth + "px";
12662      }
12663    };
12664
12665    _proto._resetAdjustments = function _resetAdjustments() {
12666      this._element.style.paddingLeft = '';
12667      this._element.style.paddingRight = '';
12668    };
12669
12670    _proto._checkScrollbar = function _checkScrollbar() {
12671      var rect = document.body.getBoundingClientRect();
12672      this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;
12673      this._scrollbarWidth = this._getScrollbarWidth();
12674    };
12675
12676    _proto._setScrollbar = function _setScrollbar() {
12677      var _this9 = this;
12678
12679      if (this._isBodyOverflowing) {
12680        // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
12681        //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
12682        // Adjust fixed content padding
12683        $(Selector.FIXED_CONTENT).each(function (index, element) {
12684          var actualPadding = $(element)[0].style.paddingRight;
12685          var calculatedPadding = $(element).css('padding-right');
12686          $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + "px");
12687        }); // Adjust sticky content margin
12688
12689        $(Selector.STICKY_CONTENT).each(function (index, element) {
12690          var actualMargin = $(element)[0].style.marginRight;
12691          var calculatedMargin = $(element).css('margin-right');
12692          $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + "px");
12693        }); // Adjust navbar-toggler margin
12694
12695        $(Selector.NAVBAR_TOGGLER).each(function (index, element) {
12696          var actualMargin = $(element)[0].style.marginRight;
12697          var calculatedMargin = $(element).css('margin-right');
12698          $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) + _this9._scrollbarWidth + "px");
12699        }); // Adjust body padding
12700
12701        var actualPadding = document.body.style.paddingRight;
12702        var calculatedPadding = $('body').css('padding-right');
12703        $('body').data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
12704      }
12705    };
12706
12707    _proto._resetScrollbar = function _resetScrollbar() {
12708      // Restore fixed content padding
12709      $(Selector.FIXED_CONTENT).each(function (index, element) {
12710        var padding = $(element).data('padding-right');
12711
12712        if (typeof padding !== 'undefined') {
12713          $(element).css('padding-right', padding).removeData('padding-right');
12714        }
12715      }); // Restore sticky content and navbar-toggler margin
12716
12717      $(Selector.STICKY_CONTENT + ", " + Selector.NAVBAR_TOGGLER).each(function (index, element) {
12718        var margin = $(element).data('margin-right');
12719
12720        if (typeof margin !== 'undefined') {
12721          $(element).css('margin-right', margin).removeData('margin-right');
12722        }
12723      }); // Restore body padding
12724
12725      var padding = $('body').data('padding-right');
12726
12727      if (typeof padding !== 'undefined') {
12728        $('body').css('padding-right', padding).removeData('padding-right');
12729      }
12730    };
12731
12732    _proto._getScrollbarWidth = function _getScrollbarWidth() {
12733      // thx d.walsh
12734      var scrollDiv = document.createElement('div');
12735      scrollDiv.className = ClassName.SCROLLBAR_MEASURER;
12736      document.body.appendChild(scrollDiv);
12737      var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
12738      document.body.removeChild(scrollDiv);
12739      return scrollbarWidth;
12740    }; // Static
12741
12742
12743    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
12744      return this.each(function () {
12745        var data = $(this).data(DATA_KEY);
12746
12747        var _config = _extends({}, Modal.Default, $(this).data(), typeof config === 'object' && config);
12748
12749        if (!data) {
12750          data = new Modal(this, _config);
12751          $(this).data(DATA_KEY, data);
12752        }
12753
12754        if (typeof config === 'string') {
12755          if (typeof data[config] === 'undefined') {
12756            throw new TypeError("No method named \"" + config + "\"");
12757          }
12758
12759          data[config](relatedTarget);
12760        } else if (_config.show) {
12761          data.show(relatedTarget);
12762        }
12763      });
12764    };
12765
12766    _createClass(Modal, null, [{
12767      key: "VERSION",
12768      get: function get() {
12769        return VERSION;
12770      }
12771    }, {
12772      key: "Default",
12773      get: function get() {
12774        return Default;
12775      }
12776    }]);
12777
12778    return Modal;
12779  }();
12780  /**
12781   * ------------------------------------------------------------------------
12782   * Data Api implementation
12783   * ------------------------------------------------------------------------
12784   */
12785
12786
12787  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
12788    var _this10 = this;
12789
12790    var target;
12791    var selector = Util.getSelectorFromElement(this);
12792
12793    if (selector) {
12794      target = $(selector)[0];
12795    }
12796
12797    var config = $(target).data(DATA_KEY) ? 'toggle' : _extends({}, $(target).data(), $(this).data());
12798
12799    if (this.tagName === 'A' || this.tagName === 'AREA') {
12800      event.preventDefault();
12801    }
12802
12803    var $target = $(target).one(Event.SHOW, function (showEvent) {
12804      if (showEvent.isDefaultPrevented()) {
12805        // Only register focus restorer if modal will actually get shown
12806        return;
12807      }
12808
12809      $target.one(Event.HIDDEN, function () {
12810        if ($(_this10).is(':visible')) {
12811          _this10.focus();
12812        }
12813      });
12814    });
12815
12816    Modal._jQueryInterface.call($(target), config, this);
12817  });
12818  /**
12819   * ------------------------------------------------------------------------
12820   * jQuery
12821   * ------------------------------------------------------------------------
12822   */
12823
12824  $.fn[NAME] = Modal._jQueryInterface;
12825  $.fn[NAME].Constructor = Modal;
12826
12827  $.fn[NAME].noConflict = function () {
12828    $.fn[NAME] = JQUERY_NO_CONFLICT;
12829    return Modal._jQueryInterface;
12830  };
12831
12832  return Modal;
12833}($);
12834//# sourceMappingURL=modal.js.map
12835//! moment.js
12836
12837;(function (global, factory) {
12838    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
12839    typeof define === 'function' && define.amd ? define(factory) :
12840    global.moment = factory()
vendor: 56,293 bytes, lines 12840-14600
12840
12841}(this, (function () { 'use strict';
12842
12843    var hookCallback;
12844
12845    function hooks () {
12846        return hookCallback.apply(null, arguments);
12847    }
12848
12849    // This is done to register the method called with moment()
12850    // without creating circular dependencies.
12851    function setHookCallback (callback) {
12852        hookCallback = callback;
12853    }
12854
12855    function isArray(input) {
12856        return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
12857    }
12858
12859    function isObject(input) {
12860        // IE8 will treat undefined and null as object if it wasn't for
12861        // input != null
12862        return input != null && Object.prototype.toString.call(input) === '[object Object]';
12863    }
12864
12865    function isObjectEmpty(obj) {
12866        if (Object.getOwnPropertyNames) {
12867            return (Object.getOwnPropertyNames(obj).length === 0);
12868        } else {
12869            var k;
12870            for (k in obj) {
12871                if (obj.hasOwnProperty(k)) {
12872                    return false;
12873                }
12874            }
12875            return true;
12876        }
12877    }
12878
12879    function isUndefined(input) {
12880        return input === void 0;
12881    }
12882
12883    function isNumber(input) {
12884        return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';
12885    }
12886
12887    function isDate(input) {
12888        return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
12889    }
12890
12891    function map(arr, fn) {
12892        var res = [], i;
12893        for (i = 0; i < arr.length; ++i) {
12894            res.push(fn(arr[i], i));
12895        }
12896        return res;
12897    }
12898
12899    function hasOwnProp(a, b) {
12900        return Object.prototype.hasOwnProperty.call(a, b);
12901    }
12902
12903    function extend(a, b) {
12904        for (var i in b) {
12905            if (hasOwnProp(b, i)) {
12906                a[i] = b[i];
12907            }
12908        }
12909
12910        if (hasOwnProp(b, 'toString')) {
12911            a.toString = b.toString;
12912        }
12913
12914        if (hasOwnProp(b, 'valueOf')) {
12915            a.valueOf = b.valueOf;
12916        }
12917
12918        return a;
12919    }
12920
12921    function createUTC (input, format, locale, strict) {
12922        return createLocalOrUTC(input, format, locale, strict, true).utc();
12923    }
12924
12925    function defaultParsingFlags() {
12926        // We need to deep clone this object.
12927        return {
12928            empty           : false,
12929            unusedTokens    : [],
12930            unusedInput     : [],
12931            overflow        : -2,
12932            charsLeftOver   : 0,
12933            nullInput       : false,
12934            invalidMonth    : null,
12935            invalidFormat   : false,
12936            userInvalidated : false,
12937            iso             : false,
12938            parsedDateParts : [],
12939            meridiem        : null,
12940            rfc2822         : false,
12941            weekdayMismatch : false
12942        };
12943    }
12944
12945    function getParsingFlags(m) {
12946        if (m._pf == null) {
12947            m._pf = defaultParsingFlags();
12948        }
12949        return m._pf;
12950    }
12951
12952    var some;
12953    if (Array.prototype.some) {
12954        some = Array.prototype.some;
12955    } else {
12956        some = function (fun) {
12957            var t = Object(this);
12958            var len = t.length >>> 0;
12959
12960            for (var i = 0; i < len; i++) {
12961                if (i in t && fun.call(this, t[i], i, t)) {
12962                    return true;
12963                }
12964            }
12965
12966            return false;
12967        };
12968    }
12969
12970    function isValid(m) {
12971        if (m._isValid == null) {
12972            var flags = getParsingFlags(m);
12973            var parsedParts = some.call(flags.parsedDateParts, function (i) {
12974                return i != null;
12975            });
12976            var isNowValid = !isNaN(m._d.getTime()) &&
12977                flags.overflow < 0 &&
12978                !flags.empty &&
12979                !flags.invalidMonth &&
12980                !flags.invalidWeekday &&
12981                !flags.weekdayMismatch &&
12982                !flags.nullInput &&
12983                !flags.invalidFormat &&
12984                !flags.userInvalidated &&
12985                (!flags.meridiem || (flags.meridiem && parsedParts));
12986
12987            if (m._strict) {
12988                isNowValid = isNowValid &&
12989                    flags.charsLeftOver === 0 &&
12990                    flags.unusedTokens.length === 0 &&
12991                    flags.bigHour === undefined;
12992            }
12993
12994            if (Object.isFrozen == null || !Object.isFrozen(m)) {
12995                m._isValid = isNowValid;
12996            }
12997            else {
12998                return isNowValid;
12999            }
13000        }
13001        return m._isValid;
13002    }
13003
13004    function createInvalid (flags) {
13005        var m = createUTC(NaN);
13006        if (flags != null) {
13007            extend(getParsingFlags(m), flags);
13008        }
13009        else {
13010            getParsingFlags(m).userInvalidated = true;
13011        }
13012
13013        return m;
13014    }
13015
13016    // Plugins that add properties should also add the key here (null value),
13017    // so we can properly clone ourselves.
13018    var momentProperties = hooks.momentProperties = [];
13019
13020    function copyConfig(to, from) {
13021        var i, prop, val;
13022
13023        if (!isUndefined(from._isAMomentObject)) {
13024            to._isAMomentObject = from._isAMomentObject;
13025        }
13026        if (!isUndefined(from._i)) {
13027            to._i = from._i;
13028        }
13029        if (!isUndefined(from._f)) {
13030            to._f = from._f;
13031        }
13032        if (!isUndefined(from._l)) {
13033            to._l = from._l;
13034        }
13035        if (!isUndefined(from._strict)) {
13036            to._strict = from._strict;
13037        }
13038        if (!isUndefined(from._tzm)) {
13039            to._tzm = from._tzm;
13040        }
13041        if (!isUndefined(from._isUTC)) {
13042            to._isUTC = from._isUTC;
13043        }
13044        if (!isUndefined(from._offset)) {
13045            to._offset = from._offset;
13046        }
13047        if (!isUndefined(from._pf)) {
13048            to._pf = getParsingFlags(from);
13049        }
13050        if (!isUndefined(from._locale)) {
13051            to._locale = from._locale;
13052        }
13053
13054        if (momentProperties.length > 0) {
13055            for (i = 0; i < momentProperties.length; i++) {
13056                prop = momentProperties[i];
13057                val = from[prop];
13058                if (!isUndefined(val)) {
13059                    to[prop] = val;
13060                }
13061            }
13062        }
13063
13064        return to;
13065    }
13066
13067    var updateInProgress = false;
13068
13069    // Moment prototype object
13070    function Moment(config) {
13071        copyConfig(this, config);
13072        this._d = new Date(config._d != null ? config._d.getTime() : NaN);
13073        if (!this.isValid()) {
13074            this._d = new Date(NaN);
13075        }
13076        // Prevent infinite loop in case updateOffset creates new moment
13077        // objects.
13078        if (updateInProgress === false) {
13079            updateInProgress = true;
13080            hooks.updateOffset(this);
13081            updateInProgress = false;
13082        }
13083    }
13084
13085    function isMoment (obj) {
13086        return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
13087    }
13088
13089    function absFloor (number) {
13090        if (number < 0) {
13091            // -0 -> 0
13092            return Math.ceil(number) || 0;
13093        } else {
13094            return Math.floor(number);
13095        }
13096    }
13097
13098    function toInt(argumentForCoercion) {
13099        var coercedNumber = +argumentForCoercion,
13100            value = 0;
13101
13102        if (coercedNumber !== 0 && isFinite(coercedNumber)) {
13103            value = absFloor(coercedNumber);
13104        }
13105
13106        return value;
13107    }
13108
13109    // compare two arrays, return the number of differences
13110    function compareArrays(array1, array2, dontConvert) {
13111        var len = Math.min(array1.length, array2.length),
13112            lengthDiff = Math.abs(array1.length - array2.length),
13113            diffs = 0,
13114            i;
13115        for (i = 0; i < len; i++) {
13116            if ((dontConvert && array1[i] !== array2[i]) ||
13117                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
13118                diffs++;
13119            }
13120        }
13121        return diffs + lengthDiff;
13122    }
13123
13124    function warn(msg) {
13125        if (hooks.suppressDeprecationWarnings === false &&
13126                (typeof console !==  'undefined') && console.warn) {
13127            console.warn('Deprecation warning: ' + msg);
13128        }
13129    }
13130
13131    function deprecate(msg, fn) {
13132        var firstTime = true;
13133
13134        return extend(function () {
13135            if (hooks.deprecationHandler != null) {
13136                hooks.deprecationHandler(null, msg);
13137            }
13138            if (firstTime) {
13139                var args = [];
13140                var arg;
13141                for (var i = 0; i < arguments.length; i++) {
13142                    arg = '';
13143                    if (typeof arguments[i] === 'object') {
13144                        arg += '\n[' + i + '] ';
13145                        for (var key in arguments[0]) {
13146                            arg += key + ': ' + arguments[0][key] + ', ';
13147                        }
13148                        arg = arg.slice(0, -2); // Remove trailing comma and space
13149                    } else {
13150                        arg = arguments[i];
13151                    }
13152                    args.push(arg);
13153                }
13154                warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack);
13155                firstTime = false;
13156            }
13157            return fn.apply(this, arguments);
13158        }, fn);
13159    }
13160
13161    var deprecations = {};
13162
13163    function deprecateSimple(name, msg) {
13164        if (hooks.deprecationHandler != null) {
13165            hooks.deprecationHandler(name, msg);
13166        }
13167        if (!deprecations[name]) {
13168            warn(msg);
13169            deprecations[name] = true;
13170        }
13171    }
13172
13173    hooks.suppressDeprecationWarnings = false;
13174    hooks.deprecationHandler = null;
13175
13176    function isFunction(input) {
13177        return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
13178    }
13179
13180    function set (config) {
13181        var prop, i;
13182        for (i in config) {
13183            prop = config[i];
13184            if (isFunction(prop)) {
13185                this[i] = prop;
13186            } else {
13187                this['_' + i] = prop;
13188            }
13189        }
13190        this._config = config;
13191        // Lenient ordinal parsing accepts just a number in addition to
13192        // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.
13193        // TODO: Remove "ordinalParse" fallback in next major release.
13194        this._dayOfMonthOrdinalParseLenient = new RegExp(
13195            (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +
13196                '|' + (/\d{1,2}/).source);
13197    }
13198
13199    function mergeConfigs(parentConfig, childConfig) {
13200        var res = extend({}, parentConfig), prop;
13201        for (prop in childConfig) {
13202            if (hasOwnProp(childConfig, prop)) {
13203                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
13204                    res[prop] = {};
13205                    extend(res[prop], parentConfig[prop]);
13206                    extend(res[prop], childConfig[prop]);
13207                } else if (childConfig[prop] != null) {
13208                    res[prop] = childConfig[prop];
13209                } else {
13210                    delete res[prop];
13211                }
13212            }
13213        }
13214        for (prop in parentConfig) {
13215            if (hasOwnProp(parentConfig, prop) &&
13216                    !hasOwnProp(childConfig, prop) &&
13217                    isObject(parentConfig[prop])) {
13218                // make sure changes to properties don't modify parent config
13219                res[prop] = extend({}, res[prop]);
13220            }
13221        }
13222        return res;
13223    }
13224
13225    function Locale(config) {
13226        if (config != null) {
13227            this.set(config);
13228        }
13229    }
13230
13231    var keys;
13232
13233    if (Object.keys) {
13234        keys = Object.keys;
13235    } else {
13236        keys = function (obj) {
13237            var i, res = [];
13238            for (i in obj) {
13239                if (hasOwnProp(obj, i)) {
13240                    res.push(i);
13241                }
13242            }
13243            return res;
13244        };
13245    }
13246
13247    var defaultCalendar = {
13248        sameDay : '[Today at] LT',
13249        nextDay : '[Tomorrow at] LT',
13250        nextWeek : 'dddd [at] LT',
13251        lastDay : '[Yesterday at] LT',
13252        lastWeek : '[Last] dddd [at] LT',
13253        sameElse : 'L'
13254    };
13255
13256    function calendar (key, mom, now) {
13257        var output = this._calendar[key] || this._calendar['sameElse'];
13258        return isFunction(output) ? output.call(mom, now) : output;
13259    }
13260
13261    var defaultLongDateFormat = {
13262        LTS  : 'h:mm:ss A',
13263        LT   : 'h:mm A',
13264        L    : 'MM/DD/YYYY',
13265        LL   : 'MMMM D, YYYY',
13266        LLL  : 'MMMM D, YYYY h:mm A',
13267        LLLL : 'dddd, MMMM D, YYYY h:mm A'
13268    };
13269
13270    function longDateFormat (key) {
13271        var format = this._longDateFormat[key],
13272            formatUpper = this._longDateFormat[key.toUpperCase()];
13273
13274        if (format || !formatUpper) {
13275            return format;
13276        }
13277
13278        this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {
13279            return val.slice(1);
13280        });
13281
13282        return this._longDateFormat[key];
13283    }
13284
13285    var defaultInvalidDate = 'Invalid date';
13286
13287    function invalidDate () {
13288        return this._invalidDate;
13289    }
13290
13291    var defaultOrdinal = '%d';
13292    var defaultDayOfMonthOrdinalParse = /\d{1,2}/;
13293
13294    function ordinal (number) {
13295        return this._ordinal.replace('%d', number);
13296    }
13297
13298    var defaultRelativeTime = {
13299        future : 'in %s',
13300        past   : '%s ago',
13301        s  : 'a few seconds',
13302        ss : '%d seconds',
13303        m  : 'a minute',
13304        mm : '%d minutes',
13305        h  : 'an hour',
13306        hh : '%d hours',
13307        d  : 'a day',
13308        dd : '%d days',
13309        M  : 'a month',
13310        MM : '%d months',
13311        y  : 'a year',
13312        yy : '%d years'
13313    };
13314
13315    function relativeTime (number, withoutSuffix, string, isFuture) {
13316        var output = this._relativeTime[string];
13317        return (isFunction(output)) ?
13318            output(number, withoutSuffix, string, isFuture) :
13319            output.replace(/%d/i, number);
13320    }
13321
13322    function pastFuture (diff, output) {
13323        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
13324        return isFunction(format) ? format(output) : format.replace(/%s/i, output);
13325    }
13326
13327    var aliases = {};
13328
13329    function addUnitAlias (unit, shorthand) {
13330        var lowerCase = unit.toLowerCase();
13331        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
13332    }
13333
13334    function normalizeUnits(units) {
13335        return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
13336    }
13337
13338    function normalizeObjectUnits(inputObject) {
13339        var normalizedInput = {},
13340            normalizedProp,
13341            prop;
13342
13343        for (prop in inputObject) {
13344            if (hasOwnProp(inputObject, prop)) {
13345                normalizedProp = normalizeUnits(prop);
13346                if (normalizedProp) {
13347                    normalizedInput[normalizedProp] = inputObject[prop];
13348                }
13349            }
13350        }
13351
13352        return normalizedInput;
13353    }
13354
13355    var priorities = {};
13356
13357    function addUnitPriority(unit, priority) {
13358        priorities[unit] = priority;
13359    }
13360
13361    function getPrioritizedUnits(unitsObj) {
13362        var units = [];
13363        for (var u in unitsObj) {
13364            units.push({unit: u, priority: priorities[u]});
13365        }
13366        units.sort(function (a, b) {
13367            return a.priority - b.priority;
13368        });
13369        return units;
13370    }
13371
13372    function zeroFill(number, targetLength, forceSign) {
13373        var absNumber = '' + Math.abs(number),
13374            zerosToFill = targetLength - absNumber.length,
13375            sign = number >= 0;
13376        return (sign ? (forceSign ? '+' : '') : '-') +
13377            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
13378    }
13379
13380    var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;
13381
13382    var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;
13383
13384    var formatFunctions = {};
13385
13386    var formatTokenFunctions = {};
13387
13388    // token:    'M'
13389    // padded:   ['MM', 2]
13390    // ordinal:  'Mo'
13391    // callback: function () { this.month() + 1 }
13392    function addFormatToken (token, padded, ordinal, callback) {
13393        var func = callback;
13394        if (typeof callback === 'string') {
13395            func = function () {
13396                return this[callback]();
13397            };
13398        }
13399        if (token) {
13400            formatTokenFunctions[token] = func;
13401        }
13402        if (padded) {
13403            formatTokenFunctions[padded[0]] = function () {
13404                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
13405            };
13406        }
13407        if (ordinal) {
13408            formatTokenFunctions[ordinal] = function () {
13409                return this.localeData().ordinal(func.apply(this, arguments), token);
13410            };
13411        }
13412    }
13413
13414    function removeFormattingTokens(input) {
13415        if (input.match(/\[[\s\S]/)) {
13416            return input.replace(/^\[|\]$/g, '');
13417        }
13418        return input.replace(/\\/g, '');
13419    }
13420
13421    function makeFormatFunction(format) {
13422        var array = format.match(formattingTokens), i, length;
13423
13424        for (i = 0, length = array.length; i < length; i++) {
13425            if (formatTokenFunctions[array[i]]) {
13426                array[i] = formatTokenFunctions[array[i]];
13427            } else {
13428                array[i] = removeFormattingTokens(array[i]);
13429            }
13430        }
13431
13432        return function (mom) {
13433            var output = '', i;
13434            for (i = 0; i < length; i++) {
13435                output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];
13436            }
13437            return output;
13438        };
13439    }
13440
13441    // format date using native date object
13442    function formatMoment(m, format) {
13443        if (!m.isValid()) {
13444            return m.localeData().invalidDate();
13445        }
13446
13447        format = expandFormat(format, m.localeData());
13448        formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);
13449
13450        return formatFunctions[format](m);
13451    }
13452
13453    function expandFormat(format, locale) {
13454        var i = 5;
13455
13456        function replaceLongDateFormatTokens(input) {
13457            return locale.longDateFormat(input) || input;
13458        }
13459
13460        localFormattingTokens.lastIndex = 0;
13461        while (i >= 0 && localFormattingTokens.test(format)) {
13462            format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
13463            localFormattingTokens.lastIndex = 0;
13464            i -= 1;
13465        }
13466
13467        return format;
13468    }
13469
13470    var match1         = /\d/;            //       0 - 9
13471    var match2         = /\d\d/;          //      00 - 99
13472    var match3         = /\d{3}/;         //     000 - 999
13473    var match4         = /\d{4}/;         //    0000 - 9999
13474    var match6         = /[+-]?\d{6}/;    // -999999 - 999999
13475    var match1to2      = /\d\d?/;         //       0 - 99
13476    var match3to4      = /\d\d\d\d?/;     //     999 - 9999
13477    var match5to6      = /\d\d\d\d\d\d?/; //   99999 - 999999
13478    var match1to3      = /\d{1,3}/;       //       0 - 999
13479    var match1to4      = /\d{1,4}/;       //       0 - 9999
13480    var match1to6      = /[+-]?\d{1,6}/;  // -999999 - 999999
13481
13482    var matchUnsigned  = /\d+/;           //       0 - inf
13483    var matchSigned    = /[+-]?\d+/;      //    -inf - inf
13484
13485    var matchOffset    = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
13486    var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z
13487
13488    var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123
13489
13490    // any word (or two) characters or numbers including two/three word month in arabic.
13491    // includes scottish gaelic two word and hyphenated months
13492    var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i;
13493
13494    var regexes = {};
13495
13496    function addRegexToken (token, regex, strictRegex) {
13497        regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {
13498            return (isStrict && strictRegex) ? strictRegex : regex;
13499        };
13500    }
13501
13502    function getParseRegexForToken (token, config) {
13503        if (!hasOwnProp(regexes, token)) {
13504            return new RegExp(unescapeFormat(token));
13505        }
13506
13507        return regexes[token](config._strict, config._locale);
13508    }
13509
13510    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
13511    function unescapeFormat(s) {
13512        return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
13513            return p1 || p2 || p3 || p4;
13514        }));
13515    }
13516
13517    function regexEscape(s) {
13518        return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
13519    }
13520
13521    var tokens = {};
13522
13523    function addParseToken (token, callback) {
13524        var i, func = callback;
13525        if (typeof token === 'string') {
13526            token = [token];
13527        }
13528        if (isNumber(callback)) {
13529            func = function (input, array) {
13530                array[callback] = toInt(input);
13531            };
13532        }
13533        for (i = 0; i < token.length; i++) {
13534            tokens[token[i]] = func;
13535        }
13536    }
13537
13538    function addWeekParseToken (token, callback) {
13539        addParseToken(token, function (input, array, config, token) {
13540            config._w = config._w || {};
13541            callback(input, config._w, config, token);
13542        });
13543    }
13544
13545    function addTimeToArrayFromToken(token, input, config) {
13546        if (input != null && hasOwnProp(tokens, token)) {
13547            tokens[token](input, config._a, config, token);
13548        }
13549    }
13550
13551    var YEAR = 0;
13552    var MONTH = 1;
13553    var DATE = 2;
13554    var HOUR = 3;
13555    var MINUTE = 4;
13556    var SECOND = 5;
13557    var MILLISECOND = 6;
13558    var WEEK = 7;
13559    var WEEKDAY = 8;
13560
13561    // FORMATTING
13562
13563    addFormatToken('Y', 0, 0, function () {
13564        var y = this.year();
13565        return y <= 9999 ? '' + y : '+' + y;
13566    });
13567
13568    addFormatToken(0, ['YY', 2], 0, function () {
13569        return this.year() % 100;
13570    });
13571
13572    addFormatToken(0, ['YYYY',   4],       0, 'year');
13573    addFormatToken(0, ['YYYYY',  5],       0, 'year');
13574    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
13575
13576    // ALIASES
13577
13578    addUnitAlias('year', 'y');
13579
13580    // PRIORITIES
13581
13582    addUnitPriority('year', 1);
13583
13584    // PARSING
13585
13586    addRegexToken('Y',      matchSigned);
13587    addRegexToken('YY',     match1to2, match2);
13588    addRegexToken('YYYY',   match1to4, match4);
13589    addRegexToken('YYYYY',  match1to6, match6);
13590    addRegexToken('YYYYYY', match1to6, match6);
13591
13592    addParseToken(['YYYYY', 'YYYYYY'], YEAR);
13593    addParseToken('YYYY', function (input, array) {
13594        array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
13595    });
13596    addParseToken('YY', function (input, array) {
13597        array[YEAR] = hooks.parseTwoDigitYear(input);
13598    });
13599    addParseToken('Y', function (input, array) {
13600        array[YEAR] = parseInt(input, 10);
13601    });
13602
13603    // HELPERS
13604
13605    function daysInYear(year) {
13606        return isLeapYear(year) ? 366 : 365;
13607    }
13608
13609    function isLeapYear(year) {
13610        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
13611    }
13612
13613    // HOOKS
13614
13615    hooks.parseTwoDigitYear = function (input) {
13616        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
13617    };
13618
13619    // MOMENTS
13620
13621    var getSetYear = makeGetSet('FullYear', true);
13622
13623    function getIsLeapYear () {
13624        return isLeapYear(this.year());
13625    }
13626
13627    function makeGetSet (unit, keepTime) {
13628        return function (value) {
13629            if (value != null) {
13630                set$1(this, unit, value);
13631                hooks.updateOffset(this, keepTime);
13632                return this;
13633            } else {
13634                return get(this, unit);
13635            }
13636        };
13637    }
13638
13639    function get (mom, unit) {
13640        return mom.isValid() ?
13641            mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;
13642    }
13643
13644    function set$1 (mom, unit, value) {
13645        if (mom.isValid() && !isNaN(value)) {
13646            if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {
13647                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));
13648            }
13649            else {
13650                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
13651            }
13652        }
13653    }
13654
13655    // MOMENTS
13656
13657    function stringGet (units) {
13658        units = normalizeUnits(units);
13659        if (isFunction(this[units])) {
13660            return this[units]();
13661        }
13662        return this;
13663    }
13664
13665
13666    function stringSet (units, value) {
13667        if (typeof units === 'object') {
13668            units = normalizeObjectUnits(units);
13669            var prioritized = getPrioritizedUnits(units);
13670            for (var i = 0; i < prioritized.length; i++) {
13671                this[prioritized[i].unit](units[prioritized[i].unit]);
13672            }
13673        } else {
13674            units = normalizeUnits(units);
13675            if (isFunction(this[units])) {
13676                return this[units](value);
13677            }
13678        }
13679        return this;
13680    }
13681
13682    function mod(n, x) {
13683        return ((n % x) + x) % x;
13684    }
13685
13686    var indexOf;
13687
13688    if (Array.prototype.indexOf) {
13689        indexOf = Array.prototype.indexOf;
13690    } else {
13691        indexOf = function (o) {
13692            // I know
13693            var i;
13694            for (i = 0; i < this.length; ++i) {
13695                if (this[i] === o) {
13696                    return i;
13697                }
13698            }
13699            return -1;
13700        };
13701    }
13702
13703    function daysInMonth(year, month) {
13704        if (isNaN(year) || isNaN(month)) {
13705            return NaN;
13706        }
13707        var modMonth = mod(month, 12);
13708        year += (month - modMonth) / 12;
13709        return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);
13710    }
13711
13712    // FORMATTING
13713
13714    addFormatToken('M', ['MM', 2], 'Mo', function () {
13715        return this.month() + 1;
13716    });
13717
13718    addFormatToken('MMM', 0, 0, function (format) {
13719        return this.localeData().monthsShort(this, format);
13720    });
13721
13722    addFormatToken('MMMM', 0, 0, function (format) {
13723        return this.localeData().months(this, format);
13724    });
13725
13726    // ALIASES
13727
13728    addUnitAlias('month', 'M');
13729
13730    // PRIORITY
13731
13732    addUnitPriority('month', 8);
13733
13734    // PARSING
13735
13736    addRegexToken('M',    match1to2);
13737    addRegexToken('MM',   match1to2, match2);
13738    addRegexToken('MMM',  function (isStrict, locale) {
13739        return locale.monthsShortRegex(isStrict);
13740    });
13741    addRegexToken('MMMM', function (isStrict, locale) {
13742        return locale.monthsRegex(isStrict);
13743    });
13744
13745    addParseToken(['M', 'MM'], function (input, array) {
13746        array[MONTH] = toInt(input) - 1;
13747    });
13748
13749    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
13750        var month = config._locale.monthsParse(input, token, config._strict);
13751        // if we didn't find a month name, mark the date as invalid.
13752        if (month != null) {
13753            array[MONTH] = month;
13754        } else {
13755            getParsingFlags(config).invalidMonth = input;
13756        }
13757    });
13758
13759    // LOCALES
13760
13761    var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/;
13762    var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
13763    function localeMonths (m, format) {
13764        if (!m) {
13765            return isArray(this._months) ? this._months :
13766                this._months['standalone'];
13767        }
13768        return isArray(this._months) ? this._months[m.month()] :
13769            this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];
13770    }
13771
13772    var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
13773    function localeMonthsShort (m, format) {
13774        if (!m) {
13775            return isArray(this._monthsShort) ? this._monthsShort :
13776                this._monthsShort['standalone'];
13777        }
13778        return isArray(this._monthsShort) ? this._monthsShort[m.month()] :
13779            this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];
13780    }
13781
13782    function handleStrictParse(monthName, format, strict) {
13783        var i, ii, mom, llc = monthName.toLocaleLowerCase();
13784        if (!this._monthsParse) {
13785            // this is not used
13786            this._monthsParse = [];
13787            this._longMonthsParse = [];
13788            this._shortMonthsParse = [];
13789            for (i = 0; i < 12; ++i) {
13790                mom = createUTC([2000, i]);
13791                this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();
13792                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
13793            }
13794        }
13795
13796        if (strict) {
13797            if (format === 'MMM') {
13798                ii = indexOf.call(this._shortMonthsParse, llc);
13799                return ii !== -1 ? ii : null;
13800            } else {
13801                ii = indexOf.call(this._longMonthsParse, llc);
13802                return ii !== -1 ? ii : null;
13803            }
13804        } else {
13805            if (format === 'MMM') {
13806                ii = indexOf.call(this._shortMonthsParse, llc);
13807                if (ii !== -1) {
13808                    return ii;
13809                }
13810                ii = indexOf.call(this._longMonthsParse, llc);
13811                return ii !== -1 ? ii : null;
13812            } else {
13813                ii = indexOf.call(this._longMonthsParse, llc);
13814                if (ii !== -1) {
13815                    return ii;
13816                }
13817                ii = indexOf.call(this._shortMonthsParse, llc);
13818                return ii !== -1 ? ii : null;
13819            }
13820        }
13821    }
13822
13823    function localeMonthsParse (monthName, format, strict) {
13824        var i, mom, regex;
13825
13826        if (this._monthsParseExact) {
13827            return handleStrictParse.call(this, monthName, format, strict);
13828        }
13829
13830        if (!this._monthsParse) {
13831            this._monthsParse = [];
13832            this._longMonthsParse = [];
13833            this._shortMonthsParse = [];
13834        }
13835
13836        // TODO: add sorting
13837        // Sorting makes sure if one month (or abbr) is a prefix of another
13838        // see sorting in computeMonthsParse
13839        for (i = 0; i < 12; i++) {
13840            // make the regex if we don't have it already
13841            mom = createUTC([2000, i]);
13842            if (strict && !this._longMonthsParse[i]) {
13843                this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
13844                this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
13845            }
13846            if (!strict && !this._monthsParse[i]) {
13847                regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
13848                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
13849            }
13850            // test the regex
13851            if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
13852                return i;
13853            } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
13854                return i;
13855            } else if (!strict && this._monthsParse[i].test(monthName)) {
13856                return i;
13857            }
13858        }
13859    }
13860
13861    // MOMENTS
13862
13863    function setMonth (mom, value) {
13864        var dayOfMonth;
13865
13866        if (!mom.isValid()) {
13867            // No op
13868            return mom;
13869        }
13870
13871        if (typeof value === 'string') {
13872            if (/^\d+$/.test(value)) {
13873                value = toInt(value);
13874            } else {
13875                value = mom.localeData().monthsParse(value);
13876                // TODO: Another silent failure?
13877                if (!isNumber(value)) {
13878                    return mom;
13879                }
13880            }
13881        }
13882
13883        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
13884        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
13885        return mom;
13886    }
13887
13888    function getSetMonth (value) {
13889        if (value != null) {
13890            setMonth(this, value);
13891            hooks.updateOffset(this, true);
13892            return this;
13893        } else {
13894            return get(this, 'Month');
13895        }
13896    }
13897
13898    function getDaysInMonth () {
13899        return daysInMonth(this.year(), this.month());
13900    }
13901
13902    var defaultMonthsShortRegex = matchWord;
13903    function monthsShortRegex (isStrict) {
13904        if (this._monthsParseExact) {
13905            if (!hasOwnProp(this, '_monthsRegex')) {
13906                computeMonthsParse.call(this);
13907            }
13908            if (isStrict) {
13909                return this._monthsShortStrictRegex;
13910            } else {
13911                return this._monthsShortRegex;
13912            }
13913        } else {
13914            if (!hasOwnProp(this, '_monthsShortRegex')) {
13915                this._monthsShortRegex = defaultMonthsShortRegex;
13916            }
13917            return this._monthsShortStrictRegex && isStrict ?
13918                this._monthsShortStrictRegex : this._monthsShortRegex;
13919        }
13920    }
13921
13922    var defaultMonthsRegex = matchWord;
13923    function monthsRegex (isStrict) {
13924        if (this._monthsParseExact) {
13925            if (!hasOwnProp(this, '_monthsRegex')) {
13926                computeMonthsParse.call(this);
13927            }
13928            if (isStrict) {
13929                return this._monthsStrictRegex;
13930            } else {
13931                return this._monthsRegex;
13932            }
13933        } else {
13934            if (!hasOwnProp(this, '_monthsRegex')) {
13935                this._monthsRegex = defaultMonthsRegex;
13936            }
13937            return this._monthsStrictRegex && isStrict ?
13938                this._monthsStrictRegex : this._monthsRegex;
13939        }
13940    }
13941
13942    function computeMonthsParse () {
13943        function cmpLenRev(a, b) {
13944            return b.length - a.length;
13945        }
13946
13947        var shortPieces = [], longPieces = [], mixedPieces = [],
13948            i, mom;
13949        for (i = 0; i < 12; i++) {
13950            // make the regex if we don't have it already
13951            mom = createUTC([2000, i]);
13952            shortPieces.push(this.monthsShort(mom, ''));
13953            longPieces.push(this.months(mom, ''));
13954            mixedPieces.push(this.months(mom, ''));
13955            mixedPieces.push(this.monthsShort(mom, ''));
13956        }
13957        // Sorting makes sure if one month (or abbr) is a prefix of another it
13958        // will match the longer piece.
13959        shortPieces.sort(cmpLenRev);
13960        longPieces.sort(cmpLenRev);
13961        mixedPieces.sort(cmpLenRev);
13962        for (i = 0; i < 12; i++) {
13963            shortPieces[i] = regexEscape(shortPieces[i]);
13964            longPieces[i] = regexEscape(longPieces[i]);
13965        }
13966        for (i = 0; i < 24; i++) {
13967            mixedPieces[i] = regexEscape(mixedPieces[i]);
13968        }
13969
13970        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
13971        this._monthsShortRegex = this._monthsRegex;
13972        this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
13973        this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
13974    }
13975
13976    function createDate (y, m, d, h, M, s, ms) {
13977        // can't just apply() to create a date:
13978        // https://stackoverflow.com/q/181348
13979        var date;
13980        // the date constructor remaps years 0-99 to 1900-1999
13981        if (y < 100 && y >= 0) {
13982            // preserve leap years using a full 400 year cycle, then reset
13983            date = new Date(y + 400, m, d, h, M, s, ms);
13984            if (isFinite(date.getFullYear())) {
13985                date.setFullYear(y);
13986            }
13987        } else {
13988            date = new Date(y, m, d, h, M, s, ms);
13989        }
13990
13991        return date;
13992    }
13993
13994    function createUTCDate (y) {
13995        var date;
13996        // the Date.UTC function remaps years 0-99 to 1900-1999
13997        if (y < 100 && y >= 0) {
13998            var args = Array.prototype.slice.call(arguments);
13999            // preserve leap years using a full 400 year cycle, then reset
14000            args[0] = y + 400;
14001            date = new Date(Date.UTC.apply(null, args));
14002            if (isFinite(date.getUTCFullYear())) {
14003                date.setUTCFullYear(y);
14004            }
14005        } else {
14006            date = new Date(Date.UTC.apply(null, arguments));
14007        }
14008
14009        return date;
14010    }
14011
14012    // start-of-first-week - start-of-year
14013    function firstWeekOffset(year, dow, doy) {
14014        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
14015            fwd = 7 + dow - doy,
14016            // first-week day local weekday -- which local weekday is fwd
14017            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
14018
14019        return -fwdlw + fwd - 1;
14020    }
14021
14022    // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
14023    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
14024        var localWeekday = (7 + weekday - dow) % 7,
14025            weekOffset = firstWeekOffset(year, dow, doy),
14026            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
14027            resYear, resDayOfYear;
14028
14029        if (dayOfYear <= 0) {
14030            resYear = year - 1;
14031            resDayOfYear = daysInYear(resYear) + dayOfYear;
14032        } else if (dayOfYear > daysInYear(year)) {
14033            resYear = year + 1;
14034            resDayOfYear = dayOfYear - daysInYear(year);
14035        } else {
14036            resYear = year;
14037            resDayOfYear = dayOfYear;
14038        }
14039
14040        return {
14041            year: resYear,
14042            dayOfYear: resDayOfYear
14043        };
14044    }
14045
14046    function weekOfYear(mom, dow, doy) {
14047        var weekOffset = firstWeekOffset(mom.year(), dow, doy),
14048            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
14049            resWeek, resYear;
14050
14051        if (week < 1) {
14052            resYear = mom.year() - 1;
14053            resWeek = week + weeksInYear(resYear, dow, doy);
14054        } else if (week > weeksInYear(mom.year(), dow, doy)) {
14055            resWeek = week - weeksInYear(mom.year(), dow, doy);
14056            resYear = mom.year() + 1;
14057        } else {
14058            resYear = mom.year();
14059            resWeek = week;
14060        }
14061
14062        return {
14063            week: resWeek,
14064            year: resYear
14065        };
14066    }
14067
14068    function weeksInYear(year, dow, doy) {
14069        var weekOffset = firstWeekOffset(year, dow, doy),
14070            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
14071        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
14072    }
14073
14074    // FORMATTING
14075
14076    addFormatToken('w', ['ww', 2], 'wo', 'week');
14077    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
14078
14079    // ALIASES
14080
14081    addUnitAlias('week', 'w');
14082    addUnitAlias('isoWeek', 'W');
14083
14084    // PRIORITIES
14085
14086    addUnitPriority('week', 5);
14087    addUnitPriority('isoWeek', 5);
14088
14089    // PARSING
14090
14091    addRegexToken('w',  match1to2);
14092    addRegexToken('ww', match1to2, match2);
14093    addRegexToken('W',  match1to2);
14094    addRegexToken('WW', match1to2, match2);
14095
14096    addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
14097        week[token.substr(0, 1)] = toInt(input);
14098    });
14099
14100    // HELPERS
14101
14102    // LOCALES
14103
14104    function localeWeek (mom) {
14105        return weekOfYear(mom, this._week.dow, this._week.doy).week;
14106    }
14107
14108    var defaultLocaleWeek = {
14109        dow : 0, // Sunday is the first day of the week.
14110        doy : 6  // The week that contains Jan 6th is the first week of the year.
14111    };
14112
14113    function localeFirstDayOfWeek () {
14114        return this._week.dow;
14115    }
14116
14117    function localeFirstDayOfYear () {
14118        return this._week.doy;
14119    }
14120
14121    // MOMENTS
14122
14123    function getSetWeek (input) {
14124        var week = this.localeData().week(this);
14125        return input == null ? week : this.add((input - week) * 7, 'd');
14126    }
14127
14128    function getSetISOWeek (input) {
14129        var week = weekOfYear(this, 1, 4).week;
14130        return input == null ? week : this.add((input - week) * 7, 'd');
14131    }
14132
14133    // FORMATTING
14134
14135    addFormatToken('d', 0, 'do', 'day');
14136
14137    addFormatToken('dd', 0, 0, function (format) {
14138        return this.localeData().weekdaysMin(this, format);
14139    });
14140
14141    addFormatToken('ddd', 0, 0, function (format) {
14142        return this.localeData().weekdaysShort(this, format);
14143    });
14144
14145    addFormatToken('dddd', 0, 0, function (format) {
14146        return this.localeData().weekdays(this, format);
14147    });
14148
14149    addFormatToken('e', 0, 0, 'weekday');
14150    addFormatToken('E', 0, 0, 'isoWeekday');
14151
14152    // ALIASES
14153
14154    addUnitAlias('day', 'd');
14155    addUnitAlias('weekday', 'e');
14156    addUnitAlias('isoWeekday', 'E');
14157
14158    // PRIORITY
14159    addUnitPriority('day', 11);
14160    addUnitPriority('weekday', 11);
14161    addUnitPriority('isoWeekday', 11);
14162
14163    // PARSING
14164
14165    addRegexToken('d',    match1to2);
14166    addRegexToken('e',    match1to2);
14167    addRegexToken('E',    match1to2);
14168    addRegexToken('dd',   function (isStrict, locale) {
14169        return locale.weekdaysMinRegex(isStrict);
14170    });
14171    addRegexToken('ddd',   function (isStrict, locale) {
14172        return locale.weekdaysShortRegex(isStrict);
14173    });
14174    addRegexToken('dddd',   function (isStrict, locale) {
14175        return locale.weekdaysRegex(isStrict);
14176    });
14177
14178    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
14179        var weekday = config._locale.weekdaysParse(input, token, config._strict);
14180        // if we didn't get a weekday name, mark the date as invalid
14181        if (weekday != null) {
14182            week.d = weekday;
14183        } else {
14184            getParsingFlags(config).invalidWeekday = input;
14185        }
14186    });
14187
14188    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
14189        week[token] = toInt(input);
14190    });
14191
14192    // HELPERS
14193
14194    function parseWeekday(input, locale) {
14195        if (typeof input !== 'string') {
14196            return input;
14197        }
14198
14199        if (!isNaN(input)) {
14200            return parseInt(input, 10);
14201        }
14202
14203        input = locale.weekdaysParse(input);
14204        if (typeof input === 'number') {
14205            return input;
14206        }
14207
14208        return null;
14209    }
14210
14211    function parseIsoWeekday(input, locale) {
14212        if (typeof input === 'string') {
14213            return locale.weekdaysParse(input) % 7 || 7;
14214        }
14215        return isNaN(input) ? null : input;
14216    }
14217
14218    // LOCALES
14219    function shiftWeekdays (ws, n) {
14220        return ws.slice(n, 7).concat(ws.slice(0, n));
14221    }
14222
14223    var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
14224    function localeWeekdays (m, format) {
14225        var weekdays = isArray(this._weekdays) ? this._weekdays :
14226            this._weekdays[(m && m !== true && this._weekdays.isFormat.test(format)) ? 'format' : 'standalone'];
14227        return (m === true) ? shiftWeekdays(weekdays, this._week.dow)
14228            : (m) ? weekdays[m.day()] : weekdays;
14229    }
14230
14231    var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
14232    function localeWeekdaysShort (m) {
14233        return (m === true) ? shiftWeekdays(this._weekdaysShort, this._week.dow)
14234            : (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;
14235    }
14236
14237    var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
14238    function localeWeekdaysMin (m) {
14239        return (m === true) ? shiftWeekdays(this._weekdaysMin, this._week.dow)
14240            : (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;
14241    }
14242
14243    function handleStrictParse$1(weekdayName, format, strict) {
14244        var i, ii, mom, llc = weekdayName.toLocaleLowerCase();
14245        if (!this._weekdaysParse) {
14246            this._weekdaysParse = [];
14247            this._shortWeekdaysParse = [];
14248            this._minWeekdaysParse = [];
14249
14250            for (i = 0; i < 7; ++i) {
14251                mom = createUTC([2000, 1]).day(i);
14252                this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();
14253                this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();
14254                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
14255            }
14256        }
14257
14258        if (strict) {
14259            if (format === 'dddd') {
14260                ii = indexOf.call(this._weekdaysParse, llc);
14261                return ii !== -1 ? ii : null;
14262            } else if (format === 'ddd') {
14263                ii = indexOf.call(this._shortWeekdaysParse, llc);
14264                return ii !== -1 ? ii : null;
14265            } else {
14266                ii = indexOf.call(this._minWeekdaysParse, llc);
14267                return ii !== -1 ? ii : null;
14268            }
14269        } else {
14270            if (format === 'dddd') {
14271                ii = indexOf.call(this._weekdaysParse, llc);
14272                if (ii !== -1) {
14273                    return ii;
14274                }
14275                ii = indexOf.call(this._shortWeekdaysParse, llc);
14276                if (ii !== -1) {
14277                    return ii;
14278                }
14279                ii = indexOf.call(this._minWeekdaysParse, llc);
14280                return ii !== -1 ? ii : null;
14281            } else if (format === 'ddd') {
14282                ii = indexOf.call(this._shortWeekdaysParse, llc);
14283                if (ii !== -1) {
14284                    return ii;
14285                }
14286                ii = indexOf.call(this._weekdaysParse, llc);
14287                if (ii !== -1) {
14288                    return ii;
14289                }
14290                ii = indexOf.call(this._minWeekdaysParse, llc);
14291                return ii !== -1 ? ii : null;
14292            } else {
14293                ii = indexOf.call(this._minWeekdaysParse, llc);
14294                if (ii !== -1) {
14295                    return ii;
14296                }
14297                ii = indexOf.call(this._weekdaysParse, llc);
14298                if (ii !== -1) {
14299                    return ii;
14300                }
14301                ii = indexOf.call(this._shortWeekdaysParse, llc);
14302                return ii !== -1 ? ii : null;
14303            }
14304        }
14305    }
14306
14307    function localeWeekdaysParse (weekdayName, format, strict) {
14308        var i, mom, regex;
14309
14310        if (this._weekdaysParseExact) {
14311            return handleStrictParse$1.call(this, weekdayName, format, strict);
14312        }
14313
14314        if (!this._weekdaysParse) {
14315            this._weekdaysParse = [];
14316            this._minWeekdaysParse = [];
14317            this._shortWeekdaysParse = [];
14318            this._fullWeekdaysParse = [];
14319        }
14320
14321        for (i = 0; i < 7; i++) {
14322            // make the regex if we don't have it already
14323
14324            mom = createUTC([2000, 1]).day(i);
14325            if (strict && !this._fullWeekdaysParse[i]) {
14326                this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');
14327                this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');
14328                this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');
14329            }
14330            if (!this._weekdaysParse[i]) {
14331                regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
14332                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
14333            }
14334            // test the regex
14335            if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {
14336                return i;
14337            } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {
14338                return i;
14339            } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {
14340                return i;
14341            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
14342                return i;
14343            }
14344        }
14345    }
14346
14347    // MOMENTS
14348
14349    function getSetDayOfWeek (input) {
14350        if (!this.isValid()) {
14351            return input != null ? this : NaN;
14352        }
14353        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
14354        if (input != null) {
14355            input = parseWeekday(input, this.localeData());
14356            return this.add(input - day, 'd');
14357        } else {
14358            return day;
14359        }
14360    }
14361
14362    function getSetLocaleDayOfWeek (input) {
14363        if (!this.isValid()) {
14364            return input != null ? this : NaN;
14365        }
14366        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
14367        return input == null ? weekday : this.add(input - weekday, 'd');
14368    }
14369
14370    function getSetISODayOfWeek (input) {
14371        if (!this.isValid()) {
14372            return input != null ? this : NaN;
14373        }
14374
14375        // behaves the same as moment#day except
14376        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
14377        // as a setter, sunday should belong to the previous week.
14378
14379        if (input != null) {
14380            var weekday = parseIsoWeekday(input, this.localeData());
14381            return this.day(this.day() % 7 ? weekday : weekday - 7);
14382        } else {
14383            return this.day() || 7;
14384        }
14385    }
14386
14387    var defaultWeekdaysRegex = matchWord;
14388    function weekdaysRegex (isStrict) {
14389        if (this._weekdaysParseExact) {
14390            if (!hasOwnProp(this, '_weekdaysRegex')) {
14391                computeWeekdaysParse.call(this);
14392            }
14393            if (isStrict) {
14394                return this._weekdaysStrictRegex;
14395            } else {
14396                return this._weekdaysRegex;
14397            }
14398        } else {
14399            if (!hasOwnProp(this, '_weekdaysRegex')) {
14400                this._weekdaysRegex = defaultWeekdaysRegex;
14401            }
14402            return this._weekdaysStrictRegex && isStrict ?
14403                this._weekdaysStrictRegex : this._weekdaysRegex;
14404        }
14405    }
14406
14407    var defaultWeekdaysShortRegex = matchWord;
14408    function weekdaysShortRegex (isStrict) {
14409        if (this._weekdaysParseExact) {
14410            if (!hasOwnProp(this, '_weekdaysRegex')) {
14411                computeWeekdaysParse.call(this);
14412            }
14413            if (isStrict) {
14414                return this._weekdaysShortStrictRegex;
14415            } else {
14416                return this._weekdaysShortRegex;
14417            }
14418        } else {
14419            if (!hasOwnProp(this, '_weekdaysShortRegex')) {
14420                this._weekdaysShortRegex = defaultWeekdaysShortRegex;
14421            }
14422            return this._weekdaysShortStrictRegex && isStrict ?
14423                this._weekdaysShortStrictRegex : this._weekdaysShortRegex;
14424        }
14425    }
14426
14427    var defaultWeekdaysMinRegex = matchWord;
14428    function weekdaysMinRegex (isStrict) {
14429        if (this._weekdaysParseExact) {
14430            if (!hasOwnProp(this, '_weekdaysRegex')) {
14431                computeWeekdaysParse.call(this);
14432            }
14433            if (isStrict) {
14434                return this._weekdaysMinStrictRegex;
14435            } else {
14436                return this._weekdaysMinRegex;
14437            }
14438        } else {
14439            if (!hasOwnProp(this, '_weekdaysMinRegex')) {
14440                this._weekdaysMinRegex = defaultWeekdaysMinRegex;
14441            }
14442            return this._weekdaysMinStrictRegex && isStrict ?
14443                this._weekdaysMinStrictRegex : this._weekdaysMinRegex;
14444        }
14445    }
14446
14447
14448    function computeWeekdaysParse () {
14449        function cmpLenRev(a, b) {
14450            return b.length - a.length;
14451        }
14452
14453        var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],
14454            i, mom, minp, shortp, longp;
14455        for (i = 0; i < 7; i++) {
14456            // make the regex if we don't have it already
14457            mom = createUTC([2000, 1]).day(i);
14458            minp = this.weekdaysMin(mom, '');
14459            shortp = this.weekdaysShort(mom, '');
14460            longp = this.weekdays(mom, '');
14461            minPieces.push(minp);
14462            shortPieces.push(shortp);
14463            longPieces.push(longp);
14464            mixedPieces.push(minp);
14465            mixedPieces.push(shortp);
14466            mixedPieces.push(longp);
14467        }
14468        // Sorting makes sure if one weekday (or abbr) is a prefix of another it
14469        // will match the longer piece.
14470        minPieces.sort(cmpLenRev);
14471        shortPieces.sort(cmpLenRev);
14472        longPieces.sort(cmpLenRev);
14473        mixedPieces.sort(cmpLenRev);
14474        for (i = 0; i < 7; i++) {
14475            shortPieces[i] = regexEscape(shortPieces[i]);
14476            longPieces[i] = regexEscape(longPieces[i]);
14477            mixedPieces[i] = regexEscape(mixedPieces[i]);
14478        }
14479
14480        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
14481        this._weekdaysShortRegex = this._weekdaysRegex;
14482        this._weekdaysMinRegex = this._weekdaysRegex;
14483
14484        this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
14485        this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
14486        this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');
14487    }
14488
14489    // FORMATTING
14490
14491    function hFormat() {
14492        return this.hours() % 12 || 12;
14493    }
14494
14495    function kFormat() {
14496        return this.hours() || 24;
14497    }
14498
14499    addFormatToken('H', ['HH', 2], 0, 'hour');
14500    addFormatToken('h', ['hh', 2], 0, hFormat);
14501    addFormatToken('k', ['kk', 2], 0, kFormat);
14502
14503    addFormatToken('hmm', 0, 0, function () {
14504        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
14505    });
14506
14507    addFormatToken('hmmss', 0, 0, function () {
14508        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +
14509            zeroFill(this.seconds(), 2);
14510    });
14511
14512    addFormatToken('Hmm', 0, 0, function () {
14513        return '' + this.hours() + zeroFill(this.minutes(), 2);
14514    });
14515
14516    addFormatToken('Hmmss', 0, 0, function () {
14517        return '' + this.hours() + zeroFill(this.minutes(), 2) +
14518            zeroFill(this.seconds(), 2);
14519    });
14520
14521    function meridiem (token, lowercase) {
14522        addFormatToken(token, 0, 0, function () {
14523            return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
14524        });
14525    }
14526
14527    meridiem('a', true);
14528    meridiem('A', false);
14529
14530    // ALIASES
14531
14532    addUnitAlias('hour', 'h');
14533
14534    // PRIORITY
14535    addUnitPriority('hour', 13);
14536
14537    // PARSING
14538
14539    function matchMeridiem (isStrict, locale) {
14540        return locale._meridiemParse;
14541    }
14542
14543    addRegexToken('a',  matchMeridiem);
14544    addRegexToken('A',  matchMeridiem);
14545    addRegexToken('H',  match1to2);
14546    addRegexToken('h',  match1to2);
14547    addRegexToken('k',  match1to2);
14548    addRegexToken('HH', match1to2, match2);
14549    addRegexToken('hh', match1to2, match2);
14550    addRegexToken('kk', match1to2, match2);
14551
14552    addRegexToken('hmm', match3to4);
14553    addRegexToken('hmmss', match5to6);
14554    addRegexToken('Hmm', match3to4);
14555    addRegexToken('Hmmss', match5to6);
14556
14557    addParseToken(['H', 'HH'], HOUR);
14558    addParseToken(['k', 'kk'], function (input, array, config) {
14559        var kInput = toInt(input);
14560        array[HOUR] = kInput === 24 ? 0 : kInput;
14561    });
14562    addParseToken(['a', 'A'], function (input, array, config) {
14563        config._isPm = config._locale.isPM(input);
14564        config._meridiem = input;
14565    });
14566    addParseToken(['h', 'hh'], function (input, array, config) {
14567        array[HOUR] = toInt(input);
14568        getParsingFlags(config).bigHour = true;
14569    });
14570    addParseToken('hmm', function (input, array, config) {
14571        var pos = input.length - 2;
14572        array[HOUR] = toInt(input.substr(0, pos));
14573        array[MINUTE] = toInt(input.substr(pos));
14574        getParsingFlags(config).bigHour = true;
14575    });
14576    addParseToken('hmmss', function (input, array, config) {
14577        var pos1 = input.length - 4;
14578        var pos2 = input.length - 2;
14579        array[HOUR] = toInt(input.substr(0, pos1));
14580        array[MINUTE] = toInt(input.substr(pos1, 2));
14581        array[SECOND] = toInt(input.substr(pos2));
14582        getParsingFlags(config).bigHour = true;
14583    });
14584    addParseToken('Hmm', function (input, array, config) {
14585        var pos = input.length - 2;
14586        array[HOUR] = toInt(input.substr(0, pos));
14587        array[MINUTE] = toInt(input.substr(pos));
14588    });
14589    addParseToken('Hmmss', function (input, array, config) {
14590        var pos1 = input.length - 4;
14591        var pos2 = input.length - 2;
14592        array[HOUR] = toInt(input.substr(0, pos1));
14593        array[MINUTE] = toInt(input.substr(pos1, 2));
14594        array[SECOND] = toInt(input.substr(pos2));
14595    });
14596
14597    // LOCALES
14598
14599    function localeIsPM (input) {
14600        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing str
vendor: 11,105 bytes, lines 14600-14916
14600ings like arrays
14601        // Using charAt should be more compatible.
14602        return ((input + '').toLowerCase().charAt(0) === 'p');
14603    }
14604
14605    var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
14606    function localeMeridiem (hours, minutes, isLower) {
14607        if (hours > 11) {
14608            return isLower ? 'pm' : 'PM';
14609        } else {
14610            return isLower ? 'am' : 'AM';
14611        }
14612    }
14613
14614
14615    // MOMENTS
14616
14617    // Setting the hour should keep the time, because the user explicitly
14618    // specified which hour they want. So trying to maintain the same hour (in
14619    // a new timezone) makes sense. Adding/subtracting hours does not follow
14620    // this rule.
14621    var getSetHour = makeGetSet('Hours', true);
14622
14623    var baseConfig = {
14624        calendar: defaultCalendar,
14625        longDateFormat: defaultLongDateFormat,
14626        invalidDate: defaultInvalidDate,
14627        ordinal: defaultOrdinal,
14628        dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
14629        relativeTime: defaultRelativeTime,
14630
14631        months: defaultLocaleMonths,
14632        monthsShort: defaultLocaleMonthsShort,
14633
14634        week: defaultLocaleWeek,
14635
14636        weekdays: defaultLocaleWeekdays,
14637        weekdaysMin: defaultLocaleWeekdaysMin,
14638        weekdaysShort: defaultLocaleWeekdaysShort,
14639
14640        meridiemParse: defaultLocaleMeridiemParse
14641    };
14642
14643    // internal storage for locale config files
14644    var locales = {};
14645    var localeFamilies = {};
14646    var globalLocale;
14647
14648    function normalizeLocale(key) {
14649        return key ? key.toLowerCase().replace('_', '-') : key;
14650    }
14651
14652    // pick the locale from the array
14653    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
14654    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
14655    function chooseLocale(names) {
14656        var i = 0, j, next, locale, split;
14657
14658        while (i < names.length) {
14659            split = normalizeLocale(names[i]).split('-');
14660            j = split.length;
14661            next = normalizeLocale(names[i + 1]);
14662            next = next ? next.split('-') : null;
14663            while (j > 0) {
14664                locale = loadLocale(split.slice(0, j).join('-'));
14665                if (locale) {
14666                    return locale;
14667                }
14668                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
14669                    //the next array item is better than a shallower substring of this one
14670                    break;
14671                }
14672                j--;
14673            }
14674            i++;
14675        }
14676        return globalLocale;
14677    }
14678
14679    function loadLocale(name) {
14680        var oldLocale = null;
14681        // TODO: Find a better way to register and load all the locales in Node
14682        if (!locales[name] && (typeof module !== 'undefined') &&
14683                module && module.exports) {
14684            try {
14685                oldLocale = globalLocale._abbr;
14686                var aliasedRequire = require;
14687                aliasedRequire('./locale/' + name);
14688                getSetGlobalLocale(oldLocale);
14689            } catch (e) {}
14690        }
14691        return locales[name];
14692    }
14693
14694    // This function will load locale and then set the global locale.  If
14695    // no arguments are passed in, it will simply return the current global
14696    // locale key.
14697    function getSetGlobalLocale (key, values) {
14698        var data;
14699        if (key) {
14700            if (isUndefined(values)) {
14701                data = getLocale(key);
14702            }
14703            else {
14704                data = defineLocale(key, values);
14705            }
14706
14707            if (data) {
14708                // moment.duration._locale = moment._locale = data;
14709                globalLocale = data;
14710            }
14711            else {
14712                if ((typeof console !==  'undefined') && console.warn) {
14713                    //warn user if arguments are passed but the locale could not be set
14714                    console.warn('Locale ' + key +  ' not found. Did you forget to load it?');
14715                }
14716            }
14717        }
14718
14719        return globalLocale._abbr;
14720    }
14721
14722    function defineLocale (name, config) {
14723        if (config !== null) {
14724            var locale, parentConfig = baseConfig;
14725            config.abbr = name;
14726            if (locales[name] != null) {
14727                deprecateSimple('defineLocaleOverride',
14728                        'use moment.updateLocale(localeName, config) to change ' +
14729                        'an existing locale. moment.defineLocale(localeName, ' +
14730                        'config) should only be used for creating a new locale ' +
14731                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');
14732                parentConfig = locales[name]._config;
14733            } else if (config.parentLocale != null) {
14734                if (locales[config.parentLocale] != null) {
14735                    parentConfig = locales[config.parentLocale]._config;
14736                } else {
14737                    locale = loadLocale(config.parentLocale);
14738                    if (locale != null) {
14739                        parentConfig = locale._config;
14740                    } else {
14741                        if (!localeFamilies[config.parentLocale]) {
14742                            localeFamilies[config.parentLocale] = [];
14743                        }
14744                        localeFamilies[config.parentLocale].push({
14745                            name: name,
14746                            config: config
14747                        });
14748                        return null;
14749                    }
14750                }
14751            }
14752            locales[name] = new Locale(mergeConfigs(parentConfig, config));
14753
14754            if (localeFamilies[name]) {
14755                localeFamilies[name].forEach(function (x) {
14756                    defineLocale(x.name, x.config);
14757                });
14758            }
14759
14760            // backwards compat for now: also set the locale
14761            // make sure we set the locale AFTER all child locales have been
14762            // created, so we won't end up with the child locale set.
14763            getSetGlobalLocale(name);
14764
14765
14766            return locales[name];
14767        } else {
14768            // useful for testing
14769            delete locales[name];
14770            return null;
14771        }
14772    }
14773
14774    function updateLocale(name, config) {
14775        if (config != null) {
14776            var locale, tmpLocale, parentConfig = baseConfig;
14777            // MERGE
14778            tmpLocale = loadLocale(name);
14779            if (tmpLocale != null) {
14780                parentConfig = tmpLocale._config;
14781            }
14782            config = mergeConfigs(parentConfig, config);
14783            locale = new Locale(config);
14784            locale.parentLocale = locales[name];
14785            locales[name] = locale;
14786
14787            // backwards compat for now: also set the locale
14788            getSetGlobalLocale(name);
14789        } else {
14790            // pass null for config to unupdate, useful for tests
14791            if (locales[name] != null) {
14792                if (locales[name].parentLocale != null) {
14793                    locales[name] = locales[name].parentLocale;
14794                } else if (locales[name] != null) {
14795                    delete locales[name];
14796                }
14797            }
14798        }
14799        return locales[name];
14800    }
14801
14802    // returns locale data
14803    function getLocale (key) {
14804        var locale;
14805
14806        if (key && key._locale && key._locale._abbr) {
14807            key = key._locale._abbr;
14808        }
14809
14810        if (!key) {
14811            return globalLocale;
14812        }
14813
14814        if (!isArray(key)) {
14815            //short-circuit everything else
14816            locale = loadLocale(key);
14817            if (locale) {
14818                return locale;
14819            }
14820            key = [key];
14821        }
14822
14823        return chooseLocale(key);
14824    }
14825
14826    function listLocales() {
14827        return keys(locales);
14828    }
14829
14830    function checkOverflow (m) {
14831        var overflow;
14832        var a = m._a;
14833
14834        if (a && getParsingFlags(m).overflow === -2) {
14835            overflow =
14836                a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :
14837                a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
14838                a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
14839                a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :
14840                a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :
14841                a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
14842                -1;
14843
14844            if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
14845                overflow = DATE;
14846            }
14847            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
14848                overflow = WEEK;
14849            }
14850            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
14851                overflow = WEEKDAY;
14852            }
14853
14854            getParsingFlags(m).overflow = overflow;
14855        }
14856
14857        return m;
14858    }
14859
14860    // Pick the first defined of two or three arguments.
14861    function defaults(a, b, c) {
14862        if (a != null) {
14863            return a;
14864        }
14865        if (b != null) {
14866            return b;
14867        }
14868        return c;
14869    }
14870
14871    function currentDateArray(config) {
14872        // hooks is actually the exported moment object
14873        var nowValue = new Date(hooks.now());
14874        if (config._useUTC) {
14875            return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];
14876        }
14877        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
14878    }
14879
14880    // convert an array to a date.
14881    // the array should mirror the parameters below
14882    // note: all values past the year are optional and will default to the lowest possible value.
14883    // [year, month, day , hour, minute, second, millisecond]
14884    function configFromArray (config) {
14885        var i, date, input = [], currentDate, expectedWeekday, yearToUse;
14886
14887        if (config._d) {
14888            return;
14889        }
14890
14891        currentDate = currentDateArray(config);
14892
14893        //compute day of the year from weeks and weekdays
14894        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
14895            dayOfYearFromWeekInfo(config);
14896        }
14897
14898        //if the day of the year is set, figure out what it is
14899        if (config._dayOfYear != null) {
14900            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
14901
14902            if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {
14903                getParsingFlags(config)._overflowDayOfYear = true;
14904            }
14905
14906            date = createUTCDate(yearToUse, 0, config._dayOfYear);
14907            config._a[MONTH] = date.getUTCMonth();
14908            config._a[DATE] = date.getUTCDate();
14909        }
14910
14911        // Default to current date.
14912        // * if no year, month, day of month are given, default to today
14913        // * if day of month is given, default month and year
14914        // * if month is given, default only year
14915        // * if year is given, don't default anything
14916        for (i = 0; i < 3 && config._a[i] == null; ++i) {
vendor: 83,307 bytes, lines 14917-17438
14917            config._a[i] = input[i] = currentDate[i];
14918        }
14919
14920        // Zero out whatever was not defaulted, including time
14921        for (; i < 7; i++) {
14922            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
14923        }
14924
14925        // Check for 24:00:00.000
14926        if (config._a[HOUR] === 24 &&
14927                config._a[MINUTE] === 0 &&
14928                config._a[SECOND] === 0 &&
14929                config._a[MILLISECOND] === 0) {
14930            config._nextDay = true;
14931            config._a[HOUR] = 0;
14932        }
14933
14934        config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
14935        expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();
14936
14937        // Apply timezone offset from input. The actual utcOffset can be changed
14938        // with parseZone.
14939        if (config._tzm != null) {
14940            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
14941        }
14942
14943        if (config._nextDay) {
14944            config._a[HOUR] = 24;
14945        }
14946
14947        // check for mismatching day of week
14948        if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {
14949            getParsingFlags(config).weekdayMismatch = true;
14950        }
14951    }
14952
14953    function dayOfYearFromWeekInfo(config) {
14954        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;
14955
14956        w = config._w;
14957        if (w.GG != null || w.W != null || w.E != null) {
14958            dow = 1;
14959            doy = 4;
14960
14961            // TODO: We need to take the current isoWeekYear, but that depends on
14962            // how we interpret now (local, utc, fixed offset). So create
14963            // a now version of current config (take local/utc/offset flags, and
14964            // create now).
14965            weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);
14966            week = defaults(w.W, 1);
14967            weekday = defaults(w.E, 1);
14968            if (weekday < 1 || weekday > 7) {
14969                weekdayOverflow = true;
14970            }
14971        } else {
14972            dow = config._locale._week.dow;
14973            doy = config._locale._week.doy;
14974
14975            var curWeek = weekOfYear(createLocal(), dow, doy);
14976
14977            weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);
14978
14979            // Default to current week.
14980            week = defaults(w.w, curWeek.week);
14981
14982            if (w.d != null) {
14983                // weekday -- low day numbers are considered next week
14984                weekday = w.d;
14985                if (weekday < 0 || weekday > 6) {
14986                    weekdayOverflow = true;
14987                }
14988            } else if (w.e != null) {
14989                // local weekday -- counting starts from beginning of week
14990                weekday = w.e + dow;
14991                if (w.e < 0 || w.e > 6) {
14992                    weekdayOverflow = true;
14993                }
14994            } else {
14995                // default to beginning of week
14996                weekday = dow;
14997            }
14998        }
14999        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
15000            getParsingFlags(config)._overflowWeeks = true;
15001        } else if (weekdayOverflow != null) {
15002            getParsingFlags(config)._overflowWeekday = true;
15003        } else {
15004            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
15005            config._a[YEAR] = temp.year;
15006            config._dayOfYear = temp.dayOfYear;
15007        }
15008    }
15009
15010    // iso 8601 regex
15011    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
15012    var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
15013    var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
15014
15015    var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/;
15016
15017    var isoDates = [
15018        ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
15019        ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
15020        ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
15021        ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
15022        ['YYYY-DDD', /\d{4}-\d{3}/],
15023        ['YYYY-MM', /\d{4}-\d\d/, false],
15024        ['YYYYYYMMDD', /[+-]\d{10}/],
15025        ['YYYYMMDD', /\d{8}/],
15026        // YYYYMM is NOT allowed by the standard
15027        ['GGGG[W]WWE', /\d{4}W\d{3}/],
15028        ['GGGG[W]WW', /\d{4}W\d{2}/, false],
15029        ['YYYYDDD', /\d{7}/]
15030    ];
15031
15032    // iso time formats and regexes
15033    var isoTimes = [
15034        ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
15035        ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
15036        ['HH:mm:ss', /\d\d:\d\d:\d\d/],
15037        ['HH:mm', /\d\d:\d\d/],
15038        ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
15039        ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
15040        ['HHmmss', /\d\d\d\d\d\d/],
15041        ['HHmm', /\d\d\d\d/],
15042        ['HH', /\d\d/]
15043    ];
15044
15045    var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;
15046
15047    // date from iso format
15048    function configFromISO(config) {
15049        var i, l,
15050            string = config._i,
15051            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
15052            allowTime, dateFormat, timeFormat, tzFormat;
15053
15054        if (match) {
15055            getParsingFlags(config).iso = true;
15056
15057            for (i = 0, l = isoDates.length; i < l; i++) {
15058                if (isoDates[i][1].exec(match[1])) {
15059                    dateFormat = isoDates[i][0];
15060                    allowTime = isoDates[i][2] !== false;
15061                    break;
15062                }
15063            }
15064            if (dateFormat == null) {
15065                config._isValid = false;
15066                return;
15067            }
15068            if (match[3]) {
15069                for (i = 0, l = isoTimes.length; i < l; i++) {
15070                    if (isoTimes[i][1].exec(match[3])) {
15071                        // match[2] should be 'T' or space
15072                        timeFormat = (match[2] || ' ') + isoTimes[i][0];
15073                        break;
15074                    }
15075                }
15076                if (timeFormat == null) {
15077                    config._isValid = false;
15078                    return;
15079                }
15080            }
15081            if (!allowTime && timeFormat != null) {
15082                config._isValid = false;
15083                return;
15084            }
15085            if (match[4]) {
15086                if (tzRegex.exec(match[4])) {
15087                    tzFormat = 'Z';
15088                } else {
15089                    config._isValid = false;
15090                    return;
15091                }
15092            }
15093            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
15094            configFromStringAndFormat(config);
15095        } else {
15096            config._isValid = false;
15097        }
15098    }
15099
15100    // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
15101    var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;
15102
15103    function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {
15104        var result = [
15105            untruncateYear(yearStr),
15106            defaultLocaleMonthsShort.indexOf(monthStr),
15107            parseInt(dayStr, 10),
15108            parseInt(hourStr, 10),
15109            parseInt(minuteStr, 10)
15110        ];
15111
15112        if (secondStr) {
15113            result.push(parseInt(secondStr, 10));
15114        }
15115
15116        return result;
15117    }
15118
15119    function untruncateYear(yearStr) {
15120        var year = parseInt(yearStr, 10);
15121        if (year <= 49) {
15122            return 2000 + year;
15123        } else if (year <= 999) {
15124            return 1900 + year;
15125        }
15126        return year;
15127    }
15128
15129    function preprocessRFC2822(s) {
15130        // Remove comments and folding whitespace and replace multiple-spaces with a single space
15131        return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, '');
15132    }
15133
15134    function checkWeekday(weekdayStr, parsedInput, config) {
15135        if (weekdayStr) {
15136            // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.
15137            var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
15138                weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();
15139            if (weekdayProvided !== weekdayActual) {
15140                getParsingFlags(config).weekdayMismatch = true;
15141                config._isValid = false;
15142                return false;
15143            }
15144        }
15145        return true;
15146    }
15147
15148    var obsOffsets = {
15149        UT: 0,
15150        GMT: 0,
15151        EDT: -4 * 60,
15152        EST: -5 * 60,
15153        CDT: -5 * 60,
15154        CST: -6 * 60,
15155        MDT: -6 * 60,
15156        MST: -7 * 60,
15157        PDT: -7 * 60,
15158        PST: -8 * 60
15159    };
15160
15161    function calculateOffset(obsOffset, militaryOffset, numOffset) {
15162        if (obsOffset) {
15163            return obsOffsets[obsOffset];
15164        } else if (militaryOffset) {
15165            // the only allowed military tz is Z
15166            return 0;
15167        } else {
15168            var hm = parseInt(numOffset, 10);
15169            var m = hm % 100, h = (hm - m) / 100;
15170            return h * 60 + m;
15171        }
15172    }
15173
15174    // date and time from ref 2822 format
15175    function configFromRFC2822(config) {
15176        var match = rfc2822.exec(preprocessRFC2822(config._i));
15177        if (match) {
15178            var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);
15179            if (!checkWeekday(match[1], parsedArray, config)) {
15180                return;
15181            }
15182
15183            config._a = parsedArray;
15184            config._tzm = calculateOffset(match[8], match[9], match[10]);
15185
15186            config._d = createUTCDate.apply(null, config._a);
15187            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
15188
15189            getParsingFlags(config).rfc2822 = true;
15190        } else {
15191            config._isValid = false;
15192        }
15193    }
15194
15195    // date from iso format or fallback
15196    function configFromString(config) {
15197        var matched = aspNetJsonRegex.exec(config._i);
15198
15199        if (matched !== null) {
15200            config._d = new Date(+matched[1]);
15201            return;
15202        }
15203
15204        configFromISO(config);
15205        if (config._isValid === false) {
15206            delete config._isValid;
15207        } else {
15208            return;
15209        }
15210
15211        configFromRFC2822(config);
15212        if (config._isValid === false) {
15213            delete config._isValid;
15214        } else {
15215            return;
15216        }
15217
15218        // Final attempt, use Input Fallback
15219        hooks.createFromInputFallback(config);
15220    }
15221
15222    hooks.createFromInputFallback = deprecate(
15223        'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
15224        'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
15225        'discouraged and will be removed in an upcoming major release. Please refer to ' +
15226        'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
15227        function (config) {
15228            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
15229        }
15230    );
15231
15232    // constant that refers to the ISO standard
15233    hooks.ISO_8601 = function () {};
15234
15235    // constant that refers to the RFC 2822 form
15236    hooks.RFC_2822 = function () {};
15237
15238    // date from string and format string
15239    function configFromStringAndFormat(config) {
15240        // TODO: Move this to another part of the creation flow to prevent circular deps
15241        if (config._f === hooks.ISO_8601) {
15242            configFromISO(config);
15243            return;
15244        }
15245        if (config._f === hooks.RFC_2822) {
15246            configFromRFC2822(config);
15247            return;
15248        }
15249        config._a = [];
15250        getParsingFlags(config).empty = true;
15251
15252        // This array is used to make a Date, either with `new Date` or `Date.UTC`
15253        var string = '' + config._i,
15254            i, parsedInput, tokens, token, skipped,
15255            stringLength = string.length,
15256            totalParsedInputLength = 0;
15257
15258        tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
15259
15260        for (i = 0; i < tokens.length; i++) {
15261            token = tokens[i];
15262            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
15263            // console.log('token', token, 'parsedInput', parsedInput,
15264            //         'regex', getParseRegexForToken(token, config));
15265            if (parsedInput) {
15266                skipped = string.substr(0, string.indexOf(parsedInput));
15267                if (skipped.length > 0) {
15268                    getParsingFlags(config).unusedInput.push(skipped);
15269                }
15270                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
15271                totalParsedInputLength += parsedInput.length;
15272            }
15273            // don't parse if it's not a known token
15274            if (formatTokenFunctions[token]) {
15275                if (parsedInput) {
15276                    getParsingFlags(config).empty = false;
15277                }
15278                else {
15279                    getParsingFlags(config).unusedTokens.push(token);
15280                }
15281                addTimeToArrayFromToken(token, parsedInput, config);
15282            }
15283            else if (config._strict && !parsedInput) {
15284                getParsingFlags(config).unusedTokens.push(token);
15285            }
15286        }
15287
15288        // add remaining unparsed input length to the string
15289        getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
15290        if (string.length > 0) {
15291            getParsingFlags(config).unusedInput.push(string);
15292        }
15293
15294        // clear _12h flag if hour is <= 12
15295        if (config._a[HOUR] <= 12 &&
15296            getParsingFlags(config).bigHour === true &&
15297            config._a[HOUR] > 0) {
15298            getParsingFlags(config).bigHour = undefined;
15299        }
15300
15301        getParsingFlags(config).parsedDateParts = config._a.slice(0);
15302        getParsingFlags(config).meridiem = config._meridiem;
15303        // handle meridiem
15304        config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);
15305
15306        configFromArray(config);
15307        checkOverflow(config);
15308    }
15309
15310
15311    function meridiemFixWrap (locale, hour, meridiem) {
15312        var isPm;
15313
15314        if (meridiem == null) {
15315            // nothing to do
15316            return hour;
15317        }
15318        if (locale.meridiemHour != null) {
15319            return locale.meridiemHour(hour, meridiem);
15320        } else if (locale.isPM != null) {
15321            // Fallback
15322            isPm = locale.isPM(meridiem);
15323            if (isPm && hour < 12) {
15324                hour += 12;
15325            }
15326            if (!isPm && hour === 12) {
15327                hour = 0;
15328            }
15329            return hour;
15330        } else {
15331            // this is not supposed to happen
15332            return hour;
15333        }
15334    }
15335
15336    // date from string and array of format strings
15337    function configFromStringAndArray(config) {
15338        var tempConfig,
15339            bestMoment,
15340
15341            scoreToBeat,
15342            i,
15343            currentScore;
15344
15345        if (config._f.length === 0) {
15346            getParsingFlags(config).invalidFormat = true;
15347            config._d = new Date(NaN);
15348            return;
15349        }
15350
15351        for (i = 0; i < config._f.length; i++) {
15352            currentScore = 0;
15353            tempConfig = copyConfig({}, config);
15354            if (config._useUTC != null) {
15355                tempConfig._useUTC = config._useUTC;
15356            }
15357            tempConfig._f = config._f[i];
15358            configFromStringAndFormat(tempConfig);
15359
15360            if (!isValid(tempConfig)) {
15361                continue;
15362            }
15363
15364            // if there is any input that was not parsed add a penalty for that format
15365            currentScore += getParsingFlags(tempConfig).charsLeftOver;
15366
15367            //or tokens
15368            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
15369
15370            getParsingFlags(tempConfig).score = currentScore;
15371
15372            if (scoreToBeat == null || currentScore < scoreToBeat) {
15373                scoreToBeat = currentScore;
15374                bestMoment = tempConfig;
15375            }
15376        }
15377
15378        extend(config, bestMoment || tempConfig);
15379    }
15380
15381    function configFromObject(config) {
15382        if (config._d) {
15383            return;
15384        }
15385
15386        var i = normalizeObjectUnits(config._i);
15387        config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {
15388            return obj && parseInt(obj, 10);
15389        });
15390
15391        configFromArray(config);
15392    }
15393
15394    function createFromConfig (config) {
15395        var res = new Moment(checkOverflow(prepareConfig(config)));
15396        if (res._nextDay) {
15397            // Adding is smart enough around DST
15398            res.add(1, 'd');
15399            res._nextDay = undefined;
15400        }
15401
15402        return res;
15403    }
15404
15405    function prepareConfig (config) {
15406        var input = config._i,
15407            format = config._f;
15408
15409        config._locale = config._locale || getLocale(config._l);
15410
15411        if (input === null || (format === undefined && input === '')) {
15412            return createInvalid({nullInput: true});
15413        }
15414
15415        if (typeof input === 'string') {
15416            config._i = input = config._locale.preparse(input);
15417        }
15418
15419        if (isMoment(input)) {
15420            return new Moment(checkOverflow(input));
15421        } else if (isDate(input)) {
15422            config._d = input;
15423        } else if (isArray(format)) {
15424            configFromStringAndArray(config);
15425        } else if (format) {
15426            configFromStringAndFormat(config);
15427        }  else {
15428            configFromInput(config);
15429        }
15430
15431        if (!isValid(config)) {
15432            config._d = null;
15433        }
15434
15435        return config;
15436    }
15437
15438    function configFromInput(config) {
15439        var input = config._i;
15440        if (isUndefined(input)) {
15441            config._d = new Date(hooks.now());
15442        } else if (isDate(input)) {
15443            config._d = new Date(input.valueOf());
15444        } else if (typeof input === 'string') {
15445            configFromString(config);
15446        } else if (isArray(input)) {
15447            config._a = map(input.slice(0), function (obj) {
15448                return parseInt(obj, 10);
15449            });
15450            configFromArray(config);
15451        } else if (isObject(input)) {
15452            configFromObject(config);
15453        } else if (isNumber(input)) {
15454            // from milliseconds
15455            config._d = new Date(input);
15456        } else {
15457            hooks.createFromInputFallback(config);
15458        }
15459    }
15460
15461    function createLocalOrUTC (input, format, locale, strict, isUTC) {
15462        var c = {};
15463
15464        if (locale === true || locale === false) {
15465            strict = locale;
15466            locale = undefined;
15467        }
15468
15469        if ((isObject(input) && isObjectEmpty(input)) ||
15470                (isArray(input) && input.length === 0)) {
15471            input = undefined;
15472        }
15473        // object construction must be done this way.
15474        // https://github.com/moment/moment/issues/1423
15475        c._isAMomentObject = true;
15476        c._useUTC = c._isUTC = isUTC;
15477        c._l = locale;
15478        c._i = input;
15479        c._f = format;
15480        c._strict = strict;
15481
15482        return createFromConfig(c);
15483    }
15484
15485    function createLocal (input, format, locale, strict) {
15486        return createLocalOrUTC(input, format, locale, strict, false);
15487    }
15488
15489    var prototypeMin = deprecate(
15490        'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
15491        function () {
15492            var other = createLocal.apply(null, arguments);
15493            if (this.isValid() && other.isValid()) {
15494                return other < this ? this : other;
15495            } else {
15496                return createInvalid();
15497            }
15498        }
15499    );
15500
15501    var prototypeMax = deprecate(
15502        'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
15503        function () {
15504            var other = createLocal.apply(null, arguments);
15505            if (this.isValid() && other.isValid()) {
15506                return other > this ? this : other;
15507            } else {
15508                return createInvalid();
15509            }
15510        }
15511    );
15512
15513    // Pick a moment m from moments so that m[fn](other) is true for all
15514    // other. This relies on the function fn to be transitive.
15515    //
15516    // moments should either be an array of moment objects or an array, whose
15517    // first element is an array of moment objects.
15518    function pickBy(fn, moments) {
15519        var res, i;
15520        if (moments.length === 1 && isArray(moments[0])) {
15521            moments = moments[0];
15522        }
15523        if (!moments.length) {
15524            return createLocal();
15525        }
15526        res = moments[0];
15527        for (i = 1; i < moments.length; ++i) {
15528            if (!moments[i].isValid() || moments[i][fn](res)) {
15529                res = moments[i];
15530            }
15531        }
15532        return res;
15533    }
15534
15535    // TODO: Use [].sort instead?
15536    function min () {
15537        var args = [].slice.call(arguments, 0);
15538
15539        return pickBy('isBefore', args);
15540    }
15541
15542    function max () {
15543        var args = [].slice.call(arguments, 0);
15544
15545        return pickBy('isAfter', args);
15546    }
15547
15548    var now = function () {
15549        return Date.now ? Date.now() : +(new Date());
15550    };
15551
15552    var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];
15553
15554    function isDurationValid(m) {
15555        for (var key in m) {
15556            if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {
15557                return false;
15558            }
15559        }
15560
15561        var unitHasDecimal = false;
15562        for (var i = 0; i < ordering.length; ++i) {
15563            if (m[ordering[i]]) {
15564                if (unitHasDecimal) {
15565                    return false; // only allow non-integers for smallest unit
15566                }
15567                if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
15568                    unitHasDecimal = true;
15569                }
15570            }
15571        }
15572
15573        return true;
15574    }
15575
15576    function isValid$1() {
15577        return this._isValid;
15578    }
15579
15580    function createInvalid$1() {
15581        return createDuration(NaN);
15582    }
15583
15584    function Duration (duration) {
15585        var normalizedInput = normalizeObjectUnits(duration),
15586            years = normalizedInput.year || 0,
15587            quarters = normalizedInput.quarter || 0,
15588            months = normalizedInput.month || 0,
15589            weeks = normalizedInput.week || normalizedInput.isoWeek || 0,
15590            days = normalizedInput.day || 0,
15591            hours = normalizedInput.hour || 0,
15592            minutes = normalizedInput.minute || 0,
15593            seconds = normalizedInput.second || 0,
15594            milliseconds = normalizedInput.millisecond || 0;
15595
15596        this._isValid = isDurationValid(normalizedInput);
15597
15598        // representation for dateAddRemove
15599        this._milliseconds = +milliseconds +
15600            seconds * 1e3 + // 1000
15601            minutes * 6e4 + // 1000 * 60
15602            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
15603        // Because of dateAddRemove treats 24 hours as different from a
15604        // day when working around DST, we need to store them separately
15605        this._days = +days +
15606            weeks * 7;
15607        // It is impossible to translate months into days without knowing
15608        // which months you are are talking about, so we have to store
15609        // it separately.
15610        this._months = +months +
15611            quarters * 3 +
15612            years * 12;
15613
15614        this._data = {};
15615
15616        this._locale = getLocale();
15617
15618        this._bubble();
15619    }
15620
15621    function isDuration (obj) {
15622        return obj instanceof Duration;
15623    }
15624
15625    function absRound (number) {
15626        if (number < 0) {
15627            return Math.round(-1 * number) * -1;
15628        } else {
15629            return Math.round(number);
15630        }
15631    }
15632
15633    // FORMATTING
15634
15635    function offset (token, separator) {
15636        addFormatToken(token, 0, 0, function () {
15637            var offset = this.utcOffset();
15638            var sign = '+';
15639            if (offset < 0) {
15640                offset = -offset;
15641                sign = '-';
15642            }
15643            return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
15644        });
15645    }
15646
15647    offset('Z', ':');
15648    offset('ZZ', '');
15649
15650    // PARSING
15651
15652    addRegexToken('Z',  matchShortOffset);
15653    addRegexToken('ZZ', matchShortOffset);
15654    addParseToken(['Z', 'ZZ'], function (input, array, config) {
15655        config._useUTC = true;
15656        config._tzm = offsetFromString(matchShortOffset, input);
15657    });
15658
15659    // HELPERS
15660
15661    // timezone chunker
15662    // '+10:00' > ['10',  '00']
15663    // '-1530'  > ['-15', '30']
15664    var chunkOffset = /([\+\-]|\d\d)/gi;
15665
15666    function offsetFromString(matcher, string) {
15667        var matches = (string || '').match(matcher);
15668
15669        if (matches === null) {
15670            return null;
15671        }
15672
15673        var chunk   = matches[matches.length - 1] || [];
15674        var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];
15675        var minutes = +(parts[1] * 60) + toInt(parts[2]);
15676
15677        return minutes === 0 ?
15678          0 :
15679          parts[0] === '+' ? minutes : -minutes;
15680    }
15681
15682    // Return a moment from input, that is local/utc/zone equivalent to model.
15683    function cloneWithOffset(input, model) {
15684        var res, diff;
15685        if (model._isUTC) {
15686            res = model.clone();
15687            diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();
15688            // Use low-level api, because this fn is low-level api.
15689            res._d.setTime(res._d.valueOf() + diff);
15690            hooks.updateOffset(res, false);
15691            return res;
15692        } else {
15693            return createLocal(input).local();
15694        }
15695    }
15696
15697    function getDateOffset (m) {
15698        // On Firefox.24 Date#getTimezoneOffset returns a floating point.
15699        // https://github.com/moment/moment/pull/1871
15700        return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
15701    }
15702
15703    // HOOKS
15704
15705    // This function will be called whenever a moment is mutated.
15706    // It is intended to keep the offset in sync with the timezone.
15707    hooks.updateOffset = function () {};
15708
15709    // MOMENTS
15710
15711    // keepLocalTime = true means only change the timezone, without
15712    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
15713    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
15714    // +0200, so we adjust the time as needed, to be valid.
15715    //
15716    // Keeping the time actually adds/subtracts (one hour)
15717    // from the actual represented time. That is why we call updateOffset
15718    // a second time. In case it wants us to change the offset again
15719    // _changeInProgress == true case, then we have to adjust, because
15720    // there is no such time in the given timezone.
15721    function getSetOffset (input, keepLocalTime, keepMinutes) {
15722        var offset = this._offset || 0,
15723            localAdjust;
15724        if (!this.isValid()) {
15725            return input != null ? this : NaN;
15726        }
15727        if (input != null) {
15728            if (typeof input === 'string') {
15729                input = offsetFromString(matchShortOffset, input);
15730                if (input === null) {
15731                    return this;
15732                }
15733            } else if (Math.abs(input) < 16 && !keepMinutes) {
15734                input = input * 60;
15735            }
15736            if (!this._isUTC && keepLocalTime) {
15737                localAdjust = getDateOffset(this);
15738            }
15739            this._offset = input;
15740            this._isUTC = true;
15741            if (localAdjust != null) {
15742                this.add(localAdjust, 'm');
15743            }
15744            if (offset !== input) {
15745                if (!keepLocalTime || this._changeInProgress) {
15746                    addSubtract(this, createDuration(input - offset, 'm'), 1, false);
15747                } else if (!this._changeInProgress) {
15748                    this._changeInProgress = true;
15749                    hooks.updateOffset(this, true);
15750                    this._changeInProgress = null;
15751                }
15752            }
15753            return this;
15754        } else {
15755            return this._isUTC ? offset : getDateOffset(this);
15756        }
15757    }
15758
15759    function getSetZone (input, keepLocalTime) {
15760        if (input != null) {
15761            if (typeof input !== 'string') {
15762                input = -input;
15763            }
15764
15765            this.utcOffset(input, keepLocalTime);
15766
15767            return this;
15768        } else {
15769            return -this.utcOffset();
15770        }
15771    }
15772
15773    function setOffsetToUTC (keepLocalTime) {
15774        return this.utcOffset(0, keepLocalTime);
15775    }
15776
15777    function setOffsetToLocal (keepLocalTime) {
15778        if (this._isUTC) {
15779            this.utcOffset(0, keepLocalTime);
15780            this._isUTC = false;
15781
15782            if (keepLocalTime) {
15783                this.subtract(getDateOffset(this), 'm');
15784            }
15785        }
15786        return this;
15787    }
15788
15789    function setOffsetToParsedOffset () {
15790        if (this._tzm != null) {
15791            this.utcOffset(this._tzm, false, true);
15792        } else if (typeof this._i === 'string') {
15793            var tZone = offsetFromString(matchOffset, this._i);
15794            if (tZone != null) {
15795                this.utcOffset(tZone);
15796            }
15797            else {
15798                this.utcOffset(0, true);
15799            }
15800        }
15801        return this;
15802    }
15803
15804    function hasAlignedHourOffset (input) {
15805        if (!this.isValid()) {
15806            return false;
15807        }
15808        input = input ? createLocal(input).utcOffset() : 0;
15809
15810        return (this.utcOffset() - input) % 60 === 0;
15811    }
15812
15813    function isDaylightSavingTime () {
15814        return (
15815            this.utcOffset() > this.clone().month(0).utcOffset() ||
15816            this.utcOffset() > this.clone().month(5).utcOffset()
15817        );
15818    }
15819
15820    function isDaylightSavingTimeShifted () {
15821        if (!isUndefined(this._isDSTShifted)) {
15822            return this._isDSTShifted;
15823        }
15824
15825        var c = {};
15826
15827        copyConfig(c, this);
15828        c = prepareConfig(c);
15829
15830        if (c._a) {
15831            var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
15832            this._isDSTShifted = this.isValid() &&
15833                compareArrays(c._a, other.toArray()) > 0;
15834        } else {
15835            this._isDSTShifted = false;
15836        }
15837
15838        return this._isDSTShifted;
15839    }
15840
15841    function isLocal () {
15842        return this.isValid() ? !this._isUTC : false;
15843    }
15844
15845    function isUtcOffset () {
15846        return this.isValid() ? this._isUTC : false;
15847    }
15848
15849    function isUtc () {
15850        return this.isValid() ? this._isUTC && this._offset === 0 : false;
15851    }
15852
15853    // ASP.NET json date format regex
15854    var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;
15855
15856    // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
15857    // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
15858    // and further modified to allow for strings containing both week and day
15859    var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
15860
15861    function createDuration (input, key) {
15862        var duration = input,
15863            // matching against regexp is expensive, do it on demand
15864            match = null,
15865            sign,
15866            ret,
15867            diffRes;
15868
15869        if (isDuration(input)) {
15870            duration = {
15871                ms : input._milliseconds,
15872                d  : input._days,
15873                M  : input._months
15874            };
15875        } else if (isNumber(input)) {
15876            duration = {};
15877            if (key) {
15878                duration[key] = input;
15879            } else {
15880                duration.milliseconds = input;
15881            }
15882        } else if (!!(match = aspNetRegex.exec(input))) {
15883            sign = (match[1] === '-') ? -1 : 1;
15884            duration = {
15885                y  : 0,
15886                d  : toInt(match[DATE])                         * sign,
15887                h  : toInt(match[HOUR])                         * sign,
15888                m  : toInt(match[MINUTE])                       * sign,
15889                s  : toInt(match[SECOND])                       * sign,
15890                ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match
15891            };
15892        } else if (!!(match = isoRegex.exec(input))) {
15893            sign = (match[1] === '-') ? -1 : 1;
15894            duration = {
15895                y : parseIso(match[2], sign),
15896                M : parseIso(match[3], sign),
15897                w : parseIso(match[4], sign),
15898                d : parseIso(match[5], sign),
15899                h : parseIso(match[6], sign),
15900                m : parseIso(match[7], sign),
15901                s : parseIso(match[8], sign)
15902            };
15903        } else if (duration == null) {// checks for null or undefined
15904            duration = {};
15905        } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
15906            diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));
15907
15908            duration = {};
15909            duration.ms = diffRes.milliseconds;
15910            duration.M = diffRes.months;
15911        }
15912
15913        ret = new Duration(duration);
15914
15915        if (isDuration(input) && hasOwnProp(input, '_locale')) {
15916            ret._locale = input._locale;
15917        }
15918
15919        return ret;
15920    }
15921
15922    createDuration.fn = Duration.prototype;
15923    createDuration.invalid = createInvalid$1;
15924
15925    function parseIso (inp, sign) {
15926        // We'd normally use ~~inp for this, but unfortunately it also
15927        // converts floats to ints.
15928        // inp may be undefined, so careful calling replace on it.
15929        var res = inp && parseFloat(inp.replace(',', '.'));
15930        // apply sign while we're at it
15931        return (isNaN(res) ? 0 : res) * sign;
15932    }
15933
15934    function positiveMomentsDifference(base, other) {
15935        var res = {};
15936
15937        res.months = other.month() - base.month() +
15938            (other.year() - base.year()) * 12;
15939        if (base.clone().add(res.months, 'M').isAfter(other)) {
15940            --res.months;
15941        }
15942
15943        res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
15944
15945        return res;
15946    }
15947
15948    function momentsDifference(base, other) {
15949        var res;
15950        if (!(base.isValid() && other.isValid())) {
15951            return {milliseconds: 0, months: 0};
15952        }
15953
15954        other = cloneWithOffset(other, base);
15955        if (base.isBefore(other)) {
15956            res = positiveMomentsDifference(base, other);
15957        } else {
15958            res = positiveMomentsDifference(other, base);
15959            res.milliseconds = -res.milliseconds;
15960            res.months = -res.months;
15961        }
15962
15963        return res;
15964    }
15965
15966    // TODO: remove 'name' arg after deprecation is removed
15967    function createAdder(direction, name) {
15968        return function (val, period) {
15969            var dur, tmp;
15970            //invert the arguments, but complain about it
15971            if (period !== null && !isNaN(+period)) {
15972                deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +
15973                'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');
15974                tmp = val; val = period; period = tmp;
15975            }
15976
15977            val = typeof val === 'string' ? +val : val;
15978            dur = createDuration(val, period);
15979            addSubtract(this, dur, direction);
15980            return this;
15981        };
15982    }
15983
15984    function addSubtract (mom, duration, isAdding, updateOffset) {
15985        var milliseconds = duration._milliseconds,
15986            days = absRound(duration._days),
15987            months = absRound(duration._months);
15988
15989        if (!mom.isValid()) {
15990            // No op
15991            return;
15992        }
15993
15994        updateOffset = updateOffset == null ? true : updateOffset;
15995
15996        if (months) {
15997            setMonth(mom, get(mom, 'Month') + months * isAdding);
15998        }
15999        if (days) {
16000            set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
16001        }
16002        if (milliseconds) {
16003            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
16004        }
16005        if (updateOffset) {
16006            hooks.updateOffset(mom, days || months);
16007        }
16008    }
16009
16010    var add      = createAdder(1, 'add');
16011    var subtract = createAdder(-1, 'subtract');
16012
16013    function getCalendarFormat(myMoment, now) {
16014        var diff = myMoment.diff(now, 'days', true);
16015        return diff < -6 ? 'sameElse' :
16016                diff < -1 ? 'lastWeek' :
16017                diff < 0 ? 'lastDay' :
16018                diff < 1 ? 'sameDay' :
16019                diff < 2 ? 'nextDay' :
16020                diff < 7 ? 'nextWeek' : 'sameElse';
16021    }
16022
16023    function calendar$1 (time, formats) {
16024        // We want to compare the start of today, vs this.
16025        // Getting start-of-today depends on whether we're local/utc/offset or not.
16026        var now = time || createLocal(),
16027            sod = cloneWithOffset(now, this).startOf('day'),
16028            format = hooks.calendarFormat(this, sod) || 'sameElse';
16029
16030        var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);
16031
16032        return this.format(output || this.localeData().calendar(format, this, createLocal(now)));
16033    }
16034
16035    function clone () {
16036        return new Moment(this);
16037    }
16038
16039    function isAfter (input, units) {
16040        var localInput = isMoment(input) ? input : createLocal(input);
16041        if (!(this.isValid() && localInput.isValid())) {
16042            return false;
16043        }
16044        units = normalizeUnits(units) || 'millisecond';
16045        if (units === 'millisecond') {
16046            return this.valueOf() > localInput.valueOf();
16047        } else {
16048            return localInput.valueOf() < this.clone().startOf(units).valueOf();
16049        }
16050    }
16051
16052    function isBefore (input, units) {
16053        var localInput = isMoment(input) ? input : createLocal(input);
16054        if (!(this.isValid() && localInput.isValid())) {
16055            return false;
16056        }
16057        units = normalizeUnits(units) || 'millisecond';
16058        if (units === 'millisecond') {
16059            return this.valueOf() < localInput.valueOf();
16060        } else {
16061            return this.clone().endOf(units).valueOf() < localInput.valueOf();
16062        }
16063    }
16064
16065    function isBetween (from, to, units, inclusivity) {
16066        var localFrom = isMoment(from) ? from : createLocal(from),
16067            localTo = isMoment(to) ? to : createLocal(to);
16068        if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {
16069            return false;
16070        }
16071        inclusivity = inclusivity || '()';
16072        return (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) &&
16073            (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units));
16074    }
16075
16076    function isSame (input, units) {
16077        var localInput = isMoment(input) ? input : createLocal(input),
16078            inputMs;
16079        if (!(this.isValid() && localInput.isValid())) {
16080            return false;
16081        }
16082        units = normalizeUnits(units) || 'millisecond';
16083        if (units === 'millisecond') {
16084            return this.valueOf() === localInput.valueOf();
16085        } else {
16086            inputMs = localInput.valueOf();
16087            return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();
16088        }
16089    }
16090
16091    function isSameOrAfter (input, units) {
16092        return this.isSame(input, units) || this.isAfter(input, units);
16093    }
16094
16095    function isSameOrBefore (input, units) {
16096        return this.isSame(input, units) || this.isBefore(input, units);
16097    }
16098
16099    function diff (input, units, asFloat) {
16100        var that,
16101            zoneDelta,
16102            output;
16103
16104        if (!this.isValid()) {
16105            return NaN;
16106        }
16107
16108        that = cloneWithOffset(input, this);
16109
16110        if (!that.isValid()) {
16111            return NaN;
16112        }
16113
16114        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
16115
16116        units = normalizeUnits(units);
16117
16118        switch (units) {
16119            case 'year': output = monthDiff(this, that) / 12; break;
16120            case 'month': output = monthDiff(this, that); break;
16121            case 'quarter': output = monthDiff(this, that) / 3; break;
16122            case 'second': output = (this - that) / 1e3; break; // 1000
16123            case 'minute': output = (this - that) / 6e4; break; // 1000 * 60
16124            case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60
16125            case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst
16126            case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst
16127            default: output = this - that;
16128        }
16129
16130        return asFloat ? output : absFloor(output);
16131    }
16132
16133    function monthDiff (a, b) {
16134        // difference in months
16135        var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
16136            // b is in (anchor - 1 month, anchor + 1 month)
16137            anchor = a.clone().add(wholeMonthDiff, 'months'),
16138            anchor2, adjust;
16139
16140        if (b - anchor < 0) {
16141            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
16142            // linear across the month
16143            adjust = (b - anchor) / (anchor - anchor2);
16144        } else {
16145            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
16146            // linear across the month
16147            adjust = (b - anchor) / (anchor2 - anchor);
16148        }
16149
16150        //check for negative zero, return zero if negative zero
16151        return -(wholeMonthDiff + adjust) || 0;
16152    }
16153
16154    hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
16155    hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
16156
16157    function toString () {
16158        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
16159    }
16160
16161    function toISOString(keepOffset) {
16162        if (!this.isValid()) {
16163            return null;
16164        }
16165        var utc = keepOffset !== true;
16166        var m = utc ? this.clone().utc() : this;
16167        if (m.year() < 0 || m.year() > 9999) {
16168            return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');
16169        }
16170        if (isFunction(Date.prototype.toISOString)) {
16171            // native implementation is ~50x faster, use it when we can
16172            if (utc) {
16173                return this.toDate().toISOString();
16174            } else {
16175                return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));
16176            }
16177        }
16178        return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');
16179    }
16180
16181    /**
16182     * Return a human readable representation of a moment that can
16183     * also be evaluated to get a new moment which is the same
16184     *
16185     * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
16186     */
16187    function inspect () {
16188        if (!this.isValid()) {
16189            return 'moment.invalid(/* ' + this._i + ' */)';
16190        }
16191        var func = 'moment';
16192        var zone = '';
16193        if (!this.isLocal()) {
16194            func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
16195            zone = 'Z';
16196        }
16197        var prefix = '[' + func + '("]';
16198        var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';
16199        var datetime = '-MM-DD[T]HH:mm:ss.SSS';
16200        var suffix = zone + '[")]';
16201
16202        return this.format(prefix + year + datetime + suffix);
16203    }
16204
16205    function format (inputString) {
16206        if (!inputString) {
16207            inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;
16208        }
16209        var output = formatMoment(this, inputString);
16210        return this.localeData().postformat(output);
16211    }
16212
16213    function from (time, withoutSuffix) {
16214        if (this.isValid() &&
16215                ((isMoment(time) && time.isValid()) ||
16216                 createLocal(time).isValid())) {
16217            return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
16218        } else {
16219            return this.localeData().invalidDate();
16220        }
16221    }
16222
16223    function fromNow (withoutSuffix) {
16224        return this.from(createLocal(), withoutSuffix);
16225    }
16226
16227    function to (time, withoutSuffix) {
16228        if (this.isValid() &&
16229                ((isMoment(time) && time.isValid()) ||
16230                 createLocal(time).isValid())) {
16231            return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
16232        } else {
16233            return this.localeData().invalidDate();
16234        }
16235    }
16236
16237    function toNow (withoutSuffix) {
16238        return this.to(createLocal(), withoutSuffix);
16239    }
16240
16241    // If passed a locale key, it will set the locale for this
16242    // instance.  Otherwise, it will return the locale configuration
16243    // variables for this instance.
16244    function locale (key) {
16245        var newLocaleData;
16246
16247        if (key === undefined) {
16248            return this._locale._abbr;
16249        } else {
16250            newLocaleData = getLocale(key);
16251            if (newLocaleData != null) {
16252                this._locale = newLocaleData;
16253            }
16254            return this;
16255        }
16256    }
16257
16258    var lang = deprecate(
16259        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
16260        function (key) {
16261            if (key === undefined) {
16262                return this.localeData();
16263            } else {
16264                return this.locale(key);
16265            }
16266        }
16267    );
16268
16269    function localeData () {
16270        return this._locale;
16271    }
16272
16273    var MS_PER_SECOND = 1000;
16274    var MS_PER_MINUTE = 60 * MS_PER_SECOND;
16275    var MS_PER_HOUR = 60 * MS_PER_MINUTE;
16276    var MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;
16277
16278    // actual modulo - handles negative numbers (for dates before 1970):
16279    function mod$1(dividend, divisor) {
16280        return (dividend % divisor + divisor) % divisor;
16281    }
16282
16283    function localStartOfDate(y, m, d) {
16284        // the date constructor remaps years 0-99 to 1900-1999
16285        if (y < 100 && y >= 0) {
16286            // preserve leap years using a full 400 year cycle, then reset
16287            return new Date(y + 400, m, d) - MS_PER_400_YEARS;
16288        } else {
16289            return new Date(y, m, d).valueOf();
16290        }
16291    }
16292
16293    function utcStartOfDate(y, m, d) {
16294        // Date.UTC remaps years 0-99 to 1900-1999
16295        if (y < 100 && y >= 0) {
16296            // preserve leap years using a full 400 year cycle, then reset
16297            return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;
16298        } else {
16299            return Date.UTC(y, m, d);
16300        }
16301    }
16302
16303    function startOf (units) {
16304        var time;
16305        units = normalizeUnits(units);
16306        if (units === undefined || units === 'millisecond' || !this.isValid()) {
16307            return this;
16308        }
16309
16310        var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
16311
16312        switch (units) {
16313            case 'year':
16314                time = startOfDate(this.year(), 0, 1);
16315                break;
16316            case 'quarter':
16317                time = startOfDate(this.year(), this.month() - this.month() % 3, 1);
16318                break;
16319            case 'month':
16320                time = startOfDate(this.year(), this.month(), 1);
16321                break;
16322            case 'week':
16323                time = startOfDate(this.year(), this.month(), this.date() - this.weekday());
16324                break;
16325            case 'isoWeek':
16326                time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1));
16327                break;
16328            case 'day':
16329            case 'date':
16330                time = startOfDate(this.year(), this.month(), this.date());
16331                break;
16332            case 'hour':
16333                time = this._d.valueOf();
16334                time -= mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR);
16335                break;
16336            case 'minute':
16337                time = this._d.valueOf();
16338                time -= mod$1(time, MS_PER_MINUTE);
16339                break;
16340            case 'second':
16341                time = this._d.valueOf();
16342                time -= mod$1(time, MS_PER_SECOND);
16343                break;
16344        }
16345
16346        this._d.setTime(time);
16347        hooks.updateOffset(this, true);
16348        return this;
16349    }
16350
16351    function endOf (units) {
16352        var time;
16353        units = normalizeUnits(units);
16354        if (units === undefined || units === 'millisecond' || !this.isValid()) {
16355            return this;
16356        }
16357
16358        var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;
16359
16360        switch (units) {
16361            case 'year':
16362                time = startOfDate(this.year() + 1, 0, 1) - 1;
16363                break;
16364            case 'quarter':
16365                time = startOfDate(this.year(), this.month() - this.month() % 3 + 3, 1) - 1;
16366                break;
16367            case 'month':
16368                time = startOfDate(this.year(), this.month() + 1, 1) - 1;
16369                break;
16370            case 'week':
16371                time = startOfDate(this.year(), this.month(), this.date() - this.weekday() + 7) - 1;
16372                break;
16373            case 'isoWeek':
16374                time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7) - 1;
16375                break;
16376            case 'day':
16377            case 'date':
16378                time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;
16379                break;
16380            case 'hour':
16381                time = this._d.valueOf();
16382                time += MS_PER_HOUR - mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR) - 1;
16383                break;
16384            case 'minute':
16385                time = this._d.valueOf();
16386                time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;
16387                break;
16388            case 'second':
16389                time = this._d.valueOf();
16390                time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;
16391                break;
16392        }
16393
16394        this._d.setTime(time);
16395        hooks.updateOffset(this, true);
16396        return this;
16397    }
16398
16399    function valueOf () {
16400        return this._d.valueOf() - ((this._offset || 0) * 60000);
16401    }
16402
16403    function unix () {
16404        return Math.floor(this.valueOf() / 1000);
16405    }
16406
16407    function toDate () {
16408        return new Date(this.valueOf());
16409    }
16410
16411    function toArray () {
16412        var m = this;
16413        return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
16414    }
16415
16416    function toObject () {
16417        var m = this;
16418        return {
16419            years: m.year(),
16420            months: m.month(),
16421            date: m.date(),
16422            hours: m.hours(),
16423            minutes: m.minutes(),
16424            seconds: m.seconds(),
16425            milliseconds: m.milliseconds()
16426        };
16427    }
16428
16429    function toJSON () {
16430        // new Date(NaN).toJSON() === null
16431        return this.isValid() ? this.toISOString() : null;
16432    }
16433
16434    function isValid$2 () {
16435        return isValid(this);
16436    }
16437
16438    function parsingFlags () {
16439        return extend({}, getParsingFlags(this));
16440    }
16441
16442    function invalidAt () {
16443        return getParsingFlags(this).overflow;
16444    }
16445
16446    function creationData() {
16447        return {
16448            input: this._i,
16449            format: this._f,
16450            locale: this._locale,
16451            isUTC: this._isUTC,
16452            strict: this._strict
16453        };
16454    }
16455
16456    // FORMATTING
16457
16458    addFormatToken(0, ['gg', 2], 0, function () {
16459        return this.weekYear() % 100;
16460    });
16461
16462    addFormatToken(0, ['GG', 2], 0, function () {
16463        return this.isoWeekYear() % 100;
16464    });
16465
16466    function addWeekYearFormatToken (token, getter) {
16467        addFormatToken(0, [token, token.length], 0, getter);
16468    }
16469
16470    addWeekYearFormatToken('gggg',     'weekYear');
16471    addWeekYearFormatToken('ggggg',    'weekYear');
16472    addWeekYearFormatToken('GGGG',  'isoWeekYear');
16473    addWeekYearFormatToken('GGGGG', 'isoWeekYear');
16474
16475    // ALIASES
16476
16477    addUnitAlias('weekYear', 'gg');
16478    addUnitAlias('isoWeekYear', 'GG');
16479
16480    // PRIORITY
16481
16482    addUnitPriority('weekYear', 1);
16483    addUnitPriority('isoWeekYear', 1);
16484
16485
16486    // PARSING
16487
16488    addRegexToken('G',      matchSigned);
16489    addRegexToken('g',      matchSigned);
16490    addRegexToken('GG',     match1to2, match2);
16491    addRegexToken('gg',     match1to2, match2);
16492    addRegexToken('GGGG',   match1to4, match4);
16493    addRegexToken('gggg',   match1to4, match4);
16494    addRegexToken('GGGGG',  match1to6, match6);
16495    addRegexToken('ggggg',  match1to6, match6);
16496
16497    addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
16498        week[token.substr(0, 2)] = toInt(input);
16499    });
16500
16501    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
16502        week[token] = hooks.parseTwoDigitYear(input);
16503    });
16504
16505    // MOMENTS
16506
16507    function getSetWeekYear (input) {
16508        return getSetWeekYearHelper.call(this,
16509                input,
16510                this.week(),
16511                this.weekday(),
16512                this.localeData()._week.dow,
16513                this.localeData()._week.doy);
16514    }
16515
16516    function getSetISOWeekYear (input) {
16517        return getSetWeekYearHelper.call(this,
16518                input, this.isoWeek(), this.isoWeekday(), 1, 4);
16519    }
16520
16521    function getISOWeeksInYear () {
16522        return weeksInYear(this.year(), 1, 4);
16523    }
16524
16525    function getWeeksInYear () {
16526        var weekInfo = this.localeData()._week;
16527        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
16528    }
16529
16530    function getSetWeekYearHelper(input, week, weekday, dow, doy) {
16531        var weeksTarget;
16532        if (input == null) {
16533            return weekOfYear(this, dow, doy).year;
16534        } else {
16535            weeksTarget = weeksInYear(input, dow, doy);
16536            if (week > weeksTarget) {
16537                week = weeksTarget;
16538            }
16539            return setWeekAll.call(this, input, week, weekday, dow, doy);
16540        }
16541    }
16542
16543    function setWeekAll(weekYear, week, weekday, dow, doy) {
16544        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
16545            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
16546
16547        this.year(date.getUTCFullYear());
16548        this.month(date.getUTCMonth());
16549        this.date(date.getUTCDate());
16550        return this;
16551    }
16552
16553    // FORMATTING
16554
16555    addFormatToken('Q', 0, 'Qo', 'quarter');
16556
16557    // ALIASES
16558
16559    addUnitAlias('quarter', 'Q');
16560
16561    // PRIORITY
16562
16563    addUnitPriority('quarter', 7);
16564
16565    // PARSING
16566
16567    addRegexToken('Q', match1);
16568    addParseToken('Q', function (input, array) {
16569        array[MONTH] = (toInt(input) - 1) * 3;
16570    });
16571
16572    // MOMENTS
16573
16574    function getSetQuarter (input) {
16575        return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
16576    }
16577
16578    // FORMATTING
16579
16580    addFormatToken('D', ['DD', 2], 'Do', 'date');
16581
16582    // ALIASES
16583
16584    addUnitAlias('date', 'D');
16585
16586    // PRIORITY
16587    addUnitPriority('date', 9);
16588
16589    // PARSING
16590
16591    addRegexToken('D',  match1to2);
16592    addRegexToken('DD', match1to2, match2);
16593    addRegexToken('Do', function (isStrict, locale) {
16594        // TODO: Remove "ordinalParse" fallback in next major release.
16595        return isStrict ?
16596          (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :
16597          locale._dayOfMonthOrdinalParseLenient;
16598    });
16599
16600    addParseToken(['D', 'DD'], DATE);
16601    addParseToken('Do', function (input, array) {
16602        array[DATE] = toInt(input.match(match1to2)[0]);
16603    });
16604
16605    // MOMENTS
16606
16607    var getSetDayOfMonth = makeGetSet('Date', true);
16608
16609    // FORMATTING
16610
16611    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
16612
16613    // ALIASES
16614
16615    addUnitAlias('dayOfYear', 'DDD');
16616
16617    // PRIORITY
16618    addUnitPriority('dayOfYear', 4);
16619
16620    // PARSING
16621
16622    addRegexToken('DDD',  match1to3);
16623    addRegexToken('DDDD', match3);
16624    addParseToken(['DDD', 'DDDD'], function (input, array, config) {
16625        config._dayOfYear = toInt(input);
16626    });
16627
16628    // HELPERS
16629
16630    // MOMENTS
16631
16632    function getSetDayOfYear (input) {
16633        var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
16634        return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
16635    }
16636
16637    // FORMATTING
16638
16639    addFormatToken('m', ['mm', 2], 0, 'minute');
16640
16641    // ALIASES
16642
16643    addUnitAlias('minute', 'm');
16644
16645    // PRIORITY
16646
16647    addUnitPriority('minute', 14);
16648
16649    // PARSING
16650
16651    addRegexToken('m',  match1to2);
16652    addRegexToken('mm', match1to2, match2);
16653    addParseToken(['m', 'mm'], MINUTE);
16654
16655    // MOMENTS
16656
16657    var getSetMinute = makeGetSet('Minutes', false);
16658
16659    // FORMATTING
16660
16661    addFormatToken('s', ['ss', 2], 0, 'second');
16662
16663    // ALIASES
16664
16665    addUnitAlias('second', 's');
16666
16667    // PRIORITY
16668
16669    addUnitPriority('second', 15);
16670
16671    // PARSING
16672
16673    addRegexToken('s',  match1to2);
16674    addRegexToken('ss', match1to2, match2);
16675    addParseToken(['s', 'ss'], SECOND);
16676
16677    // MOMENTS
16678
16679    var getSetSecond = makeGetSet('Seconds', false);
16680
16681    // FORMATTING
16682
16683    addFormatToken('S', 0, 0, function () {
16684        return ~~(this.millisecond() / 100);
16685    });
16686
16687    addFormatToken(0, ['SS', 2], 0, function () {
16688        return ~~(this.millisecond() / 10);
16689    });
16690
16691    addFormatToken(0, ['SSS', 3], 0, 'millisecond');
16692    addFormatToken(0, ['SSSS', 4], 0, function () {
16693        return this.millisecond() * 10;
16694    });
16695    addFormatToken(0, ['SSSSS', 5], 0, function () {
16696        return this.millisecond() * 100;
16697    });
16698    addFormatToken(0, ['SSSSSS', 6], 0, function () {
16699        return this.millisecond() * 1000;
16700    });
16701    addFormatToken(0, ['SSSSSSS', 7], 0, function () {
16702        return this.millisecond() * 10000;
16703    });
16704    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
16705        return this.millisecond() * 100000;
16706    });
16707    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
16708        return this.millisecond() * 1000000;
16709    });
16710
16711
16712    // ALIASES
16713
16714    addUnitAlias('millisecond', 'ms');
16715
16716    // PRIORITY
16717
16718    addUnitPriority('millisecond', 16);
16719
16720    // PARSING
16721
16722    addRegexToken('S',    match1to3, match1);
16723    addRegexToken('SS',   match1to3, match2);
16724    addRegexToken('SSS',  match1to3, match3);
16725
16726    var token;
16727    for (token = 'SSSS'; token.length <= 9; token += 'S') {
16728        addRegexToken(token, matchUnsigned);
16729    }
16730
16731    function parseMs(input, array) {
16732        array[MILLISECOND] = toInt(('0.' + input) * 1000);
16733    }
16734
16735    for (token = 'S'; token.length <= 9; token += 'S') {
16736        addParseToken(token, parseMs);
16737    }
16738    // MOMENTS
16739
16740    var getSetMillisecond = makeGetSet('Milliseconds', false);
16741
16742    // FORMATTING
16743
16744    addFormatToken('z',  0, 0, 'zoneAbbr');
16745    addFormatToken('zz', 0, 0, 'zoneName');
16746
16747    // MOMENTS
16748
16749    function getZoneAbbr () {
16750        return this._isUTC ? 'UTC' : '';
16751    }
16752
16753    function getZoneName () {
16754        return this._isUTC ? 'Coordinated Universal Time' : '';
16755    }
16756
16757    var proto = Moment.prototype;
16758
16759    proto.add               = add;
16760    proto.calendar          = calendar$1;
16761    proto.clone             = clone;
16762    proto.diff              = diff;
16763    proto.endOf             = endOf;
16764    proto.format            = format;
16765    proto.from              = from;
16766    proto.fromNow           = fromNow;
16767    proto.to                = to;
16768    proto.toNow             = toNow;
16769    proto.get               = stringGet;
16770    proto.invalidAt         = invalidAt;
16771    proto.isAfter           = isAfter;
16772    proto.isBefore          = isBefore;
16773    proto.isBetween         = isBetween;
16774    proto.isSame            = isSame;
16775    proto.isSameOrAfter     = isSameOrAfter;
16776    proto.isSameOrBefore    = isSameOrBefore;
16777    proto.isValid           = isValid$2;
16778    proto.lang              = lang;
16779    proto.locale            = locale;
16780    proto.localeData        = localeData;
16781    proto.max               = prototypeMax;
16782    proto.min               = prototypeMin;
16783    proto.parsingFlags      = parsingFlags;
16784    proto.set               = stringSet;
16785    proto.startOf           = startOf;
16786    proto.subtract          = subtract;
16787    proto.toArray           = toArray;
16788    proto.toObject          = toObject;
16789    proto.toDate            = toDate;
16790    proto.toISOString       = toISOString;
16791    proto.inspect           = inspect;
16792    proto.toJSON            = toJSON;
16793    proto.toString          = toString;
16794    proto.unix              = unix;
16795    proto.valueOf           = valueOf;
16796    proto.creationData      = creationData;
16797    proto.year       = getSetYear;
16798    proto.isLeapYear = getIsLeapYear;
16799    proto.weekYear    = getSetWeekYear;
16800    proto.isoWeekYear = getSetISOWeekYear;
16801    proto.quarter = proto.quarters = getSetQuarter;
16802    proto.month       = getSetMonth;
16803    proto.daysInMonth = getDaysInMonth;
16804    proto.week           = proto.weeks        = getSetWeek;
16805    proto.isoWeek        = proto.isoWeeks     = getSetISOWeek;
16806    proto.weeksInYear    = getWeeksInYear;
16807    proto.isoWeeksInYear = getISOWeeksInYear;
16808    proto.date       = getSetDayOfMonth;
16809    proto.day        = proto.days             = getSetDayOfWeek;
16810    proto.weekday    = getSetLocaleDayOfWeek;
16811    proto.isoWeekday = getSetISODayOfWeek;
16812    proto.dayOfYear  = getSetDayOfYear;
16813    proto.hour = proto.hours = getSetHour;
16814    proto.minute = proto.minutes = getSetMinute;
16815    proto.second = proto.seconds = getSetSecond;
16816    proto.millisecond = proto.milliseconds = getSetMillisecond;
16817    proto.utcOffset            = getSetOffset;
16818    proto.utc                  = setOffsetToUTC;
16819    proto.local                = setOffsetToLocal;
16820    proto.parseZone            = setOffsetToParsedOffset;
16821    proto.hasAlignedHourOffset = hasAlignedHourOffset;
16822    proto.isDST                = isDaylightSavingTime;
16823    proto.isLocal              = isLocal;
16824    proto.isUtcOffset          = isUtcOffset;
16825    proto.isUtc                = isUtc;
16826    proto.isUTC                = isUtc;
16827    proto.zoneAbbr = getZoneAbbr;
16828    proto.zoneName = getZoneName;
16829    proto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
16830    proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
16831    proto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);
16832    proto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);
16833    proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);
16834
16835    function createUnix (input) {
16836        return createLocal(input * 1000);
16837    }
16838
16839    function createInZone () {
16840        return createLocal.apply(null, arguments).parseZone();
16841    }
16842
16843    function preParsePostFormat (string) {
16844        return string;
16845    }
16846
16847    var proto$1 = Locale.prototype;
16848
16849    proto$1.calendar        = calendar;
16850    proto$1.longDateFormat  = longDateFormat;
16851    proto$1.invalidDate     = invalidDate;
16852    proto$1.ordinal         = ordinal;
16853    proto$1.preparse        = preParsePostFormat;
16854    proto$1.postformat      = preParsePostFormat;
16855    proto$1.relativeTime    = relativeTime;
16856    proto$1.pastFuture      = pastFuture;
16857    proto$1.set             = set;
16858
16859    proto$1.months            =        localeMonths;
16860    proto$1.monthsShort       =        localeMonthsShort;
16861    proto$1.monthsParse       =        localeMonthsParse;
16862    proto$1.monthsRegex       = monthsRegex;
16863    proto$1.monthsShortRegex  = monthsShortRegex;
16864    proto$1.week = localeWeek;
16865    proto$1.firstDayOfYear = localeFirstDayOfYear;
16866    proto$1.firstDayOfWeek = localeFirstDayOfWeek;
16867
16868    proto$1.weekdays       =        localeWeekdays;
16869    proto$1.weekdaysMin    =        localeWeekdaysMin;
16870    proto$1.weekdaysShort  =        localeWeekdaysShort;
16871    proto$1.weekdaysParse  =        localeWeekdaysParse;
16872
16873    proto$1.weekdaysRegex       =        weekdaysRegex;
16874    proto$1.weekdaysShortRegex  =        weekdaysShortRegex;
16875    proto$1.weekdaysMinRegex    =        weekdaysMinRegex;
16876
16877    proto$1.isPM = localeIsPM;
16878    proto$1.meridiem = localeMeridiem;
16879
16880    function get$1 (format, index, field, setter) {
16881        var locale = getLocale();
16882        var utc = createUTC().set(setter, index);
16883        return locale[field](utc, format);
16884    }
16885
16886    function listMonthsImpl (format, index, field) {
16887        if (isNumber(format)) {
16888            index = format;
16889            format = undefined;
16890        }
16891
16892        format = format || '';
16893
16894        if (index != null) {
16895            return get$1(format, index, field, 'month');
16896        }
16897
16898        var i;
16899        var out = [];
16900        for (i = 0; i < 12; i++) {
16901            out[i] = get$1(format, i, field, 'month');
16902        }
16903        return out;
16904    }
16905
16906    // ()
16907    // (5)
16908    // (fmt, 5)
16909    // (fmt)
16910    // (true)
16911    // (true, 5)
16912    // (true, fmt, 5)
16913    // (true, fmt)
16914    function listWeekdaysImpl (localeSorted, format, index, field) {
16915        if (typeof localeSorted === 'boolean') {
16916            if (isNumber(format)) {
16917                index = format;
16918                format = undefined;
16919            }
16920
16921            format = format || '';
16922        } else {
16923            format = localeSorted;
16924            index = format;
16925            localeSorted = false;
16926
16927            if (isNumber(format)) {
16928                index = format;
16929                format = undefined;
16930            }
16931
16932            format = format || '';
16933        }
16934
16935        var locale = getLocale(),
16936            shift = localeSorted ? locale._week.dow : 0;
16937
16938        if (index != null) {
16939            return get$1(format, (index + shift) % 7, field, 'day');
16940        }
16941
16942        var i;
16943        var out = [];
16944        for (i = 0; i < 7; i++) {
16945            out[i] = get$1(format, (i + shift) % 7, field, 'day');
16946        }
16947        return out;
16948    }
16949
16950    function listMonths (format, index) {
16951        return listMonthsImpl(format, index, 'months');
16952    }
16953
16954    function listMonthsShort (format, index) {
16955        return listMonthsImpl(format, index, 'monthsShort');
16956    }
16957
16958    function listWeekdays (localeSorted, format, index) {
16959        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
16960    }
16961
16962    function listWeekdaysShort (localeSorted, format, index) {
16963        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
16964    }
16965
16966    function listWeekdaysMin (localeSorted, format, index) {
16967        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
16968    }
16969
16970    getSetGlobalLocale('en', {
16971        dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
16972        ordinal : function (number) {
16973            var b = number % 10,
16974                output = (toInt(number % 100 / 10) === 1) ? 'th' :
16975                (b === 1) ? 'st' :
16976                (b === 2) ? 'nd' :
16977                (b === 3) ? 'rd' : 'th';
16978            return number + output;
16979        }
16980    });
16981
16982    // Side effect imports
16983
16984    hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);
16985    hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);
16986
16987    var mathAbs = Math.abs;
16988
16989    function abs () {
16990        var data           = this._data;
16991
16992        this._milliseconds = mathAbs(this._milliseconds);
16993        this._days         = mathAbs(this._days);
16994        this._months       = mathAbs(this._months);
16995
16996        data.milliseconds  = mathAbs(data.milliseconds);
16997        data.seconds       = mathAbs(data.seconds);
16998        data.minutes       = mathAbs(data.minutes);
16999        data.hours         = mathAbs(data.hours);
17000        data.months        = mathAbs(data.months);
17001        data.years         = mathAbs(data.years);
17002
17003        return this;
17004    }
17005
17006    function addSubtract$1 (duration, input, value, direction) {
17007        var other = createDuration(input, value);
17008
17009        duration._milliseconds += direction * other._milliseconds;
17010        duration._days         += direction * other._days;
17011        duration._months       += direction * other._months;
17012
17013        return duration._bubble();
17014    }
17015
17016    // supports only 2.0-style add(1, 's') or add(duration)
17017    function add$1 (input, value) {
17018        return addSubtract$1(this, input, value, 1);
17019    }
17020
17021    // supports only 2.0-style subtract(1, 's') or subtract(duration)
17022    function subtract$1 (input, value) {
17023        return addSubtract$1(this, input, value, -1);
17024    }
17025
17026    function absCeil (number) {
17027        if (number < 0) {
17028            return Math.floor(number);
17029        } else {
17030            return Math.ceil(number);
17031        }
17032    }
17033
17034    function bubble () {
17035        var milliseconds = this._milliseconds;
17036        var days         = this._days;
17037        var months       = this._months;
17038        var data         = this._data;
17039        var seconds, minutes, hours, years, monthsFromDays;
17040
17041        // if we have a mix of positive and negative values, bubble down first
17042        // check: https://github.com/moment/moment/issues/2166
17043        if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||
17044                (milliseconds <= 0 && days <= 0 && months <= 0))) {
17045            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
17046            days = 0;
17047            months = 0;
17048        }
17049
17050        // The following code bubbles up values, see the tests for
17051        // examples of what that means.
17052        data.milliseconds = milliseconds % 1000;
17053
17054        seconds           = absFloor(milliseconds / 1000);
17055        data.seconds      = seconds % 60;
17056
17057        minutes           = absFloor(seconds / 60);
17058        data.minutes      = minutes % 60;
17059
17060        hours             = absFloor(minutes / 60);
17061        data.hours        = hours % 24;
17062
17063        days += absFloor(hours / 24);
17064
17065        // convert days to months
17066        monthsFromDays = absFloor(daysToMonths(days));
17067        months += monthsFromDays;
17068        days -= absCeil(monthsToDays(monthsFromDays));
17069
17070        // 12 months -> 1 year
17071        years = absFloor(months / 12);
17072        months %= 12;
17073
17074        data.days   = days;
17075        data.months = months;
17076        data.years  = years;
17077
17078        return this;
17079    }
17080
17081    function daysToMonths (days) {
17082        // 400 years have 146097 days (taking into account leap year rules)
17083        // 400 years have 12 months === 4800
17084        return days * 4800 / 146097;
17085    }
17086
17087    function monthsToDays (months) {
17088        // the reverse of daysToMonths
17089        return months * 146097 / 4800;
17090    }
17091
17092    function as (units) {
17093        if (!this.isValid()) {
17094            return NaN;
17095        }
17096        var days;
17097        var months;
17098        var milliseconds = this._milliseconds;
17099
17100        units = normalizeUnits(units);
17101
17102        if (units === 'month' || units === 'quarter' || units === 'year') {
17103            days = this._days + milliseconds / 864e5;
17104            months = this._months + daysToMonths(days);
17105            switch (units) {
17106                case 'month':   return months;
17107                case 'quarter': return months / 3;
17108                case 'year':    return months / 12;
17109            }
17110        } else {
17111            // handle milliseconds separately because of floating point math errors (issue #1867)
17112            days = this._days + Math.round(monthsToDays(this._months));
17113            switch (units) {
17114                case 'week'   : return days / 7     + milliseconds / 6048e5;
17115                case 'day'    : return days         + milliseconds / 864e5;
17116                case 'hour'   : return days * 24    + milliseconds / 36e5;
17117                case 'minute' : return days * 1440  + milliseconds / 6e4;
17118                case 'second' : return days * 86400 + milliseconds / 1000;
17119                // Math.floor prevents floating point math errors here
17120                case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
17121                default: throw new Error('Unknown unit ' + units);
17122            }
17123        }
17124    }
17125
17126    // TODO: Use this.as('ms')?
17127    function valueOf$1 () {
17128        if (!this.isValid()) {
17129            return NaN;
17130        }
17131        return (
17132            this._milliseconds +
17133            this._days * 864e5 +
17134            (this._months % 12) * 2592e6 +
17135            toInt(this._months / 12) * 31536e6
17136        );
17137    }
17138
17139    function makeAs (alias) {
17140        return function () {
17141            return this.as(alias);
17142        };
17143    }
17144
17145    var asMilliseconds = makeAs('ms');
17146    var asSeconds      = makeAs('s');
17147    var asMinutes      = makeAs('m');
17148    var asHours        = makeAs('h');
17149    var asDays         = makeAs('d');
17150    var asWeeks        = makeAs('w');
17151    var asMonths       = makeAs('M');
17152    var asQuarters     = makeAs('Q');
17153    var asYears        = makeAs('y');
17154
17155    function clone$1 () {
17156        return createDuration(this);
17157    }
17158
17159    function get$2 (units) {
17160        units = normalizeUnits(units);
17161        return this.isValid() ? this[units + 's']() : NaN;
17162    }
17163
17164    function makeGetter(name) {
17165        return function () {
17166            return this.isValid() ? this._data[name] : NaN;
17167        };
17168    }
17169
17170    var milliseconds = makeGetter('milliseconds');
17171    var seconds      = makeGetter('seconds');
17172    var minutes      = makeGetter('minutes');
17173    var hours        = makeGetter('hours');
17174    var days         = makeGetter('days');
17175    var months       = makeGetter('months');
17176    var years        = makeGetter('years');
17177
17178    function weeks () {
17179        return absFloor(this.days() / 7);
17180    }
17181
17182    var round = Math.round;
17183    var thresholds = {
17184        ss: 44,         // a few seconds to seconds
17185        s : 45,         // seconds to minute
17186        m : 45,         // minutes to hour
17187        h : 22,         // hours to day
17188        d : 26,         // days to month
17189        M : 11          // months to year
17190    };
17191
17192    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
17193    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
17194        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
17195    }
17196
17197    function relativeTime$1 (posNegDuration, withoutSuffix, locale) {
17198        var duration = createDuration(posNegDuration).abs();
17199        var seconds  = round(duration.as('s'));
17200        var minutes  = round(duration.as('m'));
17201        var hours    = round(duration.as('h'));
17202        var days     = round(duration.as('d'));
17203        var months   = round(duration.as('M'));
17204        var years    = round(duration.as('y'));
17205
17206        var a = seconds <= thresholds.ss && ['s', seconds]  ||
17207                seconds < thresholds.s   && ['ss', seconds] ||
17208                minutes <= 1             && ['m']           ||
17209                minutes < thresholds.m   && ['mm', minutes] ||
17210                hours   <= 1             && ['h']           ||
17211                hours   < thresholds.h   && ['hh', hours]   ||
17212                days    <= 1             && ['d']           ||
17213                days    < thresholds.d   && ['dd', days]    ||
17214                months  <= 1             && ['M']           ||
17215                months  < thresholds.M   && ['MM', months]  ||
17216                years   <= 1             && ['y']           || ['yy', years];
17217
17218        a[2] = withoutSuffix;
17219        a[3] = +posNegDuration > 0;
17220        a[4] = locale;
17221        return substituteTimeAgo.apply(null, a);
17222    }
17223
17224    // This function allows you to set the rounding function for relative time strings
17225    function getSetRelativeTimeRounding (roundingFunction) {
17226        if (roundingFunction === undefined) {
17227            return round;
17228        }
17229        if (typeof(roundingFunction) === 'function') {
17230            round = roundingFunction;
17231            return true;
17232        }
17233        return false;
17234    }
17235
17236    // This function allows you to set a threshold for relative time strings
17237    function getSetRelativeTimeThreshold (threshold, limit) {
17238        if (thresholds[threshold] === undefined) {
17239            return false;
17240        }
17241        if (limit === undefined) {
17242            return thresholds[threshold];
17243        }
17244        thresholds[threshold] = limit;
17245        if (threshold === 's') {
17246            thresholds.ss = limit - 1;
17247        }
17248        return true;
17249    }
17250
17251    function humanize (withSuffix) {
17252        if (!this.isValid()) {
17253            return this.localeData().invalidDate();
17254        }
17255
17256        var locale = this.localeData();
17257        var output = relativeTime$1(this, !withSuffix, locale);
17258
17259        if (withSuffix) {
17260            output = locale.pastFuture(+this, output);
17261        }
17262
17263        return locale.postformat(output);
17264    }
17265
17266    var abs$1 = Math.abs;
17267
17268    function sign(x) {
17269        return ((x > 0) - (x < 0)) || +x;
17270    }
17271
17272    function toISOString$1() {
17273        // for ISO strings we do not use the normal bubbling rules:
17274        //  * milliseconds bubble up until they become hours
17275        //  * days do not bubble at all
17276        //  * months bubble up until they become years
17277        // This is because there is no context-free conversion between hours and days
17278        // (think of clock changes)
17279        // and also not between days and months (28-31 days per month)
17280        if (!this.isValid()) {
17281            return this.localeData().invalidDate();
17282        }
17283
17284        var seconds = abs$1(this._milliseconds) / 1000;
17285        var days         = abs$1(this._days);
17286        var months       = abs$1(this._months);
17287        var minutes, hours, years;
17288
17289        // 3600 seconds -> 60 minutes -> 1 hour
17290        minutes           = absFloor(seconds / 60);
17291        hours             = absFloor(minutes / 60);
17292        seconds %= 60;
17293        minutes %= 60;
17294
17295        // 12 months -> 1 year
17296        years  = absFloor(months / 12);
17297        months %= 12;
17298
17299
17300        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
17301        var Y = years;
17302        var M = months;
17303        var D = days;
17304        var h = hours;
17305        var m = minutes;
17306        var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';
17307        var total = this.asSeconds();
17308
17309        if (!total) {
17310            // this is the same as C#'s (Noda) and python (isodate)...
17311            // but not other JS (goog.date)
17312            return 'P0D';
17313        }
17314
17315        var totalSign = total < 0 ? '-' : '';
17316        var ymSign = sign(this._months) !== sign(total) ? '-' : '';
17317        var daysSign = sign(this._days) !== sign(total) ? '-' : '';
17318        var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';
17319
17320        return totalSign + 'P' +
17321            (Y ? ymSign + Y + 'Y' : '') +
17322            (M ? ymSign + M + 'M' : '') +
17323            (D ? daysSign + D + 'D' : '') +
17324            ((h || m || s) ? 'T' : '') +
17325            (h ? hmsSign + h + 'H' : '') +
17326            (m ? hmsSign + m + 'M' : '') +
17327            (s ? hmsSign + s + 'S' : '');
17328    }
17329
17330    var proto$2 = Duration.prototype;
17331
17332    proto$2.isValid        = isValid$1;
17333    proto$2.abs            = abs;
17334    proto$2.add            = add$1;
17335    proto$2.subtract       = subtract$1;
17336    proto$2.as             = as;
17337    proto$2.asMilliseconds = asMilliseconds;
17338    proto$2.asSeconds      = asSeconds;
17339    proto$2.asMinutes      = asMinutes;
17340    proto$2.asHours        = asHours;
17341    proto$2.asDays         = asDays;
17342    proto$2.asWeeks        = asWeeks;
17343    proto$2.asMonths       = asMonths;
17344    proto$2.asQuarters     = asQuarters;
17345    proto$2.asYears        = asYears;
17346    proto$2.valueOf        = valueOf$1;
17347    proto$2._bubble        = bubble;
17348    proto$2.clone          = clone$1;
17349    proto$2.get            = get$2;
17350    proto$2.milliseconds   = milliseconds;
17351    proto$2.seconds        = seconds;
17352    proto$2.minutes        = minutes;
17353    proto$2.hours          = hours;
17354    proto$2.days           = days;
17355    proto$2.weeks          = weeks;
17356    proto$2.months         = months;
17357    proto$2.years          = years;
17358    proto$2.humanize       = humanize;
17359    proto$2.toISOString    = toISOString$1;
17360    proto$2.toString       = toISOString$1;
17361    proto$2.toJSON         = toISOString$1;
17362    proto$2.locale         = locale;
17363    proto$2.localeData     = localeData;
17364
17365    proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);
17366    proto$2.lang = lang;
17367
17368    // Side effect imports
17369
17370    // FORMATTING
17371
17372    addFormatToken('X', 0, 0, 'unix');
17373    addFormatToken('x', 0, 0, 'valueOf');
17374
17375    // PARSING
17376
17377    addRegexToken('x', matchSigned);
17378    addRegexToken('X', matchTimestamp);
17379    addParseToken('X', function (input, array, config) {
17380        config._d = new Date(parseFloat(input, 10) * 1000);
17381    });
17382    addParseToken('x', function (input, array, config) {
17383        config._d = new Date(toInt(input));
17384    });
17385
17386    // Side effect imports
17387
17388
17389    hooks.version = '2.24.0';
17390
17391    setHookCallback(createLocal);
17392
17393    hooks.fn                    = proto;
17394    hooks.min                   = min;
17395    hooks.max                   = max;
17396    hooks.now                   = now;
17397    hooks.utc                   = createUTC;
17398    hooks.unix                  = createUnix;
17399    hooks.months                = listMonths;
17400    hooks.isDate                = isDate;
17401    hooks.locale                = getSetGlobalLocale;
17402    hooks.invalid               = createInvalid;
17403    hooks.duration              = createDuration;
17404    hooks.isMoment              = isMoment;
17405    hooks.weekdays              = listWeekdays;
17406    hooks.parseZone             = createInZone;
17407    hooks.localeData            = getLocale;
17408    hooks.isDuration            = isDuration;
17409    hooks.monthsShort           = listMonthsShort;
17410    hooks.weekdaysMin           = listWeekdaysMin;
17411    hooks.defineLocale          = defineLocale;
17412    hooks.updateLocale          = updateLocale;
17413    hooks.locales               = listLocales;
17414    hooks.weekdaysShort         = listWeekdaysShort;
17415    hooks.normalizeUnits        = normalizeUnits;
17416    hooks.relativeTimeRounding  = getSetRelativeTimeRounding;
17417    hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
17418    hooks.calendarFormat        = getCalendarFormat;
17419    hooks.prototype             = proto;
17420
17421    // currently HTML5 input type only supports 24-hour formats
17422    hooks.HTML5_FMT = {
17423        DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm',             // <input type="datetime-local" />
17424        DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss',  // <input type="datetime-local" step="1" />
17425        DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS',   // <input type="datetime-local" step="0.001" />
17426        DATE: 'YYYY-MM-DD',                             // <input type="date" />
17427        TIME: 'HH:mm',                                  // <input type="time" />
17428        TIME_SECONDS: 'HH:mm:ss',                       // <input type="time" step="1" />
17429        TIME_MS: 'HH:mm:ss.SSS',                        // <input type="time" step="0.001" />
17430        WEEK: 'GGGG-[W]WW',                             // <input type="week" />
17431        MONTH: 'YYYY-MM'                                // <input type="month" />
17432    };
17433
17434    return hooks;
17435
17436})));
17437
17438/
17438/! moment.js locale configuration
17439
17440;(function (global, factory) {
17441   typeof exports === 'object' && typeof module !== 'undefined'
17442       && typeof require === 'function' ? factory(require('../moment')) :
17443   typeof define === 'function' && define.amd ? define(['../moment'], factory) :
17444   factory(global.moment)
17445}(this, (function (moment) { 'use strict';
17446
17447
17448    var fr = moment.defineLocale('fr', {
17449        months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),
17450        monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),
17451        monthsParseExact : true,
17452        weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),
17453        weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),
17454        weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'),
17455        weekdaysParseExact : true,
17456        longDateFormat : {
17457            LT : 'HH:mm',
17458            LTS : 'HH:mm:ss',
17459            L : 'DD/MM/YYYY',
17460            LL : 'D MMMM YYYY',
17461            LLL : 'D MMMM YYYY HH:mm',
17462            LLLL : 'dddd D MMMM YYYY HH:mm'
17463        },
17464        calendar : {
17465            sameDay : '[Aujourd’hui à] LT',
17466            nextDay : '[Demain à] LT',
17467            nextWeek : 'dddd [à] LT',
17468            lastDay : '[Hier à] LT',
17469            lastWeek : 'dddd [dernier à] LT',
17470            sameElse : 'L'
17471        },
17472        relativeTime : {
17473            future : 'dans %s',
17474            past : 'il y a %s',
17475            s : 'quelques secondes',
17476            ss : '%d secondes',
17477            m : 'une minute',
17478            mm : '%d minutes',
17479            h : 'une heure',
17480            hh : '%d heures',
17481            d : 'un jour',
17482            dd : '%d jours',
17483            M : 'un mois',
17484            MM : '%d mois',
17485            y : 'un an',
17486            yy : '%d ans'
17487        },
17488        dayOfMonthOrdinalParse: /\d{1,2}(er|)/,
17489        ordinal : function (number, period) {
17490            switch (period) {
17491                // TODO: Return 'e' when day of month > 1. Move this case inside
17492                // block for masculine words below.
17493                // See https://github.com/moment/moment/issues/3375
17494                case 'D':
17495                    return number + (number === 1 ? 'er' : '');
17496
17497                // Words with masculine grammatical gender: mois, trimestre, jour
17498                default:
17499                case 'M':
17500                case 'Q':
17501                case 'DDD':
17502                case 'd':
17503                    return number + (number === 1 ? 'er' : 'e');
17504
17505                // Words with feminine grammatical gender: semaine
17506                case 'w':
17507                case 'W':
17508                    return number + (number === 1 ? 're' : 'e');
17509            }
17510        },
17511        week : {
17512            dow : 1, // Monday is the first day of the week.
17513            doy : 4  // The week that contains Jan 4th is the first week of the year.
17514        }
17515    });
17516
17517    return fr;
vendor: 7,387 bytes, lines 17518-17725
17518
17519})));
17520
17521/*!
17522 * Datepicker v1.0.4
17523 * https://fengyuanchen.github.io/datepicker
17524 *
17525 * Copyright 2014-present Chen Fengyuan
17526 * Released under the MIT license
17527 *
17528 * Date: 2019-01-06T02:42:36.188Z
17529 */
17530
17531(function (global, factory) {
17532  typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('jquery')) :
17533  typeof define === 'function' && define.amd ? define(['jquery'], factory) :
17534  (global = global || self, factory(global.jQuery));
17535}(this, function ($) { 'use strict';
17536
17537  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
17538
17539  function _classCallCheck(instance, Constructor) {
17540    if (!(instance instanceof Constructor)) {
17541      throw new TypeError("Cannot call a class as a function");
17542    }
17543  }
17544
17545  function _defineProperties(target, props) {
17546    for (var i = 0; i < props.length; i++) {
17547      var descriptor = props[i];
17548      descriptor.enumerable = descriptor.enumerable || false;
17549      descriptor.configurable = true;
17550      if ("value" in descriptor) descriptor.writable = true;
17551      Object.defineProperty(target, descriptor.key, descriptor);
17552    }
17553  }
17554
17555  function _createClass(Constructor, protoProps, staticProps) {
17556    if (protoProps) _defineProperties(Constructor.prototype, protoProps);
17557    if (staticProps) _defineProperties(Constructor, staticProps);
17558    return Constructor;
17559  }
17560
17561  var DEFAULTS = {
17562    // Show the datepicker automatically when initialized
17563    autoShow: false,
17564    // Hide the datepicker automatically when picked
17565    autoHide: false,
17566    // Pick the initial date automatically when initialized
17567    autoPick: false,
17568    // Enable inline mode
17569    inline: false,
17570    // A element (or selector) for putting the datepicker
17571    container: null,
17572    // A element (or selector) for triggering the datepicker
17573    trigger: null,
17574    // The ISO language code (built-in: en-US)
17575    language: '',
17576    // The date string format
17577    format: 'mm/dd/yyyy',
17578    // The initial date
17579    date: null,
17580    // The start view date
17581    startDate: null,
17582    // The end view date
17583    endDate: null,
17584    // The start view when initialized
17585    startView: 0,
17586    // 0 for days, 1 for months, 2 for years
17587    // The start day of the week
17588    // 0 for Sunday, 1 for Monday, 2 for Tuesday, 3 for Wednesday,
17589    // 4 for Thursday, 5 for Friday, 6 for Saturday
17590    weekStart: 0,
17591    // Show year before month on the datepicker header
17592    yearFirst: false,
17593    // A string suffix to the year number.
17594    yearSuffix: '',
17595    // Days' name of the week.
17596    days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
17597    // Shorter days' name
17598    daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
17599    // Shortest days' name
17600    daysMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
17601    // Months' name
17602    months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
17603    // Shorter months' name
17604    monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
17605    // A element tag for each item of years, months and days
17606    itemTag: 'li',
17607    // A class (CSS) for muted date item
17608    mutedClass: 'muted',
17609    // A class (CSS) for picked date item
17610    pickedClass: 'picked',
17611    // A class (CSS) for disabled date item
17612    disabledClass: 'disabled',
17613    // A class (CSS) for highlight date item
17614    highlightedClass: 'highlighted',
17615    // The template of the datepicker
17616    template: '<div class="datepicker-container">' + '<div class="datepicker-panel" data-view="years picker">' + '<ul>' + '<li data-view="years prev">&lsaquo;</li>' + '<li data-view="years current"></li>' + '<li data-view="years next">&rsaquo;</li>' + '</ul>' + '<ul data-view="years"></ul>' + '</div>' + '<div class="datepicker-panel" data-view="months picker">' + '<ul>' + '<li data-view="year prev">&lsaquo;</li>' + '<li data-view="year current"></li>' + '<li data-view="year next">&rsaquo;</li>' + '</ul>' + '<ul data-view="months"></ul>' + '</div>' + '<div class="datepicker-panel" data-view="days picker">' + '<ul>' + '<li data-view="month prev">&lsaquo;</li>' + '<li data-view="month current"></li>' + '<li data-view="month next">&rsaquo;</li>' + '</ul>' + '<ul data-view="week"></ul>' + '<ul data-view="days"></ul>' + '</div>' + '</div>',
17617    // The offset top or bottom of the datepicker from the element
17618    offset: 10,
17619    // The `z-index` of the datepicker
17620    zIndex: 1000,
17621    // Filter each date item (return `false` to disable a date item)
17622    filter: null,
17623    // Event shortcuts
17624    show: null,
17625    hide: null,
17626    pick: null
17627  };
17628
17629  var WINDOW = typeof window !== 'undefined' ? window : {};
17630  var NAMESPACE = 'datepicker';
17631  var EVENT_CLICK = "click.".concat(NAMESPACE);
17632  var EVENT_FOCUS = "focus.".concat(NAMESPACE);
17633  var EVENT_HIDE = "hide.".concat(NAMESPACE);
17634  var EVENT_KEYUP = "keyup.".concat(NAMESPACE);
17635  var EVENT_PICK = "pick.".concat(NAMESPACE);
17636  var EVENT_RESIZE = "resize.".concat(NAMESPACE);
17637  var EVENT_SCROLL = "scroll.".concat(NAMESPACE);
17638  var EVENT_SHOW = "show.".concat(NAMESPACE);
17639  var CLASS_HIDE = "".concat(NAMESPACE, "-hide");
17640  var LANGUAGES = {};
17641  var VIEWS = {
17642    DAYS: 0,
17643    MONTHS: 1,
17644    YEARS: 2
17645  };
17646
17647  var toString = Object.prototype.toString;
17648  function typeOf(obj) {
17649    return toString.call(obj).slice(8, -1).toLowerCase();
17650  }
17651  function isString(value) {
17652    return typeof value === 'string';
17653  }
17654  var isNaN = Number.isNaN || WINDOW.isNaN;
17655  function isNumber(value) {
17656    return typeof value === 'number' && !isNaN(value);
17657  }
17658  function isUndefined(value) {
17659    return typeof value === 'undefined';
17660  }
17661  function isDate(value) {
17662    return typeOf(value) === 'date' && !isNaN(value.getTime());
17663  }
17664  function proxy(fn, context) {
17665    for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
17666      args[_key - 2] = arguments[_key];
17667    }
17668
17669    return function () {
17670      for (var _len2 = arguments.length, args2 = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
17671        args2[_key2] = arguments[_key2];
17672      }
17673
17674      return fn.apply(context, args.concat(args2));
17675    };
17676  }
17677  function selectorOf(view) {
17678    return "[data-view=\"".concat(view, "\"]");
17679  }
17680  function isLeapYear(year) {
17681    return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
17682  }
17683  function getDaysInMonth(year, month) {
17684    return [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
17685  }
17686  function getMinDay(year, month, day) {
17687    return Math.min(day, getDaysInMonth(year, month));
17688  }
17689  var formatParts = /(y|m|d)+/g;
17690  function parseFormat(format) {
17691    var source = String(format).toLowerCase();
17692    var parts = source.match(formatParts);
17693
17694    if (!parts || parts.length === 0) {
17695      throw new Error('Invalid date format.');
17696    }
17697
17698    format = {
17699      source: source,
17700      parts: parts
17701    };
17702    $.each(parts, function (i, part) {
17703      switch (part) {
17704        case 'dd':
17705        case 'd':
17706          format.hasDay = true;
17707          break;
17708
17709        case 'mm':
17710        case 'm':
17711          format.hasMonth = true;
17712          break;
17713
17714        case 'yyyy':
17715        case 'yy':
17716          format.hasYear = true;
17717          break;
17718
17719        default:
17720      }
17721    });
17722    return format;
17723  }
17724  function getScrollParent(element) {
17725    var includeHidden = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
vendor: 19,618 bytes, lines 17726-18433
17726    var $element = $(element);
17727    var position = $element.css('position');
17728    var excludeStaticParent = position === 'absolute';
17729    var overflowRegex = includeHidden ? /auto|scroll|hidden/ : /auto|scroll/;
17730    var scrollParent = $element.parents().filter(function (index, parent) {
17731      var $parent = $(parent);
17732
17733      if (excludeStaticParent && $parent.css('position') === 'static') {
17734        return false;
17735      }
17736
17737      return overflowRegex.test($parent.css('overflow') + $parent.css('overflow-y') + $parent.css('overflow-x'));
17738    }).eq(0);
17739    return position === 'fixed' || !scrollParent.length ? $(element.ownerDocument || document) : scrollParent;
17740  }
17741  /**
17742   * Add leading zeroes to the given value
17743   * @param {number} value - The value to add.
17744   * @param {number} [length=1] - The expected value length.
17745   * @returns {string} Returns converted value.
17746   */
17747
17748  function addLeadingZero(value) {
17749    var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
17750    var str = String(Math.abs(value));
17751    var i = str.length;
17752    var result = '';
17753
17754    if (value < 0) {
17755      result += '-';
17756    }
17757
17758    while (i < length) {
17759      i += 1;
17760      result += '0';
17761    }
17762
17763    return result + str;
17764  }
17765
17766  var REGEXP_DIGITS = /\d+/g;
17767  var methods = {
17768    // Show the datepicker
17769    show: function show() {
17770      if (!this.built) {
17771        this.build();
17772      }
17773
17774      if (this.shown) {
17775        return;
17776      }
17777
17778      if (this.trigger(EVENT_SHOW).isDefaultPrevented()) {
17779        return;
17780      }
17781
17782      this.shown = true;
17783      this.$picker.removeClass(CLASS_HIDE).on(EVENT_CLICK, $.proxy(this.click, this));
17784      this.showView(this.options.startView);
17785
17786      if (!this.inline) {
17787        this.$scrollParent.on(EVENT_SCROLL, $.proxy(this.place, this));
17788        $(window).on(EVENT_RESIZE, this.onResize = proxy(this.place, this));
17789        $(document).on(EVENT_CLICK, this.onGlobalClick = proxy(this.globalClick, this));
17790        $(document).on(EVENT_KEYUP, this.onGlobalKeyup = proxy(this.globalKeyup, this));
17791        this.place();
17792      }
17793    },
17794    // Hide the datepicker
17795    hide: function hide() {
17796      if (!this.shown) {
17797        return;
17798      }
17799
17800      if (this.trigger(EVENT_HIDE).isDefaultPrevented()) {
17801        return;
17802      }
17803
17804      this.shown = false;
17805      this.$picker.addClass(CLASS_HIDE).off(EVENT_CLICK, this.click);
17806
17807      if (!this.inline) {
17808        this.$scrollParent.off(EVENT_SCROLL, this.place);
17809        $(window).off(EVENT_RESIZE, this.onResize);
17810        $(document).off(EVENT_CLICK, this.onGlobalClick);
17811        $(document).off(EVENT_KEYUP, this.onGlobalKeyup);
17812      }
17813    },
17814    toggle: function toggle() {
17815      if (this.shown) {
17816        this.hide();
17817      } else {
17818        this.show();
17819      }
17820    },
17821    // Update the datepicker with the current input value
17822    update: function update() {
17823      var value = this.getValue();
17824
17825      if (value === this.oldValue) {
17826        return;
17827      }
17828
17829      this.setDate(value, true);
17830      this.oldValue = value;
17831    },
17832
17833    /**
17834     * Pick the current date to the element
17835     *
17836     * @param {String} _view (private)
17837     */
17838    pick: function pick(_view) {
17839      var $this = this.$element;
17840      var date = this.date;
17841
17842      if (this.trigger(EVENT_PICK, {
17843        view: _view || '',
17844        date: date
17845      }).isDefaultPrevented()) {
17846        return;
17847      }
17848
17849      date = this.formatDate(this.date);
17850      this.setValue(date);
17851
17852      if (this.isInput) {
17853        $this.trigger('input');
17854        $this.trigger('change');
17855      }
17856    },
17857    // Reset the datepicker
17858    reset: function reset() {
17859      this.setDate(this.initialDate, true);
17860      this.setValue(this.initialValue);
17861
17862      if (this.shown) {
17863        this.showView(this.options.startView);
17864      }
17865    },
17866
17867    /**
17868     * Get the month name with given argument or the current date
17869     *
17870     * @param {Number} month (optional)
17871     * @param {Boolean} shortForm (optional)
17872     * @return {String} (month name)
17873     */
17874    getMonthName: function getMonthName(month, shortForm) {
17875      var options = this.options;
17876      var monthsShort = options.monthsShort;
17877      var months = options.months;
17878
17879      if ($.isNumeric(month)) {
17880        month = Number(month);
17881      } else if (isUndefined(shortForm)) {
17882        shortForm = month;
17883      }
17884
17885      if (shortForm === true) {
17886        months = monthsShort;
17887      }
17888
17889      return months[isNumber(month) ? month : this.date.getMonth()];
17890    },
17891
17892    /**
17893     * Get the day name with given argument or the current date
17894     *
17895     * @param {Number} day (optional)
17896     * @param {Boolean} shortForm (optional)
17897     * @param {Boolean} min (optional)
17898     * @return {String} (day name)
17899     */
17900    getDayName: function getDayName(day, shortForm, min) {
17901      var options = this.options;
17902      var days = options.days;
17903
17904      if ($.isNumeric(day)) {
17905        day = Number(day);
17906      } else {
17907        if (isUndefined(min)) {
17908          min = shortForm;
17909        }
17910
17911        if (isUndefined(shortForm)) {
17912          shortForm = day;
17913        }
17914      }
17915
17916      if (min) {
17917        days = options.daysMin;
17918      } else if (shortForm) {
17919        days = options.daysShort;
17920      }
17921
17922      return days[isNumber(day) ? day : this.date.getDay()];
17923    },
17924
17925    /**
17926     * Get the current date
17927     *
17928     * @param {Boolean} formatted (optional)
17929     * @return {Date|String} (date)
17930     */
17931    getDate: function getDate(formatted) {
17932      var date = this.date;
17933      return formatted ? this.formatDate(date) : new Date(date);
17934    },
17935
17936    /**
17937     * Set the current date with a new date
17938     *
17939     * @param {Date} date
17940     * @param {Boolean} _updated (private)
17941     */
17942    setDate: function setDate(date, _updated) {
17943      var filter = this.options.filter;
17944
17945      if (isDate(date) || isString(date)) {
17946        date = this.parseDate(date);
17947
17948        if ($.isFunction(filter) && filter.call(this.$element, date, 'day') === false) {
17949          return;
17950        }
17951
17952        this.date = date;
17953        this.viewDate = new Date(date);
17954
17955        if (!_updated) {
17956          this.pick();
17957        }
17958
17959        if (this.built) {
17960          this.render();
17961        }
17962      }
17963    },
17964
17965    /**
17966     * Set the start view date with a new date
17967     *
17968     * @param {Date|string|null} date
17969     */
17970    setStartDate: function setStartDate(date) {
17971      if (isDate(date) || isString(date)) {
17972        this.startDate = this.parseDate(date);
17973      } else {
17974        this.startDate = null;
17975      }
17976
17977      if (this.built) {
17978        this.render();
17979      }
17980    },
17981
17982    /**
17983     * Set the end view date with a new date
17984     *
17985     * @param {Date|string|null} date
17986     */
17987    setEndDate: function setEndDate(date) {
17988      if (isDate(date) || isString(date)) {
17989        this.endDate = this.parseDate(date);
17990      } else {
17991        this.endDate = null;
17992      }
17993
17994      if (this.built) {
17995        this.render();
17996      }
17997    },
17998
17999    /**
18000     * Parse a date string with the set date format
18001     *
18002     * @param {String} date
18003     * @return {Date} (parsed date)
18004     */
18005    parseDate: function parseDate(date) {
18006      var format = this.format;
18007      var parts = [];
18008
18009      if (!isDate(date)) {
18010        if (isString(date)) {
18011          parts = date.match(REGEXP_DIGITS) || [];
18012        }
18013
18014        date = date ? new Date(date) : new Date();
18015
18016        if (!isDate(date)) {
18017          date = new Date();
18018        }
18019
18020        if (parts.length === format.parts.length) {
18021          $.each(parts, function (i, part) {
18022            var value = parseInt(part, 10);
18023
18024            switch (format.parts[i]) {
18025              case 'dd':
18026              case 'd':
18027                date.setDate(value);
18028                break;
18029
18030              case 'mm':
18031              case 'm':
18032                date.setMonth(value - 1);
18033                break;
18034
18035              case 'yy':
18036                date.setFullYear(2000 + value);
18037                break;
18038
18039              case 'yyyy':
18040                // Converts 2-digit year to 2000+
18041                date.setFullYear(part.length === 2 ? 2000 + value : value);
18042                break;
18043
18044              default:
18045            }
18046          });
18047        }
18048      } // Ignore hours, minutes, seconds and milliseconds to avoid side effect (#192)
18049
18050
18051      return new Date(date.getFullYear(), date.getMonth(), date.getDate());
18052    },
18053
18054    /**
18055     * Format a date object to a string with the set date format
18056     *
18057     * @param {Date} date
18058     * @return {String} (formatted date)
18059     */
18060    formatDate: function formatDate(date) {
18061      var format = this.format;
18062      var formatted = '';
18063
18064      if (isDate(date)) {
18065        var year = date.getFullYear();
18066        var month = date.getMonth();
18067        var day = date.getDate();
18068        var values = {
18069          d: day,
18070          dd: addLeadingZero(day, 2),
18071          m: month + 1,
18072          mm: addLeadingZero(month + 1, 2),
18073          yy: String(year).substring(2),
18074          yyyy: addLeadingZero(year, 4)
18075        };
18076        formatted = format.source;
18077        $.each(format.parts, function (i, part) {
18078          formatted = formatted.replace(part, values[part]);
18079        });
18080      }
18081
18082      return formatted;
18083    },
18084    // Destroy the datepicker and remove the instance from the target element
18085    destroy: function destroy() {
18086      this.unbind();
18087      this.unbuild();
18088      this.$element.removeData(NAMESPACE);
18089    }
18090  };
18091
18092  var handlers = {
18093    click: function click(e) {
18094      var $target = $(e.target);
18095      var options = this.options,
18096          date = this.date,
18097          viewDate = this.viewDate,
18098          format = this.format;
18099      e.stopPropagation();
18100      e.preventDefault();
18101
18102      if ($target.hasClass('disabled')) {
18103        return;
18104      }
18105
18106      var view = $target.data('view');
18107      var viewYear = viewDate.getFullYear();
18108      var viewMonth = viewDate.getMonth();
18109      var viewDay = viewDate.getDate();
18110
18111      switch (view) {
18112        case 'years prev':
18113        case 'years next':
18114          {
18115            viewYear = view === 'years prev' ? viewYear - 10 : viewYear + 10;
18116            viewDate.setFullYear(viewYear);
18117            viewDate.setDate(getMinDay(viewYear, viewMonth, viewDay));
18118            this.renderYears();
18119            break;
18120          }
18121
18122        case 'year prev':
18123        case 'year next':
18124          viewYear = view === 'year prev' ? viewYear - 1 : viewYear + 1;
18125          viewDate.setFullYear(viewYear);
18126          viewDate.setDate(getMinDay(viewYear, viewMonth, viewDay));
18127          this.renderMonths();
18128          break;
18129
18130        case 'year current':
18131          if (format.hasYear) {
18132            this.showView(VIEWS.YEARS);
18133          }
18134
18135          break;
18136
18137        case 'year picked':
18138          if (format.hasMonth) {
18139            this.showView(VIEWS.MONTHS);
18140          } else {
18141            $target.addClass(options.pickedClass).siblings().removeClass(options.pickedClass);
18142            this.hideView();
18143          }
18144
18145          this.pick('year');
18146          break;
18147
18148        case 'year':
18149          viewYear = parseInt($target.text(), 10);
18150          date.setFullYear(viewYear);
18151          date.setDate(getMinDay(viewYear, viewMonth, viewDay));
18152          viewDate.setFullYear(viewYear);
18153          viewDate.setDate(getMinDay(viewYear, viewMonth, viewDay));
18154
18155          if (format.hasMonth) {
18156            this.showView(VIEWS.MONTHS);
18157          } else {
18158            $target.addClass(options.pickedClass).siblings().removeClass(options.pickedClass);
18159            this.hideView();
18160          }
18161
18162          this.pick('year');
18163          break;
18164
18165        case 'month prev':
18166        case 'month next':
18167          viewMonth = view === 'month prev' ? viewMonth - 1 : viewMonth + 1;
18168
18169          if (viewMonth < 0) {
18170            viewYear -= 1;
18171            viewMonth += 12;
18172          } else if (viewMonth > 11) {
18173            viewYear += 1;
18174            viewMonth -= 12;
18175          }
18176
18177          viewDate.setFullYear(viewYear);
18178          viewDate.setDate(getMinDay(viewYear, viewMonth, viewDay));
18179          viewDate.setMonth(viewMonth);
18180          this.renderDays();
18181          break;
18182
18183        case 'month current':
18184          if (format.hasMonth) {
18185            this.showView(VIEWS.MONTHS);
18186          }
18187
18188          break;
18189
18190        case 'month picked':
18191          if (format.hasDay) {
18192            this.showView(VIEWS.DAYS);
18193          } else {
18194            $target.addClass(options.pickedClass).siblings().removeClass(options.pickedClass);
18195            this.hideView();
18196          }
18197
18198          this.pick('month');
18199          break;
18200
18201        case 'month':
18202          viewMonth = $.inArray($target.text(), options.monthsShort);
18203          date.setFullYear(viewYear); // Set date before month to avoid month changing (#195)
18204
18205          date.setDate(getMinDay(viewYear, viewMonth, viewDay));
18206          date.setMonth(viewMonth);
18207          viewDate.setFullYear(viewYear);
18208          viewDate.setDate(getMinDay(viewYear, viewMonth, viewDay));
18209          viewDate.setMonth(viewMonth);
18210
18211          if (format.hasDay) {
18212            this.showView(VIEWS.DAYS);
18213          } else {
18214            $target.addClass(options.pickedClass).siblings().removeClass(options.pickedClass);
18215            this.hideView();
18216          }
18217
18218          this.pick('month');
18219          break;
18220
18221        case 'day prev':
18222        case 'day next':
18223        case 'day':
18224          if (view === 'day prev') {
18225            viewMonth -= 1;
18226          } else if (view === 'day next') {
18227            viewMonth += 1;
18228          }
18229
18230          viewDay = parseInt($target.text(), 10);
18231          date.setFullYear(viewYear);
18232          date.setMonth(viewMonth);
18233          date.setDate(viewDay);
18234          viewDate.setFullYear(viewYear);
18235          viewDate.setMonth(viewMonth);
18236          viewDate.setDate(viewDay);
18237          this.renderDays();
18238
18239          if (view === 'day') {
18240            this.hideView();
18241          }
18242
18243          this.pick('day');
18244          break;
18245
18246        case 'day picked':
18247          this.hideView();
18248          this.pick('day');
18249          break;
18250
18251        default:
18252      }
18253    },
18254    globalClick: function globalClick(_ref) {
18255      var target = _ref.target;
18256      var element = this.element,
18257          $trigger = this.$trigger;
18258      var trigger = $trigger[0];
18259      var hidden = true;
18260
18261      while (target !== document) {
18262        if (target === trigger || target === element) {
18263          hidden = false;
18264          break;
18265        }
18266
18267        target = target.parentNode;
18268      }
18269
18270      if (hidden) {
18271        this.hide();
18272      }
18273    },
18274    keyup: function keyup() {
18275      this.update();
18276    },
18277    globalKeyup: function globalKeyup(_ref2) {
18278      var target = _ref2.target,
18279          key = _ref2.key,
18280          keyCode = _ref2.keyCode;
18281
18282      if (this.isInput && target !== this.element && this.shown && (key === 'Tab' || keyCode === 9)) {
18283        this.hide();
18284      }
18285    }
18286  };
18287
18288  var render = {
18289    render: function render() {
18290      this.renderYears();
18291      this.renderMonths();
18292      this.renderDays();
18293    },
18294    renderWeek: function renderWeek() {
18295      var _this = this;
18296
18297      var items = [];
18298      var _this$options = this.options,
18299          weekStart = _this$options.weekStart,
18300          daysMin = _this$options.daysMin;
18301      weekStart = parseInt(weekStart, 10) % 7;
18302      daysMin = daysMin.slice(weekStart).concat(daysMin.slice(0, weekStart));
18303      $.each(daysMin, function (i, day) {
18304        items.push(_this.createItem({
18305          text: day
18306        }));
18307      });
18308      this.$week.html(items.join(''));
18309    },
18310    renderYears: function renderYears() {
18311      var options = this.options,
18312          startDate = this.startDate,
18313          endDate = this.endDate;
18314      var disabledClass = options.disabledClass,
18315          filter = options.filter,
18316          yearSuffix = options.yearSuffix;
18317      var viewYear = this.viewDate.getFullYear();
18318      var now = new Date();
18319      var thisYear = now.getFullYear();
18320      var year = this.date.getFullYear();
18321      var start = -5;
18322      var end = 6;
18323      var items = [];
18324      var prevDisabled = false;
18325      var nextDisabled = false;
18326      var i;
18327
18328      for (i = start; i <= end; i += 1) {
18329        var date = new Date(viewYear + i, 1, 1);
18330        var disabled = false;
18331
18332        if (startDate) {
18333          disabled = date.getFullYear() < startDate.getFullYear();
18334
18335          if (i === start) {
18336            prevDisabled = disabled;
18337          }
18338        }
18339
18340        if (!disabled && endDate) {
18341          disabled = date.getFullYear() > endDate.getFullYear();
18342
18343          if (i === end) {
18344            nextDisabled = disabled;
18345          }
18346        }
18347
18348        if (!disabled && filter) {
18349          disabled = filter.call(this.$element, date, 'year') === false;
18350        }
18351
18352        var picked = viewYear + i === year;
18353        var view = picked ? 'year picked' : 'year';
18354        items.push(this.createItem({
18355          picked: picked,
18356          disabled: disabled,
18357          text: viewYear + i,
18358          view: disabled ? 'year disabled' : view,
18359          highlighted: date.getFullYear() === thisYear
18360        }));
18361      }
18362
18363      this.$yearsPrev.toggleClass(disabledClass, prevDisabled);
18364      this.$yearsNext.toggleClass(disabledClass, nextDisabled);
18365      this.$yearsCurrent.toggleClass(disabledClass, true).html("".concat(viewYear + start + yearSuffix, " - ").concat(viewYear + end).concat(yearSuffix));
18366      this.$years.html(items.join(''));
18367    },
18368    renderMonths: function renderMonths() {
18369      var options = this.options,
18370          startDate = this.startDate,
18371          endDate = this.endDate,
18372          viewDate = this.viewDate;
18373      var disabledClass = options.disabledClass || '';
18374      var months = options.monthsShort;
18375      var filter = $.isFunction(options.filter) && options.filter;
18376      var viewYear = viewDate.getFullYear();
18377      var now = new Date();
18378      var thisYear = now.getFullYear();
18379      var thisMonth = now.getMonth();
18380      var year = this.date.getFullYear();
18381      var month = this.date.getMonth();
18382      var items = [];
18383      var prevDisabled = false;
18384      var nextDisabled = false;
18385      var i;
18386
18387      for (i = 0; i <= 11; i += 1) {
18388        var date = new Date(viewYear, i, 1);
18389        var disabled = false;
18390
18391        if (startDate) {
18392          prevDisabled = date.getFullYear() === startDate.getFullYear();
18393          disabled = prevDisabled && date.getMonth() < startDate.getMonth();
18394        }
18395
18396        if (!disabled && endDate) {
18397          nextDisabled = date.getFullYear() === endDate.getFullYear();
18398          disabled = nextDisabled && date.getMonth() > endDate.getMonth();
18399        }
18400
18401        if (!disabled && filter) {
18402          disabled = filter.call(this.$element, date, 'month') === false;
18403        }
18404
18405        var picked = viewYear === year && i === month;
18406        var view = picked ? 'month picked' : 'month';
18407        items.push(this.createItem({
18408          disabled: disabled,
18409          picked: picked,
18410          highlighted: viewYear === thisYear && date.getMonth() === thisMonth,
18411          index: i,
18412          text: months[i],
18413          view: disabled ? 'month disabled' : view
18414        }));
18415      }
18416
18417      this.$yearPrev.toggleClass(disabledClass, prevDisabled);
18418      this.$yearNext.toggleClass(disabledClass, nextDisabled);
18419      this.$yearCurrent.toggleClass(disabledClass, prevDisabled && nextDisabled).html(viewYear + options.yearSuffix || '');
18420      this.$months.html(items.join(''));
18421    },
18422    renderDays: function renderDays() {
18423      var $element = this.$element,
18424          options = this.options,
18425          startDate = this.startDate,
18426          endDate = this.endDate,
18427          viewDate = this.viewDate,
18428          currentDate = this.date;
18429      var disabledClass = options.disabledClass,
18430          filter = options.filter,
18431          months = options.months,
18432          weekStart = options.weekStart,
18433          yearSuffix = options.yearSuffix;
vendor: 5,549 bytes, lines 18434-18596
18434      var viewYear = viewDate.getFullYear();
18435      var viewMonth = viewDate.getMonth();
18436      var now = new Date();
18437      var thisYear = now.getFullYear();
18438      var thisMonth = now.getMonth();
18439      var thisDay = now.getDate();
18440      var year = currentDate.getFullYear();
18441      var month = currentDate.getMonth();
18442      var day = currentDate.getDate();
18443      var length;
18444      var i;
18445      var n; // Days of prev month
18446      // -----------------------------------------------------------------------
18447
18448      var prevItems = [];
18449      var prevViewYear = viewYear;
18450      var prevViewMonth = viewMonth;
18451      var prevDisabled = false;
18452
18453      if (viewMonth === 0) {
18454        prevViewYear -= 1;
18455        prevViewMonth = 11;
18456      } else {
18457        prevViewMonth -= 1;
18458      } // The length of the days of prev month
18459
18460
18461      length = getDaysInMonth(prevViewYear, prevViewMonth); // The first day of current month
18462
18463      var firstDay = new Date(viewYear, viewMonth, 1); // The visible length of the days of prev month
18464      // [0,1,2,3,4,5,6] - [0,1,2,3,4,5,6] => [-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6]
18465
18466      n = firstDay.getDay() - parseInt(weekStart, 10) % 7; // [-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6] => [1,2,3,4,5,6,7]
18467
18468      if (n <= 0) {
18469        n += 7;
18470      }
18471
18472      if (startDate) {
18473        prevDisabled = firstDay.getTime() <= startDate.getTime();
18474      }
18475
18476      for (i = length - (n - 1); i <= length; i += 1) {
18477        var prevViewDate = new Date(prevViewYear, prevViewMonth, i);
18478        var disabled = false;
18479
18480        if (startDate) {
18481          disabled = prevViewDate.getTime() < startDate.getTime();
18482        }
18483
18484        if (!disabled && filter) {
18485          disabled = filter.call($element, prevViewDate, 'day') === false;
18486        }
18487
18488        prevItems.push(this.createItem({
18489          disabled: disabled,
18490          highlighted: prevViewYear === thisYear && prevViewMonth === thisMonth && prevViewDate.getDate() === thisDay,
18491          muted: true,
18492          picked: prevViewYear === year && prevViewMonth === month && i === day,
18493          text: i,
18494          view: 'day prev'
18495        }));
18496      } // Days of next month
18497      // -----------------------------------------------------------------------
18498
18499
18500      var nextItems = [];
18501      var nextViewYear = viewYear;
18502      var nextViewMonth = viewMonth;
18503      var nextDisabled = false;
18504
18505      if (viewMonth === 11) {
18506        nextViewYear += 1;
18507        nextViewMonth = 0;
18508      } else {
18509        nextViewMonth += 1;
18510      } // The length of the days of current month
18511
18512
18513      length = getDaysInMonth(viewYear, viewMonth); // The visible length of next month (42 means 6 rows and 7 columns)
18514
18515      n = 42 - (prevItems.length + length); // The last day of current month
18516
18517      var lastDate = new Date(viewYear, viewMonth, length);
18518
18519      if (endDate) {
18520        nextDisabled = lastDate.getTime() >= endDate.getTime();
18521      }
18522
18523      for (i = 1; i <= n; i += 1) {
18524        var date = new Date(nextViewYear, nextViewMonth, i);
18525        var picked = nextViewYear === year && nextViewMonth === month && i === day;
18526        var _disabled = false;
18527
18528        if (endDate) {
18529          _disabled = date.getTime() > endDate.getTime();
18530        }
18531
18532        if (!_disabled && filter) {
18533          _disabled = filter.call($element, date, 'day') === false;
18534        }
18535
18536        nextItems.push(this.createItem({
18537          disabled: _disabled,
18538          picked: picked,
18539          highlighted: nextViewYear === thisYear && nextViewMonth === thisMonth && date.getDate() === thisDay,
18540          muted: true,
18541          text: i,
18542          view: 'day next'
18543        }));
18544      } // Days of current month
18545      // -----------------------------------------------------------------------
18546
18547
18548      var items = [];
18549
18550      for (i = 1; i <= length; i += 1) {
18551        var _date = new Date(viewYear, viewMonth, i);
18552
18553        var _disabled2 = false;
18554
18555        if (startDate) {
18556          _disabled2 = _date.getTime() < startDate.getTime();
18557        }
18558
18559        if (!_disabled2 && endDate) {
18560          _disabled2 = _date.getTime() > endDate.getTime();
18561        }
18562
18563        if (!_disabled2 && filter) {
18564          _disabled2 = filter.call($element, _date, 'day') === false;
18565        }
18566
18567        var _picked = viewYear === year && viewMonth === month && i === day;
18568
18569        var view = _picked ? 'day picked' : 'day';
18570        items.push(this.createItem({
18571          disabled: _disabled2,
18572          picked: _picked,
18573          highlighted: viewYear === thisYear && viewMonth === thisMonth && _date.getDate() === thisDay,
18574          text: i,
18575          view: _disabled2 ? 'day disabled' : view
18576        }));
18577      } // Render days picker
18578      // -----------------------------------------------------------------------
18579
18580
18581      this.$monthPrev.toggleClass(disabledClass, prevDisabled);
18582      this.$monthNext.toggleClass(disabledClass, nextDisabled);
18583      this.$monthCurrent.toggleClass(disabledClass, prevDisabled && nextDisabled).html(options.yearFirst ? "".concat(viewYear + yearSuffix, " ").concat(months[viewMonth]) : "".concat(months[viewMonth], " ").concat(viewYear).concat(yearSuffix));
18584      this.$days.html(prevItems.join('') + items.join('') + nextItems.join(''));
18585    }
18586  };
18587
18588  var CLASS_TOP_LEFT = "".concat(NAMESPACE, "-top-left");
18589  var CLASS_TOP_RIGHT = "".concat(NAMESPACE, "-top-right");
18590  var CLASS_BOTTOM_LEFT = "".concat(NAMESPACE, "-bottom-left");
18591  var CLASS_BOTTOM_RIGHT = "".concat(NAMESPACE, "-bottom-right");
18592  var CLASS_PLACEMENTS = [CLASS_TOP_LEFT, CLASS_TOP_RIGHT, CLASS_BOTTOM_LEFT, CLASS_BOTTOM_RIGHT].join(' ');
18593
18594  var Datepicker =
18595  /*#__PURE__*/
18596  
vendor: 12,282 bytes, lines 18596-19018
18596function () {
18597    function Datepicker(element) {
18598      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
18599
18600      _classCallCheck(this, Datepicker);
18601
18602      this.$element = $(element);
18603      this.element = element;
18604      this.options = $.extend({}, DEFAULTS, LANGUAGES[options.language], $.isPlainObject(options) && options);
18605      this.$scrollParent = getScrollParent(element, true);
18606      this.built = false;
18607      this.shown = false;
18608      this.isInput = false;
18609      this.inline = false;
18610      this.initialValue = '';
18611      this.initialDate = null;
18612      this.startDate = null;
18613      this.endDate = null;
18614      this.init();
18615    }
18616
18617    _createClass(Datepicker, [{
18618      key: "init",
18619      value: function init() {
18620        var $this = this.$element,
18621            options = this.options;
18622        var startDate = options.startDate,
18623            endDate = options.endDate,
18624            date = options.date;
18625        this.$trigger = $(options.trigger);
18626        this.isInput = $this.is('input') || $this.is('textarea');
18627        this.inline = options.inline && (options.container || !this.isInput);
18628        this.format = parseFormat(options.format);
18629        var initialValue = this.getValue();
18630        this.initialValue = initialValue;
18631        this.oldValue = initialValue;
18632        date = this.parseDate(date || initialValue);
18633
18634        if (startDate) {
18635          startDate = this.parseDate(startDate);
18636
18637          if (date.getTime() < startDate.getTime()) {
18638            date = new Date(startDate);
18639          }
18640
18641          this.startDate = startDate;
18642        }
18643
18644        if (endDate) {
18645          endDate = this.parseDate(endDate);
18646
18647          if (startDate && endDate.getTime() < startDate.getTime()) {
18648            endDate = new Date(startDate);
18649          }
18650
18651          if (date.getTime() > endDate.getTime()) {
18652            date = new Date(endDate);
18653          }
18654
18655          this.endDate = endDate;
18656        }
18657
18658        this.date = date;
18659        this.viewDate = new Date(date);
18660        this.initialDate = new Date(this.date);
18661        this.bind();
18662
18663        if (options.autoShow || this.inline) {
18664          this.show();
18665        }
18666
18667        if (options.autoPick) {
18668          this.pick();
18669        }
18670      }
18671    }, {
18672      key: "build",
18673      value: function build() {
18674        if (this.built) {
18675          return;
18676        }
18677
18678        this.built = true;
18679        var $this = this.$element,
18680            options = this.options;
18681        var $picker = $(options.template);
18682        this.$picker = $picker;
18683        this.$week = $picker.find(selectorOf('week')); // Years view
18684
18685        this.$yearsPicker = $picker.find(selectorOf('years picker'));
18686        this.$yearsPrev = $picker.find(selectorOf('years prev'));
18687        this.$yearsNext = $picker.find(selectorOf('years next'));
18688        this.$yearsCurrent = $picker.find(selectorOf('years current'));
18689        this.$years = $picker.find(selectorOf('years')); // Months view
18690
18691        this.$monthsPicker = $picker.find(selectorOf('months picker'));
18692        this.$yearPrev = $picker.find(selectorOf('year prev'));
18693        this.$yearNext = $picker.find(selectorOf('year next'));
18694        this.$yearCurrent = $picker.find(selectorOf('year current'));
18695        this.$months = $picker.find(selectorOf('months')); // Days view
18696
18697        this.$daysPicker = $picker.find(selectorOf('days picker'));
18698        this.$monthPrev = $picker.find(selectorOf('month prev'));
18699        this.$monthNext = $picker.find(selectorOf('month next'));
18700        this.$monthCurrent = $picker.find(selectorOf('month current'));
18701        this.$days = $picker.find(selectorOf('days'));
18702
18703        if (this.inline) {
18704          $(options.container || $this).append($picker.addClass("".concat(NAMESPACE, "-inline")));
18705        } else {
18706          $(document.body).append($picker.addClass("".concat(NAMESPACE, "-dropdown")));
18707          $picker.addClass(CLASS_HIDE).css({
18708            zIndex: parseInt(options.zIndex, 10)
18709          });
18710        }
18711
18712        this.renderWeek();
18713      }
18714    }, {
18715      key: "unbuild",
18716      value: function unbuild() {
18717        if (!this.built) {
18718          return;
18719        }
18720
18721        this.built = false;
18722        this.$picker.remove();
18723      }
18724    }, {
18725      key: "bind",
18726      value: function bind() {
18727        var options = this.options,
18728            $this = this.$element;
18729
18730        if ($.isFunction(options.show)) {
18731          $this.on(EVENT_SHOW, options.show);
18732        }
18733
18734        if ($.isFunction(options.hide)) {
18735          $this.on(EVENT_HIDE, options.hide);
18736        }
18737
18738        if ($.isFunction(options.pick)) {
18739          $this.on(EVENT_PICK, options.pick);
18740        }
18741
18742        if (this.isInput) {
18743          $this.on(EVENT_KEYUP, $.proxy(this.keyup, this));
18744        }
18745
18746        if (!this.inline) {
18747          if (options.trigger) {
18748            this.$trigger.on(EVENT_CLICK, $.proxy(this.toggle, this));
18749          } else if (this.isInput) {
18750            $this.on(EVENT_FOCUS, $.proxy(this.show, this));
18751          } else {
18752            $this.on(EVENT_CLICK, $.proxy(this.show, this));
18753          }
18754        }
18755      }
18756    }, {
18757      key: "unbind",
18758      value: function unbind() {
18759        var $this = this.$element,
18760            options = this.options;
18761
18762        if ($.isFunction(options.show)) {
18763          $this.off(EVENT_SHOW, options.show);
18764        }
18765
18766        if ($.isFunction(options.hide)) {
18767          $this.off(EVENT_HIDE, options.hide);
18768        }
18769
18770        if ($.isFunction(options.pick)) {
18771          $this.off(EVENT_PICK, options.pick);
18772        }
18773
18774        if (this.isInput) {
18775          $this.off(EVENT_KEYUP, this.keyup);
18776        }
18777
18778        if (!this.inline) {
18779          if (options.trigger) {
18780            this.$trigger.off(EVENT_CLICK, this.toggle);
18781          } else if (this.isInput) {
18782            $this.off(EVENT_FOCUS, this.show);
18783          } else {
18784            $this.off(EVENT_CLICK, this.show);
18785          }
18786        }
18787      }
18788    }, {
18789      key: "showView",
18790      value: function showView(view) {
18791        var $yearsPicker = this.$yearsPicker,
18792            $monthsPicker = this.$monthsPicker,
18793            $daysPicker = this.$daysPicker,
18794            format = this.format;
18795
18796        if (format.hasYear || format.hasMonth || format.hasDay) {
18797          switch (Number(view)) {
18798            case VIEWS.YEARS:
18799              $monthsPicker.addClass(CLASS_HIDE);
18800              $daysPicker.addClass(CLASS_HIDE);
18801
18802              if (format.hasYear) {
18803                this.renderYears();
18804                $yearsPicker.removeClass(CLASS_HIDE);
18805                this.place();
18806              } else {
18807                this.showView(VIEWS.DAYS);
18808              }
18809
18810              break;
18811
18812            case VIEWS.MONTHS:
18813              $yearsPicker.addClass(CLASS_HIDE);
18814              $daysPicker.addClass(CLASS_HIDE);
18815
18816              if (format.hasMonth) {
18817                this.renderMonths();
18818                $monthsPicker.removeClass(CLASS_HIDE);
18819                this.place();
18820              } else {
18821                this.showView(VIEWS.YEARS);
18822              }
18823
18824              break;
18825            // case VIEWS.DAYS:
18826
18827            default:
18828              $yearsPicker.addClass(CLASS_HIDE);
18829              $monthsPicker.addClass(CLASS_HIDE);
18830
18831              if (format.hasDay) {
18832                this.renderDays();
18833                $daysPicker.removeClass(CLASS_HIDE);
18834                this.place();
18835              } else {
18836                this.showView(VIEWS.MONTHS);
18837              }
18838
18839          }
18840        }
18841      }
18842    }, {
18843      key: "hideView",
18844      value: function hideView() {
18845        if (!this.inline && this.options.autoHide) {
18846          this.hide();
18847        }
18848      }
18849    }, {
18850      key: "place",
18851      value: function place() {
18852        if (this.inline) {
18853          return;
18854        }
18855
18856        var $this = this.$element,
18857            options = this.options,
18858            $picker = this.$picker;
18859        var containerWidth = $(document).outerWidth();
18860        var containerHeight = $(document).outerHeight();
18861        var elementWidth = $this.outerWidth();
18862        var elementHeight = $this.outerHeight();
18863        var width = $picker.width();
18864        var height = $picker.height();
18865
18866        var _$this$offset = $this.offset(),
18867            left = _$this$offset.left,
18868            top = _$this$offset.top;
18869
18870        var offset = parseFloat(options.offset);
18871        var placement = CLASS_TOP_LEFT;
18872
18873        if (isNaN(offset)) {
18874          offset = 10;
18875        }
18876
18877        if (top > height && top + elementHeight + height > containerHeight) {
18878          top -= height + offset;
18879          placement = CLASS_BOTTOM_LEFT;
18880        } else {
18881          top += elementHeight + offset;
18882        }
18883
18884        if (left + width > containerWidth) {
18885          left += elementWidth - width;
18886          placement = placement.replace('left', 'right');
18887        }
18888
18889        $picker.removeClass(CLASS_PLACEMENTS).addClass(placement).css({
18890          top: top,
18891          left: left
18892        });
18893      } // A shortcut for triggering custom events
18894
18895    }, {
18896      key: "trigger",
18897      value: function trigger(type, data) {
18898        var e = $.Event(type, data);
18899        this.$element.trigger(e);
18900        return e;
18901      }
18902    }, {
18903      key: "createItem",
18904      value: function createItem(data) {
18905        var options = this.options;
18906        var itemTag = options.itemTag;
18907        var item = {
18908          text: '',
18909          view: '',
18910          muted: false,
18911          picked: false,
18912          disabled: false,
18913          highlighted: false
18914        };
18915        var classes = [];
18916        $.extend(item, data);
18917
18918        if (item.muted) {
18919          classes.push(options.mutedClass);
18920        }
18921
18922        if (item.highlighted) {
18923          classes.push(options.highlightedClass);
18924        }
18925
18926        if (item.picked) {
18927          classes.push(options.pickedClass);
18928        }
18929
18930        if (item.disabled) {
18931          classes.push(options.disabledClass);
18932        }
18933
18934        return "<".concat(itemTag, " class=\"").concat(classes.join(' '), "\" data-view=\"").concat(item.view, "\">").concat(item.text, "</").concat(itemTag, ">");
18935      }
18936    }, {
18937      key: "getValue",
18938      value: function getValue() {
18939        var $this = this.$element;
18940        return this.isInput ? $this.val() : $this.text();
18941      }
18942    }, {
18943      key: "setValue",
18944      value: function setValue() {
18945        var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
18946        var $this = this.$element;
18947
18948        if (this.isInput) {
18949          $this.val(value);
18950        } else if (!this.inline || this.options.container) {
18951          $this.text(value);
18952        }
18953      }
18954    }], [{
18955      key: "setDefaults",
18956      value: function setDefaults() {
18957        var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
18958        $.extend(DEFAULTS, LANGUAGES[options.language], $.isPlainObject(options) && options);
18959      }
18960    }]);
18961
18962    return Datepicker;
18963  }();
18964
18965  if ($.extend) {
18966    $.extend(Datepicker.prototype, render, handlers, methods);
18967  }
18968
18969  if ($.fn) {
18970    var AnotherDatepicker = $.fn.datepicker;
18971
18972    $.fn.datepicker = function jQueryDatepicker(option) {
18973      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
18974        args[_key - 1] = arguments[_key];
18975      }
18976
18977      var result;
18978      this.each(function (i, element) {
18979        var $element = $(element);
18980        var isDestroy = option === 'destroy';
18981        var datepicker = $element.data(NAMESPACE);
18982
18983        if (!datepicker) {
18984          if (isDestroy) {
18985            return;
18986          }
18987
18988          var options = $.extend({}, $element.data(), $.isPlainObject(option) && option);
18989          datepicker = new Datepicker(element, options);
18990          $element.data(NAMESPACE, datepicker);
18991        }
18992
18993        if (isString(option)) {
18994          var fn = datepicker[option];
18995
18996          if ($.isFunction(fn)) {
18997            result = fn.apply(datepicker, args);
18998
18999            if (isDestroy) {
19000              $element.removeData(NAMESPACE);
19001            }
19002          }
19003        }
19004      });
19005      return !isUndefined(result) ? result : this;
19006    };
19007
19008    $.fn.datepicker.Constructor = Datepicker;
19009    $.fn.datepicker.languages = LANGUAGES;
19010    $.fn.datepicker.setDefaults = Datepicker.setDefaults;
19011
19012    $.fn.datepicker.noConflict = function noConflict() {
19013      $.fn.datepicker = AnotherDatepicker;
19014      return this;
19015    };
19016  }
19017
19018}))
19018;
19019
19020/*
19021  textfill
19022 @name      jquery.textfill.js
19023 @author    Russ Painter (GeekyMonkey)
19024 @author    Yu-Jie Lin
19025 @author    Alexandre Dantas
19026 @version   0.6.2
19027 @date      2018-02-24
19028 @copyright (c) 2009
19029 @license   MIT License
19030 @homepage  https://github.com/jquery-textfill/jquery-textfill
19031 @example   http://jquery-textfill.github.io/jquery-textfill/index.html
19032*/
19033(function(k){k.fn.textfill=function(q){function e(){a.debug&&"undefined"!=typeof console&&"undefined"!=typeof console.debug&&console.debug.apply(console,arguments)}function n(b,a,f,l,m,g){function c(a,b){var c=" / ";a>b?c=" > ":a==b&&(c=" = ");return c}e("[TextFill] "+b+" { font-size: "+a.css("font-size")+",Height: "+a.height()+"px "+c(a.height(),f)+f+"px,Width: "+a.width()+c(a.width(),l)+l+",minFontPixels: "+m+"px, maxFontPixels: "+g+"px }")}function p(a,c,f,l,e,g,h,d){for(n(a,c,e,g,h,d);h<Math.floor(d)-
190341;){var b=Math.floor((h+d)/2);c.css("font-size",b);var k=f.call(c);if(k<=l){if(h=b,k==l)break}else d=b;n(a,c,e,g,h,d)}c.css("font-size",d);f.call(c)<=l&&(h=d,n(a+"* ",c,e,g,h,d));return h}var a=k.extend({debug:!1,maxFontPixels:40,minFontPixels:4,innerTag:"span",widthOnly:!1,success:null,fail:null,complete:null,explicitWidth:null,explicitHeight:null,changeLineHeight:!1,truncateOnFail:!1,allowOverflow:!1},q);e("[TextFill] Start Debug");this.each(function(){var b=k(a.innerTag+":first",this);e("[TextFill] Inner text: "+
19035b.text());e("[TextFill] All options: ",a);e("[TextFill] Maximum sizes: { Height: "+c+"px, Width: "+f+"px }");if(b.is(":visible")){var c=a.explicitHeight||k(this).height(),f=a.explicitWidth||k(this).width(),l=b.css("font-size"),m=parseFloat(b.css("line-height"))/parseFloat(l),g=a.minFontPixels,h=0>=a.maxFontPixels?c:a.maxFontPixels,d=void 0;a.widthOnly?b.css("white-space","nowrap"):d=p("Height",b,k.fn.height,c,c,f,g,h);g=p("Width",b,k.fn.width,f,c,f,g,h);a.widthOnly?(b.css({"font-size":g}),a.changeLineHeight&&
19036b.parent().css("line-height",m*g+"px")):(d=Math.min(d,g),b.css("font-size",d),a.changeLineHeight&&b.parent().css("line-height",m*d+"px"));e("[TextFill] Finished { Old font-size: "+l+", New font-size: "+b.css("font-size")+" }");b.width()>f&&!a.allowOverflow||b.height()>c&&!a.widthOnly&&!a.allowOverflow?(b.css("font-size",l),a.fail&&a.fail(this),e("[TextFill] Failure { Current Width: "+b.width()+", Maximum Width: "+f+", Current Height: "+b.height()+", Maximum Height: "+c+" }")):a.success&&a.success(this)}else a.fail&&
19037a.fail(this),e("[TextFill] Failure { Current Width: "+b.width()+", Maximum Width: "+f+", Current Height: "+b.height()+", Maximum Height: "+c+" }")});a.complete&&a.complete(this);e("[TextFill] End Debug");return this}})(function(){return"undefined"!==typeof module&&module.exports?require("jquery"):window.jQuery}());
19038
19039/*!
19040 * JavaScript Cookie v2.2.0
19041 * https://github.com/js-cookie/js-cookie
19042 *
19043 * Copyright 2006, 2015 Klaus Hartl & Fagner Brack
19044 * Released under the MIT license
19045 */
19046;(function (factory) {
19047	var registeredInModuleLoader;
19048	if (typeof define === 'function' && define.amd) {
19049		define(factory);
19050		registeredInModuleLoader = true;
19051	}
19052	if (typeof exports === 'object') {
19053		module.exports = factory();
19054		registeredInModuleLoader = true;
19055	}
19056	if (!registeredInModuleLoader) {
19057		var OldCookies = window.Cookies;
19058		var api = window.Cookies = factory();
19059		api.noConflict = function () {
19060			window.Cookies = OldCookies;
19061			return api;
19062		};
19063	}
19064}(function () {
19065	function extend () {
19066		var i = 0;
19067		var result = {};
19068		for (; i < arguments.length; i++) {
19069			var attributes = arguments[ i ];
19070			for (var key in attributes) {
19071				result[key] = attributes[key];
19072			}
19073		}
19074		return result;
19075	}
19076
19077	function decode (s) {
19078		return s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);
19079	}
19080
19081	function init (converter) {
19082		function api() {}
19083
19084		function set (key, value, attributes) {
19085			if (typeof document === 'undefined') {
19086				return;
19087			}
19088
19089			attributes = extend({
19090				path: '/'
19091			}, api.defaults, attributes);
19092
19093			if (typeof attributes.expires === 'number') {
19094				attributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);
19095			}
19096
19097			// We're using "expires" because "max-age" is not supported by IE
19098			attributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';
19099
19100			try {
19101				var result = JSON.stringify(value);
19102				if (/^[\{\[]/.test(result)) {
19103					value = result;
19104				}
19105			} catch (e) {}
19106
19107			value = converter.write ?
19108				converter.write(value, key) :
19109				encodeURIComponent(String(value))
19110					.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
19111
19112			key = encodeURIComponent(String(key))
19113				.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)
19114				.replace(/[\(\)]/g, escape);
19115
19116			var stringifiedAttributes = '';
19117			for (var attributeName in attributes) {
19118				if (!attributes[attributeName]) {
19119					continue;
19120				}
19121				stringifiedAttributes += '; ' + attributeName;
19122				if (attributes[attributeName] === true) {
19123					continue;
19124				}
19125
19126				// Considers RFC 6265 section 5.2:
19127				// ...
19128				// 3.  If the remaining unparsed-attributes contains a %x3B (";")
19129				//     character:
19130				// Consume the characters of the unparsed-attributes up to,
19131				// not including, the first %x3B (";") character.
19132				// ...
19133				stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];
19134			}
19135
19136			return (document.cookie = key + '=' + value + stringifiedAttributes);
19137		}
19138
19139		function get (key, json) {
19140			if (typeof document === 'undefined') {
19141				return;
19142			}
19143
19144			var jar = {};
19145			// To prevent the for loop in the first place assign an empty array
19146			// in case there are no cookies at all.
19147			var cookies = document.cookie ? document.cookie.split('; ') : [];
19148			var i = 0;
19149
19150			for (; i < cookies.length; i++) {
19151				var parts = cookies[i].split('=');
19152				var cookie = parts.slice(1).join('=');
19153
19154				if (!json && cookie.charAt(0) === '"') {
19155					cookie = cookie.slice(1, -1);
19156				}
19157
19158				try {
19159					var name = decode(parts[0]);
19160					cookie = (converter.read || converter)(cookie, name) ||
19161						decode(cookie);
19162
19163					if (json) {
19164						try {
19165							cookie = JSON.parse(cookie);
19166						} catch (e) {}
19167					}
19168
19169					jar[name] = cookie;
19170
19171					if (key === name) {
19172						break;
19173					}
19174				} catch (e) {}
19175			}
19176
19177			return key ? jar[key] : jar;
19178		}
19179
19180		api.set = set;
19181		api.get = function (key) {
19182			return get(key, false /* read as raw */);
19183		};
19184		api.getJSON = function (key) {
19185			return get(key, true /* read as json */);
19186		};
19187		api.remove = function (key, attributes) {
19188			set(key, '', extend(attributes, {
19189				expires: -1
19190			}));
19191		};
19192
19193		api.defaults = {};
19194
19195		api.withConverter = init;
19196
19197		return api;
19198	}
19199
19200	return init(function () {});
19201}));
19202
19203// Ajoute un bouton mute/unmute sur le Jumbotron
19204const jumboo = document.querySelector("#header_jumbotron");
19205if (jumboo) {
19206	const video = jumboo.querySelector("video");
19207	if (video) {        
19208		const muteButton = jumboo.querySelector(".mute-button");
19209		// Fonction de basculement mute/unmute
19210		muteButton.addEventListener("click", (e) => {
19211			e.preventDefault();
19212			e.stopPropagation();
19213
19214			// Bascule l'état mute de la vidéo
19215			video.muted = !video.muted;
19216
19217			// Sélectionne les icônes
19218			const muteIcon = muteButton.querySelector(".mute-icon");
19219			const unmuteIcon = muteButton.querySelector(".unmute-icon");
19220
19221			// Bascule les classes 'active' pour afficher l'icône appropriée
19222			if (video.muted) {
19223				muteIcon.classList.add("active");
19224				unmuteIcon.classList.remove("active");
19225			} else {
19226				muteIcon.classList.remove("active");
19227				unmuteIcon.classList.add("active");
19228			}
19229
19230			// Ajoute la classe d'animation
19231			muteButton.classList.add("animate-icon");
19232
19233			// Supprime la classe d'animation après la fin de l'animation
19234			muteButton.addEventListener("transitionend", () => {
19235				muteButton.classList.remove("animate-icon");
19236			}, { once: true });
19237		});
19238	}
19239}
19240
19241// Open share container in news
19242function openShare() {
19243	const shareContainer = document.querySelector(".news-share .news-share-container");
19244	shareContainer.classList.toggle("hidden");
19245}
19246
19247
19248/**
19249 * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.6.0
19250 * Copyright (C) 2015 Oliver Nightingale
19251 * MIT Licensed
19252 * @license
19253 */
19254!function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.6.0",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.utils.asString=function(t){return void 0===t||null===t?"":t.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");
19254n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(e){return arguments.length&&null!=e&&void 0!=e?Array.isArray(e)?e.map(function(e){return t.utils.asString(e).toLowerCase()}):e.toString().trim().toLowerCase().split(t.tokenizer.seperator):[]},t.tokenizer.seperator=/[\s\-]+/,t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,r=0;n>r;r++){for(var o=t[r],s=0;i>s&&(o=this._stack[s](o,r,t),void 0!==o&&""!==o);s++);void 0!==o&&""!==o&&e.push(o)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(e<i.idx)return this.list=new t.Vector.Node(e,n,i),this.length++;for(var r=i,o=i.next;void 0!=o;){if(e<o.idx)return r.next=new t.Vector.Node(e,n,o),this.length++;r=o,o=o.next}return r.next=new t.Vector.Node(e,n,o),this.length++},t.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var t,e=this.list,n=0;e;)t=e.val,n+=t*t,e=e.next;return this._magnitude=Math.sqrt(n)},t.Vector.prototype.dot=function(t){for(var e=this.list,n=t.list,i=0;e&&n;)e.idx<n.idx?e=e.next:e.idx>n.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t<arguments.length;t++)e=arguments[t],~this.indexOf(e)||this.elements.splice(this.locationFor(e),0,e);this.length=this.elements.length},t.SortedSet.prototype.toArray=function(){return this.elements.slice()},t.SortedSet.prototype.map=function(t,e){return this.elements.map(t,e)},t.SortedSet.prototype.forEach=function(t,e){return this.elements.forEach(t,e)},t.SortedSet.prototype.indexOf=function(t){for(var e=0,n=this.elements.length,i=n-e,r=e+Math.floor(i/2),o=this.elements[r];i>1;){if(o===t)return r;t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r]}return o===t?r:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,r=e+Math.floor(i/2),o=this.elements[r];i>1;)t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r];return o>t?r:t>o?r+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,r=0,o=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>o-1||r>s-1)break;
19254a[i]!==h[r]?a[i]<h[r]?i++:a[i]>h[r]&&r++:(n.add(a[i]),i++,r++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;return this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone(),i.add.apply(i,n.toArray()),i},t.SortedSet.prototype.toJSON=function(){return this.toArray()},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.Store,this.tokenStore=new t.TokenStore,this.corpusTokens=new t.SortedSet,this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var t=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,t)},t.Index.prototype.off=function(t,e){return this.eventEmitter.removeListener(t,e)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;return n._fields=e.fields,n._ref=e.ref,n.documentStore=t.Store.load(e.documentStore),n.tokenStore=t.TokenStore.load(e.tokenStore),n.corpusTokens=t.SortedSet.load(e.corpusTokens),n.pipeline=t.Pipeline.load(e.pipeline),n},t.Index.prototype.field=function(t,e){var e=e||{},n={name:t,boost:e.boost||1};return this._fields.push(n),this},t.Index.prototype.ref=function(t){return this._ref=t,this},t.Index.prototype.add=function(e,n){var i={},r=new t.SortedSet,o=e[this._ref],n=void 0===n?!0:n;this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n.name]));i[n.name]=o,t.SortedSet.prototype.add.apply(r,o)},this),this.documentStore.set(o,r),t.SortedSet.prototype.add.apply(this.corpusTokens,r.toArray());for(var s=0;s<r.length;s++){var a=r.elements[s],h=this._fields.reduce(function(t,e){var n=i[e.name].length;if(!n)return t;var r=i[e.name].filter(function(t){return t===a}).length;return t+r/n*e.boost},0);this.tokenStore.add(a,{ref:o,tf:h})}n&&this.eventEmitter.emit("add",e,this)},t.Index.prototype.remove=function(t,e){var n=t[this._ref],e=void 0===e?!0:e;if(this.documentStore.has(n)){var i=this.documentStore.get(n);this.documentStore.remove(n),i.forEach(function(t){this.tokenStore.remove(t,n)},this),e&&this.eventEmitter.emit("remove",t,this)}},t.Index.prototype.update=function(t,e){var e=void 0===e?!0:e;this.remove(t,!1),this.add(t,!1),e&&this.eventEmitter.emit("update",t,this)},t.Index.prototype.idf=function(t){var e="@"+t;if(Object.prototype.hasOwnProperty.call(this._idfCache,e))return this._idfCache[e];var n=this.tokenStore.count(t),i=1;return n>0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(t.tokenizer(e)),i=new t.Vector,r=[],o=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*o,h=this,u=this.tokenStore.expand(e).reduce(function(n,r){var o=h.corpusTokens.indexOf(r),s=h.idf(r),u=1,l=new t.SortedSet;if(r!==e){var c=Math.max(3,r.length-e.length);u=1/Math.log(c)}o>-1&&i.insert(o,a*s*u);for(var f=h.tokenStore.get(r),p=Object.keys(f),d=p.length,v=0;d>v;v++)l.add(f[p[v]].ref);return n.union(l)},new t.SortedSet);r.push(u)},this);var a=r.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,r=new t.Vector,o=0;i>o;o++){var s=n.elements[o],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);r.insert(this.corpusTokens.indexOf(s),a*h)}return r},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1
19254);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",r=n+"[^aeiouy]*",o=i+"[aeiou]*",s="^("+r+")?"+o+r,a="^("+r+")?"+o+r+"("+o+")?$",h="^("+r+")?"+o+r+o+r,u="^("+r+")?"+i,l=new RegExp(s),c=new RegExp(h),f=new RegExp(a),p=new RegExp(u),d=/^(.+?)(ss|i)es$/,v=/^(.+?)([^s])s$/,m=/^(.+?)eed$/,g=/^(.+?)(ed|ing)$/,y=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),x=new RegExp("^"+r+i+"[^aeiouwxy]$"),k=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,_=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,O=/^(.+?)e$/,P=/ll$/,N=new RegExp("^"+r+i+"[^aeiouwxy]$"),T=function(n){var i,r,o,s,a,h,u;if(n.length<3)return n;if(o=n.substr(0,1),"y"==o&&(n=o.toUpperCase()+n.substr(1)),s=d,a=v,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=m,a=g,s.test(n)){var T=s.exec(n);s=l,s.test(T[1])&&(s=y,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=p,a.test(i)&&(n=i,a=S,h=w,u=x,a.test(n)?n+="e":h.test(n)?(s=y,n=n.replace(s,"")):u.test(n)&&(n+="e"))}if(s=k,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+t[r])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+e[r])}if(s=_,a=F,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=O,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=N,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=P,a=c,s.test(n)&&a.test(n)&&(s=y,n=n.replace(s,"")),"y"==o&&(n=o.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.generateStopWordFilter=function(t){var e=t.reduce(function(t,e){return t[e]=e,t},{});return function(t){return t&&e[t]!==t?t:void 0}},t.stopWordFilter=t.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){return t.replace(/^\W+/,"").replace(/\W+$/,"")},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t.charAt(0),r=t.slice(1);return i in n||(n[i]={docs:{}}),0===r.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(r,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n<t.length;n++){if(!e[t.charAt(n)])return!1;e=e[t.charAt(n)]}return!0},t.TokenStore.prototype.getNode=function(t){if(!t)return{};for(var e=this.root,n=0;n<t.length;n++){if(!e[t.charAt(n)])return{};e=e[t.charAt(n)]}return e},t.TokenStore.prototype.get=function(t,e){return this.getNode(t,e).docs||{}},t.TokenStore.prototype.count=function(t,e){return Object.keys(this.get(t,e)).length},t.TokenStore.prototype.remove=function(t,e){if(t){for(var n=this.root,i=0;i<t.length;i++){if(!(t.charAt(i)in n))return;n=n[t.charAt(i)]}delete n.docs[e]}},t.TokenStore.prototype.expand=function(t,e){var n=this.getNode(t),i=n.docs||{},e=e||[];
19254return Object.keys(i).length&&e.push(t),Object.keys(n).forEach(function(n){"docs"!==n&&e.concat(this.expand(t+n,e))},this),e},t.TokenStore.prototype.toJSON=function(){return{root:this.root,length:this.length}},function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():t.lunr=e()}(this,function(){return t})}();
19255!function(i){"use strict";"function"==typeof define&&define.amd?define(["jquery"],i):"undefined"!=typeof exports?module.exports=i(require("jquery")):i(jQuery)}(function(i){"use strict";var e=window.Slick||{};(e=function(){var e=0;return function(t,o){var s,n=this;n.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:i(t),appendDots:i(t),arrows:!0,asNavFor:null,prevArrow:'<button class="slick-prev" aria-label="Previous" type="button">Previous</button>',nextArrow:'<button class="slick-next" aria-label="Next" type="button">Next</button>',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(e,t){return i('<button type="button" />').text(t+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,focusOnChange:!1,infinite:!0,initialSlide:0,lazyLoad:"ondemand",mobileFirst:!1,pauseOnHover:!0,pauseOnFocus:!0,pauseOnDotsHover:!1,respondTo:"window",responsive:null,rows:1,rtl:!1,slide:"",slidesPerRow:1,slidesToShow:1,slidesToScroll:1,speed:500,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,verticalSwiping:!1,waitForAnimate:!0,zIndex:1e3},n.initials={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,$dots:null,listWidth:null,listHeight:null,loadIndex:0,$nextArrow:null,$prevArrow:null,scrolling:!1,slideCount:null,slideWidth:null,$slideTrack:null,$slides:null,sliding:!1,slideOffset:0,swipeLeft:null,swiping:!1,$list:null,touchObject:{},transformsEnabled:!1,unslicked:!1},i.extend(n,n.initials),n.activeBreakpoint=null,n.animType=null,n.animProp=null,n.breakpoints=[],n.breakpointSettings=[],n.cssTransitions=!1,n.focussed=!1,n.interrupted=!1,n.hidden="hidden",n.paused=!0,n.positionProp=null,n.respondTo=null,n.rowCount=1,n.shouldClick=!0,n.$slider=i(t),n.$slidesCache=null,n.transformType=null,n.transitionType=null,n.visibilityChange="visibilitychange",n.windowWidth=0,n.windowTimer=null,s=i(t).data("slick")||{},n.options=i.extend({},n.defaults,o,s),n.currentSlide=n.options.initialSlide,n.originalSettings=n.options,void 0!==document.mozHidden?(n.hidden="mozHidden",n.visibilityChange="mozvisibilitychange"):void 0!==document.webkitHidden&&(n.hidden="webkitHidden",n.visibilityChange="webkitvisibilitychange"),n.autoPlay=i.proxy(n.autoPlay,n),n.autoPlayClear=i.proxy(n.autoPlayClear,n),n.autoPlayIterator=i.proxy(n.autoPlayIterator,n),n.changeSlide=i.proxy(n.changeSlide,n),n.clickHandler=i.proxy(n.clickHandler,n),n.selectHandler=i.proxy(n.selectHandler,n),n.setPosition=i.proxy(n.setPosition,n),n.swipeHandler=i.proxy(n.swipeHandler,n),n.dragHandler=i.proxy(n.dragHandler,n),n.keyHandler=i.proxy(n.keyHandler,n),n.instanceUid=e++,n.htmlExpr=/^(?:\s*(<[\w\W]+>)[^>]*)$/,n.registerBreakpoints(),n.init(!0)}}()).prototype.activateADA=function(){this.$slideTrack.find(".slick-active").attr({"aria-hidden":"false"}).find("a, input, button, select").attr({tabindex:"0"})},e.prototype.addSlide=e.prototype.slickAdd=function(e,t,o){var s=this;if("boolean"==typeof t)o=t,t=null;else if(t<0||t>=s.slideCount)return!1;s.unload(),"number"==typeof t?0===t&&0===s.$slides.length?i(e).appendTo(s.$slideTrack):o?i(e).insertBefore(s.$slides.eq(t)):i(e).insertAfter(s.$slides.eq(t)):!0===o?i(e).prependTo(s.$slideTrack):i(e).appendTo(s.$slideTrack),s.$slides=s.$slideTrack.children(this.options.slide),s.$slideTrack.children(this.options.slide).detach(),s.$slideTrack.append(s.$slides),s.$slides.each(function(e,t){i(t).attr("data-slick-index",e)}),s.$slidesCache=s.$slides,s.reinit()},e.prototype.animateHeight=function(){var i=this;if(1===i.options.slidesToShow&&!0===i.options.adaptiveHeight&&!1===i.options.vertical){var e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.animate({height:e},i.options.speed)}},e.prototype.animateSlide=function(e,t){var o={},s=this;s.animateHeight(),!0===s.options.rtl&&!1===s.options.vertical&&(e=-e),!1===s.transformsEnabled?!1===s.options.vertical?s.$slideTrack.animate({left:e},s.options.speed,s.options.easing,t):s.$slideTrack.animate({top:e},s.options.speed,s.options.easing,t):!1===s.cssTransitions?(!0===s.options.rtl&&(s.currentLeft=-s.currentLeft),i({animStart:s.currentLeft}).animate({animStart:e},{duration:s.options.speed,easing:s.options.easing,step:function(i){i=Math.ceil(i),!1===s.options.vertical?(o[s.animType]="translate("+i+"px, 0px)",s.$slideTrack.css(o)):(o[s.animType]="translate(0px,"+i+"px)",s.$slideTrack.css(o))},complete:function(){t&&t.call()}})):(s.applyTransition(),e=Math.ceil(e),!1===s.options.vertical?o[s.animType]="translate3d("+e+"px, 0px, 0px)":o[s.animType]="translate3d(0px,"+e+"px, 0px)",s.$slideTrack.css(o),t&&setTimeout(function(){s.disableTransition(),t.call()},s.options.speed))},e.prototype.getNavTarget=function(){var e=this,t=e.options.asNavFor;return t&&null!==t&&(t=i(t).not(e.$slider)),t},e.prototype.asNavFor=function(e){var t=this.getNavTarget();null!==t&&"object"==typeof t&&t.each(function(){var t=i(this).slick("getSlick");t.unslicked||t.slideHandler(e,!0)})},e.prototype.applyTransition=function(i){var e=this,t={};!1===e.options.fade?t[e.transitionType]=e.transformType+" "+e.options.speed+"ms "+e.options.cssEase:t[e.transitionType]="opacity "+e.options.speed+"ms "+e.options.cssEase,!1===e.options.fade?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.autoPlay=function(){var i=this;i.autoPlayClear(),i.slideCount>i.options.slidesToShow&&(i.autoPlayTimer=setInterval(i.autoPlayIterator,i.options.autoplaySpeed))},e.prototype.autoPlayClear=function(){var i=this;i.autoPlayTimer&&clearInterval(i.autoPlayTimer)},e.prototype.autoPlayIterator=function(){var i=this,e=i.currentSlide+i.options.slidesToScroll;i.paused||i.interrupted||i.focussed||(!1===i.options.infinite&&(1===i.direction&&i.currentSlide+1===i.slideCount-1?i.direction=0:0===i.direction&&(e=i.currentSlide-i.options.slidesToScroll,i.currentSlide-1==0&&(i.direction=1))),i.slideHandler(e))},e.prototype.buildArrows=function(){var e=this;!0===e.options.arrows&&(e.$prevArrow=i(e.options.prevArrow).addClass("slick-arrow"),e.$nextArrow=i(e.options.nextArrow).addClass("slick-arrow"),e.slideCount>e.options.slidesToShow?(e.$prevArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),e.$nextArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.prependTo(e.options.appendArrows),e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.appendTo(e.options.appendArrows),!0!==e.options.infinite&&e.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true")):e.$prevArrow.add(e.$nextArrow).addClass("slick-hidden").attr({"aria-disabled":"true",tabindex:"-1"}))},e.prototype.buildDots=function(){var e,t,o=this;if(!0===o.options.dots){for(o.$slider.addClass("slick-dotted"),t=i("<ul />").addClass(o.options.dotsClass),e=0;e<=o.getDotCount();e+=1)t.append(i("<li />").append(o.options.customPaging.call(this,o,e)));o.$dots=t.appendTo(o.options.appendDots),o.$dots.find("li").first().addClass("slick-active")}},e.prototype.buildOut=function(){var e=this;e.$slides=e.$slider.children(e.options.slide+":not(.slick-cloned)").addClass("slick-slide"),e.slideCount=e.$slides.length,e.$slides.each(function(e,t){i(t).attr("data-slick-index",e).data("originalStyling",i(t).attr("style")||"")}),e.$slider.addClass("slick-slider"),e.$slideTrack=0===e.slideCount?i('<div class="slick-track"/>').appendTo(e.$slider):e.$slides.wrapAll('<div class="slick-track"/>').parent(),e.$list=e.$slideTrack.wrap('<div class="slick-list"/>').parent(),e.$slideTrack.css("opacity",0),!0!==e.options.centerMode&&!0!==e.options.swipeToSlide||(e.options.slidesToScroll=1),i("img[data-lazy]",e.$slider).not("[src]").addClass("slick-loading"),e.setupInfinite(),e.buildArrows(),e.buildDots(),e.updateDots(),e.setSlideClasses("number"==typeof e.currentSlide?e.currentSlide:0),!0===e.options.draggable&&e.$list.addClass("draggable")},e.prototype.buildRows=function(){var i,e,t,o,s,n,r,l=this;if(o=document.createDocumentFragment(),n=l.$slider.children(),l.o
vendor: 3,442 bytes, line 19255
19255ptions.rows>1){for(r=l.options.slidesPerRow*l.options.rows,s=Math.ceil(n.length/r),i=0;i<s;i++){var d=document.createElement("div");for(e=0;e<l.options.rows;e++){var a=document.createElement("div");for(t=0;t<l.options.slidesPerRow;t++){var c=i*r+(e*l.options.slidesPerRow+t);n.get(c)&&a.appendChild(n.get(c))}d.appendChild(a)}o.appendChild(d)}l.$slider.empty().append(o),l.$slider.children().children().children().css({width:100/l.options.slidesPerRow+"%",display:"inline-block"})}},e.prototype.checkResponsive=function(e,t){var o,s,n,r=this,l=!1,d=r.$slider.width(),a=window.innerWidth||i(window).width();if("window"===r.respondTo?n=a:"slider"===r.respondTo?n=d:"min"===r.respondTo&&(n=Math.min(a,d)),r.options.responsive&&r.options.responsive.length&&null!==r.options.responsive){s=null;for(o in r.breakpoints)r.breakpoints.hasOwnProperty(o)&&(!1===r.originalSettings.mobileFirst?n<r.breakpoints[o]&&(s=r.breakpoints[o]):n>r.breakpoints[o]&&(s=r.breakpoints[o]));null!==s?null!==r.activeBreakpoint?(s!==r.activeBreakpoint||t)&&(r.activeBreakpoint=s,"unslick"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):(r.activeBreakpoint=s,"unslick"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):null!==r.activeBreakpoint&&(r.activeBreakpoint=null,r.options=r.originalSettings,!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e),l=s),e||!1===l||r.$slider.trigger("breakpoint",[r,l])}},e.prototype.changeSlide=function(e,t){var o,s,n,r=this,l=i(e.currentTarget);switch(l.is("a")&&e.preventDefault(),l.is("li")||(l=l.closest("li")),n=r.slideCount%r.options.slidesToScroll!=0,o=n?0:(r.slideCount-r.currentSlide)%r.options.slidesToScroll,e.data.message){case"previous":s=0===o?r.options.slidesToScroll:r.options.slidesToShow-o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide-s,!1,t);break;case"next":s=0===o?r.options.slidesToScroll:o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide+s,!1,t);break;case"index":var d=0===e.data.index?0:e.data.index||l.index()*r.options.slidesToScroll;r.slideHandler(r.checkNavigable(d),!1,t),l.children().trigger("focus");break;default:return}},e.prototype.checkNavigable=function(i){var e,t;if(e=this.getNavigableIndexes(),t=0,i>e[e.length-1])i=e[e.length-1];else for(var o in e){if(i<e[o]){i=t;break}t=e[o]}return i},e.prototype.cleanUpEvents=function(){var e=this;e.options.dots&&null!==e.$dots&&(i("li",e.$dots).off("click.slick",e.changeSlide).off("mouseenter.slick",i.proxy(e.interrupt,e,!0)).off("mouseleave.slick",i.proxy(e.interrupt,e,!1)),!0===e.options.accessibility&&e.$dots.off("keydown.slick",e.keyHandler)),e.$slider.off("focus.slick blur.slick"),!0===e.options.arrows&&e.slideCount>e.options.slidesToShow&&(e.$prevArrow&&e.$prevArrow.off("click.slick",e.changeSlide),e.$nextArrow&&e.$nextArrow.off("click.slick",e.changeSlide),!0===e.options.accessibility&&(e.$prevArrow&&e.$prevArrow.off("keydown.slick",e.keyHandler),e.$nextArrow&&e.$nextArrow.off("keydown.slick",e.keyHandler))),e.$list.off("touchstart.slick mousedown.slick",e.swipeHandler),e.$list.off("touchmove.slick mousemove.slick",e.swipeHandler),e.$list.off("touchend.slick mouseup.slick",e.swipeHandler),e.$list.off("touchcancel.slick mouseleave.
19255slick",e.swipeHandler),e.$list.off("click.slick",e.clickHandler),i(document).off(e.visibilityChange,e.visibility),e.cleanUpSlideEvents(),!0===e.options.accessibility&&e.$list.off("keydown.slick",e.keyHandler),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().off("click.slick",e.selectHandler),i(window).off("orientationchange.slick.slick-"+e.instanceUid,e.orientationChange),i(window).off("resize.slick.slick-"+e.instanceUid,e.resize),i("[draggable!=true]",e.$slideTrack).off("dragstart",e.preventDefault),i(window).off("load.slick.slick-"+e.instanceUid,e.setPosition)},e.prototype.cleanUpSlideEvents=function(){var e=this;e.$list.off("mouseenter.slick",i.proxy(e.interrupt,e,!0)),e.$list.off("mouseleave.slick",i.proxy(e.interrupt,e,!1))},e.prototype.cleanUpRows=function(){var i,e=this;e.options.rows>1&&((i=e.$slides.children().children()).removeAttr("style"),e.$slider.empty().append(i))},e.prototype.clickHandler=function(i){!1===this.shouldClick&&(i.stopImmediatePropagation(),i.stopPropagation(),i.preventDefault())},e.prototype.destroy=function(e){var t=this;t.autoPlayClear(),t.touchObject={},t.cleanUpEvents(),i(".slick-cloned",t.$slider).detach(),t.$dots&&t.$dots.remove(),t.$prevArrow&&t.$prevArrow.length&&(t.$prevArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),t.htmlExpr.test(t.options.prevArrow)&&t.$prevArrow.remove()),t.$nextArrow&&t.$nextArrow.length&&(t.$nextArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),t.htmlExpr.test(t.options.nextArrow)&&t.$nextArrow.remove()),t.$slides&&(t.$slides.removeClass("slick-slide slick-active slick-center slick-visible slick-current").removeAttr("aria-hidden").removeAttr("data-slick-index").each(function(){i(this).attr("style",i(this).data("originalStyling"))}),t.$slideTrack.children(this.options.slide).detach(),t.$slideTrack.detach(),t.$list.detach(),t.$slider.append(t.$slides)),t.cleanUpRows(),t.$slider.removeClass("slick-slider"),t.$slider.removeClass("slick-initialized"),t.$slider.removeClass("slick-dotted"),t.unslicked=!0,e||t.$slider.trigger("destroy",[t])},e.prototype.disableTransition=function(i){var e=this,t={};t[e.transitionType]="",!1===e.options.fade?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.fadeSlide=function(i,e){var t=this;!1===t.cssTransitions?(t.$slides.eq(i).css({zIndex:t.options.zIndex}),t.$slides.eq(i).animate({opacity:1},t.options.speed,t.options.easing,e)):(t.applyTransition(i),t.$slides.eq(i).css({opacity:1,zIndex:t.options.zIndex}),e&&setTimeout(function(){t.disableTransition(i),e.call()},t.options.speed))},e.prototype.fadeSlideOut=function(i){var e=this;!1===e.cssTransitions?e.$slides.eq(i).animate({opacity:0,zIndex:e.options.zIndex-2},e.options.speed,e.options.easing):(e.applyTransition(i),e.$slides.eq(i).css({opacity:0,zIndex:e.options.zIndex-2}))},e.prototype.filterSlides=e.prototype.slickFilter=function(i){var e=this;null!==i&&(e.$slidesCache=e.$slides,e.unload(),e.$slideTrack.children(this.options.slide).detach(),e.$slidesCache.filter(i).appendTo(e.$slideTrack),e.reinit())},e.prototype.focusHandler=function(){var e=this;e.$slider.off("focus.slick blur.slick").on("focus.slick blur.slick","*",function(t){t.stopImmediatePropagation();var o=i(this);setTimeout(function(){e.options.pauseOnFocus&&(e.focussed=o.is(":focus"),e.autoPlay())},0)})},e.prototype.getCurrent=e.prototype.slickCurrentSlide=function(){return this.currentSlide},e.prototype.getDotCount=function(){var i=this,e=0,t=0,o=0;if(!0===i.options.infinite)if(i.slideCount<=i.options.slidesToShow)++o;else for(;e<i.slideCount;)++o,e=t+i.options.slidesToScroll,t+=i.options.slidesToScroll<=i.options.slidesToShow?i.options.slidesToScroll:i.options.slidesToShow;else if(!0===i.options.centerMode)o=i.slideCount;else if(i.options.asNavFor)for(;e<i.slideCount;)++o,e=t+i.options.slidesToScroll,t+=i.options.slidesToScroll<=i.options.slidesToShow?i.options.slidesToScroll:i.options.slidesToShow;else o=1+Math.ceil((i.slideCount-i.options.slidesToShow)/i.options.slidesToScroll);return o-1},e.prototype.getLeft=function(i){var e,t,o,s,n=this,r=0;return n.slideOffset=0,t=n.$slides.first().outerHeight(!0),!0===n.options.infinite?(n.slideCount>n.options.slidesToShow&&(n.slideOffset=n.slideWidth*n.options.slidesToShow*-1,s=-1,!0===n.options.vertical&&!0===n.options.centerMode&&(2===n.options.slidesToShow?s=-1.5:1===n.options.slidesToShow&&(s=-2)),r=t*n.options.slidesToShow*s),n.slideCount%n.options.slidesToScroll!=0&&i+n.options.slidesToScroll>n.slideCount&&n.slideCount>n.options.slidesToShow&&(i>n.slideCount?(n.slideOffset=(n.options.slidesToShow-(i-n.slideCount))*n.slideWidth*-1,r=(n.options.slidesToShow-(i-n.slideCount))*t*-1):(n.slideOffset=n.slideCount%n.options.slidesToScroll*n.slideWidth*-1,r=n.slideCount%n.options.slidesToScroll*t*-1))):i+n.options.slidesToShow>n.slideCount&&(n.slideOffset=(i+n.options.slidesToShow-n.slideCount)*n.slideWidth,r=(i+n.options.slidesToShow-n.slideCount)*t),n.slideCount<=n.options.slidesToShow&&(n.slideOffset=0,r=0),!0===n.options.centerMode&&n.slideCount<=n.options.slidesToShow?n.slideOffset=n.slideWidth*Math.floor(n.options.slidesToShow)/2-n.slideWidth*n.slideCount/2:!0===n.options.centerMode&&!0===n.options.infinite?n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)-n.slideWidth:!0===n.options.centerMode&&(n.slideOffset=0,n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)),e=!1===n.options.vertical?i*n.slideWidth*-1+n.slideOffset:i*t*-1+r,!0===n.options.variableWidth&&(o=n.slideCount<=n.options.slidesToShow||!1===n.options.infinite?n.$slideTrack.children(".slick-slide").eq(i):n.$slideTrack.children(".slick-slide").eq(i+n.options.slidesToShow),e=!0===n.options.rtl?o[0]?-1*(n.$slideTrack.width()-o[0].offsetLeft-o.width()):0:o[0]?-1*o[0].offsetLeft:0,!0===n.options.centerMode&&(o=n.slideCount<=n.options.slidesToShow||!1===n.options.infinite?n.$slideTrack.children(".slick-slide").eq(i):n.$slideTrack.children(".slick-slide").eq(i+n.options.slidesToShow+1),e=!0===n.options.rtl?o[0]?-1*(n.$slideTrack.width()-o[0].offsetLeft-o.width()):0:o[0]?-1*o[0].offsetLeft:0,e+=(n.$list.width()-o.outerWidth())/2)),e},e.prototype.getOption=e.prototype.slickGetOption=function(i){return this.options[i]},e.prototype.getNavigableIndexes=function(){var i,e=this,t=0,o=0,s=[];for(!1===e.options.infinite?i=e.slideCount:(t=-1*e.options.slidesToScroll,o=-1*e.options.slidesToScroll,i=2*e.slideCount);t<i;)s.push(t),t=o+e.options.slidesToScroll,o+=e.options.slidesToScroll<=e.options.slidesToShow?e.options.slidesToScroll:e.options.slidesToShow;return s},e.prototype.getSlick=function(){return this},e.prototype.getSlideCount=function(){var e,t,o=this;return t=!0===o.options.centerMode?o.slideWidth*Math.floor(o.options.slidesToShow/2):0,!0===o.options.swipeToSlide?(o.$slideTrack.find(".slick-slide").each(function(s,n){if(n.offsetLeft-t+i(n).outerWidth()/2>-1*o.swipeLeft)return e=n,!1}),Math.abs(i(e).attr("data-slick-index")-o.currentSlide)||1):o.options.slidesToScroll},e.prototype.goTo=e.prototype.slickGoTo=function(i,e){this.changeSlide({data:{message:"index",index:
19255parseInt(i)}},e)},e.prototype.init=function(e){var t=this;i(t.$slider).hasClass("slick-initialized")||(i(t.$slider).addClass("slick-initialized"),t.buildRows(),t.buildOut(),t.setProps(),t.startLoad(),t.loadSlider(),t.initializeEvents(),t.updateArrows(),t.updateDots(),t.checkResponsive(!0),t.focusHandler()),e&&t.$slider.trigger("init",[t]),!0===t.options.accessibility&&t.initADA(),t.options.autoplay&&(t.paused=!1,t.autoPlay())},e.prototype.initADA=function(){var e=this,t=Math.ceil(e.slideCount/e.options.slidesToShow),o=e.getNavigableIndexes().filter(function(i){return i>=0&&i<e.slideCount});e.$slides.add(e.$slideTrack.find(".slick-cloned")).attr({"aria-hidden":"true",tabindex:"-1"}).find("a, input, button, select").attr({tabindex:"-1"}),null!==e.$dots&&(e.$slides.not(e.$slideTrack.find(".slick-cloned")).each(function(t){var s=o.indexOf(t);i(this).attr({role:"tabpanel",id:"slick-slide"+e.instanceUid+t,tabindex:-1}),-1!==s&&i(this).attr({"aria-describedby":"slick-slide-control"+e.instanceUid+s})}),e.$dots.attr("role","tablist").find("li").each(function(s){var n=o[s];i(this).attr({role:"presentation"}),i(this).find("button").first().attr({role:"tab",id:"slick-slide-control"+e.instanceUid+s,"aria-controls":"slick-slide"+e.instanceUid+n,"aria-label":s+1+" of "+t,"aria-selected":null,tabindex:"-1"})}).eq(e.currentSlide).find("button").attr({"aria-selected":"true",tabindex:"0"}).end());for(var s=e.currentSlide,n=s+e.options.slidesToShow;s<n;s++)e.$slides.eq(s).attr("tabindex",0);e.activateADA()},e.prototype.initArrowEvents=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.off("click.slick").on("click.slick",{message:"previous"},i.changeSlide),i.$nextArrow.off("click.slick").on("click.slick",{message:"next"},i.changeSlide),!0===i.options.accessibility&&(i.$prevArrow.on("keydown.slick",i.keyHandler),i.$nextArrow.on("keydown.slick",i.keyHandler)))},e.prototype.initDotEvents=function(){var e=this;!0===e.options.dots&&(i("li",e.$dots).on("click.slick",{message:"index"},e.changeSlide),!0===e.options.accessibility&&e.$dots.on("keydown.slick",e.keyHandler)),!0===e.options.dots&&!0===e.options.pauseOnDotsHover&&i("li",e.$dots).on("mouseenter.slick",i.proxy(e.interrupt,e,!0)).on("mouseleave.slick",i.proxy(e.interrupt,e,!1))},e.prototype.initSlideEvents=function(){var e=this;e.options.pauseOnHover&&(e.$list.on("mouseenter.slick",i.proxy(e.interrupt,e,!0)),e.$list.on("mouseleave.slick",i.proxy(e.interrupt,e,!1)))},e.prototype.initializeEvents=function(){var e=this;e.initArrowEvents(),e.initDotEvents(),e.initSlideEvents(),e.$list.on("touchstart.slick mousedown.slick",{action:"start"},e.swipeHandler),e.$list.on("touchmove.slick mousemove.slick",{action:"move"},e.swipeHandler),e.$list.on("touchend.slick mouseup.slick",{action:"end"}
19255,e.swipeHandler),e.$list.on("touchcancel.slick mouseleave.slick",{action:"end"},e.swipeHandler),e.$list.on("click.slick",e.clickHandler),i(document).on(e.visibilityChange,i.proxy(e.visibility,e)),!0===e.options.accessibility&&e.$list.on("keydown.slick",e.keyHandler),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().on("click.slick",e.selectHandler),i(window).on("orientationchange.slick.slick-"+e.instanceUid,i.proxy(e.orientationChange,e)),i(window).on("resize.slick.slick-"+e.instanceUid,i.proxy(e.resize,e)),i("[draggable!=true]",e.$slideTrack).on("dragstart",e.preventDefault),i(window).on("load.slick.slick-"+e.instanceUid,e.setPosition),i(e.setPosition)},e.prototype.initUI=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.show(),i.$nextArrow.show()),!0===i.options.dots&&i.slideCount>i.options.slidesToShow&&i.$dots.show()},e.prototype.keyHandler=function(i){var e=this;i.target.tagName.match("TEXTAREA|INPUT|SELECT")||(37===i.keyCode&&!0===e.options.accessibility?e.changeSlide({data:{message:!0===e.options.rtl?"next":"previous"}}):39===i.keyCode&&!0===e.options.accessibility&&e.changeSlide({data:{message:!0===e.options.rtl?"previous":"next"}}))},e.prototype.lazyLoad=function(){function e(e){i("img[data-lazy]",e).each(function(){var e=i(this),t=i(this).attr("data-lazy"),o=i(this).attr("data-srcset"),s=i(this).attr("data-sizes")||n.$slider.attr("data-sizes"),r=document.createElement("img");r.onload=function(){e.animate({opacity:0}
vendor: 5,619 bytes, line 19255
19255,100,function(){o&&(e.attr("srcset",o),s&&e.attr("sizes",s)),e.attr("src",t).animate({opacity:1},200,function(){e.removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading")}),n.$slider.trigger("lazyLoaded",[n,e,t])})},r.onerror=function(){e.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),n.$slider.trigger("lazyLoadError",[n,e,t])},r.src=t})}var t,o,s,n=this;if(!0===n.options.centerMode?!0===n.options.infinite?s=(o=n.currentSlide+(n.options.slidesToShow/2+1))+n.options.slidesToShow+2:(o=Math.max(0,n.currentSlide-(n.options.slidesToShow/2+1)),s=n.options.slidesToShow/2+1+2+n.currentSlide):(o=n.options.infinite?n.options.slidesToShow+n.currentSlide:n.currentSlide,s=Math.ceil(o+n.options.slidesToShow),!0===n.options.fade&&(o>0&&o--,s<=n.slideCount&&s++)),t=n.$slider.find(".slick-slide").slice(o,s),"anticipated"===n.options.lazyLoad)for(var r=o-1,l=s,d=n.$slider.find(".slick-slide"),a=0;a<n.options.slidesToScroll;a++)r<0&&(r=n.slideCount-1),t=(t=t.add(d.eq(r))).add(d.eq(l)),r--,l++;e(t),n.slideCount<=n.options.slidesToShow?e(n.$slider.find(".slick-slide")):n.currentSlide>=n.slideCount-n.options.slidesToShow?e(n.$slider.find(".slick-cloned").slice(0,n.options.slidesToShow)):0===n.currentSlide&&e(n.$slider.find(".slick-cloned").slice(-1*n.options.slidesToShow))},e.prototype.loadSlider=function(){var i=this;i.setPosition(),i.$slideTrack.css({opacity:1}),i.$slider.removeClass("slick-loading"),i.initUI(),"progressive"===i.options.lazyLoad&&i.progressiveLazyLoad()},e.prototype.next=e.prototype.slickNext=function(){this.changeSlide({data:{message:"next"}})},e.prototype.orientationChange=function(){var i=this;i.checkResponsive(),i.setPosition()},e.prototype.pause=e.prototype.slickPause=function(){var i=this;i.autoPlayClear(),i.paused=!0},e.prototype.play=e.prototype.slickPlay=function(){var i=this;i.autoPlay(),i.options.autoplay=!0,i.paused=!1,i.focussed=!1,i.interrupted=!1},e.prototype.postSlide=function(e){var t=this;t.unslicked||(t.$slider.trigger("afterChange",[t,e]),t.animating=!1,t.slideCount>t.options.slidesToShow&&t.setPosition(),t.swipeLeft=null,t.options.autoplay&&t.autoPlay(),!0===t.options.accessibility&&(t.initADA(),t.options.focusOnChange&&i(t.$slides.get(t.currentSlide)).attr("tabindex",0).focus()))},e.prototype.prev=e.prototype.slickPrev=function(){this.changeSlide({data:{message:"previous"}})},e.prototype.preventDefault=function(i){i.preventDefault()},e.prototype.progressiveLazyLoad=function(e){e=e||1;var t,o,s,n,r,l=this,d=i("img[data-lazy]",l.$slider);d.length?(t=d.first(),o=t.attr("data-lazy"),s=t.attr("data-srcset"),n=t.attr("data-sizes")||l.$slider.attr("data-sizes"),(r=document.createElement("img")).onload=function(){s&&(t.attr("srcset",s),n&&t.attr("sizes",n)),t.attr("src",o).removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading"),!0===l.options.adaptiveHeight&&l.setPosition(),l.$slider.trigger("lazyLoaded",[l,t,o]),l.progressiveLazyLoad()},r.onerror=function(){e<3?setTimeout(function(){l.progressiveLazyLoad(e+1)},500):(t.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),l.$slider.trigger("lazyLoadError",[l,t,o]),l.progressiveLazyLoad())},r.src=o):l.$slider.trigger("allImagesLoaded",[l])},e.prototype.refresh=function(e){var t,o,s=this;o=s.slideCount-s.options.slidesToShow,!s.options.infinite&&s.currentSlide>o&&(s.currentSlide=o),s.slideCount<=s.options.slidesToShow&&(s.currentSlide=0),t=s.currentSlide,s.destroy(!0),i.extend(s,s.initials,{currentSlide:t}),s.init(),e||s.changeSlide({data:{message:"index",index:t}},!1)},e.prototype.registerBreakpoints=function(){var e,t,o,s=this,n=s.options.responsive||null;if("array"===i.type(n)&&n.length){s.respondTo=s.options.respondTo||"window";for(e in n)if(o=s.breakpoints.length-1,n.hasOwnProperty(e)){for(t=n[e].breakpoint;o>=0;)s.breakpoints[o]&&s.breakpoints[o]===t&&s.breakpoints.splice(o,1),o--;s.breakpoints.push(t),s.breakpointSettings[t]=n[e].settings}s.breakpoints.sort(function(i,e){return s.options.mobileFirst?i-e:e-i})}},e.prototype.reinit=function(){var e=this;e.$slides=e.$slideTrack.children(e.options.slide).addClass("slick-slide"),e.slideCount=e.$slides.length,e.currentSlide>=e.slideCount&&0!==e.currentSlide&&(e.currentSlide=e.currentSlide-e.options.slidesToScroll),e.slideCount<=e.options.slidesToShow&&(e.currentSlide=0),e.registerBreakpoints(),e.setProps(),e.setupInfinite(),e.buildArrows(),e.updateArrows(),e.initArrowEvents(),e.buildDots(),e.updateDots(),e.initDotEvents(),e.cleanUpSlideEvents(),e.initSlideEvents(),e.checkResponsive(!1,!0),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().on("click.slick",e.selectHandler),e.setSlideClasses("number"==typeof e.currentSlide?e.currentSlide:0),e.setPosition(),e.focusHandler(),e.paused=!e.options.autoplay,e.autoPlay(),e.$slider.trigger("reInit",[e])},e.prototype.resize=function(){var e=this;i(window).width()!==e.windowWidth&&(clearTimeout(e.windowDelay),e.windowDelay=window.setTimeout(function(){e.windowWidth=i(window).width(),e.checkResponsive(),e.unslicked||e.setPosition()},50))},e.prototype.removeSlide=e.prototype.slickRemove=function(i,e,t){var o=this;if(i="boolean"==typeof i?!0===(e=i)?0:o.slideCount-1:!0===e?--i:i,o.slideCount<1||i<0||i>o.slideCount-1)return!1;o.unload(),!0===t?o.$slideTrack.children().remove():o.$slideTrack.children(this.options.slide).eq(i).remove(),o.$slides=o.$slideTrack.children(this.options.slide),o.$slideTrack.children(this.options.slide).detach(),o.$slideTrack.append(o.$slides),o.$slidesCache=o.$slides,o.reinit()},e.prototype.setCSS=function(i){var e,t,o=this,s={};
19255!0===o.options.rtl&&(i=-i),e="left"==o.positionProp?Math.ceil(i)+"px":"0px",t="top"==o.positionProp?Math.ceil(i)+"px":"0px",s[o.positionProp]=i,!1===o.transformsEnabled?o.$slideTrack.css(s):(s={},!1===o.cssTransitions?(s[o.animType]="translate("+e+", "+t+")",o.$slideTrack.css(s)):(s[o.animType]="translate3d("+e+", "+t+", 0px)",o.$slideTrack.css(s)))},e.prototype.setDimensions=function(){var i=this;!1===i.options.vertical?!0===i.options.centerMode&&i.$list.css({padding:"0px "+i.options.centerPadding}):(i.$list.height(i.$slides.first().outerHeight(!0)*i.options.slidesToShow),!0===i.options.centerMode&&i.$list.css({padding:i.options.centerPadding+" 0px"})),i.listWidth=i.$list.width(),i.listHeight=i.$list.height(),!1===i.options.vertical&&!1===i.options.variableWidth?(i.slideWidth=Math.ceil(i.listWidth/i.options.slidesToShow),i.$slideTrack.width(Math.ceil(i.slideWidth*i.$slideTrack.children(".slick-slide").length))):!0===i.options.variableWidth?i.$slideTrack.width(5e3*i.slideCount):(i.slideWidth=Math.ceil(i.listWidth),i.$slideTrack.height(Math.ceil(i.$slides.first().outerHeight(!0)*i.$slideTrack.children(".slick-slide").length)));var e=i.$slides.first().outerWidth(!0)-i.$slides.first().width();!1===i.options.variableWidth&&i.$slideTrack.children(".slick-slide").width(i.slideWidth-e)},e.prototype.setFade=function(){var e,t=this;t.$slides.each(function(o,s){e=t.slideWidth*o*-1,!0===t.options.rtl?i(s).css({position:"relative",right:e,top:0,zIndex:t.options.zIndex-2,opacity:0}
19255):i(s).css({position:"relative",left:e,top:0,zIndex:t.options.zIndex-2,opacity:0})}),t.$slides.eq(t.currentSlide).css({zIndex:t.options.zIndex-1,opacity:1})},e.prototype.setHeight=function(){var i=this;if(1===i.options.slidesToShow&&!0===i.options.adaptiveHeight&&!1===i.options.vertical){var e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.css("height",e)}},e.prototype.setOption=e.prototype.slickSetOption=function(){var e,t,o,s,n,r=this,l=!1;if("object"===i.type(arguments[0])?(o=arguments[0],l=arguments[1],n="multiple"):"string"===i.type(arguments[0])&&(o=arguments[0],s=arguments[1],l=arguments[2],"responsive"===arguments[0]&&"array"===i.type(arguments[1])?n="responsive":void 0!==arguments[1]&&(n="single")),"single"===n)r.options[o]=s;else if("multiple"===n)i.each(o,function(i,e){r.options[i]=e});else if("responsive"===n)for(t in s)if("array"!==i.type(r.options.responsive))r.options.responsive=[s[t]];else{for(e=r.options.responsive.length-1;e>=0;)r.options.responsive[e].breakpoint===s[t].breakpoint&&r.options.responsive.splice(e,1),e--;r.options.responsive.push(s[t])}l&&(r.unload(),r.reinit())},e.prototype.setPosition=function(){var i=this;i.setDimensions(),i.setHeight(),!1===i.options.fade?i.setCSS(i.getLeft(i.currentSlide)):i.setFade(),i.$slider.trigger("setPosition",[i])},e.prototype.setProps=function(){var i=this,e=document.body.style;i.positionProp=!0===i.options.vertical?"top":"left","top"===i.positionProp?i.$slider.addClass("slick-vertical"):i.$slider.removeClass("slick-vertical"),void 0===e.WebkitTransition&&void 0===e.MozTransition&&void 0===e.msTransition||!0===i.options.useCSS&&(i.cssTransitions=!0),i.options.fade&&("number"==typeof i.options.zIndex?i.options.zIndex<3&&(i.options.zIndex=3):i.options.zIndex=i.defaults.zIndex),void 0!==e.OTransform&&(i.animType="OTransform",i.transformType="-o-transform",i.transitionType="OTransition",void 0===e.perspectiveProperty&&void 0===e.webkitPerspective&&(i.animType=!1)),void 0!==e.MozTransform&&(i.animType="MozTransform",i.transformType="-moz-transform",i.transitionType="MozTransition",void 0===e.perspectiveProperty&&void 0===e.MozPerspective&&(i.animType=!1)),void 0!==e.webkitTransform&&(i.animType="webkitTransform",i.transformType="-webkit-transform",i.transitionType="webkitTransition",void 0===e.perspectiveProperty&&void 0===e.webkitPerspective&&(i.animType=!1)),void 0!==e.msTransform&&(i.animType="msTransform",i.transformType="-ms-transform",i.transitionType="msTransition",void 0===e.msTransform&&(i.animType=!1)),void 0!==e.transform&&!1!==i.animType&&(i.animType="transform",i.transformType="transform",i.transitionType="transition"),i.transformsEnabled=i.options.useTransform&&null!==i.animType&&!1!==i.animType},e.prototype.setSlideClasses=function(i){var e,t,o,s,n=this;if(t=n.$slider.find(".slick-slide").removeClass("slick-active slick-center slick-current").attr("aria-hidden","true"),n.$slides.eq(i).addClass("slick-current"),!0===n.options.centerMode){var r=n.options.slidesToShow%2==0?1:0;e=Math.floor(n.options.slidesToShow/2),!0===n.options.infinite&&(i>=e&&i<=n.slideCount-1-e?n.$slides.slice(i-e+r,i+e+1).addClass("slick-active").attr("aria-hidden","false"):(o=n.options.slidesToShow+i,t.slice(o-e+1+r,o+e+2).addClass("slick-active").attr("aria-hidden","false")),0===i?t.eq(t.length-1-n.options.slidesToShow).addClass("slick-center"):i===n.slideCount-1&&t.eq(n.options.slidesToShow).addClass("slick-center")),n.$slides.eq(i).addClass("slick-center")}else i>=0&&i<=n.slideCount-n.options.slidesToShow?n.$slides.slice(i,i+n.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"):t.length<=n.options.slidesToShow?t.addClass("slick-active").attr("aria-hidden","false"):(s=n.slideCount%n.options.slidesToShow,o=!0===n.options.infinite?n.options.slidesToShow+i:i,n.options.slidesToShow==n.options.slidesToScroll&&n.slideCount-i<n.options.slidesToShow?t.slice(o-(n.options.slidesToShow-s),o+s).addClass("slick-active").attr("aria-hidden","false"):t.slice(o,o+n.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"));"ondemand"!==n.options.lazyLoad&&"anticipated"!==n.options.lazyLoad||n.lazyLoad()},e.prototype.setupInfinite=function(){var e,t,o,s=this;if(!0===s.options.fade&&(s.options.centerMode=!1),!0===s.options.infinite&&!1===s.options.fade&&(t=null,s.slideCount>s.options.slidesToShow)){for(o=!0===s.options.centerMode?s.options.slidesToShow+1:s.options.slidesToShow,e=s.slideCount;e>s.slideCount-o;e-=1)t=e-1,i(s.$slides[t]).clone(!0).attr("id","").attr("data-slick-index",t-s.slideCount).prependTo(s.$slideTrack).addClass("slick-cloned");for(e=0;e<o+s.slideCount;e+=1)t=e,i(s.$slides[t]).clone(!0).attr("id","").attr("data-slick-index",t+s.slideCount).appendTo(s.$slideTrack).addClass("slick-cloned");s.$slideTrack.find(".slick-cloned").find("[id]").each(function(){i(this).attr("id","")})}},e.prototype.interrupt=function(i){var e=this;i||e.autoPlay(),e.interrupted=i},e.prototype.selectHandler=function(e){var t=this,o=i(e.target).is(".slick-slide")?i(e.target):i(e.target).parents(".slick-slide"),s=parseInt(o.attr("data-slick-index"));s||(s=0),t.slideCount<=t.options.slidesToShow?t.slideHandler(s,!1,!0):t.slideHandler(s)},e.prototype.slideHandler=function(i,e,t){var o,s,n,r,l,d=null,a=this;if(e=e||!1,!(!0===a.animating&&!0===a.options.waitForAnimate||!0===a.options.fade&&a.currentSlide===i))if(!1===e&&a.asNavFor(i),o=i,d=a.getLeft(o),r=a.getLeft(a.currentSlide),a.currentLeft=null===a.swipeLeft?r:a.swipeLeft,!1===a.options.infinite&&!1===a.options.centerMode&&(i<0||i>a.getDotCount()*a.options.slidesToScroll))!1===a.options.fade&&(o=a.currentSlide,!0!==t?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o));else if(!1===a.options.infinite&&!0===a.options.centerMode&&(i<0||i>a.slideCount-a.options.slidesToScroll))!1===a.options.fade&&(o=a.currentSlide,!0!==t?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o));else{if(a.options.autoplay&&clearInterval(a.autoPlayTimer),s=o<0?a.slideCount%a.options.slidesToScroll!=0?a.slideCount-a.slideCount%a.options.slidesToScroll:a.slideCount+
19255o:o>=a.slideCount?a.slideCount%a.options.slidesToScroll!=0?0:o-a.slideCount:o,a.animating=!0,a.$slider.trigger("beforeChange",[a,a.currentSlide,s]),n=a.currentSlide,a.currentSlide=s,a.setSlideClasses(a.currentSlide),a.options.asNavFor&&(l=(l=a.getNavTarget()).slick("getSlick")).slideCount<=l.options.slidesToShow&&l.setSlideClasses(a.currentSlide),a.updateDots(),a.updateArrows(),!0===a.options.fade)return!0!==t?(a.fadeSlideOut(n),a.fadeSlide(s,function(){a.postSlide(s)})):a.postSlide(s),void a.animateHeight();!0!==t?a.animateSlide(d,function(){a.postSlide(s)}):a.postSlide(s)}},e.prototype.startLoad=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.hide(),i.$nextArrow.hide()),!0===i.options.dots&&i.slideCount>i.options.slidesToShow&&i.$dots.hide(),i.$slider.addClass("slick-loading")},e.prototype.swipeDirection=function(){var i,e,t,o,s=this;return i=s.touchObject.startX-s.touchObject.curX,e=s.touchObject.startY-s.touchObject.curY,t=Math.atan2(e,i),(o=Math.round(180*t/Math.PI))<0&&(o=360-Math.abs(o)),o<=45&&o>=0?!1===s.options.rtl?"left":"right":o<=360&&o>=315?!1===s.options.rtl?"left":"right":o>=135&&o<=225?!1===s.options.rtl?"right":"left":!0===s.options.verticalSwiping?o>=35&&o<=135?"down":"up":"vertical"},e.prototype.swipeEnd=function(i){var e,t,o=this;if(o.dragging=!1,o.swiping=!1,o.scrolling)return o.scrolling=!1,!1;if(o.interrupted=!1,o.shouldClick=!(o.touchObject.swipeLength>10),void 0===o.touchObject.curX)return!1;if(!0===o.touchObject.edgeHit&&o.$slider.trigger("edge",[o,o.swipeDirection()]),o.touchObject.swipeLength>=o.touchObject.minSwipe){switch(t=o.swipeDirection()){case"left":case"down":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide+o.getSlideCount()):o.currentSlide+o.getSlideCount(),o.currentDirection=0;break;case"right":case"up":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide-o.getSlideCount()):o.currentSlide-o.getSlideCount(),o.currentDirection=1}"vertical"!=t&&(o.slideHandler(e),o.touchObject={},o.$slider.trigger("swipe",[o,t]))}else o.touchObject.startX!==o.touchObject.curX&&(o.slideHandler(o.currentSlide),o.touchObject={})},e.prototype.swipeHandler=function(i){var e=this;if(!(!1===e.options.swipe||"ontouchend"in document&&!1===e.options.swipe||!1===e.options.draggable&&-1!==i.type.indexOf("mouse")))switch(e.touchObject.fingerCount=i.originalEvent&&void 0!==i.originalEvent.touches?i.originalEvent.touches.length:1,e.touchObject.minSwipe=e.listWidth/e.options.touchThreshold,!0===e.options.verticalSwiping&&(e.touchObject.minSwipe=e.listHeight/e.options.touchThreshold),i.data.action){case"start":e.swipeStart(i);break;case"move":e.swipeMove(i);break;case"end":e.swipeEnd(i)}},e.prototype.swipeMove=function(i){var e,t,o,s,n,r,l=this;return n=void 0!==i.originalEvent?i.originalEvent.touches:null,!(!l.dragging||l.scrolling||n&&1!==n.length)&&(e=l.getLeft(l.currentSlide),l.touchObject.curX=void 0!==n?n[0].pageX:i.clientX,l.touchObject.curY=void 0!==n?n[0].pageY:i.clientY,l.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(l.touchObject.curX-l.touchObject.startX,2))),r=Math.round(Math.sqrt(Math.pow(l.touchObject.curY-l.touchObject.startY,2))),!l.options.verticalSwiping&&!l.swiping&&r>4?(l.scrolling=!0,!1):(!0===l.options.verticalSwiping&&(l.touchObject.swipeLength=r),t=l.swipeDirection(),void 0!==i.originalEvent&&l.touchObject.swipeLength>4&&(l.swiping=!0,i.preventDefault()),s=(!1===l.options.rtl?1:-1)*(l.touchObject.curX>l.touchObject.startX?1:-1),!0===l.options.verticalSwiping&&(s=l.touchObject.curY>l.touchObject.startY?1:-1),o=l.touchObject.swipeLength,l.touchObject.edgeHit=!1,!1===l.options.infinite&&(0===l.currentSlide&&"right"===t||l.currentSlide>=l.getDotCount()&&"left"===t)&&(o=l.touchObject.swipeLength*l.options.edgeFriction,l.touchObject.edgeHit=!0),!1===l.options.vertical?l.swipeLeft=e+o*s:l.swipeLeft=e+o*(l.$list.height()/l.listWidth)*s,!0===l.options.verticalSwiping&&(l.swipeLeft=e+o*s),!0!==l.options.fade&&!1!==l.options.touchMove&&(!0===l.animating?(l.swipeLeft=null,!1):void l.setCSS(l.swipeLeft))))},e.prototype.swipeStart=function(i){var e,t=this;if(t.interrupted=!0,1!==t.touchObject.fingerCount||t.slideCount<=t.options.slidesToShow)return t.touchObject={},!1;void 0!==i.originalEvent&&void 0!==i.originalEvent.touches&&(e=i.originalEvent.touches[0]),t.touchObject.startX=t.touchObject.curX=void 0!==e?e.pageX:i.clientX,t.touchObject.startY=t.touchObject.curY=void 0!==e?e.pageY:i.clientY,t.dragging=!0},e.prototype.unfilterSlides=e.prototype.slickUnfilter=function(){var i=this;null!==i.$slidesCache&&(i.unload(),i.$slideTrack.children(this.options.slide).detach(),i.$slidesCache.appendTo(i.$slideTrack),i.reinit())},e.prototype.unload=function(){var e=this;i(".slick-cloned",e.$slider).remove(),e.$dots&&e.$dots.remove(),e.$prevArrow&&e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.remove(),e.$nextArrow&&e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.remove(),e.$slides.removeClass("slick-slide slick-active slick-visible slick-current").attr("aria-hidden","true").css("width","")}
19255,e.prototype.unslick=function(i){var e=this;e.$slider.trigger("unslick",[e,i]),e.destroy()},e.prototype.updateArrows=function(){var i=this;Math.floor(i.options.slidesToShow/2),!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&!i.options.infinite&&(i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false"),i.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false"),0===i.currentSlide?(i.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false")):i.currentSlide>=i.slideCount-i.options.slidesToShow&&!1===i.options.centerMode?(i.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")):i.currentSlide>=i.slideCount-1&&!0===i.options.centerMode&&(i.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")))},e.prototype.updateDots=function(){var i=this;null!==i.$dots&&(i.$dots.find("li").removeClass("slick-active").end(),i.$dots.find("li").eq(Math.floor(i.currentSlide/i.options.slidesToScroll)).addClass("slick-active"))},e.prototype.visibility=function(){var i=this;i.options.autoplay&&(document[i.hidden]?i.interrupted=!0:i.interrupted=!1)},i.fn.slick=function(){var i,t,o=this,s=arguments[0],n=Array.prototype.slice.call(arguments,1),r=o.length;for(i=0;i<r;i++)if("object"==typeof s||void 0===s?o[i].slick=new e(o[i],s):t=o[i].slick[s].apply(o[i].slick,n),void 0!==t)return t;return o}});
19256
19257/**
19258 * vis.js
19259 * https://github.com/almende/vis
19260 *
19261 * A dynamic, browser-based visualization library.
19262 *
19263 * @version 4.20.1-SNAPSHOT
19264 * @date    2017-10-12
19265 *
19266 * @license
19267 * Copyright (C) 2011-2017 Almende B.V, http://almende.com
19268 *
19269 * Vis.js is dual licensed under both
19270 *
19271 * * The Apache 2.0 License
19272 *   http://www.apache.org/licenses/LICENSE-2.0
19273 *
19274 * and
19275 *
19276 * * The MIT License
19277 *   http://opensource.org/licenses/MIT
19278 *
19279 * Vis.js may be distributed under either license.
19280 */
19281"use strict";!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.vis=e():t.vis=e()}(this,function(){return function(t){function e(o){if(i[o])return i[o].exports;var n=i[o]={i:o,l:!1,exports:{}};return t[o].call(n.exports,n,n.exports,e),n.l=!0,n.exports}var i={};return e.m=t,e.c=i,e.d=function(t,i,o){e.o(t,i)||Object.defineProperty(t,i,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(i,"a",i),i},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=123)}([function(t,e,i){e.__esModule=!0,e.default=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}},function(t,e,i){e.__esModule=!0;var o=i(169),n=function(t){return t&&t.__esModule?t:{default:t}}(o);e.default=function(){function t(t,e){for(var i=0;i<e.length;i++){var o=e[i];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),(0,n.default)(t,o.key,o)}}return function(e,i,o){return i&&t(e.prototype,i),o&&t(e,o),e}}()},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(t,e,i,o){var n=!1;!0===o&&(n=null===e[i]&&void 0!==t[i]),n?delete t[i]:t[i]=e[i]}var s=i(77),r=o(s),a=i(29),h=o(a),d=i(8),l=o(d),u=i(6),c=o(u),p=i(9),f=i(157);e.isNumber=function(t){return t instanceof Number||"number"==typeof t},e.recursiveDOMDelete=function(t){if(t)for(;!0===t.hasChildNodes();)e.recursiveDOMDelete(t.firstChild),t.removeChild(t.firstChild)},e.giveRange=function(t,e,i,o){if(e==t)return.5;var n=1/(e-t);return Math.max(0,(o-t)*n)},e.isString=function(t){return t instanceof String||"string"==typeof t},e.isDate=function(t){if(t instanceof Date)return!0;if(e.isString(t)){if(m.exec(t))return!0;if(!isNaN(Date.parse(t)))return!0}return!1},e.randomUUID=function(){return f.v4()},e.assignAllKeys=function(t,e){for(var i in t)t.hasOwnProperty(i)&&"object"!==(0,c.default)(t[i])&&(t[i]=e)},e.fillIfDefined=function(t,i){var o=arguments.length>2&&void 0!==arguments[2]&&arguments[2];for(var s in t)void 0!==i[s]&&(null===i[s]||"object"!==(0,c.default)(i[s])?n(t,i,s,o):"object"===(0,c.default)(t[s])&&e.fillIfDefined(t[s],i[s],o))},e.extend=function(t,e){for(var i=1;i<arguments.length;i++){var o=arguments[i];for(var n in o)o.hasOwnProperty(n)&&(t[n]=o[n])}return t}
19281,e.selectiveExtend=function(t,e,i){if(!Array.isArray(t))throw new Error("Array with property names expected as first argument");for(var o=2;o<arguments.length;o++)for(var n=arguments[o],s=0;s<t.length;s++){var r=t[s];n&&n.hasOwnProperty(r)&&(e[r]=n[r])}return e},e.selectiveDeepExtend=function(t,i,o){var s=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(Array.isArray(o))throw new TypeError("Arrays are not supported by deepExtend");for(var r=0;r<t.length;r++){var a=t[r];if(o.hasOwnProperty(a))if(o[a]&&o[a].constructor===Object)void 0===i[a]&&(i[a]={}),i[a].constructor===Object?e.deepExtend(i[a],o[a],!1,s):n(i,o,a,s);else{if(Array.isArray(o[a]))throw new TypeError("Arrays are not supported by deepExtend");n(i,o,a,s)}}return i},e.selectiveNotDeepExtend=function(t,i,o){var s=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(Array.isArray(o))throw new TypeError("Arrays are not supported by deepExtend");for(var r in o)if(o.hasOwnProperty(r)&&-1===t.indexOf(r))if(o[r]&&o[r].constructor===Object)void 0===i[r]&&(i[r]={}),i[r].constructor===Object?e.deepExtend(i[r],o[r]):n(i,o,r,s);else if(Array.isArray(o[r])){i[r]=[];for(var a=0;a<o[r].length;a++)i[r].push(o[r][a])}else n(i,o,r,s);return i},e.deepExtend=function(t,i){var o=arguments.length>2&&void 0!==arguments[2]&&arguments[2],s=arguments.length>3&&void 0!==arguments[3]&&arguments[3];for(var r in i)if(i.hasOwnProperty(r)||!0===o)if(i[r]&&i[r].constructor===Object)void 0===t[r]&&(t[r]={}),t[r].constructor===Object?e.deepExtend(t[r],i[r],o):n(t,i,r,s);else if(Array.isArray(i[r])){t[r]=[];for(var a=0;a<i[r].length;a++)t[r].push(i[r][a])}else n(t,i,r,s);return t},e.equalArray=function(t,e){if(t.length!=e.length)return!1;for(var i=0,o=t.length;i<o;i++)if(t[i]!=e[i])return!1;return!0},e.convert=function(t,i){var o;if(void 0!==t){if(null===t)return null;if(!i)return t;if("string"!=typeof i&&!(i instanceof String))throw new Error("Type must be a string");switch(i){case"boolean":case"Boolean":return Boolean(t);case"number":case"Number":return e.isString(t)&&!isNaN(Date.parse(t))?p(t).valueOf():Number(t.valueOf());case"string":case"String":return String(t);case"Date":if(e.isNumber(t))return new Date(t);if(t instanceof Date)return new Date(t.valueOf());if(p.isMoment(t))return new Date(t.valueOf());if(e.isString(t))return o=m.exec(t),o?new Date(Number(o[1])):p(new Date(t)).toDate();throw new Error("Cannot convert object of type "+e.getType(t)+" to type Date");case"Moment":if(e.isNumber(t))return p(t);if(t instanceof Date)return p(t.valueOf());if(p.isMoment(t))return p(t);if(e.isString(t))return o=m.exec(t),p(o?Number(o[1]):t);throw new Error("Cannot convert object of type "+e.getType(t)+" to type Date");case"ISODate":if(e.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(p.isMoment(t))return t.toDate().toISOString();if(e.isString(t))return o=m.exec(t),o?new Date(Number(o[1])).toISOString():p(t).format();throw new Error("Cannot convert object of type "+e.getType(t)+" to type ISODate");case"ASPDate":if(e.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(e.isString(t)){o=m.exec(t);return"/Date("+(o?new Date(Number(o[1])).valueOf():new Date(t).valueOf())+")/"}throw new Error("Cannot convert object of type "+e.getType(t)+" to type ASPDate");default:throw new Error('Unknown type "'+i+'"')}}};var m=/^\/?Date\((\-?\d+)/i;e.getType=function(t){var e=void 0===t?"undefined":(0,c.default)(t);return"object"==e?null===t?"null":t instanceof Boolean?"Boolean":t instanceof Number?"Number":t instanceof String?"String":Array.isArray(t)?"Array":t instanceof Date?"Date":"Object":"number"==e?"Number":"boolean"==e?"Boolean":"string"==e?"String":void 0===e?"undefined":e},e.copyAndExtendArray=function(t,e){for(var i=[],o=0;o<t.length;o++)i.push(t[o]);return i.push(e),i},e.copyArray=function(t){for(var e=[],i=0;i<t.length;i++)e.push(t[i]);return e},e.getAbsoluteLeft=function(t){return t.getBoundingClientRect().left},e.getAbsoluteRight=function(t){return t.getBoundingClientRect().right},e.getAbsoluteTop=function(t){return t.getBoundingClientRect().top},e.addClassName=function(t,e){var i=t.className.split(" "),o=e.split(" ");i=i.concat(o.filter(function(t){return i.indexOf(t)<0})),t.className=i.join(" ")},e.removeClassName=function(t,e){var i=t.className.split(" "),o=e.split(" ");i=i.filter(function(t){return o.indexOf(t)<0}),t.className=i.join(" ")},e.forEach=function(t,e){var i,o;if(Array.isArray(t))for(i=0,o=t.length;i<o;i++)e(t[i],i,t);else for(i in t)t.hasOwnProperty(i)&&e(t[i],i,t)},e.toArray=function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(t[i]);return e}
19281,e.updateProperty=function(t,e,i){return t[e]!==i&&(t[e]=i,!0)},e.throttle=function(t){var e=!1;return function(){e||(e=!0,requestAnimationFrame(function(){e=!1,t()}))}},e.addEventListener=function(t,e,i,o){t.addEventListener?(void 0===o&&(o=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,o)):t.attachEvent("on"+e,i)},e.removeEventListener=function(t,e,i,o){t.removeEventListener?(void 0===o&&(o=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,o)):t.detachEvent("on"+e,i)},e.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},e.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},e.hasParent=function(t,e){for(var i=t;i;){if(i===e)return!0;i=i.parentNode}return!1},e.option={},e.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},e.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},e.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},e.option.asSize=function(t,i){return"function"==typeof t&&(t=t()),e.isString(t)?t:e.isNumber(t)?t+"px":i||null},e.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},e.hexToRGB=function(t){var e=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;t=t.replace(e,function(t,e,i,o){return e+e+i+i+o+o});var i=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return i?{r:parseInt(i[1],16),g:parseInt(i[2],16),b:parseInt(i[3],16)}:null},e.overrideOpacity=function(t,i){var o;return-1!=t.indexOf("rgba")?t:-1!=t.indexOf("rgb")?(o=t.substr(t.indexOf("(")+1).replace(")","").split(","),"rgba("+o[0]+","+o[1]+","+o[2]+","+i+")"):(o=e.hexToRGB(t),null==o?t:"rgba("+o.r+","+o.g+","+o.b+","+i+")")},e.RGBToHex=function(t,e,i){return"#"+((1<<24)+(t<<16)+(e<<8)+i).toString(16).slice(1)},e.parseColor=function(t){var i;if(!0===e.isString(t)){if(!0===e.isValidRGB(t)){var o=t.substr(4).substr(0,t.length-5).split(",").map(function(t){return parseInt(t)});t=e.RGBToHex(o[0],o[1],o[2])}if(!0===e.isValidHex(t)){var n=e.hexToHSV(t),s={h:n.h,s:.8*n.s,v:Math.min(1,1.02*n.v)},r={h:n.h,s:Math.min(1,1.25*n.s),v:.8*n.v},a=e.HSVToHex(r.h,r.s,r.v),h=e.HSVToHex(s.h,s.s,s.v);i={background:t,border:a,highlight:{background:h,border:a},hover:{background:h,border:a}}}else i={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}}}else i={},i.background=t.background||void 0,i.border=t.border||void 0,e.isString(t.highlight)?i.highlight={border:t.highlight,background:t.highlight}:(i.highlight={},i.highlight.background=t.highlight&&t.highlight.background||void 0,i.highlight.border=t.highlight&&t.highlight.border||void 0),e.isString(t.hover)?i.hover={border:t.hover,background:t.hover}:(i.hover={},i.hover.background=t.hover&&t.hover.background||void 0,i.hover.border=t.hover&&t.hover.border||void 0);return i},e.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var o=Math.min(t,Math.min(e,i)),n=Math.max(t,Math.max(e,i));if(o==n)return{h:0,s:0,v:o};var s=t==o?e-i:i==o?t-e:i-t;return{h:60*((t==o?3:i==o?1:5)-s/(n-o))/360,s:(n-o)/n,v:n}};var v={split:function(t){var e={};return t.split(";").forEach(function(t){if(""!=t.trim()){var i=t.split(":"),o=i[0].trim(),n=i[1].trim();e[o]=n}}),e},join:function(t){return(0,l.default)(t).map(function(e){return e+": "+t[e]}).join("; ")}};e.addCssText=function(t,i){var o=v.split(t.style.cssText),n=v.split(i),s=e.extend(o,n);t.style.cssText=v.join(s)},e.removeCssText=function(t,e){var i=v.split(t.style.cssText),o=v.split(e);for(var n in o)o.hasOwnProperty(n)&&delete i[n];t.style.cssText=v.join(i)},e.HSVToRGB=function(t,e,i){var o,n,s,r=Math.floor(6*t),a=6*t-r,h=i*(1-e),d=i*(1-a*e),l=i*(1-(1-a)*e);switch(r%6){case 0:o=i,n=l,s=h;break;case 1:o=d,n=i,s=h;break;case 2:o=h,n=i,s=l;break;case 3:o=h,n=d,s=i;break;case 4:o=l,n=h,s=i;break;case 5:o=i,n=h,s=d}return{r:Math.floor(255*o),g:Math.floor(255*n),b:Math.floor(255*s)}},e.HSVToHex=function(t,i,o){var n=e.HSVToRGB(t,i,o);return e.RGBToHex(n.r,n.g,n.b)},e.hexToHSV=function(t){var i=e.hexToRGB(t);return e.RGBToHSV(i.r,i.g,i.b)},e.isValidHex=function(t){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t)},e.isValidRGB=function(t){return t=t.replace(" ",""),/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(t)},e.isValidRGBA=function(t){return t=t.replace(" ",""),/rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(.{1,3})\)/i.test(t)},e.selectiveBridgeObject=function(t,i){if(null!==i&&"object"===(void 0===i?"undefined":(0,c.default)(i))){for(var o=(0,h.default)(i),n=0;n<t.length;n++)i.hasOwnProperty(t[n])&&"object"==(0,c.default)(i[t[n]])&&(o[t[n]]=e.bridgeObject(i[t[n]]));return o}return null},e.bridgeObject=function(t){if(null!==t&&"object"===(void 0===t?"undefined":(0,c.default)(t))){var i=(0,h.default)(t);if(t instanceof Element)i=t;else{i=(0,h.default)(t);for(var o in t)t.hasOwnProperty(o)&&"object"==(0,c.default)(t[o])&&
19281(i[o]=e.bridgeObject(t[o]))}return i}return null},e.insertSort=function(t,e){for(var i=0;i<t.length;i++){for(var o=t[i],n=i;n>0&&e(o,t[n-1])<0;n--)t[n]=t[n-1];t[n]=o}return t},e.mergeOptions=function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=function(t){return null!==t&&void 0!==t},s=function(t){return null!==t&&"object"===(void 0===t?"undefined":(0,c.default)(t))};if(!s(t))throw new Error("Parameter mergeTarget must be an object");if(!s(e))throw new Error("Parameter options must be an object");if(!n(i))throw new Error("Parameter option must have a value");if(!s(o))throw new Error("Parameter globalOptions must be an object");var r=e[i],a=s(o)&&!function(t){for(var e in t)if(t.hasOwnProperty(e))return!1;return!0}(o),d=a?o[i]:void 0,l=d?d.enabled:void 0;if(void 0!==r){if("boolean"==typeof r)return s(t[i])||(t[i]={}),void(t[i].enabled=r);if(null===r&&!s(t[i])){if(!n(d))return;t[i]=(0,h.default)(d)}if(s(r)){var u=!0;void 0!==r.enabled?u=r.enabled:void 0!==l&&(u=d.enabled),function(t,e,i){s(t[i])||(t[i]={});var o=e[i],n=t[i];for(var r in o)o.hasOwnProperty(r)&&(n[r]=o[r])}(t,e,i),t[i].enabled=u}}},e.binarySearchCustom=function(t,e,i,o){for(var n=0,s=0,r=t.length-1;s<=r&&n<1e4;){var a=Math.floor((s+r)/2),h=t[a],d=void 0===o?h[i]:h[i][o],l=e(d);if(0==l)return a;-1==l?s=a+1:r=a-1,n++}return-1},e.binarySearchValue=function(t,e,i,o,n){var s,r,a,h,d=0,l=0,u=t.length-1;for(n=void 0!=n?n:function(t,e){return t==e?0:t<e?-1:1};l<=u&&d<1e4;){if(h=Math.floor(.5*(u+l)),s=t[Math.max(0,h-1)][i],r=t[h][i],a=t[Math.min(t.length-1,h+1)][i],0==n(r,e))return h;if(n(s,e)<0&&n(r,e)>0)return"before"==o?Math.max(0,h-1):h;if(n(r,e)<0&&n(a,e)>0)return"before"==o?h:Math.min(t.length-1,h+1);n(r,e)<0?l=h+1:u=h-1,d++}return-1},e.easingFunctions={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return t*(2-t)},easeInOutQuad:function(t){return t<.5?2*t*t:(4-2*t)*t-1},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return--t*t*t+1},easeInOutCubic:function(t){return t<.5?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return 1- --t*t*t*t},easeInOutQuart:function(t){return t<.5?8*t*t*t*t:1-8*--t*t*t*t},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return 1+--t*t*t*t*t},easeInOutQuint:function(t){return t<.5?16*t*t*t*t*t:1+16*--t*t*t*t*t}},e.getScrollBarWidth=function(){var t=document.createElement("p");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.style.visibility="hidden",e.style.width="200px",e.style.height="150px",e.style.overflow="hidden",e.appendChild(t),document.body.appendChild(e);var i=t.offsetWidth;e.style.overflow="scroll";var o=t.offsetWidth;return i==o&&(o=e.clientWidth),document.body.removeChild(e),i-o},e.topMost=function(t,e){var i=void 0;Array.isArray(e)||(e=[e]);var o=!0,n=!1,s=void 0;try{for(var a,h=(0,r.default)(t);!(o=(a=h.next()).done);o=!0){var d=a.value;if(d){i=d[e[0]];for(var l=1;l<e.length;l++)i&&(i=i[e[l]]);if(void 0!==i)break}}}catch(t){n=!0,s=t}finally{try{!o&&h.return&&h.return()}finally{if(n)throw s}}return i}},function(t,e,i){t.exports={default:i(194),__esModule:!0}},function(t,e,i){e.__esModule=!0;var o=i(6),n=function(t){return t&&t.__esModule?t:{default:t}}(o);e.default=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!==(void 0===e?"undefined":(0,n.default)(e))&&"function"!=typeof e?t:e}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}e.__esModule=!0;var n=i(196),s=o(n),r=i(29),a=o(r),h=i(6),d=o(h);e.default=function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+(void 0===e?"undefined":(0,d.default)(e)));t.prototype=(0,a.default)(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(s.default?(0,s.default)(t,e):t.__proto__=e)}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}e.__esModule=!0;var n=i(142),s=o(n),r=i(144),a=o(r),h="function"==typeof a.default&&"symbol"==typeof s.default?function(t){return typeof t}:function(t){return t&&"function"==typeof a.default&&t.constructor===a.default&&t!==a.default.prototype?"symbol":typeof t};e.default="function"==typeof a.default&&"symbol"===h(s.default)?function(t){return void 0===t?"undefined":h(t)}:function(t){return t&&"function"==typeof a.default&&t.constructor===a.default&&t!==a.default.prototype?"symbol":void 0===t?"undefined":h(t)}},function(t,e){var i=t.exports={version:"2.5.1"};"number"==typeof __e&&(__e=i)}
19281,function(t,e,i){t.exports={default:i(140),__esModule:!0}},function(t,e,i){t.exports="undefined"!=typeof window&&window.moment||i(154)},function(t,e,i){function o(){var t=function(){};return{on:t,off:t,destroy:t,emit:t,get:function(e){return{set:t}}}}if("undefined"!=typeof window){var n=i(175),s=window.Hammer||i(176);t.exports=n(s,{preventDefault:"mouse"})}else t.exports=function(){return o()}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(t,e){if(t&&!Array.isArray(t)&&(e=t,t=null),this._options=e||{},this._data={},this.length=0,this._fieldId=this._options.fieldId||"id",this._type={},this._options.type)for(var i=(0,l.default)(this._options.type),o=0,n=i.length;o<n;o++){var s=i[o],r=this._options.type[s];this._type[s]="Date"==r||"ISODate"==r||"ASPDate"==r?"Date":r}this._subscribers={},t&&this.add(t),this.setOptions(e)}var s=i(19),r=o(s),a=i(6),h=o(a),d=i(8),l=o(d),u=i(2),c=i(43);n.prototype.setOptions=function(t){t&&void 0!==t.queue&&(!1===t.queue?this._queue&&(this._queue.destroy(),delete this._queue):(this._queue||(this._queue=c.extend(this,{replace:["add","update","remove"]})),"object"===(0,h.default)(t.queue)&&this._queue.setOptions(t.queue)))},n.prototype.on=function(t,e){var i=this._subscribers[t];i||(i=[],this._subscribers[t]=i),i.push({callback:e})},n.prototype.off=function(t,e){var i=this._subscribers[t];i&&(this._subscribers[t]=i.filter(function(t){return t.callback!=e}))},n.prototype._trigger=function(t,e,i){if("*"==t)throw new Error("Cannot trigger event *");var o=[];t in this._subscribers&&(o=o.concat(this._subscribers[t])),"*"in this._subscribers&&(o=o.concat(this._subscribers["*"]));for(var n=0,s=o.length;n<s;n++){var r=o[n];r.callback&&r.callback(t,e,i||null)}},n.prototype.add=function(t,e){var i,o=[],n=this;if(Array.isArray(t))for(var s=0,r=t.length;s<r;s++)i=n._addItem(t[s]),o.push(i);else{if(!t||"object"!==(void 0===t?"undefined":(0,h.default)(t)))throw new Error("Unknown dataType");i=n._addItem(t),o.push(i)}return o.length&&this._trigger("add",{items:o},e),o},n.prototype.update=function(t,e){var i=[],o=[],n=[],s=[],r=this,a=r._fieldId,d=function(t){var e=t[a];if(r._data[e]){var h=u.extend({},r._data[e]);e=r._updateItem(t),o.push(e),s.push(t),n.push(h)}else e=r._addItem(t),i.push(e)};if(Array.isArray(t))for(var l=0,c=t.length;l<c;l++)t[l]&&"object"===(0,h.default)(t[l])?d(t[l]):console.warn("Ignoring input item, which is not an object at index "+l);else{if(!t||"object"!==(void 0===t?"undefined":(0,h.default)(t)))throw new Error("Unknown dataType");d(t)}if(i.length&&this._trigger("add",{items:i},e),o.length){var p={items:o,oldData:n,data:s};this._trigger("update",p,e)}return i.concat(o)},n.prototype.get=function(t){var e,i,o,n=this,s=u.getType(arguments[0]);"String"==s||"Number"==s?(e=arguments[0],o=arguments[1]):"Array"==s?(i=arguments[0],o=arguments[1]):o=arguments[0];var r;if(o&&o.returnType){r=-1==["Array","Object"].indexOf(o.returnType)?"Array":o.returnType}else r="Array";var a,h,d,c,p,f=o&&o.type||this._options.type,m=o&&o.filter,v=[];if(void 0!=e)(a=n._getItem(e,f))&&m&&!m(a)&&(a=null);else if(void 0!=i)for(c=0,p=i.length;c<p;c++)a=n._getItem(i[c],f),m&&!m(a)||v.push(a);else for(h=(0,l.default)(this._data),c=0,p=h.length;c<p;c++)d=h[c],a=n._getItem(d,f),m&&!m(a)||v.push(a);if(o&&o.order&&void 0==e&&this._sort(v,o.order),o&&o.fields){var g=o.fields;if(void 0!=e)a=this._filterFields(a,g);else for(c=0,p=v.length;c<p;c++)v[c]=this._filterFields(v[c],g)}if("Object"==r){var y,b={};for(c=0,p=v.length;c<p;c++)y=v[c],b[y.id]=y;return b}return void 0!=e?a:v},n.prototype.getIds=function(t){var e,i,o,n,s,r=this._data,a=t&&t.filter,h=t&&t.order,d=t&&t.type||this._options.type,u=(0,l.default)(r),c=[];if(a)if(h){for(s=[],e=0,i=u.length;e<i;e++)o=u[e],n=this._getItem(o,d),a(n)&&s.push(n);for(this._sort(s,h),e=0,i=s.length;e<i;e++)c.push(s[e][this._fieldId])}else for(e=0,i=u.length;e<i;e++)o=u[e],n=this._getItem(o,d),a(n)&&c.push(n[this._fieldId]);else if(h){for(s=[],e=0,i=u.length;e<i;e++)o=u[e],s.push(r[o]);for(this._sort(s,h),e=0,i=s.length;e<i;e++)c.push(s[e][this._fieldId])}else for(e=0,i=u.length;e<i;e++)o=u[e],n=r[o],c.push(n[this._fieldId]);return c},n.prototype.getDataSet=function(){return this},n.prototype.forEach=function(t,e){var i,o,n,s,r=e&&e.filter,a=e&&e.type||this._options.type,h=this._data,d=(0,l.default)(h);if(e&&e.order){var u=this.get(e);for(i=0,o=u.length;i<o;i++)n=u[i],s=n[this._fieldId],t(n,s)}else for(i=0,o=d.length;i<o;i++)s=d[i],n=this._getItem(s,a),r&&!r(n)||t(n,s)},n.prototype.map=function(t,e){var i,o,n,s,r=e&&e.filter,a=e&&e.type||this._options.type,h=[],d=this._data,u=(0,l.default)(d);for(i=0,o=u.length;i<o;i++)n=u[i],s=this._getItem(n,a),r&&!r(s)||h.push(t(s,n));return e&&e.order&&this._sort(h,e.order),h},n.prototype._filterFields=function(t,e){if(!t)return t;var i,o,n={},s=(0,l.default)(t),r=s.length;if(Array.isArray(e))for(i=0;i<r;
19281i++)o=s[i],-1!=e.indexOf(o)&&(n[o]=t[o]);else for(i=0;i<r;i++)o=s[i],e.hasOwnProperty(o)&&(n[e[o]]=t[o]);return n},n.prototype._sort=function(t,e){if(u.isString(e)){var i=e;t.sort(function(t,e){var o=t[i],n=e[i];return o>n?1:o<n?-1:0})}else{if("function"!=typeof e)throw new TypeError("Order must be a function or a string");t.sort(e)}},n.prototype.remove=function(t,e){var i,o,n,s,r=[],a=[],h=[];for(h=Array.isArray(t)?t:[t],i=0,o=h.length;i<o;i++)(s=this._remove(h[i]))&&void 0!=(n=s[this._fieldId])&&(r.push(n),a.push(s));return r.length&&this._trigger("remove",{items:r,oldData:a},e),r},n.prototype._remove=function(t){var e,i;return u.isNumber(t)||u.isString(t)?i=t:t&&"object"===(void 0===t?"undefined":(0,h.default)(t))&&(i=t[this._fieldId]),void 0!==i&&this._data[i]?(e=this._data[i],delete this._data[i],this.length--,e):null},n.prototype.clear=function(t){var e,i,o=(0,l.default)(this._data),n=[];for(e=0,i=o.length;e<i;e++)n.push(this._data[o[e]]);return this._data={},this.length=0,this._trigger("remove",{items:o,oldData:n},t),o},n.prototype.max=function(t){var e,i,o=this._data,n=(0,l.default)(o),s=null,r=null;for(e=0,i=n.length;e<i;e++){var a=n[e],h=o[a],d=h[t];null!=d&&(!s||d>r)&&(s=h,r=d)}return s},n.prototype.min=function(t){var e,i,o=this._data,n=(0,l.default)(o),s=null,r=null;for(e=0,i=n.length;e<i;e++){var a=n[e],h=o[a],d=h[t];null!=d&&(!s||d<r)&&(s=h,r=d)}return s},n.prototype.distinct=function(t){var e,i,o,n=this._data,s=(0,l.default)(n),r=[],a=this._options.type&&this._options.type[t]||null,h=0;for(e=0,o=s.length;e<o;e++){var d=s[e],c=n[d],p=c[t],f=!1;for(i=0;i<h;i++)if(r[i]==p){f=!0;break}f||void 0===p||(r[h]=p,h++)}if(a)for(e=0,o=r.length;e<o;e++)r[e]=u.convert(r[e],a);return r},n.prototype._addItem=function(t){var e=t[this._fieldId];if(void 0!=e){if(this._data[e])throw new Error("Cannot add item: item with id "+e+" already exists")}else e=u.randomUUID(),t[this._fieldId]=e;var i,o,n={},s=(0,l.default)(t);for(i=0,o=s.length;i<o;i++){var r=s[i],a=this._type[r];n[r]=u.convert(t[r],a)}return this._data[e]=n,this.length++,e},n.prototype._getItem=function(t,e){var i,o,n,s,r=this._data[t];if(!r)return null;var a={},h=(0,l.default)(r);if(e)for(n=0,s=h.length;n<s;n++)i=h[n],o=r[i],a[i]=u.convert(o,e[i]);else for(n=0,s=h.length;n<s;n++)i=h[n],o=r[i],a[i]=o;return a[this._fieldId]||(a[this._fieldId]=r.id),a},n.prototype._updateItem=function(t){var e=t[this._fieldId];if(void 0==e)throw new Error("Cannot update item: item has no id (item: "+(0,r.default)(t)+")");var i=this._data[e];if(!i)throw new Error("Cannot update item: no item with id "+e+" found");for(var o=(0,l.default)(t),n=0,s=o.length;n<s;n++){var a=o[n],h=this._type[a];i[a]=u.convert(t[a],h)}return e},t.exports=n},function(t,e,i){function o(t,e){this._data=null,this._ids={},this.length=0,this._options=e||{},this._fieldId="id",this._subscribers={};var i=this;this.listener=function(){i._onEvent.apply(i,arguments)},this.setData(t)}var n=i(8),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(11);o.prototype.setData=function(t){var e,i,o,n,s;if(this._data){for(this._data.off&&this._data.off("*",this.listener),e=this._data.getIds({filter:this._options&&this._options.filter}),s=[],o=0,n=e.length;o<n;o++)s.push(this._data._data[e[o]]);this._ids={},this.length=0,this._trigger("remove",{items:e,oldData:s})}if(this._data=t,this._data){for(this._fieldId=this._options.fieldId||this._data&&this._data.options&&this._data.options.fieldId||"id",e=this._data.getIds({filter:this._options&&this._options.filter}),o=0,n=e.length;o<n;o++)i=e[o],this._ids[i]=!0;this.length=e.length,this._trigger("add",{items:e}),this._data.on&&this._data.on("*",this.listener)}},o.prototype.refresh=function(){var t,e,i,o=this._data.getIds({filter:this._options&&this._options.filter}),n=(0,s.default)(this._ids),r={},a=[],h=[],d=[];for(e=0,i=o.length;e<i;e++)t=o[e],r[t]=!0,this._ids[t]||(a.push(t),this._ids[t]=!0);for(e=0,i=n.length;e<i;e++)t=n[e],r[t]||(h.push(t),d.push(this._data._data[t]),delete this._ids[t]);this.length+=a.length-h.length,a.length&&this._trigger("add",{items:a}),h.length&&this._trigger("remove",{items:h,oldData:d})},o.prototype.get=function(t){var e,i,o,n=this,s=r.getType(arguments[0]);"String"==s||"Number"==s||"Array"==s?(e=arguments[0],i=arguments[1],o=arguments[2]):(i=arguments[0],o=arguments[1]);var a=r.extend({},this._options,i);this._options.filter&&i&&i.filter&&(a.filter=function(t){return n._options.filter(t)&&i.filter(t)});var h=[];return void 0!=e&&h.push(e),h.push(a),h.push(o),this._data&&this._data.get.apply(this._data,h)},o.prototype.getIds=function(t){var e;if(this._data){var i,o=this._options.filter;i=t&&t.filter?o?function(e){return o(e)&&t.filter(e)}:t.filter:o,e=this._data.getIds({filter:i,order:t&&t.order})}else e=[];return e},o.prototype.map=function(t,e){var i=[];if(this._data){var o,n=this._options.filter;o=e&&e.filter?n?function(t){return n(t)&&e.filter(t)}:e.filter:n,i=this._data.map(t,{filter:o,order:e&&e.order})}else i=[];return i},o.prototype.getDataSet=function(){for(var t=this;t instanceof o;)t=t._data;return t||null}
19281,o.prototype._onEvent=function(t,e,i){var o,n,s,r,a=e&&e.items,h=[],d=[],l=[],u=[],c=[],p=[];if(a&&this._data){switch(t){case"add":for(o=0,n=a.length;o<n;o++)s=a[o],(r=this.get(s))&&(this._ids[s]=!0,h.push(s));break;case"update":for(o=0,n=a.length;o<n;o++)s=a[o],r=this.get(s),r?this._ids[s]?(d.push(s),c.push(e.data[o]),u.push(e.oldData[o])):(this._ids[s]=!0,h.push(s)):this._ids[s]&&(delete this._ids[s],l.push(s),p.push(e.oldData[o]));break;case"remove":for(o=0,n=a.length;o<n;o++)s=a[o],this._ids[s]&&(delete this._ids[s],l.push(s),p.push(e.oldData[o]))}this.length+=h.length-l.length,h.length&&this._trigger("add",{items:h},i),d.length&&this._trigger("update",{items:d,oldData:u,data:c},i),l.length&&this._trigger("remove",{items:l,oldData:p},i)}},o.prototype.on=a.prototype.on,o.prototype.off=a.prototype.off,o.prototype._trigger=a.prototype._trigger,o.prototype.subscribe=o.prototype.on,o.prototype.unsubscribe=o.prototype.off,t.exports=o},function(t,e,i){var o=i(57)("wks"),n=i(40),s=i(18).Symbol,r="function"==typeof s;(t.exports=function(t){return o[t]||(o[t]=r&&s[t]||(r?s:n)("Symbol."+t))}).store=o},function(t,e,i){e.prepareElements=function(t){for(var e in t)t.hasOwnProperty(e)&&(t[e].redundant=t[e].used,t[e].used=[])},e.cleanupElements=function(t){for(var e in t)if(t.hasOwnProperty(e)&&t[e].redundant){for(var i=0;i<t[e].redundant.length;i++)t[e].redundant[i].parentNode.removeChild(t[e].redundant[i]);t[e].redundant=[]}},e.resetElements=function(t){e.prepareElements(t),e.cleanupElements(t),e.prepareElements(t)},e.getSVGElement=function(t,e,i){var o;return e.hasOwnProperty(t)?e[t].redundant.length>0?(o=e[t].redundant[0],e[t].redundant.shift()):(o=document.createElementNS("http://www.w3.org/2000/svg",t),i.appendChild(o)):(o=document.createElementNS("http://www.w3.org/2000/svg",t),e[t]={used:[],redundant:[]},i.appendChild(o)),e[t].used.push(o),o},e.getDOMElement=function(t,e,i,o){var n;return e.hasOwnProperty(t)?e[t].redundant.length>0?(n=e[t].redundant[0],e[t].redundant.shift()):(n=document.createElement(t),void 0!==o?i.insertBefore(n,o):i.appendChild(n)):(n=document.createElement(t),e[t]={used:[],redundant:[]},void 0!==o?i.insertBefore(n,o):i.appendChild(n)),e[t].used.push(n),n},e.drawPoint=function(t,i,o,n,s,r){var a;if("circle"==o.style?(a=e.getSVGElement("circle",n,s),a.setAttributeNS(null,"cx",t),a.setAttributeNS(null,"cy",i),a.setAttributeNS(null,"r",.5*o.size)):(a=e.getSVGElement("rect",n,s),a.setAttributeNS(null,"x",t-.5*o.size),a.setAttributeNS(null,"y",i-.5*o.size),a.setAttributeNS(null,"width",o.size),a.setAttributeNS(null,"height",o.size)),void 0!==o.styles&&a.setAttributeNS(null,"style",o.styles),a.setAttributeNS(null,"class",o.className+" vis-point"),r){var h=e.getSVGElement("text",n,s);r.xOffset&&(t+=r.xOffset),r.yOffset&&(i+=r.yOffset),r.content&&(h.textContent=r.content),r.className&&h.setAttributeNS(null,"class",r.className+" vis-label"),h.setAttributeNS(null,"x",t),h.setAttributeNS(null,"y",i)}return a},e.drawBar=function(t,i,o,n,s,r,a,h){if(0!=n){n<0&&(n*=-1,i-=n);var d=e.getSVGElement("rect",r,a);d.setAttributeNS(null,"x",t-.5*o),d.setAttributeNS(null,"y",i),d.setAttributeNS(null,"width",o),d.setAttributeNS(null,"height",n),d.setAttributeNS(null,"class",s),h&&d.setAttributeNS(null,"style",h)}}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0}),e.printStyle=void 0;var n=i(19),s=o(n),r=i(6),a=o(r),h=i(8),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=!1,v=void 0,g="background: #FFeeee; color: #dd0000",y=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"validate",value:function(e,i,o){m=!1,v=i;var n=i;return void 0!==o&&(n=i[o]),t.parse(e,n,[]),m}},{key:"parse",value:function(e,i,o){for(var n in e)e.hasOwnProperty(n)&&t.check(n,e,i,o)}},{key:"check",value:function(e,i,o,n){if(void 0===o[e]&&void 0===o.__any__)return void t.getSuggestion(e,o,n);var s=e,r=!0;void 0===o[e]&&void 0!==o.__any__&&(s="__any__",r="object"===t.getType(i[e]));var a=o[s];r&&void 0!==a.__type__&&(a=a.__type__),t.checkFields(e,i,o,s,a,n)}},{key:"checkFields",value:function(e,i,o,n,s,r){var a=function(i){console.log("%c"+i+t.printLocation(r,e),g)},h=t.getType(i[e]),l=s[h];void 0!==l?"array"===t.getType(l)&&-1===l.indexOf(i[e])?(a('Invalid option detected in "'+e+'". Allowed values are:'+t.print(l)+' not "'+i[e]+'". '),m=!0):"object"===h&&"__any__"!==n&&(r=f.copyAndExtendArray(r,e),t.parse(i[e],o[n],r)):void 0===s.any&&(a('Invalid type received for "'+e+'". Expected: '+t.print((0,d.default)(s))+". Received ["+h+'] "'+i[e]+'"'),m=!0)}},{key:"getType",value:function(t){var e=void 0===t?"undefined":(0,a.default)(t);return"object"===e?null===t?"null":t instanceof Boolean?"boolean":t instanceof Number?"number":t instanceof String?"string":Array.isArray(t)?"array":t instanceof Date?"date":void 0!==t.nodeType?"dom":!0===t._isAMomentObject?"moment":"object":"number"===e?"number":"boolean"===e?"boolean":"string"===e?"string":void 0===e?"undefined":e}},{key:"getSuggestion",value:function(e,i,o){var n=t.findInOptions(e,i,o,!1),s=t.findInOptions(e,v,[],!0),r=void 0
19282    ;r=void 0!==n.indexMatch?" in "+t.printLocation(n.path,e,"")+'Perhaps it was incomplete? Did 
19282you mean: "'+n.indexMatch+'"?\n\n':s.distance<=4&&n.distance>s.distance?" in "+t.printLocation(n.path,e,"")+"Perhaps it was misplaced? Matching option found at: "+t.printLocation(s.path,s.closestMatch,""):n.distance<=8?'. Did you mean "'+n.closestMatch+'"?'+t.printLocation(n.path,e):". Did you mean one of these: "+t.print((0,d.default)(i))+t.printLocation(o,e),console.log('%cUnknown option detected: "'+e+'"'+r,g),m=!0}},{key:"findInOptions",value:function(e,i,o){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3],s=1e9,r="",a=[],h=e.toLowerCase(),d=void 0;for(var l in i){var u=void 0;if(void 0!==i[l].__type__&&!0===n){var c=t.findInOptions(e,i[l],f.copyAndExtendArray(o,l));s>c.distance&&(r=c.closestMatch,a=c.path,s=c.distance,d=c.indexMatch)}else-1!==l.toLowerCase().indexOf(h)&&(d=l),u=t.levenshteinDistance(e,l),s>u&&(r=l,a=f.copyArray(o),s=u)}return{closestMatch:r,path:a,distance:s,indexMatch:d}}},{key:"printLocation",value:function(t,e){for(var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"Problem value found at: \n",o="\n\n"+i+"options = {\n",n=0;n<t.length;n++){for(var s=0;s<n+1;s++)o+="  ";o+=t[n]+": {\n"}for(var r=0;r<t.length+1;r++)o+="  ";o+=e+"\n";for(var a=0;a<t.length+1;a++){for(var h=0;h<t.length-a;h++)o+="  ";o+="}\n"}return o+"\n\n"}},{key:"print",value:function(t){return(0,s.default)(t).replace(/(\")|(\[)|(\])|(,"__type__")/g,"").replace(/(\,)/g,", ")}},{key:"levenshteinDistance",value:function(t,e){if(0===t.length)return e.length;if(0===e.length)return t.length;var i,o=[];for(i=0;i<=e.length;i++)o[i]=[i];var n;for(n=0;n<=t.length;n++)o[0][n]=n;for(i=1;i<=e.length;i++)for(n=1;n<=t.length;n++)e.charAt(i-1)==t.charAt(n-1)?o[i][n]=o[i-1][n-1]:o[i][n]=Math.min(o[i-1][n-1]+1,Math.min(o[i][n-1]+1,o[i-1][n]+1));return o[e.length][t.length]}}]),t}();e.default=y,e.printStyle=g},function(t,e,i){function o(t,e){this.options=null,this.props=null}var n=i(2);o.prototype.setOptions=function(t){t&&n.extend(this.options,t)},o.prototype.redraw=function(){return!1},o.prototype.destroy=function(){},o.prototype._isResized=function(){var t=this.props._previousWidth!==this.props.width||this.props._previousHeight!==this.props.height;return this.props._previousWidth=this.props.width,this.props._previousHeight=this.props.height,t},t.exports=o},function(t,e,i){var o=i(18),n=i(7),s=i(80),r=i(26),a=function(t,e,i){var h,d,l,u=t&a.F,c=t&a.G,p=t&a.S,f=t&a.P,m=t&a.B,v=t&a.W,g=c?n:n[e]||(n[e]={}),y=g.prototype,b=c?o:p?o[e]:(o[e]||{}).prototype;c&&(i=e);for(h in i)(d=!u&&b&&void 0!==b[h])&&h in g||(l=d?b[h]:i[h],g[h]=c&&"function"!=typeof b[h]?i[h]:m&&d?s(l,o):v&&b[h]==l?function(t){var e=function(e,i,o){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,i)}return new t(e,i,o)}return t.apply(this,arguments)};return e.prototype=t.prototype,e}(l):f&&"function"==typeof l?s(Function.call,l):l,f&&((g.virtual||(g.virtual={}))[h]=l,t&a.R&&y&&!y[h]&&r(y,h,l)))};a.F=1,a.G=2,a.S=4,a.P=8,a.B=16,a.W=32,a.U=64,a.R=128,t.exports=a},function(t,e){var i=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=i)},function(t,e,i){t.exports={default:i(160),__esModule:!0}},function(t,e,i){var o=i(27),n=i(81),s=i(53),r=Object.defineProperty;e.f=i(21)?Object.defineProperty:function(t,e,i){if(o(t),e=s(e,!0),o(i),n)try{return r(t,e,i)}catch(t){}if("get"in i||"set"in i)throw TypeError("Accessors not supported!");return"value"in i&&(t[e]=i.value),t}},function(t,e,i){t.exports=!i(28)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e){var i={}.hasOwnProperty;t.exports=function(t,e){return i.call(t,e)}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(6),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=function(){function t(e,i,o){(0,a.default)(this,t),this.body=i,this.labelModule=o,this.setOptions(e),this.top=void 0,this.left=void 0,this.height=void 0,this.width=void 0,this.radius=void 0,this.margin=void 0,this.refreshNeeded=!0,this.boundingBox={top:0,left:0,right:0,bottom:0}}return(0,d.default)(t,[{key:"setOptions",value:function(t){this.options=t}},{key:"_setMargins",value:function(t){this.margin={},this.options.margin&&("object"==(0,s.default)(this.options.margin)?(this.margin.top=this.options.margin.top,this.margin.right=this.options.margin.right,this.margin.bottom=this.options.margin.bottom,this.margin.left
19282=this.options.margin.left):(this.margin.top=this.options.margin,this.margin.right=this.options.margin,this.margin.bottom=this.options.margin,this.margin.left=this.options.margin)),t.adjustSizes(this.margin)}},{key:"_distanceToBorder",value:function(t,e){var i=this.options.borderWidth;return this.resize(t),Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i}},{key:"enableShadow",value:function(t,e){e.shadow&&(t.shadowColor=e.shadowColor,t.shadowBlur=e.shadowSize,t.shadowOffsetX=e.shadowX,t.shadowOffsetY=e.shadowY)}},{key:"disableShadow",value:function(t,e){e.shadow&&(t.shadowColor="rgba(0,0,0,0)",t.shadowBlur=0,t.shadowOffsetX=0,t.shadowOffsetY=0)}},{key:"enableBorderDashes",value:function(t,e){if(!1!==e.borderDashes)if(void 0!==t.setLineDash){var i=e.borderDashes;!0===i&&(i=[5,15]),t.setLineDash(i)}else console.warn("setLineDash is not supported in this browser. The dashed borders cannot be used."),this.options.shapeProperties.borderDashes=!1,e.borderDashes=!1}},{key:"disableBorderDashes",value:function(t,e){!1!==e.borderDashes&&(void 0!==t.setLineDash?t.setLineDash([0]):(console.warn("setLineDash is not supported in this browser. The dashed borders cannot be used."),this.options.shapeProperties.borderDashes=!1,e.borderDashes=!1))}},{key:"needsRefresh",value:function(t,e){return!0===this.refreshNeeded?(this.refreshNeeded=!1,!0):void 0===this.width||this.labelModule.differentState(t,e)}},{key:"initContextForDraw",value:function(t,e){var i=e.borderWidth/this.body.view.scale;t.lineWidth=Math.min(this.width,i),t.strokeStyle=e.borderColor,t.fillStyle=e.color}},{key:"performStroke",value:function(t,e){var i=e.borderWidth/this.body.view.scale;t.save(),i>0&&(this.enableBorderDashes(t,e),t.stroke(),this.disableBorderDashes(t,e)),t.restore()}},{key:"performFill",value:function(t,e){this.enableShadow(t,e),t.fill(),this.disableShadow(t,e),this.performStroke(t,e)}},{key:"_addBoundingBoxMargin",value:function(t){this.boundingBox.left-=t,this.boundingBox.top-=t,this.boundingBox.bottom+=t,this.boundingBox.right+=t}},{key:"_updateBoundingBox",value:function(t,e,i,o,n){void 0!==i&&this.resize(i,o,n),this.left=t-this.width/2,this.top=e-this.height/2,this.boundingBox.left=this.left,this.boundingBox.top=this.top,this.boundingBox.bottom=this.top+this.height,this.boundingBox.right=this.left+this.width}},{key:"updateBoundingBox",value:function(t,e,i,o,n){this._updateBoundingBox(t,e,i,o,n)}},{key:"getDimensionsFromLabel",value:function(t,e,i){this.textSize=this.labelModule.getTextSize(t,e,i);var o=this.textSize.width,n=this.textSize.height;return 0===o&&(o=14,n=14),{width:o,height:n}}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{size:this.options.size};if(this.needsRefresh(e,i)){this.labelModule.getTextSize(t,e,i);var n=2*o.size;this.width=n,this.height=n,this.radius=.5*this.width}}},{key:"_drawShape",value:function(t,e,i,o,n,s,r,a){if(this.resize(t,s,r,a),this.left=o-this.width/2,this.top=n-this.height/2,this.initContextForDraw(t,a),t[e](o,n,a.size),this.performFill(t,a),void 0!==this.options.label){this.labelModule.calculateLabelSize(t,s,r,o,n,"hanging");var h=n+.5*this.height+.5*this.labelModule.size.height;this.labelModule.draw(t,o,h,s,r,"hanging")}this.updateBoundingBox(o,n)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size,void 0!==this.options.label&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height))}}]),e}(m.default);e.default=v}
19282,function(t,e,i){var o=i(78),n=i(51);t.exports=function(t){return o(n(t))}},function(t,e,i){var o=i(20),n=i(39);t.exports=i(21)?function(t,e,i){return o.f(t,e,n(1,i))}:function(t,e,i){return t[e]=i,t}},function(t,e,i){var o=i(32);t.exports=function(t){if(!o(t))throw TypeError(t+" is not an object!");return t}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,i){t.exports={default:i(138),__esModule:!0}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}e.__esModule=!0;var n=i(188),s=o(n),r=i(77),a=o(r);e.default=function(){function t(t,e){var i=[],o=!0,n=!1,s=void 0;try{for(var r,h=(0,a.default)(t);!(o=(r=h.next()).done)&&(i.push(r.value),!e||i.length!==e);o=!0);}catch(t){n=!0,s=t}finally{try{!o&&h.return&&h.return()}finally{if(n)throw s}}return i}return function(e,i){if(Array.isArray(e))return e;if((0,s.default)(Object(e)))return t(e,i);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}()},function(t,e){t.exports={}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,i){var o=i(84),n=i(58);t.exports=Object.keys||function(t){return o(t,n)}},function(t,e,i){function o(t,e,i){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0,this.z=void 0!==i?i:0}o.subtract=function(t,e){var i=new o;return i.x=t.x-e.x,i.y=t.y-e.y,i.z=t.z-e.z,i},o.add=function(t,e){var i=new o;return i.x=t.x+e.x,i.y=t.y+e.y,i.z=t.z+e.z,i},o.avg=function(t,e){return new o((t.x+e.x)/2,(t.y+e.y)/2,(t.z+e.z)/2)},o.crossProduct=function(t,e){var i=new o;return i.x=t.y*e.z-t.z*e.y,i.y=t.z*e.x-t.x*e.z,i.z=t.x*e.y-t.y*e.x,i},o.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},t.exports=o},function(t,e,i){var o,n,s;!function(i,r){n=[],o=r,void 0!==(s="function"==typeof o?o.apply(e,n):o)&&(t.exports=s)}(0,function(){function t(t){var e,i=t&&t.preventDefault||!1,o=t&&t.container||window,n={},s={keydown:{},keyup:{}},r={};for(e=97;e<=122;e++)r[String.fromCharCode(e)]={code:e-97+65,shift:!1};for(e=65;e<=90;e++)r[String.fromCharCode(e)]={code:e,shift:!0};for(e=0;e<=9;e++)r[""+e]={code:48+e,shift:!1};for(e=1;e<=12;e++)r["F"+e]={code:111+e,shift:!1};for(e=0;e<=9;e++)r["num"+e]={code:96+e,shift:!1};r["num*"]={code:106,shift:!1},r["num+"]={code:107,shift:!1},r["num-"]={code:109,shift:!1},r["num/"]={code:111,shift:!1},r["num."]={code:110,shift:!1},r.left={code:37,shift:!1},r.up={code:38,shift:!1},r.right={code:39,shift:!1},r.down={code:40,shift:!1},r.space={code:32,shift:!1},r.enter={code:13,shift:!1},r.shift={code:16,shift:void 0},r.esc={code:27,shift:!1},r.backspace={code:8,shift:!1},r.tab={code:9,shift:!1},r.ctrl={code:17,shift:!1},r.alt={code:18,shift:!1},r.delete={code:46,shift:!1},r.pageup={code:33,shift:!1},r.pagedown={code:34,shift:!1},r["="]={code:187,shift:!1},r["-"]={code:189,shift:!1},r["]"]={code:221,shift:!1},r["["]={code:219,shift:!1};var a=function(t){d(t,"keydown")},h=function(t){d(t,"keyup")},d=function(t,e){if(void 0!==s[e][t.keyCode]){for(var o=s[e][t.keyCode],n=0;n<o.length;n++)void 0===o[n].shift?o[n].fn(t):1==o[n].shift&&1==t.shiftKey?o[n].fn(t):0==o[n].shift&&0==t.shiftKey&&o[n].fn(t);1==i&&t.preventDefault()}};return n.bind=function(t,e,i){if(void 0===i&&(i="keydown"),void 0===r[t])throw new Error("unsupported key: "+t);void 0===s[i][r[t].code]&&(s[i][r[t].code]=[]),s[i][r[t].code].push({fn:e,shift:r[t].shift})},n.bindAll=function(t,e){void 0===e&&(e="keydown");for(var i in r)r.hasOwnProperty(i)&&n.bind(i,t,e)},n.getKey=function(t){for(var e in r)if(r.hasOwnProperty(e)){if(1==t.shiftKey&&1==r[e].shift&&t.keyCode==r[e].code)return e;if(0==t.shiftKey&&0==r[e].shift&&t.keyCode==r[e].code)return e;if(t.keyCode==r[e].code&&"shift"==e)return e}return"unknown key, currently not supported"},n.unbind=function(t,e,i){if(void 0===i&&(i="keydown"),void 0===r[t])throw new Error("unsupported key: "+t);if(void 0!==e){var o=[],n=s[i][r[t].code];if(void 0!==n)for(var a=0;a<n.length;a++)n[a].fn==e&&n[a].shift==r[t].shift||o.push(s[i][r[t].code][a]);s[i][r[t].code]=o}else s[i][r[t].code]=[]},n.reset=function(){s={keydown:{},keyup:{}}},n.destroy=function(){s={keydown:{},keyup:{}},o.removeEventListener("keydown",a,!0),o.removeEventListener("keyup",h,!0)},o.addEventListener("keydown",a,!0),o.addEventListener("keyup",h,!0),n}return t})}
19282,function(t,e,i){e.convertHiddenOptions=function(t,i,o){if(o&&!Array.isArray(o))return e.convertHiddenOptions(t,i,[o]);if(i.hiddenDates=[],o&&1==Array.isArray(o)){for(var n=0;n<o.length;n++)if(void 0===o[n].repeat){var s={};s.start=t(o[n].start).toDate().valueOf(),s.end=t(o[n].end).toDate().valueOf(),i.hiddenDates.push(s)}i.hiddenDates.sort(function(t,e){return t.start-e.start})}},e.updateHiddenDates=function(t,i,o){if(o&&!Array.isArray(o))return e.updateHiddenDates(t,i,[o]);if(o&&void 0!==i.domProps.centerContainer.width){e.convertHiddenOptions(t,i,o);for(var n=t(i.range.start),s=t(i.range.end),r=i.range.end-i.range.start,a=r/i.domProps.centerContainer.width,h=0;h<o.length;h++)if(void 0!==o[h].repeat){var d=t(o[h].start),l=t(o[h].end);if("Invalid Date"==d._d)throw new Error("Supplied start date is not valid: "+o[h].start);if("Invalid Date"==l._d)throw new Error("Supplied end date is not valid: "+o[h].end);var u=l-d;if(u>=4*a){var c=0,p=s.clone();switch(o[h].repeat){case"daily":d.day()!=l.day()&&(c=1),d.dayOfYear(n.dayOfYear()),d.year(n.year()),d.subtract(7,"days"),l.dayOfYear(n.dayOfYear()),l.year(n.year()),l.subtract(7-c,"days"),p.add(1,"weeks");break;case"weekly":var f=l.diff(d,"days"),m=d.day();d.date(n.date()),d.month(n.month()),d.year(n.year()),l=d.clone(),d.day(m),l.day(m),l.add(f,"days"),d.subtract(1,"weeks"),l.subtract(1,"weeks"),p.add(1,"weeks");break;case"monthly":d.month()!=l.month()&&(c=1),d.month(n.month()),d.year(n.year()),d.subtract(1,"months"),l.month(n.month()),l.year(n.year()),l.subtract(1,"months"),l.add(c,"months"),p.add(1,"months");break;case"yearly":d.year()!=l.year()&&(c=1),d.year(n.year()),d.subtract(1,"years"),l.year(n.year()),l.subtract(1,"years"),l.add(c,"years"),p.add(1,"years");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",o[h].repeat)}for(;d<p;)switch(i.hiddenDates.push({start:d.valueOf(),end:l.valueOf()}),o[h].repeat){case"daily":d.add(1,"days"),l.add(1,"days");break;case"weekly":d.add(1,"weeks"),l.add(1,"weeks");break;case"monthly":d.add(1,"months"),l.add(1,"months");break;case"yearly":d.add(1,"y"),l.add(1,"y");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",o[h].repeat)}i.hiddenDates.push({start:d.valueOf(),end:l.valueOf()})}}e.removeDuplicates(i);var v=e.isHidden(i.range.start,i.hiddenDates),g=e.isHidden(i.range.end,i.hiddenDates),y=i.range.start,b=i.range.end;1==v.hidden&&(y=1==i.range.startToFront?v.startDate-1:v.endDate+1),1==g.hidden&&(b=1==i.range.endToFront?g.startDate-1:g.endDate+1),1!=v.hidden&&1!=g.hidden||i.range._applyRange(y,b)}},e.removeDuplicates=function(t){for(var e=t.hiddenDates,i=[],o=0;o<e.length;o++)for(var n=0;n<e.length;n++)o!=n&&1!=e[n].remove&&1!=e[o].remove&&(e[n].start>=e[o].start&&e[n].end<=e[o].end?e[n].remove=!0:e[n].start>=e[o].start&&e[n].start<=e[o].end?(e[o].end=e[n].end,e[n].remove=!0):e[n].end>=e[o].start&&e[n].end<=e[o].end&&(e[o].start=e[n].start,e[n].remove=!0));for(o=0;o<e.length;o++)!0!==e[o].remove&&i.push(e[o]);t.hiddenDates=i,t.hiddenDates.sort(function(t,e){return t.start-e.start})},e.printDates=function(t){for(var e=0;e<t.length;e++)console.log(e,new Date(t[e].start),new Date(t[e].end),t[e].start,t[e].end,t[e].remove)},e.stepOverHiddenDates=function(t,e,i){for(var o=!1,n=e.current.valueOf(),s=0;s<e.hiddenDates.length;s++){var r=e.hiddenDates[s].start,a=e.hiddenDates[s].end;if(n>=r&&n<a){o=!0;break}}if(1==o&&n<e._end.valueOf()&&n!=i){var h=t(i),d=t(a);h.year()!=d.year()?e.switchedYear=!0:h.month()!=d.month()?e.switchedMonth=!0:h.dayOfYear()!=d.dayOfYear()&&(e.switchedDay=!0),e.current=d}},e.toScreen=function(t,i,o){var n;if(0==t.body.hiddenDates.length)return n=t.range.conversion(o),(i.valueOf()-n.offset)*n.scale;var s=e.isHidden(i,t.body.hiddenDates);1==s.hidden&&(i=s.startDate);var r=e.getHiddenDurationBetween(t.body.hiddenDates,t.range.start,t.range.end);if(i<t.range.start){n=t.range.conversion(o,r);var a=e.getHiddenDurationBeforeStart(t.body.hiddenDates,i,n.offset);return i=t.options.moment(i).toDate().valueOf(),i+=a,-(n.offset-i.valueOf())*n.scale}if(i>t.range.end){var h={start:t.range.start,end:i};return i=e.correctTimeForHidden(t.options.moment,t.body.hiddenDates,h,i),n=t.range.conversion(o,r),(i.valueOf()-n.offset)*n.scale}return i=e.correctTimeForHidden(t.options.moment,t.body.hiddenDates,t.range,i),n=t.range.conversion(o,r),(i.valueOf()-n.offset)*n.scale},e.toTime=function(t,i,o){if(0==t.body.hiddenDates.length){var n=t.range.conversion(o);return new Date(i/n.scale+n.offset)}var s=e.getHiddenDurationBetween(t.body.hiddenDates,t.range.start,t.range.end),r=t.range.end-t.range.start-s,a=r*i/o,h=e.getAccumulatedHiddenDuration(t.body.hiddenDates,t.range,a);return new Date(h+a+t.range.start)}
19282,e.getHiddenDurationBetween=function(t,e,i){for(var o=0,n=0;n<t.length;n++){var s=t[n].start,r=t[n].end;s>=e&&r<i&&(o+=r-s)}return o},e.getHiddenDurationBeforeStart=function(t,e,i){for(var o=0,n=0;n<t.length;n++){var s=t[n].start,r=t[n].end;s>=e&&r<=i&&(o+=r-s)}return o},e.correctTimeForHidden=function(t,i,o,n){return n=t(n).toDate().valueOf(),n-=e.getHiddenDurationBefore(t,i,o,n)},e.getHiddenDurationBefore=function(t,e,i,o){var n=0;o=t(o).toDate().valueOf();for(var s=0;s<e.length;s++){var r=e[s].start,a=e[s].end;r>=i.start&&a<i.end&&o>=a&&(n+=a-r)}return n},e.getAccumulatedHiddenDuration=function(t,e,i){for(var o=0,n=0,s=e.start,r=0;r<t.length;r++){var a=t[r].start,h=t[r].end;if(a>=e.start&&h<e.end){if(n+=a-s,s=h,n>=i)break;o+=h-a}}return o},e.snapAwayFromHidden=function(t,i,o,n){var s=e.isHidden(i,t);return 1==s.hidden?o<0?1==n?s.startDate-(s.endDate-i)-1:s.startDate-1:1==n?s.endDate+(i-s.startDate)+1:s.endDate+1:i},e.isHidden=function(t,e){for(var i=0;i<e.length;i++){var o=e[i].start,n=e[i].end;if(t>=o&&t<n)return{hidden:!0,startDate:o,endDate:n}}return{hidden:!1,startDate:o,endDate:n}}},function(t,e,i){e.onTouch=function(t,e){e.inputHandler=function(t){t.isFirst&&e(t)},t.on("hammer.input",e.inputHandler)},e.onRelease=function(t,e){return e.inputHandler=function(t){t.isFinal&&e(t)},t.on("hammer.input",e.inputHandler)},e.offTouch=function(t,e){t.off("hammer.input",e.inputHandler)},e.offRelease=e.offTouch,e.disablePreventDefaultVertically=function(t){return t.getTouchAction=function(){return["pan-y"]},t}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(t,e,i){this.id=null,this.parent=null,this.data=t,this.dom=null,this.conversion=e||{},this.options=i||{},this.selected=!1,this.displayed=!1,this.groupShowing=!0,this.dirty=!0,this.top=null,this.right=null,this.left=null,this.width=null,this.height=null,this.editable=null,this._updateEditStatus()}var s=i(6),r=o(s),a=i(8),h=o(a),d=i(10),l=i(2),u=i(9);n.prototype.stack=!0,n.prototype.select=function(){this.selected=!0,this.dirty=!0,this.displayed&&this.redraw()},n.prototype.unselect=function(){this.selected=!1,this.dirty=!0,this.displayed&&this.redraw()},n.prototype.setData=function(t){void 0!=t.group&&this.data.group!=t.group&&null!=this.parent&&this.parent.itemSet._moveToGroup(this,t.group),this.parent&&(this.parent.stackDirty=!0),void 0!=t.subgroup&&this.data.subgroup!=t.subgroup&&null!=this.parent&&this.parent.changeSubgroup(this,this.data.subgroup,t.subgroup),this.data=t,this._updateEditStatus(),this.dirty=!0,this.displayed&&this.redraw()},n.prototype.setParent=function(t){this.displayed?(this.hide(),this.parent=t,this.parent&&this.show()):this.parent=t},n.prototype.isVisible=function(t){return!1},n.prototype.show=function(){return!1},n.prototype.hide=function(){return!1},n.prototype.redraw=function(){},n.prototype.repositionX=function(){},n.prototype.repositionY=function(){},n.prototype._repaintDragCenter=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragCenter){var t=this,e=document.createElement("div");e.className="vis-drag-center",e.dragCenterItem=this;var i=new d(e);i.on("tap",function(e){t.parent.itemSet.body.emitter.emit("click",{event:e,item:t.id})}),i.on("doubletap",function(e){e.stopPropagation(),t.parent.itemSet._onUpdateItem(t),t.parent.itemSet.body.emitter.emit("doubleClick",{event:e,item:t.id})}),this.dom.box?this.dom.dragLeft?this.dom.box.insertBefore(e,this.dom.dragLeft):this.dom.box.appendChild(e):this.dom.point&&this.dom.point.appendChild(e),this.dom.dragCenter=e}else!this.selected&&this.dom.dragCenter&&(this.dom.dragCenter.parentNode&&this.dom.dragCenter.parentNode.removeChild(this.dom.dragCenter),this.dom.dragCenter=null)},n.prototype._repaintDeleteButton=function(t){var e=(this.options.editable.overrideItems||null==this.editable)&&this.options.editable.remove||!this.options.editable.overrideItems&&null!=this.editable&&this.editable.remove;if(this.selected&&e&&!this.dom.deleteButton){var i=this,o=document.createElement("div");this.options.rtl?o.className="vis-delete-rtl":o.className="vis-delete",o.title="Delete this item",new d(o).on("tap",function(t){t.stopPropagation(),i.parent.removeFromDataSet(i)}),t.appendChild(o),this.dom.deleteButton=o}else!this.selected&&this.dom.deleteButton&&(this.dom.deleteButton.parentNode&&this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton),this.dom.deleteButton=null)},n.prototype._repaintOnItemUpdateTimeTooltip=function(t){if(this.options.tooltipOnItemUpdateTime){var e=(this.options.editable.updateTime||!0===this.data.editable)&&!1!==this.data.editable;if(this.selected&&e&&!this.dom.onItemUpdateTimeTooltip){var i=document.createElement("div");i.className="vis-onUpdateTime-tooltip",t.appendChild(i),this.dom.onItemUpdateTimeTooltip=i}else!this.selected&&this.dom.onItemUpdateTimeTooltip&&(this.dom.onItemUpdateTimeTooltip.parentNode&&this.dom.onItemUpdateTimeTooltip.parentNode.removeChild(this.dom.onItemUpdateTimeTooltip),this.dom.onItemUpdateTimeTooltip=null);if(this.dom.onItemUpdateTimeTooltip){this.dom.onItemUpdateTimeTooltip.style.visibility=this.parent.itemSet.touchParams.itemIsDragging?"visible":"hidden",this.options.rtl?this.dom.onItemUpdateTimeTooltip.style.right=this.dom.content.style.right:this.dom.onItemUpdateTimeTooltip.style.left=this.dom.content.style.left;var o,n=this.parent.itemSet.body.domProps.scrollTop;o="top"==this.options.orientation.item?this.top:this.parent.height-this.top-this.height;o+this.parent.top-50<-n?(this.dom.onItemUpdateTimeTooltip.style.bottom="",this.dom.onItemUpdateTimeTooltip.style.top=this.height+2+"px"):(this.dom.onItemUpdateTimeTooltip.style.top="",this.dom.onItemUpdateTimeTooltip.style.bottom=this.height+2+"px");var s,r;this.options.tooltipOnItemUpdateTime&&this.options.tooltipOnItemUpdateTime.template?(r=this.options.tooltipOnItemUpdateTime.template.bind(this),s=r(this.data)):(s="start: "+u(this.data.start).format("MM/DD/YYYY hh:mm"),this.data.end&&(s+="<br> end: "+u(this.data.end).format("MM/DD/YYYY hh:mm"))),this.dom.onItemUpdateTimeTooltip.innerHTML=s}}},n.prototype._updateContents=function(t){var e,i,o,n,s=this.parent.itemSet.itemsData.get(this.id
19282),r=this.dom.box||this.dom.point,a=r.getElementsByClassName("vis-item-visible-frame")[0];if(this.options.visibleFrameTemplate?(n=this.options.visibleFrameTemplate.bind(this),o=n(s,r)):o="",a)if(o instanceof Object&&!(o instanceof Element))n(s,a);else if(this._contentToString(this.itemVisibleFrameContent)!==this._contentToString(o)){if(o instanceof Element)a.innerHTML="",a.appendChild(o);else if(void 0!=o)a.innerHTML=o;else if("background"!=this.data.type||void 0!==this.data.content)throw new Error('Property "content" missing in item '+this.id);this.itemVisibleFrameContent=o}if(this.options.template?(i=this.options.template.bind(this),e=i(s,t,this.data)):e=this.data.content,e instanceof Object&&!(e instanceof Element))i(s,t);else if(this._contentToString(this.content)!==this._contentToString(e)){if(e instanceof Element)t.innerHTML="",t.appendChild(e);else if(void 0!=e)t.innerHTML=e;else if("background"!=this.data.type||void 0!==this.data.content)throw new Error('Property "content" missing in item '+this.id);this.content=e}},n.prototype._updateDataAttributes=function(t){if(this.options.dataAttributes&&this.options.dataAttributes.length>0){var e=[];if(Array.isArray(this.options.dataAttributes))e=this.options.dataAttributes;else{if("all"!=this.options.dataAttributes)return;e=(0,h.default)(this.data)}for(var i=0;i<e.length;i++){var o=e[i],n=this.data[o];null!=n?t.setAttribute("data-"+o,n):t.removeAttribute("data-"+o)}}},n.prototype._updateStyle=function(t){this.style&&(l.removeCssText(t,this.style),this.style=null),this.data.style&&(l.addCssText(t,this.data.style),this.style=this.data.style)},n.prototype._contentToString=function(t){return"string"==typeof t?t:t&&"outerHTML"in t?t.outerHTML:t},n.prototype._updateEditStatus=function(){this.options&&("boolean"==typeof this.options.editable?this.editable={updateTime:this.options.editable,updateGroup:this.options.editable,remove:this.options.editable}:"object"===(0,r.default)(this.options.editable)&&(this.editable={},l.selectiveExtend(["updateTime","updateGroup","remove"],this.editable,this.options.editable))),this.options&&this.options.editable&&!0===this.options.editable.overrideItems||this.data&&("boolean"==typeof this.data.editable?this.editable={updateTime:this.data.editable,updateGroup:this.data.editable,remove:this.data.editable}:"object"===(0,r.default)(this.data.editable)&&(this.editable={},l.selectiveExtend(["updateTime","updateGroup","remove"],this.editable,this.data.editable)))},n.prototype.getWidthLeft=function(){return 0},n.prototype.getWidthRight=function(){return 0},n.prototype.getTitle=function(){return this.data.title},t.exports=n},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){var i=0,o=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++i+o).toString(36))}},function(t,e,i){var o=i(51);t.exports=function(t){return Object(o(t))}},function(t,e){e.f={}.propertyIsEnumerable},function(t,e,i){function o(t){this.delay=null,this.max=1/0,this._queue=[],this._timeout=null,this._extended=null,this.setOptions(t)}o.prototype.setOptions=function(t){t&&void 0!==t.delay&&(this.delay=t.delay),t&&void 0!==t.max&&(this.max=t.max),this._flushIfNeeded()},o.extend=function(t,e){var i=new o(e);if(void 0!==t.flush)throw new Error("Target object already has a property flush");t.flush=function(){i.flush()};var n=[{name:"flush",original:void 0}];if(e&&e.replace)for(var s=0;s<e.replace.length;s++){var r=e.replace[s];n.push({name:r,original:t[r]}),i.replace(t,r)}return i._extended={object:t,methods:n},i},o.prototype.destroy=function(){if(this.flush(),this._extended){for(var t=this._extended.object,e=this._extended.methods,i=0;i<e.length;i++){var o=e[i];o.original?t[o.name]=o.original:delete t[o.name]}this._extended=null}},o.prototype.replace=function(t,e){var i=this,o=t[e];if(!o)throw new Error("Method "+e+" undefined");t[e]=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];i.queue({args:t,fn:o,context:this})}},o.prototype.queue=function(t){"function"==typeof t?this._queue.push({fn:t}):this._queue.push(t),this._flushIfNeeded()},o.prototype._flushIfNeeded=function(){if(this._queue.length>this.max&&this.flush(),clearTimeout(this._timeout),this.queue.length>0&&"number"==typeof this.delay){var t=this;this._timeout=setTimeout(function(){t.flush()},this.delay)}},o.prototype.flush=function(){for(;this._queue.length>0;){var t=this._queue.shift();t.fn.apply(t.context||t.fn,t.args||[])}},t.exports=o},function(t,e){function i(t){if(t)return o(t)}function o(t){for(var e in i.prototype)t[e]=i.prototype[e];return t}t.exports=i,i.prototype.on=i.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},i.prototype.once=function(t,e){function i(){o.off(t,i),e.apply(this,arguments)}var o=this;return this._callbacks=this._callbacks||{},i.fn=e,this.on(t,i),this},i.prototype.off=i.prototype.removeListener=i.prototype.removeAllListeners=i.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var i=this._callbacks[t];if(!i)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var o,n=0;n<i.length;n++)if((o=i[n])===e||o.fn===e){i.splice(n,1);break}return this},i.prototype.emit=function(t){this._callbacks=this._callbacks||{};
19282var e=[].slice.call(arguments,1),i=this._callbacks[t];if(i){i=i.slice(0);for(var o=0,n=i.length;o<n;++o)i[o].apply(this,e)}return this},i.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},i.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t,e,i){function o(t,e){this.dom={foreground:null,lines:[],majorTexts:[],minorTexts:[],redundant:{lines:[],majorTexts:[],minorTexts:[]}},this.props={range:{start:0,end:0,minimumStep:0},lineTop:0},this.defaultOptions={orientation:{axis:"bottom"},showMinorLabels:!0,showMajorLabels:!0,maxMinorChars:7,format:h.FORMAT,moment:l,timeAxis:null},this.options=r.extend({},this.defaultOptions),this.body=t,this._create(),this.setOptions(e)}var n=i(6),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(16),h=i(66),d=i(36),l=i(9);o.prototype=new a,o.prototype.setOptions=function(t){t&&(r.selectiveExtend(["showMinorLabels","showMajorLabels","maxMinorChars","hiddenDates","timeAxis","moment","rtl"],this.options,t),r.selectiveDeepExtend(["format"],this.options,t),"orientation"in t&&("string"==typeof t.orientation?this.options.orientation.axis=t.orientation:"object"===(0,s.default)(t.orientation)&&"axis"in t.orientation&&(this.options.orientation.axis=t.orientation.axis)),"locale"in t&&("function"==typeof l.locale?l.locale(t.locale):l.lang(t.locale)))},o.prototype._create=function(){this.dom.foreground=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.foreground.className="vis-time-axis vis-foreground",this.dom.background.className="vis-time-axis vis-background"},o.prototype.destroy=function(){this.dom.foreground.parentNode&&this.dom.foreground.parentNode.removeChild(this.dom.foreground),this.dom.background.parentNode&&this.dom.background.parentNode.removeChild(this.dom.background),this.body=null},o.prototype.redraw=function(){var t=this.props,e=this.dom.foreground,i=this.dom.background,o="top"==this.options.orientation.axis?this.body.dom.top:this.body.dom.bottom,n=e.parentNode!==o;this._calculateCharSize()
19283;var s=this.options.showMinorLabels&&"none"!==this.options.orientation.axis,r=this.options.showMajorLabels&&"none"!==this.options.orientation.axis;t.minorLabelHeight=s?t.minorCharHeight:0,t.majorLabelHeight=r?t.majorCharHeight:0,t.height=t.minorLabelHeight+t.majorLabelHeight,t.width=e.offsetWidth,t.minorLineHeight=this.body.domProps.root.height-t.majorLabelHeight-("top"==this.options.orientation.axis?this.body.domProps.bottom.height:this.body.domProps.top.height),t.minorLineWidth=1,t.majorLineHeight=t.minorLineHeight+t.majorLabelHeight,t.majorLineWidth=1;var a=e.nextSibling,h=i.nextSibling;return e.parentNode&&e.parentNode.removeChild(e),i.parentNode&&i.parentNode.removeChild(i),e.style.height=this.props.height+"px",this._repaintLabels(),a?o.insertBefore(e,a):o.appendChild(e),h?this.body.dom.backgroundVertical.insertBefore(i,h):this.body.dom.backgroundVertical.appendChild(i),this._isResized()||n},o.prototype._repaintLabels=function(){var t=this.options.orientation.axis,e=r.convert(this.body.range.start,"Number"),i=r.convert(this.body.range.end,"Number"),o=this.body.util.toTime((this.props.minorCharWidth||10)*this.options.maxMinorChars).valueOf(),n=o-d.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this.body.range,o);n-=this.body.util.toTime(0).valueOf();var s=new h(new Date(e),new Date(i),n,this.body.hiddenDates,this.options);s.setMoment(this.options.moment),this.options.format&&s.setFormat(this.options.format),this.options.timeAxis&&s.setScale(this.options.timeAxis),this.step=s;var a=this.dom;a.redundant.lines=a.lines,a.redundant.majorTexts=a.majorTexts,a.redundant.minorTexts=a.minorTexts,a.lines=[],a.majorTexts=[],a.minorTexts=[];var l,c,p,f,m,v,g,y,b,_=0,w=void 0,x=0;for(s.start(),l=s.getCurrent(),p=this.body.util.toScreen(l);s.hasNext()&&x<1e3;){switch(x++,f=s.isMajor(),b=s.getClassName(),y=s.getLabelMinor(),l,c=p,s.next(),l=s.getCurrent(),s.isMajor(),p=this.body.util.toScreen(l),v=_,_=p-c,s.scale){case"week":m=!0;break;default:m=_>=.4*v}if(this.options.showMinorLabels&&m){var k=this._repaintMinorText(c,y,t,b);k.style.width=_+"px"}f&&this.options.showMajorLabels?(c>0&&(void 0==w&&(w=c),k=this._repaintMajorText(c,s.getLabelMajor(),t,b)),g=this._repaintMajorLine(c,_,t,b)):m?g=this._repaintMinorLine(c,_,t,b):g&&(g.style.width=parseInt(g.style.width)+_+"px")}if(1e3!==x||u||(console.warn("Something is wrong with the Timeline scale. Limited drawing of grid lines to 1000 lines."),u=!0),this.options.showMajorLabels){var S=this.body.util.toTime(0),D=s.getLabelMajor(S),M=D.length*(this.props.majorCharWidth||10)+10;(void 0==w||M<w)&&this._repaintMajorText(0,D,t,b)}r.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})}
19283,o.prototype._repaintMinorText=function(t,e,i,o){var n=this.dom.redundant.minorTexts.shift();if(!n){var s=document.createTextNode("");n=document.createElement("div"),n.appendChild(s),this.dom.foreground.appendChild(n)}return this.dom.minorTexts.push(n),n.innerHTML=e,n.style.top="top"==i?this.props.majorLabelHeight+"px":"0",this.options.rtl?(n.style.left="",n.style.right=t+"px"):n.style.left=t+"px",n.className="vis-text vis-minor "+o,n},o.prototype._repaintMajorText=function(t,e,i,o){var n=this.dom.redundant.majorTexts.shift();if(!n){var s=document.createElement("div");n=document.createElement("div"),n.appendChild(s),this.dom.foreground.appendChild(n)}return n.childNodes[0].innerHTML=e,n.className="vis-text vis-major "+o,n.style.top="top"==i?"0":this.props.minorLabelHeight+"px",this.options.rtl?(n.style.left="",n.style.right=t+"px"):n.style.left=t+"px",this.dom.majorTexts.push(n),n},o.prototype._repaintMinorLine=function(t,e,i,o){var n=this.dom.redundant.lines.shift();n||(n=document.createElement("div"),this.dom.background.appendChild(n)),this.dom.lines.push(n);var s=this.props;return n.style.top="top"==i?s.majorLabelHeight+"px":this.body.domProps.top.height+"px",n.style.height=s.minorLineHeight+"px",this.options.rtl?(n.style.left="",n.style.right=t-s.minorLineWidth/2+"px",n.className="vis-grid vis-vertical-rtl vis-minor "+o):(n.style.left=t-s.minorLineWidth/2+"px",n.className="vis-grid vis-vertical vis-minor "+o),n.style.width=e+"px",n},o.prototype._repaintMajorLine=function(t,e,i,o){var n=this.dom.redundant.lines.shift();n||(n=document.createElement("div"),this.dom.background.appendChild(n)),this.dom.lines.push(n);var s=this.props;return n.style.top="top"==i?"0":this.body.domProps.top.height+"px",this.options.rtl?(n.style.left="",n.style.right=t-s.majorLineWidth/2+"px",n.className="vis-grid vis-vertical-rtl vis-major "+o):(n.style.left=t-s.majorLineWidth/2+"px",n.className="vis-grid vis-vertical vis-major "+o),n.style.height=s.majorLineHeight+"px",n.style.width=e+"px",n},o.prototype._calculateCharSize=function(){this.dom.measureCharMinor||(this.dom.measureCharMinor=document.createElement("DIV"),this.dom.measureCharMinor.className="vis-text vis-minor vis-measure",this.dom.measureCharMinor.style.position="absolute",this.dom.measureCharMinor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMinor)),this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight,this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth,this.dom.measureCharMajor||(this.dom.measureCharMajor=document.createElement("DIV"),this.dom.measureCharMajor.className="vis-text vis-major vis-measure",this.dom.measureCharMajor.style.position="absolute",this.dom.measureCharMajor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMajor)),this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight,this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth};var u=!1;t.exports=o},function(t,e,i){function o(t,e){this.body=t,this.defaultOptions={moment:a,locales:h,locale:"en",id:void 0,title:void 0},this.options=s.extend({},this.defaultOptions),e&&e.time?this.customTime=e.time:this.customTime=new Date,this.eventParams={},this.setOptions(e),this._create()}var n=i(10),s=i(2),r=i(16),a=i(9),h=i(98);o.prototype=new r,o.prototype.setOptions=function(t){t&&s.selectiveExtend(["moment","locale","locales","id"],this.options,t)},o.prototype._create=function(){function t(t){this.body.range._onMouseWheel(t)}var e=document.createElement("div");e["custom-time"]=this,e.className="vis-custom-time "+(this.options.id||""),e.style.position="absolute",e.style.top="0px",e.style.height="100%",this.bar=e;var i=document.createElement("div");i.style.position="relative",i.style.top="0px",i.style.left="-10px",i.style.height="100%",i.style.width="20px",i.addEventListener?(i.addEventListener("mousewheel",t.bind(this),!1),i.addEventListener("DOMMouseScroll",t.bind(this),!1)):i.attachEvent("onmousewheel",t.bind(this)),e.appendChild(i),this.hammer=new n(i),this.hammer.on("panstart",this._onDragStart.bind(this)),this.hammer.on("panmove",this._onDrag.bind(this)),this.hammer.on("panend",this._onDragEnd.bind(this)),this.hammer.get("pan").set({threshold:5,direction:n.DIRECTION_HORIZONTAL})},o.prototype.destroy=function(){this.hide(),this.hammer.destroy(),this.hammer=null,this.body=null},o.prototype.redraw=function(){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar));var e=this.body.util.toScreen(this.customTime),i=this.options.locales[this.options.locale];i||(this.warned||(console.log("WARNING: options.locales['"+this.options.locale+"'] not found. See http://visjs.org/docs/timeline/#Localization"),this.warned=!0),i=this.options.locales.en);var o=this.options.title;return void 0===o?(o=i.time+": "+this.options.moment(this.customTime).format("dddd, MMMM Do YYYY, H:mm:ss"),o=o.charAt(0).toUpperCase()+o.substring(1)):"function"==typeof o&&(o=o.call(this.customTime)),this.bar.style.left=e+"px",this.bar.title=o,!1},o.prototype.hide=function(){this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar)},o.prototype.setCustomTime=function(t){this.customTime=s.convert(t,"Date"),this.redraw()},o.prototype.getCustomTime=function(){return new Date(this.customTime.valueOf())},o.prototype.setCustomTitle=function(t){this.options.title=t}
19283,o.prototype._onDragStart=function(t){this.eventParams.dragging=!0,this.eventParams.customTime=this.customTime,t.stopPropagation()},o.prototype._onDrag=function(t){if(this.eventParams.dragging){var e=this.body.util.toScreen(this.eventParams.customTime)+t.deltaX,i=this.body.util.toTime(e);this.setCustomTime(i),this.body.emitter.emit("timechange",{id:this.options.id,time:new Date(this.customTime.valueOf()),event:t}),t.stopPropagation()}},o.prototype._onDragEnd=function(t){this.eventParams.dragging&&(this.body.emitter.emit("timechanged",{id:this.options.id,time:new Date(this.customTime.valueOf()),event:t}),t.stopPropagation())},o.customTimeFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("custom-time"))return e["custom-time"];e=e.parentNode}return null},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(117).default,l=i(48).default,u=i(193).default,c=i(200).default,p=i(201).default,f=i(202).default,m=i(203).default,v=i(204).default,g=i(205).default,y=i(206).default,b=i(207).default,_=i(208).default,w=i(209).default,x=i(210).default,k=i(211).default,S=i(212).default,D=i(213).default,M=i(15),C=M.printStyle,O=function(){function t(e,i,o,n,r,a){(0,s.default)(this,t),this.options=h.bridgeObject(r),this.globalOptions=r,this.defaultOptions=a,this.body=i,this.edges=[],this.id=void 0,this.imagelist=o,this.grouplist=n,this.x=void 0,this.y=void 0,this.baseSize=this.options.size,this.baseFontSize=this.options.font.size,this.predefinedPosition=!1,this.selected=!1,this.hover=!1,this.labelModule=new d(this.body,this.options,!1),this.setOptions(e)}return(0,a.default)(t,[{key:"attachEdge",value:function(t){-1===this.edges.indexOf(t)&&this.edges.push(t)}},{key:"detachEdge",value:function(t){var e=this.edges.indexOf(t);-1!=e&&this.edges.splice(e,1)}},{key:"setOptions",value:function(e){var i=this.options.shape;if(e){if(void 0!==e.id&&(this.id=e.id),void 0===this.id)throw new Error("Node must have an id");t.checkMass(e,this.id),void 0!==e.x&&(null===e.x?(this.x=void 0,this.predefinedPosition=!1):(this.x=parseInt(e.x),this.predefinedPosition=!0)),void 0!==e.y&&(null===e.y?(this.y=void 0,this.predefinedPosition=!1):(this.y=parseInt(e.y),this.predefinedPosition=!0)),void 0!==e.size&&(this.baseSize=e.size),void 0!==e.value&&(e.value=parseFloat(e.value)),t.parseOptions(this.options,e,!0,this.globalOptions,this.grouplist);var o=[e,this.options,this.defaultOptions];return this.chooser=l.choosify("node",o),this._load_images(),this.updateLabelModule(e),this.updateShape(i),void 0!==e.hidden||void 0!==e.physics}}},{key:"_load_images",value:function(){if("circularImage"===this.options.shape||"image"===this.options.shape){if(void 0===this.options.image)throw new Error("Option image must be defined for node type '"+this.options.shape+"'");if(void 0===this.imagelist)throw new Error("Internal Error: No images provided");if("string"==typeof this.options.image)this.imageObj=this.imagelist.load(this.options.image,this.options.brokenImage,this.id);else{if(void 0===this.options.image.unselected)throw new Error("No unselected image provided");this.imageObj=this.imagelist.load(this.options.image.unselected,this.options.brokenImage,this.id),void 0!==this.options.image.selected?this.imageObjAlt=this.imagelist.load(this.options.image.selected,this.options.brokenImage,this.id):this.imageObjAlt=void 0}}}},{key:"getFormattingValues",value:function(){var t={color:this.options.color.background,borderWidth:this.options.borderWidth,borderColor:this.options.color.border,size:this.options.size,borderDashes:this.options.shapeProperties.borderDashes,borderRadius:this.options.shapeProperties.borderRadius,shadow:this.options.shadow.enabled,shadowColor:this.options.shadow.color,shadowSize:this.options.shadow.size,shadowX:this.options.shadow.x,shadowY:this.options.shadow.y};return this.selected||this.hover?!0===this.chooser?this.selected?(t.borderWidth*=2,t.color=this.options.color.highlight.background,t.borderColor=this.options.color.highlight.border,t.shadow=this.options.shadow.enabled):this.hover&&(t.color=this.options.color.hover.background,t.borderColor=this.options.color.hover.border,t.shadow=this.options.shadow.enabled):"function"==typeof this.chooser&&(this.chooser(t,this.options.id,this.selected,this.hover),!1===t.shadow&&(t.shadowColor===this.options.shadow.color&&t.shadowSize===this.options.shadow.size&&t.shadowX===this.options.shadow.x&&t.shadowY===this.options.shadow.y||(t.shadow=!0))):t.shadow=this.options.shadow.enabled,t}},{key:"updateLabelModule",value:function(e){void 0!==this.options.label&&null!==this.options.label||(this.options.label=""),t.updateGroupOptions(this.options,e,this.grouplist);var i=this.grouplist.get(this.options.group,!1),o=[e,this.options,i,this.globalOptions,this.defaultOptions];this.labelModule.update(this.options,o),void 0!==this.labelModule.baseSize&&(this.baseFontSize=this.labelModule.baseSize)}},{key:"updateShape",value:function(t){if(t===this.options.shape&&this.shape)this.shape.setOptions(this.options,this.imageObj,this.imageObjAlt);else switch(this.options.shape){case"box":this.shape=new u(this.options,this.body,this.labelModule);break;case"circle":this.shape=new c(this.options,this.body,this.labelModule);break;case"circularImage":this.shape=new p(this.options,this.body,this.labelModule,this.imageObj,this.imageObjAlt);break;case"database":this.shape=new f(this.options,this.body,this.labelModule);break;case"diamond":this.shape=new m(this.options,this.body,this.labelModule);break;case"dot":this.shape=new v(this.options,this.body,this.labelModule);break;case"ellipse":this.shape=new g(this.options,this.body,this.labelModule);break;case"icon":this.shape=new y(this.options,this.body,this.labelModule);break;case"image":this.shape=new b(this.options,this.body,this.labelModule,this.imageObj,this.imageObjAlt);break;case"square":this.shape=new _(this.options,this.body,this.labelModule);break;case"hexagon":this.shape=new w(this.options,this.body,this.labelModule);break;case"star":this.shape=new x(this.options,this.body,this.labelModule);break;case"text":this.shape=new k(this.options,this.body,this.labelModule);break;case"triangle":this.shape=new S(this.options,this.body,this.labelModule);break;case"triangleDown":this.shape=new D(this.options,this.body,this.labelModule);break;default:this.shape=new g(this.options,this.body,this.labelModule)}this.needsRefresh()}},{key:"select",value:function(){this.selected=!0,this.needsRefresh()}},{key:"unselect",value:function(){this.selected=!1,this.needsRefresh()}},{key:"needsRefresh",value:function(){this.shape.refreshNeeded=!0}},{key:"getTitle",value:function(){return this.options.title}},{key:"distanceToBorder",value:function(t,e){return this.shape.distanceToBorder(t,e)}},{key:"isFixed",value:function(){return this.options.fixed.x&&this.options.fixed.y}},{key:"isSelected",value:function(){return this.selected}},{key:"getValue",value:function(){return this.options.value}},{key:"getLabelSize",value:function(){return this.labelModule.size()}}
19283,{key:"setValueRange",value:function(t,e,i){if(void 0!==this.options.value){var o=this.options.scaling.customScalingFunction(t,e,i,this.options.value),n=this.options.scaling.max-this.options.scaling.min;if(!0===this.options.scaling.label.enabled){var s=this.options.scaling.label.max-this.options.scaling.label.min;this.options.font.size=this.options.scaling.label.min+o*s}this.options.size=this.options.scaling.min+o*n}else this.options.size=this.baseSize,this.options.font.size=this.baseFontSize;this.updateLabelModule()}},{key:"draw",value:function(t){var e=this.getFormattingValues();this.shape.draw(t,this.x,this.y,this.selected,this.hover,e)}},{key:"updateBoundingBox",value:function(t){this.shape.updateBoundingBox(this.x,this.y,t)}},{key:"resize",value:function(t){var e=this.getFormattingValues();this.shape.resize(t,this.selected,this.hover,e)}},{key:"getItemsOnPoint",value:function(t){var e=[];return this.labelModule.visible()&&l.pointInRect(this.labelModule.getSize(),t)&&e.push({nodeId:this.id,labelId:0}),l.pointInRect(this.shape.boundingBox,t)&&e.push({nodeId:this.id}),e}},{key:"isOverlappingWith",value:function(t){return this.shape.left<t.right&&this.shape.left+this.shape.width>t.left&&this.shape.top<t.bottom&&this.shape.top+this.shape.height>t.top}},{key:"isBoundingBoxOverlappingWith",value:function(t){return this.shape.boundingBox.left<t.right&&this.shape.boundingBox.right>t.left&&this.shape.boundingBox.top<t.bottom&&this.shape.boundingBox.bottom>t.top}}],[{key:"updateGroupOptions",value:function(t,e,i){if(void 0!==i){var o=t.group;if(void 0!==e&&void 0!==e.group&&o!==e.group)throw new Error("updateGroupOptions: group values in options don't match.");if("number"==typeof o||"string"==typeof o&&""!=o){var n=i.get(o);h.selectiveNotDeepExtend(["font"],t,n),t.color=h.parseColor(t.color)}}}},{key:"parseOptions",value:function(e,i){var o=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},s=arguments[4],r=["color","fixed","shadow"];if(h.selectiveNotDeepExtend(r,e,i,o),t.checkMass(i),h.mergeOptions(e,i,"shadow",n),void 0!==i.color&&null!==i.color){var a=h.parseColor(i.color);h.fillIfDefined(e.color,a)}else!0===o&&null===i.color&&(e.color=h.bridgeObject(n.color));void 0!==i.fixed&&null!==i.fixed&&("boolean"==typeof i.fixed?(e.fixed.x=i.fixed,e.fixed.y=i.fixed):(void 0!==i.fixed.x&&"boolean"==typeof i.fixed.x&&(e.fixed.x=i.fixed.x),void 0!==i.fixed.y&&"boolean"==typeof i.fixed.y&&(e.fixed.y=i.fixed.y))),!0===o&&null===i.font&&(e.font=h.bridgeObject(n.font)),t.updateGroupOptions(e,i,s),void 0!==i.scaling&&h.mergeOptions(e.scaling,i.scaling,"label",n.scaling)}},{key:"checkMass",value:function(t,e){if(void 0!==t.mass&&t.mass<=0){var i="";void 0!==e&&(i=" in node id: "+e),console.log("%cNegative or zero mass disallowed"+i+", setting mass to 1.",C),t.mass=1}}}]),t}();e.default=O},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(6),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(2),u=function(){function t(){(0,a.default)(this,t)}return(0,d.default)(t,null,[{key:"choosify",value:function(t,e){var i=["node","edge","label"],o=!0,n=l.topMost(e,"chosen");if("boolean"==typeof n)o=n;else if("object"===(void 0===n?"undefined":(0,s.default)(n))){if(-1===i.indexOf(t))throw new Error("choosify: subOption '"+t+"' should be one of '"+i.join("', '")+"'");var r=l.topMost(e,["chosen",t]);"boolean"!=typeof r&&"function"!=typeof r||(o=r)}return o}},{key:"pointInRect",value:function(t,e,i){if(t.width<=0||t.height<=0)return!1;if(void 0!==i){var o={x:e.x-i.x,y:e.y-i.y};if(0!==i.angle){var n=-i.angle;e={x:Math.cos(n)*o.x-Math.sin(n)*o.y,y:Math.sin(n)*o.x+Math.cos(n)*o.y}}else e=o}var s=t.x+t.width,r=t.y+t.width;return t.left<e.x&&s>e.x&&t.top<e.y&&r>e.y}},{key:"isValidLabel",value:function(t){return"string"==typeof t&&""!==t}}]),t}();e.default=u},function(t,e,i){i(125);for(var o=i(18),n=i(26),s=i(31),r=i(13)("toStringTag"),a="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),h=0;h<a.length;h++){var d=a[h],l=o[d],u=l&&l.prototype;u&&!u[r]&&n(u,r,d),s[d]=s.Array}},function(t,e){var i={}.toString;t.exports=function(t){return i.call(t).slice(8,-1)}},function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on  "+t);return t}},function(t,e){t.exports=!0}
19283,function(t,e,i){var o=i(32);t.exports=function(t,e){if(!o(t))return t;var i,n;if(e&&"function"==typeof(i=t.toString)&&!o(n=i.call(t)))return n;if("function"==typeof(i=t.valueOf)&&!o(n=i.call(t)))return n;if(!e&&"function"==typeof(i=t.toString)&&!o(n=i.call(t)))return n;throw TypeError("Can't convert object to primitive value")}},function(t,e,i){var o=i(27),n=i(130),s=i(58),r=i(56)("IE_PROTO"),a=function(){},h=function(){var t,e=i(82)("iframe"),o=s.length;for(e.style.display="none",i(134).appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("<script>document.F=Object<\/script>"),t.close(),h=t.F;o--;)delete h.prototype[s[o]];return h()};t.exports=Object.create||function(t,e){var i;return null!==t?(a.prototype=o(t),i=new a,a.prototype=null,i[r]=t):i=h(),void 0===e?i:n(i,e)}},function(t,e){var i=Math.ceil,o=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?o:i)(t)}},function(t,e,i){var o=i(57)("keys"),n=i(40);t.exports=function(t){return o[t]||(o[t]=n(t))}},function(t,e,i){var o=i(18),n=o["__core-js_shared__"]||(o["__core-js_shared__"]={});t.exports=function(t){return n[t]||(n[t]={})}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,i){var o=i(20).f,n=i(22),s=i(13)("toStringTag");t.exports=function(t,e,i){t&&!n(t=i?t:t.prototype,s)&&o(t,s,{configurable:!0,value:e})}},function(t,e,i){var o=i(135)(!0);i(79)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,i=this._i;return i>=e.length?{value:void 0,done:!0}:(t=o(e,i),this._i+=t.length,{value:t,done:!1})})},function(t,e,i){e.f=i(13)},function(t,e,i){var o=i(18),n=i(7),s=i(52),r=i(61),a=i(20).f;t.exports=function(t){var e=n.Symbol||(n.Symbol=s?{}:o.Symbol||{});"_"==t.charAt(0)||t in e||a(e,t,{value:r.f(t)})}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(t,e){var i=p().hours(0).minutes(0).seconds(0).milliseconds(0),o=i.clone().add(-3,"days").valueOf(),n=i.clone().add(3,"days").valueOf();this.millisecondsPerPixelCache=void 0,void 0===e?(this.start=o,this.end=n):(this.start=e.start||o,this.end=e.end||n),this.rolling=!1,this.body=t,this.deltaDifference=0,this.scaleOffset=0,this.startToFront=!1,this.endToFront=!0,this.defaultOptions={rtl:!1,start:null,end:null,moment:p,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10,rollingMode:{follow:!1,offset:.5}},this.options=c.extend({},this.defaultOptions),this.props={touch:{}},this.animationTimer=null,this.body.emitter.on("panstart",this._onDragStart.bind(this)),this.body.emitter.on("panmove",this._onDrag.bind(this)),this.body.emitter.on("panend",this._onDragEnd.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.body.dom.rollingModeBtn.addEventListener("click",this.startRolling.bind(this)),this.setOptions(e)}function s(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}var r=i(8),a=o(r),h=i(19),d=o(h),l=i(6),u=o(l),c=i(2),p=i(9),f=i(16),m=i(36);n.prototype=new f,n.prototype.setOptions=function(t){if(t){var e=["animation","direction","min","max","zoomMin","zoomMax","moveable","zoomable","moment","activate","hiddenDates","zoomKey","rtl","showCurrentTime","rollingMode","horizontalScroll"];c.selectiveExtend(e,this.options,t),t.rollingMode&&t.rollingMode.follow&&this.startRolling(),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},n.prototype.startRolling=function(){function t(){e.stopRolling(),e.rolling=!0;var i=e.end-e.start,o=c.convert(new Date,"Date").valueOf(),n=o-i*e.options.rollingMode.offset,s=o+i*(1-e.options.rollingMode.offset),r={animation:!1};e.setRange(n,s,r),i=1/e.conversion(e.body.domProps.center.width).scale/10,i<30&&(i=30),i>1e3&&(i=1e3),e.body.dom.rollingModeBtn.style.visibility="hidden",e.currentTimeTimer=setTimeout(t,i)}var e=this;t()},n.prototype.stopRolling=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),this.rolling=!1,this.body.dom.rollingModeBtn.style.visibility="visible")}
19283,n.prototype.setRange=function(t,e,i,o,n){i||(i={}),!0!==i.byUser&&(i.byUser=!1);var s=this,r=void 0!=t?c.convert(t,"Date").valueOf():null,h=void 0!=e?c.convert(e,"Date").valueOf():null;if(this._cancelAnimation(),this.millisecondsPerPixelCache=void 0,i.animation){var l=this.start,p=this.end,f="object"===(0,u.default)(i.animation)&&"duration"in i.animation?i.animation.duration:500,v="object"===(0,u.default)(i.animation)&&"easingFunction"in i.animation?i.animation.easingFunction:"easeInOutQuad",g=c.easingFunctions[v];if(!g)throw new Error("Unknown easing function "+(0,d.default)(v)+". Choose from: "+(0,a.default)(c.easingFunctions).join(", "));var y=(new Date).valueOf(),b=!1;return function t(){if(!s.props.touch.dragging){var e=(new Date).valueOf(),a=e-y,d=g(a/f),u=a>f,c=u||null===r?r:l+(r-l)*d,v=u||null===h?h:p+(h-p)*d;_=s._applyRange(c,v),m.updateHiddenDates(s.options.moment,s.body,s.options.hiddenDates),b=b||_;var w={start:new Date(s.start),end:new Date(s.end),byUser:i.byUser,event:i.event};if(n&&n(d,_,u),_&&s.body.emitter.emit("rangechange",w),u){if(b&&(s.body.emitter.emit("rangechanged",w),o))return o()}else s.animationTimer=setTimeout(t,20)}}()}var _=this._applyRange(r,h);if(m.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates),_){var w={start:new Date(this.start),end:new Date(this.end),byUser:i.byUser,event:i.event};if(this.body.emitter.emit("rangechange",w),clearTimeout(s.timeoutID),s.timeoutID=setTimeout(function(){s.body.emitter.emit("rangechanged",w)},200),o)return o()}},n.prototype.getMillisecondsPerPixel=function(){return void 0===this.millisecondsPerPixelCache&&(this.millisecondsPerPixelCache=(this.end-this.start)/this.body.dom.center.clientWidth),this.millisecondsPerPixelCache},n.prototype._cancelAnimation=function(){this.animationTimer&&(clearTimeout(this.animationTimer),this.animationTimer=null)},n.prototype._applyRange=function(t,e){var i,o=null!=t?c.convert(t,"Date").valueOf():this.start,n=null!=e?c.convert(e,"Date").valueOf():this.end,s=null!=this.options.max?c.convert(this.options.max,"Date").valueOf():null,r=null!=this.options.min?c.convert(this.options.min,"Date").valueOf():null;if(isNaN(o)||null===o)throw new Error('Invalid start "'+t+'"');if(isNaN(n)||null===n)throw new Error('Invalid end "'+e+'"');if(n<o&&(n=o),null!==r&&o<r&&(i=r-o,o+=i,n+=i,null!=s&&n>s&&(n=s)),null!==s&&n>s&&(i=n-s,o-=i,n-=i,null!=r&&o<r&&(o=r)),null!==this.options.zoomMin){var a=parseFloat(this.options.zoomMin);if(a<0&&(a=0),n-o<a){this.end-this.start===a&&o>=this.start-.5&&n<=this.end?(o=this.start,n=this.end):(i=a-(n-o),o-=i/2,n+=i/2)}}if(null!==this.options.zoomMax){var h=parseFloat(this.options.zoomMax);h<0&&(h=0),n-o>h&&(this.end-this.start===h&&o<this.start&&n>this.end?(o=this.start,n=this.end):(i=n-o-h,o+=i/2,n-=i/2))}var d=this.start!=o||this.end!=n;return o>=this.start&&o<=this.end||n>=this.start&&n<=this.end||this.start>=o&&this.start<=n||this.end>=o&&this.end<=n||this.body.emitter.emit("checkRangedItems"),this.start=o,this.end=n,d},n.prototype.getRange=function(){return{start:this.start,end:this.end}},n.prototype.conversion=function(t,e){return n.conversion(this.start,this.end,t,e)},n.conversion=function(t,e,i,o){return void 0===o&&(o=0),0!=i&&e-t!=0?{offset:t,scale:i/(e-t-o)}:{offset:0,scale:1}},n.prototype._onDragStart=function(t){this.deltaDifference=0,this.previousDelta=0,this.options.moveable&&this._isInsideRange(t)&&this.props.touch.allowDragging&&(this.stopRolling(),this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.dragging=!0,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},n.prototype._onDrag=function(t){if(t&&this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging){var e=this.options.direction;s(e);var i="horizontal"==e?t.deltaX:t.deltaY;i-=this.deltaDifference;var o=this.props.touch.end-this.props.touch.start;o-=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);var n,r="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height;n=this.options.rtl?i/r*o:-i/r*o;var a=this.props.touch.start+n,h=this.props.touch.end+n,d=m.snapAwayFromHidden(this.body.hiddenDates,a,this.previousDelta-i,!0),l=m.snapAwayFromHidden(this.body.hiddenDates,h,this.previousDelta-i,!0);
19283if(d!=a||l!=h)return this.deltaDifference+=i,this.props.touch.start=d,this.props.touch.end=l,void this._onDrag(t);this.previousDelta=i,this._applyRange(a,h);var u=new Date(this.start),c=new Date(this.end);this.body.emitter.emit("rangechange",{start:u,end:c,byUser:!0,event:t}),this.body.emitter.emit("panmove")}},n.prototype._onDragEnd=function(t){this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.dragging=!1,this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end),byUser:!0,event:t}))},n.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),!(this.options.zoomKey&&!t[this.options.zoomKey]&&this.options.zoomable||!this.options.zoomable&&this.options.moveable)&&this.options.zoomable&&this.options.moveable&&this._isInsideRange(t)&&e){var i;i=e<0?1-e/5:1/(1+e/5);var o;if(this.rolling)o=this.start+(this.end-this.start)*this.options.rollingMode.offset;else{var n=this.getPointer({x:t.clientX,y:t.clientY},this.body.dom.center);o=this._pointerToDate(n)}this.zoom(i,o,e,t),t.preventDefault()}},n.prototype._onTouch=function(t){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null,this.scaleOffset=0,this.deltaDifference=0,c.preventDefault(t)},n.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable){c.preventDefault(t),this.props.touch.allowDragging=!1,this.props.touch.center||(this.props.touch.center=this.getPointer(t.center,this.body.dom.center)),this.stopRolling();var e=1/(t.scale+this.scaleOffset),i=this._pointerToDate(this.props.touch.center),o=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),n=m.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,i),s=o-n,r=i-n+(this.props.touch.start-(i-n))*e,a=i+s+(this.props.touch.end-(i+s))*e;this.startToFront=1-e<=0,this.endToFront=e-1<=0;var h=m.snapAwayFromHidden(this.body.hiddenDates,r,1-e,!0),d=m.snapAwayFromHidden(this.body.hiddenDates,a,e-1,!0);h==r&&d==a||(this.props.touch.start=h,this.props.touch.end=d,this.scaleOffset=1-t.scale,r=h,a=d);var l={animation:!1,byUser:!0,event:t};this.setRange(r,a,l),this.startToFront=!1,this.endToFront=!0}},n.prototype._isInsideRange=function(t){var e,i=t.center?t.center.x:t.clientX;e=this.options.rtl?i-c.getAbsoluteLeft(this.body.dom.centerContainer):c.getAbsoluteRight(this.body.dom.centerContainer)-i;var o=this.body.util.toTime(e);return o>=this.start&&o<=this.end},n.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(s(i),"horizontal"==i)return this.body.util.toTime(t.x).valueOf();var o=this.body.domProps.center.height;return e=this.conversion(o),t.y/e.scale+e.offset},n.prototype.getPointer=function(t,e){return this.options.rtl?{x:c.getAbsoluteRight(e)-t.x,y:t.y-c.getAbsoluteTop(e)}:{x:t.x-c.getAbsoluteLeft(e),y:t.y-c.getAbsoluteTop(e)}},n.prototype.zoom=function(t,e,i,o){null==e&&(e=(this.start+this.end)/2);var n=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),s=m.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,e),r=n-s,a=e-s+(this.start-(e-s))*t,h=e+r+(this.end-(e+r))*t;this.startToFront=!(i>0),this.endToFront=!(-i>0)
19284;var d=m.snapAwayFromHidden(this.body.hiddenDates,a,i,!0),l=m.snapAwayFromHidden(this.body.hiddenDates,h,-i,!0);d==a&&l==h||(a=d,h=l);var u={animation:!1,byUser:!0,event:o};this.setRange(a,h,u),this.startToFront=!1,this.endToFront=!0},n.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,o=this.end+e*t;this.start=i,this.end=o},n.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,o=this.start-i,n=this.end-i,s={animation:!1,byUser:!0,event:null};this.setRange(o,n,s)},t.exports=n},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(){}var s=i(19),r=o(s),a=i(6),h=o(a),d=i(44),l=i(10),u=i(37),c=i(2),p=i(45),f=i(97),m=i(36),v=i(46);d(n.prototype),n.prototype._create=function(t){function e(t){this.isActive()&&this.emit
19284("mousewheel",t);var e=0,i=0;if("detail"in t&&(i=-1*t.detail),"wheelDelta"in t&&(i=t.wheelDelta),"wheelDeltaY"in t&&(i=t.wheelDeltaY),"wheelDeltaX"in t&&(e=-1*t.wheelDeltaX),"axis"in t&&t.axis===t.HORIZONTAL_AXIS&&(e=-1*i,i=0),"deltaY"in t&&(i=-1*t.deltaY),"deltaX"in t&&(e=t.deltaX),this.options.zoomKey&&!t[this.options.zoomKey])if(t.preventDefault(),this.options.verticalScroll&&Math.abs(i)>=Math.abs(e)){var o=this.props.scrollTop,n=o+i;this.isActive()&&(this._setScrollTop(n),this._redraw(),this.emit("scroll",t))}else if(this.options.horizontalScroll){var s=Math.abs(e)>=Math.abs(i)?e:i,r=s/120*(this.range.end-this.range.start)/20,a=this.range.start+r,h=this.range.end+r,d={animation:!1,byUser:!0,event:t};this.range.setRange(a,h,d)}}function i(t){if(s.options.verticalScroll&&(t.preventDefault(),s.isActive())){var e=-t.target.scrollTop;s._setScrollTop(e),s._redraw(),s.emit("scrollSide",t)}}function o(t){if(t.preventDefault&&t.preventDefault(),!(!t.target.className.indexOf("vis")>-1||a))return t.dataTransfer.dropEffect="move",a=!0,!1}function n(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation();try{var e=JSON.parse(t.dataTransfer.getData("text"));if(!e||!e.content)return}catch(t){return!1}return a=!1,t.center={x:t.clientX,y:t.clientY},"item"!==e.target?s.itemSet._onAddItem(t):s.itemSet._onDropObjectOnItem(t),s.emit("drop",s.getEventProperties(t)),!1}this.dom={},this.dom.container=t,this.dom.root=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.backgroundVertical=document.createElement("div"),this.dom.backgroundHorizontal=document.createElement("div"),this.dom.centerContainer=document.createElement("div"),this.dom.leftContainer=document.createElement("div"),this.dom.rightContainer=document.createElement("div"),this.dom.center=document.createElement("div"),this.dom.left=document.createElement("div"),this.dom.right=document.createElement("div"),this.dom.top=document.createElement("div"),this.dom.bottom=document.createElement("div"),this.dom.shadowTop=document.createElement("div"),this.dom.shadowBottom=document.createElement("div"),this.dom.shadowTopLeft=document.createElement("div"),this.dom.shadowBottomLeft=document.createElement("div"),this.dom.shadowTopRight=document.createElement("div"),this.dom.shadowBottomRight=document.createElement("div"),this.dom.rollingModeBtn=document.createElement("div"),this.dom.root.className="vis-timeline",this.dom.background.className="vis-panel vis-background",this.dom.backgroundVertical.className="vis-panel vis-background vis-vertical",this.dom.backgroundHorizontal.className="vis-panel vis-background vis-horizontal",this.dom.centerContainer.className="vis-panel vis-center",this.dom.leftContainer.className="vis-panel vis-left",this.dom.rightContainer.className="vis-panel vis-right",this.dom.top.className="vis-panel vis-top",this.dom.bottom.className="vis-panel vis-bottom",this.dom.left.className="vis-content",this.dom.center.className="vis-content",this.dom.right.className="vis-content",this.dom.shadowTop.className="vis-shadow vis-top",this.dom.shadowBottom.className="vis-shadow vis-bottom",this.dom.shadowTopLeft.className="vis-shadow vis-top",this.dom.shadowBottomLeft.className="vis-shadow vis-bottom",this.dom.shadowTopRight.className="vis-shadow vis-top",this.dom.shadowBottomRight.className="vis-shadow vis-bottom",this.dom.rollingModeBtn.className="vis-rolling-mode-btn",this.dom.root.appendChild(this.dom.background),this.dom.root.appendChild(this.dom.backgroundVertical),this.dom.root.appendChild(this.dom.backgroundHorizontal),this.dom.root.appendChild(this.dom.centerContainer),this.dom.root.appendChild(this.dom.leftContainer),this.dom.root.appendChild(this.dom.rightContainer),this.dom.root.appendChild(this.dom.top),this.dom.root.appendChild(this.dom.bottom),this.dom.root.appendChild(this.dom.bottom),this.dom.root.appendChild(this.dom.rollingModeBtn),this.dom.centerContainer.appendChild(this.dom.center),this.dom.leftContainer.appendChild(this.dom.left),this.dom.rightContainer.appendChild(this.dom.right),this.dom.centerContainer.appendChild(this.dom.shadowTop),this.dom.centerContainer.appendChild(this.dom.shadowBottom),this.dom.leftContainer.appendChild(this.dom.shadowTopLeft),this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft),this.dom.rightContainer.appendChild(this.dom.shadowTopRight),this.dom.rightContainer.appendChild(this.dom.shadowBottomRight),this.props={root:{},background:{},centerContainer:{},leftContainer:{},rightContainer:{},center:{},left:{},right:{},top:{},bottom:{},border:{},scrollTop:0,scrollTopMin:0},this.on("rangechange",function(){!0===this.initialDrawDone&&this._redraw()}.bind(this)),this.on("rangechanged",function(){this.initialRangeChangeDone||(this.initialRangeChangeDone=!0)}.bind(this)),this.on("touch",this._onTouch.bind(this)),this.on("panmove",this._onDrag.bind(this));var s=this;this._origRedraw=this._redraw.bind(this),this._redraw=c.throttle(this._origRedraw),this.on("_change",function(t){s.itemSet&&s.itemSet.initialItemSetDrawn&&t&&1==t.queue?s._redraw():s._origRedraw()}),this.hammer=new l(this.dom.root);var r=this.hammer.get("pinch").set({enable:!0});u.disablePreventDefaultVertically(r),this.hammer.get("pan").set({threshold:5,direction:l.DIRECTION_HORIZONTAL}),this.listeners={},["tap","doubletap","press","pinch","pan","panstart","panmove","panend"].forEach(function(t){var e=function(e){s.isActive()&&s.emit(t,e)};s.hammer.on(t,e),s.listeners[t]=e}),u.onTouch(this.hammer,function(t){s.emit("touch",t)}.bind(this)),u.onRelease(this.hammer,function(t){s.emit("release",t)}.bind(this)),this.dom.centerContainer.addEventListener?(this.dom.centerContainer.addEventListener("mousewheel",e.bind(this),!1),this.dom.centerContainer.addEventListener("DOMMouseScroll",e.bind(this),!1)):this.dom.centerContainer.attachEvent("onmousewheel",e.bind(this)),this.dom.left.parentNode.addEventListener("scroll",i.bind(this)),this.dom.right.parentNode.addEventListener("scroll",i.bind(this));var a=!1;if(this.dom.center.addEventListener("dragover",o.bind(this),!1),this.dom.center.addEventListener("drop",n.bind(this),!1),this.customTimes=[],this.touch={},this.redrawCount=0,this.initialDrawDone=!1,this.initialRangeChangeDone=!1,!t)throw new Error("No container provided");t.appendChild(this.dom.root)},n.prototype.setOptions=function(t){if(t){var e=["width","height","minHeight","maxHeight","autoResize","start","end","clickToUse","dataAttributes","hiddenDates","locale","locales","moment","rtl","zoomKey","horizontalScroll","verticalScroll"];if(c.selectiveExtend(e,this.options,t),this.dom.rollingModeBtn.style.visibility="hidden",this.options.rtl&&(this.dom.container.style.direction="rtl",this.dom.backgroundVertical.className="vis-panel vis-background vis-vertical-rtl"),this.options.verticalScroll&&(this.options.rtl?this.dom.rightContainer.className="vis-panel vis-right vis-vertical-scroll":this.dom.leftContainer.className="vis-panel vis-left vis-vertical-scroll"),"object"!==(0,h.default)(this.options.orientation)&&(this.options.orientation={item:void 0,axis:void 0}),"orientation"in t&&("string"==typeof t.orientation?this.options.orientation={item:t.orientation,axis:t.orientation}:"object"===(0,h.default)(t.orientation)&&("item"in t.orientation&&(this.options.orientation.item=t.orientation.item),"axis"in t.orientation&&(this.options.orientation.axis=t.orientation.axis))
19284),"both"===this.options.orientation.axis){if(!this.timeAxis2){var i=this.timeAxis2=new p(this.body);i.setOptions=function(t){var e=t?c.extend({},t):{};e.orientation="top",p.prototype.setOptions.call(i,e)},this.components.push(i)}}else if(this.timeAxis2){var o=this.components.indexOf(this.timeAxis2);-1!==o&&this.components.splice(o,1),this.timeAxis2.destroy(),this.timeAxis2=null}if("function"==typeof t.drawPoints&&(t.drawPoints={onRender:t.drawPoints}),"hiddenDates"in this.options&&m.convertHiddenOptions(this.options.moment,this.body,this.options.hiddenDates),"clickToUse"in t&&(t.clickToUse?this.activator||(this.activator=new f(this.dom.root)):this.activator&&(this.activator.destroy(),delete this.activator)),"showCustomTime"in t)throw new Error("Option `showCustomTime` is deprecated. Create a custom time bar via timeline.addCustomTime(time [, id])");this._initAutoResize()}if(this.components.forEach(function(e){return e.setOptions(t)}),"configure"in t){this.configurator||(this.configurator=this._createConfigurator()),this.configurator.setOptions(t.configure);var n=c.deepExtend({},this.options);this.components.forEach(function(t){c.deepExtend(n,t.options)}),this.configurator.setModuleOptions({global:n})}this._redraw()},n.prototype.isActive=function(){return!this.activator||this.activator.active},n.prototype.destroy=function(){this.setItems(null),this.setGroups(null),this.off(),this._stopAutoResize(),this.dom.root.parentNode&&this.dom.root.parentNode.removeChild(this.dom.root),this.dom=null,this.activator&&(this.activator.destroy(),delete this.activator);for(var t in this.listeners)this.listeners.hasOwnProperty(t)&&delete this.listeners[t];this.listeners=null,this.hammer=null,this.components.forEach(function(t){return t.destroy()}),this.body=null},n.prototype.setCustomTime=function(t,e){var i=this.customTimes.filter(function(t){return e===t.options.id});if(0===i.length)throw new Error("No custom time bar found with id "+(0,r.default)(e));i.length>0&&i[0].setCustomTime(t)},n.prototype.getCustomTime=function(t){var e=this.customTimes.filter(function(e){return e.options.id===t});if(0===e.length)throw new Error("No custom time bar found with id "+(0,r.default)(t));return e[0].getCustomTime()},n.prototype.setCustomTimeTitle=function(t,e){var i=this.customTimes.filter(function(t){return t.options.id===e});if(0===i.length)throw new Error("No custom time bar found with id "+(0,r.default)(e));if(i.length>0)return i[0].setCustomTitle(t)},n.prototype.getEventProperties=function(t){return{event:t}},n.prototype.addCustomTime=function(t,e){var i=void 0!==t?c.convert(t,"Date").valueOf():new Date;if(this.customTimes.some(function(t){return t.options.id===e}))throw new Error("A custom time with id "+(0,r.default)(e)+" already exists");var o=new v(this.body,c.extend({},this.options,{time:i,id:e}));return this.customTimes.push(o),this.components.push(o),this._redraw(),e},n.prototype.removeCustomTime=function(t){var e=this.customTimes.filter(function(e){return e.options.id===t});if(0===e.length)throw new Error("No custom time bar found with id "+(0,r.default)(t));e.forEach(function(t){this.customTimes.splice(this.customTimes.indexOf(t),1),this.components.splice(this.components.indexOf(t),1),t.destroy()}.bind(this))},n.prototype.getVisibleItems=function(){return this.itemSet&&this.itemSet.getVisibleItems()||[]},n.prototype.fit=function(t,e){var i=this.getDataRange();if(null!==i.min||null!==i.max){var o=i.max-i.min,n=new Date(i.min.valueOf()-.01*o),s=new Date(i.max.valueOf()+.01*o),r=!t||void 0===t.animation||t.animation;this.range.setRange(n,s,{animation:r},e)}},n.prototype.getDataRange=function(){throw new Error("Cannot invoke abstract method getDataRange")},n.prototype.setWindow=function(t,e,i,o){"function"==typeof arguments[2]&&(o=arguments[2],i={});var n,s;1==arguments.length?(s=arguments[0],n=void 0===s.animation||s.animation,this.range.setRange(s.start,s.end,{animation:n})):2==arguments.length&&"function"==typeof arguments[1]?(s=arguments[0],o=arguments[1],n=void 0===s.animation||s.animation,this.range.setRange(s.start,s.end,{animation:n},o)):(n=!i||void 0===i.animation||i.animation,this.range.setRange(t,e,{animation:n},o))}
19284,n.prototype.moveTo=function(t,e,i){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.range.end-this.range.start,n=c.convert(t,"Date").valueOf(),s=n-o/2,r=n+o/2,a=!e||void 0===e.animation||e.animation;this.range.setRange(s,r,{animation:a},i)},n.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},n.prototype.zoomIn=function(t,e,i){if(!(!t||t<0||t>1)){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.getWindow(),n=o.start.valueOf(),s=o.end.valueOf(),r=s-n,a=r/(1+t),h=(r-a)/2,d=n+h,l=s-h;this.setWindow(d,l,e,i)}},n.prototype.zoomOut=function(t,e,i){if(!(!t||t<0||t>1)){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.getWindow(),n=o.start.valueOf(),s=o.end.valueOf(),r=s-n,a=n-r*t/2,h=s+r*t/2;this.setWindow(a,h,e,i)}},n.prototype.redraw=function(){this._redraw()},n.prototype._redraw=function(){this.redrawCount++;var t=!1,e=this.options,i=this.props,o=this.dom;if(o&&o.container&&0!=o.root.offsetWidth){m.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates),"top"==e.orientation?(c.addClassName(o.root,"vis-top"),c.removeClassName(o.root,"vis-bottom")):(c.removeClassName(o.root,"vis-top"),c.addClassName(o.root,"vis-bottom")),o.root.style.maxHeight=c.option.asSize(e.maxHeight,""),o.root.style.minHeight=c.option.asSize(e.minHeight,""),o.root.style.width=c.option.asSize(e.width,""),i.border.left=(o.centerContainer.offsetWidth-o.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(o.centerContainer.offsetHeight-o.centerContainer.clientHeight)/2,i.border.bottom=i.border.top,i.borderRootHeight=o.root.offsetHeight-o.root.clientHeight,i.borderRootWidth=o.root.offsetWidth-o.root.clientWidth,0===o.centerContainer.clientHeight&&(i.border.left=i.border.top,i.border.right=i.border.left),0===o.root.clientHeight&&(i.borderRootWidth=i.borderRootHeight),i.center.height=o.center.offsetHeight,i.left.height=o.left.offsetHeight,i.right.height=o.right.offsetHeight,i.top.height=o.top.clientHeight||-i.border.top,i.bottom.height=o.bottom.clientHeight||-i.border.bottom;var n=Math.max(i.left.height,i.center.height,i.right.height),s=i.top.height+n+i.bottom.height+i.borderRootHeight+i.border.top+i.border.bottom;o.root.style.height=c.option.asSize(e.height,s+"px"),i.root.height=o.root.offsetHeight,i.background.height=i.root.height-i.borderRootHeight;var r=i.root.height-i.top.height-i.bottom.height-i.borderRootHeight;i.centerContainer.height=r,i.leftContainer.height=r,i.rightContainer.height=i.leftContainer.height,i.root.width=o.root.offsetWidth,i.background.width=i.root.width-i.borderRootWidth,this.initialDrawDone||(i.scrollbarWidth=c.getScrollBarWidth()),e.verticalScroll?e.rtl?(i.left.width=o.leftContainer.clientWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth+i.scrollbarWidth||-i.border.right):(i.left.width=o.leftContainer.clientWidth+i.scrollbarWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth||-i.border.right):(i.left.width=o.leftContainer.clientWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth||-i.border.right),this._setDOM();var a=this._updateScrollTop();"top"!=e.orientation.item&&(a+=Math.max(i.centerContainer.height-i.center.height-i.border.top-i.border.bottom,0)),o.center.style.top=a+"px";var h=0==i.scrollTop?"hidden":"",d=i.scrollTop==i.scrollTopMin?"hidden":"";o.shadowTop.style.visibility=h,o.shadowBottom.style.visibility=d,o.shadowTopLeft.style.visibility=h,o.shadowBottomLeft.style.visibility=d,o.shadowTopRight.style.visibility=h,o.shadowBottomRight.style.visibility=d,e.verticalScroll&&(o.rightContainer.className="vis-panel vis-right vis-vertical-scroll",o.leftContainer.className="vis-panel vis-left vis-vertical-scroll",o.shadowTopRight.style.visibility="hidden",o.shadowBottomRight.style.visibility="hidden",o.shadowTopLeft.style.visibility="hidden",o.shadowBottomLeft.style.visibility="hidden",o.left.style.top="0px",o.right.style.top="0px"),(!e.verticalScroll||i.center.height<i.centerContainer.height)&&(o.left.style.top=a+"px",o.right.style.top=a+"px",o.rightContainer.className=o.rightContainer.className.replace(new RegExp("(?:^|\\s)vis-vertical-scroll(?:\\
19284s|$)")," "),o.leftContainer.className=o.leftContainer.className.replace(new RegExp("(?:^|\\s)vis-vertical-scroll(?:\\s|$)")," "),i.left.width=o.leftContainer.clientWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth||-i.border.right,this._setDOM());var u=i.center.height>i.centerContainer.height;this.hammer.get("pan").set({direction:u?l.DIRECTION_ALL:l.DIRECTION_HORIZONTAL}),this.components.forEach(function(e){t=e.redraw()||t});if(t){if(this.redrawCount<5)return void this.body.emitter.emit("_change");console.log("WARNING: infinite loop in redraw?")}else this.redrawCount=0;this.body.emitter.emit("changed")}},n.prototype._setDOM=function(){var t=this.props,e=this.dom;t.leftContainer.width=t.left.width,t.rightContainer.width=t.right.width;var i=t.root.width-t.left.width-t.right.width-t.borderRootWidth;t.center.width=i,t.centerContainer.width=i,t.top.width=i,t.bottom.width=i,e.background.style.height=t.background.height+"px",e.backgroundVertical.style.height=t.background.height+"px",e.backgroundHorizontal.style.height=t.centerContainer.height+"px",e.centerContainer.style.height=t.centerContainer.height+"px",e.leftContainer.style.height=t.leftContainer.height+"px",e.rightContainer.style.height=t.rightContainer.height+"px",e.background.style.width=t.background.width+"px",e.backgroundVertical.style.width=t.centerContainer.width+"px",e.backgroundHorizontal.style.width=t.background.width+"px",e.centerContainer.style.width=t.center.width+"px",e.top.style.width=t.top.width+"px",e.bottom.style.width=t.bottom.width+"px",e.background.style.left="0",e.background.style.top="0",e.backgroundVertical.style.left=t.left.width+t.border.left+"px",e.backgroundVertical.style.top="0",e.backgroundHorizontal.style.left="0",e.backgroundHorizontal.style.top=t.top.height+"px",e.centerContainer.style.left=t.left.width+"px",e.centerContainer.style.top=t.top.height+"px",e.leftContainer.style.left="0",e.leftContainer.style.top=t.top.height+"px",e.rightContainer.style.left=t.left.width+t.center.width+"px",e.rightContainer.style.top=t.top.height+"px",e.top.style.left=t.left.width+"px",e.top.style.top="0",e.bottom.style.left=t.left.width+"px",e.bottom.style.top=t.top.height+t.centerContainer.height+"px",e.center.style.left="0",e.left.style.left="0",e.right.style.left="0"},n.prototype.repaint=function(){throw new Error("Function repaint is deprecated. Use redraw instead.")},n.prototype.setCurrentTime=function(t){if(!this.currentTime)throw new Error("Option showCurrentTime must be true");this.currentTime.setCurrentTime(t)},n.prototype.getCurrentTime=function(){if(!this.currentTime)throw new Error("Option showCurrentTime must be true");return this.currentTime.getCurrentTime()},n.prototype._toTime=function(t){return m.toTime(this,t,this.props.center.width)},n.prototype._toGlobalTime=function(t){return m.toTime(this,t,this.props.root.width)},n.prototype._toScreen=function(t){return m.toScreen(this,t,this.props.center.width)},n.prototype._toGlobalScreen=function(t){return m.toScreen(this,t,this.props.root.width)},n.prototype._initAutoResize=function(){1==this.options.autoResize?this._startAutoResize():this._stopAutoResize()},n.prototype._startAutoResize=function(){var t=this;this._stopAutoResize(),this._onResize=function(){if(1!=t.options.autoResize)return void t._stopAutoResize();t.dom.root&&(t.dom.root.offsetWidth==t.props.lastWidth&&t.dom.root.offsetHeight==t.props.lastHeight||(t.props.lastWidth=t.dom.root.offsetWidth,t.props.lastHeight=t.dom.root.offsetHeight,t.props.scrollbarWidth=c.getScrollBarWidth(),t.body.emitter.emit("_change")))},c.addEventListener(window,"resize",this._onResize),t.dom.root&&(t.props.lastWidth=t.dom.root.offsetWidth,t.props.lastHeight=t.dom.root.offsetHeight),this.watchTimer=setInterval(this._onResize,1e3)},n.prototype._stopAutoResize=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0),this._onResize&&(c.removeEventListener(window,"resize",this._onResize),this._onResize=null)},n.prototype._onTouch=function(t){this.touch.allowDragging=!0,this.touch.initialScrollTop=this.props.scrollTop},n.prototype._onPinch=function(t){this.touch.allowDragging=!1},n.prototype._onDrag=function(t){if(t&&this.touch.allowDragging){var e=t.deltaY,i=this._getScrollTop(),o=this._setScrollTop(this.touch.initialScrollTop+e);this.options.verticalScroll&&(this.dom.left.parentNode.scrollTop=-this.props.scrollTop,this.dom.right.parentNode.scrollTop=-this.props.scrollTop),o!=i&&this.emit
19284("verticalDrag")}},n.prototype._setScrollTop=function(t){return this.props.scrollTop=t,this._updateScrollTop(),this.props.scrollTop},n.prototype._updateScrollTop=function(){var t=Math.min(this.props.centerContainer.height-this.props.center.height,0);return t!=this.props.scrollTopMin&&("top"!=this.options.orientation.item&&(this.props.scrollTop+=t-this.props.scrollTopMin),this.props.scrollTopMin=t),this.props.scrollTop>0&&(this.props.scrollTop=0),this.props.scrollTop<t&&(this.props.scrollTop=t),this.options.verticalScroll&&(this.dom.left.parentNode.scrollTop=-this.props.scrollTop,this.dom.right.parentNode.scrollTop=-this.props.scrollTop),this.props.scrollTop},n.prototype._getScrollTop=function(){return this.props.scrollTop},n.prototype._createConfigurator=function(){throw new Error("Cannot invoke abstract method _createConfigurator")},t.exports=n},function(t,e,i){function o(t,e,i,s,r){this.moment=n,this.current=this.moment(),this._start=this.moment(),this._end=this.moment(),this.autoScale=!0,this.scale="day",this.step=1,this.setRange(t,e,i),this.switchedDay=!1,this.switchedMonth=!1,this.switchedYear=!1,Array.isArray(s)?this.hiddenDates=s:this.hiddenDates=void 0!=s?[s]:[],this.format=o.FORMAT,this.options=r||{}}var n=i(9),s=i(36),r=i(2);o.FORMAT={minorLabels:{millisecond:"SSS",second:"s",minute:"HH:mm",hour:"HH:mm",weekday:"ddd D",day:"D",week:"w",month:"MMM",year:"YYYY"},majorLabels:{millisecond:"HH:mm:ss",second:"D MMMM HH:mm",minute:"ddd D MMMM",hour:"ddd D MMMM",weekday:"MMMM YYYY",day:"MMMM YYYY",week:"MMMM YYYY",month:"YYYY",year:""}},o.prototype.setMoment=function(t){this.moment=t,this.current=this.moment(this.current.valueOf()),this._start=this.moment(this._start.valueOf()),this._end=this.moment(this._end.valueOf())},o.prototype.setFormat=function(t){var e=r.deepExtend({},o.FORMAT);this.format=r.deepExtend(e,t)},o.prototype.setRange=function(t,e,i){if(!(t instanceof Date&&e instanceof Date))throw"No legal start or end date in method setRange";this._start=void 0!=t?this.moment(t.valueOf()):new Date,this._end=void 0!=e?this.moment(e.valueOf()):new Date,this.autoScale&&this.setMinimumStep(i)},o.prototype.start=function(){this.current=this._start.clone(),this.roundToMinor()},o.prototype.roundToMinor=function(){switch("week"==this.scale&&this.current.weekday(0),this.scale){case"year":this.current.year(this.step*Math.floor(this.current.year()/this.step)),this.current.month(0);case"month":this.current.date(1);case"week":case"day":case"weekday":this.current.hours(0);case"hour":this.current.minutes(0);case"minute":this.current.seconds(0);case"second":this.current.milliseconds(0)}if(1!=this.step)switch(this.scale){case"millisecond":this.current.subtract(this.current.milliseconds()%this.step,"milliseconds");break;case"second":this.current.subtract(this.current.seconds()%this.step,"seconds");break;case"minute":this.current.subtract(this.current.minutes()%this.step,"minutes");break;case"hour":this.current.subtract(this.current.hours()%this.step,"hours");break;case"weekday":case"day":this.current.subtract((this.current.date()-1)%this.step,"day");break;case"week":this.current.subtract(this.current.week()%this.step,"week");break;case"month":this.current.subtract(this.current.month()%this.step,"month");break;case"year":this.current.subtract(this.current.year()%this.step,"year")}},o.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},o.prototype.next=function(){var t=this.current.valueOf();switch(this.scale){case"millisecond":this.current.add(this.step,"millisecond");break;case"second":this.current.add(this.step,"second");break;case"minute":this.current.add(this.step,"minute");break;case"hour":this.current.add(this.step,"hour"),this.current.month()<6?this.current.subtract(this.current.hours()%this.step,"hour"):this.current.hours()%this.step!=0&&this.current.add(this.step-this.current.hours()%this.step,"hour");break;case"weekday":case"day":this.current.add(this.step,"day");break;case"week":if(0!==this.current.weekday())this.current.weekday(0),this.current.add(this.step,"week");else if(!1===this.options.showMajorLabels)this.current.add(this.step,"week");else{var e=this.current.clone();e.add(1,"week"),e.isSame(this.current,"month")?this.current.add(this.step,"week"):(this.current.add(this.step,"week"),this.current.date(1))}break;case"month":this.current.add(this.step,"month");break;case"year":this.current.add(this.step,"year")}if(1!=this.step)switch(this.scale){case"millisecond":this.current.milliseconds()>0&&this.current.milliseconds()<this.step&&this.current.milliseconds(0);break;case"second":this.current.seconds()>0&&this.current.seconds()<this.step&&this.current.seconds(0);break;case"minute":this.current.minutes()>0&&this.current.minutes()<this.step&&this.current.minutes(0);break;case"hour":this.current.hours()>0&&this.current.hours()<this.step&&this.current.hours(0);break;case"weekday":case"day":this.current.date()<this.step+1&&this.current.date(1);break;case"week":this.current.week()<this.step&&this.current.week(1);break;case"month":this.current.month()<this.step&&this.current.month(0)}this.current.valueOf()==t&&(this.current=this._end.clone()),this.switchedDay=!1,this.switchedMonth=!1,this.switchedYear=!1,s.stepOverHiddenDates(this.moment,this,t)},o.prototype.getCurrent=function(){return this.current},o.prototype.setScale=function(t){t&&"string"==typeof t.scale&&(this.scale=t.scale,this.step=t.step>0?t.step:1,this.autoScale=!1)},o.prototype.setAutoScale=function(t){this.autoScale=t},o.prototype.setMinimumStep=function(t){if(void 0!=t){31104e9>t&&(this.scale="year",this.step=1e3),15552e9>t&&(this.scale="year",this.step=500),31104e8>t&&(this.scale="year",this.step=100),15552e8>t&&(this.scale="year",this.step=50),31104e7>t&&(this.scale="year",this.step=10),15552e7>t&&(this.scale="year",this.step=5),31104e6>t&&(this.scale="year",this.step=1),7776e6>t&&(this.scale="month",this.step=3),2592e6>t&&(this.scale="month",this.step=1),432e6>t&&(this.scale="day",this.step=5),1728e5>t&&(this.scale="day",this.step=2),864e5>t&&(this.scale="day",this.step=1),432e5>t&&(this.scale="weekday",this.step=1),144e5>t&&(this.scale="hour",this.step=4),36e5>t&&(this.scale="hour",this.step=1),9e5>t&&(this.scale="minute",this.step=15),6e5>t&&(this.scale="minute",this.step=10),3e5>t&&(this.scale="minute",this.step=5),6e4>t&&(this.scale="minute",this.step=1),15e3>t&&(this.scale="second",this.step=15),1e4>t&&(this.scale="second",this.step=10),5e3>t&&(this.scale="second",this.step=5),1e3>t&&(this.scale="second",this.step=1),200>t&&(this.scale="millisecond",this.step=200),100>t&&(this.scale="millisecond",this.step=100),50>t&&(this.scale="millisecond",this.step=50),10>t&&(this.scale="millisecond",this.step=10),5>t&&(this.scale="millisecond",this.step=5),1>t&&(this.scale="millisecond",this.step=1)}}
19284,o.snap=function(t,e,i){var o=n(t);if("year"==e){var s=o.year()+Math.round(o.month()/12);o.year(Math.round(s/i)*i),o.month(0),o.date(0),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("month"==e)o.date()>15?(o.date(1),o.add(1,"month")):o.date(1),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0);else if("week"==e)o.weekday()>2?(o.weekday(0),o.add(1,"week")):o.weekday(0),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0);else if("day"==e){switch(i){case 5:case 2:o.hours(24*Math.round(o.hours()/24));break;default:o.hours(12*Math.round(o.hours()/12))}o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("weekday"==e){switch(i){case 5:case 2:o.hours(12*Math.round(o.hours()/12));break;default:o.hours(6*Math.round(o.hours()/6))}o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("hour"==e){switch(i){case 4:o.minutes(60*Math.round(o.minutes()/60));break;default:o.minutes(30*Math.round(o.minutes()/30))}o.seconds(0),o.milliseconds(0)}else if("minute"==e){switch(i){case 15:case 10:o.minutes(5*Math.round(o.minutes()/5)),o.seconds(0);break;case 5:o.seconds(60*Math.round(o.seconds()/60));break;default:o.seconds(30*Math.round(o.seconds()/30))}o.milliseconds(0)}else if("second"==e)switch(i){case 15:case 10:o.seconds(5*Math.round(o.seconds()/5)),o.milliseconds(0);break;case 5:o.milliseconds(1e3*Math.round(o.milliseconds()/1e3));break;default:o.milliseconds(500*Math.round(o.milliseconds()/500))}else if("millisecond"==e){var r=i>5?i/2:1;o.milliseconds(Math.round(o.milliseconds()/r)*r)}return o},o.prototype.isMajor=function(){if(1==this.switchedYear)switch(this.scale){case"year":case"month":case"week":case"weekday":case"day":case"hour":case"minute":case"second":case"millisecond":return!0;default:return!1}else if(1==this.switchedMonth)switch(this.scale){case"week":case"weekday":case"day":case"hour":case"minute":case"second":case"millisecond":return!0;default:return!1}else if(1==this.switchedDay)switch(this.scale){case"millisecond":case"second":case"minute":case"hour":return!0;default:return!1}var t=this.moment(this.current);switch(this.scale){case"millisecond":return 0==t.milliseconds();case"second":return 0==t.seconds();case"minute":return 0==t.hours()&&0==t.minutes();case"hour":return 0==t.hours();case"weekday":case"day":case"week":return 1==t.date();case"month":return 0==t.month();case"year":default:return!1}},o.prototype.getLabelMinor=function(t){if(void 0==t&&(t=this.current),t instanceof Date&&(t=this.moment(t)),"function"==typeof this.format.minorLabels)return this.format.minorLabels(t,this.scale,this.step);var e=this.format.minorLabels[this.scale];switch(this.scale){case"week":if(this.isMajor()&&0!==t.weekday())return"";default:return e&&e.length>0?this.moment(t).format(e):""}},o.prototype.getLabelMajor=function(t){if(void 0==t&&(t=this.current),t instanceof Date&&(t=this.moment(t)),"function"==typeof this.format.majorLabels)return this.format.majorLabels(t,this.scale,this.step);var e=this.format.majorLabels[this.scale];return e&&e.length>0?this.moment(t).format(e):""},o.prototype.getClassName=function(){function t(t){return t/a%2==0?" vis-even":" vis-odd"}function e(t){return t.isSame(new Date,"day")?" vis-today":t.isSame(n().add(1,"day"),"day")?" vis-tomorrow":t.isSame(n().add(-1,"day"),"day")?" vis-yesterday":""}function i(t){return t.isSame(new Date,"week")?" vis-current-week":""}function o(t){return t.isSame(new Date,"month")?" vis-current-month":""}var n=this.moment,s=this.moment(this.current),r=s.locale?s.locale("en"):s.lang("en"),a=this.step,h=[];switch(this.scale){case"millisecond":h.push(e(r)),h.push(t(r.milliseconds()));break;case"second":h.push(e(r)),h.push(t(r.seconds()));break;case"minute":h.push(e(r)),h.push(t(r.minutes()));break;case"hour":h.push("vis-h"+r.hours()+(4==this.step?"-h"+(r.hours()+4):"")),h.push(e(r)),h.push(t(r.hours()));break;case"weekday":h.push("vis-"+r.format("dddd").toLowerCase()),h.push(e(r)),h.push(i(r)),h.push(t(r.date()));break;case"day":h.push("vis-day"+r.date()),h.push("vis-"+r.format("MMMM").toLowerCase()),h.push(e(r)),h.push(o(r)),h.push(this.step<=2?e(r):""),h.push(this.step<=2?"vis-"
19284+r.format("dddd").toLowerCase():""),
19285    h.push(t(r.date()-1));break;case"week":h.push("vis-week"+r.format("w")),h.push(i(r)),h.push(t(r.week()));break;case"month":h.push("vis-"+r.format("MMMM").toLowerCase()),h.push(o(r)),h.push(t(r.month()));break;case"year":h.push("vis-year"+r.year()),h.push(function(t){return t.isSame(new Date,"year")?" vis-current-year":""}(r)),h.push(t(r.year()))}return h.filter(String).join(" ")},t.exports=o},function(t,e,i){function o(t,e){this.body=t,this.defaultOptions={rtl:!1,showCurrentTime:!0,moment:r,locales:a,locale:"en"},this.options=n.extend({},this.defaultOptions),this.offset=0,this._create(),this.setOptions(e)}var n=i(2),s=i(16),r=i(9),a=i(98);o.prototype=new s,o.prototype._create=function(){var t=document.createElement("div");t.className="vis-current-time",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},o.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},o.prototype.setOptions=function(t){t&&n.selectiveExtend(["rtl","showCurrentTime","moment","locale","locales"],this.options,t)},o.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=this.options.moment((new Date).valueOf()+this.offset),i=this.body.util.toScreen(e),o=this.options.locales[this.options.locale];o||(this.warned||(console.log("WARNING: options.locales['"+this.options.locale+"'] not found. See http://visjs.org/docs/timeline/#Localization"),this.warned=!0),o=this.options.locales.en);var n=o.current+" "+o.time+": "+e.format("dddd, MMMM Do YYYY, H:mm:ss");n=n.charAt(0).toUpperCase()+n.substring(1),this.options.rtl?this.bar.style.right=i+"px":this.bar.style.left=i+"px",this.bar.title=n}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},o.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,o=1/i/10;o<30&&(o=30),o>1e3&&(o=1e3),e.redraw(),e.body.emitter.emit("currentTimeTick"),e.currentTimeTimer=setTimeout(t,o)}var e=this;t()},o.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},o.prototype.setCurrentTime=function(t){var e=n.convert(t,"Date").valueOf(),i=(new Date).valueOf();this.offset=e-i,this.redraw()},o.prototype.getCurrentTime=function(){return new Date((new Date).valueOf()+this.offset)},t.exports=o},function(t,e,i){function o(t,e,i){if(this.groupId=t,this.subgroups={},this.subgroupStack={},this.subgroupStackAll=!1,this.doInnerStack=!1,this.subgroupIndex=0,this.subgroupOrderer=e&&e.subgroupOrder,this.itemSet=i,this.isVisible=null,this.stackDirty=!0,e&&e.nestedGroups&&(this.nestedGroups=e.nestedGroups,0==e.showNested?this.showNested=!1:this.showNested=!0),e&&e.subgroupStack)if("boolean"==typeof e.subgroupStack)this.doInnerStack=e.subgroupStack,this.subgroupStackAll=e.subgroupStack;else for(var o in e.subgroupStack)this.subgroupStack[o]=e.subgroupStack[o],this.doInnerStack=this.doInnerStack||e.subgroupStack[o];this.nestedInGroup=null,this.dom={},this.props={label:{width:0,height:0}},this.className=null,this.items={},this.visibleItems=[],this.itemsInRange=[],this.orderedItems={byStart:[],byEnd:[]},this.checkRangedItems=!1;var n=this;this.itemSet.body.emitter.on("checkRangedItems",function(){n.checkRangedItems=!0}),this._create(),this.setData(e)}var n=i(8),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(100);o.prototype._create=function(){var t=document.createElement("div");this.itemSet.options.groupEditable.order?t.className="vis-label draggable":t.className="vis-label",this.dom.label=t;var e=document.createElement("div");e.className="vis-inner",t.appendChild(e),this.dom.inner=e;var i=document.createElement("div");i.className="vis-group",i["timeline-group"]=this,this.dom.foreground=i,this.dom.background=document.createElement("div"),this.dom.background.className="vis-group",this.dom.axis=document.createElement("div"),this.dom.axis.className="vis-group",this.dom.marker=document.createElement("div"),this.dom.marker.style.visibility="hidden",this.dom.marker.style.position="absolute",this.dom.marker.innerHTML="",this.dom.background.appendChild(this.dom.marker)},o.prototype.setData=function(t){var e,i;if(this.itemSet.options&&this.itemSet.options.groupTemplate?(i=this.itemSet.options.groupTemplate.bind(this),e=i(t,this.dom.inner)):e=t&&t.content,e instanceof Element){for(this.dom.inner.appendChild(e);this.dom.inner.firstChild;)this.dom.inner.removeChild(this.dom.inner.firstChild);this.dom.inner.appendChild(e)}else e instanceof Object?i(t,this.dom.inner):this.dom.inner.innerHTML=void 0!==e&&null!==e?e:this.groupId||"";if(this.dom.label.title=t&&t.title||"",this.dom.inner.firstChild?r.removeClassName(this.dom.inner,"vis-hidden"):r.addClassName(this.dom.inner,"vis-hidden"),t&&t.nestedGroups){this.nestedGroups&&this.nestedGroups==t.nestedGroups||(this.nestedGroups=t.nestedGroups),void 0===t.showNested&&void 0!==this.showNested||(0==t.showNested?this.showNested=!1:this.showNested=!0),r.addClassName(this.dom.label,"vis-nesting-group");var o=this.itemSet.options.rtl?"collapsed-rtl":"collapsed";this.showNested?(r.removeClassName(this.dom.label,o),r.addClassName(this.dom.label,"expanded")):(r.removeClassName(this.dom.label,"expanded"),r.addClassName(this.dom.label,o))}else this.nestedGroups&&(this.nestedGroups=null,o=this.itemSet.options.rtl?"collapsed-rtl":"collapsed",r.removeClassName(this.dom.label,o),r.removeClassName(this.dom.label,"expanded"),r.removeClassName(this.dom.label,"vis-nesting-group"));t&&t.nestedInGroup&&(r.addClassName(this.dom.label,"vis-nested-group"),this.itemSet.options&&this.itemSet.options.rtl?this.dom.inner.style.paddingRight="30px":this.dom.inner.style.paddingLeft="30px");var n=t&&t.className||null;n!=this.className&&(this.className&&(r.removeClassName(this.dom.label,this.className),r.removeClassName(this.dom.foreground,this.className),r.removeClassName(this.dom.background,this.className),r.removeClassName(this.dom.axis,this.className)),r.addClassName(this.dom.label,n),r.addClassName(this.dom.foreground,n),r.addClassName(this.dom.background,n),r.addClassName(this.dom.axis,n),this.className=n),this.style&&(r.removeCssText(this.dom.label,this.style),this.style=null),t&&t.style&&(r.addCssText(this.dom.label,t.style),this.style=t.style)},o.prototype.getLabelWidth=function(){return this.props.label.width}
19285,o.prototype._didMarkerHeightChange=function(){var t=this.dom.marker.clientHeight;if(t!=this.lastMarkerHeight){this.lastMarkerHeight=t;var e={},i=0;r.forEach(this.items,function(t,o){if(t.dirty=!0,t.displayed){e[o]=t.redraw(!0),i=e[o].length}});if(i>0)for(var o=0;o<i;o++)r.forEach(e,function(t){t[o]()});return!0}},o.prototype._calculateGroupSizeAndPosition=function(){var t=this.dom.foreground.offsetTop,e=this.dom.foreground.offsetLeft,i=this.dom.foreground.offsetWidth;this.top=t,this.right=e,this.width=i},o.prototype._redrawItems=function(t,e,i,o){if(t||this.stackDirty||this.isVisible&&!e){var n={},s=null;if("function"==typeof this.itemSet.options.order){var h=this,d={},l=0;if(r.forEach(this.items,function(t,e){t.displayed||(d[e]=t.redraw(!0),l=d[e].length,h.visibleItems.push(t))}),l>0)for(var u=0;u<l;u++)r.forEach(d,function(t){t[u]()});if(r.forEach(this.items,function(t){t.repositionX(!1)}),this.doInnerStack&&this.itemSet.options.stackSubgroups){for(s in this.subgroups)n[s]=this.subgroups[s].items.slice().sort(function(t,e){return h.itemSet.options.order(t.data,e.data)});a.stackSubgroupsWithInnerStack(n,i,this.subgroups)}else{var c=this.orderedItems.byStart.slice().sort(function(t,e){return h.itemSet.options.order(t.data,e.data)});a.stack(c,i,!0)}this.visibleItems=this._updateItemsInRange(this.orderedItems,this.visibleItems,o)}else if(this.visibleItems=this._updateItemsInRange(this.orderedItems,this.visibleItems,o),this.itemSet.options.stack)if(this.doInnerStack&&this.itemSet.options.stackSubgroups){for(s in this.subgroups)n[s]=this.subgroups[s].items;a.stackSubgroupsWithInnerStack(n,i,this.subgroups)}else a.stack(this.visibleItems,i,!0);else a.nostack(this.visibleItems,i,this.subgroups,this.itemSet.options.stackSubgroups);this.stackDirty=!1}},o.prototype._didResize=function(t,e){t=r.updateProperty(this,"height",e)||t;var i=this.dom.inner.clientWidth,o=this.dom.inner.clientHeight;return t=r.updateProperty(this.props.label,"width",i)||t,t=r.updateProperty(this.props.label,"height",o)||t},o.prototype._applyGroupHeight=function(t){this.dom.background.style.height=t+"px",this.dom.foreground.style.height=t+"px",this.dom.label.style.height=t+"px"},o.prototype._updateItemsVerticalPosition=function(t){for(var e=0,i=this.visibleItems.length;e<i;e++){var o=this.visibleItems[e];o.repositionY(t),this.isVisible||"__background__"==this.groupId||o.displayed&&o.hide()}},o.prototype.redraw=function(t,e,i,o){var n,s=!1,r=this.isVisible,a=[function(){i=this._didMarkerHeightChange.bind(this)}.bind(this),this._updateSubGroupHeights.bind(this,e),this._calculateGroupSizeAndPosition.bind(this),function(){this.isVisible=this._isGroupVisible.bind(this)(t,e)}.bind(this),function(){this._redrawItems.bind(this)(i,r,e,t)}.bind(this),this._updateSubgroupsSizes.bind(this),function(){n=this._calculateHeight.bind(this)(e)}.bind(this),this._calculateGroupSizeAndPosition.bind(this),function(){s=this._didResize.bind(this)(s,n)}.bind(this),function(){this._applyGroupHeight.bind(this)(n)}.bind(this),function(){this._updateItemsVerticalPosition.bind(this)(e)}.bind(this),function(){return!this.isVisible&&this.height&&(s=!1),s}];if(o)return a;var h;return a.forEach(function(t){h=t()}),h},o.prototype._updateSubGroupHeights=function(t){if((0,s.default)(this.subgroups).length>0){var e=this;this.resetSubgroups(),r.forEach(this.visibleItems,function(i){void 0!==i.data.subgroup&&(e.subgroups[i.data.subgroup].height=Math.max(e.subgroups[i.data.subgroup].height,i.height+t.item.vertical),e.subgroups[i.data.subgroup].visible=!0)})}},o.prototype._isGroupVisible=function(t,e){return this.top<=t.body.domProps.centerContainer.height-t.body.domProps.scrollTop+e.axis&&this.top+this.height+e.axis>=-t.body.domProps.scrollTop},o.prototype._calculateHeight=function(t){var e,i=this.visibleItems;if(i.length>0){var o=i[0].top,n=i[0].top+i[0].height;if(r.forEach(i,function(t){o=Math.min(o,t.top),n=Math.max(n,t.top+t.height)}),o>t.axis){var s=o-t.axis;n-=s,r.forEach(i,function(t){t.top-=s})}e=n+t.item.vertical/2}else e=0;return e=Math.max(e,this.props.label.height)},o.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},o.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var o=this.dom.axis;o.parentNode&&o.parentNode.removeChild(o)},o.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),this.stackDirty=!0,void 0!==t.data.subgroup&&(this._addToSubgroup(t),this.orderSubgroups()),-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},o.prototype._addToSubgroup=function(t,e){e=e||t.data.subgroup,void 0!=e&&void 0===this.subgroups[e]&&(this.subgroups[e]={height:0,top:0,start:t.data.start,end:t.data.end||t.data.start,visible:!1,index:this.subgroupIndex,items:[],stack:this.subgroupStackAll||this.subgroupStack[e]||!1},this.subgroupIndex++),new Date(t.data.start)<new Date(this.subgroups[e].start)&&(this.subgroups[e].start=t.data.start);var i=t.data.end||t.data.start;new Date(i)>new Date(this.subgroups[e].end)&&(this.subgroups[e].end=i),this.subgroups[e].items.push(t)},o.prototype._updateSubgroupsSizes=function(){var t=this;if(t.subgroups)for(var e in t.subgroups){var i=t.subgroups[e].items[0].data.end||t.subgroups[e].items[0].data.start,o=t.subgroups[e].items[0].data.start,n=i-1;
19285t.subgroups[e].items.forEach(function(t){new Date(t.data.start)<new Date(o)&&(o=t.data.start);var e=t.data.end||t.data.start;new Date(e)>new Date(n)&&(n=e)}),t.subgroups[e].start=o,t.subgroups[e].end=new Date(n-1)}},o.prototype.orderSubgroups=function(){if(void 0!==this.subgroupOrderer){var t,e=[];if("string"==typeof this.subgroupOrderer){for(t in this.subgroups)e.push({subgroup:t,sortField:this.subgroups[t].items[0].data[this.subgroupOrderer]});e.sort(function(t,e){return t.sortField-e.sortField})}else if("function"==typeof this.subgroupOrderer){for(t in this.subgroups)e.push(this.subgroups[t].items[0].data);e.sort(this.subgroupOrderer)}if(e.length>0)for(var i=0;i<e.length;i++)this.subgroups[e[i].subgroup].index=i}},o.prototype.resetSubgroups=function(){for(var t in this.subgroups)this.subgroups.hasOwnProperty(t)&&(this.subgroups[t].visible=!1,this.subgroups[t].height=0)},o.prototype.remove=function(t){delete this.items[t.id],t.setParent(null),this.stackDirty=!0;var e=this.visibleItems.indexOf(t);-1!=e&&this.visibleItems.splice(e,1),void 0!==t.data.subgroup&&(this._removeFromSubgroup(t),this.orderSubgroups())},o.prototype._removeFromSubgroup=function(t,e){if(void 0!=(e=e||t.data.subgroup)){var i=this.subgroups[e];if(i){var o=i.items.indexOf(t);o>=0&&(i.items.splice(o,1),i.items.length?this._updateSubgroupsSizes():delete this.subgroups[e])}}},o.prototype.removeFromDataSet=function(t){this.itemSet.removeItem(t.id)},o.prototype.order=function(){for(var t=r.toArray(this.items),e=[],i=[],o=0;o<t.length;o++)void 0!==t[o].data.end&&i.push(t[o]),e.push(t[o]);this.orderedItems={byStart:e,byEnd:i},a.orderByStart(this.orderedItems.byStart),a.orderByEnd(this.orderedItems.byEnd)},o.prototype._updateItemsInRange=function(t,e,i){var o=[],n={},s=(i.end-i.start)/4,a=i.start-s,h=i.end+s,d=function(t){return t<a?-1:t<=h?0:1};if(e.length>0)for(var l=0;l<e.length;l++)this._checkIfVisibleWithReference(e[l],o,n,i);var u=r.binarySearchCustom(t.byStart,d,"data","start");if(this._traceVisible(u,t.byStart,o,n,function(t){return t.data.start<a||t.data.start>h}),1==this.checkRangedItems)for(this.checkRangedItems=!1,l=0;l<t.byEnd.length;l++)this._checkIfVisibleWithReference(t.byEnd[l],o,n,i);else{var c=r.binarySearchCustom(t.byEnd,d,"data","end");this._traceVisible(c,t.byEnd,o,n,function(t){return t.data.end<a||t.data.end>h})}var p={},f=0;for(l=0;l<o.length;l++){var m=o[l];if(!m.displayed){p[l]=m.redraw(!0),f=p[l].length}}if(f>0)for(var v=0;v<f;v++)r.forEach(p,function(t){t[v]()});for(l=0;l<o.length;l++)o[l].repositionX();return o},o.prototype._traceVisible=function(t,e,i,o,n){if(-1!=t){var s,r;for(s=t;s>=0&&(r=e[s],!n(r));s--)void 0===o[r.id]&&(o[r.id]=!0,i.push(r));for(s=t+1;s<e.length&&(r=e[s],!n(r));s++)void 0===o[r.id]&&(o[r.id]=!0,i.push(r))}},o.prototype._checkIfVisible=function(t,e,i){t.isVisible(i)?(t.displayed||t.show(),t.repositionX(),e.push(t)):t.displayed&&t.hide()},o.prototype._checkIfVisibleWithReference=function(t,e,i,o){t.isVisible(o)?void 0===i[t.id]&&(i[t.id]=!0,e.push(t)):t.displayed&&t.hide()},o.prototype.changeSubgroup=function(t,e,i){this._removeFromSubgroup(t,e),this._addToSubgroup(t,i),this.orderSubgroups()},t.exports=o},function(t,e,i){function o(t,e,i){r.call(this,t,e,i),this.width=0,this.height=0,this.top=0,this.left=0}var n=i(29),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(68);o.prototype=(0,s.default)(r.prototype),o.prototype.redraw=function(t,e,i){this.visibleItems=this._updateItemsInRange(this.orderedItems,this.visibleItems,t),this.width=this.dom.background.offsetWidth,this.dom.background.style.height="0";for(var o=0,n=this.visibleItems.length;o<n;o++){this.visibleItems[o].repositionY(e)}return!1},o.prototype.show=function(){this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background)},t.exports=o},function(t,e,i){function o(t,e,i){if(this.props={content:{width:0}},this.overflow=!1,this.options=i,t){if(void 0==t.start)throw new Error('Property "start" missing in item '+t.id);if(void 0==t.end)throw new Error('Property "end" missing in item '+t.id)}n.call(this,t,e,i)}var n=i(38);o.prototype=new n(null,null,null),o.prototype.baseClassName="vis-item vis-range",o.prototype.isVisible=function(t){return this.data.start<t.end&&this.data.end>t.start},o.prototype._createDomElement=function(){this.dom||(this.dom={},this.dom.box=document.createElement("div"),this.dom.frame=document.createElement("div"),this.dom.frame.className="vis-item-overflow",this.dom.box.appendChild(this.dom.frame),this.dom.visibleFrame=document.createElement("div"),this.dom.visibleFrame.className="vis-item-visible-frame",this.dom.box.appendChild(this.dom.visibleFrame),this.dom.content=document.createElement("div"),this.dom.content.className="vis-item-content",this.dom.frame.appendChild(this.dom.content),this.dom.box["timeline-item"]=this,this.dirty=!0)},o.prototype._appendDomElement=function(){if(!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!this.dom.box.parentNode){var t=this.parent.dom.foreground;if(!t)throw new Error("Cannot redraw item: parent has no foreground container element");t.appendChild(this.dom.box)}this.displayed=!0},o.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content),this._updateDataAttributes(this.dom.box),this._updateStyle(this.dom.box);var t=this.editable.updateTime||this.editable.updateGroup,e=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"")+(t?" vis-editable":" vis-readonly");this.dom.box.className=this.baseClassName+e,this.dom.content.style.maxWidth="none"}},o.prototype._getDomComponentsSizes=function(){return this.overflow="hidden"!==window.getComputedStyle(this.dom.frame).overflow,{content:{width:this.dom.content.offsetWidth},box:{height:this.dom.box.offsetHeight}}},o.prototype._updateDomComponentsSizes=function(t){this.props.content.width=t.content.width,this.height=t.box.height,this.dom.content.style.maxWidth="",this.dirty=!1},o.prototype._repaintDomAdditionals=function(){this._repaintOnItemUpdateTimeTooltip(this.dom.box),this._repaintDeleteButton(this.dom.box),this._repaintDragCenter(),this._repaintDragLeft(),this._repaintDragRight()},o.prototype.redraw=function(t){var e,i=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){this.dirty&&(e=this._getDomComponentsSizes.bind(this)())}.bind(this),function(){this.dirty&&this._updateDomComponentsSizes.bind(this)(e)}.bind(this),this._repaintDomAdditionals.bind(this)];if(t)return i;var o;
19285return i.forEach(function(t){o=t()}),o},o.prototype.show=function(){this.displayed||this.redraw()},o.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.displayed=!1}},o.prototype.repositionX=function(t){var e,i,o=this.parent.width,n=this.conversion.toScreen(this.data.start),s=this.conversion.toScreen(this.data.end),r=void 0===this.data.align?this.options.align:this.data.align;!1===this.data.limitSize||void 0!==t&&!0!==t||(n<-o&&(n=-o),s>2*o&&(s=2*o));var a=Math.max(s-n+.5,1);switch(this.overflow?(this.options.rtl?this.right=n:this.left=n,this.width=a+this.props.content.width,i=this.props.content.width):(this.options.rtl?this.right=n:this.left=n,this.width=a,i=Math.min(s-n,this.props.content.width)),this.options.rtl?this.dom.box.style.right=this.right+"px":this.dom.box.style.left=this.left+"px",this.dom.box.style.width=a+"px",r){case"left":this.options.rtl?this.dom.content.style.right="0":this.dom.content.style.left="0";break;case"right":this.options.rtl?this.dom.content.style.right=Math.max(a-i,0)+"px":this.dom.content.style.left=Math.max(a-i,0)+"px";break;case"center":this.options.rtl?this.dom.content.style.right=Math.max((a-i)/2,0)+"px":this.dom.content.style.left=Math.max((a-i)/2,0)+"px";break;default:e=this.overflow?s>0?Math.max(-n,0):-i:n<0?-n:0,this.options.rtl?this.dom.content.style.right=e+"px":(this.dom.content.style.left=e+"px",this.dom.content.style.width="calc(100% - "+e+"px)")}},o.prototype.repositionY=function(){var t=this.options.orientation.item,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},o.prototype._repaintDragLeft=function(){if((this.selected||this.options.itemsAlwaysDraggable.range)&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="vis-drag-left",t.dragLeftItem=this,this.dom.box.appendChild(t),this.dom.dragLeft=t}else this.selected||this.options.itemsAlwaysDraggable.range||!this.dom.dragLeft||(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},o.prototype._repaintDragRight=function(){if((this.selected||this.options.itemsAlwaysDraggable.range)&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="vis-drag-right",t.dragRightItem=this,this.dom.box.appendChild(t),this.dom.dragRight=t}else this.selected||this.options.itemsAlwaysDraggable.range||!this.dom.dragRight||(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(6),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(2),p=i(179).default,f=function(){function t(e,i,o){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;(0,d.default)(this,t),this.parent=e,this.changedOptions=[],this.container=i,this.allowCreation=!1,this.options={},this.initialized=!1,this.popupCounter=0,this.defaultOptions={enabled:!1,filter:!0,container:void 0,showButton:!0},c.extend(this.options,this.defaultOptions),this.configureOptions=o,this.moduleOptions={},this.domElements=[],this.popupDiv={},this.popupLimit=5,this.popupHistory={},this.colorPicker=new p(n),this.wrapper=void 0}return(0,u.default)(t,[{key:"setOptions",value:function(t){if(void 0!==t){this.popupHistory={},this._removePopup();var e=!0;"string"==typeof t?this.options.filter=t:t instanceof Array?this.options.filter=t.join():"object"===(void 0===t?"undefined":(0,a.default)(t))?(void 0!==t.container&&(this.options.container=t.container),void 0!==t.filter&&(this.options.filter=t.filter),void 0!==t.showButton&&(this.options.showButton=t.showButton),void 0!==t.enabled&&(e=t.enabled)):"boolean"==typeof t?(this.options.filter=!0,e=t):"function"==typeof t&&(this.options.filter=t,e=!0),!1===this.options.filter&&(e=!1),this.options.enabled=e}this._clean()}},{key:"setModuleOptions",value:function(t){this.moduleOptions=t,!0===this.options.enabled&&(this._clean(),void 0!==this.options.container&&(this.container=this.options.container),this._create())}},{key:"_create",value:function(){var t=this;this._clean(),this.changedOptions=[];var e=this.options.filter,i=0,o=!1;for(var n in this.configureOptions)this.configureOptions.hasOwnProperty(n)&&(this.allowCreation=!1,o=!1,"function"==typeof e?(o=e(n,[]),o=o||this._handleObject(this.configureOptions[n],[n],!0)):!0!==e&&-1===e.indexOf(n)||(o=!0),!1!==o&&(this.allowCreation=!0,i>0&&this._makeItem([]),this._makeHeader(n),this._handleObject(this.configureOptions[n],[n])),i++);if(!0===this.options.showButton){var s=document.createElement("div");s.className="vis-configuration vis-config-button",s.innerHTML="generate options",s.onclick=function(){t._printOptions()},s.onmouseover=function(){s.className="vis-configuration vis-config-button hover"},s.onmouseout=function(){s.className="vis-configuration vis-config-button"},this.optionsContainer=document.createElement("div"),this.optionsContainer.className="vis-configuration vis-config-option-container",this.domElements.push(this.optionsContainer),this.domElements.push(s)}this._push()}},{key:"_push",value:function(){this.wrapper=document.createElement("div"),this.wrapper.className="vis-configuration-wrapper",this.container.appendChild(this.wrapper);for(var t=0;t<this.domElements.length;t++)this.wrapper.appendChild(this.domElements[t]);this._showPopupIfNeeded()}},{key:"_clean",value:function(){for(var t=0;t<this.domElements.length;t++)this.wrapper.removeChild(this.domElements[t]);void 0!==this.wrapper&&(this.container.removeChild(this.wrapper),this.wrapper=void 0),this.domElements=[],this._removePopup()}},{key:"_getValue",value:function(t){for(var e=this.moduleOptions,i=0;i<t.length;i++){if(void 0===e[t[i]]){e=void 0;break}e=e[t[i]]}return e}},{key:"_makeItem",value:function(t){if(!0===this.allowCreation){var e=document.createElement("div");e.className="vis-configuration vis-config-item vis-config-s"+t.length;for(var i=arguments.length,o=Array(i>1?i-1:0),n=1;n<i;n++)o[n-1]=arguments[n];return o.forEach(function(t){e.appendChild(t)}),this.domElements.push(e),this.domElements.length}return 0}},{key:"_makeHeader",value:function(t){var e=document.createElement("div");e.className="vis-configuration vis-config-header",e.innerHTML=t,this._makeItem([],e)}},{key:"_makeLabel",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=document.createElement("div");return o.className="vis-configuration vis-config-label vis-config-s"+e.length,o.innerHTML=!0===i?"<i><b>"+t+":</b></i>":t+":",o}}
19285,{key:"_makeDropdown",value:function(t,e,i){var o=document.createElement("select");o.className="vis-configuration vis-config-select";var n=0;void 0!==e&&-1!==t.indexOf(e)&&(n=t.indexOf(e));for(var s=0;s<t.length;s++){var r=document.createElement("option");r.value=t[s],s===n&&(r.selected="selected"),r.innerHTML=t[s],o.appendChild(r)}var a=this;o.onchange=function(){a._update(this.value,i)};var h=this._makeLabel(i[i.length-1],i);this._makeItem(i,h,o)}},{key:"_makeRange",value:function(t,e,i){var o=t[0],n=t[1],s=t[2],r=t[3],a=document.createElement("input");a.className="vis-configuration vis-config-range";try{a.type="range",a.min=n,a.max=s}catch(t){}a.step=r;var h="",d=0;if(void 0!==e){e<0&&1.2*e<n?(a.min=Math.ceil(1.2*e),d=a.min,h="range increased"):e/1.2<n&&(a.min=Math.ceil(e/1.2),d=a.min,h="range increased"),1.2*e>s&&1!==s&&(a.max=Math.ceil(1.2*e),d=a.max,h="range increased"),a.value=e}else a.value=o;var l=document.createElement("input");l.className="vis-configuration vis-config-rangeinput",l.value=a.value;var u=this;a.onchange=function(){l.value=this.value,u._update(Number(this.value),i)},a.oninput=function(){l.value=this.value};var c=this._makeLabel(i[i.length-1],i),p=this._makeItem(i,c,a,l);""!==h&&this.popupHistory[p]!==d&&(this.popupHistory[p]=d,this._setupPopup(h,p))}},{key:"_setupPopup",value:function(t,e){var i=this;if(!0===this.initialized&&!0===this.allowCreation&&this.popupCounter<this.popupLimit){var o=document.createElement("div");o.id="vis-configuration-popup",o.className="vis-configuration-popup",o.innerHTML=t,o.onclick=function(){i._removePopup()},this.popupCounter+=1,this.popupDiv={html:o,index:e}}}},{key:"_removePopup",value:function(){void 0!==this.popupDiv.html&&(this.popupDiv.html.parentNode.removeChild(this.popupDiv.html),clearTimeout(this.popupDiv.hideTimeout),clearTimeout(this.popupDiv.deleteTimeout),this.popupDiv={})}},{key:"_showPopupIfNeeded",value:function(){var t=this;if(void 0!==this.popupDiv.html){var e=this.domElements[this.popupDiv.index],i=e.getBoundingClientRect();this.popupDiv.html.style.left=i.left+"px",this.popupDiv.html.style.top=i.top-30+"px",document.body.appendChild(this.popupDiv.html),this.popupDiv.hideTimeout=setTimeout(function(){t.popupDiv.html.style.opacity=0},1500),this.popupDiv.deleteTimeout=setTimeout(function(){t._removePopup()},1800)}}},{key:"_makeCheckbox",value:function(t,e,i){var o=document.createElement("input");o.type="checkbox",o.className="vis-configuration vis-config-checkbox",o.checked=t,void 0!==e&&(o.checked=e,e!==t&&("object"===(void 0===t?"undefined":(0,a.default)(t))?e!==t.enabled&&this.changedOptions.push({path:i,value:e}):this.changedOptions.push({path:i,value:e})));var n=this;o.onchange=function(){n._update(this.checked,i)};var s=this._makeLabel(i[i.length-1],i);this._makeItem(i,s,o)}},{key:"_makeTextInput",value:function(t,e,i){var o=document.createElement("input");o.type="text",o.className="vis-configuration vis-config-text",o.value=e,e!==t&&this.changedOptions.push({path:i,value:e});var n=this;o.onchange=function(){n._update(this.value,i)};var s=this._makeLabel(i[i.length-1],i);this._makeItem(i,s,o)}},{key:"_makeColorField",value:function(t,e,i){var o=this,n=t[1],s=document.createElement("div");e=void 0===e?n:e,"none"!==e?(s.className="vis-configuration vis-config-colorBlock",s.style.backgroundColor=e):s.className="vis-configuration vis-config-colorBlock none",e=void 0===e?n:e,s.onclick=function(){o._showColorPicker(e,s,i)};var r=this._makeLabel(i[i.length-1],i);this._makeItem(i,r,s)}},{key:"_showColorPicker",value:function(t,e,i){var o=this;e.onclick=function(){},this.colorPicker.insertTo(e),this.colorPicker.show(),this.colorPicker.setColor(t),this.colorPicker.setUpdateCallback(function(t){var n="rgba("+t.r+","+t.g+","+t.b+","+t.a+")";e.style.backgroundColor=n,o._update(n,i)}),this.colorPicker.setCloseCallback(function(){e.onclick=function(){o._showColorPicker(t,e,i)}})}},{key:"_handleObject",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=!1,n=this.options.filter,s=!1;for(var r in t)if(t.hasOwnProperty(r)){o=!0;var a=t[r],h=c.copyAndExtendArray(e,r);if("function"==typeof n&&!1===(o=n(r,e))&&!(a instanceof Array)&&"string"!=typeof a&&"boolean"!=typeof a&&a instanceof Object&&(this.allowCreation=!1,o=this._handleObject(a,h,!0),this.allowCreation=!1===i),!1!==o){s=!0;var d=this._getValue(h);if(a instanceof Array)this._handleArray(a,d,h);else if("string"==typeof a)this._makeTextInput(a,d,h);else if("boolean"==typeof a)this._makeCheckbox(a,d,h);else if(a instanceof Object){var l=!0;if(-1!==e.indexOf("physics")&&this.moduleOptions.physics.solver!==r&&(l=!1),!0===l)if(void 0!==a.enabled){var u=c.
19285copyAndExtendArray(h,"enabled"),p=this._getValue(u);if(!0===p){var f=this._makeLabel(r,h,!0);this._makeItem(h,f),s=this._handleObject(a,h)||s}else this._makeCheckbox(a,p,h)}else{var m=this._makeLabel(r,h,!0);this._makeItem(h,m),s=this._handleObject(a,h)||s}}else console.error("dont know how to handle",a,r,h)}}return s}},{key:"_handleArray",value:function(t,e,i){"string"==typeof t[0]&&"color"===t[0]?(this._makeColorField(t,e,i),t[1]!==e&&this.changedOptions.push({path:i,value:e})):"string"==typeof t[0]?(this._makeDropdown(t,e,i),t[0]!==e&&this.changedOptions.push({path:i,value:e})):"number"==typeof t[0]&&(this._makeRange(t,e,i),t[0]!==e&&this.changedOptions.push({path:i,value:Number(e)}))}},{key:"_update",value:function(t,e){var i=this._constructOptions(t,e);this.parent.body&&this.parent.body.emitter&&this.parent.body.emitter.emit&&this.parent.body.emitter.emit("configChange",i),this.initialized=!0,this.parent.setOptions(i)}},{key:"_constructOptions",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=i;t="true"===t||t,t="false"!==t&&t;for(var n=0;n<e.length;n++)"global"!==e[n]&&(void 0===o[e[n]]&&(o[e[n]]={}),n!==e.length-1?o=o[e[n]]:o[e[n]]=t);return i}},{key:"_printOptions",value:function(){var t=this.getOptions();this.optionsContainer.innerHTML="<pre>var options = "+(0,s.default)(t,null,2)+"</pre>"}},{key:"getOptions",value:function(){for(var t={},e=0;e<this.changedOptions.length;e++)this._constructOptions(this.changedOptions[e].value,this.changedOptions[e].path,t);return t}}]),t}();e.default=f},function(t,e,i){function o(t,e){}function n(t,e){return e=void 0===e?{}:e,{style:e.style||t.options.drawPoints.style,
19286    styles:e.styles||t.options.drawPoints.styles,size:e.size||t.options.drawPoints.size,className:e.className||t.className}}function s(t,e){var i=void 0;return t.options&&t.options.drawPoints&&t.options.drawPoints.onRender&&"function"==typeof t.options.drawPoints.onRender&&(i=t.options.drawPoints.onRender),e.group.options&&e.group.options.drawPoints&&e.group.options.drawPoints.onRender&&"function"==typeof e.group.options.drawPoints.onRender&&(i=e.group.options.drawPoints.onRender),i}var r=i(6),a=function(t){return t&&t.__esModule?t:{default:t}}(r),h=i(14);o.draw=function(t,e,i,o){o=o||0;for(var r=s(i,e),d=0;d<t.length;d++)if(r){var l=r(t[d],e);!0!==l&&"object"!==(void 0===l?"undefined":(0,a.default)(l))||h.drawPoint(t[d].screen_x+o,t[d].screen_y,n(e,l),i.svgElements,i.svg,t[d].label)}else h.drawPoint(t[d].screen_x+o,t[d].screen_y,n(e),i.svgElements,i.svg,t[d].label)},o.drawIcon=function(t,e,i,o,s,r){var a=.5*s,d=h.getSVGElement("rect",r.svgElements,r.svg);d.setAttributeNS(null,"x",e),d.setAttributeNS(null,"y",i-a),d.setAttributeNS(null,"width",o),d.setAttributeNS(null,"height",2*a),d.setAttributeNS(null,"class","vis-outline"),h.drawPoint(e+.5*o,i,n(t),r.svgElements,r.svg)},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n.labelOffset=0,n.selected=!1,n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"setOptions",value:function(t,e,i){this.options=t,void 0===e&&void 0===i||this.setImages(e,i)}},{key:"setImages",value:function(t,e){e&&this.selected?(this.imageObj=e,this.imageObjAlt=t):(this.imageObj=t,this.imageObjAlt=e)}},{key:"switchImages",value:function(t){var e=t&&!this.selected||!t&&this.selected;if(this.selected=t,void 0!==this.imageObjAlt&&e){var i=this.imageObj;this.imageObj=this.imageObjAlt,this.imageObjAlt=i}}},{key:"_resizeImage",value:function(){var t,e;if(!1===this.options.shapeProperties.useImageSize){var i=1,o=1;this.imageObj.width&&this.imageObj.height&&(this.imageObj.width>this.imageObj.height?i=this.imageObj.width/this.imageObj.height:o=this.imageObj.height/this.imageObj.width),t=2*this.options.size*i,e=2*this.options.size*o}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.radius=.5*this.width}}
19286,{key:"_drawRawCircle",value:function(t,e,i,o){this.initContextForDraw(t,o),t.circle(e,i,o.size),this.performFill(t,o)}},{key:"_drawImageAtPosition",value:function(t,e){if(0!=this.imageObj.width){t.globalAlpha=1,this.enableShadow(t,e);var i=1;!0===this.options.shapeProperties.interpolation&&(i=this.imageObj.width/this.width/this.body.view.scale),this.imageObj.drawImageAtPosition(t,i,this.left,this.top,this.width,this.height),this.disableShadow(t,e)}}},{key:"_drawImageLabel",value:function(t,e,i,o,n){var s,r=0;if(void 0!==this.height){r=.5*this.height;var a=this.labelModule.getTextSize(t,o,n);a.lineCount>=1&&(r+=a.height/2)}s=i+r,this.options.label&&(this.labelOffset=r),this.labelModule.draw(t,e,s,o,n,"hanging")}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(6),a=o(r),h=i(29),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(117).default,v=i(48).default,g=i(215).default,y=i(217).default,b=i(218).default,_=i(219).default,w=function(){function t(e,i,o,n){if((0,u.default)(this,t),void 0===i)throw new Error("No body provided");this.options=f.bridgeObject(o),this.globalOptions=o,this.defaultOptions=n,this.body=i,this.id=void 0,this.fromId=void 0,this.toId=void 0,this.selected=!1,this.hover=!1,this.labelDirty=!0,this.baseWidth=this.options.width,this.baseFontSize=this.options.font.size,this.from=void 0,this.to=void 0,this.edgeType=void 0,this.connected=!1,this.labelModule=new m(this.body,this.options,!0),this.setOptions(e)}return(0,p.default)(t,[{key:"setOptions",value:function(e){if(e){t.parseOptions(this.options,e,!0,this.globalOptions),void 0!==e.id&&(this.id=e.id),void 0!==e.from&&(this.fromId=e.from),void 0!==e.to&&(this.toId=e.to),void 0!==e.title&&(this.title=e.title),void 0!==e.value&&(e.value=parseFloat(e.value));var i=[e,this.options,this.defaultOptions];this.chooser=v.choosify("edge",i),this.updateLabelModule(e);var o=this.updateEdgeType();return this._setInteractionWidths(),this.connect(),void 0===e.hidden&&void 0===e.physics||(o=!0),o}}},{key:"getFormattingValues",value:function(){var t=!0===this.options.arrows.to||!0===this.options.arrows.to.enabled,e=!0===this.options.arrows.from||!0===this.options.arrows.from.enabled,i=!0===this.options.arrows.middle||!0===this.options.arrows.middle.enabled,o=this.options.color.inherit,n={toArrow:t,toArrowScale:this.options.arrows.to.scaleFactor,toArrowType:this.options.arrows.to.type,middleArrow:i,middleArrowScale:this.options.arrows.middle.scaleFactor,middleArrowType:this.options.arrows.middle.type,fromArrow:e,fromArrowScale:this.options.arrows.from.scaleFactor,fromArrowType:this.options.arrows.from.type,arrowStrikethrough:this.options.arrowStrikethrough,color:o?void 0:this.options.color.color,inheritsColor:o,opacity:this.options.color.opacity,hidden:this.options.hidden,length:this.options.length,shadow:this.options.shadow.enabled,shadowColor:this.options.shadow.color,shadowSize:this.options.shadow.size,shadowX:this.options.shadow.x,shadowY:this.options.shadow.y,dashes:this.options.dashes,width:this.options.width};if(this.selected||this.hover)if(!0===this.chooser){if(this.selected){var s=this.options.selectionWidth;"function"==typeof s?n.width=s(n.width):"number"==typeof s&&(n.width+=s),n.width=Math.max(n.width,.3/this.body.view.scale),n.color=this.options.color.highlight,n.shadow=this.options.shadow.enabled}else if(this.hover){var r=this.options.hoverWidth;"function"==typeof r?n.width=r(n.width):"number"==typeof r&&(n.width+=r),n.width=Math.max(n.width,.3/this.body.view.scale),n.color=this.options.color.hover,n.shadow=this.options.shadow.enabled}}else"function"==typeof this.chooser&&(this.chooser(n,this.options.id,this.selected,this.hover),void 0!==n.color&&(n.inheritsColor=!1),!1===n.shadow&&(n.shadowColor===this.options.shadow.color&&n.shadowSize===this.options.shadow.size&&n.shadowX===this.options.shadow.x&&n.shadowY===this.options.shadow.y||(n.shadow=!0)));else n.shadow=this.options.shadow.enabled,n.width=Math.max(n.width,.3/this.body.view.scale);return n}},{key:"updateLabelModule",value:function(t){var e=[t,this.options,this.globalOptions,this.defaultOptions];this.labelModule.update(this.options,e),void 0!==this.labelModule.baseSize&&(this.baseFontSize=this.labelModule.baseSize)}},{key:"updateEdgeType",value:function(){var t=this.options.smooth,e=!1,i=!0;return void 0!==this.edgeType&&((this.edgeType instanceof y&&!0===t.enabled&&"dynamic"===t.type||this.edgeType instanceof g&&!0===t.enabled&&"cubicBezier"===t.type||this.edgeType instanceof b&&!0===t.enabled&&"dynamic"!==t.type&&"cubicBezier"!==t.type||this.edgeType instanceof _&&!1===t.type.enabled)&&(i=!1),!0===i&&(e=this.cleanup())),!0===i?!0===t.enabled?"dynamic"===t.type?(e=!0,this.edgeType=new y(this.options,this.body,this.labelModule)):"cubicBezier"===t.type?this.edgeType=new g(this.options,this.body,this.labelModule):this.edgeType=new b(this.options,this.body,this.labelModule):this.edgeType=new _(this.options,this.body,this.labelModule):this.edgeType.setOptions(this.options),e}},{key:"connect",value:function(){this.disconnect(),this.from=this.body.nodes[this.fromId]||void 0,this.to=this.body.nodes[this.toId]||void 0,this.connected=void 0!==this.from&&void 0!==this.to,!0===this.connected?(this.from.attachEdge(this),this.to.attachEdge(this)):(this.from&&this.from.detachEdge(this),this.to&&this.to.detachEdge(this)),this.edgeType.connect()}},{key:"disconnect",value:function(){this.from&&(this.from.detachEdge(this),this.from=void 0),this.to&&(this.to.detachEdge(this),this.to=void 0),this.connected=!1}},{key:"getTitle",value:function(){return this.title}},{key:"isSelected",value:function(){return this.selected}},{key:"getValue",value:function(){return this.options.value}}
19286,{key:"setValueRange",value:function(t,e,i){if(void 0!==this.options.value){var o=this.options.scaling.customScalingFunction(t,e,i,this.options.value),n=this.options.scaling.max-this.options.scaling.min;if(!0===this.options.scaling.label.enabled){var s=this.options.scaling.label.max-this.options.scaling.label.min;this.options.font.size=this.options.scaling.label.min+o*s}this.options.width=this.options.scaling.min+o*n}else this.options.width=this.baseWidth,this.options.font.size=this.baseFontSize;this._setInteractionWidths(),this.updateLabelModule()}},{key:"_setInteractionWidths",value:function(){"function"==typeof this.options.hoverWidth?this.edgeType.hoverWidth=this.options.hoverWidth(this.options.width):this.edgeType.hoverWidth=this.options.hoverWidth+this.options.width,"function"==typeof this.options.selectionWidth?this.edgeType.selectionWidth=this.options.selectionWidth(this.options.width):this.edgeType.selectionWidth=this.options.selectionWidth+this.options.width}},{key:"draw",value:function(t){var e=this.getFormattingValues();if(!e.hidden){var i=this.edgeType.getViaNode(),o={};this.edgeType.fromPoint=this.edgeType.from,this.edgeType.toPoint=this.edgeType.to,e.fromArrow&&(o.from=this.edgeType.getArrowData(t,"from",i,this.selected,this.hover,e),!1===e.arrowStrikethrough&&(this.edgeType.fromPoint=o.from.core)),e.toArrow&&(o.to=this.edgeType.getArrowData(t,"to",i,this.selected,this.hover,e),!1===e.arrowStrikethrough&&(this.edgeType.toPoint=o.to.core)),e.middleArrow&&(o.middle=this.edgeType.getArrowData(t,"middle",i,this.selected,this.hover,e)),this.edgeType.drawLine(t,e,this.selected,this.hover,i),this.drawArrows(t,o,e),this.drawLabel(t,i)}}},{key:"drawArrows",value:function(t,e,i){i.fromArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.from),i.middleArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.middle),i.toArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.to)}},{key:"drawLabel",value:function(t,e){if(void 0!==this.options.label){var i=this.from,o=this.to;if(this.labelModule.differentState(this.selected,this.hover)&&this.labelModule.getTextSize(t,this.selected,this.hover),i.id!=o.id){this.labelModule.pointToSelf=!1;var n=this.edgeType.getPoint(.5,e);t.save();var s=this._getRotation(t);0!=s.angle&&(t.translate(s.x,s.y),t.rotate(s.angle)),this.labelModule.draw(t,n.x,n.y,this.selected,this.hover),t.restore()}else{this.labelModule.pointToSelf=!0;var r,a,h=this.options.selfReferenceSize;i.shape.width>i.shape.height?(r=i.x+.5*i.shape.width,a=i.y-h):(r=i.x+h,a=i.y-.5*i.shape.height),n=this._pointOnCircle(r,a,h,.125),this.labelModule.draw(t,n.x,n.y,this.selected,this.hover)}}}},{key:"getItemsOnPoint",value:function(t){var e=[];if(this.labelModule.visible()){var i=this._getRotation();v.pointInRect(this.labelModule.getSize(),t,i)&&e.push({edgeId:this.id,labelId:0})}var o={left:t.x,top:t.y};return this.isOverlappingWith(o)&&e.push({edgeId:this.id}),e}},{key:"isOverlappingWith",value:function(t){if(this.connected){var e=this.from.x,i=this.from.y,o=this.to.x,n=this.to.y,s=t.left,r=t.top;return this.edgeType.getDistanceToEdge(e,i,o,n,s,r)<10}return!1}},{key:"_getRotation",value:function(t){var e=this.edgeType.getViaNode(),i=this.edgeType.getPoint(.5,e);void 0!==t&&this.labelModule.calculateLabelSize(t,this.selected,this.hover,i.x,i.y);var o={x:i.x,y:this.labelModule.size.yLine,angle:0};if(!this.labelModule.visible())return o;if("horizontal"===this.options.font.align)return o;var n=this.from.y-this.to.y,s=this.from.x-this.to.x,r=Math.atan2(n,s);return(r<-1&&s<0||r>0&&s<0)&&(r+=Math.PI),o.angle=r,o}},{key:"_pointOnCircle",value:function(t,e,i,o){var n=2*o*Math.PI;return{x:t+i*Math.cos(n),y:e-i*Math.sin(n)}}},{key:"select",value:function(){this.selected=!0}},{key:"unselect",value:function(){this.selected=!1}},{key:"cleanup",value:function(){return this.edgeType.cleanup()}},{key:"remove",value:function(){this.cleanup(),this.disconnect(),delete this.body.edges[this.id]}},{key:"endPointsValid",value:function(){return void 0!==this.body.nodes[this.fromId]&&void 0!==this.body.nodes[this.toId]}}],[{key:"parseOptions",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=arguments.length>4&&void 0!==arguments[4]&&arguments[4],r=["arrowStrikethrough","id","from","hidden","hoverWidth","labelHighlightBold","length","line","opacity","physics","scaling","selectionWidth","selfReferenceSize","to","title","value","width","font","chosen","widthConstraint"];if(f.selectiveDeepExtend(r,t,e,i),v.isValidLabel(e.label)?t.label=e.label:t.label=void 0,f.mergeOptions(t,e,"smooth",o),f.mergeOptions(t,e,"shadow",o),void 0!==e.dashes&&null!==e.dashes?t.dashes=e.dashes:!0===i&&null===e.dashes&&(t.dashes=(0,d.default)(o.dashes)),void 0!==e.scaling&&null!==e.scaling?(void 0!==e.scaling.min&&(t.scaling.min=e.scaling.min),void 0!==e.scaling.max&&(t.scaling.max=e.scaling.max),f.mergeOptions(t.scaling,e.scaling,"label",o.scaling)):!0===i&&null===e.scaling&&(t.scaling=(0,d.default)(o.scaling)),void 0!==e.arrows&&null!==e.arrows)if("string"==typeof e.arrows){var h=e.arrows.toLowerCase();t.arrows.to.enabled=-1!=h.indexOf("to"),t.arrows.middle.enabled=-1!=h.indexOf("middle"),t.arrows.from.enabled=-1!=h.indexOf("from")}else{if("object"!==(0,a.default)(e.arrows))throw new Error("The arrow newOptions can only be an object or a string. Refer to the documentation. You used:"+(0,s.default)(e.arrows));f.mergeOptions(t.arrows,e.arrows,"to",o.arrows),f.mergeOptions(t.arrows,e.arrows,"middle",o.arrows),f.mergeOptions(t.arrows,e.arrows,"from",o.arrows)}else!0===i&&null===e.arrows&&(t.arrows=(0,d.default)(o.arrows));if(void 0!==e.color&&null!==e.color){var l=e.color,u=t.color;if(n)f.deepExtend(u,o.color,!1,i);else for(var c in u)u.hasOwnProperty(c)&&delete u[c];if(f.isString(u))u.color=u,u.highlight=u,u.hover=u,u.inherit=!1,void 0===l.opacity&&(u.opacity=1);else{var p=!1;void 0!==l.color&&(u.color=l.color,p=!0),void 0!==l.highlight&&(u.highlight=l.highlight,p=!0),void 0!==l.hover&&(u.hover=l.hover,p=!0),void 0!==l.inherit&&(u.inherit=l.inherit),void 0!==l.opacity&&(u.opacity=Math.min(1,Math.max(0,l.opacity))),!0===p?u.inherit=!1:void 0===u.inherit&&(u.inherit="from")}}else!0===i&&null===e.color&&(t.color=f.bridgeObject(o.color));!0===i&&null===e.font&&(t.font=f.bridgeObject(o.font))}}]),t}();e.default=w}
19286,function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(118),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_findBorderPositionBezier",value:function(t,e){var i,o,n,s,r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this._getViaCoordinates(),h=0,d=0,l=1,u=this.to,c=!1;for(t.id===this.from.id&&(u=this.from,c=!0);d<=l&&h<10;){var p=.5*(d+l);if(i=this.getPoint(p,a),o=Math.atan2(u.y-i.y,u.x-i.x),n=u.distanceToBorder(e,o),s=Math.sqrt(Math.pow(i.x-u.x,2)+Math.pow(i.y-u.y,2)),r=n-s,Math.abs(r)<.2)break;r<0?!1===c?d=p:l=p:!1===c?l=p:d=p,h++}return i.t=p,i}},{key:"_getDistanceToBezierEdge",value:function(t,e,i,o,n,s,r){var a=1e9,h=void 0,d=void 0,l=void 0,u=void 0,c=void 0,p=t,f=e;for(d=1;d<10;d++)l=.1*d,u=Math.pow(1-l,2)*t+2*l*(1-l)*r.x+Math.pow(l,2)*i,c=Math.pow(1-l,2)*e+2*l*(1-l)*r.y+Math.pow(l,2)*o,d>0&&(h=this._getDistanceToLine(p,f,u,c,n,s),a=h<a?h:a),p=u,f=c;return a}},{key:"_bezierCurve",value:function(t,e,i,o){var n=void 0!==i&&void 0!==i.x,s=void 0!==o&&void 0!==o.x;t.beginPath(),t.moveTo(this.fromPoint.x,this.fromPoint.y),n&&s?t.bezierCurveTo(i.x,i.y,o.x,o.y,this.toPoint.x,this.toPoint.y):n?t.quadraticCurveTo(i.x,i.y,this.toPoint.x,this.toPoint.y):t.lineTo(this.toPoint.x,this.toPoint.y),this.enableShadow(t,e),t.stroke(),this.disableShadow(t,e)}},{key:"getViaNode",value:function(){return this._getViaCoordinates()}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=function(){function t(){(0,s.default)(this,t)}return(0,a.default)(t,null,[{key:"getRange",value:function(t){var e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],o=1e9,n=-1e9,s=1e9,r=-1e9;if(i.length>0)for(var a=0;a<i.length;a++)e=t[i[a]],s>e.shape.boundingBox.left&&(s=e.shape.boundingBox.left),r<e.shape.boundingBox.right&&(r=e.shape.boundingBox.right),o>e.shape.boundingBox.top&&(o=e.shape.boundingBox.top),n<e.shape.boundingBox.bottom&&(n=e.shape.boundingBox.bottom);return 1e9===s&&-1e9===r&&1e9===o&&-1e9===n&&(o=0,n=0,s=0,r=0),{minX:s,maxX:r,minY:o,maxY:n}}},{key:"getRangeCore",value:function(t){var e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],o=1e9,n=-1e9,s=1e9,r=-1e9;if(i.length>0)for(var a=0;a<i.length;a++)e=t[i[a]],s>e.x&&(s=e.x),r<e.x&&(r=e.x),o>e.y&&(o=e.y),n<e.y&&(n=e.y);return 1e9===s&&-1e9===r&&1e9===o&&-1e9===n&&(o=0,n=0,s=0,r=0),{minX:s,maxX:r,minY:o,maxY:n}}},{key:"findCenter",value:function(t){return{x:.5*(t.maxX+t.minX),y:.5*(t.maxY+t.minY)}}},{key:"cloneOptions",value:function(t,e){var i={};return void 0===e||"node"===e?(h.deepExtend(i,t.options,!0),i.x=t.x,i.y=t.y,i.amountOfConnections=t.edges.length):h.deepExtend(i,t.options,!0),i}}]),t}();e.default=d},function(t,e,i){t.exports={default:i(124),__esModule:!0}},function(t,e,i){var o=i(50);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==o(t)?t.split(""):Object(t)}},function(t,e,i){var o=i(52),n=i(17),s=i(83),r=i(26),a=i(22),h=i(31),d=i(129),l=i(59),u=i(85),c=i(13)("iterator"),p=!([].keys&&"next"in[].keys()),f=function(){return this};t.exports=function(t,e,i,m,v,g,y){d(i,e,m);var b,_,w,x=function(t){if(!p&&t in M)return M[t];switch(t){case"keys":case"values":return function(){return new i(this,t)}}return function(){return new i(this,t)}},k=e+" Iterator",S="values"==v,D=!1,M=t.prototype,C=M[c]||M["@@iterator"]||v&&M[v],O=C||x(v),E=v?S?x("entries"):O:void 0,T="Array"==e?M.entries||C:C;if(T&&(w=u(T.call(new t)))!==Object.prototype&&w.next&&(l(w,k,!0),o||a(w,c)||r(w,c,f)),S&&C&&"values"!==C.name&&(D=!0,O=function(){return C.call(this)}),o&&!y||!p&&!D&&M[c]||r(M,c,O),h[e]=O,h[k]=f,v)if(b={values:S?O:x("values"),keys:g?O:x("keys"),entries:E},y)for(_ in b)_ in M||s(M,_,b[_]);else n(n.P+n.F*(p||D),e,b);return b}},function(t,e,i){var o=i(128);
19286t.exports=function(t,e,i){if(o(t),void 0===e)return t;switch(i){case 1:return function(i){return t.call(e,i)};case 2:return function(i,o){return t.call(e,i,o)};case 3:return function(i,o,n){return t.call(e,i,o,n)}}return function(){return t.apply(e,arguments)}}},function(t,e,i){t.exports=!i(21)&&!i(28)(function(){return 7!=Object.defineProperty(i(82)("div"),"a",{get:function(){return 7}}).a})},function(t,e,i){var o=i(32),n=i(18).document,s=o(n)&&o(n.createElement);t.exports=function(t){return s?n.createElement(t):{}}},function(t,e,i){t.exports=i(26)},function(t,e,i){var o=i(22),n=i(25),s=i(131)(!1),r=i(56)("IE_PROTO");t.exports=function(t,e){var i,a=n(t),h=0,d=[];for(i in a)i!=r&&o(a,i)&&d.push(i);for(;e.length>h;)o(a,i=e[h++])&&(~s(d,i)||d.push(i));return d}},function(t,e,i){var o=i(22),n=i(41),s=i(56)("IE_PROTO"),r=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=n(t),o(t,s)?t[s]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?r:null}},function(t,e,i){var o=i(50),n=i(13)("toStringTag"),s="Arguments"==o(function(){return arguments}()),r=function(t,e){try{return t[e]}catch(t){}};t.exports=function(t){var e,i,a;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(i=r(e=Object(t),n))?i:s?o(e):"Object"==(a=o(e))&&"function"==typeof e.callee?"Arguments":a}},function(t,e,i){var o=i(17),n=i(7),s=i(28);t.exports=function(t,e){var i=(n.Object||{})[t]||Object[t],r={};r[t]=e(i),o(o.S+o.F*s(function(){i(1)}),"Object",r)}},function(t,e,i){var o=i(84),n=i(58).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return o(t,n)}},function(t,e,i){var o=i(42),n=i(39),s=i(25),r=i(53),a=i(22),h=i(81),d=Object.getOwnPropertyDescriptor;e.f=i(21)?d:function(t,e){if(t=s(t),e=r(e,!0),h)try{return d(t,e)}catch(t){}if(a(t,e))return n(!o.f.call(t,e),t[e])}},function(t,e,i){t.exports={default:i(162),__esModule:!0}},function(t,e,i){function o(t,e){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0}t.exports=o},function(t,e,i){function o(t,e){if(void 0===t)throw new Error("No container element defined");if(this.container=t,this.visible=!e||void 0==e.visible||e.visible,this.visible){this.frame=document.createElement("DIV"),this.frame.style.width="100%",this.frame.style.position="relative",this.container.appendChild(this.frame),this.frame.prev=document.createElement("INPUT"),this.frame.prev.type="BUTTON",this.frame.prev.value="Prev",this.frame.appendChild(this.frame.prev),this.frame.play=document.createElement("INPUT"),this.frame.play.type="BUTTON",this.frame.play.value="Play",this.frame.appendChild(this.frame.play),this.frame.next=document.createElement("INPUT"),this.frame.next.type="BUTTON",this.frame.next.value="Next",this.frame.appendChild(this.frame.next),this.frame.bar=document.createElement("INPUT"),this.frame.bar.type="BUTTON",this.frame.bar.style.position="absolute",this.frame.bar.style.border="1px solid red",this.frame.bar.style.width="100px",this.frame.bar.style.height="6px",this.frame.bar.style.borderRadius="2px",this.frame.bar.style.MozBorderRadius="2px",this.frame.bar.style.border="1px solid #7F7F7F",this.frame.bar.style.backgroundColor="#E5E5E5",this.frame.appendChild(this.frame.bar),this.frame.slide=document.createElement("INPUT"),this.frame.slide.type="BUTTON",this.frame.slide.style.margin="0px",this.frame.slide.value=" ",this.frame.slide.style.position="relative",this.frame.slide.style.left="-100px",this.frame.appendChild(this.frame.slide);var i=this;this.frame.slide.onmousedown=function(t){i._onMouseDown(t)},this.frame.prev.onclick=function(t){i.prev(t)},this.frame.play.onclick=function(t){i.togglePlay(t)},this.frame.next.onclick=function(t){i.next(t)}}this.onChangeCallback=void 0,this.values=[],this.index=void 0,this.playTimeout=void 0,this.playInterval=1e3,this.playLoop=!0}var n=i(2);o.prototype.prev=function(){var t=this.getIndex();t>0&&(t--,this.setIndex(t))},o.prototype.next=function(){var t=this.getIndex();t<this.values.length-1&&(t++,this.setIndex(t))},o.prototype.playNext=function(){var t=new Date,e=this.getIndex();e<this.values.length-1?(e++,this.setIndex(e)):this.playLoop&&(e=0,this.setIndex(e));var i=new Date,o=i-t,n=Math.max(this.playInterval-o,0),s=this;this.playTimeout=setTimeout(function(){s.playNext()},n)},o.prototype.togglePlay=function(){void 0===this.playTimeout?this.play():this.stop()},o.prototype.play=function(){this.playTimeout||(this.playNext(),this.frame&&(this.frame.play.value="Stop"))},o.prototype.stop=function(){clearInterval(this.playTimeout),this.playTimeout=void 0,this.frame&&(this.frame.play.value="Play")},o.prototype.setOnChangeCallback=function(t){this.onChangeCallback=t},o.prototype.setPlayInterval=function(t){this.playInterval=t},o.prototype.getPlayInterval=function(){return this.playInterval},o.prototype.setPlayLoop=function(t){this.playLoop=t},o.prototype.onChange=function(){void 0!==this.onChangeCallback&&this.onChangeCallback()},o.prototype.redraw=function(){if(this.frame){this.frame.bar.style.top=this.frame.clientHeight/2-this.frame.bar.offsetHeight/2+"px",this.frame.bar.style.width=this.frame.clientWidth-this.frame.prev.clientWidth-this.frame.play.clientWidth-this.frame.next.clientWidth-30+"px";var t=this.indexToLeft(this.index);this.frame.slide.style.left=t+"px"}},o.prototype.setValues=function(t){this.values=t,this.values.length>0?this.setIndex(0):this.index=void 0},o.prototype.setIndex=function(t){if(!(t<this.values.length))throw new Error("Index out of range");this.index=t,this.redraw(),this.onChange()},o.prototype.getIndex=function(){return this.index},o.prototype.get=function(){return this.values[this.index]},o.prototype._onMouseDown=function(t){if(t.which?1===t.which:1===t.button){this.startClientX=t.clientX,this.startSlideX=parseFloat(this.frame.slide.style.left),this.frame.style.cursor="move";var e=this;this.onmousemove=function(t){e._onMouseMove(t)},this.onmouseup=function(t){e._onMouseUp(t)},n.addEventListener(document,"mousemove",this.onmousemove),n.addEventListener(document,"mouseup",this.onmouseup),n.preventDefault(t)}},o.prototype.leftToIndex=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10,i=t-3,o=Math.round(i/e*(this.values.length-1));return o<0&&(o=0),o>this.values.length-1&&(o=this.values.length-1),o},o.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10;return t/(this.values.length-1)*e+3},o.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,o=this.leftToIndex(i);this.setIndex(o),n.preventDefault()},o.prototype._onMouseUp=function(t){this.frame.style.cursor="auto",n.removeEventListener(document,"mousemove",this.onmousemove),n.removeEventListener(document,"mouseup",this.onmouseup),n.preventDefault()},t.exports=o}
19286,function(t,e,i){function o(t,e,i,o){this._start=0,this._end=0,this._step=1,this.prettyStep=!0,this.precision=5,this._current=0,this.setRange(t,e,i,o)}o.prototype.isNumeric=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.prototype.setRange=function(t,e,i,o){if(!this.isNumeric(t))throw new Error("Parameter 'start' is not numeric; value: "+t);if(!this.isNumeric(e))throw new Error("Parameter 'end' is not numeric; value: "+t);if(!this.isNumeric(i))throw new Error("Parameter 'step' is not numeric; value: "+t);this._start=t||0,this._end=e||0,this.setStep(i,o)},o.prototype.setStep=function(t,e){void 0===t||t<=0||(void 0!==e&&(this.prettyStep=e),!0===this.prettyStep?this._step=o.calculatePrettyStep(t):this._step=t)},o.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),o=2*Math.pow(10,Math.round(e(t/2))),n=5*Math.pow(10,Math.round(e(t/5))),s=i;return Math.abs(o-t)<=Math.abs(s-t)&&(s=o),Math.abs(n-t)<=Math.abs(s-t)&&(s=n),s<=0&&(s=1),s},o.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},o.prototype.getStep=function(){return this._step},o.prototype.start=function(t){void 0===t&&(t=!1),this._current=this._start-this._start%this._step,t&&this.getCurrent()<this._start&&this.next()},o.prototype.next=function(){this._current+=this._step},o.prototype.end=function(){return this._current>this._end},t.exports=o},function(t,e,i){function o(t){for(var e in t)if(t.hasOwnProperty(e))return!1;return!0}function n(t){return void 0===t||""===t||"string"!=typeof t?t:t.charAt(0).toUpperCase()+t.slice(1)}function s(t,e){return void 0===t||""===t?e:t+n(e)}function r(t,e,i,o){for(var n,r,a=0;a<i.length;++a)n=i[a],r=s(o,n),e[r]=t[n]}function a(t,e,i,o){for(var n,r,a=0;a<i.length;++a)n=i[a],void 0!==t[n]&&(r=s(o,n),e[r]=t[n])}function h(t,e){if(void 0===t||o(t))throw new Error("No DEFAULTS passed");if(void 0===e)throw new Error("No dst passed");C=t,r(t,e,D),r(t,e,M,"default"),l(t,e),e.margin=10,e.showGrayBottom=!1,e.showTooltip=!1,e.onclick_callback=null,e.eye=new x(0,0,-1)}function d(t,e){if(void 0!==t){if(void 0===e)throw new Error("No dst passed");if(void 0===C||o(C))throw new Error("DEFAULTS not set for module Settings");a(t,e,D),a(t,e,M,"default"),l(t,e)}}function l(t,e){void 0!==t.backgroundColor&&m(t.backgroundColor,e),v(t.dataColor,e),f(t.style,e),u(t.showLegend,e),g(t.cameraPosition,e),void 0!==t.tooltip&&(e.showTooltip=t.tooltip),void 0!=t.onclick&&(e.onclick_callback=t.onclick),void 0!==t.tooltipStyle&&_.selectiveDeepExtend(["tooltipStyle"],e,t)}function u(t,e){if(void 0===t){if(void 0===C.showLegend){var i=e.style===k.DOTCOLOR||e.style===k.DOTSIZE;e.showLegend=i}}else e.showLegend=t}function c(t){var e=S[t];return void 0===e?-1:e}function p(t){var e=!1;for(var i in k)if(k[i]===t){e=!0;break}return e}function f(t,e){if(void 0!==t){var i;if("string"==typeof t){if(-1===(i=c(t)))throw new Error("Style '"+t+"' is invalid")}else{if(!p(t))throw new Error("Style '"+t+"' is invalid");i=t}e.style=i}}function m(t,e){var i="white",o="gray",n=1;if("string"==typeof t)i=t,o="none",n=0;else{if("object"!==(void 0===t?"undefined":(0,b.default)(t)))throw new Error("Unsupported type of backgroundColor");void 0!==t.fill&&(i=t.fill),void 0!==t.stroke&&(o=t.stroke),void 0!==t.strokeWidth&&(n=t.strokeWidth)}e.frame.style.backgroundColor=i,e.frame.style.borderColor=o,e.frame.style.borderWidth=n+"px",e.frame.style.borderStyle="solid"}function v(t,e){void 0!==t&&(void 0===e.dataColor&&(e.dataColor={}),"string"==typeof t?(e.dataColor.fill=t,e.dataColor.stroke=t):(t.fill&&(e.dataColor.fill=t.fill),t.stroke&&(e.dataColor.stroke=t.stroke),void 0!==t.strokeWidth&&(e.dataColor.strokeWidth=t.strokeWidth)))}function g(t,e){var i=t;void 0!==i&&(void 0===e.camera&&(e.camera=new w),e.camera.setArmRotation(i.horizontal,i.vertical),e.camera.setArmLength(i.distance))}var y=i(6),b=function(t){return t&&t.__esModule?t:{default:t}}(y),_=i(2),w=i(95),x=i(34),k={BAR:0,BARCOLOR:1,BARSIZE:2,DOT:3,DOTLINE:4,DOTCOLOR:5,DOTSIZE:6,GRID:7,LINE:8,SURFACE:9},S={dot:k.DOT,"dot-line":k.DOTLINE,"dot-color":k.DOTCOLOR,"dot-size":k.DOTSIZE,line:k.LINE,grid:k.GRID,surface:k.SURFACE,bar:k.BAR,"bar-color":k.BARCOLOR,"bar-size":k.BARSIZE},D=["width","height","filterLabel","legendLabel","xLabel","yLabel","zLabel","xValueLabel","yValueLabel","zValueLabel","showXAxis","showYAxis","showZAxis","showGrid","showPerspective","showShadow","keepAspectRatio","verticalRatio","dotSizeRatio","dotSizeMinFraction","dotSizeMaxFraction","showAnimationControls","animationInterval","animationPreload","animationAutoStart","axisColor","gridColor","xCenter","yCenter"],M=["xBarWidth","yBarWidth","valueMin","valueMax","xMin","xMax","xStep","yMin","yMax","yStep","zMin","zMax","zStep"],C=void 0;
19286t.exports.STYLE=k,t.exports.setDefaults=h,t.exports.setOptions=d,t.exports.setCameraPosition=g},function(t,e,i){function o(){this.armLocation=new r,this.armRotation={},this.armRotation.horizontal=0,this.armRotation.vertical=0,this.armLength=1.7,this.cameraOffset=new r,this.offsetMultiplier=.6,this.cameraLocation=new r,this.cameraRotation=new r(.5*Math.PI,0,0),this.calculateCameraOrientation()}var n=i(165),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(34);o.prototype.setOffset=function(t,e){var i=Math.abs,o=s.default,n=this.offsetMultiplier,r=this.armLength*n;i(t)>r&&(t=o(t)*r),i(e)>r&&(e=o(e)*r),this.cameraOffset.x=t,this.cameraOffset.y=e,this.calculateCameraOrientation()},o.prototype.getOffset=function(){return this.cameraOffset},o.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},o.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),void 0===t&&void 0===e||this.calculateCameraOrientation()},o.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},o.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.setOffset(this.cameraOffset.x,this.cameraOffset.y),this.calculateCameraOrientation())},
19287    o.prototype.getArmLength=function(){return this.armLength},o.prototype.getCameraLocation=function(){return this.cameraLocation},o.prototype.getCameraRotation=function(){return this.cameraRotation},o.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical),this.cameraRotation.x=Math.PI/2-this.armRotation.vertical,this.cameraRotation.y=0,this.cameraRotation.z=-this.armRotation.horizontal;var t=this.cameraRotation.x,e=this.cameraRotation.z,i=this.cameraOffset.x,o=this.cameraOffset.y,n=Math.sin,s=Math.cos;this.cameraLocation.x=this.cameraLocation.x+i*s(e)+o*-n(e)*s(t),this.cameraLocation.y=this.cameraLocation.y+i*n(e)+o*s(e)*s(t),this.cameraLocation.z=this.cameraLocation.z+o*n(t)},t.exports=o},function(t,e,i){function o(t,e,i){this.dataGroup=t,this.column=e,this.graph=i,this.index=void 0,this.value=void 0,this.values=t.getDistinctValues(this.column),this.values.length>0&&this.selectValue(0),this.dataPoints=[],this.loaded=!1,this.onLoadCallback=void 0,i.animationPreload?(this.loaded=!1,this.loadInBackground()):this.loaded=!0}var n=i(12);o.prototype.isLoaded=function(){return this.loaded},o.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},o.prototype.getLabel=function(){return this.graph.filterLabel},o.prototype.getColumn=function(){return this.column},o.prototype.getSelectedValue=function(){if(void 0!==this.index)return this.values[this.index]},o.prototype.getValues=function(){return this.values},o.prototype.getValue=function(t){if(t>=this.values.length)throw new Error("Index out of range");return this.values[t]},o.prototype._getDataPoints=function(t){if(void 0===t&&(t=this.index),void 0===t)return[];var e;if(this.dataPoints[t])e=this.dataPoints[t];else{var i={};i.column=this.column,i.value=this.values[t];var o=new n(this.dataGroup.getDataSet(),{filter:function(t){return t[i.column]==i.value}}).get();e=this.dataGroup._getDataPoints(o),this.dataPoints[t]=e}return e},o.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},o.prototype.selectValue=function(t){if(t>=this.values.length)throw new Error("Index out of range");this.index=t,this.value=this.values[t]}
19287,o.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t<this.values.length){void 0===e.progress&&(e.progress=document.createElement("DIV"),e.progress.style.position="absolute",e.progress.style.color="gray",e.appendChild(e.progress));var i=this.getLoadedProgress();e.progress.innerHTML="Loading animation... "+i+"%",e.progress.style.bottom="60px",e.progress.style.left="10px";var o=this;setTimeout(function(){o.loadInBackground(t+1)},10),this.loaded=!1}else this.loaded=!0,void 0!==e.progress&&(e.removeChild(e.progress),e.progress=void 0),this.onLoadCallback&&this.onLoadCallback()},t.exports=o},function(t,e,i){function o(t){this.active=!1,this.dom={container:t},this.dom.overlay=document.createElement("div"),this.dom.overlay.className="vis-overlay",this.dom.container.appendChild(this.dom.overlay),this.hammer=a(this.dom.overlay),this.hammer.on("tap",this._onTapOverlay.bind(this));var e=this;["tap","doubletap","press","pinch","pan","panstart","panmove","panend"].forEach(function(t){e.hammer.on(t,function(t){t.stopPropagation()})}),document&&document.body&&(this.onClick=function(i){n(i.target,t)||e.deactivate()},document.body.addEventListener("click",this.onClick)),void 0!==this.keycharm&&this.keycharm.destroy(),this.keycharm=s(),this.escListener=this.deactivate.bind(this)}function n(t,e){for(;t;){if(t===e)return!0;t=t.parentNode}return!1}var s=i(35),r=i(44),a=i(10),h=i(2);r(o.prototype),o.current=null,o.prototype.destroy=function(){this.deactivate(),this.dom.overlay.parentNode.removeChild(this.dom.overlay),this.onClick&&document.body.removeEventListener("click",this.onClick),this.hammer.destroy(),this.hammer=null},o.prototype.activate=function(){o.current&&o.current.deactivate(),o.current=this,this.active=!0,this.dom.overlay.style.display="none",h.addClassName(this.dom.container,"vis-active"),this.emit("change"),this.emit("activate"),this.keycharm.bind("esc",this.escListener)},o.prototype.deactivate=function(){this.active=!1,this.dom.overlay.style.display="",h.removeClassName(this.dom.container,"vis-active"),this.keycharm.unbind("esc",this.escListener),this.emit("change"),this.emit("deactivate")},o.prototype._onTapOverlay=function(t){this.activate(),t.stopPropagation()},t.exports=o},function(t,e,i){e.en={current:"current",time:"time"},e.en_EN=e.en,e.en_US=e.en,e.it={current:"attuale",time:"tempo"},e.it_IT=e.it,e.it_CH=e.it,e.nl={current:"huidige",time:"tijd"},e.nl_NL=e.nl,e.nl_BE=e.nl,e.de={current:"Aktuelle",time:"Zeit"},e.de_DE=e.de,e.fr={current:"actuel",time:"heure"},e.fr_FR=e.fr,e.fr_CA=e.fr,e.fr_BE=e.fr,e.es={current:"corriente",time:"hora"},e.es_ES=e.es},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(t,e){this.body=t,this.defaultOptions={type:null,orientation:{item:"bottom"},align:"auto",stack:!0,stackSubgroups:!0,groupOrderSwap:function(t,e,i){var o=e.order;e.order=t.order,t.order=o},groupOrder:"order",selectable:!0,multiselect:!1,itemsAlwaysDraggable:{item:!1,range:!1},editable:{updateTime:!1,updateGroup:!1,add:!1,remove:!1,overrideItems:!1},groupEditable:{order:!1,add:!1,remove:!1},snap:p.snap,onDropObjectOnItem:function(t,e,i){i(e)},onAdd:function(t,e){e(t)},onUpdate:function(t,e){e(t)},onMove:function(t,e){e(t)},onRemove:function(t,e){e(t)},onMoving:function(t,e){e(t)},onAddGroup:function(t,e){e(t)},onMoveGroup:function(t,e){e(t)},onRemoveGroup:function(t,e){e(t)},margin:{item:{horizontal:10,vertical:10},axis:20},showTooltips:!0,tooltip:{followMouse:!1,overflowMethod:"flip"},tooltipOnItemUpdateTime:!1},this.options=l.extend({},this.defaultOptions),this.options.rtl=e.rtl,this.itemOptions={type:{start:"Date",end:"Date"}},this.conversion={toScreen:t.util.toScreen,toTime:t.util.toTime},this.dom={},this.props={},this.hammer=null;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e,o){i._onAdd(e.items)},update:function(t,e,o){i._onUpdate(e.items)},remove:function(t,e,o){i._onRemove(e.items)}},this.groupListeners={add:function(t,e,o){if(i._onAddGroups(e.items),i.groupsData&&i.groupsData.length>0){var n=i.groupsData.getDataSet();
19287n.get().forEach(function(t){if(t.nestedGroups){0!=t.showNested&&(t.showNested=!0);var e=[];t.nestedGroups.forEach(function(i){var o=n.get(i);o&&(o.nestedInGroup=t.id,0==t.showNested&&(o.visible=!1),e=e.concat(o))}),n.update(e,o)}})}},update:function(t,e,o){i._onUpdateGroups(e.items)},remove:function(t,e,o){i._onRemoveGroups(e.items)}},this.items={},this.groups={},this.groupIds=[],this.selection=[],this.popup=null,this.touchParams={},this.groupTouchParams={},this._create(),this.setOptions(e)}var s=i(29),r=o(s),a=i(6),h=o(a),d=i(10),l=i(2),u=i(11),c=i(12),p=i(66),f=i(16),m=i(68),v=i(69),g=i(101),y=i(102),b=i(70),_=i(103),w=i(104).default,x="__ungrouped__",k="__background__";n.prototype=new f,n.types={background:_,box:g,range:b,point:y},n.prototype._create=function(){var t=document.createElement("div");t.className="vis-itemset",t["timeline-itemset"]=this,this.dom.frame=t;var e=document.createElement("div");e.className="vis-background",t.appendChild(e),this.dom.background=e;var i=document.createElement("div");i.className="vis-foreground",t.appendChild(i),this.dom.foreground=i;var o=document.createElement("div");o.className="vis-axis",this.dom.axis=o;var n=document.createElement("div");n.className="vis-labelset",this.dom.labelSet=n,this._updateUngrouped();var s=new v(k,null,this);s.show(),this.groups[k]=s,this.hammer=new d(this.body.dom.centerContainer),this.hammer.on("hammer.input",function(t){t.isFirst&&this._onTouch(t)}.bind(this)),this.hammer.on("panstart",this._onDragStart.bind(this)),this.hammer.on("panmove",this._onDrag.bind(this)),this.hammer.on("panend",this._onDragEnd.bind(this)),this.hammer.get("pan").set({threshold:5,direction:d.DIRECTION_HORIZONTAL}),this.hammer.on("tap",this._onSelectItem.bind(this)),this.hammer.on("press",this._onMultiSelectItem.bind(this)),this.hammer.on("doubletap",this._onAddItem.bind(this)),this.options.rtl?this.groupHammer=new d(this.body.dom.rightContainer):this.groupHammer=new d(this.body.dom.leftContainer),this.groupHammer.on("tap",this._onGroupClick.bind(this)),this.groupHammer.on("panstart",this._onGroupDragStart.bind(this)),this.groupHammer.on("panmove",this._onGroupDrag.bind(this)),this.groupHammer.on("panend",this._onGroupDragEnd.bind(this)),this.groupHammer.get("pan").set({threshold:5,direction:d.DIRECTION_VERTICAL}),this.body.dom.centerContainer.addEventListener("mouseover",this._onMouseOver.bind(this)),this.body.dom.centerContainer.addEventListener("mouseout",this._onMouseOut.bind(this)),this.body.dom.centerContainer.addEventListener("mousemove",this._onMouseMove.bind(this)),this.body.dom.centerContainer.addEventListener("contextmenu",this._onDragEnd.bind(this)),this.body.dom.centerContainer.addEventListener("mousewheel",this._onMouseWheel.bind(this)),this.show()},n.prototype.setOptions=function(t){if(t){var e=["type","rtl","align","order","stack","stackSubgroups","selectable","multiselect","multiselectPerGroup","groupOrder","dataAttributes","template","groupTemplate","visibleFrameTemplate","hide","snap","groupOrderSwap","showTooltips","tooltip","tooltipOnItemUpdateTime"];l.selectiveExtend(e,this.options,t),"itemsAlwaysDraggable"in t&&("boolean"==typeof t.itemsAlwaysDraggable?(this.options.itemsAlwaysDraggable.item=t.itemsAlwaysDraggable,this.options.itemsAlwaysDraggable.range=!1):"object"===(0,h.default)(t.itemsAlwaysDraggable)&&(l.selectiveExtend(["item","range"],this.options.itemsAlwaysDraggable,t.itemsAlwaysDraggable),this.options.itemsAlwaysDraggable.item||(this.options.itemsAlwaysDraggable.range=!1))),"orientation"in t&&("string"==typeof t.orientation?this.options.orientation.item="top"===t.orientation?"top":"bottom":"object"===(0,h.default)(t.orientation)&&"item"in t.orientation&&(this.options.orientation.item=t.orientation.item)),"margin"in t&&("number"==typeof t.margin?(this.options.margin.axis=t.margin,this.options.margin.item.horizontal=t.margin,this.options.margin.item.vertical=t.margin):"object"===(0,h.default)(t.margin)&&(l.selectiveExtend(["axis"],this.options.margin,t.margin),"item"in t.margin&&("number"==typeof t.margin.item?(this.options.margin.item.horizontal=t.margin.item,this.options.margin.item.vertical=t.margin.item):"object"===(0,h.default)(t.margin.item)&&l.selectiveExtend(["horizontal","vertical"],this.options.margin.item,t.margin.item)))),"editable"in t&&("boolean"==typeof t.editable?(this.options.editable.updateTime=t.editable,this.options.editable.updateGroup=t.editable,this.options.editable.add=t.editable,this.options.editable.remove=t.editable,this.options.editable.overrideItems=!1):"object"===(0,h.default)(t.editable)&&l.selectiveExtend(["updateTime","updateGroup","add","remove","overrideItems"],this.options.editable,t.editable)),"groupEditable"in t&&("boolean"==typeof t.groupEditable?(this.options.groupEditable.order=t.groupEditable,this.options.groupEditable.add=t.groupEditable,this.options.groupEditable.remove=t.groupEditable):"object"===(0,h.default)(t.groupEditable)&&l.selectiveExtend(["order","add","remove"],this.options.groupEditable,t.groupEditable));["onDropObjectOnItem","onAdd","onUpdate","onRemove","onMove","onMoving","onAddGroup","onMoveGroup","onRemoveGroup"].forEach(function(e){var i=t[e];if(i){if(!(i instanceof Function))throw new Error("option "+e+" must be a function "+e+"(item, callback)");this.options[e]=i}}.bind(this)),this.markDirty()}},n.prototype.markDirty=function(t){this.groupIds=[],t&&t.refreshItems&&l.forEach(this.items,function(t){t.dirty=!0,t.displayed&&t.redraw()})},n.prototype.destroy=function(){this.hide(),this.setItems(null),this.setGroups(null),this.hammer=null,this.body=null,this.conversion=null},n.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.axis.parentNode&&this.dom.axis.parentNode.removeChild(this.dom.axis),this.dom.labelSet.parentNode&&this.dom.labelSet.parentNode.removeChild(this.dom.labelSet)},n.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame),this.dom.axis.parentNode||this.body.dom.backgroundVertical.appendChild(this.dom.axis),this.dom.labelSet.parentNode||(this.options.rtl?this.body.dom.right.appendChild(this.dom.labelSet):this.body.dom.left.appendChild(this.dom.labelSet))},n.prototype.setSelection=function(t){var e,i,o,n;for(void 0==t&&(t=[]),Array.isArray(t)||(t=[t]),e=0,i=this.selection.length;e<i;e++)o=this.selection[e],(n=this.items[o])&&n.unselect();for(this.selection=[],e=0,i=t.length;e<i;
19287e++)o=t[e],(n=this.items[o])&&(this.selection.push(o),n.select())},n.prototype.getSelection=function(){return this.selection.concat([])},n.prototype.getVisibleItems=function(){var t,e,i=this.body.range.getRange();this.options.rtl?(t=this.body.util.toScreen(i.start),e=this.body.util.toScreen(i.end)):(e=this.body.util.toScreen(i.start),t=this.body.util.toScreen(i.end));var o=[];for(var n in this.groups)if(this.groups.hasOwnProperty(n))for(var s=this.groups[n],r=s.isVisible?s.visibleItems:[],a=0;a<r.length;a++){var h=r[a];this.options.rtl?h.right<e&&h.right+h.width>t&&o.push(h.id):h.left<t&&h.left+h.width>e&&o.push(h.id)}return o},n.prototype._deselect=function(t){for(var e=this.selection,i=0,o=e.length;i<o;i++)if(e[i]==t){e.splice(i,1);break}},n.prototype.redraw=function(){var t=this.options.margin,e=this.body.range,i=l.option.asSize,o=this.options,n=o.orientation.item,s=!1,r=this.dom.frame;this.props.top=this.body.domProps.top.height+this.body.domProps.border.top,this.options.rtl?this.props.right=this.body.domProps.right.width+this.body.domProps.border.right:this.props.left=this.body.domProps.left.width+this.body.domProps.border.left,r.className="vis-itemset",s=this._orderGroups()||s;var a=e.end-e.start,h=a!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth,d=e.start!=this.lastRangeStart,u=o.stack!=this.lastStack,c=o.stackSubgroups!=this.lastStackSubgroups,p=h||d||u||c;this.lastVisibleInterval=a,this.lastRangeStart=e.start,this.lastStack=o.stack,this.lastStackSubgroups=o.stackSubgroups,this.props.lastWidth=this.props.width;var f=this._firstGroup(),m={item:t.item,axis:t.axis},v={item:t.item,axis:t.item.vertical/2},g=0,y=t.axis+t.item.vertical;this.groups[k].redraw(e,v,p);var b={},_=0;if(l.forEach(this.groups,function(t,i){if(i!==k){var o=t==f?m:v;b[i]=t.redraw(e,o,p,!0),_=b[i].length}}),_>0){for(var w={},x=0;x<_;x++)l.forEach(b,function(t,e){w[e]=t[x]()});l.forEach(this.groups,function(t,e){if(e!==k){var i=w[e];s=i||s,g+=t.height}}),g=Math.max(g,y)}return g=Math.max(g,y),r.style.height=i(g),this.props.width=r.offsetWidth,this.props.height=g,this.dom.axis.style.top=i("top"==n?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.options.rtl?this.dom.axis.style.right="0":this.dom.axis.style.left="0",this.initialItemSetDrawn=!0,s=this._isResized()||s},n.prototype._firstGroup=function(){var t="top"==this.options.orientation.item?0:this.groupIds.length-1,e=this.groupIds[t];return this.groups[e]||this.groups[x]||null},n.prototype._updateUngrouped=function(){var t,e,i=this.groups[x];if(this.groupsData){if(i){i.hide(),delete this.groups[x];for(e in this.items)if(this.items.hasOwnProperty(e)){t=this.items[e],t.parent&&t.parent.remove(t);var o=this._getGroupId(t.data),n=this.groups[o];n&&n.add(t)||t.hide()}}}else if(!i){i=new m(null,null,this),this.groups[x]=i;for(e in this.items)this.items.hasOwnProperty(e)&&(t=this.items[e],i.add(t));i.show()}},n.prototype.getLabelSet=function(){return this.dom.labelSet},n.prototype.setItems=function(t){var e,i=this,o=this.itemsData;if(t){if(!(t instanceof u||t instanceof c))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(o&&(l.forEach(this.itemListeners,function(t,e){o.off(e,t)}),e=o.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;l.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}this.body.emitter.emit("_change",{queue:!0})},n.prototype.getItems=function(){return this.itemsData},n.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(l.forEach(this.groupListeners,function(t,e){i.groupsData.off(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof u||t instanceof c))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var o=this.groupsData;this.groupsData instanceof c&&(o=this.groupsData.getDataSet()),o.get().forEac
19287h(function(t){t.nestedGroups&&t.nestedGroups.forEach(function(e){var i=o.get(e);i.nestedInGroup=t.id,0==t.showNested&&(i.visible=!1),o.update(i)})});var n=this.id;l.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,n)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("_change",{queue:!0})},n.prototype.getGroups=function(){return this.groupsData},n.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},n.prototype._getType=function(t){return t.type||this.options.type||(t.end?"range":"box")},n.prototype._getGroupId=function(t){return"background"==this._getType(t)&&void 0==t.group?k:this.groupsData?t.group:x},n.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i,o=e.itemsData.get(t,e.itemOptions),s=e.items[t],r=o?e._getType(o):null,a=n.types[r];if(s&&(a&&s instanceof a?e._updateItem(s,o):(i=s.selected,e._removeItem(s),s=null)),!s&&o){if(!a)throw"rangeoverflow"==r?new TypeError('Item type "rangeoverflow" is deprecated. Use css styling instead: .vis-item.vis-range .vis-item-content {overflow: visible;}'):new TypeError('Unknown item type "'+r+'"');s=new a(o,e.conversion,e.options),s.id=t,e._addItem(s),i&&(this.selection.push(t),s.select())}}.bind(this)),this._order(),this.body.emitter.emit("_change",{queue:!0})},n.prototype._onAdd=n.prototype._onUpdate,n.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var o=i.items[t];o&&(e++,i._removeItem(o))}),e&&(this._order(),this.body.emitter.emit("_change",{queue:!0}))},n.prototype._order=function(){l.forEach(this.groups,function(t){t.order()})},n.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},n.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),o=e.groups[t];if(o)o.setData(i);else{if(t==x||t==k)throw new Error("Illegal group id. "+t+" is a reserved id.");var n=(0,r.default)(e.options);l.extend(n,{height:null}),o=new m(t,i,e),e.groups[t]=o;for(var s in e.items)if(e.items.hasOwnProperty(s)){var a=e.items[s];a.data.group==t&&o.add(a)}o.order(),o.show()}}),this.body.emitter.emit("_change",{queue:!0})},n.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("_change",{queue:!0})},n.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder});t=this._orderNestedGroups(t);var e=!l.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},n.prototype._orderNestedGroups=function(t){var e=[];return t.forEach(function(t){var i=this.groupsData.get(t);if(i.nestedInGroup||e.push(t),i.nestedGroups){var o=this.groupsData.get({filter:function(e){return e.nestedInGroup==t},order:this.options.groupOrder}),n=o.map(function(t){return t.id});e=e.concat(n)}},this),e},n.prototype._addItem=function(t){this.items[t.id]=t;var e=this._getGroupId(t.data),i=this.groups[e];i?i&&i.data&&i.data.showNested&&(t.groupShowing=!0):t.groupShowing=!1,i&&i.add(t)},n.prototype._updateItem=function(t,e){t.setData(e);var i=this._getGroupId(t.data),o=this.groups[i];o?o&&o.data&&o.data.showNested&&(t.groupShowing=!0):t.groupShowing=!1},n.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1),t.parent&&t.parent.remove(t)},n.prototype._constructByEndArray=function(t){for(var e=[],i=0;i<t.length;i++)t[i]instanceof b&&e.push(t[i]);return e},n.prototype._onTouch=function(t){this.touchParams.item=this.itemFromTarget(t),this.touchParams.dragLeftItem=t.target.dragLeftItem||!1,this.touchParams.dragRightItem=t.target.dragRightItem||!1,this.touchParams.itemProps=null},n.prototype._getGroupIndex=function(t){for(var e=0;e<this.groupIds.length;e++)if(t==this.groupIds[e])return e},n.prototype._onDragStart=function(t){if(!this.touchParams.itemIsDragging){var e,i=this.touchParams.item||null,o=this;if(i&&(i.selected||this.options.itemsAlwaysDraggable.item)){if(this.options.editable.overrideItems&&!this.options.editable.updateTime&&!this.options.editable.updateGroup)return;if(null!=i.editable&&!i.editable.updateTime&&!i.editable.updateGroup&&!this.options.editable.overrideItems)return;var n=this.touchParams.dragLeftItem,s=this.touchParams.dragRightItem;if(this.touchParams.itemIsDragging=!0,this.touchParams.selectedItem=i,n)e={item:n,initialX:t.center.x,dragLeft:!0,data:this._cloneItemData(i.data)},this.touchParams.itemProps=[e];else if(s)e={item:s,initialX:t.center.x,dragRight:!0,data:this._cloneItemData(i.data)},this.touchParams.itemProps=[e];else if(this.options.editable.add&&(t.srcEvent.ctrlKey||t.srcEvent.metaKey))this._onDragStartAddItem(t);else{this.groupIds.length<1&&this.redraw();var r=this._getGroupIndex(i.data.group),a=this.options.itemsAlwaysDraggable.item&&!i.selected?[i.id]:this.getSelection();this.touchParams.itemProps=a.map(function(e){var i=o.items[e],n=o._getGroupIndex(i.data.group);return{item:i,initialX:t.center.x,groupOffset:r-n,data:this._cloneItemData(i.data)}}.bind(this))}t.stopPropagation()}else this.options.editable.add&&(t.srcEvent.ctrlKey||t.srcEvent.metaKey)&&this._onDragStartAddItem(t)}},n.prototype._onDragStartAddItem=function(t){var e,i,o=this.options.snap||null;this.options.rtl?(e=l.getAbsoluteRight(this.dom.frame),i=e-t.center.x+10):(e=l.getAbsoluteLeft(this.dom.frame),i=t.center.x-e-10);var n=this.body.util.toTime(i),s=this.body.util.getScale(),r=this.body.util.getStep(),a=o?o(n,s,r):n,h=a,d={type:"range",start:a,end:h,content:"new item"},u=l.randomUUID();d[this.itemsData._fieldId]=u;var c=this.groupFromTarget(t);c&&(d.group=c.groupId);var p=new b(d,this.conversion,this.options);p.id=u,p.data=this._cloneItemData(d),this._addItem(p),this.touchParams.selectedItem=p;var f={item:p,initialX:t.center.x,data:p.data};this.options.rtl?f.dragLeft=!0:f.dragRight=!0,this.touchParams.itemProps=[f],t.stopPropagation()},n.prototype._onDrag=function(t){if(this.touchParams.itemProps){t.stopPropagation();var e,i=this,o=this.options.snap||null;e=this.options.rtl?this.body.dom.root.offsetLeft+this.body.domProps.right.width:this.body.dom.root.offsetLeft+this.body.domProps.left.width;var n=this.body.util.getScale(),s=this.body.util.getStep(),r=this.touchParams.selectedItem,a=(this.options.editable.overrideItems||null==r.editable)&&this.options.editable.updateGroup||!this.options.editable.overrideItems&&null!=r.editable&&r.editable.updateGroup,h=null;if(a&&r&&void 0!=r.data.group){var d=i.groupFromTarget(t);d&&(h=this._getGroupIndex(d.groupId))}this.touchParams.itemProps.forEach(function(d){var u,c,p,f,m,v=i.body.util.toTime(t.center.x-e),g=i.body.util.toTime(d.initialX-e);u=this.options.rtl?-(v-g):v-g;var y=this._cloneItemData(d.item.data);if(null==d.item.editable||d.item.editable.updateTime||d.item.editable.updateGroup||i.options.editable.overrideItems){if((this.options.editable.overrideItems||null==r.editable)&&this.options.editable.updateTime||!this.options.editable.overrideItems&&null!=r.editable&&r.editable.updateTime)if(d.dragLeft)this.options.rtl?void 0!=y.end&&(p=l.convert(d.data.end,"Date"),m=new Date(p.valueOf()+u),y.end=o?o(m,n,s):m):void 0!=y.start&&(c=l.convert(d.data.start,"Date"),f=new Date(c.valueOf()+u),y.start=o?o(f,n,s):f);else if(d.dragRight)this.options.rtl?void 0!=y.start&&(c=l.convert(d.data.start,"Date"),f=new Date(c.valueOf()+u),y.start=o?o(f,n,s):f):void 0!=y.end&&(p=l.convert(d.data.end,"Date"),m=new Date(p.valueOf()+u),y.end=o?o(m,n,s):m);else if(void 0!=y.start)if(c=l.convert(d.data.start,"Date").valueOf(),f=new Date(c+u),void 0!=y.end){p=l.convert(d.data.end,"Date");var b=p.valueOf()-c.valueOf();y.start=o?o(f,n,s):f,y.end=new Date(y.start.valueOf()+b)}else y.start=o?o(f,n,s):f;if(a&&!d.dragLeft&&!d.dragRight&&null!=h&&void 0!=y.group){var _=h-d.groupOffset;_=Math.max(0,_),_=Math.min(i.groupIds.length-1,_),y.group=i.groupIds[_]}y=this._cloneItemData(y),i.options.onMoving(y,function(t){t&&d.item.setData(this._cloneItemData(t,"Date"))}.bind(this))}}.bind(this)),this.body.emitter.emit("_change")}},n.prototype._moveToGroup=function(t,e){var i=this.groups[e];if(i&&i.groupId!=t.data.group){var o=t.parent;o.remove(t),o.order(),t.data.group=i.groupId,i.add(t),i.order()}},n.prototype._onDragEnd=function(t){if(this.touchParams.itemIsDragging=!1,this.touchParams.itemProps){t.stopPropagation();var e=this,i=this.itemsData.getDataSet(),o=this.touchParams.itemProps;this.touchParams.itemProps=null,o.forEach(function(t){var o=t.item.id;if(null!=e.itemsData.get(o,e.itemOptions)){var n=this._cloneItemData(t.item.data);e.options.onMove(n,function(n){n?(n[i._fieldId]=o,i.update(n)):(t.item.setData(t.data),e.body.emitter.emit("_change"))})}else e.options.onAdd(t.item.data,function(i){e._removeItem(t.item),i&&e.itemsData.getDataSet().add(i),e.body.emitter.emit("_change")})}.bind(this))}},n.prototype._onGroupClick=function(t){var e=this.groupFromTarget(t);if(e&&e.nestedGroups){var i=this.groupsData.getDataSet(),o=i.get(e.groupId);void 0==o.showNested&&(o.showNested=!0),o.showNested=!o.showNested;var n=i.get(e.nestedGroups).map(function(t){return t.visible=o.showNested,t});if(i.update(n.concat(o)),o.showNested)l.removeClassName(e.dom.label,"collapsed"),l.addClassName(e.dom.label,"expanded");else{l.removeClassName(e.dom.label,"expanded");var s=this.options.rtl?"collapsed-rtl":"collapsed";l.addClassName(e.dom.label,s)}}},n.prototype._onGroupDragStart=function(t){this.options.groupEditable.order&&(this.groupTouchParams.group=this.groupFromTarget(t),this.groupTouchParams.group&&(t.stopPropagation(),this.groupTouchParams.originalOrder=this.groupsData.getIds({order:this.options.groupOrder})))},n.prototype._onGroupDrag=function(t){if(this.options.groupEditable.order&&this.groupTouchParams.group){t.stopPropagation();var e=this.groupsData;this.groupsData instanceof c&&(e=this.groupsData.getDataSet());var i=this.groupFromTarget(t);if(i&&i.height!=this.groupTouchParams.group.height){var o=i.top<this.groupTouchParams.group.top,n=t.center?t.center.y:t.clientY,s=l.getAbsoluteTop(i.dom.foreground),r=this.groupTouchParams.group.height;if(o){if(s+r<n)return}else{if(s+i.height-r>n)return}}if(i&&i!=this.groupTouchParams.group){var a=e.get(i.groupId),h=e.get(this.groupTouchParams.group.groupId);h&&a&&(this.options.groupOrderSwap(h,a,e),e.update(h),e.update(a));var d=e.getIds({order:this.options.groupOrder});if(!l.equalArray(d,this.groupTouchParams.originalOrder))for(var u=this.groupTouchParams.originalOrder,p=this.groupTouchParams.group.groupId,f=Math.min(u.length,d.length),m=0,v=0,g=0;m<f;){for(;m+v<f&&m+g<f&&d[m+v]==u[m+g];)m++;if(m+v>=f)break;
19287if(d[m+v]==p)v=1;else if(u[m+g]==p)g=1;else{var y=d.indexOf(u[m+g]),b=e.get(d[m+v]),_=e.get(u[m+g]);this.options.groupOrderSwap(b,_,e),e.update(b),e.update(_);var w=d[m+v];d[m+v]=u[m+g],d[y]=w,m++}}}}},n.prototype._onGroupDragEnd=function(t){if(this.options.groupEditable.order&&this.groupTouchParams.group){t.stopPropagation();var e=this,i=e.groupTouchParams.group.groupId,o=e.groupsData.getDataSet(),n=l.extend({},o.get(i));e.options.onMoveGroup(n,function(t){if(t)t[o._fieldId]=i,o.update(t);else{var n=o.getIds({order:e.options.groupOrder});if(!l.equalArray(n,e.groupTouchParams.originalOrder))for(var s=e.groupTouchParams.originalOrder,r=Math.min(s.length,n.length),a=0;a<r;){for(;a<r&&n[a]==s[a];)a++;if(a>=r)break;var h=n.indexOf(s[a]),d=o.get(n[a]),u=o.get(s[a]);e.options.groupOrderSwap(d,u,o),o.update(d),o.update(u);var c=n[a];n[a]=s[a],n[h]=c,a++}}}),e.body.emitter.emit("groupDragged",{groupId:i})}},n.prototype._onSelectItem=function(t){if(this.options.selectable){var e=t.srcEvent&&(t.srcEvent.ctrlKey||t.srcEvent.metaKey),i=t.srcEvent&&t.srcEvent.shiftKey;if(e||i)return void this._onMultiSelectItem(t);var o=this.getSelection(),n=this.itemFromTarget(t),s=n?[n.id]:[];this.setSelection(s);var r=this.getSelection();(r.length>0||o.length>0)&&this.body.emitter.emit("select",{items:r,event:t})}},n.prototype._onMouseOver=function(t){var e=this.itemFromTarget(t);if(e){if(e!==this.itemFromRelatedTarget(t)){var i=e.getTitle();if(this.options.showTooltips&&i){null==this.popup&&(this.popup=new w(this.body.dom.root,this.options.tooltip.overflowMethod||"flip")),this.popup.setText(i);var o=this.body.dom.centerContainer;this.popup.setPosition(t.clientX-l.getAbsoluteLeft(o)+o.offsetLeft,t.clientY-l.getAbsoluteTop(o)+o.offsetTop),this.popup.show()}else null!=this.popup&&this.popup.hide();this.body.emitter.emit("itemover",{item:e.id,event:t})}}},n.prototype._onMouseOut=function(t){var e=this.itemFromTarget(t);if(e){e!==this.itemFromRelatedTarget(t)&&(null!=this.popup&&this.popup.hide(),this.body.emitter.emit("itemout",{item:e.id,event:t}))}},n.prototype._onMouseMove=function(t){if(this.itemFromTarget(t)&&this.options.showTooltips&&this.options.tooltip.followMouse&&this.popup&&!this.popup.hidden){var e=this.body.dom.centerContainer;this.popup.setPosition(t.clientX-l.getAbsoluteLeft(e)+e.offsetLeft,t.clientY-l.getAbsoluteTop(e)+e.offsetTop),this.popup.show()}},n.prototype._onMouseWheel=function(t){this.touchParams.itemIsDragging&&this._onDragEnd(t)},n.prototype._onUpdateItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this;if(t){var i=e.itemsData.get(t.id);this.options.onUpdate(i,function(t){t&&e.itemsData.getDataSet().update(t)})}}},n.prototype._onDropObjectOnItem=function(t){var e=this.itemFromTarget(t),i=JSON.parse(t.dataTransfer.getData("text"));this.options.onDropObjectOnItem(i,e)},n.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e,i,o=this,n=this.options.snap||null;this.options.rtl?(e=l.getAbsoluteRight(this.dom.frame),i=e-t.center.x):(e=l.getAbsoluteLeft(this.dom.frame),i=t.center.x-e);var s,r,a=this.body.util.toTime(i),h=this.body.util.getScale(),d=this.body.util.getStep();"drop"==t.type?(r=JSON.parse(t.dataTransfer.getData("text")),r.content=r.content?r.content:"new item",r.start=r.start?r.start:n?n(a,h,d):a,r.type=r.type||"box",r[this.itemsData._fieldId]=r.id||l.randomUUID(),"range"!=r.type||r.end||(s=this.body.util.toTime(i+this.props.width/5),r.end=n?n(s,h,d):s)):(r={start:n?n(a,h,d):a,content:"new item"},r[this.itemsData._fieldId]=l.randomUUID(),"range"===this.options.type&&(s=this.body.util.toTime(i+this.props.width/5),r.end=n?n(s,h,d):s));var u=this.groupFromTarget(t);u&&(r.group=u.groupId),r=this._cloneItemData(r),this.options.onAdd(r,function(e){e&&(o.itemsData.getDataSet().add(e),"drop"==t.type&&o.setSelection([e.id]))})}},n.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e=this.itemFromTarget(t);if(e){
19288    var i=this.options.multiselect?this.getSelection():[];if((t.srcEvent&&t.srcEvent.shiftKey||!1)&&this.options.multiselect){var o=this.itemsData.get(e.id).group,s=void 0;this.options.multiselectPerGroup&&i.length>0&&(s=this.itemsData.get(i[0]).group),this.options.multiselectPerGroup&&void 0!=s&&s!=o||i.push(e.id);var r=n._getItemRange(this.itemsData.get(i,this.itemOptions));if(!this.options.multiselectPerGroup||s==o){i=[];for(var a in this.items)if(this.items.hasOwnProperty(a)){var h=this.items[a],d=h.data.start,l=void 0!==h.data.end?h.data.end:d;!(d>=r.min&&l<=r.max)||this.options.multiselectPerGroup&&s!=this.itemsData.get(h.id).group||h instanceof _||i.push(h.id)}}}else{var u=i.indexOf(e.id);-1==u?i.push(e.id):i.splice(u,1)}this.setSelection(i),this.body.emitter.emit("select",{items:this.getSelection(),event:t})}}},n._getItemRange=function(t){var e=null,i=null;return t.forEach(function(t){(null==i||t.start<i)&&(i=t.start),void 0!=t.end?(null==e||t.end>e)&&(e=t.end):(null==e||t.start>e)&&(e=t.start)}),{min:i,max:e}},n.prototype.itemFromElement=function(t){for(var e=t;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},n.prototype.itemFromTarget=function(t){return this.itemFromElement(t.target)},n.prototype.itemFromRelatedTarget=function(t){return this.itemFromElement(t.relatedTarget)},n.prototype.groupFromTarget=function(t){var e=t.center?t.center.y:t.clientY,i=this.groupIds;i.length<=0&&this.groupsData&&(i=this.groupsData.getIds({order:this.options.groupOrder}));for(var o=0;o<i.length;o++){var n=i[o],s=this.groups[n],r=s.dom.foreground,a=l.getAbsoluteTop(r);if(e>a&&e<a+r.offsetHeight)return s;if("top"===this.options.orientation.item){if(o===this.groupIds.length-1&&e>a)return s}else if(0===o&&e<a+r.offset)return s}return null},n.itemSetFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-itemset"))return e["timeline-itemset"];e=e.parentNode}return null},n.prototype._cloneItemData=function(t,e){var i=l.extend({},t);return e||(e=this.itemsData.getDataSet()._options.type),void 0!=i.start&&(i.start=l.convert(i.start,e&&e.start||"Date")),void 0!=i.end&&(i.end=l.convert(i.end,e&&e.end||"Date")),i},t.exports=n}
19288,function(t,e,i){e.orderByStart=function(t){t.sort(function(t,e){return t.data.start-e.data.start})},e.orderByEnd=function(t){t.sort(function(t,e){return("end"in t.data?t.data.end:t.data.start)-("end"in e.data?e.data.end:e.data.start)})},e.stack=function(t,i,o){if(o)for(var n=0;n<t.length;n++)t[n].top=null;for(var n=0;n<t.length;n++){var s=t[n];if(s.stack&&null===s.top){s.top=i.axis;do{for(var r=null,a=0,h=t.length;a<h;a++){var d=t[a];if(null!==d.top&&d!==s&&d.stack&&e.collision(s,d,i.item,d.options.rtl)){r=d;break}}null!=r&&(s.top=r.top+r.height+i.item.vertical)}while(r)}}},e.substack=function(t,i,o){for(var n=0;n<t.length;n++)t[n].top=null;var s=o.height;for(n=0;n<t.length;n++){var r=t[n];if(r.stack&&null===r.top){r.top=r.baseTop;do{for(var a=null,h=0,d=t.length;h<d;h++){var l=t[h];if(null!==l.top&&l!==r&&e.collision(r,l,i.item,l.options.rtl)){a=l;break}}null!=a&&(r.top=a.top+a.height+i.item.vertical),r.top+r.height>s&&(s=r.top+r.height)}while(a)}}o.height=s-o.top+.5*i.item.vertical},e.nostack=function(t,i,o,n){for(var s=0;s<t.length;s++)if(void 0==t[s].data.subgroup)t[s].top=i.item.vertical;else if(void 0!==t[s].data.subgroup&&n){var r=0;for(var a in o)o.hasOwnProperty(a)&&1==o[a].visible&&o[a].index<o[t[s].data.subgroup].index&&(r+=o[a].height,o[t[s].data.subgroup].top=r);t[s].top=r+.5*i.item.vertical}n||e.stackSubgroups(t,i,o)},e.stackSubgroups=function(t,i,o){for(var n in o)if(o.hasOwnProperty(n)){o[n].top=0;do{var s=null;for(var r in o)if(null!==o[r].top&&r!==n&&o[n].index>o[r].index&&e.collisionByTimes(o[n],o[r])){s=o[r];break}null!=s&&(o[n].top=s.top+s.height)}while(s)}for(var a=0;a<t.length;a++)void 0!==t[a].data.subgroup&&(t[a].top=o[t[a].data.subgroup].top+.5*i.item.vertical)},e.stackSubgroupsWithInnerStack=function(t,i,o){var n=!1,s=[];for(var r in o)o[r].hasOwnProperty("index")?s[o[r].index]=r:s.push(r);for(var a=0;a<s.length;a++)if(r=s[a],o.hasOwnProperty(r)){n=n||o[r].stack,o[r].top=0;for(var h in o)o[h].visible&&o[r].index>o[h].index&&(o[r].top+=o[h].height);for(var d=t[r],l=0;l<d.length;l++)void 0!==d[l].data.subgroup&&(d[l].top=o[d[l].data.subgroup].top+.5*i.item.vertical,o[r].stack&&(d[l].baseTop=d[l].top));n&&o[r].stack&&e.substack(t[r],i,o[r])}},e.collision=function(t,e,i,o){return o?t.right-i.horizontal+.001<e.right+e.width&&t.right+t.width+i.horizontal-.001>e.right&&t.top-i.vertical+.001<e.top+e.height&&t.top+t.height+i.vertical-.001>e.top:t.left-i.horizontal+.001<e.left+e.width&&t.left+t.width+i.horizontal-.001>e.left&&t.top-i.vertical+.001<e.top+e.height&&t.top+t.height+i.vertical-.001>e.top},e.collisionByTimes=function(t,e){return t.start<=e.start&&t.end>=e.start&&t.top<e.top+e.height&&t.top+t.height>e.top||e.start<=t.start&&e.end>=t.start&&e.top<t.top+t.height&&e.top+e.height>t.top}},function(t,e,i){function o(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},this.options=i,t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);n.call(this,t,e,i)}var n=i(38);o.prototype=new n(null,null,null),o.prototype.isVisible=function(t){var e=this.options.align,i=this.width*t.getMillisecondsPerPixel();return"right"==e?this.data.start.getTime()>t.start&&this.data.start.getTime()-i<t.end:"left"==e?this.data.start.getTime()+i>t.start&&this.data.start.getTime()<t.end:this.data.start.getTime()+i/2>t.start&&this.data.start.getTime()-i/2<t.end},o.prototype._createDomElement=function(){this.dom||(this.dom={},this.dom.box=document.createElement("DIV"),this.dom.content=document.createElement("DIV"),this.dom.content.className="vis-item-content",this.dom.box.appendChild(this.dom.content),this.dom.line=document.createElement("DIV"),this.dom.line.className="vis-line",this.dom.dot=document.createElement("DIV"),this.dom.dot.className="vis-dot",this.dom.box["timeline-item"]=this,this.dirty=!0)},o.prototype._appendDomElement=function(){if(!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!this.dom.box.parentNode){var t=this.parent.dom.foreground;if(!t)throw new Error("Cannot redraw item: parent has no foreground container element");t.appendChild(this.dom.box)}if(!this.dom.line.parentNode){var e=this.parent.dom.background;if(!e)throw new Error("Cannot redraw item: parent has no background container element");e.appendChild(this.dom.line)}if(!this.dom.dot.parentNode){var i=this.parent.dom.axis;
19288if(!e)throw new Error("Cannot redraw item: parent has no axis container element");i.appendChild(this.dom.dot)}this.displayed=!0},o.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content),this._updateDataAttributes(this.dom.box),this._updateStyle(this.dom.box);var t=this.editable.updateTime||this.editable.updateGroup,e=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"")+(t?" vis-editable":" vis-readonly");this.dom.box.className="vis-item vis-box"+e,this.dom.line.className="vis-item vis-line"+e,this.dom.dot.className="vis-item vis-dot"+e}},o.prototype._getDomComponentsSizes=function(){return{previous:{right:this.dom.box.style.right,left:this.dom.box.style.left},dot:{height:this.dom.dot.offsetHeight,width:this.dom.dot.offsetWidth},line:{width:this.dom.line.offsetWidth},box:{width:this.dom.box.offsetWidth,height:this.dom.box.offsetHeight}}},o.prototype._updateDomComponentsSizes=function(t){this.options.rtl?this.dom.box.style.right="0px":this.dom.box.style.left="0px",this.props.dot.height=t.dot.height,this.props.dot.width=t.dot.width,this.props.line.width=t.line.width,this.width=t.box.width,this.height=t.box.height,this.options.rtl?this.dom.box.style.right=t.previous.right:this.dom.box.style.left=t.previous.left,this.dirty=!1},o.prototype._repaintDomAdditionals=function(){this._repaintOnItemUpdateTimeTooltip(this.dom.box),this._repaintDragCenter(),this._repaintDeleteButton(this.dom.box)},o.prototype.redraw=function(t){var e,i=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){this.dirty&&(e=this._getDomComponentsSizes())}.bind(this),function(){this.dirty&&this._updateDomComponentsSizes.bind(this)(e)}.bind(this),this._repaintDomAdditionals.bind(this)];if(t)return i;var o;return i.forEach(function(t){o=t()}),o},o.prototype.show=function(){this.displayed||this.redraw()},o.prototype.hide=function(){if(this.displayed){var t=this.dom;t.box.parentNode&&t.box.parentNode.removeChild(t.box),t.line.parentNode&&t.line.parentNode.removeChild(t.line),t.dot.parentNode&&t.dot.parentNode.removeChild(t.dot),this.displayed=!1}},o.prototype.repositionX=function(){var t=this.conversion.toScreen(this.data.start),e=this.options.align;"right"==e?this.options.rtl?(this.right=t-this.width,this.dom.box.style.right=this.right+"px",this.dom.line.style.right=t-this.props.line.width+"px",this.dom.dot.style.right=t-this.props.line.width/2-this.props.dot.width/2+"px"):(this.left=t-this.width,this.dom.box.style.left=this.left+"px",this.dom.line.style.left=t-this.props.line.width+"px",this.dom.dot.style.left=t-this.props.line.width/2-this.props.dot.width/2+"px"):"left"==e?this.options.rtl?(this.right=t,this.dom.box.style.right=this.right+"px",this.dom.line.style.right=t+"px",this.dom.dot.style.right=t+this.props.line.width/2-this.props.dot.width/2+"px"):(this.left=t,this.dom.box.style.left=this.left+"px",this.dom.line.style.left=t+"px",this.dom.dot.style.left=t+this.props.line.width/2-this.props.dot.width/2+"px"):this.options.rtl?(this.right=t-this.width/2,this.dom.box.style.right=this.right+"px",this.dom.line.style.right=t-this.props.line.width+"px",this.dom.dot.style.right=t-this.props.dot.width/2+"px"):(this.left=t-this.width/2,this.dom.box.style.left=this.left+"px",this.dom.line.style.left=t-this.props.line.width/2+"px",this.dom.dot.style.left=t-this.props.dot.width/2+"px")},o.prototype.repositionY=function(){var t=this.options.orientation.item,e=this.dom.box,i=this.dom.line,o=this.dom.dot;if("top"==t)e.style.top=(this.top||0)+"px",i.style.top="0",i.style.height=this.parent.top+this.top+1+"px",i.style.bottom="";else{var n=this.parent.itemSet.props.height,s=n-this.parent.top-this.parent.height+this.top;e.style.top=(this.parent.height-this.top-this.height||0)+"px",i.style.top=n-s+"px",i.style.bottom="0"}o.style.top=-this.props.dot.height/2+"px"},o.prototype.getWidthLeft=function(){return this.width/2},o.prototype.getWidthRight=function(){return this.width/2},t.exports=o},function(t,e,i){function o(t,e,i){if(this.props={dot:{top:0,width:0,height:0},content:{height:0,marginLeft:0,marginRight:0}},this.options=i,t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);n.call(this,t,e,i)}var n=i(38);o.prototype=new n(null,null,null),o.prototype.isVisible=function(t){var e=this.width*t.getMillisecondsPerPixel();return this.data.start.getTime()+e>t.start&&this.data.start<t.end},o.prototype._createDomElement=function(){this.dom||(this.dom={},this.dom.point=document.createElement("div"),this.dom.content=document.createElement("div"),this.dom.content.className="vis-item-content",this.dom.point.a
19288ppendChild(this.dom.content),this.dom.dot=document.createElement("div"),this.dom.point.appendChild(this.dom.dot),this.dom.point["timeline-item"]=this,this.dirty=!0)},o.prototype._appendDomElement=function(){if(!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!this.dom.point.parentNode){var t=this.parent.dom.foreground;if(!t)throw new Error("Cannot redraw item: parent has no foreground container element");t.appendChild(this.dom.point)}this.displayed=!0},o.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content),this._updateDataAttributes(this.dom.point),this._updateStyle(this.dom.point);var t=this.editable.updateTime||this.editable.updateGroup,e=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"")+(t?" vis-editable":" vis-readonly");this.dom.point.className="vis-item vis-point"+e,this.dom.dot.className="vis-item vis-dot"+e}},o.prototype._getDomComponentsSizes=function(){return{dot:{width:this.dom.dot.offsetWidth,height:this.dom.dot.offsetHeight},content:{width:this.dom.content.offsetWidth,height:this.dom.content.offsetHeight},point:{width:this.dom.point.offsetWidth,height:this.dom.point.offsetHeight}}},o.prototype._updateDomComponentsSizes=function(t){this.props.dot.width=t.dot.width,this.props.dot.height=t.dot.height,this.props.content.height=t.content.height,this.options.rtl?this.dom.content.style.marginRight=2*this.props.dot.width+"px":this.dom.content.style.marginLeft=2*this.props.dot.width+"px",this.width=t.point.width,this.height=t.point.height,this.dom.dot.style.top=(this.height-this.props.dot.height)/2+"px",this.options.rtl?this.dom.dot.style.right=this.props.dot.width/2+"px":this.dom.dot.style.left=this.props.dot.width/2+"px",this.dirty=!1},o.prototype._repaintDomAdditionals=function(){this._repaintOnItemUpdateTimeTooltip(this.dom.point),this._repaintDragCenter(),this._repaintDeleteButton(this.dom.point)},o.prototype.redraw=function(t){var e,i=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){this.dirty&&(e=this._getDomComponentsSizes())}.bind(this),function(){this.dirty&&this._updateDomComponentsSizes.bind(this)(e)}.bind(this),this._repaintDomAdditionals.bind(this)];if(t)return i;var o;return i.forEach(function(t){o=t()}),o},o.prototype.show=function(){this.displayed||this.redraw()},o.prototype.hide=function(){this.displayed&&(this.dom.point.parentNode&&this.dom.point.parentNode.removeChild(this.dom.point),this.displayed=!1)},o.prototype.repositionX=function(){var t=this.conversion.toScreen(this.data.start);this.options.rtl?(this.right=t-this.props.dot.width,this.dom.point.style.right=this.right+"px"):(this.left=t-this.props.dot.width,this.dom.point.style.left=this.left+"px")},o.prototype.repositionY=function(){var t=this.options.orientation.item,e=this.dom.point;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},o.prototype.getWidthLeft=function(){return this.props.dot.width},o.prototype.getWidthRight=function(){return this.props.dot.width},t.exports=o},function(t,e,i){function o(t,e,i){if(this.props={content:{width:0}},this.overflow=!1,t){if(void 0==t.start)throw new Error('Property "start" missing in item '+t.id);if(void 0==t.end)throw new Error('Property "end" missing in item '+t.id)}n.call(this,t,e,i)}var n=i(38),s=i(69),r=i(70);o.prototype=new n(null,null,null),o.prototype.baseClassName="vis-item vis-background",o.prototype.stack=!1,o.prototype.isVisible=function(t){return this.data.start<t.end&&this.data.end>t.start},o.prototype._createDomElement=function(){this.dom||(this.dom={},this.dom.box=document.createElement("div"),this.dom.frame=document.createElement("div"),this.dom.frame.className="vis-item-overflow",this.dom.box.appendChild(this.dom.frame),this.dom.content=document.createElement("div"),this.dom.content.className="vis-item-content",this.dom.frame.appendChild(this.dom.content),this.dirty=!0)},o.prototype._appendDomElement=function(){if(!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!this.dom.box.parentNode){var t=this.parent.dom.background;if(!t)throw new Error("Cannot redraw item: parent has no background container element");t.appendChild(this.dom.box)}this.displayed=!0},o.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content),this._updateDataAttributes(this.dom.content),this._updateStyle(this.dom.box);var t=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"");this.dom.box.className=this.baseClassName+t}},o.prototype._getDomComponentsSizes=function(){return this.overflow="hidden"!==window.getComputedStyle(this.dom.content).overflow,{content:{width:this.dom.content.offsetWidth}}},o.prototype._updateDomComponentsSizes=function(t){this.props.content.width=t.content.width,this.height=0,this.dirty=!1},o.prototype._repaintDomAdditionals=function(){},o.prototype.redraw=function(t){var e,i=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){this.dirty&&(e=this._getDomComponentsSizes.bind(this)())}.bind(this),function(){this.dirty&&this._updateDomComponentsSizes.bind(this)(e)}.bind(this),this._repaintDomAdditionals.bind(this)];if(t)return i;var o;
19288return i.forEach(function(t){o=t()}),o},o.prototype.show=r.prototype.show,o.prototype.hide=r.prototype.hide,o.prototype.repositionX=r.prototype.repositionX,o.prototype.repositionY=function(t){var e,i=this.options.orientation.item;if(void 0!==this.data.subgroup){var o=this.data.subgroup;this.dom.box.style.height=this.parent.subgroups[o].height+"px",this.dom.box.style.top="top"==i?this.parent.top+this.parent.subgroups[o].top+"px":this.parent.top+this.parent.height-this.parent.subgroups[o].top-this.parent.subgroups[o].height+"px",this.dom.box.style.bottom=""}else this.parent instanceof s?(e=Math.max(this.parent.height,this.parent.itemSet.body.domProps.center.height,this.parent.itemSet.body.domProps.centerContainer.height),this.dom.box.style.bottom="bottom"==i?"0":"",this.dom.box.style.top="top"==i?"0":""):(e=this.parent.height,this.dom.box.style.top=this.parent.top+"px",this.dom.box.style.bottom="");this.dom.box.style.height=e+"px"},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i){(0,s.default)(this,t),this.container=e,this.overflowMethod=i||"cap",this.x=0,this.y=0,this.padding=5,this.hidden=!1,this.frame=document.createElement("div"),this.frame.className="vis-tooltip",this.container.appendChild(this.frame)}return(0,a.default)(t,[{key:"setPosition",value:function(t,e){this.x=parseInt(t),this.y=parseInt(e)}},{key:"setText",value:function(t){t instanceof Element?(this.frame.innerHTML="",this.frame.appendChild(t)):this.frame.innerHTML=t}},{key:"show",value:function(t){if(void 0===t&&(t=!0),!0===t){var e=this.frame.clientHeight,i=this.frame.clientWidth,o=this.frame.parentNode.clientHeight,n=this.frame.parentNode.clientWidth,s=0,r=0;if("flip"==this.overflowMethod){var a=!1,h=!0;this.y-e<this.padding&&(h=!1),this.x+i>n-this.padding&&(a=!0),s=a?this.x-i:this.x,r=h?this.y-e:this.y}else r=this.y-e,r+e+this.padding>o&&(r=o-e-this.padding),r<this.padding&&(r=this.padding),s=this.x,s+i+this.padding>n&&(s=n-i-this.padding),s<this.padding&&(s=this.padding);this.frame.style.left=s+"px",this.frame.style.top=r+"px",this.frame.style.visibility="visible",this.hidden=!1}else this.hide()}},{key:"hide",value:function(){this.hidden=!0,this.frame.style.left="0",this.frame.style.top="0",this.frame.style.visibility="hidden"}},{key:"destroy",value:function(){this.frame.parentNode.removeChild(this.frame)}}]),t}();e.default=h},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var o="string",n="boolean",s="number",r="object",a={configure:{enabled:{boolean:n},filter:{boolean:n,function:"function"},container:{dom:"dom"},__type__:{object:r,boolean:n,function:"function"}},align:{string:o},rtl:{boolean:n,undefined:"undefined"},rollingMode:{follow:{boolean:n},offset:{number:s,undefined:"undefined"},__type__:{object:r}},verticalScroll:{boolean:n,undefined:"undefined"},horizontalScroll:{boolean:n,undefined:"undefined"},autoResize:{boolean:n},throttleRedraw:{number:s},clickToUse:{boolean:n},dataAttributes:{string:o,array:"array"},editable:{add:{boolean:n,undefined:"undefined"},remove:{boolean:n,undefined:"undefined"},updateGroup:{boolean:n,undefined:"undefined"},updateTime:{boolean:n,undefined:"undefined"},overrideItems:{boolean:n,undefined:"undefined"},__type__:{boolean:n,object:r}},end:{number:s,date:"date",string:o,moment:"moment"},format:{minorLabels:{millisecond:{string:o,undefined:"undefined"},second:{string:o,undefined:"undefined"},minute:{string:o,undefined:"undefined"},hour:{string:o,undefined:"undefined"},weekday:{string:o,undefined:"undefined"},day:{string:o,undefined:"undefined"},week:{string:o,undefined:"undefined"},month:{string:o,undefined:"undefined"},year:{string:o,undefined:"undefined"},__type__:{object:r,function:"function"}},majorLabels:{millisecond:{string:o,undefined:"undefined"},second:{string:o,undefined:"undefined"},minute:{string:o,undefined:"undefined"},hour:{string:o,undefined:"undefined"},weekday:{string:o,undefined:"undefined"},day:{string:o,undefined:"undefined"},week:{string:o,undefined:"undefined"},month:{string:o,undefined:"undefined"},year:{string:o,undefined:"undefined"},__type__:{object:r,function:"function"}},__type__:{object:r}},moment:{function:"function"},groupOrder:{string:o,function:"function"},groupEditable:{add:{boolean:n,undefined:"undefined"},remove:{boolean:n,undefined:"undefined"},order:{boolean:n,undefined:"undefined"},__type__:{boolean:n,object:r}},groupOrderSwap:{function:"function"},height:{string:o,number:s},hiddenDates:{start:{date:"date",number:s,string:o,moment:"moment"},end:{date:"date",number:s,string:o,moment:"moment"},repeat:{string:o},__type__:{object:r,array:"array"}},itemsAlwaysDraggable:{item:{boolean:n,undefined:"undefined"},range:{boolean:n,undefined:"undefined"},__type__:{boolean:n,object:r}},limitSize:{boolean:n},locale:{string:o},locales:{__any__:{any:"any"},__type__:{object:r}},margin:{axis:{number:s},item:{horizontal:{number:s,undefined:"undefined"},vertical:{number:s,undefined:"undefined"},__type__:{object:r,number:s}},__type__:{object:r,number:s}},max:{date:"date",number:s,string:o,moment:"moment"},maxHeight:{number:s,string:o},maxMinorChars:{number:s},min:{date:"date",number:s,string:o,moment:"moment"},minHeight:{number:s,string:o},moveable:{boolean:n},multiselect:{boolean:n},multiselectPerGroup:{boolean:n},onAdd:{function:"function"},onDropObjectOnItem:{function:"function"},onUpdate:{function:"function"},onMove:{function:"function"},onMoving:{function:"function"},onRemove:{function:"function"},onAddGroup:{function:"function"},onMoveGroup:{function:"function"},onRemoveGroup:{function:"function"},onInitialDrawComplete:{function:"function"},order:{function:"function"},orientation:{axis:{string:o,undefined:"undefined"},item:{string:o,undefined:"undefined"},__type__:{string:o,object:r}},selectable:{boolean:n},showCurrentTime:{boolean:n},showMajorLabels:{boolean:n},showMinorLabels:{boolean:n},stack:{boolean:n},stackSubgroups:{boolean:n},snap:{function:"function",null:"null"},start:{date:"date",number:s,string:o,moment:"moment"},template:{function:"function"},groupTemplate:{function:"function"},visibleFrameTemplate:{string:o,function:"function"},showTooltips:{boolean:n},tooltip:{followMouse:{boolean:n},overflowMethod:{string:["cap","flip"]},__type__:{object:r}},tooltipOnItemUpdateTime:{template:{function:"function"},__type__:{boolean:n,object:r}},timeAxis:{scale:{string:o,undefined:"undefined"},step:{number:s,undefined:"undefined"},__type__:{object:r}},type:{string:o},width:{string:o,number:s},zoomable:{boolean:n},zoomKey:{string:["ctrlKey","altKey","metaKey",""]},zoomMax:{number:s},zoomMin:{number:s},__type__:{object:r}},h={global:{align:["center","left","right"],direction:!1,autoResize:!0,clickToUse:!1,editable:{add:!1,remove:!1,updateGroup:!1,updateTime:!1},end:"",format:{minorLabels:{millisecond:"SSS",second:"s",minute:"HH:mm",hour:"HH:mm",weekday:"ddd D",day:"D",week:"w",month:"MMM",year:"YYYY"},majorLabels:{millisecond:"HH:mm:ss",second:"D MMMM HH:mm",minute:"ddd D MMMM",hour:"ddd D MMMM",weekday:"MMMM YYYY",day:"MMMM YYYY",week:"MMMM YYYY",month:"YYYY",year:""}},groupsDraggable:!1,height:"",locale:"",margin:{axis:[20,0,100,1],item:{horizontal:[10,0,100,1],vertical:[10,0,100,1]}},max:"",maxHeight:"",maxMinorChars:[7,0,20,1],min:"",minHeight:"",moveable:!1,multiselect:!1,multiselectPerGroup:!1,orientation:{axis:["both","bottom","top"],item:["bottom","top"]},selectable:!0,showCurrentTime:!1,showMajorLabels:!0,showMinorLabels:!0,stack:!0,stackSubgroups:!0,start:"",showTooltips:!0,tooltip:{followMouse:!1,overflowMethod:"flip"},tooltipOnItemUpdateTime:!1,type:["box","point","range","background"],width:"100%",zoomable:!0,zoomKey:["ctrlKey","altKey","metaKey",""],zoomMax:[31536e10,10,31536e10,1],zoomMin:[10,10,31536e10,1]}};e.allOptions=a,e.configureOptions=h}
vendor: 5,713 bytes, line 19288
19288,function(t,e,i){function o(t,e){this.id=r.randomUUID(),this.body=t,this.defaultOptions={yAxisOrientation:"left",defaultGroup:"default",sort:!0,sampling:!0,stack:!1,graphHeight:"400px",shaded:{enabled:!1,orientation:"bottom"},style:"line",barChart:{width:50,sideBySide:!1,align:"center"},interpolation:{enabled:!0,parametrization:"centripetal",alpha:.5},drawPoints:{enabled:!0,size:6,style:"square"},dataAxis:{},legend:{},groups:{visibility:{}}},this.options=r.extend({},this.defaultOptions),this.dom={},this.props={},this.hammer=null,this.groups={},this.abortedGraphUpdate=!1,this.updateSVGheight=!1,this.updateSVGheightOnResize=!1,this.forceGraphUpdate=!0;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e,o){i._onAdd(e.items)},update:function(t,e,o){i._onUpdate(e.items)},remove:function(t,e,o){i._onRemove(e.items)}},this.groupListeners={add:function(t,e,o){i._onAddGroups(e.items)},update:function(t,e,o){i._onUpdateGroups(e.items)},remove:function(t,e,o){i._onRemoveGroups(e.items)}},this.items={},this.selection=[],this.lastStart=this.body.range.start,this.touchParams={},this.svgElements={},this.setOptions(e),this.groupsUsingDefaultStyles=[0],this.body.emitter.on("rangechanged",function(){i.lastStart=i.body.range.start,i.svg.style.left=r.option.asSize(-i.props.width),i.forceGraphUpdate=!0,i.redraw.call(i)}),this._create(),this.framework={svg:this.svg,svgElements:this.svgElements,options:this.options,groups:this.groups}}var n=i(6),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(14),h=i(11),d=i(12),l=i(16),u=i(107),c=i(109),p=i(112),f=i(110),m=i(111),v=i(72);o.prototype=new l,o.prototype._create=function(){var t=document.createElement("div");t.className="vis-line-graph",this.dom.frame=t,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="relative",this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",this.svg.style.display="block",t.appendChild(this.svg),this.options.dataAxis.orientation="left",this.yAxisLeft=new u(this.body,this.options.dataAxis,this.svg,this.options.groups),this.options.dataAxis.orientation="right",this.yAxisRight=new u(this.body,this.options.dataAxis,this.svg,this.options.groups),delete this.options.dataAxis.orientation,this.legendLeft=new p(this.body,this.options.legend,"left",this.options.groups),this.legendRight=new p(this.body,this.options.legend,"right",this.options.groups),this.show()},o.prototype.setOptions=function(t){if(t){var e=["sampling","defaultGroup","stack","height","graphHeight","yAxisOrientation","style","barChart","dataAxis","sort","groups"];void 0===t.graphHeight&&void 0!==t.height?(this.updateSVGheight=!0,this.updateSVGheightOnResize=!0):void 0!==this.body.domProps.centerContainer.height&&void 0!==t.graphHeight&&parseInt((t.graphHeight+"").replace("px",""))<this.body.domProps.centerContainer.height&&(this.updateSVGheight=!0),r.selectiveDeepExtend(e,this.options,t),r.mergeOptions(this.options,t,"interpolation"),r.mergeOptions(this.options,t,"drawPoints"),r.mergeOptions(this.options,t,"shaded"),r.mergeOptions(this.options,t,"legend"),t.interpolation&&"object"==(0,s.default)(t.interpolation)&&t.interpolation.parametrization&&("uniform"==t.interpolation.parametrization?this.options.interpolation.alpha=0:"chordal"==t.interpolation.parametrization?this.options.interpolation.alpha=1:(this.options.interpolation.parametrization="centripetal",this.options.interpolation.alpha=.5)),this.yAxisLeft&&void 0!==t.dataAxis&&(this.yAxisLeft.setOptions(this.options.dataAxis),this.yAxisRight.setOptions(this.options.dataAxis)),this.legendLeft&&void 0!==t.legend&&(this.legendLeft.setOptions(this.options.legend),this.legendRight.setOptions(this.options.legend)),this.groups.hasOwnProperty("__ungrouped__")&&this.groups.__ungrouped__.setOptions(t)}this.dom.frame&&(this.forceGraphUpdate=!0,this.body.emitter.emit("_change",{queue:!0}))},o.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},o.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},o.prototype.setItems=function(t){var e,i=this,o=this.itemsData;if(t){if(!(t instanceof h||t instanceof d))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(o&&(r.forEach(this.itemListeners,function(t,e){o.off(e,t)}),e=o.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;r.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e)}},o.prototype.setGroups=function(t){var e,i=this;if(this.groupsData){r.forEach(this.groupListeners,function(t,e){i.groupsData.off(e,t)}),e=this.groupsData.getIds(),this.groupsData=null;for(var o=0;o<e.length;o++)this._removeGroup(e[o])}if(t){if(!(t instanceof h||t instanceof d))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var n=this.id;r.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,n)}),e=this.groupsData.getIds(),this._onAddGroups(e)}},o.prototype._onUpdate=function(t){this._updateAllGroupData(t)},o.prototype._onAdd=function(t){this._onUpdate(t)},o.prototype._onRemove=function(t){this._onUpdate(t)},o.prototype._onUpdateGroups=function(t){this._updateAllGroupData(null,t)},o.prototype._onAddGroups=function(t){this._onUpdateGroups(t)},o.prototype._onRemoveGroups=function(t){for(var e=0;e<t.length;e++)this._removeGroup(t[e]);this.forceGraphUpdate=!0,this.body.emitter.emit("_change",{queue:!0})},o.prototype._removeGroup=function(t){this.groups.hasOwnProperty(t)&&("right"==this.groups[t].options.yAxisOr
19288ientation?(this.yAxisRight.removeGroup(t),this.legendRight.removeGroup(t),this.legendRight.redraw()):(this.yAxisLeft.removeGroup(t),this.legendLeft.removeGroup(t),this.legendLeft.redraw()),delete this.groups[t])},o.prototype._updateGroup=function(t,e){this.groups.hasOwnProperty(e)?(this.groups[e].update(t),"right"==this.groups[e].options.yAxisOrientation?(this.yAxisRight.updateGroup(e,this.groups[e]),this.legendRight.updateGroup(e,this.groups[e]),this.yAxisLeft.removeGroup(e),this.legendLeft.removeGroup(e)):(this.yAxisLeft.updateGroup(e,this.groups[e]),this.legendLeft.updateGroup(e,this.groups[e]),this.yAxisRight.removeGroup(e),this.legendRight.removeGroup(e))):(this.groups[e]=new c(t,e,this.options,this.groupsUsingDefaultStyles),"right"==this.groups[e].options.yAxisOrientation?(this.yAxisRight.addGroup(e,this.groups[e]),this.legendRight.addGroup(e,this.groups[e])):(this.yAxisLeft.addGroup(e,this.groups[e]),this.legendLeft.addGroup(e,this.groups[e]))),this.legendLeft.redraw(),this.legendRight.redraw()},o.prototype._updateAllGroupData=function(t,e){if(null!=this.itemsData){var i={},o=this.itemsData.get(),n=this.itemsData._fieldId,s={};t&&t.map(function(t){s[t]=t});for(var a={},h=0;h<o.length;h++){var d=o[h],l=d.group;null!==l&&void 0!==l||(l="__ungrouped__"),a.hasOwnProperty(l)?a[l]++:a[l]=1}var u={};if(!e&&t)for(l in this.groups)if(this.groups.hasOwnProperty(l)){v=this.groups[l];var c=v.getItems();i[l]=c.filter(function(t){return u[t[n]]=t[n],t[n]!==s[t[n]]});var p=a[l];a[l]-=i[l].length,i[l].length<p&&(i[l][p-1]={})}for(h=0;h<o.length;h++)if(d=o[h],l=d.group,null!==l&&void 0!==l||(l="__ungrouped__"),e||!t||d[n]===s[d[n]]||!u.hasOwnProperty(d[n])){i.hasOwnProperty(l)||(i[l]=new Array(a[l]));var f=r.bridgeObject(d);f.x=r.convert(d.x,"Date"),f.end=r.convert(d.end,"Date"),f.orginalY=d.y,f.y=Number(d.y),
19289    f[n]=d[n];var m=i[l].length-a[l]--;i[l][m]=f}for(l in this.groups)this.groups.hasOwnProperty(l)&&(i.hasOwnProperty(l)||(i[l]=new Array(0)));for(l in i)if(i.hasOwnProperty(l))if(0==i[l].length)this.groups.hasOwnProperty(l)&&this._removeGroup(l);else{var v=void 0;void 0!=this.groupsData&&(v=this.groupsData.get(l)),void 0==v&&(v={id:l,content:this.options.defaultGroup+l}),this._updateGroup(v,l),this.groups[l].setItems(i[l])}this.forceGraphUpdate=!0,this.body.emitter.emit("_change",{queue:!0})}},o.prototype.redraw=function(){var t=!1;this.props.width=this.dom.frame.offsetWidth,this.props.height=this.body.domProps.centerContainer.height-this.body.domProps.border.top-this.body.domProps.border.bottom,t=this._isResized()||t;var e=this.body.range.end-this.body.range.start,i=e!=this.lastVisibleInterval;if(this.lastVisibleInterval=e,1==t&&(this.svg.style.width=r.option.asSize(3*this.props.width),this.svg.style.left=r.option.asSize(-this.props.width),-1==(this.options.height+"").indexOf("%")&&1!=this.updateSVGheightOnResize||(this.updateSVGheight=!0)),1==this.updateSVGheight?(this.options.graphHeight!=this.props.height+"px"&&(this.options.graphHeight=this.props.height+"px",this.svg.style.height=this.props.height+"px"),this.updateSVGheight=!1):this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",1==t||1==i||1==this.abortedGraphUpdate||1==this.forceGraphUpdate)t=this._updateGraph()||t,this.forceGraphUpdate=!1;else if(0!=this.lastStart){var o=this.body.range.start-this.lastStart,n=this.body.range.end-this.body.range.start;if(0!=this.props.width){var s=this.props.width/n,a=o*s;this.svg.style.left=-this.props.width-a+"px"}}return this.legendLeft.redraw(),this.legendRight.redraw(),t},o.prototype._getSortedGroupIds=function(){var t=[];for(var e in this.groups)if(this.groups.hasOwnProperty(e)){var i=this.groups[e];1!=i.visible||void 0!==this.options.groups.visibility[e]&&1!=this.options.groups.visibility[e]||t.push({id:e,zIndex:i.options.zIndex})}r.insertSort(t,function(t,e){var i=t.zIndex,o=e.zIndex;return void 0===i&&(i=0),void 0===o&&(o=0),i==o?0:i<o?-1:1});for(var o=new Array(t.length),n=0;n<t.length;n++)o[n]=t[n].id;return o},o.prototype._updateGraph=function(){if(a.prepareElements(this.svgElements),0!=this.props.width&&null!=this.itemsData){var t,e,i={},o=this.body.util.toGlobalTime(-this.body.domProps.root.width),n=this.body.util.toGlobalTime(2*this.body.domProps.root.width),s=this._getSortedGroupIds();if(s.length>0){var r={};
vendor: 5,085 bytes, line 19289
19289for(this._getRelevantData(s,r,o,n),this._applySampling(s,r),e=0;e<s.length;e++)this._convertXcoordinates(r[s[e]]);if(this._getYRanges(s,r,i),1==this._updateYAxis(s,i))return a.cleanupElements(this.svgElements),this.abortedGraphUpdate=!0,!0;this.abortedGraphUpdate=!1;var h=void 0;for(e=0;e<s.length;e++)t=this.groups[s[e]],!0===this.options.stack&&"line"===this.options.style&&(void 0!=t.options.excludeFromStacking&&t.options.excludeFromStacking||(void 0!=h&&(this._stack(r[t.id],r[h.id]),1==t.options.shaded.enabled&&"group"!==t.options.shaded.orientation&&("top"==t.options.shaded.orientation&&"group"!==h.options.shaded.orientation?(h.options.shaded.orientation="group",h.options.shaded.groupId=t.id):(t.options.shaded.orientation="group",t.options.shaded.groupId=h.id))),h=t)),this._convertYcoordinates(r[s[e]],t);var d={};for(e=0;e<s.length;e++)if(t=this.groups[s[e]],"line"===t.options.style&&1==t.options.shaded.enabled){var l=r[s[e]];if(null==l||0==l.length)continue;if(d.hasOwnProperty(s[e])||(d[s[e]]=m.calcPath(l,t)),"group"===t.options.shaded.orientation){var u=t.options.shaded.groupId;if(-1===s.indexOf(u)){console.log(t.id+": Unknown shading group target given:"+u);continue}d.hasOwnProperty(u)||(d[u]=m.calcPath(r[u],this.groups[u])),m.drawShading(d[s[e]],t,d[u],this.framework)}else m.drawShading(d[s[e]],t,void 0,this.framework)}for(f.draw(s,r,this.framework),e=0;e<s.length;e++)if(t=this.groups[s[e]],r[s[e]].length>0)switch(t.options.style){case"line":d.hasOwnProperty(s[e])||(d[s[e]]=m.calcPath(r[s[e]],t)),m.draw(d[s[e]],t,this.framework);case"point":case"points":"point"!=t.options.style&&"points"!=t.options.style&&1!=t.options.drawPoints.enabled||v.draw(r[s[e]],t,this.framework)}}}return a.cleanupElements(this.svgElements),!1},o.prototype._stack=function(t,e){var i,o,n,s,r;i=0;for(var a=0;a<t.length;a++){s=void 0,r=void 0;for(var h=i;h<e.length;h++){if(e[h].x===t[a].x){s=e[h],r=e[h],i=h;break}if(e[h].x>t[a].x){r=e[h],s=0==h?r:e[h-1],i=h;break}}void 0===r&&(s=e[e.length-1],r=e[e.length-1]),o=r.x-s.x,n=r.y-s.y,t[a].y=0==o?t[a].orginalY+r.y:t[a].orginalY+n/o*(t[a].x-s.x)+s.y}},o.prototype._getRelevantData=function(t,e,i,o){var n,s,a,h;if(t.length>0)for(s=0;s<t.length;s++){n=this.groups[t[s]];var d=n.getItems();if(1==n.options.sort){var l=function(t,e){return t.getTime()==e.getTime()?0:t<e?-1:1},u=Math.max(0,r.binarySearchValue(d,i,"x","before",l)),c=Math.min(d.length,r.binarySearchValue(d,o,"x","after",l)+1);c<=0&&(c=d.length);var p=new Array(c-u);for(a=u;a<c;a++)h=n.itemsData[a],p[a-u]=h;e[t[s]]=p}else e[t[s]]=n.itemsData}},o.prototype._applySampling=function(t,e){var i;if(t.length>0)for(var o=0;o<t.length;o++)if(i=this.groups[t[o]],1==i.options.sampling){var n=e[t[o]];if(n.length>0){var s=1,r=n.length,a=this.body.util.toGlobalScreen(n[n.length-1].x)-this.body.util.toGlobalScreen(n[0].x),h=r/a;s=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=new Array(r),l=0;l<r;l+=s){var u=Math.round(l/s);d[u]=n[l]}e[t[o]]=d.splice(0,Math.round(r/s))}}},o.prototype._getYRanges=function(t,e,i){var o,n,s,r,a=[],h=[];if(t.length>0){for(s=0;s<t.length;s++)o=e[t[s]],r=this.groups[t[s]].options,o.length>0&&(n=this.groups[t[s]],!0===r.stack&&"bar"===r.style?"left"===r.yAxisOrientation?a=a.concat(o):h=h.concat(o):i[t[s]]=n.getYRange(o,t[s]));f.getStackedYRange(a,i,t,"__barStackLeft","left"),f.getStackedYRange(h,i,t,"__barStackRight","right")}},o.prototype._updateYAxis=function(t,e){var i,o,n=!1,s=!1,r=!1,a=1e9,h=1e9,d=-1e9,l=-1e9;if(t.length>0){for(var u=0;u<t.length;u++){var c=this.groups[t[u]];c&&"right"!=c.options.yAxisOrientation?(s=!0,a=1e9,d=-1e9):c&&c.options.yAxisOrientation&&(r=!0,h=1e9,l=-1e9)}for(u=0;u<t.length;u++)e.hasOwnProperty(t[u])&&!0!==e[t[u]].ignore&&(i=e[t[u]].min,o=e[t[u]].max,"right"!=e[t[u]].yAxisOrientation?(s=!0,a=a>i?i:a,d=d<o?o:d):(r=!0,h=h>i?i:h,l=l<o?o:l));1==s&&this.yAxisLeft.setRange(a,d),1==r&&this.yAxisRight.setRange(h,l)}n=this._toggleAxisVisiblity(s,this.yAxisLeft)||n,n=this._toggleAxisVisiblity(r,this.yAxisRight)||n,1==r&&1==s?(this.yAxisLeft.drawIcons=!0,this.yAxisRight.drawIcons=!0):(this.yAxisLeft.drawIcons=!1,this.yAxisRight.drawIcons=!1),this.yAxisRight.master=!s,this.yAxisRight.masterAxis=this.yAxisLeft,0==this.yAxisRight.master?(this.yAxisLeft.lineOffset=1==r?this.yAxisRight.width:0,n=this.yAxisLeft.redraw()||n,n=this.yAxisRight.redraw()||n):n=this.yAxisRight.redraw()||n;var p=["__barStackLeft","__barStackRight","__lineStackLeft","__lineStackRight"];for(u=0;u<p.length;u++)-1!=t.indexOf(p[u])&&t.splice(t.indexOf(p[u]),1);return n},o.prototype._toggleAxisVisiblity=function(t,e){var i=!1;return 0==t?e.dom.frame.parentNode&&0==e.hidden&&(e.hide(),i=!0):e.dom.frame.parentNode||1!=e.hidden||(e.show(),i=!0),i},o.prototype._convertXcoordinates=function(t){for(var e=this.body.util.toScreen,i=0;i<t.length;i++)t[i].screen_x=e(t[i].x)+this.props.width,t[i].screen_y=t[i].y,void 0!=t[i].end?t[i].screen_end=e(t[i].end)+this.props.width:t[i].screen_end=void 0},o.prototype._convertYcoordinates=function(t,e){var i=this.yAxisLeft,o=Number(this.svg.style.height.replace("px",""));
19289"right"==e.options.yAxisOrientation&&(i=this.yAxisRight);for(var n=0;n<t.length;n++)t[n].screen_y=Math.round(i.convertValue(t[n].y));e.setZeroPosition(Math.min(o,i.convertValue(0)))},t.exports=o},function(t,e,i){function o(t,e,i,o){this.id=r.randomUUID(),this.body=t,this.defaultOptions={orientation:"left",showMinorLabels:!0,showMajorLabels:!0,icons:!1,majorLinesOffset:7,minorLinesOffset:4,labelOffsetX:10,labelOffsetY:2,iconWidth:20,width:"40px",visible:!0,alignZeros:!0,left:{range:{min:void 0,max:void 0},format:function(t){return""+parseFloat(t.toPrecision(3))},title:{text:void 0,style:void 0}},right:{range:{min:void 0,max:void 0},format:function(t){return""+parseFloat(t.toPrecision(3))},title:{text:void 0,style:void 0}}},this.linegraphOptions=o,this.linegraphSVG=i,this.props={},this.DOMelements={lines:{},labels:{},title:{}},this.dom={},this.scale=void 0,this.range={start:0,end:0},this.options=r.extend({},this.defaultOptions),this.conversionFactor=1,this.setOptions(e),this.width=Number((""+this.options.width).replace("px","")),this.minWidth=this.width,this.height=this.linegraphSVG.getBoundingClientRect().height,this.hidden=!1,this.stepPixels=25,this.zeroCrossing=-1,this.amountOfSteps=-1,this.lineOffset=0,this.master=!0,this.masterAxis=null,this.svgElements={},this.iconsRemoved=!1,this.groups={},this.amountOfGroups=0,this._create(),this.framework={svg:this.svg,svgElements:this.svgElements,options:this.options,groups:this.groups};var n=this;this.body.emitter.on("verticalDrag",function(){n.dom.lineContainer.style.top=n.body.domProps.scrollTop+"px"})}var n=i(8),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(14),h=i(16),d=i(108);o.prototype=new h,o.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},o.prototype.updateGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.amountOfGroups+=1),this.groups[t]=e},o.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},o.prototype.setOptions=function(t){if(t){var e=!1;this.options.orientation!=t.orientation&&void 0!==t.orientation&&(e=!0);var i=["orientation","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","width","visible","left","right","alignZeros"];r.selectiveDeepExtend(i,this.options,t),this.minWidth=Number((""+this.options.width).replace("px","")),!0===e&&this.dom.frame&&(this.hide(),this.show())}},o.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.style.width=this.options.width,this.dom.frame.style.height=this.height,this.dom.lineContainer=document.createElement("div"),this.dom.lineContainer.style.width="100%",this.dom.lineContainer.style.height=this.height,this.dom.lineContainer.style.position="relative",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.height="100%",this.svg.style.width="100%",this.svg.style.display="block",this.dom.frame.appendChild(this.svg)},o.prototype._redrawGroupIcons=function(){a.prepareElements(this.svgElements);var t,e=this.options.iconWidth,i=11.5;t="left"===this.options.orientation?4:this.width-e-4;var o=(0,s.default)(this.groups);o.sort(function(t,e){return t<e?-1:1});for(var n=0;n<o.length;n++){var r=o[n];!0!==this.groups[r].visible||void 0!==this.linegraphOptions.visibility[r]&&!0!==this.linegraphOptions.visibility[r]||(this.groups[r].getLegend(e,15,this.framework,t,i),i+=19)}a.cleanupElements(this.svgElements),this.iconsRemoved=!1},o.prototype._cleanupIcons=function(){!1===this.iconsRemoved&&(a.prepareElements(this.svgElements),a.cleanupElements(this.svgElements),this.iconsRemoved=!0)},o.prototype.show=function(){this.hidden=!1,this.dom.frame.parentNode||("left"===this.options.orientation?this.body.dom.left.appendChild(this.dom.frame):this.body.dom.right.appendChild(this.dom.frame)),this.dom.lineContainer.parentNode||this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer)},o.prototype.hide=function(){this.hidden=!0,this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.lineContainer.parentNode&&this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer)},o.prototype.setRange=function(t,e){this.range.start=t,this.range.end=e},o.prototype.redraw=function(){var t=!1,e=0;this.dom.lineContainer.style.top=this.body.domProps.scrollTop+"px";for(var i in this.groups)this.groups.hasOwnProperty(i)&&(!0!==this.groups[i].visible||void 0!==this.linegraphOptions.visibility[i]&&!0!==this.linegraphOptions.visibility[i]||e++);if(0===this.amountOfGroups||0===e)this.hide();else{this.show(),this.height=Number(this.linegraphSVG.style.height.replace("px","")),this.dom.lineContainer.style.height=this.height+"px",this.width=!0===this.options.visible?Number((""+this.options.width).replace("px","")):0;var o=this.props,n=this.dom.frame;n.className="vis-data-axis",this._calculateCharSize();var s=this.options.orientation,r=this.options.showMinorLabels,a=this.options.showMajorLabels;o.minorLabelHeight=r?o.minorCharHeight:0,o.majorLabelHeight=a?o.majorCharHeight:0,o.minorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.minorLinesOffset,o.minorLineHeight=1,o.majorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.majorLinesOffset,o.majorLineHeight=1,"left"===s?(n.style.top="0",n.style.left="0",n.style.bottom="",n.style.width=this.width+"px",n.style.height=this.height+"px",this.props.width=this.body.domProps.left.width,this.props.height=this.body.domProps.left.height):(n.style.top="",n.style.bottom="0",n.style.left="0",n.style.width=this.width+"px",n.style.height=this.height+"px",this.props.width=this.body.domProps.right.width,this.props.height=this.body.domProps.right.height),t=this._redrawLabels(),t=this._isResized()||t,!0===this.options.icons?this._redrawGroupIcons():this._cleanupIcons(),this._redrawTitle(s)}return t},o.prototype._redrawLabels=function(){var t=this,e=!1;a.prepareElements(this.DOMelements.lines),a.prepareElements(this.DOMelements.labels);var i=this.options.orientation,o=void 0!=this.options[i].range?this.options[i].range:{},n=!0;void 0!=o.max&&(this.range.end=o.max,n=!1);var s=!0;void 0!=o.min&&(this.range.start=o.min,s=!1),this.scale=new d(this.range.start,this.range.end,s,n,this.dom.frame.offsetHeight,this.props.majorCharHeight,this.options.alignZeros,this.options[i].format),!1===this.master&&void 0!=this.masterAxis&&this.scale.followScale(this.masterAxis.scale),this.maxLabelSize=0,this.scale.getLines().forEac
19289h(function(e){var o=e.y,n=e.major;t.options.showMinorLabels&&!1===n&&t._redrawLabel(o-2,e.val,i,"vis-y-axis vis-minor",t.props.minorCharHeight),n&&o>=0&&t._redrawLabel(o-2,e.val,i,"vis-y-axis vis-major",t.props.majorCharHeight),!0===t.master&&(n?t._redrawLine(o,i,"vis-grid vis-horizontal vis-major",t.options.majorLinesOffset,t.props.majorLineWidth):t._redrawLine(o,i,"vis-grid vis-horizontal vis-minor",t.options.minorLinesOffset,t.props.minorLineWidth))});var r=0;void 0!==this.options[i].title&&void 0!==this.options[i].title.text&&(r=this.props.titleCharHeight);var h=!0===this.options.icons?Math.max(this.options.iconWidth,r)+this.options.labelOffsetX+15:r+this.options.labelOffsetX+15;return this.maxLabelSize>this.width-h&&!0===this.options.visible?(this.width=this.maxLabelSize+h,this.options.width=this.width+"px",a.cleanupElements(this.DOMelements.lines),a.cleanupElements(this.DOMelements.labels),this.redraw(),e=!0):this.maxLabelSize<this.width-h&&!0===this.options.visible&&this.width>this.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+h),this.options.width=this.width+"px",a.cleanupElements(this.DOMelements.lines),a.cleanupElements(this.DOMelements.labels),this.redraw(),e=!0):(a.cleanupElements(this.DOMelements.lines),a.cleanupElements(this.DOMelements.labels),e=!1),e},o.prototype.convertValue=function(t){return this.scale.convertValue(t)},o.prototype.screenToValue=function(t){return this.scale.screenToValue(t)},o.prototype._redrawLabel=function(t,e,i,o,n){var s=a.getDOMElement("div",this.DOMelements.labels,this.dom.frame);s.className=o,s.innerHTML=e,"left"===i?(s.style.left="-"+this.options.labelOffsetX+"px",s.style.textAlign="right"):(s.style.right="-"+this.options.labelOffsetX+"px",s.style.textAlign="left"),s.style.top=t-.5*n+this.options.labelOffsetY+"px",e+="";var r=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSize<e.length*r&&(this.maxLabelSize=e.length*r)},o.prototype._redrawLine=function(t,e,i,o,n){if(!0===this.master){var s=a.getDOMElement("div",this.DOMelements.lines,this.dom.lineContainer);s.className=i,s.innerHTML="","left"===e?s.style.left=this.width-o+"px":s.style.right=this.width-o+"px",s.style.width=n+"px",s.style.top=t+"px"}},o.prototype._redrawTitle=function(t){if(a.prepareElements(this.DOMelements.title),void 0!==this.options[t].title&&void 0!==this.options[t].title.text){var e=a.getDOMElement("div",this.DOMelements.title,this.dom.frame);e.className="vis-y-axis vis-title vis-"+t,e.innerHTML=this.options[t].title.text,void 0!==this.options[t].title.style&&r.addCssText(e,this.options[t].title.style),"left"===t?e.style.left=this.props.titleCharHeight+"px":e.style.right=this.props.titleCharHeight+"px",e.style.width=this.height+"px"}a.cleanupElements(this.DOMelements.title)},o.prototype._calculateCharSize=function(){if(!("minorCharHeight"in this.props)){var t=document.createTextNode("0"),e=document.createElement("div");e.className="vis-y-axis vis-minor vis-measure",e.appendChild(t),this.dom.frame.appendChild(e),this.props.minorCharHeight=e.clientHeight,this.props.minorCharWidth=e.clientWidth,this.dom.frame.removeChild(e)}if(!("majorCharHeight"in this.props)){var i=document.createTextNode("0"),o=document.createElement("div");o.className="vis-y-axis vis-major vis-measure",o.appendChild(i),this.dom.frame.appendChild(o),this.props.majorCharHeight=o.clientHeight,this.props.majorCharWidth=o.clientWidth,this.dom.frame.removeChild(o)}if(!("titleCharHeight"in this.props)){var n=document.createTextNode("0"),s=document.createElement("div");s.className="vis-y-axis vis-title vis-measure",s.appendChild(n),this.dom.frame.appendChild(s),this.props.titleCharHeight=s.clientHeight,this.props.titleCharWidth=s.clientWidth,this.dom.frame.removeChild(s)}},t.exports=o},function(t,e,i){function o(t,e,i,o,n,s){var r=arguments.length>6&&void 0!==arguments[6]&&arguments[6],a=arguments.length>7&&void 0!==arguments[7]&&arguments[7];if(this.majorSteps=[1,2,5,10],this.minorSteps=[.25,.5,1,2],this.customLines=null,this.containerHeight=n,this.majorCharHeight=s,this._start=t,this._end=e,this.scale=1,this.minorStepIdx=-1,this.magnitudefactor=1,this.determineScale(),this.zeroAlign=r,this.autoScaleStart=i,this.autoScaleEnd=o,this.formattingFunction=a,i||o){var h=this,d=function(t){var e=t-t%(h.magnitudefactor*h.minorSteps[h.minorStepIdx]);return t%(h.magnitudefactor*h.minorSteps[h.minorStepIdx])>h.magnitudefactor*h.minorSteps[h.minorStepIdx]*.5?e+h.magnitudefactor*h.minorSteps[h.minorStepIdx]:e};i&&(this._start-=2*this.magnitudefactor*this.minorSteps[this.minorStepIdx],this._start=d(this._start)),o&&(this._end+=this.magnitudefactor*this.minorSteps[this.minorStepIdx],this._end=d(this._end)),this.determineScale()}}o.prototype.setCharHeight=function(t){this.majorCharHeight=t},o.prototype.setHeight=function(t){this.containerHeight=t},o.prototype.determineScale=function(){var t=this._end-this._start;this.scale=this.containerHeight/t;var e=this.majorCharHeight/this.scale,i=t>0?Math.round(Math.log(t)/Math.LN10):0;this.minorStepIdx=-1,this.magnitudefactor=Math.pow(10,i);var o=0;i<0&&(o=i);for(var n=!1,s=o;Math.abs(s)<=Math.abs(i);s++){this.magnitudefactor=Math.pow(10,s);for(var r=0;r<this.minorSteps.length;r++){if(this.magnitudefactor*this.minorSteps[r]>=e){n=!0,this.minorStepIdx=r;break}}if(!0===n)break}},o.prototype.is_major=function(t){return t%(this.magnitudefactor*this.majorSteps[this.minorStepIdx])==0},o.prototype.getStep=function(){return this.magnitudefactor*this.minorSteps[this.minorStepIdx]},o.prototype.getFirstMajor=function(){var t=this.magnitudefactor*this.majorSteps[this.minorStepIdx];return this.convertValue(this._start+(t-this._start%t)%t)},o.prototype.formatValue=function(t){var e=t.toPrecision(5);return"function"==typeof this.formattingFunction&&(e=this.formattingFunction(t)),"number"==typeof e?""+e:"string"==typeof e?e:t.toPrecision(5)},o.prototype.getLines=function(){for(var t=[],e=this.getStep(),i=(e-this._start%e)%e,o=this._start+i;this._end-o>1e-5;o+=e)o!=this._start&&t.push({major:this.is_major(o),y:this.convertValue(o),val:this.formatValue(o)});return t},o.prototype.followScale=function(t){var e=this.minorStepIdx,i=this._start,o=this._end,n=this,s=function(){n.magnitudefactor*=2},r=function(){n.magnitudefactor/=2};t.minorStepIdx<=1&&this.minorStepIdx<=1||t.minorStepIdx>1&&this.minorStepIdx>1||(t.minorStepIdx<this.minorStepIdx?(this.minorStepIdx=1,2==e?s():(s(),s())):(this.minorStepIdx=2,1==e?r():(r(),r())));for(var a=t.convertValue(0),h=t.getStep()*t.scale,d=!1,l=0;
19289!d&&l++<5;){this.scale=h/(this.minorSteps[this.minorStepIdx]*this.magnitudefactor);var u=this.containerHeight/this.scale;this._start=i,this._end=this._start+u;var c=this._end*this.scale,p=this.magnitudefactor*this.majorSteps[this.minorStepIdx],f=this.getFirstMajor()-t.getFirstMajor();if(this.zeroAlign){var m=a-c;this._end+=m/this.scale,this._start=this._end-u}else this.autoScaleStart?(this._start-=f/this.scale,this._end=this._start+u):(this._start+=p-f/this.scale,this._end=this._start+u);if(!this.autoScaleEnd&&this._end>o+1e-5)r(),d=!1;else{if(!this.autoScaleStart&&this._start<i-1e-5){if(!(this.zeroAlign&&i>=0)){r(),d=!1;continue}console.warn("Can't adhere to given 'min' range, due to zeroalign")}this.autoScaleStart&&this.autoScaleEnd&&u<o-i?(s(),d=!1):d=!0}}},o.prototype.convertValue=function(t){return this.containerHeight-(t-this._start)*this.scale},o.prototype.screenToValue=function(t){return(this.containerHeight-t)/this.scale+this._start},t.exports=o},function(t,e,i){function o(t,e,i,o){this.id=e;var n=["sampling","style","sort","yAxisOrientation","barChart","drawPoints","shaded","interpolation","zIndex","excludeFromStacking","excludeFromLegend"];this.options=r.selectiveBridgeObject(n,i),this.usingDefaultStyle=void 0===t.className,this.groupsUsingDefaultStyles=o,this.zeroPosition=0,this.update(t),1==this.usingDefaultStyle&&(this.groupsUsingDefaultStyles[0]+=1),this.itemsData=[],this.visible=void 0===t.visible||t.visible}var n=i(6),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(110),h=i(111),d=i(72);o.prototype.setItems=function(t){null!=t?(this.itemsData=t,1==this.options.sort&&r.insertSort(this.itemsData,function(t,e){return t.x>e.x?1:-1})):this.itemsData=[]},o.prototype.getItems=function(){return this.itemsData},o.prototype.setZeroPosition=function(t){this.zeroPosition=t},o.prototype.setOptions=function(t){if(void 0!==t){var e=["sampling","style","sort","yAxisOrientation","barChart","zIndex","excludeFromStacking","excludeFromLegend"];r.selectiveDeepExtend(e,this.options,t),"function"==typeof t.drawPoints&&(t.drawPoints={onRender:t.drawPoints}),r.mergeOptions(this.options,t,"interpolation"),r.mergeOptions(this.options,t,"drawPoints"),r.mergeOptions(this.options,t,"shaded"),t.interpolation&&"object"==(0,s.default)(t.interpolation)&&t.interpolation.parametrization&&("uniform"==t.interpolation.parametrization?this.options.interpolation.alpha=0:"chordal"==t.interpolation.parametrization?this.options.interpolation.alpha=1:(this.options.interpolation.parametrization="centripetal",this.options.interpolation.alpha=.5))}},o.prototype.update=function(t){this.group=t,this.content=t.content||"graph",this.className=t.className||this.className||"vis-graph-group"+this.groupsUsingDefaultStyles[0]%10,this.visible=void 0===t.visible||t.visible,this.style=t.style,this.setOptions(t.options)},o.prototype.getLegend=function(t,e,i,o,n){if(void 0==i||null==i){i={svg:document.createElementNS("http://www.w3.org/2000/svg","svg"),svgElements:{},options:this.options,groups:[this]}}switch(void 0!=o&&null!=o||(o=0),void 0!=n&&null!=n||(n=.5*e),this.options.style){case"line":h.drawIcon(this,o,n,t,e,i);break;case"points":case"point":d.drawIcon(this,o,n,t,e,i);break;case"bar":a.drawIcon(this,o,n,t,e,i)}return{icon:i.svg,label:this.content,orientation:this.options.yAxisOr
19289ientation}},o.prototype.getYRange=function(t){for(var e=t[0].y,i=t[0].y,o=0;o<t.length;o++)e=e>t[o].y?t[o].y:e,i=i<t[o].y?t[o].y:i;return{min:e,max:i,yAxisOrientation:this.options.yAxisOrientation}},t.exports=o},function(t,e,i){function o(t,e){}var n=i(14),s=i(72);o.drawIcon=function(t,e,i,o,s,r){var a=.5*s,h=n.getSVGElement("rect",r.svgElements,r.svg);h.setAttributeNS(null,"x",e),h.setAttributeNS(null,"y",i-a),h.setAttributeNS(null,"width",o),h.setAttributeNS(null,"height",2*a),h.setAttributeNS(null,"class","vis-outline");var d=Math.round(.3*o),l=t.options.barChart.width,u=l/d,c=Math.round(.4*s),p=Math.round(.75*s),f=Math.round((o-2*d)/3);if(n.drawBar(e+.5*d+f,i+a-c-1,d,c,t.className+" vis-bar",r.svgElements,r.svg,t.style),n.drawBar(e+1.5*d+f+2,i+a-p-1,d,p,t.className+" vis-bar",r.svgElements,r.svg,t.style),1==t.options.drawPoints.enabled){var m={style:t.options.drawPoints.style,styles:t.options.drawPoints.styles,size:t.options.drawPoints.size/u,className:t.className};n.drawPoint(e+.5*d+f,i+a-c-1,m,r.svgElements,r.svg),n.drawPoint(e+1.5*d+f+2,i+a-p-1,m,r.svgElements,r.svg)}},o.draw=function(t,e,i){var r,a,h,d,l,u,c=[],p={},f=0;for(l=0;l<t.length;l++)if(d=i.groups[t[l]],"bar"===d.options.style&&!0===d.visible&&(void 0===i.options.groups.visibility[t[l]]||!0===i.options.groups.visibility[t[l]]))for(u=0;u<e[t[l]].length;u++)c.push({screen_x:e[t[l]][u].screen_x,screen_end:e[t[l]][u].screen_end,screen_y:e[t[l]][u].screen_y,x:e[t[l]][u].x,end:e[t[l]][u].end,y:e[t[l]][u].y,groupId:t[l],label:e[t[l]][u].label}),f+=1;if(0!==f)for(c.sort(function(t,e){return t.screen_x===e.screen_x?t.groupId<e.groupId?-1:1:t.screen_x-e.screen_x}),o._getDataIntersections(p,c),l=0;l<c.length;l++){d=i.groups[c[l].groupId];var m=void 0!=d.options.barChart.minWidth?d.options.barChart.minWidth:.1*d.options.barChart.width;a=c[l].screen_x;var v=0;if(void 0===p[a])l+1<c.length&&(r=Math.abs(c[l+1].screen_x-a)),h=o._getSafeDrawData(r,d,m);else{var g=l+(p[a].amount-p[a].resolved);g<c.length&&(r=Math.abs(c[g].screen_x-a)),h=o._getSafeDrawData(r,d,m),p[a].resolved+=1,!0===d.options.stack&&!0!==d.options.excludeFromStacking?c[l].screen_y<d.zeroPosition?(v=p[a].accumulatedNegative,p[a].accumulatedNegative+=d.zeroPosition-c[l].screen_y):(v=p[a].accumulatedPositive,p[a].accumulatedPositive+=d.zeroPosition-c[l].screen_y):!0===d.options.barChart.sideBySide&&(h.width=h.width/p[a].amount,h.offset+=p[a].resolved*h.width-.5*h.width*(p[a].amount+1))}var y=h.width,b=c[l].screen_x;if(void 0!=c[l].screen_end?(y=c[l].screen_end-c[l].screen_x,b+=.5*y):b+=h.offset,n.drawBar(b,c[l].screen_y-v,y,d.zeroPosition-c[l].screen_y,d.className+" vis-bar",i.svgElements,i.svg,d.style),!0===d.options.drawPoints.enabled){var _={screen_x:c[l].screen_x,screen_y:c[l].screen_y-v,x:c[l].x,y:c[l].y,groupId:c[l].groupId,label:c[l].label};s.draw([_],d,i,h.offset)}}},o._getDataIntersections=function(t,e){for(var i,o=0;o<e.length;o++)o+1<e.length&&(i=Math.abs(e[o+1].screen_x-e[o].screen_x)),o>0&&(i=Math.min(i,Math.abs(e[o-1].screen_x-e[o].screen_x))),0===i&&(void 0===t[e[o].screen_x]&&(t[e[o].screen_x]={amount:0,resolved:0,accumulatedPositive:0,accumulatedNegative:0}),t[e[o].screen_x].amount+=1)},o._getSafeDrawData=function(t,e,i){var o,n;return t<e.options.barChart.width&&t>0?(o=t<i?i:t,n=0,"left"===e.options.barChart.align?n-=.5*t:"right"===e.options.barChart.align&&(n+=.5*t)):(o=e.options.barChart.width,n=0,"left"===e.options.barChart.align?n-=.5*e.options.barChart.width:"right"===e.options.barChart.align&&(n+=.5*e.options.barChart.width)),{width:o,offset:n}},o.getStackedYRange=function(t,e,i,n,s){if(t.length>0){t.sort(function(t,e){return t.screen_x===e.screen_x?t.groupId<e.groupId?-1:1:t.screen_x-e.screen_x});var r={};o._getDataIntersections(r,t),e[n]=o._getStackedYRange(r,t),e[n].yAxisOrientation=s,i.push(n)}},o._getStackedYRange=function(t,e){for(var i,o=e[0].screen_y,n=e[0].screen_y,s=0;s<e.length;s++)i=e[s].screen_x,void 0===t[i]?(o=o>e[s].screen_y?e[s].screen_y:o,n=n<e[s].screen_y?e[s].screen_y:n):e[s].screen_y<0?t[i].accumulatedNegative+=e[s].screen_y:t[i].accumulatedPositive+=e[s].screen_y;for(var r in t)t.hasOwnProperty(r)&&(o=o>t[r].accumulatedNegative?t[r].accumulatedNegative:o,o=o>t[r].accumulatedPositive?t[r].accumulatedPositive:o,n=n<t[r].accumulatedNegative?t[r].accumulatedNegative:n,n=n<t[r].accumulatedPositive?t[r].accumulatedPositive:n);return{min:o,max:n}},t.exports=o}
19289,function(t,e,i){function o(t,e){}var n=i(14);o.calcPath=function(t,e){if(null!=t&&t.length>0){return 1==e.options.interpolation.enabled?o._catmullRom(t,e):o._linear(t)}},o.drawIcon=function(t,e,i,o,s,r){var a,h,d=.5*s,l=n.getSVGElement("rect",r.svgElements,r.svg);if(l.setAttributeNS(null,"x",e),l.setAttributeNS(null,"y",i-d),l.setAttributeNS(null,"width",o),l.setAttributeNS(null,"height",2*d),l.setAttributeNS(null,"class","vis-outline"),a=n.getSVGElement("path",r.svgElements,r.svg),a.setAttributeNS(null,"class",t.className),void 0!==t.style&&a.setAttributeNS(null,"style",t.style),a.setAttributeNS(null,"d","M"+e+","+i+" L"+(e+o)+","+i),1==t.options.shaded.enabled&&(h=n.getSVGElement("path",r.svgElements,r.svg),"top"==t.options.shaded.orientation?h.setAttributeNS(null,"d","M"+e+", "+(i-d)+"L"+e+","+i+" L"+(e+o)+","+i+" L"+(e+o)+","+(i-d)):h.setAttributeNS(null,"d","M"+e+","+i+" L"+e+","+(i+d)+" L"+(e+o)+","+(i+d)+"L"+(e+o)+","+i),h.setAttributeNS(null,"class",t.className+" vis-icon-fill"),void 0!==t.options.shaded.style&&""!==t.options.shaded.style&&h.setAttributeNS(null,"style",t.options.shaded.style)),1==t.options.drawPoints.enabled){var u={style:t.options.drawPoints.style,styles:t.options.drawPoints.styles,size:t.options.drawPoints.size,className:t.className};n.drawPoint(e+.5*o,i,u,r.svgElements,r.svg)}},o.drawShading=function(t,e,i,o){if(1==e.options.shaded.enabled){var s=Number(o.svg.style.height.replace("px","")),r=n.getSVGElement("path",o.svgElements,o.svg),a="L";1==e.options.interpolation.enabled&&(a="C");var h,d=0;d="top"==e.options.shaded.orientation?0:"bottom"==e.options.shaded.orientation?s:Math.min(Math.max(0,e.zeroPosition),s),h="group"==e.options.shaded.orientation&&null!=i&&void 0!=i?"M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,a,!1)+" L"+i[i.length-1][0]+","+i[i.length-1][1]+" "+this.serializePath(i,a,!0)+i[0][0]+","+i[0][1]+" Z":"M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,a,!1)+" V"+d+" H"+t[0][0]+" Z",r.setAttributeNS(null,"class",e.className+" vis-fill"),void 0!==e.options.shaded.style&&r.setAttributeNS(null,"style",e.options.shaded.style),r.setAttributeNS(null,"d",h)}},o.draw=function(t,e,i){if(null!=t&&void 0!=t){var o=n.getSVGElement("path",i.svgElements,i.svg);o.setAttributeNS(null,"class",e.className),void 0!==e.style&&o.setAttributeNS(null,"style",e.style);var s="L";1==e.options.interpolation.enabled&&(s="C"),o.setAttributeNS(null,"d","M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,s,!1))}},o.serializePath=function(t,e,i){if(t.length<2)return"";var o,n=e;if(i)for(o=t.length-2;o>0;o--)n+=t[o][0]+","+t[o][1]+" ";else for(o=1;o<t.length;o++)n+=t[o][0]+","+t[o][1]+" ";return n},o._catmullRomUniform=function(t){var e,i,o,n,s,r,a=[];a.push([Math.round(t[0].screen_x),Math.round(t[0].screen_y)]);for(var h=t.length,d=0;d<h-1;d++)e=0==d?t[0]:t[d-1],i=t[d],o=t[d+1],n=d+2<h?t[d+2]:o,s={screen_x:(-e.screen_x+6*i.screen_x+o.screen_x)*(1/6),screen_y:(-e.screen_y+6*i.screen_y+o.screen_y)*(1/6)},r={screen_x:(i.screen_x+6*o.screen_x-n.screen_x)*(1/6),screen_y:(i.screen_y+6*o.screen_y-n.screen_y)*(1/6)},a.push([s.screen_x,s.screen_y]),a.push([r.screen_x,r.screen_y]),a.push([o.screen_x,o.screen_y]);return a},o._catmullRom=function(t,e){var i=e.options.interpolation.alpha;if(0==i||void 0===i)return this._catmullRomUniform(t);var o,n,s,r,a,h,d,l,u,c,p,f,m,v,g,y,b,_,w,x=[];x.push([Math.round(t[0].screen_x),Math.round(t[0].screen_y)]);for(var k=t.length,S=0;S<k-1;S++)o=0==S?t[0]:t[S-1],n=t[S],s=t[S+1],r=S+2<k?t[S+2]:s,
19290    d=Math.sqrt(Math.pow(o.screen_x-n.screen_x,2)+Math.pow(o.screen_y-n.screen_y,2)),l=Math.sqrt(Math.pow(n.screen_x-s.screen_x,2)+Math.pow(n.screen_y-s.screen_y,2)),u=Math.sqrt(Math.pow(s.screen_x-r.screen_x,2)+Math.pow(s.screen_y-r.screen_y,2)),v=Math.pow(u,i),y=Math.pow(u,2*i),g=Math.pow(l,i),b=Math.pow(l,2*i),w=Math.pow(d,i),_=Math.pow(d,2*i),c=2*_+3*w*g+b,p=2*y+3*v*g+b,f=3*w*(w+g),f>0&&(f=1/f),m=3*v*(v+g),m>0&&(m=1/m),a={screen_x:(-b*o.screen_x+c*n.screen_x+_*s.screen_x)*f,screen_y:(-b*o.screen_y+c*n.screen_y+_*s.screen_y)*f},h={screen_x:(y*n.screen_x+p*s.screen_x-b*r.screen_x)*m,screen_y:(y*n.screen_y+p*s.screen_y-b*r.screen_y)*m},0==a.screen_x&&0==a.screen_y&&(a=n),0==h.screen_x&&0==h.screen_y&&(h=s),x.push([a.screen_x,a.screen_y]),x.push([h.screen_x,h.screen_y]),x.push([s.screen_x,s.screen_y]);return x},o._linear=function(t){for(var e=[],i=0;i<t.length;i++)e.push([t[i].screen_x,t[i].screen_y]);return e},t.exports=o}
vendor: 10,001 bytes, line 19290
19290,function(t,e,i){function o(t,e,i,o){this.body=t,this.defaultOptions={enabled:!1,icons:!0,iconSize:20,iconSpacing:6,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-right"}},this.side=i,this.options=r.extend({},this.defaultOptions),this.linegraphOptions=o,this.svgElements={},this.dom={},this.groups={},this.amountOfGroups=0,this._create(),this.framework={svg:this.svg,svgElements:this.svgElements,options:this.options,groups:this.groups},this.setOptions(e)}var n=i(8),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(14),h=i(16);o.prototype=new h,o.prototype.clear=function(){this.groups={},this.amountOfGroups=0},o.prototype.addGroup=function(t,e){1!=e.options.excludeFromLegend&&(this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1)},o.prototype.updateGroup=function(t,e){this.groups[t]=e},o.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},o.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.className="vis-legend",this.dom.frame.style.position="absolute",this.dom.frame.style.top="10px",this.dom.frame.style.display="block",this.dom.textArea=document.createElement("div"),this.dom.textArea.className="vis-legend-text",this.dom.textArea.style.position="relative",this.dom.textArea.style.top="0px",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.width=this.options.iconSize+5+"px",this.svg.style.height="100%",this.dom.frame.appendChild(this.svg),this.dom.frame.appendChild(this.dom.textArea)},o.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},o.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},o.prototype.setOptions=function(t){var e=["enabled","orientation","icons","left","right"];r.selectiveDeepExtend(e,this.options,t)},o.prototype.redraw=function(){var t=0,e=(0,s.default)(this.groups);e.sort(function(t,e){return t<e?-1:1});for(var i=0;i<e.length;i++){var o=e[i];1!=this.groups[o].visible||void 0!==this.linegraphOptions.visibility[o]&&1!=this.linegraphOptions.visibility[o]||t++}if(0==this.options[this.side].visible||0==this.amountOfGroups||0==this.options.enabled||0==t)this.hide();else{if(this.show(),"top-left"==this.options[this.side].position||"bottom-left"==this.options[this.side].position?(this.dom.frame.style.left="4px",this.dom.frame.style.textAlign="left",this.dom.textArea.style.textAlign="left",this.dom.textArea.style.left=this.options.iconSize+15+"px",this.dom.textArea.style.right="",this.svg.style.left="0px",this.svg.style.right=""):(this.dom.frame.style.right="4px",this.dom.frame.style.textAlign="right",this.dom.textArea.style.textAlign="right",this.dom.textArea.style.right=this.options.iconSize+15+"px",this.dom.textArea.style.left="",this.svg.style.right="0px",this.svg.style.left=""),"top-left"==this.options[this.side].position||"top-right"==this.options[this.side].position)this.dom.frame.style.top=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.bottom="";else{var n=this.body.domProps.center.height-this.body.domProps.centerContainer.height;this.dom.frame.style.bottom=4+n+Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.top=""}0==this.options.icons?(this.dom.frame.style.width=this.dom.textArea.offsetWidth+10+"px",this.dom.textArea.style.right="",this.dom.textArea.style.left="",this.svg.style.width="0px"):(this.dom.frame.style.width=this.options.iconSize+15+this.dom.textArea.offsetWidth+10+"px",this.drawLegendIcons());var r="";for(i=0;i<e.length;i++)o=e[i],1!=this.groups[o].visible||void 0!==this.linegraphOptions.visibility[o]&&1!=this.linegraphOptions.visibility[o]||(r+=this.groups[o].content+"<br />");this.dom.textArea.innerHTML=r,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},o.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){var t=(0,s.default)(this.groups);t.sort(function(t,e){return t<e?-1:1}),a.resetElements(this.svgElements);var e=window.getComputedStyle(this.dom.frame).paddingTop,i=Number(e.replace("px","")),o=i,n=this.options.iconSize,r=.75*this.options.iconSize,h=i+.5*r+3;this.svg.style.width=n+5+i+"px";for(var d=0;d<t.length;d++){var l=t[d];1!=this.groups[l].visible||void 0!==this.linegraphOptions.visibility[l]&&1!=this.linegraphOptions.visibility[l]||(this.groups[l].getLegend(n,r,this.framework,o,h),h+=r+this.options.iconSpacing)}}},t.exports=o},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var o="string",n="boolean",s="number",r="object",a={configure:{enabled:{boolean:n},filter:{boolean:n,function:"function"},container:{dom:"dom"},__type__:{object:r,boolean:n,function:"function"}},yAxisOrientation:{string:["left","right"]},defaultGroup:{string:o},sort:{boolean:n},sampling:{boolean:n},stack:{boolean:n},graphHeight:{string:o,number:s},shaded:{enabled:{boolean:n},orientation:{string:["bottom","top","zero","group"]},groupId:{object:r},__type__:{boolean:n,object:r}},style:{string:["line","bar","points"]},barChart:{width:{number:s},minWidth:{number:s},sideBySide:{boolean:n},align:{string:["left","center","right"]},__type__:{object:r}},interpolation:{enabled:{boolean:n},parametrization:{string:["centripetal","chordal","uniform"]},alpha:{number:s},__type__:{object:r,boolean:n}},drawPoints:{enabled:{boolean:n},onRender:{function:"function"},size:{number:s},style:{string:["square","circle"]},__type__:{object:r,boolean:n,function:"function"}},dataAxis:{showMinorLabels:{boolean:n},showMajorLabels:{boolean:n},icons:{boolean:n},width:{string:o,number:s},visible:{boolean:n},alignZeros:{boolean:n},left:{range:{min:{number:s,undefined:"undefined"},max:{number:s,undefined:"undefined"},__type__:{object:r}},format:{function:"function"},title:{text:{string:o,number:s,undefined:"undefined"},style:{string:o,undefined:"undefined"},__type__:{object:r}},__type__:{object:r}},right:{range:{min:{number:s,undefined:"undefined"},max:{number:s,undefined:"undefined"},__type__:{object:r}},format:{function:"function"},title:{text:{string:o,number:s,undefined:"undefined"},style:{string:o,undefined:"undefined"},__type__:{object:r}},__type__:{object:r}},__type__:{object:r}},legend:{enabled:{boolean:n},icons:{boolean:n},left:{visible:{boolean:n},position:{string:["top-right","bottom-right","top-left","bottom-left"]},__type__:{object:r}},right:{visible:{boolean:n},position:{string:["top-right","bottom-right","top-left","bottom-left"]},__type__:{object:r}},__type__:{object:r,boolean:n}},groups:{visibility:{any:"any"},__type__:{object:r}},autoResize:{boolean:n},throttleRedraw:{number:s},clickToUse:{boolean:n},end:{number:s,date:"date",string:o,moment:"moment"},format:{minorLabels:{millisecond:{string:o,undefined:"undefined"},second:{string:o,undefined:"undefined"},minute:{string:o,undefined:"undefined"},hour:{string:o,undefined:"undefined"},weekday:{string:o,undefined:"undefined"},day:{string:o,undefined:"undefined"},month:{string:o,undefined:"undefined"},year:{string:o,undefined:"undefined"},__type__:{object:r}},majorLabels:{millisecond:{string:o,undefined:"undefined"},second:{string:o,undefined:"undefined"},minute:{string:o,undefined:"undefined"},hour:{string:o,undefined:"undefined"},weekday:{string:o,undefined:"undefined"},day:{string:o,undefined:"undefined"},month:{string:o,undefined:"undefined"},year:{string:o,undefined:"undefined"},__type__:{object:r}},__type__:{object:r}},moment:{function:"function"},height:{string:o,number:s},hiddenDates:{start:{date:"date",number:s,string:o,moment:"moment"},end:{date:"date",number:s,string:o,moment:"moment"},repeat:{string:o},__type__:{object:r,array:"array"}},locale:{string:o},locales:{__any__:{any:"any"},__type__:{object:r}},max:{date:"date",number:s,string:o,moment:"moment"},maxHeight:{number:s,string:o},maxMinorChars:{number:s},min:{date:"date",number:s,string:o,moment:"moment"},minHeight:{number:s,string:o},moveable:{boolean:n},multiselect:{boolean:n},orientation:{string:o},showCurrentTime:{boolean:n},showMajorLabels:{boolean:n},showMinorLabels:{boolean:n},start:{date:"date",number:s,string:o,moment:"moment"},timeAxis:{scale:{string:o,undefined:"undefined"},step:{number:s,undefined:"undefined"},__type__:{object:r}},width:{string:o,number:s},zoomable:{boolean:n},zoomKey:{string:["ctrlKey","altKey","metaKey",""]},zoomMax:{number:s},zoomMin:{number:s},zIndex:{number:s},__type__:{object:r}},h={global:{sort:!0,sampling:!0,stack:!1,shaded:{enabled:!1,orientation:["zero","top","bottom","group"]},style:["line","bar","points"],barChart:{width:[50,5,100,5],minWidth:[50,5,100,5],sideBySide:!1,align:["left","center","right"]},interpolation:{enabled:!0,parametrization:["centripetal","chordal","uniform"]},drawPoints:{enabled:!0,size:[6,2,30,1],style:["square","circle"]},dataAxis:{showMinorLabels:!0,showMajorLabels:!0,icons:!1,width:[40,0,200,1],visible:!0,alignZeros:!0,left:{title:{text:"",style:""}},right:{title:{text:"",style:""}}},legend:{enabled:!1,icons:!0,left:{visible:!0,position:["top-right","bottom-right","top-left","bottom-left"]},right:{visible:!0,position:["top-right","bottom-right","top-left","bottom-left"]}},autoResize:!0,clickToUse:!1,end:"",format:{minorLabels:{millisecond:"SSS",second:"s",minute:"HH:mm",hour:"HH:mm",weekday:"ddd D",day:"D",month:"MMM",year:"YYYY"},majorLabels:{millisecond:"HH:mm:ss",second:"D MMMM HH:mm",minute:"ddd D MMMM",hour:"ddd D MMMM",weekday:"MMMM YYYY",day:"MMMM YYYY",month:"YYYY",year:""}},height:"",locale:"",max:"",maxHeight:"",maxMinorChars:[7,0,20,1],min:"",minHeight:"",moveable:!0,orientation:["both","bottom","top"],showCurrentTime:!1,showMajorLabels:!0,showMinorLabels:!0,start:"",width:"100%",zoomable:!0,zoomKey:["ctrlKey","altKey","metaKey",""],zoomMax:[31536e10,10,31536e10,1],zoomMin:[10,10,31536e10,1],zIndex:0}};e.allOptions=a,e.configureOptions=h}
19290,function(t,e,i){function o(t){return R=t,f()}function n(){A=0,z=R.charAt(0)}function s(){A++,z=R.charAt(A)}function r(){return R.charAt(A+1)}function a(t){return B.test(t)}function h(t,e){if(t||(t={}),e)for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function d(t,e,i){for(var o=e.split("."),n=t;o.length;){var s=o.shift();o.length?(n[s]||(n[s]={}),n=n[s]):n[s]=i}}function l(t,e){for(var i,o,n=null,s=[t],r=t;r.parent;)s.push(r.parent),r=r.parent;if(r.nodes)for(i=0,o=r.nodes.length;i<o;i++)if(e.id===r.nodes[i].id){n=r.nodes[i];break}for(n||(n={id:e.id},t.node&&(n.attr=h(n.attr,t.node))),i=s.length-1;i>=0;i--){var a=s[i];a.nodes||(a.nodes=[]),-1===a.nodes.indexOf(n)&&a.nodes.push(n)}e.attr&&(n.attr=h(n.attr,e.attr))}function u(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=h({},t.edge);e.attr=h(i,e.attr)}}function c(t,e,i,o,n){var s={from:e,to:i,type:o};return t.edge&&(s.attr=h({},t.edge)),s.attr=h(s.attr||{},n),s}function p(){for(F=I.NULL,L="";" "===z||"\t"===z||"\n"===z||"\r"===z;)s();do{var t=!1;if("#"===z){for(var e=A-1;" "===R.charAt(e)||"\t"===R.charAt(e);)e--;if("\n"===R.charAt(e)||""===R.charAt(e)){for(;""!=z&&"\n"!=z;)s();t=!0}}if("/"===z&&"/"===r()){for(;""!=z&&"\n"!=z;)s();t=!0}if("/"===z&&"*"===r()){for(;""!=z;){if("*"===z&&"/"===r()){s(),s();break}s()}t=!0}for(;" "===z||"\t"===z||"\n"===z||"\r"===z;)s()}while(t);if(""===z)return void(F=I.DELIMITER);var i=z+r();if(N[i])return F=I.DELIMITER,L=i,s(),void s();if(N[z])return F=I.DELIMITER,L=z,void s();if(a(z)||"-"===z){for(L+=z,s();a(z);)L+=z,s();return"false"===L?L=!1:"true"===L?L=!0:isNaN(Number(L))||(L=Number(L)),void(F=I.IDENTIFIER)}if('"'===z){for(s();""!=z&&('"'!=z||'"'===z&&'"'===r());)'"'===z?(L+=z,s()):"\\"===z&&"n"===r()?(L+="\n",s()):L+=z,s();if('"'!=z)throw x('End of string " expected');return s(),void(F=I.IDENTIFIER)}for(F=I.UNKNOWN;""!=z;)L+=z,s();throw new SyntaxError('Syntax error in part "'+k(L,30)+'"')}function f(){var t={};if(n(),p(),"strict"===L&&(t.strict=!0,p()),"graph"!==L&&"digraph"!==L||(t.type=L,p()),F===I.IDENTIFIER&&(t.id=L,p()),"{"!=L)throw x("Angle bracket { expected");if(p(),m(t),"}"!=L)throw x("Angle bracket } expected");if(p(),""!==L)throw x("End of file expected");return p(),delete t.node,delete t.edge,delete t.graph,t}function m(t){for(;""!==L&&"}"!=L;)v(t),";"===L&&p()}function v(t){var e=g(t);if(e)return void _(t,e);if(!y(t)){if(F!=I.IDENTIFIER)throw x("Identifier expected");var i=L;if(p(),"="===L){if(p(),F!=I.IDENTIFIER)throw x("Identifier expected");t[i]=L,p()}else b(t,i)}}function g(t){var e=null;if("subgraph"===L&&(e={},e.type="subgraph",p(),F===I.IDENTIFIER&&(e.id=L,p())),"{"===L){if(p(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,m(e),"}"!=L)throw x("Angle bracket } expected");p(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function y(t){return"node"===L?(p(),t.node=w(),"node"):"edge"===L?(p(),t.edge=w(),"edge"):"graph"===L?(p(),t.graph=w(),"graph"):null}function b(t,e){var i={id:e},o=w();o&&(i.attr=o),l(t,i),_(t,e)}function _(t,e){for(;"->"===L||"--"===L;){var i,o=L;p();var n=g(t);if(n)i=n;else{if(F!=I.IDENTIFIER)throw x("Identifier or subgraph expected");i=L,l(t,{id:i}),p()}u(t,c(t,e,i,o,w())),e=i}}function w(){for(var t=null,e={dashed:!0,solid:!1,dotted:[1,5]};"["===L;){for(p(),t={};""!==L&&"]"!=L;){if(F!=I.IDENTIFIER)throw x("Attribute name expected");var i=L;if(p(),"="!=L)throw x("Equal sign = expected");if(p(),F!=I.IDENTIFIER)throw x("Attribute value expected");var o=L;"style"===i&&(o=e[o]),d(t,i,o),p(),","==L&&p()}if("]"!=L)throw x("Bracket ] expected");p()}return t}function x(t){return new SyntaxError(t+', got "'+k(L,30)+'" (char '+A+")")}function k(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function S(t,e,i){Array.isArray(t)?t.forEach(function(t){Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}):Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}function D(t,e,i){for(var o=e.split("."),n=o.pop(),s=t,r=0;r<o.length;r++){var a=o[r];a in s||(s[a]={}),s=s[a]}return s[n]=i,t}function M(t,e){var i={};for(var o in t)if(t.hasOwnProperty(o)){var n=e[o];
19290Array.isArray(n)?n.forEach(function(e){D(i,e,t[o])}):"string"==typeof n?D(i,n,t[o]):D(i,o,t[o])}return i}function C(t){var e=o(t),i={nodes:[],edges:[],options:{}};if(e.nodes&&e.nodes.forEach(function(t){var e={id:t.id,label:String(t.label||t.id)};h(e,M(t.attr,T)),e.image&&(e.shape="image"),i.nodes.push(e)}),e.edges){var n=function(t){var e={from:t.from,to:t.to};return h(e,M(t.attr,P)),e.arrows="->"===t.type?"to":void 0,e};e.edges.forEach(function(t){var e,o;e=t.from instanceof Object?t.from.nodes:{id:t.from},o=t.to instanceof Object?t.to.nodes:{id:t.to},t.from instanceof Object&&t.from.edges&&t.from.edges.forEach(function(t){var e=n(t);i.edges.push(e)}),S(e,o,function(e,o){var s=c(i,e.id,o.id,t.type,t.attr),r=n(s);i.edges.push(r)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var e=n(t);i.edges.push(e)})})}return e.attr&&(i.options=e.attr),i}var O=i(29),E=function(t){return t&&t.__esModule?t:{default:t}}(O),T={fontsize:"font.size",fontcolor:"font.color",labelfontcolor:"font.color",fontname:"font.face",color:["color.border","color.background"],fillcolor:"color.background",tooltip:"title",labeltooltip:"title"},P=(0,E.default)(T);P.color="color.color",P.style="dashes";var I={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},N={"{":!0,"}":!0,"[":!0,"]":!0,";
19290":!0,"=":!0,",":!0,"->":!0,"--":!0},R="",A=0,z="",L="",F=I.NULL,B=/[a-zA-Z_0-9.:#]/;e.parseDOT=o,e.DOTToGraph=C},function(t,e,i){function o(t,e){var i=[],o=[],n={edges:{inheritColor:!1},nodes:{fixed:!1,parseColor:!1}};void 0!==e&&(void 0!==e.fixed&&(n.nodes.fixed=e.fixed),void 0!==e.parseColor&&(n.nodes.parseColor=e.parseColor),void 0!==e.inheritColor&&(n.edges.inheritColor=e.inheritColor));for(var s=t.edges,r=t.nodes,a=0;a<s.length;a++){var h={},d=s[a];h.id=d.id,h.from=d.source,h.to=d.target,h.attributes=d.attributes,h.label=d.label,h.title=void 0!==d.attributes?d.attributes.title:void 0,"Directed"===d.type&&(h.arrows="to"),d.color&&!1===n.inheritColor&&(h.color=d.color),i.push(h)}for(var l=0;l<r.length;l++){var u={},c=r[l];u.id=c.id,u.attributes=c.attributes,u.x=c.x,u.y=c.y,u.label=c.label,u.title=void 0!==c.attributes?c.attributes.title:c.title,!0===n.nodes.parseColor?u.color=c.color:u.color=void 0!==c.color?{background:c.color,border:c.color,highlight:{background:c.color,border:c.color},hover:{background:c.color,border:c.color}}:void 0,u.size=c.size,u.fixed=n.nodes.fixed&&void 0!==c.x&&void 0!==c.y,o.push(u)}return{nodes:o,edges:i}}e.parseGephi=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(185),d=o(h),l=function(){function t(e){(0,s.default)(this,t),this.images={},this.imageBroken={},this.callback=e}return(0,a.default)(t,[{key:"_tryloadBrokenUrl",value:function(t,e,i){if(void 0!==t&&void 0!==i){if(void 0===e)return void console.warn("No broken url image defined");i.onerror=function(){console.error("Could not load brokenImage:",e)},i.image.src=e}}},{key:"_redrawWithImage",value:function(t){this.callback&&this.callback(t)}},{key:"load",value:function(t,e){var i=this,o=this.images[t];if(o)return o;var n=new d.default;return this.images[t]=n,n.image.onload=function(){i._fixImageCoordinates(n.image),n.init(),i._redrawWithImage(n)},n.image.onerror=function(){console.error("Could not load image:",t),i._tryloadBrokenUrl(t,e,n)},n.image.src=t,n}},{key:"_fixImageCoordinates",value:function(t){0===t.width&&(document.body.appendChild(t),t.width=t.offsetWidth,t.height=t.offsetHeight,document.body.removeChild(t))}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(6),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(2),p=i(48).default,f=i(191).default,m=["bold","ital","boldital","mono"],v=function(){function t(e,i){var o=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(0,d.default)(this,t),this.body=e,this.pointToSelf=!1,this.baseSize=void 0,this.fontOptions={},this.setOptions(i),this.size={top:0,left:0,width:0,height:0,yLine:0},this.isEdgeLabel=o}return(0,u.default)(t,[{key:"setOptions",value:function(t){if(this.elementOptions=t,this.initFontOptions(t.font),p.isValidLabel(t.label)?this.labelDirty=!0:t.label="",void 0!==t.font&&null!==t.font)if("string"==typeof t.font)this.baseSize=this.fontOptions.size;else if("object"===(0,a.default)(t.font)){var e=t.font.size;void 0!==e&&(this.baseSize=e)}}},{key:"initFontOptions",value:function(e){var i=this;if(c.forEach(m,function(t){i.fontOptions[t]={}}),t.parseFontString(this.fontOptions,e))return void(this.fontOptions.vadjust=0);c.forEach(e,function(t,e){void 0!==t&&null!==t&&"object"!==(void 0===t?"undefined":(0,a.default)(t))&&(i.fontOptions[e]=t)})}},{key:"constrain",value:function(t){var e={constrainWidth:!1,maxWdt:-1,minWdt:-1,constrainHeight:!1,minHgt:-1,valign:"middle"},i=c.topMost(t,"widthConstraint");if("number"==typeof i)e.maxWdt=Number(i),e.minWdt=Number(i);else if("object"===(void 0===i?"undefined":(0,a.default)(i))){var o=c.topMost(t,["widthConstraint","maximum"]);"number"==typeof o&&(e.maxWdt=Number(o));var n=c.topMost(t,["widthConstraint","minimum"]);"number"==typeof n&&(e.minWdt=Number(n))}var s=c.topMost(t,"heightConstraint");if("number"==typeof s)e.minHgt=Number(s);else if("object"===(void 0===s?"undefined":(0,a.default)(s))){var r=c.topMost(t,["heightConstraint","minimum"]);"number"==typeof r&&(e.minHgt=Number(r));var h=c.topMost(t,["heightConstraint","valign"]);"string"==typeof h&&("top"!==h&&"bottom"!==h||(e.valign=h))}return e}},{key:"update",value:function(t,e){this.setOptions(t,!0),this.prop
19290agateFonts(e),c.deepExtend(this.fontOptions,this.constrain(e)),this.fontOptions.chooser=p.choosify("label",e)}},{key:"adjustSizes",value:function(t){var e=t?t.right+t.left:0;this.fontOptions.constrainWidth&&(this.fontOptions.maxWdt-=e,this.fontOptions.minWdt-=e);var i=t?t.top+t.bottom:0;this.fontOptions.constrainHeight&&(this.fontOptions.minHgt-=i)}},{key:"addFontOptionsToPile",value:function(t,e){for(var i=0;i<e.length;++i)this.addFontToPile(t,e[i])}},{key:"addFontToPile",value:function(t,e){if(void 0!==e&&void 0!==e.font&&null!==e.font){var i=e.font;t.push(i)}}},{key:"getBasicOptions",value:function(e){for(var i={},o=0;o<e.length;++o){var n=e[o],s={};t.parseFontString(s,n)&&(n=s),c.forEach(n,function(t,e){void 0!==t&&(i.hasOwnProperty(e)||(-1!==m.indexOf(e)?i[e]={}:i[e]=t))})}return i}},{key:"getFontOption",value:function(e,i,o){for(var n=void 0,s=0;s<e.length;++s){var r=e[s];if(r.hasOwnProperty(i)){if(void 0===(n=r[i])||null===n)continue;var a={};if(t.parseFontString(a,n)&&(n=a),n.hasOwnProperty(o))return n[o]}}if(this.fontOptions.hasOwnProperty(o))return this.fontOptions[o];throw new Error("Did not find value for multi-font for property: '"+o+"'")}},{key:"getFontOptions",value:function(t,e){for(var i={},o=["color","size","face","mod","vadjust"],n=0;n<o.length;++n){var s=o[n];i[s]=this.getFontOption(t,e,s)}return i}},{key:"propagateFonts",value:function(t){var e=this,i=[];this.addFontOptionsToPile(i,t),this.fontOptions=this.getBasicOptions(i);for(var o=0;o<m.length;++o)!function(t){var o=m[t],n=e.fontOptions[o],s=e.getFontOptions(i,o);c.forEach(s,function(t,e){n[e]=t}),n.size=Number(n.size),n.vadjust=Number(n.vadjust)}(o)}},{key:"draw",value:function(t,e,i,o,n){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"middle";if(void 0!==this.elementOptions.label){var r=this.fontOptions.size*this.body.view.scale;this.elementOptions.label&&r<this.elementOptions.scaling.label.drawThreshold-1||(r>=this.elementOptions.scaling.label.maxVisible&&(r=Number(this.elementOptions.scaling.label.maxVisible)/this.body.view.scale),this.calculateLabelSize(t,o,n,e,i,s),this._drawBackground(t),this._drawText(t,e,this.size.yLine,s,r))}}},{key:"_drawBackground",value:function(t){if(void 0!==this.fontOptions.background&&"none"!==this.fontOptions.background){t.fillStyle=this.fontOptions.background;var e=this.getSize();t.fillRect(e.left,e.top,e.width,e.height)}}},{key:"_drawText",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"middle",n=arguments[4],r=this._setAlignment(t,e,i,o),a=(0,s.default)(r,2);e=a[0],i=a[1],t.textAlign="left",e-=this.size.width/2,this.fontOptions.valign&&this.size.height>this.size.labelHeight&&("top"===this.fontOptions.valign&&(i-=(this.size.height-this.size.labelHeight)/2),"bottom"===this.fontOptions.valign&&(i+=(this.size.height-this.size.labelHeight)/2));for(var h=0;h<this.lineCount;h++){var d=this.lines[h];if(d&&d.blocks){var l=0;this.isEdgeLabel||"center"===this.fontOptions.align?l+=(this.size.width-d.width)/2:"right"===this.fontOptions.align&&(l+=this.size.width-d.width);for(var u=0;u<d.blocks.length;u++){var c=d.blocks[u];t.font=c.font;var p=this._getColor(c.color,n,c.strokeColor),f=(0,s.default)(p,2),m=f[0],v=f[1];c.strokeWidth>0&&(t.lineWidth=c.strokeWidth,t.strokeStyle=v,t.lineJoin="round"),t.fillStyle=m,c.strokeWidth>0&&t.strokeText(c.text,e+l,i+c.vadjust),t.fillText(c.text,e+l,i+c.vadjust),l+=c.width}i+=d.height}}}},{key:"_setAlignment",value:function(t,e,i,o){if(this.isEdgeLabel&&"horizontal"!==this.fontOptions.align&&!1===this.pointToSelf){e=0,i=0;"top"===this.fontOptions.align?(t.textBaseline="alphabetic",i-=4):"bottom"===this.fontOptions.align?(t.textBaseline="hanging",i+=4):t.textBaseline="middle"}else t.textBaseline=o;return[e,i]}},{key:"_getColor",value:function(t,e,i){var o=t||"#000000",n=i||"#ffffff";if(e<=this.elementOptions.scaling.label.drawThreshold){var s=Math.max(0,Math.min(1,1-(this.elementOptions.scaling.label.drawThreshold-e)));o=c.overrideOpacity(o,s),n=c.overrideOpacity(n,s)}return[o,n]}},{key:"getTextSize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return this._processLabel(t,e,i),{width:this.size.width,height:this.size.height,lineCount:this.lineCount}}},{key:"getSize",value:function(){var t=this.size.left,e=this.size.top-1;if(this.isEdgeLabel){var i=.5*-this.size.width;switch(this.fontOptions.align){case"middle":t=i,e=.5*-this.size.height;break;case"top":t=i,e=-(this.size.height+2);break;case"bottom":t=i,e=2}}return{left:t,top:e,width:this.size.width,height:this.size.height}}}
19290,{key:"calculateLabelSize",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"middle";this._processLabel(t,e,i),this.size.left=o-.5*this.size.width,this.size.top=n-.5*this.size.height,this.size.yLine=n+.5*(1-this.lineCount)*this.fontOptions.size,"hanging"===s&&(this.size.top+=.5*this.fontOptions.size,this.size.top+=4,this.size.yLine+=4)}},{key:"getFormattingValues",value:function(t,e,i,o){var n=function(t,e,i){return"normal"===e?"mod"===i?"":t[i]:void 0!==t[e][i]?t[e][i]:t[i]},s={color:n(this.fontOptions,o,"color"),size:n(this.fontOptions,o,"size"),face:n(this.fontOptions,o,"face"),mod:n(this.fontOptions,o,"mod"),vadjust:n(this.fontOptions,o,"vadjust"),strokeWidth:this.fontOptions.strokeWidth,strokeColor:this.fontOptions.strokeColor};(e||i)&&("normal"===o&&!0===this.fontOptions.chooser&&this.elementOptions.labelHighlightBold?s.mod="bold":"function"==typeof this.fontOptions.chooser&&this.fontOptions.chooser(s,this.elementOptions.id,e,i));var r="";return void 0!==s.mod&&""!==s.mod&&(r+=s.mod+" "),r+=s.size+"px "+s.face,t.font=r.replace(/"/g,""),s.font=t.font,s.height=s.size,s}},{key:"differentState",value:function(t,e){return t!==this.selectedState||e!==this.hoverState}},{key:"_processLabelText",value:function(t,e,i,o){return new f(t,this,e,i).process(o)}},{key:"_processLabel",value:function(t,e,i){if(!1!==this.labelDirty||this.differentState(e,i)){var o=this._processLabelText(t,e,i,this.elementOptions.label);this.fontOptions.minWdt>0&&o.width<this.fontOptions.minWdt&&(o.width=this.fontOptions.minWdt),this.size.labelHeight=o.height,this.fontOptions.minHgt>0&&o.height<this.fontOptions.minHgt&&(o.height=this.fontOptions.minHgt),this.lines=o.lines,this.lineCount=o.lines.length,this.size.width=o.width,this.size.height=o.height,this.selectedState=e,this.hoverState=i,this.labelDirty=!1}}},{key:"visible",value:function(){return 0!==this.size.width&&0!==this.size.height&&void 0!==this.elementOptions.label&&!(this.fontOptions.size*this.body.view.scale<this.elementOptions.scaling.label.drawThreshold-1)}}],[{key:"parseFontString",value:function(t,e){if(!e||"string"!=typeof e)return!1;var i=e.split(" ");return t.size=i[0].replace("px",""),t.face=i[1],t.color=i[2],!0}}]),t}();e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(2),u=i(119).default,c=function(){function t(e,i,o){(0,a.default)(this,t),this.body=i,this.labelModule=o,this.options={},this.setOptions(e),this.colorDirty=!0,this.color={},this.selectionWidth=2,this.hoverWidth=1.5,this.fromPoint=this.from,this.toPoint=this.to}
19290return(0,d.default)(t,[{key:"connect",value:function(){this.from=this.body.nodes[this.options.from],this.to=this.body.nodes[this.options.to]}},{key:"cleanup",value:function(){return!1}},{key:"setOptions",value:function(t){this.options=t,this.from=this.body.nodes[this.options.from],this.to=this.body.nodes[this.options.to],this.id=this.options.id}},{key:"drawLine",value:function(t,e,i,o,n){t.strokeStyle=this.getColor(t,e,i,o),t.lineWidth=e.width,!1!==e.dashes?this._drawDashedLine(t,e,n):this._drawLine(t,e,n)}},{key:"_drawLine",value:function(t,e,i,o,n){if(this.from!=this.to)this._line(t,e,i,o,n);else{var r=this._getCircleData(t),a=(0,s.default)(r,3),h=a[0],d=a[1],l=a[2];this._circle(t,e,h,d,l)}}},{key:"_drawDashedLine",value:function(t,e,i,o,n){t.lineCap="round";var r=[5,5];if(!0===Array.isArray(e.dashes)&&(r=e.dashes),void 0!==t.setLineDash){if(t.save(),t.setLineDash(r),t.lineDashOffset=0,this.from!=this.to)this._line(t,e,i);else{var a=this._getCircleData(t),h=(0,s.default)(a,3),d=h[0],l=h[1],u=h[2];this._circle(t,e,d,l,u)}t.setLineDash([0]),t.lineDashOffset=0,t.restore()}else{if(this.from!=this.to)t.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,r);else{var c=this._getCircleData(t),p=(0,s.default)(c,3),f=p[0],m=p[1],v=p[2];this._circle(t,e,f,m,v)}this.enableShadow(t,e),t.stroke(),this.disableShadow(t,e)}}},{key:"findBorderPosition",value:function(t,e,i){return this.from!=this.to?this._findBorderPosition(t,e,i):this._findBorderPositionCircle(t,e,i)}},{key:"findBorderPositions",value:function(t){var e={},i={};if(this.from!=this.to)e=this._findBorderPosition(this.from,t),i=this._findBorderPosition(this.to,t);else{var o=this._getCircleData(t).slice(0,2),n=(0,s.default)(o,2),r=n[0],a=n[1];e=this._findBorderPositionCircle(this.from,t,{x:r,y:a,low:.25,high:.6,direction:-1}),i=this._findBorderPositionCircle(this.from,t,{x:r,y:a,low:.6,high:.8,direction:1})}return{from:e,to:i}}},{key:"_getCircleData",value:function(t){var e=void 0,i=void 0,o=this.from,n=this.options.selfReferenceSize;return void 0!==t&&void 0===o.shape.width&&o.shape.resize(t),o.shape.width>o.shape.height?(e=o.x+.5*o.shape.width,i=o.y-n):(e=o.x+n,i=o.y-.5*o.shape.height),[e,i,n]}},{key:"_pointOnCircle",value:function(t,e,i,o){var n=2*o*Math.PI;return{x:t+i*Math.cos(n),y:e-i*Math.sin(n)}}},{key:"_findBorderPositionCircle",value:function(t,e,i){for(var o=i.x,n=i.y,s=i.low,r=i.high,a=i.direction,h=0,d=this.options.selfReferenceSize,l=void 0,u=void 0,c=void 0,p=void 0,f=void 0,m=.5*(s+r);s<=r&&h<10&&(m=.5*(s+r),l=this._pointOnCircle(o,n,d,m),u=Math.atan2(t.y-l.y,t.x-l.x),c=t.distanceToBorder(e,u),p=Math.sqrt(Math.pow(l.x-t.x,2)+Math.pow(l.y-t.y,2)),f=c-p,!(Math.abs(f)<.05));)f>0?a>0?s=m:r=m:a>0?r=m:s=m,h++;return l.t=m,l}},{key:"getLineWidth",value:function(t,e){return!0===t?Math.max(this.selectionWidth,.3/this.body.view.scale):!0===e?Math.max(this.hoverWidth,.3/this.body.view.scale):Math.max(this.options.width,.3/this.body.view.scale)}},{key:"getColor",value:function(t,e,i,o){if(!1!==e.inheritsColor){if("both"===e.inheritsColor&&this.from.id!==this.to.id){var n=t.createLinearGradient(this.from.x,this.from.y,this.to.x,this.to.y),s=void 0,r=void 0;return s=this.from.options.color.highlight.border,r=this.to.options.color.highlight.border,!1===this.from.selected&&!1===this.to.selected?(s=l.overrideOpacity(this.from.options.color.border,e.opacity),r=l.overrideOpacity(this.to.options.color.border,e.opacity)):!0===this.from.selected&&!1===this.to.selected?r=this.to.options.color.border:!1===this.from.selected&&!0===this.to.selected&&(s=this.from.options.color.border),n.addColorStop(0,s),n.addColorStop(1,r),n}return"to"===e.inheritsColor?l.overrideOpacity(this.to.options.color.border,e.opacity):l.overrideOpacity(this.from.options.color.border,e.opacity)}return l.overrideOpacity(e.color,e.opacity)}},{key:"_circle",
19291    value:function(t,e,i,o,n){this.enableShadow(t,e),t.beginPath(),t.arc(i,o,n,0,2*Math.PI,!1),t.stroke(),this.disableShadow(t,e)}},{key:"getDistanceToEdge",value:function(t,e,i,o,n,r,a,h){var d=0;if(this.from!=this.to)d=this._getDistanceToEdge(t,e,i,o,n,r,a);else{var l=this._getCircleData(void 0),u=(0,s.default)(l,3),c=u[0],p=u[1],f=u[2],m=c-n,v=p-r;d=Math.abs(Math.sqrt(m*m+v*v)-f)}return d}}
19291,{key:"_getDistanceToLine",value:function(t,e,i,o,n,s){var r=i-t,a=o-e,h=r*r+a*a,d=((n-t)*r+(s-e)*a)/h;d>1?d=1:d<0&&(d=0);var l=t+d*r,u=e+d*a,c=l-n,p=u-s;return Math.sqrt(c*c+p*p)}},{key:"getArrowData",value:function(t,e,i,o,n,r){var a=void 0,h=void 0,d=void 0,l=void 0,u=void 0,c=void 0,p=void 0,f=r.width;if("from"===e?(d=this.from,l=this.to,u=.1,c=r.fromArrowScale,p=r.fromArrowType):"to"===e?(d=this.to,l=this.from,u=-.1,c=r.toArrowScale,p=r.toArrowType):(d=this.to,l=this.from,c=r.middleArrowScale,p=r.middleArrowType),d!=l)if("middle"!==e)if(!0===this.options.smooth.enabled){h=this.findBorderPosition(d,t,{via:i});var m=this.getPoint(Math.max(0,Math.min(1,h.t+u)),i);a=Math.atan2(h.y-m.y,h.x-m.x)}else a=Math.atan2(d.y-l.y,d.x-l.x),h=this.findBorderPosition(d,t);else a=Math.atan2(d.y-l.y,d.x-l.x),h=this.getPoint(.5,i);else{var v=this._getCircleData(t),g=(0,s.default)(v,3),y=g[0],b=g[1],_=g[2];"from"===e?(h=this.findBorderPosition(this.from,t,{x:y,y:b,low:.25,high:.6,direction:-1}),a=-2*h.t*Math.PI+1.5*Math.PI+.1*Math.PI):"to"===e?(h=this.findBorderPosition(this.from,t,{x:y,y:b,low:.6,high:1,direction:1}),a=-2*h.t*Math.PI+1.5*Math.PI-1.1*Math.PI):(h=this._pointOnCircle(y,b,_,.175),a=3.9269908169872414)}"middle"===e&&c<0&&(f*=-1);var w=15*c+3*f;return{point:h,core:{x:h.x-.9*w*Math.cos(a),y:h.y-.9*w*Math.sin(a)},angle:a,length:w,type:p}}},{key:"drawArrowHead",value:function(t,e,i,o,n){t.strokeStyle=this.getColor(t,e,i,o),t.fillStyle=t.strokeStyle,t.lineWidth=e.width,u.draw(t,n),this.enableShadow(t,e),t.fill(),this.disableShadow(t,e)}},{key:"enableShadow",value:function(t,e){!0===e.shadow&&(t.shadowColor=e.shadowColor,t.shadowBlur=e.shadowSize,t.shadowOffsetX=e.shadowX,t.shadowOffsetY=e.shadowY)}},{key:"disableShadow",value:function(t,e){!0===e.shadow&&(t.shadowColor="rgba(0,0,0,0)",t.shadowBlur=0,t.shadowOffsetX=0,t.shadowOffsetY=0)}}]),t}();e.default=c},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(4),a=o(r),h=i(5),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"transform",value:function(t,e){t instanceof Array||(t=[t]);for(var i=e.point.x,o=e.point.y,n=e.angle,s=e.length,r=0;r<t.length;++r){var a=t[r],h=a.x*Math.cos(n)-a.y*Math.sin(n),d=a.x*Math.sin(n)+a.y*Math.cos(n);a.x=i+s*h,a.y=o+s*d}}},{key:"drawPath",value:function(t,e){t.beginPath(),t.moveTo(e[0].x,e[0].y);for(var i=1;i<e.length;++i)t.lineTo(e[i].x,e[i].y);t.closePath()}}]),t}(),m=function(t){function e(){return(0,u.default)(this,e),(0,a.default)(this,(e.__proto__||(0,s.default)(e)).apply(this,arguments))}return(0,d.default)(e,t),(0,p.default)(e,null,[{key:"draw",value:function(t,e){var i=[{x:0,y:0},{x:-1,y:.3},{x:-.9,y:0},{x:-1,y:-.3}];f.transform(i,e),f.drawPath(t,i)}}]),e}(f),v=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"draw",value:function(t,e){var i={x:-.4,y:0};f.transform(i,e),t.circle(i.x,i.y,.4*e.length)}}]),t}(),g=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"draw",value:function(t,e){var i=[{x:0,y:.5},{x:0,y:-.5},{x:-.15,y:-.5},{x:-.15,y:.5}];f.transform(i,e),f.drawPath(t,i)}}]),t}(),y=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"draw",value:function(t,e){var i;switch(e.type&&(i=e.type.toLowerCase()),i){case"circle":v.draw(t,e);break;case"bar":g.draw(t,e);break;case"arrow":default:m.draw(t,e)}}}]),t}();e.default=y},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.physicsBody=i,this.barnesHutTree,this.setOptions(o),this.randomSeed=5}return(0,a.default)(t,[{key:"setOptions",value:function(t){this.options=t,this.thetaInversed=1/this.options.theta,this.overlapAvoidanceFactor=1-Math.max(0,Math.min(1,this.options.avoidOverlap))}},{key:"seededRandom",value:function(){var t=1e4*Math.sin(this.randomSeed++);return t-Math.floor(t)}},{key:"solve",value:function(){if(0!==this.options.gravitationalConstant&&this.physicsBody.physicsNodeIndices.length>0){var t=void 0,e=this.body.nodes,i=this.physicsBody.physicsNodeIndices,o=i.length,n=this._formBarnesHutTree(e,i);this.barnesHutTree=n;for(var s=0;s<o;s++)t=e[i[s]],t.options.mass>0&&this._getForceContributions(n.root,t)}}},{key:"_getForceContributions",value:function(t,e){this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e)}},{key:"_getForceContribution",value:function(t,e){if(t.childrenCount>0){var i=void 0,o=void 0,n=void 0;i=t.centerOfMass.x-e.x,o=t.centerOfMass.y-e.y,n=Math.sqrt(i*i+o*o),n*t.calcSize>this.thetaInversed?this._calculateForces(n,i,o,e,t):4===t.childrenCount?this._getForceContributions(t,e):t.children.data.id!=e.id&&this._calculateForces(n,i,o,e,t)}}}
19291,{key:"_calculateForces",value:function(t,e,i,o,n){0===t&&(t=.1,e=t),this.overlapAvoidanceFactor<1&&o.shape.radius&&(t=Math.max(.1+this.overlapAvoidanceFactor*o.shape.radius,t-o.shape.radius));var s=this.options.gravitationalConstant*n.mass*o.options.mass/Math.pow(t,3),r=e*s,a=i*s;this.physicsBody.forces[o.id].x+=r,this.physicsBody.forces[o.id].y+=a}},{key:"_formBarnesHutTree",value:function(t,e){for(var i=void 0,o=e.length,n=t[e[0]].x,s=t[e[0]].y,r=t[e[0]].x,a=t[e[0]].y,h=1;h<o;h++){var d=t[e[h]],l=d.x,u=d.y;d.options.mass>0&&(l<n&&(n=l),l>r&&(r=l),u<s&&(s=u),u>a&&(a=u))}var c=Math.abs(r-n)-Math.abs(a-s);c>0?(s-=.5*c,a+=.5*c):(n+=.5*c,r-=.5*c);var p=Math.max(1e-5,Math.abs(r-n)),f=.5*p,m=.5*(n+r),v=.5*(s+a),g={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:m-f,maxX:m+f,minY:v-f,maxY:v+f},size:p,calcSize:1/p,children:{data:null},maxWidth:0,level:0,childrenCount:4}};this._splitBranch(g.root);for(var y=0;y<o;y++)i=t[e[y]],i.options.mass>0&&this._placeInTree(g.root,i);return g}},{key:"_updateBranchMass",value:function(t,e){var i=t.centerOfMass,o=t.mass+e.options.mass,n=1/o;i.x=i.x*t.mass+e.x*e.options.mass,i.x*=n,i.y=i.y*t.mass+e.y*e.options.mass,i.y*=n,t.mass=o;var s=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidth<s?s:t.maxWidth}},{key:"_placeInTree",value:function(t,e,i){1==i&&void 0!==i||this._updateBranchMass(t,e);var o=t.children.NW.range,n=void 0;n=o.maxX>e.x?o.maxY>e.y?"NW":"SW":o.maxY>e.y?"NE":"SE",this._placeInRegion(t,e,n)}},{key:"_placeInRegion",value:function(t,e,i){var o=t.children[i];switch(o.childrenCount){case 0:o.children.data=e,o.childrenCount=1,this._updateBranchMass(o,e);break;case 1:o.children.data.x===e.x&&o.children.data.y===e.y?(e.x+=this.seededRandom(),e.y+=this.seededRandom()):(this._splitBranch(o),this._placeInTree(o,e));break;case 4:this._placeInTree(o,e)}}},{key:"_splitBranch",value:function(t){var e=null;1===t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)}},{key:"_insertRegion",value:function(t,e){var i=void 0,o=void 0,n=void 0,s=void 0,r=.5*t.size;switch(e){case"NW":i=t.range.minX,o=t.range.minX+r,n=t.range.minY,s=t.range.minY+r;break;case"NE":i=t.range.minX+r,o=t.range.maxX,n=t.range.minY,s=t.range.minY+r;break;case"SW":i=t.range.minX,o=t.range.minX+r,n=t.range.minY+r,s=t.range.maxY;break;case"SE":i=t.range.minX+r,o=t.range.maxX,n=t.range.minY+r,s=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:o,minY:n,maxY:s},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}}},{key:"_debug",value:function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))}},{key:"_drawBranch",value:function(t,e,i){void 0===i&&(i="#FF0000"),4===t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}}]),t}();e.default=h},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.physicsBody=i,this.setOptions(o)}return(0,a.default)(t,[{key:"setOptions",value:function(t){this.options=t}},{key:"solve",value:function(){for(var t=void 0,e=void 0,i=void 0,o=void 0,n=this.body.nodes,s=this.physicsBody.physicsNodeIndices,r=this.physicsBody.forces,a=0;a<s.length;a++){o=n[s[a]],t=-o.x,e=-o.y,i=Math.sqrt(t*t+e*e),this._calculateForces(i,t,e,r,o)}}}
19291,{key:"_calculateForces",value:function(t,e,i,o,n){var s=0===t?0:this.options.centralGravity/t;o[n.id].x=e*s,o[n.id].y=i*s}}]),t}();e.default=h},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var o="string",n="boolean",s="number",r="object",a=["arrow","circle","bar"],h={configure:{enabled:{boolean:n},filter:{boolean:n,string:o,array:"array",function:"function"},container:{dom:"dom"},showButton:{boolean:n},__type__:{object:r,boolean:n,string:o,array:"array",function:"function"}},edges:{arrows:{to:{enabled:{boolean:n},scaleFactor:{number:s},type:{string:a},__type__:{object:r,boolean:n}},middle:{enabled:{boolean:n},scaleFactor:{number:s},type:{string:a},__type__:{object:r,boolean:n}},from:{enabled:{boolean:n},scaleFactor:{number:s},type:{string:a},__type__:{object:r,boolean:n}},__type__:{string:["from","to","middle"],object:r}},arrowStrikethrough:{boolean:n},chosen:{label:{boolean:n,function:"function"},edge:{boolean:n,function:"function"},__type__:{object:r,boolean:n}},color:{color:{string:o},highlight:{string:o},hover:{string:o},inherit:{string:["from","to","both"],boolean:n},opacity:{number:s},__type__:{object:r,string:o}},dashes:{boolean:n,array:"array"},font:{color:{string:o},size:{number:s},face:{string:o},background:{string:o},strokeWidth:{number:s},strokeColor:{string:o},align:{string:["horizontal","top","middle","bottom"]},vadjust:{number:s},multi:{boolean:n,string:o},bold:{color:{string:o},size:{number:s},face:{string:o},mod:{string:o},vadjust:{number:s},__type__:{object:r,string:o}},boldital:{color:{string:o},size:{number:s},face:{string:o},mod:{string:o},vadjust:{number:s},__type__:{object:r,string:o}},ital:{color:{string:o},size:{number:s},face:{string:o},mod:{string:o},vadjust:{number:s},__type__:{object:r,string:o}},mono:{color:{string:o},size:{number:s},face:{string:o},mod:{string:o},vadjust:{number:s},__type__:{object:r,string:o}},__type__:{object:r,string:o}},hidden:{boolean:n},hoverWidth:{function:"function",number:s},label:{string:o,undefined:"undefined"},labelHighlightBold:{boolean:n},length:{number:s,undefined:"undefined"},physics:{boolean:n},scaling:{min:{number:s},max:{number:s},label:{enabled:{boolean:n},min:{number:s},max:{number:s},maxVisible:{number:s},drawThreshold:{number:s},__type__:{object:r,boolean:n}},customScalingFunction:{function:"function"},__type__:{object:r}},selectionWidth:{function:"function",number:s},selfReferenceSize:{number:s},shadow:{enabled:{boolean:n},color:{string:o},size:{number:s},x:{number:s},y:{number:s},__type__:{object:r,boolean:n}},smooth:{enabled:{boolean:n},type:{string:["dynamic","continuous","discrete","diagonalCross","straightCross","horizontal","vertical","curvedCW","curvedCCW","cubicBezier"]},roundness:{number:s},forceDirection:{string:["horizontal","vertical","none"],boolean:n},__type__:{object:r,boolean:n}},title:{string:o,undefined:"undefined"},width:{number:s},widthConstraint:{maximum:{number:s},__type__:{object:r,boolean:n,number:s}},value:{number:s,undefined:"undefined"},__type__:{object:r}},groups:{useDefaultGroups:{boolean:n},__any__:"get from nodes, will be overwritten below",__type__:{object:r}},interaction:{dragNodes:{boolean:n},dragView:{boolean:n},hideEdgesOnDrag:{boolean:n},hideNodesOnDrag:{boolean:n},hover:{boolean:n},keyboard:{enabled:{boolean:n},speed:{x:{number:s},y:{number:s},zoom:{number:s},__type__:{object:r}},bindToWindow:{boolean:n},__type__:{object:r,boolean:n}},multiselect:{boolean:n},navigationButtons:{boolean:n},selectable:{boolean:n},selectConnectedEdges:{boolean:n},hoverConnectedEdges:{boolean:n},tooltipDelay:{number:s},zoomView:{boolean:n},__type__:{object:r}},layout:{randomSeed:{undefined:"undefined",number:s},improvedLayout:{boolean:n},hierarchical:{enabled:{boolean:n},levelSeparation:{number:s},nodeSpacing:{number:s},treeSpacing:{number:s},blockShifting:{boolean:n},edgeMinimization:{boolean:n},parentCentralization:{boolean:n},direction:{string:["UD","DU","LR","RL"]},sortMethod:{string:["hubsize","directed"]},__type__:{object:r,boolean:n}},__type__:{object:r}},manipulation:{enabled:{boolean:n},initiallyActive:{boolean:n},addNode:{boolean:n,function:"function"},addEdge:{boolean:n,function:"function"},editNode:{function:"function"},editEdge:{editWithoutDrag:{function:"function"},__type__:{object:r,boolean:n,function:"function"}},deleteNode:{boolean:n,function:"function"},deleteEdge:{boolean:n,function:"function"},controlNodeStyle:"get from nodes, will be overwritten below",__type__:{object:r,boolean:n}},nodes:{borderWidth:{number:s},borderWidthSelected:{number:s,undefined:"undefined"},brokenImage:{string:o,undefined:"undefined"},chosen:{label:{boolean:n,function:"function"},node:{boolean:n,function:"function"},__type__:{object:r,boolean:n}},color:{border:{string:o},background:{string:o},highlight:{border:{string:o},background:{string:o},__type__:{object:r,string:o}},hover:{border:{string:o},background:{string:o},__type__:{object:r,string:o}},__type__:{object:r,string:o}},fixed:{x:{boolean:n},y:{boolean:n},__type__:{object:r,boolean:n}},font:{align:{string:o},color:{string:o},size:{number:s},face:{string:o},background:{string:o},strokeWidth:{number:s},strokeColor:{string:o},vadjust:{number:s},multi:{boolean:n,string:o},bold:{color:{string:o},size:{number:s},face:{string:o},mod:{string:o},vadjust:{number:s},__type__:{object:r,string:o}},boldital:{color:{string:o},size:{number:s},face:{string:o},mod:{string:o},vadjust:{number:s},__type__:{object:r,string:o}},ital:{color:{string:o},size:{number:s},face:{string:o},mod:{string:o},vadjust:{number:s},__type__:{object:r,string:o}},mono:{color:{string:o},size:{number:s},face:{string:o},mod:{string:o},vadjust:{number:s},__type__:{object:r,string:o}},__type__:{object:r,string:o}},group:{string:o,number:s,undefined:"undefined"},heightConstraint:{minimum:{number:s}
vendor: 4,145 bytes, line 19291
19291,valign:{string:o},__type__:{object:r,boolean:n,number:s}},hidden:{boolean:n},icon:{face:{string:o},code:{string:o},size:{number:s},color:{string:o},__type__:{object:r}},id:{string:o,number:s},image:{selected:{string:o,undefined:"undefined"},unselected:{string:o,undefined:"undefined"},__type__:{object:r,string:o}},label:{string:o,undefined:"undefined"},labelHighlightBold:{boolean:n},level:{number:s,undefined:"undefined"},margin:{top:{number:s},right:{number:s},bottom:{number:s},left:{number:s},__type__:{object:r,number:s}},mass:{number:s},physics:{boolean:n},scaling:{min:{number:s},max:{number:s},label:{enabled:{boolean:n},min:{number:s},max:{number:s},maxVisible:{number:s},drawThreshold:{number:s},__type__:{object:r,boolean:n}},customScalingFunction:{function:"function"},__type__:{object:r}},shadow:{enabled:{boolean:n},color:{string:o},size:{number:s},x:{number:s},y:{number:s},__type__:{object:r,boolean:n}},shape:{string:["ellipse","circle","database","box","text","image","circularImage","diamond","dot","star","triangle","triangleDown","square","icon","hexagon"]},shapeProperties:{borderDashes:{boolean:n,array:"array"},borderRadius:{number:s},interpolation:{boolean:n},useImageSize:{boolean:n},useBorderWithImage:{boolean:n},__type__:{object:r}},size:{number:s},title:{string:o,dom:"dom",undefined:"undefined"},value:{number:s,undefined:"undefined"},widthConstraint:{minimum:{number:s},maximum:{number:s},__type__:{object:r,boolean:n,number:s}},x:{number:s},y:{number:s},__type__:{object:r}},physics:{enabled:{boolean:n},barnesHut:{gravitationalConstant:{number:s},centralGravity:{number:s},springLength:{number:s},springConstant:{number:s},damping:{number:s},avoidOverlap:{number:s},__type__:{object:r}},forceAtlas2Based:{gravitationalConstant:{number:s},centralGravity:{number:s},springLength:{number:s},springConstant:{number:s},damping:{number:s},avoidOverlap:{number:s},__type__:{object:r}},repulsion:{centralGravity:{number:s},springLength:{number:s},springConstant:{number:s},nodeDistance:{number:s},damping:{number:s},__type__:{object:r}},hierarchicalRepulsion:{centralGravity:{number:s},springLength:{number:s},springConstant:{number:s},nodeDistance:{number:s},damping:{number:s},__type__:{object:r}},maxVelocity:{number:s},minVelocity:{number:s},solver:{string:["barnesHut","repulsion","hierarchicalRepulsion","forceAtlas2Based"]},stabilization:{enabled:{boolean:n},iterations:{number:s},updateInterval:{number:s},onlyDynamicEdges:{boolean:n},fit:{boolean:n},__type__:{object:r,boolean:n}},timestep:{number:s},adaptiveTimestep:{boolean:n},__type__:{object:r,boolean:n}},autoResize:{boolean:n},clickToUse:{boolean:n},locale:{string:o},locales:{__any__:{any:"any"},__type__:{object:r}},height:{string:o},width:{string:o},__type__:{object:r}};h.groups.__any__=h.nodes,h.manipulation.controlNodeStyle=h.nodes;var d={nodes:{borderWidth:[1,0,10,1],borderWidthSelected:[2,0,10,1],color:{border:["color","#2B7CE9"],background:["color","#97C2FC"],highlight:{border:["color","#2B7CE9"],background:["color","#D2E5FF"]},hover:{border:["color","#2B7CE9"],background:["color","#D2E5FF"]}},fixed:{x:!1,y:!1},font:{color:["color","#343434"],size:[14,0,100,1],face:["arial","verdana","tahoma"],background:["color","none"],strokeWidth:[0,0,50,1],strokeColor:["color","#ffffff"]},hidden:!1,labelHighlightBold:!0,physics:!0,scaling:{min:[10,0,200,1],max:[30,0,200,1],label:{enabled:!1,min:[14,0,200,1],max:[30,0,200,1],maxVisible:[30,0,200,1],drawThreshold:[5,0,20,1]}},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:[10,0,20,1],x:[5,-30,30,1],y:[5,-30,30,1]},shape:["ellipse","box","circle","database","diamond","dot","square","star","text","triangle","triangleDown","hexagon"],shapeProperties:{borderDashes:!1,borderRadius:[6,0,20,1],interpolation:!0,useImageSize:!1},size:[25,0,200,1]},edges:{arrows:{to:{enabled:!1,scaleFactor:[1,0,3,.05],type:"arrow"},middle:{enabled:!1,scaleFactor:[1,0,3,.05],type:"arrow"},from:{enabled:!1,scaleFactor:[1,0,3,.05],type:"arrow"}},arrowStrikethrough:!0,color:{color:["color","#848484"],highlight:["color","#848484"],hover:["color","#848484"],inherit:["from","to","both",!0,!1],opacity:[1,0,1,.05]}
19291,dashes:!1,font:{color:["color","#343434"],size:[14,0,100,1],face:["arial","verdana","tahoma"],background:["color","none"],strokeWidth:[2,0,50,1],strokeColor:["color","#ffffff"],align:["horizontal","top","middle","bottom"]},hidden:!1,hoverWidth:[1.5,0,5,.1],labelHighlightBold:!0,physics:!0,scaling:{min:[1,0,100,1],max:[15,0,100,1],label:{enabled:!0,min:[14,0,200,1],max:[30,0,200,1],maxVisible:[30,0,200,1],drawThreshold:[5,0,20,1]}},selectionWidth:[1.5,0,5,.1],selfReferenceSize:[20,0,200,1],shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:[10,0,20,1],x:[5,-30,30,1],y:[5,-30,30,1]},smooth:{enabled:!0,type:["dynamic","continuous","discrete","diagonalCross","straightCross","horizontal","vertical","curvedCW","curvedCCW","cubicBezier"],forceDirection:["horizontal","vertical","none"],roundness:[.5,0,1,.05]},width:[1,0,30,1]},layout:{hierarchical:{enabled:!1,levelSeparation:[150,20,500,5],nodeSpacing:[100,20,500,5],treeSpacing:[200,20,500,5],blockShifting:!0,edgeMinimization:!0,parentCentralization:!0,direction:["UD","DU","LR","RL"],sortMethod:["hubsize","directed"]}},interaction:{dragNodes:!0,dragView:!0,hideEdgesOnDrag:!1,hideNodesOnDrag:!1,hover:!1,keyboard:{enabled:!1,speed:{x:[10,0,40,1],y:[10,0,40,1],zoom:[.02,0,.1,.005]},bindToWindow:!0},multiselect:!1,navigationButtons:!1,selectable:!0,selectConnectedEdges:!0,hoverConnectedEdges:!0,tooltipDelay:[300,0,1e3,25],zoomView:!0},manipulation:{enabled:!1,initiallyActive:!1},physics:{enabled:!0,barnesHut:{gravitationalConstant:[-2e3,-3e4,0,50],centralGravity:[.3,0,10,.05],springLength:[95,0,500,5],springConstant:[.04,0,1.2,.005],damping:[.09,0,1,.01],avoidOverlap:[0,0,1,.01]},forceAtlas2Based:{gravitationalConstant:[-50,-500,0,1],centralGravity:[.01,0,1,.005],springLength:[95,0,500,5],springConstant:[.08,0,1.2,.005],damping:[.4,0,1,.01],avoidOverlap:[0,0,1,.01]},repulsion:{centralGravity:[.2,0,10,.05],springLength:[200,0,500,5],springConstant:[.05,0,1.2,.005],nodeDistance:[100,0,500,5],damping:[.09,0,1,.01]},hierarchicalRepulsion:{centralGravity:[.2,0,10,.05],springLength:[100,0,500,5],springConstant:[.01,0,1.2,.005],nodeDistance:[120,0,500,5],damping:[.09,0,1,.01]},maxVelocity:[50,0,150,1],minVelocity:[.1,.01,.5,.01],solver:["barnesHut","forceAtlas2Based","repulsion","hierarchicalRepulsion"],timestep:[.5,.01,1,.01]}};e.allOptions=h,e.configureOptions=d},function(t,e,i){var o=i(2);o.extend(e,i(159)),o.extend(e,i(177)),o.extend(e,i(181))},function(t,e,i){i(49),i(60),t.exports=i(136)},function(t,e,i){var o=i(126),n=i(127),s=i(31),r=i(25);t.exports=i(79)(Array,"Array",function(t,e){this._t=r(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,i=this._i++;return!t||i>=t.length?(this._t=void 0,n(1)):"keys"==e?n(0,i):"values"==e?n(0,t[i]):n(0,[i,t[i]])},"values"),s.Arguments=s.Array,o("keys"),o("values"),o("entries")},function(t,e){t.exports=function(){}},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,i){var o=i(54),n=i(39),s=i(59),r={};i(26)(r,i(13)("iterator"),function(){return this}),t.exports=function(t,e,i){t.prototype=o(r,{next:n(1,i)}),s(t,e+" Iterator")}},function(t,e,i){var o=i(20),n=i(27),s=i(33);t.exports=i(21)?Object.defineProperties:function(t,e){n(t);for(var i,r=s(e),a=r.length,h=0;a>h;)o.f(t,i=r[h++],e[i]);return t}},function(t,e,i){var o=i(25),n=i(132),s=i(133);t.exports=function(t){return function(e,i,r){var a,h=o(e),d=n(h.length),l=s(r,d);if(t&&i!=i){for(;d>l;)if((a=h[l++])!=a)return!0}else for(;d>l;l++)if((t||l in h)&&h[l]===i)return t||l||0;return!t&&-1}}},function(t,e,i){var o=i(55),n=Math.min;t.exports=function(t){return t>0?n(o(t),9007199254740991):0}},function(t,e,i){var o=i(55),n=Math.max,s=Math.min;t.exports=function(t,e){return t=o(t),t<0?n(t+e,0):s(t,e)}},function(t,e,i){var o=i(18).document;t.exports=o&&o.documentElement},function(t,e,i){var o=i(55),n=i(51);t.exports=function(t){return function(e,i){var s,r,a=String(n(e)),h=o(i),d=a.length;return h<0||h>=d?t?"":void 0:(s=a.charCodeAt(h),s<55296||s>
vendor: 4,170 bytes, line 19291
1929156319||h+1===d||(r=a.charCodeAt(h+1))<56320||r>57343?t?a.charAt(h):s:t?a.slice(h,h+2):r-56320+(s-55296<<10)+65536)}}},function(t,e,i){var o=i(27),n=i(137);t.exports=i(7).getIterator=function(t){var e=n(t);if("function"!=typeof e)throw TypeError(t+" is not iterable!");return o(e.call(t))}},function(t,e,i){var o=i(86),n=i(13)("iterator"),s=i(31);t.exports=i(7).getIteratorMethod=function(t){if(void 0!=t)return t[n]||t["@@iterator"]||s[o(t)]}},function(t,e,i){i(139);var o=i(7).Object;t.exports=function(t,e){return o.create(t,e)}},function(t,e,i){var o=i(17);o(o.S,"Object",{create:i(54)})},function(t,e,i){i(141),t.exports=i(7).Object.keys},function(t,e,i){var o=i(41),n=i(33);i(87)("keys",function(){return function(t){return n(o(t))}})},function(t,e,i){t.exports={default:i(143),__esModule:!0}},function(t,e,i){i(60),i(49),t.exports=i(61).f("iterator")},function(t,e,i){t.exports={default:i(145),__esModule:!0}},function(t,e,i){i(146),i(151),i(152),i(153),t.exports=i(7).Symbol},function(t,e,i){var o=i(18),n=i(22),s=i(21),r=i(17),a=i(83),h=i(147).KEY,d=i(28),l=i(57),u=i(59),c=i(40),p=i(13),f=i(61),m=i(62),v=i(148),g=i(149),y=i(27),b=i(25),_=i(53),w=i(39),x=i(54),k=i(150),S=i(89),D=i(20),M=i(33),C=S.f,O=D.f,E=k.f,T=o.Symbol,P=o.JSON,I=P&&P.stringify,N=p("_hidden"),R=p("toPrimitive"),A={}.propertyIsEnumerable,z=l("symbol-registry"),L=l("symbols"),F=l("op-symbols"),B=Object.prototype,j="function"==typeof T,H=o.QObject,W=!H||!H.prototype||!H.prototype.findChild,Y=s&&d(function(){return 7!=x(O({},"a",{get:function(){return O(this,"a",{value:7}).a}})).a})?function(t,e,i){var o=C(B,e);o&&delete B[e],O(t,e,i),o&&t!==B&&O(B,e,o)}:O,G=function(t){var e=L[t]=x(T.prototype);return e._k=t,e},V=j&&"symbol"==typeof T.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof T},U=function(t,e,i){return t===B&&U(F,e,i),y(t),e=_(e,!0),y(i),n(L,e)?(i.enumerable?(n(t,N)&&t[N][e]&&(t[N][e]=!1),i=x(i,{enumerable:w(0,!1)})):(n(t,N)||O(t,N,w(1,{})),t[N][e]=!0),Y(t,e,i)):O(t,e,i)},q=function(t,e){y(t);for(var i,o=v(e=b(e)),n=0,s=o.length;s>n;)U(t,i=o[n++],e[i]);return t},X=function(t,e){return void 0===e?x(t):q(x(t),e)},Z=function(t){var e=A.call(this,t=_(t,!0));return!(this===B&&n(L,t)&&!n(F,t))&&(!(e||!n(this,t)||!n(L,t)||n(this,N)&&this[N][t])||e)},K=function(t,e){if(t=b(t),e=_(e,!0),t!==B||!n(L,e)||n(F,e)){var i=C(t,e);return!i||!n(L,e)||n(t,N)&&t[N][e]||(i.enumerable=!0),i}},J=function(t){for(var e,i=E(b(t)),o=[],s=0;i.length>s;)n(L,e=i[s++])||e==N||e==h||o.push(e);return o},$=function(t){for(var e,i=t===B,o=E(i?F:b(t)),s=[],r=0;o.length>r;)!n(L,e=o[r++])||i&&!n(B,e)||s.push(L[e]);return s};j||(T=function(){if(this instanceof T)throw TypeError("Symbol is not a constructor!");var t=c(arguments.length>0?arguments[0]:void 0),e=function(i){this===B&&e.call(F,i),n(this,N)&&n(this[N],t)&&(this[N][t]=!1),Y(this,t,w(1,i))};return s&&W&&Y(B,t,{configurable:!0,set:e}),G(t)},a(T.prototype,"toString",function(){return this._k}),S.f=K,D.f=U,i(88).f=k.f=J,i(42).f=Z,i(63).f=$,s&&!i(52)&&a(B,"propertyIsEnumerable",Z,!0),f.f=function(t){return G(p(t))}),r(r.G+r.W+r.F*!j,{Symbol:T});for(var Q="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),tt=0;Q.length>tt;)p(Q[tt++]);for(var et=M(p.store),it=0;et.length>it;)m(et[it++]);r(r.S+r.F*!j,"Symbol",{for:function(t){return n(z,t+="")?z[t]:z[t]=T(t)},keyFor:function(t){if(!V(t))throw TypeError(t+" is not a symbol!");for(var e in z)if(z[e]===t)return e},useSetter:function(){W=!0},useSimple:function(){W=!1}}),r(r.S+r.F*!j,"Object",{create:X,defineProperty:U,defineProperties:q,getOwnPropertyDescriptor:K,getOwnPropertyNames:J,getOwnPropertySymbols:$}),P&&r(r.S+r.F*(!j||d(function(){var t=T();return"[null]"!=I([t])||"{}"!=I({a:t})||"{}"!=I(Object(t))})),"JSON",{stringify:function(t){if(void 0!==t&&!V(t)){for(var e,i,o=[t],n=1;arguments.length>n;)o.push(arguments[n++]);return e=o[1],"function"==typeof e&&(i=e),!i&&g(e)||(e=function(t,e){if(i&&(e=i.call(this,t,e)),!V(e))return e}),o[1]=e,I.apply(P,o)}}}),T.prototype[R]||i(26)(T.prototype,R,T.prototype.valueOf),u(T,"Symbol"),u(Math,"Math",!0),u(o.JSON,"JSON",!0)}
vendor: 24,237 bytes, lines 19291-19292
19291,function(t,e,i){var o=i(40)("meta"),n=i(32),s=i(22),r=i(20).f,a=0,h=Object.isExtensible||function(){return!0},d=!i(28)(function(){return h(Object.preventExtensions({}))}),l=function(t){r(t,o,{value:{i:"O"+ ++a,w:{}}})},u=function(t,e){if(!n(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!s(t,o)){if(!h(t))return"F";if(!e)return"E";l(t)}return t[o].i},c=function(t,e){if(!s(t,o)){if(!h(t))return!0;if(!e)return!1;l(t)}return t[o].w},p=function(t){return d&&f.NEED&&h(t)&&!s(t,o)&&l(t),t},f=t.exports={KEY:o,NEED:!1,fastKey:u,getWeak:c,onFreeze:p}},function(t,e,i){var o=i(33),n=i(63),s=i(42);t.exports=function(t){var e=o(t),i=n.f;if(i)for(var r,a=i(t),h=s.f,d=0;a.length>d;)h.call(t,r=a[d++])&&e.push(r);return e}},function(t,e,i){var o=i(50);t.exports=Array.isArray||function(t){return"Array"==o(t)}},function(t,e,i){var o=i(25),n=i(88).f,s={}.toString,r="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],a=function(t){try{return n(t)}catch(t){return r.slice()}};t.exports.f=function(t){return r&&"[object Window]"==s.call(t)?a(t):n(o(t))}},function(t,e){},function(t,e,i){i(62)("asyncIterator")},function(t,e,i){i(62)("observable")},function(t,e,i){(function(t){!function(e,i){t.exports=i()}(0,function(){function e(){return Co.apply(null,arguments)}function i(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function o(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function n(t){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(t).length;var e;for(e in t)if(t.hasOwnProperty(e))return!1;return!0}function s(t){return void 0===t}function r(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function a(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function h(t,e){var i,o=[];for(i=0;i<t.length;++i)o.push(e(t[i],i));return o}function d(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function l(t,e){for(var i in e)d(e,i)&&(t[i]=e[i]);return d(e,"toString")&&(t.toString=e.toString),d(e,"valueOf")&&(t.valueOf=e.valueOf),t}function u(t,e,i,o){return Se(t,e,i,o,!0).utc()}function c(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}}function p(t){return null==t._pf&&(t._pf=c()),t._pf}function f(t){if(null==t._isValid){var e=p(t),i=Oo.call(e.parsedDateParts,function(t){return null!=t}),o=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidMonth&&!e.invalidWeekday&&!e.weekdayMismatch&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&i);if(t._strict&&(o=o&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour),null!=Object.isFrozen&&Object.isFrozen(t))return o;t._isValid=o}return t._isValid}function m(t){var e=u(NaN);return null!=t?l(p(e),t):p(e).userInvalidated=!0,e}function v(t,e){var i,o,n;if(s(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),s(e._i)||(t._i=e._i),s(e._f)||(t._f=e._f),s(e._l)||(t._l=e._l),s(e._strict)||(t._strict=e._strict),s(e._tzm)||(t._tzm=e._tzm),s(e._isUTC)||(t._isUTC=e._isUTC),s(e._offset)||(t._offset=e._offset),s(e._pf)||(t._pf=p(e)),s(e._locale)||(t._locale=e._locale),Eo.length>0)for(i=0;i<Eo.length;i++)o=Eo[i],n=e[o],s(n)||(t[o]=n);return t}function g(t){v(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===To&&(To=!0,e.updateOffset(this),To=!1)}function y(t){return t instanceof g||null!=t&&null!=t._isAMomentObject}function b(t){return t<0?Math.ceil(t)||0:Math.floor(t)}function _(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=b(e)),i}function w(t,e,i){var o,n=Math.min(t.length,e.length),s=Math.abs(t.length-e.length),r=0;for(o=0;o<n;o++)(i&&t[o]!==e[o]||!i&&_(t[o])!==_(e[o]))&&r++;return r+s}function x(t){!1===e.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function k(t,i){var o=!0;return l(function(){if(null!=e.deprecationHandler&&e.deprecationHandler(null,t),o){for(var n,s=[],r=0;r<arguments.length;r++){if(n="","object"==typeof arguments[r]){n+="\n["+r+"] "
19292;for(var a in arguments[0])n+=a+": "+arguments[0][a]+", ";n=n.slice(0,-2)}else n=arguments[r];s.push(n)}x(t+"\nArguments: "+Array.prototype.slice.call(s).join("")+"\n"+(new Error).stack),o=!1}return i.apply(this,arguments)},i)}function S(t,i){null!=e.deprecationHandler&&e.deprecationHandler(t,i),Po[t]||(x(i),Po[t]=!0)}function D(t){return t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function M(t){var e,i;for(i in t)e=t[i],D(e)?this[i]=e:this["_"+i]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)}function C(t,e){var i,n=l({},t);for(i in e)d(e,i)&&(o(t[i])&&o(e[i])?(n[i]={},l(n[i],t[i]),l(n[i],e[i])):null!=e[i]?n[i]=e[i]:delete n[i]);for(i in t)d(t,i)&&!d(e,i)&&o(t[i])&&(n[i]=l({},n[i]));return n}function O(t){null!=t&&this.set(t)}function E(t,e,i){var o=this._calendar[t]||this._calendar.sameElse;return D(o)?o.call(e,i):o}function T(t){var e=this._longDateFormat[t],i=this._longDateFormat[t.toUpperCase()];return e||!i?e:(this._longDateFormat[t]=i.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])}function P(){return this._invalidDate}function I(t){return this._ordinal.replace("%d",t)}function N(t,e,i,o){var n=this._relativeTime[i];return D(n)?n(t,e,i,o):n.replace(/%d/i,t)}function R(t,e){var i=this._relativeTime[t>0?"future":"past"];return D(i)?i(e):i.replace(/%s/i,e)}function A(t,e){var i=t.toLowerCase();Lo[i]=Lo[i+"s"]=Lo[e]=t}function z(t){return"string"==typeof t?Lo[t]||Lo[t.toLowerCase()]:void 0}function L(t){var e,i,o={};for(i in t)d(t,i)&&(e=z(i))&&(o[e]=t[i]);return o}function F(t,e){Fo[t]=e}function B(t){var e=[];for(var i in t)e.push({unit:i,priority:Fo[i]});return e.sort(function(t,e){return t.priority-e.priority}),e}function j(t,e,i){var o=""+Math.abs(t),n=e-o.length;return(t>=0?i?"+":"":"-")+Math.pow(10,Math.max(0,n)).toString().substr(1)+o}function H(t,e,i,o){var n=o;"string"==typeof o&&(n=function(){return this[o]()}),t&&(Wo[t]=n),e&&(Wo[e[0]]=function(){return j(n.apply(this,arguments),e[1],e[2])}),i&&(Wo[i]=function(){return this.localeData().ordinal(n.apply(this,arguments),t)})}function W(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function Y(t){var e,i,o=t.match(Bo);for(e=0,i=o.length;e<i;e++)Wo[o[e]]?o[e]=Wo[o[e]]:o[e]=W(o[e]);return function(e){var n,s="";for(n=0;n<i;n++)s+=D(o[n])?o[n].call(e,t):o[n];return s}}function G(t,e){return t.isValid()?(e=V(e,t.localeData()),Ho[e]=Ho[e]||Y(e),Ho[e](t)):t.localeData().invalidDate()}function V(t,e){function i(t){return e.longDateFormat(t)||t}var o=5;for(jo.lastIndex=0;o>=0&&jo.test(t);)t=t.replace(jo,i),jo.lastIndex=0,o-=1;return t}function U(t,e,i){an[t]=D(e)?e:function(t,o){return t&&i?i:e}}function q(t,e){return d(an,t)?an[t](e._strict,e._locale):new RegExp(X(t))}function X(t){return Z(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,o,n){return e||i||o||n}))}function Z(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function K(t,e){var i,o=e;for("string"==typeof t&&(t=[t]),r(e)&&(o=function(t,i){i[e]=_(t)}),i=0;i<t.length;i++)hn[t[i]]=o}function J(t,e){K(t,function(t,i,o,n){o._w=o._w||{},e(t,o._w,o,n)})}function $(t,e,i){null!=e&&d(hn,t)&&hn[t](e,i._a,i,t)}function Q(t){return tt(t)?366:365}function tt(t){return t%4==0&&t%100!=0||t%400==0}function et(){return tt(this.year())}function it(t,i){return function(o){return null!=o?(nt(this,t,o),e.updateOffset(this,i),this):ot(this,t)}}function ot(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function nt(t,e,i){t.isValid()&&!isNaN(i)&&("FullYear"===e&&tt(t.year())?t._d["set"+(t._isUTC?"UTC":"")+e](i,t.month(),ht(i,t.month())):t._d["set"+(t._isUTC?"UTC":"")+e](i))}function st(t){return t=z(t),D(this[t])?this[t]():this}function rt(t,e){if("object"==typeof t){t=L(t);for(var i=B(t),o=0;o<i.length;o++)this[i[o].unit](t[i[o].unit])}else if(t=z(t),D(this[t]))return this[t](e);return this}function at(t,e){return(t%e+e)%e}function ht(t,e){if(isNaN(t)||isNaN(e))return NaN;var i=at(e,12);return t+=(e-i)/12,1===i?tt(t)?29:28:31-i%7%2}function dt(t,e){return t?i(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||_n).test(e)?"format":"standalone"][t.month()]:i(this._months)?this._months:this._months.standalone}function lt(t,e){return t?i(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[_n.test(e)?"format":"standalone"][t.month()]:i(this._monthsShort)?this._monthsShort:this._monthsShort.standalone}function ut(t,e,i){var o,n,s,r=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],o=0;o<12;++o)s=u([2e3,o]),this._shortMonthsParse[o]=this.monthsShort(s,"").toLocaleLowerCase(),this._longMonthsParse[o]=this.months(s,"").toLocaleLowerCase();return i?"MMM"===e?(n=yn.call(this._shortMonthsParse,r),-1!==n?n:null):(n=yn.call(this._longMonthsParse,r),-1!==n?n:null):"MMM"===e?-1!==(n=yn.call(this._shortMonthsParse,r))?n:(n=yn.call(this._longMonthsParse,r),-1!==n?n:null):-1!==(n=yn.call(this._longMonthsParse,r))?n:(n=yn.call(this._shortMonthsParse,r),-1!==n?n:null)}function ct(t,e,i){var o,n,s;if(this._monthsParseExact)return ut.call(this,t,e,i);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),o=0;o<12;o++){if(n=u([2e3,o]),i&&!this._longMonthsParse[o]&&(this._longMonthsParse[o]=new RegExp("^"+this.months(n,"").replace(".","")+"$","i"),this._shortMonthsParse[o]=new RegExp("^"+this.monthsShort(n,"").replace(".","")+"$","i")),i||this._monthsParse[o]||(s="^"+this.months(n,"")+"|^"+this.monthsShort(n,""),this._monthsParse[o]=new RegExp(s.replace(".",""),"i")),i&&"MMMM"===e&&this._longMonthsParse[o].test(t))return o;if(i&&"MMM"===e&&this._shortMonthsParse[o].test(t))return o;if(!i&&this._monthsParse[o].test(t))return o}}function pt(t,e){var i;if(!t.isValid())return t;if("string"==typeof e)if(/^\d+$/.test(e))e=_(e);else if(e=t.localeData().monthsParse(e),!r(e))return t;return i=Math.min(t.date(),ht(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,i),t}function ft(t){return null!=t?(pt(this,t),e.updateOffset(this,!0),this):ot(this,"Month")}function mt(){return ht(this.year(),this.month())}function vt(t){return this._monthsParseExact?(d(this,"_monthsRegex")||yt.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(d(this,"_monthsShortRegex")||(this._monthsShortRegex=kn),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)}function gt(t){return this._monthsParseExact?(d(this,"_monthsRegex")||yt.call(this),t?this._monthsStrictRegex:this._monthsRegex):(d(this,"_monthsRegex")||(this._monthsRegex=Sn),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)}function yt(){function t(t,e){return e.length-t.length}var e,i,o=[],n=[],s=[];for(e=0;e<12;e++)i=u([2e3,e]),o.push(this.monthsShort(i,"")),n.push(this.months(i,"")),s.push(this.months(i,"")),s.push(this.monthsShort(i,""));for(o.sort(t),n.sort(t),s.sort(t),e=0;e<12;e++)o[e]=Z(o[e]),n[e]=Z(n[e]);for(e=0;e<24;e++)s[e]=Z(s[e]);this._monthsRegex=new RegExp("^("+s.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+n.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+o.join("|")+")","i")}function bt(t,e,i,o,n,s,r){var a=new Date(t,e,i,o,n,s,r);return t<100&&t>=0&&isFinite(a.getFullYear())&&a.setFullYear(t),a}function _t(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function wt(t,e,i){var o=7+e-i;return-(7+_t(t,0,o).getUTCDay()-e)%7+o-1}function xt(t,e,i,o,n){var s,r,a=(7+i-o)%7,h=wt(t,o,n),d=1+7*(e-1)+a+h;return d<=0?(s=t-1,r=Q(s)+d):d>Q(t)?(s=t+1,r=d-Q(t)):(s=t,r=d),{year:s,dayOfYear:r}}function kt(t,e,i){var o,n,s=wt(t.year(),e,i),r=Math.floor((t.dayOfYear()-s-1)/7)+1;return r<1?(n=t.year()-1,o=r+St(n,e,i)):r>St(t.year(),e,i)?(o=r-St(t.year(),e,i),n=t.year()+1):(n=t.year(),o=r),{week:o,year:n}}function St(t,e,i){var o=wt(t,e,i),n=wt(t+1,e,i);return(Q(t)-o+n)/7}function Dt(t){return kt(t,this._week.dow,this._week.doy).week}function Mt(){return this._week.dow}function Ct(){return this._week.doy}function Ot(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function Et(t){var e=kt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function Tt(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function Pt(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function It(t,e){return t?i(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:i(this._weekdays)?this._weekdays:this._weekdays.standalone}function Nt(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort}function Rt(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin}function At(t,e,i){var o,n,s,r=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],o=0;o<7;++o)s=u([2e3,1]).day(o),this._minWeekdaysParse[o]=this.weekdaysMin(s,"").toLocaleLowerCase(),this._shortWeekdaysParse[o]=this.weekdaysShort(s,"").toLocaleLowerCase(),this._weekdaysParse[o]=this.weekdays(s,"").toLocaleLowerCase();return i?"dddd"===e?(n=yn.call(this._weekdaysParse,r),-1!==n?n:null):"ddd"===e?(n=yn.call(this._shortWeekdaysParse,r),-1!==n?n:null):(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):"dddd"===e?-1!==(n=yn.call(this._weekdaysParse,r))?n:-1!==(n=yn.call(this._shortWeekdaysParse,r))?n:(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):"ddd"===e?-1!==(n=yn.call(this._shortWeekdaysParse,r))?n:-1!==(n=yn.call(this._weekdaysParse,r))?n:(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):-1!==(n=yn.call(this._minWeekdaysParse,r))?n:-1!==(n=yn.call(this._weekdaysParse,r))?n:(n=yn.call(this._shortWeekdaysParse,r),-1!==n?n:null)}function zt(t,e,i){var o,n,s;if(this._weekdaysParseExact)return At.call(this,t,e,i);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),o=0;o<7;o++){if(n=u([2e3,1]).day(o),i&&!this._fullWeekdaysParse[o]&&(this._fullWeekdaysParse[o]=new RegExp("^"+this.weekdays(n,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[o]=new RegExp("^"+this.weekdaysShort(n,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[o]=new RegExp("^"+this.weekdaysMin(n,"").replace(".",".?")+"$","i")),this._weekdaysParse[o]||(s="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,""),this._weekdaysParse[o]=new RegExp(s.replace(".",""),"i")),i&&"dddd"===e&&this._fullWeekdaysParse[o].test(t))return o;if(i&&"ddd"===e&&this._shortWeekdaysParse[o].test(t))return o;if(i&&"dd"===e&&this._minWeekdaysParse[o].test(t))return o;if(!i&&this._weekdaysParse[o].test(t))return o}}function Lt(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=Tt(t,this.localeData()),this.add(t-e,"d")):e}function Ft(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function Bt(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=Pt(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7}function jt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=En),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)}function Ht(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Tn),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Wt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Pn),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Yt(){function t(t,e){return e.length-t.length}var e,i,o,n,s,r=[],a=[],h=[],d=[];for(e=0;e<7;e++)i=u([2e3,1]).day(e),o=this.weekdaysMin(i,""),n=this.weekdaysShort(i,""),s=this.weekdays(i,""),r.push(o),a.push(n),h.push(s),d.push(o),d.push(n),d.push(s);for(r.sort(t),a.sort(t),h.sort(t),d.sort(t),e=0;e<7;e++)a[e]=Z(a[e]),h[e]=Z(h[e]),d[e]=Z(d[e]);this._weekdaysRegex=new RegExp("^("+d.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+r.join("|")+")","i")}function Gt(){return this.hours()%12||12}function Vt(){return this.hours()||24}function Ut(t,e){H(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function qt(t,e){return e._meridiemParse}function Xt(t){return"p"===(t+"").toLowerCase().charAt(0)}function Zt(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"}function Kt(t){return t?t.toLowerCase().replace("_","-"):t}function Jt(t){for(var e,i,o,n,s=0;s<t.length;){for(n=Kt(t[s]).split("-"),e=n.length,i=Kt(t[s+1]),i=i?i.split("-"):null;e>0;){if(o=$t(n.slice(0,e).join("-")))return o;if(i&&i.length>=e&&w(n,i,!0)>=e-1)break;e--}s++}return null}function $t(e){var i=null;if(!zn[e]&&void 0!==t&&t&&t.exports)try{i=In._abbr;!function(){var t=new Error('Cannot find module "./locale"');throw t.code="MODULE_NOT_FOUND",t}(),Qt(i)}catch(t){}return zn[e]}function Qt(t,e){var i;return t&&(i=s(e)?ie(t):te(t,e))&&(In=i),In._abbr}function te(t,e){if(null!==e){var i=An;if(e.abbr=t,null!=zn[t])S("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=zn[t]._config;else if(null!=e.parentLocale){if(null==zn[e.parentLocale])return Ln[e.parentLocale]||(Ln[e.parentLocale]=[]),Ln[e.parentLocale].push({name:t,config:e}),null;i=zn[e.parentLocale]._config}return zn[t]=new O(C(i,e)),Ln[t]&&Ln[t].forEach(function(t){te(t.name,t.config)}),Qt(t),zn[t]}return delete zn[t],null}function ee(t,e){if(null!=e){var i,o=An;null!=zn[t]&&(o=zn[t]._config),e=C(o,e),i=new O(e),i.parentLocale=zn[t],zn[t]=i,Qt(t)}else null!=zn[t]&&(null!=zn[t].parentLocale?zn[t]=zn[t].parentLocale:null!=zn[t]&&delete zn[t]);return zn[t]}function ie(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return In;if(!i(t)){if(e=$t(t))return e;t=[t]}return Jt(t)}function oe(){return Io(zn)}function ne(t){var e,i=t._a;return i&&-2===p(t).overflow&&(e=i[ln]<0||i[ln]>11?ln:i[un]<1||i[un]>ht(i[dn],i[ln])?un:i[cn]<0||i[cn]>24||24===i[cn]&&(0!==i[pn]||0!==i[fn]||0!==i[mn])?cn:i[pn]<0||i[pn]>59?pn:i[fn]<0||i[fn]>59?fn:i[mn]<0||i[mn]>999?mn:-1,p(t)._overflowDayOfYear&&(e<dn||e>un)&&(e=un),p(t)._overflowWeeks&&-1===e&&(e=vn),p(t)._overflowWeekday&&-1===e&&(e=gn),p(t).overflow=e),t}function se(t,e,i){return null!=t?t:null!=e?e:i}function re(t){var i=new Date(e.now());return t._useUTC?[i.getUTCFullYear(),i.getUTCMonth(),i.getUTCDate()]:[i.getFullYear(),i.getMonth(),i.getDate()]}function ae(t){var e,i,o,n,s=[];if(!t._d){for(o=re(t),t._w&&null==t._a[un]&&null==t._a[ln]&&he(t),null!=t._dayOfYear&&(n=se(t._a[dn],o[dn]),(t._dayOfYear>Q(n)||0===t._dayOfYear)&&(p(t)._overflowDayOfYear=!0),i=_t(n,0,t._dayOfYear),t._a[ln]=i.getUTCMonth(),t._a[un]=i.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=s[e]=o[e];for(;e<7;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[cn]&&0===t._a[pn]&&0===t._a[fn]&&0===t._a[mn]&&(t._nextDay=!0,t._a[cn]=0),t._d=(t._useUTC?_t:bt).apply(null,s),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[cn]=24),t._w&&void 0!==t._w.d&&t._w.d!==t._d.getDay()&&(p(t).weekdayMismatch=!0)}}function he(t){var e,i,o,n,s,r,a,h;if(e=t._w,null!=e.GG||null!=e.W||null!=e.E)s=1,r=4,i=se(e.GG,t._a[dn],kt(De(),1,4).year),o=se(e.W,1),((n=se(e.E,1))<1||n>7)&&(h=!0);else{s=t._locale._week.dow,r=t._locale._week.doy;var d=kt(De(),s,r);i=se(e.gg,t._a[dn],d.year),o=se(e.w,d.week),null!=e.d?((n=e.d)<0||n>6)&&(h=!0):null!=e.e?(n=e.e+s,(e.e<0||e.e>6)&&(h=!0)):n=s}o<1||o>St(i,s,r)?p(t)._overflowWeeks=!0:null!=h?p(t)._overflowWeekday=!0:(a=xt(i,o,n,s,r),t._a[dn]=a.year,t._dayOfYear=a.dayOfYear)}function de(t){var e,i,o,n,s,r,a=t._i,h=Fn.exec(a)||Bn.exec(a);if(h){for(p(t).iso=!0,e=0,i=Hn.length;e<i;e++)if(Hn[e][1].exec(h[1])){n=Hn[e][0],o=!1!==Hn[e][2];break}if(null==n)return void(t._isValid=!1);if(h[3]){for(e=0,i=Wn.length;e<i;e++)if(Wn[e][1].exec(h[3])){s=(h[2]||" ")+Wn[e][0];break}if(null==s)return void(t._isValid=!1)}if(!o&&null!=s)return void(t._isValid=!1);if(h[4]){if(!jn.exec(h[4]))return void(t._isValid=!1);r="Z"}t._f=n+(s||"")+(r||""),ge(t)}else t._isValid=!1}function le(t,e,i,o,n,s){var r=[ue(t),xn.indexOf(e),parseInt(i,10),parseInt(o,10),parseInt(n,10)];return s&&r.push(parseInt(s,10)),r}function ue(t){var e=parseInt(t,10);return e<=49?2e3+e:e<=999?1900+e:e}function ce(t){return t.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").trim()}function pe(t,e,i){if(t){if(Cn.indexOf(t)!==new Date(e[0],e[1],e[2]).getDay())return p(i).weekdayMismatch=!0,i._isValid=!1,!1}return!0}function fe(t,e,i){if(t)return Vn[t];if(e)return 0;var o=parseInt(i,10),n=o%100;return(o-n)/100*60+n}function me(t){var e=Gn.exec(ce(t._i));if(e){var i=le(e[4],e[3],e[2],e[5],e[6],e[7]);if(!pe(e[1],i,t))return;t._a=i,t._tzm=fe(e[8],e[9],e[10]),t._d=_t.apply(null,t._a),t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),p(t).rfc2822=!0}else t._isValid=!1}function ve(t){var i=Yn.exec(t._i);if(null!==i)return void(t._d=new Date(+i[1]));de(t),!1===t._isValid&&(delete t._isValid,me(t),!1===t._isValid&&(delete t._isValid,e.createFromInputFallback(t)))}function ge(t){if(t._f===e.ISO_8601)return void de(t);if(t._f===e.RFC_2822)return void me(t);t._a=[],p(t).empty=!0;var i,o,n,s,r,a=""+t._i,h=a.length,d=0;for(n=V(t._f,t._locale).match(Bo)||[],i=0;i<n.length;i++)s=n[i],o=(a.match(q(s,t))||[])[0],o&&(r=a.substr(0,a.indexOf(o)),r.length>0&&p(t).unusedInput.push(r),a=a.slice(a.indexOf(o)+o.length),d+=o.length),Wo[s]?(o?p(t).empty=!1:p(t).unusedTokens.push(s),$(s,o,t)):t._strict&&!o&&p(t).unusedTokens.push(s);p(t).charsLeftOver=h-d,a.length>0&&p(t).unusedInput.push(a),t._a[cn]<=12&&!0===p(t).bigHour&&t._a[cn]>0&&(p(t).bigHour=void 0),p(t).parsedDateParts=t._a.slice(0),p(t).meridiem=t._meridiem,t._a[cn]=ye(t._locale,t._a[cn],t._meridiem),ae(t),ne(t)}function ye(t,e,i){var o;return null==i?e:null!=t.meridiemHour?t.meridiemHour(e,i):null!=t.isPM?(o=t.isPM(i),o&&e<12&&(e+=12),o||12!==e||(e=0),e):e}function be(t){var e,i,o,n,s;if(0===t._f.length)return p(t).invalidFormat=!0,void(t._d=new Date(NaN));for(n=0;n<t._f.length;n++)s=0,e=v({},t),null!=t._useUTC&&(e._useUTC=t._useUTC),e._f=t._f[n],ge(e),f(e)&&(s+=p(e).charsLeftOver,s+=10*p(e).unusedTokens.length,p(e).score=s,(null==o||s<o)&&(o=s,i=e));l(t,i||e)}function _e(t){if(!t._d){var e=L(t._i);t._a=h([e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],function(t){return t&&parseInt(t,10)}),ae(t)}}function we(t){var e=new g(ne(xe(t)));return e._nextDay&&(e.add(1,"d"),e._nextDay=void 0),e}function xe(t){var e=t._i,o=t._f;return t._locale=t._locale||ie(t._l),null===e||void 0===o&&""===e?m({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),y(e)?new g(ne(e)):(a(e)?t._d=e:i(o)?be(t):o?ge(t):ke(t),f(t)||(t._d=null),t))}function ke(t){var n=t._i;s(n)?t._d=new Date(e.now()):a(n)?t._d=new Date(n.valueOf()):"string"==typeof n?ve(t):i(n)?(t._a=h(n.slice(0),function(t){return parseInt(t,10)}
vendor: 7,183 bytes, line 19292
19292),ae(t)):o(n)?_e(t):r(n)?t._d=new Date(n):e.createFromInputFallback(t)}function Se(t,e,s,r,a){var h={};return!0!==s&&!1!==s||(r=s,s=void 0),(o(t)&&n(t)||i(t)&&0===t.length)&&(t=void 0),h._isAMomentObject=!0,h._useUTC=h._isUTC=a,h._l=s,h._i=t,h._f=e,h._strict=r,we(h)}function De(t,e,i,o){return Se(t,e,i,o,!1)}function Me(t,e){var o,n;if(1===e.length&&i(e[0])&&(e=e[0]),!e.length)return De();for(o=e[0],n=1;n<e.length;++n)e[n].isValid()&&!e[n][t](o)||(o=e[n]);return o}function Ce(){return Me("isBefore",[].slice.call(arguments,0))}function Oe(){return Me("isAfter",[].slice.call(arguments,0))}function Ee(t){for(var e in t)if(-1===yn.call(Zn,e)||null!=t[e]&&isNaN(t[e]))return!1;for(var i=!1,o=0;o<Zn.length;++o)if(t[Zn[o]]){if(i)return!1;parseFloat(t[Zn[o]])!==_(t[Zn[o]])&&(i=!0)}return!0}function Te(){return this._isValid}function Pe(){return Ke(NaN)}function Ie(t){var e=L(t),i=e.year||0,o=e.quarter||0,n=e.month||0,s=e.week||0,r=e.day||0,a=e.hour||0,h=e.minute||0,d=e.second||0,l=e.millisecond||0;this._isValid=Ee(e),this._milliseconds=+l+1e3*d+6e4*h+1e3*a*60*60,this._days=+r+7*s,this._months=+n+3*o+12*i,this._data={},this._locale=ie(),this._bubble()}function Ne(t){return t instanceof Ie}function Re(t){return t<0?-1*Math.round(-1*t):Math.round(t)}function Ae(t,e){H(t,0,0,function(){var t=this.utcOffset(),i="+";return t<0&&(t=-t,i="-"),i+j(~~(t/60),2)+e+j(~~t%60,2)})}function ze(t,e){var i=(e||"").match(t);if(null===i)return null;var o=i[i.length-1]||[],n=(o+"").match(Kn)||["-",0,0],s=60*n[1]+_(n[2]);return 0===s?0:"+"===n[0]?s:-s}function Le(t,i){var o,n;return i._isUTC?(o=i.clone(),n=(y(t)||a(t)?t.valueOf():De(t).valueOf())-o.valueOf(),o._d.setTime(o._d.valueOf()+n),e.updateOffset(o,!1),o):De(t).local()}function Fe(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function Be(t,i,o){var n,s=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=ze(nn,t)))return this}else Math.abs(t)<16&&!o&&(t*=60);return!this._isUTC&&i&&(n=Fe(this)),this._offset=t,this._isUTC=!0,null!=n&&this.add(n,"m"),s!==t&&(!i||this._changeInProgress?ei(this,Ke(t-s,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,e.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?s:Fe(this)}function je(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}function He(t){return this.utcOffset(0,t)}function We(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Fe(this),"m")),this}function Ye(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var t=ze(on,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this}function Ge(t){return!!this.isValid()&&(t=t?De(t).utcOffset():0,(this.utcOffset()-t)%60==0)}function Ve(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ue(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(v(t,this),t=xe(t),t._a){var e=t._isUTC?u(t._a):De(t._a);this._isDSTShifted=this.isValid()&&w(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function qe(){return!!this.isValid()&&!this._isUTC}function Xe(){return!!this.isValid()&&this._isUTC}function Ze(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Ke(t,e){var i,o,n,s=t,a=null;return Ne(t)?s={ms:t._milliseconds,d:t._days,M:t._months}:r(t)?(s={},e?s[e]=t:s.milliseconds=t):(a=Jn.exec(t))?(i="-"===a[1]?-1:1,s={y:0,d:_(a[un])*i,h:_(a[cn])*i,m:_(a[pn])*i,s:_(a[fn])*i,ms:_(Re(1e3*a[mn]))*i}):(a=$n.exec(t))?(i="-"===a[1]?-1:(a[1],1),s={y:Je(a[2],i),M:Je(a[3],i),w:Je(a[4],i),d:Je(a[5],i),h:Je(a[6],i),m:Je(a[7],i),s:Je(a[8],i)}):null==s?s={}:"object"==typeof s&&("from"in s||"to"in s)&&(n=Qe(De(s.from),De(s.to)),s={},s.ms=n.milliseconds,s.M=n.months),o=new Ie(s),Ne(t)&&d(t,"_locale")&&(o._locale=t._locale),o}function Je(t,e){var i=t&&parseFloat(t.replace(",","."));return(isNaN(i)?0:i)*e}function $e(t,e){var i={milliseconds:0,months:0};return i.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(i.months,"M").isAfter(e)&&--i.months,i.milliseconds=+e-+t.clone().add(i.months,"M"),i}function Qe(t,e){var i;return t.isValid()&&e.isValid()?(e=Le(e,t),t.isBefore(e)?i=$e(t,e):(i=$e(e,t),i.milliseconds=-i.milliseconds,i.months=-i.months),i):{milliseconds:0,months:0}}function ti(t,e){return function(i,o){var n,s;return null===o||isNaN(+o)||(S(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),s=i,i=o,o=s),i="string"==typeof i?+i:i,n=Ke(i,o),ei(this,n,t),this}}function ei(t,i,o,n){var s=i._milliseconds,r=Re(i._days),a=Re(i._months);t.isValid()&&(n=null==n||n,a&&pt(t,ot(t,"Month")+a*o),r&&nt(t,"Date",ot(t,"Date")+r*o),s&&t._d.setTime(t._d.valueOf()+s*o),n&&e.updateOffset(t,r||a))}function ii(t,e){var i=t.diff(e,"days",!0);return i<-6?"sameElse":i<-1?"lastWeek":i<0?"lastDay":i<1?"sameDay":i<2?"nextDay":i<7?"nextWeek":"sameElse"}function oi(t,i){var o=t||De(),n=Le(o,this).startOf("day"),s=e.calendarFormat(this,n)||"sameElse",r=i&&(D(i[s])?i[s].call(this,o):i[s]);return this.format(r||this.localeData().calendar(s,this,De(o)))}function ni(){return new g(this)}function si(t,e){var i=y(t)?t:De(t);return!(!this.isValid()||!i.isValid())&&(e=z(s(e)?"millisecond":e),"millisecond"===e?this.valueOf()>i.valueOf():i.valueOf()<this.clone().startOf(e).valueOf())}function ri(t,e){var i=y(t)?t:De(t);return!(!this.isValid()||!i.isValid())&&(e=z(s(e)?"millisecond":e),"millisecond"===e?this.valueOf()<i.valueOf():this.clone().endOf(e).valueOf()<i.valueOf())}function ai(t,e,i,o){return o=o||"()",("("===o[0]?this.isAfter(t,i):!this.isBefore(t,i))&&(")"===o[1]?this.isBefore(e,i):!this.isAfter(e,i))}function hi(t,e){var i,o=y(t)?t:De(t);return!(!this.isValid()||!o.isValid())&&(e=z(e||"millisecond"),"millisecond"===e?this.valueOf()===o.valueOf():(i=o.valueOf(),this.clone().startOf(e).valueOf()<=i&&i<=this.clone().endOf(e).valueOf()))}function di(t,e){return this.isSame(t,e)||this.isAfter(t,e)}function li(t,e){return this.isSame(t,e)||this.isBefore(t,e)}function ui(t,e,i){var o,n,s;if(!this.isValid())return NaN;if(o=Le(t,this),!o.isValid())return NaN;switch(n=6e4*(o.utcOffset()-this.utcOffset()),e=z(e)){case"year":s=ci(this,o)/12;break;case"month":s=ci(this,o);break;case"quarter":s=ci(this,o)/3;break;case"second":s=(this-o)/1e3;break;case"minute":s=(this-o)/6e4;break;case"hour":s=(this-o)/36e5;break;case"day":s=(this-o-n)/864e5;break;case"week":s=(this-o-n)/6048e5;break;default:s=this-o}return i?s:b(s)}function ci(t,e){var i,o,n=12*(e.year()-t.year())+(e.month()-t.month()),s=t.clone().add(n,"months");return e-s<0?(i=t.clone().add(n-1,"months"),o=(e-s)/(s-i)):(i=t.clone().add(n+1,"months"),o=(e-s)/(i-s)),-(n+o)||0}function pi(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function fi(){if(!this.isValid())return null;var t=this.clone().utc();return t.year()<0||t.year()>9999?G(t,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):D(Date.prototype.toISOString)?this.toDate().toISOString():G(t,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}
vendor: 5,843 bytes, lines 19292-19293
19292function mi(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var i="["+t+'("]',o=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",n=e+'[")]';return this.format(i+o+"-MM-DD[T]HH:mm:ss.SSS"+n)}function vi(t){t||(t=this.isUtc()?e.defaultFormatUtc:e.defaultFormat);var i=G(this,t);return this.localeData().postformat(i)}function gi(t,e){return this.isValid()&&(y(t)&&t.isValid()||De(t).isValid())?Ke({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function yi(t){return this.from(De(),t)}function bi(t,e){return this.isValid()&&(y(t)&&t.isValid()||De(t).isValid())?Ke({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function _i(t){return this.to(De(),t)}function wi(t){var e;return void 0===t?this._locale._abbr:(e=ie(t),null!=e&&(this._locale=e),this)}function xi(){return this._locale}function ki(t){switch(t=z(t)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),"isoWeek"===t&&this.isoWeekday(1),"quarter"===t&&this.month(3*Math.floor(this.month()/3)),this}function Si(t){return void 0===(t=z(t))||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))}function Di(){return this._d.valueOf()-6e4*(this._offset||0)}function Mi(){return Math.floor(this.valueOf()/1e3)}function Ci(){return new Date(this.valueOf())}function Oi(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function Ei(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function Ti(){return this.isValid()?this.toISOString():null}function Pi(){return f(this)}function Ii(){return l({},p(this))}function Ni(){return p(this).overflow}function Ri(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Ai(t,e){H(0,[t,t.length],0,e)}function zi(t){return ji.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Li(t){return ji.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Fi(){return St(this.year(),1,4)}function Bi(){var t=this.localeData()._week;return St(this.year(),t.dow,t.doy)}function ji(t,e,i,o,n){var s;return null==t?kt(this,o,n).year:(s=St(t,o,n),e>s&&(e=s),Hi.call(this,t,e,i,o,n))}function Hi(t,e,i,o,n){var s=xt(t,e,i,o,n),r=_t(s.year,0,s.dayOfYear);return this.year(r.getUTCFullYear()),this.month(r.getUTCMonth()),this.date(r.getUTCDate()),this}function Wi(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function Yi(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function Gi(t,e){e[mn]=_(1e3*("0."+t))}function Vi(){return this._isUTC?"UTC":""}function Ui(){return this._isUTC?"Coordinated Universal Time":""}function qi(t){return De(1e3*t)}function Xi(){return De.apply(null,arguments).parseZone()}function Zi(t){return t}function Ki(t,e,i,o){var n=ie(),s=u().set(o,e);return n[i](s,t)}function Ji(t,e,i){if(r(t)&&(e=t,t=void 0),t=t||"",null!=e)return Ki(t,e,i,"month");var o,n=[];for(o=0;o<12;o++)n[o]=Ki(t,o,i,"month");return n}function $i(t,e,i,o){"boolean"==typeof t?(r(e)&&(i=e,e=void 0),e=e||""):(e=t,i=e,t=!1,r(e)&&(i=e,e=void 0),e=e||"");var n=ie(),s=t?n._week.dow:0;if(null!=i)return Ki(e,(i+s)%7,o,"day");var a,h=[];for(a=0;a<7;a++)h[a]=Ki(e,(a+s)%7,o,"day");return h}function Qi(t,e){return Ji(t,e,"months")}function to(t,e){return Ji(t,e,"monthsShort")}function eo(t,e,i){return $i(t,e,i,"weekdays")}function io(t,e,i){return $i(t,e,i,"weekdaysShort")}function oo(t,e,i){return $i(t,e,i,"weekdaysMin")}function no(){var t=this._data;return this._milliseconds=ds(this._milliseconds),this._days=ds(this._days),this._months=ds(this._months),t.milliseconds=ds(t.milliseconds),t.seconds=ds(t.seconds),t.minutes=ds(t.minutes),t.hours=ds(t.hours),t.months=ds(t.months),t.years=ds(t.years),this}function so(t,e,i,o){var n=Ke(e,i);return t._milliseconds+=o*n._milliseconds,t._days+=o*n._days,t._months+=o*n._months,t._bubble()}function ro(t,e){return so(this,t,e,1)}function ao(t,e){return so(this,t,e,-1)}function ho(t){return t<0?Math.floor(t):Math.ceil(t)}function lo(){var t,e,i,o,n,s=this._milliseconds,r=this._days,a=this._months,h=this._data;return s>=0&&r>=0&&a>=0||s<=0&&r<=0&&a<=0||(s+=864e5*ho(co(a)+r),r=0,a=0),h.milliseconds=s%1e3,t=b(s/1e3),h.seconds=t%60,e=b(t/60),h.minutes=e%60,i=b(e/60),h.hours=i%24,r+=b(i/24),n=b(uo(r)),a+=n,
19293    r-=ho(co(n)),o=b(a/12),a%=12,h.days=r,h.months=a,h.years=o,this}function uo(t){return 4800*t/146097}function co(t){return 146097*t/4800}function po(t){if(!this.isValid())return NaN;var e,i,o=this._milliseconds;if("month"===(t=z(t))||"year"===t)return e=this._days+o/864e5,i=this._months+uo(e),"month"===t?i:i/12;switch(e=this._days+Math.round(co(this._months)),t){case"week":return e/7+o/6048e5;case"day":return e+o/864e5;case"hour":return 24*e+o/36e5;case"minute":return 1440*e+o/6e4;case"second":return 86400*e+o/1e3;case"millisecond":return Math.floor(864e5*e)+o;default:throw new Error("Unknown unit "+t)}}function fo(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*_(this._months/12):NaN}function mo(t){return function(){return this.as(t)}}function vo(){return Ke(this)}function go(t){return t=z(t),this.isValid()?this[t+"s"]():NaN}function yo(t){return function(){return this.isValid()?this._data[t]:NaN}}function bo(){return b(this.days()/7)}
vendor: 4,500 bytes, line 19293
19293function _o(t,e,i,o,n){return n.relativeTime(e||1,!!i,t,o)}function wo(t,e,i){var o=Ke(t).abs(),n=Ds(o.as("s")),s=Ds(o.as("m")),r=Ds(o.as("h")),a=Ds(o.as("d")),h=Ds(o.as("M")),d=Ds(o.as("y")),l=n<=Ms.ss&&["s",n]||n<Ms.s&&["ss",n]||s<=1&&["m"]||s<Ms.m&&["mm",s]||r<=1&&["h"]||r<Ms.h&&["hh",r]||a<=1&&["d"]||a<Ms.d&&["dd",a]||h<=1&&["M"]||h<Ms.M&&["MM",h]||d<=1&&["y"]||["yy",d];return l[2]=e,l[3]=+t>0,l[4]=i,_o.apply(null,l)}function xo(t){return void 0===t?Ds:"function"==typeof t&&(Ds=t,!0)}function ko(t,e){return void 0!==Ms[t]&&(void 0===e?Ms[t]:(Ms[t]=e,"s"===t&&(Ms.ss=e-1),!0))}function So(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),i=wo(this,!t,e);return t&&(i=e.pastFuture(+this,i)),e.postformat(i)}function Do(t){return(t>0)-(t<0)||+t}function Mo(){if(!this.isValid())return this.localeData().invalidDate();var t,e,i,o=Cs(this._milliseconds)/1e3,n=Cs(this._days),s=Cs(this._months);t=b(o/60),e=b(t/60),o%=60,t%=60,i=b(s/12),s%=12;var r=i,a=s,h=n,d=e,l=t,u=o?o.toFixed(3).replace(/\.?0+$/,""):"",c=this.asSeconds();if(!c)return"P0D";var p=c<0?"-":"",f=Do(this._months)!==Do(c)?"-":"",m=Do(this._days)!==Do(c)?"-":"",v=Do(this._milliseconds)!==Do(c)?"-":"";return p+"P"+(r?f+r+"Y":"")+(a?f+a+"M":"")+(h?m+h+"D":"")+(d||l||u?"T":"")+(d?v+d+"H":"")+(l?v+l+"M":"")+(u?v+u+"S":"")}var Co,Oo;Oo=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),i=e.length>>>0,o=0;o<i;o++)if(o in e&&t.call(this,e[o],o,e))return!0;return!1};var Eo=e.momentProperties=[],To=!1,Po={};e.suppressDeprecationWarnings=!1,e.deprecationHandler=null;var Io;Io=Object.keys?Object.keys:function(t){var e,i=[];for(e in t)d(t,e)&&i.push(e);return i};var No={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},Ro={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},Ao=/\d{1,2}/,zo={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Lo={},Fo={},Bo=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,jo=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Ho={},Wo={},Yo=/\d/,Go=/\d\d/,Vo=/\d{3}/,Uo=/\d{4}/,qo=/[+-]?\d{6}/,Xo=/\d\d?/,Zo=/\d\d\d\d?/,Ko=/\d\d\d\d\d\d?/,Jo=/\d{1,3}/,$o=/\d{1,4}/,Qo=/[+-]?\d{1,6}/,tn=/\d+/,en=/[+-]?\d+/,on=/Z|[+-]\d\d:?\d\d/gi,nn=/Z|[+-]\d\d(?::?\d\d)?/gi,sn=/[+-]?\d+(\.\d{1,3})?/,rn=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,an={},hn={},dn=0,ln=1,un=2,cn=3,pn=4,fn=5,mn=6,vn=7,gn=8;H("Y",0,0,function(){var t=this.year();return t<=9999?""+t:"+"+t}),H(0,["YY",2],0,function(){return this.year()%100}),H(0,["YYYY",4],0,"year"),H(0,["YYYYY",5],0,"year"),H(0,["YYYYYY",6,!0],0,"year"),A("year","y"),F("year",1),U("Y",en),U("YY",Xo,Go),U("YYYY",$o,Uo),U("YYYYY",Qo,qo),U("YYYYYY",Qo,qo),K(["YYYYY","YYYYYY"],dn),K("YYYY",function(t,i){i[dn]=2===t.length?e.parseTwoDigitYear(t):_(t)}),K("YY",function(t,i){i[dn]=e.parseTwoDigitYear(t)}),K("Y",function(t,e){e[dn]=parseInt(t,10)}),e.parseTwoDigitYear=function(t){return _(t)+(_(t)>68?1900:2e3)};var yn,bn=it("FullYear",!0);yn=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e<this.length;++e)if(this[e]===t)return e;return-1},H("M",["MM",2],"Mo",function(){return this.month()+1}),H("MMM",0,0,function(t){return this.localeData().monthsShort(this,t)}),H("MMMM",0,0,function(t){return this.localeData().months(this,t)}),A("month","M"),F("month",8),U("M",Xo),U("MM",Xo,Go),U("MMM",function(t,e){return e.monthsShortRegex(t)}),U("MMMM",function(t,e){return e.monthsRegex(t)}),K(["M","MM"],function(t,e){e[ln]=_(t)-1}),K(["MMM","MMMM"],function(t,e,i,o){var n=i._locale.monthsParse(t,o,i._strict);null!=n?e[ln]=n:p(i).invalidMonth=t});var _n=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,wn="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),xn="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),kn=rn,Sn=rn;H("w",["ww",2],"wo","week"),H("W",["WW",2],"Wo","isoWeek"),A("week","w"),A("isoWeek","W"),F("week",5),F("isoWeek",5),U("w",Xo),U("ww",Xo,Go),U("W",Xo),U("WW",Xo,Go),J(["w","ww","W","WW"],function(t,e,
vendor: 4,762 bytes, line 19293
19293i,o){e[o.substr(0,1)]=_(t)});var Dn={dow:0,doy:6};H("d",0,"do","day"),H("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),H("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),H("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),H("e",0,0,"weekday"),H("E",0,0,"isoWeekday"),A("day","d"),A("weekday","e"),A("isoWeekday","E"),F("day",11),F("weekday",11),F("isoWeekday",11),U("d",Xo),U("e",Xo),U("E",Xo),U("dd",function(t,e){return e.weekdaysMinRegex(t)}),U("ddd",function(t,e){return e.weekdaysShortRegex(t)}),U("dddd",function(t,e){return e.weekdaysRegex(t)}),J(["dd","ddd","dddd"],function(t,e,i,o){var n=i._locale.weekdaysParse(t,o,i._strict);null!=n?e.d=n:p(i).invalidWeekday=t}),J(["d","e","E"],function(t,e,i,o){e[o]=_(t)});var Mn="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Cn="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),On="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),En=rn,Tn=rn,Pn=rn;H("H",["HH",2],0,"hour"),H("h",["hh",2],0,Gt),H("k",["kk",2],0,Vt),H("hmm",0,0,function(){return""+Gt.apply(this)+j(this.minutes(),2)}),H("hmmss",0,0,function(){return""+Gt.apply(this)+j(this.minutes(),2)+j(this.seconds(),2)}),H("Hmm",0,0,function(){return""+this.hours()+j(this.minutes(),2)}),H("Hmmss",0,0,function(){return""+this.hours()+j(this.minutes(),2)+j(this.seconds(),2)}),Ut("a",!0),Ut("A",!1),A("hour","h"),F("hour",13),U("a",qt),U("A",qt),U("H",Xo),U("h",Xo),U("k",Xo),U("HH",Xo,Go),U("hh",Xo,Go),U("kk",Xo,Go),U("hmm",Zo),U("hmmss",Ko),U("Hmm",Zo),U("Hmmss",Ko),K(["H","HH"],cn),K(["k","kk"],function(t,e,i){var o=_(t);e[cn]=24===o?0:o}),K(["a","A"],function(t,e,i){i._isPm=i._locale.isPM(t),i._meridiem=t}),K(["h","hh"],function(t,e,i){e[cn]=_(t),p(i).bigHour=!0}),K("hmm",function(t,e,i){var o=t.length-2;e[cn]=_(t.substr(0,o)),e[pn]=_(t.substr(o)),p(i).bigHour=!0}),K("hmmss",function(t,e,i){var o=t.length-4,n=t.length-2;e[cn]=_(t.substr(0,o)),e[pn]=_(t.substr(o,2)),e[fn]=_(t.substr(n)),p(i).bigHour=!0}),K("Hmm",function(t,e,i){var o=t.length-2;e[cn]=_(t.substr(0,o)),e[pn]=_(t.substr(o))}),K("Hmmss",function(t,e,i){var o=t.length-4,n=t.length-2;e[cn]=_(t.substr(0,o)),e[pn]=_(t.substr(o,2)),e[fn]=_(t.substr(n))});var In,Nn=/[ap]\.?m?\.?/i,Rn=it("Hours",!0),An={calendar:No,longDateFormat:Ro,invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:Ao,relativeTime:zo,months:wn,monthsShort:xn,week:Dn,weekdays:Mn,weekdaysMin:On,weekdaysShort:Cn,meridiemParse:Nn},zn={},Ln={},Fn=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Bn=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,jn=/Z|[+-]\d\d(?::?\d\d)?/,Hn=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Wn=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Yn=/^\/?Date\((\-?\d+)/i,Gn=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,Vn={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};e.createFromInputFallback=k("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))}),e.ISO_8601=function(){},e.RFC_2822=function(){};var Un=k("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var t=De.apply(null,arguments);return this.isValid()&&t.isValid()?t<this?this:t:m()}),qn=k("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var t=De.apply(null,arguments);return this.isValid()&&t.isValid()?t>this?this:t:m()}),Xn=function(){return Date.now?Date.now():+new Date},Zn=["year","quarter","month","week","day","hour","minute","second","millisecond"];Ae("Z",":"),Ae("ZZ",""),U("Z",nn),U("ZZ",nn),K(["Z","ZZ"],function(t,e,
vendor: 6,040 bytes, line 19293
19293i){i._useUTC=!0,i._tzm=ze(nn,t)});var Kn=/([\+\-]|\d\d)/gi;e.updateOffset=function(){};var Jn=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,$n=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;Ke.fn=Ie.prototype,Ke.invalid=Pe;var Qn=ti(1,"add"),ts=ti(-1,"subtract");e.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",e.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var es=k("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});H(0,["gg",2],0,function(){return this.weekYear()%100}),H(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Ai("gggg","weekYear"),Ai("ggggg","weekYear"),Ai("GGGG","isoWeekYear"),Ai("GGGGG","isoWeekYear"),A("weekYear","gg"),A("isoWeekYear","GG"),F("weekYear",1),F("isoWeekYear",1),U("G",en),U("g",en),U("GG",Xo,Go),U("gg",Xo,Go),U("GGGG",$o,Uo),U("gggg",$o,Uo),U("GGGGG",Qo,qo),U("ggggg",Qo,qo),J(["gggg","ggggg","GGGG","GGGGG"],function(t,e,i,o){e[o.substr(0,2)]=_(t)}),J(["gg","GG"],function(t,i,o,n){i[n]=e.parseTwoDigitYear(t)}),H("Q",0,"Qo","quarter"),A("quarter","Q"),F("quarter",7),U("Q",Yo),K("Q",function(t,e){e[ln]=3*(_(t)-1)}),H("D",["DD",2],"Do","date"),A("date","D"),F("date",9),U("D",Xo),U("DD",Xo,Go),U("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),K(["D","DD"],un),K("Do",function(t,e){e[un]=_(t.match(Xo)[0],10)});var is=it("Date",!0);H("DDD",["DDDD",3],"DDDo","dayOfYear"),A("dayOfYear","DDD"),F("dayOfYear",4),U("DDD",Jo),U("DDDD",Vo),K(["DDD","DDDD"],function(t,e,i){i._dayOfYear=_(t)}),H("m",["mm",2],0,"minute"),A("minute","m"),F("minute",14),U("m",Xo),U("mm",Xo,Go),K(["m","mm"],pn);var os=it("Minutes",!1);H("s",["ss",2],0,"second"),A("second","s"),F("second",15),U("s",Xo),U("ss",Xo,Go),K(["s","ss"],fn);var ns=it("Seconds",!1);H("S",0,0,function(){return~~(this.millisecond()/100)}),H(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),H(0,["SSS",3],0,"millisecond"),H(0,["SSSS",4],0,function(){return 10*this.millisecond()}),H(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),H(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),H(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),H(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),H(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),A("millisecond","ms"),F("millisecond",16),U("S",Jo,Yo),U("SS",Jo,Go),U("SSS",Jo,Vo);var ss;for(ss="SSSS";ss.length<=9;ss+="S")U(ss,tn);for(ss="S";ss.length<=9;ss+="S")K(ss,Gi);var rs=it("Milliseconds",!1);H("z",0,0,"zoneAbbr"),H("zz",0,0,"zoneName");var as=g.prototype;as.add=Qn,as.calendar=oi,as.clone=ni,as.diff=ui,as.endOf=Si,as.format=vi,as.from=gi,as.fromNow=yi,as.to=bi,as.toNow=_i,as.get=st,as.invalidAt=Ni,as.isAfter=si,as.isBefore=ri,as.isBetween=ai,as.isSame=hi,as.isSameOrAfter=di,as.isSameOrBefore=li,as.isValid=Pi,as.lang=es,as.locale=wi,as.localeData=xi,as.max=qn,as.min=Un,as.parsingFlags=Ii,as.set=rt,as.startOf=ki,as.subtract=ts,as.toArray=Oi,as.toObject=Ei,as.toDate=Ci,as.toISOString=fi,as.inspect=mi,as.toJSON=Ti,as.toString=pi,as.unix=Mi,as.valueOf=Di,as.creationData=Ri,as.year=bn,as.isLeapYear=et,as.weekYear=zi,as.isoWeekYear=Li,as.quarter=as.quarters=Wi,as.month=ft,as.daysInMonth=mt,as.week=as.weeks=Ot,as.isoWeek=as.isoWeeks=Et,as.weeksInYear=Bi,as.isoWeeksInYear=Fi,as.date=is,as.day=as.days=Lt,as.weekday=Ft,as.isoWeekday=Bt,as.dayOfYear=Yi,as.hour=as.hours=Rn,as.minute=as.minutes=os,as.second=as.seconds=ns,as.millisecond=as.milliseconds=rs,as.utcOffset=Be,as.utc=He,as.local=We,as.parseZone=Ye,as.hasAlignedHourOffset=Ge,as.isDST=Ve,as.isLocal=qe,as.isUtcOffset=Xe,as.isUtc=Ze,as.isUTC=Ze,as.zoneAbbr=Vi,as.zoneName=Ui,as.dates=k("dates accessor is deprecated. Use date instead.",is),as.months=k("months accessor is deprecated. Use month instead",ft),as.years=k("years accessor is deprecated. Use year instead",bn),as.zone=k("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",je),as.isDSTShifted=k("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ue);var hs=O.prototype;hs.calendar=E,hs.longDateFormat=T,hs.invalidDate=P,hs.ordinal=I,hs.preparse=Zi,hs.postformat=Zi,hs.relativeTime=N,hs.pastFuture=R,hs.set=M,hs.months=dt,hs.monthsShort=lt,hs.monthsParse=ct,hs.monthsRegex=gt,hs.monthsShortRegex=vt,hs.week=Dt,hs.firstDayOfYear=Ct,hs.firstDayOfWeek=Mt,hs.weekdays=It,hs.weekdaysMin=Rt,hs.weekdaysShort=Nt,hs.weekdaysParse=zt,hs.weekdaysRegex=jt,hs.weekdaysShortRegex=Ht,hs.weekdaysMinRegex=Wt,hs.isPM=Xt,hs.meridiem=Zt,Qt("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===_(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),e.lang=k("moment.lang is deprecated. Use moment.locale instead.",Qt),e.langData=k("moment.langData is deprecated. Use moment.localeData instead.",ie);var ds=Math.abs,ls=mo("ms"),us=mo("s"),cs=mo("m"),ps=mo("h"),fs=mo("d"),ms=mo("w"),vs=mo("M"),gs=mo("y"),ys=yo("milliseconds"),bs=yo("seconds"),_s=yo("minutes"),ws=yo("hours"),xs=yo("days"),ks=yo("months"),Ss=yo("years"),Ds=Math.round,Ms={ss:44,s:45,m:45,h:22,d:26,M:11},Cs=Math.abs,Os=Ie.prototype;return Os.isValid=Te,Os.abs=no,Os.add=ro,Os.subtract=ao,Os.as=po,Os.asMilliseconds=ls,Os.asSeconds=us,Os.asMinutes=cs,Os.asHours=ps,Os.asDays=fs,Os.asWeeks=ms,Os.asMonths=vs,Os.asYears=gs,Os.valueOf=fo,Os._bubble=lo,Os.clone=vo,Os.get=go,Os.milliseconds=ys,Os.seconds=bs,Os.minutes=_s,Os.hours=ws,Os.days=xs,Os.weeks=bo,Os.months=ks,Os.years=Ss,Os.humanize=So,Os.toISOString=Mo,Os.toString=Mo,Os.toJSON=Mo,Os.locale=wi,Os.localeData=xi,Os.toIsoString=k("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Mo),Os.lang=es,H("X",0,0,"unix"),H("x",0,0,"valueOf"),U("x",en),U("X",sn),K("X",function(t,e,
19293i){i._d=new Date(1e3*parseFloat(t,10))}),K("x",function(t,e,i){i._d=new Date(_(t))}),e.version="2.19.1",function(t){Co=t}(De),e.fn=as,e.min=Ce,e.max=Oe,e.now=Xn,e.utc=u,e.unix=qi,e.months=Qi,e.isDate=a,e.locale=Qt,e.invalid=m,e.duration=Ke,e.isMoment=y,e.weekdays=eo,e.parseZone=Xi,e.localeData=ie,e.isDuration=Ne,e.monthsShort=to,e.weekdaysMin=oo,e.defineLocale=te,e.updateLocale=ee,e.locales=oe,e.weekdaysShort=io,e.normalizeUnits=z,e.relativeTimeRounding=xo,e.relativeTimeThreshold=ko,e.calendarFormat=ii,e.prototype=as,e})}).call(e,i(155)(t))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e){function i(t){throw new Error("Cannot find module '"+t+"'.")}i.keys=function(){return[]},i.resolve=i,t.exports=i,i.id=156},function(t,e,i){(function(e){function i(t,e,i){var o=e&&i||0,n=0;for(e=e||[],t.toLowerCase().replace(/[0-9a-f]{2}/g,function(t){n<16&&(e[o+n++]=u[t])});n<16;)e[o+n++]=0;return e}function o(t,e){var i=e||0,o=l;return o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]}function n(t,e,i){var n=e&&i||0,s=e||[];t=t||{};var r=void 0!==t.clockseq?t.clockseq:m,a=void 0!==t.msecs?t.msecs:(new Date).getTime(),h=void 0!==t.nsecs?t.nsecs:g+1,d=a-v+(h-g)/1e4;if(d<0&&void 0===t.clockseq&&(r=r+1&16383),(d<0||a>v)&&void 0===t.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");v=a,g=h,m=r,a+=122192928e5;var l=(1e4*(268435455&a)+h)%4294967296;s[n++]=l>>>24&255,s[n++]=l>>>16&255,s[n++]=l>>>8&255,s[n++]=255&l;var u=a/4294967296*1e4&268435455;s[n++]=u>>>8&255,s[n++]=255&u,s[n++]=u>>>24&15|16,s[n++]=u>>>16&255,s[n++]=r>>>8|128,s[n++]=255&r;for(var c=t.node||f,p=0;p<6;p++)s[n+p]=c[p];return e||o(s)}function s(t,e,i){var n=e&&i||0;"string"==typeof t&&(e="binary"==t?new Array(16):null,t=null),t=t||{};var s=t.random||(t.rng||r)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,e)for(var a=0;a<16;a++)e[n+a]=s[a];return e||o(s)}var r,a="undefined"!=typeof window?window:void 0!==e?e:null;if(a&&a.crypto&&crypto.getRandomValues){var h=new Uint8Array(16);r=function(){return crypto.getRandomValues(h),h}}if(!r){var d=new Array(16);r=function(){for(var t,e=0;e<16;e++)0==(3&e)&&(t=4294967296*Math.random()),d[e]=t>>>((3&e)<<3)&255;return d}}for(var l=[],u={},c=0;c<256;c++)l[c]=(c+256).toString(16).substr(1),u[l[c]]=c;var p=r(),f=[1|p[0],p[1],p[2],p[3],p[4],p[5]],m=16383&(p[6]<<8|p[7]),v=0,g=0,y=s;y.v1=n,y.v4=s,y.parse=i,y.unparse=o,t.exports=y}).call(e,i(158))},function(t,e){var i;i=function(){return this}();try{i=i||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(i=window)}t.exports=i},function(t,e,i){e.util=i(2),e.DOMutil=i(14),e.DataSet=i(11),e.DataView=i(12),e.Queue=i(43),e.Graph3d=i(161),e.graph3d={Camera:i(95),Filter:i(96),Point2d:i(91),Point3d:i(34),Slider:i(92),StepNumber:i(93)},e.moment=i(9),e.Hammer=i(10),e.keycharm=i(35)},function(t,e,i){var o=i(7),n=o.JSON||(o.JSON={stringify:JSON.stringify});t.exports=function(t){return n.stringify.apply(n,arguments)}},function(t,e,i){function o(t,e,i){if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");this.containerElement=t,this.dataGroup=new _,this.dataPoints=null,this.create(),f.setDefaults(o.DEFAULTS,this),this.colX=void 0,this.colY=void 0,this.colZ=void 0,this.colValue=void 0,this.setOptions(i),this.setData(e)}function n(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0}function s(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0}var r=i(90),a=function(t){return t&&t.__esModule?t:{default:t}}(r),h=i(44),d=i(2),l=i(34),u=i(91),c=i(92),p=i(93),f=i(94),m=i(15).default,v=i(15),g=v.printStyle,y=i(172),b=y.allOptions,_=i(173);o.STYLE=f.STYLE;o.DEFAULTS={width:"400px",height:"400px",filterLabel:"time",legendLabel:"value",xLabel:"x",yLabel:"y",zLabel:"z",xValueLabel:function(t){return t},yValueLabel:function(t){return t},zValueLabel:function(t){return t},showXAxis:!0,showYAxis:!0,showZAxis:!0,showGrid:!0,showPerspective:!0,showShadow:!1,keepAspectRatio:!0,verticalRatio:.5,dotSizeRatio:.02,dotSizeMinFraction:.5,dotSizeMaxFraction:2.5,showAnimationControls:void 0,animationInterval:1e3,animationPreload:!1,animationAutoStart:void 0,axisColor:"#4D4D4D",gridColor:"#D3D3D3",xCenter:"55%",yCenter:"50%",style:o.STYLE.DOT,tooltip:!1,tooltipStyle:{content:{padding:"10px",border:"1px solid #4d4d4d",color:"#1a1a1a",background:"rgba(255,255,255,0.7)",borderRadius:"2px",boxShadow:"5px 5px 10px rgba(128,128,128,0.5)"},line:{height:"40px",width:"0",borderLeft:"1px solid #4d4d4d"},dot:{height:"0",width:"0",border:"5px solid #4d4d4d",borderRadius:"5px"}},dataColor:{fill:"#7DC1FF",stroke:"#3267D2",strokeWidth:1},cameraPosition:{horizontal:1,vertical:.5,distance:1.7},showLegend:void 0,backgroundColor:void 0,xBarWidth:void 0,yBarWidth:void 0,valueMin:void 0,valueMax:void 0,xMin:void 0,xMax:void 0,xStep:void 0,yMin:void 0,yMax:void 0,yStep:void 0,zMin:void 0,zMax:void 0,z
19293Step:void 0},h(o.prototype),o.prototype._setScale=function(){this.scale=new l(1/this.xRange.range(),1/this.yRange.range(),1/this.zRange.range()),this.keepAspectRatio&&(this.scale.x<this.scale.y?this.scale.y=this.scale.x:this.scale.x=this.scale.y),this.scale.z*=this.verticalRatio,void 0!==this.valueRange&&(this.scale.value=1/this.valueRange.range());var t=this.xRange.center()*this.scale.x,e=this.yRange.center()*this.scale.y,i=this.zRange.center()*this.scale.z;this.camera.setArmLocation(t,e,i)},o.prototype._convert3Dto2D=function(t){var e=this._convertPointToTranslation(t);return this._convertTranslationToScreen(e)},o.prototype._convertPointToTranslation=function(t){var e=this.camera.getCameraLocation(),i=this.camera.getCameraRotation(),o=t.x*this.scale.x,n=t.y*this.scale.y,s=t.z*this.scale.z,r=e.x,a=e.y,h=e.z,d=Math.sin(i.x),u=Math.cos(i.x),c=Math.sin(i.y),p=Math.cos(i.y),f=Math.sin(i.z),m=Math.cos(i.z);return new l(p*(f*(n-a)+m*(o-r))-c*(s-h),d*(p*(s-h)+c*(f*(n-a)+m*(o-r)))+u*(m*(n-a)-f*(o-r)),u*(p*(s-h)+c*(f*(n-a)+m*(o-r)))-d*(m*(n-a)-f*(o-r)))},o.prototype._convertTranslationToScreen=function(t){var e,i,o=this.eye.x,n=this.eye.y,s=this.eye.z,r=t.x,a=t.y,h=t.z;return this.showPerspective?(e=s/h*(r-o),i=s/h*(a-n)):(e=r*(-s/this.camera.getArmLength()),i=a*(-s/this.camera.getArmLength())),new u(this.currentXCenter+e*this.frame.canvas.clientWidth,this.currentYCenter-i*this.frame.canvas.clientWidth)},o.prototype._calcTranslations=function(t){for(var e=0;e<t.length;e++){var i=t[e];i.trans=this._convertPointToTranslation(i.point),i.screen=this._convertTranslationToScreen(i.trans);var o=this._convertPointToTranslation(i.bottom);i.dist=this.showPerspective?o.length():-o.z}var n=function(t,e){return e.dist-t.dist};t.sort(n)},o.prototype._initializeRanges=function(){var t=this.dataGroup;this.xRange=t.xRange,this.yRange=t.yRange,this.zRange=t.zRange,this.valueRange=t.valueRange,this.xStep=t.xStep,this.yStep=t.yStep,this.zStep=t.zStep,this.xBarWidth=t.xBarWidth,this.yBarWidth=t.yBarWidth,this.colX=t.colX,this.colY=t.colY,this.colZ=t.colZ,this.colValue=t.colValue,this._setScale()},o.prototype.getDataPoints=function(t){for(var e=[],i=0;i<t.length;i++){var o=new l;o.x=t[i][this.colX]||0,o.y=t[i][this.colY]||0,o.z=t[i][this.colZ]||0,o.data=t[i],void 0!==this.colValue&&(o.value=t[i][this.colValue]||0);var n={};n.point=o,n.bottom=new l(o.x,o.y,this.zRange.min),n.trans=void 0,n.screen=void 0,e.push(n)}return e},o.prototype._getDataPoints=function(t){var e,i,n,s,r=[];if(this.style===o.STYLE.GRID||this.style===o.STYLE.SURFACE){var a=this.dataGroup.getDistinctValues(this.colX,t),h=this.dataGroup.getDistinctValues(this.colY,t);r=this.getDataPoints(t);var d=[];for(n=0;n<r.length;n++){s=r[n];var l=a.indexOf(s.point.x),u=h.indexOf(s.point.y);void 0===d[l]&&(d[l]=[]),d[l][u]=s}for(e=0;e<d.length;e++)for(i=0;i<d[e].length;i++)d[e][i]&&(d[e][i].pointRight=e<d.length-1?d[e+1][i]:void 0,d[e][i].pointTop=i<d[e].length-1?d[e][i+1]:void 0,d[e][i].pointCross=e<d.length-1&&i<d[e].length-1?d[e+1][i+1]:void 0)}else if(this._checkValueField(t),r=this.getDataPoints(t),this.style===o.STYLE.LINE)for(n=0;n<r.length;n++)n>0&&(r[n-1].pointNext=r[n]);return r},o.prototype.create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);this.frame=document.createElement("div"),this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas);var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t),this.frame.filter=document.createElement("div"),this.frame.filter.style.position="absolute",this.frame.filter.style.bottom="0px",this.frame.filter.style.left="0px",this.frame.filter.style.width="100%",this.frame.appendChild(this.frame.filter);var e=this,i=function(t){e._onMouseDown(t)},o=function(t){e._onTouchStart(t)},n=function(t){e._onWheel(t)},s=function(t){e._onTooltip(t)},r=function(t){e._onClick(t)};d.addEventListener(this.frame.canvas,"mousedown",i),d.addEventListener(this.frame.canvas,"touchstart",o),d.addEventListener(this.frame.canvas,"mousewheel",n),d.addEventListener(this.frame.canvas,"mousemove",s),d.addEventListener(this.frame.canvas,"click",r),this.containerElement.appendChild(this.frame)},o.prototype._setSize=function(t,e){this.frame.style.width=t,this.frame.style.height=e,this._resizeCanvas()},o.prototype._resizeCanvas=function(){this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth,this.frame.canvas.height=this.frame.canvas.clientHeight,this.frame.filter.style.width=this.frame.canvas.clientWidth-20+"px"},o.prototype.animationStart=function(){if(this.animationAutoStart&&this.dataGroup.dataFilter){if(!this.frame.filter||!this.frame.filter.slider)throw new Error("No animation available");this.frame.filter.slider.play()}},o.prototype.animationStop=function(){this.frame.filter&&this.frame.filter.slider&&this.frame.filter.slider.stop()},o.prototype._resizeCenter=function(){"%"===this.xCenter.charAt(this.xCenter.length-1)?this.currentXCenter=parseFloat(this.xCenter)/100*this.frame.canvas.clientWidth:this.currentXCenter=parseFloat(this.xCenter),"%"===this.yCenter.charAt(this.yCenter.length-1)?this.currentYCenter=parseFloat(this.yCenter)/100*(this.frame.canvas.clientHeight-this.frame.filter.clientHeight):this.currentYCenter=parseFloat(this.yCenter)},o.prototype.getCameraPosition=function(){var t=this.camera.getArmRotation();return t.distance=this.camera.getArmLength(),t},o.prototype._readData=function(t){this.dataPoints=this.dataGroup.initializeData(this,t,this.style),this._initializeRanges(),this._redrawFilter()},o.prototype.setData=function(t){void 0!==t&&null!==t&&(this._readData(t),this.redraw(),this.animationStart())},o.prototype.setOptions=function(t){if(void 0!==t){!0===m.validate(t,b)&&console.log("%cErrors have been found in the supplied options object.",g),this.animationStop(),f.setOptions(t,this),this.setPointDrawingMethod(),this._setSize(this.width,this.height),this.setData(this.dataGroup.getDataTable()),this.animationStart()}},o.prototype.setPointDrawingMethod=function(){var t=void 0;switch(this.style){case o.STYLE.BAR:t=o.prototype._redrawBarGraphPoint;break;case o.STYLE.BARCOLOR:t=o.prototype._redrawBarColorGraphPoint;break;case o.STYLE.BARSIZE:t=o.prototype._redrawBarSizeGraphPoint;break;case o.STYLE.DOT:t=o.prototype._redrawDotGraphPoint;break;case o.STYLE.DOTLINE:t=o.prototype._redrawDotLineGraphPoint;break;case o.STYLE.DOTCOLOR:t=o.prototype._redrawDotColorGraphPoint;break;case o.STYLE.DOTSIZE:t=o.prototype._redrawDotSizeGraphPoint;break;case o.STYLE.SURFACE:t=o.prototype._redrawSurfaceGraphPoint;break;
19293case o.STYLE.GRID:t=o.prototype._redrawGridGraphPoint;break;case o.STYLE.LINE:t=o.prototype._redrawLineGraphPoint;break;default:throw new Error("Can not determine point drawing method for graph style '"+this.style+"'")}this._pointDrawingMethod=t},o.prototype.redraw=function(){if(void 0===this.dataPoints)throw new Error("Graph data not initialized");this._resizeCanvas(),this._resizeCenter(),this._redrawSlider(),this._redrawClear(),this._redrawAxis(),this._redrawDataGraph(),this._redrawInfo(),this._redrawLegend()},o.prototype._getContext=function(){var t=this.frame.canvas,e=t.getContext("2d");return e.lineJoin="round",e.lineCap="round",e},o.prototype._redrawClear=function(){var t=this.frame.canvas;t.getContext("2d").clearRect(0,0,t.width,t.height)},o.prototype._dotSize=function(){return this.frame.clientWidth*this.dotSizeRatio},o.prototype._getLegendWidth=function(){var t;if(this.style===o.STYLE.DOTSIZE){t=this._dotSize()*this.dotSizeMaxFraction}else t=this.style===o.STYLE.BARSIZE?this.xBarWidth:20;return t},o.prototype._redrawLegend=function(){if(!0===this.showLegend&&this.style!==o.STYLE.LINE&&this.style!==o.STYLE.BARSIZE){var t=this.style===o.STYLE.BARSIZE||this.style===o.STYLE.DOTSIZE,e=this.style===o.STYLE.DOTSIZE||this.style===o.STYLE.DOTCOLOR||this.style===o.STYLE.BARCOLOR,i=Math.max(.25*this.frame.clientHeight,100),n=this.margin,s=this._getLegendWidth(),r=this.frame.clientWidth-this.margin,a=r-s,h=n+i,d=this._getContext();if(d.lineWidth=1,d.font="14px arial",!1===t){var l,c=i;for(l=0;l<c;l++){var f=(l-0)/(c-0),m=240*f,v=this._hsv2rgb(m,1,1);d.strokeStyle=v,d.beginPath(),d.moveTo(a,n+l),d.lineTo(r,n+l),d.stroke()}d.strokeStyle=this.axisColor,d.strokeRect(a,n,s,i)}else{var g;this.style===o.STYLE.DOTSIZE?g=s*(this.dotSizeMinFraction/this.dotSizeMaxFraction):(this.style,o.STYLE.BARSIZE),d.strokeStyle=this.axisColor,d.fillStyle=this.dataColor.fill,d.beginPath(),d.moveTo(a,n),d.lineTo(r,n),d.lineTo(a+g,h),d.lineTo(a,h),d.closePath(),d.fill(),d.stroke()}var y=e?this.valueRange.min:this.zRange.min,b=e?this.valueRange.max:this.zRange.max,_=new p(y,b,(b-y)/5,!0);_.start(!0);for(var w,x;!_.end();)l=h-(_.getCurrent()-y)/(b-y)*i,w=new u(a-5,l),x=new u(a,l),this._line(d,w,x),d.textAlign="right",d.textBaseline="middle",d.fillStyle=this.axisColor,d.fillText(_.getCurrent(),a-10,l),_.next();d.textAlign="right",d.textBaseline="top";var k=this.legendLabel;d.fillText(k,r,h+this.margin)}},o.prototype._redrawFilter=function(){var t=this.dataGroup.dataFilter,e=this.frame.filter;if(e.innerHTML="",!t)return void(e.slider=void 0);var i={visible:this.showAnimationControls},o=new c(e,i);e.slider=o,e.style.padding="10px",o.setValues(t.values),o.setPlayInterval(this.animationInterval);var n=this,s=function(){var t=n.dataGroup.dataFilter,e=o.getIndex();t.selectValue(e),n.dataPoints=t._getDataPoints(),n.redraw()};o.setOnChangeCallback(s)},o.prototype._redrawSlider=function(){void 0!==this.frame.filter.slider&&this.frame.filter.slider.redraw()},o.prototype._redrawInfo=function(){var t=this.dataGroup.getInfo();if(void 0!==t){var e=this._getContext();e.font="14px arial",e.lineStyle="gray",e.fillStyle="gray",e.textAlign="left",e.textBaseline="top";var i=this.margin,o=this.margin;e.fillText(t,i,o)}},o.prototype._line=function(t,e,i,o){void 0!==o&&(t.strokeStyle=o),t.beginPath(),t.moveTo(e.x,e.y),t.lineTo(i.x,i.y),t.stroke()},o.prototype.drawAxisLabelX=function(t,e,i,o,n){void 0===n&&(n=0);var s=this._convert3Dto2D(e)
19294;Math.cos(2*o)>0?(t.textAlign="center",t.textBaseline="top",s.y+=n):Math.sin(2*o)<0?(t.textAlign="right",t.textBaseline="middle"):(t.textAlign="left",t.textBaseline="middle"),t.fillStyle=this.axisColor,t.fillText(i,s.x,s.y)},o.prototype.drawAxisLabelY=function(t,e,i,o,n){void 0===n&&(n=0);var s=this._convert3Dto2D(e);Math.cos(2*o)<0?(t.textAlign="center",t.textBaseline="top",s.y+=n):Math.sin(2*o)>0?(t.textAlign="right",t.textBaseline="middle"):(t.textAlign="left",t.textBaseline="middle"),t.fillStyle=this.axisColor,t.fillText(i,s.x,s.y)},o.prototype.drawAxisLabelZ=function(t,e,i,o){void 0===o&&(o=0);var n=this._convert3Dto2D(e);t.textAlign="right",t.textBaseline="middle",t.fillStyle=this.axisColor,t.fillText(i,n.x-o,n.y)}
19294,o.prototype._line3d=function(t,e,i,o){var n=this._convert3Dto2D(e),s=this._convert3Dto2D(i);this._line(t,n,s,o)},o.prototype._redrawAxis=function(){var t,e,i,o,n,s,r,a,h,d,c,f=this._getContext();f.font=24/this.camera.getArmLength()+"px arial";var m,v=.025/this.scale.x,g=.025/this.scale.y,y=5/this.camera.getArmLength(),b=this.camera.getArmRotation().horizontal,_=new u(Math.cos(b),Math.sin(b)),w=this.xRange,x=this.yRange,k=this.zRange;for(f.lineWidth=1,o=void 0===this.defaultXStep,i=new p(w.min,w.max,this.xStep,o),i.start(!0);!i.end();){var S=i.getCurrent();if(this.showGrid?(t=new l(S,x.min,k.min),e=new l(S,x.max,k.min),this._line3d(f,t,e,this.gridColor)):this.showXAxis&&(t=new l(S,x.min,k.min),e=new l(S,x.min+v,k.min),this._line3d(f,t,e,this.axisColor),t=new l(S,x.max,k.min),e=new l(S,x.max-v,k.min),this._line3d(f,t,e,this.axisColor)),this.showXAxis){r=_.x>0?x.min:x.max,m=new l(S,r,k.min);var D="  "+this.xValueLabel(S)+"  ";this.drawAxisLabelX(f,m,D,b,y)}i.next()}for(f.lineWidth=1,o=void 0===this.defaultYStep,i=new p(x.min,x.max,this.yStep,o),i.start(!0);!i.end();){var M=i.getCurrent();if(this.showGrid?(t=new l(w.min,M,k.min),e=new l(w.max,M,k.min),this._line3d(f,t,e,this.gridColor)):this.showYAxis&&(t=new l(w.min,M,k.min),e=new l(w.min+g,M,k.min),this._line3d(f,t,e,this.axisColor),t=new l(w.max,M,k.min),e=new l(w.max-g,M,k.min),this._line3d(f,t,e,this.axisColor)),this.showYAxis){s=_.y>0?w.min:w.max,m=new l(s,M,k.min);var C="  "+this.yValueLabel(M)+"  ";this.drawAxisLabelY(f,m,C,b,y)}i.next()}if(this.showZAxis){for(f.lineWidth=1,o=void 0===this.defaultZStep,i=new p(k.min,k.max,this.zStep,o),i.start(!0),s=_.x>0?w.min:w.max,r=_.y<0?x.min:x.max;!i.end();){var O=i.getCurrent(),E=new l(s,r,O),T=this._convert3Dto2D(E);e=new u(T.x-y,T.y),this._line(f,T,e,this.axisColor);var P=this.zValueLabel(O)+" ";this.drawAxisLabelZ(f,E,P,5),i.next()}f.lineWidth=1,t=new l(s,r,k.min),e=new l(s,r,k.max),this._line3d(f,t,e,this.axisColor)}if(this.showXAxis){var I,N;f.lineWidth=1,I=new l(w.min,x.min,k.min),N=new l(w.max,x.min,k.min),this._line3d(f,I,N,this.axisColor),I=new l(w.min,x.max,k.min),N=new l(w.max,x.max,k.min),this._line3d(f,I,N,this.axisColor)}this.showYAxis&&(f.lineWidth=1,t=new l(w.min,x.min,k.min),e=new l(w.min,x.max,k.min),this._line3d(f,t,e,this.axisColor),t=new l(w.max,x.min,k.min),e=new l(w.max,x.max,k.min),this._line3d(f,t,e,this.axisColor));var R=this.xLabel;R.length>0&&this.showXAxis&&(c=.1/this.scale.y,s=(w.max+3*w.min)/4,r=_.x>0?x.min-c:x.max+c,n=new l(s,r,k.min),this.drawAxisLabelX(f,n,R,b));var A=this.yLabel;A.length>0&&this.showYAxis&&(d=.1/this.scale.x,s=_.y>0?w.min-d:w.max+d,r=(x.max+3*x.min)/4,n=new l(s,r,k.min),this.drawAxisLabelY(f,n,A,b));var z=this.zLabel;z.length>0&&this.showZAxis&&(h=30,s=_.x>0?w.min:w.max,r=_.y<0?x.min:x.max,a=(k.max+3*k.min)/4,n=new l(s,r,a),this.drawAxisLabelZ(f,n,z,h))},o.prototype._hsv2rgb=function(t,e,i){var o,n,s,r,a,h;switch(r=i*e,a=Math.floor(t/60),h=r*(1-Math.abs(t/60%2-1)),a){case 0:o=r,n=h,s=0;break;case 1:o=h,n=r,s=0;break;case 2:o=0,n=r,s=h;break;case 3:o=0,n=h,s=r;break;case 4:o=h,n=0,s=r;break;case 5:o=r,n=0,s=h;break;default:o=0,n=0,s=0}return"RGB("+parseInt(255*o)+","+parseInt(255*n)+","+parseInt(255*s)+")"},o.prototype._getStrokeWidth=function(t){return void 0!==t?this.showPerspective?1/-t.trans.z*this.dataColor.strokeWidth:-this.eye.z/this.camera.getArmLength()*this.dataColor.strokeWidth:this.dataColor.strokeWidth},o.prototype._redrawBar=function(t,e,i,o,n,s){var r,a=this,h=e.point,d=this.zRange.min,u=[{point:new l(h.x-i,h.y-o,h.z)},{point:new l(h.x+i,h.y-o,h.z)},{point:new l(h.x+i,h.y+o,h.z)},{point:new l(h.x-i,h.y+o,h.z)}],c=[{point:new l(h.x-i,h.y-o,d)},{point:new l(h.x+i,h.y-o,d)},{point:new l(h.x+i,h.y+o,d)},{point:new l(h.x-i,h.y+o,d)}];u.forEach(function(t){t.screen=a._convert3Dto2D(t.point)}),c.forEach(function(t){t.screen=a._convert3Dto2D(t.point)});var p=[{corners:u,center:l.avg(c[0].point,c[2].point)},{corners:[u[0],u[1],c[1],c[0]],center:l.avg(c[1].point,c[0].point)},{corners:[u[1],u[2],c[2],c[1]],center:l.avg(c[2].point,c[1].point)},{corners:[u[2],u[3],c[3],c[2]],center:l.avg(c[3].point,c[2].point)},{corners:[u[3],u[0],c[0],c[3]],center:l.avg(c[0].point,c[3].point)}];e.surfaces=p;for(var f=0;f<p.length;f++){r=p[f];var m=this._convertPointToTranslation(r.center);r.dist=this.showPerspective?m.length():-m.z}p.sort(function(t,e){var i=e.dist-t.dist;
19294return i||(t.corners===u?1:e.corners===u?-1:0)}),t.lineWidth=this._getStrokeWidth(e),t.strokeStyle=s,t.fillStyle=n;for(var v=2;v<p.length;v++)r=p[v],this._polygon(t,r.corners)},o.prototype._polygon=function(t,e,i,o){if(!(e.length<2)){void 0!==i&&(t.fillStyle=i),void 0!==o&&(t.strokeStyle=o),t.beginPath(),t.moveTo(e[0].screen.x,e[0].screen.y);for(var n=1;n<e.length;++n){var s=e[n];t.lineTo(s.screen.x,s.screen.y)}t.closePath(),t.fill(),t.stroke()}},o.prototype._drawCircle=function(t,e,i,o,n){var s=this._calcRadius(e,n);t.lineWidth=this._getStrokeWidth(e),t.strokeStyle=o,t.fillStyle=i,t.beginPath(),t.arc(e.screen.x,e.screen.y,s,0,2*Math.PI,!0),t.fill(),t.stroke()},o.prototype._getColorsRegular=function(t){var e=240*(1-(t.point.z-this.zRange.min)*this.scale.z/this.verticalRatio);return{fill:this._hsv2rgb(e,1,1),border:this._hsv2rgb(e,1,.8)}},o.prototype._getColorsColor=function(t){var e,i;if("string"==typeof t.point.value)e=t.point.value,i=t.point.value;else{var o=240*(1-(t.point.value-this.valueRange.min)*this.scale.value);e=this._hsv2rgb(o,1,1),i=this._hsv2rgb(o,1,.8)}return{fill:e,border:i}
19294},o.prototype._getColorsSize=function(){return{fill:this.dataColor.fill,border:this.dataColor.stroke}},o.prototype._calcRadius=function(t,e){void 0===e&&(e=this._dotSize());var i;return i=this.showPerspective?e/-t.trans.z:e*(-this.eye.z/this.camera.getArmLength()),i<0&&(i=0),i},o.prototype._redrawBarGraphPoint=function(t,e){var i=this.xBarWidth/2,o=this.yBarWidth/2,n=this._getColorsRegular(e);this._redrawBar(t,e,i,o,n.fill,n.border)},o.prototype._redrawBarColorGraphPoint=function(t,e){var i=this.xBarWidth/2,o=this.yBarWidth/2,n=this._getColorsColor(e);this._redrawBar(t,e,i,o,n.fill,n.border)},o.prototype._redrawBarSizeGraphPoint=function(t,e){var i=(e.point.value-this.valueRange.min)/this.valueRange.range(),o=this.xBarWidth/2*(.8*i+.2),n=this.yBarWidth/2*(.8*i+.2),s=this._getColorsSize();this._redrawBar(t,e,o,n,s.fill,s.border)},o.prototype._redrawDotGraphPoint=function(t,e){var i=this._getColorsRegular(e);this._drawCircle(t,e,i.fill,i.border)},o.prototype._redrawDotLineGraphPoint=function(t,e){var i=this._convert3Dto2D(e.bottom);t.lineWidth=1,this._line(t,i,e.screen,this.gridColor),this._redrawDotGraphPoint(t,e)},o.prototype._redrawDotColorGraphPoint=function(t,e){var i=this._getColorsColor(e);this._drawCircle(t,e,i.fill,i.border)},o.prototype._redrawDotSizeGraphPoint=function(t,e){var i=this._dotSize(),o=(e.point.value-this.valueRange.min)/this.valueRange.range(),n=i*this.dotSizeMinFraction,s=i*this.dotSizeMaxFraction-n,r=n+s*o,a=this._getColorsSize();this._drawCircle(t,e,a.fill,a.border,r)},o.prototype._redrawSurfaceGraphPoint=function(t,e){var i=e.pointRight,o=e.pointTop,n=e.pointCross;if(void 0!==e&&void 0!==i&&void 0!==o&&void 0!==n){var s,r,a=!0;if(this.showGrayBottom||this.showShadow){var h=l.subtract(n.trans,e.trans),d=l.subtract(o.trans,i.trans),u=l.crossProduct(h,d),c=u.length();a=u.z>0}if(a){var p,f=(e.point.z+i.point.z+o.point.z+n.point.z)/4,m=240*(1-(f-this.zRange.min)*this.scale.z/this.verticalRatio);this.showShadow?(p=Math.min(1+u.x/c/2,1),s=this._hsv2rgb(m,1,p),r=s):(p=1,s=this._hsv2rgb(m,1,p),r=this.axisColor)}else s="gray",r=this.axisColor;t.lineWidth=this._getStrokeWidth(e);var v=[e,i,n,o];this._polygon(t,v,s,r)}},o.prototype._drawGridLine=function(t,e,i){if(void 0!==e&&void 0!==i){var o=(e.point.z+i.point.z)/2,n=240*(1-(o-this.zRange.min)*this.scale.z/this.verticalRatio);t.lineWidth=2*this._getStrokeWidth(e),t.strokeStyle=this._hsv2rgb(n,1,1),this._line(t,e.screen,i.screen)}},o.prototype._redrawGridGraphPoint=function(t,e){this._drawGridLine(t,e,e.pointRight),this._drawGridLine(t,e,e.pointTop)},o.prototype._redrawLineGraphPoint=function(t,e){void 0!==e.pointNext&&(t.lineWidth=this._getStrokeWidth(e),t.strokeStyle=this.dataColor.stroke,this._line(t,e.screen,e.pointNext.screen))},o.prototype._redrawDataGraph=function(){var t,e=this._getContext();if(!(void 0===this.dataPoints||this.dataPoints.length<=0))for(this._calcTranslations(this.dataPoints),t=0;t<this.dataPoints.length;t++){var i=this.dataPoints[t];this._pointDrawingMethod.call(this,e,i)}},o.prototype._storeMousePosition=function(t){this.startMouseX=n(t),this.startMouseY=s(t),this._startCameraOffset=this.camera.getOffset()},o.prototype._onMouseDown=function(t){if(t=t||window.event,this.leftButtonDown&&this._onMouseUp(t),this.leftButtonDown=t.which?1===t.which:1===t.button,this.leftButtonDown||this.touchDown){this._storeMousePosition(t),this.startStart=new Date(this.start),this.startEnd=new Date(this.end),this.startArmRotation=this.camera.getArmRotation(),this.frame.style.cursor="move";var e=this;this.onmousemove=function(t){e._onMouseMove(t)},this.onmouseup=function(t){e._onMouseUp(t)},d.addEventListener(document,"mousemove",e.onmousemove),d.addEventListener(document,"mouseup",e.onmouseup),d.preventDefault(t)}},o.prototype._onMouseMove=function(t){this.moving=!0,t=t||window.event;var e=parseFloat(n(t))-this.startMouseX,i=parseFloat(s(t))-this.startMouseY;if(t&&!0===t.ctrlKey){var o=.5*this.frame.clientWidth,r=.5*this.frame.clientHeight,a=(this._startCameraOffset.x||0)-e/o*this.camera.armLength*.8,h=(this._startCameraOffset.y||0)+i/r*this.camera.armLength*.8;this.camera.setOffset(a,h),this._storeMousePosition(t)}else{var l=this.startArmRotation.horizontal+e/200,u=this.startArmRotation.vertical+i/200,c=Math.sin(4/360*2*Math.PI);Math.abs(Math.sin(l))<c&&(l=Math.round(l/Math.PI)*Math.PI-.001),Math.abs(Math.cos(l))<c&&(l=(Math.round(l/Math.PI-.5)+.5)*Math.PI-.001),Math.abs(Math.sin(u))<c&&(u=Math.round(u/Math.PI)*Math.PI),Math.abs(Math.cos(u))<c&&(u=(Math.round(u/Math.PI-.5)+.5)*Math.PI),this.camera.setArmRotation(l,u)}this.redraw();var p=this.getCameraPosition();
19294this.emit("cameraPositionChange",p),d.preventDefault(t)},o.prototype._onMouseUp=function(t){this.frame.style.cursor="auto",this.leftButtonDown=!1,d.removeEventListener(document,"mousemove",this.onmousemove),d.removeEventListener(document,"mouseup",this.onmouseup),d.preventDefault(t)},o.prototype._onClick=function(t){if(this.onclick_callback){if(this.moving)this.moving=!1;else{var e=this.frame.getBoundingClientRect(),i=n(t)-e.left,o=s(t)-e.top,r=this._dataPointFromXY(i,o);r&&this.onclick_callback(r.point.data)}d.preventDefault(t)}},o.prototype._onTooltip=function(t){var e=this.frame.getBoundingClientRect(),i=n(t)-e.left,o=s(t)-e.top;if(this.showTooltip){if(this.tooltipTimeout&&clearTimeout(this.tooltipTimeout),this.leftButtonDown)return void this._hideTooltip();if(this.tooltip&&this.tooltip.dataPoint){var r=this._dataPointFromXY(i,o);r!==this.tooltip.dataPoint&&(r?this._showTooltip(r):this._hideTooltip())}else{var a=this;this.tooltipTimeout=setTimeout(function(){a.tooltipTimeout=null;var t=a._dataPointFromXY(i,o);t&&a._showTooltip(t)},300)}}},o.prototype._onTouchStart=function(t){this.touchDown=!0;var e=this;this.ontouchmove=function(t){e._onTouchMove(t)},this.ontouchend=function(t){e._onTouchEnd(t)},d.addEventListener(document,"touchmove",e.ontouchmove),d.addEventListener(document,"touchend",e.ontouchend),this._onMouseDown(t)},o.prototype._onTouchMove=function(t){this._onMouseMove(t)},o.prototype._onTouchEnd=function(t){this.touchDown=!1,d.removeEventListener(document,"touchmove",this.ontouchmove),d.removeEventListener(document,"touchend",this.ontouchend),this._onMouseUp(t)},o.prototype._onWheel=function(t){t||(t=window.event);var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i=this.camera.getArmLength(),o=i*(1-e/10);this.camera.setArmLength(o),this.redraw(),this._hideTooltip()}var n=this.getCameraPosition();this.emit("cameraPositionChange",n),d.preventDefault(t)},o.prototype._insideTriangle=function(t,e){function i(t){return t>0?1:t<0?-1:0}var o=e[0],n=e[1],s=e[2],r=i((n.x-o.x)*(t.y-o.y)-(n.y-o.y)*(t.x-o.x)),a=i((s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x)),h=i((o.x-s.x)*(t.y-s.y)-(o.y-s.y)*(t.x-s.x));return!(0!=r&&0!=a&&r!=a||0!=a&&0!=h&&a!=h||0!=r&&0!=h&&r!=h)},o.prototype._dataPointFromXY=function(t,e){var i,n=null,s=null,r=null,a=new u(t,e);if(this.style===o.STYLE.BAR||this.style===o.STYLE.BARCOLOR||this.style===o.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){n=this.dataPoints[i];var h=n.surfaces;if(h)for(var d=h.length-1;d>=0;d--){var l=h[d],c=l.corners,p=[c[0].screen,c[1].screen,c[2].screen],f=[c[2].screen,c[3].screen,c[0].screen];if(this._insideTriangle(a,p)||this._insideTriangle(a,f))return n}}else for(i=0;i<this.dataPoints.length;i++){n=this.dataPoints[i];var m=n.screen;if(m){var v=Math.abs(t-m.x),g=Math.abs(e-m.y),y=Math.sqrt(v*v+g*g);(null===r||y<r)&&y<100&&(r=y,s=n)}}return s},o.prototype.hasBars=function(t){return t==o.STYLE.BAR||t==o.STYLE.BARCOLOR||t==o.STYLE.BARSIZE},o.prototype._showTooltip=function(t){var e,i,o;this.tooltip?(e=this.tooltip.dom.content,i=this.tooltip.dom.line,o=this.tooltip.dom.dot):(e=document.createElement("div"),(0,a.default)(e.style,{},this.tooltipStyle.content),e.style.position="absolute",i=document.createElement("div"),(0,a.default)(i.style,{},this.tooltipStyle.line),i.style.position="absolute",o=document.createElement("div"),(0,a.default)(o.style,{},this.tooltipStyle.dot),o.style.position="absolute",this.tooltip={dataPoint:null,dom:{content:e,line:i,dot:o}}),this._hideTooltip(),this.tooltip.dataPoint=t,"function"==typeof this.showTooltip?e.innerHTML=this.showTooltip(t.point):e.innerHTML="<table><tr><td>"+this.xLabel+":</td><td>"+t.point.x+"</td></tr><tr><td>"+this.yLabel+":</td><td>"+t.point.y+"</td></tr><tr><td>"+this.zLabel+":</td><td>"+t.point.z+"</td></tr></table>",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(o);var n=e.offsetWidth,s=e.offsetHeight,r=i.offsetHeight,h=o.offsetWidth,d=o.offsetHeight,l=t.screen.x-n/2;l=Math.min(Math.max(l,10),this.frame.clientWidth-10-n),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-r+"px",e.style.left=l+"px",e.style.top=t.screen.y-r-s+"px",o.style.left=t.screen.x-h
19294/2+"px",o.style.top=t.screen.y-d/2+"px"},o.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},o.prototype.setCameraPosition=function(t){f.setCameraPosition(t,this),this.redraw()},o.prototype.setSize=function(t,e){this._setSize(t,e),this.redraw()},t.exports=o},function(t,e,i){i(163),t.exports=i(7).Object.assign},function(t,e,i){var o=i(17);o(o.S+o.F,"Object",{assign:i(164)})},function(t,e,i){var o=i(33),n=i(63),s=i(42),r=i(41),a=i(78),h=Object.assign;t.exports=!h||i(28)(function(){var t={},e={},i=Symbol(),o="abcdefghijklmnopqrst";return t[i]=7,o.split("").forEach(function(t){e[t]=t}),7!=h({},t)[i]||Object.keys(h({},e)).join("")!=o})?function(t,e){for(var i=r(t),h=arguments.length,d=1,l=n.f,u=s.f;h>d;)for(var c,p=a(arguments[d++]),f=l?o(p).concat(l(p)):o(p),m=f.length,v=0;m>v;)u.call(p,c=f[v++])&&(i[c]=p[c]);return i}:h},function(t,e,i){t.exports={default:i(166),__esModule:!0}},function(t,e,i){i(167),t.exports=i(7).Math.sign},function(t,e,i){var o=i(17);o(o.S,"Math",{sign:i(168)})},function(t,e){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,e,i){t.exports={default:i(170),__esModule:!0}},function(t,e,i){i(171);var o=i(7).Object;t.exports=function(t,e,i){return o.defineProperty(t,e,i)}},function(t,e,i){var o=i(17);o(o.S+o.F*!i(21),"Object",{defineProperty:i(20).f})},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var o="string",n="boolean",s="number",r={fill:{string:o},stroke:{string:o},strokeWidth:{number:s},__type__:{string:o,object:"object",undefined:"undefined"}},a={animationAutoStart:{boolean:n,undefined:"undefined"},animationInterval:{number:s},animationPreload:{boolean:n},axisColor:{string:o},backgroundColor:r,xBarWidth:{number:s,undefined:"undefined"},yBarWidth:{number:s,undefined:"undefined"},cameraPosition:{distance:{number:s},horizontal:{number:s},vertical:{number:s},__type__:{object:"object"}},xCenter:{string:o},yCenter:{string:o},dataColor:r,dotSizeMinFraction:{number:s},dotSizeMaxFraction:{number:s},dotSizeRatio:{number:s},filterLabel:{string:o},gridColor:{string:o},onclick:{function:"function"},keepAspectRatio:{boolean:n},xLabel:{string:o},yLabel:{string:o},zLabel:{string:o},legendLabel:{string:o},xMin:{number:s,undefined:"undefined"},yMin:{number:s,undefined:"undefined"},zMin:{number:s,undefined:"undefined"},xMax:{number:s,undefined:"undefined"},yMax:{number:s,undefined:"undefined"},zMax:{number:s,undefined:"undefined"},showAnimationControls:{boolean:n,undefined:"undefined"},showGrid:{boolean:n},showLegend:{boolean:n,undefined:"undefined"},showPerspective:{boolean:n},showShadow:{boolean:n},showXAxis:{boolean:n},showYAxis:{boolean:n},showZAxis:{boolean:n},xStep:{number:s,undefined:"undefined"},yStep:{number:s,undefined:"undefined"},zStep:{number:s,undefined:"undefined"},style:{number:s,string:["bar","bar-color","bar-size","dot","dot-line","dot-color","dot-size","line","grid","surface"]},tooltip:{boolean:n,function:"function"},tooltipStyle:{content:{color:{string:o},background:{string:o},border:{string:o},borderRadius:{string:o},boxShadow:{string:o},padding:{string:o},__type__:{object:"object"}},line:{borderLeft:{string:o},height:{string:o},width:{string:o},__type__:{object:"object"}},dot:{border:{string:o},borderRadius:{string:o},height:{string:o},width:{string:o},__type__:{object:"object"}},__type__:{object:"object"}},xValueLabel:{function:"function"},yValueLabel:{function:"function"},zValueLabel:{function:"function"},valueMax:{number:s,undefined:"undefined"},valueMin:{number:s,undefined:"undefined"},verticalRatio:{number:s},height:{string:o},width:{string:o},__type__:{object:"object"}};e.allOptions=a},function(t,e,i){function o(){this.dataTable=null}var n=i(11),s=i(12),r=i(174),a=i(96),h=i(94),d=i(34);o.prototype.initializeData=function(t,e,i){if(void 0!==e){Array.isArray(e)&&(e=new n(e));var o;if(!(e instanceof n||e instanceof s))throw new Error("Array, DataSet, or DataView expected");if(o=e.get(),0!=o.length){this.style=i,this.dataSet&&this.dataSet.off("*",this._onChange),this.dataSet=e,this.dataTable=o;var r=this;this._onChange=function(){t.setData(r.dataSet)},this.dataSet.on("*",this._onChange),this.colX="x",this.colY="y",this.colZ="z";var h=t.hasBars(i);if(h&&(void 0!==t.defaultXBarWidth?this.xBarWidth=t.defaultXBarWidth:this.xBarWidth=this.getSmallestDifference(o,this.colX)||1,void 0!==t.defaultYBarWidth?this.yBarWidth=t.defaultYBarWidth:this.yBarWidth=this.getSmallestDifference(o,this.colY)||
192941),this._initializeRange(o,this.colX,t,h),this._initializeRange(o,this.colY,t,h),this._initializeRange(o,this.colZ,t,!1),o[0].hasOwnProperty("style")){this.colValue="style";var d=this.getColumnRange(o,this.colValue);this._setRangeDefaults(d,t.defaultValueMin,t.defaultValueMax),this.valueRange=d}this.getDataTable()[0].hasOwnProperty("filter")&&void 0===this.dataFilter&&(this.dataFilter=new a(this,"filter",t),this.dataFilter.setOnLoadCallback(function(){t.redraw()}));return this.dataFilter?this.dataFilter._getDataPoints():this._getDataPoints(this.getDataTable())}}},o.prototype._collectRangeSettings=function(t,e){if(-1==["x","y","z"].indexOf(t))throw new Error("Column '"+t+"' invalid");var i=t.toUpperCase();return{barWidth:this[t+"BarWidth"],min:e["default"+i+"Min"],max:e["default"+i+"Max"],step:e["default"+i+"Step"],range_label:t+"Range",step_label:t+"Step"}},o.prototype._initializeRange=function(t,e,i,o){var n=this._collectRangeSettings(e,i),s=this.getColumnRange(t,e);o&&"z"!=e&&s.expand(n.barWidth/2),this._setRangeDefaults(s,n.min,n.max),this[n.range_label]=s,this[n.step_label]=void 0!==n.step?n.step:s.range()/5},o.prototype.getDistinctValues=function(t,e){void 0===e&&(e=this.dataTable);for(var i=[],o=0;o<e.length;o++){var n=e[o][t]||0;-1===i.indexOf(n)&&i.push(n)}return i.sort(function(t,e){return t-e})},o.prototype.getSmallestDifference=function(t,e){for(var i=this.getDistinctValues(t,e),o=null,n=1;n<i.length;n++){var s=i[n]-i[n-1];(null==o||o>s)&&(o=s)}return o},o.prototype.getColumnRange=function(t,e){for(var i=new r,o=0;o<t.length;o++){var n=t[o][e];i.adjust(n)}return i},o.prototype.getNumberOfRows=function(){return this.dataTable.length},o.prototype._setRangeDefaults=function(t,e,i){void 0!==e&&(t.min=e),void 0!==i&&(t.max=i),t.max<=t.min&&(t.max=t.min+1)},o.prototype.getDataTable=function(){return this.dataTable},o.prototype.getDataSet=function(){return this.dataSet},o.prototype.getDataPoints=function(t){for(var e=[],i=0;i<t.length;i++){var o=new d;o.x=t[i][this.colX]||0,o.y=t[i][this.colY]||0,o.z=t[i][this.colZ]||0,o.data=t[i],void 0!==this.colValue&&(o.value=t[i][this.colValue]||0);var n={};n.point=o,n.bottom=new d(o.x,o.y,this.zRange.min),n.trans=void 0,n.screen=void 0,e.push(n)}return e},o.prototype.initDataAsMatrix=function(t){var e,i,o,n,s=this.getDistinctValues(this.colX,t),r=this.getDistinctValues(this.colY,t),a=this.getDataPoints(t),h=[];for(o=0;o<a.length;o++){n=a[o];var d=s.indexOf(n.point.x),l=r.indexOf(n.point.y);void 0===h[d]&&(h[d]=[]),h[d][l]=n}for(e=0;e<h.length;e++)for(i=0;i<h[e].length;i++)h[e][i]&&(h[e][i].pointRight=e<h.length-1?h[e+1][i]:void 0,h[e][i].pointTop=i<h[e].length-1?h[e][i+1]:void 0,h[e][i].pointCross=e<h.length-1&&i<h[e].length-1?h[e+1][i+1]:void 0);return a},o.prototype.getInfo=function(){var t=this.dataFilter;if(t)return t.getLabel()+": "+t.getSelectedValue()},o.prototype.reload=function(){this.dataTable&&this.setData(this.dataTable)},o.prototype._getDataPoints=function(t){var e=[];if(this.style===h.STYLE.GRID||this.style===h.STYLE.SURFACE)e=this.initDataAsMatrix(t);else if(this._checkValueField(t),e=this.getDataPoints(t),this.style===h.STYLE.LINE)for(var i=0;i<e.length;i++)i>0&&(e[i-1].pointNext=e[i]);return e},o.prototype._checkValueField=function(t){if(this.style===h.STYLE.BARCOLOR||this.style===h.STYLE.BARSIZE||this.style===h.STYLE.DOTCOLOR||this.style===h.STYLE.DOTSIZE){if(void 0===this.colValue)throw new Error("Expected data to have  field 'style'  for graph style '"+this.style+"'");if(void 0===t[0][this.colValue])throw new Error("Expected data to have  field '"+this.colValue+"'  for graph style '"+this.style+"'")}},t.exports=o},function(t,e,i){function o(){this.min=void 0,this.max=void 0}o.prototype.adjust=function(t){void 0!==t&&((void 0===this.min||this.min>t)&&(this.min=t),(void 0===this.max||this.max<t)&&(this.max=t))},o.prototype.combine=function(t){this.add(t.min),this.add(t.max)},o.prototype.expand=function(t){if(void 0!==t){var e=this.min-t,i=this.max+t;if(e>i)throw new Error("Passed expansion value makes range invalid");this.min=e,this.max=i}},o.prototype.range=function(){return this.max-this.min},o.prototype.center=function(){return(this.min+this.max)/2},t.exports=o}
19294,function(t,e,i){var o,n,s;!function(i){n=[],o=i,void 0!==(s="function"==typeof o?o.apply(e,n):o)&&(t.exports=s)}(function(){var t=null;return function e(i,o){function n(t){return t.match(/[^ ]+/g)}function s(e){if("hammer.input"!==e.type){if(e.srcEvent._handled||(e.srcEvent._handled={}),e.srcEvent._handled[e.type])return;e.srcEvent._handled[e.type]=!0}var i=!1;e.stopPropagation=function(){i=!0};var o=e.srcEvent.stopPropagation.bind(e.srcEvent);"function"==typeof o&&(e.srcEvent.stopPropagation=function(){o(),e.stopPropagation()}),e.firstTarget=t;for(var n=t;n&&!i;){var s=n.hammer;if(s)for(var r,a=0;a<s.length;a++)if(r=s[a]._handlers[e.type])for(var h=0;h<r.length&&!i;h++)r[h](e);n=n.parentNode}}var r=o||{preventDefault:!1};if(i.Manager){var a=i,h=function(t,i){var o=Object.create(r);return i&&a.assign(o,i),e(new a(t,o),o)};return a.assign(h,a),h.Manager=function(t,i){var o=Object.create(r);return i&&a.assign(o,i),e(new a.Manager(t,o),o)},h}var d=Object.create(i),l=i.element;return l.hammer||(l.hammer=[]),l.hammer.push(d),i.on("hammer.input",function(e){!0!==r.preventDefault&&r.preventDefault!==e.pointerType||e.preventDefault(),e.isFirst&&(t=e.target)}),d._handlers={},d.on=function(t,e){return n(t).forEach(function(t){var o=d._handlers[t];o||(d._handlers[t]=o=[],i.on(t,s)),o.push(e)}),d},d.off=function(t,e){return n(t).forEach(function(t){var o=d._handlers[t];o&&(o=e?o.filter(function(t){return t!==e}):[],o.length>0?d._handlers[t]=o:(i.off(t,s),delete d._handlers[t]))}),d},d.emit=function(e,o){t=o.target,i.emit(e,o)},d.destroy=function(){var t=i.element.hammer,e=t.indexOf(d);-1!==e&&t.splice(e,1),t.length||delete i.element.hammer,d._handlers={},i.destroy()},d}})},function(t,e,i){var o;!function(n,s,r,a){function h(t,e,i){return setTimeout(p(t,i),e)}function d(t,e,i){return!!Array.isArray(t)&&(l(t,i[e],i),!0)}function l(t,e,i){var o;if(t)if(t.forEach)t.forEach(e,i);else if(t.length!==a)for(o=0;o<t.length;)e.call(i,t[o],o,t),o++;else for(o in t)t.hasOwnProperty(o)&&e.call(i,t[o],o,t)}function u(t,e,i){var o="DEPRECATED METHOD: "+e+"\n"+i+" AT \n";return function(){var e=new Error("get-stack-trace"),i=e&&e.stack?e.stack.replace(/^[^\(]+?[\n$]/gm,"").replace(/^\s+at\s+/gm,"").replace(/^Object.<anonymous>\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",s=n.console&&(n.console.warn||n.console.log);return s&&s.call(n.console,o,i),t.apply(this,arguments)}}function c(t,e,i){var o,n=e.prototype;o=t.prototype=Object.create(n),o.constructor=t,o._super=n,i&&ft(o,i)}function p(t,e){return function(){return t.apply(e,arguments)}}function f(t,e){return typeof t==gt?t.apply(e?e[0]||a:a,e):t}function m(t,e){return t===a?e:t}function v(t,e,i){l(_(e),function(e){t.addEventListener(e,i,!1)})}function g(t,e,i){l(_(e),function(e){t.removeEventListener(e,i,!1)})}function y(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function b(t,e){return t.indexOf(e)>-1}function _(t){return t.trim().split(/\s+/g)}function w(t,e,i){if(t.indexOf&&!i)return t.indexOf(e);for(var o=0;o<t.length;){if(i&&t[o][i]==e||!i&&t[o]===e)return o;o++}return-1}function x(t){return Array.prototype.slice.call(t,0)}function k(t,e,i){for(var o=[],n=[],s=0;s<t.length;){var r=e?t[s][e]:t[s];w(n,r)<0&&o.push(t[s]),n[s]=r,s++}return i&&(o=e?o.sort(function(t,i){return t[e]>i[e]}):o.sort()),o}function S(t,e){for(var i,o,n=e[0].toUpperCase()+e.slice(1),s=0;s<mt.length;){if(i=mt[s],(o=i?i+n:e)in t)return o;s++}return a}function D(){return kt++}function M(t){var e=t.ownerDocument||t;return e.defaultView||e.parentWindow||n}function C(t,e){var i=this;this.manager=t,this.callback=e,this.element=t.element,this.target=t.options.inputTarget,this.domHandler=function(e){f(t.options.enable,[t])&&i.handler(e)},this.init()}function O(t){var e=t.options.inputClass;return new(e||(Mt?W:Ct?V:Dt?q:H))(t,E)}function E(t,e,i){var o=i.pointers.length,n=i.changedPointers.length,s=e&Et&&o-n==0,r=e&(Pt|It)&&o-n==0;i.isFirst=!!s,i.isFinal=!!r,s&&(t.session={}),i.eventType=e,T(t,i),t.emit("hammer.input",i),t.recognize(i),t.session.prevInput=i}function T(t,e){var i=t.session,o=e.pointers,n=o.length;i.firstInput||(i.firstInput=N(e)),n>1&&!i.firstMultiple?i.firstMultiple=N(e):1===n&&(i.firstMultiple=!1);var s=i.firstInput,r=i.firstMultiple,a=r?r.center:s.center,h=e.center=R(o);e.timeStamp=_t(),e.deltaTime=e.timeStamp-s.timeStamp,e.angle=F(a,h),e.distance=L(a,h),P(i,e),e.offsetDirection=z(e.deltaX,e.deltaY);var d=A(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=d.x,e.overallVelocityY=d.y,e.overallVelocity=bt(d.x)>bt(d.y)?d.x:d.y,e.scale=r?j(r.pointers,o):1,e.rotation=r?B(r.pointers,o):0,e.maxPointers=i.prevInput?e.pointers.length>i.prevInput.maxPointers?e.pointers.length:i.prevInput.maxPointers:e.pointers.length,I(i,e);var l=t.element;y(e.srcEvent.target,l)&&(l=e.srcEvent.target),e.target=l}function P(t,e){var i=e.center,o=t.offsetDelta||{},n=t.prevDelta||{},s=t.prevInput||{};e.eventType!==Et&&s.eventType!==Pt||(n=t.prevDelta={x:s.deltaX||0,y:s.deltaY||0},o=t.offsetDelta={x:i.x,y:i.y}),e.deltaX=n.x+(i.x-o.x),e.deltaY=n.y+(i.y-o.y)}function I(t,e){var i,o,n,s,r=t.lastInterval||e,h=e.timeStamp-r.timeStamp;if(e.eventType!=It&&(h>Ot||r.velocity===a)){var d=e.deltaX-r.deltaX,l=e.deltaY-r.deltaY,u=A(h,d,l);o=u.x,n=u.y,i=bt(u.x)>bt(u.y)?u.x:u.y,s=z(d,l),t.lastInterval=e}else i=r.velocity,o=r.velocityX,n=r.velocityY,s=r.direction;e.velocity=i,e.velocityX=o,e.velocityY=n,e.direction=s}function N(t){for(var e=[],i=0;i<t.pointers.length;)e[i]={clientX:yt(t.pointers[i].clientX),clientY:yt(t.pointers[i].clientY)},i++;return{timeStamp:_t(),pointers:e,center:R(e),deltaX:t.deltaX,deltaY:t.deltaY}}function R(t){var e=t.length;if(1===e)return{x:yt(t[0].clientX),y:yt(t[0].clientY)};for(var i=0,o=0,n=0;n<e;)i+=t[n].clientX,o+=t[n].clientY,n++;return{x:yt(i/e),y:yt(o/e)}}function A(t,e,i){return{x:e/t||0,y:i/t||0}}function z(t,e){return t===e?Nt:bt(t)>=bt(e)?t<0?Rt:At:e<0?zt:Lt}function L(t,e,i){i||(i=Ht);var o=e[i[0]]-t[i[0]],n=e[i[1]]-t[i[1]];return Math.sqrt(o*o+n*n)}function F(t,e,i){i||(i=Ht);var o=e[i[0]]-t[i[0]],n=e[i[1]]-t[i[1]];return 180*Math.atan2(n,o)/Math.PI}function B(t,e){return F(e[1],e[0],Wt)+F(t[1],t[0],Wt)}function j(t,e){return L(e[0],e[1],Wt)/L(t[0],t[1],Wt)}function H(){this.evEl=Gt,this.evWin=Vt,this.pressed=!1,C.apply(this,arguments)}function W(){this.evEl=Xt,this.evWin=Zt,C.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function Y(){this.evTarget=Jt,this.evWin=$t,this.started=!1,C.apply(this,arguments)}function G(t,e){var i=x(t.touches),o=x(t.changedTouches);return e&(Pt|It)&&(i=k(i.concat(o),"identifier",!0)),[i,o]}function V(){this.evTarget=te,this.targetIds={},C.apply(this,arguments)}function U(t,e){var i=x(t.touches),o=this.targetIds;if(e&(Et|Tt)&&1===i.length)return o[i[0].identifier]=!0,[i,i];var n,s,r=x(t.changedTouches),a=[],h=this.target;if(s=i.filter(function(t){return y(t.target,h)}),e===Et)for(n=0;n<s.length;)o[s[n].identifier]=!0,n++;for(n=0;n<r.length;)o[r[n].identifier]&&a.push(r[n]),e&(Pt|It)&&delete o[r[n].identifier],n++;return a.length?[k(s.concat(a),"identifier",!0),a]:void 0}function q(){C.apply(this,arguments);var t=p(this.handler,this);this.touch=new V(this.manager,t),this.mouse=new H(this.manager,t),this.primaryTouch=null,this.lastTouches=[]}function X(t,e){t&Et?(this.primaryTouch=e.changedPointers[0].identifier,Z.call(this,e)):t&(Pt|It)&&Z.call(this,e)}function Z(t){var e=t.changedPointers[0];if(e.identifier===this.primaryTouch){var i={x:e.clientX,y:e.clientY};this.lastTouches.push(i);var o=this.lastTouches,n=function(){var t=o.indexOf(i);t>-1&&o.splice(t,1)};setTimeout(n,ee)}}function K(t){for(var e=t.srcEvent.clientX,i=t.srcEvent.clientY,o=0;o<this.lastTouches.length;
vendor: 11,001 bytes, lines 19294-19295
19294o++){var n=this.lastTouches[o],s=Math.abs(e-n.x),r=Math.abs(i-n.y);if(s<=ie&&r<=ie)return!0}return!1}function J(t,e){this.manager=t,this.set(e)}function $(t){if(b(t,ae))return ae;var e=b(t,he),i=b(t,de);return e&&i?ae:e||i?e?he:de:b(t,re)?re:se}function Q(t){this.options=ft({},this.defaults,t||{}),this.id=D(),this.manager=null,this.options.enable=m(this.options.enable,!0),this.state=ue,this.simultaneous={},this.requireFail=[]}
19295    function tt(t){return t&ve?"cancel":t&fe?"end":t&pe?"move":t&ce?"start":""}function et(t){return t==Lt?"down":t==zt?"up":t==Rt?"left":t==At?"right":""}function it(t,e){var i=e.manager;return i?i.get(t):t}function ot(){Q.apply(this,arguments)}function nt(){ot.apply(this,arguments),this.pX=null,this.pY=null}function st(){ot.apply(this,arguments)}function rt(){Q.apply(this,arguments),this._timer=null,this._input=null}function at(){ot.apply(this,arguments)}function ht(){ot.apply(this,arguments)}function dt(){Q.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function lt(t,e){return e=e||{},e.recognizers=m(e.recognizers,lt.defaults.preset),new ut(t,e)}function ut(t,e){this.options=ft({},lt.defaults,e||{}),this.options.inputTarget=this.options.inputTarget||t,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=t,this.input=O(this),this.touchAction=new J(this,this.options.touchAction),ct(this,!0),l(this.options.recognizers,function(t){var e=this.add(new t[0](t[1]));t[2]&&e.recognizeWith(t[2]),t[3]&&e.requireFailure(t[3])},this)}function ct(t,e){var i=t.element;if(i.style){var o;l(t.options.cssProps,function(n,s){o=S(i.style,s),e?(t.oldCssProps[o]=i.style[o],i.style[o]=n):i.style[o]=t.oldCssProps[o]||""}),e||(t.oldCssProps={})}}function pt(t,e){var i=s.createEvent("Event");i.initEvent(t,!0,!0),i.gesture=e,e.target.dispatchEvent(i)}var ft,mt=["","webkit","Moz","MS","ms","o"],vt=s.createElement("div"),gt="function",yt=Math.round,bt=Math.abs,_t=Date.now;ft="function"!=typeof Object.assign?function(t){if(t===a||null===t)throw new TypeError("Cannot convert undefined or null to object");for(var e=Object(t),i=1;i<arguments.length;i++){var o=arguments[i];if(o!==a&&null!==o)for(var n in o)o.hasOwnProperty(n)&&(e[n]=o[n])}return e}:Object.assign;var wt=u(function(t,e,i){for(var o=Object.keys(e),n=0;n<o.length;)(!i||i&&t[o[n]]===a)&&(t[o[n]]=e[o[n]]),n++;return t},"extend","Use `assign`."),xt=u(function(t,e){return wt(t,e,!0)},"merge","Use `assign`."),kt=1,St=/mobile|tablet|ip(ad|hone|od)|android/i,Dt="ontouchstart"in n,Mt=S(n,"PointerEvent")!==a,Ct=Dt&&St.test(navigator.userAgent),Ot=25,Et=1,Tt=2,Pt=4,It=8,Nt=1,Rt=2,At=4,zt=8,Lt=16,Ft=Rt|At,Bt=zt|Lt,jt=Ft|Bt,Ht=["x","y"],Wt=["clientX","clientY"];C.prototype={handler:function(){},init:function(){this.evEl&&v(this.element,this.evEl,this.domHandler),this.evTarget&&v(this.target,this.evTarget,this.domHandler),this.evWin&&v(M(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&g(this.element,this.evEl,this.domHandler),this.evTarget&&g(this.target,this.evTarget,this.domHandler),this.evWin&&g(M(this.element),this.evWin,this.domHandler)}};var Yt={mousedown:Et,mousemove:Tt,mouseup:Pt},Gt="mousedown",Vt="mousemove mouseup";c(H,C,{handler:function(t){var e=Yt[t.type];e&Et&&0===t.button&&(this.pressed=!0),e&Tt&&1!==t.which&&(e=Pt),this.pressed&&(e&Pt&&(this.pressed=!1),this.callback(this.manager,e,{pointers:[t],changedPointers:[t],pointerType:"mouse",srcEvent:t}))}});var Ut={pointerdown:Et,pointermove:Tt,pointerup:Pt,pointercancel:It,pointerout:It},qt={2:"touch",3:"pen",4:"mouse",5:"kinect"},Xt="pointerdown",Zt="pointermove pointerup pointercancel";n.MSPointerEvent&&!n.PointerEvent&&(Xt="MSPointerDown",Zt="MSPointerMove MSPointerUp MSPointerCancel"),c(W,C,{handler:function(t){var e=this.store,i=!1,o=t.type.toLowerCase().replace("ms",""),n=Ut[o],s=qt[t.pointerType]||t.pointerType,r="touch"==s,a=w(e,t.pointerId,"pointerId");n&Et&&(0===t.button||r)?a<0&&(e.push(t),a=e.length-1):n&(Pt|It)&&(i=!0),a<0||(e[a]=t,this.callback(this.manager,n,{pointers:e,changedPointers:[t],pointerType:s,srcEvent:t}),i&&e.splice(a,1))}});var Kt={touchstart:Et,touchmove:Tt,touchend:Pt,touchcancel:It},Jt="touchstart",$t="touchstart touchmove touchend touchcancel";c(Y,C,{handler:function(t){var e=Kt[t.type];if(e===Et&&(this.started=!0),this.started){var i=G.call(this,t,e);e&(Pt|It)&&i[0].length-i[1].length==0&&(this.started=!1),this.callback(this.manager,e,{pointers:i[0],changedPointers:i[1],pointerType:"touch",srcEvent:t})}}});var Qt={touchstart:Et,touchmove:Tt,touchend:Pt,touchcancel:It},te="touchstart touchmove touchend touchcancel";c(V,C,{handler:function(t){var e=Qt[t.type],i=U.call(this,t,e);i&&this.callback(this.manager,e,{pointers:i[0],changedPointers:i[1],pointerType:"touch",srcEvent:t})}});var ee=2500,ie=25;c(q,C,{handler:function(t,e,i){var o="touch"==i.pointerType,n="mouse"==i.pointerType;if(!(n&&i.sourceCapabilities&&i.sourceCapabilities.firesTouchEvents)){if(o)X.call(this,e,i);else if(n&&K.call(this,i))return;this.callback(t,e,i)}},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var oe=S(vt.style,"touchAction"),ne=oe!==a,se="auto",re="manipulation",ae="none",he="pan-x",de="pan-y",le=function(){if(!ne)return!1;var t={},e=n.CSS&&n.CSS.supports;return["auto","manipulation","pan-y","pan-x","pan-x pan-y","none"].forEach(function(i){t[i]=!e||n.CSS.supports("touch-action",i)}),t}();J.prototype={set:function(t){"compute"==t&&(t=this.compute()),ne&&this.manager.element.style&&le[t]&&(this.manager.element.style[oe]=t),this.actions=t.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var t=[];return l(this.manager.recognizers,function(e){f(e.options.enable,[e])&&(t=t.concat(e.getTouchAction()))}),$(t.join(" "))},preventDefaults:function(t){var e=t.srcEvent,i=t.offsetDirection;if(this.manager.session.prevented)return void e.preventDefault();var o=this.actions,n=b(o,ae)&&!le[ae],s=b(o,de)&&!le[de],r=b(o,he)&&!le[he];if(n){var a=1===t.pointers.length,h=t.distance<2,d=t.deltaTime<250;if(a&&h&&d)return}return r&&s?void 0:n||s&&i&Ft||r&&i&Bt?this.preventSrc(e):void 0},preventSrc:function(t){this.manager.session.prevented=!0,t.preventDefault()}};var ue=1,ce=2,pe=4,fe=8,me=fe,ve=16;Q.prototype={defaults:{},set:function(t){return ft(this.options,t),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(t){if(d(t,"recognizeWith",this))return this;var e=this.simultaneous;return t=it(t,this),e[t.id]||(e[t.id]=t,t.recognizeWith(this)),this},dropRecognizeWith:function(t){return d(t,"dropRecognizeWith",this)?this:(t=it(t,this),delete this.simultaneous[t.id],this)},requireFailure:function(t){if(d(t,"requireFailure",this))return this;var e=this.requireFail;return t=it(t,this),-1===w(e,t)&&(e.push(t),t.requireFailure(this)),this},dropRequireFailure:function(t){if(d(t,"dropRequireFailure",this))return this;t=it(t,this);var e=w(this.requireFail,t);return e>-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function e(e){i.manager.emit(e,t)}var i=this,o=this.state;o<fe&&e(i.options.event+tt(o)),e(i.options.event),t.additionalEvent&&e(t.additionalEvent),o>=fe&&e(i.options.event+tt(o))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;t<this.requireFail.length;){if(!(this.requireFail[t].state&(32|ue)))return!1;t++}return!0},recognize:function(t){var e=ft({},t);if(!f(this.options.enable,[this,e]))return this.reset(),void(this.state=32);this.state&(me|ve|32)&&(this.state=ue),this.state=this.process(e),this.state&(ce|pe|fe|ve)&&this.tryEmit(e)},process:function(t){},getTouchAction:function(){},reset:function(){}},c(ot,Q,{defaults:{pointers:1},attrTest:function(t){var e=this.options.pointers;return 0===e||t.pointers.length===e},process:function(t){var e=this.state,i=t.eventType,o=e&(ce|pe),n=this.attrTest(t);return o&&(i&It||!n)?e|ve:o||n?i&Pt?e|fe:e&ce?e|pe:ce:32}}),c(nt,ot,{defaults:{event:"pan",threshold:10,pointers:1,direction:jt},getTouchAction:function(){var t=this.options.direction,e=[];return t&Ft&&e.push(de),t&Bt&&e.push(he),e},directionTest:function(t){var e=this.options,i=!0,o=t.distance,n=t.direction,s=t.deltaX,r=t.deltaY;return n&e.direction||(e.direction&Ft?(n=0===s?Nt:s<0?Rt:At,i=s!=this.pX,o=Math.abs(t.deltaX)):(n=0===r?Nt:r<0?zt:Lt,i=r!=this.pY,o=Math.abs(t.deltaY))),t.direction=n,i&&o>e.threshold&&n&e.direction},attrTest:function(t){return ot.prototype.attrTest.call(this,t)&&(this.state&ce||!(this.state&ce)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=et(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),c(st,ot,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[ae]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&ce)},emit:function(t){if(1!==t.scale){var e=t.scale<1?"in":"out";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),c(rt,Q,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[se]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distance<e.threshold,n=t.deltaTime>e.time;if(this._input=t,!o||!i||t.eventType&(Pt|It)&&!n)this.reset();else if(t.eventType&Et)this.reset(),this._timer=h(function(){this.state=me,this.tryEmit()},e.time,this);else if(t.eventType&Pt)return me;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===me&&(t&&t.eventType&Pt?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=_t(),this.manager.emit(this.options.event,this._input)))}}),c(at,ot,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[ae]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&ce)}}),c(ht,ot,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:Ft|Bt,pointers:1},getTouchAction:function(){return nt.prototype.getTouchAction.call(this)},attrTest:function(t){var e,i=this.options.direction;return i&(Ft|Bt)?e=t.overallVelocity:i&Ft?e=t.overallVelocityX:i&Bt&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&i&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&bt(e)>this.options.velocity&&t.eventType&Pt},emit:function(t){var e=et(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),c(dt,Q,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[re]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distance<e.threshold,n=t.deltaTime<e.time;if(this.reset(),t.eventType&Et&&0===this.count)return this.failTimeout();
19295if(o&&n&&i){if(t.eventType!=Pt)return this.failTimeout();var s=!this.pTime||t.timeStamp-this.pTime<e.interval,r=!this.pCenter||L(this.pCenter,t.center)<e.posThreshold;this.pTime=t.timeStamp,this.pCenter=t.center,r&&s?this.count+=1:this.count=1,this._input=t;if(0===this.count%e.taps)return this.hasRequireFailures()?(this._timer=h(function(){this.state=me,this.tryEmit()},e.interval,this),ce):me}return 32},failTimeout:function(){return this._timer=h(function(){this.state=32},this.options.interval,this),32},reset:function(){clearTimeout(this._timer)},emit:function(){this.state==me&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))}}),lt.VERSION="2.0.7",lt.defaults={domEvents:!1,touchAction:"compute",enable:!0,inputTarget:null,inputClass:null,preset:[[at,{enable:!1}],[st,{enable:!1},["rotate"]],[ht,{direction:Ft}],[nt,{direction:Ft},["swipe"]],[dt],[dt,{event:"doubletap",taps:2},["tap"]],[rt]],cssProps:{userSelect:"none",touchSelect:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}};ut.prototype={set:function(t){return ft(this.options,t),t.touchAction&&this.touchAction.update(),t.inputTarget&&(this.input.destroy(),this.input.target=t.inputTarget,this.input.init()),this},stop:function(t){this.session.stopped=t?2:1},recognize:function(t){var e=this.session;if(!e.stopped){this.touchAction.preventDefaults(t);var i,o=this.recognizers,n=e.curRecognizer;(!n||n&&n.state&me)&&(n=e.curRecognizer=null);for(var s=0;s<o.length;)i=o[s],2===e.stopped||n&&i!=n&&!i.canRecognizeWith(n)?i.reset():i.recognize(t),!n&&i.state&(ce|pe|fe)&&(n=e.curRecognizer=i),s++}},get:function(t){if(t instanceof Q)return t;for(var e=this.recognizers,i=0;i<e.length;i++)if(e[i].options.event==t)return e[i];return null},add:function(t){if(d(t,"add",this))return this;var e=this.get(t.options.event);return e&&this.remove(e),this.recognizers.push(t),t.manager=this,this.touchAction.update(),t},remove:function(t){if(d(t,"remove",this))return this;if(t=this.get(t)){var e=this.recognizers,i=w(e,t);-1!==i&&(e.splice(i,1),this.touchAction.update())}return this},on:function(t,e){if(t!==a&&e!==a){var i=this.handlers;return l(_(t),function(t){i[t]=i[t]||[],i[t].push(e)}),this}},off:function(t,e){if(t!==a){var i=this.handlers;return l(_(t),function(t){e?i[t]&&i[t].splice(w(i[t],e),1):delete i[t]}),this}},emit:function(t,e){this.options.domEvents&&pt(t,e);var i=this.handlers[t]&&this.handlers[t].slice();if(i&&i.length){e.type=t,e.preventDefault=function(){e.srcEvent.preventDefault()};for(var o=0;o<i.length;)i[o](e),o++}},destroy:function(){this.element&&ct(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null}},ft(lt,{INPUT_START:Et,INPUT_MOVE:Tt,INPUT_END:Pt,INPUT_CANCEL:It,STATE_POSSIBLE:ue,STATE_BEGAN:ce,STATE_CHANGED:pe,STATE_ENDED:fe,STATE_RECOGNIZED:me,STATE_CANCELLED:ve,STATE_FAILED:32,DIRECTION_NONE:Nt,DIRECTION_LEFT:Rt,DIRECTION_RIGHT:At,DIRECTION_UP:zt,DIRECTION_DOWN:Lt,DIRECTION_HORIZONTAL:Ft,DIRECTION_VERTICAL:Bt,DIRECTION_ALL:jt,Manager:ut,Input:C,TouchAction:J,TouchInput:V,MouseInput:H,PointerEventInput:W,TouchMouseInput:q,SingleTouchInput:Y,Recognizer:Q,AttrRecognizer:ot,Tap:dt,Pan:nt,Swipe:ht,Pinch:st,Rotate:at,Press:rt,on:v,off:g,each:l,merge:xt,extend:wt,assign:ft,inherit:c,bindFn:p,prefixed:S}),(void 0!==n?n:"undefined"!=typeof self?self:{}).Hammer=lt,(o=function(){return lt}.call(e,i,e,t))!==a&&(t.exports=o)}(window,document)},function(t,e,i){e.util=i(2),e.DOMutil=i(14),e.DataSet=i(11),e.DataView=i(12),e.Queue=i(43),e.Timeline=i(178),e.Graph2d=i(180),e.timeline={Core:i(65),DateUtil:i(36),Range:i(64),stack:i(100),TimeStep:i(66),components:{items:{Item:i(38),BackgroundItem:i(103),BoxItem:i(101),PointItem:i(102),RangeItem:i(70)},BackgroundGroup:i(69),Component:i(16),CurrentTime:i(67),CustomTime:i(46),DataAxis:i(107),DataScale:i(108),GraphGroup:i(109),Group:i(68),ItemSet:i(99),Legend:i(112),LineGraph:i(106),TimeAxis:i(45)}},e.moment=i(9),e.Hammer=i(10),e.keycharm=i(35)},function(t,e,i){function o(t,e,i,n){if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");if(!(Array.isArray(i)||i instanceof d||i instanceof l)&&i instanceof Object){var s=n;n=i,i=s}n&&n.throttleRedraw&&console.warn('Timeline option "throttleRedraw" is DEPRICATED and no longer supported. It will be removed in the next MAJOR release.');var r=this;if(this.defaultOptions={start:null,end:null,autoResize:!0,orientation:{axis:"bottom",item:"bottom"},moment:a,width:null,height:null,maxHeight:null,minHeight:null},this.options=h.deepExtend({},this.defaultOptions),this._create(t),!n||n&&void 0===n.rtl){this.dom.root.style.visibility="hidden";for(var c,m=this.dom.root;!c&&m;)c=window.getComputedStyle(m,null).direction,m=m.parentElement;this.options.rtl=c&&"rtl"==c.toLowerCase()}else this.options.rtl=n.rtl;this.options.rollingMode=n&&n.rollingMode,this.options.onInitialDrawComplete=n&&n.onInitialDrawComplete,this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},hiddenDates:[],util:{getScale:function(){return r.timeAxis.step.scale},getStep:function(){return r.timeAxis.step.step},toScreen:r._toScreen.bind(r),toGlobalScreen:r._toGlobalScreen.bind(r),toT
19295ime:r._toTime.bind(r),toGlobalTime:r._toGlobalTime.bind(r)}},this.range=new u(this.body,this.options),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new p(this.body,this.options),this.timeAxis2=null,this.components.push(this.timeAxis),this.currentTime=new f(this.body,this.options),this.components.push(this.currentTime),this.itemSet=new v(this.body,this.options),this.components.push(this.itemSet),this.itemsData=null,this.groupsData=null,this.dom.root.onclick=function(t){r.emit("click",r.getEventProperties(t))},this.dom.root.ondblclick=function(t){r.emit("doubleClick",r.getEventProperties(t))},this.dom.root.oncontextmenu=function(t){r.emit("contextmenu",r.getEventProperties(t))},this.dom.root.onmouseover=function(t){r.emit("mouseOver",r.getEventProperties(t))},window.PointerEvent?(this.dom.root.onpointerdown=function(t){r.emit("mouseDown",r.getEventProperties(t))},this.dom.root.onpointermove=function(t){r.emit("mouseMove",r.getEventProperties(t))},this.dom.root.onpointerup=function(t){r.emit("mouseUp",r.getEventProperties(t))}):(this.dom.root.onmousemove=function(t){r.emit("mouseMove",r.getEventProperties(t))},this.dom.root.onmousedown=function(t){r.emit("mouseDown",r.getEventProperties(t))},this.dom.root.onmouseup=function(t){r.emit("mouseUp",r.getEventProperties(t))}),this.initialFitDone=!1,this.on("changed",function(){if(null!=this.itemsData&&!this.options.rollingMode){if(!r.initialFitDone)if(r.initialFitDone=!0,void 0!=r.options.start||void 0!=r.options.end){if(void 0==r.options.start||void 0==r.options.end)var t=r.getItemRange();var e=void 0!=r.options.start?r.options.start:t.min,i=void 0!=r.options.end?r.options.end:t.max;r.setWindow(e,i,{animation:!1})}else r.fit({animation:!1});!r.initialDrawDone&&r.initialRangeChangeDone&&(r.initialDrawDone=!0,r.dom.root.style.visibility="visible",r.options.onInitialDrawComplete&&setTimeout(function(){return r.options.onInitialDrawComplete()},0))}}),n&&this.setOptions(n),i&&this.setGroups(i),e&&this.setItems(e),this._redraw()}function n(t){return h.convert(t.data.start,"Date").valueOf()}function s(t){var e=void 0!=t.data.end?t.data.end:t.data.start;return h.convert(e,"Date").valueOf()}function r(t,e){var i=t.props.leftContainer.height,o=t.props.left.height,n=e.parent,s=n.top,r=!0,a=t.timeAxis.options.orientation.axis,h=function(){return"bottom"==a?n.height-e.top-e.height:e.top},d=-1*t._getScrollTop(),l=s+h(),u=e.height;return l<d?s+i<=s+h()+u&&(s+=h()-t.itemSet.options.margin.item.vertical):l+u>d+i?s+=h()+u-i+t.itemSet.options.margin.item.vertical:r=!1,s=Math.min(s,o-i),{shouldScroll:r,scrollOffset:s,itemTop:l}}var a=i(9),h=i(2),d=i(11),l=i(12),u=i(64),c=i(65),p=i(45),f=i(67),m=i(46),v=i(99),g=i(15).printStyle,y=i(105).allOptions,b=i(105).configureOptions,_=i(71).default,w=i(15).default;o.prototype=new c,o.prototype._createConfigurator=function(){return new _(this,this.dom.container,b)},o.prototype.redraw=function(){this.itemSet&&this.itemSet.markDirty({refreshItems:!0}),this._redraw()},o.prototype.setOptions=function(t){if(!0===w.validate(t,y)&&console.log("%cErrors have been found in the supplied options object.",g),c.prototype.setOptions.call(this,t),"type"in t&&t.type!==this.options.type){this.options.type=t.type;var e=this.itemsData;if(e){var i=this.getSelection();this.setItems(null),this.setItems(e),this.setSelection(i)}}},o.prototype.setItems=function(t){var e;e=t?t instanceof d||t instanceof l?t:new d(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e)},o.prototype.setGroups=function(t){var e;if(t){var i=function(t){return!1!==t.visible};e=t instanceof d||t instanceof l?new l(t,{filter:i}):new d(t.filter(i))}else e=null;this.groupsData=e,this.itemSet.setGroups(e)},o.prototype.setData=function(t){t&&t.groups&&this.setGroups(t.groups),t&&t.items&&this.setItems(t.items)},o.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t,e)},o.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},o.prototype.focus=function(t,e){if(this.itemsData&&void 0!=t){var i=Array.isArray(t)?t:[t],o=this.itemsData.getDataSet().get(i,{type:{start:"Date",end:"Date"}}),n=null,s=null;
19295if(o.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===n||e<n)&&(n=e),(null===s||i>s)&&(s=i)}),null!==n&&null!==s){var a=this,h=this.itemSet.items[i[0]],d=-1*this._getScrollTop(),l=null,u=function(t,e,i){var o=r(a,h);if(l||(l=o),l.itemTop!=o.itemTop||l.shouldScroll){l.itemTop!=o.itemTop&&o.shouldScroll&&(l=o,d=-1*a._getScrollTop());var n=d,s=l.scrollOffset,u=i?s:n+(s-n)*t;a._setScrollTop(-u),e||a._redraw()}},c=function(){var t=r(a,h);t.shouldScroll&&t.itemTop!=l.itemTop&&(a._setScrollTop(-t.scrollOffset),a._redraw())},p=function(){c(),setTimeout(c,100)},f=(n+s)/2,m=Math.max(this.range.end-this.range.start,1.1*(s-n)),v=!e||void 0===e.animation||e.animation;v||(l={shouldScroll:!1,scrollOffset:-1,itemTop:-1}),this.range.setRange(f-m/2,f+m/2,{animation:v},p,u)}}},o.prototype.fit=function(t,e){var i,o=!t||void 0===t.animation||t.animation,n=this.itemsData&&this.itemsData.getDataSet();1===n.length&&void 0===n.get()[0].end?(i=this.getDataRange(),this.moveTo(i.min.valueOf(),{animation:o},e)):(i=this.getItemRange(),this.range.setRange(i.min,i.max,{animation:o},e))},o.prototype.getItemRange=function(){var t=this.getDataRange(),e=null!==t.min?t.min.valueOf():null,i=null!==t.max?t.max.valueOf():null,o=null,r=null;if(null!=e&&null!=i){var a=i-e;a<=0&&(a=10);var d=a/this.props.center.width,l={},u=0;h.forEach(this.itemSet.items,function(t,e){if(t.groupShowing){l[e]=t.redraw(!0),u=l[e].length}});if(u>0)for(var c=0;c<u;c++)h.forEach(l,function(t){t[c]()});if(h.forEach(this.itemSet.items,function(t){var a,h,l=n(t),u=s(t);this.options.rtl?(a=l-(t.getWidthRight()+10)*d,h=u+(t.getWidthLeft()+10)*d):(a=l-(t.getWidthLeft()+10)*d,h=u+(t.getWidthRight()+10)*d),a<e&&(e=a,o=t),h>i&&(i=h,r=t)}.bind(this)),o&&r){var p=o.getWidthLeft()+10,f=r.getWidthRight()+10,m=this.props.center.width-p-f;m>0&&(this.options.rtl?(e=n(o)-f*a/m,i=s(r)+p*a/m):(e=n(o)-p*a/m,i=s(r)+f*a/m))}}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},o.prototype.getDataRange=function(){var t=null,e=null,i=this.itemsData&&this.itemsData.getDataSet();return i&&i.forEach(function(i){var o=h.convert(i.start,"Date").valueOf(),n=h.convert(void 0!=i.end?i.end:i.start,"Date").valueOf();(null===t||o<t)&&(t=o),(null===e||n>e)&&(e=n)}),{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},o.prototype.getEventProperties=function(t){var e,i=t.center?t.center.x:t.clientX,o=t.center?t.center.y:t.clientY;e=this.options.rtl?h.getAbsoluteRight(this.dom.centerContainer)-i:i-h.getAbsoluteLeft(this.dom.centerContainer);var n=o-h.getAbsoluteTop(this.dom.centerContainer),s=this.itemSet.itemFromTarget(t),r=this.itemSet.groupFromTarget(t),a=m.customTimeFromTarget(t),d=this.itemSet.options.snap||null,l=this.body.util.getScale(),u=this.body.util.getStep(),c=this._toTime(e),p=d?d(c,l,u):c,f=h.getTarget(t),v=null;return null!=s?v="item":null!=a?v="custom-time":h.hasParent(f,this.timeAxis.dom.foreground)?v="axis":this.timeAxis2&&h.hasParent(f,this.timeAxis2.dom.foreground)?v="axis":h.hasParent(f,this.itemSet.dom.labelSet)?v="group-label":h.hasParent(f,this.currentTime.bar)?v="current-time":h.hasParent(f,this.dom.center)&&(v="background"),{event:t,item:s?s.id:null,group:r?r.groupId:null,what:v,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:e,y:n,time:c,snappedTime:p}},o.prototype.toggleRollingMode=function(){this.range.rolling?this.range.stopRolling():(void 0==this.options.rollingMode&&this.setOptions(this.options),this.range.startRolling())},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(10),u=i(37),c=i(2),p=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;(0,a.default)(this,t),this.pixelRatio=e,this.generated=!1,this.centerCoordinates={x:144.5,y:144.5},this.r=289*.49,this.color={r:255,g:255,b:255,a:1},this.hueCircle=void 0,this.initialColor={r:255,g:255,b:255,a:1},this.previousColor=void 0,this.applied=!1,this.updateCallback=function(){},this.closeCallback=function(){},this._create()}return(0,d.default)(t,[{key:"insertTo",value:function(t){void 0!==this.hammer&&(this.hammer.destroy(),this.hammer=void 0),this.container=t,this.container.appendChild(this.frame),this._bindHammer(),this._setSize()}},{key:"setUpdateCallback",value:function(t){if("function"!=typeof t)throw new Error("Function attempted to set as colorPicker update callback is not a function.");this.updateCallback=t}},{key:"setCloseCallback",value:function(t){if("function"!=typeof t)throw new Error("Function attempted to set as colorPicker closing callback is not a function.");this.closeCallback=t}},{key:"_isColorString",value:function(t){var e={black:"#000000",navy:"#000080",dar
19295kblue:"#00008B",mediumblue:"#0000CD",blue:"#0000FF",darkgreen:"#006400",green:"#008000",teal:"#008080",darkcyan:"#008B8B",deepskyblue:"#00BFFF",darkturquoise:"#00CED1",mediumspringgreen:"#00FA9A",lime:"#00FF00",springgreen:"#00FF7F",aqua:"#00FFFF",cyan:"#00FFFF",midnightblue:"#191970",dodgerblue:"#1E90FF",lightseagreen:"#20B2AA",forestgreen:"#228B22",seagreen:"#2E8B57",darkslategray:"#2F4F4F",limegreen:"#32CD32",mediumseagreen:"#3CB371",turquoise:"#40E0D0",royalblue:"#4169E1",steelblue:"#4682B4",darkslateblue:"#483D8B",mediumturquoise:"#48D1CC",indigo:"#4B0082",darkolivegreen:"#556B2F",cadetblue:"#5F9EA0",cornflowerblue:"#6495ED",mediumaquamarine:"#66CDAA",dimgray:"#696969",slateblue:"#6A5ACD",olivedrab:"#6B8E23",slategray:"#708090",lightslategray:"#778899",mediumslateblue:"#7B68EE",lawngreen:"#7CFC00",chartreuse:"#7FFF00",aquamarine:"#7FFFD4",maroon:"#800000",purple:"#800080",olive:"#808000",gray:"#808080",skyblue:"#87CEEB",lightskyblue:"#87CEFA",blueviolet:"#8A2BE2",darkred:"#8B0000",darkmagenta:"#8B008B",saddlebrown:"#8B4513",darkseagreen:"#8FBC8F",lightgreen:"#90EE90",mediumpurple:"#9370D8",darkviolet:"#9400D3",palegreen:"#98FB98",darkorchid:"#9932CC",yellowgreen:"#9ACD32",sienna:"#A0522D",brown:"#A52A2A",darkgray:"#A9A9A9",lightblue:"#ADD8E6",greenyellow:"#ADFF2F",paleturquoise:"#AFEEEE",lightsteelblue:"#B0C4DE",powderblue:"#B0E0E6",firebrick:"#B22222",darkgoldenrod:"#B8860B",mediumorchid:"#BA55D3",rosybrown:"#BC8F8F",darkkhaki:"#BDB76B",silver:"#C0C0C0",mediumvioletred:"#C71585",indianred:"#CD5C5C",peru:"#CD853F",chocolate:"#D2691E",tan:"#D2B48C",lightgrey:"#D3D3D3",palevioletred:"#D87093",thistle:"#D8BFD8",orchid:"#DA70D6",goldenrod:"#DAA520",crimson:"#DC143C",gainsboro:"#DCDCDC",plum:"#DDA0DD",burlywood:"#DEB887",lightcyan:"#E0FFFF",lavender:"#E6E6FA",darksalmon:"#E9967A",violet:"#EE82EE",palegoldenrod:"#EEE8AA",lightcoral:"#F08080",khaki:"#F0E68C",aliceblue:"#F0F8FF",honeydew:"#F0FFF0",azure:"#F0FFFF",sandybrown:"#F4A460",wheat:"#F5DEB3",beige:"#F5F5DC",whitesmoke:"#F5F5F5",mintcream:"#F5FFFA",ghostwhite:"#F8F8FF",salmon:"#FA8072",antiquewhite:"#FAEBD7",linen:"#FAF0E6",lightgoldenrodyellow:"#FAFAD2",oldlace:"#FDF5E6",red:"#FF0000",fuchsia:"#FF00FF",magenta:"#FF00FF",deeppink:"#FF1493",orangered:"#FF4500",tomato:"#FF6347",hotpink:"#FF69B4",coral:"#FF7F50",darkorange:"#FF8C00",lightsalmon:"#FFA07A",orange:"#FFA500",lightpink:"#FFB6C1",pink:"#FFC0CB",gold:"#FFD700",peachpuff:"#FFDAB9",navajowhite:"#FFDEAD",moccasin:"#FFE4B5",bisque:"#FFE4C4",mistyrose:"#FFE4E1",blanchedalmond:"#FFEBCD",papayawhip:"#FFEFD5",lavenderblush:"#FFF0F5",seashell:"#FFF5EE",cornsilk:"#FFF8DC",lemonchiffon:"#FFFACD",floralwhite:"#FFFAF0",snow:"#FFFAFA",yellow:"#FFFF00",lightyellow:"#FFFFE0",ivory:"#FFFFF0",white:"#FFFFFF"};if("string"==typeof t)return e[t]}},{key:"setColor",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if("none"!==t){var i=void 0,o=this._isColorString(t);if(void 0!==o&&(t=o),!0===c.isString(t)){if(!0===c.isValidRGB(t)){var n=t.substr(4).substr(0,t.length-5).split(",");i={r:n[0],g:n[1],b:n[2],a:1}}else if(!0===c.isValidRGBA(t)){var r=t.substr(5).substr(0,t.length-6).split(",");i={r:r[0],g:r[1],b:r[2],a:r[3]}}else if(!0===c.isValidHex(t)){var a=c.hexToRGB(t);i={r:a.r,g:a.g,b:a.b,a:1}}}else if(t instanceof Object&&void 0!==t.r&&void 0!==t.g&&void 0!==t.b){var h=void 0!==t.a?t.a:"1.0";i={r:t.r,g:t.g,b:t.b,a:h}}if(void 0===i)throw new Error("Unknown color passed to the colorPicker. Supported are strings: rgb, hex, rgba. Object: rgb ({r:r,g:g,b:b,[a:a]}). Supplied: "+(0,s.default)(t));this._setColor(i,e)}}},{key:"show",value:function(){void 0!==this.closeCallback&&(this.closeCallback(),this.closeCallback=void 0),this.applied=!1,this.frame.style.display="block",this._generateHueCircle()}},{key:"_hide",value:function(){var t=this;!0===(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&(this.previousColor=c.extend({},this.color)),!0===this.applied&&this.updateCallback(this.initialColor),this.frame.style.display="none",setTimeout(function(){void 0!==t.closeCallback&&(t.closeCallback(),t.closeCallback=void 0)}
19295,0)}},{key:"_save",value:function(){this.updateCallback(this.color),this.applied=!1,this._hide()}},{key:"_apply",value:function(){this.applied=!0,this.updateCallback(this.color),this._updatePicker(this.color)}},{key:"_loadLast",value:function(){void 0!==this.previousColor?this.setColor(this.previousColor,!1):alert("There is no last color to load...")}},{key:"_setColor",value:function(t){!0===(!(arguments.length>1&&void 0!==arguments[1])||arguments[1])&&(this.initialColor=c.extend({},t)),this.color=t;var e=c.RGBToHSV(t.r,t.g,t.b),i=2*Math.PI,o=this.r*e.s,n=this.centerCoordinates.x+o*Math.sin(i*e.h),s=this.centerCoordinates.y+o*Math.cos(i*e.h);this.colorPickerSelector.style.left=n-.5*this.colorPickerSelector.clientWidth+"px",this.colorPickerSelector.style.top=s-.5*this.colorPickerSelector.clientHeight+"px",this._updatePicker(t)}},{key:"_setOpacity",value:function(t){this.color.a=t/100,this._updatePicker(this.color)}},{key:"_setBrightness",value:function(t){var e=c.RGBToHSV(this.color.r,this.color.g,this.color.b);e.v=t/100;var i=c.HSVToRGB(e.h,e.s,e.v);i.a=this.color.a,this.color=i,this._updatePicker()}},{key:"_updatePicker",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.color,e=c.RGBToHSV(t.r,t.g,t.b),i=this.colorPickerCanvas.getContext("2d");void 0===this.pixelRation&&(this.pixelRatio=(window.devicePixelRatio||1)/(i.webkitBackingStorePixelRatio||i.mozBackingStorePixelRatio||i.msBackingStorePixelRatio||i.oBackingStorePixelRatio||i.backingStorePixelRatio||1)),i.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var o=this.colorPickerCanvas.clientWidth,n=this.colorPickerCanvas.clientHeight;i.clearRect(0,0,o,n),i.putImageData(this.hueCircle,0,0),i.fillStyle="rgba(0,0,0,"+(1-e.v)+")",i.circle(this.centerCoordinates.x,this.centerCoordinates.y,this.r),i.fill(),this.brightnessRange.value=100*e.v,this.opacityRange.value=100*t.a,this.initialColorDiv.style.backgroundColor="rgba("+this.initialColor.r+","+this.initialColor.g+","+this.initialColor.b+","+this.initialColor.a+")",this.newColorDiv.style.backgroundColor="rgba("+this.color.r+","+this.color.g+","+this.color.b+","+this.color.a+")"}},{key:"_setSize",value:function(){this.colorPickerCanvas.style.width="100%",this.colorPickerCanvas.style.height="100%",this.colorPickerCanvas.width=289*this.pixelRatio,this.colorPickerCanvas.height=289*this.pixelRatio}},{key:"_create",value:function(){if(this.frame=document.createElement("div"),this.frame.className="vis-color-picker",this.colorPickerDiv=document.createElement("div"),this.colorPickerSelector=document.createElement("div"),this.colorPickerSelector.className="vis-selector",this.colorPickerDiv.appendChild(this.colorPickerSelector),this.colorPickerCanvas=document.createElement("canvas"),this.colorPickerDiv.appendChild(this.colorPickerCanvas),this.colorPickerCanvas.getContext){var t=this.colorPickerCanvas.getContext("2d")
19296    ;this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1),this.colorPickerCanvas.getContext("2d").setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}else{var e=document.createElement("DIV");e.style.color="red",e.style.fontWeight="bold",e.style.padding="10px",e.innerHTML="Error: your browser does not support HTML canvas",this.colorPickerCanvas.appendChild(e)}this.colorPickerDiv.className="vis-color",this.opacityDiv=document.createElement("div"),this.opacityDiv.className="vis-opacity",this.brightnessDiv=document.createElement("div"),this.brightnessDiv.className="vis-brightness",this.arrowDiv=document.createElement("div"),this.arrowDiv.className="vis-arrow",this.opacityRange=document.createElement("input");try{this.opacityRange.type="range",this.opacityRange.min="0",this.opacityRange.max="100"}catch(t){}this.opacityRange.value="100",this.opacityRange.className="vis-range",this.brightnessRange=document.createElement("input");try{this.brightnessRange.type="range",this.brightnessRange.min="0",this.brightnessRange.max="100"}catch(t){}this.brightnessRange.value="100",this.brightnessRange.className="vis-range",this.opacityDiv.appendChild(this.opacityRange),this.brightnessDiv.appendChild(this.brightnessRange);var i=this;this.opacityRange.onchange=function(){i._setOpacity(this.value)},this.opacityRange.oninput=function(){i._setOpacity(this.value)},this.brightnessRange.onchange=function(){i._setBrightness(this.value)},this.brightnessRange.oninput=function(){i._setBrightness(this.value)},this.brightnessLabel=document.createElement("div"),this.brightnessLabel.className="vis-label vis-brightness",this.brightnessLabel.
19296innerHTML="brightness:",this.opacityLabel=document.createElement("div"),this.opacityLabel.className="vis-label vis-opacity",this.opacityLabel.innerHTML="opacity:",this.newColorDiv=document.createElement("div"),this.newColorDiv.className="vis-new-color",this.newColorDiv.innerHTML="new",this.initialColorDiv=document.createElement("div"),this.initialColorDiv.className="vis-initial-color",this.initialColorDiv.innerHTML="initial",this.cancelButton=document.createElement("div"),this.cancelButton.className="vis-button vis-cancel",this.cancelButton.innerHTML="cancel",this.cancelButton.onclick=this._hide.bind(this,!1),this.applyButton=document.createElement("div"),this.applyButton.className="vis-button vis-apply",this.applyButton.innerHTML="apply",this.applyButton.onclick=this._apply.bind(this),this.saveButton=document.createElement("div"),this.saveButton.className="vis-button vis-save",this.saveButton.innerHTML="save",this.saveButton.onclick=this._save.bind(this),this.loadButton=document.createElement("div"),this.loadButton.className="vis-button vis-load",this.loadButton.innerHTML="load last",this.loadButton.onclick=this._loadLast.bind(this),this.frame.appendChild(this.colorPickerDiv),this.frame.appendChild(this.arrowDiv),this.frame.appendChild(this.brightnessLabel),this.frame.appendChild(this.brightnessDiv),this.frame.appendChild(this.opacityLabel),this.frame.appendChild(this.opacityDiv),this.frame.appendChild(this.newColorDiv),this.frame.appendChild(this.initialColorDiv),this.frame.appendChild(this.cancelButton),this.frame.appendChild(this.applyButton),this.frame.appendChild(this.saveButton),this.frame.appendChild(this.loadButton)}},{key:"_bindHammer",value:function(){var t=this;this.drag={},this.pinch={},this.hammer=new l(this.colorPickerCanvas),this.hammer.get("pinch").set({enable:!0}),u.onTouch(this.hammer,function(e){t._moveSelector(e)}),this.hammer.on("tap",function(e){t._moveSelector(e)}),this.hammer.on("panstart",function(e){t._moveSelector(e)}),this.hammer.on("panmove",function(e){t._moveSelector(e)}),this.hammer.on("panend",function(e){t._moveSelector(e)})}},{key:"_generateHueCircle",value:function(){if(!1===this.generated){var t=this.colorPickerCanvas.getContext("2d");void 0===this.pixelRation&&(this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)),t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var e=this.colorPickerCanvas.clientWidth,i=this.colorPickerCanvas.clientHeight;t.clearRect(0,0,e,i);var o=void 0,n=void 0,s=void 0,r=void 0;this.centerCoordinates={x:.5*e,y:.5*i},this.r=.49*e;var a=2*Math.PI/360,h=1/this.r,d=void 0;for(s=0;s<360;s++)for(r=0;r<this.r;r++)o=this.centerCoordinates.x+r*Math.sin(a*s),n=this.centerCoordinates.y+r*Math.cos(a*s),d=c.HSVToRGB(s*(1/360),r*h,1),t.fillStyle="rgb("+d.r+","+d.g+","+d.b+")",t.fillRect(o-.5,n-.5,2,2);t.strokeStyle="rgba(0,0,0,1)",t.circle(this.centerCoordinates.x,this.centerCoordinates.y,this.r),t.stroke(),this.hueCircle=t.getImageData(0,0,e,i)}this.generated=!0}},{key:"_moveSelector",value:function(t){var e=this.colorPickerDiv.getBoundingClientRect(),i=t.center.x-e.left,o=t.center.y-e.top,n=.5*this.colorPickerDiv.clientHeight,s=.5*this.colorPickerDiv.clientWidth,r=i-s,a=o-n,h=Math.atan2(r,a),d=.98*Math.min(Math.sqrt(r*r+a*a),s),l=Math.cos(h)*d+n,u=Math.sin(h)*d+s;this.colorPickerSelector.style.top=l-.5*this.colorPickerSelector.clientHeight+"px",this.colorPickerSelector.style.left=u-.5*this.colorPickerSelector.clientWidth+"px";var p=h/(2*Math.PI);p=p<0?p+1:p;var f=d/this.r,m=c.RGBToHSV(this.color.r,this.color.g,this.color.b);m.h=p,m.s=f;var v=c.HSVToRGB(m.h,m.s,m.v);v.a=this.color.a,this.color=v,this.initialColorDiv.style.backgroundColor="rgba("+this.initialColor.r+","+this.initialColor.g+","+this.initialColor.b+","+this.initialColor.a+")",this.newColorDiv.style.backgroundColor="rgba("+this.color.r+","+this.color.g+","+this.color.b+","+this.color.a+")"}}]),t}();e.default=p},function(t,e,i){function o(t,e,i,o){if(!(Array.isArray(i)||i instanceof r||i instanceof a)&&i instanceof Object){var d=o;o=i,i=d}o&&o.throttleRedraw&&console.warn('Graph2d option "throttleRedraw" is DEPRICATED and no longer supported. It will be removed in the next MAJOR release.');var c=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:{axis:"bottom",item:"bottom"},moment:n,width:null,height:null,maxHeight:null,minHeight:null},this.options=s.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},hiddenDates:[],util:{toScreen:c._toScreen.bind(c),toGlobalScreen:c._toGlobalScreen.bind(c),toTime:c._toTime.bind(c),toGlobalTime:c._toGlobalTime.bind(c)}},this.range=new h(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new l(this.body),this.components.push(this.timeAxis),this.currentTime=new u(this.body),this.components.push(this.currentTime),this.linegraph=new p(this.body),this.components.push(this.linegraph),this.itemsData=null,this.groupsData=null,this.on("tap",function(t){c.emit("click",c.getEventProperties(t))}),this.on("doubletap",function(t){c.emit("doubleClick",c.getEventProperties(t))}),this.dom.root.oncontextmenu=function(t){c.emit("contextmenu",c.getEventProperties(t))},o&&this.setOptions(o),i&&this.setGroups(i),e&&this.setItems(e),this._redraw()}var n=i(9),s=i(2),r=i(11),a=i(12),h=i(64),d=i(65),l=i(45),u=i(67),c=i(46),p=i(106),f=i(15).printStyle,m=i(113).allOptions,v=i(113).configureOptions,g=i(71).default,y=i(15).default;o.prototype=new d,o.prototype.setOptions=function(t){!0===y.validate(t,m)&&console.log("%cErrors have been found in the supplied options object.",f),d.prototype.setOptions.call(this,t)},o.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof r||t instanceof a?t:new r(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.linegraph&&this.linegraph.setItems(e),i)if(void 0!=this.options.start||void 0!=this.options.end){var o=void 0!=this.options.start?this.options.start:null,n=void 0!=this.options.end?this.options.end:null;this.setWindow(o,n,{animation:!1})}else this.fit({animation:!1})},o.prototype.setGroups=function(t){var e;e=t?t instanceof r||t instanceof a?t:new r(t):null,this.groupsData=e,this.linegraph.setGroups(e)}
19296,o.prototype.getLegend=function(t,e,i){return void 0===e&&(e=15),void 0===i&&(i=15),void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].getLegend(e,i):"cannot find group:'"+t+"'"},o.prototype.isGroupVisible=function(t){return void 0!==this.linegraph.groups[t]&&(this.linegraph.groups[t].visible&&(void 0===this.linegraph.options.groups.visibility[t]||1==this.linegraph.options.groups.visibility[t]))},o.prototype.getDataRange=function(){var t=null,e=null;for(var i in this.linegraph.groups)if(this.linegraph.groups.hasOwnProperty(i)&&1==this.linegraph.groups[i].visible)for(var o=0;o<this.linegraph.groups[i].itemsData.length;o++){var n=this.linegraph.groups[i].itemsData[o],r=s.convert(n.x,"Date").valueOf();t=null==t?r:t>r?r:t,e=null==e?r:e<r?r:e}return{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},o.prototype.getEventProperties=function(t){var e=t.center?t.center.x:t.clientX,i=t.center?t.center.y:t.clientY,o=e-s.getAbsoluteLeft(this.dom.centerContainer),n=i-s.getAbsoluteTop(this.dom.centerContainer),r=this._toTime(o),a=c.customTimeFromTarget(t),h=s.getTarget(t),d=null;s.hasParent(h,this.timeAxis.dom.foreground)?d="axis":this.timeAxis2&&s.hasParent(h,this.timeAxis2.dom.foreground)?d="axis":s.hasParent(h,this.linegraph.yAxisLeft.dom.frame)?d="data-axis":s.hasParent(h,this.linegraph.yAxisRight.dom.frame)?d="data-axis":s.hasParent(h,this.linegraph.legendLeft.dom.frame)?d="legend":s.hasParent(h,this.linegraph.legendRight.dom.frame)?d="legend":null!=a?d="custom-time":s.hasParent(h,this.currentTime.bar)?d="current-time":s.hasParent(h,this.dom.center)&&(d="background");var l=[],u=this.linegraph.yAxisLeft,p=this.linegraph.yAxisRight;return!u.hidden&&this.itemsData.length>0&&l.push(u.screenToValue(n)),!p.hidden&&this.itemsData.length>0&&l.push(p.screenToValue(n)),{event:t,what:d,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:o,y:n,time:r,value:l}},o.prototype._createConfigurator=function(){return new g(this,this.dom.container,v)},t.exports=o},function(t,e,i){e.util=i(2),e.DOMutil=i(14),e.DataSet=i(11),e.DataView=i(12),e.Queue=i(43),e.Network=i(182),e.network={Images:i(116),dotparser:i(114),gephiParser:i(115),allOptions:i(122)},e.network.convertDot=function(t){return e.network.dotparser.DOTToGraph(t)},e.network.convertGephi=function(t,i){return e.network.gephiParser.parseGephi(t,i)},e.moment=i(9),e.Hammer=i(10),e.keycharm=i(35)},function(t,e,i){function o(t,e,i){var n=this;if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");this.options={},this.defaultOptions={locale:"en",locales:d,clickToUse:!1},s.extend(this.options,this.defaultOptions),this.body={container:t,nodes:{},nodeIndices:[],edges:{},edgeIndices:[],emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this),once:this.once.bind(this)},eventListeners:{onTap:function(){},onTouch:function(){},onDoubleTap:function(){},onHold:function(){},onDragStart:function(){},onDrag:function(){},onDragEnd:function(){},onMouseWheel:function(){},onPinch:function(){},onMouseMove:function(){},onRelease:function(){},onContext:function(){}},data:{nodes:null,edges:null},functions:{createNode:function(){},createEdge:function(){},getPointer:function(){}},modules:{},view:{scale:1,translation:{x:0,y:0}}},this.bindEventListeners(),this.images=new l(function(){return n.body.emitter.emit("_requestRedraw")}),this.groups=new u,this.canvas=new g(this.body),this.selectionHandler=new _(this.body,this.canvas),this.interactionHandler=new b(this.body,this.canvas,this.selectionHandler),this.view=new y(this.body,this.canvas),this.renderer=new v(this.body,this.canvas),this.physics=new f(this.body),this.layoutEngine=new w(this.body),this.clustering=new m(this.body),this.manipulation=new x(this.body,this.canvas,this.selectionHandler),this.nodesHandler=new c(this.body,this.images,this.groups,this.layoutEngine),this.edgesHandler=new p(this.body,this.images,this.groups),this.body.modules.kamadaKawai=new T(this.body,150,.05),this.body.modules.clustering=this.clustering,this.canvas._create(),this.setOptions(i),this.setData(e)}i(183);var n=i(44),s=i(2),r=i(114),a=i(115),h=i(97),d=i(184),l=i(116).default,u=i(186).default,c=i(187).default,p=i(214).default,f=i(220).default,m=i(227).default,v=i(229).default,g=i(230).default,y=i(231).default,b=i(232).default,_=i(234).default,w=i(235).default,x=i(237).default,k=i(71).default,S=i(15).default,D=i(15),M=D.printStyle,C=i(122),O=C.allOptions,E=C.configureOptions,T=i(238).default;n(o.prototype),o.prototype.setOptions=function(t){var e=this;if(void 0!==t){!0===S.validate(t,O)&&console.log("%cErrors have been found in the supplied options object.",M);var i=["locale","locales","clickToUse"];if(s.selectiveDeepExtend(i,this.options,t),t=this.layoutEngine.setOptions(t.layout,t),this.canvas.setOptions(t),this.groups.setOptions(t.groups),this.nodesHandler.setOptions(t.nodes),this.edgesHandler.setOptions(t.edges),this.physics.setOptions(t.physics),this.manipulation.setOptions(t.manipulation,t,this.options),this.interactionHandler.setOptions(t.interaction),this.renderer.setOptions(t.interaction),this.selectionHandler.setOptions(t.interaction),void 0!==t.groups&&this.body.emitter.emit("refreshNodes"),"configure"in t&&(this.configurator||(this.configurator=new k(this,this.body.container,E,this.canvas.pixelRatio)),this.configurator.setOptions(t.configure)),this.configurator&&!0===this.configurator.options.enabled){var o={nodes:{},edges:{},layout:{},interaction:{},manipulation:{},physics:{},global:{}};s.deepExtend(o.nodes,this.nodesHandler.options),s.deepExtend(o.edges,this.edgesHandler.options),s.deepExtend(o.layout,this.layoutEngine.options),s.deepExtend(o.interaction,this.selectionHandler.options),s.deepExtend(o.interaction,this.renderer.options),s.deepExtend(o.interaction,this.interactionHandler.options),s.deepExtend(o.manipulation,this.manipulation.options),s.deepExtend(o.physics,this.physics.options),s.deepExtend(o.global,this.canvas.options),s.deepExtend(o.global,this.options),this.configurator.setModuleOptions(o)}void 0!==t.clickToUse?!0===t.clickToUse?void 0===this.activator&&(this.activator=new h(this.canvas.frame),this.activator.on("change",function(){e.body.emitter.emit("activate")})):(void 0!==this.activator&&(this.activator.destroy(),delete this.activator),this.body.emitter.emit("activate")):this.body.emitter.emit("activate"),this.canvas.setSize(),this.body.emitter.emit("startSimulation")}},o.prototype._updateVisibleIndices=function(){var t=this.body.nodes,e=this.body.edges;this.body.nodeIndices=[],this.body.edgeIndices=[];for(var i in t)t.hasOwnProperty(i)&&(this.clustering._isClusteredNode(i)||!1!==t[i].options.hidden||this.body.nodeIndices.push(t[i].id));for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],s=t[n.fromId],r=t[n.toId],a=void 0!==s&&void 0!==r,h=!this.clustering._isClusteredEdge(o)&&!1===n.options.hidden&&a&&!1===s.options.hidden&&!1===r.options.hidden;h&&this.body.edgeIndices.push(n.id)}},o.prototype.bindEventListeners=function(){var t=this;this.body.emitter.on("_dataChanged",function(){t.edgesHandler._updateState(),t.body.emitter.emit("_dataUpdated")}),this.body.emitter.on("_dataUpdated",function(){t.clustering._updateState(),t._updateVisibleIndices(),t._updateV
19296alueRange(t.body.nodes),t._updateValueRange(t.body.edges),t.body.emitter.emit("startSimulation"),t.body.emitter.emit("_requestRedraw")})},o.prototype.setData=function(t){if(this.body.emitter.emit("resetPhysics"),this.body.emitter.emit("_resetData"),this.selectionHandler.unselectAll(),t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or  parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){console.log("The dot property has been deprecated. Please use the static convertDot method to convert DOT into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertDot(dotString);");var e=r.DOTToGraph(t.dot);return void this.setData(e)}if(t&&t.gephi){console.log("The gephi property has been deprecated. Please use the static convertGephi method to convert gephi into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertGephi(gephiJson);");var i=a.parseGephi(t.gephi);return void this.setData(i)}this.nodesHandler.setData(t&&t.nodes,!0),this.edgesHandler.setData(t&&t.edges,!0),this.body.emitter.emit("_dataChanged"),this.body.emitter.emit("_dataLoaded"),this.body.emitter.emit("initPhysics")},o.prototype.destroy=function(){this.body.emitter.emit("destroy"),this.body.emitter.off(),this.off(),delete this.groups,delete this.canvas,delete this.selectionHandler,delete this.interactionHandler,delete this.view,delete this.renderer,delete this.physics,delete this.layoutEngine,delete this.clustering,delete this.manipulation,delete this.nodesHandler,delete this.edgesHandler,delete this.configurator,delete this.images;for(var t in this.body.nodes)this.body.nodes.hasOwnProperty(t)&&delete this.body.nodes[t];for(var e in this.body.edges)this.body.edges.hasOwnProperty(e)&&delete this.body.edges[e];s.recursiveDOMDelete(this.body.container)},o.prototype._updateValueRange=function(t){var e,i=void 0,o=void 0,n=0;for(e in t)if(t.hasOwnProperty(e)){var s=t[e].getValue();void 0!==s&&(i=void 0===i?s:Math.min(s,i),o=void 0===o?s:Math.max(s,o),n+=s)}if(void 0!==i&&void 0!==o)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,o,n)},o.prototype.isActive=function(){return!this.activator||this.activator.active},o.prototype.setSize=function(){return this.canvas.setSize.apply(this.canvas,arguments)},o.prototype.canvasToDOM=function(){return this.canvas.canvasToDOM.apply(this.canvas,arguments)},o.prototype.DOMtoCanvas=function(){return this.canvas.DOMtoCanvas.apply(this.canvas,arguments)},o.prototype.findNode=function(){return this.clustering.findNode.apply(this.clustering,arguments)},o.prototype.isCluster=function(){return this.clustering.isCluster.apply(this.clustering,arguments)},o.prototype.openCluster=function(){return this.clustering.openCluster.apply(this.clustering,arguments)}
19296,o.prototype.cluster=function(){return this.clustering.cluster.apply(this.clustering,arguments)},o.prototype.getNodesInCluster=function(){return this.clustering.getNodesInCluster.apply(this.clustering,arguments)},o.prototype.clusterByConnection=function(){return this.clustering.clusterByConnection.apply(this.clustering,arguments)},o.prototype.clusterByHubsize=function(){return this.clustering.clusterByHubsize.apply(this.clustering,arguments)},o.prototype.clusterOutliers=function(){return this.clustering.clusterOutliers.apply(this.clustering,arguments)},o.prototype.getSeed=function(){return this.layoutEngine.getSeed.apply(this.layoutEngine,arguments)},o.prototype.enableEditMode=function(){return this.manipulation.enableEditMode.apply(this.manipulation,arguments)},o.prototype.disableEditMode=function(){return this.manipulation.disableEditMode.apply(this.manipulation,arguments)},o.prototype.addNodeMode=function(){return this.manipulation.addNodeMode.apply(this.manipulation,arguments)},o.prototype.editNode=function(){return this.manipulation.editNode.apply(this.manipulation,arguments)},o.prototype.editNodeMode=function(){return console.log("Deprecated: Please use editNode instead of editNodeMode."),this.manipulation.editNode.apply(this.manipulation,arguments)},o.prototype.addEdgeMode=function(){return this.manipulation.addEdgeMode.apply(this.manipulation,arguments)},o.prototype.editEdgeMode=function(){return this.manipulation.editEdgeMode.apply(this.manipulation,arguments)},o.prototype.deleteSelected=function(){return this.manipulation.deleteSelected.apply(this.manipulation,arguments)},o.prototype.getPositions=function(){return this.nodesHandler.getPositions.apply(this.nodesHandler,arguments)},o.prototype.storePositions=function(){return this.nodesHandler.storePositions.apply(this.nodesHandler,arguments)},o.prototype.moveNode=function(){return this.nodesHandler.moveNode.apply(this.nodesHandler,arguments)},o.prototype.getBoundingBox=function(){return this.nodesHandler.getBoundingBox.apply(this.nodesHandler,arguments)},o.prototype.getConnectedNodes=function(t){return void 0!==this.body.nodes[t]?this.nodesHandler.getConnectedNodes.apply(this.nodesHandler,arguments):this.edgesHandler.getConnectedNodes.apply(this.edgesHandler,arguments)},o.prototype.getConnectedEdges=function(){return this.nodesHandler.getConnectedEdges.apply(this.nodesHandler,arguments)},o.prototype.startSimulation=function(){return this.physics.startSimulation.apply(this.physics,arguments)},o.prototype.stopSimulation=function(){return this.physics.stopSimulation.apply(this.physics,arguments)},o.prototype.stabilize=function(){return this.physics.stabilize.apply(this.physics,arguments)},o.prototype.getSelection=function(){return this.selectionHandler.getSelection.apply(this.selectionHandler,arguments)},o.prototype.setSelection=function(){return this.selectionHandler.setSelection.apply(this.selectionHandler,arguments)},o.prototype.getSelectedNodes=function(){return this.selectionHandler.getSelectedNodes.apply(this.selectionHandler,arguments)},o.prototype.getSelectedEdges=function(){return this.selectionHandler.getSelectedEdges.apply(this.selectionHandler,arguments)},o.prototype.getNodeAt=function(){var t=this.selectionHandler.getNodeAt.apply(this.selectionHandler,arguments);return void 0!==t&&void 0!==t.id?t.id:t},o.prototype.getEdgeAt=function(){var t=this.selectionHandler.getEdgeAt.apply(this.selectionHandler,arguments);return void 0!==t&&void 0!==t.id?t.id:t},o.prototype.selectNodes=function(){return this.selectionHandler.selectNodes.apply(this.selectionHandler,arguments)},o.prototype.selectEdges=function(){return this.selectionHandler.selectEdges.apply(this.selectionHandler,arguments)},o.prototype.unselectAll=function(){this.selectionHandler.unselectAll.apply(this.selectionHandler,arguments),this.redraw()},o.prototype.redraw=function(){return this.renderer.redraw.apply(this.renderer,arguments)},o.prototype.getScale=function(){return this.view.getScale.apply(this.view,arguments)},o.prototype.getViewPosition=function(){return this.view.getViewPosition.apply(this.view,arguments)},o.prototype.fit=function(){return this.view.fit.apply(this.view,arguments)},o.prototype.moveTo=function(){return this.view.moveTo.apply(this.view,arguments)}
19296,o.prototype.focus=function(){return this.view.focus.apply(this.view,arguments)},o.prototype.releaseNode=function(){return this.view.releaseNode.apply(this.view,arguments)},o.prototype.getOptionsFromConfigurator=function(){var t={};return this.configurator&&(t=this.configurator.getOptions.apply(this.configurator)),t},t.exports=o},function(t,e,i){"undefined"!=typeof CanvasRenderingContext2D&&(CanvasRenderingContext2D.prototype.circle=function(t,e,i){this.beginPath(),this.arc(t,e,i,0,2*Math.PI,!1),this.closePath()},CanvasRenderingContext2D.prototype.square=function(t,e,i){this.beginPath(),this.rect(t-i,e-i,2*i,2*i),this.closePath()},CanvasRenderingContext2D.prototype.triangle=function(t,e,i){this.beginPath(),i*=1.15,e+=.275*i;var o=2*i,n=o/2,s=Math.sqrt(3)/6*o,r=Math.sqrt(o*o-n*n);this.moveTo(t,e-(r-s)),this.lineTo(t+n,e+s),this.lineTo(t-n,e+s),this.lineTo(t,e-(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.triangleDown=function(t,e,i){this.beginPath(),i*=1.15,e-=.275*i;var o=2*i,n=o/2,s=Math.sqrt(3)/6*o,r=Math.sqrt(o*o-n*n);this.moveTo(t,e+(r-s)),this.lineTo(t+n,e-s),this.lineTo(t-n,e-s),this.lineTo(t,e+(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.star=function(t,e,i){this.beginPath(),i*=.82,e+=.1*i;for(var o=0;o<10;o++){var n=o%2==0?1.3*i:.5*i;this.lineTo(t+n*Math.sin(2*o*Math.PI/10),e-n*Math.cos(2*o*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.diamond=function(t,e,i){this.beginPath(),this.lineTo(t,e+i),this.lineTo(t+i,e),this.lineTo(t,e-i),this.lineTo(t-i,e),this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,o,n){var s=Math.PI/180;i-2*n<0&&(n=i/2),o-2*n<0&&(n=o/2),this.beginPath(),this.moveTo(t+n,e),this.lineTo(t+i-n,e),this.arc(t+i-n,e+n,n,270*s,360*s,!1),this.lineTo(t+i,e+o-n),this.arc(t+i-n,e+o-n,n,0,90*s,!1),this.lineTo(t+n,e+o),this.arc(t+n,e+o-n,n,90*s,180*s,!1),this.lineTo(t,e+n),this.arc(t+n,e+n,n,180*s,270*s,!1),this.closePath()},CanvasRenderingContext2D.prototype.ellipse_vis=function(t,e,i,o){var n=i/2*.5522848,s=o/2*.5522848,r=t+i,a=e+o,h=t+i/2,d=e+o/2;this.beginPath(),this.moveTo(t,d),this.bezierCurveTo(t,d-s,h-n,e,h,e),this.bezierCurveTo(h+n,e,r,d-s,r,d),this.bezierCurveTo(r,d+s,h+n,a,h,a),this.bezierCurveTo(h-n,a,t,d+s,t,d),this.closePath()},CanvasRenderingContext2D.prototype.database=function(t,e,i,o){var n=i,s=o*(1/3),r=n/2*.5522848,a=s/2*.5522848,h=t+n,d=e+s,l=t+n/2,u=e+s/2,c=e+(o-s/2),p=e+o;this.beginPath(),this.moveTo(h,u),this.bezierCurveTo(h,u+a,l+r,d,l,d),this.bezierCurveTo(l-r,d,t,u+a,t,u),this.bezierCurveTo(t,u-a,l-r,e,l,e),this.bezierCurveTo(l+r,e,h,u-a,h,u),this.lineTo(h,c),this.bezierCurveTo(h,c+a,l+r,p,l,p),this.bezierCurveTo(l-r,p,t,c+a,t,c),this.lineTo(t,u)},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,o,n){this.beginPath(),this.moveTo(t,e);for(var s=n.length,r=i-t,a=o-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,u=!0,c=0,p=n[0];d>=.1;)p=n[l++%s],p>d&&(p=d),c=Math.sqrt(p*p/(1+h*h)),c=r<0?-c:c,t+=c,e+=h*c,!0===u?this.lineTo(t,e):this.moveTo(t,e),d-=p,u=!u},CanvasRenderingContext2D.prototype.hexagon=function(t,e,i){this.beginPath();var o=2*Math.PI/6;this.moveTo(t+i,e);for(var n=1;n<6;n++)this.lineTo(t+i*Math.cos(o*n),e+i*Math.sin(o*n));this.closePath()})},function(t,e,i){e.en={edit:"Edit",del:"Delete selected",back:"Back",addNode:"Add Node",addEdge:"Add Edge",editNode:"Edit Node",editEdge:"Edit Edge",addDescription:"Click in an empty space to place a new node.",edgeDescription:"Click on a node and drag the edge to another node to connect them.",editEdgeDescription:"Click on the control points and drag them to a node to connect to it.",createEdgeError:"Cannot link edges to a cluster.",deleteClusterError:"Clusters cannot be deleted.",editClusterError:"Clusters cannot be edited."},e.en_EN=e.en,e.en_US=e.en,e.de={edit:"Editieren",del:"Lösche Auswahl",back:"Zurück",addNode:"Knoten hinzufügen",addEdge:"Kante hinzufügen",editNode:"Knoten editieren",editEdge:"Kante editieren",addDescription:"Klicke auf eine freie Stelle, um einen neuen Knoten zu plazieren.",edgeDescription:"Klicke auf einen Knoten und ziehe die Kante zu einem anderen Knoten, um diese zu verbinden.",editEdgeDescription:"Klicke auf die Verbindungspunkte und ziehe diese auf einen Knoten, um sie zu verbinden.",createEdgeError:"Es ist nicht möglich, Kanten mit Clustern zu verbinden.",deleteClusterError:"Cluster können nicht gelÃ
19296¶scht werden.",editClusterError:"Cluster können nicht editiert werden."},e.de_DE=e.de,e.es={edit:"Editar",del:"Eliminar selección",back:"Átras",addNode:"Añadir nodo",addEdge:"Añadir arista",editNode:"Editar nodo",editEdge:"Editar arista",addDescription:"Haga clic en un lugar vacío para colocar un nuevo nodo.",edgeDescription:"Haga clic en un nodo y arrastre la arista hacia otro nodo para conectarlos.",editEdgeDescription:"Haga clic en un punto de control y arrastrelo a un nodo para conectarlo.",createEdgeError:"No se puede conectar una arista a un grupo.",deleteClusterError:"No es posible eliminar grupos.",editClusterError:"No es posible editar grupos."},e.es_ES=e.es,e.it={edit:"Modifica",del:"Cancella la selezione",back:"Indietro",addNode:"Aggiungi un nodo",addEdge:"Aggiungi un vertice",editNode:"Modifica il nodo",editEdge:"Modifica il vertice",addDescription:"Clicca per aggiungere un nuovo nodo",edgeDescription:"Clicca su un nodo e trascinalo ad un altro nodo per connetterli.",editEdgeDescription:"Clicca sui Punti di controllo e trascinali ad un nodo per connetterli.",createEdgeError:"Non si possono collegare vertici ad un cluster",deleteClusterError:"I cluster non possono essere cancellati",editClusterError:"I clusters non possono essere modificati."},e.it_IT=e.it,e.nl={edit:"Wijzigen",del:"Selectie verwijderen",back:"Terug",addNode:"Node toevoegen",addEdge:"Link toevoegen",editNode:"Node wijzigen",editEdge:"Link wijzigen",addDescription:"Klik op een leeg gebied om een nieuwe node te maken.",edgeDescription:"Klik op een node en sleep de link naar een andere node om ze te verbinden.",editEdgeDescription:"Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.",createEdgeError:"Kan geen link maken naar een cluster.",deleteClusterError:"Clusters kunnen niet worden verwijderd.",editClusterError:"Clusters kunnen niet worden aangepast."},e.nl_NL=e.nl,e.nl_BE=e.nl,e["pt-br"]={edit:"Editar",del:"Remover selecionado",back:"Voltar",addNode:"Adicionar nó",addEdge:"Adicionar aresta",editNode:"Editar nó",editEdge:"Editar aresta",addDescription:"Clique em um espaço em branco para adicionar um novo nó",edgeDescription:"Clique em um nó e arraste a aresta até outro nó para conectá-los",editEdgeDescription:"Clique nos pontos de controle e os arraste para um nó para conectá-los",createEdgeError:"Não foi possível linkar arestas a um cluster.",deleteClusterError:"Clusters não puderam ser removidos.",editClusterError:"Clusters não puderam ser editados."},e["pt-BR"]=e["pt-br"],e.pt_BR=e["pt-br"],e.pt_br=e["pt-br"],e.ru={edit:"Ð едактировать",del:"Удалить выбранное",back:"Назад",addNode:"Добавить узел",addEdge:"Добавить ребро",editNode:"Ð едактировать узел",editEdge:"Ð едактировать ребро",addDescription:"Кликните в свободное место, чтобы добавить новый узел.",edgeDescription:"Кликните на узел и протяните ребро к другому узлу, чтобы соединить их.",editEdgeDescription:"Кликните на контрольные точки и перетащите их в узел, чтобы подключиться к нему.",createEdgeError:"Невозможно соединить ребра в кластер.",deleteClusterError:"Кластеры не могут быть удалены",editClusterError:"Кластеры недоступны для редактирования."},e.ru_RU=e.ru,e.cn={edit:"编辑",del:"åˆ 除选定",back:"返回",addNode:"æ·»åŠ 节点",addEdge:"æ·»åŠ 连接线",editNode:"编辑节点",editEdge:"编辑连接线",addDescription:"单击空白处放置新节点。",edgeDescription:"单击某个节点并将该连接线拖动到另一个节点以连接它Ã
19296¤Â»Â¬Ã£â‚¬â€š",editEdgeDescription:"单击控制节点并将它们拖到节点上连接。",createEdgeError:"æ— 法将连接线连接到群集。",deleteClusterError:"æ— 法åˆ 除群集。",editClusterError:"æ— 法编辑群集。"},e.zh_CN=e.cn},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(){(0,s.default)(this,t),this.NUM_ITERATIONS=4,this.image=new Image,this.canvas=document.createElement("canvas")}return(0,a.default)(t,[{key:"init",value:function(){if(!this.initialized()){this.src=this.image.src;var t=this.image.width,e=this.image.height;this.width=t,this.height=e;var i=Math.floor(e/2),o=Math.floor(e/4),n=Math.floor(e/8),s=Math.floor(e/16),r=Math.floor(t/2),a=Math.floor(t/4),h=Math.floor(t/8),d=Math.floor(t/16);this.canvas.width=3*a,this.canvas.height=i,this.coordinates=[[0,0,r,i],[r,0,a,o],[r,o,h,n],[5*h,o,d,s]],this._fillMipMap()}}},{key:"initialized",value:function(){return void 0!==this.coordinates}},{key:"_fillMipMap",value:function(){var t=this.canvas.getContext("2d"),e=this.coordinates[0];t.drawImage(this.image,e[0],e[1],e[2],e[3]);for(var i=1;i<this.NUM_ITERATIONS;i++){var o=this.coordinates[i-1],n=this.coordinates[i];t.drawImage(this.canvas,o[0],o[1],o[2],o[3],n[0],n[1],n[2],n[3])}}},{key:"drawImageAtPosition",value:function(t,e,i,o,n,s){if(this.initialized())if(e>2){e*=.5;for(var r=0;e>2&&r<this.NUM_ITERATIONS;)e*=.5,r+=1;r>=this.NUM_ITERATIONS&&(r=this.NUM_ITERATIONS-1);var a=this.coordinates[r];t.drawImage(this.canvas,a[0],a[1],a[2],a[3],i,o,n,s)}else t.drawImage(this.image,i,o,n,s)}}]),t}();e.default=h},function(t,e,i){
19297    function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=function(){function t(){(0,s.default)(this,t),this.clear(),this.defaultIndex=0,this.groupsArray=[],this.groupIndex=0,this.defaultGroups=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"},hover:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"},hover:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"},hover:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"},hover:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"},hover:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"},hover:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"},hover:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"},hover:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"},hover:{border:"#4AD63A",background:"#E6FFE3"}},{border:"#990000",background:"#EE0000",highlight:{border:"#BB0000",background:"#FF3333"},hover:{border:"#BB0000",background:"#FF3333"}},{border:"#FF6000",background:"#FF6000",highlight:{border:"#FF6000",background:"#FF6000"},hover:{border:"#FF6000",background:"#FF6000"}},{border:"#97C2FC",background:"#2B7CE9",highlight:{border:"#D2E5FF",background:"#2B7CE9"},hover:{border:"#D2E5FF",background:"#2B7CE9"}},{border:"#399605",background:"#255C03",highlight:{border:"#399605",background:"#255C03"},hover:{border:"#399605",background:"#255C03"}},{border:"#B70054",background:"#FF007E",highlight:{border:"#B70054",background:"#FF007E"},hover:{border:"#B70054",background:"#FF007E"}},{border:"#AD85E4",background:"#7C29F0",highlight:{border:"#D3BDF0",background:"#7C29F0"},hover:{border:"#D3BDF0",background:"#7C29F0"}},{border:"#4557FA",background:"#000EA1",highlight:{border:"#6E6EFD",background:"#000EA1"},hover:{border:"#6E6EFD",background:"#000EA1"}},{border:"#FFC0CB",background:"#FD5A77",highlight:{border:"#FFD1D9",background:"#FD5A77"},hover:{border:"#FFD1D9",background:"#FD5A77"}},{border:"#C2FABC",background:"#74D66A",highlight:{border:"#E6FFE3",background:"#74D66A"},hover:{border:"#E6FFE3",background:"#74D66A"}},{border:"#EE0000",background:"#990000",highlight:{border:"#FF3333",background:"#BB0000"},hover:{border:"#FF3333",background:"#BB0000"}}],this.options={},this.defaultOptions={useDefaultGroups:!0},h.extend(this.options,this.defaultOptions)}return(0,a.default)(t,[{key:"setOptions",value:function(t){var e=["useDefaultGroups"];if(void 0!==t)for(var i in t)if(t.hasOwnProperty(i)&&-1===e.indexOf(i)){var o=t[i];this.add(i,o)}}},{key:"clear",value:function(){this.groups={},this.groupsArray=[]}},{key:"get",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=this.groups[t];if(void 0===i&&e)if(!1===this.options.useDefaultGroups&&this.groupsArray.length>0){var o=this.groupIndex%this.groupsArray.length;this.groupIndex++,i={},i.color=this.groups[this.groupsArray[o]],this.groups[t]=i}else{var n=this.defaultIndex%this.defaultGroups.length;this.defaultIndex++,i={},i.color=this.defaultGroups[n],this.groups[t]=i}return i}},{key:"add",value:function(t,e){return this.groups[t]=e,this.groupsArray.push(t),e}}]),t}();e.default=d}
19297,function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(11),l=i(12),u=i(47).default,c=function(){function t(e,i,o,n){var r=this;if((0,s.default)(this,t),this.body=e,this.images=i,this.groups=o,this.layoutEngine=n,this.body.functions.createNode=this.create.bind(this),this.nodesListeners={add:function(t,e){r.add(e.items)},update:function(t,e){r.update(e.items,e.data,e.oldData)},remove:function(t,e){r.remove(e.items)}},this.defaultOptions={borderWidth:1,borderWidthSelected:2,brokenImage:void 0,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},fixed:{x:!1,y:!1},font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:0,strokeColor:"#ffffff",align:"center",vadjust:0,multi:!1,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"monospace",vadjust:2}},group:void 0,hidden:!1,icon:{face:"FontAwesome",code:void 0,size:50,color:"#2B7CE9"},image:void 0,label:void 0,labelHighlightBold:!0,level:void 0,margin:{top:5,right:5,bottom:5,left:5},mass:1,physics:!0,scaling:{min:10,max:30,label:{enabled:!1,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function(t,e,i,o){if(e===t)return.5;var n=1/(e-t);return Math.max(0,(o-t)*n)}},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},shape:"ellipse",shapeProperties:{borderDashes:!1,borderRadius:6,interpolation:!0,useImageSize:!1,useBorderWithImage:!1},size:25,title:void 0,value:void 0,x:void 0,y:void 0},this.defaultOptions.mass<=0)throw"Internal error: mass in defaultOptions of NodesHandler may not be zero or negative";this.options=h.bridgeObject(this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("refreshNodes",this.refresh.bind(this)),this.body.emitter.on("refresh",this.refresh.bind(this)),this.body.emitter.on("destroy",function(){h.forEach(t.nodesListeners,function(e,i){t.body.data.nodes&&t.body.data.nodes.off(i,e)}),delete t.body.functions.createNode,delete t.nodesListeners.add,delete t.nodesListeners.update,delete t.nodesListeners.remove,delete t.nodesListeners})}},{key:"setOptions",value:function(t){if(void 0!==t){if(u.parseOptions(this.options,t),void 0!==t.shape)for(var e in this.body.nodes)this.body.nodes.hasOwnProperty(e)&&this.body.nodes[e].updateShape();if(void 0!==t.font)for(var i in this.body.nodes)this.body.nodes.hasOwnProperty(i)&&(this.body.nodes[i].updateLabelModule(),this.body.nodes[i].needsRefresh());if(void 0!==t.size)for(var o in this.body.nodes)this.body.nodes.hasOwnProperty(o)&&this.body.nodes[o].needsRefresh();void 0===t.hidden&&void 0===t.physics||this.body.emitter.emit("_dataChanged")}}},{key:"setData",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.data.nodes;if(t instanceof d||t instanceof l)this.body.data.nodes=t;else if(Array.isArray(t))this.body.data.nodes=new d,this.body.data.nodes.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.body.data.nodes=new d}if(i&&h.forEach(this.nodesListeners,function(t,e){i.off(e,t)}),this.body.nodes={},this.body.data.nodes){var o=this;h.forEach(this.nodesListeners,function(t,e){o.body.data.nodes.on(e,t)});var n=this.body.data.nodes.getIds();this.add(n,!0)}!1===e&&this.body.emitter.emit("_dataChanged")}},{key:"add",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=void 0,o=[],n=0;n<t.length;n++){i=t[n];var s=this.body.data.nodes.get(i),r=this.create(s);o.push(r),this.body.nodes[i]=r}this.layoutEngine.positionInitially(o),!1===e&&this.body.emitter.emit("_dataChanged")}},{key:"update",value:function(t,e,i){for(var o=this.body.nodes,n=!1,s=0;s<t.length;s++){var r=t[s],a=o[r],h=e[s];void 0!==a?a.setOptions(h)&&(n=!0):(n=!0,a=this.create(h),o[r]=a)}n||void 0===i||(n=e.some(function(t,e){var o=i[e];return o&&o.level!==t.level})),!0===n?this.body.emitter.emit("_dataChanged"):this.body.emitter.emit("_dataUpdated")}},{key:"remove",value:function(t){for(var e=this.body.nodes,i=0;i<t.length;i++){delete e[t[i]]}this.body.emitter.emit("_dataChanged")}},{key:"create",value:function(t){return new(arguments.length>1&&void 0!==arguments[1]?arguments[1]:u)(t,this.body,this.images,this.groups,this.options,this.defaultOptions)}},{key:"refresh",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];h.forEach(this.body.nodes,function(i,o){var n=t.body.data.nodes.get(o);void 0!==n&&(!0===e&&i.setOptions({x:null,y:null}),i.setOptions({fixed:!1}),i.setOptions(n))})}},{key:"getPositions",value:function(t){var e={};if(void 0!==t){if(!0===Array.isArray(t)){for(var i=0;i<t.length;i++)if(void 0!==this.body.nodes[t[i]]){var o=this.body.nodes[t[i]];e[t[i]]={x:Math.round(o.x),y:Math.round(o.y)}}}else if(void 0!==this.body.nodes[t]){var n=this.body.nodes[t];e[t]={x:Math.round(n.x),y:Math.round(n.y)}}}else for(var s=0;s<this.body.nodeIndices.length;s++){var r=this.body.nodes[this.body.nodeIndices[s]];e[this.body.nodeIndices[s]]={x:Math.round(r.x),y:Math.round(r.y)}}return e}},{key:"storePositions",value:function(){var t=[],e=this.body.data.nodes.getDataSet();for(var i in e._data)if(e._data.hasOwnProperty(i)){var o=this.body.nodes[i];e._data[i].x==Math.round(o.x)&&e._data[i].y==Math.round(o.y)||t.pu
19297sh({id:o.id,x:Math.round(o.x),y:Math.round(o.y)})}e.update(t)}},{key:"getBoundingBox",value:function(t){if(void 0!==this.body.nodes[t])return this.body.nodes[t].shape.boundingBox}},{key:"getConnectedNodes",value:function(t,e){var i=[];if(void 0!==this.body.nodes[t])for(var o=this.body.nodes[t],n={},s=0;s<o.edges.length;s++){var r=o.edges[s];"to"!==e&&r.toId==o.id?void 0===n[r.fromId]&&(i.push(r.fromId),n[r.fromId]=!0):"from"!==e&&r.fromId==o.id&&void 0===n[r.toId]&&(i.push(r.toId),n[r.toId]=!0)}return i}},{key:"getConnectedEdges",value:function(t){var e=[];if(void 0!==this.body.nodes[t])for(var i=this.body.nodes[t],o=0;o<i.edges.length;o++)e.push(i.edges[o].id);else console.log("NodeId provided for getConnectedEdges does not exist. Provided: ",t);return e}},{key:"moveNode",value:function(t,e,i){var o=this;void 0!==this.body.nodes[t]?(this.body.nodes[t].x=Number(e),this.body.nodes[t].y=Number(i),setTimeout(function(){o.body.emitter.emit("startSimulation")},0)):console.log("Node id supplied to moveNode does not exist. Provided: ",t)}}]),t}();e.default=c},function(t,e,i){t.exports={default:i(189),__esModule:!0}},function(t,e,i){i(49),i(60),t.exports=i(190)},function(t,e,i){var o=i(86),n=i(13)("iterator"),s=i(31);t.exports=i(7).isIterable=function(t){var e=Object(t);return void 0!==e[n]||"@@iterator"in e||s.hasOwnProperty(o(e))}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(192).default,d=i(48).default,l=function(){function t(e,i,o,n){var r=this;(0,s.default)(this,t),this.ctx=e,this.parent=i;var a=function(t,i){if(void 0===t)return 0;var s=r.parent.getFormattingValues(e,o,n,i),a=0;if(""!==t){a=r.ctx.measureText(t).width}return{width:a,values:s}};this.lines=new h(a)}return(0,a.default)(t,[{key:"process",value:function(t){if(!d.isValidLabel(t))return this.lines.finalize();var e=this.parent.fontOptions;t=t.replace(/\r\n/g,"\n"),t=t.replace(/\r/g,"\n");var i=String(t).split("\n"),o=i.length;if(e.multi)for(var n=0;n<o;n++){var s=this.splitBlocks(i[n],e.multi);if(void 0!==s)if(0!==s.length){if(e.maxWdt>0)for(var r=0;r<s.length;r++){var a=s[r].mod,h=s[r].text;this.splitStringIntoLines(h,a,!0)}else for(var l=0;l<s.length;l++){var u=s[l].mod,c=s[l].text;this.lines.append(c,u)}this.lines.newLine()}else this.lines.newLine("")}else if(e.maxWdt>0)for(var p=0;p<o;p++)this.splitStringIntoLines(i[p]);else for(var f=0;f<o;f++)this.lines.newLine(i[f]);return this.lines.finalize()}},{key:"decodeMarkupSystem",value:function(t){var e="none";return"markdown"===t||"md"===t?e="markdown":!0!==t&&"html"!==t||(e="html"),e}},{key:"splitHtmlBlocks",value:function(t){var e=[],i={bold:!1,ital:!1,mono:!1,spacing:!1,position:0,buffer:"",modStack:[]};for(i.mod=function(){return 0===this.modStack.length?"normal":this.modStack[0]},i.modName=function(){return 0===this.modStack.length?"normal":"mono"===this.modStack[0]?"mono":i.bold&&i.ital?"boldital":i.bold?"bold":i.ital?"ital":void 0},i.emitBlock=function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.spacing&&(this.add(" "),this.spacing=!1),this.buffer.length>0&&(e.push({text:this.buffer,mod:this.modName()}),this.buffer="")},i.add=function(t){" "===t&&(i.spacing=!0),i.spacing&&(this.buffer+=" ",this.spacing=!1)," "!=t&&(this.buffer+=t)};i.position<t.length;){var o=t.charAt(i.position);/[ \t]/.test(o)?i.mono?i.add(o):i.spacing=!0:/</.test(o)?i.mono||i.bold||!/<b>/.test(t.substr(i.position,3))?i.mono||i.ital||!/<i>/.test(t.substr(i.position,3))?!i.mono&&/<code>/.test(t.substr(i.position,6))?(i.emitBlock(),i.mono=!0,i.modStack.unshift("mono"),i.position+=5):!i.mono&&"bold"===i.mod()&&/<\/b>/.test(t.substr(i.position,4))?(i.emitBlock(),i.bold=!1,i.modStack.shift(),i.position+=3):!i.mono&&"ital"===i.mod()&&/<\/i>/.test(t.substr(i.position,4))?(i.emitBlock(),i.ital=!1,i.modStack.shift(),i.position+=3):"mono"===i.mod()&&/<\/code>/.test(t.substr(i.position,7))?(i.emitBlock(),i.mono=!1,i.modStack.shift(),i.position+=6):i.add(o):(i.emitBlock(),i.ital=!0,i.modStack.unshift("ital"),i.position+=2):(i.emitBlock(),i.bold=!0,i.modStack.unshift("bold"),i.position+=2):/&/.test(o)?/&lt;/.test(t.substr(i.position,4))?(i.add("<"),i.position+=3):/&amp;/.test(t.substr(i.position,5))?(i.add("&"),i.position+=4):i.add("&"):i.add(o),i.position++}return i.emitBlock(),e}},{key:"splitMarkdownBlocks",value:function(t){var e=[],i={bold:!1,ital:!1,mono:!1,beginable:!0,spacing:!1,position:0,buffer:"",modStack:[]};for(i.mod=function(){return 0===this.modStack.length?"normal":this.modStack[0]},i.modName=function(){return 0===this.modStack.length?"normal":"mono"===this.modStack[0]?"mono":i.bold&&i.ital?"boldital":i.bold?"bold":i.ital?"ital":void 0},i.emitBlock=function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.spacing&&(this.add(" "),this.spacing=!1),this.buffer.length>0&&(e.push({text:this.buffer,mod:this.modName()}),this.buffer="")},i.add=function(t){" "===t&&(i.spacing=!0),i.spacing&&(this.buffer+=" ",this.spacing=!1)," "!=t&&(this.buffer+=t)};i.position<t.length;){var o=t.charAt(i.position);/[ \t]/.test(o)?(i.mono?i.add(o):i.spacing=!0,i.beginable=!0):/\\/.test(o)?i.position<t.length+1&&(i.position++,o=t.charAt(i.position),/ \t/.test(o)?i.spacing=!0:(i.add(o),i.beginable=!1)):i.mono||i.bold||!i.beginable&&!i.spacing||!/\*/.test(o)?i.mono||i.ital||!i.beginable&&!i.spacing||!/\_/.test(o)?!i.mono&&(i.beginable||i.spacing)&&/`/.test(o)?(i.emitBlock(),i.mono=!0,i.modStack.unshift("mono")):!i.mono&&"bold"===i.mod()&&/\*/.test(o)?i.position===t.length-1||/[.,_` \t\n]/.test(t.charAt(i.position+1))?(i.emitBlock(),i.bold=!1,i.modStack.shift()):i.add(o):!i.mono&&"ital"===i.mod()&&/\_/.test(o)?i.position===t.length-1||/[.,*` \t\n]/.test(t.charAt(i.position+1))?(i.emitBlock(),i.ital=!1,i.modStack.shift()):i.add(o):i.mono&&"mono"===i.mod()&&/`/.test(o)?i.position===t.length-1||/[.,*_ \t\n]/.test(t.charAt(i.position+1))?(i.emitBlock(),i.mono=!1,i.modStack.shift()):i.add(o):(i.add(o),i.beginable=!1):(i.emitBlock(),i.ital=!0,i.modStack.unshift("ital")):(i.emitBlock(),i.bold=!0,i.modStack.unshift("bold")),i.position++}return i.emitBlock(),e}}
19297,{key:"splitBlocks",value:function(t,e){var i=this.decodeMarkupSystem(e);return"none"===i?[{text:t,mod:"normal"}]:"markdown"===i?this.splitMarkdownBlocks(t):"html"===i?this.splitHtmlBlocks(t):void 0}},{key:"overMaxWidth",value:function(t){var e=this.ctx.measureText(t).width;return this.lines.curWidth()+e>this.parent.fontOptions.maxWdt}},{key:"getLongestFit",value:function(t){for(var e="",i=0;i<t.length;){var o=""===e?"":" ",n=e+o+t[i];if(this.overMaxWidth(n))break;e=n,i++}return i}},{key:"getLongestFitWord",value:function(t){for(var e=0;e<t.length&&!this.overMaxWidth(t.slice(0,e));)e++;return e}},{key:"splitStringIntoLines",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal",i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];t=t.replace(/^( +)/g,"$1\r"),t=t.replace(/([^\r][^ ]*)( +)/g,"$1\r$2\r");for(var o=t.split("\r");o.length>0;){var n=this.getLongestFit(o);if(0===n){var s=o[0],r=this.getLongestFitWord(s);this.lines.newLine(s.slice(0,r),e),o[0]=s.slice(r)}else{var a=n;" "===o[n-1]?n--:" "===o[a]&&a++;var h=o.slice(0,n).join("");n==o.length&&i?this.lines.append(h,e):this.lines.newLine(h,e),o=o.slice(a)}}}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(90),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=function(){function t(e){(0,a.default)(this,t),this.measureText=e,this.current=0,this.width=0,this.height=0,this.lines=[]}return(0,d.default)(t,[{key:"_add",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"normal";void 0===this.lines[t]&&(this.lines[t]={width:0,height:0,blocks:[]});var o=e;void 0!==e&&""!==e||(o=" ");var n=this.measureText(o,i),r=(0,s.default)({},n.values);r.text=e,r.width=n.width,r.mod=i,void 0!==e&&""!==e||(r.width=0),this.lines[t].blocks.push(r),this.lines[t].width+=r.width}},{key:"curWidth",value:function(){var t=this.lines[this.current];return void 0===t?0:t.width}},{key:"append",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal";this._add(this.current,t,e)}},{key:"newLine",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal";this._add(this.current,t,e),this.current++}},{key:"determineLineHeights",value:function(){for(var t=0;t<this.lines.length;t++){var e=this.lines[t],i=0;if(void 0!==e.blocks)for(var o=0;o<e.blocks.length;o++){var n=e.blocks[o];i<n.height&&(i=n.height)}e.height=i}}},{key:"determineLabelSize",value:function(){for(var t=0,e=0,i=0;i<this.lines.length;i++){var o=this.lines[i];o.width>t&&(t=o.width),e+=o.height}this.width=t,this.height=e}},{key:"removeEmptyBlocks",value:function(){for(var t=[],e=0;e<this.lines.length;e++){var i=this.lines[e];if(0!==i.blocks.length&&(e!==this.lines.length-1||0!==i.width)){var o={};(0,s.default)(o,i),o.blocks=[];for(var n=void 0,r=[],a=0;a<i.blocks.length;a++){var h=i.blocks[a];0!==h.width?r.push(h):void 0===n&&(n=h)}0===r.length&&void 0!==n&&r.push(n),o.blocks=r,t.push(o)}}return t}},{key:"finalize",value:function(){this.determineLineHeights(),this.determineLabelSize();var t=this.removeEmptyBlocks();return{width:this.width,height:this.height,lines:t}}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i);this.width=o.width+this.margin.right+this.margin.left,this.height=o.height+this.margin.top+this.margin.bottom,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.initContextForDraw(t,s),t.roundRect(this.left,this.top,this.width,this.height,s.borderRadius),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n)}}
19297,{key:"updateBoundingBox",value:function(t,e,i,o,n){this._updateBoundingBox(t,e,i,o,n);var s=this.options.shapeProperties.borderRadius;this._addBoundingBoxMargin(s)}},{key:"distanceToBorder",value:function(t,e){this.resize(t);var i=this.options.borderWidth;return Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i}}]),e}(m.default);e.default=v},function(t,e,i){i(195),t.exports=i(7).Object.getPrototypeOf},function(t,e,i){var o=i(41),n=i(85);i(87)("getPrototypeOf",function(){return function(t){return n(o(t))}})},function(t,e,i){t.exports={default:i(197),__esModule:!0}},function(t,e,i){i(198),t.exports=i(7).Object.setPrototypeOf},function(t,e,i){var o=i(17);o(o.S,"Object",{setPrototypeOf:i(199).set})},function(t,e,i){var o=i(32),n=i(27),s=function(t,e){if(n(t),!o(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,e,o){try{o=i(80)(Function.call,i(89).f(Object.prototype,"__proto__").set,2),o(t,[]),e=!(t instanceof Array)}catch(t){e=!0}return function(t,i){return s(t,i),e?t.__proto__=i:o(t,i),t}}({},!1):void 0),check:s}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i),n=Math.max(o.width+this.margin.right+this.margin.left,o.height+this.margin.top+this.margin.bottom);this.options.size=n/2,this.width=n,this.height=n,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this._drawRawCircle(t,e,i,s),this.updateBoundingBox(e,i),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,i,o,n)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),.5*this.width}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o,n,r){(0,a.default)(this,e);var h=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return h.setImages(n,r),h}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(void 0===this.imageObj.src||void 0===this.imageObj.width||void 0===this.imageObj.height){var o=2*this.options.size;return this.width=o,this.height=o,void(this.radius=.5*this.width)}this.needsRefresh(e,i)&&this._resizeImage()}},{key:"draw",value:function(t,e,i,o,n,s){this.switchImages(o),this.resize(),this.left=e-this.width/2,this.top=i-this.height/2,this._drawRawCircle(t,e,i,s),t.save(),t.clip(),this._drawImageAtPosition(t,s),t.restore(),this._drawImageLabel(t,e,i,o,n),this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size,this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset)}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),.5*this.width}}]),e}(m.default);e.default=v}
19297,function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i),n=o.width+this.margin.right+this.margin.left;this.width=n,this.height=n,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.initContextForDraw(t,s),t.database(e-this.width/2,i-this.height/2,this.width,this.height),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"diamond",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"circle",2,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),this.options.size}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i);this.height=2*o.height,this.width=o.width+o.height,this.radius=.5*this.width}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-.5*this.width,this.top=i-.5*this.height,this.initContextForDraw(t,s),t.ellipse_vis(this.left,this.top,this.width,this.height),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,e,i,o,n)}},{key:"distanceToBorder",value:function(t,e){this.resize(t);var i=.5*this.width,o=.5*this.height,n=Math.sin(e)*i,s=Math.cos(e)*o;return i*o/Math.sqrt(n*n+s*s)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){this.needsRefresh(e,i)&&(this.iconSize={width:Number(this.options.icon.size),height:Number(this.options.icon.size)},this.width=this.iconSize.width+this.margin.right+this.margin.left,this.height=this.iconSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}}
19297,{key:"draw",value:function(t,e,i,o,n,s){if(this.resize(t,o,n),this.options.icon.size=this.options.icon.size||50,this.left=e-this.width/2,this.top=i-this.height/2,this._icon(t,e,i,o,n,s),void 0!==this.options.label){this.labelModule.draw(t,this.left+this.iconSize.width/2+this.margin.left,i+this.height/2+5,o)}this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){if(this.boundingBox.top=e-.5*this.options.icon.size,this.boundingBox.left=t-.5*this.options.icon.size,this.boundingBox.right=t+.5*this.options.icon.size,this.boundingBox.bottom=e+.5*this.options.icon.size,void 0!==this.options.label&&this.labelModule.size.width>0){this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height+5)}}},{key:"_icon",value:function(t,e,i,o,n,s){var r=Number(this.options.icon.size);void 0!==this.options.icon.code?(t.font=(o?"bold ":"")+r+"px "+this.options.icon.face,t.fillStyle=this.options.icon.color||"black",t.textAlign="center",t.textBaseline="middle",this.enableShadow(t,s),t.fillText(this.options.icon.code,e,i),this.disableShadow(t,s)):console.error("When using the icon shape, you need to define the code in the icon options object. This can be done per node or globally.")}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o,n,r){(0,a.default)(this,e);var h=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return h.setImages(n,r),h}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(void 0===this.imageObj.src||void 0===this.imageObj.width||void 0===this.imageObj.height){var o=2*this.options.size;return this.width=o,void(this.height=o)}this.needsRefresh(e,i)&&this._resizeImage()}},{key:"draw",value:function(t,e,i,o,n,s){if(this.switchImages(o),this.resize(),this.left=e-this.width/2,this.top=i-this.height/2,!0===this.options.shapeProperties.useBorderWithImage){var r=this.options.borderWidth,a=this.options.borderWidthSelected||2*this.options.borderWidth,h=(o?a:r)/this.body.view.scale;t.lineWidth=Math.min(this.width,h),t.beginPath(),t.strokeStyle=o?this.options.color.highlight.border:n?this.options.color.hover.border:this.options.color.border,t.fillStyle=o?this.options.color.highlight.background:n?this.options.color.hover.background:this.options.color.background,t.rect(this.left-.5*t.lineWidth,this.top-.5*t.lineWidth,this.width+t.lineWidth,this.height+t.lineWidth),t.fill(),this.performStroke(t,s),t.closePath()}this._drawImageAtPosition(t,s),this._drawImageLabel(t,e,i,o,n),this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){this.resize(),this._updateBoundingBox(t,e),void 0!==this.options.label&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset))}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}
19298}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,
19298i,o,n,s){this._drawShape(t,"square",2,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"hexagon",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"star",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){this.needsRefresh(e,i)&&(this.textSize=this.labelModule.getTextSize(t,e,i),this.width=this.textSize.width+this.margin.right+this.margin.left,this.height=this.textSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.enableShadow(t,s),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n),this.disableShadow(t,s),this.updateBoundingBox(e,i,t,o,n)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"triangle",3,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"triangleDown",3,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(11),l=i(12),u=i(74).default,c=function(){function t(e,i,o){var n=this;(0,s.default)(this,t),this.body=e,this.images=i,this.groups=o,this.body.functions.createEdge=this.create.bind(this),this.edgesListeners={add:function(t,e){n.add(e.items)},update:function(t,e){n.update(e.items)},remove:function(t,e){n.remove(e.items)}},this.options={},this.defaultOptions={arrows:{to:{enabled:!1,scaleFactor:1,type:"arrow"},middle:{enabled:!1,scaleFactor:1,type:"arrow"},from:{enabled:!1,scaleFactor:1,type:"arrow"}},arrowStrikethrough:!0,color:{color:"#848484",highlight:"#848484",hover:"#848484",inherit:"from",opacity:1},dashes:!1,font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:2,strokeColor:"#ffffff",align:"horizontal",multi:!1,vadjust:0,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"courier new",vadjust:2}},hidden:!1,hoverWidth:1.5,label:void 0,labelHighlightBold:!0,length:void 0,physics:!0,scaling:{min:1,max:15,label:{enabled:!0,min:14,max:30,maxVisible:30,drawThreshold:5}
19298,customScalingFunction:function(t,e,i,o){if(e===t)return.5;var n=1/(e-t);return Math.max(0,(o-t)*n)}},selectionWidth:1.5,selfReferenceSize:20,shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},smooth:{enabled:!0,type:"dynamic",forceDirection:"none",roundness:.5},title:void 0,width:1,value:void 0},h.deepExtend(this.options,this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("_forceDisableDynamicCurves",function(e){var i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];"dynamic"===e&&(e="continuous");var o=!1;for(var n in t.body.edges)if(t.body.edges.hasOwnProperty(n)){var s=t.body.edges[n],r=t.body.data.edges._data[n];if(void 0!==r){var a=r.smooth;void 0!==a&&!0===a.enabled&&"dynamic"===a.type&&(void 0===e?s.setOptions({smooth:!1}):s.setOptions({smooth:{type:e}}),o=!0)}}!0===i&&!0===o&&t.body.emitter.emit("_dataChanged")}),this.body.emitter.on("_dataUpdated",function(){t.reconnectEdges()}),this.body.emitter.on("refreshEdges",this.refresh.bind(this)),this.body.emitter.on("refresh",this.refresh.bind(this)),this.body.emitter.on("destroy",function(){h.forEach(t.edgesListeners,function(e,i){t.body.data.edges&&t.body.data.edges.off(i,e)}),delete t.body.functions.createEdge,delete t.edgesListeners.add,delete t.edgesListeners.update,delete t.edgesListeners.remove,delete t.edgesListeners})}},{key:"setOptions",value:function(t){if(void 0!==t){u.parseOptions(this.options,t,!0,this.defaultOptions,!0);var e=!1;if(void 0!==t.smooth)for(var i in this.body.edges)this.body.edges.hasOwnProperty(i)&&(e=this.body.edges[i].updateEdgeType()||e);if(void 0!==t.font)for(var o in this.body.edges)this.body.edges.hasOwnProperty(o)&&this.body.edges[o].updateLabelModule();void 0===t.hidden&&void 0===t.physics&&!0!==e||this.body.emitter.emit("_dataChanged")}}},{key:"setData",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o=this.body.data.edges;if(t instanceof d||t instanceof l)this.body.data.edges=t;else if(Array.isArray(t))this.body.data.edges=new d,this.body.data.edges.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.body.data.edges=new d}if(o&&h.forEach(this.edgesListeners,function(t,e){o.off(e,t)}),this.body.edges={},this.body.data.edges){h.forEach(this.edgesListeners,function(t,i){e.body.data.edges.on(i,t)});var n=this.body.data.edges.getIds();this.add(n,!0)}this.body.emitter.emit("_adjustEdgesForHierarchicalLayout"),!1===i&&this.body.emitter.emit("_dataChanged")}},{key:"add",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.edges,o=this.body.data.edges,n=0;n<t.length;n++){var s=t[n],r=i[s];r&&r.disconnect();var a=o.get(s,{showInternalIds:!0});i[s]=this.create(a)}this.body.emitter.emit("_adjustEdgesForHierarchicalLayout"),!1===e&&this.body.emitter.emit("_dataChanged")}},{key:"update",value:function(t){for(var e=this.body.edges,i=this.body.data.edges,o=!1,n=0;n<t.length;n++){var s=t[n],r=i.get(s),a=e[s];void 0!==a?(a.disconnect(),o=a.setOptions(r)||o,a.connect()):(this.body.edges[s]=this.create(r),o=!0)}!0===o?(this.body.emitter.emit("_adjustEdgesForHierarchicalLayout"),this.body.emitter.emit("_dataChanged")):this.body.emitter.emit("_dataUpdated")}},{key:"remove",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(0!==t.length){var i=this.body.edges;h.forEach(t,function(t){var e=i[t];void 0!==e&&e.remove()}),e&&this.body.emitter.emit("_dataChanged")}}},{key:"refresh",value:function(){var t=this;h.forEach(this.body.edges,function(e,i){var o=t.body.data.edges._data[i];void 0!==o&&e.setOptions(o)})}},{key:"create",value:function(t){return new u(t,this.body,this.options,this.defaultOptions)}},{key:"reconnectEdges",value:function(){var t,e=this.body.nodes,i=this.body.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[]);for(t in i)if(i.hasOwnProperty(t)){var o=i[t];o.from=null,o.to=null,o.connect()}}},{key:"getConnectedNodes",value:function(t){var e=[];if(void 0!==this.body.edges[t]){var i=this.body.edges[t];void 0!==i.fromId&&e.push(i.fromId),void 0!==i.toId&&e.push(i.toId)}return e}},{key:"_updateState",value:function(){this._addMissingEdges(),this._removeInvalidEdges()}},{key:"_removeInvalidEdges",value:function(){var t=this,e=[];h.forEach(this.body.edges,function(i,o){var n=t.body.nodes[i.toId],s=t.body.nodes[i.fromId];void 0!==n&&!0===n.isCluster||void 0!==s&&!0===s.isCluster||void 0!==n&&void 0!==s||e.push(o)}),this.remove(e,!1)}},{key:"_addMissingEdges",value:function(){var t=this.body.edges,e=this.body.data.edges,i=[];e.forEach(function(e,o){void 0===t[o]&&i.push(o)}),this.add(i,!0)}}]),t}();e.default=c}
19298,function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(3),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(4),p=o(c),f=i(5),m=o(f),v=i(216),g=o(v),y=function(t){function e(t,i,o){return(0,d.default)(this,e),(0,p.default)(this,(e.__proto__||(0,a.default)(e)).call(this,t,i,o))}return(0,m.default)(e,t),(0,u.default)(e,[{key:"_line",value:function(t,e,i){var o=i[0],n=i[1];this._bezierCurve(t,e,o,n)}},{key:"_getViaCoordinates",value:function(){var t=this.from.x-this.to.x,e=this.from.y-this.to.y,i=void 0,o=void 0,n=void 0,s=void 0,r=this.options.smooth.roundness;return(Math.abs(t)>Math.abs(e)||!0===this.options.smooth.forceDirection||"horizontal"===this.options.smooth.forceDirection)&&"vertical"!==this.options.smooth.forceDirection?(o=this.from.y,s=this.to.y,i=this.from.x-r*t,n=this.to.x+r*t):(o=this.from.y-r*e,s=this.to.y+r*e,i=this.from.x,n=this.to.x),[{x:i,y:o},{x:n,y:s}]}},{key:"getViaNode",value:function(){return this._getViaCoordinates()}},{key:"_findBorderPosition",value:function(t,e){return this._findBorderPositionBezier(t,e)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,r){var a=arguments.length>6&&void 0!==arguments[6]?arguments[6]:this._getViaCoordinates(),h=(0,s.default)(a,2),d=h[0],l=h[1];return this._getDistanceToBezierEdge(t,e,i,o,n,r,d,l)}},{key:"getPoint",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getViaCoordinates(),i=(0,s.default)(e,2),o=i[0],n=i[1],r=t,a=[];return a[0]=Math.pow(1-r,3),a[1]=3*r*Math.pow(1-r,2),a[2]=3*Math.pow(r,2)*(1-r),a[3]=Math.pow(r,3),{x:a[0]*this.fromPoint.x+a[1]*o.x+a[2]*n.x+a[3]*this.toPoint.x,y:a[0]*this.fromPoint.y+a[1]*o.y+a[2]*n.y+a[3]*this.toPoint.y}}}]),e}(g.default);e.default=y},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(75),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_getDistanceToBezierEdge",value:function(t,e,i,o,n,s,r,a){var h=1e9,d=void 0,l=void 0,u=void 0,c=void 0,p=void 0,f=t,m=e,v=[0,0,0,0];for(l=1;l<10;l++)u=.1*l,v[0]=Math.pow(1-u,3),v[1]=3*u*Math.pow(1-u,2),v[2]=3*Math.pow(u,2)*(1-u),v[3]=Math.pow(u,3),c=v[0]*t+v[1]*r.x+v[2]*a.x+v[3]*i,p=v[0]*e+v[1]*r.y+v[2]*a.y+v[3]*o,l>0&&(d=this._getDistanceToLine(f,m,c,p,n,s),h=d<h?d:h),f=c,m=p;return h}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(3),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(4),p=o(c),f=i(5),m=o(f),v=i(75),g=o(v),y=function(t){function e(t,i,o){(0,d.default)(this,e);var n=(0,p.default)(this,(e.__proto__||(0,a.default)(e)).call(this,t,i,o));return n._boundFunction=function(){n.positionBezierNode()},n.body.emitter.on("_repositionBezierNodes",n._boundFunction),n}return(0,m.default)(e,t),(0,u.default)(e,[{key:"setOptions",value:function(t){var e=!1;this.options.physics!==t.physics&&(e=!0),this.options=t,this.id=this.options.id,this.from=this.body.nodes[this.options.from],this.to=this.body.nodes[this.options.to],this.setupSupportNode(),this.connect(),!0===e&&(this.via.setOptions({physics:this.options.physics}),this.positionBezierNode())}},{key:"connect",value:function(){this.from=this.body.nodes[this.options.from],this.to=this.body.nodes[this.options.to],void 0===this.from||void 0===this.to||!1===this.options.physics?this.via.setOptions({physics:!1}):this.from.id===this.to.id?this.via.setOptions({physics:!1}):this.via.setOptions({physics:!0})}},{key:"cleanup",value:function(){return this.body.emitter.off("_repositionBezierNodes",this._boundFunction),void 0!==this.via&&(delete this.body.nodes[this.via.id],this.via=void 0,!0)}},{key:"setupSupportNode",value:function(){if(void 0===this.via){var t="edgeId:"+this.id,e=this.body.functions.createNode({id:t,shape:"circle",physics:!0,hidden:!0});this.body.nodes[t]=e,this.via=e,this.via.parentEdgeId=this.id,this.positionBezierNode()}}},{key:"positionBezierNode",value:function(){void 0!==this.via&&void 0!==this.from&&void 0!==this.to?(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y)
19298):void 0!==this.via&&(this.via.x=0,this.via.y=0)}},{key:"_line",value:function(t,e,i){this._bezierCurve(t,e,i)}},{key:"getViaNode",value:function(){return this.via}},{key:"getPoint",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.via,i=t,o=void 0,n=void 0;if(this.from===this.to){var r=this._getCircleData(this.from),a=(0,s.default)(r,3),h=a[0],d=a[1],l=a[2],u=2*Math.PI*(1-i);o=h+l*Math.sin(u),n=d+l-l*(1-Math.cos(u))}else o=Math.pow(1-i,2)*this.fromPoint.x+2*i*(1-i)*e.x+Math.pow(i,2)*this.toPoint.x,n=Math.pow(1-i,2)*this.fromPoint.y+2*i*(1-i)*e.y+Math.pow(i,2)*this.toPoint.y;return{x:o,y:n}}},{key:"_findBorderPosition",value:function(t,e){return this._findBorderPositionBezier(t,e,this.via)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){return this._getDistanceToBezierEdge(t,e,i,o,n,s,this.via)}}]),e}(g.default);e.default=y},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(75),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_line",value:function(t,e,i){this._bezierCurve(t,e,i)}},{key:"getViaNode",value:function(){return this._getViaCoordinates()}},{key:"_getViaCoordinates",value:function(){var t=void 0,e=void 0,i=this.options.smooth.roundness,o=this.options.smooth.type,n=Math.abs(this.from.x-this.to.x),s=Math.abs(this.from.y-this.to.y);if("discrete"===o||"diagonalCross"===o){var r=void 0,a=void 0;r=a=n<=s?i*s:i*n,this.from.x>this.to.x&&(r=-r),this.from.y>=this.to.y&&(a=-a),t=this.from.x+r,e=this.from.y+a,"discrete"===o&&(n<=s?t=n<i*s?this.from.x:t:e=s<i*n?this.from.y:e)}else if("straightCross"===o){var h=(1-i)*n,d=(1-i)*s;n<=s?(h=0,this.from.y<this.to.y&&(d=-d)):(this.from.x<this.to.x&&(h=-h),d=0),t=this.to.x+h,e=this.to.y+d}else if("horizontal"===o){var l=(1-i)*n;this.from.x<this.to.x&&(l=-l),t=this.to.x+l,e=this.from.y}else if("vertical"===o){var u=(1-i)*s;this.from.y<this.to.y&&(u=-u),t=this.from.x,e=this.to.y+u}else if("curvedCW"===o){n=this.to.x-this.from.x,s=this.from.y-this.to.y;var c=Math.sqrt(n*n+s*s),p=Math.PI,f=Math.atan2(s,n),m=(f+(.5*i+.5)*p)%(2*p);t=this.from.x+(.5*i+.5)*c*Math.sin(m),e=this.from.y+(.5*i+.5)*c*Math.cos(m)}else if("curvedCCW"===o){n=this.to.x-this.from.x,s=this.from.y-this.to.y;var v=Math.sqrt(n*n+s*s),g=Math.PI,y=Math.atan2(s,n),b=(y+(.5*-i+.5)*g)%(2*g);t=this.from.x+(.5*i+.5)*v*Math.sin(b),e=this.from.y+(.5*i+.5)*v*Math.cos(b)}else{var _=void 0,w=void 0;_=w=n<=s?i*s:i*n,this.from.x>this.to.x&&(_=-_),this.from.y>=this.to.y&&(w=-w),t=this.from.x+_,e=this.from.y+w,n<=s?t=this.from.x<=this.to.x?this.to.x<t?this.to.x:t:this.to.x>t?this.to.x:t:e=this.from.y>=this.to.y?this.to.y>e?this.to.y:e:this.to.y<e?this.to.y:e}return{x:t,y:e}}},{key:"_findBorderPosition",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this._findBorderPositionBezier(t,e,i.via)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){var r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:this._getViaCoordinates();return this._getDistanceToBezierEdge(t,e,i,o,n,s,r)}},{key:"getPoint",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getViaCoordinates(),i=t;return{x:Math.pow(1-i,2)*this.fromPoint.x+2*i*(1-i)*e.x+Math.pow(i,2)*this.toPoint.x,y:Math.pow(1-i,2)*this.fromPoint.y+2*i*(1-i)*e.y+Math.pow(i,2)*this.toPoint.y}}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(118),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_line",value:function(t,e){t.beginPath(),t.moveTo(this.fromPoint.x,this.fromPoint.y),t.lineTo(this.toPoint.x,this.toPoint.y),this.enableShadow(t,e),t.stroke(),this.disableShadow(t,e)}},{key:"getViaNode",value:function(){}},{key:"getPoint",value:function(t){return{x:(1-t)*this.fromPoint.x+t*this.toPoint.x,y:(1-t)*this.fromPoint.y+t*this.toPoint.y}}},{key:"_findBorderPosition",value:function(t,e){var i=this.to,o=this.from;
19298t.id===this.from.id&&(i=this.from,o=this.to);var n=Math.atan2(i.y-o.y,i.x-o.x),s=i.x-o.x,r=i.y-o.y,a=Math.sqrt(s*s+r*r),h=t.distanceToBorder(e,n),d=(a-h)/a,l={};return l.x=(1-d)*o.x+d*i.x,l.y=(1-d)*o.y+d*i.y,l}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){return this._getDistanceToLine(t,e,i,o,n,s)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(120).default,u=i(221).default,c=i(222).default,p=i(223).default,f=i(224).default,m=i(121).default,v=i(225).default,g=i(226).default,y=i(2),b=i(119).default,_=function(){function t(e){(0,a.default)(this,t),this.body=e,this.physicsBody={physicsNodeIndices:[],physicsEdgeIndices:[],forces:{},velocities:{}},this.physicsEnabled=!0,this.simulationInterval=1e3/60,this.requiresTimeout=!0,this.previousStates={},this.referenceState={},this.freezeCache={},this.renderTimer=void 0,this.adaptiveTimestep=!1,this.adaptiveTimestepEnabled=!1,this.adaptiveCounter=0,this.adaptiveInterval=3,this.stabilized=!1,this.startedStabilization=!1,this.stabilizationIterations=0,this.ready=!1,this.options={},this.defaultOptions={enabled:!0,barnesHut:{theta:.5,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09,avoidOverlap:0},forceAtlas2Based:{theta:.5,gravitationalConstant:-50,centralGravity:.01,springConstant:.08,springLength:100,damping:.4,avoidOverlap:0},repulsion:{centralGravity:.2,springLength:200,springConstant:.05,nodeDistance:100,damping:.09,avoidOverlap:0},hierarchicalRepulsion:{centralGravity:0,springLength:100,springConstant:.01,nodeDistance:120,damping:.09},maxVelocity:50,minVelocity:.75,solver:"barnesHut",stabilization:{enabled:!0,iterations:1e3,updateInterval:50,onlyDynamicEdges:!1,fit:!0},timestep:.5,adaptiveTimestep:!0},y.extend(this.options,this.defaultOptions),this.timestep=.5,this.layoutFailed=!1,this.bindEventListeners()}return(0,d.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("initPhysics",function(){t.initPhysics()}),this.body.emitter.on("_layoutFailed",function(){t.layoutFailed=!0}),this.body.emitter.on("resetPhysics",function(){t.stopSimulation(),t.ready=!1}),this.body.emitter.on("disablePhysics",function(){t.physicsEnabled=!1,t.stopSimulation()}),this.body.emitter.on("restorePhysics",function(){t.setOptions(t.options),!0===t.ready&&t.startSimulation()}),this.body.emitter.on("startSimulation",function(){!0===t.ready&&t.startSimulation()}),this.body.emitter.on("stopSimulation",function(){t.stopSimulation()}),this.body.emitter.on("destroy",function(){t.stopSimulation(!1),t.body.emitter.off()}),this.body.emitter.on("_dataChanged",function(){t.updatePhysicsData()})}},{key:"setOptions",value:function(t){void 0!==t&&(!1===t?(this.options.enabled=!1,this.physicsEnabled=!1,this.stopSimulation()):!0===t?(this.options.enabled=!0,this.physicsEnabled=!0,this.startSimulation()):(this.physicsEnabled=!0,y.selectiveNotDeepExtend(["stabilization"],this.options,t),y.mergeOptions(this.options,t,"stabilization"),void 0===t.enabled&&(this.options.enabled=!0),!1===this.options.enabled&&(this.physicsEnabled=!1,this.stopSimulation()),this.timestep=this.options.timestep)),this.init()}},{key:"init",value:function(){var t;"forceAtlas2Based"===this.options.solver?(t=this.options.forceAtlas2Based,this.nodesSolver=new v(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new g(this.body,this.physicsBody,t)):"repulsion"===this.options.solver?(t=this.options.repulsion,this.nodesSolver=new u(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)):"hierarchicalRepulsion"===this.options.solver?(t=this.options.hierarchicalRepulsion,this.nodesSolver=new c(this.body,this.physicsBody,t),this.edgesSolver=new f(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)):(t=this.options.barnesHut,this.nodesSolver=new l(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)),this.modelOptions=t}},{key:"initPhysics",value:function(){!0===this.physicsEnabled&&!0===this.options.enabled?!0===this.options.stabilization.enabled?this.stabilize():(this.stabilized=!1,this.ready=!0,this.body.emitter.emit("fit",{},this.layoutFailed),this.startSimulation()):(this.ready=!0,this.body.emitter.emit("fit"))}},{key:"startSimulation",value:function(){!0===this.physicsEnabled&&!0===this.options.enabled?(this.stabilized=!1,this.adaptiveTimestep=!1,this.body.emitter.emit("_resizeNodes"),void 0===this.viewFunction&&(this.viewFunction=this.simulationStep.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))):this.body.emitter.emit("_redraw")}},{key:"stopSimulation",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.stabilized=!0,!0===t&&this._emitStabilized(),void 0!==this.viewFunction&&(this.body.emitter.off("initRedraw",this.viewFunction),this.viewFunction=void 0,!0===t&&this.body.emitter.emit("_stopRendering"))}},{key:"simulationStep",value:function(){var t=Date.now();this.physicsTick(),(Date.now()-t<.4*this.simulationInterval||!0===this.runDoubleSpeed)&&!1===this.stabilized&&(this.physicsTick(),this.runDoubleSpeed=!0),!0===this.stabilized&&this.stopSimulation()}},{key:"_emitStabilized",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.stabilizationIterations;(this.stabilizationIterations>1||!0===this.startedStabilization)&&setTimeout(function(){t.body.emitter.emit("stabilized",{iterations:e}),t.startedStabilization=!1,t.stabilizationIterations=0},0)}},{key:"physicsStep",value:function(){this.gravitySolver.solve(),this.nodesSolver.solve(),this.edgesSolver.solve(),this.moveNodes()}}
19298,{key:"adjustTimeStep",value:function(){!0===this._evaluateStepQuality()?this.timestep=1.2*this.timestep:this.timestep/1.2<this.options.timestep?this.timestep=this.options.timestep:(this.adaptiveCounter=-1,this.timestep=Math.max(this.options.timestep,this.timestep/1.2))}},{key:"physicsTick",value:function(){if(this._startStabilizing(),!0!==this.stabilized){if(!0===this.adaptiveTimestep&&!0===this.adaptiveTimestepEnabled){this.adaptiveCounter%this.adaptiveInterval==0?(this.timestep=2*this.timestep,this.physicsStep(),this.revert(),this.timestep=.5*this.timestep,this.physicsStep(),this.physicsStep(),this.adjustTimeStep()):this.physicsStep(),this.adaptiveCounter+=1}else this.timestep=this.options.timestep,this.physicsStep();!0===this.stabilized&&this.revert(),this.stabilizationIterations++}}},{key:"updatePhysicsData",value:function(){this.physicsBody.forces={},this.physicsBody.physicsNodeIndices=[],this.physicsBody.physicsEdgeIndices=[];var t=this.body.nodes,e=this.body.edges;for(var i in t)t.hasOwnProperty(i)&&!0===t[i].options.physics&&this.physicsBody.physicsNodeIndices.push(t[i].id);for(var o in e)e.hasOwnProperty(o)&&!0===e[o].options.physics&&this.physicsBody.physicsEdgeIndices.push(e[o].id);for(var n=0;n<this.physicsBody.physicsNodeIndices.length;n++){var s=this.physicsBody.physicsNodeIndices[n];this.physicsBody.forces[s]={x:0,y:0},void 0===this.physicsBody.velocities[s]&&(this.physicsBody.velocities[s]={x:0,y:0})}for(var r in this.physicsBody.velocities)void 0===t[r]&&delete this.physicsBody.velocities[r]}},{key:"revert",value:function(){var t=(0,s.default)(this.previousStates),e=this.body.nodes,i=this.physicsBody.velocities;this.referenceState={};for(var o=0;o<t.length;o++){var n=t[o];void 0!==e[n]?!0===e[n].options.physics&&(this.referenceState[n]={positions:{x:e[n].x,y:e[n].y}},i[n].x=this.previousStates[n].vx,i[n].y=this.previousStates[n].vy,e[n].x=this.previousStates[n].x,e[n].y=this.previousStates[n].y):delete this.previousStates[n]}}},{key:"_evaluateStepQuality",value:function(){var t=void 0,e=void 0,i=this.body.nodes,o=this.referenceState;for(var n in this.referenceState)if(this.referenceState.hasOwnProperty(n)&&void 0!==i[n]&&(t=i[n].x-o[n].positions.x,e=i[n].y-o[n].positions.y,Math.sqrt(Math.pow(t,2)+Math.pow(e,2))>.3))return!1;return!0}},{key:"moveNodes",value:function(){for(var t=this.physicsBody.physicsNodeIndices,e=0,i=0,o=0;o<t.length;o++){var n=t[o],s=this._performStep(n);e=Math.max(e,s),i+=s}this.adaptiveTimestepEnabled=i/t.length<5,this.stabilized=e<this.options.minVelocity}},{key:"calculateComponentVelocity",value:function(t,e,i){t+=(e-this.modelOptions.damping*t)/i*this.timestep;var o=this.options.maxVelocity||1e9;return Math.abs(t)>o&&(t=t>0?o:-o),t}},{key:"_performStep",value:function(t){var e=this.body.nodes[t],i=this.physicsBody.forces[t],o=this.physicsBody.velocities[t];return this.previousStates[t]={x:e.x,y:e.y,vx:o.x,vy:o.y},!1===e.options.fixed.x?(o.x=this.calculateComponentVelocity(o.x,i.x,e.options.mass),e.x+=o.x*this.timestep):(i.x=0,o.x=0),!1===e.options.fixed.y?(o.y=this.calculateComponentVelocity(o.y,i.y,e.options.mass),e.y+=o.y*this.timestep):(i.y=0,o.y=0),Math.sqrt(Math.pow(o.x,2)+Math.pow(o.y,2))}},{key:"_freezeNodes",value:function(){var t=this.body.nodes;for(var e in t)if(t.hasOwnProperty(e)&&t[e].x&&t[e].y){var i=t[e].options.fixed;this.freezeCache[e]={x:i.x,y:i.y},i.x=!0,i.y=!0}}},{key:"_restoreFrozenNodes",value:function(){var t=this.body.nodes;for(var e in t)t.hasOwnProperty(e)&&void 0!==this.freezeCache[e]&&(t[e].options.fixed.x=this.freezeCache[e].x,t[e].options.fixed.y=this.freezeCache[e].y);this.freezeCache={}}},{key:"stabilize",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.stabilization.iterations;if("number"!=typeof e&&(e=this.options.stabilization.iterations,console.log("The stabilize method needs a numeric amount of iterations. Switching to default: ",e)),0===this.physicsBody.physicsNodeIndices.length)return void(this.ready=!0);this.adaptiveTimestep=this.options.adaptiveTimestep,this.body.emitter.emit("_resizeNodes"),this.stopSimulation(),this.stabilized=!1,this.body.emitter.emit("_blockRedraw"),this.targetIterations=e,!0===this.options.stabilization.onlyDynamicEdges&&this._freezeNodes(),this.stabilizationIterations=0,setTimeout(function(){return t._stabilizationBatch()},0)}},{key:"_startStabilizing",value:function(){return!0!==this.startedStabilization&&(this.body.emitter.emit("startStabilizing"),this.startedStabilization=!0,!0)}},{key:"_stabilizationBatch",value:function(){var t=this,e=function(){return!1===t.stabilized&&t.stabilizationIterations<t.targetIterations},i=function(){t.body.emitter.emit("stabilizationProgress",{iterations:t.stabilizationIterations,total:t.targetIterations})};this._startStabilizing()&&i();for(var o=0;e()&&o<this.options.stabilization.updateInterval;)this.physicsTick(),o++;i(),e()?setTimeout(this._stabilizationBatch.bind(this),0):this._finalizeStabilization()}},{key:"_finalizeStabilization",value:function(){this.body.emitter.emit("_allowRedraw"),!0===this.options.stabilization.fit&&this.body.emitter.emit("fit"),!0===this.options.stabilization.onlyDynamicEdges&&this._restoreFrozenNodes(),this.body.emitter.emit("stabilizationIterationsDone"),this.body.emitter.emit("_requestRedraw"),!0===this.stabilized?this._emitStabilized():this.startSimulation(),this.ready=!0}},{key:"_drawForces",value:function(t){for(var e=0;e<this.physicsBody.physicsNodeIndices.length;e++){var i=this.physicsBody.physicsNodeIndices[e],o=this.body.nodes[i],n=this.physicsBody.forces[i],s=Math.sqrt(Math.pow(n.x,2)+Math.pow(n.x,2)),r=Math.min(Math.max(5,s),15),a=3*r,h=y.HSVToHex((180-180*Math.min(1,Math.max(0,.03*s)))/360,1,1),d={x:o.x+20*n.x,y:o.y+20*n.y};t.lineWidth=r,t.strokeStyle=h,t.beginPath(),t.moveTo(o.x,o.y),t.lineTo(d.x,d.y),t.stroke();var l=Math.atan2(n.y,n.x);t.fillStyle=h,b.draw(t,{type:"arrow",point:d,angle:l,length:a}),t.fill()}}}]),t}();e.default=_}
19298,function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.physicsBody=i,this.setOptions(o)}return(0,a.default)(t,[{key:"setOptions",value:function(t){this.options=t}},{key:"solve",value:function(){for(var t,e,i,o,n,s,r,a,h=this.body.nodes,d=this.physicsBody.physicsNodeIndices,l=this.physicsBody.forces,u=this.options.nodeDistance,c=-2/3/u,p=0;p<d.length-1;p++){r=h[d[p]];for(var f=p+1;f<d.length;f++)a=h[d[f]],t=a.x-r.x,e=a.y-r.y,i=Math.sqrt(t*t+e*e),0===i&&(i=.1*Math.random(),t=i),i<2*u&&(s=i<.5*u?1:c*i+4/3,s/=i,o=t*s,n=e*s,l[r.id].x-=o,l[r.id].y-=n,l[a.id].x+=o,l[a.id].y+=n)}}}]),t}();e.default=h},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.physicsBody=i,this.setOptions(o)}return(0,a.default)(t,[{key:"setOptions",value:function(t){this.options=t}},{key:"solve",value:function(){var t,e,i,o,n,s,r,a,h,d,l=this.body.nodes,u=this.physicsBody.physicsNodeIndices,c=this.physicsBody.forces,p=this.options.nodeDistance;for(h=0;h<u.length-1;h++)for(r=l[u[h]],d=h+1;d<u.length;d++)if(a=l[u[d]],r.level===a.level){t=a.x-r.x,e=a.y-r.y,i=Math.sqrt(t*t+e*e)
19299    ;s=i<p?-Math.pow(.05*i,2)+Math.pow(.05*p,2):0,0===i?i=.01:s/=i,o=t*s,n=e*s,c[r.id].x-=o,c[r.id].y-=n,c[a.id].x+=o,c[a.id].y+=n}}}]),t}();e.default=h},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.physicsBody=i,this.setOptions(o)}return(0,a.default)(t,[{key:"setOptions",value:function(t){this.options=t}},{key:"solve",value:function(){for(var t=void 0,e=void 0,i=this.physicsBody.physicsEdgeIndices,o=this.body.edges,n=void 0,s=void 0,r=void 0,a=0;a<i.length;a++)e=o[i[a]],!0===e.connected&&e.toId!==e.fromId&&void 0!==this.body.nodes[e.toId]&&void 0!==this.body.nodes[e.fromId]&&(void 0!==e.edgeType.via?(t=void 0===e.options.length?this.options.springLength:e.options.length,n=e.to,s=e.edgeType.via,r=e.from,this._calculateSpringForce(n,s,.5*t),this._calculateSpringForce(s,r,.5*t)):(t=void 0===e.options.length?1.5*this.options.springLength:e.options.length,this._calculateSpringForce(e.from,e.to,t)))}},{key:"_calculateSpringForce",value:function(t,e,i){var o=t.x-e.x,n=t.y-e.y,s=Math.max(Math.sqrt(o*o+n*n),.01),r=this.options.springConstant*(i-s)/s,a=o*r,h=n*r;void 0!==this.physicsBody.forces[t.id]&&(this.physicsBody.forces[t.id].x+=a,this.physicsBody.forces[t.id].y+=h),void 0!==this.physicsBody.forces[e.id]&&(this.physicsBody.forces[e.id].x-=a,this.physicsBody.forces[e.id].y-=h)}}]),t}();e.default=h},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.physicsBody=i,this.setOptions(o)}return(0,a.default)(t,[{key:"setOptions",value:function(t){this.options=t}},{key:"solve",value:function(){for(var t,e,i,o,n,s,r,a,h=this.body.edges,d=this.physicsBody.physicsEdgeIndices,l=this.physicsBody.physicsNodeIndices,u=this.physicsBody.forces,c=0;c<l.length;c++){var p=l[c];u[p].springFx=0,u[p].springFy=0}for(var f=0;f<d.length;f++)e=h[d[f]],!0===e.connected&&(t=void 0===e.options.length?this.options.springLength:e.options.length,i=e.from.x-e.to.x,o=e.from.y-e.to.y,a=Math.sqrt(i*i+o*o),a=0===a?.01:a,r=this.options.springConstant*(t-a)/a,n=i*r,s=o*r,e.to.level!=e.from.level?(void 0!==u[e.toId]&&(u[e.toId].springFx-=n,u[e.toId].springFy-=s),void 0!==u[e.fromId]&&(u[e.fromId].springFx+=n,u[e.fromId].springFy+=s)):(void 0!==u[e.toId]&&(u[e.toId].x-=.5*n,u[e.toId].y-=.5*s),void 0!==u[e.fromId]&&(u[e.fromId].x+=.5*n,u[e.fromId].y+=.5*s)));r=1;for(var m,v,g=0;g<l.length;g++){var y=l[g];m=Math.min(r,Math.max(-r,u[y].springFx)),v=Math.min(r,Math.max(-r,u[y].springFy)),u[y].x+=m,u[y].y+=v}for(var b=0,_=0,w=0;w<l.length;w++){var x=l[w];b+=u[x].x,_+=u[x].y}for(var k=b/l.length,S=_/l.length,D=0;D<l.length;D++){var M=l[D];u[M].x-=k,u[M].y-=S}}}]),t}();e.default=h}
19299,function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(120),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_calculateForces",value:function(t,e,i,o,n){0===t&&(t=.1*Math.random(),e=t),this.overlapAvoidanceFactor<1&&o.shape.radius&&(t=Math.max(.1+this.overlapAvoidanceFactor*o.shape.radius,t-o.shape.radius));var s=o.edges.length+1,r=this.options.gravitationalConstant*n.mass*o.options.mass*s/Math.pow(t,2),a=e*r,h=i*r;this.physicsBody.forces[o.id].x+=a,this.physicsBody.forces[o.id].y+=h}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(121),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_calculateForces",value:function(t,e,i,o,n){if(t>0){var s=n.edges.length+1,r=this.options.centralGravity*s*n.options.mass;o[n.id].x=e*r,o[n.id].y=i*r}}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(6),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(2),p=i(76).default,f=i(228).default,m=i(74).default,v=i(47).default,g=function(){function t(e){var i=this;(0,d.default)(this,t),this.body=e,this.clusteredNodes={},this.clusteredEdges={},this.options={},this.defaultOptions={},c.extend(this.options,this.defaultOptions),this.body.emitter.on("_resetData",function(){i.clusteredNodes={},i.clusteredEdges={}})}return(0,u.default)(t,[{key:"clusterByHubsize",value:function(t,e){void 0===t?t=this._getHubSize():"object"===(void 0===t?"undefined":(0,a.default)(t))&&(e=this._checkOptions(t),t=this._getHubSize());for(var i=[],o=0;o<this.body.nodeIndices.length;o++){var n=this.body.nodes[this.body.nodeIndices[o]];n.edges.length>=t&&i.push(n.id)}for(var s=0;s<i.length;s++)this.clusterByConnection(i[s],e,!0);this.body.emitter.emit("_dataChanged")}},{key:"cluster",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(void 0===e.joinCondition)throw new Error("Cannot call clusterByNodeData without a joinCondition function in the options.");e=this._checkOptions(e);var o={},n={};c.forEach(this.body.nodes,function(i,s){var r=p.cloneOptions(i);!0===e.joinCondition(r)&&(o[s]=i,c.forEach(i.edges,function(e){void 0===t.clusteredEdges[e.id]&&(n[e.id]=e)}))}),this._cluster(o,n,e,i)}},{key:"clusterByEdgeCount",value:function(t,e){var i=this,o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];e=this._checkOptions(e);for(var n=[],r={},a=void 0,h=void 0,d=void 0,l=0;l<this.body.nodeIndices.length;l++){var u,c,f;!function(o){var l={},m={},v=i.body.nodeIndices[o],g=i.body.nodes[v];if(void 0===r[v]){d=0,h=[];for(var y=0;y<g.edges.length;y++)a=g.edges[y],void 0===i.clusteredEdges[a.id]&&(a.toId!==a.fromId&&d++,h.push(a));if(d===t){u=function(t){if(void 0===e.joinCondition||null===e.joinCondition)return!0;var i=p.cloneOptions(t);return e.joinCondition(i)};for(var b=!0,_=0;_<h.length;_++){a=h[_];var w=i._getConnectedId(a,v);if(!u(g)){b=!1;break}m[a.id]=a,l[v]=g,l[w]=i.body.nodes[w],r[v]=!0}if((0,s.default)(l).length>0&&(0,s.default)(m).length>0&&!0===b)if(c=function(){for(var t=0;t<n.length;++t)for(var e in l)if(void 0!==n[t].nodes[e])return n[t]},void 0!==(f=c())){for(var x in l)void 0===f.nodes[x]&&(f.nodes[x]=l[x]);for(var k in m)void 0===f.edges[k]&&(f.edges[k]=m[k])}else n.push({nodes:l,edges:m})}}}(l)}for(var l=0;l<n.length;l++)this._cluster(n[l].nodes,n[l].edges,e,!1);!0===o&&this.body.emitter.emit("_dataChanged")}},{key:"clusterOutliers",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.clusterByEdgeCount(1,t,e)}},{key:"clusterBridges",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.clusterByEdgeCount(2,t,e)}},{key:"clusterByConnection",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0===t)throw new Error("No nodeId supplied to clusterByConnection!");if(void 0===this.body.nodes[t])throw new Error("The nodeId given to clusterByConnection does not exist!");var o=this.body.nodes[t];e=this._checkOptions(e,o),void 0===e.clusterNodeProperties.x&&(e.clusterNodeProperties.x=o.x),void 0===e.clusterNodeProperties.y&&(e.clusterNodeProperties.y=o.y),void 0===e.clusterNodeProperties.fixed&&(e.clusterNodeProperties.fixed={},e.clusterNodeProperties.fixed.x=o.options.fixed.x,e.clusterNodeProperties.fixed.y=o.options.fixed.y);var n={},r={},a=o.id,h=p.cloneOptions(o);n[a]=o;for(var d=0;d<o.edges.length;d++){var l=o.edges[d];if(void 0===this.clusteredEdges[l.id]){var u=this._getConnectedId(l,a);if(void 0===this.clusteredNodes[u])if(u!==a)if(void 0===e.joinCondition)r[l.id]=l,n[u]=this.body.nodes[u];else{var c=p.cloneOptions(this.body.nodes[u]);!0===e.joinCondition(h,c)&&(r[l.id]=l,n[u]=this.body.nodes[u])}else r[l.id]=l}}var f=(0,s.default)(n).map(function(t){return n[t].id});for(m in n)if(n.hasOwnProperty(m))for(var m=n[m],v=0;v<m.edges.length;v++){var g=m.edges[v];f.indexOf(this._getConnectedId(g,m.id))>-1&&(r[g.id]=g)}this._cluster(n,r,e,i)}}
19299,{key:"_createClusterEdges",value:function(t,e,i,o){for(var n=void 0,r=void 0,a=void 0,h=void 0,d=void 0,l=void 0,u=(0,s.default)(t),c=[],p=0;p<u.length;p++){r=u[p],a=t[r];for(var f=0;f<a.edges.length;f++)n=a.edges[f],void 0===this.clusteredEdges[n.id]&&(n.toId==n.fromId?e[n.id]=n:n.toId==r?(h=i.id,d=n.fromId,l=d):(h=n.toId,d=i.id,l=h),void 0===t[l]&&c.push({edge:n,fromId:d,toId:h}))}for(var m=[],v=0;v<c.length;v++){var g=c[v],y=g.edge,b=function(t){for(var e=0;e<m.length;e++){var i=m[e],o=t.fromId===i.fromId&&t.toId===i.toId,n=t.fromId===i.toId&&t.toId===i.fromId;if(o||n)return i}return null}(g);null===b?(b=this._createClusteredEdge(g.fromId,g.toId,y,o),m.push(b)):b.clusteringEdgeReplacingIds.push(y.id),this.body.edges[y.id].edgeReplacedById=b.id,this._backupEdgeOptions(y),y.setOptions({physics:!1})}}},{key:"_checkOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return void 0===t.clusterEdgeProperties&&(t.clusterEdgeProperties={}),void 0===t.clusterNodeProperties&&(t.clusterNodeProperties={}),t}},{key:"_cluster",value:function(t,e,i){var o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];if(0!=(0,s.default)(t).length&&(1!=(0,s.default)(t).length||1==i.clusterNodeProperties.allowSingleNodeCluster)){for(var n in t)if(t.hasOwnProperty(n)&&void 0!==this.clusteredNodes[n])return;var r=c.deepExtend({},i.clusterNodeProperties);if(void 0!==i.processProperties){var a=[];for(var h in t)if(t.hasOwnProperty(h)){var d=p.cloneOptions(t[h]);a.push(d)}var l=[];for(var u in e)if(e.hasOwnProperty(u)&&"clusterEdge:"!==u.substr(0,12)){var m=p.cloneOptions(e[u],"edge");l.push(m)}if(!(r=i.processProperties(r,a,l)))throw new Error("The processProperties function does not return properties!")}void 0===r.id&&(r.id="cluster:"+c.randomUUID());var v=r.id;void 0===r.label&&(r.label="cluster");var g=void 0;void 0===r.x&&(g=this._getClusterPosition(t),r.x=g.x),void 0===r.y&&(void 0===g&&(g=this._getClusterPosition(t)),r.y=g.y),r.id=v;var y=this.body.functions.createNode(r,f);y.containedNodes=t,y.containedEdges=e,y.clusterEdgeProperties=i.clusterEdgeProperties,this.body.nodes[r.id]=y,this._clusterEdges(t,e,r,i.clusterEdgeProperties),r.id=void 0,!0===o&&this.body.emitter.emit("_dataChanged")}}},{key:"_backupEdgeOptions",value:function(t){void 0===this.clusteredEdges[t.id]&&(this.clusteredEdges[t.id]={physics:t.options.physics})}},{key:"_restoreEdge",value:function(t){var e=this.clusteredEdges[t.id];void 0!==e&&(t.setOptions({physics:e.physics}),delete this.clusteredEdges[t.id])}},{key:"isCluster",value:function(t){return void 0!==this.body.nodes[t]?!0===this.body.nodes[t].isCluster:(console.log("Node does not exist."),!1)}},{key:"_getClusterPosition",value:function(t){for(var e=(0,s.default)(t),i=t[e[0]].x,o=t[e[0]].x,n=t[e[0]].y,r=t[e[0]].y,a=void 0,h=1;h<e.length;h++)a=t[e[h]],i=a.x<i?a.x:i,o=a.x>o?a.x:o,n=a.y<n?a.y:n,r=a.y>r?a.y:r;return{x:.5*(i+o),y:.5*(n+r)}}},{key:"openCluster",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0===t)throw new Error("No clusterNodeId supplied to openCluster.");var o=this.body.nodes[t];if(void 0===o)throw new Error("The clusterNodeId supplied to openCluster does not exist.");if(!0!==o.isCluster||void 0===o.containedNodes||void 0===o.containedEdges)throw new Error("The node:"+t+" is not a valid cluster.");var n=this.findNode(t),s=n.indexOf(t)-1;if(s>=0){var r=n[s];return this.body.nodes[r]._openChildCluster(t),delete this.body.nodes[t],void(!0===i&&this.body.emitter.emit("_dataChanged"))}var a=o.containedNodes,h=o.containedEdges;if(void 0!==e&&void 0!==e.releaseFunction&&"function"==typeof e.releaseFunction){var d={},l={x:o.x,y:o.y};for(var u in a)if(a.hasOwnProperty(u)){var p=this.body.nodes[u];d[u]={x:p.x,y:p.y}}var f=e.releaseFunction(l,d);for(var m in a)if(a.hasOwnProperty(m)){var v=this.body.nodes[m];void 0!==f[m]&&(v.x=void 0===f[m].x?o.x:f[m].x,v.y=void 0===f[m].y?o.y:f[m].y)}}else c.forEach(a,function(t){!1===t.options.fixed.x&&(t.x=o.x),!1===t.options.fixed.y&&(t.y=o.y)});for(var g in a)if(a.hasOwnProperty(g)){var y=this.body.nodes[g];y.vx=o.vx,y.vy=o.vy,y.setOptions({physics:!0}),delete this.clusteredNodes[g]}for(var b=[],_=0;_<o.edges.length;_++)b.push(o.edges[_]);for(var w=0;w<b.length;w++){for(var x=b[w],k=this._getConnectedId(x,t),S=this.clusteredNodes[k],D=0;D<x.clusteringEdgeReplacingIds.length;D++){var M=x.clusteringEdgeReplacingIds[D],C=this.body.edges[M];if(void 0!==C)if(void 0!==S){var O=this.body.nodes[S.clusterId];O.containedEdges[C.id]=C,delete h[C.id];var E=C.fromId,T=C.toId;C.toId==k?T=S.clusterId:E=S.clusterId,this._createClusteredEdge(E,T,C,O.clusterEdgeProperties,{hidden:!1,physics:!0})}else this._restoreEdge(C)}x.remove()}for(var P in h)h.hasOwnProperty(P)&&this._restoreEdge(h[P]);delete this.body.nodes[t],!0===i&&this.body.emitter.emit("_dataChanged")}},{key:"getNodesInCluster",value:function(t){var e=[];
19299if(!0===this.isCluster(t)){var i=this.body.nodes[t].containedNodes;for(var o in i)i.hasOwnProperty(o)&&e.push(this.body.nodes[o].id)}return e}},{key:"findNode",value:function(t){for(var e=[],i=0,o=void 0;void 0!==this.clusteredNodes[t]&&i<100;){if(void 0===(o=this.body.nodes[t]))return[];e.push(o.id),t=this.clusteredNodes[t].clusterId,i++}return void 0===(o=this.body.nodes[t])?[]:(e.push(o.id),e.reverse(),e)}},{key:"updateClusteredNode",value:function(t,e){if(void 0===t)throw new Error("No clusteredNodeId supplied to updateClusteredNode.");if(void 0===e)throw new Error("No newOptions supplied to updateClusteredNode.");if(void 0===this.body.nodes[t])throw new Error("The clusteredNodeId supplied to updateClusteredNode does not exist.");this.body.nodes[t].setOptions(e),this.body.emitter.emit("_dataChanged")}},{key:"updateEdge",value:function(t,e){if(void 0===t)throw new Error("No startEdgeId supplied to updateEdge.");if(void 0===e)throw new Error("No newOptions supplied to updateEdge.");if(void 0===this.body.edges[t])throw new Error("The startEdgeId supplied to updateEdge does not exist.");for(var i=this.getClusteredEdges(t),o=0;o<i.length;o++){this.body.edges[i[o]].setOptions(e)}this.body.emitter.emit("_dataChanged")}},{key:"getClusteredEdges",value:function(t){for(var e=[],i=0;void 0!==t&&void 0!==this.body.edges[t]&&i<100;)e.push(this.body.edges[t].id),t=this.body.edges[t].edgeReplacedById,i++;return e.reverse(),e}},{key:"getBaseEdge",value:function(t){return this.getBaseEdges(t)[0]}},{key:"getBaseEdges",value:function(t){for(var e=[t],i=[],o=[],n=0;e.length>0&&n<100;){var s=e.pop();if(void 0!==s){var r=this.body.edges[s];if(void 0!==r){n++;var a=r.clusteringEdgeReplacingIds;if(void 0===a)o.push(s);else for(var h=0;h<a.length;++h){var d=a[h];-1===e.indexOf(a)&&-1===i.indexOf(a)&&e.push(d)}i.push(s)}}}return o}},{key:"_getConnectedId",value:function(t,e){return t.toId!=e?t.toId:(t.fromId,t.fromId)}},{key:"_getHubSize",value:function(){for(var t=0,e=0,i=0,o=0,n=0;n<this.body.nodeIndices.length;n++){var s=this.body.nodes[this.body.nodeIndices[n]];s.edges.length>o&&(o=s.edges.length),t+=s.edges.length,e+=Math.pow(s.edges.length,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r),h=Math.floor(t+2*a);return h>o&&(h=o),h}},{key:"_createClusteredEdge",value:function(t,e,i,o,n){var s=p.cloneOptions(i,"edge");c.deepExtend(s,o),s.from=t,s.to=e,s.id="clusterEdge:"+c.randomUUID(),void 0!==n&&c.deepExtend(s,n);var r=this.body.functions.createEdge(s);return r.clusteringEdgeReplacingIds=[i.id],r.connect(),this.body.edges[r.id]=r,r}},{key:"_clusterEdges",value:function(t,e,i,o){if(e instanceof m){var n=e,s={};s[n.id]=n,e=s}if(t instanceof v){var r=t,a={};a[r.id]=r,t=a}if(void 0===i||null===i)throw new Error("_clusterEdges: parameter clusterNode required");void 0===o&&(o=i.clusterEdgeProperties),this._createClusterEdges(t,e,i,o);for(var h in e)if(e.hasOwnProperty(h)&&void 0!==this.body.edges[h]){var d=this.body.edges[h];this._backupEdgeOptions(d),d.setOptions({physics:!1})}for(var l in t)t.hasOwnProperty(l)&&(this.clusteredNodes[l]={clusterId:i.id,node:this.body.nodes[l]},this.body.nodes[l].setOptions({physics:!1}))}},{key:"_getClusterNodeForNode",value:function(t){if(void 0!==t){var e=this.clusteredNodes[t];if(void 0!==e){var i=e.clusterId;if(void 0!==i)return this.body.nodes[i]}}}},{key:"_filter",value:function(t,e){var i=[];return c.forEach(t,function(t){e(t)&&i.push(t)}),i}},{key:"_updateState",value:function(){var t=this,e=void 0,i=[],o=[],n=function(e){c.forEach(t.body.nodes,function(t){!0===t.isCluster&&e(t)})};for(e in this.clusteredNodes)if(this.clusteredNodes.hasOwnProperty(e)){var r=this.body.nodes[e];void 0===r&&i.push(e)}n(function(t){for(var e=0;e<i.length;e++)delete t.containedNodes[i[e]]});for(var a=0;a<i.length;a++)delete this.clusteredNodes[i[a]];c.forEach(this.clusteredEdges,function(e){var i=t.body.edges[e];void 0!==i&&i.endPointsValid()||o.push(e)}),n(function(t){c.forEach(t.containedEdges,function(t,e){t.endPointsValid()||-1!==o.indexOf(e)||o.push(e)})}),c.forEach(this.body.edges,function(e,i){var n=!0,s=e.clusteringEdgeReplacingIds;if(void 0!==s){var r=0;
19299c.forEach(s,function(e){var i=t.body.edges[e];void 0!==i&&i.endPointsValid()&&(r+=1)}),n=r>0}e.endPointsValid()&&n||o.push(i)}),n(function(e){c.forEach(o,function(i){delete e.containedEdges[i],c.forEach(e.edges,function(n,s){if(n.id===i)return void(e.edges[s]=null);n.clusteringEdgeReplacingIds=t._filter(n.clusteringEdgeReplacingIds,function(t){return-1===o.indexOf(t)})}),e.edges=t._filter(e.edges,function(t){return null!==t})})}),c.forEach(o,function(e){delete t.clusteredEdges[e]}),c.forEach(o,function(e){delete t.body.edges[e]});var h=(0,s.default)(this.body.edges);c.forEach(h,function(e){var i=t.body.edges[e],o=t._isClusteredNode(i.fromId)||t._isClusteredNode(i.toId);if(o!==t._isClusteredEdge(i.id)){if(!o)throw new Error("remove edge from clustering not implemented!");var n=t._getClusterNodeForNode(i.fromId);void 0!==n&&t._clusterEdges(t.body.nodes[i.fromId],i,n);var s=t._getClusterNodeForNode(i.toId);void 0!==s&&t._clusterEdges(t.body.nodes[i.toId],i,s)}});for(var d=!1,l=!0;l;)!function(){var e=[];n(function(t){var i=(0,s.default)(t.containedNodes).length,o=!0===t.options.allowSingleNodeCluster;(o&&i<1||!o&&i<2)&&e.push(t.id)});for(var i=0;i<e.length;++i)t.openCluster(e[i],{},!1);l=e.length>0,d=d||l}();d&&this._updateState()}},{key:"_isClusteredNode",value:function(t){return void 0!==this.clusteredNodes[t]}},{key:"_isClusteredEdge",value:function(t){return void 0!==this.clusteredEdges[t]}}]),t}();e.default=g},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(2),m=i(47).default,v=function(t){function e(t,i,o,n,r,h){(0,a.default)(this,e);var d=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o,n,r,h));return d.isCluster=!0,d.containedNodes={},d.containedEdges={},d}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_openChildCluster",value:function(t){var e=this,i=this.body.nodes[t];
19299if(void 0===this.containedNodes[t])throw new Error("node with id: "+t+" not in current cluster");if(!i.isCluster)throw new Error("node with id: "+t+" is not a cluster");delete this.containedNodes[t],f.forEach(i.edges,function(t){delete e.containedEdges[t.id]}),f.forEach(i.containedNodes,function(t,i){e.containedNodes[i]=t}),i.containedNodes={},f.forEach(i.containedEdges,function(t,i){e.containedEdges[i]=t}),i.containedEdges={},f.forEach(i.edges,function(t){f.forEach(e.edges,function(i){var o=i.clusteringEdgeReplacingIds.indexOf(t.id);-1!==o&&(f.forEach(t.clusteringEdgeReplacingIds,function(t){i.clusteringEdgeReplacingIds.push(t),e.body.edges[t].edgeReplacedById=i.id}),i.clusteringEdgeReplacingIds.splice(o,1))})}),i.edges=[]}}]),e}(m);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(){var t;void 0!==window&&(t=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame),window.requestAnimationFrame=void 0===t?function(t){t()}:t}Object.defineProperty(e,"__esModule",{value:!0});var s=i(0),r=o(s),a=i(1),h=o(a),d=i(2),l=function(){function t(e,i){(0,r.default)(this,t),n(),this.body=e,this.canvas=i,this.redrawRequested=!1,this.renderTimer=void 0,this.requiresTimeout=!0,this.renderingActive=!1,this.renderRequests=0,this.allowRedraw=!0,this.dragging=!1,this.options={},this.defaultOptions={hideEdgesOnDrag:!1,hideNodesOnDrag:!1},d.extend(this.options,this.defaultOptions),this._determineBrowserMethod(),this.bindEventListeners()}return(0,h.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("dragStart",function(){t.dragging=!0}),this.body.emitter.on("dragEnd",function(){t.dragging=!1}),this.body.emitter.on("_resizeNodes",function(){t._resizeNodes()}),this.body.emitter.on("_redraw",function(){!1===t.renderingActive&&t._redraw()}),this.body.emitter.on("_blockRedraw",function(){t.allowRedraw=!1}),this.body.emitter.on("_allowRedraw",function(){t.allowRedraw=!0,t.redrawRequested=!1}),this.body.emitter.on("_requestRedraw",this._requestRedraw.bind(this)),this.body.emitter.on("_startRendering",function(){t.renderRequests+=1,t.renderingActive=!0,t._startRendering()}),this.body.emitter.on("_stopRendering",function(){t.renderRequests-=1,t.renderingActive=t.renderRequests>0,t.renderTimer=void 0}),this.body.emitter.on("destroy",function(){t.renderRequests=0,t.allowRedraw=!1,t.renderingActive=!1,!0===t.requiresTimeout?clearTimeout(t.renderTimer):window.cancelAnimationFrame(t.renderTimer),t.body.emitter.off()})}},{key:"setOptions",value:function(t){if(void 0!==t){var e=["hideEdgesOnDrag","hideNodesOnDrag"];d.selectiveDeepExtend(e,this.options,t)}}},{key:"_requestNextFrame",value:function(t,e){if("undefined"!=typeof window){var i=void 0,o=window;return!0===this.requiresTimeout?i=o.setTimeout(t,e):o.requestAnimationFrame&&(i=o.requestAnimationFrame(t)),i}}},{key:"_startRendering",value:function(){!0===this.renderingActive&&void 0===this.renderTimer&&(this.renderTimer=this._requestNextFrame(this._renderStep.bind(this),this.simulationInterval))}},{key:"_renderStep",value:function(){!0===this.renderingActive&&(this.renderTimer=void 0,!0===this.requiresTimeout&&this._startRendering(),this._redraw(),!1===this.requiresTimeout&&this._startRendering())}},{key:"redraw",value:function(){this.body.emitter.emit("setSize"),this._redraw()}},{key:"_requestRedraw",value:function(){var t=this;!0!==this.redrawRequested&&!1===this.renderingActive&&!0===this.allowRedraw&&(this.redrawRequested=!0,this._requestNextFrame(function(){t._redraw(!1)},0))}},{key:"_redraw",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!0===this.allowRedraw){this.body.emitter.emit("initRedraw"),this.redrawRequested=!1,0!==this.canvas.frame.canvas.width&&0!==this.canvas.frame.canvas.height||this.canvas.setSize(),this.canvas.setTransform();var e=this.canvas.getContext(),i=this.canvas.frame.canvas.clientWidth,o=this.canvas.frame.canvas.clientHeight;if(e.clearRect(0,0,i,o),0===this.canvas.frame.clientWidth)return;e.save(),e.translate(this.body.view.translation.x,this.body.view.translation.y),e.scale(this.body.view.scale,this.body.view.scale),e.beginPath(),this.body.emitter.emit("beforeDrawing",e),e.closePath(),!1===t&&(!1===this.dragging||!0===this.dragging&&!1===this.options.hideEdgesOnDrag)&&this._drawEdges(e),(!1===this.dragging||!0===this.dragging&&!1===this.options.hideNodesOnDrag)&&this._drawNodes(e,t),e.beginPath(),this.body.emitter.emit("afterDrawing",e),e.closePath(),e.restore(
19299),!0===t&&e.clearRect(0,0,i,o)}}},{key:"_resizeNodes",value:function(){this.canvas.setTransform();var t=this.canvas.getContext();t.save(),t.translate(this.body.view.translation.x,this.body.view.translation.y),t.scale(this.body.view.scale,this.body.view.scale);var e=this.body.nodes,i=void 0;for(var o in e)e.hasOwnProperty(o)&&(i=e[o],i.resize(t),i.updateBoundingBox(t,i.selected));t.restore()}},{key:"_drawNodes",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.nodes,o=this.body.nodeIndices,n=void 0,s=[],r=this.canvas.DOMtoCanvas({x:-20,y:-20}),a=this.canvas.DOMtoCanvas({x:this.canvas.frame.canvas.clientWidth+20,y:this.canvas.frame.canvas.clientHeight+20}),h={top:r.y,left:r.x,bottom:a.y,right:a.x},d=0;d<o.length;d++)n=i[o[d]],n.isSelected()?s.push(o[d]):!0===e?n.draw(t):!0===n.isBoundingBoxOverlappingWith(h)?n.draw(t):n.updateBoundingBox(t,n.selected);for(var l=0;l<s.length;l++)n=i[s[l]],n.draw(t)}},{key:"_drawEdges",value:function(t){for(var e=this.body.edges,i=this.body.edgeIndices,o=void 0,n=0;n<i.length;n++)o=e[i[n]],!0===o.connected&&o.draw(t)}},{key:"_determineBrowserMethod",value:function(){if("undefined"!=typeof window){var t=navigator.userAgent.toLowerCase();this.requiresTimeout=!1,-1!=t.indexOf("msie 9.0")?this.requiresTimeout=!0:-1!=t.indexOf("safari")&&t.indexOf("chrome")<=-1&&(this.requiresTimeout=!0)}else this.requiresTimeout=!0}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(10),d=i(37),l=i(2),u=function(){function t(e){(0,s.default)(this,t),this.body=e,this.pixelRatio=1,this.resizeTimer=void 0,this.resizeFunction=this._onResize.bind(this),this.cameraState={},this.initialized=!1,this.canvasViewCenter={},this.options={},this.defaultOptions={autoResize:!0,height:"100%",width:"100%"},l.extend(this.options,this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.once("resize",function(e){0!==e.width&&(t.body.view.translation.x=.5*e.width),0!==e.height&&(t.body.view.translation.y=.5*e.height)}),this.body.emitter.on("setSize",this.setSize.bind(this)),this.body.emitter.on("destroy",function(){t.hammerFrame.destroy(),t.hammer.destroy(),t._cleanUp()})}},{key:"setOptions",value:function(t){var e=this;if(void 0!==t){var i=["width","height","autoResize"];l.selectiveDeepExtend(i,this.options,t)}!0===this.options.autoResize&&(this._cleanUp(),this.resizeTimer=setInterval(function(){!0===e.setSize()&&e.body.emitter.emit("_requestRedraw")},1e3),this.resizeFunction=this._onResize.bind(this),l.addEventListener(window,"resize",this.resizeFunction))}},{key:"_cleanUp",value:function(){void 0!==this.resizeTimer&&clearInterval(this.resizeTimer),l.removeEventListener(window,"resize",this.resizeFunction),this.resizeFunction=void 0}},{key:"_onResize",value:function(){this.setSize(),this.body.emitter.emit("_redraw")}},{key:"_getCameraState",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.pixelRatio;!0===this.initialized&&(this.cameraState.previousWidth=this.frame.canvas.width/t,this.cameraState.previousHeight=this.frame.canvas.height/t,this.cameraState.scale=this.body.view.scale,this.cameraState.position=this.DOMtoCanvas({x:.5*this.frame.canvas.width/t,y:.5*this.frame.canvas.height/t}))}},{key:"_setCameraState",value:function(){if(void 0!==this.cameraState.scale&&0!==this.frame.canvas.clientWidth&&0!==this.frame.canvas.clientHeight&&0!==this.pixelRatio&&this.cameraState.previousWidth>0){var t=this.frame.canvas.width/this.pixelRatio/this.cameraState.previousWidth,e=this.frame.canvas.height/this.pixelRatio/this.cameraState.previousHeight,i=this.cameraState.scale;1!=t&&1!=e?i=.5*this.cameraState.scale*(t+e):1!=t?i=this.cameraState.scale*t:1!=e&&(i=this.cameraState.scale*e),this.body.view.scale=i;var o=this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight}),n={x:o.x-this.cameraState.position.x,y:o.y-this.cameraState.position.y};this.body.view.translation.x+=n.x*this.body.view.scale,this.body.view.translation.y+=n.y*this.body.view.scale}}},{key:"_prepareValue",value:function(t){if("number"==typeof t)return t+"px";if("string"==typeof t){if(-1!==t.indexOf("%")||-1!==t.indexOf("px"))return t;if(-1===t.indexOf("%"))return t+"px"}throw new Error("Could not use the value supplied for width or height:"+t)}},{key:"_create",value:function(){for(;this.body.container.hasChildNodes();)this.body.container.removeChild(this.body.container.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis-network",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.tabIndex=900,this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),this.frame.canvas.getContext)this._setPixelRatio(),this.setTransform();else{var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t)}this.body.container.appendChild(this.frame),this.body.view.scale=1,this.body.view.translation={x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight},this._bindHammer()}},{key:"_bindHammer",value:function(){var t=this;void 0!==this.hammer&&this.hammer.destroy(),this.drag={},this.pinch={},this.hammer=new h(this.frame.canvas),this.hammer.get("pinch").set({enable:!0}),this.hammer.get("pan").set({threshold:5,direction:h.DIRECTION_ALL}),d.onTouch(this.hammer,function(e){t.body.eventListeners.onTouch(e)}),this.hammer.on("tap",function(e){t.body.eventListeners.onTap(e)}),this.hammer.on("doubletap",function(e){t.body.eventListeners.onDoubleTap(e)}),this.hammer.on("press",function(e){t.body.eventListeners.onHold(e)}),this.hammer.on("panstart",function(e){t.body.eventListeners.onDragStart(e)}),this.hammer.on("panmove",function(e){t.body.eventListeners.onDrag(e)}),this.hammer.on("panend",function(e){t.body.eventListeners.onDragEnd(e)}),this.hammer.on("pinch",function(e){t.body.eventListeners.onPinch(e)}),this.frame.canvas.addEventListener("mousewheel",function(e){t.body.eventListeners.onMouseWheel(e)}),this.frame.canvas.addEventListener("DOMMouseScroll",function(e){t.body.eventListeners.onMouseWheel(e)}),this.frame.canvas.addEventListener("mousemove",function(e){t.body.eventListeners.onMouseMove(e)}),this.frame.canvas.addEventListener("contextmenu",function(e){t.body.eventListeners.onContext(e)}
19299),this.hammerFrame=new h(this.frame),d.onRelease(this.hammerFrame,function(e){t.body.eventListeners.onRelease(e)})}},{key:"setSize",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.width,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.height;t=this._prepareValue(t),e=this._prepareValue(e);var i=!1,o=this.frame.canvas.width,n=this.frame.canvas.height,s=this.pixelRatio;if(this._setPixelRatio(),t!=this.options.width||e!=this.options.height||this.frame.style.width!=t||this.frame.style.height!=e)this._getCameraState(s),this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),this.frame.canvas.height=Math.round(this.frame.canvas.clientHeight*this.pixelRatio),this.options.width=t,this.options.height=e,this.canvasViewCenter={x:.5*this.frame.clientWidth,y:.5*this.frame.clientHeight},i=!0;else{var r=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),a=Math.round(this.frame.canvas.clientHeight*this.pixelRatio);this.frame.canvas.width===r&&this.frame.canvas.height===a||this._getCameraState(s),
19300    this.frame.canvas.width!==r&&(this.frame.canvas.width=r,i=!0),this.frame.canvas.height!==a&&(this.frame.canvas.height=a,i=!0)}return!0===i&&(this.body.emitter.emit("resize",{width:Math.round(this.frame.canvas.width/this.pixelRatio),height:Math.round(this.frame.canvas.height/this.pixelRatio),oldWidth:Math.round(o/this.pixelRatio),oldHeight:Math.round(n/this.pixelRatio)}),this._setCameraState()),this.initialized=!0,i}},{key:"getContext",value:function(){return this.frame.canvas.getContext("2d")}},{key:"_determinePixelRatio",value:function(){var t=this.getContext();if(void 0===t)throw new Error("Could not get canvax context");var e=1;return"undefined"!=typeof window&&(e=window.devicePixelRatio||1),e/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)}},{key:"_setPixelRatio",value:function(){this.pixelRatio=this._determinePixelRatio()}},{key:"setTransform",value:function(){var t=this.getContext();if(void 0===t)throw new Error("Could not get canvax context");t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}},{key:"_XconvertDOMtoCanvas",value:function(t){return(t-this.body.view.translation.x)/this.body.view.scale}},{key:"_XconvertCanvasToDOM",value:function(t){return t*this.body.view.scale+this.body.view.translation.x}},{key:"_YconvertDOMtoCanvas",value:function(t){return(t-this.body.view.translation.y)/this.body.view.scale}},{key:"_YconvertCanvasToDOM",value:function(t){return t*this.body.view.scale+this.body.view.translation.y}},{key:"canvasToDOM",value:function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}}},{key:"DOMtoCanvas",value:function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(76).default,l=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.animationSpeed=1/this.renderRefreshRate,this.animationEasingFunction="easeInOutQuint",this.easingTime=0,this.sourceScale=0,this.targetScale=0,this.sourceTranslation=0,this.targetTranslation=0,this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0,this.touchTime=0,this.viewFunction=void 0,this.body.emitter.on("fit",this.fit.bind(this)),this.body.emitter.on("animationFinished",function(){o.body.emitter.emit("_stopRendering")}),this.body.emitter.on("unlockNode",this.releaseNode.bind(this))}return(0,a.default)(t,[{key:"setOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options=t}},{key:"fit",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{nodes:[]},e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=void 0,o=void 0;if(void 0!==t.nodes&&0!==t.nodes.length||(t.nodes=this.body.nodeIndices),!0===e){var n=0;for(var s in this.body.nodes)if(this.body.nodes.hasOwnProperty(s)){var r=this.body.nodes[s];!0===r.predefinedPosition&&(n+=1)}if(n>.5*this.body.nodeIndices.length)return void this.fit(t,!1);i=d.getRange(this.body.nodes,t.nodes);o=12.662/(this.body.nodeIndices.length+7.4147)+.0964822;o*=Math.min(this.canvas.frame.canvas.clientWidth/600,this.canvas.frame.canvas.clientHeight/600)}else{this.body.emitter.emit("_resizeNodes"),i=d.getRange(this.body.nodes,t.nodes);var a=1.1*Math.abs(i.maxX-i.minX),h=1.1*Math.abs(i.maxY-i.minY),l=this.canvas.frame.canvas.clientWidth/a,u=this.canvas.frame.canvas.clientHeight/h;o=l<=u?l:u}o>1?o=1:0===o&&(o=1);var c=d.findCenter(i),p={position:c,scale:o,animation:t.animation};this.moveTo(p)}},{key:"focus",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(void 0!==this.body.nodes[t]){var i={x:this.body.nodes[t].x,y:this.body.nodes[t].y};e.position=i,e.lockedOnNode=t,this.moveTo(e)}else console.log("Node: "+t+" cannot be found.")}},{key:"moveTo",value:function(t){if(void 0===t)return void(t={});void 0===t.offset&&(t.offset={x:0,y:0}),void 0===t.offset.x&&(t.offset.x=0),void 0===t.offset.y&&(t.offset.y=0),void 0===t.scale&&(t.scale=this.body.view.scale),void 0===t.position&&(t.position=this.getViewPosition()),void 0===t.animation&&(t.animation={duration:0}),!1===t.animation&&(t.animation={duration:0}),!0===t.animation&&(t.animation={}),void 0===t.animation.duration&&(t.animation.duration=1e3),void 0===t.animation.easingFunction&&(t.animation.easingFunction="easeInOutQuad"),this.animateView(t)}},{key:"animateView",value:function(t){if(void 0!==t){this.animationEasingFunction=t.animation.easingFunction,this.releaseNode(),!0===t.locked&&(this.lockedOnNodeId=t.lockedOnNode,this.lockedOnNodeOffset=t.offset),0!=this.easingTime&&this._transitionRedraw(!0),this.sourceScale=this.body.view.scale,this.sourceTranslation=this.body.view.translation,this.targetScale=t.scale,this.body.view.scale=this.targetScale;var e=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:e.x-t.position.x,y:e.y-t.position.y};this.targetTranslation={x:this.sourceTranslation.x+i.x*this.targetScale+t.offset.x,y:this.sourceTranslation.y+i.y*this.targetScale+t.offset.y},0===t.animation.duration?void 0!=this.lockedOnNodeId?(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)):(this.body.view.scale=this.targetScale,this.body.view.translation=this.targetTranslation,this.body.emitter.emit("_requestRedraw")):(this.animationSpeed=1/(60*t.animation.duration*.001)||1/60,this.animationEasingFunction=t.animation.easingFunction,this.viewFunction=this._transitionRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))}}},{key:"_lockedRedraw",value:function(){var t={x:this.body.nodes[this.lockedOnNodeId].x,y:this.body.nodes[this.lockedOnNodeId].y},e=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:e.x-t.x,y:e.y-t.y},o=this.body.view.translation,n={x:o.x+i.x*this.body.view.scale+this.lockedOnNodeOffset.x,y:o.y+i.y*this.body.view.scale+this.lockedOnNodeOffset.y};this.body.view.translation=n}},{key:"releaseNode",value:function(){void 0!==this.lockedOnNodeId&&void 0!==this.viewFunction&&(this.body.emitter.off("initRedraw",this.viewFunction),this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0)}},{key:"_transitionRedraw",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.easingTime+=this.animationSpeed,this.easingTime=!0===t?1:this.easingTime;var e=h.easingFunctions[this.animationEasingFunction](this.easingTime);this.body.view.scale=this.sourceScale+(this.targetScale-this.sourceScale)*e,this.body.view.translation={x:this.sourceTranslation.x+(this.targetTranslation.x-this.sourceTranslation.x)*e,y:this.sourceTranslation.y+(this.targetTranslation.y-this.sourceTranslation.y)*e},this.easingTime>=1&&(this.body.emitter.off("initRedraw",this.viewFunction),this.easingTime=0,void 0!=this.lockedOnNodeId&&(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)),this.body.emitter.emit("animationFinished"))}},{key:"getScale",value:function(){return this.body.view.scale}},{key:"getViewPosition",value:function(){return this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight})}}]),t}();e.default=l}
19300,function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(233).default,l=i(104).default,u=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.canvas=i,this.selectionHandler=o,this.navigationHandler=new d(e,i),this.body.eventListeners.onTap=this.onTap.bind(this),this.body.eventListeners.onTouch=this.onTouch.bind(this),this.body.eventListeners.onDoubleTap=this.onDoubleTap.bind(this),this.body.eventListeners.onHold=this.onHold.bind(this),this.body.eventListeners.onDragStart=this.onDragStart.bind(this),this.body.eventListeners.onDrag=this.onDrag.bind(this),this.body.eventListeners.onDragEnd=this.onDragEnd.bind(this),this.body.eventListeners.onMouseWheel=this.onMouseWheel.bind(this),this.body.eventListeners.onPinch=this.onPinch.bind(this),this.body.eventListeners.onMouseMove=this.onMouseMove.bind(this),this.body.eventListeners.onRelease=this.onRelease.bind(this),this.body.eventListeners.onContext=this.onContext.bind(this),this.touchTime=0,this.drag={},this.pinch={},this.popup=void 0,this.popupObj=void 0,this.popupTimer=void 0,this.body.functions.getPointer=this.getPointer.bind(this),this.options={},this.defaultOptions={dragNodes:!0,dragView:!0,hover:!1,keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02},bindToWindow:!0},navigationButtons:!1,tooltipDelay:300,zoomView:!0},h.extend(this.options,this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("destroy",function(){clearTimeout(t.popupTimer),delete t.body.functions.getPointer})}},{key:"setOptions",value:function(t){if(void 0!==t){var e=["hideEdgesOnDrag","hideNodesOnDrag","keyboard","multiselect","selectable","selectConnectedEdges"];h.selectiveNotDeepExtend(e,this.options,t),h.mergeOptions(this.options,t,"keyboard"),t.tooltip&&(h.extend(this.options.tooltip,t.tooltip),t.tooltip.color&&(this.options.tooltip.color=h.parseColor(t.tooltip.color)))}this.navigationHandler.setOptions(this.options)}},{key:"getPointer",value:function(t){return{x:t.x-h.getAbsoluteLeft(this.canvas.frame.canvas),y:t.y-h.getAbsoluteTop(this.canvas.frame.canvas)}}},{key:"onTouch",value:function(t){(new Date).valueOf()-this.touchTime>50&&(this.drag.pointer=this.getPointer(t.center),this.drag.pinched=!1,this.pinch.scale=this.body.view.scale,this.touchTime=(new Date).valueOf())}},{key:"onTap",value:function(t){var e=this.getPointer(t.center),i=this.selectionHandler.options.multiselect&&(t.changedPointers[0].ctrlKey||t.changedPointers[0].metaKey);this.checkSelectionChanges(e,t,i),this.selectionHandler._generateClickEvent("click",t,e)}},{key:"onDoubleTap",value:function(t){var e=this.getPointer(t.center);this.selectionHandler._generateClickEvent("doubleClick",t,e)}},{key:"onHold",value:function(t){var e=this.getPointer(t.center),i=this.selectionHandler.options.multiselect;this.checkSelectionChanges(e,t,i),this.selectionHandler._generateClickEvent("click",t,e),this.selectionHandler._generateClickEvent("hold",t,e)}},{key:"onRelease",value:function(t){if((new Date).valueOf()-this.touchTime>10){var e=this.getPointer(t.center);this.selectionHandler._generateClickEvent("release",t,e),this.touchTime=(new Date).valueOf()}}},{key:"onContext",value:function(t){var e=this.getPointer({x:t.clientX,y:t.clientY});this.selectionHandler._generateClickEvent("oncontext",t,e)}},{key:"checkSelectionChanges",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=this.selectionHandler.getSelection(),n=!1;n=!0===i?this.selectionHandler.selectAdditionalOnPoint(t):this.selectionHandler.selectOnPoint(t);var s=this.selectionHandler.getSelection(),r=this._determineDifference(o,s),a=this._determineDifference(s,o);r.edges.length>0&&(this.selectionHandler._generateClickEvent("deselectEdge",e,t,o),n=!0),r.nodes.length>0&&(this.selectionHandler._generateClickEvent("deselectNode",e,t,o),n=!0),a.nodes.length>0&&(this.selectionHandler._generateClickEvent("selectNode",e,t),n=!0),a.edges.length>0&&(this.selectionHandler._generateClickEvent("selectEdge",e,t),n=!0),!0===n&&this.selectionHandler._generateClickEvent("select",e,t)}},{key:"_determineDifference",value:function(t,e){var i=function(t,e){for(var i=[],o=0;o<t.length;o++){var n=t[o];-1===e.indexOf(n)&&i.push(n)}return i};return{nodes:i(t.nodes,e.nodes),edges:i(t.edges,e.edges)}}},{key:"onDragStart",value:function(t){void 0===this.drag.pointer&&this.onTouch(t);var e=this.selectionHandler.getNodeAt(this.drag.pointer);if(this.drag.dragging=!0,this.drag.selection=[],this.drag.translation=h.extend({},this.body.view.translation),this.drag.nodeId=void 0,void 0!==e&&!0===this.options.dragNodes){this.drag.nodeId=e.id,!1===e.isSelected()&&(this.selectionHandler.unselectAll(),this.selectionHandler.selectObject(e)),this.selectionHandler._generateClickEvent("dragStart",t,this.drag.pointer);var i=this.selectionHandler.selectionObj.nodes;for(var o in i)if(i.hasOwnProperty(o)){var n=i[o],s={id:n.id,node:n,x:n.x,y:n.y,xFixed:n.options.fixed.x,yFixed:n.options.fixed.y};n.options.fixed.x=!0,n.options.fixed.y=!0,this.drag.selection.push(s)}}else this.selectionHandler._generateClickEvent("dragStart",t,this.drag.pointer,void 0,!0)}},{key:"onDrag",value:function(t){var e=this;if(!0!==this.drag.pinched){this.body.emitter.emit("unlockNode");var i=this.getPointer(t.center),o=this.drag.selection;if(o&&o.length&&!0===this.options.dragNodes){this.selectionHandler._generateClickEvent("dragging",t,i);var n=i.x-this.drag.pointer.x,s=i.y-this.drag.pointer.y;o.forEach(function(t){var i=t.node;!1===t.xFixed&&(i.x=e.canvas._XconvertDOMtoCanvas(e.canvas._XconvertCanvasToDOM(t.x)+n)),!1===t.yFixed&&(i.y=e.canvas._YconvertDOMtoCanvas(e.canvas._YconvertCanvasToDOM(t.y)+s))}),this.body.emitter.emit("startSimulation")}else if(!0===this.options.dragView){if(this.selectionHandler._generateClickEvent("dragging",t,i,void 0,!0),void 0===this.drag.pointer)return void this.onDragStart(t);var r=i.x-this.drag.pointer.x,a=i.y-this.drag.pointer.y;this.body.view.translation={x:this.drag.translation.x+r,y:this.drag.translation.y+a},this.body.emitter.emit("_requestRedraw")}}}},{key:"onDragEnd",value:function(t){this.drag.dragging=!1;var e=this.drag.selection;
19300e&&e.length?(e.forEach(function(t){t.node.options.fixed.x=t.xFixed,t.node.options.fixed.y=t.yFixed}),this.selectionHandler._generateClickEvent("dragEnd",t,this.getPointer(t.center)),this.body.emitter.emit("startSimulation")):(this.selectionHandler._generateClickEvent("dragEnd",t,this.getPointer(t.center),void 0,!0),this.body.emitter.emit("_requestRedraw"))}},{key:"onPinch",value:function(t){var e=this.getPointer(t.center);this.drag.pinched=!0,void 0===this.pinch.scale&&(this.pinch.scale=1);var i=this.pinch.scale*t.scale;this.zoom(i,e)}},{key:"zoom",value:function(t,e){if(!0===this.options.zoomView){var i=this.body.view.scale;t<1e-5&&(t=1e-5),t>10&&(t=10);var o=void 0;void 0!==this.drag&&!0===this.drag.dragging&&(o=this.canvas.DOMtoCanvas(this.drag.pointer));var n=this.body.view.translation,s=t/i,r=(1-s)*e.x+n.x*s,a=(1-s)*e.y+n.y*s;if(this.body.view.scale=t,this.body.view.translation={x:r,y:a},void 0!=o){var h=this.canvas.canvasToDOM(o);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}this.body.emitter.emit("_requestRedraw"),i<t?this.body.emitter.emit("zoom",{direction:"+",scale:this.body.view.scale,pointer:e}):this.body.emitter.emit("zoom",{direction:"-",scale:this.body.view.scale,pointer:e})}}},{key:"onMouseWheel",value:function(t){if(!0===this.options.zoomView){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),0!==e){var i=this.body.view.scale,o=e/10;e<0&&(o/=1-o),i*=1+o;var n=this.getPointer({x:t.clientX,y:t.clientY});this.zoom(i,n)}t.preventDefault()}}},{key:"onMouseMove",value:function(t){var e=this,i=this.getPointer({x:t.clientX,y:t.clientY}),o=!1;void 0!==this.popup&&(!1===this.popup.hidden&&this._checkHidePopup(i),!1===this.popup.hidden&&(o=!0,this.popup.setPosition(i.x+3,i.y-5),this.popup.show())),!1===this.options.keyboard.bindToWindow&&!0===this.options.keyboard.enabled&&this.canvas.frame.focus(),!1===o&&(void 0!==this.popupTimer&&(clearInterval(this.popupTimer),this.popupTimer=void 0),this.drag.dragging||(this.popupTimer=setTimeout(function(){return e._checkShowPopup(i)},this.options.tooltipDelay))),!0===this.options.hover&&this.selectionHandler.hoverObject(t,i)}},{key:"_checkShowPopup",value:function(t){var e=this.canvas._XconvertDOMtoCanvas(t.x),i=this.canvas._YconvertDOMtoCanvas(t.y),o={left:e,top:i,right:e,bottom:i},n=void 0===this.popupObj?void 0:this.popupObj.id,s=!1,r="node";if(void 0===this.popupObj){for(var a=this.body.nodeIndices,h=this.body.nodes,d=void 0,u=[],c=0;c<a.length;c++)d=h[a[c]],!0===d.isOverlappingWith(o)&&void 0!==d.getTitle()&&u.push(a[c]);u.length>0&&(this.popupObj=h[u[u.length-1]],s=!0)}if(void 0===this.popupObj&&!1===s){for(var p=this.body.edgeIndices,f=this.body.edges,m=void 0,v=[],g=0;g<p.length;g++)m=f[p[g]],!0===m.isOverlappingWith(o)&&!0===m.connected&&void 0!==m.getTitle()&&v.push(p[g]);v.length>0&&(this.popupObj=f[v[v.length-1]],r="edge")}void 0!==this.popupObj?this.popupObj.id!==n&&(void 0===this.popup&&(this.popup=new l(this.canvas.frame)),this.popup.popupTargetType=r,this.popup.popupTargetId=this.popupObj.id,this.popup.setPosition(t.x+3,t.y-5),this.popup.setText(this.popupObj.getTitle()),this.popup.show(),this.body.emitter.emit("showPopup",this.popupObj.id)):void 0!==this.popup&&(this.popup.hide(),this.body.emitter.emit("hidePopup"))}},{key:"_checkHidePopup",value:function(t){var e=this.selectionHandler._pointerToPositionObject(t),i=!1;if("node"===this.popup.popupTargetType){if(void 0!==this.body.nodes[this.popup.popupTargetId]&&!0===(i=this.body.nodes[this.popup.popupTargetId].isOverlappingWith(e))){var o=this.selectionHandler.getNodeAt(t);i=void 0!==o&&o.id===this.popup.popupTargetId}}else void 0===this.selectionHandler.getNodeAt(t)&&void 0!==this.body.edges[this.popup.popupTargetId]&&(i=this.body.edges[this.popup.popupTargetId].isOverlappingWith(e));!1===i&&(this.popupObj=void 0,this.popup.hide(),this.body.emitter.emit("hidePopup"))}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(10),d=i(37),l=i(35),u=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.iconsCreated=!1,this.navigationHammer
19300s=[],this.boundFunctions={},this.touchTime=0,this.activated=!1,this.body.emitter.on("activate",function(){o.activated=!0,o.configureKeyboardBindings()}),this.body.emitter.on("deactivate",function(){o.activated=!1,o.configureKeyboardBindings()}),this.body.emitter.on("destroy",function(){void 0!==o.keycharm&&o.keycharm.destroy()}),this.options={}}return(0,a.default)(t,[{key:"setOptions",value:function(t){void 0!==t&&(this.options=t,this.create())}},{key:"create",value:function(){!0===this.options.navigationButtons?!1===this.iconsCreated&&this.loadNavigationElements():!0===this.iconsCreated&&this.cleanNavigation(),this.configureKeyboardBindings()}},{key:"cleanNavigation",value:function(){if(0!=this.navigationHammers.length){for(var t=0;t<this.navigationHammers.length;t++)this.navigationHammers[t].destroy();this.navigationHammers=[]}this.navigationDOM&&this.navigationDOM.wrapper&&this.navigationDOM.wrapper.parentNode&&this.navigationDOM.wrapper.parentNode.removeChild(this.navigationDOM.wrapper),this.iconsCreated=!1}},{key:"loadNavigationElements",value:function(){var t=this;this.cleanNavigation(),this.navigationDOM={};var e=["up","down","left","right","zoomIn","zoomOut","zoomExtends"],i=["_moveUp","_moveDown","_moveLeft","_moveRight","_zoomIn","_zoomOut","_fit"];this.navigationDOM.wrapper=document.createElement("div"),this.navigationDOM.wrapper.className="vis-navigation",this.canvas.frame.appendChild(this.navigationDOM.wrapper);for(var o=0;o<e.length;o++){this.navigationDOM[e[o]]=document.createElement("div"),this.navigationDOM[e[o]].className="vis-button vis-"+e[o],this.navigationDOM.wrapper.appendChild(this.navigationDOM[e[o]]);var n=new h(this.navigationDOM[e[o]]);"_fit"===i[o]?d.onTouch(n,this._fit.bind(this)):d.onTouch(n,this.bindToRedraw.bind(this,i[o])),this.navigationHammers.push(n)}var s=new h(this.canvas.frame);d.onRelease(s,function(){t._stopMovement()}),this.navigationHammers.push(s),this.iconsCreated=!0}},{key:"bindToRedraw",value:function(t){void 0===this.boundFunctions[t]&&(this.boundFunctions[t]=this[t].bind(this),this.body.emitter.on("initRedraw",this.boundFunctions[t]),this.body.emitter.emit("_startRendering"))}},{key:"unbindFromRedraw",value:function(t){void 0!==this.boundFunctions[t]&&(this.body.emitter.off("initRedraw",this.boundFunctions[t]),this.body.emitter.emit("_stopRendering"),delete this.boundFunctions[t])}},{key:"_fit",value:function(){(new Date).valueOf()-this.touchTime>700&&(this.body.emitter.emit("fit",{duration:700}),this.touchTime=(new Date).valueOf())}},{key:"_stopMovement",value:function(){for(var t in this.boundFunctions)this.boundFunctions.hasOwnProperty(t)&&(this.body.emitter.off("initRedraw",this.boundFunctions[t]),this.body.emitter.emit("_stopRendering"));this.boundFunctions={}}},{key:"_moveUp",value:function(){this.body.view.translation.y+=this.options.keyboard.speed.y}},{key:"_moveDown",value:function(){this.body.view.translation.y-=this.options.keyboard.speed.y}},{key:"_moveLeft",value:function(){this.body.view.translation.x+=this.options.keyboard.speed.x}},{key:"_moveRight",value:function(){this.body.view.translation.x-=this.options.keyboard.speed.x}},{key:"_zoomIn",value:function(){var t=this.body.view.scale,e=this.body.view.scale*(1+this.options.keyboard.speed.zoom),i=this.body.view.translation,o=e/t,n=(1-o)*this.canvas.canvasViewCenter.x+i.x*o,s=(1-o)*this.canvas.canvasViewCenter.y+i.y*o;this.body.view.scale=e,this.body.view.translation={x:n,y:s},this.body.emitter.emit("zoom",{direction:"+",scale:this.body.view.scale,pointer:null})}},{key:"_zoomOut",value:function(){var t=this.body.view.scale,e=this.body.view.scale/(1+this.options.keyboard.speed.zoom),i=this.body.view.translation,o=e/t,n=(1-o)*this.canvas.canvasViewCenter.x+i.x*o,s=(1-o)*this.canvas.canvasViewCenter.y+i.y*o;this.body.view.scale=e,this.body.view.translation={x:n,y:s},this.body.emitter.emit("zoom",{direction:"-",scale:this.body.view.scale,pointer:null})}},{key:"configureKeyboardBindings",value:function(){var t=this;void 0!==this.keycharm&&this.keycharm.destroy(),!0===this.options.keyboard.enabled&&(!0===this.options.keyboard.bindToWindow?this.keycharm=l({container:window,preventDefault:!0}):this.keycharm=l({container:this.canvas.frame,preventDefault:!0}),this.keycharm.reset(),!0===this.activated&&(this.keycharm.bind("up",function(){t.b
19300indToRedraw("_moveUp")},"keydown"),this.keycharm.bind("down",function(){t.bindToRedraw("_moveDown")},"keydown"),this.keycharm.bind("left",function(){t.bindToRedraw("_moveLeft")},"keydown"),this.keycharm.bind("right",function(){t.bindToRedraw("_moveRight")},"keydown"),this.keycharm.bind("=",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num+",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num-",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("-",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("[",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("]",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pageup",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pagedown",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("up",function(){t.unbindFromRedraw("_moveUp")},"keyup"),this.keycharm.bind("down",function(){t.unbindFromRedraw("_moveDown")},"keyup"),this.keycharm.bind("left",function(){t.unbindFromRedraw("_moveLeft")},"keyup"),this.keycharm.bind("right",function(){t.unbindFromRedraw("_moveRight")},"keyup"),this.keycharm.bind("=",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num+",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num-",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("-",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("[",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("]",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pageup",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pagedown",function(){t.unbindFromRedraw("_zoomOut")},"keyup")))}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(47).default,d=i(74).default,l=i(2),u=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.selectionObj={nodes:[],edges:[]},this.hoverObj={nodes:{},edges:{}},this.options={},this.defaultOptions={multiselect:!1,selectable:!0,selectConnectedEdges:!0,hoverConnectedEdges:!0},l.extend(this.options,this.defaultOptions),this.body.emitter.on("_dataChanged",function(){o.updateSelection()})}return(0,a.default)(t,[{key:"setOptions",value:function(t){if(void 0!==t){var e=["multiselect","hoverConnectedEdges","selectable","selectConnectedEdges"];l.selectiveDeepExtend(e,this.options,t)}}},{key:"selectOnPoint",value:function(t){var e=!1;if(!0===this.options.selectable){var i=this.getNodeAt(t)||this.getEdgeAt(t);this.unselectAll(),void 0!==i&&(e=this.selectObject(i)),this.body.emitter.emit("_requestRedraw")}return e}},{key:"selectAdditionalOnPoint",value:function(t){var e=!1;if(!0===this.options.selectable){var i=this.getNodeAt(t)||this.getEdgeAt(t);void 0!==i&&(e=!0,!0===i.isSelected()?this.deselectObject(i):this.selectObject(i),this.body.emitter.emit("_requestRedraw"))}return e}},{key:"_initBaseEvent",value:function(t,e){var i={};return i.pointer={DOM:{x:e.x,y:e.y},canvas:this.canvas.DOMtoCanvas(e)},i.event=t,i}},{key:"_generateClickEvent",value:function(t,e,i,o){var n=arguments.length>4&&void 0!==arguments[4]&&arguments[4],s=this._initBaseEvent(e,i);if(!0===n)s.nodes=[],s.edges=[];else{var r=this.getSelection();s.nodes=r.nodes,s.edges=r.edges}void 0!==o&&(s.previousSelection=o),"click"==t&&(s.items=this.getClickedItems(i)),this.body.emitter.emit(t,s)}},{key:"selectObject",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.selectConnectedEdges;return void 0!==t&&(t instanceof h&&!0===e&&this._selectConnectedEdges(t),t.select(),this._addToSelection(t),!0)}},{key:"deselectObject",value:function(t){!0===t.isSelected()&&(t.selected=!1,this._removeFromSelection(t))}},{key:"_getAllNodesOverlappingWith",value:function(t){for(var e=[],i=this.body.nodes,o=0;o<this.body.nodeIndices.length;o++){var n=this.body.nodeIndices[o];i[n].isOverlappingWith(t)&&e.push(n)}return e}},{key:"_pointerToPositionObject",value:function(t){var e=this.canvas.DOMtoCanvas(t);return{left:e.x-1,top:e.y+1,right:e.x+1,bottom:e.y-1}}},{key:"getNodeAt",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=this._pointerToPositionObject(t),o=this._getAllNodesOverlappingWith(i);return o.length>0?!0===e?this.body.nodes[o[o.length-1]]:o[o.length-1]:void 0}},{key:"_getEdgesOverlappingWith",value:function(t,e){for(var i=this.body.edges,o=0;o<this.body.edgeIndices.length;o++){var n=this.body.edgeIndices[o];i[n].isOverlappingWith(t)&&e.push(n)}}},{key:"_getAllEdgesOverlappingWith",value:function(t){var e=[];return this._getEdgesOverlappingWith(t,e),e}},{key:"getEdgeAt",value:function(t){for(var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=this.canvas.DOMtoCanvas(t),o=10,n=null,s=this.body.edges,r=0;r<this.body.edgeIndices.length;r++){var a=this.body.edgeIndices[r],h=s[a];if(h.connected){var d=h.from.x,l=h.from.y,u=h.to.x,c=h.to.y,p=h.edgeType.getDistanceToEdge(d,l,u,c,i.x,i.y);p<o&&(n=a,o=p)}}return null!==n?!0===e?this.body.edges[n]:n:void 0}},{key:"_addToSelection",value:function(t){t instanceof h?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t}},{key:"_addToHover",value:function(t){t instanceof h?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t}},{key:"_removeFromSelection",value:function(t){t instanceof h?(delete this.selectionObj.nodes[t.id],this._unselectConnectedEdges(t)):delete this.selectionObj.edges[t.id]}},{key:"unselectAll",value:function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].unselect();for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&this.selectionObj.edges[e].unselect();this.selectionObj={nodes:{},edges:{}}}},{key:"_getSelectedNodeCount",value:function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t}},{key:"_getSelectedNode",value:function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t]}},{key:"_getSelectedEdge",value:function(){for(var t in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(t))return this.selectionObj.edges[t]}},{key:"_getSelectedEdgeCount",value:function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t}},{key:"_getSelectedObjectCount",value:function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&(t+=1);return t}},{key:"_selectionIsEmpty",value:function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return!1;for(var e in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(e))return!1;return!0}},{key:"_clusterInSelection",value:function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].clusterSize>1)return!0;return!1}},{key:"_selectConnectedEdges",value:function(t){for(var e=0;e<t.edges.length;e++){var i=t.edges[e];i.select(),this._addToSelection(i)}}},{key:"_hoverConnectedEdges",value:function(t){for(var e=0;e<t.edges.length;e++){var i=t.edges[e];i.hover=!0,this._addToHover(i)}}},{key:"_unselectConnectedEdges",value:function(t){for(var e=0;e<t.edges.length;e++){var i=t.edges[e];i.unselect(),this._removeFromSelection(i)}}}
19300,{key:"emitBlurEvent",value:function(t,e,i){var o=this._initBaseEvent(t,e);!0===i.hover&&(i.hover=!1,i instanceof h?(o.node=i.id,this.body.emitter.emit("blurNode",o)):(o.edge=i.id,this.body.emitter.emit("blurEdge",o)))}},{key:"emitHoverEvent",value:function(t,e,i){var o=this._initBaseEvent(t,e),n=!1;return!1===i.hover&&(i.hover=!0,this._addToHover(i),n=!0,i instanceof h?(o.node=i.id,this.body.emitter.emit("hoverNode",o)):(o.edge=i.id,this.body.emitter.emit("hoverEdge",o))),n}},{key:"hoverObject",value:function(t,e){var i=this.getNodeAt(e);void 0===i&&(i=this.getEdgeAt(e));var o=!1;for(var n in this.hoverObj.nodes)this.hoverObj.nodes.hasOwnProperty(n)&&(void 0===i||i instanceof h&&i.id!=n||i instanceof d)&&(this.emitBlurEvent(t,e,this.hoverObj.nodes[n]),delete this.hoverObj.nodes[n],o=!0);for(var s in this.hoverObj.edges)this.hoverObj.edges.hasOwnProperty(s)&&(!0===o?(this.hoverObj.edges[s].hover=!1,delete this.hoverObj.edges[s]):(void 0===i||i instanceof d&&i.id!=s||i instanceof h&&!i.hover)&&(this.emitBlurEvent(t,e,this.hoverObj.edges[s]),delete this.hoverObj.edges[s],o=!0));void 0!==i&&(o=o||this.emitHoverEvent(t,e,i),i instanceof h&&!0===this.options.hoverConnectedEdges&&this._hoverConnectedEdges(i)),!0===o&&this.body.emitter.emit("_requestRedraw")}},{key:"getSelection",value:function(){return{nodes:this.getSelectedNodes(),edges:this.getSelectedEdges()}}},{key:"getSelectedNodes",value:function(){var t=[];if(!0===this.options.selectable)for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&t.push(this.selectionObj.nodes[e].id);return t}},{key:"getSelectedEdges",value:function(){var t=[];if(!0===this.options.selectable)for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&t.push(this.selectionObj.edges[e].id);return t}},{key:"setSelection",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=void 0,o=void 0;if(!t||!t.nodes&&!t.edges)throw"Selection must be an object with nodes and/or edges properties"
19301        ;if((e.unselectAll||void 0===e.unselectAll)&&this.unselectAll(),t.nodes)for(i=0;i<t.nodes.length;i++){o=t.nodes[i];var n=this.body.nodes[o];
19301if(!n)throw new RangeError('Node with id "'+o+'" not found');this.selectObject(n,e.highlightEdges)}if(t.edges)for(i=0;i<t.edges.length;i++){o=t.edges[i];var s=this.body.edges[o];if(!s)throw new RangeError('Edge with id "'+o+'" not found');this.selectObject(s)}this.body.emitter.emit("_requestRedraw")}},{key:"selectNodes",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(!t||void 0===t.length)throw"Selection must be an array with ids";this.setSelection({nodes:t},{highlightEdges:e})}},{key:"selectEdges",value:function(t){if(!t||void 0===t.length)throw"Selection must be an array with ids";this.setSelection({edges:t})}},{key:"updateSelection",value:function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.body.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.body.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},{key:"getClickedItems",value:function(t){for(var e=this.canvas.DOMtoCanvas(t),i=[],o=this.body.nodeIndices,n=this.body.nodes,s=o.length-1;s>=0;s--){var r=n[o[s]],a=r.getItemsOnPoint(e);i.push.apply(i,a)}for(var h=this.body.edgeIndices,d=this.body.edges,l=h.length-1;l>=0;l--){var u=d[h[l]],c=u.getItemsOnPoint(e);i.push.apply(i,c)}return i}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(6),a=o(r),h=i(8),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(76).default,v=i(236),g=v.HorizontalStrategy,y=v.VerticalStrategy,b=function(){function t(){(0,u.default)(this,t),this.childrenReference={},this.parentReference={},this.trees={},this.distributionOrdering={},this.levels={},this.distributionIndex={},this.isTree=!1,this.treeIndex=-1}return(0,p.default)(t,[{key:"addRelation",value:function(t,e){void 0===this.childrenReference[t]&&(this.childrenReference[t]=[]),this.childrenReference[t].push(e),void 0===this.parentReference[e]&&(this.parentReference[e]=[]),this.parentReference[e].push(t)}},{key:"checkIfTree",value:function(){for(var t in this.parentReference)if(this.parentReference[t].length>1)return void(this.isTree=!1);this.isTree=!0}},{key:"numTrees",value:function(){return this.treeIndex+1}},{key:"setTreeIndex",value:function(t,e){void 0!==e&&void 0===this.trees[t.id]&&(this.trees[t.id]=e,this.treeIndex=Math.max(e,this.treeIndex))}},{key:"ensureLevel",value:function(t){void 0===this.levels[t]&&(this.levels[t]=0)}},{key:"getMaxLevel",value:function(t){var e=this,i={};return function t(o){if(void 0!==i[o])return i[o];var n=e.levels[o];if(e.childrenReference[o]){var s=e.childrenReference[o];if(s.length>0)for(var r=0;r<s.length;r++)n=Math.max(n,t(s[r]))}return i[o]=n,n}(t)}},{key:"levelDownstream",value:function(t,e){void 0===this.levels[e.id]&&(void 0===this.levels[t.id]&&(this.levels[t.id]=0),this.levels[e.id]=this.levels[t.id]+1)}},{key:"setMinLevelToZero",value:function(t){var e=1e9;for(var i in t)t.hasOwnProperty(i)&&void 0!==this.levels[i]&&(e=Math.min(this.levels[i],e));for(var o in t)t.hasOwnProperty(o)&&void 0!==this.levels[o]&&(this.levels[o]-=e)}},{key:"getTreeSize",value:function(t,e){var i=1e9,o=-1e9,n=1e9,s=-1e9;for(var r in this.trees)if(this.trees.hasOwnProperty(r)&&this.trees[r]===e){var a=t[r];i=Math.min(a.x,i),o=Math.max(a.x,o),n=Math.min(a.y,n),s=Math.max(a.y,s)}return{min_x:i,max_x:o,min_y:n,max_y:s}}},{key:"hasSameParent",value:function(t,e){var i=this.parentReference[t.id],o=this.parentReference[e.id];if(void 0===i||void 0===o)return!1;for(var n=0;n<i.length;n++)for(var s=0;s<o.length;s++)if(i[n]==o[s])return!0;return!1}},{key:"inSameSubNetwork",value:function(t,e){return this.trees[t.id]===this.trees[e.id]}},{key:"getLevels",value:function(){return(0,d.default)(this.distributionOrdering)}},{key:"addToOrdering",value:function(t,e){void 0===this.distributionOrdering[e]&&(this.distributionOrdering[e]=[]);var i=!1,o=this.distributionOrdering[e];for(var n in o)if(o[n]===t){i=!0;break}i||(this.distributionOrdering[e].push(t),this.distributionIndex[t.id]=this.distributionOrdering[e].length-1)}}]),t}(),_=function(){function t(e){(0,u.default)(this,t),this.body=e,this.initialRandomSeed=Math.round(1e6*Math.random()),this.randomSeed=this.initialRandomSeed,this.setPhysics=!1,this.options={},this.optionsBackup={physics:{}},this.defaultOptions={randomSeed:void 0,improvedLayout:!0,hierarchical:{enabled:!1,levelSeparation:150,nodeSpacing:100,treeSpacing:200,blockShifting:!0,edgeMinimization:!0,parentCentralization:!0,direction:"UD",sortMethod:"hubsize"}},f.extend(this.options,this.defaultOptions),this.bindEventListeners()}return(0,p.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("_dataChanged",function(){t.setupHierarchicalLayout()}),this.body.emitter.on("_dataLoaded",function(){t.layoutNetwork()}),this.body.emitter.on("_resetHierarchicalLayout",function(){t.setupHierarchicalLayout()}),this.body.emitter.on("_adjustEdgesForHierarchicalLayout",function(){if(!0===t.options.hierarchical.enabled){var e=t.direction.curveType();t.body.emitter.emit("_forceDisableDynamicCurves",e,!1)}})}},{key:"setOptions",value:function(t,e){if(void 0!==t){var i=this.options.hierarchical,o=i.enabled;if(f.selectiveDeepExtend(["randomSeed","improvedLayout"],this.options,t),f.mergeOptions(this.options,t,"hierarchical"),void 0!==t.randomSeed&&(this.initialRandomSeed=t.randomSeed),!0===i.enabled)return!0===o&&this.body.emitter.emit("refresh",!0),"RL"===i.direction||"DU"===i.direction?i.levelSeparation>0&&(i.levelSeparation*=-1):i.levelSeparation<0&&(i.levelSeparation*=-1),this.setDirectionStrategy(),this.body.emitter.emit("_resetHierarchicalLayout"),this.adaptAllOptionsForHierarchicalLayout(e);if(!0===o)return this.body.emitter.emit("refresh"),f.deepExtend(e,this.optionsBackup)}return e}},{key:"adaptAllOptionsForHierarchicalLayout",value:function(t){if(!0===this.options.hierarchical.enabled){var e=this.optionsBackup.physics;void 0===t.physics||!0===t.physics?(t.physics={enabled:void 0===e.enabled||e.enabled,solver:"hierarchicalRepulsion"},e.enabled=void 0===e.enabled||e.enabled,e.solver=e.solver||"barnesHut"):"object"===(0,a.default)(t.physics)?(e.enabled=void 0===t.physics.enabled||t.physics.enabled,e.solver=t.physics.solver||"barnesHut",t.physics.solver="hierarchicalRepulsion"):!1!==t.physics&&(e.solver="barnesHut",t.physics={solver:"hierarchicalRepulsion"});var i=this.direction.curveType();if(void 0===t.edges)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},t.edges={smooth:!1};else if(void 0===t.edges.smooth)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},t.edges.smooth=!1;else if("boolean"==typeof t.edges.smooth)this.optionsBackup.edges={smooth:t.edges.smooth},t.edges.smooth={enabled:t.edges.smooth,type:i};else{var o=t.edges.smooth;void 0!==o.type&&"dynamic"!==o.type&&(i=o.type),this.optionsBackup.edges={smooth:void 0===o.enabled||o.enabled,type:void 0===o.type?"dynamic":o.type,roundness:void 0===o.roundness?.5:o.roundness,forceDirection:void 0!==o.forceDirection&&o.forceDirection},t.edges.smooth={enabled:void 0===o.enabled||o.enabled,type:i,roundness:void 0===o.roundness?.5:o.roundness,forceDirection:void 0!==o.forceDirection&&o.forceDirection}}this.body.emitter.emit("_forceDisableDynamicCurves",i)}return t}},{key:"seededRandom",value:function(){var t=1e4*Math.sin(this.randomSeed++);return t-Math.floor(t)}},{key:"positionInitially",value:function(t){if(!0!==this.options.hierarchical.enabled){this.randomSeed=this.initialRandomSeed;for(var e=t.length+50,i=0;i<t.length;i++){var o=t[i],n=2*Math.PI*this.seededRandom();void 0===o.x&&(o.x=e*Math.cos(n)),void 0===o.y&&(o.y=e*Math.sin(n))}}}},{key:"layoutNetwork",value:function(){if(!0!==this.options.hierarchical.enabled&&!0===this.options.improvedLayout){for(var t=this.body.nodeIndices,e=0,i=0;i<t.length;i++){!0===this.body.nodes[t[i]].predefinedPosition&&(e+=1)}if(e<.5*t.length){var o=0,n={clusterNodeProperties:{shape:"ellipse",label:"",group:"",font:{multi:!1}},clusterEdgeProperties:{label:"",font:{multi:!1},smooth:{enabled:!1}}};if(t.length>150){for(var s=t.length;t.length>150&&o<=10;){o+=1;var r=t.length;o%3==0?this.body.modules.clustering.clusterBridges(n):this.body.modules.clustering.clusterOutliers(n);if(r==t.length&&o%3!=0)return this._declusterAll(),this.body.emitter.emit("_layoutFailed"),void console.info("This network could not be positioned by this version of the improved layout algorithm. Please disable improvedLayout for better performance.")}this.body.modules.kamadaKawai.setOptions({springLength:Math.max(150,2*s)})}o>10&&console.info("The clustering didn't succeed within the amount of interations allowed, progressing with partial result."),this.body.modules.kamadaKawai.solve(t,this.body.edgeIndices,!0),this._shiftToCenter();for(var a=0;a<t.length;a++){var h=this.body.nodes[t[a]];!1===h.predefinedPosition&&(h.x+=70*(.5-this.seededRandom()),h.y+=70*(.5-this.seededRandom()))}this._declusterAll(),this.body.emitter.emit("_repositionBezierNodes")}}}},{key:"_shiftToCenter",value:function(){for(var t=m.getRangeCore(this.body.nodes,this.body.nodeIndices),e=m.findCenter(t),i=0;i<this.body.nodeIndices.length;i++){var o=this.body.nodes[this.body.nodeIndices[i]];o.x-=e.x,o.y-=e.y}}},{key:"_declusterAll",value:function(){for(var t=!0;!0===t;){t=!1;for(var e=0;e<this.body.nodeIndices.length;e++)!0===this.body.nodes[this.body.nodeIndices[e]].isCluster&&(t=!0,this.body.modules.clustering.openCluster(this.body.nodeIndices[e],{},!1));!0===t&&this.body.emitter.emit("_dataChanged")}}},{key:"getSeed",value:function(){return this.initialRandomSeed}},{key:"setupHierarchicalLayout",value:function(){if(!0===this.options.hierarchical.enabled&&this.body.nodeIndices.length>0){var t=void 0,e=void 0,i=!1,o=!1;this.lastNodeOnLevel={},this.hierarchical=new b;for(e in this.body.nodes)this.body.nodes.hasOwnProperty(e)&&(t=this.body.nodes[e],void 0!==t.options.level?(i=!0,this.hierarchical.levels[e]=t.options.level):o=!0);if(!0===o&&!0===i)throw new Error("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes.");if(!0===o){var n=this.options.hierarchical.sortMethod;"hubsize"===n?this._determineLevelsByHubsize():"directed"===n?this._determineLevelsDirected():"custom"===n&&this._determineLevelsCustomCallback()}for(var s in this.body.nodes)this.body.nodes.hasOwnProperty(s)&&this.hierarchical.ensureLevel(s);var r=this._getDistribution();this._generateMap(),this._placeNodesByHierarchy(r),this._condenseHierarchy(),this._shiftToCenter()}}},{key:"_condenseHierarchy",value:function(){var t=this,e=!1,i={},o=function(e,i){var o=t.hierarchical.trees;for(var n in o)o.hasOwnProperty(n)&&o[n]===e&&t.direction.shift(n,i)},n=function(){for(var e=[],i=0;i<t.hierarchical.numTrees();i++)e.push(t.direction.getTreeSize(i));return e},r=function e(i,o){if(!o[i.id]&&(o[i.id]=!0,t.hierarchical.childrenReference[i.id])){var n=t.hierarchical.childrenReference[i.id];if(n.length>0)for(var s=0;s<n.length;s++)e(t.body.nodes[n[s]],o)}},a=function(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e9,o=1e9,n=1e9,r=1e9,a=-1e9;for(var h in e)if(e.hasOwnProperty(h)){var d=t.body.nodes[h],l=t.hierarchical.levels[d.id],u=t.direction.getPosition(d),c=t._getSpaceAroundNode(d,e),p=(0,s.default)(c,2),f=p[0],m=p[1];o=Math.min(f,o),n=Math.min(m,n),l<=i&&(r=Math.min(u,r),a=Math.max(u,a))}return[r,a,o,n]},h=function(e,i){var o=t.hierarchical.getMaxLevel(e.id),n=t.hierarchical.getMaxLevel(i.id);return Math.min(o,n)},d=function(e,i,o){for(var n=t.hierarchical,s=0;s<i.length;s++){var r=i[s],a=n.distributionOrdering[r];if(a.length>1)for(var h=0;h<a.length-1;h++){var d=a[h],l=a[h+1];n.hasSameParent(d,l)&&n.inSameSubNetwork(d,l)&&e(d,l,o)}}},l=function(i,o){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],s=t.direction.getPosition(i),d=t.direction.getPosition(o),l=Math.abs(d-s),u=t.options.hierarchical.nodeSpacing;if(l>u){var c={},p={};
19301r(i,c),r(o,p);var f=h(i,o),m=a(c,f),v=a(p,f),g=m[1],y=v[0],b=v[2];if(Math.abs(g-y)>u){var _=g-y+u;_<-b+u&&(_=-b+u),_<0&&(t._shiftBlock(o.id,_),e=!0,!0===n&&t._centerParent(o))}}},u=function(o,n){for(var h=n.id,d=n.edges,l=t.hierarchical.levels[n.id],u=t.options.hierarchical.levelSeparation*t.options.hierarchical.levelSeparation,c={},p=[],f=0;f<d.length;f++){var m=d[f];if(m.toId!=m.fromId){var v=m.toId==h?m.from:m.to;c[d[f].id]=v,t.hierarchical.levels[v.id]<l&&p.push(m)}}var g=function(e,i){for(var o=0,n=0;n<i.length;n++)if(void 0!==c[i[n].id]){var s=t.direction.getPosition(c[i[n].id])-e;o+=s/Math.sqrt(s*s+u)}return o},y=function(e,i){for(var o=0,n=0;n<i.length;n++)if(void 0!==c[i[n].id]){var s=t.direction.getPosition(c[i[n].id])-e;o-=u*Math.pow(s*s+u,-1.5)}return o},b=function(e,i){for(var o=t.direction.getPosition(n),s={},r=0;r<e;r++){var a=g(o,i),h=y(o,i);if(o-=Math.max(-40,Math.min(40,Math.round(a/h))),void 0!==s[o])break;s[o]=r}return o},_=b(o,p);!function(o){var s=t.direction.getPosition(n);if(void 0===i[n.id]){var h={};r(n,h),i[n.id]=h}var d=a(i[n.id]),l=d[2],u=d[3],c=o-s,p=0;c>0?p=Math.min(c,u-t.options.hierarchical.nodeSpacing):c<0&&(p=-Math.min(-c,l-t.options.hierarchical.nodeSpacing)),0!=p&&(t._shiftBlock(n.id,p),e=!0)}(_),_=b(o,d),function(i){var o=t.direction.getPosition(n),r=t._getSpaceAroundNode(n),a=(0,s.default)(r,2),h=a[0],d=a[1],l=i-o,u=o;l>0?u=Math.min(o+(d-t.options.hierarchical.nodeSpacing),i):l<0&&(u=Math.max(o-(h-t.options.hierarchical.nodeSpacing),i)),u!==o&&(t.direction.setPosition(n,u),e=!0)}(_)};!0===this.options.hierarchical.blockShifting&&(function(i){var o=t.hierarchical.getLevels();o=o.reverse();for(var n=0;n<i&&(e=!1,d(l,o,!0),!0===e);n++);}(5),function(){for(var e in t.body.nodes)t.body.nodes.hasOwnProperty(e)&&t._centerParent(t.body.nodes[e])}()),!0===this.options.hierarchical.edgeMinimization&&function(i){var o=t.hierarchical.getLevels();o=o.reverse();for(var n=0;n<i;n++){e=!1;for(var s=0;s<o.length;s++)for(var r=o[s],a=t.hierarchical.distributionOrdering[r],h=0;h<a.length;h++)u(1e3,a[h]);if(!0!==e)break}}(20),!0===this.options.hierarchical.parentCentralization&&function(){var e=t.hierarchical.getLevels();e=e.reverse();for(var i=0;i<e.length;i++)for(var o=e[i],n=t.hierarchical.distributionOrdering[o],s=0;s<n.length;s++)t._centerParent(n[s])}(),function(){for(var e=n(),i=0,s=0;s<e.length-1;s++){i+=e[s].max-e[s+1].min+t.options.hierarchical.treeSpacing,o(s+1,i)}}()}},{key:"_getSpaceAroundNode",value:function(t,e){var i=!0;void 0===e&&(i=!1);var o=this.hierarchical.levels[t.id];if(void 0!==o){var n=this.hierarchical.distributionIndex[t.id],s=this.direction.getPosition(t),r=this.hierarchical.distributionOrdering[o],a=1e9,h=1e9;if(0!==n){var d=r[n-1];if(!0===i&&void 0===e[d.id]||!1===i){a=s-this.direction.getPosition(d)}}if(n!=r.length-1){var l=r[n+1];if(!0===i&&void 0===e[l.id]||!1===i){var u=this.direction.getPosition(l);h=Math.min(h,u-s)}}return[a,h]}return[0,0]}},{key:"_centerParent",value:function(t){if(this.hierarchical.parentReference[t.id])for(var e=this.hierarchical.parentReference[t.id],i=0;i<e.length;i++){var o=e[i],n=this.body.nodes[o],r=this.hierarchical.childrenReference[o];if(void 0!==r){var a=this._getCenterPosition(r),h=this.direction.getPosition(n),d=this._getSpaceAroundNode(n),l=(0,s.default)(d,2),u=l[0],c=l[1],p=h-a;(p<0&&Math.abs(p)<c-this.options.hierarchical.nodeSpacing||p>0&&Math.abs(p)<u-this.options.hierarchical.nodeSpacing)&&this.direction.setPosition(n,a)}}}},{key:"_placeNodesByHierarchy",value:function(t){this.positionedNodes={};for(var e in t)if(t.hasOwnProperty(e)){var i=(0,d.default)(t[e]);i=this._indexArrayToNodes(i),this.direction.sort(i);for(var o=0,n=0;n<i.length;n++){var s=i[n];if(void 0===this.positionedNodes[s.id]){var r=this.options.hierarchical.nodeSpacing,a=r*o;o>0&&(a=this.direction.getPosition(i[n-1])+r),this.direction.setPosition(s,a,e),this._validatePositionAndContinue(s,e,a),o++}}}}},{key:"_placeBranchNodes",value:function(t,e){var i=this.hierarchical.childrenReference[t];if(void 0!==i){for(var o=[],n=0;n<i.length;n++)o.push(this.body.nodes[i[n]]);this.direction.sort(o);for(var s=0;s<o.length;s++){var r=o[s],a=this.hierarchical.levels[r.id];if(!(a>e&&void 0===this.positionedNodes[r.id]))return;var h=this.options.hierarchical.nodeSpacing,d=void 0;d=0===s?this.direction.getPosition(this.body.nodes[t]):this.direction.getPosition(o[s-1])+h,this.direction.setPosition(r,d,a),this._val
19301idatePositionAndContinue(r,a,d)}var l=this._getCenterPosition(o);this.direction.setPosition(this.body.nodes[t],l,e)}}},{key:"_validatePositionAndContinue",value:function(t,e,i){if(this.hierarchical.isTree){if(void 0!==this.lastNodeOnLevel[e]){var o=this.direction.getPosition(this.body.nodes[this.lastNodeOnLevel[e]]);if(i-o<this.options.hierarchical.nodeSpacing){var n=o+this.options.hierarchical.nodeSpacing-i,s=this._findCommonParent(this.lastNodeOnLevel[e],t.id);this._shiftBlock(s.withChild,n)}}this.lastNodeOnLevel[e]=t.id,this.positionedNodes[t.id]=!0,this._placeBranchNodes(t.id,e)}}},{key:"_indexArrayToNodes",value:function(t){for(var e=[],i=0;i<t.length;i++)e.push(this.body.nodes[t[i]]);return e}},{key:"_getDistribution",value:function(){var t={},e=void 0,i=void 0;for(e in this.body.nodes)if(this.body.nodes.hasOwnProperty(e)){i=this.body.nodes[e];var o=void 0===this.hierarchical.levels[e]?0:this.hierarchical.levels[e];this.direction.fix(i,o),void 0===t[o]&&(t[o]={}),t[o][e]=i}return t}},{key:"_getActiveEdges",value:function(t){var e=this,i=[];return f.forEach(t.edges,function(t){-1!==e.body.edgeIndices.indexOf(t.id)&&i.push(t)}),i}},{key:"_getHubSizes",value:function(){var t=this,e={},i=this.body.nodeIndices;f.forEach(i,function(i){var o=t.body.nodes[i],n=t._getActiveEdges(o).length;e[n]=!0});var o=[];return f.forEach(e,function(t){o.push(Number(t))}),o.sort(function(t,e){return e-t}),o}},{key:"_determineLevelsByHubsize",value:function(){for(var t=this,e=function(e,i){t.hierarchical.levelDownstream(e,i)},i=this._getHubSizes(),o=0;o<i.length;++o){if("break"===function(o){var n=i[o];if(0===n)return"break";f.forEach(t.body.nodeIndices,function(i){var o=t.body.nodes[i];n===t._getActiveEdges(o).length&&t._crawlNetwork(e,i)})}(o))break}}},{key:"_determineLevelsCustomCallback",value:function(){var t=this,e=function(e,i,o){var n=t.hierarchical.levels[e.id];void 0===n&&(n=t.hierarchical.levels[e.id]=1e5);var s=(m.cloneOptions(e,"node"),m.cloneOptions(i,"node"),void m.cloneOptions(o,"edge"));t.hierarchical.levels[i.id]=n+s};this._crawlNetwork(e),this.hierarchical.setMinLevelToZero(this.body.nodes)}},{key:"_determineLevelsDirected",value:function(){var t=this,e=function(e){return f.forEach(t.body.edges,function(t){if(t.toId===e.fromId&&t.fromId===e.toId)return!0}),!1},i=function(i,o,n){var s=t.hierarchical.levels[i.id],r=t.hierarchical.levels[o.id];e(n)&&void 0!==s&&void 0!==r||(void 0===s&&(s=t.hierarchical.levels[i.id]=1e4),n.toId==o.id?t.hierarchical.levels[o.id]=s+1:t.hierarchical.levels[o.id]=s-1)};this._crawlNetwork(i),this.hierarchical.setMinLevelToZero(this.body.nodes)}},{key:"_generateMap",value:function(){var t=this,e=function(e,i){t.hierarchical.levels[i.id]>t.hierarchical.levels[e.id]&&t.hierarchical.addRelation(e.id,i.id)};this._crawlNetwork(e),this.hierarchical.checkIfTree()}},{key:"_crawlNetwork",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){},i=arguments[1],o={},n=function i(n,s){if(void 0===o[n.id]){t.hierarchical.setTreeIndex(n,s),o[n.id]=!0;for(var r=void 0,a=t._getActiveEdges(n),h=0;h<a.length;h++){var d=a[h];!0===d.connected&&(r=d.toId==n.id?d.from:d.to,n.id!=r.id&&(e(n,r,d),i(r,s)))}}};if(void 0===i)for(var s=0,r=0;r<this.body.nodeIndices.length;r++){var a=this.body.nodeIndices[r];if(void 0===o[a]){var h=this.body.nodes[a];n(h,s),s+=1}}else{var d=this.body.nodes[i];if(void 0===d)return void console.error("Node not found:",i);n(d)}}},{key:"_shiftBlock",value:function(t,e){var i=this,o={};!function t(n){if(!o[n]){o[n]=!0,i.direction.shift(n,e);var s=i.hierarchical.childrenReference[n];if(void 0!==s)for(var r=0;r<s.length;r++)t(s[r])}}(t)}},{key:"_findCommonParent",value:function(t,e){var i=this,o={};return function t(e,o){var n=i.hierarchical.parentReference[o];if(void 0!==n)for(var s=0;s<n.length;s++){var r=n[s];e[r]=!0,t(e,r)}}(o,t),function t(e,o){var n=i.hierarchical.parentReference[o];if(void 0!==n)for(var s=0;s<n.length;s++){var r=n[s];if(void 0!==e[r])return{foundParent:r,withChild:o};var a=t(e,r);if(null!==a.foundParent)return a}return{foundParent:null,withChild:o}}(o,e)}},{key:"setDirectionStrategy",value:function(){var t="UD"===this.options.hierarchical.direction||"DU"===this.options.hierarchical.direction;this.direction=t?new y(this):new g(this)}},{key:"_getCenterPosition",value:function(t){for(var e=1e9,i=-1e9,o=0;o<t.length;o++){var n=void 0;if(void 0!==t[o].id)n=t[o];else{var s=t[o];n=this.body.nodes[s]}
19301var r=this.direction.getPosition(n);e=Math.min(e,r),i=Math.max(i,r)}return.5*(e+i)}}]),t}();e.default=_},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0}),e.VerticalStrategy=e.HorizontalStrategy=void 0;var n=i(3),s=o(n),r=i(4),a=o(r),h=i(5),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,[{key:"abstract",value:function(){throw new Error("Can't instantiate abstract class!")}},{key:"fake_use",value:function(){}},{key:"curveType",value:function(){return this.abstract()}},{key:"getPosition",value:function(t){return this.fake_use(t),this.abstract()}},{key:"setPosition",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;this.fake_use(t,e,i),this.abstract()}},{key:"getTreeSize",value:function(t){return this.fake_use(t),this.abstract()}},{key:"sort",value:function(t){this.fake_use(t),this.abstract()}},{key:"fix",value:function(t,e){this.fake_use(t,e),this.abstract()}},{key:"shift",value:function(t,e){this.fake_use(t,e),this.abstract()}}]),t}(),m=function(t){function e(t){(0,u.default)(this,e);var i=(0,a.default)(this,(e.__proto__||(0,s.default)(e)).call(this));return i.layout=t,i}return(0,d.default)(e,t),(0,p.default)(e,[{key:"curveType",value:function(){return"horizontal"}},{key:"getPosition",value:function(t){return t.x}},{key:"setPosition",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;void 0!==i&&this.layout.hierarchical.addToOrdering(t,i),t.x=e}},{key:"getTreeSize",value:function(t){var e=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,t);return{min:e.min_x,max:e.max_x}}},{key:"sort",value:function(t){t.sort(function(t,e){return void 0===t.x||void 0===e.x?0:t.x-e.x})}},{key:"fix",value:function(t,e){t.y=this.layout.options.hierarchical.levelSeparation*e,t.options.fixed.y=!0}},{key:"shift",value:function(t,e){this.layout.body.nodes[t].x+=e}}]),e}(f),v=function(t){function e(t){(0,u.default)(this,e);var i=(0,a.default)(this,(e.__proto__||(0,s.default)(e)).call(this));return i.layout=t,i}return(0,d.default)(e,t),(0,p.default)(e,[{key:"curveType",value:function(){return"vertical"}},{key:"getPosition",value:function(t){return t.y}},{key:"setPosition",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;void 0!==i&&this.layout.hierarchical.addToOrdering(t,i),t.y=e}},{key:"getTreeSize",value:function(t){var e=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,t);return{min:e.min_y,max:e.max_y}}},{key:"sort",value:function(t){t.sort(function(t,e){return void 0===t.y||void 0===e.y?0:t.y-e.y})}},{key:"fix",value:function(t,e){t.x=this.layout.options.hierarchical.levelSeparation*e,t.options.fixed.x=!0}},{key:"shift",value:function(t,e){this.layout.body.nodes[t].y+=e}}]),e}(f);e.HorizontalStrategy=v,e.VerticalStrategy=m},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(19),a=o(r),h=i(6),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(10),v=i(37),g=function(){function t(e,i,o){var n=this;(0,u.default)(this,t),this.body=e,this.canvas=i,this.selectionHandler=o,this.editMode=!1,this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0,this.manipulationHammers=[],this.temporaryUIFunctions={},this.temporaryEventFunctions=[],this.touchTime=0,this.temporaryIds={nodes:[],edges:[]},this.guiEnabled=!1,this.inMode=!1,this.selectedControlNode=void 0,this.options={},this.defaultOptions={enabled:!1,initiallyActive:!1,addNode:!0,addEdge:!0,editNode:void 0,editEdge:!0,deleteNode:!0,deleteEdge:!0,controlNodeStyle:{shape:"dot",size:6,color:{background:"#ff0000",border:"#3c3c3c",highlight:{background:"#07f968",border:"#3c3c3c"}},borderWidth:2,borderWidthSelected:2}},f.extend(this.options,this.defaultOptions),this.body.emitter.on("destroy",function(){n._clean()}),this.body.emitter.on("_dataChanged",this._restore.bind(this)),this.body.emitter.on("_resetData",this._restore.bind(this))}return(0,p.default)(t,[{key:"_restore",value:function(){!1!==this.inMode&&(!0===this.options.initiallyActive?this.enableEditMode():this.disableEditMode())}}
19301,{key:"setOptions",value:function(t,e,i){void 0!==e&&(void 0!==e.locale?this.options.locale=e.locale:this.options.locale=i.locale,void 0!==e.locales?this.options.locales=e.locales:this.options.locales=i.locales),void 0!==t&&("boolean"==typeof t?this.options.enabled=t:(this.options.enabled=!0,f.deepExtend(this.options,t)),!0===this.options.initiallyActive&&(this.editMode=!0),this._setup())}},{key:"toggleEditMode",value:function(){!0===this.editMode?this.disableEditMode():this.enableEditMode()}},{key:"enableEditMode",value:function(){this.editMode=!0,this._clean(),!0===this.guiEnabled&&(this.manipulationDiv.style.display="block",this.closeDiv.style.display="block",this.editModeDiv.style.display="none",this.showManipulatorToolbar())}},{key:"disableEditMode",value:function(){this.editMode=!1,this._clean(),!0===this.guiEnabled&&(this.manipulationDiv.style.display="none",this.closeDiv.style.display="none",this.editModeDiv.style.display="block",this._createEditButton())}},{key:"showManipulatorToolbar",value:function(){if(this._clean(),this.manipulationDOM={},!0===this.guiEnabled){this.editMode=!0,this.manipulationDiv.style.display="block",this.closeDiv.style.display="block";var t=this.selectionHandler._getSelectedNodeCount(),e=this.selectionHandler._getSelectedEdgeCount(),i=t+e,o=this.options.locales[this.options.locale],n=!1;!1!==this.options.addNode&&(this._createAddNodeButton(o),n=!0),!1!==this.options.addEdge&&(!0===n?this._createSeperator(1):n=!0,this._createAddEdgeButton(o)),1===t&&"function"==typeof this.options.editNode?(!0===n?this._createSeperator(2):n=!0,this._createEditNodeButton(o)):1===e&&0===t&&!1!==this.options.editEdge&&(!0===n?this._createSeperator(3):n=!0,this._createEditEdgeButton(o)),0!==i&&(t>0&&!1!==this.options.deleteNode?(!0===n&&this._createSeperator(4),this._createDeleteButton(o)):0===t&&!1!==this.options.deleteEdge&&(!0===n&&this._createSeperator(4),this._createDeleteButton(o))),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this)),this._temporaryBindEvent("select",this.showManipulatorToolbar.bind(this))}this.body.emitter.emit("_redraw")}},{key:"addNodeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="addNode",!0===this.guiEnabled){var t=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(t),this._createSeperator(),this._createDescription(t.addDescription||this.options.locales.en.addDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindEvent("click",this._performAddNode.bind(this))}},{key:"editNode",value:function(){var t=this;!0!==this.editMode&&this.enableEditMode(),this._clean();var e=this.selectionHandler._getSelectedNode();if(void 0!==e){if(this.inMode="editNode","function"!=typeof this.options.editNode)throw new Error("No function has been configured to handle the editing of nodes.");if(!0!==e.isCluster){var i=f.deepExtend({},e.options,!1);if(i.x=e.x,i.y=e.y,2!==this.options.editNode.length)throw new Error("The function for edit does not support two arguments (data, callback)");this.options.editNode(i,function(e){null!==e&&void 0!==e&&"editNode"===t.inMode&&t.body.data.nodes.getDataSet().update(e),t.showManipulatorToolbar()})}else alert(this.options.locales[this.options.locale].editClusterError||this.options.locales.en.editClusterError)}else this.showManipulatorToolbar()}},{key:"addEdgeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="addEdge",!0===this.guiEnabled){var t=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(t),this._createSeperator(),this._createDescription(t.edgeDescription||this.options.locales.en.edgeDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindUI("onTouch",this._handleConnect.bind(this)),this._temporaryBindUI("onDragEnd",this._finishConnect.bind(this)),this._temporaryBindUI("onDrag",this._dragControlNode.bind(this)),this._temporaryBindUI("onRelease",this._finishConnect.bind(this)),this._temporaryBindUI("onDragStart",this._dragStartEdge.bind(this)),this._temporaryBindUI("onHold",function(){})}},{key:"editEdgeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="editEdge","object"===(0,d.default)(this.options.editEdge)&&"function"==typeof this.options.editEdge.editWithoutDrag&&(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdges()[0],void 0!==this.edgeBeingEditedId)){var t=this.body.edges[this.edgeBeingEditedId];return void this._performEditEdge(t.from,t.to)}if(!0===this.guiEnabled){var e=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(e),this._createSeperator(),this._createDescription(e.editEdgeDescription||this.options.locales.en.editEdgeDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}if(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdges()[0],void 0!==this.edgeBeingEditedId){var i=this.body.edges[this.edgeBeingEditedId],o=this._getNewTargetNode(i.from.x,i.from.y),n=this._getNewTargetNode(i.to.x,i.to.y);this.temporaryIds.nodes.push(o.id),this.temporaryIds.nodes.push(n.id),this.body.nodes[o.id]=o,this.body.nodeIndices.push(o.id),this.body.nodes[n.id]=n,this.body.nodeIndices.push(n.id),this._temporaryBindUI("onTouch",this._controlNodeTouch.bind(this)),this._temporaryBindUI("onTap",function(){}),this._temporaryBindUI("onHold",function(){}),this._temporaryBindUI("onDragStart",this._controlNodeDragStart.bind(this)),this._temporaryBindUI("onDrag",this._controlNodeDrag.bind(this)),this._temporaryBindUI("onDragEnd",this._controlNodeDragEnd.bind(this)),this._temporaryBindUI("onMouseMove",function(){}),this._temporaryBindEvent("beforeDrawing",function(t){var e=i.edgeType.findBorderPositions(t);!1===o.selected&&(o.x=e.from.x,o.y=e.from.y),!1===n.selected&&(n.x=e.to.x,n.y=e.to.y)}),this.body.emitter.emit("_redraw")}else this.showManipulatorToolbar()}},{key:"deleteSelected",value:function(){var t=this;!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="delete";var e=this.selectionHandler.getSelectedNodes(),i=this.selectionHandler.getSelectedEdges(),o=void 0;if(e.length>0){for(var n=0;n<e.length;n++)if(!0===this.body.nodes[e[n]].isCluster)return void alert(this.options.locales[this.options.locale].deleteClusterError||this.options.locales.en.deleteClusterError);"function"==typeof this.options.deleteNode&&(o=this.options.deleteNode)}else i.length>0&&"function"==typeof this.options.deleteEdge&&(o=this.options.deleteEdge);if("function"==typeof o){var s={nodes:e,edges:i}
19302    ;if(2!==o.length)throw new Error("The function for delete does not support two arguments (data, callback)");o(s,function(e){null!==e&&void 0!==e&&"delete"===t.inMode?(t.body.data.edges.getDataSet().remove(e.edges),t.body.data.nodes.getDataSet().remove(e.nodes),t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar()):(t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().remove(i),this.body.data.nodes.getDataSet().remove(e),this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar()}},{key:"_setup",value:function(){!0===this.options.enabled?(this.guiEnabled=!0,this._createWrappers(),!1===this.editMode?this._createEditButton():this.showManipulatorToolbar()):(this._removeManipulationDOM(),this.guiEnabled=!1)}},{key:"_createWrappers",value:function(){void 0===this.manipulationDiv&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="vis-manipulation",!0===this.editMode?this.manipulationDiv.style.display="block":this.manipulationDiv.style.display="none",this.canvas.frame.appendChild(this.manipulationDiv)),void 0===this.editModeDiv&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="vis-edit-mode",!0===this.editMode?this.editModeDiv.style.display="none":this.editModeDiv.style.display="block",this.canvas.frame.appendChild(this.editModeDiv)),void 0===this.closeDiv&&(this.closeDiv=document.createElement("div"),this.closeDiv.className="vis-close",this.closeDiv.style.display=this.manipulationDiv.style.display,this.canvas.frame.appendChild(this.closeDiv))}},{key:"_getNewTargetNode",value:function(t,e){var i=f.deepExtend({},this.options.controlNodeStyle);i.id="targetNode"+f.randomUUID(),i.hidden=!1,i.physics=!1,i.x=t,i.y=e;var o=this.body.functions.createNode(i);return o.shape.boundingBox={left:t,right:t,top:e,bottom:e},o}},{key:"_createEditButton",value:function(){this._clean(),this.manipulationDOM={},f.recursiveDOMDelete(this.editModeDiv);var t=this.options.locales[this.options.locale],e=this._createButton("editMode","vis-button vis-edit vis-edit-mode",t.edit||this.options.locales.en.edit);this.editModeDiv.appendChild(e),this._bindHammerToDiv(e,this.toggleEditMode.bind(this))}},{key:"_clean",value:function(){this.inMode=!1,!0===this.guiEnabled&&(f.recursiveDOMDelete(this.editModeDiv),f.recursiveDOMDelete(this.manipulationDiv),this._cleanManipulatorHammers()),this._cleanupTemporaryNodesAndEdges(),this._unbindTemporaryUIs(),this._unbindTemporaryEvents(),this.body.emitter.emit("restorePhysics")}},{key:"_cleanManipulatorHammers",value:function(){if(0!=this.manipulationHammer
19302s.length){for(var t=0;t<this.manipulationHammers.length;t++)this.manipulationHammers[t].destroy();this.manipulationHammers=[]}}},{key:"_removeManipulationDOM",value:function(){this._clean(),f.recursiveDOMDelete(this.manipulationDiv),f.recursiveDOMDelete(this.editModeDiv),f.recursiveDOMDelete(this.closeDiv),this.manipulationDiv&&this.canvas.frame.removeChild(this.manipulationDiv),this.editModeDiv&&this.canvas.frame.removeChild(this.editModeDiv),this.closeDiv&&this.canvas.frame.removeChild(this.closeDiv),this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0}},{key:"_createSeperator",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;this.manipulationDOM["seperatorLineDiv"+t]=document.createElement("div"),this.manipulationDOM["seperatorLineDiv"+t].className="vis-separator-line",this.manipulationDiv.appendChild(this.manipulationDOM["seperatorLineDiv"+t])}},{key:"_createAddNodeButton",value:function(t){var e=this._createButton("addNode","vis-button vis-add",t.addNode||this.options.locales.en.addNode);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.addNodeMode.bind(this))}},{key:"_createAddEdgeButton",value:function(t){var e=this._createButton("addEdge","vis-button vis-connect",t.addEdge||this.options.locales.en.addEdge);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.addEdgeMode.bind(this))}},{key:"_createEditNodeButton",value:function(t){var e=this._createButton("editNode","vis-button vis-edit",t.editNode||this.options.locales.en.editNode);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.editNode.bind(this))}},{key:"_createEditEdgeButton",value:function(t){var e=this._createButton("editEdge","vis-button vis-edit",t.editEdge||this.options.locales.en.editEdge);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.editEdgeMode.bind(this))}},{key:"_createDeleteButton",value:function(t){var e;e=this.options.rtl?"vis-button vis-delete-rtl":"vis-button vis-delete";var i=this._createButton("delete",e,t.del||this.options.locales.en.del);this.manipulationDiv.appendChild(i),this._bindHammerToDiv(i,this.deleteSelected.bind(this))}},{key:"_createBackButton",value:function(t){var e=this._createButton("back","vis-button vis-back",t.back||this.options.locales.en.back);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.showManipulatorToolbar.bind(this))}},{key:"_createButton",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"vis-label";return this.manipulationDOM[t+"Div"]=document.createElement("div"),this.manipulationDOM[t+"Div"].className=e,this.manipulationDOM[t+"Label"]=document.createElement("div"),this.manipulationDOM[t+"Label"].className=o,this.manipulationDOM[t+"Label"].innerHTML=i,this.manipulationDOM[t+"Div"].appendChild(this.manipulationDOM[t+"Label"]),this.manipulationDOM[t+"Div"]}},{key:"_createDescription",value:function(t){this.manipulationDiv.appendChild(this._createButton("description","vis-button vis-none",t))}},{key:"_temporaryBindEvent",value:function(t,e){this.temporaryEventFunctions.push({event:t,boundFunction:e}),this.body.emitter.on(t,e)}},{key:"_temporaryBindUI",value:function(t,e){if(void 0===this.body.eventListeners[t])throw new Error("This UI function does not exist. Typo? You tried: "+t+" possible are: "+(0,a.default)((0,s.default)(this.body.eventListeners)));this.temporaryUIFunctions[t]=this.body.eventListeners[t],this.body.eventListeners[t]=e}},{key:"_unbindTemporaryUIs",value:function(){for(var t in this.temporaryUIFunctions)this.temporaryUIFunctions.hasOwnProperty(t)&&(this.body.eventListeners[t]=this.temporaryUIFunctions[t],delete this.temporaryUIFunctions[t]);this.temporaryUIFunctions={}}},{key:"_unbindTemporaryEvents",value:function(){for(var t=0;t<this.temporaryEventFunctions.length;t++){var e=this.temporaryEventFunctions[t].event,i=this.temporaryEventFunctions[t].boundFunction;this.body.emitter.off(e,i)}this.temporaryEventFunctions=[]}},{key:"_bindHammerToDiv",value:function(t,e){var i=new m(t,{});v.onTouch(i,e),this.manipulationHammers.push(i)}},{key:"_cleanupTemporaryNodesAndEdges",value:function(){for(var t=0;t<this.temporaryIds.edges.length;t++){this.body.edges[this.temporaryIds.edges[t]].disconnect(),delete this.body.edges[this.temporaryIds.edges[t]];var e=this.body.edgeIndices.indexOf(this.temporaryIds.edges[t]);-1!==e&&this.body.edgeIndices.splice(e,1)}for(var i=0;i<this.temporaryIds.nodes.length;i++){delete this.body.nodes[this.temporaryIds.nodes[i]];var o=this.body.nodeIndices.indexOf(this.temporaryIds.nodes[i]);-1!==o&&this.body.nodeIndices.splice(o,1)}this.temporaryIds={nodes:[],edges:[]}}},{key:"_controlNodeTouch",value:function(t){this.selectionHandler.unselectAll(),this.lastTouch=this.body.functions.getPointer(t.center),this.lastTouch.translation=f.extend({},this.body.view.translation)}},{key:"_controlNodeDragStart",value:function(t){var e=this.lastTouch,i=this.selectionHandler._pointerToPositionObject(e),o=this.body.nodes[this.temporaryIds.nodes[0]],n=this.body.nodes[this.temporaryIds.nodes[1]],s=this.body.edges[this.edgeBeingEditedId];this.selectedControlNode=void 0;var r=o.isOverlappingWith(i),a=n.isOverlappingWith(i);!0===r?(this.selectedControlNode=o,s.edgeType.from=o):!0===a&&(this.selectedControlNode=n,s.edgeType.to=n),void 0!==this.selectedControlNode&&this.selectionHandler.selectObject(this.selectedControlNode),this.body.emitter.emit("_redraw")}},{key:"_controlNodeDrag",value:function(t){this.body.emitter.emit("disablePhysics");var e=this.body.functions.getPointer(t.center),i=this.canvas.DOMtoCanvas(e);if(void 0!==this.selectedControlNode)this.selectedControlNode.x=i.x,this.selectedControlNode.y=i.y;else{var o=e.x-this.lastTouch.x,n=e.y-this.lastTouch.y;this.body.view.translation={x:this.lastTouch.translation.x+o,y:this.lastTouch.translation.y+n}}this.body.emitter.emit("_redraw")}},{key:"_controlNodeDragEnd",value:function(t){var e=this.body.functions.getPointer(t.center),i=this.selectionHandler._pointerToPositionObject(e),o=this.body.edges[this.edgeBeingEditedId];if(void 0!==this.selectedControlNode){this.selectionHandler.unselectAll();for(var n=this.selectionHandler._getAllNodesOverlappingWith(i),s=void 0,r=n.length-1;r>=0;
19302r--)if(n[r]!==this.selectedControlNode.id){s=this.body.nodes[n[r]];break}if(void 0!==s&&void 0!==this.selectedControlNode)if(!0===s.isCluster)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var a=this.body.nodes[this.temporaryIds.nodes[0]];this.selectedControlNode.id===a.id?this._performEditEdge(s.id,o.to.id):this._performEditEdge(o.from.id,s.id)}else o.updateEdgeType(),this.body.emitter.emit("restorePhysics");this.body.emitter.emit("_redraw")}}},{key:"_handleConnect",value:function(t){if((new Date).valueOf()-this.touchTime>100){this.lastTouch=this.body.functions.getPointer(t.center),this.lastTouch.translation=f.extend({},this.body.view.translation);var e=this.lastTouch,i=this.selectionHandler.getNodeAt(e);if(void 0!==i)if(!0===i.isCluster)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var o=this._getNewTargetNode(i.x,i.y);this.body.nodes[o.id]=o,this.body.nodeIndices.push(o.id);var n=this.body.functions.createEdge({id:"connectionEdge"+f.randomUUID(),from:i.id,to:o.id,physics:!1,smooth:{enabled:!0,type:"continuous",roundness:.5}});this.body.edges[n.id]=n,this.body.edgeIndices.push(n.id),this.temporaryIds.nodes.push(o.id),this.temporaryIds.edges.push(n.id)}this.touchTime=(new Date).valueOf()}}},{key:"_dragControlNode",value:function(t){var e=this.body.functions.getPointer(t.center);if(void 0!==this.temporaryIds.nodes[0]){var i=this.body.nodes[this.temporaryIds.nodes[0]];i.x=this.canvas._XconvertDOMtoCanvas(e.x),i.y=this.canvas._YconvertDOMtoCanvas(e.y),this.body.emitter.emit("_redraw")}else{var o=e.x-this.lastTouch.x,n=e.y-this.lastTouch.y;this.body.view.translation={x:this.lastTouch.translation.x+o,y:this.lastTouch.translation.y+n}}}},{key:"_finishConnect",value:function(t){var e=this.body.functions.getPointer(t.center),i=this.selectionHandler._pointerToPositionObject(e),o=void 0;void 0!==this.temporaryIds.edges[0]&&(o=this.body.edges[this.temporaryIds.edges[0]].fromId);for(var n=this.selectionHandler._getAllNodesOverlappingWith(i),s=void 0,r=n.length-1;r>=0;r--)if(-1===this.temporaryIds.nodes.indexOf(n[r])){s=this.body.nodes[n[r]];break}this._cleanupTemporaryNodesAndEdges(),void 0!==s&&(!0===s.isCluster?alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError):void 0!==this.body.nodes[o]&&void 0!==this.body.nodes[s.id]&&this._performAddEdge(o,s.id)),this.body.emitter.emit("_redraw")}},{key:"_dragStartEdge",value:function(t){var e=this.lastTouch;this.selectionHandler._generateClickEvent("dragStart",t,e,void 0,!0)}},{key:"_performAddNode",value:function(t){var e=this,i={id:f.randomUUID(),x:t.pointer.canvas.x,y:t.pointer.canvas.y,label:"new"};if("function"==typeof this.options.addNode){if(2!==this.options.addNode.length)throw this.showManipulatorToolbar(),new Error("The function for add does not support two arguments (data,callback)");this.options.addNode(i,function(t){null!==t&&void 0!==t&&"addNode"===e.inMode&&(e.body.data.nodes.getDataSet().add(t),e.showManipulatorToolbar())})}else this.body.data.nodes.getDataSet().add(i),this.showManipulatorToolbar()}},{key:"_performAddEdge",value:function(t,e){var i=this,o={from:t,to:e};if("function"==typeof this.options.addEdge){if(2!==this.options.addEdge.length)throw new Error("The function for connect does not support two arguments (data,callback)");this.options.addEdge(o,function(t){null!==t&&void 0!==t&&"addEdge"===i.inMode&&(i.body.data.edges.getDataSet().add(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().add(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}},{key:"_performEditEdge",value:function(t,e){var i=this,o={id:this.edgeBeingEditedId,from:t,to:e,label:this.body.data.edges._data[this.edgeBeingEditedId].label},n=this.options.editEdge;if("object"===(void 0===n?"undefined":(0,d.default)(n))&&(n=n.editWithoutDrag),"function"==typeof n){if(2!==n.length)throw new Error("The function for edit does not support two arguments (data, callback)");n(o,function(t){null===t||void 0===t||"editEdge"!==i.inMode?(i.body.edges[o.id].updateEdgeType(),i.body.emitter.emit("_redraw"),i.showManipulatorToolbar()):(i.body.data.edges.getDataSet().update(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().update(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}}]),t}();e.default=g}
19302,function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(239),u=o(l),c=function(){function t(e,i,o){(0,a.default)(this,t),this.body=e,this.springLength=i,this.springConstant=o,this.distanceSolver=new u.default}return(0,d.default)(t,[{key:"setOptions",value:function(t){t&&(t.springLength&&(this.springLength=t.springLength),t.springConstant&&(this.springConstant=t.springConstant))}},{key:"solve",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=this.distanceSolver.getDistances(this.body,t,e);this._createL_matrix(o),this._createK_matrix(o),this._createE_matrix();for(var n=0,r=Math.max(1e3,Math.min(10*this.body.nodeIndices.length,6e3)),a=1e9,h=0,d=0,l=0,u=0,c=0;a>.01&&n<r;){n+=1;var p=this._getHighestEnergyNode(i),f=(0,s.default)(p,4);for(h=f[0],a=f[1],d=f[2],l=f[3],u=a,c=0;u>1&&c<5;){c+=1,this._moveNode(h,d,l);var m=this._getEnergy(h),v=(0,s.default)(m,3);u=v[0],d=v[1],l=v[2]}}}},{key:"_getHighestEnergyNode",value:function(t){for(var e=this.body.nodeIndices,i=this.body.nodes,o=0,n=e[0],r=0,a=0,h=0;h<e.length;h++){var d=e[h];if(!1===i[d].predefinedPosition||!0===i[d].isCluster&&!0===t||!0===i[d].options.fixed.x||!0===i[d].options.fixed.y){var l=this._getEnergy(d),u=(0,s.default)(l,3),c=u[0],p=u[1],f=u[2];o<c&&(o=c,n=d,r=p,a=f)}}return[n,o,r,a]}},{key:"_getEnergy",value:function(t){var e=(0,s.default)(this.E_sums[t],2),i=e[0],o=e[1];return[Math.sqrt(Math.pow(i,2)+Math.pow(o,2)),i,o]}},{key:"_moveNode",value:function(t,e,i){for(var o=this.body.nodeIndices,n=this.body.nodes,s=0,r=0,a=0,h=n[t].x,d=n[t].y,l=this.K_matrix[t],u=this.L_matrix[t],c=0;c<o.length;c++){var p=o[c];if(p!==t){var f=n[p].x,m=n[p].y,v=l[p],g=u[p],y=1/Math.pow(Math.pow(h-f,2)+Math.pow(d-m,2),1.5);s+=v*(1-g*Math.pow(d-m,2)*y),r+=v*(g*(h-f)*(d-m)*y),a+=v*(1-g*Math.pow(h-f,2)*y)}}var b=s,_=r,w=e,x=a,k=i,S=(w/b+k/_)/(_/b-x/_),D=-(_*S+w)/b;n[t].x+=D,n[t].y+=S,this._updateE_matrix(t)}},{key:"_createL_matrix",value:function(t){var e=this.body.nodeIndices,i=this.springLength;this.L_matrix=[];for(var o=0;o<e.length;o++){this.L_matrix[e[o]]={};for(var n=0;n<e.length;n++)this.L_matrix[e[o]][e[n]]=i*t[e[o]][e[n]]}}},{key:"_createK_matrix",value:function(t){var e=this.body.nodeIndices,i=this.springConstant;this.K_matrix=[];for(var o=0;o<e.length;o++){this.K_matrix[e[o]]={};for(var n=0;n<e.length;n++)this.K_matrix[e[o]][e[n]]=i*Math.pow(t[e[o]][e[n]],-2)}}},{key:"_createE_matrix",value:function(){var t=this.body.nodeIndices,e=this.body.nodes;this.E_matrix={},this.E_sums={};for(var i=0;i<t.length;i++)this.E_matrix[t[i]]=[];for(var o=0;o<t.length;o++){for(var n=t[o],s=e[n].x,r=e[n].y,a=0,h=0,d=o;d<t.length;d++){var l=t[d];if(l!==n){var u=e[l].x,c=e[l].y,p=1/Math.sqrt(Math.pow(s-u,2)+Math.pow(r-c,2));this.E_matrix[n][d]=[this.K_matrix[n][l]*(s-u-this.L_matrix[n][l]*(s-u)*p),this.K_matrix[n][l]*(r-c-this.L_matrix[n][l]*(r-c)*p)],this.E_matrix[l][o]=this.E_matrix[n][d],a+=this.E_matrix[n][d][0],h+=this.E_matrix[n][d][1]}}this.E_sums[n]=[a,h]}}},{key:"_updateE_matrix",value:function(t){for(var e=this.body.nodeIndices,i=this.body.nodes,o=this.E_matrix[t],n=this.K_matrix[t],s=this.L_matrix[t],r=i[t].x,a=i[t].y,h=0,d=0,l=0;l<e.length;l++){var u=e[l];if(u!==t){var c=o[l],p=c[0],f=c[1],m=i[u].x,v=i[u].y,g=1/Math.sqrt(Math.pow(r-m,2)+Math.pow(a-v,2)),y=n[u]*(r-m-s[u]*(r-m)*g),b=n[u]*(a-v-s[u]*(a-v)*g);o[l]=[y,b],h+=y,d+=b;var _=this.E_sums[u];_[0]+=y-p,_[1]+=b-f}}this.E_sums[t]=[h,d]}}]),t}();e.default=c},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(){(0,s.default)(this,t)}return(0,a.default)(t,[{key:"getDistances",value:function(t,e,i){for(var o={},n=t.edges,s=0;s<e.length;s++){var r=e[s],a={};o[r]=a;for(var h=0;h<e.length;h++)a[e[h]]=s==h?0:1e9}for(var d=0;d<i.length;d++){var l=n[i[d]];!0===l.connected&&void 0!==o[l.fromId]&&void 0!==o[l.toId]&&(o[l.fromId][l.toId]=1,o[l.toId][l.fromId]=1)}for(var u=e.length,c=0;c<u;c++)for(var p=e[c],f=o[p],m=0;m<u-1;m++)for(var v=e[m],g=o[v],y=m+1;y<u;y++){var b=e[y],_=o[b],w=Math.min(g[b],g[p]+f[b]);g[b]=w,_[v]=w}return o}}]),t}();e.default=h}])});
19303//# sourceMappingURL=vis.map
19304(function(root,factory){if(typeof define==="function"&&define.amd){define(factory)}else if(typeof exports==="object"){module.exports=factory()}else{factory()(root.lunr)}})(this,function(){return function(lunr){lunr.stemmerSupport={Among:function(s,substring_i,result,method){this.toCharArray=function(s){var sLength=s.length,charArr=new Array(sLength);for(var i=0;i<sLength;i++)charArr[i]=s.charCodeAt(i);return charArr};if(!s&&s!=""||!substring_i&&substring_i!=0||!result)throw"Bad Among initialisation: s:"+s+", substring_i: "+substring_i+", result: "+result;this.s_size=s.length;this.s=this.toCharArray(s);this.substring_i=substring_i;this.result=result;this.method=method},SnowballProgram:function(){var current;return{bra:0,ket:0,limit:0,cursor:0,limit_backward:0,setCurrent:function(word){current=word;this.cursor=0;this.limit=word.length;this.limit_backward=0;this.bra=this.cursor;this.ket=this.limit},getCurrent:function(){var result=current;current=null;return result},in_grouping:function(s,min,max){if(this.cursor<this.limit){var ch=current.charCodeAt(this.cursor);if(ch<=max&&ch>=min){ch-=min;if(s[ch>>3]&1<<(ch&7)){this.cursor++;return true}}}return false},in_grouping_b:function(s,min,max){if(this.cursor>this.limit_backward){var ch=current.charCodeAt(this.cursor-1);if(ch<=max&&ch>=min){ch-=min;if(s[ch>>3]&1<<(ch&7)){this.cursor--;return true}}}return false},out_grouping:function(s,min,max){if(this.cursor<this.limit){var ch=current.charCodeAt(this.cursor);if(ch>max||ch<min){this.cursor++;return true}ch-=min;if(!(s[ch>>3]&1<<(ch&7))){this.cursor++;return true}}return false},out_grouping_b:function(s,min,max){if(this.cursor>this.limit_backward){var ch=current.charCodeAt(this.cursor-1);if(ch>max||ch<min){this.cursor--;return true}ch-=min;if(!(s[ch>>3]&1<<(ch&7))){this.cursor--;return true}}return false},eq_s:function(s_size,s){if(this.limit-this.cursor<s_size)return false;for(var i=0;i<s_size;i++)if(current.charCodeAt(this.cursor+i)!=s.charCodeAt(i))return false;this.cursor+=s_size;return true},eq_s_b:function(s_size,s){if(this.cursor-this.limit_backward<s_size)return false;for(var i=0;i<s_size;i++)if(current.charCodeAt(this.cursor-s_size+i)!=s.charCodeAt(i))return false;this.cursor-=s_size;return true},find_among:function(v,v_size){var i=0,j=v_size,c=this.cursor,l=this.limit,common_i=0,common_j=0,first_key_inspected=false;while(true){var k=i+(j-i>>1),diff=0,common=common_i<common_j?common_i:common_j,w=v[k];for(var i2=common;i2<w.s_size;i2++){if(c+common==l){diff=-1;break}diff=current.charCodeAt(c+common)-w.s[i2];if(diff)break;common++}if(diff<0){j=k;common_j=common}else{i=k;common_i=common}if(j-i<=1){if(i>0||j==i||first_key_inspected)break;first_key_inspected=true}}while(true){var w=v[i];if(common_i>=w.s_size){this.cursor=c+w.s_size;if(!w.method)return w.result;var res=w.method();this.cursor=c+w.s_size;if(res)return w.result}i=w.substring_i;if(i<0)return 0}},find_among_b:function(v,v_size){var i=0,j=v_size,c=this.cursor,lb=this.limit_backward,common_i=0,common_j=0,first_key_inspected=false;while(true){var k=i+(j-i>>1),diff=0,common=common_i<common_j?common_i:common_j,w=v[k];for(var i2=w.s_size-1-common;i2>=0;i2--){if(c-common==lb){diff=-1;break}diff=current.charCodeAt(c-1-common)-w.s[i2];if(diff)break;common++}if(diff<0){j=k;common_j=common}else{i=k;common_i=common}if(j-i<=1){if(i>0||j==i||first_key_inspected)break;first_key_inspected=true}}while(true){var w=v[i];if(common_i>=w.s_size){this.cursor=c-w.s_size;if(!w.method)return w.result;var res=w.method();this.cursor=c-w.s_size;if(res)return w.result}i=w.substring_i;if(i<0)return 0}}
19304,replace_s:function(c_bra,c_ket,s){var adjustment=s.length-(c_ket-c_bra),left=current.substring(0,c_bra),right=current.substring(c_ket);current=left+s+right;this.limit+=adjustment;if(this.cursor>=c_ket)this.cursor+=adjustment;else if(this.cursor>c_bra)this.cursor=c_bra;return adjustment},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>current.length)throw"faulty slice operation"},slice_from:function(s){this.slice_check();this.replace_s(this.bra,this.ket,s)},slice_del:function(){this.slice_from("")},insert:function(c_bra,c_ket,s){var adjustment=this.replace_s(c_bra,c_ket,s);if(c_bra<=this.bra)this.bra+=adjustment;if(c_bra<=this.ket)this.ket+=adjustment},slice_to:function(){this.slice_check();return current.substring(this.bra,this.ket)},eq_v_b:function(s){return this.eq_s_b(s.length,s)}}}}}});
19305
19306(function (global, factory) {
19307  typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('jquery')) :
19308  typeof define === 'function' && define.amd ? define(['jquery'], factory) :
19309  (factory(global.jQuery));
19310}(this, (function ($) {
19311  'use strict';
19312
19313  $.fn.datepicker.languages['fr-FR'] = {
19314    format: 'dd/mm/yyyy',
19315    days: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
19316    daysShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
19317    daysMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'],
19318    weekStart: 1,
19319    months: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
19320    monthsShort: ['Jan', 'Fev', 'Mar', 'Avr', 'Mai', 'Jun', 'Jui', 'Aou', 'Sep', 'Oct', 'Nov', 'Dec']
19321  };
19322})));
19323
19324(function(root,factory){if(typeof define==="function"&&define.amd){define(factory)}else if(typeof exports==="object"){module.exports=factory()}else{factory()(root.lunr)}})(this,function(){return function(lunr){if("undefined"===typeof lunr){throw new Error("Lunr is not present. Please include / require Lunr before this script.")}if("undefined"===typeof lunr.stemmerSupport){throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.")}lunr.fr=function(){this.pipeline.reset();this.pipeline.add(lunr.fr.stopWordFilter,lunr.fr.stemmer)};lunr.fr.stemmer=function(){var Among=lunr.stemmerSupport.Among,SnowballProgram=lunr.stemmerSupport.SnowballProgram,st=new function FrenchStemmer(){var a_0=[new Among("col",-1,-1),new Among("par",-1,-1),new Among("tap",-1,-1)],a_1=[new Among("",-1,4),new Among("I",0,1),new Among("U",0,2),new Among("Y",0,3)],a_2=[new Among("iqU",-1,3),new Among("abl",-1,3),new Among("Ièr",-1,4),new Among("ièr",-1,4),new Among("eus",-1,2),new Among("iv",-1,1)],a_3=[new Among("ic",-1,2),new Among("abil",-1,1),new Among("iv",-1,3)],a_4=[new Among("iqUe",-1,1),new Among("atrice",-1,2),new Among("ance",-1,1),new Among("ence",-1,5),new Among("logie",-1,3),new Among("able",-1,1),new Among("isme",-1,1),new Among("euse",-1,11),new Among("iste",-1,1),new Among("ive",-1,8),new Among("if",-1,8),new Among("usion",-1,4),new Among("ation",-1,2),new Among("ution",-1,4),new Among("ateur",-1,2),new Among("iqUes",-1,1),new Among("atrices",-1,2),new Among("ances",-1,1),new Among("ences",-1,5),new Among("logies",-1,3),new Among("ables",-1,1),new Among("ismes",-1,1),new Among("euses",-1,11),new Among("istes",-1,1),new Among("ives",-1,8),new Among("ifs",-1,8),new Among("usions",-1,4),new Among("ations",-1,2),new Among("utions",-1,4),new Among("ateurs",-1,2),new Among("ments",-1,15),new Among("ements",30,6),new Among("issements",31,12),new Among("ités",-1,7),new Among("ment",-1,15),new Among("ement",34,6),new Among("issement",35,12),new Among("amment",34,13),new Among("emment",34,14),new Among("aux",-1,10),new Among("eaux",39,9),new Among("eux",-1,1),new Among("ité",-1,7)],a_5=[new Among("ira",-1,1),new Among("ie",-1,1),new Among("isse",-1,1),new Among("issante",-1,1),new Among("i",-1,1),new Among("irai",4,1),new Among("ir",-1,1),new Among("iras",-1,1),new Among("ies",-1,1),new Among("îmes",-1,1),new Among("isses",-1,1),new Among("issantes",-1,1),new Among("îtes",-1,1),new Among("is",-1,1),new Among("irais",13,1),new Among("issais",13,1),new Among("irions",-1,1),new Among("issions",-1,1),new Among("irons",-1,1),new Among("issons",-1,1),new Among("issants",-1,1),new Among("it",-1,1),new Among("irait",21,1),new Among("issait",21,1),new Among("issant",-1,1),new Among("iraIent",-1,1),new Among("issaIent",-1,1),new Among("irent",-1,1),new Among("issent",-1,1),new Among("iront",-1,1),new Among("ît",-1,1),new Among("iriez",-1,1),new Among("issiez",-1,1),new Among("irez",-1,1),new Among("issez",-1,1)],a_6=[new Among("a",-1,3),new Among("era",0,2),new Among("asse",-1,3),new Among("ante",-1,3),new Among("ée",-1,2),new Among("ai",-1,3),new Among("erai",5,2),new Among("er",-1,2),new Among("as",-1,3),new Among("eras",8,2),new Among("âmes",-1,3),new Among("asses",-1,3),new Among("antes",-1,3),new Among("âtes",-1,3),new Among("ées",-1,2),new Among("ais",-1,3),new Among("erais",15,2),new Among("ions",-1,1),new Among("erions",17,2),new Among("assions",17,3),new Among("erons",-1,2),new Among("ants",-1,3),new Among("és",-1,2),new Among("ait",-1,3),new Among("erait",23,2),new Among("ant",-1,3),new Among("aIent",-1,3),new Among("eraIent",26,2),new Among("èrent",-1,2),new Among("assent",-1,3),new Among("eront",-1,2),new Among("ât",-1,3),new Among("ez",-1,2),new Among("iez",32,2),new Among("eriez",33,2),new Among("assiez",33,3),new Among("erez",32,2),new Among("é",-1,2)],a_7=[new Among("e",-1,3),new Among("Ière",0,2),new Among("ière",0,2),new Among("ion",-1,1),new Among("Ier",-1,2),new Among("ier",-1,2),new Among("ë",-1,4)],a_8=[new Among("ell",-1,-1),new Among("eill",-1,-1),new Among("enn",-1,-1),new Among("onn",-1,-1),new Among("ett",-1,-1)],g_v=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],g_keep_with_s=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],I_p2,I_p1,I_pV,sbp=new SnowballProgram;this.setCurrent=function(word){sbp.setCurrent(word)};this.getCurrent=function(){return sbp.getCurrent()};
19324function habr1(c1,c2,v_1){if(sbp.eq_s(1,c1)){sbp.ket=sbp.cursor;if(sbp.in_grouping(g_v,97,251)){sbp.slice_from(c2);sbp.cursor=v_1;return true}}return false}function habr2(c1,c2,v_1){if(sbp.eq_s(1,c1)){sbp.ket=sbp.cursor;sbp.slice_from(c2);sbp.cursor=v_1;return true}return false}function r_prelude(){var v_1,v_2;while(true){v_1=sbp.cursor;if(sbp.in_grouping(g_v,97,251)){sbp.bra=sbp.cursor;v_2=sbp.cursor;if(habr1("u","U",v_1))continue;sbp.cursor=v_2;if(habr1("i","I",v_1))continue;sbp.cursor=v_2;if(habr2("y","Y",v_1))continue}sbp.cursor=v_1;sbp.bra=v_1;if(!habr1("y","Y",v_1)){sbp.cursor=v_1;if(sbp.eq_s(1,"q")){sbp.bra=sbp.cursor;if(habr2("u","U",v_1))continue}sbp.cursor=v_1;if(v_1>=sbp.limit)return;sbp.cursor++}}}function habr3(){while(!sbp.in_grouping(g_v,97,251)){if(sbp.cursor>=sbp.limit)return true;sbp.cursor++}while(!sbp.out_grouping(g_v,97,251)){if(sbp.cursor>=sbp.limit)return true;sbp.cursor++}return false}function r_mark_regions(){var v_1=sbp.cursor;I_pV=sbp.limit;I_p1=I_pV;I_p2=I_pV;if(sbp.in_grouping(g_v,97,251)&&sbp.in_grouping(g_v,97,251)&&sbp.cursor<sbp.limit)sbp.cursor++;else{sbp.cursor=v_1;if(!sbp.find_among(a_0,3)){sbp.cursor=v_1;do{if(sbp.cursor>=sbp.limit){sbp.cursor=I_pV;break}sbp.cursor++}while(!sbp.in_grouping(g_v,97,251))}}I_pV=sbp.cursor;sbp.cursor=v_1;if(!habr3()){I_p1=sbp.cursor;if(!habr3())I_p2=sbp.cursor}}function r_postlude(){var among_var,v_1;while(true){v_1=sbp.cursor;sbp.bra=v_1;among_var=sbp.find_among(a_1,4);if(!among_var)break;sbp.ket=sbp.cursor;switch(among_var){case 1:sbp.slice_from("i");break;case 2:sbp.slice_from("u");break;case 3:sbp.slice_from("y");break;case 4:if(sbp.cursor>=sbp.limit)return;sbp.cursor++;break}}}function r_RV(){return I_pV<=sbp.cursor}function r_R1(){return I_p1<=sbp.cursor}function r_R2(){return I_p2<=sbp.cursor}function r_standard_suffix(){var among_var,v_1;sbp.ket=sbp.cursor;among_var=sbp.find_among_b(a_4,43);if(among_var){sbp.bra=sbp.cursor;switch(among_var){case 1:if(!r_R2())return false;sbp.slice_del();break;case 2:if(!r_R2())return false;sbp.slice_del();sbp.ket=sbp.cursor;if(sbp.eq_s_b(2,"ic")){sbp.bra=sbp.cursor;if(!r_R2())sbp.slice_from("iqU");else sbp.slice_del()}break;case 3:if(!r_R2())return false;sbp.slice_from("log");break;case 4:if(!r_R2())return false;sbp.slice_from("u");break;case 5:if(!r_R2())return false;sbp.slice_from("ent");break;case 6:if(!r_RV())return false;sbp.slice_del();sbp.ket=sbp.cursor;among_var=sbp.find_among_b(a_2,6);if(among_var){sbp.bra=sbp.cursor;switch(among_var){case 1:if(r_R2()){sbp.slice_del();sbp.ket=sbp.cursor;if(sbp.eq_s_b(2,"at")){sbp.bra=sbp.cursor;if(r_R2())sbp.slice_del()}}break;case 2:if(r_R2())sbp.slice_del();else if(r_R1())sbp.slice_from("eux");break;case 3:if(r_R2())sbp.slice_del();break;case 4:if(r_RV())sbp.slice_from("i");break}}break;case 7:if(!r_R2())return false;sbp.slice_del();sbp.ket=sbp.cursor;among_var=sbp.find_among_b(a_3,3);if(among_var){sbp.bra=sbp.cursor;switch(among_var){case 1:if(r_R2())sbp.slice_del();else sbp.slice_from("abl");break;case 2:if(r_R2())sbp.slice_del();else sbp.slice_from("iqU");break;case 3:if(r_R2())sbp.slice_del();break}}break;case 8:if(!r_R2())return false;sbp.slice_del();sbp.ket=sbp.cursor;if(sbp.eq_s_b(2,"at")){sbp.bra=sbp.cursor;if(r_R2()){sbp.slice_del();sbp.ket=sbp.cursor;if(sbp.eq_s_b(2,"ic")){sbp.bra=sbp.cursor;if(r_R2())sbp.slice_del();else sbp.slice_from("iqU");break}}}break;case 9:sbp.slice_from("eau");break;case 10:if(!r_R1())return false;sbp.slice_from("al");break;case 11:if(r_R2())sbp.slice_del();else if(!r_R1())return false;else sbp.slice_from("eux");break;case 12:if(!r_R1()||!sbp.out_grouping_b(g_v,97,251))return false;sbp.slice_del();break;case 13:if(r_RV())sbp.slice_from("ant");return false;case 14:if(r_RV())sbp.slice_from("ent");return false;case 15:v_1=sbp.limit-sbp.cursor;if(sbp.in_grouping_b(g_v,97,251)&&r_RV()){sbp.cursor=sbp.limit-v_1;sbp.slice_del()}return false}return true}return false}function r_i_verb_suffix(){var among_var,v_1;if(sbp.cursor<I_pV)return false;v_1=sbp.limit_backward;sbp.limit_backward=I_pV;sbp.ket=sbp.cursor;among_var=sbp.find_among_b(a_5,35);if(!among_var){sbp.limit_backward=v_1;return false}sbp.bra=sbp.cursor;if(among_var==1){if(!sbp.out_grouping_b(g_v,97,251)){sbp.limit_backward=v_1;return false}sbp.slice_del()}sbp.limit_backward=v_1;return true}function r_verb_suffix(){var among_var,v_2,v_3;if(sbp.cursor<I_pV)return false;v_2=sbp.limit_backward;sbp.limit_backward=I_pV;sbp.ket=sbp.cursor;among_var=sbp.find_among_b(a_6,38);if(!among_var){sbp.limit_backward=v_2;return false}sbp.bra=sbp.cursor;switch(among_var){case 1:if(!r_R2()){sbp.limit_backward=v_2;return false}sbp.slice_del();break;case 2:sbp.slice_del();break;case 3:sbp.slice_del();v_3=sbp.limit-sbp.cursor;sbp.ket=sbp.cursor;if(sbp.eq_s_b(1,"e")){sbp.bra=sbp.cursor;sbp.slice_del()}else sbp.cursor=sbp.limit-v_3;break}sbp.limit_backward=v_2;return true}function r_residual_suffix(){var among_var,v_1=sbp.limit-sbp.cursor,v_2,v_4,v_5;sbp.ket=sbp.cursor;if(sbp.eq_s_b(1,"s")){sbp.bra=sbp.cursor;v_2=sbp.limit-sbp.cursor;if(sbp.out_grouping_b(g_keep_with_s,97,232)){sbp.cursor=sbp.limit-v_2;sbp.slice_del()}else sbp.cursor=sbp.limit-v_1}else sbp.cursor=sbp.limit-v_1;if(sbp.cursor>=I_pV){v_4=sbp.limit_backward;sbp.limit_backward=I_pV;sbp.ket=sbp.cursor;among_var=sbp.find_among_b(a_7,7);if(among_var){sbp.bra=sbp.cursor;switch(among_var){case 1:if(r_R2()){v_5=sbp.limit-sbp.cursor;
19324if(!sbp.eq_s_b(1,"s")){sbp.cursor=sbp.limit-v_5;if(!sbp.eq_s_b(1,"t"))break}sbp.slice_del()}break;case 2:sbp.slice_from("i");break;case 3:sbp.slice_del();break;case 4:if(sbp.eq_s_b(2,"gu"))sbp.slice_del();break}}sbp.limit_backward=v_4}}function r_un_double(){var v_1=sbp.limit-sbp.cursor;if(sbp.find_among_b(a_8,5)){sbp.cursor=sbp.limit-v_1;sbp.ket=sbp.cursor;if(sbp.cursor>sbp.limit_backward){sbp.cursor--;sbp.bra=sbp.cursor;sbp.slice_del()}}}function r_un_accent(){var v_1,v_2=1;while(sbp.out_grouping_b(g_v,97,251))v_2--;if(v_2<=0){sbp.ket=sbp.cursor;v_1=sbp.limit-sbp.cursor;if(!sbp.eq_s_b(1,"é")){sbp.cursor=sbp.limit-v_1;if(!sbp.eq_s_b(1,"è"))return}sbp.bra=sbp.cursor;sbp.slice_from("e")}}function habr5(){if(!r_standard_suffix()){sbp.cursor=sbp.limit;if(!r_i_verb_suffix()){sbp.cursor=sbp.limit;if(!r_verb_suffix()){sbp.cursor=sbp.limit;r_residual_suffix();return}}}sbp.cursor=sbp.limit;sbp.ket=sbp.cursor;if(sbp.eq_s_b(1,"Y")){sbp.bra=sbp.cursor;sbp.slice_from("i")}else{sbp.cursor=sbp.limit;if(sbp.eq_s_b(1,"ç")){sbp.bra=sbp.cursor;sbp.slice_from("c")}}}this.stem=function(){var v_1=sbp.cursor;r_prelude();sbp.cursor=v_1;r_mark_regions();sbp.limit_backward=v_1;sbp.cursor=sbp.limit;habr5();sbp.cursor=sbp.limit;r_un_double();sbp.cursor=sbp.limit;r_un_accent();sbp.cursor=sbp.limit_backward;r_postlude();return true}};return function(word){st.setCurrent(word);st.stem();return st.getCurrent()}}();lunr.Pipeline.registerFunction(lunr.fr.stemmer,"stemmer-fr");lunr.fr.stopWordFilter=function(token){if(lunr.fr.stopWordFilter.stopWords.indexOf(token)===-1){return token}};lunr.fr.stopWordFilter.stopWords=new lunr.SortedSet;lunr.fr.stopWordFilter.stopWords.length=164;lunr.fr.stopWordFilter.stopWords.elements=" ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes".split(" ");lunr.Pipeline.registerFunction(lunr.fr.stopWordFilter,"stopWordFilter-fr")}});
19325
19326(function ($) {
19327    'use strict';
19328
19329    window.dataLayer = window.dataLayer || [];
19330    window.dataLayer.push({
19331        event: 'jQueryLoaded'
19332    });
19333
19334    $.fn.cfDatepicker = $.fn.datepicker.noConflict();
19335
19336    if (window.static) {
19337        document.querySelectorAll('.searchbox__form__input').forEach(function (searchField) {
19338            autocomplete(searchField, [
19339                'Appels à projets générique',
19340                'Appel à projets spécifique',
19341                'Appels à projets & investissements d’avenir',
19342                'Projets financés',
19343            ]);
19344        });
19345    }
19346
19347    if (typeof(NodeList.prototype.forEach)!==typeof(alert)) {
19348        NodeList.prototype.forEach=Array.prototype.forEach;
19349    }
19350    
19351    document.querySelectorAll('.tag-download').forEach(function (tag) {
19352        tag.addEventListener('click', function () {
19353            this.parentElement.parentElement.classList.toggle('hide');
19354        });
19355    });
19356
19357    let $body = $('body');
19358    $body.on('change', '.sites-select__select', function () {
19359        location.assign(this.selectedOptions[0].value);
19360    });
19361
19362    // Gestion des catégories dans la FAQ
19363    let $checkboxes = $('.form-checkbox-styled');
19364    if ($checkboxes.length) {
19365        var categories = [];
19366        var categoriesHtml = [];
19367        var cpt = 1;
19368        $('.card .categories .tag-type').each(function () {
19369            var html = '';
19370            if ($.inArray($(this).html(), categories) === -1) {
19371                html = '<label for="checkbox' + cpt + '" class="tag-input-checkbox">';
19372                html += '<input type="checkbox" id="checkbox' + cpt + '" name="type2">';
19373                html += '<div class="tag-input-checkbox__bg"></div>';
19374                html += '<span>' + $(this).html() + '</span>';
19375                html += '</label>';
19376
19377                categories.push($(this).html());
19378                categoriesHtml.push(html);
19379                cpt++;
19380            }
19381        });
19382
19383        $checkboxes.html(categoriesHtml);
19384
19385        // Gestion de l'affichage des questions grâce au filtre des catégories
19386        $body.on('click', '.tag-input-checkbox', function (e) {
19387            var category = '';
19388            var filter = false;
19389            let $checkbox = $('.tag-input-checkbox');
19390            $checkbox.each(function () {
19391                if ($(this).find('input').prop('checked')) {
19392                    filter = true;
19393                }
19394            });
19395            if (filter) {
19396                $checkbox.each(function () {
19397                    category = $(this).find('span').html();
19398                    if ($(this).find('input').prop('checked')) {
19399                        $('.card').each(function () {
19400                            if ($(this).find('.categories .tag-type').html() === category) {
19401                                $(this).show();
19402                            }
19403                        });
19404                    } else {
19405                        $('.card').each(function () {
19406                            if ($(this).find('.categories .tag-type').html() === category) {
19407                                $(this).hide();
19408                            }
19409                        });
19410                    }
19411                });
19412            } else {
19413                $('.card').each(function () {
19414                    $(this).show();
19415                });
19416            }
19417        });
19418    }
19419})(jQuery);
19420
19421function autocomplete(input, arr) {
19422    let currentFocus,
19423        $itemlist = [],
19424        $results = jQuery(input).closest('.search-form').parent().find('.search-results'),
19425        $form = jQuery(input).closest('form'),
19426        closeTimeout = null;
19427
19428    let addActive = function (x) {
19429        if (!x) return false;
19430
19431        removeActive(x);
19432
19433        if (currentFocus >= x.length) currentFocus = 0;
19434        if (currentFocus < 0) currentFocus = (x.length - 1);
19435
19436        x[currentFocus].classList.add('hover');
19437    };
19438
19439    let removeActive = function(x) {
19440        for (let i = 0; i < x.length; i++) {
19441            x[i].classList.remove('hover');
19442        }
19443    };
19444
19445    let closeAllLists = function() {
19446        if (closeTimeout) {
19447            window.clearTimeout(closeTimeout);
19448            closeTimeout = null;
19449        }
19450        if ($itemlist.length) {
19451            $itemlist.each(function () {
19452                this.parentNode && this.parentNode.removeChild(this);
19453            });
19454        }
19455        $itemlist = [];
19456        $results.hide();
19457    };
19458
19459    input.setChoices = function(choices) {
19460        currentFocus = -1;
19461        closeAllLists();
19462        if (choices.length === 0) {
19463            return;
19464        }
19465        a = document.createElement('UL');
19466        a.setAttribute('class', 'autocomplete-items');
19467        $itemlist = $(a);
19468
19469        let container = this.parentNode.parentNode;
19470
19471        $results.append(a);
19472        $results.show();
19473
19474        let val = input.value;
19475        let $tmp = $('<p></p>');
19476        jQuery.each(choices, function (term, termIndex) {
19477            let startIndex = parseInt(term.toUpperCase().indexOf(val.toUpperCase()));
19478
19479            if (startIndex > -1) {
19480                b = document.createElement('LI');
19481                c = document.createElement('A');
19482
19483                c.innerHTML = $tmp.text(term.substr(0, startIndex)).html();
19484                c.innerHTML += "<strong>" + $tmp.text(term.substr(startIndex, val.length)).html() + "</strong>";
19485                c.innerHTML += $tmp.text(term.substr(startIndex + val.length)).html();
19486                c.innerHTML += "<span class=\"count\">(" + $tmp.text(termIndex).html() + ")</span>";
19487                b.choice = term;
19488
19489                b.addEventListener('click', function () {
19490                    input.value = this.choice;
19491                    closeAllLists();
19492                    if ($form.length) {
19493                        $form[0].submit();
19494                    }
19495                });
19496
19497                c.addEventListener('click', function () {
19498                    this.parentNode.click();
19499                });
19500
19501                b.appendChild(c);
19502                a.appendChild(b);
19503            }
19504        });
19505    };
19506
19507    if (window.static) {
19508        input.addEventListener('input', function () {
19509            let a, b, c, i, val = this.value;
19510            closeAllLists();
19511
19512            if (!val) {
19513                return false;
19514            }
19515
19516            this.setChoices(arr);
19517        });
19518    }
19519
19520    input.addEventListener('keydown', function (e) {
19521        let x = $itemlist[0];
19522
19523        if (x) x = x.childNodes;
19524        else return;
19525
19526        if (e.keyCode === 40) {
19527            currentFocus++;
19528            addActive(x);
19529        } else if (e.keyCode === 38) {
19530            currentFocus--;
19531            addActive(x);
19532        } else if (e.keyCode === 13) {
19533            if (currentFocus > -1) {
19534                if (x) x[currentFocus].click();
19535            }
19536        } else if (e.keyCode === 27) {
19537            closeAllLists();
19538        }
19539    });
19540
19541    let $close = $form.next('.search-close');
19542    if ($close.length > 0) {
19543        $close.on('click', function () {
19544            input.value = '';
19545            closeAllLists();
19546        });
19547    } else {
19548        jQuery(input).on('blur', function () {
19549            closeTimeout = window.setTimeout(function() {
19550                closeTimeout = null;
19551                closeAllLists();
19552            }, 200);
19553        });
19554    }
19555    input.setChoices(arr);
19556}
19557
19558(function ($) {
19559    'use strict';
19560
19561    let contactFormToggle = document.getElementById('jsContactFormToggleButton');
19562    if (contactFormToggle) {
19563        contactFormToggle.addEventListener('click', function (event) {
19564            event.preventDefault();
19565            this.parentNode.classList.add('d-none');
19566            updateContactForm();
19567            return false;
19568        });
19569    }
19570    let $contactFormSelect = $('.jsContactFormToggleSelect');
19571    if ($contactFormSelect) {
19572        $contactFormSelect.on('change', function (event) {
19573            if ($('#jsContactFormToggleButton').parent().hasClass('d-none')) {
19574                updateContactForm();
19575            }
19576            return false;
19577        });
19578    }
19579
19580    function updateContactForm() {
19581        var cid = $contactFormSelect.val(),
19582            label = $contactFormSelect.find('option:selected').text();
19583
19584        $('.jsContactFormToggleArea > div').removeClass('show');
19585        $('.jsContactFormToggleArea').find('#c' + cid).addClass('show');
19586        $('.jsContactFormToggleArea .show .input-hidden-subject input').val(label);
19587    }
19588
19589    $.urlParam = function (name) {
19590        var results = new RegExp('[?&]' + name + '=([^&]*)').exec(location.search)
19591        if (results == null) {
19592            return null;
19593        } else {
19594            return results[1] || 0;
19595        }
19596    };
19597
19598    if ($.urlParam('realFormId')) {
19599        var realFormId = $.urlParam('realFormId');
19600        $contactFormSelect.val(realFormId);
19601        $('#c' + realFormId).show();
19602        $('.jsContactFormToggleSelectArea').hide();
19603        $('#jsContactFormToggleButton').hide();
19604    }
19605
19606        $('.card.appel').on('click', '.infos, .close_content, .container-img, .text_content', function() {
19607            let parents = $(this).parents('.card');
19608            let content = parents.find('.content');
19609            let cardHeader = parents.find('.card-header');
19610            let main_content = content.find('.main_content');
19611            let abstract = content.find('.abstract');
19612            let close_content = parents.find('.close_content');
19613            let infos = parents.find('.infos');
19614            cardHeader.toggleClass('d-none');
19615            let padding = cardHeader.hasClass('d-none') ? "35px" : "0px"
19616            abstract.css({'padding-top': padding, 'padding-top': padding})
19617            abstract.toggleClass('d-none');
19618            main_content.toggleClass('d-none');
19619            close_content.toggleClass('d-none')
19620            infos.toggleClass('d-none');
19621        });
19622
19623})(jQuery);
19624
19625/*global FaqSearch*/
19626
19627document.addEventListener("DOMContentLoaded", function (event) {
19628    new FaqSearch("fr");
19629});
19630
19631/*global lunr*/
19632
19633var FaqSearch = function (lang, options) {
19634    if (document.getElementById("faq-search-form")) {
19635        this.init(lang, options);
19636    }
19637};
19638
19639FaqSearch.prototype = {
19640
19641    init: function (lang, options) {
19642        var self = this;
19643        this.lang = lang;
19644        if (options === undefined) {
19645            options = {"titleBoost": 3, "threshold": undefined};
19646        }
19647        this.titleBoost = options.titleBoost;
19648        if (this.lang == "fr") {
19649            this.idx = lunr(function () {
19650                this.use(lunr.fr);
19651                this.field('title', {boost: this.titleBoost});
19652                this.field('body');
19653            });
19654        } else if (this.lang == "en") {
19655            this.idx = lunr(function () {
19656                this.field('title', {boost: this.titleBoost});
19657                this.field('body');
19658            });
19659        } else {
19660            return null;
19661        }
19662        this.threshold = options.threshold;
19663        this.groups = [];
19664        this.index();
19665
19666        // Form
19667        this.value = "";
19668        document.getElementById("faq-search-form").addEventListener("submit", function (event) {
19669            event.preventDefault();
19670        });
19671        this.input = document.getElementById("faq-search-input");
19672        this.input.addEventListener("keyup", function (event) {
19673            window.clearTimeout(self.timer);
19674            var val = event.target.value;
19675            if (val.length == 0) {
19676                self.reset();
19677            } else if (val.length > 3) {
19678                self.value = val;
19679                self.timer = window.setTimeout(self.search.bind(self), 350);
19680            }
19681        });
19682        return null;
19683    },
19684
19685    index: function () {
19686        var groupsConteneur = document.getElementsByClassName("groupeQuestionsLunr");
19687        for (var c = 0; c < groupsConteneur.length; c++) {
19688            var groupObj = groupsConteneur[c].getElementsByClassName("inner")[0];
19689            var group = {
19690                id: groupObj.getAttribute("id"),
19691                questions: {},
19692                results: {},
19693                obj: groupObj
19694            };
19695            var questions = groupsConteneur[c].getElementsByClassName("QuestionsLunr")[0].getElementsByClassName("inner");
19696            for (var q = 0; q < questions.length; q++) {
19697                var questionObj = questions[q];
19698                var question = {
19699                    id: questionObj.getAttribute("id"),
19700                    title: questionObj.getElementsByTagName("h2")[0].textContent.replace(/"/g, ""),
19701                    body: questionObj.getElementsByClassName("ce-textpic")[0].textContent.replace(/"/g, "")
19702                };
19703                this.idx.add(question);
19704                question.obj = questionObj;
19705                group.questions[question.id] = question;
19706            }
19707            this.groups.push(group);
19708        }
19709    },
19710
19711    search: function () {
19712        this.reset();
19713        if (this.value === "") {
19714            return null;
19715        }
19716        // console.log("search", this.value);
19717        var results = this.idx.search(this.value);
19718        for (var i = 0; i < results.length; i++) {
19719            var result = results[i];
19720            if (this.threshold === undefined || result.score > this.threshold) {
19721                for (var g = 0; g < this.groups.length; g++) {
19722                    var group = this.groups[g];
19723                    if (group.questions[result.ref] !== undefined) {
19724                        group.results[result.ref] = result;
19725                        break;
19726                    }
19727                }
19728            }
19729        }
19730        this.hide();
19731        this.value = "";
19732        return null;
19733    },
19734
19735    hide: function () {
19736        for (var g = 0; g < this.groups.length; g++) {
19737            var group = this.groups[g];
19738            if (Object.keys(group.results).length === 0) {
19739                group.obj.style.display = "none";
19740            }
19741            for (var question in group.questions) {
19742                if (group.results[question] === undefined) {
19743                    group.questions[question].obj.style.display = "none";
19744                }
19745            }
19746        }
19747    },
19748
19749    reset: function () {
19750        for (var g = 0; g < this.groups.length; g++) {
19751            var group = this.groups[g];
19752            group.obj.style.display = "block";
19753            group.results = {};
19754            for (var question in group.questions) {
19755                group.questions[question].obj.style.display = "block";
19756            }
19757        }
19758    }
19759
19760};
19761
19762/* global TimelineSearch...*/
19763
19764document.addEventListener("DOMContentLoaded", function (event) {
19765    $('.timeline').each(function() {
19766        new TimelineSearch(this._timelineBig, jQuery('html').attr('lang'));
19767    });
19768});
19769
19770/*global lunr*/
19771
19772var TimelineSearch = function (timelineBig, lang, options) {
19773    if (document.getElementById("timeline-search-form")) {
19774        this.init(timelineBig, lang, options);
19775    }
19776};
19777
19778TimelineSearch.prototype = {
19779    init: function (timelineBig, lang, options) {
19780        var self = this;
19781        this.timelineBig = timelineBig;
19782        this.lang = lang;
19783        if (options === undefined) {
19784            options = {"titleBoost": 3, "threshold": undefined};
19785        }
19786        this.titleBoost = options.titleBoost;
19787        if (this.lang === "fr") {
19788            this.idx = lunr(function () {
19789                this.use(lunr.fr);
19790                this.field('title', {boost: self.titleBoost});
19791                this.field('body');
19792            });
19793        } else if (this.lang === "en") {
19794            this.idx = lunr(function () {
19795                this.field('title', {boost: self.titleBoost});
19796                this.field('body');
19797            });
19798        } else {
19799            return null;
19800        }
19801        this.threshold = options.threshold;
19802        this.items = [];
19803        this.index();
19804        this.results = [];
19805
19806        // Form
19807        this.value = "";
19808        document.getElementById("timeline-search-input").addEventListener("submit", function (event) {
19809            event.preventDefault();
19810        });
19811        this.input = document.getElementById("timeline-search-input");
19812        this.input.addEventListener("keyup", function (event) {
19813            window.clearTimeout(self.timer);
19814            let val = event.target.value;
19815            if (val.length === 0) {
19816                self.reset();
19817            } else if (val.length > 3) {
19818                self.value = val;
19819                self.timer = window.setTimeout(self.search.bind(self), 350);
19820            }
19821        });
19822        return null;
19823    },
19824
19825    index: function () {
19826        let itemsConteneur = document.getElementsByClassName('timeline__mobile');
19827        let items = itemsConteneur[0].getElementsByClassName('timeline-item');
19828
19829        for (let i = 0; i < items.length; i++) {
19830            let itemObj = items[i];
19831            let item = {
19832                id: itemObj.getAttribute('data-uid'),
19833                title: itemObj.getElementsByClassName('timeline-item__content-title')[0].textContent.replace(/"/g, ""),
19834                body: ''
19835            };
19836
19837            if (itemObj.getElementsByClassName('timeline-item__content-desc').length) {
19838                item.body = itemObj.getElementsByClassName('timeline-item__content-desc')[0].textContent.replace(/"/g, "");
19839            }
19840
19841            this.idx.add(item);
19842            item.obj = itemObj;
19843            this.items[item.id] = item;
19844        }
19845    },
19846
19847    search: function () {
19848        this.reset();
19849        if (this.value === "") {
19850            return null;
19851        }
19852
19853        let results = this.idx.search(this.value);
19854        for (let i = 0; i < results.length; i++) {
19855            let result = results[i];
19856            if (this.threshold === undefined || result.score > this.threshold) {
19857                for (let j = 0; j < this.items.length; j++) {
19858                    if (this.items[result.ref] !== undefined) {
19859                        this.results[result.ref] = result;
19860                        break;
19861                    }
19862                }
19863            }
19864        }
19865        this.hide();
19866        this.value = "";
19867        return null;
19868    },
19869
19870    hide: function () {
19871        let firstId = null;
19872        for (let item in this.items) {
19873            if (this.results[item] !== undefined && firstId === null) {
19874                firstId = this.items[item].id;
19875            }
19876
19877            if (this.results[item] === undefined) {
19878                this.items[item].obj.classList.add('textfilter');
19879                this.items[item].obj.classList.add('hide');
19880            }
19881        }
19882        this.timelineBig.setData();
19883        this.timelineBig.vars.timeline.focus(firstId);
19884    },
19885
19886    reset: function () {
19887        this.results = {};
19888        for (let item in this.items) {
19889            this.items[item].obj.classList.remove('textfilter');
19890
19891            if (!this.items[item].obj.classList.contains('checkboxfilter')) {
19892                this.items[item].obj.classList.remove('hide');
19893            }
19894        }
19895        this.timelineBig.setData();
19896    }
19897};
19898
19899(function ($) {
19900    'use strict';
19901
19902    $('#header_jumbotron').on('click', function(event) {
19903        if (!$(this).attr('href').length) {
19904            event.preventDefault();
19905            if (window.innerHeight < 900 && window.innerWidth > 1090 && window.innerWidth < 1330) {
19906                $('html, body').animate({
19907                    scrollTop: $('.main-header__nav').offset().top
19908                }, 400);
19909            } else if (window.innerWidth > 1330) {
19910                $('html, body').animate({
19911                    scrollTop: $('.main-header__nav').offset().top - $('.main-header').height()
19912                }, 400);
19913            } else {
19914                $('html, body').animate({
19915                    scrollTop: $('#c6272').offset().top - $('.main-header').height()
19916                }, 400);
19917            }
19918        }
19919    });
19920
19921    let $body = $('body');
19922    let menu = {
19923        vars: {
19924            $mainHeader: null,
19925            $primaryMenu: null,
19926            $primaryMenuLinks: null,
19927            $submenuLinks: null,
19928            $closeLinks: null,
19929            $menuWrapper: null,
19930            $searchbox: null,
19931            submenuOpenClass: 'is-open-submenu',
19932            primaryActiveClass: 'is-active-menu',
19933            submenuActiveClass: 'is-active-submenu',
19934            searchboxActiveClass: 'is-active-searchbox'
19935        },
19936        init: function () {
19937            this.vars.$mainHeader = $('.main-header');
19938            this.vars.$primaryMenu = $('.main-header__nav .primary-menu');
19939            this.vars.$primaryMenuLinks = $('.main-header__nav .primary-menu__link[data-submenu]');
19940            this.vars.$submenuLinks = this.vars.$primaryMenu.find('a[data-submenu], button[data-submenu]');
19941            this.vars.$closeLinks = this.vars.$primaryMenu.find('.close-submenu[data-close-submenu], .submenu__breadcrumbs__prev[data-close-submenu]');
19942            this.vars.$mainmenuLinks = this.vars.$primaryMenu.find('[data-mainmenu]');
19943            this.vars.$menuWrapper = this.vars.$primaryMenu.closest('.main-header__nav');
19944            this.vars.$mobileWrapper = this.vars.$mainHeader.find('.main-header__navbar-mobile');
19945
19946            this.vars.$searchbox = $('.main-header__searchbox .searchbox');
19947
19948            this.multilevel();
19949            this.sitesSelect();
19950            this.hamburger();
19951            this.searchbox();
19952        },
19953        sitesSelect: function () {
19954            let $siteSelect = $('.sites-select__select');
19955
19956            $siteSelect.on('change', function () {
19957                window.location.href = this.value;
19958            })
19959        },
19960        hamburger: function () {
19961            let self = this;
19962
19963            this.vars.$mainHeader.find('.hamburger').on('click', function (e) {
19964                e.preventDefault();
19965                e.stopPropagation();
19966
19967                $body.toggleClass('is-menu');
19968                if ($body.hasClass('is-menu')) {
19969                    if (window.matchMedia('(min-width: 1090px)').matches) {
19970                        $('html').click(function (e) {
19971                            if ($(e.target).closest('.main-header').length === 0) {
19972                                $('body').removeClass('is-menu');
19973                                $(this).unbind(e);
19974                                self.multilevelClose();
19975                            }
19976                        })
19977                    }
19978                } else {
19979                    $('html').unbind();
19980                    self.multilevelClose();
19981                }
19982            });
19983        },
19984        multilevel: function () {
19985            let self = this;
19986
19987            self.vars.$primaryMenuLinks.on('click', function (e) {
19988                e.preventDefault();
19989
19990                let $body = $('body'),
19991                    $this = $(this),
19992                    $parent = $this.closest('li.primary-menu__item'),
19993                    targetSubmenu = $this.data('submenu');
19994
19995                if ($parent.hasClass(self.vars.primaryActiveClass)) {
19996                    //if clicked menu is active - close it
19997                    self.multilevelClose();
19998                } else {
19999                    if (!$body.hasClass('is-menu')) {
20000                        $body.addClass('is-menu');
20001                    }
20002
20003                    self.vars.$primaryMenu.find('.' + self.vars.primaryActiveClass).removeClass(self.vars.primaryActiveClass);
20004                    self.vars.$primaryMenu.find('.' + self.vars.submenuActiveClass).removeClass(self.vars.submenuActiveClass);
20005
20006                    $parent.addClass(self.vars.primaryActiveClass);
20007                    $parent.find('.submenu__menu[data-submenu="' + targetSubmenu + '"]').addClass(self.vars.submenuActiveClass);
20008                }
20009
20010                if (window.matchMedia('(min-width: 1090px)').matches) {
20011                    $('html, body').animate({
20012                        scrollTop: $('.main-header__nav'
20012).offset().top - $('.main-header').height()
20013                    }, 250);
20014                }
20015            });
20016
20017            self.vars.$submenuLinks.on('click', function () {
20018                let $this = $(this),
20019                    $parent = $this.closest('li.primary-menu__item'),
20020                    targetSubmenu = $this.data('submenu');
20021
20022                $parent.find('.' + self.vars.submenuActiveClass).removeClass(self.vars.submenuActiveClass);
20023                $parent.find('.submenu__menu[data-submenu="' + targetSubmenu + '"]').addClass(self.vars.submenuActiveClass);
20024
20025                if (!self.vars.$menuWrapper.hasClass(self.vars.submenuOpenClass)) {
20026                    self.vars.$menuWrapper.addClass(self.vars.submenuOpenClass);
20027                }
20028
20029                if (window.matchMedia('(min-width: 1090px)').matches) {
20030                    $('html, body').animate({
20031                        scrollTop: $('.main-header__nav').offset().top - $('.main-header').height()
20032                    }, 250);
20033                }
20034            });
20035
20036            self.vars.$closeLinks.on('click', function () {
20037                self.multilevelClose();
20038            });
20039
20040            self.vars.$mainmenuLinks.on('click', function () {
20041                self.vars.$menuWrapper.removeClass(self.vars.submenuOpenClass);
20042                self.vars.$primaryMenu.find('.' + self.vars.primaryActiveClass).removeClass(self.vars.primaryActiveClass);
20043                self.vars.$primaryMenu.find('.' + self.vars.submenuActiveClass).removeClass(self.vars.submenuActiveClass);
20044            });
20045        },
20046        multilevelClose: function () {
20047            this.vars.$menuWrapper.removeClass(this.vars.submenuOpenClass);
20048            this.vars.$primaryMenu.find('.' + this.vars.primaryActiveClass).removeClass(this.vars.primaryActiveClass);
20049            this.vars.$primaryMenu.find('.' + this.vars.submenuActiveClass).removeClass(this.vars.submenuActiveClass);
20050
20051            if (this.vars.$mobileWrapper.filter(':hidden').length > 0) {
20052                $body.removeClass('is-menu');
20053            }
20054        },
20055        searchboxClose: function () {
20056            this.vars.$mainHeader.removeClass(this.vars.searchboxActiveClass);
20057            $body.removeClass('is-searchbox');
20058        },
20059        searchbox: function () {
20060            let self = this;
20061
20062            self.vars.$mainHeader.find('.open-searchbox').on('click', function () {
20063                self.multilevelClose();
20064                self.vars.$mainHeader.toggleClass(self.vars.searchboxActiveClass);
20065                self.vars.$mainHeader.find('.tx-solr-q').focus();
20066
20067                if (self.vars.$mainHeader.hasClass(self.vars.searchboxActiveClass)) {
20068                    $body.addClass('is-searchbox');
20069                } else {
20070                    self.searchboxClose();
20071                }
20072            });
20073
20074            self.vars.$primaryMenu.find('.open-searchbox').on('click', function () {
20075                self.multilevelClose();
20076                self.vars.$mainHeader.toggleClass(self.vars.searchboxActiveClass);
20077                self.vars.$mainHeader.find('.tx-solr-q').focus();
20078
20079                if (self.vars.$mainHeader.hasClass(self.vars.searchboxActiveClass)) {
20080                    $body.addClass('is-searchbox');
20081                } else {
20082                    self.searchboxClose();
20083                }
20084            });
20085
20086            self.vars.$mainHeader.find('.close-searchbox').on('click', function () {
20087                self.searchboxClose();
20088            });
20089        }
20090    };
20091
20092    $('.open-inner-menu').click(function () {
20093        let $wrapper = $(this).closest('.inner-menu'),
20094            $content = $wrapper.find('.inner-menu__more');
20095
20096        if ($wrapper.hasClass('is-active')) {
20097            $content.css({"max-height": ""});
20098            $wrapper.removeClass('is-active');
20099        } else {
20100            $wrapper.addClass('is-active');
20101            $content.css({"max-height": $content[0].scrollHeight});
20102        }
20103    });
20104
20105    let $areaParent = $('.homepage-area');
20106    if ($areaParent.length) {
20107        $('.homepage-area__nav button[data-target]').on('click', function () {
20108            let $this = $(this),
20109                target = $this.data('target');
20110
20111            $areaParent.find('.is-active').removeClass('is-active');
20112            $areaParent.find('#' + target).addClass('is-active');
20113            $this.parent().addClass('is-active');
20114        });
20115    }
20116
20117    menu.init();
20118})(jQuery);
20119
20120jQuery(document).ready(function () {
20121
20122    let manageDateRangeErrors = function($filter) {
20123        let $container = $filter.closest('.newsSearchDateRangeContainer');
20124        let $all = $container
20125            .add($container.find('input'))
20126            .add($container.closest('form-group'))
20127            .add($container.find('form-control'));
20128        var fM = $container.find('.input-from.input-month').val();
20129        var fY = $container.find('.input-from.input-year').val();
20130        var tM = $container.find('.input-to.input-month').val();
20131        var tY = $container.find('.input-to.input-year').val();
20132        if ((fM && fY && tM && tY) && (
20133            (fY === tY) && (fM > tM)
20134            || (fY > tY))
20135        ) {
20136            $all.addClass('is-invalid');
20137        } else {
20138            $all.removeClass('is-invalid');
20139        }
20140    };
20141
20142    $('.newssearch-date-filter').each(function () {
20143        let dateFilter = this, $dateFilter = $(this);
20144        let options = {
20145            format: 'MM-YYYY',
20146            autoHide: true
20147        };
20148        if ($('html')[0].lang === 'fr') {
20149            options.language = 'fr-FR';
20150        }
20151        $dateFilter.cfDatepicker(options);
20152        let $inputMonth = $dateFilter.parent().find('.input-month'),
20153            $inputYear = $dateFilter.parent().find('.input-year');
20154        dateFilter.addEventListener('change', function(event) {
20155            var value = this.value;
20156            value = value.split('-');
20157            $inputMonth.val(value[0]);
20158            $inputYear.val(value[1]);
20159            manageDateRangeErrors($dateFilter);
20160
20161        });
20162        $(this).on('pick.datepicker', function (event) {
20163            var month = (event.date.getUTCMonth() > 8) ? event.date.getUTCMonth() + 1 : "0" + eval(event.date.getUTCMonth() + 1);
20164            $inputMonth.val(month);
20165            $inputYear.val(event.date.getUTCFullYear());
20166            manageDateRangeErrors($dateFilter);
20167        });
20168    });
20169
20170    $('.input-date-range-reset a').on('click', function(ev) {
20171        ev.preventDefault();
20172        $(this).closest('.input-date-range-reset').parent().find('.newssearch-date-filter').each(function() {
20173            $(this).data('datepicker').reset();
20174        });
20175        $(this).closest('.input-date-range-reset').parent().find('.input-month,.input-year').val('');
20176        $(this).closest('.input-date-range-reset').parent().find('.newsSearchDateRangeContainer').removeClass('is-invalid');
20177    })
20178});
20179jQuery(document).ready(function () {
20180    let req = false;
20181
20182    let makeFilters = function() {
20183        let filters = [
20184                'type:tx_news_domain_model_news'
20185            ],
20186            $period = jQuery('.news-period'),
20187            $categories = jQuery('.news-category:checked');
20188        if (!$period.hasClass('is-invalid')) {
20189            let fM = $period.find('.input-from.input-month').val();
20190            let fY = $period.find('.input-from.input-year').val();
20191            let tM = $period.find('.input-to.input-month').val();
20192            let tY = $period.find('.input-to.input-year').val();
20193            if ((fM && fY) || (tM && tY)) {
20194                let range = ['*', '*'];
20195                if (fM && fY) {
20196                    range[0] = new Date(parseInt(tY), parseInt(tM)).toISOString();
20197                }
20198                if (tM && tY) {
20199                    range[1] = new Date(parseInt(tY), parseInt(tM) + 1, 1, 0, 0, 0, -1).toISOString();
20200                }
20201                filters.push('publication_dateS:[' + range.join(' TO ') + ']');
20202            }
20203        }
20204        if ($categories.length > 0) {
20205            let categories = [];
20206            for (let index = 0; index < $categories.length; index++) {
20207                categories.push('category_stringM:"' + jQuery($categories[index]).data('title') + '"');
20208            }
20209            filters.push(categories.join(' OR '));
20210        }
20211        return filters;
20212    };
20213
20214    let search = function() {
20215        if (req) {
20216            req.abort();
20217            req = null;
20218            if (typeof(this.setChoices) !== 'undefined') {
20219                this.setChoices([]);
20220            }
20221        }
20222        if (this.value.length < 3) {
20223            if (typeof(this.setChoices) !== 'undefined') {
20224                this.setChoices([]);
20225            }
20226            return;
20227        }
20228        let input = this;
20229        let $form = jQuery('.main-header__searchbox .search-form');
20230        if ($form.length > 0) {
20231            let filters = makeFilters();
20232            filters = (filters.length > 0) ? JSON.stringify(filters) : '';
20233            req = jQuery.ajax({
20234                url: $form.data('url'),
20235                dataType: 'json',
20236                data: {
20237                    filters: filters,
20238                    termLowercase: this.value.toLowerCase(),
20239                    termOriginal: this.value,
20240                    L: $form.find('input[name="L"]').val()
20241                },
20242                success: function (data) {
20243                    req = false;
20244                    if (typeof (input.setChoices) === 'undefined') {
20245                        autocomplete(input, data);
20246                    } else {
20247                        input.setChoices(data);
20248                    }
20249                }
20250            });
20251        }
20252    };
20253    jQuery('.news-keyword').on('input', search)
20254        .on('keydown', function(e) {
20255            if ((e.keyCode === 40) && (jQuery(this).closest('.search-form').parent().find('.search-results:hidden').length > 0)) {
20256                search.apply(this);
20257            }
20258        });
20259});
20260
20261(function ($) {
20262    'use strict';
20263
20264    let popup = $('.popup');
20265    if (popup.length) {
20266        let cookie = Cookies.getJSON('cookie_consent_settings_set');
20267        let isCookie = false;
20268        let isTutorial = popup.hasClass('tutorial');
20269
20270        if (typeof cookie === 'undefined') {
20271            popup.addClass('on');
20272        }
20273
20274        let closePopup = function () {
20275            popup.addClass('close');
20276
20277            setTimeout(function () {
20278                popup.removeClass('on close');
20279            }, 300);
20280        };
20281
20282        let showPopup = function (t, name) {
20283            t.closest('.popup__slide').find('.popup__content').removeClass('on');
20284            t.closest('.popup__slide').find('.popup__content[data-name="' + name + '"]').addClass('on');
20285        };
20286
20287        if (isTutorial) {
20288            let popupSlider = popup.find('.popup__slider').slick({
20289                centerMode: true,
20290                centerPadding: '120px',
20291                dots: true,
20292                draggable: false,
20293                infinite: false,
20294                slidesToScroll: 1,
20295                slidesToShow: 1,
20296                swipe: false,
20297                responsive: [
20298                    {
20299                        breakpoint: 992,
20300                        settings: {
20301                            centerPadding: '0px'
20302                        }
20303                    }
20304                ]
20305            });
20306
20307            if (typeof cookie === 'undefined') {
20308                popup.find('.slick-arrow').addClass('slick-disabled');
20309                popup.find('.slick-arrow').attr('disabled', 'disabled');
20310                popup.find('.slick-dots').addClass('slick-disabled');
20311            }
20312
20313            popupSlider.on('afterChange', function (e, slick) {
20314                if ($(window).width() > 800) {
20315                    popup.find('.popup__slider .slick-list').removeClass('moveUp');
20316                }
20317
20318                if (slick.currentSlide >= 1) {
20319                    popupSlider.slick('slickSetOption', 'draggable', true, false);
20320                    popupSlider.slick('slickSetOption', 'swipe', true, false);
20321                }
20322
20323                if (slick.currentSlide >= 1) {
20324                    $('.popup__btn-close').addClass('visible');
20325                } else if (!isCookie) {
20326                    $('.popup__btn-close').removeClass('visible');
20327                }
20328            });
20329
20330            popupSlider.on('beforeChange', function (e, slick, currentSlide, nextSlide) {
20331                if ($(window).width() > 800) {
20332                    popup.find('.popup__slider .slick-list').addClass('moveUp');
20333                }
20334
20335                if (slick.currentSlide + 2 === slick.slideCount && nextSlide > currentSlide) {
20336                    popup.find('.popup__slider .slick-next').addClass('slick-hide');
20337                } else {
20338                    popup.find('.popup__slider .slick-next').removeClass('slick-hide');
20339                }
20340            });
20341        }
20342
20343        $('[data-show="disable-cookie"]').on('click', function(e) {
20344            e.preventDefault();
20345            $('#consent_performance').prop('checked', false);
20346            $('#consent_analytics').prop('checked', false);
20347            // $('[data-show="cookies-settings"]').trigger('click');
20348            Cookies.set('cookie_consent_settings_custom', 0);
20349            $('.popup-action-save').trigger('click');
20350            return false;
20351        });
20352
20353        popup.find('[class*="popup-action"]').on('click', function (e) {
20354            e.preventDefault();
20355
20356            let card = $(this).attr('data-show');
20357            let t = $(this);
20358
20359            let isCloseButton = t.hasClass('popup-action-close');
20360            let isSaveButton = t.hasClass('popup-action-save');
20361            let isSaveAllButton = t.hasClass('popup-action-save-all');
20362            let isPass = t.hasClass('popup-action-pass');
20363
20364            if (typeof card !== 'undefined') {
20365                showPopup(t, card);
20366            }
20367
20368            if (isCloseButton) {
20369                closePopup();
20370            }
20371
20372            if (isSaveButton || isSaveAllButton || isPass) {
20373                if(isPass) {
20374                    Cookies.set('cookie_consent_settings_set', 1);
20375                }
20376
20377                if (!isTutorial) {
20378                    closePopup();
20379                } else {
20380                    popup.find('.popup__slider').slick('slickNext');
20381                    popup.find('.slick-arrow').removeClass('slick-disabled');
20382                    popup.find('.slick-arrow').removeAttr('disabled');
20383                    popup.find('.slick-dots').removeClass('slick-disabled');
20384                }
20385
20386                $('.popup__btn-close').addClass('visible');
20387                isCookie = true;
20388            }
20389
20390            if (isTutorial) {
20391                if (card === 'cookies-settings') {
20392                    popup.find('.slick-arrow').addClass('slick-hide');
20393                    popup.find('.slick-arrow').attr('disabled', 'disabled');
20394                    popup.find('.slick-dots').addClass('slick-hide');
20395                } else {
20396                    popup.find('.slick-arrow').removeClass('slick-hide');
20397                    popup.find('.slick-arrow').removeAttr('disabled');
20398                    popup.find('.slick-dots').removeClass('slick-hide');
20399                }
20400            }
20401        });
20402
20403        window.addEventListener('load', function() {
20404            if (window.doNotTrack == "1" || navigator.doNotTrack == "yes" || navigator.doNotTrack == "1" || navigator.msDoNotTrack == "1") {
20405                popup.find('.blocked').show();
20406            } else {
20407                if (!window.google_tag_manager) {
20408                    popup.find('.blocked').show();
20409                } else {
20410                    popup.find('.unblocked').show();
20411                }
20412            }
20413        }, false);
20414    }
20415})(jQuery);
20416
20417(function ($) {
20418    'use strict';
20419
20420    let $heroSlider = $('.hero-slider'),
20421        $heroSliderItems = $heroSlider.children();
20422
20423    if ($heroSlider.length && $heroSliderItems.length > 1) {
20424        $heroSlider.slick({
20425            arrows: false,
20426            autoplay: true,
20427            autoplaySpeed: 5000,
20428            dots: true,
20429            fade: true,
20430            mobileFirst: true,
20431            slidesToScroll: 1,
20432            slidesToShow: 1,
20433            speed: 800
20434        });
20435    }
20436
20437    let $retroSlider = $('.retro-slider');
20438    let $retroSliderItems = $retroSlider.children();
20439
20440    if ($retroSlider.length && $retroSliderItems.length > 1) {
20441        $retroSlider.slick({
20442            arrows: true,
20443            autoplay: false,
20444            dots: false,
20445            fade: false,
20446            mobileFirst: false,
20447            slidesToScroll: 1,
20448            slidesToShow: 6,
20449            infinite: false,
20450            speed: 800,
20451            responsive: [
20452                {
20453                    breakpoint: 1200,
20454                    settings: {
20455                        slidesToShow: 5,
20456                    }
20457                },
20458                {
20459                    breakpoint: 1100,
20460                    settings: {
20461                        slidesToShow: 4,
20462                    }
20463                },
20464                {
20465                    breakpoint: 600,
20466                    settings: {
20467                        slidesToShow: 3,
20468                    }
20469                },
20470                {
20471                    breakpoint: 450,
20472                    settings: {
20473                        slidesToShow: 2,
20474                    }
20475                },
20476            ]
20477        });
20478
20479        $('.retro-slider__item:first-of-type()').addClass('retro-active');
20480        $('.retro-slider__item').on('click', function() {
20481            $('.retro-active').removeClass('retro-active');
20482            $(this).addClass('retro-active');
20483            $('.retro-item').animate({
20484                opacity: 0
20485            }, 400);
20486
20487            setTimeout(() => {
20488                $('.retro-item').css('display', 'none');
20489                $($(this).data('href')).css('display', 'flex');
20490                $($(this).data('href')).animate({
20491                    opacity: 1
20492                }, 400);
20493            }, 400);
20494        });
20495    }
20496
20497
20498    let $tileSlider = $('.news-tiles, .partners-grid, .sidebar-box__inner, .numbers__grid');
20499    if ($tileSlider.length) {
20500        let tileSlickOn = function () {
20501            $tileSlider.each(function () {
20502                let $this = $(this);
20503
20504                if ($this.closest('.minimalistic').length < 1 && !$this.hasClass('slick-initialized')) {
20505                    $this.slick({
20506                        slidesToShow: 1,
20507                        slidesToScroll: 1,
20508                        dots: true,
20509                        arrows: false,
20510                        mobileFirst: true,
20511                        responsive: [
20512                            {
20513                                breakpoint: 1090
20514                            },
20515                            {
20516                                breakpoint: 576,
20517                                settings: {
20518                                    slidesToShow: 2,
20519                                    slidesToScroll: 2
20520                                }
20521                            }
20522                        ]
20523                    });
20524                }
20525            });
20526            $tileSlider = $('.news-tiles, .partners-grid, .sidebar-box__inner, .numbers__grid');
20527        };
20528
20529        let tileSlickOff = function () {
20530            $tileSlider.each(function () {
20531                let $this = $(this);
20532
20533                if ($this.hasClass('slick-initialized')) {
20534                    $this.slick('unslick');
20535                }
20536            });
20537            $tileSlider = $('.news-tiles, .partners-grid, .sidebar-box__inner, .numbers__grid');
20538        };
20539
20540        if (window.innerWidth <= 1090) {
20541            tileSlickOn()
20542        }
20543
20544        $(window).on('resize', function (e) {
20545            if (e.target.innerWidth <= 1090) {
20546                tileSlickOn();
20547            } else {
20548                tileSlickOff();
20549            }
20550        });
20551    }
20552
20553    // Désactiver le hover sur les cartes sans teaser
20554    document.querySelectorAll('.news-tile__url').forEach(function(card) {
20555        var hoverText = card.querySelector('.news-tile__hover-content');
20556        if (!hoverText || !hoverText.innerText.trim()) {
20557            var hoverLayer = card.querySelector('.news-tile__hover');
20558            if (hoverLayer) hoverLayer.style.display = 'none';
20559        }
20560    });
20561
20562    let funded_projects_slick = $('.funded_projects_slick');
20563    if(funded_projects_slick.closest('.minimalistic').length < 1 && !funded_projects_slick.hasClass('slick-initialized')){
20564        /* funded_projects_slick.slick({
20565            slidesToShow: 1,
20566            slidesToScroll: 1,
20567            dots: true,
20568            arrows: false,
20569            mobileFirst: true,
20570        }); */
20571    }
20572
20573    let $flashSlider = $('.flash-info__slider');
20574    if ($flashSlider.length) {
20575        if ($flashSlider.find('> div').length > 1) {
20576            $flashSlider.closest('.flash-info__content').addClass('with-buttons');
20577        }
20578
20579        $flashSlider.slick({
20580            adaptiveHeight: true,
20581            arrows: true,
20582            autoplay: true,
20583            autoplaySpeed: 5000,
20584            dots: false,
20585            mobileFirst: true,
20586            slidesToShow: 1,
20587            slidesToScroll: 1
20588        })
20589            .on('setPosition', function (event, slick) {
20590                slick.$slides.css('height', slick.$slideTrack.height() + 'px');
20591            });
20592    }
20593
20594    let $resume_funded__slider = $('.resume_funded__slider');
20595    if ($resume_funded__slider.length) {
20596
20597        $resume_funded__slider.slick({
20598            adaptiveHeight: true,
20599            arrows: true,
20600            autoplay: false,
20601            autoplaySpeed: 5000,
20602            dots: false,
20603            mobileFirst: true,
20604            slidesToShow: 1,
20605            slidesToScroll: 1
20606        })
20607            .on('setPosition', function (event, slick) {
20608                //slick.$slides.css('height', slick.$slideTrack.height() + 'px');
20609            });
20610    }
20611
20612    let section_appels_ouverts = $('#section_appels_ouverts');
20613    $(document).ready(function() {
20614        $('.svg-loading').on('load', function() {
20615            let item = $(this);
20616            let titleData = $(this).attr('name');
20617            let content = item.contents();
20618            let color = item.data('color');
20619            if(this && this.getSVGDocument()) {
20620                let svg = this.getSVGDocument();
20621                var title = document.createElementNS("http://www.w3.org/2000/svg", "title");
20622                title.textContent = titleData;
20623                if(svg !== null) {
20624                    var firchild = svg.firstChild;
20625                    svg.children[0].appendChild(title);
20626                    let paths = svg.getElementsByTagName("path");
20627                    let rect = svg.getElementsByTagName("rect");
20628                    let polygons = svg.getElementsByTagName("polygon");
20629
20630                    var allitems = [];
20631                    allitems = Array.prototype.concat.apply(allitems, paths);
20632                    allitems = Array.prototype.concat.apply(allitems, rect);
20633                    allitems = Array.prototype.concat.apply(allitems, polygons);
20634
20635                    for(let i = 0; i < paths.length; i++) {
20636                        let path = allitems[i]
20637                        path.setAttribute("fill", color)
20638                    }
20639                }
20640            }
20641        });
20642        $('.svg-loading').trigger('load');
20643    });
20644    if(section_appels_ouverts.length) {
20645
20646        $('[data-toggle="tooltip"]').tooltip();
20647
20648        let screen_width = window.innerWidth;
20649        if(screen_width < 992) {
20650            initAppels();
20651            $('#slick-arrow-appels').removeClass('d-none')
20652        } else {
20653            //$('#section_appels_ouverts').slick('unslick')
20654        }
20655        function initAppels() {
20656            $('#section_appels_ouverts').slick({
20657                adaptiveHeight: true,
20658                arrows: true,
20659                autoplay: false,
20660                autoplaySpeed: 5000,
20661                dots: false,
20662                mobileFirst: true,
20663                slidesToShow: 1,
20664                slidesToScroll: 1,
20665                respondTo: 'slider',
20666                prevArrow: $('.prev-slick'),
20667                nextArrow: $('.next-slick'),
20668            });
20669            $('#section_appels_ouverts').find('.card.appel').css({'min-height': 'inherit', 'display': 'flex'})
20670            $('[data-load-more="open_calls"]').addClass('d-none')
20671        }
20672        function destroyAppels() {
20673            $('#section_appels_ouverts').slick('unslick')
20674        }
20675    }
20676
20677
20678
20679    let $twitterSlider = $('.tx-cw-twitter');
20680    if ($twitterSlider.length) {
20681        let twitterSlickOn = function() {
20682            $twitterSlider.slick({
20683                slidesToShow: 1,
20684                slidesToScroll: 1,
20685                dots: true,
20686                arrows: false,
20687                mobileFirst: true,
20688                adaptiveHeight: true,
20689                responsive: [
20690                    {
20691                        breakpoint: 1090
20692                    },
20693                    {
20694                        breakpoint: 768,
20695                        settings: {
20696                            slidesToShow: 3,
20697                            slidesToScroll: 3
20698                        }
20699                    },
20700                    {
20701                        breakpoint: 480,
20702                        settings: {
20703                            slidesToShow: 2,
20704                            slidesToScroll: 2,
20705                            adaptiveHeight: false
20706                        }
20707                    }
20708                ]
20709            });
20710            $twitterSlider = $('.tx-cw-twitter');
20711        };
20712
20713        let twitterSlickOff = function () {
20714            $twitterSlider.each(function () {
20715                let $this = $(this);
20716
20717                if ($this.hasClass('slick-initialized')) {
20718                    $this.slick('unslick');
20719                }
20720            });
20721            $twitterSlider = $('.tx-cw-twitter');
20722        };
20723
20724        if (window.innerWidth <= 1090) {
20725            twitterSlickOn()
20726        }
20727
20728        $(window).on('resize', function (e) {
20729            if (e.target.innerWidth <= 1090) {
20730                twitterSlickOn();
20731            } else {
20732                twitterSlickOff();
20733            }
20734        });
20735    }
20736
20737    $('.hero-slider__item').on('click', function() {
20738        window.location.assign($(this).find('.hero-slider__item__more a').attr('href'));
20739    });
20740
20741    $('.hero-slider__item__content').on('click', function() {
20742        window.location.assign($(this).find('.hero-slider__item__more a').attr('href'));
20743    });
20744
20745    if($('[data-search]').length > 0) {
20746        let hidden_child = $('.page-grid__content.section-search .card.appel:nth-child(1n+9)');
20747        hidden_child.attr('data-init', 'false')
20748    }
20749
20750
20751    $('[data-search]').on('keyup', function() {
20752        let count_results = filterInput('.page-grid__content.section-search', '.card.appel', $(this).val());
20753        $('#count_results').text(count_results)
20754    });
20755
20756    function filterInput(parentTarget, childTarget, value) {
20757        let results = $(parentTarget);
20758        let normalized = value.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
20759        if (normalized.includes(' ')) {
20760            let explode = normalized.split(' ')
20761            normalized = explode[0];
20762        }
20763        if(value.length > 3) {
20764            let count = results.length;
20765            $.each(results.find(childTarget), function() {
20766                let card = $(this);
20767                let init = card.attr('data-init');
20768                if(value === "" && init === "true") {
20769                    card.addClass('d-flex').removeClass('d-none')
20770                    count++;
20771                } else {
20772                    let show = filterCard(card, normalized);
20773                    if(show) {
20774                        card.addClass('d-flex').removeClass('d-none').attr('data-init', 'true')
20775                        count++;
20776                    }
20777                    else {
20778                        count--;
20779                        card.addClass('d-none').removeClass('d-flex')
20780                    }
20781                }
20782            });
20783            return results.find(childTarget+':visible').length;
20784        } else {
20785            let count = results.length;
20786            $.each(results.find(childTarget), function() {
20787                let card = $(this);
20788                let init = card.attr('data-init');
20789                if(init === "true") {
20790                    card.addClass('d-flex').removeClass('d-none')
20791                    count++;
20792                }
20793            });
20794        }
20795        return results.find(childTarget).length;
20796    }
20797
20798    function filterCard(htmlElement, value) {
20799        let result = false;
20800        if(htmlElement.children().length > 0) {
20801            $.each(htmlElement.children(), function() {
20802                let children = $(this);
20803                let text = children.text().trim().toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
20804                if ((text.includes(value))) {
20805                    result = true;
20806                    return false;
20807                } else {
20808                    result = filterCard(children, value);
20809                }
20810            });
20811        }
20812        return result;
20813    }
20814
20815    $('[data-load-more]').on('click', function () {
20816        let count = load_more(".page-grid__content.section-search", '.card.appel', 4);
20817        if(count === 0) $(this).remove();
20818    });
20819
20820    function load_more(parent, children, nbToShow) {
20821        let parentRow = $(parent);
20822        let notVisible = children+'[data-init="false"]';
20823        let childrenItem = parentRow.find(notVisible);
20824        let toShow = childrenItem.slice(0,nbToShow);
20825        $.each(toShow, function (key, element) {
20826            $(element).addClass('d-flex').css('display', 'flex').attr('data-init', 'true')
20827        });
20828        return parentRow.find(notVisible).length;
20829    }
20830
20831    $('[data-action="quickSearch"], [data-action="quickSearch"] .overlayCircle').on("click", function() {
20832        console.log('click');
20833       let value = $(this).attr('data-action-value');
20834       let facet = $(this).attr('data-action-facet');
20835       let link = $('[data-facet-name="'+ facet +'"][data-facet-value="'+ value +'"]');
20836        if(link.length > 0) {
20837            let tag = link.find('a')
20838            let href = tag.attr('href')
20839            window.location.href = href;
20840            return true;
20841        }
20842    });
20843
20844    if($('#archive-newsletter').length > 0) {
20845        let hidden_child = $('#archive-newsletter .single-newsletter:nth-child(1n+9)');
20846        hidden_child.attr('data-init', 'false')
20847        $('[data-load-more]').unbind('click').on('click', function () {
20848            let count = load_more("#archive-newsletter", '.single-newsletter', 4);
20849            if(count === 0) $(this).remove();
20850        });
20851    }
20852
20853})(jQuery);
20854
20855/*
20856    Auto font resize
20857 */
20858jQuery(document).ready(function () {
20859    var changeFontSize = function () {
20860        $('.hero-fit-text').textfill({
20861            innerTag: 'p',
20862            maxFontPixels: 30
20863        });
20864    };
20865
20866    changeFontSize();
20867    $(window).on('resize', function () {
20868        changeFontSize();
20869    });
20870});
20871
20872jQuery(document).ready(function ($) {
20873    let $timelineSmall = $('.timeline-small');
20874
20875    if ($timelineSmall.length) {
20876        let currentDateFull = new Date().toJSON().slice(0, 10);
20877        let currentDate = new Date(currentDateFull);
20878
20879        let taskInProjectPosition = function (task) {
20880            let $projects = task.closest('.timeline-small').find('.timeline-small-header .project');
20881            let positionInContent = null;
20882
20883            $projects.each(function () {
20884                let $project = $(this);
20885                if ($project.attr('data-start') && $project.attr('data-end')) {
20886                    let projectStart = new Date($project.attr('data-start'));
20887                    let projectEnd = new Date($project.attr('data-end'));
20888                    let taskDate = new Date(task.attr('data-date'));
20889
20890                    if (taskDate >= projectStart && taskDate <= projectEnd) {
20891                        let outerWidth = $project.outerWidth();
20892                        let $next = $project.next('div');
20893                        while ($next.hasClass('project-skip')) {
20894                            $next = $next.next('div');
20895                        }
20896                        let positionStart = $project.position().left + outerWidth / 2;
20897                        let positionEnd = null;
20898
20899                        if ($next.length) {
20900                            positionEnd = $next.position().left + outerWidth / 2;
20901                        }
20902
20903                        let positionInPercentage = Math.round(((taskDate - projectStart) / (projectEnd - projectStart)) * 100);
20904
20905                        positionInContent = positionEnd !== null ? Math.round((positionEnd - positionStart) * positionInPercentage / 100) + positionStart : positionStart;
20906                    }
20907                }
20908            });
20909
20910            return positionInContent;
20911        };
20912
20913        $timelineSmall.each(function () {
20914            let $timeline = $(this);
20915
20916            let $projects = $timeline.find('.timeline-small-header .project');
20917            let $tasks = $timeline.find('.timeline-small-content');
20918            let taskHeight = null;
20919            let tasksLines = [];
20920
20921            let taskTopPosition = function (taskLeftPosition, taskWidthEl) {
20922                for (let key = 0; key < tasksLines.length; key++) {
20923                    if (tasksLines[key] < taskLeftPosition) {
20924                        tasksLines[key] = taskLeftPosition + taskWidthEl + 30;
20925                        return key;
20926                    }
20927                }
20928
20929                let nextKey = tasksLines.length;
20930                tasksLines.push(taskLeftPosition + taskWidthEl + 30);
20931                return nextKey;
20932            };
20933
20934            $tasks.find('.task').each(function () {
20935                let $task = $(this);
20936
20937                if (new Date($task.attr('data-date')) > currentDate) {
20938                    $task.addClass('task-incoming');
20939                } else {
20940                    $task.addClass('task-done');
20941                }
20942
20943                $task.clone().appendTo($projects.first().find('.tasks'));
20944            });
20945
20946            let initTasks = function () {
20947                let timelineWidth = $timeline.width();
20948                tasksLines = [];
20949
20950                $tasks.find('.task').each(function () {
20951                    let $task = $(this);
20952
20953                    if ($(window).width() > 768) {
20954                        let taskWidthEl = $task.outerWidth();
20955                        let taskLeftPosition = taskInProjectPosition($task) - (taskWidthEl / 2);
20956
20957                        if (taskHeight === null) {
20958                            taskHeight = $task.outerHeight() + 20;
20959                        }
20960
20961                        if ((taskLeftPosition + taskWidthEl) > timelineWidth) {
20962                            $task.find('.task-line').css('left', (taskWidthEl / 2) + ((taskLeftPosition + taskWidthEl) - timelineWidth) + 'px');
20963                            taskLeftPosition = timelineWidth - taskWidthEl;
20964                        }
20965
20966                        if (taskLeftPosition < 0) {
20967                            $task.find('.task-line').css('left', (taskWidthEl / 2) + taskLeftPosition + 'px');
20968                            taskLeftPosition = 0;
20969                        }
20970
20971                        let numberOfLine = taskTopPosition(taskLeftPosition, taskWidthEl);
20972
20973                        $task.css('left', taskLeftPosition + 'px');
20974                        $task.css('top', numberOfLine * taskHeight + 'px');
20975                        $task.attr('data-line', numberOfLine);
20976                    }
20977                });
20978
20979                if ($(window).width() > 768) {
20980                    $tasks.find('.task').each(function () {
20981                        $(this).css('zIndex', (tasksLines.length - parseInt($(this).attr('data-line'))) + 1);
20982                    });
20983
20984                    $timeline.find('.timeline-small-content').height((Object.keys(tasksLines).length * taskHeight) + 10);
20985                }
20986            };
20987
20988            initTasks();
20989            $timeline.removeClass('load');
20990
20991            let resizeTimer;
20992            $(window).on('resize', function () {
20993                clearTimeout(resizeTimer);
20994
20995                resizeTimer = setTimeout(function () {
20996                    initTasks();
20997                }, 250);
20998
20999            });
21000        });
21001    }
21002});
21003
21004(function ($) {
21005    'use strict';
21006
21007    $('.timeline').each(function() {
21008        let $timelineBig = $(this);
21009        this._timelineBig = {
21010            vars: {
21011                data: null,
21012                el: document.getElementById('visualization'),
21013                highlight: false,
21014                timeline: null,
21015                wrapper: $(this)
21016            },
21017            customOrder: function (a, b) {
21018                let result = a.start - b.start;
21019                return result !== 0 ? result : (a.end - b.end);
21020            },
21021            prepareData: function () {
21022                let self = this;
21023                self.vars.highlight = self.vars.wrapper.hasClass('highlight-generic');
21024                let items = this.setData();
21025
21026                let configuredHeight = this.vars.el.hasAttribute('data-height') ? parseInt(this.vars.el.attributes.getNamedItem('data-height').value) : 0;
21027                let options = {
21028                    height: Math.max(isNaN(configuredHeight) ? 0 : configuredHeight, 600), //px
21029                    locale: $('html').attr('lang'),
21030                    order: this.customOrder,
21031                    showCurrentTime: true,
21032                    horizontalScroll: true,
21033                    verticalScroll: true,
21034                    selectable: false,
21035                    type: 'range',
21036					start: new Date(),
21037                    end: new Date(),
21038                    orientation: {
21039                        axis: 'top',
21040                        item: 'top'
21041                    },
21042                    zoomMin: 1000 * 60 * 60 * 24 * 31 * 12,    // one week in milliseconds
21043                    zoomMax: 1000 * 60 * 60 * 24 * 31 * 12,    // one year in milliseconds
21044                    template: function (item) { // (item, element, data)
21045                        let style = '';
21046                        if (item.typeClass === 'generic') {
21047                            let height = parseInt($('.timeline__mobile').data('generic-height'));
21048                            if (height > 0) {
21049                                style = ' style="height: ' + height + 'em;"';
21050                            }
21051                        }
21052                        return '<div class="item-type-' + item.typeClass + '" id="item' + item.id + '"' + style + '>' + item.html + '</div>';
21053                    }
21054                };
21055                let groups = [
21056                    {
21057                        id: 1,
21058                        content: ''
21059                    },
21060                    {
21061                        id: 2,
21062                        content: ''
21063                    }
21064                ];
21065
21066                self.vars.timeline = self.vars.highlight ? new vis.Timeline(self.vars.el, items, groups, options) : new vis.Timeline(self.vars.el, items, options);
21067            },
21068            setData: function () {
21069                let self = this;
21070                let data = [];
21071
21072                self.vars.wrapper.find('.timeline-item').each(function () {
21073                    let $this = $(this);
21074
21075                    let item = {
21076                        id: $this.data('uid'),
21077                        start: $this.data('start'),
21078                        end: $this.data('end'),
21079                        typeClass: $this.data('type') + ($this.hasClass('timeline-item-early') ? ' early' : ''),
21080                        className: $this.data('type') + ($this.hasClass('filter-search-hide') ? ' hide' : ''),
21081                        html: $this.find('.timeline-item__content').html(),
21082                        title: $this.find('.timeline-item__content').html(),
21083                        limitSize: false
21084                    };
21085
21086                    if (self.vars.highlight) {
21087                        item.group = $this.data('type') === 'generic' ? 1 : 2;
21088                    }
21089
21090                    if (self.vars.data !== null) {
21091                        if ($this.hasClass('hide')) {
21092                            self.vars.data.remove(item);
21093                        } else if (self.vars.data.get(item.id) === null) {
21094                            self.vars.data.add(item);
21095                        }
21096                    } else {
21097                        data.push(item);
21098                    }
21099                });
21100
21101                if (self.vars.data === null) {
21102                    self.vars.data = new vis.DataSet(data, {fieldId: 'id', type: {start: 'ISODate', end: 'ISODate'}});
21103                }
21104
21105                return self.vars.data;
21106            },
21107            init: function () {
21108                this.prepareData();
21109            }
21110        };
21111
21112        let timelineFilterChange = function (el, manual) {
21113            let $this = manual === true ? el : $(this);
21114
21115            let section = $this.closest('.section-timeline');
21116            let sectionCheckedElements = section.find('.timeline__filter input:checked').map(function () {
21117                return this.id;
21118            }).get();
21119
21120            let items = section.find('.timeline__mobile .timeline-item');
21121
21122            items.addClass('hide checkboxfilter');
21123
21124            if (sectionCheckedElements.length < 1) {
21125                items.removeClass('checkboxfilter');
21126                items.filter(':not(.textfilter)').removeClass('hide');
21127            } else {
21128                sectionCheckedElements.forEach(function (el) {
21129                    items.filter('[data-type="' + el + '"]').removeClass('checkboxfilter');
21130                    items.filter('[data-type="' + el + '"]:not(.textfilter)').removeClass('hide');
21131                });
21132            }
21133
21134            $timelineBig[0]._timelineBig.setData();
21135        };
21136
21137        setTimeout(function () {
21138            $(document).on('change', '.timeline__filter input[type="checkbox"]', timelineFilterChange);
21139        }, 100);
21140
21141        this._timelineBig.init();
21142        (function() {
21143            let generic = [], other = [];
21144            $timelineBig.find('.timeline-item').not('.timeline-item-early').each(function() {
21145                let type = $(this).data('type');
21146                if (type === 'generic') {
21147                    generic.push(this);
21148                    if (generic.length > 1) {
21149                        $(generic.shift()).removeClass('show');
21150                    }
21151                } else {
21152                    other.push(this);
21153                    if (other.length > 3) {
21154                        $(other.shift()).removeClass('show');
21155                    }
21156                }
21157            });
21158            $(generic.concat(other)).addClass('show');
21159        })();
21160
21161        $(document).on('click touch', '.timeline__date-text', function () {
21162            $(this).prev().trigger('click');
21163        });
21164    });
21165})(jQuery);
21166
21167//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImpxdWVyeS5qcyIsInBvcHBlci5taW4uanMiLCJpbmRleC5qcyIsInV0aWwuanMiLCJidXR0b24uanMiLCJjb2xsYXBzZS5qcyIsInRvb2x0aXAuanMiLCJkcm9wZG93bi5qcyIsIm1vZGFsLmpzIiwibW9tZW50LmpzIiwiZnIuanMiLCJkYXRlcGlja2VyLmpzIiwianF1ZXJ5LnRleHRmaWxsLm1pbi5qcyIsImpzLmNvb2tpZS5qcyIsImx1bnIubWluLmpzIiwic2xpY2subWluLmpzIiwidmlzLm1pbi5qcyIsImFmdGVyL2x1bnIuc3RlbW1lci5zdXBwb3J0Lm1pbi5qcyIsImRhdGVwaWNrZXIuZnItRlIuanMiLCJsdW5yLmZyLm1pbi5qcyIsIm1haW4uanMiLCJhdXRvY29tcGxldGUuanMiLCJjb250YWN0LmpzIiwibHVuci5mYXEtc2VhcmNoLXVzYWdlLmpzIiwibHVuci5mYXEtc2VhcmNoLmpzIiwibHVuci50aW1lbGluZS1zZWFyY2gtdXNhZ2UuanMiLCJsdW5yLnRpbWVsaW5lLXNlYXJjaC5qcyIsIm1lbnUuanMiLCJuZXdzLmpzIiwicG9wdXAuanMiLCJzbGlkZXJzLmpzIiwidGltZWxpbmUtc21hbGwuanMiLCJ0aW1lbGluZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB
21167Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7
21167QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD
21167QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB
21167QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM1blVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMxSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3RLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN0WEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD
21167QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzlwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdGRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3JrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB
21167QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB
21167O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMxL0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzE5
21167Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ25LQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ05BO0FBQ0E7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDOUNBO0FBQ0E7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNqQkE7QUFDQTtBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM5RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQy9LQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM1SUE
211677QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2pKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNuTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My4zLjFcbiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS9cbiAqXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcbiAqIGh0dHBzOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WlxuICovXG4oIGZ1bmN0aW9uKCBnbG9iYWwsIGZhY3RvcnkgKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0aWYgKCB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVud
21167HMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2Bcblx0XHQvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LlxuXHRcdC8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgXG5cdFx0Ly8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuXG5cdFx0Ly8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC5cblx0XHQvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpKHdpbmRvdyk7XG5cdFx0Ly8gU2VlIHRpY2tldCAjMTQ1NDkgZm9yIG1vcmUgaW5mby5cblx0XHRtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG5cdFx0XHRmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6XG5cdFx0XHRmdW5jdGlvbiggdyApIHtcblx0XHRcdFx0aWYgKCAhdy5kb2N1bWVudCApIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIFwialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoIHcgKTtcblx0XHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0ZmFjdG9yeSggZ2xvYmFsICk7XG5cdH1cblxuLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBpcyBub3QgZGVmaW5lZCB5ZXRcbn0gKSggdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFsICkge1xuXG4vLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjFcbi8vIHRocm93IGV4Y2VwdGlvbnMgd2hlbiBub24tc3RyaWN0IGNvZGUgKGUuZy4sIEFTUC5ORVQgNC41KSBhY2Nlc3NlcyBzdHJpY3QgbW9kZVxuLy8gYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIgKHRyYWMtMTMzMzUpLiBCdXQgYXMgb2YgalF1ZXJ5IDMuMCAoMjAxNiksIHN0cmljdCBtb2RlIHNob3VsZCBiZSBjb21tb25cbi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLlxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnIgPSBbXTtcblxudmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cbnZhciBzbGljZSA9IGFyci5zbGljZTtcblxudmFyIGNvbmNhdCA9IGFyci5jb25jYXQ7XG5cbnZhciBwdXNoID0gYXJyLnB1c2g7XG5cbnZhciBpbmRleE9mID0gYXJyLmluZGV4T2Y7XG5cbnZhciBjbGFzczJ0eXBlID0ge307XG5cbnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7XG5cbnZhciBoYXNPd24gPSBjbGFzczJ0eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgZm5Ub1N0cmluZyA9IGhhc093bi50b1N0cmluZztcblxudmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTtcblxudmFyIHN1cHBvcnQgPSB7fTtcblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uKCBvYmogKSB7XG5cbiAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTJcbiAgICAgIC8vIEluIHNvbWUgYnJvd3NlcnMsIHR5cGVvZiByZXR1cm5zIFwiZnVuY3Rpb25cIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50c1xuICAgICAgLy8gKGkuZS4sIGB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvYmplY3RcIiApID09PSBcImZ1bmN0aW9uXCJgKS5cbiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi5cbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gXCJudW1iZXJcIjtcbiAgfTtcblxuXG52YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkge1xuXHRcdHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7XG5cdH07XG5cblxuXG5cblx0dmFyIHByZXNlcnZlZFNjcmlwdEF0dHJpYnV0ZXMgPSB7XG5cdFx0dHlwZTogdHJ1ZSxcblx0XHRzcmM6IHRydWUsXG5cdFx0bm9Nb2R1bGU6IHRydWVcblx0fTtcblxuXHRmdW5jdGlvbiBET01FdmFsKCBjb2RlLCBkb2MsIG5vZGUgKSB7XG5cdFx0ZG9jID0gZG9jIHx8IGRvY3VtZW50O1xuXG5cdFx0dmFyIGksXG5cdFx0XHRzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggXCJzY3JpcHRcIiApO1xuXG5cdFx0c2NyaXB0LnRleHQgPSBjb2RlO1xuXHRcdGlmICggbm9kZSApIHtcblx0XHRcdGZvciAoIGkgaW4gcHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyApIHtcblx0XHRcdFx0aWYgKCBub2RlWyBpIF0gKSB7XG5cdFx0XHRcdFx0c2NyaXB0WyBpIF0gPSBub2RlWyBpIF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApO1xuXHR9XG5cblxuZnVuY3Rpb24gdG9UeXBlKCBvYmogKSB7XG5cdGlmICggb2JqID09IG51bGwgKSB7XG5cdFx0cmV0dXJuIG9iaiArIFwiXCI7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkgKGZ1bmN0aW9uaXNoIFJlZ0V4cClcblx0cmV0dXJuIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiID9cblx0XHRjbGFzczJ0eXBlWyB0b1N0cmluZy5jYWxsKCBvYmogKSBdIHx8IFwib2JqZWN0XCIgOlxuXHRcdHR5cGVvZiBvYmo7XG59XG4vKiBnbG9iYWwgU3ltYm9sICovXG4vLyBEZWZpbmluZyB0aGlzIGdsb2JhbCBpbiAuZXNsaW50cmMuanNvbiB3b3VsZCBjcmVhdGUgYSBkYW5nZXIgb2YgdXNpbmcgdGhlIGdsb2JhbFxuLy8gdW5ndWFyZGVkIGluIGFub3RoZXIgcGxhY2UsIGl0IHNlZW1zIHNhZmVyIHRvIGRlZmluZSBnbG9iYWwgb25seSBmb3IgdGhpcyBtb2R1bGVcblxuXG5cbnZhclxuXHR2ZXJzaW9uID0gXCIzLjMuMVwiLFxuXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XG5cdGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblxuXHRcdC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJ1xuXHRcdC8vIE5lZWQgaW5pdCBpZiBqUXVlcnkgaXMgY2FsbGVkIChqdXN0IGFsbG93IGVycm9yIHRvIGJlIHRocm93biBpZiBub3QgaW5jbHVkZWQpXG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2
21167VsZWN0b3IsIGNvbnRleHQgKTtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQXG5cdHJ0cmltID0gL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nO1xuXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xuXG5cdC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWRcblx0anF1ZXJ5OiB2ZXJzaW9uLFxuXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXG5cblx0Ly8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwXG5cdGxlbmd0aDogMCxcblxuXHR0b0FycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1Jcblx0Ly8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXlcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xuXG5cdFx0Ly8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheVxuXHRcdGlmICggbnVtID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiBqdXN0IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXRcblx0XHRyZXR1cm4gbnVtIDwgMCA/IHRoaXNbIG51bSArIHRoaXMubGVuZ3RoIF0gOiB0aGlzWyBudW0gXTtcblx0fSxcblxuXHQvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrXG5cdC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KVxuXHRwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuXHRcdC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5cdFx0dmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApO1xuXG5cdFx0Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSlcblx0XHRyZXQucHJldk9iamVjdCA9IHRoaXM7XG5cblx0XHQvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldFxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC5cblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2sgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzWyBqIF0gXSA6IFtdICk7XG5cdH0sXG5cblx0ZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0b3IoKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBhcnIuc29ydCxcblx0c3BsaWNlOiBhcnIuc3BsaWNlXG59O1xuXG5qUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyAwIF0gfHwge30sXG5cdFx0aSA9IDEsXG5cdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cblx0XHQvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307XG5cdFx0aSsrO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHQvLyBFeHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWRcblx0aWYgKCBpID09PSBsZW5ndGggKSB7XG5cdFx0dGFyZ2V0ID0gdGhpcztcblx0XHRpLS07XG5cdH1cblxuXHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblxuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcblx0XHRpZiAoICggb3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdICkgIT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdFx0XHRzcmMgPSB0YXJnZXRbIG5hbWUgXTtcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICggdGFyZ2V0ID09PSBjb3B5ICkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzXG5cdFx0XHRcdGlmICggZGVlcCAmJi
21167Bjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvcHkgKSB8fFxuXHRcdFx0XHRcdCggY29weUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KCBjb3B5ICkgKSApICkge1xuXG5cdFx0XHRcdFx0aWYgKCBjb3B5SXNBcnJheSApIHtcblx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBBcnJheS5pc0FycmF5KCBzcmMgKSA/IHNyYyA6IFtdO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBzcmMgKSA/IHNyYyA6IHt9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIHByb3RvLCBDdG9yO1xuXG5cdFx0Ly8gRGV0ZWN0IG9idmlvdXMgbmVnYXRpdmVzXG5cdFx0Ly8gVXNlIHRvU3RyaW5nIGluc3RlYWQgb2YgalF1ZXJ5LnR5cGUgdG8gY2F0Y2ggaG9zdCBvYmplY3RzXG5cdFx0aWYgKCAhb2JqIHx8IHRvU3RyaW5nLmNhbGwoIG9iaiApICE9PSBcIltvYmplY3QgT2JqZWN0XVwiICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHByb3RvID0gZ2V0UHJvdG8oIG9iaiApO1xuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIG5vI
21167HByb3RvdHlwZSAoZS5nLiwgYE9iamVjdC5jcmVhdGUoIG51bGwgKWApIGFyZSBwbGFpblxuXHRcdGlmICggIXByb3RvICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb25cblx0XHRDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCBcImNvbnN0cnVjdG9yXCIgKSAmJiBwcm90by5jb25zdHJ1Y3Rvcjtcblx0XHRyZXR1cm4gdHlwZW9mIEN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBmblRvU3RyaW5nLmNhbGwoIEN0b3IgKSA9PT0gT2JqZWN0RnVuY3Rpb25TdHJpbmc7XG5cdH0sXG5cblx0aXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblxuXHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5cdFx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy82MTI1XG5cdFx0dmFyIG5hbWU7XG5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0Ly8gRXZhbHVhdGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHRcblx0Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGNvZGUgKSB7XG5cdFx0RE9NRXZhbCggY29kZSApO1xuXHR9LFxuXG5cdGVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkge1xuXHRcdHZhciBsZW5ndGgsIGkgPSAwO1xuXG5cdFx0aWYgKCBpc0FycmF
211675TGlrZSggb2JqICkgKSB7XG5cdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gb2JqICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvYmo7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5XG5cdHRyaW06IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFx0XCJcIiA6XG5cdFx0XHQoIHRleHQgKyBcIlwiICkucmVwbGFjZSggcnRyaW0sIFwiXCIgKTtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LFxuXHRcdFx0XHRcdHR5cGVvZiBhcnIgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFsgYXJyIF0gOiBhcnJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guY2FsbCggcmV0LCBhcnIgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdGluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnIsIGkgKSB7XG5cdFx0cmV0dXJuIGFyciA9PSBudWxsID8gLTEgOiBpbmRleE9mLmNhbGwoIGFyciwgZWxlbSwgaSApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdG1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHtcblx0XHR2YXIgbGVuID0gK3NlY29uZC5sZW5ndGgsXG5cdFx0XHRqID0gMCxcblx0XHRcdGkgPSBmaXJzdC5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdGZpcnN0WyBpKysgXSA9IHNlY29uZFsgaiBdO1xuXHRcdH1cblxuXHRcdGZpcnN0Lmxlbmd0aCA9IGk7XG5cblx0XHRyZXR1cm4gZmlyc3Q7XG5cdH0sXG5cblx0Z3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkge1xuXHRcdHZhciBjYWxsYmFja0ludmVyc2UsXG5cdFx0XHRtYXRjaGVzID0gW10sXG5cdFx0XHRpID0gMCxcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aCxcblx0XHRcdGNhbGxiYWNrRXhwZWN0ID0gIWludmVydDtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXNcblx0XHQvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvblxuXHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0Y2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7XG5cdFx0XHRpZiAoIGNhbGxiYWNrSW52ZXJzZSAhPT0gY2FsbGJhY2tFeHBlY3QgKSB7XG5cdFx0XHRcdG1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaGVzO1xuXHR9LFxuXG5cdC8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHtcblx0XHR2YXIgbGVuZ3RoLCB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0cmV0ID0gW107XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlc1xuXHRcdGlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7XG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBHbyB0aHJvdWdoIGV2ZXJ5IGtleSBvbiB0aGUgb2JqZWN0LFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIGVsZW1zICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdFx0cmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApO1xuXHR9LFxuXG5cdC8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0c1xuXHRndWlkOiAxLFxuXG5cdC8vIGpRdWVyeS5zdXBwb3J0IGlzIG5vdCB1c2VkIGluIENvcmUgYnV0IG90aGVyIHByb2plY3RzIGF0dGFjaCB0aGVpclxuXHQvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LlxuXHRzdXBwb3J0OiBzdXBwb3J0XG59ICk7XG5cbmlmICggdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTtcbn1cblxuLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwXG5qUXVlcnkuZWFjaCggXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbFwiLnNwbGl0KCBcIiBcIiApLFxuZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xufSApO1xuXG5mdW5jdGlvbiBpc0FycmF
211675TGlrZSggb2JqICkge1xuXG5cdC8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcilcblx0Ly8gYGluYCBjaGVjayB1c2VkIHRvIHByZXZlbnQgSklUIGVycm9yIChnaC0yMTQ1KVxuXHQvLyBoYXNPd24gaXNuJ3QgdXNlZCBoZXJlIGR1ZSB0byBmYWxzZSBuZWdhdGl2ZXNcblx0Ly8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRVxuXHR2YXIgbGVuZ3RoID0gISFvYmogJiYgXCJsZW5ndGhcIiBpbiBvYmogJiYgb2JqLmxlbmd0aCxcblx0XHR0eXBlID0gdG9UeXBlKCBvYmogKTtcblxuXHRpZiAoIGlzRnVuY3Rpb24oIG9iaiApIHx8IGlzV2luZG93KCBvYmogKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fFxuXHRcdHR5cGVvZiBsZW5ndGggPT09IFwibnVtYmVyXCIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7XG59XG52YXIgU2l6emxlID1cbi8qIVxuICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMy4zXG4gKiBodHRwczovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxNi0wOC0wOFxuICovXG4oZnVuY3Rpb24oIHdpbmRvdyApIHtcblxudmFyIGksXG5cdHN1cHBvcnQsXG5cdEV4cHIsXG5cdGdldFRleHQsXG5cdGlzWE1MLFxuXHR0b2tlbml6ZSxcblx0Y29tcGlsZSxcblx0c2VsZWN0LFxuXHRvdXRlcm1vc3RDb250ZXh0LFxuXHRzb3J0SW5wdXQsXG5cdGhhc0R1cGxpY2F0ZSxcblxuXHQvLyBMb2NhbCBkb2N1bWVudCB2YXJzXG5cdHNldERvY3VtZW50LFxuXHRkb2N1bWVudCxcblx0ZG9jRWxlbSxcblx0ZG9jdW1lbnRJc0hUTUwsXG5cdHJidWdneVFTQSxcblx0cmJ1Z2d5TWF0Y2hlcyxcblx0bWF0Y2hlcyxcblx0Y29udGFpbnMsXG5cblx0Ly8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YVxuXHRleHBhbmRvID0gXCJzaXp6bGVcIiArIDEgKiBuZXcgRGF0ZSgpLFxuXHRwcmVmZXJyZWREb2MgPSB3aW5kb3cuZG9jdW1lbnQsXG5cdGRpcnJ1bnMgPSAwLFxuXHRkb25lID0gMCxcblx0Y2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRjb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0c29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIDA7XG5cdH0sXG5cblx0Ly8gSW5zdGFuY2UgbWV0aG9kc1xuXHRoYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaF9uYXRpdmUgPSBhcnIucHVzaCxcblx0cHVzaCA9IGFyci5wdXNoLFxuXHRzbGljZSA9IGFyci5zbGljZSxcblx0Ly8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlXG5cdC8vIGh0dHBzOi8vanNwZXJmLmNvbS90aG9yLWluZGV4b2YtdnMtZm9yLzVcblx0aW5kZXhPZiA9IGZ1bmN0aW9uKCBsaXN0LCBlbGVtICkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdGxlbiA9IGxpc3QubGVuZ3RoO1xuXHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0aWYgKCBsaXN0W2ldID09PSBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllclxuXHRpZGVudGlmaWVyID0gXCIoPzpcXFxcXFxcXC58W1xcXFx3LV18W15cXDAtXFxcXHhhMF0pK1wiLFxuXG5cdC8vIEF0dHJpYnV0ZSBzZWxlY3RvcnM6IGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9yc1xuXHRhdHRyaWJ1dGVzID0gXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF1cIlxuXHRcdFwiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIgKyBpZGVudGlmaWVyICsgXCIpKXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcXFxcXVwiLFxuXG5cdHBzZXVkb3MgPSBcIjooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XFxcXCgoXCIgK1xuXHRcdC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6XG5cdFx0Ly8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpXG5cdFx0XCIoJygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwiKXxcIiArXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXHRcdC8vIDMuIGFueXRoaW5nIGVsc2UgKGNhcHR1cmUgMilcblx0XHRcIi4qXCIgK1xuXHRcdFwiKVxcXFwpfClcIixcblxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXG5cdHJ3aGl0ZXNwYWNlID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwiK1wiLCBcImdcIiApLFxuXHRydHJpbSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIiArIH
21167doaXRlc3BhY2UgKyBcIiskXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXG5cdHJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCBcIj1cIiArIHdoaXRlc3BhY2UgKyBcIiooW15cXFxcXSdcXFwiXSo/KVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsIFwiZ1wiICksXG5cblx0cnBzZXVkbyA9IG5ldyBSZWdFeHAoIHBzZXVkb3MgKSxcblx0cmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCBcIl5cIiArIGlkZW50aWZpZXIgKyBcIiRcIiApLFxuXG5cdG1hdGNoRXhwciA9IHtcblx0XHRcIklEXCI6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIkNMQVNTXCI6IG5ldyBSZWdFeHAoIFwiXlxcXFwuKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0XCJUQUdcIjogbmV3IFJlZ0V4cCggXCJeKFwiICsgaWRlbnRpZmllciArIFwifFsqXSlcIiApLFxuXHRcdFwiQVRUUlwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRcIlBTRVVET1wiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHBzZXVkb3MgKSxcblx0XHRcIkNISUxEXCI6IG5ldyBSZWdFeHAoIFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKGV2ZW58b2RkfCgoWystXXwpKFxcXFxkKilufClcIiArIHdoaXRlc3BhY2UgKyBcIiooPzooWystXXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdFwiYm9vbFwiOiBuZXcgUmVnRXhwKCBcIl4oPzpcIiArIGJvb2xlYW5zICsgXCIpJFwiLCBcImlcIiApLFxuXHRcdC8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKVxuXHRcdC8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0Y2hpbmcgaW4gYHNlbGVjdGBcblx0XHRcIm5lZWRzQ29udGV4dFwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIgK1xuXHRcdFx0d2hpdGVzcGFjZSArIFwiKigoPzotXFxcXGQpP1xcXFxkKilcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpKD89W14tXXwkKVwiLCBcImlcIiApXG5cdH0sXG5cblx0cmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJoZWFkZXIgPSAvXmhcXGQkL2ksXG5cblx0cm5hdGl2ZSA9IC9eW157XStcXHtcXHMqXFxbbmF0aXZlIFxcdy8sXG5cblx0Ly8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mgc2VsZWN0b3JzXG5cdHJxdWlja0V4cHIgPSAvXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxcblxuXHRyc2libGluZyA9IC9bK35dLyxcblxuXHQvLyBDU1MgZXNjYXBlc1xuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjZXNjYXBlZC1jaGFyYWN0ZXJzXG5cdHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoIFwiXFxcXFxcXFwoW1xcXFxkYS1mXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICsgXCI/fChcIiArIHdoaXRlc3BhY2UgKyBcIil8LilcIiwgXCJpZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBfLCBlc2NhcGVkLCBlc2NhcGVkV2hpdGVzcGFjZSApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZWQgLSAweDEwMDAwO1xuXHRcdC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50XG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyNFxuXHRcdC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgK1wiMHhcIlxuXHRcdHJldHVybiBoaWdoICE9PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID9cblx0XHRcdGVzY2FwZWQgOlxuXHRcdFx0aGlnaCA8IDAgP1xuXHRcdFx0XHQvLyBCTVAgY29kZXBvaW50XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHQvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcilcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7XG5cdH0sXG5cblx0Ly8gQ1NTIHN0cmluZy9pZGVudGlmaWVyIHNlcmlhbGl6YXRpb25cblx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNjb21tb24tc2VyaWFsaXppbmctaWRpb21zXG5cdHJjc3Nlc2NhcGUgPSAvKFtcXDAtXFx4MWZcXHg3Zl18Xi0/XFxkKXxeLSR8W15cXDAtXFx4MWZcXHg3Zi1cXHVGRkZGXFx3LV0vZyxcblx0ZmNzc2VzY2FwZSA9IGZ1bmN0aW9uKCBjaCwgYXNDb2RlUG9pbnQgKSB7XG5cdFx0aWYgKCBhc0NvZGVQb2ludCApIHtcblxuXHRcdFx0Ly8gVSswMDAwIE5VTEwgYmVjb21lcyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSXG5cdFx0XHRpZiAoIGNoID09PSBcIlxcMFwiICkge1xuXHRcdFx0XHRyZXR1cm4gXCJcXHVGRkZEXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnRyb2wgY2hhcmFjdGVycyBhbmQgKGRlcGVuZGVudCB1cG9uIHBvc2l0aW9uKSBudW1iZXJzIGdldCBlc2NhcGVkIGFzIGNvZGUgcG9pbnRzXG5cdFx0XHRyZXR1cm4gY2guc2xpY2UoIDAsIC0xICkgKyBcIlxcXFxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArIFwiIFwiO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWRcblx0XHRyZXR1cm4gXCJcXFxcXCIgKyBjaDtcblx0fSxcblxuXHQvLyBVc2VkIGZvciBpZnJhbWVzXG5cdC8vIFNlZSBzZXREb2N1bWVudCgpXG5cdC8vIFJlbW92aW5nIHRoZSBmdW5jdGlvbiB3cmFwcGVyIGNhdXNlcyBhIFwiUGVybWlzc2lvbiBEZW5pZWRcIlxuXHQvLyBlcnJvciBpbiBJRVxuXHR1bmxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0c2V0RG9jdW1lbnQoKTtcblx0fSxcblxuXHRkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcihcblx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybi
21167BlbGVtLmRpc2FibGVkID09PSB0cnVlICYmIChcImZvcm1cIiBpbiBlbGVtIHx8IFwibGFiZWxcIiBpbiBlbGVtKTtcblx0XHR9LFxuXHRcdHsgZGlyOiBcInBhcmVudE5vZGVcIiwgbmV4dDogXCJsZWdlbmRcIiB9XG5cdCk7XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdChhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSxcblx0XHRwcmVmZXJyZWREb2MuY2hpbGROb2Rlc1xuXHQpO1xuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMFxuXHQvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5XG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoX25hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKGVscykgKTtcblx0XHR9IDpcblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5XG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0dmFyIGogPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0XHRpID0gMDtcblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAodGFyZ2V0W2orK10gPSBlbHNbaSsrXSkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXG5cdFx0aWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHtcblx0XHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0fVxuXHRcdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXG5cdFx0aWYgKCBkb2N1bWVudElzSFRNTCApIHtcblxuXHRcdFx0Ly8gSWYgdGhlIHNlbGVjdG9yIGlzIHN1ZmZpY2llbnRseSBzaW1wbGUsIHRyeSB1c2luZyBhIFwiZ2V0KkJ5KlwiIERPTSBtZXRob2Rcblx0XHRcdC8vIChleGNlcHRpbmcgRG9jdW1lbnRGcmFnbWVudCBjb250ZXh0LCB3aGVyZSB0aGUgbWV0aG9kcyBkb24ndCBleGlzdClcblx0XHRcdGlmICggbm9kZVR5cGUgIT09IDExICYmIChtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0Ly8gSUQgc2VsZWN0b3Jcblx0XHRcdFx0aWYgKCAobSA9IG1hdGNoWzFdKSApIHtcblxuXHRcdFx0XHRcdC8vIERvY3VtZW50IGNvbnRleHRcblx0XHRcdFx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnNcblx0XHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0XHRpZiAoIGVsZW0uaWQgPT09IG0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRWxlbWVudCBjb250ZXh0XG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7XG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHRcdC8vIENsYXNzIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIChtID0gbWF0Y2hbM10pICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJlxuXHRcdFx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGFrZSBhZHZhbnRhZ2Ugb2YgcXVlcnlTZWxlY3RvckFsbFxuXHRcdFx0aWYgKCBzdXBwb3J0LnFzYSAmJlxuXHRcdFx0XHQhY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdICYmXG5cdFx0XHRcdCghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gY29udGV4dDtcblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IHNlbGVjdG9yO1xuXG5cdFx0XHRcdC8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudFxuXHRcdFx0XHQvLyBUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhpcyB3b3JrYXJvdW5kIHRlY2huaXF1ZVxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PThcblx0XHRcdFx0Ly8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHNcblx0XHRcdFx0fSBlbHNlIGlmICggY29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdFx0Ly8gQ2FwdHVyZSB0aGUgY29udGV4dCBJRCwgc2V0dGluZyBpdCBmaXJzdCBpZiBuZWNlc3Nhcnlcblx0XHRcdFx0XHRpZiAoIChuaWQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSggXCJpZFwiICkpICkge1xuXHRcdFx0XHRcdFx0bmlkID0gbmlkLnJlcGxhY2UoIHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgKG5pZCA9IGV4cGFuZG8pICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0XG5cdFx0XHRcdFx0Z3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0XHRcdFx0aSA9IGdyb3Vwcy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRncm91cHNbaV0gPSBcIiNcIiArIG5pZCArIFwiIFwiICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oIFwiLFwiICk7XG5cblx0XHRcdFx0XHQvLyBFeHBhbmQgY29udGV4dCBmb3Igc2libGluZyBzZWxlY3RvcnNcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHxcblx0XHRcdFx0XHRcdGNvbnRleHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIG5ld1NlbGVjdG9yICkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0XHRuZXdDb250ZXh0LnF1
21167ZXJ5U2VsZWN0b3JBbGwoIG5ld1NlbGVjdG9yIClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9IGNhdGNoICggcXNhRXJyb3IgKSB7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdGlmICggbmlkID09PSBleHBhbmRvICkge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cdFx0Ly8gVXNlIChrZXkgKyBcIiBcIikgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIHByb3RvdHlwZSBwcm9wZXJ0aWVzIChzZWUgSXNzdWUgIzE1Nylcblx0XHRpZiAoIGtleXMucHVzaCgga2V5ICsgXCIgXCIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7XG5cdFx0XHQvLyBPbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXNcblx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07XG5cdFx0fVxuXHRcdHJldHVybiAoY2FjaGVbIGtleSArIFwiIFwiIF0gPSB2YWx1ZSk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmaWVsZHNldFwiKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiAhIWZuKCBlbCApO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGZpbmFsbHkge1xuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZWwucGFyZW50Tm9kZSApIHtcblx0XHRcdGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsICk7XG5cdFx0fVxuXHRcdC8vIHJlbGVhc2UgbWVtb3J5IGluIElFXG5cdFx0ZWwgPSBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2YgdGhlIHNwZWNpZmllZCBhdHRyc1xuICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkXG4gKi9cbmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7XG5cdHZhciBhcnIgPSBhdHRycy5zcGxpdChcInxcIiksXG5cdFx0aSA9IGFyci5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0RXhwci5hdHRySGFuZGxlWyBhcnJbaV0gXSA9IGhhbmRsZXI7XG5cdH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYlxuICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNzIHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiXG4gKi9cbmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHtcblx0dmFyIGN1ciA9IGIgJiYgYSxcblx0XHRkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0YS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7XG5cdFx0XHRpZiAoIGN1ciA9PT0gYiApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhID8gMSA6IC0xO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgaW5wdXQgdHlwZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0UHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gKG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1
21167ZG9zIGZvciA6ZW5hYmxlZC86ZGlzYWJsZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWRcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGRpc2FibGVkICkge1xuXG5cdC8vIEtub3duIDpkaXNhYmxlZCBmYWxzZSBwb3NpdGl2ZXM6IGZpZWxkc2V0W2Rpc2FibGVkXSA+IGxlZ2VuZDpudGgtb2YtdHlwZShuKzIpIDpjYW4tZGlzYWJsZVxuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBPbmx5IGNlcnRhaW4gZWxlbWVudHMgY2FuIG1hdGNoIDplbmFibGVkIG9yIDpkaXNhYmxlZFxuXHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NjcmlwdGluZy5odG1sI3NlbGVjdG9yLWVuYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1kaXNhYmxlZFxuXHRcdGlmICggXCJmb3JtXCIgaW4gZWxlbSApIHtcblxuXHRcdFx0Ly8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOlxuXHRcdFx0Ly8gKiBsaXN0ZWQgZm9ybS1hc3NvY2lhdGVkIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgZmllbGRzZXRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjYXRlZ29yeS1saXN0ZWRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkXG5cdFx0XHQvLyAqIG9wdGlvbiBlbGVtZW50cyBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1vcHRpb24tZGlzYWJsZWRcblx0XHRcdC8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSBcImZvcm1cIiBwcm9wZXJ0eS5cblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdC8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50XG5cdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRcdFx0aWYgKCBcImxhYmVsXCIgaW4gZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0ucGFyZW50Tm9kZS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA2IC0gMTFcblx0XHRcdFx0Ly8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnNcblx0XHRcdFx0cmV0dXJuIGVsZW0uaXNEaXNhYmxlZCA9PT0gZGlzYWJsZWQgfHxcblxuXHRcdFx0XHRcdC8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5XG5cdFx0XHRcdFx0LyoganNoaW50IC1XMDE4ICovXG5cdFx0XHRcdFx0ZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiZcblx0XHRcdFx0XHRcdGRpc2FibGVkQW5jZXN0b3IoIGVsZW0gKSA9PT0gZGlzYWJsZWQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblxuXHRcdC8vIFRyeSB0byB3aW5ub3cgb3V0IGVsZW1lbnRzIHRoYXQgY2FuJ3QgYmUgZGlzYWJsZWQgYmVmb3JlIHRydXN0aW5nIHRoZSBkaXNhYmxlZCBwcm9wZXJ0eS5cblx0XHQvLyBTb21lIHZpY3RpbXMgZ2V0IGNhdWdodCBpbiBvdXIgbmV0IChsYWJlbCwgbGVnZW5kLCBtZW51LCB0cmFjayksIGJ1dCBpdCBzaG91bGRuJ3Rcblx0XHQvLyBldmVuIGV4aXN0IG9uIHRoZW0sIGxldCBhbG9uZSBoYXZlIGEgYm9vbGVhbiB2YWx1ZS5cblx0XHR9IGVsc2UgaWYgKCBcImxhYmVsXCIgaW4gZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHR9XG5cblx0XHQvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZFxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHtcblx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7XG5cdFx0YXJndW1lbnQgPSArYXJndW1lbnQ7XG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHtcblx0XHRcdFx0XHRzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHRcbiAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHtcblx0cmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29udGV4dDtcbn1cblxuLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2VcbnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9O1xuXG4vKipcbiAqIERldGVjdHMgWE1MIG5vZGVzXG4gKiBAcGFyYW0ge0Vs
21167ZW1lbnR8T2JqZWN0fSBlbGVtIEFuIGVsZW1lbnQgb3IgYSBkb2N1bWVudFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWZmIGVsZW0gaXMgYSBub24tSFRNTCBYTUwgbm9kZVxuICovXG5pc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0XG5cdC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKVxuXHR2YXIgZG9jdW1lbnRFbGVtZW50ID0gZWxlbSAmJiAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gXCJIVE1MXCIgOiBmYWxzZTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHRpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFVwZGF0ZSBnbG9iYWwgdmFyaWFibGVzXG5cdGRvY3VtZW50ID0gZG9jO1xuXHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jdW1lbnQgKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5LTExLCBFZGdlXG5cdC8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9ycyAoalF1ZXJ5ICMxMzkzNilcblx0aWYgKCBwcmVmZXJyZWREb2MgIT09IGRvY3VtZW50ICYmXG5cdFx0KHN1YldpbmRvdyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3KSAmJiBzdWJXaW5kb3cudG9wICE9PSBzdWJXaW5kb3cgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMSwgRWRnZVxuXHRcdGlmICggc3ViV2luZG93LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5XG5cdFx0fSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0c3ViV2luZG93LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvKiBBdHRyaWJ1dGVzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBTdXBwb3J0OiBJRTw4XG5cdC8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllc1xuXHQvLyAoZXhjZXB0aW5nIElFOCBib29sZWFucylcblx0c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5jbGFzc05hbWUgPSBcImlcIjtcblx0XHRyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZShcImNsYXNzTmFtZVwiKTtcblx0fSk7XG5cblx0LyogZ2V0RWxlbWVudChzKUJ5KlxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpIHJldHVybnMgb25seSBlbGVtZW50c1xuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIlwiKSApO1xuXHRcdHJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaWQgPSBleHBhbmRvO1xuXHRcdHJldHVybiAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBJRCBmaWx0ZXIgYW5kIGZpbmRcblx0aWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7XG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXHRcdEV4cHIuZmluZFtcIklEXCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gIGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDcgb25seVxuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRFeHByLmZpbmRbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBub2RlLCBpLCBlbGVtcyxcblx0XHRcdFx0XHRlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHQvLyBWZXJpZnkgdGhlIGl
21167kIGF0dHJpYnV0ZVxuXHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBlbGVtIF07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRmFsbCBiYWNrIG9uIGdldEVsZW1lbnRzQnlOYW1lXG5cdFx0XHRcdFx0ZWxlbXMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBpZCApO1xuXHRcdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtc1tpKytdKSApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRcdGlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0Ly8gVGFnXG5cdEV4cHIuZmluZFtcIlRBR1wiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgP1xuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgZG9uJ3QgaGF2ZSBnRUJUTlxuXHRcdFx0fSBlbHNlIGlmICggc3VwcG9ydC5xc2EgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LnF1
21167ZXJ5U2VsZWN0b3JBbGwoIHRhZyApO1xuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHR0bXAgPSBbXSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdC8vIEJ5IGhhcHB5IGNvaW5jaWRlbmNlLCBhIChicm9rZW4pIGdFQlROIGFwcGVhcnMgb24gRG9jdW1lbnRGcmFnbWVudCBub2RlcyB0b29cblx0XHRcdFx0cmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzXG5cdFx0XHRpZiAoIHRhZyA9PT0gXCIqXCIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdHRtcC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRtcDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdH07XG5cblx0Ly8gQ2xhc3Ncblx0RXhwci5maW5kW1wiQ0xBU1NcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwgY29udGV4dCApIHtcblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTtcblx0XHR9XG5cdH07XG5cblx0LyogUVNBL21hdGNoZXNTZWxlY3RvclxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydFxuXG5cdC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpXG5cdHJidWdneU1hdGNoZXMgPSBbXTtcblxuXHQvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKVxuXHQvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3Jcblx0Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZVxuXHQvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvclxuXHQvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4XG5cdHJidWdneVFTQSA9IFtdO1xuXG5cdGlmICggKHN1cHBvcnQucXNhID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkpICkge1xuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZVxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5XG5cdFx0XHQvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSxcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXG5cdFx0XHQvLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaW5uZXJIVE1MID0gXCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBpZD0nXCIgKyBleHBhbmRvICsgXCItXFxyXFxcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+XCIgK1xuXHRcdFx0XHRcIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTZcblx0XHRcdC8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkgc3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj1cblx0XHRcdC8vIFRoZSB0ZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHVua25vd24gaW4gT3BlcmEgYnV0IFwic2FmZVwiIGZvciBXaW5SVFxuXHRcdFx0Ly8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlsqXiRdPVwiICsgd2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCBcInZhbHVlXCIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseVxuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbChcIltzZWxlY3RlZF1cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKig/OnZhbHVlfFwiICsgYm9vbGVhbnMgKyBcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWU8MjksIEFuZHJvaWQ8NC40LCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuOCtcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwifj1cIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6Y2hlY2tlZFwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwiOmNoZWNrZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA4KywgaU9TIDgrXG5cdFx0XHQvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM2ODUxXG5cdFx0XHQvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcImEjXCIgKyBleHBhbmRvICsgXCIrKlwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIi4jLitbK35dXCIpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdGVsLmlubmVySFRNTCA9IFwiPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBXaW5kb3dzIDggTmF0aXZlIEFwcHNcblx0XHRcdC8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudFxuXHRcdFx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJEXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGVcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIltuYW1lPWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwibmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKlsqXiR8IX5dPz1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKVxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIjplbmFibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdFx0XHQvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHNcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKFwiOmRpc2FibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvc1xuXHRcdFx0ZWwucXVlcnlTZWxlY3RvckFsbChcIiosOnhcIik7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaChcIiwuKjpcIik7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHxcblx0XHRkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdFx0XHQvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KVxuXHRcdFx0c3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZWwsIFwiKlwiICk7XG5cblx0XHRcdC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb25cblx0XHRcdC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWRcblx0XHRcdG1hdGNoZXMuY2FsbCggZWwsIFwiW3MhPScnXTp4XCIgKTtcblx0XHRcdHJidWdneU1hdGNoZXMucHVzaCggXCIhPVwiLCBwc2V1ZG9zICk7XG5cdFx0fSk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKFwifFwiKSApO1xuXHRyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKFwifFwiKSApO1xuXG5cdC8qIENvbnRhaW5zXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApO1xuXG5cdC8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlclxuXHQvLyBQdXJwb3NlZnVsbHkgc2VsZi1leGNsdXNpdmVcblx0Ly8gQXMgaW4sIGFuIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBpdHNlbGZcblx0Y29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID9cblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdHZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsXG5cdFx0XHRcdGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlO1xuXHRcdFx0cmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiAoXG5cdFx0XHRcdGFkb3duLmNvbnRhaW5zID9cblx0XHRcdFx0XHRhZG93bi5jb250YWlucyggYnVwICkgOlxuXHRcdFx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNlxuXHRcdFx0KSk7XG5cdFx0fSA6XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHRpZiAoIGIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGIgPSBiLnBhcmVudE5vZGUpICkge1xuXHRcdFx0XHRcdGlmICggYiA9PT0gYSApIHtcblx0XHRcdFx0XHRcdHJldHVybi
21167B0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0LyogU29ydGluZ1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gRG9jdW1lbnQgb3JkZXIgc29ydGluZ1xuXHRzb3J0T3JkZXIgPSBoYXNDb21wYXJlID9cblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cblx0XHQvLyBGbGFnIGZvciBkdXBsaWNhdGUgcmVtb3ZhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHQvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVuY2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uXG5cdFx0dmFyIGNvbXBhcmUgPSAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO1xuXHRcdGlmICggY29tcGFyZSApIHtcblx0XHRcdHJldHVybiBjb21wYXJlO1xuXHRcdH1cblxuXHRcdC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnRcblx0XHRjb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgP1xuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkXG5cdFx0XHQxO1xuXG5cdFx0Ly8gRGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0aWYgKCBjb21wYXJlICYgMSB8fFxuXHRcdFx0KCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkge1xuXG5cdFx0XHQvLyBDaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIG91ciBwcmVmZXJyZWQgZG9jdW1lbnRcblx0XHRcdGlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBiID09PSBkb2N1bWVudCB8fCBiLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGIpICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxO1xuXHR9IDpcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdXAgPSBhLnBhcmVudE5vZGUsXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXG5cdFx0XHRhcCA9IFsgYSBdLFxuXHRcdFx0YnAgPSBbIGIgXTtcblxuXHRcdC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkXG5cdFx0aWYgKCAhYXVwIHx8ICFidXAgKSB7XG5cdFx0XHRyZXR1cm4gYSA9PT0gZG9jdW1lbnQgPyAtMSA6XG5cdFx0XHRcdGIgPT09IGRvY3VtZW50ID8gMSA6XG5cdFx0XHRcdGF1cCA/IC0xIDpcblx0XHRcdFx0YnVwID8gMSA6XG5cdFx0XHRcdHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblxuXHRcdC8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXG5cdFx0fSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb25cblx0XHRjdXIgPSBhO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGFwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblx0XHRjdXIgPSBiO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGJwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblxuXHRcdC8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5XG5cdFx0d2hpbGUgKCBhcFtpXSA9PT0gYnBbaV0gKSB7XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGkgP1xuXHRcdFx0Ly8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yXG5cdFx0XHRzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0XG5cdFx0XHRhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOlxuXHRcdFx0YnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOlxuXHRcdFx0MDtcblx0fTtcblxuXHRyZXR1cm4gZG9jdW1lbnQ7XG59O1xuXG5TaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTtcbn07XG5cblNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkXG5cdGV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsIFwiPSckMSddXCIgKTtcblxuXHRpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0IWNvbXBpbGVyQ2FjaGVbIGV4cHIgKyBcIiBcIiBdICYmXG5cdFx0KCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJlxuXHRcdCggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblx0XHRcdFx0XHQvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudFxuXHRcdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcblx0XHRcdFx0XHRlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHt9XG5cdH1cblxuXHRyZXR1cm4gU2l6emxlKCBleHByLCBkb2
21167N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xufTtcblxuU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXHRyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTtcbn07XG5cblNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cdFx0Ly8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgP1xuXHRcdHZhbCA6XG5cdFx0c3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDpcblx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xufTtcblxuU2l6emxlLmVzY2FwZSA9IGZ1bmN0aW9uKCBzZWwgKSB7XG5cdHJldHVybiAoc2VsICsgXCJcIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApO1xufTtcblxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcblx0dGhyb3cgbmV3IEVycm9yKCBcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiICsgbXNnICk7XG59O1xuXG4vKipcbiAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzXG4gKi9cblNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7XG5cdHZhciBlbGVtLFxuXHRcdGR1cGxpY2F0ZXMgPSBbXSxcblx0XHRqID0gMCxcblx0XHRpID0gMDtcblxuXHQvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlXG5cdGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7XG5cdHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApO1xuXHRyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApO1xuXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xuXHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0aWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7XG5cdFx0XHRcdGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2xlYXIgaW5wdXQgYWZ0ZXIgc29ydGluZyB0byByZWxlYXNlIG9iamVjdHNcblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1XG5cdHNvcnRJbnB1dCA9IG51bGw7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW1cbiAqL1xuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBub2RlLFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0aSA9IDAsXG5cdFx0bm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdGlmICggIW5vZGVUeXBlICkge1xuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XG5cdFx0d2hpbGUgKCAobm9kZSA9IGVsZW1baSsrXSkgKSB7XG5cdFx0XHQvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlc1xuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcblx0XHQvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzXG5cdFx0Ly8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1Mylcblx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdHJldCArPSBnZXRUZXh0KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XG5cdH1cblx0Ly8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzXG5cblx0cmV0dXJuIHJldDtcbn07XG5cbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFszXSA9ICggbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgXCJcIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbMl0gPT09IFwifj1cIiApIHtcblx0XHRcdFx0bWF0Y2hbM10gPSBcIiBcIiArIG1hdGNoWzNdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybi
21167BtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJbXCJDSElMRFwiXVxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcblx0XHRcdFx0MiB3aGF0IChjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHQzIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxuXHRcdFx0XHQ0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xcZCpufClcblx0XHRcdFx0NSBzaWduIG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ2IHggb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDcgc2lnbiBvZiB5LWNvbXBvbmVudFxuXHRcdFx0XHQ4IHkgb2YgeS1jb21wb25lbnRcblx0XHRcdCovXG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmICggbWF0Y2hbMV0uc2xpY2UoIDAsIDMgKSA9PT0gXCJudGhcIiApIHtcblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbM10gKSB7XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEXG5cdFx0XHRcdC8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzFcblx0XHRcdFx0bWF0Y2hbNF0gPSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09IFwiZXZlblwiIHx8IG1hdGNoWzNdID09PSBcIm9kZFwiICkgKTtcblx0XHRcdFx0bWF0Y2hbNV0gPSArKCAoIG1hdGNoWzddICsgbWF0Y2hbOF0gKSB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApO1xuXG5cdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0dmFyIGV4Y2Vzcyxcblx0XHRcdFx0dW5xdW90ZWQgPSAhbWF0Y2hbNl0gJiYgbWF0Y2hbMl07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByW1wiQ0hJTERcIl0udGVzdCggbWF0Y2hbMF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRtYXRjaFsyXSA9IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCI7XG5cblx0XHRcdC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiZcblx0XHRcdFx0Ly8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSlcblx0XHRcdFx0KGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApKSAmJlxuXHRcdFx0XHQvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0KGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7XG5cblx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcblx0XHRcdFx0bWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHRcdG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudClcblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApO1xuXHRcdH1cblx0fSxcblxuXHRmaWx0ZXI6IHtcblxuXHRcdFwiVEFHXCI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIG5vZGVOYW1lID0gbm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWVTZWxlY3RvciA9PT0gXCIqXCIgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XG5cdFx0XHR2YXIgcGF0dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArIFwiIFwiIF07XG5cblx0XHRcdHJldHVybiBwYXR0ZXJuIHx8XG5cdFx0XHRcdChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggXCIoXnxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIGNsYXNzTmFtZSArIFwiKFwiICsgd2hpdGVzcGFjZSArIFwifCQpXCIgKSkgJiZcblx0XHRcdFx0Y2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiApO1xuXHRcdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIiE9XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQgKz0gXCJcIjtcblxuXHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiPVwiID8gcmVzdWx0ID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiIT1cIiA/IHJlc3VsdCAhPT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIl49XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiKj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiQ9XCIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIn49XCIgPyAoIFwiIFwiICsgcmVzdWx0LnJlcGxhY2UoIHJ3aGl0ZXNwYWNlLCBcIiBcIiApICsgXCIgXCIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcInw9XCIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiIDpcblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIHR5cGUsIHdoYXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHtcblx0XHRcdHZhciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09IFwibnRoXCIsXG5cdFx0XHRcdGZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSBcImxhc3RcIixcblx0XHRcdFx0b2ZUeXBlID0gd2hhdCA9PT0gXCJvZi10eXBlXCI7XG5cblx0XHRcdHJldHVybi
21167BmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID9cblxuXHRcdFx0XHQvLyBTaG9ydGN1dCBmb3IgOm50aC0qKG4pXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiAhIWVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0fSA6XG5cblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LFxuXHRcdFx0XHRcdFx0ZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gXCJuZXh0U2libGluZ1wiIDogXCJwcmV2aW91c1NpYmxpbmdcIixcblx0XHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRcdG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0dXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGUsXG5cdFx0XHRcdFx0XHRkaWZmID0gZmFsc2U7XG5cblx0XHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHRcdFx0aWYgKCBzaW1wbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggZGlyICkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbylcblx0XHRcdFx0XHRcdFx0XHRzdGFydCA9IGRpciA9IHR5cGUgPT09IFwib25seVwiICYmICFzdGFydCAmJiBcIm5leHRTaWJsaW5nXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07XG5cblx0XHRcdFx0XHRcdC8vIG5vbi14bWwgOm50aC1jaGlsZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgXG5cdFx0XHRcdFx0XHRpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU2VlayBgZWxlbWAgZnJvbSBhIHByZXZpb3VzbHktY2FjaGVkIGluZGV4XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRub2RlID0gcGFyZW50O1xuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4ICYmIGNhY2hlWyAyIF07XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBVc2UgcHJldmlvdXNseS1jYWNoZWQgZWxlbWVudCBpbmRleCBpZiBhdmFpbGFibGVcblx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4O1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8geG1sIDpudGgtY2hpbGQoLi4uKVxuXHRcdFx0XHRcdFx0XHQvLyBvciA6bnRoLWxhc3QtY2hpbGQoLi4uKSBvciA6bnRoKC1sYXN0KT8tb2YtdHlwZSguLi4pXG5cdFx0XHRcdFx0XHRcdGlmICggZGlmZiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBzYW1lIGxvb3AgYXMgYWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0KytkaWZmICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNpemVcblx0XHRcdFx0XHRcdGRpZmYgLT0gbGFzdDtcblx0XHRcdFx0XHRcdHJldHVybi
21167BkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIHBzZXVkbywgYXJndW1lbnQgKSB7XG5cdFx0XHQvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmVcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXNcblx0XHRcdC8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzXG5cdFx0XHQvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zXG5cdFx0XHR2YXIgYXJncyxcblx0XHRcdFx0Zm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiICsgcHNldWRvICk7XG5cblx0XHRcdC8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXRcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG5cdFx0XHQvLyBqdXN0IGFzIFNpenpsZSBkb2VzXG5cdFx0XHRpZiAoIGZuWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHJldHVybiBmbiggYXJndW1lbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzXG5cdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdGFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCBcIlwiLCBhcmd1bWVudCBdO1xuXHRcdFx0XHRyZXR1cm4gRXhwci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID9cblx0XHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaWR4LFxuXHRcdFx0XHRcdFx0XHRtYXRjaGVkID0gZm4oIHNlZWQsIGFyZ3VtZW50ICksXG5cdFx0XHRcdFx0XHRcdGkgPSBtYXRjaGVkLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHRcdHNlZWRbIGlkeCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSkgOlxuXHRcdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZuO1xuXHRcdH1cblx0fSxcblxuXHRwc2V1ZG9zOiB7XG5cdFx0Ly8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zXG5cdFx0XCJub3RcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlXG5cdFx0XHQvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXG5cdFx0XHR2YXIgaW5wdXQgPSBbXSxcblx0XHRcdFx0cmVzdWx0cyA9IFtdLFxuXHRcdFx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApICk7XG5cblx0XHRcdHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gP1xuXHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0XHRcdHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSxcblx0XHRcdFx0XHRcdGkgPSBzZWVkLmxlbmd0aDtcblxuXHRcdFx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBieSBgbWF0Y2hlcmBcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0XHRcdFx0XHRzZWVkW2ldID0gIShtYXRjaGVzW2ldID0gZWxlbSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0aW5wdXRbMF0gPSBlbGVtO1xuXHRcdFx0XHRcdG1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTtcblx0XHRcdFx0XHQvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0XHRcdGlucHV0WzBdID0gbnVsbDtcblx0XHRcdFx0XHRyZXR1cm4gIXJlc3VsdHMucG9wKCk7XG5cdFx0XHRcdH07XG5cdFx0fSksXG5cblx0XHRcImhhc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJjb250YWluc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8IGdldFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIFwiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3RvclxuXHRcdC8vIGlzIGJhc2VkIHNvbGVseSBvbiB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlXG5cdFx0Ly8gYmVpbmcgZXF1YWwgdG8gdGhlIGlkZW50aWZpZXIgQyxcblx0XHQvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRlbnRpZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IFwiLVwiLlxuXHRcdC8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuXHRcdC8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuXCJcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvXG5cdFx0XCJsYW5nXCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7XG5cdFx0XHQvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyXG5cdFx0XHRpZiAoICFyaWRlbnRpZmllci50ZXN0KGxhbmcgfHwgXCJcIikgKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIiArIGxhbmcgKTtcblx0XHRcdH1cblx0XHRcdGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybi
21167BmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIGVsZW1MYW5nO1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRcdFx0XHRlbGVtLmxhbmcgOlxuXHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImxhbmdcIikpICkge1xuXG5cdFx0XHRcdFx0XHRlbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArIFwiLVwiICkgPT09IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IHdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIE1pc2NlbGxhbmVvdXNcblx0XHRcInRhcmdldFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXHRcdFx0cmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkO1xuXHRcdH0sXG5cblx0XHRcInJvb3RcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jRWxlbTtcblx0XHR9LFxuXG5cdFx0XCJmb2N1c1wiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmICghZG9jdW1lbnQuaGFzRm9jdXMgfHwgZG9jdW1lbnQuaGFzRm9jdXMoKSkgJiYgISEoZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCk7XG5cdFx0fSxcblxuXHRcdC8vIEJvb2xlYW4gcHJvcGVydGllc1xuXHRcdFwiZW5hYmxlZFwiOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggZmFsc2UgKSxcblx0XHRcImRpc2FibGVkXCI6IGNyZWF0ZURpc2FibGVkUHNldWRvKCB0cnVlICksXG5cblx0XHRcImNoZWNrZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHNcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaG
21167Vja2VkXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gKG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgISFlbGVtLmNoZWNrZWQpIHx8IChub2RlTmFtZSA9PT0gXCJvcHRpb25cIiAmJiAhIWVsZW0uc2VsZWN0ZWQpO1xuXHRcdH0sXG5cblx0XHRcInNlbGVjdGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdFxuXHRcdFx0Ly8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseVxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0Ly8gQ29udGVudHNcblx0XHRcImVtcHR5XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG9cblx0XHRcdC8vIDplbXB0eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9kZXMgKHRleHQ6IDM7IGNkYXRhOiA0OyBlbnRpdHkgcmVmOiA1KSxcblx0XHRcdC8vICAgYnV0IG5vdCBieSBvdGhlcnMgKGNvbW1lbnQ6IDg7IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246IDc7IGV0Yy4pXG5cdFx0XHQvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRcInBhcmVudFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAhRXhwci5wc2V1ZG9zW1wiZW1wdHlcIl0oIGVsZW0gKTtcblx0XHR9LFxuXG5cdFx0Ly8gRWxlbWVudC9pbnB1dCB0eXBlc1xuXHRcdFwiaGVhZGVyXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImlucHV0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImJ1dHRvblwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFwiYnV0dG9uXCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIjtcblx0XHR9LFxuXG5cdFx0XCJ0ZXh0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiZcblx0XHRcdFx0ZWxlbS50eXBlID09PSBcInRleHRcIiAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDhcblx0XHRcdFx0Ly8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sIFwic2VhcmNoXCIpIGFwcGVhciB3aXRoIGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCJcblx0XHRcdFx0KCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkgPT0gbnVsbCB8fCBhdHRyLnRvTG93ZXJDYXNlKCkgPT09IFwidGV4dFwiICk7XG5cdFx0fSxcblxuXHRcdC8vIFBvc2l0aW9uLWluLWNvbGxlY3Rpb25cblx0XHRcImZpcnN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gWyAwIF07XG5cdFx0fSksXG5cblx0XHRcImxhc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gWyBsZW5ndGggLSAxIF07XG5cdFx0fSksXG5cblx0XHRcImVxXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTtcblx0XHR9KSxcblxuXHRcdFwiZXZlblwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwib2RkXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAxO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJsdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7IC0taSA+PSAwOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcImd0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybi
21167BtYXRjaEluZGV4ZXM7XG5cdFx0fSlcblx0fVxufTtcblxuRXhwci5wc2V1ZG9zW1wibnRoXCJdID0gRXhwci5wc2V1ZG9zW1wiZXFcIl07XG5cbi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zXG5mb3IgKCBpIGluIHsgcmFkaW86IHRydWUsIGNoZWNrYm94OiB0cnVlLCBmaWxlOiB0cnVlLCBwYXNzd29yZDogdHJ1ZSwgaW1hZ2U6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApO1xufVxuZm9yICggaSBpbiB7IHN1Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVCdXR0b25Qc2V1ZG8oIGkgKTtcbn1cblxuLy8gRWFzeSBBUEkgZm9yIGNyZWF0aW5nIG5ldyBzZXRGaWx0ZXJzXG5mdW5jdGlvbiBzZXRGaWx0ZXJzKCkge31cbnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zO1xuRXhwci5zZXRGaWx0ZXJzID0gbmV3IHNldEZpbHRlcnMoKTtcblxudG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHtcblx0dmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsXG5cdFx0c29GYXIsIGdyb3VwcywgcHJlRmlsdGVycyxcblx0XHRjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCBjYWNoZWQgKSB7XG5cdFx0cmV0dXJuIHBhcnNlT25seSA/IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTtcblx0fVxuXG5cdHNvRmFyID0gc2VsZWN0b3I7XG5cdGdyb3VwcyA9IFtdO1xuXHRwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7XG5cblx0d2hpbGUgKCBzb0ZhciApIHtcblxuXHRcdC8vIENvbW1hIGFuZCBmaXJzdCBydW5cblx0XHRpZiAoICFtYXRjaGVkIHx8IChtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdGlmICggbWF0Y2ggKSB7XG5cdFx0XHRcdC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyO1xuXHRcdFx0fVxuXHRcdFx0Z3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTtcblx0XHR9XG5cblx0XHRtYXRjaGVkID0gZmFsc2U7XG5cblx0XHQvLyBDb21iaW5hdG9yc1xuXHRcdGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkge1xuXHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2Vcblx0XHRcdFx0dHlwZTogbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sIFwiIFwiIClcblx0XHRcdH0pO1xuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGaWx0ZXJzXG5cdFx0Zm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHtcblx0XHRcdGlmICggKG1hdGNoID0gbWF0Y2hFeHByWyB0eXBlIF0uZXhlYyggc29GYXIgKSkgJiYgKCFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcblx0XHRcdFx0KG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0XHRtYXRjaGVzOiBtYXRjaFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoICFtYXRjaGVkICkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzXG5cdC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZ1xuXHQvLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnNcblx0cmV0dXJuIHBhcnNlT25seSA/XG5cdFx0c29GYXIubGVuZ3RoIDpcblx0XHRzb0ZhciA/XG5cdFx0XHRTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkgOlxuXHRcdFx0Ly8gQ2FjaGUgdGhlIHRva2Vuc1xuXHRcdFx0dG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7XG59O1xuXG5mdW5jdGlvbiB0b1NlbGVjdG9yKCB0b2tlbnMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdHNlbGVjdG9yID0gXCJcIjtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0c2VsZWN0b3IgKz0gdG9rZW5zW2ldLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHtcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxuXHRcdHNraXAgPSBjb21iaW5hdG9yLm5leHQsXG5cdFx0a2V5ID0gc2tpcCB8fCBkaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYga2V5ID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gOlxuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsXG5cdFx0XHRcdG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdO1xuXG5cdFx0XHQvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBjb21iaW5
21167hdG9yIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdGlmICggc2tpcCAmJiBza2lwID09PSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdGVsZW0gPSBlbGVtWyBkaXIgXSB8fCBlbGVtO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggKG9sZENhY2hlID0gdW5pcXVlQ2FjaGVbIGtleSBdKSAmJlxuXHRcdFx0XHRcdFx0XHRvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsga2V5IF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAobmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IDpcblx0XHRtYXRjaGVyc1swXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0aWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdG5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdGlmICggbWFwcGVkICkge1xuXHRcdFx0XHRcdG1hcC5wdXNoKCBpICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3VW5tYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7XG5cdGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7XG5cdH1cblx0aWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApO1xuXHR9XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCBcIipcIiwgY29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDogY29udGV4dCwgW10gKSxcblxuXHRcdFx0Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uXG5cdFx0XHRtYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciApID9cblx0XHRcdFx0Y29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRlbGVtcyxcblxuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXIgP1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0XHRwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRbXSA6XG5cblx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlI
21167HJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0XHRyZXN1bHRzIDpcblx0XHRcdFx0bWF0Y2hlckluO1xuXG5cdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cdFx0XHRtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHBvc3RGaWx0ZXJcblx0XHRpZiAoIHBvc3RGaWx0ZXIgKSB7XG5cdFx0XHR0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTtcblx0XHRcdHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTtcblxuXHRcdFx0Ly8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJblxuXHRcdFx0aSA9IHRlbXAubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzXG5cdFx0XHRcdFx0dGVtcCA9IFtdO1xuXHRcdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2hcblx0XHRcdFx0XHRcdFx0dGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWRcblx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiZcblx0XHRcdFx0XHRcdCh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbXCIgXCJdLFxuXHRcdGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCxcblxuXHRcdC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpXG5cdFx0bWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0O1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgP1xuXHRcdFx0XHRcdG1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRcdG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTtcblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbaV0udHlwZSBdKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybi
21167BzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc2V0TWF0Y2hlcihcblx0XHRcdFx0XHRpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSxcblx0XHRcdFx0XHRpID4gMSAmJiB0b1NlbGVjdG9yKFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKS5jb25jYXQoeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0pXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cdFx0XHRcdC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHRcblx0XHRcdFx0ZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbXCJUQUdcIl0oIFwiKlwiLCBvdXRlcm1vc3QgKSxcblx0XHRcdFx0Ly8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXJcblx0XHRcdFx0ZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHNcblx0XHRcdC8vIFN1cHBvcnQ6IElFPDksIFNhZmFyaVxuXHRcdFx0Ly8gVG9sZXJhdGUgTm9kZUxpc3QgcHJvcGVydGllcyAoSUU6IFwibGVuZ3RoXCI7IFNhZmFyaTogPG51bWJlcj4pIG1hdGNoaW5nIGVsZW1lbnRzIGJ5IGlkXG5cdFx0XHRmb3IgKCA7IGkgIT09IGxlbiAmJiAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0aWYgKCAhY29udGV4dCAmJiBlbGVtLm93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50ICkge1xuXHRcdFx0XHRcdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0XHRcdFx0XHRcdHhtbCA9ICFkb2N1bWVudElzSFRNTDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0d2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCB8fCBkb2N1bWVudCwgeG1sKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0pICkge1xuXHRcdFx0XHRcdFx0bWF0Y2hlZENvdW50LS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdFxuXHRcdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHRcdHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGBpYCBpcyBub3cgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHZpc2l0ZWQgYWJvdmUsIGFuZCBhZGRpbmcgaXQgdG8gYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIG1ha2VzIHRoZSBsYXR0ZXIgbm9ubmVnYXRpdmUuXG5cdFx0XHRtYXRjaGVkQ291bnQgKz0gaTtcblxuXHRcdFx0Ly8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBlcXVhbHMgYGlgKSwgdW5sZXNzIHdlIGRpZG4ndCB2aXNpdCBfYW55XyBlbGVtZW50cyBpbiB0aGUgYWJvdmUgbG9vcCBiZWNhdXNlIHdlIGhhdmVcblx0XHRcdC8vIG5vIGVsZW1lbnQgbWF0Y2hlcnMgYW5kIG5vIHNlZWQuXG5cdFx0XHQvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyBcIjBcIiBgaWAgYWxsb3dzIGBpYCB0byByZW1haW4gYSBzdHJpbmcgb25seSBpbiB0aGF0XG5cdFx0XHQvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIFwiMDBcIiBgbWF0Y2hlZENvdW50YCB0aGF0IGRpZmZlcnMgZnJvbSBgaWAgYnV0IGlzIGFsc29cblx0XHRcdC8vIG51bWVyaWNhbGx5IHplcm8uXG5cdFx0XHRpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBzZXRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdC8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmdcblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0XHRzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgP
21167SBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cdFx0Ly8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50XG5cdFx0aWYgKCAhbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdH1cblx0XHRpID0gbWF0Y2gubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0Y2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNoW2ldICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTtcblxuXHRcdC8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvblxuXHRcdGNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHR9XG5cdHJldHVybiBjYWNoZWQ7XG59O1xuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbnNlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWRcblx0Ly8gKHRoZSBsYXR0ZXIgb2Ygd2hpY2ggZ3VhcmFudGVlcyB1cyBjb250ZXh0KVxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFJlZHVjZSBjb250ZXh0IGlmIHRoZSBsZWFkaW5nIGNvbXBvdW5kIHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSBcIklEXCIgJiZcblx0XHRcdFx0Y29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkge1xuXG5cdFx0XHRjb250ZXh0ID0gKCBFeHByLmZpbmRbXCJJRFwiXSggdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKHJ1bmVzY2FwZSwgZnVuZXNjYXBlKSwgY29udGV4dCApIHx8IFtdIClbMF07XG5cdFx0XHRpZiAoICFjb250ZXh0ICkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0Ly8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbFxuXHRcdFx0fSBlbHNlIGlmICggY29tcGlsZWQgKSB7XG5cdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZldGNoIGEgc2VlZCBzZXQgZm9yIHJpZ2h0LXRvLWxlZnQgbWF0Y2hpbmdcblx0XHRpID0gbWF0Y2hFeHByW1wibmVlZHNDb250ZXh0XCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRva2VuID0gdG9rZW5zW2ldO1xuXG5cdFx0XHQvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yXG5cdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbICh0eXBlID0gdG9rZW4udHlwZSkgXSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIChmaW5kID0gRXhwci5maW5kWyB0eXBlIF0pICkge1xuXHRcdFx0XHQvLyBTZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnNcblx0XHRcdFx0aWYgKCAoc2VlZCA9IGZpbmQoXG5cdFx0XHRcdFx0dG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLFxuXHRcdFx0XHRcdHJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0XHRcdFx0KSkgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHlcblx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJi
21167B0b1NlbGVjdG9yKCB0b2tlbnMgKTtcblx0XHRcdFx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNlZWQgKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbiBpZiBvbmUgaXMgbm90IHByb3ZpZGVkXG5cdC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmVcblx0KCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKFxuXHRcdHNlZWQsXG5cdFx0Y29udGV4dCxcblx0XHQhZG9jdW1lbnRJc0hUTUwsXG5cdFx0cmVzdWx0cyxcblx0XHQhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdCk7XG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLy8gT25lLXRpbWUgYXNzaWdubWVudHNcblxuLy8gU29ydCBzdGFiaWxpdHlcbnN1cHBvcnQuc29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoXCJcIikuc29ydCggc29ydE9yZGVyICkuam9pbihcIlwiKSA9PT0gZXhwYW5kbztcblxuLy8gU3VwcG9ydDogQ2hyb21lIDE0LTM1K1xuLy8gQWx3YXlzIGFzc3VtZSBkdXBsaWNhdGVzIGlmIHRoZXkgYXJlbid0IHBhc3NlZCB0byB0aGUgY29tcGFyaXNvbiBmdW5jdGlvblxuc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7XG5cbi8vIEluaXRpYWxpemUgYWdhaW5zdCB0aGUgZGVmYXVsdCBkb2N1bWVudFxuc2V0RG9jdW1lbnQoKTtcblxuLy8gU3VwcG9ydDogV2Via2l0PDUzNy4zMiAtIFNhZmFyaSA2LjAuMy9DaHJvbWUgMjUgKGZpeGVkIGluIENocm9tZSAyNylcbi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKlxuc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGVsLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZmllbGRzZXRcIikgKSAmIDE7XG59KTtcblxuLy8gU3VwcG9ydDogSUU8OFxuLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgXCJpbnRlcnBvbGF0aW9uXCJcbi8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4XG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxhIGhyZWY9JyMnPjwvYT5cIjtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIgO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggXCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInR5cGVcIiA/IDEgOiAyICk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxpbnB1dC8+XCI7XG5cdGVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCBcInZhbHVlXCIsIFwiXCIgKTtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidmFsdWVcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXNcbmlmICggIWFzc2VydChmdW5jdGlvbiggZWwgKSB7XG5cdHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA9PSBudWxsO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgdmFsO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdFx0KHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdH1cblx0fSk7XG59XG5cbnJldHVybiBTaXp6bGU7XG5cbn0pKCB3aW5kb3cgKTtcblxuXG5cbmpRdWVyeS5maW5kID0gU2l6emxlO1xualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xuXG4vLyBEZXByZWNhdGVkXG5qUXVlcnkuZXhwclsgXCI6XCIgXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7XG5qUXVlcnkudW5pcXVlU29ydCA9IGpRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDtcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XG5qUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7XG5qUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7XG5qUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlO1xuXG5cblxuXG52YXIgZGlyID0gZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7XG5cdHZhciBtYXRjaGVkID0gW10sXG5cdFx0dHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkO1xuXG5cdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkge1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGlsICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0fVxuXHR9XG5cdHJldHVybi
21167BtYXRjaGVkO1xufTtcblxuXG52YXIgc2libGluZ3MgPSBmdW5jdGlvbiggbiwgZWxlbSApIHtcblx0dmFyIG1hdGNoZWQgPSBbXTtcblxuXHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xuXHRcdGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkge1xuXHRcdFx0bWF0Y2hlZC5wdXNoKCBuICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O1xuXG5cblxuZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7XG5cbiAgcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbn07XG52YXIgcnNpbmdsZVRhZyA9ICggL148KFthLXpdW15cXC9cXDA+OlxceDIwXFx0XFxyXFxuXFxmXSopW1xceDIwXFx0XFxyXFxuXFxmXSpcXC8/Pig/OjxcXC9cXDE+fCkkL2kgKTtcblxuXG5cbi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90XG5mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIG5vdCApIHtcblx0aWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICkgIT09IG5vdDtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBTaW5nbGUgZWxlbWVudFxuXHRpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gQXJyYXlsaWtlIG9mIGVsZW1lbnRzIChqUXVlcnksIGFyZ3VtZW50cywgQXJyYXkpXG5cdGlmICggdHlwZW9mIHF1YWxpZmllciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGluZGV4T2YuY2FsbCggcXVhbGlmaWVyLCBlbGVtICkgPiAtMSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9yc1xuXHRyZXR1cm4galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cywgbm90ICk7XG59XG5cbmpRdWVyeS5maWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHtcblx0dmFyIGVsZW0gPSBlbGVtc1sgMCBdO1xuXG5cdGlmICggbm90ICkge1xuXHRcdGV4cHIgPSBcIjpub3QoXCIgKyBleHByICsgXCIpXCI7XG5cdH1cblxuXHRpZiAoIGVsZW1zLmxlbmd0aCA9PT0gMSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdHJldHVybiBqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGVsZW0sIGV4cHIgKSA/IFsgZWxlbSBdIDogW107XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTtcblx0fSApICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgaSwgcmV0LFxuXHRcdFx0bGVuID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRzZWxmID0gdGhpcztcblxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkoIHNlbGVjdG9yICkuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKSApO1xuXHRcdH1cblxuXHRcdHJldCA9IHRoaXMucHVzaFN0YWNrKCBbXSApO1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsgaSBdLCByZXQgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbGVuID4gMSA/IGpRdWVyeS51bmlxdWVTb3J0KCByZXQgKSA6IHJldDtcblx0fSxcblx0ZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7XG5cdH0sXG5cdG5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgdHJ1ZSApICk7XG5cdH0sXG5cdGlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuICEhd2lubm93KFxuXHRcdFx0dGhpcyxcblxuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldFxuXHRcdFx0Ly8gc28gJChcInA6Zmlyc3RcIikuaXMoXCJwOmxhc3RcIikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvIFwicFwiLlxuXHRcdFx0dHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3IgKSA6XG5cdFx0XHRcdHNlbGVjdG9yIHx8IFtdLFxuXHRcdFx0ZmFsc2Vcblx0XHQpLmxlbmd0aDtcblx0fVxufSApO1xuXG5cbi8vIEluaXRpYWxpemUgYSBqUXVlcnkgb2JqZWN0XG5cblxuLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpXG52YXIgcm9vdGpRdWVyeSxcblxuXHQvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5nc1xuXHQvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpXG5cdC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHQvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkXG5cdHJxdWlja0V4cHIgP
21167SAvXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0rKSkkLyxcblxuXHRpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7XG5cdFx0dmFyIG1hdGNoLCBlbGVtO1xuXG5cdFx0Ly8gSEFORExFOiAkKFwiXCIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpXG5cdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvLyBNZXRob2QgaW5pdCgpIGFjY2VwdHMgYW4gYWx0ZXJuYXRlIHJvb3RqUXVlcnlcblx0XHQvLyBzbyBtaWdyYXRlIGNhbiBzdXBwb3J0IGpRdWVyeS5zdWIgKGdoLTIxMDEpXG5cdFx0cm9vdCA9IHJvb3QgfHwgcm9vdGpRdWVyeTtcblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3JbIDAgXSA9PT0gXCI8XCIgJiZcblx0XHRcdFx0c2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gXCI+XCIgJiZcblx0XHRcdFx0c2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cblx0XHRcdFx0Ly8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2tcblx0XHRcdFx0bWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkXG5cdFx0XHRpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWyAxIF0gKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WyAwIF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsgMSBdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWyAxIF0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkge1xuXHRcdFx0XHRcdFx0Zm9yICggbWF0Y2ggaW4gY29udGV4dCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTtcblxuXHRcdFx0XHRcdGlmICggZWxlbSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3Rcblx0XHRcdFx0XHRcdHRoaXNbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpc1sgMCBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkge1xuXHRcdFx0cmV0dXJuIHJvb3QucmVhZHkgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHJvb3QucmVhZHkoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0c2VsZWN0b3IoIGpRdWVyeSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xuXHR9O1xuXG4vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uXG5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcblxuLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZVxucm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTtcblxuXG52YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXG5cblx0Ly8gTWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXRcblx0Z3VhcmFudGVlZFVuaXF1ZSA9IHtcblx0XHRjaGlsZHJlbjogdHJ1ZSxcblx0XHRjb250ZW50czogdHJ1ZSxcblx0XHRuZXh0OiB0cnVlLFxuXHRcdHByZXY6IHRydWVcblx0fTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0dmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLFxuXHRcdFx0bCA9IHRhcmdldHMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbIGkgXSApICkge1xuXHRcdFx0XHRcdHJldHVybi
21167B0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7XG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0bWF0Y2hlZCA9IFtdLFxuXHRcdFx0dGFyZ2V0cyA9IHR5cGVvZiBzZWxlY3RvcnMgIT09IFwic3RyaW5nXCIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTtcblxuXHRcdC8vIFBvc2l0aW9uYWwgc2VsZWN0b3JzIG5ldmVyIG1hdGNoLCBzaW5jZSB0aGVyZSdzIG5vIF9zZWxlY3Rpb25fIGNvbnRleHRcblx0XHRpZiAoICFybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmb3IgKCBjdXIgPSB0aGlzWyBpIF07IGN1ciAmJiBjdXIgIT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXG5cdFx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAoIHRhcmdldHMgP1xuXHRcdFx0XHRcdFx0dGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIFNpenpsZVxuXHRcdFx0XHRcdFx0Y3VyLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggY3VyLCBzZWxlY3RvcnMgKSApICkge1xuXG5cdFx0XHRcdFx0XHRtYXRjaGVkLnB1c2goIGN1ciApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApO1xuXHR9LFxuXG5cdC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHNldFxuXHRpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudFxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7XG5cdFx0fVxuXG5cdFx0Ly8gSW5kZXggaW4gc2VsZWN0b3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApO1xuXHRcdH1cblxuXHRcdC8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudFxuXHRcdHJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsXG5cblx0XHRcdC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZFxuXHRcdFx0ZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtXG5cdFx0KTtcblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soXG5cdFx0XHRqUXVlcnkudW5pcXVlU29ydChcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLmdldCgpLCBqUXVlcnkoIHNlbGVjdG9yLCBjb250ZXh0ICkgKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLmFkZCggc2VsZWN0b3IgPT0gbnVsbCA/XG5cdFx0XHR0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKCBzZWxlY3RvciApXG5cdFx0KTtcblx0fVxufSApO1xuXG5mdW5jdGlvbiBzaWJsaW5nKCBjdXIsIGRpciApIHtcblx0d2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fVxuXHRyZXR1cm4gY3VyO1xufVxuXG5qUXVlcnkuZWFjaCgge1xuXHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0cmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDtcblx0fSxcblx0cGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIgKTtcblx0fSxcblx0cGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIsIHVudGlsICk7XG5cdH0sXG5cdG5leHQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZX
21167Zpb3VzU2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTtcblx0fSxcblx0Y2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7XG5cdH0sXG5cdGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcbiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgXCJpZnJhbWVcIiApICkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW0uY29udGVudERvY3VtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHksIGlPUyA3IG9ubHksIEFuZHJvaWQgQnJvd3NlciA8PTQuMyBvbmx5XG4gICAgICAgIC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdFxuICAgICAgICAvLyBkb24ndCBzdXBwb3J0IGl0LlxuICAgICAgICBpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRlbXBsYXRlXCIgKSApIHtcbiAgICAgICAgICAgIGVsZW0gPSBlbGVtLmNvbnRlbnQgfHwgZWxlbTtcbiAgICAgICAgfVxuXG4gICAgICAgI
vendor: 12,571 bytes, line 21167
21167HJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmNoaWxkTm9kZXMgKTtcblx0fVxufSwgZnVuY3Rpb24oIG5hbWUsIGZuICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7XG5cdFx0dmFyIG1hdGNoZWQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTtcblxuXHRcdGlmICggbmFtZS5zbGljZSggLTUgKSAhPT0gXCJVbnRpbFwiICkge1xuXHRcdFx0c2VsZWN0b3IgPSB1bnRpbDtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgZHVwbGljYXRlc1xuXHRcdFx0aWYgKCAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdICkge1xuXHRcdFx0XHRqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlc1xuXHRcdFx0aWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRtYXRjaGVkLnJldmVyc2UoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQgKTtcblx0fTtcbn0gKTtcbnZhciBybm90aHRtbHdoaXRlID0gKCAvW15cXHgyMFxcdFxcclxcblxcZl0rL2cgKTtcblxuXG5cbi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzXG5mdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkge1xuXHR2YXIgb2JqZWN0ID0ge307XG5cdGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10sIGZ1bmN0aW9uKCBfLCBmbGFnICkge1xuXHRcdG9iamVjdFsgZmxhZyBdID0gdHJ1ZTtcblx0fSApO1xuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gKlxuICpcdG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3dcbiAqXHRcdFx0dGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdFxuICpcbiAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJlXG4gKiBcImZpcmVkXCIgbXVsdGlwbGUgdGltZXMuXG4gKlxuICogUG9zc2libGUgb3B0aW9uczpcbiAqXG4gKlx0b25jZTpcdFx0XHR3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdG1lbW9yeTpcdFx0XHR3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkXG4gKlx0XHRcdFx0XHRhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCBcIm1lbW9yaXplZFwiXG4gKlx0XHRcdFx0XHR2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0dW5pcXVlOlx0XHRcdHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KVxuICpcbiAqXHRzdG9wT25GYWxzZTpcdGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICpcbiAqL1xualF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWRcblx0Ly8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KVxuXHRvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgP1xuXHRcdGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6XG5cdFx0alF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTtcblxuXHR2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZ1xuXHRcdGZpcmluZyxcblxuXHRcdC8vIExhc3QgZmlyZSB2YWx1ZSBmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzXG5cdFx0bWVtb3J5LFxuXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWRcblx0XHRmaXJlZCxcblxuXHRcdC8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmdcblx0XHRsb2NrZWQsXG5cblx0XHQvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdFxuXHRcdGxpc3QgPSBbXSxcblxuXHRcdC8vIFF1ZXVlIG9mIGV4ZWN1dGlvbiBkYXRhIGZvciByZXBlYXRhYmxlIGxpc3RzXG5cdFx0cXVldWUgPSBbXSxcblxuXHRcdC8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKVxuXHRcdGZpcmluZ0luZGV4ID0gLTEsXG5cblx0XHQvLyBGaXJlIGNhbGxiYWNrc1xuXHRcdGZpcmUgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nXG5cdFx0XHRsb2NrZWQgPSBsb2NrZWQgfHwgb3B0aW9ucy5vbmNlO1xuXG5cdFx0XHQvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucyxcblx0XHRcdC8vIHJlc3BlY3RpbmcgZmlyaW5nSW5kZXggb3ZlcnJpZGVzIGFuZCBydW50aW1lIGNoYW5nZXNcblx0XHRcdGZpcmVkID0gZmlyaW5nID0gdHJ1ZTtcblx0XHRcdGZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkge1xuXHRcdFx0XHRtZW1vcnkgPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0XHR3aGlsZSAoICsrZmlyaW5nSW5kZXggPCBsaXN0Lmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdC8vIFJ1biBjYWxsYmFjayBhbmQgY2hlY2sgZm9yIGVhcmx5IHRlcm1pbmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBtZW1vcnlbIDAgXSwgbWVtb3J5WyAxIF0gKSA9PT0gZmFsc2UgJiZcblx0XHRcdFx0XHRcdG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEp1bXAgdG8gZW5kIGFuZCBmb3JnZXQgdGhlIGRhdGEgc28gLmFkZCBkb2Vzbid0IHJlLWZpcmVcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdFxuXHRcdFx0aWYgKCAhb3B0aW9ucy5tZW1vcnkgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRmaXJpbmcgPSBmYWxzZTtcblxuXHRcdFx0Ly8gQ2xlYW4gdXAgaWYgd2UncmUgZG9uZSBmaXJpbmcgZm9yIGdvb2Rcblx0XHRcdGlmICggbG9ja2VkICkge1xuXG5cdFx0XHRcdC8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHNcblx0XHRcdFx0aWYgKCBtZW1vcnkgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgdGhpcyBvYmplY3QgaXMgc3BlbnRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsaXN0ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdFxuXHRcdHNlbGYgPSB7XG5cblx0XHRcdC8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3Rcblx0XHRcdGFkZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblxuXHRcdFx0XHRcdC8vIElmIHdlIGhhdmUgbWVtb3J5IGZyb20gYSBwYXN0IHJ1biwgd2Ugc2hvdWxkIGZpcmUgYWZ0ZXIgYWRkaW5nXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0cXVldWUucHVzaCggbWVtb3J5ICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0KCBmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGlzdC5wdXNoKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIHRvVHlwZSggYXJnICkgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5XG5cdFx0XHRcdFx0XHRcdFx0YWRkKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdH0gKSggYXJndW1lbnRzICk7XG5cblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3Rcblx0XHRcdHJlbW92ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0dmFyIGluZGV4O1xuXHRcdFx0XHRcdHdoaWxlICggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0bGlzdC5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xuXHRcdFx0XHRcdFx0aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHtcblx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LlxuXHRcdFx0Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuXG5cdFx0XHRoYXM6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0cmV0dXJuIGZuID9cblx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDpcblx0XHRcdFx0XHRsaXN0Lmxlbmd0aCA+IDA7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XG5cdFx0XHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlIGFuZCAuYWRkXG5cdFx0XHQvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdC8vIENsZWFyIGFsbCBjYWxsYmFja3MgYW5kIHZhbHVlc1xuXHRcdFx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRkaXNhYmxlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhbGlzdDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmVcblx0XHRcdC8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpXG5cdFx0XHQvLyBBYm9ydCBhbnkgcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHRsb2NrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IG1lbW9yeSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0bG9ja2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhbG9ja2VkO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkge1xuXHRcdFx0XHRpZiAoICFsb2NrZWQgKSB7XG5cdFx0XHRcdFx0YXJncyA9IGFyZ3MgfHwgW107XG5cdFx0XHRcdFx0YXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBhcmdzICk7XG5cdFx0XHRcdFx0aWYgKCAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzXG5cdFx0XHRmaXJlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0c2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlXG5cdFx0XHRmaXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWZpcmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0cmV0dXJuIHNlbGY7XG59O1xuXG5cbmZ1bmN0aW9uIElkZW50aXR5KCB2ICkge1xuXHRyZXR1cm4gdjtcbn1cbmZ1bmN0aW9uIFRocm93ZXIoIGV4ICkge1xuXHR0aHJvdyBleDtcbn1cblxuZnVuY3Rpb24gYWRvcHRWYWx1ZSggdmFsdWUsIHJlc29sdmUsIHJlamVjdCwgbm9WYWx1ZSApIHtcblx0dmFyIG1ldGhvZDtcblxuXHR0cnkge1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIHByb21pc2UgYXNwZWN0IGZpcnN0IHRvIHByaXZpbGVnZSBzeW5jaHJvbm91cyBiZWhhdmlvclxuXHRcdGlmICggdmFsdWUgJiYgaXNGdW5jdGlvbiggKCBtZXRob2QgPSB2YWx1ZS5wcm9taXNlICkgKSApIHtcblx0XHRcdG1ldGhvZC5jYWxsKCB2YWx1ZSApLmRvbmUoIHJlc29sdmUgKS5mYWlsKCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIHRoZW5hYmxlc1xuXHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUsIHJlc29sdmUsIHJlamVjdCApO1xuXG5cdFx0Ly8gT3RoZXIgbm9uLXRoZW5hYmxlc1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIENvbnRyb2wgYHJlc29sdmVgIGFyZ3VtZW50cyBieSBsZXR0aW5nIEFycmF5I3NsaWNlIGNhc3QgYm9vbGVhbiBgbm9WYWx1ZWAgdG8gaW50ZWdlcjpcblx0XHRcdC8vICogZmFsc2U6IFsgdmFsdWUgXS5zbGljZSggMCApID0+IHJlc29sdmUoIHZhbHVlIClcblx0XHRcdC8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpXG5cdFx0XHRyZXNvbHZlLmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXS5zbGljZSggbm9WYWx1ZSApICk7XG5cdFx0fVxuXG5cdC8vIEZvciBQcm9taXNlcy9BKywgY29udmVydCBleGNlcHRpb25zIGludG8gcmVqZWN0aW9uc1xuXHQvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluXG5cdC8vIERlZmVycmVkI3RoZW4gdG8gY29uZGl0aW9uYWxseSBzdXBwcmVzcyByZWplY3Rpb24uXG5cdH0gY2F0Y2ggKCB2YWx1ZSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIG9ubHlcblx0XHQvLyBTdHJpY3QgbW9kZSBmdW5jdGlvbnMgaW52b2tlZCB3aXRob3V0IC5jYWxsLy5hcHBseSBnZXQgZ2xvYmFsLW9iamVjdCBjb250ZXh0XG5cdFx0cmVqZWN0LmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXSApO1xuXHR9XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHREZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7XG5cdFx0dmFyIHR1cGxlcyA9IFtcblxuXHRcdFx0XHQvLyBhY3Rpb24sIGFkZCBsaXN0ZW5lciwgY2FsbGJhY2tzLFxuXHRcdFx0XHQvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdXG5cdFx0XHRcdFsgXCJub3RpZnlcIiwgXCJwcm9ncmVzc1wiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApLCAyIF0sXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgMCwgXCJyZXNvbHZlZFwiIF0sXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCAxLCBcInJlamVjdGVkXCIgXVxuXHRcdFx0XSxcblx0XHRcdHN0YXRlID0gXCJwZW5kaW5nXCIsXG5cdFx0XHRwcm9taXNlID0ge1xuXHRcdFx0XHRzdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0YXRlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRhbHdheXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRcImNhdGNoXCI6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIEtlZXAgcGlwZSBmb3IgYmFjay1jb21wYXRcblx0XHRcdFx0cGlwZTogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkge1xuXHRcdFx0XHRcdHZhciBmbnMgPSBhcmd1bWVudHM7XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbigg
21167aSwgdHVwbGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpXG5cdFx0XHRcdFx0XHRcdHZhciBmbiA9IGlzRnVuY3Rpb24oIGZuc1sgdHVwbGVbIDQgXSBdICkgJiYgZm5zWyB0dXBsZVsgNCBdIF07XG5cblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQucHJvZ3Jlc3MoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIubm90aWZ5IH0pXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLmRvbmUoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIucmVzb2x2ZSB9KVxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KVxuXHRcdFx0XHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDEgXSBdKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQgPSBmbiAmJiBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCAmJiBpc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC5wcm9taXNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50c1xuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdGZucyA9IG51bGw7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBvblByb2dyZXNzICkge1xuXHRcdFx0XHRcdHZhciBtYXhEZXB0aCA9IDA7XG5cdFx0XHRcdFx0ZnVuY3Rpb24gcmVzb2x2ZSggZGVwdGgsIGRlZmVycmVkLCBoYW5kbGVyLCBzcGVjaWFsICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdGhhdCA9IHRoaXMsXG5cdFx0XHRcdFx0XHRcdFx0YXJncyA9IGFyZ3VtZW50cyxcblx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQsIHRoZW47XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy4zXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01OVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoIDwgbWF4RGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjFcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkID09PSBkZWZlcnJlZC5wcm9taXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoIFwiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uXCIgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbnMgMi4zLjMuMSwgMy41XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNzVcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFJldHJpZXZlIGB0aGVuYCBvbmx5IG9uY2Vcblx0XHRcdFx0XHRcdFx0XHRcdHRoZW4gPSByZXR1cm5lZCAmJlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBjaGVjayBvYmplY3RzIGFuZCBmdW5jdGlvbnMgZm9yIHRoZW5hYmlsaXR5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCggdHlwZW9mIHJldHVybmVkID09PSBcIm9iamVjdFwiIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHJldHVybmVkID09PSBcImZ1bmN0aW9uXCIgKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC50aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgYSByZXR1cm5lZCB0aGVuYWJsZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWwgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIFRocm93ZXIsIHNwZWNpYWwgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gTm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGFsc28gaG9vayBpbnRvIHByb2dyZXNzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgZGlzcmVnYXJkIG9sZGVyIHJlc29sdXRpb24gdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWF4RGVwdGgrKztcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoZW4uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtY
21167XhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBhbGwgb3RoZXIgcmV0dXJuZWQgdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgc3Vic3RpdHV0ZSBoYW5kbGVycyBwYXNzIG9uIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhhdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gWyByZXR1cm5lZCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUHJvY2VzcyB0aGUgdmFsdWUocylcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmYXVsdCBwcm9jZXNzIGlzIHJlc29sdmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0KCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBub3JtYWwgcHJvY2Vzc29ycyAocmVzb2x2ZSkgY2F0Y2ggYW5kIHJlamVjdCBleGNlcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcyA9IHNwZWNpYWwgP1xuXHRcdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rKCBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzLnN0YWNrVHJhY2UgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuNC4xXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBJZ25vcmUgcG9zdC1yZXNvbHV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICsgMSA+PSBtYXhEZXB0aCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IFRocm93ZXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIGUgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMVxuXHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01N1xuXHRcdFx0XHRcdFx0XHQvLyBSZS1yZXNvbHZlIHByb21pc2VzIGltbWVkaWF0ZWx5IHRvIGRvZGdlIGZhbHNlIHJlamVjdGlvbiBmcm9tXG5cdFx0XHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgZXJyb3JzXG5cdFx0XHRcdFx0XHRcdGlmICggZGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcygpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ2FsbCBhbiBvcHRpb25hbCBob29rIHRvIHJlY29yZCB0aGUgc3RhY2ssIGluIGNhc2Ugb2YgZXhjZXB0aW9uXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc2luY2UgaXQncyBvdGhlcndpc2UgbG9zdCB3aGVuIGV4ZWN1dGlvbiBnb2VzIGFzeW5jXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZ2V0U3RhY2tIb29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5zdGFja1RyYWNl
vendor: 4,913 bytes, line 21167
21167ID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25Qcm9ncmVzcyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRJZGVudGl0eSxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlci5ub3RpZnlXaXRoXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5hZGQoIC4uLiApXG5cdFx0XHRcdFx0XHR0dXBsZXNbIDEgXVsgMyBdLmFkZChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLFxuXHRcdFx0XHRcdFx0XHRcdGlzRnVuY3Rpb24oIG9uRnVsZmlsbGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25GdWxmaWxsZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAyIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvblJlamVjdGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25SZWplY3RlZCA6XG5cdFx0XHRcdFx0XHRcdFx0XHRUaHJvd2VyXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkXG5cdFx0XHRcdC8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3Rcblx0XHRcdFx0cHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqICE9IG51bGwgPyBqUXVlcnkuZXh0ZW5kKCBvYmosIHByb21pc2UgKSA6IHByb21pc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWZlcnJlZCA9IHt9O1xuXG5cdFx0Ly8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kc1xuXHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHtcblx0XHRcdHZhciBsaXN0ID0gdHVwbGVbIDIgXSxcblx0XHRcdFx0c3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdO1xuXG5cdFx0XHQvLyBwcm9taXNlLnByb2dyZXNzID0gbGlzdC5hZGRcblx0XHRcdC8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmZhaWwgPSBsaXN0LmFkZFxuXHRcdFx0cHJvbWlzZVsgdHVwbGVbIDEgXSBdID0gbGlzdC5hZGQ7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZVxuXHRcdFx0aWYgKCBzdGF0ZVN0cmluZyApIHtcblx0XHRcdFx0bGlzdC5hZGQoXG5cdFx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHRcdC8vIHN0YXRlID0gXCJyZXNvbHZlZFwiIChpLmUuLCBmdWxmaWxsZWQpXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVqZWN0ZWRcIlxuXHRcdFx0XHRcdFx0c3RhdGUgPSBzdGF0ZVN0cmluZztcblx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfY2FsbGJhY2tzLmRpc2FibGVcblx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfY2FsbGJhY2tzLmRpc2FibGVcblx0XHRcdFx0XHR0dXBsZXNbIDMgLSBpIF1bIDIgXS5kaXNhYmxlLFxuXG5cdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZGlzYWJsZVxuXHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAzIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrXG5cdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDIgXS5sb2NrLFxuXG5cdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0ubG9ja1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlXG5cdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0bGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApO1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnkgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQubm90aWZ5V2l0aCguLi4pIH1cblx0XHRcdC8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3QgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVqZWN0V2l0aCguLi4pIH1cblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH07XG5cblx0XHRcdC8vIGRlZmVycmVkLm5vdGlmeVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGhcblx0XHRcdC8vIGRlZmVycmVkLnJlamVjdFdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0gPSBsaXN0LmZpcmVXaXRoO1xuXHRcdH0gKTtcblxuXHRcdC8vIE1ha2UgdGhlIGRlZmVycmVkIGEgcHJvbWlzZVxuXHRcdHByb21pc2UucHJvbWlzZSggZGVmZXJyZWQgKTtcblxuXHRcdC8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnlcblx0XHRpZiAoIGZ1bmMgKSB7XG5cdFx0XHRmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJlZCApO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBkb25lIVxuXHRcdHJldHVybiBkZWZlcnJlZDtcblx0fSxcblxuXHQvLyBEZWZlcnJlZCBoZWxwZXJcblx0d2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkge1xuXHRcdHZhclxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXNcblx0XHRcdHJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cblx0XHRcdC8vIGNvdW50IG9mIHVucHJvY2Vzc2VkIGFyZ3VtZW50c1xuXHRcdFx0aSA9IHJlbWFpbmluZyxcblxuXHRcdFx0Ly8gc3Vib3JkaW5hdGUgZnVsZmlsbG1lbnQgZGF0YVxuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSxcblx0XHRcdHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcblxuXHRcdFx0Ly8gdGhlI
21167G1hc3RlciBEZWZlcnJlZFxuXHRcdFx0bWFzdGVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3Rvcnlcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdG1hc3Rlci5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdC8vIFNpbmdsZS0gYW5kIGVtcHR5IGFyZ3VtZW50cyBhcmUgYWRvcHRlZCBsaWtlIFByb21pc2UucmVzb2x2ZVxuXHRcdGlmICggcmVtYWluaW5nIDw9IDEgKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsXG5cdFx0XHRcdCFyZW1haW5pbmcgKTtcblxuXHRcdFx0Ly8gVXNlIC50aGVuKCkgdG8gdW53cmFwIHNlY29uZGFyeSB0aGVuYWJsZXMgKGNmLiBnaC0zMDAwKVxuXHRcdFx0aWYgKCBtYXN0ZXIuc3RhdGUoKSA9PT0gXCJwZW5kaW5nXCIgfHxcblx0XHRcdFx0aXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG1hc3Rlci50aGVuKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gTXVsdGlwbGUgYXJndW1lbnRzIGFyZSBhZ2dyZWdhdGVkIGxpa2UgUHJvbWlzZS5hbGwgYXJyYXkgZWxlbWVudHNcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hc3Rlci5wcm9taXNlKCk7XG5cdH1cbn0gKTtcblxuXG4vLyBUaGVzZSB1c3VhbGx5IGluZGljYXRlIGEgcHJvZ3JhbW1lciBtaXN0YWtlIGR1cmluZyBkZXZlbG9wbWVudCxcbi8vIHdhcm4gYWJvdXQgdGhlbSBBU0FQIHJhdGhlciB0aGFuIHN3YWxsb3dpbmcgdGhlbSBieSBkZWZhdWx0LlxudmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87XG5cbmpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rID0gZnVuY3Rpb24oIGVycm9yLCBzdGFjayApIHtcblxuXHQvLyBTdXBwb3J0OiBJRSA4IC0gOSBvbmx5XG5cdC8vIENvbnNvbGUgZXhpc3RzIHdoZW4gZGV2IHRvb2xzIGFyZSBvcGVuLCB3aGljaCBjYW4gaGFwcGVuIGF0IGFueSB0aW1lXG5cdGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7XG5cdFx0d2luZG93LmNvbnNvbGUud2FybiggXCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiBcIiArIGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrLCBzdGFjayApO1xuXHR9XG59O1xuXG5cblxuXG5qUXVlcnkucmVhZHlFeGNlcHRpb24gPSBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHR0aHJvdyBlcnJvcjtcblx0fSApO1xufTtcblxuXG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cbmpRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHtcblxuXHRyZWFkeUxpc3Rcblx0XHQudGhlbiggZm4gKVxuXG5cdFx0Ly8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXBcblx0XHQvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2tcblx0XHQvLyByZWdpc3RyYXRpb24uXG5cdFx0LmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlFeGNlcHRpb24oIGVycm9yICk7XG5cdFx0fSApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODFcblx0cmVhZHlXYWl0OiAxLFxuXG5cdC8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHlcblx0cmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkge1xuXG5cdFx0Ly8gQWJvcnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaG9sZHMgb3Igd2UncmUgYWxyZWFkeSByZWFkeVxuXHRcdGlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeVxuXHRcdGpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTtcblxuXHRcdC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBmaXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlXG5cdFx0aWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZVxuXHRcdHJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkucmVhZHkudGhlbiA9IHJlYWR5TGlzdC50aGVuO1xuXG4vLyBUaGUgcmVhZHkgZXZlbnQgaGFuZGxlciBhbmQgc2VsZiBjbGVhbnVwIG1ldGhvZFxuZnVuY3Rpb24gY29tcGxldGVkKCkge1xuXHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG5cdGpRdWVyeS5yZWFkeSgpO1xufVxuXG4vLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZFxuLy8gYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQuXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMCBvbmx5XG4vLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyBcImludGVyYWN0aXZlXCIgdG9vIHNvb25cbmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiIHx8XG5cdCggZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gXCJsb2FkaW5nXCIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkge1xuXG5cdC8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeVxuXHR3aW5kb3cuc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5ICk7XG5cbn0gZWxzZSB7XG5cblx0Ly8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFja1xuXHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cblx0Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwibG9h
21167ZFwiLCBjb21wbGV0ZWQgKTtcbn1cblxuXG5cblxuLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uXG4vLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb25cbnZhciBhY2Nlc3MgPSBmdW5jdGlvbiggZWxlbXMsIGZuLCBrZXksIHZhbHVlLCBjaGFpbmFibGUsIGVtcHR5R2V0LCByYXcgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSBlbGVtcy5sZW5ndGgsXG5cdFx0YnVsayA9IGtleSA9PSBudWxsO1xuXG5cdC8vIFNldHMgbWFueSB2YWx1ZXNcblx0aWYgKCB0b1R5cGUoIGtleSApID09PSBcIm9iamVjdFwiICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cdFx0Zm9yICggaSBpbiBrZXkgKSB7XG5cdFx0XHRhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTtcblx0XHR9XG5cblx0Ly8gU2V0cyBvbmUgdmFsdWVcblx0fSBlbHNlIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXG5cdFx0aWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJhdyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBidWxrICkge1xuXG5cdFx0XHQvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWluc3QgdGhlIGVudGlyZSBzZXRcblx0XHRcdGlmICggcmF3ICkge1xuXHRcdFx0XHRmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTtcblx0XHRcdFx0Zm4gPSBudWxsO1xuXG5cdFx0XHQvLyAuLi5leGNlcHQgd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gdmFsdWVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWxrID0gZm47XG5cdFx0XHRcdGZuID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRmbihcblx0XHRcdFx0XHRlbGVtc1sgaSBdLCBrZXksIHJhdyA/XG5cdFx0XHRcdFx0dmFsdWUgOlxuXHRcdFx0XHRcdHZhbHVlLmNhbGwoIGVsZW1zWyBpIF0sIGksIGZuKCBlbGVtc1sgaSBdLCBrZXkgKSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBjaGFpbmFibGUgKSB7XG5cdFx0cmV0dXJuIGVsZW1zO1xuXHR9XG5cblx0Ly8gR2V0c1xuXHRpZiAoIGJ1bGsgKSB7XG5cdFx0cmV0dXJuIGZuLmNhbGwoIGVsZW1zICk7XG5cdH1cblxuXHRyZXR1cm4gbGVuID8gZm4oIGVsZW1zWyAwIF0sIGtleSApIDogZW1wdHlHZXQ7XG59O1xuXG5cbi8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xudmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sXG5cdHJkYXNoQWxwaGEgPSAvLShbYS16XSkvZztcblxuLy8gVXNlZCBieSBjYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5mdW5jdGlvbiBmY2FtZWxDYXNlKCBhbGwsIGxldHRlciApIHtcblx0cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xufVxuXG4vLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSwgRWRnZSAxMiAtIDE1XG4vLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpXG5mdW5jdGlvbiBjYW1lbENhc2UoIHN0cmluZyApIHtcblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsIFwibXMtXCIgKS5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7XG59XG52YXIgYWNjZXB0RGF0YSA9IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHQvLyBBY2NlcHRzIG9ubHk6XG5cdC8vICAtIE5vZGVcblx0Ly8gICAgLSBOb2RlLkVMRU1FTlRfTk9ERVxuXHQvLyAgICAtIE5vZGUuRE9DVU1FTlRfTk9ERVxuXHQvLyAgLSBPYmplY3Rcblx0Ly8gICAgLSBBbnlcblx0cmV0dXJuIG93bmVyLm5vZGVUeXBlID09PSAxIHx8IG93bmVyLm5vZGVUeXBlID09PSA5IHx8ICEoICtvd25lci5ub2RlVHlwZSApO1xufTtcblxuXG5cblxuZnVuY3Rpb24gRGF0YSgpIHtcblx0dGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrO1xufVxuXG5EYXRhLnVpZCA9IDE7XG5cbkRhdGEucHJvdG90eXBlID0ge1xuXG5cdGNhY2hlOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cblx0XHQvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGVcblx0XHR2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHQvLyBJZiBub3QsIGNyZWF0ZSBvbmVcblx0XHRpZiAoICF2YWx1ZSApIHtcblx0XHRcdHZhbHVlID0ge307XG5cblx0XHRcdC8vIFdlIGNhbiBhY2NlcHQgZGF0YSBmb3Igbm9uLWVsZW1lbnQgbm9kZXMgaW4gbW9kZXJuIGJyb3dzZXJzLFxuXHRcdFx0Ly8gYnV0IHdlIHNob3VsZCBub3QsIHNlZSAjODMzNS5cblx0XHRcdC8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LlxuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBvd25lciApICkge1xuXG5cdFx0XHRcdC8vIElmIGl0IGlzIGEgbm9kZSB1bmxpa2VseSB0byBiZSBzdHJpbmdpZnktZWQgb3IgbG9vcGVkIG92ZXJcblx0XHRcdFx0Ly8gdXNlIHBsYWluIGFzc2lnbm1lbnRcblx0XHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB2YWx1ZTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2Ugc2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHlcblx0XHRcdFx0Ly8gY29uZmlndXJhYmxlIG11c3QgYmUgdHJ1ZSB0byBhbGxvdyB0aGUgcHJvcGVydHkgdG8gYmVcblx0XHRcdFx0Ly8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggb3duZXIsIHRoaXMuZXhwYW5kbywge1xuXHRcdFx0XHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7XG5cdFx0dmFyIHByb3AsXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGUoIG93bmVyICk7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUg
21167XSBhcmdzXG5cdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBkYXRhICkgXSA9IHZhbHVlO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3Ncblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBwcm9wICkgXSA9IGRhdGFbIHByb3AgXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlO1xuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzLmNhY2hlKCBvd25lciApIDpcblxuXHRcdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdICYmIG93bmVyWyB0aGlzLmV4cGFuZG8gXVsgY2FtZWxDYXNlKCBrZXkgKSBdO1xuXHR9LFxuXHRhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHtcblxuXHRcdC8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gTm8ga2V5IHdhcyBzcGVjaWZpZWRcblx0XHQvLyAgIDIuIEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFsdWUgcHJvdmlkZWRcblx0XHQvL1xuXHRcdC8vIFRha2UgdGhlIFwicmVhZFwiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZVxuXHRcdC8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3Rcblx0XHQvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5XG5cdFx0Ly9cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdCggKCBrZXkgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiApICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2hlbiB0aGUga2V5IGlzIG5vdCBhIHN0cmluZywgb3IgYm90aCBhIGtleSBhbmQgdmFsdWVcblx0XHQvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gQW4gb2JqZWN0IG9mIHByb3BlcnRpZXNcblx0XHQvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vXG5cdFx0dGhpcy5zZXQoIG93bmVyLCBrZXksIHZhbHVlICk7XG5cblx0XHQvLyBTaW5jZSB0aGUgXCJzZXRcIiBwYXRoIGNhbiBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHNcblx0XHQvLyByZXR1cm4gdGhlIGV4cGVjdGVkIGRhdGEgYmFzZWQgb24gd2hpY2ggcGF0aCB3YXMgdGFrZW5bKl1cblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5O1xuXHR9LFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHZhciBpLFxuXHRcdFx0Y2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHRpZiAoIGNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydCBhcnJheSBvciBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGtleXNcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHNldCBjYW1lbENhc2Uga2V5cywgc28gcmVtb3ZlIHRoYXQuXG5cdFx0XHRcdGtleSA9IGtleS5tYXAoIGNhbWVsQ2FzZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0a2V5ID0gY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0XHQvLyBJZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlXG5cdFx0XHRcdGtleSA9IGtleSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0WyBrZXkgXSA6XG5cdFx0XHRcdFx0KCBrZXkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpID0ga2V5Lmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgdGhlcmUncyBubyBtb3JlIGRhdGFcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1XG5cdFx0XHQvLyBXZWJraXQgJiBCbGluayBwZXJmb3JtYW5jZSBzdWZmZXJzIHdoZW4gZGVsZXRpbmcgcHJvcGVydGllc1xuXHRcdFx0Ly8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZFxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzc4NjA3IChidWcgcmVzdHJpY3RlZClcblx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRoYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0dmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdHJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTtcblx0fVxufTtcbnZhciBkYXRhUHJpdiA9IG5ldyBEYXRhKCk7XG5cbnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7XG5cblxuXG4vL1x0SW1wbGVtZW50YXRpb24gU3VtbWFyeVxuLy9cbi8vXHQxLiBFbmZvcmNlIEFQSSBzdXJmYWNlIGFuZCBzZW1hbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggMS45LnggYnJhbmNoXG4vL1x0Mi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlXG4vL1x0XHRwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20uXG4vL1x0My4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBcInByaXZhdGVcIiBhbmQgXCJ1c2VyXCIgZGF0YS5cbi8vXHQ0LiBfTmV2ZXJfIGV4cG9zZSBcInByaXZhdGVcIiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpXG4vL1x0NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvb
21167iB1c2VyIG9iamVjdHMgKGVnLiBleHBhbmRvIHByb3BlcnRpZXMpXG4vL1x0Ni4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0XG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvW0EtWl0vZztcblxuZnVuY3Rpb24gZ2V0RGF0YSggZGF0YSApIHtcblx0aWYgKCBkYXRhID09PSBcInRydWVcIiApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJmYWxzZVwiICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJudWxsXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xuXHRpZiAoIGRhdGEgPT09ICtkYXRhICsgXCJcIiApIHtcblx0XHRyZXR1cm4gK2RhdGE7XG5cdH1cblxuXHRpZiAoIHJicmFjZS50ZXN0KCBkYXRhICkgKSB7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKTtcblx0fVxuXG5cdHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXHR2YXIgbmFtZTtcblxuXHQvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55XG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxuXHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJCZcIiApLnRvTG93ZXJDYXNlKCk7XG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGdldERhdGEoIGRhdGEgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRkYXRhVXNlci5zZXQoIGVsZW0sIGtleSwgZGF0YSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTtcblx0fSxcblxuXHRkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVVzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH0sXG5cblx0Ly8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWRcblx0Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YVByaXYgbWV0aG9kcywgdGhlc2UgY2FuIGJlIGRlcHJlY2F0ZWQuXG5cdF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGRhdGEsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0YXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlcztcblxuXHRcdC8vIEdldHMgYWxsIHZhbHVlc1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHRoaXMubGVuZ3RoICkge1xuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhUHJpdi5nZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIgKSApIHtcblx0XHRcdFx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NClcblx0XHRcdFx0XHRcdGlmICggYXR0cnNbIGkgXSApIHtcblx0XHRcdFx0XHRcdFx0bmFtZSA9IGF0dHJzWyBpIF0ubmFtZTtcblx0XHRcdFx0XHRcdFx0aWYgKCBuYW1lLmluZGV4T2YoIFwiZGF0YS1cIiApID09PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdG5hbWUgPSBjYW1lbENhc2UoIG5hbWUuc2xpY2UoIDUgKSApO1xuXHRcdFx0XHRcdFx0XHRcdGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHQvLyBTZXRzIG11bHRpcGxlIHZhbHVlc1xuXHRcdGlmICggdHlwZW9mIGtleSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBkYXRhO1xuXG5cdFx0XHQvLyBUaGUgY2FsbGluZyBqUXVlcnkgb2JqZWN0IChlbGVtZW50IG1hdGNoZXMpIGlzIG5vdCBlbXB0eVxuXHRcdFx0Ly8gKGFuZCB0aGVyZWZvcmUgaGFzIGFuIGVsZW1lbnQgYXBwZWFycyBhdCB0aGlzWyAwIF0pIGFuZCB0aGVcblx0XHRcdC8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0XG5cdFx0XHQvLyB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBmb3IgZWxlbSA9IHRoaXNbIDAgXSB3aGljaCB3aWxsXG5cdFx0XHQvLyB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gYXR0ZW1wdCB0byByZWFkIGEgZGF0YSBjYWNoZSBpcyBtYWRlLlxuXHRcdFx0aWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZVxuXHRcdFx0XHQvLyBUaGUga2V5IHdpbGwgYWx3YXlzIGJlIGNhbWVsQ2FzZWQgaW4gRGF0YVxuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtLCBrZXkgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIFwiZGlzY292ZXJcIiB0aGUgZGF0YSBpblxuXHRcdFx0XHQvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzXG5cdFx0XHRcdGRhdGEgPSBkYXRhQXR0ciggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybi
21167BkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LlxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB0aGUgZGF0YS4uLlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5XG5cdFx0XHRcdGRhdGFVc2VyLnNldCggdGhpcywga2V5LCB2YWx1ZSApO1xuXHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBxdWV1ZTtcblxuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHR5cGUgPSAoIHR5cGUgfHwgXCJmeFwiICkgKyBcInF1ZXVlXCI7XG5cdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHQvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwXG5cdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IEFycmF5LmlzQXJyYXkoIGRhdGEgKSApIHtcblx0XHRcdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cXVldWUucHVzaCggZGF0YSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcXVldWUgfHwgW107XG5cdFx0fVxuXHR9LFxuXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLFxuXHRcdFx0c3RhcnRMZW5ndGggPSBxdWV1ZS5sZW5ndGgsXG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCksXG5cdFx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgdHlwZSApLFxuXHRcdFx0bmV4dCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApO1xuXHRcdFx0fTtcblxuXHRcdC8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWxcblx0XHRpZiAoIGZuID09PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdHN0YXJ0TGVuZ3RoLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblxuXHRcdFx0Ly8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZ1xuXHRcdFx0Ly8gYXV0b21hdGljYWxseSBkZXF1ZXVlZFxuXHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgKSB7XG5cdFx0XHRcdHF1ZXVlLnVuc2hpZnQoIFwiaW5wcm9ncmVzc1wiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb25cblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0Zm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTtcblx0XHR9XG5cblx0XHRpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmVcblx0X3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHZhciBrZXkgPSB0eXBlICsgXCJxdWV1ZUhvb2tzXCI7XG5cdFx0cmV0dXJuIGRhdGFQcml2LmdldCggZWxlbSwga2V5ICkgfHwgZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBrZXksIHtcblx0XHRcdGVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKS5hZGQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArIFwicXVldWVcIiwga2V5IF0gKTtcblx0XHRcdH0gKVxuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgc2V0dGVyID0gMjtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRkYXRhID0gdHlwZTtcblx0XHRcdHR5cGUgPSBcImZ4XCI7XG5cdFx0XHRzZXR0ZXItLTtcblx0XHR9XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnF1ZXVlKCB0aGlzWyAwIF0sIHR5cGUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdHRoaXMgOlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBkYXRhICk7XG5cblx0XHRcdFx0Ly8gRW5zdXJlIGEgaG9va3MgZm9yIHRoaXMgcXVldWVcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7XG5cblx0XHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgJiYgcXVldWVbIDAgXSAhPT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHR9LFxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0fSApO1xuXHR9LFxuXHRjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdH0sXG5cblx0Ly8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZVxuXHQvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdClcblx0cHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHtcblx0XHR2YXIgdG1wLFxuXHRcdFx0Y291bnQgPSAxLFxuXHRcdFx0ZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGVsZW1lbnRzID0gdGhpcyxcblx0XHRcdGkgPSB0aGlzLmxlbmd0aCxcblx0XHRcdHJlc29sdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhKCAtLWNvdW50ICkgKSB7XG5cdFx0XHRcdFx0ZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRvYmogPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0bXAgPSBkYXRhUHJpdi5nZXQoIGVsZW1lbnRzWyBpIF0sIHR5cGUgKyBcInF1ZXVlSG9va3NcIiApO1xuXHRcdFx0aWYgKCB0bXAgJiYgdG1wLmVtcHR5ICkge1xuXHRcdFx0XHRjb3VudCsrO1xuXHRcdFx0XHR0bXAuZW1wdHkuYWRkKCByZXNvbHZlICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlc29sdmUoKTtcblx0XHRyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7XG5cdH1cbn0gKTtcbnZhciBwbnVtID0gKCAvWystXT8oPzpcXGQqXFwufClcXGQrKD86W2VFXVsrLV0/XFxkK3wpLyApLnNvdXJjZTtcblxudmFyIHJjc3NOdW0gPSBuZXcgUmVnRXhwKCBcIl4oPzooWystXSk9fCkoXCIgKyBwbnVtICsgXCIpKFthLXolXSopJFwiLCBcImlcIiApO1xuXG5cbnZhciBjc3NFeHBhbmQgPSBbIFwiVG9wXCIsIFwiUmlnaHRcIiwgXCJCb3R0b21cIiwgXCJMZWZ0XCIgXTtcblxudmFyIGlzSGlkZGVuV2l0aGluVHJlZSA9IGZ1bmN0aW9uKCBlbGVtLCBlbCApIHtcblxuXHRcdC8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uO1xuXHRcdC8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudFxuXHRcdGVsZW0gPSBlbCB8fCBlbGVtO1xuXG5cdFx0Ly8gSW5saW5lIHN0eWxlIHRydW1wcyBhbGxcblx0XHRyZXR1cm4gZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiB8fFxuXHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmXG5cblx0XHRcdC8vIE90aGVyd2lzZSwgY2hlY2sgY29tcHV0ZWQgc3R5bGVcblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1XG5cdFx0XHQvLyBEaXNjb25uZWN0ZWQgZWxlbWVudHMgY2FuIGhhdmUgY29tcHV0ZWQgZGlzcGxheTogbm9uZSwgc28gZmlyc3QgY29uZmlybSB0aGF0IGVsZW0gaXNcblx0XHRcdC8vIGluIHRoZSBkb2N1bWVudC5cblx0XHRcdGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgJiZcblxuXHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSA9PT0gXCJub25lXCI7XG5cdH07XG5cbnZhciBzd2FwID0gZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrLCBhcmdzICkge1xuXHR2YXIgcmV0LCBuYW1lLFxuXHRcdG9sZCA9IHt9O1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0b2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF0
211677XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdO1xuXHR9XG5cblx0cmV0ID0gY2FsbGJhY2suYXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10gKTtcblxuXHQvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn07XG5cblxuXG5cbmZ1bmN0aW9uIGFkanVzdENTUyggZWxlbSwgcHJvcCwgdmFsdWVQYXJ0cywgdHdlZW4gKSB7XG5cdHZhciBhZGp1c3RlZCwgc2NhbGUsXG5cdFx0bWF4SXRlcmF0aW9ucyA9IDIwLFxuXHRcdGN1cnJlbnRWYWx1ZSA9IHR3ZWVuID9cblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uY3VyKCk7XG5cdFx0XHR9IDpcblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5LmNzcyggZWxlbSwgcHJvcCwgXCJcIiApO1xuXHRcdFx0fSxcblx0XHRpbml0aWFsID0gY3VycmVudFZhbHVlKCksXG5cdFx0dW5pdCA9IHZhbHVlUGFydHMgJiYgdmFsdWVQYXJ0c1sgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApLFxuXG5cdFx0Ly8gU3RhcnRpbmcgdmFsdWUgY29tcHV0YXRpb24gaXMgcmVxdWlyZWQgZm9yIHBvdGVudGlhbCB1bml0IG1pc21hdGNoZXNcblx0XHRpbml0aWFsSW5Vbml0ID0gKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gfHwgdW5pdCAhPT0gXCJweFwiICYmICtpbml0aWFsICkgJiZcblx0XHRcdHJjc3NOdW0uZXhlYyggalF1ZXJ5LmNzcyggZWxlbSwgcHJvcCApICk7XG5cblx0aWYgKCBpbml0aWFsSW5Vbml0ICYmIGluaXRpYWxJblVuaXRbIDMgXSAhPT0gdW5pdCApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD01NFxuXHRcdC8vIEhhbHZlIHRoZSBpdGVyYXRpb24gdGFyZ2V0IHZhbHVlIHRvIHByZXZlbnQgaW50ZXJmZXJlbmNlIGZyb20gQ1NTIHVwcGVyIGJvdW5kcyAoZ2gtMjE0NClcblx0XHRpbml0aWFsID0gaW5pdGlhbCAvIDI7XG5cblx0XHQvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzXG5cdFx0dW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdO1xuXG5cdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWwgfHwgMTtcblxuXHRcdHdoaWxlICggbWF4SXRlcmF0aW9ucy0tICkge1xuXG5cdFx0XHQvLyBFdmFsdWF0ZSBhbmQgdXBkYXRlIG91ciBiZXN0IGd1ZXNzIChkb3VibGluZyBndWVzc2VzIHRoYXQgemVybyBvdXQpLlxuXHRcdFx0Ly8gRmluaXNoIGlmIHRoZSBzY2FsZSBlcXVhbHMgb3IgY3Jvc3NlcyAxIChtYWtpbmcgdGhlIG9sZCpuZXcgcHJvZHVjdCBub24tcG9zaXRpdmUpLlxuXHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXHRcdFx0aWYgKCAoIDEgLSBzY2FsZSApICogKCAxIC0gKCBzY2FsZSA9IGN1cnJlbnRWYWx1ZSgpIC8gaW5pdGlhbCB8fCAwLjUgKSApIDw9IDAgKSB7XG5cdFx0XHRcdG1heEl0ZXJhdGlvbnMgPSAwO1xuXHRcdFx0fVxuXHRcdFx0aW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgLyBzY2FsZTtcblxuXHRcdH1cblxuXHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0ICogMjtcblx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSB0d2VlbiBwcm9wZXJ0aWVzIGxhdGVyIG9uXG5cdFx0dmFsdWVQYXJ0cyA9IHZhbHVlUGFydHMgfHwgW107XG5cdH1cblxuXHRpZiAoIHZhbHVlUGFydHMgKSB7XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsSW5Vbml0IHx8ICtpbml0aWFsIHx8IDA7XG5cblx0XHQvLyBBcHBseSByZWxhdGl2ZSBvZmZzZXQgKCs9Ly09KSBpZiBzcGVjaWZpZWRcblx0XHRhZGp1c3RlZCA9IHZhbHVlUGFydHNbIDEgXSA/XG5cdFx0XHRpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOlxuXHRcdFx0K3ZhbHVlUGFydHNbIDIgXTtcblx0XHRpZiAoIHR3ZWVuICkge1xuXHRcdFx0dHdlZW4udW5pdCA9IHVuaXQ7XG5cdFx0XHR0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7XG5cdFx0XHR0d2Vlbi5lbmQgPSBhZGp1c3RlZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFkanVzdGVkO1xufVxuXG5cbnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApIHtcblx0dmFyIHRlbXAsXG5cdFx0ZG9jID0gZWxlbS5vd25lckRvY3VtZW50LFxuXHRcdG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSxcblx0XHRkaXNwbGF5ID0gZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF07XG5cblx0aWYgKCBkaXNwbGF5ICkge1xuXHRcdHJldHVybiBkaXNwbGF5O1xuXHR9XG5cblx0dGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApO1xuXHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggdGVtcCwgXCJkaXNwbGF5XCIgKTtcblxuXHR0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRlbXAgKTtcblxuXHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdGRpc3BsYXkgPSBcImJsb2NrXCI7XG5cdH1cblx0ZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5O1xuXG5cdHJldHVybiBkaXNwbGF5O1xufVxuXG5mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7XG5cdHZhciBkaXNwbGF5LCBlbGVtLFxuXHRcdHZhbHVlcyA9IFtdLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cblx0Ly8gRGV0ZXJtaW5lIG5ldyBkaXNwbGF5IHZhbHVlIGZvciBlbGVtZW50cyB0aGF0IG5lZWQgdG8gY2hhbmdlXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5O1xuXHRcdGlmICggc2hvdyApIHtcblxuXHRcdFx0Ly8gU2luY2Ugd2UgZm9yY2UgdmlzaWJpbGl0eSB1cG9uIGNhc2NhZGUtaGlkZGVuIGVsZW1lbnRzLCBhbiBpbW1lZGlhdGUgKGFuZCBzbG93KVxuXHRcdFx0Ly8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyXG5cdFx0XHQvLyBpbmxpbmUgb3IgYWJvdXQtdG8tYmUtcmVzdG9yZWQpXG5cdFx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4I
21167F0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZGlzcGxheVwiICkgfHwgbnVsbDtcblx0XHRcdFx0aWYgKCAhdmFsdWVzWyBpbmRleCBdICkge1xuXHRcdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICggZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIGRpc3BsYXkgIT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBcIm5vbmVcIjtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB3aGF0IHdlJ3JlIG92ZXJ3cml0aW5nXG5cdFx0XHRcdGRhdGFQcml2LnNldCggZWxlbSwgXCJkaXNwbGF5XCIsIGRpc3BsYXkgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AgdG8gYXZvaWQgY29uc3RhbnQgcmVmbG93XG5cdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCB2YWx1ZXNbIGluZGV4IF0gIT0gbnVsbCApIHtcblx0XHRcdGVsZW1lbnRzWyBpbmRleCBdLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZXNbIGluZGV4IF07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRzO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApO1xuXHR9LFxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTtcblx0fSxcblx0dG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNIaWRkZW5XaXRoaW5UcmVlKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcbnZhciByY2hlY2thYmxlVHlwZSA9ICggL14oPzpjaGVja2JveHxyYWRpbykkL2kgKTtcblxudmFyIHJ0YWdOYW1lID0gKCAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSspL2kgKTtcblxudmFyIHJzY3JpcHRUeXBlID0gKCAvXiR8Xm1vZHVsZSR8XFwvKD86amF2YXxlY21hKXNjcmlwdC9pICk7XG5cblxuXG4vLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0b3B0aW9uOiBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF0sXG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cblxuZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpXG5cdHZhciByZXQ7XG5cblx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRyZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8IFwiKlwiICk7XG5cblx0fSBlbHNlIHtcblx0XHRyZXQgPSBbXTtcblx0fVxuXG5cdGlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufVxuXG5cbi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZFxuZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVsZW1lbnRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZGF0YVByaXYuc2V0KFxuXHRcdFx0ZWxlbXNbIGkgXSxcblx0XHRcdFwiZ2xvYmFsRXZhbFwiLFxuXHRcdFx0IXJlZkVsZW1lbnRzIHx8IGRhdGFQcml2LmdldCggcmVmRWxlbWVudHNbIGkgXSwgXCJnbG9iYWxFdmFsXCIgKVxuXHRcdCk7XG5cdH1cbn1cblxuXG52YXIgcmh0bWwgPSAvPHwmIz9cXHcrOy87XG5cbmZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24sIGlnbm9yZWQgKSB7XG5cdHZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosXG5cdFx0ZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRub2RlcyA9IFtdLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGVsZW0gPSBlbGVtc1sgaSBdO1xuXG5cdFx0aWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7XG5cblx0XHRcdC8vIEFkZCBub2RlcyBkaXJlY3RseVxuXHRcdFx0aWYgKCB0b1R5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZVxuXHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0dGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O
211671xuXHRcdFx0XHR0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgalF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIGVsZW0gKSArIHdyYXBbIDIgXTtcblxuXHRcdFx0XHQvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8gdGhlIHJpZ2h0IGNvbnRlbnRcblx0XHRcdFx0aiA9IHdyYXBbIDAgXTtcblx0XHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdFx0dG1wID0gdG1wLmxhc3RDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXJcblx0XHRcdFx0dG1wID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHQvLyBFbnN1cmUgdGhlIGNyZWF0ZWQgbm9kZXMgYXJlIG9ycGhhbmVkICgjMTIzOTIpXG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRmcmFnbWVudC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0aSA9IDA7XG5cdHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7XG5cblx0XHQvLyBTa2lwIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgY29sbGVjdGlvbiAodHJhYy00MDg3KVxuXHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSA+IC0xICkge1xuXHRcdFx0aWYgKCBpZ25vcmVkICkge1xuXHRcdFx0XHRpZ25vcmVkLnB1c2goIGVsZW0gKTtcblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnRhaW5zID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdHRtcCA9IGdldEFsbCggZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgXCJzY3JpcHRcIiApO1xuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGlmICggY29udGFpbnMgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCB0bXAgKTtcblx0XHR9XG5cblx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0aWYgKCBzY3JpcHRzICkge1xuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHtcblx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdHNjcmlwdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZyYWdtZW50O1xufVxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICksXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5XG5cdC8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwicmFkaW9cIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcInRcIiApO1xuXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIG9ubHlcblx0Ly8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzXG5cdHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1ZSBpcyBwcm9wZXJseSBjbG9uZWRcblx0ZGl2LmlubmVySFRNTCA9IFwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiO1xuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTtcbn0gKSgpO1xudmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXG5cbnZhclxuXHRya2V5RXZlbnQgPSAvXmtleS8sXG5cdHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxwb2ludGVyfGNvbn
21167RleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLFxuXHRydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/OlxcLiguKyl8KS87XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvXG5mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblx0fSBjYXRjaCAoIGVyciApIHsgfVxufVxuXG5mdW5jdGlvbiBvbiggZWxlbSwgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgb25lICkge1xuXHR2YXIgb3JpZ0ZuLCB0eXBlO1xuXG5cdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xuXHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBkYXRhIClcblx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRvbiggZWxlbSwgdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XG5cblx0XHQvLyAoIHR5cGVzLCBmbiApXG5cdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vICggdHlwZXMsIGRhdGEsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHR9IGVsc2UgaWYgKCAhZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIG9uZSA9PT0gMSApIHtcblx0XHRvcmlnRm4gPSBmbjtcblx0XHRmbiA9IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXG5cdFx0XHRqUXVlcnkoKS5vZmYoIGV2ZW50ICk7XG5cdFx0XHRyZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9O1xuXG5cdFx0Ly8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm5cblx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcblx0fVxuXHRyZXR1cm4gZWxlbS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XG5cdH0gKTtcbn1cblxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS5cbiAqIFByb3BzIHRvIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFyeSBmb3IgbWFueSBvZiB0aGUgaWRlYXMuXG4gKi9cbmpRdWVyeS5ldmVudCA9IHtcblxuXHRnbG9iYWw6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhLCBzZWxlY3RvciApIHtcblxuXHRcdHZhciBoYW5kbGVPYmpJbiwgZXZlbnRIYW5kbGUsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdC8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpXG5cdFx0aWYgKCAhZWxlbURhdGEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XG5cdFx0XHRoYW5kbGVPYmpJbiA9IGhhbmRsZXI7XG5cdFx0XHRoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjtcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZVxuXHRcdC8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KVxuXHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGRvY3VtZW50RWxlbWVudCwgc2VsZWN0b3IgKTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0ZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0ge307XG5cdFx0fVxuXHRcdGlmICggISggZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx
211675IGhhbmRsZXJzXG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cblx0XHRcdC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVyc1xuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKVxuXHRcdFx0fSwgaGFuZGxlT2JqSW4gKTtcblxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3Rcblx0XHRcdGlmICggISggaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSApICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZF
21167R5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdGlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdO1xuXHRcdFx0dG1wID0gdG1wWyAyIF0gJiZcblx0XHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fFxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fFxuXHRcdFx0XHRcdHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSBldmVudHNbIHR5cGUgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgZGF0YSBhbmQgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZFxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImhhbmRsZSBldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkge1xuXG5cdFx0Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0XG5cdFx0dmFyIGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggbmF0aXZlRXZlbnQgKTtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaiwgaGFuZGxlclF1ZXVlLFxuXHRcdFx0YXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLFxuXHRcdFx0aGFuZGxlcnMgPSAoIGRhdGFQcml2LmdldCggdGhpcywgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9O1xuXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcblx0XHRhcmdzWyAwIF0gPSBldmVudDtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0YXJnc1sgaSBdID0gYXJndW1lbnRzWyBpIF07XG5cdFx0fVxuXG5cdFx0ZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzO1xuXG5cdFx0Ly8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZFxuXHRcdGlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJi
21167BzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBoYW5kbGVyc1xuXHRcdGhhbmRsZXJRdWV1ZSA9IGpRdWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTtcblxuXHRcdC8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtO1xuXG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBoYW5kbGVPYmogPSBtYXRjaGVkLmhhbmRsZXJzWyBqKysgXSApICYmXG5cdFx0XHRcdCFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRcdC8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2Uocylcblx0XHRcdFx0Ly8gYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhvc2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuXG5cdFx0XHRcdGlmICggIWV2ZW50LnJuYW1lc3BhY2UgfHwgZXZlbnQucm5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XG5cblx0XHRcdFx0XHRldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7XG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xuXG5cdFx0XHRcdFx0cmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fFxuXHRcdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIgKS5hcHBseSggbWF0Y2hlZC5lbGVtLCBhcmdzICk7XG5cblx0XHRcdFx0XHRpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZVxuXHRcdGlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7XG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0aGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7XG5cdFx0dmFyIGksIGhhbmRsZU9iaiwgc2VsLCBtYXRjaGVkSGFuZGxlcnMsIG1hdGNoZWRTZWxlY3RvcnMsXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVyc1xuXHRcdGlmICggZGVsZWdhdGVDb3VudCAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTlcblx0XHRcdC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICh0cmFjLTEzMTgwKVxuXHRcdFx0Y3VyLm5vZGVUeXBlICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MlxuXHRcdFx0Ly8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKVxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnQtdHlwZS1jbGlja1xuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTEgb25seVxuXHRcdFx0Ly8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgXCJjbGlja3NcIiBvZiByYWRpbyBpbnB1dHMsIHdoaWNoIGNhbiBoYXZlIGBidXR0b25gIC0xIChnaC0yMzQzKVxuXHRcdFx0ISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGV2ZW50LmJ1dHRvbiA+PSAxICkgKSB7XG5cblx0XHRcdGZvciAoIDsgY3VyICE9PSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KVxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NClcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPT09IDEgJiYgISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGN1ci5kaXNhYmxlZCA9PT0gdHJ1ZSApICkge1xuXHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycyA9IFtdO1xuXHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnMgPSB7fTtcblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHtcblx0XHRcdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyBcIiBcIjtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgP1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID4gLTEgOlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggbWF0Y2hlZEhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IGN1ciwgaGFuZGxlcnM6IG1hdGNoZWRIYW5kbGVycyB9ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVyc1xuXHRcdGN1ciA9IHRoaXM7XG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhhbmRsZXJRdWV1ZTtcblx0fSxcblxuXHRhZGRQcm9wOiBmdW5jdGlvbiggbmFtZSwgaG9vayApIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIGpRdWVyeS5FdmVudC5wcm90b3R5cGUsIG5hbW
21167UsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cblx0XHRcdGdldDogaXNGdW5jdGlvbiggaG9vayApID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gOlxuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwge1xuXHRcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGZpeDogZnVuY3Rpb24oIG9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0cmV0dXJuIG9yaWdpbmFsRXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gP1xuXHRcdFx0b3JpZ2luYWxFdmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7XG5cdH0sXG5cblx0c3BlY2lhbDoge1xuXHRcdGxvYWQ6IHtcblxuXHRcdFx0Ly8gUHJldmVudCB0cmlnZ2VyZWQgaW1hZ2UubG9hZCBldmVudHMgZnJvbSBidWJibGluZyB0byB3aW5kb3cubG9hZFxuXHRcdFx0bm9CdWJibGU6IHRydWVcblx0XHR9LFxuXHRcdGZvY3VzOiB7XG5cblx0XHRcdC8vIEZpcmUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyAhPT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmZvY3VzICkge1xuXHRcdFx0XHRcdHRoaXMuZm9jdXMoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNpblwiXG5cdFx0fSxcblx0XHRibHVyOiB7XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuYmx1ciApIHtcblx0XHRcdFx0XHR0aGlzLmJsdXIoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNvdXRcIlxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblxuXHRcdFx0Ly8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHRcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMudHlwZSA9PT0gXCJjaGVja2JveFwiICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsIFwiaW5wdXRcIiApICkge1xuXHRcdFx0XHRcdHRoaXMuY2xpY2soKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdC8vIEZvciBjcm9zcy1icm93c2VyIGNvbnNpc3RlbmN5LCBkb24ndCBmaXJlIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5rc1xuXHRcdFx0X2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0cmV0dXJuIG5vZGVOYW1lKCBldmVudC50YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblxuXHQvLyBUaGlzIFwiaWZcIiBpcyBuZWVkZWQgZm9yIHBsYWluIG9iamVjdHNcblx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUgKTtcblx0fVxufTtcblxualF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7XG5cblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISggdGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCApICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHlcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdFx0Ly8gQ3JlYXRlIHRhcmdldCBwcm9wZXJ0aWVzXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDw9NiAtIDcgb25seVxuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpXG5cdFx0dGhpcy50YXJnZXQgPSAoIHNyYy50YXJnZXQgJiYgc3JjLnRhcmdldC5ub2RlVHlwZSA9PT0gMyApID9cblx0XHRcdHNyYy50YXJnZXQucGFyZW50Tm9kZSA6XG5cdFx0XHRzcmMudGFyZ2V0O1xuXG5cdFx0dGhpcy5jdXJyZW50VGFyZ2V0ID0gc3JjLmN1cnJlbnRUYXJnZXQ7XG5cdFx0dGhpcy5yZWxhdGVkVGFyZ2V0ID0gc3JjLnJlbGF0ZWRUYXJnZXQ7XG5cblx0Ly8gRXZlbnQgdHlwZVxuXHR9IGVsc2Uge1xuXHRcdHRoaXMudHlwZSA9IHNyYztcblx0fVxuXG5cdC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0XG5cdGlmICggcHJvcHMgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIENyZWF0ZSBhIHRpbWVzdGFtcCBpZiBpbmNvbWluZyBldmVudCBkb2Vzbid0IGhhdmUgb25lXG5cdHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1l
21167U3RhbXAgfHwgRGF0ZS5ub3coKTtcblxuXHQvLyBNYXJrIGl0IGFzIGZpeGVkXG5cdHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlO1xufTtcblxuLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sXG5qUXVlcnkuRXZlbnQucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LFxuXHRpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLFxuXHRpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNTaW11bGF0ZWQ6IGZhbHNlLFxuXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cbn07XG5cbi8vIEluY2x1ZGVzIGFsbCBjb21tb24gZXZlbnQgcHJvcHMgaW5jbHVkaW5nIEtleUV2ZW50IGFuZCBNb3VzZUV2ZW50IHNwZWNpZmljIHByb3BzXG5qUXVlcnkuZWFjaCgge1xuXHRhbHRLZXk6IHRydWUsXG5cdGJ1YmJsZXM6IHRydWUsXG5cdGNhbmNlbGFibG
21167U6IHRydWUsXG5cdGNoYW5nZWRUb3VjaGVzOiB0cnVlLFxuXHRjdHJsS2V5OiB0cnVlLFxuXHRkZXRhaWw6IHRydWUsXG5cdGV2ZW50UGhhc2U6IHRydWUsXG5cdG1ldGFLZXk6IHRydWUsXG5cdHBhZ2VYOiB0cnVlLFxuXHRwYWdlWTogdHJ1ZSxcblx0c2hpZnRLZXk6IHRydWUsXG5cdHZpZXc6IHRydWUsXG5cdFwiY2hhclwiOiB0cnVlLFxuXHRjaGFyQ29kZTogdHJ1ZSxcblx0a2V5OiB0cnVlLFxuXHRrZXlDb2RlOiB0cnVlLFxuXHRidXR0b246IHRydWUsXG5cdGJ1dHRvbnM6IHRydWUsXG5cdGNsaWVudFg6IHRydWUsXG5cdGNsaWVudFk6IHRydWUsXG5cdG9mZnNldFg6IHRydWUsXG5cdG9mZnNldFk6IHRydWUsXG5cdHBvaW50ZXJJZDogdHJ1ZSxcblx0cG9pbnRlclR5cGU6IHRydWUsXG5cdHNjcmVlblg6IHRydWUsXG5cdHNjcmVlblk6IHRydWUsXG5cdHRhcmdldFRvdWNoZXM6IHRydWUsXG5cdHRvRWxlbWVudDogdHJ1ZSxcblx0dG91Y2hlczogdHJ1ZSxcblxuXHR3aGljaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBidXR0b24gPSBldmVudC5idXR0b247XG5cblx0XHQvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHNcblx0XHRpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHtcblx0XHRcdHJldHVybiBldmVudC5jaGFyQ29kZSAhPSBudWxsID8gZXZlbnQuY2hhckNvZGUgOiBldmVudC5rZXlDb2RlO1xuXHRcdH1cblxuXHRcdC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHRcblx0XHRpZiAoICFldmVudC53aGljaCAmJiBidXR0b24gIT09IHVuZGVmaW5lZCAmJiBybW91c2VFdmVudC50ZXN0KCBldmVudC50eXBlICkgKSB7XG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDEgKSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDIgKSB7XG5cdFx0XHRcdHJldHVybiAzO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDQgKSB7XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQud2hpY2g7XG5cdH1cbn0sIGpRdWVyeS5ldmVudC5hZGRQcm9wICk7XG5cbi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrc1xuLy8gc28gdGhhdCBldmVudCBkZWxlZ2F0aW9uIHdvcmtzIGluIGpRdWVyeS5cbi8vIERvIHRoZSBzYW1lIGZvciBwb2ludGVyZW50ZXIvcG9pbnRlcmxlYXZlIGFuZCBwb2ludGVyb3Zlci9wb2ludGVyb3V0XG4vL1xuLy8gU3VwcG9ydDogU2FmYXJpIDcgb25seVxuLy8gU2FmYXJpIHNlbmRzIG1vdXNlZW50ZXIgdG9vIG9mdGVuOyBzZWU6XG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNThcbi8vIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGJ1ZyAoaXQgZXhpc3RlZCBpbiBvbGRlciBDaHJvbWUgdmVyc2lvbnMgYXMgd2VsbCkuXG5qUXVlcnkuZWFjaCgge1xuXHRtb3VzZWVudGVyOiBcIm1vdXNlb3ZlclwiLFxuXHRtb3VzZWxlYXZlOiBcIm1vdXNlb3V0XCIsXG5cdHBvaW50ZXJlbnRlcjogXCJwb2ludGVyb3ZlclwiLFxuXHRwb2ludGVybGVhdmU6IFwicG9pbnRlcm91dFwiXG59LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0ge1xuXHRcdGRlbGVnYXRlVHlwZTogZml4LFxuXHRcdGJpbmRUeXBlOiBmaXgsXG5cblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciByZXQsXG5cdFx0XHRcdHRhcmdldCA9IHRoaXMsXG5cdFx0XHRcdHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LFxuXHRcdFx0XHRoYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7XG5cblx0XHRcdC8vIEZvciBtb3VzZWVudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuXG5cdFx0XHQvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvd1xuXHRcdFx0aWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkge1xuXHRcdFx0XHRldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlO1xuXHRcdFx0XHRyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBmaXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0b25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTtcblx0fSxcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcblx0XHR2YXIgaGFuZGxlT2JqLCB0eXBlO1xuXHRcdGlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkge1xuXG5cdFx0XHQvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50XG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XG5cdFx0XHRqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKFxuXHRcdFx0XHRoYW5kbGVPYmoubmFtZXNwYWNlID9cblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUgKyBcIi5cIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOlxuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSxcblx0XHRcdFx0aGFuZGxlT2JqLnNlbGVjdG9yLFxuXHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybi
21167B0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzIFssIGZuXSApXG5cdFx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cblxudmFyXG5cblx0LyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuXG5cdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9pc3N1ZXMvMzIyOVxuXHRyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopW14+XSopXFwvPi9naSxcblxuXHQvKiBlc2xpbnQtZW5hYmxlICovXG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMCAtIDExLCBFZGdlIDEyIC0gMTMgb25seVxuXHQvLyBJbiBJRS9FZGdlIHVzaW5nIHJlZ2V4IGdyb3VwcyBoZXJlIGNhdXNlcyBzZXZlcmUgc2xvd2Rvd25zLlxuXHQvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyL1xuXHRybm9Jbm5lcmh0bWwgPSAvPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxcblxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfC0tKXwoPzpcXF1cXF18LS0pPlxccyokL2c7XG5cbi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93c1xuZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkge1xuXHRpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRhYmxlXCIgKSAmJlxuXHRcdG5vZGVOYW1lKCBjb250ZW50Lm5vZGVUeXBlICE9PSAxMSA/IGNvbnRlbnQgOiBjb250ZW50LmZpcnN0Q2hpbGQsIFwidHJcIiApICkge1xuXG5cdFx0cmV0dXJuIGpRdWVyeSggZWxlbSApLmNoaWxkcmVuKCBcInRib2R5XCIgKVsgMCBdIHx8IGVsZW07XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvblxuZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHtcblx0ZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggXCJ0eXBlXCIgKSAhPT0gbnVsbCApICsgXCIvXCIgKyBlbGVtLnR5cGU7XG5cdHJldHVybiBlbGVtO1xufVxuZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSApIHtcblx0aWYgKCAoIGVsZW0udHlwZSB8fCBcIlwiICkuc2xpY2UoIDAsIDUgKSA9PT0gXCJ0cnVlL1wiICkge1xuXHRcdGVsZW0udHlwZSA9IGVsZW0udHlwZS5zbGljZSggNSApO1xuXHR9IGVsc2Uge1xuXHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBcInR5cGVcIiApO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBpLCBsLCB0eXBlLCBwZGF0YU9sZCwgcGRhdGFDdXIsIHVkYXRhT2xkLCB1ZGF0YUN1ciwgZXZlbnRzO1xuXG5cdGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLlxuXHRpZiAoIGRhdGFQcml2Lmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHBkYXRhT2xkID0gZGF0YVByaXYuYWNjZXNzKCBzcmMgKTtcblx0XHRwZGF0YUN1ciA9IGRhdGFQcml2LnNldCggZGVzdCwgcGRhdGFPbGQgKTtcblx0XHRldmVudHMgPSBwZGF0YU9sZC5ldmVudHM7XG5cblx0XHRpZiAoIGV2ZW50cyApIHtcblx0XHRcdGRlbGV0ZSBwZGF0YUN1ci5oYW5kbGU7XG5cdFx0XHRwZGF0YUN1ci5ldmVudHMgPSB7fTtcblxuXHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIDIuIENvcHkgdXNlciBkYXRhXG5cdGlmICggZGF0YVVzZXIuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0dWRhdGFPbGQgPSBkYXRhVXNlci5hY2Nlc3MoIHNyYyApO1xuXHRcdHVkYXRhQ3VyID0galF1ZXJ5LmV4dGVuZCgge30sIHVkYXRhT2xkICk7XG5cblx0XHRkYXRhVXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7XG5cdH1cbn1cblxuLy8gRml4IElFIGJ1Z3MsIHNlZSBzdXBwb3J0IHRlc3RzXG5mdW5jdGlvbiBmaXhJbnB1dCggc3JjLCBkZXN0ICkge1xuXHR2YXIgbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0Ly8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uXG5cdGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkge1xuXHRcdGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkO1xuXG5cdC8vIEZhaWxzIHRvIHJldHVybi
21167B0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIiApIHtcblx0XHRkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7XG5cdH1cbn1cblxuZnVuY3Rpb24gZG9tTWFuaXAoIGNvbGxlY3Rpb24sIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICkge1xuXG5cdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0YXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTtcblxuXHR2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuXHRcdGlOb0Nsb25lID0gbCAtIDEsXG5cdFx0dmFsdWUgPSBhcmdzWyAwIF0sXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gfHxcblx0XHRcdCggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkge1xuXHRcdHJldHVybiBjb2xsZWN0aW9uLmVhY2goIGZ1bmN0aW9uKCBpbmRleCApIHtcblx0XHRcdHZhciBzZWxmID0gY29sbGVjdGlvbi5lcSggaW5kZXggKTtcblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTtcblx0XHRcdH1cblx0XHRcdGRvbU1hbmlwKCBzZWxmLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggbCApIHtcblx0XHRmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApO1xuXHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdH1cblxuXHRcdC8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFja1xuXHRcdGlmICggZmlyc3QgfHwgaWdub3JlZCApIHtcblx0XHRcdHNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCBcInNjcmlwdFwiICksIGRpc2FibGVTY3JpcHQgKTtcblx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdFx0Ly8gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwXG5cdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLlxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRub2RlID0gZnJhZ21lbnQ7XG5cblx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHQvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYWxsYmFjay5jYWxsKCBjb2xsZWN0aW9uWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0alF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApO1xuXG5cdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IHNjcmlwdHNbIGkgXTtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdCFkYXRhUHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggbm9kZS5zcmMgJiYgKCBub2RlLnR5cGUgfHwgXCJcIiApLnRvTG93ZXJDYXNlKCkgICE9PSBcIm1vZHVsZVwiICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5Ll9ldmFsVXJsICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5fZXZhbFVybCggbm9kZS5zcmMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0RE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsIFwiXCIgKSwgZG9jLCBub2RlICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSggZWxlbSwgc2VsZWN0b3IsIGtlZXBEYXRhICkge1xuXHR2YXIgbm9kZSxcblx0XHRub2RlcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIGVsZW0gKSA6IGVsZW0sXG5cdFx0aSA9IDA7XG5cblx0Zm9yICggOyAoIG5vZGUgPSBub2Rlc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdGlmICggIWtlZXBEYXRhICYmIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIG5vZGUgKSApO1xuXHRcdH1cblxuXHRcdGlmICggbm9kZS5wYXJlbnROb2RlICkge1xuXHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBqUXVlcnkuY29udGFpbnMoIG5vZGUub3duZXJEb2N1bWVudCwgbm9kZSApICkge1xuXHRcdFx0XHRzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0fVxuXHRcdFx0bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBub2RlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aHRtbFByZWZpbHRlcjogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0cmV0dXJuIGh0bWwucmVwbGFjZSggcnhodG1sVGFnLCBcIjwkMT48LyQyPlwiICk7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHR2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cyxcblx0XHRcdGNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKSxcblx0XHRcdGluUGFnZSA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cblx0XHQvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXNcblx0XHRpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmXG5cdFx0XHRcdCFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gV2UgZXNjaGV3IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBodHRwczovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yXG5cdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XG5cdFx0XHRzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxuXHRcdGlmICggZGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRcdHNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7XG5cdFx0XHRcdGRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCBcInNjcmlwdFwiICk7XG5cdFx0aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybi
21167B0aGUgY2xvbmVkIHNldFxuXHRcdHJldHVybiBjbG9uZTtcblx0fSxcblxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblx0XHR2YXIgZGF0YSwgZWxlbSwgdHlwZSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT09IHVuZGVmaW5lZDsgaSsrICkge1xuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRcdGlmICggKCBkYXRhID0gZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbFsgdHlwZSBdICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTtcblx0fSxcblxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IHRoaXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6
21167IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5odG1sUHJlZmlsdGVyKCB2YWx1ZSApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaWdub3JlZCA9IFtdO1xuXG5cdFx0Ly8gTWFrZSB0aGUgY2hhbmdlcywgcmVwbGFjaW5nIGVhY2ggbm9uLWlnbm9yZWQgY29udGV4dCBlbGVtZW50IHdpdGggdGhlIG5ldyBjb250ZW50XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaW5BcnJheSggdGhpcywgaWdub3JlZCApIDwgMCApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTtcblx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uXG5cdFx0fSwgaWdub3JlZCApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCB7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0Ly8gLmdldCgpIGJlY2F1c2UgcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0cHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7XG5cdH07XG59ICk7XG52YXIgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgcG51bSArIFwiKSg/IXB4KVthLXolXSskXCIsIFwiaVwiICk7XG5cbnZhciBnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seSwgRmlyZWZveCA8PTMwICgjMTUwOTgsICMxNDE1MClcblx0XHQvLyBJRSB0aHJvd3Mgb24gZWxlbWVudHMgY3JlYXRlZCBpbiBwb3B1cHNcblx0XHQvLyBGRiBtZWFud2hpbGUgdGhyb3dzIG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggXCJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlXCJcblx0XHR2YXIgdmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcblxuXHRcdGlmICggIXZpZXcgfHwgIXZpZXcub3BlbmVyICkge1xuXHRcdFx0dmlldyA9IHdpbmRvdztcblx0XHR9XG5cblx0XHRyZXR1cm4gdmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG5cdH07XG5cbnZhciByYm94U3R5bGUgPSBuZXcgUmVnRXhwKCBjc3NFeHBhbmQuam9pbiggXCJ8XCIgKSwgXCJpXCIgKTtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVTdHlsZVRlc3RzKCkge1xuXG5cdFx0Ly8gVGhpcyBpcyBh
21167IHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZVxuXHRcdGlmICggIWRpdiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O1wiICtcblx0XHRcdFwibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowXCI7XG5cdFx0ZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0XCJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7XCIgK1xuXHRcdFx0XCJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O1wiICtcblx0XHRcdFwid2lkdGg6NjAlO3RvcDoxJVwiO1xuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggY29udGFpbmVyICkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdFx0dmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiApO1xuXHRcdHBpeGVsUG9zaXRpb25WYWwgPSBkaXZTdHlsZS50b3AgIT09IFwiMSVcIjtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gNDRcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwgPSByb3VuZFBpeGVsTWVhc3VyZXMoIGRpdlN0eWxlLm1hcmdpbkxlZnQgKSA9PT0gMTI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjNcblx0XHQvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3Rcblx0XHRkaXYuc3R5bGUucmlnaHQgPSBcIjYwJVwiO1xuXHRcdHBpeGVsQm94U3R5bGVzVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5yaWdodCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdFx0Ly8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50c1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgb25seVxuXHRcdC8vIERldGVjdCBvdmVyZmxvdzpzY3JvbGwgc2NyZXdpbmVzcyAoZ2gtMzY5OSlcblx0XHRkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0c2Nyb2xsYm94U2l6ZVZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMzYgfHwgXCJhYnNvbHV0ZVwiO1xuXG5cdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdC8vIE51bGxpZnkgdGhlIGRpdiBzbyBpdCB3b3VsZG4ndCBiZSBzdG9yZWQgaW4gdGhlIG1lbW9yeSBhbmRcblx0XHQvLyBpdCB3aWxsIGFsc28gYmUgYSBzaWduIHRoYXQgY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHtcblx0XHRyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7XG5cdH1cblxuXHR2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsIHNjcm9sbGJveFNpemVWYWwsIHBpeGVsQm94U3R5bGVzVmFsLFxuXHRcdHJlbGlhYmxlTWFyZ2luTGVmdFZhbCxcblx0XHRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICksXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdC8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzXG5cdGlmICggIWRpdi5zdHlsZSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdC8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOClcblx0ZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJjb250ZW50LWJveFwiO1xuXHRkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcIlwiO1xuXHRzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSA9IGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9PT0gXCJjb250ZW50LWJveFwiO1xuXG5cdGpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHtcblx0XHRib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIGJveFNpemluZ1JlbGlhYmxlVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxCb3hTdHlsZXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbEJveFN0eWxlc1ZhbDtcblx0XHR9LFxuXHRcdHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbFBvc2l0aW9uVmFsO1xuXHRcdH0sXG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVNYXJnaW5MZWZ0VmFsO1xuXHRcdH0sXG5cdFx0c2Nyb2xsYm94U2l6ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHNjcm9sbGJveFNpemVWYWw7XG5cdFx0fVxuXHR9ICk7XG59ICkoKTtcblxuXG5mdW5jdGlvbiBjdXJDU1MoIGVsZW0sIG5hbWUsIGNvbXB1dGVkICkge1xuXHR2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LFxuXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA1MStcblx0XHQvLyBSZXRyaWV2aW5nIHN0eWxlIGJlZm9yZSBjb21wdXRlZCBzb21laG93XG5cdFx0Ly8gZml4ZXMgYW4gaXNzdWUgd2l0aCBnZXR0aW5nIHdyb25nIHZhbHVlc1xuXHRcdC8vIG9uIGRldGFjaGVkIGVsZW1lbnRzXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdGNvbXB1dGVkID0gY29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICk7XG5cblx0Ly8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBuZWVkZWQgZm9yOlxuXHQvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNylcblx0Ly8gICAuY3NzKCctLWN1c3RvbVByb3BlcnR5KSAoIzMxNDQpXG5cdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0cmV0ID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF0
211677XG5cblx0XHRpZiAoIHJldCA9PT0gXCJcIiAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHtcblx0XHRcdHJldCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcblx0XHQvLyBBbmRyb2lkIEJyb3dzZXIgcmV0dXJucyBwZXJjZW50YWdlIGZvciBzb21lIHZhbHVlcyxcblx0XHQvLyBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzLlxuXHRcdC8vIFRoaXMgaXMgYWdhaW5zdCB0aGUgQ1NTT00gZHJhZnQgc3BlYzpcblx0XHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI3Jlc29sdmVkLXZhbHVlc1xuXHRcdGlmICggIXN1cHBvcnQucGl4ZWxCb3hTdHlsZXMoKSAmJiBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcmJveFN0eWxlLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuXHRcdFx0d2lkdGggPSBzdHlsZS53aWR0aDtcblx0XHRcdG1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7XG5cdFx0XHRtYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoO1xuXG5cdFx0XHQvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7XG5cdFx0XHRyZXQgPSBjb21wdXRlZC53aWR0aDtcblxuXHRcdFx0Ly8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlc1xuXHRcdFx0c3R5bGUud2lkdGggPSB3aWR0aDtcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7XG5cdFx0XHRzdHlsZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdFx0Ly8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci5cblx0XHRyZXQgKyBcIlwiIDpcblx0XHRyZXQ7XG59XG5cblxuZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25GbiwgaG9va0ZuICkge1xuXG5cdC8vIERlZmluZSB0aGUgaG9vaywgd2UnbGwgY2hlY2sgb24gdGhlIGZpcnN0IHJ1biBpZiBpdCdzIHJlYWxseSBuZWVkZWQuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggY29uZGl0aW9uRm4oKSApIHtcblxuXHRcdFx0XHQvLyBIb29rIG5vdCBuZWVkZWQgKG9yIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBpdCBkdWVcblx0XHRcdFx0Ly8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LlxuXHRcdFx0XHRkZWxldGUgdGhpcy5nZXQ7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSG9vayBuZWVkZWQ7IHJlZGVmaW5lIGl0IHNvIHRoYXQgdGhlIHN1cHBvcnQgdGVzdCBpcyBub3QgZXhlY3V0ZWQgYWdhaW4uXG5cdFx0XHRyZXR1cm4gKCB0aGlzLmdldCA9IGhvb2tGbiApLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cdH07XG59XG5cblxudmFyXG5cblx0Ly8gU3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZVxuXHQvLyBleGNlcHQgXCJ0YWJsZVwiLCBcInRhYmxlLWNlbGxcIiwgb3IgXCJ0YWJsZS1jYXB0aW9uXCJcblx0Ly8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5XG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcblx0cmN1c3RvbVByb3AgPSAvXi0tLyxcblx0Y3NzU2hvdyA9IHsgcG9zaXRpb246IFwiYWJzb2x1dGVcIiwgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiwgZGlzcGxheTogXCJibG9ja1wiIH0sXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcblx0XHRsZXR0ZXJTcGFjaW5nOiBcIjBcIixcblx0XHRmb250V2VpZ2h0OiBcIjQwMFwiXG5cdH0sXG5cblx0Y3NzUHJlZml4ZXMgPSBbIFwiV2Via2l0XCIsIFwiTW96XCIsIFwibXNcIiBdLFxuXHRlbXB0eVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLnN0eWxlO1xuXG4vLyBSZXR1cm4gYSBjc3MgcHJvcGVydHkgbWFwcGVkIHRvIGEgcG90ZW50aWFsbHkgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5XG5mdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHtcblxuXHQvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZFxuXHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRyZXR1cm4gbmFtZTtcblx0fVxuXG5cdC8vIENoZWNrIGZvciB2ZW5kb3IgcHJlZml4ZWQgbmFtZXNcblx0dmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSxcblx0XHRpID0gY3NzUHJlZml4ZXMubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTtcblx0XHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRcdHJldHVybiBuYW1lO1xuXHRcdH1cblx0fVxufVxuXG4vLyBSZXR1cm4gYSBwcm9wZXJ0eSBtYXBwZWQgYWxvbmcgd2hhdCBqUXVlcnkuY3NzUHJvcHMgc3VnZ2VzdHMgb3IgdG9cbi8vIGEgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5LlxuZnVuY3Rpb24gZmluYWxQcm9wTmFtZSggbmFtZSApIHtcblx0dmFyIHJldCA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdO1xuXHRpZiAoICFyZXQgKSB7XG5cdFx0cmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7XG5cdH1cblx0cmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApIHtcblxuXHQvLyBBbnkgcmVsYXRpdmUgKCsvLSkgdmFsdWVzIGhhdmUgYWxyZWFkeSBiZWVuXG5cdC8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludFxuXHR2YXIgbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKTtcblx0cmV0dXJuIG1hdGNoZXMgP1xuXG5cdFx0Ly8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgXCJzdWJ0cmFjdFwiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3Ncblx0XHRNYXRoLm1heCggMCwgbWF0Y2hlc1sgMiBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApIDpcblx0XHR2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7XG5cdHZhciBpID0gZGltZW5zaW9uID09PSBcIndpZHRoXCIgPyAxIDogMCxcblx0XHRleHRyYSA9IDAsXG5cdFx0ZGVsdGEgPSAwO1xuXG5cdC8vIEFkanVzdG1lbnQgbWF5IG5vdCBiZSBuZWNlc3Nhcnlcblx0aWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGZvciAoIDsgaSA8IDQ7IGkgKz
211670gMiApIHtcblxuXHRcdC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpblxuXHRcdGlmICggYm94ID09PSBcIm1hcmdpblwiICkge1xuXHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgYm94ICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBjb250ZW50LWJveCwgd2UncmUgc2Vla2luZyBcInBhZGRpbmdcIiBvciBcImJvcmRlclwiIG9yIFwibWFyZ2luXCJcblx0XHRpZiAoICFpc0JvcmRlckJveCApIHtcblxuXHRcdFx0Ly8gQWRkIHBhZGRpbmdcblx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBGb3IgXCJib3JkZXJcIiBvciBcIm1hcmdpblwiLCBhZGQgYm9yZGVyXG5cdFx0XHRpZiAoIGJveCAhPT0gXCJwYWRkaW5nXCIgKSB7XG5cdFx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdC8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgXCJjb250ZW50XCIgb3Jcblx0XHQvLyBcInBhZGRpbmdcIiBvciBcIm1hcmdpblwiXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gRm9yIFwiY29udGVudFwiLCBzdWJ0cmFjdCBwYWRkaW5nXG5cdFx0XHRpZiAoIGJveCA9PT0gXCJjb250ZW50XCIgKSB7XG5cdFx0XHRcdGRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3IgXCJjb250ZW50XCIgb3IgXCJwYWRkaW5nXCIsIHN1YnRyYWN0IGJvcmRlclxuXHRcdFx0aWYgKCBib3ggIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRcdGRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWxcblx0aWYgKCAhaXNCb3JkZXJCb3ggJiYgY29tcHV0ZWRWYWwgPj0gMCApIHtcblxuXHRcdC8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXJcblx0XHQvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duXG5cdFx0ZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbChcblx0XHRcdGVsZW1bIFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtXG5cdFx0XHRjb21wdXRlZFZhbCAtXG5cdFx0XHRkZWx0YSAtXG5cdFx0XHRleHRyYSAtXG5cdFx0XHQwLjVcblx0XHQpICk7XG5cdH1cblxuXHRyZXR1cm4gZGVsdGE7XG59XG5cbmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZVxuXHR2YXIgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBkaW1lbnNpb24sIHN0eWxlcyApLFxuXHRcdGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHR2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3g7XG5cblx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTU0XG5cdC8vIFJldHVybiBhIGNvbmZvdW5kaW5nIG5vbi1waXhlbCB2YWx1ZSBvciBmZWlnbiBpZ25vcmFuY2UsIGFzIGFwcHJvcHJpYXRlLlxuXHRpZiAoIHJudW1ub25weC50ZXN0KCB2YWwgKSApIHtcblx0XHRpZiAoICFleHRyYSApIHtcblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fVxuXHRcdHZhbCA9IFwiYXV0b1wiO1xuXHR9XG5cblx0Ly8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXNcblx0Ly8gZm9yIGdldENvbXB1dGVkU3R5bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZVxuXHR2YWx1ZUlzQm9yZGVyQm94ID0gdmFsdWVJc0JvcmRlckJveCAmJlxuXHRcdCggc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpIHx8IHZhbCA9PT0gZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gKTtcblxuXHQvLyBGYWxsIGJhY2sgdG8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IHdoZW4gdmFsdWUgaXMgXCJhdXRvXCJcblx0Ly8gVGhpcyBoYXBwZW5zIGZvciBpbmxpbmUgZWxlbWVudHMgd2l0aCBubyBleHBsaWNpdCBzZXR0aW5nIChnaC0zNTcxKVxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIC0gNC4zIG9ubHlcblx0Ly8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMilcblx0aWYgKCB2YWwgPT09IFwiYXV0b1wiIHx8XG5cdFx0IXBhcnNlRmxvYXQoIHZhbCApICYmIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiaW5saW5lXCIgKSB7XG5cblx0XHR2YWwgPSBlbGVtWyBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApIF07XG5cblx0XHQvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgcHJvdmlkZSBib3JkZXItYm94IHZhbHVlc1xuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlO1xuXHR9XG5cblx0Ly8gTm9ybWFsaXplIFwiXCIgYW5kIGF1dG9cblx0dmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDtcblxuXHQvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsXG5cdHJldHVybiAoIHZhbCArXG5cdFx0Ym94TW9kZWxBZGp1c3RtZW50KFxuXHRcdFx0ZWxlbSxcblx0XHRcdGRpbWVuc2lvbixcblx0XHRcdGV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSxcblx0XHRcdHZhbHVlSXNCb3JkZXJCb3gsXG5cdFx0XHRzdHlsZXMsXG5cblx0XHRcdC8vIFByb3ZpZGUgdGhlIGN1cnJlbnQgY29tcHV0ZWQgc2l6ZSB0byByZXF1
21167ZXN0IHNjcm9sbCBndXR0ZXIgY2FsY3VsYXRpb24gKGdoLTM1ODkpXG5cdFx0XHR2YWxcblx0XHQpXG5cdCkgKyBcInB4XCI7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnRcIjogdHJ1ZSxcblx0XHRcImNvbHVtbkNvdW50XCI6IHRydWUsXG5cdFx0XCJmaWxsT3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwiZmxleEdyb3dcIjogdHJ1ZSxcblx0XHRcImZsZXhTaHJpbmtcIjogdHJ1ZSxcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcblx0XHRcImxpbmVIZWlnaHRcIjogdHJ1ZSxcblx0XHRcIm9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcIm9yZGVyXCI6IHRydWUsXG5cdFx0XCJvcnBoYW5zXCI6IHRydWUsXG5cdFx0XCJ3aWRvd3NcIjogdHJ1ZSxcblx0XHRcInpJbmRleFwiOiB0cnVlLFxuXHRcdFwiem9vbVwiOiB0cnVlXG5cdH0sXG5cblx0Ly8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZVxuXHQvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlXG5cdGNzc1Byb3BzOiB7fSxcblxuXHQvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZVxuXHRzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHtcblxuXHRcdC8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxuXHRcdHZhciByZXQsIHR5cGUsIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBjYW1lbENhc2UoIG5hbWUgKSxcblx0XHRcdGlzQ3VzdG9tUHJvcCA9IHJjdXN0b21Qcm9wLnRlc3QoIG5hbWUgKSxcblx0XHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3Rcblx0XHQvLyB3YW50IHRvIHF1ZXJ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb25cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZVxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRcdC8vIENvbnZlcnQgXCIrPVwiIG9yIFwiLT1cIiB0byByZWxhdGl2ZSBudW1iZXJzICgjNzM0NSlcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAoIHJldCA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmIHJldFsgMSBdICkge1xuXHRcdFx0XHR2YWx1ZSA9IGFkanVzdENTUyggZWxlbSwgbmFtZSwgcmV0ICk7XG5cblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM5MjM3XG5cdFx0XHRcdHR5cGUgPSBcIm51bWJlclwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQgKCM3MTE2KVxuXHRcdFx0aWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIG51bWJlciB3YXMgcGFzc2VkIGluLCBhZGQgdGhlIHVuaXQgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcylcblx0XHRcdGlmICggdHlwZSA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsdWUgKz0gcmV0ICYmIHJldFsgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8XG5cdFx0XHRcdCggdmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdFx0XHRzdHlsZS5zZXRQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3Rcblx0XHRcdHJldHVybi
21167BzdHlsZVsgbmFtZSBdO1xuXHRcdH1cblx0fSxcblxuXHRjc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkge1xuXHRcdHZhciB2YWwsIG51bSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gbW9kaWZ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJ5IHByZWZpeGVkIG5hbWUgZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgbmFtZVxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXRcblx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IFwibm9ybWFsXCIgdG8gY29tcHV0ZWQgdmFsdWVcblx0XHRpZiAoIHZhbCA9PT0gXCJub3JtYWxcIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHtcblx0XHRcdHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIE1ha2UgbnVtZXJpYyBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpY1xuXHRcdGlmICggZXh0cmEgPT09IFwiXCIgfHwgZXh0cmEgKSB7XG5cdFx0XHRudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTtcblx0XHRcdHJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggaSwgZGltZW5zaW9uICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0Ly8gQ2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtXG5cdFx0XHRcdC8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0XG5cdFx0XHRcdHJldHVybiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApICYmXG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCtcblx0XHRcdFx0XHQvLyBUYWJsZSBjb2x1bW5zIGluIFNhZmFyaSBoYXZlIG5vbi16ZXJvIG9mZnNldFdpZHRoICYgemVyb1xuXHRcdFx0XHRcdC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHVubGVzcyBkaXNwbGF5IGlzIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0XHRcdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYSBkaXNjb25uZWN0ZWQgbm9kZVxuXHRcdFx0XHRcdC8vIGluIElFIHRocm93cyBhbiBlcnJvci5cblx0XHRcdFx0XHQoICFlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoIHx8ICFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICkgP1xuXHRcdFx0XHRcdFx0c3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7XG5cdFx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdFx0Z2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7XG5cdFx0XHR2YXIgbWF0Y2hlcyxcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0XHRcdGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHRcdFx0c3VidHJhY3QgPSBleHRyYSAmJiBib3hNb2RlbEFkanVzdG1lbnQoXG5cdFx0XHRcdFx0ZWxlbSxcblx0XHRcdFx0XHRkaW1lbnNpb24sXG5cdFx0XHRcdFx0ZXh0cmEsXG5cdFx0XHRcdFx0aXNCb3JkZXJCb3gsXG5cdFx0XHRcdFx0c3R5bGVzXG5cdFx0XHRcdCk7XG5cblx0XHRcdC8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZFxuXHRcdFx0Ly8gZmFraW5nIGEgY29udGVudC1ib3ggdG8gZ2V0IGJvcmRlciBhbmQgcGFkZGluZyAoZ2gtMzY5OSlcblx0XHRcdGlmICggaXNCb3JkZXJCb3ggJiYgc3VwcG9ydC5zY3JvbGxib3hTaXplKCkgPT09IHN0eWxlcy5wb3NpdGlvbiApIHtcblx0XHRcdFx0c3VidHJhY3QgLT0gTWF0aC5jZWlsKFxuXHRcdFx0XHRcdGVsZW1bIFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtXG5cdFx0XHRcdFx0cGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC1cblx0XHRcdFx0XHRib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgXCJib3JkZXJcIiwgZmFsc2UsIHN0eWxlcyApIC1cblx0XHRcdFx0XHQwLjVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCB0byBwaXhlbHMgaWYgdmFsdWUgYWRqdXN0bWVudCBpcyBuZWVkZWRcblx0XHRcdGlmICggc3VidHJhY3QgJiYgKCBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiZcblx0XHRcdFx0KCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgIT09IFwicHhcIiApIHtcblxuXHRcdFx0XHRlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSA9IHZhbHVlO1xuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5jc3MoIGVsZW0sIGRpbWVuc2lvbiApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApO1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LFxuXHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdHJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgXCJtYXJnaW5MZWZ0XCIgKSApIHx8XG5cdFx0XHRcdGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtXG5cdFx0XHRcdFx0c3dhcCggZWxlbSwgeyBtYXJnaW5MZWZ0OiAwIH0sIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KSArIFwicHhcIjtcblx0XHR9XG5cdH1cbik7XG5cbi8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXNcbmpRdWVyeS5lYWNoKCB7XG5cdG1hcmdpbjogXCJcIixcblx0cGFkZGluZzogXCJcIixcblx0Ym9yZGVyOiBcIldpZHRoXCJcbn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHtcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBpID0gMCxcblx0XHRcdFx0ZXhwYW5kZWQgPSB7fSxcblxuXHRcdFx0XHQvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmdcblx0XHRcdFx0cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS
211675zcGxpdCggXCIgXCIgKSA6IFsgdmFsdWUgXTtcblxuXHRcdFx0Zm9yICggOyBpIDwgNDsgaSsrICkge1xuXHRcdFx0XHRleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9XG5cdFx0XHRcdFx0cGFydHNbIGkgXSB8fCBwYXJ0c1sgaSAtIDIgXSB8fCBwYXJ0c1sgMCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXhwYW5kZWQ7XG5cdFx0fVxuXHR9O1xuXG5cdGlmICggcHJlZml4ICE9PSBcIm1hcmdpblwiICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgc3R5bGVzLCBsZW4sXG5cdFx0XHRcdG1hcCA9IHt9LFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0XHRsZW4gPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWFwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XG5cdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHR9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fVxufSApO1xuXG5cbmZ1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHtcblx0cmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTtcbn1cbmpRdWVyeS5Ud2VlbiA9IFR3ZWVuO1xuXG5Ud2Vlbi5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBUd2Vlbixcblx0aW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkge1xuXHRcdHRoaXMuZWxlbSA9IGVsZW07XG5cdFx0dGhpcy5wcm9wID0gcHJvcDtcblx0XHR0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0O1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0Ly8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCxcblx0XHRcdC8vIG9yIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc3R5bGUgcHJvcGVydHkgdGhhdCBleGlzdHMuXG5cdFx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgIT09IDEgfHxcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07XG5cdFx0XHR9XG5cblx0XHRcdC8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseVxuXHRcdFx0Ly8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscy5cblx0XHRcdC8vIFNpbXBsZSB2YWx1ZXMgc3VjaCBhcyBcIjEwcHhcIiBhcmUgcGFyc2VkIHRvIEZsb2F0O1xuXHRcdFx0Ly8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyBcInJvdGF0ZSgxcmFkKVwiIGFyZSByZXR1cm5lZCBhcy1pcy5cblx0XHRcdHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIFwiXCIgKTtcblxuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXG5cdFx0XHQvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC5cblx0XHRcdC8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS5cblx0XHRcdC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJv
21167cEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fSxcblx0X2RlZmF1bHQ6IFwic3dpbmdcIlxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgY29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIGluUHJvZ3Jlc3MsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLztcblxuZnVuY3Rpb24gc2NoZWR1bGUoKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHtcblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHNjaGVkdWxlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBzY2hlZHVsZSwgalF1ZXJ5LmZ4LmludGVydmFsICk7XG5cdFx0fVxuXG5cdFx0alF1ZXJ5LmZ4LnRpY2soKTtcblx0fVxufVxuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9ICk7XG5cdHJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApO1xufVxuXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxuZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHtcblx0dmFyIHdoaWNoLFxuXHRcdGkgPSAwLFxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTtcblxuXHQvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXG5cdC8vIG90aGVyd2lzZSBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0XG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwO1xuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIEFuaW1hdGlvbi50d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICggdHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApICkge1xuXG5cdFx0XHQvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHtcblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LFxuXHRcdGlzQm94ID0gXCJ3aWR0aFwiIGluIHByb3BzIHx8IFwiaGVpZ2h0XCIgaW4gcHJvcHMsXG5cdFx0YW5pbSA9IHRoaXMsXG5cdFx0b3JpZyA9IHt9LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cblx0Ly8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLnRlc3QoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIFByZXRlbmQgdG8gYmUgaGlkZGVuIGlmIHRoaXMgaXMgYSBcInNob3dcIiBhbmRcblx0XHRcdFx0Ly8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGVcblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJzaG93XCIgJiYgZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gSWdub3JlIGFsbCBvdGhlciBuby1vcCBzaG93L2hpZGUgZGF0YVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpXG5cdHByb3BUd2VlbiA9ICFqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcHMgKTtcblx0aWYgKCAhcHJvcFR3ZWVuICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVzdHJpY3QgXCJvdmVyZmxvd1wiIGFuZCBcImRpc3BsYXlcIiBzdHlsZXMgZHVyaW5nIGJveCBhbmltYXRpb25zXG5cdGlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTVcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90IGluZmVyIHRoZSBzaG9ydGhhbmRcblx0XHQvLyBmcm9tIGlkZW50aWNhbGx5LXZhbHVlZCBvdmVyZmxvd1ggYW5kIG92ZXJmbG93WSBhbmQgRWRnZSBqdXN0IG1pcnJvcnNcblx0XHQvLyB0aGUgb3ZlcmZsb3dYIHZhbHVlIHRoZXJlLlxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gSWRlbnRpZnkgYSBkaXNwbGF5IHR5cGUsIHByZWZlcnJpbmcgb2xkIHNob3cvaGlkZSBkYXRhIG92ZXIgdGhlIENTUyBjYXNjYWRlXG5cdFx0cmVzdG9yZURpc3BsYXkgPSBkYXRhU2hvdyAmJiBkYXRhU2hvdy5kaXNwbGF5O1xuXHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdH1cblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSApIHtcblx0XHRcdFx0ZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBHZXQgbm9uZW1wdHkgdmFsdWUocykgYnkgdGVtcG9yYXJpbHkgZm9yY2luZyB2aXNpYmlsaXR5XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApO1xuXHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheSB8fCByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFuaW1hdGUgaW5saW5lIGVsZW1lbnRzIGFzIGlubGluZS1ibG9ja1xuXHRcdGlmICggZGlzcGxheSA9PT0gXCJpbmxpbmVcIiB8fCBkaXNwbGF5ID09PSBcImlubGluZS1ibG9ja1wiICYmIHJlc3RvcmVEaXNwbGF5ICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZmxvYXRcIiApID09PSBcIm5vbmVcIiApIHtcblxuXHRcdFx0XHQvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlIGF0IHRoZSBlbmQgb2YgcHVyZSBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRcdFx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheSA9IHN0eWxlLmRpc3BsYXk7XG5cdFx0XHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJcIiA6IGRpc3BsYXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gSW1wbGVtZW50IHNob3cvaGlkZSBhbmltYXRpb25zXG5cdHByb3BUd2VlbiA9IGZ
21167hbHNlO1xuXHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cblx0XHQvLyBHZW5lcmFsIHNob3cvaGlkZSBzZXR1cCBmb3IgdGhpcyBlbGVtZW50IGFuaW1hdGlvblxuXHRcdGlmICggIXByb3BUd2VlbiApIHtcblx0XHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFTaG93ID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7IGRpc3BsYXk6IHJlc3RvcmVEaXNwbGF5IH0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RvcmUgaGlkZGVuL3Zpc2libGUgZm9yIHRvZ2dsZSBzbyBgLnN0b3AoKS50b2dnbGUoKWAgXCJyZXZlcnNlc1wiXG5cdFx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW1cblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdFx0Ly8gVGhlIGZpbmFsIHN0ZXAgb2YgYSBcImhpZGVcIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50XG5cdFx0XHRcdGlmICggIWhpZGRlbiApIHtcblx0XHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiZnhzaG93XCIgKTtcblx0XHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvLyBQZXItcHJvcGVydHkgc2V0dXBcblx0XHRwcm9wVHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblx0XHRpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHtcblx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7XG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0cHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdFx0cHJvcFR3ZWVuLnN0YXJ0ID0gMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7XG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0ZWFzaW5nID0gdmFsdWVbIDEgXTtcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XG5cdFx0XHRwcm9wc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRkZWxldGUgcHJvcHNbIGluZGV4IF07XG5cdFx0fVxuXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTtcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgbmFtZSBdO1xuXG5cdFx0XHQvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuXG5cdFx0XHQvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFwibmFtZVwiXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkge1xuXHRcdFx0XHRcdHByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07XG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcblx0dmFyIHJlc3VsdCxcblx0XHRzdG9wcGVkLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBBbmltYXRpb24ucHJlZmlsdGVycy5sZW5ndGgsXG5cdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBEb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3Jcblx0XHRcdGRlbGV0ZSB0aWNrLmVsZW07XG5cdFx0fSApLFxuXHRcdHRpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdFx0cmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLFxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHlcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAoIzEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdICk7XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbW9yZSB0byBkbywgeWllbGRcblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIHdhcyBhbiBlbXB0eSBhbmltYXRpb24sIHN5bnRoZXNpemUgYSBmaW5hbCBwcm9ncmVzcyBub3RpZmljYXRpb25cblx0XHRcdGlmICggIWxlbmd0aCApIHtcblx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO
211671xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNvbHZlIHRoZSBhbmltYXRpb24gYW5kIHJlcG9ydCBpdHMgY29uY2x1c2lvblxuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcblx0XHRcdG9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHtcblx0XHRcdFx0c3BlY2lhbEVhc2luZzoge30sXG5cdFx0XHRcdGVhc2luZzogalF1ZXJ5LmVhc2luZy5fZGVmYXVsdFxuXHRcdFx0fSwgb3B0aW9ucyApLFxuXHRcdFx0b3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxuXHRcdFx0c3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0ZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sXG5cdFx0XHR0d2VlbnM6IFtdLFxuXHRcdFx0Y3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7XG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcblx0XHRcdFx0XHRcdGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmdbIHByb3AgXSB8fCBhbmltYXRpb24ub3B0cy5lYXNpbmcgKTtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApO1xuXHRcdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0XHR9LFxuXHRcdFx0c3RvcDogZnVuY3Rpb24oIGdvdG9FbmQgKSB7XG5cdFx0XHRcdHZhciBpbmRleCA9IDAsXG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnRcblx0XHRcdFx0XHRsZW5ndGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwO1xuXHRcdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RvcHBlZCA9IHRydWU7XG5cdFx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0XG5cdFx0XHRcdGlmICggZ290b0VuZCApIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0fSApLFxuXHRcdHByb3BzID0gYW5pbWF0aW9uLnByb3BzO1xuXG5cdHByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApO1xuXHRcdGlmICggcmVzdWx0ICkge1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCByZXN1bHQuc3RvcCApICkge1xuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPVxuXHRcdFx0XHRcdHJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cdH1cblxuXHRqUXVlcnkubWFwKCBwcm9wcywgY3JlYXRlVHdlZW4sIGFuaW1hdGlvbiApO1xuXG5cdGlmICggaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdC8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zXG5cdGFuaW1hdGlvblxuXHRcdC5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKVxuXHRcdC5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApXG5cdFx0LmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKVxuXHRcdC5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApO1xuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSApXG5cdCk7XG5cblx0cmV0dXJuIGFuaW1hdGlvbjtcbn1cblxualF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFuaW1hdGlvbiwge1xuXG5cdHR3ZWVuZXJzOiB7XG5cdFx0XCIqXCI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdFx0dmFyIHR3ZWVuID0gdGhpcy5jcmVhdGVUd2VlbiggcHJvcCwgdmFsdWUgKTtcblx0XHRcdGFkanVzdENTUyggdHdlZW4uZWxlbSwgcHJvcCwgcmNzc051bS5leGVjKCB2YWx1ZSApLCB0d2VlbiApO1xuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH0gXVxuXHR9LFxuXG5cdHR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7XG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBwcm9wcyApICkge1xuXHRcdFx0Y2FsbGJhY2sgPSBwcm9wcztcblx0XHRcdHByb3BzID0gWyBcIipcIiBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wcyA9IHByb3BzLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0cHJvcCA9IHByb3BzWyBpbmRleCBdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gPSBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9LFxuXG5cdHByZWZpbHRlcnM6IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXG5cdHByZWZpbHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkge1xuXHRcdGlmICggcHJlcGVuZCApIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHtcblx0dmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gXCJvYmplY3RcIiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDoge1xuXHRcdGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8XG5cdFx0XHRpc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLFxuXHRcdGR1cmF0aW9uOiBzcGVlZCxcblx0XHRlYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZ1xuXHR9O1xuXG5cdC8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZlxuXHRpZiAoIGpRdWVyeS5meC5vZmYgKSB7XG5cdFx0b3B0LmR1cmF0aW9uID0gMDtcblxuXHR9IGVsc2Uge1xuXHRcdGlmICggdHlwZW9mIG9wdC5kdXJhdGlvbiAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdGlmICggb3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgKSB7XG5cdFx0XHRcdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0O
211671xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+IFwiZnhcIlxuXHRpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHtcblx0XHRvcHQucXVldWUgPSBcImZ4XCI7XG5cdH1cblxuXHQvLyBRdWV1ZWluZ1xuXHRvcHQub2xkID0gb3B0LmNvbXBsZXRlO1xuXG5cdG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xuXHRcdFx0b3B0Lm9sZC5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHQucXVldWUgKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBvcHQ7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHtcblxuXHRcdC8vIFNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW5XaXRoaW5UcmVlICkuY3NzKCBcIm9wYWNpdHlcIiwgMCApLnNob3coKVxuXG5cdFx0XHQvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWRcblx0XHRcdC5lbmQoKS5hbmltYXRlKCB7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH0sXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxuXHRcdFx0b3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLFxuXHRcdFx0ZG9BbmltYXRpb24gPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0eSBlYXNpbmcgd29uJ3QgYmUgbG9zdFxuXHRcdFx0XHR2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7XG5cblx0XHRcdFx0Ly8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5XG5cdFx0XHRcdGlmICggZW1wdHkgfHwgZGF0YVByaXYuZ2V0KCB0aGlzLCBcImZpbmlzaFwiICkgKSB7XG5cdFx0XHRcdFx0YW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjtcblxuXHRcdHJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID9cblx0XHRcdHRoaXMuZWFjaCggZG9BbmltYXRpb24gKSA6XG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XG5cdH0sXG5cdHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkge1xuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XG5cdFx0XHR2YXIgc3RvcCA9IGhvb2tzLnN0b3A7XG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcblx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGdvdG9FbmQgPSBjbGVhclF1ZXVlO1xuXHRcdFx0Y2xlYXJRdWV1ZSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkZXF1ZXVlID0gdHJ1ZSxcblx0XHRcdFx0aW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArIFwicXVldWVIb29rc1wiLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICk7XG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7XG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7XG5cdFx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJlxuXHRcdFx0XHRcdCggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkge1xuXG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xuXHRcdFx0XHRcdGRlcXVldWUgPSBmYWxzZTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuXG5cdFx0XHQvLyBUaW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoXG5cdFx0XHQvLyB3aWxsIGRlcXVldWUgYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQuXG5cdFx0XHRpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXHRmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdGlmICggdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGluZGV4LFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICksXG5cdFx0XHRcdHF1ZXVlID0gZGF0YVsgdHlwZSArIFwicXVldWVcIiBdLFxuXHRcdFx0XHRob29rcyA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlSG9va3NcIiBdLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7XG5cblx0XHRcdC8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGFcblx0XHRcdGRhdGEuZmluaXNoID0gdHJ1ZTtcblxuXHRcdFx0Ly8gRW1wdHkgdGhlI
21167HF1ZXVlIGZpcnN0XG5cdFx0XHRqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7XG5cblx0XHRcdGlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHtcblx0XHRcdFx0aG9va3Muc3RvcC5jYWxsKCB0aGlzLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhY3RpdmUgYW5pbWF0aW9ucywgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmIHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApIHtcblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYW5pbWF0aW9ucyBpbiB0aGUgb2xkIHF1ZXVlIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0aWYgKCBxdWV1ZVsgaW5kZXggXSAmJiBxdWV1ZVsgaW5kZXggXS5maW5pc2ggKSB7XG5cdFx0XHRcdFx0cXVldWVbIGluZGV4IF0uZmluaXNoLmNhbGwoIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZ1xuXHRcdFx0ZGVsZXRlIGRhdGEuZmluaXNoO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcInRvZ2dsZVwiLCBcInNob3dcIiwgXCJoaWRlXCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdO1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09IFwiYm9vbGVhblwiID9cblx0XHRcdGNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6XG5cdFx0XHR0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKCB7XG5cdHNsaWRlRG93bjogZ2VuRngoIFwic2hvd1wiICksXG5cdHNsaWRlVXA6IGdlbkZ4KCBcImhpZGVcIiApLFxuXHRzbGlkZVRvZ2dsZTogZ2VuRngoIFwidG9nZ2xlXCIgKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS50aW1lcnMgPSBbXTtcbmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7XG5cdHZhciB0aW1lcixcblx0XHRpID0gMCxcblx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzO1xuXG5cdGZ4Tm93ID0gRGF0ZS5ub3coKTtcblxuXHRmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0dGltZXIgPSB0aW1lcnNbIGkgXTtcblxuXHRcdC8vIFJ1biB0aGUgdGltZXIgYW5kIHNhZmVseSByZW1vdmUgaXQgd2hlbiBkb25lIChhbGxvd2luZyBmb3IgZXh0ZXJuYWwgcmVtb3ZhbClcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRqUXVlcnkuZnguc3RhcnQoKTtcbn07XG5cbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xualF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpblByb2dyZXNzID0gdHJ1ZTtcblx0c2NoZWR1bGUoKTtcbn07XG5cbmpRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdGluUHJvZ3Jlc3MgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cblx0Ly8gRGVmYXVsdCBzcGVlZFxuXHRfZGVmYXVsdDogNDAwXG59O1xuXG5cbi8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cbi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvXG5qUXVlcnkuZm4uZGVsYXkgPSBmdW5jdGlvbiggdGltZSwgdHlwZSApIHtcblx0dGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTtcblx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7XG5cdFx0dmFyIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggbmV4dCwgdGltZSApO1xuXHRcdGhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXQgKTtcblx0XHR9O1xuXHR9ICk7XG59O1xuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApLFxuXHRcdHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2VsZWN0XCIgKSxcblx0XHRvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib3B0aW9uXCIgKSApO1xuXG5cdGlucHV0LnR5cGUgPSBcImNoZWNrYm94XCI7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5XG5cdC8vIERlZmF1bHQgdmFsdWUgZm9yIGEgY2hlY2tib3ggc2hvdWxkIGJlIFwib25cIlxuXHRzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gXCJcIjtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTXVzdCBhY2Nlc3Mgc2VsZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3Rcblx0c3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gQW4gaW5wdXQgbG9zZXMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW9cblx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0aW5wdXQudmFsdWUgPSBcInRcIjtcblx0aW5wdXQudHlwZSA9IFwicmFkaW9cIjtcblx0c3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09IFwidFwiO1xufSApKCk7XG5cblxudmFyIGJvb2xIb29rLF
21167xuXHRhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdC8vIEF0dHJpYnV0ZSBob29rcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbG93ZXJjYXNlIHZlcnNpb25cblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkgPyBib29sSG9vayA6IHVuZGVmaW5lZCApO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgKSB7XG5cdFx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgXCJcIiApO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdC8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkXG5cdFx0cmV0dXJuIHJldCA9PSBudWxsID8gdW5kZWZpbmVkIDogcmV0O1xuXHR9LFxuXG5cdGF0dHJIb29rczoge1xuXHRcdHR5cGU6IHtcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09IFwicmFkaW9cIiAmJlxuXHRcdFx0XHRcdG5vZGVOYW1lKCBlbGVtLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZWxlbS52YWx1ZTtcblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIHZhbHVlICk7XG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnZhbHVlID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdHZhciBuYW1lLFxuXHRcdFx0aSA9IDAsXG5cblx0XHRcdC8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnNcblx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2F0dHJpYnV0ZXMtMlxuXHRcdFx0YXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKTtcblxuXHRcdGlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHR3aGlsZSAoICggbmFtZSA9IGF0dHJOYW1lc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlc1xuYm9vbEhvb2sgPSB7XG5cdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkge1xuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlXG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gbmFtZTtcblx0fVxufTtcblxualF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXFx3Ky9nICksIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHR2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7XG5cblx0YXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciByZXQsIGhhbmRsZSxcblx0XHRcdGxvd2VyY2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRpZiAoICFpc1hNTCApIHtcblxuXHRcdFx0Ly8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlclxuXHRcdFx0aGFuZGxlID0gYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0O1xuXHRcdFx0cmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgP1xuXHRcdFx0XHRsb3dlcmNhc2VOYW1lIDpcblx0XHRcdFx0bnVsbDtcblx0XHRcdGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn0gKTtcblxuXG5cblxudmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyY2xpY2thYmxlID0gL14oPzphfGFyZWEpJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkZWxldGUgdGhpc1sgalF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lIF0
211677XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbGVtWyBuYW1lIF07XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdFx0XHQvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGVcblx0XHRcdFx0Ly8gY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0XG5cdFx0XHRcdC8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0L1xuXHRcdFx0XHQvLyBVc2UgcHJvcGVyIGF0dHJpYnV0ZSByZXRyaWV2YWwoIzEyMDcyKVxuXHRcdFx0XHR2YXIgdGFiaW5kZXggPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInRhYmluZGV4XCIgKTtcblxuXHRcdFx0XHRpZiAoIHRhYmluZGV4ICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHxcblx0XHRcdFx0XHRyY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJlxuXHRcdFx0XHRcdGVsZW0uaHJlZlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cHJvcEZpeDoge1xuXHRcdFwiZm9yXCI6IFwiaHRtbEZvclwiLFxuXHRcdFwiY2xhc3NcIjogXCJjbGFzc05hbWVcIlxuXHR9XG59ICk7XG5cbi8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuLy8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5XG4vLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkXG4vLyBvbiB0aGUgb3B0aW9uXG4vLyBUaGUgZ2V0dGVyIGVuc3VyZXMgYSBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZFxuLy8gd2hlbiBpbiBhbiBvcHRncm91cFxuLy8gZXNsaW50IHJ1bGUgXCJuby11bnVzZWQtZXhwcmVzc2lvbnNcIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlXG4vLyBzaW5jZSBpdCBjb25zaWRlcnMgc3VjaCBhY2Nlc3Npb25zIG5vb3BcbmlmICggIXN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7XG5cdGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0LyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogXCJvZmZcIiAqL1xuXG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgJiYgcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0XHRpZiAoIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSApO1xuXG5cblxuXG5cdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byBIVE1MIHNwZWNcblx0Ly8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlXG5cdGZ1bmN0aW9uIHN0cmlwQW5kQ29sbGFwc2UoIHZhbHVlICkge1xuXHRcdHZhciB0b2tlbnMgPSB2YWx1ZS
211675tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXHRcdHJldHVybiB0b2tlbnMuam9pbiggXCIgXCIgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkge1xuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHtcblx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblx0fVxuXHRyZXR1cm4gW107XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCBjbGFzc2VzLmxlbmd0aCApIHtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApO1xuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBjdXJWYWx1ZSApICsgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPCAwICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgKz0gY2xhenogKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hdHRyKCBcImNsYXNzXCIsIFwiXCIgKTtcblx0XHR9XG5cblx0XHRjbGFzc2VzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIGNsYXNzZXMubGVuZ3RoICkge1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlICphbGwqIGluc3RhbmNlc1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhenogKyBcIiBcIiwgXCIgXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkge1xuXHRcdHZhciB0eXBlID0gdHlwZW9mIHZhbHVlLFxuXHRcdFx0aXNWYWxpZFZhbHVlID0gdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBBcnJheS5pc0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09IFwiYm9vbGVhblwiICYmIGlzVmFsaWRWYWx1ZSApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyhcblx0XHRcdFx0XHR2YWx1ZS
211675jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLFxuXHRcdFx0XHRcdHN0YXRlVmFsXG5cdFx0XHRcdCk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgY2xhc3NOYW1lLCBpLCBzZWxmLCBjbGFzc05hbWVzO1xuXG5cdFx0XHRpZiAoIGlzVmFsaWRWYWx1ZSApIHtcblxuXHRcdFx0XHQvLyBUb2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lc1xuXHRcdFx0XHRpID0gMDtcblx0XHRcdFx0c2VsZiA9IGpRdWVyeSggdGhpcyApO1xuXHRcdFx0XHRjbGFzc05hbWVzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRcdFx0d2hpbGUgKCAoIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdICkgKSB7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0Y2xhc3NOYW1lID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0aWYgKCBjbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdGlmICggdGhpcy5zZXRBdHRyaWJ1dGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIixcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0XHRcdFx0XCJcIiA6XG5cdFx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiICkgfHwgXCJcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0aGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgY2xhc3NOYW1lLCBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRjbGFzc05hbWUgPSBcIiBcIiArIHNlbGVjdG9yICsgXCIgXCI7XG5cdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBnZXRDbGFzcyggZWxlbSApICkgKyBcIiBcIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBycmV0dXJuID0gL1xcci9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHZhbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0XHRpZiAoIGhvb2tzICYmXG5cdFx0XHRcdFx0XCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSApICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldCA9IGVsZW0udmFsdWU7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlc1xuXHRcdFx0XHRpZiAoIHR5cGVvZiByZXQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldC5yZXBsYWNlKCBycmV0dXJuLCBcIlwiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcblx0XHRcdFx0cmV0dXJuIHJldCA9PSBudWxsID8gXCJcIiA6IHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhbHVlSXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdHZhciB2YWw7XG5cblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbHVlSXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWwgKz
211670gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIjtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgXCJ2YWx1ZVwiICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHR2YWxIb29rczoge1xuXHRcdG9wdGlvbjoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSBvbmx5XG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKCMxNDY4NiwgIzE0ODU4KVxuXHRcdFx0XHRcdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlXG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtYW5kLWNvbGxhcHNlLXdoaXRlc3BhY2Vcblx0XHRcdFx0XHRzdHJpcEFuZENvbGxhcHNlKCBqUXVlcnkudGV4dCggZWxlbSApICk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZWxlY3Q6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSwgb3B0aW9uLCBpLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0aW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsXG5cdFx0XHRcdFx0b25lID0gZWxlbS50eXBlID09PSBcInNlbGVjdC1vbmVcIixcblx0XHRcdFx0XHR2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sXG5cdFx0XHRcdFx0bWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0aWYgKCBpbmRleCA8IDAgKSB7XG5cdFx0XHRcdFx0aSA9IG1heDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGkgPSBvbmUgPyBpbmRleCA6IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0Ly8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpXG5cdFx0XHRcdFx0aWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmXG5cblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQhb3B0aW9uLmRpc2FibGVkICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8XG5cdFx0XHRcdFx0XHRcdFx0IW5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tY29uZC1hc3NpZ24gKi9cblxuXHRcdFx0XHRcdGlmICggb3B0aW9uLnNlbGVjdGVkID1cblx0XHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBqUXVlcnkudmFsSG9va3Mub3B0aW9uLmdldCggb3B0aW9uICksIHZhbHVlcyApID4gLTFcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvblNldCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRm9yY2UgYnJvd3NlcnMgdG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1ZSBpcyBzZXRcblx0XHRcdFx0aWYgKCAhb3B0aW9uU2V0ICkge1xuXHRcdFx0XHRcdGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaCggWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIEFycmF
211675LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRpZiAoICFzdXBwb3J0LmNoZWNrT24gKSB7XG5cdFx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0uZ2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiApID09PSBudWxsID8gXCJvblwiIDogZWxlbS52YWx1ZTtcblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb25cblxuXG5zdXBwb3J0LmZvY3VzaW4gPSBcIm9uZm9jdXNpblwiIGluIHdpbmRvdztcblxuXG52YXIgcmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sXG5cdHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24oIGUgKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0fTtcblxualF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmV2ZW50LCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7XG5cblx0XHR2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCxcblx0XHRcdGV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLFxuXHRcdFx0dHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgXCJ0eXBlXCIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCxcblx0XHRcdG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwibmFtZXNwYWNlXCIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdCggXCIuXCIgKSA6IFtdO1xuXG5cdFx0Y3VyID0gbGFzdEVsZW1lbnQgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKCBcIi5cIiApID4gLTEgKSB7XG5cblx0XHRcdC8vIE5hbWVzcGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFuZGxlKClcblx0XHRcdG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCBcIi5cIiApO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoIFwiOlwiICkgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKTtcblx0XHRldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApIDpcblx0XHRcdG51bGw7XG5cblx0XHQvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWRcblx0XHRldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZWxlbTtcblx0XHR9XG5cblx0XHQvLyBDbG9uZSBhbnkgaW5jb21pbmcgZGF0YSBhbmQgcHJlcGVuZCB0aGUgZXZlbnQsIGNyZWF0aW5nIHRoZSBoYW5kbGVyIGFyZyBsaXN0XG5cdFx0ZGF0YSA9IGRhdGEgPT0gbnVsbCA/XG5cdFx0XHRbIGV2ZW50IF0gOlxuXHRcdFx0alF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7XG5cblx0XHQvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzXG5cdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpXG5cdFx0Ly8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNClcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlO1xuXHRcdFx0aWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHtcblx0XHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0dG1wID0gY3VyO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPbmx5IGFkZCB3aW5kb3cgaWYgd2UgZ290IHRvIGRvY3VtZW50IChlLmcuLCBub3QgcGxhaW4gb2JqIG9yIGRldGFjaGVkIERPTSlcblx0XHRcdGlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2luZG93ICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aFxuXHRcdGkgPSAwO1xuXHRcdHd
21167oaWxlICggKCBjdXIgPSBldmVudFBhdGhbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRsYXN0RWxlbWVudCA9IGN1cjtcblx0XHRcdGV2ZW50LnR5cGUgPSBpID4gMSA/XG5cdFx0XHRcdGJ1YmJsZVR5cGUgOlxuXHRcdFx0XHRzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7XG5cblx0XHRcdC8vIGpRdWVyeSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSAoIGRhdGFQcml2LmdldCggY3VyLCBcImV2ZW50c1wiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmXG5cdFx0XHRcdGRhdGFQcml2LmdldCggY3VyLCBcImhhbmRsZVwiICk7XG5cdFx0XHRpZiAoIGhhbmRsZSApIHtcblx0XHRcdFx0aGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmF0aXZlIGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdO1xuXHRcdFx0aWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoICggIXNwZWNpYWwuX2RlZmF1bHQgfHxcblx0XHRcdFx0c3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiZcblx0XHRcdFx0YWNjZXB0RGF0YSggZWxlbSApICkge1xuXG5cdFx0XHRcdC8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZXZlbnQuXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MClcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXG5cdFx0XHRcdFx0aWYgKCBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0XHRcdFx0bGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtWyB0eXBlIF0oKTtcblxuXHRcdFx0XHRcdGlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmVcblx0Ly8gVXNlZCBvbmx5IGZvciBgZm9jdXMoaW4gfCBvdXQpYCBldmVudHNcblx0c2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVtLCBldmVudCApIHtcblx0XHR2YXIgZSA9IGpRdWVyeS5leHRlbmQoXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCksXG5cdFx0XHRldmVudCxcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0aXNTaW11bGF0ZWQ6IHRydWVcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblx0fVxuXG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSApO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxuLy8gU3VwcG9ydDogRmlyZWZveCA8PTQ0XG4vLyBGaXJlZm94IGRvZXNuJ3QgaGF2ZSBmb2N1cyhpbiB8IG91dCkgZXZlbnRzXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96
21167aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4N1xuLy9cbi8vIFN1cHBvcnQ6IENocm9tZSA8PTQ4IC0gNDksIFNhZmFyaSA8PTkuMCAtIDkuMVxuLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsXG4vLyB3aGljaCBpcyBzcGVjIHZpb2xhdGlvbiAtIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWZvY3VzZXZlbnQtZXZlbnQtb3JkZXJcbi8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ5ODU3XG5pZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7XG5cdGpRdWVyeS5lYWNoKCB7IGZvY3VzOiBcImZvY3VzaW5cIiwgYmx1cjogXCJmb2N1c291dFwiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cblx0XHQvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dFxuXHRcdHZhciBoYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSApO1xuXHRcdH07XG5cblx0XHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdFx0fSxcblx0XHRcdHRlYXJkb3duOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZG9jLCBmaXggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsIGF0dGFjaGVzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9ICk7XG59XG52YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247XG5cbnZhciBub25jZSA9IERhdGUubm93KCk7XG5cbnZhciBycXVlcnkgPSAoIC9cXD8vICk7XG5cblxuXG4vLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXG5qUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0dmFyIHhtbDtcblx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdC8vIElFIHRocm93cyBvbiBwYXJzZUZyb21TdHJpbmcgd2l0aCBpbnZhbGlkIGlucHV0LlxuXHR0cnkge1xuXHRcdHhtbCA9ICggbmV3IHdpbmRvdy5ET01QYXJzZXIoKSApLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgXCJ0ZXh0L3htbFwiICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHhtbCA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGlmICggIXhtbCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwicGFyc2VyZXJyb3JcIiApLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgZGF0YSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhclxuXHRyYnJhY2tldCA9IC9cXFtcXF0kLyxcblx0ckNSTEYgPSAvXFxyP1xcbi9nLFxuXHRyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksXG5cdHJzdWJtaXR0YWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtcblxuZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkge1xuXHR2YXIgbmFtZTtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXG5cdFx0alF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7XG5cdFx0XHRpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkge1xuXG5cdFx0XHRcdC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC5cblx0XHRcdFx0YnVpbGRQYXJhbXMoXG5cdFx0XHRcdFx0cHJlZml4ICsgXCJbXCIgKyAoIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT0gbnVsbCA/IGkgOiBcIlwiICkgKyBcIl1cIixcblx0XHRcdFx0XHR2LFxuXHRcdFx0XHRcdHRyYWRpdGlvbmFsLFxuXHRcdFx0XHRcdGFkZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHR9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArIG5hbWUgKyBcIl1cIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS5cblx0XHRhZGQoIHByZWZpeCwgb2JqICk7XG5cdH1cbn1cblxuLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2Zcbi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZ1xualF1ZXJ5LnBhcmFtID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkge1xuXHR2YXIgcHJlZml4LFxuXHRcdHMgPSBbXSxcblx0XHRhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgdXNlIGl0cyByZXR1cm4gdmFsdWVcblx0XHRcdHZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID9cblx0XHRcdFx0dmFsdWVPckZ1bmN0aW9uKCkgOlxuXHRcdFx0XHR2YWx1ZU9yRnVuY3Rpb247XG5cblx0XHRcdHNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgXCI9XCIgK1xuXHRcdFx0XHRlbmNvZGVVUklDb21wb25lbnQoIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKTtcblx0XHR9O1xuXG5cdC8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuXG5cdGlmICggQXJyYXkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50c1xuXHRcdGpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHtcblx0XHRcdGFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7XG5cdFx0fSApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSBcIm9sZFwiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlclxuXHRcdC8vIGRpZCBpdCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LlxuXHRcdGZvciAoIHByZWZpeCBpbiBhICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4IF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uXG5cdHJldHVybi
21167BzLmpvaW4oIFwiJlwiICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7XG5cdH0sXG5cdHNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBDYW4gYWRkIHByb3BIb29rIGZvciBcImVsZW1lbnRzXCIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzXG5cdFx0XHR2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgXCJlbGVtZW50c1wiICk7XG5cdFx0XHRyZXR1cm4gZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KCBlbGVtZW50cyApIDogdGhpcztcblx0XHR9IClcblx0XHQuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0XHQvLyBVc2UgLmlzKCBcIjpkaXNhYmxlZFwiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3Ncblx0XHRcdHJldHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCBcIjpkaXNhYmxlZFwiICkgJiZcblx0XHRcdFx0cnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVzLnRlc3QoIHR5cGUgKSAmJlxuXHRcdFx0XHQoIHRoaXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7XG5cdFx0fSApXG5cdFx0Lm1hcCggZnVuY3Rpb24oIGksIGVsZW0gKSB7XG5cdFx0XHR2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7XG5cblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHR9ICkuZ2V0KCk7XG5cdH1cbn0gKTtcblxuXG52YXJcblx0cjIwID0gLyUyMC9nLFxuXHRyaGFzaCA9IC8jLiokLyxcblx0cmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLyxcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL21nLFxuXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cdG9yaWdpbkFuY2hvci5ocmVmID0gbG9jYXRpb24uaHJlZjtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblxuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbIDAgXSA9PT0gXCIrXCIgKSB7XG5cdFx0XHRcdFx0ZGF0YVR5cGUgPSBkYXRhV
21167HlwZS5zbGljZSggMSApIHx8IFwiKlwiO1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXG5cdFx0XHRcdG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0aW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkge1xuXHRcdFx0XHRyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyAjOTg4N1xuZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7XG5cdHZhciBrZXksIGRlZXAsXG5cdFx0ZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9O1xuXG5cdGZvciAoIGtleSBpbiBzcmMgKSB7XG5cdFx0aWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHQoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdO1xuXHRcdH1cblx0fVxuXHRpZiAoIGRlZXAgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVwICk7XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6XG4gKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKVxuICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7XG5cblx0dmFyIGN0LCB0eXBlLCBmaW5hbERhdGFUeXBlLCBmaXJzdERhdGFUeXBlLFxuXHRcdGNvbnRlbnRzID0gcy5jb250ZW50cyxcblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcztcblxuXHQvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2Vzc1xuXHR3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSBcIipcIiApIHtcblx0XHRkYXRhVHlwZXMuc2hpZnQoKTtcblx0XHRpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGVcblx0aWYgKCBjdCApIHtcblx0XHRmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkge1xuXHRcdFx0aWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHtcblx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlXG5cdGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkge1xuXHRcdGZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTtcblx0fSBlbHNlIHtcblxuXHRcdC8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXNcblx0XHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcblx0XHRcdGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArIFwiIFwiICsgZGF0YVR5cGVzWyAwIF0gXSApIHtcblx0XHRcdFx0ZmluYWxEYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAhZmlyc3REYXRhVHlwZSApIHtcblx0XHRcdFx0Zmlyc3REYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gT3IganVzdCB1c2UgZmlyc3Qgb25lXG5cdFx0ZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTtcblx0fVxuXG5cdC8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGVcblx0Ly8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWRcblx0Ly8gYW5kIHJldHVybi
21167B0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuXHRpZiAoIGZpbmFsRGF0YVR5cGUgKSB7XG5cdFx0aWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHtcblx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7XG5cdFx0fVxuXHRcdHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTtcblx0fVxufVxuXG4vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlXG4gKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUganFYSFIgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICkge1xuXHR2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldixcblx0XHRjb252ZXJ0ZXJzID0ge30sXG5cblx0XHQvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKTtcblxuXHQvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXNcblx0aWYgKCBkYXRhVHlwZXNbIDEgXSApIHtcblx0XHRmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHtcblx0XHRcdGNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07XG5cdFx0fVxuXHR9XG5cblx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdC8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlXG5cdHdoaWxlICggY3VycmVudCApIHtcblxuXHRcdGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkge1xuXHRcdFx0anFYSFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWRcblx0XHRpZiAoICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRhdGFGaWx0ZXIgKSB7XG5cdFx0XHRyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTtcblx0XHR9XG5cblx0XHRwcmV2ID0gY3VycmVudDtcblx0XHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0XHRpZiAoIGN1cnJlbnQgKSB7XG5cblx0XHRcdC8vIFRoZXJlJ3Mgb25seSB3b3JrIHRvIGRvIGlmIGN1cnJlbnQgZGF0YVR5cGUgaXMgbm9uLWF1dG9cblx0XHRcdGlmICggY3VycmVudCA9PT0gXCIqXCIgKSB7XG5cblx0XHRcdFx0Y3VycmVudCA9IHByZXY7XG5cblx0XHRcdC8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnRcblx0XHRcdH0gZWxzZSBpZiAoIHByZXYgIT09IFwiKlwiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXJcblx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyBcIiogXCIgKyBjdXJyZW50IF07XG5cblx0XHRcdFx0Ly8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXJcblx0XHRcdFx0aWYgKCAhY29udiApIHtcblx0XHRcdFx0XHRmb3IgKCBjb252MiBpbiBjb252ZXJ0ZXJzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnRcblx0XHRcdFx0XHRcdHRtcCA9IGNvbnYyLnNwbGl0KCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0aWYgKCB0bXBbIDEgXSA9PT0gY3VycmVudCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXRcblx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIHRtcFsgMCBdIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJzWyBcIiogXCIgKyB0bXBbIDAgXSBdO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjb252ID09PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgaW50ZXJtZWRpYXRlIGRhdGFUeXBlXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnQgPSB0bXBbIDAgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNlKVxuXHRcdFx0XHRpZiAoIGNvbnYgIT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHQvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtXG5cdFx0XHRcdFx0aWYgKCBjb252ICYmIHMudGhyb3dzICkge1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZTogXCJwYXJzZXJlcnJvclwiLFxuXHRcdFx0XHRcdFx0XHRcdGVycm9yOiBjb252ID8gZSA6IFwiTm8gY29udmVyc2lvbiBmcm9tIFwiICsgcHJldiArIFwiIHRvIFwiICsgY3VycmVudFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybi
21167B7IHN0YXRlOiBcInN1Y2Nlc3NcIiwgZGF0YTogcmVzcG9uc2UgfTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIENvdW50ZXIgZm9yIGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUgcXVlcmllc1xuXHRhY3RpdmU6IDAsXG5cblx0Ly8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdFxuXHRsYXN0TW9kaWZpZWQ6IHt9LFxuXHRldGFnOiB7fSxcblxuXHRhamF4U2V0dGluZ3M6IHtcblx0XHR1cmw6IGxvY2F0aW9uLmhyZWYsXG5cdFx0dHlwZTogXCJHRVRcIixcblx0XHRpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLFxuXHRcdGdsb2JhbDogdHJ1ZSxcblx0XHRwcm9jZXNzRGF0YTogdHJ1ZSxcblx0XHRhc3luYzogdHJ1ZSxcblx0XHRjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIixcblxuXHRcdC8qXG5cdFx0dGltZW91dDogMCxcblx0XHRkYXRhOiBudWxsLFxuXHRcdGRhdGFUeXBlOiBudWxsLFxuXHRcdHVzZXJuYW1lOiBudWxsLFxuXHRcdHBhc3N3b3JkOiBudWxsLFxuXHRcdGNhY2hlOiBudWxsLFxuXHRcdHRocm93czogZmFsc2UsXG5cdFx0dHJhZGl0aW9uYWw6IGZhbHNlLFxuXHRcdGhlYWRlcnM6IHt9LFxuXHRcdCovXG5cblx0XHRhY2NlcHRzOiB7XG5cdFx0XHRcIipcIjogYWxsVHlwZXMsXG5cdFx0XHR0ZXh0OiBcInRleHQvcGxhaW5cIixcblx0XHRcdGh0bWw6IFwidGV4dC9odG1sXCIsXG5cdFx0XHR4bWw6IFwiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbFwiLFxuXHRcdFx0anNvbjogXCJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHRcIlxuXHRcdH0sXG5cblx0XHRjb250ZW50czoge1xuXHRcdFx0eG1sOiAvXFxieG1sXFxiLyxcblx0XHRcdGh0bWw6IC9cXGJodG1sLyxcblx0XHRcdGpzb246IC9cXGJqc29uXFxiL1xuXHRcdH0sXG5cblx0XHRyZXNwb25zZUZpZWxkczoge1xuXHRcdFx0eG1sOiBcInJlc3BvbnNlWE1MXCIsXG5cdFx0XHR0ZXh0OiBcInJlc3BvbnNlVGV4dFwiLFxuXHRcdFx0anNvbjogXCJyZXNwb25zZUpTT05cIlxuXHRcdH0sXG5cblx0XHQvLyBEYXRhIGNvbnZlcnRlcnNcblx0XHQvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgXCIqXCIpIGFuZCBkZXN0aW5hdGlvbiB0eXBlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG5cdFx0Y29udmVydGVyczoge1xuXG5cdFx0XHQvLyBDb252ZXJ0IGFueXRoaW5nIHRvIHRleHRcblx0XHRcdFwiKiB0ZXh0XCI6IFN0cmluZyxcblxuXHRcdFx0Ly8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pXG5cdFx0XHRcInRleHQgaHRtbFwiOiB0cnVlLFxuXG5cdFx0XHQvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uXG5cdFx0XHRcInRleHQganNvblwiOiBKU09OLnBhcnNlLFxuXG5cdFx0XHQvLyBQYXJzZSB0ZXh0IGFzIHhtbFxuXHRcdFx0XCJ0ZXh0IHhtbFwiOiBqUXVlcnkucGFyc2VYTUxcblx0XHR9LFxuXG5cdFx0Ly8gRm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDpcblx0XHQvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmXG5cdFx0Ly8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmVcblx0XHQvLyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZClcblx0XHRmbGF0T3B0aW9uczoge1xuXHRcdFx0dXJsOiB0cnVlLFxuXHRcdFx0Y29udGV4dDogdHJ1ZVxuXHRcdH1cblx0fSxcblxuXHQvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldFxuXHQvLyB3aXRoIGJvdGggYWpheFNldHRpbmdzIGFuZCBzZXR0aW5ncyBmaWVsZHMuXG5cdC8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuXG5cdGFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzID9cblxuXHRcdFx0Ly8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3Rcblx0XHRcdGFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDpcblxuXHRcdFx0Ly8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5nc1xuXHRcdFx0YWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7XG5cdH0sXG5cblx0YWpheFByZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzICksXG5cdGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLFxuXG5cdC8vIE1haW4gbWV0aG9kXG5cdGFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBJZiB1cmwgaXMgYW4gb2JqZWN0LCBzaW11bGF0ZSBwcmUtMS41IHNpZ25hdHVyZVxuXHRcdGlmICggdHlwZW9mIHVybCA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB1cmw7XG5cdFx0XHR1cmwgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3Rcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdHZhciB0cmFuc3BvcnQsXG5cblx0XHRcdC8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW1cblx0XHRcdGNhY2hlVVJMLFxuXG5cdFx0XHQvLyBSZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcsXG5cdFx0XHRyZXNwb25zZUhlYWRlcnMsXG5cblx0XHRcdC8vIHRpbWVvdXQgaGFuZGxlXG5cdFx0XHR0aW1lb3V0VGltZXIsXG5cblx0XHRcdC8vIFVybCBjbGVhbnVwIHZhclxuXHRcdFx0dXJsQW5jaG9yLFxuXG5cdFx0XHQvLyBSZXF1ZXN0IHN0YXRlIChiZWNvbWVzIGZhbHNlIHVwb24gc2VuZCBhbmQgdHJ1ZSB1cG9uIGNvbXBsZXRpb24pXG5cdFx0XHRjb21wbGV0ZWQsXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZFxuXHRcdFx0ZmlyZUdsb2JhbHMsXG5cblx0XHRcdC8vIExvb3AgdmFyaWFibGVcblx0XHRcdGksXG5cblx0XHRcdC8vIHVuY2FjaGVkIHBhcnQgb2YgdGhlIHVybFxuXHRcdFx0dW5jYWNoZWQsXG5cblx0XHRcdC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3Rcblx0XHRcdHMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLFxuXG5cdFx0XHQvLyBDYWxsYmFja3MgY29udGV4dFxuXHRcdFx0Y2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsXG5cblx0XHRcdC8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHMgaXMgY2FsbGJhY2tDb250ZXh0IGlmIGl0IGlzIGEgRE9NIG5vZGUgb3IgalF1ZXJ5IGNvbGxlY3Rpb25cblx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dCA9IHMuY29udGV4dCAmJlxuXHRcdFx0XHQoIGNhbGxiYWNrQ29udGV4dC5ub2RlVHlwZSB8fCBjYWxsYmFja0NvbnRleHQuanF1ZXJ5ICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOlxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudCxcblxuXHRcdFx0Ly8gRGVmZXJyZWRzXG5cdFx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcblx0XHRcdHJlcXVlc3RIZWFkZXJzID0ge30sXG5cdFx0XHRyZXF1
21167ZXN0SGVhZGVyc05hbWVzID0ge30sXG5cblx0XHRcdC8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZVxuXHRcdFx0c3RyQWJvcnQgPSBcImNhbmNlbGVkXCIsXG5cblx0XHRcdC8vIEZha2UgeGhyXG5cdFx0XHRqcVhIUiA9IHtcblx0XHRcdFx0cmVhZHlTdGF0ZTogMCxcblxuXHRcdFx0XHQvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHRcdHZhciBtYXRjaDtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0XHRcdGlmICggIXJlc3BvbnNlSGVhZGVycyApIHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzID0ge307XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgXSA9IG1hdGNoWyAyIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gPVxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdFx0anFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzXG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0dmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XG5cdFx0XHRcdFx0aWYgKCB0cmFuc3BvcnQgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb25lKCAwLCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBkZWZlcnJlZHNcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApO1xuXG5cdFx0Ly8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpXG5cdFx0Ly8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSlcblx0XHQvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGVcblx0XHRzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgXCJcIiApXG5cdFx0XHQucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiApO1xuXG5cdFx0Ly8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0XG5cdFx0cy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTtcblxuXHRcdC8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3Rcblx0XHRzLmRhdGFUeXBlcyA9ICggcy5kYXRhV
21167HlwZSB8fCBcIipcIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbIFwiXCIgXTtcblxuXHRcdC8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLlxuXHRcdGlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkge1xuXHRcdFx0dXJsQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJhXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEsIEVkZ2UgMTIgLSAxNVxuXHRcdFx0Ly8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCxcblx0XHRcdC8vIGUuZy4gaHR0cDovL2V4YW1wbGUuY29tOjgweC9cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gcy51cmw7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEgb25seVxuXHRcdFx0XHQvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZVxuXHRcdFx0XHR1cmxBbmNob3IuaHJlZiA9IHVybEFuY2hvci5ocmVmO1xuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gb3JpZ2luQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09XG5cdFx0XHRcdFx0dXJsQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgdXJsQW5jaG9yLmhvc3Q7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbixcblx0XHRcdFx0Ly8gaXQgY2FuIGJlIHJlamVjdGVkIGJ5IHRoZSB0cmFuc3BvcnQgaWYgaXQgaXMgaW52YWxpZFxuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmdcblx0XHRpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHByZWZpbHRlcnNcblx0XHRpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlXG5cdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cgaWYgYXNrZWQgdG9cblx0XHQvLyBEb24ndCBmaXJlIGV2ZW50cyBpZiBqUXVlcnkuZXZlbnQgaXMgdW5kZWZpbmVkIGluIGFuIEFNRC11c2FnZSBzY2VuYXJpbyAoIzE1MTE4KVxuXHRcdGZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0c1xuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0YXJ0XCIgKTtcblx0XHR9XG5cblx0XHQvLyBVcHBlcmNhc2UgdGhlIHR5cGVcblx0XHRzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50XG5cdFx0cy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7XG5cblx0XHQvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2Vcblx0XHQvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb25cblx0XHQvLyBSZW1vdmUgaGFzaCB0byBzaW1wbGlmeSB1cmwgbWFuaXB1bGF0aW9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybC5yZXBsYWNlKCByaGFzaCwgXCJcIiApO1xuXG5cdFx0Ly8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnRcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBoYXNoIHNvIHdlIGNhbiBwdXQgaXQgYmFja1xuXHRcdFx0dW5jYWNoZWQgPSBzLnVybC5zbGljZSggY2FjaGVVUkwubGVuZ3RoICk7XG5cblx0XHRcdC8vIElmIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkLCBhcHBlbmQgZGF0YSB0byB1cmxcblx0XHRcdGlmICggcy5kYXRhICYmICggcy5wcm9jZXNzRGF0YSB8fCB0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICkgKSB7XG5cdFx0XHRcdGNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGE7XG5cblx0XHRcdFx0Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeVxuXHRcdFx0XHRkZWxldGUgcy5kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkXG5cdFx0XHRpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRjYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsIFwiJDFcIiApO1xuXHRcdFx0XHR1bmNhY2hlZCA9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBcIl89XCIgKyAoIG5vbmNlKysgKSArIHVuY2FjaGVkO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQdXQgaGFzaCBhbmQgYW50aS1jYWNoZSBvbiB0aGUgVVJMIHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQgKGdoLTE3MzIpXG5cdFx0XHRzLnVybCA9IGNhY2hlVVJMICsgdW5jYWNoZWQ7XG5cblx0XHQvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OClcblx0XHR9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJlxuXHRcdFx0KCBzLmNvbnRlbn
21167RUeXBlIHx8IFwiXCIgKS5pbmRleE9mKCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICkgPT09IDAgKSB7XG5cdFx0XHRzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCBcIitcIiApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTW9kaWZpZWQtU2luY2VcIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50XG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZVxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXG5cdFx0XHRcIkFjY2VwdFwiLFxuXHRcdFx0cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/XG5cdFx0XHRcdHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdICtcblx0XHRcdFx0XHQoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxuXHRcdFx0XHRzLmFjY2VwdHNbIFwiKlwiIF1cblx0XHQpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uXG5cdFx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcblx0XHRpZiAoIHMuYmVmb3JlU2VuZCAmJlxuXHRcdFx0KCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuXG5cdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcblx0XHR9XG5cblx0XHQvLyBBYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb25cblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkc1xuXHRcdGNvbXBsZXRlRGVmZXJyZWQuYWRkKCBzLmNvbXBsZXRlICk7XG5cdFx0anFYSFIuZG9uZSggcy5zdWNjZXNzICk7XG5cdFx0anFYSFIuZmFpbCggcy5lcnJvciApO1xuXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxuXHRcdHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XG5cdFx0aWYgKCAhdHJhbnNwb3J0ICkge1xuXHRcdFx0ZG9uZSggLTEsIFwiTm8gVHJhbnNwb3J0XCIgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IDE7XG5cblx0XHRcdC8vIFNlbmQgZ2xvYmFsIGV2ZW50XG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYWpheFNlbmQsIHN0b3AgdGhlcmVcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpbWVvdXRcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xuXHRcdFx0XHR0aW1lb3V0VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0anFYSFIuYWJvcnQoIFwidGltZW91dFwiICk7XG5cdFx0XHRcdH0sIHMudGltZW91dCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb21wbGV0ZWQgPSBmYWxzZTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBSZXRocm93IHBvc3QtY29tcGxldGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHNcblx0XHRcdFx0ZG9uZSggLTEsIGUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmVcblx0XHRmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHtcblx0XHRcdHZhciBpc1N1Y2Nlc3MsIHN1Y2Nlc3MsIGVycm9yLCByZXNwb25zZSwgbW9kaWZpZWQsXG5cdFx0XHRcdHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0O1xuXG5cdFx0XHQvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zXG5cdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb21wbGV0ZWQgPSB0cnVlO1xuXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKCB0aW1lb3V0VGltZXIgKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXRUaW
211671lciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvblxuXHRcdFx0Ly8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZClcblx0XHRcdHRyYW5zcG9ydCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0Ly8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTZXQgcmVhZHlTdGF0ZVxuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDtcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIGlmIHN1Y2Nlc3NmdWxcblx0XHRcdGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0O1xuXG5cdFx0XHQvLyBHZXQgcmVzcG9uc2UgZGF0YVxuXHRcdFx0aWYgKCByZXNwb25zZXMgKSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IG5vIG1hdHRlciB3aGF0ICh0aGF0IHdheSByZXNwb25zZVhYWCBmaWVsZHMgYXJlIGFsd2F5cyBzZXQpXG5cdFx0XHRyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApO1xuXG5cdFx0XHQvLyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZ1xuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cblx0XHRcdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRcdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJMYXN0LU1vZGlmaWVkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcImV0YWdcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGlmIG5vIGNvbnRlbnRcblx0XHRcdFx0aWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09IFwiSEVBRFwiICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vY29udGVudFwiO1xuXG5cdFx0XHRcdC8vIGlmIG5vdCBtb2RpZmllZFxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub3Rtb2RpZmllZFwiO1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTtcblx0XHRcdFx0XHRzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0XHRlcnJvciA9IHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdGlzU3VjY2VzcyA9ICFlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBFeHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dCBhbmQgbm9ybWFsaXplIGZvciBub24tYWJvcnRzXG5cdFx0XHRcdGVycm9yID0gc3RhdHVzVGV4dDtcblx0XHRcdFx0aWYgKCBzdGF0dXMgfHwgIXN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwiZXJyb3JcIjtcblx0XHRcdFx0XHRpZiAoIHN0YXR1cyA8IDAgKSB7XG5cdFx0XHRcdFx0XHRzdGF0dXMgPSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdFxuXHRcdFx0anFYSFIuc3RhdHVzID0gc3RhdHVzO1xuXHRcdFx0anFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyBcIlwiO1xuXG5cdFx0XHQvLyBTdWNjZXNzL0Vycm9yXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdGpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTtcblx0XHRcdHN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyBcImFqYXhTdWNjZXNzXCIgOiBcImFqYXhFcnJvclwiLFxuXHRcdFx0XHRcdFsganFYSFIsIHMsIGlzU3VjY2VzcyA/IHN1Y2Nlc3MgOiBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbXBsZXRlXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4Q29tcGxldGVcIiwgWyBqcVhIUiwgcyBdICk7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyXG5cdFx0XHRcdGlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0b3BcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpxWEhSO1xuXHR9LFxuXG5cdGdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybi
21167BqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCBcImpzb25cIiApO1xuXHR9LFxuXG5cdGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgXCJzY3JpcHRcIiApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiZ2V0XCIsIFwicG9zdFwiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7XG5cdGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHtcblxuXHRcdC8vIFNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBkYXRhICkgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBjYWxsYmFjaztcblx0XHRcdGNhbGxiYWNrID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIHVybCBjYW4gYmUgYW4gb3B0aW9ucyBvYmplY3QgKHdoaWNoIHRoZW4gbXVzdCBoYXZlIC51cmwpXG5cdFx0cmV0dXJuIGpRdWVyeS5hamF4KCBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHR1cmw6IHVybCxcblx0XHRcdHR5cGU6IG1ldGhvZCxcblx0XHRcdGRhdGFUeXBlOiB0eXBlLFxuXHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdHN1Y2Nlc3M6IGNhbGxiYWNrXG5cdFx0fSwgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHVybCApICYmIHVybCApICk7XG5cdH07XG59ICk7XG5cblxualF1ZXJ5Ll9ldmFsVXJsID0gZnVuY3Rpb24oIHVybCApIHtcblx0cmV0dXJuIGpRdWVyeS5hamF4KCB7XG5cdFx0dXJsOiB1cmwsXG5cblx0XHQvLyBNYWtlIHRoaXMgZXhwbGljaXQsIHNpbmNlIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgdGhyb3VnaCBhamF4U2V0dXAgKCMxMTI2NClcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxuXHRcdGNhY2hlOiB0cnVlLFxuXHRcdGFzeW5jOiBmYWxzZSxcblx0XHRnbG9iYWw6IGZhbHNlLFxuXHRcdFwidGhyb3dzXCI6IHRydWVcblx0fSApO1xufTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdFx0aHRtbCA9IGh0bWwuY2FsbCggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kXG5cdFx0XHR3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCApLmVxKCAwICkuY2xvbmUoIHRydWUgKTtcblxuXHRcdFx0aWYgKCB0aGlzWyAwIF0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHR3cmFwLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gdGhpcztcblxuXHRcdFx0XHR3aGlsZSAoIGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQgKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZWxlbTtcblx0XHRcdH0gKS5hcHBlbmQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWxJc0Z1bmN0aW9uID8gaHRtbC5jYWxsKCB0aGlzLCBpICkgOiBodG1sICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHVud3JhcDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHRoaXMucGFyZW50KCBzZWxlY3RvciApLm5vdCggXCJib2R5XCIgKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTtcblx0XHR9ICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApO1xufTtcbmpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gISEoIGVsZW0ub2Zmc2V0V2lkdGggfHwgZWxlbS5vZmZzZXRIZWlnaHQgfHwgZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApO1xufTtcblxuXG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoICggZSApIHt9XG59O1xuXG52YXIgeGhyU3VjY2Vzc1N0YXR1cyA9IHtcblxuXHRcdC8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHQvLyAjMTQ1MDogc29tZXRpbWVzIElFIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDRcblx0XHQxMjIzOiAyMDRcblx0fSxcblx0eGhyU3VwcG9ydGVkID0galF1ZXJ5LmFqYXhTZXR0aW5ncy54aHI
21167oKTtcblxuc3VwcG9ydC5jb3JzID0gISF4aHJTdXBwb3J0ZWQgJiYgKCBcIndpdGhDcmVkZW50aWFsc1wiIGluIHhoclN1cHBvcnRlZCApO1xuc3VwcG9ydC5hamF4ID0geGhyU3VwcG9ydGVkID0gISF4aHJTdXBwb3J0ZWQ7XG5cbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0dmFyIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrO1xuXG5cdC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Rcblx0aWYgKCBzdXBwb3J0LmNvcnMgfHwgeGhyU3VwcG9ydGVkICYmICFvcHRpb25zLmNyb3NzRG9tYWluICkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHZhciBpLFxuXHRcdFx0XHRcdHhociA9IG9wdGlvbnMueGhyKCk7XG5cblx0XHRcdFx0eGhyLm9wZW4oXG5cdFx0XHRcdFx0b3B0aW9ucy50eXBlLFxuXHRcdFx0XHRcdG9wdGlvbnMudXJsLFxuXHRcdFx0XHRcdG9wdGlvbnMuYXN5bmMsXG5cdFx0XHRcdFx0b3B0aW9ucy51c2VybmFtZSxcblx0XHRcdFx0XHRvcHRpb25zLnBhc3N3b3JkXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdGZvciAoIGkgaW4gb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0XHR4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGUgbWltZSB0eXBlIGlmIG5lZWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7XG5cdFx0XHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoIG9wdGlvbnMubWltZVR5cGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyXG5cdFx0XHRcdC8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmVcblx0XHRcdFx0Ly8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS5cblx0XHRcdFx0Ly8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApXG5cdFx0XHRcdC8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLlxuXHRcdFx0XHRpZiAoICFvcHRpb25zLmNyb3NzRG9tYWluICYmICFoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdICkge1xuXHRcdFx0XHRcdGhlYWRlcnNbIFwiWC1SZXF1ZXN0ZWQtV2l0aFwiIF0gPSBcIlhNTEh0dHBSZXF1
21167ZXN0XCI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTZXQgaGVhZGVyc1xuXHRcdFx0XHRmb3IgKCBpIGluIGhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoIGksIGhlYWRlcnNbIGkgXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ2FsbGJhY2tcblx0XHRcdFx0Y2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRjYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID1cblx0XHRcdFx0XHRcdFx0XHR4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9XG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiYWJvcnRcIiApIHtcblx0XHRcdFx0XHRcdFx0XHR4aHIuYWJvcnQoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gXCJlcnJvclwiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHQvLyBPbiBhIG1hbnVhbCBuYXRpdmUgYWJvcnQsIElFOSB0aHJvd3Ncblx0XHRcdFx0XHRcdFx0XHQvLyBlcnJvcnMgb24gYW55IHByb3BlcnR5IGFjY2VzcyB0aGF0IGlzIG5vdCByZWFkeVN0YXRlXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlb2YgeGhyLnN0YXR1cyAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCAwLCBcImVycm9yXCIgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHRcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBdIHx8IHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dCxcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElFOSBoYXMgbm8gWEhSMiBidXQgdGhyb3dzIG9uIGJpbmFyeSAodHJhYy0xMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpXG5cdFx0XHRcdFx0XHRcdFx0XHQoIHhoci5yZXNwb25zZVR5cGUgfHwgXCJ0ZXh0XCIgKSAhPT0gXCJ0ZXh0XCIgIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgYmluYXJ5OiB4aHIucmVzcG9uc2UgfSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0ZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0geGhyLm9udGltZW91dCA9IGNhbGxiYWNrKCBcImVycm9yXCIgKTtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHRcdFx0Ly8gVXNlIG9ucmVhZHlzdGF0ZWNoYW5nZSB0byByZXBsYWNlIG9uYWJvcnRcblx0XHRcdFx0Ly8gdG8gaGFuZGxlIHVuY2F1Z2h0IGFib3J0c1xuXHRcdFx0XHRpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0eGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgcmVhZHlTdGF0ZSBiZWZvcmUgdGltZW91dCBhcyBpdCBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFsbG93IG9uZXJyb3IgdG8gYmUgY2FsbGVkIGZpcnN0LFxuXHRcdFx0XHRcdFx0XHQvLyBidXQgdGhhdCB3aWxsIG5vdCBoYW5kbGUgYSBuYXRpdmUgYWJvcnRcblx0XHRcdFx0XHRcdFx0Ly8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0Ly8gYXMgeGhyLm9uZXJyb3IgY2Fubm90IGJlIGFjY2Vzc2VkXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDYWxsYmFjaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2soIFwiYWJvcnRcIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cblx0XHRcdFx0XHQvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pXG5cdFx0XHRcdFx0eGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApO1xuXHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdC8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gUHJldmVudCBhdXRvLWV4ZWN1dGlvbiBvZiBzY3JpcHRzIHdoZW4gbm8gZXhwbGljaXQgZGF0YVR5cGUgd2FzIHByb3ZpZGVkIChTZWUgZ2gtMjQzMilcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMuY29udGVudHMuc2NyaXB0ID0gZmFsc2U7XG5cdH1cbn0gKTtcblxuLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGVcbmpRdWVyeS5hamF4U2V0dXAoIHtcblx0YWNjZXB0czoge1xuXHRcdHNjcmlwdDogXCJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIFwiICtcblx0XHRcdFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0XCJcblx0fSxcblx0Y29udGVudHM6IHtcblx0XHRzY3JpcHQ6IC9cXGIoPzpqYXZhfGVjbWEpc2NyaXB0XFxiL1xuXHR9LFxuXHRjb252ZXJ0ZXJzOiB7XG5cdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7XG5cdFx0XHRyZXR1cm4gdGV4dDtcblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRzLmNhY2hlID0gZmFsc2U7XG5cdH1cblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMudHlwZSA9IFwiR0VUXCI7XG5cdH1cbn0gKTtcblxuLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0XG5qUXVlcnkuYWpheFRyYW5zcG9ydCggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cblx0Ly8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1
21167ZXN0c1xuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0dmFyIHNjcmlwdCwgY2FsbGJhY2s7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBfLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0c2NyaXB0ID0galF1ZXJ5KCBcIjxzY3JpcHQ+XCIgKS5wcm9wKCB7XG5cdFx0XHRcdFx0Y2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LFxuXHRcdFx0XHRcdHNyYzogcy51cmxcblx0XHRcdFx0fSApLm9uKFxuXHRcdFx0XHRcdFwibG9hZCBlcnJvclwiLFxuXHRcdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcblx0cmpzb25wID0gLyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztcblxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZSsrICkgKTtcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcblx0XHRyZXR1cm4gY2FsbGJhY2s7XG5cdH1cbn0gKTtcblxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJqc29uIGpzb25wXCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHtcblxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXG5cdFx0anNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID9cblx0XHRcdFwidXJsXCIgOlxuXHRcdFx0dHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApXG5cdFx0XHRcdFx0LmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCAmJlxuXHRcdFx0XHRyanNvbnAudGVzdCggcy5kYXRhICkgJiYgXCJkYXRhXCJcblx0XHQpO1xuXG5cdC8vIEhhbmRsZSBpZmYgdGhlIGV4cGVjdGVkIGRhdGEgdHlwZSBpcyBcImpzb25wXCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXRcblx0aWYgKCBqc29uUHJvcCB8fCBzLmRhdGFUeXBlc1sgMCBdID09PSBcImpzb25wXCIgKSB7XG5cblx0XHQvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1iZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0XG5cdFx0Y2FsbGJhY2tOYW1lID0gcy5qc29ucENhbGxiYWNrID0gaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgP1xuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxuXHRcdFx0cy5qc29ucENhbGxiYWNrO1xuXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxuXHRcdGlmICgganNvblByb3AgKSB7XG5cdFx0XHRzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsIFwiJDFcIiArIGNhbGxiYWNrTmFtZSApO1xuXHRcdH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkge1xuXHRcdFx0cy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuanNvbnAgKyBcIj1cIiArIGNhbGxiYWNrTmFtZTtcblx0XHR9XG5cblx0XHQvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uXG5cdFx0cy5jb252ZXJ0ZXJzWyBcInNjcmlwdCBqc29uXCIgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XG5cdFx0XHRcdGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgXCIgd2FzIG5vdCBjYWxsZWRcIiApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XG5cdFx0fTtcblxuXHRcdC8vIEZvcmNlIGpzb24gZGF0YVR5cGVcblx0XHRzLmRhdGFUeXBlc1sgMCBdID0gXCJqc29uXCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXG5cdFx0b3ZlcndyaXR0ZW4gPSB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdO1xuXHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xuXHRcdH07XG5cblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcblx0XHRqcVhIUi5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXRcblx0XHRcdGlmICggb3ZlcndyaXR0ZW4gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0alF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTtcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHJlc3RvcmUgcHJlZXhpc3RpbmcgdmFsdWVcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBvdmVyd3JpdHRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2F2ZSBiYWNrIGFzIGZyZWVcblx0XHRcdGlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcblxuXHRcdFx0XHQvLyBTYXZlIHRoZSBjYWxsYmFjayBuYW1lIGZvciBmdXR1cmUgdXNlXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXG5cdFx0XHRpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XG5cdFx0XHRcdG92ZXJ3cml0dGVuKCByZXNwb25zZUNvbnRhaW5lclsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7XG5cdFx0fSApO1xuXG5cdFx0Ly8gRGVsZWdhdGUgdG8gc2NyaXB0XG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gU3VwcG9ydDogU2FmYXJpIDggb25seVxuLy8gSW4gU2FmYXJpIDggZG9jdW1lbnRzIGNyZWF0ZWQgdmlhIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLm
21167NyZWF0ZUhUTUxEb2N1bWVudFxuLy8gY29sbGFwc2Ugc2libGluZyBmb3JtczogdGhlIHNlY29uZCBvbmUgYmVjb21lcyBhIGNoaWxkIG9mIHRoZSBmaXJzdCBvbmUuXG4vLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguXG4vLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MzM3XG5zdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCA9ICggZnVuY3Rpb24oKSB7XG5cdHZhciBib2R5ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCBcIlwiICkuYm9keTtcblx0Ym9keS5pbm5lckhUTUwgPSBcIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+XCI7XG5cdHJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyO1xufSApKCk7XG5cblxuLy8gQXJndW1lbnQgXCJkYXRhXCIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sXG4vLyBjb250ZXh0IChvcHRpb25hbCk6IElmIHNwZWNpZmllZCwgdGhlIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIGNvbnRleHQsXG4vLyBkZWZhdWx0cyB0byBkb2N1bWVudFxuLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZ1xualF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHtcblx0aWYgKCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0a2VlcFNjcmlwdHMgPSBjb250ZXh0O1xuXHRcdGNvbnRleHQgPSBmYWxzZTtcblx0fVxuXG5cdHZhciBiYXNlLCBwYXJzZWQsIHNjcmlwdHM7XG5cblx0aWYgKCAhY29udGV4dCApIHtcblxuXHRcdC8vIFN0b3Agc2NyaXB0cyBvciBpbmxpbmUgZXZlbnQgaGFuZGxlcnMgZnJvbSBiZWluZyBleGVjdXRlZCBpbW1lZGlhdGVseVxuXHRcdC8vIGJ5IHVzaW5nIGRvY3VtZW50LmltcGxlbWVudGF0aW9uXG5cdFx0aWYgKCBzdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCApIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKTtcblxuXHRcdFx0Ly8gU2V0IHRoZSBiYXNlIGhyZWYgZm9yIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdFx0XHQvLyBzbyBhbnkgcGFyc2VkIGVsZW1lbnRzIHdpdGggVVJMc1xuXHRcdFx0Ly8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSlcblx0XHRcdGJhc2UgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiYmFzZVwiICk7XG5cdFx0XHRiYXNlLmhyZWYgPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmO1xuXHRcdFx0Y29udGV4dC5oZWFkLmFwcGVuZENoaWxkKCBiYXNlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudDtcblx0XHR9XG5cdH1cblxuXHRwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKTtcblx0c2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTtcblxuXHQvLyBTaW5nbGUgdGFnXG5cdGlmICggcGFyc2VkICkge1xuXHRcdHJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0gYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLyoqXG4gKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlXG4gKi9cbmpRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHtcblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZiggXCIgXCIgKTtcblxuXHRpZiAoIG9mZiA+IC0xICkge1xuXHRcdHNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApO1xuXHRcdHVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7XG5cdH1cblxuXHQvLyBJZiBpdCdzIGEgZnVuY3Rpb25cblx0aWYgKCBpc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHtcblxuXHRcdC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrXG5cdFx0Y2FsbGJhY2sgPSBwYXJhbXM7XG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xuXG5cdC8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmdcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0dHlwZSA9IFwiUE9TVFwiO1xuXHR9XG5cblx0Ly8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3Rcblx0aWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7XG5cdFx0alF1ZXJ5LmFqYXgoIHtcblx0XHRcdHVybDogdXJsLFxuXG5cdFx0XHQvLyBJZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkLlxuXHRcdFx0Ly8gTWFrZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGV4cGxpY2l0IHNpbmNlXG5cdFx0XHQvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2Rcblx0XHRcdHR5cGU6IHR5cGUgfHwgXCJHRVRcIixcblx0XHRcdGRhdGFUeXBlOiBcImh0bWxcIixcblx0XHRcdGRhdGE6IHBhcmFtc1xuXHRcdH0gKS5kb25lKCBmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkge1xuXG5cdFx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcblx0XHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xuXG5cdFx0XHRzZWxmLmh0bWwoIHNlbGVjdG9yID9cblxuXHRcdFx0XHQvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXZcblx0XHRcdFx0Ly8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzXG5cdFx0XHRcdGpRdWVyeSggXCI8ZGl2PlwiICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0XG5cdFx0XHRcdHJlc3BvbnNlVGV4dCApO1xuXG5cdFx0Ly8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImRhdGFcIiwgXCJzdGF0dXNcIiwgXCJqcVhIUlwiXG5cdFx0Ly8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLlxuXHRcdC8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJqcVhIUlwiLCBcInN0YXR1c1wiLCBcImVycm9yXCJcblx0XHR9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSF
21167IsIHN0YXR1cyApIHtcblx0XHRcdHNlbGYuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cblxuXG4vLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50c1xualF1ZXJ5LmVhY2goIFtcblx0XCJhamF4U3RhcnRcIixcblx0XCJhamF4U3RvcFwiLFxuXHRcImFqYXhDb21wbGV0ZVwiLFxuXHRcImFqYXhFcnJvclwiLFxuXHRcImFqYXhTdWNjZXNzXCIsXG5cdFwiYWpheFNlbmRcIlxuXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7XG5cdGpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApO1xuXHR9O1xufSApO1xuXG5cblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiBqUXVlcnkuZ3JlcCggalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiBlbGVtID09PSBmbi5lbGVtO1xuXHR9ICkubGVuZ3RoO1xufTtcblxuXG5cblxualF1ZXJ5Lm9mZnNldCA9IHtcblx0c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHtcblx0XHR2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0cG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSxcblx0XHRcdGN1ckVsZW0gP
21167SBqUXVlcnkoIGVsZW0gKSxcblx0XHRcdHByb3BzID0ge307XG5cblx0XHQvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXG5cdFx0aWYgKCBwb3NpdGlvbiA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdFx0fVxuXG5cdFx0Y3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTtcblx0XHRjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCBcInRvcFwiICk7XG5cdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSBcImFic29sdXRlXCIgfHwgcG9zaXRpb24gPT09IFwiZml4ZWRcIiApICYmXG5cdFx0XHQoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCBcImF1dG9cIiApID4gLTE7XG5cblx0XHQvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlclxuXHRcdC8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZFxuXHRcdGlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7XG5cdFx0XHRjdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTtcblx0XHRcdGN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDtcblx0XHRcdGN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7XG5cdFx0XHRjdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7XG5cdFx0fVxuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7XG5cblx0XHRcdC8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KVxuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgalF1ZXJ5LmV4dGVuZCgge30sIGN1ck9mZnNldCApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0O1xuXHRcdH1cblxuXHRcdGlmICggXCJ1c2luZ1wiIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0Ly8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHRoaXMgOlxuXHRcdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRcdGpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7XG5cdFx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHR2YXIgcmVjdCwgd2luLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXTtcblxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYVxuXHRcdC8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvclxuXHRcdGlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblx0XHR9XG5cblx0XHQvLyBHZXQgZG9jdW1lbnQtcmVsYXRpdmUgcG9zaXRpb24gYnkgYWRkaW5nIHZpZXdwb3J0IHNjcm9sbCB0byB2aWV3cG9ydC1yZWxhdGl2ZSBnQkNSXG5cdFx0cmVjdCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0d2luID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LFxuXHRcdFx0bGVmdDogcmVjdC5sZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0XG5cdFx0fTtcblx0fSxcblxuXHQvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveFxuXHQvLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBiZWhhdmlvciBvZiBDU1MgYWJzb2x1dGUgcG9zaXRpb25pbmdcblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYyxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuXG5cdFx0Ly8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXRcblx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApID09PSBcImZpeGVkXCIgKSB7XG5cblx0XHRcdC8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3Rcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblxuXHRcdFx0Ly8gQWNjb3VudCBmb3IgdGhlICpyZWFsKiBvZmZzZXQgcGFyZW50LCB3aGljaCBjYW4gYmUgdGhlIGRvY3VtZW50IG9yIGl0cyByb290IGVsZW1lbnRcblx0XHRcdC8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkXG5cdFx0XHRkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cdFx0XHRvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCB8fCBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRcdFx0d2hpbGUgKCBvZmZzZXRQYXJlbnQgJiZcblx0XHRcdFx0KCBvZmZzZXRQYXJlbnQgPT09IGRvYy5ib2R5IHx8IG9mZnNldFBhcmVudCA9PT0gZG9jLmRvY3VtZW50RWxlbWVudCApICYmXG5cdFx0XHRcdGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIG9mZnNldFBhcmVudCAmJiBvZmZzZXRQYXJlbnQgIT09IGVsZW0gJiYgb2Zmc2V0UGFyZW50Lm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIEluY29ycG9yYXRlIGJvcmRlcnMgaW50byBpdHMgb2Zmc2V0LCBzaW5jZSB0aGV5IGFyZSBvdXRzaWRlIGl0cyBjb250ZW50IG9yaWdpblxuXHRcdFx0XHRwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpO1xuXHRcdFx0XHRwYXJlbnRPZmZzZXQudG9wICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJUb3BXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHRcdHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJMZWZ0V2lkdGhcIiwgdHJ1ZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnNcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luVG9wXCIsIHRydWUgKSxcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiwgdHJ1ZSApXG5cdFx0fTtcblx0fSxcblxuXHQvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybi
21167Bkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcblx0Ly8gMSkgRm9yIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgaWZyYW1lIHdpdGhvdXQgb2Zmc2V0UGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVyblxuXHQvLyAgICBkb2N1bWVudEVsZW1lbnQgb2YgdGhlIHBhcmVudCB3aW5kb3dcblx0Ly8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudFxuXHQvLyAzKSBGb3IgYm9keSBvciBodG1sIGVsZW1lbnQsIGkuZS4gaW4gY2FzZSBvZiB0aGUgaHRtbCBub2RlIC0gaXQgd2lsbCByZXR1cm4gaXRzZWxmXG5cdC8vXG5cdC8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlc1xuXHQvLyBhbmQgbWlnaHQgYmUgY29uc2lkZXJlZCBhcyBtb3JlIHByZWZlcmFibGUgcmVzdWx0cy5cblx0Ly9cblx0Ly8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmVcblx0b2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50O1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50RWxlbWVudDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBzY3JvbGxMZWZ0OiBcInBhZ2VYT2Zmc2V0XCIsIHNjcm9sbFRvcDogXCJwYWdlWU9mZnNldFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XG5cdHZhciB0b3AgPSBcInBhZ2VZT2Zmc2V0XCIgPT09IHByb3A7XG5cblx0alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkge1xuXG5cdFx0XHQvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3Ncblx0XHRcdHZhciB3aW47XG5cdFx0XHRpZiAoIGlzV2luZG93KCBlbGVtICkgKSB7XG5cdFx0XHRcdHdpbiA9IGVsZW07XG5cdFx0XHR9IGVsc2UgaWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR3aW4gPSBlbGVtLmRlZmF1bHRWaWV3O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB3aW4gKSB7XG5cdFx0XHRcdHdpbi5zY3JvbGxUbyhcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogd2luLnBhZ2VYT2Zmc2V0LFxuXHRcdFx0XHRcdHRvcCA/IHZhbCA6IHdpbi5wYWdlWU9mZnNldFxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtWyBtZXRob2QgXSA9IHZhbDtcblx0XHRcdH1cblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9O1xufSApO1xuXG4vLyBTdXBwb3J0OiBTYWZhcmkgPD03IC0gOS4xLCBDaHJvbWUgPD0zNyAtIDQ5XG4vLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvblxuLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0XG4vLyBCbGluayBidWc6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU4OTM0N1xuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDtcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sXG5cdFx0ZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cblx0XHQvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGhcblx0XHRqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHtcblx0XHRcdHZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09IFwiYm9vbGVhblwiICksXG5cdFx0XHRcdGV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gXCJtYXJnaW5cIiA6IFwiYm9yZGVyXCIgKTtcblxuXHRcdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgZG9jO1xuXG5cdFx0XHRcdGlmICggaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0XHRcdC8vICQoIHdpbmRvdyApLm91dGVyV2lkdGgvSGVpZ2h0IHJldHVybi
21167B3L2ggaW5jbHVkaW5nIHNjcm9sbGJhcnMgKGdoLTE3MjkpXG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmNOYW1lLmluZGV4T2YoIFwib3V0ZXJcIiApID09PSAwID9cblx0XHRcdFx0XHRcdGVsZW1bIFwiaW5uZXJcIiArIG5hbWUgXSA6XG5cdFx0XHRcdFx0XHRlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdFx0Ly8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLFxuXHRcdFx0XHRcdC8vIHdoaWNoZXZlciBpcyBncmVhdGVzdFxuXHRcdFx0XHRcdHJldHVybiBNYXRoLm1heChcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJzY3JvbGxcIiArIG5hbWUgXSwgZG9jWyBcInNjcm9sbFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcIm9mZnNldFwiICsgbmFtZSBdLCBkb2NbIFwib2Zmc2V0XCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRkb2NbIFwiY2xpZW50XCIgKyBuYW1lIF1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXG5cdFx0XHRcdFx0Ly8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOlxuXG5cdFx0XHRcdFx0Ly8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudFxuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7XG5cdFx0XHR9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApO1xuXHRcdH07XG5cdH0gKTtcbn0gKTtcblxuXG5qUXVlcnkuZWFjaCggKCBcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudVwiICkuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXG5cdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/XG5cdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHtcblx0XHRyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTtcblx0fVxufSApO1xuXG5cblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0YmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApO1xuXHR9LFxuXG5cdGRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHtcblxuXHRcdC8vICggbmFtZXNwYWNlICkgb3IgKCBzZWxlY3RvciwgdHlwZXMgWywgZm5dIClcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/XG5cdFx0XHR0aGlzLm9mZiggc2VsZWN0b3IsIFwiKipcIiApIDpcblx0XHRcdHRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgXCIqKlwiLCBmbiApO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueVxuLy8gYXJndW1lbnRzLlxuLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKVxuLy8gSG93ZXZlciwgaXQgaXMgbm90IHNsYXRlZCBmb3IgcmVtb3ZhbCBhbnkgdGltZSBzb29uXG5qUXVlcnkucHJveHkgPSBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7XG5cdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xuXG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0dG1wID0gZm5bIGNvbnRleHQgXTtcblx0XHRjb250ZXh0ID0gZm47XG5cdFx0Zm4gPSB0bXA7XG5cdH1cblxuXHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBTaW11bGF0ZWQgYmluZFxuXHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XG5cdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdH07XG5cblx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdHJldHVybi
21167Bwcm94eTtcbn07XG5cbmpRdWVyeS5ob2xkUmVhZHkgPSBmdW5jdGlvbiggaG9sZCApIHtcblx0aWYgKCBob2xkICkge1xuXHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0fSBlbHNlIHtcblx0XHRqUXVlcnkucmVhZHkoIHRydWUgKTtcblx0fVxufTtcbmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbmpRdWVyeS5wYXJzZUpTT04gPSBKU09OLnBhcnNlO1xualF1ZXJ5Lm5vZGVOYW1lID0gbm9kZU5hbWU7XG5qUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5qUXVlcnkuaXNXaW5kb3cgPSBpc1dpbmRvdztcbmpRdWVyeS5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG5qUXVlcnkudHlwZSA9IHRvVHlwZTtcblxualF1ZXJ5Lm5vdyA9IERhdGUubm93O1xuXG5qUXVlcnkuaXNOdW1lcmljID0gZnVuY3Rpb24oIG9iaiApIHtcblxuXHQvLyBBcyBvZiBqUXVlcnkgMy4wLCBpc051bWVyaWMgaXMgbGltaXRlZCB0b1xuXHQvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpXG5cdC8vIHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gZmluaXRlIG51bWJlcnMgKGdoLTI2NjIpXG5cdHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApO1xuXHRyZXR1cm4gKCB0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwic3RyaW5nXCIgKSAmJlxuXG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKFwiXCIpXG5cdFx0Ly8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoXCIweC4uLlwiKVxuXHRcdC8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTlxuXHRcdCFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTtcbn07XG5cblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSApO1xufVxuXG5cblxuXG52YXJcblxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1EXG4vLyAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpXG5pZiAoICFub0dsb2JhbCApIHtcblx0d2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5O1xufVxuXG5cblxuXG5yZXR1cm4galF1ZXJ5O1xufSApO1xuIiwiLypcbiBDb3B5cmlnaHQgKEMpIEZlZGVyaWNvIFppdm9sbyAyMDE4XG4gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChsaWNlbnNlIHRlcm1zIGFyZSBhdCBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUKS5cbiAqLyhmdW5jdGlvbihlLHQpeydvYmplY3QnPT10eXBlb2YgZXhwb3J0cyYmJ3VuZGVmaW5lZCchPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOidmdW5jdGlvbic9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHQpOmUuUG9wcGVyPXQoKX0pKHRoaXMsZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7ZnVuY3Rpb24gZShlKXtyZXR1cm4gZSYmJ1tvYmplY3QgRnVuY3Rpb25dJz09PXt9LnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gdChlLHQpe2lmKDEhPT1lLm5vZGVUeXBlKXJldHVybltdO3ZhciBvPWdldENvbXB1dGVkU3R5bGUoZSxudWxsKTtyZXR1cm4gdD9vW3RdOm99ZnVuY3Rpb24gbyhlKXtyZXR1cm4nSFRNTCc9PT1lLm5vZGVOYW1lP2U6ZS5wYXJlbnROb2RlfHxlLmhvc3R9ZnVuY3Rpb24gbihlKXtpZighZSlyZXR1cm4gZG9jdW1lbnQuYm9keTtzd2l0Y2goZS5ub2RlTmFtZSl7Y2FzZSdIVE1MJzpjYXNlJ0JPRFknOnJldHVybi
21167BlLm93bmVyRG9jdW1lbnQuYm9keTtjYXNlJyNkb2N1bWVudCc6cmV0dXJuIGUuYm9keTt9dmFyIGk9dChlKSxyPWkub3ZlcmZsb3cscD1pLm92ZXJmbG93WCxzPWkub3ZlcmZsb3dZO3JldHVybiAvKGF1dG98c2Nyb2xsfG92ZXJsYXkpLy50ZXN0KHIrcytwKT9lOm4obyhlKSl9ZnVuY3Rpb24gcihlKXtyZXR1cm4gMTE9PT1lP3JlOjEwPT09ZT9wZTpyZXx8cGV9ZnVuY3Rpb24gcChlKXtpZighZSlyZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2Zvcih2YXIgbz1yKDEwKT9kb2N1bWVudC5ib2R5Om51bGwsbj1lLm9mZnNldFBhcmVudDtuPT09byYmZS5uZXh0RWxlbWVudFNpYmxpbmc7KW49KGU9ZS5uZXh0RWxlbWVudFNpYmxpbmcpLm9mZnNldFBhcmVudDt2YXIgaT1uJiZuLm5vZGVOYW1lO3JldHVybiBpJiYnQk9EWSchPT1pJiYnSFRNTCchPT1pPy0xIT09WydURCcsJ1RBQkxFJ10uaW5kZXhPZihuLm5vZGVOYW1lKSYmJ3N0YXRpYyc9PT10KG4sJ3Bvc2l0aW9uJyk/cChuKTpuOmU/ZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDpkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLm5vZGVOYW1lO3JldHVybidCT0RZJyE9PXQmJignSFRNTCc9PT10fHxwKGUuZmlyc3RFbGVtZW50Q2hpbGQpPT09ZSl9ZnVuY3Rpb24gZChlKXtyZXR1cm4gbnVsbD09PWUucGFyZW50Tm9kZT9lOmQoZS5wYXJlbnROb2RlKX1mdW5jdGlvbiBhKGUsdCl7aWYoIWV8fCFlLm5vZGVUeXBlfHwhdHx8IXQubm9kZVR5cGUpcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDt2YXIgbz1lLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpJk5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HLG49bz9lOnQsaT1vP3Q6ZSxyPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7ci5zZXRTdGFydChuLDApLHIuc2V0RW5kKGksMCk7dmFyIGw9ci5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtpZihlIT09bCYmdCE9PWx8fG4uY29udGFpbnMoaSkpcmV0dXJuIHMobCk/bDpwKGwpO3ZhciBmPWQoZSk7cmV0dXJuIGYuaG9zdD9hKGYuaG9zdCx0KTphKGUsZCh0KS5ob3N0KX1mdW5jdGlvbiBsKGUpe3ZhciB0PTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTondG9wJyxvPSd0b3AnPT09dD8nc2Nyb2xsVG9wJzonc2Nyb2xsTGVmdCcsbj1lLm5vZGVOYW1lO2lmKCdCT0RZJz09PW58fCdIVE1MJz09PW4pe3ZhciBpPWUub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQscj1lLm93bmVyRG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudHx8aTtyZXR1cm4gcltvXX1yZXR1cm4gZVtvXX1mdW5jdGlvbiBmKGUsdCl7dmFyIG89Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXSxuPWwodCwndG9wJyksaT1sKHQsJ2xlZnQnKSxyPW8/LTE6MTtyZXR1cm4gZS50b3ArPW4qcixlLmJvdHRvbSs9bipyLGUubGVmdCs9aSpyLGUucmlnaHQrPWkqcixlfWZ1bmN0aW9uIG0oZSx0KXt2YXIgbz0neCc9PT10PydMZWZ0JzonVG9wJyxuPSdMZWZ0Jz09bz8nUmlnaHQnOidCb3R0b20nO3JldHVybiBwYXJzZUZsb2F0KGVbJ2JvcmRlcicrbysnV2lkdGgnXSwxMCkrcGFyc2VGbG9hdChlWydib3JkZXInK24rJ1dpZHRoJ10sMTApfWZ1bmN0aW9uIGgoZSx0LG8sbil7cmV0dXJuIEoodFsnb2Zmc2V0JytlXSx0WydzY3JvbGwnK2VdLG9bJ2NsaWVudCcrZV0sb1snb2Zmc2V0JytlXSxvWydzY3JvbGwnK2VdLHIoMTApP3BhcnNlSW50KG9bJ29mZnNldCcrZV0pK3BhcnNlSW50KG5bJ21hcmdpbicrKCdIZWlnaHQnPT09ZT8nVG9wJzonTGVmdCcpXSkrcGFyc2VJbnQoblsnbWFyZ2luJysoJ0hlaWdodCc9PT1lPydCb3R0b20nOidSaWdodCcpXSk6MCl9ZnVuY3Rpb24gYyhlKXt2YXIgdD1lLmJvZHksbz1lLmRvY3VtZW50RWxlbWVudCxuPXIoMTApJiZnZXRDb21wdXRlZFN0eWxlKG8pO3JldHVybntoZWlnaHQ6aCgnSGVpZ2h0Jyx0LG8sbiksd2lkdGg6aCgnV2lkdGgnLHQsbyxuKX19ZnVuY3Rpb24gZyhlKXtyZXR1cm4gbGUoe30sZSx7cmlnaHQ6ZS5sZWZ0K2Uud2lkdGgsYm90dG9tOmUudG9wK2UuaGVpZ2h0fSl9ZnVuY3Rpb24gdShlKXt2YXIgbz17fTt0cnl7aWYocigxMCkpe289ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgbj1sKGUsJ3RvcCcpLGk9bChlLCdsZWZ0Jyk7by50b3ArPW4sby5sZWZ0Kz1pLG8uYm90dG9tKz1uLG8ucmlnaHQrPWl9ZWxzZSBvPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y2F0Y2godCl7fXZhciBwPXtsZWZ0Om8ubGVmdCx0b3A6by50b3Asd2lkdGg6by5yaWdodC1vLmxlZnQsaGVpZ2h0Om8uYm90dG9tLW8udG9wfSxzPSdIVE1MJz09PWUubm9kZU5hbWU/YyhlLm93bmVyRG9jdW1lbnQpOnt9LGQ9cy53aWR0aHx8ZS5jbGllbnRXaWR0aHx8cC5yaWdodC1wLmxlZnQsYT1zLmhlaWdodHx8ZS5jbGllbnRIZWlnaHR8fHAuYm90dG9tLXAudG9wLGY9ZS5vZmZzZXRXaWR0aC1kLGg9ZS5vZmZzZXRIZWlnaHQtYTtpZihmfHxoKXt2YXIgdT10KGUpO2YtPW0odSwneCcpLGgtPW0odSwneScpLHAud2lkdGgtPWYscC5oZWlnaHQtPWh9cmV0dXJuIGcocCl9ZnVuY3Rpb24gYihlLG8pe3ZhciBpPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0scD1yKDEwKSxzPSdIVE1MJz09PW8ubm9kZU5hbWUsZD11KGUpLGE9dShvKSxsPW4oZSksbT10KG8pLGg9cGFyc2VGbG9hdChtLmJvcmRlclRvcFdpZHRoLDEwKSxjPXBhcnNlRmxvYXQobS5ib3JkZXJMZWZ0V2lkdGgsMTApO2kmJnMmJihhLnRvcD1KKGEudG9wLDApLGEubGVmdD1KKGEubGVmdCwwKSk7dmFyIGI9Zyh7dG9wOmQudG9wLWEudG9wLWgsbGVmdDpkLmxlZnQtYS5sZWZ0LWMsd2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KTtpZihiLm1hcmdpblRvcD0wLGIubWFyZ2luTGVmdD0wLCFwJiZzKXt2YXIgeT1wYXJzZUZsb2F0KG0ubWFyZ2luVG9wLDEwKSx3PXBhcnNlRmxvYXQobS5tYXJnaW5MZWZ0LDEwKTtiLnRvcC09aC15LGIuYm90dG9tLT1oLXksYi5sZWZ0LT1jLXcsYi5yaWdodC09Yy13LGIubWFyZ2luVG9wPXksYi5tYXJnaW5MZWZ0PXd9cmV0dXJuKHAmJiFpP28uY29udGFpbnMobCk6bz09PWwmJidCT0RZJyE9PWwubm9kZU5hbWUpJiYoYj1mKGIsbykpLGJ9ZnVuY3Rpb24geShlKXt2YXIgdD0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLG89ZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxuPWIoZSxvKSxpPUooby5jbGllbnRXaWR0aCx3aW5kb3cuaW5uZXJXaWR0aHx8MCkscj1KKG8uY2xpZW50SGVpZ2h0LHdpbmRvdy5pbm5lckhlaWdodHx8MCkscD10PzA6bChvKSxzPXQ/MDpsKG8sJ2xlZnQnKSxkPXt0b3A6cC1uLnRvcCtuLm1hcmdpblRvcCxsZWZ0OnMtbi5sZWZ0K24ubWFyZ2luTGVmdCx3aWR0aDppLGhlaWdodDpyfTtyZXR1cm4gZyhkKX1mdW5jdGlvbiB3
21167KGUpe3ZhciBuPWUubm9kZU5hbWU7cmV0dXJuJ0JPRFknPT09bnx8J0hUTUwnPT09bj8hMTonZml4ZWQnPT09dChlLCdwb3NpdGlvbicpfHx3KG8oZSkpfWZ1bmN0aW9uIEUoZSl7aWYoIWV8fCFlLnBhcmVudEVsZW1lbnR8fHIoKSlyZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2Zvcih2YXIgbz1lLnBhcmVudEVsZW1lbnQ7byYmJ25vbmUnPT09dChvLCd0cmFuc2Zvcm0nKTspbz1vLnBhcmVudEVsZW1lbnQ7cmV0dXJuIG98fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudH1mdW5jdGlvbiB2KGUsdCxpLHIpe3ZhciBwPTQ8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzRdJiZhcmd1bWVudHNbNF0scz17dG9wOjAsbGVmdDowfSxkPXA/RShlKTphKGUsdCk7aWYoJ3ZpZXdwb3J0Jz09PXIpcz15KGQscCk7ZWxzZXt2YXIgbDsnc2Nyb2xsUGFyZW50Jz09PXI/KGw9bihvKHQpKSwnQk9EWSc9PT1sLm5vZGVOYW1lJiYobD1lLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSk6J3dpbmRvdyc9PT1yP2w9ZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDpsPXI7dmFyIGY9YihsLGQscCk7aWYoJ0hUTUwnPT09bC5ub2RlTmFtZSYmIXcoZCkpe3ZhciBtPWMoZS5vd25lckRvY3VtZW50KSxoPW0uaGVpZ2h0LGc9bS53aWR0aDtzLnRvcCs9Zi50b3AtZi5tYXJnaW5Ub3Ascy5ib3R0b209aCtmLnRvcCxzLmxlZnQrPWYubGVmdC1mLm1hcmdpbkxlZnQscy5yaWdodD1nK2YubGVmdH1lbHNlIHM9Zn1pPWl8fDA7dmFyIHU9J251bWJlcic9PXR5cGVvZiBpO3JldHVybiBzLmxlZnQrPXU/aTppLmxlZnR8fDAscy50b3ArPXU/aTppLnRvcHx8MCxzLnJpZ2h0LT11P2k6aS5yaWdodHx8MCxzLmJvdHRvbS09dT9pOmkuYm90dG9tfHwwLHN9ZnVuY3Rpb24geChlKXt2YXIgdD1lLndpZHRoLG89ZS5oZWlnaHQ7cmV0dXJuIHQqb31mdW5jdGlvbiBPKGUsdCxvLG4saSl7dmFyIHI9NTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbNV0/YXJndW1lbnRzWzVdOjA7aWYoLTE9PT1lLmluZGV4T2YoJ2F1dG8nKSlyZXR1cm4gZTt2YXIgcD12KG8sbixyLGkpLHM9e3RvcDp7d2lkdGg6cC53aWR0aCxoZWlnaHQ6dC50b3AtcC50b3B9LHJpZ2h0Ont3aWR0aDpwLnJpZ2h0LXQucmlnaHQsaGVpZ2h0OnAuaGVpZ2h0fSxib3R0b206e3dpZHRoOnAud2lkdGgsaGVpZ2h0OnAuYm90dG9tLXQuYm90dG9tfSxsZWZ0Ont3aWR0aDp0LmxlZnQtcC5sZWZ0LGhlaWdodDpwLmhlaWdodH19LGQ9T2JqZWN0LmtleXMocykubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBsZSh7a2V5OmV9LHNbZV0se2FyZWE6eChzW2VdKX0pfSkuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiB0LmFyZWEtZS5hcmVhfSksYT1kLmZpbHRlcihmdW5jdGlvbihlKXt2YXIgdD1lLndpZHRoLG49ZS5oZWlnaHQ7cmV0dXJuIHQ+PW8uY2xpZW50V2lkdGgmJm4+PW8uY2xpZW50SGVpZ2h0fSksbD0wPGEubGVuZ3RoP2FbMF0ua2V5OmRbMF0ua2V5LGY9ZS5zcGxpdCgnLScpWzFdO3JldHVybiBsKyhmPyctJytmOicnKX1mdW5jdGlvbiBMKGUsdCxvKXt2YXIgbj0zPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bnVsbCxpPW4/RSh0KTphKHQsbyk7cmV0dXJuIGIobyxpLG4pfWZ1bmN0aW9uIFMoZSl7dmFyIHQ9Z2V0Q29tcHV0ZWRTdHlsZShlKSxvPXBhcnNlRmxvYXQodC5tYXJnaW5Ub3ApK3BhcnNlRmxvYXQodC5tYXJnaW5Cb3R0b20pLG49cGFyc2VGbG9hdCh0Lm1hcmdpbkxlZnQpK3BhcnNlRmxvYXQodC5tYXJnaW5SaWdodCksaT17d2lkdGg6ZS5vZmZzZXRXaWR0aCtuLGhlaWdodDplLm9mZnNldEhlaWdodCtvfTtyZXR1cm4gaX1mdW5jdGlvbiBUKGUpe3ZhciB0PXtsZWZ0OidyaWdodCcscmlnaHQ6J2xlZnQnLGJvdHRvbTondG9wJyx0b3A6J2JvdHRvbSd9O3JldHVybiBlLnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSl9ZnVuY3Rpb24gRChlLHQsbyl7bz1vLnNwbGl0KCctJylbMF07dmFyIG49UyhlKSxpPXt3aWR0aDpuLndpZHRoLGhlaWdodDpuLmhlaWdodH0scj0tMSE9PVsncmlnaHQnLCdsZWZ0J10uaW5kZXhPZihvKSxwPXI/J3RvcCc6J2xlZnQnLHM9cj8nbGVmdCc6J3RvcCcsZD1yPydoZWlnaHQnOid3aWR0aCcsYT1yPyd3aWR0aCc6J2hlaWdodCc7cmV0dXJuIGlbcF09dFtwXSt0W2RdLzItbltkXS8yLGlbc109bz09PXM/dFtzXS1uW2FdOnRbVChzKV0saX1mdW5jdGlvbiBDKGUsdCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maW5kP2UuZmluZCh0KTplLmZpbHRlcih0KVswXX1mdW5jdGlvbiBOKGUsdCxvKXtpZihBcnJheS5wcm90b3R5cGUuZmluZEluZGV4KXJldHVybiBlLmZpbmRJbmRleChmdW5jdGlvbihlKXtyZXR1cm4gZVt0XT09PW99KTt2YXIgbj1DKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGVbdF09PT1vfSk7cmV0dXJuIGUuaW5kZXhPZihuKX1mdW5jdGlvbiBQKHQsbyxuKXt2YXIgaT12b2lkIDA9PT1uP3Q6dC5zbGljZSgwLE4odCwnbmFtZScsbikpO3JldHVybiBpLmZvckVhY2goZnVuY3Rpb24odCl7dFsnZnVuY3Rpb24nXSYmY29uc29sZS53YXJuKCdgbW9kaWZpZXIuZnVuY3Rpb25gIGlzIGRlcHJlY2F0ZWQsIHVzZSBgbW9kaWZpZXIuZm5gIScpO3ZhciBuPXRbJ2Z1bmN0aW9uJ118fHQuZm47dC5lbmFibGVkJiZlKG4pJiYoby5vZmZzZXRzLnBvcHBlcj1nKG8ub2Zmc2V0cy5wb3BwZXIpLG8ub2Zmc2V0cy5yZWZlcmVuY2U9ZyhvLm9mZnNldHMucmVmZXJlbmNlKSxvPW4obyx0KSl9KSxvfWZ1bmN0aW9uIGsoKXtpZighdGhpcy5zdGF0ZS5pc0Rlc3Ryb3llZCl7dmFyIGU9e2luc3RhbmNlOnRoaXMsc3R5bGVzOnt9LGFycm93U3R5bGVzOnt9LGF0dHJpYnV0ZXM6e30sZmxpcHBlZDohMSxvZmZzZXRzOnt9fTtlLm9mZnNldHMucmVmZXJlbmNlPUwodGhpcy5zdGF0ZSx0aGlzLnBvcHBlcix0aGlzLnJlZmVyZW5jZSx0aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZCksZS5wbGFjZW1lbnQ9Tyh0aGlzLm9wdGlvbnMucGxhY2VtZW50LGUub2Zmc2V0cy5yZWZlcmVuY2UsdGhpcy5wb3BwZXIsdGhpcy5yZWZlcmVuY2UsdGhpcy5vcHRpb25zLm1vZGlmaWVycy5mbGlwLmJvdW5kYXJpZXNFbGVtZW50LHRoaXMub3B0aW9ucy5tb2RpZmllcnMuZmxpcC5wYWRkaW5nKSxlLm9yaWdpbmFsUGxhY2VtZW50PWUucGxhY2VtZW50LGUucG9zaXRpb25GaXhlZD10aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZCxlLm9mZnNldHMucG9wcGVyPUQodGhpcy5wb3BwZXIsZS5vZmZzZXRzLnJlZmVyZW5jZSxlLnBsYWNlbWVudCksZS5vZmZzZXRzLnBvcHBlci5wb3NpdGlvbj10aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZD8nZml4ZWQnOidhYnNvbHV0ZScsZT1QKHRoaXMubW9kaWZpZXJzLGUpLHRoaXMuc3RhdGUuaXNDcmVhdGVkP3RoaXMub3B0aW9ucy5vblVwZGF0ZShlKToodGhpcy5zdGF0ZS5pc0NyZWF0ZWQ9ITAsdGhpcy5vcHRpb25zLm9uQ3JlYXRlKGUpKX19ZnVuY3Rpb24gVyhlLHQpe3JldHVybiBlLnNvbWUoZnVuY3Rpb24oZSl7dmFyIG89ZS5uYW1lLG49ZS5lbmFibGVkO3JldHVybiBuJiZvPT09dH0pfWZ1bmN0aW9uIEgoZSl7Zm9yKHZhciB0PVshMSwnbXMnLCdXZWJraXQnLCdNb3onLCdPJ10sbz1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaT10W25dLHI9aT8nJytpK286ZTtpZigndW5kZWZpbmVkJyE9dHlwZW9mIGRvY3VtZW50LmJvZHkuc3R5bGVbcl0pcmV0dXJuIHJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gQigpe3JldHVybiB0aGlzLnN0YXRlLmlzRGVzdHJveWVkPSEwLFcodGhpcy5tb2RpZmllcnMsJ2FwcGx5U3R5bGUnKSYmKHRoaXMucG9wcGVyLnJlbW92ZUF0dHJpYnV0ZSgneC1wbGFjZW1lbnQnKSx0aGlzLnBvcHBlci5zdHlsZS5wb3NpdGlvbj0nJyx0aGlzLnBvcHBlci5zdHlsZS50b3A9JycsdGhpcy5wb3BwZXIuc3R5bGUubGVmdD0nJyx0aGlzLnBvcHBlci5zdHlsZS5yaWdodD0nJyx0aGlzLnBvcHBlci5zdHlsZS5ib3R0b209JycsdGhpcy5wb3BwZXIuc3R5bGUud2lsbENoYW5nZT0nJyx0aGlzLnBvcHBlci5zdHlsZVtIKCd0cmFuc2Zvcm0nKV09JycpLHRoaXMuZGlzYWJsZUV2ZW50TGlzdGVuZXJzKCksdGhpcy5vcHRpb25zLnJlbW92ZU9uRGVzdHJveSYmdGhpcy5wb3BwZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBvcHBlciksdGhpc31mdW5jdGlvbiBBKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudDtyZXR1cm4gdD90LmRlZmF1bHRWaWV3OndpbmRvd31mdW5jdGlvbiBNKGUsdCxvLGkpe3ZhciByPSdCT0RZJz09PWUubm9kZU5hbWUscD1yP2
21167Uub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldzplO3AuYWRkRXZlbnRMaXN0ZW5lcih0LG8se3Bhc3NpdmU6ITB9KSxyfHxNKG4ocC5wYXJlbnROb2RlKSx0LG8saSksaS5wdXNoKHApfWZ1bmN0aW9uIEYoZSx0LG8saSl7by51cGRhdGVCb3VuZD1pLEEoZSkuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJyxvLnVwZGF0ZUJvdW5kLHtwYXNzaXZlOiEwfSk7dmFyIHI9bihlKTtyZXR1cm4gTShyLCdzY3JvbGwnLG8udXBkYXRlQm91bmQsby5zY3JvbGxQYXJlbnRzKSxvLnNjcm9sbEVsZW1lbnQ9cixvLmV2ZW50c0VuYWJsZWQ9ITAsb31mdW5jdGlvbiBJKCl7dGhpcy5zdGF0ZS5ldmVudHNFbmFibGVkfHwodGhpcy5zdGF0ZT1GKHRoaXMucmVmZXJlbmNlLHRoaXMub3B0aW9ucyx0aGlzLnN0YXRlLHRoaXMuc2NoZWR1bGVVcGRhdGUpKX1mdW5jdGlvbiBSKGUsdCl7cmV0dXJuIEEoZSkucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJyx0LnVwZGF0ZUJvdW5kKSx0LnNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbihlKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdC51cGRhdGVCb3VuZCl9KSx0LnVwZGF0ZUJvdW5kPW51bGwsdC5zY3JvbGxQYXJlbnRzPVtdLHQuc2Nyb2xsRWxlbWVudD1udWxsLHQuZXZlbnRzRW5hYmxlZD0hMSx0fWZ1bmN0aW9uIFUoKXt0aGlzLnN0YXRlLmV2ZW50c0VuYWJsZWQmJihjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjaGVkdWxlVXBkYXRlKSx0aGlzLnN0YXRlPVIodGhpcy5yZWZlcmVuY2UsdGhpcy5zdGF0ZSkpfWZ1bmN0aW9uIFkoZSl7cmV0dXJuJychPT1lJiYhaXNOYU4ocGFyc2VGbG9hdChlKSkmJmlzRmluaXRlKGUpfWZ1bmN0aW9uIGooZSx0KXtPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG8pe3ZhciBuPScnOy0xIT09Wyd3aWR0aCcsJ2hlaWdodCcsJ3RvcCcsJ3JpZ2h0JywnYm90dG9tJywnbGVmdCddLmluZGV4T2YobykmJlkodFtvXSkmJihuPSdweCcpLGUuc3R5bGVbb109dFtvXStufSl9ZnVuY3Rpb24gSyhlLHQpe09iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24obyl7dmFyIG49dFtvXTshMT09PW4/ZS5yZW1vdmVBdHRyaWJ1dGUobyk6ZS5zZXRBdHRyaWJ1dGUobyx0W29dKX0pfWZ1bmN0aW9uIHEoZSx0LG8pe3ZhciBuPUMoZSxmdW5jdGlvbihlKXt2YXIgbz1lLm5hbWU7cmV0dXJuIG89PT10fSksaT0hIW4mJmUuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gZS5uYW1lPT09byYmZS5lbmFibGVkJiZlLm9yZGVyPG4ub3JkZXJ9KTtpZighaSl7dmFyIHI9J2AnK3QrJ2AnO2NvbnNvbGUud2FybignYCcrbysnYCcrJyBtb2RpZmllciBpcyByZXF1aXJlZCBieSAnK3IrJyBtb2RpZmllciBpbiBvcmRlciB0byB3b3JrLCBiZSBzdXJlIHRvIGluY2x1ZGUgaXQgYmVmb3JlICcrcisnIScpfXJldHVybiBpfWZ1bmN0aW9uIEcoZSl7cmV0dXJuJ2VuZCc9PT1lPydzdGFydCc6J3N0YXJ0Jz09PWU/J2VuZCc6ZX1mdW5jdGlvbiBWKGUpe3ZhciB0PTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0sbz1tZS5pbmRleE9mKGUpLG49bWUuc2xpY2UobysxKS5jb25jYXQobWUuc2xpY2UoMCxvKSk7cmV0dXJuIHQ/bi5yZXZlcnNlKCk6bn1mdW5jdGlvbiB6KGUsdCxvLG4pe3ZhciBpPWUubWF0Y2goLygoPzpcXC18XFwrKT9cXGQqXFwuP1xcZCopKC4qKS8pLHI9K2lbMV0scD1pWzJdO2lmKCFyKXJldHVybiBlO2lmKDA9PT1wLmluZGV4T2YoJyUnKSl7dmFyIHM7c3dpdGNoKHApe2Nhc2UnJXAnOnM9bzticmVhaztjYXNlJyUnOmNhc2UnJXInOmRlZmF1bHQ6cz1uO312YXIgZD1nKHMpO3JldHVybiBkW3RdLzEwMCpyfWlmKCd2aCc9PT1wfHwndncnPT09cCl7dmFyIGE7cmV0dXJuIGE9J3ZoJz09PXA/Sihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LHdpbmRvdy5pbm5lckhlaWdodHx8MCk6Sihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsd2luZG93LmlubmVyV2lkdGh8fDApLGEvMTAwKnJ9cmV0dXJuIHJ9ZnVuY3Rpb24gXyhlLHQsbyxuKXt2YXIgaT1bMCwwXSxyPS0xIT09WydyaWdodCcsJ2xlZnQnXS5pbmRleE9mKG4pLHA9ZS5zcGxpdCgvKFxcK3xcXC0pLykubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0oKX0pLHM9cC5pbmRleE9mKEMocCxmdW5jdGlvbihlKXtyZXR1cm4tMSE9PWUuc2VhcmNoKC8sfFxccy8pfSkpO3Bbc10mJi0xPT09cFtzXS5pbmRleE9mKCcsJykmJmNvbnNvbGUud2FybignT2Zmc2V0cyBzZXBhcmF0ZWQgYnkgd2hpdGUgc3BhY2UocykgYXJlIGRlcHJlY2F0ZWQsIHVzZSBhIGNvbW1hICgsKSBpbnN0ZWFkLicpO3ZhciBkPS9cXHMqLFxccyp8XFxzKy8sYT0tMT09PXM/W3BdOltwLnNsaWNlKDAscykuY29uY2F0KFtwW3NdLnNwbGl0KGQpWzBdXSksW3Bbc10uc3BsaXQoZClbMV1dLmNvbmNhdChwLnNsaWNlKHMrMSkpXTtyZXR1cm4gYT1hLm1hcChmdW5jdGlvbihlLG4pe3ZhciBpPSgxPT09bj8hcjpyKT8naGVpZ2h0Jzond2lkdGgnLHA9ITE7cmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuJyc9PT1lW2UubGVuZ3RoLTFdJiYtMSE9PVsnKycsJy0nXS5pbmRleE9mKHQpPyhlW2UubGVuZ3RoLTFdPXQscD0hMCxlKTpwPyhlW2UubGVuZ3RoLTFdKz10LHA9ITEsZSk6ZS5jb25jYXQodCl9LFtdKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHooZSxpLHQsbyl9KX0pLGEuZm9yRWFjaChmdW5jdGlvbihlLHQpe2UuZm9yRWFjaChmdW5jdGlvbihvLG4pe1kobykmJihpW3RdKz1vKignLSc9PT1lW24tMV0/LTE6MSkpfSl9KSxpfWZ1bmN0aW9uIFgoZSx0KXt2YXIgbyxuPXQub2Zmc2V0LGk9ZS5wbGFjZW1lbnQscj1lLm9mZnNldHMscD1yLnBvcHBlcixzPXIucmVmZXJlbmNlLGQ9aS5zcGxpdCgnLScpWzBdO3JldHVybiBvPVkoK24pP1srbiwwXTpfKG4scCxzLGQpLCdsZWZ0Jz09PWQ/KHAudG9wKz1vWzBdLHAubGVmdC09b1sxXSk6J3JpZ2h0Jz09PWQ/KHAudG9wKz1vWzBdLHAubGVmdCs9b1sxXSk6J3RvcCc9PT1kPyhwLmxlZnQrPW9bMF0scC50b3AtPW9bMV0pOidib3R0b20nPT09ZCYmKHAubGVmdCs9b1swXSxwLnRvcCs9b1sxXSksZS5wb3BwZXI9cCxlfWZvcih2YXIgUT1NYXRoLm1pbixaPU1h
21167dGgucm91bmQsJD1NYXRoLmZsb29yLEo9TWF0aC5tYXgsZWU9J3VuZGVmaW5lZCchPXR5cGVvZiB3aW5kb3cmJid1bmRlZmluZWQnIT10eXBlb2YgZG9jdW1lbnQsdGU9WydFZGdlJywnVHJpZGVudCcsJ0ZpcmVmb3gnXSxvZT0wLG5lPTA7bmU8dGUubGVuZ3RoO25lKz0xKWlmKGVlJiYwPD1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YodGVbbmVdKSl7b2U9MTticmVha312YXIgaT1lZSYmd2luZG93LlByb21pc2UsaWU9aT9mdW5jdGlvbihlKXt2YXIgdD0hMTtyZXR1cm4gZnVuY3Rpb24oKXt0fHwodD0hMCx3aW5kb3cuUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3Q9ITEsZSgpfSkpfX06ZnVuY3Rpb24oZSl7dmFyIHQ9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7dHx8KHQ9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe3Q9ITEsZSgpfSxvZSkpfX0scmU9ZWUmJiEhKHdpbmRvdy5NU0lucHV0TWV0aG9kQ29udGV4dCYmZG9jdW1lbnQuZG9jdW1lbnRNb2RlKSxwZT1lZSYmL01TSUUgMTAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksc2U9ZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKX0sZGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBvLG49MDtuPHQubGVuZ3RoO24rKylvPXRbbl0sby5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsJ3ZhbHVlJ2luIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxvLmtleSxvKX1yZXR1cm4gZnVuY3Rpb24odCxvLG4pe3JldHVybiBvJiZlKHQucHJvdG90eXBlLG8pLG4mJmUodCxuKSx0fX0oKSxhZT1mdW5jdGlvbihlLHQsbyl7cmV0dXJuIHQgaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpvLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1vLGV9LGxlPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxvPTE7bzxhcmd1bWVudHMubGVuZ3RoO28rKylmb3IodmFyIG4gaW4gdD1hcmd1bWVudHNbb10sdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGV9LGZlPVsnYXV0by1zdGFydCcsJ2F1dG8nLCdhdXRvLWVuZCcsJ3RvcC1zdGFydCcsJ3RvcCcsJ3RvcC1lbmQnLCdyaWdodC1zdGFydCcsJ3JpZ2h0JywncmlnaHQtZW5kJywnYm90dG9tLWVuZCcsJ2JvdHRvbScsJ2JvdHRvbS1zdGFydCcsJ2xlZnQtZW5kJywnbGVmdCcsJ2xlZnQtc3RhcnQnXSxtZT1mZS5zbGljZSgzKSxoZT17RkxJUDonZmxpcCcsQ0xPQ0tXSVNFOidjbG9ja3dpc2UnLENPVU5URVJDTE9DS1dJU0U6J2NvdW50ZXJjbG9ja3dpc2UnfSxjZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobyxuKXt2YXIgaT10aGlzLHI9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O3NlKHRoaXMsdCksdGhpcy5zY2hlZHVsZVVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaS51cGRhdGUpfSx0aGlzLnVwZGF0ZT1pZSh0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpKSx0aGlzLm9wdGlvbnM9bGUoe30sdC5EZWZhdWx0cyxyKSx0aGlzLnN0YXRlPXtpc0Rlc3Ryb3llZDohMSxpc0NyZWF0ZWQ6ITEsc2Nyb2xsUGFyZW50czpbXX0sdGhpcy5yZWZlcmVuY2U9byYmby5qcXVlcnk/b1swXTpvLHRoaXMucG9wcGVyPW4mJm4uanF1ZXJ5P25bMF06bix0aGlzLm9wdGlvbnMubW9kaWZpZXJzPXt9LE9iamVjdC5rZXlzKGxlKHt9LHQuRGVmYXVsdHMubW9kaWZpZXJzLHIubW9kaWZpZXJzKSkuZm9yRWFjaChmdW5jdGlvbihlKXtpLm9wdGlvbnMubW9kaWZpZXJzW2VdPWxlKHt9LHQuRGVmYXVsdHMubW9kaWZpZXJzW2VdfHx7fSxyLm1vZGlmaWVycz9yLm1vZGlmaWVyc1tlXTp7fSl9KSx0aGlzLm1vZGlmaWVycz1PYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMubW9kaWZpZXJzKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGxlKHtuYW1lOmV9LGkub3B0aW9ucy5tb2RpZmllcnNbZV0pfSkuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLm9yZGVyLXQub3JkZXJ9KSx0aGlzLm1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuZW5hYmxlZCYmZSh0Lm9uTG9hZCkmJnQub25Mb2FkKGkucmVmZXJlbmNlLGkucG9wcGVyLGkub3B0aW9ucyx0LGkuc3RhdGUpfSksdGhpcy51cGRhdGUoKTt2YXIgcD10aGlzLm9wdGlvbnMuZXZlbnRzRW5hYmxlZDtwJiZ0aGlzLmVuYWJsZUV2ZW50TGlzdGVuZXJzKCksdGhpcy5zdGF0ZS5ldmVudHNFbmFibGVkPXB9cmV0dXJuIGRlKHQsW3trZXk6J3VwZGF0ZScsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gay5jYWxsKHRoaXMpfX0se2tleTonZGVzdHJveScsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gQi5jYWxsKHRoaXMpfX0se2tleTonZW5hYmxlRXZlbnRMaXN0ZW5lcnMnLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIEkuY2FsbCh0aGlzKX19LHtrZXk6J2Rpc2FibGVFdmVudExpc3RlbmVycycsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gVS5jYWxsKHRoaXMpfX1dKSx0fSgpO3JldHVybiBjZS5VdGlscz0oJ3VuZGVmaW5lZCc9PXR5cGVvZiB3aW5kb3c/Z2xvYmFsOndpbmRvdykuUG9wcGVyVXRpbHMsY2UucGxhY2VtZW50cz1mZSxjZS5EZWZhdWx0cz17cGxhY2VtZW50Oidib3R0b20nLHBvc2l0aW9uRml4ZWQ6ITEsZXZlbnRzRW5hYmxlZDohMCxyZW1vdmVPbkRlc3Ryb3k6ITEsb25DcmVhdGU6ZnVuY3Rpb24oKXt9LG9uVXBkYXRlOmZ1bmN0aW9uKCl7fSxtb2RpZmllcnM6e3NoaWZ0OntvcmRlcjoxMDAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlKXt2YXIgdD1lLnBsYWNlbWVudCxvPXQuc3BsaXQoJy0nKVswXSxuPXQuc3BsaXQoJy0nKVsxXTtpZihuKXt2YXIgaT1lLm9mZnNldHMscj1pLnJlZmVyZW5jZSxwPWkucG9wcGVyLHM9LTEhPT1bJ2JvdHRvbScsJ3RvcCddLmluZGV4T2YobyksZD1zPydsZWZ0JzondG9wJyxhPXM/J3dpZHRoJzonaGVpZ2h0JyxsPXtzdGFydDphZSh7fSxkLHJbZF0pLGVuZDphZSh7fSxkLHJbZF0rclthXS1wW2FdKX07ZS5vZmZzZXRzLnBvcHBlcj1sZSh7fSxwLGxbbl0pfXJldHVybi
21167BlfX0sb2Zmc2V0OntvcmRlcjoyMDAsZW5hYmxlZDohMCxmbjpYLG9mZnNldDowfSxwcmV2ZW50T3ZlcmZsb3c6e29yZGVyOjMwMCxlbmFibGVkOiEwLGZuOmZ1bmN0aW9uKGUsdCl7dmFyIG89dC5ib3VuZGFyaWVzRWxlbWVudHx8cChlLmluc3RhbmNlLnBvcHBlcik7ZS5pbnN0YW5jZS5yZWZlcmVuY2U9PT1vJiYobz1wKG8pKTt2YXIgbj1IKCd0cmFuc2Zvcm0nKSxpPWUuaW5zdGFuY2UucG9wcGVyLnN0eWxlLHI9aS50b3Ascz1pLmxlZnQsZD1pW25dO2kudG9wPScnLGkubGVmdD0nJyxpW25dPScnO3ZhciBhPXYoZS5pbnN0YW5jZS5wb3BwZXIsZS5pbnN0YW5jZS5yZWZlcmVuY2UsdC5wYWRkaW5nLG8sZS5wb3NpdGlvbkZpeGVkKTtpLnRvcD1yLGkubGVmdD1zLGlbbl09ZCx0LmJvdW5kYXJpZXM9YTt2YXIgbD10LnByaW9yaXR5LGY9ZS5vZmZzZXRzLnBvcHBlcixtPXtwcmltYXJ5OmZ1bmN0aW9uKGUpe3ZhciBvPWZbZV07cmV0dXJuIGZbZV08YVtlXSYmIXQuZXNjYXBlV2l0aFJlZmVyZW5jZSYmKG89SihmW2VdLGFbZV0pKSxhZSh7fSxlLG8pfSxzZWNvbmRhcnk6ZnVuY3Rpb24oZSl7dmFyIG89J3JpZ2h0Jz09PWU/J2xlZnQnOid0b3AnLG49ZltvXTtyZXR1cm4gZltlXT5hW2VdJiYhdC5lc2NhcGVXaXRoUmVmZXJlbmNlJiYobj1RKGZbb10sYVtlXS0oJ3JpZ2h0Jz09PWU/Zi53aWR0aDpmLmhlaWdodCkpKSxhZSh7fSxvLG4pfX07cmV0dXJuIGwuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD0tMT09PVsnbGVmdCcsJ3RvcCddLmluZGV4T2YoZSk/J3NlY29uZGFyeSc6J3ByaW1hcnknO2Y9bGUoe30sZixtW3RdKGUpKX0pLGUub2Zmc2V0cy5wb3BwZXI9ZixlfSxwcmlvcml0eTpbJ2xlZnQnLCdyaWdodCcsJ3RvcCcsJ2JvdHRvbSddLHBhZGRpbmc6NSxib3VuZGFyaWVzRWxlbWVudDonc2Nyb2xsUGFyZW50J30sa2VlcFRvZ2V0aGVyOntvcmRlcjo0MDAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlKXt2YXIgdD1lLm9mZnNldHMsbz10LnBvcHBlcixuPXQucmVmZXJlbmNlLGk9ZS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXSxyPSQscD0tMSE9PVsndG9wJywnYm90dG9tJ10uaW5kZXhPZihpKSxzPXA/J3JpZ2h0JzonYm90dG9tJyxkPXA/J2xlZnQnOid0b3AnLGE9cD8nd2lkdGgnOidoZWlnaHQnO3JldHVybiBvW3NdPHIobltkXSkmJihlLm9mZnNldHMucG9wcGVyW2RdPXIobltkXSktb1thXSksb1tkXT5yKG5bc10pJiYoZS5vZmZzZXRzLnBvcHBlcltkXT1yKG5bc10pKSxlfX0sYXJyb3c6e29yZGVyOjUwMCxlbmFibGVkOiEwLGZuOmZ1bmN0aW9uKGUsbyl7dmFyIG47aWYoIXEoZS5pbnN0YW5jZS5tb2RpZmllcnMsJ2Fycm93Jywna2VlcFRvZ2V0aGVyJykpcmV0dXJuIGU7dmFyIGk9by5lbGVtZW50O2lmKCdzdHJpbmcnPT10eXBlb2YgaSl7aWYoaT1lLmluc3RhbmNlLnBvcHBlci5xdWVyeVNlbGVjdG9yKGkpLCFpKXJldHVybiBlO31lbHNlIGlmKCFlLmluc3RhbmNlLnBvcHBlci5jb250YWlucyhpKSlyZXR1cm4gY29uc29sZS53YXJuKCdXQVJOSU5HOiBgYXJyb3cuZWxlbWVudGAgbXVzdCBiZSBjaGlsZCBvZiBpdHMgcG9wcGVyIGVsZW1lbnQhJyksZTt2YXIgcj1lLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdLHA9ZS5vZmZzZXRzLHM9cC5wb3BwZXIsZD1wLnJlZmVyZW5jZSxhPS0xIT09WydsZWZ0JywncmlnaHQnXS5pbmRleE9mKHIpLGw9YT8naGVpZ2h0Jzond2lkdGgnLGY9YT8nVG9wJzonTGVmdCcsbT1mLnRvTG93ZXJDYXNlKCksaD1hPydsZWZ0JzondG9wJyxjPWE/J2JvdHRvbSc6J3JpZ2h0Jyx1PVMoaSlbbF07ZFtjXS11PHNbbV0mJihlLm9mZnNldHMucG9wcGVyW21dLT1zW21dLShkW2NdLXUpKSxkW21dK3U+c1tjXSYmKGUub2Zmc2V0cy5wb3BwZXJbbV0rPWRbbV0rdS1zW2NdKSxlLm9mZnNldHMucG9wcGVyPWcoZS5vZmZzZXRzLnBvcHBlcik7dmFyIGI9ZFttXStkW2xdLzItdS8yLHk9dChlLmluc3RhbmNlLnBvcHBlciksdz1wYXJzZUZsb2F0KHlbJ21hcmdpbicrZl0sMTApLEU9cGFyc2VGbG9hdCh5Wydib3JkZXInK2YrJ1dpZHRoJ10sMTApLHY9Yi1lLm9mZnNldHMucG9wcGVyW21dLXctRTtyZXR1cm4gdj1KKFEoc1tsXS11LHYpLDApLGUuYXJyb3dFbGVtZW50PWksZS5vZmZzZXRzLmFycm93PShuPXt9LGFlKG4sbSxaKHYpKSxhZShuLGgsJycpLG4pLGV9LGVsZW1lbnQ6J1t4LWFycm93XSd9LGZsaXA6e29yZGVyOjYwMCxlbmFibGVkOiEwLGZuOmZ1bmN0aW9uKGUsdCl7aWYoVyhlLmluc3RhbmNlLm1vZGlmaWVycywnaW5uZXInKSlyZXR1cm4gZTtpZihlLmZsaXBwZWQmJmUucGxhY2VtZW50PT09ZS5vcmlnaW5hbFBsYWNlbWVudClyZXR1cm4gZTt2YXIgbz12KGUuaW5zdGFuY2UucG9wcGVyLGUuaW5zdGFuY2UucmVmZXJlbmNlLHQucGFkZGluZyx0LmJvdW5kYXJpZXNFbGVtZW50LGUucG9zaXRpb25GaXhlZCksbj1lLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdLGk9VChuKSxyPWUucGxhY2VtZW50LnNwbGl0KCctJylbMV18fCcnLHA9W107c3dpdGNoKHQuYmVoYXZpb3Ipe2Nhc2UgaGUuRkxJUDpwPVtuLGldO2JyZWFrO2Nhc2UgaGUuQ0xPQ0tXSVNFOnA9VihuKTticmVhaztjYXNlIGhlLkNPVU5URVJDTE9DS1dJU0U6cD1WKG4sITApO2JyZWFrO2RlZmF1bHQ6cD10LmJlaGF2aW9yO31yZXR1cm4gcC5mb3JFYWNoKGZ1bmN0aW9uKHMsZCl7aWYobiE9PXN8fHAubGVuZ3RoPT09ZCsxKXJldHVybiBlO249ZS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXSxpPVQobik7dmFyIGE9ZS5vZmZzZXRzLnBvcHBlcixsPWUub2Zmc2V0cy5yZWZlcmVuY2UsZj0kLG09J2xlZnQnPT09biYmZihhLnJpZ2h0KT5mKGwubGVmdCl8fCdyaWdodCc9PT1uJiZmKGEubGVmdCk8ZihsLnJpZ2h0KXx8J3RvcCc9PT1uJiZmKGEuYm90dG9tKT5mKGwudG9wKXx8J2JvdHRvbSc9PT1uJiZmKGEudG9wKTxmKGwuYm90dG9tKSxoPWYoYS5sZWZ0KTxmKG8ubGVmdCksYz1mKGEucmlnaHQpPmYoby5yaWdodCksZz1mKGEudG9wKTxmKG8udG9wKSx1PWYoYS5ib3R0b20pPmYoby5ib3R0b20pLGI9J2xlZnQnPT09biYmaHx8J3JpZ2h0Jz09PW4mJmN8fCd0b3AnPT09biYmZ3x8J2JvdHRvbSc9PT1uJiZ1LHk9LTEhPT1bJ3RvcCcsJ2JvdHRvbSddLmluZGV4T2Yobiksdz0hIXQuZmxpcFZhcmlhdGlvbnMmJih5JiYnc3RhcnQnPT09ciYmaHx8eSYmJ2VuZCc9PT1yJiZjfHwheSYmJ3N0YXJ0Jz09PXImJmd8fCF5JiYnZW5kJz09PXImJnUpOyhtfHxifHx3KSYmKGUuZmxpcHBlZD0hMCwobXx8YikmJihuPXBbZCsxXSksdyYmKHI9RyhyKSksZS5wbGFjZW1lbnQ9bisocj8nLScrcjonJyksZS5vZmZzZXRzLnBvcHBlcj1sZSh7fSxlLm9mZnNldHMucG9wcGVyLEQoZS5pbnN0YW5jZS5wb3BwZXIsZS5vZmZzZXRzLnJlZmVyZW5jZSxlLnBsYWNlbWVudCkpLGU9UChlLmluc3RhbmNlLm1vZGlmaWVycyxlLCdmbGlwJykpfSksZX0sYmVoYXZpb3I6J2ZsaXAnLHBhZGRpbmc6NSxib3VuZGFyaWVzRWxlbWVudDondmlld3BvcnQnfSxpbm5lcjp7b3JkZXI6NzAwLGVuYWJsZWQ6ITEsZm46ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wbGFjZW1lbnQsbz10LnNwbGl0KCctJylbMF0sbj1lLm9mZnNldHMsaT1uLnBvcHBlcixyPW4ucmVmZXJlbmNlLHA9LTEhPT1bJ2xlZnQnLCdyaWdodCddLmluZGV4T2Yobykscz0tMT09PVsndG9wJywnbGVmdCddLmluZGV4T2Yobyk7cmV0dXJuIGlbcD8nbGVmdCc6J3RvcCddPXJbb10tKHM/aVtwPyd3aWR0aCc6J2hlaWdodCddOjApLGUucGxhY2VtZW50PVQodCksZS5vZmZzZXRzLnBvcHBlcj1nKGkpLGV9fSxoaWRlOntvcmRlcjo4MDAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlKXtpZighcS
21167hlLmluc3RhbmNlLm1vZGlmaWVycywnaGlkZScsJ3ByZXZlbnRPdmVyZmxvdycpKXJldHVybiBlO3ZhciB0PWUub2Zmc2V0cy5yZWZlcmVuY2Usbz1DKGUuaW5zdGFuY2UubW9kaWZpZXJzLGZ1bmN0aW9uKGUpe3JldHVybidwcmV2ZW50T3ZlcmZsb3cnPT09ZS5uYW1lfSkuYm91bmRhcmllcztpZih0LmJvdHRvbTxvLnRvcHx8dC5sZWZ0Pm8ucmlnaHR8fHQudG9wPm8uYm90dG9tfHx0LnJpZ2h0PG8ubGVmdCl7aWYoITA9PT1lLmhpZGUpcmV0dXJuIGU7ZS5oaWRlPSEwLGUuYXR0cmlidXRlc1sneC1vdXQtb2YtYm91bmRhcmllcyddPScnfWVsc2V7aWYoITE9PT1lLmhpZGUpcmV0dXJuIGU7ZS5oaWRlPSExLGUuYXR0cmlidXRlc1sneC1vdXQtb2YtYm91bmRhcmllcyddPSExfXJldHVybiBlfX0sY29tcHV0ZVN0eWxlOntvcmRlcjo4NTAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlLHQpe3ZhciBvPXQueCxuPXQueSxpPWUub2Zmc2V0cy5wb3BwZXIscj1DKGUuaW5zdGFuY2UubW9kaWZpZXJzLGZ1bmN0aW9uKGUpe3JldHVybidhcHBseVN0eWxlJz09PWUubmFtZX0pLmdwdUFjY2VsZXJhdGlvbjt2b2lkIDAhPT1yJiZjb25zb2xlLndhcm4oJ1dBUk5JTkc6IGBncHVBY2NlbGVyYXRpb25gIG9wdGlvbiBtb3ZlZCB0byBgY29tcHV0ZVN0eWxlYCBtb2RpZmllciBhbmQgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBQb3BwZXIuanMhJyk7dmFyIHMsZCxhPXZvaWQgMD09PXI/dC5ncHVBY2NlbGVyYXRpb246cixsPXAoZS5pbnN0YW5jZS5wb3BwZXIpLGY9dShsKSxtPXtwb3NpdGlvbjppLnBvc2l0aW9ufSxoPXtsZWZ0OiQoaS5sZWZ0KSx0b3A6WihpLnRvcCksYm90dG9tOlooaS5ib3R0b20pLHJpZ2h0OiQoaS5yaWdodCl9LGM9J2JvdHRvbSc9PT1vPyd0b3AnOidib3R0b20nLGc9J3JpZ2h0Jz09PW4/J2xlZnQnOidyaWdodCcsYj1IKCd0cmFuc2Zvcm0nKTtpZihkPSdib3R0b20nPT1jPydIVE1MJz09PWwubm9kZU5hbWU/LWwuY2xpZW50SGVpZ2h0K2guYm90dG9tOi1mLmhlaWdodCtoLmJvdHRvbTpoLnRvcCxzPSdyaWdodCc9PWc/J0hUTUwnPT09bC5ub2RlTmFtZT8tbC5jbGllbnRXaWR0aCtoLnJpZ2h0Oi1mLndpZHRoK2gucmlnaHQ6aC5sZWZ0LGEmJmIpbVtiXT0ndHJhbnNsYXRlM2QoJytzKydweCwgJytkKydweCwgMCknLG1bY109MCxtW2ddPTAsbS53aWxsQ2hhbmdlPSd0cmFuc2Zvcm0nO2Vsc2V7dmFyIHk9J2JvdHRvbSc9PWM/LTE6MSx3PSdyaWdodCc9PWc/LTE6MTttW2NdPWQqeSxtW2ddPXMqdyxtLndpbGxDaGFuZ2U9YysnLCAnK2d9dmFyIEU9e1wieC1wbGFjZW1lbnRcIjplLnBsYWNlbWVudH07cmV0dXJuIGUuYXR0cmlidXRlcz1sZSh7fSxFLGUuYXR0cmlidXRlcyksZS5zdHlsZXM9bGUoe30sbSxlLnN0eWxlcyksZS5hcnJvd1N0eWxlcz1sZSh7fSxlLm9mZnNldHMuYXJyb3csZS5hcnJvd1N0eWxlcyksZX0sZ3B1QWNjZWxlcmF0aW9uOiEwLHg6J2JvdHRvbScseToncmlnaHQnfSxhcHBseVN0eWxlOntvcmRlcjo5MDAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlKXtyZXR1cm4gaihlLmluc3RhbmNlLnBvcHBlcixlLnN0eWxlcyksSyhlLmluc3RhbmNlLnBvcHBlcixlLmF0dHJpYnV0ZXMpLGUuYXJyb3dFbGVtZW50JiZPYmplY3Qua2V5cyhlLmFycm93U3R5bGVzKS5sZW5ndGgmJmooZS5hcnJvd0VsZW1lbnQsZS5hcnJvd1N0eWxlcyksZX0sb25Mb2FkOmZ1bmN0aW9uKGUsdCxvLG4saSl7dmFyIHI9TChpLHQsZSxvLnBvc2l0aW9uRml4ZWQpLHA9TyhvLnBsYWNlbWVudCxyLHQsZSxvLm1vZGlmaWVycy5mbGlwLmJvdW5kYXJpZXNFbGVtZW50LG8ubW9kaWZpZXJzLmZsaXAucGFkZGluZyk7cmV0dXJuIHQuc2V0QXR0cmlidXRlKCd4LXBsYWNlbWVudCcscCksaih0LHtwb3NpdGlvbjpvLnBvc2l0aW9uRml4ZWQ/J2ZpeGVkJzonYWJzb2x1dGUnfSksb30sZ3B1QWNjZWxlcmF0aW9uOnZvaWQgMH19fSxjZX0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9wcGVyLm1pbi5qcy5tYXBcbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjQuMC4wLWFscGhhLjYpOiBpbmRleC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cbihmdW5jdGlvbiAoJCkge1xuICBpZiAodHlwZW9mICQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwXFwncyBKYXZhU2NyaXB0IHJlcXVpcmVzIGpRdWVyeS4galF1ZXJ5IG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIEJvb3RzdHJhcFxcJ3MgSmF2YVNjcmlwdC4nKTtcbiAgfVxuXG4gIHZhciB2ZXJzaW9uID0gJC5mbi5qcXVlcnkuc3BsaXQoJyAnKVswXS5zcGxpdCgnLicpO1xuICB2YXIgbWluTWFqb3IgPSAxO1xuICB2YXIgbHRNYWpvciA9IDI7XG4gIHZhciBtaW5NaW5vciA9IDk7XG4gIHZhciBtaW5QYXRjaCA9IDE7XG4gIHZhciBtYXhNYWpvciA9IDQ7XG5cbiAgaWYgKHZlcnNpb25bMF0gPCBsdE1ham9yICYmIHZlcnNpb25bMV0gPCBtaW5NaW5vciB8fCB2ZXJzaW9uWzBdID09PSBtaW5NYWpvciAmJiB2ZXJzaW9uWzFdID09PSBtaW5NaW5vciAmJiB2ZXJzaW9uWzJdIDwgbWluUGF0Y2ggfHwgdmVyc2lvblswXSA+PSBtYXhNYWpvcikge1xuICAgIHRocm93IG5ldyBFcnJvcignQm9vdHN0cmFwXFwncyBKYXZhU2NyaXB0IHJlcXVpcmVzIGF0IGxlYXN0IGpRdWVyeSB2MS45LjEgYnV0IGxlc3MgdGhhbiB2NC4wLjAnKTtcbiAgfVxufSkoJCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY0LjAuMCk6IHV0aWwuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG52YXIgVXRpbCA9IGZ1bmN0aW9uICgkKSB7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogUHJpdmF0ZSBUcmFuc2l0aW9uRW5kIEhlbHBlcnNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICB2YXIgdHJhbnNpdGlvbiA9IGZhbHNlO1xuICB2YXIgTUFYX1VJRCA9IDEwMDAwMDA7IC8vIFNob3V0b3V0IEFuZ3VzQ3JvbGwgKGh0dHBzOi8vZ29vLmdsL3B4d1FHcClcblxuICBmdW5jdGlvbiB0b1R5cGUob2JqKSB7XG4gICAgcmV0dXJuIHt9LnRvU3RyaW5nLmNhbGwob2JqKS5tYXRjaCgvXFxzKFthLXpBLVpdKykvKVsxXS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U3BlY2lhbFRyYW5zaXRpb25FbmRFdmVudCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmluZFR5cGU6IHRyYW5zaXRpb24uZW5kLFxuICAgICAgZGVsZWdhdGVUeXBlOiB0cmFuc2l0aW9uLmVuZCxcbiAgICAgIGhhbmRsZTogZnVuY3Rpb24gaGFuZGxlKGV2ZW50KSB7XG4gICAgICAgIGlmICgkKGV2ZW50LnRhcmdldCkuaXModGhpcykpIHtcbiAgICAgICAgICByZXR1cm4gZXZlbnQuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgICAgfVxuXG4gICAgICAgI
21167HJldHVybiB1bmRlZmluZWQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zaXRpb25FbmRUZXN0KCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuUVVuaXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZW5kOiAndHJhbnNpdGlvbmVuZCdcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNpdGlvbkVuZEVtdWxhdG9yKGR1cmF0aW9uKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgICAkKHRoaXMpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgVXRpbC50cmlnZ2VyVHJhbnNpdGlvbkVuZChfdGhpcyk7XG4gICAgICB9XG4gICAgfSwgZHVyYXRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0VHJhbnNpdGlvbkVuZFN1cHBvcnQoKSB7XG4gICAgdHJhbnNpdGlvbiA9IHRyYW5zaXRpb25FbmRUZXN0KCk7XG4gICAgJC5mbi5lbXVsYXRlVHJhbnNpdGlvbkVuZCA9IHRyYW5zaXRpb25FbmRFbXVsYXRvcjtcblxuICAgIGlmIChVdGlsLnN1cHBvcnRzVHJhbnNpdGlvbkVuZCgpKSB7XG4gICAgICAkLmV2ZW50LnNwZWNpYWxbVXRpbC5UUkFOU0lUSU9OX0VORF0gPSBnZXRTcGVjaWFsVHJhbnNpdGlvbkVuZEV2ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXNjYXBlSWQoc2VsZWN0b3IpIHtcbiAgICAvLyBXZSBlc2NhcGUgSURzIGluIGNhc2Ugb2Ygc3BlY2lhbCBzZWxlY3RvcnMgKHNlbGVjdG9yID0gJyNteUlkOnNvbWV0aGluZycpXG4gICAgLy8gJC5lc2NhcGVTZWxlY3RvciBkb2VzIG5vdCBleGlzdCBpbiBqUXVlcnkgPCAzXG4gICAgc2VsZWN0b3IgPSB0eXBlb2YgJC5lc2NhcGVTZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJyA/ICQuZXNjYXBlU2VsZWN0b3Ioc2VsZWN0b3IpLnN1YnN0cigxKSA6IHNlbGVjdG9yLnJlcGxhY2UoLyg6fFxcLnxcXFt8XFxdfCx8PXxAKS9nLCAnXFxcXCQxJyk7XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBQdWJsaWMgVXRpbCBBcGlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICB2YXIgVXRpbCA9IHtcbiAgICBUUkFOU0lUSU9OX0VORDogJ2JzVHJhbnNpdGlvbkVuZCcsXG4gICAgZ2V0VUlEOiBmdW5jdGlvbiBnZXRVSUQocHJlZml4KSB7XG4gICAgICBkbyB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICAgIHByZWZpeCArPSB+fihNYXRoLnJhbmRvbSgpICogTUFYX1VJRCk7IC8vIFwifn5cIiBhY3RzIGxpa2UgYSBmYXN0ZXIgTWF0aC5mbG9vcigpIGhlcmVcbiAgICAgIH0gd2hpbGUgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByZWZpeCkpO1xuXG4gICAgICByZXR1cm4gcHJlZml4O1xuICAgIH0sXG4gICAgZ2V0U2VsZWN0b3JGcm9tRWxlbWVudDogZnVuY3Rpb24gZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgICB2Y
21167XIgc2VsZWN0b3IgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS10YXJnZXQnKTtcblxuICAgICAgaWYgKCFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gJyMnKSB7XG4gICAgICAgIHNlbGVjdG9yID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSB8fCAnJztcbiAgICAgIH0gLy8gSWYgaXQncyBhbiBJRFxuXG5cbiAgICAgIGlmIChzZWxlY3Rvci5jaGFyQXQoMCkgPT09ICcjJykge1xuICAgICAgICBzZWxlY3RvciA9IGVzY2FwZUlkKHNlbGVjdG9yKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyICRzZWxlY3RvciA9ICQoZG9jdW1lbnQpLmZpbmQoc2VsZWN0b3IpO1xuICAgICAgICByZXR1cm4gJHNlbGVjdG9yLmxlbmd0aCA+IDAgPyBzZWxlY3RvciA6IG51bGw7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICByZWZsb3c6IGZ1bmN0aW9uIHJlZmxvdyhlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgfSxcbiAgICB0cmlnZ2VyVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24gdHJpZ2dlclRyYW5zaXRpb25FbmQoZWxlbWVudCkge1xuICAgICAgJChlbGVtZW50KS50cmlnZ2VyKHRyYW5zaXRpb24uZW5kKTtcbiAgICB9LFxuICAgIHN1cHBvcnRzVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24gc3VwcG9ydHNUcmFuc2l0aW9uRW5kKCkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4odHJhbnNpdGlvbik7XG4gICAgfSxcbiAgICBpc0VsZW1lbnQ6IGZ1bmN0aW9uIGlzRWxlbWVudChvYmopIHtcbiAgICAgIHJldHVybiAob2JqWzBdIHx8IG9iaikubm9kZVR5cGU7XG4gICAgfSxcbiAgICB0eXBlQ2hlY2tDb25maWc6IGZ1bmN0aW9uIHR5cGVDaGVja0NvbmZpZyhjb21wb25lbnROYW1lLCBjb25maWcsIGNvbmZpZ1R5cGVzKSB7XG4gICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBjb25maWdUeXBlcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZ1R5cGVzLCBwcm9wZXJ0eSkpIHtcbiAgICAgICAgICB2Y
21167XIgZXhwZWN0ZWRUeXBlcyA9IGNvbmZpZ1R5cGVzW3Byb3BlcnR5XTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBjb25maWdbcHJvcGVydHldO1xuICAgICAgICAgIHZhciB2YWx1ZVR5cGUgPSB2YWx1ZSAmJiBVdGlsLmlzRWxlbWVudCh2YWx1ZSkgPyAnZWxlbWVudCcgOiB0b1R5cGUodmFsdWUpO1xuXG4gICAgICAgICAgaWYgKCFuZXcgUmVnRXhwKGV4cGVjdGVkVHlwZXMpLnRlc3QodmFsdWVUeXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbXBvbmVudE5hbWUudG9VcHBlckNhc2UoKSArIFwiOiBcIiArIChcIk9wdGlvbiBcXFwiXCIgKyBwcm9wZXJ0eSArIFwiXFxcIiBwcm92aWRlZCB0eXBlIFxcXCJcIiArIHZhbHVlVHlwZSArIFwiXFxcIiBcIikgKyAoXCJidXQgZXhwZWN0ZWQgdHlwZSBcXFwiXCIgKyBleHBlY3RlZFR5cGVzICsgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBzZXRUcmFuc2l0aW9uRW5kU3VwcG9ydCgpO1xuICByZXR1cm4gVXRpbDtcbn0oJCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci
211675rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NC4wLjApOiBidXR0b24uanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG52YXIgQnV0dG9uID0gZnVuY3Rpb24gKCQpIHtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDb25zdGFudHNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICB2YXIgTkFNRSA9ICdidXR0b24nO1xuICB2YXIgVkVSU0lPTiA9ICc0LjAuMCc7XG4gIHZhciBEQVRBX0tFWSA9ICdicy5idXR0b24nO1xuICB2YXIgRVZFTlRfS0VZID0gXCIuXCIgKyBEQVRBX0tFWTtcbiAgdmFyIERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknO1xuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUID0gJC5mbltOQU1FXTtcbiAgdmFyIENsYXNzTmFtZSA9IHtcbiAgICBBQ1RJVkU6ICdhY3RpdmUnLFxuICAgIEJVVFRPTjogJ2J0bicsXG4gICAgRk9DVVM6ICdmb2N1cydcbiAgfTtcbiAgdmFyIFNlbGVjdG9yID0ge1xuICAgIERBVEFfVE9HR0xFX0NBUlJPVDogJ1tkYXRhLXRvZ2dsZV49XCJidXR0b25cIl0nLFxuICAgIERBVEFfVE9HR0xFOiAnW2RhdGEtdG9nZ2xlPVwiYnV0dG9uc1wiXScsXG4gICAgSU5QVVQ6ICdpbnB1dCcsXG4gICAgQUNUSVZFOiAnLmFjdGl2ZScsXG4gICAgQlVUVE9OOiAnLmJ0bidcbiAgfTtcbiAgdmFyIEV2ZW50ID0ge1xuICAgIENMSUNLX0RBVEFfQVBJOiBcImNsaWNrXCIgKyBFVkVOVF9LRVkgKyBEQVRBX0FQSV9LRVksXG4gICAgRk9DVVNfQkxVUl9EQVRBX0FQSTogXCJmb2N1c1wiICsgRVZFTlRfS0VZICsgREFUQV9BUElfS0VZICsgXCIgXCIgKyAoXCJibHVyXCIgKyBFVkVOVF9LRVkgKyBEQVRBX0FQSV9LRVkpXG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuXG4gIH07XG5cbiAgdmFyIEJ1dHRvbiA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJ1dHRvbihlbGVtZW50KSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgdmFyIF9wcm90byA9IEJ1dHRvbi5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgICAgdmFyIHRyaWdnZXJDaGFuZ2VFdmVudCA9IHRydWU7XG4gICAgICB2Y
21167XIgYWRkQXJpYVByZXNzZWQgPSB0cnVlO1xuICAgICAgdmFyIHJvb3RFbGVtZW50ID0gJCh0aGlzLl9lbGVtZW50KS5jbG9zZXN0KFNlbGVjdG9yLkRBVEFfVE9HR0xFKVswXTtcblxuICAgICAgaWYgKHJvb3RFbGVtZW50KSB7XG4gICAgICAgIHZhciBpbnB1dCA9ICQodGhpcy5fZWxlbWVudCkuZmluZChTZWxlY3Rvci5JTlBVVClbMF07XG5cbiAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgaWYgKGlucHV0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5jaGVja2VkICYmICQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLkFDVElWRSkpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckNoYW5nZUV2ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgYWN0aXZlRWxlbWVudCA9ICQocm9vdEVsZW1lbnQpLmZpbmQoU2VsZWN0b3IuQUNUSVZFKVswXTtcblxuICAgICAgICAgICAgICBpZiAoYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICQoYWN0aXZlRWxlbWVudCkucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLkFDVElWRSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpIHx8IHJvb3RFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCBpbnB1dC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykgfHwgcm9vdEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9ICEkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5BQ1RJVkUpO1xuICAgICAgICAgICAgJChpbnB1dCkudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICBhZGRBcmlhUHJlc3NlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGRBcmlhUHJlc3NlZCkge1xuICAgICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgISQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLkFDVElWRSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHJpZ2dlckNoYW5nZUV2ZW50KSB7XG4gICAgICAgICQodGhpcy5fZWxlbWVudCkudG9nZ2xlQ2xhc3MoQ2xhc3NOYW1lLkFDVElWRSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgICQucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSk7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICB9OyAvLyBTdGF0aWNcblxuXG4gICAgQnV0dG9uLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYXRhID0gJCh0aGlzKS5kYXRhKERBVEFfS0VZKTtcblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IEJ1dHRvbih0aGlzKTtcbiAgICAgICAgICAkKHRoaXMpLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9jcmVhdGVDbGFzcyhCdXR0b24sIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBCdXR0b247XG4gIH0oKTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAkKGRvY3VtZW50KS5vbihFdmVudC5DTElDS19EQVRBX0FQSSwgU2VsZWN0b3IuREFUQV9UT0dHTEVfQ0FSUk9ULCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBidXR0b24gPSBldmVudC50YXJnZXQ7XG5cbiAgICBpZiAoISQoYnV0dG9uKS5oYXNDbGFzcyhDbGFzc05hbWUuQlVUVE9OKSkge1xuICAgICAgYnV0dG9uID0gJChidXR0b24pLmNsb3Nlc3QoU2VsZWN0b3IuQlVUVE9OKTtcbiAgICB9XG5cbiAgICBCdXR0b24uX2pRdWVyeUludGVyZmFjZS5jYWxsKCQoYnV0dG9uKSwgJ3RvZ2dsZScpO1xuICB9KS5vbihFdmVudC5GT0NVU19CTFVSX0RBVEFfQVBJLCBTZWxlY3Rvci5EQVRBX1RPR0dMRV9DQVJST1QsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBidXR0b24gPSAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChTZWxlY3Rvci5CVVRUT04pWzBdO1xuICAgICQoYnV0dG9uKS50b2dnbGVDbGFzcyhDbGFzc05hbWUuRk9DVVMsIC9eZm9jdXMoaW4pPyQvLnRlc3QoZXZlbnQudHlwZSkpO1xuICB9KTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBqUXVlcnlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gICQuZm5bTkFNRV0gPSBCdXR0b24uX2pRdWVyeUludGVyZmFjZTtcbiAgJC5mbltOQU1FXS5Db25zdHJ1Y3RvciA9IEJ1dHRvbjtcblxuICAkLmZuW05BTUVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbltOQU1FXSA9IEpRVUVSWV9OT19DT05GTElDVDtcbiAgICByZXR1cm4gQnV0dG9uLl9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgcmV0dXJuIEJ1dHRvbjt
21167cbn0oJCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1idXR0b24uanMubWFwIiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY0LjAuMCk6IGNvbGxhcHNlLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xudmFyIENvbGxhcHNlID0gZnVuY3Rpb24gKCQpIHtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDb25zdGFudHNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICB2YXIgTkFNRSA9ICdjb2xsYXBzZSc7XG4gIHZhciBWRVJTSU9OID0gJzQuMC4wJztcbiAgdmFyIERBVEFfS0VZID0gJ2JzLmNvbGxhcHNlJztcbiAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XG4gIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bTkFNRV07XG4gIHZhciBUUkFOU0lUSU9OX0RVUkFUSU9OID0gNjAwO1xuICB2YXIgRGVmYXVsdCA9IHtcbiAgICB0b2dnbGU6IHRydWUsXG4gICAgcGFyZW50OiAnJ1xuICB9O1xuICB2YXIgRGVmYXVsdFR5cGUgPSB7XG4gICAgdG9nZ2xlOiAnYm9vbGVhbicsXG4gICAgcGFyZW50OiAnKHN0cmluZ3xlbGVtZW50KSdcbiAgfTtcbiAgdmFyIEV2ZW50ID0ge1xuICAgIFNIT1c6IFwic2hvd1wiICsgRVZFTlRfS0VZLFxuICAgIFNIT1dOOiBcInNob3duXCIgKyBFVkVOVF9LRVksXG4gICAgSElERTogXCJoaWRlXCIgKyBFVkVOVF9LRVksXG4gICAgSElEREVOOiBcImhpZGRlblwiICsgRVZFTlRfS0VZLFxuICAgIENMSUNLX0RBVEFfQVBJOiBcImNsaWNrXCIgKyBFVkVOVF9LRVkgKyBEQVRBX0FQSV9LRVlcbiAgfTtcbiAgdmFyIENsYXNzTmFtZSA9IHtcbiAgICBTSE9XOiAnc2hvdycsXG4gICAgQ09MTEFQU0U6ICdjb2xsYXBzZScsXG4gICAgQ09MTEFQU0lORzogJ2NvbGxhcHNpbmcnLFxuICAgIENPTExBUFNFRDogJ2NvbGxhcHNlZCdcbiAgfTtcbiAgdmFyIERpbWVuc2lvbiA9IHtcbiAgICBXSURUSDogJ3dpZHRoJyxcbiAgICBIRUlHSFQ6ICdoZWlnaHQnXG4gIH07XG4gIHZhciBTZWxlY3RvciA9IHtcbiAgICBBQ1RJVkVTOiAnLnNob3csIC5jb2xsYXBzaW5nJyxcbiAgICBEQVRBX1RPR0dMRTogJ1tkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCJdJ1xuICAgIC8qKlxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIENsYXNzIERlZmluaXRpb25cbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuICB9O1xuXG4gIHZhciBDb2xsYXBzZSA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbGxhcHNlKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgdGhpcy5fdHJpZ2dlckFycmF5ID0gJC5tYWtlQXJyYXkoJChcIltkYXRhLXRvZ2dsZT1cXFwiY29sbGFwc2VcXFwiXVtocmVmPVxcXCIjXCIgKyBlbGVtZW50LmlkICsgXCJcXFwiXSxcIiArIChcIltkYXRhLXRvZ2dsZT1cXFwiY29sbGFwc2VcXFwiXVtkYXRhLXRhcmdldD1cXFwiI1wiICsgZWxlbWVudC5pZCArIFwiXFxcIl1cIikpKTtcbiAgICAgIHZhciB0YWJUb2dnbGVzID0gJChTZWxlY3Rvci5EQVRBX1RPR0dMRSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFiVG9nZ2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2Y
21167XIgZWxlbSA9IHRhYlRvZ2dsZXNbaV07XG4gICAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtKTtcblxuICAgICAgICBpZiAoc2VsZWN0b3IgIT09IG51bGwgJiYgJChzZWxlY3RvcikuZmlsdGVyKGVsZW1lbnQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLl9zZWxlY3RvciA9IHNlbGVjdG9yO1xuXG4gICAgICAgICAgdGhpcy5fdHJpZ2dlckFycmF5LnB1c2goZWxlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fY29uZmlnLnBhcmVudCA/IHRoaXMuX2dldFBhcmVudCgpIDogbnVsbDtcblxuICAgICAgaWYgKCF0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLl9lbGVtZW50LCB0aGlzLl90cmlnZ2VyQXJyYXkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLnRvZ2dsZSkge1xuICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgfVxuICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICB2YXIgX3Byb3RvID0gQ29sbGFwc2UucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcbiAgICAgIGlmICgkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5TSE9XKSkge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uc2hvdyA9IGZ1bmN0aW9uIHNob3coKSB7XG4gICAgICB2Y
21167XIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGFjdGl2ZXM7XG4gICAgICB2YXIgYWN0aXZlc0RhdGE7XG5cbiAgICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcbiAgICAgICAgYWN0aXZlcyA9ICQubWFrZUFycmF5KCQodGhpcy5fcGFyZW50KS5maW5kKFNlbGVjdG9yLkFDVElWRVMpLmZpbHRlcihcIltkYXRhLXBhcmVudD1cXFwiXCIgKyB0aGlzLl9jb25maWcucGFyZW50ICsgXCJcXFwiXVwiKSk7XG5cbiAgICAgICAgaWYgKGFjdGl2ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYWN0aXZlcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGl2ZXMpIHtcbiAgICAgICAgYWN0aXZlc0RhdGEgPSAkKGFjdGl2ZXMpLm5vdCh0aGlzLl9zZWxlY3RvcikuZGF0YShEQVRBX0tFWSk7XG5cbiAgICAgICAgaWYgKGFjdGl2ZXNEYXRhICYmIGFjdGl2ZXNEYXRhLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHN0YXJ0RXZlbnQgPSAkLkV2ZW50KEV2ZW50LlNIT1cpO1xuICAgICAgJCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHN0YXJ0RXZlbnQpO1xuXG4gICAgICBpZiAoc3RhcnRFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3RpdmVzKSB7XG4gICAgICAgIENvbGxhcHNlLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkKGFjdGl2ZXMpLm5vdCh0aGlzLl9zZWxlY3RvciksICdoaWRlJyk7XG5cbiAgICAgICAgaWYgKCFhY3RpdmVzRGF0YSkge1xuICAgICAgICAgICQoYWN0aXZlcykuZGF0YShEQVRBX0tFWSwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuX2dldERpbWVuc2lvbigpO1xuXG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5DT0xMQVBTRSkuYWRkQ2xhc3MoQ2xhc3NOYW1lLkNPTExBUFNJTkcpO1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gMDtcblxuICAgICAgaWYgKHRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICQodGhpcy5fdHJpZ2dlckFycmF5KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0VEKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0VHJhbnNpdGlvbmluZyh0cnVlKTtcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgICQoX3RoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5DT0xMQVBTSU5HKS5hZGRDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0UpLmFkZENsYXNzKENsYXNzTmFtZS5TSE9XKTtcbiAgICAgICAgX3RoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnO1xuXG4gICAgICAgIF90aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuXG4gICAgICAgICQoX3RoaXMuX2VsZW1lbnQpLnRyaWdnZXIoRXZlbnQuU0hPV04pO1xuICAgICAgfTtcblxuICAgICAgaWYgKCFVdGlsLnN1cHBvcnRzVHJhbnNpdGlvbkVuZCgpKSB7XG4gICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNhcGl0YWxpemVkRGltZW5zaW9uID0gZGltZW5zaW9uWzBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoMSk7XG4gICAgICB2Y
21167XIgc2Nyb2xsU2l6ZSA9IFwic2Nyb2xsXCIgKyBjYXBpdGFsaXplZERpbWVuc2lvbjtcbiAgICAgICQodGhpcy5fZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNvbXBsZXRlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChUUkFOU0lUSU9OX0RVUkFUSU9OKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IHRoaXMuX2VsZW1lbnRbc2Nyb2xsU2l6ZV0gKyBcInB4XCI7XG4gICAgfTtcblxuICAgIF9wcm90by5oaWRlID0gZnVuY3Rpb24gaGlkZSgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICEkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5TSE9XKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBzdGFydEV2ZW50ID0gJC5FdmVudChFdmVudC5ISURFKTtcbiAgICAgICQodGhpcy5fZWxlbWVudCkudHJpZ2dlcihzdGFydEV2ZW50KTtcblxuICAgICAgaWYgKHN0YXJ0RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGltZW5zaW9uID0gdGhpcy5fZ2V0RGltZW5zaW9uKCk7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IHRoaXMuX2VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZGltZW5zaW9uXSArIFwicHhcIjtcbiAgICAgIFV0aWwucmVmbG93KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgJCh0aGlzLl9lbGVtZW50KS5hZGRDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0lORykucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLkNPTExBUFNFKS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG5cbiAgICAgIGlmICh0aGlzLl90cmlnZ2VyQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciB0cmlnZ2VyID0gdGhpcy5fdHJpZ2dlckFycmF5W2ldO1xuICAgICAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0cmlnZ2VyKTtcblxuICAgICAgICAgIGlmIChzZWxlY3RvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyICRlbGVtID0gJChzZWxlY3Rvcik7XG5cbiAgICAgICAgICAgIGlmICghJGVsZW0uaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpKSB7XG4gICAgICAgICAgICAgICQodHJpZ2dlcikuYWRkQ2xhc3MoQ2xhc3NOYW1lLkNPTExBUFNFRCkuYXR0cignYXJpYS1leHBhbmRlZCcsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKHRydWUpO1xuXG4gICAgICB2Y
21167XIgY29tcGxldGUgPSBmdW5jdGlvbiBjb21wbGV0ZSgpIHtcbiAgICAgICAgX3RoaXMyLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuXG4gICAgICAgICQoX3RoaXMyLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0lORykuYWRkQ2xhc3MoQ2xhc3NOYW1lLkNPTExBUFNFKS50cmlnZ2VyKEV2ZW50LkhJRERFTik7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAnJztcblxuICAgICAgaWYgKCFVdGlsLnN1cHBvcnRzVHJhbnNpdGlvbkVuZCgpKSB7XG4gICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgJCh0aGlzLl9lbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKFRSQU5TSVRJT05fRFVSQVRJT04pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uc2V0VHJhbnNpdGlvbmluZyA9IGZ1bmN0aW9uIHNldFRyYW5zaXRpb25pbmcoaXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBpc1RyYW5zaXRpb25pbmc7XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgICQucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSk7XG4gICAgICB0aGlzLl9jb25maWcgPSBudWxsO1xuICAgICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5fdHJpZ2dlckFycmF5ID0gbnVsbDtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IG51bGw7XG4gICAgfTsgLy8gUHJpdmF0ZVxuXG5cbiAgICBfcHJvdG8uX2dldENvbmZpZyA9IGZ1bmN0aW9uIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICBjb25maWcgPSBfZXh0ZW5kcyh7fSwgRGVmYXVsdCwgY29uZmlnKTtcbiAgICAgIGNvbmZpZy50b2dnbGUgPSBCb29sZWFuKGNvbmZpZy50b2dnbGUpOyAvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlc1xuXG4gICAgICBVdGlsLnR5cGVDaGVja0NvbmZpZyhOQU1FLCBjb25maWcsIERlZmF1bHRUeXBlKTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0RGltZW5zaW9uID0gZnVuY3Rpb24gX2dldERpbWVuc2lvbigpIHtcbiAgICAgIHZhciBoYXNXaWR0aCA9ICQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoRGltZW5zaW9uLldJRFRIKTtcbiAgICAgIHJldHVybiBoYXNXaWR0aCA/IERpbWVuc2lvbi5XSURUSCA6IERpbWVuc2lvbi5IRUlHSFQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0UGFyZW50ID0gZnVuY3Rpb24gX2dldFBhcmVudCgpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2Y
21167XIgcGFyZW50ID0gbnVsbDtcblxuICAgICAgaWYgKFV0aWwuaXNFbGVtZW50KHRoaXMuX2NvbmZpZy5wYXJlbnQpKSB7XG4gICAgICAgIHBhcmVudCA9IHRoaXMuX2NvbmZpZy5wYXJlbnQ7IC8vIEl0J3MgYSBqUXVlcnkgb2JqZWN0XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9jb25maWcucGFyZW50LmpxdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBwYXJlbnQgPSB0aGlzLl9jb25maWcucGFyZW50WzBdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJlbnQgPSAkKHRoaXMuX2NvbmZpZy5wYXJlbnQpWzBdO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2VsZWN0b3IgPSBcIltkYXRhLXRvZ2dsZT1cXFwiY29sbGFwc2VcXFwiXVtkYXRhLXBhcmVudD1cXFwiXCIgKyB0aGlzLl9jb25maWcucGFyZW50ICsgXCJcXFwiXVwiO1xuICAgICAgJChwYXJlbnQpLmZpbmQoc2VsZWN0b3IpLmVhY2goZnVuY3Rpb24gKGksIGVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoQ29sbGFwc2UuX2dldFRhcmdldEZyb21FbGVtZW50KGVsZW1lbnQpLCBbZWxlbWVudF0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyA9IGZ1bmN0aW9uIF9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoZWxlbWVudCwgdHJpZ2dlckFycmF5KSB7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICB2YXIgaXNPcGVuID0gJChlbGVtZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG5cbiAgICAgICAgaWYgKHRyaWdnZXJBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgJCh0cmlnZ2VyQXJyYXkpLnRvZ2dsZUNsYXNzKENsYXNzTmFtZS5DT0xMQVBTRUQsICFpc09wZW4pLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBpc09wZW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTsgLy8gU3RhdGljXG5cblxuICAgIENvbGxhcHNlLl9nZXRUYXJnZXRGcm9tRWxlbWVudCA9IGZ1bmN0aW9uIF9nZXRUYXJnZXRGcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgICB2Y
21167XIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICByZXR1cm4gc2VsZWN0b3IgPyAkKHNlbGVjdG9yKVswXSA6IG51bGw7XG4gICAgfTtcblxuICAgIENvbGxhcHNlLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7XG4gICAgICAgIHZhciBkYXRhID0gJHRoaXMuZGF0YShEQVRBX0tFWSk7XG5cbiAgICAgICAgdmFyIF9jb25maWcgPSBfZXh0ZW5kcyh7fSwgRGVmYXVsdCwgJHRoaXMuZGF0YSgpLCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWcpO1xuXG4gICAgICAgIGlmICghZGF0YSAmJiBfY29uZmlnLnRvZ2dsZSAmJiAvc2hvd3xoaWRlLy50ZXN0KGNvbmZpZykpIHtcbiAgICAgICAgICBfY29uZmlnLnRvZ2dsZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBDb2xsYXBzZSh0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAkdGhpcy5kYXRhKERBVEFfS0VZLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBjb25maWcgKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoQ29sbGFwc2UsIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHQ7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIENvbGxhcHNlO1xuICB9KCk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJChkb2N1bWVudCkub24oRXZlbnQuQ0xJQ0tfREFUQV9BUEksIFNlbGVjdG9yLkRBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBwcmV2ZW50RGVmYXVsdCBvbmx5IGZvciA8YT4gZWxlbWVudHMgKHdoaWNoIGNoYW5nZSB0aGUgVVJMKSBub3QgaW5zaWRlIHRoZSBjb2xsYXBzaWJsZSBlbGVtZW50XG4gICAgaWYgKGV2ZW50LmN1cnJlbnRUYXJnZXQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHZhciAkdHJpZ2dlciA9ICQodGhpcyk7XG4gICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMpO1xuICAgICQoc2VsZWN0b3IpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICR0YXJnZXQgPSAkKHRoaXMpO1xuICAgICAgdmFyIGRhdGEgPSAkdGFyZ2V0LmRhdGEoREFUQV9LRVkpO1xuICAgICAgdmFyIGNvbmZpZyA9IGRhdGEgPyAndG9nZ2xlJyA6ICR0cmlnZ2VyLmRhdGEoKTtcblxuICAgICAgQ29sbGFwc2UuX2pRdWVyeUludGVyZmFjZS5jYWxsKCR0YXJnZXQsIGNvbmZpZyk7XG4gICAgfSk7XG4gIH0pO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgJC5mbltOQU1FXSA9IENvbGxhcHNlLl9qUXVlcnlJbnRlcmZhY2U7XG4gICQuZm5bTkFNRV0uQ29uc3RydWN0b3IgPSBDb2xsYXBzZTtcblxuICAkLmZuW05BTUVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbltOQU1FXSA9IEpRVUVSWV9OT19DT05GTElDVDtcbiAgICByZXR1cm4gQ29sbGFwc2UuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICByZXR1cm4gQ29sbGFwc2U7XG59KCQpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29sbGFwc2UuanMubWFwIiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci
211675jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY0LjAuMCk6IHRvb2x0aXAuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG52YXIgVG9vbHRpcCA9IGZ1bmN0aW9uICgkKSB7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ29uc3RhbnRzXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cbiAgdmFyIE5BTUUgPSAndG9vbHRpcCc7XG4gIHZhciBWRVJTSU9OID0gJzQuMC4wJztcbiAgdmFyIERBVEFfS0VZID0gJ2JzLnRvb2x0aXAnO1xuICB2YXIgRVZFTlRfS0VZID0gXCIuXCIgKyBEQVRBX0tFWTtcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bTkFNRV07XG4gIHZhciBUUkFOU0lUSU9OX0RVUkFUSU9OID0gMTUwO1xuICB2YXIgQ0xBU1NfUFJFRklYID0gJ2JzLXRvb2x0aXAnO1xuICB2YXIgQlNDTFNfUFJFRklYX1JFR0VYID0gbmV3IFJlZ0V4cChcIihefFxcXFxzKVwiICsgQ0xBU1NfUFJFRklYICsgXCJcXFxcUytcIiwgJ2cnKTtcbiAgdmFyIERlZmF1bHRUeXBlID0ge1xuICAgIGFuaW1hdGlvbjogJ2Jvb2xlYW4nLFxuICAgIHRlbXBsYXRlOiAnc3RyaW5nJyxcbiAgICB0aXRsZTogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknLFxuICAgIHRyaWdnZXI6ICdzdHJpbmcnLFxuICAgIGRlbGF5OiAnKG51bWJlcnxvYmplY3QpJyxcbiAgICBodG1sOiAnYm9vbGVhbicsXG4gICAgc2VsZWN0b3I6ICcoc3RyaW5nfGJvb2xlYW4pJyxcbiAgICBwbGFjZW1lbnQ6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gICAgb2Zmc2V0OiAnKG51bWJlcnxzdHJpbmcpJyxcbiAgICBjb250YWluZXI6ICcoc3RyaW5nfGVsZW1lbnR8Ym9vbGVhbiknLFxuICAgIGZhbGxiYWNrUGxhY2VtZW50OiAnKHN0cmluZ3xhcnJheSknLFxuICAgIGJvdW5kYXJ5OiAnKHN0cmluZ3xlbGVtZW50KSdcbiAgfTtcbiAgdmFyIEF0dGFjaG1lbnRNYXAgPSB7XG4gICAgQVVUTzogJ2F1dG8nLFxuICAgIFRPUDogJ3RvcCcsXG4gICAgUklHSFQ6ICdyaWdodCcsXG4gICAgQk9UVE9NOiAnYm90dG9tJyxcbiAgICBMRUZUOiAnbGVmdCdcbiAgfTtcbiAgdmFyIERlZmF1bHQgPSB7XG4gICAgYW5pbWF0aW9uOiB0cnVlLFxuICAgIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPicgKyAnPGRpdiBjbGFzcz1cImFycm93XCI+PC9kaXY+JyArICc8ZGl2IGNsYXNzPVwidG9vbHRpcC1pbm5lclwiPjwvZGl2PjwvZGl2PicsXG4gICAgdHJpZ2dlcjogJ2hvdmVyIGZvY3VzJyxcbiAgICB0aXRsZTogJycsXG4gICAgZGVsYXk6IDAsXG4gICAgaHRtbDogZmFsc2UsXG4gICAgc2VsZWN0b3I6IGZhbHNlLFxuICAgIHBsYWNlbWVudDogJ3RvcCcsXG4gICAgb2Zmc2V0OiAwLFxuICAgIGNvbnRhaW5lcjogZmFsc2UsXG4gICAgZmFsbGJhY2tQbGFjZW1lbnQ6ICdmbGlwJyxcbiAgICBib3VuZGFyeTogJ3Njcm9sbFBhcmVudCdcbiAgfTtcbiAgdmFyIEhvdmVyU3RhdGUgPSB7XG4gICAgU0hPVzogJ3Nob3cnLFxuICAgIE9VVDogJ291dCdcbiAgfTtcbiAgdmFyIEV2ZW50ID0ge1xuICAgIEhJREU6IFwiaGlkZVwiICsgRVZFTlRfS0VZLFxuICAgIEhJRERFTjogXCJoaWRkZW5cIiArIEVWRU5UX0tFWSxcbiAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSxcbiAgICBTSE9XTjogXCJzaG93blwiICsgRVZFTlRfS0VZLFxuICAgIElOU0VSVEVEOiBcImluc2VydGVkXCIgKyBFVkVOVF9LRVksXG4gICAgQ0xJQ0s6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSxcbiAgICBGT0NVU0lOOiBcImZvY3VzaW5cIiArIEVWRU5UX0tFWSxcbiAgICBGT0NVU09VVDogXCJmb2N1c291dFwiICsgRVZFTlRfS0VZLFxuICAgIE1PVVNFRU5URVI6IFwibW91c2VlbnRlclwiICsgRVZFTlRfS0VZLFxuICAgIE1PVVNFTEVBVkU6IFwibW91c2VsZWF2ZVwiICsgRVZFTlRfS0VZXG4gIH07XG4gIHZhciBDbGFzc05hbWUgPSB7XG4gICAgRkFERTogJ2ZhZGUnLFxuICAgIFNIT1c6ICdzaG93J1xuICB9O1xuICB2YXIgU2VsZWN0b3IgPSB7XG4gICAgVE9PTFRJUDogJy50b29sdGlwJyxcbiAgICBUT09MVElQX0lOTkVSOiAnLnRvb2x0aXAtaW5uZXInLFxuICAgIEFSUk9XOiAnLmFycm93J1xuICB9O1xuICB2YXIgVHJpZ2dlciA9IHtcbiAgICBIT1ZFUjogJ2hvdmVyJyxcbiAgICBGT0NVUzogJ2ZvY3VzJyxcbiAgICBDTElDSzogJ2NsaWNrJyxcbiAgICBNQU5VQUw6ICdtYW51YWwnXG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuXG4gIH07XG5cbiAgdmFyIFRvb2x0aXAgPVxuICAvKiNfX1BVUkVfXyovXG4gIGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUb29sdGlwKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBmb3IgUG9wcGVyIGRlcGVuZGVuY3lcbiAgICAgICAqIFBvcHBlciAtIGh0dHBzOi8vcG9wcGVyLmpzLm9yZ1xuICAgICAgICovXG4gICAgICBpZiAodHlwZW9mIFBvcHBlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwIHRvb2x0aXBzIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpJyk7XG4gICAgICB9IC8vIHByaXZhdGVcblxuXG4gICAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fdGltZW91dCA9IDA7XG4gICAgICB0aGlzLl9ob3ZlclN0YXRlID0gJyc7XG4gICAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyID0ge307XG4gICAgICB0aGlzLl9wb3BwZXIgPSBudWxsOyAvLyBQcm90ZWN0ZWRcblxuICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMuY29uZmlnID0gdGh
21167pcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLnRpcCA9IG51bGw7XG5cbiAgICAgIHRoaXMuX3NldExpc3RlbmVycygpO1xuICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICB2YXIgX3Byb3RvID0gVG9vbHRpcC5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8uZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgICAgdGhpcy5faXNFbmFibGVkID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc2FibGUgPSBmdW5jdGlvbiBkaXNhYmxlKCkge1xuICAgICAgdGhpcy5faXNFbmFibGVkID0gZmFsc2U7XG4gICAgfTtcblxuICAgIF9wcm90by50b2dnbGVFbmFibGVkID0gZnVuY3Rpb24gdG9nZ2xlRW5hYmxlZCgpIHtcbiAgICAgIHRoaXMuX2lzRW5hYmxlZCA9ICF0aGlzLl9pc0VuYWJsZWQ7XG4gICAgfTtcblxuICAgIF9wcm90by50b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIHZhciBkYXRhS2V5ID0gdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmRhdGEoZGF0YUtleSk7XG5cbiAgICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgICAgY29udGV4dCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGV2ZW50LmN1cnJlbnRUYXJnZXQsIHRoaXMuX2dldERlbGVnYXRlQ29uZmlnKCkpO1xuICAgICAgICAgICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5LCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXIuY2xpY2sgPSAhY29udGV4dC5fYWN0aXZlVHJpZ2dlci5jbGljaztcblxuICAgICAgICBpZiAoY29udGV4dC5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICAgICAgY29udGV4dC5fZW50ZXIobnVsbCwgY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5fbGVhdmUobnVsbCwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgkKHRoaXMuZ2V0VGlwRWxlbWVudCgpKS5oYXNDbGFzcyhDbGFzc05hbWUuU0hPVykpIHtcbiAgICAgICAgICB0aGlzLl9sZWF2ZShudWxsLCB0aGlzKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2VudGVyKG51bGwsIHRoaXMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gICAgICAkLnJlbW92ZURhdGEodGhpcy5lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZKTtcbiAgICAgICQodGhpcy5lbGVtZW50KS5vZmYodGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9LRVkpO1xuICAgICAgJCh0aGlzLmVsZW1lbnQpLmNsb3Nlc3QoJy5tb2RhbCcpLm9mZignaGlkZS5icy5tb2RhbCcpO1xuXG4gICAgICBpZiAodGhpcy50aXApIHtcbiAgICAgICAgJCh0aGlzLnRpcCkucmVtb3ZlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcbiAgICAgIHRoaXMuX2hvdmVyU3RhdGUgPSBudWxsO1xuICAgICAgdGhpcy5fYWN0aXZlVHJpZ2dlciA9IG51bGw7XG5cbiAgICAgIGlmICh0aGlzLl9wb3BwZXIgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbDtcbiAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmNvbmZpZyA9IG51bGw7XG4gICAgICB0aGlzLnRpcCA9IG51bGw7XG4gICAgfTtcblxuICAgIF9wcm90by5zaG93ID0gZnVuY3Rpb24gc2hvdygpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICgkKHRoaXMuZWxlbWVudCkuY3NzKCdkaXNwbGF5J
21167ykgPT09ICdub25lJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSB1c2Ugc2hvdyBvbiB2aXNpYmxlIGVsZW1lbnRzJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzaG93RXZlbnQgPSAkLkV2ZW50KHRoaXMuY29uc3RydWN0b3IuRXZlbnQuU0hPVyk7XG5cbiAgICAgIGlmICh0aGlzLmlzV2l0aENvbnRlbnQoKSAmJiB0aGlzLl9pc0VuYWJsZWQpIHtcbiAgICAgICAgJCh0aGlzLmVsZW1lbnQpLnRyaWdnZXIoc2hvd0V2ZW50KTtcbiAgICAgICAgdmFyIGlzSW5UaGVEb20gPSAkLmNvbnRhaW5zKHRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgdGhpcy5lbGVtZW50KTtcblxuICAgICAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpIHx8ICFpc0luVGhlRG9tKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRpcCA9IHRoaXMuZ2V0VGlwRWxlbWVudCgpO1xuICAgICAgICB2YXIgdGlwSWQgPSBVdGlsLmdldFVJRCh0aGlzLmNvbnN0cnVjdG9yLk5BTUUpO1xuICAgICAgICB0aXAuc2V0QXR0cmlidXRlKCdpZCcsIHRpcElkKTtcbiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIHRpcElkKTtcbiAgICAgICAgdGhpcy5zZXRDb250ZW50KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmFuaW1hdGlvbikge1xuICAgICAgICAgICQodGlwKS5hZGRDbGFzcyhDbGFzc05hbWUuRkFERSk7XG4gICAgICAgIH1cblxuICAgICAgICB2Y
21167XIgcGxhY2VtZW50ID0gdHlwZW9mIHRoaXMuY29uZmlnLnBsYWNlbWVudCA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuY29uZmlnLnBsYWNlbWVudC5jYWxsKHRoaXMsIHRpcCwgdGhpcy5lbGVtZW50KSA6IHRoaXMuY29uZmlnLnBsYWNlbWVudDtcblxuICAgICAgICB2YXIgYXR0YWNobWVudCA9IHRoaXMuX2dldEF0dGFjaG1lbnQocGxhY2VtZW50KTtcblxuICAgICAgICB0aGlzLmFkZEF0dGFjaG1lbnRDbGFzcyhhdHRhY2htZW50KTtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29uZmlnLmNvbnRhaW5lciA9PT0gZmFsc2UgPyBkb2N1bWVudC5ib2R5IDogJCh0aGlzLmNvbmZpZy5jb250YWluZXIpO1xuICAgICAgICAkKHRpcCkuZGF0YSh0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZLCB0aGlzKTtcblxuICAgICAgICBpZiAoISQuY29udGFpbnModGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB0aGlzLnRpcCkpIHtcbiAgICAgICAgICAkKHRpcCkuYXBwZW5kVG8oY29udGFpbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgICQodGhpcy5lbGVtZW50KS50cmlnZ2VyKHRoaXMuY29uc3RydWN0b3IuRXZlbnQuSU5TRVJURUQpO1xuICAgICAgICB0aGlzLl9wb3BwZXIgPSBuZXcgUG9wcGVyKHRoaXMuZWxlbWVudCwgdGlwLCB7XG4gICAgICAgICAgcGxhY2VtZW50OiBhdHRhY2htZW50LFxuICAgICAgICAgIG1vZGlmaWVyczoge1xuICAgICAgICAgICAgb2Zmc2V0OiB7XG4gICAgICAgICAgICAgIG9mZnNldDogdGhpcy5jb25maWcub2Zmc2V0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmxpcDoge1xuICAgICAgICAgICAgICBiZWhhdmlvcjogdGhpcy5jb25maWcuZmFsbGJhY2tQbGFjZW1lbnRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhcnJvdzoge1xuICAgICAgICAgICAgICBlbGVtZW50OiBTZWxlY3Rvci5BUlJPV1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByZXZlbnRPdmVyZmxvdzoge1xuICAgICAgICAgICAgICBib3VuZGFyaWVzRWxlbWVudDogdGhpcy5jb25maWcuYm91bmRhcnlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQ3JlYXRlOiBmdW5jdGlvbiBvbkNyZWF0ZShkYXRhKSB7XG4gICAgICAgICAgICBpZiAoZGF0YS5vcmlnaW5hbFBsYWNlbWVudCAhPT0gZGF0YS5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgX3RoaXMuX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uVXBkYXRlOiBmdW5jdGlvbiBvblVwZGF0ZShkYXRhKSB7XG4gICAgICAgICAgICBfdGhpcy5faGFuZGxlUG9wcGVyUGxhY2VtZW50Q2hhbmdlKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICQodGlwKS5hZGRDbGFzcyhDbGFzc05hbWUuU0hPVyk7IC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSBhZGQgZXh0cmFcbiAgICAgICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB0byB0aGUgYm9keSdzIGltbWVkaWF0ZSBjaGlsZHJlbjtcbiAgICAgICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDE0LzAyL21vdXNlX2V2ZW50X2J1Yi5odG1sXG5cbiAgICAgICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAgICQoJ2JvZHknKS5jaGlsZHJlbigpLm9uKCdtb3VzZW92ZXInLCBudWxsLCAkLm5vb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgICAgaWYgKF90aGlzLmNvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgIF90aGlzLl9maXhUcmFuc2l0aW9uKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHByZXZIb3ZlclN0YXRlID0gX3RoaXMuX2hvdmVyU3RhdGU7XG4gICAgICAgICAgX3RoaXMuX2hvdmVyU3RhdGUgPSBudWxsO1xuICAgICAgICAgICQoX3RoaXMuZWxlbWVudCkudHJpZ2dlcihfdGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5TSE9XTik7XG5cbiAgICAgICAgICBpZiAocHJldkhvdmVyU3RhdGUgPT09IEhvdmVyU3RhdGUuT1VUKSB7XG4gICAgICAgICAgICBfdGhpcy5fbGVhdmUobnVsbCwgX3RoaXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoVXRpbC5zdXBwb3J0c1RyYW5zaXRpb25FbmQoKSAmJiAkKHRoaXMudGlwKS5oYXNDbGFzcyhDbGFzc05hbWUuRkFERSkpIHtcbiAgICAgICAgICAkKHRoaXMudGlwKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKFRvb2x0aXAuX1RSQU5TSVRJT05fRFVSQVRJT04pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmhpZGUgPSBmdW5jdGlvbiBoaWRlKGNhbGxiYWNrKSB7XG4gICAgICB2Y
21167XIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIHRpcCA9IHRoaXMuZ2V0VGlwRWxlbWVudCgpO1xuICAgICAgdmFyIGhpZGVFdmVudCA9ICQuRXZlbnQodGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5ISURFKTtcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgIGlmIChfdGhpczIuX2hvdmVyU3RhdGUgIT09IEhvdmVyU3RhdGUuU0hPVyAmJiB0aXAucGFyZW50Tm9kZSkge1xuICAgICAgICAgIHRpcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRpcCk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczIuX2NsZWFuVGlwQ2xhc3MoKTtcblxuICAgICAgICBfdGhpczIuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtcblxuICAgICAgICAkKF90aGlzMi5lbGVtZW50KS50cmlnZ2VyKF90aGlzMi5jb25zdHJ1Y3Rvci5FdmVudC5ISURERU4pO1xuXG4gICAgICAgIGlmIChfdGhpczIuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICAgIF90aGlzMi5fcG9wcGVyLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgICQodGhpcy5lbGVtZW50KS50cmlnZ2VyKGhpZGVFdmVudCk7XG5cbiAgICAgIGlmIChoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAkKHRpcCkucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpOyAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcblxuICAgICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAkKCdib2R5JykuY2hpbGRyZW4oKS5vZmYoJ21vdXNlb3ZlcicsIG51bGwsICQubm9vcCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVHJpZ2dlci5DTElDS10gPSBmYWxzZTtcbiAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVHJpZ2dlci5GT0NVU10gPSBmYWxzZTtcbiAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVHJpZ2dlci5IT1ZFUl0gPSBmYWxzZTtcblxuICAgICAgaWYgKFV0aWwuc3VwcG9ydHNUcmFuc2l0aW9uRW5kKCkgJiYgJCh0aGlzLnRpcCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLkZBREUpKSB7XG4gICAgICAgICQodGlwKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKFRSQU5TSVRJT05fRFVSQVRJT04pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faG92ZXJTdGF0ZSA9ICcnO1xuICAgIH07XG5cbiAgICBfcHJvdG8udXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgaWYgKHRoaXMuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAgIH1cbiAgICB9OyAvLyBQcm90ZWN0ZWRcblxuXG4gICAgX3Byb3RvLmlzV2l0aENvbnRlbnQgPSBmdW5jdGlvbiBpc1dpdGhDb250ZW50KCkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5nZXRUaXRsZSgpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmFkZEF0dGFjaG1lbnRDbGFzcyA9IGZ1bmN0aW9uIGFkZEF0dGFjaG1lbnRDbGFzcyhhdHRhY2htZW50KSB7XG4gICAgICAkKHRoaXMuZ2V0VGlwRWxlbWVudCgpKS5hZGRDbGFzcyhDTEFTU19QUkVGSVggKyBcIi1cIiArIGF0dGFjaG1lbnQpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZ2V0VGlwRWxlbWVudCA9IGZ1bmN0aW9uIGdldFRpcEVsZW1lbnQoKSB7XG4gICAgICB0aGlzLnRpcCA9IHRoaXMudGlwIHx8ICQodGhpcy5jb25maWcudGVtcGxhdGUpWzBdO1xuICAgICAgcmV0dXJuIHRoaXMudGlwO1xuICAgIH07XG5cbiAgICBfcHJvdG8uc2V0Q29udGVudCA9IGZ1bmN0aW9uIHNldENvbnRlbnQoKSB7XG4gICAgICB2Y
21167XIgJHRpcCA9ICQodGhpcy5nZXRUaXBFbGVtZW50KCkpO1xuICAgICAgdGhpcy5zZXRFbGVtZW50Q29udGVudCgkdGlwLmZpbmQoU2VsZWN0b3IuVE9PTFRJUF9JTk5FUiksIHRoaXMuZ2V0VGl0bGUoKSk7XG4gICAgICAkdGlwLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5GQURFICsgXCIgXCIgKyBDbGFzc05hbWUuU0hPVyk7XG4gICAgfTtcblxuICAgIF9wcm90by5zZXRFbGVtZW50Q29udGVudCA9IGZ1bmN0aW9uIHNldEVsZW1lbnRDb250ZW50KCRlbGVtZW50LCBjb250ZW50KSB7XG4gICAgICB2YXIgaHRtbCA9IHRoaXMuY29uZmlnLmh0bWw7XG5cbiAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ29iamVjdCcgJiYgKGNvbnRlbnQubm9kZVR5cGUgfHwgY29udGVudC5qcXVlcnkpKSB7XG4gICAgICAgIC8vIENvbnRlbnQgaXMgYSBET00gbm9kZSBvciBhIGpRdWVyeVxuICAgICAgICBpZiAoaHRtbCkge1xuICAgICAgICAgIGlmICghJChjb250ZW50KS5wYXJlbnQoKS5pcygkZWxlbWVudCkpIHtcbiAgICAgICAgICAgICRlbGVtZW50LmVtcHR5KCkuYXBwZW5kKGNvbnRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkZWxlbWVudC50ZXh0KCQoY29udGVudCkudGV4dCgpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJGVsZW1lbnRbaHRtbCA/ICdodG1sJyA6ICd0ZXh0J10oY29udGVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5nZXRUaXRsZSA9IGZ1bmN0aW9uIGdldFRpdGxlKCkge1xuICAgICAgdmFyIHRpdGxlID0gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnaW5hbC10aXRsZScpO1xuXG4gICAgICBpZiAoIXRpdGxlKSB7XG4gICAgICAgIHRpdGxlID0gdHlwZW9mIHRoaXMuY29uZmlnLnRpdGxlID09PSAnZnVuY3Rpb24nID8gdGhpcy5jb25maWcudGl0bGUuY2FsbCh0aGlzLmVsZW1lbnQpIDogdGhpcy5jb25maWcudGl0bGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aXRsZTtcbiAgICB9OyAvLyBQcml2YXRlXG5cblxuICAgIF9wcm90by5fZ2V0QXR0YWNobWVudCA9IGZ1bmN0aW9uIF9nZXRBdHRhY2htZW50KHBsYWNlbWVudCkge1xuICAgICAgcmV0dXJuIEF0dGFjaG1lbnRNYXBbcGxhY2VtZW50LnRvVXBwZXJDYXNlKCldO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX3NldExpc3RlbmVycyA9IGZ1bmN0aW9uIF9zZXRMaXN0ZW5lcnMoKSB7XG4gICAgICB2Y
21167XIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIHRyaWdnZXJzID0gdGhpcy5jb25maWcudHJpZ2dlci5zcGxpdCgnICcpO1xuICAgICAgdHJpZ2dlcnMuZm9yRWFjaChmdW5jdGlvbiAodHJpZ2dlcikge1xuICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2NsaWNrJykge1xuICAgICAgICAgICQoX3RoaXMzLmVsZW1lbnQpLm9uKF90aGlzMy5jb25zdHJ1Y3Rvci5FdmVudC5DTElDSywgX3RoaXMzLmNvbmZpZy5zZWxlY3RvciwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMzLnRvZ2dsZShldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHJpZ2dlciAhPT0gVHJpZ2dlci5NQU5VQUwpIHtcbiAgICAgICAgICB2YXIgZXZlbnRJbiA9IHRyaWdnZXIgPT09IFRyaWdnZXIuSE9WRVIgPyBfdGhpczMuY29uc3RydWN0b3IuRXZlbnQuTU9VU0VFTlRFUiA6IF90aGlzMy5jb25zdHJ1Y3Rvci5FdmVudC5GT0NVU0lOO1xuICAgICAgICAgIHZhciBldmVudE91dCA9IHRyaWdnZXIgPT09IFRyaWdnZXIuSE9WRVIgPyBfdGhpczMuY29uc3RydWN0b3IuRXZlbnQuTU9VU0VMRUFWRSA6IF90aGlzMy5jb25zdHJ1Y3Rvci5FdmVudC5GT0NVU09VVDtcbiAgICAgICAgICAkKF90aGlzMy5lbGVtZW50KS5vbihldmVudEluLCBfdGhpczMuY29uZmlnLnNlbGVjdG9yLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczMuX2VudGVyKGV2ZW50KTtcbiAgICAgICAgICB9KS5vbihldmVudE91dCwgX3RoaXMzLmNvbmZpZy5zZWxlY3RvciwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMzLl9sZWF2ZShldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAkKF90aGlzMy5lbGVtZW50KS5jbG9zZXN0KCcubW9kYWwnKS5vbignaGlkZS5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMzLmhpZGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnLnNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gX2V4dGVuZHMoe30sIHRoaXMuY29uZmlnLCB7XG4gICAgICAgICAgdHJpZ2dlcjogJ21hbnVhbCcsXG4gICAgICAgICAgc2VsZWN0b3I6ICcnXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZml4VGl0bGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9maXhUaXRsZSA9IGZ1bmN0aW9uIF9maXhUaXRsZSgpIHtcbiAgICAgIHZhciB0aXRsZVR5cGUgPSB0eXBlb2YgdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnaW5hbC10aXRsZScpO1xuXG4gICAgICBpZiAodGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgndGl0bGUnKSB8fCB0aXRsZVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnLCB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpIHx8ICcnKTtcbiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fZW50ZXIgPSBmdW5jdGlvbiBfZW50ZXIoZXZlbnQsIGNvbnRleHQpIHtcbiAgICAgIHZhciBkYXRhS2V5ID0gdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTtcbiAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8ICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5KTtcblxuICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihldmVudC5jdXJyZW50VGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKTtcbiAgICAgICAgJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXksIGNvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlcltldmVudC50eXBlID09PSAnZm9jdXNpbicgPyBUcmlnZ2VyLkZPQ1VTIDogVHJpZ2dlci5IT1ZFUl0gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoJChjb250ZXh0LmdldFRpcEVsZW1lbnQoKSkuaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpIHx8IGNvbnRleHQuX2hvdmVyU3RhdGUgPT09IEhvdmVyU3RhdGUuU0hPVykge1xuICAgICAgICBjb250ZXh0Ll9ob3ZlclN0YXRlID0gSG92ZXJTdGF0ZS5TSE9XO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNsZWFyVGltZW91dChjb250ZXh0Ll90aW1lb3V0KTtcbiAgICAgIGNvbnRleHQuX2hvdmVyU3RhdGUgPSBIb3ZlclN0YXRlLlNIT1c7XG5cbiAgICAgIGlmICghY29udGV4dC5jb25maWcuZGVsYXkgfHwgIWNvbnRleHQuY29uZmlnLmRlbGF5LnNob3cpIHtcbiAgICAgICAgY29udGV4dC5zaG93KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY29udGV4dC5faG92ZXJTdGF0ZSA9PT0gSG92ZXJTdGF0ZS5TSE9XKSB7XG4gICAgICAgICAgY29udGV4dC5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGNvbnRleHQuY29uZmlnLmRlbGF5LnNob3cpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2xlYXZlID0gZnVuY3Rpb24gX2xlYXZlKGV2ZW50LCBjb250ZXh0KSB7XG4gICAgICB2Y
21167XIgZGF0YUtleSA9IHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVk7XG4gICAgICBjb250ZXh0ID0gY29udGV4dCB8fCAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmRhdGEoZGF0YUtleSk7XG5cbiAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICBjb250ZXh0ID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZXZlbnQuY3VycmVudFRhcmdldCwgdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSk7XG4gICAgICAgICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5LCBjb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXJbZXZlbnQudHlwZSA9PT0gJ2ZvY3Vzb3V0JyA/IFRyaWdnZXIuRk9DVVMgOiBUcmlnZ2VyLkhPVkVSXSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29udGV4dC5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2xlYXJUaW1lb3V0KGNvbnRleHQuX3RpbWVvdXQpO1xuICAgICAgY29udGV4dC5faG92ZXJTdGF0ZSA9IEhvdmVyU3RhdGUuT1VUO1xuXG4gICAgICBpZiAoIWNvbnRleHQuY29uZmlnLmRlbGF5IHx8ICFjb250ZXh0LmNvbmZpZy5kZWxheS5oaWRlKSB7XG4gICAgICAgIGNvbnRleHQuaGlkZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGNvbnRleHQuX2hvdmVyU3RhdGUgPT09IEhvdmVyU3RhdGUuT1VUKSB7XG4gICAgICAgICAgY29udGV4dC5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGNvbnRleHQuY29uZmlnLmRlbGF5LmhpZGUpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2lzV2l0aEFjdGl2ZVRyaWdnZXIgPSBmdW5jdGlvbiBfaXNXaXRoQWN0aXZlVHJpZ2dlcigpIHtcbiAgICAgIGZvciAodmFyIHRyaWdnZXIgaW4gdGhpcy5fYWN0aXZlVHJpZ2dlcikge1xuICAgICAgICBpZiAodGhpcy5fYWN0aXZlVHJpZ2dlclt0cmlnZ2VyXSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgY29uZmlnID0gX2V4dGVuZHMoe30sIHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdCwgJCh0aGlzLmVsZW1lbnQpLmRhdGEoKSwgY29uZmlnKTtcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcuZGVsYXkgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbmZpZy5kZWxheSA9IHtcbiAgICAgICAgICBzaG93OiBjb25maWcuZGVsYXksXG4gICAgICAgICAgaGlkZTogY29uZmlnLmRlbGF5XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnLnRpdGxlID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25maWcudGl0bGUgPSBjb25maWcudGl0bGUudG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcuY29udGVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uZmlnLmNvbnRlbnQgPSBjb25maWcuY29udGVudC50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBVdGlsLnR5cGVDaGVja0NvbmZpZyhOQU1FLCBjb25maWcsIHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXREZWxlZ2F0ZUNvbmZpZyA9IGZ1bmN0aW9uIF9nZXREZWxlZ2F0ZUNvbmZpZygpIHtcbiAgICAgIHZhciBjb25maWcgPSB7fTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmNvbmZpZykge1xuICAgICAgICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRba2V5XSAhPT0gdGhpcy5jb25maWdba2V5XSkge1xuICAgICAgICAgICAgY29uZmlnW2tleV0gPSB0aGlzLmNvbmZpZ1trZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2NsZWFuVGlwQ2xhc3MgPSBmdW5jdGlvbiBfY2xlYW5UaXBDbGFzcygpIHtcbiAgICAgIHZhciAkdGlwID0gJCh0aGlzLmdldFRpcEVsZW1lbnQoKSk7XG4gICAgICB2Y
21167XIgdGFiQ2xhc3MgPSAkdGlwLmF0dHIoJ2NsYXNzJykubWF0Y2goQlNDTFNfUFJFRklYX1JFR0VYKTtcblxuICAgICAgaWYgKHRhYkNsYXNzICE9PSBudWxsICYmIHRhYkNsYXNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgJHRpcC5yZW1vdmVDbGFzcyh0YWJDbGFzcy5qb2luKCcnKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5faGFuZGxlUG9wcGVyUGxhY2VtZW50Q2hhbmdlID0gZnVuY3Rpb24gX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZShkYXRhKSB7XG4gICAgICB0aGlzLl9jbGVhblRpcENsYXNzKCk7XG5cbiAgICAgIHRoaXMuYWRkQXR0YWNobWVudENsYXNzKHRoaXMuX2dldEF0dGFjaG1lbnQoZGF0YS5wbGFjZW1lbnQpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9maXhUcmFuc2l0aW9uID0gZnVuY3Rpb24gX2ZpeFRyYW5zaXRpb24oKSB7XG4gICAgICB2YXIgdGlwID0gdGhpcy5nZXRUaXBFbGVtZW50KCk7XG4gICAgICB2YXIgaW5pdENvbmZpZ0FuaW1hdGlvbiA9IHRoaXMuY29uZmlnLmFuaW1hdGlvbjtcblxuICAgICAgaWYgKHRpcC5nZXRBdHRyaWJ1dGUoJ3gtcGxhY2VtZW50JykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAkKHRpcCkucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLkZBREUpO1xuICAgICAgdGhpcy5jb25maWcuYW5pbWF0aW9uID0gZmFsc2U7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgdGhpcy5jb25maWcuYW5pbWF0aW9uID0gaW5pdENvbmZpZ0FuaW1hdGlvbjtcbiAgICB9OyAvLyBTdGF0aWNcblxuXG4gICAgVG9vbHRpcC5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2Y
21167XIgZGF0YSA9ICQodGhpcykuZGF0YShEQVRBX0tFWSk7XG5cbiAgICAgICAgdmFyIF9jb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWc7XG5cbiAgICAgICAgaWYgKCFkYXRhICYmIC9kaXNwb3NlfGhpZGUvLnRlc3QoY29uZmlnKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgVG9vbHRpcCh0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAkKHRoaXMpLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTm8gbWV0aG9kIG5hbWVkIFxcXCJcIiArIGNvbmZpZyArIFwiXFxcIlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9jcmVhdGVDbGFzcyhUb29sdGlwLCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTjtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJOQU1FXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIE5BTUU7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRBVEFfS0VZXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERBVEFfS0VZO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJFdmVudFwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBFdmVudDtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRVZFTlRfS0VZXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEVWRU5UX0tFWTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFR5cGVcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdFR5cGU7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFRvb2x0aXA7XG4gIH0oKTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBqUXVlcnlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJC5mbltOQU1FXSA9IFRvb2x0aXAuX2pRdWVyeUludGVyZmFjZTtcbiAgJC5mbltOQU1FXS5Db25zdHJ1Y3RvciA9IFRvb2x0aXA7XG5cbiAgJC5mbltOQU1FXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm5bTkFNRV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgcmV0dXJuIFRvb2x0aXAuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICByZXR1cm4gVG9vbHRpcDtcbn0oJCwgUG9wcGVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRvb2x0aXAuanMubWFwIiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci
211675jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY0LjAuMCk6IGRyb3Bkb3duLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xudmFyIERyb3Bkb3duID0gZnVuY3Rpb24gKCQpIHtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDb25zdGFudHNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICB2YXIgTkFNRSA9ICdkcm9wZG93bic7XG4gIHZhciBWRVJTSU9OID0gJzQuMC4wJztcbiAgdmFyIERBVEFfS0VZID0gJ2JzLmRyb3Bkb3duJztcbiAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XG4gIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bTkFNRV07XG4gIHZhciBFU0NBUEVfS0VZQ09ERSA9IDI3OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciBFc2NhcGUgKEVzYykga2V5XG5cbiAgdmFyIFNQQUNFX0tFWUNPREUgPSAzMjsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3Igc3BhY2Uga2V5XG5cbiAgdmFyIFRBQl9LRVlDT0RFID0gOTsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgdGFiIGtleVxuXG4gIHZhciBBUlJPV19VUF9LRVlDT0RFID0gMzg7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIHVwIGFycm93IGtleVxuXG4gIHZhciBBUlJPV19ET1dOX0tFWUNPREUgPSA0MDsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgZG93biBhcnJvdyBrZXlcblxuICB2YXIgUklHSFRfTU9VU0VfQlVUVE9OX1dISUNIID0gMzsgLy8gTW91c2VFdmVudC53aGljaCB2YWx1ZSBmb3IgdGhlIHJpZ2h0IGJ1dHRvbiAoYXNzdW1pbmcgYSByaWdodC1oYW5kZWQgbW91c2UpXG5cbiAgdmFyIFJFR0VYUF9LRVlET1dOID0gbmV3IFJlZ0V4cChBUlJPV19VUF9LRVlDT0RFICsgXCJ8XCIgKyBBUlJPV19ET1dOX0tFWUNPREUgKyBcInxcIiArIEVTQ0FQRV9LRVlDT0RFKTtcbiAgdmFyIEV2ZW50ID0ge1xuICAgIEhJREU6IFwiaGlkZVwiICsgRVZFTlRfS0VZLFxuICAgIEhJRERFTjogXCJoaWRkZW5cIiArIEVWRU5UX0tFWSxcbiAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSxcbiAgICBTSE9XTjogXCJzaG93blwiICsgRVZFTlRfS0VZLFxuICAgIENMSUNLOiBcImNsaWNrXCIgKyBFVkVOVF9LRVksXG4gICAgQ0xJQ0tfREFUQV9BUEk6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWSxcbiAgICBLRVlET1dOX0RBVEFfQVBJOiBcImtleWRvd25cIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWSxcbiAgICBLRVlVUF9EQVRBX0FQSTogXCJrZXl1cFwiICsgRVZFTlRfS0VZICsgREFUQV9BUElfS0VZXG4gIH07XG4gIHZhciBDbGFzc05hbWUgPSB7XG4gICAgRElTQUJMRUQ6ICdkaXNhYmxlZCcsXG4gICAgU0hPVzogJ3Nob3cnLFxuICAgIERST1BVUDogJ2Ryb3B1cCcsXG4gICAgRFJPUFJJR0hUOiAnZHJvcHJpZ2h0JyxcbiAgICBEUk9QTEVGVDogJ2Ryb3BsZWZ0JyxcbiAgICBNRU5VUklHSFQ6ICdkcm9wZG93bi1tZW51LXJpZ2h0JyxcbiAgICBNRU5VTEVGVDogJ2Ryb3Bkb3duLW1lbnUtbGVmdCcsXG4gICAgUE9TSVRJT05fU1RBVElDOiAncG9zaXRpb24tc3RhdGljJ1xuICB9O1xuICB2YXIgU2VsZWN0b3IgPSB7XG4gICAgREFUQV9UT0dHTEU6ICdbZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXScsXG4gICAgRk9STV9DSElMRDogJy5kcm9wZG93biBmb3JtJyxcbiAgICBNRU5VOiAnLmRyb3Bkb3duLW1lbnUnLFxuICAgIE5BVkJBUl9OQVY6ICcubmF2YmFyLW5hdicsXG4gICAgVklTSUJMRV9JVEVNUzogJy5kcm9wZG93bi1tZW51IC5kcm9wZG93bi1pdGVtOm5vdCguZGlzYWJsZWQpJ1xuICB9O1xuICB2YXIgQXR0YWNobWVudE1hcCA9IHtcbiAgICBUT1A6ICd0b3Atc3RhcnQnLFxuICAgIFRPUEVORDogJ3RvcC1lbmQnLFxuICAgIEJPVFRPTTogJ2JvdHRvbS1zdGFydCcsXG4gICAgQk9UVE9NRU5EOiAnYm90dG9tLWVuZCcsXG4gICAgUklHSFQ6ICdyaWdodC1zdGFydCcsXG4gICAgUklHSFRFTkQ6ICdyaWdodC1lbmQnLFxuICAgIExFRlQ6ICdsZWZ0LXN0YXJ0JyxcbiAgICBMRUZURU5EOiAnbGVmdC1lbmQnXG4gIH07XG4gIHZhciBEZWZhdWx0ID0ge1xuICAgIG9mZnNldDogMCxcbiAgICBmbGlwOiB0cnVlLFxuICAgIGJvdW5kYXJ5OiAnc2Nyb2xsUGFyZW50J1xuICB9O1xuICB2YXIgRGVmYXVsdFR5cGUgPSB7XG4gICAgb2Zmc2V0OiAnKG51bWJlcnxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgICBmbGlwOiAnYm9vbGVhbicsXG4gICAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJ1xuICAgIC8qKlxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIENsYXNzIERlZmluaXRpb25cbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuICB9O1xuXG4gIHZhciBEcm9wZG93biA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERyb3Bkb3duKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9wb3BwZXIgPSBudWxsO1xuICAgICAgdGhpcy5fY29uZmlnID0gdGh
21167pcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLl9tZW51ID0gdGhpcy5fZ2V0TWVudUVsZW1lbnQoKTtcbiAgICAgIHRoaXMuX2luTmF2YmFyID0gdGhpcy5fZGV0ZWN0TmF2YmFyKCk7XG5cbiAgICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgIHZhciBfcHJvdG8gPSBEcm9wZG93bi5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgICAgaWYgKHRoaXMuX2VsZW1lbnQuZGlzYWJsZWQgfHwgJCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuRElTQUJMRUQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHBhcmVudCA9IERyb3Bkb3duLl9nZXRQYXJlbnRGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcblxuICAgICAgdmFyIGlzQWN0aXZlID0gJCh0aGlzLl9tZW51KS5oYXNDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG5cbiAgICAgIERyb3Bkb3duLl9jbGVhck1lbnVzKCk7XG5cbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiB0aGlzLl9lbGVtZW50XG4gICAgICB9O1xuICAgICAgdmFyIHNob3dFdmVudCA9ICQuRXZlbnQoRXZlbnQuU0hPVywgcmVsYXRlZFRhcmdldCk7XG4gICAgICAkKHBhcmVudCkudHJpZ2dlcihzaG93RXZlbnQpO1xuXG4gICAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gRGlzYWJsZSB0b3RhbGx5IFBvcHBlci5qcyBmb3IgRHJvcGRvd24gaW4gTmF2YmFyXG5cblxuICAgICAgaWYgKCF0aGlzLl9pbk5hdmJhcikge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2sgZm9yIFBvcHBlciBkZXBlbmRlbmN5XG4gICAgICAgICAqIFBvcHBlciAtIGh0dHBzOi8vcG9wcGVyLmpzLm9yZ1xuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHR5cGVvZiBQb3BwZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwIGRyb3Bkb3duIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2Y
21167XIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7IC8vIEZvciBkcm9wdXAgd2l0aCBhbGlnbm1lbnQgd2UgdXNlIHRoZSBwYXJlbnQgYXMgcG9wcGVyIGNvbnRhaW5lclxuXG4gICAgICAgIGlmICgkKHBhcmVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLkRST1BVUCkpIHtcbiAgICAgICAgICBpZiAoJCh0aGlzLl9tZW51KS5oYXNDbGFzcyhDbGFzc05hbWUuTUVOVUxFRlQpIHx8ICQodGhpcy5fbWVudSkuaGFzQ2xhc3MoQ2xhc3NOYW1lLk1FTlVSSUdIVCkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIElmIGJvdW5kYXJ5IGlzIG5vdCBgc2Nyb2xsUGFyZW50YCwgdGhlbiBzZXQgcG9zaXRpb24gdG8gYHN0YXRpY2BcbiAgICAgICAgLy8gdG8gYWxsb3cgdGhlIG1lbnUgdG8gXCJlc2NhcGVcIiB0aGUgc2Nyb2xsIHBhcmVudCdzIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8yNDI1MVxuXG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5ib3VuZGFyeSAhPT0gJ3Njcm9sbFBhcmVudCcpIHtcbiAgICAgICAgICAkKHBhcmVudCkuYWRkQ2xhc3MoQ2xhc3NOYW1lLlBPU0lUSU9OX1NUQVRJQyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wb3BwZXIgPSBuZXcgUG9wcGVyKGVsZW1lbnQsIHRoaXMuX21lbnUsIHRoaXMuX2dldFBvcHBlckNvbmZpZygpKTtcbiAgICAgIH0gLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB0byB0aGUgYm9keSdzIGltbWVkaWF0ZSBjaGlsZHJlbjtcbiAgICAgIC8vIG9ubHkgbmVlZGVkIGJlY2F1c2Ugb2YgYnJva2VuIGV2ZW50IGRlbGVnYXRpb24gb24gaU9TXG4gICAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcblxuXG4gICAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmICQocGFyZW50KS5jbG9zZXN0KFNlbGVjdG9yLk5BVkJBUl9OQVYpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAkKCdib2R5JykuY2hpbGRyZW4oKS5vbignbW91c2VvdmVyJywgbnVsbCwgJC5ub29wKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZWxlbWVudC5mb2N1cygpO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHRydWUpO1xuXG4gICAgICAkKHRoaXMuX21lbnUpLnRvZ2dsZUNsYXNzKENsYXNzTmFtZS5TSE9XKTtcbiAgICAgICQocGFyZW50KS50b2dnbGVDbGFzcyhDbGFzc05hbWUuU0hPVykudHJpZ2dlcigkLkV2ZW50KEV2ZW50LlNIT1dOLCByZWxhdGVkVGFyZ2V0KSk7XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgICQucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSk7XG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLm9mZihFVkVOVF9LRVkpO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9tZW51ID0gbnVsbDtcblxuICAgICAgaWYgKHRoaXMuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpO1xuXG4gICAgICAgIHRoaXMuX3BvcHBlciA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgICB0aGlzLl9pbk5hdmJhciA9IHRoaXMuX2RldGVjdE5hdmJhcigpO1xuXG4gICAgICBpZiAodGhpcy5fcG9wcGVyICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3BvcHBlci5zY2hlZHVsZVVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH07IC8vIFByaXZhdGVcblxuXG4gICAgX3Byb3RvLl9hZGRFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICQodGhpcy5fZWxlbWVudCkub24oRXZlbnQuQ0xJQ0ssIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBfdGhpcy50b2dnbGUoKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldENvbmZpZyA9IGZ1bmN0aW9uIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICBjb25maWcgPSBfZXh0ZW5kcyh7fSwgdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LCAkKHRoaXMuX2VsZW1lbnQpLmRhdGEoKSwgY29uZmlnKTtcbiAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUsIGNvbmZpZywgdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSk7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldE1lbnVFbGVtZW50ID0gZnVuY3Rpb24gX2dldE1lbnVFbGVtZW50KCkge1xuICAgICAgaWYgKCF0aGlzLl9tZW51KSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy5fbWVudSA9ICQocGFyZW50KS5maW5kKFNlbGVjdG9yLk1FTlUpWzBdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fbWVudTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRQbGFjZW1lbnQgPSBmdW5jdGlvbiBfZ2V0UGxhY2VtZW50KCkge1xuICAgICAgdmFyICRwYXJlbnREcm9wZG93biA9ICQodGhpcy5fZWxlbWVudCkucGFyZW50KCk7XG4gICAgICB2Y
21167XIgcGxhY2VtZW50ID0gQXR0YWNobWVudE1hcC5CT1RUT007IC8vIEhhbmRsZSBkcm9wdXBcblxuICAgICAgaWYgKCRwYXJlbnREcm9wZG93bi5oYXNDbGFzcyhDbGFzc05hbWUuRFJPUFVQKSkge1xuICAgICAgICBwbGFjZW1lbnQgPSBBdHRhY2htZW50TWFwLlRPUDtcblxuICAgICAgICBpZiAoJCh0aGlzLl9tZW51KS5oYXNDbGFzcyhDbGFzc05hbWUuTUVOVVJJR0hUKSkge1xuICAgICAgICAgIHBsYWNlbWVudCA9IEF0dGFjaG1lbnRNYXAuVE9QRU5EO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCRwYXJlbnREcm9wZG93bi5oYXNDbGFzcyhDbGFzc05hbWUuRFJPUFJJR0hUKSkge1xuICAgICAgICBwbGFjZW1lbnQgPSBBdHRhY2htZW50TWFwLlJJR0hUO1xuICAgICAgfSBlbHNlIGlmICgkcGFyZW50RHJvcGRvd24uaGFzQ2xhc3MoQ2xhc3NOYW1lLkRST1BMRUZUKSkge1xuICAgICAgICBwbGFjZW1lbnQgPSBBdHRhY2htZW50TWFwLkxFRlQ7XG4gICAgICB9IGVsc2UgaWYgKCQodGhpcy5fbWVudSkuaGFzQ2xhc3MoQ2xhc3NOYW1lLk1FTlVSSUdIVCkpIHtcbiAgICAgICAgcGxhY2VtZW50ID0gQXR0YWNobWVudE1hcC5CT1RUT01FTkQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwbGFjZW1lbnQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fZGV0ZWN0TmF2YmFyID0gZnVuY3Rpb24gX2RldGVjdE5hdmJhcigpIHtcbiAgICAgIHJldHVybiAkKHRoaXMuX2VsZW1lbnQpLmNsb3Nlc3QoJy5uYXZiYXInKS5sZW5ndGggPiAwO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldFBvcHBlckNvbmZpZyA9IGZ1bmN0aW9uIF9nZXRQb3BwZXJDb25maWcoKSB7XG4gICAgICB2Y
21167XIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIG9mZnNldENvbmYgPSB7fTtcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLl9jb25maWcub2Zmc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9mZnNldENvbmYuZm4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIGRhdGEub2Zmc2V0cyA9IF9leHRlbmRzKHt9LCBkYXRhLm9mZnNldHMsIF90aGlzMi5fY29uZmlnLm9mZnNldChkYXRhLm9mZnNldHMpIHx8IHt9KTtcbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9mZnNldENvbmYub2Zmc2V0ID0gdGhpcy5fY29uZmlnLm9mZnNldDtcbiAgICAgIH1cblxuICAgICAgdmFyIHBvcHBlckNvbmZpZyA9IHtcbiAgICAgICAgcGxhY2VtZW50OiB0aGlzLl9nZXRQbGFjZW1lbnQoKSxcbiAgICAgICAgbW9kaWZpZXJzOiB7XG4gICAgICAgICAgb2Zmc2V0OiBvZmZzZXRDb25mLFxuICAgICAgICAgIGZsaXA6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuX2NvbmZpZy5mbGlwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcmV2ZW50T3ZlcmZsb3c6IHtcbiAgICAgICAgICAgIGJvdW5kYXJpZXNFbGVtZW50OiB0aGlzLl9jb25maWcuYm91bmRhcnlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gcG9wcGVyQ29uZmlnO1xuICAgIH07IC8vIFN0YXRpY1xuXG5cbiAgICBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2Y
21167XIgZGF0YSA9ICQodGhpcykuZGF0YShEQVRBX0tFWSk7XG5cbiAgICAgICAgdmFyIF9jb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IG51bGw7XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBEcm9wZG93bih0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAkKHRoaXMpLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTm8gbWV0aG9kIG5hbWVkIFxcXCJcIiArIGNvbmZpZyArIFwiXFxcIlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIERyb3Bkb3duLl9jbGVhck1lbnVzID0gZnVuY3Rpb24gX2NsZWFyTWVudXMoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudCAmJiAoZXZlbnQud2hpY2ggPT09IFJJR0hUX01PVVNFX0JVVFRPTl9XSElDSCB8fCBldmVudC50eXBlID09PSAna2V5dXAnICYmIGV2ZW50LndoaWNoICE9PSBUQUJfS0VZQ09ERSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgdG9nZ2xlcyA9ICQubWFrZUFycmF5KCQoU2VsZWN0b3IuREFUQV9UT0dHTEUpKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2dnbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodG9nZ2xlc1tpXSk7XG5cbiAgICAgICAgdmFyIGNvbnRleHQgPSAkKHRvZ2dsZXNbaV0pLmRhdGEoREFUQV9LRVkpO1xuICAgICAgICB2Y
21167XIgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgICAgICByZWxhdGVkVGFyZ2V0OiB0b2dnbGVzW2ldXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZHJvcGRvd25NZW51ID0gY29udGV4dC5fbWVudTtcblxuICAgICAgICBpZiAoISQocGFyZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuU0hPVykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudCAmJiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJyAmJiAvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSB8fCBldmVudC50eXBlID09PSAna2V5dXAnICYmIGV2ZW50LndoaWNoID09PSBUQUJfS0VZQ09ERSkgJiYgJC5jb250YWlucyhwYXJlbnQsIGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBoaWRlRXZlbnQgPSAkLkV2ZW50KEV2ZW50LkhJREUsIHJlbGF0ZWRUYXJnZXQpO1xuICAgICAgICAkKHBhcmVudCkudHJpZ2dlcihoaWRlRXZlbnQpO1xuXG4gICAgICAgIGlmIChoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgICAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHdlIGFkZGVkIGZvciBpT1Mgc3VwcG9ydFxuXG5cbiAgICAgICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAgICQoJ2JvZHknKS5jaGlsZHJlbigpLm9mZignbW91c2VvdmVyJywgbnVsbCwgJC5ub29wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRvZ2dsZXNbaV0uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgICAgICQoZHJvcGRvd25NZW51KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG4gICAgICAgICQocGFyZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuU0hPVykudHJpZ2dlcigkLkV2ZW50KEV2ZW50LkhJRERFTiwgcmVsYXRlZFRhcmdldCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQgPSBmdW5jdGlvbiBfZ2V0UGFyZW50RnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIHBhcmVudDtcbiAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgIHBhcmVudCA9ICQoc2VsZWN0b3IpWzBdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyZW50IHx8IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuXG5cbiAgICBEcm9wZG93bi5fZGF0YUFwaUtleWRvd25IYW5kbGVyID0gZnVuY3Rpb24gX2RhdGFBcGlLZXlkb3duSGFuZGxlcihldmVudCkge1xuICAgICAgLy8gSWYgbm90IGlucHV0L3RleHRhcmVhOlxuICAgICAgLy8gIC0gQW5kIG5vdCBhIGtleSBpbiBSRUdFWFBfS0VZRE9XTiA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgICAvLyBJZiBpbnB1dC90ZXh0YXJlYTpcbiAgICAgIC8vICAtIElmIHNwYWNlIGtleSA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgICAvLyAgLSBJZiBrZXkgaXMgb3RoZXIgdGhhbiBlc2NhcGVcbiAgICAgIC8vICAgIC0gSWYga2V5IGlzIG5vdCB1cCBvciBkb3duID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcbiAgICAgIC8vICAgIC0gSWYgdHJpZ2dlciBpbnNpZGUgdGhlIG1lbnUgPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuICAgICAgaWYgKC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpID8gZXZlbnQud2hpY2ggPT09IFNQQUNFX0tFWUNPREUgfHwgZXZlbnQud2hpY2ggIT09IEVTQ0FQRV9LRVlDT0RFICYmIChldmVudC53aGljaCAhPT0gQVJST1dfRE9XTl9LRVlDT0RFICYmIGV2ZW50LndoaWNoICE9PSBBUlJPV19VUF9LRVlDT0RFIHx8ICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFNlbGVjdG9yLk1FTlUpLmxlbmd0aCkgOiAhUkVHRVhQX0tFWURPV04udGVzdChldmVudC53aGljaCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8ICQodGhpcykuaGFzQ2xhc3MoQ2xhc3NOYW1lLkRJU0FCTEVEKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcyk7XG5cbiAgICAgIHZhciBpc0FjdGl2ZSA9ICQocGFyZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG5cbiAgICAgIGlmICghaXNBY3RpdmUgJiYgKGV2ZW50LndoaWNoICE9PSBFU0NBUEVfS0VZQ09ERSB8fCBldmVudC53aGljaCAhPT0gU1BBQ0VfS0VZQ09ERSkgfHwgaXNBY3RpdmUgJiYgKGV2ZW50LndoaWNoID09PSBFU0NBUEVfS0VZQ09ERSB8fCBldmVudC53aGljaCA9PT0gU1BBQ0VfS0VZQ09ERSkpIHtcbiAgICAgICAgaWYgKGV2ZW50LndoaWNoID09PSBFU0NBUEVfS0VZQ09ERSkge1xuICAgICAgICAgIHZhciB0b2dnbGUgPSAkKHBhcmVudCkuZmluZChTZWxlY3Rvci5EQVRBX1RPR0dMRSlbMF07XG4gICAgICAgICAgJCh0b2dnbGUpLnRyaWdnZXIoJ2ZvY3VzJyk7XG4gICAgICAgIH1cblxuICAgICAgICAkKHRoaXMpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZW1zID0gJChwYXJlbnQpLmZpbmQoU2VsZWN0b3IuVklTSUJMRV9JVEVNUykuZ2V0KCk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2Y
21167XIgaW5kZXggPSBpdGVtcy5pbmRleE9mKGV2ZW50LnRhcmdldCk7XG5cbiAgICAgIGlmIChldmVudC53aGljaCA9PT0gQVJST1dfVVBfS0VZQ09ERSAmJiBpbmRleCA+IDApIHtcbiAgICAgICAgLy8gVXBcbiAgICAgICAgaW5kZXgtLTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LndoaWNoID09PSBBUlJPV19ET1dOX0tFWUNPREUgJiYgaW5kZXggPCBpdGVtcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIC8vIERvd25cbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGl0ZW1zW2luZGV4XS5mb2N1cygpO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoRHJvcGRvd24sIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHQ7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRUeXBlXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHRUeXBlO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBEcm9wZG93bjtcbiAgfSgpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gICQoZG9jdW1lbnQpLm9uKEV2ZW50LktFWURPV05fREFUQV9BUEksIFNlbGVjdG9yLkRBVEFfVE9HR0xFLCBEcm9wZG93bi5fZGF0YUFwaUtleWRvd25IYW5kbGVyKS5vbihFdmVudC5LRVlET1dOX0RBVEFfQVBJLCBTZWxlY3Rvci5NRU5VLCBEcm9wZG93bi5fZGF0YUFwaUtleWRvd25IYW5kbGVyKS5vbihFdmVudC5DTElDS19EQVRBX0FQSSArIFwiIFwiICsgRXZlbnQuS0VZVVBfREFUQV9BUEksIERyb3Bkb3duLl9jbGVhck1lbnVzKS5vbihFdmVudC5DTElDS19EQVRBX0FQSSwgU2VsZWN0b3IuREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJCh0aGlzKSwgJ3RvZ2dsZScpO1xuICB9KS5vbihFdmVudC5DTElDS19EQVRBX0FQSSwgU2VsZWN0b3IuRk9STV9DSElMRCwgZnVuY3Rpb24gKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9KTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBqUXVlcnlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gICQuZm5bTkFNRV0gPSBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlO1xuICAkLmZuW05BTUVdLkNvbnN0cnVjdG9yID0gRHJvcGRvd247XG5cbiAgJC5mbltOQU1FXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm5bTkFNRV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgcmV0dXJuIERyb3Bkb3duLl9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgcmV0dXJuIERyb3Bkb3duO1xufSgkLCBQb3BwZXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZHJvcGRvd24uanMubWFwIiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci
211675jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY0LjAuMCk6IG1vZGFsLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xudmFyIE1vZGFsID0gZnVuY3Rpb24gKCQpIHtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDb25zdGFudHNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICB2YXIgTkFNRSA9ICdtb2RhbCc7XG4gIHZhciBWRVJTSU9OID0gJzQuMC4wJztcbiAgdmFyIERBVEFfS0VZID0gJ2JzLm1vZGFsJztcbiAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XG4gIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bTkFNRV07XG4gIHZhciBUUkFOU0lUSU9OX0RVUkFUSU9OID0gMzAwO1xuICB2YXIgQkFDS0RST1BfVFJBTlNJVElPTl9EVVJBVElPTiA9IDE1MDtcbiAgdmFyIEVTQ0FQRV9LRVlDT0RFID0gMjc7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIEVzY2FwZSAoRXNjKSBrZXlcblxuICB2YXIgRGVmYXVsdCA9IHtcbiAgICBiYWNrZHJvcDogdHJ1ZSxcbiAgICBrZXlib2FyZDogdHJ1ZSxcbiAgICBmb2N1czogdHJ1ZSxcbiAgICBzaG93OiB0cnVlXG4gIH07XG4gIHZhciBEZWZhdWx0VHlwZSA9IHtcbiAgICBiYWNrZHJvcDogJyhib29sZWFufHN0cmluZyknLFxuICAgIGtleWJvYXJkOiAnYm9vbGVhbicsXG4gICAgZm9jdXM6ICdib29sZWFuJyxcbiAgICBzaG93OiAnYm9vbGVhbidcbiAgfTtcbiAgdmFyIEV2ZW50ID0ge1xuICAgIEhJREU6IFwiaGlkZVwiICsgRVZFTlRfS0VZLFxuICAgIEhJRERFTjogXCJoaWRkZW5cIiArIEVWRU5UX0tFWSxcbiAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSxcbiAgICBTSE9XTjogXCJzaG93blwiICsgRVZFTlRfS0VZLFxuICAgIEZPQ1VTSU46IFwiZm9jdXNpblwiICsgRVZFTlRfS0VZLFxuICAgIFJFU0laRTogXCJyZXNpemVcIiArIEVWRU5UX0tFWSxcbiAgICBDTElDS19ESVNNSVNTOiBcImNsaWNrLmRpc21pc3NcIiArIEVWRU5UX0tFWSxcbiAgICBLRVlET1dOX0RJU01JU1M6IFwia2V5ZG93bi5kaXNtaXNzXCIgKyBFVkVOVF9LRVksXG4gICAgTU9VU0VVUF9ESVNNSVNTOiBcIm1vdXNldXAuZGlzbWlzc1wiICsgRVZFTlRfS0VZLFxuICAgIE1PVVNFRE9XTl9ESVNNSVNTOiBcIm1vdXNlZG93bi5kaXNtaXNzXCIgKyBFVkVOVF9LRVksXG4gICAgQ0xJQ0tfREFUQV9BUEk6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWVxuICB9O1xuICB2YXIgQ2xhc3NOYW1lID0ge1xuICAgIFNDUk9MTEJBUl9NRUFTVVJFUjogJ21vZGFsLXNjcm9sbGJhci1tZWFzdXJlJyxcbiAgICBCQUNLRFJPUDogJ21vZGFsLWJhY2tkcm9wJyxcbiAgICBPUEVOOiAnbW9kYWwtb3BlbicsXG4gICAgRkFERTogJ2ZhZGUnLFxuICAgIFNIT1c6ICdzaG93J1xuICB9O1xuICB2YXIgU2VsZWN0b3IgPSB7XG4gICAgRElBTE9HOiAnLm1vZGFsLWRpYWxvZycsXG4gICAgREFUQV9UT0dHTEU6ICdbZGF0YS10b2dnbGU9XCJtb2RhbFwiXScsXG4gICAgREFUQV9ESVNNSVNTOiAnW2RhdGEtZGlzbWlzcz1cIm1vZGFsXCJdJyxcbiAgICBGSVhFRF9DT05URU5UOiAnLmZpeGVkLXRvcCwgLmZpeGVkLWJvdHRvbSwgLmlzLWZpeGVkLCAuc3RpY2t5LXRvcCcsXG4gICAgU1RJQ0tZX0NPTlRFTlQ6ICcuc3RpY2t5LXRvcCcsXG4gICAgTkFWQkFSX1RPR0dMRVI6ICcubmF2YmFyLXRvZ2dsZXInXG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuXG4gIH07XG5cbiAgdmFyIE1vZGFsID1cbiAgLyojX19QVVJFX18qL1xuICBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTW9kYWwoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgdGhpcy5fZGlhbG9nID0gJChlbGVtZW50KS5maW5kKFNlbGVjdG9yLkRJQUxPRylbMF07XG4gICAgICB0aGlzLl9iYWNrZHJvcCA9IG51bGw7XG4gICAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgICB0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyA9IGZhbHNlO1xuICAgICAgdGhpcy5faWdub3JlQmFja2Ryb3BDbGljayA9IGZhbHNlO1xuICAgICAgdGhpcy5fb3JpZ2luYWxCb2R5UGFkZGluZyA9IDA7XG4gICAgICB0aGlzLl9zY3JvbGxiYXJXaWR0aCA9IDA7XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgI
21167HZhciBfcHJvdG8gPSBNb2RhbC5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldCk7XG4gICAgfTtcblxuICAgIF9wcm90by5zaG93ID0gZnVuY3Rpb24gc2hvdyhyZWxhdGVkVGFyZ2V0KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8IHRoaXMuX2lzU2hvd24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoVXRpbC5zdXBwb3J0c1RyYW5zaXRpb25FbmQoKSAmJiAkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5GQURFKSkge1xuICAgICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2hvd0V2ZW50ID0gJC5FdmVudChFdmVudC5TSE9XLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRUYXJnZXRcbiAgICAgIH0pO1xuICAgICAgJCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNob3dFdmVudCk7XG5cbiAgICAgIGlmICh0aGlzLl9pc1Nob3duIHx8IHNob3dFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzU2hvd24gPSB0cnVlO1xuXG4gICAgICB0aGlzLl9jaGVja1Njcm9sbGJhcigpO1xuXG4gICAgICB0aGlzLl9zZXRTY3JvbGxiYXIoKTtcblxuICAgICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG5cbiAgICAgICQoZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MoQ2xhc3NOYW1lLk9QRU4pO1xuXG4gICAgICB0aGlzLl9zZXRFc2NhcGVFdmVudCgpO1xuXG4gICAgICB0aGlzLl9zZXRSZXNpemVFdmVudCgpO1xuXG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLm9uKEV2ZW50LkNMSUNLX0RJU01JU1MsIFNlbGVjdG9yLkRBVEFfRElTTUlTUywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5oaWRlKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgJCh0aGlzLl9kaWFsb2cpLm9uKEV2ZW50Lk1PVVNFRE9XTl9ESVNNSVNTLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICQoX3RoaXMuX2VsZW1lbnQpLm9uZShFdmVudC5NT1VTRVVQX0RJU01JU1MsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGlmICgkKGV2ZW50LnRhcmdldCkuaXMoX3RoaXMuX2VsZW1lbnQpKSB7XG4gICAgICAgICAgICBfdGhpcy5faWdub3JlQmFja2Ryb3BDbGljayA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9zaG93QmFja2Ryb3AoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuX3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5oaWRlID0gZnVuY3Rpb24gaGlkZShldmVudCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICF0aGlzLl9pc1Nob3duKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGhpZGVFdmVudCA9ICQuRXZlbnQoRXZlbnQuSElERSk7XG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoaGlkZUV2ZW50KTtcblxuICAgICAgaWYgKCF0aGlzLl9pc1Nob3duIHx8IGhpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICAgIHZhciB0cmFuc2l0aW9uID0gVXRpbC5zdXBwb3J0c1RyYW5zaXRpb25FbmQoKSAmJiAkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5GQURFKTtcblxuICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2V0RXNjYXBlRXZlbnQoKTtcblxuICAgICAgdGhpcy5fc2V0UmVzaXplRXZlbnQoKTtcblxuICAgICAgJChkb2N1bWVudCkub2ZmKEV2ZW50LkZPQ1VTSU4pO1xuICAgICAgJCh0aGlzLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLm9mZihFdmVudC5DTElDS19ESVNNSVNTKTtcbiAgICAgICQodGhpcy5fZGlhbG9nKS5vZmYoRXZlbnQuTU9VU0VET1dOX0RJU01JU1MpO1xuXG4gICAgICBpZiAodHJhbnNpdGlvbikge1xuICAgICAgICAkKHRoaXMuX2VsZW1lbnQpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLl9oaWRlTW9kYWwoZXZlbnQpO1xuICAgICAgICB9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZChUUkFOU0lUSU9OX0RVUkFUSU9OKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2hpZGVNb2RhbCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICAkLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkpO1xuICAgICAgJCh3aW5kb3csIGRvY3VtZW50LCB0aGlzLl9lbGVtZW50LCB0aGlzLl9iYWNrZHJvcCkub2ZmKEVWRU5UX0tFWSk7XG4gICAgICB0aGlzLl9jb25maWcgPSBudWxsO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9kaWFsb2cgPSBudWxsO1xuICAgICAgdGhpcy5fYmFja2Ryb3AgPSBudWxsO1xuICAgICAgdGhpcy5faXNTaG93biA9IG51bGw7XG4gICAgICB0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyA9IG51bGw7XG4gICAgICB0aGlzLl9pZ25vcmVCYWNrZHJvcENsaWNrID0gbnVsbDtcbiAgICAgIHRoaXMuX3Njcm9sbGJhcldpZHRoID0gbnVsbDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmhhbmRsZVVwZGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZVVwZGF0ZSgpIHtcbiAgICAgIHRoaXMuX2FkanVzdERpYWxvZygpO1xuICAgIH07IC8vIFByaXZhdGVcblxuXG4gICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgY29uZmlnID0gX2V4dGVuZHMoe30sIERlZmF1bHQsIGNvbmZpZyk7XG4gICAgICBVdGlsLnR5cGVDaGVja0NvbmZpZyhOQU1FLCBjb25maWcsIERlZmF1bHRUeXBlKTtcbiAgICAgIHJldHVybi
21167Bjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5fc2hvd0VsZW1lbnQgPSBmdW5jdGlvbiBfc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciB0cmFuc2l0aW9uID0gVXRpbC5zdXBwb3J0c1RyYW5zaXRpb25FbmQoKSAmJiAkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5GQURFKTtcblxuICAgICAgaWYgKCF0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUgfHwgdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAvLyBEb24ndCBtb3ZlIG1vZGFsJ3MgRE9NIHBvc2l0aW9uXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnNjcm9sbFRvcCA9IDA7XG5cbiAgICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAgIFV0aWwucmVmbG93KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKENsYXNzTmFtZS5TSE9XKTtcblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5mb2N1cykge1xuICAgICAgICB0aGlzLl9lbmZvcmNlRm9jdXMoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNob3duRXZlbnQgPSAkLkV2ZW50KEV2ZW50LlNIT1dOLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRUYXJnZXRcbiAgICAgIH0pO1xuXG4gICAgICB2Y
21167XIgdHJhbnNpdGlvbkNvbXBsZXRlID0gZnVuY3Rpb24gdHJhbnNpdGlvbkNvbXBsZXRlKCkge1xuICAgICAgICBpZiAoX3RoaXMzLl9jb25maWcuZm9jdXMpIHtcbiAgICAgICAgICBfdGhpczMuX2VsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgICAgICQoX3RoaXMzLl9lbGVtZW50KS50cmlnZ2VyKHNob3duRXZlbnQpO1xuICAgICAgfTtcblxuICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgJCh0aGlzLl9kaWFsb2cpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCB0cmFuc2l0aW9uQ29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKFRSQU5TSVRJT05fRFVSQVRJT04pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNpdGlvbkNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fZW5mb3JjZUZvY3VzID0gZnVuY3Rpb24gX2VuZm9yY2VGb2N1cygpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICAkKGRvY3VtZW50KS5vZmYoRXZlbnQuRk9DVVNJTikgLy8gR3VhcmQgYWdhaW5zdCBpbmZpbml0ZSBmb2N1cyBsb29wXG4gICAgICAub24oRXZlbnQuRk9DVVNJTiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmIChkb2N1bWVudCAhPT0gZXZlbnQudGFyZ2V0ICYmIF90aGlzNC5fZWxlbWVudCAhPT0gZXZlbnQudGFyZ2V0ICYmICQoX3RoaXM0Ll9lbGVtZW50KS5oYXMoZXZlbnQudGFyZ2V0KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBfdGhpczQuX2VsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0RXNjYXBlRXZlbnQgPSBmdW5jdGlvbiBfc2V0RXNjYXBlRXZlbnQoKSB7XG4gICAgICB2Y
21167XIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2lzU2hvd24gJiYgdGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgICQodGhpcy5fZWxlbWVudCkub24oRXZlbnQuS0VZRE9XTl9ESVNNSVNTLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoZXZlbnQud2hpY2ggPT09IEVTQ0FQRV9LRVlDT0RFKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICBfdGhpczUuaGlkZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLl9pc1Nob3duKSB7XG4gICAgICAgICQodGhpcy5fZWxlbWVudCkub2ZmKEV2ZW50LktFWURPV05fRElTTUlTUyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0UmVzaXplRXZlbnQgPSBmdW5jdGlvbiBfc2V0UmVzaXplRXZlbnQoKSB7XG4gICAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2lzU2hvd24pIHtcbiAgICAgICAgJCh3aW5kb3cpLm9uKEV2ZW50LlJFU0laRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzNi5oYW5kbGVVcGRhdGUoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQod2luZG93KS5vZmYoRXZlbnQuUkVTSVpFKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9oaWRlTW9kYWwgPSBmdW5jdGlvbiBfaGlkZU1vZGFsKCkge1xuICAgICAgdmFyIF90aGlzNyA9IHRoaXM7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgdHJ1ZSk7XG5cbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuXG4gICAgICB0aGlzLl9zaG93QmFja2Ryb3AoZnVuY3Rpb24gKCkge1xuICAgICAgICAkKGRvY3VtZW50LmJvZHkpLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5PUEVOKTtcblxuICAgICAgICBfdGhpczcuX3Jlc2V0QWRqdXN0bWVudHMoKTtcblxuICAgICAgICBfdGhpczcuX3Jlc2V0U2Nyb2xsYmFyKCk7XG5cbiAgICAgICAgJChfdGhpczcuX2VsZW1lbnQpLnRyaWdnZXIoRXZlbnQuSElEREVOKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX3JlbW92ZUJhY2tkcm9wID0gZnVuY3Rpb24gX3JlbW92ZUJhY2tkcm9wKCkge1xuICAgICAgaWYgKHRoaXMuX2JhY2tkcm9wKSB7XG4gICAgICAgICQodGhpcy5fYmFja2Ryb3ApLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fc2hvd0JhY2tkcm9wID0gZnVuY3Rpb24gX3Nob3dCYWNrZHJvcChjYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICAgIHZhciBhbmltYXRlID0gJCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuRkFERSkgPyBDbGFzc05hbWUuRkFERSA6ICcnO1xuXG4gICAgICBpZiAodGhpcy5faXNTaG93biAmJiB0aGlzLl9jb25maWcuYmFja2Ryb3ApIHtcbiAgICAgICAgdmFyIGRvQW5pbWF0ZSA9IFV0aWwuc3VwcG9ydHNUcmFuc2l0aW9uRW5kKCkgJiYgYW5pbWF0ZTtcbiAgICAgICAgdGhpcy5fYmFja2Ryb3AgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5fYmFja2Ryb3AuY2xhc3NOYW1lID0gQ2xhc3NOYW1lLkJBQ0tEUk9QO1xuXG4gICAgICAgIGlmIChhbmltYXRlKSB7XG4gICAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkuYWRkQ2xhc3MoYW5pbWF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAkKHRoaXMuX2JhY2tkcm9wKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgJCh0aGlzLl9lbGVtZW50KS5vbihFdmVudC5DTElDS19ESVNNSVNTLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoX3RoaXM4Ll9pZ25vcmVCYWNrZHJvcENsaWNrKSB7XG4gICAgICAgICAgICBfdGhpczguX2lnbm9yZUJhY2tkcm9wQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBldmVudC5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF90aGlzOC5fY29uZmlnLmJhY2tkcm9wID09PSAnc3RhdGljJykge1xuICAgICAgICAgICAgX3RoaXM4Ll9lbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzOC5oaWRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZG9BbmltYXRlKSB7XG4gICAgICAgICAgVXRpbC5yZWZsb3codGhpcy5fYmFja2Ryb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkuYWRkQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpO1xuXG4gICAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRvQW5pbWF0ZSkge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNhbGxiYWNrKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChCQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzU2hvd24gJiYgdGhpcy5fYmFja2Ryb3ApIHtcbiAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpO1xuXG4gICAgICAgIHZhciBjYWxsYmFja1JlbW92ZSA9IGZ1bmN0aW9uIGNhbGxiYWNrUmVtb3ZlKCkge1xuICAgICAgICAgIF90aGlzOC5fcmVtb3ZlQmFja2Ryb3AoKTtcblxuICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKFV0aWwuc3VwcG9ydHNUcmFuc2l0aW9uRW5kKCkgJiYgJCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuRkFERSkpIHtcbiAgICAgICAgICAkKHRoaXMuX2JhY2tkcm9wKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY2FsbGJhY2tSZW1vdmUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKEJBQ0tEUk9QX1RS
21167QU5TSVRJT05fRFVSQVRJT04pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrUmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9OyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gdGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIGhhbmRsZSBvdmVyZmxvd2luZyBtb2RhbHNcbiAgICAvLyB0b2RvIChmYXQpOiB0aGVzZSBzaG91bGQgcHJvYmFibHkgYmUgcmVmYWN0b3JlZCBvdXQgb2YgbW9kYWwuanNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuICAgIF9wcm90by5fYWRqdXN0RGlhbG9nID0gZnVuY3Rpb24gX2FkanVzdERpYWxvZygpIHtcbiAgICAgIHZhciBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG5cbiAgICAgIGlmICghdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcgJiYgaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSB0aGlzLl9zY3JvbGxiYXJXaWR0aCArIFwicHhcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2lzQm9keU92ZXJmbG93aW5nICYmICFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSB0aGlzLl9zY3JvbGxiYXJXaWR0aCArIFwicHhcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9yZXNldEFkanVzdG1lbnRzID0gZnVuY3Rpb24gX3Jlc2V0QWRqdXN0bWVudHMoKSB7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0ID0gJyc7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9ICcnO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2NoZWNrU2Nyb2xsYmFyID0gZnVuY3Rpb24gX2NoZWNrU2Nyb2xsYmFyKCkge1xuICAgICAgdmFyIHJlY3QgPSBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcgPSByZWN0LmxlZnQgKyByZWN0LnJpZ2h0IDwgd2luZG93LmlubmVyV2lkdGg7XG4gICAgICB0aGlzLl9zY3JvbGxiYXJXaWR0aCA9IHRoaXMuX2dldFNjcm9sbGJhcldpZHRoKCk7XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0U2Nyb2xsYmFyID0gZnVuY3Rpb24gX3NldFNjcm9sbGJhcigpIHtcbiAgICAgIHZhciBfdGhpczkgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcpIHtcbiAgICAgICAgLy8gTm90ZTogRE9NTm9kZS5zdHlsZS5wYWRkaW5nUmlnaHQgcmV0dXJucyB0aGUgYWN0dWFsIHZhbHVlIG9yICcnIGlmIG5vdCBzZXRcbiAgICAgICAgLy8gICB3aGlsZSAkKERPTU5vZGUpLmNzcygncGFkZGluZy1yaWdodCcpIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgdmFsdWUgb3IgMCBpZiBub3Qgc2V0XG4gICAgICAgIC8vIEFkanVzdCBmaXhlZCBjb250ZW50IHBhZGRpbmdcbiAgICAgICAgJChTZWxlY3Rvci5GSVhFRF9DT05URU5UKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICAgIHZhciBhY3R1YWxQYWRkaW5nID0gJChlbGVtZW50KVswXS5zdHlsZS5wYWRkaW5nUmlnaHQ7XG4gICAgICAgICAgdmFyIGNhbGN1bGF0ZWRQYWRkaW5nID0gJChlbGVtZW50KS5jc3MoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgICAkKGVsZW1lbnQpLmRhdGEoJ3BhZGRpbmctcmlnaHQnLCBhY3R1YWxQYWRkaW5nKS5jc3MoJ3BhZGRpbmctcmlnaHQnLCBwYXJzZUZsb2F0KGNhbGN1bGF0ZWRQYWRkaW5nKSArIF90aGlzOS5fc2Nyb2xsYmFyV2lkdGggKyBcInB4XCIpO1xuICAgICAgICB9KTsgLy8gQWRqdXN0IHN0aWNreSBjb250ZW50IG1hcmdpblxuXG4gICAgICAgICQoU2VsZWN0b3IuU1RJQ0tZX0NPTlRFTlQpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7XG4gICAgICAgICAgdmFyIGFjdHVhbE1hcmdpbiA9ICQoZWxlbWVudClbMF0uc3R5bGUubWFyZ2luUmlnaHQ7XG4gICAgICAgICAgdmFyIGNhbGN1bGF0ZWRNYXJnaW4gPSAkKGVsZW1lbnQpLmNzcygnbWFyZ2luLXJpZ2h0Jyk7XG4gICAgICAgICAgJChlbGVtZW50KS5kYXRhKCdtYXJnaW4tcmlnaHQnLCBhY3R1YWxNYXJnaW4pLmNzcygnbWFyZ2luLXJpZ2h0JywgcGFyc2VGbG9hdChjYWxjdWxhdGVkTWFyZ2luKSAtIF90aGlzOS5fc2Nyb2xsYmFyV2lkdGggKyBcInB4XCIpO1xuICAgICAgICB9KTsgLy8gQWRqdXN0IG5hdmJhci10b2dnbGVyIG1hcmdpblxuXG4gICAgICAgICQoU2VsZWN0b3IuTkFWQkFSX1RPR0dMRVIpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7XG4gICAgICAgICAgdmFyIGFjdHVhbE1hcmdpbiA9ICQoZWxlbWVudClbMF0uc3R5bGUubWFyZ2luUmlnaHQ7XG4gICAgICAgICAgdmFyIGNhbGN1bGF0ZWRNYXJnaW4gPSAkKGVsZW1lbnQpLmNzcygnbWFyZ2luLXJpZ2h0Jyk7XG4gICAgICAgICAgJChlbGVtZW50KS5kYXRhKCdtYXJnaW4tcmlnaHQnLCBhY3R1YWxNYXJnaW4pLmNzcygnbWFyZ2luLXJpZ2h0JywgcGFyc2VGbG9hdChjYWxjdWxhdGVkTWFyZ2luKSArIF90aGlzOS5fc2Nyb2xsYmFyV2lkdGggKyBcInB4XCIpO1xuICAgICAgICB9KTsgLy8gQWRqdXN0IGJvZHkgcGFkZGluZ1xuXG4gICAgICAgIHZhciBhY3R1YWxQYWRkaW5nID0gZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ7XG4gICAgICAgIHZhciBjYWxjdWxhdGVkUGFkZGluZyA9ICQoJ2JvZHknKS5jc3MoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgJCgnYm9keScpLmRhdGEoJ3BhZGRpbmctcmlnaHQnLCBhY3R1YWxQYWRkaW5nKS5jc3MoJ3BhZGRpbmctcmlnaHQnLCBwYXJzZUZsb2F0KGNhbGN1bGF0ZWRQYWRkaW5nKSArIHRoaXMuX3Njcm9sbGJhcldpZHRoICsgXCJweFwiKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9yZXNldFNjcm9sbGJhciA9IGZ1bmN0aW9uIF9yZXNldFNjcm9sbGJhcigpIHtcbiAgICAgIC8vIFJlc3RvcmUgZml4ZWQgY29udGVudCBwYWRkaW5nXG4gICAgICAkKFNlbGVjdG9yLkZJWEVEX0NPTlRFTlQpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7XG4gICAgICAgI
21167HZhciBwYWRkaW5nID0gJChlbGVtZW50KS5kYXRhKCdwYWRkaW5nLXJpZ2h0Jyk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYWRkaW5nICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICQoZWxlbWVudCkuY3NzKCdwYWRkaW5nLXJpZ2h0JywgcGFkZGluZykucmVtb3ZlRGF0YSgncGFkZGluZy1yaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9KTsgLy8gUmVzdG9yZSBzdGlja3kgY29udGVudCBhbmQgbmF2YmFyLXRvZ2dsZXIgbWFyZ2luXG5cbiAgICAgICQoU2VsZWN0b3IuU1RJQ0tZX0NPTlRFTlQgKyBcIiwgXCIgKyBTZWxlY3Rvci5OQVZCQVJfVE9HR0xFUikuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIG1hcmdpbiA9ICQoZWxlbWVudCkuZGF0YSgnbWFyZ2luLXJpZ2h0Jyk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtYXJnaW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgJChlbGVtZW50KS5jc3MoJ21hcmdpbi1yaWdodCcsIG1hcmdpbikucmVtb3ZlRGF0YSgnbWFyZ2luLXJpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pOyAvLyBSZXN0b3JlIGJvZHkgcGFkZGluZ1xuXG4gICAgICB2YXIgcGFkZGluZyA9ICQoJ2JvZHknKS5kYXRhKCdwYWRkaW5nLXJpZ2h0Jyk7XG5cbiAgICAgIGlmICh0eXBlb2YgcGFkZGluZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgJCgnYm9keScpLmNzcygncGFkZGluZy1yaWdodCcsIHBhZGRpbmcpLnJlbW92ZURhdGEoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRTY3JvbGxiYXJXaWR0aCA9IGZ1bmN0aW9uIF9nZXRTY3JvbGxiYXJXaWR0aCgpIHtcbiAgICAgIC8vIHRoeCBkLndhbHNoXG4gICAgICB2Y
21167XIgc2Nyb2xsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzY3JvbGxEaXYuY2xhc3NOYW1lID0gQ2xhc3NOYW1lLlNDUk9MTEJBUl9NRUFTVVJFUjtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2Nyb2xsRGl2KTtcbiAgICAgIHZhciBzY3JvbGxiYXJXaWR0aCA9IHNjcm9sbERpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIHNjcm9sbERpdi5jbGllbnRXaWR0aDtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2Nyb2xsRGl2KTtcbiAgICAgIHJldHVybiBzY3JvbGxiYXJXaWR0aDtcbiAgICB9OyAvLyBTdGF0aWNcblxuXG4gICAgTW9kYWwuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnLCByZWxhdGVkVGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAkKHRoaXMpLmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICAgIHZhciBfY29uZmlnID0gX2V4dGVuZHMoe30sIE1vZGFsLkRlZmF1bHQsICQodGhpcykuZGF0YSgpLCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWcpO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgTW9kYWwodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgJCh0aGlzKS5kYXRhKERBVEFfS0VZLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBjb25maWcgKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVtjb25maWddKHJlbGF0ZWRUYXJnZXQpO1xuICAgICAgICB9IGVsc2UgaWYgKF9jb25maWcuc2hvdykge1xuICAgICAgICAgIGRhdGEuc2hvdyhyZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9jcmVhdGVDbGFzcyhNb2RhbCwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFZFUlNJT047XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdDtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gTW9kYWw7XG4gIH0oKTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAkKGRvY3VtZW50KS5vbihFdmVudC5DTElDS19EQVRBX0FQSSwgU2VsZWN0b3IuREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBfdGhpczEwID0gdGhpcztcblxuICAgIHZhciB0YXJnZXQ7XG4gICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMpO1xuXG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICB0YXJnZXQgPSAkKHNlbGVjdG9yKVswXTtcbiAgICB9XG5cbiAgICB2YXIgY29uZmlnID0gJCh0YXJnZXQpLmRhdGEoREFUQV9LRVkpID8gJ3RvZ2dsZScgOiBfZXh0ZW5kcyh7fSwgJCh0YXJnZXQpLmRhdGEoKSwgJCh0aGlzKS5kYXRhKCkpO1xuXG4gICAgaWYgKHRoaXMudGFnTmFtZSA9PT0gJ0EnIHx8IHRoaXMudGFnTmFtZSA9PT0gJ0FSRUEnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHZhciAkdGFyZ2V0ID0gJCh0YXJnZXQpLm9uZShFdmVudC5TSE9XLCBmdW5jdGlvbiAoc2hvd0V2ZW50KSB7XG4gICAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIC8vIE9ubHkgcmVnaXN0ZXIgZm9jdXMgcmVzdG9yZXIgaWYgbW9kYWwgd2lsbCBhY3R1YWxseSBnZXQgc2hvd25cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAkdGFyZ2V0Lm9uZShFdmVudC5ISURERU4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCQoX3RoaXMxMCkuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgICAgICBfdGhpczEwLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgTW9kYWwuX2pRdWVyeUludGVyZmFjZS5jYWxsKCQodGFyZ2V0KSwgY29uZmlnLCB0aGlzKTtcbiAgfSk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogalF1ZXJ5XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAkLmZuW05BTUVdID0gTW9kYWwuX2pRdWVyeUludGVyZmFjZTtcbiAgJC5mbltOQU1FXS5Db25zdHJ1Y3RvciA9IE1vZGFsO1xuXG4gICQuZm5bTkFNRV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuW05BTUVdID0gSlFVRVJZX05PX0NPTkZMSUNUO1xuICAgIHJldHVybiBNb2RhbC5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIHJldHVybiBNb2RhbDtcbn0oJCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2RhbC5qcy5tYXAiLCIvLyEgbW9tZW50LmpzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAgIGdsb2JhbC5tb21lbnQgPSBmYWN0b3J5KClcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGhvb2tDYWxsYmFjaztcblxuICAgIGZ1bmN0aW9uIGhvb2tzICgpIHtcbiAgICAgICAgcmV0dXJuIGhvb2tDYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgZG9uZSB0byByZWdpc3RlciB0aGUgbWV0aG9kIGNhbGxlZCB3aXRoIG1vbWVudCgpXG4gICAgLy8gd2l0aG91dCBjcmVhdGluZyBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gICAgZnVuY3Rpb24gc2V0SG9va0NhbGxiYWNrIChjYWxsYmFjaykge1xuICAgICAgICBob29rQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0FycmF
211675KGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIEFycmF5IHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPYmplY3QoaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IHdpbGwgdHJlYXQgdW5kZWZpbmVkIGFuZCBudWxsIGFzIG9iamVjdCBpZiBpdCB3YXNuJ3QgZm9yXG4gICAgICAgIC8vIGlucHV0ICE9IG51bGxcbiAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPYmplY3RFbXB0eShvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoID09PSAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBrO1xuICAgICAgICAgICAgZm9yIChrIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVbmRlZmluZWQoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09PSB2b2lkIDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNOdW1iZXIoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgTnVtYmVyXSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXRlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIERhdGUgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hcChhcnIsIGZuKSB7XG4gICAgICAgIHZhciByZXMgPSBbXSwgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcmVzLnB1c2goZm4oYXJyW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNPd25Qcm9wKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRlbmQoYSwgYikge1xuICAgICAgICBmb3IgKHZhciBpIGluIGIpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGIsIGkpKSB7XG4gICAgICAgICAgICAgICAgYVtpXSA9IGJbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndG9TdHJpbmcnKSkge1xuICAgICAgICAgICAgYS50b1N0cmluZyA9IGIudG9TdHJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndmFsdWVPZicpKSB7XG4gICAgICAgICAgICBhLnZhbHVlT2YgPSBiLnZhbHVlT2Y7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVVEMgKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCB0cnVlKS51dGMoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZhdWx0UGFyc2luZ0ZsYWdzKCkge1xuICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZXAgY2xvbmUgdGhpcyBvYmplY3QuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbXB0eSAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHVudXNlZFRva2VucyAgICA6IFtdLFxuICAgICAgICAgICAgdW51c2VkSW5wdXQgICAgIDogW10sXG4gICAgICAgICAgICBvdmVyZmxvdyAgICAgICAgOiAtMixcbiAgICAgICAgICAgIGNoYXJzTGVmdE92ZXIgICA6IDAsXG4gICAgICAgICAgICBudWxsSW5wdXQgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIGludmFsaWRNb250aCAgICA6IG51bGwsXG4gICAgICAgICAgICBpbnZhbGlkRm9ybWF0ICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHVzZXJJbnZhbGlkYXRlZCA6IGZhbHNlLFxuICAgICAgICAgICAgaXNvICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICBwYXJzZWREYXRlUGFydHMgOiBbXSxcbiAgICAgICAgICAgIG1lcmlkaWVtICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICByZmMyODIyICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHdlZWtkYXlNaXNtYXRjaCA6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2luZ0ZsYWdzKG0pIHtcbiAgICAgICAgaWYgKG0uX3BmID09IG51bGwpIHtcbiAgICAgICAgICAgIG0uX3BmID0gZGVmYXVsdFBhcnNpbmdGbGFncygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtLl9wZjtcbiAgICB9XG5cbiAgICB2YXIgc29tZTtcbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLnNvbWUpIHtcbiAgICAgICAgc29tZSA9IEFycmF5LnByb3RvdHlwZS5zb21lO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNvbWUgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgICAgICAgICB2Y
21167XIgdCA9IE9iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHQgJiYgZnVuLmNhbGwodGhpcywgdFtpXSwgaSwgdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZChtKSB7XG4gICAgICAgIGlmIChtLl9pc1ZhbGlkID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBmbGFncyA9IGdldFBhcnNpbmdGbGFncyhtKTtcbiAgICAgICAgICAgIHZhciBwYXJzZWRQYXJ0cyA9IHNvbWUuY2FsbChmbGFncy5wYXJzZWREYXRlUGFydHMsIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgIT0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIGlzTm93VmFsaWQgPSAhaXNOYU4obS5fZC5nZXRUaW1lKCkpICYmXG4gICAgICAgICAgICAgICAgZmxhZ3Mub3ZlcmZsb3cgPCAwICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmVtcHR5ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRNb250aCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkV2Vla2RheSAmJlxuICAgICAgICAgICAgICAgICFmbGFncy53ZWVrZGF5TWlzbWF0Y2ggJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MubnVsbElucHV0ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRGb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MudXNlckludmFsaWRhdGVkICYmXG4gICAgICAgICAgICAgICAgKCFmbGFncy5tZXJpZGllbSB8fCAoZmxhZ3MubWVyaWRpZW0gJiYgcGFyc2VkUGFydHMpKTtcblxuICAgICAgICAgICAgaWYgKG0uX3N0cmljdCkge1xuICAgICAgICAgICAgICAgIGlzTm93VmFsaWQgPSBpc05vd1ZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmNoYXJzTGVmdE92ZXIgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MudW51c2VkVG9rZW5zLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5iaWdIb3VyID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4gPT0gbnVsbCB8fCAhT2JqZWN0LmlzRnJvemVuKG0pKSB7XG4gICAgICAgICAgICAgICAgbS5faXNWYWxpZCA9IGlzTm93VmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNOb3dWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbS5faXNWYWxpZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkIChmbGFncykge1xuICAgICAgICB2Y
21167XIgbSA9IGNyZWF0ZVVUQyhOYU4pO1xuICAgICAgICBpZiAoZmxhZ3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgZXh0ZW5kKGdldFBhcnNpbmdGbGFncyhtKSwgZmxhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLnVzZXJJbnZhbGlkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICAvLyBQbHVnaW5zIHRoYXQgYWRkIHByb3BlcnRpZXMgc2hvdWxkIGFsc28gYWRkIHRoZSBrZXkgaGVyZSAobnVsbCB2YWx1ZSksXG4gICAgLy8gc28gd2UgY2FuIHByb3Blcmx5IGNsb25lIG91cnNlbHZlcy5cbiAgICB2YXIgbW9tZW50UHJvcGVydGllcyA9IGhvb2tzLm1vbWVudFByb3BlcnRpZXMgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGNvcHlDb25maWcodG8sIGZyb20pIHtcbiAgICAgICAgdmFyIGksIHByb3AsIHZhbDtcblxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzQU1vbWVudE9iamVjdCkpIHtcbiAgICAgICAgICAgIHRvLl9pc0FNb21lbnRPYmplY3QgPSBmcm9tLl9pc0FNb21lbnRPYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pKSkge1xuICAgICAgICAgICAgdG8uX2kgPSBmcm9tLl9pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fZikpIHtcbiAgICAgICAgICAgIHRvLl9mID0gZnJvbS5fZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2wpKSB7XG4gICAgICAgICAgICB0by5fbCA9IGZyb20uX2w7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9zdHJpY3QpKSB7XG4gICAgICAgICAgICB0by5fc3RyaWN0ID0gZnJvbS5fc3RyaWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fdHptKSkge1xuICAgICAgICAgICAgdG8uX3R6bSA9IGZyb20uX3R6bTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzVVRDKSkge1xuICAgICAgICAgICAgdG8uX2lzVVRDID0gZnJvbS5faXNVVEM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9vZmZzZXQpKSB7XG4gICAgICAgICAgICB0by5fb2Zmc2V0ID0gZnJvbS5fb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fcGYpKSB7XG4gICAgICAgICAgICB0by5fcGYgPSBnZXRQYXJzaW5nRmxhZ3MoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sb2NhbGUpKSB7XG4gICAgICAgICAgICB0by5fbG9jYWxlID0gZnJvbS5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vbWVudFByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vbWVudFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcm9wID0gbW9tZW50UHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICB2YWwgPSBmcm9tW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICB0b1twcm9wXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG87XG4gICAgfVxuXG4gICAgdmFyIHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAgIC8vIE1vbWVudCBwcm90b3R5cGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gTW9tZW50KGNvbmZpZykge1xuICAgICAgICBjb3B5Q29uZmlnKHRoaXMsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShjb25maWcuX2QgIT0gbnVsbCA/IGNvbmZpZy5fZC5nZXRUaW1lKCkgOiBOYU4pO1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcmV2ZW50IGluZmluaXRlIGxvb3AgaW4gY2FzZSB1cGRhdGVPZmZzZXQgY3JlYXRlcyBuZXcgbW9tZW50XG4gICAgICAgIC8vIG9iamVjdHMuXG4gICAgICAgIGlmICh1cGRhdGVJblByb2dyZXNzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc01vbWVudCAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBNb21lbnQgfHwgKG9iaiAhPSBudWxsICYmIG9iai5faXNBTW9tZW50T2JqZWN0ICE9IG51bGwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0Zsb29yIChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIC8vIC0wIC0+IDBcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwobnVtYmVyKSB8fCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSW50KGFyZ3VtZW50Rm9yQ29lcmNpb24pIHtcbiAgICAgICAgdmFyIGNvZXJjZWROdW1iZXIgPSArYXJndW1lbnRGb3JDb2VyY2lvbixcbiAgICAgICAgICAgIHZhbHVlID0gMDtcblxuICAgICAgICBpZiAoY29lcmNlZE51bWJlciAhPT0gMCAmJiBpc0Zpbml0ZShjb2VyY2VkTnVtYmVyKSkge1xuICAgICAgICAgICAgdmFsdWUgPSBhYnNGbG9vcihjb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIHR3byBhcnJheXMsIHJldHVybiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVuY2VzXG4gICAgZnVuY3Rpb24gY29tcGFyZUFycmF5cyhhcnJheTEsIGFycmF5MiwgZG9udENvbnZlcnQpIHtcbiAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpLFxuICAgICAgICAgICAgbGVuZ3RoRGlmZiA9IE1hdGguYWJzKGFycmF5MS5sZW5ndGggLSBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgICAgIGRpZmZzID0gMCxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKChkb250Q29udmVydCAmJi
21167BhcnJheTFbaV0gIT09IGFycmF5MltpXSkgfHxcbiAgICAgICAgICAgICAgICAoIWRvbnRDb252ZXJ0ICYmIHRvSW50KGFycmF5MVtpXSkgIT09IHRvSW50KGFycmF5MltpXSkpKSB7XG4gICAgICAgICAgICAgICAgZGlmZnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlmZnMgKyBsZW5ndGhEaWZmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gICAgICAgIGlmIChob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBjb25zb2xlICE9PSAgJ3VuZGVmaW5lZCcpICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdEZXByZWNhdGlvbiB3YXJuaW5nOiAnICsgbXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZShtc2csIGZuKSB7XG4gICAgICAgIHZhciBmaXJzdFRpbWUgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsIG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlyc3RUaW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgYXJnO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyArPSAnXFxuWycgKyBpICsgJ10gJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcgKz0ga2V5ICsgJzogJyArIGFyZ3VtZW50c1swXVtrZXldICsgJywgJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5zbGljZSgwLCAtMik7IC8vIFJlbW92ZSB0cmFpbGluZyBjb21tYSBhbmQgc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2goYXJnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2Fybihtc2cgKyAnXFxuQXJndW1lbnRzOiAnICsgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncykuam9pbignJykgKyAnXFxuJyArIChuZXcgRXJyb3IoKSkuc3RhY2spO1xuICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0sIGZuKTtcbiAgICB9XG5cbiAgICB2YXIgZGVwcmVjYXRpb25zID0ge307XG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGVTaW1wbGUobmFtZSwgbXNnKSB7XG4gICAgICAgIGlmIChob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG5hbWUsIG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZXByZWNhdGlvbnNbbmFtZV0pIHtcbiAgICAgICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPSBmYWxzZTtcbiAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgPSBudWxsO1xuXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldCAoY29uZmlnKSB7XG4gICAgICAgIHZhciBwcm9wLCBpO1xuICAgICAgICBmb3IgKGkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICBwcm9wID0gY29uZmlnW2ldO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24ocHJvcCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2ldID0gcHJvcDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpc1snXycgKyBpXSA9IHByb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICAvLyBMZW5pZW50IG9yZGluYWwgcGFyc2luZyBhY2NlcHRzIGp1c3QgYSBudW1iZXIgaW4gYWRkaXRpb24gdG9cbiAgICAgICAgLy8gbnVtYmVyICsgKHBvc3NpYmx5KSBzdHVmZiBjb21pbmcgZnJvbSBfZGF5T2ZNb250aE9yZGluYWxQYXJzZS5cbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIFwib3JkaW5hbFBhcnNlXCIgZmFsbGJhY2sgaW4gbmV4dCBtYWpvciByZWxlYXNlLlxuICAgICAgICB0aGlzLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAodGhpcy5fZGF5T2ZNb250aE9yZGluYWxQYXJzZS5zb3VyY2UgfHwgdGhpcy5fb3JkaW5hbFBhcnNlLnNvdXJjZSkgK1xuICAgICAgICAgICAgICAgICd8JyArICgvXFxkezEsMn0vKS5zb3VyY2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgIHZhciByZXMgPSBleHRlbmQoe30sIHBhcmVudENvbmZpZyksIHByb3A7XG4gICAgICAgIGZvciAocHJvcCBpbiBjaGlsZENvbmZpZykge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSkgJiYgaXNPYmplY3QoY2hpbGRDb25maWdbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgICAgI
21167HJlc1twcm9wXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBleHRlbmQocmVzW3Byb3BdLCBwYXJlbnRDb25maWdbcHJvcF0pO1xuICAgICAgICAgICAgICAgICAgICBleHRlbmQocmVzW3Byb3BdLCBjaGlsZENvbmZpZ1twcm9wXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZENvbmZpZ1twcm9wXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IGNoaWxkQ29uZmlnW3Byb3BdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAocHJvcCBpbiBwYXJlbnRDb25maWcpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKHBhcmVudENvbmZpZywgcHJvcCkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApICYmXG4gICAgICAgICAgICAgICAgICAgIGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgY2hhbmdlcyB0byBwcm9wZXJ0aWVzIGRvbid0IG1vZGlmeSBwYXJlbnQgY29uZmlnXG4gICAgICAgICAgICAgICAgcmVzW3Byb3BdID0gZXh0ZW5kKHt9LCByZXNbcHJvcF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG9jYWxlKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5cztcblxuICAgIGlmIChPYmplY3Qua2V5cykge1xuICAgICAgICBrZXlzID0gT2JqZWN0LmtleXM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAga2V5cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHZhciBpLCByZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcChvYmosIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRDYWxlbmRhciA9IHtcbiAgICAgICAgc2FtZURheSA6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgbmV4dERheSA6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgbGFzdERheSA6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgIGxhc3RXZWVrIDogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjYWxlbmRhciAoa2V5LCBtb20sIG5vdykge1xuICAgICAgICB2Y
21167XIgb3V0cHV0ID0gdGhpcy5fY2FsZW5kYXJba2V5XSB8fCB0aGlzLl9jYWxlbmRhclsnc2FtZUVsc2UnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob3V0cHV0KSA/IG91dHB1dC5jYWxsKG1vbSwgbm93KSA6IG91dHB1dDtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvbmdEYXRlRm9ybWF0ID0ge1xuICAgICAgICBMVFMgIDogJ2g6bW06c3MgQScsXG4gICAgICAgIExUICAgOiAnaDptbSBBJyxcbiAgICAgICAgTCAgICA6ICdNTS9ERC9ZWVlZJyxcbiAgICAgICAgTEwgICA6ICdNTU1NIEQsIFlZWVknLFxuICAgICAgICBMTEwgIDogJ01NTU0gRCwgWVlZWSBoOm1tIEEnLFxuICAgICAgICBMTExMIDogJ2RkZGQsIE1NTU0gRCwgWVlZWSBoOm1tIEEnXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxvbmdEYXRlRm9ybWF0IChrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0sXG4gICAgICAgICAgICBmb3JtYXRVcHBlciA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleS50b1VwcGVyQ2FzZSgpXTtcblxuICAgICAgICBpZiAoZm9ybWF0IHx8ICFmb3JtYXRVcHBlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0gPSBmb3JtYXRVcHBlci5yZXBsYWNlKC9NTU1NfE1NfEREfGRkZGQvZywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5zbGljZSgxKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRJbnZhbGlkRGF0ZSA9ICdJbnZhbGlkIGRhdGUnO1xuXG4gICAgZnVuY3Rpb24gaW52YWxpZERhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52YWxpZERhdGU7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRPcmRpbmFsID0gJyVkJztcbiAgICB2YXIgZGVmYXVsdERheU9mTW9udGhPcmRpbmFsUGFyc2UgPSAvXFxkezEsMn0vO1xuXG4gICAgZnVuY3Rpb24gb3JkaW5hbCAobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRpbmFsLnJlcGxhY2UoJyVkJywgbnVtYmVyKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFJlbGF0aXZlVGltZSA9IHtcbiAgICAgICAgZnV0dXJlIDogJ2luICVzJyxcbiAgICAgICAgcGFzdCAgIDogJyVzIGFnbycsXG4gICAgICAgIHMgIDogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICBzcyA6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgbSAgOiAnYSBtaW51dGUnLFxuICAgICAgICBtbSA6ICclZCBtaW51dGVzJyxcbiAgICAgICAgaCAgOiAnYW4gaG91cicsXG4gICAgICAgIGhoIDogJyVkIGhvdXJzJyxcbiAgICAgICAgZCAgOiAnYSBkYXknLFxuICAgICAgICBkZCA6ICclZCBkYXlzJyxcbiAgICAgICAgTSAgOiAnYSBtb250aCcsXG4gICAgICAgIE1NIDogJyVkIG1vbnRocycsXG4gICAgICAgIHkgIDogJ2EgeWVhcicsXG4gICAgICAgIHl5IDogJyVkIHllYXJzJ1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWUgKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICB2Y
21167XIgb3V0cHV0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW3N0cmluZ107XG4gICAgICAgIHJldHVybiAoaXNGdW5jdGlvbihvdXRwdXQpKSA/XG4gICAgICAgICAgICBvdXRwdXQobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSA6XG4gICAgICAgICAgICBvdXRwdXQucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXN0RnV0dXJlIChkaWZmLCBvdXRwdXQpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX3JlbGF0aXZlVGltZVtkaWZmID4gMCA/ICdmdXR1cmUnIDogJ3Bhc3QnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oZm9ybWF0KSA/IGZvcm1hdChvdXRwdXQpIDogZm9ybWF0LnJlcGxhY2UoLyVzL2ksIG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIGFsaWFzZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFVuaXRBbGlhcyAodW5pdCwgc2hvcnRoYW5kKSB7XG4gICAgICAgIHZhciBsb3dlckNhc2UgPSB1bml0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGFsaWFzZXNbbG93ZXJDYXNlXSA9IGFsaWFzZXNbbG93ZXJDYXNlICsgJ3MnXSA9IGFsaWFzZXNbc2hvcnRoYW5kXSA9IHVuaXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplVW5pdHModW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB1bml0cyA9PT0gJ3N0cmluZycgPyBhbGlhc2VzW3VuaXRzXSB8fCBhbGlhc2VzW3VuaXRzLnRvTG93ZXJDYXNlKCldIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdFVuaXRzKGlucHV0T2JqZWN0KSB7XG4gICAgICAgIHZhciBub3JtYWxpemVkSW5wdXQgPSB7fSxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wLFxuICAgICAgICAgICAgcHJvcDtcblxuICAgICAgICBmb3IgKHByb3AgaW4gaW5wdXRPYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGlucHV0T2JqZWN0LCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wID0gbm9ybWFsaXplVW5pdHMocHJvcCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRQcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dFtub3JtYWxpemVkUHJvcF0gPSBpbnB1dE9iamVjdFtwcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9ybWFsaXplZElucHV0O1xuICAgIH1cblxuICAgIHZhciBwcmlvcml0aWVzID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRVbml0UHJpb3JpdHkodW5pdCwgcHJpb3JpdHkpIHtcbiAgICAgICAgcHJpb3JpdGllc1t1bml0XSA9IHByaW9yaXR5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFByaW9yaXRpemVkVW5pdHModW5pdHNPYmopIHtcbiAgICAgICAgdmFyIHVuaXRzID0gW107XG4gICAgICAgIGZvciAodmFyIHUgaW4gdW5pdHNPYmopIHtcbiAgICAgICAgICAgIHVuaXRzLnB1c2goe3VuaXQ6IHUsIHByaW9yaXR5OiBwcmlvcml0aWVzW3VdfSk7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuaXRzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHplcm9GaWxsKG51bWJlciwgdGFyZ2V0TGVuZ3RoLCBmb3JjZVNpZ24pIHtcbiAgICAgICAgdmFyIGFic051bWJlciA9ICcnICsgTWF0aC5hYnMobnVtYmVyKSxcbiAgICAgICAgICAgIHplcm9zVG9GaWxsID0gdGFyZ2V0TGVuZ3RoIC0gYWJzTnVtYmVyLmxlbmd0aCxcbiAgICAgICAgICAgIHNpZ24gPSBudW1iZXIgPj0gMDtcbiAgICAgICAgcmV0dXJuIChzaWduID8gKGZvcmNlU2lnbiA/ICcrJyA6ICcnKSA6ICctJykgK1xuICAgICAgICAgICAgTWF0aC5wb3coMTAsIE1hdGgubWF4KDAsIHplcm9zVG9GaWxsKSkudG9TdHJpbmcoKS5zdWJzdHIoMSkgKyBhYnNOdW1iZXI7XG4gICAgfVxuXG4gICAgdmFyIGZvcm1hdHRpbmdUb2tlbnMgPSAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oW0hoXW1tKHNzKT98TW98TU0/TT9NP3xEb3xERERvfEREP0Q/RD98ZGRkP2Q/fGRvP3x3W298d10/fFdbb3xXXT98UW8/fFlZWVlZWXxZWVlZWXxZWVlZfFlZfGdnKGdnZz8pP3xHRyhHR0c/KT98ZXxFfGF8QXxoaD98SEg/fGtrP3xtbT98c3M/fFN7MSw5fXx4fFh8eno/fFpaP3wuKS9nO1xuXG4gICAgdmFyIGxvY2FsRm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhMVFN8TFR8TEw/TD9MP3xsezEsNH0pL2c7XG5cbiAgICB2YXIgZm9ybWF0RnVuY3Rpb25zID0ge307XG5cbiAgICB2YXIgZm9ybWF0VG9rZW5GdW5jdGlvbnMgPSB7fTtcblxuICAgIC8vIHRva2VuOiAgICAnTSdcbiAgICAvLyBwYWRkZWQ6ICAgWydNTScsIDJdXG4gICAgLy8gb3JkaW5hbDogICdNbydcbiAgICAvLyBjYWxsYmFjazogZnVuY3Rpb24gKCkgeyB0aGlzLm1vbnRoKCkgKyAxIH1cbiAgICBmdW5jdGlvbiBhZGRGb3JtYXRUb2tlbiAodG9rZW4sIHBhZGRlZCwgb3JkaW5hbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGJhY2tdKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dID0gZnVuYztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFkZGVkKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1twYWRkZWRbMF1dID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB6ZXJvRmlsbChmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHBhZGRlZFsxXSwgcGFkZGVkWzJdKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9yZGluYWwpIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW29yZGluYWxdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgI
21167HJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5vcmRpbmFsKGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdG9rZW4pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlucHV0Lm1hdGNoKC9cXFtbXFxzXFxTXS8pKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXlxcW3xcXF0kL2csICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxcXC9nLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBmb3JtYXQubWF0Y2goZm9ybWF0dGluZ1Rva2VucyksIGksIGxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtb20pIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSAnJywgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG91dHB1dCArPSBpc0Z1bmN0aW9uKGFycmF5W2ldKSA/IGFycmF5W2ldLmNhbGwobW9tLCBmb3JtYXQpIDogYXJyYXlbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIGZvcm1hdCBkYXRlIHVzaW5nIG5hdGl2ZSBkYXRlIG9iamVjdFxuICAgIGZ1bmN0aW9uIGZvcm1hdE1vbWVudChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG0ubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXQgPSBleHBhbmRGb3JtYXQoZm9ybWF0LCBtLmxvY2FsZURhdGEoKSk7XG4gICAgICAgIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdID0gZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gfHwgbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdKG0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4cGFuZEZvcm1hdChmb3JtYXQsIGxvY2FsZSkge1xuICAgICAgICB2Y
21167XIgaSA9IDU7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLmxvbmdEYXRlRm9ybWF0KGlucHV0KSB8fCBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAoaSA+PSAwICYmIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKGxvY2FsRm9ybWF0dGluZ1Rva2VucywgcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKTtcbiAgICAgICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2gxICAgICAgICAgPSAvXFxkLzsgICAgICAgICAgICAvLyAgICAgICAwIC0gOVxuICAgIHZhciBtYXRjaDIgICAgICAgICA9IC9cXGRcXGQvOyAgICAgICAgICAvLyAgICAgIDAwIC0gOTlcbiAgICB2YXIgbWF0Y2gzICAgICAgICAgPSAvXFxkezN9LzsgICAgICAgICAvLyAgICAgMDAwIC0gOTk5XG4gICAgdmFyIG1hdGNoNCAgICAgICAgID0gL1xcZHs0fS87ICAgICAgICAgLy8gICAgMDAwMCAtIDk5OTlcbiAgICB2YXIgbWF0Y2g2ICAgICAgICAgPSAvWystXT9cXGR7Nn0vOyAgICAvLyAtOTk5OTk5IC0gOTk5OTk5XG4gICAgdmFyIG1hdGNoMXRvMiAgICAgID0gL1xcZFxcZD8vOyAgICAgICAgIC8vICAgICAgIDAgLSA5OVxuICAgIHZhciBtYXRjaDN0bzQgICAgICA9IC9cXGRcXGRcXGRcXGQ/LzsgICAgIC8vICAgICA5OTkgLSA5OTk5XG4gICAgdmFyIG1hdGNoNXRvNiAgICAgID0gL1xcZFxcZFxcZFxcZFxcZFxcZD8vOyAvLyAgIDk5OTk5IC0gOTk5OTk5XG4gICAgdmFyIG1hdGNoMXRvMyAgICAgID0gL1xcZHsxLDN9LzsgICAgICAgLy8gICAgICAgMCAtIDk5OVxuICAgIHZhciBtYXRjaDF0bzQgICAgICA9IC9cXGR7MSw0fS87ICAgICAgIC8vICAgICAgIDAgLSA5OTk5XG4gICAgdmFyIG1hdGNoMXRvNiAgICAgID0gL1srLV0/XFxkezEsNn0vOyAgLy8gLTk5OTk5OSAtIDk5OTk5OVxuXG4gICAgdmFyIG1hdGNoVW5zaWduZWQgID0gL1xcZCsvOyAgICAgICAgICAgLy8gICAgICAgMCAtIGluZlxuICAgIHZhciBtYXRjaFNpZ25lZCAgICA9IC9bKy1dP1xcZCsvOyAgICAgIC8vICAgIC1pbmYgLSBpbmZcblxuICAgIHZhciBtYXRjaE9mZnNldCAgICA9IC9afFsrLV1cXGRcXGQ6P1xcZFxcZC9naTsgLy8gKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG4gICAgdmFyIG1hdGNoU2hvcnRPZmZzZXQgPSAvWnxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy9naTsgLy8gKzAwIC0wMCArMDA6MDAgLTAwOjAwICswMDAwIC0wMDAwIG9yIFpcblxuICAgI
21167HZhciBtYXRjaFRpbWVzdGFtcCA9IC9bKy1dP1xcZCsoXFwuXFxkezEsM30pPy87IC8vIDEyMzQ1Njc4OSAxMjM0NTY3ODkuMTIzXG5cbiAgICAvLyBhbnkgd29yZCAob3IgdHdvKSBjaGFyYWN0ZXJzIG9yIG51bWJlcnMgaW5jbHVkaW5nIHR3by90aHJlZSB3b3JkIG1vbnRoIGluIGFyYWJpYy5cbiAgICAvLyBpbmNsdWRlcyBzY290dGlzaCBnYWVsaWMgdHdvIHdvcmQgYW5kIGh5cGhlbmF0ZWQgbW9udGhzXG4gICAgdmFyIG1hdGNoV29yZCA9IC9bMC05XXswLDI1Nn1bJ2EtelxcdTAwQTAtXFx1MDVGRlxcdTA3MDAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkYwN1xcdUZGMTAtXFx1RkZFRl17MSwyNTZ9fFtcXHUwNjAwLVxcdTA2RkZcXC9dezEsMjU2fShcXHMqP1tcXHUwNjAwLVxcdTA2RkZdezEsMjU2fSl7MSwyfS9pO1xuXG4gICAgdmFyIHJlZ2V4ZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFJlZ2V4VG9rZW4gKHRva2VuLCByZWdleCwgc3RyaWN0UmVnZXgpIHtcbiAgICAgICAgcmVnZXhlc1t0b2tlbl0gPSBpc0Z1bmN0aW9uKHJlZ2V4KSA/IHJlZ2V4IDogZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGVEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gKGlzU3RyaWN0ICYmIHN0cmljdFJlZ2V4KSA/IHN0cmljdFJlZ2V4IDogcmVnZXg7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2VSZWdleEZvclRva2VuICh0b2tlbiwgY29uZmlnKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcChyZWdleGVzLCB0b2tlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHVuZXNjYXBlRm9ybWF0KHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVnZXhlc1t0b2tlbl0oY29uZmlnLl9zdHJpY3QsIGNvbmZpZy5fbG9jYWxlKTtcbiAgICB9XG5cbiAgICAvLyBDb2RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTYxNDkzL2lzLXRoZXJlLWEtcmVnZXhwLWVzY2FwZS1mdW5jdGlvbi1pbi1qYXZhc2NyaXB0XG4gICAgZnVuY3Rpb24gdW5lc2NhcGVGb3JtYXQocykge1xuICAgICAgICByZXR1cm4gcmVnZXhFc2NhcGUocy5yZXBsYWNlKCdcXFxcJywgJycpLnJlcGxhY2UoL1xcXFwoXFxbKXxcXFxcKFxcXSl8XFxbKFteXFxdXFxbXSopXFxdfFxcXFwoLikvZywgZnVuY3Rpb24gKG1hdGNoZWQsIHAxLCBwMiwgcDMsIHA0KSB7XG4gICAgICAgICAgICByZXR1cm4gcDEgfHwgcDIgfHwgcDMgfHwgcDQ7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWdleEVzY2FwZShzKSB7XG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xuICAgIH1cblxuICAgIHZhciB0b2tlbnMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFBhcnNlVG9rZW4gKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICB2Y
21167XIgaSwgZnVuYyA9IGNhbGxiYWNrO1xuICAgICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdG9rZW4gPSBbdG9rZW5dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc051bWJlcihjYWxsYmFjaykpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbY2FsbGJhY2tdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRva2Vuc1t0b2tlbltpXV0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkV2Vla1BhcnNlVG9rZW4gKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICBhZGRQYXJzZVRva2VuKHRva2VuLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICBjb25maWcuX3cgPSBjb25maWcuX3cgfHwge307XG4gICAgICAgICAgICBjYWxsYmFjayhpbnB1dCwgY29uZmlnLl93LCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIGlucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaGFzT3duUHJvcCh0b2tlbnMsIHRva2VuKSkge1xuICAgICAgICAgICAgdG9rZW5zW3Rva2VuXShpbnB1dCwgY29uZmlnLl9hLCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBZRUFSID0gMDtcbiAgICB2YXIgTU9OVEggPSAxO1xuICAgIHZhciBEQVRFID0gMjtcbiAgICB2YXIgSE9VUiA9IDM7XG4gICAgdmFyIE1JTlVURSA9IDQ7XG4gICAgdmFyIFNFQ09ORCA9IDU7XG4gICAgdmFyIE1JTExJU0VDT05EID0gNjtcbiAgICB2YXIgV0VFSyA9IDc7XG4gICAgdmFyIFdFRUtEQVkgPSA4O1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1knLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55ZWFyKCk7XG4gICAgICAgIHJldHVybiB5IDw9IDk5OTkgPyAnJyArIHkgOiAnKycgKyB5O1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWScsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnllYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWScsICAgNF0sICAgICAgIDAsICd5ZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZWScsICA1XSwgICAgICAgMCwgJ3llYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVlZWScsIDYsIHRydWVdLCAwLCAneWVhcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd5ZWFyJywgJ3knKTtcblxuICAgIC8vIFBSSU9SSVRJRVNcblxuICAgIGFkZFVuaXRQcmlvcml0eSgneWVhcicsIDEpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignWScsICAgICAgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZJywgICAgIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdZWVlZJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVknLCAgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVlZWScsIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydZWVlZWScsICdZWVlZWVknXSwgWUVBUik7XG4gICAgYWRkUGFyc2VUb2tlbignWVlZWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPSBpbnB1dC5sZW5ndGggPT09IDIgPyBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCkgOiB0b0ludChpbnB1dCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignWVknLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1knLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICAgICAgICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgICAgICAgcmV0dXJuICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB8fCB5ZWFyICUgNDAwID09PSAwO1xuICAgIH1cblxuICAgIC8vIEhPT0tTXG5cbiAgICBob29rcy5wYXJzZVR3b0RpZ2l0WWVhciA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gdG9JbnQoaW5wdXQpICsgKHRvSW50KGlucHV0KSA+IDY4ID8gMTkwMCA6IDIwMDApO1xuICAgIH07XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0WWVhciA9IG1ha2VHZXRTZXQoJ0Z1bGxZZWFyJywgdHJ1ZSk7XG5cbiAgICBmdW5jdGlvbiBnZXRJc0xlYXBZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXRTZXQgKHVuaXQsIGtlZXBUaW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2V0JDEodGhpcywgdW5pdCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCBrZWVwVGltZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXQodGhpcywgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0IChtb20sIHVuaXQpIHtcbiAgICAgICAgcmV0dXJuIG1vbS5pc1ZhbGlkKCkgP1xuICAgICAgICAgICAgbW9tLl9kWydnZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKCkgOiBOYU47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0JDEgKG1vbSwgdW5pdCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKG1vbS5pc1ZhbGlkKCkgJiYgIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdGdWxsWWVhcicgJiYgaXNMZWFwWWVhcihtb20ueWVhcigpKSAmJiBtb20ubW9udGgoKSA9PT0gMSAmJi
21167Btb20uZGF0ZSgpID09PSAyOSkge1xuICAgICAgICAgICAgICAgIG1vbS5fZFsnc2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyB1bml0XSh2YWx1ZSwgbW9tLm1vbnRoKCksIGRheXNJbk1vbnRoKHZhbHVlLCBtb20ubW9udGgoKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIHN0cmluZ0dldCAodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXNbdW5pdHNdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBzdHJpbmdTZXQgKHVuaXRzLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHVuaXRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVPYmplY3RVbml0cyh1bml0cyk7XG4gICAgICAgICAgICB2YXIgcHJpb3JpdGl6ZWQgPSBnZXRQcmlvcml0aXplZFVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJpb3JpdGl6ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzW3ByaW9yaXRpemVkW2ldLnVuaXRdKHVuaXRzW3ByaW9yaXRpemVkW2ldLnVuaXRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpc1t1bml0c10pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb2QobiwgeCkge1xuICAgICAgICByZXR1cm4gKChuICUgeCkgKyB4KSAlIHg7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4T2Y7XG5cbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHtcbiAgICAgICAgaW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4T2YgPSBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgLy8gSSBrbm93XG4gICAgICAgICAgICB2Y
21167XIgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbaV0gPT09IG8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICAgIGlmIChpc05hTih5ZWFyKSB8fCBpc05hTihtb250aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1vZE1vbnRoID0gbW9kKG1vbnRoLCAxMik7XG4gICAgICAgIHllYXIgKz0gKG1vbnRoIC0gbW9kTW9udGgpIC8gMTI7XG4gICAgICAgIHJldHVybiBtb2RNb250aCA9PT0gMSA/IChpc0xlYXBZZWFyKHllYXIpID8gMjkgOiAyOCkgOiAoMzEgLSBtb2RNb250aCAlIDcgJSAyKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignTScsIFsnTU0nLCAyXSwgJ01vJywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb250aCgpICsgMTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ01NTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnbW9udGgnLCAnTScpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnbW9udGgnLCA4KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ00nLCAgICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NJywgICBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NJywgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NTScsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ00nLCAnTU0nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSB0b0ludChpbnB1dCkgLSAxO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ01NTScsICdNTU1NJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgdmFyIG1vbnRoID0gY29uZmlnLl9sb2NhbGUubW9udGhzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIGEgbW9udGggbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkLlxuICAgICAgICBpZiAobW9udGggIT0gbnVsbCkge1xuICAgICAgICAgICAgYXJyYXlbTU9OVEhdID0gbW9udGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkTW9udGggPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgdmFyIE1PTlRIU19JTl9GT1JNQVQgPSAvRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NPy87XG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNb250aHMgPSAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHMgKG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocykgPyB0aGlzLl9tb250aHMgOlxuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1snc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocykgPyB0aGlzLl9tb250aHNbbS5tb250aCgpXSA6XG4gICAgICAgICAgICB0aGlzLl9tb250aHNbKHRoaXMuX21vbnRocy5pc0Zvcm1hdCB8fCBNT05USFNfSU5fRk9STUFUKS50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ11bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0ID0gJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpO1xuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1Nob3J0IChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydCkgPyB0aGlzLl9tb250aHNTaG9ydCA6XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRbJ3N0YW5kYWxvbmUnXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydCkgPyB0aGlzLl9tb250aHNTaG9ydFttLm1vbnRoKCldIDpcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0W01PTlRIU19JTl9GT1JNQVQudGVzdChmb3JtYXQpID8gJ2Zvcm1hdCcgOiAnc3RhbmRhbG9uZSddW20ubW9udGgoKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2Y
21167XIgaSwgaWksIG1vbSwgbGxjID0gbW9udGhOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHVzZWRcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgKytpKSB7XG4gICAgICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0gPSB0aGlzLm1vbnRocyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHNQYXJzZSAobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2Y
21167XIgaSwgbW9tLCByZWdleDtcblxuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlLmNhbGwodGhpcywgbW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBhZGQgc29ydGluZ1xuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyXG4gICAgICAgIC8vIHNlZSBzb3J0aW5nIGluIGNvbXB1dGVNb250aHNQYXJzZVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnJykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXN0cmljdCAmJiAhdGhpcy5fbW9udGhzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICByZWdleCA9ICdeJyArIHRoaXMubW9udGhzKG1vbSwgJycpICsgJ3xeJyArIHRoaXMubW9udGhzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdNTU1NJyAmJiB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdNTU0nICYmIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fbW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBzZXRNb250aCAobW9tLCB2YWx1ZSkge1xuICAgICAgICB2Y
21167XIgZGF5T2ZNb250aDtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdG9JbnQodmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbS5sb2NhbGVEYXRhKCkubW9udGhzUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEFub3RoZXIgc2lsZW50IGZhaWx1cmU/XG4gICAgICAgICAgICAgICAgaWYgKCFpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkYXlPZk1vbnRoID0gTWF0aC5taW4obW9tLmRhdGUoKSwgZGF5c0luTW9udGgobW9tLnllYXIoKSwgdmFsdWUpKTtcbiAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArICdNb250aCddKHZhbHVlLCBkYXlPZk1vbnRoKTtcbiAgICAgICAgcmV0dXJuIG1vbTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRNb250aCAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCAnTW9udGgnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERheXNJbk1vbnRoICgpIHtcbiAgICAgICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TW9udGhzU2hvcnRSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiBtb250aHNTaG9ydFJlZ2V4IChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzU2hvcnRSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IGRlZmF1bHRNb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggJiYgaXNTdHJpY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggOiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRNb250aHNSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiBtb250aHNSZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlTW9udGhzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1JlZ2V4ID0gZGVmYXVsdE1vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNTdHJpY3RSZWdleCA6IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZU1vbnRoc1BhcnNlICgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNob3J0UGllY2VzID0gW10sIGxvbmdQaWVjZXMgPSBbXSwgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksIG1vbTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICBzaG9ydFBpZWNlcy5wdXNoKHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykpO1xuICAgICAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKHRoaXMubW9udGhzKG1vbSwgJycpKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2godGhpcy5tb250aHMobW9tLCAnJykpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaCh0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgc2hvcnRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShzaG9ydFBpZWNlc1tpXSk7XG4gICAgICAgICAgICBsb25nUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobG9uZ1BpZWNlc1tpXSk7XG4gICAgICAgI
21167H1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICAgICAgICAgIG1peGVkUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobWl4ZWRQaWVjZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX21vbnRoc1Nob3J0UmVnZXggPSB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBsb25nUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVEYXRlICh5LCBtLCBkLCBoLCBNLCBzLCBtcykge1xuICAgICAgICAvLyBjYW4ndCBqdXN0IGFwcGx5KCkgdG8gY3JlYXRlIGEgZGF0ZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzE4MTM0OFxuICAgICAgICB2YXIgZGF0ZTtcbiAgICAgICAgLy8gdGhlIGRhdGUgY29uc3RydWN0b3IgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh5ICsgNDAwLCBtLCBkLCBoLCBNLCBzLCBtcyk7XG4gICAgICAgICAgICBpZiAoaXNGaW5pdGUoZGF0ZS5nZXRGdWxsWWVhcigpKSkge1xuICAgICAgICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlVVRDRGF0ZSAoeSkge1xuICAgICAgICB2Y
21167XIgZGF0ZTtcbiAgICAgICAgLy8gdGhlIERhdGUuVVRDIGZ1bmN0aW9uIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIC8vIHByZXNlcnZlIGxlYXAgeWVhcnMgdXNpbmcgYSBmdWxsIDQwMCB5ZWFyIGN5Y2xlLCB0aGVuIHJlc2V0XG4gICAgICAgICAgICBhcmdzWzBdID0geSArIDQwMDtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLCBhcmdzKSk7XG4gICAgICAgICAgICBpZiAoaXNGaW5pdGUoZGF0ZS5nZXRVVENGdWxsWWVhcigpKSkge1xuICAgICAgICAgICAgICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICAvLyBzdGFydC1vZi1maXJzdC13ZWVrIC0gc3RhcnQtb2YteWVhclxuICAgIGZ1bmN0aW9uIGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgLy8gZmlyc3Qtd2VlayBkYXkgLS0gd2hpY2ggamFudWFyeSBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgKDQgZm9yIGlzbywgMSBmb3Igb3RoZXIpXG4gICAgICAgICAgICBmd2QgPSA3ICsgZG93IC0gZG95LFxuICAgICAgICAgICAgLy8gZmlyc3Qtd2VlayBkYXkgbG9jYWwgd2Vla2RheSAtLSB3aGljaCBsb2NhbCB3ZWVrZGF5IGlzIGZ3ZFxuICAgICAgICAgICAgZndkbHcgPSAoNyArIGNyZWF0ZVVUQ0RhdGUoeWVhciwgMCwgZndkKS5nZXRVVENEYXkoKSAtIGRvdykgJSA3O1xuXG4gICAgICAgIHJldHVybiAtZndkbHcgKyBmd2QgLSAxO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGUjQ2FsY3VsYXRpbmdfYV9kYXRlX2dpdmVuX3RoZV95ZWFyLjJDX3dlZWtfbnVtYmVyX2FuZF93ZWVrZGF5XG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtzKHllYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciBsb2NhbFdlZWtkYXkgPSAoNyArIHdlZWtkYXkgLSBkb3cpICUgNyxcbiAgICAgICAgICAgIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpLFxuICAgICAgICAgICAgZGF5T2ZZZWFyID0gMSArIDcgKiAod2VlayAtIDEpICsgbG9jYWxXZWVrZGF5ICsgd2Vla09mZnNldCxcbiAgICAgICAgICAgIHJlc1llYXIsIHJlc0RheU9mWWVhcjtcblxuICAgICAgICBpZiAoZGF5T2ZZZWFyIDw9IDApIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyIC0gMTtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheXNJblllYXIocmVzWWVhcikgKyBkYXlPZlllYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyKSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXIgKyAxO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyIC0gZGF5c0luWWVhcih5ZWFyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXI6IHJlc1llYXIsXG4gICAgICAgICAgICBkYXlPZlllYXI6IHJlc0RheU9mWWVhclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtPZlllYXIobW9tLCBkb3csIGRveSkge1xuICAgICAgICB2Y
21167XIgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldChtb20ueWVhcigpLCBkb3csIGRveSksXG4gICAgICAgICAgICB3ZWVrID0gTWF0aC5mbG9vcigobW9tLmRheU9mWWVhcigpIC0gd2Vla09mZnNldCAtIDEpIC8gNykgKyAxLFxuICAgICAgICAgICAgcmVzV2VlaywgcmVzWWVhcjtcblxuICAgICAgICBpZiAod2VlayA8IDEpIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpIC0gMTtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrICsgd2Vla3NJblllYXIocmVzWWVhciwgZG93LCBkb3kpO1xuICAgICAgICB9IGVsc2UgaWYgKHdlZWsgPiB3ZWVrc0luWWVhcihtb20ueWVhcigpLCBkb3csIGRveSkpIHtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrIC0gd2Vla3NJblllYXIobW9tLnllYXIoKSwgZG93LCBkb3kpO1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCkgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCk7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3ZWVrOiByZXNXZWVrLFxuICAgICAgICAgICAgeWVhcjogcmVzWWVhclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtzSW5ZZWFyKHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgICAgIHdlZWtPZmZzZXROZXh0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIgKyAxLCBkb3csIGRveSk7XG4gICAgICAgIHJldHVybiAoZGF5c0luWWVhcih5ZWFyKSAtIHdlZWtPZmZzZXQgKyB3ZWVrT2Zmc2V0TmV4dCkgLyA3O1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCd3JywgWyd3dycsIDJdLCAnd28nLCAnd2VlaycpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdXJywgWydXVycsIDJdLCAnV28nLCAnaXNvV2VlaycpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd3ZWVrJywgJ3cnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWsnLCAnVycpO1xuXG4gICAgLy8gUFJJT1JJVElFU1xuXG4gICAgYWRkVW5pdFByaW9yaXR5KCd3ZWVrJywgNSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrJywgNSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCd3JywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignd3cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignVycsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1dXJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWyd3JywgJ3d3JywgJ1cnLCAnV1cnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW4uc3Vic3RyKDAsIDEpXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIExPQ0FMRVNcblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWsgKG1vbSkge1xuICAgICAgICByZXR1cm4gd2Vla09mWWVhcihtb20sIHRoaXMuX3dlZWsuZG93LCB0aGlzLl93ZWVrLmRveSkud2VlaztcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZVdlZWsgPSB7XG4gICAgICAgIGRvdyA6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICBkb3kgOiA2ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZUZpcnN0RGF5T2ZXZWVrICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG93O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZUZpcnN0RGF5T2ZZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG95O1xuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWsgKGlucHV0KSB7XG4gICAgICAgIHZhciB3ZWVrID0gdGhpcy5sb2NhbGVEYXRhKCkud2Vlayh0aGlzKTtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT1dlZWsgKGlucHV0KSB7XG4gICAgICAgIHZhciB3ZWVrID0gd2Vla09mWWVhcih0aGlzLCAxLCA0KS53ZWVrO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2QnLCAwLCAnZG8nLCAnZGF5Jyk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c01pbih0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzU2hvcnQodGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZGRkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdlJywgMCwgMCwgJ3dlZWtkYXknKTtcbiAgICBhZGRGb3JtYXRUb2tlbignRScsIDAsIDAsICdpc29XZWVrZGF5Jyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2RheScsICdkJyk7XG4gICAgYWRkVW5pdEFsaWFzKCd3ZWVrZGF5JywgJ2UnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWtkYXknLCAnRScpO1xuXG4gICAgLy8gUFJJT1JJVFlcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2RheScsIDExKTtcbiAgICBhZGRVbml0UHJpb3JpdHkoJ3dlZWtkYXknLCAxMSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrZGF5JywgMTEpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignZCcsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZScsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignRScsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZGQnLCAgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgI
21167HJldHVybiBsb2NhbGUud2Vla2RheXNNaW5SZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkJywgICBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkZCcsICAgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZGQnLCAnZGRkJywgJ2RkZGQnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciB3ZWVrZGF5ID0gY29uZmlnLl9sb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgLy8gaWYgd2UgZGlkbid0IGdldCBhIHdlZWtkYXkgbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkXG4gICAgICAgIGlmICh3ZWVrZGF5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdlZWsuZCA9IHdlZWtkYXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkV2Vla2RheSA9IGlucHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2QnLCAnZScsICdFJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIHBhcnNlV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmFOKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dCA9IGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQpICUgNyB8fCA3O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc05hTihpbnB1dCkgPyBudWxsIDogaW5wdXQ7XG4gICAgfVxuXG4gICAgLy8gTE9DQUxFU1xuICAgIGZ1bmN0aW9uIHNoaWZ0V2Vla2RheXMgKHdzLCBuKSB7XG4gICAgICAgIHJldHVybiB3cy5zbGljZShuLCA3KS5jb25jYXQod3Muc2xpY2UoMCwgbikpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXMgPSAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXMgKG0sIGZvcm1hdCkge1xuICAgICAgICB2Y
21167XIgd2Vla2RheXMgPSBpc0FycmF5KHRoaXMuX3dlZWtkYXlzKSA/IHRoaXMuX3dlZWtkYXlzIDpcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzWyhtICYmIG0gIT09IHRydWUgJiYgdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdChmb3JtYXQpKSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXTtcbiAgICAgICAgcmV0dXJuIChtID09PSB0cnVlKSA/IHNoaWZ0V2Vla2RheXMod2Vla2RheXMsIHRoaXMuX3dlZWsuZG93KVxuICAgICAgICAgICAgOiAobSkgPyB3ZWVrZGF5c1ttLmRheSgpXSA6IHdlZWtkYXlzO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCA9ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNTaG9ydCAobSkge1xuICAgICAgICByZXR1cm4gKG0gPT09IHRydWUpID8gc2hpZnRXZWVrZGF5cyh0aGlzLl93ZWVrZGF5c1Nob3J0LCB0aGlzLl93ZWVrLmRvdylcbiAgICAgICAgICAgIDogKG0pID8gdGhpcy5fd2Vla2RheXNTaG9ydFttLmRheSgpXSA6IHRoaXMuX3dlZWtkYXlzU2hvcnQ7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrZGF5c01pbiA9ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c01pbiAobSkge1xuICAgICAgICByZXR1cm4gKG0gPT09IHRydWUpID8gc2hpZnRXZWVrZGF5cyh0aGlzLl93ZWVrZGF5c01pbiwgdGhpcy5fd2Vlay5kb3cpXG4gICAgICAgICAgICA6IChtKSA/IHRoaXMuX3dlZWtkYXlzTWluW20uZGF5KCldIDogdGhpcy5fd2Vla2RheXNNaW47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UkMSh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIGlpLCBtb20sIGxsYyA9IHdlZWtkYXlOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5cyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdkZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNQYXJzZSAod2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgI
21167HZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVTdHJpY3RQYXJzZSQxLmNhbGwodGhpcywgd2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG5cbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXMobW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcXFwuPycpICsgJyQnLCAnaScpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ14nICsgdGhpcy53ZWVrZGF5cyhtb20sICcnKSArICd8XicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykgKyAnfF4nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChyZWdleC5yZXBsYWNlKCcuJywgJycpLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgZm9ybWF0ID09PSAnZGRkZCcgJiYgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ2RkZCcgJiYgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdkZCcgJiYgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyaWN0ICYmIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldERheU9mV2VlayAoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXkgPSB0aGlzLl9pc1VUQyA/IHRoaXMuX2QuZ2V0VVRDRGF5KCkgOiB0aGlzLl9kLmdldERheSgpO1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaW5wdXQgPSBwYXJzZVdlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZChpbnB1dCAtIGRheSwgJ2QnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkYXk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRMb2NhbGVEYXlPZldlZWsgKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2Y
21167XIgd2Vla2RheSA9ICh0aGlzLmRheSgpICsgNyAtIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdykgJSA3O1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWtkYXkgOiB0aGlzLmFkZChpbnB1dCAtIHdlZWtkYXksICdkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPRGF5T2ZXZWVrIChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBiZWhhdmVzIHRoZSBzYW1lIGFzIG1vbWVudCNkYXkgZXhjZXB0XG4gICAgICAgIC8vIGFzIGEgZ2V0dGVyLCByZXR1cm5zIDcgaW5zdGVhZCBvZiAwICgxLTcgcmFuZ2UgaW5zdGVhZCBvZiAwLTYpXG4gICAgICAgIC8vIGFzIGEgc2V0dGVyLCBzdW5kYXkgc2hvdWxkIGJlbG9uZyB0byB0aGUgcHJldmlvdXMgd2Vlay5cblxuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHdlZWtkYXkgPSBwYXJzZUlzb1dlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSh0aGlzLmRheSgpICUgNyA/IHdlZWtkYXkgOiB3ZWVrZGF5IC0gNyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXkoKSB8fCA3O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRXZWVrZGF5c1JlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIHdlZWtkYXlzUmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCA6IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiB3ZWVrZGF5c1Nob3J0UmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNTaG9ydFJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXggPSBkZWZhdWx0V2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4IDogdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRXZWVrZGF5c01pblJlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIHdlZWtkYXlzTWluUmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c01pblJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c01pblJlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCA6IHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVXZWVrZGF5c1BhcnNlICgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1pblBpZWNlcyA9IFtdLCBzaG9ydFBpZWNlcyA9IFtdLCBsb25nUGllY2VzID0gW10sIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLCBtb20sIG1pbnAsIHNob3J0cCwgbG9uZ3A7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgbWlucCA9IHRoaXMud2Vla2RheXNNaW4obW9tLCAnJyk7XG4gICAgICAgICAgICBzaG9ydHAgPSB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICBsb25ncCA9IHRoaXMud2Vla2RheXMobW9tLCAnJyk7XG4gICAgICAgICAgICBtaW5QaWVjZXMucHVzaChtaW5wKTtcbiAgICAgICAgICAgI
21167HNob3J0UGllY2VzLnB1c2goc2hvcnRwKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKG1pbnApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChzaG9ydHApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSB3ZWVrZGF5IChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgbWluUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBzaG9ydFBpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKHNob3J0UGllY2VzW2ldKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXNbaV0gPSByZWdleEVzY2FwZShsb25nUGllY2VzW2ldKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobWl4ZWRQaWVjZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5SZWdleCA9IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIGxvbmdQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBzaG9ydFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaW5QaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIGhGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCkgJSAxMiB8fCAxMjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBrRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpIHx8IDI0O1xuICAgIH1cblxuICAgIGFkZEZvcm1hdFRva2VuKCdIJywgWydISCcsIDJdLCAwLCAnaG91cicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdoJywgWydoaCcsIDJdLCAwLCBoRm9ybWF0KTtcbiAgICBhZGRGb3JtYXRUb2tlbignaycsIFsna2snLCAyXSwgMCwga0Zvcm1hdCk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignaG1tJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW0nLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIHRoaXMuaG91cnMoKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW1zcycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdGhpcy5ob3VycygpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtICh0b2tlbiwgbG93ZXJjYXNlKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubWVyaWRpZW0odGhpcy5ob3VycygpLCB0aGlzLm1pbnV0ZXMoKSwgbG93ZXJjYXNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVyaWRpZW0oJ2EnLCB0cnVlKTtcbiAgICBtZXJpZGllbSgnQScsIGZhbHNlKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnaG91cicsICdoJyk7XG5cbiAgICAvLyBQUklPUklUWVxuICAgIGFkZFVuaXRQcmlvcml0eSgnaG91cicsIDEzKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGZ1bmN0aW9uIG1hdGNoTWVyaWRpZW0gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5fbWVyaWRpZW1QYXJzZTtcbiAgICB9XG5cbiAgICBhZGRSZWdleFRva2VuKCdhJywgIG1hdGNoTWVyaWRpZW0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0EnLCAgbWF0Y2hNZXJpZGllbSk7XG4gICAgYWRkUmVnZXhUb2tlbignSCcsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2gnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdrJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignSEgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignaGgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbigna2snLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5cbiAgICBhZGRSZWdleFRva2VuKCdobW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2htbXNzJywgbWF0Y2g1dG82KTtcbiAgICBhZGRSZWdleFRva2VuKCdIbW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0htbXNzJywgbWF0Y2g1dG82KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydIJywgJ0hIJ10sIEhPVVIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydrJywgJ2trJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2Y
21167XIga0lucHV0ID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBhcnJheVtIT1VSXSA9IGtJbnB1dCA9PT0gMjQgPyAwIDoga0lucHV0O1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oWydhJywgJ0EnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5faXNQbSA9IGNvbmZpZy5fbG9jYWxlLmlzUE0oaW5wdXQpO1xuICAgICAgICBjb25maWcuX21lcmlkaWVtID0gaW5wdXQ7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2gnLCAnaGgnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW0nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvcyA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvcykpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW1zcycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zMSA9IGlucHV0Lmxlbmd0aCAtIDQ7XG4gICAgICAgIHZhciBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zMSkpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczEsIDIpKTtcbiAgICAgICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2Y
21167XIgcG9zID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignSG1tc3MnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0O1xuICAgICAgICB2YXIgcG9zMiA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvczEpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgICAgIGFycmF5W1NFQ09ORF0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMikpO1xuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlSXNQTSAoaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IFF1aXJrcyBNb2RlICYgSUU3IFN0YW5kYXJkcyBNb2RlIGRvIG5vdCBhbGxvdyBhY2Nlc3Npbmcgc3RyaW5ncyBsaWtlIGFycmF5c1xuICAgICAgICAvLyBVc2luZyBjaGFyQXQgc2hvdWxkIGJlIG1vcmUgY29tcGF0aWJsZS5cbiAgICAgICAgcmV0dXJuICgoaW5wdXQgKyAnJykudG9Mb3dlckNhc2UoKS5jaGFyQXQoMCkgPT09ICdwJyk7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlID0gL1thcF1cXC4/bT9cXC4/L2k7XG4gICAgZnVuY3Rpb24gbG9jYWxlTWVyaWRpZW0gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwbScgOiAnUE0nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnYW0nIDogJ0FNJztcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgLy8gU2V0dGluZyB0aGUgaG91ciBzaG91bGQga2VlcCB0aGUgdGltZSwgYmVjYXVzZSB0aGUgdXNlciBleHBsaWNpdGx5XG4gICAgLy8gc3BlY2lmaWVkIHdoaWNoIGhvdXIgdGhleSB3YW50LiBTbyB0cnlpbmcgdG8gbWFpbnRhaW4gdGhlIHNhbWUgaG91ciAoaW5cbiAgICAvLyBhIG5ldyB0aW1lem9uZSkgbWFrZXMgc2Vuc2UuIEFkZGluZy9zdWJ0cmFjdGluZyBob3VycyBkb2VzIG5vdCBmb2xsb3dcbiAgICAvLyB0aGlzIHJ1bGUuXG4gICAgdmFyIGdldFNldEhvdXIgPSBtYWtlR2V0U2V0KCdIb3VycycsIHRydWUpO1xuXG4gICAgdmFyIGJhc2VDb25maWcgPSB7XG4gICAgICAgIGNhbGVuZGFyOiBkZWZhdWx0Q2FsZW5kYXIsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQsXG4gICAgICAgIGludmFsaWREYXRlOiBkZWZhdWx0SW52YWxpZERhdGUsXG4gICAgICAgIG9yZGluYWw6IGRlZmF1bHRPcmRpbmFsLFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiBkZWZhdWx0RGF5T2ZNb250aE9yZGluYWxQYXJzZSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiBkZWZhdWx0UmVsYXRpdmVUaW1lLFxuXG4gICAgICAgIG1vbnRoczogZGVmYXVsdExvY2FsZU1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydCxcblxuICAgICAgICB3ZWVrOiBkZWZhdWx0TG9jYWxlV2VlayxcblxuICAgICAgICB3ZWVrZGF5czogZGVmYXVsdExvY2FsZVdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c01pbjogZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCxcblxuICAgICAgICBtZXJpZGllbVBhcnNlOiBkZWZhdWx0TG9jYWxlTWVyaWRpZW1QYXJzZVxuICAgIH07XG5cbiAgICAvLyBpbnRlcm5hbCBzdG9yYWdlIGZvciBsb2NhbGUgY29uZmlnIGZpbGVzXG4gICAgdmFyIGxvY2FsZXMgPSB7fTtcbiAgICB2YXIgbG9jYWxlRmFtaWxpZXMgPSB7fTtcbiAgICB2YXIgZ2xvYmFsTG9jYWxlO1xuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplTG9jYWxlKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5ID8ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnXycsICctJykgOiBrZXk7XG4gICAgfVxuXG4gICAgLy8gcGljayB0aGUgbG9jYWxlIGZyb20gdGhlIGFycmF5XG4gICAgLy8gdHJ5IFsnZW4tYXUnLCAnZW4tZ2InXSBhcyAnZW4tYXUnLCAnZW4tZ2InLCAnZW4nLCBhcyBpbiBtb3ZlIHRocm91Z2ggdGhlIGxpc3QgdHJ5aW5nIGVhY2hcbiAgICAvLyBzdWJzdHJpbmcgZnJvbSBtb3N0IHNwZWNpZmljIHRvIGxlYXN0LCBidXQgbW92ZSB0byB0aGUgbmV4dCBhcnJheSBpdGVtIGlmIGl0J3MgYSBtb3JlIHNwZWNpZmljIHZhcmlhbnQgdGhhbiB0aGUgY3VycmVudCByb290XG4gICAgZnVuY3Rpb24gY2hvb3NlTG9jYWxlKG5hbWVzKSB7XG4gICAgICAgIHZhciBpID0gMCwgaiwgbmV4dCwgbG9jYWxlLCBzcGxpdDtcblxuICAgICAgICB3aGlsZSAoaSA8IG5hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgc3BsaXQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaV0pLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBqID0gc3BsaXQubGVuZ3RoO1xuICAgICAgICAgICAgbmV4dCA9IG5vcm1hbGl6ZUxvY2FsZShuYW1lc1tpICsgMV0pO1xuICAgICAgICAgICAgbmV4dCA9IG5leHQgPyBuZXh0LnNwbGl0KCctJykgOiBudWxsO1xuICAgICAgICAgICAgd2hpbGUgKGogPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShzcGxpdC5zbGljZSgwLCBqKS5qb2luKCctJykpO1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5sZW5ndGggPj0gaiAmJiBjb21wYXJlQXJyYXlzKHNwbGl0LCBuZXh0LCB0cnVlKSA+PSBqIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvL3RoZSBuZXh0IGFycmF5IGl0ZW0gaXMgYmV0dGVyIHR
21167oYW4gYSBzaGFsbG93ZXIgc3Vic3RyaW5nIG9mIHRoaXMgb25lXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkTG9jYWxlKG5hbWUpIHtcbiAgICAgICAgdmFyIG9sZExvY2FsZSA9IG51bGw7XG4gICAgICAgIC8vIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIHJlZ2lzdGVyIGFuZCBsb2FkIGFsbCB0aGUgbG9jYWxlcyBpbiBOb2RlXG4gICAgICAgIGlmICghbG9jYWxlc1tuYW1lXSAmJiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgbW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9sZExvY2FsZSA9IGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICAgICAgICAgICAgICB2YXIgYWxpYXNlZFJlcXVpcmUgPSByZXF1aXJlO1xuICAgICAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlKCcuL2xvY2FsZS8nICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG9sZExvY2FsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2FkIGxvY2FsZSBhbmQgdGhlbiBzZXQgdGhlIGdsb2JhbCBsb2NhbGUuICBJZlxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgZ2xvYmFsXG4gICAgLy8gbG9jYWxlIGtleS5cbiAgICBmdW5jdGlvbiBnZXRTZXRHbG9iYWxMb2NhbGUgKGtleSwgdmFsdWVzKSB7XG4gICAgICAgIHZhciBkYXRhO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQodmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBnZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBkZWZpbmVMb2NhbGUoa2V5LCB2YWx1ZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIG1vbWVudC5kdXJhdGlvbi5fbG9jYWxlID0gbW9tZW50Ll9sb2NhbGUgPSBkYXRhO1xuICAgICAgICAgICAgICAgIGdsb2JhbExvY2FsZSA9IGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZiBjb25zb2xlICE9PSAgJ3VuZGVmaW5lZCcpICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgICAgICAgICAvL3dhcm4gdXNlciBpZiBhcmd1bWVudHMgYXJlIHBhc3NlZCBidXQgdGhlIGxvY2FsZSBjb3VsZCBub3QgYmUgc2V0XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTG9jYWxlICcgKyBrZXkgKyAgJyBub3QgZm91bmQuIERpZCB5b3UgZm9yZ2V0IHRvIGxvYWQgaXQ/Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZpbmVMb2NhbGUgKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2Y
21167XIgbG9jYWxlLCBwYXJlbnRDb25maWcgPSBiYXNlQ29uZmlnO1xuICAgICAgICAgICAgY29uZmlnLmFiYnIgPSBuYW1lO1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZSgnZGVmaW5lTG9jYWxlT3ZlcnJpZGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBtb21lbnQudXBkYXRlTG9jYWxlKGxvY2FsZU5hbWUsIGNvbmZpZykgdG8gY2hhbmdlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2FuIGV4aXN0aW5nIGxvY2FsZS4gbW9tZW50LmRlZmluZUxvY2FsZShsb2NhbGVOYW1lLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWcpIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kZWZpbmUtbG9jYWxlLyBmb3IgbW9yZSBpbmZvLicpO1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbbmFtZV0uX2NvbmZpZztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZXNbY29uZmlnLnBhcmVudExvY2FsZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLl9jb25maWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShjb25maWcucGFyZW50TG9jYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGUuX2NvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBuZXcgTG9jYWxlKG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNvbmZpZykpO1xuXG4gICAgICAgICAgICBpZiAobG9jYWxlRmFtaWxpZXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZUxvY2FsZSh4Lm5hbWUsIHguY29uZmlnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2Ugc2V0IHRoZSBsb2NhbGUgQUZURVIgYWxsIGNoaWxkIGxvY2FsZXMgaGF2ZSBiZWVuXG4gICAgICAgICAgICAvLyBjcmVhdGVkLCBzbyB3ZSB3b24ndCBlbmQgdXAgd2l0aCB0aGUgY2hpbGQgbG9jYWxlIHNldC5cbiAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShuYW1lKTtcblxuXG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHVzZWZ1bCBmb3IgdGVzdGluZ1xuICAgICAgICAgICAgZGVsZXRlIGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZUxvY2FsZShuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICB2Y
21167XIgbG9jYWxlLCB0bXBMb2NhbGUsIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG4gICAgICAgICAgICAvLyBNRVJHRVxuICAgICAgICAgICAgdG1wTG9jYWxlID0gbG9hZExvY2FsZShuYW1lKTtcbiAgICAgICAgICAgIGlmICh0bXBMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IHRtcExvY2FsZS5fY29uZmlnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnID0gbWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY29uZmlnKTtcbiAgICAgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoY29uZmlnKTtcbiAgICAgICAgICAgIGxvY2FsZS5wYXJlbnRMb2NhbGUgPSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IGxvY2FsZTtcblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzIG51bGwgZm9yIGNvbmZpZyB0byB1bnVwZGF0ZSwgdXNlZnVsIGZvciB0ZXN0c1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBsb2NhbGUgZGF0YVxuICAgIGZ1bmN0aW9uIGdldExvY2FsZSAoa2V5KSB7XG4gICAgICAgIHZhciBsb2NhbGU7XG5cbiAgICAgICAgaWYgKGtleSAmJiBrZXkuX2xvY2FsZSAmJiBrZXkuX2xvY2FsZS5fYWJicikge1xuICAgICAgICAgICAga2V5ID0ga2V5Ll9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgICAvL3Nob3J0LWNpcmN1aXQgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobG9jYWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtleSA9IFtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNob29zZUxvY2FsZShrZXkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RMb2NhbGVzKCkge1xuICAgICAgICByZXR1cm4ga2V5cyhsb2NhbGVzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja092ZXJmbG93IChtKSB7XG4gICAgICAgIHZhciBvdmVyZmxvdztcbiAgICAgICAgdmFyIGEgPSBtLl9hO1xuXG4gICAgICAgIGlmIChhICYmIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9PT0gLTIpIHtcbiAgICAgICAgICAgIG92ZXJmbG93ID1cbiAgICAgICAgICAgICAgICBhW
2116701PTlRIXSAgICAgICA8IDAgfHwgYVtNT05USF0gICAgICAgPiAxMSAgPyBNT05USCA6XG4gICAgICAgICAgICAgICAgYVtEQVRFXSAgICAgICAgPCAxIHx8IGFbREFURV0gICAgICAgID4gZGF5c0luTW9udGgoYVtZRUFSXSwgYVtNT05USF0pID8gREFURSA6XG4gICAgICAgICAgICAgICAgYVtIT1VSXSAgICAgICAgPCAwIHx8IGFbSE9VUl0gICAgICAgID4gMjQgfHwgKGFbSE9VUl0gPT09IDI0ICYmIChhW01JTlVURV0gIT09IDAgfHwgYVtTRUNPTkRdICE9PSAwIHx8IGFbTUlMTElTRUNPTkRdICE9PSAwKSkgPyBIT1VSIDpcbiAgICAgICAgICAgICAgICBhW01JTlVURV0gICAgICA8IDAgfHwgYVtNSU5VVEVdICAgICAgPiA1OSAgPyBNSU5VVEUgOlxuICAgICAgICAgICAgICAgIGFbU0VDT05EXSAgICAgIDwgMCB8fCBhW1NFQ09ORF0gICAgICA+IDU5ICA/IFNFQ09ORCA6XG4gICAgICAgICAgICAgICAgYVtNSUxMSVNFQ09ORF0gPCAwIHx8IGFbTUlMTElTRUNPTkRdID4gOTk5ID8gTUlMTElTRUNPTkQgOlxuICAgICAgICAgICAgICAgIC0xO1xuXG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd0RheU9mWWVhciAmJiAob3ZlcmZsb3cgPCBZRUFSIHx8IG92ZXJmbG93ID4gREFURSkpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IERBVEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd1dlZWtzICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gV0VFSztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla2RheSAmJiBvdmVyZmxvdyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IFdFRUtEQVk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9IG92ZXJmbG93O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgLy8gUGljayB0aGUgZmlyc3QgZGVmaW5lZCBvZiB0d28gb3IgdGhyZWUgYXJndW1lbnRzLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRzKGEsIGIsIGMpIHtcbiAgICAgICAgaWYgKGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3VycmVudERhdGVBcnJheShjb25maWcpIHtcbiAgICAgICAgLy8gaG9va3MgaXMgYWN0dWFsbHkgdGhlIGV4cG9ydGVkIG1vbWVudCBvYmplY3RcbiAgICAgICAgdmFyIG5vd1ZhbHVlID0gbmV3IERhdGUoaG9va3Mubm93KCkpO1xuICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMpIHtcbiAgICAgICAgICAgIHJldHVybiBbbm93VmFsdWUuZ2V0VVRDRnVsbFllYXIoKSwgbm93VmFsdWUuZ2V0VVRDTW9udGgoKSwgbm93VmFsdWUuZ2V0VVRDRGF0ZSgpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW25vd1ZhbHVlLmdldEZ1bGxZZWFyKCksIG5vd1ZhbHVlLmdldE1vbnRoKCksIG5vd1ZhbHVlLmdldERhdGUoKV07XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBhbiBhcnJheSB0byBhIGRhdGUuXG4gICAgLy8gdGhlIGFycmF5IHNob3VsZCBtaXJyb3IgdGhlIHBhcmFtZXRlcnMgYmVsb3dcbiAgICAvLyBub3RlOiBhbGwgdmFsdWVzIHBhc3QgdGhlIHllYXIgYXJlIG9wdGlvbmFsIGFuZCB3aWxsIGRlZmF1bHQgdG8gdGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cbiAgICAvLyBbeWVhciwgbW9udGgsIGRheSAsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF1cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tQXJyYXkgKGNvbmZpZykge1xuICAgICAgICB2Y
21167XIgaSwgZGF0ZSwgaW5wdXQgPSBbXSwgY3VycmVudERhdGUsIGV4cGVjdGVkV2Vla2RheSwgeWVhclRvVXNlO1xuXG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGVBcnJheShjb25maWcpO1xuXG4gICAgICAgIC8vY29tcHV0ZSBkYXkgb2YgdGhlIHllYXIgZnJvbSB3ZWVrcyBhbmQgd2Vla2RheXNcbiAgICAgICAgaWYgKGNvbmZpZy5fdyAmJiBjb25maWcuX2FbREFURV0gPT0gbnVsbCAmJiBjb25maWcuX2FbTU9OVEhdID09IG51bGwpIHtcbiAgICAgICAgICAgIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZiB0aGUgZGF5IG9mIHRoZSB5ZWFyIGlzIHNldCwgZmlndXJlIG91dCB3aGF0IGl0IGlzXG4gICAgICAgIGlmIChjb25maWcuX2RheU9mWWVhciAhPSBudWxsKSB7XG4gICAgICAgICAgICB5ZWFyVG9Vc2UgPSBkZWZhdWx0cyhjb25maWcuX2FbWUVBUl0sIGN1cnJlbnREYXRlW1lFQVJdKTtcblxuICAgICAgICAgICAgaWYgKGNvbmZpZy5fZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyVG9Vc2UpIHx8IGNvbmZpZy5fZGF5T2ZZZWFyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93RGF5T2ZZZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0ZSA9IGNyZWF0ZVVUQ0RhdGUoeWVhclRvVXNlLCAwLCBjb25maWcuX2RheU9mWWVhcik7XG4gICAgICAgICAgICBjb25maWcuX2FbTU9OVEhdID0gZGF0ZS5nZXRVVENNb250aCgpO1xuICAgICAgICAgICAgY29uZmlnLl9hW0RBVEVdID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0IHRvIGN1cnJlbnQgZGF0ZS5cbiAgICAgICAgLy8gKiBpZiBubyB5ZWFyLCBtb250aCwgZGF5IG9mIG1vbnRoIGFyZSBnaXZlbiwgZGVmYXVsdCB0byB0b2RheVxuICAgICAgICAvLyAqIGlmIGRheSBvZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBtb250aCBhbmQgeWVhclxuICAgICAgICAvLyAqIGlmIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG9ubHkgeWVhclxuICAgICAgICAvLyAqIGlmIHllYXIgaXMgZ2l2ZW4sIGRvbid0IGRlZmF1bHQgYW55dGhpbmdcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDMgJiYgY29uZmlnLl9hW2ldID09IG51bGw7ICsraSkge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSBjdXJyZW50RGF0ZVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFplcm8gb3V0IHdoYXRldmVyIHdhcyBub3QgZGVmYXVsdGVkLCBpbmNsdWRpbmcgdGltZVxuICAgICAgICBmb3IgKDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSAoY29uZmlnLl9hW2ldID09IG51bGwpID8gKGkgPT09IDIgPyAxIDogMCkgOiBjb25maWcuX2FbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgMjQ6MDA6MDAuMDAwXG4gICAgICAgIGlmIChjb25maWcuX2FbSE9VUl0gPT09IDI0ICYmXG4gICAgICAgICAgICAgICAgY29uZmlnLl9hW01JTlVURV0gPT09IDAgJiZcbiAgICAgICAgICAgICAgICBjb25maWcuX2FbU0VDT05EXSA9PT0gMCAmJlxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtNSUxMSVNFQ09ORF0gPT09IDApIHtcbiAgICAgICAgICAgIGNvbmZpZy5fbmV4dERheSA9IHRydWU7XG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnLl9kID0gKGNvbmZpZy5fdXNlVVRDID8gY3JlYXRlVVRDRGF0ZSA6IGNyZWF0ZURhdGUpLmFwcGx5KG51bGwsIGlucHV0KTtcbiAgICAgICAgZXhwZWN0ZWRXZWVrZGF5ID0gY29uZmlnLl91c2VVVEMgPyBjb25maWcuX2QuZ2V0VVRDRGF5KCkgOiBjb25maWcuX2QuZ2V0RGF5KCk7XG5cbiAgICAgICAgLy8gQXBwbHkgdGltZXpvbmUgb2Zmc2V0IGZyb20gaW5wdXQuIFRoZSBhY3R1YWwgdXRjT2Zmc2V0IGNhbiBiZSBjaGFuZ2VkXG4gICAgICAgIC8vIHdpdGggcGFyc2Vab25lLlxuICAgICAgICBpZiAoY29uZmlnLl90em0gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9kLnNldFVUQ01pbnV0ZXMoY29uZmlnLl9kLmdldFVUQ01pbnV0ZXMoKSAtIGNvbmZpZy5fdHptKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuX25leHREYXkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IDI0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZm9yIG1pc21hdGNoaW5nIGRheSBvZiB3ZWVrXG4gICAgICAgIGlmIChjb25maWcuX3cgJiYgdHlwZW9mIGNvbmZpZy5fdy5kICE9PSAndW5kZWZpbmVkJyAmJiBjb25maWcuX3cuZCAhPT0gZXhwZWN0ZWRXZWVrZGF5KSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS53ZWVrZGF5TWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtJbmZvKGNvbmZpZykge1xuICAgICAgICB2Y
21167XIgdywgd2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95LCB0ZW1wLCB3ZWVrZGF5T3ZlcmZsb3c7XG5cbiAgICAgICAgdyA9IGNvbmZpZy5fdztcbiAgICAgICAgaWYgKHcuR0cgIT0gbnVsbCB8fCB3LlcgIT0gbnVsbCB8fCB3LkUgIT0gbnVsbCkge1xuICAgICAgICAgICAgZG93ID0gMTtcbiAgICAgICAgICAgIGRveSA9IDQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIG5lZWQgdG8gdGFrZSB0aGUgY3VycmVudCBpc29XZWVrWWVhciwgYnV0IHRoYXQgZGVwZW5kcyBvblxuICAgICAgICAgICAgLy8gaG93IHdlIGludGVycHJldCBub3cgKGxvY2FsLCB1dGMsIGZpeGVkIG9mZnNldCkuIFNvIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYSBub3cgdmVyc2lvbiBvZiBjdXJyZW50IGNvbmZpZyAodGFrZSBsb2NhbC91dGMvb2Zmc2V0IGZsYWdzLCBhbmRcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBub3cpLlxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LkdHLCBjb25maWcuX2FbWUVBUl0sIHdlZWtPZlllYXIoY3JlYXRlTG9jYWwoKSwgMSwgNCkueWVhcik7XG4gICAgICAgICAgICB3ZWVrID0gZGVmYXVsdHMody5XLCAxKTtcbiAgICAgICAgICAgIHdlZWtkYXkgPSBkZWZhdWx0cyh3LkUsIDEpO1xuICAgICAgICAgICAgaWYgKHdlZWtkYXkgPCAxIHx8IHdlZWtkYXkgPiA3KSB7XG4gICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvdyA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRvdztcbiAgICAgICAgICAgIGRveSA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRveTtcblxuICAgICAgICAgICAgdmFyIGN1cldlZWsgPSB3ZWVrT2ZZZWFyKGNyZWF0ZUxvY2FsKCksIGRvdywgZG95KTtcblxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LmdnLCBjb25maWcuX2FbWUVBUl0sIGN1cldlZWsueWVhcik7XG5cbiAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gY3VycmVudCB3ZWVrLlxuICAgICAgICAgICAgd2VlayA9IGRlZmF1bHRzKHcudywgY3VyV2Vlay53ZWVrKTtcblxuICAgICAgICAgICAgaWYgKHcuZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gd2Vla2RheSAtLSBsb3cgZGF5IG51bWJlcnMgYXJlIGNvbnNpZGVyZWQgbmV4dCB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZDtcbiAgICAgICAgICAgICAgICBpZiAod2Vla2RheSA8IDAgfHwgd2Vla2RheSA+IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHcuZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gbG9jYWwgd2Vla2RheSAtLSBjb3VudGluZyBzdGFydHMgZnJvbSBiZWdpbm5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSB3LmUgKyBkb3c7XG4gICAgICAgICAgICAgICAgaWYgKHcuZSA8IDAgfHwgdy5lID4gNikge1xuICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBiZWdpbm5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSBkb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdlZWsgPCAxIHx8IHdlZWsgPiB3ZWVrc0luWWVhcih3ZWVrWWVhciwgZG93LCBkb3kpKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAod2Vla2RheU92ZXJmbG93ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd1dlZWtkYXkgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGVtcCA9IGRheU9mWWVhckZyb21XZWVrcyh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpO1xuICAgICAgICAgICAgY29uZmlnLl9hW1lFQVJdID0gdGVtcC55ZWFyO1xuICAgICAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0ZW1wLmRheU9mWWVhcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlzbyA4NjAxIHJlZ2V4XG4gICAgLy8gMDAwMC0wMC0wMCAwMDAwLVcwMCBvciAwMDAwLVcwMC0wICsgVCArIDAwIG9yIDAwOjAwIG9yIDAwOjAwOjAwIG9yIDAwOjAwOjAwLjAwMCArICswMDowMCBvciArMDAwMCBvciArMDApXG4gICAgdmFyIGV4dGVuZGVkSXNvUmVnZXggPSAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pLSg/OlxcZFxcZC1cXGRcXGR8V1xcZFxcZC1cXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkKSkoPzooVHwgKShcXGRcXGQoPzo6XFxkXFxkKD86OlxcZFxcZCg/OlsuLF1cXGQrKT8pPyk/KShbXFwrXFwtXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC87XG4gICAgdmFyIGJhc2ljSXNvUmVnZXggPSAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pKD86XFxkXFxkXFxkXFxkfFdcXGRcXGRcXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkKSkoPzooVHwgKShcXGRcXGQoPzpcXGRcXGQoPzpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoW1xcK1xcLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvO1xuXG4gICAgdmFyIHR6UmVnZXggPSAvWnxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy87XG5cbiAgICB2YXIgaXNvRGF0ZXMgPSBbXG4gICAgICAgIFsnWVlZWVlZLU1NLUREJywgL1srLV1cXGR7Nn0tXFxkXFxkLVxcZFxcZC9dLFxuICAgICAgICBbJ1lZWVktTU0tREQnLCAvXFxkezR9LVxcZFxcZC1cXGRcXGQvXSxcbiAgICAgICAgWydHR0dHLVtXXVdXLUUnLCAvXFxkezR9LVdcXGRcXGQtXFxkL10sXG4gICAgICAgIFsnR0dHRy1bV11XVycsIC9cXGR7NH0tV1xcZFxcZC8sIGZhbHNlXSxcbiAgICAgICAgWydZWVlZLURERCcsIC9cXGR7NH0tXFxkezN9L10sXG4gICAgICAgIFsnWVlZWS1NTScsIC9cXGR7NH0tXFxkXFxkLywgZmFsc2VdLFxuICAgICAgICBbJ1lZWVlZWU1NREQnLCAvWystXVxcZHsxMH0vXSxcbiAgICAgICAgWydZWVlZTU1ERCcsIC9cXGR7OH0vXSxcbiAgICAgICAgLy8gWVlZWU1NIGlzIE5PVCBhbGxvd2VkIGJ5IHRoZSBzdGFuZGFyZFxuICAgICAgICBbJ0dHR0dbV11XV0UnLCAvXFxkezR9V1xcZHszfS9dLFxuICAgICAgICBbJ0dHR0dbV11XVycsIC9cXGR7NH1XXFxkezJ9LywgZmFsc2VdLFxuICAgICAgICBbJ1lZWVlEREQnLCAvXFxkezd9L11cbiAgICBdO1xuXG4gICAgLy8gaXNvIHRpbWUgZm9ybWF0cyBhbmQgcmVnZXhlc1xuICAgIHZhciBpc29UaW1lcyA9IFtcbiAgICAgICAgWydISDptbTpzcy5TU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkKy9dLFxuICAgICAgICBbJ0hIOm1tOnNzLFNTU1MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQsXFxkKy9dLFxuICAgICAgICBbJ0hIOm1tOnNzJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkL10sXG4gICAgICAgIFsnSEg6bW0nLCAvXFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICBbJ0hIbW1zcy5TU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZFxcLlxcZCsvXSxcbiAgICAgICAgWydISG1tc3MsU1NTUycsIC9cXGRcXGRcXGRcXGRcXGRcXGQsXFxkKy9dLFxuICAgICAgICBbJ0hIbW1zcycsIC9cXGRcXGRcXGRcXGRcXGRcXGQvXSxcbiAgICAgICAgWydISG1tJywgL1xcZFxcZFxcZFxcZC9dLFxuICAgICAgICBbJ0hIJywgL1xcZFxcZC9dXG4gICAgXTtcblxuICAgI
21167HZhciBhc3BOZXRKc29uUmVnZXggPSAvXlxcLz9EYXRlXFwoKFxcLT9cXGQrKS9pO1xuXG4gICAgLy8gZGF0ZSBmcm9tIGlzbyBmb3JtYXRcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tSVNPKGNvbmZpZykge1xuICAgICAgICB2YXIgaSwgbCxcbiAgICAgICAgICAgIHN0cmluZyA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIG1hdGNoID0gZXh0ZW5kZWRJc29SZWdleC5leGVjKHN0cmluZykgfHwgYmFzaWNJc29SZWdleC5leGVjKHN0cmluZyksXG4gICAgICAgICAgICBhbGxvd1RpbWUsIGRhdGVGb3JtYXQsIHRpbWVGb3JtYXQsIHR6Rm9ybWF0O1xuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaXNvID0gdHJ1ZTtcblxuICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb0RhdGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc29EYXRlc1tpXVsxXS5leGVjKG1hdGNoWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0ID0gaXNvRGF0ZXNbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGFsbG93VGltZSA9IGlzb0RhdGVzW2ldWzJdICE9PSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGVGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBpc29UaW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzb1RpbWVzW2ldWzFdLmV4ZWMobWF0Y2hbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaFsyXSBzaG91bGQgYmUgJ1QnIG9yIHNwYWNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lRm9ybWF0ID0gKG1hdGNoWzJdIHx8ICcgJykgKyBpc29UaW1lc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aW1lRm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFsbG93VGltZSAmJiB0aW1lRm9ybWF0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbNF0pIHtcbiAgICAgICAgICAgICAgICBpZiAodHpSZWdleC5leGVjKG1hdGNoWzRdKSkge1xuICAgICAgICAgICAgICAgICAgICB0ekZvcm1hdCA9ICdaJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZy5fZiA9IGRhdGVGb3JtYXQgKyAodGltZUZvcm1hdCB8fCAnJykgKyAodHpGb3JtYXQgfHwgJycpO1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSRkMgMjgyMiByZWdleDogRm9yIGRldGFpbHMgc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyODIyI3NlY3Rpb24tMy4zXG4gICAgdmFyIHJmYzI4MjIgPSAvXig/OihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pLD9cXHMpPyhcXGR7MSwyfSlcXHMoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpXFxzKFxcZHsyLDR9KVxccyhcXGRcXGQpOihcXGRcXGQpKD86OihcXGRcXGQpKT9cXHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KFsrLV1cXGR7NH0pKSQvO1xuXG4gICAgZnVuY3Rpb24gZXh0cmFjdEZyb21SRkMyODIyU3RyaW5ncyh5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cikge1xuICAgICAgICB2Y
21167XIgcmVzdWx0ID0gW1xuICAgICAgICAgICAgdW50cnVuY2F0ZVllYXIoeWVhclN0ciksXG4gICAgICAgICAgICBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQuaW5kZXhPZihtb250aFN0ciksXG4gICAgICAgICAgICBwYXJzZUludChkYXlTdHIsIDEwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KGhvdXJTdHIsIDEwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KG1pbnV0ZVN0ciwgMTApXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKHNlY29uZFN0cikge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VJbnQoc2Vjb25kU3RyLCAxMCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bnRydW5jYXRlWWVhcih5ZWFyU3RyKSB7XG4gICAgICAgIHZhciB5ZWFyID0gcGFyc2VJbnQoeWVhclN0ciwgMTApO1xuICAgICAgICBpZiAoeWVhciA8PSA0OSkge1xuICAgICAgICAgICAgcmV0dXJuIDIwMDAgKyB5ZWFyO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXIgPD0gOTk5KSB7XG4gICAgICAgICAgICByZXR1cm4gMTkwMCArIHllYXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHllYXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlcHJvY2Vzc1JGQzI4MjIocykge1xuICAgICAgICAvLyBSZW1vdmUgY29tbWVudHMgYW5kIGZvbGRpbmcgd2hpdGVzcGFjZSBhbmQgcmVwbGFjZSBtdWx0aXBsZS1zcGFjZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9cXChbXildKlxcKXxbXFxuXFx0XS9nLCAnICcpLnJlcGxhY2UoLyhcXHNcXHMrKS9nLCAnICcpLnJlcGxhY2UoL15cXHNcXHMqLywgJycpLnJlcGxhY2UoL1xcc1xccyokLywgJycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrV2Vla2RheSh3ZWVrZGF5U3RyLCBwYXJzZWRJbnB1dCwgY29uZmlnKSB7XG4gICAgICAgIGlmICh3ZWVrZGF5U3RyKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBSZXBsYWNlIHRoZSB2YW5pbGxhIEpTIERhdGUgb2JqZWN0IHdpdGggYW4gaW5kZXBlbnRlbnQgZGF5LW9mLXdlZWsgY2hlY2suXG4gICAgICAgICAgICB2Y
21167XIgd2Vla2RheVByb3ZpZGVkID0gZGVmYXVsdExvY2FsZVdlZWtkYXlzU2hvcnQuaW5kZXhPZih3ZWVrZGF5U3RyKSxcbiAgICAgICAgICAgICAgICB3ZWVrZGF5QWN0dWFsID0gbmV3IERhdGUocGFyc2VkSW5wdXRbMF0sIHBhcnNlZElucHV0WzFdLCBwYXJzZWRJbnB1dFsyXSkuZ2V0RGF5KCk7XG4gICAgICAgICAgICBpZiAod2Vla2RheVByb3ZpZGVkICE9PSB3ZWVrZGF5QWN0dWFsKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykud2Vla2RheU1pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIG9ic09mZnNldHMgPSB7XG4gICAgICAgIFVUOiAwLFxuICAgICAgICBHTVQ6IDAsXG4gICAgICAgIEVEVDogLTQgKiA2MCxcbiAgICAgICAgRVNUOiAtNSAqIDYwLFxuICAgICAgICBDRFQ6IC01ICogNjAsXG4gICAgICAgIENTVDogLTYgKiA2MCxcbiAgICAgICAgTURUOiAtNiAqIDYwLFxuICAgICAgICBNU1Q6IC03ICogNjAsXG4gICAgICAgIFBEVDogLTcgKiA2MCxcbiAgICAgICAgUFNUOiAtOCAqIDYwXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZU9mZnNldChvYnNPZmZzZXQsIG1pbGl0YXJ5T2Zmc2V0LCBudW1PZmZzZXQpIHtcbiAgICAgICAgaWYgKG9ic09mZnNldCkge1xuICAgICAgICAgICAgcmV0dXJuIG9ic09mZnNldHNbb2JzT2Zmc2V0XTtcbiAgICAgICAgfSBlbHNlIGlmIChtaWxpdGFyeU9mZnNldCkge1xuICAgICAgICAgICAgLy8gdGhlIG9ubHkgYWxsb3dlZCBtaWxpdGFyeSB0eiBpcyBaXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBobSA9IHBhcnNlSW50KG51bU9mZnNldCwgMTApO1xuICAgICAgICAgICAgdmFyIG0gPSBobSAlIDEwMCwgaCA9IChobSAtIG0pIC8gMTAwO1xuICAgICAgICAgICAgcmV0dXJuIGggKiA2MCArIG07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGFuZCB0aW1lIGZyb20gcmVmIDI4MjIgZm9ybWF0XG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHJmYzI4MjIuZXhlYyhwcmVwcm9jZXNzUkZDMjgyMihjb25maWcuX2kpKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICB2Y
21167XIgcGFyc2VkQXJyYXkgPSBleHRyYWN0RnJvbVJGQzI4MjJTdHJpbmdzKG1hdGNoWzRdLCBtYXRjaFszXSwgbWF0Y2hbMl0sIG1hdGNoWzVdLCBtYXRjaFs2XSwgbWF0Y2hbN10pO1xuICAgICAgICAgICAgaWYgKCFjaGVja1dlZWtkYXkobWF0Y2hbMV0sIHBhcnNlZEFycmF5LCBjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25maWcuX2EgPSBwYXJzZWRBcnJheTtcbiAgICAgICAgICAgIGNvbmZpZy5fdHptID0gY2FsY3VsYXRlT2Zmc2V0KG1hdGNoWzhdLCBtYXRjaFs5XSwgbWF0Y2hbMTBdKTtcblxuICAgICAgICAgICAgY29uZmlnLl9kID0gY3JlYXRlVVRDRGF0ZS5hcHBseShudWxsLCBjb25maWcuX2EpO1xuICAgICAgICAgICAgY29uZmlnLl9kLnNldFVUQ01pbnV0ZXMoY29uZmlnLl9kLmdldFVUQ01pbnV0ZXMoKSAtIGNvbmZpZy5fdHptKTtcblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykucmZjMjgyMiA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgZnJvbSBpc28gZm9ybWF0IG9yIGZhbGxiYWNrXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZyhjb25maWcpIHtcbiAgICAgICAgdmFyIG1hdGNoZWQgPSBhc3BOZXRKc29uUmVnZXguZXhlYyhjb25maWcuX2kpO1xuXG4gICAgICAgIGlmIChtYXRjaGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSgrbWF0Y2hlZFsxXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuX2lzVmFsaWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLl9pc1ZhbGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5faXNWYWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuX2lzVmFsaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaW5hbCBhdHRlbXB0LCB1c2UgSW5wdXQgRmFsbGJhY2tcbiAgICAgICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2soY29uZmlnKTtcbiAgICB9XG5cbiAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ3ZhbHVlIHByb3ZpZGVkIGlzIG5vdCBpbiBhIHJlY29nbml6ZWQgUkZDMjgyMiBvciBJU08gZm9ybWF0LiBtb21lbnQgY29uc3RydWN0aW9uIGZhbGxzIGJhY2sgdG8ganMgRGF0ZSgpLCAnICtcbiAgICAgICAgJ3doaWNoIGlzIG5vdCByZWxpYWJsZSBhY3Jvc3MgYWxsIGJyb3dzZXJzIGFuZCB2ZXJzaW9ucy4gTm9uIFJGQzI4MjIvSVNPIGRhdGUgZm9ybWF0cyBhcmUgJyArXG4gICAgICAgICdkaXNjb3VyYWdlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGFuIHVwY29taW5nIG1ham9yIHJlbGVhc2UuIFBsZWFzZSByZWZlciB0byAnICtcbiAgICAgICAgJ2h0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvanMtZGF0ZS8gZm9yIG1vcmUgaW5mby4nLFxuICAgICAgICBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShjb25maWcuX2kgKyAoY29uZmlnLl91c2VVVEMgPyAnIFVUQycgOiAnJykpO1xuICAgICAgICB9XG4gICAgKTtcblxuICAgIC8vIGNvbnN0YW50IHRoYXQgcmVmZXJzIHRvIHRoZSBJU08gc3RhbmRhcmRcbiAgICBob29rcy5JU09fODYwMSA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gY29uc3RhbnQgdGhhdCByZWZlcnMgdG8gdGhlIFJGQyAyODIyIGZvcm1cbiAgICBob29rcy5SRkNfMjgyMiA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gZGF0ZSBmcm9tIHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZ1xuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyB0byBhbm90aGVyIHBhcnQgb2YgdGhlIGNyZWF0aW9uIGZsb3cgdG8gcHJldmVudCBjaXJjdWxhciBkZXBzXG4gICAgICAgIGlmIChjb25maWcuX2YgPT09IGhvb2tzLklTT184NjAxKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5fZiA9PT0gaG9va3MuUkZDXzI4MjIpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uZmlnLl9hID0gW107XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVtcHR5ID0gdHJ1ZTtcblxuICAgICAgICAvLyBUaGlzIGFycmF5IGlzIHVzZWQgdG8gbWFrZSBhIERhdGUsIGVpdGhlciB3aXRoIGBuZXcgRGF0ZWAgb3IgYERhdGUuVVRDYFxuICAgICAgICB2Y
21167XIgc3RyaW5nID0gJycgKyBjb25maWcuX2ksXG4gICAgICAgICAgICBpLCBwYXJzZWRJbnB1dCwgdG9rZW5zLCB0b2tlbiwgc2tpcHBlZCxcbiAgICAgICAgICAgIHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgsXG4gICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoID0gMDtcblxuICAgICAgICB0b2tlbnMgPSBleHBhbmRGb3JtYXQoY29uZmlnLl9mLCBjb25maWcuX2xvY2FsZSkubWF0Y2goZm9ybWF0dGluZ1Rva2VucykgfHwgW107XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV07XG4gICAgICAgICAgICBwYXJzZWRJbnB1dCA9IChzdHJpbmcubWF0Y2goZ2V0UGFyc2VSZWdleEZvclRva2VuKHRva2VuLCBjb25maWcpKSB8fCBbXSlbMF07XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygndG9rZW4nLCB0b2tlbiwgJ3BhcnNlZElucHV0JywgcGFyc2VkSW5wdXQsXG4gICAgICAgICAgICAvLyAgICAgICAgICdyZWdleCcsIGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSk7XG4gICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBza2lwcGVkID0gc3RyaW5nLnN1YnN0cigwLCBzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkpO1xuICAgICAgICAgICAgICAgIGlmIChza2lwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkSW5wdXQucHVzaChza2lwcGVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKHN0cmluZy5pbmRleE9mKHBhcnNlZElucHV0KSArIHBhcnNlZElucHV0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdG90YWxQYXJzZWRJbnB1dExlbmd0aCArPSBwYXJzZWRJbnB1dC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkb24ndCBwYXJzZSBpZiBpdCdzIG5vdCBhIGtub3duIHRva2VuXG4gICAgICAgICAgICBpZiAoZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVtcHR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBwYXJzZWRJbnB1dCwgY29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbmZpZy5fc3RyaWN0ICYmICFwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCByZW1haW5pbmcgdW5wYXJzZWQgaW5wdXQgbGVuZ3RoIHRvIHRoZSBzdHJpbmdcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuY2hhcnNMZWZ0T3ZlciA9IHN0cmluZ0xlbmd0aCAtIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGg7XG4gICAgICAgIGlmIChzdHJpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkSW5wdXQucHVzaChzdHJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xlYXIgXzEyaCBmbGFnIGlmIGhvdXIgaXMgPD0gMTJcbiAgICAgICAgaWYgKGNvbmZpZy5fYVtIT1VSXSA8PSAxMiAmJlxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID4gMCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnBhcnNlZERhdGVQYXJ0cyA9IGNvbmZpZy5fYS5zbGljZSgwKTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykubWVyaWRpZW0gPSBjb25maWcuX21lcmlkaWVtO1xuICAgICAgICAvLyBoYW5kbGUgbWVyaWRpZW1cbiAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gbWVyaWRpZW1GaXhXcmFwKGNvbmZpZy5fbG9jYWxlLCBjb25maWcuX2FbSE9VUl0sIGNvbmZpZy5fbWVyaWRpZW0pO1xuXG4gICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgICAgICBjaGVja092ZXJmbG93KGNvbmZpZyk7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBtZXJpZGllbUZpeFdyYXAgKGxvY2FsZSwgaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgdmFyIGlzUG07XG5cbiAgICAgICAgaWYgKG1lcmlkaWVtID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbGUubWVyaWRpZW1Ib3VyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUubWVyaWRpZW1Ib3VyKGhvdXIsIG1lcmlkaWVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbGUuaXNQTSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFja1xuICAgICAgICAgICAgaXNQbSA9IGxvY2FsZS5pc1BNKG1lcmlkaWVtKTtcbiAgICAgICAgICAgIGlmIChpc1BtICYmIGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgKz0gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzUG0gJiYgaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBub3Qgc3VwcG9zZWQgdG8gaGFwcGVuXG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgZnJvbSBzdHJpbmcgYW5kIGFycmF5IG9mIGZvcm1hdCBzdHJpbmdzXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZykge1xuICAgICAgICB2Y
21167XIgdGVtcENvbmZpZyxcbiAgICAgICAgICAgIGJlc3RNb21lbnQsXG5cbiAgICAgICAgICAgIHNjb3JlVG9CZWF0LFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZTtcblxuICAgICAgICBpZiAoY29uZmlnLl9mLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZEZvcm1hdCA9IHRydWU7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShOYU4pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbmZpZy5fZi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY3VycmVudFNjb3JlID0gMDtcbiAgICAgICAgICAgIHRlbXBDb25maWcgPSBjb3B5Q29uZmlnKHt9LCBjb25maWcpO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5fdXNlVVRDICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0ZW1wQ29uZmlnLl91c2VVVEMgPSBjb25maWcuX3VzZVVUQztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRlbXBDb25maWcuX2YgPSBjb25maWcuX2ZbaV07XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KHRlbXBDb25maWcpO1xuXG4gICAgICAgICAgICBpZiAoIWlzVmFsaWQodGVtcENvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW55IGlucHV0IHRoYXQgd2FzIG5vdCBwYXJzZWQgYWRkIGEgcGVuYWx0eSBmb3IgdGhhdCBmb3JtYXRcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykuY2hhcnNMZWZ0T3ZlcjtcblxuICAgICAgICAgICAgLy9vciB0b2tlbnNcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykudW51c2VkVG9rZW5zLmxlbmd0aCAqIDEwO1xuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykuc2NvcmUgPSBjdXJyZW50U2NvcmU7XG5cbiAgICAgICAgICAgIGlmIChzY29yZVRvQmVhdCA9PSBudWxsIHx8IGN1cnJlbnRTY29yZSA8IHNjb3JlVG9CZWF0KSB7XG4gICAgICAgICAgICAgICAgc2NvcmVUb0JlYXQgPSBjdXJyZW50U2NvcmU7XG4gICAgICAgICAgICAgICAgYmVzdE1vbWVudCA9IHRlbXBDb25maWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBleHRlbmQoY29uZmlnLCBiZXN0TW9tZW50IHx8IHRlbXBDb25maWcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21PYmplY3QoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpID0gbm9ybWFsaXplT2JqZWN0VW5pdHMoY29uZmlnLl9pKTtcbiAgICAgICAgY29uZmlnLl9hID0gbWFwKFtpLnllYXIsIGkubW9udGgsIGkuZGF5IHx8IGkuZGF0ZSwgaS5ob3VyLCBpLm1pbnV0ZSwgaS5zZWNvbmQsIGkubWlsbGlzZWNvbmRdLCBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqICYmIHBhcnNlSW50KG9iaiwgMTApO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVGcm9tQ29uZmlnIChjb25maWcpIHtcbiAgICAgICAgdmFyIHJlcyA9IG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhwcmVwYXJlQ29uZmlnKGNvbmZpZykpKTtcbiAgICAgICAgaWYgKHJlcy5fbmV4dERheSkge1xuICAgICAgICAgICAgLy8gQWRkaW5nIGlzIHNtYXJ0IGVub3VnaCBhcm91bmQgRFNUXG4gICAgICAgICAgICByZXMuYWRkKDEsICdkJyk7XG4gICAgICAgICAgICByZXMuX25leHREYXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZXBhcmVDb25maWcgKGNvbmZpZykge1xuICAgICAgICB2Y
21167XIgaW5wdXQgPSBjb25maWcuX2ksXG4gICAgICAgICAgICBmb3JtYXQgPSBjb25maWcuX2Y7XG5cbiAgICAgICAgY29uZmlnLl9sb2NhbGUgPSBjb25maWcuX2xvY2FsZSB8fCBnZXRMb2NhbGUoY29uZmlnLl9sKTtcblxuICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwgfHwgKGZvcm1hdCA9PT0gdW5kZWZpbmVkICYmIGlucHV0ID09PSAnJykpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKHtudWxsSW5wdXQ6IHRydWV9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25maWcuX2kgPSBpbnB1dCA9IGNvbmZpZy5fbG9jYWxlLnByZXBhcnNlKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc01vbWVudChpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9tZW50KGNoZWNrT3ZlcmZsb3coaW5wdXQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0RhdGUoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBpbnB1dDtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRBcnJheShjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCkge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpO1xuICAgICAgICB9ICBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21JbnB1dChjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkKGNvbmZpZykpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21JbnB1dChjb25maWcpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gY29uZmlnLl9pO1xuICAgICAgICBpZiAoaXNVbmRlZmluZWQoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShob29rcy5ub3coKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaW5wdXQudmFsdWVPZigpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nKGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IG1hcChpbnB1dC5zbGljZSgwKSwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChvYmosIDEwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tT2JqZWN0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICAvLyBmcm9tIG1pbGxpc2Vjb25kc1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2soY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUxvY2FsT3JVVEMgKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCBpc1VUQykge1xuICAgICAgICB2Y
21167XIgYyA9IHt9O1xuXG4gICAgICAgIGlmIChsb2NhbGUgPT09IHRydWUgfHwgbG9jYWxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgc3RyaWN0ID0gbG9jYWxlO1xuICAgICAgICAgICAgbG9jYWxlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChpc09iamVjdChpbnB1dCkgJiYgaXNPYmplY3RFbXB0eShpbnB1dCkpIHx8XG4gICAgICAgICAgICAgICAgKGlzQXJyYXkoaW5wdXQpICYmIGlucHV0Lmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIGlucHV0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIG9iamVjdCBjb25zdHJ1Y3Rpb24gbXVzdCBiZSBkb25lIHRoaXMgd2F5LlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTQyM1xuICAgICAgICBjLl9pc0FNb21lbnRPYmplY3QgPSB0cnVlO1xuICAgICAgICBjLl91c2VVVEMgPSBjLl9pc1VUQyA9IGlzVVRDO1xuICAgICAgICBjLl9sID0gbG9jYWxlO1xuICAgICAgICBjLl9pID0gaW5wdXQ7XG4gICAgICAgIGMuX2YgPSBmb3JtYXQ7XG4gICAgICAgIGMuX3N0cmljdCA9IHN0cmljdDtcblxuICAgICAgICByZXR1cm4gY3JlYXRlRnJvbUNvbmZpZyhjKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVMb2NhbCAoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG90eXBlTWluID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9tZW50KCkubWluIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWF4IGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC8nLFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2Y
21167XIgb3RoZXIgPSBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvdGhlciA8IHRoaXMgPyB0aGlzIDogb3RoZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgdmFyIHByb3RvdHlwZU1heCA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudCgpLm1heCBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1pbiBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvJyxcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG90aGVyID0gY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIgPiB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKTtcblxuICAgIC8vIFBpY2sgYSBtb21lbnQgbSBmcm9tIG1vbWVudHMgc28gdGhhdCBtW2ZuXShvdGhlcikgaXMgdHJ1ZSBmb3IgYWxsXG4gICAgLy8gb3RoZXIuIFRoaXMgcmVsaWVzIG9uIHRoZSBmdW5jdGlvbiBmbiB0byBiZSB0cmFuc2l0aXZlLlxuICAgIC8vXG4gICAgLy8gbW9tZW50cyBzaG91bGQgZWl0aGVyIGJlIGFuIGFycmF5IG9mIG1vbWVudCBvYmplY3RzIG9yIGFuIGFycmF5LCB3aG9zZVxuICAgIC8vIGZpcnN0IGVsZW1lbnQgaXMgYW4gYXJyYXkgb2YgbW9tZW50IG9iamVjdHMuXG4gICAgZnVuY3Rpb24gcGlja0J5KGZuLCBtb21lbnRzKSB7XG4gICAgICAgIHZhciByZXMsIGk7XG4gICAgICAgIGlmIChtb21lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0FycmF5KG1vbWVudHNbMF0pKSB7XG4gICAgICAgICAgICBtb21lbnRzID0gbW9tZW50c1swXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1vbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoKTtcbiAgICAgICAgfVxuICAgICAgICByZXMgPSBtb21lbnRzWzBdO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbW9tZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKCFtb21lbnRzW2ldLmlzVmFsaWQoKSB8fCBtb21lbnRzW2ldW2ZuXShyZXMpKSB7XG4gICAgICAgICAgICAgICAgcmVzID0gbW9tZW50c1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIFRPRE86IFVzZSBbXS5zb3J0IGluc3RlYWQ/XG4gICAgZnVuY3Rpb24gbWluICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cbiAgICAgICAgcmV0dXJuIHBpY2tCeSgnaXNCZWZvcmUnLCBhcmdzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXggKCkge1xuICAgICAgICB2Y
21167XIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgICAgICByZXR1cm4gcGlja0J5KCdpc0FmdGVyJywgYXJncyk7XG4gICAgfVxuXG4gICAgdmFyIG5vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIERhdGUubm93ID8gRGF0ZS5ub3coKSA6ICsobmV3IERhdGUoKSk7XG4gICAgfTtcblxuICAgIHZhciBvcmRlcmluZyA9IFsneWVhcicsICdxdWFydGVyJywgJ21vbnRoJywgJ3dlZWsnLCAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsICdtaWxsaXNlY29uZCddO1xuXG4gICAgZnVuY3Rpb24gaXNEdXJhdGlvblZhbGlkKG0pIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIG0pIHtcbiAgICAgICAgICAgIGlmICghKGluZGV4T2YuY2FsbChvcmRlcmluZywga2V5KSAhPT0gLTEgJiYgKG1ba2V5XSA9PSBudWxsIHx8ICFpc05hTihtW2tleV0pKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdW5pdEhhc0RlY2ltYWwgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmRlcmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKG1bb3JkZXJpbmdbaV1dKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVuaXRIYXNEZWNpbWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gb25seSBhbGxvdyBub24taW50ZWdlcnMgZm9yIHNtYWxsZXN0IHVuaXRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQobVtvcmRlcmluZ1tpXV0pICE9PSB0b0ludChtW29yZGVyaW5nW2ldXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5pdEhhc0RlY2ltYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVmFsaWQkMSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVmFsaWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSW52YWxpZCQxKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oTmFOKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBEdXJhdGlvbiAoZHVyYXRpb24pIHtcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dCA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGR1cmF0aW9uKSxcbiAgICAgICAgICAgIHllYXJzID0gbm9ybWFsaXplZElucHV0LnllYXIgfHwgMCxcbiAgICAgICAgICAgIHF1YXJ0ZXJzID0gbm9ybWFsaXplZElucHV0LnF1YXJ0ZXIgfHwgMCxcbiAgICAgICAgICAgIG1vbnRocyA9IG5vcm1hbGl6ZWRJbnB1dC5tb250aCB8fCAwLFxuICAgICAgICAgICAgd2Vla3MgPSBub3JtYWxpemVkSW5wdXQud2VlayB8fCBub3JtYWxpemVkSW5wdXQuaXNvV2VlayB8fCAwLFxuICAgICAgICAgICAgZGF5cyA9IG5vcm1hbGl6ZWRJbnB1dC5kYXkgfHwgMCxcbiAgICAgICAgICAgIGhvdXJzID0gbm9ybWFsaXplZElucHV0LmhvdXIgfHwgMCxcbiAgICAgICAgICAgIG1pbnV0ZXMgPSBub3JtYWxpemVkSW5wdXQubWludXRlIHx8IDAsXG4gICAgICAgICAgICBzZWNvbmRzID0gbm9ybWFsaXplZElucHV0LnNlY29uZCB8fCAwLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzID0gbm9ybWFsaXplZElucHV0Lm1pbGxpc2Vjb25kIHx8IDA7XG5cbiAgICAgICAgdGhpcy5faXNWYWxpZCA9IGlzRHVyYXRpb25WYWxpZChub3JtYWxpemVkSW5wdXQpO1xuXG4gICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIGZvciBkYXRlQWRkUmVtb3ZlXG4gICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyA9ICttaWxsaXNlY29uZHMgK1xuICAgICAgICAgICAgc2Vjb25kcyAqIDFlMyArIC8vIDEwMDBcbiAgICAgICAgICAgIG1pbnV0ZXMgKiA2ZTQgKyAvLyAxMDAwICogNjBcbiAgICAgICAgICAgIGhvdXJzICogMTAwMCAqIDYwICogNjA7IC8vdXNpbmcgMTAwMCAqIDYwICogNjAgaW5zdGVhZCBvZiAzNmU1IHRvIGF2b2lkIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGVycm9ycyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMjk3OFxuICAgICAgICAvLyBCZWNhdXNlIG9mIGRhdGVBZGRSZW1vdmUgdHJlYXRzIDI0IGhvdXJzIGFzIGRpZmZlcmVudCBmcm9tIGFcbiAgICAgICAgLy8gZGF5IHdoZW4gd29ya2luZyBhcm91bmQgRFNULCB3ZSBuZWVkIHRvIHN0b3JlIHRoZW0gc2VwYXJhdGVseVxuICAgICAgICB0aGlzLl9kYXlzID0gK2RheXMgK1xuICAgICAgICAgICAgd2Vla3MgKiA3O1xuICAgICAgICAvLyBJdCBpcyBpbXBvc3NpYmxlIHRvIHRyYW5zbGF0ZSBtb250aHMgaW50byBkYXlzIHdpdGhvdXQga25vd2luZ1xuICAgICAgICAvLyB3aGljaCBtb250aHMgeW91IGFyZSBhcmUgdGFsa2luZyBhYm91dCwgc28gd2UgaGF2ZSB0byBzdG9yZVxuICAgICAgICAvLyBpdCBzZXBhcmF0ZWx5LlxuICAgICAgICB0aGlzLl9tb250aHMgPSArbW9udGhzICtcbiAgICAgICAgICAgIHF1YXJ0ZXJzICogMyArXG4gICAgICAgICAgICB5ZWFycyAqIDEyO1xuXG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcblxuICAgICAgICB0aGlzLl9sb2NhbGUgPSBnZXRMb2NhbGUoKTtcblxuICAgICAgICB0aGlzLl9idWJibGUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0R1cmF0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIER1cmF0aW9uO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic1JvdW5kIChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKC0xICogbnVtYmVyKSAqIC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIG9mZnNldCAodG9rZW4sIHNlcGFyYXRvcikge1xuICAgICAgICBhZGRGb3JtYXRUb2tlbih0b2tlbiwgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMudXRjT2Zmc2V0KCk7XG4gICAgICAgICAgICB2Y
21167XIgc2lnbiA9ICcrJztcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDtcbiAgICAgICAgICAgICAgICBzaWduID0gJy0nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNpZ24gKyB6ZXJvRmlsbCh+fihvZmZzZXQgLyA2MCksIDIpICsgc2VwYXJhdG9yICsgemVyb0ZpbGwofn4ob2Zmc2V0KSAlIDYwLCAyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb2Zmc2V0KCdaJywgJzonKTtcbiAgICBvZmZzZXQoJ1paJywgJycpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignWicsICBtYXRjaFNob3J0T2Zmc2V0KTtcbiAgICBhZGRSZWdleFRva2VuKCdaWicsIG1hdGNoU2hvcnRPZmZzZXQpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydaJywgJ1paJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX3VzZVVUQyA9IHRydWU7XG4gICAgICAgIGNvbmZpZy5fdHptID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyB0aW1lem9uZSBjaHVua2VyXG4gICAgLy8gJysxMDowMCcgPiBbJzEwJywgICcwMCddXG4gICAgLy8gJy0xNTMwJyAgPiBbJy0xNScsICczMCddXG4gICAgdmFyIGNodW5rT2Zmc2V0ID0gLyhbXFwrXFwtXXxcXGRcXGQpL2dpO1xuXG4gICAgZnVuY3Rpb24gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaGVyLCBzdHJpbmcpIHtcbiAgICAgICAgdmFyIG1hdGNoZXMgPSAoc3RyaW5nIHx8ICcnKS5tYXRjaChtYXRjaGVyKTtcblxuICAgICAgICBpZiAobWF0Y2hlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2Y
21167XIgY2h1bmsgICA9IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXSB8fCBbXTtcbiAgICAgICAgdmFyIHBhcnRzICAgPSAoY2h1bmsgKyAnJykubWF0Y2goY2h1bmtPZmZzZXQpIHx8IFsnLScsIDAsIDBdO1xuICAgICAgICB2YXIgbWludXRlcyA9ICsocGFydHNbMV0gKiA2MCkgKyB0b0ludChwYXJ0c1syXSk7XG5cbiAgICAgICAgcmV0dXJuIG1pbnV0ZXMgPT09IDAgP1xuICAgICAgICAgIDAgOlxuICAgICAgICAgIHBhcnRzWzBdID09PSAnKycgPyBtaW51dGVzIDogLW1pbnV0ZXM7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGEgbW9tZW50IGZyb20gaW5wdXQsIHRoYXQgaXMgbG9jYWwvdXRjL3pvbmUgZXF1aXZhbGVudCB0byBtb2RlbC5cbiAgICBmdW5jdGlvbiBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIG1vZGVsKSB7XG4gICAgICAgIHZhciByZXMsIGRpZmY7XG4gICAgICAgIGlmIChtb2RlbC5faXNVVEMpIHtcbiAgICAgICAgICAgIHJlcyA9IG1vZGVsLmNsb25lKCk7XG4gICAgICAgICAgICBkaWZmID0gKGlzTW9tZW50KGlucHV0KSB8fCBpc0RhdGUoaW5wdXQpID8gaW5wdXQudmFsdWVPZigpIDogY3JlYXRlTG9jYWwoaW5wdXQpLnZhbHVlT2YoKSkgLSByZXMudmFsdWVPZigpO1xuICAgICAgICAgICAgLy8gVXNlIGxvdy1sZXZlbCBhcGksIGJlY2F1c2UgdGhpcyBmbiBpcyBsb3ctbGV2ZWwgYXBpLlxuICAgICAgICAgICAgcmVzLl9kLnNldFRpbWUocmVzLl9kLnZhbHVlT2YoKSArIGRpZmYpO1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHJlcywgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVMb2NhbChpbnB1dCkubG9jYWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERhdGVPZmZzZXQgKG0pIHtcbiAgICAgICAgLy8gT24gRmlyZWZveC4yNCBEYXRlI2dldFRpbWV6b25lT2Zmc2V0IHJldHVybnMgYSBmbG9hdGluZyBwb2ludC5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvcHVsbC8xODcxXG4gICAgICAgIHJldHVybiAtTWF0aC5yb3VuZChtLl9kLmdldFRpbWV6b25lT2Zmc2V0KCkgLyAxNSkgKiAxNTtcbiAgICB9XG5cbiAgICAvLyBIT09LU1xuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIG1vbWVudCBpcyBtdXRhdGVkLlxuICAgIC8vIEl0IGlzIGludGVuZGVkIHRvIGtlZXAgdGhlIG9mZnNldCBpbiBzeW5jIHdpdGggdGhlIHRpbWV6b25lLlxuICAgIGhvb2tzLnVwZGF0ZU9mZnNldCA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgLy8ga2VlcExvY2FsVGltZSA9IHRydWUgbWVhbnMgb25seSBjaGFuZ2UgdGhlIHRpbWV6b25lLCB3aXRob3V0XG4gICAgLy8gYWZmZWN0aW5nIHRoZSBsb2NhbCBob3VyLiBTbyA1OjMxOjI2ICswMzAwIC0tW3V0Y09mZnNldCgyLCB0cnVlKV0tLT5cbiAgICAvLyA1OjMxOjI2ICswMjAwIEl0IGlzIHBvc3NpYmxlIHRoYXQgNTozMToyNiBkb2Vzbid0IGV4aXN0IHdpdGggb2Zmc2V0XG4gICAgLy8gKzAyMDAsIHNvIHdlIGFkanVzdCB0aGUgdGltZSBhcyBuZWVkZWQsIHRvIGJlIHZhbGlkLlxuICAgIC8vXG4gICAgLy8gS2VlcGluZyB0aGUgdGltZSBhY3R1YWxseSBhZGRzL3N1YnRyYWN0cyAob25lIGhvdXIpXG4gICAgLy8gZnJvbSB0aGUgYWN0dWFsIHJlcHJlc2VudGVkIHRpbWUuIFRoYXQgaXMgd2h5IHdlIGNhbGwgdXBkYXRlT2Zmc2V0XG4gICAgLy8gYSBzZWNvbmQgdGltZS4gSW4gY2FzZSBpdCB3YW50cyB1cyB0byBjaGFuZ2UgdGhlIG9mZnNldCBhZ2FpblxuICAgIC8vIF9jaGFuZ2VJblByb2dyZXNzID09IHRydWUgY2FzZSwgdGhlbiB3ZSBoYXZlIHRvIGFkanVzdCwgYmVjYXVzZVxuICAgIC8vIHRoZXJlIGlzIG5vIHN1Y2ggdGltZSBpbiB0aGUgZ2l2ZW4gdGltZXpvbmUuXG4gICAgZnVuY3Rpb24gZ2V0U2V0T2Zmc2V0IChpbnB1dCwga2VlcExvY2FsVGltZSwga2VlcE1pbnV0ZXMpIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMuX29mZnNldCB8fCAwLFxuICAgICAgICAgICAgbG9jYWxBZGp1c3Q7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hTaG9ydE9mZnNldCwgaW5wdXQpO1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGlucHV0KSA8IDE2ICYmICFrZWVwTWludXRlcykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQgKiA2MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5faXNVVEMgJiYga2VlcExvY2FsVGltZSkge1xuICAgICAgICAgICAgICAgIGxvY2FsQWRqdXN0ID0gZ2V0RGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX29mZnNldCA9IGlucHV0O1xuICAgICAgICAgICAgdGhpcy5faXNVVEMgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGxvY2FsQWRqdXN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZChsb2NhbEFkanVzdCwgJ20nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvZmZzZXQgIT09IGlucHV0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZWVwTG9jYWxUaW1lIHx8IHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkU3VidHJhY3QodGhpcywgY3JlYXRlRHVyYXRpb24oaW5wdXQgLSBvZmZzZXQsICdtJyksIDEsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9jaGFuZ2VJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgI
21167HRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gb2Zmc2V0IDogZ2V0RGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldFpvbmUgKGlucHV0LCBrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gLWlucHV0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldChpbnB1dCwga2VlcExvY2FsVGltZSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIC10aGlzLnV0Y09mZnNldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9VVEMgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvTG9jYWwgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzVVRDKSB7XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbiAgICAgICAgICAgIHRoaXMuX2lzVVRDID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJ0cmFjdChnZXREYXRlT2Zmc2V0KHRoaXMpLCAnbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvUGFyc2VkT2Zmc2V0ICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3R6bSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCh0aGlzLl90em0sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5faSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhciB0Wm9uZSA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hPZmZzZXQsIHRoaXMuX2kpO1xuICAgICAgICAgICAgaWYgKHRab25lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnV0Y09mZnNldCh0Wm9uZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNBbGlnbmVkSG91ck9mZnNldCAoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0ID0gaW5wdXQgPyBjcmVhdGVMb2NhbChpbnB1dCkudXRjT2Zmc2V0KCkgOiAwO1xuXG4gICAgICAgIHJldHVybiAodGhpcy51dGNPZmZzZXQoKSAtIGlucHV0KSAlIDYwID09PSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRGF5bGlnaHRTYXZpbmdUaW1lICgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KCkgPiB0aGlzLmNsb25lKCkubW9udGgoMCkudXRjT2Zmc2V0KCkgfHxcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KCkgPiB0aGlzLmNsb25lKCkubW9udGgoNSkudXRjT2Zmc2V0KClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RheWxpZ2h0U2F2aW5nVGltZVNoaWZ0ZWQgKCkge1xuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX2lzRFNUU2hpZnRlZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICB2Y
21167XIgYyA9IHt9O1xuXG4gICAgICAgIGNvcHlDb25maWcoYywgdGhpcyk7XG4gICAgICAgIGMgPSBwcmVwYXJlQ29uZmlnKGMpO1xuXG4gICAgICAgIGlmIChjLl9hKSB7XG4gICAgICAgICAgICB2YXIgb3RoZXIgPSBjLl9pc1VUQyA/IGNyZWF0ZVVUQyhjLl9hKSA6IGNyZWF0ZUxvY2FsKGMuX2EpO1xuICAgICAgICAgICAgdGhpcy5faXNEU1RTaGlmdGVkID0gdGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICAgICBjb21wYXJlQXJyYXlzKGMuX2EsIG90aGVyLnRvQXJyYXkoKSkgPiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faXNEU1RTaGlmdGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTG9jYWwgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyAhdGhpcy5faXNVVEMgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1V0Y09mZnNldCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMuX2lzVVRDIDogZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVdGMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9pc1VUQyAmJiB0aGlzLl9vZmZzZXQgPT09IDAgOiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBBU1AuTkVUIGpzb24gZGF0ZSBmb3JtYXQgcmVnZXhcbiAgICB2YXIgYXNwTmV0UmVnZXggPSAvXihcXC18XFwrKT8oPzooXFxkKilbLiBdKT8oXFxkKylcXDooXFxkKykoPzpcXDooXFxkKykoXFwuXFxkKik/KT8kLztcblxuICAgIC8vIGZyb20gaHR0cDovL2RvY3MuY2xvc3VyZS1saWJyYXJ5Lmdvb2dsZWNvZGUuY29tL2dpdC9jbG9zdXJlX2dvb2dfZGF0ZV9kYXRlLmpzLnNvdXJjZS5odG1sXG4gICAgLy8gc29tZXdoYXQgbW9yZSBpbiBsaW5lIHdpdGggNC40LjMuMiAyMDA0IHNwZWMsIGJ1dCBhbGxvd3MgZGVjaW1hbCBhbnl3aGVyZVxuICAgIC8vIGFuZCBmdXJ0aGVyIG1vZGlmaWVkIHRvIGFsbG93IGZvciBzdHJpbmdzIGNvbnRhaW5pbmcgYm90aCB3ZWVrIGFuZCBkYXlcbiAgICB2YXIgaXNvUmVnZXggPSAvXigtfFxcKyk/UCg/OihbLStdP1swLTksLl0qKVkpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVcpPyg/OihbLStdP1swLTksLl0qKUQpPyg/OlQoPzooWy0rXT9bMC05LC5dKilIKT8oPzooWy0rXT9bMC05LC5dKilNKT8oPzooWy0rXT9bMC05LC5dKilTKT8pPyQvO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlRHVyYXRpb24gKGlucHV0LCBrZXkpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gaW5wdXQsXG4gICAgICAgICAgICAvLyBtYXRjaGluZyBhZ2FpbnN0IHJlZ2V4cCBpcyBleHBlbnNpdmUsIGRvIGl0IG9uIGRlbWFuZFxuICAgICAgICAgICAgbWF0Y2ggPSBudWxsLFxuICAgICAgICAgICAgc2lnbixcbiAgICAgICAgICAgIHJldCxcbiAgICAgICAgICAgIGRpZmZSZXM7XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpKSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBtcyA6IGlucHV0Ll9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICAgICAgZCAgOiBpbnB1dC5fZGF5cyxcbiAgICAgICAgICAgICAgICBNICA6IGlucHV0Ll9tb250aHNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uW2tleV0gPSBpbnB1dDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb24ubWlsbGlzZWNvbmRzID0gaW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoISEobWF0Y2ggPSBhc3BOZXRSZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgICAgIHNpZ24gPSAobWF0Y2hbMV0gPT09ICctJykgPyAtMSA6IDE7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB5ICA6IDAsXG4gICAgICAgICAgICAgICAgZCAgOiB0b0ludChtYXRjaFtEQVRFXSkgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgICAgIGggIDogdG9JbnQobWF0Y2hbSE9VUl0pICAgICAgICAgICAgICAgICAgICAgICAgICogc2lnbixcbiAgICAgICAgICAgICAgICBtICA6IHRvSW50KG1hdGNoW01JTlVURV0pICAgICAgICAgICAgICAgICAgICAgICAqIHNpZ24sXG4gICAgICAgICAgICAgICAgcyAgOiB0b0ludChtYXRjaFtTRUNPTkRdKSAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgICAgIG1zIDogdG9JbnQoYWJzUm91bmQobWF0Y2hbTUlMTElTRUNPTkRdICogMTAwMCkpICogc2lnbiAvLyB0aGUgbWlsbGlzZWNvbmQgZGVjaW1hbCBwb2ludCBpcyBpbmNsdWRlZCBpbiB0aGUgbWF0Y2hcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoISEobWF0Y2ggPSBpc29SZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgICAgIHNpZ24gPSAobWF0Y2hbMV0gPT09ICctJykgPyAtMSA6IDE7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB5IDogcGFyc2VJc28obWF0Y2hbMl0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIE0gOiBwYXJzZUlzbyhtYXRjaFszXSwgc2lnbiksXG4gICAgICAgICAgICAgICAgdyA6IHBhcnNlSXNvKG1hdGNoWzRdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBkIDogcGFyc2VJc28obWF0Y2hbNV0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIGggOiBwYXJzZUlzbyhtYXRjaFs2XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgbSA6IHBhcnNlSXNvKG1hdGNoWzddLCBzaWduKSxcbiAgICAgICAgICAgICAgICBzIDogcGFyc2VJc28obWF0Y2hbOF0sIHNpZ24pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGR1cmF0aW9uID09IG51bGwpIHsvLyBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkdXJhdGlvbiA9PT0gJ29iamVjdCcgJiYgKCdmcm9tJyBpbiBkdXJhdGlvbiB8fCAndG8nIGluIGR1cmF0aW9uKSkge1xuICAgICAgICAgICAgZGlmZlJlcyA9IG1vbWVudHNEaWZmZXJlbmNlKGNyZWF0ZUxvY2FsKGR1cmF0aW9uLmZyb20pLCBjcmVhdGVMb2NhbChkdXJhdGlvbi50bykpO1xuXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICAgICAgZHVyYXRpb24ubXMgPSBkaWZmUmVzLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIGR1cmF0aW9uLk0gPSBkaWZmUmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgI
21167HJldCA9IG5ldyBEdXJhdGlvbihkdXJhdGlvbik7XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpICYmIGhhc093blByb3AoaW5wdXQsICdfbG9jYWxlJykpIHtcbiAgICAgICAgICAgIHJldC5fbG9jYWxlID0gaW5wdXQuX2xvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgY3JlYXRlRHVyYXRpb24uZm4gPSBEdXJhdGlvbi5wcm90b3R5cGU7XG4gICAgY3JlYXRlRHVyYXRpb24uaW52YWxpZCA9IGNyZWF0ZUludmFsaWQkMTtcblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvIChpbnAsIHNpZ24pIHtcbiAgICAgICAgLy8gV2UnZCBub3JtYWxseSB1c2Ugfn5pbnAgZm9yIHRoaXMsIGJ1dCB1bmZvcnR1bmF0ZWx5IGl0IGFsc29cbiAgICAgICAgLy8gY29udmVydHMgZmxvYXRzIHRvIGludHMuXG4gICAgICAgIC8vIGlucCBtYXkgYmUgdW5kZWZpbmVkLCBzbyBjYXJlZnVsIGNhbGxpbmcgcmVwbGFjZSBvbiBpdC5cbiAgICAgICAgdmFyIHJlcyA9IGlucCAmJiBwYXJzZUZsb2F0KGlucC5yZXBsYWNlKCcsJywgJy4nKSk7XG4gICAgICAgIC8vIGFwcGx5IHNpZ24gd2hpbGUgd2UncmUgYXQgaXRcbiAgICAgICAgcmV0dXJuIChpc05hTihyZXMpID8gMCA6IHJlcykgKiBzaWduO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlcyA9IHt9O1xuXG4gICAgICAgIHJlcy5tb250aHMgPSBvdGhlci5tb250aCgpIC0gYmFzZS5tb250aCgpICtcbiAgICAgICAgICAgIChvdGhlci55ZWFyKCkgLSBiYXNlLnllYXIoKSkgKiAxMjtcbiAgICAgICAgaWYgKGJhc2UuY2xvbmUoKS5hZGQocmVzLm1vbnRocywgJ00nKS5pc0FmdGVyKG90aGVyKSkge1xuICAgICAgICAgICAgLS1yZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzLm1pbGxpc2Vjb25kcyA9ICtvdGhlciAtICsoYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXM7XG4gICAgICAgIGlmICghKGJhc2UuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7bWlsbGlzZWNvbmRzOiAwLCBtb250aHM6IDB9O1xuICAgICAgICB9XG5cbiAgICAgICAgb3RoZXIgPSBjbG9uZVdpdGhPZmZzZXQob3RoZXIsIGJhc2UpO1xuICAgICAgICBpZiAoYmFzZS5pc0JlZm9yZShvdGhlcikpIHtcbiAgICAgICAgICAgIHJlcyA9IHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzID0gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShvdGhlciwgYmFzZSk7XG4gICAgICAgICAgICByZXMubWlsbGlzZWNvbmRzID0gLXJlcy5taWxsaXNlY29uZHM7XG4gICAgICAgICAgICByZXMubW9udGhzID0gLXJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHJlbW92ZSAnbmFtZScgYXJnIGFmdGVyIGRlcHJlY2F0aW9uIGlzIHJlbW92ZWRcbiAgICBmdW5jdGlvbiBjcmVhdGVBZGRlcihkaXJlY3Rpb24sIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWwsIHBlcmlvZCkge1xuICAgICAgICAgICAgdmFyIGR1ciwgdG1wO1xuICAgICAgICAgICAgLy9pbnZlcnQgdGhlIGFyZ3VtZW50cywgYnV0IGNvbXBsYWluIGFib3V0IGl0XG4gICAgICAgICAgICBpZiAocGVyaW9kICE9PSBudWxsICYmICFpc05hTigrcGVyaW9kKSkge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZShuYW1lLCAnbW9tZW50KCkuJyArIG5hbWUgICsgJyhwZXJpb2QsIG51bWJlcikgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBtb21lbnQoKS4nICsgbmFtZSArICcobnVtYmVyLCBwZXJpb2QpLiAnICtcbiAgICAgICAgICAgICAgICAnU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvYWRkLWludmVydGVkLXBhcmFtLyBmb3IgbW9yZSBpbmZvLicpO1xuICAgICAgICAgICAgICAgIHRtcCA9IHZhbDsgdmFsID0gcGVyaW9kOyBwZXJpb2QgPSB0bXA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbCA9IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gK3ZhbCA6IHZhbDtcbiAgICAgICAgICAgIGR1ciA9IGNyZWF0ZUR1cmF0aW9uKHZhbCwgcGVyaW9kKTtcbiAgICAgICAgICAgIGFkZFN1YnRyYWN0KHRoaXMsIGR1ciwgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFN1YnRyYWN0IChtb20sIGR1cmF0aW9uLCBpc0FkZGluZywgdXBkYXRlT2Zmc2V0KSB7XG4gICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSBkdXJhdGlvbi5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgZGF5cyA9IGFic1JvdW5kKGR1cmF0aW9uLl9kYXlzKSxcbiAgICAgICAgICAgIG1vbnRocyA9IGFic1JvdW5kKGR1cmF0aW9uLl9tb250aHMpO1xuXG4gICAgICAgIGlmICghbW9tLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgLy8gTm8gb3BcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZU9mZnNldCA9IHVwZGF0ZU9mZnNldCA9PSBudWxsID8gdHJ1ZSA6IHVwZGF0ZU9mZnNldDtcblxuICAgICAgICBpZiAobW9udGhzKSB7XG4gICAgICAgICAgICBzZXRNb250aChtb20sIGdldChtb20sICdNb250aCcpICsgbW9udGhzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXlzKSB7XG4gICAgICAgICAgICBzZXQkMShtb20sICdEYXRlJywgZ2V0KG1vbSwgJ0RhdGUnKSArIGRheXMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pbGxpc2Vjb25kcykge1xuICAgICAgICAgICAgbW9tLl9kLnNldFRpbWUobW9tLl9kLnZhbHVlT2YoKSArIG1pbGxpc2Vjb25kcyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlT2Zmc2V0KSB7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQobW9tLCBkYXlzIHx8IG1vbnRocyk7XG4gICAgICAgI
21167H1cbiAgICB9XG5cbiAgICB2YXIgYWRkICAgICAgPSBjcmVhdGVBZGRlcigxLCAnYWRkJyk7XG4gICAgdmFyIHN1YnRyYWN0ID0gY3JlYXRlQWRkZXIoLTEsICdzdWJ0cmFjdCcpO1xuXG4gICAgZnVuY3Rpb24gZ2V0Q2FsZW5kYXJGb3JtYXQobXlNb21lbnQsIG5vdykge1xuICAgICAgICB2YXIgZGlmZiA9IG15TW9tZW50LmRpZmYobm93LCAnZGF5cycsIHRydWUpO1xuICAgICAgICByZXR1cm4gZGlmZiA8IC02ID8gJ3NhbWVFbHNlJyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IC0xID8gJ2xhc3RXZWVrJyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IDAgPyAnbGFzdERheScgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCAxID8gJ3NhbWVEYXknIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgMiA/ICduZXh0RGF5JyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IDcgPyAnbmV4dFdlZWsnIDogJ3NhbWVFbHNlJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxlbmRhciQxICh0aW1lLCBmb3JtYXRzKSB7XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gY29tcGFyZSB0aGUgc3RhcnQgb2YgdG9kYXksIHZzIHRoaXMuXG4gICAgICAgIC8vIEdldHRpbmcgc3RhcnQtb2YtdG9kYXkgZGVwZW5kcyBvbiB3aGV0aGVyIHdlJ3JlIGxvY2FsL3V0Yy9vZmZzZXQgb3Igbm90LlxuICAgICAgICB2YXIgbm93ID0gdGltZSB8fCBjcmVhdGVMb2NhbCgpLFxuICAgICAgICAgICAgc29kID0gY2xvbmVXaXRoT2Zmc2V0KG5vdywgdGhpcykuc3RhcnRPZignZGF5JyksXG4gICAgICAgICAgICBmb3JtYXQgPSBob29rcy5jYWxlbmRhckZvcm1hdCh0aGlzLCBzb2QpIHx8ICdzYW1lRWxzZSc7XG5cbiAgICAgICAgdmFyIG91dHB1dCA9IGZvcm1hdHMgJiYgKGlzRnVuY3Rpb24oZm9ybWF0c1tmb3JtYXRdKSA/IGZvcm1hdHNbZm9ybWF0XS5jYWxsKHRoaXMsIG5vdykgOiBmb3JtYXRzW2Zvcm1hdF0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChvdXRwdXQgfHwgdGhpcy5sb2NhbGVEYXRhKCkuY2FsZW5kYXIoZm9ybWF0LCB0aGlzLCBjcmVhdGVMb2NhbChub3cpKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmUgKCkge1xuICAgICAgICByZXR1cm4gbmV3IE1vbWVudCh0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0FmdGVyIChpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KTtcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cykgfHwgJ21pbGxpc2Vjb25kJztcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPiBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbElucHV0LnZhbHVlT2YoKSA8IHRoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKS52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0JlZm9yZSAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpIDwgbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmVuZE9mKHVuaXRzKS52YWx1ZU9mKCkgPCBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQmV0d2VlbiAoZnJvbSwgdG8sIHVuaXRzLCBpbmNsdXNpdml0eSkge1xuICAgICAgICB2Y
21167XIgbG9jYWxGcm9tID0gaXNNb21lbnQoZnJvbSkgPyBmcm9tIDogY3JlYXRlTG9jYWwoZnJvbSksXG4gICAgICAgICAgICBsb2NhbFRvID0gaXNNb21lbnQodG8pID8gdG8gOiBjcmVhdGVMb2NhbCh0byk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsRnJvbS5pc1ZhbGlkKCkgJiYgbG9jYWxUby5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaW5jbHVzaXZpdHkgPSBpbmNsdXNpdml0eSB8fCAnKCknO1xuICAgICAgICByZXR1cm4gKGluY2x1c2l2aXR5WzBdID09PSAnKCcgPyB0aGlzLmlzQWZ0ZXIobG9jYWxGcm9tLCB1bml0cykgOiAhdGhpcy5pc0JlZm9yZShsb2NhbEZyb20sIHVuaXRzKSkgJiZcbiAgICAgICAgICAgIChpbmNsdXNpdml0eVsxXSA9PT0gJyknID8gdGhpcy5pc0JlZm9yZShsb2NhbFRvLCB1bml0cykgOiAhdGhpcy5pc0FmdGVyKGxvY2FsVG8sIHVuaXRzKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lIChpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KSxcbiAgICAgICAgICAgIGlucHV0TXM7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpID09PSBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0TXMgPSBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykudmFsdWVPZigpIDw9IGlucHV0TXMgJiYgaW5wdXRNcyA8PSB0aGlzLmNsb25lKCkuZW5kT2YodW5pdHMpLnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU2FtZU9yQWZ0ZXIgKGlucHV0LCB1bml0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NhbW
21167UoaW5wdXQsIHVuaXRzKSB8fCB0aGlzLmlzQWZ0ZXIoaW5wdXQsIHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWVPckJlZm9yZSAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNCZWZvcmUoaW5wdXQsIHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkaWZmIChpbnB1dCwgdW5pdHMsIGFzRmxvYXQpIHtcbiAgICAgICAgdmFyIHRoYXQsXG4gICAgICAgICAgICB6b25lRGVsdGEsXG4gICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoYXQgPSBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIHRoaXMpO1xuXG4gICAgICAgIGlmICghdGhhdC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB6b25lRGVsdGEgPSAodGhhdC51dGNPZmZzZXQoKSAtIHRoaXMudXRjT2Zmc2V0KCkpICogNmU0O1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOiBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCkgLyAxMjsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6IG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzogb3V0cHV0ID0gbW9udGhEaWZmKHRoaXMsIHRoYXQpIC8gMzsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOiBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gMWUzOyBicmVhazsgLy8gMTAwMFxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzogb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDZlNDsgYnJlYWs7IC8vIDEwMDAgKiA2MFxuICAgICAgICAgICAgY2FzZSAnaG91cic6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyAzNmU1OyBicmVhazsgLy8gMTAwMCAqIDYwICogNjBcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCAtIHpvbmVEZWx0YSkgLyA4NjRlNTsgYnJlYWs7IC8vIDEwMDAgKiA2MCAqIDYwICogMjQsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOiBvdXRwdXQgPSAodGhpcyAtIHRoYXQgLSB6b25lRGVsdGEpIC8gNjA0OGU1OyBicmVhazsgLy8gMTAwMCAqIDYwICogNjAgKiAyNCAqIDcsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGRlZmF1bHQ6IG91dHB1dCA9IHRoaXMgLSB0aGF0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFzRmxvYXQgPyBvdXRwdXQgOiBhYnNGbG9vcihvdXRwdXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoRGlmZiAoYSwgYikge1xuICAgICAgICAvLyBkaWZmZXJlbmNlIGluIG1vbnRoc1xuICAgICAgICB2Y
21167XIgd2hvbGVNb250aERpZmYgPSAoKGIueWVhcigpIC0gYS55ZWFyKCkpICogMTIpICsgKGIubW9udGgoKSAtIGEubW9udGgoKSksXG4gICAgICAgICAgICAvLyBiIGlzIGluIChhbmNob3IgLSAxIG1vbnRoLCBhbmNob3IgKyAxIG1vbnRoKVxuICAgICAgICAgICAgYW5jaG9yID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiwgJ21vbnRocycpLFxuICAgICAgICAgICAgYW5jaG9yMiwgYWRqdXN0O1xuXG4gICAgICAgIGlmIChiIC0gYW5jaG9yIDwgMCkge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgLSAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvciAtIGFuY2hvcjIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgKyAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvcjIgLSBhbmNob3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBmb3IgbmVnYXRpdmUgemVybywgcmV0dXJuIHplcm8gaWYgbmVnYXRpdmUgemVyb1xuICAgICAgICByZXR1cm4gLSh3aG9sZU1vbnRoRGlmZiArIGFkanVzdCkgfHwgMDtcbiAgICB9XG5cbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0ID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0VXRjID0gJ1lZWVktTU0tRERUSEg6bW06c3NbWl0nO1xuXG4gICAgZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmxvY2FsZSgnZW4nKS5mb3JtYXQoJ2RkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmc
21167oa2VlcE9mZnNldCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdXRjID0ga2VlcE9mZnNldCAhPT0gdHJ1ZTtcbiAgICAgICAgdmFyIG0gPSB1dGMgPyB0aGlzLmNsb25lKCkudXRjKCkgOiB0aGlzO1xuICAgICAgICBpZiAobS55ZWFyKCkgPCAwIHx8IG0ueWVhcigpID4gOTk5OSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE1vbWVudChtLCB1dGMgPyAnWVlZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyA6ICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NaJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpKSB7XG4gICAgICAgICAgICAvLyBuYXRpdmUgaW1wbGVtZW50YXRpb24gaXMgfjUweCBmYXN0ZXIsIHVzZSBpdCB3aGVuIHdlIGNhblxuICAgICAgICAgICAgaWYgKHV0Yykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSArIHRoaXMudXRjT2Zmc2V0KCkgKiA2MCAqIDEwMDApLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgnWicsIGZvcm1hdE1vbWVudChtLCAnWicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KG0sIHV0YyA/ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyA6ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTWicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9tZW50IHRoYXQgY2FuXG4gICAgICogYWxzbyBiZSBldmFsdWF0ZWQgdG8gZ2V0IGEgbmV3IG1vbWVudCB3aGljaCBpcyB0aGUgc2FtZVxuICAgICAqXG4gICAgICogQGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0L2RvY3MvYXBpL3V0aWwuaHRtbCN1dGlsX2N1c3RvbV9pbnNwZWN0X2Z1bmN0aW9uX29uX29iamVjdHNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuICdtb21lbnQuaW52YWxpZCgvKiAnICsgdGhpcy5faSArICcgKi8pJztcbiAgICAgICAgfVxuICAgICAgICB2Y
21167XIgZnVuYyA9ICdtb21lbnQnO1xuICAgICAgICB2YXIgem9uZSA9ICcnO1xuICAgICAgICBpZiAoIXRoaXMuaXNMb2NhbCgpKSB7XG4gICAgICAgICAgICBmdW5jID0gdGhpcy51dGNPZmZzZXQoKSA9PT0gMCA/ICdtb21lbnQudXRjJyA6ICdtb21lbnQucGFyc2Vab25lJztcbiAgICAgICAgICAgIHpvbmUgPSAnWic7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZWZpeCA9ICdbJyArIGZ1bmMgKyAnKFwiXSc7XG4gICAgICAgIHZhciB5ZWFyID0gKDAgPD0gdGhpcy55ZWFyKCkgJiYgdGhpcy55ZWFyKCkgPD0gOTk5OSkgPyAnWVlZWScgOiAnWVlZWVlZJztcbiAgICAgICAgdmFyIGRhdGV0aW1lID0gJy1NTS1ERFtUXUhIOm1tOnNzLlNTUyc7XG4gICAgICAgIHZhciBzdWZmaXggPSB6b25lICsgJ1tcIildJztcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQocHJlZml4ICsgeWVhciArIGRhdGV0aW1lICsgc3VmZml4KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQgKGlucHV0U3RyaW5nKSB7XG4gICAgICAgIGlmICghaW5wdXRTdHJpbmcpIHtcbiAgICAgICAgICAgIGlucHV0U3RyaW5nID0gdGhpcy5pc1V0YygpID8gaG9va3MuZGVmYXVsdEZvcm1hdFV0YyA6IGhvb2tzLmRlZmF1bHRGb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IGZvcm1hdE1vbWVudCh0aGlzLCBpbnB1dFN0cmluZyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbSAodGltZSwgd2l0aG91dFN1ZmZpeCkge1xuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICAgICAoKGlzTW9tZW50KHRpbWUpICYmIHRpbWUuaXNWYWxpZCgpKSB8fFxuICAgICAgICAgICAgICAgICBjcmVhdGVMb2NhbCh0aW1lKS5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oe3RvOiB0aGlzLCBmcm9tOiB0aW1lfSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCF3aXRob3V0U3VmZml4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbU5vdyAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tKGNyZWF0ZUxvY2FsKCksIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvICh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8XG4gICAgICAgICAgICAgICAgIGNyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih7ZnJvbTogdGhpcywgdG86IHRpbWV9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b05vdyAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy50byhjcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG5cbiAgICAvLyBJZiBwYXNzZWQgYSBsb2NhbGUga2V5LCBpdCB3aWxsIHNldCB0aGUgbG9jYWxlIGZvciB0aGlzXG4gICAgLy8gaW5zdGFuY2UuICBPdGhlcndpc2UsIGl0IHdpbGwgcmV0dXJuIHRoZSBsb2NhbGUgY29uZmlndXJhdGlvblxuICAgIC8vIHZhcmlhYmxlcyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICBmdW5jdGlvbiBsb2NhbGUgKGtleSkge1xuICAgICAgICB2Y
21167XIgbmV3TG9jYWxlRGF0YTtcblxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdMb2NhbGVEYXRhID0gZ2V0TG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobmV3TG9jYWxlRGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gbmV3TG9jYWxlRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxhbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS5sYW5nKCkgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIG1vbWVudCgpLmxvY2FsZURhdGEoKSB0byBnZXQgdGhlIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24uIFVzZSBtb21lbnQoKS5sb2NhbGUoKSB0byBjaGFuZ2UgbGFuZ3VhZ2VzLicsXG4gICAgICAgIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gICAgfVxuXG4gICAgdmFyIE1TX1BFUl9TRUNPTkQgPSAxMDAwO1xuICAgIHZhciBNU19QRVJfTUlOVVRFID0gNjAgKiBNU19QRVJfU0VDT05EO1xuICAgIHZhciBNU19QRVJfSE9VUiA9IDYwICogTVNfUEVSX01JTlVURTtcbiAgICB2YXIgTVNfUEVSXzQwMF9ZRUFSUyA9ICgzNjUgKiA0MDAgKyA5NykgKiAyNCAqIE1TX1BFUl9IT1VSO1xuXG4gICAgLy8gYWN0dWFsIG1vZHVsbyAtIGhhbmRsZXMgbmVnYXRpdmUgbnVtYmVycyAoZm9yIGRhdGVzIGJlZm9yZSAxOTcwKTpcbiAgICBmdW5jdGlvbiBtb2QkMShkaXZpZGVuZCwgZGl2aXNvcikge1xuICAgICAgICByZXR1cm4gKGRpdmlkZW5kICUgZGl2aXNvciArIGRpdmlzb3IpICUgZGl2aXNvcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbFN0YXJ0T2ZEYXRlKHksIG0sIGQpIHtcbiAgICAgICAgLy8gdGhlIGRhdGUgY29uc3RydWN0b3IgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh5ICsgNDAwLCBtLCBkKSAtIE1TX1BFUl80MDBfWUVBUlM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeSwgbSwgZCkudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXRjU3RhcnRPZkRhdGUoeSwgbSwgZCkge1xuICAgICAgICAvLyBEYXRlLlVUQyByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBwcmVzZXJ2ZSBsZWFwIHllYXJzIHVzaW5nIGEgZnVsbCA0MDAgeWVhciBjeWNsZSwgdGhlbiByZXNldFxuICAgICAgICAgICAgcmV0dXJuIERhdGUuVVRDKHkgKyA0MDAsIG0sIGQpIC0gTVNfUEVSXzQwMF9ZRUFSUztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBEYXRlLlVUQyh5LCBtLCBkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0YXJ0T2YgKHVuaXRzKSB7XG4gICAgICAgIHZhciB0aW1lO1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSB1bmRlZmluZWQgfHwgdW5pdHMgPT09ICdtaWxsaXNlY29uZCcgfHwgIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdGFydE9mRGF0ZSA9IHRoaXMuX2lzVVRDID8gdXRjU3RhcnRPZkRhdGUgOiBsb2NhbFN0YXJ0T2ZEYXRlO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgMCwgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSAtIHRoaXMubW9udGgoKSAlIDMsIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSAtIHRoaXMud2Vla2RheSgpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSAtICh0aGlzLmlzb1dlZWtkYXkoKSAtIDEpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSwgdGhpcy5kYXRlKCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgLT0gbW9kJDEodGltZSArICh0aGlzLl9pc1VUQyA/IDAgOiB0aGlzLnV0Y09mZnNldCgpICogTVNfUEVSX01JTlVURSksIE1TX1BFUl9IT1VSKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgI
21167HRpbWUgLT0gbW9kJDEodGltZSwgTVNfUEVSX01JTlVURSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lIC09IG1vZCQxKHRpbWUsIE1TX1BFUl9TRUNPTkQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZC5zZXRUaW1lKHRpbWUpO1xuICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZE9mICh1bml0cykge1xuICAgICAgICB2YXIgdGltZTtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmICh1bml0cyA9PT0gdW5kZWZpbmVkIHx8IHVuaXRzID09PSAnbWlsbGlzZWNvbmQnIHx8ICF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RhcnRPZkRhdGUgPSB0aGlzLl9pc1VUQyA/IHV0Y1N0YXJ0T2ZEYXRlIDogbG9jYWxTdGFydE9mRGF0ZTtcblxuICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCkgKyAxLCAwLCAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSAtIHRoaXMubW9udGgoKSAlIDMgKyAzLCAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkgKyAxLCAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSwgdGhpcy5kYXRlKCkgLSB0aGlzLndlZWtkYXkoKSArIDcpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSAtICh0aGlzLmlzb1dlZWtkYXkoKSAtIDEpICsgNykgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSArIDEpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9IE1TX1BFUl9IT1VSIC0gbW9kJDEodGltZSArICh0aGlzLl9pc1VUQyA/IDAgOiB0aGlzLnV0Y09mZnNldCgpICogTVNfUEVSX01JTlVURSksIE1TX1BFUl9IT1VSKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9IE1TX1BFUl9NSU5VVEUgLSBtb2QkMSh0aW1lLCBNU19QRVJfTUlOVVRFKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9IE1TX1BFUl9TRUNPTkQgLSBtb2QkMSh0aW1lLCBNU19QRVJfU0VDT05EKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kLnNldFRpbWUodGltZSk7XG4gICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsdWVPZiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kLnZhbHVlT2YoKSAtICgodGhpcy5fb2Zmc2V0IHx8IDApICogNjAwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVuaXggKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKSAvIDEwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvRGF0ZSAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9BcnJheSAoKSB7XG4gICAgICAgIHZhciBtID0gdGhpcztcbiAgICAgICAgcmV0dXJuIFttLnllYXIoKSwgbS5tb250aCgpLCBtLmRhdGUoKSwgbS5ob3VyKCksIG0ubWludXRlKCksIG0uc2Vjb25kKCksIG0ubWlsbGlzZWNvbmQoKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9PYmplY3QgKCkge1xuICAgICAgICB2Y
21167XIgbSA9IHRoaXM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5ZWFyczogbS55ZWFyKCksXG4gICAgICAgICAgICBtb250aHM6IG0ubW9udGgoKSxcbiAgICAgICAgICAgIGRhdGU6IG0uZGF0ZSgpLFxuICAgICAgICAgICAgaG91cnM6IG0uaG91cnMoKSxcbiAgICAgICAgICAgIG1pbnV0ZXM6IG0ubWludXRlcygpLFxuICAgICAgICAgICAgc2Vjb25kczogbS5zZWNvbmRzKCksXG4gICAgICAgICAgICBtaWxsaXNlY29uZHM6IG0ubWlsbGlzZWNvbmRzKClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0pTT04gKCkge1xuICAgICAgICAvLyBuZXcgRGF0ZShOYU4pLnRvSlNPTigpID09PSBudWxsXG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMudG9JU09TdHJpbmcoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZCQyICgpIHtcbiAgICAgICAgcmV0dXJuIGlzVmFsaWQodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2luZ0ZsYWdzICgpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgZ2V0UGFyc2luZ0ZsYWdzKHRoaXMpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnZhbGlkQXQgKCkge1xuICAgICAgICByZXR1cm4gZ2V0UGFyc2luZ0ZsYWdzKHRoaXMpLm92ZXJmbG93O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0aW9uRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlucHV0OiB0aGlzLl9pLFxuICAgICAgICAgICAgZm9ybWF0OiB0aGlzLl9mLFxuICAgICAgICAgICAgbG9jYWxlOiB0aGlzLl9sb2NhbGUsXG4gICAgICAgICAgICBpc1VUQzogdGhpcy5faXNVVEMsXG4gICAgICAgICAgICBzdHJpY3Q6IHRoaXMuX3N0cmljdFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnZ2cnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53ZWVrWWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydHRycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzb1dlZWtZZWFyKCkgJSAxMDA7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBhZGRXZWVrWWVhckZvcm1hdFRva2VuICh0b2tlbiwgZ2V0dGVyKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKDAsIFt0b2tlbiwgdG9rZW4ubGVuZ3RoXSwgMCwgZ2V0dGVyKTtcbiAgICB9XG5cbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdnZ2dnJywgICAgICd3ZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ2dnZ2dnJywgICAgJ3dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignR0dHRycsICAnaXNvV2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdHR0dHRycsICdpc29XZWVrWWVhcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd3ZWVrWWVhcicsICdnZycpO1xuICAgIGFkZFVuaXRBbGlhcygnaXNvV2Vla1llYXInLCAnR0cnKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ3dlZWtZZWFyJywgMSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrWWVhcicsIDEpO1xuXG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdHJywgICAgICBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignZycsICAgICAgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHJywgICAgIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdnZycsICAgICBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignR0dHRycsICAgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnZ2cnLCAgIG1hdGNoMXRvNCwgbWF0Y2g0KTtcbiAgICBhZGRSZWdleFRva2VuKCdHR0dHRycsICBtYXRjaDF0bzYsIG1hdGNoNik7XG4gICAgYWRkUmVnZXhUb2tlbignZ2dnZ2cnLCAgbWF0Y2gxdG82LCBtYXRjaDYpO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydnZ2dnJywgJ2dnZ2dnJywgJ0dHR0cnLCAnR0dHR0cnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW4uc3Vic3RyKDAsIDIpXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZ2cnLCAnR0cnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW5dID0gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0V2Vla1llYXIgKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRTZXRXZWVrWWVhckhlbHBlci5jYWxsKHRoaXMsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgdGhpcy53ZWVrKCksXG4gICAgICAgICAgICAgICAgdGhpcy53ZWVrZGF5KCksXG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93LFxuICAgICAgICAgICAgICAgIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRveSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPV2Vla1llYXIgKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRTZXRXZWVrWWVhckhlbHBlci5jYWxsKHRoaXMsXG4gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMuaXNvV2VlaygpLCB0aGlzLmlzb1dlZWtkYXkoKSwgMSwgNCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SVNPV2Vla3NJblllYXIgKCkge1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy55ZWFyKCksIDEsIDQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFdlZWtzSW5ZZWFyICgpIHtcbiAgICAgICAgdmFyIHdlZWtJbmZvID0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWs7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgd2Vla0luZm8uZG93LCB3ZWVrSW5mby5kb3kpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWtZZWFySGVscGVyKGlucHV0LCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgICAgICB2Y
21167XIgd2Vla3NUYXJnZXQ7XG4gICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Vla09mWWVhcih0aGlzLCBkb3csIGRveSkueWVhcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdlZWtzVGFyZ2V0ID0gd2Vla3NJblllYXIoaW5wdXQsIGRvdywgZG95KTtcbiAgICAgICAgICAgIGlmICh3ZWVrID4gd2Vla3NUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICB3ZWVrID0gd2Vla3NUYXJnZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2V0V2Vla0FsbC5jYWxsKHRoaXMsIGlucHV0LCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRXZWVrQWxsKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgICAgICB2YXIgZGF5T2ZZZWFyRGF0YSA9IGRheU9mWWVhckZyb21XZWVrcyh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpLFxuICAgICAgICAgICAgZGF0ZSA9IGNyZWF0ZVVUQ0RhdGUoZGF5T2ZZZWFyRGF0YS55ZWFyLCAwLCBkYXlPZlllYXJEYXRhLmRheU9mWWVhcik7XG5cbiAgICAgICAgdGhpcy55ZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSk7XG4gICAgICAgIHRoaXMubW9udGgoZGF0ZS5nZXRVVENNb250aCgpKTtcbiAgICAgICAgdGhpcy5kYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1EnLCAwLCAnUW8nLCAncXVhcnRlcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdxdWFydGVyJywgJ1EnKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ3F1YXJ0ZXInLCA3KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1EnLCBtYXRjaDEpO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1EnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W01PTlRIXSA9ICh0b0ludChpbnB1dCkgLSAxKSAqIDM7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRRdWFydGVyIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IE1hdGguY2VpbCgodGhpcy5tb250aCgpICsgMSkgLyAzKSA6IHRoaXMubW9udGgoKGlucHV0IC0gMSkgKiAzICsgdGhpcy5tb250aCgpICUgMyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0QnLCBbJ0REJywgMl0sICdEbycsICdkYXRlJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2RhdGUnLCAnRCcpO1xuXG4gICAgLy8gUFJJT1JJVFlcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2RhdGUnLCA5KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0QnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdERCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdEbycsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBcIm9yZGluYWxQYXJzZVwiIGZhbGxiYWNrIGluIG5leHQgbWFqb3IgcmVsZWFzZS5cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0ID9cbiAgICAgICAgICAobG9jYWxlLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlIHx8IGxvY2FsZS5fb3JkaW5hbFBhcnNlKSA6XG4gICAgICAgICAgbG9jYWxlLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudDtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydEJywgJ0REJ10sIERBVEUpO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0RvJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtEQVRFXSA9IHRvSW50KGlucHV0Lm1hdGNoKG1hdGNoMXRvMilbMF0pO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldERheU9mTW9udGggPSBtYWtlR2V0U2V0KCdEYXRlJywgdHJ1ZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignREREJywgWydEREREJywgM10sICdERERvJywgJ2RheU9mWWVhcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdkYXlPZlllYXInLCAnREREJyk7XG5cbiAgICAvLyBQUklPUklUWVxuICAgIGFkZFVuaXRQcmlvcml0eSgnZGF5T2ZZZWFyJywgNCk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdEREQnLCAgbWF0Y2gxdG8zKTtcbiAgICBhZGRSZWdleFRva2VuKCdEREREJywgbWF0Y2gzKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnREREJywgJ0REREQnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0RGF5T2ZZZWFyIChpbnB1dCkge1xuICAgICAgICB2Y
21167XIgZGF5T2ZZZWFyID0gTWF0aC5yb3VuZCgodGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpIC0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ3llYXInKSkgLyA4NjRlNSkgKyAxO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IGRheU9mWWVhciA6IHRoaXMuYWRkKChpbnB1dCAtIGRheU9mWWVhciksICdkJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ20nLCBbJ21tJywgMl0sIDAsICdtaW51dGUnKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnbWludXRlJywgJ20nKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ21pbnV0ZScsIDE0KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ20nLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdtbScsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnbScsICdtbSddLCBNSU5VVEUpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldE1pbnV0ZSA9IG1ha2VHZXRTZXQoJ01pbnV0ZXMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigncycsIFsnc3MnLCAyXSwgMCwgJ3NlY29uZCcpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdzZWNvbmQnLCAncycpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnc2Vjb25kJywgMTUpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigncycsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3NzJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydzJywgJ3NzJ10sIFNFQ09ORCk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0U2Vjb25kID0gbWFrZUdldFNldCgnU2Vjb25kcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdTJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gfn4odGhpcy5taWxsaXNlY29uZCgpIC8gMTAwKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1MnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gfn4odGhpcy5taWxsaXNlY29uZCgpIC8gMTApO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1MnLCAzXSwgMCwgJ21pbGxpc2Vjb25kJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTJywgNF0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1MnLCA1XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTJywgNl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTJywgN10sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTU1MnLCA4XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTU1NTJywgOV0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwMDA7XG4gICAgfSk7XG5cblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnbWlsbGlzZWNvbmQnLCAnbXMnKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ21pbGxpc2Vjb25kJywgMTYpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignUycsICAgIG1hdGNoMXRvMywgbWF0Y2gxKTtcbiAgICBhZGRSZWdleFRva2VuKCdTUycsICAgbWF0Y2gxdG8zLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1NTUycsICBtYXRjaDF0bzMsIG1hdGNoMyk7XG5cbiAgICB2YXIgdG9rZW47XG4gICAgZm9yICh0b2tlbiA9ICdTU1NTJzsgdG9rZW4ubGVuZ3RoIDw9IDk7IHRva2VuICs9ICdTJykge1xuICAgICAgICBhZGRSZWdleFRva2VuKHRva2VuLCBtYXRjaFVuc2lnbmVkKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZU1zKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNSUxMSVNFQ09ORF0gPSB0b0ludCgoJzAuJyArIGlucHV0KSAqIDEwMDApO1xuICAgIH1cblxuICAgIGZvciAodG9rZW4gPSAnUyc7IHRva2VuLmxlbmd0aCA8PSA5OyB0b2tlbiArPSAnUycpIHtcbiAgICAgICAgYWRkUGFyc2VUb2tlbih0b2tlbiwgcGFyc2VNcyk7XG4gICAgfVxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRNaWxsaXNlY29uZCA9IG1ha2VHZXRTZXQoJ01pbGxpc2Vjb25kcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCd6JywgIDAsIDAsICd6b25lQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd6eicsIDAsIDAsICd6b25lTmFtZScpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0Wm9uZUFiYnIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnVVRDJyA6ICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFpvbmVOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gJ0Nvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lJyA6ICcnO1xuICAgIH1cblxuICAgIHZhciBwcm90byA9IE1vbWVudC5wcm90b3R5cGU7XG5cbiAgICBwcm90by5hZGQgICAgICAgICAgICAgICA9IGFkZDtcbiAgICBwcm90by5jYWxlbmRhciAgICAgICAgICA9IGNhbGVuZGFyJDE7XG4gICAgcHJvdG8uY2xvbmUgICAgICAgICAgICAgPSBjbG9uZTtcbiAgICBwcm90by5kaWZmICAgICAgICAgICAgICA9IGRpZmY7XG4gICAgcHJvdG8uZW5kT2YgICAgICAgICAgICAgPSBlbmRPZjtcbiAgICBwcm90by5mb3JtYXQgICAgICAgICAgICA9IGZvcm1hdDtcbiAgICBwcm90by5mcm9tICAgICAgICAgICAgICA9IGZyb207XG4gICAgcHJvdG8uZnJvbU5vdyAgICAgICAgICAgPSBmcm9tTm93O1xuICAgIHByb3RvLnRvICAgICAgICAgICAgICAgID0gdG87XG4gICAgcHJvdG8udG9Ob3cgICAgICAgICAgICAgPSB0b05vdztcbiAgICBwcm90by5nZXQgICAgICAgICAgICAgICA9IHN0cmluZ0dldDtcbiAgICBwcm90by5pbnZhbGlkQXQgICAgICAgICA9IGludmFsaWRBdDtcbiAgICBwcm90by5pc0FmdGVyICAgICAgICAgICA9IGlzQWZ0ZXI7XG4gICAgcHJvdG8uaXNCZWZvcmUgICAgICAgICAgPSBpc0JlZm9yZTtcbiAgICBwcm90by5pc0JldHdlZW4gICAgICAgICA9IGlzQmV0d2VlbjtcbiAgICBwcm90by5pc1NhbW
21167UgICAgICAgICAgICA9IGlzU2FtZTtcbiAgICBwcm90by5pc1NhbWVPckFmdGVyICAgICA9IGlzU2FtZU9yQWZ0ZXI7XG4gICAgcHJvdG8uaXNTYW1lT3JCZWZvcmUgICAgPSBpc1NhbWVPckJlZm9yZTtcbiAgICBwcm90by5pc1ZhbGlkICAgICAgICAgICA9IGlzVmFsaWQkMjtcbiAgICBwcm90by5sYW5nICAgICAgICAgICAgICA9IGxhbmc7XG4gICAgcHJvdG8ubG9jYWxlICAgICAgICAgICAgPSBsb2NhbGU7XG4gICAgcHJvdG8ubG9jYWxlRGF0YSAgICAgICAgPSBsb2NhbGVEYXRhO1xuICAgIHByb3RvLm1heCAgICAgICAgICAgICAgID0gcHJvdG90eXBlTWF4O1xuICAgIHByb3RvLm1pbiAgICAgICAgICAgICAgID0gcHJvdG90eXBlTWluO1xuICAgIHByb3RvLnBhcnNpbmdGbGFncyAgICAgID0gcGFyc2luZ0ZsYWdzO1xuICAgIHByb3RvLnNldCAgICAgICAgICAgICAgID0gc3RyaW5nU2V0O1xuICAgIHByb3RvLnN0YXJ0T2YgICAgICAgICAgID0gc3RhcnRPZjtcbiAgICBwcm90by5zdWJ0cmFjdCAgICAgICAgICA9IHN1YnRyYWN0O1xuICAgIHByb3RvLnRvQXJyYXkgICAgICAgICAgID0gdG9BcnJheTtcbiAgICBwcm90by50b09iamVjdCAgICAgICAgICA9IHRvT2JqZWN0O1xuICAgIHByb3RvLnRvRGF0ZSAgICAgICAgICAgID0gdG9EYXRlO1xuICAgIHByb3RvLnRvSVNPU3RyaW5nICAgICAgID0gdG9JU09TdHJpbmc7XG4gICAgcHJvdG8uaW5zcGVjdCAgICAgICAgICAgPSBpbnNwZWN0O1xuICAgIHByb3RvLnRvSlNPTiAgICAgICAgICAgID0gdG9KU09OO1xuICAgIHByb3RvLnRvU3RyaW5nICAgICAgICAgID0gdG9TdHJpbmc7XG4gICAgcHJvdG8udW5peCAgICAgICAgICAgICAgPSB1bml4O1xuICAgIHByb3RvLnZhbHVlT2YgICAgICAgICAgID0gdmFsdWVPZjtcbiAgICBwcm90by5jcmVhdGlvbkRhdGEgICAgICA9IGNyZWF0aW9uRGF0YTtcbiAgICBwcm90by55ZWFyICAgICAgID0gZ2V0U2V0WWVhcjtcbiAgICBwcm90by5pc0xlYXBZZWFyID0gZ2V0SXNMZWFwWWVhcjtcbiAgICBwcm90by53ZWVrWWVhciAgICA9IGdldFNldFdlZWtZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtZZWFyID0gZ2V0U2V0SVNPV2Vla1llYXI7XG4gICAgcHJvdG8ucXVhcnRlciA9IHByb3RvLnF1YXJ0ZXJzID0gZ2V0U2V0UXVhcnRlcjtcbiAgICBwcm90by5tb250aCAgICAgICA9IGdldFNldE1vbnRoO1xuICAgIHByb3RvLmRheXNJbk1vbnRoID0gZ2V0RGF5c0luTW9udGg7XG4gICAgcHJvdG8ud2VlayAgICAgICAgICAgPSBwcm90by53ZWVrcyAgICAgICAgPSBnZXRTZXRXZWVrO1xuICAgIHByb3RvLmlzb1dlZWsgICAgICAgID0gcHJvdG8uaXNvV2Vla3MgICAgID0gZ2V0U2V0SVNPV2VlaztcbiAgICBwcm90by53ZWVrc0luWWVhciAgICA9IGdldFdlZWtzSW5ZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtzSW5ZZWFyID0gZ2V0SVNPV2Vla3NJblllYXI7XG4gICAgcHJvdG8uZGF0ZSAgICAgICA9IGdldFNldERheU9mTW9udGg7XG4gICAgcHJvdG8uZGF5ICAgICAgICA9IHByb3RvLmRheXMgICAgICAgICAgICAgPSBnZXRTZXREYXlPZldlZWs7XG4gICAgcHJvdG8ud2Vla2RheSAgICA9IGdldFNldExvY2FsZURheU9mV2VlaztcbiAgICBwcm90by5pc29XZWVrZGF5ID0gZ2V0U2V0SVNPRGF5T2ZXZWVrO1xuICAgIHByb3RvLmRheU9mWWVhciAgPSBnZXRTZXREYXlPZlllYXI7XG4gICAgcHJvdG8uaG91ciA9IHByb3RvLmhvdXJzID0gZ2V0U2V0SG91cjtcbiAgICBwcm90by5taW51dGUgPSBwcm90by5taW51dGVzID0gZ2V0U2V0TWludXRlO1xuICAgIHByb3RvLnNlY29uZCA9IHByb3RvLnNlY29uZHMgPSBnZXRTZXRTZWNvbmQ7XG4gICAgcHJvdG8ubWlsbGlzZWNvbmQgPSBwcm90by5taWxsaXNlY29uZHMgPSBnZXRTZXRNaWxsaXNlY29uZDtcbiAgICBwcm90by51dGNPZmZzZXQgICAgICAgICAgICA9IGdldFNldE9mZnNldDtcbiAgICBwcm90by51dGMgICAgICAgICAgICAgICAgICA9IHNldE9mZnNldFRvVVRDO1xuICAgIHByb3RvLmxvY2FsICAgICAgICAgICAgICAgID0gc2V0T2Zmc2V0VG9Mb2NhbDtcbiAgICBwcm90by5wYXJzZVpvbmUgICAgICAgICAgICA9IHNldE9mZnNldFRvUGFyc2VkT2Zmc2V0O1xuICAgIHByb3RvLmhhc0FsaWduZWRIb3VyT2Zmc2V0ID0gaGFzQWxpZ25lZEhvdXJPZmZzZXQ7XG4gICAgcHJvdG8uaXNEU1QgICAgICAgICAgICAgICAgPSBpc0RheWxpZ2h0U2F2aW5nVGltZTtcbiAgICBwcm90by5pc0xvY2FsICAgICAgICAgICAgICA9IGlzTG9jYWw7XG4gICAgcHJvdG8uaXNVdGNPZmZzZXQgICAgICAgICAgPSBpc1V0Y09mZnNldDtcbiAgICBwcm90by5pc1V0YyAgICAgICAgICAgICAgICA9IGlzVXRjO1xuICAgIHByb3RvLmlzVVRDICAgICAgICAgICAgICAgID0gaXNVdGM7XG4gICAgcHJvdG8uem9uZUFiYnIgPSBnZXRab25lQWJicjtcbiAgICBwcm90by56b25lTmFtZSA9IGdldFpvbmVOYW1lO1xuICAgIHByb3RvLmRhdGVzICA9IGRlcHJlY2F0ZSgnZGF0ZXMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIGRhdGUgaW5zdGVhZC4nLCBnZXRTZXREYXlPZk1vbnRoKTtcbiAgICBwcm90by5tb250aHMgPSBkZXByZWNhdGUoJ21vbnRocyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgbW9udGggaW5zdGVhZCcsIGdldFNldE1vbnRoKTtcbiAgICBwcm90by55ZWFycyAgPSBkZXByZWNhdGUoJ3llYXJzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSB5ZWFyIGluc3RlYWQnLCBnZXRTZXRZZWFyKTtcbiAgICBwcm90by56b25lICAgPSBkZXByZWNhdGUoJ21vbWVudCgpLnpvbmUgaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudCgpLnV0Y09mZnNldCBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL3pvbmUvJywgZ2V0U2V0Wm9uZSk7XG4gICAgcHJvdG8uaXNEU1RTaGlmdGVkID0gZGVwcmVjYXRlKCdpc0RTVFNoaWZ0ZWQgaXMgZGVwcmVjYXRlZC4gU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvZHN0LXNoaWZ0ZWQvIGZvciBtb3JlIGluZm9ybWF0aW9uJywgaXNEYXlsaWdodFNhdmluZ1RpbWVTaGlmdGVkKTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVVuaXggKGlucHV0KSB7XG4gICAgICAgI
21167HJldHVybiBjcmVhdGVMb2NhbChpbnB1dCAqIDEwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUluWm9uZSAoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpLnBhcnNlWm9uZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZVBhcnNlUG9zdEZvcm1hdCAoc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvJDEgPSBMb2NhbGUucHJvdG90eXBlO1xuXG4gICAgcHJvdG8kMS5jYWxlbmRhciAgICAgICAgPSBjYWxlbmRhcjtcbiAgICBwcm90byQxLmxvbmdEYXRlRm9ybWF0ICA9IGxvbmdEYXRlRm9ybWF0O1xuICAgIHByb3RvJDEuaW52YWxpZERhdGUgICAgID0gaW52YWxpZERhdGU7XG4gICAgcHJvdG8kMS5vcmRpbmFsICAgICAgICAgPSBvcmRpbmFsO1xuICAgIHByb3RvJDEucHJlcGFyc2UgICAgICAgID0gcHJlUGFyc2VQb3N0Rm9ybWF0O1xuICAgIHByb3RvJDEucG9zdGZvcm1hdCAgICAgID0gcHJlUGFyc2VQb3N0Rm9ybWF0O1xuICAgIHByb3RvJDEucmVsYXRpdmVUaW1lICAgID0gcmVsYXRpdmVUaW1lO1xuICAgIHByb3RvJDEucGFzdEZ1dHVyZSAgICAgID0gcGFzdEZ1dHVyZTtcbiAgICBwcm90byQxLnNldCAgICAgICAgICAgICA9IHNldDtcblxuICAgIHByb3RvJDEubW9udGhzICAgICAgICAgICAgPSAgICAgICAgbG9jYWxlTW9udGhzO1xuICAgIHByb3RvJDEubW9udGhzU2hvcnQgICAgICAgPSAgICAgICAgbG9jYWxlTW9udGhzU2hvcnQ7XG4gICAgcHJvdG8kMS5tb250aHNQYXJzZSAgICAgICA9ICAgICAgICBsb2NhbGVNb250aHNQYXJzZTtcbiAgICBwcm90byQxLm1vbnRoc1JlZ2V4ICAgICAgID0gbW9udGhzUmVnZXg7XG4gICAgcHJvdG8kMS5tb250aHNTaG9ydFJlZ2V4ICA9IG1vbnRoc1Nob3J0UmVnZXg7XG4gICAgcHJvdG8kMS53ZWVrID0gbG9jYWxlV2VlaztcbiAgICBwcm90byQxLmZpcnN0RGF5T2ZZZWFyID0gbG9jYWxlRmlyc3REYXlPZlllYXI7XG4gICAgcHJvdG8kMS5maXJzdERheU9mV2VlayA9IGxvY2FsZUZpcnN0RGF5T2ZXZWVrO1xuXG4gICAgcHJvdG8kMS53ZWVrZGF5cyAgICAgICA9ICAgICAgICBsb2NhbGVXZWVrZGF5cztcbiAgICBwcm90byQxLndlZWtkYXlzTWluICAgID0gICAgICAgIGxvY2FsZVdlZWtkYXlzTWluO1xuICAgIHByb3RvJDEud2Vla2RheXNTaG9ydCAgPSAgICAgICAgbG9jYWxlV2Vla2RheXNTaG9ydDtcbiAgICBwcm90byQxLndlZWtkYXlzUGFyc2UgID0gICAgICAgIGxvY2FsZVdlZWtkYXlzUGFyc2U7XG5cbiAgICBwcm90byQxLndlZWtkYXlzUmVnZXggICAgICAgPSAgICAgICAgd2Vla2RheXNSZWdleDtcbiAgICBwcm90byQxLndlZWtkYXlzU2hvcnRSZWdleCAgPSAgICAgICAgd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgIHByb3RvJDEud2Vla2RheXNNaW5SZWdleCAgICA9ICAgICAgICB3ZWVrZGF5c01pblJlZ2V4O1xuXG4gICAgcHJvdG8kMS5pc1BNID0gbG9jYWxlSXNQTTtcbiAgICBwcm90byQxLm1lcmlkaWVtID0gbG9jYWxlTWVyaWRpZW07XG5cbiAgICBmdW5jdGlvbiBnZXQkMSAoZm9ybWF0LCBpbmRleCwgZmllbGQsIHNldHRlcikge1xuICAgICAgICB2Y
21167XIgbG9jYWxlID0gZ2V0TG9jYWxlKCk7XG4gICAgICAgIHZhciB1dGMgPSBjcmVhdGVVVEMoKS5zZXQoc2V0dGVyLCBpbmRleCk7XG4gICAgICAgIHJldHVybiBsb2NhbGVbZmllbGRdKHV0YywgZm9ybWF0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzSW1wbCAoZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0JDEoZm9ybWF0LCBpbmRleCwgZmllbGQsICdtb250aCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGk7XG4gICAgICAgIHZhciBvdXQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIG91dFtpXSA9IGdldCQxKGZvcm1hdCwgaSwgZmllbGQsICdtb250aCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgLy8gKClcbiAgICAvLyAoNSlcbiAgICAvLyAoZm10LCA1KVxuICAgIC8vIChmbXQpXG4gICAgLy8gKHRydWUpXG4gICAgLy8gKHRydWUsIDUpXG4gICAgLy8gKHRydWUsIGZtdCwgNSlcbiAgICAvLyAodHJ1ZSwgZm10KVxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c0ltcGwgKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbGVTb3J0ZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGxvY2FsZVNvcnRlZDtcbiAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgbG9jYWxlU29ydGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG4gICAgICAgIH1cblxuICAgICAgICB2Y
21167XIgbG9jYWxlID0gZ2V0TG9jYWxlKCksXG4gICAgICAgICAgICBzaGlmdCA9IGxvY2FsZVNvcnRlZCA/IGxvY2FsZS5fd2Vlay5kb3cgOiAwO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0JDEoZm9ybWF0LCAoaW5kZXggKyBzaGlmdCkgJSA3LCBmaWVsZCwgJ2RheScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGk7XG4gICAgICAgIHZhciBvdXQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgb3V0W2ldID0gZ2V0JDEoZm9ybWF0LCAoaSArIHNoaWZ0KSAlIDcsIGZpZWxkLCAnZGF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzIChmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0TW9udGhzSW1wbChmb3JtYXQsIGluZGV4LCAnbW9udGhzJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdE1vbnRoc1Nob3J0IChmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0TW9udGhzSW1wbChmb3JtYXQsIGluZGV4LCAnbW9udGhzU2hvcnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXMgKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5cycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c1Nob3J0IChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCAnd2Vla2RheXNTaG9ydCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c01pbiAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzTWluJyk7XG4gICAgfVxuXG4gICAgZ2V0U2V0R2xvYmFsTG9jYWxlKCdlbicsIHtcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHRofHN0fG5kfHJkKS8sXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2Y
21167XIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0b0ludChudW1iZXIgJSAxMDAgLyAxMCkgPT09IDEpID8gJ3RoJyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDEpID8gJ3N0JyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDIpID8gJ25kJyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDMpID8gJ3JkJyA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTaWRlIGVmZmVjdCBpbXBvcnRzXG5cbiAgICBob29rcy5sYW5nID0gZGVwcmVjYXRlKCdtb21lbnQubGFuZyBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZSBpbnN0ZWFkLicsIGdldFNldEdsb2JhbExvY2FsZSk7XG4gICAgaG9va3MubGFuZ0RhdGEgPSBkZXByZWNhdGUoJ21vbWVudC5sYW5nRGF0YSBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZURhdGEgaW5zdGVhZC4nLCBnZXRMb2NhbGUpO1xuXG4gICAgdmFyIG1hdGhBYnMgPSBNYXRoLmFicztcblxuICAgIGZ1bmN0aW9uIGFicyAoKSB7XG4gICAgICAgIHZhciBkYXRhICAgICAgICAgICA9IHRoaXMuX2RhdGE7XG5cbiAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzID0gbWF0aEFicyh0aGlzLl9taWxsaXNlY29uZHMpO1xuICAgICAgICB0aGlzLl9kYXlzICAgICAgICAgPSBtYXRoQWJzKHRoaXMuX2RheXMpO1xuICAgICAgICB0aGlzLl9tb250aHMgICAgICAgPSBtYXRoQWJzKHRoaXMuX21vbnRocyk7XG5cbiAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgID0gbWF0aEFicyhkYXRhLm1pbGxpc2Vjb25kcyk7XG4gICAgICAgIGRhdGEuc2Vjb25kcyAgICAgICA9IG1hdGhBYnMoZGF0YS5zZWNvbmRzKTtcbiAgICAgICAgZGF0YS5taW51dGVzICAgICAgID0gbWF0aEFicyhkYXRhLm1pbnV0ZXMpO1xuICAgICAgICBkYXRhLmhvdXJzICAgICAgICAgPSBtYXRoQWJzKGRhdGEuaG91cnMpO1xuICAgICAgICBkYXRhLm1vbnRocyAgICAgICAgPSBtYXRoQWJzKGRhdGEubW9udGhzKTtcbiAgICAgICAgZGF0YS55ZWFycyAgICAgICAgID0gbWF0aEFicyhkYXRhLnllYXJzKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRTdWJ0cmFjdCQxIChkdXJhdGlvbiwgaW5wdXQsIHZhbHVlLCBkaXJlY3Rpb24pIHtcbiAgICAgICAgdmFyIG90aGVyID0gY3JlYXRlRHVyYXRpb24oaW5wdXQsIHZhbHVlKTtcblxuICAgICAgICBkdXJhdGlvbi5fbWlsbGlzZWNvbmRzICs9IGRpcmVjdGlvbiAqIG90aGVyLl9taWxsaXNlY29uZHM7XG4gICAgICAgIGR1cmF0aW9uLl9kYXlzICAgICAgICAgKz0gZGlyZWN0aW9uICogb3RoZXIuX2RheXM7XG4gICAgICAgIGR1cmF0aW9uLl9tb250aHMgICAgICAgKz0gZGlyZWN0aW9uICogb3RoZXIuX21vbnRocztcblxuICAgICAgICByZXR1cm4gZHVyYXRpb24uX2J1YmJsZSgpO1xuICAgIH1cblxuICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIGFkZCgxLCAncycpIG9yIGFkZChkdXJhdGlvbilcbiAgICBmdW5jdGlvbiBhZGQkMSAoaW5wdXQsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBhZGRTdWJ0cmFjdCQxKHRoaXMsIGlucHV0LCB2YWx1ZSwgMSk7XG4gICAgfVxuXG4gICAgLy8gc3VwcG9ydHMgb25seSAyLjAtc3R5bGUgc3VidHJhY3QoMSwgJ3MnKSBvciBzdWJ0cmFjdChkdXJhdGlvbilcbiAgICBmdW5jdGlvbiBzdWJ0cmFjdCQxIChpbnB1dCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFkZFN1YnRyYWN0JDEodGhpcywgaW5wdXQsIHZhbHVlLCAtMSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzQ2VpbCAobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnViYmxlICgpIHtcbiAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IHRoaXMuX21pbGxpc2Vjb25kcztcbiAgICAgICAgdmFyIGRheXMgICAgICAgICA9IHRoaXMuX2RheXM7XG4gICAgICAgIHZhciBtb250aHMgICAgICAgPSB0aGlzLl9tb250aHM7XG4gICAgICAgIHZhciBkYXRhICAgICAgICAgPSB0aGlzLl9kYXRhO1xuICAgICAgICB2Y
21167XIgc2Vjb25kcywgbWludXRlcywgaG91cnMsIHllYXJzLCBtb250aHNGcm9tRGF5cztcblxuICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgbWl4IG9mIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB2YWx1ZXMsIGJ1YmJsZSBkb3duIGZpcnN0XG4gICAgICAgIC8vIGNoZWNrOiBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMjE2NlxuICAgICAgICBpZiAoISgobWlsbGlzZWNvbmRzID49IDAgJiYgZGF5cyA+PSAwICYmIG1vbnRocyA+PSAwKSB8fFxuICAgICAgICAgICAgICAgIChtaWxsaXNlY29uZHMgPD0gMCAmJiBkYXlzIDw9IDAgJiYgbW9udGhzIDw9IDApKSkge1xuICAgICAgICAgICAgbWlsbGlzZWNvbmRzICs9IGFic0NlaWwobW9udGhzVG9EYXlzKG1vbnRocykgKyBkYXlzKSAqIDg2NGU1O1xuICAgICAgICAgICAgZGF5cyA9IDA7XG4gICAgICAgICAgICBtb250aHMgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGJ1YmJsZXMgdXAgdmFsdWVzLCBzZWUgdGhlIHRlc3RzIGZvclxuICAgICAgICAvLyBleGFtcGxlcyBvZiB3aGF0IHRoYXQgbWVhbnMuXG4gICAgICAgIGRhdGEubWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzICUgMTAwMDtcblxuICAgICAgICBzZWNvbmRzICAgICAgICAgICA9IGFic0Zsb29yKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICAgICAgICBkYXRhLnNlY29uZHMgICAgICA9IHNlY29uZHMgJSA2MDtcblxuICAgICAgICBtaW51dGVzICAgICAgICAgICA9IGFic0Zsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgICAgIGRhdGEubWludXRlcyAgICAgID0gbWludXRlcyAlIDYwO1xuXG4gICAgICAgIGhvdXJzICAgICAgICAgICAgID0gYWJzRmxvb3IobWludXRlcyAvIDYwKTtcbiAgICAgICAgZGF0YS5ob3VycyAgICAgICAgPSBob3VycyAlIDI0O1xuXG4gICAgICAgIGRheXMgKz0gYWJzRmxvb3IoaG91cnMgLyAyNCk7XG5cbiAgICAgICAgLy8gY29udmVydCBkYXlzIHRvIG1vbnRoc1xuICAgICAgICBtb250aHNGcm9tRGF5cyA9IGFic0Zsb29yKGRheXNUb01vbnRocyhkYXlzKSk7XG4gICAgICAgIG1vbnRocyArPSBtb250aHNGcm9tRGF5cztcbiAgICAgICAgZGF5cyAtPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHNGcm9tRGF5cykpO1xuXG4gICAgICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICAgICAgeWVhcnMgPSBhYnNGbG9vcihtb250aHMgLyAxMik7XG4gICAgICAgIG1vbnRocyAlPSAxMjtcblxuICAgICAgICBkYXRhLmRheXMgICA9IGRheXM7XG4gICAgICAgIGRhdGEubW9udGhzID0gbW9udGhzO1xuICAgICAgICBkYXRhLnllYXJzICA9IHllYXJzO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNUb01vbnRocyAoZGF5cykge1xuICAgICAgICAvLyA0MDAgeWVhcnMgaGF2ZSAxNDYwOTcgZGF5cyAodGFraW5nIGludG8gYWNjb3VudCBsZWFwIHllYXIgcnVsZXMpXG4gICAgICAgIC8vIDQwMCB5ZWFycyBoYXZlIDEyIG1vbnRocyA9PT0gNDgwMFxuICAgICAgICByZXR1cm4gZGF5cyAqIDQ4MDAgLyAxNDYwOTc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhzVG9EYXlzIChtb250aHMpIHtcbiAgICAgICAgLy8gdGhlIHJldmVyc2Ugb2YgZGF5c1RvTW9udGhzXG4gICAgICAgIHJldHVybiBtb250aHMgKiAxNDYwOTcgLyA0ODAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFzICh1bml0cykge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXlzO1xuICAgICAgICB2Y
21167XIgbW9udGhzO1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzO1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21vbnRoJyB8fCB1bml0cyA9PT0gJ3F1YXJ0ZXInIHx8IHVuaXRzID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMgKyBkYXlzVG9Nb250aHMoZGF5cyk7XG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbW9udGgnOiAgIHJldHVybiBtb250aHM7XG4gICAgICAgICAgICAgICAgY2FzZSAncXVhcnRlcic6IHJldHVybiBtb250aHMgLyAzO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3llYXInOiAgICByZXR1cm4gbW9udGhzIC8gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgbWlsbGlzZWNvbmRzIHNlcGFyYXRlbHkgYmVjYXVzZSBvZiBmbG9hdGluZyBwb2ludCBtYXRoIGVycm9ycyAoaXNzdWUgIzE4NjcpXG4gICAgICAgICAgICBkYXlzID0gdGhpcy5fZGF5cyArIE1hdGgucm91bmQobW9udGhzVG9EYXlzKHRoaXMuX21vbnRocykpO1xuICAgICAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3dlZWsnICAgOiByZXR1cm4gZGF5cyAvIDcgICAgICsgbWlsbGlzZWNvbmRzIC8gNjA0OGU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RheScgICAgOiByZXR1cm4gZGF5cyAgICAgICAgICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnaG91cicgICA6IHJldHVybiBkYXlzICogMjQgICAgKyBtaWxsaXNlY29uZHMgLyAzNmU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ21pbnV0ZScgOiByZXR1cm4gZGF5cyAqIDE0NDAgICsgbWlsbGlzZWNvbmRzIC8gNmU0O1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NlY29uZCcgOiByZXR1cm4gZGF5cyAqIDg2NDAwICsgbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICAgICAgICAgICAgICAvLyBNYXRoLmZsb29yIHByZXZlbnRzIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIGhlcmVcbiAgICAgICAgICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6IHJldHVybiBNYXRoLmZsb29yKGRheXMgKiA4NjRlNSkgKyBtaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHVuaXQgJyArIHVuaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE86IFVzZSB0aGlzLmFzKCdtcycpP1xuICAgIGZ1bmN0aW9uIHZhbHVlT2YkMSAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyArXG4gICAgICAgICAgICB0aGlzLl9kYXlzICogODY0ZTUgK1xuICAgICAgICAgICAgKHRoaXMuX21vbnRocyAlIDEyKSAqIDI1OTJlNiArXG4gICAgICAgICAgICB0b0ludCh0aGlzLl9tb250aHMgLyAxMikgKiAzMTUzNmU2XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUFzIChhbGlhcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXMoYWxpYXMpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBhc01pbGxpc2Vjb25kcyA9IG1ha2VBcygnbXMnKTtcbiAgICB2YXIgYXNTZWNvbmRzICAgICAgPSBtYWtlQXMoJ3MnKTtcbiAgICB2YXIgYXNNaW51dGVzICAgICAgPSBtYWtlQXMoJ20nKTtcbiAgICB2YXIgYXNIb3VycyAgICAgICAgPSBtYWtlQXMoJ2gnKTtcbiAgICB2YXIgYXNEYXlzICAgICAgICAgPSBtYWtlQXMoJ2QnKTtcbiAgICB2YXIgYXNXZWVrcyAgICAgICAgPSBtYWtlQXMoJ3cnKTtcbiAgICB2YXIgYXNNb250aHMgICAgICAgPSBtYWtlQXMoJ00nKTtcbiAgICB2YXIgYXNRdWFydGVycyAgICAgPSBtYWtlQXMoJ1EnKTtcbiAgICB2YXIgYXNZZWFycyAgICAgICAgPSBtYWtlQXMoJ3knKTtcblxuICAgIGZ1bmN0aW9uIGNsb25lJDEgKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24odGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0JDIgKHVuaXRzKSB7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzW3VuaXRzICsgJ3MnXSgpIDogTmFOO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXR0ZXIobmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5fZGF0YVtuYW1lXSA6IE5hTjtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gbWFrZUdldHRlcignbWlsbGlzZWNvbmRzJyk7XG4gICAgdmFyIHNlY29uZHMgICAgICA9IG1ha2VHZXR0ZXIoJ3NlY29uZHMnKTtcbiAgICB2YXIgbWludXRlcyAgICAgID0gbWFrZUdldHRlcignbWludXRlcycpO1xuICAgIHZhciBob3VycyAgICAgICAgPSBtYWtlR2V0dGVyKCdob3VycycpO1xuICAgIHZhciBkYXlzICAgICAgICAgPSBtYWtlR2V0dGVyKCdkYXlzJyk7XG4gICAgdmFyIG1vbnRocyAgICAgICA9IG1ha2VHZXR0ZXIoJ21vbnRocycpO1xuICAgIHZhciB5ZWFycyAgICAgICAgPSBtYWtlR2V0dGVyKCd5ZWFycycpO1xuXG4gICAgZnVuY3Rpb24gd2Vla3MgKCkge1xuICAgICAgICByZXR1cm4gYWJzRmxvb3IodGhpcy5kYXlzKCkgLyA3KTtcbiAgICB9XG5cbiAgICB2YXIgcm91bmQgPSBNYXRoLnJvdW5kO1xuICAgIHZhciB0aHJlc2hvbGRzID0ge1xuICAgICAgICBzczogNDQsICAgICAgICAgLy8gYSBmZXcgc2Vjb25kcyB0byBzZWNvbmRzXG4gICAgICAgIHMgOiA0NSwgICAgICAgICAvLyBzZWNvbmRzIHRvIG1pbnV0ZVxuICAgICAgICBtIDogNDUsICAgICAgICAgLy8gbWludXRlcyB0byBob3VyXG4gICAgICAgIGggOiAyMiwgICAgICAgICAvLyBob3VycyB0byBkYXlcbiAgICAgICAgZCA6IDI2LCAgICAgICAgIC8vIGRheXMgdG8gbW9udGhcbiAgICAgICAgTSA6IDExICAgICAgICAgIC8vIG1vbnRocyB0byB5ZWFyXG4gICAgfTtcblxuICAgIC8vIGhlbHBlciBmdW5jdGlvbiBmb3IgbW9tZW50LmZuLmZyb20sIG1vbWVudC5mbi5mcm9tTm93LCBhbmQgbW9tZW50LmR1cmF0aW9uLmZuLmh1bWFuaXplXG4gICAgZnVuY3Rpb24gc3Vic3RpdHV0ZVRpbWVBZ28oc3RyaW5nLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGlzRnV0dXJlLCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5yZWxhdGl2ZVRpbWUobnVtYmVyIHx8IDEsICEhd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW
211671lJDEgKHBvc05lZ0R1cmF0aW9uLCB3aXRob3V0U3VmZml4LCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb24ocG9zTmVnRHVyYXRpb24pLmFicygpO1xuICAgICAgICB2YXIgc2Vjb25kcyAgPSByb3VuZChkdXJhdGlvbi5hcygncycpKTtcbiAgICAgICAgdmFyIG1pbnV0ZXMgID0gcm91bmQoZHVyYXRpb24uYXMoJ20nKSk7XG4gICAgICAgIHZhciBob3VycyAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdoJykpO1xuICAgICAgICB2YXIgZGF5cyAgICAgPSByb3VuZChkdXJhdGlvbi5hcygnZCcpKTtcbiAgICAgICAgdmFyIG1vbnRocyAgID0gcm91bmQoZHVyYXRpb24uYXMoJ00nKSk7XG4gICAgICAgIHZhciB5ZWFycyAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCd5JykpO1xuXG4gICAgICAgIHZhciBhID0gc2Vjb25kcyA8PSB0aHJlc2hvbGRzLnNzICYmIFsncycsIHNlY29uZHNdICB8fFxuICAgICAgICAgICAgICAgIHNlY29uZHMgPCB0aHJlc2hvbGRzLnMgICAmJiBbJ3NzJywgc2Vjb25kc10gfHxcbiAgICAgICAgICAgICAgICBtaW51dGVzIDw9IDEgICAgICAgICAgICAgJiYgWydtJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgbWludXRlcyA8IHRocmVzaG9sZHMubSAgICYmIFsnbW0nLCBtaW51dGVzXSB8fFxuICAgICAgICAgICAgICAgIGhvdXJzICAgPD0gMSAgICAgICAgICAgICAmJiBbJ2gnXSAgICAgICAgICAgfHxcbiAgICAgICAgICAgICAgICBob3VycyAgIDwgdGhyZXNob2xkcy5oICAgJiYgWydoaCcsIGhvdXJzXSAgIHx8XG4gICAgICAgICAgICAgICAgZGF5cyAgICA8PSAxICAgICAgICAgICAgICYmIFsnZCddICAgICAgICAgICB8fFxuICAgICAgICAgICAgICAgIGRheXMgICAgPCB0aHJlc2hvbGRzLmQgICAmJiBbJ2RkJywgZGF5c10gICAgfHxcbiAgICAgICAgICAgICAgICBtb250aHMgIDw9IDEgICAgICAgICAgICAgJiYgWydNJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgbW9udGhzICA8IHRocmVzaG9sZHMuTSAgICYmIFsnTU0nLCBtb250aHNdICB8fFxuICAgICAgICAgICAgICAgIHllYXJzICAgPD0gMSAgICAgICAgICAgICAmJiBbJ3knXSAgICAgICAgICAgfHwgWyd5eScsIHllYXJzXTtcblxuICAgICAgICBhWzJdID0gd2l0aG91dFN1ZmZpeDtcbiAgICAgICAgYVszXSA9ICtwb3NOZWdEdXJhdGlvbiA+IDA7XG4gICAgICAgIGFbNF0gPSBsb2NhbGU7XG4gICAgICAgIHJldHVybiBzdWJzdGl0dXRlVGltZUFnby5hcHBseShudWxsLCBhKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IHRoZSByb3VuZGluZyBmdW5jdGlvbiBmb3IgcmVsYXRpdmUgdGltZSBzdHJpbmdzXG4gICAgZnVuY3Rpb24gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmcgKHJvdW5kaW5nRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKHJvdW5kaW5nRnVuY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yocm91bmRpbmdGdW5jdGlvbikgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJvdW5kID0gcm91bmRpbmdGdW5jdGlvbjtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IGEgdGhyZXNob2xkIGZvciByZWxhdGl2ZSB0aW1lIHN0cmluZ3NcbiAgICBmdW5jdGlvbiBnZXRTZXRSZWxhdGl2ZVRpbWVUaHJlc2hvbGQgKHRocmVzaG9sZCwgbGltaXQpIHtcbiAgICAgICAgaWYgKHRocmVzaG9sZHNbdGhyZXNob2xkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJlc2hvbGRzW3RocmVzaG9sZF07XG4gICAgICAgIH1cbiAgICAgICAgdGhyZXNob2xkc1t0aHJlc2hvbGRdID0gbGltaXQ7XG4gICAgICAgIGlmICh0aHJlc2hvbGQgPT09ICdzJykge1xuICAgICAgICAgICAgdGhyZXNob2xkcy5zcyA9IGxpbWl0IC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBodW1hbml6ZSAod2l0aFN1ZmZpeCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2NhbGUgPSB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgdmFyIG91dHB1dCA9IHJlbGF0aXZlVGltZSQxKHRoaXMsICF3aXRoU3VmZml4LCBsb2NhbGUpO1xuXG4gICAgICAgIGlmICh3aXRoU3VmZml4KSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBsb2NhbGUucGFzdEZ1dHVyZSgrdGhpcywgb3V0cHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2NhbGUucG9zdGZvcm1hdChvdXRwdXQpO1xuICAgIH1cblxuICAgIHZhciBhYnMkMSA9IE1hdGguYWJzO1xuXG4gICAgZnVuY3Rpb24gc2lnbih4KSB7XG4gICAgICAgIHJldHVybiAoKHggPiAwKSAtICh4IDwgMCkpIHx8ICt4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSVNPU3RyaW5nJDEoKSB7XG4gICAgICAgIC8vIGZvciBJU08gc3RyaW5ncyB3ZSBkbyBub3QgdXNlIHRoZSBub3JtYWwgYnViYmxpbmcgcnVsZXM6XG4gICAgICAgIC8vICAqIG1pbGxpc2Vjb25kcyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgaG91cnNcbiAgICAgICAgLy8gICogZGF5cyBkbyBub3QgYnViYmxlIGF0IGFsbFxuICAgICAgICAvLyAgKiBtb250aHMgYnViYmxlIHVwIHVudGlsIHRoZXkgYmVjb21lIHllYXJzXG4gICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGVyZSBpcyBubyBjb250ZXh0LWZyZWUgY29udmVyc2lvbiBiZXR3ZWVuIGhvdXJzIGFuZCBkYXlzXG4gICAgICAgIC8vICh0aGluayBvZiBjbG9jayBjaGFuZ2VzKVxuICAgICAgICAvLyBhbmQgYWxzbyBub3QgYmV0d2VlbiBkYXlzIGFuZCBtb250aHMgKDI4LTMxIGRheXMgcGVyIG1vbnRoKVxuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgI
21167HZhciBzZWNvbmRzID0gYWJzJDEodGhpcy5fbWlsbGlzZWNvbmRzKSAvIDEwMDA7XG4gICAgICAgIHZhciBkYXlzICAgICAgICAgPSBhYnMkMSh0aGlzLl9kYXlzKTtcbiAgICAgICAgdmFyIG1vbnRocyAgICAgICA9IGFicyQxKHRoaXMuX21vbnRocyk7XG4gICAgICAgIHZhciBtaW51dGVzLCBob3VycywgeWVhcnM7XG5cbiAgICAgICAgLy8gMzYwMCBzZWNvbmRzIC0+IDYwIG1pbnV0ZXMgLT4gMSBob3VyXG4gICAgICAgIG1pbnV0ZXMgICAgICAgICAgID0gYWJzRmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICAgICAgaG91cnMgICAgICAgICAgICAgPSBhYnNGbG9vcihtaW51dGVzIC8gNjApO1xuICAgICAgICBzZWNvbmRzICU9IDYwO1xuICAgICAgICBtaW51dGVzICU9IDYwO1xuXG4gICAgICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICAgICAgeWVhcnMgID0gYWJzRmxvb3IobW9udGhzIC8gMTIpO1xuICAgICAgICBtb250aHMgJT0gMTI7XG5cblxuICAgICAgICAvLyBpbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vZG9yZGlsbGUvbW9tZW50LWlzb2R1cmF0aW9uL2Jsb2IvbWFzdGVyL21vbWVudC5pc29kdXJhdGlvbi5qc1xuICAgICAgICB2YXIgWSA9IHllYXJzO1xuICAgICAgICB2YXIgTSA9IG1vbnRocztcbiAgICAgICAgdmFyIEQgPSBkYXlzO1xuICAgICAgICB2YXIgaCA9IGhvdXJzO1xuICAgICAgICB2YXIgbSA9IG1pbnV0ZXM7XG4gICAgICAgIHZhciBzID0gc2Vjb25kcyA/IHNlY29uZHMudG9GaXhlZCgzKS5yZXBsYWNlKC9cXC4/MCskLywgJycpIDogJyc7XG4gICAgICAgIHZhciB0b3RhbCA9IHRoaXMuYXNTZWNvbmRzKCk7XG5cbiAgICAgICAgaWYgKCF0b3RhbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBDIydzIChOb2RhKSBhbmQgcHl0aG9uIChpc29kYXRlKS4uLlxuICAgICAgICAgICAgLy8gYnV0IG5vdCBvdGhlciBKUyAoZ29vZy5kYXRlKVxuICAgICAgICAgICAgcmV0dXJuICdQMEQnO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRvdGFsU2lnbiA9IHRvdGFsIDwgMCA/ICctJyA6ICcnO1xuICAgICAgICB2Y
21167XIgeW1TaWduID0gc2lnbih0aGlzLl9tb250aHMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICB2YXIgZGF5c1NpZ24gPSBzaWduKHRoaXMuX2RheXMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICB2YXIgaG1zU2lnbiA9IHNpZ24odGhpcy5fbWlsbGlzZWNvbmRzKSAhPT0gc2lnbih0b3RhbCkgPyAnLScgOiAnJztcblxuICAgICAgICByZXR1cm4gdG90YWxTaWduICsgJ1AnICtcbiAgICAgICAgICAgIChZID8geW1TaWduICsgWSArICdZJyA6ICcnKSArXG4gICAgICAgICAgICAoTSA/IHltU2lnbiArIE0gKyAnTScgOiAnJykgK1xuICAgICAgICAgICAgKEQgPyBkYXlzU2lnbiArIEQgKyAnRCcgOiAnJykgK1xuICAgICAgICAgICAgKChoIHx8IG0gfHwgcykgPyAnVCcgOiAnJykgK1xuICAgICAgICAgICAgKGggPyBobXNTaWduICsgaCArICdIJyA6ICcnKSArXG4gICAgICAgICAgICAobSA/IGhtc1NpZ24gKyBtICsgJ00nIDogJycpICtcbiAgICAgICAgICAgIChzID8gaG1zU2lnbiArIHMgKyAnUycgOiAnJyk7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvJDIgPSBEdXJhdGlvbi5wcm90b3R5cGU7XG5cbiAgICBwcm90byQyLmlzVmFsaWQgICAgICAgID0gaXNWYWxpZCQxO1xuICAgIHByb3RvJDIuYWJzICAgICAgICAgICAgPSBhYnM7XG4gICAgcHJvdG8kMi5hZGQgICAgICAgICAgICA9IGFkZCQxO1xuICAgIHByb3RvJDIuc3VidHJhY3QgICAgICAgPSBzdWJ0cmFjdCQxO1xuICAgIHByb3RvJDIuYXMgICAgICAgICAgICAgPSBhcztcbiAgICBwcm90byQyLmFzTWlsbGlzZWNvbmRzID0gYXNNaWxsaXNlY29uZHM7XG4gICAgcHJvdG8kMi5hc1NlY29uZHMgICAgICA9IGFzU2Vjb25kcztcbiAgICBwcm90byQyLmFzTWludXRlcyAgICAgID0gYXNNaW51dGVzO1xuICAgIHByb3RvJDIuYXNIb3VycyAgICAgICAgPSBhc0hvdXJzO1xuICAgIHByb3RvJDIuYXNEYXlzICAgICAgICAgPSBhc0RheXM7XG4gICAgcHJvdG8kMi5hc1dlZWtzICAgICAgICA9IGFzV2Vla3M7XG4gICAgcHJvdG8kMi5hc01vbnRocyAgICAgICA9IGFzTW9udGhzO1xuICAgIHByb3RvJDIuYXNRdWFydGVycyAgICAgPSBhc1F1YXJ0ZXJzO1xuICAgIHByb3RvJDIuYXNZZWFycyAgICAgICAgPSBhc1llYXJzO1xuICAgIHByb3RvJDIudmFsdWVPZiAgICAgICAgPSB2YWx1ZU9mJDE7XG4gICAgcHJvdG8kMi5fYnViYmxlICAgICAgICA9IGJ1YmJsZTtcbiAgICBwcm90byQyLmNsb25lICAgICAgICAgID0gY2xvbmUkMTtcbiAgICBwcm90byQyLmdldCAgICAgICAgICAgID0gZ2V0JDI7XG4gICAgcHJvdG8kMi5taWxsaXNlY29uZHMgICA9IG1pbGxpc2Vjb25kcztcbiAgICBwcm90byQyLnNlY29uZHMgICAgICAgID0gc2Vjb25kcztcbiAgICBwcm90byQyLm1pbnV0ZXMgICAgICAgID0gbWludXRlcztcbiAgICBwcm90byQyLmhvdXJzICAgICAgICAgID0gaG91cnM7XG4gICAgcHJvdG8kMi5kYXlzICAgICAgICAgICA9IGRheXM7XG4gICAgcHJvdG8kMi53ZWVrcyAgICAgICAgICA9IHdlZWtzO1xuICAgIHByb3RvJDIubW9udGhzICAgICAgICAgPSBtb250aHM7XG4gICAgcHJvdG8kMi55ZWFycyAgICAgICAgICA9IHllYXJzO1xuICAgIHByb3RvJDIuaHVtYW5pemUgICAgICAgPSBodW1hbml6ZTtcbiAgICBwcm90byQyLnRvSVNPU3RyaW5nICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvU3RyaW5nICAgICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvSlNPTiAgICAgICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLmxvY2FsZSAgICAgICAgID0gbG9jYWxlO1xuICAgIHByb3RvJDIubG9jYWxlRGF0YSAgICAgPSBsb2NhbGVEYXRhO1xuXG4gICAgcHJvdG8kMi50b0lzb1N0cmluZyA9IGRlcHJlY2F0ZSgndG9Jc29TdHJpbmcoKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRvSVNPU3RyaW5nKCkgaW5zdGVhZCAobm90aWNlIHRoZSBjYXBpdGFscyknLCB0b0lTT1N0cmluZyQxKTtcbiAgICBwcm90byQyLmxhbmcgPSBsYW5nO1xuXG4gICAgLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1gnLCAwLCAwLCAndW5peCcpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd4JywgMCwgMCwgJ3ZhbHVlT2YnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3gnLCBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignWCcsIG1hdGNoVGltZXN0YW1wKTtcbiAgICBhZGRQYXJzZVRva2VuKCdYJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHBhcnNlRmxvYXQoaW5wdXQsIDEwKSAqIDEwMDApO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ3gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUodG9JbnQoaW5wdXQpKTtcbiAgICB9KTtcblxuICAgIC8vIFNpZGUgZWZmZWN0IGltcG9ydHNcblxuXG4gICAgaG9va3MudmVyc2lvbiA9ICcyLjI0LjAnO1xuXG4gICAgc2V0SG9va0NhbGxiYWNrKGNyZWF0ZUxvY2FsKTtcblxuICAgIGhvb2tzLmZuICAgICAgICAgICAgICAgICAgICA9IHByb3RvO1xuICAgIGhvb2tzLm1pbiAgICAgICAgICAgICAgICAgICA9IG1pbjtcbiAgICBob29rcy5tYXggICAgICAgICAgICAgICAgICAgPSBtYXg7XG4gICAgaG9va3Mubm93ICAgICAgICAgICAgICAgICAgID0gbm93O1xuICAgIGhvb2tzLnV0YyAgICAgICAgICAgICAgICAgICA9IGNyZWF0ZVVUQztcbiAgICBob29rcy51bml4ICAgICAgICAgICAgICAgICAgPSBjcmVhdGVVbml4O1xuICAgIGhvb2tzLm1vbnRocyAgICAgICAgICAgICAgICA9IGxpc3RNb250aHM7XG4gICAgaG9va3MuaXNEYXRlICAgICAgICAgICAgICAgID0gaXNEYXRlO1xuICAgIGhvb2tzLmxvY2FsZSAgICAgICAgICAgICAgICA9IGdldFNldEdsb2JhbExvY2FsZTtcbiAgICBob29rcy5pbnZhbGlkICAgICAgICAgICAgICAgPSBjcmVhdGVJbnZhbGlkO1xuICAgIGhvb2tzLmR1cmF0aW9uICAgICAgICAgICAgICA9IGNyZWF0ZUR1cmF0aW9uO1xuICAgIGhvb2tzLmlzTW9tZW50ICAgICAgICAgICAgICA9IGlzTW9tZW50O1xuICAgIGhvb2tzLndlZWtkYXlzICAgICAgICAgICAgICA9IGxpc3RXZWVrZGF5cztcbiAgICBob29rcy5wYXJzZVpvbmUgICAgICAgICAgICAgPSBjcmVhdGVJblpvbmU7XG4gICAgaG9va3MubG9jYWxlRGF0YSAgICAgICAgICAgID0gZ2V0TG9jYWxlO1xuICAgIGhvb2tzLmlzRHVyYXRpb24gICAgICAgICAgICA9IGlzRHVyYXRpb247XG4gICAgaG9va3MubW9udGhzU2hvcnQgICAgICAgICAgID0gbGlzdE1vbnRoc1Nob3J0O1xuICAgIGhvb2tzLndlZWtkYXlzTWluICAgICAgICAgICA9IGxpc3RXZWVrZGF5c01pbjtcbiAgICBob29rcy5kZWZpbmVMb2NhbGUgICAgICAgICAgPSBkZWZpbmVMb2NhbGU7XG4gICAgaG9va3MudXBkYXRlTG9jYWxlICAgICAgICAgID0gdXBkYXRlTG9jYWxlO1xuICAgIGhvb2tzLmxvY2FsZXMgICAgICAgICAgICAgICA9IGxpc3RMb2NhbGVzO1xuICAgIGhvb2tzLndlZWtkYXlzU2hvcnQgICAgICAgICA9IGxpc3RXZWVrZGF5c1Nob3J0O1xuICAgIGhvb2tzLm5vcm1hbGl6ZVVuaXRzICAgICAgICA9IG5vcm1hbGl6ZVVuaXRzO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVJvdW5kaW5nICA9IGdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVRocmVzaG9sZCA9IGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZDtcbiAgICBob29rcy5jYWxlbmRhckZvcm1hdCAgICAgICAgPSBnZXRDYWxlbmRhckZvcm1hdDtcbiAgICBob29rcy5wcm90b3R5cGUgICAgICAgICAgICAgPSBwcm90bztcblxuICAgIC8vIGN1cnJlbnRseSBIVE1MNSBpbnB1dCB0eXBlIG9ubHkgc3VwcG9ydHMgMjQtaG91ciBmb3JtYXRzXG4gICAgaG9va3MuSFRNTDVfRk1UID0ge1xuICAgICAgICBEQVRFVElNRV9MT0NBTDogJ1lZWVktTU0tRERUSEg6bW0nLCAgICAgICAgICAgICAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgLz5cbiAgICAgICAgREFURVRJTUVfTE9DQUxfU0VDT05EUzogJ1lZWVktTU0tRERUSEg6bW06c3MnLCAgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgREFURVRJTUVfTE9DQUxfTVM6ICdZWVlZLU1NLUREVEhIOm1tOnNzLlNTUycsICAgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0ZXA9XCIwLjAwMVwiIC8+XG4gICAgICAgIERBVEU6ICdZWVlZLU1NLUREJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIC8+XG4gICAgICAgIFRJTUU6ICdISDptbScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIC8+XG4gICAgICAgIFRJTUVfU0VDT05EUzogJ0hIOm1tOnNzJywgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgVElNRV9NUzogJ0hIOm1tOnNzLlNTUycsICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgV0VFSzogJ0dHR0ctW1ddV1cnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ3ZWVrXCIgLz5cbiAgICAgICAgTU9OVEg6ICdZWVlZLU1NJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJtb250aFwiIC8+XG4gICAgfTtcblxuICAgI
21167HJldHVybiBob29rcztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIGZyID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZnInLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW52aWVyX2bDqXZyaWVyX21hcnNfYXZyaWxfbWFpX2p1aW5fanVpbGxldF9hb8O7dF9zZXB0ZW1icmVfb2N0b2JyZV9ub3ZlbWJyZV9kw6ljZW1icmUnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ2phbnYuX2bDqXZyLl9tYXJzX2F2ci5fbWFpX2p1aW5fanVpbC5fYW/Du3Rfc2VwdC5fb2N0Ll9ub3YuX2TDqWMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXMgOiAnZGltYW5jaGVfbHVuZGlfbWFyZGlfbWVyY3JlZGlfamV1ZGlfdmVuZHJlZGlfc2FtZWRpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ2RpbS5fbHVuLl9tYXIuX21lci5famV1Ll92ZW4uX3NhbS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ2RpX2x1X21hX21lX2plX3ZlX3NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tBdWpvdXJk4oCZaHVpIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tEZW1haW4gw6BdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW8OgXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tIaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdkZGRkIFtkZXJuaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnZGFucyAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ2lsIHkgYSAlcycsXG4gICAgICAgICAgICBzIDogJ3F1ZWxxdWVzIHNlY29uZGVzJyxcbiAgICAgICAgICAgIHNzIDogJyVkIHNlY29uZGVzJyxcbiAgICAgICAgICAgIG0gOiAndW5lIG1pbnV0ZScsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGggOiAndW5lIGhldXJlJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGhldXJlcycsXG4gICAgICAgICAgICBkIDogJ3VuIGpvdXInLFxuICAgICAgICAgICAgZGQgOiAnJWQgam91cnMnLFxuICAgICAgICAgICAgTSA6ICd1biBtb2lzJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1vaXMnLFxuICAgICAgICAgICAgeSA6ICd1biBhbicsXG4gICAgICAgICAgICB5eSA6ICclZCBhbnMnXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShlcnwpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZXR1cm4gJ2UnIHdoZW4gZGF5IG9mIG1vbnRoID4gMS4gTW92ZSB0aGlzIGNhc2UgaW5zaWRlXG4gICAgICAgICAgICAgICAgLy8gYmxvY2sgZm9yIG1hc2N1bGluZSB3b3JkcyBiZWxvdy5cbiAgICAgICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzMzNzVcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAnZXInIDogJycpO1xuXG4gICAgICAgICAgICAgICAgLy8gV29yZHMgd2l0aCBtYXNjdWxpbmUgZ3JhbW1hdGljYWwgZ2VuZGVyOiBtb2lzLCB0cmltZXN0cmUsIGpvdXJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ2VyJyA6ICdlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBXb3JkcyB3aXRoIGZlbWluaW5lIGdyYW1tYXRpY2FsIGdlbmRlcjogc2VtYWluZVxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdyZScgOiAnZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmcjtcblxufSkpKTtcbiIsIi8qIVxuICogRGF0ZXBpY2tlciB2MS4wLjRcbiAqIGh0dHBzOi8vZmVuZ3l1YW5jaGVuLmdpdGh1Yi5pby9kYXRlcGlja2VyXG4gKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBDaGVuIEZlbmd5dWFuXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE5LTAxLTA2V
21167DAyOjQyOjM2LjE4OFpcbiAqL1xuXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KHJlcXVpcmUoJ2pxdWVyeScpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwualF1ZXJ5KSk7XG59KHRoaXMsIGZ1bmN0aW9uICgkKSB7ICd1c2Ugc3RyaWN0JztcblxuICAkID0gJCAmJiAkLmhhc093blByb3BlcnR5KCdkZWZhdWx0JykgPyAkWydkZWZhdWx0J10gOiAkO1xuXG4gIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci
2116753cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH1cblxuICB2YXIgREVGQVVMVFMgPSB7XG4gICAgLy8gU2hvdyB0aGUgZGF0ZXBpY2tlciBhdXRvbWF0aWNhbGx5IHdoZW4gaW5pdGlhbGl6ZWRcbiAgICBhdXRvU2hvdzogZmFsc2UsXG4gICAgLy8gSGlkZSB0aGUgZGF0ZXBpY2tlciBhdXRvbWF0aWNhbGx5IHdoZW4gcGlja2VkXG4gICAgYXV0b0hpZGU6IGZhbHNlLFxuICAgIC8vIFBpY2sgdGhlIGluaXRpYWwgZGF0ZSBhdXRvbWF0aWNhbGx5IHdoZW4gaW5pdGlhbGl6ZWRcbiAgICBhdXRvUGljazogZmFsc2UsXG4gICAgLy8gRW5hYmxlIGlubGluZSBtb2RlXG4gICAgaW5saW5lOiBmYWxzZSxcbiAgICAvLyBBIGVsZW1lbnQgKG9yIHNlbGVjdG9yKSBmb3IgcHV0dGluZyB0aGUgZGF0ZXBpY2tlclxuICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAvLyBBIGVsZW1lbnQgKG9yIHNlbGVjdG9yKSBmb3IgdHJpZ2dlcmluZyB0aGUgZGF0ZXBpY2tlclxuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLy8gVGhlIElTTyBsYW5ndWFnZSBjb2RlIChidWlsdC1pbjogZW4tVVMpXG4gICAgbGFuZ3VhZ2U6ICcnLFxuICAgIC8vIFRoZSBkYXRlIHN0cmluZyBmb3JtYXRcbiAgICBmb3JtYXQ6ICdtbS9kZC95eXl5JyxcbiAgICAvLyBUaGUgaW5pdGlhbCBkYXRlXG4gICAgZGF0ZTogbnVsbCxcbiAgICAvLyBUaGUgc3RhcnQgdmlldyBkYXRlXG4gICAgc3RhcnREYXRlOiBudWxsLFxuICAgIC8vIFRoZSBlbmQgdmlldyBkYXRlXG4gICAgZW5kRGF0ZTogbnVsbCxcbiAgICAvLyBUaGUgc3RhcnQgdmlldyB3aGVuIGluaXRpYWxpemVkXG4gICAgc3RhcnRWaWV3OiAwLFxuICAgIC8vIDAgZm9yIGRheXMsIDEgZm9yIG1vbnRocywgMiBmb3IgeWVhcnNcbiAgICAvLyBUaGUgc3RhcnQgZGF5IG9mIHRoZSB3ZWVrXG4gICAgLy8gMCBmb3IgU3VuZGF5LCAxIGZvciBNb25kYXksIDIgZm9yIFR1ZXNkYXksIDMgZm9yIFdlZG5lc2RheSxcbiAgICAvLyA0IGZvciBUaHVyc2RheSwgNSBmb3IgRnJpZGF5LCA2IGZvciBTYXR1cmRheVxuICAgIHdlZWtTdGFydDogMCxcbiAgICAvLyBTaG93IHllYXIgYmVmb3JlIG1vbnRoIG9uIHRoZSBkYXRlcGlja2VyIGhlYWRlclxuICAgIHllYXJGaXJzdDogZmFsc2UsXG4gICAgLy8gQSBzdHJpbmcgc3VmZml4IHRvIHRoZSB5ZWFyIG51bWJlci5cbiAgICB5ZWFyU3VmZml4OiAnJyxcbiAgICAvLyBEYXlzJyBuYW1lIG9mIHRoZSB3ZWVrLlxuICAgIGRheXM6IFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXSxcbiAgICAvLyBTaG9ydGVyIGRheXMnIG5hbWVcbiAgICBkYXlzU2hvcnQ6IFsnU3VuJywgJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0J10sXG4gICAgLy8gU2hvcnRlc3QgZGF5cycgbmFtZVxuICAgIGRheXNNaW46IFsnU3UnLCAnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2EnXSxcbiAgICAvLyBNb250aHMnIG5hbWVcbiAgICBtb250aHM6IFsnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlciddLFxuICAgIC8vIFNob3J0ZXIgbW9udGhzJyBuYW1lXG4gICAgbW9udGhzU2hvcnQ6IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXSxcbiAgICAvLyBBIGVsZW1lbnQgdGFnIGZvciBlYWNoIGl0ZW0gb2YgeWVhcnMsIG1vbnRocyBhbmQgZGF5c1xuICAgIGl0ZW1UYWc6ICdsaScsXG4gICAgLy8gQSBjbGFzcyAoQ1NTKSBmb3IgbXV0ZWQgZGF0ZSBpdGVtXG4gICAgbXV0ZWRDbGFzczogJ211dGVkJyxcbiAgICAvLyBBIGNsYXNzIChDU1MpIGZvciBwaWNrZWQgZGF0ZSBpdGVtXG4gICAgcGlja2VkQ2xhc3M6ICdwaWNrZWQnLFxuICAgIC8vIEEgY2xhc3MgKENTUykgZm9yIGRpc2FibGVkIGRhdGUgaXRlbVxuICAgIGRpc2FibGVkQ2xhc3M6ICdkaXNhYmxlZCcsXG4gICAgLy8gQSBjbGFzcyAoQ1NTKSBmb3IgaGlnaGxpZ2h0IGRhdGUgaXRlbVxuICAgIGhpZ2hsaWdodGVkQ2xhc3M6ICdoaWdobGlnaHRlZCcsXG4gICAgLy8gVGhlIHRlbXBsYXRlIG9mIHRoZSBkYXRlcGlja2VyXG4gICAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci1jb250YWluZXJcIj4nICsgJzxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLXBhbmVsXCIgZGF0YS12aWV3PVwieWVhcnMgcGlja2VyXCI+JyArICc8dWw+JyArICc8bGkgZGF0YS12aWV3PVwieWVhcnMgcHJldlwiPiZsc2FxdW87PC9saT4nICsgJzxsaSBkYXRhLXZpZXc9XCJ5ZWFycyBjdXJyZW50XCI+PC9saT4nICsgJzxsaSBkYXRhLXZpZXc9XCJ5ZWFycyBuZXh0XCI+JnJzYXF1bzs8L2xpPicgKyAnPC91bD4nICsgJzx1bCBkYXRhLXZpZXc9XCJ5ZWFyc1wiPjwvdWw+JyArICc8L2Rpdj4nICsgJzxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLXBhbmVsXCIgZGF0YS12aWV3PVwibW9udGhzIHBpY2tlclwiPicgKyAnPHVsPicgKyAnPGxpIGRhdGEtdmlldz1cInllYXIgcHJldlwiPiZsc2FxdW87PC9saT4nICsgJzxsaSBkYXRhLXZpZXc9XCJ5ZWFyIGN1cnJlbnRcIj48L2xpPicgKyAnPGxpIGRhdGEtdmlldz1cInllYXIgbmV4dFwiPiZyc2FxdW87PC9saT4nICsgJzwvdWw+JyArICc8dWwgZGF0YS12aWV3PVwibW9udGhzXCI+PC91bD4nICsgJzwvZGl2PicgKyAnPGRpdiBjbGFzcz1cImRhdGVwaWNrZXItcGFuZWxcIiBkYXRhLXZpZXc9XCJkYXlzIHBpY2tlclwiPicgKyAnPHVsPicgKyAnPGxpIGRhdGEtdmlldz1cIm1vbnRoIHByZXZcIj4mbHNhcXVvOzwvbGk+JyArICc8bGkgZGF0YS12aWV3PVwibW9udGggY3VycmVudFwiPjwvbGk+JyArICc8bGkgZGF0YS12aWV3PVwibW9udGggbmV4dFwiPiZyc2FxdW87PC9saT4nICsgJzwvdWw+JyArICc8dWwgZGF0YS12aWV3PVwid2Vla1wiPjwvdWw+JyArICc8dWwgZGF0YS12aWV3PVwiZGF5c1wiPjwvdWw+JyArICc8L2Rpdj4nICsgJzwvZGl2PicsXG4gICAgLy8gVGhlIG9mZnNldCB0b3Agb3IgYm90dG9tIG9mIHRoZSBkYXRlcGlja2VyIGZyb20gdGhlIGVsZW1lbnRcbiAgICBvZmZzZXQ6IDEwLFxuICAgIC8vIFRoZSBgei1pbmRleGAgb2YgdGhlIGRhdGVwaWNrZXJcbiAgICB6SW5kZXg6IDEwMDAsXG4gICAgLy8gRmlsdGVyIGVhY2ggZGF0ZSBpdGVtIChyZXR1cm4gYGZhbHNlYCB0byBkaXNhYmxlIGEgZGF0ZSBpdGVtKVxuICAgIGZpbHRlcjogbnVsbCxcbiAgICAvLyBFdmVudCBzaG9ydGN1dHNcbiAgICBzaG93OiBudWxsLFxuICAgIGhpZGU6IG51bGwsXG4gICAgcGljazogbnVsbFxuICB9O1xuXG4gIHZhciBXSU5ET1cgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHt9O1xuICB2YXIgTkFNRVNQQUNFID0gJ2RhdGVwaWNrZXInO1xuICB2YXIgRVZFTlRfQ0xJQ0sgPSBcImNsaWNrLlwiLmNvbmNhdChOQU1FU1BBQ0UpO1xuICB2YXIgRVZFTlRfRk9DVVMgPSBcImZvY3VzLlwiLmNvbmNhdChOQU1FU1BBQ0UpO1xuICB2YXIgRVZFTlRfSElERSA9IFwiaGlkZS5cIi5jb25jYXQoTkFNRVNQQUNFKTtcbiAgdmFyIEVWRU5UX0tFWVVQID0gXCJrZXl1cC5cIi5jb25jYXQoTkFNRVNQQUNFKTtcbiAgdmFyIEVWRU5UX1BJQ0sgPSBcInBpY2suXCIuY29uY2F0KE5BTUVTUEFDRSk7XG4gIHZhciBFVkVOVF9SRVNJWkUgPSBcInJlc2l6ZS5cIi5jb25jYXQoTkFNRVNQQUNFKTtcbiAgdmFyIEVWRU5UX1NDUk9MTCA9IFwic2Nyb2xsLlwiLmNvbmNhdChOQU1FU1BBQ0UpO1xuICB2YXIgRVZFTlRfU0hPVyA9IFwic2hvdy5cIi5jb25jYXQoTkFNRVNQQUNFKTtcbiAgdmFyIENMQVNTX0hJREUgPSBcIlwiLmNvbmNhdChOQU1FU1BBQ0UsIFwiLWhpZGVcIik7XG4gIHZhciBMQU5HVUFHRVMgPSB7fTtcbiAgdmFyIFZJRVdTID0ge1xuICAgIERBWVM6IDAsXG4gICAgTU9OVEhTOiAxLFxuICAgIFlFQVJTOiAyXG4gIH07XG5cbiAgdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgZnVuY3Rpb24gdHlwZU9mKG9iaikge1xuICAgIHJldHVybi
21167B0b1N0cmluZy5jYWxsKG9iaikuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgfVxuICB2YXIgaXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgV0lORE9XLmlzTmFOO1xuICBmdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmICFpc05hTih2YWx1ZSk7XG4gIH1cbiAgZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcbiAgfVxuICBmdW5jdGlvbiBpc0RhdGUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZU9mKHZhbHVlKSA9PT0gJ2RhdGUnICYmICFpc05hTih2YWx1ZS5nZXRUaW1lKCkpO1xuICB9XG4gIGZ1bmN0aW9uIHByb3h5KGZuLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMl0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJnczIgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnczJbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3MuY29uY2F0KGFyZ3MyKSk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBzZWxlY3Rvck9mKHZpZXcpIHtcbiAgICByZXR1cm4gXCJbZGF0YS12aWV3PVxcXCJcIi5jb25jYXQodmlldywgXCJcXFwiXVwiKTtcbiAgfVxuICBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgICByZXR1cm4geWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwO1xuICB9XG4gIGZ1bmN0aW9uIGdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgcmV0dXJuIFszMSwgaXNMZWFwWWVhcih5ZWFyKSA/IDI5IDogMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXVttb250aF07XG4gIH1cbiAgZnVuY3Rpb24gZ2V0TWluRGF5KHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgICByZXR1cm4gTWF0aC5taW4oZGF5LCBnZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpO1xuICB9XG4gIHZhciBmb3JtYXRQYXJ0cyA9IC8oeXxtfGQpKy9nO1xuICBmdW5jdGlvbiBwYXJzZUZvcm1hdChmb3JtYXQpIHtcbiAgICB2YXIgc291cmNlID0gU3RyaW5nKGZvcm1hdCkudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcGFydHMgPSBzb3VyY2UubWF0Y2goZm9ybWF0UGFydHMpO1xuXG4gICAgaWYgKCFwYXJ0cyB8fCBwYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRlIGZvcm1hdC4nKTtcbiAgICB9XG5cbiAgICBmb3JtYXQgPSB7XG4gICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgIHBhcnRzOiBwYXJ0c1xuICAgIH07XG4gICAgJC5lYWNoKHBhcnRzLCBmdW5jdGlvbiAoaSwgcGFydCkge1xuICAgICAgc3dpdGNoIChwYXJ0KSB7XG4gICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgZm9ybWF0Lmhhc0RheSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICBmb3JtYXQuaGFzTW9udGggPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3l5eXknOlxuICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgZm9ybWF0Lmhhc1llYXIgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuICBmdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCkge1xuICAgIHZhciBpbmNsdWRlSGlkZGVuID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICB2YXIgJGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgIHZhciBwb3NpdGlvbiA9ICRlbGVtZW50LmNzcygncG9zaXRpb24nKTtcbiAgICB2YXIgZXhjbHVkZVN0YXRpY1BhcmVudCA9IHBvc2l0aW9uID09PSAnYWJzb2x1dGUnO1xuICAgIHZhciBvdmVyZmxvd1JlZ2V4ID0gaW5jbHVkZUhpZGRlbiA/IC9hdXRvfHNjcm9sbHxoaWRkZW4vIDogL2F1dG98c2Nyb2xsLztcbiAgICB2YXIgc2Nyb2xsUGFyZW50ID0gJGVsZW1lbnQucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbiAoaW5kZXgsIHBhcmVudCkge1xuICAgICAgdmFyICRwYXJlbnQgPSAkKHBhcmVudCk7XG5cbiAgICAgIGlmIChleGNsdWRlU3RhdGljUGFyZW50ICYmICRwYXJlbnQuY3NzKCdwb3NpdGlvbicpID09PSAnc3RhdGljJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdmVyZmxvd1JlZ2V4LnRlc3QoJHBhcmVudC5jc3MoJ292ZXJmbG93JykgKyAkcGFyZW50LmNzcygnb3ZlcmZsb3cteScpICsgJHBhcmVudC5jc3MoJ292ZXJmbG93LXgnKSk7XG4gICAgfSkuZXEoMCk7XG4gICAgcmV0dXJuIHBvc2l0aW9uID09PSAnZml4ZWQnIHx8ICFzY3JvbGxQYXJlbnQubGVuZ3RoID8gJChlbGVtZW50Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpIDogc2Nyb2xsUGFyZW50O1xuICB9XG4gIC8qKlxuICAgKiBBZGQgbGVhZGluZyB6ZXJvZXMgdG8gdGhlIGdpdmVuIHZhbHVlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBhZGQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTFdIC0gVGhlIGV4cGVjdGVkIHZhbHVlIGxlbmd0aC5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBjb252ZXJ0ZWQgdmFsdWUuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFkZExlYWRpbmdaZXJvKHZhbHVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMTtcbiAgICB2YXIgc3RyI
21167D0gU3RyaW5nKE1hdGguYWJzKHZhbHVlKSk7XG4gICAgdmFyIGkgPSBzdHIubGVuZ3RoO1xuICAgIHZhciByZXN1bHQgPSAnJztcblxuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHJlc3VsdCArPSAnLSc7XG4gICAgfVxuXG4gICAgd2hpbGUgKGkgPCBsZW5ndGgpIHtcbiAgICAgIGkgKz0gMTtcbiAgICAgIHJlc3VsdCArPSAnMCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdCArIHN0cjtcbiAgfVxuXG4gIHZhciBSRUdFWFBfRElHSVRTID0gL1xcZCsvZztcbiAgdmFyIG1ldGhvZHMgPSB7XG4gICAgLy8gU2hvdyB0aGUgZGF0ZXBpY2tlclxuICAgIHNob3c6IGZ1bmN0aW9uIHNob3coKSB7XG4gICAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgICAgdGhpcy5idWlsZCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zaG93bikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRyaWdnZXIoRVZFTlRfU0hPVykuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNob3duID0gdHJ1ZTtcbiAgICAgIHRoaXMuJHBpY2tlci5yZW1vdmVDbGFzcyhDTEFTU19ISURFKS5vbihFVkVOVF9DTElDSywgJC5wcm94eSh0aGlzLmNsaWNrLCB0aGlzKSk7XG4gICAgICB0aGlzLnNob3dWaWV3KHRoaXMub3B0aW9ucy5zdGFydFZpZXcpO1xuXG4gICAgICBpZiAoIXRoaXMuaW5saW5lKSB7XG4gICAgICAgIHRoaXMuJHNjcm9sbFBhcmVudC5vbihFVkVOVF9TQ1JPTEwsICQucHJveHkodGhpcy5wbGFjZSwgdGhpcykpO1xuICAgICAgICAkKHdpbmRvdykub24oRVZFTlRfUkVTSVpFLCB0aGlzLm9uUmVzaXplID0gcHJveHkodGhpcy5wbGFjZSwgdGhpcykpO1xuICAgICAgICAkKGRvY3VtZW50KS5vbihFVkVOVF9DTElDSywgdGhpcy5vbkdsb2JhbENsaWNrID0gcHJveHkodGhpcy5nbG9iYWxDbGljaywgdGhpcykpO1xuICAgICAgICAkKGRvY3VtZW50KS5vbihFVkVOVF9LRVlVUCwgdGhpcy5vbkdsb2JhbEtleXVwID0gcHJveHkodGhpcy5nbG9iYWxLZXl1cCwgdGhpcykpO1xuICAgICAgICB0aGlzLnBsYWNlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBIaWRlIHRoZSBkYXRlcGlja2VyXG4gICAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcbiAgICAgIGlmICghdGhpcy5zaG93bikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRyaWdnZXIoRVZFTlRfSElERSkuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNob3duID0gZmFsc2U7XG4gICAgICB0aGlzLiRwaWNrZXIuYWRkQ2xhc3MoQ0xBU1NfSElERSkub2ZmKEVWRU5UX0NMSUNLLCB0aGlzLmNsaWNrKTtcblxuICAgICAgaWYgKCF0aGlzLmlubGluZSkge1xuICAgICAgICB0aGlzLiRzY3JvbGxQYXJlbnQub2ZmKEVWRU5UX1NDUk9MTCwgdGhpcy5wbGFjZSk7XG4gICAgICAgICQod2luZG93KS5vZmYoRVZFTlRfUkVTSVpFLCB0aGlzLm9uUmVzaXplKTtcbiAgICAgICAgJChkb2N1bWVudCkub2ZmKEVWRU5UX0NMSUNLLCB0aGlzLm9uR2xvYmFsQ2xpY2spO1xuICAgICAgICAkKGRvY3VtZW50KS5vZmYoRVZFTlRfS0VZVVAsIHRoaXMub25HbG9iYWxLZXl1cCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB0b2dnbGU6IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcbiAgICAgIGlmICh0aGlzLnNob3duKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBVcGRhdGUgdGhlIGRhdGVwaWNrZXIgd2l0aCB0aGUgY3VycmVudCBpbnB1dCB2YWx1ZVxuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuXG4gICAgICBpZiAodmFsdWUgPT09IHRoaXMub2xkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldERhdGUodmFsdWUsIHRydWUpO1xuICAgICAgdGhpcy5vbGRWYWx1ZSA9IHZhbHVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQaWNrIHRoZSBjdXJyZW50IGRhdGUgdG8gdGhlIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBfdmlldyAocHJpdmF0ZSlcbiAgICAgKi9cbiAgICBwaWNrOiBmdW5jdGlvbiBwaWNrKF92aWV3KSB7XG4gICAgICB2Y
21167XIgJHRoaXMgPSB0aGlzLiRlbGVtZW50O1xuICAgICAgdmFyIGRhdGUgPSB0aGlzLmRhdGU7XG5cbiAgICAgIGlmICh0aGlzLnRyaWdnZXIoRVZFTlRfUElDSywge1xuICAgICAgICB2aWV3OiBfdmlldyB8fCAnJyxcbiAgICAgICAgZGF0ZTogZGF0ZVxuICAgICAgfSkuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkYXRlID0gdGhpcy5mb3JtYXREYXRlKHRoaXMuZGF0ZSk7XG4gICAgICB0aGlzLnNldFZhbHVlKGRhdGUpO1xuXG4gICAgICBpZiAodGhpcy5pc0lucHV0KSB7XG4gICAgICAgICR0aGlzLnRyaWdnZXIoJ2lucHV0Jyk7XG4gICAgICAgICR0aGlzLnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgICAgfVxuICAgIH0sXG4gICAgLy8gUmVzZXQgdGhlIGRhdGVwaWNrZXJcbiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICB0aGlzLnNldERhdGUodGhpcy5pbml0aWFsRGF0ZSwgdHJ1ZSk7XG4gICAgICB0aGlzLnNldFZhbHVlKHRoaXMuaW5pdGlhbFZhbHVlKTtcblxuICAgICAgaWYgKHRoaXMuc2hvd24pIHtcbiAgICAgICAgdGhpcy5zaG93Vmlldyh0aGlzLm9wdGlvbnMuc3RhcnRWaWV3KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtb250aCBuYW1lIHdpdGggZ2l2ZW4gYXJndW1lbnQgb3IgdGhlIGN1cnJlbnQgZGF0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG1vbnRoIChvcHRpb25hbClcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHNob3J0Rm9ybSAob3B0aW9uYWwpXG4gICAgICogQHJldHVybiB7U3RyaW5nfSAobW9udGggbmFtZSlcbiAgICAgKi9cbiAgICBnZXRNb250aE5hbWU6IGZ1bmN0aW9uIGdldE1vbnRoTmFtZShtb250aCwgc2hvcnRGb3JtKSB7XG4gICAgICB2Y
21167XIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIHZhciBtb250aHNTaG9ydCA9IG9wdGlvbnMubW9udGhzU2hvcnQ7XG4gICAgICB2YXIgbW9udGhzID0gb3B0aW9ucy5tb250aHM7XG5cbiAgICAgIGlmICgkLmlzTnVtZXJpYyhtb250aCkpIHtcbiAgICAgICAgbW9udGggPSBOdW1iZXIobW9udGgpO1xuICAgICAgfSBlbHNlIGlmIChpc1VuZGVmaW5lZChzaG9ydEZvcm0pKSB7XG4gICAgICAgIHNob3J0Rm9ybSA9IG1vbnRoO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvcnRGb3JtID09PSB0cnVlKSB7XG4gICAgICAgIG1vbnRocyA9IG1vbnRoc1Nob3J0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbW9udGhzW2lzTnVtYmVyKG1vbnRoKSA/IG1vbnRoIDogdGhpcy5kYXRlLmdldE1vbnRoKCldO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRheSBuYW1lIHdpdGggZ2l2ZW4gYXJndW1lbnQgb3IgdGhlIGN1cnJlbnQgZGF0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGRheSAob3B0aW9uYWwpXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzaG9ydEZvcm0gKG9wdGlvbmFsKVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gbWluIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IChkYXkgbmFtZSlcbiAgICAgKi9cbiAgICBnZXREYXlOYW1lOiBmdW5jdGlvbiBnZXREYXlOYW1lKGRheSwgc2hvcnRGb3JtLCBtaW4pIHtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgdmFyIGRheXMgPSBvcHRpb25zLmRheXM7XG5cbiAgICAgIGlmICgkLmlzTnVtZXJpYyhkYXkpKSB7XG4gICAgICAgIGRheSA9IE51bWJlcihkYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKG1pbikpIHtcbiAgICAgICAgICBtaW4gPSBzaG9ydEZvcm07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNVbmRlZmluZWQoc2hvcnRGb3JtKSkge1xuICAgICAgICAgIHNob3J0Rm9ybSA9IGRheTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobWluKSB7XG4gICAgICAgIGRheXMgP
21167SBvcHRpb25zLmRheXNNaW47XG4gICAgICB9IGVsc2UgaWYgKHNob3J0Rm9ybSkge1xuICAgICAgICBkYXlzID0gb3B0aW9ucy5kYXlzU2hvcnQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXlzW2lzTnVtYmVyKGRheSkgPyBkYXkgOiB0aGlzLmRhdGUuZ2V0RGF5KCldO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZGF0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBmb3JtYXR0ZWQgKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4ge0RhdGV8U3RyaW5nfSAoZGF0ZSlcbiAgICAgKi9cbiAgICBnZXREYXRlOiBmdW5jdGlvbiBnZXREYXRlKGZvcm1hdHRlZCkge1xuICAgICAgdmFyIGRhdGUgPSB0aGlzLmRhdGU7XG4gICAgICByZXR1cm4gZm9ybWF0dGVkID8gdGhpcy5mb3JtYXREYXRlKGRhdGUpIDogbmV3IERhdGUoZGF0ZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY3VycmVudCBkYXRlIHdpdGggYSBuZXcgZGF0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBfdXBkYXRlZCAocHJpdmF0ZSlcbiAgICAgKi9cbiAgICBzZXREYXRlOiBmdW5jdGlvbiBzZXREYXRlKGRhdGUsIF91cGRhdGVkKSB7XG4gICAgICB2YXIgZmlsdGVyID0gdGhpcy5vcHRpb25zLmZpbHRlcjtcblxuICAgICAgaWYgKGlzRGF0ZShkYXRlKSB8fCBpc1N0cmluZyhkYXRlKSkge1xuICAgICAgICBkYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZSk7XG5cbiAgICAgICAgaWYgKCQuaXNGdW5jdGlvbihmaWx0ZXIpICYmIGZpbHRlci5jYWxsKHRoaXMuJGVsZW1lbnQsIGRhdGUsICdkYXknKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGUgPSBkYXRlO1xuICAgICAgICB0aGlzLnZpZXdEYXRlID0gbmV3IERhdGUoZGF0ZSk7XG5cbiAgICAgICAgaWYgKCFfdXBkYXRlZCkge1xuICAgICAgICAgIHRoaXMucGljaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYnVpbHQpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgc3RhcnQgdmlldyBkYXRlIHdpdGggYSBuZXcgZGF0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtEYXRlfHN0cmluZ3xudWxsfSBkYXRlXG4gICAgICovXG4gICAgc2V0U3RhcnREYXRlOiBmdW5jdGlvbiBzZXRTdGFydERhdGUoZGF0ZSkge1xuICAgICAgaWYgKGlzRGF0ZShkYXRlKSB8fCBpc1N0cmluZyhkYXRlKSkge1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMucGFyc2VEYXRlKGRhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGFydERhdGUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5idWlsdCkge1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGVuZCB2aWV3IGRhdGUgd2l0aCBhIG5ldyBkYXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RhdGV8c3RyaW5nfG51bGx9IGRhdGVcbiAgICAgKi9cbiAgICBzZXRFbmREYXRlOiBmdW5jdGlvbiBzZXRFbmREYXRlKGRhdGUpIHtcbiAgICAgIGlmIChpc0RhdGUoZGF0ZSkgfHwgaXNTdHJpbmcoZGF0ZSkpIHtcbiAgICAgICAgdGhpcy5lbmREYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVuZERhdGUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5idWlsdCkge1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBhIGRhdGUgc3RyaW5nIHdpdGggdGhlIHNldCBkYXRlIGZvcm1hdFxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGVcbiAgICAgKiBAcmV0dXJuIHtEYXRlfSAocGFyc2VkIGRhdGUpXG4gICAgICovXG4gICAgcGFyc2VEYXRlOiBmdW5jdGlvbiBwYXJzZURhdGUoZGF0ZSkge1xuICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuZm9ybWF0O1xuICAgICAgdmFyIHBhcnRzID0gW107XG5cbiAgICAgIGlmICghaXNEYXRlKGRhdGUpKSB7XG4gICAgICAgIGlmIChpc1N0cmluZyhkYXRlKSkge1xuICAgICAgICAgIHBhcnRzID0gZGF0ZS5tYXRjaChSRUdFWFBfRElHSVRTKSB8fCBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGUgPSBkYXRlID8gbmV3IERhdGUoZGF0ZSkgOiBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIGlmICghaXNEYXRlKGRhdGUpKSB7XG4gICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSBmb3JtYXQucGFydHMubGVuZ3RoKSB7XG4gICAgICAgICAgJC5lYWNoKHBhcnRzLCBmdW5jdGlvbiAoaSwgcGFydCkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gcGFyc2VJbnQocGFydCwgMTApO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdC5wYXJ0c1tpXSkge1xuICAgICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGRhdGUuc2V0RGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICBkYXRlLnNldE1vbnRoKHZhbHVlIC0gMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoMjAwMCArIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlICd5eXl5JzpcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyAyLWRpZ2l0IHllYXIgdG8gMjAwMCtcbiAgICAgICAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKHBhcnQubGVuZ3RoID09PSAyID8gMjAwMCArIHZhbHVlIDogdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgI
21167H1cbiAgICAgIH0gLy8gSWdub3JlIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzIGFuZCBtaWxsaXNlY29uZHMgdG8gYXZvaWQgc2lkZSBlZmZlY3QgKCMxOTIpXG5cblxuICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZvcm1hdCBhIGRhdGUgb2JqZWN0IHRvIGEgc3RyaW5nIHdpdGggdGhlIHNldCBkYXRlIGZvcm1hdFxuICAgICAqXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlXG4gICAgICogQHJldHVybiB7U3RyaW5nfSAoZm9ybWF0dGVkIGRhdGUpXG4gICAgICovXG4gICAgZm9ybWF0RGF0ZTogZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlKSB7XG4gICAgICB2YXIgZm9ybWF0ID0gdGhpcy5mb3JtYXQ7XG4gICAgICB2YXIgZm9ybWF0dGVkID0gJyc7XG5cbiAgICAgIGlmIChpc0RhdGUoZGF0ZSkpIHtcbiAgICAgICAgdmFyIHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIHZhciBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICAgICAgdmFyIGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICB2YXIgdmFsdWVzID0ge1xuICAgICAgICAgIGQ6IGRheSxcbiAgICAgICAgICBkZDogYWRkTGVhZGluZ1plcm8oZGF5LCAyKSxcbiAgICAgICAgICBtOiBtb250aCArIDEsXG4gICAgICAgICAgbW06IGFkZExlYWRpbmdaZXJvKG1vbnRoICsgMSwgMiksXG4gICAgICAgICAgeXk6IFN0cmluZyh5ZWFyKS5zdWJzdHJpbmcoMiksXG4gICAgICAgICAgeXl5eTogYWRkTGVhZGluZ1plcm8oeWVhciwgNClcbiAgICAgICAgfTtcbiAgICAgICAgZm9ybWF0dGVkID0gZm9ybWF0LnNvdXJjZTtcbiAgICAgICAgJC5lYWNoKGZvcm1hdC5wYXJ0cywgZnVuY3Rpb24gKGksIHBhcnQpIHtcbiAgICAgICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZShwYXJ0LCB2YWx1ZXNbcGFydF0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcm1hdHRlZDtcbiAgICB9LFxuICAgIC8vIERlc3Ryb3kgdGhlIGRhdGVwaWNrZXIgYW5kIHJlbW92ZSB0aGUgaW5zdGFuY2UgZnJvbSB0aGUgdGFyZ2V0IGVsZW1lbnRcbiAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdGhpcy51bmJpbmQoKTtcbiAgICAgIHRoaXMudW5idWlsZCgpO1xuICAgICAgdGhpcy4kZWxlbWVudC5yZW1vdmVEYXRhKE5BTUVTUEFDRSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVycyA9IHtcbiAgICBjbGljazogZnVuY3Rpb24gY2xpY2soZSkge1xuICAgICAgdmFyICR0YXJnZXQgPSAkKGUudGFyZ2V0KTtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIGRhdGUgPSB0aGlzLmRhdGUsXG4gICAgICAgICAgdmlld0RhdGUgPSB0aGlzLnZpZXdEYXRlLFxuICAgICAgICAgIGZvcm1hdCA9IHRoaXMuZm9ybWF0O1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKCR0YXJnZXQuaGFzQ2xhc3MoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2Y
21167XIgdmlldyA9ICR0YXJnZXQuZGF0YSgndmlldycpO1xuICAgICAgdmFyIHZpZXdZZWFyID0gdmlld0RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIHZhciB2aWV3TW9udGggPSB2aWV3RGF0ZS5nZXRNb250aCgpO1xuICAgICAgdmFyIHZpZXdEYXkgPSB2aWV3RGF0ZS5nZXREYXRlKCk7XG5cbiAgICAgIHN3aXRjaCAodmlldykge1xuICAgICAgICBjYXNlICd5ZWFycyBwcmV2JzpcbiAgICAgICAgY2FzZSAneWVhcnMgbmV4dCc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmlld1llYXIgPSB2aWV3ID09PSAneWVhcnMgcHJldicgPyB2aWV3WWVhciAtIDEwIDogdmlld1llYXIgKyAxMDtcbiAgICAgICAgICAgIHZpZXdEYXRlLnNldEZ1bGxZZWFyKHZpZXdZZWFyKTtcbiAgICAgICAgICAgIHZpZXdEYXRlLnNldERhdGUoZ2V0TWluRGF5KHZpZXdZZWFyLCB2aWV3TW9udGgsIHZpZXdEYXkpKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyWWVhcnMoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlICd5ZWFyIHByZXYnOlxuICAgICAgICBjYXNlICd5ZWFyIG5leHQnOlxuICAgICAgICAgIHZpZXdZZWFyID0gdmlldyA9PT0gJ3llYXIgcHJldicgPyB2aWV3WWVhciAtIDEgOiB2aWV3WWVhciArIDE7XG4gICAgICAgICAgdmlld0RhdGUuc2V0RnVsbFllYXIodmlld1llYXIpO1xuICAgICAgICAgIHZpZXdEYXRlLnNldERhdGUoZ2V0TWluRGF5KHZpZXdZZWFyLCB2aWV3TW9udGgsIHZpZXdEYXkpKTtcbiAgICAgICAgICB0aGlzLnJlbmRlck1vbnRocygpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3llYXIgY3VycmVudCc6XG4gICAgICAgICAgaWYgKGZvcm1hdC5oYXNZZWFyKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dWaWV3KFZJRVdTLllFQVJTKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd5ZWFyIHBpY2tlZCc6XG4gICAgICAgICAgaWYgKGZvcm1hdC5oYXNNb250aCkge1xuICAgICAgICAgICAgdGhpcy5zaG93VmlldyhWSUVXUy5NT05USFMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkdGFyZ2V0LmFkZENsYXNzKG9wdGlvbnMucGlja2VkQ2xhc3MpLnNpYmxpbmdzKCkucmVtb3ZlQ2xhc3Mob3B0aW9ucy5waWNrZWRDbGFzcyk7XG4gICAgICAgICAgICB0aGlzLmhpZGVWaWV3KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5waWNrKCd5ZWFyJyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgdmlld1llYXIgPSBwYXJzZUludCgk
21167dGFyZ2V0LnRleHQoKSwgMTApO1xuICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIodmlld1llYXIpO1xuICAgICAgICAgIGRhdGUuc2V0RGF0ZShnZXRNaW5EYXkodmlld1llYXIsIHZpZXdNb250aCwgdmlld0RheSkpO1xuICAgICAgICAgIHZpZXdEYXRlLnNldEZ1bGxZZWFyKHZpZXdZZWFyKTtcbiAgICAgICAgICB2aWV3RGF0ZS5zZXREYXRlKGdldE1pbkRheSh2aWV3WWVhciwgdmlld01vbnRoLCB2aWV3RGF5KSk7XG5cbiAgICAgICAgICBpZiAoZm9ybWF0Lmhhc01vbnRoKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dWaWV3KFZJRVdTLk1PTlRIUyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICR0YXJnZXQuYWRkQ2xhc3Mob3B0aW9ucy5waWNrZWRDbGFzcykuc2libGluZ3MoKS5yZW1vdmVDbGFzcyhvcHRpb25zLnBpY2tlZENsYXNzKTtcbiAgICAgICAgICAgIHRoaXMuaGlkZVZpZXcoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnBpY2soJ3llYXInKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdtb250aCBwcmV2JzpcbiAgICAgICAgY2FzZSAnbW9udGggbmV4dCc6XG4gICAgICAgICAgdmlld01vbnRoID0gdmlldyA9PT0gJ21vbnRoIHByZXYnID8gdmlld01vbnRoIC0gMSA6IHZpZXdNb250aCArIDE7XG5cbiAgICAgICAgICBpZiAodmlld01vbnRoIDwgMCkge1xuICAgICAgICAgICAgdmlld1llYXIgLT0gMTtcbiAgICAgICAgICAgIHZpZXdNb250aCArPSAxMjtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZpZXdNb250aCA+IDExKSB7XG4gICAgICAgICAgICB2aWV3WWVhciArPSAxO1xuICAgICAgICAgICAgdmlld01vbnRoIC09IDEyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZpZXdEYXRlLnNldEZ1bGxZZWFyKHZpZXdZZWFyKTtcbiAgICAgICAgICB2aWV3RGF0ZS5zZXREYXRlKGdldE1pbkRheSh2aWV3WWVhciwgdmlld01vbnRoLCB2aWV3RGF5KSk7XG4gICAgICAgICAgdmlld0RhdGUuc2V0TW9udGgodmlld01vbnRoKTtcbiAgICAgICAgICB0aGlzLnJlbmRlckRheXMoKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdtb250aCBjdXJyZW50JzpcbiAgICAgICAgICBpZiAoZm9ybWF0Lmhhc01vbnRoKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dWaWV3KFZJRVdTLk1PTlRIUyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnbW9udGggcGlja2VkJzpcbiAgICAgICAgICBpZiAoZm9ybWF0Lmhhc0RheSkge1xuICAgICAgICAgICAgdGhpcy5zaG93VmlldyhWSUVXUy5EQVlTKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHRhcmdldC5hZGRDbGFzcyhvcHRpb25zLnBpY2tlZENsYXNzKS5zaWJsaW5ncygpLnJlbW92ZUNsYXNzKG9wdGlvbnMucGlja2VkQ2xhc3MpO1xuICAgICAgICAgICAgdGhpcy5oaWRlVmlldygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMucGljaygnbW9udGgnKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgdmlld01vbnRoID0gJC5pbkFycmF5KCR0YXJnZXQudGV4dCgpLCBvcHRpb25zLm1vbnRoc1Nob3J0KTtcbiAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKHZpZXdZZWFyKTsgLy8gU2V0IGRhdGUgYmVmb3JlIG1vbnRoIHRvIGF2b2lkIG1vbnRoIGNoYW5naW5nICgjMTk1KVxuXG4gICAgICAgICAgZGF0ZS5zZXREYXRlKGdldE1pbkRheSh2aWV3WWVhciwgdmlld01vbnRoLCB2aWV3RGF5KSk7XG4gICAgICAgICAgZGF0ZS5zZXRNb250aCh2aWV3TW9udGgpO1xuICAgICAgICAgIHZpZXdEYXRlLnNldEZ1bGxZZWFyKHZpZXdZZWFyKTtcbiAgICAgICAgICB2aWV3RGF0ZS5zZXREYXRlKGdldE1pbkRheSh2aWV3WWVhciwgdmlld01vbnRoLCB2aWV3RGF5KSk7XG4gICAgICAgICAgdmlld0RhdGUuc2V0TW9udGgodmlld01vbnRoKTtcblxuICAgICAgICAgIGlmIChmb3JtYXQuaGFzRGF5KSB7XG4gICAgICAgICAgICB0aGlzLnNob3dWaWV3KFZJRVdTLkRBWVMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkdGFyZ2V0LmFkZENsYXNzKG9wdGlvbnMucGlja2VkQ2xhc3MpLnNpYmxpbmdzKCkucmVtb3ZlQ2xhc3Mob3B0aW9ucy5waWNrZWRDbGFzcyk7XG4gICAgICAgICAgICB0aGlzLmhpZGVWaWV3KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5waWNrKCdtb250aCcpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2RheSBwcmV2JzpcbiAgICAgICAgY2FzZSAnZGF5IG5leHQnOlxuICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgIGlmICh2aWV3ID09PSAnZGF5IHByZXYnKSB7XG4gICAgICAgICAgICB2aWV3TW9udGggLT0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZpZXcgPT09ICdkYXkgbmV4dCcpIHtcbiAgICAgICAgICAgIHZpZXdNb250aCArPSAxO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZpZXdEYXkgPSBwYXJzZUludCgk
21167dGFyZ2V0LnRleHQoKSwgMTApO1xuICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIodmlld1llYXIpO1xuICAgICAgICAgIGRhdGUuc2V0TW9udGgodmlld01vbnRoKTtcbiAgICAgICAgICBkYXRlLnNldERhdGUodmlld0RheSk7XG4gICAgICAgICAgdmlld0RhdGUuc2V0RnVsbFllYXIodmlld1llYXIpO1xuICAgICAgICAgIHZpZXdEYXRlLnNldE1vbnRoKHZpZXdNb250aCk7XG4gICAgICAgICAgdmlld0RhdGUuc2V0RGF0ZSh2aWV3RGF5KTtcbiAgICAgICAgICB0aGlzLnJlbmRlckRheXMoKTtcblxuICAgICAgICAgIGlmICh2aWV3ID09PSAnZGF5Jykge1xuICAgICAgICAgICAgdGhpcy5oaWRlVmlldygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMucGljaygnZGF5Jyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZGF5IHBpY2tlZCc6XG4gICAgICAgICAgdGhpcy5oaWRlVmlldygpO1xuICAgICAgICAgIHRoaXMucGljaygnZGF5Jyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgIH1cbiAgICB9LFxuICAgIGdsb2JhbENsaWNrOiBmdW5jdGlvbiBnbG9iYWxDbGljayhfcmVmKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gX3JlZi50YXJnZXQ7XG4gICAgICB2YXIgZWxlbWVudCA9IHRoaXMuZWxlbWVudCxcbiAgICAgICAgICAkdHJpZ2dlciA9IHRoaXMuJHRyaWdnZXI7XG4gICAgICB2YXIgdHJpZ2dlciA9ICR0cmlnZ2VyWzBdO1xuICAgICAgdmFyIGhpZGRlbiA9IHRydWU7XG5cbiAgICAgIHdoaWxlICh0YXJnZXQgIT09IGRvY3VtZW50KSB7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IHRyaWdnZXIgfHwgdGFyZ2V0ID09PSBlbGVtZW50KSB7XG4gICAgICAgICAgaGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhpZGRlbikge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGtleXVwOiBmdW5jdGlvbiBrZXl1cCgpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfSxcbiAgICBnbG9iYWxLZXl1cDogZnVuY3Rpb24gZ2xvYmFsS2V5dXAoX3JlZjIpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBfcmVmMi50YXJnZXQsXG4gICAgICAgICAga2V5ID0gX3JlZjIua2V5LFxuICAgICAgICAgIGtleUNvZGUgPSBfcmVmMi5rZXlDb2RlO1xuXG4gICAgICBpZiAodGhpcy5pc0lucHV0ICYmIHRhcmdldCAhPT0gdGhpcy5lbGVtZW50ICYmIHRoaXMuc2hvd24gJiYgKGtleSA9PT0gJ1RhYicgfHwga2V5Q29kZSA9PT0gOSkpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhciByZW5kZXIgPSB7XG4gICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB0aGlzLnJlbmRlclllYXJzKCk7XG4gICAgICB0aGlzLnJlbmRlck1vbnRocygpO1xuICAgICAgdGhpcy5yZW5kZXJEYXlzKCk7XG4gICAgfSxcbiAgICByZW5kZXJXZWVrOiBmdW5jdGlvbiByZW5kZXJXZWVrKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGl0ZW1zID0gW107XG4gICAgICB2Y
21167XIgX3RoaXMkb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICB3ZWVrU3RhcnQgPSBfdGhpcyRvcHRpb25zLndlZWtTdGFydCxcbiAgICAgICAgICBkYXlzTWluID0gX3RoaXMkb3B0aW9ucy5kYXlzTWluO1xuICAgICAgd2Vla1N0YXJ0ID0gcGFyc2VJbnQod2Vla1N0YXJ0LCAxMCkgJSA3O1xuICAgICAgZGF5c01pbiA9IGRheXNNaW4uc2xpY2Uod2Vla1N0YXJ0KS5jb25jYXQoZGF5c01pbi5zbGljZSgwLCB3ZWVrU3RhcnQpKTtcbiAgICAgICQuZWFjaChkYXlzTWluLCBmdW5jdGlvbiAoaSwgZGF5KSB7XG4gICAgICAgIGl0ZW1zLnB1c2goX3RoaXMuY3JlYXRlSXRlbSh7XG4gICAgICAgICAgdGV4dDogZGF5XG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy4kd2Vlay5odG1sKGl0ZW1zLmpvaW4oJycpKTtcbiAgICB9LFxuICAgIHJlbmRlclllYXJzOiBmdW5jdGlvbiByZW5kZXJZZWFycygpIHtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIHN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlLFxuICAgICAgICAgIGVuZERhdGUgPSB0aGlzLmVuZERhdGU7XG4gICAgICB2YXIgZGlzYWJsZWRDbGFzcyA9IG9wdGlvbnMuZGlzYWJsZWRDbGFzcyxcbiAgICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcixcbiAgICAgICAgICB5ZWFyU3VmZml4ID0gb3B0aW9ucy55ZWFyU3VmZml4O1xuICAgICAgdmFyIHZpZXdZZWFyID0gdGhpcy52aWV3RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICB2Y
21167XIgdGhpc1llYXIgPSBub3cuZ2V0RnVsbFllYXIoKTtcbiAgICAgIHZhciB5ZWFyID0gdGhpcy5kYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICB2YXIgc3RhcnQgPSAtNTtcbiAgICAgIHZhciBlbmQgPSA2O1xuICAgICAgdmFyIGl0ZW1zID0gW107XG4gICAgICB2YXIgcHJldkRpc2FibGVkID0gZmFsc2U7XG4gICAgICB2YXIgbmV4dERpc2FibGVkID0gZmFsc2U7XG4gICAgICB2YXIgaTtcblxuICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPD0gZW5kOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh2aWV3WWVhciArIGksIDEsIDEpO1xuICAgICAgICB2YXIgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgICAgZGlzYWJsZWQgPSBkYXRlLmdldEZ1bGxZZWFyKCkgPCBzdGFydERhdGUuZ2V0RnVsbFllYXIoKTtcblxuICAgICAgICAgIGlmIChpID09PSBzdGFydCkge1xuICAgICAgICAgICAgcHJldkRpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaXNhYmxlZCAmJiBlbmREYXRlKSB7XG4gICAgICAgICAgZGlzYWJsZWQgPSBkYXRlLmdldEZ1bGxZZWFyKCkgPiBlbmREYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgICAgICAgICBpZiAoaSA9PT0gZW5kKSB7XG4gICAgICAgICAgICBuZXh0RGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRpc2FibGVkICYmIGZpbHRlcikge1xuICAgICAgICAgIGRpc2FibGVkID0gZmlsdGVyLmNhbGwodGhpcy4kZWxlbWVudCwgZGF0ZSwgJ3llYXInKSA9PT0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2Y
21167XIgcGlja2VkID0gdmlld1llYXIgKyBpID09PSB5ZWFyO1xuICAgICAgICB2YXIgdmlldyA9IHBpY2tlZCA/ICd5ZWFyIHBpY2tlZCcgOiAneWVhcic7XG4gICAgICAgIGl0ZW1zLnB1c2godGhpcy5jcmVhdGVJdGVtKHtcbiAgICAgICAgICBwaWNrZWQ6IHBpY2tlZCxcbiAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgdGV4dDogdmlld1llYXIgKyBpLFxuICAgICAgICAgIHZpZXc6IGRpc2FibGVkID8gJ3llYXIgZGlzYWJsZWQnIDogdmlldyxcbiAgICAgICAgICBoaWdobGlnaHRlZDogZGF0ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzWWVhclxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuJHllYXJzUHJldi50b2dnbGVDbGFzcyhkaXNhYmxlZENsYXNzLCBwcmV2RGlzYWJsZWQpO1xuICAgICAgdGhpcy4keWVhcnNOZXh0LnRvZ2dsZUNsYXNzKGRpc2FibGVkQ2xhc3MsIG5leHREaXNhYmxlZCk7XG4gICAgICB0aGlzLiR5ZWFyc0N1cnJlbnQudG9nZ2xlQ2xhc3MoZGlzYWJsZWRDbGFzcywgdHJ1ZSkuaHRtbChcIlwiLmNvbmNhdCh2aWV3WWVhciArIHN0YXJ0ICsgeWVhclN1ZmZpeCwgXCIgLSBcIikuY29uY2F0KHZpZXdZZWFyICsgZW5kKS5jb25jYXQoeWVhclN1ZmZpeCkpO1xuICAgICAgdGhpcy4keWVhcnMuaHRtbChpdGVtcy5qb2luKCcnKSk7XG4gICAgfSxcbiAgICByZW5kZXJNb250aHM6IGZ1bmN0aW9uIHJlbmRlck1vbnRocygpIHtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIHN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlLFxuICAgICAgICAgIGVuZERhdGUgPSB0aGlzLmVuZERhdGUsXG4gICAgICAgICAgdmlld0RhdGUgPSB0aGlzLnZpZXdEYXRlO1xuICAgICAgdmFyIGRpc2FibGVkQ2xhc3MgPSBvcHRpb25zLmRpc2FibGVkQ2xhc3MgfHwgJyc7XG4gICAgICB2Y
21167XIgbW9udGhzID0gb3B0aW9ucy5tb250aHNTaG9ydDtcbiAgICAgIHZhciBmaWx0ZXIgPSAkLmlzRnVuY3Rpb24ob3B0aW9ucy5maWx0ZXIpICYmIG9wdGlvbnMuZmlsdGVyO1xuICAgICAgdmFyIHZpZXdZZWFyID0gdmlld0RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgdmFyIHRoaXNZZWFyID0gbm93LmdldEZ1bGxZZWFyKCk7XG4gICAgICB2YXIgdGhpc01vbnRoID0gbm93LmdldE1vbnRoKCk7XG4gICAgICB2YXIgeWVhciA9IHRoaXMuZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgdmFyIG1vbnRoID0gdGhpcy5kYXRlLmdldE1vbnRoKCk7XG4gICAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICAgIHZhciBwcmV2RGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHZhciBuZXh0RGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHZhciBpO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDw9IDExOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh2aWV3WWVhciwgaSwgMSk7XG4gICAgICAgIHZhciBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChzdGFydERhdGUpIHtcbiAgICAgICAgICBwcmV2RGlzYWJsZWQgPSBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IHN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgIGRpc2FibGVkID0gcHJldkRpc2FibGVkICYmIGRhdGUuZ2V0TW9udGgoKSA8IHN0YXJ0RGF0ZS5nZXRNb250aCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaXNhYmxlZCAmJiBlbmREYXRlKSB7XG4gICAgICAgICAgbmV4dERpc2FibGVkID0gZGF0ZS5nZXRGdWxsWWVhcigpID09PSBlbmREYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgZGlzYWJsZWQgPSBuZXh0RGlzYWJsZWQgJiYgZGF0ZS5nZXRNb250aCgpID4gZW5kRGF0ZS5nZXRNb250aCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaXNhYmxlZCAmJiBmaWx0ZXIpIHtcbiAgICAgICAgICBkaXNhYmxlZCA9IGZpbHRlci5jYWxsKHRoaXMuJGVsZW1lbnQsIGRhdGUsICdtb250aCcpID09PSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwaWNrZWQgPSB2aWV3WWVhciA9PT0geWVhciAmJiBpID09PSBtb250aDtcbiAgICAgICAgdmFyIHZpZXcgPSBwaWNrZWQgPyAnbW9udGggcGlja2VkJyA6ICdtb250aCc7XG4gICAgICAgIGl0ZW1zLnB1c2godGhpcy5jcmVhdGVJdGVtKHtcbiAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgcGlja2VkOiBwaWNrZWQsXG4gICAgICAgICAgaGlnaGxpZ2h0ZWQ6IHZpZXdZZWFyID09PSB0aGlzWWVhciAmJiBkYXRlLmdldE1vbnRoKCkgPT09IHRoaXNNb250aCxcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICB0ZXh0OiBtb250aHNbaV0sXG4gICAgICAgICAgdmlldzogZGlzYWJsZWQgPyAnbW9udGggZGlzYWJsZWQnIDogdmlld1xuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuJHllYXJQcmV2LnRvZ2dsZUNsYXNzKGRpc2FibGVkQ2xhc3MsIHByZXZEaXNhYmxlZCk7XG4gICAgICB0aGlzLiR5ZWFyTmV4dC50b2dnbGVDbGFzcyhkaXNhYmxlZENsYXNzLCBuZXh0RGlzYWJsZWQpO1xuICAgICAgdGhpcy4keWVhckN1cnJlbnQudG9nZ2xlQ2xhc3MoZGlzYWJsZWRDbGFzcywgcHJldkRpc2FibGVkICYmIG5leHREaXNhYmxlZCkuaHRtbCh2aWV3WWVhciArIG9wdGlvbnMueWVhclN1ZmZpeCB8fCAnJyk7XG4gICAgICB0aGlzLiRtb250aHMuaHRtbChpdGVtcy5qb2luKCcnKSk7XG4gICAgfSxcbiAgICByZW5kZXJEYXlzOiBmdW5jdGlvbiByZW5kZXJEYXlzKCkge1xuICAgICAgdmFyICRlbGVtZW50ID0gdGhpcy4kZWxlbWVudCxcbiAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIHN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlLFxuICAgICAgICAgIGVuZERhdGUgPSB0aGlzLmVuZERhdGUsXG4gICAgICAgICAgdmlld0RhdGUgPSB0aGlzLnZpZXdEYXRlLFxuICAgICAgICAgIGN1cnJlbnREYXRlID0gdGhpcy5kYXRlO1xuICAgICAgdmFyIGRpc2FibGVkQ2xhc3MgPSBvcHRpb25zLmRpc2FibGVkQ2xhc3MsXG4gICAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXIsXG4gICAgICAgICAgbW9udGhzID0gb3B0aW9ucy5tb250aHMsXG4gICAgICAgICAgd2Vla1N0YXJ0ID0gb3B0aW9ucy53ZWVrU3RhcnQsXG4gICAgICAgICAgeWVhclN1ZmZpeCA9IG9wdGlvbnMueWVhclN1ZmZpeDtcbiAgICAgIHZhciB2aWV3WWVhciA9IHZpZXdEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICB2Y
21167XIgdmlld01vbnRoID0gdmlld0RhdGUuZ2V0TW9udGgoKTtcbiAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgdmFyIHRoaXNZZWFyID0gbm93LmdldEZ1bGxZZWFyKCk7XG4gICAgICB2YXIgdGhpc01vbnRoID0gbm93LmdldE1vbnRoKCk7XG4gICAgICB2YXIgdGhpc0RheSA9IG5vdy5nZXREYXRlKCk7XG4gICAgICB2YXIgeWVhciA9IGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICB2YXIgbW9udGggPSBjdXJyZW50RGF0ZS5nZXRNb250aCgpO1xuICAgICAgdmFyIGRheSA9IGN1cnJlbnREYXRlLmdldERhdGUoKTtcbiAgICAgIHZhciBsZW5ndGg7XG4gICAgICB2YXIgaTtcbiAgICAgIHZhciBuOyAvLyBEYXlzIG9mIHByZXYgbW9udGhcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgIHZhciBwcmV2SXRlbXMgPSBbXTtcbiAgICAgIHZhciBwcmV2Vmlld1llYXIgPSB2aWV3WWVhcjtcbiAgICAgIHZhciBwcmV2Vmlld01vbnRoID0gdmlld01vbnRoO1xuICAgICAgdmFyIHByZXZEaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodmlld01vbnRoID09PSAwKSB7XG4gICAgICAgIHByZXZWaWV3WWVhciAtPSAxO1xuICAgICAgICBwcmV2Vmlld01vbnRoID0gMTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmV2Vmlld01vbnRoIC09IDE7XG4gICAgICB9IC8vIFRoZSBsZW5ndGggb2YgdGhlIGRheXMgb2YgcHJldiBtb250aFxuXG5cbiAgICAgIGxlbmd0aCA9IGdldERheXNJbk1vbnRoKHByZXZWaWV3WWVhciwgcHJldlZpZXdNb250aCk7IC8vIFRoZSBmaXJzdCBkYXkgb2YgY3VycmVudCBtb250aFxuXG4gICAgICB2Y
21167XIgZmlyc3REYXkgPSBuZXcgRGF0ZSh2aWV3WWVhciwgdmlld01vbnRoLCAxKTsgLy8gVGhlIHZpc2libGUgbGVuZ3RoIG9mIHRoZSBkYXlzIG9mIHByZXYgbW9udGhcbiAgICAgIC8vIFswLDEsMiwzLDQsNSw2XSAtIFswLDEsMiwzLDQsNSw2XSA9PiBbLTYsLTUsLTQsLTMsLTIsLTEsMCwxLDIsMyw0LDUsNl1cblxuICAgICAgbiA9IGZpcnN0RGF5LmdldERheSgpIC0gcGFyc2VJbnQod2Vla1N0YXJ0LCAxMCkgJSA3OyAvLyBbLTYsLTUsLTQsLTMsLTIsLTEsMCwxLDIsMyw0LDUsNl0gPT4gWzEsMiwzLDQsNSw2LDddXG5cbiAgICAgIGlmIChuIDw9IDApIHtcbiAgICAgICAgbiArPSA3O1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgIHByZXZEaXNhYmxlZCA9IGZpcnN0RGF5LmdldFRpbWUoKSA8PSBzdGFydERhdGUuZ2V0VGltZSgpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSBsZW5ndGggLSAobiAtIDEpOyBpIDw9IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBwcmV2Vmlld0RhdGUgPSBuZXcgRGF0ZShwcmV2Vmlld1llYXIsIHByZXZWaWV3TW9udGgsIGkpO1xuICAgICAgICB2YXIgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgICAgZGlzYWJsZWQgPSBwcmV2Vmlld0RhdGUuZ2V0VGltZSgpIDwgc3RhcnREYXRlLmdldFRpbWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGlzYWJsZWQgJiYgZmlsdGVyKSB7XG4gICAgICAgICAgZGlzYWJsZWQgPSBmaWx0ZXIuY2FsbCgkZWxlbWVudCwgcHJldlZpZXdEYXRlLCAnZGF5JykgPT09IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldkl0ZW1zLnB1c2godGhpcy5jcmVhdGVJdGVtKHtcbiAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgaGlnaGxpZ2h0ZWQ6IHByZXZWaWV3WWVhciA9PT0gdGhpc1llYXIgJiYgcHJldlZpZXdNb250aCA9PT0gdGhpc01vbnRoICYmIHByZXZWaWV3RGF0ZS5nZXREYXRlKCkgPT09IHRoaXNEYXksXG4gICAgICAgICAgbXV0ZWQ6IHRydWUsXG4gICAgICAgICAgcGlja2VkOiBwcmV2Vmlld1llYXIgPT09IHllYXIgJiYgcHJldlZpZXdNb250aCA9PT0gbW9udGggJiYgaSA9PT0gZGF5LFxuICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgdmlldzogJ2RheSBwcmV2J1xuICAgICAgICB9KSk7XG4gICAgICB9IC8vIERheXMgb2YgbmV4dCBtb250aFxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4gICAgICB2Y
21167XIgbmV4dEl0ZW1zID0gW107XG4gICAgICB2YXIgbmV4dFZpZXdZZWFyID0gdmlld1llYXI7XG4gICAgICB2YXIgbmV4dFZpZXdNb250aCA9IHZpZXdNb250aDtcbiAgICAgIHZhciBuZXh0RGlzYWJsZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKHZpZXdNb250aCA9PT0gMTEpIHtcbiAgICAgICAgbmV4dFZpZXdZZWFyICs9IDE7XG4gICAgICAgIG5leHRWaWV3TW9udGggPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFZpZXdNb250aCArPSAxO1xuICAgICAgfSAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBkYXlzIG9mIGN1cnJlbnQgbW9udGhcblxuXG4gICAgICBsZW5ndGggPSBnZXREYXlzSW5Nb250aCh2aWV3WWVhciwgdmlld01vbnRoKTsgLy8gVGhlIHZpc2libGUgbGVuZ3RoIG9mIG5leHQgbW9udGggKDQyIG1lYW5zIDYgcm93cyBhbmQgNyBjb2x1bW5zKVxuXG4gICAgICBuID0gNDIgLSAocHJldkl0ZW1zLmxlbmd0aCArIGxlbmd0aCk7IC8vIFRoZSBsYXN0IGRheSBvZiBjdXJyZW50IG1vbnRoXG5cbiAgICAgIHZhciBsYXN0RGF0ZSA9IG5ldyBEYXRlKHZpZXdZZWFyLCB2aWV3TW9udGgsIGxlbmd0aCk7XG5cbiAgICAgIGlmIChlbmREYXRlKSB7XG4gICAgICAgIG5leHREaXNhYmxlZCA9IGxhc3REYXRlLmdldFRpbWUoKSA+PSBlbmREYXRlLmdldFRpbWUoKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gMTsgaSA8PSBuOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShuZXh0Vmlld1llYXIsIG5leHRWaWV3TW9udGgsIGkpO1xuICAgICAgICB2Y
21167XIgcGlja2VkID0gbmV4dFZpZXdZZWFyID09PSB5ZWFyICYmIG5leHRWaWV3TW9udGggPT09IG1vbnRoICYmIGkgPT09IGRheTtcbiAgICAgICAgdmFyIF9kaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChlbmREYXRlKSB7XG4gICAgICAgICAgX2Rpc2FibGVkID0gZGF0ZS5nZXRUaW1lKCkgPiBlbmREYXRlLmdldFRpbWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghX2Rpc2FibGVkICYmIGZpbHRlcikge1xuICAgICAgICAgIF9kaXNhYmxlZCA9IGZpbHRlci5jYWxsKCRlbGVtZW50LCBkYXRlLCAnZGF5JykgPT09IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV4dEl0ZW1zLnB1c2godGhpcy5jcmVhdGVJdGVtKHtcbiAgICAgICAgICBkaXNhYmxlZDogX2Rpc2FibGVkLFxuICAgICAgICAgIHBpY2tlZDogcGlja2VkLFxuICAgICAgICAgIGhpZ2hsaWdodGVkOiBuZXh0Vmlld1llYXIgPT09IHRoaXNZZWFyICYmIG5leHRWaWV3TW9udGggPT09IHRoaXNNb250aCAmJiBkYXRlLmdldERhdGUoKSA9PT0gdGhpc0RheSxcbiAgICAgICAgICBtdXRlZDogdHJ1ZSxcbiAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgIHZpZXc6ICdkYXkgbmV4dCdcbiAgICAgICAgfSkpO1xuICAgICAgfSAvLyBEYXlzIG9mIGN1cnJlbnQgbW9udGhcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuICAgICAgdmFyIGl0ZW1zID0gW107XG5cbiAgICAgIGZvciAoaSA9IDE7IGkgPD0gbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIF9kYXRlID0gbmV3IERhdGUodmlld1llYXIsIHZpZXdNb250aCwgaSk7XG5cbiAgICAgICAgdmFyIF9kaXNhYmxlZDIgPSBmYWxzZTtcblxuICAgICAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgICAgX2Rpc2FibGVkMiA9IF9kYXRlLmdldFRpbWUoKSA8IHN0YXJ0RGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIV9kaXNhYmxlZDIgJiYgZW5kRGF0ZSkge1xuICAgICAgICAgIF9kaXNhYmxlZDIgPSBfZGF0ZS5nZXRUaW1lKCkgPiBlbmREYXRlLmdldFRpbWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghX2Rpc2FibGVkMiAmJiBmaWx0ZXIpIHtcbiAgICAgICAgICBfZGlzYWJsZWQyID0gZmlsdGVyLmNhbGwoJGVsZW1lbnQsIF9kYXRlLCAnZGF5JykgPT09IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9waWNrZWQgPSB2aWV3WWVhciA9PT0geWVhciAmJiB2aWV3TW9udGggPT09IG1vbnRoICYmIGkgPT09IGRheTtcblxuICAgICAgICB2Y
21167XIgdmlldyA9IF9waWNrZWQgPyAnZGF5IHBpY2tlZCcgOiAnZGF5JztcbiAgICAgICAgaXRlbXMucHVzaCh0aGlzLmNyZWF0ZUl0ZW0oe1xuICAgICAgICAgIGRpc2FibGVkOiBfZGlzYWJsZWQyLFxuICAgICAgICAgIHBpY2tlZDogX3BpY2tlZCxcbiAgICAgICAgICBoaWdobGlnaHRlZDogdmlld1llYXIgPT09IHRoaXNZZWFyICYmIHZpZXdNb250aCA9PT0gdGhpc01vbnRoICYmIF9kYXRlLmdldERhdGUoKSA9PT0gdGhpc0RheSxcbiAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgIHZpZXc6IF9kaXNhYmxlZDIgPyAnZGF5IGRpc2FibGVkJyA6IHZpZXdcbiAgICAgICAgfSkpO1xuICAgICAgfSAvLyBSZW5kZXIgZGF5cyBwaWNrZXJcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuICAgICAgdGhpcy4kbW9udGhQcmV2LnRvZ2dsZUNsYXNzKGRpc2FibGVkQ2xhc3MsIHByZXZEaXNhYmxlZCk7XG4gICAgICB0aGlzLiRtb250aE5leHQudG9nZ2xlQ2xhc3MoZGlzYWJsZWRDbGFzcywgbmV4dERpc2FibGVkKTtcbiAgICAgIHRoaXMuJG1vbnRoQ3VycmVudC50b2dnbGVDbGFzcyhkaXNhYmxlZENsYXNzLCBwcmV2RGlzYWJsZWQgJiYgbmV4dERpc2FibGVkKS5odG1sKG9wdGlvbnMueWVhckZpcnN0ID8gXCJcIi5jb25jYXQodmlld1llYXIgKyB5ZWFyU3VmZml4LCBcIiBcIikuY29uY2F0KG1vbnRoc1t2aWV3TW9udGhdKSA6IFwiXCIuY29uY2F0KG1vbnRoc1t2aWV3TW9udGhdLCBcIiBcIikuY29uY2F0KHZpZXdZZWFyKS5jb25jYXQoeWVhclN1ZmZpeCkpO1xuICAgICAgdGhpcy4kZGF5cy5odG1sKHByZXZJdGVtcy5qb2luKCcnKSArIGl0ZW1zLmpvaW4oJycpICsgbmV4dEl0ZW1zLmpvaW4oJycpKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIENMQVNTX1RPUF9MRUZUID0gXCJcIi5jb25jYXQoTkFNRVNQQUNFLCBcIi10b3AtbGVmdFwiKTtcbiAgdmFyIENMQVNTX1RPUF9SSUdIVCA9IFwiXCIuY29uY2F0KE5BTUVTUEFDRSwgXCItdG9wLXJpZ2h0XCIpO1xuICB2YXIgQ0xBU1NfQk9UVE9NX0xFRlQgPSBcIlwiLmNvbmNhdChOQU1FU1BBQ0UsIFwiLWJvdHRvbS1sZWZ0XCIpO1xuICB2YXIgQ0xBU1NfQk9UVE9NX1JJR0hUID0gXCJcIi5jb25jYXQoTkFNRVNQQUNFLCBcIi1ib3R0b20tcmlnaHRcIik7XG4gIHZhciBDTEFTU19QTEFDRU1FTlRTID0gW0NMQVNTX1RPUF9MRUZULCBDTEFTU19UT1BfUklHSFQsIENMQVNTX0JPVFRPTV9MRUZULCBDTEFTU19CT1RUT01fUklHSFRdLmpvaW4oJyAnKTtcblxuICB2YXIgRGF0ZXBpY2tlciA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERhdGVwaWNrZXIoZWxlbWVudCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRGF0ZXBpY2tlcik7XG5cbiAgICAgIHRoaXMuJGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBERUZBVUxUUywgTEFOR1VBR0VTW29wdGlvbnMubGFuZ3VhZ2VdLCAkLmlzUGxhaW5PYmplY3Qob3B0aW9ucykgJiYgb3B0aW9ucyk7XG4gICAgICB0aGlzLiRzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCwgdHJ1ZSk7XG4gICAgICB0aGlzLmJ1aWx0ID0gZmFsc2U7XG4gICAgICB0aGlzLnNob3duID0gZmFsc2U7XG4gICAgICB0aGlzLmlzSW5wdXQgPSBmYWxzZTtcbiAgICAgIHRoaXMuaW5saW5lID0gZmFsc2U7XG4gICAgICB0aGlzLmluaXRpYWxWYWx1ZSA9ICcnO1xuICAgICAgdGhpcy5pbml0aWFsRGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLmVuZERhdGUgPSBudWxsO1xuICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNsYXNzKERhdGVwaWNrZXIsIFt7XG4gICAgICBrZXk6IFwiaW5pdFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIHZhciAkdGhpcyA9IHRoaXMuJGVsZW1lbnQsXG4gICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICB2Y
21167XIgc3RhcnREYXRlID0gb3B0aW9ucy5zdGFydERhdGUsXG4gICAgICAgICAgICBlbmREYXRlID0gb3B0aW9ucy5lbmREYXRlLFxuICAgICAgICAgICAgZGF0ZSA9IG9wdGlvbnMuZGF0ZTtcbiAgICAgICAgdGhpcy4kdHJpZ2dlciA9ICQob3B0aW9ucy50cmlnZ2VyKTtcbiAgICAgICAgdGhpcy5pc0lucHV0ID0gJHRoaXMuaXMoJ2lucHV0JykgfHwgJHRoaXMuaXMoJ3RleHRhcmVhJyk7XG4gICAgICAgIHRoaXMuaW5saW5lID0gb3B0aW9ucy5pbmxpbmUgJiYgKG9wdGlvbnMuY29udGFpbmVyIHx8ICF0aGlzLmlzSW5wdXQpO1xuICAgICAgICB0aGlzLmZvcm1hdCA9IHBhcnNlRm9ybWF0KG9wdGlvbnMuZm9ybWF0KTtcbiAgICAgICAgdmFyIGluaXRpYWxWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgIHRoaXMub2xkVmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgIGRhdGUgPSB0aGlzLnBhcnNlRGF0ZShkYXRlIHx8IGluaXRpYWxWYWx1ZSk7XG5cbiAgICAgICAgaWYgKHN0YXJ0RGF0ZSkge1xuICAgICAgICAgIHN0YXJ0RGF0ZSA9IHRoaXMucGFyc2VEYXRlKHN0YXJ0RGF0ZSk7XG5cbiAgICAgICAgICBpZiAoZGF0ZS5nZXRUaW1lKCkgPCBzdGFydERhdGUuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoc3RhcnREYXRlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmREYXRlKSB7XG4gICAgICAgICAgZW5kRGF0ZSA9IHRoaXMucGFyc2VEYXRlKGVuZERhdGUpO1xuXG4gICAgICAgICAgaWYgKHN0YXJ0RGF0ZSAmJiBlbmREYXRlLmdldFRpbWUoKSA8IHN0YXJ0RGF0ZS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIGVuZERhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRlLmdldFRpbWUoKSA+IGVuZERhdGUuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoZW5kRGF0ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5lbmREYXRlID0gZW5kRGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGF0ZSA9IGRhdGU7XG4gICAgICAgIHRoaXMudmlld0RhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgICAgdGhpcy5pbml0aWFsRGF0ZSA9IG5ldyBEYXRlKHRoaXMuZGF0ZSk7XG4gICAgICAgIHRoaXMuYmluZCgpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmF1dG9TaG93IHx8IHRoaXMuaW5saW5lKSB7XG4gICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5hdXRvUGljaykge1xuICAgICAgICAgIHRoaXMucGljaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImJ1aWxkXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1aWx0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5idWlsdCA9IHRydWU7XG4gICAgICAgIHZhciAkdGhpcyA9IHRoaXMuJGVsZW1lbnQsXG4gICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICB2Y
21167XIgJHBpY2tlciA9ICQob3B0aW9ucy50ZW1wbGF0ZSk7XG4gICAgICAgIHRoaXMuJHBpY2tlciA9ICRwaWNrZXI7XG4gICAgICAgIHRoaXMuJHdlZWsgPSAkcGlja2VyLmZpbmQoc2VsZWN0b3JPZignd2VlaycpKTsgLy8gWWVhcnMgdmlld1xuXG4gICAgICAgIHRoaXMuJHllYXJzUGlja2VyID0gJHBpY2tlci5maW5kKHNlbGVjdG9yT2YoJ3llYXJzIHBpY2tlcicpKTtcbiAgICAgICAgdGhpcy4keWVhcnNQcmV2ID0gJHBpY2tlci5maW5kKHNlbGVjdG9yT2YoJ3llYXJzIHByZXYnKSk7XG4gICAgICAgIHRoaXMuJHllYXJzTmV4dCA9ICRwaWNrZXIuZmluZChzZWxlY3Rvck9mKCd5ZWFycyBuZXh0JykpO1xuICAgICAgICB0aGlzLiR5ZWFyc0N1cnJlbnQgPSAkcGlja2VyLmZpbmQoc2VsZWN0b3JPZigneWVhcnMgY3VycmVudCcpKTtcbiAgICAgICAgdGhpcy4keWVhcnMgPSAkcGlja2VyLmZpbmQoc2VsZWN0b3JPZigneWVhcnMnKSk7IC8vIE1vbnRocyB2aWV3XG5cbiAgICAgICAgdGhpcy4kbW9udGhzUGlja2VyID0gJHBpY2tlci5maW5kKHNlbGVjdG9yT2YoJ21vbnRocyBwaWNrZXInKSk7XG4gICAgICAgIHRoaXMuJHllYXJQcmV2ID0gJHBpY2tlci5maW5kKHNlbGVjdG9yT2YoJ3llYXIgcHJldicpKTtcbiAgICAgICAgdGhpcy4keWVhck5leHQgPSAkcGlja2VyLmZpbmQoc2VsZWN0b3JPZigneWVhciBuZXh0JykpO1xuICAgICAgICB0aGlzLiR5ZWFyQ3VycmVudCA9ICRwaWNrZXIuZmluZChzZWxlY3Rvck9mKCd5ZWFyIGN1cnJlbnQnKSk7XG4gICAgICAgIHRoaXMuJG1vbnRocyA9ICRwaWNrZXIuZmluZChzZWxlY3Rvck9mKCdtb250aHMnKSk7IC8vIERheXMgdmlld1xuXG4gICAgICAgIHRoaXMuJGRheXNQaWNrZXIgPSAkcGlja2VyLmZpbmQoc2VsZWN0b3JPZignZGF5cyBwaWNrZXInKSk7XG4gICAgICAgIHRoaXMuJG1vbnRoUHJldiA9ICRwaWNrZXIuZmluZChzZWxlY3Rvck9mKCdtb250aCBwcmV2JykpO1xuICAgICAgICB0aGlzLiRtb250aE5leHQgPSAkcGlja2VyLmZpbmQoc2VsZWN0b3JPZignbW9udGggbmV4dCcpKTtcbiAgICAgICAgdGhpcy4kbW9udGhDdXJyZW50ID0gJHBpY2tlci5maW5kKHNlbGVjdG9yT2YoJ21vbnRoIGN1cnJlbnQnKSk7XG4gICAgICAgIHRoaXMuJGRheXMgPSAkcGlja2VyLmZpbmQoc2VsZWN0b3JPZignZGF5cycpKTtcblxuICAgICAgICBpZiAodGhpcy5pbmxpbmUpIHtcbiAgICAgICAgICAkKG9wdGlvbnMuY29udGFpbmVyIHx8ICR0aGlzKS5hcHBlbmQoJHBpY2tlci5hZGRDbGFzcyhcIlwiLmNvbmNhdChOQU1FU1BBQ0UsIFwiLWlubGluZVwiKSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICQoZG9jdW1lbnQuYm9keSkuYXBwZW5kKCRwaWNrZXIuYWRkQ2xhc3MoXCJcIi5jb25jYXQoTkFNRVNQQUNFLCBcIi1kcm9wZG93blwiKSkpO1xuICAgICAgICAgICRwaWNrZXIuYWRkQ2xhc3MoQ0xBU1NfSElERSkuY3NzKHtcbiAgICAgICAgICAgIHpJbmRleDogcGFyc2VJbnQob3B0aW9ucy56SW5kZXgsIDEwKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJXZWVrKCk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcInVuYnVpbGRcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiB1bmJ1aWxkKCkge1xuICAgICAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ1aWx0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuJHBpY2tlci5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiYmluZFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGJpbmQoKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgJHRoaXMgPSB0aGlzLiRlbGVtZW50O1xuXG4gICAgICAgIGlmICgkLmlzRnVuY3Rpb24ob3B0aW9ucy5zaG93KSkge1xuICAgICAgICAgICR0aGlzLm9uKEVWRU5UX1NIT1csIG9wdGlvbnMuc2hvdyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKG9wdGlvbnMuaGlkZSkpIHtcbiAgICAgICAgICAkdGhpcy5vbihFVkVOVF9ISURFLCBvcHRpb25zLmhpZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCQuaXNGdW5jdGlvbihvcHRpb25zLnBpY2spKSB7XG4gICAgICAgICAgJHRoaXMub24oRVZFTlRfUElDSywgb3B0aW9ucy5waWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzSW5wdXQpIHtcbiAgICAgICAgICAkdGhpcy5vbihFVkVOVF9LRVlVUCwgJC5wcm94eSh0aGlzLmtleXVwLCB0aGlzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaW5saW5lKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMudHJpZ2dlcikge1xuICAgICAgICAgICAgdGhpcy4kdHJpZ2dlci5vbihFVkVOVF9DTElDSywgJC5wcm94eSh0aGlzLnRvZ2dsZSwgdGhpcykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0lucHV0KSB7XG4gICAgICAgICAgICAkdGhpcy5vbihFVkVOVF9GT0NVUywgJC5wcm94eSh0aGlzLnNob3csIHRoaXMpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHRoaXMub24oRVZFTlRfQ0xJQ0ssICQucHJveHkodGhpcy5zaG93LCB0aGlzKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcInVuYmluZFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHVuYmluZCgpIHtcbiAgICAgICAgdmFyICR0aGlzID0gdGhpcy4kZWxlbWVudCxcbiAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgICAgaWYgKCQuaXNGdW5jdGlvbihvcHRpb25zLnNob3cpKSB7XG4gICAgICAgICAgJHRoaXMub2ZmKEVWRU5UX1NIT1csIG9wdGlvbnMuc2hvdyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKG9wdGlvbnMuaGlkZSkpIHtcbiAgICAgICAgICAkdGhpcy5vZmYoRVZFTlRfSElERSwgb3B0aW9ucy5oaWRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgkLmlzRnVuY3Rpb24ob3B0aW9ucy5waWNrKSkge1xuICAgICAgICAgICR0aGlzLm9mZihFVkVOVF9QSUNLLCBvcHRpb25zLnBpY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNJbnB1dCkge1xuICAgICAgICAgICR0aGlzLm9mZihFVkVOVF9LRVlVUCwgdGhpcy5rZXl1cCk7XG4gICAgICAgI
21167H1cblxuICAgICAgICBpZiAoIXRoaXMuaW5saW5lKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMudHJpZ2dlcikge1xuICAgICAgICAgICAgdGhpcy4kdHJpZ2dlci5vZmYoRVZFTlRfQ0xJQ0ssIHRoaXMudG9nZ2xlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNJbnB1dCkge1xuICAgICAgICAgICAgJHRoaXMub2ZmKEVWRU5UX0ZPQ1VTLCB0aGlzLnNob3cpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkdGhpcy5vZmYoRVZFTlRfQ0xJQ0ssIHRoaXMuc2hvdyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcInNob3dWaWV3XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gc2hvd1ZpZXcodmlldykge1xuICAgICAgICB2YXIgJHllYXJzUGlja2VyID0gdGhpcy4keWVhcnNQaWNrZXIsXG4gICAgICAgICAgICAkbW9udGhzUGlja2VyID0gdGhpcy4kbW9udGhzUGlja2VyLFxuICAgICAgICAgICAgJGRheXNQaWNrZXIgPSB0aGlzLiRkYXlzUGlja2VyLFxuICAgICAgICAgICAgZm9ybWF0ID0gdGhpcy5mb3JtYXQ7XG5cbiAgICAgICAgaWYgKGZvcm1hdC5oYXNZZWFyIHx8IGZvcm1hdC5oYXNNb250aCB8fCBmb3JtYXQuaGFzRGF5KSB7XG4gICAgICAgICAgc3dpdGNoIChOdW1iZXIodmlldykpIHtcbiAgICAgICAgICAgIGNhc2UgVklFV1MuWUVBUlM6XG4gICAgICAgICAgICAgICRtb250aHNQaWNrZXIuYWRkQ2xhc3MoQ0xBU1NfSElERSk7XG4gICAgICAgICAgICAgICRkYXlzUGlja2VyLmFkZENsYXNzKENMQVNTX0hJREUpO1xuXG4gICAgICAgICAgICAgIGlmIChmb3JtYXQuaGFzWWVhcikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyWWVhcnMoKTtcbiAgICAgICAgICAgICAgICAkeWVhcnNQaWNrZXIucmVtb3ZlQ2xhc3MoQ0xBU1NfSElERSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZSgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ZpZXcoVklFV1MuREFZUyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBWSUVXUy5NT05USFM6XG4gICAgICAgICAgICAgICR5ZWFyc1BpY2tlci5hZGRDbGFzcyhDTEFTU19ISURFKTtcbiAgICAgICAgICAgICAgJGRheXNQaWNrZXIuYWRkQ2xhc3MoQ0xBU1NfSElERSk7XG5cbiAgICAgICAgICAgICAgaWYgKGZvcm1hdC5oYXNNb250aCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyTW9udGhzKCk7XG4gICAgICAgICAgICAgICAgJG1vbnRoc1BpY2tlci5yZW1vdmVDbGFzcyhDTEFTU19ISURFKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93VmlldyhWSUVXUy5ZRUFSUyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIGNhc2UgVklFV1MuREFZUzpcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgJHllYXJzUGlja2VyLmFkZENsYXNzKENMQVNTX0hJREUpO1xuICAgICAgICAgICAgICAkbW9udGhzUGlja2VyLmFkZENsYXNzKENMQVNTX0hJREUpO1xuXG4gICAgICAgICAgICAgIGlmIChmb3JtYXQuaGFzRGF5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJEYXlzKCk7XG4gICAgICAgICAgICAgICAgJGRheXNQaWNrZXIucmVtb3ZlQ2xhc3MoQ0xBU1NfSElERSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZSgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ZpZXcoVklFV1MuTU9OVEhTKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImhpZGVWaWV3XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gaGlkZVZpZXcoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbmxpbmUgJiYgdGhpcy5vcHRpb25zLmF1dG9IaWRlKSB7XG4gICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwicGxhY2VcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBwbGFjZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5saW5lKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyICR0aGlzID0gdGhpcy4kZWxlbWVudCxcbiAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAkcGlja2VyID0gdGhpcy4kcGlja2VyO1xuICAgICAgICB2Y
21167XIgY29udGFpbmVyV2lkdGggPSAkKGRvY3VtZW50KS5vdXRlcldpZHRoKCk7XG4gICAgICAgIHZhciBjb250YWluZXJIZWlnaHQgPSAkKGRvY3VtZW50KS5vdXRlckhlaWdodCgpO1xuICAgICAgICB2YXIgZWxlbWVudFdpZHRoID0gJHRoaXMub3V0ZXJXaWR0aCgpO1xuICAgICAgICB2YXIgZWxlbWVudEhlaWdodCA9ICR0aGlzLm91dGVySGVpZ2h0KCk7XG4gICAgICAgIHZhciB3aWR0aCA9ICRwaWNrZXIud2lkdGgoKTtcbiAgICAgICAgdmFyIGhlaWdodCA9ICRwaWNrZXIuaGVpZ2h0KCk7XG5cbiAgICAgICAgdmFyIF8kdGhpcyRvZmZzZXQgPSAkdGhpcy5vZmZzZXQoKSxcbiAgICAgICAgICAgIGxlZnQgPSBfJHRoaXMkb2Zmc2V0LmxlZnQsXG4gICAgICAgICAgICB0b3AgPSBfJHRoaXMkb2Zmc2V0LnRvcDtcblxuICAgICAgICB2YXIgb2Zmc2V0ID0gcGFyc2VGbG9hdChvcHRpb25zLm9mZnNldCk7XG4gICAgICAgIHZhciBwbGFjZW1lbnQgPSBDTEFTU19UT1BfTEVGVDtcblxuICAgICAgICBpZiAoaXNOYU4ob2Zmc2V0KSkge1xuICAgICAgICAgIG9mZnNldCA9IDEwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRvcCA+IGhlaWdodCAmJiB0b3AgKyBlbGVtZW50SGVpZ2h0ICsgaGVpZ2h0ID4gY29udGFpbmVySGVpZ2h0KSB7XG4gICAgICAgICAgdG9wIC09IGhlaWdodCArIG9mZnNldDtcbiAgICAgICAgICBwbGFjZW1lbnQgPSBDTEFTU19CT1RUT01fTEVGVDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b3AgKz0gZWxlbWVudEhlaWdodCArIG9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsZWZ0ICsgd2lkdGggPiBjb250YWluZXJXaWR0aCkge1xuICAgICAgICAgIGxlZnQgKz0gZWxlbWVudFdpZHRoIC0gd2lkdGg7XG4gICAgICAgICAgcGxhY2VtZW50ID0gcGxhY2VtZW50LnJlcGxhY2UoJ2xlZnQnLCAncmlnaHQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRwaWNrZXIucmVtb3ZlQ2xhc3MoQ0xBU1NfUExBQ0VNRU5UUykuYWRkQ2xhc3MocGxhY2VtZW50KS5jc3Moe1xuICAgICAgICAgIHRvcDogdG9wLFxuICAgICAgICAgIGxlZnQ6IGxlZnRcbiAgICAgICAgfSk7XG4gICAgICB9IC8vIEEgc2hvcnRjdXQgZm9yIHRyaWdnZXJpbmcgY3VzdG9tIGV2ZW50c1xuXG4gICAgfSwge1xuICAgICAga2V5OiBcInRyaWdnZXJcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiB0cmlnZ2VyKHR5cGUsIGRhdGEpIHtcbiAgICAgICAgdmFyIGUgPSAkLkV2ZW50KHR5cGUsIGRhdGEpO1xuICAgICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSk7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJjcmVhdGVJdGVtXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlSXRlbShkYXRhKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICB2Y
21167XIgaXRlbVRhZyA9IG9wdGlvbnMuaXRlbVRhZztcbiAgICAgICAgdmFyIGl0ZW0gPSB7XG4gICAgICAgICAgdGV4dDogJycsXG4gICAgICAgICAgdmlldzogJycsXG4gICAgICAgICAgbXV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIHBpY2tlZDogZmFsc2UsXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIGhpZ2hsaWdodGVkOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB2YXIgY2xhc3NlcyA9IFtdO1xuICAgICAgICAkLmV4dGVuZChpdGVtLCBkYXRhKTtcblxuICAgICAgICBpZiAoaXRlbS5tdXRlZCkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaChvcHRpb25zLm11dGVkQ2xhc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW0uaGlnaGxpZ2h0ZWQpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2gob3B0aW9ucy5oaWdobGlnaHRlZENsYXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtLnBpY2tlZCkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaChvcHRpb25zLnBpY2tlZENsYXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKG9wdGlvbnMuZGlzYWJsZWRDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCI8XCIuY29uY2F0KGl0ZW1UYWcsIFwiIGNsYXNzPVxcXCJcIikuY29uY2F0KGNsYXNzZXMuam9pbignICcpLCBcIlxcXCIgZGF0YS12aWV3PVxcXCJcIikuY29uY2F0KGl0ZW0udmlldywgXCJcXFwiPlwiKS5jb25jYXQoaXRlbS50ZXh0LCBcIjwvXCIpLmNvbmNhdChpdGVtVGFnLCBcIj5cIik7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImdldFZhbHVlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUoKSB7XG4gICAgICAgIHZhciAkdGhpcyA9IHRoaXMuJGVsZW1lbnQ7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSW5wdXQgP
21167yAkdGhpcy52YWwoKSA6ICR0aGlzLnRleHQoKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwic2V0VmFsdWVcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRWYWx1ZSgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcbiAgICAgICAgdmFyICR0aGlzID0gdGhpcy4kZWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5pc0lucHV0KSB7XG4gICAgICAgICAgJHRoaXMudmFsKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pbmxpbmUgfHwgdGhpcy5vcHRpb25zLmNvbnRhaW5lcikge1xuICAgICAgICAgICR0aGlzLnRleHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfV0sIFt7XG4gICAgICBrZXk6IFwic2V0RGVmYXVsdHNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXREZWZhdWx0cygpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAkLmV4dGVuZChERUZBVUxUUywgTEFOR1VBR0VTW29wdGlvbnMubGFuZ3VhZ2VdLCAkLmlzUGxhaW5PYmplY3Qob3B0aW9ucykgJiYgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIERhdGVwaWNrZXI7XG4gIH0oKTtcblxuICBpZiAoJC5leHRlbmQpIHtcbiAgICAkLmV4dGVuZChEYXRlcGlja2VyLnByb3RvdHlwZSwgcmVuZGVyLCBoYW5kbGVycywgbWV0aG9kcyk7XG4gIH1cblxuICBpZiAoJC5mbikge1xuICAgIHZhciBBbm90aGVyRGF0ZXBpY2tlciA9ICQuZm4uZGF0ZXBpY2tlcjtcblxuICAgICQuZm4uZGF0ZXBpY2tlciA9IGZ1bmN0aW9uIGpRdWVyeURhdGVwaWNrZXIob3B0aW9uKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICB2Y
21167XIgcmVzdWx0O1xuICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGVtZW50KSB7XG4gICAgICAgIHZhciAkZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgIHZhciBpc0Rlc3Ryb3kgPSBvcHRpb24gPT09ICdkZXN0cm95JztcbiAgICAgICAgdmFyIGRhdGVwaWNrZXIgPSAkZWxlbWVudC5kYXRhKE5BTUVTUEFDRSk7XG5cbiAgICAgICAgaWYgKCFkYXRlcGlja2VyKSB7XG4gICAgICAgICAgaWYgKGlzRGVzdHJveSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sICRlbGVtZW50LmRhdGEoKSwgJC5pc1BsYWluT2JqZWN0KG9wdGlvbikgJiYgb3B0aW9uKTtcbiAgICAgICAgICBkYXRlcGlja2VyID0gbmV3IERhdGVwaWNrZXIoZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgICAgJGVsZW1lbnQuZGF0YShOQU1FU1BBQ0UsIGRhdGVwaWNrZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzU3RyaW5nKG9wdGlvbikpIHtcbiAgICAgICAgICB2YXIgZm4gPSBkYXRlcGlja2VyW29wdGlvbl07XG5cbiAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKGZuKSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZm4uYXBwbHkoZGF0ZXBpY2tlciwgYXJncyk7XG5cbiAgICAgICAgICAgIGlmIChpc0Rlc3Ryb3kpIHtcbiAgICAgICAgICAgICAgJGVsZW1lbnQucmVtb3ZlRGF0YShOQU1FU1BBQ0UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gIWlzVW5kZWZpbmVkKHJlc3VsdCkgPyByZXN1bHQgOiB0aGlzO1xuICAgIH07XG5cbiAgICAkLmZuLmRhdGVwaWNrZXIuQ29uc3RydWN0b3IgPSBEYXRlcGlja2VyO1xuICAgICQuZm4uZGF0ZXBpY2tlci5sYW5ndWFnZXMgPSBMQU5HVUFHRVM7XG4gICAgJC5mbi5kYXRlcGlja2VyLnNldERlZmF1bHRzID0gRGF0ZXBpY2tlci5zZXREZWZhdWx0cztcblxuICAgICQuZm4uZGF0ZXBpY2tlci5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gbm9Db25mbGljdCgpIHtcbiAgICAgICQuZm4uZGF0ZXBpY2tlciA9IEFub3RoZXJEYXRlcGlja2VyO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfVxuXG59KSk7XG4iLCIvKlxuICB0ZXh0ZmlsbFxuIEBuYW1lICAgICAganF1ZXJ5LnRleHRmaWxsLmpzXG4gQGF1dGhvciAgICBSdXNzIFBhaW50ZXIgKEdlZWt5TW9ua2V5KVxuIEBhdXRob3IgICAgWXUtSmllIExpblxuIEBhdXRob3IgICAgQWxleGFuZHJlIERhbnRhc1xuIEB2ZXJzaW9uICAgMC42LjJcbiBAZGF0ZSAgICAgIDIwMTgtMDItMjRcbiBAY29weXJpZ2h0IChjKSAyMDA5XG4gQGxpY2Vuc2UgICBNSVQgTGljZW5zZVxuIEBob21lcGFnZSAgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS10ZXh0ZmlsbC9qcXVlcnktdGV4dGZpbGxcbiBAZXhhbXBsZSAgIGh0dHA6Ly9qcXVlcnktdGV4dGZpbGwuZ2l0aHViLmlvL2pxdWVyeS10ZXh0ZmlsbC9pbmRleC5odG1sXG4qL1xuKGZ1bmN0aW9uKGspe2suZm4udGV4dGZpbGw9ZnVuY3Rpb24ocSl7ZnVuY3Rpb24gZSgpe2EuZGVidWcmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBjb25zb2xlJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgY29uc29sZS5kZWJ1ZyYmY29uc29sZS5kZWJ1Zy5hcHBseShjb25zb2xlLGFyZ3VtZW50cyl9ZnVuY3Rpb24gbihiLGEsZixsLG0sZyl7ZnVuY3Rpb24gYyhhLGIpe3ZhciBjPVwiIC8gXCI7YT5iP2M9XCIgPiBcIjphPT1iJiYoYz1cIiA9IFwiKTtyZXR1cm4gY31lKFwiW1RleHRGaWxsXSBcIitiK1wiIHsgZm9udC1zaXplOiBcIithLmNzcyhcImZvbnQtc2l6ZVwiKStcIixIZWlnaHQ6IFwiK2EuaGVpZ2h0KCkrXCJweCBcIitjKGEuaGVpZ2h0KCksZikrZitcInB4LFdpZHRoOiBcIithLndpZHRoKCkrYyhhLndpZHRoKCksbCkrbCtcIixtaW5Gb250UGl4ZWxzOiBcIittK1wicHgsIG1heEZvbnRQaXhlbHM6IFwiK2crXCJweCB9XCIpfWZ1bmN0aW9uIHAoYSxjLGYsbCxlLGcsaCxkKXtmb3IobihhLGMsZSxnLGgsZCk7aDxNYXRoLmZsb29yKGQpLVxuMTspe3ZhciBiPU1hdGguZmxvb3IoKGgrZCkvMik7Yy5jc3MoXCJmb250LXNpemVcIixiKTt2YXIgaz1mLmNhbGwoYyk7aWYoazw9bCl7aWYoaD1iLGs9PWwpYnJlYWt9ZWxzZSBkPWI7bihhLGMsZSxnLGgsZCl9Yy5jc3MoXCJmb250LXNpemVcIixkKTtmLmNhbGwoYyk8PWwmJihoPWQsbihhK1wiKiBcIixjLGUsZyxoLGQpKTtyZXR1cm4gaH12YXIgYT1rLmV4dGVuZCh7ZGVidWc6ITEsbWF4Rm9udFBpeGVsczo0MCxtaW5Gb250UGl4ZWxzOjQsaW5uZXJUYWc6XCJzcGFuXCIsd2lkdGhPbmx5OiExLHN1Y2Nlc3M6bnVsbCxmYWlsOm51bGwsY29tcGxldGU6bnVsbCxleHBsaWNpdFdpZHRoOm51bGwsZXhwbGljaXRIZWlnaHQ6bnVsbCxjaGFuZ2VMaW5lSGVpZ2h0OiExLHRydW5jYXRlT25GYWlsOiExLGFsbG93T3ZlcmZsb3c6ITF9LHEpO2UoXCJbVGV4dEZpbGxdIFN0YXJ0IERlYnVnXCIpO3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWsoYS5pbm5lclRhZytcIjpmaXJzdFwiLHRoaXMpO2UoXCJbVGV4dEZpbGxdIElubmVyIHRleHQ6IFwiK1xuYi50ZXh0KCkpO2UoXCJbVGV4dEZpbGxdIEFsbCBvcHRpb25zOiBcIixhKTtlKFwiW1RleHRGaWxsXSBNYXhpbXVtIHNpemVzOiB7IEhlaWdodDogXCIrYytcInB4LCBXaWR0aDogXCIrZitcInB4IH1cIik7aWYoYi5pcyhcIjp2aXNpYmxlXCIpKXt2YXIgYz1hLmV4cGxpY2l0SGVpZ2h0fHxrKHRoaXMpLmhlaWdodCgpLGY9YS5leHBsaWNpdFdpZHRofHxrKHRoaXMpLndpZHRoKCksbD1iLmNzcyhcImZvbnQtc2l6ZVwiKSxtPXBhcnNlRmxvYXQoYi5jc3MoXCJsaW5lLWhlaWdodFwiKSkvcGFyc2VGbG9hdChsKSxnPWEubWluRm9udFBpeGVscyxoPTA+PWEubWF4Rm9udFBpeGVscz9jOmEubWF4Rm9udFBpeGVscyxkPXZvaWQgMDthLndpZHRoT25seT9iLmNzcyhcIndoaXRlLXNwYWNlXCIsXCJub3dyYXBcIik6ZD1wKFwiSGVpZ2h0XCIsYixrLmZuLmhlaWdodCxjLGMsZixnLGgpO2c9cChcIldpZHRoXCIsYixrLmZuLndpZHRoLGYsYyxmLGcsaCk7YS53aWR0aE9ubHk/KGIuY3NzKHtcImZvbnQtc2l6ZVwiOmd9KSxhLmNoYW5nZUxpbmVIZWlnaHQmJlxuYi5wYXJlbnQoKS5jc3MoXCJsaW5lLWhlaWdodFwiLG0qZytcInB4XCIpKTooZD1NYXRoLm1pbihkLGcpLGIuY3NzKFwiZm9udC1zaXplXCIsZCksYS5jaGFuZ2VMaW5lSGVpZ2h0JiZiLnBhcmVudCgpLmNzcyhcImxpbmUtaGVpZ2h0XCIsbSpkK1wicHhcIikpO2UoXCJbVGV4dEZpbGxdIEZpbmlzaGVkIHsgT2xkIGZvbnQtc2l6ZTogXCIrbCtcIiwgTmV3IGZvbnQtc2l6ZTogXCIrYi5jc3MoXCJmb250LXNpemVcIikrXCIgfVwiKTtiLndpZHRoKCk+ZiYmIWEuYWxsb3dPdmVyZmxvd3x8Yi5oZWlnaHQoKT5jJiYhYS53aWR0aE9ubHkmJiFhLmFsbG93T3ZlcmZsb3c/KGIuY3NzKFwiZm9udC1zaXplXCIsbCksYS5mYWlsJiZhLmZhaWwodGhpcyksZShcIltUZXh0RmlsbF0gRmFpbHVy
21167ZSB7IEN1cnJlbnQgV2lkdGg6IFwiK2Iud2lkdGgoKStcIiwgTWF4aW11bSBXaWR0aDogXCIrZitcIiwgQ3VycmVudCBIZWlnaHQ6IFwiK2IuaGVpZ2h0KCkrXCIsIE1heGltdW0gSGVpZ2h0OiBcIitjK1wiIH1cIikpOmEuc3VjY2VzcyYmYS5zdWNjZXNzKHRoaXMpfWVsc2UgYS5mYWlsJiZcbmEuZmFpbCh0aGlzKSxlKFwiW1RleHRGaWxsXSBGYWlsdXJlIHsgQ3VycmVudCBXaWR0aDogXCIrYi53aWR0aCgpK1wiLCBNYXhpbXVtIFdpZHRoOiBcIitmK1wiLCBDdXJyZW50IEhlaWdodDogXCIrYi5oZWlnaHQoKStcIiwgTWF4aW11bSBIZWlnaHQ6IFwiK2MrXCIgfVwiKX0pO2EuY29tcGxldGUmJmEuY29tcGxldGUodGhpcyk7ZShcIltUZXh0RmlsbF0gRW5kIERlYnVnXCIpO3JldHVybiB0aGlzfX0pKGZ1bmN0aW9uKCl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP3JlcXVpcmUoXCJqcXVlcnlcIik6d2luZG93LmpRdWVyeX0oKSk7XG4iLCIvKiFcbiAqIEphdmFTY3JpcHQgQ29va2llIHYyLjIuMFxuICogaHR0cHM6Ly9naXRodWIuY29tL2pzLWNvb2tpZS9qcy1jb29raWVcbiAqXG4gKiBDb3B5cmlnaHQgMjAwNiwgMjAxNSBLbGF1cyBIYXJ0bCAmIEZhZ25lciBCcmFja1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKi9cbjsoZnVuY3Rpb24gKGZhY3RvcnkpIHtcblx0dmFyIHJlZ2lzdGVyZWRJbk1vZHVsZUxvYWRlcjtcblx0aWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuXHRcdGRlZmluZShmYWN0b3J5KTtcblx0XHRyZWdpc3RlcmVkSW5Nb2R1bGVMb2FkZXIgPSB0cnVlO1xuXHR9XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0XHRyZWdpc3RlcmVkSW5Nb2R1bGVMb2FkZXIgPSB0cnVlO1xuXHR9XG5cdGlmICghcmVnaXN0ZXJlZEluTW9kdWxlTG9hZGVyKSB7XG5cdFx0dmFyIE9sZENvb2tpZXMgPSB3aW5kb3cuQ29va2llcztcblx0XHR2YXIgYXBpID0gd2luZG93LkNvb2tpZXMgPSBmYWN0b3J5KCk7XG5cdFx0YXBpLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHR3aW5kb3cuQ29va2llcyA9IE9sZENvb2tpZXM7XG5cdFx0XHRyZXR1cm4gYXBpO1xuXHRcdH07XG5cdH1cbn0oZnVuY3Rpb24gKCkge1xuXHRmdW5jdGlvbiBleHRlbmQgKCkge1xuXHRcdHZhciBpID0gMDtcblx0XHR2YXIgcmVzdWx0ID0ge307XG5cdFx0Zm9yICg7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBhdHRyaWJ1dGVzID0gYXJndW1lbnRzWyBpIF07XG5cdFx0XHRmb3IgKHZhciBrZXkgaW4gYXR0cmlidXRlcykge1xuXHRcdFx0XHRyZXN1bHRba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGZ1bmN0aW9uIGRlY29kZSAocykge1xuXHRcdHJldHVybiBzLnJlcGxhY2UoLyglWzAtOUEtWl17Mn0pKy9nLCBkZWNvZGVVUklDb21wb25lbnQpO1xuXHR9XG5cblx0ZnVuY3Rpb24gaW5pdCAoY29udmVydGVyKSB7XG5cdFx0ZnVuY3Rpb24gYXBpKCkge31cblxuXHRcdGZ1bmN0aW9uIHNldCAoa2V5LCB2YWx1ZSwgYXR0cmlidXRlcykge1xuXHRcdFx0aWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRhdHRyaWJ1dGVzID0gZXh0ZW5kKHtcblx0XHRcdFx0cGF0aDogJy8nXG5cdFx0XHR9LCBhcGkuZGVmYXVsdHMsIGF0dHJpYnV0ZXMpO1xuXG5cdFx0XHRpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZXhwaXJlcyA9PT0gJ251bWJlcicpIHtcblx0XHRcdFx0YXR0cmlidXRlcy5leHBpcmVzID0gbmV3IERhdGUobmV3IERhdGUoKSAqIDEgKyBhdHRyaWJ1dGVzLmV4cGlyZXMgKiA4NjRlKzUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZSdyZSB1c2luZyBcImV4cGlyZXNcIiBiZWNhdXNlIFwibWF4LWFnZVwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgSUVcblx0XHRcdGF0dHJpYnV0ZXMuZXhwaXJlcyA9IGF0dHJpYnV0ZXMuZXhwaXJlcyA/IGF0dHJpYnV0ZXMuZXhwaXJlcy50b1VUQ1N0cmluZygpIDogJyc7XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG5cdFx0XHRcdGlmICgvXltcXHtcXFtdLy50ZXN0KHJlc3VsdCkpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IHJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge31cblxuXHRcdFx0dmFsdWUgPSBjb252ZXJ0ZXIud3JpdGUgP1xuXHRcdFx0XHRjb252ZXJ0ZXIud3JpdGUodmFsdWUsIGtleSkgOlxuXHRcdFx0XHRlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKHZhbHVlKSlcblx0XHRcdFx0XHQucmVwbGFjZSgvJSgyM3wyNHwyNnwyQnwzQXwzQ3wzRXwzRHwyRnwzRnw0MHw1Qnw1RHw1RXw2MHw3Qnw3RHw3QykvZywgZGVjb2RlVVJJQ29tcG9uZW50KTtcblxuXHRcdFx0a2V5ID0gZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhrZXkpKVxuXHRcdFx0XHQucmVwbGFjZSgvJSgyM3wyNHwyNnwyQnw1RXw2MHw3QykvZywgZGVjb2RlVVJJQ29tcG9uZW50KVxuXHRcdFx0XHQucmVwbGFjZSgvW1xcKFxcKV0vZywgZXNjYXBlKTtcblxuXHRcdFx0dmFyIHN0cmluZ2lmaWVkQXR0cmlidXRlcyA9ICcnO1xuXHRcdFx0Zm9yICh2YXIgYXR0cmlidXRlTmFtZSBpbiBhdHRyaWJ1dGVzKSB7XG5cdFx0XHRcdGlmICghYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnOyAnICsgYXR0cmlidXRlTmFtZTtcblx0XHRcdFx0aWYgKGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPT09IHRydWUpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENvbnNpZGVycyBSRkMgNjI2NSBzZWN0aW9uIDUuMjpcblx0XHRcdFx0Ly8gLi4uXG5cdFx0XHRcdC8vIDMuICBJZiB0aGUgcmVtYWluaW5nIHVucGFyc2VkLWF0dHJpYnV0ZXMgY29udGFpbnMgYSAleDNCIChcIjtcIilcblx0XHRcdFx0Ly8gICAgIGNoYXJhY3Rlcjpcblx0XHRcdFx0Ly8gQ29uc3VtZSB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5wYXJzZWQtYXR0cmlidXRlcyB1cCB0byxcblx0XHRcdFx0Ly8gbm90IGluY2x1ZGluZywgdGhlIGZpcnN0ICV4M0IgKFwiO1wiKSBjaGFyYWN0ZXIuXG5cdFx0XHRcdC8vIC4uLlxuXHRcdFx0XHRzdHJpbmdpZmllZEF0dHJpYnV0ZXMgKz0gJz0nICsgYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXS5zcGxpdCgnOycpWzBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKGRvY3VtZW50LmNvb2tpZSA9IGtleSArICc9JyArIHZhbHVlICsgc3RyaW5naWZpZWRBdHRyaWJ1dGVzKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXQgKGtleSwganNvbikge1xuXHRcdFx0aWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgamFyID0ge307XG5cdFx0XHQvLyBUbyBwcmV2ZW50IHRoZSBmb3IgbG9vcCBpbiB0aGUgZmlyc3QgcGxhY2UgYXNzaWduIGFuIGVtcHR5IGFycmF5XG5cdFx0XHQvLyBpbiBjYXNlIHRoZXJlIGFyZSBubyBjb29raWVzIGF0IGFsbC5cblx0XHRcdHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llID8gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpIDogW107XG5cdFx0XHR2YXIgaSA9IDA7XG5cblx0XHRcdGZvciAoOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHR2YXIgcGFydHMgPSBjb29raWVzW2ldLnNwbGl0KCc9Jyk7XG5cdFx0XHRcdHZhciBjb29raWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCc9Jyk7XG5cblx0XHRcdFx0aWYgKCFqc29uICYmIGNvb2tpZS5jaGFyQXQoMCkgPT09ICdcIicpIHtcblx0XHRcdFx0XHRjb29raWUgPSBjb29raWUuc2xpY2UoMSwgLTEpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHR2YXIgbmFtZSA9IGRlY29kZShwYXJ0c1swXSk7XG5cdFx0XHRcdFx0Y29va2llID0gKGNvbnZlcnRlci5yZWFkIHx8IGNvbnZlcnRlcikoY29va2llLCBuYW1lKSB8fFxuXHRcdFx0XHRcdFx0ZGVjb2RlKGNvb2tpZSk7XG5cblx0XHRcdFx0XHRpZiAoanNvbikge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0Y29va2llID0gSlNPTi5wYXJzZShjb29raWUpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkge31cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRqYXJbbmFtZV0gPSBjb29raWU7XG5cblx0XHRcdFx0XHRpZiAoa2V5ID09PSBuYW1lKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybi
21167BrZXkgPyBqYXJba2V5XSA6IGphcjtcblx0XHR9XG5cblx0XHRhcGkuc2V0ID0gc2V0O1xuXHRcdGFwaS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRyZXR1cm4gZ2V0KGtleSwgZmFsc2UgLyogcmVhZCBhcyByYXcgKi8pO1xuXHRcdH07XG5cdFx0YXBpLmdldEpTT04gPSBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRyZXR1cm4gZ2V0KGtleSwgdHJ1ZSAvKiByZWFkIGFzIGpzb24gKi8pO1xuXHRcdH07XG5cdFx0YXBpLnJlbW92ZSA9IGZ1bmN0aW9uIChrZXksIGF0dHJpYnV0ZXMpIHtcblx0XHRcdHNldChrZXksICcnLCBleHRlbmQoYXR0cmlidXRlcywge1xuXHRcdFx0XHRleHBpcmVzOiAtMVxuXHRcdFx0fSkpO1xuXHRcdH07XG5cblx0XHRhcGkuZGVmYXVsdHMgPSB7fTtcblxuXHRcdGFwaS53aXRoQ29udmVydGVyID0gaW5pdDtcblxuXHRcdHJldHVybiBhcGk7XG5cdH1cblxuXHRyZXR1cm4gaW5pdChmdW5jdGlvbiAoKSB7fSk7XG59KSk7XG4iLCIvKipcbiAqIGx1bnIgLSBodHRwOi8vbHVucmpzLmNvbSAtIEEgYml0IGxpa2UgU29sciwgYnV0IG11Y2ggc21hbGxlciBhbmQgbm90IGFzIGJyaWdodCAtIDAuNi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgT2xpdmVyIE5pZ2h0aW5nYWxlXG4gKiBNSVQgTGljZW5zZWRcbiAqIEBsaWNlbnNlXG4gKi9cbiFmdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKGUpe3ZhciBuPW5ldyB0LkluZGV4O3JldHVybiBuLnBpcGVsaW5lLmFkZCh0LnRyaW1tZXIsdC5zdG9wV29yZEZpbHRlcix0LnN0ZW1tZXIpLGUmJmUuY2FsbChuLG4pLG59O3QudmVyc2lvbj1cIjAuNi4wXCIsdC51dGlscz17fSx0LnV0aWxzLndhcm49ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3QuY29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4oZSl9fSh0aGlzKSx0LnV0aWxzLmFzU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10fHxudWxsPT09dD9cIlwiOnQudG9TdHJpbmcoKX0sdC5FdmVudEVtaXR0ZXI9ZnVuY3Rpb24oKXt0aGlzLmV2ZW50cz17fX0sdC5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxlPXQucG9wKCksbj10O2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihcImxhc3QgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO24uZm9yRWFjaChmdW5jdGlvbih0KXt0aGlzLmhhc0hhbmRsZXIodCl8fCh0aGlzLmV2ZW50c1t0XT1bXSksdGhpcy5ldmVudHNbdF0ucHVzaChlKX0sdGhpcyl9LHQuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuaGFzSGFuZGxlcih0KSl7dmFyIG49dGhpcy5ldmVudHNbdF0uaW5kZXhPZihlKTt0aGlzLmV2ZW50c1t0XS5zcGxpY2UobiwxKSx0aGlzLmV2ZW50c1t0XS5sZW5ndGh8fGRlbGV0ZSB0aGlzLmV2ZW50c1t0XX19LHQuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQpe2lmKHRoaXMuaGFzSGFuZGxlcih0KSl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3RoaXMuZXZlbnRzW3RdLmZvckVhY2goZnVuY3Rpb24odCl7dC5hcHBseSh2b2lkIDAsZSl9KX19LHQuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5oYXNIYW5kbGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluIHRoaXMuZXZlbnRzfSx0LnRva2VuaXplcj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCYmbnVsbCE9ZSYmdm9pZCAwIT1lP0FycmF5LmlzQXJyYXkoZSk/ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHQudXRpbHMuYXNTdHJpbmcoZSkudG9Mb3dlckNhc2UoKX0pOmUudG9TdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCh0LnRva2VuaXplci5zZXBlcmF0b3IpOltdfSx0LnRva2VuaXplci5zZXBlcmF0b3I9L1tcXHNcXC1dKy8sdC5QaXBlbGluZT1mdW5jdGlvbigpe3RoaXMuX3N0YWNrPVtdfSx0LlBpcGVsaW5lLnJlZ2lzdGVyZWRGdW5jdGlvbnM9e30sdC5QaXBlbGluZS5yZWdpc3RlckZ1bmN0aW9uPWZ1bmN0aW9uKGUsbil7biBpbiB0aGlzLnJlZ2lzdGVyZWRGdW5jdGlvbnMmJnQudXRpbHMud2FybihcIk92ZXJ3cml0aW5nIGV4aXN0aW5nIHJlZ2lzdGVyZWQgZnVuY3Rpb246IFwiK24pLGUubGFiZWw9bix0LlBpcGVsaW5lLnJlZ2lzdGVyZWRGdW5jdGlvbnNbZS5sYWJlbF09ZX0sdC5QaXBlbGluZS53YXJuSWZGdW5jdGlvbk5vdFJlZ2lzdGVyZWQ9ZnVuY3Rpb24oZSl7dmFyIG49ZS5sYWJlbCYmZS5sYWJlbCBpbiB0aGlzLnJlZ2lzdGVyZWRGdW5jdGlvbnM7bnx8dC51dGlscy53YXJuKFwiRnVuY3Rpb24gaXMgbm90IHJlZ2lzdGVyZWQgd2l0aCBwaXBlbGluZS4gVGhpcyBtYXkgY2F1c2UgcHJvYmxlbXMgd2hlbiBzZXJpYWxpc2luZyB0aGUgaW5kZXguXFxuXCIsZSl9LHQuUGlwZWxpbmUubG9hZD1mdW5jdGlvbihlKXt2YXIgbj1uZXcgdC5QaXBlbGluZTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBpPXQuUGlwZWxpbmUucmVnaXN0ZXJlZEZ1bmN0aW9uc1tlXTtpZighaSl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgbG9hZCB1bi1yZWdpc3RlcmVkIGZ1bmN0aW9uOiBcIitlKTtuLmFkZChpKX0pLG59LHQuUGlwZWxpbmUucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuUGlwZWxpbmUud2FybklmRnVuY3Rpb25Ob3RSZWdpc3RlcmVkKGUpLHRoaXMuX3N0YWNrLnB1c2goZSl9LHRoaXMpfSx0LlBpcGVsaW5lLnByb3RvdHlwZS5hZnRlcj1mdW5jdGlvbihlLG4pe3QuUGlwZWxpbmUud2FybklmRnVuY3Rpb25Ob3RSZWdpc3RlcmVkKG4pO3ZhciBpPXRoaXMuX3N0YWNrLmluZGV4T2YoZSk7aWYoLTE9PWkpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgZXhpc3RpbmdGblwiKTtpKz0xLHRoaXMuX3N0YWNrLnNwbGljZShpLDAsbil9LHQuUGlwZWxpbmUucHJvdG90eXBlLmJlZm9yZT1mdW5jdGlvbihlLG4pe3QuUGlwZWxpbmUud2FybklmRnVuY3Rpb25Ob3RSZWdpc3RlcmVkKG4pO3ZhciBpPXRoaXMuX3N0YWNrLmluZGV4T2YoZSk7aWYoLTE9PWkpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgZXhpc3RpbmdGblwiKTt0aGlzLl9zdGFjay5zcGxpY2UoaSwwLG4pfSx0LlBpcGVsaW5lLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc3RhY2suaW5kZXhPZih0KTstMSE9ZSYmdGhpcy5fc3RhY2suc3BsaWNlKGUsMSl9LHQuUGlwZWxpbmUucHJvdG90eXBlLnJ1bj1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj10Lmxlbmd0aCxpPXRoaXMuX3N0YWNrLmxlbmd0aCxyPTA7bj5yO3IrKyl7Zm9yKHZhciBvPXRbcl0scz0wO2k+cyYmKG89dGhpcy5fc3RhY2tbc10obyxyLHQpLHZvaWQgMCE9PW8mJlwiXCIhPT1vKTtzKyspO3ZvaWQgMCE9PW8mJlwiXCIhPT1vJiZlLnB1c2gobyl9cmV0dXJuIGV9LHQuUGlwZWxpbmUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5fc3RhY2s9W119LHQuUGlwZWxpbmUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGFjay5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHQuUGlwZWxpbmUud2FybklmRnVuY3Rpb25Ob3RSZWdpc3RlcmVkKGUpLGUubGFiZWx9KX0sdC5WZWN0b3I9ZnVuY3Rpb24oKXt0aGlzLl9tYWduaXR1ZGU9b
21167nVsbCx0aGlzLmxpc3Q9dm9pZCAwLHRoaXMubGVuZ3RoPTB9LHQuVmVjdG9yLk5vZGU9ZnVuY3Rpb24odCxlLG4pe3RoaXMuaWR4PXQsdGhpcy52YWw9ZSx0aGlzLm5leHQ9bn0sdC5WZWN0b3IucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbihlLG4pe3RoaXMuX21hZ25pdHVkZT12b2lkIDA7dmFyIGk9dGhpcy5saXN0O2lmKCFpKXJldHVybiB0aGlzLmxpc3Q9bmV3IHQuVmVjdG9yLk5vZGUoZSxuLGkpLHRoaXMubGVuZ3RoKys7aWYoZTxpLmlkeClyZXR1cm4gdGhpcy5saXN0PW5ldyB0LlZlY3Rvci5Ob2RlKGUsbixpKSx0aGlzLmxlbmd0aCsrO2Zvcih2YXIgcj1pLG89aS5uZXh0O3ZvaWQgMCE9bzspe2lmKGU8by5pZHgpcmV0dXJuIHIubmV4dD1uZXcgdC5WZWN0b3IuTm9kZShlLG4sbyksdGhpcy5sZW5ndGgrKztyPW8sbz1vLm5leHR9cmV0dXJuIHIubmV4dD1uZXcgdC5WZWN0b3IuTm9kZShlLG4sbyksdGhpcy5sZW5ndGgrK30sdC5WZWN0b3IucHJvdG90eXBlLm1hZ25pdHVkZT1mdW5jdGlvbigpe2lmKHRoaXMuX21hZ25pdHVkZSlyZXR1cm4gdGhpcy5fbWFnbml0dWRlO2Zvcih2YXIgdCxlPXRoaXMubGlzdCxuPTA7ZTspdD1lLnZhbCxuKz10KnQsZT1lLm5leHQ7cmV0dXJuIHRoaXMuX21hZ25pdHVkZT1NYXRoLnNxcnQobil9LHQuVmVjdG9yLnByb3RvdHlwZS5kb3Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMubGlzdCxuPXQubGlzdCxpPTA7ZSYmbjspZS5pZHg8bi5pZHg/ZT1lLm5leHQ6ZS5pZHg+bi5pZHg/bj1uLm5leHQ6KGkrPWUudmFsKm4udmFsLGU9ZS5uZXh0LG49bi5uZXh0KTtyZXR1cm4gaX0sdC5WZWN0b3IucHJvdG90eXBlLnNpbWlsYXJpdHk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZG90KHQpLyh0aGlzLm1hZ25pdHVkZSgpKnQubWFnbml0dWRlKCkpfSx0LlNvcnRlZFNldD1mdW5jdGlvbigpe3RoaXMubGVuZ3RoPTAsdGhpcy5lbGVtZW50cz1bXX0sdC5Tb3J0ZWRTZXQubG9hZD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgdGhpcztyZXR1cm4gZS5lbGVtZW50cz10LGUubGVuZ3RoPXQubGVuZ3RoLGV9LHQuU29ydGVkU2V0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oKXt2YXIgdCxlO2Zvcih0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyllPWFyZ3VtZW50c1t0XSx+dGhpcy5pbmRleE9mKGUpfHx0aGlzLmVsZW1lbnRzLnNwbGljZSh0aGlzLmxvY2F0aW9uRm9yKGUpLDAsZSk7dGhpcy5sZW5ndGg9dGhpcy5lbGVtZW50cy5sZW5ndGh9LHQuU29ydGVkU2V0LnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHMuc2xpY2UoKX0sdC5Tb3J0ZWRTZXQucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVsZW1lbnRzLm1hcCh0LGUpfSx0LlNvcnRlZFNldC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVsZW1lbnRzLmZvckVhY2godCxlKX0sdC5Tb3J0ZWRTZXQucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj10aGlzLmVsZW1lbnRzLmxlbmd0aCxpPW4tZSxyPWUrTWF0aC5mbG9vcihpLzIpLG89dGhpcy5lbGVtZW50c1tyXTtpPjE7KXtpZihvPT09dClyZXR1cm4gcjt0Pm8mJihlPXIpLG8+dCYmKG49ciksaT1uLWUscj1lK01hdGguZmxvb3IoaS8yKSxvPXRoaXMuZWxlbWVudHNbcl19cmV0dXJuIG89PT10P3I6LTF9LHQuU29ydGVkU2V0LnByb3RvdHlwZS5sb2NhdGlvbkZvcj1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPXRoaXMuZWxlbWVudHMubGVuZ3RoLGk9bi1lLHI9ZStNYXRoLmZsb29yKGkvMiksbz10aGlzLmVsZW1lbnRzW3JdO2k+MTspdD5vJiYoZT1yKSxvPnQmJihuPXIpLGk9bi1lLHI9ZStNYXRoLmZsb29yKGkvMiksbz10aGlzLmVsZW1lbnRzW3JdO3JldHVybiBvPnQ/cjp0Pm8/cisxOnZvaWQgMH0sdC5Tb3J0ZWRTZXQucHJvdG90eXBlLmludGVyc2VjdD1mdW5jdGlvbihlKXtmb3IodmFyIG49bmV3IHQuU29ydGVkU2V0LGk9MCxyPTAsbz10aGlzLmxlbmd0aCxzPWUubGVuZ3RoLGE9dGhpcy5lbGVtZW50cyxoPWUuZWxlbWVudHM7Oyl7aWYoaT5vLTF8fHI+cy0xKWJyZWFrO2FbaV0hPT1oW3JdP2FbaV08aFtyXT9pKys6YVtpXT5oW3JdJiZyKys6KG4uYWRkKGFbaV0pLGkrKyxyKyspfXJldHVybiBufSx0LlNvcnRlZFNldC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgdC5Tb3J0ZWRTZXQ7cmV0dXJuIGUuZWxlbWVudHM9dGhpcy50b0FycmF5KCksZS5sZW5ndGg9ZS5lbGVtZW50cy5sZW5ndGgsZX0sdC5Tb3J0ZWRTZXQucHJvdG90eXBlLnVuaW9uPWZ1bmN0aW9uKHQpe3ZhciBlLG4saTtyZXR1cm4gdGhpcy5sZW5ndGg+PXQubGVuZ3RoPyhlPXRoaXMsbj10KTooZT10LG49dGhpcyksaT1lLmNsb25lKCksaS5hZGQuYXBwbHkoaSxuLnRvQXJyYXkoKSksaX0sdC5Tb3J0ZWRTZXQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRvQXJyYXkoKX0sdC5JbmRleD1mdW5jdGlvbigpe3RoaXMuX2ZpZWxkcz1bXSx0aGlzLl9yZWY9XCJpZFwiLHRoaXMucGlwZWxpbmU9bmV3IHQuUGlwZWxpbmUsdGhpcy5kb2N1bWVudFN0b3JlPW5ldyB0LlN0b3JlLHRoaXMudG9rZW5TdG9yZT1uZXcgdC5Ub2tlblN0b3JlLHRoaXMuY29ycHVzVG9rZW5zPW5ldyB0LlNvcnRlZFNldCx0aGlzLmV2ZW50RW1pdHRlcj1uZXcgdC5FdmVudEVtaXR0ZXIsdGhpcy5faWRmQ2FjaGU9e30sdGhpcy5vbihcImFkZFwiLFwicmVtb3ZlXCIsXCJ1cGRhdGVcIixmdW5jdGlvbigpe3RoaXMuX2lkZkNhY2hlPXt9fS5iaW5kKHRoaXMpKX0sdC5JbmRleC5wcm90b3R5cGUub249ZnVuY3Rpb24oKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiB0aGlzLmV2ZW50RW1pdHRlci5hZGRMaXN0ZW5lci5hcHBseSh0aGlzLmV2ZW50RW1pdHRlcix0KX0sdC5JbmRleC5wcm90b3R5cGUub2ZmPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZXZlbnRFbWl0dGVyLnJlbW92ZUxpc3RlbmVyKHQsZSl9LHQuSW5kZXgubG9hZD1mdW5jdGlvbihlKXtlLnZlcnNpb24hPT10LnZlcnNpb24mJnQudXRpbHMud2FybihcInZlcnNpb24gbWlzbWF0Y2g6IGN1cnJlbnQgXCIrdC52ZXJzaW9uK1wiIGltcG9ydGluZyBcIitlLnZlcnNpb24pO3ZhciBuPW5ldyB0aGlzO3JldHVybiBuLl9maWVsZHM9ZS5maWVsZHMsbi5fcmVmPWUucmVmLG4uZG9jdW1lbnRTdG9yZT10LlN0b3JlLmxvYWQoZS5kb2N1bWVudFN0b3JlKSxuLnRva2VuU3RvcmU9dC5Ub2tlblN0b3JlLmxvYWQoZS50b2tlblN0b3JlKSxuLmNvcnB1c1Rva2Vucz10LlNvcnRlZFNldC5sb2FkKGUuY29ycHVzVG9rZW5zKSxuLnBpcGVsaW5lPXQuUGlwZWxpbmUubG9hZChlLnBpcGVsaW5lKSxufSx0LkluZGV4LnByb3RvdHlwZS5maWVsZD1mdW5jdGlvbih0LGUpe3ZhciBlPWV8fHt9LG49e25hbWU6dCxib29zdDplLmJvb3N0fHwxfTtyZXR1cm4gdGhpcy5fZmllbGRzLnB1c2gobiksdGhpc30sdC5JbmRleC5wcm90b3R5cGUucmVmPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZWY9dCx0aGlzfSx0LkluZGV4LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSxuKXt2YXIgaT17fS
21167xyPW5ldyB0LlNvcnRlZFNldCxvPWVbdGhpcy5fcmVmXSxuPXZvaWQgMD09PW4/ITA6bjt0aGlzLl9maWVsZHMuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgbz10aGlzLnBpcGVsaW5lLnJ1bih0LnRva2VuaXplcihlW24ubmFtZV0pKTtpW24ubmFtZV09byx0LlNvcnRlZFNldC5wcm90b3R5cGUuYWRkLmFwcGx5KHIsbyl9LHRoaXMpLHRoaXMuZG9jdW1lbnRTdG9yZS5zZXQobyxyKSx0LlNvcnRlZFNldC5wcm90b3R5cGUuYWRkLmFwcGx5KHRoaXMuY29ycHVzVG9rZW5zLHIudG9BcnJheSgpKTtmb3IodmFyIHM9MDtzPHIubGVuZ3RoO3MrKyl7dmFyIGE9ci5lbGVtZW50c1tzXSxoPXRoaXMuX2ZpZWxkcy5yZWR1Y2UoZnVuY3Rpb24odCxlKXt2YXIgbj1pW2UubmFtZV0ubGVuZ3RoO2lmKCFuKXJldHVybiB0O3ZhciByPWlbZS5uYW1lXS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1hfSkubGVuZ3RoO3JldHVybiB0K3IvbiplLmJvb3N0fSwwKTt0aGlzLnRva2VuU3RvcmUuYWRkKGEse3JlZjpvLHRmOmh9KX1uJiZ0aGlzLmV2ZW50RW1pdHRlci5lbWl0KFwiYWRkXCIsZSx0aGlzKX0sdC5JbmRleC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dFt0aGlzLl9yZWZdLGU9dm9pZCAwPT09ZT8hMDplO2lmKHRoaXMuZG9jdW1lbnRTdG9yZS5oYXMobikpe3ZhciBpPXRoaXMuZG9jdW1lbnRTdG9yZS5nZXQobik7dGhpcy5kb2N1bWVudFN0b3JlLnJlbW92ZShuKSxpLmZvckVhY2goZnVuY3Rpb24odCl7dGhpcy50b2tlblN0b3JlLnJlbW92ZSh0LG4pfSx0aGlzKSxlJiZ0aGlzLmV2ZW50RW1pdHRlci5lbWl0KFwicmVtb3ZlXCIsdCx0aGlzKX19LHQuSW5kZXgucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUpe3ZhciBlPXZvaWQgMD09PWU/ITA6ZTt0aGlzLnJlbW92ZSh0LCExKSx0aGlzLmFkZCh0LCExKSxlJiZ0aGlzLmV2ZW50RW1pdHRlci5lbWl0KFwidXBkYXRlXCIsdCx0aGlzKX0sdC5JbmRleC5wcm90b3R5cGUuaWRmPWZ1bmN0aW9uKHQpe3ZhciBlPVwiQFwiK3Q7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX2lkZkNhY2hlLGUpKXJldHVybiB0aGlzLl9pZGZDYWNoZVtlXTt2YXIgbj10aGlzLnRva2VuU3RvcmUuY291bnQodCksaT0xO3JldHVybiBuPjAmJihpPTErTWF0aC5sb2codGhpcy5kb2N1bWVudFN0b3JlLmxlbmd0aC9uKSksdGhpcy5faWRmQ2FjaGVbZV09aX0sdC5JbmRleC5wcm90b3R5cGUuc2VhcmNoPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMucGlwZWxpbmUucnVuKHQudG9rZW5pemVyKGUpKSxpPW5ldyB0LlZlY3RvcixyPVtdLG89dGhpcy5fZmllbGRzLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0K2UuYm9vc3R9LDApLHM9bi5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRva2VuU3RvcmUuaGFzKHQpfSx0aGlzKTtpZighcylyZXR1cm5bXTtuLmZvckVhY2goZnVuY3Rpb24oZSxuLHMpe3ZhciBhPTEvcy5sZW5ndGgqdGhpcy5fZmllbGRzLmxlbmd0aCpvLGg9dGhpcyx1PXRoaXMudG9rZW5TdG9yZS5leHBhbmQoZSkucmVkdWNlKGZ1bmN0aW9uKG4scil7dmFyIG89aC5jb3JwdXNUb2tlbnMuaW5kZXhPZihyKSxzPWguaWRmKHIpLHU9MSxsPW5ldyB0LlNvcnRlZFNldDtpZihyIT09ZSl7dmFyIGM9TWF0aC5tYXgoMyxyLmxlbmd0aC1lLmxlbmd0aCk7dT0xL01hdGgubG9nKGMpfW8+LTEmJmkuaW5zZXJ0KG8sYSpzKnUpO2Zvcih2YXIgZj1oLnRva2VuU3RvcmUuZ2V0KHIpLHA9T2JqZWN0LmtleXMoZiksZD1wLmxlbmd0aCx2PTA7ZD52O3YrKylsLmFkZChmW3Bbdl1dLnJlZik7cmV0dXJuIG4udW5pb24obCl9LG5ldyB0LlNvcnRlZFNldCk7ci5wdXNoKHUpfSx0aGlzKTt2YXIgYT1yLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0LmludGVyc2VjdChlKX0pO3JldHVybiBhLm1hcChmdW5jdGlvbih0KXtyZXR1cm57cmVmOnQsc2NvcmU6aS5zaW1pbGFyaXR5KHRoaXMuZG9jdW1lbnRWZWN0b3IodCkpfX0sdGhpcykuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBlLnNjb3JlLXQuc2NvcmV9KX0sdC5JbmRleC5wcm90b3R5cGUuZG9jdW1lbnRWZWN0b3I9ZnVuY3Rpb24oZSl7Zm9yKHZhciBuPXRoaXMuZG9jdW1lbnRTdG9yZS5nZXQoZSksaT1uLmxlbmd0aCxyPW5ldyB0LlZlY3RvcixvPTA7aT5vO28rKyl7dmFyIHM9bi5lbGVtZW50c1tvXSxhPXRoaXMudG9rZW5TdG9yZS5nZXQocylbZV0udGYsaD10aGlzLmlkZihzKTtyLmluc2VydCh0aGlzLmNvcnB1c1Rva2Vucy5pbmRleE9mKHMpLGEqaCl9cmV0dXJuIHJ9LHQuSW5kZXgucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt2ZXJzaW9uOnQudmVyc2lvbixmaWVsZHM6dGhpcy5fZmllbGRzLHJlZjp0aGlzLl9yZWYsZG9jdW1lbnRTdG9yZTp0aGlzLmRvY3VtZW50U3RvcmUudG9KU09OKCksdG9rZW5TdG9yZTp0aGlzLnRva2VuU3RvcmUudG9KU09OKCksY29ycHVzVG9rZW5zOnRoaXMuY29ycHVzVG9rZW5zLnRvSlNPTigpLHBpcGVsaW5lOnRoaXMucGlwZWxpbmUudG9KU09OKCl9fSx0LkluZGV4LnByb3RvdHlwZS51c2U9ZnVuY3Rpb24odCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2UudW5zaGlmdCh0aGlzKSx0LmFwcGx5KHRoaXMsZSl9LHQuU3RvcmU9ZnVuY3Rpb24oKXt0aGlzLnN0b3JlPXt9LHRoaXMubGVuZ3RoPTB9LHQuU3RvcmUubG9hZD1mdW5jdGlvbihlKXt2YXIgbj1uZXcgdGhpcztyZXR1cm4gbi5sZW5ndGg9ZS5sZW5ndGgsbi5zdG9yZT1PYmplY3Qua2V5cyhlLnN0b3JlKS5yZWR1Y2UoZnVuY3Rpb24obixpKXtyZXR1cm4gbltpXT10LlNvcnRlZFNldC5sb2FkKGUuc3RvcmVbaV0pLG59LHt9KSxufSx0LlN0b3JlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt0aGlzLmhhcyh0KXx8dGhpcy5sZW5ndGgrKyx0aGlzLnN0b3JlW3RdPWV9LHQuU3RvcmUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zdG9yZVt0XX0sdC5TdG9yZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluIHRoaXMuc3RvcmV9LHQuU3RvcmUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXt0aGlzLmhhcyh0KSYmKGRlbGV0ZSB0aGlzLnN0b3JlW3RdLHRoaXMubGVuZ3RoLS0pfSx0LlN0b3JlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57c3RvcmU6dGhpcy5zdG9yZSxsZW5ndGg6dGhpcy5sZW5ndGh9fSx0LnN0ZW1tZXI9ZnVuY3Rpb24oKXt2YXIgdD17YXRpb25hbDpcImF0ZVwiLHRpb25hbDpcInRpb25cIixlbmNpOlwiZW5jZVwiLGFuY2k6XCJhbmNlXCIsaXplcjpcIml6ZVwiLGJsaTpcImJsZVwiLGFsbGk6XCJhbFwiLGVudGxpOlwiZW50XCIsZWxpOlwiZVwiLG91c2xpOlwib3VzXCIsaXphdGlvbjpcIml6ZVwiLGF0aW9uOlwiYXRlXCIsYXRvcjpcImF0ZVwiLGFsaXNtOlwiYWxcIixpdmVuZXNzOlwiaXZlXCIsZnVsbmVzczpcImZ1bFwiLG91c25lc3M6XCJvdXNcIixhbGl0aTpcImFsXCIsaXZpdGk6XCJpdmVcIixiaWxpdGk6XCJibGVcIixsb2dpOlwibG9nXCJ9LGU9e2ljYXRlOlwiaWNcIixhdGl2ZTpcIlwiLGFsaXplOlwiYWxcIixpY2l0aTpcImljXCIsaWNhbDpcImljXCIsZnVsOlwiXCIsbmVzczpcIlwifSxuPVwiW15hZWlvdV1cIixpPVwiW2FlaW91eV1cIixyPW4rXCJbXmFlaW91eV0qXCIsbz1pK1wiW2FlaW91XSpcIixzPVwiXihcIityK1wiKT9cIitvK3IsYT1cIl4oXCIrcitcIik/XCIrbytyK1wiKFwiK28rXCIpPyRcIixoPVwiXihcIityK1wiKT9cIitvK3IrbytyLHU9XCJeKFwiK3IrXCIpP1wiK2ksbD1uZXcgUmVnRXhwKHMpLGM9bmV3IFJlZ0V4cChoKSxmPW5ldyBSZWdFeHAoYSkscD1uZXcgUmVnRXhwKHUpLGQ9L14oLis/KShzc3xpKWVzJC8sdj0vXiguKz8pKFtec10pcyQvLG09L14oLis/KWVlZCQvLGc9L14oLis/KShlZHxpbmcpJC8seT0vLiQvLFM9LyhhdHxibHxpeikkLyx3PW5ldyBSZWdFeHAoXCIoW15hZWlvdXlsc3pdKVxcXFwxJFwiKSx4PW5ldyBSZWdFeHAoXCJeXCIrcitpK1wiW15hZWlvdXd4eV0kXCIpLGs9L14oLis/W15hZWlvdV0peSQvLGI9L14oLis/KShhdGlvbmFsfHRpb25hbHxlbmNpfGFuY2l8aXplcnxibGl8YWxsaXxlbnRsaXxlbGl8b3VzbGl8aXphdGlvbnxhdGlvbnxhdG9yfGFsaXNtfGl2ZW5lc3N8ZnVsbmVzc3xvdXNuZXNzfGFsaXRpfGl2aXRpfGJpbGl0aXxsb2dpKSQvLEU9L14oLis/KShpY2F0ZXxhdGl2ZXxhbGl6ZXxpY2l0aXxpY2FsfGZ1bHxuZXNzKSQvLF89L14oLis/KShhbHxhbmNlfGVuY2V8ZXJ8aWN8YWJsZXxpYmxlfGFudHxlbWVudHxtZW50fGVudHxvdXxpc218YXRlfGl0aXxvdXN8aXZlfGl6ZSkkLyxGPS9eKC4rPykoc3x0KShpb24pJC8sTz0vXiguKz8pZSQvLFA9L2xsJC8sTj1uZXcgUmVnRXhwKFwiXl
21167wiK3IraStcIlteYWVpb3V3eHldJFwiKSxUPWZ1bmN0aW9uKG4pe3ZhciBpLHIsbyxzLGEsaCx1O2lmKG4ubGVuZ3RoPDMpcmV0dXJuIG47aWYobz1uLnN1YnN0cigwLDEpLFwieVwiPT1vJiYobj1vLnRvVXBwZXJDYXNlKCkrbi5zdWJzdHIoMSkpLHM9ZCxhPXYscy50ZXN0KG4pP249bi5yZXBsYWNlKHMsXCIkMSQyXCIpOmEudGVzdChuKSYmKG49bi5yZXBsYWNlKGEsXCIkMSQyXCIpKSxzPW0sYT1nLHMudGVzdChuKSl7dmFyIFQ9cy5leGVjKG4pO3M9bCxzLnRlc3QoVFsxXSkmJihzPXksbj1uLnJlcGxhY2UocyxcIlwiKSl9ZWxzZSBpZihhLnRlc3Qobikpe3ZhciBUPWEuZXhlYyhuKTtpPVRbMV0sYT1wLGEudGVzdChpKSYmKG49aSxhPVMsaD13LHU9eCxhLnRlc3Qobik/bis9XCJlXCI6aC50ZXN0KG4pPyhzPXksbj1uLnJlcGxhY2UocyxcIlwiKSk6dS50ZXN0KG4pJiYobis9XCJlXCIpKX1pZihzPWsscy50ZXN0KG4pKXt2YXIgVD1zLmV4ZWMobik7aT1UWzFdLG49aStcImlcIn1pZihzPWIscy50ZXN0KG4pKXt2YXIgVD1zLmV4ZWMobik7aT1UWzFdLHI9VFsyXSxzPWwscy50ZXN0KGkpJiYobj1pK3Rbcl0pfWlmKHM9RSxzLnRlc3Qobikpe3ZhciBUPXMuZXhlYyhuKTtpPVRbMV0scj1UWzJdLHM9bCxzLnRlc3QoaSkmJihuPWkrZVtyXSl9aWYocz1fLGE9RixzLnRlc3Qobikpe3ZhciBUPXMuZXhlYyhuKTtpPVRbMV0scz1jLHMudGVzdChpKSYmKG49aSl9ZWxzZSBpZihhLnRlc3Qobikpe3ZhciBUPWEuZXhlYyhuKTtpPVRbMV0rVFsyXSxhPWMsYS50ZXN0KGkpJiYobj1pKX1pZihzPU8scy50ZXN0KG4pKXt2YXIgVD1zLmV4ZWMobik7aT1UWzFdLHM9YyxhPWYsaD1OLChzLnRlc3QoaSl8fGEudGVzdChpKSYmIWgudGVzdChpKSkmJihuPWkpfXJldHVybiBzPVAsYT1jLHMudGVzdChuKSYmYS50ZXN0KG4pJiYocz15LG49bi5yZXBsYWNlKHMsXCJcIikpLFwieVwiPT1vJiYobj1vLnRvTG93ZXJDYXNlKCkrbi5zdWJzdHIoMSkpLG59O3JldHVybiBUfSgpLHQuUGlwZWxpbmUucmVnaXN0ZXJGdW5jdGlvbih0LnN0ZW1tZXIsXCJzdGVtbWVyXCIpLHQuZ2VuZXJhdGVTdG9wV29yZEZpbHRlcj1mdW5jdGlvbih0KXt2YXIgZT10LnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0W2VdPWUsdH0se30pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdCYmZVt0XSE9PXQ/dDp2b2lkIDB9fSx0LnN0b3BXb3JkRmlsdGVyPXQuZ2VuZXJhdGVTdG9wV29yZEZpbHRlcihbXCJhXCIsXCJhYmxlXCIsXCJhYm91dFwiLFwiYWNyb3NzXCIsXCJhZnRlclwiLFwiYWxsXCIsXCJhbG1vc3RcIixcImFsc29cIixcImFtXCIsXCJhbW9uZ1wiLFwiYW5cIixcImFuZFwiLFwiYW55XCIsXCJhcmVcIixcImFzXCIsXCJhdFwiLFwiYmVcIixcImJlY2F1c2VcIixcImJlZW5cIixcImJ1dFwiLFwiYnlcIixcImNhblwiLFwiY2Fubm90XCIsXCJjb3VsZFwiLFwiZGVhclwiLFwiZGlkXCIsXCJkb1wiLFwiZG9lc1wiLFwiZWl0aGVyXCIsXCJlbHNlXCIsXCJldmVyXCIsXCJldmVyeVwiLFwiZm9yXCIsXCJmcm9tXCIsXCJnZXRcIixcImdvdFwiLFwiaGFkXCIsXCJoYXNcIixcImhhdmVcIixcImhlXCIsXCJoZXJcIixcImhlcnNcIixcImhpbVwiLFwiaGlzXCIsXCJob3dcIixcImhvd2V2ZXJcIixcImlcIixcImlmXCIsXCJpblwiLFwiaW50b1wiLFwiaXNcIixcIml0XCIsXCJpdHNcIixcImp1c3RcIixcImxlYXN0XCIsXCJsZXRcIixcImxpa2VcIixcImxpa2VseVwiLFwibWF5XCIsXCJtZVwiLFwibWlnaHRcIixcIm1vc3RcIixcIm11c3RcIixcIm15XCIsXCJuZWl0aGVyXCIsXCJub1wiLFwibm9yXCIsXCJub3RcIixcIm9mXCIsXCJvZmZcIixcIm9mdGVuXCIsXCJvblwiLFwib25seVwiLFwib3JcIixcIm90aGVyXCIsXCJvdXJcIixcIm93blwiLFwicmF0aGVyXCIsXCJzYWlkXCIsXCJzYXlcIixcInNheXNcIixcInNoZVwiLFwic2hvdWxkXCIsXCJzaW5jZVwiLFwic29cIixcInNvbWVcIixcInRoYW5cIixcInRoYXRcIixcInRoZVwiLFwidGhlaXJcIixcInRoZW1cIixcInRoZW5cIixcInRoZXJlXCIsXCJ0aGVzZVwiLFwidGhleVwiLFwidGhpc1wiLFwidGlzXCIsXCJ0b1wiLFwidG9vXCIsXCJ0d2FzXCIsXCJ1c1wiLFwid2FudHNcIixcIndhc1wiLFwid2VcIixcIndlcmVcIixcIndoYXRcIixcIndoZW5cIixcIndoZXJlXCIsXCJ3aGljaFwiLFwid2hpbGVcIixcIndob1wiLFwid2hvbVwiLFwid2h5XCIsXCJ3aWxsXCIsXCJ3aXRoXCIsXCJ3b3VsZFwiLFwieWV0XCIsXCJ5b3VcIixcInlvdXJcIl0pLHQuUGlwZWxpbmUucmVnaXN0ZXJGdW5jdGlvbih0LnN0b3BXb3JkRmlsdGVyLFwic3RvcFdvcmRGaWx0ZXJcIiksdC50cmltbWVyPWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoL15cXFcrLyxcIlwiKS5yZXBsYWNlKC9cXFcrJC8sXCJcIil9LHQuUGlwZWxpbmUucmVnaXN0ZXJGdW5jdGlvbih0LnRyaW1tZXIsXCJ0cmltbWVyXCIpLHQuVG9rZW5TdG9yZT1mdW5jdGlvbigpe3RoaXMucm9vdD17ZG9jczp7fX0sdGhpcy5sZW5ndGg9MH0sdC5Ub2tlblN0b3JlLmxvYWQ9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHRoaXM7cmV0dXJuIGUucm9vdD10LnJvb3QsZS5sZW5ndGg9dC5sZW5ndGgsZX0sdC5Ub2tlblN0b3JlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlLG4pe3ZhciBuPW58fHRoaXMucm9vdCxpPXQuY2hhckF0KDApLHI9dC5zbGljZSgxKTtyZXR1cm4gaSBpbiBufHwobltpXT17ZG9jczp7fX0pLDA9PT1yLmxlbmd0aD8obltpXS5kb2NzW2UucmVmXT1lLHZvaWQodGhpcy5sZW5ndGgrPTEpKTp0aGlzLmFkZChyLGUsbltpXSl9LHQuVG9rZW5TdG9yZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiExO2Zvcih2YXIgZT10aGlzLnJvb3Qsbj0wO248dC5sZW5ndGg7bisrKXtpZighZVt0LmNoYXJBdChuKV0pcmV0dXJuITE7ZT1lW3QuY2hhckF0KG4pXX1yZXR1cm4hMH0sdC5Ub2tlblN0b3JlLnByb3RvdHlwZS5nZXROb2RlPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybnt9O2Zvcih2YXIgZT10aGlzLnJvb3Qsbj0wO248dC5sZW5ndGg7bisrKXtpZighZVt0LmNoYXJBdChuKV0pcmV0dXJue307ZT1lW3QuY2hhckF0KG4pXX1yZXR1cm4gZX0sdC5Ub2tlblN0b3JlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5nZXROb2RlKHQsZSkuZG9jc3x8e319LHQuVG9rZW5TdG9yZS5wcm90b3R5cGUuY291bnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5nZXQodCxlKSkubGVuZ3RofSx0LlRva2VuU3RvcmUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0LGUpe2lmKHQpe2Zvcih2YXIgbj10aGlzLnJvb3QsaT0wO2k8dC5sZW5ndGg7aSsrKXtpZighKHQuY2hhckF0KGkpaW4gbikpcmV0dXJuO249blt0LmN
21167oYXJBdChpKV19ZGVsZXRlIG4uZG9jc1tlXX19LHQuVG9rZW5TdG9yZS5wcm90b3R5cGUuZXhwYW5kPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXROb2RlKHQpLGk9bi5kb2NzfHx7fSxlPWV8fFtdO3JldHVybiBPYmplY3Qua2V5cyhpKS5sZW5ndGgmJmUucHVzaCh0KSxPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe1wiZG9jc1wiIT09biYmZS5jb25jYXQodGhpcy5leHBhbmQodCtuLGUpKX0sdGhpcyksZX0sdC5Ub2tlblN0b3JlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57cm9vdDp0aGlzLnJvb3QsbGVuZ3RoOnRoaXMubGVuZ3RofX0sZnVuY3Rpb24odCxlKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGUpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWUoKTp0Lmx1bnI9ZSgpfSh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIHR9KX0oKTsiLCIhZnVuY3Rpb24oaSl7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJqcXVlcnlcIl0saSk6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9aShyZXF1aXJlKFwianF1ZXJ5XCIpKTppKGpRdWVyeSl9KGZ1bmN0aW9uKGkpe1widXNlIHN0cmljdFwiO3ZhciBlPXdpbmRvdy5TbGlja3x8e307KGU9ZnVuY3Rpb24oKXt2YXIgZT0wO3JldHVybiBmdW5jdGlvbih0LG8pe3ZhciBzLG49dGhpcztuLmRlZmF1bHRzPXthY2Nlc3NpYmlsaXR5OiEwLGFkYXB0aXZlSGVpZ2h0OiExLGFwcGVuZEFycm93czppKHQpLGFwcGVuZERvdHM6aSh0KSxhcnJvd3M6ITAsYXNOYXZGb3I6bnVsbCxwcmV2QXJyb3c6JzxidXR0b24gY2xhc3M9XCJzbGljay1wcmV2XCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzXCIgdHlwZT1cImJ1dHRvblwiPlByZXZpb3VzPC9idXR0b24+JyxuZXh0QXJyb3c6JzxidXR0b24gY2xhc3M9XCJzbGljay1uZXh0XCIgYXJpYS1sYWJlbD1cIk5leHRcIiB0eXBlPVwiYnV0dG9uXCI+TmV4dDwvYnV0dG9uPicsYXV0b3BsYXk6ITEsYXV0b3BsYXlTcGVlZDozZTMsY2VudGVyTW9kZTohMSxjZW50ZXJQYWRkaW5nOlwiNTBweFwiLGNzc0Vhc2U6XCJlYXNlXCIsY3VzdG9tUGFnaW5nOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkoJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIC8+JykudGV4dCh0KzEpfSxkb3RzOiExLGRvdHNDbGFzczpcInNsaWNrLWRvdHNcIixkcmFnZ2FibGU6ITAsZWFzaW5nOlwibGluZWFyXCIsZWRnZUZyaWN0aW9uOi4zNSxmYWRlOiExLGZvY3VzT25TZWxlY3Q6ITEsZm9jdXNPbkNoYW5nZTohMSxpbmZpbml0ZTohMCxpbml0aWFsU2xpZGU6MCxsYXp5TG9hZDpcIm9uZGVtYW5kXCIsbW9iaWxlRmlyc3Q6ITEscGF1c2VPbkhvdmVyOiEwLHBhdXNlT25Gb2N1czohMCxwYXVzZU9uRG90c0hvdmVyOiExLHJlc3BvbmRUbzpcIndpbmRvd1wiLHJlc3BvbnNpdmU6bnVsbCxyb3dzOjEscnRsOiExLHNsaWRlOlwiXCIsc2xpZGVzUGVyUm93OjEsc2xpZGVzVG9TaG93OjEsc2xpZGVzVG9TY3JvbGw6MSxzcGVlZDo1MDAsc3dpcGU6ITAsc3dpcGVUb1NsaWRlOiExLHRvdWNoTW92ZTohMCx0b3VjaFRocmVzaG9sZDo1LHVzZUNTUzohMCx1c2VUcmFuc2Zvcm06ITAsdmFyaWFibGVXaWR0aDohMSx2ZXJ0aWNhbDohMSx2ZXJ0aWNhbFN3aXBpbmc6ITEsd2FpdEZvckFuaW1hdGU6ITAsekluZGV4OjFlM30sbi5pbml0aWFscz17YW5pbWF0aW5nOiExLGRyYWdnaW5nOiExLGF1dG9QbGF5VGltZXI6bnVsbCxjdXJyZW50RGlyZWN0aW9uOjAsY3VycmVudExlZnQ6bnVsbCxjdXJyZW50U2xpZGU6MCxkaXJlY3Rpb246MSwkZG90czpudWxsLGxpc3RXaWR0aDpudWxsLGxpc3RIZWlnaHQ6bnVsbCxsb2FkSW5kZXg6MCwkbmV4dEFycm93Om51bGwsJHByZXZBcnJvdzpudWxsLHNjcm9sbGluZzohMSxzbGlkZUNvdW50Om51bGwsc2xpZGVXaWR0aDpudWxsLCRzbGlkZVRyYWNrOm51bGwsJHNsaWRlczpudWxsLHNsaWRpbmc6ITEsc2xpZGVPZmZzZXQ6MCxzd2lwZUxlZnQ6bnVsbCxzd2lwaW5nOiExLCRsaXN0Om51bGwsdG91Y2hPYmplY3Q6e30sdHJhbnNmb3Jtc0VuYWJsZWQ6ITEsdW5zbGlja2VkOiExfSxpLmV4dGVuZChuLG4uaW5pdGlhbHMpLG4uYWN0aXZlQnJlYWtwb2ludD1udWxsLG4uYW5pbVR5cGU9bnVsbCxuLmFuaW1Qcm9wPW51bGwsbi5icmVha3BvaW50cz1bXSxuLmJyZWFrcG9pbnRTZXR0aW5ncz1bXSxuLmNzc1RyYW5zaXRpb25zPSExLG4uZm9jdXNzZWQ9ITEsbi5pbnRlcnJ1cHRlZD0hMSxuLmhpZGRlbj1cImhpZGRlblwiLG4ucGF1c2VkPSEwLG4ucG9zaXRpb25Qcm9wPW51bGwsbi5yZXNwb25kVG89bnVsbCxuLnJvd0NvdW50PTEsbi5zaG91bGRDbGljaz0hMCxuLiRzbGlkZXI9aSh0KSxuLiRzbGlkZXNDYWNoZT1udWxsLG4udHJhbnNmb3JtVHlwZT1udWxsLG4udHJhbnNpdGlvblR5cGU9bnVsbCxuLnZpc2liaWxpdHlDaGFuZ2U9XCJ2aXNpYmlsaXR5Y2hhbmdlXCIsbi53aW5kb3dXaWR0aD0wLG4ud2luZG93VGltZXI9bnVsbCxzPWkodCkuZGF0YShcInNsaWNrXCIpfHx7fSxuLm9wdGlvbnM9aS5leHRlbmQoe30sbi5kZWZhdWx0cyxvLHMpLG4uY3VycmVudFNsaWRlPW4ub3B0aW9ucy5pbml0aWFsU2xpZGUsbi5vcmlnaW5hbFNldHRpbmdzPW4ub3B0aW9ucyx2b2lkIDAhPT1kb2N1bWVudC5tb3pIaWRkZW4/KG4uaGlkZGVuPVwibW96SGlkZGVuXCIsbi52aXNpYmlsaXR5Q2hhbmdlPVwibW96dmlzaWJpbGl0eWNoYW5nZVwiKTp2b2lkIDAhPT1kb2N1bWVudC53ZWJraXRIaWRkZW4mJihuLmhpZGRlbj1cIndlYmtpdEhpZGRlblwiLG4udmlzaWJpbGl0eUNoYW5nZT1cIndlYmtpdHZpc2liaWxpdHljaGFuZ2VcIiksbi5hdXRvUGxheT1pLnByb3h5KG4uYXV0b1BsYXksbiksbi5hdXRvUGxheUNsZWFyPWkucHJveHkobi5hdXRvUGxheUNsZWFyLG4pLG4uYXV0b1BsYXlJdGVyYXRvcj1pLnByb3h5KG4uYXV0b1BsYXlJdGVyYXRvcixuKSxuLmNoYW5nZVNsaWRlPWkucHJveHkobi5jaGFuZ2VTbGlkZSxuKSxuLmNsaWNrSGFuZGxlcj1pLnByb3h5KG4uY2xpY2tIYW5kbGVyLG4pLG4uc2VsZWN0SGFuZGxlcj1pLnByb3h5KG4uc2VsZWN0SGFuZGxlcixuKSxuLnNldFBvc2l0aW9uPWkucHJveHkobi5zZXRQb3NpdGlvbixuKSxuLnN3aXBlSGFuZGxlcj1pLnByb3h5KG4uc3dpcGVIYW5kbGVyLG4pLG4uZHJhZ0hhbmRsZXI9aS5wcm94eShuLmRyYWdIYW5kbGVyLG4pLG4ua2V5SGFuZGxlcj1pLnByb3h5KG4ua2V5SGFuZGxlcixuKSxuLmluc3RhbmNlVWlkPWUrKyxuLmh0bWxFeHByPS9eKD86XFxzKig8W1xcd1xcV10rPilbXj
211675dKikkLyxuLnJlZ2lzdGVyQnJlYWtwb2ludHMoKSxuLmluaXQoITApfX0oKSkucHJvdG90eXBlLmFjdGl2YXRlQURBPWZ1bmN0aW9uKCl7dGhpcy4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLWFjdGl2ZVwiKS5hdHRyKHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwifSkuZmluZChcImEsIGlucHV0LCBidXR0b24sIHNlbGVjdFwiKS5hdHRyKHt0YWJpbmRleDpcIjBcIn0pfSxlLnByb3RvdHlwZS5hZGRTbGlkZT1lLnByb3RvdHlwZS5zbGlja0FkZD1mdW5jdGlvbihlLHQsbyl7dmFyIHM9dGhpcztpZihcImJvb2xlYW5cIj09dHlwZW9mIHQpbz10LHQ9bnVsbDtlbHNlIGlmKHQ8MHx8dD49cy5zbGlkZUNvdW50KXJldHVybiExO3MudW5sb2FkKCksXCJudW1iZXJcIj09dHlwZW9mIHQ/MD09PXQmJjA9PT1zLiRzbGlkZXMubGVuZ3RoP2koZSkuYXBwZW5kVG8ocy4kc2xpZGVUcmFjayk6bz9pKGUpLmluc2VydEJlZm9yZShzLiRzbGlkZXMuZXEodCkpOmkoZSkuaW5zZXJ0QWZ0ZXIocy4kc2xpZGVzLmVxKHQpKTohMD09PW8/aShlKS5wcmVwZW5kVG8ocy4kc2xpZGVUcmFjayk6aShlKS5hcHBlbmRUbyhzLiRzbGlkZVRyYWNrKSxzLiRzbGlkZXM9cy4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLHMuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKSxzLiRzbGlkZVRyYWNrLmFwcGVuZChzLiRzbGlkZXMpLHMuJHNsaWRlcy5lYWNoKGZ1bmN0aW9uKGUsdCl7aSh0KS5hdHRyKFwiZGF0YS1zbGljay1pbmRleFwiLGUpfSkscy4kc2xpZGVzQ2FjaGU9cy4kc2xpZGVzLHMucmVpbml0KCl9LGUucHJvdG90eXBlLmFuaW1hdGVIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2lmKDE9PT1pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYhMD09PWkub3B0aW9ucy5hZGFwdGl2ZUhlaWdodCYmITE9PT1pLm9wdGlvbnMudmVydGljYWwpe3ZhciBlPWkuJHNsaWRlcy5lcShpLmN1cnJlbnRTbGlkZSkub3V0ZXJIZWlnaHQoITApO2kuJGxpc3QuYW5pbWF0ZSh7aGVpZ2h0OmV9LGkub3B0aW9ucy5zcGVlZCl9fSxlLnByb3RvdHlwZS5hbmltYXRlU2xpZGU9ZnVuY3Rpb24oZSx0KXt2YXIgbz17fSxzPXRoaXM7cy5hbmltYXRlSGVpZ2h0KCksITA9PT1zLm9wdGlvbnMucnRsJiYhMT09PXMub3B0aW9ucy52ZXJ0aWNhbCYmKGU9LWUpLCExPT09cy50cmFuc2Zvcm1zRW5hYmxlZD8hMT09PXMub3B0aW9ucy52ZXJ0aWNhbD9zLiRzbGlkZVRyYWNrLmFuaW1hdGUoe2xlZnQ6ZX0scy5vcHRpb25zLnNwZWVkLHMub3B0aW9ucy5lYXNpbmcsdCk6cy4kc2xpZGVUcmFjay5hbmltYXRlKHt0b3A6ZX0scy5vcHRpb25zLnNwZWVkLHMub3B0aW9ucy5lYXNpbmcsdCk6ITE9PT1zLmNzc1RyYW5zaXRpb25zPyghMD09PXMub3B0aW9ucy5ydGwmJihzLmN1cnJlbnRMZWZ0PS1zLmN1cnJlbnRMZWZ0KSxpKHthbmltU3RhcnQ6cy5jdXJyZW50TGVmdH0pLmFuaW1hdGUoe2FuaW1TdGFydDplfSx7ZHVyYXRpb246cy5vcHRpb25zLnNwZWVkLGVhc2luZzpzLm9wdGlvbnMuZWFzaW5nLHN0ZXA6ZnVuY3Rpb24oaSl7aT1NYXRoLmNlaWwoaSksITE9PT1zLm9wdGlvbnMudmVydGljYWw/KG9bcy5hbmltVHlwZV09XCJ0cmFuc2xhdGUoXCIraStcInB4LCAwcHgpXCIscy4kc2xpZGVUcmFjay5jc3MobykpOihvW3MuYW5pbVR5cGVdPVwidHJhbnNsYXRlKDBweCxcIitpK1wicHgpXCIscy4kc2xpZGVUcmFjay5jc3MobykpfSxjb21wbGV0ZTpmdW5jdGlvbigpe3QmJnQuY2FsbCgpfX0pKToocy5hcHBseVRyYW5zaXRpb24oKSxlPU1hdGguY2VpbChlKSwhMT09PXMub3B0aW9ucy52ZXJ0aWNhbD9vW3MuYW5pbVR5cGVdPVwidHJhbnNsYXRlM2QoXCIrZStcInB4LCAwcHgsIDBweClcIjpvW3MuYW5pbVR5cGVdPVwidHJhbnNsYXRlM2QoMHB4LFwiK2UrXCJweCwgMHB4KVwiLHMuJHNsaWRlVHJhY2suY3NzKG8pLHQmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtzLmRpc2FibGVUcmFuc2l0aW9uKCksdC5jYWxsKCl9LHMub3B0aW9ucy5zcGVlZCkpfSxlLnByb3RvdHlwZS5nZXROYXZUYXJnZXQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS5vcHRpb25zLmFzTmF2Rm9yO3JldHVybiB0JiZudWxsIT09dCYmKHQ9aSh0KS5ub3QoZS4kc2xpZGVyKSksdH0sZS5wcm90b3R5cGUuYXNOYXZGb3I9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXROYXZUYXJnZXQoKTtudWxsIT09dCYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQuZWFjaChmdW5jdGlvbigpe3ZhciB0PWkodGhpcykuc2xpY2soXCJnZXRTbGlja1wiKTt0LnVuc2xpY2tlZHx8dC5zbGlkZUhhbmRsZXIoZSwhMCl9KX0sZS5wcm90b3R5cGUuYXBwbHlUcmFuc2l0aW9uPWZ1bmN0aW9uKGkpe3ZhciBlPXRoaXMsdD17fTshMT09PWUub3B0aW9ucy5mYWRlP3RbZS50cmFuc2l0aW9uVHlwZV09ZS50cmFuc2Zvcm1UeXBlK1wiIFwiK2Uub3B0aW9ucy5zcGVlZCtcIm1zIFwiK2Uub3B0aW9ucy5jc3NFYXNlOnRbZS50cmFuc2l0aW9uVHlwZV09XCJvcGFjaXR5IFwiK2Uub3B0aW9ucy5zcGVlZCtcIm1zIFwiK2Uub3B0aW9ucy5jc3NFYXNlLCExPT09ZS5vcHRpb25zLmZhZGU/ZS4kc2xpZGVUcmFjay5jc3ModCk6ZS4kc2xpZGVzLmVxKGkpLmNzcyh0KX0sZS5wcm90b3R5cGUuYXV0b1BsYXk9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuYXV0b1BsYXlDbGVhcigpLGkuc2xpZGVDb3VudD5pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoaS5hdXRvUGxheVRpbWVyPXNldEludGVydmFsKGkuYXV0b1BsYXlJdGVyYXRvcixpLm9wdGlvbnMuYXV0b3BsYXlTcGVlZCkpfSxlLnByb3RvdHlwZS5hdXRvUGxheUNsZWFyPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLmF1dG9QbGF5VGltZXImJmNsZWFySW50ZXJ2YWwoaS5hdXRvUGxheVRpbWVyKX0sZS5wcm90b3R5cGUuYXV0b1BsYXlJdGVyYXRvcj1mdW5jdGlvbigpe3ZhciBpPXRoaXMsZT1pLmN1cnJlbnRTbGlkZStpLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw7aS5wYXVzZWR8fGkuaW50ZXJydXB0ZWR8fGkuZm9jdXNzZWR8fCghMT09PWkub3B0aW9ucy5pbmZpbml0ZSYmKDE9PT1pLmRpcmVjdGlvbiYmaS5jdXJyZW50U2xpZGUrMT09PWkuc2xpZGVDb3VudC0xP2kuZGlyZWN0aW9uPTA6MD09PWkuZGlyZWN0aW9uJiYoZT1pLmN1cnJlbnRTbGlkZS1pLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwsaS5jdXJyZW50U2xpZGUtMT09MCYmKGkuZGlyZWN0aW9uPTEpKSksaS5zbGlkZUhhbmRsZXIoZSkpfSxlLnByb3RvdHlwZS5idWlsZEFycm93cz1mdW5jdGlvbigpe3ZhciBlPXR
21167oaXM7ITA9PT1lLm9wdGlvbnMuYXJyb3dzJiYoZS4kcHJldkFycm93PWkoZS5vcHRpb25zLnByZXZBcnJvdykuYWRkQ2xhc3MoXCJzbGljay1hcnJvd1wiKSxlLiRuZXh0QXJyb3c9aShlLm9wdGlvbnMubmV4dEFycm93KS5hZGRDbGFzcyhcInNsaWNrLWFycm93XCIpLGUuc2xpZGVDb3VudD5lLm9wdGlvbnMuc2xpZGVzVG9TaG93PyhlLiRwcmV2QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1oaWRkZW5cIikucmVtb3ZlQXR0cihcImFyaWEtaGlkZGVuIHRhYmluZGV4XCIpLGUuJG5leHRBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWhpZGRlblwiKS5yZW1vdmVBdHRyKFwiYXJpYS1oaWRkZW4gdGFiaW5kZXhcIiksZS5odG1sRXhwci50ZXN0KGUub3B0aW9ucy5wcmV2QXJyb3cpJiZlLiRwcmV2QXJyb3cucHJlcGVuZFRvKGUub3B0aW9ucy5hcHBlbmRBcnJvd3MpLGUuaHRtbEV4cHIudGVzdChlLm9wdGlvbnMubmV4dEFycm93KSYmZS4kbmV4dEFycm93LmFwcGVuZFRvKGUub3B0aW9ucy5hcHBlbmRBcnJvd3MpLCEwIT09ZS5vcHRpb25zLmluZmluaXRlJiZlLiRwcmV2QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSk6ZS4kcHJldkFycm93LmFkZChlLiRuZXh0QXJyb3cpLmFkZENsYXNzKFwic2xpY2staGlkZGVuXCIpLmF0dHIoe1wiYXJpYS1kaXNhYmxlZFwiOlwidHJ1ZVwiLHRhYmluZGV4OlwiLTFcIn0pKX0sZS5wcm90b3R5cGUuYnVpbGREb3RzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvPXRoaXM7aWYoITA9PT1vLm9wdGlvbnMuZG90cyl7Zm9yKG8uJHNsaWRlci5hZGRDbGFzcyhcInNsaWNrLWRvdHRlZFwiKSx0PWkoXCI8dWwgLz5cIikuYWRkQ2xhc3Moby5vcHRpb25zLmRvdHNDbGFzcyksZT0wO2U8PW8uZ2V0RG90Q291bnQoKTtlKz0xKXQuYXBwZW5kKGkoXCI8bGkgLz5cIikuYXBwZW5kKG8ub3B0aW9ucy5jdXN0b21QYWdpbmcuY2FsbCh0aGlzLG8sZSkpKTtvLiRkb3RzPXQuYXBwZW5kVG8oby5vcHRpb25zLmFwcGVuZERvdHMpLG8uJGRvdHMuZmluZChcImxpXCIpLmZpcnN0KCkuYWRkQ2xhc3MoXCJzbGljay1hY3RpdmVcIil9fSxlLnByb3RvdHlwZS5idWlsZE91dD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS4kc2xpZGVzPWUuJHNsaWRlci5jaGlsZHJlbihlLm9wdGlvbnMuc2xpZGUrXCI6bm90KC5zbGljay1jbG9uZWQpXCIpLmFkZENsYXNzKFwic2xpY2stc2xpZGVcIiksZS5zbGlkZUNvdW50PWUuJHNsaWRlcy5sZW5ndGgsZS4kc2xpZGVzLmVhY2goZnVuY3Rpb24oZSx0KXtpKHQpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIsZSkuZGF0YShcIm9yaWdpbmFsU3R5bGluZ1wiLGkodCkuYXR0cihcInN0eWxlXCIpfHxcIlwiKX0pLGUuJHNsaWRlci5hZGRDbGFzcyhcInNsaWNrLXNsaWRlclwiKSxlLiRzbGlkZVRyYWNrPTA9PT1lLnNsaWRlQ291bnQ/aSgnPGRpdiBjbGFzcz1cInNsaWNrLXRyYWNrXCIvPicpLmFwcGVuZFRvKGUuJHNsaWRlcik6ZS4kc2xpZGVzLndyYXBBbGwoJzxkaXYgY2xhc3M9XCJzbGljay10cmFja1wiLz4nKS5wYXJlbnQoKSxlLiRsaXN0PWUuJHNsaWRlVHJhY2sud3JhcCgnPGRpdiBjbGFzcz1cInNsaWNrLWxpc3RcIi8+JykucGFyZW50KCksZS4kc2xpZGVUcmFjay5jc3MoXCJvcGFjaXR5XCIsMCksITAhPT1lLm9wdGlvbnMuY2VudGVyTW9kZSYmITAhPT1lLm9wdGlvbnMuc3dpcGVUb1NsaWRlfHwoZS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsPTEpLGkoXCJpbWdbZGF0YS1sYXp5XVwiLGUuJHNsaWRlcikubm90KFwiW3NyY11cIikuYWRkQ2xhc3MoXCJzbGljay1sb2FkaW5nXCIpLGUuc2V0dXBJbmZpbml0ZSgpLGUuYnVpbGRBcnJvd3MoKSxlLmJ1aWxkRG90cygpLGUudXBkYXRlRG90cygpLGUuc2V0U2xpZGVDbGFzc2VzKFwibnVtYmVyXCI9PXR5cGVvZiBlLmN1cnJlbnRTbGlkZT9lLmN1cnJlbnRTbGlkZTowKSwhMD09PWUub3B0aW9ucy5kcmFnZ2FibGUmJmUuJGxpc3QuYWRkQ2xhc3MoXCJkcmFnZ2FibGVcIil9LGUucHJvdG90eXBlLmJ1aWxkUm93cz1mdW5jdGlvbigpe3ZhciBpLGUsdCxvLHMsbixyLGw9dGhpcztpZihvPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxuPWwuJHNsaWRlci5jaGlsZHJlbigpLGwub3B0aW9ucy5yb3dzPjEpe2ZvcihyPWwub3B0aW9ucy5zbGlkZXNQZXJSb3cqbC5vcHRpb25zLnJvd3Mscz1NYXRoLmNlaWwobi5sZW5ndGgvciksaT0wO2k8cztpKyspe3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7Zm9yKGU9MDtlPGwub3B0aW9ucy5yb3dzO2UrKyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtmb3IodD0wO3Q8bC5vcHRpb25zLnNsaWRlc1BlclJvdzt0Kyspe3ZhciBjPWkqcisoZSpsLm9wdGlvbnMuc2xpZGVzUGVyUm93K3QpO24uZ2V0KGMpJiZhLmFwcGVuZENoaWxkKG4uZ2V0KGMpKX1kLmFwcGVuZENoaWxkKGEpfW8uYXBwZW5kQ2hpbGQoZCl9bC4kc2xpZGVyLmVtcHR5KCkuYXBwZW5kKG8pLGwuJHNsaWRlci5jaGlsZHJlbigpLmNoaWxkcmVuKCkuY2hpbGRyZW4oKS5jc3Moe3dpZHRoOjEwMC9sLm9wdGlvbnMuc2xpZGVzUGVyUm93K1wiJVwiLGRpc3BsYXk6XCJpbmxpbmUtYmxvY2tcIn0pfX0sZS5wcm90b3R5cGUuY2hlY2tSZXNwb25zaXZlPWZ1bmN0aW9uKGUsdCl7dmFyIG8scyxuLHI9dGhpcyxsPSExLGQ9ci4kc2xpZGVyLndpZHRoKCksYT13aW5kb3cuaW5uZXJXaWR0aHx8aSh3aW5kb3cpLndpZHRoKCk7aWYoXCJ3aW5kb3dcIj09PXIucmVzcG9uZFRvP249YTpcInNsaWRlclwiPT09ci5yZXNwb25kVG8/bj1kOlwibWluXCI9PT1yLnJlc3BvbmRUbyYmKG49TWF0aC5taW4oYSxkKSksci5vcHRpb25zLnJlc3BvbnNpdmUmJnIub3B0aW9ucy5yZXNwb25zaXZlLmxlbmd0aCYmbnVsbCE9PXIub3B0aW9ucy5yZXNwb25zaXZlKXtzPW51bGw7Zm9yKG8gaW4gci5icmVha3BvaW50cylyLmJyZWFrcG9pbnRzLmhhc093blByb3BlcnR5KG8pJiYoITE9PT1yLm9yaWdpbmFsU2V0dGluZ3MubW9iaWxlRmlyc3Q/bjxyLmJyZWFrcG9pbnRzW29dJiYocz1yLmJyZWFrcG9pbnRzW29dKTpuPnIuYnJlYWtwb2ludHNbb10mJihzPXIuYnJlYWtwb2ludHNbb10pKTtudWxsIT09cz9udWxsIT09ci5hY3RpdmVCcmVha3BvaW50PyhzIT09ci5hY3RpdmVCcmVha3BvaW50fHx0KSYmKH
21167IuYWN0aXZlQnJlYWtwb2ludD1zLFwidW5zbGlja1wiPT09ci5icmVha3BvaW50U2V0dGluZ3Nbc10/ci51bnNsaWNrKHMpOihyLm9wdGlvbnM9aS5leHRlbmQoe30sci5vcmlnaW5hbFNldHRpbmdzLHIuYnJlYWtwb2ludFNldHRpbmdzW3NdKSwhMD09PWUmJihyLmN1cnJlbnRTbGlkZT1yLm9wdGlvbnMuaW5pdGlhbFNsaWRlKSxyLnJlZnJlc2goZSkpLGw9cyk6KHIuYWN0aXZlQnJlYWtwb2ludD1zLFwidW5zbGlja1wiPT09ci5icmVha3BvaW50U2V0dGluZ3Nbc10/ci51bnNsaWNrKHMpOihyLm9wdGlvbnM9aS5leHRlbmQoe30sci5vcmlnaW5hbFNldHRpbmdzLHIuYnJlYWtwb2ludFNldHRpbmdzW3NdKSwhMD09PWUmJihyLmN1cnJlbnRTbGlkZT1yLm9wdGlvbnMuaW5pdGlhbFNsaWRlKSxyLnJlZnJlc2goZSkpLGw9cyk6bnVsbCE9PXIuYWN0aXZlQnJlYWtwb2ludCYmKHIuYWN0aXZlQnJlYWtwb2ludD1udWxsLHIub3B0aW9ucz1yLm9yaWdpbmFsU2V0dGluZ3MsITA9PT1lJiYoci5jdXJyZW50U2xpZGU9ci5vcHRpb25zLmluaXRpYWxTbGlkZSksci5yZWZyZXNoKGUpLGw9cyksZXx8ITE9PT1sfHxyLiRzbGlkZXIudHJpZ2dlcihcImJyZWFrcG9pbnRcIixbcixsXSl9fSxlLnByb3RvdHlwZS5jaGFuZ2VTbGlkZT1mdW5jdGlvbihlLHQpe3ZhciBvLHMsbixyPXRoaXMsbD1pKGUuY3VycmVudFRhcmdldCk7c3dpdGNoKGwuaXMoXCJhXCIpJiZlLnByZXZlbnREZWZhdWx0KCksbC5pcyhcImxpXCIpfHwobD1sLmNsb3Nlc3QoXCJsaVwiKSksbj1yLnNsaWRlQ291bnQlci5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsIT0wLG89bj8wOihyLnNsaWRlQ291bnQtci5jdXJyZW50U2xpZGUpJXIub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxlLmRhdGEubWVzc2FnZSl7Y2FzZVwicHJldmlvdXNcIjpzPTA9PT1vP3Iub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDpyLm9wdGlvbnMuc2xpZGVzVG9TaG93LW8sci5zbGlkZUNvdW50PnIub3B0aW9ucy5zbGlkZXNUb1Nob3cmJnIuc2xpZGVIYW5kbGVyKHIuY3VycmVudFNsaWRlLXMsITEsdCk7YnJlYWs7Y2FzZVwibmV4dFwiOnM9MD09PW8/ci5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOm8sci5zbGlkZUNvdW50PnIub3B0aW9ucy5zbGlkZXNUb1Nob3cmJnIuc2xpZGVIYW5kbGVyKHIuY3VycmVudFNsaWRlK3MsITEsdCk7YnJlYWs7Y2FzZVwiaW5kZXhcIjp2YXIgZD0wPT09ZS5kYXRhLmluZGV4PzA6ZS5kYXRhLmluZGV4fHxsLmluZGV4KCkqci5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsO3Iuc2xpZGVIYW5kbGVyKHIuY2hlY2tOYXZpZ2FibGUoZCksITEsdCksbC5jaGlsZHJlbigpLnRyaWdnZXIoXCJmb2N1c1wiKTticmVhaztkZWZhdWx0OnJldHVybn19LGUucHJvdG90eXBlLmNoZWNrTmF2aWdhYmxlPWZ1bmN0aW9uKGkpe3ZhciBlLHQ7aWYoZT10aGlzLmdldE5hdmlnYWJsZUluZGV4ZXMoKSx0PTAsaT5lW2UubGVuZ3RoLTFdKWk9ZVtlLmxlbmd0aC0xXTtlbHNlIGZvcih2YXIgbyBpbiBlKXtpZihpPGVbb10pe2k9dDticmVha310PWVbb119cmV0dXJuIGl9LGUucHJvdG90eXBlLmNsZWFuVXBFdmVudHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2Uub3B0aW9ucy5kb3RzJiZudWxsIT09ZS4kZG90cyYmKGkoXCJsaVwiLGUuJGRvdHMpLm9mZihcImNsaWNrLnNsaWNrXCIsZS5jaGFuZ2VTbGlkZSkub2ZmKFwibW91c2VlbnRlci5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMCkpLm9mZihcIm1vdXNlbGVhdmUuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITEpKSwhMD09PWUub3B0aW9ucy5hY2Nlc3NpYmlsaXR5JiZlLiRkb3RzLm9mZihcImtleWRvd24uc2xpY2tcIixlLmtleUhhbmRsZXIpKSxlLiRzbGlkZXIub2ZmKFwiZm9jdXMuc2xpY2sgYmx1ci5zbGlja1wiKSwhMD09PWUub3B0aW9ucy5hcnJvd3MmJmUuc2xpZGVDb3VudD5lLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoZS4kcHJldkFycm93JiZlLiRwcmV2QXJyb3cub2ZmKFwiY2xpY2suc2xpY2tcIixlLmNoYW5nZVNsaWRlKSxlLiRuZXh0QXJyb3cmJmUuJG5leHRBcnJvdy5vZmYoXCJjbGljay5zbGlja1wiLGUuY2hhbmdlU2xpZGUpLCEwPT09ZS5vcHRpb25zLmFjY2Vzc2liaWxpdHkmJihlLiRwcmV2QXJyb3cmJmUuJHByZXZBcnJvdy5vZmYoXCJrZXlkb3duLnNsaWNrXCIsZS5rZXlIYW5kbGVyKSxlLiRuZXh0QXJyb3cmJmUuJG5leHRBcnJvdy5vZmYoXCJrZXlkb3duLnNsaWNrXCIsZS5rZXlIYW5kbGVyKSkpLGUuJGxpc3Qub2ZmKFwidG91Y2hzdGFydC5zbGljayBtb3VzZWRvd24uc2xpY2tcIixlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vZmYoXCJ0b3VjaG1vdmUuc2xpY2sgbW91c2Vtb3ZlLnNsaWNrXCIsZS5zd2lwZUhhbmRsZXIpLGUuJGxpc3Qub2ZmKFwidG91Y2hlbmQuc2xpY2sgbW91c2V1cC5zbGlja1wiLGUuc3dpcGVIYW5kbGVyKSxlLiRsaXN0Lm9mZihcInRvdWNoY2FuY2VsLnNsaWNrIG1vdXNlbGVhdmUuc2xpY2tcIixlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vZmYoXCJjbGljay5zbGlja1wiLGUuY2xpY2tIYW5kbGVyKSxpKGRvY3VtZW50KS5vZmYoZS52aXNpYmlsaXR5Q2hhbmdlLGUudmlzaWJpbGl0eSksZS5jbGVhblVwU2xpZGVFdmVudHMoKSwhMD09PWUub3B0aW9ucy5hY2Nlc3NpYmlsaXR5JiZlLiRsaXN0Lm9mZihcImtleWRvd24uc2xpY2tcIixlLmtleUhhbmRsZXIpLCEwPT09ZS5vcHRpb25zLmZvY3VzT25TZWxlY3QmJmkoZS4kc2xpZGVUcmFjaykuY2hpbGRyZW4oKS5vZmYoXCJjbGljay5zbGlja1wiLGUuc2VsZWN0SGFuZGxlciksaSh3aW5kb3cpLm9mZihcIm9yaWVudGF0aW9uY2hhbmdlLnNsaWNrLnNsaWNrLVwiK2UuaW5zdGFuY2VVaWQsZS5vcmllbnRhdGlvbkNoYW5nZSksaSh3aW5kb3cpLm9mZihcInJlc2l6ZS5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGUucmVzaXplKSxpKFwiW2RyYWdnYWJsZSE9dHJ1ZV1cIixlLiRzbGlkZVRyYWNrKS5vZmYoXCJkcmFnc3RhcnRcIixlLnByZXZlbnREZWZhdWx0KSxpKHdpbmRvdykub2ZmKFwibG9h
21167ZC5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGUuc2V0UG9zaXRpb24pfSxlLnByb3RvdHlwZS5jbGVhblVwU2xpZGVFdmVudHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuJGxpc3Qub2ZmKFwibW91c2VlbnRlci5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMCkpLGUuJGxpc3Qub2ZmKFwibW91c2VsZWF2ZS5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMSkpfSxlLnByb3RvdHlwZS5jbGVhblVwUm93cz1mdW5jdGlvbigpe3ZhciBpLGU9dGhpcztlLm9wdGlvbnMucm93cz4xJiYoKGk9ZS4kc2xpZGVzLmNoaWxkcmVuKCkuY2hpbGRyZW4oKSkucmVtb3ZlQXR0cihcInN0eWxlXCIpLGUuJHNsaWRlci5lbXB0eSgpLmFwcGVuZChpKSl9LGUucHJvdG90eXBlLmNsaWNrSGFuZGxlcj1mdW5jdGlvbihpKXshMT09PXRoaXMuc2hvdWxkQ2xpY2smJihpLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGkuc3RvcFByb3BhZ2F0aW9uKCksaS5wcmV2ZW50RGVmYXVsdCgpKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuYXV0b1BsYXlDbGVhcigpLHQudG91Y2hPYmplY3Q9e30sdC5jbGVhblVwRXZlbnRzKCksaShcIi5zbGljay1jbG9uZWRcIix0LiRzbGlkZXIpLmRldGFjaCgpLHQuJGRvdHMmJnQuJGRvdHMucmVtb3ZlKCksdC4kcHJldkFycm93JiZ0LiRwcmV2QXJyb3cubGVuZ3RoJiYodC4kcHJldkFycm93LnJlbW92ZUNsYXNzKFwic2xpY2stZGlzYWJsZWQgc2xpY2stYXJyb3cgc2xpY2staGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWhpZGRlbiBhcmlhLWRpc2FibGVkIHRhYmluZGV4XCIpLmNzcyhcImRpc3BsYXlcIixcIlwiKSx0Lmh0bWxFeHByLnRlc3QodC5vcHRpb25zLnByZXZBcnJvdykmJnQuJHByZXZBcnJvdy5yZW1vdmUoKSksdC4kbmV4dEFycm93JiZ0LiRuZXh0QXJyb3cubGVuZ3RoJiYodC4kbmV4dEFycm93LnJlbW92ZUNsYXNzKFwic2xpY2stZGlzYWJsZWQgc2xpY2stYXJyb3cgc2xpY2staGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWhpZGRlbiBhcmlhLWRpc2FibGVkIHRhYmluZGV4XCIpLmNzcyhcImRpc3BsYXlcIixcIlwiKSx0Lmh0bWxFeHByLnRlc3QodC5vcHRpb25zLm5leHRBcnJvdykmJnQuJG5leHRBcnJvdy5yZW1vdmUoKSksdC4kc2xpZGVzJiYodC4kc2xpZGVzLnJlbW92ZUNsYXNzKFwic2xpY2stc2xpZGUgc2xpY2stYWN0aXZlIHNsaWNrLWNlbnRlciBzbGljay12aXNpYmxlIHNsaWNrLWN1cnJlbnRcIikucmVtb3ZlQXR0cihcImFyaWEtaGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIpLmVhY2goZnVuY3Rpb24oKXtpKHRoaXMpLmF0dHIoXCJzdHlsZVwiLGkodGhpcykuZGF0YShcIm9yaWdpbmFsU3R5bGluZ1wiKSl9KSx0LiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSkuZGV0YWNoKCksdC4kc2xpZGVUcmFjay5kZXRhY2goKSx0LiRsaXN0LmRldGFjaCgpLHQuJHNsaWRlci5hcHBlbmQodC4kc2xpZGVzKSksdC5jbGVhblVwUm93cygpLHQuJHNsaWRlci5yZW1vdmVDbGFzcyhcInNsaWNrLXNsaWRlclwiKSx0LiRzbGlkZXIucmVtb3ZlQ2xhc3MoXCJzbGljay1pbml0aWFsaXplZFwiKSx0LiRzbGlkZXIucmVtb3ZlQ2xhc3MoXCJzbGljay1kb3R0ZWRcIiksdC51bnNsaWNrZWQ9ITAsZXx8dC4kc2xpZGVyLnRyaWdnZXIoXCJkZXN0cm95XCIsW3RdKX0sZS5wcm90b3R5cGUuZGlzYWJsZVRyYW5zaXRpb249ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcyx0PXt9O3RbZS50cmFuc2l0aW9uVHlwZV09XCJcIiwhMT09PWUub3B0aW9ucy5mYWRlP2UuJHNsaWRlVHJhY2suY3NzKHQpOmUuJHNsaWRlcy5lcShpKS5jc3ModCl9LGUucHJvdG90eXBlLmZhZGVTbGlkZT1mdW5jdGlvbihpLGUpe3ZhciB0PXRoaXM7ITE9PT10LmNzc1RyYW5zaXRpb25zPyh0LiRzbGlkZXMuZXEoaSkuY3NzKHt6SW5kZXg6dC5vcHRpb25zLnpJbmRleH0pLHQuJHNsaWRlcy5lcShpKS5hbmltYXRlKHtvcGFjaXR5OjF9LHQub3B0aW9ucy5zcGVlZCx0Lm9wdGlvbnMuZWFzaW5nLGUpKToodC5hcHBseVRyYW5zaXRpb24oaSksdC4kc2xpZGVzLmVxKGkpLmNzcyh7b3BhY2l0eToxLHpJbmRleDp0Lm9wdGlvbnMuekluZGV4fSksZSYmc2V0VGltZW91dChmdW5jdGlvbigpe3QuZGlzYWJsZVRyYW5zaXRpb24oaSksZS5jYWxsKCl9LHQub3B0aW9ucy5zcGVlZCkpfSxlLnByb3RvdHlwZS5mYWRlU2xpZGVPdXQ9ZnVuY3Rpb24oaSl7dmFyIGU9dGhpczshMT09PWUuY3NzVHJhbnNpdGlvbnM/ZS4kc2xpZGVzLmVxKGkpLmFuaW1hdGUoe29wYWNpdHk6MCx6SW5kZXg6ZS5vcHRpb25zLnpJbmRleC0yfSxlLm9wdGlvbnMuc3BlZWQsZS5vcHRpb25zLmVhc2luZyk6KGUuYXBwbHlUcmFuc2l0aW9uKGkpLGUuJHNsaWRlcy5lcShpKS5jc3Moe29wYWNpdHk6MCx6SW5kZXg6ZS5vcHRpb25zLnpJbmRleC0yfSkpfSxlLnByb3RvdHlwZS5maWx0ZXJTbGlkZXM9ZS5wcm90b3R5cGUuc2xpY2tGaWx0ZXI9ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcztudWxsIT09aSYmKGUuJHNsaWRlc0NhY2hlPWUuJHNsaWRlcyxlLnVubG9hZCgpLGUuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKSxlLiRzbGlkZXNDYWNoZS5maWx0ZXIoaSkuYXBwZW5kVG8oZS4kc2xpZGVUcmFjayksZS5yZWluaXQoKSl9LGUucHJvdG90eXBlLmZvY3VzSGFuZGxlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS4kc2xpZGVyLm9mZihcImZvY3VzLnNsaWNrIGJsdXIuc2xpY2tcIikub24oXCJmb2N1cy5zbGljayBibHVyLnNsaWNrXCIsXCIqXCIsZnVuY3Rpb24odCl7dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTt2YXIgbz1pKHRoaXMpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9wdGlvbnMucGF1c2VPbkZvY3VzJiYoZS5mb2N1c3NlZD1vLmlzKFwiOmZvY3VzXCIpLGUuYXV0b1BsYXkoKSl9LDApfSl9LGUucHJvdG90eXBlLmdldEN1cnJlbnQ9ZS5wcm90b3R5cGUuc2xpY2tDdXJyZW50U2xpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJyZW50U2xpZGV9LGUucHJvdG90eXBlLmdldERvdENvdW50PWZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxlPTAsdD0wLG89MDtpZighMD09PWkub3B0aW9ucy5pbmZpbml0ZSlpZihpLnNsaWRlQ291bnQ8PWkub3B0aW9ucy5zbGlkZXNUb1Nob3cpKytvO2Vsc2UgZm9yKDtlPGkuc2xpZGVDb3VudDspKytvLGU9dCtpLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwsdCs9aS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsPD1pLm9wdGlvbnMuc2xpZGVzVG9TaG93P2kub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDppLm9wdGlvbnMuc2xpZGVzVG9TaG93O2Vsc2UgaWYoITA9PT1pLm9wdGlvbnMuY2VudGVyTW9kZSlvPWkuc2xpZGVDb3VudDtlbHNlIGlmKGkub3B0aW9ucy5hc05hdkZvcilmb3IoO2U8aS5zbGlkZUNvdW50OykrK28sZT10K2kub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCx0Kz1pLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw8PWkub3B0aW9ucy5zbGlkZXNUb1Nob3c/aS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOmkub3B0aW9ucy5zbGlkZXNUb1Nob3c7ZWxzZSBvPTErTWF0aC5jZWlsKChpLnNsaWRlQ291bnQtaS5vcHRpb25zLnNsaWRlc1RvU2hvdykvaS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsKTtyZXR1cm4gby0xfSxlLnByb3RvdHlwZS5nZXRMZWZ0PWZ1bmN0aW9uKGkpe3ZhciBlLHQsbyxzLG49dGhpcyxyPTA7cmV0dXJuIG4uc2xpZGVPZmZzZXQ9MCx0PW4uJHNsaWRlcy5maXJzdCgpLm91dGVySGVpZ2h0KCEwKSwhMD09PW4ub3B0aW9ucy5pbmZpbml0ZT8obi5zbGlkZUNvdW50Pm4ub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihuLnNsaWRlT2Zmc2V0PW4uc2xpZGVXaWR0aCpuLm9wdGlvbnMuc2xpZGVzVG9TaG93Ki0xLHM9LTEsITA9PT1uLm9wdGlvbnMudmVydGljYWwmJiEwPT09bi5vcHRpb25zLmNlbn
21167Rlck1vZGUmJigyPT09bi5vcHRpb25zLnNsaWRlc1RvU2hvdz9zPS0xLjU6MT09PW4ub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihzPS0yKSkscj10Km4ub3B0aW9ucy5zbGlkZXNUb1Nob3cqcyksbi5zbGlkZUNvdW50JW4ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCE9MCYmaStuLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw+bi5zbGlkZUNvdW50JiZuLnNsaWRlQ291bnQ+bi5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGk+bi5zbGlkZUNvdW50PyhuLnNsaWRlT2Zmc2V0PShuLm9wdGlvbnMuc2xpZGVzVG9TaG93LShpLW4uc2xpZGVDb3VudCkpKm4uc2xpZGVXaWR0aCotMSxyPShuLm9wdGlvbnMuc2xpZGVzVG9TaG93LShpLW4uc2xpZGVDb3VudCkpKnQqLTEpOihuLnNsaWRlT2Zmc2V0PW4uc2xpZGVDb3VudCVuLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwqbi5zbGlkZVdpZHRoKi0xLHI9bi5zbGlkZUNvdW50JW4ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCp0Ki0xKSkpOmkrbi5vcHRpb25zLnNsaWRlc1RvU2hvdz5uLnNsaWRlQ291bnQmJihuLnNsaWRlT2Zmc2V0PShpK24ub3B0aW9ucy5zbGlkZXNUb1Nob3ctbi5zbGlkZUNvdW50KSpuLnNsaWRlV2lkdGgscj0oaStuLm9wdGlvbnMuc2xpZGVzVG9TaG93LW4uc2xpZGVDb3VudCkqdCksbi5zbGlkZUNvdW50PD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYobi5zbGlkZU9mZnNldD0wLHI9MCksITA9PT1uLm9wdGlvbnMuY2VudGVyTW9kZSYmbi5zbGlkZUNvdW50PD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93P24uc2xpZGVPZmZzZXQ9bi5zbGlkZVdpZHRoKk1hdGguZmxvb3Iobi5vcHRpb25zLnNsaWRlc1RvU2hvdykvMi1uLnNsaWRlV2lkdGgqbi5zbGlkZUNvdW50LzI6ITA9PT1uLm9wdGlvbnMuY2VudGVyTW9kZSYmITA9PT1uLm9wdGlvbnMuaW5maW5pdGU/bi5zbGlkZU9mZnNldCs9bi5zbGlkZVdpZHRoKk1hdGguZmxvb3Iobi5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKS1uLnNsaWRlV2lkdGg6ITA9PT1uLm9wdGlvbnMuY2VudGVyTW9kZSYmKG4uc2xpZGVPZmZzZXQ9MCxuLnNsaWRlT2Zmc2V0Kz1uLnNsaWRlV2lkdGgqTWF0aC5mbG9vcihuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIpKSxlPSExPT09bi5vcHRpb25zLnZlcnRpY2FsP2kqbi5zbGlkZVdpZHRoKi0xK24uc2xpZGVPZmZzZXQ6aSp0Ki0xK3IsITA9PT1uLm9wdGlvbnMudmFyaWFibGVXaWR0aCYmKG89bi5zbGlkZUNvdW50PD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93fHwhMT09PW4ub3B0aW9ucy5pbmZpbml0ZT9uLiRzbGlkZVRyYWNrLmNoaWxkcmVuKFwiLnNsaWNrLXNsaWRlXCIpLmVxKGkpOm4uJHNsaWRlVHJhY2suY2hpbGRyZW4oXCIuc2xpY2stc2xpZGVcIikuZXEoaStuLm9wdGlvbnMuc2xpZGVzVG9TaG93KSxlPSEwPT09bi5vcHRpb25zLnJ0bD9vWzBdPy0xKihuLiRzbGlkZVRyYWNrLndpZHRoKCktb1swXS5vZmZzZXRMZWZ0LW8ud2lkdGgoKSk6MDpvWzBdPy0xKm9bMF0ub2Zmc2V0TGVmdDowLCEwPT09bi5vcHRpb25zLmNlbnRlck1vZGUmJihvPW4uc2xpZGVDb3VudDw9bi5vcHRpb25zLnNsaWRlc1RvU2hvd3x8ITE9PT1uLm9wdGlvbnMuaW5maW5pdGU/bi4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS5lcShpKTpuLiRzbGlkZVRyYWNrLmNoaWxkcmVuKFwiLnNsaWNrLXNsaWRlXCIpLmVxKGkrbi5vcHRpb25zLnNsaWRlc1RvU2hvdysxKSxlPSEwPT09bi5vcHRpb25zLnJ0bD9vWzBdPy0xKihuLiRzbGlkZVRyYWNrLndpZHRoKCktb1swXS5vZmZzZXRMZWZ0LW8ud2lkdGgoKSk6MDpvWzBdPy0xKm9bMF0ub2Zmc2V0TGVmdDowLGUrPShuLiRsaXN0LndpZHRoKCktby5vdXRlcldpZHRoKCkpLzIpKSxlfSxlLnByb3RvdHlwZS5nZXRPcHRpb249ZS5wcm90b3R5cGUuc2xpY2tHZXRPcHRpb249ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXMub3B0aW9uc1tpXX0sZS5wcm90b3R5cGUuZ2V0TmF2aWdhYmxlSW5kZXhlcz1mdW5jdGlvbigpe3ZhciBpLGU9dGhpcyx0PTAsbz0wLHM9W107Zm9yKCExPT09ZS5vcHRpb25zLmluZmluaXRlP2k9ZS5zbGlkZUNvdW50Oih0PS0xKmUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxvPS0xKmUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxpPTIqZS5zbGlkZUNvdW50KTt0PGk7KXMucHVzaCh0KSx0PW8rZS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsLG8rPWUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDw9ZS5vcHRpb25zLnNsaWRlc1RvU2hvdz9lLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw6ZS5vcHRpb25zLnNsaWRlc1RvU2hvdztyZXR1cm4gc30sZS5wcm90b3R5cGUuZ2V0U2xpY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZS5wcm90b3R5cGUuZ2V0U2xpZGVDb3VudD1mdW5jdGlvbigpe3ZhciBlLHQsbz10aGlzO3JldHVybiB0PSEwPT09by5vcHRpb25zLmNlbnRlck1vZGU/by5zbGlkZVdpZHRoKk1hdGguZmxvb3Ioby5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKTowLCEwPT09by5vcHRpb25zLnN3aXBlVG9TbGlkZT8oby4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLXNsaWRlXCIpLmVhY2goZnVuY3Rpb24ocyxuKXtpZihuLm9mZnNldExlZnQtdCtpKG4pLm91dGVyV2lkdGgoKS8yPi0xKm8uc3dpcGVMZWZ0KXJldHVybiBlPW4sITF9KSxNYXRoLmFicyhpKGUpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIpLW8uY3VycmVudFNsaWRlKXx8MSk6by5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsfSxlLnByb3RvdHlwZS5nb1RvPWUucHJvdG90eXBlLnNsaWNrR29Ubz1mdW5jdGlvbihpLGUpe3RoaXMuY2hhbmdlU2xpZGUoe2R
21167hdGE6e21lc3NhZ2U6XCJpbmRleFwiLGluZGV4OnBhcnNlSW50KGkpfX0sZSl9LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpKHQuJHNsaWRlcikuaGFzQ2xhc3MoXCJzbGljay1pbml0aWFsaXplZFwiKXx8KGkodC4kc2xpZGVyKS5hZGRDbGFzcyhcInNsaWNrLWluaXRpYWxpemVkXCIpLHQuYnVpbGRSb3dzKCksdC5idWlsZE91dCgpLHQuc2V0UHJvcHMoKSx0LnN0YXJ0TG9hZCgpLHQubG9hZFNsaWRlcigpLHQuaW5pdGlhbGl6ZUV2ZW50cygpLHQudXBkYXRlQXJyb3dzKCksdC51cGRhdGVEb3RzKCksdC5jaGVja1Jlc3BvbnNpdmUoITApLHQuZm9jdXNIYW5kbGVyKCkpLGUmJnQuJHNsaWRlci50cmlnZ2VyKFwiaW5pdFwiLFt0XSksITA9PT10Lm9wdGlvbnMuYWNjZXNzaWJpbGl0eSYmdC5pbml0QURBKCksdC5vcHRpb25zLmF1dG9wbGF5JiYodC5wYXVzZWQ9ITEsdC5hdXRvUGxheSgpKX0sZS5wcm90b3R5cGUuaW5pdEFEQT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1NYXRoLmNlaWwoZS5zbGlkZUNvdW50L2Uub3B0aW9ucy5zbGlkZXNUb1Nob3cpLG89ZS5nZXROYXZpZ2FibGVJbmRleGVzKCkuZmlsdGVyKGZ1bmN0aW9uKGkpe3JldHVybiBpPj0wJiZpPGUuc2xpZGVDb3VudH0pO2UuJHNsaWRlcy5hZGQoZS4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLWNsb25lZFwiKSkuYXR0cih7XCJhcmlhLWhpZGRlblwiOlwidHJ1ZVwiLHRhYmluZGV4OlwiLTFcIn0pLmZpbmQoXCJhLCBpbnB1dCwgYnV0dG9uLCBzZWxlY3RcIikuYXR0cih7dGFiaW5kZXg6XCItMVwifSksbnVsbCE9PWUuJGRvdHMmJihlLiRzbGlkZXMubm90KGUuJHNsaWRlVHJhY2suZmluZChcIi5zbGljay1jbG9uZWRcIikpLmVhY2goZnVuY3Rpb24odCl7dmFyIHM9by5pbmRleE9mKHQpO2kodGhpcykuYXR0cih7cm9sZTpcInRhYnBhbmVsXCIsaWQ6XCJzbGljay1zbGlkZVwiK2UuaW5zdGFuY2VVaWQrdCx0YWJpbmRleDotMX0pLC0xIT09cyYmaSh0aGlzKS5hdHRyKHtcImFyaWEtZGVzY3JpYmVkYnlcIjpcInNsaWNrLXNsaWRlLWNvbnRyb2xcIitlLmluc3RhbmNlVWlkK3N9KX0pLGUuJGRvdHMuYXR0cihcInJvbGVcIixcInRhYmxpc3RcIikuZmluZChcImxpXCIpLmVhY2goZnVuY3Rpb24ocyl7dmFyIG49b1tzXTtpKHRoaXMpLmF0dHIoe3JvbGU6XCJwcmVzZW50YXRpb25cIn0pLGkodGhpcykuZmluZChcImJ1dHRvblwiKS5maXJzdCgpLmF0dHIoe3JvbGU6XCJ0YWJcIixpZDpcInNsaWNrLXNsaWRlLWNvbnRyb2xcIitlLmluc3RhbmNlVWlkK3MsXCJhcmlhLWNvbnRyb2xzXCI6XCJzbGljay1zbGlkZVwiK2UuaW5zdGFuY2VVaWQrbixcImFyaWEtbGFiZWxcIjpzKzErXCIgb2YgXCIrdCxcImFyaWEtc2VsZWN0ZWRcIjpudWxsLHRhYmluZGV4OlwiLTFcIn0pfSkuZXEoZS5jdXJyZW50U2xpZGUpLmZpbmQoXCJidXR0b25cIikuYXR0cih7XCJhcmlhLXNlbGVjdGVkXCI6XCJ0cnVlXCIsdGFiaW5kZXg6XCIwXCJ9KS5lbmQoKSk7Zm9yKHZhciBzPWUuY3VycmVudFNsaWRlLG49cytlLm9wdGlvbnMuc2xpZGVzVG9TaG93O3M8bjtzKyspZS4kc2xpZGVzLmVxKHMpLmF0dHIoXCJ0YWJpbmRleFwiLDApO2UuYWN0aXZhdGVBREEoKX0sZS5wcm90b3R5cGUuaW5pdEFycm93RXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGk9dGhpczshMD09PWkub3B0aW9ucy5hcnJvd3MmJmkuc2xpZGVDb3VudD5pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoaS4kcHJldkFycm93Lm9mZihcImNsaWNrLnNsaWNrXCIpLm9uKFwiY2xpY2suc2xpY2tcIix7bWVzc2FnZTpcInByZXZpb3VzXCJ9LGkuY2hhbmdlU2xpZGUpLGkuJG5leHRBcnJvdy5vZmYoXCJjbGljay5zbGlja1wiKS5vbihcImNsaWNrLnNsaWNrXCIse21lc3NhZ2U6XCJuZXh0XCJ9LGkuY2hhbmdlU2xpZGUpLCEwPT09aS5vcHRpb25zLmFjY2Vzc2liaWxpdHkmJihpLiRwcmV2QXJyb3cub24oXCJrZXlkb3duLnNsaWNrXCIsaS5rZXlIYW5kbGVyKSxpLiRuZXh0QXJyb3cub24oXCJrZXlkb3duLnNsaWNrXCIsaS5rZXlIYW5kbGVyKSkpfSxlLnByb3RvdHlwZS5pbml0RG90RXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczshMD09PWUub3B0aW9ucy5kb3RzJiYoaShcImxpXCIsZS4kZG90cykub24oXCJjbGljay5zbGlja1wiLHttZXNzYWdlOlwiaW5kZXhcIn0sZS5jaGFuZ2VTbGlkZSksITA9PT1lLm9wdGlvbnMuYWNjZXNzaWJpbGl0eSYmZS4kZG90cy5vbihcImtleWRvd24uc2xpY2tcIixlLmtleUhhbmRsZXIpKSwhMD09PWUub3B0aW9ucy5kb3RzJiYhMD09PWUub3B0aW9ucy5wYXVzZU9uRG90c0hvdmVyJiZpKFwibGlcIixlLiRkb3RzKS5vbihcIm1vdXNlZW50ZXIuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITApKS5vbihcIm1vdXNlbGVhdmUuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITEpKX0sZS5wcm90b3R5cGUuaW5pdFNsaWRlRXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLm9wdGlvbnMucGF1c2VPbkhvdmVyJiYoZS4kbGlzdC5vbihcIm1vdXNlZW50ZXIuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITApKSxlLiRsaXN0Lm9uKFwibW91c2VsZWF2ZS5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMSkpKX0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZUV2ZW50cz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5pbml0QXJyb3dFdmVudHMoKSxlLmluaXREb3RFdmVudHMoKSxlLmluaXRTbGlkZUV2ZW50cygpLGUuJGxpc3Qub24oXCJ0b3VjaHN0YXJ0LnNsaWNrIG1vdXNlZG93bi5zbGlja1wiLHthY3Rpb246XCJzdGFydFwifSxlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vbihcInRvdWNobW92ZS5zbGljayBtb3VzZW1vdmUuc2xpY2tcIix7YWN0aW9uOlwibW92ZVwifSxlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vbihcInRvdWNoZW5kLnNsaWNrIG1vdXNldXAuc2xpY2tcIix7YWN0aW9uOlwiZW5kXCJ9LGUuc3dpcGVIYW5kbGVyKSxlLiRsaXN0Lm9uKFwidG91Y2hjYW5jZWwuc2xpY2sgbW91c2VsZWF2ZS5zbGlja1wiLHthY3Rpb246XCJlbmRcIn0sZS5zd2lwZUhhbmRsZXIpLGUuJGxpc3Qub24oXCJjbGljay5zbGlja1wiLGUuY2xpY2tIYW5kbGVyKSxpKGRvY3VtZW50KS5vbihlLnZpc2liaWxpdHlDaGFuZ2UsaS5wcm94eShlLnZpc2liaWxpdHksZSkpLCEwPT09ZS5vcHRpb25zLmFjY2Vzc2liaWxpdHkmJmUuJGxpc3Qub24oXCJrZXlkb3duLnNsaWNrXCIsZS5rZXlIYW5kbGVyKSwhMD09PWUub3B0aW9ucy5mb2N1c09uU2VsZWN0JiZpKGUuJHNsaWRlVHJhY2spLmN
21167oaWxkcmVuKCkub24oXCJjbGljay5zbGlja1wiLGUuc2VsZWN0SGFuZGxlciksaSh3aW5kb3cpLm9uKFwib3JpZW50YXRpb25jaGFuZ2Uuc2xpY2suc2xpY2stXCIrZS5pbnN0YW5jZVVpZCxpLnByb3h5KGUub3JpZW50YXRpb25DaGFuZ2UsZSkpLGkod2luZG93KS5vbihcInJlc2l6ZS5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGkucHJveHkoZS5yZXNpemUsZSkpLGkoXCJbZHJhZ2dhYmxlIT10cnVlXVwiLGUuJHNsaWRlVHJhY2spLm9uKFwiZHJhZ3N0YXJ0XCIsZS5wcmV2ZW50RGVmYXVsdCksaSh3aW5kb3cpLm9uKFwibG9hZC5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGUuc2V0UG9zaXRpb24pLGkoZS5zZXRQb3NpdGlvbil9LGUucHJvdG90eXBlLmluaXRVST1mdW5jdGlvbigpe3ZhciBpPXRoaXM7ITA9PT1pLm9wdGlvbnMuYXJyb3dzJiZpLnNsaWRlQ291bnQ+aS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGkuJHByZXZBcnJvdy5zaG93KCksaS4kbmV4dEFycm93LnNob3coKSksITA9PT1pLm9wdGlvbnMuZG90cyYmaS5zbGlkZUNvdW50Pmkub3B0aW9ucy5zbGlkZXNUb1Nob3cmJmkuJGRvdHMuc2hvdygpfSxlLnByb3RvdHlwZS5rZXlIYW5kbGVyPWZ1bmN0aW9uKGkpe3ZhciBlPXRoaXM7aS50YXJnZXQudGFnTmFtZS5tYXRjaChcIlRFWFRBUkVBfElOUFVUfFNFTEVDVFwiKXx8KDM3PT09aS5rZXlDb2RlJiYhMD09PWUub3B0aW9ucy5hY2Nlc3NpYmlsaXR5P2UuY2hhbmdlU2xpZGUoe2RhdGE6e21lc3NhZ2U6ITA9PT1lLm9wdGlvbnMucnRsP1wibmV4dFwiOlwicHJldmlvdXNcIn19KTozOT09PWkua2V5Q29kZSYmITA9PT1lLm9wdGlvbnMuYWNjZXNzaWJpbGl0eSYmZS5jaGFuZ2VTbGlkZSh7ZGF0YTp7bWVzc2FnZTohMD09PWUub3B0aW9ucy5ydGw/XCJwcmV2aW91c1wiOlwibmV4dFwifX0pKX0sZS5wcm90b3R5cGUubGF6eUxvYWQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2koXCJpbWdbZGF0YS1sYXp5XVwiLGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1pKHRoaXMpLHQ9aSh0aGlzKS5hdHRyKFwiZGF0YS1sYXp5XCIpLG89aSh0aGlzKS5hdHRyKFwiZGF0YS1zcmNzZXRcIikscz1pKHRoaXMpLmF0dHIoXCJkYXRhLXNpemVzXCIpfHxuLiRzbGlkZXIuYXR0cihcImRhdGEtc2l6ZXNcIikscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO3Iub25sb2FkPWZ1bmN0aW9uKCl7ZS5hbmltYXRlKHtvcGFjaXR5OjB9LDEwMCxmdW5jdGlvbigpe28mJihlLmF0dHIoXCJzcmNzZXRcIixvKSxzJiZlLmF0dHIoXCJzaXplc1wiLHMpKSxlLmF0dHIoXCJzcmNcIix0KS5hbmltYXRlKHtvcGFjaXR5OjF9LDIwMCxmdW5jdGlvbigpe2UucmVtb3ZlQXR0cihcImRhdGEtbGF6eSBkYXRhLXNyY3NldCBkYXRhLXNpemVzXCIpLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKX0pLG4uJHNsaWRlci50cmlnZ2VyKFwibGF6eUxvYWRlZFwiLFtuLGUsdF0pfSl9LHIub25lcnJvcj1mdW5jdGlvbigpe2UucmVtb3ZlQXR0cihcImRhdGEtbGF6eVwiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWxvYWRpbmdcIikuYWRkQ2xhc3MoXCJzbGljay1sYXp5bG9hZC1lcnJvclwiKSxuLiRzbGlkZXIudHJpZ2dlcihcImxhenlMb2FkRXJyb3JcIixbbixlLHRdKX0sci5zcmM9dH0pfXZhciB0LG8scyxuPXRoaXM7aWYoITA9PT1uLm9wdGlvbnMuY2VudGVyTW9kZT8hMD09PW4ub3B0aW9ucy5pbmZpbml0ZT9zPShvPW4uY3VycmVudFNsaWRlKyhuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIrMSkpK24ub3B0aW9ucy5zbGlkZXNUb1Nob3crMjoobz1NYXRoLm1heCgwLG4uY3VycmVudFNsaWRlLShuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIrMSkpLHM9bi5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKzErMituLmN1cnJlbnRTbGlkZSk6KG89bi5vcHRpb25zLmluZmluaXRlP24ub3B0aW9ucy5zbGlkZXNUb1Nob3crbi5jdXJyZW50U2xpZGU6bi5jdXJyZW50U2xpZGUscz1NYXRoLmNlaWwobytuLm9wdGlvbnMuc2xpZGVzVG9TaG93KSwhMD09PW4ub3B0aW9ucy5mYWRlJiYobz4wJiZvLS0sczw9bi5zbGlkZUNvdW50JiZzKyspKSx0PW4uJHNsaWRlci5maW5kKFwiLnNsaWNrLXNsaWRlXCIpLnNsaWNlKG8scyksXCJhbnRpY2lwYXRlZFwiPT09bi5vcHRpb25zLmxhenlMb2FkKWZvcih2YXIgcj1vLTEsbD1zLGQ9bi4kc2xpZGVyLmZpbmQoXCIuc2xpY2stc2xpZGVcIiksYT0wO2E8bi5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsO2ErKylyPDAmJihyPW4uc2xpZGVDb3VudC0xKSx0PSh0PXQuYWRkKGQuZXEocikpKS5hZGQoZC5lcShsKSksci0tLGwrKztlKHQpLG4uc2xpZGVDb3VudDw9bi5vcHRpb25zLnNsaWRlc1RvU2hvdz9lKG4uJHNsaWRlci5maW5kKFwiLnNsaWNrLXNsaWRlXCIpKTpuLmN1cnJlbnRTbGlkZT49bi5zbGlkZUNvdW50LW4ub3B0aW9ucy5zbGlkZXNUb1Nob3c/ZShuLiRzbGlkZXIuZmluZChcIi5zbGljay1jbG9uZWRcIikuc2xpY2UoMCxuLm9wdGlvbnMuc2xpZGVzVG9TaG93KSk6MD09PW4uY3VycmVudFNsaWRlJiZlKG4uJHNsaWRlci5maW5kKFwiLnNsaWNrLWNsb25lZFwiKS5zbGljZSgtMSpuLm9wdGlvbnMuc2xpZGVzVG9TaG93KSl9LGUucHJvdG90eXBlLmxvYWRTbGlkZXI9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuc2V0UG9zaXRpb24oKSxpLiRzbGlkZVRyYWNrLmNzcyh7b3BhY2l0eToxfSksaS4kc2xpZGVyLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKSxpLmluaXRVSSgpLFwicHJvZ3Jlc3NpdmVcIj09PWkub3B0aW9ucy5sYXp5TG9hZCYmaS5wcm9ncmVzc2l2ZUxhenlMb2FkKCl9LGUucHJvdG90eXBlLm5leHQ9ZS5wcm90b3R5cGUuc2xpY2tOZXh0PWZ1bmN0aW9uKCl7dGhpcy5jaGFuZ2VTbGlkZSh7ZGF0YTp7bWVzc2FnZTpcIm5leHRcIn19KX0sZS5wcm90b3R5cGUub3JpZW50YXRpb25DaGFuZ2U9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuY2hlY2tSZXNwb25zaXZlKCksaS5zZXRQb3NpdGlvbigpfSxlLnByb3RvdHlwZS5wYXVzZT1lLnByb3RvdHlwZS5zbGlja1BhdXNlPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLmF1dG9QbGF5Q2xlYXIoKSxpLnBhdXNlZD0hMH0sZS5wcm90b3R5cGUucGxheT1lLnByb3RvdHlwZS5zbGlja1BsYXk9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuYXV0b1BsYXkoKSxpLm9wdGlvbnMuYXV0b3BsYXk9ITAsaS5wYXVzZWQ9ITEsaS5mb2N1c3NlZD0hMSxpLmludGVycnVwdGVkPSExfSxlLnByb3RvdHlwZS5wb3N0U2xpZGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LnVuc2xpY2tlZHx8KHQuJHNsaWRlci50cmlnZ2VyKFwiYWZ0ZXJDaGFuZ2VcIixbdCxlXSksdC5hbmltYXRpbmc9ITEsdC5zbGlkZUNvdW50PnQub3B0aW9ucy5zbGlkZXNUb1Nob3cmJnQuc2V0UG9zaXRpb24oKSx0LnN3aXBlTGVmdD1udWxsLHQub3B0aW9ucy5hdXRvcGxheSYmdC5hdXRvUGxheSgpLCEwPT09dC5vcHRpb25zLmFjY2Vzc2liaWxpdHkmJih0LmluaXRBREEoKSx0Lm9wdGlvbnMuZm9jdXNPbkNoYW5nZSYmaSh0LiRzbGlkZXMuZ2V0KHQuY3VycmVudFNsaWRlKSkuYXR0cihcInRhYmluZGV4XCIsMCkuZm9jdXMoKSkpfSxlLnByb3RvdHlwZS5wcmV2PWUucHJvdG90eXBlLnNsaWNrUHJldj1mdW5jdGlvbigpe3RoaXMuY2hhbmdlU2xpZGUoe2R
21167hdGE6e21lc3NhZ2U6XCJwcmV2aW91c1wifX0pfSxlLnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbihpKXtpLnByZXZlbnREZWZhdWx0KCl9LGUucHJvdG90eXBlLnByb2dyZXNzaXZlTGF6eUxvYWQ9ZnVuY3Rpb24oZSl7ZT1lfHwxO3ZhciB0LG8scyxuLHIsbD10aGlzLGQ9aShcImltZ1tkYXRhLWxhenldXCIsbC4kc2xpZGVyKTtkLmxlbmd0aD8odD1kLmZpcnN0KCksbz10LmF0dHIoXCJkYXRhLWxhenlcIikscz10LmF0dHIoXCJkYXRhLXNyY3NldFwiKSxuPXQuYXR0cihcImRhdGEtc2l6ZXNcIil8fGwuJHNsaWRlci5hdHRyKFwiZGF0YS1zaXplc1wiKSwocj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpKS5vbmxvYWQ9ZnVuY3Rpb24oKXtzJiYodC5hdHRyKFwic3Jjc2V0XCIscyksbiYmdC5hdHRyKFwic2l6ZXNcIixuKSksdC5hdHRyKFwic3JjXCIsbykucmVtb3ZlQXR0cihcImRhdGEtbGF6eSBkYXRhLXNyY3NldCBkYXRhLXNpemVzXCIpLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKSwhMD09PWwub3B0aW9ucy5hZGFwdGl2ZUhlaWdodCYmbC5zZXRQb3NpdGlvbigpLGwuJHNsaWRlci50cmlnZ2VyKFwibGF6eUxvYWRlZFwiLFtsLHQsb10pLGwucHJvZ3Jlc3NpdmVMYXp5TG9hZCgpfSxyLm9uZXJyb3I9ZnVuY3Rpb24oKXtlPDM/c2V0VGltZW91dChmdW5jdGlvbigpe2wucHJvZ3Jlc3NpdmVMYXp5TG9hZChlKzEpfSw1MDApOih0LnJlbW92ZUF0dHIoXCJkYXRhLWxhenlcIikucmVtb3ZlQ2xhc3MoXCJzbGljay1sb2FkaW5nXCIpLmFkZENsYXNzKFwic2xpY2stbGF6eWxvYWQtZXJyb3JcIiksbC4kc2xpZGVyLnRyaWdnZXIoXCJsYXp5TG9hZEVycm9yXCIsW2wsdCxvXSksbC5wcm9ncmVzc2l2ZUxhenlMb2FkKCkpfSxyLnNyYz1vKTpsLiRzbGlkZXIudHJpZ2dlcihcImFsbEltYWdlc0xvYWRlZFwiLFtsXSl9LGUucHJvdG90eXBlLnJlZnJlc2g9ZnVuY3Rpb24oZSl7dmFyIHQsbyxzPXRoaXM7bz1zLnNsaWRlQ291bnQtcy5vcHRpb25zLnNsaWRlc1RvU2hvdywhcy5vcHRpb25zLmluZmluaXRlJiZzLmN1cnJlbnRTbGlkZT5vJiYocy5jdXJyZW50U2xpZGU9bykscy5zbGlkZUNvdW50PD1zLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYocy5jdXJyZW50U2xpZGU9MCksdD1zLmN1cnJlbnRTbGlkZSxzLmRlc3Ryb3koITApLGkuZXh0ZW5kKHMscy5pbml0aWFscyx7Y3VycmVudFNsaWRlOnR9KSxzLmluaXQoKSxlfHxzLmNoYW5nZVNsaWRlKHtkYXRhOnttZXNzYWdlOlwiaW5kZXhcIixpbmRleDp0fX0sITEpfSxlLnByb3RvdHlwZS5yZWdpc3RlckJyZWFrcG9pbnRzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvLHM9dGhpcyxuPXMub3B0aW9ucy5yZXNwb25zaXZlfHxudWxsO2lmKFwiYXJyYXlcIj09PWkudHlwZShuKSYmbi5sZW5ndGgpe3MucmVzcG9uZFRvPXMub3B0aW9ucy5yZXNwb25kVG98fFwid2luZG93XCI7Zm9yKGUgaW4gbilpZihvPXMuYnJlYWtwb2ludHMubGVuZ3RoLTEsbi5oYXNPd25Qcm9wZXJ0eShlKSl7Zm9yKHQ9bltlXS5icmVha3BvaW50O28+PTA7KXMuYnJlYWtwb2ludHNbb10mJnMuYnJlYWtwb2ludHNbb109PT10JiZzLmJyZWFrcG9pbnRzLnNwbGljZShvLDEpLG8tLTtzLmJyZWFrcG9pbnRzLnB1c2godCkscy5icmVha3BvaW50U2V0dGluZ3NbdF09bltlXS5zZXR0aW5nc31zLmJyZWFrcG9pbnRzLnNvcnQoZnVuY3Rpb24oaSxlKXtyZXR1cm4gcy5vcHRpb25zLm1vYmlsZUZpcnN0P2ktZTplLWl9KX19LGUucHJvdG90eXBlLnJlaW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS4kc2xpZGVzPWUuJHNsaWRlVHJhY2suY2hpbGRyZW4oZS5vcHRpb25zLnNsaWRlKS5hZGRDbGFzcyhcInNsaWNrLXNsaWRlXCIpLGUuc2xpZGVDb3VudD1lLiRzbGlkZXMubGVuZ3RoLGUuY3VycmVudFNsaWRlPj1lLnNsaWRlQ291bnQmJjAhPT1lLmN1cnJlbnRTbGlkZSYmKGUuY3VycmVudFNsaWRlPWUuY3VycmVudFNsaWRlLWUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCksZS5zbGlkZUNvdW50PD1lLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoZS5jdXJyZW50U2xpZGU9MCksZS5yZWdpc3RlckJyZWFrcG9pbnRzKCksZS5zZXRQcm9wcygpLGUuc2V0dXBJbmZpbml0ZSgpLGUuYnVpbGRBcnJvd3MoKSxlLnVwZGF0ZUFycm93cygpLGUuaW5pdEFycm93RXZlbnRzKCksZS5idWlsZERvdHMoKSxlLnVwZGF0ZURvdHMoKSxlLmluaXREb3RFdmVudHMoKSxlLmNsZWFuVXBTbGlkZUV2ZW50cygpLGUuaW5pdFNsaWRlRXZlbnRzKCksZS5jaGVja1Jlc3BvbnNpdmUoITEsITApLCEwPT09ZS5vcHRpb25zLmZvY3VzT25TZWxlY3QmJmkoZS4kc2xpZGVUcmFjaykuY2hpbGRyZW4oKS5vbihcImNsaWNrLnNsaWNrXCIsZS5zZWxlY3RIYW5kbGVyKSxlLnNldFNsaWRlQ2xhc3NlcyhcIm51bWJlclwiPT10eXBlb2YgZS5jdXJyZW50U2xpZGU/ZS5jdXJyZW50U2xpZGU6MCksZS5zZXRQb3NpdGlvbigpLGUuZm9jdXNIYW5kbGVyKCksZS5wYXVzZWQ9IWUub3B0aW9ucy5hdXRvcGxheSxlLmF1dG9QbGF5KCksZS4kc2xpZGVyLnRyaWdnZXIoXCJyZUluaXRcIixbZV0pfSxlLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2kod2luZG93KS53aWR0aCgpIT09ZS53aW5kb3dXaWR0aCYmKGNsZWFyVGltZW91dChlLndpbmRvd0RlbGF5KSxlLndpbmRvd0RlbGF5PXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS53aW5kb3dXaWR0aD1pKHdpbmRvdykud2lkdGgoKSxlLmNoZWNrUmVzcG9uc2l2ZSgpLGUudW5zbGlja2VkfHxlLnNldFBvc2l0aW9uKCl9LDUwKSl9LGUucHJvdG90eXBlLnJlbW92ZVNsaWRlPWUucHJvdG90eXBlLnNsaWNrUmVtb3ZlPWZ1bmN0aW9uKGksZSx0KXt2YXIgbz10aGlzO2lmKGk9XCJib29sZWFuXCI9PXR5cGVvZiBpPyEwPT09KGU9aSk/MDpvLnNsaWRlQ291bnQtMTohMD09PWU/LS1pOmksby5zbGlkZUNvdW50PDF8fGk8MHx8aT5vLnNsaWRlQ291bnQtMSlyZXR1cm4hMTtvLnVubG9hZCgpLCEwPT09dD9vLiRzbGlkZVRyYWNrLmNoaWxkcmVuKCkucmVtb3ZlKCk6by4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLmVxKGkpLnJlbW92ZSgpLG8uJHNsaWRlcz1vLiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSksby4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLmRldGFjaCgpLG8uJHNsaWRlVHJhY2suYXBwZW5kKG8uJHNsaWRlcyksby4kc2xpZGVzQ2FjaGU9by4kc2xpZGVzLG8ucmVpbml0KCl9LGUucHJvdG90eXBlLnNldENTUz1mdW5jdGlvbihpKXt2YXIgZSx0LG89dGhpcyxzPXt9OyEwPT09by5vcHRpb25zLnJ0bCYmKGk9LWkpLGU9XCJsZWZ0XCI9PW8ucG9zaXRpb25Qcm9wP01hdGguY2VpbChpKStcInB4XCI6XCIwcHhcIix0PVwidG9wXCI9PW8ucG9zaXRpb25Qcm9wP01hdGguY2VpbChpKStcInB4XCI6XCIwcHhcIixzW28ucG9zaXRpb25Qcm9wXT1pLCExPT09by50cmFuc2Zvcm1zRW5hYmxlZD9vLiRzbGlkZVRyYWNrLmNzcyhzKToocz17fSwhMT09PW8uY3NzVHJhbnNpdGlvbnM/KHNbby5hbmltVHlwZV09XCJ0cmFuc2xhdGUoXCIrZStcIiwgXCIrdCtcIilcIixvLiRzbGlkZVRyYWNrLmNzcyhzKSk6KHNbby5hbmltVHlwZV09XCJ0cmFuc2xhdGUzZChcIitlK1wiLCBcIit0K1wiLCAwcHgpXCIsby4kc2xpZGVUcmFjay5jc3MocykpKX0sZS5wcm90b3R5cGUuc2V0RGltZW5zaW9ucz1mdW5jdGlvbigpe3ZhciBpPXRoaXM7ITE9PT1pLm9wdGlvbnMudmVydGljYWw/ITA9PT1pLm9wdGlvbnMuY2VudGVyTW9kZSYmaS4kbGlzdC5jc3Moe3BhZGRpbmc6XCIwcHggXCIraS5vcHRpb25zLmNlbn
21167RlclBhZGRpbmd9KTooaS4kbGlzdC5oZWlnaHQoaS4kc2xpZGVzLmZpcnN0KCkub3V0ZXJIZWlnaHQoITApKmkub3B0aW9ucy5zbGlkZXNUb1Nob3cpLCEwPT09aS5vcHRpb25zLmNlbnRlck1vZGUmJmkuJGxpc3QuY3NzKHtwYWRkaW5nOmkub3B0aW9ucy5jZW50ZXJQYWRkaW5nK1wiIDBweFwifSkpLGkubGlzdFdpZHRoPWkuJGxpc3Qud2lkdGgoKSxpLmxpc3RIZWlnaHQ9aS4kbGlzdC5oZWlnaHQoKSwhMT09PWkub3B0aW9ucy52ZXJ0aWNhbCYmITE9PT1pLm9wdGlvbnMudmFyaWFibGVXaWR0aD8oaS5zbGlkZVdpZHRoPU1hdGguY2VpbChpLmxpc3RXaWR0aC9pLm9wdGlvbnMuc2xpZGVzVG9TaG93KSxpLiRzbGlkZVRyYWNrLndpZHRoKE1hdGguY2VpbChpLnNsaWRlV2lkdGgqaS4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS5sZW5ndGgpKSk6ITA9PT1pLm9wdGlvbnMudmFyaWFibGVXaWR0aD9pLiRzbGlkZVRyYWNrLndpZHRoKDVlMyppLnNsaWRlQ291bnQpOihpLnNsaWRlV2lkdGg9TWF0aC5jZWlsKGkubGlzdFdpZHRoKSxpLiRzbGlkZVRyYWNrLmhlaWdodChNYXRoLmNlaWwoaS4kc2xpZGVzLmZpcnN0KCkub3V0ZXJIZWlnaHQoITApKmkuJHNsaWRlVHJhY2suY2hpbGRyZW4oXCIuc2xpY2stc2xpZGVcIikubGVuZ3RoKSkpO3ZhciBlPWkuJHNsaWRlcy5maXJzdCgpLm91dGVyV2lkdGgoITApLWkuJHNsaWRlcy5maXJzdCgpLndpZHRoKCk7ITE9PT1pLm9wdGlvbnMudmFyaWFibGVXaWR0aCYmaS4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS53aWR0aChpLnNsaWRlV2lkdGgtZSl9LGUucHJvdG90eXBlLnNldEZhZGU9ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXM7dC4kc2xpZGVzLmVhY2goZnVuY3Rpb24obyxzKXtlPXQuc2xpZGVXaWR0aCpvKi0xLCEwPT09dC5vcHRpb25zLnJ0bD9pKHMpLmNzcyh7cG9zaXRpb246XCJyZWxhdGl2ZVwiLHJpZ2h0OmUsdG9wOjAsekluZGV4OnQub3B0aW9ucy56SW5kZXgtMixvcGFjaXR5OjB9KTppKHMpLmNzcyh7cG9zaXRpb246XCJyZWxhdGl2ZVwiLGxlZnQ6ZSx0b3A6MCx6SW5kZXg6dC5vcHRpb25zLnpJbmRleC0yLG9wYWNpdHk6MH0pfSksdC4kc2xpZGVzLmVxKHQuY3VycmVudFNsaWRlKS5jc3Moe3pJbmRleDp0Lm9wdGlvbnMuekluZGV4LTEsb3BhY2l0eToxfSl9LGUucHJvdG90eXBlLnNldEhlaWdodD1mdW5jdGlvbigpe3ZhciBpPXRoaXM7aWYoMT09PWkub3B0aW9ucy5zbGlkZXNUb1Nob3cmJiEwPT09aS5vcHRpb25zLmFkYXB0aXZlSGVpZ2h0JiYhMT09PWkub3B0aW9ucy52ZXJ0aWNhbCl7dmFyIGU9aS4kc2xpZGVzLmVxKGkuY3VycmVudFNsaWRlKS5vdXRlckhlaWdodCghMCk7aS4kbGlzdC5jc3MoXCJoZWlnaHRcIixlKX19LGUucHJvdG90eXBlLnNldE9wdGlvbj1lLnByb3RvdHlwZS5zbGlja1NldE9wdGlvbj1mdW5jdGlvbigpe3ZhciBlLHQsbyxzLG4scj10aGlzLGw9ITE7aWYoXCJvYmplY3RcIj09PWkudHlwZShhcmd1bWVudHNbMF0pPyhvPWFyZ3VtZW50c1swXSxsPWFyZ3VtZW50c1sxXSxuPVwibXVsdGlwbGVcIik6XCJzdHJpbmdcIj09PWkudHlwZShhcmd1bWVudHNbMF0pJiYobz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sbD1hcmd1bWVudHNbMl0sXCJyZXNwb25zaXZlXCI9PT1hcmd1bWVudHNbMF0mJlwiYXJyYXlcIj09PWkudHlwZShhcmd1bWVudHNbMV0pP249XCJyZXNwb25zaXZlXCI6dm9pZCAwIT09YXJndW1lbnRzWzFdJiYobj1cInNpbmdsZVwiKSksXCJzaW5nbGVcIj09PW4pci5vcHRpb25zW29dPXM7ZWxzZSBpZihcIm11bHRpcGxlXCI9PT1uKWkuZWFjaChvLGZ1bmN0aW9uKGksZSl7ci5vcHRpb25zW2ldPWV9KTtlbHNlIGlmKFwicmVzcG9uc2l2ZVwiPT09bilmb3IodCBpbiBzKWlmKFwiYXJyYXlcIiE9PWkudHlwZShyLm9wdGlvbnMucmVzcG9uc2l2ZSkpci5vcHRpb25zLnJlc3BvbnNpdmU9W3NbdF1dO2Vsc2V7Zm9yKGU9ci5vcHRpb25zLnJlc3BvbnNpdmUubGVuZ3RoLTE7ZT49MDspci5vcHRpb25zLnJlc3BvbnNpdmVbZV0uYnJlYWtwb2ludD09PXNbdF0uYnJlYWtwb2ludCYmci5vcHRpb25zLnJlc3BvbnNpdmUuc3BsaWNlKGUsMSksZS0tO3Iub3B0aW9ucy5yZXNwb25zaXZlLnB1c2goc1t0XSl9bCYmKHIudW5sb2FkKCksci5yZWluaXQoKSl9LGUucHJvdG90eXBlLnNldFBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLnNldERpbWVuc2lvbnMoKSxpLnNldEhlaWdodCgpLCExPT09aS5vcHRpb25zLmZhZGU/aS5zZXRDU1MoaS5nZXRMZWZ0KGkuY3VycmVudFNsaWRlKSk6aS5zZXRGYWRlKCksaS4kc2xpZGVyLnRyaWdnZXIoXCJzZXRQb3NpdGlvblwiLFtpXSl9LGUucHJvdG90eXBlLnNldFByb3BzPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxlPWRvY3VtZW50LmJvZHkuc3R5bGU7aS5wb3NpdGlvblByb3A9ITA9PT1pLm9wdGlvbnMudmVydGljYWw/XCJ0b3BcIjpcImxlZnRcIixcInRvcFwiPT09aS5wb3NpdGlvblByb3A/aS4kc2xpZGVyLmFkZENsYXNzKFwic2xpY2stdmVydGljYWxcIik6aS4kc2xpZGVyLnJlbW92ZUNsYXNzKFwic2xpY2stdmVydGljYWxcIiksdm9pZCAwPT09ZS5XZWJraXRUcmFuc2l0aW9uJiZ2b2lkIDA9PT1lLk1velRyYW5zaXRpb24mJnZvaWQgMD09PWUubXNUcmFuc2l0aW9ufHwhMD09PWkub3B0aW9ucy51c2VDU1MmJihpLmNzc1RyYW5zaXRpb25zPSEwKSxpLm9wdGlvbnMuZmFkZSYmKFwibnVtYmVyXCI9PXR5cGVvZiBpLm9wdGlvbnMuekluZGV4P2kub3B0aW9ucy56SW5kZXg8MyYmKGkub3B0aW9ucy56SW5kZXg9Myk6aS5vcHRpb25zLnpJbmRleD1pLmRlZmF1bHRzLnpJbmRleCksdm9pZCAwIT09ZS5PVHJhbnNmb3JtJiYoaS5hbmltVHlwZT1cIk9UcmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCItby10cmFuc2Zvcm1cIixpLnRyYW5zaXRpb25UeXBlPVwiT1RyYW5zaXRpb25cIix2b2lkIDA9PT1lLnBlcnNwZWN0aXZlUHJvcGVydHkmJnZvaWQgMD09PWUud2Via2l0UGVyc3BlY3RpdmUmJihpLmFuaW1UeXBlPSExKSksdm9pZCAwIT09ZS5Nb3pUcmFuc2Zvcm0mJihpLmFuaW1UeXBlPVwiTW96VHJhbnNmb3JtXCIsaS50cmFuc2Zvcm1UeXBlPVwiLW1vei10cmFuc2Zvcm1cIixpLnRyYW5zaXRpb25UeXBlPVwiTW96VHJhbnNpdGlvblwiLHZvaWQgMD09PWUucGVyc3BlY3RpdmVQcm9wZXJ0eSYmdm9pZCAwPT09ZS5Nb3pQZXJzcGVjdGl2ZSYmKGkuYW5pbVR5cGU9ITEpKSx2b2lkIDAhPT1lLndlYmtpdFRyYW5zZm9ybSYmKGkuYW5pbVR5cGU9XCJ3ZWJraXRUcmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCItd2Via2l0LXRyYW5zZm9ybVwiLGkudHJhbnNpdGlvblR5cGU9XCJ3ZWJraXRUcmFuc2l0aW9uXCIsdm9pZCAwPT09ZS5wZXJzcGVjdGl2ZVByb3BlcnR5JiZ2b2lkIDA9PT1lLndlYmtpdFBlcnNwZWN0aXZlJiYoaS5hbmltVHlwZT0hMSkpLHZvaWQgMCE9PWUubXNUcmFuc2Zvcm0mJihpLmFuaW1UeXBlPVwibXNUcmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCItbXMtdHJhbnNmb3JtXCIsaS50cmFuc2l0aW9uVHlwZT1cIm1zVHJhbnNpdGlvblwiLHZvaWQgMD09PWUubXNUcmFuc2Zvcm0mJihpLmFuaW1UeXBlPSExKSksdm9pZCAwIT09ZS50cmFuc2Zvcm0mJiExIT09aS5hbmltVHlwZSYmKGkuYW5pbVR5cGU9XCJ0cmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCJ0cmFuc2Zvcm1cIixpLnRyYW5zaXRpb25UeXBlPVwidHJhbnNpdGlvblwiKSxpLnRyYW5zZm9ybXNFbmFibGVkPWkub3B0aW9ucy51c2VUcmFuc2Zvcm0mJm51bGwhPT1pLmFuaW1UeXBlJiYhMSE9PWkuYW5pbVR5cGV9LGUucHJvdG90eXBlLnNldFNsaWRlQ2xhc3Nlcz1mdW5jdGlvbihpKXt2YXIgZSx0LG8scyxuPXRoaXM7aWYodD1uLiRzbGlkZXIuZmluZChcIi5zbGljay1zbGlkZVwiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWFjdGl2ZSBzbGljay1jZW50ZXIgc2xpY2stY3VycmVudFwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIiksbi4kc2xpZGVzLmVxKGkpLmFkZENsYXNzKFwic2xpY2stY3VycmVudFwiKSwhMD09PW4ub3B0aW9ucy5jZW50ZXJNb2RlKXt2YXIgcj1uLm9wdGlvbnMuc2xpZGVzVG9TaG93JTI9PTA/MTowO2U9TWF0aC5mbG9vcihuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIpLCEwPT09bi5vcHRpb25zLmluZmluaXRlJiYoaT49ZSYmaTw9bi5zbGlkZUNvdW50LTEtZT9uLiRzbGlkZXMuc2xpY2UoaS1lK3IsaStlKzEpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIik6KG89bi5vcHRpb25zLnNsaWRlc1RvU2hvdytpLHQuc2xpY2Uoby1lKzErcixvK2UrMikuYWRk
21167Q2xhc3MoXCJzbGljay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKSksMD09PWk/dC5lcSh0Lmxlbmd0aC0xLW4ub3B0aW9ucy5zbGlkZXNUb1Nob3cpLmFkZENsYXNzKFwic2xpY2stY2VudGVyXCIpOmk9PT1uLnNsaWRlQ291bnQtMSYmdC5lcShuLm9wdGlvbnMuc2xpZGVzVG9TaG93KS5hZGRDbGFzcyhcInNsaWNrLWNlbnRlclwiKSksbi4kc2xpZGVzLmVxKGkpLmFkZENsYXNzKFwic2xpY2stY2VudGVyXCIpfWVsc2UgaT49MCYmaTw9bi5zbGlkZUNvdW50LW4ub3B0aW9ucy5zbGlkZXNUb1Nob3c/bi4kc2xpZGVzLnNsaWNlKGksaStuLm9wdGlvbnMuc2xpZGVzVG9TaG93KS5hZGRDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpOnQubGVuZ3RoPD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93P3QuYWRkQ2xhc3MoXCJzbGljay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKToocz1uLnNsaWRlQ291bnQlbi5vcHRpb25zLnNsaWRlc1RvU2hvdyxvPSEwPT09bi5vcHRpb25zLmluZmluaXRlP24ub3B0aW9ucy5zbGlkZXNUb1Nob3craTppLG4ub3B0aW9ucy5zbGlkZXNUb1Nob3c9PW4ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCYmbi5zbGlkZUNvdW50LWk8bi5vcHRpb25zLnNsaWRlc1RvU2hvdz90LnNsaWNlKG8tKG4ub3B0aW9ucy5zbGlkZXNUb1Nob3ctcyksbytzKS5hZGRDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpOnQuc2xpY2UobyxvK24ub3B0aW9ucy5zbGlkZXNUb1Nob3cpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIikpO1wib25kZW1hbmRcIiE9PW4ub3B0aW9ucy5sYXp5TG9hZCYmXCJhbnRpY2lwYXRlZFwiIT09bi5vcHRpb25zLmxhenlMb2FkfHxuLmxhenlMb2FkKCl9LGUucHJvdG90eXBlLnNldHVwSW5maW5pdGU9ZnVuY3Rpb24oKXt2YXIgZSx0LG8scz10aGlzO2lmKCEwPT09cy5vcHRpb25zLmZhZGUmJihzLm9wdGlvbnMuY2VudGVyTW9kZT0hMSksITA9PT1zLm9wdGlvbnMuaW5maW5pdGUmJiExPT09cy5vcHRpb25zLmZhZGUmJih0PW51bGwscy5zbGlkZUNvdW50PnMub3B0aW9ucy5zbGlkZXNUb1Nob3cpKXtmb3Iobz0hMD09PXMub3B0aW9ucy5jZW50ZXJNb2RlP3Mub3B0aW9ucy5zbGlkZXNUb1Nob3crMTpzLm9wdGlvbnMuc2xpZGVzVG9TaG93LGU9cy5zbGlkZUNvdW50O2U+cy5zbGlkZUNvdW50LW87ZS09MSl0PWUtMSxpKHMuJHNsaWRlc1t0XSkuY2xvbmUoITApLmF0dHIoXCJpZFwiLFwiXCIpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIsdC1zLnNsaWRlQ291bnQpLnByZXBlbmRUbyhzLiRzbGlkZVRyYWNrKS5hZGRDbGFzcyhcInNsaWNrLWNsb25lZFwiKTtmb3IoZT0wO2U8bytzLnNsaWRlQ291bnQ7ZSs9MSl0PWUsaShzLiRzbGlkZXNbdF0pLmNsb25lKCEwKS5hdHRyKFwiaWRcIixcIlwiKS5hdHRyKFwiZGF0YS1zbGljay1pbmRleFwiLHQrcy5zbGlkZUNvdW50KS5hcHBlbmRUbyhzLiRzbGlkZVRyYWNrKS5hZGRDbGFzcyhcInNsaWNrLWNsb25lZFwiKTtzLiRzbGlkZVRyYWNrLmZpbmQoXCIuc2xpY2stY2xvbmVkXCIpLmZpbmQoXCJbaWRdXCIpLmVhY2goZnVuY3Rpb24oKXtpKHRoaXMpLmF0dHIoXCJpZFwiLFwiXCIpfSl9fSxlLnByb3RvdHlwZS5pbnRlcnJ1cHQ9ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcztpfHxlLmF1dG9QbGF5KCksZS5pbnRlcnJ1cHRlZD1pfSxlLnByb3RvdHlwZS5zZWxlY3RIYW5kbGVyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbz1pKGUudGFyZ2V0KS5pcyhcIi5zbGljay1zbGlkZVwiKT9pKGUudGFyZ2V0KTppKGUudGFyZ2V0KS5wYXJlbnRzKFwiLnNsaWNrLXNsaWRlXCIpLHM9cGFyc2VJbnQoby5hdHRyKFwiZGF0YS1zbGljay1pbmRleFwiKSk7c3x8KHM9MCksdC5zbGlkZUNvdW50PD10Lm9wdGlvbnMuc2xpZGVzVG9TaG93P3Quc2xpZGVIYW5kbGVyKHMsITEsITApOnQuc2xpZGVIYW5kbGVyKHMpfSxlLnByb3RvdHlwZS5zbGlkZUhhbmRsZXI9ZnVuY3Rpb24oaSxlLHQpe3ZhciBvLHMsbixyLGwsZD1udWxsLGE9dGhpcztpZihlPWV8fCExLCEoITA9PT1hLmFuaW1hdGluZyYmITA9PT1hLm9wdGlvbnMud2FpdEZvckFuaW1hdGV8fCEwPT09YS5vcHRpb25zLmZhZGUmJmEuY3VycmVudFNsaWRlPT09aSkpaWYoITE9PT1lJiZhLmFzTmF2Rm9yKGkpLG89aSxkPWEuZ2V0TGVmdChvKSxyPWEuZ2V0TGVmdChhLmN1cnJlbnRTbGlkZSksYS5jdXJyZW50TGVmdD1udWxsPT09YS5zd2lwZUxlZnQ/cjphLnN3aXBlTGVmdCwhMT09PWEub3B0aW9ucy5pbmZpbml0ZSYmITE9PT1hLm9wdGlvbnMuY2VudGVyTW9kZSYmKGk8MHx8aT5hLmdldERvdENvdW50KCkqYS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsKSkhMT09PWEub3B0aW9ucy5mYWRlJiYobz1hLmN1cnJlbnRTbGlkZSwhMCE9PXQ/YS5hbmltYXRlU2xpZGUocixmdW5jdGlvbigpe2EucG9zdFNsaWRlKG8pfSk6YS5wb3N0U2xpZGUobykpO2Vsc2UgaWYoITE9PT1hLm9wdGlvbnMuaW5maW5pdGUmJiEwPT09YS5vcHRpb25zLmNlbnRlck1vZGUmJihpPDB8fGk+YS5zbGlkZUNvdW50LWEub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCkpITE9PT1hLm9wdGlvbnMuZmFkZSYmKG89YS5jdXJyZW50U2xpZGUsITAhPT10P2EuYW5pbWF0ZVNsaWRlKHIsZnVuY3Rpb24oKXthLnBvc3RTbGlkZShvKX0pOmEucG9zdFNsaWRlKG8pKTtlbHNle2lmKGEub3B0aW9ucy5hdXRvcGxheSYmY2xlYXJJbnRlcnZhbChhLmF1dG9QbGF5VGltZXIpLHM9bzwwP2Euc2xpZGVDb3VudCVhLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwhPTA/YS5zbGlkZUNvdW50LWEuc2xpZGVDb3VudCVhLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw6YS5zbGlkZUNvdW50K286bz49YS5zbGlkZUNvdW50P2Euc2xpZGVDb3VudCVhLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwhPTA/MDpvLWEuc2xpZGVDb3VudDpvLGEuYW5pbWF0aW5nPSEwLGEuJHNsaWRlci50cmlnZ2VyKFwiYmVmb3JlQ2hhbmdlXCIsW2EsYS5jdXJyZW50U2xpZGUsc10pLG49YS5jdXJyZW50U2xpZGUsYS5jdXJyZW50U2xpZGU9cyxhLnNldFNsaWRlQ2xhc3NlcyhhLmN1cnJlbnRTbGlkZSksYS5vcHRpb25zLmFzTmF2Rm9yJiYobD0obD1hLmdldE5hdlRhcmdldCgpKS5zbGljayhcImdldFNsaWNrXCIpKS5zbGlkZUNvdW50PD1sLm9wdGlvbnMuc2xpZGVzVG9TaG93JiZsLnNldFNsaWRlQ2xhc3NlcyhhLmN1cnJlbnRTbGlkZSksYS51cGRhdGVEb3RzKCksYS51cGRhdGVBcnJvd3MoKSwhMD09PWEub3B0aW9ucy5mYWRlKXJldHVybiEwIT09dD8oYS5mYWRlU2xpZGVPdXQobiksYS5mYWRlU2xpZGUocyxmdW5jdGlvbigpe2EucG9zdFNsaWRlKHMpfSkpOmEucG9zdFNsaWRlKHMpLHZvaWQgYS5hbmltYXRlSGVpZ2h0KCk7ITAhPT10P2EuYW5pbWF0ZVNsaWRlKGQsZnVuY3Rpb24oKXthLnBvc3RTbGlkZShzKX0pOmEucG9zdFNsaWRlKHMpfX0sZS5wcm90b3R5cGUuc3RhcnRMb2FkPWZ1bmN0aW9uKCl7dmFyIGk9dGhpczshMD09PWkub3B0aW9ucy5hcnJvd3MmJmkuc2xpZGVDb3VudD5pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoaS4kcHJldkFycm93LmhpZGUoKSxpLiRuZXh0QXJyb3cuaGl
21167kZSgpKSwhMD09PWkub3B0aW9ucy5kb3RzJiZpLnNsaWRlQ291bnQ+aS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmaS4kZG90cy5oaWRlKCksaS4kc2xpZGVyLmFkZENsYXNzKFwic2xpY2stbG9hZGluZ1wiKX0sZS5wcm90b3R5cGUuc3dpcGVEaXJlY3Rpb249ZnVuY3Rpb24oKXt2YXIgaSxlLHQsbyxzPXRoaXM7cmV0dXJuIGk9cy50b3VjaE9iamVjdC5zdGFydFgtcy50b3VjaE9iamVjdC5jdXJYLGU9cy50b3VjaE9iamVjdC5zdGFydFktcy50b3VjaE9iamVjdC5jdXJZLHQ9TWF0aC5hdGFuMihlLGkpLChvPU1hdGgucm91bmQoMTgwKnQvTWF0aC5QSSkpPDAmJihvPTM2MC1NYXRoLmFicyhvKSksbzw9NDUmJm8+PTA/ITE9PT1zLm9wdGlvbnMucnRsP1wibGVmdFwiOlwicmlnaHRcIjpvPD0zNjAmJm8+PTMxNT8hMT09PXMub3B0aW9ucy5ydGw/XCJsZWZ0XCI6XCJyaWdodFwiOm8+PTEzNSYmbzw9MjI1PyExPT09cy5vcHRpb25zLnJ0bD9cInJpZ2h0XCI6XCJsZWZ0XCI6ITA9PT1zLm9wdGlvbnMudmVydGljYWxTd2lwaW5nP28+PTM1JiZvPD0xMzU/XCJkb3duXCI6XCJ1cFwiOlwidmVydGljYWxcIn0sZS5wcm90b3R5cGUuc3dpcGVFbmQ9ZnVuY3Rpb24oaSl7dmFyIGUsdCxvPXRoaXM7aWYoby5kcmFnZ2luZz0hMSxvLnN3aXBpbmc9ITEsby5zY3JvbGxpbmcpcmV0dXJuIG8uc2Nyb2xsaW5nPSExLCExO2lmKG8uaW50ZXJydXB0ZWQ9ITEsby5zaG91bGRDbGljaz0hKG8udG91Y2hPYmplY3Quc3dpcGVMZW5ndGg+MTApLHZvaWQgMD09PW8udG91Y2hPYmplY3QuY3VyWClyZXR1cm4hMTtpZighMD09PW8udG91Y2hPYmplY3QuZWRnZUhpdCYmby4kc2xpZGVyLnRyaWdnZXIoXCJlZGdlXCIsW28sby5zd2lwZURpcmVjdGlvbigpXSksby50b3VjaE9iamVjdC5zd2lwZUxlbmd0aD49by50b3VjaE9iamVjdC5taW5Td2lwZSl7c3dpdGNoKHQ9by5zd2lwZURpcmVjdGlvbigpKXtjYXNlXCJsZWZ0XCI6Y2FzZVwiZG93blwiOmU9by5vcHRpb25zLnN3aXBlVG9TbGlkZT9vLmNoZWNrTmF2aWdhYmxlKG8uY3VycmVudFNsaWRlK28uZ2V0U2xpZGVDb3VudCgpKTpvLmN1cnJlbnRTbGlkZStvLmdldFNsaWRlQ291bnQoKSxvLmN1cnJlbnREaXJlY3Rpb249MDticmVhaztjYXNlXCJyaWdodFwiOmNhc2VcInVwXCI6ZT1vLm9wdGlvbnMuc3dpcGVUb1NsaWRlP28uY2hlY2tOYXZpZ2FibGUoby5jdXJyZW50U2xpZGUtby5nZXRTbGlkZUNvdW50KCkpOm8uY3VycmVudFNsaWRlLW8uZ2V0U2xpZGVDb3VudCgpLG8uY3VycmVudERpcmVjdGlvbj0xfVwidmVydGljYWxcIiE9dCYmKG8uc2xpZGVIYW5kbGVyKGUpLG8udG91Y2hPYmplY3Q9e30sby4kc2xpZGVyLnRyaWdnZXIoXCJzd2lwZVwiLFtvLHRdKSl9ZWxzZSBvLnRvdWNoT2JqZWN0LnN0YXJ0WCE9PW8udG91Y2hPYmplY3QuY3VyWCYmKG8uc2xpZGVIYW5kbGVyKG8uY3VycmVudFNsaWRlKSxvLnRvdWNoT2JqZWN0PXt9KX0sZS5wcm90b3R5cGUuc3dpcGVIYW5kbGVyPWZ1bmN0aW9uKGkpe3ZhciBlPXRoaXM7aWYoISghMT09PWUub3B0aW9ucy5zd2lwZXx8XCJvbnRvdWNoZW5kXCJpbiBkb2N1bWVudCYmITE9PT1lLm9wdGlvbnMuc3dpcGV8fCExPT09ZS5vcHRpb25zLmRyYWdnYWJsZSYmLTEhPT1pLnR5cGUuaW5kZXhPZihcIm1vdXNlXCIpKSlzd2l0Y2goZS50b3VjaE9iamVjdC5maW5nZXJDb3VudD1pLm9yaWdpbmFsRXZlbnQmJnZvaWQgMCE9PWkub3JpZ2luYWxFdmVudC50b3VjaGVzP2kub3JpZ2luYWxFdmVudC50b3VjaGVzLmxlbmd0aDoxLGUudG91Y2hPYmplY3QubWluU3dpcGU9ZS5saXN0V2lkdGgvZS5vcHRpb25zLnRvdWNoVGhyZXNob2xkLCEwPT09ZS5vcHRpb25zLnZlcnRpY2FsU3dpcGluZyYmKGUudG91Y2hPYmplY3QubWluU3dpcGU9ZS5saXN0SGVpZ2h0L2Uub3B0aW9ucy50b3VjaFRocmVzaG9sZCksaS5kYXRhLmFjdGlvbil7Y2FzZVwic3RhcnRcIjplLnN3aXBlU3RhcnQoaSk7YnJlYWs7Y2FzZVwibW92ZVwiOmUuc3dpcGVNb3ZlKGkpO2JyZWFrO2Nhc2VcImVuZFwiOmUuc3dpcGVFbmQoaSl9fSxlLnByb3RvdHlwZS5zd2lwZU1vdmU9ZnVuY3Rpb24oaSl7dmFyIGUsdCxvLHMsbixyLGw9dGhpcztyZXR1cm4gbj12b2lkIDAhPT1pLm9yaWdpbmFsRXZlbnQ/aS5vcmlnaW5hbEV2ZW50LnRvdWNoZXM6bnVsbCwhKCFsLmRyYWdnaW5nfHxsLnNjcm9sbGluZ3x8biYmMSE9PW4ubGVuZ3RoKSYmKGU9bC5nZXRMZWZ0KGwuY3VycmVudFNsaWRlKSxsLnRvdWNoT2JqZWN0LmN1clg9dm9pZCAwIT09bj9uWzBdLnBhZ2VYOmkuY2xpZW50WCxsLnRvdWNoT2JqZWN0LmN1clk9dm9pZCAwIT09bj9uWzBdLnBhZ2VZOmkuY2xpZW50WSxsLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoPU1hdGgucm91bmQoTWF0aC5zcXJ0KE1hdGgucG93KGwudG91Y2hPYmplY3QuY3VyWC1sLnRvdWNoT2JqZWN0LnN0YXJ0WCwyKSkpLHI9TWF0aC5yb3VuZChNYXRoLnNxcnQoTWF0aC5wb3cobC50b3VjaE9iamVjdC5jdXJZLWwudG91Y2hPYmplY3Quc3RhcnRZLDIpKSksIWwub3B0aW9ucy52ZXJ0aWNhbFN3aXBpbmcmJiFsLnN3aXBpbmcmJnI+ND8obC5zY3JvbGxpbmc9ITAsITEpOighMD09PWwub3B0aW9ucy52ZXJ0aWNhbFN3aXBpbmcmJihsLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoPXIpLHQ9bC5zd2lwZURpcmVjdGlvbigpLHZvaWQgMCE9PWkub3JpZ2luYWxFdmVudCYmbC50b3VjaE9iamVjdC5zd2lwZUxlbmd0aD40JiYobC5zd2lwaW5nPSEwLGkucHJldmVudERlZmF1bHQoKSkscz0oITE9PT1sLm9wdGlvbnMucnRsPzE6LTEpKihsLnRvdWNoT2JqZWN0LmN1clg+bC50b3VjaE9iamVjdC5zdGFydFg/MTotMSksITA9PT1sLm9wdGlvbnMudmVydGljYWxTd2lwaW5nJiYocz1sLnRvdWNoT2JqZWN0LmN1clk+bC50b3VjaE9iamVjdC5zdGFydFk/MTotMSksbz1sLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoLGwudG91Y2hPYmplY3QuZWRnZUhpdD0hMSwhMT09PWwub3B0aW9ucy5pbmZpbml0ZSYmKDA9PT1sLmN1cnJlbnRTbGlkZSYmXCJyaWdodFwiPT09dHx8bC5jdXJyZW50U2xpZGU+PWwuZ2V0RG90Q291bnQoKSYmXCJsZWZ0XCI9PT10KSYmKG89bC50b3VjaE9iamVjdC5zd2lwZUxlbmd0aCpsLm9wdGlvbnMuZWRnZUZyaWN0aW9uLGwudG91Y2hPYmplY3QuZWRnZUhpdD0hMCksITE9PT1sLm9wdGlvbnMudmVydGljYWw/bC5zd2lwZUxlZnQ9ZStvKnM6bC5zd2lwZUxlZnQ9ZStvKihsLiRsaXN0LmhlaWdodCgpL2wubGlzdFdpZHRoKSpzLCEwPT09bC5vcHRpb25zLnZlcnRpY2FsU3dpcGluZyYmKGwuc3dpcGVMZWZ0PWUrbypzKSwhMCE9PWwub3B0aW9ucy5mYWRlJiYhMSE9PWwub3B0aW9ucy50b3VjaE1vdmUmJighMD09PWwuYW5pbWF0aW5nPyhsLnN3aXBlTGVmdD1udWxsLCExKTp2b2lkIGwuc2V0Q1NTKGwuc3dpcGVMZWZ0KSkpKX0sZS5wcm90b3R5cGUuc3dpcGVTdGFydD1mdW5jdGlvbihpKXt2YXIgZSx0PXRoaXM7aWYodC5pbnRlcnJ1cHRlZD0hMCwxIT09dC50b3VjaE9iamVjdC5maW5nZXJDb3VudHx8dC5zbGlkZUNvdW50PD10Lm9wdGlvbnMuc2xpZGVzVG9TaG93KXJldHVybi
21167B0LnRvdWNoT2JqZWN0PXt9LCExO3ZvaWQgMCE9PWkub3JpZ2luYWxFdmVudCYmdm9pZCAwIT09aS5vcmlnaW5hbEV2ZW50LnRvdWNoZXMmJihlPWkub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdKSx0LnRvdWNoT2JqZWN0LnN0YXJ0WD10LnRvdWNoT2JqZWN0LmN1clg9dm9pZCAwIT09ZT9lLnBhZ2VYOmkuY2xpZW50WCx0LnRvdWNoT2JqZWN0LnN0YXJ0WT10LnRvdWNoT2JqZWN0LmN1clk9dm9pZCAwIT09ZT9lLnBhZ2VZOmkuY2xpZW50WSx0LmRyYWdnaW5nPSEwfSxlLnByb3RvdHlwZS51bmZpbHRlclNsaWRlcz1lLnByb3RvdHlwZS5zbGlja1VuZmlsdGVyPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztudWxsIT09aS4kc2xpZGVzQ2FjaGUmJihpLnVubG9hZCgpLGkuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKSxpLiRzbGlkZXNDYWNoZS5hcHBlbmRUbyhpLiRzbGlkZVRyYWNrKSxpLnJlaW5pdCgpKX0sZS5wcm90b3R5cGUudW5sb2FkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpKFwiLnNsaWNrLWNsb25lZFwiLGUuJHNsaWRlcikucmVtb3ZlKCksZS4kZG90cyYmZS4kZG90cy5yZW1vdmUoKSxlLiRwcmV2QXJyb3cmJmUuaHRtbEV4cHIudGVzdChlLm9wdGlvbnMucHJldkFycm93KSYmZS4kcHJldkFycm93LnJlbW92ZSgpLGUuJG5leHRBcnJvdyYmZS5odG1sRXhwci50ZXN0KGUub3B0aW9ucy5uZXh0QXJyb3cpJiZlLiRuZXh0QXJyb3cucmVtb3ZlKCksZS4kc2xpZGVzLnJlbW92ZUNsYXNzKFwic2xpY2stc2xpZGUgc2xpY2stYWN0aXZlIHNsaWNrLXZpc2libGUgc2xpY2stY3VycmVudFwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIikuY3NzKFwid2lkdGhcIixcIlwiKX0sZS5wcm90b3R5cGUudW5zbGljaz1mdW5jdGlvbihpKXt2YXIgZT10aGlzO2UuJHNsaWRlci50cmlnZ2VyKFwidW5zbGlja1wiLFtlLGldKSxlLmRlc3Ryb3koKX0sZS5wcm90b3R5cGUudXBkYXRlQXJyb3dzPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztNYXRoLmZsb29yKGkub3B0aW9ucy5zbGlkZXNUb1Nob3cvMiksITA9PT1pLm9wdGlvbnMuYXJyb3dzJiZpLnNsaWRlQ291bnQ+aS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmIWkub3B0aW9ucy5pbmZpbml0ZSYmKGkuJHByZXZBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJmYWxzZVwiKSxpLiRuZXh0QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIiksMD09PWkuY3VycmVudFNsaWRlPyhpLiRwcmV2QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSxpLiRuZXh0QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIikpOmkuY3VycmVudFNsaWRlPj1pLnNsaWRlQ291bnQtaS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmITE9PT1pLm9wdGlvbnMuY2VudGVyTW9kZT8oaS4kbmV4dEFycm93LmFkZENsYXNzKFwic2xpY2stZGlzYWJsZWRcIikuYXR0cihcImFyaWEtZGlzYWJsZWRcIixcInRydWVcIiksaS4kcHJldkFycm93LnJlbW92ZUNsYXNzKFwic2xpY2stZGlzYWJsZWRcIikuYXR0cihcImFyaWEtZGlzYWJsZWRcIixcImZhbHNlXCIpKTppLmN1cnJlbnRTbGlkZT49aS5zbGlkZUNvdW50LTEmJiEwPT09aS5vcHRpb25zLmNlbnRlck1vZGUmJihpLiRuZXh0QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSxpLiRwcmV2QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIikpKX0sZS5wcm90b3R5cGUudXBkYXRlRG90cz1mdW5jdGlvbigpe3ZhciBpPXRoaXM7bnVsbCE9PWkuJGRvdHMmJihpLiRkb3RzLmZpbmQoXCJsaVwiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5lbmQoKSxpLiRkb3RzLmZpbmQoXCJsaVwiKS5lcShNYXRoLmZsb29yKGkuY3VycmVudFNsaWRlL2kub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCkpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpKX0sZS5wcm90b3R5cGUudmlzaWJpbGl0eT1mdW5jdGlvbigpe3ZhciBpPXRoaXM7aS5vcHRpb25zLmF1dG9wbGF5JiYoZG9jdW1lbnRbaS5oaWRkZW5dP2kuaW50ZXJydXB0ZWQ9ITA6aS5pbnRlcnJ1cHRlZD0hMSl9LGkuZm4uc2xpY2s9ZnVuY3Rpb24oKXt2YXIgaSx0LG89dGhpcyxzPWFyZ3VtZW50c1swXSxuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxyPW8ubGVuZ3RoO2ZvcihpPTA7aTxyO2krKylpZihcIm9iamVjdFwiPT10eXBlb2Ygc3x8dm9pZCAwPT09cz9vW2ldLnNsaWNrPW5ldyBlKG9baV0scyk6dD1vW2ldLnNsaWNrW3NdLmFwcGx5KG9baV0uc2xpY2ssbiksdm9pZCAwIT09dClyZXR1cm4gdDtyZXR1cm4gb319KTtcbiIsIi8qKlxuICogdmlzLmpzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYWxtZW5kZS92aXNcbiAqXG4gKiBBIGR5bmFtaWMsIGJyb3dzZXItYmFzZWQgdmlzdWFsaXphdGlvbiBsaWJyYXJ5LlxuICpcbiAqIEB2ZXJzaW9uIDQuMjAuMS1TTkFQU0hPVFxuICogQGRhdGUgICAgMjAxNy0xMC0xMlxuICpcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNyBBbG1lbmRlIEIuViwgaHR0cDovL2FsbWVuZGUuY29tXG4gKlxuICogVmlzLmpzIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgYm90aFxuICpcbiAqICogVGhlIEFwYWNoZSAyLjAgTGljZW5zZVxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBhbmRcbiAqXG4gKiAqIFRoZSBNSVQgTGljZW5zZVxuICogICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKlxuICogVmlzLmpzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBlaXRoZXIgbGljZW5zZS5cbiAqL1xuXCJ1c2Ugc3RyaWN0XCI7IWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZSk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy52aXM9ZSgpOnQudmlzPWUoKX0odGhpcyxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXtmdW5jdGlvbiBlKG8pe2lmKGlbb10pcmV0dXJuIGlbb10uZXhwb3J0czt2YXIgbj1pW29dPXtpOm8sbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gdFtvXS5jYWxsKG4uZXhwb3J0cyxuLG4uZXhwb3J0cyxlKSxuLmw9ITAsbi5leHBvcnRzfXZhciBpPXt9O3JldHVybiBlLm09dCxlLmM9aSxlLmQ9ZnVuY3Rpb24odCxpLG8pe2Uubyh0LGkpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6b30pfSxlLm49ZnVuY3Rpb24odCl7dmFyIGk9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIGUuZChpLFwiYVwiLGkpLGl9LGUubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sZS5wPVwiXCIsZShlLnM9MTIzKX0oW2Z1bmN0aW9uKHQsZSxpKXtlLl9fZXNNb2R1bGU9ITAsZS5kZWZhdWx0PWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX19LGZ1bmN0aW9uKHQsZSxpKXtlLl9fZXNNb2R1bGU9ITA7dmFyIG89aSgxNjkpLG49ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShvKTtlLmRlZmF1bHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbyYmKG8ud3JpdGFibGU9ITApLCgwLG4uZGVmYXVsdCkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1mdW5jdGlvbiBuKHQsZSxpLG8pe3ZhciBuPSExOyEwPT09byYmKG49bnVsbD09PWVbaV0mJnZvaWQgMCE9PXRbaV0pLG4/ZGVsZXRlIHRbaV06dFtpXT1lW2ldfXZhciBzPWkoNzcpLHI9byhzKSxhPWkoMjkpLGg9byhhKSxkPWkoOCksbD1vKGQpLHU9aSg2KSxjPW8odSkscD1pKDkpLGY9aSgxNTcpO2UuaXNOdW1iZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBOdW1iZXJ8fFwibnVtYmVyXCI9PXR5cGVvZiB0fSxlLnJlY3Vyc2l2ZURPTURlbGV0ZT1mdW5jdGlvbih0KXtpZih0KWZvcig7ITA9PT10Lmhhc0NoaWxkTm9kZXMoKTspZS5yZWN1cnNpdmVET01EZWxldGUodC5maXJzdENoaWxkKSx0LnJlbW92ZUNoaWxkKHQuZmlyc3RDaGlsZCl9LGUuZ2l2ZVJhbmdlPWZ1bmN0aW9uKHQsZSxpLG8pe2lmKGU9PXQpcmV0dXJuLjU7dmFyIG49MS8oZS10KTtyZXR1cm4gTWF0aC5tYXgoMCwoby10KSpuKX0sZS5pc1N0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFN0cmluZ3x8XCJzdHJpbmdcIj09dHlwZW9mIHR9LGUuaXNEYXRlPWZ1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiEwO2lmKGUuaXNTdHJpbmcodCkpe2lmKG0uZXhlYyh0KSlyZXR1cm4hMDtpZighaXNOYU4oRGF0ZS5wYXJzZSh0KSkpcmV0dXJuITB9cmV0dXJuITF9LGUucmFuZG9tVVVJRD1mdW5jdGlvbigpe3JldHVybiBmLnY0KCl9LGUuYXNzaWduQWxsS2V5cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaSBpbiB0KXQuaGFzT3duUHJvcGVydHkoaSkmJlwib2JqZWN0XCIhPT0oMCxjLmRlZmF1bHQpKHRbaV0pJiYodFtpXT1lKX0sZS5maWxsSWZEZWZpbmVkPWZ1bmN0aW9uKHQsaSl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXTtmb3IodmFyIHMgaW4gdCl2b2lkIDAhPT1pW3NdJiYobnVsbD09PWlbc118fFwib2JqZWN0XCIhPT0oMCxjLmRlZmF1bHQpKGlbc10pP24odCxpLHMsbyk6XCJvYmplY3RcIj09PSgwLGMuZGVmYXVsdCkodFtzXSkmJmUuZmlsbElmRGVmaW5lZCh0W3NdLGlbc10sbykpfSxlLmV4dGVuZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBvPWFyZ3VtZW50c1tpXTtmb3IodmFyIG4gaW4gbylvLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1vW25dKX1yZXR1cm4gdH0sZS5zZWxlY3RpdmVFeHRlbmQ9ZnVuY3Rpb24odCxlLGkpe2lmKCFBcnJheS5pc0FycmF
211675KHQpKXRocm93IG5ldyBFcnJvcihcIkFycmF5IHdpdGggcHJvcGVydHkgbmFtZXMgZXhwZWN0ZWQgYXMgZmlyc3QgYXJndW1lbnRcIik7Zm9yKHZhciBvPTI7bzxhcmd1bWVudHMubGVuZ3RoO28rKylmb3IodmFyIG49YXJndW1lbnRzW29dLHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIHI9dFtzXTtuJiZuLmhhc093blByb3BlcnR5KHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sZS5zZWxlY3RpdmVEZWVwRXh0ZW5kPWZ1bmN0aW9uKHQsaSxvKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSYmYXJndW1lbnRzWzNdO2lmKEFycmF5LmlzQXJyYXkobykpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCBieSBkZWVwRXh0ZW5kXCIpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgYT10W3JdO2lmKG8uaGFzT3duUHJvcGVydHkoYSkpaWYob1thXSYmb1thXS5jb25zdHJ1Y3Rvcj09PU9iamVjdCl2b2lkIDA9PT1pW2FdJiYoaVthXT17fSksaVthXS5jb25zdHJ1Y3Rvcj09PU9iamVjdD9lLmRlZXBFeHRlbmQoaVthXSxvW2FdLCExLHMpOm4oaSxvLGEscyk7ZWxzZXtpZihBcnJheS5pc0FycmF5KG9bYV0pKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgZGVlcEV4dGVuZFwiKTtuKGksbyxhLHMpfX1yZXR1cm4gaX0sZS5zZWxlY3RpdmVOb3REZWVwRXh0ZW5kPWZ1bmN0aW9uKHQsaSxvKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSYmYXJndW1lbnRzWzNdO2lmKEFycmF5LmlzQXJyYXkobykpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCBieSBkZWVwRXh0ZW5kXCIpO2Zvcih2YXIgciBpbiBvKWlmKG8uaGFzT3duUHJvcGVydHkocikmJi0xPT09dC5pbmRleE9mKHIpKWlmKG9bcl0mJm9bcl0uY29uc3RydWN0b3I9PT1PYmplY3Qpdm9pZCAwPT09aVtyXSYmKGlbcl09e30pLGlbcl0uY29uc3RydWN0b3I9PT1PYmplY3Q/ZS5kZWVwRXh0ZW5kKGlbcl0sb1tyXSk6bihpLG8scixzKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkob1tyXSkpe2lbcl09W107Zm9yKHZhciBhPTA7YTxvW3JdLmxlbmd0aDthKyspaVtyXS5wdXNoKG9bcl1bYV0pfWVsc2UgbihpLG8scixzKTtyZXR1cm4gaX0sZS5kZWVwRXh0ZW5kPWZ1bmN0aW9uKHQsaSl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXSxzPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdJiZhcmd1bWVudHNbM107Zm9yKHZhciByIGluIGkpaWYoaS5oYXNPd25Qcm9wZXJ0eShyKXx8ITA9PT1vKWlmKGlbcl0mJmlbcl0uY29uc3RydWN0b3I9PT1PYmplY3Qpdm9pZCAwPT09dFtyXSYmKHRbcl09e30pLHRbcl0uY29uc3RydWN0b3I9PT1PYmplY3Q/ZS5kZWVwRXh0ZW5kKHRbcl0saVtyXSxvKTpuKHQsaSxyLHMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShpW3JdKSl7dFtyXT1bXTtmb3IodmFyIGE9MDthPGlbcl0ubGVuZ3RoO2ErKyl0W3JdLnB1c2goaVtyXVthXSl9ZWxzZSBuKHQsaSxyLHMpO3JldHVybiB0fSxlLmVxdWFsQXJyYXk9ZnVuY3Rpb24odCxlKXtpZih0Lmxlbmd0aCE9ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBpPTAsbz10Lmxlbmd0aDtpPG87aSsrKWlmKHRbaV0hPWVbaV0pcmV0dXJuITE7cmV0dXJuITB9LGUuY29udmVydD1mdW5jdGlvbih0LGkpe3ZhciBvO2lmKHZvaWQgMCE9PXQpe2lmKG51bGw9PT10KXJldHVybiBudWxsO2lmKCFpKXJldHVybiB0O2lmKFwic3RyaW5nXCIhPXR5cGVvZiBpJiYhKGkgaW5zdGFuY2VvZiBTdHJpbmcpKXRocm93IG5ldyBFcnJvcihcIlR5cGUgbXVzdCBiZSBhIHN0cmluZ1wiKTtzd2l0Y2goaSl7Y2FzZVwiYm9vbGVhblwiOmNhc2VcIkJvb2xlYW5cIjpyZXR1cm4gQm9vbGVhbih0KTtjYXNlXCJudW1iZXJcIjpjYXNlXCJOdW1iZXJcIjpyZXR1cm4gZS5pc1N0cmluZyh0KSYmIWlzTmFOKERhdGUucGFyc2UodCkpP3AodCkudmFsdWVPZigpOk51bWJlcih0LnZhbHVlT2YoKSk7Y2FzZVwic3RyaW5nXCI6Y2FzZVwiU3RyaW5nXCI6cmV0dXJuIFN0cmluZyh0KTtjYXNlXCJEYXRlXCI6aWYoZS5pc051bWJlcih0KSlyZXR1cm4gbmV3IERhdGUodCk7aWYodCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIG5ldyBEYXRlKHQudmFsdWVPZigpKTtpZihwLmlzTW9tZW50KHQpKXJldHVybiBuZXcgRGF0ZSh0LnZhbHVlT2YoKSk7aWYoZS5pc1N0cmluZyh0KSlyZXR1cm4gbz1tLmV4ZWModCksbz9uZXcgRGF0ZShOdW1iZXIob1sxXSkpOnAobmV3IERhdGUodCkpLnRvRGF0ZSgpO3Rocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb252ZXJ0IG9iamVjdCBvZiB0eXBlIFwiK2UuZ2V0VHlwZSh0KStcIiB0byB0eXBlIERhdGVcIik7Y2FzZVwiTW9tZW50XCI6aWYoZS5pc051bWJlcih0KSlyZXR1cm4gcCh0KTtpZih0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gcCh0LnZhbHVlT2YoKSk7aWYocC5pc01vbWVudCh0KSlyZXR1cm4gcCh0KTtpZihlLmlzU3RyaW5nKHQpKXJldHVybiBvPW0uZXhlYyh0KSxwKG8/TnVtYmVyKG9bMV0pOnQpO3Rocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb252ZXJ0IG9iamVjdCBvZiB0eXBlIFwiK2UuZ2V0VHlwZSh0KStcIiB0byB0eXBlIERhdGVcIik7Y2FzZVwiSVNPRGF0ZVwiOmlmKGUuaXNOdW1iZXIodCkpcmV0dXJuIG5ldyBEYXRlKHQpO2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybi
21167B0LnRvSVNPU3RyaW5nKCk7aWYocC5pc01vbWVudCh0KSlyZXR1cm4gdC50b0RhdGUoKS50b0lTT1N0cmluZygpO2lmKGUuaXNTdHJpbmcodCkpcmV0dXJuIG89bS5leGVjKHQpLG8/bmV3IERhdGUoTnVtYmVyKG9bMV0pKS50b0lTT1N0cmluZygpOnAodCkuZm9ybWF0KCk7dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbnZlcnQgb2JqZWN0IG9mIHR5cGUgXCIrZS5nZXRUeXBlKHQpK1wiIHRvIHR5cGUgSVNPRGF0ZVwiKTtjYXNlXCJBU1BEYXRlXCI6aWYoZS5pc051bWJlcih0KSlyZXR1cm5cIi9EYXRlKFwiK3QrXCIpL1wiO2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVyblwiL0RhdGUoXCIrdC52YWx1ZU9mKCkrXCIpL1wiO2lmKGUuaXNTdHJpbmcodCkpe289bS5leGVjKHQpO3JldHVyblwiL0RhdGUoXCIrKG8/bmV3IERhdGUoTnVtYmVyKG9bMV0pKS52YWx1ZU9mKCk6bmV3IERhdGUodCkudmFsdWVPZigpKStcIikvXCJ9dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbnZlcnQgb2JqZWN0IG9mIHR5cGUgXCIrZS5nZXRUeXBlKHQpK1wiIHRvIHR5cGUgQVNQRGF0ZVwiKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcignVW5rbm93biB0eXBlIFwiJytpKydcIicpfX19O3ZhciBtPS9eXFwvP0RhdGVcXCgoXFwtP1xcZCspL2k7ZS5nZXRUeXBlPWZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMD09PXQ/XCJ1bmRlZmluZWRcIjooMCxjLmRlZmF1bHQpKHQpO3JldHVyblwib2JqZWN0XCI9PWU/bnVsbD09PXQ/XCJudWxsXCI6dCBpbnN0YW5jZW9mIEJvb2xlYW4/XCJCb29sZWFuXCI6dCBpbnN0YW5jZW9mIE51bWJlcj9cIk51bWJlclwiOnQgaW5zdGFuY2VvZiBTdHJpbmc/XCJTdHJpbmdcIjpBcnJheS5pc0FycmF5KHQpP1wiQXJyYXlcIjp0IGluc3RhbmNlb2YgRGF0ZT9cIkRhdGVcIjpcIk9iamVjdFwiOlwibnVtYmVyXCI9PWU/XCJOdW1iZXJcIjpcImJvb2xlYW5cIj09ZT9cIkJvb2xlYW5cIjpcInN0cmluZ1wiPT1lP1wiU3RyaW5nXCI6dm9pZCAwPT09ZT9cInVuZGVmaW5lZFwiOmV9LGUuY29weUFuZEV4dGVuZEFycmF5PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPVtdLG89MDtvPHQubGVuZ3RoO28rKylpLnB1c2godFtvXSk7cmV0dXJuIGkucHVzaChlKSxpfSxlLmNvcHlBcnJheT1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0wO2k8dC5sZW5ndGg7aSsrKWUucHVzaCh0W2ldKTtyZXR1cm4gZX0sZS5nZXRBYnNvbHV0ZUxlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0sZS5nZXRBYnNvbHV0ZVJpZ2h0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0fSxlLmdldEFic29sdXRlVG9wPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcH0sZS5hZGRDbGFzc05hbWU9ZnVuY3Rpb24odCxlKXt2YXIgaT10LmNsYXNzTmFtZS5zcGxpdChcIiBcIiksbz1lLnNwbGl0KFwiIFwiKTtpPWkuY29uY2F0KG8uZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBpLmluZGV4T2YodCk8MH0pKSx0LmNsYXNzTmFtZT1pLmpvaW4oXCIgXCIpfSxlLnJlbW92ZUNsYXNzTmFtZT1mdW5jdGlvbih0LGUpe3ZhciBpPXQuY2xhc3NOYW1lLnNwbGl0KFwiIFwiKSxvPWUuc3BsaXQoXCIgXCIpO2k9aS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIG8uaW5kZXhPZih0KTwwfSksdC5jbGFzc05hbWU9aS5qb2luKFwiIFwiKX0sZS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7dmFyIGksbztpZihBcnJheS5pc0FycmF5KHQpKWZvcihpPTAsbz10Lmxlbmd0aDtpPG87aSsrKWUodFtpXSxpLHQpO2Vsc2UgZm9yKGkgaW4gdCl0Lmhhc093blByb3BlcnR5KGkpJiZlKHRbaV0saSx0KX0sZS50b0FycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgaSBpbiB0KXQuaGFzT3duUHJvcGVydHkoaSkmJmUucHVzaCh0W2ldKTtyZXR1cm4gZX0sZS51cGRhdGVQcm9wZXJ0eT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRbZV0hPT1pJiYodFtlXT1pLCEwKX0sZS50aHJvdHRsZT1mdW5jdGlvbih0KXt2YXIgZT0hMTtyZXR1cm4gZnVuY3Rpb24oKXtlfHwoZT0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtlPSExLHQoKX0pKX19LGUuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbih0LGUsaSxvKXt0LmFkZEV2ZW50TGlzdGVuZXI/KHZvaWQgMD09PW8mJihvPSExKSxcIm1vdXNld2hlZWxcIj09PWUmJm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIkZpcmVmb3hcIik+PTAmJihlPVwiRE9NTW91c2VTY3JvbGxcIiksdC5hZGRFdmVudExpc3RlbmVyKGUsaSxvKSk6dC5hdHRhY2hFdmVudChcIm9uXCIrZSxpKX0sZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSxpLG8pe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcj8odm9pZCAwPT09byYmKG89ITEpLFwibW91c2V3aGVlbFwiPT09ZSYmbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwiRmlyZWZveFwiKT49MCYmKGU9XCJET01Nb3VzZVNjcm9sbFwiKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxpLG8pKTp0LmRldGFjaEV2ZW50KFwib25cIitlLGkpfSxlLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKHQpe3R8fCh0PXdpbmRvdy5ldmVudCksdC5wcmV2ZW50RGVmYXVsdD90LnByZXZlbnREZWZhdWx0KCk6dC5yZXR1cm5WYWx1ZT0hMX0sZS5nZXRUYXJnZXQ9ZnVuY3Rpb24odCl7dHx8KHQ9d2luZG93LmV2ZW50KTt2YXIgZTtyZXR1cm4gdC50YXJnZXQ/ZT10LnRhcmdldDp0LnNyY0VsZW1lbnQmJihlPXQuc3JjRWxlbWVudCksdm9pZCAwIT1lLm5vZGVUeXBlJiYzPT1lLm5vZGVUeXBlJiYoZT1lLnBhcmVudE5vZGUpLGV9LGUuaGFzUGFyZW50PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXQ7aTspe2lmKGk9PT1lKXJldHVybiEwO2k9aS5wYXJlbnROb2RlfXJldHVybiExfSxlLm9wdGlvbj17fSxlLm9wdGlvbi5hc0Jvb2xlYW49ZnVuY3Rpb24odCxlKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0JiYodD10KCkpLG51bGwhPXQ/MCE9dDplfHxudWxsfSxlLm9wdGlvbi5hc051bWJlcj1mdW5jdGlvbih0LGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJih0PXQoKSksbnVsbCE9dD9OdW1iZXIodCl8fGV8fG51bGw6ZXx8bnVsbH0sZS5vcHRpb24uYXNTdHJpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0JiYodD10KCkpLG51bGwhPXQ/U3RyaW5nKHQpOmV8fG51bGx9LGUub3B0aW9uLmFzU2l6ZT1mdW5jdGlvbih0LGkpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJih0PXQoKSksZS5pc1N0cmluZyh0KT90OmUuaXNOdW1iZXIodCk/dCtcInB4XCI6aXx8bnVsbH0sZS5vcHRpb24uYXNFbGVtZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdCYmKHQ9dCgpKSx0fHxlfHxudWxsfSxlLmhleFRvUkdCPWZ1bmN0aW9uKHQpe3ZhciBlPS9eIz8oW2EtZlxcZF0pKFthLWZcXGRdKShbYS1mXFxkXSkkL2k7dD10LnJlcGxhY2UoZSxmdW5jdGlvbih0LGUsaSxvKXtyZXR1cm4gZStlK2kraStvK299KTt2YXIgaT0vXiM/KFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pJC9pLmV4ZWModCk7cmV0dXJuIGk/e3I6cGFyc2VJbnQoaVsxXSwxNiksZzpwYXJzZUludChpWzJdLDE2KSxiOnBhcnNlSW50KGlbM10sMTYpfTpudWxsfSxlLm92ZXJyaWRlT3BhY2l0eT1mdW5jdGlvbih0LGkpe3ZhciBvO3JldHVybi0xIT10LmluZGV4T2YoXCJyZ2JhXCIpP3Q6LTEhPXQuaW5kZXhPZihcInJnYlwiKT8obz10LnN1YnN0cih0LmluZGV4T2YoXCIoXCIpKzEpLnJlcGxhY2UoXCIpXCIsXCJcIikuc3BsaXQoXCIsXCIpLFwicmdiYShcIitvWzBdK1wiLFwiK29bMV0rXCIsXCIrb1syXStcIixcIitpK1wiKVwiKToobz1lLmhleFRvUkdCKHQpLG51bGw9PW8/dDpcInJnYmEoXCIrby5yK1wiLFwiK28uZytcIixcIitvLmIrXCIsXCIraStcIilcIil9LGUuUkdCVG9IZXg9ZnVuY3Rpb24odCxlLGkpe3JldHVyblwiI1wiKygoMTw8MjQpKyh0PDwxNikrKGU8PDgpK2kpLnRvU3RyaW5nKDE2KS5zbGljZSgxKX0sZS5wYXJzZUNvbG9yPWZ1bmN0aW9uKHQpe3ZhciBpO2lmKCEwPT09ZS5pc1N0cmluZyh0KSl7aWYoITA9PT1lLmlzVmFsaWRSR0IodCkpe3ZhciBvPXQuc3Vic3RyKDQpLnN1YnN0cigwLHQubGVuZ3RoLTUpLnNwbGl0KFwiLFwiKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlSW50KHQpfSk7dD1lLlJHQlRvSGV4KG9bMF0sb1sxXSxvWzJdKX1pZighMD09PWUuaXNWYWxpZEhleCh0KSl7dmFyIG49ZS5oZXhUb0hTVih0KSxzPXtoOm4uaCxzOi44Km4ucyx2Ok1hdGgubWluKDEsMS4wMipuLnYpfSxyPXtoOm4uaCxzOk1hdGgubWluKDEsMS4yNSpuLnMpLHY6Ljgqbi52fSxhPWUuSFNWVG9IZXgoci5oLHIucyxyLnYpLGg9ZS5IU1ZUb0hleChzLmgscy5zLHMudik7aT17YmFja2dyb3VuZDp0LGJvcmRlcjphLGhpZ2hsaWdodDp7YmFja2dyb3VuZDpoLGJvcmRlcjphfSxob3Zlcjp7YmFja2dyb3VuZDpoLGJvcmRlcjphfX19ZWxzZSBpPXtiYWNrZ3JvdW5kOnQsYm9yZGVyOnQsaGlnaGxpZ2h0OntiYWNrZ3JvdW5kOnQsYm9yZGVyOnR9LGhvdmVyOntiYWNrZ3JvdW5kOnQsYm9yZGVyOnR9fX1lbHNlIGk9e30saS5iYWNrZ3JvdW5kPXQuYmFja2dyb3VuZHx8dm9pZCAwLGkuYm9yZGVyPXQuYm9yZGVyfHx2b2lkIDAsZS5pc1N0cmluZyh0LmhpZ2hsaWdodCk/aS5oaWdobGlnaHQ9e2JvcmRlcjp0LmhpZ2hsaWdodCxiYWNrZ3JvdW5kOnQuaGlnaGxpZ2h0fTooaS5oaWdobGlnaHQ9e30saS5oaWdobGlnaHQuYmFja2dyb3VuZD10LmhpZ2hsaWdodCYmdC5oaWdobGlnaHQuYmFja2dyb3VuZHx8dm9pZCAwLGkuaGlnaGxpZ2h0LmJvcmRlcj10LmhpZ2hsaWdodCYmdC5oaWdobGlnaHQuYm9yZGVyfHx2b2lkIDApLGUuaXNTdHJpbmcodC5
21167ob3Zlcik/aS5ob3Zlcj17Ym9yZGVyOnQuaG92ZXIsYmFja2dyb3VuZDp0LmhvdmVyfTooaS5ob3Zlcj17fSxpLmhvdmVyLmJhY2tncm91bmQ9dC5ob3ZlciYmdC5ob3Zlci5iYWNrZ3JvdW5kfHx2b2lkIDAsaS5ob3Zlci5ib3JkZXI9dC5ob3ZlciYmdC5ob3Zlci5ib3JkZXJ8fHZvaWQgMCk7cmV0dXJuIGl9LGUuUkdCVG9IU1Y9ZnVuY3Rpb24odCxlLGkpe3QvPTI1NSxlLz0yNTUsaS89MjU1O3ZhciBvPU1hdGgubWluKHQsTWF0aC5taW4oZSxpKSksbj1NYXRoLm1heCh0LE1hdGgubWF4KGUsaSkpO2lmKG89PW4pcmV0dXJue2g6MCxzOjAsdjpvfTt2YXIgcz10PT1vP2UtaTppPT1vP3QtZTppLXQ7cmV0dXJue2g6NjAqKCh0PT1vPzM6aT09bz8xOjUpLXMvKG4tbykpLzM2MCxzOihuLW8pL24sdjpufX07dmFyIHY9e3NwbGl0OmZ1bmN0aW9uKHQpe3ZhciBlPXt9O3JldHVybiB0LnNwbGl0KFwiO1wiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKFwiXCIhPXQudHJpbSgpKXt2YXIgaT10LnNwbGl0KFwiOlwiKSxvPWlbMF0udHJpbSgpLG49aVsxXS50cmltKCk7ZVtvXT1ufX0pLGV9LGpvaW46ZnVuY3Rpb24odCl7cmV0dXJuKDAsbC5kZWZhdWx0KSh0KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUrXCI6IFwiK3RbZV19KS5qb2luKFwiOyBcIil9fTtlLmFkZENzc1RleHQ9ZnVuY3Rpb24odCxpKXt2YXIgbz12LnNwbGl0KHQuc3R5bGUuY3NzVGV4dCksbj12LnNwbGl0KGkpLHM9ZS5leHRlbmQobyxuKTt0LnN0eWxlLmNzc1RleHQ9di5qb2luKHMpfSxlLnJlbW92ZUNzc1RleHQ9ZnVuY3Rpb24odCxlKXt2YXIgaT12LnNwbGl0KHQuc3R5bGUuY3NzVGV4dCksbz12LnNwbGl0KGUpO2Zvcih2YXIgbiBpbiBvKW8uaGFzT3duUHJvcGVydHkobikmJmRlbGV0ZSBpW25dO3Quc3R5bGUuY3NzVGV4dD12LmpvaW4oaSl9LGUuSFNWVG9SR0I9ZnVuY3Rpb24odCxlLGkpe3ZhciBvLG4scyxyPU1hdGguZmxvb3IoNip0KSxhPTYqdC1yLGg9aSooMS1lKSxkPWkqKDEtYSplKSxsPWkqKDEtKDEtYSkqZSk7c3dpdGNoKHIlNil7Y2FzZSAwOm89aSxuPWwscz1oO2JyZWFrO2Nhc2UgMTpvPWQsbj1pLHM9aDticmVhaztjYXNlIDI6bz1oLG49aSxzPWw7YnJlYWs7Y2FzZSAzOm89aCxuPWQscz1pO2JyZWFrO2Nhc2UgNDpvPWwsbj1oLHM9aTticmVhaztjYXNlIDU6bz1pLG49aCxzPWR9cmV0dXJue3I6TWF0aC5mbG9vcigyNTUqbyksZzpNYXRoLmZsb29yKDI1NSpuKSxiOk1hdGguZmxvb3IoMjU1KnMpfX0sZS5IU1ZUb0hleD1mdW5jdGlvbih0LGksbyl7dmFyIG49ZS5IU1ZUb1JHQih0LGksbyk7cmV0dXJuIGUuUkdCVG9IZXgobi5yLG4uZyxuLmIpfSxlLmhleFRv
21167SFNWPWZ1bmN0aW9uKHQpe3ZhciBpPWUuaGV4VG9SR0IodCk7cmV0dXJuIGUuUkdCVG9IU1YoaS5yLGkuZyxpLmIpfSxlLmlzVmFsaWRIZXg9ZnVuY3Rpb24odCl7cmV0dXJuLyheI1swLTlBLUZdezZ9JCl8KF4jWzAtOUEtRl17M30kKS9pLnRlc3QodCl9LGUuaXNWYWxpZFJHQj1mdW5jdGlvbih0KXtyZXR1cm4gdD10LnJlcGxhY2UoXCIgXCIsXCJcIiksL3JnYlxcKChcXGR7MSwzfSksKFxcZHsxLDN9KSwoXFxkezEsM30pXFwpL2kudGVzdCh0KX0sZS5pc1ZhbGlkUkdCQT1mdW5jdGlvbih0KXtyZXR1cm4gdD10LnJlcGxhY2UoXCIgXCIsXCJcIiksL3JnYmFcXCgoXFxkezEsM30pLChcXGR7MSwzfSksKFxcZHsxLDN9KSwoLnsxLDN9KVxcKS9pLnRlc3QodCl9LGUuc2VsZWN0aXZlQnJpZGdlT2JqZWN0PWZ1bmN0aW9uKHQsaSl7aWYobnVsbCE9PWkmJlwib2JqZWN0XCI9PT0odm9pZCAwPT09aT9cInVuZGVmaW5lZFwiOigwLGMuZGVmYXVsdCkoaSkpKXtmb3IodmFyIG89KDAsaC5kZWZhdWx0KShpKSxuPTA7bjx0Lmxlbmd0aDtuKyspaS5oYXNPd25Qcm9wZXJ0eSh0W25dKSYmXCJvYmplY3RcIj09KDAsYy5kZWZhdWx0KShpW3Rbbl1dKSYmKG9bdFtuXV09ZS5icmlkZ2VPYmplY3QoaVt0W25dXSkpO3JldHVybiBvfXJldHVybiBudWxsfSxlLmJyaWRnZU9iamVjdD1mdW5jdGlvbih0KXtpZihudWxsIT09dCYmXCJvYmplY3RcIj09PSh2b2lkIDA9PT10P1widW5kZWZpbmVkXCI6KDAsYy5kZWZhdWx0KSh0KSkpe3ZhciBpPSgwLGguZGVmYXVsdCkodCk7aWYodCBpbnN0YW5jZW9mIEVsZW1lbnQpaT10O2Vsc2V7aT0oMCxoLmRlZmF1bHQpKHQpO2Zvcih2YXIgbyBpbiB0KXQuaGFzT3duUHJvcGVydHkobykmJlwib2JqZWN0XCI9PSgwLGMuZGVmYXVsdCkodFtvXSkmJihpW29dPWUuYnJpZGdlT2JqZWN0KHRbb10pKX1yZXR1cm4gaX1yZXR1cm4gbnVsbH0sZS5pbnNlcnRTb3J0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspe2Zvcih2YXIgbz10W2ldLG49aTtuPjAmJmUobyx0W24tMV0pPDA7bi0tKXRbbl09dFtuLTFdO3Rbbl09b31yZXR1cm4gdH0sZS5tZXJnZU9wdGlvbnM9ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fSxuPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dCYmdm9pZCAwIT09dH0scz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PXQmJlwib2JqZWN0XCI9PT0odm9pZCAwPT09dD9cInVuZGVmaW5lZFwiOigwLGMuZGVmYXVsdCkodCkpfTtpZighcyh0KSl0aHJvdyBuZXcgRXJyb3IoXCJQYXJhbWV0ZXIgbWVyZ2VUYXJnZXQgbXVzdCBiZSBhbiBvYmplY3RcIik7aWYoIXMoZSkpdGhyb3cgbmV3IEVycm9yKFwiUGFyYW1ldGVyIG9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3RcIik7aWYoIW4oaSkpdGhyb3cgbmV3IEVycm9yKFwiUGFyYW1ldGVyIG9wdGlvbiBtdXN0IGhhdmUgYSB2YWx1ZVwiKTtpZighcyhvKSl0aHJvdyBuZXcgRXJyb3IoXCJQYXJhbWV0ZXIgZ2xvYmFsT3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdFwiKTt2YXIgcj1lW2ldLGE9cyhvKSYmIWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuITE7cmV0dXJuITB9KG8pLGQ9YT9vW2ldOnZvaWQgMCxsPWQ/ZC5lbmFibGVkOnZvaWQgMDtpZih2b2lkIDAhPT1yKXtpZihcImJvb2xlYW5cIj09dHlwZW9mIHIpcmV0dXJuIHModFtpXSl8fCh0W2ldPXt9KSx2b2lkKHRbaV0uZW5hYmxlZD1yKTtpZihudWxsPT09ciYmIXModFtpXSkpe2lmKCFuKGQpKXJldHVybjt0W2ldPSgwLGguZGVmYXVsdCkoZCl9aWYocyhyKSl7dmFyIHU9ITA7dm9pZCAwIT09ci5lbmFibGVkP3U9ci5lbmFibGVkOnZvaWQgMCE9PWwmJih1PWQuZW5hYmxlZCksZnVuY3Rpb24odCxlLGkpe3ModFtpXSl8fCh0W2ldPXt9KTt2YXIgbz1lW2ldLG49dFtpXTtmb3IodmFyIHIgaW4gbylvLmhhc093blByb3BlcnR5KHIpJiYobltyXT1vW3JdKX0odCxlLGkpLHRbaV0uZW5hYmxlZD11fX19LGUuYmluYXJ5U2VhcmNoQ3VzdG9tPWZ1bmN0aW9uKHQsZSxpLG8pe2Zvcih2YXIgbj0wLHM9MCxyPXQubGVuZ3RoLTE7czw9ciYmbjwxZTQ7KXt2YXIgYT1NYXRoLmZsb29yKChzK3IpLzIpLGg9dFthXSxkPXZvaWQgMD09PW8/aFtpXTpoW2ldW29dLGw9ZShkKTtpZigwPT1sKXJldHVybiBhOy0xPT1sP3M9YSsxOnI9YS0xLG4rK31yZXR1cm4tMX0sZS5iaW5hcnlTZWFyY2hWYWx1ZT1mdW5jdGlvbih0LGUsaSxvLG4pe3ZhciBzLHIsYSxoLGQ9MCxsPTAsdT10Lmxlbmd0aC0xO2ZvcihuPXZvaWQgMCE9bj9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PWU/MDp0PGU/LTE6MX07bDw9dSYmZDwxZTQ7KXtpZihoPU1hdGguZmxvb3IoLjUqKHUrbCkpLHM9dFtNYXRoLm1heCgwLGgtMSldW2ldLHI9dFtoXVtpXSxhPXRbTWF0aC5taW4odC5sZW5ndGgtMSxoKzEpXVtpXSwwPT1uKHIsZSkpcmV0dXJuIGg7aWYobihzLGUpPDAmJm4ocixlKT4wKXJldHVyblwiYmVmb3JlXCI9PW8/TWF0aC5tYXgoMCxoLTEpOmg7aWYobihyLGUpPDAmJm4oYSxlKT4wKXJldHVyblwiYmVmb3JlXCI9PW8/aDpNYXRoLm1pbih0Lmxlbmd0aC0xLGgrMSk7bihyLGUpPDA/bD1oKzE6dT1oLTEsZCsrfXJldHVybi0xfSxlLmVhc2luZ0Z1bmN0aW9ucz17bGluZWFyOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxlYXNlSW5RdWFkOmZ1bmN0aW9uKHQpe3JldHVybiB0KnR9LGVhc2VPdXRRdWFkOmZ1bmN0aW9uKHQpe3JldHVybiB0KigyLXQpfSxlYXNlSW5PdXRRdWFkOmZ1bmN0aW9uKHQpe3JldHVybiB0PC41PzIqdCp0Oig0LTIqdCkqdC0xfSxlYXNlSW5DdWJpYzpmdW5jdGlvbih0KXtyZXR1cm4gdCp0KnR9LGVhc2VPdXRDdWJpYzpmdW5jdGlvbih0KXtyZXR1cm4tLXQqdCp0KzF9LGVhc2VJbk91dEN1YmljOmZ1bmN0aW9uKHQpe3JldHVybiB0PC41PzQqdCp0KnQ6KHQtMSkqKDIqdC0yKSooMip0LTIpKzF9LGVhc2VJblF1YXJ0OmZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdCp0fSxlYXNlT3V0UXVhcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIDEtIC0tdCp0KnQqdH0sZWFzZUluT3V0UXVhcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ8LjU/OCp0KnQqdCp0OjEtOCotLXQqdCp0KnR9LGVhc2VJblF1aW50OmZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdCp0KnR9LGVhc2VPdXRRdWludDpmdW5jdGlvbih0KXtyZXR1cm4gMSstLXQqdCp0KnQqdH0sZWFzZUluT3V0UXVpbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ8LjU/MTYqdCp0KnQqdCp0OjErMTYqLS10KnQqdCp0KnR9fSxlLmdldFNjcm9sbEJhcldpZHRoPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7dC5zdHlsZS53aWR0aD1cIjEwMCVcIix0LnN0eWxlLmhlaWdodD1cIjIwMHB4XCI7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtlLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIixlLnN0eWxlLnRvcD1cIjBweFwiLGUuc3R5bGUubGVmdD1cIjBweFwiLGUuc3R5bGUudmlzaWJpbGl0eT1cImhpZGRlblwiLGUuc3R5bGUud2lkdGg9XCIyMDBweFwiLGUuc3R5bGUuaGVpZ2h0PVwiMTUwcHhcIixlLnN0eWxlLm92ZXJmbG93PVwiaGlkZGVuXCIsZS
211675hcHBlbmRDaGlsZCh0KSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO3ZhciBpPXQub2Zmc2V0V2lkdGg7ZS5zdHlsZS5vdmVyZmxvdz1cInNjcm9sbFwiO3ZhciBvPXQub2Zmc2V0V2lkdGg7cmV0dXJuIGk9PW8mJihvPWUuY2xpZW50V2lkdGgpLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSksaS1vfSxlLnRvcE1vc3Q9ZnVuY3Rpb24odCxlKXt2YXIgaT12b2lkIDA7QXJyYXkuaXNBcnJheShlKXx8KGU9W2VdKTt2YXIgbz0hMCxuPSExLHM9dm9pZCAwO3RyeXtmb3IodmFyIGEsaD0oMCxyLmRlZmF1bHQpKHQpOyEobz0oYT1oLm5leHQoKSkuZG9uZSk7bz0hMCl7dmFyIGQ9YS52YWx1ZTtpZihkKXtpPWRbZVswXV07Zm9yKHZhciBsPTE7bDxlLmxlbmd0aDtsKyspaSYmKGk9aVtlW2xdXSk7aWYodm9pZCAwIT09aSlicmVha319fWNhdGNoKHQpe249ITAscz10fWZpbmFsbHl7dHJ5eyFvJiZoLnJldHVybiYmaC5yZXR1cm4oKX1maW5hbGx5e2lmKG4pdGhyb3cgc319cmV0dXJuIGl9fSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPXtkZWZhdWx0OmkoMTk0KSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24odCxlLGkpe2UuX19lc01vZHVsZT0hMDt2YXIgbz1pKDYpLG49ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShvKTtlLmRlZmF1bHQ9ZnVuY3Rpb24odCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIWV8fFwib2JqZWN0XCIhPT0odm9pZCAwPT09ZT9cInVuZGVmaW5lZFwiOigwLG4uZGVmYXVsdCkoZSkpJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBlP3Q6ZX19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1lLl9fZXNNb2R1bGU9ITA7dmFyIG49aSgxOTYpLHM9byhuKSxyPWkoMjkpLGE9byhyKSxoPWkoNiksZD1vKGgpO2UuZGVmYXVsdD1mdW5jdGlvbih0LGUpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiKyh2b2lkIDA9PT1lP1widW5kZWZpbmVkXCI6KDAsZC5kZWZhdWx0KShlKSkpO3QucHJvdG90eXBlPSgwLGEuZGVmYXVsdCkoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihzLmRlZmF1bHQ/KDAscy5kZWZhdWx0KSh0LGUpOnQuX19wcm90b19fPWUpfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWUuX19lc01vZHVsZT0hMDt2YXIgbj1pKDE0Mikscz1vKG4pLHI9aSgxNDQpLGE9byhyKSxoPVwiZnVuY3Rpb25cIj09dHlwZW9mIGEuZGVmYXVsdCYmXCJzeW1ib2xcIj09dHlwZW9mIHMuZGVmYXVsdD9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLmRlZmF1bHQmJnQuY29uc3RydWN0b3I9PT1hLmRlZmF1bHQmJnQhPT1hLmRlZmF1bHQucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9O2UuZGVmYXVsdD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBhLmRlZmF1bHQmJlwic3ltYm9sXCI9PT1oKHMuZGVmYXVsdCk/ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQ/XCJ1bmRlZmluZWRcIjpoKHQpfTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgYS5kZWZhdWx0JiZ0LmNvbnN0cnVjdG9yPT09YS5kZWZhdWx0JiZ0IT09YS5kZWZhdWx0LnByb3RvdHlwZT9cInN5bWJvbFwiOnZvaWQgMD09PXQ/XCJ1bmRlZmluZWRcIjpoKHQpfX0sZnVuY3Rpb24odCxlKXt2YXIgaT10LmV4cG9ydHM9e3ZlcnNpb246XCIyLjUuMVwifTtcIm51bWJlclwiPT10eXBlb2YgX19lJiYoX19lPWkpfSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPXtkZWZhdWx0OmkoMTQwKSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubW9tZW50fHxpKDE1NCl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKCl7dmFyIHQ9ZnVuY3Rpb24oKXt9O3JldHVybntvbjp0LG9mZjp0LGRlc3Ryb3k6dCxlbWl0OnQsZ2V0OmZ1bmN0aW9uKGUpe3JldHVybntzZXQ6dH19fX1pZihcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93KXt2YXIgbj1pKDE3NSkscz13aW5kb3cuSGFtbWVyfHxpKDE3Nik7dC5leHBvcnRzPW4ocyx7cHJldmVudERlZmF1bHQ6XCJtb3VzZVwifSl9ZWxzZSB0LmV4cG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm4gbygpfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXtpZih0JiYhQXJyYXkuaXNBcnJheSh0KSYmKGU9dCx0PW51bGwpLHRoaXMuX29wdGlvbnM9ZXx8e30sdGhpcy5fZGF0YT17fSx0aGlzLmxlbmd0aD0wLHRoaXMuX2ZpZWxkSWQ9dGhpcy5fb3B0aW9ucy5maWVsZElkfHxcImlkXCIsdGhpcy5fdHlwZT17fSx0aGlzLl9vcHRpb25zLnR5cGUpZm9yKHZhciBpPSgwLGwuZGVmYXVsdCkodGhpcy5fb3B0aW9ucy50eXBlKSxvPTAsbj1pLmxlbmd0aDtvPG47bysrKXt2YXIgcz1pW29dLHI9dGhpcy5fb3B0aW9ucy50eXBlW3NdO3RoaXMuX3R5cGVbc109XCJEYXRlXCI9PXJ8fFwiSVNPRGF0ZVwiPT1yfHxcIkFTUERhdGVcIj09cj9cIkRhdGVcIjpyfXRoaXMuX3N1YnNjcmliZXJzPXt9LHQmJnRoaXMuYWRkKHQpLHRoaXMuc2V0T3B0aW9ucyhlKX12YXIgcz1pKDE5KSxyPW8ocyksYT1pKDYpLGg9byhhKSxkPWkoOCksbD1vKGQpLHU9aSgyKSxjPWkoNDMpO24ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7dCYmdm9pZCAwIT09dC5xdWV1ZSYmKCExPT09dC5xdWV1ZT90aGlzLl9xdWV1ZSYmKHRoaXMuX3F1ZXVlLmRlc3Ryb3koKSxkZWxldGUgdGhpcy5fcXVldWUpOih0aGlzLl9xdWV1ZXx8KHRoaXMuX3F1ZXVlPWMuZXh0ZW5kKHRoaXMse3JlcGxhY2U6W1wiYWRkXCIsXCJ1cGRhdGVcIixcInJlbW92ZVwiXX0pKSxcIm9iamVjdFwiPT09KDAsaC5kZWZh
21167dWx0KSh0LnF1ZXVlKSYmdGhpcy5fcXVldWUuc2V0T3B0aW9ucyh0LnF1ZXVlKSkpfSxuLnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX3N1YnNjcmliZXJzW3RdO2l8fChpPVtdLHRoaXMuX3N1YnNjcmliZXJzW3RdPWkpLGkucHVzaCh7Y2FsbGJhY2s6ZX0pfSxuLnByb3RvdHlwZS5vZmY9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9zdWJzY3JpYmVyc1t0XTtpJiYodGhpcy5fc3Vic2NyaWJlcnNbdF09aS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2FsbGJhY2shPWV9KSl9LG4ucHJvdG90eXBlLl90cmlnZ2VyPWZ1bmN0aW9uKHQsZSxpKXtpZihcIipcIj09dCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdHJpZ2dlciBldmVudCAqXCIpO3ZhciBvPVtdO3QgaW4gdGhpcy5fc3Vic2NyaWJlcnMmJihvPW8uY29uY2F0KHRoaXMuX3N1YnNjcmliZXJzW3RdKSksXCIqXCJpbiB0aGlzLl9zdWJzY3JpYmVycyYmKG89by5jb25jYXQodGhpcy5fc3Vic2NyaWJlcnNbXCIqXCJdKSk7Zm9yKHZhciBuPTAscz1vLmxlbmd0aDtuPHM7bisrKXt2YXIgcj1vW25dO3IuY2FsbGJhY2smJnIuY2FsbGJhY2sodCxlLGl8fG51bGwpfX0sbi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSl7dmFyIGksbz1bXSxuPXRoaXM7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIHM9MCxyPXQubGVuZ3RoO3M8cjtzKyspaT1uLl9hZGRJdGVtKHRbc10pLG8ucHVzaChpKTtlbHNle2lmKCF0fHxcIm9iamVjdFwiIT09KHZvaWQgMD09PXQ/XCJ1bmRlZmluZWRcIjooMCxoLmRlZmF1bHQpKHQpKSl0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGRhdGFUeXBlXCIpO2k9bi5fYWRkSXRlbSh0KSxvLnB1c2goaSl9cmV0dXJuIG8ubGVuZ3RoJiZ0aGlzLl90cmlnZ2VyKFwiYWRkXCIse2l0ZW1zOm99LGUpLG99LG4ucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUpe3ZhciBpPVtdLG89W10sbj1bXSxzPVtdLHI9dGhpcyxhPXIuX2ZpZWxkSWQsZD1mdW5jdGlvbih0KXt2YXIgZT10W2FdO2lmKHIuX2RhdGFbZV0pe3ZhciBoPXUuZXh0ZW5kKHt9LHIuX2RhdGFbZV0pO2U9ci5fdXBkYXRlSXRlbSh0KSxvLnB1c2goZSkscy5wdXNoKHQpLG4ucHVzaChoKX1lbHNlIGU9ci5fYWRkSXRlbSh0KSxpLnB1c2goZSl9O2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciBsPTAsYz10Lmxlbmd0aDtsPGM7bCsrKXRbbF0mJlwib2JqZWN0XCI9PT0oMCxoLmRlZmF1bHQpKHRbbF0pP2QodFtsXSk6Y29uc29sZS53YXJuKFwiSWdub3JpbmcgaW5wdXQgaXRlbSwgd2hpY2ggaXMgbm90IGFuIG9iamVjdCBhdCBpbmRleCBcIitsKTtlbHNle2lmKCF0fHxcIm9iamVjdFwiIT09KHZvaWQgMD09PXQ/XCJ1bmRlZmluZWRcIjooMCxoLmRlZmF1bHQpKHQpKSl0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGRhdGFUeXBlXCIpO2QodCl9aWYoaS5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoXCJhZGRcIix7aXRlbXM6aX0sZSksby5sZW5ndGgpe3ZhciBwPXtpdGVtczpvLG9sZERhdGE6bixkYXRhOnN9O3RoaXMuX3RyaWdnZXIoXCJ1cGRhdGVcIixwLGUpfXJldHVybiBpLmNvbmNhdChvKX0sbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlLGksbyxuPXRoaXMscz11LmdldFR5cGUoYXJndW1lbnRzWzBdKTtcIlN0cmluZ1wiPT1zfHxcIk51bWJlclwiPT1zPyhlPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSk6XCJBcnJheVwiPT1zPyhpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSk6bz1hcmd1bWVudHNbMF07dmFyIHI7aWYobyYmby5yZXR1cm5UeXBlKXtyPS0xPT1bXCJBcnJheVwiLFwiT2JqZWN0XCJdLmluZGV4T2Yoby5yZXR1cm5UeXBlKT9cIkFycmF5XCI6by5yZXR1cm5UeXBlfWVsc2Ugcj1cIkFycmF5XCI7dmFyIGEsaCxkLGMscCxmPW8mJm8udHlwZXx8dGhpcy5fb3B0aW9ucy50eXBlLG09byYmby5maWx0ZXIsdj1bXTtpZih2b2lkIDAhPWUpKGE9bi5fZ2V0SXRlbShlLGYpKSYmbSYmIW0oYSkmJihhPW51bGwpO2Vsc2UgaWYodm9pZCAwIT1pKWZvcihjPTAscD1pLmxlbmd0aDtjPHA7YysrKWE9bi5fZ2V0SXRlbShpW2NdLGYpLG0mJiFtKGEpfHx2LnB1c2goYSk7ZWxzZSBmb3IoaD0oMCxsLmRlZmF1bHQpKHRoaXMuX2RhdGEpLGM9MCxwPWgubGVuZ3RoO2M8cDtjKyspZD1oW2NdLGE9bi5fZ2V0SXRlbShkLGYpLG0mJiFtKGEpfHx2LnB1c2goYSk7aWYobyYmby5vcmRlciYmdm9pZCAwPT1lJiZ0aGlzLl9zb3J0KHYsby5vcmRlciksbyYmby5maWVsZHMpe3ZhciBnPW8uZmllbGRzO2lmKHZvaWQgMCE9ZSlhPXRoaXMuX2ZpbHRlckZpZWxkcyhhLGcpO2Vsc2UgZm9yKGM9MCxwPXYubGVuZ3RoO2M8cDtjKyspdltjXT10aGlzLl9maWx0ZXJGaWVsZHModltjXSxnKX1pZihcIk9iamVjdFwiPT1yKXt2YXIgeSxiPXt9O2ZvcihjPTAscD12Lmxlbmd0aDtjPHA7YysrKXk9dltjXSxiW3kuaWRdPXk7cmV0dXJuIGJ9cmV0dXJuIHZvaWQgMCE9ZT9hOnZ9LG4ucHJvdG90eXBlLmdldElkcz1mdW5jdGlvbih0KXt2YXIgZSxpLG8sbixzLHI9dGhpcy5fZGF0YSxhPXQmJnQuZmlsdGVyLGg9dCYmdC5vcmRlcixkPXQmJnQudHlwZXx8dGhpcy5fb3B0aW9ucy50eXBlLHU9KDAsbC5kZWZhdWx0KShyKSxjPVtdO2lmKGEpaWYoaCl7Zm9yKHM9W10sZT0wLGk9dS5sZW5ndGg7ZTxpO2UrKylvPXVbZV0sbj10aGlzLl9nZXRJdGVtKG8sZCksYShuKSYmcy5wdXNoKG4pO2Zvcih0aGlzLl9zb3J0KHMsaCksZT0wLGk9cy5sZW5ndGg7ZTxpO2UrKyljLnB1c2goc1tlXVt0aGlzLl9maWVsZElkXSl9ZWxzZSBmb3IoZT0wLGk9dS5sZW5ndGg7ZTxpO2UrKylvPXVbZV0sbj10aGlzLl9nZXRJdGVtKG8sZCksYShuKSYmYy5wdXNoKG5bdGhpcy5fZmllbGRJZF0pO2Vsc2UgaWYoaCl7Zm9yKHM9W10sZT0wLGk9dS5sZW5ndGg7ZTxpO2UrKylvPXVbZV0scy5wdXNoKHJbb10pO2Zvcih0aGlzLl9zb3J0KHMsaCksZT0wLGk9cy5sZW5ndGg7ZTxpO2UrKyljLnB1c2goc1tlXVt0aGlzLl9maWVsZElkXSl9ZWxzZSBmb3IoZT0wLGk9dS5sZW5ndGg7ZTxpO2UrKylvPXVbZV0sbj1yW29dLGMucHVzaChuW3RoaXMuX2ZpZWxkSWRdKTtyZXR1cm4gY30sbi5wcm90b3R5cGUuZ2V0RGF0YVNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxuLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7dmFyIGksbyxuLHMscj1lJiZlLmZpbHRlcixhPWUmJmUudHlwZXx8dGhpcy5fb3B0aW9ucy50eXBlLGg9dGhpcy5fZGF0YSxkPSgwLGwuZGVmYXVsdCkoaCk7aWYoZSYmZS5vcmRlcil7dmFyIHU9dGhpcy5nZXQoZSk7Zm9yKGk9MCxvPXUubGVuZ3RoO2k8bztpKyspbj11W2ldLHM9blt0aGlzLl9maWVsZElkXSx0KG4scyl9ZWxzZSBmb3IoaT0wLG89ZC5sZW5ndGg7aTxvO2krKylzPWRbaV0sbj10aGlzLl9nZXRJdGVtKHMsYSksciYmIXIobil8fHQobixzKX0sbi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQsZSl7dmFyIGksbyxuLHMscj1lJiZlLmZpbHRlcixhPWUmJmUudHlwZXx8dGhpcy5fb3B0aW9ucy50eXBlLGg9W10sZD10aGlzLl9kYXRhLHU9KDAsbC5k
21167ZWZhdWx0KShkKTtmb3IoaT0wLG89dS5sZW5ndGg7aTxvO2krKyluPXVbaV0scz10aGlzLl9nZXRJdGVtKG4sYSksciYmIXIocyl8fGgucHVzaCh0KHMsbikpO3JldHVybiBlJiZlLm9yZGVyJiZ0aGlzLl9zb3J0KGgsZS5vcmRlciksaH0sbi5wcm90b3R5cGUuX2ZpbHRlckZpZWxkcz1mdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybiB0O3ZhciBpLG8sbj17fSxzPSgwLGwuZGVmYXVsdCkodCkscj1zLmxlbmd0aDtpZihBcnJheS5pc0FycmF5KGUpKWZvcihpPTA7aTxyO2krKylvPXNbaV0sLTEhPWUuaW5kZXhPZihvKSYmKG5bb109dFtvXSk7ZWxzZSBmb3IoaT0wO2k8cjtpKyspbz1zW2ldLGUuaGFzT3duUHJvcGVydHkobykmJihuW2Vbb11dPXRbb10pO3JldHVybiBufSxuLnByb3RvdHlwZS5fc29ydD1mdW5jdGlvbih0LGUpe2lmKHUuaXNTdHJpbmcoZSkpe3ZhciBpPWU7dC5zb3J0KGZ1bmN0aW9uKHQsZSl7dmFyIG89dFtpXSxuPWVbaV07cmV0dXJuIG8+bj8xOm88bj8tMTowfSl9ZWxzZXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoXCJPcmRlciBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmdcIik7dC5zb3J0KGUpfX0sbi5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQsZSl7dmFyIGksbyxuLHMscj1bXSxhPVtdLGg9W107Zm9yKGg9QXJyYXkuaXNBcnJheSh0KT90Olt0XSxpPTAsbz1oLmxlbmd0aDtpPG87aSsrKShzPXRoaXMuX3JlbW92ZShoW2ldKSkmJnZvaWQgMCE9KG49c1t0aGlzLl9maWVsZElkXSkmJihyLnB1c2gobiksYS5wdXNoKHMpKTtyZXR1cm4gci5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoXCJyZW1vdmVcIix7aXRlbXM6cixvbGREYXRhOmF9LGUpLHJ9LG4ucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24odCl7dmFyIGUsaTtyZXR1cm4gdS5pc051bWJlcih0KXx8dS5pc1N0cmluZyh0KT9pPXQ6dCYmXCJvYmplY3RcIj09PSh2b2lkIDA9PT10P1widW5kZWZpbmVkXCI6KDAsaC5kZWZhdWx0KSh0KSkmJihpPXRbdGhpcy5fZmllbGRJZF0pLHZvaWQgMCE9PWkmJnRoaXMuX2RhdGFbaV0/KGU9dGhpcy5fZGF0YVtpXSxkZWxldGUgdGhpcy5fZGF0YVtpXSx0aGlzLmxlbmd0aC0tLGUpOm51bGx9LG4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKHQpe3ZhciBlLGksbz0oMCxsLmRlZmF1bHQpKHRoaXMuX2RhdGEpLG49W107Zm9yKGU9MCxpPW8ubGVuZ3RoO2U8aTtlKyspbi5wdXNoKHRoaXMuX2RhdGFbb1tlXV0pO3JldHVybiB0aGlzLl9kYXRhPXt9LHRoaXMubGVuZ3RoPTAsdGhpcy5fdHJpZ2dlcihcInJlbW92ZVwiLHtpdGVtczpvLG9sZERhdGE6bn0sdCksb30sbi5wcm90b3R5cGUubWF4PWZ1bmN0aW9uKHQpe3ZhciBlLGksbz10aGlzLl9kYXRhLG49KDAsbC5kZWZhdWx0KShvKSxzPW51bGwscj1udWxsO2ZvcihlPTAsaT1uLmxlbmd0aDtlPGk7ZSsrKXt2YXIgYT1uW2VdLGg9b1thXSxkPWhbdF07bnVsbCE9ZCYmKCFzfHxkPnIpJiYocz1oLHI9ZCl9cmV0dXJuIHN9LG4ucHJvdG90eXBlLm1pbj1mdW5jdGlvbih0KXt2YXIgZSxpLG89dGhpcy5fZGF0YSxuPSgwLGwuZGVmYXVsdCkobykscz1udWxsLHI9bnVsbDtmb3IoZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKyl7dmFyIGE9bltlXSxoPW9bYV0sZD1oW3RdO251bGwhPWQmJighc3x8ZDxyKSYmKHM9aCxyPWQpfXJldHVybiBzfSxuLnByb3RvdHlwZS5kaXN0aW5jdD1mdW5jdGlvbih0KXt2YXIgZSxpLG8sbj10aGlzLl9kYXRhLHM9KDAsbC5kZWZhdWx0KShuKSxyPVtdLGE9dGhpcy5fb3B0aW9ucy50eXBlJiZ0aGlzLl9vcHRpb25zLnR5cGVbdF18fG51bGwsaD0wO2ZvcihlPTAsbz1zLmxlbmd0aDtlPG87ZSsrKXt2YXIgZD1zW2VdLGM9bltkXSxwPWNbdF0sZj0hMTtmb3IoaT0wO2k8aDtpKyspaWYocltpXT09cCl7Zj0hMDticmVha31mfHx2b2lkIDA9PT1wfHwocltoXT1wLGgrKyl9aWYoYSlmb3IoZT0wLG89ci5sZW5ndGg7ZTxvO2UrKylyW2VdPXUuY29udmVydChyW2VdLGEpO3JldHVybiByfSxuLnByb3RvdHlwZS5fYWRkSXRlbT1mdW5jdGlvbih0KXt2YXIgZT10W3RoaXMuX2ZpZWxkSWRdO2lmKHZvaWQgMCE9ZSl7aWYodGhpcy5fZGF0YVtlXSl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYWRkIGl0ZW06IGl0ZW0gd2l0aCBpZCBcIitlK1wiIGFscmVhZHkgZXhpc3RzXCIpfWVsc2UgZT11LnJhbmRvbVVVSUQoKSx0W3RoaXMuX2ZpZWxkSWRdPWU7dmFyIGksbyxuPXt9LHM9KDAsbC5kZWZhdWx0KSh0KTtmb3IoaT0wLG89cy5sZW5ndGg7aTxvO2krKyl7dmFyIHI9c1tpXSxhPXRoaXMuX3R5cGVbcl07bltyXT11LmNvbnZlcnQodFtyXSxhKX1yZXR1cm4gdGhpcy5fZGF0YVtlXT1uLHRoaXMubGVuZ3RoKyssZX0sbi5wcm90b3R5cGUuX2dldEl0ZW09ZnVuY3Rpb24odCxlKXt2YXIgaSxvLG4scyxyPXRoaXMuX2RhdGFbdF07aWYoIXIpcmV0dXJuIG51bGw7dmFyIGE9e30saD0oMCxsLmRlZmF1bHQpKHIpO2lmKGUpZm9yKG49MCxzPWgubGVuZ3RoO248cztuKyspaT1oW25dLG89cltpXSxhW2ldPXUuY29udmVydChvLGVbaV0pO2Vsc2UgZm9yKG49MCxzPWgubGVuZ3RoO248cztuKyspaT1oW25dLG89cltpXSxhW2ldPW87cmV0dXJuIGFbdGhpcy5fZmllbGRJZF18fChhW3RoaXMuX2ZpZWxkSWRdPXIuaWQpLGF9LG4ucHJvdG90eXBlLl91cGRhdGVJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlPXRbdGhpcy5fZmllbGRJZF07aWYodm9pZCAwPT1lKXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1cGRhdGUgaXRlbTogaXRlbSBoYXMgbm8gaWQgKGl0ZW06IFwiKygwLHIuZGVmYXVsdCkodCkrXCIpXCIpO3ZhciBpPXRoaXMuX2RhdGFbZV07aWYoIWkpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVwZGF0ZSBpdGVtOiBubyBpdGVtIHdpdGggaWQgXCIrZStcIiBmb3VuZFwiKTtmb3IodmFyIG89KDAsbC5kZWZhdWx0KSh0KSxuPTAscz1vLmxlbmd0aDtuPHM7bisrKXt2YXIgYT1vW25dLGg9dGhpcy5fdHlwZVthXTtpW2FdPXUuY29udmVydCh0W2FdLGgpfXJldHVybiBlfSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt0aGlzLl9kYXRhPW51bGwsdGhpcy5faWRzPXt9LHRoaXMubGVuZ3RoPTAsdGhpcy5fb3B0aW9ucz1lfHx7fS
21167x0aGlzLl9maWVsZElkPVwiaWRcIix0aGlzLl9zdWJzY3JpYmVycz17fTt2YXIgaT10aGlzO3RoaXMubGlzdGVuZXI9ZnVuY3Rpb24oKXtpLl9vbkV2ZW50LmFwcGx5KGksYXJndW1lbnRzKX0sdGhpcy5zZXREYXRhKHQpfXZhciBuPWkoOCkscz1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KG4pLHI9aSgyKSxhPWkoMTEpO28ucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7dmFyIGUsaSxvLG4scztpZih0aGlzLl9kYXRhKXtmb3IodGhpcy5fZGF0YS5vZmYmJnRoaXMuX2RhdGEub2ZmKFwiKlwiLHRoaXMubGlzdGVuZXIpLGU9dGhpcy5fZGF0YS5nZXRJZHMoe2ZpbHRlcjp0aGlzLl9vcHRpb25zJiZ0aGlzLl9vcHRpb25zLmZpbHRlcn0pLHM9W10sbz0wLG49ZS5sZW5ndGg7bzxuO28rKylzLnB1c2godGhpcy5fZGF0YS5fZGF0YVtlW29dXSk7dGhpcy5faWRzPXt9LHRoaXMubGVuZ3RoPTAsdGhpcy5fdHJpZ2dlcihcInJlbW92ZVwiLHtpdGVtczplLG9sZERhdGE6c30pfWlmKHRoaXMuX2RhdGE9dCx0aGlzLl9kYXRhKXtmb3IodGhpcy5fZmllbGRJZD10aGlzLl9vcHRpb25zLmZpZWxkSWR8fHRoaXMuX2RhdGEmJnRoaXMuX2RhdGEub3B0aW9ucyYmdGhpcy5fZGF0YS5vcHRpb25zLmZpZWxkSWR8fFwiaWRcIixlPXRoaXMuX2RhdGEuZ2V0SWRzKHtmaWx0ZXI6dGhpcy5fb3B0aW9ucyYmdGhpcy5fb3B0aW9ucy5maWx0ZXJ9KSxvPTAsbj1lLmxlbmd0aDtvPG47bysrKWk9ZVtvXSx0aGlzLl9pZHNbaV09ITA7dGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5fdHJpZ2dlcihcImFkZFwiLHtpdGVtczplfSksdGhpcy5fZGF0YS5vbiYmdGhpcy5fZGF0YS5vbihcIipcIix0aGlzLmxpc3RlbmVyKX19LG8ucHJvdG90eXBlLnJlZnJlc2g9ZnVuY3Rpb24oKXt2YXIgdCxlLGksbz10aGlzLl9kYXRhLmdldElkcyh7ZmlsdGVyOnRoaXMuX29wdGlvbnMmJnRoaXMuX29wdGlvbnMuZmlsdGVyfSksbj0oMCxzLmRlZmF1bHQpKHRoaXMuX2lkcykscj17fSxhPVtdLGg9W10sZD1bXTtmb3IoZT0wLGk9by5sZW5ndGg7ZTxpO2UrKyl0PW9bZV0sclt0XT0hMCx0aGlzLl9pZHNbdF18fChhLnB1c2godCksdGhpcy5faWRzW3RdPSEwKTtmb3IoZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKyl0PW5bZV0sclt0XXx8KGgucHVzaCh0KSxkLnB1c2godGhpcy5fZGF0YS5fZGF0YVt0XSksZGVsZXRlIHRoaXMuX2lkc1t0XSk7dGhpcy5sZW5ndGgrPWEubGVuZ3RoLWgubGVuZ3RoLGEubGVuZ3RoJiZ0aGlzLl90cmlnZ2VyKFwiYWRkXCIse2l0ZW1zOmF9KSxoLmxlbmd0aCYmdGhpcy5fdHJpZ2dlcihcInJlbW92ZVwiLHtpdGVtczpoLG9sZERhdGE6ZH0pfSxvLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGUsaSxvLG49dGhpcyxzPXIuZ2V0VHlwZShhcmd1bWVudHNbMF0pO1wiU3RyaW5nXCI9PXN8fFwiTnVtYmVyXCI9PXN8fFwiQXJyYXlcIj09cz8oZT1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl0pOihpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSk7dmFyIGE9ci5leHRlbmQoe30sdGhpcy5fb3B0aW9ucyxpKTt0aGlzLl9vcHRpb25zLmZpbHRlciYmaSYmaS5maWx0ZXImJihhLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbi5fb3B0aW9ucy5maWx0ZXIodCkmJmkuZmlsdGVyKHQpfSk7dmFyIGg9W107cmV0dXJuIHZvaWQgMCE9ZSYmaC5wdXNoKGUpLGgucHVzaChhKSxoLnB1c2gobyksdGhpcy5fZGF0YSYmdGhpcy5fZGF0YS5nZXQuYXBwbHkodGhpcy5fZGF0YSxoKX0sby5wcm90b3R5cGUuZ2V0SWRzPWZ1bmN0aW9uKHQpe3ZhciBlO2lmKHRoaXMuX2RhdGEpe3ZhciBpLG89dGhpcy5fb3B0aW9ucy5maWx0ZXI7aT10JiZ0LmZpbHRlcj9vP2Z1bmN0aW9uKGUpe3JldHVybiBvKGUpJiZ0LmZpbHRlcihlKX06dC5maWx0ZXI6byxlPXRoaXMuX2RhdGEuZ2V0SWRzKHtmaWx0ZXI6aSxvcmRlcjp0JiZ0Lm9yZGVyfSl9ZWxzZSBlPVtdO3JldHVybiBlfSxvLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCxlKXt2YXIgaT1bXTtpZih0aGlzLl9kYXRhKXt2YXIgbyxuPXRoaXMuX29wdGlvbnMuZmlsdGVyO289ZSYmZS5maWx0ZXI/bj9mdW5jdGlvbih0KXtyZXR1cm4gbih0KSYmZS5maWx0ZXIodCl9OmUuZmlsdGVyOm4saT10aGlzLl9kYXRhLm1hcCh0LHtmaWx0ZXI6byxvcmRlcjplJiZlLm9yZGVyfSl9ZWxzZSBpPVtdO3JldHVybiBpfSxvLnByb3RvdHlwZS5nZXREYXRhU2V0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXM7dCBpbnN0YW5jZW9mIG87KXQ9dC5fZGF0YTtyZXR1cm4gdHx8bnVsbH0sby5wcm90b3R5cGUuX29uRXZlbnQ9ZnVuY3Rpb24odCxlLGkpe3ZhciBvLG4scyxyLGE9ZSYmZS5pdGVtcyxoPVtdLGQ9W10sbD1bXSx1PVtdLGM9W10scD1bXTtpZihhJiZ0aGlzLl9kYXRhKXtzd2l0Y2godCl7Y2FzZVwiYWRkXCI6Zm9yKG89MCxuPWEubGVuZ3RoO288bjtvKyspcz1hW29dLChyPXRoaXMuZ2V0KHMpKSYmKHRoaXMuX2lkc1tzXT0hMCxoLnB1c2gocykpO2JyZWFrO2Nhc2VcInVwZGF0ZVwiOmZvcihvPTAsbj1hLmxlbmd0aDtvPG47bysrKXM9YVtvXSxyPXRoaXMuZ2V0KHMpLHI/dGhpcy5faWRzW3NdPyhkLnB1c2gocyksYy5wdXNoKGUuZGF0YVtvXSksdS5wdXNoKGUub2xkRGF0YVtvXSkpOih0aGlzLl9pZHNbc109ITAsaC5wdXNoKHMpKTp0aGlzLl9pZHNbc10mJihkZWxldGUgdGhpcy5faWRzW3NdLGwucHVzaChzKSxwLnB1c2goZS5vbGREYXRhW29dKSk7YnJlYWs7Y2FzZVwicmVtb3ZlXCI6Zm9yKG89MCxuPWEubGVuZ3RoO288bjtvKyspcz1hW29dLHRoaXMuX2lkc1tzXSYmKGRlbGV0ZSB0aGlzLl9pZHNbc10sbC5wdXNoKHMpLHAucHVzaChlLm9sZERhdGFbb10pKX10aGlzLmxlbmd0aCs9aC5sZW5ndGgtbC5sZW5ndGgsaC5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoXCJhZGRcIix7aXRlbXM6aH0saSksZC5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoXCJ1cGRhdGVcIix7aXRlbXM6ZCxvbGREYXRhOnUsZGF0YTpjfSxpKSxsLmxlbmd0aCYmdGhpcy5fdHJpZ2dlcihcInJlbW92ZVwiLHtpdGVtczpsLG9sZERhdGE6cH0saSl9fSxvLnByb3RvdHlwZS5vbj1hLnByb3RvdHlwZS5vbixvLnByb3RvdHlwZS5vZmY9YS5wcm90b3R5cGUub2ZmLG8ucHJvdG90eXBlLl90cmlnZ2VyPWEucHJvdG90eXBlLl90cmlnZ2VyLG8ucHJvdG90eXBlLnN1YnNjcmliZT1vLnByb3RvdHlwZS5vbixvLnByb3RvdHlwZS51bnN1YnNjcmliZT1vLnByb3RvdHlwZS5vZmYsdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDU3KShcIndrc1wiKSxuPWkoNDApLHM9aSgxOCkuU3ltYm9sLHI9XCJmdW5jdGlvblwiPT10eXBlb2YgczsodC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvW3RdfHwob1t0XT1yJiZzW3RdfHwocj9zOm4pKFwiU3ltYm9sLlwiK3QpKX0pLnN0b3JlPW99LGZ1bmN0aW9uKHQsZSxpKXtlLnByZXBhcmVFbGVtZW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdCl0Lmhhc093blByb3BlcnR5KGUpJiYodFtlXS
211675yZWR1bmRhbnQ9dFtlXS51c2VkLHRbZV0udXNlZD1bXSl9LGUuY2xlYW51cEVsZW1lbnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkmJnRbZV0ucmVkdW5kYW50KXtmb3IodmFyIGk9MDtpPHRbZV0ucmVkdW5kYW50Lmxlbmd0aDtpKyspdFtlXS5yZWR1bmRhbnRbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0W2VdLnJlZHVuZGFudFtpXSk7dFtlXS5yZWR1bmRhbnQ9W119fSxlLnJlc2V0RWxlbWVudHM9ZnVuY3Rpb24odCl7ZS5wcmVwYXJlRWxlbWVudHModCksZS5jbGVhbnVwRWxlbWVudHModCksZS5wcmVwYXJlRWxlbWVudHModCl9LGUuZ2V0U1ZHRWxlbWVudD1mdW5jdGlvbih0LGUsaSl7dmFyIG87cmV0dXJuIGUuaGFzT3duUHJvcGVydHkodCk/ZVt0XS5yZWR1bmRhbnQubGVuZ3RoPjA/KG89ZVt0XS5yZWR1bmRhbnRbMF0sZVt0XS5yZWR1bmRhbnQuc2hpZnQoKSk6KG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIix0KSxpLmFwcGVuZENoaWxkKG8pKToobz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLHQpLGVbdF09e3VzZWQ6W10scmVkdW5kYW50OltdfSxpLmFwcGVuZENoaWxkKG8pKSxlW3RdLnVzZWQucHVzaChvKSxvfSxlLmdldERPTUVsZW1lbnQ9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG47cmV0dXJuIGUuaGFzT3duUHJvcGVydHkodCk/ZVt0XS5yZWR1bmRhbnQubGVuZ3RoPjA/KG49ZVt0XS5yZWR1bmRhbnRbMF0sZVt0XS5yZWR1bmRhbnQuc2hpZnQoKSk6KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KSx2b2lkIDAhPT1vP2kuaW5zZXJ0QmVmb3JlKG4sbyk6aS5hcHBlbmRDaGlsZChuKSk6KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KSxlW3RdPXt1c2VkOltdLHJlZHVuZGFudDpbXX0sdm9pZCAwIT09bz9pLmluc2VydEJlZm9yZShuLG8pOmkuYXBwZW5kQ2hpbGQobikpLGVbdF0udXNlZC5wdXNoKG4pLG59LGUuZHJhd1BvaW50PWZ1bmN0aW9uKHQsaSxvLG4scyxyKXt2YXIgYTtpZihcImNpcmNsZVwiPT1vLnN0eWxlPyhhPWUuZ2V0U1ZHRWxlbWVudChcImNpcmNsZVwiLG4scyksYS5zZXRBdHRyaWJ1dGVOUyhudWxsLFwiY3hcIix0KSxhLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJjeVwiLGkpLGEuc2V0QXR0cmlidXRlTlMobnVsbCxcInJcIiwuNSpvLnNpemUpKTooYT1lLmdldFNWR0VsZW1lbnQoXCJyZWN0XCIsbixzKSxhLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ4XCIsdC0uNSpvLnNpemUpLGEuc2V0QXR0cmlidXRlTlMobnVsbCxcInlcIixpLS41Km8uc2l6ZSksYS5zZXRBdHRyaWJ1dGVOUyhudWxsLFwid2lkdGhcIixvLnNpemUpLGEuc2V0QXR0cmlidXRlTlMobnVsbCxcImhlaWdodFwiLG8uc2l6ZSkpLHZvaWQgMCE9PW8uc3R5bGVzJiZhLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJzdHlsZVwiLG8uc3R5bGVzKSxhLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJjbGFzc1wiLG8uY2xhc3NOYW1lK1wiIHZpcy1wb2ludFwiKSxyKXt2YXIgaD1lLmdldFNWR0VsZW1lbnQoXCJ0ZXh0XCIsbixzKTtyLnhPZmZzZXQmJih0Kz1yLnhPZmZzZXQpLHIueU9mZnNldCYmKGkrPXIueU9mZnNldCksci5jb250ZW50JiYoaC50ZXh0Q29udGVudD1yLmNvbnRlbnQpLHIuY2xhc3NOYW1lJiZoLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJjbGFzc1wiLHIuY2xhc3NOYW1lK1wiIHZpcy1sYWJlbFwiKSxoLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ4XCIsdCksaC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwieVwiLGkpfXJldHVybiBhfSxlLmRyYXdCYXI9ZnVuY3Rpb24odCxpLG8sbixzLHIsYSxoKXtpZigwIT1uKXtuPDAmJihuKj0tMSxpLT1uKTt2YXIgZD1lLmdldFNWR0VsZW1lbnQoXCJyZWN0XCIscixhKTtkLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ4XCIsdC0uNSpvKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ5XCIsaSksZC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwid2lkdGhcIixvKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJoZWlnaHRcIixuKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJjbGFzc1wiLHMpLGgmJmQuc2V0QXR0cmlidXRlTlMobnVsbCxcInN0eWxlXCIsaCl9fX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUucHJpbnRTdHlsZT12b2lkIDA7dmFyIG49aSgxOSkscz1vKG4pLHI9aSg2KSxhPW8ociksaD1pKDgpLGQ9byhoKSxsPWkoMCksdT1vKGwpLGM9aSgxKSxwPW8oYyksZj1pKDIpLG09ITEsdj12b2lkIDAsZz1cImJhY2tncm91bmQ6ICNGRmVlZWU7IGNvbG9yOiAjZGQwMDAwXCIseT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXsoMCx1LmRlZmF1bHQpKHRoaXMsdCl9cmV0dXJuKDAscC5kZWZhdWx0KSh0LG51bGwsW3trZXk6XCJ2YWxpZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKGUsaSxvKXttPSExLHY9aTt2YXIgbj1pO3JldHVybiB2b2lkIDAhPT1vJiYobj1pW29dKSx0LnBhcnNlKGUsbixbXSksbX19LHtrZXk6XCJwYXJzZVwiLHZhbHVlOmZ1bmN0aW9uKGUsaSxvKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiZ0LmNoZWNrKG4sZSxpLG8pfX0se2tleTpcImNoZWNrXCIsdmFsdWU6ZnVuY3Rpb24oZSxpLG8sbil7aWYodm9pZCAwPT09b1tlXSYmdm9pZCAwPT09by5fX2FueV9fKXJldHVybiB2b2lkIHQuZ2V0U3VnZ2VzdGlvbihlLG8sbik7dmFyIHM9ZSxyPSEwO3ZvaWQgMD09PW9bZV0mJnZvaWQgMCE9PW8uX19hbnlfXyYmKHM9XCJfX2FueV9fXCIscj1cIm9iamVjdFwiPT09dC5nZXRUeXBlKGlbZV0pKTt2YXIgYT1vW3NdO3ImJnZvaWQgMCE9PWEuX190eXBlX18mJihhPWEuX190eXBlX18pLHQuY2hlY2tGaWVsZHMoZSxpLG8scyxhLG4pfX0se2tleTpcImNoZWNrRmllbGRzXCIsdmFsdWU6ZnVuY3Rpb24oZSxpLG8sbixzLHIpe3ZhciBhPWZ1bmN0aW9uKGkpe2NvbnNvbGUubG9nKFwiJWNcIitpK3QucHJpbnRMb2NhdGlvbihyLGUpLGcpfSxoPXQuZ2V0VHlwZShpW2VdKSxsPXNbaF07dm9pZCAwIT09bD9cImFycmF5XCI9PT10LmdldFR5cGUobCkmJi0xPT09bC5pbmRleE9mKGlbZV0pPyhhKCdJbnZhbGlkIG9wdGlvbiBkZXRlY3RlZCBpbiBcIicrZSsnXCIuIEFsbG93ZWQgdmFsdWVzIGFyZTonK3QucHJpbnQobCkrJyBub3QgXCInK2lbZV0rJ1wiLiAnKSxtPSEwKTpcIm9iamVjdFwiPT09aCYmXCJfX2FueV9fXCIhPT1uJiYocj1mLmNvcHlBbmRFeHRlbmRBcnJheShyLGUpLHQucGFyc2UoaVtlXSxvW25dLHIpKTp2b2lkIDA9PT1zLmFueSYmKGEoJ0ludmFsaWQgdHlwZSByZWNlaXZlZCBmb3IgXCInK2UrJ1wiLiBFeHBlY3RlZDogJyt0LnByaW50KCgwLGQuZGVmYXVsdCkocykpK1wiLiBSZWNlaXZlZCBbXCIraCsnXSBcIicraVtlXSsnXCInKSxtPSEwKX19LHtrZXk6XCJnZXRUeXBlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwPT09dD9cInVuZGVmaW5lZFwiOigwLGEuZGVmYXVsdCkodCk7cmV0dXJuXCJvYmplY3RcIj09PWU/bnVsbD09PXQ/XCJudWxsXCI6dCBpbnN0YW5jZW9mIEJvb2xlYW4/XCJib29sZWFuXCI6dCBpbnN0YW5jZW9mIE51bWJlcj9cIm51bWJlclwiOnQgaW5zdGFuY2VvZiBTdHJpbmc/XCJzdHJpbmdcIjpBcnJheS5pc0FycmF
211675KHQpP1wiYXJyYXlcIjp0IGluc3RhbmNlb2YgRGF0ZT9cImRhdGVcIjp2b2lkIDAhPT10Lm5vZGVUeXBlP1wiZG9tXCI6ITA9PT10Ll9pc0FNb21lbnRPYmplY3Q/XCJtb21lbnRcIjpcIm9iamVjdFwiOlwibnVtYmVyXCI9PT1lP1wibnVtYmVyXCI6XCJib29sZWFuXCI9PT1lP1wiYm9vbGVhblwiOlwic3RyaW5nXCI9PT1lP1wic3RyaW5nXCI6dm9pZCAwPT09ZT9cInVuZGVmaW5lZFwiOmV9fSx7a2V5OlwiZ2V0U3VnZ2VzdGlvblwiLHZhbHVlOmZ1bmN0aW9uKGUsaSxvKXt2YXIgbj10LmZpbmRJbk9wdGlvbnMoZSxpLG8sITEpLHM9dC5maW5kSW5PcHRpb25zKGUsdixbXSwhMCkscj12b2lkIDBcbiAgICA7cj12b2lkIDAhPT1uLmluZGV4TWF0Y2g/XCIgaW4gXCIrdC5wcmludExvY2F0aW9uKG4ucGF0aCxlLFwiXCIpKydQZXJoYXBzIGl0IHdhcyBpbmNvbXBsZXRlPyBEaWQgeW91IG1lYW46IFwiJytuLmluZGV4TWF0Y2grJ1wiP1xcblxcbic6cy5kaXN0YW5jZTw9NCYmbi5kaXN0YW5jZT5zLmRpc3RhbmNlP1wiIGluIFwiK3QucHJpbnRMb2NhdGlvbihuLnBhdGgsZSxcIlwiKStcIlBlcmhhcHMgaXQgd2FzIG1pc3BsYWNlZD8gTWF0Y2hpbmcgb3B0aW9uIGZvdW5kIGF0OiBcIit0LnByaW50TG9jYXRpb24ocy5wYXRoLHMuY2xvc2VzdE1hdGNoLFwiXCIpOm4uZGlzdGFuY2U8PTg/Jy4gRGlkIHlvdSBtZWFuIFwiJytuLmNsb3Nlc3RNYXRjaCsnXCI/Jyt0LnByaW50TG9jYXRpb24obi5wYXRoLGUpOlwiLiBEaWQgeW91IG1lYW4gb25lIG9mIHRoZXNlOiBcIit0LnByaW50KCgwLGQuZGVmYXVsdCkoaSkpK3QucHJpbnRMb2NhdGlvbihvLGUpLGNvbnNvbGUubG9nKCclY1Vua25vd24gb3B0aW9uIGRldGVjdGVkOiBcIicrZSsnXCInK3IsZyksbT0hMH19LHtrZXk6XCJmaW5kSW5PcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24oZSxpLG8pe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdJiZhcmd1bWVudHNbM10scz0xZTkscj1cIlwiLGE9W10saD1lLnRvTG93ZXJDYXNlKCksZD12b2lkIDA7Zm9yKHZhciBsIGluIGkpe3ZhciB1PXZvaWQgMDtpZih2b2lkIDAhPT1pW2xdLl9fdHlwZV9fJiYhMD09PW4pe3ZhciBjPXQuZmluZEluT3B0aW9ucyhlLGlbbF0sZi5jb3B5QW5kRXh0ZW5kQXJyYXkobyxsKSk7cz5jLmRpc3RhbmNlJiYocj1jLmNsb3Nlc3RNYXRjaCxhPWMucGF0aCxzPWMuZGlzdGFuY2UsZD1jLmluZGV4TWF0Y2gpfWVsc2UtMSE9PWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKGgpJiYoZD1sKSx1PXQubGV2ZW5zaHRlaW5EaXN0YW5jZShlLGwpLHM+dSYmKHI9bCxhPWYuY29weUFycmF5KG8pLHM9dSl9cmV0dXJue2Nsb3Nlc3RNYXRjaDpyLHBhdGg6YSxkaXN0YW5jZTpzLGluZGV4TWF0Y2g6ZH19fSx7a2V5OlwicHJpbnRMb2NhdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpcIlByb2JsZW0gdmFsdWUgZm91bmQgYXQ6IFxcblwiLG89XCJcXG5cXG5cIitpK1wib3B0aW9ucyA9IHtcXG5cIixuPTA7bjx0Lmxlbmd0aDtuKyspe2Zvcih2YXIgcz0wO3M8bisxO3MrKylvKz1cIiAgXCI7bys9dFtuXStcIjoge1xcblwifWZvcih2YXIgcj0wO3I8dC5sZW5ndGgrMTtyKyspbys9XCIgIFwiO28rPWUrXCJcXG5cIjtmb3IodmFyIGE9MDthPHQubGVuZ3RoKzE7YSsrKXtmb3IodmFyIGg9MDtoPHQubGVuZ3RoLWE7aCsrKW8rPVwiICBcIjtvKz1cIn1cXG5cIn1yZXR1cm4gbytcIlxcblxcblwifX0se2tleTpcInByaW50XCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuKDAscy5kZWZh
21167dWx0KSh0KS5yZXBsYWNlKC8oXFxcIil8KFxcWyl8KFxcXSl8KCxcIl9fdHlwZV9fXCIpL2csXCJcIikucmVwbGFjZSgvKFxcLCkvZyxcIiwgXCIpfX0se2tleTpcImxldmVuc2h0ZWluRGlzdGFuY2VcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gZS5sZW5ndGg7aWYoMD09PWUubGVuZ3RoKXJldHVybiB0Lmxlbmd0aDt2YXIgaSxvPVtdO2ZvcihpPTA7aTw9ZS5sZW5ndGg7aSsrKW9baV09W2ldO3ZhciBuO2ZvcihuPTA7bjw9dC5sZW5ndGg7bisrKW9bMF1bbl09bjtmb3IoaT0xO2k8PWUubGVuZ3RoO2krKylmb3Iobj0xO248PXQubGVuZ3RoO24rKyllLmNoYXJBdChpLTEpPT10LmNoYXJBdChuLTEpP29baV1bbl09b1tpLTFdW24tMV06b1tpXVtuXT1NYXRoLm1pbihvW2ktMV1bbi0xXSsxLE1hdGgubWluKG9baV1bbi0xXSsxLG9baS0xXVtuXSsxKSk7cmV0dXJuIG9bZS5sZW5ndGhdW3QubGVuZ3RoXX19XSksdH0oKTtlLmRlZmF1bHQ9eSxlLnByaW50U3R5bGU9Z30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt0aGlzLm9wdGlvbnM9bnVsbCx0aGlzLnByb3BzPW51bGx9dmFyIG49aSgyKTtvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3QmJm4uZXh0ZW5kKHRoaXMub3B0aW9ucyx0KX0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7cmV0dXJuITF9LG8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LG8ucHJvdG90eXBlLl9pc1Jlc2l6ZWQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLl9wcmV2aW91c1dpZHRoIT09dGhpcy5wcm9wcy53aWR0aHx8dGhpcy5wcm9wcy5fcHJldmlvdXNIZWlnaHQhPT10aGlzLnByb3BzLmhlaWdodDtyZXR1cm4gdGhpcy5wcm9wcy5fcHJldmlvdXNXaWR0aD10aGlzLnByb3BzLndpZHRoLHRoaXMucHJvcHMuX3ByZXZpb3VzSGVpZ2h0PXRoaXMucHJvcHMuaGVpZ2h0LHR9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgxOCksbj1pKDcpLHM9aSg4MCkscj1pKDI2KSxhPWZ1bmN0aW9uKHQsZSxpKXt2YXIgaCxkLGwsdT10JmEuRixjPXQmYS5HLHA9dCZhLlMsZj10JmEuUCxtPXQmYS5CLHY9dCZhLlcsZz1jP246bltlXXx8KG5bZV09e30pLHk9Zy5wcm90b3R5cGUsYj1jP286cD9vW2VdOihvW2VdfHx7fSkucHJvdG90eXBlO2MmJihpPWUpO2ZvcihoIGluIGkpKGQ9IXUmJmImJnZvaWQgMCE9PWJbaF0pJiZoIGluIGd8fChsPWQ/YltoXTppW2hdLGdbaF09YyYmXCJmdW5jdGlvblwiIT10eXBlb2YgYltoXT9pW2hdOm0mJmQ/cyhsLG8pOnYmJmJbaF09PWw/ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oZSxpLG8pe2lmKHRoaXMgaW5zdGFuY2VvZiB0KXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBuZXcgdDtjYXNlIDE6cmV0dXJuIG5ldyB0KGUpO2Nhc2UgMjpyZXR1cm4gbmV3IHQoZSxpKX1yZXR1cm4gbmV3IHQoZSxpLG8pfXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX07cmV0dXJuIGUucHJvdG90eXBlPXQucHJvdG90eXBlLGV9KGwpOmYmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGw/cyhGdW5jdGlvbi5jYWxsLGwpOmwsZiYmKChnLnZpcnR1YWx8fChnLnZpcnR1YWw9e30pKVtoXT1sLHQmYS5SJiZ5JiYheVtoXSYmcih5LGgsbCkpKX07YS5GPTEsYS5HPTIsYS5TPTQsYS5QPTgsYS5CPTE2LGEuVz0zMixhLlU9NjQsYS5SPTEyOCx0LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlKXt2YXIgaT10LmV4cG9ydHM9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lk1hdGg9PU1hdGg/d2luZG93OlwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmJiZzZWxmLk1hdGg9PU1hdGg/c2VsZjpGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XCJudW1iZXJcIj09dHlwZW9mIF9fZyYmKF9fZz1pKX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz17ZGVmYXVsdDppKDE2MCksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDI3KSxuPWkoODEpLHM9aSg1Mykscj1PYmplY3QuZGVmaW5lUHJvcGVydHk7ZS5mPWkoMjEpP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbih0LGUsaSl7aWYobyh0KSxlPXMoZSwhMCksbyhpKSxuKXRyeXtyZXR1cm4gcih0LGUsaSl9Y2F0Y2godCl7fWlmKFwiZ2V0XCJpbiBpfHxcInNldFwiaW4gaSl0aHJvdyBUeXBlRXJyb3IoXCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCFcIik7cmV0dXJuXCJ2YWx1ZVwiaW4gaSYmKHRbZV09aS52YWx1ZSksdH19LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9IWkoMjgpKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSxcImFcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pfSxmdW5jdGlvbih0LGUpe3ZhciBpPXt9Lmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBpLmNhbGwodCxlKX19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDYpLHM9byhuKSxyPWkoMCksYT1vKHIpLGg9aSgxKSxkPW8oaCksbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8peygwLGEuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9aSx0aGlzLmxhYmVsTW9kdWxlPW8sdGhpcy5zZXRPcHRpb25zKGUpLHRoaXMudG9wPXZvaWQgMCx0aGlzLmxlZnQ9dm9pZCAwLHRoaXMuaGVpZ2h0PXZvaWQgMCx0aGlzLndpZHRoPXZvaWQgMCx0aGlzLnJhZGl1cz12b2lkIDAsdGhpcy5tYXJnaW49dm9pZCAwLHRoaXMucmVmcmVzaE5lZWRlZD0hMCx0aGlzLmJvdW5kaW5nQm94PXt0b3A6MCxsZWZ0OjAscmlnaHQ6MCxib3R0b206MH19cmV0dXJuKDAsZC5kZWZhdWx0KSh0LFt7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10fX0se2tleTpcIl9zZXRNYXJnaW5zXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5tYXJnaW49e30sdGhpcy5vcHRpb25zLm1hcmdpbiYmKFwib2JqZWN0XCI9PSgwLHMuZGVmYXVsdCkodGhpcy5vcHRpb25zLm1hcmdpbik/KHRoaXMubWFyZ2luLnRvcD10aGlzLm9wdGlvbnMubWFyZ2luLnRvcCx0aGlzLm1hcmdpbi5yaWdodD10aGlzLm9wdGlvbnMubWFyZ2luLnJpZ2h0LHRoaXMubWFyZ2luLmJvdHRvbT10aGlzLm9wdGlvbnMubWFyZ2luLmJvdHRvbSx0aGlzLm1hcmdpbi5sZWZ0PXRoaXMub3B0aW9ucy5tYXJnaW4ubGVmdCk6KHRoaXMubWFyZ2luLnRvcD10aGlzLm9wdGlvbnMubWFyZ2luLHRoaXMubWFyZ2luLnJpZ2h0PXRoaXMub3B0aW9ucy5tYXJnaW4sdGhpcy5tYXJnaW4uYm90dG9tPXRoaXMub3B0aW9ucy5tYXJnaW4sdGhpcy5tYXJnaW4ubGVmdD10aGlzLm9wdGlvbnMubWFyZ2luKSksdC5hZGp1c3RTaXplcyh0aGlzLm1hcmdpbil9fSx7a2V5OlwiX2Rpc3RhbmNlVG9Cb3JkZXJcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMub3B0aW9ucy5ib3JkZXJXaWR0aDtyZXR1cm4gdGhpcy5yZXNpemUodCksTWF0aC5taW4oTWF0aC5hYnModGhpcy53aWR0aC8yL01hdGguY29zKGUpKSxNYXRoLmFicyh0aGlzLmhlaWdodC8yL01hdGguc2luKGUpKSkraX19LHtrZXk6XCJlbmFibGVTaGFkb3dcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2Uuc2hhZG93JiYodC5zaGFkb3dDb2xvcj1lLnNoYWRvd0NvbG9yLHQuc2hhZG93Qmx1cj1lLnNoYWRvd1NpemUsdC5zaGFkb3dPZmZzZXRYPWUuc2hhZG93WCx0LnNoYWRvd09mZnNldFk9ZS5zaGFkb3dZKX19LHtrZXk6XCJkaXNhYmxlU2hhZG93XCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtlLnNoYWRvdyYmKHQuc2hhZG93Q29sb3I9XCJyZ2JhKDAsMCwwLDApXCIsdC5zaGFkb3dCbHVyPTAsdC5zaGFkb3dPZmZzZXRYPTAsdC5zaGFkb3dPZmZzZXRZPTApfX0se2tleTpcImVuYWJsZUJvcmRlckRhc2hlc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoITEhPT1lLmJvcmRlckRhc2hlcylpZih2b2lkIDAhPT10LnNldExpbmVEYXNoKXt2YXIgaT1lLmJvcmRlckRhc2hlczshMD09PWkmJihpPVs1LDE1XSksdC5zZXRMaW5lRGFzaChpKX1lbHNlIGNvbnNvbGUud2FybihcInNldExpbmVEYXNoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyLiBUaGUgZGFzaGVkIGJvcmRlcnMgY2Fubm90IGJlIHVzZWQuXCIpLHRoaXMub3B0aW9ucy5zaGFwZVByb3BlcnRpZXMuYm9yZGVyRGFzaGVzPSExLGUuYm9yZGVyRGFzaGVzPSExfX0se2tleTpcImRpc2FibGVCb3JkZXJEYXNoZXNcIix2YWx1ZTpmdW5jdGlvbih0LGUpeyExIT09ZS5ib3JkZXJEYXNoZXMmJih2b2lkIDAhPT10LnNldExpbmVEYXNoP3Quc2V0TGluZURhc2goWzBdKTooY29uc29sZS53YXJuKFwic2V0TGluZURhc2ggaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIuIFRoZSBkYXNoZWQgYm9yZGVycyBjYW5ub3QgYmUgdXNlZC5cIiksdGhpcy5vcHRpb25zLnNoYXBlUHJvcGVydGllcy5ib3JkZXJEYXNoZXM9ITEsZS5ib3JkZXJEYXNoZXM9ITEpKX19LHtrZXk6XCJuZWVkc1JlZnJlc2hcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiEwPT09dGhpcy5yZWZyZXNoTmVlZGVkPyh0aGlzLnJlZnJlc2hOZWVkZWQ9IT
21167EsITApOnZvaWQgMD09PXRoaXMud2lkdGh8fHRoaXMubGFiZWxNb2R1bGUuZGlmZmVyZW50U3RhdGUodCxlKX19LHtrZXk6XCJpbml0Q29udGV4dEZvckRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWUuYm9yZGVyV2lkdGgvdGhpcy5ib2R5LnZpZXcuc2NhbGU7dC5saW5lV2lkdGg9TWF0aC5taW4odGhpcy53aWR0aCxpKSx0LnN0cm9rZVN0eWxlPWUuYm9yZGVyQ29sb3IsdC5maWxsU3R5bGU9ZS5jb2xvcn19LHtrZXk6XCJwZXJmb3JtU3Ryb2tlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmJvcmRlcldpZHRoL3RoaXMuYm9keS52aWV3LnNjYWxlO3Quc2F2ZSgpLGk+MCYmKHRoaXMuZW5hYmxlQm9yZGVyRGFzaGVzKHQsZSksdC5zdHJva2UoKSx0aGlzLmRpc2FibGVCb3JkZXJEYXNoZXModCxlKSksdC5yZXN0b3JlKCl9fSx7a2V5OlwicGVyZm9ybUZpbGxcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuZW5hYmxlU2hhZG93KHQsZSksdC5maWxsKCksdGhpcy5kaXNhYmxlU2hhZG93KHQsZSksdGhpcy5wZXJmb3JtU3Ryb2tlKHQsZSl9fSx7a2V5OlwiX2FkZEJvdW5kaW5nQm94TWFyZ2luXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5ib3VuZGluZ0JveC5sZWZ0LT10LHRoaXMuYm91bmRpbmdCb3gudG9wLT10LHRoaXMuYm91bmRpbmdCb3guYm90dG9tKz10LHRoaXMuYm91bmRpbmdCb3gucmlnaHQrPXR9fSx7a2V5OlwiX3VwZGF0ZUJvdW5kaW5nQm94XCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt2b2lkIDAhPT1pJiZ0aGlzLnJlc2l6ZShpLG8sbiksdGhpcy5sZWZ0PXQtdGhpcy53aWR0aC8yLHRoaXMudG9wPWUtdGhpcy5oZWlnaHQvMix0aGlzLmJvdW5kaW5nQm94LmxlZnQ9dGhpcy5sZWZ0LHRoaXMuYm91bmRpbmdCb3gudG9wPXRoaXMudG9wLHRoaXMuYm91bmRpbmdCb3guYm90dG9tPXRoaXMudG9wK3RoaXMuaGVpZ2h0LHRoaXMuYm91bmRpbmdCb3gucmlnaHQ9dGhpcy5sZWZ0K3RoaXMud2lkdGh9fSx7a2V5OlwidXBkYXRlQm91bmRpbmdCb3hcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3RoaXMuX3VwZGF0ZUJvdW5kaW5nQm94KHQsZSxpLG8sbil9fSx7a2V5OlwiZ2V0RGltZW5zaW9uc0Zyb21MYWJlbFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLnRleHRTaXplPXRoaXMubGFiZWxNb2R1bGUuZ2V0VGV4dFNpemUodCxlLGkpO3ZhciBvPXRoaXMudGV4dFNpemUud2lkdGgsbj10aGlzLnRleHRTaXplLmhlaWdodDtyZXR1cm4gMD09PW8mJihvPTE0LG49MTQpLHt3aWR0aDpvLGhlaWdodDpufX19XSksdH0oKTtlLmRlZmF1bHQ9bH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDIzKSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcInJlc2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp0aGlzLnNlbGVjdGVkLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnRoaXMuaG92ZXIsbz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e3NpemU6dGhpcy5vcHRpb25zLnNpemV9O2lmKHRoaXMubmVlZHNSZWZyZXNoKGUsaSkpe3RoaXMubGFiZWxNb2R1bGUuZ2V0VGV4dFNpemUodCxlLGkpO3ZhciBuPTIqby5zaXplO3RoaXMud2lkdGg9bix0aGlzLmhlaWdodD1uLHRoaXMucmFkaXVzPS41KnRoaXMud2lkdGh9fX0se2tleTpcIl9kcmF3U2hhcGVcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyxyLGEpe2lmKHRoaXMucmVzaXplKHQscyxyLGEpLHRoaXMubGVmdD1vLXRoaXMud2lkdGgvMix0aGlzLnRvcD1uLXRoaXMuaGVpZ2h0LzIsdGhpcy5pbml0Q29udGV4dEZvckRyYXcodCxhKSx0W2VdKG8sbixhLnNpemUpLHRoaXMucGVyZm9ybUZpbGwodCxhKSx2b2lkIDAhPT10aGlzLm9wdGlvbnMubGFiZWwpe3RoaXMubGFiZWxNb2R1bGUuY2FsY3VsYXRlTGFiZWxTaXplKHQscyxyLG8sbixcImhhbmdpbmdcIik7dmFyIGg9bisuNSp0aGlzLmhlaWdodCsuNSp0aGlzLmxhYmVsTW9kdWxlLnNpemUuaGVpZ2h0O3RoaXMubGFiZWxNb2R1bGUuZHJhdyh0LG8saCxzLHIsXCJoYW5naW5nXCIpfXRoaXMudXBkYXRlQm91bmRpbmdCb3gobyxuKX19LHtrZXk6XCJ1cGRhdGVCb3VuZGluZ0JveFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5ib3VuZGluZ0JveC50b3A9ZS10aGlzLm9wdGlvbnMuc2l6ZSx0aGlzLmJvdW5kaW5nQm94LmxlZnQ9dC10aGlzLm9wdGlvbnMuc2l6ZSx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PXQrdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5ib3R0b209ZSt0aGlzLm9wdGlvbnMuc2l6ZSx2b2lkIDAhPT10aGlzLm9wdGlvbnMubGFiZWwmJnRoaXMubGFiZWxNb2R1bGUuc2l6ZS53aWR0aD4wJiYodGhpcy5ib3VuZGluZ0JveC5sZWZ0PU1hdGgubWluKHRoaXMuYm91bmRpbmdCb3gubGVmdCx0aGlzLmxhYmVsTW9kdWxlLnNpemUubGVmdCksdGhpcy5ib3VuZGluZ0JveC5yaWdodD1NYXRoLm1heCh0aGlzLmJvdW5kaW5nQm94LnJpZ2h0LHRoaXMubGFiZWxNb2R1bGUuc2l6ZS5sZWZ0K3RoaXMubGFiZWxNb2R1bGUuc2l6ZS53aWR0aCksdGhpcy5ib3VuZGluZ0JveC5ib3R0b209TWF0aC5tYXgodGhpcy5ib3VuZGluZ0JveC5ib3R0b20sdGhpcy5ib3VuZGluZ0JveC5ib3R0b20rdGhpcy5sYWJlbE1vZHVsZS5zaXplLmhlaWdodCkpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSg3OCksbj1pKDUxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8obih0KSl9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgyMCksbj1pKDM5KTt0LmV4cG9ydHM9aSgyMSk/ZnVuY3Rpb24odCxlLGkpe3JldHVybiBvLmYodCxlLG4oMSxpKSl9OmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdFtlXT1pLHR9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgzMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFvKHQpKXRocm93IFR5cGVFcnJvcih0K1wiIGlzIG5vdCBhbiBvYmplY3QhXCIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiEhdCgpfWNhdGNoKHQpe3JldHVybiEwfX19LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9e2RlZmF1bHQ6aSgxMzgpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZS5fX2VzTW9kdWxlPSEwO3ZhciBuPWkoMTg4KSxzPW8obikscj1pKDc3KSxhPW8ocik7ZS5kZWZhdWx0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciBpPVtdLG89ITAsbj0hMSxzPXZvaWQgMDt0cnl7Zm9yKHZhciByLGg9KDAsYS5kZWZhdWx0KSh0KTshKG89KHI9aC5uZXh0KCkpLmRvbmUpJiYoaS5wdXNoKHIudmFsdWUpLCFlfHxpLmxlbmd0aCE9PWUpO289ITApO31jYXRjaCh0KXtuPSEwLHM9dH1maW5hbGx5e3RyeXshbyYmaC5yZXR1cm4mJmgucmV0dXJuKCl9ZmluYWxseXtpZihuKXRocm93IHN9fXJldHVybiBpfXJldHVybiBmdW5jdGlvbihlLGkpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGU7aWYoKDAscy5kZWZhdWx0KShPYmplY3QoZSkpKXJldHVybiB0KGUsaSk7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2VcIil9fSgpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIHQ/bnVsbCE9PXQ6XCJmdW5jdGlvblwiPT10eXBlb2YgdH19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDg0KSxuPWkoNTgpO3QuZXhwb3J0cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24odCl7cmV0dXJuIG8odCxuKX19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpKXt0aGlzLng9dm9pZCAwIT09dD90OjAsdGhpcy55PXZvaWQgMCE9PWU/ZTowLHRoaXMuej12b2lkIDAhPT1pP2k6MH1vLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSl7dmFyIGk9bmV3IG87cmV0dXJuIGkueD10LngtZS54LGkueT10LnktZS55LGkuej10LnotZS56LGl9LG8uYWRkPWZ1bmN0aW9uKHQsZSl7dmFyIGk9bmV3IG87cmV0dXJuIGkueD10LngrZS54LGkueT10LnkrZS55LGkuej10LnorZS56LGl9LG8uYXZnPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBvKCh0LngrZS54KS8yLCh0LnkrZS55KS8yLCh0LnorZS56KS8yKX0sby5jcm9zc1Byb2R1Y3Q9ZnVuY3Rpb24odCxlKXt2YXIgaT1uZXcgbztyZXR1cm4gaS54PXQueSplLnotdC56KmUueSxpLnk9dC56KmUueC10LngqZS56LGkuej10LngqZS55LXQueSplLngsaX0sby5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueil9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7dmFyIG8sbixzOyFmdW5jdGlvbihpLHIpe249W10sbz1yLHZvaWQgMCE9PShzPVwiZnVuY3Rpb25cIj09dHlwZW9mIG8/by5hcHBseShlLG4pOm8pJiYodC5leHBvcnRzPXMpfSgwLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgZSxpPXQmJnQucHJldmVudERlZmF1bHR8fCExLG89dCYmdC5jb250YWluZXJ8fHdpbmRvdyxuPXt9LHM9e2tleWRvd246e30sa2V5dXA6e319LHI9e307Zm9yKGU9OTc7ZTw9MTIyO2UrKylyW1N0cmluZy5mcm9tQ2hhckNvZGUoZSldPXtjb2RlOmUtOTcrNjUsc2hpZnQ6ITF9O2ZvcihlPTY1O2
21167U8PTkwO2UrKylyW1N0cmluZy5mcm9tQ2hhckNvZGUoZSldPXtjb2RlOmUsc2hpZnQ6ITB9O2ZvcihlPTA7ZTw9OTtlKyspcltcIlwiK2VdPXtjb2RlOjQ4K2Usc2hpZnQ6ITF9O2ZvcihlPTE7ZTw9MTI7ZSsrKXJbXCJGXCIrZV09e2NvZGU6MTExK2Usc2hpZnQ6ITF9O2ZvcihlPTA7ZTw9OTtlKyspcltcIm51bVwiK2VdPXtjb2RlOjk2K2Usc2hpZnQ6ITF9O3JbXCJudW0qXCJdPXtjb2RlOjEwNixzaGlmdDohMX0scltcIm51bStcIl09e2NvZGU6MTA3LHNoaWZ0OiExfSxyW1wibnVtLVwiXT17Y29kZToxMDksc2hpZnQ6ITF9LHJbXCJudW0vXCJdPXtjb2RlOjExMSxzaGlmdDohMX0scltcIm51bS5cIl09e2NvZGU6MTEwLHNoaWZ0OiExfSxyLmxlZnQ9e2NvZGU6Mzcsc2hpZnQ6ITF9LHIudXA9e2NvZGU6Mzgsc2hpZnQ6ITF9LHIucmlnaHQ9e2NvZGU6Mzksc2hpZnQ6ITF9LHIuZG93bj17Y29kZTo0MCxzaGlmdDohMX0sci5zcGFjZT17Y29kZTozMixzaGlmdDohMX0sci5lbnRlcj17Y29kZToxMyxzaGlmdDohMX0sci5zaGlmdD17Y29kZToxNixzaGlmdDp2b2lkIDB9LHIuZXNjPXtjb2RlOjI3LHNoaWZ0OiExfSxyLmJhY2tzcGFjZT17Y29kZTo4LHNoaWZ0OiExfSxyLnRhYj17Y29kZTo5LHNoaWZ0OiExfSxyLmN0cmw9e2NvZGU6MTcsc2hpZnQ6ITF9LHIuYWx0PXtjb2RlOjE4LHNoaWZ0OiExfSxyLmRlbGV0ZT17Y29kZTo0NixzaGlmdDohMX0sci5wYWdldXA9e2NvZGU6MzMsc2hpZnQ6ITF9LHIucGFnZWRvd249e2NvZGU6MzQsc2hpZnQ6ITF9LHJbXCI9XCJdPXtjb2RlOjE4NyxzaGlmdDohMX0scltcIi1cIl09e2NvZGU6MTg5LHNoaWZ0OiExfSxyW1wiXVwiXT17Y29kZToyMjEsc2hpZnQ6ITF9LHJbXCJbXCJdPXtjb2RlOjIxOSxzaGlmdDohMX07dmFyIGE9ZnVuY3Rpb24odCl7ZCh0LFwia2V5ZG93blwiKX0saD1mdW5jdGlvbih0KXtkKHQsXCJrZXl1cFwiKX0sZD1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PXNbZV1bdC5rZXlDb2RlXSl7Zm9yKHZhciBvPXNbZV1bdC5rZXlDb2RlXSxuPTA7bjxvLmxlbmd0aDtuKyspdm9pZCAwPT09b1tuXS5zaGlmdD9vW25dLmZuKHQpOjE9PW9bbl0uc2hpZnQmJjE9PXQuc2hpZnRLZXk/b1tuXS5mbih0KTowPT1vW25dLnNoaWZ0JiYwPT10LnNoaWZ0S2V5JiZvW25dLmZuKHQpOzE9PWkmJnQucHJldmVudERlZmF1bHQoKX19O3JldHVybiBuLmJpbmQ9ZnVuY3Rpb24odCxlLGkpe2lmKHZvaWQgMD09PWkmJihpPVwia2V5ZG93blwiKSx2b2lkIDA9PT1yW3RdKXRocm93IG5ldyBFcnJvcihcInVuc3VwcG9ydGVkIGtleTogXCIrdCk7dm9pZCAwPT09c1tpXVtyW3RdLmNvZGVdJiYoc1tpXVtyW3RdLmNvZGVdPVtdKSxzW2ldW3JbdF0uY29kZV0ucHVzaCh7Zm46ZSxzaGlmdDpyW3RdLnNoaWZ0fSl9LG4uYmluZEFsbD1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPVwia2V5ZG93blwiKTtmb3IodmFyIGkgaW4gcilyLmhhc093blByb3BlcnR5KGkpJiZuLmJpbmQoaSx0LGUpfSxuLmdldEtleT1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gcilpZihyLmhhc093blByb3BlcnR5KGUpKXtpZigxPT10LnNoaWZ0S2V5JiYxPT1yW2VdLnNoaWZ0JiZ0LmtleUNvZGU9PXJbZV0uY29kZSlyZXR1cm4gZTtpZigwPT10LnNoaWZ0S2V5JiYwPT1yW2VdLnNoaWZ0JiZ0LmtleUNvZGU9PXJbZV0uY29kZSlyZXR1cm4gZTtpZih0LmtleUNvZGU9PXJbZV0uY29kZSYmXCJzaGlmdFwiPT1lKXJldHVybi
21167BlfXJldHVyblwidW5rbm93biBrZXksIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkXCJ9LG4udW5iaW5kPWZ1bmN0aW9uKHQsZSxpKXtpZih2b2lkIDA9PT1pJiYoaT1cImtleWRvd25cIiksdm9pZCAwPT09clt0XSl0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZCBrZXk6IFwiK3QpO2lmKHZvaWQgMCE9PWUpe3ZhciBvPVtdLG49c1tpXVtyW3RdLmNvZGVdO2lmKHZvaWQgMCE9PW4pZm9yKHZhciBhPTA7YTxuLmxlbmd0aDthKyspblthXS5mbj09ZSYmblthXS5zaGlmdD09clt0XS5zaGlmdHx8by5wdXNoKHNbaV1bclt0XS5jb2RlXVthXSk7c1tpXVtyW3RdLmNvZGVdPW99ZWxzZSBzW2ldW3JbdF0uY29kZV09W119LG4ucmVzZXQ9ZnVuY3Rpb24oKXtzPXtrZXlkb3duOnt9LGtleXVwOnt9fX0sbi5kZXN0cm95PWZ1bmN0aW9uKCl7cz17a2V5ZG93bjp7fSxrZXl1cDp7fX0sby5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLGEsITApLG8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsaCwhMCl9LG8uYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIixhLCEwKSxvLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLGgsITApLG59cmV0dXJuIHR9KX0sZnVuY3Rpb24odCxlLGkpe2UuY29udmVydEhpZGRlbk9wdGlvbnM9ZnVuY3Rpb24odCxpLG8pe2lmKG8mJiFBcnJheS5pc0FycmF5KG8pKXJldHVybiBlLmNvbnZlcnRIaWRkZW5PcHRpb25zKHQsaSxbb10pO2lmKGkuaGlkZGVuRGF0ZXM9W10sbyYmMT09QXJyYXkuaXNBcnJheShvKSl7Zm9yKHZhciBuPTA7bjxvLmxlbmd0aDtuKyspaWYodm9pZCAwPT09b1tuXS5yZXBlYXQpe3ZhciBzPXt9O3Muc3RhcnQ9dChvW25dLnN0YXJ0KS50b0RhdGUoKS52YWx1ZU9mKCkscy5lbmQ9dChvW25dLmVuZCkudG9EYXRlKCkudmFsdWVPZigpLGkuaGlkZGVuRGF0ZXMucHVzaChzKX1pLmhpZGRlbkRhdGVzLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5zdGFydC1lLnN0YXJ0fSl9fSxlLnVwZGF0ZUhpZGRlbkRhdGVzPWZ1bmN0aW9uKHQsaSxvKXtpZihvJiYhQXJyYXkuaXNBcnJheShvKSlyZXR1cm4gZS51cGRhdGVIaWRkZW5EYXRlcyh0LGksW29dKTtpZihvJiZ2b2lkIDAhPT1pLmRvbVByb3BzLmNlbnRlckNvbnRhaW5lci53aWR0aCl7ZS5jb252ZXJ0SGlkZGVuT3B0aW9ucyh0LGksbyk7Zm9yKHZhciBuPXQoaS5yYW5nZS5zdGFydCkscz10KGkucmFuZ2UuZW5kKSxyPWkucmFuZ2UuZW5kLWkucmFuZ2Uuc3RhcnQsYT1yL2kuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLndpZHR
21167oLGg9MDtoPG8ubGVuZ3RoO2grKylpZih2b2lkIDAhPT1vW2hdLnJlcGVhdCl7dmFyIGQ9dChvW2hdLnN0YXJ0KSxsPXQob1toXS5lbmQpO2lmKFwiSW52YWxpZCBEYXRlXCI9PWQuX2QpdGhyb3cgbmV3IEVycm9yKFwiU3VwcGxpZWQgc3RhcnQgZGF0ZSBpcyBub3QgdmFsaWQ6IFwiK29baF0uc3RhcnQpO2lmKFwiSW52YWxpZCBEYXRlXCI9PWwuX2QpdGhyb3cgbmV3IEVycm9yKFwiU3VwcGxpZWQgZW5kIGRhdGUgaXMgbm90IHZhbGlkOiBcIitvW2hdLmVuZCk7dmFyIHU9bC1kO2lmKHU+PTQqYSl7dmFyIGM9MCxwPXMuY2xvbmUoKTtzd2l0Y2gob1toXS5yZXBlYXQpe2Nhc2VcImRhaWx5XCI6ZC5kYXkoKSE9bC5kYXkoKSYmKGM9MSksZC5kYXlPZlllYXIobi5kYXlPZlllYXIoKSksZC55ZWFyKG4ueWVhcigpKSxkLnN1YnRyYWN0KDcsXCJkYXlzXCIpLGwuZGF5T2ZZZWFyKG4uZGF5T2ZZZWFyKCkpLGwueWVhcihuLnllYXIoKSksbC5zdWJ0cmFjdCg3LWMsXCJkYXlzXCIpLHAuYWRkKDEsXCJ3ZWVrc1wiKTticmVhaztjYXNlXCJ3ZWVrbHlcIjp2YXIgZj1sLmRpZmYoZCxcImRheXNcIiksbT1kLmRheSgpO2QuZGF0ZShuLmRhdGUoKSksZC5tb250aChuLm1vbnRoKCkpLGQueWVhcihuLnllYXIoKSksbD1kLmNsb25lKCksZC5kYXkobSksbC5kYXkobSksbC5hZGQoZixcImRheXNcIiksZC5zdWJ0cmFjdCgxLFwid2Vla3NcIiksbC5zdWJ0cmFjdCgxLFwid2Vla3NcIikscC5hZGQoMSxcIndlZWtzXCIpO2JyZWFrO2Nhc2VcIm1vbnRobHlcIjpkLm1vbnRoKCkhPWwubW9udGgoKSYmKGM9MSksZC5tb250aChuLm1vbnRoKCkpLGQueWVhcihuLnllYXIoKSksZC5zdWJ0cmFjdCgxLFwibW9udGhzXCIpLGwubW9udGgobi5tb250aCgpKSxsLnllYXIobi55ZWFyKCkpLGwuc3VidHJhY3QoMSxcIm1vbnRoc1wiKSxsLmFkZChjLFwibW9udGhzXCIpLHAuYWRkKDEsXCJtb250aHNcIik7YnJlYWs7Y2FzZVwieWVhcmx5XCI6ZC55ZWFyKCkhPWwueWVhcigpJiYoYz0xKSxkLnllYXIobi55ZWFyKCkpLGQuc3VidHJhY3QoMSxcInllYXJzXCIpLGwueWVhcihuLnllYXIoKSksbC5zdWJ0cmFjdCgxLFwieWVhcnNcIiksbC5hZGQoYyxcInllYXJzXCIpLHAuYWRkKDEsXCJ5ZWFyc1wiKTticmVhaztkZWZhdWx0OnJldHVybiB2b2lkIGNvbnNvbGUubG9nKFwiV3JvbmcgcmVwZWF0IGZvcm1hdCwgYWxsb3dlZCBhcmU6IGRhaWx5LCB3ZWVrbHksIG1vbnRobHksIHllYXJseS4gR2l2ZW46XCIsb1toXS5yZXBlYXQpfWZvcig7ZDxwOylzd2l0Y2goaS5oaWRkZW5EYXRlcy5wdXNoKHtzdGFydDpkLnZhbHVlT2YoKSxlbmQ6bC52YWx1ZU9mKCl9KSxvW2hdLnJlcGVhdCl7Y2FzZVwiZGFpbHlcIjpkLmFkZCgxLFwiZGF5c1wiKSxsLmFkZCgxLFwiZGF5c1wiKTticmVhaztjYXNlXCJ3ZWVrbHlcIjpkLmFkZCgxLFwid2Vla3NcIiksbC5hZGQoMSxcIndlZWtzXCIpO2JyZWFrO2Nhc2VcIm1vbnRobHlcIjpkLmFkZCgxLFwibW9udGhzXCIpLGwuYWRkKDEsXCJtb250aHNcIik7YnJlYWs7Y2FzZVwieWVhcmx5XCI6ZC5hZGQoMSxcInlcIiksbC5hZGQoMSxcInlcIik7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdm9pZCBjb25zb2xlLmxvZyhcIldyb25nIHJlcGVhdCBmb3JtYXQsIGFsbG93ZWQgYXJlOiBkYWlseSwgd2Vla2x5LCBtb250aGx5LCB5ZWFybHkuIEdpdmVuOlwiLG9baF0ucmVwZWF0KX1pLmhpZGRlbkRhdGVzLnB1c2goe3N0YXJ0OmQudmFsdWVPZigpLGVuZDpsLnZhbHVlT2YoKX0pfX1lLnJlbW92ZUR1cGxpY2F0ZXMoaSk7dmFyIHY9ZS5pc0hpZGRlbihpLnJhbmdlLnN0YXJ0LGkuaGlkZGVuRGF0ZXMpLGc9ZS5pc0hpZGRlbihpLnJhbmdlLmVuZCxpLmhpZGRlbkRhdGVzKSx5PWkucmFuZ2Uuc3RhcnQsYj1pLnJhbmdlLmVuZDsxPT12LmhpZGRlbiYmKHk9MT09aS5yYW5nZS5zdGFydFRvRnJvbnQ/di5zdGFydERhdGUtMTp2LmVuZERhdGUrMSksMT09Zy5oaWRkZW4mJihiPTE9PWkucmFuZ2UuZW5kVG9Gcm9udD9nLnN0YXJ0RGF0ZS0xOmcuZW5kRGF0ZSsxKSwxIT12LmhpZGRlbiYmMSE9Zy5oaWRkZW58fGkucmFuZ2UuX2FwcGx5UmFuZ2UoeSxiKX19LGUucmVtb3ZlRHVwbGljYXRlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5oaWRkZW5EYXRlcyxpPVtdLG89MDtvPGUubGVuZ3RoO28rKylmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylvIT1uJiYxIT1lW25dLnJlbW92ZSYmMSE9ZVtvXS5yZW1vdmUmJihlW25dLnN0YXJ0Pj1lW29dLnN0YXJ0JiZlW25dLmVuZDw9ZVtvXS5lbmQ/ZVtuXS5yZW1vdmU9ITA6ZVtuXS5zdGFydD49ZVtvXS5zdGFydCYmZVtuXS5zdGFydDw9ZVtvXS5lbmQ/KGVbb10uZW5kPWVbbl0uZW5kLGVbbl0ucmVtb3ZlPSEwKTplW25dLmVuZD49ZVtvXS5zdGFydCYmZVtuXS5lbmQ8PWVbb10uZW5kJiYoZVtvXS5zdGFydD1lW25dLnN0YXJ0LGVbbl0ucmVtb3ZlPSEwKSk7Zm9yKG89MDtvPGUubGVuZ3RoO28rKykhMCE9PWVbb10ucmVtb3ZlJiZpLnB1c2goZVtvXSk7dC5oaWRkZW5EYXRlcz1pLHQuaGlkZGVuRGF0ZXMuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LnN0YXJ0LWUuc3RhcnR9KX0sZS5wcmludERhdGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWNvbnNvbGUubG9nKGUsbmV3IERhdGUodFtlXS5zdGFydCksbmV3IERhdGUodFtlXS5lbmQpLHRbZV0uc3RhcnQsdFtlXS5lbmQsdFtlXS5yZW1vdmUpfSxlLnN0ZXBPdmVySGlkZGVuRGF0ZXM9ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbz0hMSxuPWUuY3VycmVudC52YWx1ZU9mKCkscz0wO3M8ZS5oaWRkZW5EYXRlcy5sZW5ndGg7cysrKXt2YXIgcj1lLmhpZGRlbkRhdGVzW3NdLnN0YXJ0LGE9ZS5oaWRkZW5EYXRlc1tzXS5lbmQ7aWYobj49ciYmbjxhKXtvPSEwO2JyZWFrfX1pZigxPT1vJiZuPGUuX2VuZC52YWx1ZU9mKCkmJm4hPWkpe3ZhciBoPXQoaSksZD10KGEpO2gueWVhcigpIT1kLnllYXIoKT9lLnN3aXRjaGVkWWVhcj0hMDpoLm1vbnRoKCkhPWQubW9udGgoKT9lLnN3aXRjaGVkTW9udGg9ITA6aC5kYXlPZlllYXIoKSE9ZC5kYXlPZlllYXIoKSYmKGUuc3dpdGNoZWREYXk9ITApLGUuY3VycmVudD1kfX0sZS50b1NjcmVlbj1mdW5jdGlvbih0LGksbyl7dmFyIG47aWYoMD09dC5ib2R5LmhpZGRlbkRhdGVzLmxlbmd0aClyZXR1cm4gbj10LnJhbmdlLmNvbnZlcnNpb24obyksKGkudmFsdWVPZigpLW4ub2Zmc2V0KSpuLnNjYWxlO3ZhciBzPWUuaXNIaWRkZW4oaSx0LmJvZHkuaGlkZGVuRGF0ZXMpOzE9PXMuaGlkZGVuJiYoaT1zLnN0YXJ0RGF0ZSk7dmFyIHI9ZS5nZXRIaWRkZW5EdXJhdGlvbkJldHdlZW4odC5ib2R5LmhpZGRlbkRhdGVzLHQucmFuZ2Uuc3RhcnQsdC5yYW5nZS5lbmQpO2lmKGk8dC5yYW5nZS5zdGFydCl7bj10LnJhbmdlLmNvbnZlcnNpb24obyxyKTt2YXIgYT1lLmdldEhpZGRlbkR1cmF0aW9uQmVmb3JlU3RhcnQodC5ib2R5LmhpZGRlbkRhdGVzLGksbi5vZmZzZXQpO3JldHVybiBpPXQub3B0aW9ucy5tb21lbnQoaSkudG9EYXRlKCkudmFsdWVPZigpLGkrPWEsLShuLm9mZnNldC1pLnZhbHVlT2YoKSkqbi5zY2FsZX1pZihpPnQucmFuZ2UuZW5kKXt2YXIgaD17c3RhcnQ6dC5yYW5nZS5zdGFydCxlbmQ6aX07cmV0dXJuIGk9ZS5jb3JyZWN0VGltZUZvckhpZGRlbih0Lm9wdGlvbnMubW9tZW50LHQuYm9keS5oaWRkZW5EYXRlcyxoLGkpLG49dC5yYW5nZS5jb252ZXJzaW9uKG8sciksKGkudmFsdWVPZigpLW4ub2Zmc2V0KSpuLnNjYWxlfXJldHVybi
21167BpPWUuY29ycmVjdFRpbWVGb3JIaWRkZW4odC5vcHRpb25zLm1vbWVudCx0LmJvZHkuaGlkZGVuRGF0ZXMsdC5yYW5nZSxpKSxuPXQucmFuZ2UuY29udmVyc2lvbihvLHIpLChpLnZhbHVlT2YoKS1uLm9mZnNldCkqbi5zY2FsZX0sZS50b1RpbWU9ZnVuY3Rpb24odCxpLG8pe2lmKDA9PXQuYm9keS5oaWRkZW5EYXRlcy5sZW5ndGgpe3ZhciBuPXQucmFuZ2UuY29udmVyc2lvbihvKTtyZXR1cm4gbmV3IERhdGUoaS9uLnNjYWxlK24ub2Zmc2V0KX12YXIgcz1lLmdldEhpZGRlbkR1cmF0aW9uQmV0d2Vlbih0LmJvZHkuaGlkZGVuRGF0ZXMsdC5yYW5nZS5zdGFydCx0LnJhbmdlLmVuZCkscj10LnJhbmdlLmVuZC10LnJhbmdlLnN0YXJ0LXMsYT1yKmkvbyxoPWUuZ2V0QWNjdW11bGF0ZWRIaWRkZW5EdXJhdGlvbih0LmJvZHkuaGlkZGVuRGF0ZXMsdC5yYW5nZSxhKTtyZXR1cm4gbmV3IERhdGUoaCthK3QucmFuZ2Uuc3RhcnQpfSxlLmdldEhpZGRlbkR1cmF0aW9uQmV0d2Vlbj1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBvPTAsbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcz10W25dLnN0YXJ0LHI9dFtuXS5lbmQ7cz49ZSYmcjxpJiYobys9ci1zKX1yZXR1cm4gb30sZS5nZXRIaWRkZW5EdXJhdGlvbkJlZm9yZVN0YXJ0PWZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG89MCxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBzPXRbbl0uc3RhcnQscj10W25dLmVuZDtzPj1lJiZyPD1pJiYobys9ci1zKX1yZXR1cm4gb30sZS5jb3JyZWN0VGltZUZvckhpZGRlbj1mdW5jdGlvbih0LGksbyxuKXtyZXR1cm4gbj10KG4pLnRvRGF0ZSgpLnZhbHVlT2YoKSxuLT1lLmdldEhpZGRlbkR1cmF0aW9uQmVmb3JlKHQsaSxvLG4pfSxlLmdldEhpZGRlbkR1cmF0aW9uQmVmb3JlPWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPTA7bz10KG8pLnRvRGF0ZSgpLnZhbHVlT2YoKTtmb3IodmFyIHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHI9ZVtzXS5zdGFydCxhPWVbc10uZW5kO3I+PWkuc3RhcnQmJmE8aS5lbmQmJm8+PWEmJihuKz1hLXIpfXJldHVybiBufSxlLmdldEFjY3VtdWxhdGVkSGlkZGVuRHVyYXRpb249ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbz0wLG49MCxzPWUuc3RhcnQscj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgYT10W3JdLnN0YXJ0LGg9dFtyXS5lbmQ7aWYoYT49ZS5zdGFydCYmaDxlLmVuZCl7aWYobis9YS1zLHM9aCxuPj1pKWJyZWFrO28rPWgtYX19cmV0dXJuIG99LGUuc25hcEF3YXlGcm9tSGlkZGVuPWZ1bmN0aW9uKHQsaSxvLG4pe3ZhciBzPWUuaXNIaWRkZW4oaSx0KTtyZXR1cm4gMT09cy5oaWRkZW4/bzwwPzE9PW4/cy5zdGFydERhdGUtKHMuZW5kRGF0ZS1pKS0xOnMuc3RhcnREYXRlLTE6MT09bj9zLmVuZERhdGUrKGktcy5zdGFydERhdGUpKzE6cy5lbmREYXRlKzE6aX0sZS5pc0hpZGRlbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldLnN0YXJ0LG49ZVtpXS5lbmQ7aWYodD49byYmdDxuKXJldHVybntoaWRkZW46ITAsc3RhcnREYXRlOm8sZW5kRGF0ZTpufX1yZXR1cm57aGlkZGVuOiExLHN0YXJ0RGF0ZTpvLGVuZERhdGU6bn19fSxmdW5jdGlvbih0LGUsaSl7ZS5vblRvdWNoPWZ1bmN0aW9uKHQsZSl7ZS5pbnB1dEhhbmRsZXI9ZnVuY3Rpb24odCl7dC5pc0ZpcnN0JiZlKHQpfSx0Lm9uKFwiaGFtbWVyLmlucHV0XCIsZS5pbnB1dEhhbmRsZXIpfSxlLm9uUmVsZWFzZT1mdW5jdGlvbih0LGUpe3JldHVybiBlLmlucHV0SGFuZGxlcj1mdW5jdGlvbih0KXt0LmlzRmluYWwmJmUodCl9LHQub24oXCJoYW1tZXIuaW5wdXRcIixlLmlucHV0SGFuZGxlcil9LGUub2ZmVG91Y2g9ZnVuY3Rpb24odCxlKXt0Lm9mZihcImhhbW1lci5pbnB1dFwiLGUuaW5wdXRIYW5kbGVyKX0sZS5vZmZSZWxlYXNlPWUub2ZmVG91Y2gsZS5kaXNhYmxlUHJldmVudERlZmF1bHRWZXJ0aWNhbGx5PWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFRvdWNoQWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuW1wicGFuLXlcIl19LHR9fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUsaSl7dGhpcy5pZD1udWxsLHRoaXMucGFyZW50PW51bGwsdGhpcy5kYXRhPXQsdGhpcy5kb209bnVsbCx0aGlzLmNvbnZlcnNpb249ZXx8e30sdGhpcy5vcHRpb25zPWl8fHt9LHRoaXMuc2VsZWN0ZWQ9ITEsdGhpcy5kaXNwbGF5ZWQ9ITEsdGhpcy5ncm91cFNob3dpbmc9ITAsdGhpcy5kaXJ0eT0hMCx0aGlzLnRvcD1udWxsLHRoaXMucmlnaHQ9bnVsbCx0aGlzLmxlZnQ9bnVsbCx0aGlzLndpZHRoPW51bGwsdGhpcy5oZWlnaHQ9bnVsbCx0aGlzLmVkaXRhYmxlPW51bGwsdGhpcy5fdXBkYXRlRWRpdFN0YXR1cygpfXZhciBzPWkoNikscj1vKHMpLGE9aSg4KSxoPW8oYSksZD1pKDEwKSxsPWkoMiksdT1pKDkpO24ucHJvdG90eXBlLnN0YWNrPSEwLG4ucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9ITAsdGhpcy5kaXJ0eT0hMCx0aGlzLmRpc3BsYXllZCYmdGhpcy5yZWRyYXcoKX0sbi5wcm90b3R5cGUudW5zZWxlY3Q9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPSExLHRoaXMuZGlydHk9ITAsdGhpcy5kaXNwbGF5ZWQmJnRoaXMucmVkcmF3KCl9LG4ucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7dm9pZCAwIT10Lmdyb3VwJiZ0aGlzLmRhdGEuZ3JvdXAhPXQuZ3JvdXAmJm51bGwhPXRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5pdGVtU2V0Ll9tb3ZlVG9Hcm91cCh0aGlzLHQuZ3JvdXApLHRoaXMucGFyZW50JiYodGhpcy5wYXJlbnQuc3RhY2tEaXJ0eT0hMCksdm9pZCAwIT10LnN1Ymdyb3VwJiZ0aGlzLmRhdGEuc3ViZ3JvdXAhPXQuc3ViZ3JvdXAmJm51bGwhPXRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5jaGFuZ2VTdWJncm91cCh0aGlzLHRoaXMuZGF0YS5zdWJncm91cCx0LnN1Ymdyb3VwKSx0aGlzLmRhdGE9dCx0aGlzLl91cGRhdGVFZGl0U3RhdHVzKCksdGhpcy5kaXJ0eT0hMCx0aGlzLmRpc3BsYXllZCYmdGhpcy5yZWRyYXcoKX0sbi5wcm90b3R5cGUuc2V0UGFyZW50PWZ1bmN0aW9uKHQpe3RoaXMuZGlzcGxheWVkPyh0aGlzLmhpZGUoKSx0aGlzLnBhcmVudD10LHRoaXMucGFyZW50JiZ0aGlzLnNob3coKSk6dGhpcy5wYXJlbnQ9dH0sbi5wcm90b3R5cGUuaXNWaXNpYmxlPWZ1bmN0aW9uKHQpe3JldHVybiExfS
21167xuLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7cmV0dXJuITF9LG4ucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbi5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7fSxuLnByb3RvdHlwZS5yZXBvc2l0aW9uWD1mdW5jdGlvbigpe30sbi5wcm90b3R5cGUucmVwb3NpdGlvblk9ZnVuY3Rpb24oKXt9LG4ucHJvdG90eXBlLl9yZXBhaW50RHJhZ0NlbnRlcj1mdW5jdGlvbigpe2lmKHRoaXMuc2VsZWN0ZWQmJnRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVUaW1lJiYhdGhpcy5kb20uZHJhZ0NlbnRlcil7dmFyIHQ9dGhpcyxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7ZS5jbGFzc05hbWU9XCJ2aXMtZHJhZy1jZW50ZXJcIixlLmRyYWdDZW50ZXJJdGVtPXRoaXM7dmFyIGk9bmV3IGQoZSk7aS5vbihcInRhcFwiLGZ1bmN0aW9uKGUpe3QucGFyZW50Lml0ZW1TZXQuYm9keS5lbWl0dGVyLmVtaXQoXCJjbGlja1wiLHtldmVudDplLGl0ZW06dC5pZH0pfSksaS5vbihcImRvdWJsZXRhcFwiLGZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5wYXJlbnQuaXRlbVNldC5fb25VcGRhdGVJdGVtKHQpLHQucGFyZW50Lml0ZW1TZXQuYm9keS5lbWl0dGVyLmVtaXQoXCJkb3VibGVDbGlja1wiLHtldmVudDplLGl0ZW06dC5pZH0pfSksdGhpcy5kb20uYm94P3RoaXMuZG9tLmRyYWdMZWZ0P3RoaXMuZG9tLmJveC5pbnNlcnRCZWZvcmUoZSx0aGlzLmRvbS5kcmFnTGVmdCk6dGhpcy5kb20uYm94LmFwcGVuZENoaWxkKGUpOnRoaXMuZG9tLnBvaW50JiZ0aGlzLmRvbS5wb2ludC5hcHBlbmRDaGlsZChlKSx0aGlzLmRvbS5kcmFnQ2VudGVyPWV9ZWxzZSF0aGlzLnNlbGVjdGVkJiZ0aGlzLmRvbS5kcmFnQ2VudGVyJiYodGhpcy5kb20uZHJhZ0NlbnRlci5wYXJlbnROb2RlJiZ0aGlzLmRvbS5kcmFnQ2VudGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZHJhZ0NlbnRlciksdGhpcy5kb20uZHJhZ0NlbnRlcj1udWxsKX0sbi5wcm90b3R5cGUuX3JlcGFpbnREZWxldGVCdXR0b249ZnVuY3Rpb24odCl7dmFyIGU9KHRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zfHxudWxsPT10aGlzLmVkaXRhYmxlKSYmdGhpcy5vcHRpb25zLmVkaXRhYmxlLnJlbW92ZXx8IXRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zJiZudWxsIT10aGlzLmVkaXRhYmxlJiZ0aGlzLmVkaXRhYmxlLnJlbW92ZTtpZih0aGlzLnNlbGVjdGVkJiZlJiYhdGhpcy5kb20uZGVsZXRlQnV0dG9uKXt2YXIgaT10aGlzLG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt0aGlzLm9wdGlvbnMucnRsP28uY2xhc3NOYW1lPVwidmlzLWRlbGV0ZS1ydGxcIjpvLmNsYXNzTmFtZT1cInZpcy1kZWxldGVcIixvLnRpdGxlPVwiRGVsZXRlIHRoaXMgaXRlbVwiLG5ldyBkKG8pLm9uKFwidGFwXCIsZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKSxpLnBhcmVudC5yZW1vdmVGcm9tRGF0YVNldChpKX0pLHQuYXBwZW5kQ2hpbGQobyksdGhpcy5kb20uZGVsZXRlQnV0dG9uPW99ZWxzZSF0aGlzLnNlbGVjdGVkJiZ0aGlzLmRvbS5kZWxldGVCdXR0b24mJih0aGlzLmRvbS5kZWxldGVCdXR0b24ucGFyZW50Tm9kZSYmdGhpcy5kb20uZGVsZXRlQnV0dG9uLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZGVsZXRlQnV0dG9uKSx0aGlzLmRvbS5kZWxldGVCdXR0b249bnVsbCl9LG4ucHJvdG90eXBlLl9yZXBhaW50T25JdGVtVXBkYXRlVGltZVRvb2x0aXA9ZnVuY3Rpb24odCl7aWYodGhpcy5vcHRpb25zLnRvb2x0aXBPbkl0ZW1VcGRhdGVUaW1lKXt2YXIgZT0odGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZVRpbWV8fCEwPT09dGhpcy5kYXRhLmVkaXRhYmxlKSYmITEhPT10aGlzLmRhdGEuZWRpdGFibGU7aWYodGhpcy5zZWxlY3RlZCYmZSYmIXRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwKXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO2kuY2xhc3NOYW1lPVwidmlzLW9uVXBkYXRlVGltZS10b29sdGlwXCIsdC5hcHBlbmRDaGlsZChpKSx0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcD1pfWVsc2UhdGhpcy5zZWxlY3RlZCYmdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAmJih0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcC5wYXJlbnROb2RlJiZ0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwKSx0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcD1udWxsKTtpZih0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcCl7dGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuc3R5bGUudmlzaWJpbGl0eT10aGlzLnBhcmVudC5pdGVtU2V0LnRvdWNoUGFyYW1zLml0ZW1Jc0RyYWdnaW5nP1widmlzaWJsZVwiOlwiaGlkZGVuXCIsdGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcC5zdHlsZS5yaWdodD10aGlzLmRvbS5jb250ZW50LnN0eWxlLnJpZ2h0OnRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwLnN0eWxlLmxlZnQ9dGhpcy5kb20uY29udGVudC5zdHlsZS5sZWZ0O3ZhciBvLG49dGhpcy5wYXJlbnQuaXRlbVNldC5ib2R5LmRvbVByb3BzLnNjcm9sbFRvcDtvPVwidG9wXCI9PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtP3RoaXMudG9wOnRoaXMucGFyZW50LmhlaWdodC10aGlzLnRvcC10aGlzLmhlaWdodDtvK3RoaXMucGFyZW50LnRvcC01MDwtbj8odGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuc3R5bGUuYm90dG9tPVwiXCIsdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuc3R5bGUudG9wPXRoaXMuaGVpZ2h0KzIrXCJweFwiKToodGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuc3R5bGUudG9wPVwiXCIsdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuc3R5bGUuYm90dG9tPXRoaXMuaGVpZ2h0KzIrXCJweFwiKTt2YXIgcyxyO3RoaXMub3B0aW9ucy50b29sdGlwT25JdGVtVXBkYXRlVGltZSYmdGhpcy5vcHRpb25zLnRvb2x0aXBPbkl0ZW1VcGRhdGVUaW1lLnRlbXBsYXRlPyhyPXRoaXMub3B0aW9ucy50b29sdGlwT25JdGVtVXBkYXRlVGltZS50ZW1wbGF0ZS5iaW5kKHRoaXMpLHM9cih0aGlzLmRhdGEpKToocz1cInN0YXJ0Oi
21167BcIit1KHRoaXMuZGF0YS5zdGFydCkuZm9ybWF0KFwiTU0vREQvWVlZWSBoaDptbVwiKSx0aGlzLmRhdGEuZW5kJiYocys9XCI8YnI+IGVuZDogXCIrdSh0aGlzLmRhdGEuZW5kKS5mb3JtYXQoXCJNTS9ERC9ZWVlZIGhoOm1tXCIpKSksdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuaW5uZXJIVE1MPXN9fX0sbi5wcm90b3R5cGUuX3VwZGF0ZUNvbnRlbnRzPWZ1bmN0aW9uKHQpe3ZhciBlLGksbyxuLHM9dGhpcy5wYXJlbnQuaXRlbVNldC5pdGVtc0RhdGEuZ2V0KHRoaXMuaWQpLHI9dGhpcy5kb20uYm94fHx0aGlzLmRvbS5wb2ludCxhPXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcInZpcy1pdGVtLXZpc2libGUtZnJhbWVcIilbMF07aWYodGhpcy5vcHRpb25zLnZpc2libGVGcmFtZVRlbXBsYXRlPyhuPXRoaXMub3B0aW9ucy52aXNpYmxlRnJhbWVUZW1wbGF0ZS5iaW5kKHRoaXMpLG89bihzLHIpKTpvPVwiXCIsYSlpZihvIGluc3RhbmNlb2YgT2JqZWN0JiYhKG8gaW5zdGFuY2VvZiBFbGVtZW50KSluKHMsYSk7ZWxzZSBpZih0aGlzLl9jb250ZW50VG9TdHJpbmcodGhpcy5pdGVtVmlzaWJsZUZyYW1lQ29udGVudCkhPT10aGlzLl9jb250ZW50VG9TdHJpbmcobykpe2lmKG8gaW5zdGFuY2VvZiBFbGVtZW50KWEuaW5uZXJIVE1MPVwiXCIsYS5hcHBlbmRDaGlsZChvKTtlbHNlIGlmKHZvaWQgMCE9bylhLmlubmVySFRNTD1vO2Vsc2UgaWYoXCJiYWNrZ3JvdW5kXCIhPXRoaXMuZGF0YS50eXBlfHx2b2lkIDAhPT10aGlzLmRhdGEuY29udGVudCl0aHJvdyBuZXcgRXJyb3IoJ1Byb3BlcnR5IFwiY29udGVudFwiIG1pc3NpbmcgaW4gaXRlbSAnK3RoaXMuaWQpO3RoaXMuaXRlbVZpc2libGVGcmFtZUNvbnRlbnQ9b31pZih0aGlzLm9wdGlvbnMudGVtcGxhdGU/KGk9dGhpcy5vcHRpb25zLnRlbXBsYXRlLmJpbmQodGhpcyksZT1pKHMsdCx0aGlzLmRhdGEpKTplPXRoaXMuZGF0YS5jb250ZW50LGUgaW5zdGFuY2VvZiBPYmplY3QmJiEoZSBpbnN0YW5jZW9mIEVsZW1lbnQpKWkocyx0KTtlbHNlIGlmKHRoaXMuX2NvbnRlbnRUb1N0cmluZyh0aGlzLmNvbnRlbnQpIT09dGhpcy5fY29udGVudFRvU3RyaW5nKGUpKXtpZihlIGluc3RhbmNlb2YgRWxlbWVudCl0LmlubmVySFRNTD1cIlwiLHQuYXBwZW5kQ2hpbGQoZSk7ZWxzZSBpZih2b2lkIDAhPWUpdC5pbm5lckhUTUw9ZTtlbHNlIGlmKFwiYmFja2dyb3VuZFwiIT10aGlzLmRhdGEudHlwZXx8dm9pZCAwIT09dGhpcy5kYXRhLmNvbnRlbnQpdGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0eSBcImNvbnRlbnRcIiBtaXNzaW5nIGluIGl0ZW0gJyt0aGlzLmlkKTt0aGlzLmNvbnRlbnQ9ZX19LG4ucHJvdG90eXBlLl91cGRhdGVEYXRhQXR0cmlidXRlcz1mdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMuZGF0YUF0dHJpYnV0ZXMmJnRoaXMub3B0aW9ucy5kYXRhQXR0cmlidXRlcy5sZW5ndGg+MCl7dmFyIGU9W107aWYoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZGF0YUF0dHJpYnV0ZXMpKWU9dGhpcy5vcHRpb25zLmRhdGFBdHRyaWJ1dGVzO2Vsc2V7aWYoXCJhbGxcIiE9dGhpcy5vcHRpb25zLmRhdGFBdHRyaWJ1dGVzKXJldHVybjtlPSgwLGguZGVmYXVsdCkodGhpcy5kYXRhKX1mb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXSxuPXRoaXMuZGF0YVtvXTtudWxsIT1uP3Quc2V0QXR0cmlidXRlKFwiZGF0YS1cIitvLG4pOnQucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1cIitvKX19fSxuLnByb3RvdHlwZS5fdXBkYXRlU3R5bGU9ZnVuY3Rpb24odCl7dGhpcy5zdHlsZSYmKGwucmVtb3ZlQ3NzVGV4dCh0LHRoaXMuc3R5bGUpLHRoaXMuc3R5bGU9bnVsbCksdGhpcy5kYXRhLnN0eWxlJiYobC5hZGRDc3NUZXh0KHQsdGhpcy5kYXRhLnN0eWxlKSx0aGlzLnN0eWxlPXRoaXMuZGF0YS5zdHlsZSl9LG4ucHJvdG90eXBlLl9jb250ZW50VG9TdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHQ/dDp0JiZcIm91dGVySFRNTFwiaW4gdD90Lm91dGVySFRNTDp0fSxuLnByb3RvdHlwZS5fdXBkYXRlRWRpdFN0YXR1cz1mdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmKFwiYm9vbGVhblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmVkaXRhYmxlP3RoaXMuZWRpdGFibGU9e3VwZGF0ZVRpbWU6dGhpcy5vcHRpb25zLmVkaXRhYmxlLHVwZGF0ZUdyb3VwOnRoaXMub3B0aW9ucy5lZGl0YWJsZSxyZW1vdmU6dGhpcy5vcHRpb25zLmVkaXRhYmxlfTpcIm9iamVjdFwiPT09KDAsci5kZWZhdWx0KSh0aGlzLm9wdGlvbnMuZWRpdGFibGUpJiYodGhpcy5lZGl0YWJsZT17fSxsLnNlbGVjdGl2ZUV4dGVuZChbXCJ1cGRhdGVUaW1lXCIsXCJ1cGRhdGVHcm91cFwiLFwicmVtb3ZlXCJdLHRoaXMuZWRpdGFibGUsdGhpcy5vcHRpb25zLmVkaXRhYmxlKSkpLHRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmVkaXRhYmxlJiYhMD09PXRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zfHx0aGlzLmRhdGEmJihcImJvb2xlYW5cIj09dHlwZW9mIHRoaXMuZGF0YS5lZGl0YWJsZT90aGlzLmVkaXRhYmxlPXt1cGRhdGVUaW1lOnRoaXMuZGF0YS5lZGl0YWJsZSx1cGRhdGVHcm91cDp0aGlzLmRhdGEuZWRpdGFibGUscmVtb3ZlOnRoaXMuZGF0YS5lZGl0YWJsZX06XCJvYmplY3RcIj09PSgwLHIuZGVmYXVsdCkodGhpcy5kYXRhLmVkaXRhYmxlKSYmKHRoaXMuZWRpdGFibGU9e30sbC5zZWxlY3RpdmVFeHRlbmQoW1widXBkYXRlVGltZVwiLFwidXBkYXRlR3JvdXBcIixcInJlbW92ZVwiXSx0aGlzLmVkaXRhYmxlLHRoaXMuZGF0YS5lZGl0YWJsZSkpKX0sbi5wcm90b3R5cGUuZ2V0V2lkdGhMZWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LG4ucHJvdG90eXBlLmdldFdpZHRoUmlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbi5wcm90b3R5cGUuZ2V0VGl0bGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhLnRpdGxlfSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm57ZW51bWVyYWJsZTohKDEmdCksY29uZmlndXJhYmxlOiEoMiZ0KSx3cml0YWJsZTohKDQmdCksdmFsdWU6ZX19fSxmdW5jdGlvbih0LGUpe3ZhciBpPTAsbz1NYXRoLnJhbmRvbSgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm5cIlN5bWJvbChcIi5jb25jYXQodm9pZCAwPT09dD9cIlwiOnQsXCIpX1wiLCgrK2krbykudG9TdHJpbmc
21167oMzYpKX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDUxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChvKHQpKX19LGZ1bmN0aW9uKHQsZSl7ZS5mPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXt0aGlzLmRlbGF5PW51bGwsdGhpcy5tYXg9MS8wLHRoaXMuX3F1ZXVlPVtdLHRoaXMuX3RpbWVvdXQ9bnVsbCx0aGlzLl9leHRlbmRlZD1udWxsLHRoaXMuc2V0T3B0aW9ucyh0KX1vLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3QmJnZvaWQgMCE9PXQuZGVsYXkmJih0aGlzLmRlbGF5PXQuZGVsYXkpLHQmJnZvaWQgMCE9PXQubWF4JiYodGhpcy5tYXg9dC5tYXgpLHRoaXMuX2ZsdXNoSWZOZWVkZWQoKX0sby5leHRlbmQ9ZnVuY3Rpb24odCxlKXt2YXIgaT1uZXcgbyhlKTtpZih2b2lkIDAhPT10LmZsdXNoKXRocm93IG5ldyBFcnJvcihcIlRhcmdldCBvYmplY3QgYWxyZWFkeSBoYXMgYSBwcm9wZXJ0eSBmbHVzaFwiKTt0LmZsdXNoPWZ1bmN0aW9uKCl7aS5mbHVzaCgpfTt2YXIgbj1be25hbWU6XCJmbHVzaFwiLG9yaWdpbmFsOnZvaWQgMH1dO2lmKGUmJmUucmVwbGFjZSlmb3IodmFyIHM9MDtzPGUucmVwbGFjZS5sZW5ndGg7cysrKXt2YXIgcj1lLnJlcGxhY2Vbc107bi5wdXNoKHtuYW1lOnIsb3JpZ2luYWw6dFtyXX0pLGkucmVwbGFjZSh0LHIpfXJldHVybiBpLl9leHRlbmRlZD17b2JqZWN0OnQsbWV0aG9kczpufSxpfSxvLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7aWYodGhpcy5mbHVzaCgpLHRoaXMuX2V4dGVuZGVkKXtmb3IodmFyIHQ9dGhpcy5fZXh0ZW5kZWQub2JqZWN0LGU9dGhpcy5fZXh0ZW5kZWQubWV0aG9kcyxpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5vcmlnaW5hbD90W28ubmFtZV09by5vcmlnaW5hbDpkZWxldGUgdFtvLm5hbWVdfXRoaXMuX2V4dGVuZGVkPW51bGx9fSxvLnByb3RvdHlwZS5yZXBsYWNlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcyxvPXRbZV07aWYoIW8pdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIFwiK2UrXCIgdW5kZWZpbmVkXCIpO3RbZV09ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07aS5xdWV1ZSh7YXJnczp0LGZuOm8sY29udGV4dDp0aGlzfSl9fSxvLnByb3RvdHlwZS5xdWV1ZT1mdW5jdGlvbih0KXtcImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3RoaXMuX3F1ZXVlLnB1c2goe2ZuOnR9KTp0aGlzLl9xdWV1ZS5wdXNoKHQpLHRoaXMuX2ZsdXNoSWZOZWVkZWQoKX0sby5wcm90b3R5cGUuX2ZsdXNoSWZOZWVkZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9xdWV1ZS5sZW5ndGg+dGhpcy5tYXgmJnRoaXMuZmx1c2goKSxjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCksdGhpcy5xdWV1ZS5sZW5ndGg+MCYmXCJudW1iZXJcIj09dHlwZW9mIHRoaXMuZGVsYXkpe3ZhciB0PXRoaXM7dGhpcy5fdGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5mbHVzaCgpfSx0aGlzLmRlbGF5KX19LG8ucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl9xdWV1ZS5sZW5ndGg+MDspe3ZhciB0PXRoaXMuX3F1ZXVlLnNoaWZ0KCk7dC5mbi5hcHBseSh0LmNvbnRleHR8fHQuZm4sdC5hcmdzfHxbXSl9fSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQpe2lmKHQpcmV0dXJuIG8odCl9ZnVuY3Rpb24gbyh0KXtmb3IodmFyIGUgaW4gaS5wcm90b3R5cGUpdFtlXT1pLnByb3RvdHlwZVtlXTtyZXR1cm4gdH10LmV4cG9ydHM9aSxpLnByb3RvdHlwZS5vbj1pLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fHt9LCh0aGlzLl9jYWxsYmFja3NbdF09dGhpcy5fY2FsbGJhY2tzW3RdfHxbXSkucHVzaChlKSx0aGlzfSxpLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSgpe28ub2ZmKHQsaSksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIG89dGhpcztyZXR1cm4gdGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e30saS5mbj1lLHRoaXMub24odCxpKSx0aGlzfSxpLnByb3RvdHlwZS5vZmY9aS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9aS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWkucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fSwwPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl9jYWxsYmFja3M9e30sdGhpczt2YXIgaT10aGlzLl9jYWxsYmFja3NbdF07aWYoIWkpcmV0dXJuIHRoaXM7aWYoMT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1t0XSx0aGlzO2Zvcih2YXIgbyxuPTA7bjxpLmxlbmd0aDtuKyspaWYoKG89aVtuXSk9PT1lfHxvLmZuPT09ZSl7aS5zcGxpY2UobiwxKTticmVha31yZXR1cm4gdGhpc30saS5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0KXt0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fTt2YXIgZT1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxpPXRoaXMuX2NhbGxiYWNrc1t0XTtpZihpKXtpPWkuc2xpY2UoMCk7Zm9yKHZhciBvPTAsbj1pLmxlbmd0aDtvPG47KytvKWlbb10uYXBwbHkodGhpcyxlKX1yZXR1cm4gdGhpc30saS5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fSx0aGlzLl9jYWxsYmFja3NbdF18fFtdfSxpLnByb3RvdHlwZS5oYXNMaXN0ZW5lcnM9ZnVuY3Rpb24odCl7cmV0dXJuISF0aGlzLmxpc3RlbmVycyh0KS5sZW5ndGh9fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUpe3RoaXMuZG9tPXtmb3JlZ3JvdW5kOm51bGwsbGluZXM6W10sbWFqb3JUZXh0czpbXSxtaW5vclRleHRzOltdLHJlZHVuZGFudDp7bGluZXM6W10sbWFqb3JUZXh0czpbXSxtaW5vclRleHRzOltdfX0sdGhpcy5wcm9wcz17cmFuZ2U6e3N0YXJ0OjAsZW5kOjAsbWluaW11bVN0ZXA6MH0sbGluZVRvcDowfSx0aGlzLmRlZmF1bHRPcHRpb25zPXtvcmllbnRhdGlvbjp7YXhpczpcImJvdHRvbVwifSxzaG93TWlub3JMYWJlbHM6ITAsc2hvd01ham9yTGFiZWxzOiEwLG1heE1pbm9yQ2hhcnM6Nyxmb3JtYXQ6aC5GT1JNQVQsbW9tZW50OmwsdGltZUF4aXM6bnVsbH0sdGhpcy5vcHRpb25zPXIuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYm9keT10LHRoaXMuX2NyZWF0ZSgpLHRoaXMuc2V0T3B0aW9ucyhlKX12YXIgbj1pKDYpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShuKSxyPWkoMiksYT1pKDE2KSxoPWkoNjYpLGQ9aSgzNiksbD1pKDk
21167pO28ucHJvdG90eXBlPW5ldyBhLG8ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7dCYmKHIuc2VsZWN0aXZlRXh0ZW5kKFtcInNob3dNaW5vckxhYmVsc1wiLFwic2hvd01ham9yTGFiZWxzXCIsXCJtYXhNaW5vckNoYXJzXCIsXCJoaWRkZW5EYXRlc1wiLFwidGltZUF4aXNcIixcIm1vbWVudFwiLFwicnRsXCJdLHRoaXMub3B0aW9ucyx0KSxyLnNlbGVjdGl2ZURlZXBFeHRlbmQoW1wiZm9ybWF0XCJdLHRoaXMub3B0aW9ucyx0KSxcIm9yaWVudGF0aW9uXCJpbiB0JiYoXCJzdHJpbmdcIj09dHlwZW9mIHQub3JpZW50YXRpb24/dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXM9dC5vcmllbnRhdGlvbjpcIm9iamVjdFwiPT09KDAscy5kZWZhdWx0KSh0Lm9yaWVudGF0aW9uKSYmXCJheGlzXCJpbiB0Lm9yaWVudGF0aW9uJiYodGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXM9dC5vcmllbnRhdGlvbi5heGlzKSksXCJsb2NhbGVcImluIHQmJihcImZ1bmN0aW9uXCI9PXR5cGVvZiBsLmxvY2FsZT9sLmxvY2FsZSh0LmxvY2FsZSk6bC5sYW5nKHQubG9jYWxlKSkpfSxvLnByb3RvdHlwZS5fY3JlYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb20uZm9yZWdyb3VuZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmJhY2tncm91bmQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5mb3JlZ3JvdW5kLmNsYXNzTmFtZT1cInZpcy10aW1lLWF4aXMgdmlzLWZvcmVncm91bmRcIix0aGlzLmRvbS5iYWNrZ3JvdW5kLmNsYXNzTmFtZT1cInZpcy10aW1lLWF4aXMgdmlzLWJhY2tncm91bmRcIn0sby5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZG9tLmZvcmVncm91bmQucGFyZW50Tm9kZSYmdGhpcy5kb20uZm9yZWdyb3VuZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmZvcmVncm91bmQpLHRoaXMuZG9tLmJhY2tncm91bmQucGFyZW50Tm9kZSYmdGhpcy5kb20uYmFja2dyb3VuZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmJhY2tncm91bmQpLHRoaXMuYm9keT1udWxsfSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dGhpcy5kb20uZm9yZWdyb3VuZCxpPXRoaXMuZG9tLmJhY2tncm91bmQsbz1cInRvcFwiPT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcz90aGlzLmJvZHkuZG9tLnRvcDp0aGlzLmJvZHkuZG9tLmJvdHRvbSxuPWUucGFyZW50Tm9kZSE9PW87dGhpcy5fY2FsY3VsYXRlQ2hhclNpemUoKVxuO3ZhciBzPXRoaXMub3B0aW9ucy5zaG93TWlub3JMYWJlbHMmJlwibm9uZVwiIT09dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXMscj10aGlzLm9wdGlvbnMuc2hvd01ham9yTGFiZWxzJiZcIm5vbmVcIiE9PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5heGlzO3QubWlub3JMYWJlbEhlaWdodD1zP3QubWlub3JDaGFySGVpZ2h0OjAsdC5tYWpvckxhYmVsSGVpZ2h0PXI/dC5tYWpvckNoYXJIZWlnaHQ6MCx0LmhlaWdodD10Lm1pbm9yTGFiZWxIZWlnaHQrdC5tYWpvckxhYmVsSGVpZ2h0LHQud2lkdGg9ZS5vZmZzZXRXaWR0aCx0Lm1pbm9yTGluZUhlaWdodD10aGlzLmJvZHkuZG9tUHJvcHMucm9vdC5oZWlnaHQtdC5tYWpvckxhYmVsSGVpZ2h0LShcInRvcFwiPT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcz90aGlzLmJvZHkuZG9tUHJvcHMuYm90dG9tLmhlaWdodDp0aGlzLmJvZHkuZG9tUHJvcHMudG9wLmhlaWdodCksdC5taW5vckxpbmVXaWR0aD0xLHQubWFqb3JMaW5lSGVpZ2h0PXQubWlub3JMaW5lSGVpZ2h0K3QubWFqb3JMYWJlbEhlaWdodCx0Lm1ham9yTGluZVdpZHRoPTE7dmFyIGE9ZS5uZXh0U2libGluZyxoPWkubmV4dFNpYmxpbmc7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLGkucGFyZW50Tm9kZSYmaS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGkpLGUuc3R5bGUuaGVpZ2h0PXRoaXMucHJvcHMuaGVpZ2h0K1wicHhcIix0aGlzLl9yZXBhaW50TGFiZWxzKCksYT9vLmluc2VydEJlZm9yZShlLGEpOm8uYXBwZW5kQ2hpbGQoZSksaD90aGlzLmJvZHkuZG9tLmJhY2tncm91bmRWZXJ0aWNhbC5pbnNlcnRCZWZvcmUoaSxoKTp0aGlzLmJvZHkuZG9tLmJhY2tncm91bmRWZXJ0aWNhbC5hcHBlbmRDaGlsZChpKSx0aGlzLl9pc1Jlc2l6ZWQoKXx8bn0sby5wcm90b3R5cGUuX3JlcGFpbnRMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcyxlPXIuY29udmVydCh0aGlzLmJvZHkucmFuZ2Uuc3RhcnQsXCJOdW1iZXJcIiksaT1yLmNvbnZlcnQodGhpcy5ib2R5LnJhbmdlLmVuZCxcIk51bWJlclwiKSxvPXRoaXMuYm9keS51dGlsLnRvVGltZSgodGhpcy5wcm9wcy5taW5vckNoYXJXaWR0aHx8MTApKnRoaXMub3B0aW9ucy5tYXhNaW5vckNoYXJzKS52YWx1ZU9mKCksbj1vLWQuZ2V0SGlkZGVuRHVyYXRpb25CZWZvcmUodGhpcy5vcHRpb25zLm1vbWVudCx0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsdGhpcy5ib2R5LnJhbmdlLG8pO24tPXRoaXMuYm9keS51dGlsLnRvVGltZSgwKS52YWx1ZU9mKCk7dmFyIHM9bmV3IGgobmV3IERhdGUoZSksbmV3IERhdGUoaSksbix0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsdGhpcy5vcHRpb25zKTtzLnNldE1vbWVudCh0aGlzLm9wdGlvbnMubW9tZW50KSx0aGlzLm9wdGlvbnMuZm9ybWF0JiZzLnNldEZvcm1hdCh0aGlzLm9wdGlvbnMuZm9ybWF0KSx0aGlzLm9wdGlvbnMudGltZUF4aXMmJnMuc2V0U2NhbGUodGhpcy5vcHRpb25zLnRpbWVBeGlzKSx0aGlzLnN0ZXA9czt2YXIgYT10aGlzLmRvbTthLnJlZHVuZGFudC5saW5lcz1hLmxpbmVzLGEucmVkdW5kYW50Lm1ham9yVGV4dHM9YS5tYWpvclRleHRzLGEucmVkdW5kYW50Lm1pbm9yVGV4dHM9YS5taW5vclRleHRzLGEubGluZXM9W10sYS5tYWpvclRleHRzPVtdLGEubWlub3JUZXh0cz1bXTt2YXIgbCxjLHAsZixtLHYsZyx5LGIsXz0wLHc9dm9pZCAwLHg9MDtmb3Iocy5zdGFydCgpLGw9cy5nZXRDdXJyZW50KCkscD10aGlzLmJvZHkudXRpbC50b1NjcmVlbihsKTtzLmhhc05leHQoKSYmeDwxZTM7KXtzd2l0Y2goeCsrLGY9cy5pc01ham9yKCksYj1zLmdldENsYXNzTmFtZSgpLHk9cy5nZXRMYWJlbE1pbm9yKCksbCxjPXAscy5uZXh0KCksbD1zLmdldEN1cnJlbnQoKSxzLmlzTWFqb3IoKSxwPXRoaXMuYm9keS51dGlsLnRvU2NyZWVuKGwpLHY9XyxfPXAtYyxzLnNjYWxlKXtjYXNlXCJ3ZWVrXCI6bT0hMDticmVhaztkZWZhdWx0Om09Xz49LjQqdn1pZih0aGlzLm9wdGlvbnMuc2hvd01pbm9yTGFiZWxzJiZtKXt2YXIgaz10aGlzLl9yZXBhaW50TWlub3JUZXh0KGMseSx0LGIpO2suc3R5bGUud2lkdGg9XytcInB4XCJ9ZiYmdGhpcy5vcHRpb25zLnNob3dNYWpvckxhYmVscz8oYz4wJiYodm9p
21167ZCAwPT13JiYodz1jKSxrPXRoaXMuX3JlcGFpbnRNYWpvclRleHQoYyxzLmdldExhYmVsTWFqb3IoKSx0LGIpKSxnPXRoaXMuX3JlcGFpbnRNYWpvckxpbmUoYyxfLHQsYikpOm0/Zz10aGlzLl9yZXBhaW50TWlub3JMaW5lKGMsXyx0LGIpOmcmJihnLnN0eWxlLndpZHRoPXBhcnNlSW50KGcuc3R5bGUud2lkdGgpK18rXCJweFwiKX1pZigxZTMhPT14fHx1fHwoY29uc29sZS53YXJuKFwiU29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIFRpbWVsaW5lIHNjYWxlLiBMaW1pdGVkIGRyYXdpbmcgb2YgZ3JpZCBsaW5lcyB0byAxMDAwIGxpbmVzLlwiKSx1PSEwKSx0aGlzLm9wdGlvbnMuc2hvd01ham9yTGFiZWxzKXt2YXIgUz10aGlzLmJvZHkudXRpbC50b1RpbWUoMCksRD1zLmdldExhYmVsTWFqb3IoUyksTT1ELmxlbmd0aCoodGhpcy5wcm9wcy5tYWpvckNoYXJXaWR0aHx8MTApKzEwOyh2b2lkIDA9PXd8fE08dykmJnRoaXMuX3JlcGFpbnRNYWpvclRleHQoMCxELHQsYil9ci5mb3JFYWNoKHRoaXMuZG9tLnJlZHVuZGFudCxmdW5jdGlvbih0KXtmb3IoO3QubGVuZ3RoOyl7dmFyIGU9dC5wb3AoKTtlJiZlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKX19KX0sby5wcm90b3R5cGUuX3JlcGFpbnRNaW5vclRleHQ9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49dGhpcy5kb20ucmVkdW5kYW50Lm1pbm9yVGV4dHMuc2hpZnQoKTtpZighbil7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLG4uYXBwZW5kQ2hpbGQocyksdGhpcy5kb20uZm9yZWdyb3VuZC5hcHBlbmRDaGlsZChuKX1yZXR1cm4gdGhpcy5kb20ubWlub3JUZXh0cy5wdXNoKG4pLG4uaW5uZXJIVE1MPWUsbi5zdHlsZS50b3A9XCJ0b3BcIj09aT90aGlzLnByb3BzLm1ham9yTGFiZWxIZWlnaHQrXCJweFwiOlwiMFwiLHRoaXMub3B0aW9ucy5ydGw/KG4uc3R5bGUubGVmdD1cIlwiLG4uc3R5bGUucmlnaHQ9dCtcInB4XCIpOm4uc3R5bGUubGVmdD10K1wicHhcIixuLmNsYXNzTmFtZT1cInZpcy10ZXh0IHZpcy1taW5vciBcIitvLG59LG8ucHJvdG90eXBlLl9yZXBhaW50TWFqb3JUZXh0PWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPXRoaXMuZG9tLnJlZHVuZGFudC5tYWpvclRleHRzLnNoaWZ0KCk7aWYoIW4pe3ZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLG4uYXBwZW5kQ2hpbGQocyksdGhpcy5kb20uZm9yZWdyb3VuZC5hcHBlbmRDaGlsZChuKX1yZXR1cm4gbi5jaGlsZE5vZGVzWzBdLmlubmVySFRNTD1lLG4uY2xhc3NOYW1lPVwidmlzLXRleHQgdmlzLW1ham9yIFwiK28sbi5zdHlsZS50b3A9XCJ0b3BcIj09aT9cIjBcIjp0aGlzLnByb3BzLm1pbm9yTGFiZWxIZWlnaHQrXCJweFwiLHRoaXMub3B0aW9ucy5ydGw/KG4uc3R5bGUubGVmdD1cIlwiLG4uc3R5bGUucmlnaHQ9dCtcInB4XCIpOm4uc3R5bGUubGVmdD10K1wicHhcIix0aGlzLmRvbS5tYWpvclRleHRzLnB1c2gobiksbn0sby5wcm90b3R5cGUuX3JlcGFpbnRNaW5vckxpbmU9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49dGhpcy5kb20ucmVkdW5kYW50LmxpbmVzLnNoaWZ0KCk7bnx8KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5iYWNrZ3JvdW5kLmFwcGVuZENoaWxkKG4pKSx0aGlzLmRvbS5saW5lcy5wdXNoKG4pO3ZhciBzPXRoaXMucHJvcHM7cmV0dXJuIG4uc3R5bGUudG9wPVwidG9wXCI9PWk/cy5tYWpvckxhYmVsSGVpZ2h0K1wicHhcIjp0aGlzLmJvZHkuZG9tUHJvcHMudG9wLmhlaWdodCtcInB4XCIsbi5zdHlsZS5oZWlnaHQ9cy5taW5vckxpbmVIZWlnaHQrXCJweFwiLHRoaXMub3B0aW9ucy5ydGw/KG4uc3R5bGUubGVmdD1cIlwiLG4uc3R5bGUucmlnaHQ9dC1zLm1pbm9yTGluZVdpZHRoLzIrXCJweFwiLG4uY2xhc3NOYW1lPVwidmlzLWdyaWQgdmlzLXZlcnRpY2FsLXJ0bCB2aXMtbWlub3IgXCIrbyk6KG4uc3R5bGUubGVmdD10LXMubWlub3JMaW5lV2lkdGgvMitcInB4XCIsbi5jbGFzc05hbWU9XCJ2aXMtZ3JpZCB2aXMtdmVydGljYWwgdmlzLW1pbm9yIFwiK28pLG4uc3R5bGUud2lkdGg9ZStcInB4XCIsbn0sby5wcm90b3R5cGUuX3JlcGFpbnRNYWpvckxpbmU9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49dGhpcy5kb20ucmVkdW5kYW50LmxpbmVzLnNoaWZ0KCk7bnx8KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5iYWNrZ3JvdW5kLmFwcGVuZENoaWxkKG4pKSx0aGlzLmRvbS5saW5lcy5wdXNoKG4pO3ZhciBzPXRoaXMucHJvcHM7cmV0dXJuIG4uc3R5bGUudG9wPVwidG9wXCI9PWk/XCIwXCI6dGhpcy5ib2R5LmRvbVByb3BzLnRvcC5oZWlnaHQrXCJweFwiLHRoaXMub3B0aW9ucy5ydGw/KG4uc3R5bGUubGVmdD1cIlwiLG4uc3R5bGUucmlnaHQ9dC1zLm1ham9yTGluZVdpZHRoLzIrXCJweFwiLG4uY2xhc3NOYW1lPVwidmlzLWdyaWQgdmlzLXZlcnRpY2FsLXJ0bCB2aXMtbWFqb3IgXCIrbyk6KG4uc3R5bGUubGVmdD10LXMubWFqb3JMaW5lV2lkdGgvMitcInB4XCIsbi5jbGFzc05hbWU9XCJ2aXMtZ3JpZCB2aXMtdmVydGljYWwgdmlzLW1ham9yIFwiK28pLG4uc3R5bGUuaGVpZ2h0PXMubWFqb3JMaW5lSGVpZ2h0K1wicHhcIixuLnN0eWxlLndpZHRoPWUrXCJweFwiLG59LG8ucHJvdG90eXBlLl9jYWxjdWxhdGVDaGFyU2l6ZT1mdW5jdGlvbigpe3RoaXMuZG9tLm1lYXN1cmVDaGFyTWlub3J8fCh0aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJESVZcIiksdGhpcy5kb20ubWVhc3VyZUNoYXJNaW5vci5jbGFzc05hbWU9XCJ2aXMtdGV4dCB2aXMtbWlub3IgdmlzLW1lYXN1cmVcIix0aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIix0aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiMFwiKSksdGhpcy5kb20uZm9yZWdyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yKSksdGhpcy5wcm9wcy5taW5vckNoYXJIZWlnaHQ9dGhpcy5kb20ubWVhc3VyZUNoYXJNaW5vci5jbGllbnRIZWlnaHQsdGhpcy5wcm9wcy5taW5vckNoYXJXaWR0aD10aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yLmNsaWVudFdpZHRoLHRoaXMuZG9tLm1lYXN1cmVDaGFyTWFqb3J8fCh0aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJESVZcIiksdGhpcy5kb20ubWVhc3VyZUNoYXJNYWpvci5jbGFzc05hbWU9XCJ2aXMtdGV4dCB2aXMtbWFqb3IgdmlzLW1lYXN1cmVcIix0aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIix0aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiMFwiKSksdGhpcy5kb20uZm9yZWdyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yKSksdGhpcy5wcm9wcy5tYWpvckNoYXJIZWlnaHQ9dGhpcy5kb20ubWVhc3VyZUNoYXJNYWpvci5jbGllbnRIZWlnaHQsdGhpcy5wcm9wcy5tYWpvckNoYXJXaWR0aD10aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yLmNsaWVudFdpZHRofTt2YXIgdT0hMTt0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt0aGlzLmJvZHk9dCx0aGlzLmRlZmF1bHRPcHRpb25zPXttb21lbnQ6YSxsb2NhbGVzOmgsbG9jYWxlOlwiZW5cIixpZDp2b2lkIDAsdGl0bGU6dm9p
21167ZCAwfSx0aGlzLm9wdGlvbnM9cy5leHRlbmQoe30sdGhpcy5kZWZhdWx0T3B0aW9ucyksZSYmZS50aW1lP3RoaXMuY3VzdG9tVGltZT1lLnRpbWU6dGhpcy5jdXN0b21UaW1lPW5ldyBEYXRlLHRoaXMuZXZlbnRQYXJhbXM9e30sdGhpcy5zZXRPcHRpb25zKGUpLHRoaXMuX2NyZWF0ZSgpfXZhciBuPWkoMTApLHM9aSgyKSxyPWkoMTYpLGE9aSg5KSxoPWkoOTgpO28ucHJvdG90eXBlPW5ldyByLG8ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7dCYmcy5zZWxlY3RpdmVFeHRlbmQoW1wibW9tZW50XCIsXCJsb2NhbGVcIixcImxvY2FsZXNcIixcImlkXCJdLHRoaXMub3B0aW9ucyx0KX0sby5wcm90b3R5cGUuX2NyZWF0ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5ib2R5LnJhbmdlLl9vbk1vdXNlV2hlZWwodCl9dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtlW1wiY3VzdG9tLXRpbWVcIl09dGhpcyxlLmNsYXNzTmFtZT1cInZpcy1jdXN0b20tdGltZSBcIisodGhpcy5vcHRpb25zLmlkfHxcIlwiKSxlLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIixlLnN0eWxlLnRvcD1cIjBweFwiLGUuc3R5bGUuaGVpZ2h0PVwiMTAwJVwiLHRoaXMuYmFyPWU7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtpLnN0eWxlLnBvc2l0aW9uPVwicmVsYXRpdmVcIixpLnN0eWxlLnRvcD1cIjBweFwiLGkuc3R5bGUubGVmdD1cIi0xMHB4XCIsaS5zdHlsZS5oZWlnaHQ9XCIxMDAlXCIsaS5zdHlsZS53aWR0aD1cIjIwcHhcIixpLmFkZEV2ZW50TGlzdGVuZXI/KGkuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNld2hlZWxcIix0LmJpbmQodGhpcyksITEpLGkuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTU1vdXNlU2Nyb2xsXCIsdC5iaW5kKHRoaXMpLCExKSk6aS5hdHRhY2hFdmVudChcIm9ubW91c2V3aGVlbFwiLHQuYmluZCh0aGlzKSksZS5hcHBlbmRDaGlsZChpKSx0aGlzLmhhbW1lcj1uZXcgbihpKSx0aGlzLmhhbW1lci5vbihcInBhbnN0YXJ0XCIsdGhpcy5fb25EcmFnU3RhcnQuYmluZCh0aGlzKSksdGhpcy5oYW1tZXIub24oXCJwYW5tb3ZlXCIsdGhpcy5fb25EcmFnLmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLm9uKFwicGFuZW5kXCIsdGhpcy5fb25EcmFnRW5kLmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLmdldChcInBhblwiKS5zZXQoe3RocmVzaG9sZDo1LGRpcmVjdGlvbjpuLkRJUkVDVElPTl9IT1JJWk9OVEFMfSl9LG8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmhpZGUoKSx0aGlzLmhhbW1lci5kZXN0cm95KCksdGhpcy5oYW1tZXI9bnVsbCx0aGlzLmJvZHk9bnVsbH0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ib2R5LmRvbS5iYWNrZ3JvdW5kVmVydGljYWw7dGhpcy5iYXIucGFyZW50Tm9kZSE9dCYmKHR
21167oaXMuYmFyLnBhcmVudE5vZGUmJnRoaXMuYmFyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5iYXIpLHQuYXBwZW5kQ2hpbGQodGhpcy5iYXIpKTt2YXIgZT10aGlzLmJvZHkudXRpbC50b1NjcmVlbih0aGlzLmN1c3RvbVRpbWUpLGk9dGhpcy5vcHRpb25zLmxvY2FsZXNbdGhpcy5vcHRpb25zLmxvY2FsZV07aXx8KHRoaXMud2FybmVkfHwoY29uc29sZS5sb2coXCJXQVJOSU5HOiBvcHRpb25zLmxvY2FsZXNbJ1wiK3RoaXMub3B0aW9ucy5sb2NhbGUrXCInXSBub3QgZm91bmQuIFNlZSBodHRwOi8vdmlzanMub3JnL2RvY3MvdGltZWxpbmUvI0xvY2FsaXphdGlvblwiKSx0aGlzLndhcm5lZD0hMCksaT10aGlzLm9wdGlvbnMubG9jYWxlcy5lbik7dmFyIG89dGhpcy5vcHRpb25zLnRpdGxlO3JldHVybiB2b2lkIDA9PT1vPyhvPWkudGltZStcIjogXCIrdGhpcy5vcHRpb25zLm1vbWVudCh0aGlzLmN1c3RvbVRpbWUpLmZvcm1hdChcImRkZGQsIE1NTU0gRG8gWVlZWSwgSDptbTpzc1wiKSxvPW8uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrby5zdWJzdHJpbmcoMSkpOlwiZnVuY3Rpb25cIj09dHlwZW9mIG8mJihvPW8uY2FsbCh0aGlzLmN1c3RvbVRpbWUpKSx0aGlzLmJhci5zdHlsZS5sZWZ0PWUrXCJweFwiLHRoaXMuYmFyLnRpdGxlPW8sITF9LG8ucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLmJhci5wYXJlbnROb2RlJiZ0aGlzLmJhci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmFyKX0sby5wcm90b3R5cGUuc2V0Q3VzdG9tVGltZT1mdW5jdGlvbih0KXt0aGlzLmN1c3RvbVRpbWU9cy5jb252ZXJ0KHQsXCJEYXRlXCIpLHRoaXMucmVkcmF3KCl9LG8ucHJvdG90eXBlLmdldEN1c3RvbVRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERhdGUodGhpcy5jdXN0b21UaW1lLnZhbHVlT2YoKSl9LG8ucHJvdG90eXBlLnNldEN1c3RvbVRpdGxlPWZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucy50aXRsZT10fSxvLnByb3RvdHlwZS5fb25EcmFnU3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5ldmVudFBhcmFtcy5kcmFnZ2luZz0hMCx0aGlzLmV2ZW50UGFyYW1zLmN1c3RvbVRpbWU9dGhpcy5jdXN0b21UaW1lLHQuc3RvcFByb3BhZ2F0aW9uKCl9LG8ucHJvdG90eXBlLl9vbkRyYWc9ZnVuY3Rpb24odCl7aWYodGhpcy5ldmVudFBhcmFtcy5kcmFnZ2luZyl7dmFyIGU9dGhpcy5ib2R5LnV0aWwudG9TY3JlZW4odGhpcy5ldmVudFBhcmFtcy5jdXN0b21UaW1lKSt0LmRlbHRhWCxpPXRoaXMuYm9keS51dGlsLnRvVGltZShlKTt0aGlzLnNldEN1c3RvbVRpbWUoaSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInRpbWVjaGFuZ2VcIix7aWQ6dGhpcy5vcHRpb25zLmlkLHRpbWU6bmV3IERhdGUodGhpcy5jdXN0b21UaW1lLnZhbHVlT2YoKSksZXZlbnQ6dH0pLHQuc3RvcFByb3BhZ2F0aW9uKCl9fSxvLnByb3RvdHlwZS5fb25EcmFnRW5kPWZ1bmN0aW9uKHQpe3RoaXMuZXZlbnRQYXJhbXMuZHJhZ2dpbmcmJih0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwidGltZWNoYW5nZWRcIix7aWQ6dGhpcy5vcHRpb25zLmlkLHRpbWU6bmV3IERhdGUodGhpcy5jdXN0b21UaW1lLnZhbHVlT2YoKSksZXZlbnQ6dH0pLHQuc3RvcFByb3BhZ2F0aW9uKCkpfSxvLmN1c3RvbVRpbWVGcm9tVGFyZ2V0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LnRhcmdldDtlOyl7aWYoZS5oYXNPd25Qcm9wZXJ0eShcImN1c3RvbS10aW1lXCIpKXJldHVybiBlW1wiY3VzdG9tLXRpbWVcIl07ZT1lLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgwKSxzPW8obikscj1pKDEpLGE9byhyKSxoPWkoMiksZD1pKDExNykuZGVmYXVsdCxsPWkoNDgpLmRlZmF1bHQsdT1pKDE5MykuZGVmYXVsdCxjPWkoMjAwKS5kZWZhdWx0LHA9aSgyMDEpLmRlZmF1bHQsZj1pKDIwMikuZGVmYXVsdCxtPWkoMjAzKS5kZWZhdWx0LHY9aSgyMDQpLmRlZmF1bHQsZz1pKDIwNSkuZGVmYXVsdCx5PWkoMjA2KS5kZWZhdWx0LGI9aSgyMDcpLmRlZmF1bHQsXz1pKDIwOCkuZGVmYXVsdCx3PWkoMjA5KS5kZWZhdWx0LHg9aSgyMTApLmRlZmF1bHQsaz1pKDIxMSkuZGVmYXVsdCxTPWkoMjEyKS5kZWZhdWx0LEQ9aSgyMTMpLmRlZmF1bHQsTT1pKDE1KSxDPU0ucHJpbnRTdHlsZSxPPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyxuLHIsYSl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMub3B0aW9ucz1oLmJyaWRnZU9iamVjdChyKSx0aGlzLmdsb2JhbE9wdGlvbnM9cix0aGlzLmRlZmF1bHRPcHRpb25zPWEsdGhpcy5ib2R5PWksdGhpcy5lZGdlcz1bXSx0aGlzLmlkPXZvaWQgMCx0aGlzLmltYWdlbGlzdD1vLHRoaXMuZ3JvdXBsaXN0PW4sdGhpcy54PXZvaWQgMCx0aGlzLnk9dm9pZCAwLHRoaXMuYmFzZVNpemU9dGhpcy5vcHRpb25zLnNpemUsdGhpcy5iYXNlRm9udFNpemU9dGhpcy5vcHRpb25zLmZvbnQuc2l6ZSx0aGlzLnByZWRlZmluZWRQb3NpdGlvbj0hMSx0aGlzLnNlbGVjdGVkPSExLHRoaXMuaG92ZXI9ITEsdGhpcy5sYWJlbE1vZHVsZT1uZXcgZCh0aGlzLmJvZHksdGhpcy5vcHRpb25zLCExKSx0aGlzLnNldE9wdGlvbnMoZSl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OlwiYXR0YWNoRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQpey0xPT09dGhpcy5lZGdlcy5pbmRleE9mKHQpJiZ0aGlzLmVkZ2VzLnB1c2godCl9fSx7a2V5OlwiZGV0YWNoRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZWRnZXMuaW5kZXhPZih0KTstMSE9ZSYmdGhpcy5lZGdlcy5zcGxpY2UoZSwxKX19LHtrZXk6XCJzZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5vcHRpb25zLnNoYXBlO2lmKGUpe2lmKHZvaWQgMCE9PWUuaWQmJih0aGlzLmlkPWUuaWQpLHZvaWQgMD09PXRoaXMuaWQpdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBtdXN0IGhhdmUgYW4gaWRcIik7dC5jaGVja01hc3MoZSx0aGlzLmlkKSx2b2lkIDAhPT1lLngmJihudWxsPT09ZS54Pyh0aGlzLng9dm9pZCAwLHRoaXMucHJlZGVmaW5lZFBvc2l0aW9uPSExKToodGhpcy54PXBhcnNlSW50KGUueCksdGhpcy5wcmVkZWZpbmVkUG9zaXRpb249ITApKSx2b2lkIDAhPT1lLnkmJihudWxsPT09ZS55Pyh0aGlzLnk9dm9pZCAwLHRoaXMucHJlZGVmaW5lZFBvc2l0aW9uPSExKToodGhpcy55PXBhcnNlSW50KGUueSksdGhpcy5wcmVkZWZpbmVkUG9zaXRpb249ITApKSx2b2lkIDAhPT1lLnNpemUmJih0aGlzLmJhc2VTaXplPWUuc2l6ZSksdm9pZCAwIT09ZS52YWx1ZSYmKGUudmFsdWU9cGFyc2VGbG9hdChlLnZhbHVlKSksdC5wYXJzZU9wdGlvbnModGhpcy5vcHRpb25zLGUsITAsdGhpcy5nbG9iYWxPcHRpb25zLHRoaXMuZ3JvdXBsaXN0KTt2YXIgbz1bZSx0aGlzLm9wdGlvbnMsdGhpcy5kZWZh
21167dWx0T3B0aW9uc107cmV0dXJuIHRoaXMuY2hvb3Nlcj1sLmNob29zaWZ5KFwibm9kZVwiLG8pLHRoaXMuX2xvYWRfaW1hZ2VzKCksdGhpcy51cGRhdGVMYWJlbE1vZHVsZShlKSx0aGlzLnVwZGF0ZVNoYXBlKGkpLHZvaWQgMCE9PWUuaGlkZGVufHx2b2lkIDAhPT1lLnBoeXNpY3N9fX0se2tleTpcIl9sb2FkX2ltYWdlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoXCJjaXJjdWxhckltYWdlXCI9PT10aGlzLm9wdGlvbnMuc2hhcGV8fFwiaW1hZ2VcIj09PXRoaXMub3B0aW9ucy5zaGFwZSl7aWYodm9pZCAwPT09dGhpcy5vcHRpb25zLmltYWdlKXRocm93IG5ldyBFcnJvcihcIk9wdGlvbiBpbWFnZSBtdXN0IGJlIGRlZmluZWQgZm9yIG5vZGUgdHlwZSAnXCIrdGhpcy5vcHRpb25zLnNoYXBlK1wiJ1wiKTtpZih2b2lkIDA9PT10aGlzLmltYWdlbGlzdCl0aHJvdyBuZXcgRXJyb3IoXCJJbnRlcm5hbCBFcnJvcjogTm8gaW1hZ2VzIHByb3ZpZGVkXCIpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuaW1hZ2UpdGhpcy5pbWFnZU9iaj10aGlzLmltYWdlbGlzdC5sb2FkKHRoaXMub3B0aW9ucy5pbWFnZSx0aGlzLm9wdGlvbnMuYnJva2VuSW1hZ2UsdGhpcy5pZCk7ZWxzZXtpZih2b2lkIDA9PT10aGlzLm9wdGlvbnMuaW1hZ2UudW5zZWxlY3RlZCl0aHJvdyBuZXcgRXJyb3IoXCJObyB1bnNlbGVjdGVkIGltYWdlIHByb3ZpZGVkXCIpO3RoaXMuaW1hZ2VPYmo9dGhpcy5pbWFnZWxpc3QubG9hZCh0aGlzLm9wdGlvbnMuaW1hZ2UudW5zZWxlY3RlZCx0aGlzLm9wdGlvbnMuYnJva2VuSW1hZ2UsdGhpcy5pZCksdm9pZCAwIT09dGhpcy5vcHRpb25zLmltYWdlLnNlbGVjdGVkP3RoaXMuaW1hZ2VPYmpBbHQ9dGhpcy5pbWFnZWxpc3QubG9hZCh0aGlzLm9wdGlvbnMuaW1hZ2Uuc2VsZWN0ZWQsdGhpcy5vcHRpb25zLmJyb2tlbkltYWdlLHRoaXMuaWQpOnRoaXMuaW1hZ2VPYmpBbHQ9dm9pZCAwfX19fSx7a2V5OlwiZ2V0Rm9ybWF0dGluZ1ZhbHVlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9e2NvbG9yOnRoaXMub3B0aW9ucy5jb2xvci5iYWNrZ3JvdW5kLGJvcmRlcldpZHRoOnRoaXMub3B0aW9ucy5ib3JkZXJXaWR0aCxib3JkZXJDb2xvcjp0aGlzLm9wdGlvbnMuY29sb3IuYm9yZGVyLHNpemU6dGhpcy5vcHRpb25zLnNpemUsYm9yZGVyRGFzaGVzOnRoaXMub3B0aW9ucy5zaGFwZVByb3BlcnRpZXMuYm9yZGVyRGFzaGVzLGJvcmRlclJhZGl1czp0aGlzLm9wdGlvbnMuc2hhcGVQcm9wZXJ0aWVzLmJvcmRlclJhZGl1cyxzaGFkb3c6dGhpcy5vcHRpb25zLnNoYWRvdy5lbmFibGVkLHNoYWRvd0NvbG9yOnRoaXMub3B0aW9ucy5zaGFkb3cuY29sb3Isc2hhZG93U2l6ZTp0aGlzLm9wdGlvbnMuc2hhZG93LnNpemUsc2hhZG93WDp0aGlzLm9wdGlvbnMuc2hhZG93Lngsc2hhZG93WTp0aGlzLm9wdGlvbnMuc2hhZG93Lnl9O3JldHVybiB0aGlzLnNlbGVjdGVkfHx0aGlzLmhvdmVyPyEwPT09dGhpcy5jaG9vc2VyP3RoaXMuc2VsZWN0ZWQ/KHQuYm9yZGVyV2lkdGgqPTIsdC5jb2xvcj10aGlzLm9wdGlvbnMuY29sb3IuaGlnaGxpZ2h0LmJhY2tncm91bmQsdC5ib3JkZXJDb2xvcj10aGlzLm9wdGlvbnMuY29sb3IuaGlnaGxpZ2h0LmJvcmRlcix0LnNoYWRvdz10aGlzLm9wdGlvbnMuc2hhZG93LmVuYWJsZWQpOnRoaXMuaG92ZXImJih0LmNvbG9yPXRoaXMub3B0aW9ucy5jb2xvci5ob3Zlci5iYWNrZ3JvdW5kLHQuYm9yZGVyQ29sb3I9dGhpcy5vcHRpb25zLmNvbG9yLmhvdmVyLmJvcmRlcix0LnNoYWRvdz10aGlzLm9wdGlvbnMuc2hhZG93LmVuYWJsZWQpOlwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMuY2hvb3NlciYmKHRoaXMuY2hvb3Nlcih0LHRoaXMub3B0aW9ucy5pZCx0aGlzLnNlbGVjdGVkLHRoaXMuaG92ZXIpLCExPT09dC5zaGFkb3cmJih0LnNoYWRvd0NvbG9yPT09dGhpcy5vcHRpb25zLnNoYWRvdy5jb2xvciYmdC5zaGFkb3dTaXplPT09dGhpcy5vcHRpb25zLnNoYWRvdy5zaXplJiZ0LnNoYWRvd1g9PT10aGlzLm9wdGlvbnMuc2hhZG93LngmJnQuc2hhZG93WT09PXRoaXMub3B0aW9ucy5zaGFkb3cueXx8KHQuc2hhZG93PSEwKSkpOnQuc2hhZG93PXRoaXMub3B0aW9ucy5zaGFkb3cuZW5hYmxlZCx0fX0se2tleTpcInVwZGF0ZUxhYmVsTW9kdWxlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dm9pZCAwIT09dGhpcy5vcHRpb25zLmxhYmVsJiZudWxsIT09dGhpcy5vcHRpb25zLmxhYmVsfHwodGhpcy5vcHRpb25zLmxhYmVsPVwiXCIpLHQudXBkYXRlR3JvdXBPcHRpb25zKHRoaXMub3B0aW9ucyxlLHRoaXMuZ3JvdXBsaXN0KTt2YXIgaT10aGlzLmdyb3VwbGlzdC5nZXQodGhpcy5vcHRpb25zLmdyb3VwLCExKSxvPVtlLHRoaXMub3B0aW9ucyxpLHRoaXMuZ2xvYmFsT3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zXTt0aGlzLmxhYmVsTW9kdWxlLnVwZGF0ZSh0aGlzLm9wdGlvbnMsbyksdm9pZCAwIT09dGhpcy5sYWJlbE1vZHVsZS5iYXNlU2l6ZSYmKHRoaXMuYmFzZUZvbnRTaXplPXRoaXMubGFiZWxNb2R1bGUuYmFzZVNpemUpfX0se2tleTpcInVwZGF0ZVNoYXBlXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodD09PXRoaXMub3B0aW9ucy5zaGFwZSYmdGhpcy5zaGFwZSl0aGlzLnNoYXBlLnNldE9wdGlvbnModGhpcy5vcHRpb25zLHRoaXMuaW1hZ2VPYmosdGhpcy5pbWFnZU9iakFsdCk7ZWxzZSBzd2l0Y2godGhpcy5vcHRpb25zLnNoYXBlKXtjYXNlXCJib3hcIjp0aGlzLnNoYXBlPW5ldyB1KHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk7YnJlYWs7Y2FzZVwiY2lyY2xlXCI6dGhpcy5zaGFwZT1uZXcgYyh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2VcImNpcmN1bGFySW1hZ2VcIjp0aGlzLnNoYXBlPW5ldyBwKHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSx0aGlzLmltYWdlT2JqLHRoaXMuaW1hZ2VPYmpBbHQpO2JyZWFrO2Nhc2VcImRhdGFiYXNlXCI6dGhpcy5zaGFwZT1uZXcgZih0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2VcImRpYW1vbmRcIjp0aGlzLnNoYXBlPW5ldyBtKHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVs
21167ZSk7YnJlYWs7Y2FzZVwiZG90XCI6dGhpcy5zaGFwZT1uZXcgdih0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2VcImVsbGlwc2VcIjp0aGlzLnNoYXBlPW5ldyBnKHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk7YnJlYWs7Y2FzZVwiaWNvblwiOnRoaXMuc2hhcGU9bmV3IHkodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKTticmVhaztjYXNlXCJpbWFnZVwiOnRoaXMuc2hhcGU9bmV3IGIodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlLHRoaXMuaW1hZ2VPYmosdGhpcy5pbWFnZU9iakFsdCk7YnJlYWs7Y2FzZVwic3F1YXJlXCI6dGhpcy5zaGFwZT1uZXcgXyh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2VcImhleGFnb25cIjp0aGlzLnNoYXBlPW5ldyB3KHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk7YnJlYWs7Y2FzZVwic3RhclwiOnRoaXMuc2hhcGU9bmV3IHgodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKTticmVhaztjYXNlXCJ0ZXh0XCI6dGhpcy5zaGFwZT1uZXcgayh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2VcInRyaWFuZ2xlXCI6dGhpcy5zaGFwZT1uZXcgUyh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2VcInRyaWFuZ2xlRG93blwiOnRoaXMuc2hhcGU9bmV3IEQodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKTticmVhaztkZWZhdWx0OnRoaXMuc2hhcGU9bmV3IGcodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKX10aGlzLm5lZWRzUmVmcmVzaCgpfX0se2tleTpcInNlbGVjdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD0hMCx0aGlzLm5lZWRzUmVmcmVzaCgpfX0se2tleTpcInVuc2VsZWN0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPSExLHRoaXMubmVlZHNSZWZyZXNoKCl9fSx7a2V5OlwibmVlZHNSZWZyZXNoXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNoYXBlLnJlZnJlc2hOZWVkZWQ9ITB9fSx7a2V5OlwiZ2V0VGl0bGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudGl0bGV9fSx7a2V5OlwiZGlzdGFuY2VUb0JvcmRlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc2hhcGUuZGlzdGFuY2VUb0JvcmRlcih0LGUpfX0se2tleTpcImlzRml4ZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMuZml4ZWQueCYmdGhpcy5vcHRpb25zLmZpeGVkLnl9fSx7a2V5OlwiaXNTZWxlY3RlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0ZWR9fSx7a2V5OlwiZ2V0VmFsdWVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudmFsdWV9fSx7a2V5OlwiZ2V0TGFiZWxTaXplXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYWJlbE1vZHVsZS5zaXplKCl9fSx7a2V5Olwic2V0VmFsdWVSYW5nZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtpZih2b2lkIDAhPT10aGlzLm9wdGlvbnMudmFsdWUpe3ZhciBvPXRoaXMub3B0aW9ucy5zY2FsaW5nLmN1c3RvbVNjYWxpbmdGdW5jdGlvbih0LGUsaSx0aGlzLm9wdGlvbnMudmFsdWUpLG49dGhpcy5vcHRpb25zLnNjYWxpbmcubWF4LXRoaXMub3B0aW9ucy5zY2FsaW5nLm1pbjtpZighMD09PXRoaXMub3B0aW9ucy5zY2FsaW5nLmxhYmVsLmVuYWJsZWQpe3ZhciBzPXRoaXMub3B0aW9ucy5zY2FsaW5nLmxhYmVsLm1heC10aGlzLm9wdGlvbnMuc2NhbGluZy5sYWJlbC5taW47dGhpcy5vcHRpb25zLmZvbnQuc2l6ZT10aGlzLm9wdGlvbnMuc2NhbGluZy5sYWJlbC5taW4rbypzfXRoaXMub3B0aW9ucy5zaXplPXRoaXMub3B0aW9ucy5zY2FsaW5nLm1pbitvKm59ZWxzZSB0aGlzLm9wdGlvbnMuc2l6ZT10aGlzLmJhc2VTaXplLHRoaXMub3B0aW9ucy5mb250LnNpemU9dGhpcy5iYXNlRm9udFNpemU7dGhpcy51cGRhdGVMYWJlbE1vZHVsZSgpfX0se2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEZvcm1hdHRpbmdWYWx1ZXMoKTt0aGlzLnNoYXBlLmRyYXcodCx0aGlzLngsdGhpcy55LHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3ZlcixlKX19LHtrZXk6XCJ1cGRhdGVCb3VuZGluZ0JveFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuc2hhcGUudXBkYXRlQm91bmRpbmdCb3godGhpcy54LHRoaXMueSx0KX19LHtrZXk6XCJyZXNpemVcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEZvcm1hdHRpbmdWYWx1ZXMoKTt0aGlzLnNoYXBlLnJlc2l6ZSh0LHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3ZlcixlKX19LHtrZXk6XCJnZXRJdGVtc09uUG9pbnRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gdGhpcy5sYWJlbE1vZHVsZS52aXNpYmxlKCkmJmwucG9pbnRJblJlY3QodGhpcy5sYWJlbE1vZHVsZS5nZXRTaXplKCksdCkmJmUucHVzaCh7bm9kZUlkOnRoaXMuaWQsbGFiZWxJZDowfSksbC5wb2ludEluUmVjdCh0aGlzLnNoYXBlLmJvdW5kaW5nQm94LHQpJiZlLnB1c2goe25vZGVJZDp0aGlzLmlkfSksZX19LHtrZXk6XCJpc092ZXJsYXBwaW5nV2l0aFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNoYXBlLmxlZnQ8dC5yaWdodCYmdGhpcy5zaGFwZS5sZWZ0K3RoaXMuc2hhcGUud2lkdGg+dC5sZWZ0JiZ0aGlzLnNoYXBlLnRvcDx0LmJvdHRvbSYmdGhpcy5zaGFwZS50b3ArdGhpcy5zaGFwZS5oZWlnaHQ+dC50b3B9fSx7a2V5OlwiaXNCb3VuZGluZ0JveE92ZXJsYXBwaW5nV2l0aFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNoYXBlLmJvdW5kaW5nQm94LmxlZnQ8dC5yaWdodCYmdGhpcy5zaGFwZS5ib3VuZGluZ0JveC5yaWdodD50LmxlZnQmJnRoaXMuc2hhcGUuYm91bmRpbmdCb3gudG9wPHQuYm90dG9tJiZ0aGlzLnNoYXBlLmJvdW5kaW5nQm94LmJvdHRvbT50LnRvcH19XSxbe2tleTpcInVwZGF0ZUdyb3VwT3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtp
21167Zih2b2lkIDAhPT1pKXt2YXIgbz10Lmdyb3VwO2lmKHZvaWQgMCE9PWUmJnZvaWQgMCE9PWUuZ3JvdXAmJm8hPT1lLmdyb3VwKXRocm93IG5ldyBFcnJvcihcInVwZGF0ZUdyb3VwT3B0aW9uczogZ3JvdXAgdmFsdWVzIGluIG9wdGlvbnMgZG9uJ3QgbWF0Y2guXCIpO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBvfHxcInN0cmluZ1wiPT10eXBlb2YgbyYmXCJcIiE9byl7dmFyIG49aS5nZXQobyk7aC5zZWxlY3RpdmVOb3REZWVwRXh0ZW5kKFtcImZvbnRcIl0sdCxuKSx0LmNvbG9yPWgucGFyc2VDb2xvcih0LmNvbG9yKX19fX0se2tleTpcInBhcnNlT3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKGUsaSl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXSxuPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fSxzPWFyZ3VtZW50c1s0XSxyPVtcImNvbG9yXCIsXCJmaXhlZFwiLFwic2hhZG93XCJdO2lmKGguc2VsZWN0aXZlTm90RGVlcEV4dGVuZChyLGUsaSxvKSx0LmNoZWNrTWFzcyhpKSxoLm1lcmdlT3B0aW9ucyhlLGksXCJzaGFkb3dcIixuKSx2b2lkIDAhPT1pLmNvbG9yJiZudWxsIT09aS5jb2xvcil7dmFyIGE9aC5wYXJzZUNvbG9yKGkuY29sb3IpO2guZmlsbElmRGVmaW5lZChlLmNvbG9yLGEpfWVsc2UhMD09PW8mJm51bGw9PT1pLmNvbG9yJiYoZS5jb2xvcj1oLmJyaWRnZU9iamVjdChuLmNvbG9yKSk7dm9pZCAwIT09aS5maXhlZCYmbnVsbCE9PWkuZml4ZWQmJihcImJvb2xlYW5cIj09dHlwZW9mIGkuZml4ZWQ/KGUuZml4ZWQueD1pLmZpeGVkLGUuZml4ZWQueT1pLmZpeGVkKToodm9pZCAwIT09aS5maXhlZC54JiZcImJvb2xlYW5cIj09dHlwZW9mIGkuZml4ZWQueCYmKGUuZml4ZWQueD1pLmZpeGVkLngpLHZvaWQgMCE9PWkuZml4ZWQueSYmXCJib29sZWFuXCI9PXR5cGVvZiBpLmZpeGVkLnkmJihlLmZpeGVkLnk9aS5maXhlZC55KSkpLCEwPT09byYmbnVsbD09PWkuZm9udCYmKGUuZm9udD1oLmJyaWRnZU9iamVjdChuLmZvbnQpKSx0LnVwZGF0ZUdyb3VwT3B0aW9ucyhlLGkscyksdm9pZCAwIT09aS5zY2FsaW5nJiZoLm1lcmdlT3B0aW9ucyhlLnNjYWxpbmcsaS5zY2FsaW5nLFwibGFiZWxcIixuLnNjYWxpbmcpfX0se2tleTpcImNoZWNrTWFzc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09dC5tYXNzJiZ0Lm1hc3M8PTApe3ZhciBpPVwiXCI7dm9pZCAwIT09ZSYmKGk9XCIgaW4gbm9kZSBpZDogXCIrZSksY29uc29sZS5sb2coXCIlY05lZ2F0aXZlIG9yIHplcm8gbWFzcyBkaXNhbGxvd2VkXCIraStcIiwgc2V0dGluZyBtYXNzIHRvIDEuXCIsQyksdC5tYXNzPTF9fX1dKSx0fSgpO2UuZGVmYXVsdD1PfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSg2KSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSgyKSx1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpeygwLGEuZGVmYXVsdCkodGhpcyx0KX1yZXR1cm4oMCxkLmRlZmF1bHQpKHQsbnVsbCxbe2tleTpcImNob29zaWZ5XCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1bXCJub2RlXCIsXCJlZGdlXCIsXCJsYWJlbFwiXSxvPSEwLG49bC50b3BNb3N0KGUsXCJjaG9zZW5cIik7aWYoXCJib29sZWFuXCI9PXR5cGVvZiBuKW89bjtlbHNlIGlmKFwib2JqZWN0XCI9PT0odm9pZCAwPT09bj9cInVuZGVmaW5lZFwiOigwLHMuZGVmYXVsdCkobikpKXtpZigtMT09PWkuaW5kZXhPZih0KSl0aHJvdyBuZXcgRXJyb3IoXCJjaG9vc2lmeTogc3ViT3B0aW9uICdcIit0K1wiJyBzaG91bGQgYmUgb25lIG9mICdcIitpLmpvaW4oXCInLCAnXCIpK1wiJ1wiKTt2YXIgcj1sLnRvcE1vc3QoZSxbXCJjaG9zZW5cIix0XSk7XCJib29sZWFuXCIhPXR5cGVvZiByJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiByfHwobz1yKX1yZXR1cm4gb319LHtrZXk6XCJwb2ludEluUmVjdFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtpZih0LndpZHRoPD0wfHx0LmhlaWdodDw9MClyZXR1cm4hMTtpZih2b2lkIDAhPT1pKXt2YXIgbz17eDplLngtaS54LHk6ZS55LWkueX07aWYoMCE9PWkuYW5nbGUpe3ZhciBuPS1pLmFuZ2xlO2U9e3g6TWF0aC5jb3Mobikqby54LU1hdGguc2luKG4pKm8ueSx5Ok1hdGguc2luKG4pKm8ueCtNYXRoLmNvcyhuKSpvLnl9fWVsc2UgZT1vfXZhciBzPXQueCt0LndpZHRoLHI9dC55K3Qud2lkdGg7cmV0dXJuIHQubGVmdDxlLngmJnM+ZS54JiZ0LnRvcDxlLnkmJnI+ZS55fX0se2tleTpcImlzVmFsaWRMYWJlbFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiB0JiZcIlwiIT09dH19XSksdH0oKTtlLmRlZmF1bHQ9dX0sZnVuY3Rpb24odCxlLGkpe2koMTI1KTtmb3IodmFyIG89aSgxOCksbj1pKDI2KSxzPWkoMzEpLHI9aSgxMykoXCJ0b1N0cmluZ1RhZ1wiKSxhPVwiQ1NTUnVsZUxpc3QsQ1NTU3R5bGVEZWNsYXJhdGlvbixDU1NWYWx1ZUxpc3QsQ2xpZW50UmVjdExpc3QsRE9NUmVjdExpc3QsRE9NU3RyaW5nTGlzdCxET01Ub2tlbkxpc3QsRGF0YVRyYW5zZmVySXRlbUxpc3QsRmlsZUxpc3QsSFRNTEFsbENvbGxlY3Rpb24sSFRNTENvbGxlY3Rpb24sSFRNTEZvcm1FbGVtZW50LEhUTUxTZWxlY3RFbGVtZW50LE1lZGlhTGlzdCxNaW1lVHlwZUFycmF5LE5hbWVkTm9kZU1hcCxOb2RlTGlzdCxQYWludFJlcXVlc3RMaXN0LFBsdWdpbixQbHVnaW5BcnJheSxTVkdMZW5ndGhMaXN0LFNWR051bWJlckxpc3QsU1ZHUGF0aFNlZ0xpc3QsU1ZHUG9pbnRMaXN0LFNWR1N0cmluZ0xpc3QsU1ZHVHJhbnNmb3JtTGlzdCxTb3VyY2VCdWZmZXJMaXN0LFN0eWxlU2hlZXRMaXN0LFRleHRUcmFja0N1ZUxpc3QsVGV4dFRyYWNrTGlzdCxUb3VjaExpc3RcIi5zcGxpdChcIixcIiksaD0wO2g8YS5sZW5ndGg7aCsrKXt2YXIgZD1hW2hdLGw9b1tkXSx1PWwmJmwucHJvdG90eXBlO3UmJiF1W3JdJiZuKHUscixkKSxzW2RdPXMuQXJyYXl9fSxmdW5jdGlvbih0LGUpe3ZhciBpPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaS5jYWxsKHQpLnNsaWNlKDgsLTEpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT10KXRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIit0KTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPSEwfSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgzMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoIW8odCkpcmV0dXJuIHQ7dmFyIGksbjtpZihlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZihpPXQudG9TdHJpbmcpJiYhbyhuPWkuY2FsbCh0KSkpcmV0dXJuIG47aWYoXCJmdW5jdGlvblwiPT10eXBlb2YoaT10LnZhbHVlT2YpJiYhbyhuPWkuY2FsbCh0KSkpcmV0dXJuIG47aWYoIWUmJlwiZnVuY3Rpb25cIj09dHlwZW9mKGk9dC50b1N0cmluZykmJiFvKG49aS5jYWxsKHQpKSlyZXR1cm4gbjt0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIil9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgyNyksbj1pKDEzMCkscz1pKDU4KSxyPWkoNTYpKFwiSUVfUFJPVE9cIiksYT1mdW5jdGlvbigpe30saD1mdW5jdGlvbigpe3ZhciB0LGU9aSg4MikoXCJpZnJhbWVcIiksbz1zLmxlbmd0aDtmb3IoZS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiLGkoMTM0KS5hcHBlbmRDaGlsZChlKSxlLnNyYz1cImphdmFzY3JpcHQ6XCIsdD1lLmNvbnRlbn
21167RXaW5kb3cuZG9jdW1lbnQsdC5vcGVuKCksdC53cml0ZShcIjxzY3JpcHQ+ZG9jdW1lbnQuRj1PYmplY3Q8XFwvc2NyaXB0PlwiKSx0LmNsb3NlKCksaD10LkY7by0tOylkZWxldGUgaC5wcm90b3R5cGVbc1tvXV07cmV0dXJuIGgoKX07dC5leHBvcnRzPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKHQsZSl7dmFyIGk7cmV0dXJuIG51bGwhPT10PyhhLnByb3RvdHlwZT1vKHQpLGk9bmV3IGEsYS5wcm90b3R5cGU9bnVsbCxpW3JdPXQpOmk9aCgpLHZvaWQgMD09PWU/aTpuKGksZSl9fSxmdW5jdGlvbih0LGUpe3ZhciBpPU1hdGguY2VpbCxvPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA/bzppKSh0KX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDU3KShcImtleXNcIiksbj1pKDQwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG9bdF18fChvW3RdPW4odCkpfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTgpLG49b1tcIl9fY29yZS1qc19zaGFyZWRfX1wiXXx8KG9bXCJfX2NvcmUtanNfc2hhcmVkX19cIl09e30pO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gblt0XXx8KG5bdF09e30pfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9XCJjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2ZcIi5zcGxpdChcIixcIil9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDIwKS5mLG49aSgyMikscz1pKDEzKShcInRvU3RyaW5nVGFnXCIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsaSl7dCYmIW4odD1pP3Q6dC5wcm90b3R5cGUscykmJm8odCxzLHtjb25maWd1cmFibGU6ITAsdmFsdWU6ZX0pfX0s
21167ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTM1KSghMCk7aSg3OSkoU3RyaW5nLFwiU3RyaW5nXCIsZnVuY3Rpb24odCl7dGhpcy5fdD1TdHJpbmcodCksdGhpcy5faT0wfSxmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5fdCxpPXRoaXMuX2k7cmV0dXJuIGk+PWUubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KHQ9byhlLGkpLHRoaXMuX2krPXQubGVuZ3RoLHt2YWx1ZTp0LGRvbmU6ITF9KX0pfSxmdW5jdGlvbih0LGUsaSl7ZS5mPWkoMTMpfSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgxOCksbj1pKDcpLHM9aSg1Mikscj1pKDYxKSxhPWkoMjApLmY7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW4uU3ltYm9sfHwobi5TeW1ib2w9cz97fTpvLlN5bWJvbHx8e30pO1wiX1wiPT10LmNoYXJBdCgwKXx8dCBpbiBlfHxhKGUsdCx7dmFsdWU6ci5mKHQpfSl9fSxmdW5jdGlvbih0LGUpe2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe3ZhciBpPXAoKS5ob3VycygwKS5taW51dGVzKDApLnNlY29uZHMoMCkubWlsbGlzZWNvbmRzKDApLG89aS5jbG9uZSgpLmFkZCgtMyxcImRheXNcIikudmFsdWVPZigpLG49aS5jbG9uZSgpLmFkZCgzLFwiZGF5c1wiKS52YWx1ZU9mKCk7dGhpcy5taWxsaXNlY29uZHNQZXJQaXhlbENhY2hlPXZvaWQgMCx2b2lkIDA9PT1lPyh0aGlzLnN0YXJ0PW8sdGhpcy5lbmQ9bik6KHRoaXMuc3RhcnQ9ZS5zdGFydHx8byx0aGlzLmVuZD1lLmVuZHx8biksdGhpcy5yb2xsaW5nPSExLHRoaXMuYm9keT10LHRoaXMuZGVsdGFEaWZmZXJlbmNlPTAsdGhpcy5zY2FsZU9mZnNldD0wLHRoaXMuc3RhcnRUb0Zyb250PSExLHRoaXMuZW5kVG9Gcm9udD0hMCx0aGlzLmRlZmF1bHRPcHRpb25zPXtydGw6ITEsc3RhcnQ6bnVsbCxlbmQ6bnVsbCxtb21lbnQ6cCxkaXJlY3Rpb246XCJob3Jpem9udGFsXCIsbW92ZWFibGU6ITAsem9vbWFibGU6ITAsbWluOm51bGwsbWF4Om51bGwsem9vbU1pbjoxMCx6b29tTWF4OjMxNTM2ZTEwLHJvbGxpbmdNb2RlOntmb2xsb3c6ITEsb2Zmc2V0Oi41fX0sdGhpcy5vcHRpb25zPWMuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMucHJvcHM9e3RvdWNoOnt9fSx0aGlzLmFuaW1hdGlvblRpbWVyPW51bGwsdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJwYW5zdGFydFwiLHRoaXMuX29uRHJhZ1N0YXJ0LmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwicGFubW92ZVwiLHRoaXMuX29uRHJhZy5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5vbihcInBhbmVuZFwiLHRoaXMuX29uRHJhZ0VuZC5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIm1vdXNld2hlZWxcIix0aGlzLl9vbk1vdXNlV2hlZWwuYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJ0b3VjaFwiLHRoaXMuX29uVG91Y2guYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJwaW5jaFwiLHRoaXMuX29uUGluY2guYmluZCh0aGlzKSksdGhpcy5ib2R5LmRvbS5yb2xsaW5nTW9kZUJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0aGlzLnN0YXJ0Um9sbGluZy5iaW5kKHRoaXMpKSx0aGlzLnNldE9wdGlvbnMoZSl9ZnVuY3Rpb24gcyh0KXtpZihcImhvcml6b250YWxcIiE9dCYmXCJ2ZXJ0aWNhbFwiIT10KXRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZGlyZWN0aW9uIFwiJyt0KydcIi4gQ2hvb3NlIFwiaG9yaXpvbnRhbFwiIG9yIFwidmVydGljYWxcIi4nKX12YXIgcj1pKDgpLGE9byhyKSxoPWkoMTkpLGQ9byhoKSxsPWkoNiksdT1vKGwpLGM9aSgyKSxwPWkoOSksZj1pKDE2KSxtPWkoMzYpO24ucHJvdG90eXBlPW5ldyBmLG4ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9W1wiYW5pbWF0aW9uXCIsXCJkaXJlY3Rpb25cIixcIm1pblwiLFwibWF4XCIsXCJ6b29tTWluXCIsXCJ6b29tTWF4XCIsXCJtb3ZlYWJsZVwiLFwiem9vbWFibGVcIixcIm1vbWVudFwiLFwiYWN0aXZhdGVcIixcImhpZGRlbkRhdGVzXCIsXCJ6b29tS2V5XCIsXCJydGxcIixcInNob3dDdXJyZW50VGltZVwiLFwicm9sbGluZ01vZGVcIixcImhvcml6b250YWxTY3JvbGxcIl07Yy5zZWxlY3RpdmVFeHRlbmQoZSx0aGlzLm9wdGlvbnMsdCksdC5yb2xsaW5nTW9kZSYmdC5yb2xsaW5nTW9kZS5mb2xsb3cmJnRoaXMuc3RhcnRSb2xsaW5nKCksKFwic3RhcnRcImluIHR8fFwiZW5kXCJpbiB0KSYmdGhpcy5zZXRSYW5nZSh0LnN0YXJ0LHQuZW5kKX19LG4ucHJvdG90eXBlLnN0YXJ0Um9sbGluZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtlLnN0b3BSb2xsaW5nKCksZS5yb2xsaW5nPSEwO3ZhciBpPWUuZW5kLWUuc3RhcnQsbz1jLmNvbnZlcnQobmV3IERhdGUsXCJEYXRlXCIpLnZhbHVlT2YoKSxuPW8taSplLm9wdGlvbnMucm9sbGluZ01vZGUub2Zmc2V0LHM9bytpKigxLWUub3B0aW9ucy5yb2xsaW5nTW9kZS5vZmZzZXQpLHI9e2FuaW1hdGlvbjohMX07ZS5zZXRSYW5nZShuLHMsciksaT0xL2UuY29udmVyc2lvbihlLmJvZHkuZG9tUHJvcHMuY2VudGVyLndpZHRoKS5zY2FsZS8xMCxpPDMwJiYoaT0zMCksaT4xZTMmJihpPTFlMyksZS5ib2R5LmRvbS5yb2xsaW5nTW9kZUJ0bi5zdHlsZS52aXNpYmlsaXR5PVwiaGlkZGVuXCIsZS5jdXJyZW50VGltZVRpbWVyPXNldFRpbWVvdXQodCxpKX12YXIgZT10aGlzO3QoKX0sbi5wcm90b3R5cGUuc3RvcFJvbGxpbmc9ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLmN1cnJlbnRUaW1lVGltZXImJihjbGVhclRpbWVvdXQodGhpcy5jdXJyZW50VGltZVRpbWVyKSx0aGlzLnJvbGxpbmc9ITEsdGhpcy5ib2R5LmRvbS5yb2xsaW5nTW9kZUJ0bi5zdHlsZS52aXNpYmlsaXR5PVwidmlzaWJsZVwiKX0sbi5wcm90b3R5cGUuc2V0UmFuZ2U9ZnVuY3Rpb24odCxlLGksbyxuKXtpfHwoaT17fSksITAhPT1pLmJ5VXNlciYmKGkuYnlVc2VyPSExKTt2YXIgcz10aGlzLHI9dm9pZCAwIT10P2MuY29udmVydCh0LFwiRGF0ZVwiKS52YWx1ZU9mKCk6bnVsbCxoPXZvaWQgMCE9ZT9jLmNvbnZlcnQoZSxcIkRhdGVcIikudmFsdWVPZigpOm51bGw7aWYodGhpcy5fY2FuY2VsQW5pbWF0aW9uKCksdGhpcy5taWxsaXNlY29uZHNQZXJQaXhlbENhY2hlPXZvaWQgMCxpLmFuaW1hdGlvbil7dmFyIGw9dGhpcy5zdGFydCxwPXRoaXMuZW5kLGY9XCJvYmplY3RcIj09PSgwLHUuZGVmYXVsdCkoaS
211675hbmltYXRpb24pJiZcImR1cmF0aW9uXCJpbiBpLmFuaW1hdGlvbj9pLmFuaW1hdGlvbi5kdXJhdGlvbjo1MDAsdj1cIm9iamVjdFwiPT09KDAsdS5kZWZhdWx0KShpLmFuaW1hdGlvbikmJlwiZWFzaW5nRnVuY3Rpb25cImluIGkuYW5pbWF0aW9uP2kuYW5pbWF0aW9uLmVhc2luZ0Z1bmN0aW9uOlwiZWFzZUluT3V0UXVhZFwiLGc9Yy5lYXNpbmdGdW5jdGlvbnNbdl07aWYoIWcpdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBlYXNpbmcgZnVuY3Rpb24gXCIrKDAsZC5kZWZhdWx0KSh2KStcIi4gQ2hvb3NlIGZyb206IFwiKygwLGEuZGVmYXVsdCkoYy5lYXNpbmdGdW5jdGlvbnMpLmpvaW4oXCIsIFwiKSk7dmFyIHk9KG5ldyBEYXRlKS52YWx1ZU9mKCksYj0hMTtyZXR1cm4gZnVuY3Rpb24gdCgpe2lmKCFzLnByb3BzLnRvdWNoLmRyYWdnaW5nKXt2YXIgZT0obmV3IERhdGUpLnZhbHVlT2YoKSxhPWUteSxkPWcoYS9mKSx1PWE+ZixjPXV8fG51bGw9PT1yP3I6bCsoci1sKSpkLHY9dXx8bnVsbD09PWg/aDpwKyhoLXApKmQ7Xz1zLl9hcHBseVJhbmdlKGMsdiksbS51cGRhdGVIaWRkZW5EYXRlcyhzLm9wdGlvbnMubW9tZW50LHMuYm9keSxzLm9wdGlvbnMuaGlkZGVuRGF0ZXMpLGI9Ynx8Xzt2YXIgdz17c3RhcnQ6bmV3IERhdGUocy5zdGFydCksZW5kOm5ldyBEYXRlKHMuZW5kKSxieVVzZXI6aS5ieVVzZXIsZXZlbnQ6aS5ldmVudH07aWYobiYmbihkLF8sdSksXyYmcy5ib2R5LmVtaXR0ZXIuZW1pdChcInJhbmdlY2hhbmdlXCIsdyksdSl7aWYoYiYmKHMuYm9keS5lbWl0dGVyLmVtaXQoXCJyYW5nZWNoYW5nZWRcIix3KSxvKSlyZXR1cm4gbygpfWVsc2Ugcy5hbmltYXRpb25UaW1lcj1zZXRUaW1lb3V0KHQsMjApfX0oKX12YXIgXz10aGlzLl9hcHBseVJhbmdlKHIsaCk7aWYobS51cGRhdGVIaWRkZW5EYXRlcyh0aGlzLm9wdGlvbnMubW9tZW50LHRoaXMuYm9keSx0aGlzLm9wdGlvbnMuaGlkZGVuRGF0ZXMpLF8pe3ZhciB3PXtzdGFydDpuZXcgRGF0ZSh0aGlzLnN0YXJ0KSxlbmQ6bmV3IERhdGUodGhpcy5lbmQpLGJ5VXNlcjppLmJ5VXNlcixldmVudDppLmV2ZW50fTtpZih0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwicmFuZ2VjaGFuZ2VcIix3KSxjbGVhclRpbWVvdXQocy50aW1lb3V0SUQpLHMudGltZW91dElEPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtzLmJvZHkuZW1pdHRlci5lbWl0KFwicmFuZ2VjaGFuZ2VkXCIsdyl9LDIwMCksbylyZXR1cm4gbygpfX0sbi5wcm90b3R5cGUuZ2V0TWlsbGlzZWNvbmRzUGVyUGl4ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5taWxsaXNlY29uZHNQZXJQaXhlbENhY2hlJiYodGhpcy5taWxsaXNlY29uZHNQZXJQaXhlbENhY2hlPSh0aGlzLmVuZC10aGlzLnN0YXJ0KS90aGlzLmJvZHkuZG9tLmNlbnRlci5jbGllbnRXaWR0aCksdGhpcy5taWxsaXNlY29uZHNQZXJQaXhlbENhY2hlfSxuLnByb3RvdHlwZS5fY2FuY2VsQW5pbWF0aW9uPWZ1bmN0aW9uKCl7dGhpcy5hbmltYXRpb25UaW1lciYmKGNsZWFyVGltZW91dCh0aGlzLmFuaW1hdGlvblRpbWVyKSx0aGlzLmFuaW1hdGlvblRpbWVyPW51bGwpfSxuLnByb3RvdHlwZS5fYXBwbHlSYW5nZT1mdW5jdGlvbih0LGUpe3ZhciBpLG89bnVsbCE9dD9jLmNvbnZlcnQodCxcIkRhdGVcIikudmFsdWVPZigpOnRoaXMuc3RhcnQsbj1udWxsIT1lP2MuY29udmVydChlLFwiRGF0ZVwiKS52YWx1ZU9mKCk6dGhpcy5lbmQscz1udWxsIT10aGlzLm9wdGlvbnMubWF4P2MuY29udmVydCh0aGlzLm9wdGlvbnMubWF4LFwiRGF0ZVwiKS52YWx1ZU9mKCk6bnVsbCxyPW51bGwhPXRoaXMub3B0aW9ucy5taW4/Yy5jb252ZXJ0KHRoaXMub3B0aW9ucy5taW4sXCJEYXRlXCIpLnZhbHVlT2YoKTpudWxsO2lmKGlzTmFOKG8pfHxudWxsPT09byl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RhcnQgXCInK3QrJ1wiJyk7aWYoaXNOYU4obil8fG51bGw9PT1uKXRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbmQgXCInK2UrJ1wiJyk7aWYobjxvJiYobj1vKSxudWxsIT09ciYmbzxyJiYoaT1yLW8sbys9aSxuKz1pLG51bGwhPXMmJm4+cyYmKG49cykpLG51bGwhPT1zJiZuPnMmJihpPW4tcyxvLT1pLG4tPWksbnVsbCE9ciYmbzxyJiYobz1yKSksbnVsbCE9PXRoaXMub3B0aW9ucy56b29tTWluKXt2YXIgYT1wYXJzZUZsb2F0KHRoaXMub3B0aW9ucy56b29tTWluKTtpZihhPDAmJihhPTApLG4tbzxhKXt0aGlzLmVuZC10aGlzLnN0YXJ0PT09YSYmbz49dGhpcy5zdGFydC0uNSYmbjw9dGhpcy5lbmQ/KG89dGhpcy5zdGFydCxuPXRoaXMuZW5kKTooaT1hLShuLW8pLG8tPWkvMixuKz1pLzIpfX1pZihudWxsIT09dGhpcy5vcHRpb25zLnpvb21NYXgpe3ZhciBoPXBhcnNlRmxvYXQodGhpcy5vcHRpb25zLnpvb21NYXgpO2g8MCYmKGg9MCksbi1vPmgmJih0aGlzLmVuZC10aGlzLnN0YXJ0PT09aCYmbzx0aGlzLnN0YXJ0JiZuPnRoaXMuZW5kPyhvPXRoaXMuc3RhcnQsbj10aGlzLmVuZCk6KGk9bi1vLWgsbys9aS8yLG4tPWkvMikpfXZhciBkPXRoaXMuc3RhcnQhPW98fHRoaXMuZW5kIT1uO3JldHVybiBvPj10aGlzLnN0YXJ0JiZvPD10aGlzLmVuZHx8bj49dGhpcy5zdGFydCYmbjw9dGhpcy5lbmR8fHRoaXMuc3RhcnQ+PW8mJnRoaXMuc3RhcnQ8PW58fHRoaXMuZW5kPj1vJiZ0aGlzLmVuZDw9bnx8dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcImNoZWNrUmFuZ2VkSXRlbXNcIiksdGhpcy5zdGFydD1vLHRoaXMuZW5kPW4sZH0sbi5wcm90b3R5cGUuZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm57c3RhcnQ6dGhpcy5zdGFydCxlbmQ6dGhpcy5lbmR9fSxuLnByb3RvdHlwZS5jb252ZXJzaW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uY29udmVyc2lvbih0aGlzLnN0YXJ0LHRoaXMuZW5kLHQsZSl9LG4uY29udmVyc2lvbj1mdW5jdGlvbih0LGUsaSxvKXtyZXR1cm4gdm9pZCAwPT09byYmKG89MCksMCE9aSYmZS10IT0wP3tvZmZzZXQ6dCxzY2FsZTppLyhlLXQtbyl9OntvZmZzZXQ6MCxzY2FsZToxfX0sbi5wcm90b3R5cGUuX29uRHJhZ1N0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuZGVsdGFEaWZmZXJlbmNlPTAsdGhpcy5wcmV2aW91c0RlbHRhPTAsdGhpcy5vcHRpb25zLm1vdmVhYmxlJiZ0aGlzLl9pc0luc2lkZVJhbmdlKHQpJiZ0aGlzLnByb3BzLnRvdWNoLmFsbG93RHJhZ2dpbmcmJih0aGlzLnN0b3BSb2xsaW5nKCksdGhpcy5wcm9wcy50b3VjaC5zdGFydD10aGlzLnN0YXJ0LHRoaXMucHJvcHMudG91Y2guZW5kPXRoaXMuZW5kLHRoaXMucHJvcHMudG91Y2guZHJhZ2dpbmc9ITAsdGhpcy5ib2R5LmRvbS5yb290JiYodGhpcy5ib2R5LmRvbS5yb290LnN0eWxlLmN1cnNvcj1cIm1vdmVcIikpfSxuLnByb3RvdHlwZS5fb25EcmFnPWZ1bmN0aW9uKHQpe2lmKHQmJnRoaXMucHJvcHMudG91Y2guZHJhZ2dpbmcmJnRoaXMub3B0aW9ucy5tb3ZlYWJsZSYmdGhpcy5wcm9wcy50b3VjaC5hbGxvd0RyYWdnaW5nKXt2YXIgZT10aGlzLm9wdGlvbnMuZGlyZWN0aW9uO3MoZSk7dmFyIGk9XCJob3Jpem9udGFsXCI9PWU/dC5kZWx0YVg6dC5kZWx0YVk7aS09dGhpcy5kZWx0YURpZmZlcmVuY2U7dmFyIG89dGhpcy5wcm9wcy50b3VjaC5lbmQtdGhpcy5wcm9wcy50b3VjaC5zdGFydDtvLT1tLmdldEhpZGRlbkR1cmF0aW9uQmV0d2Vlbih0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsdGhpcy5zdGFydCx0aGlzLmVuZCk7dmFyIG4scj1cImhvcml6b250YWxcIj09ZT90aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyLndpZHR
21167oOnRoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXIuaGVpZ2h0O249dGhpcy5vcHRpb25zLnJ0bD9pL3IqbzotaS9yKm87dmFyIGE9dGhpcy5wcm9wcy50b3VjaC5zdGFydCtuLGg9dGhpcy5wcm9wcy50b3VjaC5lbmQrbixkPW0uc25hcEF3YXlGcm9tSGlkZGVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcyxhLHRoaXMucHJldmlvdXNEZWx0YS1pLCEwKSxsPW0uc25hcEF3YXlGcm9tSGlkZGVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcyxoLHRoaXMucHJldmlvdXNEZWx0YS1pLCEwKTtpZihkIT1hfHxsIT1oKXJldHVybiB0aGlzLmRlbHRhRGlmZmVyZW5jZSs9aSx0aGlzLnByb3BzLnRvdWNoLnN0YXJ0PWQsdGhpcy5wcm9wcy50b3VjaC5lbmQ9bCx2b2lkIHRoaXMuX29uRHJhZyh0KTt0aGlzLnByZXZpb3VzRGVsdGE9aSx0aGlzLl9hcHBseVJhbmdlKGEsaCk7dmFyIHU9bmV3IERhdGUodGhpcy5zdGFydCksYz1uZXcgRGF0ZSh0aGlzLmVuZCk7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInJhbmdlY2hhbmdlXCIse3N0YXJ0OnUsZW5kOmMsYnlVc2VyOiEwLGV2ZW50OnR9KSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwicGFubW92ZVwiKX19LG4ucHJvdG90eXBlLl9vbkRyYWdFbmQ9ZnVuY3Rpb24odCl7dGhpcy5wcm9wcy50b3VjaC5kcmFnZ2luZyYmdGhpcy5vcHRpb25zLm1vdmVhYmxlJiZ0aGlzLnByb3BzLnRvdWNoLmFsbG93RHJhZ2dpbmcmJih0aGlzLnByb3BzLnRvdWNoLmRyYWdnaW5nPSExLHRoaXMuYm9keS5kb20ucm9vdCYmKHRoaXMuYm9keS5kb20ucm9vdC5zdHlsZS5jdXJzb3I9XCJhdXRvXCIpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJyYW5nZWNoYW5nZWRcIix7c3RhcnQ6bmV3IERhdGUodGhpcy5zdGFydCksZW5kOm5ldyBEYXRlKHRoaXMuZW5kKSxieVVzZXI6ITAsZXZlbnQ6dH0pKX0sbi5wcm90b3R5cGUuX29uTW91c2VXaGVlbD1mdW5jdGlvbih0KXt2YXIgZT0wO2lmKHQud2hlZWxEZWx0YT9lPXQud2hlZWxEZWx0YS8xMjA6dC5kZXRhaWwmJihlPS10LmRldGFpbC8zKSwhKHRoaXMub3B0aW9ucy56b29tS2V5JiYhdFt0aGlzLm9wdGlvbnMuem9vbUtleV0mJnRoaXMub3B0aW9ucy56b29tYWJsZXx8IXRoaXMub3B0aW9ucy56b29tYWJsZSYmdGhpcy5vcHRpb25zLm1vdmVhYmxlKSYmdGhpcy5vcHRpb25zLnpvb21hYmxlJiZ0aGlzLm9wdGlvbnMubW92ZWFibGUmJnRoaXMuX2lzSW5zaWRlUmFuZ2UodCkmJmUpe3ZhciBpO2k9ZTwwPzEtZS81OjEvKDErZS81KTt2YXIgbztpZih0aGlzLnJvbGxpbmcpbz10aGlzLnN0YXJ0Kyh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0aGlzLm9wdGlvbnMucm9sbGluZ01vZGUub2Zmc2V0O2Vsc2V7dmFyIG49dGhpcy5nZXRQb2ludGVyKHt4OnQuY2xpZW50WCx5OnQuY2xpZW50WX0sdGhpcy5ib2R5LmRvbS5jZW50ZXIpO289dGhpcy5fcG9pbnRlclRvRGF0ZShuKX10aGlzLnpvb20oaSxvLGUsdCksdC5wcmV2ZW50RGVmYXVsdCgpfX0sbi5wcm90b3R5cGUuX29uVG91Y2g9ZnVuY3Rpb24odCl7dGhpcy5wcm9wcy50b3VjaC5zdGFydD10aGlzLnN0YXJ0LHRoaXMucHJvcHMudG91Y2guZW5kPXRoaXMuZW5kLHRoaXMucHJvcHMudG91Y2guYWxsb3dEcmFnZ2luZz0hMCx0aGlzLnByb3BzLnRvdWNoLmNlbnRlcj1udWxsLHRoaXMuc2NhbGVPZmZzZXQ9MCx0aGlzLmRlbHRhRGlmZmVyZW5jZT0wLGMucHJldmVudERlZmF1bHQodCl9LG4ucHJvdG90eXBlLl9vblBpbmNoPWZ1bmN0aW9uKHQpe2lmKHRoaXMub3B0aW9ucy56b29tYWJsZSYmdGhpcy5vcHRpb25zLm1vdmVhYmxlKXtjLnByZXZlbnREZWZhdWx0KHQpLHRoaXMucHJvcHMudG91Y2guYWxsb3dEcmFnZ2luZz0hMSx0aGlzLnByb3BzLnRvdWNoLmNlbnRlcnx8KHRoaXMucHJvcHMudG91Y2guY2VudGVyPXRoaXMuZ2V0UG9pbnRlcih0LmNlbnRlcix0aGlzLmJvZHkuZG9tLmNlbnRlcikpLHRoaXMuc3RvcFJvbGxpbmcoKTt2YXIgZT0xLyh0LnNjYWxlK3RoaXMuc2NhbGVPZmZzZXQpLGk9dGhpcy5fcG9pbnRlclRvRGF0ZSh0aGlzLnByb3BzLnRvdWNoLmNlbnRlciksbz1tLmdldEhpZGRlbkR1cmF0aW9uQmV0d2Vlbih0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsdGhpcy5zdGFydCx0aGlzLmVuZCksbj1tLmdldEhpZGRlbkR1cmF0aW9uQmVmb3JlKHRoaXMub3B0aW9ucy5tb21lbnQsdGhpcy5ib2R5LmhpZGRlbkRhdGVzLHRoaXMsaSkscz1vLW4scj1pLW4rKHRoaXMucHJvcHMudG91Y2guc3RhcnQtKGktbikpKmUsYT1pK3MrKHRoaXMucHJvcHMudG91Y2guZW5kLShpK3MpKSplO3RoaXMuc3RhcnRUb0Zyb250PTEtZTw9MCx0aGlzLmVuZFRvRnJvbnQ9ZS0xPD0wO3ZhciBoPW0uc25hcEF3YXlGcm9tSGlkZGVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcyxyLDEtZSwhMCksZD1tLnNuYXBBd2F5RnJvbUhpZGRlbih0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsYSxlLTEsITApO2g9PXImJmQ9PWF8fCh0aGlzLnByb3BzLnRvdWNoLnN0YXJ0PWgsdGhpcy5wcm9wcy50b3VjaC5lbmQ9ZCx0aGlzLnNjYWxlT2Zmc2V0PTEtdC5zY2FsZSxyPWgsYT1kKTt2YXIgbD17YW5pbWF0aW9uOiExLGJ5VXNlcjohMCxldmVudDp0fTt0aGlzLnNldFJhbmdlKHIsYSxsKSx0aGlzLnN0YXJ0VG9Gcm9udD0hMSx0aGlzLmVuZFRvRnJvbnQ9ITB9fSxuLnByb3RvdHlwZS5faXNJbnNpZGVSYW5nZT1mdW5jdGlvbih0KXt2YXIgZSxpPXQuY2VudGVyP3QuY2VudGVyLng6dC5jbGllbnRYO2U9dGhpcy5vcHRpb25zLnJ0bD9pLWMuZ2V0QWJzb2x1dGVMZWZ0KHRoaXMuYm9keS5kb20uY2VudGVyQ29udGFpbmVyKTpjLmdldEFic29sdXRlUmlnaHQodGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXIpLWk7dmFyIG89dGhpcy5ib2R5LnV0aWwudG9UaW1lKGUpO3JldHVybiBvPj10aGlzLnN0YXJ0JiZvPD10aGlzLmVuZH0sbi5wcm90b3R5cGUuX3BvaW50ZXJUb0RhdGU9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLm9wdGlvbnMuZGlyZWN0aW9uO2lmKHMoaSksXCJob3Jpem9udGFsXCI9PWkpcmV0dXJuIHRoaXMuYm9keS51dGlsLnRvVGltZSh0LngpLnZhbHVlT2YoKTt2YXIgbz10aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyLmhlaWdodDtyZXR1cm4gZT10aGlzLmNvbnZlcnNpb24obyksdC55L2Uuc2NhbGUrZS5vZmZzZXR9LG4u
21167cHJvdG90eXBlLmdldFBvaW50ZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5vcHRpb25zLnJ0bD97eDpjLmdldEFic29sdXRlUmlnaHQoZSktdC54LHk6dC55LWMuZ2V0QWJzb2x1dGVUb3AoZSl9Ont4OnQueC1jLmdldEFic29sdXRlTGVmdChlKSx5OnQueS1jLmdldEFic29sdXRlVG9wKGUpfX0sbi5wcm90b3R5cGUuem9vbT1mdW5jdGlvbih0LGUsaSxvKXtudWxsPT1lJiYoZT0odGhpcy5zdGFydCt0aGlzLmVuZCkvMik7dmFyIG49bS5nZXRIaWRkZW5EdXJhdGlvbkJldHdlZW4odGhpcy5ib2R5LmhpZGRlbkRhdGVzLHRoaXMuc3RhcnQsdGhpcy5lbmQpLHM9bS5nZXRIaWRkZW5EdXJhdGlvbkJlZm9yZSh0aGlzLm9wdGlvbnMubW9tZW50LHRoaXMuYm9keS5oaWRkZW5EYXRlcyx0aGlzLGUpLHI9bi1zLGE9ZS1zKyh0aGlzLnN0YXJ0LShlLXMpKSp0LGg9ZStyKyh0aGlzLmVuZC0oZStyKSkqdDt0aGlzLnN0YXJ0VG9Gcm9udD0hKGk+MCksdGhpcy5lbmRUb0Zyb250PSEoLWk+MClcbjt2YXIgZD1tLnNuYXBBd2F5RnJvbUhpZGRlbih0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsYSxpLCEwKSxsPW0uc25hcEF3YXlGcm9tSGlkZGVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcyxoLC1pLCEwKTtkPT1hJiZsPT1ofHwoYT1kLGg9bCk7dmFyIHU9e2FuaW1hdGlvbjohMSxieVVzZXI6ITAsZXZlbnQ6b307dGhpcy5zZXRSYW5nZShhLGgsdSksdGhpcy5zdGFydFRvRnJvbnQ9ITEsdGhpcy5lbmRUb0Zyb250PSEwfSxuLnByb3RvdHlwZS5tb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZW5kLXRoaXMuc3RhcnQsaT10aGlzLnN0YXJ0K2UqdCxvPXRoaXMuZW5kK2UqdDt0aGlzLnN0YXJ0PWksdGhpcy5lbmQ9b30sbi5wcm90b3R5cGUubW92ZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPSh0aGlzLnN0YXJ0K3RoaXMuZW5kKS8yLGk9ZS10LG89dGhpcy5zdGFydC1pLG49dGhpcy5lbmQtaSxzPXthbmltYXRpb246ITEsYnlVc2VyOiEwLGV2ZW50Om51bGx9O3RoaXMuc2V0UmFuZ2UobyxuLHMpfSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4oKXt9dmFyIHM9aSgxOSkscj1vKHMpLGE9aSg2KSxoPW8oYSksZD1pKDQ0KSxsPWkoMTApLHU9aSgzNyksYz1pKDIpLHA9aSg0NSksZj1pKDk3KSxtPWkoMzYpLHY9aSg0Nik7ZChuLnByb3RvdHlwZSksbi5wcm90b3R5cGUuX2NyZWF0ZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3RoaXMuaXNBY3RpdmUoKSYmdGhpcy5lbWl0KFwibW91c2V3aGVlbFwiLHQpO3ZhciBlPTAsaT0wO2lmKFwiZGV0YWlsXCJpbiB0JiYoaT0tMSp0LmRldGFpbCksXCJ3aGVlbERlbHRhXCJpbiB0JiYoaT10LndoZWVsRGVsdGEpLFwid2hlZWxEZWx0YVlcImluIHQmJihpPXQud2hlZWxEZWx0YVkpLFwid2hlZWxEZWx0YVhcImluIHQmJihlPS0xKnQud2hlZWxEZWx0YVgpLFwiYXhpc1wiaW4gdCYmdC5heGlzPT09dC5IT1JJWk9OVEFMX0FYSVMmJihlPS0xKmksaT0wKSxcImRlbHRhWVwiaW4gdCYmKGk9LTEqdC5kZWx0YVkpLFwiZGVsdGFYXCJpbiB0JiYoZT10LmRlbHRhWCksdGhpcy5vcHRpb25zLnpvb21LZXkmJiF0W3RoaXMub3B0aW9ucy56b29tS2V5XSlpZih0LnByZXZlbn
21167REZWZhdWx0KCksdGhpcy5vcHRpb25zLnZlcnRpY2FsU2Nyb2xsJiZNYXRoLmFicyhpKT49TWF0aC5hYnMoZSkpe3ZhciBvPXRoaXMucHJvcHMuc2Nyb2xsVG9wLG49bytpO3RoaXMuaXNBY3RpdmUoKSYmKHRoaXMuX3NldFNjcm9sbFRvcChuKSx0aGlzLl9yZWRyYXcoKSx0aGlzLmVtaXQoXCJzY3JvbGxcIix0KSl9ZWxzZSBpZih0aGlzLm9wdGlvbnMuaG9yaXpvbnRhbFNjcm9sbCl7dmFyIHM9TWF0aC5hYnMoZSk+PU1hdGguYWJzKGkpP2U6aSxyPXMvMTIwKih0aGlzLnJhbmdlLmVuZC10aGlzLnJhbmdlLnN0YXJ0KS8yMCxhPXRoaXMucmFuZ2Uuc3RhcnQrcixoPXRoaXMucmFuZ2UuZW5kK3IsZD17YW5pbWF0aW9uOiExLGJ5VXNlcjohMCxldmVudDp0fTt0aGlzLnJhbmdlLnNldFJhbmdlKGEsaCxkKX19ZnVuY3Rpb24gaSh0KXtpZihzLm9wdGlvbnMudmVydGljYWxTY3JvbGwmJih0LnByZXZlbnREZWZhdWx0KCkscy5pc0FjdGl2ZSgpKSl7dmFyIGU9LXQudGFyZ2V0LnNjcm9sbFRvcDtzLl9zZXRTY3JvbGxUb3AoZSkscy5fcmVkcmF3KCkscy5lbWl0KFwic2Nyb2xsU2lkZVwiLHQpfX1mdW5jdGlvbiBvKHQpe2lmKHQucHJldmVudERlZmF1bHQmJnQucHJldmVudERlZmF1bHQoKSwhKCF0LnRhcmdldC5jbGFzc05hbWUuaW5kZXhPZihcInZpc1wiKT4tMXx8YSkpcmV0dXJuIHQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q9XCJtb3ZlXCIsYT0hMCwhMX1mdW5jdGlvbiBuKHQpe3QucHJldmVudERlZmF1bHQmJnQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbiYmdC5zdG9wUHJvcGFnYXRpb24oKTt0cnl7dmFyIGU9SlNPTi5wYXJzZSh0LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dFwiKSk7aWYoIWV8fCFlLmNvbnRlbnQpcmV0dXJufWNhdGNoKHQpe3JldHVybiExfXJldHVybiBhPSExLHQuY2VudGVyPXt4OnQuY2xpZW50WCx5OnQuY2xpZW50WX0sXCJpdGVtXCIhPT1lLnRhcmdldD9zLml0ZW1TZXQuX29uQWRkSXRlbSh0KTpzLml0ZW1TZXQuX29uRHJvcE9iamVjdE9uSXRlbSh0KSxzLmVtaXQoXCJkcm9wXCIscy5nZXRFdmVudFByb3BlcnRpZXModCkpLCExfXRoaXMuZG9tPXt9LHRoaXMuZG9tLmNvbnRhaW5lcj10LHRoaXMuZG9tLnJvb3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5iYWNrZ3JvdW5kPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20uYmFja2dyb3VuZFZlcnRpY2FsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20uYmFja2dyb3VuZEhvcml6b250YWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5jZW50ZXJDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5sZWZ0Q29udGFpbmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20ucmlnaHRDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5jZW50ZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5sZWZ0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20ucmlnaHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS50b3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5ib3R0b209ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5zaGFkb3dUb3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5zaGFkb3dCb3R0b209ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5zaGFkb3dUb3BMZWZ0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20uc2hhZG93Qm90dG9tTGVmdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLnNoYWRvd1RvcFJpZ2h0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20uc2hhZG93Qm90dG9tUmlnaHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5yb2xsaW5nTW9kZUJ0bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLnJvb3QuY2xhc3NOYW1lPVwidmlzLXRpbWVsaW5lXCIsdGhpcy5kb20uYmFja2dyb3VuZC5jbGFzc05hbWU9XCJ2aXMtcGFuZWwgdmlzLWJhY2tncm91bmRcIix0aGlzLmRvbS5iYWNrZ3JvdW5kVmVydGljYWwuY2xhc3NOYW1lPVwidmlzLXBhbmVsIHZpcy1iYWNrZ3JvdW5kIHZpcy12ZXJ0aWNhbFwiLHRoaXMuZG9tLmJhY2tncm91bmRIb3Jpem9udGFsLmNsYXNzTmFtZT1cInZpcy1wYW5lbCB2aXMtYmFja2dyb3VuZCB2aXMtaG9yaXpvbnRhbFwiLHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lci5jbGFzc05hbWU9XCJ2aXMtcGFuZWwgdmlzLWNlbnRlclwiLHRoaXMuZG9tLmxlZnRDb250YWluZXIuY2xhc3NOYW1lPVwidmlzLXBhbmVsIHZpcy1sZWZ0XCIsdGhpcy5kb20ucmlnaHRDb250YWluZXIuY2xhc3NOYW1lPVwidmlzLXBhbmVsIHZpcy1yaWdodFwiLHRoaXMuZG9tLnRvcC5jbGFzc05hbWU9XCJ2aXMtcGFuZWwgdmlzLXRvcFwiLHRoaXMuZG9tLmJvdHRvbS5jbGFzc05hbWU9XCJ2aXMtcGFuZWwgdmlzLWJvdHRvbVwiLHRoaXMuZG9tLmxlZnQuY2xhc3NOYW1lPVwidmlzLWNvbnRlbnRcIix0aGlzLmRvbS5jZW50ZXIuY2xhc3NOYW1lPVwidmlzLWNvbnRlbnRcIix0aGlzLmRvbS5yaWdodC5jbGFzc05hbWU9XCJ2aXMtY29udGVudFwiLHRoaXMuZG9tLnNoYWRvd1RvcC5jbGFzc05hbWU9XCJ2aXMtc2hhZG93IHZpcy10b3BcIix0aGlzLmRvbS5zaGFkb3dCb3R0b20uY2xhc3NOYW1lPVwidmlzLXNoYWRvdyB2aXMtYm90dG9tXCIsdGhpcy5kb20uc2hhZG93VG9wTGVmdC5jbGFzc05hbWU9XCJ2aXMtc2hhZG93IHZpcy10b3BcIix0aGlzLmRvbS5zaGFkb3dCb3R0b21MZWZ0LmNsYXNzTmFtZT1cInZpcy1zaGFkb3cgdmlzLWJvdHRvbVwiLHRoaXMuZG9tLnNoYWRvd1RvcFJpZ2h0LmNsYXNzTmFtZT1cInZpcy1zaGFkb3cgdmlzLXRvcFwiLHRoaXMuZG9tLnNoYWRvd0JvdHRvbVJpZ2h0LmNsYXNzTmFtZT1cInZpcy1zaGFkb3cgdmlzLWJvdHRvbVwiLHRoaXMuZG9tLnJvbGxpbmdNb2RlQnRuLmNsYXNzTmFtZT1cInZpcy1yb2xsaW5nLW1vZGUtYnRuXCIsdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5iYWNrZ3JvdW5kKSx0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHRoaXMuZG9tLmJhY2tncm91bmRWZXJ0aWNhbCksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5iYWNrZ3JvdW5kSG9yaXpvbn
21167RhbCksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5jZW50ZXJDb250YWluZXIpLHRoaXMuZG9tLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5kb20ubGVmdENvbnRhaW5lciksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5yaWdodENvbnRhaW5lciksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS50b3ApLHRoaXMuZG9tLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5kb20uYm90dG9tKSx0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHRoaXMuZG9tLmJvdHRvbSksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5yb2xsaW5nTW9kZUJ0biksdGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLmNlbnRlciksdGhpcy5kb20ubGVmdENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5sZWZ0KSx0aGlzLmRvbS5yaWdodENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5yaWdodCksdGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLnNoYWRvd1RvcCksdGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLnNoYWRvd0JvdHRvbSksdGhpcy5kb20ubGVmdENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5zaGFkb3dUb3BMZWZ0KSx0aGlzLmRvbS5sZWZ0Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLnNoYWRvd0JvdHRvbUxlZnQpLHRoaXMuZG9tLnJpZ2h0Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLnNoYWRvd1RvcFJpZ2h0KSx0aGlzLmRvbS5yaWdodENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5zaGFkb3dCb3R0b21SaWdodCksdGhpcy5wcm9wcz17cm9vdDp7fSxiYWNrZ3JvdW5kOnt9LGNlbnRlckNvbnRhaW5lcjp7fSxsZWZ0Q29udGFpbmVyOnt9LHJpZ2h0Q29udGFpbmVyOnt9LGNlbnRlcjp7fSxsZWZ0Ont9LHJpZ2h0Ont9LHRvcDp7fSxib3R0b206e30sYm9yZGVyOnt9LHNjcm9sbFRvcDowLHNjcm9sbFRvcE1pbjowfSx0aGlzLm9uKFwicmFuZ2VjaGFuZ2VcIixmdW5jdGlvbigpeyEwPT09dGhpcy5pbml0aWFsRHJhd0RvbmUmJnRoaXMuX3JlZHJhdygpfS5iaW5kKHRoaXMpKSx0aGlzLm9uKFwicmFuZ2VjaGFuZ2VkXCIsZnVuY3Rpb24oKXt0aGlzLmluaXRpYWxSYW5nZUNoYW5nZURvbmV8fCh0aGlzLmluaXRpYWxSYW5nZUNoYW5nZURvbmU9ITApfS5iaW5kKHRoaXMpKSx0aGlzLm9uKFwidG91Y2hcIix0aGlzLl9vblRvdWNoLmJpbmQodGhpcykpLHRoaXMub24oXCJwYW5tb3ZlXCIsdGhpcy5fb25EcmFnLmJpbmQodGhpcykpO3ZhciBzPXRoaXM7dGhpcy5fb3JpZ1JlZHJhdz10aGlzLl9yZWRyYXcuYmluZCh0aGlzKSx0aGlzLl9yZWRyYXc9Yy50aHJvdHRsZSh0aGlzLl9vcmlnUmVkcmF3KSx0aGlzLm9uKFwiX2NoYW5nZVwiLGZ1bmN0aW9uKHQpe3MuaXRlbVNldCYmcy5pdGVtU2V0LmluaXRpYWxJdGVtU2V0RHJhd24mJnQmJjE9PXQucXVldWU/cy5fcmVkcmF3KCk6cy5fb3JpZ1JlZHJhdygpfSksdGhpcy5oYW1tZXI9bmV3IGwodGhpcy5kb20ucm9vdCk7dmFyIHI9dGhpcy5oYW1tZXIuZ2V0KFwicGluY2hcIikuc2V0KHtlbmFibGU6ITB9KTt1LmRpc2FibGVQcmV2ZW50RGVmYXVsdFZlcnRpY2FsbHkociksdGhpcy5oYW1tZXIuZ2V0KFwicGFuXCIpLnNldCh7dGhyZXNob2xkOjUsZGlyZWN0aW9uOmwuRElSRUNUSU9OX0hPUklaT05UQUx9KSx0aGlzLmxpc3RlbmVycz17fSxbXCJ0YXBcIixcImRvdWJsZXRhcFwiLFwicHJlc3NcIixcInBpbmNoXCIsXCJwYW5cIixcInBhbnN0YXJ0XCIsXCJwYW5tb3ZlXCIsXCJwYW5lbmRcIl0uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbihlKXtzLmlzQWN0aXZlKCkmJnMuZW1pdCh0LGUpfTtzLmhhbW1lci5vbih0LGUpLHMubGlzdGVuZXJzW3RdPWV9KSx1Lm9uVG91Y2godGhpcy5oYW1tZXIsZnVuY3Rpb24odCl7cy5lbWl0KFwidG91Y2hcIix0KX0uYmluZCh0aGlzKSksdS5vblJlbGVhc2UodGhpcy5oYW1tZXIsZnVuY3Rpb24odCl7cy5lbWl0KFwicmVsZWFzZVwiLHQpfS5iaW5kKHRoaXMpKSx0aGlzLmRvbS5jZW50ZXJDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcj8odGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXdoZWVsXCIsZS5iaW5kKHRoaXMpLCExKSx0aGlzLmRvbS5jZW50ZXJDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTU1vdXNlU2Nyb2xsXCIsZS5iaW5kKHRoaXMpLCExKSk6dGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmF0dGFjaEV2ZW50KFwib25tb3VzZXdoZWVsXCIsZS5iaW5kKHRoaXMpKSx0aGlzLmRvbS5sZWZ0LnBhcmVudE5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLGkuYmluZCh0aGlzKSksdGhpcy5kb20ucmlnaHQucGFyZW50Tm9kZS5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsaS5iaW5kKHRoaXMpKTt2YXIgYT0hMTtpZih0aGlzLmRvbS5jZW50ZXIuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdvdmVyXCIsby5iaW5kKHRoaXMpLCExKSx0aGlzLmRvbS5jZW50ZXIuYWRkRXZlbnRMaXN0ZW5lcihcImRyb3BcIixuLmJpbmQodGhpcyksITEpLHRoaXMuY3VzdG9tVGltZXM9W10sdGhpcy50b3VjaD17fSx0aGlzLnJlZHJhd0NvdW50PTAsdGhpcy5pbml0aWFsRHJhd0RvbmU9ITEsdGhpcy5pbml0aWFsUmFuZ2VDaGFuZ2VEb25lPSExLCF0KXRocm93IG5ldyBFcnJvcihcIk5vIGNvbnRhaW5lciBwcm92aWRlZFwiKTt0LmFwcGVuZENoaWxkKHRoaXMuZG9tLnJvb3QpfSxuLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPVtcIndpZHRoXCIsXCJoZWlnaHRcIixcIm1pbkhlaWdodFwiLFwibWF4SGVpZ2h0XCIsXCJhdXRvUmVzaXplXCIsXCJzdGFydFwiLFwiZW5kXCIsXCJjbGlja1RvVXNlXCIsXCJkYXRhQXR0cmlidXRlc1wiLFwiaGlkZGVuRGF0ZXNcIixcImxvY2FsZVwiLFwibG9jYWxlc1wiLFwibW9tZW50XCIsXCJydGxcIixcInpvb21LZXlcIixcImhvcml6b250YWxTY3JvbGxcIixcInZlcnRpY2FsU2Nyb2xsXCJdO2lmKGMuc2VsZWN0aXZlRXh0ZW5kKGUsdGhpcy5vcHRpb25zLHQpLHRoaXMuZG9tLnJvbGxpbmdNb2RlQnRuLnN0eWxlLnZpc2liaWxpdHk9XCJoaWRkZW5cIix0aGlzLm9wdGlvbnMucnRsJiYodGhpcy5kb20uY29udGFpbmVyLnN0eWxlLmRpcmVjdGlvbj1cInJ0bFwiLHRoaXMuZG9tLmJhY2tncm91bmRWZXJ0aWNhbC5jbGFzc05hbWU9XCJ2aXMtcGFuZWwgdmlzLWJhY2tncm91bmQgdmlzLXZlcnRpY2FsLXJ0bFwiKSx0aGlzLm9wdGlvbnMudmVydGljYWxTY3JvbGwmJih0aGlzLm9wdGlvbnMucnRsP3RoaXMuZG9tLnJpZ2h0Q29udGFpbmVyLmNsYXNzTmFtZT1cInZpcy1wYW5lbCB2aXMtcmlnaHQgdmlzLX
21167ZlcnRpY2FsLXNjcm9sbFwiOnRoaXMuZG9tLmxlZnRDb250YWluZXIuY2xhc3NOYW1lPVwidmlzLXBhbmVsIHZpcy1sZWZ0IHZpcy12ZXJ0aWNhbC1zY3JvbGxcIiksXCJvYmplY3RcIiE9PSgwLGguZGVmYXVsdCkodGhpcy5vcHRpb25zLm9yaWVudGF0aW9uKSYmKHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbj17aXRlbTp2b2lkIDAsYXhpczp2b2lkIDB9KSxcIm9yaWVudGF0aW9uXCJpbiB0JiYoXCJzdHJpbmdcIj09dHlwZW9mIHQub3JpZW50YXRpb24/dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uPXtpdGVtOnQub3JpZW50YXRpb24sYXhpczp0Lm9yaWVudGF0aW9ufTpcIm9iamVjdFwiPT09KDAsaC5kZWZhdWx0KSh0Lm9yaWVudGF0aW9uKSYmKFwiaXRlbVwiaW4gdC5vcmllbnRhdGlvbiYmKHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtPXQub3JpZW50YXRpb24uaXRlbSksXCJheGlzXCJpbiB0Lm9yaWVudGF0aW9uJiYodGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXM9dC5vcmllbnRhdGlvbi5heGlzKSkpLFwiYm90aFwiPT09dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXMpe2lmKCF0aGlzLnRpbWVBeGlzMil7dmFyIGk9dGhpcy50aW1lQXhpczI9bmV3IHAodGhpcy5ib2R5KTtpLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7dmFyIGU9dD9jLmV4dGVuZCh7fSx0KTp7fTtlLm9yaWVudGF0aW9uPVwidG9wXCIscC5wcm90b3R5cGUuc2V0T3B0aW9ucy5jYWxsKGksZSl9LHRoaXMuY29tcG9uZW50cy5wdXNoKGkpfX1lbHNlIGlmKHRoaXMudGltZUF4aXMyKXt2YXIgbz10aGlzLmNvbXBvbmVudHMuaW5kZXhPZih0aGlzLnRpbWVBeGlzMik7LTEhPT1vJiZ0aGlzLmNvbXBvbmVudHMuc3BsaWNlKG8sMSksdGhpcy50aW1lQXhpczIuZGVzdHJveSgpLHRoaXMudGltZUF4aXMyPW51bGx9aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgdC5kcmF3UG9pbnRzJiYodC5kcmF3UG9pbnRzPXtvblJlbmRlcjp0LmRyYXdQb2ludHN9KSxcImhpZGRlbkRhdGVzXCJpbiB0aGlzLm9wdGlvbnMmJm0uY29udmVydEhpZGRlbk9wdGlvbnModGhpcy5vcHRpb25zLm1vbWVudCx0aGlzLmJvZHksdGhpcy5vcHRpb25zLmhpZGRlbkRhdGVzKSxcImNsaWNrVG9Vc2VcImluIHQmJih0LmNsaWNrVG9Vc2U/dGhpcy5hY3RpdmF0b3J8fCh0aGlzLmFjdGl2YXRvcj1uZXcgZih0aGlzLmRvbS5yb290KSk6dGhpcy5hY3RpdmF0b3ImJih0aGlzLmFjdGl2YXRvci5kZXN0cm95KCksZGVsZXRlIHRoaXMuYWN0aXZhdG9yKSksXCJzaG93Q3VzdG9tVGltZVwiaW4gdCl0aHJvdyBuZXcgRXJyb3IoXCJPcHRpb24gYHNob3dDdXN0b21UaW1lYCBpcyBkZXByZWNhdGVkLiBDcmVhdGUgYSBjdXN0b20gdGltZSBiYXIgdmlhIHRpbWVsaW5lLmFkZEN1c3RvbVRpbWUodGltZSBbLCBpZF0pXCIpO3RoaXMuX2luaXRBdXRvUmVzaXplKCl9aWYodGhpcy5jb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2V0T3B0aW9ucyh0KX0pLFwiY29uZmlndXJlXCJpbiB0KXt0aGlzLmNvbmZpZ3VyYXRvcnx8KHRoaXMuY29uZmlndXJhdG9yPXRoaXMuX2NyZWF0ZUNvbmZpZ3VyYXRvcigpKSx0aGlzLmNvbmZpZ3VyYXRvci5zZXRPcHRpb25zKHQuY29uZmlndXJlKTt2YXIgbj1jLmRlZXBFeHRlbmQoe30sdGhpcy5vcHRpb25zKTt0aGlzLmNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbih0KXtjLmRlZXBFeHRlbmQobix0Lm9wdGlvbnMpfSksdGhpcy5jb25maWd1cmF0b3Iuc2V0TW9kdWxlT3B0aW9ucyh7Z2xvYmFsOm59KX10aGlzLl9yZWRyYXcoKX0sbi5wcm90b3R5cGUuaXNBY3RpdmU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5hY3RpdmF0b3J8fHRoaXMuYWN0aXZhdG9yLmFjdGl2ZX0sbi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuc2V0SXRlbXMobnVsbCksdGhpcy5zZXRHcm91cHMobnVsbCksdGhpcy5vZmYoKSx0aGlzLl9zdG9wQXV0b1Jlc2l6ZSgpLHRoaXMuZG9tLnJvb3QucGFyZW50Tm9kZSYmdGhpcy5kb20ucm9vdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLnJvb3QpLHRoaXMuZG9tPW51bGwsdGhpcy5hY3RpdmF0b3ImJih0aGlzLmFjdGl2YXRvci5kZXN0cm95KCksZGVsZXRlIHRoaXMuYWN0aXZhdG9yKTtmb3IodmFyIHQgaW4gdGhpcy5saXN0ZW5lcnMpdGhpcy5saXN0ZW5lcnMuaGFzT3duUHJvcGVydHkodCkmJmRlbGV0ZSB0aGlzLmxpc3RlbmVyc1t0XTt0aGlzLmxpc3RlbmVycz1udWxsLHRoaXMuaGFtbWVyPW51bGwsdGhpcy5jb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQuZGVzdHJveSgpfSksdGhpcy5ib2R5PW51bGx9LG4ucHJvdG90eXBlLnNldEN1c3RvbVRpbWU9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmN1c3RvbVRpbWVzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gZT09PXQub3B0aW9ucy5pZH0pO2lmKDA9PT1pLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXN0b20gdGltZSBiYXIgZm91bmQgd2l0aCBpZCBcIisoMCxyLmRlZmF1bHQpKGUpKTtpLmxlbmd0aD4wJiZpWzBdLnNldEN1c3RvbVRpbWUodCl9LG4ucHJvdG90eXBlLmdldEN1c3RvbVRpbWU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jdXN0b21UaW1lcy5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUub3B0aW9ucy5pZD09PXR9KTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiTm8gY3VzdG9tIHRpbWUgYmFyIGZvdW5kIHdpdGggaWQgXCIrKDAsci5kZWZhdWx0KSh0KSk7cmV0dXJuIGVbMF0uZ2V0Q3VzdG9tVGltZSgpfSxuLnByb3RvdHlwZS5zZXRDdXN0b21UaW1lVGl0bGU9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmN1c3RvbVRpbWVzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5vcHRpb25zLmlkPT09ZX0pO2lmKDA9PT1pLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXN0b20gdGltZSBiYXIgZm91bmQgd2l0aCBpZCBcIisoMCxyLmRlZmF1bHQpKGUpKTtpZihpLmxlbmd0aD4wKXJldHVybiBpWzBdLnNldEN1c3RvbVRpdGxlKHQpfSxuLnByb3RvdHlwZS5nZXRFdmVudFByb3BlcnRpZXM9ZnVuY3Rpb24odCl7cmV0dXJue2V2ZW50OnR9fSxuLnByb3RvdHlwZS5hZGRDdXN0b21UaW1lPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dm9pZCAwIT09dD9jLmNvbnZlcnQodCxcIkRhdGVcIikudmFsdWVPZigpOm5ldyBEYXRlO2lmKHRoaXMuY3VzdG9tVGltZXMuc29tZShmdW5jdGlvbih0KXtyZXR1cm4gdC5vcHRpb25zLmlkPT09ZX0pKXRocm93IG5ldyBFcnJvcihcIkEgY3VzdG9tIHRpbWUgd2l0aCBpZCBcIisoMCxyLmRlZmF1bHQpKGUpK1wiIGFscmVhZHkgZXhpc3RzXCIpO3ZhciBvPW5ldyB2KHRoaXMuYm9keSxjLmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMse3RpbWU6aSxpZDplfSkpO3JldHVybiB0aGlzLmN1c3RvbVRpbWVzLnB1c2gobyksdGhpcy5jb21wb25lbnRzLnB1c2gobyksdGhpcy5fcmVkcmF3KCksZX0sbi5wcm90b3R5cGUucmVtb3ZlQ3VzdG9tVGltZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmN1c3RvbVRpbWVzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS5vcHRpb25zLmlkPT09dH0pO2lmKDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXN0b20gdGltZSBiYXIgZm91bmQgd2l0aCBpZCBcIisoMCxyLmRlZmF1bHQpKHQpKTtlLmZvckVhY2goZnVuY3Rpb24odCl7dGhpcy5jdXN0b21UaW1lcy5zcGxpY2UodGhpcy5jdXN0b21UaW1lcy5pbmRleE9mKHQpLDEpLHRoaXMuY29tcG9uZW50cy5zcGxpY2UodGhpcy5jb21wb25lbnRzLmluZGV4T2YodCksMSksdC5kZXN0cm95KCl9LmJpbmQodGhpcykpfSxuLnByb3RvdHlwZS5nZXRWaXNpYmxlSXRlbXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVtU2V0JiZ0aGlzLml0ZW1TZXQuZ2V0VmlzaWJsZUl0ZW1zKCl8fFtdfSxuLnByb3RvdHlwZS5maXQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldERhdGFSYW5nZSgpO2lmKG51bGwhPT1pLm1pbnx8bnVsbCE9PWkubWF4KXt2YXIgbz1pLm1heC1pLm1pbixuPW5ldyBEYXRlKGkubWluLnZhbHVlT2YoKS0uMDEqbykscz1uZXcgRGF0ZShpLm1heC52YWx1ZU9mKCkrLjAxKm8pLHI9IXR8fHZvaWQgMD09PXQuYW5pbWF0aW9ufHx0LmFuaW1hdGlvbjt0aGlzLnJhbmdlLnNldFJhbmdlKG4scyx7YW5pbWF0aW9uOnJ9LGUpfX0sbi5wcm90b3R5cGUuZ2V0RGF0YVJhbmdlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGludm9rZSBhYnN0cmFjdCBtZXRob2QgZ2V0RGF0YVJhbmdlXCIpfSxuLnByb3RvdHlwZS5zZXRXaW5kb3c9ZnVuY3Rpb24odCxlLGksbyl7XCJmdW5jdGlvblwiPT10eXBlb2YgYXJndW1lbnRzWzJdJiYobz1hcmd1bWVudHNbMl0saT17fSk7dmFyIG4sczsxPT1hcmd1bWVudHMubGVuZ3RoPyhzPWFyZ3VtZW50c1swXSxuPXZvaWQgMD09PX
21167MuYW5pbWF0aW9ufHxzLmFuaW1hdGlvbix0aGlzLnJhbmdlLnNldFJhbmdlKHMuc3RhcnQscy5lbmQse2FuaW1hdGlvbjpufSkpOjI9PWFyZ3VtZW50cy5sZW5ndGgmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGFyZ3VtZW50c1sxXT8ocz1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0sbj12b2lkIDA9PT1zLmFuaW1hdGlvbnx8cy5hbmltYXRpb24sdGhpcy5yYW5nZS5zZXRSYW5nZShzLnN0YXJ0LHMuZW5kLHthbmltYXRpb246bn0sbykpOihuPSFpfHx2b2lkIDA9PT1pLmFuaW1hdGlvbnx8aS5hbmltYXRpb24sdGhpcy5yYW5nZS5zZXRSYW5nZSh0LGUse2FuaW1hdGlvbjpufSxvKSl9LG4ucHJvdG90eXBlLm1vdmVUbz1mdW5jdGlvbih0LGUsaSl7XCJmdW5jdGlvblwiPT10eXBlb2YgYXJndW1lbnRzWzFdJiYoaT1hcmd1bWVudHNbMV0sZT17fSk7dmFyIG89dGhpcy5yYW5nZS5lbmQtdGhpcy5yYW5nZS5zdGFydCxuPWMuY29udmVydCh0LFwiRGF0ZVwiKS52YWx1ZU9mKCkscz1uLW8vMixyPW4rby8yLGE9IWV8fHZvaWQgMD09PWUuYW5pbWF0aW9ufHxlLmFuaW1hdGlvbjt0aGlzLnJhbmdlLnNldFJhbmdlKHMscix7YW5pbWF0aW9uOmF9LGkpfSxuLnByb3RvdHlwZS5nZXRXaW5kb3c9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJhbmdlLmdldFJhbmdlKCk7cmV0dXJue3N0YXJ0Om5ldyBEYXRlKHQuc3RhcnQpLGVuZDpuZXcgRGF0ZSh0LmVuZCl9fSxuLnByb3RvdHlwZS56b29tSW49ZnVuY3Rpb24odCxlLGkpe2lmKCEoIXR8fHQ8MHx8dD4xKSl7XCJmdW5jdGlvblwiPT10eXBlb2YgYXJndW1lbnRzWzFdJiYoaT1hcmd1bWVudHNbMV0sZT17fSk7dmFyIG89dGhpcy5nZXRXaW5kb3coKSxuPW8uc3RhcnQudmFsdWVPZigpLHM9by5lbmQudmFsdWVPZigpLHI9cy1uLGE9ci8oMSt0KSxoPShyLWEpLzIsZD1uK2gsbD1zLWg7dGhpcy5zZXRXaW5kb3coZCxsLGUsaSl9fSxuLnByb3RvdHlwZS56b29tT3V0PWZ1bmN0aW9uKHQsZSxpKXtpZighKCF0fHx0PDB8fHQ+MSkpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGFyZ3VtZW50c1sxXSYmKGk9YXJndW1lbnRzWzFdLGU9e30pO3ZhciBvPXRoaXMuZ2V0V2luZG93KCksbj1vLnN0YXJ0LnZhbHVlT2YoKSxzPW8uZW5kLnZhbHVlT2YoKSxyPXMtbixhPW4tcip0LzIsaD1zK3IqdC8yO3RoaXMuc2V0V2luZG93KGEsaCxlLGkpfX0sbi5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dGhpcy5fcmVkcmF3KCl9LG4ucHJvdG90eXBlLl9yZWRyYXc9ZnVuY3Rpb24oKXt0aGlzLnJlZHJhd0NvdW50Kys7dmFyIHQ9ITEsZT10aGlzLm9wdGlvbnMsaT10aGlzLnByb3BzLG89dGhpcy5kb207aWYobyYmby5jb250YWluZXImJjAhPW8ucm9vdC5vZmZzZXRXaWR0aCl7bS51cGRhdGVIaWRkZW5EYXRlcyh0aGlzLm9wdGlvbnMubW9tZW50LHRoaXMuYm9keSx0aGlzLm9wdGlvbnMuaGlkZGVuRGF0ZXMpLFwidG9wXCI9PWUub3JpZW50YXRpb24/KGMuYWRkQ2xhc3NOYW1lKG8ucm9vdCxcInZpcy10b3BcIiksYy5yZW1vdmVDbGFzc05hbWUoby5yb290LFwidmlzLWJvdHRvbVwiKSk6KGMucmVtb3ZlQ2xhc3NOYW1lKG8ucm9vdCxcInZpcy10b3BcIiksYy5hZGRDbGFzc05hbWUoby5yb290LFwidmlzLWJvdHRvbVwiKSksby5yb290LnN0eWxlLm1heEhlaWdodD1jLm9wdGlvbi5hc1NpemUoZS5tYXhIZWlnaHQsXCJcIiksby5yb290LnN0eWxlLm1pbkhlaWdodD1jLm9wdGlvbi5hc1NpemUoZS5taW5IZWlnaHQsXCJcIiksby5yb290LnN0eWxlLndpZHRoPWMub3B0aW9uLmFzU2l6ZShlLndpZHRoLFwiXCIpLGkuYm9yZGVyLmxlZnQ9KG8uY2VudGVyQ29udGFpbmVyLm9mZnNldFdpZHRoLW8uY2VudGVyQ29udGFpbmVyLmNsaWVudFdpZHRoKS8yLGkuYm9yZGVyLnJpZ2h0PWkuYm9yZGVyLmxlZnQsaS5ib3JkZXIudG9wPShvLmNlbnRlckNvbnRhaW5lci5vZmZzZXRIZWlnaHQtby5jZW50ZXJDb250YWluZXIuY2xpZW50SGVpZ2h0KS8yLGkuYm9yZGVyLmJvdHRvbT1pLmJvcmRlci50b3AsaS5ib3JkZXJSb290SGVpZ2h0PW8ucm9vdC5vZmZzZXRIZWlnaHQtby5yb290LmNsaWVudEhlaWdodCxpLmJvcmRlclJvb3RXaWR0aD1vLnJvb3Qub2Zmc2V0V2lkdGgtby5yb290LmNsaWVudFdpZHRoLDA9PT1vLmNlbnRlckNvbnRhaW5lci5jbGllbnRIZWlnaHQmJihpLmJvcmRlci5sZWZ0PWkuYm9yZGVyLnRvcCxpLmJvcmRlci5yaWdodD1pLmJvcmRlci5sZWZ0KSwwPT09by5yb290LmNsaWVudEhlaWdodCYmKGkuYm9yZGVyUm9vdFdpZHRoPWkuYm9yZGVyUm9vdEhlaWdodCksaS5jZW50ZXIuaGVpZ2h0PW8uY2VudGVyLm9mZnNldEhlaWdodCxpLmxlZnQuaGVpZ2h0PW8ubGVmdC5vZmZzZXRIZWlnaHQsaS5yaWdodC5oZWlnaHQ9by5yaWdodC5vZmZzZXRIZWlnaHQsaS50b3AuaGVpZ2h0PW8udG9wLmNsaWVudEhlaWdodHx8LWkuYm9yZGVyLnRvcCxpLmJvdHRvbS5oZWlnaHQ9by5ib3R0b20uY2xpZW50SGVpZ2h0fHwtaS5ib3JkZXIuYm90dG9tO3ZhciBuPU1hdGgubWF4KGkubGVmdC5oZWlnaHQsaS5jZW50ZXIuaGVpZ2h0LGkucmlnaHQuaGVpZ2h0KSxzPWkudG9wLmhlaWdodCtuK2kuYm90dG9tLmhlaWdodCtpLmJvcmRlclJvb3RIZWlnaHQraS5ib3JkZXIudG9wK2kuYm9yZGVyLmJvdHRvbTtvLnJvb3Quc3R5bGUuaGVpZ2h0PWMub3B0aW9uLmFzU2l6ZShlLmhlaWdodCxzK1wicHhcIiksaS5yb290LmhlaWdodD1vLnJvb3Qub2Zmc2V0SGVpZ2h0LGkuYmFja2dyb3VuZC5oZWlnaHQ9aS5yb290LmhlaWdodC1pLmJvcmRlclJvb3RIZWlnaHQ7dmFyIHI9aS5yb290LmhlaWdodC1pLnRvcC5oZWlnaHQtaS5ib3R0b20uaGVpZ2h0LWkuYm9yZGVyUm9vdEhlaWdodDtpLmNlbnRlckNvbnRhaW5lci5oZWlnaHQ9cixpLmxlZnRDb250YWluZXIuaGVpZ2h0PXIsaS5yaWdodENvbnRhaW5lci5oZWlnaHQ9aS5sZWZ0Q29udGFpbmVyLmhlaWdodCxpLnJvb3Qud2lkdGg9by5yb290Lm9mZnNldFdpZHRoLGkuYmFja2dyb3VuZC53aWR0aD1pLnJvb3Qud2lkdGgtaS5ib3JkZXJSb290V2lkdGgsdGhpcy5pbml0aWFsRHJhd0RvbmV8fChpLnNjcm9sbGJhcldpZHRoPWMuZ2V0U2Nyb2xsQmFyV2lkdGgoKSksZS52ZXJ0aWNhbFNjcm9sbD9lLnJ0bD8oaS5sZWZ0LndpZHR
21167oPW8ubGVmdENvbnRhaW5lci5jbGllbnRXaWR0aHx8LWkuYm9yZGVyLmxlZnQsaS5yaWdodC53aWR0aD1vLnJpZ2h0Q29udGFpbmVyLmNsaWVudFdpZHRoK2kuc2Nyb2xsYmFyV2lkdGh8fC1pLmJvcmRlci5yaWdodCk6KGkubGVmdC53aWR0aD1vLmxlZnRDb250YWluZXIuY2xpZW50V2lkdGgraS5zY3JvbGxiYXJXaWR0aHx8LWkuYm9yZGVyLmxlZnQsaS5yaWdodC53aWR0aD1vLnJpZ2h0Q29udGFpbmVyLmNsaWVudFdpZHRofHwtaS5ib3JkZXIucmlnaHQpOihpLmxlZnQud2lkdGg9by5sZWZ0Q29udGFpbmVyLmNsaWVudFdpZHRofHwtaS5ib3JkZXIubGVmdCxpLnJpZ2h0LndpZHRoPW8ucmlnaHRDb250YWluZXIuY2xpZW50V2lkdGh8fC1pLmJvcmRlci5yaWdodCksdGhpcy5fc2V0RE9NKCk7dmFyIGE9dGhpcy5fdXBkYXRlU2Nyb2xsVG9wKCk7XCJ0b3BcIiE9ZS5vcmllbnRhdGlvbi5pdGVtJiYoYSs9TWF0aC5tYXgoaS5jZW50ZXJDb250YWluZXIuaGVpZ2h0LWkuY2VudGVyLmhlaWdodC1pLmJvcmRlci50b3AtaS5ib3JkZXIuYm90dG9tLDApKSxvLmNlbnRlci5zdHlsZS50b3A9YStcInB4XCI7dmFyIGg9MD09aS5zY3JvbGxUb3A/XCJoaWRkZW5cIjpcIlwiLGQ9aS5zY3JvbGxUb3A9PWkuc2Nyb2xsVG9wTWluP1wiaGlkZGVuXCI6XCJcIjtvLnNoYWRvd1RvcC5zdHlsZS52aXNpYmlsaXR5PWgsby5zaGFkb3dCb3R0b20uc3R5bGUudmlzaWJpbGl0eT1kLG8uc2hhZG93VG9wTGVmdC5zdHlsZS52aXNpYmlsaXR5PWgsby5zaGFkb3dCb3R0b21MZWZ0LnN0eWxlLnZpc2liaWxpdHk9ZCxvLnNoYWRvd1RvcFJpZ2h0LnN0eWxlLnZpc2liaWxpdHk9aCxvLnNoYWRvd0JvdHRvbVJpZ2h0LnN0eWxlLnZpc2liaWxpdHk9ZCxlLnZlcnRpY2FsU2Nyb2xsJiYoby5yaWdodENvbnRhaW5lci5jbGFzc05hbWU9XCJ2aXMtcGFuZWwgdmlzLXJpZ2h0IHZpcy12ZXJ0aWNhbC1zY3JvbGxcIixvLmxlZnRDb250YWluZXIuY2xhc3NOYW1lPVwidmlzLXBhbmVsIHZpcy1sZWZ0IHZpcy12ZXJ0aWNhbC1zY3JvbGxcIixvLnNoYWRvd1RvcFJpZ2h0LnN0eWxlLnZpc2liaWxpdHk9XCJoaWRkZW5cIixvLnNoYWRvd0JvdHRvbVJpZ2h0LnN0eWxlLnZpc2liaWxpdHk9XCJoaWRkZW5cIixvLnNoYWRvd1RvcExlZnQuc3R5bGUudmlzaWJpbGl0eT1cImhpZGRlblwiLG8uc2hhZG93Qm90dG9tTGVmdC5zdHlsZS52aXNpYmlsaXR5PVwiaGlkZGVuXCIsby5sZWZ0LnN0eWxlLnRvcD1cIjBweFwiLG8ucmlnaHQuc3R5bGUudG9wPVwiMHB4XCIpLCghZS52ZXJ0aWNhbFNjcm9sbHx8aS5jZW50ZXIuaGVpZ2h0PGkuY2VudGVyQ29udGFpbmVyLmhlaWdodCkmJihvLmxlZnQuc3R5bGUudG9wPWErXCJweFwiLG8ucmlnaHQuc3R5bGUudG9wPWErXCJweFwiLG8ucmlnaHRDb250YWluZXIuY2xhc3NOYW1lPW8ucmlnaHRDb250YWluZXIuY2xhc3NOYW1lLnJlcGxhY2UobmV3IFJlZ0V4cChcIig/Ol58XFxcXHMpdmlzLXZlcnRpY2FsLXNjcm9sbCg/OlxcXFxzfCQpXCIpLFwiIFwiKSxvLmxlZnRDb250YWluZXIuY2xhc3NOYW1lPW8ubGVmdENvbnRhaW5lci5jbGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKFwiKD86XnxcXFxccyl2aXMtdmVydGljYWwtc2Nyb2xsKD86XFxcXHN8JClcIiksXCIgXCIpLGkubGVmdC53aWR0aD1vLmxlZnRDb250YWluZXIuY2xpZW50V2lkdGh8fC1pLmJvcmRlci5sZWZ0LGkucmlnaHQud2lkdGg9by5yaWdodENvbnRhaW5lci5jbGllbnRXaWR0aHx8LWkuYm9yZGVyLnJpZ2h0LHRoaXMuX3NldERPTSgpKTt2YXIgdT1pLmNlbnRlci5oZWlnaHQ+aS5jZW50ZXJDb250YWluZXIuaGVpZ2h0O3RoaXMuaGFtbWVyLmdldChcInBhblwiKS5zZXQoe2RpcmVjdGlvbjp1P2wuRElSRUNUSU9OX0FMTDpsLkRJUkVDVElPTl9IT1JJWk9OVEFMfSksdGhpcy5jb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24oZSl7dD1lLnJlZHJhdygpfHx0fSk7aWYodCl7aWYodGhpcy5yZWRyYXdDb3VudDw1KXJldHVybiB2b2lkIHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfY2hhbmdlXCIpO2NvbnNvbGUubG9nKFwiV0FSTklORzogaW5maW5pdGUgbG9vcCBpbiByZWRyYXc/XCIpfWVsc2UgdGhpcy5yZWRyYXdDb3VudD0wO3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJjaGFuZ2VkXCIpfX0sbi5wcm90b3R5cGUuX3NldERPTT1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMsZT10aGlzLmRvbTt0LmxlZnRDb250YWluZXIud2lkdGg9dC5sZWZ0LndpZHRoLHQucmlnaHRDb250YWluZXIud2lkdGg9dC5yaWdodC53aWR0aDt2YXIgaT10LnJvb3Qud2lkdGgtdC5sZWZ0LndpZHRoLXQucmlnaHQud2lkdGgtdC5ib3JkZXJSb290V2lkdGg7dC5jZW50ZXIud2lkdGg9aSx0LmNlbnRlckNvbnRhaW5lci53aWR0aD1pLHQudG9wLndpZHRoPWksdC5ib3R0b20ud2lkdGg9aSxlLmJhY2tncm91bmQuc3R5bGUuaGVpZ2h0PXQuYmFja2dyb3VuZC5oZWlnaHQrXCJweFwiLGUuYmFja2dyb3VuZFZlcnRpY2FsLnN0eWxlLmhlaWdodD10LmJhY2tncm91bmQuaGVpZ2h0K1wicHhcIixlLmJhY2tncm91bmRIb3Jpem9udGFsLnN0eWxlLmhlaWdodD10LmNlbnRlckNvbnRhaW5lci5oZWlnaHQrXCJweFwiLGUuY2VudGVyQ29udGFpbmVyLnN0eWxlLmhlaWdodD10LmNlbnRlckNvbnRhaW5lci5oZWlnaHQrXCJweFwiLGUubGVmdENvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dC5sZWZ0Q29udGFpbmVyLmhlaWdodCtcInB4XCIsZS5yaWdodENvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dC5yaWdodENvbnRhaW5lci5oZWlnaHQrXCJweFwiLGUuYmFja2dyb3VuZC5zdHlsZS53aWR0aD10LmJhY2tncm91bmQud2lkdGgrXCJweFwiLGUuYmFja2dyb3VuZFZlcnRpY2FsLnN0eWxlLndpZHRoP
21167XQuY2VudGVyQ29udGFpbmVyLndpZHRoK1wicHhcIixlLmJhY2tncm91bmRIb3Jpem9udGFsLnN0eWxlLndpZHRoPXQuYmFja2dyb3VuZC53aWR0aCtcInB4XCIsZS5jZW50ZXJDb250YWluZXIuc3R5bGUud2lkdGg9dC5jZW50ZXIud2lkdGgrXCJweFwiLGUudG9wLnN0eWxlLndpZHRoPXQudG9wLndpZHRoK1wicHhcIixlLmJvdHRvbS5zdHlsZS53aWR0aD10LmJvdHRvbS53aWR0aCtcInB4XCIsZS5iYWNrZ3JvdW5kLnN0eWxlLmxlZnQ9XCIwXCIsZS5iYWNrZ3JvdW5kLnN0eWxlLnRvcD1cIjBcIixlLmJhY2tncm91bmRWZXJ0aWNhbC5zdHlsZS5sZWZ0PXQubGVmdC53aWR0aCt0LmJvcmRlci5sZWZ0K1wicHhcIixlLmJhY2tncm91bmRWZXJ0aWNhbC5zdHlsZS50b3A9XCIwXCIsZS5iYWNrZ3JvdW5kSG9yaXpvbnRhbC5zdHlsZS5sZWZ0PVwiMFwiLGUuYmFja2dyb3VuZEhvcml6b250YWwuc3R5bGUudG9wPXQudG9wLmhlaWdodCtcInB4XCIsZS5jZW50ZXJDb250YWluZXIuc3R5bGUubGVmdD10LmxlZnQud2lkdGgrXCJweFwiLGUuY2VudGVyQ29udGFpbmVyLnN0eWxlLnRvcD10LnRvcC5oZWlnaHQrXCJweFwiLGUubGVmdENvbnRhaW5lci5zdHlsZS5sZWZ0PVwiMFwiLGUubGVmdENvbnRhaW5lci5zdHlsZS50b3A9dC50b3AuaGVpZ2h0K1wicHhcIixlLnJpZ2h0Q29udGFpbmVyLnN0eWxlLmxlZnQ9dC5sZWZ0LndpZHRoK3QuY2VudGVyLndpZHRoK1wicHhcIixlLnJpZ2h0Q29udGFpbmVyLnN0eWxlLnRvcD10LnRvcC5oZWlnaHQrXCJweFwiLGUudG9wLnN0eWxlLmxlZnQ9dC5sZWZ0LndpZHRoK1wicHhcIixlLnRvcC5zdHlsZS50b3A9XCIwXCIsZS5ib3R0b20uc3R5bGUubGVmdD10LmxlZnQud2lkdGgrXCJweFwiLGUuYm90dG9tLnN0eWxlLnRvcD10LnRvcC5oZWlnaHQrdC5jZW50ZXJDb250YWluZXIuaGVpZ2h0K1wicHhcIixlLmNlbnRlci5zdHlsZS5sZWZ0PVwiMFwiLGUubGVmdC5zdHlsZS5sZWZ0PVwiMFwiLGUucmlnaHQuc3R5bGUubGVmdD1cIjBcIn0sbi5wcm90b3R5cGUucmVwYWludD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIkZ1bmN0aW9uIHJlcGFpbnQgaXMgZGVwcmVjYXRlZC4gVXNlIHJlZHJhdyBpbnN0ZWFkLlwiKX0sbi5wcm90b3R5cGUuc2V0Q3VycmVudFRpbWU9ZnVuY3Rpb24odCl7aWYoIXRoaXMuY3VycmVudFRpbWUpdGhyb3cgbmV3IEVycm9yKFwiT3B0aW9uIHNob3dDdXJyZW50VGltZSBtdXN0IGJlIHRydWVcIik7dGhpcy5jdXJyZW50VGltZS5zZXRDdXJyZW50VGltZSh0KX0sbi5wcm90b3R5cGUuZ2V0Q3VycmVudFRpbWU9ZnVuY3Rpb24oKXtpZighdGhpcy5jdXJyZW50VGltZSl0aHJvdyBuZXcgRXJyb3IoXCJPcHRpb24gc2hvd0N1cnJlbnRUaW1lIG11c3QgYmUgdHJ1ZVwiKTtyZXR1cm4gdGhpcy5jdXJyZW50VGltZS5nZXRDdXJyZW50VGltZSgpfSxuLnByb3RvdHlwZS5fdG9UaW1lPWZ1bmN0aW9uKHQpe3JldHVybiBtLnRvVGltZSh0aGlzLHQsdGhpcy5wcm9wcy5jZW50ZXIud2lkdGgpfSxuLnByb3RvdHlwZS5fdG9HbG9iYWxUaW1lPWZ1bmN0aW9uKHQpe3JldHVybiBtLnRvVGltZSh0aGlzLHQsdGhpcy5wcm9wcy5yb290LndpZHRoKX0sbi5wcm90b3R5cGUuX3RvU2NyZWVuPWZ1bmN0aW9uKHQpe3JldHVybiBtLnRvU2NyZWVuKHRoaXMsdCx0aGlzLnByb3BzLmNlbnRlci53aWR0aCl9LG4ucHJvdG90eXBlLl90b0dsb2JhbFNjcmVlbj1mdW5jdGlvbih0KXtyZXR1cm4gbS50b1NjcmVlbih0aGlzLHQsdGhpcy5wcm9wcy5yb290LndpZHRoKX0sbi5wcm90b3R5cGUuX2luaXRBdXRvUmVzaXplPWZ1bmN0aW9uKCl7MT09dGhpcy5vcHRpb25zLmF1dG9SZXNpemU/dGhpcy5fc3RhcnRBdXRvUmVzaXplKCk6dGhpcy5fc3RvcEF1dG9SZXNpemUoKX0sbi5wcm90b3R5cGUuX3N0YXJ0QXV0b1Jlc2l6ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fc3RvcEF1dG9SZXNpemUoKSx0aGlzLl9vblJlc2l6ZT1mdW5jdGlvbigpe2lmKDEhPXQub3B0aW9ucy5hdXRvUmVzaXplKXJldHVybi
21167B2b2lkIHQuX3N0b3BBdXRvUmVzaXplKCk7dC5kb20ucm9vdCYmKHQuZG9tLnJvb3Qub2Zmc2V0V2lkdGg9PXQucHJvcHMubGFzdFdpZHRoJiZ0LmRvbS5yb290Lm9mZnNldEhlaWdodD09dC5wcm9wcy5sYXN0SGVpZ2h0fHwodC5wcm9wcy5sYXN0V2lkdGg9dC5kb20ucm9vdC5vZmZzZXRXaWR0aCx0LnByb3BzLmxhc3RIZWlnaHQ9dC5kb20ucm9vdC5vZmZzZXRIZWlnaHQsdC5wcm9wcy5zY3JvbGxiYXJXaWR0aD1jLmdldFNjcm9sbEJhcldpZHRoKCksdC5ib2R5LmVtaXR0ZXIuZW1pdChcIl9jaGFuZ2VcIikpKX0sYy5hZGRFdmVudExpc3RlbmVyKHdpbmRvdyxcInJlc2l6ZVwiLHRoaXMuX29uUmVzaXplKSx0LmRvbS5yb290JiYodC5wcm9wcy5sYXN0V2lkdGg9dC5kb20ucm9vdC5vZmZzZXRXaWR0aCx0LnByb3BzLmxhc3RIZWlnaHQ9dC5kb20ucm9vdC5vZmZzZXRIZWlnaHQpLHRoaXMud2F0Y2hUaW1lcj1zZXRJbnRlcnZhbCh0aGlzLl9vblJlc2l6ZSwxZTMpfSxuLnByb3RvdHlwZS5fc3RvcEF1dG9SZXNpemU9ZnVuY3Rpb24oKXt0aGlzLndhdGNoVGltZXImJihjbGVhckludGVydmFsKHRoaXMud2F0Y2hUaW1lciksdGhpcy53YXRjaFRpbWVyPXZvaWQgMCksdGhpcy5fb25SZXNpemUmJihjLnJlbW92ZUV2ZW50TGlzdGVuZXIod2luZG93LFwicmVzaXplXCIsdGhpcy5fb25SZXNpemUpLHRoaXMuX29uUmVzaXplPW51bGwpfSxuLnByb3RvdHlwZS5fb25Ub3VjaD1mdW5jdGlvbih0KXt0aGlzLnRvdWNoLmFsbG93RHJhZ2dpbmc9ITAsdGhpcy50b3VjaC5pbml0aWFsU2Nyb2xsVG9wPXRoaXMucHJvcHMuc2Nyb2xsVG9wfSxuLnByb3RvdHlwZS5fb25QaW5jaD1mdW5jdGlvbih0KXt0aGlzLnRvdWNoLmFsbG93RHJhZ2dpbmc9ITF9LG4ucHJvdG90eXBlLl9vbkRyYWc9ZnVuY3Rpb24odCl7aWYodCYmdGhpcy50b3VjaC5hbGxvd0RyYWdnaW5nKXt2YXIgZT10LmRlbHRhWSxpPXRoaXMuX2dldFNjcm9sbFRvcCgpLG89dGhpcy5fc2V0U2Nyb2xsVG9wKHRoaXMudG91Y2guaW5pdGlhbFNjcm9sbFRvcCtlKTt0aGlzLm9wdGlvbnMudmVydGljYWxTY3JvbGwmJih0aGlzLmRvbS5sZWZ0LnBhcmVudE5vZGUuc2Nyb2xsVG9wPS10aGlzLnByb3BzLnNjcm9sbFRvcCx0aGlzLmRvbS5yaWdodC5wYXJlbnROb2RlLnNjcm9sbFRvcD0tdGhpcy5wcm9wcy5zY3JvbGxUb3ApLG8hPWkmJnRoaXMuZW1pdChcInZlcnRpY2FsRHJhZ1wiKX19LG4ucHJvdG90eXBlLl9zZXRTY3JvbGxUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHJvcHMuc2Nyb2xsVG9wPXQsdGhpcy5fdXBkYXRlU2Nyb2xsVG9wKCksdGhpcy5wcm9wcy5zY3JvbGxUb3B9LG4ucHJvdG90eXBlLl91cGRhdGVTY3JvbGxUb3A9ZnVuY3Rpb24oKXt2YXIgdD1NYXRoLm1pbih0aGlzLnByb3BzLmNlbnRlckNvbnRhaW5lci5oZWlnaHQtdGhpcy5wcm9wcy5jZW50ZXIuaGVpZ2h0LDApO3JldHVybiB0IT10aGlzLnByb3BzLnNjcm9sbFRvcE1pbiYmKFwidG9wXCIhPXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtJiYodGhpcy5wcm9wcy5zY3JvbGxUb3ArPXQtdGhpcy5wcm9wcy5zY3JvbGxUb3BNaW4pLHRoaXMucHJvcHMuc2Nyb2xsVG9wTWluPXQpLHRoaXMucHJvcHMuc2Nyb2xsVG9wPjAmJih0aGlzLnByb3BzLnNjcm9sbFRvcD0wKSx0aGlzLnByb3BzLnNjcm9sbFRvcDx0JiYodGhpcy5wcm9wcy5zY3JvbGxUb3A9dCksdGhpcy5vcHRpb25zLnZlcnRpY2FsU2Nyb2xsJiYodGhpcy5kb20ubGVmdC5wYXJlbnROb2RlLnNjcm9sbFRvcD0tdGhpcy5wcm9wcy5zY3JvbGxUb3AsdGhpcy5kb20ucmlnaHQucGFyZW50Tm9kZS5zY3JvbGxUb3A9LXRoaXMucHJvcHMuc2Nyb2xsVG9wKSx0aGlzLnByb3BzLnNjcm9sbFRvcH0sbi5wcm90b3R5cGUuX2dldFNjcm9sbFRvcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3BzLnNjcm9sbFRvcH0sbi5wcm90b3R5cGUuX2NyZWF0ZUNvbmZpZ3VyYXRvcj1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIkNhbm5vdCBpbnZva2UgYWJzdHJhY3QgbWV0aG9kIF9jcmVhdGVDb25maWd1cmF0b3JcIil9LHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUsaSxzLHIpe3RoaXMubW9tZW50PW4sdGhpcy5jdXJyZW50PXRoaXMubW9tZW50KCksdGhpcy5fc3RhcnQ9dGhpcy5tb21lbnQoKSx0aGlzLl9lbmQ9dGhpcy5tb21lbnQoKSx0aGlzLmF1dG9TY2FsZT0hMCx0aGlzLnNjYWxlPVwiZGF5XCIsdGhpcy5zdGVwPTEsdGhpcy5zZXRSYW5nZSh0LGUsaSksdGhpcy5zd2l0Y2hlZERheT0hMSx0aGlzLnN3aXRjaGVkTW9udGg9ITEsdGhpcy5zd2l0Y2hlZFllYXI9ITEsQXJyYXkuaXNBcnJheShzKT90aGlzLmhpZGRlbkRhdGVzPXM6dGhpcy5oaWRkZW5EYXRlcz12b2lkIDAhPXM/W3NdOltdLHRoaXMuZm9ybWF0PW8uRk9STUFULHRoaXMub3B0aW9ucz1yfHx7fX12YXIgbj1pKDkpLHM9aSgzNikscj1pKDIpO28uRk9STUFUPXttaW5vckxhYmVsczp7bWlsbGlzZWNvbmQ6XCJTU1NcIixzZWNvbmQ6XCJzXCIsbWludXRlOlwiSEg6bW1cIixob3VyOlwiSEg6bW1cIix3ZWVrZGF5OlwiZGRkIERcIixkYXk6XCJEXCIsd2VlazpcIndcIixtb250aDpcIk1NTVwiLHllYXI6XCJZWVlZXCJ9LG1ham9yTGFiZWxzOnttaWxsaXNlY29uZDpcIkhIOm1tOnNzXCIsc2Vjb25kOlwiRCBNTU1NIEhIOm1tXCIsbWludXRlOlwiZGRkIEQgTU1NTVwiLGhvdXI6XCJkZGQgRCBNTU1NXCIsd2Vla2RheTpcIk1NTU0gWVlZWVwiLGRheTpcIk1NTU0gWVlZWVwiLHdlZWs6XCJNTU1NIFlZWVlcIixtb250aDpcIllZWVlcIix5ZWFyOlwiXCJ9fSxvLnByb3RvdHlwZS5zZXRNb21lbnQ9ZnVuY3Rpb24odCl7dGhpcy5tb21lbnQ9dCx0aGlzLmN1cnJlbnQ9dGhpcy5tb21lbnQodGhpcy5jdXJyZW50LnZhbHVlT2YoKSksdGhpcy5fc3RhcnQ9dGhpcy5tb21lbnQodGhpcy5fc3RhcnQudmFsdWVPZigpKSx0aGlzLl9lbmQ9dGhpcy5tb21lbnQodGhpcy5fZW5kLnZhbHVlT2YoKSl9LG8ucHJvdG90eXBlLnNldEZvcm1hdD1mdW5jdGlvbih0KXt2YXIgZT1yLmRlZXBFeHRlbmQoe30sby5GT1JNQVQpO3RoaXMuZm9ybWF0PXIuZGVlcEV4dGVuZChlLHQpfSxvLnByb3RvdHlwZS5zZXRSYW5nZT1mdW5jdGlvbih0LGUsaSl7aWYoISh0IGluc3RhbmNlb2YgRGF0ZSYmZSBpbnN0YW5jZW9mIERhdGUpKXRocm93XCJObyBsZWdhbCBzdGFydCBvciBlbmQgZGF0ZSBpbiBtZXRob2Qgc2V0UmFuZ2VcIjt0aGlzLl9zdGFydD12b2lkIDAhPXQ/dGhpcy5tb21lbnQodC52YWx1ZU9mKCkpOm5ldyBEYXRlLHRoaXMuX2VuZD12b2lkIDAhPWU/dGhpcy5tb21lbnQoZS52YWx1ZU9mKCkpOm5ldyBEYXRlLHRoaXMuYXV0b1NjYWxlJiZ0aGlzLnNldE1pbmltdW1TdGVwKGkpfSxvLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbigpe3RoaXMuY3VycmVudD10aGlzLl9zdGFydC5jbG9uZSgpLHRoaXMucm91bmRUb01pbm9yKCl9LG8ucHJvdG90eXBlLnJvdW5kVG9NaW5vcj1mdW5jdGlvbigpe3N3aXRjaC
21167hcIndlZWtcIj09dGhpcy5zY2FsZSYmdGhpcy5jdXJyZW50LndlZWtkYXkoMCksdGhpcy5zY2FsZSl7Y2FzZVwieWVhclwiOnRoaXMuY3VycmVudC55ZWFyKHRoaXMuc3RlcCpNYXRoLmZsb29yKHRoaXMuY3VycmVudC55ZWFyKCkvdGhpcy5zdGVwKSksdGhpcy5jdXJyZW50Lm1vbnRoKDApO2Nhc2VcIm1vbnRoXCI6dGhpcy5jdXJyZW50LmRhdGUoMSk7Y2FzZVwid2Vla1wiOmNhc2VcImRheVwiOmNhc2VcIndlZWtkYXlcIjp0aGlzLmN1cnJlbnQuaG91cnMoMCk7Y2FzZVwiaG91clwiOnRoaXMuY3VycmVudC5taW51dGVzKDApO2Nhc2VcIm1pbnV0ZVwiOnRoaXMuY3VycmVudC5zZWNvbmRzKDApO2Nhc2VcInNlY29uZFwiOnRoaXMuY3VycmVudC5taWxsaXNlY29uZHMoMCl9aWYoMSE9dGhpcy5zdGVwKXN3aXRjaCh0aGlzLnNjYWxlKXtjYXNlXCJtaWxsaXNlY29uZFwiOnRoaXMuY3VycmVudC5zdWJ0cmFjdCh0aGlzLmN1cnJlbnQubWlsbGlzZWNvbmRzKCkldGhpcy5zdGVwLFwibWlsbGlzZWNvbmRzXCIpO2JyZWFrO2Nhc2VcInNlY29uZFwiOnRoaXMuY3VycmVudC5zdWJ0cmFjdCh0aGlzLmN1cnJlbnQuc2Vjb25kcygpJXRoaXMuc3RlcCxcInNlY29uZHNcIik7YnJlYWs7Y2FzZVwibWludXRlXCI6dGhpcy5jdXJyZW50LnN1YnRyYWN0KHRoaXMuY3VycmVudC5taW51dGVzKCkldGhpcy5zdGVwLFwibWludXRlc1wiKTticmVhaztjYXNlXCJob3VyXCI6dGhpcy5jdXJyZW50LnN1YnRyYWN0KHRoaXMuY3VycmVudC5ob3VycygpJXRoaXMuc3RlcCxcImhvdXJzXCIpO2JyZWFrO2Nhc2VcIndlZWtkYXlcIjpjYXNlXCJkYXlcIjp0aGlzLmN1cnJlbnQuc3VidHJhY3QoKHRoaXMuY3VycmVudC5kYXRlKCktMSkldGhpcy5zdGVwLFwiZGF5XCIpO2JyZWFrO2Nhc2VcIndlZWtcIjp0aGlzLmN1cnJlbnQuc3VidHJhY3QodGhpcy5jdXJyZW50LndlZWsoKSV0aGlzLnN0ZXAsXCJ3ZWVrXCIpO2JyZWFrO2Nhc2VcIm1vbnRoXCI6dGhpcy5jdXJyZW50LnN1YnRyYWN0KHRoaXMuY3VycmVudC5tb250aCgpJXRoaXMuc3RlcCxcIm1vbnRoXCIpO2JyZWFrO2Nhc2VcInllYXJcIjp0aGlzLmN1cnJlbnQuc3VidHJhY3QodGhpcy5jdXJyZW50LnllYXIoKSV0aGlzLnN0ZXAsXCJ5ZWFyXCIpfX0sby5wcm90b3R5cGUuaGFzTmV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnJlbnQudmFsdWVPZigpPD10aGlzLl9lbmQudmFsdWVPZigpfSxvLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jdXJyZW50LnZhbHVlT2YoKTtzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZVwibWlsbGlzZWNvbmRcIjp0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCxcIm1pbGxpc2Vjb25kXCIpO2JyZWFrO2Nhc2VcInNlY29uZFwiOnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLFwic2Vjb25kXCIpO2JyZWFrO2Nhc2VcIm1pbnV0ZVwiOnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLFwibWludXRlXCIpO2JyZWFrO2Nhc2VcImhvdXJcIjp0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCxcImhvdXJcIiksdGhpcy5jdXJyZW50Lm1vbnRoKCk8Nj90aGlzLmN1cnJlbnQuc3VidHJhY3QodGhpcy5jdXJyZW50LmhvdXJzKCkldGhpcy5zdGVwLFwiaG91clwiKTp0aGlzLmN1cnJlbnQuaG91cnMoKSV0aGlzLnN0ZXAhPTAmJnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLXRoaXMuY3VycmVudC5ob3VycygpJXRoaXMuc3RlcCxcImhvdXJcIik7YnJlYWs7Y2FzZVwid2Vla2RheVwiOmNhc2VcImRheVwiOnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLFwiZGF5XCIpO2JyZWFrO2Nhc2VcIndlZWtcIjppZigwIT09dGhpcy5jdXJyZW50LndlZWtkYXkoKSl0aGlzLmN1cnJlbnQud2Vla2RheSgwKSx0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCxcIndlZWtcIik7ZWxzZSBpZighMT09PXRoaXMub3B0aW9ucy5zaG93TWFqb3JMYWJlbHMpdGhpcy5jdXJyZW50LmFkZCh0aGlzLnN0ZXAsXCJ3ZWVrXCIpO2Vsc2V7dmFyIGU9dGhpcy5jdXJyZW50LmNsb25lKCk7ZS5hZGQoMSxcIndlZWtcIiksZS5pc1NhbWUodGhpcy5jdXJyZW50LFwibW9udGhcIik/dGhpcy5jdXJyZW50LmFkZCh0aGlzLnN0ZXAsXCJ3ZWVrXCIpOih0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCxcIndlZWtcIiksdGhpcy5jdXJyZW50LmRhdGUoMSkpfWJyZWFrO2Nhc2VcIm1vbnRoXCI6dGhpcy5jdXJyZW50LmFkZCh0aGlzLnN0ZXAsXCJtb250aFwiKTticmVhaztjYXNlXCJ5ZWFyXCI6dGhpcy5jdXJyZW50LmFkZCh0aGlzLnN0ZXAsXCJ5ZWFyXCIpfWlmKDEhPXRoaXMuc3RlcClzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZVwibWlsbGlzZWNvbmRcIjp0aGlzLmN1cnJlbnQubWlsbGlzZWNvbmRzKCk+MCYmdGhpcy5jdXJyZW50Lm1pbGxpc2Vjb25kcygpPHRoaXMuc3RlcCYmdGhpcy5jdXJyZW50Lm1pbGxpc2Vjb25kcygwKTticmVhaztjYXNlXCJzZWNvbmRcIjp0aGlzLmN1cnJlbnQuc2Vjb25kcygpPjAmJnRoaXMuY3VycmVudC5zZWNvbmRzKCk8dGhpcy5zdGVwJiZ0aGlzLmN1cnJlbnQuc2Vjb25kcygwKTticmVhaztjYXNlXCJtaW51dGVcIjp0aGlzLmN1cnJlbnQubWludXRlcygpPjAmJnRoaXMuY3VycmVudC5taW51dGVzKCk8dGhpcy5zdGVwJiZ0aGlzLmN1cnJlbnQubWludXRlcygwKTticmVhaztjYXNlXCJob3VyXCI6dGhpcy5jdXJyZW50LmhvdXJzKCk+MCYmdGhpcy5jdXJyZW50LmhvdXJzKCk8dGhpcy5zdGVwJiZ0aGlzLmN1cnJlbnQuaG91cnMoMCk7YnJlYWs7Y2FzZVwid2Vla2RheVwiOmNhc2VcImRheVwiOnRoaXMuY3VycmVudC5kYXRlKCk8dGhpcy5zdGVwKzEmJnRoaXMuY3VycmVudC5kYXRlKDEpO2JyZWFrO2Nhc2VcIndlZWtcIjp0aGlzLmN1cnJlbnQud2VlaygpPHRoaXMuc3RlcCYmdGhpcy5jdXJyZW50LndlZWsoMSk7YnJlYWs7Y2FzZVwibW9udGhcIjp0aGlzLmN1cnJlbnQubW9udGgoKTx0aGlzLnN0ZXAmJnRoaXMuY3VycmVudC5tb250aCgwKX10aGlzLmN1cnJlbnQudmFsdWVPZigpPT10JiYodGhpcy5jdXJyZW50PXRoaXMuX2VuZC5jbG9uZSgpKSx0aGlzLnN3aXRjaGVkRGF5PSExLHRoaXMuc3dpdGNoZWRNb250aD0hMSx0aGlzLnN3aXRjaGVkWWVhcj0hMSxzLnN0ZXBPdmVySGlkZGVuRGF0ZXModGhpcy5tb21lbnQsdGhpcyx0KX0sby5wcm90b3R5cGUuZ2V0Q3VycmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnJlbnR9LG8ucHJvdG90eXBlLnNldFNjYWxlPWZ1bmN0aW9uKHQpe3QmJlwic3RyaW5nXCI9PXR5cGVvZiB0LnNjYWxlJiYodGhpcy5zY2FsZT10LnNjYWxlLHRoaXMuc3RlcD10LnN0ZXA+MD90LnN0ZXA6MSx0aGlzLmF1dG9TY2FsZT0hMSl9LG8ucHJvdG90eXBlLnNldEF1dG9TY2FsZT1mdW5jdGlvbih0KXt0aGlzLmF1dG9TY2FsZT10fSxvLnByb3RvdHlwZS5zZXRNaW5pbXVtU3RlcD1mdW5jdGlvbih0KXtpZih2b2lkIDAhPXQpezMxMTA0ZTk+dCYmKHRoaXMuc2NhbGU9XCJ5ZWFyXCIsdGhpcy5zdGVwPTFlMyksMTU1NTJlOT50JiYodGhpcy5zY2FsZT1cInllYXJcIix0aGlzLnN0ZXA9NTAwKSwzMTEwNGU4PnQmJih0aGlzLnNjYWxlPVwieWVhclwiLHRoaXMuc3RlcD0xMDApLDE1NTUyZTg+dCYmKHRoaXMuc2NhbGU9XCJ5ZWFyXCIsdGhpcy5zdGVwPTUwKSwzMTEwNGU3PnQmJih0aGlzLnNjYWxlPVwieWVhclwiLHRoaXMuc3RlcD0xMCksMTU1NTJlNz50JiYodGhpcy5zY2FsZT1cInllYXJcIix0aGlzLnN0ZXA9NSksMzExMDRlNj50JiYodGhpcy5zY2FsZT1cInllYXJcIix0aGlzLnN0ZXA9MSksNzc3NmU2PnQmJih0aGlzLnNjYWxlPVwibW9udGhcIix0aGlzLnN0ZXA9MyksMjU5MmU2PnQmJih0aGlzLnNjYWxlPVwibW9udGhcIix0aGlzLnN0ZXA9MSksNDMyZTY+dCYmKHRoaXMuc2NhbGU9XCJkYXlcIix0aGlzLnN0ZXA9NSksMTcyOGU1PnQmJih0aGlzLnNjYWxlPVwiZGF5XCIsdGhpcy5zdGVwPTIpLDg2NGU1PnQmJih0aGlzLnNjYWxlPVwiZGF5XCIsdGhpcy5zdGVwPTEpLDQzMmU1PnQmJih0aGlzLnNjYWxlPVwid2Vla2RheVwiLHRoaXMuc3RlcD0xKSwxNDRlNT50JiYodGhpcy5zY2FsZT1cImhvdXJcIix0aGlzLnN0ZXA9NCksMzZlNT50JiYodGhpcy5zY2FsZT1cImhvdXJcIix0aGlzLnN0ZXA9MSksOWU1PnQmJih0aGlzLnNjYWxlPVwibWludXRlXCIsdGhpcy5zdGVwPTE1KSw2ZTU+dCYmKHRoaXMuc2NhbGU9XCJtaW51dGVcIix0aGlzLnN0ZXA9MTApLDNlNT50JiYodGhpcy5zY2FsZT1cIm1pbnV0ZVwiLHRoaXMuc3RlcD01KSw2ZTQ+dCYmKHRoaXMuc2NhbGU9XCJtaW51dGVcIix0aGlzLnN0ZXA9MSksMTVlMz50JiYodGhpcy5zY2FsZT1cInNlY29uZFwiLHRoaXMuc3RlcD0xNSksMWU0PnQmJih0aGlzLnNjYWxlPVwic2Vjb25kXCIsdGhpcy5zdGVwPTEwKSw1ZTM+dCYmKHRoaXMuc2NhbGU9XCJzZWNvbmRcIix0aGlzLnN0ZXA9NSksMWUzPnQmJih0aGlzLnNjYWxlPVwic2Vjb25kXCIsdGhpcy5zdGVwPTEpLDIwMD50JiYodGhpcy5zY2FsZT1cIm1pbGxpc2Vjb25kXCIsdGhpcy5zdGVwPTIwMCksMTAwPnQmJih0aGlzLnNjYWxlPVwibWlsbGlzZWNvbmRcIix0aGlzLnN0ZXA9MTAwKSw1MD50JiYodGhpcy5zY2FsZT1cIm1pbGxpc2Vjb25kXCIsdGhpcy5zdGVwPTUwKSwxMD50JiYodGhpcy5zY2FsZT1cIm1pbGxpc2Vjb25kXCIsdGhpcy5zdGVwPTEwKSw1PnQmJih0aGlzLnNjYWxlPVwibWlsbGlzZWNvbmRcIix0aGlzLnN0ZXA9NSksMT50JiYodGhpcy5zY2FsZT1cIm1pbGxpc2Vjb25kXCIsdGhpcy5zdGVwPTEpfX0sby5zbmFwPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1uKHQpO2lmKFwieWVhclwiPT1lKXt2YXIgcz1vLnllY
21167XIoKStNYXRoLnJvdW5kKG8ubW9udGgoKS8xMik7by55ZWFyKE1hdGgucm91bmQocy9pKSppKSxvLm1vbnRoKDApLG8uZGF0ZSgwKSxvLmhvdXJzKDApLG8ubWludXRlcygwKSxvLnNlY29uZHMoMCksby5taWxsaXNlY29uZHMoMCl9ZWxzZSBpZihcIm1vbnRoXCI9PWUpby5kYXRlKCk+MTU/KG8uZGF0ZSgxKSxvLmFkZCgxLFwibW9udGhcIikpOm8uZGF0ZSgxKSxvLmhvdXJzKDApLG8ubWludXRlcygwKSxvLnNlY29uZHMoMCksby5taWxsaXNlY29uZHMoMCk7ZWxzZSBpZihcIndlZWtcIj09ZSlvLndlZWtkYXkoKT4yPyhvLndlZWtkYXkoMCksby5hZGQoMSxcIndlZWtcIikpOm8ud2Vla2RheSgwKSxvLmhvdXJzKDApLG8ubWludXRlcygwKSxvLnNlY29uZHMoMCksby5taWxsaXNlY29uZHMoMCk7ZWxzZSBpZihcImRheVwiPT1lKXtzd2l0Y2goaSl7Y2FzZSA1OmNhc2UgMjpvLmhvdXJzKDI0Kk1hdGgucm91bmQoby5ob3VycygpLzI0KSk7YnJlYWs7ZGVmYXVsdDpvLmhvdXJzKDEyKk1hdGgucm91bmQoby5ob3VycygpLzEyKSl9by5taW51dGVzKDApLG8uc2Vjb25kcygwKSxvLm1pbGxpc2Vjb25kcygwKX1lbHNlIGlmKFwid2Vla2RheVwiPT1lKXtzd2l0Y2goaSl7Y2FzZSA1OmNhc2UgMjpvLmhvdXJzKDEyKk1hdGgucm91bmQoby5ob3VycygpLzEyKSk7YnJlYWs7ZGVmYXVsdDpvLmhvdXJzKDYqTWF0aC5yb3VuZChvLmhvdXJzKCkvNikpfW8ubWludXRlcygwKSxvLnNlY29uZHMoMCksby5taWxsaXNlY29uZHMoMCl9ZWxzZSBpZihcImhvdXJcIj09ZSl7c3dpdGNoKGkpe2Nhc2UgNDpvLm1pbnV0ZXMoNjAqTWF0aC5yb3VuZChvLm1pbnV0ZXMoKS82MCkpO2JyZWFrO2RlZmF1bHQ6by5taW51dGVzKDMwKk1hdGgucm91bmQoby5taW51dGVzKCkvMzApKX1vLnNlY29uZHMoMCksby5taWxsaXNlY29uZHMoMCl9ZWxzZSBpZihcIm1pbnV0ZVwiPT1lKXtzd2l0Y2goaSl7Y2FzZSAxNTpjYXNlIDEwOm8ubWludXRlcyg1Kk1hdGgucm91bmQoby5taW51dGVzKCkvNSkpLG8uc2Vjb25kcygwKTticmVhaztjYXNlIDU6by5zZWNvbmRzKDYwKk1hdGgucm91bmQoby5zZWNvbmRzKCkvNjApKTticmVhaztkZWZhdWx0Om8uc2Vjb25kcygzMCpNYXRoLnJvdW5kKG8uc2Vjb25kcygpLzMwKSl9by5taWxsaXNlY29uZHMoMCl9ZWxzZSBpZihcInNlY29uZFwiPT1lKXN3aXRjaChpKXtjYXNlIDE1OmNhc2UgMTA6by5zZWNvbmRzKDUqTWF0aC5yb3VuZChvLnNlY29uZHMoKS81KSksby5taWxsaXNlY29uZHMoMCk7YnJlYWs7Y2FzZSA1Om8ubWlsbGlzZWNvbmRzKDFlMypNYXRoLnJvdW5kKG8ubWlsbGlzZWNvbmRzKCkvMWUzKSk7YnJlYWs7ZGVmYXVsdDpvLm1pbGxpc2Vjb25kcyg1MDAqTWF0aC5yb3VuZChvLm1pbGxpc2Vjb25kcygpLzUwMCkpfWVsc2UgaWYoXCJtaWxsaXNlY29uZFwiPT1lKXt2YXIgcj1pPjU/aS8yOjE7by5taWxsaXNlY29uZHMoTWF0aC5yb3VuZChvLm1pbGxpc2Vjb25kcygpL3IpKnIpfXJldHVybiBvfSxvLnByb3RvdHlwZS5pc01ham9yPWZ1bmN0aW9uKCl7aWYoMT09dGhpcy5zd2l0Y2hlZFllYXIpc3dpdGNoKHRoaXMuc2NhbGUpe2Nhc2VcInllYXJcIjpjYXNlXCJtb250aFwiOmNhc2VcIndlZWtcIjpjYXNlXCJ3ZWVrZGF5XCI6Y2FzZVwiZGF5XCI6Y2FzZVwiaG91clwiOmNhc2VcIm1pbnV0ZVwiOmNhc2VcInNlY29uZFwiOmNhc2VcIm1pbGxpc2Vjb25kXCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX1lbHNlIGlmKDE9PXRoaXMuc3dpdGNoZWRNb250aClzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZVwid2Vla1wiOmNhc2VcIndlZWtkYXlcIjpjYXNlXCJkYXlcIjpjYXNlXCJob3VyXCI6Y2FzZVwibWludXRlXCI6Y2FzZVwic2Vjb25kXCI6Y2FzZVwibWlsbGlzZWNvbmRcIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfWVsc2UgaWYoMT09dGhpcy5zd2l0Y2hlZERheSlzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZVwibWlsbGlzZWNvbmRcIjpjYXNlXCJzZWNvbmRcIjpjYXNlXCJtaW51dGVcIjpjYXNlXCJob3VyXCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX12YXIgdD10aGlzLm1vbWVudCh0aGlzLmN1cnJlbnQpO3N3aXRjaC
21167h0aGlzLnNjYWxlKXtjYXNlXCJtaWxsaXNlY29uZFwiOnJldHVybiAwPT10Lm1pbGxpc2Vjb25kcygpO2Nhc2VcInNlY29uZFwiOnJldHVybiAwPT10LnNlY29uZHMoKTtjYXNlXCJtaW51dGVcIjpyZXR1cm4gMD09dC5ob3VycygpJiYwPT10Lm1pbnV0ZXMoKTtjYXNlXCJob3VyXCI6cmV0dXJuIDA9PXQuaG91cnMoKTtjYXNlXCJ3ZWVrZGF5XCI6Y2FzZVwiZGF5XCI6Y2FzZVwid2Vla1wiOnJldHVybiAxPT10LmRhdGUoKTtjYXNlXCJtb250aFwiOnJldHVybiAwPT10Lm1vbnRoKCk7Y2FzZVwieWVhclwiOmRlZmF1bHQ6cmV0dXJuITF9fSxvLnByb3RvdHlwZS5nZXRMYWJlbE1pbm9yPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09dCYmKHQ9dGhpcy5jdXJyZW50KSx0IGluc3RhbmNlb2YgRGF0ZSYmKHQ9dGhpcy5tb21lbnQodCkpLFwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMuZm9ybWF0Lm1pbm9yTGFiZWxzKXJldHVybiB0aGlzLmZvcm1hdC5taW5vckxhYmVscyh0LHRoaXMuc2NhbGUsdGhpcy5zdGVwKTt2YXIgZT10aGlzLmZvcm1hdC5taW5vckxhYmVsc1t0aGlzLnNjYWxlXTtzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZVwid2Vla1wiOmlmKHRoaXMuaXNNYWpvcigpJiYwIT09dC53ZWVrZGF5KCkpcmV0dXJuXCJcIjtkZWZhdWx0OnJldHVybiBlJiZlLmxlbmd0aD4wP3RoaXMubW9tZW50KHQpLmZvcm1hdChlKTpcIlwifX0sby5wcm90b3R5cGUuZ2V0TGFiZWxNYWpvcj1mdW5jdGlvbih0KXtpZih2b2lkIDA9PXQmJih0PXRoaXMuY3VycmVudCksdCBpbnN0YW5jZW9mIERhdGUmJih0PXRoaXMubW9tZW50KHQpKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLmZvcm1hdC5tYWpvckxhYmVscylyZXR1cm4gdGhpcy5mb3JtYXQubWFqb3JMYWJlbHModCx0aGlzLnNjYWxlLHRoaXMuc3RlcCk7dmFyIGU9dGhpcy5mb3JtYXQubWFqb3JMYWJlbHNbdGhpcy5zY2FsZV07cmV0dXJuIGUmJmUubGVuZ3RoPjA/dGhpcy5tb21lbnQodCkuZm9ybWF0KGUpOlwiXCJ9LG8ucHJvdG90eXBlLmdldENsYXNzTmFtZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQvYSUyPT0wP1wiIHZpcy1ldmVuXCI6XCIgdmlzLW9kZFwifWZ1bmN0aW9uIGUodCl7cmV0dXJuIHQuaXNTYW1lKG5ldyBEYXRlLFwiZGF5XCIpP1wiIHZpcy10b2RheVwiOnQuaXNTYW1lKG4oKS5hZGQoMSxcImRheVwiKSxcImRheVwiKT9cIiB2aXMtdG9tb3Jyb3dcIjp0LmlzU2FtZShuKCkuYWRkKC0xLFwiZGF5XCIpLFwiZGF5XCIpP1wiIHZpcy15ZXN0ZXJkYXlcIjpcIlwifWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQuaXNTYW1lKG5ldyBEYXRlLFwid2Vla1wiKT9cIiB2aXMtY3VycmVudC13ZWVrXCI6XCJcIn1mdW5jdGlvbiBvKHQpe3JldHVybiB0LmlzU2FtZShuZXcgRGF0ZSxcIm1vbnRoXCIpP1wiIHZpcy1jdXJyZW50LW1vbnRoXCI6XCJcIn12YXIgbj10aGlzLm1vbWVudCxzPXRoaXMubW9tZW50KHRoaXMuY3VycmVudCkscj1zLmxvY2FsZT9zLmxvY2FsZShcImVuXCIpOnMubGFuZyhcImVuXCIpLGE9dGhpcy5zdGVwLGg9W107c3dpdGNoKHRoaXMuc2NhbGUpe2Nhc2VcIm1pbGxpc2Vjb25kXCI6aC5wdXNoKGUocikpLGgucHVzaCh0KHIubWlsbGlzZWNvbmRzKCkpKTticmVhaztjYXNlXCJzZWNvbmRcIjpoLnB1c2goZShyKSksaC5wdXNoKHQoci5zZWNvbmRzKCkpKTticmVhaztjYXNlXCJtaW51dGVcIjpoLnB1c2goZShyKSksaC5wdXNoKHQoci5taW51dGVzKCkpKTticmVhaztjYXNlXCJob3VyXCI6aC5wdXNoKFwidmlzLWhcIityLmhvdXJzKCkrKDQ9PXRoaXMuc3RlcD9cIi1oXCIrKHIuaG91cnMoKSs0KTpcIlwiKSksaC5wdXNoKGUocikpLGgucHVzaCh0KHIuaG91cnMoKSkpO2JyZWFrO2Nhc2VcIndlZWtkYXlcIjpoLnB1c2goXCJ2aXMtXCIrci5mb3JtYXQoXCJkZGRkXCIpLnRvTG93ZXJDYXNlKCkpLGgucHVzaChlKHIpKSxoLnB1c2goaShyKSksaC5wdXNoKHQoci5kYXRlKCkpKTticmVhaztjYXNlXCJkYXlcIjpoLnB1c2goXCJ2aXMtZGF5XCIrci5kYXRlKCkpLGgucHVzaChcInZpcy1cIityLmZvcm1hdChcIk1NTU1cIikudG9Mb3dlckNhc2UoKSksaC5wdXNoKGUocikpLGgucHVzaChvKHIpKSxoLnB1c2godGhpcy5zdGVwPD0yP2Uocik6XCJcIiksaC5wdXNoKHRoaXMuc3RlcDw9Mj9cInZpcy1cIityLmZvcm1hdChcImRkZGRcIikudG9Mb3dlckNhc2UoKTpcIlwiKSxcbiAgICBoLnB1c2godChyLmRhdGUoKS0xKSk7YnJlYWs7Y2FzZVwid2Vla1wiOmgucHVzaChcInZpcy13ZWVrXCIrci5mb3JtYXQoXCJ3XCIpKSxoLnB1c2goaShyKSksaC5wdXNoKHQoci53ZWVrKCkpKTticmVhaztjYXNlXCJtb250aFwiOmgucHVzaChcInZpcy1cIityLmZvcm1hdChcIk1NTU1cIikudG9Mb3dlckNhc2UoKSksaC5wdXNoKG8ocikpLGgucHVzaCh0KHIubW9udGgoKSkpO2JyZWFrO2Nhc2VcInllYXJcIjpoLnB1c2goXCJ2aXMteWVhclwiK3IueWVhcigpKSxoLnB1c2goZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNTYW1lKG5ldyBEYXRlLFwieWVhclwiKT9cIiB2aXMtY3VycmVudC15ZWFyXCI6XCJcIn0ocikpLGgucHVzaCh0KHIueWVhcigpKSl9cmV0dXJuIGguZmlsdGVyKFN0cmluZykuam9pbihcIiBcIil9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUpe3RoaXMuYm9keT10LHRoaXMuZGVmYXVsdE9wdGlvbnM9e3J0bDohMSxzaG93Q3VycmVudFRpbWU6ITAsbW9tZW50OnIsbG9jYWxlczphLGxvY2FsZTpcImVuXCJ9LHRoaXMub3B0aW9ucz1uLmV4dGVuZCh7fSx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLm9mZnNldD0wLHRoaXMuX2NyZWF0ZSgpLHRoaXMuc2V0T3B0aW9ucyhlKX12YXIgbj1pKDIpLHM9aSgxNikscj1pKDkpLGE9aSg5OCk7by5wcm90b3R5cGU9bmV3IHMsby5wcm90b3R5cGUuX2NyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dC5jbGFzc05hbWU9XCJ2aXMtY3VycmVudC10aW1lXCIsdC5zdHlsZS5wb3NpdGlvbj1cImFic29sdXRlXCIsdC5zdHlsZS50b3A9XCIwcHhcIix0LnN0eWxlLmhlaWdodD1cIjEwMCVcIix0aGlzLmJhcj10fSxvLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnNob3dDdXJyZW50VGltZT0hMSx0aGlzLnJlZHJhdygpLHRoaXMuYm9keT1udWxsfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3QmJm4uc2VsZWN0aXZlRXh0ZW5kKFtcInJ0bFwiLFwic2hvd0N1cnJlbnRUaW1lXCIsXCJtb21lbnRcIixcImxvY2FsZVwiLFwibG9jYWxlc1wiXSx0aGlzLm9wdGlvbnMsdCl9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5zaG93Q3VycmVudFRpbWUpe3ZhciB0PXRoaXMuYm9keS5kb20uYmFja2dyb3VuZFZlcnRpY2FsO3RoaXMuYmFyLnBhcmVudE5vZGUhPXQmJih0aGlzLmJhci5wYXJlbnROb2RlJiZ0aGlzLmJhci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmFyKSx0LmFwcGVuZENoaWxkKHRoaXMuYmFyKSx0aGlzLnN0YXJ0KCkpO3ZhciBlPXR
21167oaXMub3B0aW9ucy5tb21lbnQoKG5ldyBEYXRlKS52YWx1ZU9mKCkrdGhpcy5vZmZzZXQpLGk9dGhpcy5ib2R5LnV0aWwudG9TY3JlZW4oZSksbz10aGlzLm9wdGlvbnMubG9jYWxlc1t0aGlzLm9wdGlvbnMubG9jYWxlXTtvfHwodGhpcy53YXJuZWR8fChjb25zb2xlLmxvZyhcIldBUk5JTkc6IG9wdGlvbnMubG9jYWxlc1snXCIrdGhpcy5vcHRpb25zLmxvY2FsZStcIiddIG5vdCBmb3VuZC4gU2VlIGh0dHA6Ly92aXNqcy5vcmcvZG9jcy90aW1lbGluZS8jTG9jYWxpemF0aW9uXCIpLHRoaXMud2FybmVkPSEwKSxvPXRoaXMub3B0aW9ucy5sb2NhbGVzLmVuKTt2YXIgbj1vLmN1cnJlbnQrXCIgXCIrby50aW1lK1wiOiBcIitlLmZvcm1hdChcImRkZGQsIE1NTU0gRG8gWVlZWSwgSDptbTpzc1wiKTtuPW4uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrbi5zdWJzdHJpbmcoMSksdGhpcy5vcHRpb25zLnJ0bD90aGlzLmJhci5zdHlsZS5yaWdodD1pK1wicHhcIjp0aGlzLmJhci5zdHlsZS5sZWZ0PWkrXCJweFwiLHRoaXMuYmFyLnRpdGxlPW59ZWxzZSB0aGlzLmJhci5wYXJlbnROb2RlJiZ0aGlzLmJhci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmFyKSx0aGlzLnN0b3AoKTtyZXR1cm4hMX0sby5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7ZS5zdG9wKCk7dmFyIGk9ZS5ib2R5LnJhbmdlLmNvbnZlcnNpb24oZS5ib2R5LmRvbVByb3BzLmNlbnRlci53aWR0aCkuc2NhbGUsbz0xL2kvMTA7bzwzMCYmKG89MzApLG8+MWUzJiYobz0xZTMpLGUucmVkcmF3KCksZS5ib2R5LmVtaXR0ZXIuZW1pdChcImN1cnJlbnRUaW1lVGlja1wiKSxlLmN1cnJlbnRUaW1lVGltZXI9c2V0VGltZW91dCh0LG8pfXZhciBlPXRoaXM7dCgpfSxvLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5jdXJyZW50VGltZVRpbWVyJiYoY2xlYXJUaW1lb3V0KHRoaXMuY3VycmVudFRpbWVUaW1lciksZGVsZXRlIHRoaXMuY3VycmVudFRpbWVUaW1lcil9LG8ucHJvdG90eXBlLnNldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKHQpe3ZhciBlPW4uY29udmVydCh0LFwiRGF0ZVwiKS52YWx1ZU9mKCksaT0obmV3IERhdGUpLnZhbHVlT2YoKTt0aGlzLm9mZnNldD1lLWksdGhpcy5yZWRyYXcoKX0sby5wcm90b3R5cGUuZ2V0Q3VycmVudFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERhdGUoKG5ldyBEYXRlKS52YWx1ZU9mKCkrdGhpcy5vZmZzZXQpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe2lmKHRoaXMuZ3JvdXBJZD10LHRoaXMuc3ViZ3JvdXBzPXt9LHRoaXMuc3ViZ3JvdXBTdGFjaz17fSx0aGlzLnN1Ymdyb3VwU3RhY2tBbGw9ITEsdGhpcy5kb0lubmVyU3RhY2s9ITEsdGhpcy5zdWJncm91cEluZGV4PTAsdGhpcy5zdWJncm91cE9yZGVyZXI9ZSYmZS5zdWJncm91cE9yZGVyLHRoaXMuaXRlbVNldD1pLHRoaXMuaXNWaXNpYmxlPW51bGwsdGhpcy5zdGFja0RpcnR5PSEwLGUmJmUubmVzdGVkR3JvdXBzJiYodGhpcy5uZXN0ZWRHcm91cHM9ZS5uZXN0ZWRHcm91cHMsMD09ZS5zaG93TmVzdGVkP3RoaXMuc2hvd05lc3RlZD0hMTp0aGlzLnNob3dOZXN0ZWQ9ITApLGUmJmUuc3ViZ3JvdXBTdGFjaylpZihcImJvb2xlYW5cIj09dHlwZW9mIGUuc3ViZ3JvdXBTdGFjayl0aGlzLmRvSW5uZXJTdGFjaz1lLnN1Ymdyb3VwU3RhY2ssdGhpcy5zdWJncm91cFN0YWNrQWxsPWUuc3ViZ3JvdXBTdGFjaztlbHNlIGZvcih2YXIgbyBpbiBlLnN1Ymdyb3VwU3RhY2spdGhpcy5zdWJncm91cFN0YWNrW29dPWUuc3ViZ3JvdXBTdGFja1tvXSx0aGlzLmRvSW5uZXJTdGFjaz10aGlzLmRvSW5uZXJTdGFja3x8ZS5zdWJncm91cFN0YWNrW29dO3RoaXMubmVzdGVkSW5Hcm91cD1udWxsLHRoaXMuZG9tPXt9LHRoaXMucHJvcHM9e2xhYmVsOnt3aWR0aDowLGhlaWdodDowfX0sdGhpcy5jbGFzc05hbWU9bnVsbCx0aGlzLml0ZW1zPXt9LHRoaXMudmlzaWJsZUl0ZW1zPVtdLHRoaXMuaXRlbXNJblJhbmdlPVtdLHRoaXMub3JkZXJlZEl0ZW1zPXtieVN0YXJ0OltdLGJ5RW5kOltdfSx0aGlzLmNoZWNrUmFuZ2VkSXRlbXM9ITE7dmFyIG49dGhpczt0aGlzLml0ZW1TZXQuYm9keS5lbWl0dGVyLm9uKFwiY2hlY2tSYW5nZWRJdGVtc1wiLGZ1bmN0aW9uKCl7bi5jaGVja1JhbmdlZEl0ZW1zPSEwfSksdGhpcy5fY3JlYXRlKCksdGhpcy5zZXREYXRhKGUpfXZhciBuPWkoOCkscz1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KG4pLHI9aSgyKSxhPWkoMTAwKTtvLnByb3RvdHlwZS5fY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt0aGlzLml0ZW1TZXQub3B0aW9ucy5ncm91cEVkaXRhYmxlLm9yZGVyP3QuY2xhc3NOYW1lPVwidmlzLWxhYmVsIGRyYWdnYWJsZVwiOnQuY2xhc3NOYW1lPVwidmlzLWxhYmVsXCIsdGhpcy5kb20ubGFiZWw9dDt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO2UuY2xhc3NOYW1lPVwidmlzLWlubmVyXCIsdC5hcHBlbmRDaGlsZChlKSx0aGlzLmRvbS5pbm5lcj1lO3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7aS5jbGFzc05hbWU9XCJ2aXMtZ3JvdXBcIixpW1widGltZWxpbmUtZ3JvdXBcIl09dGhpcyx0aGlzLmRvbS5mb3JlZ3JvdW5kPWksdGhpcy5kb20uYmFja2dyb3VuZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmJhY2tncm91bmQuY2xhc3NOYW1lPVwidmlzLWdyb3VwXCIsdGhpcy5kb20uYXhpcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmF4aXMuY2xhc3NOYW1lPVwidmlzLWdyb3VwXCIsdGhpcy5kb20ubWFya2VyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20ubWFya2VyLnN0eWxlLnZpc2liaWxpdHk9XCJoaWRkZW5cIix0aGlzLmRvbS5tYXJrZXIuc3R5bGUucG9zaXRpb249XCJhYnNvbHV0ZVwiLHRoaXMuZG9tLm1hcmtlci5pbm5lckhUTUw9XCJcIix0aGlzLmRvbS5iYWNrZ3JvdW5kLmFwcGVuZENoaWxkKHRoaXMuZG9tLm1hcmtlcil9LG8ucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7dmFyIGUsaTtpZih0aGlzLml0ZW1TZXQub3B0aW9ucyYmdGhpcy5pdGVtU2V0Lm9wdGlvbnMuZ3JvdXBUZW1wbGF0ZT8oaT10aGlzLml0ZW1TZXQub3B0aW9ucy5ncm91cFRlbXBsYXRlLmJpbmQodGhpcyksZT1pKHQsdGhpcy5kb20uaW5uZXIpKTplPXQmJnQuY29udGVudCxlIGluc3RhbmNlb2YgRWxlbWVudCl7Zm9yKHRoaXMuZG9tLmlubmVyLmFwcGVuZENoaWxkKGUpO3RoaXMuZG9tLmlubmVyLmZpcnN0Q2hpbGQ7KXRoaXMuZG9tLmlubmVyLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmlubmVyLmZpcnN0Q2hpbGQpO3RoaXMuZG9tLmlubmVyLmFwcGVuZENoaWxkKGUpfWVsc2UgZSBpbnN0YW5jZW9mIE9iamVjdD9pKHQsdGhpcy5kb20uaW5uZXIpOnRoaXMuZG9tLmlubmVyLmlubmVySFRNTD12b2lkIDAhPT1lJiZudWxsIT09ZT9lOnRoaXMuZ3JvdXBJZHx8XCJcIjtpZih0aGlzLmRvbS5sYWJlbC50aXRsZT10JiZ0LnRpdGxlfHxcIlwiLHRoaXMuZG9tLmlubmVyLmZpcnN0Q2hpbGQ/ci5yZW1vdmVDbGFzc05hbWUo
21167dGhpcy5kb20uaW5uZXIsXCJ2aXMtaGlkZGVuXCIpOnIuYWRkQ2xhc3NOYW1lKHRoaXMuZG9tLmlubmVyLFwidmlzLWhpZGRlblwiKSx0JiZ0Lm5lc3RlZEdyb3Vwcyl7dGhpcy5uZXN0ZWRHcm91cHMmJnRoaXMubmVzdGVkR3JvdXBzPT10Lm5lc3RlZEdyb3Vwc3x8KHRoaXMubmVzdGVkR3JvdXBzPXQubmVzdGVkR3JvdXBzKSx2b2lkIDA9PT10LnNob3dOZXN0ZWQmJnZvaWQgMCE9PXRoaXMuc2hvd05lc3RlZHx8KDA9PXQuc2hvd05lc3RlZD90aGlzLnNob3dOZXN0ZWQ9ITE6dGhpcy5zaG93TmVzdGVkPSEwKSxyLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCxcInZpcy1uZXN0aW5nLWdyb3VwXCIpO3ZhciBvPXRoaXMuaXRlbVNldC5vcHRpb25zLnJ0bD9cImNvbGxhcHNlZC1ydGxcIjpcImNvbGxhcHNlZFwiO3RoaXMuc2hvd05lc3RlZD8oci5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsbyksci5hZGRDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsXCJleHBhbmRlZFwiKSk6KHIucmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZG9tLmxhYmVsLFwiZXhwYW5kZWRcIiksci5hZGRDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsbykpfWVsc2UgdGhpcy5uZXN0ZWRHcm91cHMmJih0aGlzLm5lc3RlZEdyb3Vwcz1udWxsLG89dGhpcy5pdGVtU2V0Lm9wdGlvbnMucnRsP1wiY29sbGFwc2VkLXJ0bFwiOlwiY29sbGFwc2VkXCIsci5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsbyksci5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsXCJleHBhbmRlZFwiKSxyLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCxcInZpcy1uZXN0aW5nLWdyb3VwXCIpKTt0JiZ0Lm5lc3RlZEluR3JvdXAmJihyLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCxcInZpcy1uZXN0ZWQtZ3JvdXBcIiksdGhpcy5pdGVtU2V0Lm9wdGlvbnMmJnRoaXMuaXRlbVNldC5vcHRpb25zLnJ0bD90aGlzLmRvbS5pbm5lci5zdHlsZS5wYWRkaW5nUmlnaHQ9XCIzMHB4XCI6dGhpcy5kb20uaW5uZXIuc3R5bGUucGFkZGluZ0xlZnQ9XCIzMHB4XCIpO3ZhciBuPXQmJnQuY2xhc3NOYW1lfHxudWxsO24hPXRoaXMuY2xhc3NOYW1lJiYodGhpcy5jbGFzc05hbWUmJihyLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCx0aGlzLmNsYXNzTmFtZSksci5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20uZm9yZWdyb3VuZCx0aGlzLmNsYXNzTmFtZSksci5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20uYmFja2dyb3VuZCx0aGlzLmNsYXNzTmFtZSksci5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20uYXhpcyx0aGlzLmNsYXNzTmFtZSkpLHIuYWRkQ2xhc3NOYW1lKHRoaXMuZG9tLmxhYmVsLG4pLHIuYWRkQ2xhc3NOYW1lKHRoaXMuZG9tLmZvcmVncm91bmQsbiksci5hZGRDbGFzc05hbWUodGhpcy5kb20uYmFja2dyb3VuZCxuKSxyLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5heGlzLG4pLHRoaXMuY2xhc3NOYW1lPW4pLHRoaXMuc3R5bGUmJihyLnJlbW92ZUNzc1RleHQodGhpcy5kb20ubGFiZWwsdGhpcy5zdHlsZSksdGhpcy5zdHlsZT1udWxsKSx0JiZ0LnN0eWxlJiYoci5hZGRDc3NUZXh0KHRoaXMuZG9tLmxhYmVsLHQuc3R5bGUpLHRoaXMuc3R5bGU9dC5zdHlsZSl9LG8ucHJvdG90eXBlLmdldExhYmVsV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wcy5sYWJlbC53aWR0aH0sby5wcm90b3R5cGUuX2RpZE1hcmtlckhlaWdodENoYW5nZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZG9tLm1hcmtlci5jbGllbnRIZWlnaHQ7aWYodCE9dGhpcy5sYXN0TWFya2VySGVpZ2h0KXt0aGlzLmxhc3RNYXJrZXJIZWlnaHQ9dDt2YXIgZT17fSxpPTA7ci5mb3JFYWNoKHRoaXMuaXRlbXMsZnVuY3Rpb24odCxvKXtpZih0LmRpcnR5PSEwLHQuZGlzcGxheWVkKXtlW29dPXQucmVkcmF3KCEwKSxpPWVbb10ubGVuZ3RofX0pO2lmKGk+MClmb3IodmFyIG89MDtvPGk7bysrKXIuZm9yRWFjaChlLGZ1bmN0aW9uKHQpe3Rbb10oKX0pO3JldHVybiEwfX0sby5wcm90b3R5cGUuX2NhbGN1bGF0ZUdyb3VwU2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kb20uZm9yZWdyb3VuZC5vZmZzZXRUb3AsZT10aGlzLmRvbS5mb3JlZ3JvdW5kLm9mZnNldExlZnQsaT10aGlzLmRvbS5mb3JlZ3JvdW5kLm9mZnNldFdpZHRoO3RoaXMudG9wPXQsdGhpcy5yaWdodD1lLHRoaXMud2lkdGg9aX0sby5wcm90b3R5cGUuX3JlZHJhd0l0ZW1zPWZ1bmN0aW9uKHQsZSxpLG8pe2lmKHR8fHRoaXMuc3RhY2tEaXJ0eXx8dGhpcy5pc1Zpc2libGUmJiFlKXt2YXIgbj17fSxzPW51bGw7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5pdGVtU2V0Lm9wdGlvbnMub3JkZXIpe3ZhciBoPXRoaXMsZD17fSxsPTA7aWYoci5mb3JFYWNoKHRoaXMuaXRlbXMsZnVuY3Rpb24odCxlKXt0LmRpc3BsYXllZHx8KGRbZV09dC5yZWRyYXcoITApLGw9ZFtlXS5sZW5ndGgsaC52aXNpYmxlSXRlbXMucHVzaCh0KSl9KSxsPjApZm9yKHZhciB1PTA7dTxsO3UrKylyLmZvckVhY2goZCxmdW5jdGlvbih0KXt0W3VdKCl9KTtpZihyLmZvckVhY2godGhpcy5pdGVtcyxmdW5jdGlvbih0KXt0LnJlcG9zaXRpb25YKCExKX0pLHRoaXMuZG9Jbm5lclN0YWNrJiZ0aGlzLml0ZW1TZXQub3B0aW9ucy5zdGFja1N1Ymdyb3Vwcyl7Zm9yKHMgaW4gdGhpcy5zdWJncm91cHMpbltzXT10aGlzLnN1Ymdyb3Vwc1tzXS5pdGVtcy5zbGljZSgpLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gaC5pdGVtU2V0Lm9wdGlvbnMub3JkZXIodC5kYXRhLGUuZGF0YSl9KTthLnN0YWNrU3ViZ3JvdXBzV2l0aElubmVyU3RhY2sobixpLHRoaXMuc3ViZ3JvdXBzKX1lbHNle3ZhciBjPXRoaXMub3JkZXJlZEl0ZW1zLmJ5U3RhcnQuc2xpY2UoKS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGguaXRlbVNldC5vcHRpb25zLm9yZGVyKHQuZGF0YSxlLmRhdGEpfSk7YS5zdGFjayhjLGksITApfXRoaXMudmlzaWJsZUl0ZW1zPXRoaXMuX3VwZGF0ZUl0ZW1zSW5SYW5nZSh0aGlzLm9yZGVyZWRJdGVtcyx0aGlzLnZpc2libGVJdGVtcyxvKX1lbHNlIGlmKHRoaXMudmlzaWJsZUl0ZW1zPXRoaXMuX3VwZGF0ZUl0ZW1zSW5SYW5nZSh0aGlzLm9yZGVyZWRJdGVtcyx0aGlzLnZpc2libGVJdGVtcyxvKSx0aGlzLml0ZW1TZXQub3B0aW9ucy5zdGFjaylpZih0aGlzLmRvSW5uZXJTdGFjayYmdGhpcy5pdGVtU2V0Lm9wdGlvbnMuc3RhY2tTdWJncm91cHMpe2ZvcihzIGluIHRoaXMuc3ViZ3JvdXBzKW5bc109dGhpcy5zdWJncm91cHNbc10uaXRlbXM7YS5zdGFja1N1Ymdyb3Vwc1dpdGhJbm5lclN0YWNrKG4saSx0aGlzLnN1Ymdyb3Vwcyl9ZWxzZSBhLnN0YWNrKHRoaXMudmlzaWJsZUl0ZW1zLGksITApO2Vsc2UgYS5ub3N0YWNrKHRoaXMudmlzaWJsZUl0ZW1zLGksdGhpcy5zdWJncm91cHMsdGhpcy5pdGVtU2V0Lm9wdGlvbnMuc3RhY2tTdWJncm91cHMpO3RoaXMuc3RhY2tEaXJ0eT0hMX19LG8ucHJvdG90eXBlLl9kaWRSZXNpemU9ZnVuY3Rpb24odCxlKXt0PXIudXBkYXRlUHJv
21167cGVydHkodGhpcyxcImhlaWdodFwiLGUpfHx0O3ZhciBpPXRoaXMuZG9tLmlubmVyLmNsaWVudFdpZHRoLG89dGhpcy5kb20uaW5uZXIuY2xpZW50SGVpZ2h0O3JldHVybiB0PXIudXBkYXRlUHJvcGVydHkodGhpcy5wcm9wcy5sYWJlbCxcIndpZHRoXCIsaSl8fHQsdD1yLnVwZGF0ZVByb3BlcnR5KHRoaXMucHJvcHMubGFiZWwsXCJoZWlnaHRcIixvKXx8dH0sby5wcm90b3R5cGUuX2FwcGx5R3JvdXBIZWlnaHQ9ZnVuY3Rpb24odCl7dGhpcy5kb20uYmFja2dyb3VuZC5zdHlsZS5oZWlnaHQ9dCtcInB4XCIsdGhpcy5kb20uZm9yZWdyb3VuZC5zdHlsZS5oZWlnaHQ9dCtcInB4XCIsdGhpcy5kb20ubGFiZWwuc3R5bGUuaGVpZ2h0PXQrXCJweFwifSxvLnByb3RvdHlwZS5fdXBkYXRlSXRlbXNWZXJ0aWNhbFBvc2l0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLGk9dGhpcy52aXNpYmxlSXRlbXMubGVuZ3RoO2U8aTtlKyspe3ZhciBvPXRoaXMudmlzaWJsZUl0ZW1zW2VdO28ucmVwb3NpdGlvblkodCksdGhpcy5pc1Zpc2libGV8fFwiX19iYWNrZ3JvdW5kX19cIj09dGhpcy5ncm91cElkfHxvLmRpc3BsYXllZCYmby5oaWRlKCl9fSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG4scz0hMSxyPXRoaXMuaXNWaXNpYmxlLGE9W2Z1bmN0aW9uKCl7aT10aGlzLl9kaWRNYXJrZXJIZWlnaHRDaGFuZ2UuYmluZCh0aGlzKX0uYmluZCh0aGlzKSx0aGlzLl91cGRhdGVTdWJHcm91cEhlaWdodHMuYmluZCh0aGlzLGUpLHRoaXMuX2NhbGN1bGF0ZUdyb3VwU2l6ZUFuZFBvc2l0aW9uLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlzVmlzaWJsZT10aGlzLl9pc0dyb3VwVmlzaWJsZS5iaW5kKHRoaXMpKHQsZSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLl9yZWRyYXdJdGVtcy5iaW5kKHRoaXMpKGkscixlLHQpfS5iaW5kKHRoaXMpLHRoaXMuX3VwZGF0ZVN1Ymdyb3Vwc1NpemVzLmJpbmQodGhpcyksZnVuY3Rpb24oKXtuPXRoaXMuX2NhbGN1bGF0ZUhlaWdodC5iaW5kKHRoaXMpKGUpfS5iaW5kKHRoaXMpLHRoaXMuX2NhbGN1bGF0ZUdyb3VwU2l6ZUFuZFBvc2l0aW9uLmJpbmQodGhpcyksZnVuY3Rpb24oKXtzPXRoaXMuX2RpZFJlc2l6ZS5iaW5kKHRoaXMpKHMsbil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLl9hcHBseUdyb3VwSGVpZ2h0LmJpbmQodGhpcykobil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVJdGVtc1ZlcnRpY2FsUG9zaXRpb24uYmluZCh0aGlzKShlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3JldHVybiF0aGlzLmlzVmlzaWJsZSYmdGhpcy5oZWlnaHQmJihzPSExKSxzfV07aWYobylyZXR1cm4gYTt2YXIgaDtyZXR1cm4gYS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2g9dCgpfSksaH0sby5wcm90b3R5cGUuX3VwZGF0ZVN1Ykdyb3VwSGVpZ2h0cz1mdW5jdGlvbih0KXtpZigoMCxzLmRlZmF1bHQpKHRoaXMuc3ViZ3JvdXBzKS5sZW5ndGg+MCl7dmFyIGU9dGhpczt0aGlzLnJlc2V0U3ViZ3JvdXBzKCksci5mb3JFYWNoKHRoaXMudmlzaWJsZUl0ZW1zLGZ1bmN0aW9uKGkpe3ZvaWQgMCE9PWkuZGF0YS5zdWJncm91cCYmKGUuc3ViZ3JvdXBzW2kuZGF0YS5zdWJncm91cF0uaGVpZ2h0PU1hdGgubWF4KGUuc3ViZ3JvdXBzW2kuZGF0YS5zdWJncm91cF0uaGVpZ2h0LGkuaGVpZ2h0K3QuaXRlbS52ZXJ0aWNhbCksZS5zdWJncm91cHNbaS5kYXRhLnN1Ymdyb3VwXS52aXNpYmxlPSEwKX0pfX0sby5wcm90b3R5cGUuX2lzR3JvdXBWaXNpYmxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudG9wPD10LmJvZHkuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodC10LmJvZHkuZG9tUHJvcHMuc2Nyb2xsVG9wK2UuYXhpcyYmdGhpcy50b3ArdGhpcy5oZWlnaHQrZS5heGlzPj0tdC5ib2R5LmRvbVByb3BzLnNjcm9sbFRvcH0sby5wcm90b3R5cGUuX2NhbGN1bGF0ZUhlaWdodD1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMudmlzaWJsZUl0ZW1zO2lmKGkubGVuZ3RoPjApe3ZhciBvPWlbMF0udG9wLG49aVswXS50b3AraVswXS5oZWlnaHQ7aWYoci5mb3JFYWNoKGksZnVuY3Rpb24odCl7bz1NYXRoLm1pbihvLHQudG9wKSxuPU1hdGgubWF4KG4sdC50b3ArdC5oZWlnaHQpfSksbz50LmF4aXMpe3ZhciBzPW8tdC5heGlzO24tPXMsci5mb3JFYWNoKGksZnVuY3Rpb24odCl7dC50b3AtPXN9KX1lPW4rdC5pdGVtLnZlcnRpY2FsLzJ9ZWxzZSBlPTA7cmV0dXJuIGU9TWF0aC5tYXgoZSx0aGlzLnByb3BzLmxhYmVsLmhlaWdodCl9LG8ucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXt0aGlzLmRvbS5sYWJlbC5wYXJlbnROb2RlfHx0aGlzLml0ZW1TZXQuZG9tLmxhYmVsU2V0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmxhYmVsKSx0aGlzLmRvbS5mb3JlZ3JvdW5kLnBhcmVudE5vZGV8fHRoaXMuaXRlbVNldC5kb20uZm9yZWdyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5mb3JlZ3JvdW5kKSx0aGlzLmRvbS5iYWNrZ3JvdW5kLnBhcmVudE5vZGV8fHRoaXMuaXRlbVNldC5kb20uYmFja2dyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5iYWNrZ3JvdW5kKSx0aGlzLmRvbS5heGlzLnBhcmVudE5vZGV8fHRoaXMuaXRlbVNldC5kb20uYXhpcy5hcHBlbmRDaGlsZCh0aGlzLmRvbS5heGlzKX0sby5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZG9tLmxhYmVsO3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpO3ZhciBlPXRoaXMuZG9tLmZvcmVncm91bmQ7ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7dmFyIGk9dGhpcy5kb20uYmFja2dyb3VuZDtpLnBhcmVudE5vZGUmJmkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpKTt2YXIgbz10aGlzLmRvbS5heGlzO28ucGFyZW50Tm9kZSYmby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfSxvLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7aWYodGhpcy5pdGVtc1t0LmlkXT10LHQuc2V0UGFyZW50KH
21167RoaXMpLHRoaXMuc3RhY2tEaXJ0eT0hMCx2b2lkIDAhPT10LmRhdGEuc3ViZ3JvdXAmJih0aGlzLl9hZGRUb1N1Ymdyb3VwKHQpLHRoaXMub3JkZXJTdWJncm91cHMoKSksLTE9PXRoaXMudmlzaWJsZUl0ZW1zLmluZGV4T2YodCkpe3ZhciBlPXRoaXMuaXRlbVNldC5ib2R5LnJhbmdlO3RoaXMuX2NoZWNrSWZWaXNpYmxlKHQsdGhpcy52aXNpYmxlSXRlbXMsZSl9fSxvLnByb3RvdHlwZS5fYWRkVG9TdWJncm91cD1mdW5jdGlvbih0LGUpe2U9ZXx8dC5kYXRhLnN1Ymdyb3VwLHZvaWQgMCE9ZSYmdm9pZCAwPT09dGhpcy5zdWJncm91cHNbZV0mJih0aGlzLnN1Ymdyb3Vwc1tlXT17aGVpZ2h0OjAsdG9wOjAsc3RhcnQ6dC5kYXRhLnN0YXJ0LGVuZDp0LmRhdGEuZW5kfHx0LmRhdGEuc3RhcnQsdmlzaWJsZTohMSxpbmRleDp0aGlzLnN1Ymdyb3VwSW5kZXgsaXRlbXM6W10sc3RhY2s6dGhpcy5zdWJncm91cFN0YWNrQWxsfHx0aGlzLnN1Ymdyb3VwU3RhY2tbZV18fCExfSx0aGlzLnN1Ymdyb3VwSW5kZXgrKyksbmV3IERhdGUodC5kYXRhLnN0YXJ0KTxuZXcgRGF0ZSh0aGlzLnN1Ymdyb3Vwc1tlXS5zdGFydCkmJih0aGlzLnN1Ymdyb3Vwc1tlXS5zdGFydD10LmRhdGEuc3RhcnQpO3ZhciBpPXQuZGF0YS5lbmR8fHQuZGF0YS5zdGFydDtuZXcgRGF0ZShpKT5uZXcgRGF0ZSh0aGlzLnN1Ymdyb3Vwc1tlXS5lbmQpJiYodGhpcy5zdWJncm91cHNbZV0uZW5kPWkpLHRoaXMuc3ViZ3JvdXBzW2VdLml0ZW1zLnB1c2godCl9LG8ucHJvdG90eXBlLl91cGRhdGVTdWJncm91cHNTaXplcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodC5zdWJncm91cHMpZm9yKHZhciBlIGluIHQuc3ViZ3JvdXBzKXt2YXIgaT10LnN1Ymdyb3Vwc1tlXS5pdGVtc1swXS5kYXRhLmVuZHx8dC5zdWJncm91cHNbZV0uaXRlbXNbMF0uZGF0YS5zdGFydCxvPXQuc3ViZ3JvdXBzW2VdLml0ZW1zWzBdLmRhdGEuc3RhcnQsbj1pLTE7dC5zdWJncm91cHNbZV0uaXRlbXMuZm9yRWFjaChmdW5jdGlvbih0KXtuZXcgRGF0ZSh0LmRhdGEuc3RhcnQpPG5ldyBEYXRlKG8pJiYobz10LmRhdGEuc3RhcnQpO3ZhciBlPXQuZGF0YS5lbmR8fHQuZGF0YS5zdGFydDtuZXcgRGF0ZShlKT5uZXcgRGF0ZShuKSYmKG49ZSl9KSx0LnN1Ymdyb3Vwc1tlXS5zdGFydD1vLHQuc3ViZ3JvdXBzW2VdLmVuZD1uZXcgRGF0ZShuLTEpfX0sby5wcm90b3R5cGUub3JkZXJTdWJncm91cHM9ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT10aGlzLnN1Ymdyb3VwT3JkZXJlcil7dmFyIHQsZT1bXTtpZihcInN0cmluZ1wiPT10eXBlb2YgdGhpcy5zdWJncm91cE9yZGVyZXIpe2Zvcih0IGluIHRoaXMuc3ViZ3JvdXBzKWUucHVzaCh7c3ViZ3JvdXA6dCxzb3J0RmllbGQ6dGhpcy5zdWJncm91cHNbdF0uaXRlbXNbMF0uZGF0YVt0aGlzLnN1Ymdyb3VwT3JkZXJlcl19KTtlLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5zb3J0RmllbGQtZS5zb3J0RmllbGR9KX1lbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMuc3ViZ3JvdXBPcmRlcmVyKXtmb3IodCBpbiB0aGlzLnN1Ymdyb3VwcyllLnB1c2godGhpcy5zdWJncm91cHNbdF0uaXRlbXNbMF0uZGF0YSk7ZS5zb3J0KHRoaXMuc3ViZ3JvdXBPcmRlcmVyKX1pZihlLmxlbmd0aD4wKWZvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXRoaXMuc3ViZ3JvdXBzW2VbaV0uc3ViZ3JvdXBdLmluZGV4PWl9fSxvLnByb3RvdHlwZS5yZXNldFN1Ymdyb3Vwcz1mdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLnN1Ymdyb3Vwcyl0aGlzLnN1Ymdyb3Vwcy5oYXNPd25Qcm9wZXJ0eSh0KSYmKHRoaXMuc3ViZ3JvdXBzW3RdLnZpc2libGU9ITEsdGhpcy5zdWJncm91cHNbdF0uaGVpZ2h0PTApfSxvLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7ZGVsZXRlIHRoaXMuaXRlbXNbdC5pZF0sdC5zZXRQYXJlbnQobnVsbCksdGhpcy5zdGFja0RpcnR5PSEwO3ZhciBlPXRoaXMudmlzaWJsZUl0ZW1zLmluZGV4T2YodCk7LTEhPWUmJnRoaXMudmlzaWJsZUl0ZW1zLnNwbGljZShlLDEpLHZvaWQgMCE9PXQuZGF0YS5zdWJncm91cCYmKHRoaXMuX3JlbW92ZUZyb21TdWJncm91cCh0KSx0aGlzLm9yZGVyU3ViZ3JvdXBzKCkpfSxvLnByb3RvdHlwZS5fcmVtb3ZlRnJvbVN1Ymdyb3VwPWZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT0oZT1lfHx0LmRhdGEuc3ViZ3JvdXApKXt2YXIgaT10aGlzLnN1Ymdyb3Vwc1tlXTtpZihpKXt2YXIgbz1pLml0ZW1zLmluZGV4T2YodCk7bz49MCYmKGkuaXRlbXMuc3BsaWNlKG8sMSksaS5pdGVtcy5sZW5ndGg/dGhpcy5fdXBkYXRlU3ViZ3JvdXBzU2l6ZXMoKTpkZWxldGUgdGhpcy5zdWJncm91cHNbZV0pfX19LG8ucHJvdG90eXBlLnJlbW92ZUZyb21EYXRhU2V0PWZ1bmN0aW9uKHQpe3RoaXMuaXRlbVNldC5yZW1vdmVJdGVtKHQuaWQpfSxvLnByb3RvdHlwZS5vcmRlcj1mdW5jdGlvbigpe2Zvcih2YXIgdD1yLnRvQXJyYXkodGhpcy5pdGVtcyksZT1bXSxpPVtdLG89MDtvPHQubGVuZ3RoO28rKyl2b2lkIDAhPT10W29dLmRhdGEuZW5kJiZpLnB1c2godFtvXSksZS5wdXNoKHRbb10pO3RoaXMub3JkZXJlZEl0ZW1zPXtieVN0YXJ0OmUsYnlFbmQ6aX0sYS5vcmRlckJ5U3RhcnQodGhpcy5vcmRlcmVkSXRlbXMuYnlTdGFydCksYS5vcmRlckJ5RW5kKHRoaXMub3JkZXJlZEl0ZW1zLmJ5RW5kKX0sby5wcm90b3R5cGUuX3VwZGF0ZUl0ZW1zSW5SYW5nZT1mdW5jdGlvbih0LGUsaSl7dmFyIG89W10sbj17fSxzPShpLmVuZC1pLnN0YXJ0KS80LGE9aS5zdGFydC1zLGg9aS5lbmQrcyxkPWZ1bmN0aW9uKHQpe3JldHVybiB0PGE/LTE6dDw9aD8wOjF9O2lmKGUubGVuZ3RoPjApZm9yKHZhciBsPTA7bDxlLmxlbmd0aDtsKyspdGhpcy5fY2hlY2tJZlZpc2libGVXaXRoUmVmZXJlbmNlKGVbbF0sbyxuLGkpO3ZhciB1PXIuYmluYXJ5U2VhcmNoQ3VzdG9tKHQuYnlTdGFydCxkLFwiZGF0YVwiLFwic3RhcnRcIik7aWYodGhpcy5fdHJhY2VWaXNpYmxlKHUsdC5ieVN0YXJ0LG8sbixmdW5jdGlvbih0KXtyZXR1cm4gdC5kYXRhLnN0YXJ0PGF8fHQuZGF0YS5zdGFydD5ofSksMT09dGhpcy5jaGVja1JhbmdlZEl0ZW1zKWZvcih0aGlzLmNoZWNrUmFuZ2VkSXRlbXM9ITEsbD0wO2w8dC5ieUVuZC5sZW5ndGg7bCsrKXRoaXMuX2NoZWNrSWZWaXNpYmxlV2l0aFJlZmVyZW5jZSh0LmJ5RW5kW2xdLG8sbixpKTtlbHNle3ZhciBjPXIuYmluYXJ5U2VhcmNoQ3VzdG9tKHQuYnlFbmQsZCxcImRhdGFcIixcImVuZFwiKTt0aGlzLl90cmFjZVZpc2libGUoYyx0LmJ5RW5kLG8sbixmdW5jdGlvbih0KXtyZXR1cm4gdC5kYXRhLmVuZDxhfHx0LmRhdGEuZW5kPmh9KX12YXIgcD17fSxmPTA7Zm9yKGw9MDtsPG8ubGVuZ3RoO2wrKyl7dmFyIG09b1tsXTtpZighbS5kaXNwbGF5ZWQpe3BbbF09bS5yZWRyYXcoITApLGY9cFtsXS5sZW5ndGh9fWlmKGY+MClmb3IodmFyIHY9MDt2PGY7disrKXIuZm9yRWFjaChwLGZ1bmN0aW9uKHQpe3Rbdl0oKX0pO2ZvcihsPTA7bDxvLmxlbmd0aDtsKyspb1tsXS5yZXBvc2l0aW9uWCgpO3JldHVybiBvfSxvLnByb3RvdHlwZS5fdHJhY2VWaXNpYmxlPWZ1bmN0aW9uKHQsZSxpLG8sbil7aWYoLTEhPXQpe3ZhciBzLHI7Zm9yKHM9dDtzPj0wJiYocj1lW3NdLCFuKHIpKTtzLS0pdm9pZCAwPT09b1tyLmlkXSYmKG9bci5pZF09ITAsaS5wdXNoKHIpKTtmb3Iocz10KzE7czxlLmxlbmd0aCYmKHI9ZVtzXSwhbihyKSk7cysrKXZvaWQgMD09PW9bci5pZF0mJihvW3IuaWRdPSEwLGkucHVzaChyKSl9fSxvLnByb3RvdHlwZS5fY2hlY2tJZlZpc2libGU9ZnVuY3Rpb24odCxlLGkpe3QuaXNWaXNpYmxlKGkpPyh0LmRpc3BsYXllZHx8dC5zaG93KCksdC5yZXBvc2l0aW9uWCgpLGUucHVzaCh0KSk6dC5kaXNwbGF5ZWQmJnQuaGlkZSgpfSxvLnByb3RvdHlwZS5fY2hlY2tJZlZpc2libGVXaXRoUmVmZXJlbmNlPWZ1bmN0aW9uKHQsZSxpLG8pe3QuaXNWaXNpYmxlKG8pP3ZvaWQgMD09PWlbdC5pZF0mJihpW3QuaWRdPSEwLGUucHVzaCh0KSk6dC5kaXNwbGF5ZWQmJnQuaGlkZSgpfSxvLnByb3RvdHlwZS5jaGFuZ2VTdWJncm91cD1mdW5jdGlvbih0LGUsaSl7dGhpcy5fcmVtb3ZlRnJvbVN1Ymdyb3VwKHQsZSksdGhpcy5fYWRkVG9TdWJncm91cCh0LGkpLHRoaXMub3JkZXJTdWJncm91cHMoKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpKXtyLmNhbGwodGhpcyx0LGUsaSksdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy50b3A9MCx0aGlzLmxlZnQ9MH12YXIgbj1pKDI5KSxzPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0obikscj1pKDY4KTtvLnByb3RvdHlwZT0oMCxzLmRlZmF1bHQpKHIucHJvdG90eXBlKSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24odCxlLGkpe3RoaXMudmlzaWJsZUl0ZW1zPXRoaXMuX3VwZGF0ZUl0ZW1zSW5SYW5nZSh0aGlzLm9yZGVyZWRJdGVtcyx0aGlzLnZpc2libGVJdGVtcyx0KSx0aGlzLndpZHRoP
21167XRoaXMuZG9tLmJhY2tncm91bmQub2Zmc2V0V2lkdGgsdGhpcy5kb20uYmFja2dyb3VuZC5zdHlsZS5oZWlnaHQ9XCIwXCI7Zm9yKHZhciBvPTAsbj10aGlzLnZpc2libGVJdGVtcy5sZW5ndGg7bzxuO28rKyl7dGhpcy52aXNpYmxlSXRlbXNbb10ucmVwb3NpdGlvblkoZSl9cmV0dXJuITF9LG8ucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXt0aGlzLmRvbS5iYWNrZ3JvdW5kLnBhcmVudE5vZGV8fHRoaXMuaXRlbVNldC5kb20uYmFja2dyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5iYWNrZ3JvdW5kKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpKXtpZih0aGlzLnByb3BzPXtjb250ZW50Ont3aWR0aDowfX0sdGhpcy5vdmVyZmxvdz0hMSx0aGlzLm9wdGlvbnM9aSx0KXtpZih2b2lkIDA9PXQuc3RhcnQpdGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0eSBcInN0YXJ0XCIgbWlzc2luZyBpbiBpdGVtICcrdC5pZCk7aWYodm9pZCAwPT10LmVuZCl0aHJvdyBuZXcgRXJyb3IoJ1Byb3BlcnR5IFwiZW5kXCIgbWlzc2luZyBpbiBpdGVtICcrdC5pZCl9bi5jYWxsKHRoaXMsdCxlLGkpfXZhciBuPWkoMzgpO28ucHJvdG90eXBlPW5ldyBuKG51bGwsbnVsbCxudWxsKSxvLnByb3RvdHlwZS5iYXNlQ2xhc3NOYW1lPVwidmlzLWl0ZW0gdmlzLXJhbmdlXCIsby5wcm90b3R5cGUuaXNWaXNpYmxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRhdGEuc3RhcnQ8dC5lbmQmJnRoaXMuZGF0YS5lbmQ+dC5zdGFydH0sby5wcm90b3R5cGUuX2NyZWF0ZURvbUVsZW1lbnQ9ZnVuY3Rpb24oKXt0aGlzLmRvbXx8KHRoaXMuZG9tPXt9LHRoaXMuZG9tLmJveD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20uZnJhbWUuY2xhc3NOYW1lPVwidmlzLWl0ZW0tb3ZlcmZsb3dcIix0aGlzLmRvbS5ib3guYXBwZW5kQ2hpbGQodGhpcy5kb20uZnJhbWUpLHRoaXMuZG9tLnZpc2libGVGcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLnZpc2libGVGcmFtZS5jbGFzc05hbWU9XCJ2aXMtaXRlbS12aXNpYmxlLWZyYW1lXCIsdGhpcy5kb20uYm94LmFwcGVuZENoaWxkKHRoaXMuZG9tLnZpc2libGVGcmFtZSksdGhpcy5kb20uY29udGVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmNvbnRlbnQuY2xhc3NOYW1lPVwidmlzLWl0ZW0tY29udGVudFwiLHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZG9tLmNvbnRlbnQpLHRoaXMuZG9tLmJveFtcInRpbWVsaW5lLWl0ZW1cIl09dGhpcyx0aGlzLmRpcnR5PSEwKX0sby5wcm90b3R5cGUuX2FwcGVuZERvbUVsZW1lbnQ9ZnVuY3Rpb24oKXtpZighdGhpcy5wYXJlbnQpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHJlZHJhdyBpdGVtOiBubyBwYXJlbnQgYXR0YWNoZWRcIik7aWYoIXRoaXMuZG9tLmJveC5wYXJlbnROb2RlKXt2YXIgdD10aGlzLnBhcmVudC5kb20uZm9yZWdyb3VuZDtpZighdCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVkcmF3IGl0ZW06IHBhcmVudCBoYXMgbm8gZm9yZWdyb3VuZCBjb250YWluZXIgZWxlbWVudFwiKTt0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmJveCl9dGhpcy5kaXNwbGF5ZWQ9ITB9LG8ucHJvdG90eXBlLl91cGRhdGVEaXJ0eURvbUNvbXBvbmVudHM9ZnVuY3Rpb24oKXtpZih0aGlzLmRpcnR5KXt0aGlzLl91cGRhdGVDb250ZW50cyh0aGlzLmRvbS5jb250ZW50KSx0aGlzLl91cGRhdGVEYXRhQXR0cmlidXRlcyh0aGlzLmRvbS5ib3gpLHRoaXMuX3VwZGF0ZVN0eWxlKHRoaXMuZG9tLmJveCk7dmFyIHQ9dGhpcy5lZGl0YWJsZS51cGRhdGVUaW1lfHx0aGlzLmVkaXRhYmxlLnVwZGF0ZUdyb3VwLGU9KHRoaXMuZGF0YS5jbGFzc05hbWU/XCIgXCIrdGhpcy5kYXRhLmNsYXNzTmFtZTpcIlwiKSsodGhpcy5zZWxlY3RlZD9cIiB2aXMtc2VsZWN0ZWRcIjpcIlwiKSsodD9cIiB2aXMtZWRpdGFibGVcIjpcIiB2aXMtcmVhZG9ubHlcIik7dGhpcy5kb20uYm94LmNsYXNzTmFtZT10aGlzLmJhc2VDbGFzc05hbWUrZSx0aGlzLmRvbS5jb250ZW50LnN0eWxlLm1heFdpZHRoPVwibm9uZVwifX0sby5wcm90b3R5cGUuX2dldERvbUNvbXBvbmVudHNTaXplcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm92ZXJmbG93PVwiaGlkZGVuXCIhPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRvbS5mcmFtZSkub3ZlcmZsb3cse2NvbnRlbnQ6e3dpZHRoOnRoaXMuZG9tLmNvbnRlbnQub2Zmc2V0V2lkdGh9LGJveDp7aGVpZ2h0OnRoaXMuZG9tLmJveC5vZmZzZXRIZWlnaHR9fX0sby5wcm90b3R5cGUuX3VwZGF0ZURvbUNvbXBvbmVudHNTaXplcz1mdW5jdGlvbih0KXt0aGlzLnByb3BzLmNvbn
21167RlbnQud2lkdGg9dC5jb250ZW50LndpZHRoLHRoaXMuaGVpZ2h0PXQuYm94LmhlaWdodCx0aGlzLmRvbS5jb250ZW50LnN0eWxlLm1heFdpZHRoPVwiXCIsdGhpcy5kaXJ0eT0hMX0sby5wcm90b3R5cGUuX3JlcGFpbnREb21BZGRpdGlvbmFscz1mdW5jdGlvbigpe3RoaXMuX3JlcGFpbnRPbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcCh0aGlzLmRvbS5ib3gpLHRoaXMuX3JlcGFpbnREZWxldGVCdXR0b24odGhpcy5kb20uYm94KSx0aGlzLl9yZXBhaW50RHJhZ0NlbnRlcigpLHRoaXMuX3JlcGFpbnREcmFnTGVmdCgpLHRoaXMuX3JlcGFpbnREcmFnUmlnaHQoKX0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKHQpe3ZhciBlLGk9W3RoaXMuX2NyZWF0ZURvbUVsZW1lbnQuYmluZCh0aGlzKSx0aGlzLl9hcHBlbmREb21FbGVtZW50LmJpbmQodGhpcyksdGhpcy5fdXBkYXRlRGlydHlEb21Db21wb25lbnRzLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmRpcnR5JiYoZT10aGlzLl9nZXREb21Db21wb25lbnRzU2l6ZXMuYmluZCh0aGlzKSgpKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGlydHkmJnRoaXMuX3VwZGF0ZURvbUNvbXBvbmVudHNTaXplcy5iaW5kKHRoaXMpKGUpfS5iaW5kKHRoaXMpLHRoaXMuX3JlcGFpbnREb21BZGRpdGlvbmFscy5iaW5kKHRoaXMpXTtpZih0KXJldHVybiBpO3ZhciBvO3JldHVybiBpLmZvckVhY2goZnVuY3Rpb24odCl7bz10KCl9KSxvfSxvLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5ZWR8fHRoaXMucmVkcmF3KCl9LG8ucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXtpZih0aGlzLmRpc3BsYXllZCl7dmFyIHQ9dGhpcy5kb20uYm94O3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHRoaXMuZGlzcGxheWVkPSExfX0sby5wcm90b3R5cGUucmVwb3NpdGlvblg9ZnVuY3Rpb24odCl7dmFyIGUsaSxvPXRoaXMucGFyZW50LndpZHRoLG49dGhpcy5jb252ZXJzaW9uLnRvU2NyZWVuKHRoaXMuZGF0YS5zdGFydCkscz10aGlzLmNvbnZlcnNpb24udG9TY3JlZW4odGhpcy5kYXRhLmVuZCkscj12b2lkIDA9PT10aGlzLmRhdGEuYWxpZ24/dGhpcy5vcHRpb25zLmFsaWduOnRoaXMuZGF0YS5hbGlnbjshMT09PXRoaXMuZGF0YS5saW1pdFNpemV8fHZvaWQgMCE9PXQmJiEwIT09dHx8KG48LW8mJihuPS1vKSxzPjIqbyYmKHM9MipvKSk7dmFyIGE9TWF0aC5tYXgocy1uKy41LDEpO3N3aXRjaCh0aGlzLm92ZXJmbG93Pyh0aGlzLm9wdGlvbnMucnRsP3RoaXMucmlnaHQ9bjp0aGlzLmxlZnQ9bix0aGlzLndpZHRoPWErdGhpcy5wcm9wcy5jb250ZW50LndpZHRoLGk9dGhpcy5wcm9wcy5jb250ZW50LndpZHRoKToodGhpcy5vcHRpb25zLnJ0bD90aGlzLnJpZ2h0PW46dGhpcy5sZWZ0PW4sdGhpcy53aWR0aD1hLGk9TWF0aC5taW4ocy1uLHRoaXMucHJvcHMuY29udGVudC53aWR0aCkpLHRoaXMub3B0aW9ucy5ydGw/dGhpcy5kb20uYm94LnN0eWxlLnJpZ2h0PXRoaXMucmlnaHQrXCJweFwiOnRoaXMuZG9tLmJveC5zdHlsZS5sZWZ0PXRoaXMubGVmdCtcInB4XCIsdGhpcy5kb20uYm94LnN0eWxlLndpZHRoPWErXCJweFwiLHIpe2Nhc2VcImxlZnRcIjp0aGlzLm9wdGlvbnMucnRsP3RoaXMuZG9tLmNvbnRlbnQuc3R5bGUucmlnaHQ9XCIwXCI6dGhpcy5kb20uY29udGVudC5zdHlsZS5sZWZ0PVwiMFwiO2JyZWFrO2Nhc2VcInJpZ2h0XCI6dGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5jb250ZW50LnN0eWxlLnJpZ2h0PU1hdGgubWF4KGEtaSwwKStcInB4XCI6dGhpcy5kb20uY29udGVudC5zdHlsZS5sZWZ0PU1hdGgubWF4KGEtaSwwKStcInB4XCI7YnJlYWs7Y2FzZVwiY2VudGVyXCI6dGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5jb250ZW50LnN0eWxlLnJpZ2h0PU1hdGgubWF4KChhLWkpLzIsMCkrXCJweFwiOnRoaXMuZG9tLmNvbnRlbnQuc3R5bGUubGVmdD1NYXRoLm1heCgoYS1pKS8yLDApK1wicHhcIjticmVhaztkZWZhdWx0OmU9dGhpcy5vdmVyZmxvdz9zPjA/TWF0aC5tYXgoLW4sMCk6LWk6bjwwPy1uOjAsdGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5jb250ZW50LnN0eWxlLnJpZ2h0PWUrXCJweFwiOih0aGlzLmRvbS5jb250ZW50LnN0eWxlLmxlZnQ9ZStcInB4XCIsdGhpcy5kb20uY29udGVudC5zdHlsZS53aWR0aD1cImNhbGMoMTAwJSAtIFwiK2UrXCJweClcIil9fSxvLnByb3RvdHlwZS5yZXBvc2l0aW9uWT1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtLGU9dGhpcy5kb20uYm94O2Uuc3R5bGUudG9wPVwidG9wXCI9PXQ/dGhpcy50b3ArXCJweFwiOnRoaXMucGFyZW50LmhlaWdodC10aGlzLnRvcC10aGlzLmhlaWdodCtcInB4XCJ9LG8ucHJvdG90eXBlLl9yZXBhaW50RHJhZ0xlZnQ9ZnVuY3Rpb24oKXtpZigodGhpcy5zZWxlY3RlZHx8dGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLnJhbmdlKSYmdGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZVRpbWUmJiF0aGlzLmRvbS5kcmFnTGVmdCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt0LmNsYXNzTmFtZT1cInZpcy1kcmFnLWxlZnRcIix0LmRyYWdMZWZ0SXRlbT10aGlzLHRoaXMuZG9tLmJveC5hcHBlbmRDaGlsZCh0KSx0aGlzLmRvbS5kcmFnTGVmdD10fWVsc2UgdGhpcy5zZWxlY3RlZHx8dGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLnJhbmdlfHwhdGhpcy5kb20uZHJhZ0xlZnR8fCh0aGlzLmRvbS5kcmFnTGVmdC5wYXJlbnROb2RlJiZ0aGlzLmRvbS5kcmFnTGVmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmRyYWdMZWZ0KSx0aGlzLmRvbS5kcmFnTGVmdD1udWxsKX0sby5wcm90b3R5cGUuX3JlcGFpbnREcmFnUmlnaHQ9ZnVuY3Rpb24oKXtpZigodGhpcy5zZWxlY3RlZHx8dGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLnJhbmdlKSYmdGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZVRpbWUmJiF0aGlzLmRvbS5kcmFnUmlnaHQpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dC5jbGFzc05hbWU9XCJ2aXMtZHJhZy1yaWdodFwiLHQuZHJhZ1JpZ2h0SXRlbT10aGlzLHRoaXMuZG9tLmJveC5hcHBlbmRDaGlsZCh0KSx0aGlzLmRvbS5kcmFnUmlnaHQ9dH1lbHNlI
21167HRoaXMuc2VsZWN0ZWR8fHRoaXMub3B0aW9ucy5pdGVtc0Fsd2F5c0RyYWdnYWJsZS5yYW5nZXx8IXRoaXMuZG9tLmRyYWdSaWdodHx8KHRoaXMuZG9tLmRyYWdSaWdodC5wYXJlbnROb2RlJiZ0aGlzLmRvbS5kcmFnUmlnaHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5kcmFnUmlnaHQpLHRoaXMuZG9tLmRyYWdSaWdodD1udWxsKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDE5KSxzPW8obikscj1pKDYpLGE9byhyKSxoPWkoMCksZD1vKGgpLGw9aSgxKSx1PW8obCksYz1pKDIpLHA9aSgxNzkpLmRlZmF1bHQsZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8pe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXToxOygwLGQuZGVmYXVsdCkodGhpcyx0KSx0aGlzLnBhcmVudD1lLHRoaXMuY2hhbmdlZE9wdGlvbnM9W10sdGhpcy5jb250YWluZXI9aSx0aGlzLmFsbG93Q3JlYXRpb249ITEsdGhpcy5vcHRpb25zPXt9LHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5wb3B1cENvdW50ZXI9MCx0aGlzLmRlZmF1bHRPcHRpb25zPXtlbmFibGVkOiExLGZpbHRlcjohMCxjb250YWluZXI6dm9pZCAwLHNob3dCdXR0b246ITB9LGMuZXh0ZW5kKHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLmNvbmZpZ3VyZU9wdGlvbnM9byx0aGlzLm1vZHVsZU9wdGlvbnM9e30sdGhpcy5kb21FbGVtZW50cz1bXSx0aGlzLnBvcHVwRGl2PXt9LHRoaXMucG9wdXBMaW1pdD01LHRoaXMucG9wdXBIaXN0b3J5PXt9LHRoaXMuY29sb3JQaWNrZXI9bmV3IHAobiksdGhpcy53cmFwcGVyPXZvaWQgMH1yZXR1cm4oMCx1LmRlZmF1bHQpKHQsW3trZXk6XCJzZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dCl7dGhpcy5wb3B1cEhpc3Rvcnk9e30sdGhpcy5fcmVtb3ZlUG9wdXAoKTt2YXIgZT0hMDtcInN0cmluZ1wiPT10eXBlb2YgdD90aGlzLm9wdGlvbnMuZmlsdGVyPXQ6dCBpbnN0YW5jZW9mIEFycmF5P3RoaXMub3B0aW9ucy5maWx0ZXI9dC5qb2luKCk6XCJvYmplY3RcIj09PSh2b2lkIDA9PT10P1widW5kZWZpbmVkXCI6KDAsYS5kZWZhdWx0KSh0KSk/KHZvaWQgMCE9PXQuY29udGFpbmVyJiYodGhpcy5vcHRpb25zLmNvbnRhaW5lcj10LmNvbnRhaW5lciksdm9pZCAwIT09dC5maWx0ZXImJih0aGlzLm9wdGlvbnMuZmlsdGVyPXQuZmlsdGVyKSx2b2lkIDAhPT10LnNob3dCdXR0b24mJih0aGlzLm9wdGlvbnMuc2hvd0J1dHRvbj10LnNob3dCdXR0b24pLHZvaWQgMCE9PXQuZW5hYmxlZCYmKGU9dC5lbmFibGVkKSk6XCJib29sZWFuXCI9PXR5cGVvZiB0Pyh0aGlzLm9wdGlvbnMuZmlsdGVyPSEwLGU9dCk6XCJmdW5jdGlvblwiPT10eXBlb2YgdCYmKHRoaXMub3B0aW9ucy5maWx0ZXI9dCxlPSEwKSwhMT09PXRoaXMub3B0aW9ucy5maWx0ZXImJihlPSExKSx0aGlzLm9wdGlvbnMuZW5hYmxlZD1lfXRoaXMuX2NsZWFuKCl9fSx7a2V5Olwic2V0TW9kdWxlT3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMubW9kdWxlT3B0aW9ucz10LCEwPT09dGhpcy5vcHRpb25zLmVuYWJsZWQmJih0aGlzLl9jbGVhbigpLHZvaWQgMCE9PXRoaXMub3B0aW9ucy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj10aGlzLm9wdGlvbnMuY29udGFpbmVyKSx0aGlzLl9jcmVhdGUoKSl9fSx7a2V5OlwiX2NyZWF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9jbGVhbigpLHRoaXMuY2hhbmdlZE9wdGlvbnM9W107dmFyIGU9dGhpcy5vcHRpb25zLmZpbHRlcixpPTAsbz0hMTtmb3IodmFyIG4gaW4gdGhpcy5jb25maWd1cmVPcHRpb25zKXRoaXMuY29uZmlndXJlT3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuKSYmKHRoaXMuYWxsb3dDcmVhdGlvbj0hMSxvPSExLFwiZnVuY3Rpb25cIj09dHlwZW9mIGU/KG89ZShuLFtdKSxvPW98fHRoaXMuX2hhbmRsZU9iamVjdCh0aGlzLmNvbmZpZ3VyZU9wdGlvbnNbbl0sW25dLCEwKSk6ITAhPT1lJiYtMT09PWUuaW5kZXhPZihuKXx8KG89ITApLCExIT09byYmKHRoaXMuYWxsb3dDcmVhdGlvbj0hMCxpPjAmJnRoaXMuX21ha2VJdGVtKFtdKSx0aGlzLl9tYWtlSGVhZGVyKG4pLHRoaXMuX2hhbmRsZU9iamVjdCh0aGlzLmNvbmZpZ3VyZU9wdGlvbnNbbl0sW25dKSksaSsrKTtpZighMD09PXRoaXMub3B0aW9ucy5zaG93QnV0dG9uKXt2YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3MuY2xhc3NOYW1lPVwidmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1idXR0b25cIixzLmlubmVySFRNTD1cImdlbmVyYXRlIG9wdGlvbnNcIixzLm9uY2xpY2s9ZnVuY3Rpb24oKXt0Ll9wcmludE9wdGlvbnMoKX0scy5vbm1vdXNlb3Zlcj1mdW5jdGlvbigpe3MuY2xhc3NOYW1lPVwidmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1idXR0b24gaG92ZXJcIn0scy5vbm1vdXNlb3V0PWZ1bmN0aW9uKCl7cy5jbGFzc05hbWU9XCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWJ1dHRvblwifSx0aGlzLm9wdGlvbnNDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLm9wdGlvbnNDb250YWluZXIuY2xhc3NOYW1lPVwidmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1vcHRpb24tY29udGFpbmVyXCIsdGhpcy5kb21FbGVtZW50cy5wdXNoKHRoaXMub3B0aW9uc0NvbnRhaW5lciksdGhpcy5kb21FbGVtZW50cy5wdXNoKHMpfXRoaXMuX3B1c2goKX19LHtrZXk6XCJfcHVzaFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy53cmFwcGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy53cmFwcGVyLmNsYXNzTmFtZT1cInZpcy1jb25maWd1cmF0aW9uLXdyYXBwZXJcIix0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLndyYXBwZXIpO2Zvcih2YXIgdD0wO3Q8dGhpcy5kb21FbGVtZW50cy5sZW5ndGg7dCsrKXRoaXMud3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLmRvbUVs
21167ZW1lbnRzW3RdKTt0aGlzLl9zaG93UG9wdXBJZk5lZWRlZCgpfX0se2tleTpcIl9jbGVhblwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLmRvbUVsZW1lbnRzLmxlbmd0aDt0KyspdGhpcy53cmFwcGVyLnJlbW92ZUNoaWxkKHRoaXMuZG9tRWxlbWVudHNbdF0pO3ZvaWQgMCE9PXRoaXMud3JhcHBlciYmKHRoaXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMud3JhcHBlciksdGhpcy53cmFwcGVyPXZvaWQgMCksdGhpcy5kb21FbGVtZW50cz1bXSx0aGlzLl9yZW1vdmVQb3B1cCgpfX0se2tleTpcIl9nZXRWYWx1ZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLm1vZHVsZU9wdGlvbnMsaT0wO2k8dC5sZW5ndGg7aSsrKXtpZih2b2lkIDA9PT1lW3RbaV1dKXtlPXZvaWQgMDticmVha31lPWVbdFtpXV19cmV0dXJuIGV9fSx7a2V5OlwiX21ha2VJdGVtXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoITA9PT10aGlzLmFsbG93Q3JlYXRpb24pe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7ZS5jbGFzc05hbWU9XCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWl0ZW0gdmlzLWNvbmZpZy1zXCIrdC5sZW5ndGg7Zm9yKHZhciBpPWFyZ3VtZW50cy5sZW5ndGgsbz1BcnJheShpPjE/aS0xOjApLG49MTtuPGk7bisrKW9bbi0xXT1hcmd1bWVudHNbbl07cmV0dXJuIG8uZm9yRWFjaChmdW5jdGlvbih0KXtlLmFwcGVuZENoaWxkKHQpfSksdGhpcy5kb21FbGVtZW50cy5wdXNoKGUpLHRoaXMuZG9tRWxlbWVudHMubGVuZ3RofXJldHVybiAwfX0se2tleTpcIl9tYWtlSGVhZGVyXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtlLmNsYXNzTmFtZT1cInZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctaGVhZGVyXCIsZS5pbm5lckhUTUw9dCx0aGlzLl9tYWtlSXRlbShbXSxlKX19LHtrZXk6XCJfbWFrZUxhYmVsXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtyZXR1cm4gby5jbGFzc05hbWU9XCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWxhYmVsIHZpcy1jb25maWctc1wiK2UubGVuZ3RoLG8uaW5uZXJIVE1MPSEwPT09aT9cIjxpPjxiPlwiK3QrXCI6PC9iPjwvaT5cIjp0K1wiOlwiLG99fSx7a2V5OlwiX21ha2VEcm9wZG93blwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpO28uY2xhc3NOYW1lPVwidmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1zZWxlY3RcIjt2YXIgbj0wO3ZvaWQgMCE9PWUmJi0xIT09dC5pbmRleE9mKGUpJiYobj10LmluZGV4T2YoZSkpO2Zvcih2YXIgcz0wO3M8dC5sZW5ndGg7cysrKXt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO3IudmFsdWU9dFtzXSxzPT09biYmKHIuc2VsZWN0ZWQ9XCJzZWxlY3RlZFwiKSxyLmlubmVySFRNTD10W3NdLG8uYXBwZW5kQ2hpbGQocil9dmFyIGE9dGhpcztvLm9uY2hhbmdlPWZ1bmN0aW9uKCl7YS5fdXBkYXRlKHRoaXMudmFsdWUsaSl9O3ZhciBoPXRoaXMuX21ha2VMYWJlbChpW2kubGVuZ3RoLTFdLGkpO3RoaXMuX21ha2VJdGVtKGksaCxvKX19LHtrZXk6XCJfbWFrZVJhbmdlXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPXRbMF0sbj10WzFdLHM9dFsyXSxyPXRbM10sYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7YS5jbGFzc05hbWU9XCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLXJhbmdlXCI7dHJ5e2EudHlwZT1cInJhbmdlXCIsYS5taW49bixhLm1heD1zfWNhdGNoKHQpe31hLnN0ZXA9cjt2YXIgaD1cIlwiLGQ9MDtpZih2b2lkIDAhPT1lKXtlPDAmJjEuMiplPG4/KGEubWluPU1hdGguY2VpbCgxLjIqZSksZD1hLm1pbixoPVwicmFuZ2UgaW5jcmVhc2VkXCIpOmUvMS4yPG4mJihhLm1pbj1NYXRoLmNlaWwoZS8xLjIpLGQ9YS5taW4saD1cInJhbmdlIGluY3JlYXNlZFwiKSwxLjIqZT5zJiYxIT09cyYmKGEubWF4PU1hdGguY2VpbCgxLjIqZSksZD1hLm1heCxoPVwicmFuZ2UgaW5jcmVhc2VkXCIpLGEudmFsdWU9ZX1lbHNlIGEudmFsdWU9bzt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7bC5jbGFzc05hbWU9XCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLXJhbmdlaW5wdXRcIixsLnZhbHVlPWEudmFsdWU7dmFyIHU9dGhpczthLm9uY2hhbmdlPWZ1bmN0aW9uKCl7bC52YWx1ZT10aGlzLnZhbHVlLHUuX3VwZGF0ZShOdW1iZXIodGhpcy52YWx1ZSksaSl9LGEub25pbnB1dD1mdW5jdGlvbigpe2wudmFsdWU9dGhpcy52YWx1ZX07dmFyIGM9dGhpcy5fbWFrZUxhYmVsKGlbaS5sZW5ndGgtMV0saSkscD10aGlzLl9tYWtlSXRlbShpLGMsYSxsKTtcIlwiIT09aCYmdGhpcy5wb3B1cEhpc3RvcnlbcF0hPT1kJiYodGhpcy5wb3B1cEhpc3RvcnlbcF09ZCx0aGlzLl9zZXR1cFBvcHVwKGgscCkpfX0se2tleTpcIl9zZXR1cFBvcHVwXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzO2lmKCEwPT09dGhpcy5pbml0aWFsaXplZCYmITA9PT10aGlzLmFsbG93Q3JlYXRpb24mJnRoaXMucG9wdXBDb3VudGVyPHRoaXMucG9wdXBMaW1pdCl7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtvLmlkPVwidmlzLWNvbmZpZ3VyYXRpb24tcG9wdXBcIixvLmNsYXNzTmFtZT1cInZpcy1jb25maWd1cmF0aW9uLXBvcHVwXCIsby5pbm5lckhUTUw9dCxvLm9uY2xpY2s9ZnVuY3Rpb24oKXtpLl9yZW1vdmVQb3B1cCgpfSx0aGlzLnBvcHVwQ291bnRlcis9MSx0aGlzLnBvcHVwRGl2PXtodG1sOm8saW5kZXg6ZX19fX0se2tleTpcIl9yZW1vdmVQb3B1cFwiLHZhbHVlOmZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5wb3B1cERpdi5odG1sJiYodGhpcy5wb3B1cERpdi5odG1sLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wb3B1cERpdi5odG1sKSxjbGVhclRpbWVvdXQodGhpcy5wb3B1cERpdi5oaWRlVGltZW91dCksY2xlYXJUaW1lb3V0KHRoaXMucG9wdXBEaXYuZGVsZXRlVGltZW91dCksdGhpcy5wb3B1cERpdj17fSl9fSx7a2V5OlwiX3Nob3dQb3B1cElmTmVlZGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKHZvaWQgMCE9PXRoaXMucG9wdXBEaXYuaHRtbCl7dmFyIGU9dGhpcy5kb21FbGVtZW50c1t0aGlzLnBvcHVwRGl2LmluZGV4XSxpPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy5wb3B1cERpdi5odG1sLnN0eWxlLmxlZnQ9aS5sZWZ0K1wicHhcIix0aGlzLnBvcHVwRGl2Lmh0bWwuc3R5bGUudG9wPWkudG9wLTMwK1wicHhcIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMucG9wdXBEaXYuaHRtbCksdGhpcy5wb3B1cERpdi5oaWRlVGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5wb3B1cERpdi5odG1sLnN0eWxlLm9wYWNpdHk9MH0sMTUwMCksdGhpcy5wb3B1cERpdi5kZWxldGVUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0Ll9yZW1vdmVQb3B1cCgpfSwxODAwKX19fSx7a2V5OlwiX21ha2VDaGVja2JveFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7by50eXBlPVwiY2hlY2tib3hcIixvLmNsYXNzTmFtZT1cInZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctY2hlY2tib3hcIixvLmNoZWNrZWQ9dCx2b2lkIDAhPT1lJiYoby5jaGVja2VkPWUsZSE9PXQmJihcIm9iamVjdFwiPT09KHZvaWQgMD09PXQ/XCJ1bmRlZmluZWRcIjooMCxhLmRlZmF1bHQpKHQpKT9lIT09dC5lbmFibGVkJiZ0aGlzLmNoYW5nZWRPcHRpb25zLnB1c2goe3BhdGg6aSx2YWx1ZTplfSk6dGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKHtwYXRoOmksdmFsdWU6ZX0pKSk7dmFyIG49dGhpcztvLm9uY2hhbmdlPWZ1bmN0aW9uKCl7bi5fdXBkYXRlKHRoaXMuY2hlY2tlZCxpKX07dmFyIHM9dGhpcy5fbWFrZUxhYmVsKGlbaS5sZW5ndGgtMV0saSk7dGhpcy5fbWFrZUl0ZW0oaSxzLG8pfX0se2tleTpcIl9tYWtl
21167VGV4dElucHV0XCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtvLnR5cGU9XCJ0ZXh0XCIsby5jbGFzc05hbWU9XCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLXRleHRcIixvLnZhbHVlPWUsZSE9PXQmJnRoaXMuY2hhbmdlZE9wdGlvbnMucHVzaCh7cGF0aDppLHZhbHVlOmV9KTt2YXIgbj10aGlzO28ub25jaGFuZ2U9ZnVuY3Rpb24oKXtuLl91cGRhdGUodGhpcy52YWx1ZSxpKX07dmFyIHM9dGhpcy5fbWFrZUxhYmVsKGlbaS5sZW5ndGgtMV0saSk7dGhpcy5fbWFrZUl0ZW0oaSxzLG8pfX0se2tleTpcIl9tYWtlQ29sb3JGaWVsZFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10aGlzLG49dFsxXSxzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7ZT12b2lkIDA9PT1lP246ZSxcIm5vbmVcIiE9PWU/KHMuY2xhc3NOYW1lPVwidmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1jb2xvckJsb2NrXCIscy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9ZSk6cy5jbGFzc05hbWU9XCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWNvbG9yQmxvY2sgbm9uZVwiLGU9dm9pZCAwPT09ZT9uOmUscy5vbmNsaWNrPWZ1bmN0aW9uKCl7by5fc2hvd0NvbG9yUGlja2VyKGUscyxpKX07dmFyIHI9dGhpcy5fbWFrZUxhYmVsKGlbaS5sZW5ndGgtMV0saSk7dGhpcy5fbWFrZUl0ZW0oaSxyLHMpfX0se2tleTpcIl9zaG93Q29sb3JQaWNrZXJcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89dGhpcztlLm9uY2xpY2s9ZnVuY3Rpb24oKXt9LHRoaXMuY29sb3JQaWNrZXIuaW5zZXJ0VG8oZSksdGhpcy5jb2xvclBpY2tlci5zaG93KCksdGhpcy5jb2xvclBpY2tlci5zZXRDb2xvcih0KSx0aGlzLmNvbG9yUGlja2VyLnNldFVwZGF0ZUNhbGxiYWNrKGZ1bmN0aW9uKHQpe3ZhciBuPVwicmdiYShcIit0LnIrXCIsXCIrdC5nK1wiLFwiK3QuYitcIixcIit0LmErXCIpXCI7ZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9bixvLl91cGRhdGUobixpKX0pLHRoaXMuY29sb3JQaWNrZXIuc2V0Q2xvc2VDYWxsYmFjayhmdW5jdGlvbigpe2Uub25jbGljaz1mdW5jdGlvbigpe28uX3Nob3dDb2xvclBpY2tlcih0LGUsaSl9fSl9fSx7a2V5OlwiX2hhbmRsZU9iamVjdFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpbXSxpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0sbz0hMSxuPXRoaXMub3B0aW9ucy5maWx0ZXIscz0hMTtmb3IodmFyIHIgaW4gdClpZih0Lmhhc093blByb3BlcnR5KHIpKXtvPSEwO3ZhciBhPXRbcl0saD1jLmNvcHlBbmRFeHRlbmRBcnJheShlLHIpO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIG4mJiExPT09KG89bihyLGUpKSYmIShhIGluc3RhbmNlb2YgQXJyYXkpJiZcInN0cmluZ1wiIT10eXBlb2YgYSYmXCJib29sZWFuXCIhPXR5cGVvZiBhJiZhIGluc3RhbmNlb2YgT2JqZWN0JiYodGhpcy5hbGxvd0NyZWF0aW9uPSExLG89dGhpcy5faGFuZGxlT2JqZWN0KGEsaCwhMCksdGhpcy5hbGxvd0NyZWF0aW9uPSExPT09aSksITEhPT1vKXtzPSEwO3ZhciBkPXRoaXMuX2dldFZhbHVlKGgpO2lmKGEgaW5zdGFuY2VvZiBBcnJheSl0aGlzLl9oYW5kbGVBcnJheShhLGQsaCk7ZWxzZSBpZihcInN0cmluZ1wiPT10eXBlb2YgYSl0aGlzLl9tYWtlVGV4dElucHV0KGEsZCxoKTtlbHNlIGlmKFwiYm9vbGVhblwiPT10eXBlb2YgYSl0aGlzLl9tYWtlQ2hlY2tib3goYSxkLGgpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIE9iamVjdCl7dmFyIGw9ITA7aWYoLTEhPT1lLmluZGV4T2YoXCJwaHlzaWNzXCIpJiZ0aGlzLm1vZHVsZU9wdGlvbnMucGh5c2ljcy5zb2x2ZXIhPT1yJiYobD0hMSksITA9PT1sKWlmKHZvaWQgMCE9PWEuZW5hYmxlZCl7dmFyIHU9Yy5jb3B5QW5kRXh0ZW5kQXJyYXkoaCxcImVuYWJsZWRcIikscD10aGlzLl9nZXRWYWx1ZSh1KTtpZighMD09PXApe3ZhciBmPXRoaXMuX21ha2VMYWJlbChyLGgsITApO3RoaXMuX21ha2VJdGVtKGgsZikscz10aGlzLl9oYW5kbGVPYmplY3QoYSxoKXx8c31lbHNlIHRoaXMuX21ha2VDaGVja2JveChhLHAsaCl9ZWxzZXt2YXIgbT10aGlzLl9tYWtlTGFiZWwocixoLCEwKTt0aGlzLl9tYWtlSXRlbShoLG0pLHM9dGhpcy5faGFuZGxlT2JqZWN0KGEsaCl8fHN9fWVsc2UgY29uc29sZS5lcnJvcihcImRvbnQga25vdyBob3cgdG8gaGFuZGxlXCIsYSxyLGgpfX1yZXR1cm4gc319LHtrZXk6XCJfaGFuZGxlQXJyYXlcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7XCJzdHJpbmdcIj09dHlwZW9mIHRbMF0mJlwiY29sb3JcIj09PXRbMF0/KHRoaXMuX21ha2VDb2xvckZpZWxkKHQsZSxpKSx0WzFdIT09ZSYmdGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKHtwYXRoOmksdmFsdWU6ZX0pKTpcInN0cmluZ1wiPT10eXBlb2YgdFswXT8odGhpcy5fbWFrZURyb3Bkb3duKHQsZSxpKSx0WzBdIT09ZSYmdGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKHtwYXRoOmksdmFsdWU6ZX0pKTpcIm51bWJlclwiPT10eXBlb2YgdFswXSYmKHRoaXMuX21ha2VSYW5nZSh0LGUsaSksdFswXSE9PWUmJnRoaXMuY2hhbmdlZE9wdGlvbnMucHVzaCh7cGF0aDppLHZhbHVlOk51bWJlcihlKX0pKX19LHtrZXk6XCJfdXBkYXRlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9jb25zdHJ1Y3RPcHRpb25zKHQsZSk7dGhpcy5wYXJlbnQuYm9keSYmdGhpcy5wYXJlbnQuYm9keS5lbWl0dGVyJiZ0aGlzLnBhcmVudC5ib2R5LmVtaXR0ZXIuZW1pdCYmdGhpcy5wYXJlbnQuYm9keS5lbWl0dGVyLmVtaXQoXCJjb25maWdDaGFuZ2VcIixpKSx0aGlzLmluaXRpYWxpemVkPSEwLHRoaXMucGFyZW50LnNldE9wdGlvbnMoaSl9fSx7a2V5OlwiX2NvbnN0cnVjdE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fSxvPWk7dD1cInRydWVcIj09PXR8fHQsdD1cImZhbHNlXCIhPT10JiZ0O2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKVwiZ2xvYmFsXCIhPT1lW25dJiYodm9p
21167ZCAwPT09b1tlW25dXSYmKG9bZVtuXV09e30pLG4hPT1lLmxlbmd0aC0xP289b1tlW25dXTpvW2Vbbl1dPXQpO3JldHVybiBpfX0se2tleTpcIl9wcmludE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0T3B0aW9ucygpO3RoaXMub3B0aW9uc0NvbnRhaW5lci5pbm5lckhUTUw9XCI8cHJlPnZhciBvcHRpb25zID0gXCIrKDAscy5kZWZhdWx0KSh0LG51bGwsMikrXCI8L3ByZT5cIn19LHtrZXk6XCJnZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9e30sZT0wO2U8dGhpcy5jaGFuZ2VkT3B0aW9ucy5sZW5ndGg7ZSsrKXRoaXMuX2NvbnN0cnVjdE9wdGlvbnModGhpcy5jaGFuZ2VkT3B0aW9uc1tlXS52YWx1ZSx0aGlzLmNoYW5nZWRPcHRpb25zW2VdLnBhdGgsdCk7cmV0dXJuIHR9fV0pLHR9KCk7ZS5kZWZhdWx0PWZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7fWZ1bmN0aW9uIG4odCxlKXtyZXR1cm4gZT12b2lkIDA9PT1lP3t9OmUse3N0eWxlOmUuc3R5bGV8fHQub3B0aW9ucy5kcmF3UG9pbnRzLnN0eWxlLFxuICAgIHN0eWxlczplLnN0eWxlc3x8dC5vcHRpb25zLmRyYXdQb2ludHMuc3R5bGVzLHNpemU6ZS5zaXplfHx0Lm9wdGlvbnMuZHJhd1BvaW50cy5zaXplLGNsYXNzTmFtZTplLmNsYXNzTmFtZXx8dC5jbGFzc05hbWV9fWZ1bmN0aW9uIHModCxlKXt2YXIgaT12b2lkIDA7cmV0dXJuIHQub3B0aW9ucyYmdC5vcHRpb25zLmRyYXdQb2ludHMmJnQub3B0aW9ucy5kcmF3UG9pbnRzLm9uUmVuZGVyJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiB0Lm9wdGlvbnMuZHJhd1BvaW50cy5vblJlbmRlciYmKGk9dC5vcHRpb25zLmRyYXdQb2ludHMub25SZW5kZXIpLGUuZ3JvdXAub3B0aW9ucyYmZS5ncm91cC5vcHRpb25zLmRyYXdQb2ludHMmJmUuZ3JvdXAub3B0aW9ucy5kcmF3UG9pbnRzLm9uUmVuZGVyJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLmdyb3VwLm9wdGlvbnMuZHJhd1BvaW50cy5vblJlbmRlciYmKGk9ZS5ncm91cC5vcHRpb25zLmRyYXdQb2ludHMub25SZW5kZXIpLGl9dmFyIHI9aSg2KSxhPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0ociksaD1pKDE0KTtvLmRyYXc9ZnVuY3Rpb24odCxlLGksbyl7bz1vfHwwO2Zvcih2YXIgcj1zKGksZSksZD0wO2Q8dC5sZW5ndGg7ZCsrKWlmKHIpe3ZhciBsPXIodFtkXSxlKTshMCE9PWwmJlwib2JqZWN0XCIhPT0odm9pZCAwPT09bD9cInVuZGVmaW5lZFwiOigwLGEuZGVmYXVsdCkobCkpfHxoLmRyYXdQb2ludCh0W2RdLnNjcmVlbl94K28sdFtkXS5zY3JlZW5feSxuKGUsbCksaS5zdmdFbGVtZW50cyxpLnN2Zyx0W2RdLmxhYmVsKX1lbHNlIGguZHJhd1BvaW50KHRbZF0uc2NyZWVuX3grbyx0W2RdLnNjcmVlbl95LG4oZSksaS5zdmdFbGVtZW50cyxpLnN2Zyx0W2RdLmxhYmVsKX0sby5kcmF3SWNvbj1mdW5jdGlvbih0LGUsaSxvLHMscil7dmFyIGE9LjUqcyxkPWguZ2V0U1ZHRWxlbWVudChcInJlY3RcIixyLnN2Z0VsZW1lbnRzLHIuc3ZnKTtkLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ4XCIsZSksZC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwieVwiLGktYSksZC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwid2lkdGhcIixvKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJoZWlnaHRcIiwyKmEpLGQuc2V0QXR0cmlidXRlTlMobnVsbCxcImNsYXNzXCIsXCJ2aXMtb3V0bGluZVwiKSxoLmRyYXdQb2ludChlKy41Km8saSxuKHQpLHIuc3ZnRWxlbWVudHMsci5zdmcpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDIzKSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXsoMCxhLmRlZmF1bHQpKHRoaXMsZSk7dmFyIG49KDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSk7cmV0dXJuIG4ubGFiZWxPZmZzZXQ9MCxuLnNlbGVjdGVkPSExLG59cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dGhpcy5vcHRpb25zPXQsdm9pZCAwPT09ZSYmdm9pZCAwPT09aXx8dGhpcy5zZXRJbWFnZXMoZSxpKX19LHtrZXk6XCJzZXRJbWFnZXNcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2UmJnRoaXMuc2VsZWN0ZWQ/KHRoaXMuaW1hZ2VPYmo9ZSx0aGlzLmltYWdlT2JqQWx0PXQpOih0aGlzLmltYWdlT2JqPXQsdGhpcy5pbWFnZU9iakFsdD1lKX19LHtrZXk6XCJzd2l0Y2hJbWFnZXNcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10JiYhdGhpcy5zZWxlY3RlZHx8IXQmJnRoaXMuc2VsZWN0ZWQ7aWYodGhpcy5zZWxlY3RlZD10LHZvaWQgMCE9PXRoaXMuaW1hZ2VPYmpBbHQmJmUpe3ZhciBpPXRoaXMuaW1hZ2VPYmo7dGhpcy5pbWFnZU9iaj10aGlzLmltYWdlT2JqQWx0LHRoaXMuaW1hZ2VPYmpBbHQ9aX19fSx7a2V5OlwiX3Jlc2l6ZUltYWdlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxlO2lmKCExPT09dGhpcy5vcHRpb25zLnNoYXBlUHJvcGVydGllcy51c2VJbWFnZVNpemUpe3ZhciBpPTEsbz0xO3RoaXMuaW1hZ2VPYmoud2lkdGgmJnRoaXMuaW1hZ2VPYmouaGVpZ2h0JiYodGhpcy5pbWFnZU9iai53aWR0aD50aGlzLmltYWdlT2JqLmhlaWdodD9pPXRoaXMuaW1hZ2VPYmoud2lkdGgvdGhpcy5pbWFnZU9iai5oZWlnaHQ6bz10aGlzLmltYWdlT2JqLmhlaWdodC90aGlzLmltYWdlT2JqLndpZHRoKSx0PTIqdGhpcy5vcHRpb25zLnNpemUqaSxlPTIqdGhpcy5vcHRpb25zLnNpemUqb31lbHNlIHQ9dGhpcy5pbWFnZU9iai53aWR0aCxlPXRoaXMuaW1hZ2VPYmouaGVpZ2h0O3RoaXMud2lkdGg9dCx0aGlzLmhlaWdodD1lLHRoaXMucmFkaXVzPS41KnRoaXMud2lkdGh9fSx7a2V5OlwiX2RyYXdSYXdDaXJjbGVcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXt0aGlzLmluaXRDb250ZXh0Rm9yRHJhdyh0LG8pLHQuY2lyY2xlKGUsaSxvLnNpemUpLHRoaXMucGVyZm9ybUZpbGwodCxvKX19LHtrZXk6XCJfZHJhd0ltYWdlQXRQb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoMCE9dGhpcy5pbWFnZU9iai53aWR0aCl7dC5nbG9iYWxBbHBoYT0xLHRoaXMuZW5hYmxlU2hhZG93KHQsZSk7dmFyIGk9MTshMD09PXRoaXMub3B0aW9ucy5zaGFwZVByb3BlcnRpZXMuaW50ZXJwb2xhdGlvbiYmKGk9dGhpcy5pbWFnZU9iai53aWR0aC90aGlzLndpZHRoL3RoaXMuYm9keS52aWV3LnNjYWxlKSx0aGlzLmltYWdlT2JqLmRyYXdJbWFnZUF0UG9zaXRpb24odCxpLHRoaXMubGVmdCx0aGlzLnRvcCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSx0aGlzLmRpc2FibGVTaGFkb3codCxlKX19fSx7a2V5OlwiX2RyYXdJbWFnZUxhYmVsXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt2YXIgcyxyPTA7aWYodm9pZCAwIT09dGhpcy5oZWlnaHQpe3I9LjUqdGhpcy5oZWlnaHQ7dmFyIGE9dGhpcy5sYWJlbE1vZHVsZS5nZXRUZXh0U2l6ZSh0LG8sbik7YS5saW5lQ291bnQ+PTEmJihyKz1hLmhlaWdodC8yKX1zPWkrcix0aGlzLm9wdGlvbnMubGFiZWwmJih0aGlzLmxhYmVsT2Zmc2V0PXIpLHRoaXMubGFiZWxNb2R1bGUuZHJhdyh0LGUscyxvLG4sXCJoYW5naW5nXCIpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgxOSkscz1vKG4pLHI9aSg2KSxhPW8ociksaD1pKDI5KSxkPW8oaCksbD1pKDApLHU9byhsKSxjPWkoMSkscD1vKGMpLGY9aSgyKSxtPWkoMTE3KS5kZWZhdWx0LHY9aSg0OCkuZGVmYXVsdCxnPWkoMjE1KS5kZWZhdWx0LHk9aSgyMTcpLmRlZmF1bHQsYj1pKDIxOCkuZGVmYXVsdCxfPWkoMjE5KS5kZWZhdWx0LHc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSxvLG4pe2lmKCgwLHUuZGVmYXVsdCkodGhpcyx0KSx2b2lkIDA9PT1pKXRocm93IG5ldyBFcnJvcihcIk5vIGJvZHkgcHJvdmlkZWRcIik7dGhpcy5vcHRpb25zPWYuYnJpZGdlT2JqZWN0KG8pLHRoaXMuZ2xvYmFsT3B0aW9ucz1vLHRoaXMuZGVmYXVsdE9wdGlvbnM9bix0aGlzLmJvZHk9aSx0aGlzLmlkPXZvaWQgMCx0aGlzLmZyb21JZD12b2lkIDAsdGhpcy50b0lkPXZvaWQgMCx0aGlzLnNlbGVjdGVkPSExLHRoaXMuaG92ZXI9ITEsdGhpcy5sYWJlbERpcnR5PSEwLHRoaXMuYmFzZVdpZHRoPXRoaXMub3B0aW9ucy53aWR0aCx0aGlzLmJhc2VGb250U2l6ZT10aGlzLm9wdGlvbnMuZm9udC5zaXplLHRoaXMuZnJvbT12b2lkIDAsdGhpcy50bz12b2lkIDAsdGhpcy5lZGdlVHlwZT12b2lkIDAsdGhpcy5jb25uZWN0ZWQ9ITEsdGhpcy5sYWJlbE1vZHVsZT1uZXcgbSh0aGlzLmJvZHksdGhpcy5vcHRpb25zLCEwKSx0aGlzLnNldE9wdGlvbnMoZSl9cmV0dXJuKDAscC5kZWZhdWx0KSh0LFt7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKGUpe3QucGFyc2VPcHRpb25zKHRoaXMub3B0aW9ucyxlLCEwLHRoaXMuZ2xvYmFsT3B0aW9ucyksdm9pZCAwIT09ZS5pZCYmKHRoaXMuaWQ9ZS5pZCksdm9pZCAwIT09ZS5mcm9tJiYodGhpcy5mcm9tSWQ9ZS5mcm9tKSx2b2lkIDAhPT1lLnRvJiYodGhpcy50b0lkPWUudG8pLHZvaWQgMCE9PWUudGl0bGUmJih0aGlzLnRpdGxlPWUudGl0bGUpLHZvaWQgMCE9PWUudmFsdWUmJihlLnZhbHVlPXBhcnNlRmxvYXQoZS52YWx1ZSkpO3ZhciBpPVtlLHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zXTt0aGlzLmNob29zZXI9di5jaG9vc2lmeShcImVkZ2VcIixpKSx0aGlzLnVwZGF0ZUxhYmVsTW9kdWxlKGUpO3ZhciBvPXRoaXMudXBkYXRlRWRnZVR5cGUoKTtyZXR1cm4gdGhpcy5fc2V0SW50ZXJhY3Rpb25XaWR0aHMoKSx0aGlzLmNvbm5lY3QoKSx2b2lkIDA9PT1lLmhpZGRlbiYmdm9pZCAwPT09ZS5waHlzaWNzfHwobz0hMCksb319fSx7a2V5OlwiZ2V0Rm9ybWF0dGluZ1ZhbHVlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9ITA9PT10aGlzLm9wdGlvbnMuYXJyb3dzLnRvfHwhMD09PXRoaXMub3B0aW9ucy5hcnJvd3MudG8uZW5hYmxlZCxlPSEwPT09dGhpcy5vcHRpb25zLmFycm93cy5mcm9tfHwhMD09PXRoaXMub3B0aW9ucy5hcnJvd3MuZnJvbS5lbmFibGVkLGk9ITA9PT10aGlzLm9wdGlvbnMuYXJyb3dzLm1pZGRsZXx8ITA9PT10aGlzLm9wdGlvbnMuYXJyb3dzLm1pZGRsZS5lbmFibGVkLG89dGhpcy5vcHRpb25zLmNvbG9yLmluaGVyaXQsbj17dG9BcnJvdzp0LHRvQXJyb3dTY2FsZTp0aGlzLm9wdGlvbnMuYXJyb3dzLnRvLnNjYWxlRmFjdG9yLHRvQXJyb3dUeXBlOnRoaXMub3B0aW9ucy5hcnJvd3MudG8udHlwZSxtaWRkbGVBcnJvdzppLG1pZGRsZUFycm93U2NhbGU6dGhpcy5vcHRpb25zLmFycm93cy5taWRkbGUuc2NhbGVGYWN0b3IsbWlkZGxlQXJyb3dUeXBlOnRoaXMub3B0aW9ucy5hcnJvd3MubWlkZGxlLnR5cGUsZnJvbUFycm93OmUsZnJvbUFycm93U2NhbGU6dGhpcy5vcHRpb25zLmFycm93cy5mcm9tLnNjYWxlRmFjdG9yLGZyb21BcnJvd1R5cGU6dGhpcy5vcHRpb25zLmFycm93cy5mcm9tLnR5cGUsYXJyb3dTdHJpa2V0aHJvdWdoOnRoaXMub3B0aW9ucy5hcnJvd1N0cmlrZXRocm91Z2gsY29sb3I6bz92b2lkIDA6dGhpcy5vcHRpb25zLmNvbG9yLmNvbG9yLGluaGVyaXRzQ29sb3I6byxvcGFjaXR5OnRoaXMub3B0aW9ucy5jb2xvci5vcGFjaXR5LGhpZGRlbjp0aGlzLm9wdGlvbnMuaGl
21167kZGVuLGxlbmd0aDp0aGlzLm9wdGlvbnMubGVuZ3RoLHNoYWRvdzp0aGlzLm9wdGlvbnMuc2hhZG93LmVuYWJsZWQsc2hhZG93Q29sb3I6dGhpcy5vcHRpb25zLnNoYWRvdy5jb2xvcixzaGFkb3dTaXplOnRoaXMub3B0aW9ucy5zaGFkb3cuc2l6ZSxzaGFkb3dYOnRoaXMub3B0aW9ucy5zaGFkb3cueCxzaGFkb3dZOnRoaXMub3B0aW9ucy5zaGFkb3cueSxkYXNoZXM6dGhpcy5vcHRpb25zLmRhc2hlcyx3aWR0aDp0aGlzLm9wdGlvbnMud2lkdGh9O2lmKHRoaXMuc2VsZWN0ZWR8fHRoaXMuaG92ZXIpaWYoITA9PT10aGlzLmNob29zZXIpe2lmKHRoaXMuc2VsZWN0ZWQpe3ZhciBzPXRoaXMub3B0aW9ucy5zZWxlY3Rpb25XaWR0aDtcImZ1bmN0aW9uXCI9PXR5cGVvZiBzP24ud2lkdGg9cyhuLndpZHRoKTpcIm51bWJlclwiPT10eXBlb2YgcyYmKG4ud2lkdGgrPXMpLG4ud2lkdGg9TWF0aC5tYXgobi53aWR0aCwuMy90aGlzLmJvZHkudmlldy5zY2FsZSksbi5jb2xvcj10aGlzLm9wdGlvbnMuY29sb3IuaGlnaGxpZ2h0LG4uc2hhZG93PXRoaXMub3B0aW9ucy5zaGFkb3cuZW5hYmxlZH1lbHNlIGlmKHRoaXMuaG92ZXIpe3ZhciByPXRoaXMub3B0aW9ucy5ob3ZlcldpZHRoO1wiZnVuY3Rpb25cIj09dHlwZW9mIHI/bi53aWR0aD1yKG4ud2lkdGgpOlwibnVtYmVyXCI9PXR5cGVvZiByJiYobi53aWR0aCs9ciksbi53aWR0aD1NYXRoLm1heChuLndpZHRoLC4zL3RoaXMuYm9keS52aWV3LnNjYWxlKSxuLmNvbG9yPXRoaXMub3B0aW9ucy5jb2xvci5ob3ZlcixuLnNoYWRvdz10aGlzLm9wdGlvbnMuc2hhZG93LmVuYWJsZWR9fWVsc2VcImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLmNob29zZXImJih0aGlzLmNob29zZXIobix0aGlzLm9wdGlvbnMuaWQsdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyKSx2b2lkIDAhPT1uLmNvbG9yJiYobi5pbmhlcml0c0NvbG9yPSExKSwhMT09PW4uc2hhZG93JiYobi5zaGFkb3dDb2xvcj09PXRoaXMub3B0aW9ucy5zaGFkb3cuY29sb3ImJm4uc2hhZG93U2l6ZT09PXRoaXMub3B0aW9ucy5zaGFkb3cuc2l6ZSYmbi5zaGFkb3dYPT09dGhpcy5vcHRpb25zLnNoYWRvdy54JiZuLnNoYWRvd1k9PT10aGlzLm9wdGlvbnMuc2hhZG93Lnl8fChuLnNoYWRvdz0hMCkpKTtlbHNlIG4uc2hhZG93PXRoaXMub3B0aW9ucy5zaGFkb3cuZW5hYmxlZCxuLndpZHRoPU1hdGgubWF4KG4ud2lkdGgsLjMvdGhpcy5ib2R5LnZpZXcuc2NhbGUpO3JldHVybiBufX0se2tleTpcInVwZGF0ZUxhYmVsTW9kdWxlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9W3QsdGhpcy5vcHRpb25zLHRoaXMuZ2xvYmFsT3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zXTt0aGlzLmxhYmVsTW9kdWxlLnVwZGF0ZSh0aGlzLm9wdGlvbnMsZSksdm9pZCAwIT09dGhpcy5sYWJlbE1vZHVsZS5iYXNlU2l6ZSYmKHRoaXMuYmFzZUZvbnRTaXplPXRoaXMubGFiZWxNb2R1bGUuYmFzZVNpemUpfX0se2tleTpcInVwZGF0ZUVkZ2VUeXBlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuc21vb3RoLGU9ITEsaT0hMDtyZXR1cm4gdm9pZCAwIT09dGhpcy5lZGdlVHlwZSYmKCh0aGlzLmVkZ2VUeXBlIGluc3RhbmNlb2YgeSYmITA9PT10LmVuYWJsZWQmJlwiZHluYW1pY1wiPT09dC50eXBlfHx0aGlzLmVkZ2VUeXBlIGluc3RhbmNlb2YgZyYmITA9PT10LmVuYWJsZWQmJlwiY3ViaWNCZXppZXJcIj09PXQudHlwZXx8dGhpcy5lZGdlVHlwZSBpbnN0YW5jZW9mIGImJiEwPT09dC5lbmFibGVkJiZcImR5bmFtaWNcIiE9PXQudHlwZSYmXCJjdWJpY0JlemllclwiIT09dC50eXBlfHx0aGlzLmVkZ2VUeXBlIGluc3RhbmNlb2YgXyYmITE9PT10LnR5cGUuZW5hYmxlZCkmJihpPSExKSwhMD09PWkmJihlPXRoaXMuY2xlYW51cCgpKSksITA9PT1pPyEwPT09dC5lbmFibGVkP1wiZHluYW1pY1wiPT09dC50eXBlPyhlPSEwLHRoaXMuZWRnZVR5cGU9bmV3IHkodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKSk6XCJjdWJpY0JlemllclwiPT09dC50eXBlP3RoaXMuZWRnZVR5cGU9bmV3IGcodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKTp0aGlzLmVkZ2VUeXBlPW5ldyBiKHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk6dGhpcy5lZGdlVHlwZT1uZXcgXyh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpOnRoaXMuZWRnZVR5cGUuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpLGV9fSx7a2V5OlwiY29ubmVjdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5kaXNjb25uZWN0KCksdGhpcy5mcm9tPXRoaXMuYm9keS5ub2Rlc1t0aGlzLmZyb21JZF18fHZvaWQgMCx0aGlzLnRvPXRoaXMuYm9keS5ub2Rlc1t0aGlzLnRvSWRdfHx2b2lkIDAsdGhpcy5jb25uZWN0ZWQ9dm9pZCAwIT09dGhpcy5mcm9tJiZ2b2lkIDAhPT10aGlzLnRvLCEwPT09dGhpcy5jb25uZWN0ZWQ/KHRoaXMuZnJvbS5hdHRhY2hFZGdlKHRoaXMpLHRoaXMudG8uYXR0YWNoRWRnZSh0aGlzKSk6KHRoaXMuZnJvbSYmdGhpcy5mcm9tLmRldGFjaEVkZ2UodGhpcyksdGhpcy50byYmdGhpcy50by5kZXRhY2hFZGdlKHRoaXMpKSx0aGlzLmVkZ2VUeXBlLmNvbm5lY3QoKX19LHtrZXk6XCJkaXNjb25uZWN0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmZyb20mJih0aGlzLmZyb20uZGV0YWNoRWRnZSh0aGlzKSx0aGlzLmZyb209dm9pZCAwKSx0aGlzLnRvJiYodGhpcy50by5kZXRhY2hFZGdlKHRoaXMpLHRoaXMudG89dm9pZCAwKSx0aGlzLmNvbm5lY3RlZD0hMX19LHtrZXk6XCJnZXRUaXRsZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGl0bGV9fSx7a2V5OlwiaXNTZWxlY3RlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0ZWR9fSx7a2V5OlwiZ2V0VmFsdWVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudmFsdWV9fSx7a2V5Olwic2V0VmFsdWVSYW5nZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtpZih2b2lkIDAhPT10aGlzLm9wdGlvbnMudmFsdWUpe3ZhciBvPXRoaXMub3B0aW9ucy5zY2FsaW5nLmN1c3RvbVNjYWxpbmdGdW5jdGlvbih0LGUsaSx0aGlzLm9wdGlvbnMudmFsdWUpLG49dGhpcy5vcHRpb25zLnNjYWxpbmcubWF4LXRoaXMub3B0aW9ucy5zY2FsaW5nLm1pbjtpZighMD09PXRoaXMub3B0aW9ucy5zY2FsaW5nLmxhYmVsLmVuYWJsZWQpe3ZhciBzPXRoaXMub3B0aW9ucy5zY2FsaW5nLmxhYmVsLm1heC10aGlzLm9wdGlvbnMuc2NhbGluZy5sYWJlbC5taW47dGhpcy5vcHRpb25zLmZvbnQuc2l6ZT10aGlzLm9wdGlvbnMuc2NhbGluZy5sYWJlbC5taW4rbypzfXRoaXMub3B0aW9ucy53aWR0aD10aGlzLm9wdGlvbnMuc2NhbGluZy5taW4rbypufWVsc2UgdGhpcy5vcHRpb25zLndpZHRoP
21167XRoaXMuYmFzZVdpZHRoLHRoaXMub3B0aW9ucy5mb250LnNpemU9dGhpcy5iYXNlRm9udFNpemU7dGhpcy5fc2V0SW50ZXJhY3Rpb25XaWR0aHMoKSx0aGlzLnVwZGF0ZUxhYmVsTW9kdWxlKCl9fSx7a2V5OlwiX3NldEludGVyYWN0aW9uV2lkdGhzXCIsdmFsdWU6ZnVuY3Rpb24oKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuaG92ZXJXaWR0aD90aGlzLmVkZ2VUeXBlLmhvdmVyV2lkdGg9dGhpcy5vcHRpb25zLmhvdmVyV2lkdGgodGhpcy5vcHRpb25zLndpZHRoKTp0aGlzLmVkZ2VUeXBlLmhvdmVyV2lkdGg9dGhpcy5vcHRpb25zLmhvdmVyV2lkdGgrdGhpcy5vcHRpb25zLndpZHRoLFwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMub3B0aW9ucy5zZWxlY3Rpb25XaWR0aD90aGlzLmVkZ2VUeXBlLnNlbGVjdGlvbldpZHRoPXRoaXMub3B0aW9ucy5zZWxlY3Rpb25XaWR0aCh0aGlzLm9wdGlvbnMud2lkdGgpOnRoaXMuZWRnZVR5cGUuc2VsZWN0aW9uV2lkdGg9dGhpcy5vcHRpb25zLnNlbGVjdGlvbldpZHRoK3RoaXMub3B0aW9ucy53aWR0aH19LHtrZXk6XCJkcmF3XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRGb3JtYXR0aW5nVmFsdWVzKCk7aWYoIWUuaGlkZGVuKXt2YXIgaT10aGlzLmVkZ2VUeXBlLmdldFZpYU5vZGUoKSxvPXt9O3RoaXMuZWRnZVR5cGUuZnJvbVBvaW50PXRoaXMuZWRnZVR5cGUuZnJvbSx0aGlzLmVkZ2VUeXBlLnRvUG9pbnQ9dGhpcy5lZGdlVHlwZS50byxlLmZyb21BcnJvdyYmKG8uZnJvbT10aGlzLmVkZ2VUeXBlLmdldEFycm93RGF0YSh0LFwiZnJvbVwiLGksdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyLGUpLCExPT09ZS5hcnJvd1N0cmlrZXRocm91Z2gmJih0aGlzLmVkZ2VUeXBlLmZyb21Qb2ludD1vLmZyb20uY29yZSkpLGUudG9BcnJvdyYmKG8udG89dGhpcy5lZGdlVHlwZS5nZXRBcnJvd0RhdGEodCxcInRvXCIsaSx0aGlzLnNlbGVjdGVkLHRoaXMuaG92ZXIsZSksITE9PT1lLmFycm93U3RyaWtldGhyb3VnaCYmKHRoaXMuZWRnZVR5cGUudG9Qb2ludD1vLnRvLmNvcmUpKSxlLm1pZGRsZUFycm93JiYoby5taWRkbGU9dGhpcy5lZGdlVHlwZS5nZXRBcnJvd0RhdGEodCxcIm1pZGRsZVwiLGksdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyLGUpKSx0aGlzLmVkZ2VUeXBlLmRyYXdMaW5lKHQsZSx0aGlzLnNlbGVjdGVkLHRoaXMuaG92ZXIsaSksdGhpcy5kcmF3QXJyb3dzKHQsbyxlKSx0aGlzLmRyYXdMYWJlbCh0LGkpfX19LHtrZXk6XCJkcmF3QXJyb3dzXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe2kuZnJvbUFycm93JiZ0aGlzLmVkZ2VUeXBlLmRyYXdBcnJvd0hlYWQodCxpLHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3ZlcixlLmZyb20pLGkubWlkZGxlQXJyb3cmJnRoaXMuZWRnZVR5cGUuZHJhd0Fycm93SGVhZCh0LGksdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyLGUubWlkZGxlKSxpLnRvQXJyb3cmJnRoaXMuZWRnZVR5cGUuZHJhd0Fycm93SGVhZCh0LGksdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyLGUudG8pfX0se2tleTpcImRyYXdMYWJlbFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09dGhpcy5vcHRpb25zLmxhYmVsKXt2YXIgaT10aGlzLmZyb20sbz10aGlzLnRvO2lmKHRoaXMubGFiZWxNb2R1bGUuZGlmZmVyZW50U3RhdGUodGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyKSYmdGhpcy5sYWJlbE1vZHVsZS5nZXRUZXh0U2l6ZSh0LHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3ZlciksaS5pZCE9by5pZCl7dGhpcy5sYWJlbE1vZHVsZS5wb2ludFRvU2VsZj0hMTt2YXIgbj10aGlzLmVkZ2VUeXBlLmdldFBvaW50KC41LGUpO3Quc2F2ZSgpO3ZhciBzPXRoaXMuX2dldFJvdGF0aW9uKHQpOzAhPXMuYW5nbGUmJih0LnRyYW5zbGF0ZShzLngscy55KSx0LnJvdGF0ZShzLmFuZ2xlKSksdGhpcy5sYWJlbE1vZHVsZS5kcmF3KHQsbi54LG4ueSx0aGlzLnNlbGVjdGVkLHRoaXMuaG92ZXIpLHQucmVzdG9yZSgpfWVsc2V7dGhpcy5sYWJlbE1vZHVsZS5wb2ludFRvU2VsZj0hMDt2YXIgcixhLGg9dGhpcy5vcHRpb25zLnNlbGZSZWZlcmVuY2VTaXplO2kuc2hhcGUud2lkdGg+aS5zaGFwZS5oZWlnaHQ/KHI9aS54Ky41Kmkuc2hhcGUud2lkdGgsYT1pLnktaCk6KHI9aS54K2gsYT1pLnktLjUqaS5zaGFwZS5oZWlnaHQpLG49dGhpcy5fcG9pbnRPbkNpcmNsZShyLGEsaCwuMTI1KSx0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCxuLngsbi55LHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3Zlcil9fX19LHtrZXk6XCJnZXRJdGVtc09uUG9pbnRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1bXTtpZih0aGlzLmxhYmVsTW9kdWxlLnZpc2libGUoKSl7dmFyIGk9dGhpcy5fZ2V0Um90YXRpb24oKTt2LnBvaW50SW5SZWN0KHRoaXMubGFiZWxNb2R1bGUuZ2V0U2l6ZSgpLHQsaSkmJmUucHVzaCh7ZWRnZUlkOnRoaXMuaWQsbGFiZWxJZDowfSl9dmFyIG89e2xlZnQ6dC54LHRvcDp0Lnl9O3JldHVybiB0aGlzLmlzT3ZlcmxhcHBpbmdXaXRoKG8pJiZlLnB1c2goe2VkZ2VJZDp0aGlzLmlkfSksZX19LHtrZXk6XCJpc092ZXJsYXBwaW5nV2l0aFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHRoaXMuY29ubmVjdGVkKXt2YXIgZT10aGlzLmZyb20ueCxpPXRoaXMuZnJvbS55LG89dGhpcy50by54LG49dGhpcy50by55LHM9dC5sZWZ0LHI9dC50b3A7cmV0dXJuIHRoaXMuZWRnZVR5cGUuZ2V0RGlzdGFuY2VUb0VkZ2UoZSxpLG8sbixzLHIpPDEwfXJldHVybiExfX0se2tleTpcIl9nZXRSb3RhdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZWRnZVR5cGUuZ2V0VmlhTm9kZSgpLGk9dGhpcy5lZGdlVHlwZS5nZXRQb2ludCguNSxlKTt2b2lkIDAhPT10JiZ0aGlzLmxhYmVsTW9kdWxlLmNhbGN1bGF0ZUxhYmVsU2l6ZSh0LHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3ZlcixpLngsaS55KTt2YXIgbz17eDppLngseTp0aGlzLmxhYmVsTW9kdWxlLnNpemUueUxpbmUsYW5nbGU6MH07aWYoIXRoaXMubGFiZWxNb2R1bGUudmlzaWJsZSgpKXJldHVybiBvO2lmKFwiaG9yaXpvbnRhbFwiPT09dGhpcy5vcHRpb25zLmZvbnQuYWxpZ24pcmV0dXJuIG87dmFyIG49dGhpcy5mcm9tLnktdGhpcy50by55LHM9dGhpcy5mcm9tLngtdGhpcy50by54LHI9TWF0aC5hdGFuMihuLHMpO3JldHVybihyPC0xJiZzPDB8fHI+MCYmczwwKSYmKHIrPU1hdGguUEkpLG8uYW5nbG
21167U9cixvfX0se2tleTpcIl9wb2ludE9uQ2lyY2xlXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49MipvKk1hdGguUEk7cmV0dXJue3g6dCtpKk1hdGguY29zKG4pLHk6ZS1pKk1hdGguc2luKG4pfX19LHtrZXk6XCJzZWxlY3RcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9ITB9fSx7a2V5OlwidW5zZWxlY3RcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9ITF9fSx7a2V5OlwiY2xlYW51cFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZVR5cGUuY2xlYW51cCgpfX0se2tleTpcInJlbW92ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jbGVhbnVwKCksdGhpcy5kaXNjb25uZWN0KCksZGVsZXRlIHRoaXMuYm9keS5lZGdlc1t0aGlzLmlkXX19LHtrZXk6XCJlbmRQb2ludHNWYWxpZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0aGlzLmZyb21JZF0mJnZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0aGlzLnRvSWRdfX1dLFt7a2V5OlwicGFyc2VPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLG89YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9LG49YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0mJmFyZ3VtZW50c1s0XSxyPVtcImFycm93U3RyaWtldGhyb3VnaFwiLFwiaWRcIixcImZyb21cIixcImhpZGRlblwiLFwiaG92ZXJXaWR0aFwiLFwibGFiZWxIaWdobGlnaHRCb2xkXCIsXCJsZW5ndGhcIixcImxpbmVcIixcIm9wYWNpdHlcIixcInBoeXNpY3NcIixcInNjYWxpbmdcIixcInNlbGVjdGlvbldpZHRoXCIsXCJzZWxmUmVmZXJlbmNlU2l6ZVwiLFwidG9cIixcInRpdGxlXCIsXCJ2YWx1ZVwiLFwid2lkdGhcIixcImZvbnRcIixcImNob3NlblwiLFwid2lkdGhDb25zdHJhaW50XCJdO2lmKGYuc2VsZWN0aXZlRGVlcEV4dGVuZChyLHQsZSxpKSx2LmlzVmFsaWRMYWJlbChlLmxhYmVsKT90LmxhYmVsPWUubGFiZWw6dC5sYWJlbD12b2lkIDAsZi5tZXJnZU9wdGlvbnModCxlLFwic21vb3RoXCIsbyksZi5tZXJnZU9wdGlvbnModCxlLFwic2hhZG93XCIsbyksdm9pZCAwIT09ZS5kYXNoZXMmJm51bGwhPT1lLmRhc2hlcz90LmRhc2hlcz1lLmRhc2hlczohMD09PWkmJm51bGw9PT1lLmRhc2hlcyYmKHQuZGFzaGVzPSgwLGQuZGVmYXVsdCkoby5kYXNoZXMpKSx2b2lkIDAhPT1lLnNjYWxpbmcmJm51bGwhPT1lLnNjYWxpbmc/KHZvaWQgMCE9PWUuc2NhbGluZy5taW4mJih0LnNjYWxpbmcubWluPWUuc2NhbGluZy5taW4pLHZvaWQgMCE9PWUuc2NhbGluZy5tYXgmJih0LnNjYWxpbmcubWF4PWUuc2NhbGluZy5tYXgpLGYubWVyZ2VPcHRpb25zKHQuc2NhbGluZyxlLnNjYWxpbmcsXCJsYWJlbFwiLG8uc2NhbGluZykpOiEwPT09aSYmbnVsbD09PWUuc2NhbGluZyYmKHQuc2NhbGluZz0oMCxkLmRlZmF1bHQpKG8uc2NhbGluZykpLHZvaWQgMCE9PWUuYXJyb3dzJiZudWxsIT09ZS5hcnJvd3MpaWYoXCJzdHJpbmdcIj09dHlwZW9mIGUuYXJyb3dzKXt2YXIgaD1lLmFycm93cy50b0xvd2VyQ2FzZSgpO3QuYXJyb3dzLnRvLmVuYWJsZWQ9LTEhPWguaW5kZXhPZihcInRvXCIpLHQuYXJyb3dzLm1pZGRsZS5lbmFibGVkPS0xIT1oLmluZGV4T2YoXCJtaWRkbGVcIiksdC5hcnJvd3MuZnJvbS5lbmFibGVkPS0xIT1oLmluZGV4T2YoXCJmcm9tXCIpfWVsc2V7aWYoXCJvYmplY3RcIiE9PSgwLGEuZGVmYXVsdCkoZS5hcnJvd3MpKXRocm93IG5ldyBFcnJvcihcIlRoZSBhcnJvdyBuZXdPcHRpb25zIGNhbiBvbmx5IGJlIGFuIG9iamVjdCBvciBhIHN0cmluZy4gUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24uIFlvdSB1c2VkOlwiKygwLHMuZGVmYXVsdCkoZS5hcnJvd3MpKTtmLm1lcmdlT3B0aW9ucyh0LmFycm93cyxlLmFycm93cyxcInRvXCIsby5hcnJvd3MpLGYubWVyZ2VPcHRpb25zKHQuYXJyb3dzLGUuYXJyb3dzLFwibWlkZGxlXCIsby5hcnJvd3MpLGYubWVyZ2VPcHRpb25zKHQuYXJyb3dzLGUuYXJyb3dzLFwiZnJvbVwiLG8uYXJyb3dzKX1lbHNlITA9PT1pJiZudWxsPT09ZS5hcnJvd3MmJih0LmFycm93cz0oMCxkLmRlZmF1bHQpKG8uYXJyb3dzKSk7aWYodm9pZCAwIT09ZS5jb2xvciYmbnVsbCE9PWUuY29sb3Ipe3ZhciBsPWUuY29sb3IsdT10LmNvbG9yO2lmKG4pZi5kZWVwRXh0ZW5kKHUsby5jb2xvciwhMSxpKTtlbHNlIGZvcih2YXIgYyBpbiB1KXUuaGFzT3duUHJvcGVydHkoYykmJmRlbGV0ZSB1W2NdO2lmKGYuaXNTdHJpbmcodSkpdS5jb2xvcj11LHUuaGlnaGxpZ2h0PXUsdS5ob3Zlcj11LHUuaW5oZXJpdD0hMSx2b2lkIDA9PT1sLm9wYWNpdHkmJih1Lm9wYWNpdHk9MSk7ZWxzZXt2YXIgcD0hMTt2b2lkIDAhPT1sLmNvbG9yJiYodS5jb2xvcj1sLmNvbG9yLHA9ITApLHZvaWQgMCE9PWwuaGlnaGxpZ2h0JiYodS5oaWdobGlnaHQ9bC5oaWdobGlnaHQscD0hMCksdm9pZCAwIT09bC5ob3ZlciYmKHUuaG92ZXI9bC5ob3ZlcixwPSEwKSx2b2lkIDAhPT1sLmluaGVyaXQmJih1LmluaGVyaXQ9bC5pbmhlcml0KSx2b2lkIDAhPT1sLm9wYWNpdHkmJih1Lm9wYWNpdHk9TWF0aC5taW4oMSxNYXRoLm1heCgwLGwub3BhY2l0eSkpKSwhMD09PXA/dS5pbmhlcml0PSExOnZvaWQgMD09PXUuaW5oZXJpdCYmKHUuaW5oZXJpdD1cImZyb21cIil9fWVsc2UhMD09PWkmJm51bGw9PT1lLmNvbG9yJiYodC5jb2xvcj1mLmJyaWRnZU9iamVjdChvLmNvbG9yKSk7ITA9PT1pJiZudWxsPT09ZS5mb250JiYodC5mb250PWYuYnJpZGdlT2JqZWN0KG8uZm9udCkpfX1dKSx0fSgpO2UuZGVmYXVsdD13fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoMTE4KSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcIl9maW5kQm9yZGVyUG9zaXRpb25CZXppZXJcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpLG8sbixzLHIsYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06dGhpcy5fZ2V0VmlhQ29vcmRpbmF0ZXMoKSxoPTAsZD0wLGw9MSx1PXRoaXMudG8sYz0hMTtmb3IodC5pZD09PXRoaXMuZnJvbS5pZCYmKHU9dGhpcy5mcm9tLGM9ITApO2Q8PWwmJmg8MTA7KXt2YXIgcD0uNSooZCtsKTtpZihpPXRoaXMuZ2V0UG9pbnQocCxhKSxvPU1hdGguYXRhbjIodS55LWkueSx1LngtaS54KSxuPXUuZGlzdGFuY2VUb0JvcmRlcihlLG8pLHM9TWF0aC5zcXJ0KE1hdGgucG93KGkueC11LngsMikrTWF0aC5wb3coaS55LXUueSwyKSkscj1uLXMsTWF0aC5hYnMocik8LjIpYnJlYWs7cjwwPyExPT09Yz9kPXA6bD1wOiExPT09Yz9sPXA6ZD1wLGgrK31yZXR1cm4gaS50PXAsaX19LHtrZXk6XCJfZ2V0RGlzdGFuY2VUb0JlemllckVkZ2VcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyxyKXt2YXIgYT0xZTksaD12b2lkIDAsZD12b2lkIDAsbD12b2lkIDAsdT12b2lkIDAsYz12b2lkIDAscD10LGY9ZTtmb3IoZD0xO2Q8MTA7ZCsrKWw9LjEqZCx1PU1hdGgucG93KDEtbCwyKSp0KzIqbCooMS1sKSpyLngrTWF0aC5wb3cobCwyKSppLGM9TWF0aC5wb3coMS1sLDIpKmUrMipsKigxLWwpKnIueStNYXRoLnBvdyhsLDIpKm8sZD4wJiYoaD10aGlzLl9nZXREaXN0YW5jZVRvTGluZShwLGYsdSxjLG4scyksYT1oPGE/aDphKSxwPXUsZj1jO3JldHVybiBhfX0se2tleTpcIl9iZXppZXJDdXJ2ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPXZvaWQgMCE9PWkmJnZvaWQgMCE9PWkueCxzPXZvaWQgMCE9PW8mJnZvaWQgMCE9PW8ueDt0LmJlZ2luUGF0aCgpLHQubW92ZVRvKHRoaXMuZnJvbVBvaW50LngsdGhpcy5mcm9tUG9pbnQueSksbiYmcz90LmJlemllckN1cnZlVG8oaS54LGkueSxvLngsby55LHRoaXMudG9Qb2ludC54LHRoaXMudG9Qb2ludC55KTpuP3QucXVhZHJhdGljQ3VydmVUbyhpLngsaS55LHRoaXMudG9Qb2ludC54LHRoaXMudG9Qb2ludC55KTp0LmxpbmVUbyh0aGlzLnRvUG9pbnQueCx0aGlzLnRvUG9pbnQueSksdGhpcy5lbmFibGVTaGFkb3codCxlKSx0LnN0cm9rZSgpLHRoaXMuZGlzYWJsZVNoYWRvdyh0LGUpfX0se2tleTpcImdldFZpYU5vZGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRWaWFDb29yZGluYXRlcygpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgwKSxzPW8obikscj1pKDEpLGE9byhyKSxoPWkoMiksZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXsoMCxzLmRlZmF1bHQpKHRoaXMsdCl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LG51bGwsW3trZXk6XCJnZXRSYW5nZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOltdLG89MWU5LG49LTFlOSxzPTFlOSxyPS0xZTk7aWYoaS5sZW5ndGg+MClmb3IodmFyIGE9MDthPGkubGVuZ3RoO2ErKyllPXRbaVthXV0scz5lLnNoYXBlLmJvdW5kaW5nQm94LmxlZnQmJihzPWUuc2hhcGUuYm91bmRpbmdCb3gubGVmdCkscjxlLnNoYXBlLmJvdW5kaW5nQm94LnJpZ2h0JiYocj1lLnNoYXBlLmJvdW5kaW5nQm94LnJpZ2h0KSxvPmUuc2hhcGUuYm91bmRpbmdCb3gudG9wJiYobz1lLnNoYXBlLmJvdW5kaW5nQm94LnRvcCksbjxlLnNoYXBlLmJvdW5kaW5nQm94LmJvdHRvbSYmKG49ZS5zaGFwZS5ib3VuZGluZ0JveC5ib3R0b20pO3JldHVybiAxZTk9PT1zJiYtMWU5PT09ciYmMWU5PT09byYmLTFlOT09PW4mJihvPTAsbj0wLHM9MCxyPTApLHttaW5YOnMsbWF4WDpyLG1pblk6byxtYXhZOm59fX0se2tleTpcImdldFJhbmdlQ29yZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOltdLG89MWU5LG49LTFlOSxzPTFlOSxyPS0xZTk7aWYoaS5sZW5ndGg+MClmb3IodmFyIGE9MDthPGkubGVuZ3RoO2ErKyllPXRbaVthXV0scz5lLngmJihzPWUueCkscjxlLngmJihyPWUueCksbz5lLnkmJihvPWUueSksbjxlLnkmJihuPWUueSk7cmV0dXJuIDFlOT09PXMmJi0xZTk9PT1yJiYxZTk9PT1vJiYtMWU5PT09biYmKG89MCxuPTAscz0wLHI9MCkse21pblg6cyxtYXhYOnIsbWluWTpvLG1heFk6bn19fSx7a2V5OlwiZmluZENlbnRlclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybnt4Oi41Kih0Lm1heFgrdC5taW5YKSx5Oi41Kih0Lm1heFkrdC5taW5ZKX19fSx7a2V5OlwiY2xvbmVPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT17fTtyZXR1cm4gdm9pZCAwPT09ZXx8XCJub2RlXCI9PT1lPyhoLmRlZXBFeHRlbmQoaSx0Lm9wdGlvbnMsITApLGkueD10LngsaS55PXQueSxpLmFtb3VudE9mQ29ubmVjdGlvbnM9dC5lZGdlcy5sZW5ndGgpOmguZGVlcEV4dGVuZChpLHQub3B0aW9ucywhMCksaX19XSksdH0oKTtlLmRlZmF1bHQ9ZH0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz17ZGVmYXVsdDppKDEyNCksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDUwKTt0LmV4cG9ydHM9T2JqZWN0KFwielwiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKT9PYmplY3Q6ZnVuY3Rpb24odCl7cmV0dXJuXCJTdHJpbmdcIj09byh0KT90LnNwbGl0KFwiXCIpOk9iamVjdCh0KX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDUyKSxuPWkoMTcpLHM9aSg4Mykscj1pKDI2KSxhPWkoMjIpLGg9aSgzMSksZD1pKDEyOSksbD1pKDU5KSx1PWkoODUpLGM9aSgxMykoXCJpdGVyYXRvclwiKSxwPSEoW10ua2V5cyYmXCJuZXh0XCJpbltdLmtleXMoKSksZj1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLGksbSx2LGcseSl7ZChpLGUsbSk7dmFyIGIsXyx3LHg9ZnVuY3Rpb24odCl7aWYoIXAmJnQgaW4gTSlyZXR1cm4gTVt0XTtzd2l0Y2godCl7Y2FzZVwia2V5c1wiOmNhc2VcInZhbHVlc1wiOnJldHVybi
21167BmdW5jdGlvbigpe3JldHVybiBuZXcgaSh0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGkodGhpcyx0KX19LGs9ZStcIiBJdGVyYXRvclwiLFM9XCJ2YWx1ZXNcIj09dixEPSExLE09dC5wcm90b3R5cGUsQz1NW2NdfHxNW1wiQEBpdGVyYXRvclwiXXx8diYmTVt2XSxPPUN8fHgodiksRT12P1M/eChcImVudHJpZXNcIik6Tzp2b2lkIDAsVD1cIkFycmF5XCI9PWU/TS5lbnRyaWVzfHxDOkM7aWYoVCYmKHc9dShULmNhbGwobmV3IHQpKSkhPT1PYmplY3QucHJvdG90eXBlJiZ3Lm5leHQmJihsKHcsaywhMCksb3x8YSh3LGMpfHxyKHcsYyxmKSksUyYmQyYmXCJ2YWx1ZXNcIiE9PUMubmFtZSYmKEQ9ITAsTz1mdW5jdGlvbigpe3JldHVybiBDLmNhbGwodGhpcyl9KSxvJiYheXx8IXAmJiFEJiZNW2NdfHxyKE0sYyxPKSxoW2VdPU8saFtrXT1mLHYpaWYoYj17dmFsdWVzOlM/Tzp4KFwidmFsdWVzXCIpLGtleXM6Zz9POngoXCJrZXlzXCIpLGVudHJpZXM6RX0seSlmb3IoXyBpbiBiKV8gaW4gTXx8cyhNLF8sYltfXSk7ZWxzZSBuKG4uUCtuLkYqKHB8fEQpLGUsYik7cmV0dXJuIGJ9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgxMjgpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsaSl7aWYobyh0KSx2b2lkIDA9PT1lKXJldHVybiB0O3N3aXRjaChpKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKGkpe3JldHVybiB0LmNhbGwoZSxpKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihpLG8pe3JldHVybiB0LmNhbGwoZSxpLG8pfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKGksbyxuKXtyZXR1cm4gdC5jYWxsKGUsaSxvLG4pfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz0haSgyMSkmJiFpKDI4KShmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoaSg4MikoXCJkaXZcIiksXCJhXCIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMzIpLG49aSgxOCkuZG9jdW1lbnQscz1vKG4pJiZvKG4uY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBzP24uY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9aSgyNil9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDIyKSxuPWkoMjUpLHM9aSgxMzEpKCExKSxyPWkoNTYpKFwiSUVfUFJPVE9cIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIGksYT1uKHQpLGg9MCxkPVtdO2ZvcihpIGluIGEpaSE9ciYmbyhhLGkpJiZkLnB1c2goaSk7Zm9yKDtlLmxlbmd0aD5oOylvKGEsaT1lW2grK10pJiYofnMoZCxpKXx8ZC5wdXNoKGkpKTtyZXR1cm4gZH19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDIyKSxuPWkoNDEpLHM9aSg1NikoXCJJRV9QUk9UT1wiKSxyPU9iamVjdC5wcm90b3R5cGU7dC5leHBvcnRzPU9iamVjdC5nZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bih0KSxvKHQscyk/dFtzXTpcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yJiZ0IGluc3RhbmNlb2YgdC5jb25zdHJ1Y3Rvcj90LmNvbnN0cnVjdG9yLnByb3RvdHlwZTp0IGluc3RhbmNlb2YgT2JqZWN0P3I6bnVsbH19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDUwKSxuPWkoMTMpKFwidG9TdHJpbmdUYWdcIikscz1cIkFyZ3VtZW50c1wiPT1vKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSkscj1mdW5jdGlvbih0LGUpe3RyeXtyZXR1cm4gdFtlXX1jYXRjaCh0KXt9fTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGUsaSxhO3JldHVybiB2b2lkIDA9PT10P1wiVW5kZWZpbmVkXCI6bnVsbD09PXQ/XCJOdWxsXCI6XCJzdHJpbmdcIj09dHlwZW9mKGk9cihlPU9iamVjdCh0KSxuKSk/aTpzP28oZSk6XCJPYmplY3RcIj09KGE9byhlKSkmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGUuY2FsbGVlP1wiQXJndW1lbnRzXCI6YX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDE3KSxuPWkoNykscz1pKDI4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgaT0obi5PYmplY3R8fHt9KVt0XXx8T2JqZWN0W3RdLHI9e307clt0XT1lKGkpLG8oby5TK28uRipzKGZ1bmN0aW9uKCl7aSgxKX0pLFwiT2JqZWN0XCIscil9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSg4NCksbj1pKDU4KS5jb25jYXQoXCJsZW5ndGhcIixcInByb3RvdHlwZVwiKTtlLmY9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fGZ1bmN0aW9uKHQpe3JldHVybiBvKHQsbil9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSg0Miksbj1pKDM5KSxzPWkoMjUpLHI9aSg1MyksYT1pKDIyKSxoPWkoODEpLGQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtlLmY9aSgyMSk/ZDpmdW5jdGlvbih0LGUpe2lmKHQ9cyh0KSxlPXIoZSwhMCksaCl0cnl7cmV0dXJuIGQodCxlKX1jYXRjaCh0KXt9aWYoYSh0LGUpKXJldHVybiBuKCFvLmYuY2FsbCh0LGUpLHRbZV0pfX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz17ZGVmYXVsdDppKDE2MiksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7dGhpcy54PXZvaWQgMCE9PXQ/dDowLHRoaXMueT12b2lkIDAhPT1lP2U6MH10LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBFcnJvcihcIk5vIGNvbnRhaW5lciBlbGVtZW50IGRlZmluZWRcIik7aWYodGhpcy5jb250YWluZXI9dCx0aGlzLnZpc2libGU9IWV8fHZvaWQgMD09ZS52aXNpYmxlfHxlLnZpc2libGUsdGhpcy52aXNpYmxlKXt0aGlzLmZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJESVZcIiksdGhpcy5mcmFtZS5zdHlsZS53aWR0aD1cIjEwMCVcIix0aGlzLmZyYW1lLnN0eWxlLnBvc2l0aW9uPVwicmVsYXRpdmVcIix0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmZyYW1lKSx0aGlzLmZyYW1lLnByZXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIklOUFVUXCIpLHRoaXMuZnJhbWUucHJldi50eXBlPVwiQlVUVE9OXCIsdGhpcy5mcmFtZS5wcmV2LnZhbHVlPVwiUHJldlwiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZS5wcmV2KSx0aGlzLmZyYW1lLnBsYXk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIklOUFVUXCIpLHRoaXMuZnJhbWUucGxheS50eX
21167BlPVwiQlVUVE9OXCIsdGhpcy5mcmFtZS5wbGF5LnZhbHVlPVwiUGxheVwiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZS5wbGF5KSx0aGlzLmZyYW1lLm5leHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIklOUFVUXCIpLHRoaXMuZnJhbWUubmV4dC50eXBlPVwiQlVUVE9OXCIsdGhpcy5mcmFtZS5uZXh0LnZhbHVlPVwiTmV4dFwiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZS5uZXh0KSx0aGlzLmZyYW1lLmJhcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiSU5QVVRcIiksdGhpcy5mcmFtZS5iYXIudHlwZT1cIkJVVFRPTlwiLHRoaXMuZnJhbWUuYmFyLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIix0aGlzLmZyYW1lLmJhci5zdHlsZS5ib3JkZXI9XCIxcHggc29saWQgcmVkXCIsdGhpcy5mcmFtZS5iYXIuc3R5bGUud2lkdGg9XCIxMDBweFwiLHRoaXMuZnJhbWUuYmFyLnN0eWxlLmhlaWdodD1cIjZweFwiLHRoaXMuZnJhbWUuYmFyLnN0eWxlLmJvcmRlclJhZGl1cz1cIjJweFwiLHRoaXMuZnJhbWUuYmFyLnN0eWxlLk1vekJvcmRlclJhZGl1cz1cIjJweFwiLHRoaXMuZnJhbWUuYmFyLnN0eWxlLmJvcmRlcj1cIjFweCBzb2xpZCAjN0Y3RjdGXCIsdGhpcy5mcmFtZS5iYXIuc3R5bGUuYmFja2dyb3VuZENvbG9yPVwiI0U1RTVFNVwiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZS5iYXIpLHRoaXMuZnJhbWUuc2xpZGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIklOUFVUXCIpLHRoaXMuZnJhbWUuc2xpZGUudHlwZT1cIkJVVFRPTlwiLHRoaXMuZnJhbWUuc2xpZGUuc3R5bGUubWFyZ2luPVwiMHB4XCIsdGhpcy5mcmFtZS5zbGlkZS52YWx1ZT1cIiBcIix0aGlzLmZyYW1lLnNsaWRlLnN0eWxlLnBvc2l0aW9uPVwicmVsYXRpdmVcIix0aGlzLmZyYW1lLnNsaWRlLnN0eWxlLmxlZnQ9XCItMTAwcHhcIix0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUuc2xpZGUpO3ZhciBpPXRoaXM7dGhpcy5mcmFtZS5zbGlkZS5vbm1vdXNlZG93bj1mdW5jdGlvbih0KXtpLl9vbk1vdXNlRG93bih0KX0sdGhpcy5mcmFtZS5wcmV2Lm9uY2xpY2s9ZnVuY3Rpb24odCl7aS5wcmV2KHQpfSx0aGlzLmZyYW1lLnBsYXkub25jbGljaz1mdW5jdGlvbih0KXtpLnRvZ2dsZVBsYXkodCl9LHRoaXMuZnJhbWUubmV4dC5vbmNsaWNrPWZ1bmN0aW9uKHQpe2kubmV4dCh0KX19dGhpcy5vbkNoYW5nZUNhbGxiYWNrPXZvaWQgMCx0aGlzLnZhbHVlcz1bXSx0aGlzLmluZGV4PXZvaWQgMCx0aGlzLnBsYXlUaW1lb3V0PXZvaWQgMCx0aGlzLnBsYXlJbnRlcnZhbD0xZTMsdGhpcy5wbGF5TG9vcD0hMH12YXIgbj1pKDIpO28ucHJvdG90eXBlLnByZXY9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldEluZGV4KCk7dD4wJiYodC0tLHRoaXMuc2V0SW5kZXgodCkpfSxvLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRJbmRleCgpO3Q8dGhpcy52YWx1ZXMubGVuZ3RoLTEmJih0KyssdGhpcy5zZXRJbmRleCh0KSl9LG8ucHJvdG90eXBlLnBsYXlOZXh0PWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IERhdGUsZT10aGlzLmdldEluZGV4KCk7ZTx0aGlzLnZhbHVlcy5sZW5ndGgtMT8oZSsrLHRoaXMuc2V0SW5kZXgoZSkpOnRoaXMucGxheUxvb3AmJihlPTAsdGhpcy5zZXRJbmRleChlKSk7dmFyIGk9bmV3IERhdGUsbz1pLXQsbj1NYXRoLm1heCh0aGlzLnBsYXlJbnRlcnZhbC1vLDApLHM9dGhpczt0aGlzLnBsYXlUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtzLnBsYXlOZXh0KCl9LG4pfSxvLnByb3RvdHlwZS50b2dnbGVQbGF5PWZ1bmN0aW9uKCl7dm9pZCAwPT09dGhpcy5wbGF5VGltZW91dD90aGlzLnBsYXkoKTp0aGlzLnN0b3AoKX0sby5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMucGxheVRpbWVvdXR8fCh0aGlzLnBsYXlOZXh0KCksdGhpcy5mcmFtZSYmKHRoaXMuZnJhbWUucGxheS52YWx1ZT1cIlN0b3BcIikpfSxvLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbCh0aGlzLnBsYXlUaW1lb3V0KSx0aGlzLnBsYXlUaW1lb3V0PXZvaWQgMCx0aGlzLmZyYW1lJiYodGhpcy5mcmFtZS5wbGF5LnZhbHVlPVwiUGxheVwiKX0sby5wcm90b3R5cGUuc2V0T25DaGFuZ2VDYWxsYmFjaz1mdW5jdGlvbih0KXt0aGlzLm9uQ2hhbmdlQ2FsbGJhY2s9dH0sby5wcm90b3R5cGUuc2V0UGxheUludGVydmFsPWZ1bmN0aW9uKHQpe3RoaXMucGxheUludGVydmFsPXR9LG8ucHJvdG90eXBlLmdldFBsYXlJbnRlcnZhbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXlJbnRlcnZhbH0sby5wcm90b3R5cGUuc2V0UGxheUxvb3A9ZnVuY3Rpb24odCl7dGhpcy5wbGF5TG9vcD10fSxvLnByb3RvdHlwZS5vbkNoYW5nZT1mdW5jdGlvbigpe3ZvaWQgMCE9PXRoaXMub25DaGFuZ2VDYWxsYmFjayYmdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCl9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe2lmKHRoaXMuZnJhbWUpe3RoaXMuZnJhbWUuYmFyLnN0eWxlLnRvcD10aGlzLmZyYW1lLmNsaWVudEhlaWdodC8yLXRoaXMuZnJhbWUuYmFyLm9mZnNldEhlaWdodC8yK1wicHhcIix0aGlzLmZyYW1lLmJhci5zdHlsZS53aWR0aD10aGlzLmZyYW1lLmNsaWVudFdpZHRoLXRoaXMuZnJhbWUucHJldi5jbGllbnRXaWR0aC10aGlzLmZyYW1lLnBsYXkuY2xpZW50V2lkdGgtdGhpcy5mcmFtZS5uZXh0LmNsaWVudFdpZHRoLTMwK1wicHhcIjt2YXIgdD10aGlzLmluZGV4VG9MZWZ0KHRoaXMuaW5kZXgpO3RoaXMuZnJhbWUuc2xpZGUuc3R5bGUubGVmdD10K1wicHhcIn19LG8ucHJvdG90eXBlLnNldFZhbHVlcz1mdW5jdGlvbih0KXt0aGlzLnZhbHVlcz10LHRoaXMudmFsdWVzLmxlbmd0aD4wP3RoaXMuc2V0SW5kZXgoMCk6dGhpcy5pbmRleD12b2lkIDB9LG8ucHJvdG90eXBlLnNldEluZGV4PWZ1bmN0aW9uKHQpe2lmKCEodDx0aGlzLnZhbHVlcy5sZW5ndGgpKXRocm93IG5ldyBFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKTt0aGlzLmluZGV4PXQsdGhpcy5yZWRyYXcoKSx0aGlzLm9uQ2hhbmdlKCl9LG8ucHJvdG90eXBlLmdldEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5kZXh9LG8ucHJvdG90eXBlLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlc1t0aGlzLmluZGV4XX0sby5wcm90b3R5cGUuX29uTW91c2VEb3duPWZ1bmN0aW9uKHQpe2lmKHQud2hpY2g/MT09PXQud2hpY2g6MT09PXQuYnV0dG9uKXt0aGlzLnN0YXJ0Q2xpZW50WD10LmNsaWVudFgsdGhpcy5zdGFydFNsaWRlWD1wYXJzZUZsb2F0KHRoaXMuZnJhbWUuc2xpZGUuc3R5bGUubGVmdCksdGhpcy5mcmFtZS5zdHlsZS5jdXJzb3I9XCJtb3ZlXCI7dmFyIGU9dGhpczt0aGlzLm9ubW91c2Vtb3ZlPWZ1bmN0aW9uKHQpe2UuX29uTW91c2VNb3ZlKHQpfSx0aGlzLm9ubW91c2V1cD1mdW5jdGlvbih0KXtlLl9vbk1vdXNlVXAodCl9LG4uYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCxcIm1vdXNlbW92ZVwiLHRoaXMub25tb3VzZW1vdmUpLG4uYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCxcIm1vdXNldXBcIix0aGlzLm9ubW91c2V1cCksbi5wcmV2ZW50RGVmYXVsdCh0KX19LG8ucHJvdG90eXBlLmxlZnRUb0luZGV4PWZ1bmN0aW9uKHQpe3ZhciBlPXBhcnNlRmxvYXQodGhpcy5mcmFtZS5iYXIuc3R5bGUud2lkdGgpLXRoaXMuZnJhbWUuc2xpZGUuY2xpZW50V2lkdGgtMTAsaT10LTMsbz1NYXRoLnJvdW5kKGkvZSoodGhpcy52YWx1ZXMubGVuZ3RoLTEpKTtyZXR1cm4gbzwwJiYobz0wKSxvPnRoaXMudmFsdWVzLmxlbmd0aC0xJiYobz10aGlzLnZhbHVlcy5sZW5ndGgtMSksb30sby5wcm90b3R5cGUuaW5kZXhUb0xlZnQ9ZnVuY3Rpb24odCl7dmFyIGU9cGFyc2VGbG9hdCh0aGlzLmZyYW1lLmJhci5zdHlsZS53aWR0aCktdGhpcy5mcmFtZS5zbGlkZS5jbGllbnRXaWR0aC0xMDtyZXR1cm4gdC8odGhpcy52YWx1ZXMubGVuZ3RoLTEpKmUrM30sby5wcm90b3R5cGUuX29uTW91c2VNb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xpZW50WC10aGlzLnN0YXJ0Q2xpZW50WCxpPXRoaXMuc3RhcnRTbGlkZVgrZSxvPXR
21167oaXMubGVmdFRvSW5kZXgoaSk7dGhpcy5zZXRJbmRleChvKSxuLnByZXZlbnREZWZhdWx0KCl9LG8ucHJvdG90eXBlLl9vbk1vdXNlVXA9ZnVuY3Rpb24odCl7dGhpcy5mcmFtZS5zdHlsZS5jdXJzb3I9XCJhdXRvXCIsbi5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LFwibW91c2Vtb3ZlXCIsdGhpcy5vbm1vdXNlbW92ZSksbi5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LFwibW91c2V1cFwiLHRoaXMub25tb3VzZXVwKSxuLnByZXZlbnREZWZhdWx0KCl9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUsaSxvKXt0aGlzLl9zdGFydD0wLHRoaXMuX2VuZD0wLHRoaXMuX3N0ZXA9MSx0aGlzLnByZXR0eVN0ZXA9ITAsdGhpcy5wcmVjaXNpb249NSx0aGlzLl9jdXJyZW50PTAsdGhpcy5zZXRSYW5nZSh0LGUsaSxvKX1vLnByb3RvdHlwZS5pc051bWVyaWM9ZnVuY3Rpb24odCl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQodCkpJiZpc0Zpbml0ZSh0KX0sby5wcm90b3R5cGUuc2V0UmFuZ2U9ZnVuY3Rpb24odCxlLGksbyl7aWYoIXRoaXMuaXNOdW1lcmljKHQpKXRocm93IG5ldyBFcnJvcihcIlBhcmFtZXRlciAnc3RhcnQnIGlzIG5vdCBudW1lcmljOyB2YWx1ZTogXCIrdCk7aWYoIXRoaXMuaXNOdW1lcmljKGUpKXRocm93IG5ldyBFcnJvcihcIlBhcmFtZXRlciAnZW5kJyBpcyBub3QgbnVtZXJpYzsgdmFsdWU6IFwiK3QpO2lmKCF0aGlzLmlzTnVtZXJpYyhpKSl0aHJvdyBuZXcgRXJyb3IoXCJQYXJhbWV0ZXIgJ3N0ZXAnIGlzIG5vdCBudW1lcmljOyB2YWx1ZTogXCIrdCk7dGhpcy5fc3RhcnQ9dHx8MCx0aGlzLl9lbmQ9ZXx8MCx0aGlzLnNldFN0ZXAoaSxvKX0sby5wcm90b3R5cGUuc2V0U3RlcD1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PXR8fHQ8PTB8fCh2b2lkIDAhPT1lJiYodGhpcy5wcmV0dHlTdGVwPWUpLCEwPT09dGhpcy5wcmV0dHlTdGVwP3RoaXMuX3N0ZXA9by5jYWxjdWxhdGVQcmV0dHlTdGVwKHQpOnRoaXMuX3N0ZXA9dCl9LG8uY2FsY3VsYXRlUHJldHR5U3RlcD1mdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5sb2codCkvTWF0aC5MTjEwfSxpPU1hdGgucG93KDEwLE1hdGgucm91bmQoZSh0KSkpLG89MipNYXRoLnBvdygxMCxNYXRoLnJvdW5kKGUodC8yKSkpLG49NSpNYXRoLnBvdygxMCxNYXRoLnJvdW5kKGUodC81KSkpLHM9aTtyZXR1cm4gTWF0aC5hYnMoby10KTw9TWF0aC5hYnMocy10KSYmKHM9byksTWF0aC5hYnMobi10KTw9TWF0aC5hYnMocy10KSYmKHM9biksczw9MCYmKHM9MSksc30sby5wcm90b3R5cGUuZ2V0Q3VycmVudD1mdW5jdGlvbigpe3JldHVybiBwYXJzZUZsb2F0KHRoaXMuX2N1cnJlbnQudG9QcmVjaXNpb24odGhpcy5wcmVjaXNpb24pKX0sby5wcm90b3R5cGUuZ2V0U3RlcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGVwfSxvLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0hMSksdGhpcy5fY3VycmVudD10aGlzLl9zdGFydC10aGlzLl9zdGFydCV0aGlzLl9zdGVwLHQmJnRoaXMuZ2V0Q3VycmVudCgpPHRoaXMuX3N0YXJ0JiZ0aGlzLm5leHQoKX0sby5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe3RoaXMuX2N1cnJlbnQrPXRoaXMuX3N0ZXB9LG8ucHJvdG90eXBlLmVuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJyZW50PnRoaXMuX2VuZH0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gbih0KXtyZXR1cm4gdm9pZCAwPT09dHx8XCJcIj09PXR8fFwic3RyaW5nXCIhPXR5cGVvZiB0P3Q6dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfWZ1bmN0aW9uIHModCxlKXtyZXR1cm4gdm9pZCAwPT09dHx8XCJcIj09PXQ/ZTp0K24oZSl9ZnVuY3Rpb24gcih0LGUsaSxvKXtmb3IodmFyIG4scixhPTA7YTxpLmxlbmd0aDsrK2Epbj1pW2FdLHI9cyhvLG4pLGVbcl09dFtuXX1mdW5jdGlvbiBhKHQsZSxpLG8pe2Zvcih2YXIgbixyLGE9MDthPGkubGVuZ3RoOysrYSluPWlbYV0sdm9pZCAwIT09dFtuXSYmKHI9cyhvLG4pLGVbcl09dFtuXSl9ZnVuY3Rpb24gaCh0LGUpe2lmKHZvaWQgMD09PXR8fG8odCkpdGhyb3cgbmV3IEVycm9yKFwiTm8gREVGQVVMVFMgcGFzc2VkXCIpO2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IEVycm9yKFwiTm8gZHN0IHBhc3NlZFwiKTtDPXQscih0LGUsRCkscih0LGUsTSxcImRlZmF1bHRcIiksbCh0LGUpLGUubWFyZ2luPTEwLGUuc2hvd0dyYXlCb3R0b209ITEsZS5zaG93VG9vbHRpcD0hMSxlLm9uY2xpY2tfY2FsbGJhY2s9bnVsbCxlLmV5ZT1uZXcgeCgwLDAsLTEpfWZ1bmN0aW9uIGQodCxlKXtpZih2b2lkIDAhPT10KXtpZih2b2lkIDA9PT1lKXRocm93IG5ldyBFcnJvcihcIk5vIGRzdCBwYXNzZWRcIik7aWYodm9pZCAwPT09Q3x8byhDKSl0aHJvdyBuZXcgRXJyb3IoXCJERUZBVUxUUyBub3Qgc2V0IGZvciBtb2R1bGUgU2V0dGluZ3NcIik7YSh0LGUsRCksYSh0LGUsTSxcImRlZmF1bHRcIiksbCh0LGUpfX1mdW5jdGlvbiBsKHQsZSl7dm9pZCAwIT09dC5iYWNrZ3JvdW5kQ29sb3ImJm0odC5iYWNrZ3JvdW5kQ29sb3IsZSksdih0LmRhdGFDb2xvcixlKSxmKHQuc3R5bGUsZSksdSh0LnNob3dMZWdlbmQsZSksZyh0LmNhbWVyYVBvc2l0aW9uLGUpLHZvaWQgMCE9PXQudG9vbHRpcCYmKGUuc2hvd1Rvb2x0aXA9dC50b29sdGlwKSx2b2lkIDAhPXQub25jbGljayYmKGUub25jbGlja19jYWxsYmFjaz10Lm9uY2xpY2spLHZvaWQgMCE9PXQudG9vbHRpcFN0eWxlJiZfLnNlbGVjdGl2ZURlZXBFeHRlbmQoW1widG9vbHRpcFN0eWxlXCJdLGUsdCl9ZnVuY3Rpb24gdSh0LGUpe2lmKHZvaWQgMD09PXQpe2lmKHZvaWQgMD09PUMuc2hvd0xlZ2VuZCl7dmFyIGk9ZS5zdHlsZT09PWsuRE9UQ09MT1J8fGUuc3R5bGU9PT1rLkRPVFNJWkU7ZS5zaG93TGVnZW5kPWl9fWVsc2UgZS5zaG93TGVnZW5kPXR9ZnVuY3Rpb24gYyh0KXt2YXIgZT1TW3RdO3JldHVybiB2b2lkIDA9PT1lPy0xOmV9ZnVuY3Rpb24gcCh0KXt2YXIgZT0hMTtmb3IodmFyIGkgaW4gaylpZihrW2ldPT09dCl7ZT0hMDticmVha31yZXR1cm4gZX1mdW5jdGlvbiBmKHQsZSl7aWYodm9pZCAwIT09dCl7dmFyIGk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe2lmKC0xPT09KGk9Yyh0KSkpdGhyb3cgbmV3IEVycm9yKFwiU3R5bGUgJ1wiK3QrXCInIGlzIGludmFsaWRcIil9ZWxzZXtpZighcCh0KSl0aHJvdyBuZXcgRXJyb3IoXCJTdHlsZSAnXCIrdCtcIicgaXMgaW52YWxpZFwiKTtpPXR9ZS5zdHlsZT1pfX1mdW5jdGlvbiBtKHQsZSl7dmFyIGk9XCJ3aGl0ZVwiLG89XCJncmF5XCIsbj0xO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KWk9dCxvPVwibm9uZVwiLG49MDtlbHNle2lmKFwib2JqZWN0XCIhPT0odm9pZCAwPT09dD9cInVuZGVmaW5lZFwiOigwLGIuZGVmYXVsdCkodCkpKXRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIHR5cGUgb2YgYmFja2dyb3VuZENvbG9yXCIpO3ZvaWQgMCE9PXQuZmlsbCYmKGk9dC5maWxsKSx2b2lkIDAhPT10LnN0cm9rZSYmKG89dC5zdHJva2UpLHZvaWQgMCE9PXQuc3Ryb2tlV2lkdGgmJihuPXQuc3Ryb2tlV2lkdGgpfWUuZnJhbWUuc3R5bGUuYmFja2dyb3VuZENvbG9yPWksZS5mcmFtZS5zdHlsZS5ib3JkZXJDb2xvcj1vLGUuZnJhbWUuc3R5bGUuYm9yZGVyV2lkdGg9bitcInB4XCIsZS5mcmFtZS5zdHlsZS5ib3JkZXJTdHlsZT1cInNvbGlkXCJ9ZnVuY3Rpb24gdih0LGUpe3ZvaWQgMCE9PXQmJih2b2lkIDA9PT1lLmRhdGFDb2xvciYmKGUuZGF0YUNvbG9yPXt9KSxcInN0cmluZ1wiPT10eXBlb2YgdD8oZS5kYXRhQ29sb3IuZmlsbD10LGUuZGF0YUNvbG9yLnN0cm9rZT10KToodC5maWxsJiYoZS5kYXRhQ29sb3IuZmlsbD10LmZpbGwpLHQuc3Ryb2tlJiYoZS5kYXRhQ29sb3Iuc3Ryb2tlPXQuc3Ryb2tlKSx2b2lkIDAhPT10LnN0cm9rZVdpZHRoJiYoZS5kYXRhQ29sb3Iuc3Ryb2tlV2lkdGg9dC5zdHJva2VXaWR0aCkpKX1mdW5jdGlvbiBnKHQsZSl7dmFyIGk9dDt2b2lkIDAhPT1pJiYodm9p
21167ZCAwPT09ZS5jYW1lcmEmJihlLmNhbWVyYT1uZXcgdyksZS5jYW1lcmEuc2V0QXJtUm90YXRpb24oaS5ob3Jpem9udGFsLGkudmVydGljYWwpLGUuY2FtZXJhLnNldEFybUxlbmd0aChpLmRpc3RhbmNlKSl9dmFyIHk9aSg2KSxiPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0oeSksXz1pKDIpLHc9aSg5NSkseD1pKDM0KSxrPXtCQVI6MCxCQVJDT0xPUjoxLEJBUlNJWkU6MixET1Q6MyxET1RMSU5FOjQsRE9UQ09MT1I6NSxET1RTSVpFOjYsR1JJRDo3LExJTkU6OCxTVVJGQUNFOjl9LFM9e2RvdDprLkRPVCxcImRvdC1saW5lXCI6ay5ET1RMSU5FLFwiZG90LWNvbG9yXCI6ay5ET1RDT0xPUixcImRvdC1zaXplXCI6ay5ET1RTSVpFLGxpbmU6ay5MSU5FLGdyaWQ6ay5HUklELHN1cmZhY2U6ay5TVVJGQUNFLGJhcjprLkJBUixcImJhci1jb2xvclwiOmsuQkFSQ09MT1IsXCJiYXItc2l6ZVwiOmsuQkFSU0laRX0sRD1bXCJ3aWR0aFwiLFwiaGVpZ2h0XCIsXCJmaWx0ZXJMYWJlbFwiLFwibGVnZW5kTGFiZWxcIixcInhMYWJlbFwiLFwieUxhYmVsXCIsXCJ6TGFiZWxcIixcInhWYWx1ZUxhYmVsXCIsXCJ5VmFsdWVMYWJlbFwiLFwielZhbHVlTGFiZWxcIixcInNob3dYQXhpc1wiLFwic2hvd1lBeGlzXCIsXCJzaG93WkF4aXNcIixcInNob3dHcmlkXCIsXCJzaG93UGVyc3BlY3RpdmVcIixcInNob3dTaGFkb3dcIixcImtlZXBBc3BlY3RSYXRpb1wiLFwidmVydGljYWxSYXRpb1wiLFwiZG90U2l6ZVJhdGlvXCIsXCJkb3RTaXplTWluRnJhY3Rpb25cIixcImRvdFNpemVNYXhGcmFjdGlvblwiLFwic2hvd0FuaW1hdGlvbkNvbnRyb2xzXCIsXCJhbmltYXRpb25JbnRlcnZhbFwiLFwiYW5pbWF0aW9uUHJlbG9hZFwiLFwiYW5pbWF0aW9uQXV0b1N0YXJ0XCIsXCJheGlzQ29sb3JcIixcImdyaWRDb2xvclwiLFwieENlbnRlclwiLFwieUNlbnRlclwiXSxNPVtcInhCYXJXaWR0aFwiLFwieUJhcldpZHRoXCIsXCJ2YWx1ZU1pblwiLFwidmFsdWVNYXhcIixcInhNaW5cIixcInhNYXhcIixcInhTdGVwXCIsXCJ5TWluXCIsXCJ5TWF4XCIsXCJ5U3RlcFwiLFwiek1pblwiLFwiek1heFwiLFwielN0ZXBcIl0sQz12b2lkIDA7dC5leHBvcnRzLlNUWUxFPWssdC5leHBvcnRzLnNldERlZmF1bHRzPWgsdC5leHBvcnRzLnNldE9wdGlvbnM9ZCx0LmV4cG9ydHMuc2V0Q2FtZXJhUG9zaXRpb249Z30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8oKXt0aGlzLmFybUxvY2F0aW9uPW5ldyByLHRoaXMuYXJtUm90YXRpb249e30sdGhpcy5hcm1Sb3RhdGlvbi5ob3Jpem9udGFsPTAsdGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbD0wLHRoaXMuYXJtTGVuZ3RoPTEuNyx0aGlzLmNhbWVyYU9mZnNldD1uZXcgcix0aGlzLm9mZnNldE11bHRpcGxpZXI9LjYsdGhpcy5jYW1lcmFMb2NhdGlvbj1uZXcgcix0aGlzLmNhbWVyYVJvdGF0aW9uPW5ldyByKC41Kk1hdGguUEksMCwwKSx0aGlzLmNhbGN1bGF0ZUNhbWVyYU9yaWVudGF0aW9uKCl9dmFyIG49aSgxNjUpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShuKSxyPWkoMzQpO28ucHJvdG90eXBlLnNldE9mZnNldD1mdW5jdGlvbih0LGUpe3ZhciBpPU1hdGguYWJzLG89cy5kZWZhdWx0LG49dGhpcy5vZmZzZXRNdWx0aXBsaWVyLHI9dGhpcy5hcm1MZW5ndGgqbjtpKHQpPnImJih0PW8odCkqciksaShlKT5yJiYoZT1vKGUpKnIpLHRoaXMuY2FtZXJhT2Zmc2V0Lng9dCx0aGlzLmNhbWVyYU9mZnNldC55PWUsdGhpcy5jYWxjdWxhdGVDYW1lcmFPcmllbnRhdGlvbigpfSxvLnByb3RvdHlwZS5nZXRPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW1lcmFPZmZzZXR9LG8ucHJvdG90eXBlLnNldEFybUxvY2F0aW9uPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmFybUxvY2F0aW9uLng9dCx0aGlzLmFybUxvY2F0aW9uLnk9ZSx0aGlzLmFybUxvY2F0aW9uLno9aSx0aGlzLmNhbGN1bGF0ZUNhbWVyYU9yaWVudGF0aW9uKCl9LG8ucHJvdG90eXBlLnNldEFybVJvdGF0aW9uPWZ1bmN0aW9uKHQsZSl7dm9pZCAwIT09dCYmKHRoaXMuYXJtUm90YXRpb24uaG9yaXpvbnRhbD10KSx2b2lkIDAhPT1lJiYodGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbD1lLHRoaXMuYXJtUm90YXRpb24udmVydGljYWw8MCYmKHRoaXMuYXJtUm90YXRpb24udmVydGljYWw9MCksdGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbD4uNSpNYXRoLlBJJiYodGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbD0uNSpNYXRoLlBJKSksdm9pZCAwPT09dCYmdm9pZCAwPT09ZXx8dGhpcy5jYWxjdWxhdGVDYW1lcmFPcmllbnRhdGlvbigpfSxvLnByb3RvdHlwZS5nZXRBcm1Sb3RhdGlvbj1mdW5jdGlvbigpe3ZhciB0PXt9O3JldHVybiB0Lmhvcml6b250YWw9dGhpcy5hcm1Sb3RhdGlvbi5ob3Jpem9udGFsLHQudmVydGljYWw9dGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbCx0fSxvLnByb3RvdHlwZS5zZXRBcm1MZW5ndGg9ZnVuY3Rpb24odCl7dm9pZCAwIT09dCYmKHRoaXMuYXJtTGVuZ3RoPXQsdGhpcy5hcm1MZW5ndGg8LjcxJiYodGhpcy5hcm1MZW5ndGg9LjcxKSx0aGlzLmFybUxlbmd0aD41JiYodGhpcy5hcm1MZW5ndGg9NSksdGhpcy5zZXRPZmZzZXQodGhpcy5jYW1lcmFPZmZzZXQueCx0aGlzLmNhbWVyYU9mZnNldC55KSx0aGlzLmNhbGN1bGF0ZUNhbWVyYU9yaWVudGF0aW9uKCkpfSxcbiAgICBvLnByb3RvdHlwZS5nZXRBcm1MZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcm1MZW5ndGh9LG8ucHJvdG90eXBlLmdldENhbWVyYUxvY2F0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FtZXJhTG9jYXRpb259LG8ucHJvdG90eXBlLmdldENhbWVyYVJvdGF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FtZXJhUm90YXRpb259LG8ucHJvdG90eXBlLmNhbGN1bGF0ZUNhbWVyYU9yaWVudGF0aW9uPWZ1bmN0aW9uKCl7dGhpcy5jYW1lcmFMb2NhdGlvbi54PXRoaXMuYXJtTG9jYXRpb24ueC10aGlzLmFybUxlbmd0aCpNYXRoLnNpbih0aGlzLmFybVJvdGF0aW9uLmhvcml6b250YWwpKk1hdGguY29zKHRoaXMuYXJtUm90YXRpb24udmVydGljYWwpLHRoaXMuY2FtZXJhTG9jYXRpb24ueT10aGlzLmFybUxvY2F0aW9uLnktdGh
21167pcy5hcm1MZW5ndGgqTWF0aC5jb3ModGhpcy5hcm1Sb3RhdGlvbi5ob3Jpem9udGFsKSpNYXRoLmNvcyh0aGlzLmFybVJvdGF0aW9uLnZlcnRpY2FsKSx0aGlzLmNhbWVyYUxvY2F0aW9uLno9dGhpcy5hcm1Mb2NhdGlvbi56K3RoaXMuYXJtTGVuZ3RoKk1hdGguc2luKHRoaXMuYXJtUm90YXRpb24udmVydGljYWwpLHRoaXMuY2FtZXJhUm90YXRpb24ueD1NYXRoLlBJLzItdGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbCx0aGlzLmNhbWVyYVJvdGF0aW9uLnk9MCx0aGlzLmNhbWVyYVJvdGF0aW9uLno9LXRoaXMuYXJtUm90YXRpb24uaG9yaXpvbnRhbDt2YXIgdD10aGlzLmNhbWVyYVJvdGF0aW9uLngsZT10aGlzLmNhbWVyYVJvdGF0aW9uLnosaT10aGlzLmNhbWVyYU9mZnNldC54LG89dGhpcy5jYW1lcmFPZmZzZXQueSxuPU1hdGguc2luLHM9TWF0aC5jb3M7dGhpcy5jYW1lcmFMb2NhdGlvbi54PXRoaXMuY2FtZXJhTG9jYXRpb24ueCtpKnMoZSkrbyotbihlKSpzKHQpLHRoaXMuY2FtZXJhTG9jYXRpb24ueT10aGlzLmNhbWVyYUxvY2F0aW9uLnkraSpuKGUpK28qcyhlKSpzKHQpLHRoaXMuY2FtZXJhTG9jYXRpb24uej10aGlzLmNhbWVyYUxvY2F0aW9uLnorbypuKHQpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe3RoaXMuZGF0YUdyb3VwPXQsdGhpcy5jb2x1bW49ZSx0aGlzLmdyYXBoPWksdGhpcy5pbmRleD12b2lkIDAsdGhpcy52YWx1ZT12b2lkIDAsdGhpcy52YWx1ZXM9dC5nZXREaXN0aW5jdFZhbHVlcyh0aGlzLmNvbHVtbiksdGhpcy52YWx1ZXMubGVuZ3RoPjAmJnRoaXMuc2VsZWN0VmFsdWUoMCksdGhpcy5kYXRhUG9pbnRzPVtdLHRoaXMubG9hZGVkPSExLHRoaXMub25Mb2FkQ2FsbGJhY2s9dm9pZCAwLGkuYW5pbWF0aW9uUHJlbG9hZD8odGhpcy5sb2FkZWQ9ITEsdGhpcy5sb2FkSW5CYWNrZ3JvdW5kKCkpOnRoaXMubG9hZGVkPSEwfXZhciBuPWkoMTIpO28ucHJvdG90eXBlLmlzTG9hZGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9hZGVkfSxvLnByb3RvdHlwZS5nZXRMb2FkZWRQcm9ncmVzcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnZhbHVlcy5sZW5ndGgsZT0wO3RoaXMuZGF0YVBvaW50c1tlXTspZSsrO3JldHVybiBNYXRoLnJvdW5kKGUvdCoxMDApfSxvLnByb3RvdHlwZS5nZXRMYWJlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdyYXBoLmZpbHRlckxhYmVsfSxvLnByb3RvdHlwZS5nZXRDb2x1bW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb2x1bW59LG8ucHJvdG90eXBlLmdldFNlbGVjdGVkVmFsdWU9ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT10aGlzLmluZGV4KXJldHVybiB0aGlzLnZhbHVlc1t0aGlzLmluZGV4XX0sby5wcm90b3R5cGUuZ2V0VmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWVzfSxvLnByb3RvdHlwZS5nZXRWYWx1ZT1mdW5jdGlvbih0KXtpZih0Pj10aGlzLnZhbHVlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpO3JldHVybiB0aGlzLnZhbHVlc1t0XX0sby5wcm90b3R5cGUuX2dldERhdGFQb2ludHM9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCYmKHQ9dGhpcy5pbmRleCksdm9pZCAwPT09dClyZXR1cm5bXTt2YXIgZTtpZih0aGlzLmRhdGFQb2ludHNbdF0pZT10aGlzLmRhdGFQb2ludHNbdF07ZWxzZXt2YXIgaT17fTtpLmNvbHVtbj10aGlzLmNvbHVtbixpLnZhbHVlPXRoaXMudmFsdWVzW3RdO3ZhciBvPW5ldyBuKHRoaXMuZGF0YUdyb3VwLmdldERhdGFTZXQoKSx7ZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0W2kuY29sdW1uXT09aS52YWx1ZX19KS5nZXQoKTtlPXRoaXMuZGF0YUdyb3VwLl9nZXREYXRhUG9pbnRzKG8pLHRoaXMuZGF0YVBvaW50c1t0XT1lfXJldHVybiBlfSxvLnByb3RvdHlwZS5zZXRPbkxvYWRDYWxsYmFjaz1mdW5jdGlvbih0KXt0aGlzLm9uTG9hZENhbGxiYWNrPXR9LG8ucHJvdG90eXBlLnNlbGVjdFZhbHVlPWZ1bmN0aW9uKHQpe2lmKHQ+PXRoaXMudmFsdWVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJJbmRleCBvdXQgb2YgcmFuZ2VcIik7dGhpcy5pbmRleD10LHRoaXMudmFsdWU9dGhpcy52YWx1ZXNbdF19LG8ucHJvdG90eXBlLmxvYWRJbkJhY2tncm91bmQ9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9MCk7dmFyIGU9dGhpcy5ncmFwaC5mcmFtZTtpZih0PHRoaXMudmFsdWVzLmxlbmd0aCl7dm9pZCAwPT09ZS5wcm9ncmVzcyYmKGUucHJvZ3Jlc3M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIkRJVlwiKSxlLnByb2dyZXNzLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIixlLnByb2dyZXNzLnN0eWxlLmNvbG9yPVwiZ3JheVwiLGUuYXBwZW5kQ2hpbGQoZS5wcm9ncmVzcykpO3ZhciBpPXRoaXMuZ2V0TG9hZGVkUHJvZ3Jlc3MoKTtlLnByb2dyZXNzLmlubmVySFRNTD1cIkxvYWRpbmcgYW5pbWF0aW9uLi4uIFwiK2krXCIlXCIsZS
211675wcm9ncmVzcy5zdHlsZS5ib3R0b209XCI2MHB4XCIsZS5wcm9ncmVzcy5zdHlsZS5sZWZ0PVwiMTBweFwiO3ZhciBvPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe28ubG9hZEluQmFja2dyb3VuZCh0KzEpfSwxMCksdGhpcy5sb2FkZWQ9ITF9ZWxzZSB0aGlzLmxvYWRlZD0hMCx2b2lkIDAhPT1lLnByb2dyZXNzJiYoZS5yZW1vdmVDaGlsZChlLnByb2dyZXNzKSxlLnByb2dyZXNzPXZvaWQgMCksdGhpcy5vbkxvYWRDYWxsYmFjayYmdGhpcy5vbkxvYWRDYWxsYmFjaygpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7dGhpcy5hY3RpdmU9ITEsdGhpcy5kb209e2NvbnRhaW5lcjp0fSx0aGlzLmRvbS5vdmVybGF5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20ub3ZlcmxheS5jbGFzc05hbWU9XCJ2aXMtb3ZlcmxheVwiLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5vdmVybGF5KSx0aGlzLmhhbW1lcj1hKHRoaXMuZG9tLm92ZXJsYXkpLHRoaXMuaGFtbWVyLm9uKFwidGFwXCIsdGhpcy5fb25UYXBPdmVybGF5LmJpbmQodGhpcykpO3ZhciBlPXRoaXM7W1widGFwXCIsXCJkb3VibGV0YXBcIixcInByZXNzXCIsXCJwaW5jaFwiLFwicGFuXCIsXCJwYW5zdGFydFwiLFwicGFubW92ZVwiLFwicGFuZW5kXCJdLmZvckVhY2goZnVuY3Rpb24odCl7ZS5oYW1tZXIub24odCxmdW5jdGlvbih0KXt0LnN0b3BQcm9wYWdhdGlvbigpfSl9KSxkb2N1bWVudCYmZG9jdW1lbnQuYm9keSYmKHRoaXMub25DbGljaz1mdW5jdGlvbihpKXtuKGkudGFyZ2V0LHQpfHxlLmRlYWN0aXZhdGUoKX0sZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0aGlzLm9uQ2xpY2spKSx2b2lkIDAhPT10aGlzLmtleWNoYXJtJiZ0aGlzLmtleWNoYXJtLmRlc3Ryb3koKSx0aGlzLmtleWNoYXJtPXMoKSx0aGlzLmVzY0xpc3RlbmVyPXRoaXMuZGVhY3RpdmF0ZS5iaW5kKHRoaXMpfWZ1bmN0aW9uIG4odCxlKXtmb3IoO3Q7KXtpZih0PT09ZSlyZXR1cm4hMDt0PXQucGFyZW50Tm9kZX1yZXR1cm4hMX12YXIgcz1pKDM1KSxyPWkoNDQpLGE9aSgxMCksaD1pKDIpO3Ioby5wcm90b3R5cGUpLG8uY3VycmVudD1udWxsLG8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmRlYWN0aXZhdGUoKSx0aGlzLmRvbS5vdmVybGF5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ub3ZlcmxheSksdGhpcy5vbkNsaWNrJiZkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLHRoaXMub25DbGljayksdGhpcy5oYW1tZXIuZGVzdHJveSgpLHRoaXMuaGFtbWVyPW51bGx9LG8ucHJvdG90eXBlLmFjdGl2YXRlPWZ1bmN0aW9uKCl7by5jdXJyZW50JiZvLmN1cnJlbnQuZGVhY3RpdmF0ZSgpLG8uY3VycmVudD10aGlzLHRoaXMuYWN0aXZlPSEwLHRoaXMuZG9tLm92ZXJsYXkuc3R5bGUuZGlzcGxheT1cIm5vbmVcIixoLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5jb250YWluZXIsXCJ2aXMtYWN0aXZlXCIpLHRoaXMuZW1pdChcImNoYW5nZVwiKSx0aGlzLmVtaXQoXCJhY3RpdmF0ZVwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCJlc2NcIix0aGlzLmVzY0xpc3RlbmVyKX0sby5wcm90b3R5cGUuZGVhY3RpdmF0ZT1mdW5jdGlvbigpe3RoaXMuYWN0aXZlPSExLHRoaXMuZG9tLm92ZXJsYXkuc3R5bGUuZGlzcGxheT1cIlwiLGgucmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZG9tLmNvbnRhaW5lcixcInZpcy1hY3RpdmVcIiksdGhpcy5rZXljaGFybS51bmJpbmQoXCJlc2NcIix0aGlzLmVzY0xpc3RlbmVyKSx0aGlzLmVtaXQoXCJjaGFuZ2VcIiksdGhpcy5lbWl0KFwiZGVhY3RpdmF0ZVwiKX0sby5wcm90b3R5cGUuX29uVGFwT3ZlcmxheT1mdW5jdGlvbih0KXt0aGlzLmFjdGl2YXRlKCksdC5zdG9wUHJvcGFnYXRpb24oKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtlLmVuPXtjdXJyZW50OlwiY3VycmVudFwiLHRpbWU6XCJ0aW1lXCJ9LGUuZW5fRU49ZS5lbixlLmVuX1VTPWUuZW4sZS5pdD17Y3VycmVudDpcImF0dHVhbGVcIix0aW1lOlwidGVtcG9cIn0sZS5pdF9JVD1lLml0LGUuaXRfQ0g9ZS5pdCxlLm5sPXtjdXJyZW50OlwiaHVpZGlnZVwiLHRpbWU6XCJ0aWpkXCJ9LGUubmxfTkw9ZS5ubCxlLm5sX0JFPWUubmwsZS5kZT17Y3VycmVudDpcIkFrdHVlbGxlXCIsdGltZTpcIlplaXRcIn0sZS5kZV9ERT1lLmRlLGUuZnI9e2N1cnJlbnQ6XCJhY3R1ZWxcIix0aW1lOlwiaGV1cmVcIn0sZS5mcl9GUj1lLmZyLGUuZnJfQ0E9ZS5mcixlLmZyX0JFPWUuZnIsZS5lcz17Y3VycmVudDpcImNvcnJpZW50ZVwiLHRpbWU6XCJob3JhXCJ9LGUuZXNfRVM9ZS5lc30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXt0aGlzLmJvZHk9dCx0aGlzLmRlZmF1bHRPcHRpb25zPXt0eXBlOm51bGwsb3JpZW50YXRpb246e2l0ZW06XCJib3R0b21cIn0sYWxpZ246XCJhdXRvXCIsc3RhY2s6ITAsc3RhY2tTdWJncm91cHM6ITAsZ3JvdXBPcmRlclN3YXA6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWUub3JkZXI7ZS5vcmRlcj10Lm9yZGVyLHQub3JkZXI9b30sZ3JvdXBPcmRlcjpcIm9yZGVyXCIsc2VsZWN0YWJsZTohMCxtdWx0aXNlbGVjdDohMSxpdGVtc0Fsd2F5c0RyYWdnYWJsZTp7aXRlbTohMSxyYW5nZTohMX0sZWRpdGFibGU6e3VwZGF0ZVRpbWU6ITEsdXBkYXRlR3JvdXA6ITEsYWRkOiExLHJlbW92ZTohMSxvdmVycmlkZUl0ZW1zOiExfSxncm91cEVkaXRhYmxlOntvcmRlcjohMSxhZGQ6ITEscmVtb3ZlOiExfSxzbmFwOnAuc25hcCxvbkRyb3BPYmplY3RPbkl0ZW06ZnVuY3Rpb24odCxlLGkpe2koZSl9LG9uQWRkOmZ1bmN0aW9uKHQsZSl7ZSh0KX0sb25VcGRhdGU6ZnVuY3Rpb24odCxlKXtlKHQpfSxvbk1vdmU6ZnVuY3Rpb24odCxlKXtlKHQpfSxvblJlbW92ZTpmdW5jdGlvbih0LGUpe2UodCl9LG9uTW92aW5nOmZ1bmN0aW9uKHQsZSl7ZSh0KX0sb25BZGRHcm91cDpmdW5jdGlvbih0LGUpe2UodCl9LG9uTW92ZUdyb3VwOmZ1bmN0aW9uKHQsZSl7ZSh0KX0sb25SZW1vdmVHcm91cDpmdW5jdGlvbih0LGUpe2UodCl9LG1hcmdpbjp7aXRlbTp7aG9yaXpvbn
21167RhbDoxMCx2ZXJ0aWNhbDoxMH0sYXhpczoyMH0sc2hvd1Rvb2x0aXBzOiEwLHRvb2x0aXA6e2ZvbGxvd01vdXNlOiExLG92ZXJmbG93TWV0aG9kOlwiZmxpcFwifSx0b29sdGlwT25JdGVtVXBkYXRlVGltZTohMX0sdGhpcy5vcHRpb25zPWwuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMub3B0aW9ucy5ydGw9ZS5ydGwsdGhpcy5pdGVtT3B0aW9ucz17dHlwZTp7c3RhcnQ6XCJEYXRlXCIsZW5kOlwiRGF0ZVwifX0sdGhpcy5jb252ZXJzaW9uPXt0b1NjcmVlbjp0LnV0aWwudG9TY3JlZW4sdG9UaW1lOnQudXRpbC50b1RpbWV9LHRoaXMuZG9tPXt9LHRoaXMucHJvcHM9e30sdGhpcy5oYW1tZXI9bnVsbDt2YXIgaT10aGlzO3RoaXMuaXRlbXNEYXRhPW51bGwsdGhpcy5ncm91cHNEYXRhPW51bGwsdGhpcy5pdGVtTGlzdGVuZXJzPXthZGQ6ZnVuY3Rpb24odCxlLG8pe2kuX29uQWRkKGUuaXRlbXMpfSx1cGRhdGU6ZnVuY3Rpb24odCxlLG8pe2kuX29uVXBkYXRlKGUuaXRlbXMpfSxyZW1vdmU6ZnVuY3Rpb24odCxlLG8pe2kuX29uUmVtb3ZlKGUuaXRlbXMpfX0sdGhpcy5ncm91cExpc3RlbmVycz17YWRkOmZ1bmN0aW9uKHQsZSxvKXtpZihpLl9vbkFkZEdyb3VwcyhlLml0ZW1zKSxpLmdyb3Vwc0RhdGEmJmkuZ3JvdXBzRGF0YS5sZW5ndGg+MCl7dmFyIG49aS5ncm91cHNEYXRhLmdldERhdGFTZXQoKTtuLmdldCgpLmZvckVhY2goZnVuY3Rpb24odCl7aWYodC5uZXN0ZWRHcm91cHMpezAhPXQuc2hvd05lc3RlZCYmKHQuc2hvd05lc3RlZD0hMCk7dmFyIGU9W107dC5uZXN0ZWRHcm91cHMuZm9yRWFjaChmdW5jdGlvbihpKXt2YXIgbz1uLmdldChpKTtvJiYoby5uZXN0ZWRJbkdyb3VwPXQuaWQsMD09dC5zaG93TmVzdGVkJiYoby52aXNpYmxlPSExKSxlPWUuY29uY2F0KG8pKX0pLG4udXBkYXRlKGUsbyl9fSl9fSx1cGRhdGU6ZnVuY3Rpb24odCxlLG8pe2kuX29uVXBkYXRlR3JvdXBzKGUuaXRlbXMpfSxyZW1vdmU6ZnVuY3Rpb24odCxlLG8pe2kuX29uUmVtb3ZlR3JvdXBzKGUuaXRlbXMpfX0sdGhpcy5pdGVtcz17fSx0aGlzLmdyb3Vwcz17fSx0aGlzLmdyb3VwSWRzPVtdLHRoaXMuc2VsZWN0aW9uPVtdLHRoaXMucG9wdXA9bnVsbCx0aGlzLnRvdWNoUGFyYW1zPXt9LHRoaXMuZ3JvdXBUb3VjaFBhcmFtcz17fSx0aGlzLl9jcmVhdGUoKSx0aGlzLnNldE9wdGlvbnMoZSl9dmFyIHM9aSgyOSkscj1vKHMpLGE9aSg2KSxoPW8oYSksZD1pKDEwKSxsPWkoMiksdT1pKDExKSxjPWkoMTIpLHA9aSg2NiksZj1pKDE2KSxtPWkoNjgpLHY9aSg2OSksZz1pKDEwMSkseT1pKDEwMiksYj1pKDcwKSxfPWkoMTAzKSx3PWkoMTA0KS5kZWZhdWx0LHg9XCJfX3VuZ3JvdXBlZF9fXCIsaz1cIl9fYmFja2dyb3VuZF9fXCI7bi5wcm90b3R5cGU9bmV3IGYsbi50eXBlcz17YmFja2dyb3VuZDpfLGJveDpnLHJhbmdlOmIscG9pbnQ6eX0sbi5wcm90b3R5cGUuX2NyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dC5jbGFzc05hbWU9XCJ2aXMtaXRlbXNldFwiLHRbXCJ0aW1lbGluZS1pdGVtc2V0XCJdPXRoaXMsdGhpcy5kb20uZnJhbWU9dDt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO2UuY2xhc3NOYW1lPVwidmlzLWJhY2tncm91bmRcIix0LmFwcGVuZENoaWxkKGUpLHRoaXMuZG9tLmJhY2tncm91bmQ9ZTt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO2kuY2xhc3NOYW1lPVwidmlzLWZvcmVncm91bmRcIix0LmFwcGVuZENoaWxkKGkpLHRoaXMuZG9tLmZvcmVncm91bmQ9aTt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO28uY2xhc3NOYW1lPVwidmlzLWF4aXNcIix0aGlzLmRvbS5heGlzPW87dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtuLmNsYXNzTmFtZT1cInZpcy1sYWJlbHNldFwiLHRoaXMuZG9tLmxhYmVsU2V0PW4sdGhpcy5fdXBkYXRlVW5ncm91cGVkKCk7dmFyIHM9bmV3IHYoayxudWxsLHRoaXMpO3Muc2hvdygpLHRoaXMuZ3JvdXBzW2tdPXMsdGhpcy5oYW1tZXI9bmV3IGQodGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXIpLHRoaXMuaGFtbWVyLm9uKFwiaGFtbWVyLmlucHV0XCIsZnVuY3Rpb24odCl7dC5pc0ZpcnN0JiZ0aGlzLl9vblRvdWNoKHQpfS5iaW5kKHRoaXMpKSx0aGlzLmhhbW1lci5vbihcInBhbnN0YXJ0XCIsdGhpcy5fb25EcmFnU3RhcnQuYmluZCh0aGlzKSksdGhpcy5oYW1tZXIub24oXCJwYW5tb3ZlXCIsdGhpcy5fb25EcmFnLmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLm9uKFwicGFuZW5kXCIsdGhpcy5fb25EcmFnRW5kLmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLmdldChcInBhblwiKS5zZXQoe3RocmVzaG9sZDo1LGRpcmVjdGlvbjpkLkRJ
21167UkVDVElPTl9IT1JJWk9OVEFMfSksdGhpcy5oYW1tZXIub24oXCJ0YXBcIix0aGlzLl9vblNlbGVjdEl0ZW0uYmluZCh0aGlzKSksdGhpcy5oYW1tZXIub24oXCJwcmVzc1wiLHRoaXMuX29uTXVsdGlTZWxlY3RJdGVtLmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLm9uKFwiZG91YmxldGFwXCIsdGhpcy5fb25BZGRJdGVtLmJpbmQodGhpcykpLHRoaXMub3B0aW9ucy5ydGw/dGhpcy5ncm91cEhhbW1lcj1uZXcgZCh0aGlzLmJvZHkuZG9tLnJpZ2h0Q29udGFpbmVyKTp0aGlzLmdyb3VwSGFtbWVyPW5ldyBkKHRoaXMuYm9keS5kb20ubGVmdENvbnRhaW5lciksdGhpcy5ncm91cEhhbW1lci5vbihcInRhcFwiLHRoaXMuX29uR3JvdXBDbGljay5iaW5kKHRoaXMpKSx0aGlzLmdyb3VwSGFtbWVyLm9uKFwicGFuc3RhcnRcIix0aGlzLl9vbkdyb3VwRHJhZ1N0YXJ0LmJpbmQodGhpcykpLHRoaXMuZ3JvdXBIYW1tZXIub24oXCJwYW5tb3ZlXCIsdGhpcy5fb25Hcm91cERyYWcuYmluZCh0aGlzKSksdGhpcy5ncm91cEhhbW1lci5vbihcInBhbmVuZFwiLHRoaXMuX29uR3JvdXBEcmFnRW5kLmJpbmQodGhpcykpLHRoaXMuZ3JvdXBIYW1tZXIuZ2V0KFwicGFuXCIpLnNldCh7dGhyZXNob2xkOjUsZGlyZWN0aW9uOmQuRElSRUNUSU9OX1ZFUlRJQ0FMfSksdGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLHRoaXMuX29uTW91c2VPdmVyLmJpbmQodGhpcykpLHRoaXMuYm9keS5kb20uY2VudGVyQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW91dFwiLHRoaXMuX29uTW91c2VPdXQuYmluZCh0aGlzKSksdGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMuX29uTW91c2VNb3ZlLmJpbmQodGhpcykpLHRoaXMuYm9keS5kb20uY2VudGVyQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLHRoaXMuX29uRHJhZ0VuZC5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZG9tLmNlbnRlckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwibW91c2V3aGVlbFwiLHRoaXMuX29uTW91c2VXaGVlbC5iaW5kKHRoaXMpKSx0aGlzLnNob3coKX0sbi5wcm90b3R5cGUuc2V0T3B0aW9ucz1mdW5jdGlvbih0KXtpZih0KXt2YXIgZT1bXCJ0eXBlXCIsXCJydGxcIixcImFsaWduXCIsXCJvcmRlclwiLFwic3RhY2tcIixcInN0YWNrU3ViZ3JvdXBzXCIsXCJzZWxlY3RhYmxlXCIsXCJtdWx0aXNlbGVjdFwiLFwibXVsdGlzZWxlY3RQZXJHcm91cFwiLFwiZ3JvdXBPcmRlclwiLFwiZGF0YUF0dHJpYnV0ZXNcIixcInRlbXBsYXRlXCIsXCJncm91cFRlbXBsYXRlXCIsXCJ2aXNpYmxlRnJhbWVUZW1wbGF0ZVwiLFwiaGlkZVwiLFwic25hcFwiLFwiZ3JvdXBPcmRlclN3YXBcIixcInNob3dUb29sdGlwc1wiLFwidG9vbHRpcFwiLFwidG9vbHRpcE9uSXRlbVVwZGF0ZVRpbWVcIl07bC5zZWxlY3RpdmVFeHRlbmQoZSx0aGlzLm9wdGlvbnMsdCksXCJpdGVtc0Fsd2F5c0RyYWdnYWJsZVwiaW4gdCYmKFwiYm9vbGVhblwiPT10eXBlb2YgdC5pdGVtc0Fsd2F5c0RyYWdnYWJsZT8odGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLml0ZW09dC5pdGVtc0Fsd2F5c0RyYWdnYWJsZSx0aGlzLm9wdGlvbnMuaXRlbXNBbHdheXNEcmFnZ2FibGUucmFuZ2U9ITEpOlwib2JqZWN0XCI9PT0oMCxoLmRlZmF1bHQpKHQuaXRlbXNBbHdheXNEcmFnZ2FibGUpJiYobC5zZWxlY3RpdmVFeHRlbmQoW1wiaXRlbVwiLFwicmFuZ2VcIl0sdGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLHQuaXRlbXNBbHdheXNEcmFnZ2FibGUpLHRoaXMub3B0aW9ucy5pdGVtc0Fsd2F5c0RyYWdnYWJsZS5pdGVtfHwodGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLnJhbmdlPSExKSkpLFwib3JpZW50YXRpb25cImluIHQmJihcInN0cmluZ1wiPT10eXBlb2YgdC5vcmllbnRhdGlvbj90aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbT1cInRvcFwiPT09dC5vcmllbnRhdGlvbj9cInRvcFwiOlwiYm90dG9tXCI6XCJvYmplY3RcIj09PSgwLGguZGVmYXVsdCkodC5vcmllbnRhdGlvbikmJlwiaXRlbVwiaW4gdC5vcmllbnRhdGlvbiYmKHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtPXQub3JpZW50YXRpb24uaXRlbSkpLFwibWFyZ2luXCJpbiB0JiYoXCJudW1iZXJcIj09dHlwZW9mIHQubWFyZ2luPyh0aGlzLm9wdGlvbnMubWFyZ2luLmF4aXM9dC5tYXJnaW4sdGhpcy5vcHRpb25zLm1hcmdpbi5pdGVtLmhvcml6b250YWw9dC5tYXJnaW4sdGhpcy5vcHRpb25zLm1hcmdpbi5pdGVtLnZlcnRpY2FsPXQubWFyZ2luKTpcIm9iamVjdFwiPT09KDAsaC5kZWZhdWx0KSh0Lm1hcmdpbikmJihsLnNlbGVjdGl2ZUV4dGVuZChbXCJheGlzXCJdLHRoaXMub3B0aW9ucy5tYXJnaW4sdC5tYXJnaW4pLFwiaXRlbVwiaW4gdC5tYXJnaW4mJihcIm51bWJlclwiPT10eXBlb2YgdC5tYXJnaW4uaXRlbT8odGhpcy5vcHRpb25zLm1hcmdpbi5pdGVtLmhvcml6b250YWw9dC5tYXJnaW4uaXRlbSx0aGlzLm9wdGlvbnMubWFyZ2luLml0ZW0udmVydGljYWw9dC5tYXJnaW4uaXRlbSk6XCJvYmplY3RcIj09PSgwLGguZGVmYXVsdCkodC5tYXJnaW4uaXRlbSkmJmwuc2VsZWN0aXZlRXh0ZW5kKFtcImhvcml6b250YWxcIixcInZlcnRpY2FsXCJdLHRoaXMub3B0aW9ucy5tYXJnaW4uaXRlbSx0Lm1hcmdpbi5pdGVtKSkpKSxcImVkaXRhYmxlXCJpbiB0JiYoXCJib29sZWFuXCI9PXR5cGVvZiB0LmVkaXRhYmxlPyh0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlVGltZT10LmVkaXRhYmxlLHRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVHcm91cD10LmVkaXRhYmxlLHRoaXMub3B0aW9ucy5lZGl0YWJsZS5hZGQ9dC5lZGl0YWJsZSx0aGlzLm9wdGlvbnMuZWRpdGFibGUucmVtb3ZlPXQuZWRpdGFibGUsdGhpcy5vcHRpb25zLmVkaXRhYmxlLm92ZXJyaWRlSXRlbXM9ITEpOlwib2JqZWN0XCI9PT0oMCxoLmRlZmF1bHQpKHQuZWRpdGFibGUpJiZsLnNlbGVjdGl2ZUV4dGVuZChbXCJ1cGRhdGVUaW1lXCIsXCJ1cGRhdGVHcm91cFwiLFwiYWRkXCIsXCJyZW1vdmVcIixcIm92ZXJyaWRlSXRlbXNcIl0sdGhpcy5vcHRpb25zLmVkaXRhYmxlLHQuZWRpdGFibGUpKSxcImdyb3VwRWRpdGFibGVcImluIHQmJihcImJvb2xlYW5cIj09dHlwZW9mIHQuZ3JvdXBFZGl0YWJsZT8odGhpcy5vcHRpb25zLmdyb3VwRWRpdGFibGUub3JkZXI9dC5ncm91cEVkaXRhYmxlLHRoaXMub3B0aW9ucy5ncm91cEVkaXRhYmxlLmFkZD10Lmdyb3VwRWRpdGFibGUsdGhpcy5vcHRpb25zLmdyb3VwRWRpdGFibGUucmVtb3ZlPXQuZ3JvdXBFZGl0YWJsZSk6XCJvYmplY3RcIj09PSgwLGguZGVmYXVsdCkodC5ncm91cEVkaXRhYmxlKSYmbC5zZWxlY3RpdmVFeHRlbmQoW1wib3JkZXJcIixcImFkZFwiLFwicmVtb3ZlXCJdLHRoaXMub3B0aW9ucy5ncm91cEVkaXRhYmxlLHQuZ3JvdXBFZGl0YWJsZSkpO1tcIm9uRHJvcE9iamVjdE9uSXRlbVwiLFwib25BZGRcIixcIm9uVXBkYXRlXCIsXCJvblJlbW92ZVwiLFwib25Nb3ZlXCIsXCJvbk1vdmluZ1wiLFwib25BZGRHcm91cFwiLFwib25Nb3ZlR3JvdXBcIixcIm9uUmVtb3ZlR3JvdXBcIl0uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgaT10W2VdO2lmKGkpe2lmKCEoaSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSl0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb24gXCIrZStcIiBtdXN0IGJlIGEgZnVuY3Rpb24gXCIrZStcIihpdGVtLCBjYWxsYmFjaylcIik7dGhpcy5vcHRpb25zW2VdPWl9fS5iaW5kKHRoaXMpKSx0aGlzLm1hcmtEaXJ0eSgpfX0sbi5wcm90b3R5cGUubWFya0RpcnR5PWZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXBJZHM9W10sdCYmdC5yZWZyZXNoSXRlbXMmJmwuZm9yRWFjaCh0aGlzLml0ZW1zLGZ1bmN0aW9uKHQpe3QuZGlydHk9ITAsdC5kaXNwbGF5ZWQmJnQucmVkcmF3KCl9KX0sbi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuaGlkZSgpLHRoaXMuc2V0SXRlbXMobnVsbCksdGhpcy5zZXRHcm91cHMobnVsbCksdGhpcy5oYW1tZXI9bnVsbCx0aGlzLmJvZHk9bnVsbCx0aGlzLmNvbnZlcnNpb249bnVsbH0sbi5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUmJnRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZnJhbWUpLHRoaXMuZG9tLmF4aXMucGFyZW50Tm9kZSYmdGhpcy5kb20uYXhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmF4aXMpLHRoaXMuZG9tLmxhYmVsU2V0LnBhcmVudE5vZGUmJnRoaXMuZG9tLmxhYmVsU2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ubGFiZWxTZX
21167QpfSxuLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZXx8dGhpcy5ib2R5LmRvbS5jZW50ZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20uZnJhbWUpLHRoaXMuZG9tLmF4aXMucGFyZW50Tm9kZXx8dGhpcy5ib2R5LmRvbS5iYWNrZ3JvdW5kVmVydGljYWwuYXBwZW5kQ2hpbGQodGhpcy5kb20uYXhpcyksdGhpcy5kb20ubGFiZWxTZXQucGFyZW50Tm9kZXx8KHRoaXMub3B0aW9ucy5ydGw/dGhpcy5ib2R5LmRvbS5yaWdodC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5sYWJlbFNldCk6dGhpcy5ib2R5LmRvbS5sZWZ0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmxhYmVsU2V0KSl9LG4ucHJvdG90eXBlLnNldFNlbGVjdGlvbj1mdW5jdGlvbih0KXt2YXIgZSxpLG8sbjtmb3Iodm9pZCAwPT10JiYodD1bXSksQXJyYXkuaXNBcnJheSh0KXx8KHQ9W3RdKSxlPTAsaT10aGlzLnNlbGVjdGlvbi5sZW5ndGg7ZTxpO2UrKylvPXRoaXMuc2VsZWN0aW9uW2VdLChuPXRoaXMuaXRlbXNbb10pJiZuLnVuc2VsZWN0KCk7Zm9yKHRoaXMuc2VsZWN0aW9uPVtdLGU9MCxpPXQubGVuZ3RoO2U8aTtlKyspbz10W2VdLChuPXRoaXMuaXRlbXNbb10pJiYodGhpcy5zZWxlY3Rpb24ucHVzaChvKSxuLnNlbGVjdCgpKX0sbi5wcm90b3R5cGUuZ2V0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uLmNvbmNhdChbXSl9LG4ucHJvdG90eXBlLmdldFZpc2libGVJdGVtcz1mdW5jdGlvbigpe3ZhciB0LGUsaT10aGlzLmJvZHkucmFuZ2UuZ2V0UmFuZ2UoKTt0aGlzLm9wdGlvbnMucnRsPyh0PXRoaXMuYm9keS51dGlsLnRvU2NyZWVuKGkuc3RhcnQpLGU9dGhpcy5ib2R5LnV0aWwudG9TY3JlZW4oaS5lbmQpKTooZT10aGlzLmJvZHkudXRpbC50b1NjcmVlbihpLnN0YXJ0KSx0PXRoaXMuYm9keS51dGlsLnRvU2NyZWVuKGkuZW5kKSk7dmFyIG89W107Zm9yKHZhciBuIGluIHRoaXMuZ3JvdXBzKWlmKHRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KG4pKWZvcih2YXIgcz10aGlzLmdyb3Vwc1tuXSxyPXMuaXNWaXNpYmxlP3MudmlzaWJsZUl0ZW1zOltdLGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIGg9clthXTt0aGlzLm9wdGlvbnMucnRsP2gucmlnaHQ8ZSYmaC5yaWdodCtoLndpZHR
21167oPnQmJm8ucHVzaChoLmlkKTpoLmxlZnQ8dCYmaC5sZWZ0K2gud2lkdGg+ZSYmby5wdXNoKGguaWQpfXJldHVybiBvfSxuLnByb3RvdHlwZS5fZGVzZWxlY3Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuc2VsZWN0aW9uLGk9MCxvPWUubGVuZ3RoO2k8bztpKyspaWYoZVtpXT09dCl7ZS5zcGxpY2UoaSwxKTticmVha319LG4ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5tYXJnaW4sZT10aGlzLmJvZHkucmFuZ2UsaT1sLm9wdGlvbi5hc1NpemUsbz10aGlzLm9wdGlvbnMsbj1vLm9yaWVudGF0aW9uLml0ZW0scz0hMSxyPXRoaXMuZG9tLmZyYW1lO3RoaXMucHJvcHMudG9wPXRoaXMuYm9keS5kb21Qcm9wcy50b3AuaGVpZ2h0K3RoaXMuYm9keS5kb21Qcm9wcy5ib3JkZXIudG9wLHRoaXMub3B0aW9ucy5ydGw/dGhpcy5wcm9wcy5yaWdodD10aGlzLmJvZHkuZG9tUHJvcHMucmlnaHQud2lkdGgrdGhpcy5ib2R5LmRvbVByb3BzLmJvcmRlci5yaWdodDp0aGlzLnByb3BzLmxlZnQ9dGhpcy5ib2R5LmRvbVByb3BzLmxlZnQud2lkdGgrdGhpcy5ib2R5LmRvbVByb3BzLmJvcmRlci5sZWZ0LHIuY2xhc3NOYW1lPVwidmlzLWl0ZW1zZXRcIixzPXRoaXMuX29yZGVyR3JvdXBzKCl8fHM7dmFyIGE9ZS5lbmQtZS5zdGFydCxoPWEhPXRoaXMubGFzdFZpc2libGVJbnRlcnZhbHx8dGhpcy5wcm9wcy53aWR0aCE9dGhpcy5wcm9wcy5sYXN0V2lkdGgsZD1lLnN0YXJ0IT10aGlzLmxhc3RSYW5nZVN0YXJ0LHU9by5zdGFjayE9dGhpcy5sYXN0U3RhY2ssYz1vLnN0YWNrU3ViZ3JvdXBzIT10aGlzLmxhc3RTdGFja1N1Ymdyb3VwcyxwPWh8fGR8fHV8fGM7dGhpcy5sYXN0VmlzaWJsZUludGVydmFsPWEsdGhpcy5sYXN0UmFuZ2VTdGFydD1lLnN0YXJ0LHRoaXMubGFzdFN0YWNrPW8uc3RhY2ssdGhpcy5sYXN0U3RhY2tTdWJncm91cHM9by5zdGFja1N1Ymdyb3Vwcyx0aGlzLnByb3BzLmxhc3RXaWR0aD10aGlzLnByb3BzLndpZHRoO3ZhciBmPXRoaXMuX2ZpcnN0R3JvdXAoKSxtPXtpdGVtOnQuaXRlbSxheGlzOnQuYXhpc30sdj17aXRlbTp0Lml0ZW0sYXhpczp0Lml0ZW0udmVydGljYWwvMn0sZz0wLHk9dC5heGlzK3QuaXRlbS52ZXJ0aWNhbDt0aGlzLmdyb3Vwc1trXS5yZWRyYXcoZSx2LHApO3ZhciBiPXt9LF89MDtpZihsLmZvckVhY2godGhpcy5ncm91cHMsZnVuY3Rpb24odCxpKXtpZihpIT09ayl7dmFyIG89dD09Zj9tOnY7YltpXT10LnJlZHJhdyhlLG8scCwhMCksXz1iW2ldLmxlbmd0aH19KSxfPjApe2Zvcih2YXIgdz17fSx4PTA7eDxfO3grKylsLmZvckVhY2goYixmdW5jdGlvbih0LGUpe3dbZV09dFt4XSgpfSk7bC5mb3JFYWNoKHRoaXMuZ3JvdXBzLGZ1bmN0aW9uKHQsZSl7aWYoZSE9PWspe3ZhciBpPXdbZV07cz1pfHxzLGcrPXQuaGVpZ2h0fX0pLGc9TWF0aC5tYXgoZyx5KX1yZXR1cm4gZz1NYXRoLm1heChnLHkpLHIuc3R5bGUuaGVpZ2h0PWkoZyksdGhpcy5wcm9wcy53aWR0aD1yLm9mZnNldFdpZHRoLHRoaXMucHJvcHMuaGVpZ2h0PWcsdGhpcy5kb20uYXhpcy5zdHlsZS50b3A9aShcInRvcFwiPT1uP3RoaXMuYm9keS5kb21Qcm9wcy50b3AuaGVpZ2h0K3RoaXMuYm9keS5kb21Qcm9wcy5ib3JkZXIudG9wOnRoaXMuYm9keS5kb21Qcm9wcy50b3AuaGVpZ2h0K3RoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXJDb250YWluZXIuaGVpZ2h0KSx0aGlzLm9wdGlvbnMucnRsP3RoaXMuZG9tLmF4aXMuc3R5bGUucmlnaHQ9XCIwXCI6dGhpcy5kb20uYXhpcy5zdHlsZS5sZWZ0PVwiMFwiLHRoaXMuaW5pdGlhbEl0ZW1TZXREcmF3bj0hMCxzPXRoaXMuX2lzUmVzaXplZCgpfHxzfSxuLnByb3RvdHlwZS5fZmlyc3RHcm91cD1mdW5jdGlvbigpe3ZhciB0PVwidG9wXCI9PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtPzA6dGhpcy5ncm91cElkcy5sZW5ndGgtMSxlPXRoaXMuZ3JvdXBJZHNbdF07cmV0dXJuIHRoaXMuZ3JvdXBzW2VdfHx0aGlzLmdyb3Vwc1t4XXx8bnVsbH0sbi5wcm90b3R5cGUuX3VwZGF0ZVVuZ3JvdXBlZD1mdW5jdGlvbigpe3ZhciB0LGUsaT10aGlzLmdyb3Vwc1t4XTtpZih0aGlzLmdyb3Vwc0RhdGEpe2lmKGkpe2kuaGlkZSgpLGRlbGV0ZSB0aGlzLmdyb3Vwc1t4XTtmb3IoZSBpbiB0aGlzLml0ZW1zKWlmKHRoaXMuaXRlbXMuaGFzT3duUHJvcGVydHkoZSkpe3Q9dGhpcy5pdGVtc1tlXSx0LnBhcmVudCYmdC5wYXJlbnQucmVtb3ZlKHQpO3ZhciBvPXRoaXMuX2dldEdyb3VwSWQodC5kYXRhKSxuPXRoaXMuZ3JvdXBzW29dO24mJm4uYWRkKHQpfHx0LmhpZGUoKX19fWVsc2UgaWYoIWkpe2k9bmV3IG0obnVsbCxudWxsLHRoaXMpLHRoaXMuZ3JvdXBzW3hdPWk7Zm9yKGUgaW4gdGhpcy5pdGVtcyl0aGlzLml0ZW1zLmhhc093blByb3BlcnR5KGUpJiYodD10aGlzLml0ZW1zW2VdLGkuYWRkKHQpKTtpLnNob3coKX19LG4ucHJvdG90eXBlLmdldExhYmVsU2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tLmxhYmVsU2V0fSxuLnByb3RvdHlwZS5zZXRJdGVtcz1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMsbz10aGlzLml0ZW1zRGF0YTtpZih0KXtpZighKHQgaW5zdGFuY2VvZiB1fHx0IGluc3RhbmNlb2YgYykpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRhdGEgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBEYXRhU2V0IG9yIERhdGFWaWV3XCIpO3RoaXMuaXRlbXNEYXRhPXR9ZWxzZSB0aGlzLml0ZW1zRGF0YT1udWxsO2lmKG8mJihsLmZvckVhY2godGhpcy5pdGVtTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7by5vZmYoZSx0KX0pLGU9by5nZXRJZHMoKSx0aGlzLl9vblJlbW92ZShlKSksdGhpcy5pdGVtc0RhdGEpe3ZhciBuPXRoaXMuaWQ7bC5mb3JFYWNoKHRoaXMuaXRlbUxpc3RlbmVycyxmdW5jdGlvbih0LGUpe2kuaXRlbXNEYXRhLm9uKGUsdCxuKX0pLGU9dGhpcy5pdGVtc0RhdGEuZ2V0SWRzKCksdGhpcy5fb25BZGQoZSksdGhpcy5fdXBkYXRlVW5ncm91cGVkKCl9dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9jaGFuZ2VcIix7cXVldWU6ITB9KX0sbi5wcm90b3R5cGUuZ2V0SXRlbXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVtc0RhdGF9LG4ucHJvdG90eXBlLnNldEdyb3Vwcz1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXM7aWYodGhpcy5ncm91cHNEYXRhJiYobC5mb3JFYWNoKHRoaXMuZ3JvdXBMaXN0ZW5lcnMsZnVuY3Rpb24odCxlKXtpLmdyb3Vwc0RhdGEub2ZmKGUsdCl9KSxlPXRoaXMuZ3JvdXBzRGF0YS5nZXRJZHMoKSx0aGlzLmdyb3Vwc0RhdGE9bnVsbCx0aGlzLl9vblJlbW92ZUdyb3VwcyhlKSksdCl7aWYoISh0IGluc3RhbmNlb2YgdXx8dCBpbnN0YW5jZW9mIGMpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJEYXRhIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRGF0YVNldCBvciBEYXRhVmlld1wiKTt0aGlzLmdyb3Vwc0RhdGE9dH1lbHNlI
21167HRoaXMuZ3JvdXBzRGF0YT1udWxsO2lmKHRoaXMuZ3JvdXBzRGF0YSl7dmFyIG89dGhpcy5ncm91cHNEYXRhO3RoaXMuZ3JvdXBzRGF0YSBpbnN0YW5jZW9mIGMmJihvPXRoaXMuZ3JvdXBzRGF0YS5nZXREYXRhU2V0KCkpLG8uZ2V0KCkuZm9yRWFjaChmdW5jdGlvbih0KXt0Lm5lc3RlZEdyb3VwcyYmdC5uZXN0ZWRHcm91cHMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgaT1vLmdldChlKTtpLm5lc3RlZEluR3JvdXA9dC5pZCwwPT10LnNob3dOZXN0ZWQmJihpLnZpc2libGU9ITEpLG8udXBkYXRlKGkpfSl9KTt2YXIgbj10aGlzLmlkO2wuZm9yRWFjaCh0aGlzLmdyb3VwTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7aS5ncm91cHNEYXRhLm9uKGUsdCxuKX0pLGU9dGhpcy5ncm91cHNEYXRhLmdldElkcygpLHRoaXMuX29uQWRkR3JvdXBzKGUpfXRoaXMuX3VwZGF0ZVVuZ3JvdXBlZCgpLHRoaXMuX29yZGVyKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9jaGFuZ2VcIix7cXVldWU6ITB9KX0sbi5wcm90b3R5cGUuZ2V0R3JvdXBzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3JvdXBzRGF0YX0sbi5wcm90b3R5cGUucmVtb3ZlSXRlbT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLml0ZW1zRGF0YS5nZXQodCksaT10aGlzLml0ZW1zRGF0YS5nZXREYXRhU2V0KCk7ZSYmdGhpcy5vcHRpb25zLm9uUmVtb3ZlKGUsZnVuY3Rpb24oZSl7ZSYmaS5yZW1vdmUodCl9KX0sbi5wcm90b3R5cGUuX2dldFR5cGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZXx8dGhpcy5vcHRpb25zLnR5cGV8fCh0LmVuZD9cInJhbmdlXCI6XCJib3hcIil9LG4ucHJvdG90eXBlLl9nZXRHcm91cElkPWZ1bmN0aW9uKHQpe3JldHVyblwiYmFja2dyb3VuZFwiPT10aGlzLl9nZXRUeXBlKHQpJiZ2b2lkIDA9PXQuZ3JvdXA/azp0aGlzLmdyb3Vwc0RhdGE/dC5ncm91cDp4fSxuLnByb3RvdHlwZS5fb25VcGRhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGksbz1lLml0ZW1zRGF0YS5nZXQodCxlLml0ZW1PcHRpb25zKSxzPWUuaXRlbXNbdF0scj1vP2UuX2dldFR5cGUobyk6bnVsbCxhPW4udHlwZXNbcl07aWYocyYmKGEmJnMgaW5zdGFuY2VvZiBhP2UuX3VwZGF0ZUl0ZW0ocyxvKTooaT1zLnNlbGVjdGVkLGUuX3JlbW92ZUl0ZW0ocykscz1udWxsKSksIXMmJm8pe2lmKCFhKXRocm93XCJyYW5nZW92ZXJmbG93XCI9PXI/bmV3IFR5cGVFcnJvcignSXRlbSB0eXBlIFwicmFuZ2VvdmVyZmxvd1wiIGlzIGRlcHJlY2F0ZWQuIFVzZSBjc3Mgc3R5bGluZyBpbnN0ZWFkOiAudmlzLWl0ZW0udmlzLXJhbmdlIC52aXMtaXRlbS1jb250ZW50IHtvdmVyZmxvdzogdmlzaWJsZTt9Jyk6bmV3IFR5cGVFcnJvcignVW5rbm93biBpdGVtIHR5cGUgXCInK3IrJ1wiJyk7cz1uZXcgYShvLGUuY29udmVyc2lvbixlLm9wdGlvbnMpLHMuaWQ9dCxlLl9hZGRJdGVtKHMpLGkmJih0aGlzLnNlbGVjdGlvbi5wdXNoKHQpLHMuc2VsZWN0KCkpfX0uYmluZCh0aGlzKSksdGhpcy5fb3JkZXIoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2NoYW5nZVwiLHtxdWV1ZTohMH0pfSxuLnByb3RvdHlwZS5fb25BZGQ9bi5wcm90b3R5cGUuX29uVXBkYXRlLG4ucHJvdG90eXBlLl9vblJlbW92ZT1mdW5jdGlvbih0KXt2YXIgZT0wLGk9dGhpczt0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG89aS5pdGVtc1t0XTtvJiYoZSsrLGkuX3JlbW92ZUl0ZW0obykpfSksZSYmKHRoaXMuX29yZGVyKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9jaGFuZ2VcIix7cXVldWU6ITB9KSl9LG4ucHJvdG90eXBlLl9vcmRlcj1mdW5jdGlvbigpe2wuZm9yRWFjaCh0aGlzLmdyb3VwcyxmdW5jdGlvbih0KXt0Lm9yZGVyKCl9KX0sbi5wcm90b3R5cGUuX29uVXBkYXRlR3JvdXBzPWZ1bmN0aW9uKHQpe3RoaXMuX29uQWRkR3JvdXBzKHQpfSxuLnByb3RvdHlwZS5fb25BZGRHcm91cHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGk9ZS5ncm91cHNEYXRhLmdldCh0KSxvPWUuZ3JvdXBzW3RdO2lmKG8pby5zZXREYXRhKGkpO2Vsc2V7aWYodD09eHx8dD09ayl0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIGdyb3VwIGlkLiBcIit0K1wiIGlzIGEgcmVzZXJ2ZWQgaWQuXCIpO3ZhciBuPSgwLHIuZGVmYXVsdCkoZS5vcHRpb25zKTtsLmV4dGVuZChuLHtoZWlnaHQ6bnVsbH0pLG89bmV3IG0odCxpLGUpLGUuZ3JvdXBzW3RdPW87Zm9yKHZhciBzIGluIGUuaXRlbXMpaWYoZS5pdGVtcy5oYXNPd25Qcm9wZXJ0eShzKSl7dmFyIGE9ZS5pdGVtc1tzXTthLmRhdGEuZ3JvdXA9PXQmJm8uYWRkKGEpfW8ub3JkZXIoKSxvLnNob3coKX19KSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2NoYW5nZVwiLHtxdWV1ZTohMH0pfSxuLnByb3RvdHlwZS5fb25SZW1vdmVHcm91cHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ncm91cHM7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBpPWVbdF07aSYmKGkuaGlkZSgpLGRlbGV0ZSBlW3RdKX0pLHRoaXMubWFya0RpcnR5KCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9jaGFuZ2VcIix7cXVldWU6ITB9KX0sbi5wcm90b3R5cGUuX29yZGVyR3JvdXBzPWZ1bmN0aW9uKCl7aWYodGhpcy5ncm91cHNEYXRhKXt2YXIgdD10aGlzLmdyb3Vwc0RhdGEuZ2V0SWRzKHtvcmRlcjp0aGlzLm9wdGlvbnMuZ3JvdXBPcmRlcn0pO3Q9dGhpcy5fb3JkZXJOZXN0ZWRHcm91cHModCk7dmFyIGU9IWwuZXF1YWxBcnJheSh0LHRoaXMuZ3JvdXBJZHMpO2lmKGUpe3ZhciBpPXRoaXMuZ3JvdXBzO3QuZm9yRWFjaChmdW5jdGlvbih0KXtpW3RdLmhpZGUoKX0pLHQuZm9yRWFjaChmdW5jdGlvbih0KXtpW3RdLnNob3coKX0pLHRoaXMuZ3JvdXBJZHM9dH1yZXR1cm4gZX1yZXR1cm4hMX0sbi5wcm90b3R5cGUuX29yZGVyTmVzdGVkR3JvdXBzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5ncm91cHNEYXRhLmdldCh0KTtpZihpLm5lc3RlZEluR3JvdXB8fGUucHVzaCh0KSxpLm5lc3RlZEdyb3Vwcyl7dmFyIG89dGhpcy5ncm91cHNEYXRhLmdldCh7ZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlLm5lc3RlZEluR3JvdXA9PXR9LG9yZGVyOnRoaXMub3B0aW9ucy5ncm91cE9yZGVyfSksbj1vLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5pZH0pO2U9ZS5jb25jYXQobil9fSx0aGlzKSxlfSxuLnByb3RvdHlwZS5fYWRkSXRlbT1mdW5jdGlvbih0KXt0aGlzLml0ZW1zW3QuaWRdPXQ7dmFyIGU9dGhpcy5fZ2V0R3JvdXBJZCh0LmRhdGEpLGk9dGhpcy5ncm91cHNbZV07aT9pJiZpLmRhdGEmJmkuZGF0YS5zaG93TmVzdGVkJiYodC5ncm91cFNob3dpbmc9ITApOnQuZ3JvdXBTaG93aW5nPSExLGkmJmkuYWRkKHQpfSxuLnByb3RvdHlwZS5fdXBkYXRlSXRlbT1mdW5jdGlvbih0LGUpe3Quc2V0RGF0YShlKTt2YXIgaT10aGlzLl9nZXRHcm91cElkKHQuZGF0YSksbz10aGlzLmdyb3Vwc1tpXTtvP28mJm8uZGF0YSYmby5kYXRhLnNob3dOZXN0ZWQmJih0Lmdyb3VwU2hvd2luZz0hMCk6dC5ncm91cFNob3dpbmc9ITF9LG4ucHJvdG90eXBlLl9yZW1vdmVJdGVtPWZ1bmN0aW9uKHQpe3QuaGlkZSgpLGRlbGV0ZSB0aGlzLml0ZW1zW3QuaWRdO3ZhciBlPXR
21167oaXMuc2VsZWN0aW9uLmluZGV4T2YodC5pZCk7LTEhPWUmJnRoaXMuc2VsZWN0aW9uLnNwbGljZShlLDEpLHQucGFyZW50JiZ0LnBhcmVudC5yZW1vdmUodCl9LG4ucHJvdG90eXBlLl9jb25zdHJ1Y3RCeUVuZEFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxpPTA7aTx0Lmxlbmd0aDtpKyspdFtpXWluc3RhbmNlb2YgYiYmZS5wdXNoKHRbaV0pO3JldHVybiBlfSxuLnByb3RvdHlwZS5fb25Ub3VjaD1mdW5jdGlvbih0KXt0aGlzLnRvdWNoUGFyYW1zLml0ZW09dGhpcy5pdGVtRnJvbVRhcmdldCh0KSx0aGlzLnRvdWNoUGFyYW1zLmRyYWdMZWZ0SXRlbT10LnRhcmdldC5kcmFnTGVmdEl0ZW18fCExLHRoaXMudG91Y2hQYXJhbXMuZHJhZ1JpZ2h0SXRlbT10LnRhcmdldC5kcmFnUmlnaHRJdGVtfHwhMSx0aGlzLnRvdWNoUGFyYW1zLml0ZW1Qcm9wcz1udWxsfSxuLnByb3RvdHlwZS5fZ2V0R3JvdXBJbmRleD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuZ3JvdXBJZHMubGVuZ3RoO2UrKylpZih0PT10aGlzLmdyb3VwSWRzW2VdKXJldHVybiBlfSxuLnByb3RvdHlwZS5fb25EcmFnU3RhcnQ9ZnVuY3Rpb24odCl7aWYoIXRoaXMudG91Y2hQYXJhbXMuaXRlbUlzRHJhZ2dpbmcpe3ZhciBlLGk9dGhpcy50b3VjaFBhcmFtcy5pdGVtfHxudWxsLG89dGhpcztpZihpJiYoaS5zZWxlY3RlZHx8dGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLml0ZW0pKXtpZih0aGlzLm9wdGlvbnMuZWRpdGFibGUub3ZlcnJpZGVJdGVtcyYmIXRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVUaW1lJiYhdGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZUdyb3VwKXJldHVybjtpZihudWxsIT1pLmVkaXRhYmxlJiYhaS5lZGl0YWJsZS51cGRhdGVUaW1lJiYhaS5lZGl0YWJsZS51cGRhdGVHcm91cCYmIXRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zKXJldHVybjt2YXIgbj10aGlzLnRvdWNoUGFyYW1zLmRyYWdMZWZ0SXRlbSxzPXRoaXMudG91Y2hQYXJhbXMuZHJhZ1JpZ2h0SXRlbTtpZih0aGlzLnRvdWNoUGFyYW1zLml0ZW1Jc0RyYWdnaW5nPSEwLHRoaXMudG91Y2hQYXJhbXMuc2VsZWN0ZWRJdGVtPWksbillPXtpdGVtOm4saW5pdGlhbFg6dC5jZW50ZXIueCxkcmFnTGVmdDohMCxkYXRhOnRoaXMuX2Nsb25lSXRlbURhdGEoaS5kYXRhKX0sdGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHM9W2VdO2Vsc2UgaWYocyllPXtpdGVtOnMsaW5pdGlhbFg6dC5jZW50ZXIueCxkcmFnUmlnaHQ6ITAsZGF0YTp0aGlzLl9jbG9uZUl0ZW1EYXRhKGkuZGF0YSl9LHRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzPVtlXTtlbHNlIGlmKHRoaXMub3B0aW9ucy5lZGl0YWJsZS5hZGQmJih0LnNyY0V2ZW50LmN0cmxLZXl8fHQuc3JjRXZlbnQubWV0YUtleSkpdGhpcy5fb25EcmFnU3RhcnRBZGRJdGVtKHQpO2Vsc2V7dGhpcy5ncm91cElkcy5sZW5ndGg8MSYmdGhpcy5yZWRyYXcoKTt2YXIgcj10aGlzLl9nZXRHcm91cEluZGV4KGkuZGF0YS5ncm91cCksYT10aGlzLm9wdGlvbnMuaXRlbXNBbHdheXNEcmFnZ2FibGUuaXRlbSYmIWkuc2VsZWN0ZWQ/W2kuaWRdOnRoaXMuZ2V0U2VsZWN0aW9uKCk7dGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHM9YS5tYXAoZnVuY3Rpb24oZSl7dmFyIGk9by5pdGVtc1tlXSxuPW8uX2dldEdyb3VwSW5kZXgoaS5kYXRhLmdyb3VwKTtyZXR1cm57aXRlbTppLGluaXRpYWxYOnQuY2VudGVyLngsZ3JvdXBPZmZzZXQ6ci1uLGRhdGE6dGhpcy5fY2xvbmVJdGVtRGF0YShpLmRhdGEpfX0uYmluZCh0aGlzKSl9dC5zdG9wUHJvcGFnYXRpb24oKX1lbHNlIHRoaXMub3B0aW9ucy5lZGl0YWJsZS5hZGQmJih0LnNyY0V2ZW50LmN0cmxLZXl8fHQuc3JjRXZlbnQubWV0YUtleSkmJnRoaXMuX29uRHJhZ1N0YXJ0QWRkSXRlbSh0KX19LG4ucHJvdG90eXBlLl9vbkRyYWdTdGFydEFkZEl0ZW09ZnVuY3Rpb24odCl7dmFyIGUsaSxvPXRoaXMub3B0aW9ucy5zbmFwfHxudWxsO3RoaXMub3B0aW9ucy5ydGw/KGU9bC5nZXRBYnNvbHV0ZVJpZ2h0KHRoaXMuZG9tLmZyYW1lKSxpPWUtdC5jZW50ZXIueCsxMCk6KGU9bC5nZXRBYnNvbHV0ZUxlZnQodGhpcy5kb20uZnJhbWUpLGk9dC5jZW50ZXIueC1lLTEwKTt2YXIgbj10aGlzLmJvZHkudXRpbC50b1RpbWUoaSkscz10aGlzLmJvZHkudXRpbC5nZXRTY2FsZSgpLHI9dGhpcy5ib2R5LnV0aWwuZ2V0U3RlcCgpLGE9bz9vKG4scyxyKTpuLGg9YSxkPXt0eXBlOlwicmFuZ2VcIixzdGFydDphLGVuZDpoLGNvbnRlbnQ6XCJuZXcgaXRlbVwifSx1PWwucmFuZG9tVVVJRCgpO2RbdGhpcy5pdGVtc0RhdGEuX2ZpZWxkSWRdPXU7dmFyIGM9dGhpcy5ncm91cEZyb21UYXJnZXQodCk7YyYmKGQuZ3JvdXA9Yy5ncm91cElkKTt2YXIgcD1uZXcgYihkLHRoaXMuY29udmVyc2lvbix0aGlzLm9wdGlvbnMpO3AuaWQ9dSxwLmRhdGE9dGhpcy5fY2xvbmVJdGVtRGF0YShkKSx0aGlzLl9hZGRJdGVtKHApLHRoaXMudG91Y2hQYXJhbXMuc2VsZWN0ZWRJdGVtPXA7dmFyIGY9e2l0ZW06cCxpbml0aWFsWDp0LmNlbnRlci54LGRhdGE6cC5kYXRhfTt0aGlzLm9wdGlvbnMucnRsP2YuZHJhZ0xlZnQ9ITA6Zi5kcmFnUmlnaHQ9ITAsdGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHM9W2ZdLHQuc3RvcFByb3BhZ2F0aW9uKCl9LG4ucHJvdG90eXBlLl9vbkRyYWc9ZnVuY3Rpb24odCl7aWYodGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHMpe3Quc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGUsaT10aGlzLG89dGhpcy5vcHRpb25zLnNuYXB8fG51bGw7ZT10aGlzLm9wdGlvbnMucnRsP3RoaXMuYm9keS5kb20ucm9vdC5vZmZzZXRMZWZ0K3RoaXMuYm9keS5kb21Qcm9wcy5yaWdodC53aWR0aDp0aGlzLmJvZHkuZG9tLnJvb3Qub2Zmc2V0TGVmdCt0aGlzLmJvZHkuZG9tUHJvcHMubGVmdC53aWR0aDt2YXIgbj10aGlzLmJvZHkudXRpbC5nZXRTY2FsZSgpLHM9dGhpcy5ib2R5LnV0aWwuZ2V0U3RlcCgpLHI9dGhpcy50b3VjaFBhcmFtcy5zZWxlY3RlZEl0ZW0sYT0odGhpcy5vcHRpb25zLmVkaXRhYmxlLm92ZXJyaWRlSXRlbXN8fG51bGw9PXIuZWRpdGFibGUpJiZ0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlR3JvdXB8fCF0aGlzLm9wdGlvbnMuZWRpdGFibGUub3ZlcnJpZGVJdGVtcyYmbnVsbCE9ci5lZGl0YWJsZSYmci5lZGl0YWJsZS51cGRhdGVHcm91cCxoPW51bGw7aWYoYSYmciYmdm9pZCAwIT1yLmRhdGEuZ3JvdXApe3ZhciBkPWkuZ3JvdXBGcm9tVGFyZ2V0KHQpO2QmJihoPXRoaXMuX2dldEdyb3VwSW5kZXgoZC5ncm91cElkKSl9dGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHMuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgdSxjLHAsZixtLHY9aS5ib2R5LnV0aWwudG9UaW1lKHQuY2VudGVyLngtZSksZz1pLmJvZHkudXRpbC50b1RpbWUoZC5pbml0aWFsWC1lKTt1PXRoaXMub3B0aW9ucy5ydGw/LSh2LWcpOnYtZzt2YXIgeT10aGlzLl9jbG9uZUl0ZW1EYXRhKGQuaXRlbS5kYXRhKTtpZihudWxsPT1kLml0ZW0uZWRpdGFibGV8fGQuaXRlbS5lZGl0YWJsZS51cGRhdGVUaW1lfHxkLml0ZW0uZWRpdGFibGUudXBkYXRlR3JvdXB8fGkub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zKXtpZigodGhpcy5vcHRpb25zLmVkaXRhYmxlLm92ZXJyaWRlSXRlbXN8fG51bGw9PXIuZWRpdGFibGUpJiZ0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlVGltZXx8IXRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zJiZudWxsIT1yLmVkaXRhYmxlJiZyLmVkaXRhYmxlLnVwZGF0ZVRpbWUpaWYoZC5kcmFnTGVmdCl0aGlzLm9wdGlvbnMucnRsP3ZvaWQgMCE9eS5lbmQmJihwPWwuY29udmVydChkLmRhdGEuZW5kLFwiRGF0ZVwiKSxtPW5ldyBEYXRlKHAudmFsdWVPZigpK3UpLHkuZW5kPW8/byhtLG4scyk6bSk6dm9pZCAwIT15LnN0YXJ0JiYoYz1sLmNvbnZlcnQoZC5kYXRhLnN0YXJ0LFwiRGF0ZVwiKSxmPW5ldyBEYXRlKGMudmFsdWVPZigpK3UpLHkuc3RhcnQ9bz9vKGYsbixzKTpmKTtlbHNlIGlmKGQuZHJhZ1JpZ2h0KXRoaXMub3B0aW9ucy5ydGw/dm9pZCAwIT15LnN0YXJ0JiYoYz1sLmNvbnZlcnQoZC5kYXRhLnN0YXJ0LFwiRGF0ZVwiKSxmPW5ldyBEYXRlKGMudmFsdWVPZigpK3UpLHkuc3RhcnQ9bz9vKGYsbixzKTpmKTp2b2lkIDAhPXkuZW5kJiYocD1sLmNvbnZlcnQoZC5kYXRhLmVuZCxcIkRhdGVcIiksbT1uZXcgRGF0ZShwLnZhbHVlT2YoKSt1KSx5LmVuZD1vP28obSxuLHMpOm0pO2Vsc2UgaWYodm9pZCAwIT15LnN0YXJ0KWlmKGM9bC5jb252ZXJ0KGQuZGF0YS5zdGFydCxcIkRhdGVcIikudmFsdWVPZigpLGY9bmV3IERhdGUoYyt1KSx2b2lkIDAhPXkuZW5kKXtwPWwuY29udmVydChkLmRhdGEuZW5kLFwiRGF0ZVwiKTt2YXIgYj1wLnZhbHVlT2YoKS1jLnZhbHVlT2YoKTt5LnN0YXJ0PW8/byhmLG4scyk6Zix5LmVuZD1uZXcgRGF0ZSh5LnN0YXJ0LnZhbHVlT2YoKStiKX1lbHNlIHkuc3RhcnQ9bz9vKGYsbixzKTpmO2lmKGEmJiFkLmRyYWdMZWZ0JiYhZC5kcmFnUmlnaHQmJm51bGwhPWgmJnZvaWQgMCE9eS5ncm91cCl7dmFyIF89aC1kLmdyb3VwT2Zmc2V0O189TWF0aC5tYXgoMCxfKSxfPU1hdGgubWluKGkuZ3JvdXBJZHMubGVuZ3RoLTEsXykseS5ncm91cD1pLmdyb3VwSWRzW19dfXk9dGhpcy5fY2xvbmVJdGVtRGF0YSh5KSxpLm9wdGlvbnMub25Nb3ZpbmcoeSxmdW5jdGlvbih0KXt0JiZkLml0ZW0uc2V0RGF0YSh0aGlzLl9jbG9uZUl0ZW1EYXRhKHQsXCJEYXRlXCIpKX0uYmluZCh0aGlzKSl9fS5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2NoYW5nZVwiKX19LG4ucHJvdG90eXBlLl9tb3ZlVG9Hcm91cD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ3JvdXBzW2VdO2lmKGkmJmkuZ3JvdXBJZCE9dC5kYXRhLmdyb3VwKXt2YXIgbz10LnBhcmVudDtvLnJlbW92ZSh0KSxvLm9yZGVyKCksdC5kYXRhLmdyb3VwPWkuZ3JvdXBJZCxpLmFkZCh0KSxpLm9yZGVyKCl9fSxuLnByb3RvdHlwZS5fb25EcmFnRW5kPWZ1bmN0aW9uKHQpe2lmKHRoaXMudG91Y2h
21167QYXJhbXMuaXRlbUlzRHJhZ2dpbmc9ITEsdGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHMpe3Quc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGU9dGhpcyxpPXRoaXMuaXRlbXNEYXRhLmdldERhdGFTZXQoKSxvPXRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzO3RoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzPW51bGwsby5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBvPXQuaXRlbS5pZDtpZihudWxsIT1lLml0ZW1zRGF0YS5nZXQobyxlLml0ZW1PcHRpb25zKSl7dmFyIG49dGhpcy5fY2xvbmVJdGVtRGF0YSh0Lml0ZW0uZGF0YSk7ZS5vcHRpb25zLm9uTW92ZShuLGZ1bmN0aW9uKG4pe24/KG5baS5fZmllbGRJZF09byxpLnVwZGF0ZShuKSk6KHQuaXRlbS5zZXREYXRhKHQuZGF0YSksZS5ib2R5LmVtaXR0ZXIuZW1pdChcIl9jaGFuZ2VcIikpfSl9ZWxzZSBlLm9wdGlvbnMub25BZGQodC5pdGVtLmRhdGEsZnVuY3Rpb24oaSl7ZS5fcmVtb3ZlSXRlbSh0Lml0ZW0pLGkmJmUuaXRlbXNEYXRhLmdldERhdGFTZXQoKS5hZGQoaSksZS5ib2R5LmVtaXR0ZXIuZW1pdChcIl9jaGFuZ2VcIil9KX0uYmluZCh0aGlzKSl9fSxuLnByb3RvdHlwZS5fb25Hcm91cENsaWNrPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JvdXBGcm9tVGFyZ2V0KHQpO2lmKGUmJmUubmVzdGVkR3JvdXBzKXt2YXIgaT10aGlzLmdyb3Vwc0RhdGEuZ2V0RGF0YVNldCgpLG89aS5nZXQoZS5ncm91cElkKTt2b2lkIDA9PW8uc2hvd05lc3RlZCYmKG8uc2hvd05lc3RlZD0hMCksby5zaG93TmVzdGVkPSFvLnNob3dOZXN0ZWQ7dmFyIG49aS5nZXQoZS5uZXN0ZWRHcm91cHMpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC52aXNpYmxlPW8uc2hvd05lc3RlZCx0fSk7aWYoaS51cGRhdGUobi5jb25jYXQobykpLG8uc2hvd05lc3RlZClsLnJlbW92ZUNsYXNzTmFtZShlLmRvbS5sYWJlbCxcImNvbGxhcHNlZFwiKSxsLmFkZENsYXNzTmFtZShlLmRvbS5sYWJlbCxcImV4cGFuZGVkXCIpO2Vsc2V7bC5yZW1vdmVDbGFzc05hbWUoZS5kb20ubGFiZWwsXCJleHBhbmRlZFwiKTt2YXIgcz10aGlzLm9wdGlvbnMucnRsP1wiY29sbGFwc2VkLXJ0bFwiOlwiY29sbGFwc2VkXCI7bC5hZGRDbGFzc05hbWUoZS5kb20ubGFiZWwscyl9fX0sbi5wcm90b3R5cGUuX29uR3JvdXBEcmFnU3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLmdyb3VwRWRpdGFibGUub3JkZXImJih0aGlzLmdyb3VwVG91Y2hQYXJhbXMuZ3JvdXA9dGhpcy5ncm91cEZyb21UYXJnZXQodCksdGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwJiYodC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLmdyb3VwVG91Y2hQYXJhbXMub3JpZ2luYWxPcmRlcj10aGlzLmdyb3Vwc0RhdGEuZ2V0SWRzKHtvcmRlcjp0aGlzLm9wdGlvbnMuZ3JvdXBPcmRlcn0pKSl9LG4ucHJvdG90eXBlLl9vbkdyb3VwRHJhZz1mdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMuZ3JvdXBFZGl0YWJsZS5vcmRlciYmdGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwKXt0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBlPXRoaXMuZ3JvdXBzRGF0YTt0aGlzLmdyb3Vwc0RhdGEgaW5zdGFuY2VvZiBjJiYoZT10aGlzLmdyb3Vwc0RhdGEuZ2V0RGF0YVNldCgpKTt2YXIgaT10aGlzLmdyb3VwRnJvbVRhcmdldCh0KTtpZihpJiZpLmhlaWdodCE9dGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwLmhlaWdodCl7dmFyIG89aS50b3A8dGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwLnRvcCxuPXQuY2VudGVyP3QuY2VudGVyLnk6dC5jbGllbnRZLHM9bC5nZXRBYnNvbHV0ZVRvcChpLmRvbS5mb3JlZ3JvdW5kKSxyPXRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cC5oZWlnaHQ7aWYobyl7aWYocytyPG4pcmV0dXJufWVsc2V7aWYocytpLmhlaWdodC1yPm4pcmV0dXJufX1pZihpJiZpIT10aGlzLmdyb3VwVG91Y2hQYXJhbXMuZ3JvdXApe3ZhciBhPWUuZ2V0KGkuZ3JvdXBJZCksaD1lLmdldCh0aGlzLmdyb3VwVG91Y2hQYXJhbXMuZ3JvdXAuZ3JvdXBJZCk7aCYmYSYmKHRoaXMub3B0aW9ucy5ncm91cE9yZGVyU3dhcChoLGEsZSksZS51cGRhdGUoaCksZS51cGRhdGUoYSkpO3ZhciBkPWUuZ2V0SWRzKHtvcmRlcjp0aGlzLm9wdGlvbnMuZ3JvdXBPcmRlcn0pO2lmKCFsLmVxdWFsQXJyYXkoZCx0aGlzLmdyb3VwVG91Y2hQYXJhbXMub3JpZ2luYWxPcmRlcikpZm9yKHZhciB1PXRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5vcmlnaW5hbE9yZGVyLHA9dGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwLmdyb3VwSWQsZj1NYXRoLm1pbih1Lmxlbmd0aCxkLmxlbmd0aCksbT0wLHY9MCxnPTA7bTxmOyl7Zm9yKDttK3Y8ZiYmbStnPGYmJmRbbSt2XT09dVttK2ddOyltKys7aWYobSt2Pj1mKWJyZWFrO2lmKGRbbSt2XT09cCl2PTE7ZWxzZSBpZih1W20rZ109PXApZz0xO2Vsc2V7dmFyIHk9ZC5pbmRleE9mKHVbbStnXSksYj1lLmdldChkW20rdl0pLF89ZS5nZXQodVttK2ddKTt0aGlzLm9wdGlvbnMuZ3JvdXBPcmRlclN3YXAoYixfLGUpLGUudXBkYXRlKGIpLGUudXBkYXRlKF8pO3ZhciB3PWRbbSt2XTtkW20rdl09dVttK2ddLGRbeV09dyxtKyt9fX19fSxuLnByb3RvdHlwZS5fb25Hcm91cERyYWdFbmQ9ZnVuY3Rpb24odCl7aWYodGhpcy5vcHRpb25zLmdyb3VwRWRpdGFibGUub3JkZXImJnRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cCl7dC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgZT10aGlzLGk9ZS5ncm91cFRvdWNoUGFyYW1zLmdyb3VwLmdyb3VwSWQsbz1lLmdyb3Vwc0RhdGEuZ2V0RGF0YVNldCgpLG49bC5leHRlbmQoe30sby5nZXQoaSkpO2Uub3B0aW9ucy5vbk1vdmVHcm91cChuLGZ1bmN0aW9uKHQpe2lmKHQpdFtvLl9maWVsZElkXT1pLG8udXBkYXRlKHQpO2Vsc2V7dmFyIG49by5nZXRJZHMoe29yZGVyOmUub3B0aW9ucy5ncm91cE9yZGVyfSk7aWYoIWwuZXF1YWxBcnJheShuLGUuZ3JvdXBUb3VjaFBhcmFtcy5vcmlnaW5hbE9yZGVyKSlmb3IodmFyIHM9ZS5ncm91cFRvdWNoUGFyYW1zLm9yaWdpbmFsT3JkZXIscj1NYXRoLm1pbihzLmxlbmd0aCxuLmxlbmd0aCksYT0wO2E8cjspe2Zvcig7YTxyJiZuW2FdPT1zW2FdOylhKys7aWYoYT49cilicmVhazt2YXIgaD1uLmluZGV4T2Yoc1thXSksZD1vLmdldChuW2FdKSx1PW8uZ2V0KHNbYV0pO2Uub3B0aW9ucy5ncm91cE9yZGVyU3dhcChkLHUsbyksby51cGRhdGUoZCksby51cGRhdGUodSk7dmFyIGM9blthXTtuW2FdPXNbYV0sbltoXT1jLGErK319fSksZS5ib2R5LmVtaXR0ZXIuZW1pdChcImdyb3VwRHJhZ2dlZFwiLHtncm91cElkOml9KX19LG4ucHJvdG90eXBlLl9vblNlbGVjdEl0ZW09ZnVuY3Rpb24odCl7aWYodGhpcy5vcHRpb25zLnNlbGVjdGFibGUpe3ZhciBlPXQuc3JjRXZlbnQmJih0LnNyY0V2ZW50LmN0cmxLZXl8fHQuc3JjRXZlbnQubWV0YUtleSksaT10LnNyY0V2ZW50JiZ0LnNyY0V2ZW50LnNoaWZ0S2V5O2lmKGV8fGkpcmV0dXJuIHZvaWQgdGhpcy5fb25NdWx0aVNlbGVjdEl0ZW0odCk7dmFyIG89dGhpcy5nZXRTZWxlY3Rpb24oKSxuPXRoaXMuaXRlbUZyb21UYXJnZXQodCkscz1uP1tuLmlkXTpbXTt0aGlzLnNldFNlbGVjdGlvbihzKTt2YXIgcj10aGlzLmdldFNlbGVjdGlvbigpOyhyLmxlbmd0aD4wfHxvLmxlbmd0aD4wKSYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInNlbGVjdFwiLHtpdG
21167VtczpyLGV2ZW50OnR9KX19LG4ucHJvdG90eXBlLl9vbk1vdXNlT3Zlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLml0ZW1Gcm9tVGFyZ2V0KHQpO2lmKGUpe2lmKGUhPT10aGlzLml0ZW1Gcm9tUmVsYXRlZFRhcmdldCh0KSl7dmFyIGk9ZS5nZXRUaXRsZSgpO2lmKHRoaXMub3B0aW9ucy5zaG93VG9vbHRpcHMmJmkpe251bGw9PXRoaXMucG9wdXAmJih0aGlzLnBvcHVwPW5ldyB3KHRoaXMuYm9keS5kb20ucm9vdCx0aGlzLm9wdGlvbnMudG9vbHRpcC5vdmVyZmxvd01ldGhvZHx8XCJmbGlwXCIpKSx0aGlzLnBvcHVwLnNldFRleHQoaSk7dmFyIG89dGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXI7dGhpcy5wb3B1cC5zZXRQb3NpdGlvbih0LmNsaWVudFgtbC5nZXRBYnNvbHV0ZUxlZnQobykrby5vZmZzZXRMZWZ0LHQuY2xpZW50WS1sLmdldEFic29sdXRlVG9wKG8pK28ub2Zmc2V0VG9wKSx0aGlzLnBvcHVwLnNob3coKX1lbHNlIG51bGwhPXRoaXMucG9wdXAmJnRoaXMucG9wdXAuaGlkZSgpO3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJpdGVtb3ZlclwiLHtpdGVtOmUuaWQsZXZlbnQ6dH0pfX19LG4ucHJvdG90eXBlLl9vbk1vdXNlT3V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaXRlbUZyb21UYXJnZXQodCk7aWYoZSl7ZSE9PXRoaXMuaXRlbUZyb21SZWxhdGVkVGFyZ2V0KHQpJiYobnVsbCE9dGhpcy5wb3B1cCYmdGhpcy5wb3B1cC5oaWRlKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIml0ZW1vdXRcIix7aXRlbTplLmlkLGV2ZW50OnR9KSl9fSxuLnByb3RvdHlwZS5fb25Nb3VzZU1vdmU9ZnVuY3Rpb24odCl7aWYodGhpcy5pdGVtRnJvbVRhcmdldCh0KSYmdGhpcy5vcHRpb25zLnNob3dUb29sdGlwcyYmdGhpcy5vcHRpb25zLnRvb2x0aXAuZm9sbG93TW91c2UmJnRoaXMucG9wdXAmJiF0aGlzLnBvcHVwLmhpZGRlbil7dmFyIGU9dGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXI7dGhpcy5wb3B1cC5zZXRQb3NpdGlvbih0LmNsaWVudFgtbC5nZXRBYnNvbHV0ZUxlZnQoZSkrZS5vZmZzZXRMZWZ0LHQuY2xpZW50WS1sLmdldEFic29sdXRlVG9wKGUpK2Uub2Zmc2V0VG9wKSx0aGlzLnBvcHVwLnNob3coKX19LG4ucHJvdG90eXBlLl9vbk1vdXNlV2hlZWw9ZnVuY3Rpb24odCl7dGhpcy50b3VjaFBhcmFtcy5pdGVtSXNEcmFnZ2luZyYmdGhpcy5fb25EcmFnRW5kKHQpfSxuLnByb3RvdHlwZS5fb25VcGRhdGVJdGVtPWZ1bmN0aW9uKHQpe2lmKHRoaXMub3B0aW9ucy5zZWxlY3RhYmxlJiZ0aGlzLm9wdGlvbnMuZWRpdGFibGUuYWRkKXt2YXIgZT10aGlzO2lmKHQpe3ZhciBpPWUuaXRlbXNEYXRhLmdldCh0LmlkKTt0aGlzLm9wdGlvbnMub25VcGRhdGUoaSxmdW5jdGlvbih0KXt0JiZlLml0ZW1zRGF0YS5nZXREYXRhU2V0KCkudXBkYXRlKHQpfSl9fX0sbi5wcm90b3R5cGUuX29uRHJvcE9iamVjdE9uSXRlbT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLml0ZW1Gcm9tVGFyZ2V0KHQpLGk9SlNPTi5wYXJzZSh0LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dFwiKSk7dGhpcy5vcHRpb25zLm9uRHJvcE9iamVjdE9uSXRlbShpLGUpfSxuLnByb3RvdHlwZS5fb25BZGRJdGVtPWZ1bmN0aW9uKHQpe2lmKHRoaXMub3B0aW9ucy5zZWxlY3RhYmxlJiZ0aGlzLm9wdGlvbnMuZWRpdGFibGUuYWRkKXt2YXIgZSxpLG89dGhpcyxuPXRoaXMub3B0aW9ucy5zbmFwfHxudWxsO3RoaXMub3B0aW9ucy5ydGw/KGU9bC5nZXRBYnNvbHV0ZVJpZ2h0KHRoaXMuZG9tLmZyYW1lKSxpPWUtdC5jZW50ZXIueCk6KGU9bC5nZXRBYnNvbHV0ZUxlZnQodGhpcy5kb20uZnJhbWUpLGk9dC5jZW50ZXIueC1lKTt2YXIgcyxyLGE9dGhpcy5ib2R5LnV0aWwudG9UaW1lKGkpLGg9dGhpcy5ib2R5LnV0aWwuZ2V0U2NhbGUoKSxkPXRoaXMuYm9keS51dGlsLmdldFN0ZXAoKTtcImRyb3BcIj09dC50eXBlPyhyPUpTT04ucGFyc2UodC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShcInRleHRcIikpLHIuY29udGVudD1yLmNvbnRlbnQ/ci5jb250ZW50OlwibmV3IGl0ZW1cIixyLnN0YXJ0PXIuc3RhcnQ/ci5zdGFydDpuP24oYSxoLGQpOmEsci50eXBlPXIudHlwZXx8XCJib3hcIixyW3RoaXMuaXRlbXNEYXRhLl9maWVsZElkXT1yLmlkfHxsLnJhbmRvbVVVSUQoKSxcInJhbmdlXCIhPXIudHlwZXx8ci5lbmR8fChzPXRoaXMuYm9keS51dGlsLnRvVGltZShpK3RoaXMucHJvcHMud2lkdGgvNSksci5lbmQ9bj9uKHMsaCxkKTpzKSk6KHI9e3N0YXJ0Om4/bihhLGgsZCk6YSxjb250ZW50OlwibmV3IGl0ZW1cIn0sclt0aGlzLml0ZW1zRGF0YS5fZmllbGRJZF09bC5yYW5kb21VVUlEKCksXCJyYW5nZVwiPT09dGhpcy5vcHRpb25zLnR5cGUmJihzPXRoaXMuYm9keS51dGlsLnRvVGltZShpK3RoaXMucHJvcHMud2lkdGgvNSksci5lbmQ9bj9uKHMsaCxkKTpzKSk7dmFyIHU9dGhpcy5ncm91cEZyb21UYXJnZXQodCk7dSYmKHIuZ3JvdXA9dS5ncm91cElkKSxyPXRoaXMuX2Nsb25lSXRlbURhdGEociksdGhpcy5vcHRpb25zLm9uQWRkKHIsZnVuY3Rpb24oZSl7ZSYmKG8uaXRlbXNEYXRhLmdldERhdGFTZXQoKS5hZGQoZSksXCJkcm9wXCI9PXQudHlwZSYmby5zZXRTZWxlY3Rpb24oW2UuaWRdKSl9KX19LG4ucHJvdG90eXBlLl9vbk11bHRpU2VsZWN0SXRlbT1mdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMuc2VsZWN0YWJsZSl7dmFyIGU9dGhpcy5pdGVtRnJvbVRhcmdldCh0KTtpZihlKXtcbiAgICB2YXIgaT10aGlzLm9wdGlvbnMubXVsdGlzZWxlY3Q/dGhpcy5nZXRTZWxlY3Rpb24oKTpbXTtpZigodC5zcmNFdmVudCYmdC5zcmNFdmVudC5zaGlmdEtleXx8ITEpJiZ0aGlzLm9wdGlvbnMubXVsdGlzZWxlY3Qpe3ZhciBvPXRoaXMuaXRlbXNEYXRhLmdldChlLmlkKS5ncm91cCxzPXZvaWQgMDt0aGlzLm9wdGlvbnMubXVsdGlzZWxlY3RQZXJHcm91cCYmaS5sZW5ndGg+MCYmKHM9dGhpcy5pdGVtc0RhdGEuZ2V0KGlbMF0pLmdyb3VwKSx0aGlzLm9wdGlvbnMubXVsdGlzZWxlY3RQZXJHcm91cCYmdm9pZCAwIT1zJiZzIT1vfHxpLnB1c2goZS5pZCk7dmFyIHI9bi5fZ2V0SXRlbVJhbmdlKHRoaXMuaXRlbXNEYXRhLmdldChpLHRoaXMuaXRlbU9wdGlvbnMpKTtpZighdGhpcy5vcHRpb25zLm11bHRpc2VsZWN0UGVyR3JvdXB8fHM9PW8pe2k9W107Zm9yKHZhciBhIGluIHRoaXMuaXRlbXMpaWYodGhpcy5pdGVtcy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGg9dGhpcy5pdGVtc1thXSxkPWguZGF0YS5zdGFydCxsPXZvaWQgMCE9PWguZGF0YS5lbmQ/aC5kYXRhLmVuZDpkOyEoZD49ci5taW4mJmw8PXIubWF4KXx8dGhpcy5vcHRpb25zLm11bHRpc2VsZWN0UGVyR3JvdXAmJnMhPXRoaXMuaXRlbXNEYXRhLmdldChoLmlkKS5ncm91cHx8aCBpbnN0YW5jZW9mIF98fGkucHVzaChoLmlkKX19fWVsc2V7dmFyIHU9aS5pbmRleE9mKGUuaWQpOy0xPT11P2kucHVzaChlLmlkKTppLnNwbGljZSh1LDEpfXRoaXMuc2V0U2VsZWN0aW9uKGkpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJzZWxlY3RcIix7aXRlbXM6dGhpcy5nZXRTZWxlY3Rpb24oKSxldmVudDp0fSl9fX0sbi5fZ2V0SXRlbVJhbmdlPWZ1bmN0aW9uKHQpe3ZhciBlPW51bGwsaT1udWxsO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24odCl7KG51bGw9PWl8fHQuc3RhcnQ8aSkmJihpPXQuc3RhcnQpLHZvaWQgMCE9dC5lbmQ/KG51bGw9PWV8fHQuZW5kPmUpJiYoZT10LmVuZCk6KG51bGw9PWV8fHQuc3RhcnQ+ZSkmJihlPXQuc3RhcnQpfSkse21pbjppLG1heDplfX0sbi5wcm90b3R5cGUuaXRlbUZyb21FbGVtZW50PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10O2U7KXtpZihlLmhhc093blByb3BlcnR5KFwidGltZWxpbmUtaXRlbVwiKSlyZXR1cm4gZVtcInRpbWVsaW5lLWl0ZW
211671cIl07ZT1lLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9LG4ucHJvdG90eXBlLml0ZW1Gcm9tVGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZW1Gcm9tRWxlbWVudCh0LnRhcmdldCl9LG4ucHJvdG90eXBlLml0ZW1Gcm9tUmVsYXRlZFRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVtRnJvbUVsZW1lbnQodC5yZWxhdGVkVGFyZ2V0KX0sbi5wcm90b3R5cGUuZ3JvdXBGcm9tVGFyZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2VudGVyP3QuY2VudGVyLnk6dC5jbGllbnRZLGk9dGhpcy5ncm91cElkcztpLmxlbmd0aDw9MCYmdGhpcy5ncm91cHNEYXRhJiYoaT10aGlzLmdyb3Vwc0RhdGEuZ2V0SWRzKHtvcmRlcjp0aGlzLm9wdGlvbnMuZ3JvdXBPcmRlcn0pKTtmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIG49aVtvXSxzPXRoaXMuZ3JvdXBzW25dLHI9cy5kb20uZm9yZWdyb3VuZCxhPWwuZ2V0QWJzb2x1dGVUb3Aocik7aWYoZT5hJiZlPGErci5vZmZzZXRIZWlnaHQpcmV0dXJuIHM7aWYoXCJ0b3BcIj09PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtKXtpZihvPT09dGhpcy5ncm91cElkcy5sZW5ndGgtMSYmZT5hKXJldHVybiBzfWVsc2UgaWYoMD09PW8mJmU8YStyLm9mZnNldClyZXR1cm4gc31yZXR1cm4gbnVsbH0sbi5pdGVtU2V0RnJvbVRhcmdldD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC50YXJnZXQ7ZTspe2lmKGUuaGFzT3duUHJvcGVydHkoXCJ0aW1lbGluZS1pdGVtc2V0XCIpKXJldHVybiBlW1widGltZWxpbmUtaXRlbXNldFwiXTtlPWUucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH0sbi5wcm90b3R5cGUuX2Nsb25lSXRlbURhdGE9ZnVuY3Rpb24odCxlKXt2YXIgaT1sLmV4dGVuZCh7fSx0KTtyZXR1cm4gZXx8KGU9dGhpcy5pdGVtc0RhdGEuZ2V0RGF0YVNldCgpLl9vcHRpb25zLnR5cGUpLHZvaWQgMCE9aS5zdGFydCYmKGkuc3RhcnQ9bC5jb252ZXJ0KGkuc3RhcnQsZSYmZS5zdGFydHx8XCJEYXRlXCIpKSx2b2lkIDAhPWkuZW5kJiYoaS5lbmQ9bC5jb252ZXJ0KGkuZW5kLGUmJmUuZW5kfHxcIkRhdGVcIikpLGl9LHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7ZS5vcmRlckJ5U3RhcnQ9ZnVuY3Rpb24odCl7dC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZGF0YS5zdGFydC1lLmRhdGEuc3RhcnR9KX0sZS5vcmRlckJ5RW5kPWZ1bmN0aW9uKHQpe3Quc29ydChmdW5jdGlvbih0LGUpe3JldHVybihcImVuZFwiaW4gdC5kYXRhP3QuZGF0YS5lbmQ6dC5kYXRhLnN0YXJ0KS0oXCJlbmRcImluIGUuZGF0YT9lLmRhdGEuZW5kOmUuZGF0YS5zdGFydCl9KX0sZS5zdGFjaz1mdW5jdGlvbih0LGksbyl7aWYobylmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0W25dLnRvcD1udWxsO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcz10W25dO2lmKHMuc3RhY2smJm51bGw9PT1zLnRvcCl7cy50b3A9aS5heGlzO2Rve2Zvcih2YXIgcj1udWxsLGE9MCxoPXQubGVuZ3RoO2E8aDthKyspe3ZhciBkPXRbYV07aWYobnVsbCE9PWQudG9wJiZkIT09cyYmZC5zdGFjayYmZS5jb2xsaXNpb24ocyxkLGkuaXRlbSxkLm9wdGlvbnMucnRsKSl7cj1kO2JyZWFrfX1udWxsIT1yJiYocy50b3A9ci50b3Arci5oZWlnaHQraS5pdGVtLnZlcnRpY2FsKX13aGlsZShyKX19fSxlLnN1YnN0YWNrPWZ1bmN0aW9uKHQsaSxvKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0W25dLnRvcD1udWxsO3ZhciBzPW8uaGVpZ2h0O2ZvcihuPTA7bj
21167x0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07aWYoci5zdGFjayYmbnVsbD09PXIudG9wKXtyLnRvcD1yLmJhc2VUb3A7ZG97Zm9yKHZhciBhPW51bGwsaD0wLGQ9dC5sZW5ndGg7aDxkO2grKyl7dmFyIGw9dFtoXTtpZihudWxsIT09bC50b3AmJmwhPT1yJiZlLmNvbGxpc2lvbihyLGwsaS5pdGVtLGwub3B0aW9ucy5ydGwpKXthPWw7YnJlYWt9fW51bGwhPWEmJihyLnRvcD1hLnRvcCthLmhlaWdodCtpLml0ZW0udmVydGljYWwpLHIudG9wK3IuaGVpZ2h0PnMmJihzPXIudG9wK3IuaGVpZ2h0KX13aGlsZShhKX19by5oZWlnaHQ9cy1vLnRvcCsuNSppLml0ZW0udmVydGljYWx9LGUubm9zdGFjaz1mdW5jdGlvbih0LGksbyxuKXtmb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKylpZih2b2lkIDA9PXRbc10uZGF0YS5zdWJncm91cCl0W3NdLnRvcD1pLml0ZW0udmVydGljYWw7ZWxzZSBpZih2b2lkIDAhPT10W3NdLmRhdGEuc3ViZ3JvdXAmJm4pe3ZhciByPTA7Zm9yKHZhciBhIGluIG8pby5oYXNPd25Qcm9wZXJ0eShhKSYmMT09b1thXS52aXNpYmxlJiZvW2FdLmluZGV4PG9bdFtzXS5kYXRhLnN1Ymdyb3VwXS5pbmRleCYmKHIrPW9bYV0uaGVpZ2h0LG9bdFtzXS5kYXRhLnN1Ymdyb3VwXS50b3A9cik7dFtzXS50b3A9cisuNSppLml0ZW0udmVydGljYWx9bnx8ZS5zdGFja1N1Ymdyb3Vwcyh0LGksbyl9LGUuc3RhY2tTdWJncm91cHM9ZnVuY3Rpb24odCxpLG8pe2Zvcih2YXIgbiBpbiBvKWlmKG8uaGFzT3duUHJvcGVydHkobikpe29bbl0udG9wPTA7ZG97dmFyIHM9bnVsbDtmb3IodmFyIHIgaW4gbylpZihudWxsIT09b1tyXS50b3AmJnIhPT1uJiZvW25dLmluZGV4Pm9bcl0uaW5kZXgmJmUuY29sbGlzaW9uQnlUaW1lcyhvW25dLG9bcl0pKXtzPW9bcl07YnJlYWt9bnVsbCE9cyYmKG9bbl0udG9wPXMudG9wK3MuaGVpZ2h0KX13aGlsZShzKX1mb3IodmFyIGE9MDthPHQubGVuZ3RoO2ErKyl2b2lkIDAhPT10W2FdLmRhdGEuc3ViZ3JvdXAmJih0W2FdLnRvcD1vW3RbYV0uZGF0YS5zdWJncm91cF0udG9wKy41KmkuaXRlbS52ZXJ0aWNhbCl9LGUuc3RhY2tTdWJncm91cHNXaXRoSW5uZXJTdGFjaz1mdW5jdGlvbih0LGksbyl7dmFyIG49ITEscz1bXTtmb3IodmFyIHIgaW4gbylvW3JdLmhhc093blByb3BlcnR5KFwiaW5kZXhcIik/c1tvW3JdLmluZGV4XT1yOnMucHVzaChyKTtmb3IodmFyIGE9MDthPHMubGVuZ3RoO2ErKylpZihyPXNbYV0sby5oYXNPd25Qcm9wZXJ0eShyKSl7bj1ufHxvW3JdLnN0YWNrLG9bcl0udG9wPTA7Zm9yKHZhciBoIGluIG8pb1toXS52aXNpYmxlJiZvW3JdLmluZGV4Pm9baF0uaW5kZXgmJihvW3JdLnRvcCs9b1toXS5oZWlnaHQpO2Zvcih2YXIgZD10W3JdLGw9MDtsPGQubGVuZ3RoO2wrKyl2b2lkIDAhPT1kW2xdLmRhdGEuc3ViZ3JvdXAmJihkW2xdLnRvcD1vW2RbbF0uZGF0YS5zdWJncm91cF0udG9wKy41KmkuaXRlbS52ZXJ0aWNhbCxvW3JdLnN0YWNrJiYoZFtsXS5iYXNlVG9wPWRbbF0udG9wKSk7biYmb1tyXS5zdGFjayYmZS5zdWJzdGFjayh0W3JdLGksb1tyXSl9fSxlLmNvbGxpc2lvbj1mdW5jdGlvbih0LGUsaSxvKXtyZXR1cm4gbz90LnJpZ2h0LWkuaG9yaXpvbn
21167RhbCsuMDAxPGUucmlnaHQrZS53aWR0aCYmdC5yaWdodCt0LndpZHRoK2kuaG9yaXpvbnRhbC0uMDAxPmUucmlnaHQmJnQudG9wLWkudmVydGljYWwrLjAwMTxlLnRvcCtlLmhlaWdodCYmdC50b3ArdC5oZWlnaHQraS52ZXJ0aWNhbC0uMDAxPmUudG9wOnQubGVmdC1pLmhvcml6b250YWwrLjAwMTxlLmxlZnQrZS53aWR0aCYmdC5sZWZ0K3Qud2lkdGgraS5ob3Jpem9udGFsLS4wMDE+ZS5sZWZ0JiZ0LnRvcC1pLnZlcnRpY2FsKy4wMDE8ZS50b3ArZS5oZWlnaHQmJnQudG9wK3QuaGVpZ2h0K2kudmVydGljYWwtLjAwMT5lLnRvcH0sZS5jb2xsaXNpb25CeVRpbWVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc3RhcnQ8PWUuc3RhcnQmJnQuZW5kPj1lLnN0YXJ0JiZ0LnRvcDxlLnRvcCtlLmhlaWdodCYmdC50b3ArdC5oZWlnaHQ+ZS50b3B8fGUuc3RhcnQ8PXQuc3RhcnQmJmUuZW5kPj10LnN0YXJ0JiZlLnRvcDx0LnRvcCt0LmhlaWdodCYmZS50b3ArZS5oZWlnaHQ+dC50b3B9fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUsaSl7aWYodGhpcy5wcm9wcz17ZG90Ont3aWR0aDowLGhlaWdodDowfSxsaW5lOnt3aWR0aDowLGhlaWdodDowfX0sdGhpcy5vcHRpb25zPWksdCYmdm9pZCAwPT10LnN0YXJ0KXRocm93IG5ldyBFcnJvcignUHJvcGVydHkgXCJzdGFydFwiIG1pc3NpbmcgaW4gaXRlbSAnK3QpO24uY2FsbCh0aGlzLHQsZSxpKX12YXIgbj1pKDM4KTtvLnByb3RvdHlwZT1uZXcgbihudWxsLG51bGwsbnVsbCksby5wcm90b3R5cGUuaXNWaXNpYmxlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucy5hbGlnbixpPXRoaXMud2lkdGgqdC5nZXRNaWxsaXNlY29uZHNQZXJQaXhlbCgpO3JldHVyblwicmlnaHRcIj09ZT90aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpPnQuc3RhcnQmJnRoaXMuZGF0YS5zdGFydC5nZXRUaW1lKCktaTx0LmVuZDpcImxlZnRcIj09ZT90aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpK2k+dC5zdGFydCYmdGhpcy5kYXRhLnN0YXJ0LmdldFRpbWUoKTx0LmVuZDp0aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpK2kvMj50LnN0YXJ0JiZ0aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpLWkvMjx0LmVuZH0sby5wcm90b3R5cGUuX2NyZWF0ZURvbUVsZW1lbnQ9ZnVuY3Rpb24oKXt0aGlzLmRvbXx8KHRoaXMuZG9tPXt9LHRoaXMuZG9tLmJveD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiRElWXCIpLHRoaXMuZG9tLmNvbnRlbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIkRJVlwiKSx0aGlzLmRvbS5jb250ZW50LmNsYXNzTmFtZT1cInZpcy1pdGVtLWNvbnRlbnRcIix0aGlzLmRvbS5ib3guYXBwZW5kQ2hpbGQodGhpcy5kb20uY29udGVudCksdGhpcy5kb20ubGluZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiRElWXCIpLHRoaXMuZG9tLmxpbmUuY2xhc3NOYW1lPVwidmlzLWxpbmVcIix0aGlzLmRvbS5kb3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIkRJVlwiKSx0aGlzLmRvbS5kb3QuY2xhc3NOYW1lPVwidmlzLWRvdFwiLHRoaXMuZG9tLmJveFtcInRpbWVsaW5lLWl0ZW1cIl09dGhpcyx0aGlzLmRpcnR5PSEwKX0sby5wcm90b3R5cGUuX2FwcGVuZERvbUVsZW1lbnQ9ZnVuY3Rpb24oKXtpZighdGhpcy5wYXJlbnQpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHJlZHJhdyBpdGVtOiBubyBwYXJlbnQgYXR0YWNoZWRcIik7aWYoIXRoaXMuZG9tLmJveC5wYXJlbnROb2RlKXt2YXIgdD10aGlzLnBhcmVudC5kb20uZm9yZWdyb3VuZDtpZighdCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVkcmF3IGl0ZW06IHBhcmVudCBoYXMgbm8gZm9yZWdyb3VuZCBjb250YWluZXIgZWxlbWVudFwiKTt0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmJveCl9aWYoIXRoaXMuZG9tLmxpbmUucGFyZW50Tm9kZSl7dmFyIGU9dGhpcy5wYXJlbnQuZG9tLmJhY2tncm91bmQ7aWYoIWUpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHJlZHJhdyBpdGVtOiBwYXJlbnQgaGFzIG5vIGJhY2tncm91bmQgY29udGFpbmVyIGVsZW1lbnRcIik7ZS5hcHBlbmRDaGlsZCh0aGlzLmRvbS5saW5lKX1pZighdGhpcy5kb20uZG90LnBhcmVudE5vZGUpe3ZhciBpPXRoaXMucGFyZW50LmRvbS5heGlzO2lmKCFlKXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZWRyYXcgaXRlbTogcGFyZW50IGhhcyBubyBheGlzIGNvbnRhaW5lciBlbGVtZW50XCIpO2kuYXBwZW5kQ2hpbGQodGhpcy5kb20uZG90KX10aGlzLmRpc3BsYXllZD0hMH0sby5wcm90b3R5cGUuX3VwZGF0ZURpcnR5RG9tQ29tcG9uZW50cz1mdW5jdGlvbigpe2lmKHRoaXMuZGlydHkpe3RoaXMuX3VwZGF0ZUNvbnRlbnRzKHRoaXMuZG9tLmNvbnRlbnQpLHRoaXMuX3VwZGF0ZURhdGFBdHRyaWJ1dGVzKHRoaXMuZG9tLmJveCksdGhpcy5fdXBkYXRlU3R5bGUodGhpcy5kb20uYm94KTt2YXIgdD10aGlzLmVkaXRhYmxlLnVwZGF0ZVRpbWV8fHRoaXMuZWRpdGFibGUudXBkYXRlR3JvdXAsZT0odGhpcy5kYXRhLmNsYXNzTmFtZT9cIiBcIit0aGlzLmRhdGEuY2xhc3NOYW1lOlwiXCIpKyh0aGlzLnNlbGVjdGVkP1wiIHZpcy1zZWxlY3RlZFwiOlwiXCIpKyh0P1wiIHZpcy1lZGl0YWJsZVwiOlwiIHZpcy1yZWFkb25seVwiKTt0aGlzLmRvbS5ib3guY2xhc3NOYW1lPVwidmlzLWl0ZW0gdmlzLWJveFwiK2UsdGhpcy5kb20ubGluZS5jbGFzc05hbWU9XCJ2aXMtaXRlbSB2aXMtbGluZVwiK2UsdGhpcy5kb20uZG90LmNsYXNzTmFtZT1cInZpcy1pdGVtIHZpcy1kb3RcIitlfX0sby5wcm90b3R5cGUuX2dldERvbUNvbXBvbmVudHNTaXplcz1mdW5jdGlvbigpe3JldHVybntwcmV2aW91czp7cmlnaHQ6dGhpcy5kb20uYm94LnN0eWxlLnJpZ2h0LGxlZnQ6dGhpcy5kb20uYm94LnN0eWxlLmxlZnR9LGRvdDp7aGVpZ2h0OnRoaXMuZG9tLmRvdC5vZmZzZXRIZWlnaHQsd2lkdGg6dGhpcy5kb20uZG90Lm9mZnNldFdpZHRofSxsaW5lOnt3aWR0aDp0aGlzLmRvbS5saW5lLm9mZnNldFdpZHRofSxib3g6e3dpZHRoOnRoaXMuZG9tLmJveC5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5kb20uYm94Lm9mZnNldEhlaWdodH19fSxvLnByb3RvdHlwZS5fdXBkYXRlRG9tQ29tcG9uZW50c1Npem
21167VzPWZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucy5ydGw/dGhpcy5kb20uYm94LnN0eWxlLnJpZ2h0PVwiMHB4XCI6dGhpcy5kb20uYm94LnN0eWxlLmxlZnQ9XCIwcHhcIix0aGlzLnByb3BzLmRvdC5oZWlnaHQ9dC5kb3QuaGVpZ2h0LHRoaXMucHJvcHMuZG90LndpZHRoPXQuZG90LndpZHRoLHRoaXMucHJvcHMubGluZS53aWR0aD10LmxpbmUud2lkdGgsdGhpcy53aWR0aD10LmJveC53aWR0aCx0aGlzLmhlaWdodD10LmJveC5oZWlnaHQsdGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5ib3guc3R5bGUucmlnaHQ9dC5wcmV2aW91cy5yaWdodDp0aGlzLmRvbS5ib3guc3R5bGUubGVmdD10LnByZXZpb3VzLmxlZnQsdGhpcy5kaXJ0eT0hMX0sby5wcm90b3R5cGUuX3JlcGFpbnREb21BZGRpdGlvbmFscz1mdW5jdGlvbigpe3RoaXMuX3JlcGFpbnRPbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcCh0aGlzLmRvbS5ib3gpLHRoaXMuX3JlcGFpbnREcmFnQ2VudGVyKCksdGhpcy5fcmVwYWludERlbGV0ZUJ1dHRvbih0aGlzLmRvbS5ib3gpfSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24odCl7dmFyIGUsaT1bdGhpcy5fY3JlYXRlRG9tRWxlbWVudC5iaW5kKHRoaXMpLHRoaXMuX2FwcGVuZERvbUVsZW1lbnQuYmluZCh0aGlzKSx0aGlzLl91cGRhdGVEaXJ0eURvbUNvbXBvbmVudHMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGlydHkmJihlPXRoaXMuX2dldERvbUNvbXBvbmVudHNTaXplcygpKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGlydHkmJnRoaXMuX3VwZGF0ZURvbUNvbXBvbmVudHNTaXplcy5iaW5kKHRoaXMpKGUpfS5iaW5kKHRoaXMpLHRoaXMuX3JlcGFpbnREb21BZGRpdGlvbmFscy5iaW5kKHRoaXMpXTtpZih0KXJldHVybiBpO3ZhciBvO3JldHVybiBpLmZvckVhY2goZnVuY3Rpb24odCl7bz10KCl9KSxvfSxvLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5ZWR8fHRoaXMucmVkcmF3KCl9LG8ucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXtpZih0aGlzLmRpc3BsYXllZCl7dmFyIHQ9dGhpcy5kb207dC5ib3gucGFyZW50Tm9kZSYmdC5ib3gucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0LmJveCksdC5saW5lLnBhcmVudE5vZGUmJnQubGluZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQubGluZSksdC5kb3QucGFyZW50Tm9kZSYmdC5kb3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0LmRvdCksdGhpcy5kaXNwbGF5ZWQ9ITF9fSxvLnByb3RvdHlwZS5yZXBvc2l0aW9uWD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udmVyc2lvbi50b1NjcmVlbih0aGlzLmRhdGEuc3RhcnQpLGU9dGhpcy5vcHRpb25zLmFsaWduO1wicmlnaHRcIj09ZT90aGlzLm9wdGlvbnMucnRsPyh0aGlzLnJpZ2h0PXQtdGhpcy53aWR0aCx0aGlzLmRvbS5ib3guc3R5bGUucmlnaHQ9dGhpcy5yaWdodCtcInB4XCIsdGhpcy5kb20ubGluZS5zdHlsZS5yaWdodD10LXRoaXMucHJvcHMubGluZS53aWR0aCtcInB4XCIsdGhpcy5kb20uZG90LnN0eWxlLnJpZ2h0PXQtdGhpcy5wcm9wcy5saW5lLndpZHRoLzItdGhpcy5wcm9wcy5kb3Qud2lkdGgvMitcInB4XCIpOih0aGlzLmxlZnQ9dC10aGlzLndpZHRoLHRoaXMuZG9tLmJveC5zdHlsZS5sZWZ0PXRoaXMubGVmdCtcInB4XCIsdGhpcy5kb20ubGluZS5zdHlsZS5sZWZ0PXQtdGhpcy5wcm9wcy5saW5lLndpZHRoK1wicHhcIix0aGlzLmRvbS5kb3Quc3R5bGUubGVmdD10LXRoaXMucHJvcHMubGluZS53aWR0aC8yLXRoaXMucHJvcHMuZG90LndpZHRoLzIrXCJweFwiKTpcImxlZnRcIj09ZT90aGlzLm9wdGlvbnMucnRsPyh0aGlzLnJpZ2h0PXQsdGhpcy5kb20uYm94LnN0eWxlLnJpZ2h0PXRoaXMucmlnaHQrXCJweFwiLHRoaXMuZG9tLmxpbmUuc3R5bGUucmlnaHQ9dCtcInB4XCIsdGhpcy5kb20uZG90LnN0eWxlLnJpZ2h0PXQrdGhpcy5wcm9wcy5saW5lLndpZHRoLzItdGhpcy5wcm9wcy5kb3Qud2lkdGgvMitcInB4XCIpOih0aGlzLmxlZnQ9dCx0aGlzLmRvbS5ib3guc3R5bGUubGVmdD10aGlzLmxlZnQrXCJweFwiLHRoaXMuZG9tLmxpbmUuc3R5bGUubGVmdD10K1wicHhcIix0aGlzLmRvbS5kb3Quc3R5bGUubGVmdD10K3RoaXMucHJvcHMubGluZS53aWR0aC8yLXRoaXMucHJvcHMuZG90LndpZHRoLzIrXCJweFwiKTp0aGlzLm9wdGlvbnMucnRsPyh0aGlzLnJpZ2h0PXQtdGhpcy53aWR0aC8yLHRoaXMuZG9tLmJveC5zdHlsZS5yaWdodD10aGlzLnJpZ2h0K1wicHhcIix0aGlzLmRvbS5saW5lLnN0eWxlLnJpZ2h0PXQtdGhpcy5wcm9wcy5saW5lLndpZHRoK1wicHhcIix0aGlzLmRvbS5kb3Quc3R5bGUucmlnaHQ9dC10aGlzLnByb3BzLmRvdC53aWR0aC8yK1wicHhcIik6KHRoaXMubGVmdD10LXRoaXMud2lkdGgvMix0aGlzLmRvbS5ib3guc3R5bGUubGVmdD10aGlzLmxlZnQrXCJweFwiLHRoaXMuZG9tLmxpbmUuc3R5bGUubGVmdD10LXRoaXMucHJvcHMubGluZS53aWR0aC8yK1wicHhcIix0aGlzLmRvbS5kb3Quc3R5bGUubGVmdD10LXRoaXMucHJvcHMuZG90LndpZHRoLzIrXCJweFwiKX0sby5wcm90b3R5cGUucmVwb3NpdGlvblk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbSxlPXRoaXMuZG9tLmJveCxpPXRoaXMuZG9tLmxpbmUsbz10aGlzLmRvbS5kb3Q7aWYoXCJ0b3BcIj09dCllLnN0eWxlLnRvcD0odGhpcy50b3B8fDApK1wicHhcIixpLnN0eWxlLnRvcD1cIjBcIixpLnN0eWxlLmhlaWdodD10aGlzLnBhcmVudC50b3ArdGhpcy50b3ArMStcInB4XCIsaS5zdHlsZS5ib3R0b209XCJcIjtlbHNle3ZhciBuPXRoaXMucGFyZW50Lml0ZW1TZXQucHJvcHMuaGVpZ2h0LHM9bi10aGlzLnBhcmVudC50b3AtdGhpcy5wYXJlbnQuaGVpZ2h0K3RoaXMudG9wO2Uuc3R5bGUudG9wPSh0aGlzLnBhcmVudC5oZWlnaHQtdGhpcy50b3AtdGhpcy5oZWlnaHR8fDApK1wicHhcIixpLnN0eWxlLnRvcD1uLXMrXCJweFwiLGkuc3R5bGUuYm90dG9tPVwiMFwifW8uc3R5bGUudG9wPS10aGlzLnByb3BzLmRvdC5oZWlnaHQvMitcInB4XCJ9LG8ucHJvdG90eXBlLmdldFdpZHRoTGVmdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLndpZHRoLzJ9LG8ucHJvdG90eXBlLmdldFdpZHRoUmlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53aWR0aC8yfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe2lmKHRoaXMucHJvcHM9e2RvdDp7dG9wOjAsd2lkdGg6MCxoZWlnaHQ6MH0sY29udGVudDp7aGVpZ2h0OjAsbWFyZ2luTGVmdDowLG1hcmdpblJpZ2h0OjB9fSx0aGlzLm9wdGlvbnM9aSx0JiZ2b2lkIDA9PXQuc3RhcnQpdGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0eSBcInN0YXJ0XCIgbWlzc2luZyBpbiBpdGVtICcrdCk7bi5jYWxsKHRoaXMsdCxlLGkpfXZhciBuPWkoMzgpO28ucHJvdG90eXBlPW5ldyBuKG51bGwsbnVsbCxudWxsKSxvLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy53aWR0aCp0LmdldE1pbGxpc2Vjb25kc1BlclBpeGVsKCk7cmV0dXJuIHRoaXMuZGF0YS5zdGFydC5nZXRUaW1lKCkrZT50LnN0YXJ0JiZ0aGlzLmRhdGEuc3RhcnQ8dC5lbmR9LG8ucHJvdG90eXBlLl9jcmVhdGVEb21FbGVtZW50PWZ1bmN0aW9uKCl7dGhpcy5kb218fCh0aGlzLmRvbT17fSx0aGlzLmRvbS5wb2ludD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmNvbnRlbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5jb250ZW50LmNsYXNzTmFtZT1cInZpcy1pdGVtLWNvbnRlbn
21167RcIix0aGlzLmRvbS5wb2ludC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5jb250ZW50KSx0aGlzLmRvbS5kb3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5wb2ludC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5kb3QpLHRoaXMuZG9tLnBvaW50W1widGltZWxpbmUtaXRlbVwiXT10aGlzLHRoaXMuZGlydHk9ITApfSxvLnByb3RvdHlwZS5fYXBwZW5kRG9tRWxlbWVudD1mdW5jdGlvbigpe2lmKCF0aGlzLnBhcmVudCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVkcmF3IGl0ZW06IG5vIHBhcmVudCBhdHRhY2hlZFwiKTtpZighdGhpcy5kb20ucG9pbnQucGFyZW50Tm9kZSl7dmFyIHQ9dGhpcy5wYXJlbnQuZG9tLmZvcmVncm91bmQ7aWYoIXQpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHJlZHJhdyBpdGVtOiBwYXJlbnQgaGFzIG5vIGZvcmVncm91bmQgY29udGFpbmVyIGVsZW1lbnRcIik7dC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5wb2ludCl9dGhpcy5kaXNwbGF5ZWQ9ITB9LG8ucHJvdG90eXBlLl91cGRhdGVEaXJ0eURvbUNvbXBvbmVudHM9ZnVuY3Rpb24oKXtpZih0aGlzLmRpcnR5KXt0aGlzLl91cGRhdGVDb250ZW50cyh0aGlzLmRvbS5jb250ZW50KSx0aGlzLl91cGRhdGVEYXRhQXR0cmlidXRlcyh0aGlzLmRvbS5wb2ludCksdGhpcy5fdXBkYXRlU3R5bGUodGhpcy5kb20ucG9pbnQpO3ZhciB0PXRoaXMuZWRpdGFibGUudXBkYXRlVGltZXx8dGhpcy5lZGl0YWJsZS51cGRhdGVHcm91cCxlPSh0aGlzLmRhdGEuY2xhc3NOYW1lP1wiIFwiK3RoaXMuZGF0YS5jbGFzc05hbWU6XCJcIikrKHRoaXMuc2VsZWN0ZWQ/XCIgdmlzLXNlbGVjdGVkXCI6XCJcIikrKHQ/XCIgdmlzLWVkaXRhYmxlXCI6XCIgdmlzLXJlYWRvbmx5XCIpO3RoaXMuZG9tLnBvaW50LmNsYXNzTmFtZT1cInZpcy1pdGVtIHZpcy1wb2ludFwiK2UsdGhpcy5kb20uZG90LmNsYXNzTmFtZT1cInZpcy1pdGVtIHZpcy1kb3RcIitlfX0sby5wcm90b3R5cGUuX2dldERvbUNvbXBvbmVudHNTaXplcz1mdW5jdGlvbigpe3JldHVybntkb3Q6e3dpZHRoOnRoaXMuZG9tLmRvdC5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5kb20uZG90Lm9mZnNldEhlaWdodH0sY29udGVudDp7d2lkdGg6dGhpcy5kb20uY29udGVudC5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5kb20uY29udGVudC5vZmZzZXRIZWlnaHR9LHBvaW50Ont3aWR0aDp0aGlzLmRvbS5wb2ludC5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5kb20ucG9pbnQub2Zmc2V0SGVpZ2h0fX19LG8ucHJvdG90eXBlLl91cGRhdGVEb21Db21wb25lbnRzU2l6ZXM9ZnVuY3Rpb24odCl7dGhpcy5wcm9wcy5kb3Qud2lkdGg9dC5kb3Qud2lkdGgsdGhpcy5wcm9wcy5kb3QuaGVpZ2h0PXQuZG90LmhlaWdodCx0aGlzLnByb3BzLmNvbn
21167RlbnQuaGVpZ2h0PXQuY29udGVudC5oZWlnaHQsdGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5jb250ZW50LnN0eWxlLm1hcmdpblJpZ2h0PTIqdGhpcy5wcm9wcy5kb3Qud2lkdGgrXCJweFwiOnRoaXMuZG9tLmNvbnRlbnQuc3R5bGUubWFyZ2luTGVmdD0yKnRoaXMucHJvcHMuZG90LndpZHRoK1wicHhcIix0aGlzLndpZHRoPXQucG9pbnQud2lkdGgsdGhpcy5oZWlnaHQ9dC5wb2ludC5oZWlnaHQsdGhpcy5kb20uZG90LnN0eWxlLnRvcD0odGhpcy5oZWlnaHQtdGhpcy5wcm9wcy5kb3QuaGVpZ2h0KS8yK1wicHhcIix0aGlzLm9wdGlvbnMucnRsP3RoaXMuZG9tLmRvdC5zdHlsZS5yaWdodD10aGlzLnByb3BzLmRvdC53aWR0aC8yK1wicHhcIjp0aGlzLmRvbS5kb3Quc3R5bGUubGVmdD10aGlzLnByb3BzLmRvdC53aWR0aC8yK1wicHhcIix0aGlzLmRpcnR5PSExfSxvLnByb3RvdHlwZS5fcmVwYWludERvbUFkZGl0aW9uYWxzPWZ1bmN0aW9uKCl7dGhpcy5fcmVwYWludE9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwKHRoaXMuZG9tLnBvaW50KSx0aGlzLl9yZXBhaW50RHJhZ0NlbnRlcigpLHRoaXMuX3JlcGFpbnREZWxldGVCdXR0b24odGhpcy5kb20ucG9pbnQpfSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24odCl7dmFyIGUsaT1bdGhpcy5fY3JlYXRlRG9tRWxlbWVudC5iaW5kKHRoaXMpLHRoaXMuX2FwcGVuZERvbUVsZW1lbnQuYmluZCh0aGlzKSx0aGlzLl91cGRhdGVEaXJ0eURvbUNvbXBvbmVudHMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGlydHkmJihlPXRoaXMuX2dldERvbUNvbXBvbmVudHNTaXplcygpKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGlydHkmJnRoaXMuX3VwZGF0ZURvbUNvbXBvbmVudHNTaXplcy5iaW5kKHRoaXMpKGUpfS5iaW5kKHRoaXMpLHRoaXMuX3JlcGFpbnREb21BZGRpdGlvbmFscy5iaW5kKHRoaXMpXTtpZih0KXJldHVybiBpO3ZhciBvO3JldHVybiBpLmZvckVhY2goZnVuY3Rpb24odCl7bz10KCl9KSxvfSxvLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5ZWR8fHRoaXMucmVkcmF3KCl9LG8ucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLmRpc3BsYXllZCYmKHRoaXMuZG9tLnBvaW50LnBhcmVudE5vZGUmJnRoaXMuZG9tLnBvaW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ucG9pbnQpLHRoaXMuZGlzcGxheWVkPSExKX0sby5wcm90b3R5cGUucmVwb3NpdGlvblg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnZlcnNpb24udG9TY3JlZW4odGhpcy5kYXRhLnN0YXJ0KTt0aGlzLm9wdGlvbnMucnRsPyh0aGlzLnJpZ2h0PXQtdGhpcy5wcm9wcy5kb3Qud2lkdGgsdGhpcy5kb20ucG9pbnQuc3R5bGUucmlnaHQ9dGhpcy5yaWdodCtcInB4XCIpOih0aGlzLmxlZnQ9dC10aGlzLnByb3BzLmRvdC53aWR0aCx0aGlzLmRvbS5wb2ludC5zdHlsZS5sZWZ0PXRoaXMubGVmdCtcInB4XCIpfSxvLnByb3RvdHlwZS5yZXBvc2l0aW9uWT1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtLGU9dGhpcy5kb20ucG9pbnQ7ZS5zdHlsZS50b3A9XCJ0b3BcIj09dD90aGlzLnRvcCtcInB4XCI6dGhpcy5wYXJlbnQuaGVpZ2h0LXRoaXMudG9wLXRoaXMuaGVpZ2h0K1wicHhcIn0sby5wcm90b3R5cGUuZ2V0V2lkdGhMZWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvcHMuZG90LndpZHRofSxvLnByb3RvdHlwZS5nZXRXaWR0aFJpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvcHMuZG90LndpZHRofSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe2lmKHRoaXMucHJvcHM9e2NvbnRlbnQ6e3dpZHRoOjB9fSx0aGlzLm92ZXJmbG93PSExLHQpe2lmKHZvaWQgMD09dC5zdGFydCl0aHJvdyBuZXcgRXJyb3IoJ1Byb3BlcnR5IFwic3RhcnRcIiBtaXNzaW5nIGluIGl0ZW0gJyt0LmlkKTtpZih2b2lkIDA9PXQuZW5kKXRocm93IG5ldyBFcnJvcignUHJvcGVydHkgXCJlbmRcIiBtaXNzaW5nIGluIGl0ZW0gJyt0LmlkKX1uLmNhbGwodGhpcyx0LGUsaSl9dmFyIG49aSgzOCkscz1pKDY5KSxyPWkoNzApO28ucHJvdG90eXBlPW5ldyBuKG51bGwsbnVsbCxudWxsKSxvLnByb3RvdHlwZS5iYXNlQ2xhc3NOYW1lPVwidmlzLWl0ZW0gdmlzLWJhY2tncm91bmRcIixvLnByb3RvdHlwZS5zdGFjaz0hMSxvLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YS5zdGFydDx0LmVuZCYmdGhpcy5kYXRhLmVuZD50LnN0YXJ0fSxvLnByb3RvdHlwZS5fY3JlYXRlRG9tRWxlbWVudD1mdW5jdGlvbigpe3RoaXMuZG9tfHwodGhpcy5kb209e30sdGhpcy5kb20uYm94PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20uZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5mcmFtZS5jbGFzc05hbWU9XCJ2aXMtaXRlbS1vdmVyZmxvd1wiLHRoaXMuZG9tLmJveC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5mcmFtZSksdGhpcy5kb20uY29udGVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmNvbnRlbnQuY2xhc3NOYW1lPVwidmlzLWl0ZW0tY29udGVudFwiLHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZG9tLmNvbnRlbnQpLHRoaXMuZGlydHk9ITApfSxvLnByb3RvdHlwZS5fYXBwZW5kRG9tRWxlbWVudD1mdW5jdGlvbigpe2lmKCF0aGlzLnBhcmVudCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVkcmF3IGl0ZW06IG5vIHBhcmVudCBhdHRhY2hlZFwiKTtpZighdGhpcy5kb20uYm94LnBhcmVudE5vZGUpe3ZhciB0PXRoaXMucGFyZW50LmRvbS5iYWNrZ3JvdW5kO2lmKCF0KXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZWRyYXcgaXRlbTogcGFyZW50IGhhcyBubyBiYWNrZ3JvdW5kIGNvbnRhaW5lciBlbGVtZW50XCIpO3QuYXBwZW5kQ2hpbGQodGhpcy5kb20uYm94KX10aGlzLmRpc3BsYXllZD0hMH0sby5wcm90b3R5cGUuX3VwZGF0ZURpcnR5RG9tQ29tcG9uZW50cz1mdW5jdGlvbigpe2lmKHRoaXMuZGlydHkpe3RoaXMuX3VwZGF0ZUNvbnRlbnRzKHRoaXMuZG9tLmNvbnRlbnQpLHRoaXMuX3VwZGF0ZURhdGFBdHRyaWJ1dGVzKHRoaXMuZG9tLmNvbnRlbnQpLHRoaXMuX3VwZGF0ZVN0eWxlKHRoaXMuZG9tLmJveCk7dmFyIHQ9KHRoaXMuZGF0YS5jbGFzc05hbWU/XCIgXCIrdGhpcy5kYXRhLmNsYXNzTmFtZTpcIlwiKSsodGhpcy5zZWxlY3RlZD9cIiB2aXMtc2VsZWN0ZWRcIjpcIlwiKTt0aGlzLmRvbS5ib3guY2xhc3NOYW1lPXRoaXMuYmFzZUNsYXNzTmFtZSt0fX0sby5wcm90b3R5cGUuX2dldERvbUNvbXBvbmVudHNTaXplcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm92ZXJmbG93PVwiaGlkZGVuXCIhPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRvbS5jb250ZW50KS5vdmVyZmxvdyx7Y29udGVudDp7d2lk
21167dGg6dGhpcy5kb20uY29udGVudC5vZmZzZXRXaWR0aH19fSxvLnByb3RvdHlwZS5fdXBkYXRlRG9tQ29tcG9uZW50c1NpemVzPWZ1bmN0aW9uKHQpe3RoaXMucHJvcHMuY29udGVudC53aWR0aD10LmNvbnRlbnQud2lkdGgsdGhpcy5oZWlnaHQ9MCx0aGlzLmRpcnR5PSExfSxvLnByb3RvdHlwZS5fcmVwYWludERvbUFkZGl0aW9uYWxzPWZ1bmN0aW9uKCl7fSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24odCl7dmFyIGUsaT1bdGhpcy5fY3JlYXRlRG9tRWxlbWVudC5iaW5kKHRoaXMpLHRoaXMuX2FwcGVuZERvbUVsZW1lbnQuYmluZCh0aGlzKSx0aGlzLl91cGRhdGVEaXJ0eURvbUNvbXBvbmVudHMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGlydHkmJihlPXRoaXMuX2dldERvbUNvbXBvbmVudHNTaXplcy5iaW5kKHRoaXMpKCkpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kaXJ0eSYmdGhpcy5fdXBkYXRlRG9tQ29tcG9uZW50c1NpemVzLmJpbmQodGhpcykoZSl9LmJpbmQodGhpcyksdGhpcy5fcmVwYWludERvbUFkZGl0aW9uYWxzLmJpbmQodGhpcyldO2lmKHQpcmV0dXJuIGk7dmFyIG87cmV0dXJuIGkuZm9yRWFjaChmdW5jdGlvbih0KXtvPXQoKX0pLG99LG8ucHJvdG90eXBlLnNob3c9ci5wcm90b3R5cGUuc2hvdyxvLnByb3RvdHlwZS5oaWRlPXIucHJvdG90eXBlLmhpZGUsby5wcm90b3R5cGUucmVwb3NpdGlvblg9ci5wcm90b3R5cGUucmVwb3NpdGlvblgsby5wcm90b3R5cGUucmVwb3NpdGlvblk9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbTtpZih2b2lkIDAhPT10aGlzLmRhdGEuc3ViZ3JvdXApe3ZhciBvPXRoaXMuZGF0YS5zdWJncm91cDt0aGlzLmRvbS5ib3guc3R5bGUuaGVpZ2h0PXRoaXMucGFyZW50LnN1Ymdyb3Vwc1tvXS5oZWlnaHQrXCJweFwiLHRoaXMuZG9tLmJveC5zdHlsZS50b3A9XCJ0b3BcIj09aT90aGlzLnBhcmVudC50b3ArdGhpcy5wYXJlbnQuc3ViZ3JvdXBzW29dLnRvcCtcInB4XCI6dGhpcy5wYXJlbnQudG9wK3RoaXMucGFyZW50LmhlaWdodC10aGlzLnBhcmVudC5zdWJncm91cHNbb10udG9wLXRoaXMucGFyZW50LnN1Ymdyb3Vwc1tvXS5oZWlnaHQrXCJweFwiLHRoaXMuZG9tLmJveC5zdHlsZS5ib3R0b209XCJcIn1lbHNlIHRoaXMucGFyZW50IGluc3RhbmNlb2Ygcz8oZT1NYXRoLm1heCh0aGlzLnBhcmVudC5oZWlnaHQsdGhpcy5wYXJlbnQuaXRlbVNldC5ib2R5LmRvbVByb3BzLmNlbnRlci5oZWlnaHQsdGhpcy5wYXJlbnQuaXRlbVNldC5ib2R5LmRvbVByb3BzLmNlbnRlckNvbnRhaW5lci5oZWlnaHQpLHRoaXMuZG9tLmJveC5zdHlsZS5ib3R0b209XCJib3R0b21cIj09aT9cIjBcIjpcIlwiLHRoaXMuZG9tLmJveC5zdHlsZS50b3A9XCJ0b3BcIj09aT9cIjBcIjpcIlwiKTooZT10aGlzLnBhcmVudC5oZWlnaHQsdGhpcy5kb20uYm94LnN0eWxlLnRvcD10aGlzLnBhcmVudC50b3ArXCJweFwiLHRoaXMuZG9tLmJveC5zdHlsZS5ib3R0b209XCJcIik7dGhpcy5kb20uYm94LnN0eWxlLmhlaWdodD1lK1wicHhcIn0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDApLHM9byhuKSxyPWkoMSksYT1vKHIpLGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuY29udGFpbmVyPWUsdGhpcy5vdmVyZmxvd01ldGhvZD1pfHxcImNhcFwiLHRoaXMueD0wLHRoaXMueT0wLHRoaXMucGFkZGluZz01LHRoaXMuaGlkZGVuPSExLHRoaXMuZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmZyYW1lLmNsYXNzTmFtZT1cInZpcy10b29sdGlwXCIsdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZSl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5Olwic2V0UG9zaXRpb25cIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMueD1wYXJzZUludCh0KSx0aGlzLnk9cGFyc2VJbnQoZSl9fSx7a2V5Olwic2V0VGV4dFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBFbGVtZW50Pyh0aGlzLmZyYW1lLmlubmVySFRNTD1cIlwiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodCkpOnRoaXMuZnJhbWUuaW5uZXJIVE1MPXR9fSx7a2V5Olwic2hvd1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQmJih0PSEwKSwhMD09PXQpe3ZhciBlPXRoaXMuZnJhbWUuY2xpZW50SGVpZ2h0LGk9dGhpcy5mcmFtZS5jbGllbnRXaWR0aCxvPXRoaXMuZnJhbWUucGFyZW50Tm9kZS5jbGllbnRIZWlnaHQsbj10aGlzLmZyYW1lLnBhcmVudE5vZGUuY2xpZW50V2lkdGgscz0wLHI9MDtpZihcImZsaXBcIj09dGhpcy5vdmVyZmxvd01ldGhvZCl7dmFyIGE9ITEsaD0hMDt0aGlzLnktZTx0aGlzLnBhZGRpbmcmJihoPSExKSx0aGlzLngraT5uLXRoaXMucGFkZGluZyYmKGE9ITApLHM9YT90aGlzLngtaTp0aGlzLngscj1oP3RoaXMueS1lOnRoaXMueX1lbHNlIHI9dGhpcy55LWUscitlK3RoaXMucGFkZGluZz5vJiYocj1vLWUtdGhpcy5wYWRkaW5nKSxyPHRoaXMucGFkZGluZyYmKHI9dGhpcy5wYWRkaW5nKSxzPXRoaXMueCxzK2krdGhpcy5wYWRkaW5nPm4mJihzPW4taS10aGlzLnBhZGRpbmcpLHM8dGhpcy5wYWRkaW5nJiYocz10aGlzLnBhZGRpbmcpO3RoaXMuZnJhbWUuc3R5bGUubGVmdD1zK1wicHhcIix0aGlzLmZyYW1lLnN0eWxlLnRvcD1yK1wicHhcIix0aGlzLmZyYW1lLnN0eWxlLnZpc2liaWxpdHk9XCJ2aXNpYmxlXCIsdGhpcy5oaWRkZW49ITF9ZWxzZSB0aGlzLmhpZGUoKX19LHtrZXk6XCJoaWRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmhpZGRlbj0hMCx0aGlzLmZyYW1lLnN0eWxlLmxlZnQ9XCIwXCIsdGhpcy5mcmFtZS5zdHlsZS50b3A9XCIwXCIsdGhpcy5mcmFtZS5zdHlsZS52aXNpYmlsaXR5PVwiaGlkZGVuXCJ9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5mcmFtZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZnJhbWUpfX1dKSx0fSgpO2UuZGVmYXVsdD1ofSxmdW5jdGlvbih0LGUsaSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG89XCJzdHJpbmdcIixuPVwiYm9vbGVhblwiLHM9XCJudW1iZXJcIixyPVwib2JqZWN0XCIsYT17Y29uZmlndXJlOntlbmFibGVkOntib29sZWFuOm59LGZpbHRlcjp7Ym9vbGVhbjpuLGZ1bmN0aW9uOlwiZnVuY3Rpb25cIn0sY29udGFpbmVyOntkb206XCJkb21cIn0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bixmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9fSxhbGlnbjp7c3RyaW5nOm99LHJ0bDp7Ym9vbGVhbjpuLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxyb2xsaW5nTW9kZTp7Zm9sbG93Ontib29sZWFuOm59LG9mZnNldDp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntvYmplY3Q6cn19LHZlcnRpY2FsU2Nyb2xsOntib29sZWFuOm4sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LGhvcml6b250YWxTY3JvbGw6e2Jvb2xlYW46bix1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sYXV0b1Jlc2l6ZTp7Ym9vbGVhbjpufSx0aHJvdHRsZVJlZHJhdzp7bnVtYmVyOnN9LGNsaWNrVG9Vc2U6e2Jvb2xlYW46bn0sZGF0YUF0dHJpYnV0ZXM6e3N0cmluZzpvLGFycmF5OlwiYXJyYXlcIn0sZWRpdGFibGU6e2FkZDp7Ym9vbGVhbjpuLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxyZW1vdmU6e2Jvb2xlYW46bix1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sdXBkYXRlR3JvdXA6e2Jvb2xlYW46bix1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sdXBkYXRlVGltZTp7Ym9vbGVhbjpuLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxvdmVycmlkZUl0ZW1zOntib29sZWFuOm4sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntib29sZWFuOm4sb2JqZWN0OnJ9fSxlbmQ6e251bWJlcjpzLGRhdGU6XCJkYXRlXCIsc3RyaW5nOm8sbW9tZW50OlwibW9tZW50XCJ9LGZvcm1hdDp7bWlub3JMYWJlbHM6e21pbGxpc2Vjb25kOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sc2Vjb25kOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sbWludXRlOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0saG91cjp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHdlZWtkYXk6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxkYXk6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx3ZWVrOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sbW9udGg6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx5ZWFyOntzd
21167HJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sX190eXBlX186e29iamVjdDpyLGZ1bmN0aW9uOlwiZnVuY3Rpb25cIn19LG1ham9yTGFiZWxzOnttaWxsaXNlY29uZDp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHNlY29uZDp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LG1pbnV0ZTp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LGhvdXI6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx3ZWVrZGF5OntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sZGF5OntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sd2Vlazp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LG1vbnRoOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0seWVhcjp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntvYmplY3Q6cixmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9fSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxtb21lbnQ6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sZ3JvdXBPcmRlcjp7c3RyaW5nOm8sZnVuY3Rpb246XCJmdW5jdGlvblwifSxncm91cEVkaXRhYmxlOnthZGQ6e2Jvb2xlYW46bix1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0scmVtb3ZlOntib29sZWFuOm4sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LG9yZGVyOntib29sZWFuOm4sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntib29sZWFuOm4sb2JqZWN0OnJ9fSxncm91cE9yZGVyU3dhcDp7ZnVuY3Rpb246XCJmdW5jdGlvblwifSxoZWlnaHQ6e3N0cmluZzpvLG51bWJlcjpzfSxoaWRkZW5EYXRlczp7c3RhcnQ6e2RhdGU6XCJkYXRlXCIsbnVtYmVyOnMsc3RyaW5nOm8sbW9tZW50OlwibW9tZW50XCJ9LGVuZDp7ZGF0ZTpcImRhdGVcIixudW1iZXI6cyxzdHJpbmc6byxtb21lbnQ6XCJtb21lbnRcIn0scmVwZWF0OntzdHJpbmc6b30sX190eXBlX186e29iamVjdDpyLGFycmF5OlwiYXJyYXlcIn19LGl0ZW1zQWx3YXlzRHJhZ2dhYmxlOntpdGVtOntib29sZWFuOm4sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHJhbmdlOntib29sZWFuOm4sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntib29sZWFuOm4sb2JqZWN0OnJ9fSxsaW1pdFNpemU6e2Jvb2xlYW46bn0sbG9jYWxlOntzdHJpbmc6b30sbG9jYWxlczp7X19hbnlfXzp7YW55OlwiYW55XCJ9LF9fdHlwZV9fOntvYmplY3Q6cn19LG1hcmdpbjp7YXhpczp7bnVtYmVyOnN9LGl0ZW06e2hvcml6b250YWw6e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx2ZXJ0aWNhbDp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntvYmplY3Q6cixudW1iZXI6c319LF9fdHlwZV9fOntvYmplY3Q6cixudW1iZXI6c319LG1heDp7ZGF0ZTpcImRhdGVcIixudW1iZXI6cyxzdHJpbmc6byxtb21lbnQ6XCJtb21lbnRcIn0sbWF4SGVpZ2h0OntudW1iZXI6cyxzdHJpbmc6b30sbWF4TWlub3JDaGFyczp7bnVtYmVyOnN9LG1pbjp7ZGF0ZTpcImRhdGVcIixudW1iZXI6cyxzdHJpbmc6byxtb21lbnQ6XCJtb21lbnRcIn0sbWluSGVpZ2h0OntudW1iZXI6cyxzdHJpbmc6b30sbW92ZWFibGU6e2Jvb2xlYW46bn0sbXVsdGlzZWxlY3Q6e2Jvb2xlYW46bn0sbXVsdGlzZWxlY3RQZXJHcm91cDp7Ym9vbGVhbjpufSxvbkFkZDp7ZnVuY3Rpb246XCJmdW5jdGlvblwifSxvbkRyb3BPYmplY3RPbkl0ZW06e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sb25VcGRhdGU6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sb25Nb3ZlOntmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LG9uTW92aW5nOntmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LG9uUmVtb3ZlOntmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LG9uQWRkR3JvdXA6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sb25Nb3ZlR3JvdXA6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sb25SZW1vdmVHcm91cDp7ZnVuY3Rpb246XCJmdW5jdGlvblwifSxvbkluaXRpYWxEcmF3Q29tcGxldGU6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sb3JkZXI6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sb3JpZW50YXRpb246e2F4aXM6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxpdGVtOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sX190eXBlX186e3N0cmluZzpvLG9iamVjdDpyfX0sc2VsZWN0YWJsZTp7Ym9vbGVhbjpufSxzaG93Q3VycmVudFRpbWU6e2Jvb2xlYW46bn0sc2hvd01ham9yTGFiZWxzOntib29sZWFuOm59LHNob3dNaW5vckxhYmVsczp7Ym9vbGVhbjpufSxzdGFjazp7Ym9vbGVhbjpufSxzdGFja1N1Ymdyb3Vwczp7Ym9vbGVhbjpufSxzbmFwOntmdW5jdGlvbjpcImZ1bmN0aW9uXCIsbnVsbDpcIm51bGxcIn0sc3RhcnQ6e2RhdGU6XCJkYXRlXCIsbnVtYmVyOnMsc3RyaW5nOm8sbW9tZW50OlwibW9tZW50XCJ9LHRlbXBsYXRlOntmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LGdyb3VwVGVtcGxhdGU6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sdmlzaWJsZUZyYW1lVGVtcGxhdGU6e3N0cmluZzpvLGZ1bmN0aW9uOlwiZnVuY3Rpb25cIn0sc2hvd1Rvb2x0aXBzOntib29sZWFuOm59LHRvb2x0aXA6e2ZvbGxvd01vdXNlOntib29sZWFuOm59LG92ZXJmbG93TWV0aG9kOntzdHJpbmc6W1wiY2FwXCIsXCJmbGlwXCJdfSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSx0b29sdGlwT25JdGVtVXBkYXRlVGltZTp7dGVtcGxhdGU6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sX190eXBlX186e2Jvb2xlYW46bixvYmplY3Q6cn19LHRpbWVBeGlzOntzY2FsZTp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHN0ZXA6e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSx0eXBlOntzdHJpbmc6b30sd2lkdGg6e3N0cmluZzpvLG51bWJlcjpzfSx6b29tYWJsZTp7Ym9vbGVhbjpufSx6b29tS2V5OntzdHJpbmc6W1wiY3RybEtleVwiLFwiYWx0S2V5XCIsXCJtZXRhS2V5XCIsXCJcIl19LHpvb21NYXg6e251bWJlcjpzfSx6b29tTWluOntudW1iZXI6c30sX190eXBlX186e29iamVjdDpyfX0saD17Z2xvYmFsOnthbGlnbjpbXCJjZW50ZXJcIixcImxlZnRcIixcInJpZ2h0XCJdLGRpcmVjdGlvbj
21167ohMSxhdXRvUmVzaXplOiEwLGNsaWNrVG9Vc2U6ITEsZWRpdGFibGU6e2FkZDohMSxyZW1vdmU6ITEsdXBkYXRlR3JvdXA6ITEsdXBkYXRlVGltZTohMX0sZW5kOlwiXCIsZm9ybWF0OnttaW5vckxhYmVsczp7bWlsbGlzZWNvbmQ6XCJTU1NcIixzZWNvbmQ6XCJzXCIsbWludXRlOlwiSEg6bW1cIixob3VyOlwiSEg6bW1cIix3ZWVrZGF5OlwiZGRkIERcIixkYXk6XCJEXCIsd2VlazpcIndcIixtb250aDpcIk1NTVwiLHllYXI6XCJZWVlZXCJ9LG1ham9yTGFiZWxzOnttaWxsaXNlY29uZDpcIkhIOm1tOnNzXCIsc2Vjb25kOlwiRCBNTU1NIEhIOm1tXCIsbWludXRlOlwiZGRkIEQgTU1NTVwiLGhvdXI6XCJkZGQgRCBNTU1NXCIsd2Vla2RheTpcIk1NTU0gWVlZWVwiLGRheTpcIk1NTU0gWVlZWVwiLHdlZWs6XCJNTU1NIFlZWVlcIixtb250aDpcIllZWVlcIix5ZWFyOlwiXCJ9fSxncm91cHNEcmFnZ2FibGU6ITEsaGVpZ2h0OlwiXCIsbG9jYWxlOlwiXCIsbWFyZ2luOntheGlzOlsyMCwwLDEwMCwxXSxpdGVtOntob3Jpem9udGFsOlsxMCwwLDEwMCwxXSx2ZXJ0aWNhbDpbMTAsMCwxMDAsMV19fSxtYXg6XCJcIixtYXhIZWlnaHQ6XCJcIixtYXhNaW5vckNoYXJzOls3LDAsMjAsMV0sbWluOlwiXCIsbWluSGVpZ2h0OlwiXCIsbW92ZWFibGU6ITEsbXVsdGlzZWxlY3Q6ITEsbXVsdGlzZWxlY3RQZXJHcm91cDohMSxvcmllbnRhdGlvbjp7YXhpczpbXCJib3RoXCIsXCJib3R0b21cIixcInRvcFwiXSxpdGVtOltcImJvdHRvbVwiLFwidG9wXCJdfSxzZWxlY3RhYmxlOiEwLHNob3dDdXJyZW50VGltZTohMSxzaG93TWFqb3JMYWJlbHM6ITAsc2hvd01pbm9yTGFiZWxzOiEwLHN0YWNrOiEwLHN0YWNrU3ViZ3JvdXBzOiEwLHN0YXJ0OlwiXCIsc2hvd1Rvb2x0aXBzOiEwLHRvb2x0aXA6e2ZvbGxvd01vdXNlOiExLG92ZXJmbG93TWV0aG9kOlwiZmxpcFwifSx0b29sdGlwT25JdGVtVXBkYXRlVGltZTohMSx0eXBlOltcImJveFwiLFwicG9pbnRcIixcInJhbmdlXCIsXCJiYWNrZ3JvdW5kXCJdLHdpZHRoOlwiMTAwJVwiLHpvb21hYmxlOiEwLHpvb21LZXk6W1wiY3RybEtleVwiLFwiYWx0S2V5XCIsXCJtZXRhS2V5XCIsXCJcIl0sem9vbU1heDpbMzE1MzZlMTAsMTAsMzE1MzZlMTAsMV0sem9vbU1pbjpbMTAsMTAsMzE1MzZlMTAsMV19fTtlLmFsbE9wdGlvbnM9YSxlLmNvbmZpZ3VyZU9wdGlvbnM9aH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt0aGlzLmlkPXIucmFuZG9tVVVJRCgpLHRoaXMuYm9keT10LHRoaXMuZGVmYXVsdE9wdGlvbnM9e3lBeGlzT3JpZW50YXRpb246XCJsZWZ0XCIsZGVmYXVsdEdyb3VwOlwiZGVmYXVsdFwiLHNvcnQ6ITAsc2FtcGxpbmc6ITAsc3RhY2s6ITEsZ3JhcGhIZWlnaHQ6XCI0MDBweFwiLHNoYWRlZDp7ZW5hYmxlZDohMSxvcmllbnRhdGlvbjpcImJvdHRvbVwifSxzdHlsZTpcImxpbmVcIixiYXJDaGFydDp7d2lkdGg6NTAsc2lkZUJ5U2lkZTohMSxhbGlnbjpcImNlbnRlclwifSxpbnRlcnBvbGF0aW9uOntlbmFibGVkOiEwLHBhcmFtZXRyaXphdGlvbjpcImNlbnRyaXBldGFsXCIsYWxwaGE6LjV9LGRyYXdQb2ludHM6e2VuYWJsZWQ6ITAsc2l6ZTo2LHN0eWxlOlwic3F1YXJlXCJ9LGRhdGFBeGlzOnt9LGxlZ2VuZDp7fSxncm91cHM6e3Zpc2liaWxpdHk6e319fSx0aGlzLm9wdGlvbnM9ci5leHRlbmQoe30sdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5kb209e30sdGhpcy5wcm9wcz17fSx0aGlzLmhhbW1lcj1udWxsLHRoaXMuZ3JvdXBzPXt9LHRoaXMuYWJvcnRlZEdyYXBoVXBkYXRlPSExLHRoaXMudXBkYXRlU1ZHaGVpZ2h0PSExLHRoaXMudXBkYXRlU1ZHaGVpZ2h0T25SZXNpemU9ITEsdGhpcy5mb3JjZUdyYXBoVXBkYXRlPSEwO3ZhciBpPXRoaXM7dGhpcy5pdGVtc0RhdGE9bnVsbCx0aGlzLmdyb3Vwc0RhdGE9bnVsbCx0aGlzLml0ZW1MaXN0ZW5lcnM9e2FkZDpmdW5jdGlvbih0LGUsbyl7aS5fb25BZGQoZS5pdGVtcyl9LHVwZGF0ZTpmdW5jdGlvbih0LGUsbyl7aS5fb25VcGRhdGUoZS5pdGVtcyl9LHJlbW92ZTpmdW5jdGlvbih0LGUsbyl7aS5fb25SZW1vdmUoZS5pdGVtcyl9fSx0aGlzLmdyb3VwTGlzdGVuZXJzPXthZGQ6ZnVuY3Rpb24odCxlLG8pe2kuX29uQWRkR3JvdXBzKGUuaXRlbXMpfSx1cGRhdGU6ZnVuY3Rpb24odCxlLG8pe2kuX29uVXBkYXRlR3JvdXBzKGUuaXRlbXMpfSxyZW1vdmU6ZnVuY3Rpb24odCxlLG8pe2kuX29uUmVtb3ZlR3JvdXBzKGUuaXRlbXMpfX0sdGhpcy5pdGVtcz17fSx0aGlzLnNlbGVjdGlvbj1bXSx0aGlzLmxhc3RTdGFydD10aGlzLmJvZHkucmFuZ2Uuc3RhcnQsdGhpcy50b3VjaFBhcmFtcz17fSx0aGlzLnN2Z0VsZW1lbnRzPXt9LHRoaXMuc2V0T3B0aW9ucyhlKSx0aGlzLmdyb3Vwc1VzaW5nRGVmYXVsdFN0eWxlcz1bMF0sdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJyYW5nZWNoYW5nZWRcIixmdW5jdGlvbigpe2kubGFzdFN0YXJ0PWkuYm9keS5yYW5nZS5zdGFydCxpLnN2Zy5zdHlsZS5sZWZ0PXIub3B0aW9uLmFzU2l6ZSgtaS5wcm9wcy53aWR0aCksaS5mb3JjZUdyYXBoVXBkYXRlPSEwLGkucmVkcmF3LmNhbGwoaSl9KSx0aGlzLl9jcmVhdGUoKSx0aGlzLmZyYW1ld29yaz17c3ZnOnRoaXMuc3ZnLHN2Z0VsZW1lbnRzOnRoaXMuc3ZnRWxlbWVudHMsb3B0aW9uczp0aGlzLm9wdGlvbnMsZ3JvdXBzOnRoaXMuZ3JvdXBzfX12YXIgbj1pKDYpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShuKSxyPWkoMiksYT1pKDE0KSxoPWkoMTEpLGQ9aSgxMiksbD1pKDE2KSx1PWkoMTA3KSxjPWkoMTA5KSxwPWkoMTEyKSxmPWkoMTEwKSxtPWkoMTExKSx2PWkoNzIpO28ucHJvdG90eXBlPW5ldyBsLG8ucHJvdG90eXBlLl9jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3QuY2xhc3NOYW1lPVwidmlzLWxpbmUtZ3JhcGhcIix0aGlzLmRvbS5mcmFtZT10LHRoaXMuc3ZnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXCJzdmdcIiksdGhpcy5zdmcuc3R5bGUucG9zaXRpb249XCJyZWxhdGl2ZVwiLHRoaXMuc3ZnLnN0eWxlLmhlaWdodD0oXCJcIit0aGlzLm9wdGlvbnMuZ3JhcGhIZWlnaHQpLnJlcGxhY2UoXCJweFwiLFwiXCIpK1wicHhcIix0aGlzLnN2Zy5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIix0LmFwcGVuZENoaWxkKHRoaXMuc3ZnKSx0aGlzLm9wdGlvbnMuZGF0YUF4aXMub3JpZW50YXRpb249XCJsZWZ0XCIsdGhpcy55QXhpc0xlZnQ9bmV3IHUodGhpcy5ib2R5LHRoaXMub3B0aW9ucy5kYXRhQXhpcyx0aGlzLnN2Zyx0aGlzLm9wdGlvbnMuZ3JvdXBzKSx0aGlzLm9wdGlvbnMuZGF0YUF4aXMub3JpZW50YXRpb249XCJyaWdodFwiLHRoaXMueUF4aXNSaWdodD1uZXcgdSh0aGlzLmJvZHksdGhpcy5vcHRpb25zLmRh
21167dGFBeGlzLHRoaXMuc3ZnLHRoaXMub3B0aW9ucy5ncm91cHMpLGRlbGV0ZSB0aGlzLm9wdGlvbnMuZGF0YUF4aXMub3JpZW50YXRpb24sdGhpcy5sZWdlbmRMZWZ0PW5ldyBwKHRoaXMuYm9keSx0aGlzLm9wdGlvbnMubGVnZW5kLFwibGVmdFwiLHRoaXMub3B0aW9ucy5ncm91cHMpLHRoaXMubGVnZW5kUmlnaHQ9bmV3IHAodGhpcy5ib2R5LHRoaXMub3B0aW9ucy5sZWdlbmQsXCJyaWdodFwiLHRoaXMub3B0aW9ucy5ncm91cHMpLHRoaXMuc2hvdygpfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPVtcInNhbXBsaW5nXCIsXCJkZWZhdWx0R3JvdXBcIixcInN0YWNrXCIsXCJoZWlnaHRcIixcImdyYXBoSGVpZ2h0XCIsXCJ5QXhpc09yaWVudGF0aW9uXCIsXCJzdHlsZVwiLFwiYmFyQ2hhcnRcIixcImRhdGFBeGlzXCIsXCJzb3J0XCIsXCJncm91cHNcIl07dm9pZCAwPT09dC5ncmFwaEhlaWdodCYmdm9pZCAwIT09dC5oZWlnaHQ/KHRoaXMudXBkYXRlU1ZHaGVpZ2h0PSEwLHRoaXMudXBkYXRlU1ZHaGVpZ2h0T25SZXNpemU9ITApOnZvaWQgMCE9PXRoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXJDb250YWluZXIuaGVpZ2h0JiZ2b2lkIDAhPT10LmdyYXBoSGVpZ2h0JiZwYXJzZUludCgodC5ncmFwaEhlaWdodCtcIlwiKS5yZXBsYWNlKFwicHhcIixcIlwiKSk8dGhpcy5ib2R5LmRvbVByb3BzLmNlbnRlckNvbnRhaW5lci5oZWlnaHQmJih0aGlzLnVwZGF0ZVNWR2hlaWdodD0hMCksci5zZWxlY3RpdmVEZWVwRXh0ZW5kKGUsdGhpcy5vcHRpb25zLHQpLHIubWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucyx0LFwiaW50ZXJwb2xhdGlvblwiKSxyLm1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsdCxcImRyYXdQb2ludHNcIiksci5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsXCJzaGFkZWRcIiksci5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsXCJsZWdlbmRcIiksdC5pbnRlcnBvbGF0aW9uJiZcIm9iamVjdFwiPT0oMCxzLmRlZmF1bHQpKHQuaW50ZXJwb2xhdGlvbikmJnQuaW50ZXJwb2xhdGlvbi5wYXJhbWV0cml6YXRpb24mJihcInVuaWZvcm1cIj09dC5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbj90aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5hbHBoYT0wOlwiY2hvcmRhbFwiPT10LmludGVycG9sYXRpb24ucGFyYW1ldHJpemF0aW9uP3RoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmFscGhhPTE6KHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbj1cImNlbnRyaXBldGFsXCIsdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uYWxwaGE9LjUpKSx0aGlzLnlBeGlzTGVmdCYmdm9pZCAwIT09dC5kYXRhQXhpcyYmKHRoaXMueUF4aXNMZWZ0LnNldE9wdGlvbnModGhpcy5vcHRpb25zLmRhdGFBeGlzKSx0aGlzLnlBeGlzUmlnaHQuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMuZGF0YUF4aXMpKSx0aGlzLmxlZ2VuZExlZnQmJnZvaWQgMCE9PXQubGVnZW5kJiYodGhpcy5sZWdlbmRMZWZ0LnNldE9wdGlvbnModGhpcy5vcHRpb25zLmxlZ2VuZCksdGhpcy5sZWdlbmRSaWdodC5zZXRPcHRpb25zKHRoaXMub3B0aW9ucy5sZWdlbmQpKSx0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShcIl9fdW5ncm91cGVkX19cIikmJnRoaXMuZ3JvdXBzLl9fdW5ncm91cGVkX18uc2V0T3B0aW9ucyh0KX10aGlzLmRvbS5mcmFtZSYmKHRoaXMuZm9yY2VHcmFwaFVwZGF0ZT0hMCx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2NoYW5nZVwiLHtxdWV1ZTohMH0pKX0sby5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUmJnRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZnJhbWUpfSxvLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZXx8dGhpcy5ib2R5LmRvbS5jZW50ZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20uZnJhbWUpfSxvLnByb3RvdHlwZS5zZXRJdGVtcz1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMsbz10aGlzLml0ZW1zRGF0YTtpZih0KXtpZighKHQgaW5zdGFuY2VvZiBofHx0IGluc3RhbmNlb2YgZCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRhdGEgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBEYXRhU2V0IG9yIERhdGFWaWV3XCIpO3RoaXMuaXRlbXNEYXRhPXR9ZWxzZSB0aGlzLml0ZW1zRGF0YT1udWxsO2lmKG8mJihyLmZvckVhY2godGhpcy5pdGVtTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7by5vZmYoZSx0KX0pLGU9by5nZXRJZHMoKSx0aGlzLl9vblJlbW92ZShlKSksdGhpcy5pdGVtc0RhdGEpe3ZhciBuPXRoaXMuaWQ7ci5mb3JFYWNoKHRoaXMuaXRlbUxpc3RlbmVycyxmdW5jdGlvbih0LGUpe2kuaXRlbXNEYXRhLm9uKGUsdCxuKX0pLGU9dGhpcy5pdGVtc0RhdGEuZ2V0SWRzKCksdGhpcy5fb25BZGQoZSl9fSxvLnByb3RvdHlwZS5zZXRHcm91cHM9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzO2lmKHRoaXMuZ3JvdXBzRGF0YSl7ci5mb3JFYWNoKHRoaXMuZ3JvdXBMaXN0ZW5lcnMsZnVuY3Rpb24odCxlKXtpLmdyb3Vwc0RhdGEub2ZmKGUsdCl9KSxlPXRoaXMuZ3JvdXBzRGF0YS5nZXRJZHMoKSx0aGlzLmdyb3Vwc0RhdGE9bnVsbDtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl0aGlzLl9yZW1vdmVHcm91cChlW29dKX1pZih0KXtpZighKHQgaW5zdGFuY2VvZiBofHx0IGluc3RhbmNlb2YgZCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRhdGEgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBEYXRhU2V0IG9yIERhdGFWaWV3XCIpO3RoaXMuZ3JvdXBzRGF0YT10fWVsc2UgdGhpcy5ncm91cHNEYXRhPW51bGw7aWYodGhpcy5ncm91cHNEYXRhKXt2YXIgbj10aGlzLmlkO3IuZm9yRWFjaCh0aGlzLmdyb3VwTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7aS5ncm91cHNEYXRhLm9uKGUsdCxuKX0pLGU9dGhpcy5ncm91cHNEYXRhLmdldElkcygpLHRoaXMuX29uQWRkR3JvdXBzKGUpfX0sby5wcm90b3R5cGUuX29uVXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMuX3VwZGF0ZUFsbEdyb3VwRGF0YSh0KX0sby5wcm90b3R5cGUuX29uQWRkPWZ1bmN0aW9uKHQpe3RoaXMuX29uVXBkYXRlKHQpfSxvLnByb3RvdHlwZS5fb25SZW1vdmU9ZnVuY3Rpb24odCl7dGhpcy5fb25VcGRhdGUodCl9LG8ucHJvdG90eXBlLl9vblVwZGF0ZUdyb3Vwcz1mdW5jdGlvbih0KXt0aGlzLl91cGRhdGVBbGxHcm91cERhdGEobnVsbCx0KX0sby5wcm90b3R5cGUuX29uQWRkR3JvdXBzPWZ1bmN0aW9uKHQpe3RoaXMuX29uVXBkYXRlR3JvdXBzKHQpfSxvLnByb3RvdHlwZS5fb25SZW1vdmVHcm91cHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKysp
21167dGhpcy5fcmVtb3ZlR3JvdXAodFtlXSk7dGhpcy5mb3JjZUdyYXBoVXBkYXRlPSEwLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfY2hhbmdlXCIse3F1ZXVlOiEwfSl9LG8ucHJvdG90eXBlLl9yZW1vdmVHcm91cD1mdW5jdGlvbih0KXt0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eSh0KSYmKFwicmlnaHRcIj09dGhpcy5ncm91cHNbdF0ub3B0aW9ucy55QXhpc09yaWVudGF0aW9uPyh0aGlzLnlBeGlzUmlnaHQucmVtb3ZlR3JvdXAodCksdGhpcy5sZWdlbmRSaWdodC5yZW1vdmVHcm91cCh0KSx0aGlzLmxlZ2VuZFJpZ2h0LnJlZHJhdygpKToodGhpcy55QXhpc0xlZnQucmVtb3ZlR3JvdXAodCksdGhpcy5sZWdlbmRMZWZ0LnJlbW92ZUdyb3VwKHQpLHRoaXMubGVnZW5kTGVmdC5yZWRyYXcoKSksZGVsZXRlIHRoaXMuZ3JvdXBzW3RdKX0sby5wcm90b3R5cGUuX3VwZGF0ZUdyb3VwPWZ1bmN0aW9uKHQsZSl7dGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkoZSk/KHRoaXMuZ3JvdXBzW2VdLnVwZGF0ZSh0KSxcInJpZ2h0XCI9PXRoaXMuZ3JvdXBzW2VdLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbj8odGhpcy55QXhpc1JpZ2h0LnVwZGF0ZUdyb3VwKGUsdGhpcy5ncm91cHNbZV0pLHRoaXMubGVnZW5kUmlnaHQudXBkYXRlR3JvdXAoZSx0aGlzLmdyb3Vwc1tlXSksdGhpcy55QXhpc0xlZnQucmVtb3ZlR3JvdXAoZSksdGhpcy5sZWdlbmRMZWZ0LnJlbW92ZUdyb3VwKGUpKToodGhpcy55QXhpc0xlZnQudXBkYXRlR3JvdXAoZSx0aGlzLmdyb3Vwc1tlXSksdGhpcy5sZWdlbmRMZWZ0LnVwZGF0ZUdyb3VwKGUsdGhpcy5ncm91cHNbZV0pLHRoaXMueUF4aXNSaWdodC5yZW1vdmVHcm91cChlKSx0aGlzLmxlZ2VuZFJpZ2h0LnJlbW92ZUdyb3VwKGUpKSk6KHRoaXMuZ3JvdXBzW2VdPW5ldyBjKHQsZSx0aGlzLm9wdGlvbnMsdGhpcy5ncm91cHNVc2luZ0RlZmF1bHRTdHlsZXMpLFwicmlnaHRcIj09dGhpcy5ncm91cHNbZV0ub3B0aW9ucy55QXhpc09yaWVudGF0aW9uPyh0aGlzLnlBeGlzUmlnaHQuYWRkR3JvdXAoZSx0aGlzLmdyb3Vwc1tlXSksdGhpcy5sZWdlbmRSaWdodC5hZGRHcm91cChlLHRoaXMuZ3JvdXBzW2VdKSk6KHRoaXMueUF4aXNMZWZ0LmFkZEdyb3VwKGUsdGhpcy5ncm91cHNbZV0pLHRoaXMubGVnZW5kTGVmdC5hZGRHcm91cChlLHRoaXMuZ3JvdXBzW2VdKSkpLHRoaXMubGVnZW5kTGVmdC5yZWRyYXcoKSx0aGlzLmxlZ2VuZFJpZ2h0LnJlZHJhdygpfSxvLnByb3RvdHlwZS5fdXBkYXRlQWxsR3JvdXBEYXRhPWZ1bmN0aW9uKHQsZSl7aWYobnVsbCE9dGhpcy5pdGVtc0RhdGEpe3ZhciBpPXt9LG89dGhpcy5pdGVtc0RhdGEuZ2V0KCksbj10aGlzLml0ZW1zRGF0YS5fZmllbGRJZCxzPXt9O3QmJnQubWFwKGZ1bmN0aW9uKHQpe3NbdF09dH0pO2Zvcih2YXIgYT17fSxoPTA7aDxvLmxlbmd0aDtoKyspe3ZhciBkPW9baF0sbD1kLmdyb3VwO251bGwhPT1sJiZ2b2lkIDAhPT1sfHwobD1cIl9fdW5ncm91cGVkX19cIiksYS5oYXNPd25Qcm9wZXJ0eShsKT9hW2xdKys6YVtsXT0xfXZhciB1PXt9O2lmKCFlJiZ0KWZvcihsIGluIHRoaXMuZ3JvdXBzKWlmKHRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KGwpKXt2PXRoaXMuZ3JvdXBzW2xdO3ZhciBjPXYuZ2V0SXRlbXMoKTtpW2xdPWMuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB1W3Rbbl1dPXRbbl0sdFtuXSE9PXNbdFtuXV19KTt2YXIgcD1hW2xdO2FbbF0tPWlbbF0ubGVuZ3RoLGlbbF0ubGVuZ3RoPHAmJihpW2xdW3AtMV09e30pfWZvcihoPTA7aDxvLmxlbmd0aDtoKyspaWYoZD1vW2hdLGw9ZC5ncm91cCxudWxsIT09bCYmdm9pZCAwIT09bHx8KGw9XCJfX3VuZ3JvdXBlZF9fXCIpLGV8fCF0fHxkW25dPT09c1tkW25dXXx8IXUuaGFzT3duUHJvcGVydHkoZFtuXSkpe2kuaGFzT3duUHJvcGVydHkobCl8fChpW2xdPW5ldyBBcnJheShhW2xdKSk7dmFyIGY9ci5icmlkZ2VPYmplY3QoZCk7Zi54PXIuY29udmVydChkLngsXCJEYXRlXCIpLGYuZW5kPXIuY29udmVydChkLmVuZCxcIkRhdGVcIiksZi5vcmdpbmFsWT1kLnksZi55PU51bWJlcihkLnkpLFxuICAgIGZbbl09ZFtuXTt2YXIgbT1pW2xdLmxlbmd0aC1hW2xdLS07aVtsXVttXT1mfWZvcihsIGluIHRoaXMuZ3JvdXBzKXRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KGwpJiYoaS5oYXNPd25Qcm9wZXJ0eShsKXx8KGlbbF09bmV3IEFycmF5KDApKSk7Zm9yKGwgaW4gaSlpZihpLmhhc093blByb3BlcnR5KGwpKWlmKDA9PWlbbF0ubGVuZ3RoKXRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KGwpJiZ0aGlzLl9yZW1vdmVHcm91cChsKTtlbHNle3ZhciB2PXZvaWQgMDt2b2lkIDAhPXRoaXMuZ3JvdXBzRGF0YSYmKHY9dGhpcy5ncm91cHNEYXRhLmdldChsKSksdm9pZCAwPT12JiYodj17aWQ6bCxjb250ZW50OnRoaXMub3B0aW9ucy5kZWZhdWx0R3JvdXArbH0pLHRoaXMuX3VwZGF0ZUdyb3VwKHYsbCksdGhpcy5ncm91cHNbbF0uc2V0SXRlbXMoaVtsXSl9dGhpcy5mb3JjZUdyYXBoVXBkYXRlPSEwLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfY2hhbmdlXCIse3F1ZXVlOiEwfSl9fSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXt2YXIgdD0hMTt0aGlzLnByb3BzLndpZHRoPXRoaXMuZG9tLmZyYW1lLm9mZnNldFdpZHRoLHRoaXMucHJvcHMuaGVpZ2h0PXRoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXJDb250YWluZXIuaGVpZ2h0LXRoaXMuYm9keS5kb21Qcm9wcy5ib3JkZXIudG9wLXRoaXMuYm9keS5kb21Qcm9wcy5ib3JkZXIuYm90dG9tLHQ9dGhpcy5faXNSZXNpemVkKCl8fHQ7dmFyIGU9dGhpcy5ib2R5LnJhbmdlLmVuZC10aGlzLmJvZHkucmFuZ2Uuc3RhcnQsaT1lIT10aGlzLmxhc3RWaXNpYmxlSW50ZXJ2YWw7aWYodGhpcy5sYXN0VmlzaWJsZUludGVydmFsPWUsMT09dCYmKHRoaXMuc3ZnLnN0eWxlLndpZHRoP
21167XIub3B0aW9uLmFzU2l6ZSgzKnRoaXMucHJvcHMud2lkdGgpLHRoaXMuc3ZnLnN0eWxlLmxlZnQ9ci5vcHRpb24uYXNTaXplKC10aGlzLnByb3BzLndpZHRoKSwtMT09KHRoaXMub3B0aW9ucy5oZWlnaHQrXCJcIikuaW5kZXhPZihcIiVcIikmJjEhPXRoaXMudXBkYXRlU1ZHaGVpZ2h0T25SZXNpemV8fCh0aGlzLnVwZGF0ZVNWR2hlaWdodD0hMCkpLDE9PXRoaXMudXBkYXRlU1ZHaGVpZ2h0Pyh0aGlzLm9wdGlvbnMuZ3JhcGhIZWlnaHQhPXRoaXMucHJvcHMuaGVpZ2h0K1wicHhcIiYmKHRoaXMub3B0aW9ucy5ncmFwaEhlaWdodD10aGlzLnByb3BzLmhlaWdodCtcInB4XCIsdGhpcy5zdmcuc3R5bGUuaGVpZ2h0PXRoaXMucHJvcHMuaGVpZ2h0K1wicHhcIiksdGhpcy51cGRhdGVTVkdoZWlnaHQ9ITEpOnRoaXMuc3ZnLnN0eWxlLmhlaWdodD0oXCJcIit0aGlzLm9wdGlvbnMuZ3JhcGhIZWlnaHQpLnJlcGxhY2UoXCJweFwiLFwiXCIpK1wicHhcIiwxPT10fHwxPT1pfHwxPT10aGlzLmFib3J0ZWRHcmFwaFVwZGF0ZXx8MT09dGhpcy5mb3JjZUdyYXBoVXBkYXRlKXQ9dGhpcy5fdXBkYXRlR3JhcGgoKXx8dCx0aGlzLmZvcmNlR3JhcGhVcGRhdGU9ITE7ZWxzZSBpZigwIT10aGlzLmxhc3RTdGFydCl7dmFyIG89dGhpcy5ib2R5LnJhbmdlLnN0YXJ0LXRoaXMubGFzdFN0YXJ0LG49dGhpcy5ib2R5LnJhbmdlLmVuZC10aGlzLmJvZHkucmFuZ2Uuc3RhcnQ7aWYoMCE9dGhpcy5wcm9wcy53aWR0aCl7dmFyIHM9dGhpcy5wcm9wcy53aWR0aC9uLGE9bypzO3RoaXMuc3ZnLnN0eWxlLmxlZnQ9LXRoaXMucHJvcHMud2lkdGgtYStcInB4XCJ9fXJldHVybiB0aGlzLmxlZ2VuZExlZnQucmVkcmF3KCksdGhpcy5sZWdlbmRSaWdodC5yZWRyYXcoKSx0fSxvLnByb3RvdHlwZS5fZ2V0U29ydGVkR3JvdXBJZHM9ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcy5ncm91cHMpaWYodGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkoZSkpe3ZhciBpPXRoaXMuZ3JvdXBzW2VdOzEhPWkudmlzaWJsZXx8dm9pZCAwIT09dGhpcy5vcHRpb25zLmdyb3Vwcy52aXNpYmlsaXR5W2VdJiYxIT10aGlzLm9wdGlvbnMuZ3JvdXBzLnZpc2liaWxpdHlbZV18fHQucHVzaCh7aWQ6ZSx6SW5kZXg6aS5vcHRpb25zLnpJbmRleH0pfXIuaW5zZXJ0U29ydCh0LGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC56SW5kZXgsbz1lLnpJbmRleDtyZXR1cm4gdm9pZCAwPT09aSYmKGk9MCksdm9pZCAwPT09byYmKG89MCksaT09bz8wOmk8bz8tMToxfSk7Zm9yKHZhciBvPW5ldyBBcnJheSh0Lmxlbmd0aCksbj0wO248dC5sZW5ndGg7bisrKW9bbl09dFtuXS5pZDtyZXR1cm4gb30sby5wcm90b3R5cGUuX3VwZGF0ZUdyYXBoPWZ1bmN0aW9uKCl7aWYoYS5wcmVwYXJlRWxlbWVudHModGhpcy5zdmdFbGVtZW50cyksMCE9dGhpcy5wcm9wcy53aWR0aCYmbnVsbCE9dGhpcy5pdGVtc0RhdGEpe3ZhciB0LGUsaT17fSxvPXRoaXMuYm9keS51dGlsLnRvR2xvYmFsVGltZSgtdGhpcy5ib2R5LmRvbVByb3BzLnJvb3Qud2lkdGgpLG49dGhpcy5ib2R5LnV0aWwudG9HbG9iYWxUaW1lKDIqdGhpcy5ib2R5LmRvbVByb3BzLnJvb3Qud2lkdGgpLHM9dGhpcy5fZ2V0U29ydGVkR3JvdXBJZHMoKTtpZihzLmxlbmd0aD4wKXt2YXIgcj17fTtmb3IodGhpcy5fZ2V0UmVsZXZhbnREYXRhKHMscixvLG4pLHRoaXMuX2FwcGx5U2FtcGxpbmcocyxyKSxlPTA7ZTxzLmxlbmd0aDtlKyspdGhpcy5fY29udmVydFhjb29yZGluYXRlcyhyW3NbZV1dKTtpZih0aGlzLl9nZXRZUmFuZ2VzKHMscixpKSwxPT10aGlzLl91cGRhdGVZQXhpcyhzLGkpKXJldHVybiBhLmNsZWFudXBFbGVtZW50cyh0aGlzLnN2Z0VsZW1lbnRzKSx0aGlzLmFib3J0ZWRHcmFwaFVwZGF0ZT0hMCwhMDt0aGlzLmFib3J0ZWRHcmFwaFVwZGF0ZT0hMTt2YXIgaD12b2lkIDA7Zm9yKGU9MDtlPHMubGVuZ3RoO2UrKyl0PXRoaXMuZ3JvdXBzW3NbZV1dLCEwPT09dGhpcy5vcHRpb25zLnN0YWNrJiZcImxpbmVcIj09PXRoaXMub3B0aW9ucy5zdHlsZSYmKHZvaWQgMCE9dC5vcHRpb25zLmV4Y2x1ZGVGcm9tU3RhY2tpbmcmJnQub3B0aW9ucy5leGNsdWRlRnJvbVN0YWNraW5nfHwodm9pZCAwIT1oJiYodGhpcy5fc3RhY2soclt0LmlkXSxyW2guaWRdKSwxPT10Lm9wdGlvbnMuc2hhZGVkLmVuYWJsZWQmJlwiZ3JvdXBcIiE9PXQub3B0aW9ucy5zaGFkZWQub3JpZW50YXRpb24mJihcInRvcFwiPT10Lm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uJiZcImdyb3VwXCIhPT1oLm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uPyhoLm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uPVwiZ3JvdXBcIixoLm9wdGlvbnMuc2hhZGVkLmdyb3VwSWQ9dC5pZCk6KHQub3B0aW9ucy5zaGFkZWQub3JpZW50YXRpb249XCJncm91cFwiLHQub3B0aW9ucy5zaGFkZWQuZ3JvdXBJZD1oLmlkKSkpLGg9dCkpLHRoaXMuX2NvbnZlcnRZY29vcmRpbmF0ZXMocltzW2VdXSx0KTt2YXIgZD17fTtmb3IoZT0wO2U8cy5sZW5ndGg7ZSsrKWlmKHQ9dGhpcy5ncm91cHNbc1tlXV0sXCJsaW5lXCI9PT10Lm9wdGlvbnMuc3R5bGUmJjE9PXQub3B0aW9ucy5zaGFkZWQuZW5hYmxlZCl7dmFyIGw9cltzW2VdXTtpZihudWxsPT1sfHwwPT1sLmxlbmd0aCljb250aW51ZTtpZihkLmhhc093blByb3BlcnR5KHNbZV0pfHwoZFtzW2VdXT1tLmNhbGNQYXRoKGwsdCkpLFwiZ3JvdXBcIj09PXQub3B0aW9ucy5zaGFkZWQub3JpZW50YXRpb24pe3ZhciB1PXQub3B0aW9ucy5zaGFkZWQuZ3JvdXBJZDtpZigtMT09PXMuaW5kZXhPZih1KSl7Y29uc29sZS5sb2codC5pZCtcIjogVW5rbm93biBzaGFkaW5nIGdyb3VwIHRhcmdldCBnaXZlbjpcIit1KTtjb250aW51ZX1kLmhhc093blByb3BlcnR5KHUpfHwoZFt1XT1tLmNhbGNQYXRoKHJbdV0sdGhpcy5ncm91cHNbdV0pKSxtLmRyYXdTaGFkaW5nKGRbc1tlXV0sdCxkW3VdLHRoaXMuZnJhbWV3b3JrKX1lbHNlIG0uZHJhd1NoYWRpbmcoZFtzW2VdXSx0LHZvaWQgMCx0aGlzLmZyYW1ld29yayl9Zm9yKGYuZHJhdyhzLHIsdGhpcy5mcmFtZXdvcmspLGU9MDtlPHMubGVuZ3RoO2UrKylpZih0PXRoaXMuZ3JvdXBzW3NbZV1dLHJbc1tlXV0ubGVuZ3RoPjApc3dpdGNoKHQub3B0aW9ucy5zdHlsZSl7Y2FzZVwibGluZVwiOmQuaGFzT3duUHJvcGVydHkoc1tlXSl8fChkW3NbZV1dPW0uY2FsY1BhdGgocltzW2VdXSx0KSksbS5kcmF3KGRbc1tlXV0sdCx0aGlzLmZyYW1ld29yayk7Y2FzZVwicG9pbnRcIjpjYXNlXCJwb2ludHNcIjpcInBvaW50XCIhPXQub3B0aW9ucy5zdHlsZSYmXCJwb2ludHNcIiE9dC5vcHRpb25zLnN0eWxlJiYxIT10Lm9wdGlvbnMuZHJhd1BvaW50cy5lbmFibGVkfHx2LmRyYXcocltzW2VdXSx0LH
21167RoaXMuZnJhbWV3b3JrKX19fXJldHVybiBhLmNsZWFudXBFbGVtZW50cyh0aGlzLnN2Z0VsZW1lbnRzKSwhMX0sby5wcm90b3R5cGUuX3N0YWNrPWZ1bmN0aW9uKHQsZSl7dmFyIGksbyxuLHMscjtpPTA7Zm9yKHZhciBhPTA7YTx0Lmxlbmd0aDthKyspe3M9dm9pZCAwLHI9dm9pZCAwO2Zvcih2YXIgaD1pO2g8ZS5sZW5ndGg7aCsrKXtpZihlW2hdLng9PT10W2FdLngpe3M9ZVtoXSxyPWVbaF0saT1oO2JyZWFrfWlmKGVbaF0ueD50W2FdLngpe3I9ZVtoXSxzPTA9PWg/cjplW2gtMV0saT1oO2JyZWFrfX12b2lkIDA9PT1yJiYocz1lW2UubGVuZ3RoLTFdLHI9ZVtlLmxlbmd0aC0xXSksbz1yLngtcy54LG49ci55LXMueSx0W2FdLnk9MD09bz90W2FdLm9yZ2luYWxZK3IueTp0W2FdLm9yZ2luYWxZK24vbyoodFthXS54LXMueCkrcy55fX0sby5wcm90b3R5cGUuX2dldFJlbGV2YW50RGF0YT1mdW5jdGlvbih0LGUsaSxvKXt2YXIgbixzLGEsaDtpZih0Lmxlbmd0aD4wKWZvcihzPTA7czx0Lmxlbmd0aDtzKyspe249dGhpcy5ncm91cHNbdFtzXV07dmFyIGQ9bi5nZXRJdGVtcygpO2lmKDE9PW4ub3B0aW9ucy5zb3J0KXt2YXIgbD1mdW5jdGlvbih0LGUpe3JldHVybiB0LmdldFRpbWUoKT09ZS5nZXRUaW1lKCk/MDp0PGU/LTE6MX0sdT1NYXRoLm1heCgwLHIuYmluYXJ5U2VhcmNoVmFsdWUoZCxpLFwieFwiLFwiYmVmb3JlXCIsbCkpLGM9TWF0aC5taW4oZC5sZW5ndGgsci5iaW5hcnlTZWFyY2hWYWx1ZShkLG8sXCJ4XCIsXCJhZnRlclwiLGwpKzEpO2M8PTAmJihjPWQubGVuZ3RoKTt2YXIgcD1uZXcgQXJyYXkoYy11KTtmb3IoYT11O2E8YzthKyspaD1uLml0ZW1zRGF0YVthXSxwW2EtdV09aDtlW3Rbc11dPXB9ZWxzZSBlW3Rbc11dPW4uaXRlbXNEYXRhfX0sby5wcm90b3R5cGUuX2FwcGx5U2FtcGxpbmc9ZnVuY3Rpb24odCxlKXt2YXIgaTtpZih0Lmxlbmd0aD4wKWZvcih2YXIgbz0wO288dC5sZW5ndGg7bysrKWlmKGk9dGhpcy5ncm91cHNbdFtvXV0sMT09aS5vcHRpb25zLnNhbXBsaW5nKXt2YXIgbj1lW3Rbb11dO2lmKG4ubGVuZ3RoPjApe3ZhciBzPTEscj1uLmxlbmd0aCxhPXRoaXMuYm9keS51dGlsLnRvR2xvYmFsU2NyZWVuKG5bbi5sZW5ndGgtMV0ueCktdGhpcy5ib2R5LnV0aWwudG9HbG9iYWxTY3JlZW4oblswXS54KSxoPXIvYTtzPU1hdGgubWluKE1hdGguY2VpbCguMipyKSxNYXRoLm1heCgxLE1hdGgucm91bmQoaCkpKTtmb3IodmFyIGQ9bmV3IEFycmF5KHIpLGw9MDtsPHI7bCs9cyl7dmFyIHU9TWF0aC5yb3VuZChsL3MpO2RbdV09bltsXX1lW3Rbb11dPWQuc3BsaWNlKDAsTWF0aC5yb3VuZChyL3MpKX19fSxvLnByb3RvdHlwZS5fZ2V0WVJhbmdlcz1mdW5jdGlvbih0LGUsaSl7dmFyIG8sbixzLHIsYT1bXSxoPVtdO2lmKHQubGVuZ3RoPjApe2ZvcihzPTA7czx0Lmxlbmd0aDtzKyspbz1lW3Rbc11dLHI9dGhpcy5ncm91cHNbdFtzXV0ub3B0aW9ucyxvLmxlbmd0aD4wJiYobj10aGlzLmdyb3Vwc1t0W3NdXSwhMD09PXIuc3RhY2smJlwiYmFyXCI9PT1yLnN0eWxlP1wibGVmdFwiPT09ci55QXhpc09yaWVudGF0aW9uP2E9YS5jb25jYXQobyk6aD1oLmNvbmNhdChvKTppW3Rbc11dPW4uZ2V0WVJhbmdlKG8sdFtzXSkpO2YuZ2V0U3RhY2tlZFlSYW5nZShhLGksdCxcIl9fYmFyU3RhY2tMZWZ0XCIsXCJsZWZ0XCIpLGYuZ2V0U3RhY2tlZFlSYW5nZShoLGksdCxcIl9fYmFyU3RhY2tSaWdodFwiLFwicmlnaHRcIil9fSxvLnByb3RvdHlwZS5fdXBkYXRlWUF4aXM9ZnVuY3Rpb24odCxlKXt2YXIgaSxvLG49ITEscz0hMSxyPSExLGE9MWU5LGg9MWU5LGQ9LTFlOSxsPS0xZTk7aWYodC5sZW5ndGg+MCl7Zm9yKHZhciB1PTA7dTx0Lmxlbmd0aDt1Kyspe3ZhciBjPXRoaXMuZ3JvdXBzW3RbdV1dO2MmJlwicmlnaHRcIiE9Yy5vcHRpb25zLnlBeGlzT3JpZW50YXRpb24/KHM9ITAsYT0xZTksZD0tMWU5KTpjJiZjLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbiYmKHI9ITAsaD0xZTksbD0tMWU5KX1mb3IodT0wO3U8dC5sZW5ndGg7dSsrKWUuaGFzT3duUHJvcGVydHkodFt1XSkmJiEwIT09ZVt0W3VdXS5pZ25vcmUmJihpPWVbdFt1XV0ubWluLG89ZVt0W3VdXS5tYXgsXCJyaWdodFwiIT1lW3RbdV1dLnlBeGlzT3JpZW50YXRpb24/KHM9ITAsYT1hPmk/aTphLGQ9ZDxvP286ZCk6KHI9ITAsaD1oPmk/aTpoLGw9bDxvP286bCkpOzE9PXMmJnRoaXMueUF4aXNMZWZ0LnNldFJhbmdlKGEsZCksMT09ciYmdGhpcy55QXhpc1JpZ2h0LnNldFJhbmdlKGgsbCl9bj10aGlzLl90b2dnbGVBeGlzVmlzaWJsaXR5KHMsdGhpcy55QXhpc0xlZnQpfHxuLG49dGhpcy5fdG9nZ2xlQXhpc1Zpc2libGl0eShyLHRoaXMueUF4aXNSaWdodCl8fG4sMT09ciYmMT09cz8odGhpcy55QXhpc0xlZnQuZHJhd0ljb25zPSEwLHRoaXMueUF4aXNSaWdodC5kcmF3SWNvbnM9ITApOih0aGlzLnlBeGlzTGVmdC5kcmF3SWNvbnM9ITEsdGhpcy55QXhpc1JpZ2h0LmRyYXdJY29ucz0hMSksdGhpcy55QXhpc1JpZ2h0Lm1hc3Rlcj0hcyx0aGlzLnlBeGlzUmlnaHQubWFzdGVyQXhpcz10aGlzLnlBeGlzTGVmdCwwPT10aGlzLnlBeGlzUmlnaHQubWFzdGVyPyh0aGlzLnlBeGlzTGVmdC5saW5lT2Zmc2V0PTE9PXI/dGhpcy55QXhpc1JpZ2h0LndpZHR
21167oOjAsbj10aGlzLnlBeGlzTGVmdC5yZWRyYXcoKXx8bixuPXRoaXMueUF4aXNSaWdodC5yZWRyYXcoKXx8bik6bj10aGlzLnlBeGlzUmlnaHQucmVkcmF3KCl8fG47dmFyIHA9W1wiX19iYXJTdGFja0xlZnRcIixcIl9fYmFyU3RhY2tSaWdodFwiLFwiX19saW5lU3RhY2tMZWZ0XCIsXCJfX2xpbmVTdGFja1JpZ2h0XCJdO2Zvcih1PTA7dTxwLmxlbmd0aDt1KyspLTEhPXQuaW5kZXhPZihwW3VdKSYmdC5zcGxpY2UodC5pbmRleE9mKHBbdV0pLDEpO3JldHVybiBufSxvLnByb3RvdHlwZS5fdG9nZ2xlQXhpc1Zpc2libGl0eT1mdW5jdGlvbih0LGUpe3ZhciBpPSExO3JldHVybiAwPT10P2UuZG9tLmZyYW1lLnBhcmVudE5vZGUmJjA9PWUuaGlkZGVuJiYoZS5oaWRlKCksaT0hMCk6ZS5kb20uZnJhbWUucGFyZW50Tm9kZXx8MSE9ZS5oaWRkZW58fChlLnNob3coKSxpPSEwKSxpfSxvLnByb3RvdHlwZS5fY29udmVydFhjb29yZGluYXRlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5ib2R5LnV0aWwudG9TY3JlZW4saT0wO2k8dC5sZW5ndGg7aSsrKXRbaV0uc2NyZWVuX3g9ZSh0W2ldLngpK3RoaXMucHJvcHMud2lkdGgsdFtpXS5zY3JlZW5feT10W2ldLnksdm9pZCAwIT10W2ldLmVuZD90W2ldLnNjcmVlbl9lbmQ9ZSh0W2ldLmVuZCkrdGhpcy5wcm9wcy53aWR0aDp0W2ldLnNjcmVlbl9lbmQ9dm9pZCAwfSxvLnByb3RvdHlwZS5fY29udmVydFljb29yZGluYXRlcz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMueUF4aXNMZWZ0LG89TnVtYmVyKHRoaXMuc3ZnLnN0eWxlLmhlaWdodC5yZXBsYWNlKFwicHhcIixcIlwiKSk7XCJyaWdodFwiPT1lLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbiYmKGk9dGhpcy55QXhpc1JpZ2h0KTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0W25dLnNjcmVlbl95PU1hdGgucm91bmQoaS5jb252ZXJ0VmFsdWUodFtuXS55KSk7ZS5zZXRaZXJvUG9zaXRpb24oTWF0aC5taW4obyxpLmNvbnZlcnRWYWx1ZSgwKSkpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGksbyl7dGhpcy5pZD1yLnJhbmRvbVVVSUQoKSx0aGlzLmJvZHk9dCx0aGlzLmRlZmF1bHRPcHRpb25zPXtvcmllbnRhdGlvbjpcImxlZnRcIixzaG93TWlub3JMYWJlbHM6ITAsc2hvd01ham9yTGFiZWxzOiEwLGljb25zOiExLG1ham9yTGluZXNPZmZzZXQ6NyxtaW5vckxpbmVzT2Zmc2V0OjQsbGFiZWxPZmZzZXRYOjEwLGxhYmVsT2Zmc2V0WToyLGljb25XaWR0aDoyMCx3aWR0aDpcIjQwcHhcIix2aXNpYmxlOiEwLGFsaWduWmVyb3M6ITAsbGVmdDp7cmFuZ2U6e21pbjp2b2lkIDAsbWF4OnZvaWQgMH0sZm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVyblwiXCIrcGFyc2VGbG9hdCh0LnRvUHJlY2lzaW9uKDMpKX0sdGl0bGU6e3RleHQ6dm9pZCAwLHN0eWxlOnZvaWQgMH19LHJpZ2h0OntyYW5nZTp7bWluOnZvaWQgMCxtYXg6dm9pZCAwfSxmb3JtYXQ6ZnVuY3Rpb24odCl7cmV0dXJuXCJcIitwYXJzZUZsb2F0KHQudG9QcmVjaXNpb24oMykpfSx0aXRsZTp7dGV4dDp2b2lkIDAsc3R5bGU6dm9pZCAwfX19LHRoaXMubGluZWdyYXBoT3B0aW9ucz1vLHRoaXMubGluZWdyYXBoU1ZHPWksdGhpcy5wcm9wcz17fSx0aGlzLkRPTWVsZW1lbnRzPXtsaW5lczp7fSxsYWJlbHM6e30sdGl0bGU6e319LHRoaXMuZG9tPXt9LHRoaXMuc2NhbGU9dm9pZCAwLHRoaXMucmFuZ2U9e3N0YXJ0OjAsZW5kOjB9LHRoaXMub3B0aW9ucz1yLmV4dGVuZCh7fSx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLmNvbnZlcnNpb25GYWN0b3I9MSx0aGlzLnNldE9wdGlvbnMoZSksdGhpcy53aWR0aD1OdW1iZXIoKFwiXCIrdGhpcy5vcHRpb25zLndpZHRoKS5yZXBsYWNlKFwicHhcIixcIlwiKSksdGhpcy5taW5XaWR0aD10aGlzLndpZHRoLHRoaXMuaGVpZ2h0PXRoaXMubGluZWdyYXBoU1ZHLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCx0aGlzLmhpZGRlbj0hMSx0aGlzLnN0ZXBQaXhlbHM9MjUsdGhpcy56ZXJvQ3Jvc3Npbmc9LTEsdGhpcy5hbW91bnRPZlN0ZXBzPS0xLHRoaXMubGluZU9mZnNldD0wLHRoaXMubWFzdGVyPSEwLHRoaXMubWFzdGVyQXhpcz1udWxsLHRoaXMuc3ZnRWxlbWVudHM9e30sdGhpcy5pY29uc1JlbW92ZWQ9ITEsdGhpcy5ncm91cHM9e30sdGhpcy5hbW91bnRPZkdyb3Vwcz0wLHRoaXMuX2NyZWF0ZSgpLHRoaXMuZnJhbWV3b3JrPXtzdmc6dGhpcy5zdmcsc3ZnRWxlbWVudHM6dGhpcy5zdmdFbGVtZW50cyxvcHRpb25zOnRoaXMub3B0aW9ucyxncm91cHM6dGhpcy5ncm91cHN9O3ZhciBuPXRoaXM7dGhpcy5ib2R5LmVtaXR0ZXIub24oXCJ2ZXJ0aWNhbERyYWdcIixmdW5jdGlvbigpe24uZG9tLmxpbmVDb250YWluZXIuc3R5bGUudG9wPW4uYm9keS5kb21Qcm9wcy5zY3JvbGxUb3ArXCJweFwifSl9dmFyIG49aSg4KSxzPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0obikscj1pKDIpLGE9aSgxNCksaD1pKDE2KSxkPWkoMTA4KTtvLnByb3RvdHlwZT1uZXcgaCxvLnByb3RvdHlwZS5hZGRHcm91cD1mdW5jdGlvbih0LGUpe3RoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KHQpfHwodGhpcy5ncm91cHNbdF09ZSksdGhpcy5hbW91bnRPZkdyb3Vwcys9MX0sby5wcm90b3R5cGUudXBkYXRlR3JvdXA9ZnVuY3Rpb24odCxlKXt0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eSh0KXx8KHRoaXMuYW1vdW50T2ZHcm91cHMrPTEpLHRoaXMuZ3JvdXBzW3RdPWV9LG8ucHJvdG90eXBlLnJlbW92ZUdyb3VwPWZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KHQpJiYoZGVsZXRlIHRoaXMuZ3JvdXBzW3RdLHRoaXMuYW1vdW50T2ZHcm91cHMtPTEpfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPSExO3RoaXMub3B0aW9ucy5vcmllbnRhdGlvbiE9dC5vcmllbnRhdGlvbiYmdm9pZCAwIT09dC5vcmllbnRhdGlvbiYmKGU9ITApO3ZhciBpPVtcIm9yaWVudGF0aW9uXCIsXCJzaG93TWlub3JMYWJlbHNcIixcInNob3dNYWpvckxhYmVsc1wiLFwiaWNvbnNcIixcIm1ham9yTGluZXNPZmZzZXRcIixcIm1pbm9yTGluZXNPZmZzZXRcIixcImxhYmVsT2Zmc2V0WFwiLFwibGFiZWxPZmZzZXRZXCIsXCJpY29uV2lkdGhcIixcIndpZHRoXCIsXCJ2aXNpYmxlXCIsXCJsZWZ0XCIsXCJyaWdodFwiLFwiYWxpZ25aZXJvc1wiXTtyLnNlbGVjdGl2ZURlZXBFeHRlbmQoaSx0aGlzLm9wdGlvbnMsdCksdGhpcy5taW5XaWR0aD1OdW1iZXIoKFwiXCIrdGhpcy5vcHRpb25zLndpZHRoKS5yZXBsYWNlKFwicHhcIixcIlwiKSksITA9PT1lJiZ0aGlzLmRvbS5mcmFtZSYmKHRoaXMuaGlkZSgpLHRoaXMuc2hvdygpKX19LG8ucHJvdG90eXBlLl9jcmVhdGU9ZnVuY3Rpb24oKXt0aGlzLmRvbS5mcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmZyYW1lLnN0eWxlLndpZHRoP
21167XRoaXMub3B0aW9ucy53aWR0aCx0aGlzLmRvbS5mcmFtZS5zdHlsZS5oZWlnaHQ9dGhpcy5oZWlnaHQsdGhpcy5kb20ubGluZUNvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmxpbmVDb250YWluZXIuc3R5bGUud2lkdGg9XCIxMDAlXCIsdGhpcy5kb20ubGluZUNvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dGhpcy5oZWlnaHQsdGhpcy5kb20ubGluZUNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj1cInJlbGF0aXZlXCIsdGhpcy5zdmc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcInN2Z1wiKSx0aGlzLnN2Zy5zdHlsZS5wb3NpdGlvbj1cImFic29sdXRlXCIsdGhpcy5zdmcuc3R5bGUudG9wPVwiMHB4XCIsdGhpcy5zdmcuc3R5bGUuaGVpZ2h0PVwiMTAwJVwiLHRoaXMuc3ZnLnN0eWxlLndpZHRoPVwiMTAwJVwiLHRoaXMuc3ZnLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiLHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuc3ZnKX0sby5wcm90b3R5cGUuX3JlZHJhd0dyb3VwSWNvbnM9ZnVuY3Rpb24oKXthLnByZXBhcmVFbGVtZW50cyh0aGlzLnN2Z0VsZW1lbnRzKTt2YXIgdCxlPXRoaXMub3B0aW9ucy5pY29uV2lkdGgsaT0xMS41O3Q9XCJsZWZ0XCI9PT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24/NDp0aGlzLndpZHRoLWUtNDt2YXIgbz0oMCxzLmRlZmF1bHQpKHRoaXMuZ3JvdXBzKTtvLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlPy0xOjF9KTtmb3IodmFyIG49MDtuPG8ubGVuZ3RoO24rKyl7dmFyIHI9b1tuXTshMCE9PXRoaXMuZ3JvdXBzW3JdLnZpc2libGV8fHZvaWQgMCE9PXRoaXMubGluZWdyYXBoT3B0aW9ucy52aXNpYmlsaXR5W3JdJiYhMCE9PXRoaXMubGluZWdyYXBoT3B0aW9ucy52aXNpYmlsaXR5W3JdfHwodGhpcy5ncm91cHNbcl0uZ2V0TGVnZW5kKGUsMTUsdGhpcy5mcmFtZXdvcmssdCxpKSxpKz0xOSl9YS5jbGVhbnVwRWxlbWVudHModGhpcy5zdmdFbGVtZW50cyksdGhpcy5pY29uc1JlbW92ZWQ9ITF9LG8ucHJvdG90eXBlLl9jbGVhbnVwSWNvbnM9ZnVuY3Rpb24oKXshMT09PXRoaXMuaWNvbnNSZW1vdmVkJiYoYS5wcmVwYXJlRWxlbWVudHModGhpcy5zdmdFbGVtZW50cyksYS5jbGVhbnVwRWxlbWVudHModGhpcy5zdmdFbGVtZW50cyksdGhpcy5pY29uc1JlbW92ZWQ9ITApfSxvLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5oaWRkZW49ITEsdGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZXx8KFwibGVmdFwiPT09dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uP3RoaXMuYm9keS5kb20ubGVmdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5mcmFtZSk6dGhpcy5ib2R5LmRvbS5yaWdodC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5mcmFtZSkpLHRoaXMuZG9tLmxpbmVDb250YWluZXIucGFyZW50Tm9kZXx8dGhpcy5ib2R5LmRvbS5iYWNrZ3JvdW5kSG9yaXpvbnRhbC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5saW5lQ29udGFpbmVyKX0sby5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuaGlkZGVuPSEwLHRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUmJnRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZnJhbWUpLHRoaXMuZG9tLmxpbmVDb250YWluZXIucGFyZW50Tm9kZSYmdGhpcy5kb20ubGluZUNvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmxpbmVDb250YWluZXIpfSxvLnByb3RvdHlwZS5zZXRSYW5nZT1mdW5jdGlvbih0LGUpe3RoaXMucmFuZ2Uuc3RhcnQ9dCx0aGlzLnJhbmdlLmVuZD1lfSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXt2YXIgdD0hMSxlPTA7dGhpcy5kb20ubGluZUNvbnRhaW5lci5zdHlsZS50b3A9dGhpcy5ib2R5LmRvbVByb3BzLnNjcm9sbFRvcCtcInB4XCI7Zm9yKHZhciBpIGluIHRoaXMuZ3JvdXBzKXRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KGkpJiYoITAhPT10aGlzLmdyb3Vwc1tpXS52aXNpYmxlfHx2b2lkIDAhPT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtpXSYmITAhPT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtpXXx8ZSsrKTtpZigwPT09dGhpcy5hbW91bnRPZkdyb3Vwc3x8MD09PWUpdGhpcy5oaWRlKCk7ZWxzZXt0aGlzLnNob3coKSx0aGlzLmhlaWdodD1OdW1iZXIodGhpcy5saW5lZ3JhcGhTVkcuc3R5bGUuaGVpZ2h0LnJlcGxhY2UoXCJweFwiLFwiXCIpKSx0aGlzLmRvbS5saW5lQ29udGFpbmVyLnN0eWxlLmhlaWdodD10aGlzLmhlaWdodCtcInB4XCIsdGhpcy53aWR0aD0hMD09PXRoaXMub3B0aW9ucy52aXNpYmxlP051bWJlcigoXCJcIit0aGlzLm9wdGlvbnMud2lkdGgpLnJlcGxhY2UoXCJweFwiLFwiXCIpKTowO3ZhciBvPXRoaXMucHJvcHMsbj10aGlzLmRvbS5mcmFtZTtuLmNsYXNzTmFtZT1cInZpcy1kYXRhLWF4aXNcIix0aGlzLl9jYWxjdWxhdGVDaGFyU2l6ZSgpO3ZhciBzPXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbixyPXRoaXMub3B0aW9ucy5zaG93TWlub3JMYWJlbHMsYT10aGlzLm9wdGlvbnMuc2hvd01ham9yTGFiZWxzO28ubWlub3JMYWJlbEhlaWdodD1yP28ubWlub3JDaGFySGVpZ2h0OjAsby5tYWpvckxhYmVsSGVpZ2h0PWE/by5tYWpvckNoYXJIZWlnaHQ6MCxvLm1pbm9yTGluZVdpZHRoPXRoaXMuYm9keS5kb20uYmFja2dyb3VuZEhvcml6b250YWwub2Zmc2V0V2lkdGgtdGhpcy5saW5lT2Zmc2V0LXRoaXMud2lkdGgrMip0aGlzLm9wdGlvbnMubWlub3JMaW5lc09mZnNldCxvLm1pbm9yTGluZUhlaWdodD0xLG8ubWFqb3JMaW5lV2lkdGg9dGhpcy5ib2R5LmRvbS5iYWNrZ3JvdW5kSG9yaXpvbnRhbC5vZmZzZXRXaWR0aC10aGlzLmxpbmVPZmZzZXQtdGhpcy53aWR0aCsyKnRoaXMub3B0aW9ucy5tYWpvckxpbmVzT2Zmc2V0LG8ubWFqb3JMaW5lSGVpZ2h0PTEsXCJsZWZ0XCI9PT1zPyhuLnN0eWxlLnRvcD1cIjBcIixuLnN0eWxlLmxlZnQ9XCIwXCIsbi5zdHlsZS5ib3R0b209XCJcIixuLnN0eWxlLndpZHRoP
21167XRoaXMud2lkdGgrXCJweFwiLG4uc3R5bGUuaGVpZ2h0PXRoaXMuaGVpZ2h0K1wicHhcIix0aGlzLnByb3BzLndpZHRoPXRoaXMuYm9keS5kb21Qcm9wcy5sZWZ0LndpZHRoLHRoaXMucHJvcHMuaGVpZ2h0PXRoaXMuYm9keS5kb21Qcm9wcy5sZWZ0LmhlaWdodCk6KG4uc3R5bGUudG9wPVwiXCIsbi5zdHlsZS5ib3R0b209XCIwXCIsbi5zdHlsZS5sZWZ0PVwiMFwiLG4uc3R5bGUud2lkdGg9dGhpcy53aWR0aCtcInB4XCIsbi5zdHlsZS5oZWlnaHQ9dGhpcy5oZWlnaHQrXCJweFwiLHRoaXMucHJvcHMud2lkdGg9dGhpcy5ib2R5LmRvbVByb3BzLnJpZ2h0LndpZHRoLHRoaXMucHJvcHMuaGVpZ2h0PXRoaXMuYm9keS5kb21Qcm9wcy5yaWdodC5oZWlnaHQpLHQ9dGhpcy5fcmVkcmF3TGFiZWxzKCksdD10aGlzLl9pc1Jlc2l6ZWQoKXx8dCwhMD09PXRoaXMub3B0aW9ucy5pY29ucz90aGlzLl9yZWRyYXdHcm91cEljb25zKCk6dGhpcy5fY2xlYW51cEljb25zKCksdGhpcy5fcmVkcmF3VGl0bGUocyl9cmV0dXJuIHR9LG8ucHJvdG90eXBlLl9yZWRyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9ITE7YS5wcmVwYXJlRWxlbWVudHModGhpcy5ET01lbGVtZW50cy5saW5lcyksYS5wcmVwYXJlRWxlbWVudHModGhpcy5ET01lbGVtZW50cy5sYWJlbHMpO3ZhciBpPXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbixvPXZvaWQgMCE9dGhpcy5vcHRpb25zW2ldLnJhbmdlP3RoaXMub3B0aW9uc1tpXS5yYW5nZTp7fSxuPSEwO3ZvaWQgMCE9by5tYXgmJih0aGlzLnJhbmdlLmVuZD1vLm1heCxuPSExKTt2YXIgcz0hMDt2b2lkIDAhPW8ubWluJiYodGhpcy5yYW5nZS5zdGFydD1vLm1pbixzPSExKSx0aGlzLnNjYWxlPW5ldyBkKHRoaXMucmFuZ2Uuc3RhcnQsdGhpcy5yYW5nZS5lbmQscyxuLHRoaXMuZG9tLmZyYW1lLm9mZnNldEhlaWdodCx0aGlzLnByb3BzLm1ham9yQ2hhckhlaWdodCx0aGlzLm9wdGlvbnMuYWxpZ25aZXJvcyx0aGlzLm9wdGlvbnNbaV0uZm9ybWF0KSwhMT09PXRoaXMubWFzdGVyJiZ2b2lkIDAhPXRoaXMubWFzdGVyQXhpcyYmdGhpcy5zY2FsZS5mb2xsb3dTY2FsZSh0aGlzLm1hc3RlckF4aXMuc2NhbGUpLHRoaXMubWF4TGFiZWxTaXplPTAsdGhpcy5zY2FsZS5nZXRMaW5lcygpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIG89ZS55LG49ZS5tYWpvcjt0Lm9wdGlvbnMuc2hvd01pbm9yTGFiZWxzJiYhMT09PW4mJnQuX3JlZHJhd0xhYmVsKG8tMixlLnZhbCxpLFwidmlzLXktYXhpcyB2aXMtbWlub3JcIix0LnByb3BzLm1pbm9yQ2hhckhlaWdodCksbiYmbz49MCYmdC5fcmVkcmF3TGFiZWwoby0yLGUudmFsLGksXCJ2aXMteS1heGlzIHZpcy1tYWpvclwiLHQucHJvcHMubWFqb3JDaGFySGVpZ2h0KSwhMD09PXQubWFzdGVyJiYobj90Ll9yZWRyYXdMaW5lKG8saSxcInZpcy1ncmlkIHZpcy1ob3Jpem9udGFsIHZpcy1tYWpvclwiLHQub3B0aW9ucy5tYWpvckxpbmVzT2Zmc2V0LHQucHJvcHMubWFqb3JMaW5lV2lkdGgpOnQuX3JlZHJhd0xpbmUobyxpLFwidmlzLWdyaWQgdmlzLWhvcml6b250YWwgdmlzLW1pbm9yXCIsdC5vcHRpb25zLm1pbm9yTGluZXNPZmZzZXQsdC5wcm9wcy5taW5vckxpbmVXaWR0aCkpfSk7dmFyIHI9MDt2b2lkIDAhPT10aGlzLm9wdGlvbnNbaV0udGl0bGUmJnZvaWQgMCE9PXRoaXMub3B0aW9uc1tpXS50aXRsZS50ZXh0JiYocj10aGlzLnByb3BzLnRpdGxlQ2hhckhlaWdodCk7dmFyIGg9ITA9PT10aGlzLm9wdGlvbnMuaWNvbnM/TWF0aC5tYXgodGhpcy5vcHRpb25zLmljb25XaWR0aCxyKSt0aGlzLm9wdGlvbnMubGFiZWxPZmZzZXRYKzE1OnIrdGhpcy5vcHRpb25zLmxhYmVsT2Zmc2V0WCsxNTtyZXR1cm4gdGhpcy5tYXhMYWJlbFNpemU+dGhpcy53aWR0aC1oJiYhMD09PXRoaXMub3B0aW9ucy52aXNpYmxlPyh0aGlzLndpZHRoPXRoaXMubWF4TGFiZWxTaXplK2gsdGhpcy5vcHRpb25zLndpZHRoPXRoaXMud2lkdGgrXCJweFwiLGEuY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMubGluZXMpLGEuY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMubGFiZWxzKSx0aGlzLnJlZHJhdygpLGU9ITApOnRoaXMubWF4TGFiZWxTaXplPHRoaXMud2lkdGgtaCYmITA9PT10aGlzLm9wdGlvbnMudmlzaWJsZSYmdGhpcy53aWR0aD50aGlzLm1pbldpZHRoPyh0aGlzLndpZHRoPU1hdGgubWF4KHRoaXMubWluV2lkdGgsdGhpcy5tYXhMYWJlbFNpemUraCksdGhpcy5vcHRpb25zLndpZHRoPXRoaXMud2lkdGgrXCJweFwiLGEuY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMubGluZXMpLGEuY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMubGFiZWxzKSx0aGlzLnJlZHJhdygpLGU9ITApOihhLmNsZWFudXBFbGVtZW50cyh0aGlzLkRPTWVsZW1lbnRzLmxpbmVzKSxhLmNsZWFudXBFbGVtZW50cyh0aGlzLkRPTWVsZW1lbnRzLmxhYmVscyksZT0hMSksZX0sby5wcm90b3R5cGUuY29udmVydFZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNjYWxlLmNvbnZlcnRWYWx1ZSh0KX0sby5wcm90b3R5cGUuc2NyZWVuVG9WYWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zY2FsZS5zY3JlZW5Ub1ZhbHVlKHQpfSxvLnByb3RvdHlwZS5fcmVkcmF3TGFiZWw9ZnVuY3Rpb24odCxlLGksbyxuKXt2YXIgcz1hLmdldERPTUVsZW1lbnQoXCJkaXZcIix0aGlzLkRPTWVsZW1lbnRzLmxhYmVscyx0aGlzLmRvbS5mcmFtZSk7cy5jbGFzc05hbWU9byxzLmlubmVySFRNTD1lLFwibGVmdFwiPT09aT8ocy5zdHlsZS5sZWZ0PVwiLVwiK3RoaXMub3B0aW9ucy5sYWJlbE9mZnNldFgrXCJweFwiLHMuc3R5bGUudGV4dEFsaWduPVwicmlnaHRcIik6KHMuc3R5bGUucmlnaHQ9XCItXCIrdGhpcy5vcHRpb25zLmxhYmVsT2Zmc2V0WCtcInB4XCIscy5zdHlsZS50ZXh0QWxpZ249XCJsZWZ0XCIpLHMuc3R5bGUudG9wPXQtLjUqbit0aGlzLm9wdGlvbnMubGFiZWxPZmZzZXRZK1wicHhcIixlKz1cIlwiO3ZhciByPU1hdGgubWF4KHRoaXMucHJvcHMubWFqb3JDaGFyV2lkdGgsdGhpcy5wcm9wcy5taW5vckNoYXJXaWR0aCk7dGhpcy5tYXhMYWJlbFNpemU8ZS5sZW5ndGgqciYmKHR
21167oaXMubWF4TGFiZWxTaXplPWUubGVuZ3RoKnIpfSxvLnByb3RvdHlwZS5fcmVkcmF3TGluZT1mdW5jdGlvbih0LGUsaSxvLG4pe2lmKCEwPT09dGhpcy5tYXN0ZXIpe3ZhciBzPWEuZ2V0RE9NRWxlbWVudChcImRpdlwiLHRoaXMuRE9NZWxlbWVudHMubGluZXMsdGhpcy5kb20ubGluZUNvbnRhaW5lcik7cy5jbGFzc05hbWU9aSxzLmlubmVySFRNTD1cIlwiLFwibGVmdFwiPT09ZT9zLnN0eWxlLmxlZnQ9dGhpcy53aWR0aC1vK1wicHhcIjpzLnN0eWxlLnJpZ2h0PXRoaXMud2lkdGgtbytcInB4XCIscy5zdHlsZS53aWR0aD1uK1wicHhcIixzLnN0eWxlLnRvcD10K1wicHhcIn19LG8ucHJvdG90eXBlLl9yZWRyYXdUaXRsZT1mdW5jdGlvbih0KXtpZihhLnByZXBhcmVFbGVtZW50cyh0aGlzLkRPTWVsZW1lbnRzLnRpdGxlKSx2b2lkIDAhPT10aGlzLm9wdGlvbnNbdF0udGl0bGUmJnZvaWQgMCE9PXRoaXMub3B0aW9uc1t0XS50aXRsZS50ZXh0KXt2YXIgZT1hLmdldERPTUVsZW1lbnQoXCJkaXZcIix0aGlzLkRPTWVsZW1lbnRzLnRpdGxlLHRoaXMuZG9tLmZyYW1lKTtlLmNsYXNzTmFtZT1cInZpcy15LWF4aXMgdmlzLXRpdGxlIHZpcy1cIit0LGUuaW5uZXJIVE1MPXRoaXMub3B0aW9uc1t0XS50aXRsZS50ZXh0LHZvaWQgMCE9PXRoaXMub3B0aW9uc1t0XS50aXRsZS5zdHlsZSYmci5hZGRDc3NUZXh0KGUsdGhpcy5vcHRpb25zW3RdLnRpdGxlLnN0eWxlKSxcImxlZnRcIj09PXQ/ZS5zdHlsZS5sZWZ0PXRoaXMucHJvcHMudGl0bGVDaGFySGVpZ2h0K1wicHhcIjplLnN0eWxlLnJpZ2h0PXRoaXMucHJvcHMudGl0bGVDaGFySGVpZ2h0K1wicHhcIixlLnN0eWxlLndpZHRoP
21167XRoaXMuaGVpZ2h0K1wicHhcIn1hLmNsZWFudXBFbGVtZW50cyh0aGlzLkRPTWVsZW1lbnRzLnRpdGxlKX0sby5wcm90b3R5cGUuX2NhbGN1bGF0ZUNoYXJTaXplPWZ1bmN0aW9uKCl7aWYoIShcIm1pbm9yQ2hhckhlaWdodFwiaW4gdGhpcy5wcm9wcykpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiMFwiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7ZS5jbGFzc05hbWU9XCJ2aXMteS1heGlzIHZpcy1taW5vciB2aXMtbWVhc3VyZVwiLGUuYXBwZW5kQ2hpbGQodCksdGhpcy5kb20uZnJhbWUuYXBwZW5kQ2hpbGQoZSksdGhpcy5wcm9wcy5taW5vckNoYXJIZWlnaHQ9ZS5jbGllbnRIZWlnaHQsdGhpcy5wcm9wcy5taW5vckNoYXJXaWR0aD1lLmNsaWVudFdpZHRoLHRoaXMuZG9tLmZyYW1lLnJlbW92ZUNoaWxkKGUpfWlmKCEoXCJtYWpvckNoYXJIZWlnaHRcImluIHRoaXMucHJvcHMpKXt2YXIgaT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIjBcIiksbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO28uY2xhc3NOYW1lPVwidmlzLXktYXhpcyB2aXMtbWFqb3IgdmlzLW1lYXN1cmVcIixvLmFwcGVuZENoaWxkKGkpLHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKG8pLHRoaXMucHJvcHMubWFqb3JDaGFySGVpZ2h0PW8uY2xpZW50SGVpZ2h0LHRoaXMucHJvcHMubWFqb3JDaGFyV2lkdGg9by5jbGllbnRXaWR0aCx0aGlzLmRvbS5mcmFtZS5yZW1vdmVDaGlsZChvKX1pZighKFwidGl0bGVDaGFySGVpZ2h0XCJpbiB0aGlzLnByb3BzKSl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCIwXCIpLHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtzLmNsYXNzTmFtZT1cInZpcy15LWF4aXMgdmlzLXRpdGxlIHZpcy1tZWFzdXJlXCIscy5hcHBlbmRDaGlsZChuKSx0aGlzLmRvbS5mcmFtZS5hcHBlbmRDaGlsZChzKSx0aGlzLnByb3BzLnRpdGxlQ2hhckhlaWdodD1zLmNsaWVudEhlaWdodCx0aGlzLnByb3BzLnRpdGxlQ2hhcldpZHRoPXMuY2xpZW50V2lkdGgsdGhpcy5kb20uZnJhbWUucmVtb3ZlQ2hpbGQocyl9fSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGksbyxuLHMpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+NiYmdm9pZCAwIT09YXJndW1lbnRzWzZdJiZhcmd1bWVudHNbNl0sYT1hcmd1bWVudHMubGVuZ3RoPjcmJnZvaWQgMCE9PWFyZ3VtZW50c1s3XSYmYXJndW1lbnRzWzddO2lmKHRoaXMubWFqb3JTdGVwcz1bMSwyLDUsMTBdLHRoaXMubWlub3JTdGVwcz1bLjI1LC41LDEsMl0sdGhpcy5jdXN0b21MaW5lcz1udWxsLHRoaXMuY29udGFpbmVySGVpZ2h0PW4sdGhpcy5tYWpvckNoYXJIZWlnaHQ9cyx0aGlzLl9zdGFydD10LHRoaXMuX2VuZD1lLHRoaXMuc2NhbGU9MSx0aGlzLm1pbm9yU3RlcElkeD0tMSx0aGlzLm1hZ25pdHVkZWZhY3Rvcj0xLHRoaXMuZGV0ZXJtaW5lU2NhbGUoKSx0aGlzLnplcm9BbGlnbj1yLHRoaXMuYXV0b1NjYWxlU3RhcnQ9aSx0aGlzLmF1dG9TY2FsZUVuZD1vLHRoaXMuZm9ybWF0dGluZ0Z1bmN0aW9uPWEsaXx8byl7dmFyIGg9dGhpcyxkPWZ1bmN0aW9uKHQpe3ZhciBlPXQtdCUoaC5tYWduaXR1ZGVmYWN0b3IqaC5taW5vclN0ZXBzW2gubWlub3JTdGVwSWR4XSk7cmV0dXJuIHQlKGgubWFnbml0dWRlZmFjdG9yKmgubWlub3JTdGVwc1toLm1pbm9yU3RlcElkeF0pPmgubWFnbml0dWRlZmFjdG9yKmgubWlub3JTdGVwc1toLm1pbm9yU3RlcElkeF0qLjU/ZStoLm1hZ25pdHVkZWZhY3RvcipoLm1pbm9yU3RlcHNbaC5taW5vclN0ZXBJZHhdOmV9O2kmJih0aGlzLl9zdGFydC09Mip0aGlzLm1hZ25pdHVkZWZhY3Rvcip0aGlzLm1pbm9yU3RlcHNbdGhpcy5taW5vclN0ZXBJZHhdLHRoaXMuX3N0YXJ0PWQodGhpcy5fc3RhcnQpKSxvJiYodGhpcy5fZW5kKz10aGlzLm1hZ25pdHVkZWZhY3Rvcip0aGlzLm1pbm9yU3RlcHNbdGhpcy5taW5vclN0ZXBJZHhdLHRoaXMuX2VuZD1kKHRoaXMuX2VuZCkpLHRoaXMuZGV0ZXJtaW5lU2NhbGUoKX19by5wcm90b3R5cGUuc2V0Q2hhckhlaWdodD1mdW5jdGlvbih0KXt0aGlzLm1ham9yQ2hhckhlaWdodD10fSxvLnByb3RvdHlwZS5zZXRIZWlnaHQ9ZnVuY3Rpb24odCl7dGhpcy5jb250YWluZXJIZWlnaHQ9dH0sby5wcm90b3R5cGUuZGV0ZXJtaW5lU2NhbGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9lbmQtdGhpcy5fc3RhcnQ7dGhpcy5zY2FsZT10aGlzLmNvbnRhaW5lckhlaWdodC90O3ZhciBlPXRoaXMubWFqb3JDaGFySGVpZ2h0L3RoaXMuc2NhbGUsaT10PjA/TWF0aC5yb3VuZChNYXRoLmxvZyh0KS9NYXRoLkxOMTApOjA7dGhpcy5taW5vclN0ZXBJZHg9LTEsdGhpcy5tYWduaXR1ZGVmYWN0b3I9TWF0aC5wb3coMTAsaSk7dmFyIG89MDtpPDAmJihvPWkpO2Zvcih2YXIgbj0hMSxzPW87TWF0aC5hYnMocyk8PU1hdGguYWJzKGkpO3MrKyl7dGhpcy5tYWduaXR1ZGVmYWN0b3I9TWF0aC5wb3coMTAscyk7Zm9yKHZhciByPTA7cjx0aGlzLm1pbm9yU3RlcHMubGVuZ3RoO3IrKyl7aWYodGhpcy5tYWduaXR1ZGVmYWN0b3IqdGhpcy5taW5vclN0ZXBzW3JdPj1lKXtuPSEwLH
21167RoaXMubWlub3JTdGVwSWR4PXI7YnJlYWt9fWlmKCEwPT09bilicmVha319LG8ucHJvdG90eXBlLmlzX21ham9yPWZ1bmN0aW9uKHQpe3JldHVybiB0JSh0aGlzLm1hZ25pdHVkZWZhY3Rvcip0aGlzLm1ham9yU3RlcHNbdGhpcy5taW5vclN0ZXBJZHhdKT09MH0sby5wcm90b3R5cGUuZ2V0U3RlcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hZ25pdHVkZWZhY3Rvcip0aGlzLm1pbm9yU3RlcHNbdGhpcy5taW5vclN0ZXBJZHhdfSxvLnByb3RvdHlwZS5nZXRGaXJzdE1ham9yPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tYWduaXR1ZGVmYWN0b3IqdGhpcy5tYWpvclN0ZXBzW3RoaXMubWlub3JTdGVwSWR4XTtyZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWUodGhpcy5fc3RhcnQrKHQtdGhpcy5fc3RhcnQldCkldCl9LG8ucHJvdG90eXBlLmZvcm1hdFZhbHVlPWZ1bmN0aW9uKHQpe3ZhciBlPXQudG9QcmVjaXNpb24oNSk7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5mb3JtYXR0aW5nRnVuY3Rpb24mJihlPXRoaXMuZm9ybWF0dGluZ0Z1bmN0aW9uKHQpKSxcIm51bWJlclwiPT10eXBlb2YgZT9cIlwiK2U6XCJzdHJpbmdcIj09dHlwZW9mIGU/ZTp0LnRvUHJlY2lzaW9uKDUpfSxvLnByb3RvdHlwZS5nZXRMaW5lcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPXRoaXMuZ2V0U3RlcCgpLGk9KGUtdGhpcy5fc3RhcnQlZSklZSxvPXRoaXMuX3N0YXJ0K2k7dGhpcy5fZW5kLW8+MWUtNTtvKz1lKW8hPXRoaXMuX3N0YXJ0JiZ0LnB1c2goe21ham9yOnRoaXMuaXNfbWFqb3IobykseTp0aGlzLmNvbnZlcnRWYWx1ZShvKSx2YWw6dGhpcy5mb3JtYXRWYWx1ZShvKX0pO3JldHVybiB0fSxvLnByb3RvdHlwZS5mb2xsb3dTY2FsZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm1pbm9yU3RlcElkeCxpPXRoaXMuX3N0YXJ0LG89dGhpcy5fZW5kLG49dGhpcyxzPWZ1bmN0aW9uKCl7bi5tYWduaXR1ZGVmYWN0b3IqPTJ9LHI9ZnVuY3Rpb24oKXtuLm1hZ25pdHVkZWZhY3Rvci89Mn07dC5taW5vclN0ZXBJZHg8PTEmJnRoaXMubWlub3JTdGVwSWR4PD0xfHx0Lm1pbm9yU3RlcElkeD4xJiZ0aGlzLm1pbm9yU3RlcElkeD4xfHwodC5taW5vclN0ZXBJZHg8dGhpcy5taW5vclN0ZXBJZHg/KHRoaXMubWlub3JTdGVwSWR4PTEsMj09ZT9zKCk6KHMoKSxzKCkpKToodGhpcy5taW5vclN0ZXBJZHg9MiwxPT1lP3IoKToocigpLHIoKSkpKTtmb3IodmFyIGE9dC5jb252ZXJ0VmFsdWUoMCksaD10LmdldFN0ZXAoKSp0LnNjYWxlLGQ9ITEsbD0wOyFkJiZsKys8NTspe3RoaXMuc2NhbGU9aC8odGhpcy5taW5vclN0ZXBzW3RoaXMubWlub3JTdGVwSWR4XSp0aGlzLm1hZ25pdHVkZWZhY3Rvcik7dmFyIHU9dGhpcy5jb250YWluZXJIZWlnaHQvdGhpcy5zY2FsZTt0aGlzLl9zdGFydD1pLHRoaXMuX2VuZD10aGlzLl9zdGFydCt1O3ZhciBjPXRoaXMuX2VuZCp0aGlzLnNjYWxlLHA9dGhpcy5tYWduaXR1ZGVmYWN0b3IqdGhpcy5tYWpvclN0ZXBzW3RoaXMubWlub3JTdGVwSWR4XSxmPXRoaXMuZ2V0Rmlyc3RNYWpvcigpLXQuZ2V0Rmlyc3RNYWpvcigpO2lmKHRoaXMuemVyb0FsaWduKXt2YXIgbT1hLWM7dGhpcy5fZW5kKz1tL3RoaXMuc2NhbGUsdGhpcy5fc3RhcnQ9dGhpcy5fZW5kLXV9ZWxzZSB0aGlzLmF1dG9TY2FsZVN0YXJ0Pyh0aGlzLl9zdGFydC09Zi90aGlzLnNjYWxlLHRoaXMuX2VuZD10aGlzLl9zdGFydCt1KToodGhpcy5fc3RhcnQrPXAtZi90aGlzLnNjYWxlLHRoaXMuX2VuZD10aGlzLl9zdGFydCt1KTtpZighdGhpcy5hdXRvU2NhbGVFbmQmJnRoaXMuX2VuZD5vKzFlLTUpcigpLGQ9ITE7ZWxzZXtpZighdGhpcy5hdXRvU2NhbGVTdGFydCYmdGhpcy5fc3RhcnQ8aS0xZS01KXtpZighKHRoaXMuemVyb0FsaWduJiZpPj0wKSl7cigpLGQ9ITE7Y29udGludWV9Y29uc29sZS53YXJuKFwiQ2FuJ3QgYWRoZXJlIHRvIGdpdmVuICdtaW4nIHJhbmdlLCBkdWUgdG8gemVyb2FsaWduXCIpfXRoaXMuYXV0b1NjYWxlU3RhcnQmJnRoaXMuYXV0b1NjYWxlRW5kJiZ1PG8taT8ocygpLGQ9ITEpOmQ9ITB9fX0sby5wcm90b3R5cGUuY29udmVydFZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbnRhaW5lckhlaWdodC0odC10aGlzLl9zdGFydCkqdGhpcy5zY2FsZX0sby5wcm90b3R5cGUuc2NyZWVuVG9WYWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5jb250YWluZXJIZWlnaHQtdCkvdGhpcy5zY2FsZSt0aGlzLl9zdGFydH0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpLG8pe3RoaXMuaWQ9ZTt2YXIgbj1bXCJzYW1wbGluZ1wiLFwic3R5bGVcIixcInNvcnRcIixcInlBeGlzT3JpZW50YXRpb25cIixcImJhckNoYXJ0XCIsXCJkcmF3UG9pbnRzXCIsXCJzaGFkZWRcIixcImludGVycG9sYXRpb25cIixcInpJbmRleFwiLFwiZXhjbHVkZUZyb21TdGFja2luZ1wiLFwiZXhjbHVkZUZyb21MZWdlbmRcIl07dGhpcy5vcHRpb25zPXIuc2VsZWN0aXZlQnJpZGdlT2JqZWN0KG4saSksdGhpcy51c2luZ0RlZmF1bHRTdHlsZT12b2lkIDA9PT10LmNsYXNzTmFtZSx0aGlzLmdyb3Vwc1VzaW5nRGVmYXVsdFN0eWxlcz1vLHRoaXMuemVyb1Bvc2l0aW9uPTAsdGhpcy51cGRhdGUodCksMT09dGhpcy51c2luZ0RlZmF1bHRTdHlsZSYmKHRoaXMuZ3JvdXBzVXNpbmdEZWZhdWx0U3R5bGVzWzBdKz0xKSx0aGlzLml0ZW1zRGF0YT1bXSx0aGlzLnZpc2libGU9dm9pZCAwPT09dC52aXNpYmxlfHx0LnZpc2libGV9dmFyIG49aSg2KSxzPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0obikscj1pKDIpLGE9aSgxMTApLGg9aSgxMTEpLGQ9aSg3Mik7by5wcm90b3R5cGUuc2V0SXRlbXM9ZnVuY3Rpb24odCl7bnVsbCE9dD8odGhpcy5pdGVtc0RhdGE9dCwxPT10aGlzLm9wdGlvbnMuc29ydCYmci5pbnNlcnRTb3J0KHRoaXMuaXRlbXNEYXRhLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQueD5lLng/MTotMX0pKTp0aGlzLml0ZW1zRGF0YT1bXX0sby5wcm90b3R5cGUuZ2V0SXRlbXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVtc0RhdGF9LG8ucHJvdG90eXBlLnNldFplcm9Qb3NpdGlvbj1mdW5jdGlvbih0KXt0aGlzLnplcm9Qb3NpdGlvbj10fSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpe3ZhciBlPVtcInNhbXBsaW5nXCIsXCJzdHlsZVwiLFwic29ydFwiLFwieUF4aXNPcmllbnRhdGlvblwiLFwiYmFyQ2hhcnRcIixcInpJbmRleFwiLFwiZXhjbHVkZUZyb21TdGFja2luZ1wiLFwiZXhjbHVkZUZyb21MZWdlbmRcIl07ci5zZWxlY3RpdmVEZWVwRXh0ZW5kKGUsdGhpcy5vcHRpb25zLHQpLFwiZnVuY3Rpb25cIj09dHlwZW9mIHQuZHJhd1BvaW50cyYmKHQuZHJhd1BvaW50cz17b25SZW5kZXI6dC5kcmF3UG9pbnRzfSksci5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsXCJpbnRlcnBvbGF0aW9uXCIpLHIubWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucyx0LFwiZHJhd1BvaW50c1wiKSxyLm1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsdCxcInNoYWRlZFwiKSx0LmludGVycG9sYXRpb24mJlwib2JqZWN0XCI9PSgwLHMuZGVmYXVsdCkodC5pbnRlcnBvbGF0aW9uKSYmdC5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbiYmKFwidW5pZm9ybVwiPT10LmludGVycG9sYXRpb24ucGFyYW1ldHJpemF0aW9uP3RoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmFscGhhPTA6XCJjaG9yZGFsXCI9PXQuaW50ZXJwb2xhdGlvbi5wYXJhbWV0cml6YXRpb24/dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uYWxwaGE9MToodGhpcy5vcHRpb25zLmludGVycG9sYXRpb24ucGFyYW1ldHJpemF0aW9uPVwiY2VudHJpcGV0YWxcIix0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5hbHBoYT0uNSkpfX0sby5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXA9dCx0aGlzLmNvbnRlbnQ9dC5jb250ZW50fHxcImdyYXBoXCIsdGhpcy5jbGFzc05hbWU9dC5jbGFzc05hbWV8fHRoaXMuY2xhc3NOYW1lfHxcInZpcy1ncmFwaC1ncm91cFwiK3RoaXMuZ3JvdXBzVXNpbmdEZWZhdWx0U3R5bGVzWzBdJTEwLHRoaXMudmlzaWJsZT12b2lkIDA9PT10LnZpc2libGV8fHQudmlzaWJsZSx0aGlzLnN0eWxlPXQuc3R5bGUsdGhpcy5zZXRPcHRpb25zKHQub3B0aW9ucyl9LG8ucHJvdG90eXBlLmdldExlZ2VuZD1mdW5jdGlvbih0LGUsaSxvLG4pe2lmKHZvaWQgMD09aXx8bnVsbD09aSl7aT17c3ZnOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXCJzdmdcIiksc3ZnRWxlbWVudHM6e30sb3B0aW9uczp0aGlzLm9wdGlvbnMsZ3JvdXBzOlt0aGlzXX19c3dpdGNoKHZvaWQgMCE9byYmbnVsbCE9b3x8KG89MCksdm9pZCAwIT1uJiZudWxsIT1ufHwobj0uNSplKSx0aGlzLm9wdGlvbnMuc3R5bGUpe2Nhc2VcImxpbmVcIjpoLmRyYXdJY29uKHRoaXMsbyxuLHQsZSxpKTticmVhaztjYXNlXCJwb2ludHNcIjpjYXNlXCJwb2ludFwiOmQuZHJhd0ljb24odGhpcyxvLG4sdCxlLGkpO2JyZWFrO2Nhc2VcImJhclwiOmEuZHJhd0ljb24odGhpcyxvLG4sdCxlLGkpfXJldHVybntpY29uOmkuc3ZnLGxhYmVsOnRoaXMuY29udGVudCxvcmllbnRhdGlvbjp0aGlzLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbn19LG8ucHJvdG90eXBlLmdldFlSYW5nZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dFswXS55LGk9dFswXS55LG89MDtvPHQubGVuZ3RoO28rKyllPWU+dFtvXS
2116755P3Rbb10ueTplLGk9aTx0W29dLnk/dFtvXS55Omk7cmV0dXJue21pbjplLG1heDppLHlBeGlzT3JpZW50YXRpb246dGhpcy5vcHRpb25zLnlBeGlzT3JpZW50YXRpb259fSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt9dmFyIG49aSgxNCkscz1pKDcyKTtvLmRyYXdJY29uPWZ1bmN0aW9uKHQsZSxpLG8scyxyKXt2YXIgYT0uNSpzLGg9bi5nZXRTVkdFbGVtZW50KFwicmVjdFwiLHIuc3ZnRWxlbWVudHMsci5zdmcpO2guc2V0QXR0cmlidXRlTlMobnVsbCxcInhcIixlKSxoLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ5XCIsaS1hKSxoLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ3aWR0aFwiLG8pLGguc2V0QXR0cmlidXRlTlMobnVsbCxcImhlaWdodFwiLDIqYSksaC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwiY2xhc3NcIixcInZpcy1vdXRsaW5lXCIpO3ZhciBkPU1hdGgucm91bmQoLjMqbyksbD10Lm9wdGlvbnMuYmFyQ2hhcnQud2lkdGgsdT1sL2QsYz1NYXRoLnJvdW5kKC40KnMpLHA9TWF0aC5yb3VuZCguNzUqcyksZj1NYXRoLnJvdW5kKChvLTIqZCkvMyk7aWYobi5kcmF3QmFyKGUrLjUqZCtmLGkrYS1jLTEsZCxjLHQuY2xhc3NOYW1lK1wiIHZpcy1iYXJcIixyLnN2Z0VsZW1lbnRzLHIuc3ZnLHQuc3R5bGUpLG4uZHJhd0JhcihlKzEuNSpkK2YrMixpK2EtcC0xLGQscCx0LmNsYXNzTmFtZStcIiB2aXMtYmFyXCIsci5zdmdFbGVtZW50cyxyLnN2Zyx0LnN0eWxlKSwxPT10Lm9wdGlvbnMuZHJhd1BvaW50cy5lbmFibGVkKXt2YXIgbT17c3R5bGU6dC5vcHRpb25zLmRyYXdQb2ludHMuc3R5bGUsc3R5bGVzOnQub3B0aW9ucy5kcmF3UG9pbnRzLnN0eWxlcyxzaXplOnQub3B0aW9ucy5kcmF3UG9pbnRzLnNpemUvdSxjbGFzc05hbWU6dC5jbGFzc05hbWV9O24uZHJhd1BvaW50KGUrLjUqZCtmLGkrYS1jLTEsbSxyLnN2Z0VsZW1lbnRzLHIuc3ZnKSxuLmRyYXdQb2ludChlKzEuNSpkK2YrMixpK2EtcC0xLG0sci5zdmdFbGVtZW50cyxyLnN2Zyl9fSxvLmRyYXc9ZnVuY3Rpb24odCxlLGkpe3ZhciByLGEsaCxkLGwsdSxjPVtdLHA9e30sZj0wO2ZvcihsPTA7bDx0Lmxlbmd0aDtsKyspaWYoZD1pLmdyb3Vwc1t0W2xdXSxcImJhclwiPT09ZC5vcHRpb25zLnN0eWxlJiYhMD09PWQudmlzaWJsZSYmKHZvaWQgMD09PWkub3B0aW9ucy5ncm91cHMudmlzaWJpbGl0eVt0W2xdXXx8ITA9PT1pLm9wdGlvbnMuZ3JvdXBzLnZpc2liaWxpdHlbdFtsXV0pKWZvcih1PTA7dTxlW3RbbF1dLmxlbmd0aDt1KyspYy5wdXNoKHtzY3JlZW5feDplW3RbbF1dW3VdLnNjcmVlbl94LHNjcmVlbl9lbmQ6ZVt0W2xdXVt1XS5zY3JlZW5fZW5kLHNjcmVlbl95OmVbdFtsXV1bdV0uc2NyZWVuX3kseDplW3RbbF1dW3VdLngsZW5kOmVbdFtsXV1bdV0uZW5kLHk6ZVt0W2xdXVt1XS55LGdyb3VwSWQ6dFtsXSxsYWJlbDplW3RbbF1dW3VdLmxhYmVsfSksZis9MTtpZigwIT09Zilmb3IoYy5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc2NyZWVuX3g9PT1lLnNjcmVlbl94P3QuZ3JvdXBJZDxlLmdyb3VwSWQ/LTE6MTp0LnNjcmVlbl94LWUuc2NyZWVuX3h9KSxvLl9nZXREYXRhSW50ZXJzZWN0aW9ucyhwLGMpLGw9MDtsPGMubGVuZ3RoO2wrKyl7ZD1pLmdyb3Vwc1tjW2xdLmdyb3VwSWRdO3ZhciBtPXZvaWQgMCE9ZC5vcHRpb25zLmJhckNoYXJ0Lm1pbldpZHRoP2Qub3B0aW9ucy5iYXJDaGFydC5taW5XaWR0aDouMSpkLm9wdGlvbnMuYmFyQ2hhcnQud2lkdGg7YT1jW2xdLnNjcmVlbl94O3ZhciB2PTA7aWYodm9pZCAwPT09cFthXSlsKzE8Yy5sZW5ndGgmJihyPU1hdGguYWJzKGNbbCsxXS5zY3JlZW5feC1hKSksaD1vLl9nZXRTYWZlRHJhd0RhdGEocixkLG0pO2Vsc2V7dmFyIGc9bCsocFthXS5hbW91bnQtcFthXS5yZXNvbHZlZCk7ZzxjLmxlbmd0aCYmKHI9TWF0aC5hYnMoY1tnXS5zY3JlZW5feC1hKSksaD1vLl9nZXRTYWZlRHJhd0RhdGEocixkLG0pLHBbYV0ucmVzb2x2ZWQrPTEsITA9PT1kLm9wdGlvbnMuc3RhY2smJiEwIT09ZC5vcHRpb25zLmV4Y2x1ZGVGcm9tU3RhY2tpbmc/Y1tsXS5zY3JlZW5feTxkLnplcm9Qb3NpdGlvbj8odj1wW2FdLmFjY3VtdWxhdGVkTmVnYXRpdmUscFthXS5hY2N1bXVsYXRlZE5lZ2F0aXZlKz1kLnplcm9Qb3NpdGlvbi1jW2xdLnNjcmVlbl95KToodj1wW2FdLmFjY3VtdWxhdGVkUG9zaXRpdmUscFthXS5hY2N1bXVsYXRlZFBvc2l0aXZlKz1kLnplcm9Qb3NpdGlvbi1jW2xdLnNjcmVlbl95KTohMD09PWQub3B0aW9ucy5iYXJDaGFydC5zaWRlQnlTaWRlJiYoaC53aWR0aD1oLndpZHRoL3BbYV0uYW1vdW50LGgub2Zmc2V0Kz1wW2FdLnJlc29sdmVkKmgud2lkdGgtLjUqaC53aWR0aCoocFthXS5hbW91bnQrMSkpfXZhciB5PWgud2lkdGgsYj1jW2xdLnNjcmVlbl94O2lmKHZvaWQgMCE9Y1tsXS5zY3JlZW5fZW5kPyh5PWNbbF0uc2NyZWVuX2VuZC1jW2xdLnNjcmVlbl94LGIrPS41KnkpOmIrPWgub2Zmc2V0LG4uZHJhd0JhcihiLGNbbF0uc2NyZWVuX3ktdix5LGQuemVyb1Bvc2l0aW9uLWNbbF0uc2NyZWVuX3ksZC5jbGFzc05hbWUrXCIgdmlzLWJhclwiLGkuc3ZnRWxlbWVudHMsaS5zdmcsZC5zdHlsZSksITA9PT1kLm9wdGlvbnMuZHJhd1BvaW50cy5lbmFibGVkKXt2YXIgXz17c2NyZWVuX3g6Y1tsXS5zY3JlZW5feCxzY3JlZW5feTpjW2xdLnNjcmVlbl95LXYseDpjW2xdLngseTpjW2xdLnksZ3JvdXBJZDpjW2xdLmdyb3VwSWQsbGFiZWw6Y1tsXS5sYWJlbH07cy5kcmF3KFtfXSxkLGksaC5vZmZzZXQpfX19LG8uX2dldERhdGFJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpLG89MDtvPGUubGVuZ3RoO28rKylvKzE8ZS5sZW5ndGgmJihpPU1hdGguYWJzKGVbbysxXS5zY3JlZW5feC1lW29dLnNjcmVlbl94KSksbz4wJiYoaT1NYXRoLm1pbihpLE1hdGguYWJzKGVbby0xXS5zY3JlZW5feC1lW29dLnNjcmVlbl94KSkpLDA9PT1pJiYodm9pZCAwPT09dFtlW29dLnNjcmVlbl94XSYmKHRbZVtvXS5zY3JlZW5feF09e2Ftb3VudDowLHJlc29sdmVkOjAsYWNjdW11bGF0ZWRQb3NpdGl2ZTowLGFjY3VtdWxhdGVkTmVnYXRpdmU6MH0pLHRbZVtvXS5zY3JlZW5feF0uYW1vdW50Kz0xKX0sby5fZ2V0U2FmZURyYXdEYXRhPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbyxuO3JldHVybiB0PGUub3B0aW9ucy5iYXJDaGFydC53aWR0aCYmdD4wPyhvPXQ8aT9pOnQsbj0wLFwibGVmdFwiPT09ZS5vcHRpb25zLmJhckNoYXJ0LmFsaWduP24tPS41KnQ6XCJyaWdodFwiPT09ZS5vcHRpb25zLmJhckNoYXJ0LmFsaWduJiYobis9LjUqdCkpOihvPWUub3B0aW9ucy5iYXJDaGFydC53aWR0aCxuPTAsXCJsZWZ0XCI9PT1lLm9wdGlvbnMuYmFyQ2hhcnQuYWxpZ24/bi09LjUqZS5vcHRpb25zLmJhckNoYXJ0LndpZHRoOlwicmlnaHRcIj09PWUub3B0aW9ucy5iYXJDaGFydC5hbGlnbiYmKG4rPS41KmUub3B0aW9ucy5iYXJDaGFydC53aWR0aCkpLHt3aWR0aDpvLG9mZnNldDpufX0sby5nZXRTdGFja2VkWVJhbmdlPWZ1bmN0aW9uKHQsZSxpLG4scyl7aWYodC5sZW5ndGg+MCl7dC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc2NyZWVuX3g9PT1lLnNjcmVlbl94P3QuZ3JvdXBJZDxlLmdyb3VwSWQ/LTE6MTp0LnNjcmVlbl94
21167LWUuc2NyZWVuX3h9KTt2YXIgcj17fTtvLl9nZXREYXRhSW50ZXJzZWN0aW9ucyhyLHQpLGVbbl09by5fZ2V0U3RhY2tlZFlSYW5nZShyLHQpLGVbbl0ueUF4aXNPcmllbnRhdGlvbj1zLGkucHVzaChuKX19LG8uX2dldFN0YWNrZWRZUmFuZ2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGksbz1lWzBdLnNjcmVlbl95LG49ZVswXS5zY3JlZW5feSxzPTA7czxlLmxlbmd0aDtzKyspaT1lW3NdLnNjcmVlbl94LHZvaWQgMD09PXRbaV0/KG89bz5lW3NdLnNjcmVlbl95P2Vbc10uc2NyZWVuX3k6byxuPW48ZVtzXS5zY3JlZW5feT9lW3NdLnNjcmVlbl95Om4pOmVbc10uc2NyZWVuX3k8MD90W2ldLmFjY3VtdWxhdGVkTmVnYXRpdmUrPWVbc10uc2NyZWVuX3k6dFtpXS5hY2N1bXVsYXRlZFBvc2l0aXZlKz1lW3NdLnNjcmVlbl95O2Zvcih2YXIgciBpbiB0KXQuaGFzT3duUHJvcGVydHkocikmJihvPW8+dFtyXS5hY2N1bXVsYXRlZE5lZ2F0aXZlP3Rbcl0uYWNjdW11bGF0ZWROZWdhdGl2ZTpvLG89bz50W3JdLmFjY3VtdWxhdGVkUG9zaXRpdmU/dFtyXS5hY2N1bXVsYXRlZFBvc2l0aXZlOm8sbj1uPHRbcl0uYWNjdW11bGF0ZWROZWdhdGl2ZT90W3JdLmFjY3VtdWxhdGVkTmVnYXRpdmU6bixuPW48dFtyXS5hY2N1bXVsYXRlZFBvc2l0aXZlP3Rbcl0uYWNjdW11bGF0ZWRQb3NpdGl2ZTpuKTtyZXR1cm57bWluOm8sbWF4Om59fSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt9dmFyIG49aSgxNCk7by5jYWxjUGF0aD1mdW5jdGlvbih0LGUpe2lmKG51bGwhPXQmJnQubGVuZ3RoPjApe3JldHVybiAxPT1lLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5lbmFibGVkP28uX2NhdG11bGxSb20odCxlKTpvLl9saW5lYXIodCl9fSxvLmRyYXdJY29uPWZ1bmN0aW9uKHQsZSxpLG8scyxyKXt2YXIgYSxoLGQ9LjUqcyxsPW4uZ2V0U1ZHRWxlbWVudChcInJlY3RcIixyLnN2Z0VsZW1lbnRzLHIuc3ZnKTtpZihsLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ4XCIsZSksbC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwieVwiLGktZCksbC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwid2lkdGhcIixvKSxsLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJoZWlnaHRcIiwyKmQpLGwuc2V0QXR0cmlidXRlTlMobnVsbCxcImNsYXNzXCIsXCJ2aXMtb3V0bGluZVwiKSxhPW4uZ2V0U1ZHRWxlbWVudChcInBhdGhcIixyLnN2Z0VsZW1lbnRzLHIuc3ZnKSxhLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJjbGFzc1wiLHQuY2xhc3NOYW1lKSx2b2lkIDAhPT10LnN0eWxlJiZhLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJzdHlsZVwiLHQuc3R5bGUpLGEuc2V0QXR0cmlidXRlTlMobnVsbCxcImRcIixcIk1cIitlK1wiLFwiK2krXCIgTFwiKyhlK28pK1wiLFwiK2kpLDE9PXQub3B0aW9ucy5zaGFkZWQuZW5hYmxlZCYmKGg9bi5nZXRTVkdFbGVtZW50KFwicGF0aFwiLHIuc3ZnRWxlbWVudHMsci5zdmcpLFwidG9wXCI9PXQub3B0aW9ucy5zaGFkZWQub3JpZW50YXRpb24/aC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwiZFwiLFwiTVwiK2UrXCIsIFwiKyhpLWQpK1wiTFwiK2UrXCIsXCIraStcIiBMXCIrKGUrbykrXCIsXCIraStcIiBMXCIrKGUrbykrXCIsXCIrKGktZCkpOmguc2V0QXR0cmlidXRlTlMobnVsbCxcImRcIixcIk1cIitlK1wiLFwiK2krXCIgTFwiK2UrXCIsXCIrKGkrZCkrXCIgTFwiKyhlK28pK1wiLFwiKyhpK2QpK1wiTFwiKyhlK28pK1wiLFwiK2kpLGguc2V0QXR0cmlidXRlTlMobnVsbCxcImNsYXNzXCIsdC5jbGFzc05hbWUrXCIgdmlzLWljb24tZmlsbFwiKSx2b2lkIDAhPT10Lm9wdGlvbnMuc2hhZGVkLnN0eWxlJiZcIlwiIT09dC5vcHRpb25zLnNoYWRlZC5zdHlsZSYmaC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwic3R5bGVcIix0Lm9wdGlvbnMuc2hhZGVkLnN0eWxlKSksMT09dC5vcHRpb25zLmRyYXdQb2ludHMuZW5hYmxlZCl7dmFyIHU9e3N0eWxlOnQub3B0aW9ucy5kcmF3UG9pbnRzLnN0eWxlLHN0eWxlczp0Lm9wdGlvbnMuZHJhd1BvaW50cy5zdHlsZXMsc2l6ZTp0Lm9wdGlvbnMuZHJhd1BvaW50cy5zaXplLGNsYXNzTmFtZTp0LmNsYXNzTmFtZX07bi5kcmF3UG9pbnQoZSsuNSpvLGksdSxyLnN2Z0VsZW1lbnRzLHIuc3ZnKX19LG8uZHJhd1NoYWRpbmc9ZnVuY3Rpb24odCxlLGksbyl7aWYoMT09ZS5vcHRpb25zLnNoYWRlZC5lbmFibGVkKXt2YXIgcz1OdW1iZXIoby5zdmcuc3R5bGUuaGVpZ2h0LnJlcGxhY2UoXCJweFwiLFwiXCIpKSxyPW4uZ2V0U1ZHRWxlbWVudChcInBhdGhcIixvLnN2Z0VsZW1lbnRzLG8uc3ZnKSxhPVwiTFwiOzE9PWUub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmVuYWJsZWQmJihhPVwiQ1wiKTt2YXIgaCxkPTA7ZD1cInRvcFwiPT1lLm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uPzA6XCJib3R0b21cIj09ZS5vcHRpb25zLnNoYWRlZC5vcmllbnRhdGlvbj9zOk1hdGgubWluKE1hdGgubWF4KDAsZS56ZXJvUG9zaXRpb24pLHMpLGg9XCJncm91cFwiPT1lLm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uJiZudWxsIT1pJiZ2b2lkIDAhPWk/XCJNXCIrdFswXVswXStcIixcIit0WzBdWzFdK1wiIFwiK3RoaXMuc2VyaWFsaXplUGF0aCh0LGEsITEpK1wiIExcIitpW2kubGVuZ3RoLTFdWzBdK1wiLFwiK2lbaS5sZW5ndGgtMV1bMV0rXCIgXCIrdGhpcy5zZXJpYWxpemVQYXRoKGksYSwhMCkraVswXVswXStcIixcIitpWzBdWzFdK1wiIFpcIjpcIk1cIit0WzBdWzBdK1wiLFwiK3RbMF1bMV0rXCIgXCIrdGhpcy5zZXJpYWxpemVQYXRoKHQsYSwhMSkrXCIgVlwiK2QrXCIgSFwiK3RbMF1bMF0rXCIgWlwiLHIuc2V0QXR0cmlidXRlTlMobnVsbCxcImNsYXNzXCIsZS5jbGFzc05hbWUrXCIgdmlzLWZpbGxcIiksdm9pZCAwIT09ZS5vcHRpb25zLnNoYWRlZC5zdHlsZSYmci5zZXRBdHRyaWJ1dGVOUyhudWxsLFwic3R5bGVcIixlLm9wdGlvbnMuc2hhZGVkLnN0eWxlKSxyLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJkXCIsaCl9fSxvLmRyYXc9ZnVuY3Rpb24odCxlLGkpe2lmKG51bGwhPXQmJnZvaWQgMCE9dCl7dmFyIG89bi5nZXRTVkdFbGVtZW50KFwicGF0aFwiLGkuc3ZnRWxlbWVudHMsaS5zdmcpO28uc2V0QXR0cmlidXRlTlMobnVsbCxcImNsYXNzXCIsZS5jbGFzc05hbWUpLHZvaWQgMCE9PWUuc3R5bGUmJm8uc2V0QXR0cmlidXRlTlMobnVsbCxcInN0eWxlXCIsZS5zdHlsZSk7dmFyIHM9XCJMXCI7MT09ZS5vcHRpb25zLmludGVycG9sYXRpb24uZW5hYmxlZCYmKHM9XCJDXCIpLG8uc2V0QXR0cmlidXRlTlMobnVsbCxcImRcIixcIk1cIit0WzBdWzBdK1wiLFwiK3RbM
21167F1bMV0rXCIgXCIrdGhpcy5zZXJpYWxpemVQYXRoKHQscywhMSkpfX0sby5zZXJpYWxpemVQYXRoPWZ1bmN0aW9uKHQsZSxpKXtpZih0Lmxlbmd0aDwyKXJldHVyblwiXCI7dmFyIG8sbj1lO2lmKGkpZm9yKG89dC5sZW5ndGgtMjtvPjA7by0tKW4rPXRbb11bMF0rXCIsXCIrdFtvXVsxXStcIiBcIjtlbHNlIGZvcihvPTE7bzx0Lmxlbmd0aDtvKyspbis9dFtvXVswXStcIixcIit0W29dWzFdK1wiIFwiO3JldHVybiBufSxvLl9jYXRtdWxsUm9tVW5pZm9ybT1mdW5jdGlvbih0KXt2YXIgZSxpLG8sbixzLHIsYT1bXTthLnB1c2goW01hdGgucm91bmQodFswXS5zY3JlZW5feCksTWF0aC5yb3VuZCh0WzBdLnNjcmVlbl95KV0pO2Zvcih2YXIgaD10Lmxlbmd0aCxkPTA7ZDxoLTE7ZCsrKWU9MD09ZD90WzBdOnRbZC0xXSxpPXRbZF0sbz10W2QrMV0sbj1kKzI8aD90W2QrMl06byxzPXtzY3JlZW5feDooLWUuc2NyZWVuX3grNippLnNjcmVlbl94K28uc2NyZWVuX3gpKigxLzYpLHNjcmVlbl95OigtZS5zY3JlZW5feSs2Kmkuc2NyZWVuX3krby5zY3JlZW5feSkqKDEvNil9LHI9e3NjcmVlbl94OihpLnNjcmVlbl94KzYqby5zY3JlZW5feC1uLnNjcmVlbl94KSooMS82KSxzY3JlZW5feTooaS5zY3JlZW5feSs2Km8uc2NyZWVuX3ktbi5zY3JlZW5feSkqKDEvNil9LGEucHVzaChbcy5zY3JlZW5feCxzLnNjcmVlbl95XSksYS5wdXNoKFtyLnNjcmVlbl94LHIuc2NyZWVuX3ldKSxhLnB1c2goW28uc2NyZWVuX3gsby5zY3JlZW5feV0pO3JldHVybiBhfSxvLl9jYXRtdWxsUm9tPWZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5vcHRpb25zLmludGVycG9sYXRpb24uYWxwaGE7aWYoMD09aXx8dm9pZCAwPT09aSlyZXR1cm4gdGhpcy5fY2F0bXVsbFJvbVVuaWZvcm0odCk7dmFyIG8sbixzLHIsYSxoLGQsbCx1LGMscCxmLG0sdixnLHksYixfLHcseD1bXTt4LnB1c2goW01hdGgucm91bmQodFswXS5zY3JlZW5feCksTWF0aC5yb3VuZCh0WzBdLnNjcmVlbl95KV0pO2Zvcih2YXIgaz10Lmxlbmd0aCxTPTA7UzxrLTE7UysrKW89MD09Uz90WzBdOnRbUy0xXSxuPXRbU10scz10W1MrMV0scj1TKzI8az90W1MrMl06cyxcbiAgICBkPU1hdGguc3FydChNYXRoLnBvdyhvLnNjcmVlbl94LW4uc2NyZWVuX3gsMikrTWF0aC5wb3coby5zY3JlZW5feS1uLnNjcmVlbl95LDIpKSxsPU1hdGguc3FydChNYXRoLnBvdyhuLnNjcmVlbl94LXMuc2NyZWVuX3gsMikrTWF0aC5wb3cobi5zY3JlZW5feS1zLnNjcmVlbl95LDIpKSx1PU1hdGguc3FydChNYXRoLnBvdyhzLnNjcmVlbl94LXIuc2NyZWVuX3gsMikrTWF0aC5wb3cocy5zY3JlZW5feS1yLnNjcmVlbl95LDIpKSx2PU1hdGgucG93KHUsaSkseT1NYXRoLnBvdyh1LDIqaSksZz1NYXRoLnBvdyhsLGkpLGI9TWF0aC5wb3cobCwyKmkpLHc9TWF0aC5wb3coZCxpKSxfPU1hdGgucG93KGQsMippKSxjPTIqXyszKncqZytiLHA9Mip5KzMqdipnK2IsZj0zKncqKHcrZyksZj4wJiYoZj0xL2YpLG09Myp2Kih2K2cpLG0+MCYmKG09MS9tKSxhPXtzY3JlZW5feDooLWIqby5zY3JlZW5feCtjKm4uc2NyZWVuX3grXypzLnNjcmVlbl94KSpmLHNjcmVlbl95OigtYipvLnNjcmVlbl95K2Mqbi5zY3JlZW5feStfKnMuc2NyZWVuX3kpKmZ9LGg9e3NjcmVlbl94Oih5Km4uc2NyZWVuX3grcCpzLnNjcmVlbl94LWIqci5zY3JlZW5feCkqbSxzY3JlZW5feTooeSpuLnNjcmVlbl95K3Aqcy5zY3JlZW5feS1iKnIuc2NyZWVuX3kpKm19LDA9PWEuc2NyZWVuX3gmJjA9PWEuc2NyZWVuX3kmJihhPW4pLDA9PWguc2NyZWVuX3gmJjA9PWguc2NyZWVuX3kmJihoPXMpLHgucHVzaChbYS5zY3JlZW5feCxhLnNjcmVlbl95XSkseC5wdXNoKFtoLnNjcmVlbl94LGguc2NyZWVuX3ldKSx4LnB1c2goW3Muc2NyZWVuX3gscy5zY3JlZW5feV0pO3JldHVybiB4fSxvLl9saW5lYXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLGk9MDtpPHQubGVuZ3RoO2krKyllLnB1c2goW3RbaV0uc2NyZWVuX3gsdFtpXS5zY3JlZW5feV0pO3JldHVybiBlfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGksbyl7dGhpcy5ib2R5PXQsdGhpcy5kZWZhdWx0T3B0aW9ucz17ZW5hYmxlZDohMSxpY29uczohMCxpY29uU2l6ZToyMCxpY29uU3BhY2luZzo2LGxlZnQ6e3Zpc2libGU6ITAscG9zaXRpb246XCJ0b3AtbGVmdFwifSxyaWdodDp7dmlzaWJsZTohMCxwb3NpdGlvbjpcInRvcC1yaWdodFwifX0sdGhpcy5zaWRlPWksdGhpcy5vcHRpb25zPXIuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMubGluZWdyYXBoT3B0aW9ucz1vLHRoaXMuc3ZnRWxlbWVudHM9e30sdGhpcy5kb209e30sdGhpcy5ncm91cHM9e30sdGhpcy5hbW91bnRPZkdyb3Vwcz0wLHRoaXMuX2NyZWF0ZSgpLHRoaXMuZnJhbWV3b3JrPXtzdmc6dGhpcy5zdmcsc3ZnRWxlbWVudHM6dGhpcy5zdmdFbGVtZW50cyxvcHRpb25zOnRoaXMub3B0aW9ucyxncm91cHM6dGhpcy5ncm91cHN9LHRoaXMuc2V0T3B0aW9ucyhlKX12YXIgbj1pKDgpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShuKSxyPWkoMiksYT1pKDE0KSxoPWkoMTYpO28ucHJvdG90eXBlPW5ldyBoLG8ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5ncm91cHM9e30sdGhpcy5hbW91bnRPZkdyb3Vwcz0wfSxvLnByb3RvdHlwZS5hZGRHcm91cD1mdW5jdGlvbih0LGUpezEhPWUub3B0aW9ucy5leGNsdWRlRnJvbUxlZ2VuZCYmKHRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KHQpfHwodGhpcy5ncm91cHNbdF09ZSksdGhpcy5hbW91bnRPZkdyb3Vwcys9MSl9LG8ucHJvdG90eXBlLnVwZGF0ZUdyb3VwPWZ1bmN0aW9uKHQsZSl7dGhpcy5ncm91cHNbdF09ZX0sby5wcm90b3R5cGUucmVtb3ZlR3JvdXA9ZnVuY3Rpb24odCl7dGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkodCkmJihkZWxldGUgdGhpcy5ncm91cHNbdF0sdGhpcy5hbW91bnRPZkdyb3Vwcy09MSl9LG8ucHJvdG90eXBlLl9jcmVhdGU9ZnVuY3Rpb24oKXt0aGlzLmRvbS5mcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmZyYW1lLmNsYXNzTmFtZT1cInZpcy1sZWdlbmRcIix0aGlzLmRvbS5mcmFtZS5zdHlsZS5wb3NpdGlvbj1cImFic29sdXRlXCIsdGhpcy5kb20uZnJhbWUuc3R5bGUudG9wPVwiMTBweFwiLHRoaXMuZG9tLmZyYW1lLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiLHRoaXMuZG9tLnRleHRBcmVhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20udGV4dEFyZWEuY2xhc3NOYW1lPVwidmlzLWxlZ2VuZC10ZXh0XCIsdGhpcy5kb20udGV4dEFyZWEuc3R5bGUucG9zaXRpb249XCJyZWxhdGl2ZVwiLHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLnRvcD1cIjBweFwiLHRoaXMuc3ZnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXCJzdmdcIiksdGhpcy5zdmcuc3R5bGUucG9zaXRpb249XCJhYnNvbHV0ZVwiLHRoaXMuc3ZnLnN0eWxlLnRvcD1cIjBweFwiLHRoaXMuc3ZnLnN0eWxlLndpZHRoP
21167XRoaXMub3B0aW9ucy5pY29uU2l6ZSs1K1wicHhcIix0aGlzLnN2Zy5zdHlsZS5oZWlnaHQ9XCIxMDAlXCIsdGhpcy5kb20uZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5zdmcpLHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZG9tLnRleHRBcmVhKX0sby5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUmJnRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZnJhbWUpfSxvLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZXx8dGhpcy5ib2R5LmRvbS5jZW50ZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20uZnJhbWUpfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPVtcImVuYWJsZWRcIixcIm9yaWVudGF0aW9uXCIsXCJpY29uc1wiLFwibGVmdFwiLFwicmlnaHRcIl07ci5zZWxlY3RpdmVEZWVwRXh0ZW5kKGUsdGhpcy5vcHRpb25zLHQpfSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXt2YXIgdD0wLGU9KDAscy5kZWZhdWx0KSh0aGlzLmdyb3Vwcyk7ZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZT8tMToxfSk7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07MSE9dGhpcy5ncm91cHNbb10udmlzaWJsZXx8dm9pZCAwIT09dGhpcy5saW5lZ3JhcGhPcHRpb25zLnZpc2liaWxpdHlbb10mJjEhPXRoaXMubGluZWdyYXBoT3B0aW9ucy52aXNpYmlsaXR5W29dfHx0Kyt9aWYoMD09dGhpcy5vcHRpb25zW3RoaXMuc2lkZV0udmlzaWJsZXx8MD09dGhpcy5hbW91bnRPZkdyb3Vwc3x8MD09dGhpcy5vcHRpb25zLmVuYWJsZWR8fDA9PXQpdGhpcy5oaWRlKCk7ZWxzZXtpZih0aGlzLnNob3coKSxcInRvcC1sZWZ0XCI9PXRoaXMub3B0aW9uc1t0aGlzLnNpZGVdLnBvc2l0aW9ufHxcImJvdHRvbS1sZWZ0XCI9PXRoaXMub3B0aW9uc1t0aGlzLnNpZGVdLnBvc2l0aW9uPyh0aGlzLmRvbS5mcmFtZS5zdHlsZS5sZWZ0PVwiNHB4XCIsdGhpcy5kb20uZnJhbWUuc3R5bGUudGV4dEFsaWduPVwibGVmdFwiLHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLnRleHRBbGlnbj1cImxlZnRcIix0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS5sZWZ0PXRoaXMub3B0aW9ucy5pY29uU2l6ZSsxNStcInB4XCIsdGhpcy5kb20udGV4dEFyZWEuc3R5bGUucmlnaHQ9XCJcIix0aGlzLnN2Zy5zdHlsZS5sZWZ0PVwiMHB4XCIsdGhpcy5zdmcuc3R5bGUucmlnaHQ9XCJcIik6KHRoaXMuZG9tLmZyYW1lLnN0eWxlLnJpZ2h0PVwiNHB4XCIsdGhpcy5kb20uZnJhbWUuc3R5bGUudGV4dEFsaWduPVwicmlnaHRcIix0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS50ZXh0QWxpZ249XCJyaWdodFwiLHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLnJpZ2h0PXRoaXMub3B0aW9ucy5pY29uU2l6ZSsxNStcInB4XCIsdGhpcy5kb20udGV4dEFyZWEuc3R5bGUubGVmdD1cIlwiLHRoaXMuc3ZnLnN0eWxlLnJpZ2h0PVwiMHB4XCIsdGhpcy5zdmcuc3R5bGUubGVmdD1cIlwiKSxcInRvcC1sZWZ0XCI9PXRoaXMub3B0aW9uc1t0aGlzLnNpZGVdLnBvc2l0aW9ufHxcInRvcC1yaWdodFwiPT10aGlzLm9wdGlvbnNbdGhpcy5zaWRlXS5wb3NpdGlvbil0aGlzLmRvbS5mcmFtZS5zdHlsZS50b3A9NC1OdW1iZXIodGhpcy5ib2R5LmRvbS5jZW50ZXIuc3R5bGUudG9wLnJlcGxhY2UoXCJweFwiLFwiXCIpKStcInB4XCIsdGhpcy5kb20uZnJhbWUuc3R5bGUuYm90dG9tPVwiXCI7ZWxzZXt2YXIgbj10aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyLmhlaWdodC10aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodDt0aGlzLmRvbS5mcmFtZS5zdHlsZS5ib3R0b209NCtuK051bWJlcih0aGlzLmJvZHkuZG9tLmNlbnRlci5zdHlsZS50b3AucmVwbGFjZShcInB4XCIsXCJcIikpK1wicHhcIix0aGlzLmRvbS5mcmFtZS5zdHlsZS50b3A9XCJcIn0wPT10aGlzLm9wdGlvbnMuaWNvbnM/KHRoaXMuZG9tLmZyYW1lLnN0eWxlLndpZHRoP
21167XRoaXMuZG9tLnRleHRBcmVhLm9mZnNldFdpZHRoKzEwK1wicHhcIix0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS5yaWdodD1cIlwiLHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLmxlZnQ9XCJcIix0aGlzLnN2Zy5zdHlsZS53aWR0aD1cIjBweFwiKToodGhpcy5kb20uZnJhbWUuc3R5bGUud2lkdGg9dGhpcy5vcHRpb25zLmljb25TaXplKzE1K3RoaXMuZG9tLnRleHRBcmVhLm9mZnNldFdpZHRoKzEwK1wicHhcIix0aGlzLmRyYXdMZWdlbmRJY29ucygpKTt2YXIgcj1cIlwiO2ZvcihpPTA7aTxlLmxlbmd0aDtpKyspbz1lW2ldLDEhPXRoaXMuZ3JvdXBzW29dLnZpc2libGV8fHZvaWQgMCE9PXRoaXMubGluZWdyYXBoT3B0aW9ucy52aXNpYmlsaXR5W29dJiYxIT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtvXXx8KHIrPXRoaXMuZ3JvdXBzW29dLmNvbnRlbnQrXCI8YnIgLz5cIik7dGhpcy5kb20udGV4dEFyZWEuaW5uZXJIVE1MPXIsdGhpcy5kb20udGV4dEFyZWEuc3R5bGUubGluZUhlaWdodD0uNzUqdGhpcy5vcHRpb25zLmljb25TaXplK3RoaXMub3B0aW9ucy5pY29uU3BhY2luZytcInB4XCJ9fSxvLnByb3RvdHlwZS5kcmF3TGVnZW5kSWNvbnM9ZnVuY3Rpb24oKXtpZih0aGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlKXt2YXIgdD0oMCxzLmRlZmF1bHQpKHRoaXMuZ3JvdXBzKTt0LnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlPy0xOjF9KSxhLnJlc2V0RWxlbWVudHModGhpcy5zdmdFbGVtZW50cyk7dmFyIGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5kb20uZnJhbWUpLnBhZGRpbmdUb3AsaT1OdW1iZXIoZS5yZXBsYWNlKFwicHhcIixcIlwiKSksbz1pLG49dGhpcy5vcHRpb25zLmljb25TaXplLHI9Ljc1KnRoaXMub3B0aW9ucy5pY29uU2l6ZSxoPWkrLjUqciszO3RoaXMuc3ZnLnN0eWxlLndpZHRoPW4rNStpK1wicHhcIjtmb3IodmFyIGQ9MDtkPHQubGVuZ3RoO2QrKyl7dmFyIGw9dFtkXTsxIT10aGlzLmdyb3Vwc1tsXS52aXNpYmxlfHx2b2lkIDAhPT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtsXSYmMSE9dGhpcy5saW5lZ3JhcGhPcHRpb25zLnZpc2liaWxpdHlbbF18fCh0aGlzLmdyb3Vwc1tsXS5nZXRMZWdlbmQobixyLHRoaXMuZnJhbWV3b3JrLG8saCksaCs9cit0aGlzLm9wdGlvbnMuaWNvblNwYWNpbmcpfX19LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG89XCJzdHJpbmdcIixuPVwiYm9vbGVhblwiLHM9XCJudW1iZXJcIixyPVwib2JqZWN0XCIsYT17Y29uZmlndXJlOntlbmFibGVkOntib29sZWFuOm59LGZpbHRlcjp7Ym9vbGVhbjpuLGZ1bmN0aW9uOlwiZnVuY3Rpb25cIn0sY29udGFpbmVyOntkb206XCJkb21cIn0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bixmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9fSx5QXhpc09yaWVudGF0aW9uOntzdHJpbmc6W1wibGVmdFwiLFwicmlnaHRcIl19LGRlZmF1bHRHcm91cDp7c3RyaW5nOm99LHNvcnQ6e2Jvb2xlYW46bn0sc2FtcGxpbmc6e2Jvb2xlYW46bn0sc3RhY2s6e2Jvb2xlYW46bn0sZ3JhcGhIZWlnaHQ6e3N0cmluZzpvLG51bWJlcjpzfSxzaGFkZWQ6e2VuYWJsZWQ6e2Jvb2xlYW46bn0sb3JpZW50YXRpb246e3N0cmluZzpbXCJib3R0b21cIixcInRvcFwiLFwiemVyb1wiLFwiZ3JvdXBcIl19LGdyb3VwSWQ6e29iamVjdDpyfSxfX3R5cGVfXzp7Ym9vbGVhbjpuLG9iamVjdDpyfX0sc3R5bGU6e3N0cmluZzpbXCJsaW5lXCIsXCJiYXJcIixcInBvaW50c1wiXX0sYmFyQ2hhcnQ6e3dpZHRoOntudW1iZXI6c30sbWluV2lkdGg6e251bWJlcjpzfSxzaWRlQnlTaWRlOntib29sZWFuOm59LGFsaWduOntzdHJpbmc6W1wibGVmdFwiLFwiY2VudGVyXCIsXCJyaWdodFwiXX0sX190eXBlX186e29iamVjdDpyfX0saW50ZXJwb2xhdGlvbjp7ZW5hYmxlZDp7Ym9vbGVhbjpufSxwYXJhbWV0cml6YXRpb246e3N0cmluZzpbXCJjZW50cmlwZXRhbFwiLFwiY2hvcmRhbFwiLFwidW5pZm9ybVwiXX0sYWxwaGE6e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpufX0sZHJhd1BvaW50czp7ZW5hYmxlZDp7Ym9vbGVhbjpufSxvblJlbmRlcjp7ZnVuY3Rpb246XCJmdW5jdGlvblwifSxzaXplOntudW1iZXI6c30sc3R5bGU6e3N0cmluZzpbXCJzcXVhcmVcIixcImNpcmNsZVwiXX0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bixmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9fSxkYXRhQXhpczp7c2hvd01pbm9yTGFiZWxzOntib29sZWFuOm59LHNob3dNYWpvckxhYmVsczp7Ym9vbGVhbjpufSxpY29uczp7Ym9vbGVhbjpufSx3aWR0aDp7c3RyaW5nOm8sbnVtYmVyOnN9LHZpc2libGU6e2Jvb2xlYW46bn0sYWxpZ25aZXJvczp7Ym9vbGVhbjpufSxsZWZ0OntyYW5nZTp7bWluOntudW1iZXI6cyx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sbWF4OntudW1iZXI6cyx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sX190eXBlX186e29iamVjdDpyfX0sZm9ybWF0OntmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LHRpdGxlOnt0ZXh0OntzdHJpbmc6byxudW1iZXI6cyx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sc3R5bGU6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxyaWdodDp7cmFuZ2U6e21pbjp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LG1heDp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntvYmplY3Q6cn19LGZvcm1hdDp7ZnVuY3Rpb246XCJmdW5jdGlvblwifSx0aXRsZTp7dGV4dDp7c3RyaW5nOm8sbnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHN0eWxlOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sX190eXBlX186e29iamVjdDpyfX0sX190eXBlX186e29iamVjdDpyfX0sX190eXBlX186e29iamVjdDpyfX0sbGVnZW5kOntlbmFibGVkOntib29sZWFuOm59LGljb25zOntib29sZWFuOm59LGxlZnQ6e3Zpc2libGU6e2Jvb2xlYW46bn0scG9zaXRpb246e3N0cmluZzpbXCJ0b3AtcmlnaHRcIixcImJvdHRvbS1yaWdodFwiLFwidG9wLWxlZnRcIixcImJvdHRvbS1sZWZ0XCJdfSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxyaWdodDp7dmlzaWJsZTp7Ym9vbGVhbjpufSxwb3NpdGlvbjp7c3RyaW5nOltcInRvcC1yaWdodFwiLFwiYm90dG9tLXJpZ2h0XCIsXCJ0b3AtbGVmdFwiLFwiYm90dG9tLWxlZnRcIl19LF9fdHlwZV9fOntvYmplY3Q6cn19LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm59fSxncm91cHM6e3Zpc2liaWxpdHk6e2FueTpcImFueVwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxhdXRvUmVzaXplOntib29sZWFuOm59LHRocm90dGxlUmVkcmF3OntudW1iZXI6c30sY2xpY2tUb1VzZTp7Ym9vbGVhbjpufSxlbmQ6e251bWJlcjpzLGRhdGU6XCJkYXRlXCIsc3RyaW5nOm8sbW9tZW50OlwibW9tZW50XCJ9LGZvcm1hdDp7bWlub3JMYWJlbHM6e21pbGxpc2Vjb25kOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sc2Vjb25kOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sbWludXRlOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0saG91cjp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHdlZWtkYXk6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxkYXk6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxtb250aDp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHllYXI6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxtYWpvckxhYmVsczp7bWlsbGlzZWNvbmQ6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxzZWNvbmQ6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxtaW51dGU6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxob3VyOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sd2Vla2RheTp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LGRheTp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LG1vbnRoOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0seWVhcjp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntvYmplY3Q6cn19LF9fdHlwZV9fOntvYmplY3Q6cn19LG1vbWVudDp7ZnVuY3Rpb246XCJmdW5jdGlvblwifSxoZWlnaHQ6e3N0cmluZzpvLG51bWJlcjpzfSxoaWRkZW5EYXRlczp7c3RhcnQ6e2RhdGU6XCJkYXRlXCIsbnVtYmVyOnMsc3RyaW5nOm8sbW9tZW50OlwibW9tZW50XCJ9LGVuZDp7ZGF0ZTpcImRhdGVcIixudW1iZXI6cyxzdHJpbmc6byxtb21lbnQ6XCJtb21lbnRcIn0scmVwZWF0OntzdHJpbmc6b30sX190eXBlX186e29iamVjdDpyLGFycmF5OlwiYXJyYXlcIn19LGxvY2FsZTp7c3RyaW5nOm99LGxvY2FsZXM6e19fYW55X186e2FueTpcImFueVwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxtYXg6e2RhdGU6XCJkYXRlXCIsbnVtYmVyOnMsc3RyaW5nOm8sbW9tZW50OlwibW9tZW50XCJ9LG1heEhlaWdodDp7bnVtYmVyOnMsc3RyaW5nOm99LG1heE1pbm9yQ2hhcnM6e251bWJlcjpzfSxtaW46e2RhdGU6XCJkYXRlXCIsbnVtYmVyOnMsc3RyaW5nOm8sbW9tZW50OlwibW9tZW50XCJ9LG1pbkhlaWdodDp7bnVtYmVyOnMsc3RyaW5nOm99LG1vdmVhYmxlOntib29sZWFuOm59LG11bHRpc2VsZWN0Ontib29sZWFuOm59LG9yaWVudGF0aW9uOntzdHJpbmc6b30sc2hvd0N1cnJlbnRUaW1lOntib29sZWFuOm59LHNob3dNYWpvckxhYmVsczp7Ym9vbGVhbjpufSxzaG93TWlub3JMYWJlbHM6e2Jvb2xlYW46bn0sc3RhcnQ6e2RhdGU6XCJkYXRlXCIsbnVtYmVyOnMsc3RyaW5nOm8sbW9tZW50OlwibW9tZW50XCJ9LHRpbWVBeGlzOntzY2FsZTp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHN0ZXA6e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSx3aWR0aDp7c3RyaW5nOm8sbnVtYmVyOnN9LHpvb21hYmxlOntib29sZWFuOm59LHpvb21LZXk6e3N0cmluZzpbXCJjdHJsS2V5XCIsXCJhbHRLZXlcIixcIm1ldGFLZXlcIixcIlwiXX0sem9vbU1heDp7bnVtYmVyOnN9LHpvb21NaW46e251bWJlcjpzfSx6SW5kZXg6e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxoPXtnbG9iYWw6e3NvcnQ6ITAsc2FtcGxpbmc6ITAsc3RhY2s6ITEsc2hhZGVkOntlbmFibGVkOiExLG9yaWVudGF0aW9uOltcInplcm9cIixcInRvcFwiLFwiYm90dG9tXCIsXCJncm91cFwiXX0sc3R5bGU6W1wibGluZVwiLFwiYmFyXCIsXCJwb2ludHNcIl0sYmFyQ2hhcnQ6e3dpZHRoOls1MCw1LDEwMCw1XSxtaW5XaWR0aDpbNTAsNSwxMDAsNV0sc2lkZUJ5U2lkZTohMSxhbGlnbjpbXCJsZWZ0XCIsXCJjZW50ZXJcIixcInJpZ2h0XCJdfSxpbnRlcnBvbGF0aW9uOntlbmFibGVkOiEwLHBhcmFtZXRyaXphdGlvbjpbXCJjZW50cmlwZXRhbFwiLFwiY2hvcmRhbFwiLFwidW5pZm9ybVwiXX0sZHJhd1BvaW50czp7ZW5hYmxlZDohMCxzaXplOls2LDIsMzAsMV0sc3R5bGU6W1wic3F1YXJlXCIsXCJjaXJjbGVcIl19LGRhdGFBeGlzOntzaG93TWlub3JMYWJlbHM6ITAsc2hvd01ham9yTGFiZWxzOiEwLGljb25zOiExLHdpZHRoOls0MCwwLDIwMCwxXSx2aXNpYmxlOiEwLGFsaWduWmVyb3M6ITAsbGVmdDp7dGl0bGU6e3RleHQ6XCJcIixzdHlsZTpcIlwifX0scmlnaHQ6e3RpdGxlOnt0ZXh0OlwiXCIsc3R5bGU6XCJcIn19fSxsZWdlbmQ6e2VuYWJsZWQ6ITEsaWNvbnM6ITAsbGVmdDp7dmlzaWJsZTohMCxwb3NpdGlvbjpbXCJ0b3AtcmlnaHRcIixcImJvdHRvbS1yaWdodFwiLFwidG9wLWxlZnRcIixcImJvdHRvbS1sZWZ0XCJdfSxyaWdodDp7dmlzaWJsZTohMCxwb3NpdGlvbjpbXCJ0b3AtcmlnaHRcIixcImJvdHRvbS1yaWdodFwiLFwidG9wLWxlZnRcIixcImJvdHRvbS1sZWZ0XCJdfX0sYXV0b1Jlc2l6ZTohMCxjbGlja1RvVXNlOiExLGVuZDpcIlwiLGZvcm1hdDp7bWlub3JMYWJlbHM6e21pbGxpc2Vjb25kOlwiU1NTXCIsc2Vjb25kOlwic1wiLG1pbnV0ZTpcIkhIOm1tXCIsaG91cjpcIkhIOm1tXCIsd2Vla2RheTpcImRkZCBEXCIsZGF5OlwiRFwiLG1vbnRoOlwiTU1NXCIseWVhcjpcIllZWVlcIn0sbWFqb3JMYWJlbHM6e21pbGxpc2Vjb25kOlwiSEg6bW06c3NcIixzZWNvbmQ6XCJEIE1NTU0gSEg6bW1cIixtaW51dGU6XCJkZGQgRCBNTU1NXCIsaG91cjpcImRkZCBEIE1NTU1cIix3ZWVrZGF5OlwiTU1NTSBZWVlZXCIsZGF5OlwiTU1NTSBZWVlZXCIsbW9udGg6XCJZWVlZXCIseWVhcjpcIlwifX0saGVpZ2h0OlwiXCIsbG9jYWxlOlwiXCIsbWF4OlwiXCIsbWF4SGVpZ2h0OlwiXCIsbWF4TWlub3JDaGFyczpbNywwLDIwLDFdLG1pbjpcIlwiLG1pbkhlaWdodDpcIlwiLG1vdmVhYmxlOiEwLG9yaWVudGF0aW9uOltcImJvdGhcIixcImJvdHRvbVwiLFwidG9wXCJdLHNob3dDdXJyZW50VGltZTohMSxzaG93TWFqb3JMYWJlbHM6ITAsc2hvd01pbm9yTGFiZWxzOiEwLHN0YXJ0OlwiXCIsd2lkdGg6XCIxMDAl
21167XCIsem9vbWFibGU6ITAsem9vbUtleTpbXCJjdHJsS2V5XCIsXCJhbHRLZXlcIixcIm1ldGFLZXlcIixcIlwiXSx6b29tTWF4OlszMTUzNmUxMCwxMCwzMTUzNmUxMCwxXSx6b29tTWluOlsxMCwxMCwzMTUzNmUxMCwxXSx6SW5kZXg6MH19O2UuYWxsT3B0aW9ucz1hLGUuY29uZmlndXJlT3B0aW9ucz1ofSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gUj10LGYoKX1mdW5jdGlvbiBuKCl7QT0wLHo9Ui5jaGFyQXQoMCl9ZnVuY3Rpb24gcygpe0ErKyx6PVIuY2hhckF0KEEpfWZ1bmN0aW9uIHIoKXtyZXR1cm4gUi5jaGFyQXQoQSsxKX1mdW5jdGlvbiBhKHQpe3JldHVybiBCLnRlc3QodCl9ZnVuY3Rpb24gaCh0LGUpe2lmKHR8fCh0PXt9KSxlKWZvcih2YXIgaSBpbiBlKWUuaGFzT3duUHJvcGVydHkoaSkmJih0W2ldPWVbaV0pO3JldHVybiB0fWZ1bmN0aW9uIGQodCxlLGkpe2Zvcih2YXIgbz1lLnNwbGl0KFwiLlwiKSxuPXQ7by5sZW5ndGg7KXt2YXIgcz1vLnNoaWZ0KCk7by5sZW5ndGg/KG5bc118fChuW3NdPXt9KSxuPW5bc10pOm5bc109aX19ZnVuY3Rpb24gbCh0LGUpe2Zvcih2YXIgaSxvLG49bnVsbCxzPVt0XSxyPXQ7ci5wYXJlbnQ7KXMucHVzaChyLnBhcmVudCkscj1yLnBhcmVudDtpZihyLm5vZGVzKWZvcihpPTAsbz1yLm5vZGVzLmxlbmd0aDtpPG87aSsrKWlmKGUuaWQ9PT1yLm5vZGVzW2ldLmlkKXtuPXIubm9kZXNbaV07YnJlYWt9Zm9yKG58fChuPXtpZDplLmlkfSx0Lm5vZGUmJihuLmF0dHI9aChuLmF0dHIsdC5ub2RlKSkpLGk9cy5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIGE9c1tpXTthLm5vZGVzfHwoYS5ub2Rlcz1bXSksLTE9PT1hLm5vZGVzLmluZGV4T2YobikmJmEubm9kZXMucHVzaChuKX1lLmF0dHImJihuLmF0dHI9aChuLmF0dHIsZS5hdHRyKSl9ZnVuY3Rpb24gdSh0LGUpe2lmKHQuZWRnZXN8fCh0LmVkZ2VzPVtdKSx0LmVkZ2VzLnB1c2goZSksdC5lZGdlKXt2YXIgaT1oKHt9LHQuZWRnZSk7ZS5hdHRyPWgoaSxlLmF0dHIpfX1mdW5jdGlvbiBjKHQsZSxpLG8sbil7dmFyIHM9e2Zyb206ZSx0bzppLHR5cGU6b307cmV0dXJuIHQuZWRnZSYmKHMuYXR0cj1oKHt9LHQuZWRnZSkpLHMuYXR0cj1oKHMuYXR0cnx8e30sbiksc31mdW5jdGlvbiBwKCl7Zm9yKEY9SS5OVUxMLEw9XCJcIjtcIiBcIj09PXp8fFwiXFx0XCI9PT16fHxcIlxcblwiPT09enx8XCJcXHJcIj09PXo7KXMoKTtkb3t2YXIgdD0hMTtpZihcIiNcIj09PXope2Zvcih2YXIgZT1BLTE7XCIgXCI9PT1SLmNoYXJBdChlKXx8XCJcXHRcIj09PVIuY2hhckF0KGUpOyllLS07aWYoXCJcXG5cIj09PVIuY2hhckF0KGUpfHxcIlwiPT09Ui5jaGFyQXQoZSkpe2Zvcig7XCJcIiE9eiYmXCJcXG5cIiE9ejspcygpO3Q9ITB9fWlmKFwiL1wiPT09eiYmXCIvXCI9PT1yKCkpe2Zvcig7XCJcIiE9eiYmXCJcXG5cIiE9ejspcygpO3Q9ITB9aWYoXCIvXCI9PT16JiZcIipcIj09PXIoKSl7Zm9yKDtcIlwiIT16Oyl7aWYoXCIqXCI9PT16JiZcIi9cIj09PXIoKSl7cygpLHMoKTticmVha31zKCl9dD0hMH1mb3IoO1wiIFwiPT09enx8XCJcXHRcIj09PXp8fFwiXFxuXCI9PT16fHxcIlxcclwiPT09ejspcygpfXdoaWxlKHQpO2lmKFwiXCI9PT16KXJldHVybiB2b2lkKEY9SS5ERUxJTUlURVIpO3ZhciBpPXorcigpO2lmKE5baV0pcmV0dXJuIEY9SS5ERUxJTUlURVIsTD1pLHMoKSx2b2lkIHMoKTtpZihOW3pdKXJldHVybiBGPUkuREVMSU1JVEVSLEw9eix2b2lkIHMoKTtpZihhKHopfHxcIi1cIj09PXope2ZvcihMKz16LHMoKTthKHopOylMKz16LHMoKTtyZXR1cm5cImZhbHNlXCI9PT1MP0w9ITE6XCJ0cnVlXCI9PT1MP0w9ITA6aXNOYU4oTnVtYmVyKEwpKXx8KEw9TnVtYmVyKEwpKSx2b2lkKEY9SS5JREVOVElGSUVSKX1pZignXCInPT09eil7Zm9yKHMoKTtcIlwiIT16JiYoJ1wiJyE9enx8J1wiJz09PXomJidcIic9PT1yKCkpOyknXCInPT09ej8oTCs9eixzKCkpOlwiXFxcXFwiPT09eiYmXCJuXCI9PT1yKCk/KEwrPVwiXFxuXCIscygpKTpMKz16LHMoKTtpZignXCInIT16KXRocm93IHgoJ0VuZCBvZiBzdHJpbmcgXCIgZXhwZWN0ZWQnKTtyZXR1cm4gcygpLHZvaWQoRj1JLklERU5USUZJRVIpfWZvcihGPUkuVU5LTk9XTjtcIlwiIT16OylMKz16LHMoKTt0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1N5bnRheCBlcnJvciBpbiBwYXJ0IFwiJytrKEwsMzApKydcIicpfWZ1bmN0aW9uIGYoKXt2YXIgdD17fTtpZihuKCkscCgpLFwic3RyaWN0XCI9PT1MJiYodC5zdHJpY3Q9ITAscCgpKSxcImdyYXBoXCIhPT1MJiZcImRpZ3JhcGhcIiE9PUx8fCh0LnR5cGU9TCxwKCkpLEY9PT1JLklERU5USUZJRVImJih0LmlkPUwscCgpKSxcIntcIiE9TCl0aHJvdyB4KFwiQW5nbGUgYnJhY2tldCB7IGV4cGVjdGVkXCIpO2lmKHAoKSxtKHQpLFwifVwiIT1MKXRocm93IHgoXCJBbmdsZSBicmFja2V0IH0gZXhwZWN0ZWRcIik7aWYocCgpLFwiXCIhPT1MKXRocm93IHgoXCJFbmQgb2YgZmlsZSBleHBlY3RlZFwiKTtyZXR1cm4gcCgpLGRlbGV0ZSB0Lm5vZGUsZGVsZXRlIHQuZWRnZSxkZWxldGUgdC5ncmFwaCx0fWZ1bmN0aW9uIG0odCl7Zm9yKDtcIlwiIT09TCYmXCJ9XCIhPUw7KXYodCksXCI7XCI9PT1MJiZwKCl9ZnVuY3Rpb24gdih0KXt2YXIgZT1nKHQpO2lmKGUpcmV0dXJuIHZvaWQgXyh0LGUpO2lmKCF5KHQpKXtpZihGIT1JLklERU5USUZJRVIpdGhyb3cgeChcIklkZW50aWZpZXIgZXhwZWN0ZWRcIik7dmFyIGk9TDtpZihwKCksXCI9XCI9PT1MKXtpZihwKCksRiE9SS5JREVOVElGSUVSKXRocm93IHgoXCJJZGVudGlmaWVyIGV4cGVjdGVkXCIpO3RbaV09TCxwKCl9ZWxzZSBiKHQsaSl9fWZ1bmN0aW9uIGcodCl7dmFyIGU9bnVsbDtpZihcInN1YmdyYXBoXCI9PT1MJiYoZT17fSxlLnR5cGU9XCJzdWJncmFwaFwiLHAoKSxGPT09SS5JREVOVElGSUVSJiYoZS5pZD1MLHAoKSkpLFwie1wiPT09TCl7aWYocCgpLGV8fChlPXt9KSxlLnBhcmVudD10LGUubm9kZT10Lm5vZGUsZS5lZGdlPXQuZWRnZSxlLmdyYXBoPXQuZ3JhcGgsbShlKSxcIn1cIiE9TCl0aHJvdyB4KFwiQW5nbGUgYnJhY2tldCB9IGV4cGVjdGVkXCIpO3AoKSxkZWxldGUgZS5ub2RlLGRlbGV0ZSBlLmVkZ2UsZGVsZXRlIGUuZ3JhcGgsZGVsZXRlIGUucGFyZW50LHQuc3ViZ3JhcGhzfHwodC5zdWJncmFwaHM9W10pLHQuc3ViZ3JhcGhzLnB1c2goZSl9cmV0dXJuIGV9ZnVuY3Rpb24geSh0KXtyZXR1cm5cIm5vZGVcIj09PUw/KHAoKSx0Lm5vZGU9dygpLFwibm9kZVwiKTpcImVkZ2VcIj09PUw/KHAoKSx0LmVkZ2U9dygpLFwiZWRnZVwiKTpcImdyYXBoXCI9PT1MPyhwKCksdC5ncmFwaD13KCksXCJncmFwaFwiKTpudWxsfWZ1bmN0aW9uIGIodCxlKXt2YXIgaT17aWQ6ZX0sbz13KCk7byYmKGkuYXR0cj1vKSxsKHQsaSksXyh0LGUpfWZ1bmN0aW9uIF8odCxlKXtmb3IoO1wiLT5cIj09PUx8fFwiLS1cIj09PUw7KXt2YXIgaSxvPUw7cCgpO3ZhciBuPWcodCk7
21167aWYobilpPW47ZWxzZXtpZihGIT1JLklERU5USUZJRVIpdGhyb3cgeChcIklkZW50aWZpZXIgb3Igc3ViZ3JhcGggZXhwZWN0ZWRcIik7aT1MLGwodCx7aWQ6aX0pLHAoKX11KHQsYyh0LGUsaSxvLHcoKSkpLGU9aX19ZnVuY3Rpb24gdygpe2Zvcih2YXIgdD1udWxsLGU9e2Rhc2hlZDohMCxzb2xpZDohMSxkb3R0ZWQ6WzEsNV19O1wiW1wiPT09TDspe2ZvcihwKCksdD17fTtcIlwiIT09TCYmXCJdXCIhPUw7KXtpZihGIT1JLklERU5USUZJRVIpdGhyb3cgeChcIkF0dHJpYnV0ZSBuYW1lIGV4cGVjdGVkXCIpO3ZhciBpPUw7aWYocCgpLFwiPVwiIT1MKXRocm93IHgoXCJFcXVhbCBzaWduID0gZXhwZWN0ZWRcIik7aWYocCgpLEYhPUkuSURFTlRJRklFUil0aHJvdyB4KFwiQXR0cmlidXRlIHZhbHVlIGV4cGVjdGVkXCIpO3ZhciBvPUw7XCJzdHlsZVwiPT09aSYmKG89ZVtvXSksZCh0LGksbykscCgpLFwiLFwiPT1MJiZwKCl9aWYoXCJdXCIhPUwpdGhyb3cgeChcIkJyYWNrZXQgXSBleHBlY3RlZFwiKTtwKCl9cmV0dXJuIHR9ZnVuY3Rpb24geCh0KXtyZXR1cm4gbmV3IFN5bnRheEVycm9yKHQrJywgZ290IFwiJytrKEwsMzApKydcIiAoY2hhciAnK0ErXCIpXCIpfWZ1bmN0aW9uIGsodCxlKXtyZXR1cm4gdC5sZW5ndGg8PWU/dDp0LnN1YnN0cigwLDI3KStcIi4uLlwifWZ1bmN0aW9uIFModCxlLGkpe0FycmF5LmlzQXJyYXkodCk/dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe0FycmF5LmlzQXJyYXkoZSk/ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2kodCxlKX0pOmkodCxlKX0pOkFycmF5LmlzQXJyYXkoZSk/ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2kodCxlKX0pOmkodCxlKX1mdW5jdGlvbiBEKHQsZSxpKXtmb3IodmFyIG89ZS5zcGxpdChcIi5cIiksbj1vLnBvcCgpLHM9dCxyPTA7cjxvLmxlbmd0aDtyKyspe3ZhciBhPW9bcl07YSBpbiBzfHwoc1thXT17fSkscz1zW2FdfXJldHVybiBzW25dPWksdH1mdW5jdGlvbiBNKHQsZSl7dmFyIGk9e307Zm9yKHZhciBvIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShvKSl7dmFyIG49ZVtvXTtBcnJheS5pc0FycmF5KG4pP24uZm9yRWFjaChmdW5jdGlvbihlKXtEKGksZSx0W29dKX0pOlwic3RyaW5nXCI9PXR5cGVvZiBuP0QoaSxuLHRbb10pOkQoaSxvLHRbb10pfXJldHVybiBpfWZ1bmN0aW9uIEModCl7dmFyIGU9byh0KSxpPXtub2RlczpbXSxlZGdlczpbXSxvcHRpb25zOnt9fTtpZihlLm5vZGVzJiZlLm5vZGVzLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9e2lkOnQuaWQsbGFiZWw6U3RyaW5nKHQubGFiZWx8fHQuaWQpfTtoKGUsTSh0LmF0dHIsVCkpLGUuaW1hZ2UmJihlLnNoYXBlPVwiaW1hZ2VcIiksaS5ub2Rlcy5wdXNoKGUpfSksZS5lZGdlcyl7dmFyIG49ZnVuY3Rpb24odCl7dmFyIGU9e2Zyb206dC5mcm9tLHRvOnQudG99O3JldHVybiBoKGUsTSh0LmF0dHIsUCkpLGUuYXJyb3dzPVwiLT5cIj09PXQudHlwZT9cInRvXCI6dm9pZCAwLGV9O2UuZWRnZXMuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZSxvO2U9dC5mcm9tIGluc3RhbmNlb2YgT2JqZWN0P3QuZnJvbS5ub2Rlczp7aWQ6dC5mcm9tfSxvPXQudG8gaW5zdGFuY2VvZiBPYmplY3Q/dC50by5ub2Rlczp7aWQ6dC50b30sdC5mcm9tIGluc3RhbmNlb2YgT2JqZWN0JiZ0LmZyb20uZWRnZXMmJnQuZnJvbS5lZGdlcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPW4odCk7aS5lZGdlcy5wdXNoKGUpfSksUyhlLG8sZnVuY3Rpb24oZSxvKXt2YXIgcz1jKGksZS5pZCxvLmlkLHQudHlwZSx0LmF0dHIpLHI9bihzKTtpLmVkZ2VzLnB1c2gocil9KSx0LnRvIGluc3RhbmNlb2YgT2JqZWN0JiZ0LnRvLmVkZ2VzJiZ0LnRvLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9bih0KTtpLmVkZ2VzLnB1c2goZSl9KX0pfXJldHVybiBlLmF0dHImJihpLm9wdGlvbnM9ZS5hdHRyKSxpfXZhciBPPWkoMjkpLEU9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShPKSxUPXtmb250c2l6ZTpcImZvbnQuc2l6ZVwiLGZvbnRjb2xvcjpcImZvbnQuY29sb3JcIixsYWJlbGZvbnRjb2xvcjpcImZvbnQuY29sb3JcIixmb250bmFtZTpcImZvbnQuZmFjZVwiLGNvbG9yOltcImNvbG9yLmJvcmRlclwiLFwiY29sb3IuYmFja2dyb3VuZFwiXSxmaWxsY29sb3I6XCJjb2xvci5iYWNrZ3JvdW5kXCIsdG9vbHRpcDpcInRpdGxlXCIsbGFiZWx0b29sdGlwOlwidGl0bGVcIn0sUD0oMCxFLmRlZmF1bHQpKFQpO1AuY29sb3I9XCJjb2xvci5jb2xvclwiLFAuc3R5bGU9XCJkYXNoZXNcIjt2YXIgST17TlVMTDowLERFTElNSVRFUjoxLElERU5USUZJRVI6MixVTktOT1dOOjN9LE49e1wie1wiOiEwLFwifVwiOiEwLFwiW1wiOiEwLFwiXVwiOiEwLFwiO1wiOiEwLFwiPVwiOiEwLFwiLFwiOiEwLFwiLT5cIjohMCxcIi0tXCI6ITB9LFI9XCJcIixBPTAsej1cIlwiLEw9XCJcIixGPUkuTlVMTCxCPS9bYS16QS1aXzAtOS46I10vO2UucGFyc2VET1Q9byxlLkRPVFRvR3JhcGg9Q30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt2YXIgaT1bXSxvPVtdLG49e2VkZ2VzOntpbmhlcml0Q29sb3I6ITF9LG5vZGVzOntmaXhlZDohMSxwYXJzZUNvbG9yOiExfX07dm9pZCAwIT09ZSYmKHZvaWQgMCE9PWUuZml4ZWQmJihuLm5vZGVzLmZpeGVkPWUuZml4ZWQpLHZvaWQgMCE9PWUucGFyc2VDb2xvciYmKG4ubm9kZXMucGFyc2VDb2xvcj1lLnBhcnNlQ29sb3IpLHZvaWQgMCE9PWUuaW5oZXJpdENvbG9yJiYobi5lZGdlcy5pbmhlcml0Q29sb3I9ZS5pbmhlcml0Q29sb3IpKTtmb3IodmFyIHM9dC5lZGdlcyxyPXQubm9kZXMsYT0wO2E8cy5sZW5ndGg7YSsrKXt2YXIgaD17fSxkPXNbYV07aC5pZD1kLmlkLGguZnJvbT1kLnNvdXJjZSxoLnRvPWQudGFyZ2V0LGguYXR0cmlidXRlcz1kLmF0dHJpYnV0ZXMsaC5sYWJlbD1kLmxhYmVsLGgudGl0bGU9dm9pZCAwIT09ZC5hdHRyaWJ1dGVzP2QuYXR0cmlidXRlcy50aXRsZTp2b2lkIDAsXCJEaXJlY3RlZFwiPT09ZC50eXBlJiYoaC5hcnJvd3M9XCJ0b1wiKSxkLmNvbG9yJiYhMT09PW4uaW5oZXJpdENvbG9yJiYoaC5jb2xvcj1kLmNvbG9yKSxpLnB1c2goaCl9Zm9yKHZhciBsPTA7bDxyLmxlbmd0aDtsKyspe3ZhciB1PXt9LGM9cltsXTt1LmlkPWMuaWQsdS5hdHRyaWJ1dGVzPWMuYXR0cmlidXRlcyx1Lng9Yy54LHUueT1jLnksdS5sYWJlbD1jLmxhYmVsLHUudGl0bGU9dm9pZCAwIT09Yy5hdHRyaWJ1dGVzP2MuYXR0cmlidXRlcy50aXRsZTpjLnRpdGxlLCEwPT09bi5ub2Rlcy5wYXJzZUNvbG9yP3UuY29sb3I9Yy5jb2xvcjp1LmNvbG9yPXZvaWQgMCE9PWMuY29sb3I/e2JhY2tncm91bmQ6Yy5jb2xvcixib3JkZXI6Yy5jb2xvcixoaWdobGlnaHQ6e2JhY2tncm91bmQ6Yy5jb2xvcixib3JkZXI6Yy5jb2xvcn0saG92ZXI6e2JhY2tncm91bmQ6Yy5jb2xvcixib3JkZXI6Yy5jb2xvcn19OnZvaWQgMCx1LnNpemU9Yy5zaXplLHUuZml4ZWQ9bi5ub2Rlcy5maXhlZCYmdm9pZCAwIT09Yy54JiZ2b2lkIDAhPT1jLnksby5wdXNoKHUpfXJldHVybntub2RlczpvLGVkZ2VzOml9fWUucGFyc2VHZXBoaT1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgwKSxzPW8obikscj1pKDEpLGE9byhyKSxoPWkoMTg1KSxkPW8oaCksbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7KDAscy5kZWZh
21167dWx0KSh0aGlzLHQpLHRoaXMuaW1hZ2VzPXt9LHRoaXMuaW1hZ2VCcm9rZW49e30sdGhpcy5jYWxsYmFjaz1lfXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleTpcIl90cnlsb2FkQnJva2VuVXJsXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe2lmKHZvaWQgMCE9PXQmJnZvaWQgMCE9PWkpe2lmKHZvaWQgMD09PWUpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKFwiTm8gYnJva2VuIHVybCBpbWFnZSBkZWZpbmVkXCIpO2kub25lcnJvcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3QgbG9hZCBicm9rZW5JbWFnZTpcIixlKX0saS5pbWFnZS5zcmM9ZX19fSx7a2V5OlwiX3JlZHJhd1dpdGhJbWFnZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuY2FsbGJhY2smJnRoaXMuY2FsbGJhY2sodCl9fSx7a2V5OlwibG9hZFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcyxvPXRoaXMuaW1hZ2VzW3RdO2lmKG8pcmV0dXJuIG87dmFyIG49bmV3IGQuZGVmYXVsdDtyZXR1cm4gdGhpcy5pbWFnZXNbdF09bixuLmltYWdlLm9ubG9hZD1mdW5jdGlvbigpe2kuX2ZpeEltYWdlQ29vcmRpbmF0ZXMobi5pbWFnZSksbi5pbml0KCksaS5fcmVkcmF3V2l0aEltYWdlKG4pfSxuLmltYWdlLm9uZXJyb3I9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGxvYWQgaW1hZ2U6XCIsdCksaS5fdHJ5bG9hZEJyb2tlblVybCh0LGUsbil9LG4uaW1hZ2Uuc3JjPXQsbn19LHtrZXk6XCJfZml4SW1hZ2VDb29yZGluYXRlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpezA9PT10LndpZHRoJiYoZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KSx0LndpZHRoPXQub2Zmc2V0V2lkdGgsdC5oZWlnaHQ9dC5vZmZzZXRIZWlnaHQsZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KSl9fV0pLHR9KCk7ZS5kZWZhdWx0PWx9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDMwKSxzPW8obikscj1pKDYpLGE9byhyKSxoPWkoMCksZD1vKGgpLGw9aSgxKSx1PW8obCksYz1pKDIpLHA9aSg0OCkuZGVmYXVsdCxmPWkoMTkxKS5kZWZhdWx0LG09W1wiYm9sZFwiLFwiaXRhbFwiLFwiYm9sZGl0YWxcIixcIm1vbm9cIl0sdj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdOygwLGQuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLnBvaW50VG9TZWxmPSExLHRoaXMuYmFzZVNpemU9dm9pZCAwLHRoaXMuZm9udE9wdGlvbnM9e30sdGhpcy5zZXRPcHRpb25zKGkpLHRoaXMuc2l6ZT17dG9wOjAsbGVmdDowLHdpZHRoOjAsaGVpZ2h0OjAseUxpbmU6MH0sdGhpcy5pc0VkZ2VMYWJlbD1vfXJldHVybigwLHUuZGVmYXVsdCkodCxbe2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0aGlzLmVsZW1lbnRPcHRpb25zPXQsdGhpcy5pbml0Rm9udE9wdGlvbnModC5mb250KSxwLmlzVmFsaWRMYWJlbCh0LmxhYmVsKT90aGlzLmxhYmVsRGlydHk9ITA6dC5sYWJlbD1cIlwiLHZvaWQgMCE9PXQuZm9udCYmbnVsbCE9PXQuZm9udClpZihcInN0cmluZ1wiPT10eXBlb2YgdC5mb250KXRoaXMuYmFzZVNpemU9dGhpcy5mb250T3B0aW9ucy5zaXplO2Vsc2UgaWYoXCJvYmplY3RcIj09PSgwLGEuZGVmYXVsdCkodC5mb250KSl7dmFyIGU9dC5mb250LnNpemU7dm9pZCAwIT09ZSYmKHRoaXMuYmFzZVNpemU9ZSl9fX0se2tleTpcImluaXRGb250T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBpPXRoaXM7aWYoYy5mb3JFYWNoKG0sZnVuY3Rpb24odCl7aS5mb250T3B0aW9uc1t0XT17fX0pLHQucGFyc2VGb250U3RyaW5nKHRoaXMuZm9udE9wdGlvbnMsZSkpcmV0dXJuIHZvaWQodGhpcy5mb250T3B0aW9ucy52YWRqdXN0PTApO2MuZm9yRWFjaChlLGZ1bmN0aW9uKHQsZSl7dm9pZCAwIT09dCYmbnVsbCE9PXQmJlwib2JqZWN0XCIhPT0odm9pZCAwPT09dD9cInVuZGVmaW5lZFwiOigwLGEuZGVmYXVsdCkodCkpJiYoaS5mb250T3B0aW9uc1tlXT10KX0pfX0se2tleTpcImNvbnN0cmFpblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXtjb25zdHJhaW5XaWR0aDohMSxtYXhXZHQ6LTEsbWluV2R0Oi0xLGNvbnN0cmFpbkhlaWdodDohMSxtaW5IZ3Q6LTEsdmFsaWduOlwibWlkZGxlXCJ9LGk9Yy50b3BNb3N0KHQsXCJ3aWR0aENvbnN0cmFpbnRcIik7aWYoXCJudW1iZXJcIj09dHlwZW9mIGkpZS5tYXhXZHQ9TnVtYmVyKGkpLGUubWluV2R0PU51bWJlcihpKTtlbHNlIGlmKFwib2JqZWN0XCI9PT0odm9pZCAwPT09aT9cInVuZGVmaW5lZFwiOigwLGEuZGVmYXVsdCkoaSkpKXt2YXIgbz1jLnRvcE1vc3QodCxbXCJ3aWR0aENvbnN0cmFpbnRcIixcIm1heGltdW1cIl0pO1wibnVtYmVyXCI9PXR5cGVvZiBvJiYoZS5tYXhXZHQ9TnVtYmVyKG8pKTt2YXIgbj1jLnRvcE1vc3QodCxbXCJ3aWR0aENvbnN0cmFpbnRcIixcIm1pbmltdW1cIl0pO1wibnVtYmVyXCI9PXR5cGVvZiBuJiYoZS5taW5XZHQ9TnVtYmVyKG4pKX12YXIgcz1jLnRvcE1vc3QodCxcImhlaWdodENvbnN0cmFpbnRcIik7aWYoXCJudW1iZXJcIj09dHlwZW9mIHMpZS5taW5IZ3Q9TnVtYmVyKHMpO2Vsc2UgaWYoXCJvYmplY3RcIj09PSh2b2lkIDA9PT1zP1widW5kZWZpbmVkXCI6KDAsYS5kZWZhdWx0KShzKSkpe3ZhciByPWMudG9wTW9zdCh0LFtcImhlaWdodENvbnN0cmFpbnRcIixcIm1pbmltdW1cIl0pO1wibnVtYmVyXCI9PXR5cGVvZiByJiYoZS5taW5IZ3Q9TnVtYmVyKHIpKTt2YXIgaD1jLnRvcE1vc3QodCxbXCJoZWlnaHRDb25zdHJhaW50XCIsXCJ2YWxpZ25cIl0pO1wic3RyaW5nXCI9PXR5cGVvZiBoJiYoXCJ0b3BcIiE9PWgmJlwiYm90dG9tXCIhPT1ofHwoZS52YWxpZ249aCkpfXJldHVybiBlfX0se2tleTpcInVwZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5zZXRPcHRpb25zKHQsITApLHRoaXMucHJvcGFnYXRlRm9udHMoZSksYy5kZWVwRXh0ZW5kKHRoaXMuZm9udE9wdGlvbnMsdGhpcy5jb25zdHJhaW4oZSkpLHRoaXMuZm9udE9wdGlvbnMuY2hvb3Nlcj1wLmNob29zaWZ5KFwibGFiZWxcIixlKX19LHtrZXk6XCJhZGp1c3RTaXplc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQ/dC5yaWdodCt0LmxlZnQ6MDt0aGlzLmZvbnRPcHRpb25zLmNvbnN0cmFpbldpZHRoJiYodGhpcy5mb250T3B0aW9ucy5tYXhXZHQtPWUsdGhpcy5mb250T3B0aW9ucy5taW5XZHQtPWUpO3ZhciBpPXQ/dC50b3ArdC5ib3R0b206MDt0aGlzLmZvbnRPcHRpb25zLmNvbnN0cmFpbkhlaWdodCYmKHRoaXMuZm9udE9wdGlvbnMubWluSGd0LT1pKX19LHtrZXk6XCJhZGRGb250T3B0aW9uc1RvUGlsZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDsrK2kpdGhpcy5hZGRGb250VG9QaWxlKHQsZVtpXSl9fSx7a2V5OlwiYWRkRm9udFRvUGlsZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09ZSYmdm9pZCAwIT09ZS5mb250JiZudWxsIT09ZS5mb250KXt2YXIgaT1lLmZvbnQ7dC5wdXNoKGkpfX19LHtrZXk6XCJnZXRCYXNpY09wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbihlKXtmb3IodmFyIGk9e30sbz0wO288ZS5sZW5ndGg7KytvKXt2YXIgbj1lW29dLHM9e307dC5wYXJzZU
21167ZvbnRTdHJpbmcocyxuKSYmKG49cyksYy5mb3JFYWNoKG4sZnVuY3Rpb24odCxlKXt2b2lkIDAhPT10JiYoaS5oYXNPd25Qcm9wZXJ0eShlKXx8KC0xIT09bS5pbmRleE9mKGUpP2lbZV09e306aVtlXT10KSl9KX1yZXR1cm4gaX19LHtrZXk6XCJnZXRGb250T3B0aW9uXCIsdmFsdWU6ZnVuY3Rpb24oZSxpLG8pe2Zvcih2YXIgbj12b2lkIDAscz0wO3M8ZS5sZW5ndGg7KytzKXt2YXIgcj1lW3NdO2lmKHIuaGFzT3duUHJvcGVydHkoaSkpe2lmKHZvaWQgMD09PShuPXJbaV0pfHxudWxsPT09biljb250aW51ZTt2YXIgYT17fTtpZih0LnBhcnNlRm9udFN0cmluZyhhLG4pJiYobj1hKSxuLmhhc093blByb3BlcnR5KG8pKXJldHVybiBuW29dfX1pZih0aGlzLmZvbnRPcHRpb25zLmhhc093blByb3BlcnR5KG8pKXJldHVybiB0aGlzLmZvbnRPcHRpb25zW29dO3Rocm93IG5ldyBFcnJvcihcIkRpZCBub3QgZmluZCB2YWx1ZSBmb3IgbXVsdGktZm9udCBmb3IgcHJvcGVydHk6ICdcIitvK1wiJ1wiKX19LHtrZXk6XCJnZXRGb250T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXt9LG89W1wiY29sb3JcIixcInNpemVcIixcImZhY2VcIixcIm1vZFwiLFwidmFkanVzdFwiXSxuPTA7bjxvLmxlbmd0aDsrK24pe3ZhciBzPW9bbl07aVtzXT10aGlzLmdldEZvbnRPcHRpb24odCxlLHMpfXJldHVybiBpfX0se2tleTpcInByb3BhZ2F0ZUZvbnRzXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxpPVtdO3RoaXMuYWRkRm9udE9wdGlvbnNUb1BpbGUoaSx0KSx0aGlzLmZvbnRPcHRpb25zPXRoaXMuZ2V0QmFzaWNPcHRpb25zKGkpO2Zvcih2YXIgbz0wO288bS5sZW5ndGg7KytvKSFmdW5jdGlvbih0KXt2YXIgbz1tW3RdLG49ZS5mb250T3B0aW9uc1tvXSxzPWUuZ2V0Rm9udE9wdGlvbnMoaSxvKTtjLmZvckVhY2gocyxmdW5jdGlvbih0LGUpe25bZV09dH0pLG4uc2l6ZT1OdW1iZXIobi5zaXplKSxuLnZhZGp1c3Q9TnVtYmVyKG4udmFkanVzdCl9KG8pfX0se2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3ZhciBzPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTpcIm1pZGRsZVwiO2lmKHZvaWQgMCE9PXRoaXMuZWxlbWVudE9wdGlvbnMubGFiZWwpe3ZhciByPXRoaXMuZm9udE9wdGlvbnMuc2l6ZSp0aGlzLmJvZHkudmlldy5zY2FsZTt0aGlzLmVsZW1lbnRPcHRpb25zLmxhYmVsJiZyPHRoaXMuZWxlbWVudE9wdGlvbnMuc2NhbGluZy5sYWJlbC5kcmF3VGhyZXNob2xkLTF8fChyPj10aGlzLmVsZW1lbnRPcHRpb25zLnNjYWxpbmcubGFiZWwubWF4VmlzaWJsZSYmKHI9TnVtYmVyKHRoaXMuZWxlbWVudE9wdGlvbnMuc2NhbGluZy5sYWJlbC5tYXhWaXNpYmxlKS90aGlzLmJvZHkudmlldy5zY2FsZSksdGhpcy5jYWxjdWxhdGVMYWJlbFNpemUodCxvLG4sZSxpLHMpLHRoaXMuX2RyYXdCYWNrZ3JvdW5kKHQpLHRoaXMuX2RyYXdUZXh0KHQsZSx0aGlzLnNpemUueUxpbmUscyxyKSl9fX0se2tleTpcIl9kcmF3QmFja2dyb3VuZFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXRoaXMuZm9udE9wdGlvbnMuYmFja2dyb3VuZCYmXCJub25lXCIhPT10aGlzLmZvbnRPcHRpb25zLmJhY2tncm91bmQpe3QuZmlsbFN0eWxlPXRoaXMuZm9udE9wdGlvbnMuYmFja2dyb3VuZDt2YXIgZT10aGlzLmdldFNpemUoKTt0LmZpbGxSZWN0KGUubGVmdCxlLnRvcCxlLndpZHRoLGUuaGVpZ2h0KX19fSx7a2V5OlwiX2RyYXdUZXh0XCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpcIm1pZGRsZVwiLG49YXJndW1lbnRzWzRdLHI9dGhpcy5fc2V0QWxpZ25tZW50KHQsZSxpLG8pLGE9KDAscy5kZWZh
21167dWx0KShyLDIpO2U9YVswXSxpPWFbMV0sdC50ZXh0QWxpZ249XCJsZWZ0XCIsZS09dGhpcy5zaXplLndpZHRoLzIsdGhpcy5mb250T3B0aW9ucy52YWxpZ24mJnRoaXMuc2l6ZS5oZWlnaHQ+dGhpcy5zaXplLmxhYmVsSGVpZ2h0JiYoXCJ0b3BcIj09PXRoaXMuZm9udE9wdGlvbnMudmFsaWduJiYoaS09KHRoaXMuc2l6ZS5oZWlnaHQtdGhpcy5zaXplLmxhYmVsSGVpZ2h0KS8yKSxcImJvdHRvbVwiPT09dGhpcy5mb250T3B0aW9ucy52YWxpZ24mJihpKz0odGhpcy5zaXplLmhlaWdodC10aGlzLnNpemUubGFiZWxIZWlnaHQpLzIpKTtmb3IodmFyIGg9MDtoPHRoaXMubGluZUNvdW50O2grKyl7dmFyIGQ9dGhpcy5saW5lc1toXTtpZihkJiZkLmJsb2Nrcyl7dmFyIGw9MDt0aGlzLmlzRWRnZUxhYmVsfHxcImNlbnRlclwiPT09dGhpcy5mb250T3B0aW9ucy5hbGlnbj9sKz0odGhpcy5zaXplLndpZHRoLWQud2lkdGgpLzI6XCJyaWdodFwiPT09dGhpcy5mb250T3B0aW9ucy5hbGlnbiYmKGwrPXRoaXMuc2l6ZS53aWR0aC1kLndpZHRoKTtmb3IodmFyIHU9MDt1PGQuYmxvY2tzLmxlbmd0aDt1Kyspe3ZhciBjPWQuYmxvY2tzW3VdO3QuZm9udD1jLmZvbnQ7dmFyIHA9dGhpcy5fZ2V0Q29sb3IoYy5jb2xvcixuLGMuc3Ryb2tlQ29sb3IpLGY9KDAscy5kZWZhdWx0KShwLDIpLG09ZlswXSx2PWZbMV07Yy5zdHJva2VXaWR0aD4wJiYodC5saW5lV2lkdGg9Yy5zdHJva2VXaWR0aCx0LnN0cm9rZVN0eWxlPXYsdC5saW5lSm9pbj1cInJvdW5kXCIpLHQuZmlsbFN0eWxlPW0sYy5zdHJva2VXaWR0aD4wJiZ0LnN0cm9rZVRleHQoYy50ZXh0LGUrbCxpK2MudmFkanVzdCksdC5maWxsVGV4dChjLnRleHQsZStsLGkrYy52YWRqdXN0KSxsKz1jLndpZHRofWkrPWQuaGVpZ2h0fX19fSx7a2V5OlwiX3NldEFsaWdubWVudFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8pe2lmKHRoaXMuaXNFZGdlTGFiZWwmJlwiaG9yaXpvbnRhbFwiIT09dGhpcy5mb250T3B0aW9ucy5hbGlnbiYmITE9PT10aGlzLnBvaW50VG9TZWxmKXtlPTAsaT0wO1widG9wXCI9PT10aGlzLmZvbnRPcHRpb25zLmFsaWduPyh0LnRleHRCYXNlbGluZT1cImFscGhhYmV0aWNcIixpLT00KTpcImJvdHRvbVwiPT09dGhpcy5mb250T3B0aW9ucy5hbGlnbj8odC50ZXh0QmFzZWxpbmU9XCJoYW5naW5nXCIsaSs9NCk6dC50ZXh0QmFzZWxpbmU9XCJtaWRkbGVcIn1lbHNlIHQudGV4dEJhc2VsaW5lPW87cmV0dXJuW2UsaV19fSx7a2V5OlwiX2dldENvbG9yXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPXR8fFwiIzAwMDAwMFwiLG49aXx8XCIjZmZmZmZmXCI7aWYoZTw9dGhpcy5lbGVtZW50T3B0aW9ucy5zY2FsaW5nLmxhYmVsLmRyYXdUaHJlc2hvbGQpe3ZhciBzPU1hdGgubWF4KDAsTWF0aC5taW4oMSwxLSh0aGlzLmVsZW1lbnRPcHRpb25zLnNjYWxpbmcubGFiZWwuZHJhd1RocmVzaG9sZC1lKSkpO289Yy5vdmVycmlkZU9wYWNpdHkobyxzKSxuPWMub3ZlcnJpZGVPcGFjaXR5KG4scyl9cmV0dXJuW28sbl19fSx7a2V5OlwiZ2V0VGV4dFNpemVcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXTtyZXR1cm4gdGhpcy5fcHJvY2Vzc0xhYmVsKHQsZSxpKSx7d2lkdGg6dGhpcy5zaXplLndpZHRoLGhlaWdodDp0aGlzLnNpemUuaGVpZ2h0LGxpbmVDb3VudDp0aGlzLmxpbmVDb3VudH19fSx7a2V5OlwiZ2V0U2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zaXplLmxlZnQsZT10aGlzLnNpemUudG9wLTE7aWYodGhpcy5pc0VkZ2VMYWJlbCl7dmFyIGk9LjUqLXRoaXMuc2l6ZS53aWR0aDtzd2l0Y2godGhpcy5mb250T3B0aW9ucy5hbGlnbil7Y2FzZVwibWlkZGxlXCI6dD1pLGU9LjUqLXRoaXMuc2l6ZS5oZWlnaHQ7YnJlYWs7Y2FzZVwidG9wXCI6dD1pLGU9LSh0aGlzLnNpemUuaGVpZ2h0KzIpO2JyZWFrO2Nhc2VcImJvdHRvbVwiOnQ9aSxlPTJ9fXJldHVybntsZWZ0OnQsdG9wOmUsd2lkdGg6dGhpcy5zaXplLndpZHRoLGhlaWdodDp0aGlzLnNpemUuaGVpZ2h0fX19LHtrZXk6XCJjYWxjdWxhdGVMYWJlbFNpemVcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOjAsbj1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06MCxzPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTpcIm1pZGRsZVwiO3RoaXMuX3Byb2Nlc3NMYWJlbCh0LGUsaSksdGhpcy5zaXplLmxlZnQ9by0uNSp0aGlzLnNpemUud2lkdGgsdGhpcy5zaXplLnRvcD1uLS41KnRoaXMuc2l6ZS5oZWlnaHQsdGhpcy5zaXplLnlMaW5lPW4rLjUqKDEtdGhpcy5saW5lQ291bnQpKnRoaXMuZm9udE9wdGlvbnMuc2l6ZSxcImhhbmdpbmdcIj09PXMmJih0aGlzLnNpemUudG9wKz0uNSp0aGlzLmZvbnRPcHRpb25zLnNpemUsdGhpcy5zaXplLnRvcCs9NCx0aGlzLnNpemUueUxpbmUrPTQpfX0se2tleTpcImdldEZvcm1hdHRpbmdWYWx1ZXNcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXt2YXIgbj1mdW5jdGlvbih0LGUsaSl7cmV0dXJuXCJub3JtYWxcIj09PWU/XCJtb2RcIj09PWk/XCJcIjp0W2ldOnZvaWQgMCE9PXRbZV1baV0/dFtlXVtpXTp0W2ldfSxzPXtjb2xvcjpuKHRoaXMuZm9udE9wdGlvbnMsbyxcImNvbG9yXCIpLHNpemU6bih0aGlzLmZvbnRPcHRpb25zLG8sXCJzaXplXCIpLGZhY2U6bih0aGlzLmZvbnRPcHRpb25zLG8sXCJmYWNlXCIpLG1vZDpuKHRoaXMuZm9udE9wdGlvbnMsbyxcIm1vZFwiKSx2YWRqdXN0Om4odGhpcy5mb250T3B0aW9ucyxvLFwidmFkanVzdFwiKSxzdHJva2VXaWR0aDp0aGlzLmZvbnRPcHRpb25zLnN0cm9rZVdpZHRoLHN0cm9rZUNvbG9yOnRoaXMuZm9udE9wdGlvbnMuc3Ryb2tlQ29sb3J9OyhlfHxpKSYmKFwibm9ybWFsXCI9PT1vJiYhMD09PXRoaXMuZm9udE9wdGlvbnMuY2hvb3NlciYmdGhpcy5lbGVtZW50T3B0aW9ucy5sYWJlbEhpZ2hsaWdodEJvbGQ/cy5tb2Q9XCJib2xkXCI6XCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5mb250T3B0aW9ucy5jaG9vc2VyJiZ0aGlzLmZvbnRPcHRpb25zLmNob29zZXIocyx0aGlzLmVsZW1lbnRPcHRpb25zLmlkLGUsaSkpO3ZhciByPVwiXCI7cmV0dXJuIHZvaWQgMCE9PXMubW9kJiZcIlwiIT09cy5tb2QmJihyKz1zLm1vZCtcIiBcIikscis9cy5zaXpl
21167K1wicHggXCIrcy5mYWNlLHQuZm9udD1yLnJlcGxhY2UoL1wiL2csXCJcIikscy5mb250PXQuZm9udCxzLmhlaWdodD1zLnNpemUsc319LHtrZXk6XCJkaWZmZXJlbnRTdGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQhPT10aGlzLnNlbGVjdGVkU3RhdGV8fGUhPT10aGlzLmhvdmVyU3RhdGV9fSx7a2V5OlwiX3Byb2Nlc3NMYWJlbFRleHRcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXtyZXR1cm4gbmV3IGYodCx0aGlzLGUsaSkucHJvY2VzcyhvKX19LHtrZXk6XCJfcHJvY2Vzc0xhYmVsXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe2lmKCExIT09dGhpcy5sYWJlbERpcnR5fHx0aGlzLmRpZmZlcmVudFN0YXRlKGUsaSkpe3ZhciBvPXRoaXMuX3Byb2Nlc3NMYWJlbFRleHQodCxlLGksdGhpcy5lbGVtZW50T3B0aW9ucy5sYWJlbCk7dGhpcy5mb250T3B0aW9ucy5taW5XZHQ+MCYmby53aWR0aDx0aGlzLmZvbnRPcHRpb25zLm1pbldkdCYmKG8ud2lkdGg9dGhpcy5mb250T3B0aW9ucy5taW5XZHQpLHRoaXMuc2l6ZS5sYWJlbEhlaWdodD1vLmhlaWdodCx0aGlzLmZvbnRPcHRpb25zLm1pbkhndD4wJiZvLmhlaWdodDx0aGlzLmZvbnRPcHRpb25zLm1pbkhndCYmKG8uaGVpZ2h0PXRoaXMuZm9udE9wdGlvbnMubWluSGd0KSx0aGlzLmxpbmVzPW8ubGluZXMsdGhpcy5saW5lQ291bnQ9by5saW5lcy5sZW5ndGgsdGhpcy5zaXplLndpZHRoPW8ud2lkdGgsdGhpcy5zaXplLmhlaWdodD1vLmhlaWdodCx0aGlzLnNlbGVjdGVkU3RhdGU9ZSx0aGlzLmhvdmVyU3RhdGU9aSx0aGlzLmxhYmVsRGlydHk9ITF9fX0se2tleTpcInZpc2libGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiAwIT09dGhpcy5zaXplLndpZHRoJiYwIT09dGhpcy5zaXplLmhlaWdodCYmdm9pZCAwIT09dGhpcy5lbGVtZW50T3B0aW9ucy5sYWJlbCYmISh0aGlzLmZvbnRPcHRpb25zLnNpemUqdGhpcy5ib2R5LnZpZXcuc2NhbGU8dGhpcy5lbGVtZW50T3B0aW9ucy5zY2FsaW5nLmxhYmVsLmRyYXdUaHJlc2hvbGQtMSl9fV0sW3trZXk6XCJwYXJzZUZvbnRTdHJpbmdcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKCFlfHxcInN0cmluZ1wiIT10eXBlb2YgZSlyZXR1cm4hMTt2YXIgaT1lLnNwbGl0KFwiIFwiKTtyZXR1cm4gdC5zaXplPWlbMF0ucmVwbGFjZShcInB4XCIsXCJcIiksdC5mYWNlPWlbMV0sdC5jb2xvcj1pWzJdLCEwfX1dKSx0fSgpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzMCkscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoMiksdT1pKDExOSkuZGVmYXVsdCxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7KDAsYS5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1pLHRoaXMubGFiZWxNb2R1bGU9byx0aGlzLm9wdGlvbnM9e30sdGhpcy5zZXRPcHRpb25zKGUpLHRoaXMuY29sb3JEaXJ0eT0hMCx0aGlzLmNvbG9yPXt9LHRoaXMuc2VsZWN0aW9uV2lkdGg9Mix0aGlzLmhvdmVyV2lkdGg9MS41LHRoaXMuZnJvbVBvaW50PXRoaXMuZnJvbSx0aGlzLnRvUG9pbnQ9dGhpcy50b31yZXR1cm4oMCxkLmRlZmF1bHQpKHQsW3trZXk6XCJjb25uZWN0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmZyb209dGhpcy5ib2R5Lm5vZGVzW3RoaXMub3B0aW9ucy5mcm9tXSx0aGlzLnRvPXRoaXMuYm9keS5ub2Rlc1t0aGlzLm9wdGlvbnMudG9dfX0se2tleTpcImNsZWFudXBcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiExfX0se2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dCx0aGlzLmZyb209dGhpcy5ib2R5Lm5vZGVzW3RoaXMub3B0aW9ucy5mcm9tXSx0aGlzLnRvPXRoaXMuYm9keS5ub2Rlc1t0aGlzLm9wdGlvbnMudG9dLHRoaXMuaWQ9dGhpcy5vcHRpb25zLmlkfX0se2tleTpcImRyYXdMaW5lXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt0LnN0cm9rZVN0eWxlPXRoaXMuZ2V0Q29sb3IodCxlLGksbyksdC5saW5lV2lkdGg9ZS53aWR0aCwhMSE9PWUuZGFzaGVzP3RoaXMuX2RyYXdEYXNoZWRMaW5lKHQsZSxuKTp0aGlzLl9kcmF3TGluZSh0LGUsbil9fSx7a2V5OlwiX2RyYXdMaW5lXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXtpZih0aGlzLmZyb20hPXRoaXMudG8pdGhpcy5fbGluZSh0LGUsaSxvLG4pO2Vsc2V7dmFyIHI9dGhpcy5fZ2V0Q2lyY2xlRGF0YSh0KSxhPSgwLHMuZGVmYXVsdCkociwzKSxoPWFbMF0sZD1hWzFdLGw9YVsyXTt0aGlzLl9jaXJjbGUodCxlLGgsZCxsKX19fSx7a2V5OlwiX2RyYXdEYXNoZWRMaW5lXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt0LmxpbmVDYXA9XCJyb3VuZFwiO3ZhciByPVs1LDVdO2lmKCEwPT09QXJyYXkuaXNBcnJheShlLmRhc2hlcykmJihyPWUuZGFzaGVzKSx2b2lkIDAhPT10LnNldExpbmVEYXNoKXtpZih0LnNhdmUoKSx0LnNldExpbmVEYXNoKHIpLHQubGluZURhc2hPZmZzZXQ9MCx0aGlzLmZyb20hPXRoaXMudG8pdGhpcy5fbGluZSh0LGUsaSk7ZWxzZXt2YXIgYT10aGlzLl9nZXRDaXJjbGVEYXRhKHQpLGg9KDAscy5kZWZh
21167dWx0KShhLDMpLGQ9aFswXSxsPWhbMV0sdT1oWzJdO3RoaXMuX2NpcmNsZSh0LGUsZCxsLHUpfXQuc2V0TGluZURhc2goWzBdKSx0LmxpbmVEYXNoT2Zmc2V0PTAsdC5yZXN0b3JlKCl9ZWxzZXtpZih0aGlzLmZyb20hPXRoaXMudG8pdC5kYXNoZWRMaW5lKHRoaXMuZnJvbS54LHRoaXMuZnJvbS55LHRoaXMudG8ueCx0aGlzLnRvLnkscik7ZWxzZXt2YXIgYz10aGlzLl9nZXRDaXJjbGVEYXRhKHQpLHA9KDAscy5kZWZhdWx0KShjLDMpLGY9cFswXSxtPXBbMV0sdj1wWzJdO3RoaXMuX2NpcmNsZSh0LGUsZixtLHYpfXRoaXMuZW5hYmxlU2hhZG93KHQsZSksdC5zdHJva2UoKSx0aGlzLmRpc2FibGVTaGFkb3codCxlKX19fSx7a2V5OlwiZmluZEJvcmRlclBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLmZyb20hPXRoaXMudG8/dGhpcy5fZmluZEJvcmRlclBvc2l0aW9uKHQsZSxpKTp0aGlzLl9maW5kQm9yZGVyUG9zaXRpb25DaXJjbGUodCxlLGkpfX0se2tleTpcImZpbmRCb3JkZXJQb3NpdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT17fSxpPXt9O2lmKHRoaXMuZnJvbSE9dGhpcy50byllPXRoaXMuX2ZpbmRCb3JkZXJQb3NpdGlvbih0aGlzLmZyb20sdCksaT10aGlzLl9maW5kQm9yZGVyUG9zaXRpb24odGhpcy50byx0KTtlbHNle3ZhciBvPXRoaXMuX2dldENpcmNsZURhdGEodCkuc2xpY2UoMCwyKSxuPSgwLHMuZGVmYXVsdCkobywyKSxyPW5bMF0sYT1uWzFdO2U9dGhpcy5fZmluZEJvcmRlclBvc2l0aW9uQ2lyY2xlKHRoaXMuZnJvbSx0LHt4OnIseTphLGxvdzouMjUsaGlnaDouNixkaXJlY3Rpb246LTF9KSxpPXRoaXMuX2ZpbmRCb3JkZXJQb3NpdGlvbkNpcmNsZSh0aGlzLmZyb20sdCx7eDpyLHk6YSxsb3c6LjYsaGlnaDouOCxkaXJlY3Rpb246MX0pfXJldHVybntmcm9tOmUsdG86aX19fSx7a2V5OlwiX2dldENpcmNsZURhdGFcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDAsaT12b2lkIDAsbz10aGlzLmZyb20sbj10aGlzLm9wdGlvbnMuc2VsZlJlZmVyZW5jZVNpemU7cmV0dXJuIHZvaWQgMCE9PXQmJnZvaWQgMD09PW8uc2hhcGUud2lkdGgmJm8uc2hhcGUucmVzaXplKHQpLG8uc2hhcGUud2lkdGg+by5zaGFwZS5oZWlnaHQ/KGU9by54Ky41Km8uc2hhcGUud2lkdGgsaT1vLnktbik6KGU9by54K24saT1vLnktLjUqby5zaGFwZS5oZWlnaHQpLFtlLGksbl19fSx7a2V5OlwiX3BvaW50T25DaXJjbGVcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXt2YXIgbj0yKm8qTWF0aC5QSTtyZXR1cm57eDp0K2kqTWF0aC5jb3MobikseTplLWkqTWF0aC5zaW4obil9fX0se2tleTpcIl9maW5kQm9yZGVyUG9zaXRpb25DaXJjbGVcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBvPWkueCxuPWkueSxzPWkubG93LHI9aS5oaWdoLGE9aS5kaXJlY3Rpb24saD0wLGQ9dGhpcy5vcHRpb25zLnNlbGZSZWZlcmVuY2VTaXplLGw9dm9pZCAwLHU9dm9pZCAwLGM9dm9pZCAwLHA9dm9pZCAwLGY9dm9pZCAwLG09LjUqKHMrcik7czw9ciYmaDwxMCYmKG09LjUqKHMrciksbD10aGlzLl9wb2ludE9uQ2lyY2xlKG8sbixkLG0pLHU9TWF0aC5hdGFuMih0LnktbC55LHQueC1sLngpLGM9dC5kaXN0YW5jZVRvQm9yZGVyKGUsdSkscD1NYXRoLnNxcnQoTWF0aC5wb3cobC54LXQueCwyKStNYXRoLnBvdyhsLnktdC55LDIpKSxmPWMtcCwhKE1hdGguYWJzKGYpPC4wNSkpOylmPjA/YT4wP3M9bTpyPW06YT4wP3I9bTpzPW0saCsrO3JldHVybiBsLnQ9bSxsfX0se2tleTpcImdldExpbmVXaWR0aFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuITA9PT10P01hdGgubWF4KHRoaXMuc2VsZWN0aW9uV2lkdGgsLjMvdGhpcy5ib2R5LnZpZXcuc2NhbGUpOiEwPT09ZT9NYXRoLm1heCh0aGlzLmhvdmVyV2lkdGgsLjMvdGhpcy5ib2R5LnZpZXcuc2NhbGUpOk1hdGgubWF4KHRoaXMub3B0aW9ucy53aWR0aCwuMy90aGlzLmJvZHkudmlldy5zY2FsZSl9fSx7a2V5OlwiZ2V0Q29sb3JcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXtpZighMSE9PWUuaW5oZXJpdHNDb2xvcil7aWYoXCJib3RoXCI9PT1lLmluaGVyaXRzQ29sb3ImJnRoaXMuZnJvbS5pZCE9PXRoaXMudG8uaWQpe3ZhciBuPXQuY3JlYXRlTGluZWFyR3JhZGllbnQodGhpcy5mcm9tLngsdGhpcy5mcm9tLnksdGhpcy50by54LHRoaXMudG8ueSkscz12b2lkIDAscj12b2lkIDA7cmV0dXJuIHM9dGhpcy5mcm9tLm9wdGlvbnMuY29sb3IuaGlnaGxpZ2h0LmJvcmRlcixyPXRoaXMudG8ub3B0aW9ucy5jb2xvci5oaWdobGlnaHQuYm9yZGVyLCExPT09dGhpcy5mcm9tLnNlbGVjdGVkJiYhMT09PXRoaXMudG8uc2VsZWN0ZWQ/KHM9bC5vdmVycmlkZU9wYWNpdHkodGhpcy5mcm9tLm9wdGlvbnMuY29sb3IuYm9yZGVyLGUub3BhY2l0eSkscj1sLm92ZXJyaWRlT3BhY2l0eSh0aGlzLnRvLm9wdGlvbnMuY29sb3IuYm9yZGVyLGUub3BhY2l0eSkpOiEwPT09dGhpcy5mcm9tLnNlbGVjdGVkJiYhMT09PXRoaXMudG8uc2VsZWN0ZWQ/cj10aGlzLnRvLm9wdGlvbnMuY29sb3IuYm9yZGVyOiExPT09dGhpcy5mcm9tLnNlbGVjdGVkJiYhMD09PXRoaXMudG8uc2VsZWN0ZWQmJihzPXRoaXMuZnJvbS5vcHRpb25zLmNvbG9yLmJvcmRlciksbi5hZGRDb2xvclN0b3AoMCxzKSxuLmFkZENvbG9yU3RvcCgxLHIpLG59cmV0dXJuXCJ0b1wiPT09ZS5pbmhlcml0c0NvbG9yP2wub3ZlcnJpZGVPcGFjaXR5KHRoaXMudG8ub3B0aW9ucy5jb2xvci5ib3JkZXIsZS5vcGFjaXR5KTpsLm92ZXJyaWRlT3BhY2l0eSh0aGlzLmZyb20ub3B0aW9ucy5jb2xvci5ib3JkZXIsZS5vcGFjaXR5KX1yZXR1cm4gbC5vdmVycmlkZU9wYWNpdHkoZS5jb2xvcixlLm9wYWNpdHkpfX0se2tleTpcIl9jaXJjbGVcIixcbiAgICB2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3RoaXMuZW5hYmxlU2hhZG93KHQsZSksdC5iZWdpblBhdGgoKSx0LmFyYyhpLG8sbiwwLDIqTWF0aC5QSSwhMSksdC5zdHJva2UoKSx0aGlzLmRpc2FibGVTaGFkb3codCxlKX19LHtrZXk6XCJnZXREaXN0YW5jZVRvRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixyLGEsaCl7dmFyIGQ9MDtpZih0aGlzLmZyb20hPXRoaXMudG8pZD10aGlzLl9nZXREaXN0YW5jZVRvRWRnZSh0LGUsaSxvLG4scixhKTtlbHNle3ZhciBsPXRoaXMuX2dldENpcmNsZURhdGEodm9pZCAwKSx1PSgwLHMuZGVmYXVsdCkobCwzKSxjPXVbMF0scD11WzFdLGY9dVsyXSxtPWMtbix2PXAtcjtkPU1hdGguYWJzKE1hdGguc3FydChtKm0rdip2KS1mKX1yZXR1cm4gZH19LHtrZXk6XCJfZ2V0RGlzdGFuY2VUb0xpbmVcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dmFyIHI9aS10LGE9by1lLGg9cipyK2EqYSxkPSgobi10KSpyKyhzLWUpKmEpL2g7ZD4xP2Q9MTpkPDAmJihkPTApO3ZhciBsPXQrZCpyLHU9ZStkKmEsYz1sLW4scD11LXM7cmV0dXJuIE1hdGguc3FydChjKmMrcCpwKX19LHtrZXk6XCJnZXRBcnJvd0RhdGFcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scil7dmFyIGE9dm9pZCAwLGg9dm9pZCAwLGQ9dm9pZCAwLGw9dm9pZCAwLHU9dm9pZCAwLGM9dm9pZCAwLHA9dm9pZCAwLGY9ci53aWR0aDtpZihcImZyb21cIj09PWU/KGQ9dGhpcy5mcm9tLGw9dGhpcy50byx1PS4xLGM9ci5mcm9tQXJyb3dTY2FsZSxwPXIuZnJvbUFycm93VHlwZSk6XCJ0b1wiPT09ZT8oZD10aGlzLnRvLGw9dGhpcy5mcm9tLHU9LS4xLGM9ci50b0Fycm93U2NhbGUscD1yLnRvQXJyb3dUeXBlKTooZD10aGlzLnRvLGw9dGhpcy5mcm9tLGM9ci5taWRkbGVBcnJvd1NjYWxlLHA9ci5taWRkbGVBcnJvd1R5cGUpLGQhPWwpaWYoXCJtaWRkbGVcIiE9PWUpaWYoITA9PT10aGlzLm9wdGlvbnMuc21vb3RoLmVuYWJsZWQpe2g9dGhpcy5maW5kQm9yZGVyUG9zaXRpb24oZCx0LHt2aWE6aX0pO3ZhciBtPXRoaXMuZ2V0UG9pbnQoTWF0aC5tYXgoMCxNYXRoLm1pbigxLGgudCt1KSksaSk7YT1NYXRoLmF0YW4yKGgueS1tLnksaC54LW0ueCl9ZWxzZSBhPU1hdGguYXRhbjIoZC55LWwueSxkLngtbC54KSxoPXRoaXMuZmluZEJvcmRlclBvc2l0aW9uKGQsdCk7ZWxzZSBhPU1hdGguYXRhbjIoZC55LWwueSxkLngtbC54KSxoPXRoaXMuZ2V0UG9pbnQoLjUsaSk7ZWxzZXt2YXIgdj10aGlzLl9nZXRDaXJjbGVEYXRhKHQpLGc9KDAscy5kZWZh
21167dWx0KSh2LDMpLHk9Z1swXSxiPWdbMV0sXz1nWzJdO1wiZnJvbVwiPT09ZT8oaD10aGlzLmZpbmRCb3JkZXJQb3NpdGlvbih0aGlzLmZyb20sdCx7eDp5LHk6Yixsb3c6LjI1LGhpZ2g6LjYsZGlyZWN0aW9uOi0xfSksYT0tMipoLnQqTWF0aC5QSSsxLjUqTWF0aC5QSSsuMSpNYXRoLlBJKTpcInRvXCI9PT1lPyhoPXRoaXMuZmluZEJvcmRlclBvc2l0aW9uKHRoaXMuZnJvbSx0LHt4OnkseTpiLGxvdzouNixoaWdoOjEsZGlyZWN0aW9uOjF9KSxhPS0yKmgudCpNYXRoLlBJKzEuNSpNYXRoLlBJLTEuMSpNYXRoLlBJKTooaD10aGlzLl9wb2ludE9uQ2lyY2xlKHksYixfLC4xNzUpLGE9My45MjY5OTA4MTY5ODcyNDE0KX1cIm1pZGRsZVwiPT09ZSYmYzwwJiYoZio9LTEpO3ZhciB3PTE1KmMrMypmO3JldHVybntwb2ludDpoLGNvcmU6e3g6aC54LS45KncqTWF0aC5jb3MoYSkseTpoLnktLjkqdypNYXRoLnNpbihhKX0sYW5nbGU6YSxsZW5ndGg6dyx0eXBlOnB9fX0se2tleTpcImRyYXdBcnJvd0hlYWRcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3Quc3Ryb2tlU3R5bGU9dGhpcy5nZXRDb2xvcih0LGUsaSxvKSx0LmZpbGxTdHlsZT10LnN0cm9rZVN0eWxlLHQubGluZVdpZHRoPWUud2lkdGgsdS5kcmF3KHQsbiksdGhpcy5lbmFibGVTaGFkb3codCxlKSx0LmZpbGwoKSx0aGlzLmRpc2FibGVTaGFkb3codCxlKX19LHtrZXk6XCJlbmFibGVTaGFkb3dcIix2YWx1ZTpmdW5jdGlvbih0LGUpeyEwPT09ZS5zaGFkb3cmJih0LnNoYWRvd0NvbG9yPWUuc2hhZG93Q29sb3IsdC5zaGFkb3dCbHVyPWUuc2hhZG93U2l6ZSx0LnNoYWRvd09mZnNldFg9ZS5zaGFkb3dYLHQuc2hhZG93T2Zmc2V0WT1lLnNoYWRvd1kpfX0se2tleTpcImRpc2FibGVTaGFkb3dcIix2YWx1ZTpmdW5jdGlvbih0LGUpeyEwPT09ZS5zaGFkb3cmJih0LnNoYWRvd0NvbG9yPVwicmdiYSgwLDAsMCwwKVwiLHQuc2hhZG93Qmx1cj0wLHQuc2hhZG93T2Zmc2V0WD0wLHQuc2hhZG93T2Zmc2V0WT0wKX19XSksdH0oKTtlLmRlZmF1bHQ9Y30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSg0KSxhPW8ociksaD1pKDUpLGQ9byhoKSxsPWkoMCksdT1vKGwpLGM9aSgxKSxwPW8oYyksZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXsoMCx1LmRlZmF1bHQpKHRoaXMsdCl9cmV0dXJuKDAscC5kZWZhdWx0KSh0LG51bGwsW3trZXk6XCJ0cmFuc2Zvcm1cIix2YWx1ZTpmdW5jdGlvbih0LGUpe3QgaW5zdGFuY2VvZiBBcnJheXx8KHQ9W3RdKTtmb3IodmFyIGk9ZS5wb2ludC54LG89ZS5wb2ludC55LG49ZS5hbmdsZSxzPWUubGVuZ3RoLHI9MDtyPHQubGVuZ3RoOysrcil7dmFyIGE9dFtyXSxoPWEueCpNYXRoLmNvcyhuKS1hLnkqTWF0aC5zaW4obiksZD1hLngqTWF0aC5zaW4obikrYS55Kk1hdGguY29zKG4pO2EueD1pK3MqaCxhLnk9bytzKmR9fX0se2tleTpcImRyYXdQYXRoXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0LmJlZ2luUGF0aCgpLHQubW92ZVRvKGVbMF0ueCxlWzBdLnkpO2Zvcih2YXIgaT0xO2k8ZS5sZW5ndGg7KytpKXQubGluZVRvKGVbaV0ueCxlW2ldLnkpO3QuY2xvc2VQYXRoKCl9fV0pLHR9KCksbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuKDAsdS5kZWZhdWx0KSh0aGlzLGUpLCgwLGEuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9cmV0dXJuKDAsZC5kZWZhdWx0KShlLHQpLCgwLHAuZGVmYXVsdCkoZSxudWxsLFt7a2V5OlwiZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9W3t4OjAseTowfSx7eDotMSx5Oi4zfSx7eDotLjkseTowfSx7eDotMSx5Oi0uM31dO2YudHJhbnNmb3JtKGksZSksZi5kcmF3UGF0aCh0LGkpfX1dKSxlfShmKSx2PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpeygwLHUuZGVmYXVsdCkodGhpcyx0KX1yZXR1cm4oMCxwLmRlZmF1bHQpKHQsbnVsbCxbe2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXt4Oi0uNCx5OjB9O2YudHJhbnNmb3JtKGksZSksdC5jaXJjbGUoaS54LGkueSwuNCplLmxlbmd0aCl9fV0pLHR9KCksZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXsoMCx1LmRlZmF1bHQpKHRoaXMsdCl9cmV0dXJuKDAscC5kZWZhdWx0KSh0LG51bGwsW3trZXk6XCJkcmF3XCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1be3g6MCx5Oi41fSx7eDowLHk6LS41fSx7eDotLjE1LHk6LS41fSx7eDotLjE1LHk6LjV9XTtmLnRyYW5zZm9ybShpLGUpLGYuZHJhd1BhdGgodCxpKX19XSksdH0oKSx5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpeygwLHUuZGVmYXVsdCkodGhpcyx0KX1yZXR1cm4oMCxwLmRlZmF1bHQpKHQsbnVsbCxbe2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpO3N3aXRjaC
21167hlLnR5cGUmJihpPWUudHlwZS50b0xvd2VyQ2FzZSgpKSxpKXtjYXNlXCJjaXJjbGVcIjp2LmRyYXcodCxlKTticmVhaztjYXNlXCJiYXJcIjpnLmRyYXcodCxlKTticmVhaztjYXNlXCJhcnJvd1wiOmRlZmF1bHQ6bS5kcmF3KHQsZSl9fX1dKSx0fSgpO2UuZGVmYXVsdD15fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgwKSxzPW8obikscj1pKDEpLGE9byhyKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMucGh5c2ljc0JvZHk9aSx0aGlzLmJhcm5lc0h1dFRyZWUsdGhpcy5zZXRPcHRpb25zKG8pLHRoaXMucmFuZG9tU2VlZD01fXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dCx0aGlzLnRoZXRhSW52ZXJzZWQ9MS90aGlzLm9wdGlvbnMudGhldGEsdGhpcy5vdmVybGFwQXZvaWRhbmNlRmFjdG9yPTEtTWF0aC5tYXgoMCxNYXRoLm1pbigxLHRoaXMub3B0aW9ucy5hdm9pZE92ZXJsYXApKX19LHtrZXk6XCJzZWVkZWRSYW5kb21cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PTFlNCpNYXRoLnNpbih0aGlzLnJhbmRvbVNlZWQrKyk7cmV0dXJuIHQtTWF0aC5mbG9vcih0KX19LHtrZXk6XCJzb2x2ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMub3B0aW9ucy5ncmF2aXRhdGlvbmFsQ29uc3RhbnQmJnRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLmxlbmd0aD4wKXt2YXIgdD12b2lkIDAsZT10aGlzLmJvZHkubm9kZXMsaT10aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlcyxvPWkubGVuZ3RoLG49dGhpcy5fZm9ybUJhcm5lc0h1dFRyZWUoZSxpKTt0aGlzLmJhcm5lc0h1dFRyZWU9bjtmb3IodmFyIHM9MDtzPG87cysrKXQ9ZVtpW3NdXSx0Lm9wdGlvbnMubWFzcz4wJiZ0aGlzLl9nZXRGb3JjZUNvbnRyaWJ1dGlvbnMobi5yb290LHQpfX19LHtrZXk6XCJfZ2V0Rm9yY2VDb250cmlidXRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLl9nZXRGb3JjZUNvbnRyaWJ1dGlvbih0LmNoaWxkcmVuLk5XLGUpLHRoaXMuX2dldEZvcmNlQ29udHJpYnV0aW9uKHQuY2hpbGRyZW4uTkUsZSksdGhpcy5fZ2V0Rm9yY2VDb250cmlidXRpb24odC5jaGlsZHJlbi5TVyxlKSx0aGlzLl9nZXRGb3JjZUNvbnRyaWJ1dGlvbih0LmNoaWxkcmVuLlNFLGUpfX0se2tleTpcIl9nZXRGb3JjZUNvbnRyaWJ1dGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodC5jaGlsZHJlbkNvdW50PjApe3ZhciBpPXZvaWQgMCxvPXZvaWQgMCxuPXZvaWQgMDtpPXQuY2VudGVyT2ZNYXNzLngtZS54LG89dC5jZW50ZXJPZk1hc3MueS1lLnksbj1NYXRoLnNxcnQoaSppK28qbyksbip0LmNhbGNTaXplPnRoaXMudGhldGFJbnZlcnNlZD90aGlzLl9jYWxjdWxhdGVGb3JjZXMobixpLG8sZSx0KTo0PT09dC5jaGlsZHJlbkNvdW50P3RoaXMuX2dldEZvcmNlQ29udHJpYnV0aW9ucyh0LGUpOnQuY2hpbGRyZW4uZGF0YS5pZCE9ZS5pZCYmdGhpcy5fY2FsY3VsYXRlRm9yY2VzKG4saSxvLGUsdCl9fX0se2tleTpcIl9jYWxjdWxhdGVGb3JjZXNcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pezA9PT10JiYodD0uMSxlPXQpLHRoaXMub3ZlcmxhcEF2b2lkYW5jZUZhY3RvcjwxJiZvLnNoYXBlLnJhZGl1cyYmKHQ9TWF0aC5tYXgoLjErdGhpcy5vdmVybGFwQXZvaWRhbmNlRmFjdG9yKm8uc2hhcGUucmFkaXVzLHQtby5zaGFwZS5yYWRpdXMpKTt2YXIgcz10aGlzLm9wdGlvbnMuZ3Jhdml0YXRpb25hbENvbnN0YW50Km4ubWFzcypvLm9wdGlvbnMubWFzcy9NYXRoLnBvdyh0LDMpLHI9ZSpzLGE9aSpzO3RoaXMucGh5c2ljc0JvZHkuZm9yY2VzW28uaWRdLngrPXIsdGhpcy5waHlzaWNzQm9keS5mb3JjZXNbby5pZF0ueSs9YX19LHtrZXk6XCJfZm9ybUJhcm5lc0h1dFRyZWVcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT12b2lkIDAsbz1lLmxlbmd0aCxuPXRbZVswXV0ueCxzPXRbZVswXV0ueSxyPXRbZVswXV0ueCxhPXRbZVswXV0ueSxoPTE7aDxvO2grKyl7dmFyIGQ9dFtlW2hdXSxsPWQueCx1PWQueTtkLm9wdGlvbnMubWFzcz4wJiYobDxuJiYobj1sKSxsPnImJihyPWwpLHU8cyYmKHM9dSksdT5hJiYoYT11KSl9dmFyIGM9TWF0aC5hYnMoci1uKS1NYXRoLmFicyhhLXMpO2M+MD8ocy09LjUqYyxhKz0uNSpjKToobis9LjUqYyxyLT0uNSpjKTt2YXIgcD1NYXRoLm1heCgxZS01LE1hdGguYWJzKHItbikpLGY9LjUqcCxtPS41KihuK3IpLHY9LjUqKHMrYSksZz17cm9vdDp7Y2VudGVyT2ZNYXNzOnt4OjAseTowfSxtYXNzOjAscmFuZ2U6e21pblg6bS1mLG1heFg6bStmLG1pblk6di1mLG1heFk6ditmfSxzaXplOnAsY2FsY1NpemU6MS9wLGNoaWxkcmVuOntkYXRhOm51bGx9LG1heFdpZHRoOjAsbGV2ZWw6MCxjaGlsZHJlbkNvdW50OjR9fTt0aGlzLl9zcGxpdEJyYW5jaChnLnJvb3QpO2Zvcih2YXIgeT0wO3k8bzt5KyspaT10W2VbeV1dLGkub3B0aW9ucy5tYXNzPjAmJnRoaXMuX3BsYWNlSW5UcmVlKGcucm9vdCxpKTtyZXR1cm4gZ319LHtrZXk6XCJfdXBkYXRlQnJhbmNoTWFzc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5jZW50ZXJPZk1hc3Msbz10Lm1hc3MrZS5vcHRpb25zLm1hc3Msbj0xL287aS54PWkueCp0Lm1hc3MrZS54KmUub3B0aW9ucy5tYXNzLGkueCo9bixpLnk9aS55KnQubWFzcytlLnkqZS5vcHRpb25zLm1hc3MsaS55Kj1uLHQubWFzcz1vO3ZhciBzPU1hdGgubWF4KE1hdGgubWF4KGUuaGVpZ2h0LGUucmFkaXVzKSxlLndpZHRoKTt0Lm1heFdpZHRoPXQubWF4V2lkdGg8cz9zOnQubWF4V2lkdGh9fSx7a2V5OlwiX3BsYWNlSW5UcmVlXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpezE9PWkmJnZvaWQgMCE9PWl8fHRoaXMuX3VwZGF0ZUJyYW5jaE1hc3ModCxlKTt2YXIgbz10LmNoaWxkcmVuLk5XLnJhbmdlLG49dm9pZCAwO249by5tYXhYPmUueD9vLm1heFk+ZS55P1wiTldcIjpcIlNXXCI6by5tY
21167XhZPmUueT9cIk5FXCI6XCJTRVwiLHRoaXMuX3BsYWNlSW5SZWdpb24odCxlLG4pfX0se2tleTpcIl9wbGFjZUluUmVnaW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPXQuY2hpbGRyZW5baV07c3dpdGNoKG8uY2hpbGRyZW5Db3VudCl7Y2FzZSAwOm8uY2hpbGRyZW4uZGF0YT1lLG8uY2hpbGRyZW5Db3VudD0xLHRoaXMuX3VwZGF0ZUJyYW5jaE1hc3MobyxlKTticmVhaztjYXNlIDE6by5jaGlsZHJlbi5kYXRhLng9PT1lLngmJm8uY2hpbGRyZW4uZGF0YS55PT09ZS55PyhlLngrPXRoaXMuc2VlZGVkUmFuZG9tKCksZS55Kz10aGlzLnNlZWRlZFJhbmRvbSgpKToodGhpcy5fc3BsaXRCcmFuY2gobyksdGhpcy5fcGxhY2VJblRyZWUobyxlKSk7YnJlYWs7Y2FzZSA0OnRoaXMuX3BsYWNlSW5UcmVlKG8sZSl9fX0se2tleTpcIl9zcGxpdEJyYW5jaFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPW51bGw7MT09PXQuY2hpbGRyZW5Db3VudCYmKGU9dC5jaGlsZHJlbi5kYXRhLHQubWFzcz0wLHQuY2VudGVyT2ZNYXNzLng9MCx0LmNlbnRlck9mTWFzcy55PTApLHQuY2hpbGRyZW5Db3VudD00LHQuY2hpbGRyZW4uZGF0YT1udWxsLHRoaXMuX2luc2VydFJlZ2lvbih0LFwiTldcIiksdGhpcy5faW5zZXJ0UmVnaW9uKHQsXCJORVwiKSx0aGlzLl9pbnNlcnRSZWdpb24odCxcIlNXXCIpLHRoaXMuX2luc2VydFJlZ2lvbih0LFwiU0VcIiksbnVsbCE9ZSYmdGhpcy5fcGxhY2VJblRyZWUodCxlKX19LHtrZXk6XCJfaW5zZXJ0UmVnaW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT12b2lkIDAsbz12b2lkIDAsbj12b2lkIDAscz12b2lkIDAscj0uNSp0LnNpemU7c3dpdGNoKGUpe2Nhc2VcIk5XXCI6aT10LnJhbmdlLm1pblgsbz10LnJhbmdlLm1pblgrcixuPXQucmFuZ2UubWluWSxzPXQucmFuZ2UubWluWStyO2JyZWFrO2Nhc2VcIk5FXCI6aT10LnJhbmdlLm1pblgrcixvPXQucmFuZ2UubWF4WCxuPXQucmFuZ2UubWluWSxzPXQucmFuZ2UubWluWStyO2JyZWFrO2Nhc2VcIlNXXCI6aT10LnJhbmdlLm1pblgsbz10LnJhbmdlLm1pblgrcixuPXQucmFuZ2UubWluWStyLHM9dC5yYW5nZS5tYXhZO2JyZWFrO2Nhc2VcIlNFXCI6aT10LnJhbmdlLm1pblgrcixvPXQucmFuZ2UubWF4WCxuPXQucmFuZ2UubWluWStyLHM9dC5yYW5nZS5tYXhZfXQuY2hpbGRyZW5bZV09e2NlbnRlck9mTWFzczp7eDowLHk6MH0sbWFzczowLHJhbmdlOnttaW5YOmksbWF4WDpvLG1pblk6bixtYXhZOnN9LHNpemU6LjUqdC5zaXplLGNhbGNTaXplOjIqdC5jYWxjU2l6ZSxjaGlsZHJlbjp7ZGF0YTpudWxsfSxtYXhXaWR0aDowLGxldmVsOnQubGV2ZWwrMSxjaGlsZHJlbkNvdW50OjB9fX0se2tleTpcIl9kZWJ1Z1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dm9pZCAwIT09dGhpcy5iYXJuZXNIdXRUcmVlJiYodC5saW5lV2lkdGg9MSx0aGlzLl9kcmF3QnJhbmNoKHRoaXMuYmFybmVzSHV0VHJlZS5yb290LHQsZSkpfX0se2tleTpcIl9kcmF3QnJhbmNoXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZvaWQgMD09PWkmJihpPVwiI0ZGMDAwMFwiKSw0PT09dC5jaGlsZHJlbkNvdW50JiYodGhpcy5fZHJhd0JyYW5jaCh0LmNoaWxkcmVuLk5XLGUpLHRoaXMuX2RyYXdCcmFuY2godC5jaGlsZHJlbi5ORSxlKSx0aGlzLl9kcmF3QnJhbmNoKHQuY2hpbGRyZW4uU0UsZSksdGhpcy5fZHJhd0JyYW5jaCh0LmNoaWxkcmVuLlNXLGUpKSxlLnN0cm9rZVN0eWxlPWksZS5iZWdpblBhdGgoKSxlLm1vdmVUbyh0LnJhbmdlLm1pblgsdC5yYW5nZS5taW5ZKSxlLmxpbmVUbyh0LnJhbmdlLm1heFgsdC5yYW5nZS5taW5ZKSxlLnN0cm9rZSgpLGUuYmVnaW5QYXRoKCksZS5tb3ZlVG8odC5yYW5nZS5tYXhYLHQucmFuZ2UubWluWSksZS5saW5lVG8odC5yYW5nZS5tYXhYLHQucmFuZ2UubWF4WSksZS5zdHJva2UoKSxlLmJlZ2luUGF0aCgpLGUubW92ZVRvKHQucmFuZ2UubWF4WCx0LnJhbmdlLm1heFkpLGUubGluZVRvKHQucmFuZ2UubWluWCx0LnJhbmdlLm1heFkpLGUuc3Ryb2tlKCksZS5iZWdpblBhdGgoKSxlLm1vdmVUbyh0LnJhbmdlLm1pblgsdC5yYW5nZS5tYXhZKSxlLmxpbmVUbyh0LnJhbmdlLm1pblgsdC5yYW5nZS5taW5ZKSxlLnN0cm9rZSgpfX1dKSx0fSgpO2UuZGVmYXVsdD1ofSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgwKSxzPW8obikscj1pKDEpLGE9byhyKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMucGh5c2ljc0JvZHk9aSx0aGlzLnNldE9wdGlvbnMobyl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10fX0se2tleTpcInNvbHZlXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dm9pZCAwLGU9dm9pZCAwLGk9dm9pZCAwLG89dm9pZCAwLG49dGhpcy5ib2R5Lm5vZGVzLHM9dGhpcy5waHlzaWNzQm9keS5waHlzaWNzTm9kZUluZGljZXMscj10aGlzLnBoeXNpY3NCb2R5LmZvcmNlcyxhPTA7YTxzLmxlbmd0aDthKyspe289bltzW2FdXSx0PS1vLngsZT0tby55LGk9TWF0aC5zcXJ0KHQqdCtlKmUpLHRoaXMuX2NhbGN1bGF0ZUZvcmNlcyhpLHQsZSxyLG8pfX19LHtrZXk6XCJfY2FsY3VsYXRlRm9yY2VzXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt2YXIgcz0wPT09dD8wOnRoaXMub3B0aW9ucy5jZW50cmFsR3Jhdml0eS90O29bbi5pZF0ueD1lKnMsb1tuLmlkXS55PWkqc319XSksdH0oKTtlLmRlZmF1bHQ9aH0sZnVuY3Rpb24odCxlLGkpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBvPVwic3RyaW5nXCIsbj1cImJvb2xlYW5cIixzPVwibnVtYmVyXCIscj1cIm9iamVjdFwiLGE9W1wiYXJyb3dcIixcImNpcmNsZVwiLFwiYmFyXCJdLGg9e2NvbmZpZ3VyZTp7ZW5hYmxlZDp7Ym9vbGVhbjpufSxmaWx0ZXI6e2Jvb2xlYW46bixzdHJpbmc6byxhcnJheTpcImFycmF5XCIsZnVuY3Rpb246XCJmdW5jdGlvblwifSxjb250YWluZXI6e2RvbTpcImRvbVwifSxzaG93QnV0dG9uOntib29sZWFuOm59LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm4sc3RyaW5nOm8sYXJyYXk6XCJhcnJheVwiLGZ1bmN0aW9uOlwiZnVuY3Rpb25cIn19LGVkZ2VzOnthcnJvd3M6e3RvOntlbmFibGVkOntib29sZWFuOm59LHNjYWxlRmFjdG9yOntudW1iZXI6c30sdHlwZTp7c3RyaW5nOmF9LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm59fSxtaWRkbGU6e2VuYWJsZWQ6e2Jvb2xlYW46bn0sc2NhbGVGYWN0b3I6e251bWJlcjpzfSx0eXBlOntzdHJpbmc6YX0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bn19LGZyb206e2VuYWJsZWQ6e2Jvb2xlYW46bn0sc2NhbGVGYWN0b3I6e251bWJlcjpzfSx0eXBlOntzdHJpbmc6YX0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bn19LF9fdHlwZV9fOntzdHJpbmc6W1wiZnJvbVwiLFwidG9cIixcIm1pZGRsZVwiXSxvYmplY3Q6cn19LGFycm93U3RyaWtldGhyb3VnaDp7Ym9vbGVhbjpufSxjaG9zZW46e2xhYmVsOntib29sZWFuOm4sZnVuY3Rpb246XCJmdW5jdGlvblwifSxlZGdlOntib29sZWFuOm4sZnVuY3Rpb246XCJmdW5jdGlvblwifSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpufX0sY29sb3I6e2NvbG9yOntzdHJpbmc6b30saGlnaGxpZ2h0OntzdHJpbmc6b30saG92ZXI6e3N0cmluZzpvfSxpbmhlcml0OntzdHJpbmc6W1wiZnJvbVwiLFwidG9cIixcImJvdGhcIl0sYm9vbGVhbjpufSxvcGFjaXR5OntudW1iZXI6c30sX190eXBlX186e29iamVjdDpyLHN0cmluZzpvfX0sZGFzaGVzOntib29sZWFuOm4sYXJyYXk6XCJhcnJheVwifSxmb250Ontjb2xvcjp7c3RyaW5nOm99LHNpemU6e251bWJlcjpzfSxmYWNlOntzdHJpbmc6b30sYmFja2dyb3VuZDp7c3RyaW5nOm99LHN0cm9rZVdpZHRoOntudW1iZXI6c30sc3Ryb2tlQ29sb3I6e3N0cmluZzpvfSxhbGlnbjp7c3RyaW5nOltcImhvcml6b250YWxcIixcInRvcFwiLFwibWlkZGxlXCIsXCJib3R0b21cIl19LHZhZGp1c3Q6e251bWJlcjpzfSxtdWx0aTp7Ym9vbGVhbjpuLHN0cmluZzpvfSxib2xkOntjb2xvcjp7c3RyaW5nOm99LHNpemU6e251bWJlcjpzfSxmYWNlOntzdHJpbmc6b30sbW9kOntzdHJpbmc6b30sdmFkanVzdDp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cixzdHJpbmc6b319LGJvbGRpdGFsOntjb2xvcjp7c3RyaW5nOm99LHNpemU6e251bWJlcjpzfSxmYWNlOntzdHJpbmc6b30sbW9kOntzdHJpbmc6b30sdmFkanVzdDp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cixzdHJpbmc6b319LGl0YWw6e2NvbG9yOntzdHJpbmc6b30sc2l6ZTp7bnVtYmVyOnN9LGZhY2U6e3N0cmluZzpvfSxtb2Q6e3N0cmluZzpvfSx2YWRqdXN0OntudW1iZXI6c30sX190eXBlX186e29iamVjdDpyLHN0cmluZzpvfX0sbW9ubzp7Y29sb3I6e3N0cmluZzpvfSxzaXplOntudW1iZXI6c30sZmFjZTp7c3RyaW5nOm99LG1vZDp7c3RyaW5nOm99LHZhZGp1c3Q6e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnIsc3RyaW5nOm99fSxfX3R5cGVfXzp7b2JqZWN0OnIsc3RyaW5nOm99fSxoaWRkZW46e2Jvb2xlYW46bn0saG92ZXJXaWR0aDp7ZnVuY3Rpb246XCJmdW5jdGlvblwiLG51bWJlcjpzfSxsYWJlbDp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LGxhYmVsSGlnaGxpZ2h0Qm9sZDp7Ym9vbGVhbjpufSxsZW5ndGg6e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxwaHlzaWNzOntib29sZWFuOm59LHNjYWxpbmc6e21pbjp7bnVtYmVyOnN9LG1heDp7bnVtYmVyOnN9LGxhYmVsOntlbmFibGVkOntib29sZWFuOm59LG1pbjp7bnVtYmVyOnN9LG1heDp7bnVtYmVyOnN9LG1heFZpc2libGU6e251bWJlcjpzfSxkcmF3VGhyZXNob2xkOntudW1iZXI6c30sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bn19LGN1c3RvbVNjYWxpbmdGdW5jdGlvbjp7ZnVuY3Rpb246XCJmdW5jdGlvblwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxzZWxlY3Rpb25XaWR0aDp7ZnVuY3Rpb246XCJmdW5jdGlvblwiLG51bWJlcjpzfSxzZWxmUmVmZXJlbmNlU2l6ZTp7bnVtYmVyOnN9LHNoYWRvdzp7ZW5hYmxlZDp7Ym9vbGVhbjpufSxjb2xvcjp7c3RyaW5nOm99LHNpemU6e251bWJlcjpzfSx4OntudW1iZXI6c30seTp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm59fSxzbW9vdGg6e2VuYWJsZWQ6e2Jvb2xlYW46bn0sdHlwZTp7c3RyaW5nOltcImR5bmFtaWNcIixcImNvbnRpbnVvdXNcIixcImRpc2NyZXRlXCIsXCJkaWFnb25hbENyb3NzXCIsXCJzdHJhaWdodENyb3NzXCIsXCJob3Jpem9udGFsXCIsXCJ2ZXJ0aWNhbFwiLFwiY3VydmVkQ1dcIixcImN1cnZlZENDV1wiLFwiY3ViaWNCZXppZXJcIl19LHJvdW5kbmVzczp7bnVtYmVyOnN9LGZvcmNlRGlyZWN0aW9uOntzdHJpbmc6W1wiaG9yaXpvbn
21167RhbFwiLFwidmVydGljYWxcIixcIm5vbmVcIl0sYm9vbGVhbjpufSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpufX0sdGl0bGU6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx3aWR0aDp7bnVtYmVyOnN9LHdpZHRoQ29uc3RyYWludDp7bWF4aW11bTp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm4sbnVtYmVyOnN9fSx2YWx1ZTp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntvYmplY3Q6cn19LGdyb3Vwczp7dXNlRGVmYXVsdEdyb3Vwczp7Ym9vbGVhbjpufSxfX2FueV9fOlwiZ2V0IGZyb20gbm9kZXMsIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYmVsb3dcIixfX3R5cGVfXzp7b2JqZWN0OnJ9fSxpbnRlcmFjdGlvbjp7ZHJhZ05vZGVzOntib29sZWFuOm59LGRyYWdWaWV3Ontib29sZWFuOm59LGhpZGVFZGdlc09uRHJhZzp7Ym9vbGVhbjpufSxoaWRlTm9kZXNPbkRyYWc6e2Jvb2xlYW46bn0saG92ZXI6e2Jvb2xlYW46bn0sa2V5Ym9hcmQ6e2VuYWJsZWQ6e2Jvb2xlYW46bn0sc3BlZWQ6e3g6e251bWJlcjpzfSx5OntudW1iZXI6c30sem9vbTp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cn19LGJpbmRUb1dpbmRvdzp7Ym9vbGVhbjpufSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpufX0sbXVsdGlzZWxlY3Q6e2Jvb2xlYW46bn0sbmF2aWdhdGlvbkJ1dHRvbnM6e2Jvb2xlYW46bn0sc2VsZWN0YWJsZTp7Ym9vbGVhbjpufSxzZWxlY3RDb25uZWN0ZWRFZGdlczp7Ym9vbGVhbjpufSxob3ZlckNvbm5lY3RlZEVkZ2VzOntib29sZWFuOm59LHRvb2x0aXBEZWxheTp7bnVtYmVyOnN9LHpvb21WaWV3Ontib29sZWFuOm59LF9fdHlwZV9fOntvYmplY3Q6cn19LGxheW91dDp7cmFuZG9tU2VlZDp7dW5kZWZpbmVkOlwidW5kZWZpbmVkXCIsbnVtYmVyOnN9LGltcHJvdmVkTGF5b3V0Ontib29sZWFuOm59LGhpZXJhcmNoaWNhbDp7ZW5hYmxlZDp7Ym9vbGVhbjpufSxsZXZlbFNlcGFyYXRpb246e251bWJlcjpzfSxub2RlU3BhY2luZzp7bnVtYmVyOnN9LHRyZWVTcGFjaW5nOntudW1iZXI6c30sYmxvY2tTaGlmdGluZzp7Ym9vbGVhbjpufSxlZGdlTWluaW1pemF0aW9uOntib29sZWFuOm59LHBhcmVudENlbnRyYWxpemF0aW9uOntib29sZWFuOm59LGRpcmVjdGlvbjp7c3RyaW5nOltcIlVEXCIsXCJEVVwiLFwiTFJcIixcIlJMXCJdfSxzb3J0TWV0aG9kOntzdHJpbmc6W1wiaHVic2l6ZVwiLFwiZGlyZWN0ZWRcIl19LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm59fSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxtYW5pcHVsYXRpb246e2VuYWJsZWQ6e2Jvb2xlYW46bn0saW5pdGlhbGx5QWN0aXZlOntib29sZWFuOm59LGFkZE5vZGU6e2Jvb2xlYW46bixmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LGFkZEVkZ2U6e2Jvb2xlYW46bixmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LGVkaXROb2RlOntmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LGVkaXRFZGdlOntlZGl0V2l0aG91dERyYWc6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bixmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9fSxkZWxldGVOb2RlOntib29sZWFuOm4sZnVuY3Rpb246XCJmdW5jdGlvblwifSxkZWxldGVFZGdlOntib29sZWFuOm4sZnVuY3Rpb246XCJmdW5jdGlvblwifSxjb250cm9sTm9kZVN0eWxlOlwiZ2V0IGZyb20gbm9kZXMsIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYmVsb3dcIixfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpufX0sbm9kZXM6e2JvcmRlcldpZHRoOntudW1iZXI6c30sYm9yZGVyV2lkdGhTZWxlY3RlZDp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LGJyb2tlbkltYWdlOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sY2hvc2VuOntsYWJlbDp7Ym9vbGVhbjpuLGZ1bmN0aW9uOlwiZnVuY3Rpb25cIn0sbm9kZTp7Ym9vbGVhbjpuLGZ1bmN0aW9uOlwiZnVuY3Rpb25cIn0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bn19LGNvbG9yOntib3JkZXI6e3N0cmluZzpvfSxiYWNrZ3JvdW5kOntzdHJpbmc6b30saGlnaGxpZ2h0Ontib3JkZXI6e3N0cmluZzpvfSxiYWNrZ3JvdW5kOntzdHJpbmc6b30sX190eXBlX186e29iamVjdDpyLHN0cmluZzpvfX0saG92ZXI6e2JvcmRlcjp7c3RyaW5nOm99LGJhY2tncm91bmQ6e3N0cmluZzpvfSxfX3R5cGVfXzp7b2JqZWN0OnIsc3RyaW5nOm99fSxfX3R5cGVfXzp7b2JqZWN0OnIsc3RyaW5nOm99fSxmaXhlZDp7eDp7Ym9vbGVhbjpufSx5Ontib29sZWFuOm59LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm59fSxmb250OnthbGlnbjp7c3RyaW5nOm99LGNvbG9yOntzdHJpbmc6b30sc2l6ZTp7bnVtYmVyOnN9LGZhY2U6e3N0cmluZzpvfSxiYWNrZ3JvdW5kOntzdHJpbmc6b30sc3Ryb2tlV2lkdGg6e251bWJlcjpzfSxzdHJva2VDb2xvcjp7c3RyaW5nOm99LHZhZGp1c3Q6e251bWJlcjpzfSxtdWx0aTp7Ym9vbGVhbjpuLHN0cmluZzpvfSxib2xkOntjb2xvcjp7c3RyaW5nOm99LHNpemU6e251bWJlcjpzfSxmYWNlOntzdHJpbmc6b30sbW9kOntzdHJpbmc6b30sdmFkanVzdDp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cixzdHJpbmc6b319LGJvbGRpdGFsOntjb2xvcjp7c3RyaW5nOm99LHNpemU6e251bWJlcjpzfSxmYWNlOntzdHJpbmc6b30sbW9kOntzdHJpbmc6b30sdmFkanVzdDp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cixzdHJpbmc6b319LGl0YWw6e2NvbG9yOntzdHJpbmc6b30sc2l6ZTp7bnVtYmVyOnN9LGZhY2U6e3N0cmluZzpvfSxtb2Q6e3N0cmluZzpvfSx2YWRqdXN0OntudW1iZXI6c30sX190eXBlX186e29iamVjdDpyLHN0cmluZzpvfX0sbW9ubzp7Y29sb3I6e3N0cmluZzpvfSxzaXplOntudW1iZXI6c30sZmFjZTp7c3RyaW5nOm99LG1vZDp7c3RyaW5nOm99LHZhZGp1c3Q6e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnIsc3RyaW5nOm99fSxfX3R5cGVfXzp7b2JqZWN0OnIsc3RyaW5nOm99fSxncm91cDp7c3RyaW5nOm8sbnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LGhlaWdodENvbnN0cmFpbnQ6e21pbmltdW06e251bWJlcjpzfSx2YWxpZ246e3N0cmluZzpvfSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpuLG51bWJlcjpzfX0saGlkZGVuOntib29sZWFuOm59LGljb246e2ZhY2U6e3N0cmluZzpvfSxjb2RlOntzdHJpbmc6b30sc2l6ZTp7bnVtYmVyOnN9LGNvbG9yOntzdHJpbmc6b30sX190eXBlX186e29iamVjdDpyfX0saWQ6e3N0cmluZzpvLG51bWJlcjpzfSxpbWFnZTp7c2VsZWN0ZWQ6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx1bnNlbGVjdGVkOntzd
21167HJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sX190eXBlX186e29iamVjdDpyLHN0cmluZzpvfX0sbGFiZWw6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxsYWJlbEhpZ2hsaWdodEJvbGQ6e2Jvb2xlYW46bn0sbGV2ZWw6e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxtYXJnaW46e3RvcDp7bnVtYmVyOnN9LHJpZ2h0OntudW1iZXI6c30sYm90dG9tOntudW1iZXI6c30sbGVmdDp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cixudW1iZXI6c319LG1hc3M6e251bWJlcjpzfSxwaHlzaWNzOntib29sZWFuOm59LHNjYWxpbmc6e21pbjp7bnVtYmVyOnN9LG1heDp7bnVtYmVyOnN9LGxhYmVsOntlbmFibGVkOntib29sZWFuOm59LG1pbjp7bnVtYmVyOnN9LG1heDp7bnVtYmVyOnN9LG1heFZpc2libGU6e251bWJlcjpzfSxkcmF3VGhyZXNob2xkOntudW1iZXI6c30sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bn19LGN1c3RvbVNjYWxpbmdGdW5jdGlvbjp7ZnVuY3Rpb246XCJmdW5jdGlvblwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxzaGFkb3c6e2VuYWJsZWQ6e2Jvb2xlYW46bn0sY29sb3I6e3N0cmluZzpvfSxzaXplOntudW1iZXI6c30seDp7bnVtYmVyOnN9LHk6e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpufX0sc2hhcGU6e3N0cmluZzpbXCJlbGxpcHNlXCIsXCJjaXJjbGVcIixcImRhdGFiYXNlXCIsXCJib3hcIixcInRleHRcIixcImltYWdlXCIsXCJjaXJjdWxhckltYWdlXCIsXCJkaWFtb25kXCIsXCJkb3RcIixcInN0YXJcIixcInRyaWFuZ2xlXCIsXCJ0cmlhbmdsZURvd25cIixcInNxdWFyZVwiLFwiaWNvblwiLFwiaGV4YWdvblwiXX0sc2hhcGVQcm9wZXJ0aWVzOntib3JkZXJEYXNoZXM6e2Jvb2xlYW46bixhcnJheTpcImFycmF5XCJ9LGJvcmRlclJhZGl1czp7bnVtYmVyOnN9LGludGVycG9sYXRpb246e2Jvb2xlYW46bn0sdXNlSW1hZ2VTaXplOntib29sZWFuOm59LHVzZUJvcmRlcldpdGhJbWFnZTp7Ym9vbGVhbjpufSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxzaXplOntudW1iZXI6c30sdGl0bGU6e3N0cmluZzpvLGRvbTpcImRvbVwiLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx2YWx1ZTp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHdpZHRoQ29uc3RyYWludDp7bWluaW11bTp7bnVtYmVyOnN9LG1heGltdW06e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpuLG51bWJlcjpzfX0seDp7bnVtYmVyOnN9LHk6e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxwaHlzaWNzOntlbmFibGVkOntib29sZWFuOm59LGJhcm5lc0h1dDp7Z3Jhdml0YXRpb25hbENvbnN0YW50OntudW1iZXI6c30sY2VudHJhbEdyYXZpdHk6e251bWJlcjpzfSxzcHJpbmdMZW5ndGg6e251bWJlcjpzfSxzcHJpbmdDb25zdGFudDp7bnVtYmVyOnN9LGRhbXBpbmc6e251bWJlcjpzfSxhdm9pZE92ZXJsYXA6e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxmb3JjZUF0bGFzMkJhc2VkOntncmF2aXRhdGlvbmFsQ29uc3RhbnQ6e251bWJlcjpzfSxjZW50cmFsR3Jhdml0eTp7bnVtYmVyOnN9LHNwcmluZ0xlbmd0aDp7bnVtYmVyOnN9LHNwcmluZ0NvbnN0YW50OntudW1iZXI6c30sZGFtcGluZzp7bnVtYmVyOnN9LGF2b2lkT3ZlcmxhcDp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cn19LHJlcHVsc2lvbjp7Y2VudHJhbEdyYXZpdHk6e251bWJlcjpzfSxzcHJpbmdMZW5ndGg6e251bWJlcjpzfSxzcHJpbmdDb25zdGFudDp7bnVtYmVyOnN9LG5vZGVEaXN0YW5jZTp7bnVtYmVyOnN9LGRhbXBpbmc6e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxoaWVyYXJjaGljYWxSZXB1bHNpb246e2NlbnRyYWxHcmF2aXR5OntudW1iZXI6c30sc3ByaW5nTGVuZ3RoOntudW1iZXI6c30sc3ByaW5nQ29uc3RhbnQ6e251bWJlcjpzfSxub2RlRGlzdGFuY2U6e251bWJlcjpzfSxkYW1waW5nOntudW1iZXI6c30sX190eXBlX186e29iamVjdDpyfX0sbWF4VmVsb2NpdHk6e251bWJlcjpzfSxtaW5WZWxvY2l0eTp7bnVtYmVyOnN9LHNvbHZlcjp7c3RyaW5nOltcImJhcm5lc0h1dFwiLFwicmVwdWxzaW9uXCIsXCJoaWVyYXJjaGljYWxSZXB1bHNpb25cIixcImZvcmNlQXRsYXMyQmFzZWRcIl19LHN0YWJpbGl6YXRpb246e2VuYWJsZWQ6e2Jvb2xlYW46bn0saXRlcmF0aW9uczp7bnVtYmVyOnN9LHVwZGF0ZUludGVydmFsOntudW1iZXI6c30sb25seUR5bmFtaWNFZGdlczp7Ym9vbGVhbjpufSxmaXQ6e2Jvb2xlYW46bn0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bn19LHRpbWVzdGVwOntudW1iZXI6c30sYWRhcHRpdmVUaW1lc3RlcDp7Ym9vbGVhbjpufSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpufX0sYXV0b1Jlc2l6ZTp7Ym9vbGVhbjpufSxjbGlja1RvVXNlOntib29sZWFuOm59LGxvY2FsZTp7c3RyaW5nOm99LGxvY2FsZXM6e19fYW55X186e2FueTpcImFueVwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxoZWlnaHQ6e3N0cmluZzpvfSx3aWR0aDp7c3RyaW5nOm99LF9fdHlwZV9fOntvYmplY3Q6cn19O2guZ3JvdXBzLl9fYW55X189aC5ub2RlcyxoLm1hbmlwdWxhdGlvbi5jb250cm9sTm9kZVN0eWxlPWgubm9kZXM7dmFyIGQ9e25vZGVzOntib3JkZXJXaWR0aDpbMSwwLDEwLDFdLGJvcmRlcldpZHRoU2VsZWN0ZWQ6WzIsMCwxMCwxXSxjb2xvcjp7Ym9yZGVyOltcImNvbG9yXCIsXCIjMkI3Q0U5XCJdLGJhY2tncm91bmQ6W1wiY29sb3JcIixcIiM5N0MyRkNcIl0saGlnaGxpZ2h0Ontib3JkZXI6W1wiY29sb3JcIixcIiMyQjdDRTlcIl0sYmFja2dyb3VuZDpbXCJjb2xvclwiLFwiI0QyRTVGRlwiXX0saG92ZXI6e2JvcmRlcjpbXCJjb2xvclwiLFwiIzJCN0NFOVwiXSxiYWNrZ3JvdW5kOltcImNvbG9yXCIsXCIjRDJFNUZGXCJdfX0sZml4ZWQ6e3g6ITEseTohMX0sZm9udDp7Y29sb3I6W1wiY29sb3JcIixcIiMzNDM0MzRcIl0sc2l6ZTpbMTQsMCwxMDAsMV0sZmFjZTpbXCJhcmlhbFwiLFwidmVyZGFuYVwiLFwidGFob21hXCJdLGJhY2tncm91bmQ6W1wiY29sb3JcIixcIm5vbmVcIl0sc3Ryb2tlV2lkdGg6WzAsMCw1MCwxXSxzdHJva2VDb2xvcjpbXCJjb2xvclwiLFwiI2ZmZmZmZlwiXX0saGlkZGVuOiExLGxhYmVsSGlnaGxpZ2h0Qm9sZDohMCxwaHlzaWNzOiEwLHNjYWxpbmc6e21pbjpbMTAsMCwyMDAsMV0sbWF4OlszMCwwLDIwMCwxXSxsYWJlbDp7ZW5hYmxlZDohMSxtaW46WzE0LDAsMjAwLDFdLG1heDpbMzAsMCwyMDAsMV0sbWF4VmlzaWJsZTpbMzAsMCwyMDAsMV0sZHJhd1RocmVzaG9sZDpbNSwwLDIwLDFdfX0sc2hhZG93OntlbmFibGVkOiExLGNvbG9yOlwicmdiYSgwLDAsMCwwLjUpXCIsc2l6ZTpbMTAsMCwyMCwxXSx4Ols1LC0zMCwzMCwxXSx5Ols1LC0zMCwzMCwxXX0sc2hhcGU6W1wiZWxsaXBzZVwiLFwiYm94XCIsXCJjaXJjbGVcIixcImRhdGFiYXNlXCIsXCJkaWFtb25kXCIsXCJkb3RcIixcInNxdWFyZVwiLFwic3RhclwiLFwidG
21167V4dFwiLFwidHJpYW5nbGVcIixcInRyaWFuZ2xlRG93blwiLFwiaGV4YWdvblwiXSxzaGFwZVByb3BlcnRpZXM6e2JvcmRlckRhc2hlczohMSxib3JkZXJSYWRpdXM6WzYsMCwyMCwxXSxpbnRlcnBvbGF0aW9uOiEwLHVzZUltYWdlU2l6ZTohMX0sc2l6ZTpbMjUsMCwyMDAsMV19LGVkZ2VzOnthcnJvd3M6e3RvOntlbmFibGVkOiExLHNjYWxlRmFjdG9yOlsxLDAsMywuMDVdLHR5cGU6XCJhcnJvd1wifSxtaWRkbGU6e2VuYWJsZWQ6ITEsc2NhbGVGYWN0b3I6WzEsMCwzLC4wNV0sdHlwZTpcImFycm93XCJ9LGZyb206e2VuYWJsZWQ6ITEsc2NhbGVGYWN0b3I6WzEsMCwzLC4wNV0sdHlwZTpcImFycm93XCJ9fSxhcnJvd1N0cmlrZXRocm91Z2g6ITAsY29sb3I6e2NvbG9yOltcImNvbG9yXCIsXCIjODQ4NDg0XCJdLGhpZ2hsaWdodDpbXCJjb2xvclwiLFwiIzg0ODQ4NFwiXSxob3ZlcjpbXCJjb2xvclwiLFwiIzg0ODQ4NFwiXSxpbmhlcml0OltcImZyb21cIixcInRvXCIsXCJib3RoXCIsITAsITFdLG9wYWNpdHk6WzEsMCwxLC4wNV19LGRhc2hlczohMSxmb250Ontjb2xvcjpbXCJjb2xvclwiLFwiIzM0MzQzNFwiXSxzaXplOlsxNCwwLDEwMCwxXSxmYWNlOltcImFyaWFsXCIsXCJ2ZXJkYW5hXCIsXCJ0YWhvbWFcIl0sYmFja2dyb3VuZDpbXCJjb2xvclwiLFwibm9uZVwiXSxzdHJva2VXaWR0aDpbMiwwLDUwLDFdLHN0cm9rZUNvbG9yOltcImNvbG9yXCIsXCIjZmZmZmZmXCJdLGFsaWduOltcImhvcml6b250YWxcIixcInRvcFwiLFwibWlkZGxlXCIsXCJib3R0b21cIl19LGhpZGRlbjohMSxob3ZlcldpZHRoOlsxLjUsMCw1LC4xXSxsYWJlbEhpZ2hsaWdodEJvbGQ6ITAscGh5c2ljczohMCxzY2FsaW5nOnttaW46WzEsMCwxMDAsMV0sbWF4OlsxNSwwLDEwMCwxXSxsYWJlbDp7ZW5hYmxlZDohMCxtaW46WzE0LDAsMjAwLDFdLG1heDpbMzAsMCwyMDAsMV0sbWF4VmlzaWJsZTpbMzAsMCwyMDAsMV0sZHJhd1RocmVzaG9sZDpbNSwwLDIwLDFdfX0sc2VsZWN0aW9uV2lkdGg6WzEuNSwwLDUsLjFdLHNlbGZSZWZlcmVuY2VTaXplOlsyMCwwLDIwMCwxXSxzaGFkb3c6e2VuYWJsZWQ6ITEsY29sb3I6XCJyZ2JhKDAsMCwwLDAuNSlcIixzaXplOlsxMCwwLDIwLDFdLHg6WzUsLTMwLDMwLDFdLHk6WzUsLTMwLDMwLDFdfSxzbW9vdGg6e2VuYWJsZWQ6ITAsdHlwZTpbXCJkeW5hbWljXCIsXCJjb250aW51b3VzXCIsXCJkaXNjcmV0ZVwiLFwiZGlhZ29uYWxDcm9zc1wiLFwic3RyYWlnaHRDcm9zc1wiLFwiaG9yaXpvbnRhbFwiLFwidmVydGljYWxcIixcImN1cnZlZENXXCIsXCJjdXJ2ZWRDQ1dcIixcImN1YmljQmV6aWVyXCJdLGZvcmNlRGlyZWN0aW9uOltcImhvcml6b250YWxcIixcInZlcnRpY2FsXCIsXCJub25lXCJdLHJvdW5kbmVzczpbLjUsMCwxLC4wNV19LHdpZHRoOlsxLDAsMzAsMV19LGxheW91dDp7aGllcmFyY2hpY2FsOntlbmFibGVkOiExLGxldmVsU2VwYXJhdGlvbjpbMTUwLDIwLDUwMCw1XSxub2RlU3BhY2luZzpbMTAwLDIwLDUwMCw1XSx0cmVlU3BhY2luZzpbMjAwLDIwLDUwMCw1XSxibG9ja1NoaWZ0aW5nOiEwLGVkZ2VNaW5pbWl6YXRpb246ITAscGFyZW50Q2VudHJhbGl6YXRpb246ITAsZGlyZWN0aW9uOltcIlVEXCIsXCJEVVwiLFwiTFJcIixcIlJMXCJdLHNvcnRNZXRob2Q6W1wiaHVic2l6ZVwiLFwiZGlyZWN0ZWRcIl19fSxpbnRlcmFjdGlvbjp7ZHJhZ05vZGVzOiEwLGRyYWdWaWV3OiEwLGhpZGVFZGdlc09uRHJhZzohMSxoaWRlTm9kZXNPbkRyYWc6ITEsaG92ZXI6ITEsa2V5Ym9hcmQ6e2VuYWJsZWQ6ITEsc3BlZWQ6e3g6WzEwLDAsNDAsMV0seTpbMTAsMCw0MCwxXSx6b29tOlsuMDIsMCwuMSwuMDA1XX0sYmluZFRvV2luZG93OiEwfSxtdWx0aXNlbGVjdDohMSxuYXZpZ2F0aW9uQnV0dG9uczohMSxzZWxlY3RhYmxlOiEwLHNlbGVjdENvbm5lY3RlZEVkZ2VzOiEwLGhvdmVyQ29ubmVjdGVkRWRnZXM6ITAsdG9vbHRpcERlbGF5OlszMDAsMCwxZTMsMjVdLHpvb21WaWV3OiEwfSxtYW5pcHVsYXRpb246e2VuYWJsZWQ6ITEsaW5pdGlhbGx5QWN0aXZlOiExfSxwaHlzaWNzOntlbmFibGVkOiEwLGJhcm5lc0h1dDp7Z3Jhdml0YXRpb25hbENvbnN0YW50OlstMmUzLC0zZTQsMCw1MF0sY2VudHJhbEdyYXZpdHk6Wy4zLDAsMTAsLjA1XSxzcHJpbmdMZW5ndGg6Wzk1LDAsNTAwLDVdLHNwcmluZ0NvbnN0YW50OlsuMDQsMCwxLjIsLjAwNV0sZGFtcGluZzpbLjA5LDAsMSwuMDFdLGF2b2lkT3ZlcmxhcDpbMCwwLDEsLjAxXX0sZm9yY2VBdGxhczJCYXNlZDp7Z3Jhdml0YXRpb25hbENvbnN0YW50OlstNTAsLTUwMCwwLDFdLGNlbnRyYWxHcmF2aXR5OlsuMDEsMCwxLC4wMDVdLHNwcmluZ0xlbmd0aDpbOTUsMCw1MDAsNV0sc3ByaW5nQ29uc3RhbnQ6Wy4wOCwwLDEuMiwuMDA1XSxkYW1waW5nOlsuNCwwLDEsLjAxXSxhdm9pZE92ZXJsYXA6WzAsMCwxLC4wMV19LHJlcHVsc2lvbjp7Y2VudHJhbEdyYXZpdHk6Wy4yLDAsMTAsLjA1XSxzcHJpbmdMZW5ndGg6WzIwMCwwLDUwMCw1XSxzcHJpbmdDb25zdGFudDpbLjA1LDAsMS4yLC4wMDVdLG5vZGVEaXN0YW5jZTpbMTAwLDAsNTAwLDVdLGRhbXBpbmc6Wy4wOSwwLDEsLjAxXX0saGllcmFyY2hpY2FsUmVwdWxzaW9uOntjZW50cmFsR3Jhdml0eTpbLjIsMCwxMCwuMDVdLHNwcmluZ0xlbmd0aDpbMTAwLDAsNTAwLDVdLHNwcmluZ0NvbnN0YW50OlsuMDEsMCwxLjIsLjAwNV0sbm9kZURpc3RhbmNlOlsxMjAsMCw1MDAsNV0sZGFtcGluZzpbLjA5LDAsMSwuMDFdfSxtYXhWZWxvY2l0eTpbNTAsMCwxNTAsMV0sbWluVmVsb2NpdHk6Wy4xLC4wMSwuNSwuMDFdLHNvbHZlcjpbXCJiYXJuZXNIdXRcIixcImZvcmNlQXRsYXMyQmFzZWRcIixcInJlcHVsc2lvblwiLFwiaGllcmFyY2hpY2FsUmVwdWxzaW9uXCJdLHRpbWVzdGVwOlsuNSwuMDEsMSwuMDFdfX07ZS5hbGxPcHRpb25zPWgsZS5jb25maWd1cmVPcHRpb25zPWR9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDIpO28uZXh0ZW5kKGUsaSgxNTkpKSxvLmV4dGVuZChlLGkoMTc3KSksby5leHRlbmQoZSxpKDE4MSkpfSxmdW5jdGlvbih0LGUsaSl7aSg0OSksaSg2MCksdC5leHBvcnRzPWkoMTM2KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTI2KSxuPWkoMTI3KSxzPWkoMzEpLHI9aSgyNSk7dC5leHBvcnRzPWkoNzkpKEFycmF5LFwiQXJyYXlcIixmdW5jdGlvbih0LGUpe3RoaXMuX3Q9cih0KSx0aGlzLl9pPTAsdGhpcy5faz1lfSxmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3QsZT10aGlzLl9rLGk9dGhpcy5faSsrO3JldHVybiF0fHxpPj10Lmxlbmd0aD8odGhpcy5fdD12b2lkIDAsbigxKSk6XCJrZXlzXCI9PWU/bigwLGkpOlwidmFsdWVzXCI9PWU/bigwLHRbaV0pOm4oMCxbaSx0W2ldXSl9LFwidmFsdWVzXCIpLHMuQXJndW1lbnRzPXMuQXJyYXksbyhcImtleXNcIiksbyhcInZhbHVlc1wiKSxvKFwiZW50cmllc1wiKX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybnt2YWx1ZTplLGRvbmU6ISF0fX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQpdGhyb3cgVHlwZUVycm9yKHQrXCIgaXMgbm90IGEgZnVuY3Rpb24hXCIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoNTQpLG49aSgzOSkscz1pKDU5KSxyPXt9O2koMjYpKHIsaSgxMykoXCJpdGVyYXRvclwiKSxmdW5jdGlvbigpe3JldHVybiB0aGlzfSksdC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxpKXt0LnByb3RvdHlwZT1vKHIse25leHQ6bigxLGkpfSkscy
21167h0LGUrXCIgSXRlcmF0b3JcIil9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgyMCksbj1pKDI3KSxzPWkoMzMpO3QuZXhwb3J0cz1pKDIxKT9PYmplY3QuZGVmaW5lUHJvcGVydGllczpmdW5jdGlvbih0LGUpe24odCk7Zm9yKHZhciBpLHI9cyhlKSxhPXIubGVuZ3RoLGg9MDthPmg7KW8uZih0LGk9cltoKytdLGVbaV0pO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMjUpLG49aSgxMzIpLHM9aSgxMzMpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxpLHIpe3ZhciBhLGg9byhlKSxkPW4oaC5sZW5ndGgpLGw9cyhyLGQpO2lmKHQmJmkhPWkpe2Zvcig7ZD5sOylpZigoYT1oW2wrK10pIT1hKXJldHVybiEwfWVsc2UgZm9yKDtkPmw7bCsrKWlmKCh0fHxsIGluIGgpJiZoW2xdPT09aSlyZXR1cm4gdHx8bHx8MDtyZXR1cm4hdCYmLTF9fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoNTUpLG49TWF0aC5taW47dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0PjA/bihvKHQpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSg1NSksbj1NYXRoLm1heCxzPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0PW8odCksdDwwP24odCtlLDApOnModCxlKX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDE4KS5kb2N1bWVudDt0LmV4cG9ydHM9byYmby5kb2N1bWVudEVsZW1lbnR9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDU1KSxuPWkoNTEpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxpKXt2YXIgcyxyLGE9U3RyaW5nKG4oZSkpLGg9byhpKSxkPWEubGVuZ3RoO3JldHVybiBoPDB8fGg+PWQ/dD9cIlwiOnZvaWQgMDoocz1hLmNoYXJDb2RlQXQoaCksczw1NTI5Nnx8cz41NjMxOXx8aCsxPT09ZHx8KHI9YS5jaGFyQ29kZUF0KGgrMSkpPDU2MzIwfHxyPjU3MzQzP3Q/YS5jaGFyQXQoaCk6czp0P2Euc2xpY2UoaCxoKzIpOnItNTYzMjArKHMtNTUyOTY8PDEwKSs2NTUzNil9fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMjcpLG49aSgxMzcpO3QuZXhwb3J0cz1pKDcpLmdldEl0ZXJhdG9yPWZ1bmN0aW9uKHQpe3ZhciBlPW4odCk7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSl0aHJvdyBUeXBlRXJyb3IodCtcIiBpcyBub3QgaXRlcmFibGUhXCIpO3JldHVybiBvKGUuY2FsbCh0KSl9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSg4Niksbj1pKDEzKShcIml0ZXJhdG9yXCIpLHM9aSgzMSk7dC5leHBvcnRzPWkoNykuZ2V0SXRlcmF0b3JNZXRob2Q9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT10KXJldHVybiB0W25dfHx0W1wiQEBpdGVyYXRvclwiXXx8c1tvKHQpXX19LGZ1bmN0aW9uKHQsZSxpKXtpKDEzOSk7dmFyIG89aSg3KS5PYmplY3Q7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG8uY3JlYXRlKHQsZSl9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgxNyk7byhvLlMsXCJPYmplY3RcIix7Y3JlYXRlOmkoNTQpfSl9LGZ1bmN0aW9uKHQsZSxpKXtpKDE0MSksdC5leHBvcnRzPWkoNykuT2JqZWN0LmtleXN9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDQxKSxuPWkoMzMpO2koODcpKFwia2V5c1wiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuKG8odCkpfX0pfSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPXtkZWZhdWx0OmkoMTQzKSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24odCxlLGkpe2koNjApLGkoNDkpLHQuZXhwb3J0cz1pKDYxKS5mKFwiaXRlcmF0b3JcIil9LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9e2RlZmF1bHQ6aSgxNDUpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbih0LGUsaSl7aSgxNDYpLGkoMTUxKSxpKDE1MiksaSgxNTMpLHQuZXhwb3J0cz1pKDcpLlN5bWJvbH0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTgpLG49aSgyMikscz1pKDIxKSxyPWkoMTcpLGE9aSg4MyksaD1pKDE0NykuS0VZLGQ9aSgyOCksbD1pKDU3KSx1PWkoNTkpLGM9aSg0MCkscD1pKDEzKSxmPWkoNjEpLG09aSg2Miksdj1pKDE0OCksZz1pKDE0OSkseT1pKDI3KSxiPWkoMjUpLF89aSg1Myksdz1pKDM5KSx4PWkoNTQpLGs9aSgxNTApLFM9aSg4OSksRD1pKDIwKSxNPWkoMzMpLEM9Uy5mLE89RC5mLEU9ay5mLFQ9by5TeW1ib2wsUD1vLkpTT04sST1QJiZQLnN0cmluZ2lmeSxOPXAoXCJfaGlkZGVuXCIpLFI9cChcInRvUHJpbWl0aXZlXCIpLEE9e30ucHJvcGVydHlJc0VudW1lcmFibGUsej1sKFwic3ltYm9sLXJlZ2lzdHJ5XCIpLEw9bChcInN5bWJvbHNcIiksRj1sKFwib3Atc3ltYm9sc1wiKSxCPU9iamVjdC5wcm90b3R5cGUsaj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBULEg9by5RT2JqZWN0LFc9IUh8fCFILnByb3RvdHlwZXx8IUgucHJvdG90eXBlLmZpbmRDaGlsZCxZPXMmJmQoZnVuY3Rpb24oKXtyZXR1cm4gNyE9eChPKHt9LFwiYVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTyh0aGlzLFwiYVwiLHt2YWx1ZTo3fSkuYX19KSkuYX0pP2Z1bmN0aW9uKHQsZSxpKXt2YXIgbz1DKEIsZSk7byYmZGVsZXRlIEJbZV0sTyh0LGUsaSksbyYmdCE9PUImJk8oQixlLG8pfTpPLEc9ZnVuY3Rpb24odCl7dmFyIGU9TFt0XT14KFQucHJvdG90eXBlKTtyZXR1cm4gZS5faz10LGV9LFY9aiYmXCJzeW1ib2xcIj09dHlwZW9mIFQuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuXCJzeW1ib2xcIj09dHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgVH0sVT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIHQ9PT1CJiZVKEYsZSxpKSx5KHQpLGU9XyhlLCEwKSx5KGkpLG4oTCxlKT8oaS5lbnVtZXJhYmxlPyhuKHQsTikmJnRbTl1bZV0mJih0W05dW2VdPSExKSxpPXgoaSx7ZW51bWVyYWJsZTp3KDAsITEpfSkpOihuKHQsTil8fE8odCxOLHcoMSx7fSkpLHRbTl1bZV09ITApLFkodCxlLGkpKTpPKHQsZSxpKX0scT1mdW5jdGlvbih0LGUpe3kodCk7Zm9yKHZhciBpLG89dihlPWIoZSkpLG49MCxzPW8ubGVuZ3RoO3M+bjspVSh0LGk9b1tuKytdLGVbaV0pO3JldHVybiB0fSxYPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWU/eCh0KTpxKHgodCksZSl9LFo9ZnVuY3Rpb24odCl7dmFyIGU9QS5jYWxsKHRoaXMsdD1fKHQsITApKTtyZXR1cm4hKHRoaXM9PT1CJiZuKEwsdCkmJiFuKEYsdCkpJiYoIShlfHwhbih0aGlzLHQpfHwhbihMLHQpfHxuKHRoaXMsTikmJnRoaXNbTl1bdF0pfHxlKX0sSz1mdW5jdGlvbih0LGUpe2lmKHQ9Yih0KSxlPV8oZSwhMCksdCE9PUJ8fCFuKEwsZSl8fG4oRixlKSl7dmFyIGk9Qyh0LGUpO3JldHVybiFpfHwhbihMLGUpfHxuKHQsTikmJnRbTl1bZV18fChpLmVudW1lcmFibGU9ITApLGl9fSxKPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpPUUoYih0KSksbz1bXSxzPTA7aS5sZW5ndGg+czspbihMLGU9aVtzKytdKXx8ZT09Tnx8ZT09aHx8by5wdXNoKGUpO3JldHVybiBvfSwkPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpPXQ9PT1CLG89RShpP0Y6Yih0KSkscz1bXSxyPTA7by5sZW5ndGg+cjspIW4oTCxlPW9bcisrXSl8fGkmJiFuKEIsZSl8fHMucHVzaChMW2VdKTtyZXR1cm4gc307anx8KFQ9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgVCl0aHJvdyBUeXBlRXJyb3IoXCJTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhXCIpO3ZhciB0PWMoYXJndW1lbnRzLmxlbmd0aD4wP2FyZ3VtZW50c1swXTp2b2lkIDApLGU9ZnVuY3Rpb24oaSl7dGhpcz09PUImJmUuY2FsbChGLGkpLG4odGhpcyxOKSYmbih0aGlzW05dLHQpJiYodGhpc1tOXVt0XT0hMSksWSh0aGlzLHQsdygxLGkpKX07cmV0dXJuIHMmJlcmJlkoQix0LHtjb25maWd1cmFibGU6ITAsc2V0OmV9KSxHKHQpfS
21167xhKFQucHJvdG90eXBlLFwidG9TdHJpbmdcIixmdW5jdGlvbigpe3JldHVybiB0aGlzLl9rfSksUy5mPUssRC5mPVUsaSg4OCkuZj1rLmY9SixpKDQyKS5mPVosaSg2MykuZj0kLHMmJiFpKDUyKSYmYShCLFwicHJvcGVydHlJc0VudW1lcmFibGVcIixaLCEwKSxmLmY9ZnVuY3Rpb24odCl7cmV0dXJuIEcocCh0KSl9KSxyKHIuRytyLlcrci5GKiFqLHtTeW1ib2w6VH0pO2Zvcih2YXIgUT1cImhhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzXCIuc3BsaXQoXCIsXCIpLHR0PTA7US5sZW5ndGg+dHQ7KXAoUVt0dCsrXSk7Zm9yKHZhciBldD1NKHAuc3RvcmUpLGl0PTA7ZXQubGVuZ3RoPml0OyltKGV0W2l0KytdKTtyKHIuUytyLkYqIWosXCJTeW1ib2xcIix7Zm9yOmZ1bmN0aW9uKHQpe3JldHVybiBuKHosdCs9XCJcIik/elt0XTp6W3RdPVQodCl9LGtleUZvcjpmdW5jdGlvbih0KXtpZighVih0KSl0aHJvdyBUeXBlRXJyb3IodCtcIiBpcyBub3QgYSBzeW1ib2whXCIpO2Zvcih2YXIgZSBpbiB6KWlmKHpbZV09PT10KXJldHVybiBlfSx1c2VTZXR0ZXI6ZnVuY3Rpb24oKXtXPSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtXPSExfX0pLHIoci5TK3IuRiohaixcIk9iamVjdFwiLHtjcmVhdGU6WCxkZWZpbmVQcm9wZXJ0eTpVLGRlZmluZVByb3BlcnRpZXM6cSxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6SyxnZXRPd25Qcm9wZXJ0eU5hbWVzOkosZ2V0T3duUHJvcGVydHlTeW1ib2xzOiR9KSxQJiZyKHIuUytyLkYqKCFqfHxkKGZ1bmN0aW9uKCl7dmFyIHQ9VCgpO3JldHVyblwiW251bGxdXCIhPUkoW3RdKXx8XCJ7fVwiIT1JKHthOnR9KXx8XCJ7fVwiIT1JKE9iamVjdCh0KSl9KSksXCJKU09OXCIse3N0cmluZ2lmeTpmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10JiYhVih0KSl7Zm9yKHZhciBlLGksbz1bdF0sbj0xO2FyZ3VtZW50cy5sZW5ndGg+bjspby5wdXNoKGFyZ3VtZW50c1tuKytdKTtyZXR1cm4gZT1vWzFdLFwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJihpPWUpLCFpJiZnKGUpfHwoZT1mdW5jdGlvbih0LGUpe2lmKGkmJihlPWkuY2FsbCh0aGlzLHQsZSkpLCFWKGUpKXJldHVybiBlfSksb1sxXT1lLEkuYXBwbHkoUCxvKX19fSksVC5wcm90b3R5cGVbUl18fGkoMjYpKFQucHJvdG90eXBlLFIsVC5wcm90b3R5cGUudmFsdWVPZiksdShULFwiU3ltYm9sXCIpLHUoTWF0aCxcIk1hdGhcIiwhMCksdShvLkpTT04sXCJKU09OXCIsITApfSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSg0MCkoXCJtZXRhXCIpLG49aSgzMikscz1pKDIyKSxyPWkoMjApLmYsYT0wLGg9T2JqZWN0LmlzRXh0ZW5zaWJsZXx8ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZD0haSgyOCkoZnVuY3Rpb24oKXtyZXR1cm4gaChPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKX0pLGw9ZnVuY3Rpb24odCl7cih0LG8se3ZhbHVlOntpOlwiT1wiKyArK2Esdzp7fX19KX0sdT1mdW5jdGlvbih0LGUpe2lmKCFuKHQpKXJldHVyblwic3ltYm9sXCI9PXR5cGVvZiB0P3Q6KFwic3RyaW5nXCI9PXR5cGVvZiB0P1wiU1wiOlwiUFwiKSt0O2lmKCFzKHQsbykpe2lmKCFoKHQpKXJldHVyblwiRlwiO2lmKCFlKXJldHVyblwiRVwiO2wodCl9cmV0dXJuIHRbb10uaX0sYz1mdW5jdGlvbih0LGUpe2lmKCFzKHQsbykpe2lmKCFoKHQpKXJldHVybiEwO2lmKCFlKXJldHVybiExO2wodCl9cmV0dXJuIHRbb10ud30scD1mdW5jdGlvbih0KXtyZXR1cm4gZCYmZi5ORUVEJiZoKHQpJiYhcyh0LG8pJiZsKHQpLHR9LGY9dC5leHBvcnRzPXtLRVk6byxORUVEOiExLGZhc3RLZXk6dSxnZXRXZWFrOmMsb25GcmVlemU6cH19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDMzKSxuPWkoNjMpLHM9aSg0Mik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW8odCksaT1uLmY7aWYoaSlmb3IodmFyIHIsYT1pKHQpLGg9cy5mLGQ9MDthLmxlbmd0aD5kOyloLmNhbGwodCxyPWFbZCsrXSkmJmUucHVzaChyKTtyZXR1cm4gZX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDUwKTt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuXCJBcnJheVwiPT1vKHQpfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMjUpLG49aSg4OCkuZixzPXt9LnRvU3RyaW5nLHI9XCJvYmplY3RcIj09dHlwZW9mIHdpbmRvdyYmd2luZG93JiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcz9PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpOltdLGE9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiBuKHQpfWNhdGNoKHQpe3JldHVybiByLnNsaWNlKCl9fTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gciYmXCJbb2JqZWN0IFdpbmRvd11cIj09cy5jYWxsKHQpP2EodCk6bihvKHQpKX19LGZ1bmN0aW9uKHQsZSl7fSxmdW5jdGlvbih0LGUsaSl7aSg2MikoXCJhc3luY0l0ZXJhdG9yXCIpfSxmdW5jdGlvbih0LGUsaSl7aSg2MikoXCJvYnNlcnZhYmxlXCIpfSxmdW5jdGlvbih0LGUsaSl7KGZ1bmN0aW9uKHQpeyFmdW5jdGlvbihlLGkpe3QuZXhwb3J0cz1pKCl9KDAsZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7cmV0dXJuIENvLmFwcGx5KG51bGwsYXJndW1lbnRzKX1mdW5jdGlvbiBpKHQpe3JldHVybiB0IGluc3RhbmNlb2YgQXJyYXl8fFwiW29iamVjdCBBcnJheV1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBudWxsIT10JiZcIltvYmplY3QgT2JqZWN0XVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIG4odCl7aWYoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMpcmV0dXJuIDA9PT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KS5sZW5ndGg7dmFyIGU7Zm9yKGUgaW4gdClpZih0Lmhhc093blByb3BlcnR5KGUpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIHModCl7cmV0dXJuIHZvaWQgMD09PXR9ZnVuY3Rpb24gcih0KXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgdHx8XCJbb2JqZWN0IE51bWJlcl1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBhKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZXx8XCJbb2JqZWN0IERhdGVdXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gaCh0LGUpe3ZhciBpLG89W107Zm9yKGk9MDtpPHQubGVuZ3RoOysraSlvLnB1c2goZSh0W2ldLGkpKTtyZXR1cm4gb31mdW5jdGlvbiBkKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIGwodCxlKXtmb3IodmFyIGkgaW4gZSlkKGUsaSkmJih0W2ldPWVbaV0pO3JldHVybiBkKGUsXCJ0b1N0cmluZ1wiKSYmKHQudG9TdHJpbmc9ZS50b1N0cmluZyksZChlLFwidmFsdWVPZlwiKSYmKHQudmFsdWVPZj1lLnZhbHVlT2YpLHR9ZnVuY3Rpb24gdSh0LGUsaSxvKXtyZXR1cm4gU2UodCxlLGksbywhMCkudXRjKCl9ZnVuY3Rpb24gYygpe3JldHVybntlbXB0eTohMSx1bnVzZWRUb2tlbnM6W10sdW51c2VkSW5wdXQ6W10sb3ZlcmZsb3c6LTIsY2hhcnNMZWZ0T3ZlcjowLG51bGxJbnB1dDohMSxpbnZhbGlkTW9udGg6bnVsbCxpbnZhbGlkRm9ybWF0OiExLHVzZXJJbnZhbGlkYXRlZDohMSxpc286ITEscGFyc2VkRGF0ZVBhcnRzOltdLG1lcmlkaWVtOm51bGwscmZjMjgyMjohMSx3ZWVrZGF5TWlzbWF0Y2g6ITF9fWZ1bmN0aW9uIHAodCl7cmV0dXJuIG51bGw9PXQuX3BmJiYodC5fcGY9YygpKSx0Ll9wZn1mdW5jdGlvbiBmKHQpe2lmKG51bGw9PXQuX2lzVmFsaWQpe3ZhciBlPXAodCksaT1Pby5jYWxsKGUucGFyc2VkRGF0ZVBhcnRzLGZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10fSksbz0haXNOYU4odC5fZC5nZXRUaW1lKCkpJiZlLm92ZXJmbG93PDAmJiFlLmVtcHR5JiYhZS5pbnZhbGlkTW9udGgmJiFlLmludmFsaWRXZWVrZGF5JiYhZS53ZWVrZGF5TWlzbWF0Y2gmJiFlLm51bGxJbnB1dCYmIWUuaW52YWxpZEZvcm1hdCYmIWUudXNlckludmFsaWRhdGVkJiYoIWUubWVyaWRpZW18fGUubWVyaWRpZW0mJmkpO2lmKHQuX3N0cmljdCYmKG89byYmMD09PWUuY2hhcnNMZWZ0T3ZlciYmMD09PWUudW51c2VkVG9rZW5zLmxlbmd0aCYmdm9pZCAwPT09ZS5iaWdIb3VyKSxudWxsIT1PYmplY3QuaXNGcm96ZW4mJk9iamVjdC5pc0Zyb3plbih0KSlyZXR1cm4gbzt0Ll9pc1ZhbGlkPW99cmV0dXJuIHQuX2lzVmFsaWR9ZnVuY3Rpb24gbSh0KXt2YXIgZT11KE5hTik7cmV0dXJuIG51bGwhPXQ/bChwKGUpLHQpOnAoZSkudXNlckludmFsaWRhdGVkPSEwLGV9ZnVuY3Rpb24gdih0LGUpe3ZhciBpLG8sbjtpZihzKGUuX2lzQU1vbWVudE9iamVjdCl8fCh0Ll9pc0FNb21lbnRPYmplY3Q9ZS5faXNBTW9tZW50T2JqZWN0KSxzKGUuX2kpfHwodC5faT1lLl9pKSxzKGUuX2YpfHwodC5fZj1lLl9mKSxzKGUuX2wpfHwodC5fbD1lLl9sKSxzKGUuX3N0cmljdCl8fCh0Ll9zdHJpY3Q9ZS5fc3RyaWN0KSxzKGUuX3R6bSl8fCh0Ll90em09ZS5fdHptKSxzKGUuX2lzVVRDKXx8KHQuX2lzVVRDPWUuX2lzVVRDKSxzKGUuX29mZnNldCl8fCh0Ll9vZmZzZXQ9ZS5fb2Zmc2V0KSxzKGUuX3BmKXx8KHQuX3BmPXAoZSkpLHMoZS5fbG9jYWxlKXx8KHQuX2xvY2FsZT1lLl9sb2NhbGUpLEVvLmxlbmd0aD4wKWZvcihpPTA7aTxFby5sZW5ndGg7aSsrKW89RW9baV0sbj1lW29dLHMobil8fCh0W29dPW4pO3JldHVybiB0fWZ1bmN0aW9uIGcodCl7dih0aGlzLHQpLHRoaXMuX2Q9bmV3IERhdGUobnVsbCE9dC5fZD90Ll9kLmdldFRpbWUoKTpOYU4pLHRoaXMuaXNWYWxpZCgpfHwodGhpcy5fZD1uZXcgRGF0ZShOYU4pKSwhMT09PVRvJiYoVG89ITAsZS51cGRhdGVPZmZzZXQodGhpcyksVG89ITEpfWZ1bmN0aW9uIHkodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBnfHxudWxsIT10JiZudWxsIT10Ll9pc0FNb21lbnRPYmplY3R9ZnVuY3Rpb24gYih0KXtyZXR1cm4gdDwwP01hdGguY2VpbCh0KXx8MDpNYXRoLmZsb29yKHQpfWZ1bmN0aW9uIF8odCl7dmFyIGU9K3QsaT0wO3JldHVybiAwIT09ZSYmaXNGaW5pdGUoZSkmJihpPWIoZSkpLGl9ZnVuY3Rpb24gdyh0LGUsaSl7dmFyIG8sbj1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCkscz1NYXRoLmFicyh0Lmxlbmd0aC1lLmxlbmd0aCkscj0wO2ZvcihvPTA7bzxuO28rKykoaSYmdFtvXSE9PWVbb118fCFpJiZfKHRbb10pIT09XyhlW29dKSkmJnIrKztyZXR1cm4gcitzfWZ1bmN0aW9uIHgodCl7ITE9PT1lLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGNvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKFwiRGVwcmVjYXRpb24gd2FybmluZzogXCIrdCl9ZnVuY3Rpb24gayh0LGkpe3ZhciBvPSEwO3JldHVybiBsKGZ1bmN0aW9uKCl7aWYobnVsbCE9ZS5kZXByZWNhdGlvbkhhbmRsZXImJmUuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsdCksbyl7Zm9yKHZhciBuLHM9W10scj0wO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspe2lmKG49XCJcIixcIm9iamVjdFwiPT10eXBlb2YgYXJndW1lbnRzW3JdKXtuKz1cIlxcbltcIityK1wiXSBcIlxuO2Zvcih2YXIgYSBpbiBhcmd1bWVudHNbMF0pbis9YStcIjogXCIrYXJndW1lbnRzWzBdW2FdK1wiLCBcIjtuPW4uc2xpY2UoMCwtMil9ZWxzZSBuPWFyZ3VtZW50c1tyXTtzLnB1c2gobil9eCh0K1wiXFxuQXJndW1lbnRzOiBcIitBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzKS5qb2luKFwiXCIpK1wiXFxuXCIrKG5ldyBFcnJvcikuc3RhY2spLG89ITF9cmV0dXJuIGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxpKX1mdW5jdGlvbiBTKHQsaSl7bnVsbCE9ZS5kZXByZWNhdGlvbkhhbmRsZXImJmUuZGVwcmVjYXRpb25IYW5kbGVyKHQsaSksUG9bdF18fCh4KGkpLFBvW3RdPSEwKX1mdW5jdGlvbiBEKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRnVuY3Rpb258fFwiW29iamVjdCBGdW5jdGlvbl1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBNKHQpe3ZhciBlLGk7Zm9yKGkgaW4gdCllPXRbaV0sRChlKT90aGlzW2ldPWU6dGhpc1tcIl9cIitpXT1lO3RoaXMuX2NvbmZpZz10LHRoaXMuX2RheU9mTW9udGhPcmRpbmFsUGFyc2VMZW5pZW50PW5ldyBSZWdFeHAoKHRoaXMuX2RheU9mTW9udGhPcmRpbmFsUGFyc2Uuc291cmNlfHx0aGlzLl9vcmRpbmFsUGFyc2Uuc291cmNlKStcInxcIisvXFxkezEsMn0vLnNvdXJjZSl9ZnVuY3Rpb24gQyh0LGUpe3ZhciBpLG49bCh7fSx0KTtmb3IoaSBpbiBlKWQoZSxpKSYmKG8odFtpXSkmJm8oZVtpXSk/KG5baV09e30sbChuW2ldLHRbaV0pLGwobltpXSxlW2ldKSk6bnVsbCE9ZVtpXT9uW2ldPWVbaV06ZGVsZXRlIG5baV0pO2ZvcihpIGluIHQpZCh0LGkpJiYhZChlLGkpJiZvKHRbaV0pJiYobltpXT1sKHt9LG5baV0pKTtyZXR1cm4gbn1mdW5jdGlvbiBPKHQpe251bGwhPXQmJnRoaXMuc2V0KHQpfWZ1bmN0aW9uIEUodCxlLGkpe3ZhciBvPXR
21167oaXMuX2NhbGVuZGFyW3RdfHx0aGlzLl9jYWxlbmRhci5zYW1lRWxzZTtyZXR1cm4gRChvKT9vLmNhbGwoZSxpKTpvfWZ1bmN0aW9uIFQodCl7dmFyIGU9dGhpcy5fbG9uZ0RhdGVGb3JtYXRbdF0saT10aGlzLl9sb25nRGF0ZUZvcm1hdFt0LnRvVXBwZXJDYXNlKCldO3JldHVybiBlfHwhaT9lOih0aGlzLl9sb25nRGF0ZUZvcm1hdFt0XT1pLnJlcGxhY2UoL01NTU18TU18RER8ZGRkZC9nLGZ1bmN0aW9uKHQpe3JldHVybiB0LnNsaWNlKDEpfSksdGhpcy5fbG9uZ0RhdGVGb3JtYXRbdF0pfWZ1bmN0aW9uIFAoKXtyZXR1cm4gdGhpcy5faW52YWxpZERhdGV9ZnVuY3Rpb24gSSh0KXtyZXR1cm4gdGhpcy5fb3JkaW5hbC5yZXBsYWNlKFwiJWRcIix0KX1mdW5jdGlvbiBOKHQsZSxpLG8pe3ZhciBuPXRoaXMuX3JlbGF0aXZlVGltZVtpXTtyZXR1cm4gRChuKT9uKHQsZSxpLG8pOm4ucmVwbGFjZSgvJWQvaSx0KX1mdW5jdGlvbiBSKHQsZSl7dmFyIGk9dGhpcy5fcmVsYXRpdmVUaW1lW3Q+MD9cImZ1dHVyZVwiOlwicGFzdFwiXTtyZXR1cm4gRChpKT9pKGUpOmkucmVwbGFjZSgvJXMvaSxlKX1mdW5jdGlvbiBBKHQsZSl7dmFyIGk9dC50b0xvd2VyQ2FzZSgpO0xvW2ldPUxvW2krXCJzXCJdPUxvW2VdPXR9ZnVuY3Rpb24geih0KXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdD9Mb1t0XXx8TG9bdC50b0xvd2VyQ2FzZSgpXTp2b2lkIDB9ZnVuY3Rpb24gTCh0KXt2YXIgZSxpLG89e307Zm9yKGkgaW4gdClkKHQsaSkmJihlPXooaSkpJiYob1tlXT10W2ldKTtyZXR1cm4gb31mdW5jdGlvbiBGKHQsZSl7Rm9bdF09ZX1mdW5jdGlvbiBCKHQpe3ZhciBlPVtdO2Zvcih2YXIgaSBpbiB0KWUucHVzaCh7dW5pdDppLHByaW9yaXR5OkZvW2ldfSk7cmV0dXJuIGUuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LnByaW9yaXR5LWUucHJpb3JpdHl9KSxlfWZ1bmN0aW9uIGoodCxlLGkpe3ZhciBvPVwiXCIrTWF0aC5hYnModCksbj1lLW8ubGVuZ3RoO3JldHVybih0Pj0wP2k/XCIrXCI6XCJcIjpcIi1cIikrTWF0aC5wb3coMTAsTWF0aC5tYXgoMCxu
21167KSkudG9TdHJpbmcoKS5zdWJzdHIoMSkrb31mdW5jdGlvbiBIKHQsZSxpLG8pe3ZhciBuPW87XCJzdHJpbmdcIj09dHlwZW9mIG8mJihuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbb10oKX0pLHQmJihXb1t0XT1uKSxlJiYoV29bZVswXV09ZnVuY3Rpb24oKXtyZXR1cm4gaihuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlWzFdLGVbMl0pfSksaSYmKFdvW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm9yZGluYWwobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdCl9KX1mdW5jdGlvbiBXKHQpe3JldHVybiB0Lm1hdGNoKC9cXFtbXFxzXFxTXS8pP3QucmVwbGFjZSgvXlxcW3xcXF0kL2csXCJcIik6dC5yZXBsYWNlKC9cXFxcL2csXCJcIil9ZnVuY3Rpb24gWSh0KXt2YXIgZSxpLG89dC5tYXRjaChCbyk7Zm9yKGU9MCxpPW8ubGVuZ3RoO2U8aTtlKyspV29bb1tlXV0/b1tlXT1Xb1tvW2VdXTpvW2VdPVcob1tlXSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuLHM9XCJcIjtmb3Iobj0wO248aTtuKyspcys9RChvW25dKT9vW25dLmNhbGwoZSx0KTpvW25dO3JldHVybiBzfX1mdW5jdGlvbiBHKHQsZSl7cmV0dXJuIHQuaXNWYWxpZCgpPyhlPVYoZSx0LmxvY2FsZURhdGEoKSksSG9bZV09SG9bZV18fFkoZSksSG9bZV0odCkpOnQubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCl9ZnVuY3Rpb24gVih0LGUpe2Z1bmN0aW9uIGkodCl7cmV0dXJuIGUubG9uZ0RhdGVGb3JtYXQodCl8fHR9dmFyIG89NTtmb3Ioam8ubGFzdEluZGV4PTA7bz49MCYmam8udGVzdCh0KTspdD10LnJlcGxhY2Uoam8saSksam8ubGFzdEluZGV4PTAsby09MTtyZXR1cm4gdH1mdW5jdGlvbiBVKHQsZSxpKXthblt0XT1EKGUpP2U6ZnVuY3Rpb24odCxvKXtyZXR1cm4gdCYmaT9pOmV9fWZ1bmN0aW9uIHEodCxlKXtyZXR1cm4gZChhbix0KT9hblt0XShlLl9zdHJpY3QsZS5fbG9jYWxlKTpuZXcgUmVnRXhwKFgodCkpfWZ1bmN0aW9uIFgodCl7cmV0dXJuIFoodC5yZXBsYWNlKFwiXFxcXFwiLFwiXCIpLnJlcGxhY2UoL1xcXFwoXFxbKXxcXFxcKFxcXSl8XFxbKFteXFxdXFxbXSopXFxdfFxcXFwoLikvZyxmdW5jdGlvbih0LGUsaSxvLG4pe3JldHVybiBlfHxpfHxvfHxufSkpfWZ1bmN0aW9uIFoodCl7cmV0dXJuIHQucmVwbGFjZSgvWy1cXC9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLFwiXFxcXCQmXCIpfWZ1bmN0aW9uIEsodCxlKXt2YXIgaSxvPWU7Zm9yKFwic3RyaW5nXCI9PXR5cGVvZiB0JiYodD1bdF0pLHIoZSkmJihvPWZ1bmN0aW9uKHQsaSl7aVtlXT1fKHQpfSksaT0wO2k8dC5sZW5ndGg7aSsrKWhuW3RbaV1dPW99ZnVuY3Rpb24gSih0LGUpe0sodCxmdW5jdGlvbih0LGksbyxuKXtvLl93PW8uX3d8fHt9LGUodCxvLl93LG8sbil9KX1mdW5jdGlvbiAkKHQsZSxpKXtudWxsIT1lJiZkKGhuLHQpJiZoblt0XShlLGkuX2EsaSx0KX1mdW5jdGlvbiBRKHQpe3JldHVybiB0dCh0KT8zNjY6MzY1fWZ1bmN0aW9uIHR0KHQpe3JldHVybiB0JTQ9PTAmJnQlMTAwIT0wfHx0JTQwMD09MH1mdW5jdGlvbiBldCgpe3JldHVybiB0dCh0aGlzLnllYXIoKSl9ZnVuY3Rpb24gaXQodCxpKXtyZXR1cm4gZnVuY3Rpb24obyl7cmV0dXJuIG51bGwhPW8/KG50KHRoaXMsdCxvKSxlLnVwZGF0ZU9mZnNldCh0aGlzLGkpLHRoaXMpOm90KHRoaXMsdCl9fWZ1bmN0aW9uIG90KHQsZSl7cmV0dXJuIHQuaXNWYWxpZCgpP3QuX2RbXCJnZXRcIisodC5faXNVVEM/XCJVVENcIjpcIlwiKStlXSgpOk5hTn1mdW5jdGlvbiBudCh0LGUsaSl7dC5pc1ZhbGlkKCkmJiFpc05hTihpKSYmKFwiRnVsbFllYXJcIj09PWUmJnR0KHQueWVhcigpKT90Ll9kW1wic2V0XCIrKHQuX2lzVVRDP1wiVVRDXCI6XCJcIikrZV0oaSx0Lm1vbnRoKCksaHQoaSx0Lm1vbnRoKCkpKTp0Ll9kW1wic2V0XCIrKHQuX2lzVVRDP1wiVVRDXCI6XCJcIikrZV0oaSkpfWZ1bmN0aW9uIHN0KHQpe3JldHVybiB0PXoodCksRCh0aGlzW3RdKT90aGlzW3RdKCk6dGhpc31mdW5jdGlvbiBydCh0LGUpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiB0KXt0PUwodCk7Zm9yKHZhciBpPUIodCksbz0wO288aS5sZW5ndGg7bysrKXRoaXNbaVtvXS51bml0XSh0W2lbb10udW5pdF0pfWVsc2UgaWYodD16KHQpLEQodGhpc1t0XSkpcmV0dXJuIHRoaXNbdF0oZSk7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gYXQodCxlKXtyZXR1cm4odCVlK2UpJWV9ZnVuY3Rpb24gaHQodCxlKXtpZihpc05hTih0KXx8aXNOYU4oZSkpcmV0dXJuIE5hTjt2YXIgaT1hdChlLDEyKTtyZXR1cm4gdCs9KGUtaSkvMTIsMT09PWk/dHQodCk/Mjk6Mjg6MzEtaSU3JTJ9ZnVuY3Rpb24gZHQodCxlKXtyZXR1cm4gdD9pKHRoaXMuX21vbnRocyk/dGhpcy5fbW9udGhzW3QubW9udGgoKV06dGhpcy5fbW9udGhzWyh0aGlzLl9tb250aHMuaXNGb3JtYXR8fF9uKS50ZXN0KGUpP1wiZm9ybWF0XCI6XCJzdGFuZGFsb25lXCJdW3QubW9udGgoKV06aSh0aGlzLl9tb250aHMpP3RoaXMuX21vbnRoczp0aGlzLl9tb250aHMuc3RhbmRhbG9uZX1mdW5jdGlvbiBsdCh0LGUpe3JldHVybiB0P2kodGhpcy5fbW9udGhzU2hvcnQpP3RoaXMuX21vbnRoc1Nob3J0W3QubW9udGgoKV06dGhpcy5fbW9udGhzU2hvcnRbX24udGVzdChlKT9cImZvcm1hdFwiOlwic3RhbmRhbG9uZVwiXVt0Lm1vbnRoKCldOmkodGhpcy5fbW9udGhzU2hvcnQpP3RoaXMuX21vbnRoc1Nob3J0OnRoaXMuX21vbnRoc1Nob3J0LnN0YW5kYWxvbmV9ZnVuY3Rpb24gdXQodCxlLGkpe3ZhciBvLG4scyxyPXQudG9Mb2NhbGVMb3dlckNhc2UoKTtpZighdGhpcy5fbW9udGhzUGFyc2UpZm9yKHRoaXMuX21vbnRoc1BhcnNlPVtdLHRoaXMuX2xvbmdNb250aHNQYXJzZT1bXSx0aGlzLl9zaG9ydE1vbnRoc1BhcnNlPVtdLG89MDtvPDEyOysrbylzPXUoWzJlMyxvXSksdGhpcy5fc2hvcnRNb250aHNQYXJzZVtvXT10aGlzLm1vbnRoc1Nob3J0KHMsXCJcIikudG9Mb2NhbGVMb3dlckNhc2UoKSx0aGlzLl9sb25nTW9udGhzUGFyc2Vbb109dGhpcy5tb250aHMocyxcIlwiKS50b0xvY2FsZUxvd2VyQ2FzZSgpO3JldHVybiBpP1wiTU1NXCI9PT1lPyhuPXluLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSxyKSwtMSE9PW4/bjpudWxsKToobj15bi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSxyKSwtMSE9PW4/bjpudWxsKTpcIk1NTVwiPT09ZT8tMSE9PShuPXluLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSxyKSk/bjoobj15bi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSxyKSwtMSE9PW4/bjpudWxsKTotMSE9PShuPXluLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLHIpKT9uOihuPXluLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSxyKSwtMSE9PW4/bjpudWxsKX1mdW5jdGlvbiBjdCh0LGUsaSl7dmFyIG8sbixzO2lmKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpcmV0dXJuIHV0LmNhbGwodGhpcyx0LGUsaSk7Zm9yKHRoaXMuX21vbnRoc1BhcnNlfHwodGhpcy5fbW9udGhzUGFyc2U9W10sdGhpcy5fbG9uZ01vbnRoc1BhcnNlPVtdLHRoaXMuX3Nob3J0TW9udGhzUGFyc2U9W10pLG89MDtvPDEyO28rKyl7aWYobj11KFsyZTMsb10pLGkmJiF0aGlzLl9sb25nTW9udGhzUGFyc2Vbb10mJih0aGlzLl9sb25nTW9udGhzUGFyc2Vbb109bmV3IFJlZ0V4cChcIl5cIit0aGlzLm1vbnRocyhuLFwiXCIpLnJlcGxhY2UoXCIuXCIsXCJcIikrXCIkXCIsXCJpXCIpLHRoaXMuX3Nob3J0TW9udGhzUGFyc2Vbb109bmV3IFJlZ0V4cChcIl5cIit0aGlzLm1vbnRoc1Nob3J0KG4sXCJcIikucmVwbGFjZShcIi5cIixcIlwiKStcIiRcIixcImlcIikpLGl8fHRoaXMuX21vbnRoc1BhcnNlW29dfHwocz1cIl5cIit0aGlzLm1vbnRocyhuLFwiXCIpK1wifF5cIit0aGlzLm1vbnRoc1Nob3J0KG4sXCJcIiksdGhpcy5fbW9udGhzUGFyc2Vbb109bmV3IFJlZ0V4cChzLnJlcGxhY2UoXCIuXCIsXCJcIiksXCJpXCIpKSxpJiZcIk1NTU1cIj09PWUmJnRoaXMuX2xvbmdNb250aHNQYXJzZVtvXS50ZXN0KHQpKXJldHVybi
21167BvO2lmKGkmJlwiTU1NXCI9PT1lJiZ0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW29dLnRlc3QodCkpcmV0dXJuIG87aWYoIWkmJnRoaXMuX21vbnRoc1BhcnNlW29dLnRlc3QodCkpcmV0dXJuIG99fWZ1bmN0aW9uIHB0KHQsZSl7dmFyIGk7aWYoIXQuaXNWYWxpZCgpKXJldHVybiB0O2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlKWlmKC9eXFxkKyQvLnRlc3QoZSkpZT1fKGUpO2Vsc2UgaWYoZT10LmxvY2FsZURhdGEoKS5tb250aHNQYXJzZShlKSwhcihlKSlyZXR1cm4gdDtyZXR1cm4gaT1NYXRoLm1pbih0LmRhdGUoKSxodCh0LnllYXIoKSxlKSksdC5fZFtcInNldFwiKyh0Ll9pc1VUQz9cIlVUQ1wiOlwiXCIpK1wiTW9udGhcIl0oZSxpKSx0fWZ1bmN0aW9uIGZ0KHQpe3JldHVybiBudWxsIT10PyhwdCh0aGlzLHQpLGUudXBkYXRlT2Zmc2V0KHRoaXMsITApLHRoaXMpOm90KHRoaXMsXCJNb250aFwiKX1mdW5jdGlvbiBtdCgpe3JldHVybiBodCh0aGlzLnllYXIoKSx0aGlzLm1vbnRoKCkpfWZ1bmN0aW9uIHZ0KHQpe3JldHVybiB0aGlzLl9tb250aHNQYXJzZUV4YWN0PyhkKHRoaXMsXCJfbW9udGhzUmVnZXhcIil8fHl0LmNhbGwodGhpcyksdD90aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4OnRoaXMuX21vbnRoc1Nob3J0UmVnZXgpOihkKHRoaXMsXCJfbW9udGhzU2hvcnRSZWdleFwiKXx8KHRoaXMuX21vbnRoc1Nob3J0UmVnZXg9a24pLHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXgmJnQ/dGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleDp0aGlzLl9tb250aHNTaG9ydFJlZ2V4KX1mdW5jdGlvbiBndCh0KXtyZXR1cm4gdGhpcy5fbW9udGhzUGFyc2VFeGFjdD8oZCh0aGlzLFwiX21vbnRoc1JlZ2V4XCIpfHx5dC5jYWxsKHRoaXMpLHQ/dGhpcy5fbW9udGhzU3RyaWN0UmVnZXg6dGhpcy5fbW9udGhzUmVnZXgpOihkKHRoaXMsXCJfbW9udGhzUmVnZXhcIil8fCh0aGlzLl9tb250aHNSZWdleD1TbiksdGhpcy5fbW9udGhzU3RyaWN0UmVnZXgmJnQ/dGhpcy5fbW9udGhzU3RyaWN0UmVnZXg6dGhpcy5fbW9udGhzUmVnZXgpfWZ1bmN0aW9uIHl0KCl7ZnVuY3Rpb24gdCh0LGUpe3JldHVybiBlLmxlbmd0aC10Lmxlbmd0aH12YXIgZSxpLG89W10sbj1bXSxzPVtdO2ZvcihlPTA7ZTwxMjtlKyspaT11KFsyZTMsZV0pLG8ucHVzaCh0aGlzLm1vbnRoc1Nob3J0KGksXCJcIikpLG4ucHVzaCh0aGlzLm1vbnRocyhpLFwiXCIpKSxzLnB1c2godGhpcy5tb250aHMoaSxcIlwiKSkscy5wdXNoKHRoaXMubW9udGhzU2hvcnQoaSxcIlwiKSk7Zm9yKG8uc29ydCh0KSxuLnNvcnQodCkscy5zb3J0KHQpLGU9MDtlPDEyO2UrKylvW2VdPVoob1tlXSksbltlXT1aKG5bZV0pO2ZvcihlPTA7ZTwyNDtlKyspc1tlXT1aKHNbZV0pO3RoaXMuX21vbnRoc1JlZ2V4PW5ldyBSZWdFeHAoXCJeKFwiK3Muam9pbihcInxcIikrXCIpXCIsXCJpXCIpLHRoaXMuX21vbnRoc1Nob3J0UmVnZXg9dGhpcy5fbW9udGhzUmVnZXgsdGhpcy5fbW9udGhzU3RyaWN0UmVnZXg9bmV3IFJlZ0V4cChcIl4oXCIrbi5qb2luKFwifFwiKStcIilcIixcImlcIiksdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleD1uZXcgUmVnRXhwKFwiXihcIitvLmpvaW4oXCJ8XCIpK1wiKVwiLFwiaVwiKX1mdW5jdGlvbiBidCh0LGUsaSxvLG4scyxyKXt2YXIgYT1uZXcgRGF0ZSh0LGUsaSxvLG4scyxyKTtyZXR1cm4gdDwxMDAmJnQ+PTAmJmlzRmluaXRlKGEuZ2V0RnVsbFllYXIoKSkmJmEuc2V0RnVsbFllYXIodCksYX1mdW5jdGlvbiBfdCh0KXt2YXIgZT1uZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLGFyZ3VtZW50cykpO3JldHVybiB0PDEwMCYmdD49MCYmaXNGaW5pdGUoZS5nZXRVVENGdWxsWWVhcigpKSYmZS5zZXRVVENGdWxsWWVhcih0KSxlfWZ1bmN0aW9uIHd0KHQsZSxpKXt2YXIgbz03K2UtaTtyZXR1cm4tKDcrX3QodCwwLG8pLmdldFVUQ0RheSgpLWUpJTcrby0xfWZ1bmN0aW9uIHh0KHQsZSxpLG8sbil7dmFyIHMscixhPSg3K2ktbyklNyxoPXd0KHQsbyxuKSxkPTErNyooZS0xKSthK2g7cmV0dXJuIGQ8PTA/KHM9dC0xLHI9UShzKStkKTpkPlEodCk/KHM9dCsxLHI9ZC1RKHQpKToocz10LHI9ZCkse3llYXI6cyxkYXlPZlllYXI6cn19ZnVuY3Rpb24ga3QodCxlLGkpe3ZhciBvLG4scz13dCh0LnllYXIoKSxlLGkpLHI9TWF0aC5mbG9vcigodC5kYXlPZlllYXIoKS1zLTEpLzcpKzE7cmV0dXJuIHI8MT8obj10LnllYXIoKS0xLG89citTdChuLGUsaSkpOnI+U3QodC55ZWFyKCksZSxpKT8obz1yLVN0KHQueWVhcigpLGUsaSksbj10LnllYXIoKSsxKToobj10LnllYXIoKSxvPXIpLHt3ZWVrOm8seWVhcjpufX1mdW5jdGlvbiBTdCh0LGUsaSl7dmFyIG89d3QodCxlLGkpLG49d3QodCsxLGUsaSk7cmV0dXJuKFEodCktbytuKS83fWZ1bmN0aW9uIER0KHQpe3JldHVybiBrdCh0LHRoaXMuX3dlZWsuZG93LHRoaXMuX3dlZWsuZG95KS53ZWVrfWZ1bmN0aW9uIE10KCl7cmV0dXJuIHRoaXMuX3dlZWsuZG93fWZ1bmN0aW9uIEN0KCl7cmV0dXJuIHRoaXMuX3dlZWsuZG95fWZ1bmN0aW9uIE90KHQpe3ZhciBlPXRoaXMubG9jYWxlRGF0YSgpLndlZWsodGhpcyk7cmV0dXJuIG51bGw9PXQ/ZTp0aGlzLmFkZCg3Kih0LWUpLFwiZFwiKX1mdW5jdGlvbiBFdCh0KXt2YXIgZT1rdCh0aGlzLDEsNCkud2VlaztyZXR1cm4gbnVsbD09dD9lOnRoaXMuYWRkKDcqKHQtZSksXCJkXCIpfWZ1bmN0aW9uIFR0KHQsZSl7cmV0dXJuXCJzdHJpbmdcIiE9dHlwZW9mIHQ/dDppc05hTih0KT8odD1lLndlZWtkYXlzUGFyc2UodCksXCJudW1iZXJcIj09dHlwZW9mIHQ/dDpudWxsKTpwYXJzZUludCh0LDEwKX1mdW5jdGlvbiBQdCh0LGUpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiB0P2Uud2Vla2RheXNQYXJzZSh0KSU3fHw3OmlzTmFOKHQpP251bGw6dH1mdW5jdGlvbiBJdCh0LGUpe3JldHVybiB0P2kodGhpcy5fd2Vla2RheXMpP3RoaXMuX3dlZWtkYXlzW3QuZGF5KCldOnRoaXMuX3dlZWtkYXlzW3RoaXMuX3dlZWtkYXlzLmlzRm9ybWF0LnRlc3QoZSk/XCJmb3JtYXRcIjpcInN0YW5kYWxvbmVcIl1bdC5kYXkoKV06aSh0aGlzLl93ZWVrZGF5cyk/dGhpcy5fd2Vla2RheXM6dGhpcy5fd2Vla2RheXMuc3RhbmRhbG9uZX1mdW5jdGlvbiBOdCh0KXtyZXR1cm4gdD90aGlzLl93ZWVrZGF5c1Nob3J0W3QuZGF5KCldOnRoaXMuX3dlZWtkYXlzU2hvcnR9ZnVuY3Rpb24gUnQodCl7cmV0dXJuIHQ/dGhpcy5fd2Vla2RheXNNaW5bdC5kYXkoKV06dGhpcy5fd2Vla2RheXNNaW59ZnVuY3Rpb24gQXQo
21167dCxlLGkpe3ZhciBvLG4scyxyPXQudG9Mb2NhbGVMb3dlckNhc2UoKTtpZighdGhpcy5fd2Vla2RheXNQYXJzZSlmb3IodGhpcy5fd2Vla2RheXNQYXJzZT1bXSx0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2U9W10sdGhpcy5fbWluV2Vla2RheXNQYXJzZT1bXSxvPTA7bzw3OysrbylzPXUoWzJlMywxXSkuZGF5KG8pLHRoaXMuX21pbldlZWtkYXlzUGFyc2Vbb109dGhpcy53ZWVrZGF5c01pbihzLFwiXCIpLnRvTG9jYWxlTG93ZXJDYXNlKCksdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW29dPXRoaXMud2Vla2RheXNTaG9ydChzLFwiXCIpLnRvTG9jYWxlTG93ZXJDYXNlKCksdGhpcy5fd2Vla2RheXNQYXJzZVtvXT10aGlzLndlZWtkYXlzKHMsXCJcIikudG9Mb2NhbGVMb3dlckNhc2UoKTtyZXR1cm4gaT9cImRkZGRcIj09PWU/KG49eW4uY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLHIpLC0xIT09bj9uOm51bGwpOlwiZGRkXCI9PT1lPyhuPXluLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLHIpLC0xIT09bj9uOm51bGwpOihuPXluLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSxyKSwtMSE9PW4/bjpudWxsKTpcImRkZGRcIj09PWU/LTEhPT0obj15bi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UscikpP246LTEhPT0obj15bi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSxyKSk/bjoobj15bi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsciksLTEhPT1uP246bnVsbCk6XCJkZGRcIj09PWU/LTEhPT0obj15bi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSxyKSk/bjotMSE9PShuPXluLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSxyKSk/bjoobj15bi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsciksLTEhPT1uP246bnVsbCk6LTEhPT0obj15bi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UscikpP246LTEhPT0obj15bi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UscikpP246KG49eW4uY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsciksLTEhPT1uP246bnVsbCl9ZnVuY3Rpb24genQodCxlLGkpe3ZhciBvLG4scztpZih0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpcmV0dXJuIEF0LmNhbGwodGhpcyx0LGUsaSk7Zm9yKHRoaXMuX3dlZWtkYXlzUGFyc2V8fCh0aGlzLl93ZWVrZGF5c1BhcnNlPVtdLHRoaXMuX21pbldlZWtkYXlzUGFyc2U9W10sdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlPVtdLHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlPVtdKSxvPTA7bzw3O28rKyl7aWYobj11KFsyZTMsMV0pLmRheShvKSxpJiYhdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2Vbb10mJih0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtvXT1uZXcgUmVnRXhwKFwiXlwiK3RoaXMud2Vla2RheXMobixcIlwiKS5yZXBsYWNlKFwiLlwiLFwiLj9cIikrXCIkXCIsXCJpXCIpLHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtvXT1uZXcgUmVnRXhwKFwiXlwiK3RoaXMud2Vla2RheXNTaG9ydChuLFwiXCIpLnJlcGxhY2UoXCIuXCIsXCIuP1wiKStcIiRcIixcImlcIiksdGhpcy5fbWluV2Vla2RheXNQYXJzZVtvXT1uZXcgUmVnRXhwKFwiXlwiK3RoaXMud2Vla2RheXNNaW4obixcIlwiKS5yZXBsYWNlKFwiLlwiLFwiLj9cIikrXCIkXCIsXCJpXCIpKSx0aGlzLl93ZWVrZGF5c1BhcnNlW29dfHwocz1cIl5cIit0aGlzLndlZWtkYXlzKG4sXCJcIikrXCJ8XlwiK3RoaXMud2Vla2RheXNTaG9ydChuLFwiXCIpK1wifF5cIit0aGlzLndlZWtkYXlzTWluKG4sXCJcIiksdGhpcy5fd2Vla2RheXNQYXJzZVtvXT1uZXcgUmVnRXhwKHMucmVwbGFjZShcIi5cIixcIlwiKSxcImlcIikpLGkmJlwiZGRkZFwiPT09ZSYmdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2Vbb10udGVzdCh0KSlyZXR1cm4gbztpZihpJiZcImRkZFwiPT09ZSYmdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW29dLnRlc3QodCkpcmV0dXJuIG87aWYoaSYmXCJkZFwiPT09ZSYmdGhpcy5fbWluV2Vla2RheXNQYXJzZVtvXS50ZXN0KHQpKXJldHVybiBvO2lmKCFpJiZ0aGlzLl93ZWVrZGF5c1BhcnNlW29dLnRlc3QodCkpcmV0dXJuIG99fWZ1bmN0aW9uIEx0KHQpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gbnVsbCE9dD90aGlzOk5hTjt2YXIgZT10aGlzLl9pc1VUQz90aGlzLl9kLmdldFVUQ0RheSgpOnRoaXMuX2QuZ2V0RGF5KCk7cmV0dXJuIG51bGwhPXQ/KHQ9VHQodCx0aGlzLmxvY2FsZURhdGEoKSksdGhpcy5hZGQodC1lLFwiZFwiKSk6ZX1mdW5jdGlvbiBGdCh0KXtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG51bGwhPXQ/dGhpczpOYU47dmFyIGU9KHRoaXMuZGF5KCkrNy10aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3cpJTc7cmV0dXJuIG51bGw9PXQ/ZTp0aGlzLmFkZCh0LWUsXCJkXCIpfWZ1bmN0aW9uIEJ0KHQpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gbnVsbCE9dD90aGlzOk5hTjtpZihudWxsIT10KXt2YXIgZT1QdCh0LHRoaXMubG9jYWxlRGF0YSgpKTtyZXR1cm4gdGhpcy5kYXkodGhpcy5kYXkoKSU3P2U6ZS03KX1yZXR1cm4gdGhpcy5kYXkoKXx8N31mdW5jdGlvbiBqdCh0KXtyZXR1cm4gdGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0PyhkKHRoaXMsXCJfd2Vla2RheXNSZWdleFwiKXx8WXQuY2FsbCh0aGlzKSx0P3RoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNSZWdleCk6KGQodGhpcyxcIl93ZWVrZGF5c1JlZ2V4XCIpfHwodGhpcy5fd2Vla2RheXNSZWdleD1FbiksdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCYmdD90aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzUmVnZXgpfWZ1bmN0aW9uIEh0KHQpe3JldHVybiB0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3Q/KGQodGhpcyxcIl93ZWVrZGF5c1JlZ2V4XCIpfHxZdC5jYWxsKHRoaXMpLHQ/dGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleCk6KGQodGhpcyxcIl93ZWVrZGF5c1Nob3J0UmVnZXhcIil8fCh0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXg9VG4pLHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCYmdD90aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4KX1mdW5jdGlvbiBXdCh0KXtyZXR1cm4gdGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0PyhkKHRoaXMsXCJfd2Vla2RheXNSZWdleFwiKXx8WXQuY2FsbCh0aGlzKSx0P3RoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNNaW5SZWdleCk6KGQodGhpcyxcIl93ZWVrZGF5c01pblJlZ2V4XCIpfHwodGhpcy5fd2Vla2RheXNNaW5SZWdleD1QbiksdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCYmdD90aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzTWluUmVnZXgpfWZ1bmN0aW9uIFl0KCl7ZnVuY3Rpb24gdCh0LGUpe3JldHVybiBlLmxlbmd0aC10Lmxlbmd0aH12YXIgZSxpLG8sbixzLHI9W10sYT1bXSxoPVtdLGQ9W107Zm9yKGU9MDtlPDc7ZSsrKWk9dShbMmUzLDFdKS5kYXkoZSksbz10aGlzLndlZWtkYXlzTWluKGksXCJcIiksbj10aGlzLndlZWtkYXlzU2hvcnQoaSxcIlwiKSxzPXRoaXMud2Vla2RheXMoaSxcIlwiKSxyLnB1c2gobyksYS5wdXNoKG4pLGgucHVzaChzKSxkLnB1c2gobyks
21167ZC5wdXNoKG4pLGQucHVzaChzKTtmb3Ioci5zb3J0KHQpLGEuc29ydCh0KSxoLnNvcnQodCksZC5zb3J0KHQpLGU9MDtlPDc7ZSsrKWFbZV09WihhW2VdKSxoW2VdPVooaFtlXSksZFtlXT1aKGRbZV0pO3RoaXMuX3dlZWtkYXlzUmVnZXg9bmV3IFJlZ0V4cChcIl4oXCIrZC5qb2luKFwifFwiKStcIilcIixcImlcIiksdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4PXRoaXMuX3dlZWtkYXlzUmVnZXgsdGhpcy5fd2Vla2RheXNNaW5SZWdleD10aGlzLl93ZWVrZGF5c1JlZ2V4LHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXg9bmV3IFJlZ0V4cChcIl4oXCIraC5qb2luKFwifFwiKStcIilcIixcImlcIiksdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4PW5ldyBSZWdFeHAoXCJeKFwiK2Euam9pbihcInxcIikrXCIpXCIsXCJpXCIpLHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXg9bmV3IFJlZ0V4cChcIl4oXCIrci5qb2luKFwifFwiKStcIilcIixcImlcIil9ZnVuY3Rpb24gR3QoKXtyZXR1cm4gdGhpcy5ob3VycygpJTEyfHwxMn1mdW5jdGlvbiBWdCgpe3JldHVybiB0aGlzLmhvdXJzKCl8fDI0fWZ1bmN0aW9uIFV0KHQsZSl7SCh0LDAsMCxmdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tZXJpZGllbSh0aGlzLmhvdXJzKCksdGhpcy5taW51dGVzKCksZSl9KX1mdW5jdGlvbiBxdCh0LGUpe3JldHVybiBlLl9tZXJpZGllbVBhcnNlfWZ1bmN0aW9uIFh0KHQpe3JldHVyblwicFwiPT09KHQrXCJcIikudG9Mb3dlckNhc2UoKS5jaGFyQXQoMCl9ZnVuY3Rpb24gWnQodCxlLGkpe3JldHVybiB0PjExP2k/XCJwbVwiOlwiUE1cIjppP1wiYW1cIjpcIkFNXCJ9ZnVuY3Rpb24gS3QodCl7cmV0dXJuIHQ/dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoXCJfXCIsXCItXCIpOnR9ZnVuY3Rpb24gSnQodCl7Zm9yKHZhciBlLGksbyxuLHM9MDtzPHQubGVuZ3RoOyl7Zm9yKG49S3QodFtzXSkuc3BsaXQoXCItXCIpLGU9bi5sZW5ndGgsaT1LdCh0W3MrMV0pLGk9aT9pLnNwbGl0KFwiLVwiKTpudWxsO2U+MDspe2lmKG89JHQobi5zbGljZSgwLGUpLmpvaW4oXCItXCIpKSlyZXR1cm4gbztpZihpJiZpLmxlbmd0aD49ZSYmdyhuLGksITApPj1lLTEpYnJlYWs7ZS0tfXMrK31yZXR1cm4gbnVsbH1mdW5jdGlvbiAkdChlKXt2YXIgaT1udWxsO2lmKCF6bltlXSYmdm9pZCAwIT09dCYmdCYmdC5leHBvcnRzKXRyeXtpPUluLl9hYmJyOyFmdW5jdGlvbigpe3ZhciB0PW5ldyBFcnJvcignQ2Fubm90IGZpbmQgbW9kdWxlIFwiLi9sb2NhbGVcIicpO3Rocm93IHQuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIix0fSgpLFF0KGkpfWNhdGNoKHQpe31yZXR1cm4gem5bZV19ZnVuY3Rpb24gUXQodCxlKXt2YXIgaTtyZXR1cm4gdCYmKGk9cyhlKT9pZSh0KTp0ZSh0LGUpKSYmKEluPWkpLEluLl9hYmJyfWZ1bmN0aW9uIHRlKHQsZSl7aWYobnVsbCE9PWUpe3ZhciBpPUFuO2lmKGUuYWJicj10LG51bGwhPXpuW3RdKVMoXCJkZWZpbmVMb2NhbGVPdmVycmlkZVwiLFwidXNlIG1vbWVudC51cGRhdGVMb2NhbGUobG9jYWxlTmFtZSwgY29uZmlnKSB0byBjaGFuZ2UgYW4gZXhpc3RpbmcgbG9jYWxlLiBtb21lbnQuZGVmaW5lTG9jYWxlKGxvY2FsZU5hbWUsIGNvbmZpZykgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY3JlYXRpbmcgYSBuZXcgbG9jYWxlIFNlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2RlZmluZS1sb2NhbGUvIGZvciBtb3JlIGluZm8uXCIpLGk9em5bdF0uX2NvbmZpZztlbHNlIGlmKG51bGwhPWUucGFyZW50TG9jYWxlKXtpZihudWxsPT16bltlLnBhcmVudExvY2FsZV0pcmV0dXJuIExuW2UucGFyZW50TG9jYWxlXXx8KExuW2UucGFyZW50TG9jYWxlXT1bXSksTG5bZS5wYXJlbnRMb2NhbGVdLnB1c2goe25hbWU6dCxjb25maWc6ZX0pLG51bGw7aT16bltlLnBhcmVudExvY2FsZV0uX2NvbmZpZ31yZXR1cm4gem5bdF09bmV3IE8oQyhpLGUpKSxMblt0XSYmTG5bdF0uZm9yRWFjaChmdW5jdGlvbih0KXt0ZSh0Lm5hbWUsdC5jb25maWcpfSksUXQodCksem5bdF19cmV0dXJuIGRlbGV0ZSB6blt0XSxudWxsfWZ1bmN0aW9uIGVlKHQsZSl7aWYobnVsbCE9ZSl7dmFyIGksbz1BbjtudWxsIT16blt0XSYmKG89em5bdF0uX2NvbmZpZyksZT1DKG8sZSksaT1uZXcgTyhlKSxpLnBhcmVudExvY2FsZT16blt0XSx6blt0XT1pLFF0KHQpfWVsc2UgbnVsbCE9em5bdF0mJihudWxsIT16blt0XS5wYXJlbnRMb2NhbGU/em5bdF09em5bdF0ucGFyZW50TG9jYWxlOm51bGwhPXpuW3RdJiZkZWxldGUgem5bdF0pO3JldHVybiB6blt0XX1mdW5jdGlvbiBpZSh0KXt2YXIgZTtpZih0JiZ0Ll9sb2NhbGUmJnQuX2xvY2FsZS5fYWJiciYmKHQ9dC5fbG9jYWxlLl9hYmJyKSwhdClyZXR1cm4gSW47aWYoIWkodCkpe2lmKGU9JHQodCkpcmV0dXJuIGU7dD1bdF19cmV0dXJuIEp0KHQpfWZ1bmN0aW9uIG9lKCl7cmV0dXJuIElvKHpuKX1mdW5jdGlvbiBuZSh0KXt2YXIgZSxpPXQuX2E7cmV0dXJuIGkmJi0yPT09cCh0KS5vdmVyZmxvdyYmKGU9aVtsbl08MHx8aVtsbl0+MTE/bG46aVt1bl08MXx8aVt1bl0+aHQoaVtkbl0saVtsbl0pP3VuOmlbY25dPDB8fGlbY25dPjI0fHwyND09PWlbY25dJiYoMCE9PWlbcG5dfHwwIT09aVtmbl18fDAhPT1pW21uXSk/Y246aVtwbl08MHx8aVtwbl0+NTk/cG46aVtmbl08MHx8aVtmbl0+NTk/Zm46aVttbl08MHx8aVttbl0+OTk5P21uOi0xLHAodCkuX292ZXJmbG93RGF5T2ZZZWFyJiYoZTxkbnx8ZT51bikmJihlPXVuKSxwKHQpLl9vdmVyZmxvd1dlZWtzJiYtMT09PWUmJihlPXZuKSxwKHQpLl9vdmVyZmxvd1dlZWtkYXkmJi0xPT09ZSYmKGU9Z24pLHAodCkub3ZlcmZsb3c9ZSksdH1mdW5jdGlvbiBzZSh0LGUsaSl7cmV0dXJuIG51bGwhPXQ/dDpudWxsIT1lP2U6aX1mdW5jdGlvbiByZSh0KXt2YXIgaT1uZXcgRGF0ZShlLm5vdygpKTtyZXR1cm4gdC5fdXNlVVRDP1tpLmdldFVUQ0Z1bGxZZWFyKCksaS5nZXRVVENNb250aCgpLGkuZ2V0VVRDRGF0ZSgpXTpbaS5nZXRGdWxsWWVhcigpLGkuZ2V0TW9udGgoKSxpLmdldERhdGUoKV19ZnVuY3Rpb24gYWUodCl7dmFyIGUsaSxvLG4scz1bXTtpZighdC5fZCl7Zm9yKG89cmUodCksdC5fdyYmbnVsbD09dC5fYVt1bl0mJm51bGw9PXQuX2FbbG5dJiZoZSh0KSxudWxsIT10Ll9kYXlPZlllYXImJihuPXNlKHQuX2FbZG5dLG9bZG5dKSwodC5fZGF5T2ZZZWFyPlEobil8fDA9PT10Ll9kYXlPZlllYXIpJiYocCh0KS5fb3ZlcmZsb3dEYXlPZlllYXI9ITApLGk9X3QobiwwLHQuX2RheU9mWWVhciksdC5fYVtsbl09aS5nZXRVVENNb250aCgpLHQuX2FbdW5dPWkuZ2V0VVRDRGF0ZSgpKSxlPTA7ZTwzJiZudWxsPT10Ll9hW2VdOysrZSl0Ll9hW2VdPXNbZV09b1tlXTtmb3IoO2U8NztlKyspdC5fYVtlXT1zW2VdPW51bGw9PXQuX2FbZV0/Mj09PWU/MTowOnQuX2FbZV07MjQ9PT10Ll9hW2NuXSYmMD09PXQuX2FbcG5dJiYwPT09dC5fYVtmbl0mJjA9PT10Ll9hW21uXSYmKHQuX25leHREYXk9ITAsdC5fYVtjbl09MCksdC5fZD0odC5fdXNlVVRDP190OmJ0KS5hcHBseShudWxsLHMpLG51bGwhPXQuX3R6bSYmdC5fZC5zZXRVVENNaW51dGVzKHQuX2QuZ2V0VVRDTWludXRlcygpLXQuX3R6bSksdC5fbmV4dERheSYmKHQuX2FbY25dPTI0KSx0Ll93JiZ2b2lkIDAhPT10Ll93LmQmJnQuX3cuZCE9PXQuX2QuZ2V0RGF5KCkmJihwKHQpLndlZWtkYXlNaXNtYX
21167RjaD0hMCl9fWZ1bmN0aW9uIGhlKHQpe3ZhciBlLGksbyxuLHMscixhLGg7aWYoZT10Ll93LG51bGwhPWUuR0d8fG51bGwhPWUuV3x8bnVsbCE9ZS5FKXM9MSxyPTQsaT1zZShlLkdHLHQuX2FbZG5dLGt0KERlKCksMSw0KS55ZWFyKSxvPXNlKGUuVywxKSwoKG49c2UoZS5FLDEpKTwxfHxuPjcpJiYoaD0hMCk7ZWxzZXtzPXQuX2xvY2FsZS5fd2Vlay5kb3cscj10Ll9sb2NhbGUuX3dlZWsuZG95O3ZhciBkPWt0KERlKCkscyxyKTtpPXNlKGUuZ2csdC5fYVtkbl0sZC55ZWFyKSxvPXNlKGUudyxkLndlZWspLG51bGwhPWUuZD8oKG49ZS5kKTwwfHxuPjYpJiYoaD0hMCk6bnVsbCE9ZS5lPyhuPWUuZStzLChlLmU8MHx8ZS5lPjYpJiYoaD0hMCkpOm49c31vPDF8fG8+U3QoaSxzLHIpP3AodCkuX292ZXJmbG93V2Vla3M9ITA6bnVsbCE9aD9wKHQpLl9vdmVyZmxvd1dlZWtkYXk9ITA6KGE9eHQoaSxvLG4scyxyKSx0Ll9hW2RuXT1hLnllYXIsdC5fZGF5T2ZZZWFyPWEuZGF5T2ZZZWFyKX1mdW5jdGlvbiBkZSh0KXt2YXIgZSxpLG8sbixzLHIsYT10Ll9pLGg9Rm4uZXhlYyhhKXx8Qm4uZXhlYyhhKTtpZihoKXtmb3IocCh0KS5pc289ITAsZT0wLGk9SG4ubGVuZ3RoO2U8aTtlKyspaWYoSG5bZV1bMV0uZXhlYyhoWzFdKSl7bj1IbltlXVswXSxvPSExIT09SG5bZV1bMl07YnJlYWt9aWYobnVsbD09bilyZXR1cm4gdm9pZCh0Ll9pc1ZhbGlkPSExKTtpZihoWzNdKXtmb3IoZT0wLGk9V24ubGVuZ3RoO2U8aTtlKyspaWYoV25bZV1bMV0uZXhlYyhoWzNdKSl7cz0oaFsyXXx8XCIgXCIpK1duW2VdWzBdO2JyZWFrfWlmKG51bGw9PXMpcmV0dXJuIHZvaWQodC5faXNWYWxpZD0hMSl9aWYoIW8mJm51bGwhPXMpcmV0dXJuIHZvaWQodC5faXNWYWxpZD0hMSk7aWYoaFs0XSl7aWYoIWpuLmV4ZWMoaFs0XSkpcmV0dXJuIHZvaWQodC5faXNWYWxpZD0hMSk7cj1cIlpcIn10Ll9mPW4rKHN8fFwiXCIpKyhyfHxcIlwiKSxnZSh0KX1lbHNlIHQuX2lzVmFsaWQ9ITF9ZnVuY3Rpb24gbGUodCxlLGksbyxuLHMpe3ZhciByPVt1ZSh0KSx4bi5pbmRleE9mKGUpLHBhcnNlSW50KGksMTApLHBhcnNlSW50KG8sMTApLHBhcnNlSW50KG4sMTApXTtyZXR1cm4gcyYmci5wdXNoKHBhcnNlSW50KHMsMTApKSxyfWZ1bmN0aW9uIHVlKHQpe3ZhciBlPXBhcnNlSW50KHQsMTApO3JldHVybiBlPD00OT8yZTMrZTplPD05OTk/MTkwMCtlOmV9ZnVuY3Rpb24gY2UodCl7cmV0dXJuIHQucmVwbGFjZSgvXFwoW14pXSpcXCl8W1xcblxcdF0vZyxcIiBcIikucmVwbGFjZSgvKFxcc1xccyspL2csXCIgXCIpLnRyaW0oKX1mdW5jdGlvbiBwZSh0LGUsaSl7aWYodCl7aWYoQ24uaW5kZXhPZih0KSE9PW5ldyBEYXRlKGVbMF0sZVsxXSxlWzJdKS5nZXREYXkoKSlyZXR1cm4gcChpKS53ZWVrZGF5TWlzbWF0Y2g9ITAsaS5faXNWYWxpZD0hMSwhMX1yZXR1cm4hMH1mdW5jdGlvbiBmZSh0LGUsaSl7aWYodClyZXR1cm4gVm5bdF07aWYoZSlyZXR1cm4gMDt2YXIgbz1wYXJzZUludChpLDEwKSxuPW8lMTAwO3JldHVybihvLW4pLzEwMCo2MCtufWZ1bmN0aW9uIG1lKHQpe3ZhciBlPUduLmV4ZWMoY2UodC5faSkpO2lmKGUpe3ZhciBpPWxlKGVbNF0sZVszXSxlWzJdLGVbNV0sZVs2XSxlWzddKTtpZighcGUoZVsxXSxpLHQpKXJldHVybjt0Ll9hPWksdC5fdHptPWZlKGVbOF0sZVs5XSxlWzEwXSksdC5fZD1fdC5hcHBseShudWxsLHQuX2EpLHQuX2Quc2V0VVRDTWludXRlcyh0Ll9kLmdldFVUQ01pbnV0ZXMoKS10Ll90em0pLHAodCkucmZjMjgyMj0hMH1lbHNlIHQuX2lzVmFsaWQ9ITF9ZnVuY3Rpb24gdmUodCl7dmFyIGk9WW4uZXhlYyh0Ll9pKTtpZihudWxsIT09aSlyZXR1cm4gdm9pZCh0Ll9kPW5ldyBEYXRlKCtpWzFdKSk7ZGUodCksITE9PT10Ll9pc1ZhbGlkJiYoZGVsZXRlIHQuX2lzVmFsaWQsbWUodCksITE9PT10Ll9pc1ZhbGlkJiYoZGVsZXRlIHQuX2lzVmFsaWQsZS5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayh0KSkpfWZ1bmN0aW9uIGdlKHQpe2lmKHQuX2Y9PT1lLklTT184NjAxKXJldHVybiB2b2lkIGRlKHQpO2lmKHQuX2Y9PT1lLlJGQ18yODIyKXJldHVybiB2b2lkIG1lKHQpO3QuX2E9W10scCh0KS5lbXB0eT0hMDt2YXIgaSxvLG4scyxyLGE9XCJcIit0Ll9pLGg9YS5sZW5ndGgsZD0wO2ZvcihuPVYodC5fZix0Ll9sb2NhbGUpLm1hdGNoKEJvKXx8W10saT0wO2k8bi5sZW5ndGg7aSsrKXM9bltpXSxvPShhLm1hdGNoKHEocyx0KSl8fFtdKVswXSxvJiYocj1hLnN1YnN0cigwLGEuaW5kZXhPZihvKSksci5sZW5ndGg+MCYmcCh0KS51bnVzZWRJbnB1dC5wdXNoKHIpLGE9YS5zbGljZShhLmluZGV4T2Yobykrby5sZW5ndGgpLGQrPW8ubGVuZ3RoKSxXb1tzXT8obz9wKHQpLmVtcHR5PSExOnAodCkudW51c2VkVG9rZW5zLnB1c2gocyksJChzLG8sdCkpOnQuX3N0cmljdCYmIW8mJnAodCkudW51c2VkVG9rZW5zLnB1c2gocyk7cCh0KS5jaGFyc0xlZnRPdmVyPWgtZCxhLmxlbmd0aD4wJiZwKHQpLnVudXNlZElucHV0LnB1c2goYSksdC5fYVtjbl08PTEyJiYhMD09PXAodCkuYmlnSG91ciYmdC5fYVtjbl0+MCYmKHAodCkuYmlnSG91cj12b2lkIDApLHAodCkucGFyc2VkRGF0ZVBhcnRzPXQuX2Euc2xpY2UoMCkscCh0KS5tZXJpZGllbT10Ll9tZXJpZGllbSx0Ll9hW2NuXT15ZSh0Ll9sb2NhbGUsdC5fYVtjbl0sdC5fbWVyaWRpZW0pLGFlKHQpLG5lKHQpfWZ1bmN0aW9uIHllKHQsZSxpKXt2YXIgbztyZXR1cm4gbnVsbD09aT9lOm51bGwhPXQubWVyaWRpZW1Ib3VyP3QubWVyaWRpZW1Ib3VyKGUsaSk6bnVsbCE9dC5pc1BNPyhvPXQuaXNQTShpKSxvJiZlPDEyJiYoZSs9MTIpLG98fDEyIT09ZXx8KGU9MCksZSk6ZX1mdW5jdGlvbiBiZSh0KXt2YXIgZSxpLG8sbixzO2lmKDA9PT10Ll9mLmxlbmd0aClyZXR1cm4gcCh0KS5pbnZhbGlkRm9ybWF0PSEwLHZvaWQodC5fZD1uZXcgRGF0ZShOYU4pKTtmb3Iobj0wO248dC5fZi5sZW5ndGg7bisrKXM9MCxlPXYoe30sdCksbnVsbCE9dC5fdXNlVVRDJiYoZS5fdXNlVVRDPXQuX3VzZVVUQyksZS5fZj10Ll9mW25dLGdlKGUpLGYoZSkmJihzKz1wKGUpLmNoYXJzTGVmdE92ZXIscys9MTAqcChlKS51bnVzZWRUb2tlbnMubGVuZ3RoLHAoZSkuc2Nvcm
21167U9cywobnVsbD09b3x8czxvKSYmKG89cyxpPWUpKTtsKHQsaXx8ZSl9ZnVuY3Rpb24gX2UodCl7aWYoIXQuX2Qpe3ZhciBlPUwodC5faSk7dC5fYT1oKFtlLnllYXIsZS5tb250aCxlLmRheXx8ZS5kYXRlLGUuaG91cixlLm1pbnV0ZSxlLnNlY29uZCxlLm1pbGxpc2Vjb25kXSxmdW5jdGlvbih0KXtyZXR1cm4gdCYmcGFyc2VJbnQodCwxMCl9KSxhZSh0KX19ZnVuY3Rpb24gd2UodCl7dmFyIGU9bmV3IGcobmUoeGUodCkpKTtyZXR1cm4gZS5fbmV4dERheSYmKGUuYWRkKDEsXCJkXCIpLGUuX25leHREYXk9dm9pZCAwKSxlfWZ1bmN0aW9uIHhlKHQpe3ZhciBlPXQuX2ksbz10Ll9mO3JldHVybiB0Ll9sb2NhbGU9dC5fbG9jYWxlfHxpZSh0Ll9sKSxudWxsPT09ZXx8dm9pZCAwPT09byYmXCJcIj09PWU/bSh7bnVsbElucHV0OiEwfSk6KFwic3RyaW5nXCI9PXR5cGVvZiBlJiYodC5faT1lPXQuX2xvY2FsZS5wcmVwYXJzZShlKSkseShlKT9uZXcgZyhuZShlKSk6KGEoZSk/dC5fZD1lOmkobyk/YmUodCk6bz9nZSh0KTprZSh0KSxmKHQpfHwodC5fZD1udWxsKSx0KSl9ZnVuY3Rpb24ga2UodCl7dmFyIG49dC5faTtzKG4pP3QuX2Q9bmV3IERhdGUoZS5ub3coKSk6YShuKT90Ll9kPW5ldyBEYXRlKG4udmFsdWVPZigpKTpcInN0cmluZ1wiPT10eXBlb2Ygbj92ZSh0KTppKG4pPyh0Ll9hPWgobi5zbGljZSgwKSxmdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VJbnQodCwxMCl9KSxhZSh0KSk6byhuKT9fZSh0KTpyKG4pP3QuX2Q9bmV3IERhdGUobik6ZS5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayh0KX1mdW5jdGlvbiBTZSh0LGUscyxyLGEpe3ZhciBoPXt9O3JldHVybiEwIT09cyYmITEhPT1zfHwocj1zLHM9dm9pZCAwKSwobyh0KSYmbih0KXx8aSh0KSYmMD09PXQubGVuZ3RoKSYmKHQ9dm9pZCAwKSxoLl9pc0FNb21lbnRPYmplY3Q9ITAsaC5fdXNlVVRDPWguX2lzVVRDPWEsaC5fbD1zLGguX2k9dCxoLl9mPWUsaC5fc3RyaWN0PXIsd2UoaCl9ZnVuY3Rpb24gRGUodCxlLGksbyl7cmV0dXJuIFNlKHQsZSxpLG8sITEpfWZ1bmN0aW9uIE1lKHQsZSl7dmFyIG8sbjtpZigxPT09ZS5sZW5ndGgmJmkoZVswXSkmJihlPWVbMF0pLCFlLmxlbmd0aClyZXR1cm4gRGUoKTtmb3Iobz1lWzBdLG49MTtuPGUubGVuZ3RoOysrbillW25dLmlzVmFsaWQoKSYmIWVbbl1bdF0obyl8fChvPWVbbl0pO3JldHVybiBvfWZ1bmN0aW9uIENlKCl7cmV0dXJuIE1lKFwiaXNCZWZvcmVcIixbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSl9ZnVuY3Rpb24gT2UoKXtyZXR1cm4gTWUoXCJpc0FmdGVyXCIsW10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpfWZ1bmN0aW9uIEVlKHQpe2Zvcih2YXIgZSBpbiB0KWlmKC0xPT09eW4uY2FsbChabixlKXx8bnVsbCE9dFtlXSYmaXNOYU4odFtlXSkpcmV0dXJuITE7Zm9yKHZhciBpPSExLG89MDtvPFpuLmxlbmd0aDsrK28paWYodFtabltvXV0pe2lmKGkpcmV0dXJuITE7cGFyc2VGbG9hdCh0W1puW29dXSkhPT1fKHRbWm5bb11dKSYmKGk9ITApfXJldHVybiEwfWZ1bmN0aW9uIFRlKCl7cmV0dXJuIHRoaXMuX2lzVmFsaWR9ZnVuY3Rpb24gUGUoKXtyZXR1cm4gS2UoTmFOKX1mdW5jdGlvbiBJZSh0KXt2YXIgZT1MKHQpLGk9ZS55ZWFyfHwwLG89ZS5xdWFydGVyfHwwLG49ZS5tb250aHx8MCxzPWUud2Vla3x8MCxyPWUuZGF5fHwwLGE9ZS5ob3VyfHwwLGg9ZS5taW51dGV8fDAsZD1lLnNlY29uZHx8MCxsPWUubWlsbGlzZWNvbmR8fDA7dGhpcy5faXNWYWxpZD1FZShlKSx0aGlzLl9taWxsaXNlY29uZHM9K2wrMWUzKmQrNmU0KmgrMWUzKmEqNjAqNjAsdGhpcy5fZGF5cz0rcis3KnMsdGhpcy5fbW9udGhzPStuKzMqbysxMippLHRoaXMuX2RhdGE9e30sdGhpcy5fbG9jYWxlPWllKCksdGhpcy5fYnViYmxlKCl9ZnVuY3Rpb24gTmUodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBJZX1mdW5jdGlvbiBSZSh0KXtyZXR1cm4gdDwwPy0xKk1hdGgucm91bmQoLTEqdCk6TWF0aC5yb3VuZCh0KX1mdW5jdGlvbiBBZSh0LGUpe0godCwwLDAsZnVuY3Rpb24oKXt2YXIgdD10aGlzLnV0Y09mZnNldCgpLGk9XCIrXCI7cmV0dXJuIHQ8MCYmKHQ9LXQsaT1cIi1cIiksaStqKH5+KHQvNjApLDIpK2Uraih+fnQlNjAsMil9KX1mdW5jdGlvbiB6ZSh0LGUpe3ZhciBpPShlfHxcIlwiKS5tYXRjaCh0KTtpZihudWxsPT09aSlyZXR1cm4gbnVsbDt2YXIgbz1pW2kubGVuZ3RoLTFdfHxbXSxuPShvK1wiXCIpLm1hdGNoKEtuKXx8W1wiLVwiLDAsMF0scz02MCpuWzFdK18oblsyXSk7cmV0dXJuIDA9PT1zPzA6XCIrXCI9PT1uWzBdP3M6LXN9ZnVuY3Rpb24gTGUodCxpKXt2YXIgbyxuO3JldHVybiBpLl9pc1VUQz8obz1pLmNsb25lKCksbj0oeSh0KXx8YSh0KT90LnZhbHVlT2YoKTpEZSh0KS52YWx1ZU9mKCkpLW8udmFsdWVPZigpLG8uX2Quc2V0VGltZShvLl9kLnZhbHVlT2YoKStuKSxlLnVwZGF0ZU9mZnNldChvLCExKSxvKTpEZSh0KS5sb2NhbCgpfWZ1bmN0aW9uIEZlKHQpe3JldHVybiAxNSotTWF0aC5yb3VuZCh0Ll9kLmdldFRpbWV6b25lT2Zmc2V0KCkvMTUpfWZ1bmN0aW9uIEJlKHQsaSxvKXt2YXIgbixzPXRoaXMuX29mZnNldHx8MDtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG51bGwhPXQ/dGhpczpOYU47aWYobnVsbCE9dCl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe2lmKG51bGw9PT0odD16ZShubix0KSkpcmV0dXJuIHRoaXN9ZWxzZSBNYXRoLmFicyh0KTwxNiYmIW8mJih0Kj02MCk7cmV0dXJuIXRoaXMuX2lzVVRDJiZpJiYobj1GZSh0aGlzKSksdGhpcy5fb2Zmc2V0PXQsdGhpcy5faXNVVEM9ITAsbnVsbCE9biYmdGhpcy5hZGQobixcIm1cIikscyE9PXQmJighaXx8dGhpcy5fY2hhbmdlSW5Qcm9ncmVzcz9laSh0aGlzLEtlKHQtcyxcIm1cIiksMSwhMSk6dGhpcy5fY2hhbmdlSW5Qcm9ncmVzc3x8KHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3M9ITAsZS51cGRhdGVPZmZzZXQodGhpcywhMCksdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcz1udWxsKSksdGhpc31yZXR1cm4gdGhpcy5faXNVVEM/czpGZSh0aGlzKX1mdW5jdGlvbiBqZSh0LGUpe3JldHVybiBudWxsIT10PyhcInN0cmluZ1wiIT10eXBlb2YgdCYmKHQ9LXQpLHRoaXMudXRjT2Zmc2V0KHQsZSksdGhpcyk6LXRoaXMudXRjT2Zmc2V0KCl9ZnVuY3Rpb24gSGUodCl7cmV0dXJuIHRoaXMudXRjT2Zmc2V0KDAsdCl9ZnVuY3Rpb24gV2UodCl7cmV0dXJuIHRoaXMuX2lzVVRDJiYodGhpcy51dGNPZmZzZXQoMCx0KSx0aGlzLl9pc1VUQz0hMSx0JiZ0aGlzLnN1YnRyYWN0KEZlKHRoaXMpLFwibVwiKSksdGhpc31mdW5jdGlvbiBZZSgpe2lmKG51bGwhPXRoaXMuX3R6bSl0aGlzLnV0Y09mZnNldCh0aGlzLl90em0sITEsITApO2Vsc2UgaWYoXCJzdHJpbmdcIj09dHlwZW9mIHRoaXMuX2kpe3ZhciB0PXplKG9uLHR
21167oaXMuX2kpO251bGwhPXQ/dGhpcy51dGNPZmZzZXQodCk6dGhpcy51dGNPZmZzZXQoMCwhMCl9cmV0dXJuIHRoaXN9ZnVuY3Rpb24gR2UodCl7cmV0dXJuISF0aGlzLmlzVmFsaWQoKSYmKHQ9dD9EZSh0KS51dGNPZmZzZXQoKTowLCh0aGlzLnV0Y09mZnNldCgpLXQpJTYwPT0wKX1mdW5jdGlvbiBWZSgpe3JldHVybiB0aGlzLnV0Y09mZnNldCgpPnRoaXMuY2xvbmUoKS5tb250aCgwKS51dGNPZmZzZXQoKXx8dGhpcy51dGNPZmZzZXQoKT50aGlzLmNsb25lKCkubW9udGgoNSkudXRjT2Zmc2V0KCl9ZnVuY3Rpb24gVWUoKXtpZighcyh0aGlzLl9pc0RTVFNoaWZ0ZWQpKXJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7dmFyIHQ9e307aWYodih0LHRoaXMpLHQ9eGUodCksdC5fYSl7dmFyIGU9dC5faXNVVEM/dSh0Ll9hKTpEZSh0Ll9hKTt0aGlzLl9pc0RTVFNoaWZ0ZWQ9dGhpcy5pc1ZhbGlkKCkmJncodC5fYSxlLnRvQXJyYXkoKSk+MH1lbHNlIHRoaXMuX2lzRFNUU2hpZnRlZD0hMTtyZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkfWZ1bmN0aW9uIHFlKCl7cmV0dXJuISF0aGlzLmlzVmFsaWQoKSYmIXRoaXMuX2lzVVRDfWZ1bmN0aW9uIFhlKCl7cmV0dXJuISF0aGlzLmlzVmFsaWQoKSYmdGhpcy5faXNVVEN9ZnVuY3Rpb24gWmUoKXtyZXR1cm4hIXRoaXMuaXNWYWxpZCgpJiYodGhpcy5faXNVVEMmJjA9PT10aGlzLl9vZmZzZXQpfWZ1bmN0aW9uIEtlKHQsZSl7dmFyIGksbyxuLHM9dCxhPW51bGw7cmV0dXJuIE5lKHQpP3M9e21zOnQuX21pbGxpc2Vjb25kcyxkOnQuX2RheXMsTTp0Ll9tb250aHN9OnIodCk/KHM9e30sZT9zW2VdPXQ6cy5taWxsaXNlY29uZHM9dCk6KGE9Sm4uZXhlYyh0KSk/KGk9XCItXCI9PT1hWzFdPy0xOjEscz17eTowLGQ6XyhhW3VuXSkqaSxoOl8oYVtjbl0pKmksbTpfKGFbcG5dKSppLHM6XyhhW2ZuXSkqaSxtczpfKFJlKDFlMyphW21uXSkpKml9KTooYT0kbi5leGVjKHQpKT8oaT1cIi1cIj09PWFbMV0/LTE6KGFbMV0sMSkscz17eTpKZShhWzJdLGkpLE06SmUoYVszXSxpKSx3OkplKGFbNF0saSksZDpKZShhWzVdLGkpLGg6SmUoYVs2XSxpKSxtOkplKGFbN10saSksczpKZShhWzhdLGkpfSk6bnVsbD09cz9zPXt9Olwib2JqZWN0XCI9PXR5cGVvZiBzJiYoXCJmcm9tXCJpbiBzfHxcInRvXCJpbiBzKSYmKG49UWUoRGUocy5mcm9tKSxEZShzLnRvKSkscz17fSxzLm1zPW4ubWlsbGlzZWNvbmRzLHMuTT1uLm1vbnRocyksbz1uZXcgSWUocyksTmUodCkmJmQodCxcIl9sb2NhbGVcIikmJihvLl9sb2NhbGU9dC5fbG9jYWxlKSxvfWZ1bmN0aW9uIEplKHQsZSl7dmFyIGk9dCYmcGFyc2VGbG9hdCh0LnJlcGxhY2UoXCIsXCIsXCIuXCIpKTtyZXR1cm4oaXNOYU4oaSk/MDppKSplfWZ1bmN0aW9uICRlKHQsZSl7dmFyIGk9e21pbGxpc2Vjb25kczowLG1vbnRoczowfTtyZXR1cm4gaS5tb250aHM9ZS5tb250aCgpLXQubW9udGgoKSsxMiooZS55ZWFyKCktdC55ZWFyKCkpLHQuY2xvbmUoKS5hZGQoaS5tb250aHMsXCJNXCIpLmlzQWZ0ZXIoZSkmJi0taS5tb250aHMsaS5taWxsaXNlY29uZHM9K2UtK3QuY2xvbmUoKS5hZGQoaS5tb250aHMsXCJNXCIpLGl9ZnVuY3Rpb24gUWUodCxlKXt2YXIgaTtyZXR1cm4gdC5pc1ZhbGlkKCkmJmUuaXNWYWxpZCgpPyhlPUxlKGUsdCksdC5pc0JlZm9yZShlKT9pPSRlKHQsZSk6KGk9JGUoZSx0KSxpLm1pbGxpc2Vjb25kcz0taS5taWxsaXNlY29uZHMsaS5tb250aHM9LWkubW9udGhzKSxpKTp7bWlsbGlzZWNvbmRzOjAsbW9udGhzOjB9fWZ1bmN0aW9uIHRpKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKGksbyl7dmFyIG4scztyZXR1cm4gbnVsbD09PW98fGlzTmFOKCtvKXx8KFMoZSxcIm1vbWVudCgpLlwiK2UrXCIocGVyaW9kLCBudW1iZXIpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgbW9tZW50KCkuXCIrZStcIihudW1iZXIsIHBlcmlvZCkuIFNlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2FkZC1pbnZlcnRlZC1wYXJhbS8gZm9yIG1vcmUgaW5mby5cIikscz1pLGk9byxvPXMpLGk9XCJzdHJpbmdcIj09dHlwZW9mIGk/K2k6aSxuPUtlKGksbyksZWkodGhpcyxuLHQpLHRoaXN9fWZ1bmN0aW9uIGVpKHQsaSxvLG4pe3ZhciBzPWkuX21pbGxpc2Vjb25kcyxyPVJlKGkuX2RheXMpLGE9UmUoaS5fbW9udGhzKTt0LmlzVmFsaWQoKSYmKG49bnVsbD09bnx8b
21167ixhJiZwdCh0LG90KHQsXCJNb250aFwiKSthKm8pLHImJm50KHQsXCJEYXRlXCIsb3QodCxcIkRhdGVcIikrcipvKSxzJiZ0Ll9kLnNldFRpbWUodC5fZC52YWx1ZU9mKCkrcypvKSxuJiZlLnVwZGF0ZU9mZnNldCh0LHJ8fGEpKX1mdW5jdGlvbiBpaSh0LGUpe3ZhciBpPXQuZGlmZihlLFwiZGF5c1wiLCEwKTtyZXR1cm4gaTwtNj9cInNhbWVFbHNlXCI6aTwtMT9cImxhc3RXZWVrXCI6aTwwP1wibGFzdERheVwiOmk8MT9cInNhbWVEYXlcIjppPDI/XCJuZXh0RGF5XCI6aTw3P1wibmV4dFdlZWtcIjpcInNhbWVFbHNlXCJ9ZnVuY3Rpb24gb2kodCxpKXt2YXIgbz10fHxEZSgpLG49TGUobyx0aGlzKS5zdGFydE9mKFwiZGF5XCIpLHM9ZS5jYWxlbmRhckZvcm1hdCh0aGlzLG4pfHxcInNhbWVFbHNlXCIscj1pJiYoRChpW3NdKT9pW3NdLmNhbGwodGhpcyxvKTppW3NdKTtyZXR1cm4gdGhpcy5mb3JtYXQocnx8dGhpcy5sb2NhbGVEYXRhKCkuY2FsZW5kYXIocyx0aGlzLERlKG8pKSl9ZnVuY3Rpb24gbmkoKXtyZXR1cm4gbmV3IGcodGhpcyl9ZnVuY3Rpb24gc2kodCxlKXt2YXIgaT15KHQpP3Q6RGUodCk7cmV0dXJuISghdGhpcy5pc1ZhbGlkKCl8fCFpLmlzVmFsaWQoKSkmJihlPXoocyhlKT9cIm1pbGxpc2Vjb25kXCI6ZSksXCJtaWxsaXNlY29uZFwiPT09ZT90aGlzLnZhbHVlT2YoKT5pLnZhbHVlT2YoKTppLnZhbHVlT2YoKTx0aGlzLmNsb25lKCkuc3RhcnRPZihlKS52YWx1ZU9mKCkpfWZ1bmN0aW9uIHJpKHQsZSl7dmFyIGk9eSh0KT90OkRlKHQpO3JldHVybiEoIXRoaXMuaXNWYWxpZCgpfHwhaS5pc1ZhbGlkKCkpJiYoZT16KHMoZSk/XCJtaWxsaXNlY29uZFwiOmUpLFwibWlsbGlzZWNvbmRcIj09PWU/dGhpcy52YWx1ZU9mKCk8aS52YWx1ZU9mKCk6dGhpcy5jbG9uZSgpLmVuZE9mKGUpLnZhbHVlT2YoKTxpLnZhbHVlT2YoKSl9ZnVuY3Rpb24gYWkodCxlLGksbyl7cmV0dXJuIG89b3x8XCIoKVwiLChcIihcIj09PW9bMF0/dGhpcy5pc0FmdGVyKHQsaSk6IXRoaXMuaXNCZWZvcmUodCxpKSkmJihcIilcIj09PW9bMV0/dGhpcy5pc0JlZm9yZShlLGkpOiF0aGlzLmlzQWZ0ZXIoZSxpKSl9ZnVuY3Rpb24gaGkodCxlKXt2YXIgaSxvPXkodCk/dDpEZSh0KTtyZXR1cm4hKCF0aGlzLmlzVmFsaWQoKXx8IW8uaXNWYWxpZCgpKSYmKGU9eihlfHxcIm1pbGxpc2Vjb25kXCIpLFwibWlsbGlzZWNvbmRcIj09PWU/dGhpcy52YWx1ZU9mKCk9PT1vLnZhbHVlT2YoKTooaT1vLnZhbHVlT2YoKSx0aGlzLmNsb25lKCkuc3RhcnRPZihlKS52YWx1ZU9mKCk8PWkmJmk8PXRoaXMuY2xvbmUoKS5lbmRPZihlKS52YWx1ZU9mKCkpKX1mdW5jdGlvbiBkaSh0LGUpe3JldHVybiB0aGlzLmlzU2FtZSh0LGUpfHx0aGlzLmlzQWZ0ZXIodCxlKX1mdW5jdGlvbiBsaSh0LGUpe3JldHVybiB0aGlzLmlzU2FtZSh0LGUpfHx0aGlzLmlzQmVmb3JlKHQsZSl9ZnVuY3Rpb24gdWkodCxlLGkpe3ZhciBvLG4scztpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIE5hTjtpZihvPUxlKHQsdGhpcyksIW8uaXNWYWxpZCgpKXJldHVybiBOYU47c3dpdGNoKG49NmU0KihvLnV0Y09mZnNldCgpLXRoaXMudXRjT2Zmc2V0KCkpLGU9eihlKSl7Y2FzZVwieWVhclwiOnM9Y2kodGhpcyxvKS8xMjticmVhaztjYXNlXCJtb250aFwiOnM9Y2kodGhpcyxvKTticmVhaztjYXNlXCJxdWFydGVyXCI6cz1jaSh0aGlzLG8pLzM7YnJlYWs7Y2FzZVwic2Vjb25kXCI6cz0odGhpcy1vKS8xZTM7YnJlYWs7Y2FzZVwibWludXRlXCI6cz0odGhpcy1vKS82ZTQ7YnJlYWs7Y2FzZVwiaG91clwiOnM9KHRoaXMtbykvMzZlNTticmVhaztjYXNlXCJkYXlcIjpzPSh0aGlzLW8tbikvODY0ZTU7YnJlYWs7Y2FzZVwid2Vla1wiOnM9KHRoaXMtby1uKS82MDQ4ZTU7YnJlYWs7ZGVmYXVsdDpzPXRoaXMtb31yZXR1cm4gaT9zOmIocyl9ZnVuY3Rpb24gY2kodCxlKXt2YXIgaSxvLG49MTIqKGUueWVhcigpLXQueWVhcigpKSsoZS5tb250aCgpLXQubW9udGgoKSkscz10LmNsb25lKCkuYWRkKG4sXCJtb250aHNcIik7cmV0dXJuIGUtczwwPyhpPXQuY2xvbmUoKS5hZGQobi0xLFwibW9udGhzXCIpLG89KGUtcykvKHMtaSkpOihpPXQuY2xvbmUoKS5hZGQobisxLFwibW9udGhzXCIpLG89KGUtcykvKGktcykpLC0obitvKXx8MH1mdW5jdGlvbiBwaSgpe3JldHVybiB0aGlzLmNsb25lKCkubG9jYWxlKFwiZW5cIikuZm9ybWF0KFwiZGRkIE1NTSBERCBZWVlZIEhIOm1tOnNzIFtHTVRdWlpcIil9ZnVuY3Rpb24gZmkoKXtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG51bGw7dmFyIHQ9dGhpcy5jbG9uZSgpLnV0YygpO3JldHVybiB0LnllYXIoKTwwfHx0LnllYXIoKT45OTk5P0codCxcIllZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXVwiKTpEKERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKT90aGlzLnRvRGF0ZSgpLnRvSVNPU3RyaW5nKCk6Ryh0LFwiWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXVwiKX1mdW5jdGlvbiBtaSgpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm5cIm1vbWVudC5pbnZhbGlkKC8qIFwiK3RoaXMuX2krXCIgKi8pXCI7dmFyIHQ9XCJtb21lbnRcIixlPVwiXCI7dGhpcy5pc0xvY2FsKCl8fCh0PTA9PT10aGlzLnV0Y09mZnNldCgpP1wibW9tZW50LnV0Y1wiOlwibW9tZW50LnBhcnNlWm9uZVwiLGU9XCJaXCIpO3ZhciBpPVwiW1wiK3QrJyhcIl0nLG89MDw9dGhpcy55ZWFyKCkmJnRoaXMueWVhcigpPD05OTk5P1wiWVlZWVwiOlwiWVlZWVlZXCIsbj1lKydbXCIpXSc7cmV0dXJuIHRoaXMuZm9ybWF0KGkrbytcIi1NTS1ERFtUXUhIOm1tOnNzLlNTU1wiK24pfWZ1bmN0aW9uIHZpKHQpe3R8fCh0PXRoaXMuaXNVdGMoKT9lLmRlZmF1bHRGb3JtYXRVdGM6ZS5kZWZhdWx0Rm9ybWF0KTt2YXIgaT1HKHRoaXMsdCk7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLnBvc3Rmb3JtYXQoaSl9ZnVuY3Rpb24gZ2kodCxlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJih5KHQpJiZ0LmlzVmFsaWQoKXx8RGUodCkuaXNWYWxpZCgpKT9LZSh7dG86dGhpcyxmcm9tOnR9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIWUpOnRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCl9ZnVuY3Rpb24geWkodCl7cmV0dXJuIHRoaXMuZnJvbShEZSgpLHQpfWZ1bmN0aW9uIGJpKHQsZSl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiYoeSh0KSYmdC5pc1ZhbGlkKCl8fERlKHQpLmlzVmFsaWQoKSk/S2Uoe2Zyb206dGhpcyx0bzp0fSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCFlKTp0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpfWZ1bmN0aW9uIF9pKHQpe3JldHVybiB0aGlzLnRvKERlKCksdCl9ZnVuY3Rpb24gd2kodCl7dmFyIGU7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5fbG9jYWxlLl9hYmJyOihlPWllKHQpLG51bGwhPWUmJih0aGlzLl9sb2NhbGU9ZSksdGhpcyl9ZnVuY3Rpb24geGkoKXtyZXR1cm4gdGhpcy5fbG9jYWxlfWZ1bmN0aW9uIGtpKHQpe3N3aXRjaC
21167h0PXoodCkpe2Nhc2VcInllYXJcIjp0aGlzLm1vbnRoKDApO2Nhc2VcInF1YXJ0ZXJcIjpjYXNlXCJtb250aFwiOnRoaXMuZGF0ZSgxKTtjYXNlXCJ3ZWVrXCI6Y2FzZVwiaXNvV2Vla1wiOmNhc2VcImRheVwiOmNhc2VcImRhdGVcIjp0aGlzLmhvdXJzKDApO2Nhc2VcImhvdXJcIjp0aGlzLm1pbnV0ZXMoMCk7Y2FzZVwibWludXRlXCI6dGhpcy5zZWNvbmRzKDApO2Nhc2VcInNlY29uZFwiOnRoaXMubWlsbGlzZWNvbmRzKDApfXJldHVyblwid2Vla1wiPT09dCYmdGhpcy53ZWVrZGF5KDApLFwiaXNvV2Vla1wiPT09dCYmdGhpcy5pc29XZWVrZGF5KDEpLFwicXVhcnRlclwiPT09dCYmdGhpcy5tb250aCgzKk1hdGguZmxvb3IodGhpcy5tb250aCgpLzMpKSx0aGlzfWZ1bmN0aW9uIFNpKHQpe3JldHVybiB2b2lkIDA9PT0odD16KHQpKXx8XCJtaWxsaXNlY29uZFwiPT09dD90aGlzOihcImRhdGVcIj09PXQmJih0PVwiZGF5XCIpLHRoaXMuc3RhcnRPZih0KS5hZGQoMSxcImlzb1dlZWtcIj09PXQ/XCJ3ZWVrXCI6dCkuc3VidHJhY3QoMSxcIm1zXCIpKX1mdW5jdGlvbiBEaSgpe3JldHVybiB0aGlzLl9kLnZhbHVlT2YoKS02ZTQqKHRoaXMuX29mZnNldHx8MCl9ZnVuY3Rpb24gTWkoKXtyZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKS8xZTMpfWZ1bmN0aW9uIENpKCl7cmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpKX1mdW5jdGlvbiBPaSgpe3ZhciB0PXRoaXM7cmV0dXJuW3QueWVhcigpLHQubW9udGgoKSx0LmRhdGUoKSx0LmhvdXIoKSx0Lm1pbnV0ZSgpLHQuc2Vjb25kKCksdC5taWxsaXNlY29uZCgpXX1mdW5jdGlvbiBFaSgpe3ZhciB0PXRoaXM7cmV0dXJue3llYXJzOnQueWVhcigpLG1vbnRoczp0Lm1vbnRoKCksZGF0ZTp0LmRhdGUoKSxob3Vyczp0LmhvdXJzKCksbWludXRlczp0Lm1pbnV0ZXMoKSxzZWNvbmRzOnQuc2Vjb25kcygpLG1pbGxpc2Vjb25kczp0Lm1pbGxpc2Vjb25kcygpfX1mdW5jdGlvbiBUaSgpe3JldHVybiB0aGlzLmlzVmFsaWQoKT90aGlzLnRvSVNPU3RyaW5nKCk6bnVsbH1mdW5jdGlvbiBQaSgpe3JldHVybiBmKHRoaXMpfWZ1bmN0aW9uIElpKCl7cmV0dXJuIGwoe30scCh0aGlzKSl9ZnVuY3Rpb24gTmkoKXtyZXR1cm4gcCh0aGlzKS5vdmVyZmxvd31mdW5jdGlvbiBSaSgpe3JldHVybntpbnB1dDp0aGlzLl9pLGZvcm1hdDp0aGlzLl9mLGxvY2FsZTp0aGlzLl9sb2NhbGUsaXNVVEM6dGhpcy5faXNVVEMsc3RyaWN0OnRoaXMuX3N0cmljdH19ZnVuY3Rpb24gQWkodCxlKXtIKDAsW3QsdC5sZW5ndGhdLDAsZSl9ZnVuY3Rpb24gemkodCl7cmV0dXJuIGppLmNhbGwodGhpcyx0LHRoaXMud2VlaygpLHRoaXMud2Vla2RheSgpLHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyx0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3kpfWZ1bmN0aW9uIExpKHQpe3JldHVybiBqaS5jYWxsKHRoaXMsdCx0aGlzLmlzb1dlZWsoKSx0aGlzLmlzb1dlZWtkYXkoKSwxLDQpfWZ1bmN0aW9uIEZpKCl7cmV0dXJuIFN0KHRoaXMueWVhcigpLDEsNCl9ZnVuY3Rpb24gQmkoKXt2YXIgdD10aGlzLmxvY2FsZURhdGEoKS5fd2VlaztyZXR1cm4gU3QodGhpcy55ZWFyKCksdC5kb3csdC5kb3kpfWZ1bmN0aW9uIGppKHQsZSxpLG8sbil7dmFyIHM7cmV0dXJuIG51bGw9PXQ/a3QodGhpcyxvLG4pLnllYXI6KHM9U3QodCxvLG4pLGU+cyYmKGU9cyksSGkuY2FsbCh0aGlzLHQsZSxpLG8sbikpfWZ1bmN0aW9uIEhpKHQsZSxpLG8sbil7dmFyIHM9eHQodCxlLGksbyxuKSxyPV90KHMueWVhciwwLHMuZGF5T2ZZZWFyKTtyZXR1cm4gdGhpcy55ZWFyKHIuZ2V0VVRDRnVsbFllYXIoKSksdGhpcy5tb250aChyLmdldFVUQ01vbnRoKCkpLHRoaXMuZGF0ZShyLmdldFVUQ0RhdGUoKSksdGhpc31mdW5jdGlvbiBXaSh0KXtyZXR1cm4gbnVsbD09dD9NYXRoLmNlaWwoKHRoaXMubW9udGgoKSsxKS8zKTp0aGlzLm1vbnRoKDMqKHQtMSkrdGhpcy5tb250aCgpJTMpfWZ1bmN0aW9uIFlpKHQpe3ZhciBlPU1hdGgucm91bmQoKHRoaXMuY2xvbmUoKS5zdGFydE9mKFwiZGF5XCIpLXRoaXMuY2xvbmUoKS5zdGFydE9mKFwieWVhclwiKSkvODY0ZTUpKzE7cmV0dXJuIG51bGw9PXQ/ZTp0aGlzLmFkZCh0LWUsXCJkXCIpfWZ1bmN0aW9uIEdpKHQsZSl7ZVttbl09XygxZTMqKFwiMC5cIit0KSl9ZnVuY3Rpb24gVmkoKXtyZXR1cm4gdGhpcy5faXNVVEM/XCJVVENcIjpcIlwifWZ1bmN0aW9uIFVpKCl7cmV0dXJuIHRoaXMuX2lzVVRDP1wiQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWVcIjpcIlwifWZ1bmN0aW9uIHFpKHQpe3JldHVybiBEZSgxZTMqdCl9ZnVuY3Rpb24gWGkoKXtyZXR1cm4gRGUuYXBwbHkobnVsbCxhcmd1bWVudHMpLnBhcnNlWm9uZSgpfWZ1bmN0aW9uIFppKHQpe3JldHVybiB0fWZ1bmN0aW9uIEtpKHQsZSxpLG8pe3ZhciBuPWllKCkscz11KCkuc2V0KG8sZSk7cmV0dXJuIG5baV0ocyx0KX1mdW5jdGlvbiBKaSh0LGUsaSl7aWYocih0KSYmKGU9dCx0PXZvaWQgMCksdD10fHxcIlwiLG51bGwhPWUpcmV0dXJuIEtpKHQsZSxpLFwibW9udGhcIik7dmFyIG8sbj1bXTtmb3Iobz0wO288MTI7bysrKW5bb109S2kodCxvLGksXCJtb250aFwiKTtyZXR1cm4gbn1mdW5jdGlvbiAkaSh0LGUsaSxvKXtcImJvb2xlYW5cIj09dHlwZW9mIHQ/KHIoZSkmJihpPWUsZT12b2lkIDApLGU9ZXx8XCJcIik6KGU9dCxpPWUsdD0hMSxyKGUpJiYoaT1lLGU9dm9pZCAwKSxlPWV8fFwiXCIpO3ZhciBuPWllKCkscz10P24uX3dlZWsuZG93OjA7aWYobnVsbCE9aSlyZXR1cm4gS2koZSwoaStzKSU3LG8sXCJkYXlcIik7dmFyIGEsaD1bXTtmb3IoYT0wO2E8NzthKyspaFthXT1LaShlLChhK3MpJTcsbyxcImRheVwiKTtyZXR1cm4gaH1mdW5jdGlvbiBRaSh0LGUpe3JldHVybiBKaSh0LGUsXCJtb250aHNcIil9ZnVuY3Rpb24gdG8odCxlKXtyZXR1cm4gSmkodCxlLFwibW9udGhzU2hvcnRcIil9ZnVuY3Rpb24gZW8odCxlLGkpe3JldHVybiAkaSh0LGUsaSxcIndlZWtkYXlzXCIpfWZ1bmN0aW9uIGlvKHQsZSxpKXtyZXR1cm4gJGkodCxlLGksXCJ3ZWVrZGF5c1Nob3J0XCIpfWZ1bmN0aW9uIG9vKHQsZSxpKXtyZXR1cm4gJGkodCxlLGksXCJ3ZWVrZGF5c01pblwiKX1mdW5jdGlvbiBubygpe3ZhciB0PXRoaXMuX2RhdGE7cmV0dXJuIHRoaXMuX21pbGxpc2Vjb25kcz1kcyh0aGlzLl9taWxsaXNlY29uZHMpLHRoaXMuX2RheXM9ZHModGhpcy5fZGF5cyksdGhpcy5fbW9udGhzPWRzKHRoaXMuX21vbnRocyksdC5taWxsaXNlY29uZHM9ZHModC5taWxsaXNlY29uZHMpLHQuc2Vjb25kcz1kcyh0LnNlY29uZHMpLHQubWludXRlcz1kcyh0Lm1pbnV0ZXMpLHQuaG91cnM9ZHModC5
21167ob3VycyksdC5tb250aHM9ZHModC5tb250aHMpLHQueWVhcnM9ZHModC55ZWFycyksdGhpc31mdW5jdGlvbiBzbyh0LGUsaSxvKXt2YXIgbj1LZShlLGkpO3JldHVybiB0Ll9taWxsaXNlY29uZHMrPW8qbi5fbWlsbGlzZWNvbmRzLHQuX2RheXMrPW8qbi5fZGF5cyx0Ll9tb250aHMrPW8qbi5fbW9udGhzLHQuX2J1YmJsZSgpfWZ1bmN0aW9uIHJvKHQsZSl7cmV0dXJuIHNvKHRoaXMsdCxlLDEpfWZ1bmN0aW9uIGFvKHQsZSl7cmV0dXJuIHNvKHRoaXMsdCxlLC0xKX1mdW5jdGlvbiBobyh0KXtyZXR1cm4gdDwwP01hdGguZmxvb3IodCk6TWF0aC5jZWlsKHQpfWZ1bmN0aW9uIGxvKCl7dmFyIHQsZSxpLG8sbixzPXRoaXMuX21pbGxpc2Vjb25kcyxyPXRoaXMuX2RheXMsYT10aGlzLl9tb250aHMsaD10aGlzLl9kYXRhO3JldHVybiBzPj0wJiZyPj0wJiZhPj0wfHxzPD0wJiZyPD0wJiZhPD0wfHwocys9ODY0ZTUqaG8oY28oYSkrcikscj0wLGE9MCksaC5taWxsaXNlY29uZHM9cyUxZTMsdD1iKHMvMWUzKSxoLnNlY29uZHM9dCU2MCxlPWIodC82MCksaC5taW51dGVzPWUlNjAsaT1iKGUvNjApLGguaG91cnM9aSUyNCxyKz1iKGkvMjQpLG49Yih1byhyKSksYSs9bixcbiAgICByLT1obyhjbyhuKSksbz1iKGEvMTIpLGElPTEyLGguZGF5cz1yLGgubW9udGhzPWEsaC55ZWFycz1vLHRoaXN9ZnVuY3Rpb24gdW8odCl7cmV0dXJuIDQ4MDAqdC8xNDYwOTd9ZnVuY3Rpb24gY28odCl7cmV0dXJuIDE0NjA5Nyp0LzQ4MDB9ZnVuY3Rpb24gcG8odCl7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBOYU47dmFyIGUsaSxvPXRoaXMuX21pbGxpc2Vjb25kcztpZihcIm1vbnRoXCI9PT0odD16KHQpKXx8XCJ5ZWFyXCI9PT10KXJldHVybiBlPXRoaXMuX2RheXMrby84NjRlNSxpPXRoaXMuX21vbnRocyt1byhlKSxcIm1vbnRoXCI9PT10P2k6aS8xMjtzd2l0Y2goZT10aGlzLl9kYXlzK01hdGgucm91bmQoY28odGhpcy5fbW9udGhzKSksdCl7Y2FzZVwid2Vla1wiOnJldHVybiBlLzcrby82MDQ4ZTU7Y2FzZVwiZGF5XCI6cmV0dXJuIGUrby84NjRlNTtjYXNlXCJob3VyXCI6cmV0dXJuIDI0KmUrby8zNmU1O2Nhc2VcIm1pbnV0ZVwiOnJldHVybiAxNDQwKmUrby82ZTQ7Y2FzZVwic2Vjb25kXCI6cmV0dXJuIDg2NDAwKmUrby8xZTM7Y2FzZVwibWlsbGlzZWNvbmRcIjpyZXR1cm4gTWF0aC5mbG9vcig4NjRlNSplKStvO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biB1bml0IFwiK3QpfX1mdW5jdGlvbiBmbygpe3JldHVybiB0aGlzLmlzVmFsaWQoKT90aGlzLl9taWxsaXNlY29uZHMrODY0ZTUqdGhpcy5fZGF5cyt0aGlzLl9tb250aHMlMTIqMjU5MmU2KzMxNTM2ZTYqXyh0aGlzLl9tb250aHMvMTIpOk5hTn1mdW5jdGlvbiBtbyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcyh0KX19ZnVuY3Rpb24gdm8oKXtyZXR1cm4gS2UodGhpcyl9ZnVuY3Rpb24gZ28odCl7cmV0dXJuIHQ9eih0KSx0aGlzLmlzVmFsaWQoKT90aGlzW3QrXCJzXCJdKCk6TmFOfWZ1bmN0aW9uIHlvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLmlzVmFsaWQoKT90aGlzLl9kYXRhW3RdOk5hTn19ZnVuY3Rpb24gYm8oKXtyZXR1cm4gYih0aGlzLmRheXMoKS83KX1mdW5jdGlvbiBfbyh0LGUsaSxvLG4pe3JldHVybiBuLnJlbGF0aXZlVGltZShlfHwxLCEhaSx0LG8pfWZ1bmN0aW9uIHdvKHQsZSxpKXt2YXIgbz1LZSh0KS5hYnMoKSxuPURzKG8uYXMoXCJzXCIpKSxzPURzKG8uYXMoXCJtXCIpKSxyPURzKG8uYXMoXCJoXCIpKSxhPURzKG8uYXMoXCJkXCIpKSxoPURzKG8uYXMoXCJNXCIpKSxkPURzKG8uYXMoXCJ5XCIpKSxsPW48PU1zLnNzJiZbXCJzXCIsbl18fG48TXMucyYmW1wic3NcIixuXXx8czw9MSYmW1wibVwiXXx8czxNcy5tJiZbXCJtbVwiLHNdfHxyPD0xJiZbXCJoXCJdfHxyPE1zLmgmJltcImhoXCIscl18fGE8PTEmJltcImRcIl18fGE8TXMuZCYmW1wiZGRcIixhXXx8aDw9MSYmW1wiTVwiXXx8aDxNcy5NJiZbXCJNTVwiLGhdfHxkPD0xJiZbXCJ5XCJdfHxbXCJ5eVwiLGRdO3JldHVybiBsWzJdPWUsbFszXT0rdD4wLGxbNF09aSxfby5hcHBseShudWxsLGwpfWZ1bmN0aW9uIHhvKHQpe3JldHVybiB2b2lkIDA9PT10P0RzOlwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJihEcz10LCEwKX1mdW5jdGlvbiBrbyh0LGUpe3JldHVybiB2b2lkIDAhPT1Nc1t0XSYmKHZvaWQgMD09PWU/TXNbdF06KE1zW3RdPWUsXCJzXCI9PT10JiYoTXMuc3M9ZS0xKSwhMCkpfWZ1bmN0aW9uIFNvKHQpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTt2YXIgZT10aGlzLmxvY2FsZURhdGEoKSxpPXdvKHRoaXMsIXQsZSk7cmV0dXJuIHQmJihpPWUucGFzdEZ1dHVyZSgrdGhpcyxpKSksZS5wb3N0Zm9ybWF0KGkpfWZ1bmN0aW9uIERvKHQpe3JldHVybih0PjApLSh0PDApfHwrdH1mdW5jdGlvbiBNbygpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTt2YXIgdCxlLGksbz1Dcyh0aGlzLl9taWxsaXNlY29uZHMpLzFlMyxuPUNzKHRoaXMuX2RheXMpLHM9Q3ModGhpcy5fbW9udGhzKTt0PWIoby82MCksZT1iKHQvNjApLG8lPTYwLHQlPTYwLGk9YihzLzEyKSxzJT0xMjt2YXIgcj1pLGE9cyxoPW4sZD1lLGw9dCx1PW8/by50b0ZpeGVkKDMpLnJlcGxhY2UoL1xcLj8wKyQvLFwiXCIpOlwiXCIsYz10aGlzLmFzU2Vjb25kcygpO2lmKCFjKXJldHVyblwiUDBEXCI7dmFyIHA9YzwwP1wiLVwiOlwiXCIsZj1Ebyh0aGlzLl9tb250aHMpIT09RG8oYyk/XCItXCI6XCJcIixtPURvKHRoaXMuX2RheXMpIT09RG8oYyk/XCItXCI6XCJcIix2PURvKHRoaXMuX21pbGxpc2Vjb25kcykhPT1EbyhjKT9cIi1cIjpcIlwiO3JldHVybiBwK1wiUFwiKyhyP2YrcitcIllcIjpcIlwiKSsoYT9mK2ErXCJNXCI6XCJcIikrKGg/bStoK1wiRFwiOlwiXCIpKyhkfHxsfHx1P1wiVFwiOlwiXCIpKyhkP3YrZCtcIkhcIjpcIlwiKSsobD92K2wrXCJNXCI6XCJcIikrKHU/dit1K1wiU1wiOlwiXCIpfXZhciBDbyxPbztPbz1BcnJheS5wcm90b3R5cGUuc29tZT9BcnJheS5wcm90b3R5cGUuc29tZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9T2JqZWN0KHRoaXMpLGk9ZS5sZW5ndGg+Pj4wLG89MDtvPGk7bysrKWlmKG8gaW4gZSYmdC5jYWxsKHRoaXMsZVtvXSxvLGUpKXJldHVybiEwO3JldHVybiExfTt2YXIgRW89ZS5tb21lbnRQcm9wZXJ0aWVzPVtdLFRvPSExLFBvPXt9O2Uuc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdzPSExLGUuZGVwcmVjYXRpb25IYW5kbGVyPW51bGw7dmFyIElvO0lvPU9iamVjdC5rZXlzP09iamVjdC5rZXlzOmZ1bmN0aW9uKHQpe3ZhciBlLGk9W107Zm9yKGUgaW4gdClkKHQsZSkmJmkucHVzaChlKTtyZXR1cm4gaX07dmFyIE
211675vPXtzYW1lRGF5OlwiW1RvZGF5IGF0XSBMVFwiLG5leHREYXk6XCJbVG9tb3Jyb3cgYXRdIExUXCIsbmV4dFdlZWs6XCJkZGRkIFthdF0gTFRcIixsYXN0RGF5OlwiW1llc3RlcmRheSBhdF0gTFRcIixsYXN0V2VlazpcIltMYXN0XSBkZGRkIFthdF0gTFRcIixzYW1lRWxzZTpcIkxcIn0sUm89e0xUUzpcImg6bW06c3MgQVwiLExUOlwiaDptbSBBXCIsTDpcIk1NL0REL1lZWVlcIixMTDpcIk1NTU0gRCwgWVlZWVwiLExMTDpcIk1NTU0gRCwgWVlZWSBoOm1tIEFcIixMTExMOlwiZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQVwifSxBbz0vXFxkezEsMn0vLHpvPXtmdXR1cmU6XCJpbiAlc1wiLHBhc3Q6XCIlcyBhZ29cIixzOlwiYSBmZXcgc2Vjb25kc1wiLHNzOlwiJWQgc2Vjb25kc1wiLG06XCJhIG1pbnV0ZVwiLG1tOlwiJWQgbWludXRlc1wiLGg6XCJhbiBob3VyXCIsaGg6XCIlZCBob3Vyc1wiLGQ6XCJhIGRheVwiLGRkOlwiJWQgZGF5c1wiLE06XCJhIG1vbnRoXCIsTU06XCIlZCBtb250aHNcIix5OlwiYSB5ZWFyXCIseXk6XCIlZCB5ZWFyc1wifSxMbz17fSxGbz17fSxCbz0vKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oW0hoXW1tKHNzKT98TW98TU0/TT9NP3xEb3xERERvfEREP0Q/RD98ZGRkP2Q/fGRvP3x3W298d10/fFdbb3xXXT98UW8/fFlZWVlZWXxZWVlZWXxZWVlZfFlZfGdnKGdnZz8pP3xHRyhHR0c/KT98ZXxFfGF8QXxoaD98SEg/fGtrP3xtbT98c3M/fFN7MSw5fXx4fFh8eno/fFpaP3wuKS9nLGpvPS8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhMVFN8TFR8TEw/TD9MP3xsezEsNH0pL2csSG89e30sV289e30sWW89L1xcZC8sR289L1xcZFxcZC8sVm89L1xcZHszfS8sVW89L1xcZHs0fS8scW89L1srLV0/XFxkezZ9LyxYbz0vXFxkXFxkPy8sWm89L1xcZFxcZFxcZFxcZD8vLEtvPS9cXGRcXGRcXGRcXGRcXGRcXGQ/LyxKbz0vXFxkezEsM30vLCRvPS9cXGR7MSw0fS8sUW89L1srLV0/XFxkezEsNn0vLHRuPS9cXGQrLyxlbj0vWystXT9cXGQrLyxvbj0vWnxbKy1dXFxkXFxkOj9cXGRcXGQvZ2ksbm49L1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vZ2ksc249L1srLV0/XFxkKyhcXC5cXGR7MSwzfSk/Lyxybj0vWzAtOV0qWydhLXpcXHUwMEEwLVxcdTA1RkZcXHUwNzAwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdK3xbXFx1MDYwMC1cXHUwNkZGXFwvXSsoXFxzKj9bXFx1MDYwMC1cXHUwNkZGXSspezEsMn0vaSxhbj17fSxobj17fSxkbj0wLGxuPTEsdW49Mixjbj0zLHBuPTQsZm49NSxtbj02LHZuPTcsZ249ODtIKFwiWVwiLDAsMCxmdW5jdGlvbigpe3ZhciB0PXRoaXMueWVhcigpO3JldHVybiB0PD05OTk5P1wiXCIrdDpcIitcIit0fSksSCgwLFtcIllZXCIsMl0sMCxmdW5jdGlvbigpe3JldHVybiB0aGlzLnllYXIoKSUxMDB9KSxIKDAsW1wiWVlZWVwiLDRdLDAsXCJ5ZWFyXCIpLEgoMCxbXCJZWVlZWVwiLDVdLDAsXCJ5ZWFyXCIpLEgoMCxbXCJZWVlZWVlcIiw2LCEwXSwwLFwieWVhclwiKSxBKFwieWVhclwiLFwieVwiKSxGKFwieWVhclwiLDEpLFUoXCJZXCIsZW4pLFUoXCJZWVwiLFhvLEdvKSxVKFwiWVlZWVwiLCRvLFVvKSxVKFwiWVlZWVlcIixRbyxxbyksVShcIllZWVlZWVwiLFFvLHFvKSxLKFtcIllZWVlZXCIsXCJZWVlZWVlcIl0sZG4pLEsoXCJZWVlZXCIsZnVuY3Rpb24odCxpKXtpW2RuXT0yPT09dC5sZW5ndGg/ZS5wYXJzZVR3b0RpZ2l0WWVhcih0KTpfKHQpfSksSyhcIllZXCIsZnVuY3Rpb24odCxpKXtpW2RuXT1lLnBhcnNlVHdvRGlnaXRZZWFyKHQpfSksSyhcIllcIixmdW5jdGlvbih0LGUpe2VbZG5dPXBhcnNlSW50KHQsMTApfSksZS5wYXJzZVR3b0RpZ2l0WWVhcj1mdW5jdGlvbih0KXtyZXR1cm4gXyh0KSsoXyh0KT42OD8xOTAwOjJlMyl9O3ZhciB5bixibj1pdChcIkZ1bGxZZWFyXCIsITApO3luPUFycmF5LnByb3RvdHlwZS5pbmRleE9mP0FycmF5LnByb3RvdHlwZS5pbmRleE9mOmZ1bmN0aW9uKHQpe3ZhciBlO2ZvcihlPTA7ZTx0aGlzLmxlbmd0aDsrK2UpaWYodGhpc1tlXT09PXQpcmV0dXJuIGU7cmV0dXJuLTF9LEgoXCJNXCIsW1wiTU1cIiwyXSxcIk1vXCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tb250aCgpKzF9KSxIKFwiTU1NXCIsMCwwLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLHQpfSksSChcIk1NTU1cIiwwLDAsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRocyh0aGlzLHQpfSksQShcIm1vbnRoXCIsXCJNXCIpLEYoXCJtb250aFwiLDgpLFUoXCJNXCIsWG8pLFUoXCJNTVwiLFhvLEdvKSxVKFwiTU1NXCIsZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5tb250aHNTaG9ydFJlZ2V4KHQpfSksVShcIk1NTU1cIixmdW5jdGlvbih0LGUpe3JldHVybiBlLm1vbnRoc1JlZ2V4KHQpfSksSyhbXCJNXCIsXCJNTVwiXSxmdW5jdGlvbih0LGUpe2VbbG5dPV8odCktMX0pLEsoW1wiTU1NXCIsXCJNTU1NXCJdLGZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPWkuX2xvY2FsZS5tb250aHNQYXJzZSh0LG8saS5fc3RyaWN0KTtudWxsIT1uP2VbbG5dPW46cChpKS5pbnZhbGlkTW9udGg9dH0pO3ZhciBfbj0vRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NPy8sd249XCJKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyXCIuc3BsaXQoXCJfXCIpLHhuPVwiSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWNcIi5zcGxpdChcIl9cIiksa249cm4sU249cm47SChcIndcIixbXCJ3d1wiLDJdLFwid29cIixcIndlZWtcIiksSChcIldcIixbXCJXV1wiLDJdLFwiV29cIixcImlzb1dlZWtcIiksQShcIndlZWtcIixcIndcIiksQShcImlzb1dlZWtcIixcIldcIiksRihcIndlZWtcIiw1KSxGKFwiaXNvV2Vla1wiLDUpLFUoXCJ3XCIsWG8pLFUoXCJ3d1wiLFhvLEdvKSxVKFwiV1wiLFhvKSxVKFwiV1dcIixYbyxHbyksSihbXCJ3XCIsXCJ3d1wiLFwiV1wiLFwiV1dcIl0sZnVuY3Rpb24odCxlLGksbyl7ZVtvLnN1YnN0cigwLDEpXT1fKHQpfSk7dmFyIERuPXtkb3c6MCxkb3k6Nn07SChcImRcIiwwLFwiZG9cIixcImRheVwiKSxIKFwiZGRcIiwwLDAsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzTWluKHRoaXMsdCl9KSxIKFwiZGRkXCIsMCwwLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c1Nob3J0KHRoaXMsdCl9KSxIKFwiZGRkZFwiLDAsMCxmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXModGhpcyx0KX0pLEgoXCJlXCIsMCwwLFwid2Vla2RheVwiKSxIKFwiRVwiLDAsMCxcImlzb1dlZWtkYXlcIiksQShcImRheVwiLFwiZFwiKSxBKFwid2Vla2RheVwiLFwiZVwiKSxBKFwiaXNvV2Vla2RheVwiLFwiRVwiKSxGKFwiZGF5XCIsMTEpLEYoXCJ3ZWVrZGF5XCIsMTEpLEYoXCJpc29XZWVrZGF5XCIsMTEpLFUoXCJkXCIsWG8pLFUoXCJlXCIsWG8pLFUoXCJFXCIsWG8pLFUoXCJkZFwiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUud2Vla2RheXNNaW5SZWdleCh0KX0pLFUoXCJkZGRcIixmdW5jdGlvbih0LGUpe3JldHVybiBlLndlZWtkYXlzU2hvcnRSZWdleCh0KX0pLFUoXCJkZGRkXCIsZnVuY3Rpb24odCxlKXtyZXR1cm4gZS53ZWVrZGF5c1JlZ2V4KHQpfSksSihbXCJkZFwiLFwiZGRkXCIsXCJkZGRkXCJdLGZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPWkuX2xvY2FsZS53ZWVrZGF5c1BhcnNlKHQsbyxpLl9zdHJpY3QpO251bGwhPW4/ZS5kPW46cChpKS5pbnZhbGlkV2Vla2RheT10fSksSihbXCJkXCIsXCJlXCIsXCJFXCJdLGZ1bmN0aW9uKHQsZSxpLG8pe2Vbb109Xyh0KX0pO3ZhciBNbj1cIlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5XCIuc3BsaXQoXCJfXCIpLENuPVwiU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0XCIuc3BsaXQoXCJfXCIpLE9uPVwiU3VfTW9fVHVfV2VfVGhfRnJfU2FcIi5zcGxpdChcIl9cIiksRW49cm4sVG49cm4sUG49cm47SChcIkhcIixbXCJISFwiLDJdLDAsXCJob3VyXCIpLEgoXCJoXCIsW1wiaGhcIiwyXSwwLEd0KSxIKFwia1wiLFtcImtrXCIsMl0sMCxWdCksSChcImhtbVwiLDAsMCxmdW5jdGlvbigpe3JldHVyblwiXCIrR3QuYXBwbHkodGhpcykraih0aGlzLm1pbnV0ZXMoKSwyKX0pLEgoXCJobW1zc1wiLDAsMCxmdW5jdGlvbigpe3JldHVyblwiXCIrR3QuYXBwbHkodGhpcykraih0aGlzLm1pbnV0ZXMoKSwyKStqKHRoaXMuc2Vjb25kcygpLDIpfSksSChcIkhtbVwiLDAsMCxmdW5jdGlvbigpe3JldHVyblwiXCIrdGhpcy5ob3VycygpK2oodGhpcy5taW51dGVzKCksMil9KSxIKFwiSG1tc3NcIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm5cIlwiK3RoaXMuaG91cnMoKStqKHRoaXMubWludXRlcygpLDIpK2oodGhpcy5zZWNvbmRzKCksMil9KSxVdChcImFcIiwhMCksVXQoXCJBXCIsITEpLEEoXCJob3VyXCIsXCJoXCIpLEYoXCJob3VyXCIsMTMpLFUoXCJhXCIscXQpLFUoXCJBXCIscXQpLFUoXCJIXCIsWG8pLFUoXCJoXCIsWG8pLFUoXCJrXCIsWG8pLFUoXCJISFwiLFhvLEdvKSxVKFwiaGhcIixYbyxHbyksVShcImtrXCIsWG8sR28pLFUoXCJobW1cIixabyksVShcImhtbXNzXCIsS28pLFUoXCJIbW1cIixabyksVShcIkhtbXNzXCIsS28pLEsoW1wiSFwiLFwiSEhcIl0sY24pLEsoW1wia1wiLFwia2tcIl0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPV8odCk7ZVtjbl09MjQ9PT1vPzA6b30pLEsoW1wiYVwiLFwiQVwiXSxmdW5jdGlvbih0LGUsaSl7aS5faXNQbT1pLl9sb2NhbGUuaXNQTSh0KSxpLl9tZXJpZGllbT10fSksSyhbXCJoXCIsXCJoaFwiXSxmdW5jdGlvbih0LGUsaSl7ZVtjbl09Xyh0KSxwKGkpLmJpZ0hvdXI9ITB9KSxLKFwiaG1tXCIsZnVuY3Rpb24odCxlLGkpe3ZhciBvPXQubGVuZ3RoLTI7ZVtjbl09Xyh0LnN1YnN0cigwLG8pKSxlW3BuXT1fKHQuc3Vic3RyKG8pKSxwKGkpLmJpZ0hvdXI9ITB9KSxLKFwiaG1tc3NcIixmdW5jdGlvbih0LGUsaSl7dmFyIG89dC5sZW5ndGgtNCxuPXQubGVuZ3RoLTI7ZVtjbl09Xyh0LnN1YnN0cigwLG8pKSxlW3BuXT1fKHQuc3Vic3RyKG8s
21167MikpLGVbZm5dPV8odC5zdWJzdHIobikpLHAoaSkuYmlnSG91cj0hMH0pLEsoXCJIbW1cIixmdW5jdGlvbih0LGUsaSl7dmFyIG89dC5sZW5ndGgtMjtlW2NuXT1fKHQuc3Vic3RyKDAsbykpLGVbcG5dPV8odC5zdWJzdHIobykpfSksSyhcIkhtbXNzXCIsZnVuY3Rpb24odCxlLGkpe3ZhciBvPXQubGVuZ3RoLTQsbj10Lmxlbmd0aC0yO2VbY25dPV8odC5zdWJzdHIoMCxvKSksZVtwbl09Xyh0LnN1YnN0cihvLDIpKSxlW2ZuXT1fKHQuc3Vic3RyKG4pKX0pO3ZhciBJbixObj0vW2FwXVxcLj9tP1xcLj8vaSxSbj1pdChcIkhvdXJzXCIsITApLEFuPXtjYWxlbmRhcjpObyxsb25nRGF0ZUZvcm1hdDpSbyxpbnZhbGlkRGF0ZTpcIkludmFsaWQgZGF0ZVwiLG9yZGluYWw6XCIlZFwiLGRheU9mTW9udGhPcmRpbmFsUGFyc2U6QW8scmVsYXRpdmVUaW1lOnpvLG1vbnRoczp3bixtb250aHNTaG9ydDp4bix3ZWVrOkRuLHdlZWtkYXlzOk1uLHdlZWtkYXlzTWluOk9uLHdlZWtkYXlzU2hvcnQ6Q24sbWVyaWRpZW1QYXJzZTpObn0sem49e30sTG49e30sRm49L15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KS0oPzpcXGRcXGQtXFxkXFxkfFdcXGRcXGQtXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86OlxcZFxcZCg/OjpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoW1xcK1xcLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvLEJuPS9eXFxzKigoPzpbKy1dXFxkezZ9fFxcZHs0fSkoPzpcXGRcXGRcXGRcXGR8V1xcZFxcZFxcZHxXXFxkXFxkfFxcZFxcZFxcZHxcXGRcXGQpKSg/OihUfCApKFxcZFxcZCg/OlxcZFxcZCg/OlxcZFxcZCg/OlsuLF1cXGQrKT8pPyk/KShbXFwrXFwtXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC8sam49L1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vLEhuPVtbXCJZWVlZWVktTU0tRERcIiwvWystXVxcZHs2fS1cXGRcXGQtXFxkXFxkL10sW1wiWVlZWS1NTS1ERFwiLC9cXGR7NH0tXFxkXFxkLVxcZFxcZC9dLFtcIkdHR0ctW1ddV1ctRVwiLC9cXGR7NH0tV1xcZFxcZC1cXGQvXSxbXCJHR0dHLVtXXVdXXCIsL1xcZHs0fS1XXFxkXFxkLywhMV0sW1wiWVlZWS1ERERcIiwvXFxkezR9LVxcZHszfS9dLFtcIllZWVktTU1cIiwvXFxkezR9LVxcZFxcZC8sITFdLFtcIllZWVlZWU1NRERcIiwvWystXVxcZHsxMH0vXSxbXCJZWVlZTU1ERFwiLC9cXGR7OH0vXSxbXCJHR0dHW1ddV1dFXCIsL1xcZHs0fVdcXGR7M30vXSxbXCJHR0dHW1ddV1dcIiwvXFxkezR9V1xcZHsyfS8sITFdLFtcIllZWVlERERcIiwvXFxkezd9L11dLFduPVtbXCJISDptbTpzcy5TU1NTXCIsL1xcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkKy9dLFtcIkhIOm1tOnNzLFNTU1NcIiwvXFxkXFxkOlxcZFxcZDpcXGRcXGQsXFxkKy9dLFtcIkhIOm1tOnNzXCIsL1xcZFxcZDpcXGRcXGQ6XFxkXFxkL10sW1wiSEg6bW1cIiwvXFxkXFxkOlxcZFxcZC9dLFtcIkhIbW1zcy5TU1NTXCIsL1xcZFxcZFxcZFxcZFxcZFxcZFxcLlxcZCsvXSxbXCJISG1tc3MsU1NTU1wiLC9cXGRcXGRcXGRcXGRcXGRcXGQsXFxkKy9dLFtcIkhIbW1zc1wiLC9cXGRcXGRcXGRcXGRcXGRcXGQvXSxbXCJISG1tXCIsL1xcZFxcZFxcZFxcZC9dLFtcIkhIXCIsL1xcZFxcZC9dXSxZbj0vXlxcLz9EYXRlXFwoKFxcLT9cXGQrKS9pLEduPS9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksP1xccyk/KFxcZHsxLDJ9KVxccyhKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYylcXHMoXFxkezIsNH0pXFxzKFxcZFxcZCk6KFxcZFxcZCkoPzo6KFxcZFxcZCkpP1xccyg/OihVVHxHTVR8W0VDTVBdW1NEXVQpfChbWnpdKXwoWystXVxcZHs0fSkpJC8sVm49e1VUOjAsR01UOjAsRURUOi0yNDAsRVNUOi0zMDAsQ0RUOi0zMDAsQ1NUOi0zNjAsTURUOi0zNjAsTVNUOi00MjAsUERUOi00MjAsUFNUOi00ODB9O2UuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2s9ayhcInZhbHVlIHByb3ZpZGVkIGlzIG5vdCBpbiBhIHJlY29nbml6ZWQgUkZDMjgyMiBvciBJU08gZm9ybWF0LiBtb21lbnQgY29uc3RydWN0aW9uIGZhbGxzIGJhY2sgdG8ganMgRGF0ZSgpLCB3aGljaCBpcyBub3QgcmVsaWFibGUgYWNyb3NzIGFsbCBicm93c2VycyBhbmQgdmVyc2lvbnMuIE5vbiBSRkMyODIyL0lTTyBkYXRlIGZvcm1hdHMgYXJlIGRpc2NvdXJhZ2VkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYW4gdXBjb21pbmcgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHJlZmVyIHRvIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvanMtZGF0ZS8gZm9yIG1vcmUgaW5mby5cIixmdW5jdGlvbih0KXt0Ll9kPW5ldyBEYXRlKHQuX2krKHQuX3VzZVVUQz9cIiBVVENcIjpcIlwiKSl9KSxlLklTT184NjAxPWZ1bmN0aW9uKCl7fSxlLlJGQ18yODIyPWZ1bmN0aW9uKCl7fTt2YXIgVW49ayhcIm1vbWVudCgpLm1pbiBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1heCBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvXCIsZnVuY3Rpb24oKXt2YXIgdD1EZS5hcHBseShudWxsLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiZ0LmlzVmFsaWQoKT90PHRoaXM/dGhpczp0Om0oKX0pLHFuPWsoXCJtb21lbnQoKS5tYXggaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudC5taW4gaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9taW4tbWF4L1wiLGZ1bmN0aW9uKCl7dmFyIHQ9RGUuYXBwbHkobnVsbCxhcmd1bWVudHMpO3JldHVybiB0aGlzLmlzVmFsaWQoKSYmdC5pc1ZhbGlkKCk/dD50aGlzP3RoaXM6dDptKCl9KSxYbj1mdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdz9EYXRlLm5vdygpOituZXcgRGF0ZX0sWm49W1wieWVhclwiLFwicXVhcnRlclwiLFwibW9udGhcIixcIndlZWtcIixcImRheVwiLFwiaG91clwiLFwibWludXRlXCIsXCJzZWNvbmRcIixcIm1pbGxpc2Vjb25kXCJdO0FlKFwiWlwiLFwiOlwiKSxBZShcIlpaXCIsXCJcIiksVShcIlpcIixubiksVShcIlpaXCIsbm4pLEsoW1wiWlwiLFwiWlpcIl0sZnVuY3Rpb24odCxlLGkpe2kuX3VzZVVUQz0hMCxpLl90em09emUobm4sdCl9KTt2YXIgS249LyhbXFwrXFwtXXxcXGRcXGQpL2dpO2UudXBkYXRlT2Zmc2V0PWZ1bmN0aW9uKCl7fTt2YXIgSm49L14oXFwtfFxcKyk/KD86K
21167FxcZCopWy4gXSk/KFxcZCspXFw6KFxcZCspKD86XFw6KFxcZCspKFxcLlxcZCopPyk/JC8sJG49L14oLXxcXCspP1AoPzooWy0rXT9bMC05LC5dKilZKT8oPzooWy0rXT9bMC05LC5dKilNKT8oPzooWy0rXT9bMC05LC5dKilXKT8oPzooWy0rXT9bMC05LC5dKilEKT8oPzpUKD86KFstK10/WzAtOSwuXSopSCk/KD86KFstK10/WzAtOSwuXSopTSk/KD86KFstK10/WzAtOSwuXSopUyk/KT8kLztLZS5mbj1JZS5wcm90b3R5cGUsS2UuaW52YWxpZD1QZTt2YXIgUW49dGkoMSxcImFkZFwiKSx0cz10aSgtMSxcInN1YnRyYWN0XCIpO2UuZGVmYXVsdEZvcm1hdD1cIllZWVktTU0tRERUSEg6bW06c3NaXCIsZS5kZWZhdWx0Rm9ybWF0VXRjPVwiWVlZWS1NTS1ERFRISDptbTpzc1taXVwiO3ZhciBlcz1rKFwibW9tZW50KCkubGFuZygpIGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBtb21lbnQoKS5sb2NhbGVEYXRhKCkgdG8gZ2V0IHRoZSBsYW5ndWFnZSBjb25maWd1cmF0aW9uLiBVc2UgbW9tZW50KCkubG9jYWxlKCkgdG8gY2hhbmdlIGxhbmd1YWdlcy5cIixmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmxvY2FsZURhdGEoKTp0aGlzLmxvY2FsZSh0KX0pO0goMCxbXCJnZ1wiLDJdLDAsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZWVrWWVhcigpJTEwMH0pLEgoMCxbXCJHR1wiLDJdLDAsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc29XZWVrWWVhcigpJTEwMH0pLEFpKFwiZ2dnZ1wiLFwid2Vla1llYXJcIiksQWkoXCJnZ2dnZ1wiLFwid2Vla1llYXJcIiksQWkoXCJHR0dHXCIsXCJpc29XZWVrWWVhclwiKSxBaShcIkdHR0dHXCIsXCJpc29XZWVrWWVhclwiKSxBKFwid2Vla1llYXJcIixcImdnXCIpLEEoXCJpc29XZWVrWWVhclwiLFwiR0dcIiksRihcIndlZWtZZWFyXCIsMSksRihcImlzb1dlZWtZZWFyXCIsMSksVShcIkdcIixlbiksVShcImdcIixlbiksVShcIkdHXCIsWG8sR28pLFUoXCJnZ1wiLFhvLEdvKSxVKFwiR0dHR1wiLCRvLFVvKSxVKFwiZ2dnZ1wiLCRvLFVvKSxVKFwiR0dHR0dcIixRbyxxbyksVShcImdnZ2dnXCIsUW8scW8pLEooW1wiZ2dnZ1wiLFwiZ2dnZ2dcIixcIkdHR0dcIixcIkdHR0dHXCJdLGZ1bmN0aW9uKHQsZSxpLG8pe2Vbby5zdWJzdHIoMCwyKV09Xyh0KX0pLEooW1wiZ2dcIixcIkdHXCJdLGZ1bmN0aW9uKHQsaSxvLG4pe2lbbl09ZS5wYXJzZVR3b0RpZ2l0WWVhcih0KX0pLEgoXCJRXCIsMCxcIlFvXCIsXCJxdWFydGVyXCIpLEEoXCJxdWFydGVyXCIsXCJRXCIpLEYoXCJxdWFydGVyXCIsNyksVShcIlFcIixZbyksSyhcIlFcIixmdW5jdGlvbih0LGUpe2VbbG5dPTMqKF8odCktMSl9KSxIKFwiRFwiLFtcIkREXCIsMl0sXCJEb1wiLFwiZGF0ZVwiKSxBKFwiZGF0ZVwiLFwiRFwiKSxGKFwiZGF0ZVwiLDkpLFUoXCJEXCIsWG8pLFUoXCJERFwiLFhvLEdvKSxVKFwiRG9cIixmdW5jdGlvbih0LGUpe3JldHVybiB0P2UuX2RheU9mTW9udGhPcmRpbmFsUGFyc2V8fGUuX29yZGluYWxQYXJzZTplLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudH0pLEsoW1wiRFwiLFwiRERcIl0sdW4pLEsoXCJEb1wiLGZ1bmN0aW9uKHQsZSl7ZVt1bl09Xyh0Lm1hdGNoKFhvKVswXSwxMCl9KTt2YXIgaXM9aXQoXCJEYXRlXCIsITApO0goXCJERERcIixbXCJEREREXCIsM10sXCJERERvXCIsXCJkYXlPZlllYXJcIiksQShcImRheU9mWWVhclwiLFwiREREXCIpLEYoXCJkYXlPZlllYXJcIiw0KSxVKFwiREREXCIsSm8pLFUoXCJEREREXCIsVm8pLEsoW1wiREREXCIsXCJEREREXCJdLGZ1bmN0aW9uKHQsZSxpKXtpLl9kYXlPZlllYXI9Xyh0KX0pLEgoXCJtXCIsW1wibW1cIiwyXSwwLFwibWludXRlXCIpLEEoXCJtaW51dGVcIixcIm1cIiksRihcIm1pbnV0ZVwiLDE0KSxVKFwibVwiLFhvKSxVKFwibW1cIixYbyxHbyksSyhbXCJtXCIsXCJtbVwiXSxwbik7dmFyIG9zPWl0KFwiTWludXRlc1wiLCExKTtIKFwic1wiLFtcInNzXCIsMl0sMCxcInNlY29uZFwiKSxBKFwic2Vjb25kXCIsXCJzXCIpLEYoXCJzZWNvbmRcIiwxNSksVShcInNcIixYbyksVShcInNzXCIsWG8sR28pLEsoW1wic1wiLFwic3NcIl0sZm4pO3ZhciBucz1pdChcIlNlY29uZHNcIiwhMSk7SChcIlNcIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm5+fih0aGlzLm1pbGxpc2Vjb25kKCkvMTAwKX0pLEgoMCxbXCJTU1wiLDJdLDAsZnVuY3Rpb24oKXtyZXR1cm5+fih0aGlzLm1pbGxpc2Vjb25kKCkvMTApfSksSCgwLFtcIlNTU1wiLDNdLDAsXCJtaWxsaXNlY29uZFwiKSxIKDAsW1wiU1NTU1wiLDRdLDAsZnVuY3Rpb24oKXtyZXR1cm4gMTAqdGhpcy5taWxsaXNlY29uZCgpfSksSCgwLFtcIlNTU1NTXCIsNV0sMCxmdW5jdGlvbigpe3JldHVybiAxMDAqdGhpcy5taWxsaXNlY29uZCgpfSksSCgwLFtcIlNTU1NTU1wiLDZdLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWUzKnRoaXMubWlsbGlzZWNvbmQoKX0pLEgoMCxbXCJTU1NTU1NTXCIsN10sMCxmdW5jdGlvbigpe3JldHVybiAxZTQqdGhpcy5taWxsaXNlY29uZCgpfSksSCgwLFtcIlNTU1NTU1NTXCIsOF0sMCxmdW5jdGlvbigpe3JldHVybiAxZTUqdGhpcy5taWxsaXNlY29uZCgpfSksSCgwLFtcIlNTU1NTU1NTU1wiLDldLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWU2KnRoaXMubWlsbGlzZWNvbmQoKX0pLEEoXCJtaWxsaXNlY29uZFwiLFwibXNcIiksRihcIm1pbGxpc2Vjb25kXCIsMTYpLFUoXCJTXCIsSm8sWW8pLFUoXCJTU1wiLEpvLEdvKSxVKFwiU1NTXCIsSm8sVm8pO3ZhciBzcztmb3Ioc3M9XCJTU1NTXCI7c3MubGVuZ3RoPD05O3NzKz1cIlNcIilVKHNzLHRuKTtmb3Ioc3M9XCJTXCI7c3MubGVuZ3RoPD05O3NzKz1cIlNcIilLKHNzLEdpKTt2YXIgcnM9aXQoXCJNaWxsaXNlY29uZHNcIiwhMSk7SChcInpcIiwwLDAsXCJ6b25lQWJiclwiKSxIKFwienpcIiwwLDAsXCJ6b25lTmFtZVwiKTt2YXIgYXM9Zy5wcm90b3R5cGU7YXMuYWRkPVFuLGFzLmNhbGVuZGFyPW9pLGFzLmNsb25lPW5pLGFzLmRpZmY9dWksYXMuZW5kT2Y9U2ksYXMuZm9ybWF0PXZpLGFzLmZyb209Z2ksYXMuZnJvbU5vdz15aSxhcy50bz1iaSxhcy50b05vdz1faSxhcy5nZXQ9c3QsYXMuaW52YWxpZEF0PU5pLGFzLmlzQWZ0ZXI9c2ksYXMuaXNCZWZvcmU9cmksYXMuaXNCZXR3ZWVuPWFpLGFzLmlzU2FtZT1oaSxhcy5pc1NhbWVPckFmdGVyPWRpLGFzLmlzU2FtZU9yQmVmb3JlPWxpLGFzLmlzVmFsaWQ9
21167UGksYXMubGFuZz1lcyxhcy5sb2NhbGU9d2ksYXMubG9jYWxlRGF0YT14aSxhcy5tYXg9cW4sYXMubWluPVVuLGFzLnBhcnNpbmdGbGFncz1JaSxhcy5zZXQ9cnQsYXMuc3RhcnRPZj1raSxhcy5zdWJ0cmFjdD10cyxhcy50b0FycmF5PU9pLGFzLnRvT2JqZWN0PUVpLGFzLnRvRGF0ZT1DaSxhcy50b0lTT1N0cmluZz1maSxhcy5pbnNwZWN0PW1pLGFzLnRvSlNPTj1UaSxhcy50b1N0cmluZz1waSxhcy51bml4PU1pLGFzLnZhbHVlT2Y9RGksYXMuY3JlYXRpb25EYXRhPVJpLGFzLnllYXI9Ym4sYXMuaXNMZWFwWWVhcj1ldCxhcy53ZWVrWWVhcj16aSxhcy5pc29XZWVrWWVhcj1MaSxhcy5xdWFydGVyPWFzLnF1YXJ0ZXJzPVdpLGFzLm1vbnRoPWZ0LGFzLmRheXNJbk1vbnRoPW10LGFzLndlZWs9YXMud2Vla3M9T3QsYXMuaXNvV2Vlaz1hcy5pc29XZWVrcz1FdCxhcy53ZWVrc0luWWVhcj1CaSxhcy5pc29XZWVrc0luWWVhcj1GaSxhcy5kYXRlPWlzLGFzLmRheT1hcy5kYXlzPUx0LGFzLndlZWtkYXk9RnQsYXMuaXNvV2Vla2RheT1CdCxhcy5kYXlPZlllYXI9WWksYXMuaG91cj1hcy5ob3Vycz1Sbixhcy5taW51dGU9YXMubWludXRlcz1vcyxhcy5zZWNvbmQ9YXMuc2Vjb25kcz1ucyxhcy5taWxsaXNlY29uZD1hcy5taWxsaXNlY29uZHM9cnMsYXMudXRjT2Zmc2V0PUJlLGFzLnV0Yz1IZSxhcy5sb2NhbD1XZSxhcy5wYXJzZVpvbmU9WWUsYXMuaGFzQWxpZ25lZEhvdXJPZmZzZXQ9R2UsYXMuaXNEU1Q9VmUsYXMuaXNMb2NhbD1xZSxhcy5pc1V0Y09mZnNldD1YZSxhcy5pc1V0Yz1aZSxhcy5pc1VUQz1aZSxhcy56b25lQWJicj1WaSxhcy56b25lTmFtZT1VaSxhcy5kYXRlcz1rKFwiZGF0ZXMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIGRhdGUgaW5zdGVhZC5cIixpcyksYXMubW9udGhzPWsoXCJtb250aHMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbnRoIGluc3RlYWRcIixmdCksYXMueWVhcnM9ayhcInllYXJzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSB5ZWFyIGluc3RlYWRcIixibiksYXMuem9uZT1rKFwibW9tZW50KCkuem9uZSBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50KCkudXRjT2Zmc2V0IGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3Mvem9uZS9cIixqZSksYXMuaXNEU1RTaGlmdGVkPWsoXCJpc0RTVFNoaWZ0ZWQgaXMgZGVwcmVjYXRlZC4gU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvZHN0LXNoaWZ0ZWQvIGZvciBtb3JlIGluZm9ybWF0aW9uXCIsVWUpO3ZhciBocz1PLnByb3RvdHlwZTtocy5jYWxlbmRhcj1FLGhzLmxvbmdEYXRlRm9ybWF0PVQsaHMuaW52YWxpZERhdGU9UCxocy5vcmRpbmFsPUksaHMucHJlcGFyc2U9WmksaHMucG9zdGZvcm1hdD1aaSxocy5yZWxhdGl2ZVRpbWU9Tixocy5wYXN0RnV0dXJlPVIsaHMuc2V0PU0saHMubW9udGhzPWR0LGhzLm1vbnRoc1Nob3J0PWx0LGhzLm1vbnRoc1BhcnNlPWN0LGhzLm1vbnRoc1JlZ2V4PWd0LGhzLm1vbnRoc1Nob3J0UmVnZXg9dnQsaHMud2Vlaz1EdCxocy5maXJzdERheU9mWWVhcj1DdCxocy5maXJzdERheU9mV2Vlaz1NdCxocy53ZWVrZGF5cz1JdCxocy53ZWVrZGF5c01pbj1SdCxocy53ZWVrZGF5c1Nob3J0PU50LGhzLndlZWtkYXlzUGFyc2U9enQsaHMud2Vla2RheXNSZWdleD1qdCxocy53ZWVrZGF5c1Nob3J0UmVnZXg9SHQsaHMud2Vla2RheXNNaW5SZWdleD1XdCxocy5pc1BNPVh0LGhzLm1lcmlkaWVtPVp0LFF0KFwiZW5cIix7ZGF5T2ZNb250aE9yZGluYWxQYXJzZTovXFxkezEsMn0odGh8c3R8bmR8cmQpLyxvcmRpbmFsOmZ1bmN0aW9uKHQpe3ZhciBlPXQlMTA7cmV0dXJuIHQrKDE9PT1fKHQlMTAwLzEwKT9cInRoXCI6MT09PWU/XCJzdFwiOjI9PT1lP1wibmRcIjozPT09ZT9cInJkXCI6XCJ0aFwiKX19KSxlLmxhbmc9ayhcIm1vbWVudC5sYW5nIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlIGluc3RlYWQuXCIsUXQpLGUubGFuZ0RhdGE9ayhcIm1vbWVudC5sYW5nRGF0YSBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZURhdGEgaW5zdGVhZC5cIixpZSk7dmFyIGRzPU1hdGguYWJzLGxzPW1vKFwibXNcIiksdXM9bW8oXCJzXCIpLGNzPW1vKFwibVwiKSxwcz1tbyhcImhcIiksZnM9bW8oXCJkXCIpLG1zPW1vKFwid1wiKSx2cz1tbyhcIk1cIiksZ3M9bW8oXCJ5XCIpLHlzPXlvKFwibWlsbGlzZWNvbmRzXCIpLGJzPXlvKFwic2Vjb25kc1wiKSxfcz15byhcIm1pbnV0ZXNcIiksd3M9eW8oXCJob3Vyc1wiKSx4cz15byhcImRheXNcIiksa3M9eW8oXCJtb250aHNcIiksU3M9eW8oXCJ5ZWFyc1wiKSxEcz1NYXRoLnJvdW5kLE1zPXtzczo0NCxzOjQ1LG06NDUsaDoyMixkOjI2LE06MTF9LENzPU1hdGguYWJzLE9zPUllLnByb3RvdHlwZTtyZXR1cm4gT3MuaXNWYWxpZD1UZSxPcy5hYnM9bm8sT3MuYWRkPXJvLE9zLnN1YnRyYWN0PWFvLE9zLmFzPXBvLE9zLmFzTWlsbGlzZWNvbmRzPWxzLE9zLmFzU2Vjb25kcz11cyxPcy5hc01pbnV0ZXM9Y3MsT3MuYXNIb3Vycz1wcyxPcy5hc0RheXM9ZnMsT3MuYXNXZWVrcz1tcyxPcy5hc01vbnRocz12cyxPcy5hc1llYXJzPWdzLE9zLnZhbHVlT2Y9Zm8sT3MuX2J1YmJsZT1sbyxPcy5jbG9uZT12byxPcy5nZXQ9Z28sT3MubWlsbGlzZWNvbmRzPXlzLE9zLnNlY29uZHM9YnMsT3MubWludXRlcz1fcyxPcy5ob3Vycz13cyxPcy5kYXlzPXhzLE9zLndlZWtzPWJvLE9zLm1vbnRocz1rcyxPcy55ZWFycz1TcyxPcy5odW1hbml6ZT1TbyxPcy50b0lTT1N0cmluZz1NbyxPcy50b1N0cmluZz1NbyxPcy50b0pTT049TW8sT3MubG9jYWxlPXdpLE9zLmxvY2FsZURhdGE9eGksT3MudG9Jc29TdHJpbmc9ayhcInRvSXNvU3RyaW5nKCkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0b0lTT1N0cmluZygpIGluc3RlYWQgKG5vdGljZSB0aGUgY2FwaXRhbHMpXCIsTW8pLE9zLmxhbmc9ZXMsSChcIlhcIiwwLDAsXCJ1bml4XCIpLEgoXCJ4XCIsMCwwLFwidmFsdWVPZlwiKSxVKFwieFwiLGVuKSxVKFwiWFwiLHNuKSxLKFwiWFwiLGZ1bmN0aW9uKHQsZSxpKXtpLl9kPW5ldyBEYXRlKDFlMypwYXJzZU
21167Zsb2F0KHQsMTApKX0pLEsoXCJ4XCIsZnVuY3Rpb24odCxlLGkpe2kuX2Q9bmV3IERhdGUoXyh0KSl9KSxlLnZlcnNpb249XCIyLjE5LjFcIixmdW5jdGlvbih0KXtDbz10fShEZSksZS5mbj1hcyxlLm1pbj1DZSxlLm1heD1PZSxlLm5vdz1YbixlLnV0Yz11LGUudW5peD1xaSxlLm1vbnRocz1RaSxlLmlzRGF0ZT1hLGUubG9jYWxlPVF0LGUuaW52YWxpZD1tLGUuZHVyYXRpb249S2UsZS5pc01vbWVudD15LGUud2Vla2RheXM9ZW8sZS5wYXJzZVpvbmU9WGksZS5sb2NhbGVEYXRhPWllLGUuaXNEdXJhdGlvbj1OZSxlLm1vbnRoc1Nob3J0PXRvLGUud2Vla2RheXNNaW49b28sZS5kZWZpbmVMb2NhbGU9dGUsZS51cGRhdGVMb2NhbGU9ZWUsZS5sb2NhbGVzPW9lLGUud2Vla2RheXNTaG9ydD1pbyxlLm5vcm1hbGl6ZVVuaXRzPXosZS5yZWxhdGl2ZVRpbWVSb3VuZGluZz14byxlLnJlbGF0aXZlVGltZVRocmVzaG9sZD1rbyxlLmNhbGVuZGFyRm9ybWF0PWlpLGUucHJvdG90eXBlPWFzLGV9KX0pLmNhbGwoZSxpKDE1NSkodCkpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdC53ZWJwYWNrUG9seWZpbGx8fCh0LmRlcHJlY2F0ZT1mdW5jdGlvbigpe30sdC5wYXRocz1bXSx0LmNoaWxkcmVufHwodC5jaGlsZHJlbj1bXSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJsb2FkZWRcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5sfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiaWRcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5pfX0pLHQud2VicGFja1BvbHlmaWxsPTEpLHR9fSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCl7dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIit0K1wiJy5cIil9aS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuW119LGkucmVzb2x2ZT1pLHQuZXhwb3J0cz1pLGkuaWQ9MTU2fSxmdW5jdGlvbih0LGUsaSl7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGkodCxlLGkpe3ZhciBvPWUmJml8fDAsbj0wO2ZvcihlPWV8fFtdLHQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bMC05YS1mXXsyfS9nLGZ1bmN0aW9uKHQpe248MTYmJihlW28rbisrXT11W3RdKX0pO248MTY7KWVbbytuKytdPTA7cmV0dXJuIGV9ZnVuY3Rpb24gbyh0LGUpe3ZhciBpPWV8fDAsbz1sO3JldHVybiBvW3RbaSsrXV0rb1t0W2krK11dK29bdFtpKytdXStvW3RbaSsrXV0rXCItXCIrb1t0W2krK11dK29bdFtpKytdXStcIi1cIitvW3RbaSsrXV0rb1t0W2krK11dK1wiLVwiK29bdFtpKytdXStvW3RbaSsrXV0rXCItXCIrb1t0W2krK11dK29bdFtpKytdXStvW3RbaSsrXV0rb1t0W2krK11dK29bdFtpKytdXStvW3RbaSsrXV19ZnVuY3Rpb24gbih0LGUsaSl7dmFyIG49ZSYmaXx8MCxzPWV8fFtdO3Q9dHx8e307dmFyIHI9dm9pZCAwIT09dC5jbG9ja3NlcT90LmNsb2Nrc2VxOm0sYT12b2lkIDAhPT10Lm1zZWNzP3QubXNlY3M6KG5ldyBEYXRlKS5nZXRUaW1lKCksaD12b2lkIDAhPT10Lm5zZWNzP3QubnNlY3M6ZysxLGQ9YS12KyhoLWcpLzFlNDtpZihkPDAmJnZvaWQgMD09PXQuY2xvY2tzZXEmJihyPXIrMSYxNjM4MyksKGQ8MHx8YT52KSYmdm9pZCAwPT09dC5uc2VjcyYmKGg9MCksaD49MWU0KXRocm93IG5ldyBFcnJvcihcInV1aWQudjEoKTogQ2FuJ3QgY3JlYXRlIG1vcmUgdGhhbiAxME0gdXVpZHMvc2VjXCIpO3Y9YSxnPWgsbT1yLGErPTEyMjE5MjkyOGU1O3ZhciBsPSgxZTQqKDI2ODQzNTQ1NSZhKStoKSU0Mjk0OTY3Mjk2O3NbbisrXT1sPj4+MjQmMjU1LHNbbisrXT1sPj4+MTYmMjU1LHNbbisrXT1sPj4+OCYyNTUsc1tuKytdPTI1NSZsO3ZhciB1PWEvNDI5NDk2NzI5NioxZTQmMjY4NDM1NDU1O3NbbisrXT11Pj4+OCYyNTUsc1tuKytdPTI1NSZ1LHNbbisrXT11Pj4+MjQmMTV8MTYsc1tuKytdPXU+Pj4xNiYyNTUsc1tuKytdPXI+Pj44fDEyOCxzW24rK109MjU1JnI7Zm9yKHZhciBjPXQubm9kZXx8ZixwPTA7cDw2O3ArKylzW24rcF09Y1twXTtyZXR1cm4gZXx8byhzKX1mdW5jdGlvbiBzKHQsZSxpKXt2YXIgbj1lJiZpfHwwO1wic3RyaW5nXCI9PXR5cGVvZiB0JiYoZT1cImJpbmFyeVwiPT10P25ldyBBcnJheSgxNik6bnVsbCx0PW51bGwpLHQ9dHx8e307dmFyIHM9dC5yYW5kb218fCh0LnJuZ3x8cikoKTtpZihzWzZdPTE1JnNbNl18NjQsc1s4XT02MyZzWzhdfDEyOCxlKWZvcih2YXIgYT0wO2E8MTY7YSsrKWVbbithXT1zW2FdO3JldHVybiBlfHxvKHMpfXZhciByLGE9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dm9pZCAwIT09ZT9lOm51bGw7aWYoYSYmYS5jcnlwdG8mJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpe3ZhciBoPW5ldyBVaW50OEFycmF5KDE2KTtyPWZ1bmN0aW9uKCl7cmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoaCksaH19aWYoIXIpe3ZhciBkPW5ldyBBcnJheSgxNik7cj1mdW5jdGlvbigpe2Zvcih2YXIgdCxlPTA7ZTwxNjtlKyspMD09KDMmZSkmJih0PTQyOTQ5NjcyOTYqTWF0aC5yYW5kb20oKSksZFtlXT10Pj4+KCgzJmUpPDwzKSYyNTU7cmV0dXJuIGR9fWZvcih2YXIgbD1bXSx1PXt9LGM9MDtjPDI1NjtjKyspbFtjXT0oYysyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSksdVtsW2NdXT1jO3ZhciBwPXIoKSxmPVsxfHBbMF0scFsxXSxwWzJdLHBbM10scFs0XSxwWzVdXSxtPTE2MzgzJihwWzZdPDw4fHBbN10pLHY9MCxnPTAseT1zO3kudjE9bix5LnY0PXMseS5wYXJzZT1pLHkudW5wYXJzZT1vLHQuZXhwb3J0cz15fSkuY2FsbChlLGkoMTU4KSl9LGZ1bmN0aW9uKHQsZSl7dmFyIGk7aT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSgpO3RyeXtpPWl8fEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKXx8KDAsZXZhbCkoXCJ0aGlzXCIpfWNhdGNoKHQpe1wib2JqZWN0XCI9PXR5cGVvZiB3aW5kb3cmJihpPXdpbmRvdyl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxpKXtlLnV0aWw9aSgyKSxlLkRPTXV0aWw9aSgxNCksZS5EYXRhU2V0PWkoMTEpLGUuRGF0YVZpZXc9aSgxMiksZS5RdWV1ZT1pKDQzKSxlLkdyYXBoM2Q9aSgxNjEpLGUuZ3JhcGgzZD17Q2FtZXJhOmkoOTUpLEZpbHRlcjppKDk2KSxQb2ludDJkOmkoOTEpLFBvaW50M2Q6aSgzNCksU2xpZGVyOmkoOTIpLFN0ZXBOdW1iZXI6aSg5Myl9LGUubW9tZW50PWkoOSksZS5IYW1tZXI9aSgxMCksZS5rZXljaGFybT1pKDM1KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoNyksbj1vLkpTT058fChvLkpTT049e3N0cmluZ2lmeTpKU09OLnN0cmluZ2lmeX0pO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbi5zdHJpbmdpZnkuYXBwbHkobixhcmd1bWVudHMpfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG8pKXRocm93IG5ldyBTeW50YXhFcnJvcihcIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvclwiKTt0aGlzLmNvbnRhaW5lckVsZW1lbnQ9dCx0aGlzLmRhdGFHcm91cD1uZXcgXyx0aGlzLmRhdGFQb2ludHM9bnVsbCx0aGlzLmNyZWF0ZSgpLGYuc2V0RGVmYXVsdHMoby5ERUZBVUxUUyx0aGlzKSx0aGlzLmNvbFg9dm9pZCAwLHRoaXMuY29sWT12b2lkIDAsdGhpcy5jb2xaPXZvaWQgMCx0aGlzLmNvbFZhbHVlPXZvaWQgMCx0aGlzLnNldE9wdGlvbnMoaSksdGhpcy5zZXREYXRhKGUpfWZ1bmN0aW9uIG4odCl7cmV0dXJuXCJjbGllbnRYXCJpbiB0P3QuY2xpZW50WDp0LnRhcmdldFRvdWNoZXNbMF0mJnQudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRYfHwwfWZ1bmN0aW9uIHModCl7cmV0dXJuXCJjbGllbnRZXCJpbiB0P3QuY2xpZW50WTp0LnRhcmdldFRvdWNoZXNbMF0mJnQudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRZfHwwfXZhciByPWkoOTApLGE9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShyKSxoPWkoNDQpLGQ9aSgyKSxsPWkoMzQpLHU9aSg5MSksYz1pKDkyKSxwPWkoOTMpLGY9aSg5NCksbT1pKDE1KS5kZWZh
21167dWx0LHY9aSgxNSksZz12LnByaW50U3R5bGUseT1pKDE3MiksYj15LmFsbE9wdGlvbnMsXz1pKDE3Myk7by5TVFlMRT1mLlNUWUxFO28uREVGQVVMVFM9e3dpZHRoOlwiNDAwcHhcIixoZWlnaHQ6XCI0MDBweFwiLGZpbHRlckxhYmVsOlwidGltZVwiLGxlZ2VuZExhYmVsOlwidmFsdWVcIix4TGFiZWw6XCJ4XCIseUxhYmVsOlwieVwiLHpMYWJlbDpcInpcIix4VmFsdWVMYWJlbDpmdW5jdGlvbih0KXtyZXR1cm4gdH0seVZhbHVlTGFiZWw6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHpWYWx1ZUxhYmVsOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxzaG93WEF4aXM6ITAsc2hvd1lBeGlzOiEwLHNob3daQXhpczohMCxzaG93R3JpZDohMCxzaG93UGVyc3BlY3RpdmU6ITAsc2hvd1NoYWRvdzohMSxrZWVwQXNwZWN0UmF0aW86ITAsdmVydGljYWxSYXRpbzouNSxkb3RTaXplUmF0aW86LjAyLGRvdFNpemVNaW5GcmFjdGlvbjouNSxkb3RTaXplTWF4RnJhY3Rpb246Mi41LHNob3dBbmltYXRpb25Db250cm9sczp2b2lkIDAsYW5pbWF0aW9uSW50ZXJ2YWw6MWUzLGFuaW1hdGlvblByZWxvYWQ6ITEsYW5pbWF0aW9uQXV0b1N0YXJ0OnZvaWQgMCxheGlzQ29sb3I6XCIjNEQ0RDREXCIsZ3JpZENvbG9yOlwiI0QzRDNEM1wiLHhDZW50ZXI6XCI1NSVcIix5Q2VudGVyOlwiNTAlXCIsc3R5bGU6by5TVFlMRS5ET1QsdG9vbHRpcDohMSx0b29sdGlwU3R5bGU6e2NvbnRlbnQ6e3BhZGRpbmc6XCIxMHB4XCIsYm9yZGVyOlwiMXB4IHNvbGlkICM0ZDRkNGRcIixjb2xvcjpcIiMxYTFhMWFcIixiYWNrZ3JvdW5kOlwicmdiYSgyNTUsMjU1LDI1NSwwLjcpXCIsYm9yZGVyUmFkaXVzOlwiMnB4XCIsYm94U2hhZG93OlwiNXB4IDVweCAxMHB4IHJnYmEoMTI4LDEyOCwxMjgsMC41KVwifSxsaW5lOntoZWlnaHQ6XCI0MHB4XCIsd2lkdGg6XCIwXCIsYm9yZGVyTGVmdDpcIjFweCBzb2xpZCAjNGQ0ZDRkXCJ9LGRvdDp7aGVpZ2h0OlwiMFwiLHdpZHRoOlwiMFwiLGJvcmRlcjpcIjVweCBzb2xpZCAjNGQ0ZDRkXCIsYm9yZGVyUmFkaXVzOlwiNXB4XCJ9fSxkYXRhQ29sb3I6e2ZpbGw6XCIjN0RDMUZGXCIsc3Ryb2tlOlwiIzMyNjdEMlwiLHN0cm9rZVdpZHRoOjF9LGNhbWVyYVBvc2l0aW9uOntob3Jpem9udGFsOjEsdmVydGljYWw6LjUsZGlzdGFuY2U6MS43fSxzaG93TGVnZW5kOnZvaWQgMCxiYWNrZ3JvdW5kQ29sb3I6dm9pZCAwLHhCYXJXaWR0aDp2b2lkIDAseUJhcldpZHRoOnZvaWQgMCx2YWx1ZU1pbjp2b2lkIDAsdmFsdWVNYXg6dm9pZCAwLHhNaW46dm9pZCAwLHhNYXg6dm9pZCAwLHhTdGVwOnZvaWQgMCx5TWluOnZvaWQgMCx5TWF4OnZvaWQgMCx5U3RlcDp2b2lkIDAsek1pbjp2b2lkIDAsek1heDp2b2lkIDAselN0ZXA6dm9pZCAwfSxoKG8ucHJvdG90eXBlKSxvLnByb3RvdHlwZS5fc2V0U2NhbGU9ZnVuY3Rpb24oKXt0aGlzLnNjYWxlPW5ldyBsKDEvdGhpcy54UmFuZ2UucmFuZ2UoKSwxL3RoaXMueVJhbmdlLnJhbmdlKCksMS90aGlzLnpSYW5nZS5yYW5nZSgpKSx0aGlzLmtlZXBBc3BlY3RSYXRpbyYmKHRoaXMuc2NhbGUueDx0aGlzLnNjYWxlLnk/dGhpcy5zY2FsZS55PXRoaXMuc2NhbGUueDp0aGlzLnNjYWxlLng9dGhpcy5zY2FsZS55KSx0aGlzLnNjYWxlLnoqPXRoaXMudmVydGljYWxSYXRpbyx2b2lkIDAhPT10aGlzLnZhbHVlUmFuZ2UmJih0aGlzLnNjYWxlLnZhbHVlPTEvdGhpcy52YWx1ZVJhbmdlLnJhbmdlKCkpO3ZhciB0PXRoaXMueFJhbmdlLmNlbnRlcigpKnRoaXMuc2NhbGUueCxlPXRoaXMueVJhbmdlLmNlbnRlcigpKnRoaXMuc2NhbGUueSxpPXRoaXMuelJhbmdlLmNlbnRlcigpKnRoaXMuc2NhbGUuejt0aGlzLmNhbWVyYS5zZXRBcm1Mb2NhdGlvbih0LGUsaSl9LG8ucHJvdG90eXBlLl9jb252ZXJ0M0R0bzJEPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NvbnZlcnRQb2ludFRvVHJhbnNsYXRpb24odCk7cmV0dXJuIHRoaXMuX2NvbnZlcnRUcmFuc2xhdGlvblRvU2NyZWVuKGUpfSxvLnByb3RvdHlwZS5fY29udmVydFBvaW50VG9UcmFuc2xhdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNhbWVyYS5nZXRDYW1lcmFMb2NhdGlvbigpLGk9dGhpcy5jYW1lcmEuZ2V0Q2FtZXJhUm90YXRpb24oKSxvPXQueCp0aGlzLnNjYWxlLngsbj10LnkqdGhpcy5zY2FsZS55LHM9dC56KnRoaXMuc2NhbGUueixyPWUueCxhPWUueSxoPWUueixkPU1hdGguc2luKGkueCksdT1NYXRoLmNvcyhpLngpLGM9TWF0aC5zaW4oaS55KSxwPU1hdGguY29zKGkueSksZj1NYXRoLnNpbihpLnopLG09TWF0aC5jb3MoaS56KTtyZXR1cm4gbmV3IGwocCooZioobi1hKSttKihvLXIpKS1jKihzLWgpLGQqKHAqKHMtaCkrYyooZioobi1hKSttKihvLXIpKSkrdSoobSoobi1hKS1mKihvLXIpKSx1KihwKihzLWgpK2MqKGYqKG4tYSkrbSooby1yKSkpLWQqKG0qKG4tYSktZiooby1yKSkpfSxvLnByb3RvdHlwZS5fY29udmVydFRyYW5zbGF0aW9uVG9TY3JlZW49ZnVuY3Rpb24odCl7dmFyIGUsaSxvPXRoaXMuZXllLngsbj10aGlzLmV5ZS55LHM9dGhpcy5leWUueixyPXQueCxhPXQueSxoPXQuejtyZXR1cm4gdGhpcy5zaG93UGVyc3BlY3RpdmU/KGU9cy9oKihyLW8pLGk9cy9oKihhLW4pKTooZT1yKigtcy90aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKSksaT1hKigtcy90aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKSkpLG5ldyB1KHRoaXMuY3VycmVudFhDZW50ZXIrZSp0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCx0aGlzLmN1cnJlbnRZQ2VudGVyLWkqdGhpcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgpfSxvLnByb3RvdHlwZS5fY2FsY1RyYW5zbGF0aW9ucz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIGk9dFtlXTtpLnRyYW5zPXRoaXMuX2NvbnZlcnRQb2ludFRvVHJhbnNsYXRpb24oaS5wb2ludCksaS5zY3JlZW49dGhpcy5fY29udmVydFRyYW5zbGF0aW9uVG9TY3JlZW4oaS50cmFucyk7dmFyIG89dGhpcy5fY29udmVydFBvaW50VG9UcmFuc2xhdGlvbihpLmJvdHRvbSk7aS5kaXN0PXRoaXMuc2hvd1BlcnNwZWN0aXZlP28ubGVuZ3RoKCk6LW8uen12YXIgbj1mdW5jdGlvbih0LGUpe3JldHVybiBlLmRpc3QtdC5kaXN0fTt0LnNvcnQobil9LG8ucHJvdG90eXBlLl9pbml0aWFsaXplUmFuZ2VzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kYXRhR3JvdXA7dGhpcy54UmFuZ2U9dC54UmFuZ2UsdGhpcy55UmFuZ2U9dC55UmFuZ2UsdGhpcy56UmFuZ2U9dC56UmFuZ2UsdGhpcy52YWx1ZVJhbmdlPXQudmFsdWVSYW5nZSx0aGlzLnhTdGVwPXQueFN0ZXAsdGhpcy55U3RlcD10LnlTdGVwLHRoaXMuelN0ZXA9dC56U3RlcCx0aGlzLnhCYXJXaWR0aD10LnhCYXJXaWR0aCx0aGlzLnlCYXJXaWR0aD10LnlCYXJXaWR0aCx0aGlzLmNvbFg9dC5jb2xYLHRoaXMuY29sWT10LmNvbFksdGhpcy5jb2xaPXQuY29sWix0aGlzLmNvbFZhbHVlPXQuY29sVmFsdWUsdGhpcy5fc2V0U2NhbGUoKX0sby5wcm90b3R5cGUuZ2V0RGF0YVBvaW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgbz1uZXcgbDtvLng9dFtpXVt0aGlzLmNvbFhdfHwwLG8ueT10W2ldW3RoaXMuY29sWV18fDAsby56PXRbaV1bdGhpcy5jb2xaXXx8MCxvLmRhdGE9dFtpXSx2b2lkIDAhPT10aGlzLmNvbFZhbHVlJiYoby52YWx1ZT10W2ldW3RoaXMuY29sVmFsdWVdfHwwKTt2YXIgbj17fTtuLnBvaW50PW8sbi5ib3R0b209bmV3IGwoby54LG8ueSx0aGlzLnpSYW5nZS5taW4pLG4udHJhbnM9dm9pZCAwLG4uc2NyZWVuPXZvaWQgMCxlLnB1c2gobil9cmV0dXJuIGV9LG8ucHJvdG90eXBlLl9nZXREYXRhUG9pbnRzPWZ1bmN0aW9uKHQpe3ZhciBlLGksbixzLHI9W107aWYodGhpcy5zdHlsZT09PW8uU1RZTEUuR1JJRHx8dGhpcy5zdHlsZT09PW8uU1RZTEUuU1VSRkFDRSl7dmFyIGE9dGhpcy5kYXRhR3JvdXAuZ2V0RGlzdGluY3RWYWx1ZXModGhpcy5jb2xYLHQpLGg9dGh
21167pcy5kYXRhR3JvdXAuZ2V0RGlzdGluY3RWYWx1ZXModGhpcy5jb2xZLHQpO3I9dGhpcy5nZXREYXRhUG9pbnRzKHQpO3ZhciBkPVtdO2ZvcihuPTA7bjxyLmxlbmd0aDtuKyspe3M9cltuXTt2YXIgbD1hLmluZGV4T2Yocy5wb2ludC54KSx1PWguaW5kZXhPZihzLnBvaW50LnkpO3ZvaWQgMD09PWRbbF0mJihkW2xdPVtdKSxkW2xdW3VdPXN9Zm9yKGU9MDtlPGQubGVuZ3RoO2UrKylmb3IoaT0wO2k8ZFtlXS5sZW5ndGg7aSsrKWRbZV1baV0mJihkW2VdW2ldLnBvaW50UmlnaHQ9ZTxkLmxlbmd0aC0xP2RbZSsxXVtpXTp2b2lkIDAsZFtlXVtpXS5wb2ludFRvcD1pPGRbZV0ubGVuZ3RoLTE/ZFtlXVtpKzFdOnZvaWQgMCxkW2VdW2ldLnBvaW50Q3Jvc3M9ZTxkLmxlbmd0aC0xJiZpPGRbZV0ubGVuZ3RoLTE/ZFtlKzFdW2krMV06dm9pZCAwKX1lbHNlIGlmKHRoaXMuX2NoZWNrVmFsdWVGaWVsZCh0KSxyPXRoaXMuZ2V0RGF0YVBvaW50cyh0KSx0aGlzLnN0eWxlPT09by5TVFlMRS5MSU5FKWZvcihuPTA7bjxyLmxlbmd0aDtuKyspbj4wJiYocltuLTFdLnBvaW50TmV4dD1yW25dKTtyZXR1cm4gcn0sby5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLmNvbnRhaW5lckVsZW1lbnQuaGFzQ2hpbGROb2RlcygpOyl0aGlzLmNvbnRhaW5lckVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5jb250YWluZXJFbGVtZW50LmZpcnN0Q2hpbGQpO3RoaXMuZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmZyYW1lLnN0eWxlLnBvc2l0aW9uPVwicmVsYXRpdmVcIix0aGlzLmZyYW1lLnN0eWxlLm92ZXJmbG93PVwiaGlkZGVuXCIsdGhpcy5mcmFtZS5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSx0aGlzLmZyYW1lLmNhbnZhcy5zdHlsZS5wb3NpdGlvbj1cInJlbGF0aXZlXCIsdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmZyYW1lLmNhbnZhcyk7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIkRJVlwiKTt0LnN0eWxlLmNvbG9yPVwicmVkXCIsdC5zdHlsZS5mb250V2VpZ2h0PVwiYm9sZFwiLHQuc3R5bGUucGFkZGluZz1cIjEwcHhcIix0LmlubmVySFRNTD1cIkVycm9yOiB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBIVE1MIGNhbnZhc1wiLHRoaXMuZnJhbWUuY2FudmFzLmFwcGVuZENoaWxkKHQpLHRoaXMuZnJhbWUuZmlsdGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5mcmFtZS5maWx0ZXIuc3R5bGUucG9zaXRpb249XCJhYnNvbHV0ZVwiLHRoaXMuZnJhbWUuZmlsdGVyLnN0eWxlLmJvdHRvbT1cIjBweFwiLHRoaXMuZnJhbWUuZmlsdGVyLnN0eWxlLmxlZnQ9XCIwcHhcIix0aGlzLmZyYW1lLmZpbHRlci5zdHlsZS53aWR0aD1cIjEwMCVcIix0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUuZmlsdGVyKTt2YXIgZT10aGlzLGk9ZnVuY3Rpb24odCl7ZS5fb25Nb3VzZURvd24odCl9LG89ZnVuY3Rpb24odCl7ZS5fb25Ub3VjaFN0YXJ0KHQpfSxuPWZ1bmN0aW9uKHQpe2UuX29uV2hlZWwodCl9LHM9ZnVuY3Rpb24odCl7ZS5fb25Ub29sdGlwKHQpfSxyPWZ1bmN0aW9uKHQpe2UuX29uQ2xpY2sodCl9O2QuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmZyYW1lLmNhbnZhcyxcIm1vdXNlZG93blwiLGkpLGQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmZyYW1lLmNhbnZhcyxcInRvdWNoc3RhcnRcIixvKSxkLmFkZEV2ZW50TGlzdGVuZXIodGhpcy5mcmFtZS5jYW52YXMsXCJtb3VzZXdoZWVsXCIsbiksZC5hZGRFdmVudExpc3RlbmVyKHRoaXMuZnJhbWUuY2FudmFzLFwibW91c2Vtb3ZlXCIscyksZC5hZGR
21167FdmVudExpc3RlbmVyKHRoaXMuZnJhbWUuY2FudmFzLFwiY2xpY2tcIixyKSx0aGlzLmNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZSl9LG8ucHJvdG90eXBlLl9zZXRTaXplPWZ1bmN0aW9uKHQsZSl7dGhpcy5mcmFtZS5zdHlsZS53aWR0aD10LHRoaXMuZnJhbWUuc3R5bGUuaGVpZ2h0PWUsdGhpcy5fcmVzaXplQ2FudmFzKCl9LG8ucHJvdG90eXBlLl9yZXNpemVDYW52YXM9ZnVuY3Rpb24oKXt0aGlzLmZyYW1lLmNhbnZhcy5zdHlsZS53aWR0aD1cIjEwMCVcIix0aGlzLmZyYW1lLmNhbnZhcy5zdHlsZS5oZWlnaHQ9XCIxMDAlXCIsdGhpcy5mcmFtZS5jYW52YXMud2lkdGg9dGhpcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgsdGhpcy5mcmFtZS5jYW52YXMuaGVpZ2h0PXRoaXMuZnJhbWUuY2FudmFzLmNsaWVudEhlaWdodCx0aGlzLmZyYW1lLmZpbHRlci5zdHlsZS53aWR0aD10aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aC0yMCtcInB4XCJ9LG8ucHJvdG90eXBlLmFuaW1hdGlvblN0YXJ0PWZ1bmN0aW9uKCl7aWYodGhpcy5hbmltYXRpb25BdXRvU3RhcnQmJnRoaXMuZGF0YUdyb3VwLmRhdGFGaWx0ZXIpe2lmKCF0aGlzLmZyYW1lLmZpbHRlcnx8IXRoaXMuZnJhbWUuZmlsdGVyLnNsaWRlcil0aHJvdyBuZXcgRXJyb3IoXCJObyBhbmltYXRpb24gYXZhaWxhYmxlXCIpO3RoaXMuZnJhbWUuZmlsdGVyLnNsaWRlci5wbGF5KCl9fSxvLnByb3RvdHlwZS5hbmltYXRpb25TdG9wPWZ1bmN0aW9uKCl7dGhpcy5mcmFtZS5maWx0ZXImJnRoaXMuZnJhbWUuZmlsdGVyLnNsaWRlciYmdGhpcy5mcmFtZS5maWx0ZXIuc2xpZGVyLnN0b3AoKX0sby5wcm90b3R5cGUuX3Jlc2l6ZUNlbnRlcj1mdW5jdGlvbigpe1wiJVwiPT09dGhpcy54Q2VudGVyLmNoYXJBdCh0aGlzLnhDZW50ZXIubGVuZ3RoLTEpP3RoaXMuY3VycmVudFhDZW50ZXI9cGFyc2VGbG9hdCh0aGlzLnhDZW50ZXIpLzEwMCp0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aDp0aGlzLmN1cnJlbnRYQ2VudGVyPXBhcnNlRmxvYXQodGhpcy54Q2VudGVyKSxcIiVcIj09PXRoaXMueUNlbnRlci5jaGFyQXQodGhpcy55Q2VudGVyLmxlbmd0aC0xKT90aGlzLmN1cnJlbnRZQ2VudGVyPXBhcnNlRmxvYXQodGhpcy55Q2VudGVyKS8xMDAqKHRoaXMuZnJhbWUuY2FudmFzLmNsaWVudEhlaWdodC10aGlzLmZyYW1lLmZpbHRlci5jbGllbnRIZWlnaHQpOnRoaXMuY3VycmVudFlDZW50ZXI9cGFyc2VGbG9hdCh0aGlzLnlDZW50ZXIpfSxvLnByb3RvdHlwZS5nZXRDYW1lcmFQb3NpdGlvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY2FtZXJhLmdldEFybVJvdGF0aW9uKCk7cmV0dXJuIHQuZGlzdGFuY2U9dGhpcy5jYW1lcmEuZ2V0QXJtTGVuZ3RoKCksdH0sby5wcm90b3R5cGUuX3JlYWREYXRhPWZ1bmN0aW9uKHQpe3RoaXMuZGF0YVBvaW50cz10aGlzLmRhdGFHcm91cC5pbml0aWFsaXplRGF0YSh0aGlzLHQsdGhpcy5zdHlsZSksdGhpcy5faW5pdGlhbGl6ZVJhbmdlcygpLHRoaXMuX3JlZHJhd0ZpbHRlcigpfSxvLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXQmJm51bGwhPT10JiYodGhpcy5fcmVhZERhdGEodCksdGhpcy5yZWRyYXcoKSx0aGlzLmFuaW1hdGlvblN0YXJ0KCkpfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpeyEwPT09bS52YWxpZGF0ZSh0LGIpJiZjb25zb2xlLmxvZyhcIiVjRXJyb3JzIGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUgc3VwcGxpZWQgb3B0aW9ucyBvYmplY3QuXCIsZyksdGhpcy5hbmltYXRpb25TdG9wKCksZi5zZXRPcHRpb25zKHQsdGhpcyksdGhpcy5zZXRQb2ludERyYXdpbmdNZXRob2QoKSx0aGlzLl9zZXRTaXplKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLHRoaXMuc2V0RGF0YSh0aGlzLmRhdGFHcm91cC5nZXREYXRhVGFibGUoKSksdGhpcy5hbmltYXRpb25TdGFydCgpfX0sby5wcm90b3R5cGUuc2V0UG9pbnREcmF3aW5nTWV0aG9kPWZ1bmN0aW9uKCl7dmFyIHQ9dm9pZCAwO3N3aXRjaCh0aGlzLnN0eWxlKXtjYXNlIG8uU1RZTEUuQkFSOnQ9by5wcm90b3R5cGUuX3JlZHJhd0JhckdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLkJBUkNPTE9SOnQ9by5wcm90b3R5cGUuX3JlZHJhd0JhckNvbG9yR3JhcGhQb2ludDticmVhaztjYXNlIG8uU1RZTEUuQkFSU0laRTp0PW8ucHJvdG90eXBlLl9yZWRyYXdCYXJTaXplR3JhcGhQb2ludDticmVhaztjYXNlIG8uU1RZTEUuRE9UOnQ9by5wcm90b3R5cGUuX3JlZHJhd0RvdEdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLkRPVExJTkU6dD1vLnByb3RvdHlwZS5fcmVkcmF3RG90TGluZUdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLkRPVENPTE9SOnQ9by5wcm90b3R5cGUuX3JlZHJhd0RvdENvbG9yR3JhcGhQb2ludDticmVhaztjYXNlIG8uU1RZTEUuRE9UU0laRTp0PW8ucHJvdG90eXBlLl9yZWRyYXdEb3RTaXplR3JhcGhQb2ludDticmVhaztjYXNlIG8uU1RZTEUuU1VSRkFDRTp0PW8ucHJvdG90eXBlLl9yZWRyYXdTdXJmYWNlR3JhcGhQb2ludDticmVhaztjYXNlIG8uU1RZTEUuR1JJRDp0PW8ucHJvdG90eXBlLl9yZWRyYXdHcmlkR3JhcGhQb2ludDticmVhaztjYXNlIG8uU1RZTEUuTElORTp0PW8ucHJvdG90eXBlLl9yZWRyYXdMaW5lR3JhcGhQb2ludDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihcIkNhbiBub3QgZGV0ZXJtaW5lIHBvaW50IGRyYXdpbmcgbWV0aG9kIGZvciBncmFwaCBzdHlsZSAnXCIrdGhpcy5zdHlsZStcIidcIil9dGhpcy5fcG9pbnREcmF3aW5nTWV0aG9kPXR9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe2lmKHZvaWQgMD09PXRoaXMuZGF0YVBvaW50cyl0aHJvdyBuZXcgRXJyb3IoXCJHcmFwaCBkYXRhIG5vdCBpbml0aWFsaXplZFwiKTt0aGlzLl9yZXNpemVDYW52YXMoKSx0aGlzLl9yZXNpemVDZW50ZXIoKSx0aGlzLl9yZWRyYXdTbGlkZXIoKSx0aGlzLl9yZWRyYXdDbGVhcigpLHRoaXMuX3JlZHJhd0F4aXMoKSx0aGlzLl9yZWRyYXdEYXRhR3JhcGgoKSx0aGlzLl9yZWRyYXdJbmZvKCksdGhpcy5fcmVkcmF3TGVnZW5kKCl9LG8ucHJvdG90eXBlLl9nZXRDb250ZXh0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5mcmFtZS5jYW52YXMsZT10LmdldENvbnRleHQoXCIyZFwiKTtyZXR1cm4gZS5saW5lSm9pbj1cInJvdW5kXCIsZS5saW5lQ2FwPVwicm91bmRcIixlfSxvLnByb3RvdHlwZS5fcmVkcmF3Q2xlYXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmZyYW1lLmNhbnZhczt0LmdldENvbnRleHQoXCIyZFwiKS5jbGVhclJlY3QoMCwwLHQud2lkdGgsdC5oZWlnaHQpfSxvLnByb3RvdHlwZS5fZG90U2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZyYW1lLmNsaWVudFdpZHRoKnRoaXMuZG90U2l6ZVJhdGlvfSxvLnByb3RvdHlwZS5fZ2V0TGVnZW5kV2lkdGg9ZnVuY3Rpb24oKXt2YXIgdDtpZih0aGlzLnN0eWxlPT09by5TVFlMRS5ET1RTSVpFKXt0PXRoaXMuX2RvdFNpemUoKSp0aGlzLmRvdFNpemVNYXhGcmFjdGlvbn1lbHNlI
21167HQ9dGhpcy5zdHlsZT09PW8uU1RZTEUuQkFSU0laRT90aGlzLnhCYXJXaWR0aDoyMDtyZXR1cm4gdH0sby5wcm90b3R5cGUuX3JlZHJhd0xlZ2VuZD1mdW5jdGlvbigpe2lmKCEwPT09dGhpcy5zaG93TGVnZW5kJiZ0aGlzLnN0eWxlIT09by5TVFlMRS5MSU5FJiZ0aGlzLnN0eWxlIT09by5TVFlMRS5CQVJTSVpFKXt2YXIgdD10aGlzLnN0eWxlPT09by5TVFlMRS5CQVJTSVpFfHx0aGlzLnN0eWxlPT09by5TVFlMRS5ET1RTSVpFLGU9dGhpcy5zdHlsZT09PW8uU1RZTEUuRE9UU0laRXx8dGhpcy5zdHlsZT09PW8uU1RZTEUuRE9UQ09MT1J8fHRoaXMuc3R5bGU9PT1vLlNUWUxFLkJBUkNPTE9SLGk9TWF0aC5tYXgoLjI1KnRoaXMuZnJhbWUuY2xpZW50SGVpZ2h0LDEwMCksbj10aGlzLm1hcmdpbixzPXRoaXMuX2dldExlZ2VuZFdpZHRoKCkscj10aGlzLmZyYW1lLmNsaWVudFdpZHRoLXRoaXMubWFyZ2luLGE9ci1zLGg9bitpLGQ9dGhpcy5fZ2V0Q29udGV4dCgpO2lmKGQubGluZVdpZHRoPTEsZC5mb250PVwiMTRweCBhcmlhbFwiLCExPT09dCl7dmFyIGwsYz1pO2ZvcihsPTA7bDxjO2wrKyl7dmFyIGY9KGwtMCkvKGMtMCksbT0yNDAqZix2PXRoaXMuX2hzdjJyZ2IobSwxLDEpO2Quc3Ryb2tlU3R5bGU9dixkLmJlZ2luUGF0aCgpLGQubW92ZVRvKGEsbitsKSxkLmxpbmVUbyhyLG4rbCksZC5zdHJva2UoKX1kLnN0cm9rZVN0eWxlPXRoaXMuYXhpc0NvbG9yLGQuc3Ryb2tlUmVjdChhLG4scyxpKX1lbHNle3ZhciBnO3RoaXMuc3R5bGU9PT1vLlNUWUxFLkRPVFNJWkU/Zz1zKih0aGlzLmRvdFNpemVNaW5GcmFjdGlvbi90aGlzLmRvdFNpemVNYXhGcmFjdGlvbik6KHRoaXMuc3R5bGUsby5TVFlMRS5CQVJTSVpFKSxkLnN0cm9rZVN0eWxlPXRoaXMuYXhpc0NvbG9yLGQuZmlsbFN0eWxlPXRoaXMuZGF0YUNvbG9yLmZpbGwsZC5iZWdpblBhdGgoKSxkLm1vdmVUbyhhLG4pLGQubGluZVRvKHIsbiksZC5saW5lVG8oYStnLGgpLGQubGluZVRvKGEsaCksZC5jbG9zZVBhdGgoKSxkLmZpbGwoKSxkLnN0cm9rZSgpfXZhciB5PWU/dGhpcy52YWx1ZVJhbmdlLm1pbjp0aGlzLnpSYW5nZS5taW4sYj1lP3RoaXMudmFsdWVSYW5nZS5tYXg6dGhpcy56UmFuZ2UubWF4LF89bmV3IHAoeSxiLChiLXkpLzUsITApO18uc3RhcnQoITApO2Zvcih2YXIgdyx4OyFfLmVuZCgpOylsPWgtKF8uZ2V0Q3VycmVudCgpLXkpLyhiLXkpKmksdz1uZXcgdShhLTUsbCkseD1uZXcgdShhLGwpLHRoaXMuX2xpbmUoZCx3LHgpLGQudGV4dEFsaWduPVwicmlnaHRcIixkLnRleHRCYXNlbGluZT1cIm1pZGRsZVwiLGQuZmlsbFN0eWxlPXRoaXMuYXhpc0NvbG9yLGQuZmlsbFRleHQoXy5nZXRDdXJyZW50KCksYS0xMCxsKSxfLm5leHQoKTtkLnRleHRBbGlnbj1cInJpZ2h0XCIsZC50ZXh0QmFzZWxpbmU9XCJ0b3BcIjt2YXIgaz10aGlzLmxlZ2VuZExhYmVsO2QuZmlsbFRleHQoayxyLGgrdGhpcy5tYXJnaW4pfX0sby5wcm90b3R5cGUuX3JlZHJhd0ZpbHRlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZGF0YUdyb3VwLmRhdGFGaWx0ZXIsZT10aGlzLmZyYW1lLmZpbHRlcjtpZihlLmlubmVySFRNTD1cIlwiLCF0KXJldHVybiB2b2lkKGUuc2xpZGVyPXZvaWQgMCk7dmFyIGk9e3Zpc2libGU6dGhpcy5zaG93QW5pbWF0aW9uQ29udHJvbHN9LG89bmV3IGMoZSxpKTtlLnNsaWRlcj1vLGUuc3R5bGUucGFkZGluZz1cIjEwcHhcIixvLnNldFZhbHVlcyh0LnZhbHVlcyksby5zZXRQbGF5SW50ZXJ2YWwodGhpcy5hbmltYXRpb25JbnRlcnZhbCk7dmFyIG49dGhpcyxzPWZ1bmN0aW9uKCl7dmFyIHQ9bi5kYXRhR3JvdXAuZGF0YUZpbHRlcixlPW8uZ2V0SW5kZXgoKTt0LnNlbGVjdFZhbHVlKGUpLG4uZGF0YVBvaW50cz10Ll9nZXREYXRhUG9pbnRzKCksbi5yZWRyYXcoKX07by5zZXRPbkNoYW5nZUNhbGxiYWNrKHMpfSxvLnByb3RvdHlwZS5fcmVkcmF3U2xpZGVyPWZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5mcmFtZS5maWx0ZXIuc2xpZGVyJiZ0aGlzLmZyYW1lLmZpbHRlci5zbGlkZXIucmVkcmF3KCl9LG8ucHJvdG90eXBlLl9yZWRyYXdJbmZvPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kYXRhR3JvdXAuZ2V0SW5mbygpO2lmKHZvaWQgMCE9PXQpe3ZhciBlPXRoaXMuX2dldENvbnRleHQoKTtlLmZvbnQ9XCIxNHB4IGFyaWFsXCIsZS5saW5lU3R5bGU9XCJncmF5XCIsZS5maWxsU3R5bGU9XCJncmF5XCIsZS50ZXh0QWxpZ249XCJsZWZ0XCIsZS50ZXh0QmFzZWxpbmU9XCJ0b3BcIjt2YXIgaT10aGlzLm1hcmdpbixvPXRoaXMubWFyZ2luO2UuZmlsbFRleHQodCxpLG8pfX0sby5wcm90b3R5cGUuX2xpbmU9ZnVuY3Rpb24odCxlLGksbyl7dm9pZCAwIT09byYmKHQuc3Ryb2tlU3R5bGU9byksdC5iZWdpblBhdGgoKSx0Lm1vdmVUbyhlLngsZS55KSx0LmxpbmVUbyhpLngsaS55KSx0LnN0cm9rZSgpfSxvLnByb3RvdHlwZS5kcmF3QXhpc0xhYmVsWD1mdW5jdGlvbih0LGUsaSxvLG4pe3ZvaWQgMD09PW4mJihuPTApO3ZhciBzPXRoaXMuX2NvbnZlcnQzRHRvMkQoZSlcbjtNYXRoLmNvcygyKm8pPjA/KHQudGV4dEFsaWduPVwiY2VudGVyXCIsdC50ZXh0QmFzZWxpbmU9XCJ0b3BcIixzLnkrPW4pOk1hdGguc2luKDIqbyk8MD8odC50ZXh0QWxpZ249XCJyaWdodFwiLHQudGV4dEJhc2VsaW5lPVwibWlkZGxlXCIpOih0LnRleHRBbGlnbj1cImxlZnRcIix0LnRleHRCYXNlbGluZT1cIm1pZGRsZVwiKSx0LmZpbGxTdHlsZT10aGlzLmF4aXNDb2xvcix0LmZpbGxUZXh0KGkscy54LHMueSl9LG8ucHJvdG90eXBlLmRyYXdBeGlzTGFiZWxZPWZ1bmN0aW9uKHQsZSxpLG8sbil7dm9pZCAwPT09biYmKG49MCk7dmFyIHM9dGhpcy5fY29udmVydDNEdG8yRChlKTtNYXRoLmNvcygyKm8pPDA/KHQudGV4dEFsaWduPVwiY2VudGVyXCIsdC50ZXh0QmFzZWxpbmU9XCJ0b3BcIixzLnkrPW4pOk1hdGguc2luKDIqbyk+MD8odC50ZXh0QWxpZ249XCJyaWdodFwiLHQudGV4dEJhc2VsaW5lPVwibWlkZGxlXCIpOih0LnRleHRBbGlnbj1cImxlZnRcIix0LnRleHRCYXNlbGluZT1cIm1pZGRsZVwiKSx0LmZpbGxTdHlsZT10aGlzLmF4aXNDb2xvcix0LmZpbGxUZXh0KGkscy54LHMueSl9LG8ucHJvdG90eXBlLmRyYXdBeGlzTGFiZWxaPWZ1bmN0aW9uKHQsZSxpLG8pe3ZvaWQgMD09PW8mJihvPTApO3ZhciBuPXRoaXMuX2NvbnZlcnQzRHRvMkQoZSk7dC50ZXh0QWxpZ249XCJyaWdodFwiLHQudGV4dEJhc2VsaW5lPVwibWlkZGxlXCIsdC5maWxsU3R5bGU9dGhpcy5heGlzQ29sb3IsdC5maWxsVGV4dChpLG4ueC1vLG4ueSl9LG8ucHJvdG90eXBlLl9saW5lM2Q9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49dGhpcy5fY29udmVydDNEdG8yRChlKSxzPXRoaXMuX2NvbnZlcnQzRHRvMkQoaSk7dGhpcy5fbGluZSh0LG4scyxvKX0sby5wcm90b3R5cGUuX3JlZHJhd0F4aXM9ZnVuY3Rpb24oKXt2YXIgdCxlLGksbyxuLHMscixhLGgsZCxjLGY9dGhpcy5fZ2V0Q29udGV4dCgpO2YuZm9udD0yNC90aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKStcInB4IGFyaWFsXCI7dmFyIG0sdj0uMDI1L3RoaXMuc2NhbGUueCxnPS4wMjUvdGhpcy5zY2FsZS55LHk9NS90aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKSxiPXRoaXMuY2FtZXJhLmdldEFybVJvdGF0aW9uKCkuaG9yaXpvbn
21167RhbCxfPW5ldyB1KE1hdGguY29zKGIpLE1hdGguc2luKGIpKSx3PXRoaXMueFJhbmdlLHg9dGhpcy55UmFuZ2Usaz10aGlzLnpSYW5nZTtmb3IoZi5saW5lV2lkdGg9MSxvPXZvaWQgMD09PXRoaXMuZGVmYXVsdFhTdGVwLGk9bmV3IHAody5taW4sdy5tYXgsdGhpcy54U3RlcCxvKSxpLnN0YXJ0KCEwKTshaS5lbmQoKTspe3ZhciBTPWkuZ2V0Q3VycmVudCgpO2lmKHRoaXMuc2hvd0dyaWQ/KHQ9bmV3IGwoUyx4Lm1pbixrLm1pbiksZT1uZXcgbChTLHgubWF4LGsubWluKSx0aGlzLl9saW5lM2QoZix0LGUsdGhpcy5ncmlkQ29sb3IpKTp0aGlzLnNob3dYQXhpcyYmKHQ9bmV3IGwoUyx4Lm1pbixrLm1pbiksZT1uZXcgbChTLHgubWluK3Ysay5taW4pLHRoaXMuX2xpbmUzZChmLHQsZSx0aGlzLmF4aXNDb2xvciksdD1uZXcgbChTLHgubWF4LGsubWluKSxlPW5ldyBsKFMseC5tYXgtdixrLm1pbiksdGhpcy5fbGluZTNkKGYsdCxlLHRoaXMuYXhpc0NvbG9yKSksdGhpcy5zaG93WEF4aXMpe3I9Xy54PjA/eC5taW46eC5tYXgsbT1uZXcgbChTLHIsay5taW4pO3ZhciBEPVwiICBcIit0aGlzLnhWYWx1ZUxhYmVsKFMpK1wiICBcIjt0aGlzLmRyYXdBeGlzTGFiZWxYKGYsbSxELGIseSl9aS5uZXh0KCl9Zm9yKGYubGluZVdpZHRoPTEsbz12b2lkIDA9PT10aGlzLmRlZmF1bHRZU3RlcCxpPW5ldyBwKHgubWluLHgubWF4LHRoaXMueVN0ZXAsbyksaS5zdGFydCghMCk7IWkuZW5kKCk7KXt2YXIgTT1pLmdldEN1cnJlbnQoKTtpZih0aGlzLnNob3dHcmlkPyh0PW5ldyBsKHcubWluLE0say5taW4pLGU9bmV3IGwody5tYXgsTSxrLm1pbiksdGhpcy5fbGluZTNkKGYsdCxlLHRoaXMuZ3JpZENvbG9yKSk6dGhpcy5zaG93WUF4aXMmJih0PW5ldyBsKHcubWluLE0say5taW4pLGU9bmV3IGwody5taW4rZyxNLGsubWluKSx0aGlzLl9saW5lM2QoZix0LGUsdGhpcy5heGlzQ29sb3IpLHQ9bmV3IGwody5tYXgsTSxrLm1pbiksZT1uZXcgbCh3Lm1heC1nLE0say5taW4pLHRoaXMuX2xpbmUzZChmLHQsZSx0aGlzLmF4aXNDb2xvcikpLHRoaXMuc2hvd1lBeGlzKXtzPV8ueT4wP3cubWluOncubWF4LG09bmV3IGwocyxNLGsubWluKTt2YXIgQz1cIiAgXCIrdGhpcy55VmFsdWVMYWJlbChNKStcIiAgXCI7dGhpcy5kcmF3QXhpc0xhYmVsWShmLG0sQyxiLHkpfWkubmV4dCgpfWlmKHRoaXMuc2hvd1pBeGlzKXtmb3IoZi5saW5lV2lkdGg9MSxvPXZvaWQgMD09PXRoaXMuZGVmYXVsdFpTdGVwLGk9bmV3IHAoay5taW4say5tYXgsdGhpcy56U3RlcCxvKSxpLnN0YXJ0KCEwKSxzPV8ueD4wP3cubWluOncubWF4LHI9Xy55PDA/eC5taW46eC5tYXg7IWkuZW5kKCk7KXt2YXIgTz1pLmdldEN1cnJlbnQoKSxFPW5ldyBsKHMscixPKSxUPXRoaXMuX2NvbnZlcnQzRHRvMkQoRSk7ZT1uZXcgdShULngteSxULnkpLHRoaXMuX2xpbmUoZixULGUsdGhpcy5heGlzQ29sb3IpO3ZhciBQPXRoaXMuelZhbHVlTGFiZWwoTykrXCIgXCI7dGhpcy5kcmF3QXhpc0xhYmVsWihmLEUsUCw1KSxpLm5leHQoKX1mLmxpbmVXaWR0aD0xLHQ9bmV3IGwocyxyLGsubWluKSxlPW5ldyBsKHMscixrLm1heCksdGhpcy5fbGluZTNkKGYsdCxlLHRoaXMuYXhpc0NvbG9yKX1pZih0aGlzLnNob3dYQXhpcyl7dmFyIEksTjtmLmxpbmVXaWR0aD0xLEk9bmV3IGwody5taW4seC5taW4say5taW4pLE49bmV3IGwody5tYXgseC5taW4say5taW4pLHRoaXMuX2xpbmUzZChmLEksTix0aGlzLmF4aXNDb2xvciksST1uZXcgbCh3Lm1pbix4Lm1heCxrLm1pbiksTj1uZXcgbCh3Lm1heCx4Lm1heCxrLm1pbiksdGhpcy5fbGluZTNkKGYsSSxOLHRoaXMuYXhpc0NvbG9yKX10aGlzLnNob3dZQXhpcyYmKGYubGluZVdpZHRoPTEsdD1uZXcgbCh3Lm1pbix4Lm1pbixrLm1pbiksZT1uZXcgbCh3Lm1pbix4Lm1heCxrLm1pbiksdGhpcy5fbGluZTNkKGYsdCxlLHRoaXMuYXhpc0NvbG9yKSx0PW5ldyBsKHcubWF4LHgubWluLGsubWluKSxlPW5ldyBsKHcubWF4LHgubWF4LGsubWluKSx0aGlzLl9saW5lM2QoZix0LGUsdGhpcy5heGlzQ29sb3IpKTt2YXIgUj10aGlzLnhMYWJlbDtSLmxlbmd0aD4wJiZ0aGlzLnNob3dYQXhpcyYmKGM9LjEvdGhpcy5zY2FsZS55LHM9KHcubWF4KzMqdy5taW4pLzQscj1fLng+MD94Lm1pbi1jOngubWF4K2Msbj1uZXcgbChzLHIsay5taW4pLHRoaXMuZHJhd0F4aXNMYWJlbFgoZixuLFIsYikpO3ZhciBBPXRoaXMueUxhYmVsO0EubGVuZ3RoPjAmJnRoaXMuc2hvd1lBeGlzJiYoZD0uMS90aGlzLnNjYWxlLngscz1fLnk+MD93Lm1pbi1kOncubWF4K2Qscj0oeC5tYXgrMyp4Lm1pbikvNCxuPW5ldyBsKHMscixrLm1pbiksdGhpcy5kcmF3QXhpc0xhYmVsWShmLG4sQSxiKSk7dmFyIHo9dGhpcy56TGFiZWw7ei5sZW5ndGg+MCYmdGhpcy5zaG93WkF4aXMmJihoPTMwLHM9Xy54PjA/dy5taW46dy5tYXgscj1fLnk8MD94Lm1pbjp4Lm1heCxhPShrLm1heCszKmsubWluKS80LG49bmV3IGwocyxyLGEpLHRoaXMuZHJhd0F4aXNMYWJlbFooZixuLHosaCkpfSxvLnByb3RvdHlwZS5faHN2MnJnYj1mdW5jdGlvbih0LGUsaSl7dmFyIG8sbixzLHIsYSxoO3N3aXRjaChyPWkqZSxhPU1hdGguZmxvb3IodC82MCksaD1yKigxLU1hdGguYWJzKHQvNjAlMi0xKSksYSl7Y2FzZSAwOm89cixuPWgscz0wO2JyZWFrO2Nhc2UgMTpvPWgsbj1yLHM9MDticmVhaztjYXNlIDI6bz0wLG49cixzPWg7YnJlYWs7Y2FzZSAzOm89MCxuPWgscz1yO2JyZWFrO2Nhc2UgNDpvPWgsbj0wLHM9cjticmVhaztjYXNlIDU6bz1yLG49MCxzPWg7YnJlYWs7ZGVmYXVsdDpvPTAsbj0wLHM9MH1yZXR1cm5cIlJHQihcIitwYXJzZUludCgyNTUqbykrXCIsXCIrcGFyc2VJbnQoMjU1Km4pK1wiLFwiK3BhcnNlSW50KDI1NSpzKStcIilcIn0sby5wcm90b3R5cGUuX2dldFN0cm9rZVdpZHRoPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10P3RoaXMuc2hvd1BlcnNwZWN0aXZlPzEvLXQudHJhbnMueip0aGlzLmRhdGFDb2xvci5zdHJva2VXaWR0aDotdGhpcy5leWUuei90aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKSp0aGlzLmRhdGFDb2xvci5zdHJva2VXaWR0aDp0aGlzLmRhdGFDb2xvci5zdHJva2VXaWR0aH0sby5wcm90b3R5cGUuX3JlZHJhd0Jhcj1mdW5jdGlvbih0LGUsaSxvLG4scyl7dmFyIHIsYT10aGlzLGg9ZS5wb2ludCxkPXRoaXMuelJhbmdlLm1pbix1PVt7cG9pbnQ6bmV3IGwoaC54LWksaC55LW8saC56KX0se3BvaW50Om5ldyBsKGgueCtpLGgueS1vLGgueil9LHtwb2ludDpuZXcgbChoLngraSxoLnkrbyxoLnopfSx7cG9pbnQ6bmV3IGwoaC54LWksaC55K28saC56KX1dLGM9W3twb2ludDpuZXcgbChoLngtaSxoLnktbyxkKX0se3BvaW50Om5ldyBsKGgueCtpLGgueS1vLGQpfSx7cG9pbnQ6bmV3IGwoaC54K2ksaC55K28sZCl9LHtwb2ludDpuZXcgbChoLngtaSxoLnkrbyxkKX1dO3UuZm9yRWFjaChmdW5jdGlvbih0KXt0LnNjcmVlbj1hLl9jb252ZXJ0M0R0bzJEKHQucG9pbnQpfSksYy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Quc2NyZWVuPWEuX2NvbnZlcnQzRHRvMkQodC5wb2ludCl9KTt2YXIgcD1be2Nvcm5lcnM6dSxjZW50ZXI6bC5hdmcoY1swXS5wb2ludCxjWzJdLnBvaW50KX0se2Nvcm5lcnM6W3VbMF0sdVsxXSxjWzFdLGNbMF1dLGNlbnRlcjpsLmF2ZyhjWzFdLnBvaW50LGNbMF0ucG9pbnQpfSx7Y29ybmVyczpbdVsxXSx1WzJdLGNbMl0sY1sxXV0sY2VudGVyOmwuYXZnKGNbMl0ucG9pbnQsY1sxXS5wb2ludCl9LHtjb3JuZXJzOlt1WzJdLHVbM10sY1szXSxjWzJdXSxjZW50ZXI6bC5hdmcoY1szXS5wb2ludCxjWzJdLnBvaW50KX0se2Nvcm5lcnM6W3VbM10sdVswXSxjWzBdLGNbM11dLGNlbnRlcjpsLmF2ZyhjWzBdLnBvaW50LGNbM10ucG9pbnQpfV07ZS5zdXJmYWNlcz1wO2Zvcih2YXIgZj0wO2Y8cC5sZW5ndGg7ZisrKXtyPXBbZl07dmFyIG09dGhpcy5fY29udmVydFBvaW50VG9UcmFuc2xhdGlvbihyLmNlbnRlcik7ci5kaXN0PXRoaXMuc2hvd1BlcnNwZWN0aXZlP20ubGVuZ3RoKCk6LW0uen1wLnNvcnQoZnVuY3Rpb24odCxlKXt2YXIgaT1lLmRpc3QtdC5kaXN0O3JldHVybiBpfHwodC5jb3JuZXJzPT
2116709dT8xOmUuY29ybmVycz09PXU/LTE6MCl9KSx0LmxpbmVXaWR0aD10aGlzLl9nZXRTdHJva2VXaWR0aChlKSx0LnN0cm9rZVN0eWxlPXMsdC5maWxsU3R5bGU9bjtmb3IodmFyIHY9Mjt2PHAubGVuZ3RoO3YrKylyPXBbdl0sdGhpcy5fcG9seWdvbih0LHIuY29ybmVycyl9LG8ucHJvdG90eXBlLl9wb2x5Z29uPWZ1bmN0aW9uKHQsZSxpLG8pe2lmKCEoZS5sZW5ndGg8Mikpe3ZvaWQgMCE9PWkmJih0LmZpbGxTdHlsZT1pKSx2b2lkIDAhPT1vJiYodC5zdHJva2VTdHlsZT1vKSx0LmJlZ2luUGF0aCgpLHQubW92ZVRvKGVbMF0uc2NyZWVuLngsZVswXS5zY3JlZW4ueSk7Zm9yKHZhciBuPTE7bjxlLmxlbmd0aDsrK24pe3ZhciBzPWVbbl07dC5saW5lVG8ocy5zY3JlZW4ueCxzLnNjcmVlbi55KX10LmNsb3NlUGF0aCgpLHQuZmlsbCgpLHQuc3Ryb2tlKCl9fSxvLnByb3RvdHlwZS5fZHJhd0NpcmNsZT1mdW5jdGlvbih0LGUsaSxvLG4pe3ZhciBzPXRoaXMuX2NhbGNSYWRpdXMoZSxuKTt0LmxpbmVXaWR0aD10aGlzLl9nZXRTdHJva2VXaWR0aChlKSx0LnN0cm9rZVN0eWxlPW8sdC5maWxsU3R5bGU9aSx0LmJlZ2luUGF0aCgpLHQuYXJjKGUuc2NyZWVuLngsZS5zY3JlZW4ueSxzLDAsMipNYXRoLlBJLCEwKSx0LmZpbGwoKSx0LnN0cm9rZSgpfSxvLnByb3RvdHlwZS5fZ2V0Q29sb3JzUmVndWxhcj1mdW5jdGlvbih0KXt2YXIgZT0yNDAqKDEtKHQucG9pbnQuei10aGlzLnpSYW5nZS5taW4pKnRoaXMuc2NhbGUuei90aGlzLnZlcnRpY2FsUmF0aW8pO3JldHVybntmaWxsOnRoaXMuX2hzdjJyZ2IoZSwxLDEpLGJvcmRlcjp0aGlzLl9oc3YycmdiKGUsMSwuOCl9fSxvLnByb3RvdHlwZS5fZ2V0Q29sb3JzQ29sb3I9ZnVuY3Rpb24odCl7dmFyIGUsaTtpZihcInN0cmluZ1wiPT10eXBlb2YgdC5wb2ludC52YWx1ZSllPXQucG9pbnQudmFsdWUsaT10LnBvaW50LnZhbHVlO2Vsc2V7dmFyIG89MjQwKigxLSh0LnBvaW50LnZhbHVlLXRoaXMudmFsdWVSYW5nZS5taW4pKnRoaXMuc2NhbGUudmFsdWUpO2U9dGhpcy5faHN2MnJnYihvLDEsMSksaT10aGlzLl9oc3YycmdiKG8sMSwuOCl9cmV0dXJue2ZpbGw6ZSxib3JkZXI6aX19LG8ucHJvdG90eXBlLl9nZXRDb2xvcnNTaXplPWZ1bmN0aW9uKCl7cmV0dXJue2ZpbGw6dGhpcy5kYXRhQ29sb3IuZmlsbCxib3JkZXI6dGhpcy5kYXRhQ29sb3Iuc3Ryb2tlfX0sby5wcm90b3R5cGUuX2NhbGNSYWRpdXM9ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT10aGlzLl9kb3RTaXplKCkpO3ZhciBpO3JldHVybiBpPXRoaXMuc2hvd1BlcnNwZWN0aXZlP2UvLXQudHJhbnMuejplKigtdGhpcy5leWUuei90aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKSksaTwwJiYoaT0wKSxpfSxvLnByb3RvdHlwZS5fcmVkcmF3QmFyR3JhcGhQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMueEJhcldpZHRoLzIsbz10aGlzLnlCYXJXaWR0aC8yLG49dGhpcy5fZ2V0Q29sb3JzUmVndWxhcihlKTt0aGlzLl9yZWRyYXdCYXIodCxlLGksbyxuLmZpbGwsbi5ib3JkZXIpfSxvLnByb3RvdHlwZS5fcmVkcmF3QmFyQ29sb3JHcmFwaFBvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy54QmFyV2lkdGgvMixvPXRoaXMueUJhcldpZHRoLzIsbj10aGlzLl9nZXRDb2xvcnNDb2xvcihlKTt0aGlzLl9yZWRyYXdCYXIodCxlLGksbyxuLmZpbGwsbi5ib3JkZXIpfSxvLnByb3RvdHlwZS5fcmVkcmF3QmFyU2l6ZUdyYXBoUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT0oZS5wb2ludC52YWx1ZS10aGlzLnZhbHVlUmFuZ2UubWluKS90aGlzLnZhbHVlUmFuZ2UucmFuZ2UoKSxvPXRoaXMueEJhcldpZHRoLzIqKC44KmkrLjIpLG49dGhpcy55QmFyV2lkdGgvMiooLjgqaSsuMikscz10aGlzLl9nZXRDb2xvcnNTaXplKCk7dGhpcy5fcmVkcmF3QmFyKHQsZSxvLG4scy5maWxsLHMuYm9yZGVyKX0sby5wcm90b3R5cGUuX3JlZHJhd0RvdEdyYXBoUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9nZXRDb2xvcnNSZWd1bGFyKGUpO3RoaXMuX2RyYXdDaXJjbGUodCxlLGkuZmlsbCxpLmJvcmRlcil9LG8ucHJvdG90eXBlLl9yZWRyYXdEb3RMaW5lR3JhcGhQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2NvbnZlcnQzRHRvMkQoZS5ib3R0b20pO3QubGluZVdpZHRoPTEsdGhpcy5fbGluZSh0LGksZS5zY3JlZW4sdGhpcy5ncmlkQ29sb3IpLHRoaXMuX3JlZHJhd0RvdEdyYXBoUG9pbnQodCxlKX0sby5wcm90b3R5cGUuX3JlZHJhd0RvdENvbG9yR3JhcGhQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2dldENvbG9yc0NvbG9yKGUpO3RoaXMuX2RyYXdDaXJjbGUodCxlLGkuZmlsbCxpLmJvcmRlcil9LG8ucHJvdG90eXBlLl9yZWRyYXdEb3RTaXplR3JhcGhQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2RvdFNpemUoKSxvPShlLnBvaW50LnZhbHVlLXRoaXMudmFsdWVSYW5nZS5taW4pL3RoaXMudmFsdWVSYW5nZS5yYW5nZSgpLG49aSp0aGlzLmRvdFNpemVNaW5GcmFjdGlvbixzPWkqdGhpcy5kb3RTaXplTWF4RnJhY3Rpb24tbixyPW4rcypvLGE9dGhpcy5fZ2V0Q29sb3JzU2l6ZSgpO3RoaXMuX2RyYXdDaXJjbGUodCxlLGEuZmlsbCxhLmJvcmRlcixyKX0sby5wcm90b3R5cGUuX3JlZHJhd1N1cmZhY2VHcmFwaFBvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5wb2ludFJpZ2h0LG89ZS5wb2ludFRvcCxuPWUucG9pbnRDcm9zcztpZih2b2lkIDAhPT1lJiZ2b2lkIDAhPT1pJiZ2b2lkIDAhPT1vJiZ2b2lkIDAhPT1uKXt2YXIgcyxyLGE9ITA7aWYodGhpcy5zaG93R3JheUJvdHRvbXx8dGhpcy5zaG93U2hhZG93KXt2YXIgaD1sLnN1YnRyYWN0KG4udHJhbnMsZS50cmFucyksZD1sLnN1YnRyYWN0KG8udHJhbnMsaS50cmFucyksdT1sLmNyb3NzUHJvZHVjdChoLGQpLGM9dS5sZW5ndGgoKTthPXUuej4wfWlmKGEpe3ZhciBwLGY9KGUucG9pbnQueitpLnBvaW50Lnorby5wb2ludC56K24ucG9pbnQueikvNCxtPTI0MCooMS0oZi10aGlzLnpSYW5nZS5taW4pKnRoaXMuc2NhbGUuei90aGlzLnZlcnRpY2FsUmF0aW8pO3RoaXMuc2hvd1NoYWRvdz8ocD1NYXRoLm1pbigxK3UueC9jLzIsMSkscz10aGlzLl9oc3YycmdiKG0sMSxwKSxyPXMpOihwPTEscz10aGlzLl9oc3YycmdiKG0sMSxwKSxyPXRoaXMuYXhpc0NvbG9yKX1lbHNlIHM9XCJncmF5XCIscj10aGlzLmF4aXNDb2xvcjt0LmxpbmVXaWR0aD10aGlzLl9nZXRTd
21167HJva2VXaWR0aChlKTt2YXIgdj1bZSxpLG4sb107dGhpcy5fcG9seWdvbih0LHYscyxyKX19LG8ucHJvdG90eXBlLl9kcmF3R3JpZExpbmU9ZnVuY3Rpb24odCxlLGkpe2lmKHZvaWQgMCE9PWUmJnZvaWQgMCE9PWkpe3ZhciBvPShlLnBvaW50LnoraS5wb2ludC56KS8yLG49MjQwKigxLShvLXRoaXMuelJhbmdlLm1pbikqdGhpcy5zY2FsZS56L3RoaXMudmVydGljYWxSYXRpbyk7dC5saW5lV2lkdGg9Mip0aGlzLl9nZXRTdHJva2VXaWR0aChlKSx0LnN0cm9rZVN0eWxlPXRoaXMuX2hzdjJyZ2IobiwxLDEpLHRoaXMuX2xpbmUodCxlLnNjcmVlbixpLnNjcmVlbil9fSxvLnByb3RvdHlwZS5fcmVkcmF3R3JpZEdyYXBoUG9pbnQ9ZnVuY3Rpb24odCxlKXt0aGlzLl9kcmF3R3JpZExpbmUodCxlLGUucG9pbnRSaWdodCksdGhpcy5fZHJhd0dyaWRMaW5lKHQsZSxlLnBvaW50VG9wKX0sby5wcm90b3R5cGUuX3JlZHJhd0xpbmVHcmFwaFBvaW50PWZ1bmN0aW9uKHQsZSl7dm9pZCAwIT09ZS5wb2ludE5leHQmJih0LmxpbmVXaWR0aD10aGlzLl9nZXRTdHJva2VXaWR0aChlKSx0LnN0cm9rZVN0eWxlPXRoaXMuZGF0YUNvbG9yLnN0cm9rZSx0aGlzLl9saW5lKHQsZS5zY3JlZW4sZS5wb2ludE5leHQuc2NyZWVuKSl9LG8ucHJvdG90eXBlLl9yZWRyYXdEYXRhR3JhcGg9ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuX2dldENvbnRleHQoKTtpZighKHZvaWQgMD09PXRoaXMuZGF0YVBvaW50c3x8dGhpcy5kYXRhUG9pbnRzLmxlbmd0aDw9MCkpZm9yKHRoaXMuX2NhbGNUcmFuc2xhdGlvbnModGhpcy5kYXRhUG9pbnRzKSx0PTA7dDx0aGlzLmRhdGFQb2ludHMubGVuZ3RoO3QrKyl7dmFyIGk9dGhpcy5kYXRhUG9pbnRzW3RdO3RoaXMuX3BvaW50RHJhd2luZ01ldGhvZC5jYWxsKHRoaXMsZSxpKX19LG8ucHJvdG90eXBlLl9zdG9yZU1vdXNlUG9zaXRpb249ZnVuY3Rpb24odCl7dGhpcy5zdGFydE1vdXNlWD1uKHQpLHRoaXMuc3RhcnRNb3VzZVk9cyh0KSx0aGlzLl9zdGFydENhbWVyYU9mZnNldD10aGlzLmNhbWVyYS5nZXRPZmZzZXQoKX0sby5wcm90b3R5cGUuX29uTW91c2VEb3duPWZ1bmN0aW9uKHQpe2lmKHQ9dHx8d2luZG93LmV2ZW50LHRoaXMubGVmdEJ1dHRvbkRvd24mJnRoaXMuX29uTW91c2VVcCh0KSx0aGlzLmxlZnRCdXR0b25Eb3duPXQud2hpY2g/MT09PXQud2hpY2g6MT09PXQuYnV0dG9uLHRoaXMubGVmdEJ1dHRvbkRvd258fHRoaXMudG91Y2hEb3duKXt0aGlzLl9zdG9yZU1vdXNlUG9zaXRpb24odCksdGhpcy5zdGFydFN0YXJ0PW5ldyBEYXRlKHRoaXMuc3RhcnQpLHRoaXMuc3RhcnRFbmQ9bmV3IERhdGUodGhpcy5lbmQpLHRoaXMuc3RhcnRBcm1Sb3RhdGlvbj10aGlzLmNhbWVyYS5nZXRBcm1Sb3RhdGlvbigpLHRoaXMuZnJhbWUuc3R5bGUuY3Vyc29yPVwibW92ZVwiO3ZhciBlPXRoaXM7dGhpcy5vbm1vdXNlbW92ZT1mdW5jdGlvbih0KXtlLl9vbk1vdXNlTW92ZSh0KX0sdGhpcy5vbm1vdXNldXA9ZnVuY3Rpb24odCl7ZS5fb25Nb3VzZVVwKHQpfSxkLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsXCJtb3VzZW1vdmVcIixlLm9ubW91c2Vtb3ZlKSxkLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsXCJtb3VzZXVwXCIsZS5vbm1vdXNldXApLGQucHJldmVudERlZmF1bHQodCl9fSxvLnByb3RvdHlwZS5fb25Nb3VzZU1vdmU9ZnVuY3Rpb24odCl7dGhpcy5tb3Zpbmc9ITAsdD10fHx3aW5kb3cuZXZlbnQ7dmFyIGU9cGFyc2VGbG9hdChuKHQpKS10aGlzLnN0YXJ0TW91c2VYLGk9cGFyc2VGbG9hdChzKHQpKS10aGlzLnN0YXJ0TW91c2VZO2lmKHQmJiEwPT09dC5jdHJsS2V5KXt2YXIgbz0uNSp0aGlzLmZyYW1lLmNsaWVudFdpZHRoLHI9LjUqdGhpcy5mcmFtZS5jbGllbnRIZWlnaHQsYT0odGhpcy5fc3RhcnRDYW1lcmFPZmZzZXQueHx8MCktZS9vKnRoaXMuY2FtZXJhLmFybUxlbmd0aCouOCxoPSh0aGlzLl9zdGFydENhbWVyYU9mZnNldC55fHwwKStpL3IqdGhpcy5jYW1lcmEuYXJtTGVuZ3RoKi44O3RoaXMuY2FtZXJhLnNldE9mZnNldChhLGgpLHRoaXMuX3N0b3JlTW91c2VQb3NpdGlvbih0KX1lbHNle3ZhciBsPXRoaXMuc3RhcnRBcm1Sb3RhdGlvbi5ob3Jpem9udGFsK2UvMjAwLHU9dGhpcy5zdGFydEFybVJvdGF0aW9uLnZlcnRpY2FsK2kvMjAwLGM9TWF0aC5zaW4oNC8zNjAqMipNYXRoLlBJKTtNYXRoLmFicyhNYXRoLnNpbihsKSk8YyYmKGw9TWF0aC5yb3VuZChsL01hdGguUEkpKk1hdGguUEktLjAwMSksTWF0aC5hYnMoTWF0aC5jb3MobCkpPGMmJihsPShNYXRoLnJvdW5kKGwvTWF0aC5QSS0uNSkrLjUpKk1hdGguUEktLjAwMSksTWF0aC5hYnMoTWF0aC5zaW4odSkpPGMmJih1PU1hdGgucm91bmQodS9NYXRoLlBJKSpNYXRoLlBJKSxNYXRoLmFicyhNYXRoLmNvcyh1KSk8YyYmKHU9KE1hdGgucm91bmQodS9NYXRoLlBJLS41KSsuNSkqTWF0aC5QSSksdGhpcy5jYW1lcmEuc2V0QXJtUm90YXRpb24obCx1KX10aGlzLnJlZHJhdygpO3ZhciBwPXRoaXMuZ2V0Q2FtZXJhUG9zaXRpb24oKTt0aGlzLmVtaXQoXCJjYW1lcmFQb3NpdGlvbkNoYW5nZVwiLHApLGQucHJldmVudERlZmF1bHQodCl9LG8ucHJvdG90eXBlLl9vbk1vdXNlVXA9ZnVuY3Rpb24odCl7dGhpcy5mcmFtZS5zdHlsZS5jdXJzb3I9XCJhdXRvXCIsdGhpcy5sZWZ0QnV0dG9uRG93bj0hMSxkLnJlbW92ZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsXCJtb3VzZW1vdmVcIix0aGlzLm9ubW91c2Vtb3ZlKSxkLnJlbW92ZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsXCJtb3VzZXVwXCIsdGhpcy5vbm1vdXNldXApLGQucHJldmVudERlZmF1bHQodCl9LG8ucHJvdG90eXBlLl9vbkNsaWNrPWZ1bmN0aW9uKHQpe2lmKHRoaXMub25jbGlja19jYWxsYmFjayl7aWYodGhpcy5tb3ZpbmcpdGhpcy5tb3Zpbmc9ITE7ZWxzZXt2YXIgZT10aGlzLmZyYW1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGk9bih0KS1lLmxlZnQsbz1zKHQpLWUudG9wLHI9dGhpcy5fZGF0YVBvaW50RnJvbVhZKGksbyk7ciYmdGhpcy5vbmNsaWNrX2NhbGxiYWNrKHIucG9pbnQuZGF0YSl9ZC5wcmV2ZW50RGVmYXVsdCh0KX19LG8ucHJvdG90eXBlLl9vblRvb2x0aXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPW4odCktZS5sZWZ0LG89cyh0KS1lLnRvcDtpZih0aGlzLnNob3dUb29sdGlwKXtp
21167Zih0aGlzLnRvb2x0aXBUaW1lb3V0JiZjbGVhclRpbWVvdXQodGhpcy50b29sdGlwVGltZW91dCksdGhpcy5sZWZ0QnV0dG9uRG93bilyZXR1cm4gdm9pZCB0aGlzLl9oaWRlVG9vbHRpcCgpO2lmKHRoaXMudG9vbHRpcCYmdGhpcy50b29sdGlwLmRhdGFQb2ludCl7dmFyIHI9dGhpcy5fZGF0YVBvaW50RnJvbVhZKGksbyk7ciE9PXRoaXMudG9vbHRpcC5kYXRhUG9pbnQmJihyP3RoaXMuX3Nob3dUb29sdGlwKHIpOnRoaXMuX2hpZGVUb29sdGlwKCkpfWVsc2V7dmFyIGE9dGhpczt0aGlzLnRvb2x0aXBUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXthLnRvb2x0aXBUaW1lb3V0PW51bGw7dmFyIHQ9YS5fZGF0YVBvaW50RnJvbVhZKGksbyk7dCYmYS5fc2hvd1Rvb2x0aXAodCl9LDMwMCl9fX0sby5wcm90b3R5cGUuX29uVG91Y2hTdGFydD1mdW5jdGlvbih0KXt0aGlzLnRvdWNoRG93bj0hMDt2YXIgZT10aGlzO3RoaXMub250b3VjaG1vdmU9ZnVuY3Rpb24odCl7ZS5fb25Ub3VjaE1vdmUodCl9LHRoaXMub250b3VjaGVuZD1mdW5jdGlvbih0KXtlLl9vblRvdWNoRW5kKHQpfSxkLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsXCJ0b3VjaG1vdmVcIixlLm9udG91Y2htb3ZlKSxkLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsXCJ0b3VjaGVuZFwiLGUub250b3VjaGVuZCksdGhpcy5fb25Nb3VzZURvd24odCl9LG8ucHJvdG90eXBlLl9vblRvdWNoTW92ZT1mdW5jdGlvbih0KXt0aGlzLl9vbk1vdXNlTW92ZSh0KX0sby5wcm90b3R5cGUuX29uVG91Y2hFbmQ9ZnVuY3Rpb24odCl7dGhpcy50b3VjaERvd249ITEsZC5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LFwidG91Y2htb3ZlXCIsdGhpcy5vbnRvdWNobW92ZSksZC5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LFwidG91Y2hlbmRcIix0aGlzLm9udG91Y2hlbmQpLHRoaXMuX29uTW91c2VVcCh0KX0sby5wcm90b3R5cGUuX29uV2hlZWw9ZnVuY3Rpb24odCl7dHx8KHQ9d2luZG93LmV2ZW50KTt2YXIgZT0wO2lmKHQud2hlZWxEZWx0YT9lPXQud2hlZWxEZWx0YS8xMjA6dC5kZXRhaWwmJihlPS10LmRldGFpbC8zKSxlKXt2YXIgaT10aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKSxvPWkqKDEtZS8xMCk7dGhpcy5jYW1lcmEuc2V0QXJtTGVuZ3RoKG8pLHRoaXMucmVkcmF3KCksdGhpcy5faGlkZVRvb2x0aXAoKX12YXIgbj10aGlzLmdldENhbWVyYVBvc2l0aW9uKCk7dGhpcy5lbWl0KFwiY2FtZXJhUG9zaXRpb25DaGFuZ2VcIixuKSxkLnByZXZlbn
21167REZWZhdWx0KHQpfSxvLnByb3RvdHlwZS5faW5zaWRlVHJpYW5nbGU9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH12YXIgbz1lWzBdLG49ZVsxXSxzPWVbMl0scj1pKChuLngtby54KSoodC55LW8ueSktKG4ueS1vLnkpKih0Lngtby54KSksYT1pKChzLngtbi54KSoodC55LW4ueSktKHMueS1uLnkpKih0Lngtbi54KSksaD1pKChvLngtcy54KSoodC55LXMueSktKG8ueS1zLnkpKih0Lngtcy54KSk7cmV0dXJuISgwIT1yJiYwIT1hJiZyIT1hfHwwIT1hJiYwIT1oJiZhIT1ofHwwIT1yJiYwIT1oJiZyIT1oKX0sby5wcm90b3R5cGUuX2RhdGFQb2ludEZyb21YWT1mdW5jdGlvbih0LGUpe3ZhciBpLG49bnVsbCxzPW51bGwscj1udWxsLGE9bmV3IHUodCxlKTtpZih0aGlzLnN0eWxlPT09by5TVFlMRS5CQVJ8fHRoaXMuc3R5bGU9PT1vLlNUWUxFLkJBUkNPTE9SfHx0aGlzLnN0eWxlPT09by5TVFlMRS5CQVJTSVpFKWZvcihpPXRoaXMuZGF0YVBvaW50cy5sZW5ndGgtMTtpPj0wO2ktLSl7bj10aGlzLmRhdGFQb2ludHNbaV07dmFyIGg9bi5zdXJmYWNlcztpZihoKWZvcih2YXIgZD1oLmxlbmd0aC0xO2Q+PTA7ZC0tKXt2YXIgbD1oW2RdLGM9bC5jb3JuZXJzLHA9W2NbMF0uc2NyZWVuLGNbMV0uc2NyZWVuLGNbMl0uc2NyZWVuXSxmPVtjWzJdLnNjcmVlbixjWzNdLnNjcmVlbixjWzBdLnNjcmVlbl07aWYodGhpcy5faW5zaWRlVHJpYW5nbGUoYSxwKXx8dGhpcy5faW5zaWRlVHJpYW5nbGUoYSxmKSlyZXR1cm4gbn19ZWxzZSBmb3IoaT0wO2k8dGhpcy5kYXRhUG9pbnRzLmxlbmd0aDtpKyspe249dGhpcy5kYXRhUG9pbnRzW2ldO3ZhciBtPW4uc2NyZWVuO2lmKG0pe3ZhciB2PU1hdGguYWJzKHQtbS54KSxnPU1hdGguYWJzKGUtbS55KSx5PU1hdGguc3FydCh2KnYrZypnKTsobnVsbD09PXJ8fHk8cikmJnk8MTAwJiYocj15LHM9bil9fXJldHVybiBzfSxvLnByb3RvdHlwZS5oYXNCYXJzPWZ1bmN0aW9uKHQpe3JldHVybiB0PT1vLlNUWUxFLkJBUnx8dD09by5TVFlMRS5CQVJDT0xPUnx8dD09by5TVFlMRS5CQVJTSVpFfSxvLnByb3RvdHlwZS5fc2hvd1Rvb2x0aXA9ZnVuY3Rpb24odCl7dmFyIGUsaSxvO3RoaXMudG9vbHRpcD8oZT10aGlzLnRvb2x0aXAuZG9tLmNvbnRlbnQsaT10aGlzLnRvb2x0aXAuZG9tLmxpbmUsbz10aGlzLnRvb2x0aXAuZG9tLmRvdCk6KGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSwoMCxhLmRlZmF1bHQpKGUuc3R5bGUse30sdGhpcy50b29sdGlwU3R5bGUuY29udGVudCksZS5zdHlsZS5wb3NpdGlvbj1cImFic29sdXRlXCIsaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLCgwLGEuZGVmYXVsdCkoaS5zdHlsZSx7fSx0aGlzLnRvb2x0aXBTdHlsZS5saW5lKSxpLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIixvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksKDAsYS5kZWZhdWx0KShvLnN0eWxlLHt9LHRoaXMudG9vbHRpcFN0eWxlLmRvdCksby5zdHlsZS5wb3NpdGlvbj1cImFic29sdXRlXCIsdGhpcy50b29sdGlwPXtkYXRhUG9pbnQ6bnVsbCxkb206e2NvbnRlbnQ6ZSxsaW5lOmksZG90Om99fSksdGhpcy5faGlkZVRvb2x0aXAoKSx0aGlzLnRvb2x0aXAuZGF0YVBvaW50PXQsXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5zaG93VG9vbHRpcD9lLmlubmVySFRNTD10aGlzLnNob3dUb29sdGlwKHQucG9pbnQpOmUuaW5uZXJIVE1MPVwiPHRhYmxlPjx0cj48dGQ+XCIrdGhpcy54TGFiZWwrXCI6PC90ZD48dGQ+XCIrdC5wb2ludC54K1wiPC90ZD48L3RyPjx0cj48dGQ+XCIrdGhpcy55TGFiZWwrXCI6PC90ZD48dGQ+XCIrdC5wb2ludC55K1wiPC90ZD48L3RyPjx0cj48dGQ+XCIrdGhpcy56TGFiZWwrXCI6PC90ZD48dGQ+XCIrdC5wb2ludC56K1wiPC90ZD48L3RyPjwvdGFibGU+XCIsZS5zdHlsZS5sZWZ0PVwiMFwiLGUuc3R5bGUudG9wPVwiMFwiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQoZSksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZChpKSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKG8pO3ZhciBuPWUub2Zmc2V0V2lkdGgscz1lLm9mZnNldEhlaWdodCxyPWkub2Zmc2V0SGVpZ2h0LGg9by5vZmZzZXRXaWR0aCxkPW8ub2Zmc2V0SGVpZ2h0LGw9dC5zY3JlZW4ueC1uLzI7bD1NYXRoLm1pbihNYXRoLm1heChsLDEwKSx0aGlzLmZyYW1lLmNsaWVudFdpZHRoLTEwLW4pLGkuc3R5bGUubGVmdD10LnNjcmVlbi54K1wicHhcIixpLnN0eWxlLnRvcD10LnNjcmVlbi55LXIrXCJweFwiLGUuc3R5bGUubGVmdD1sK1wicHhcIixlLnN0eWxlLnRvcD10LnNjcmVlbi55LXItcytcInB4XCIsby5zdHlsZS5sZWZ0PXQuc2NyZWVuLngtaC8yK1wicHhcIixvLnN0eWxlLnRvcD10LnNjcmVlbi55LWQvMitcInB4XCJ9LG8ucHJvdG90eXBlLl9oaWRlVG9vbHRpcD1mdW5jdGlvbigpe2lmKHRoaXMudG9vbHRpcCl7dGhpcy50b29sdGlwLmRhdGFQb2ludD1udWxsO2Zvcih2YXIgdCBpbiB0aGlzLnRvb2x0aXAuZG9tKWlmKHRoaXMudG9vbHRpcC5kb20uaGFzT3duUHJvcGVydHkodCkpe3ZhciBlPXRoaXMudG9vbHRpcC5kb21bdF07ZSYmZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSl9fX0sby5wcm90b3R5cGUuc2V0Q2FtZXJhUG9zaXRpb249ZnVuY3Rpb24odCl7Zi5zZXRDYW1lcmFQb3NpdGlvbih0LHRoaXMpLHRoaXMucmVkcmF3KCl9LG8ucHJvdG90eXBlLnNldFNpemU9ZnVuY3Rpb24odCxlKXt0aGlzLl9zZXRTaXplKHQsZSksdGhpcy5yZWRyYXcoKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtpKDE2MyksdC5leHBvcnRzPWkoNykuT2JqZWN0LmFzc2lnbn0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTcpO28oby5TK28uRixcIk9iamVjdFwiLHthc3NpZ246aSgxNjQpfSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDMzKSxuPWkoNjMpLHM9aSg0Mikscj1pKDQxKSxhPWkoNzgpLGg9T2JqZWN0LmFzc2lnbjt0LmV4cG9ydHM9IWh8fGkoMjgpKGZ1bmN0aW9uKCl7dmFyIHQ9e30sZT17fSxpPVN5bWJvbCgpLG89XCJhYmNkZWZnaGlqa2xtbm9wcXJzdFwiO3JldHVybiB0W2ldPTcsby5zcGxpdChcIlwiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09dH0pLDchPWgoe30sdClbaV18fE9iamVjdC5rZXlzKGgoe30sZSkpLmpvaW4oXCJcIikhPW99KT9mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1yKHQpLGg9YXJndW1lbnRzLmxlbmd0aCxkPTEsbD1uLmYsdT1zLmY7aD5kOylmb3IodmFyIGMscD1hKGFyZ3VtZW50c1tkKytdKSxmPWw/byhwKS5jb25jYXQobChwKSk6byhwKSxtPWYubGVuZ3RoLHY9MDttPnY7KXUuY2FsbChwLGM9Zlt2KytdKSYmKGlbY109cFtjXSk7cmV0dXJuIGl9Omh9LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9e2RlZmF1bHQ6aSgxNjYpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbih0LGUsaSl7aSgxNjcpLHQuZXhwb3J0cz1pKDcpLk1hdGguc2lnbn0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTcpO28oby5TLFwiTWF0aFwiLHtzaWduOmkoMTY4KX0pfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1NYXRoLnNpZ258fGZ1bmN0aW9uKHQpe3JldHVybiAwPT0odD0rdCl8fHQhPXQ/dDp0PDA/LTE6MX19LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9e2RlZmF1bHQ6aSgxNzApLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbih0LGUsaSl7aSgxNzEpO3ZhciBvPWkoNykuT2JqZWN0O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIG8uZGVmaW5lUHJvcGVydHkodCxlLGkpfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTcpO28oby5TK28uRiohaSgyMSksXCJPYmplY3RcIix7ZGVmaW5lUHJvcGVydHk6aSgyMCkuZn0pfSxmdW5jdGlvbih0LGUsaSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG89XCJzdHJpbmdcIixuPVwiYm9vbGVhblwiLHM9XCJudW1iZXJcIixyPXtmaWxsOntzd
21167HJpbmc6b30sc3Ryb2tlOntzdHJpbmc6b30sc3Ryb2tlV2lkdGg6e251bWJlcjpzfSxfX3R5cGVfXzp7c3RyaW5nOm8sb2JqZWN0Olwib2JqZWN0XCIsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9fSxhPXthbmltYXRpb25BdXRvU3RhcnQ6e2Jvb2xlYW46bix1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sYW5pbWF0aW9uSW50ZXJ2YWw6e251bWJlcjpzfSxhbmltYXRpb25QcmVsb2FkOntib29sZWFuOm59LGF4aXNDb2xvcjp7c3RyaW5nOm99LGJhY2tncm91bmRDb2xvcjpyLHhCYXJXaWR0aDp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHlCYXJXaWR0aDp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LGNhbWVyYVBvc2l0aW9uOntkaXN0YW5jZTp7bnVtYmVyOnN9LGhvcml6b250YWw6e251bWJlcjpzfSx2ZXJ0aWNhbDp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6XCJvYmplY3RcIn19LHhDZW50ZXI6e3N0cmluZzpvfSx5Q2VudGVyOntzdHJpbmc6b30sZGF0YUNvbG9yOnIsZG90U2l6ZU1pbkZyYWN0aW9uOntudW1iZXI6c30sZG90U2l6ZU1heEZyYWN0aW9uOntudW1iZXI6c30sZG90U2l6ZVJhdGlvOntudW1iZXI6c30sZmlsdGVyTGFiZWw6e3N0cmluZzpvfSxncmlkQ29sb3I6e3N0cmluZzpvfSxvbmNsaWNrOntmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LGtlZXBBc3BlY3RSYXRpbzp7Ym9vbGVhbjpufSx4TGFiZWw6e3N0cmluZzpvfSx5TGFiZWw6e3N0cmluZzpvfSx6TGFiZWw6e3N0cmluZzpvfSxsZWdlbmRMYWJlbDp7c3RyaW5nOm99LHhNaW46e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx5TWluOntudW1iZXI6cyx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sek1pbjp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHhNYXg6e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx5TWF4OntudW1iZXI6cyx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sek1heDp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHNob3dBbmltYXRpb25Db250cm9sczp7Ym9vbGVhbjpuLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxzaG93R3JpZDp7Ym9vbGVhbjpufSxzaG93TGVnZW5kOntib29sZWFuOm4sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHNob3dQZXJzcGVjdGl2ZTp7Ym9vbGVhbjpufSxzaG93U2hhZG93Ontib29sZWFuOm59LHNob3dYQXhpczp7Ym9vbGVhbjpufSxzaG93WUF4aXM6e2Jvb2xlYW46bn0sc2hvd1pBeGlzOntib29sZWFuOm59LHhTdGVwOntudW1iZXI6cyx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0seVN0ZXA6e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx6U3RlcDp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHN0eWxlOntudW1iZXI6cyxzdHJpbmc6W1wiYmFyXCIsXCJiYXItY29sb3JcIixcImJhci1zaXplXCIsXCJkb3RcIixcImRvdC1saW5lXCIsXCJkb3QtY29sb3JcIixcImRvdC1zaXplXCIsXCJsaW5lXCIsXCJncmlkXCIsXCJzdXJmYWNlXCJdfSx0b29sdGlwOntib29sZWFuOm4sZnVuY3Rpb246XCJmdW5jdGlvblwifSx0b29sdGlwU3R5bGU6e2NvbnRlbnQ6e2NvbG9yOntzdHJpbmc6b30sYmFja2dyb3VuZDp7c3RyaW5nOm99LGJvcmRlcjp7c3RyaW5nOm99LGJvcmRlclJhZGl1czp7c3RyaW5nOm99LGJveFNoYWRvdzp7c3RyaW5nOm99LHBhZGRpbmc6e3N0cmluZzpvfSxfX3R5cGVfXzp7b2JqZWN0Olwib2JqZWN0XCJ9fSxsaW5lOntib3JkZXJMZWZ0OntzdHJpbmc6b30saGVpZ2h0OntzdHJpbmc6b30sd2lkdGg6e3N0cmluZzpvfSxfX3R5cGVfXzp7b2JqZWN0Olwib2JqZWN0XCJ9fSxkb3Q6e2JvcmRlcjp7c3RyaW5nOm99LGJvcmRlclJhZGl1czp7c3RyaW5nOm99LGhlaWdodDp7c3RyaW5nOm99LHdpZHRoOntzdHJpbmc6b30sX190eXBlX186e29iamVjdDpcIm9iamVjdFwifX0sX190eXBlX186e29iamVjdDpcIm9iamVjdFwifX0seFZhbHVlTGFiZWw6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0seVZhbHVlTGFiZWw6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0selZhbHVlTGFiZWw6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sdmFsdWVNYXg6e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx2YWx1ZU1pbjp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHZlcnRpY2FsUmF0aW86e251bWJlcjpzfSxoZWlnaHQ6e3N0cmluZzpvfSx3aWR0aDp7c3RyaW5nOm99LF9fdHlwZV9fOntvYmplY3Q6XCJvYmplY3RcIn19O2UuYWxsT3B0aW9ucz1hfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbygpe3RoaXMuZGF0YVRhYmxlPW51bGx9dmFyIG49aSgxMSkscz1pKDEyKSxyPWkoMTc0KSxhPWkoOTYpLGg9aSg5NCksZD1pKDM0KTtvLnByb3RvdHlwZS5pbml0aWFsaXplRGF0YT1mdW5jdGlvbih0LGUsaSl7aWYodm9pZCAwIT09ZSl7QXJyYXkuaXNBcnJheShlKSYmKGU9bmV3IG4oZSkpO3ZhciBvO2lmKCEoZSBpbnN0YW5jZW9mIG58fGUgaW5zdGFuY2VvZiBzKSl0aHJvdyBuZXcgRXJyb3IoXCJBcnJheSwgRGF0YVNldCwgb3IgRGF0YVZpZXcgZXhwZWN0ZWRcIik7aWYobz1lLmdldCgpLDAhPW8ubGVuZ3RoKXt0aGlzLnN0eWxlPWksdGhpcy5kYXRhU2V0JiZ0aGlzLmRhdGFTZXQub2ZmKFwiKlwiLHRoaXMuX29uQ2hhbmdlKSx0aGlzLmRhdGFTZXQ9ZSx0aGlzLmRhdGFUYWJsZT1vO3ZhciByPXRoaXM7dGhpcy5fb25DaGFuZ2U9ZnVuY3Rpb24oKXt0LnNldERhdGEoci5kYXRhU2V0KX0sdGhpcy5kYXRhU2V0Lm9uKFwiKlwiLHRoaXMuX29uQ2hhbmdlKSx0aGlzLmNvbFg9XCJ4XCIsdGhpcy5jb2xZPVwieVwiLHRoaXMuY29sWj1cInpcIjt2YXIgaD10Lmhhc0JhcnMoaSk7aWYoaCYmKHZvaWQgMCE9PXQuZGVmYXVsdFhCYXJXaWR0aD90aGlzLnhCYXJXaWR0aD10LmRlZmF1bHRYQmFyV2lkdGg6dGhpcy54QmFyV2lkdGg9dGhpcy5nZXRTbWFsbGVzdERpZmZlcmVuY2Uobyx0aGlzLmNvbFgpfHwxLHZvaWQgMCE9PXQuZGVmYXVsdFlCYXJXaWR0aD90aGlzLnlCYXJXaWR0aD10LmRlZmF1bHRZQmFyV2lkdGg6dGhpcy55QmFyV2lkdGg9dGhpcy5nZXRTbWFsbGVzdERpZmZlcmVuY2Uobyx0aGlzLmNvbFkpfHwxKSx0aGlzLl9pbml0aWFsaXplUmFuZ2Uobyx0aGlzLmNvbFgsdCxoKSx0aGlzLl9pbml0aWFsaXplUmFuZ2Uobyx0aGlzLmNvbFksdCxoKSx0aGlzLl9pbml0aWFsaXplUmFuZ2Uobyx0aGlzLmNvbFosdCwhMSksb1swXS5oYXNPd25Qcm9wZXJ0eShcInN0eWxlXCIpKXt0aGlzLmNvbFZhbHVlPVwic3R5bGVcIjt2YXIgZD10aGlzLmdldENvbHVtblJhbmdlKG8sdGhpcy5jb2xWYWx1ZSk7dGhpcy5fc2V0UmFuZ2VEZWZhdWx0cyhkLHQuZGVmYXVsdFZhbHVlTWluLHQuZGVmYXVsdFZhbHVlTWF4KSx0aGlzLnZhbHVlUmFuZ2U9ZH10aGlzLmdldERhdGFUYWJsZSgpWzBdLmhhc093blByb3BlcnR5KFwiZmlsdGVyXCIpJiZ2b2lkIDA9PT10aGlzLmRhdGFGaWx0ZXImJih0aGlzLmRhdGFGaWx0ZXI9bmV3IGEodGhpcyxcImZpbHRlclwiLHQpLHRoaXMuZGF0YUZpbHRlci5zZXRPbkxvYWRDYWxsYmFjayhmdW5jdGlvbigpe3QucmVkcmF3KCl9KSk7cmV0dXJuIHRoaXMuZGF0YUZpbHRlcj90aGlzLmRhdGFGaWx0ZXIuX2dldERhdGFQb2ludHMoKTp0aGlzLl9nZXREYXRhUG9pbnRzKHR
21167oaXMuZ2V0RGF0YVRhYmxlKCkpfX19LG8ucHJvdG90eXBlLl9jb2xsZWN0UmFuZ2VTZXR0aW5ncz1mdW5jdGlvbih0LGUpe2lmKC0xPT1bXCJ4XCIsXCJ5XCIsXCJ6XCJdLmluZGV4T2YodCkpdGhyb3cgbmV3IEVycm9yKFwiQ29sdW1uICdcIit0K1wiJyBpbnZhbGlkXCIpO3ZhciBpPXQudG9VcHBlckNhc2UoKTtyZXR1cm57YmFyV2lkdGg6dGhpc1t0K1wiQmFyV2lkdGhcIl0sbWluOmVbXCJkZWZhdWx0XCIraStcIk1pblwiXSxtYXg6ZVtcImRlZmF1bHRcIitpK1wiTWF4XCJdLHN0ZXA6ZVtcImRlZmF1bHRcIitpK1wiU3RlcFwiXSxyYW5nZV9sYWJlbDp0K1wiUmFuZ2VcIixzdGVwX2xhYmVsOnQrXCJTdGVwXCJ9fSxvLnByb3RvdHlwZS5faW5pdGlhbGl6ZVJhbmdlPWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPXRoaXMuX2NvbGxlY3RSYW5nZVNldHRpbmdzKGUsaSkscz10aGlzLmdldENvbHVtblJhbmdlKHQsZSk7byYmXCJ6XCIhPWUmJnMuZXhwYW5kKG4uYmFyV2lkdGgvMiksdGhpcy5fc2V0UmFuZ2VEZWZhdWx0cyhzLG4ubWluLG4ubWF4KSx0aGlzW24ucmFuZ2VfbGFiZWxdPXMsdGhpc1tuLnN0ZXBfbGFiZWxdPXZvaWQgMCE9PW4uc3RlcD9uLnN0ZXA6cy5yYW5nZSgpLzV9LG8ucHJvdG90eXBlLmdldERpc3RpbmN0VmFsdWVzPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9dGhpcy5kYXRhVGFibGUpO2Zvcih2YXIgaT1bXSxvPTA7bzxlLmxlbmd0aDtvKyspe3ZhciBuPWVbb11bdF18fDA7LTE9PT1pLmluZGV4T2YobikmJmkucHVzaChuKX1yZXR1cm4gaS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pfSxvLnByb3RvdHlwZS5nZXRTbWFsbGVzdERpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dGhpcy5nZXREaXN0aW5jdFZhbHVlcyh0LGUpLG89bnVsbCxuPTE7bjxpLmxlbmd0aDtuKyspe3ZhciBzPWlbbl0taVtuLTFdOyhudWxsPT1vfHxvPnMpJiYobz1zKX1yZXR1cm4gb30sby5wcm90b3R5cGUuZ2V0Q29sdW1uUmFuZ2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9bmV3IHIsbz0wO288dC5sZW5ndGg7bysrKXt2YXIgbj10W29dW2VdO2kuYWRqdXN0KG4pfXJldHVybiBpfSxvLnByb3RvdHlwZS5nZXROdW1iZXJPZlJvd3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhVGFibGUubGVuZ3RofSxvLnByb3RvdHlwZS5fc2V0UmFuZ2VEZWZhdWx0cz1mdW5jdGlvbih0LGUsaSl7dm9pZCAwIT09ZSYmKHQubWluPWUpLHZvaWQgMCE9PWkmJih0Lm1heD1pKSx0Lm1heDw9dC5taW4mJih0Lm1heD10Lm1pbisxKX0sby5wcm90b3R5cGUuZ2V0RGF0YVRhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YVRhYmxlfSxvLnByb3RvdHlwZS5nZXREYXRhU2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YVNldH0sby5wcm90b3R5cGUuZ2V0RGF0YVBvaW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgbz1uZXcgZDtvLng9dFtpXVt0aGlzLmNvbFhdfHwwLG8ueT10W2ldW3RoaXMuY29sWV18fDAsby56PXRbaV1bdGhpcy5jb2xaXXx8MCxvLmRhdGE9dFtpXSx2b2lkIDAhPT10aGlzLmNvbFZhbHVlJiYoby52YWx1ZT10W2ldW3RoaXMuY29sVmFsdWVdfHwwKTt2YXIgbj17fTtuLnBvaW50PW8sbi5ib3R0b209bmV3IGQoby54LG8ueSx0aGlzLnpSYW5nZS5taW4pLG4udHJhbnM9dm9pZCAwLG4uc2NyZWVuPXZvaWQgMCxlLnB1c2gobil9cmV0dXJuIGV9LG8ucHJvdG90eXBlLmluaXREYXRhQXNNYXRyaXg9ZnVuY3Rpb24odCl7dmFyIGUsaSxvLG4scz10aGlzLmdldERpc3RpbmN0VmFsdWVzKHRoaXMuY29sWCx0KSxyPXRoaXMuZ2V0RGlzdGluY3RWYWx1ZXModGhpcy5jb2xZLHQpLGE9dGhpcy5nZXREYXRhUG9pbnRzKHQpLGg9W107Zm9yKG89MDtvPGEubGVuZ3RoO28rKyl7bj1hW29dO3ZhciBkPXMuaW5kZXhPZihuLnBvaW50LngpLGw9ci5pbmRleE9mKG4ucG9pbnQueSk7dm9pZCAwPT09aFtkXSYmKGhbZF09W10pLGhbZF1bbF09bn1mb3IoZT0wO2U8aC5sZW5ndGg7ZSsrKWZvcihpPTA7aTxoW2VdLmxlbmd0aDtpKyspaFtlXVtpXSYmKGhbZV1baV0ucG9pbnRSaWdodD1lPGgubGVuZ3RoLTE/aFtlKzFdW2ldOnZvaWQgMCxoW2VdW2ldLnBvaW50VG9wPWk8aFtlXS5sZW5ndGgtMT9oW2VdW2krMV06dm9pZCAwLGhbZV1baV0ucG9pbnRDcm9zcz1lPGgubGVuZ3RoLTEmJmk8aFtlXS5sZW5ndGgtMT9oW2UrMV1baSsxXTp2b2lkIDApO3JldHVybiBhfSxvLnByb3RvdHlwZS5nZXRJbmZvPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kYXRhRmlsdGVyO2lmKHQpcmV0dXJuIHQuZ2V0TGFiZWwoKStcIjogXCIrdC5nZXRTZWxlY3RlZFZhbHVlKCl9LG8ucHJvdG90eXBlLnJlbG9hZD1mdW5jdGlvbigpe3RoaXMuZGF0YVRhYmxlJiZ0aGlzLnNldERhdGEodGhpcy5kYXRhVGFibGUpfSxvLnByb3RvdHlwZS5fZ2V0RGF0YVBvaW50cz1mdW5jdGlvbih0KXt2YXIgZT1bXTtpZih0aGlzLnN0eWxlPT09aC5TVFlMRS5HUklEfHx0aGlzLnN0eWxlPT09aC5TVFlMRS5TVVJGQUNFKWU9dGhpcy5pbml0RGF0YUFzTWF0cml4KHQpO2Vsc2UgaWYodGhpcy5fY2hlY2tWYWx1ZUZpZWxkKHQpLGU9dGhpcy5nZXREYXRhUG9pbnRzKHQpLHRoaXMuc3R5bGU9PT1oLlNUWUxFLkxJTkUpZm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspaT4wJiYoZVtpLTFdLnBvaW50TmV4dD1lW2ldKTtyZXR1cm4gZX0sby5wcm90b3R5cGUuX2NoZWNrVmFsdWVGaWVsZD1mdW5jdGlvbih0KXtpZih0aGlzLnN0eWxlPT09aC5TVFlMRS5CQVJDT0xPUnx8dGhpcy5zdHlsZT09PWguU1RZTEUuQkFSU0laRXx8dGhpcy5zdHlsZT09PWguU1RZTEUuRE9UQ09MT1J8fHRoaXMuc3R5bGU9PT1oLlNUWUxFLkRPVFNJWkUpe2lmKHZvaWQgMD09PXRoaXMuY29sVmFsdWUpdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgZGF0YSB0byBoYXZlICBmaWVsZCAnc3R5bGUnICBmb3IgZ3JhcGggc3R5bGUgJ1wiK3RoaXMuc3R5bGUrXCInXCIpO2lmKHZvaWQgMD09PXRbMF1bdGhpcy5jb2xWYWx1ZV0pdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgZGF0YSB0byBoYXZlICBmaWVsZCAnXCIrdGhpcy5jb2xWYWx1ZStcIicgIGZvciBncmFwaCBzdHlsZSAnXCIrdGhpcy5zdHlsZStcIidcIil9fSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8oKXt0aGlzLm1pbj12b2lkIDAsdGhpcy5tYXg9dm9pZCAwfW8ucHJvdG90eXBlLmFkanVzdD1mdW5jdGlvbih0KXt2b2lkIDAhPT10JiYoKHZvaWQgMD09PXRoaXMubWlufHx0aGlzLm1pbj50KSYmKHRoaXMubWluPXQpLCh2b2lkIDA9PT10aGlzLm1heHx8dGhpcy5tYXg8dCkmJih0aGlzLm1heD10KSl9LG8ucHJvdG90eXBlLmNvbWJpbmU9ZnVuY3Rpb24odCl7dGhpcy5hZGQodC5taW4pLHRoaXMuYWRkKHQubWF4KX0sby5wcm90b3R5cGUuZXhwYW5kPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpe3ZhciBlPXR
21167oaXMubWluLXQsaT10aGlzLm1heCt0O2lmKGU+aSl0aHJvdyBuZXcgRXJyb3IoXCJQYXNzZWQgZXhwYW5zaW9uIHZhbHVlIG1ha2VzIHJhbmdlIGludmFsaWRcIik7dGhpcy5taW49ZSx0aGlzLm1heD1pfX0sby5wcm90b3R5cGUucmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXgtdGhpcy5taW59LG8ucHJvdG90eXBlLmNlbnRlcj1mdW5jdGlvbigpe3JldHVybih0aGlzLm1pbit0aGlzLm1heCkvMn0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbyxuLHM7IWZ1bmN0aW9uKGkpe249W10sbz1pLHZvaWQgMCE9PShzPVwiZnVuY3Rpb25cIj09dHlwZW9mIG8/by5hcHBseShlLG4pOm8pJiYodC5leHBvcnRzPXMpfShmdW5jdGlvbigpe3ZhciB0PW51bGw7cmV0dXJuIGZ1bmN0aW9uIGUoaSxvKXtmdW5jdGlvbiBuKHQpe3JldHVybiB0Lm1hdGNoKC9bXiBdKy9nKX1mdW5jdGlvbiBzKGUpe2lmKFwiaGFtbWVyLmlucHV0XCIhPT1lLnR5cGUpe2lmKGUuc3JjRXZlbnQuX2hhbmRsZWR8fChlLnNyY0V2ZW50Ll9oYW5kbGVkPXt9KSxlLnNyY0V2ZW50Ll9oYW5kbGVkW2UudHlwZV0pcmV0dXJuO2Uuc3JjRXZlbnQuX2hhbmRsZWRbZS50eXBlXT0hMH12YXIgaT0hMTtlLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe2k9ITB9O3ZhciBvPWUuc3JjRXZlbnQuc3RvcFByb3BhZ2F0aW9uLmJpbmQoZS5zcmNFdmVudCk7XCJmdW5jdGlvblwiPT10eXBlb2YgbyYmKGUuc3JjRXZlbnQuc3RvcFByb3BhZ2F0aW9uPWZ1bmN0aW9uKCl7bygpLGUuc3RvcFByb3BhZ2F0aW9uKCl9KSxlLmZpcnN0VGFyZ2V0PXQ7Zm9yKHZhciBuPXQ7biYmIWk7KXt2YXIgcz1uLmhhbW1lcjtpZihzKWZvcih2YXIgcixhPTA7YTxzLmxlbmd0aDthKyspaWYocj1zW2FdLl9oYW5kbGVyc1tlLnR5cGVdKWZvcih2YXIgaD0wO2g8ci5sZW5ndGgmJiFpO2grKylyW2hdKGUpO249bi5wYXJlbnROb2RlfX12YXIgcj1vfHx7cHJldmVudERlZmF1bHQ6ITF9O2lmKGkuTWFuYWdlcil7dmFyIGE9aSxoPWZ1bmN0aW9uKHQsaSl7dmFyIG89T2JqZWN0LmNyZWF0ZShyKTtyZXR1cm4gaSYmYS5hc3NpZ24obyxpKSxlKG5ldyBhKHQsbyksbyl9O3JldHVybiBhLmFzc2lnbihoLGEpLGguTWFuYWdlcj1mdW5jdGlvbih0LGkpe3ZhciBvPU9iamVjdC5jcmVhdGUocik7cmV0dXJuIGkmJmEuYXNzaWduKG8saSksZShuZXcgYS5NYW5hZ2VyKHQsbyksbyl9LGh9dmFyIGQ9T2JqZWN0LmNyZWF0ZShpKSxsPWkuZWxlbWVudDtyZXR1cm4gbC5oYW1tZXJ8fChsLmhhbW1lcj1bXSksbC5oYW1tZXIucHVzaChkKSxpLm9uKFwiaGFtbWVyLmlucHV0XCIsZnVuY3Rpb24oZSl7ITAhPT1yLnByZXZlbnREZWZhdWx0JiZyLnByZXZlbnREZWZhdWx0IT09ZS5wb2ludGVyVHlwZXx8ZS5wcmV2ZW50RGVmYXVsdCgpLGUuaXNGaXJzdCYmKHQ9ZS50YXJnZXQpfSksZC5faGFuZGxlcnM9e30sZC5vbj1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG89ZC5faGFuZGxlcnNbdF07b3x8KGQuX2hhbmRsZXJzW3RdPW89W10saS5vbih0LHMpKSxvLnB1c2goZSl9KSxkfSxkLm9mZj1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG89ZC5faGFuZGxlcnNbdF07byYmKG89ZT9vLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWV9KTpbXSxvLmxlbmd0aD4wP2QuX2hhbmRsZXJzW3RdPW86KGkub2ZmKHQscyksZGVsZXRlIGQuX2hhbmRsZXJzW3RdKSl9KSxkfSxkLmVtaXQ9ZnVuY3Rpb24oZSxvKXt0PW8udGFyZ2V0LGkuZW1pdChlLG8pfSxkLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD1pLmVsZW1lbnQuaGFtbWVyLGU9dC5pbmRleE9mKGQpOy0xIT09ZSYmdC5zcGxpY2UoZSwxKSx0Lmxlbmd0aHx8ZGVsZXRlIGkuZWxlbWVudC5oYW1tZXIsZC5faGFuZGxlcnM9e30saS5kZXN0cm95KCl9LGR9fSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbzshZnVuY3Rpb24obixzLHIsYSl7ZnVuY3Rpb24gaCh0LGUsaSl7cmV0dXJuIHNldFRpbWVvdXQocCh0LGkpLGUpfWZ1bmN0aW9uIGQodCxlLGkpe3JldHVybiEhQXJyYXkuaXNBcnJheSh0KSYmKGwodCxpW2VdLGkpLCEwKX1mdW5jdGlvbiBsKHQsZSxpKXt2YXIgbztpZih0KWlmKHQuZm9yRWFjaCl0LmZvckVhY2goZSxpKTtlbHNlIGlmKHQubGVuZ3RoIT09YSlmb3Iobz0wO288dC5sZW5ndGg7KWUuY2FsbChpLHRbb10sbyx0KSxvKys7ZWxzZSBmb3IobyBpbiB0KXQuaGFzT3duUHJvcGVydHkobykmJmUuY2FsbChpLHRbb10sbyx0KX1mdW5jdGlvbiB1KHQsZSxpKXt2YXIgbz1cIkRFUFJFQ0FURUQgTUVUSE9EOiBcIitlK1wiXFxuXCIraStcIiBBVCBcXG5cIjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uZXcgRXJyb3IoXCJnZXQtc3RhY2stdHJhY2VcIiksaT1lJiZlLnN0YWNrP2Uuc3RhY2sucmVwbGFjZSgvXlteXFwoXSs/W1xcbiRdL2dtLFwiXCIpLnJlcGxhY2UoL15cXHMrYXRcXHMrL2dtLFwiXCIpLnJlcGxhY2UoL15PYmplY3QuPGFub255bW91cz5cXHMqXFwoL2dtLFwie2Fub255bW91c30oKUBcIik6XCJVbmtub3duIFN0YWNrIFRyYWNlXCIscz1uLmNvbnNvbGUmJihuLmNvbnNvbGUud2Fybnx8bi5jb25zb2xlLmxvZyk7cmV0dXJuIHMmJnMuY2FsbChuLmNvbnNvbGUsbyxpKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gYyh0LGUsaSl7dmFyIG8sbj1lLnByb3RvdHlwZTtvPXQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobiksby5jb25zdHJ1Y3Rvcj10LG8uX3N1cGVyPW4saSYmZnQobyxpKX1mdW5jdGlvbiBwKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxhcmd1bWVudHMpfX1mdW5jdGlvbiBmKHQsZSl7cmV0dXJuIHR5cGVvZiB0PT1ndD90LmFwcGx5KGU/ZVswXXx8YTphLGUpOnR9ZnVuY3Rpb24gbSh0LGUpe3JldHVybiB0PT09YT9lOnR9ZnVuY3Rpb24gdih0LGUsaSl7bChfKGUpLGZ1bmN0aW9uKGUpe3QuYWRkRXZlbnRMaXN0ZW5lcihlLGksITEpfSl9ZnVuY3Rpb24gZyh0LGUsaSl7bChfKGUpLGZ1bmN0aW9uKGUpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLGksITEpfSl9ZnVuY3Rpb24geSh0LGUpe2Zvcig7dDspe2lmKHQ9PWUpcmV0dXJuITA7dD10LnBhcmVudE5vZGV9cmV0dXJuITF9ZnVuY3Rpb24gYih0LGUpe3JldHVybiB0LmluZGV4T2YoZSk+LTF9ZnVuY3Rpb24gXyh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL1xccysvZyl9ZnVuY3Rpb24gdyh0LGUsaSl7aWYodC5pbmRleE9mJiYhaSlyZXR1cm4gdC5pbmRleE9mKGUpO2Zvcih2YXIgbz0wO288dC5sZW5ndGg7KXtpZihpJiZ0W29dW2ldPT1lfHwhaSYmdFtvXT09PWUpcmV0dXJuIG87bysrfXJldHVybi0xfWZ1bmN0aW9uIHgodCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQsMCl9ZnVuY3Rpb24gayh0LGUsaSl7Zm9yKHZhciBvPVtdLG49W10scz0wO3M8dC5sZW5ndGg7KXt2YXIgcj1lP3Rbc11bZV06dFtzXTt3KG4scik8MCYmby5wdXNoKHRbc10pLG5bc109cixzKyt9cmV0dXJuIGkmJihvPWU/by5zb3J0KGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRbZV0+aVtlXX0pOm8uc29ydCgpKSxvfWZ1bmN0aW9uIFModCxlKXtmb3IodmFyIGksbyxuPWVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLHM9MDtzPG10Lmxlbmd0aDspe2lmKGk9bXRbc10sKG89aT9pK246ZSlpbiB0KXJldHVybi
21167BvO3MrK31yZXR1cm4gYX1mdW5jdGlvbiBEKCl7cmV0dXJuIGt0Kyt9ZnVuY3Rpb24gTSh0KXt2YXIgZT10Lm93bmVyRG9jdW1lbnR8fHQ7cmV0dXJuIGUuZGVmYXVsdFZpZXd8fGUucGFyZW50V2luZG93fHxufWZ1bmN0aW9uIEModCxlKXt2YXIgaT10aGlzO3RoaXMubWFuYWdlcj10LHRoaXMuY2FsbGJhY2s9ZSx0aGlzLmVsZW1lbnQ9dC5lbGVtZW50LHRoaXMudGFyZ2V0PXQub3B0aW9ucy5pbnB1dFRhcmdldCx0aGlzLmRvbUhhbmRsZXI9ZnVuY3Rpb24oZSl7Zih0Lm9wdGlvbnMuZW5hYmxlLFt0XSkmJmkuaGFuZGxlcihlKX0sdGhpcy5pbml0KCl9ZnVuY3Rpb24gTyh0KXt2YXIgZT10Lm9wdGlvbnMuaW5wdXRDbGFzcztyZXR1cm4gbmV3KGV8fChNdD9XOkN0P1Y6RHQ/cTpIKSkodCxFKX1mdW5jdGlvbiBFKHQsZSxpKXt2YXIgbz1pLnBvaW50ZXJzLmxlbmd0aCxuPWkuY2hhbmdlZFBvaW50ZXJzLmxlbmd0aCxzPWUmRXQmJm8tbj09MCxyPWUmKFB0fEl0KSYmby1uPT0wO2kuaXNGaXJzdD0hIXMsaS5pc0ZpbmFsPSEhcixzJiYodC5zZXNzaW9uPXt9KSxpLmV2ZW50VHlwZT1lLFQodCxpKSx0LmVtaXQoXCJoYW1tZXIuaW5wdXRcIixpKSx0LnJlY29nbml6ZShpKSx0LnNlc3Npb24ucHJldklucHV0PWl9ZnVuY3Rpb24gVCh0LGUpe3ZhciBpPXQuc2Vzc2lvbixvPWUucG9pbnRlcnMsbj1vLmxlbmd0aDtpLmZpcnN0SW5wdXR8fChpLmZpcnN0SW5wdXQ9TihlKSksbj4xJiYhaS5maXJzdE11bHRpcGxlP2kuZmlyc3RNdWx0aXBsZT1OKGUpOjE9PT1uJiYoaS5maXJzdE11bHRpcGxlPSExKTt2YXIgcz1pLmZpcnN0SW5wdXQscj1pLmZpcnN0TXVsdGlwbGUsYT1yP3IuY2VudGVyOnMuY2VudGVyLGg9ZS5jZW50ZXI9UihvKTtlLnRpbWVTdGFtcD1fdCgpLGUuZGVsdGFUaW1lPWUudGltZVN0YW1wLXMudGltZVN0YW1wLGUuYW5nbGU9RihhLGgpLGUuZGlzdGFuY2U9TChhLGgpLFAoaSxlKSxlLm9mZnNldERpcmVjdGlvbj16KGUuZGVsdGFYLGUuZGVsdGFZKTt2YXIgZD1BKGUuZGVsdGFUaW1lLGUuZGVsdGFYLGUuZGVsdGFZKTtlLm92ZXJhbGxWZWxvY2l0eVg9ZC54LGUub3ZlcmFsbFZlbG9jaXR5WT1kLnksZS5vdmVyYWxsVmVsb2NpdHk9YnQoZC54KT5idChkLnkpP2QueDpkLnksZS5zY2FsZT1yP2ooci5wb2ludGVycyxvKToxLGUucm90YXRpb249cj9CKHIucG9pbnRlcnMsbyk6MCxlLm1heFBvaW50ZXJzPWkucHJldklucHV0P2UucG9pbnRlcnMubGVuZ3RoPmkucHJldklucHV0Lm1heFBvaW50ZXJzP2UucG9pbnRlcnMubGVuZ3RoOmkucHJldklucHV0Lm1heFBvaW50ZXJzOmUucG9pbnRlcnMubGVuZ3RoLEkoaSxlKTt2YXIgbD10LmVsZW1lbnQ7eShlLnNyY0V2ZW50LnRhcmdldCxsKSYmKGw9ZS5zcmNFdmVudC50YXJnZXQpLGUudGFyZ2V0PWx9ZnVuY3Rpb24gUCh0LGUpe3ZhciBpPWUuY2VudGVyLG89dC5vZmZzZXREZWx0YXx8e30sbj10LnByZXZEZWx0YXx8e30scz10LnByZXZJbnB1dHx8e307ZS5ldmVudFR5cGUhPT1FdCYmcy5ldmVudFR5cGUhPT1QdHx8KG49dC5wcmV2RGVsdGE9e3g6cy5kZWx0YVh8fDAseTpzLmRlbHRhWXx8MH0sbz10Lm9mZnNldERlbHRhPXt4OmkueCx5OmkueX0pLGUuZGVsdGFYPW4ueCsoaS54LW8ueCksZS5kZWx0YVk9bi55KyhpLnktby55KX1mdW5jdGlvbiBJKHQsZSl7dmFyIGksbyxuLHMscj10Lmxhc3RJbnRlcnZhbHx8ZSxoPWUudGltZVN0YW1wLXIudGltZVN0YW1wO2lmKGUuZXZlbnRUeXBlIT1JdCYmKGg+T3R8fHIudmVsb2NpdHk9PT1hKSl7dmFyIGQ9ZS5kZWx0YVgtci5kZWx0YVgsbD1lLmRlbHRhWS1yLmRlbHRhWSx1PUEoaCxkLGwpO289dS54LG49dS55LGk9YnQodS54KT5idCh1LnkpP3UueDp1Lnkscz16KGQsbCksdC5sYXN0SW50ZXJ2YWw9ZX1lbHNlIGk9ci52ZWxvY2l0eSxvPXIudmVsb2NpdHlYLG49ci52ZWxvY2l0eVkscz1yLmRpcmVjdGlvbjtlLnZlbG9jaXR5PWksZS52ZWxvY2l0eVg9byxlLnZlbG9jaXR5WT1uLGUuZGlyZWN0aW9uPXN9ZnVuY3Rpb24gTih0KXtmb3IodmFyIGU9W10saT0wO2k8dC5wb2ludGVycy5sZW5ndGg7KWVbaV09e2NsaWVudFg6eXQodC5wb2ludGVyc1tpXS5jbGllbnRYKSxjbGllbnRZOnl0KHQucG9pbnRlcnNbaV0uY2xpZW50WSl9LGkrKztyZXR1cm57dGltZVN0YW1wOl90KCkscG9pbnRlcnM6ZSxjZW50ZXI6UihlKSxkZWx0YVg6dC5kZWx0YVgsZGVsdGFZOnQuZGVsdGFZfX1mdW5jdGlvbiBSKHQpe3ZhciBlPXQubGVuZ3RoO2lmKDE9PT1lKXJldHVybnt4Onl0KHRbMF0uY2xpZW50WCkseTp5dCh0WzBdLmNsaWVudFkpfTtmb3IodmFyIGk9MCxvPTAsbj0wO248ZTspaSs9dFtuXS5jbGllbnRYLG8rPXRbbl0uY2xpZW50WSxuKys7cmV0dXJue3g6eXQoaS9lKSx5Onl0KG8vZSl9fWZ1bmN0aW9uIEEodCxlLGkpe3JldHVybnt4OmUvdHx8MCx5OmkvdHx8MH19ZnVuY3Rpb24geih0LGUpe3JldHVybiB0PT09ZT9OdDpidCh0KT49YnQoZSk/dDwwP1J0OkF0OmU8MD96dDpMdH1mdW5jdGlvbiBMKHQsZSxpKXtpfHwoaT1IdCk7dmFyIG89ZVtpWzBdXS10W2lbMF1dLG49ZVtpWzFdXS10W2lbMV1dO3JldHVybiBNYXRoLnNxcnQobypvK24qbil9ZnVuY3Rpb24gRih0LGUsaSl7aXx8KGk9SHQpO3ZhciBvPWVbaVswXV0tdFtpWzBdXSxuPWVbaVsxXV0tdFtpWzFdXTtyZXR1cm4gMTgwKk1hdGguYXRhbjIobixvKS9NYXRoLlBJfWZ1bmN0aW9uIEIodCxlKXtyZXR1cm4gRihlWzFdLGVbMF0sV3QpK0YodFsxXSx0WzBdLFd0KX1mdW5jdGlvbiBqKHQsZSl7cmV0dXJuIEwoZVswXSxlWzFdLFd0KS9MKHRbMF0sdFsxXSxXdCl9ZnVuY3Rpb24gSCgpe3RoaXMuZXZFbD1HdCx0aGlzLmV2V2luPVZ0LHRoaXMucHJlc3NlZD0hMSxDLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBXKCl7dGhpcy5ldkVsPVh0LHRoaXMuZXZXaW49WnQsQy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5zdG9yZT10aGlzLm1hbmFnZXIuc2Vzc2lvbi5wb2ludGVyRXZlbnRzPVtdfWZ1bmN0aW9uIFkoKXt0aGlzLmV2VGFyZ2V0PUp0LHRoaXMuZXZXaW49JHQsdGhpcy5zdGFydGVkPSExLEMuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIEcodCxlKXt2YXIgaT14KHQudG91Y2hlcyksbz14KHQuY2hhbmdlZFRvdWNoZXMpO3JldHVybiBlJihQdHxJdCkmJihpPWsoaS5jb25jYXQobyksXCJpZGVudGlmaWVyXCIsITApKSxbaSxvXX1mdW5jdGlvbiBWKCl7dGhpcy5ldlRhcmdldD10ZSx0aGlzLnRhcmdldElkcz17fSxDLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBVKHQsZSl7dmFyIGk9eCh0LnRvdWNoZXMpLG89dGhpcy50YXJnZXRJZHM7aWYoZSYoRXR8VHQpJiYxPT09aS5sZW5ndGgpcmV0dXJuIG9baVswXS5pZGVudGlmaWVyXT0hMCxbaSxpXTt2YXIgbixzLHI9eCh0LmNoYW5nZWRUb3VjaGVzKSxhPVtdLGg9dGhpcy50YXJnZXQ7aWYocz1pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4geSh0LnRhcmdldCxoKX0pLGU9PT1FdClmb3Iobj0wO248cy5sZW5ndGg7KW9bc1tuXS5pZGVudGlmaWVyXT0hMCxuKys7Zm9yKG49MDtuPHIubGVuZ3RoOylvW3Jbbl0uaWRlbnRpZmllcl0mJmEucHVzaChyW25dKSxlJihQdHxJdCkmJmRlbGV0ZSBvW3Jbbl0uaWRlbnRpZmllcl0sbisrO3JldHVybiBhLmxlbmd0aD9bayhzLmNvbmNhdChhKSxcImlkZW50aWZpZXJcIiwhMCksYV06dm9pZCAwfWZ1bmN0aW9uIHEoKXtDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgdD1wKHRoaXMuaGFuZGxlcix0aGlzKTt0aGlzLnRvdWNoPW5ldyBWKHRoaXMubWFuYWdlcix0KSx0aGlzLm1vdXNlPW5ldyBIKHRoaXMubWFuYWdlcix0KSx0aGlzLnByaW1hcnlUb3VjaD1udWxsLHRoaXMubGFzdFRvdWNoZXM9W119ZnVuY3Rpb24gWCh0LGUpe3QmRXQ/KHRoaXMucHJpbWFyeVRvdWNoPWUuY2hhbmdlZFBvaW50ZXJzWzBdLmlkZW50aWZpZXIsWi5jYWxsKHRoaXMsZSkpOnQmKFB0fEl0KSYmWi5jYWxsKHRoaXMsZSl9ZnVuY3Rpb24gWih0KXt2YXIgZT10LmNoYW5nZWRQb2ludGVyc1swXTtpZihlLmlkZW50aWZpZXI9PT10aGlzLnByaW1hcnlUb3VjaCl7dmFyIGk9e3g6ZS5jbGllbnRYLHk6ZS5jbGllbnRZfTt0aGlzLmxhc3RUb3VjaGVzLnB1c2goaSk7dmFyIG89dGhpcy5sYXN0VG91Y2hlcyxuPWZ1bmN0aW9uKCl7dmFyIHQ9by5pbmRleE9mKGkpO3Q+LTEmJm8uc3BsaWNlKHQsMSl9O3NldFRpbWVvdXQobixlZSl9fWZ1bmN0aW9uIEsodCl7Zm9yKHZhciBlPXQuc3JjRXZlbnQuY2xpZW50WCxpPXQuc3JjRXZlbnQuY2xpZW50WSxvPTA7bzx0aGlzLmxhc3RUb3VjaGVzLmxlbmd0aDtvKyspe3ZhciBuPXRoaXMubGFzdFRvdWNoZXNbb10scz1NYXRoLmFicyhlLW4ueCkscj1NYXRoLmFicyhpLW4ueSk7aWYoczw9aWUmJnI8PWllKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIEoodCxlKXt0aGlzLm1hbmFnZXI9dCx0aGlzLnNldChlKX1mdW5jdGlvbiAkKHQpe2lmKGIodCxhZSkpcmV0dXJuIGFlO3ZhciBlPWIodCxoZSksaT1iKHQsZGUpO3JldHVybiBlJiZpP2FlOmV8fGk/ZT9oZTpkZTpiKHQscmUpP3JlOnNlfWZ1bmN0aW9uIFEodCl7dGhpcy5vcHRpb25zPWZ0KHt9LHRoaXMuZGVmYXVsdHMsdHx8e30pLHRoaXMuaWQ9RCgpLHRoaXMubWFuYWdlcj1udWxsLHRoaXMub3B0aW9ucy5lbmFibGU9bSh0aGlzLm9wdGlvbnMuZW5hYmxlLCEwKSx0aGlzLnN0YXRlPXVlLHRoaXMuc2ltdWx0YW5lb3VzPXt9LHRoaXMucmVxdWlyZUZhaWw9W119XG4gICAgZnVuY3Rpb24gdHQodCl7cmV0dXJuIHQmdmU/XCJjYW5jZWxcIjp0JmZlP1wiZW5kXCI6dCZwZT9cIm1vdmVcIjp0JmNlP1wic3RhcnRcIjpcIlwifWZ1bmN0aW9uIGV0KHQpe3JldHVybiB0PT1MdD9cImRvd25cIjp0PT16dD9cInVwXCI6dD09UnQ/XCJsZWZ0XCI6dD09QXQ/XCJyaWdodFwiOlwiXCJ9ZnVuY3Rpb24gaXQodCxlKXt2YXIgaT1lLm1hbmFnZXI7cmV0dXJuIGk/aS5nZXQodCk6dH1mdW5jdGlvbiBvdCgpe1EuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIG50KCl7b3QuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucFg9bnVsbCx0aGlzLnBZPW51bGx9ZnVuY3Rpb24gc3QoKXtvdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcnQoKXtRLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl90
21167aW1lcj1udWxsLHRoaXMuX2lucHV0PW51bGx9ZnVuY3Rpb24gYXQoKXtvdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gaHQoKXtvdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gZHQoKXtRLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnBUaW1lPSExLHRoaXMucENlbnRlcj0hMSx0aGlzLl90aW1lcj1udWxsLHRoaXMuX2lucHV0PW51bGwsdGhpcy5jb3VudD0wfWZ1bmN0aW9uIGx0KHQsZSl7cmV0dXJuIGU9ZXx8e30sZS5yZWNvZ25pemVycz1tKGUucmVjb2duaXplcnMsbHQuZGVmYXVsdHMucHJlc2V0KSxuZXcgdXQodCxlKX1mdW5jdGlvbiB1dCh0LGUpe3RoaXMub3B0aW9ucz1mdCh7fSxsdC5kZWZhdWx0cyxlfHx7fSksdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0PXRoaXMub3B0aW9ucy5pbnB1dFRhcmdldHx8dCx0aGlzLmhhbmRsZXJzPXt9LHRoaXMuc2Vzc2lvbj17fSx0aGlzLnJlY29nbml6ZXJzPVtdLHRoaXMub2xkQ3NzUHJvcHM9e30sdGhpcy5lbGVtZW50PXQsdGhpcy5pbnB1dD1PKHRoaXMpLHRoaXMudG91Y2hBY3Rpb249bmV3IEoodGhpcyx0aGlzLm9wdGlvbnMudG91Y2hBY3Rpb24pLGN0KHRoaXMsITApLGwodGhpcy5vcHRpb25zLnJlY29nbml6ZXJzLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYWRkKG5ldyB0WzBdKHRbMV0pKTt0WzJdJiZlLnJlY29nbml6ZVdpdGgodFsyXSksdFszXSYmZS5yZXF1aXJlRmFpbHVyZSh0WzNdKX0sdGhpcyl9ZnVuY3Rpb24gY3QodCxlKXt2YXIgaT10LmVsZW1lbnQ7aWYoaS5zdHlsZSl7dmFyIG87bCh0Lm9wdGlvbnMuY3NzUHJvcHMsZnVuY3Rpb24obixzKXtvPVMoaS5zdHlsZSxzKSxlPyh0Lm9sZENzc1Byb3BzW29dPWkuc3R5bGVbb10saS5zdHlsZVtvXT1uKTppLnN0eWxlW29dPXQub2xkQ3NzUHJvcHNbb118fFwiXCJ9KSxlfHwodC5vbGRDc3NQcm9wcz17fSl9fWZ1bmN0aW9uIHB0KHQsZSl7dmFyIGk9cy5jcmVhdGVFdmVudChcIkV2ZW50XCIpO2kuaW5pdEV2ZW50KHQsITAsITApLGkuZ2VzdHVyZT1lLGUudGFyZ2V0LmRpc3BhdGNoRXZlbnQoaSl9dmFyIGZ0LG10PVtcIlwiLFwid2Via2l0XCIsXCJNb3pcIixcIk1TXCIsXCJtc1wiLFwib1wiXSx2dD1zLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksZ3Q9XCJmdW5jdGlvblwiLHl0PU1hdGgucm91bmQsYnQ9TWF0aC5hYnMsX3Q9RGF0ZS5ub3c7ZnQ9XCJmdW5jdGlvblwiIT10eXBlb2YgT2JqZWN0LmFzc2lnbj9mdW5jdGlvbih0KXtpZih0PT09YXx8bnVsbD09PXQpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdFwiKTtmb3IodmFyIGU9T2JqZWN0KHQpLGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgbz1hcmd1bWVudHNbaV07aWYobyE9PWEmJm51bGwhPT1vKWZvcih2YXIgbiBpbiBvKW8uaGFzT3duUHJvcGVydHkobikmJihlW25dPW9bbl0pfXJldHVybiBlfTpPYmplY3QuYXNzaWduO3ZhciB3dD11KGZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG89T2JqZWN0LmtleXMoZSksbj0wO248by5sZW5ndGg7KSghaXx8aSYmdFtvW25dXT09PWEpJiYodFtvW25dXT1lW29bbl1dKSxuKys7cmV0dXJuIHR9LFwiZXh0ZW5kXCIsXCJVc2UgYGFzc2lnbmAuXCIpLHh0PXUoZnVuY3Rpb24odCxlKXtyZXR1cm4gd3QodCxlLCEwKX0sXCJtZXJnZVwiLFwiVXNlIGBhc3NpZ25gLlwiKSxrdD0xLFN0PS9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWQvaSxEdD1cIm9udG91Y2hzdGFydFwiaW4gbixNdD1TKG4sXCJQb2ludGVyRXZlbnRcIikhPT1hLEN0PUR0JiZTdC50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLE90PTI1LEV0PTEsVHQ9MixQdD00LEl0PTgsTnQ9MSxSdD0yLEF0PTQsenQ9OCxMdD0xNixGdD1SdHxBdCxCdD16dHxMdCxqdD1GdHxCdCxIdD1bXCJ4XCIsXCJ5XCJdLFd0PVtcImNsaWVudFhcIixcImNsaWVudFlcIl07Qy5wcm90b3R5cGU9e2hhbmRsZXI6ZnVuY3Rpb24oKXt9LGluaXQ6ZnVuY3Rpb24oKXt0aGlzLmV2RWwmJnYodGhpcy5lbGVtZW50LHRoaXMuZXZFbCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZUYXJnZXQmJnYodGhpcy50YXJnZXQsdGhpcy5ldlRhcmdldCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZXaW4mJnYoTSh0aGlzLmVsZW1lbnQpLHRoaXMuZXZXaW4sdGhpcy5kb21IYW5kbGVyKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZXZFbCYmZyh0aGlzLmVsZW1lbnQsdGhpcy5ldkVsLHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldlRhcmdldCYmZyh0aGlzLnRhcmdldCx0aGlzLmV2VGFyZ2V0LHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldldpbiYmZyhNKHRoaXMuZWxlbWVudCksdGhpcy5ldldpbix0aGlzLmRvbUhhbmRsZXIpfX07dmFyIFl0PXttb3VzZWRvd246RXQsbW91c2Vtb3ZlOlR0LG1vdXNldXA6UHR9LEd0PVwibW91c2Vkb3duXCIsVnQ9XCJtb3VzZW1vdmUgbW91c2V1cFwiO2MoSCxDLHtoYW5kbGVyOmZ1bmN0aW9uKHQpe3ZhciBlPVl0W3QudHlwZV07ZSZFdCYmMD09PXQuYnV0dG9uJiYodGhpcy5wcmVzc2VkPSEwKSxlJlR0JiYxIT09dC53aGljaCYmKGU9UHQpLHRoaXMucHJlc3NlZCYmKGUmUHQmJih0aGlzLnByZXNzZWQ9ITEpLHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGUse3BvaW50ZXJzOlt0XSxjaGFuZ2VkUG9pbnRlcnM6W3RdLHBvaW50ZXJUeXBlOlwibW91c2VcIixzcmNFdmVudDp0fSkpfX0pO3ZhciBVdD17cG9pbnRlcmRvd246RXQscG9pbnRlcm1vdmU6VHQscG9pbnRlcnVwOlB0LHBvaW50ZXJjYW5jZWw6SXQscG9pbnRlcm91dDpJdH0scXQ9ezI6XCJ0b3VjaFwiLDM6XCJwZW5cIiw0OlwibW91c2VcIiw1Olwia2luZWN0XCJ9LFh0PVwicG9pbnRlcmRvd25cIixadD1cInBvaW50ZXJtb3ZlIHBvaW50ZXJ1cCBwb2ludGVyY2FuY2VsXCI7bi5NU1BvaW50ZXJFdmVudCYmIW4uUG9pbnRlckV2ZW50JiYoWHQ9XCJNU1BvaW50ZXJEb3duXCIsWnQ9XCJNU1BvaW50ZXJNb3ZlIE1TUG9pbnRlclVwIE1TUG9pbnRlckNhbmNlbFwiKSxjKFcsQyx7aGFuZGxlcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnN0b3JlLGk9ITEsbz10LnR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKFwibXNcIixcIlwiKSxuPVV0W29dLHM9cXRbdC5wb2ludGVyVHlwZV18fHQucG9pbnRlclR5cGUscj1cInRvdWNoXCI9PXMsYT13KGUsdC5wb2ludGVySWQsXCJwb2ludGVySWRcIik7biZFdCYmKDA9PT10LmJ1dHRvbnx8cik/YTwwJiYoZS5wdXNoKHQpLGE9ZS5sZW5ndGgtMSk6biYoUHR8SXQpJiYoaT0hMCksYTwwfHwoZVthXT10LHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLG4se3BvaW50ZXJzOmUsY2hhbmdlZFBvaW50ZXJzOlt0XSxwb2ludGVyVHlwZTpzLHNyY0V2ZW50OnR9KSxpJiZlLnNwbGljZShhLDEpKX19KTt2YXIgS3Q9e3RvdWNoc3RhcnQ6RXQsdG91Y2htb3ZlOlR0LHRvdWNoZW5kOlB0LHRvdWNoY2FuY2VsOkl0fSxKdD1cInRvdWNoc3RhcnRcIiwkdD1cInRvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsXCI7YyhZLEMse2hhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9S3RbdC50eXBlXTtpZihlPT09RXQmJih0aGlzLnN0YXJ0ZWQ9ITApLH
21167RoaXMuc3RhcnRlZCl7dmFyIGk9Ry5jYWxsKHRoaXMsdCxlKTtlJihQdHxJdCkmJmlbMF0ubGVuZ3RoLWlbMV0ubGVuZ3RoPT0wJiYodGhpcy5zdGFydGVkPSExKSx0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlcixlLHtwb2ludGVyczppWzBdLGNoYW5nZWRQb2ludGVyczppWzFdLHBvaW50ZXJUeXBlOlwidG91Y2hcIixzcmNFdmVudDp0fSl9fX0pO3ZhciBRdD17dG91Y2hzdGFydDpFdCx0b3VjaG1vdmU6VHQsdG91Y2hlbmQ6UHQsdG91Y2hjYW5jZWw6SXR9LHRlPVwidG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWxcIjtjKFYsQyx7aGFuZGxlcjpmdW5jdGlvbih0KXt2YXIgZT1RdFt0LnR5cGVdLGk9VS5jYWxsKHRoaXMsdCxlKTtpJiZ0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlcixlLHtwb2ludGVyczppWzBdLGNoYW5nZWRQb2ludGVyczppWzFdLHBvaW50ZXJUeXBlOlwidG91Y2hcIixzcmNFdmVudDp0fSl9fSk7dmFyIGVlPTI1MDAsaWU9MjU7YyhxLEMse2hhbmRsZXI6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPVwidG91Y2hcIj09aS5wb2ludGVyVHlwZSxuPVwibW91c2VcIj09aS5wb2ludGVyVHlwZTtpZighKG4mJmkuc291cmNlQ2FwYWJpbGl0aWVzJiZpLnNvdXJjZUNhcGFiaWxpdGllcy5maXJlc1RvdWNoRXZlbnRzKSl7aWYobylYLmNhbGwodGhpcyxlLGkpO2Vsc2UgaWYobiYmSy5jYWxsKHRoaXMsaSkpcmV0dXJuO3RoaXMuY2FsbGJhY2sodCxlLGkpfX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMudG91Y2guZGVzdHJveSgpLHRoaXMubW91c2UuZGVzdHJveSgpfX0pO3ZhciBvZT1TKHZ0LnN0eWxlLFwidG91Y2hBY3Rpb25cIiksbmU9b2UhPT1hLHNlPVwiYXV0b1wiLHJlPVwibWFuaXB1bGF0aW9uXCIsYWU9XCJub25lXCIsaGU9XCJwYW4teFwiLGRlPVwicGFuLXlcIixsZT1mdW5jdGlvbigpe2lmKCFuZSlyZXR1cm4hMTt2YXIgdD17fSxlPW4uQ1NTJiZuLkNTUy5zdXBwb3J0cztyZXR1cm5bXCJhdXRvXCIsXCJtYW5pcHVsYXRpb25cIixcInBhbi15XCIsXCJwYW4teFwiLFwicGFuLXggcGFuLXlcIixcIm5vbmVcIl0uZm9yRWFjaChmdW5jdGlvbihpKXt0W2ldPSFlfHxuLkNTUy5zdXBwb3J0cyhcInRvdWNoLWFjdGlvblwiLGkpfSksdH0oKTtKLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKHQpe1wiY29tcHV0ZVwiPT10JiYodD10aGlzLmNvbXB1dGUoKSksbmUmJnRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlJiZsZVt0XSYmKHRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlW29lXT10KSx0aGlzLmFjdGlvbnM9dC50b0xvd2VyQ2FzZSgpLnRyaW0oKX0sdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5zZXQodGhpcy5tYW5hZ2VyLm9wdGlvbnMudG91Y2hBY3Rpb24pfSxjb21wdXRlOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIGwodGhpcy5tYW5hZ2VyLnJlY29nbml6ZXJzLGZ1bmN0aW9uKGUpe2YoZS5vcHRpb25zLmVuYWJsZSxbZV0pJiYodD10LmNvbmNhdChlLmdldFRvdWNoQWN0aW9uKCkpKX0pLCQodC5qb2luKFwiIFwiKSl9LHByZXZlbnREZWZhdWx0czpmdW5jdGlvbih0KXt2YXIgZT10LnNyY0V2ZW50LGk9dC5vZmZzZXREaXJlY3Rpb247aWYodGhpcy5tYW5hZ2VyLnNlc3Npb24ucHJldmVudGVkKXJldHVybiB2b2lkIGUucHJldmVudERlZmF1bHQoKTt2YXIgbz10aGlzLmFjdGlvbnMsbj1iKG8sYWUpJiYhbGVbYWVdLHM9YihvLGRlKSYmIWxlW2RlXSxyPWIobyxoZSkmJiFsZVtoZV07aWYobil7dmFyIGE9MT09PXQucG9pbnRlcnMubGVuZ3RoLGg9dC5kaXN0YW5jZTwyLGQ9dC5kZWx0YVRpbWU8MjUwO2lmKGEmJmgmJmQpcmV0dXJufXJldHVybiByJiZzP3ZvaWQgMDpufHxzJiZpJkZ0fHxyJiZpJkJ0P3RoaXMucHJldmVudFNyYyhlKTp2b2lkIDB9LHByZXZlbnRTcmM6ZnVuY3Rpb24odCl7dGhpcy5tYW5hZ2VyLnNlc3Npb24ucHJldmVudGVkPSEwLHQucHJldmVudERlZmF1bHQoKX19O3ZhciB1ZT0xLGNlPTIscGU9NCxmZT04LG1lPWZlLHZlPTE2O1EucHJvdG90eXBlPXtkZWZhdWx0czp7fSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGZ0KHRoaXMub3B0aW9ucyx0KSx0aGlzLm1hbmFnZXImJnRoaXMubWFuYWdlci50b3VjaEFjdGlvbi51cGRhdGUoKSx0aGlzfSxyZWNvZ25pemVXaXRoOmZ1bmN0aW9uKHQpe2lmKGQodCxcInJlY29nbml6ZVdpdGhcIix0aGlzKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLnNpbXVsdGFuZW91cztyZXR1cm4gdD1pdCh0LHRoaXMpLGVbdC5pZF18fChlW3QuaWRdPXQsdC5yZWNvZ25pemVXaXRoKHRoaXMpKSx0aGlzfSxkcm9wUmVjb2duaXplV2l0aDpmdW5jdGlvbih0KXtyZXR1cm4gZCh0LFwiZHJvcFJlY29nbml6ZVdpdGhcIix0aGlzKT90aGlzOih0PWl0KHQsdGhpcyksZGVsZXRlIHRoaXMuc2ltdWx0YW5lb3VzW3QuaWRdLHRoaXMpfSxyZXF1aXJlRmFpbHVyZTpmdW5jdGlvbih0KXtpZihkKHQsXCJyZXF1aXJlRmFpbHVyZVwiLHRoaXMpKXJldHVybiB0aGlzO3ZhciBlPXRoaXMucmVxdWlyZUZhaWw7cmV0dXJuIHQ9aXQodCx0aGlzKSwtMT09PXcoZSx0KSYmKGUucHVzaCh0KSx0LnJlcXVpcmVGYWlsdXJlKHRoaXMpKSx0aGlzfSxkcm9wUmVxdWlyZUZhaWx1cmU6ZnVuY3Rpb24odCl7aWYoZCh0LFwiZHJvcFJlcXVpcmVGYWlsdXJlXCIsdGhpcykpcmV0dXJuIHRoaXM7dD1pdCh0LHRoaXMpO3ZhciBlPXcodGhpcy5yZXF1aXJlRmFpbCx0KTtyZXR1cm4gZT4tMSYmdGhpcy5yZXF1aXJlRmFpbC5zcGxpY2UoZSwxKSx0aGlzfSxoYXNSZXF1aXJlRmFpbHVyZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXF1aXJlRmFpbC5sZW5ndGg+MH0sY2FuUmVjb2duaXplV2l0aDpmdW5jdGlvbih0KXtyZXR1cm4hIXRoaXMuc2ltdWx0YW5lb3VzW3QuaWRdfSxlbWl0OmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7aS5tYW5hZ2VyLmVtaXQoZSx0KX12YXIgaT10aGlzLG89dGhpcy5zdGF0ZTtvPGZlJiZlKGkub3B0aW9ucy5ldmVudCt0dChvKSksZShpLm9wdGlvbnMuZXZlbnQpLHQuYWRkaXRpb25hbEV2ZW50JiZlKHQuYWRkaXRpb25hbEV2ZW50KSxvPj1mZSYmZShpLm9wdGlvbnMuZXZlbnQrdHQobykpfSx0cnlFbWl0OmZ1bmN0aW9uKHQpe2lmKHRoaXMuY2FuRW1pdCgpKXJldHVybi
21167B0aGlzLmVtaXQodCk7dGhpcy5zdGF0ZT0zMn0sY2FuRW1pdDpmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5yZXF1aXJlRmFpbC5sZW5ndGg7KXtpZighKHRoaXMucmVxdWlyZUZhaWxbdF0uc3RhdGUmKDMyfHVlKSkpcmV0dXJuITE7dCsrfXJldHVybiEwfSxyZWNvZ25pemU6ZnVuY3Rpb24odCl7dmFyIGU9ZnQoe30sdCk7aWYoIWYodGhpcy5vcHRpb25zLmVuYWJsZSxbdGhpcyxlXSkpcmV0dXJuIHRoaXMucmVzZXQoKSx2b2lkKHRoaXMuc3RhdGU9MzIpO3RoaXMuc3RhdGUmKG1lfHZlfDMyKSYmKHRoaXMuc3RhdGU9dWUpLHRoaXMuc3RhdGU9dGhpcy5wcm9jZXNzKGUpLHRoaXMuc3RhdGUmKGNlfHBlfGZlfHZlKSYmdGhpcy50cnlFbWl0KGUpfSxwcm9jZXNzOmZ1bmN0aW9uKHQpe30sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXt9LHJlc2V0OmZ1bmN0aW9uKCl7fX0sYyhvdCxRLHtkZWZhdWx0czp7cG9pbnRlcnM6MX0sYXR0clRlc3Q6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb25zLnBvaW50ZXJzO3JldHVybiAwPT09ZXx8dC5wb2ludGVycy5sZW5ndGg9PT1lfSxwcm9jZXNzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc3RhdGUsaT10LmV2ZW50VHlwZSxvPWUmKGNlfHBlKSxuPXRoaXMuYXR0clRlc3QodCk7cmV0dXJuIG8mJihpJkl0fHwhbik/ZXx2ZTpvfHxuP2kmUHQ/ZXxmZTplJmNlP2V8cGU6Y2U6MzJ9fSksYyhudCxvdCx7ZGVmYXVsdHM6e2V2ZW50OlwicGFuXCIsdGhyZXNob2xkOjEwLHBvaW50ZXJzOjEsZGlyZWN0aW9uOmp0fSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5kaXJlY3Rpb24sZT1bXTtyZXR1cm4gdCZGdCYmZS5wdXNoKGRlKSx0JkJ0JiZlLnB1c2goaGUpLGV9LGRpcmVjdGlvblRlc3Q6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb25zLGk9ITAsbz10LmRpc3RhbmNlLG49dC5kaXJlY3Rpb24scz10LmRlbHRhWCxyPXQuZGVsdGFZO3JldHVybiBuJmUuZGlyZWN0aW9ufHwoZS5kaXJlY3Rpb24mRnQ/KG49MD09PXM/TnQ6czwwP1J0OkF0LGk9cyE9dGhpcy5wWCxvPU1hdGguYWJzKHQuZGVsdGFYKSk6KG49MD09PXI/TnQ6cjwwP3p0Okx0LGk9ciE9dGhpcy5wWSxvPU1hdGguYWJzKHQuZGVsdGFZKSkpLHQuZGlyZWN0aW9uPW4saSYmbz5lLnRocmVzaG9sZCYmbiZlLmRpcmVjdGlvbn0sYXR0clRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG90LnByb3RvdHlwZS5hdHRyVGVzdC5jYWxsKHRoaXMsdCkmJih0aGlzLnN0YXRlJmNlfHwhKHRoaXMuc3RhdGUmY2UpJiZ0aGlzLmRpcmVjdGlvblRlc3QodCkpfSxlbWl0OmZ1bmN0aW9uKHQpe3RoaXMucFg9dC5kZWx0YVgsdGhpcy5wWT10LmRlbHRhWTt2YXIgZT1ldCh0LmRpcmVjdGlvbik7ZSYmKHQuYWRkaXRpb25hbEV2ZW50PXRoaXMub3B0aW9ucy5ldmVudCtlKSx0aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcyx0KX19KSxjKHN0LG90LHtkZWZhdWx0czp7ZXZlbnQ6XCJwaW5jaFwiLHRocmVzaG9sZDowLHBvaW50ZXJzOjJ9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2FlXX0sYXR0clRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcyx0KSYmKE1hdGguYWJzKHQuc2NhbGUtMSk+dGhpcy5vcHRpb25zLnRocmVzaG9sZHx8dGhpcy5zdGF0ZSZjZSl9LGVtaXQ6ZnVuY3Rpb24odCl7aWYoMSE9PXQuc2NhbGUpe3ZhciBlPXQuc2NhbGU8MT9cImluXCI6XCJvdXRcIjt0LmFkZGl0aW9uYWxFdmVudD10aGlzLm9wdGlvbnMuZXZlbnQrZX10aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcyx0KX19KSxjKHJ0LFEse2RlZmF1bHRzOntldmVudDpcInByZXNzXCIscG9pbnRlcnM6MSx0aW1lOjI1MSx0aHJlc2hvbGQ6OX0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm5bc2VdfSxwcm9jZXNzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucyxpPXQucG9pbnRlcnMubGVuZ3RoPT09ZS5wb2ludGVycyxvPXQuZGlzdGFuY2U8ZS50aHJlc2hvbGQsbj10LmRlbHRhVGltZT5lLnRpbWU7aWYodGhpcy5faW5wdXQ9dCwhb3x8IWl8fHQuZXZlbnRUeXBlJihQdHxJdCkmJiFuKXRoaXMucmVzZXQoKTtlbHNlIGlmKHQuZXZlbnRUeXBlJkV0KXRoaXMucmVzZXQoKSx0aGlzLl90
21167aW1lcj1oKGZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT1tZSx0aGlzLnRyeUVtaXQoKX0sZS50aW1lLHRoaXMpO2Vsc2UgaWYodC5ldmVudFR5cGUmUHQpcmV0dXJuIG1lO3JldHVybiAzMn0scmVzZXQ6ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpfSxlbWl0OmZ1bmN0aW9uKHQpe3RoaXMuc3RhdGU9PT1tZSYmKHQmJnQuZXZlbnRUeXBlJlB0P3RoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCtcInVwXCIsdCk6KHRoaXMuX2lucHV0LnRpbWVTdGFtcD1fdCgpLHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCx0aGlzLl9pbnB1dCkpKX19KSxjKGF0LG90LHtkZWZhdWx0czp7ZXZlbnQ6XCJyb3RhdGVcIix0aHJlc2hvbGQ6MCxwb2ludGVyczoyfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVyblthZV19LGF0dHJUZXN0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsdCkmJihNYXRoLmFicyh0LnJvdGF0aW9uKT50aGlzLm9wdGlvbnMudGhyZXNob2xkfHx0aGlzLnN0YXRlJmNlKX19KSxjKGh0LG90LHtkZWZhdWx0czp7ZXZlbnQ6XCJzd2lwZVwiLHRocmVzaG9sZDoxMCx2ZWxvY2l0eTouMyxkaXJlY3Rpb246RnR8QnQscG9pbnRlcnM6MX0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gbnQucHJvdG90eXBlLmdldFRvdWNoQWN0aW9uLmNhbGwodGhpcyl9LGF0dHJUZXN0OmZ1bmN0aW9uKHQpe3ZhciBlLGk9dGhpcy5vcHRpb25zLmRpcmVjdGlvbjtyZXR1cm4gaSYoRnR8QnQpP2U9dC5vdmVyYWxsVmVsb2NpdHk6aSZGdD9lPXQub3ZlcmFsbFZlbG9jaXR5WDppJkJ0JiYoZT10Lm92ZXJhbGxWZWxvY2l0eVkpLHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcyx0KSYmaSZ0Lm9mZnNldERpcmVjdGlvbiYmdC5kaXN0YW5jZT50aGlzLm9wdGlvbnMudGhyZXNob2xkJiZ0Lm1heFBvaW50ZXJzPT10aGlzLm9wdGlvbnMucG9pbnRlcnMmJmJ0KGUpPnRoaXMub3B0aW9ucy52ZWxvY2l0eSYmdC5ldmVudFR5cGUmUHR9LGVtaXQ6ZnVuY3Rpb24odCl7dmFyIGU9ZXQodC5vZmZzZXREaXJlY3Rpb24pO2UmJnRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCtlLHQpLHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCx0KX19KSxjKGR0LFEse2RlZmF1bHRzOntldmVudDpcInRhcFwiLHBvaW50ZXJzOjEsdGFwczoxLGludGVydmFsOjMwMCx0aW1lOjI1MCx0aHJlc2hvbGQ6OSxwb3NUaHJlc2hvbGQ6MTB9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW3JlXX0scHJvY2VzczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMsaT10LnBvaW50ZXJzLmxlbmd0aD09PWUucG9pbnRlcnMsbz10LmRpc3RhbmNlPGUudGhyZXNob2xkLG49dC5kZWx0YVRpbWU8ZS50aW1lO2lmKHRoaXMucmVzZXQoKSx0LmV2ZW50VHlwZSZFdCYmMD09PXRoaXMuY291bnQpcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtpZihvJiZuJiZpKXtp
21167Zih0LmV2ZW50VHlwZSE9UHQpcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTt2YXIgcz0hdGhpcy5wVGltZXx8dC50aW1lU3RhbXAtdGhpcy5wVGltZTxlLmludGVydmFsLHI9IXRoaXMucENlbnRlcnx8TCh0aGlzLnBDZW50ZXIsdC5jZW50ZXIpPGUucG9zVGhyZXNob2xkO3RoaXMucFRpbWU9dC50aW1lU3RhbXAsdGhpcy5wQ2VudGVyPXQuY2VudGVyLHImJnM/dGhpcy5jb3VudCs9MTp0aGlzLmNvdW50PTEsdGhpcy5faW5wdXQ9dDtpZigwPT09dGhpcy5jb3VudCVlLnRhcHMpcmV0dXJuIHRoaXMuaGFzUmVxdWlyZUZhaWx1cmVzKCk/KHRoaXMuX3RpbWVyPWgoZnVuY3Rpb24oKXt0aGlzLnN0YXRlPW1lLHRoaXMudHJ5RW1pdCgpfSxlLmludGVydmFsLHRoaXMpLGNlKTptZX1yZXR1cm4gMzJ9LGZhaWxUaW1lb3V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpbWVyPWgoZnVuY3Rpb24oKXt0aGlzLnN0YXRlPTMyfSx0aGlzLm9wdGlvbnMuaW50ZXJ2YWwsdGhpcyksMzJ9LHJlc2V0OmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKX0sZW1pdDpmdW5jdGlvbigpe3RoaXMuc3RhdGU9PW1lJiYodGhpcy5faW5wdXQudGFwQ291bnQ9dGhpcy5jb3VudCx0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsdGhpcy5faW5wdXQpKX19KSxsdC5WRVJTSU9OPVwiMi4wLjdcIixsdC5kZWZhdWx0cz17ZG9tRXZlbnRzOiExLHRvdWNoQWN0aW9uOlwiY29tcHV0ZVwiLGVuYWJsZTohMCxpbnB1dFRhcmdldDpudWxsLGlucHV0Q2xhc3M6bnVsbCxwcmVzZXQ6W1thdCx7ZW5hYmxlOiExfV0sW3N0LHtlbmFibGU6ITF9LFtcInJvdGF0ZVwiXV0sW2h0LHtkaXJlY3Rpb246RnR9XSxbbnQse2RpcmVjdGlvbjpGdH0sW1wic3dpcGVcIl1dLFtkdF0sW2R0LHtldmVudDpcImRvdWJsZXRhcFwiLHRhcHM6Mn0sW1widGFwXCJdXSxbcnRdXSxjc3NQcm9wczp7dXNlclNlbGVjdDpcIm5vbmVcIix0b3VjaFNlbGVjdDpcIm5vbmVcIix0b3VjaENhbGxvdXQ6XCJub25lXCIsY29udGVudFpvb21pbmc6XCJub25lXCIsdXNlckRyYWc6XCJub25lXCIsdGFwSGlnaGxpZ2h0Q29sb3I6XCJyZ2JhKDAsMCwwLDApXCJ9fTt1dC5wcm90b3R5cGU9e3NldDpmdW5jdGlvbih0KXtyZXR1cm4gZnQodGhpcy5vcHRpb25zLHQpLHQudG91Y2hBY3Rpb24mJnRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCksdC5pbnB1dFRhcmdldCYmKHRoaXMuaW5wdXQuZGVzdHJveSgpLHRoaXMuaW5wdXQudGFyZ2V0PXQuaW5wdXRUYXJnZXQsdGhpcy5pbnB1dC5pbml0KCkpLHRoaXN9LHN0b3A6ZnVuY3Rpb24odCl7dGhpcy5zZXNzaW9uLnN0b3BwZWQ9dD8yOjF9LHJlY29nbml6ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnNlc3Npb247aWYoIWUuc3RvcHBlZCl7dGhpcy50b3VjaEFjdGlvbi5wcmV2ZW50RGVmYXVsdHModCk7dmFyIGksbz10aGlzLnJlY29nbml6ZXJzLG49ZS5jdXJSZWNvZ25pemVyOyghbnx8biYmbi5zdGF0ZSZtZSkmJihuPWUuY3VyUmVjb2duaXplcj1udWxsKTtmb3IodmFyIHM9MDtzPG8ubGVuZ3RoOylpPW9bc10sMj09PWUuc3RvcHBlZHx8biYmaSE9biYmIWkuY2FuUmVjb2duaXplV2l0aChuKT9pLnJlc2V0KCk6aS5yZWNvZ25pemUodCksIW4mJmkuc3RhdGUmKGNlfHBlfGZlKSYmKG49ZS5jdXJSZWNvZ25pemVyPWkpLHMrK319LGdldDpmdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgUSlyZXR1cm4gdDtmb3IodmFyIGU9dGhpcy5yZWNvZ25pemVycyxpPTA7aTxlLmxlbmd0aDtpKyspaWYoZVtpXS5vcHRpb25zLmV2ZW50PT10KXJldHVybiBlW2ldO3JldHVybiBudWxsfSxhZGQ6ZnVuY3Rpb24odCl7aWYoZCh0LFwiYWRkXCIsdGhpcykpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5nZXQodC5vcHRpb25zLmV2ZW50KTtyZXR1cm4gZSYmdGhpcy5yZW1vdmUoZSksdGhpcy5yZWNvZ25pemVycy5wdXNoKHQpLHQubWFuYWdlcj10aGlzLHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCksdH0scmVtb3ZlOmZ1bmN0aW9uKHQpe2lmKGQodCxcInJlbW92ZVwiLHRoaXMpKXJldHVybiB0aGlzO2lmKHQ9dGhpcy5nZXQodCkpe3ZhciBlPXRoaXMucmVjb2duaXplcnMsaT13KGUsdCk7LTEhPT1pJiYoZS5zcGxpY2UoaSwxKSx0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpKX1yZXR1cm4gdGhpc30sb246ZnVuY3Rpb24odCxlKXtpZih0IT09YSYmZSE9PWEpe3ZhciBpPXRoaXMuaGFuZGxlcnM7cmV0dXJuIGwoXyh0KSxmdW5jdGlvbih0KXtpW3RdPWlbdF18fFtdLGlbdF0ucHVzaChlKX0pLHRoaXN9fSxvZmY6ZnVuY3Rpb24odCxlKXtpZih0IT09YSl7dmFyIGk9dGhpcy5oYW5kbGVycztyZXR1cm4gbChfKHQpLGZ1bmN0aW9uKHQpe2U/aVt0XSYmaVt0XS5zcGxpY2UodyhpW3RdLGUpLDEpOmRlbGV0ZSBpW3RdfSksdGhpc319LGVtaXQ6ZnVuY3Rpb24odCxlKXt0aGlzLm9wdGlvbnMuZG9tRXZlbnRzJiZwdCh0LGUpO3ZhciBpPXRoaXMuaGFuZGxlcnNbdF0mJnRoaXMuaGFuZGxlcnNbdF0uc2xpY2UoKTtpZihpJiZpLmxlbmd0aCl7ZS50eXBlPXQsZS5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpe2Uuc3JjRXZlbnQucHJldmVudERlZmF1bHQoKX07Zm9yKHZhciBvPTA7bzxpLmxlbmd0aDspaVtvXShlKSxvKyt9fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50JiZjdCh0aGlzLCExKSx0aGlzLmhhbmRsZXJzPXt9LHRoaXMuc2Vzc2lvbj17fSx0aGlzLmlucHV0LmRlc3Ryb3koKSx0aGlzLmVsZW1lbnQ9bnVsbH19LGZ0KGx0LHtJTlBVVF9TVEFSVDpFdCxJTlBVVF9NT1ZFOlR0LElOUFVUX0VORDpQdCxJTlBVVF9DQU5DRUw6SXQsU1RBVEVfUE9TU0lCTEU6dWUsU1RBVEVfQkVHQU46Y2UsU1RBVEVfQ0hBTkdFRDpwZSxTVEFURV9FTkRFRDpmZSxTVEFURV9SRUNPR05JWkVEOm1lLFNUQVRFX0NBTkNFTExFRDp2ZSxTVEFURV9GQUlMRUQ6MzIsRElSRUNUSU9OX05PTkU6TnQsRElSRUNUSU9OX0xFRlQ6UnQsRElSRUNUSU9OX1JJR0hUOkF0LERJUkVDVElPTl9VUDp6dCxESVJFQ1RJT05fRE9XTjpMdCxESVJFQ1RJT05fSE9SSVpPTlRBTDpGdCxESVJFQ1RJT05fVkVSVElDQUw6QnQsRElSRUNUSU9OX0FMTDpqdCxNYW5hZ2VyOnV0LElucHV0OkMsVG91Y2hBY3Rpb246SixUb3VjaElucHV0OlYsTW91c2VJbnB1dDpILFBvaW50ZXJFdmVudElucHV0OlcsVG91Y2hNb3VzZUlucHV0OnEsU2luZ2xlVG9
211671Y2hJbnB1dDpZLFJlY29nbml6ZXI6USxBdHRyUmVjb2duaXplcjpvdCxUYXA6ZHQsUGFuOm50LFN3aXBlOmh0LFBpbmNoOnN0LFJvdGF0ZTphdCxQcmVzczpydCxvbjp2LG9mZjpnLGVhY2g6bCxtZXJnZTp4dCxleHRlbmQ6d3QsYXNzaWduOmZ0LGluaGVyaXQ6YyxiaW5kRm46cCxwcmVmaXhlZDpTfSksKHZvaWQgMCE9PW4/bjpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOnt9KS5IYW1tZXI9bHQsKG89ZnVuY3Rpb24oKXtyZXR1cm4gbHR9LmNhbGwoZSxpLGUsdCkpIT09YSYmKHQuZXhwb3J0cz1vKX0od2luZG93LGRvY3VtZW50KX0sZnVuY3Rpb24odCxlLGkpe2UudXRpbD1pKDIpLGUuRE9NdXRpbD1pKDE0KSxlLkRhdGFTZXQ9aSgxMSksZS5EYXRhVmlldz1pKDEyKSxlLlF1ZXVlPWkoNDMpLGUuVGltZWxpbmU9aSgxNzgpLGUuR3JhcGgyZD1pKDE4MCksZS50aW1lbGluZT17Q29yZTppKDY1KSxEYXRlVXRpbDppKDM2KSxSYW5nZTppKDY0KSxzdGFjazppKDEwMCksVGltZVN0ZXA6aSg2NiksY29tcG9uZW50czp7aXRlbXM6e0l0ZW06aSgzOCksQmFja2dyb3VuZEl0ZW06aSgxMDMpLEJveEl0ZW06aSgxMDEpLFBvaW50SXRlbTppKDEwMiksUmFuZ2VJdGVtOmkoNzApfSxCYWNrZ3JvdW5kR3JvdXA6aSg2OSksQ29tcG9uZW50OmkoMTYpLEN1cnJlbnRUaW1lOmkoNjcpLEN1c3RvbVRpbWU6aSg0NiksRGF0YUF4aXM6aSgxMDcpLERhdGFTY2FsZTppKDEwOCksR3JhcGhHcm91cDppKDEwOSksR3JvdXA6aSg2OCksSXRlbVNldDppKDk5KSxMZWdlbmQ6aSgxMTIpLExpbmVHcmFwaDppKDEwNiksVGltZUF4aXM6aSg0NSl9fSxlLm1vbWVudD1pKDkpLGUuSGFtbWVyPWkoMTApLGUua2V5Y2hhcm09aSgzNSl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpLG4pe2lmKCEodGhpcyBpbnN0YW5jZW9mIG8pKXRocm93IG5ldyBTeW50YXhFcnJvcihcIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvclwiKTtpZighKEFycmF5LmlzQXJyYXkoaSl8fGkgaW5zdGFuY2VvZiBkfHxpIGluc3RhbmNlb2YgbCkmJmkgaW5zdGFuY2VvZiBPYmplY3Qpe3ZhciBzPW47bj1pLGk9c31uJiZuLnRocm90dGxlUmVkcmF3JiZjb25zb2xlLndhcm4oJ1RpbWVsaW5lIG9wdGlvbiBcInRocm90dGxlUmVkcmF3XCIgaXMgREVQUklDQVRFRCBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IE1BSk9SIHJlbGVhc2UuJyk7dmFyIHI9dGhpcztpZih0aGlzLmRlZmF1bHRPcHRpb25zPXtzdGFydDpudWxsLGVuZDpudWxsLGF1dG9SZXNpemU6ITAsb3JpZW50YXRpb246e2F4aXM6XCJib3R0b21cIixpdGVtOlwiYm90dG9tXCJ9LG1vbWVudDphLHdpZHRoOm51bGwsaGVpZ2h0Om51bGwsbWF4SGVpZ2h0Om51bGwsbWluSGVpZ2h0Om51bGx9LHRoaXMub3B0aW9ucz1oLmRlZXBFeHRlbmQoe30sdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5fY3JlYXRlKHQpLCFufHxuJiZ2b2lkIDA9PT1uLnJ0bCl7dGhpcy5kb20ucm9vdC5zdHlsZS52aXNpYmlsaXR5PVwiaGlkZGVuXCI7Zm9yKHZhciBjLG09dGhpcy5kb20ucm9vdDshYyYmbTspYz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShtLG51bGwpLmRpcmVjdGlvbixtPW0ucGFyZW50RWxlbWVudDt0aGlzLm9wdGlvbnMucnRsPWMmJlwicnRsXCI9PWMudG9Mb3dlckNhc2UoKX1lbHNlIHRoaXMub3B0aW9ucy5ydGw9bi5ydGw7dGhpcy5vcHRpb25zLnJvbGxpbmdNb2RlPW4mJm4ucm9sbGluZ01vZGUsdGhpcy5vcHRpb25zLm9uSW5pdGlhbERyYXdDb21wbGV0ZT1uJiZuLm9uSW5pdGlhbERyYXdDb21wbGV0ZSx0aGlzLmNvbXBvbmVudHM9W10sdGhpcy5ib2R5PXtkb206dGhpcy5kb20sZG9tUHJvcHM6dGhpcy5wcm9wcyxlbWl0dGVyOntvbjp0aGlzLm9uLmJpbmQodGhpcyksb2ZmOnRoaXMub2ZmLmJpbmQodGhpcyksZW1pdDp0aGlzLmVtaXQuYmluZCh0aGlzKX0saGlkZGVuRGF0ZXM6W10sdXRpbDp7Z2V0U2NhbGU6ZnVuY3Rpb24oKXtyZXR1cm4gci50aW1lQXhpcy5zdGVwLnNjYWxlfSxnZXRTdGVwOmZ1bmN0aW9uKCl7cmV0dXJuIHIudGltZUF4aXMuc3RlcC5zdGVwfSx0b1NjcmVlbjpyLl90b1NjcmVlbi5iaW5kKHIpLHRvR2xvYmFsU2NyZWVuOnIuX3RvR2xvYmFsU2NyZWVuLmJpbmQociksdG9UaW1lOnIuX3RvVGltZS5iaW5kKHIpLHRvR2xvYmFsVGltZTpyLl90b0dsb2JhbFRpbWUuYmluZChyKX19LHRoaXMucmFuZ2U9bmV3IHUodGhpcy5ib2R5LHRoaXMub3B0aW9ucyksdGhpcy5jb21wb25lbnRzLnB1c2godGhpcy5yYW5nZSksdGhpcy5ib2R5LnJhbmdlPXRoaXMucmFuZ2UsdGhpcy50aW1lQXhpcz1uZXcgcCh0aGlzLmJvZHksdGhpcy5vcHRpb25zKSx0aGlzLnRpbWVBeGlzMj1udWxsLHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMudGltZUF4aXMpLHRoaXMuY3VycmVudFRpbWU9bmV3IGYodGhpcy5ib2R5LHRoaXMub3B0aW9ucyksdGhpcy5jb21wb25lbnRzLnB1c2godGhpcy5jdXJyZW50VGltZSksdGhpcy5pdGVtU2V0PW5ldyB2KHRoaXMuYm9keSx0aGlzLm9wdGlvbnMpLHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMuaXRlbVNldCksdGhpcy5pdGVtc0RhdGE9bnVsbCx0aGlzLmdyb3Vwc0RhdGE9bnVsbCx0aGlzLmRvbS5yb290Lm9uY2xpY2s9ZnVuY3Rpb24odCl7ci5lbWl0KFwiY2xpY2tcIixyLmdldEV2ZW50UHJvcGVydGllcyh0KSl9LHRoaXMuZG9tLnJvb3Qub25kYmxjbGljaz1mdW5jdGlvbih0KXtyLmVtaXQoXCJkb3VibGVDbGlja1wiLHIuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sdGhpcy5kb20ucm9vdC5vbmNvbnRleHRtZW51PWZ1bmN0aW9uKHQpe3IuZW1pdChcImNvbnRleHRtZW51XCIsci5nZXRFdmVudFByb3BlcnRpZXModCkpfSx0aGlzLmRvbS5yb290Lm9ubW91c2VvdmVyPWZ1bmN0aW9uKHQpe3IuZW1pdChcIm1vdXNlT3ZlclwiLHIuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sd2luZG93LlBvaW50ZXJFdmVudD8odGhpcy5kb20ucm9vdC5vbnBvaW50ZXJkb3duPWZ1bmN0aW9uKHQpe3IuZW1pdChcIm1vdXNlRG93blwiLHIuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sdGhpcy5kb20ucm9vdC5vbnBvaW50ZXJtb3ZlPWZ1bmN0aW9uKHQpe3IuZW1pdChcIm1vdXNlTW92ZVwiLHIuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sdGhpcy5kb20ucm9vdC5vbnBvaW50ZXJ1cD1mdW5jdGlvbih0KXtyLmVtaXQoXCJtb3VzZVVwXCIsci5nZXRFdmVudFByb3BlcnRpZXModCkpfSk6KHRoaXMuZG9tLnJvb3Qub25tb3VzZW1vdmU9ZnVuY3Rpb24odCl7ci5lbWl0KFwibW91c2VNb3ZlXCIsci5nZXRFdmVudFByb3BlcnRpZXModCkpfSx0aGlzLmRvbS5yb290Lm9ubW91c2Vkb3duPWZ1bmN0aW9uKHQpe3IuZW1pdChcIm1vdXNlRG93blwiLHIuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sdGhpcy5kb20ucm9vdC5vbm1vdXNldXA9ZnVuY3Rpb24odCl7ci5lbWl0KFwibW91c2VVcFwiLHIuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0pLHRoaXMuaW5pdGlhbEZpdERvbmU9ITEsdGhpcy5vbihcImNoYW5nZWRcIixmdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuaXRlbXNEYXRhJiYhdGhpcy5vcHRpb25zLnJvbGxpbmdNb2RlKXtpZighci5pbml0aWFsRml0RG9uZSlpZihyLmluaXRpYWxGaXREb25lPSEwLHZvaWQgMCE9ci5vcHRpb25zLnN0YXJ0fHx2b2lkIDAhPXIub3B0aW9ucy5lbmQpe2lmKHZvaWQgMD09ci5vcHRpb25zLnN0YXJ0fHx2b2lkIDA9PXIub3B0aW9ucy5lbmQpdmFyIHQ9ci5nZXRJdGVtUmFuZ2UoKTt2YXIgZT12b2lkIDAhPXIub3B0aW9ucy5zdGFydD9yLm9wdGlvbnMuc3RhcnQ6dC5taW4saT12b2lkIDAhPXIub3B0aW9ucy5lbmQ/ci5vcHRpb25zLmVuZDp0Lm1heDtyLnNldFdpbmRvdyhlLGkse2FuaW1hdGlvbjohMX0pfWVsc2Ug
21167ci5maXQoe2FuaW1hdGlvbjohMX0pOyFyLmluaXRpYWxEcmF3RG9uZSYmci5pbml0aWFsUmFuZ2VDaGFuZ2VEb25lJiYoci5pbml0aWFsRHJhd0RvbmU9ITAsci5kb20ucm9vdC5zdHlsZS52aXNpYmlsaXR5PVwidmlzaWJsZVwiLHIub3B0aW9ucy5vbkluaXRpYWxEcmF3Q29tcGxldGUmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gci5vcHRpb25zLm9uSW5pdGlhbERyYXdDb21wbGV0ZSgpfSwwKSl9fSksbiYmdGhpcy5zZXRPcHRpb25zKG4pLGkmJnRoaXMuc2V0R3JvdXBzKGkpLGUmJnRoaXMuc2V0SXRlbXMoZSksdGhpcy5fcmVkcmF3KCl9ZnVuY3Rpb24gbih0KXtyZXR1cm4gaC5jb252ZXJ0KHQuZGF0YS5zdGFydCxcIkRhdGVcIikudmFsdWVPZigpfWZ1bmN0aW9uIHModCl7dmFyIGU9dm9pZCAwIT10LmRhdGEuZW5kP3QuZGF0YS5lbmQ6dC5kYXRhLnN0YXJ0O3JldHVybiBoLmNvbnZlcnQoZSxcIkRhdGVcIikudmFsdWVPZigpfWZ1bmN0aW9uIHIodCxlKXt2YXIgaT10LnByb3BzLmxlZnRDb250YWluZXIuaGVpZ2h0LG89dC5wcm9wcy5sZWZ0LmhlaWdodCxuPWUucGFyZW50LHM9bi50b3Ascj0hMCxhPXQudGltZUF4aXMub3B0aW9ucy5vcmllbnRhdGlvbi5heGlzLGg9ZnVuY3Rpb24oKXtyZXR1cm5cImJvdHRvbVwiPT1hP24uaGVpZ2h0LWUudG9wLWUuaGVpZ2h0OmUudG9wfSxkPS0xKnQuX2dldFNjcm9sbFRvcCgpLGw9cytoKCksdT1lLmhlaWdodDtyZXR1cm4gbDxkP3MraTw9cytoKCkrdSYmKHMrPWgoKS10Lml0ZW1TZXQub3B0aW9ucy5tYXJnaW4uaXRlbS52ZXJ0aWNhbCk6bCt1PmQraT9zKz1oKCkrdS1pK3QuaXRlbVNldC5vcHRpb25zLm1hcmdpbi5pdGVtLnZlcnRpY2FsOnI9ITEscz1NYXRoLm1pbihzLG8taSkse3Nob3VsZFNjcm9sbDpyLHNjcm9sbE9mZnNldDpzLGl0ZW1Ub3A6bH19dmFyIGE9aSg5KSxoPWkoMiksZD1pKDExKSxsPWkoMTIpLHU9aSg2NCksYz1pKDY1KSxwPWkoNDUpLGY9aSg2NyksbT1pKDQ2KSx2PWkoOTkpLGc9aSgxNSkucHJpbnRTdHlsZSx5PWkoMTA1KS5hbGxPcHRpb25zLGI9aSgxMDUpLmNvbmZpZ3VyZU9wdGlvbnMsXz1pKDcxKS5kZWZhdWx0LHc9aSgxNSkuZGVmYXVsdDtvLnByb3RvdHlwZT1uZXcgYyxvLnByb3RvdHlwZS5fY3JlYXRlQ29uZmlndXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBfKHRoaXMsdGhpcy5kb20uY29udGFpbmVyLGIpfSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXt0aGlzLml0ZW1TZXQmJnRoaXMuaXRlbVNldC5tYXJrRGlydHkoe3JlZnJlc2hJdGVtczohMH0pLHRoaXMuX3JlZHJhdygpfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKCEwPT09dy52YWxpZGF0ZSh0LHkpJiZjb25zb2xlLmxvZyhcIiVjRXJyb3JzIGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUgc3VwcGxpZWQgb3B0aW9ucyBvYmplY3QuXCIsZyksYy5wcm90b3R5cGUuc2V0T3B0aW9ucy5jYWxsKHRoaXMsdCksXCJ0eXBlXCJpbiB0JiZ0LnR5cGUhPT10aGlzLm9wdGlvbnMudHlwZSl7dGhpcy5vcHRpb25zLnR5cGU9dC50eXBlO3ZhciBlPXRoaXMuaXRlbXNEYXRhO2lmKGUpe3ZhciBpPXRoaXMuZ2V0U2VsZWN0aW9uKCk7dGhpcy5zZXRJdGVtcyhudWxsKSx0aGlzLnNldEl0ZW1zKGUpLHRoaXMuc2V0U2VsZWN0aW9uKGkpfX19LG8ucHJvdG90eXBlLnNldEl0ZW1zPWZ1bmN0aW9uKHQpe3ZhciBlO2U9dD90IGluc3RhbmNlb2YgZHx8dCBpbnN0YW5jZW9mIGw/dDpuZXcgZCh0LHt0eXBlOntzdGFydDpcIkRhdGVcIixlbmQ6XCJEYXRlXCJ9fSk6bnVsbCx0aGlzLml0ZW1zRGF0YT1lLHRoaXMuaXRlbVNldCYmdGhpcy5pdGVtU2V0LnNldEl0ZW1zKGUpfSxvLnByb3RvdHlwZS5zZXRHcm91cHM9ZnVuY3Rpb24odCl7dmFyIGU7aWYodCl7dmFyIGk9ZnVuY3Rpb24odCl7cmV0dXJuITEhPT10LnZpc2libGV9O2U9dCBpbnN0YW5jZW9mIGR8fHQgaW5zdGFuY2VvZiBsP25ldyBsKHQse2ZpbHRlcjppfSk6bmV3IGQodC5maWx0ZXIoaSkpfWVsc2UgZT1udWxsO3RoaXMuZ3JvdXBzRGF0YT1lLHRoaXMuaXRlbVNldC5zZXRHcm91cHMoZSl9LG8ucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7dCYmdC5ncm91cHMmJnRoaXMuc2V0R3JvdXBzKHQuZ3JvdXBzKSx0JiZ0Lml0ZW1zJiZ0aGlzLnNldEl0ZW1zKHQuaXRlbXMpfSxvLnByb3RvdHlwZS5zZXRTZWxlY3Rpb249ZnVuY3Rpb24odCxlKXt0aGlzLml0ZW1TZXQmJnRoaXMuaXRlbVNldC5zZXRTZWxlY3Rpb24odCksZSYmZS5mb2N1cyYmdGhpcy5mb2N1cyh0LGUpfSxvLnByb3RvdHlwZS5nZXRTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVtU2V0JiZ0aGlzLml0ZW1TZXQuZ2V0U2VsZWN0aW9uKCl8fFtdfSxvLnByb3RvdHlwZS5mb2N1cz1mdW5jdGlvbih0LGUpe2lmKHRoaXMuaXRlbXNEYXRhJiZ2b2lkIDAhPXQpe3ZhciBpPUFycmF5LmlzQXJyYXkodCk/dDpbdF0sbz10aGlzLml0ZW1zRGF0YS5nZXREYXRhU2V0KCkuZ2V0KGkse3R5cGU6e3N0YXJ0OlwiRGF0ZVwiLGVuZDpcIkRhdGVcIn19KSxuPW51bGwscz1udWxsO2lmKG8uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT10LnN0YXJ0LnZhbHVlT2YoKSxpPVwiZW5kXCJpbiB0P3QuZW5kLnZhbHVlT2YoKTp0LnN0YXJ0LnZhbHVlT2YoKTsobnVsbD09PW58fGU8bikmJihuPWUpLChudWxsPT09c3x8aT5zKSYmKHM9aSl9KSxudWxsIT09biYmbnVsbCE9PXMpe3ZhciBhPXRoaXMsaD10aGlzLml0ZW1TZXQuaXRlbXNbaVswXV0sZD0tMSp0aGlzLl9nZXRTY3JvbGxUb3AoKSxsPW51bGwsdT1mdW5jdGlvbih0LGUsaSl7dmFyIG89cihhLGgpO2lmKGx8fChsPW8pLGwuaXRlbVRvcCE9by5pdGVtVG9wfHxsLnNob3VsZFNjcm9sbCl7bC5pdGVtVG9wIT1vLml0ZW1Ub3AmJm8uc2hvdWxkU2Nyb2xsJiYobD1vLGQ9LTEqYS5fZ2V0U2Nyb2xsVG9wKCkpO3ZhciBuPWQscz1sLnNjcm9sbE9mZnNldCx1PWk/czpuKyhzLW4pKnQ7YS5fc2V0U2Nyb2xsVG9wKC11KSxlfHxhLl9yZWRyYXcoKX19LGM9ZnVuY3Rpb24oKXt2YXIgdD1yKGEsaCk7dC5zaG91bGRTY3JvbGwmJnQuaXRlbVRvcCE9bC5pdGVtVG9wJiYoYS5fc2V0U2Nyb2xsVG9wKC10LnNjcm9sbE9mZnNldCksYS5fcmVkcmF3KCkpfSxwPWZ1bmN0aW9uKCl7YygpLHNldFRpbWVvdXQoYywxMDApfSxmPShuK3MpLzIsbT1NYXRoLm1heCh0aGlzLnJhbmdlLmVuZC10aGlzLnJhbmdlLnN0YXJ0LDEuMSoocy1uKSksdj0hZXx8dm9pZCAwPT09ZS5hbmltYXRpb258fGUuYW5pbWF0aW9uO3Z8fChsPXtzaG91bGRTY3JvbGw6ITEsc2Nyb2xsT2Zmc2V0Oi0xLGl0ZW1Ub3A6LTF9KSx0aGlzLnJhbmdlLnNldFJhbmdlKGYtbS8yLGYrbS8yLHthbmltYXRpb246dn0scCx1KX19fSxvLnByb3RvdHlwZS5maXQ9ZnVuY3Rpb24odCxlKXt2YXIgaSxvPSF0fHx2b2lkIDA9PT10LmFuaW1hdGlvbnx8dC5hbmltYXRpb24sbj10aGlzLml0ZW1zRGF0YSYmdGhpcy5pdGVtc0RhdGEuZ2V0RGF0YVNldCgpOzE9PT1uLmxlbmd0aCYmdm9pZCAwPT09bi5nZXQoKVswXS5lbmQ/KGk9dGhpcy5nZXREYXRhUmFuZ2UoKSx0aGlzLm1vdmVUbyhpLm1pbi52YWx1ZU9mKCkse2FuaW1hdGlvbjpvfSxlKSk6KGk9dGhpcy5nZXRJdGVtUmFuZ2UoKSx0aGlzLnJhbmdlLnNldFJhbmdlKGkubWluLGkubWF4LHthbmltYXRpb246b30sZSkpfSxvLnByb3RvdHlwZS5nZXRJdGVtUmFuZ2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldERhdGFSYW5nZSgpLGU9bnVsbCE9PXQubWluP3QubWluLnZhbHVlT2YoKTpudWxsLGk9bnVsbCE9PXQubWF4P3QubWF4LnZhbHVlT2YoKTpudWxsLG89bnVsbCxyPW51bGw7aWYobnVsbCE9ZSYmbnVsbCE9aSl7dmFyIGE9aS1lO2E8PTAmJihhPTEwKTt2YXIgZD1hL3RoaXMucHJvcHMuY2VudGVyLndpZHR
21167oLGw9e30sdT0wO2guZm9yRWFjaCh0aGlzLml0ZW1TZXQuaXRlbXMsZnVuY3Rpb24odCxlKXtpZih0Lmdyb3VwU2hvd2luZyl7bFtlXT10LnJlZHJhdyghMCksdT1sW2VdLmxlbmd0aH19KTtpZih1PjApZm9yKHZhciBjPTA7Yzx1O2MrKyloLmZvckVhY2gobCxmdW5jdGlvbih0KXt0W2NdKCl9KTtpZihoLmZvckVhY2godGhpcy5pdGVtU2V0Lml0ZW1zLGZ1bmN0aW9uKHQpe3ZhciBhLGgsbD1uKHQpLHU9cyh0KTt0aGlzLm9wdGlvbnMucnRsPyhhPWwtKHQuZ2V0V2lkdGhSaWdodCgpKzEwKSpkLGg9dSsodC5nZXRXaWR0aExlZnQoKSsxMCkqZCk6KGE9bC0odC5nZXRXaWR0aExlZnQoKSsxMCkqZCxoPXUrKHQuZ2V0V2lkdGhSaWdodCgpKzEwKSpkKSxhPGUmJihlPWEsbz10KSxoPmkmJihpPWgscj10KX0uYmluZCh0aGlzKSksbyYmcil7dmFyIHA9by5nZXRXaWR0aExlZnQoKSsxMCxmPXIuZ2V0V2lkdGhSaWdodCgpKzEwLG09dGhpcy5wcm9wcy5jZW50ZXIud2lkdGgtcC1mO20+MCYmKHRoaXMub3B0aW9ucy5ydGw/KGU9bihvKS1mKmEvbSxpPXMocikrcCphL20pOihlPW4obyktcCphL20saT1zKHIpK2YqYS9tKSl9fXJldHVybnttaW46bnVsbCE9ZT9uZXcgRGF0ZShlKTpudWxsLG1heDpudWxsIT1pP25ldyBEYXRlKGkpOm51bGx9fSxvLnByb3RvdHlwZS5nZXREYXRhUmFuZ2U9ZnVuY3Rpb24oKXt2YXIgdD1udWxsLGU9bnVsbCxpPXRoaXMuaXRlbXNEYXRhJiZ0aGlzLml0ZW1zRGF0YS5nZXREYXRhU2V0KCk7cmV0dXJuIGkmJmkuZm9yRWFjaChmdW5jdGlvbihpKXt2YXIgbz1oLmNvbnZlcnQoaS5zdGFydCxcIkRhdGVcIikudmFsdWVPZigpLG49aC5jb252ZXJ0KHZvaWQgMCE9aS5lbmQ/aS5lbmQ6aS5zdGFydCxcIkRhdGVcIikudmFsdWVPZigpOyhudWxsPT09dHx8bzx0KSYmKHQ9byksKG51bGw9PT1lfHxuPmUpJiYoZT1uKX0pLHttaW46bnVsbCE9dD9uZXcgRGF0ZSh0KTpudWxsLG1heDpudWxsIT1lP25ldyBEYXRlKGUpOm51bGx9fSxvLnByb3RvdHlwZS5nZXRFdmVudFByb3BlcnRpZXM9ZnVuY3Rpb24odCl7dmFyIGUsaT10LmNlbnRlcj90LmNlbnRlci54OnQuY2xpZW50WCxvPXQuY2VudGVyP3QuY2VudGVyLnk6dC5jbGllbnRZO2U9dGhpcy5vcHRpb25zLnJ0bD9oLmdldEFic29sdXRlUmlnaHQodGhpcy5kb20uY2VudGVyQ29udGFpbmVyKS1pOmktaC5nZXRBYnNvbHV0ZUxlZnQodGhpcy5kb20uY2VudGVyQ29udGFpbmVyKTt2YXIgbj1vLWguZ2V0QWJzb2x1dGVUb3AodGhpcy5kb20uY2VudGVyQ29udGFpbmVyKSxzPXRoaXMuaXRlbVNldC5pdGVtRnJvbVRhcmdldCh0KSxyPXRoaXMuaXRlbVNldC5ncm91cEZyb21UYXJnZXQodCksYT1tLmN1c3RvbVRpbWVGcm9tVGFyZ2V0KHQpLGQ9dGhpcy5pdGVtU2V0Lm9wdGlvbnMuc25hcHx8bnVsbCxsPXRoaXMuYm9keS51dGlsLmdldFNjYWxlKCksdT10aGlzLmJvZHkudXRpbC5nZXRTdGVwKCksYz10aGlzLl90b1RpbWUoZSkscD1kP2QoYyxsLHUpOmMsZj1oLmdldFRhcmdldCh0KSx2PW51bGw7cmV0dXJuIG51bGwhPXM/dj1cIml0ZW1cIjpudWxsIT1hP3Y9XCJjdXN0b20tdGltZVwiOmguaGFzUGFyZW50KGYsdGhpcy50aW1lQXhpcy5kb20uZm9yZWdyb3VuZCk/dj1cImF4aXNcIjp0aGlzLnRpbWVBeGlzMiYmaC5oYXNQYXJlbnQoZix0aGlzLnRpbWVBeGlzMi5kb20uZm9yZWdyb3VuZCk/dj1cImF4aXNcIjpoLmhhc1BhcmVudChmLHRoaXMuaXRlbVNldC5kb20ubGFiZWxTZXQpP3Y9XCJncm91cC1sYWJlbFwiOmguaGFzUGFyZW50KGYsdGhpcy5jdXJyZW50VGltZS5iYXIpP3Y9XCJjdXJyZW50LXRpbWVcIjpoLmhhc1BhcmVudChmLHRoaXMuZG9tLmNlbnRlcikmJih2PVwiYmFja2dyb3VuZFwiKSx7ZXZlbnQ6dCxpdGVtOnM/cy5pZDpudWxsLGdyb3VwOnI/ci5ncm91cElkOm51bGwsd2hhdDp2LHBhZ2VYOnQuc3JjRXZlbnQ/dC5zcmNFdmVudC5wYWdlWDp0LnBhZ2VYLHBhZ2VZOnQuc3JjRXZlbnQ/dC5zcmNFdmVudC5wYWdlWTp0LnBhZ2VZLHg6ZSx5Om4sdGltZTpjLHNuYXBwZWRUaW1lOnB9fSxvLnByb3RvdHlwZS50b2dnbGVSb2xsaW5nTW9kZT1mdW5jdGlvbigpe3RoaXMucmFuZ2Uucm9sbGluZz90aGlzLnJhbmdlLnN0b3BSb2xsaW5nKCk6KHZvaWQgMD09dGhpcy5vcHRpb25zLnJvbGxpbmdNb2RlJiZ0aGlzLnNldE9wdGlvbnModGhpcy5vcHRpb25zKSx0aGlzLnJhbmdlLnN0YXJ0Um9sbGluZygpKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDE5KSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSgxMCksdT1pKDM3KSxjPWkoMikscD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MTsoMCxhLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5waXhlbFJhdGlvPWUsdGhpcy5nZW5lcmF0ZWQ9ITEsdGhpcy5jZW50ZXJDb29yZGluYXRlcz17eDoxNDQuNSx5OjE0NC41fSx0aGlzLnI9Mjg5Ki40OSx0aGlzLmNvbG9yPXtyOjI1NSxnOjI1NSxiOjI1NSxhOjF9LHRoaXMuaHVlQ2lyY2xlPXZvaWQgMCx0aGlzLmluaXRpYWxDb2xvcj17cjoyNTUsZzoyNTUsYjoyNTUsYToxfSx0aGlzLnByZXZpb3VzQ29sb3I9dm9pZCAwLHRoaXMuYXBwbGllZD0hMSx0aGlzLnVwZGF0ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7fSx0aGlzLmNsb3NlQ2FsbGJhY2s9ZnVuY3Rpb24oKXt9LHRoaXMuX2NyZWF0ZSgpfXJldHVybigwLGQuZGVmYXVsdCkodCxbe2tleTpcImluc2VydFRvXCIsdmFsdWU6ZnVuY3Rpb24odCl7dm9pZCAwIT09dGhpcy5oYW1tZXImJih0aGlzLmhhbW1lci5kZXN0cm95KCksdGhpcy5oYW1tZXI9dm9pZCAwKSx0aGlzLmNvbnRhaW5lcj10LHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUpLHRoaXMuX2JpbmRIYW1tZXIoKSx0aGlzLl9zZXRTaXplKCl9fSx7a2V5Olwic2V0VXBkYXRlQ2FsbGJhY2tcIix2YWx1ZTpmdW5jdGlvbih0KXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcihcIkZ1bmN0aW9uIGF0dGVtcHRlZCB0byBzZXQgYXMgY29sb3JQaWNrZXIgdXBkYXRlIGNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uLlwiKTt0aGlzLnVwZGF0ZUNhbGxiYWNrPXR9fSx7a2V5Olwic2V0Q2xvc2VDYWxsYmFja1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKFwiRnVuY3Rpb24gYXR0ZW1wdGVkIHRvIHNldCBhcyBjb2xvclBpY2tlciBjbG9zaW5nIGNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uLlwiKTt0aGlzLmNsb3NlQ2FsbGJhY2s9dH19LHtrZXk6XCJfaXNDb2xvclN0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXtibGFjazpcIiMwMDAwMDBcIixuYXZ5OlwiIzAwMDA4MFwiLGRhcmtibHVlOlwiIzAwMDA4QlwiLG1lZGl1bWJsdWU6XCIjMDAwMENEXCIsYmx1ZTpcIiMwMDAwRkZcIixkYXJrZ3JlZW46XCIjMDA2NDAwXCIsZ3JlZW46XCIjMDA4MDAwXCIsdGVhbDpcIiMwMDgwODBcIixkYXJrY3lhbjpcIiMwMDhCOEJcIixkZWVwc2t5Ymx1ZTpcIiMwMEJGRkZcIixkYXJrdHVycXVvaXNlOlwiIzAwQ0VEMVwiLG1lZGl1bXNwcmluZ2dyZWVuOlwiIzAwRkE5QVwiLGxpbWU6XCIjMDBGRjAwXCIsc3ByaW5nZ3JlZW46XCIjMDBGRjdGXCIsYXF1YTpcIiMwMEZGRkZcIixjeWFuOlwiIzAwRkZGRlwiLG1pZG5pZ2h0Ymx1ZTpcIiMxOTE5NzBcIixkb2RnZXJibHVlOlwiIzFFOTBGRlwiLGxpZ2h0c2VhZ3JlZW46XCIjMjBCMkFBXCIsZm9yZXN0Z3JlZW46XCIjMjI4QjIyXCIsc2VhZ3JlZW46XCIjMkU4QjU3XCIsZGFya3NsYXRlZ3JheTpcIiMyRjRGNEZcIixsaW1lZ3JlZW46XCIjMzJDRDMyXCIsbWVkaXVtc2VhZ3JlZW46XCIjM0NCMzcxXCIsdHVycXVvaXNlOlwiIzQwRTBEMFwiLHJveWFsYmx1ZTpcIiM0MTY5RTFcIixzdGVlbGJsdWU6XCIjNDY4MkI0XCIsZGFya3NsYXRlYmx1ZTpcIiM0ODNEOEJcIixtZWRpdW10dXJxdW9pc2U6XCIjNDhEMUNDXCIsaW5kaWdvOlwiIzRCMDA4MlwiLGRhcmtvbGl2ZWdyZWVuOlwiIzU1NkIyRlwiLGNhZGV0Ymx1ZTpcIiM1RjlFQTBcIixjb3JuZmxvd2VyYmx1ZTpcIiM2NDk1RURcIixtZWRpdW1hcXVhbWFyaW5lOlwiIzY2Q0RBQVwiLGRpbWdyYXk6XCIjNjk2OTY5XCIsc2xhdGVibHVlOlwiIzZBNUFDRFwiLG9saXZlZHJhYjpcIiM2QjhFMjNcIixzbGF0ZWdyYXk6XCIjNzA4MDkwXCIsbGlnaHRzbGF0ZWdyYXk6XCIjNzc4ODk5XCIsbWVkaXVtc2xhdGVibHVlOlwiIzdCNj
21167hFRVwiLGxhd25ncmVlbjpcIiM3Q0ZDMDBcIixjaGFydHJldXNlOlwiIzdGRkYwMFwiLGFxdWFtYXJpbmU6XCIjN0ZGRkQ0XCIsbWFyb29uOlwiIzgwMDAwMFwiLHB1cnBsZTpcIiM4MDAwODBcIixvbGl2ZTpcIiM4MDgwMDBcIixncmF5OlwiIzgwODA4MFwiLHNreWJsdWU6XCIjODdDRUVCXCIsbGlnaHRza3libHVlOlwiIzg3Q0VGQVwiLGJsdWV2aW9sZXQ6XCIjOEEyQkUyXCIsZGFya3JlZDpcIiM4QjAwMDBcIixkYXJrbWFnZW50YTpcIiM4QjAwOEJcIixzYWRkbGVicm93bjpcIiM4QjQ1MTNcIixkYXJrc2VhZ3JlZW46XCIjOEZCQzhGXCIsbGlnaHRncmVlbjpcIiM5MEVFOTBcIixtZWRpdW1wdXJwbGU6XCIjOTM3MEQ4XCIsZGFya3Zpb2xldDpcIiM5NDAwRDNcIixwYWxlZ3JlZW46XCIjOThGQjk4XCIsZGFya29yY2hpZDpcIiM5OTMyQ0NcIix5ZWxsb3dncmVlbjpcIiM5QUNEMzJcIixzaWVubmE6XCIjQTA1MjJEXCIsYnJvd246XCIjQTUyQTJBXCIsZGFya2dyYXk6XCIjQTlBOUE5XCIsbGlnaHRibHVlOlwiI0FERDhFNlwiLGdyZWVueWVsbG93OlwiI0FERkYyRlwiLHBhbGV0dXJxdW9pc2U6XCIjQUZFRUVFXCIsbGlnaHRzdGVlbGJsdWU6XCIjQjBDNERFXCIscG93ZGVyYmx1ZTpcIiNCMEUwRTZcIixmaXJlYnJpY2s6XCIjQjIyMjIyXCIsZGFya2dvbGRlbnJvZDpcIiNCODg2MEJcIixtZWRpdW1vcmNoaWQ6XCIjQkE1NUQzXCIscm9zeWJyb3duOlwiI0JDOEY4RlwiLGRhcmtraGFraTpcIiNCREI3NkJcIixzaWx2ZXI6XCIjQzBDMEMwXCIsbWVkaXVtdmlvbGV0cmVkOlwiI0M3MTU4NVwiLGluZGlhbnJlZDpcIiNDRDVDNUNcIixwZXJ1OlwiI0NEODUzRlwiLGNob2NvbGF0ZTpcIiNEMjY5MUVcIix0YW46XCIjRDJCNDhDXCIsbGlnaHRncmV5OlwiI0QzRDNEM1wiLHBhbGV2aW9sZXRyZWQ6XCIjRDg3MDkzXCIsdGhpc3RsZTpcIiNEOEJGRDhcIixvcmNoaWQ6XCIjREE3MEQ2XCIsZ29sZGVucm9kOlwiI0RBQTUyMFwiLGNyaW1zb246XCIjREMxNDNDXCIsZ2FpbnNib3JvOlwiI0RDRENEQ1wiLHBsdW06XCIjRERBMEREXCIsYnVybHl3b29kOlwiI0RFQjg4N1wiLGxpZ2h0Y3lhbjpcIiNFMEZGRkZcIixsYXZlbmRlcjpcIiNFNkU2RkFcIixkYXJrc2FsbW9uOlwiI0U5OTY3QVwiLHZpb2xldDpcIiNFRTgyRUVcIixwYWxlZ29sZGVucm9kOlwiI0VFRThBQVwiLGxpZ2h0Y29yYWw6XCIjRjA4MDgwXCIsa2hha2k6XCIjRjBFNjhDXCIsYWxpY2VibHVlOlwiI0YwRjhGRlwiLGhvbmV5ZGV3OlwiI0YwRkZGMFwiLGF6dXJlOlwiI0YwRkZGRlwiLHNhbmR5YnJvd246XCIjRjRBNDYwXCIsd2hlYXQ6XCIjRjVERUIzXCIsYmVpZ2U6XCIjRjVGNURDXCIsd2hpdGVzbW9rZTpcIiNGNUY1RjVcIixtaW50Y3JlYW06XCIjRjVGRkZBXCIsZ2hvc3R3aGl0ZTpcIiNGOEY4RkZcIixzYWxtb246XCIjRkE4MDcyXCIsYW50aXF1ZXdoaXRlOlwiI0ZBRUJEN1wiLGxpbmVuOlwiI0ZBRjBFNlwiLGxpZ2h0Z29sZGVucm9keWVsbG93OlwiI0ZBRkFEMlwiLG9sZGxhY2U6XCIjRkRGNUU2XCIscmVkOlwiI0ZGMDAwMFwiLGZ1Y2hzaWE6XCIjRkYwMEZGXCIsbWFnZW50YTpcIiNGRjAwRkZcIixkZWVwcGluazpcIiNGRjE0OTNcIixvcmFuZ2VyZWQ6XCIjRkY0NTAwXCIsdG9tYXRvOlwiI0ZGNjM0N1wiLGhvdHBpbms6XCIjRkY2OUI0XCIsY29yYWw6XCIjRkY3RjUwXCIsZGFya29yYW5nZTpcIiNGRjhDMDBcIixsaWdodHNhbG1vbjpcIiNGRkEwN0FcIixvcmFuZ2U6XCIjRkZBNTAwXCIsbGlnaHRwaW5rOlwiI0ZGQjZDMVwiLHBpbms6XCIjRkZDMENCXCIsZ29sZDpcIiNGRkQ3MDBcIixwZWFjaHB1ZmY6XCIjRkZEQUI5XCIsbmF2YWpvd2hpdGU6XCIjRkZERUFEXCIsbW9jY2FzaW46XCIjRkZFNEI1XCIsYmlzcXVlOlwiI0ZGRTRDNFwiLG1pc3R5cm9zZTpcIiNGRkU0RTFcIixibGFuY2hlZGFsbW9uZDpcIiNGRkVCQ0RcIixwYXBheWF3aGlwOlwiI0ZGRUZENVwiLGxhdmVuZGVyYmx1c2g6XCIjRkZGMEY1XCIsc2Vhc2hlbGw6XCIjRkZGNUVFXCIsY29ybnNpbGs6XCIjRkZGOERDXCIsbGVtb25jaGlmZm9uOlwiI0ZGRkFDRFwiLGZsb3JhbHdoaXRlOlwiI0ZGRkFGMFwiLHNub3c6XCIjRkZGQUZBXCIseWVsbG93OlwiI0ZGRkYwMFwiLGxpZ2h0eWVsbG93OlwiI0ZGRkZFMFwiLGl2b3J5OlwiI0ZGRkZGMFwiLHdoaXRlOlwiI0ZGRkZGRlwifTtpZihcInN0cmluZ1wiPT10eXBlb2YgdClyZXR1cm4gZVt0XX19LHtrZXk6XCJzZXRDb2xvclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV07aWYoXCJub25lXCIhPT10KXt2YXIgaT12b2lkIDAsbz10aGlzLl9pc0NvbG9yU3RyaW5nKHQpO2lmKHZvaWQgMCE9PW8mJih0PW8pLCEwPT09Yy5pc1N0cmluZyh0KSl7aWYoITA9PT1jLmlzVmFsaWRSR0IodCkpe3ZhciBuPXQuc3Vic3RyKDQpLnN1YnN0cigwLHQubGVuZ3RoLTUpLnNwbGl0KFwiLFwiKTtpPXtyOm5bMF0sZzpuWzFdLGI6blsyXSxhOjF9fWVsc2UgaWYoITA9PT1jLmlzVmFsaWRSR0JBKHQpKXt2YXIgcj10LnN1YnN0cig1KS5zdWJzdHIoMCx0Lmxlbmd0aC02KS5zcGxpdChcIixcIik7aT17cjpyWzBdLGc6clsxXSxiOnJbMl0sYTpyWzNdfX1lbHNlIGlmKCEwPT09Yy5pc1ZhbGlkSGV4KHQpKXt2YXIgYT1jLmhleFRvUkdCKHQpO2k9e3I6YS5yLGc6YS5nLGI6YS5iLGE6MX19fWVsc2UgaWYodCBpbnN0YW5jZW9mIE9iamVjdCYmdm9pZCAwIT09dC5yJiZ2b2lkIDAhPT10LmcmJnZvaWQgMCE9PXQuYil7dmFyIGg9dm9pZCAwIT09dC5hP3QuYTpcIjEuMFwiO2k9e3I6dC5yLGc6dC5nLGI6dC5iLGE6aH19aWYodm9pZCAwPT09aSl0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGNvbG9yIHBhc3NlZCB0byB0aGUgY29sb3JQaWNrZXIuIFN1cHBvcnRlZCBhcmUgc3RyaW5nczogcmdiLCBoZXgsIHJnYmEuIE9iamVjdDogcmdiICh7cjpyLGc6ZyxiOmIsW2E6YV19KS4gU3VwcGxpZWQ6IFwiKygwLHMuZGVmYXVsdCkodCkpO3RoaXMuX3NldENvbG9yKGksZSl9fX0se2tleTpcInNob3dcIix2YWx1ZTpmdW5jdGlvbigpe3ZvaWQgMCE9PXRoaXMuY2xvc2VDYWxsYmFjayYmKHR
21167oaXMuY2xvc2VDYWxsYmFjaygpLHRoaXMuY2xvc2VDYWxsYmFjaz12b2lkIDApLHRoaXMuYXBwbGllZD0hMSx0aGlzLmZyYW1lLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiLHRoaXMuX2dlbmVyYXRlSHVlQ2lyY2xlKCl9fSx7a2V5OlwiX2hpZGVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7ITA9PT0oIShhcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSl8fGFyZ3VtZW50c1swXSkmJih0aGlzLnByZXZpb3VzQ29sb3I9Yy5leHRlbmQoe30sdGhpcy5jb2xvcikpLCEwPT09dGhpcy5hcHBsaWVkJiZ0aGlzLnVwZGF0ZUNhbGxiYWNrKHRoaXMuaW5pdGlhbENvbG9yKSx0aGlzLmZyYW1lLnN0eWxlLmRpc3BsYXk9XCJub25lXCIsc2V0VGltZW91dChmdW5jdGlvbigpe3ZvaWQgMCE9PXQuY2xvc2VDYWxsYmFjayYmKHQuY2xvc2VDYWxsYmFjaygpLHQuY2xvc2VDYWxsYmFjaz12b2lkIDApfSwwKX19LHtrZXk6XCJfc2F2ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVDYWxsYmFjayh0aGlzLmNvbG9yKSx0aGlzLmFwcGxpZWQ9ITEsdGhpcy5faGlkZSgpfX0se2tleTpcIl9hcHBseVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5hcHBsaWVkPSEwLHRoaXMudXBkYXRlQ2FsbGJhY2sodGhpcy5jb2xvciksdGhpcy5fdXBkYXRlUGlja2VyKHRoaXMuY29sb3IpfX0se2tleTpcIl9sb2FkTGFzdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5wcmV2aW91c0NvbG9yP3RoaXMuc2V0Q29sb3IodGhpcy5wcmV2aW91c0NvbG9yLCExKTphbGVydChcIlRoZXJlIGlzIG5vIGxhc3QgY29sb3IgdG8gbG9hZC4uLlwiKX19LHtrZXk6XCJfc2V0Q29sb3JcIix2YWx1ZTpmdW5jdGlvbih0KXshMD09PSghKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdKSYmKHRoaXMuaW5pdGlhbENvbG9yPWMuZXh0ZW5kKHt9LHQpKSx0aGlzLmNvbG9yPXQ7dmFyIGU9Yy5SR0JUb0hTVih0LnIsdC5nLHQuYiksaT0yKk1hdGguUEksbz10aGlzLnIqZS5zLG49dGhpcy5jZW50ZXJDb29yZGluYXRlcy54K28qTWF0aC5zaW4oaSplLmgpLHM9dGhpcy5jZW50ZXJDb29yZGluYXRlcy55K28qTWF0aC5jb3MoaSplLmgpO3RoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5zdHlsZS5sZWZ0PW4tLjUqdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLmNsaWVudFdpZHRoK1wicHhcIix0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3Iuc3R5bGUudG9wPXMtLjUqdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLmNsaWVudEhlaWdodCtcInB4XCIsdGhpcy5fdXBkYXRlUGlja2VyKHQpfX0se2tleTpcIl9zZXRPcGFjaXR5XCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5jb2xvci5hPXQvMTAwLHRoaXMuX3VwZGF0ZVBpY2tlcih0aGlzLmNvbG9yKX19LHtrZXk6XCJfc2V0QnJpZ2h0bmVzc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWMuUkdCVG9IU1YodGhpcy5jb2xvci5yLHRoaXMuY29sb3IuZyx0aGlzLmNvbG9yLmIpO2Uudj10LzEwMDt2YXIgaT1jLkhTVlRvUkdCKGUuaCxlLnMsZS52KTtpLmE9dGhpcy5jb2xvci5hLHRoaXMuY29sb3I9aSx0aGlzLl91cGRhdGVQaWNrZXIoKX19LHtrZXk6XCJfdXBkYXRlUGlja2VyXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dGhpcy5jb2xvcixlPWMuUkdCVG9IU1YodC5yLHQuZyx0LmIpLGk9dGhpcy5jb2xvclBpY2tlckNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7dm9pZCAwPT09dGhpcy5waXhlbFJhdGlvbiYmKHRoaXMucGl4ZWxSYXRpbz0od2luZG93LmRldmljZVBpeGVsUmF0aW98fDEpLyhpLndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fGkubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8aS5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW98fGkub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW98fGkuYmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8MSkpLGkuc2V0VHJhbnNmb3JtKHRoaXMucGl4ZWxSYXRpbywwLDAsdGhpcy5waXhlbFJhdGlvLDAsMCk7dmFyIG89dGhpcy5jb2xvclBpY2tlckNhbnZhcy5jbGllbnRXaWR0aCxuPXRoaXMuY29sb3JQaWNrZXJDYW52YXMuY2xpZW50SGVpZ2h0O2kuY2xlYXJSZWN0KDAsMCxvLG4pLGkucHV0SW1hZ2VEYXRhKHRoaXMuaHVlQ2lyY2xlLDAsMCksaS5maWxsU3R5bGU9XCJyZ2JhKDAsMCwwLFwiKygxLWUudikrXCIpXCIsaS5jaXJjbGUodGhpcy5jZW50ZXJDb29yZGluYXRlcy54LHRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueSx0aGlzLnIpLGkuZmlsbCgpLHRoaXMuYnJpZ2h0bmVzc1JhbmdlLnZhbHVlPTEwMCplLnYsdGhpcy5vcGFjaXR5UmFuZ2UudmFsdWU9MTAwKnQuYSx0aGlzLmluaXRpYWxDb2xvckRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9XCJyZ2JhKFwiK3RoaXMuaW5pdGlhbENvbG9yLnIrXCIsXCIrdGhpcy5pbml0aWFsQ29sb3IuZytcIixcIit0aGlzLmluaXRpYWxDb2xvci5iK1wiLFwiK3RoaXMuaW5pdGlhbENvbG9yLmErXCIpXCIsdGhpcy5uZXdDb2xvckRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9XCJyZ2JhKFwiK3RoaXMuY29sb3IucitcIixcIit0aGlzLmNvbG9yLmcrXCIsXCIrdGhpcy5jb2xvci5iK1wiLFwiK3RoaXMuY29sb3IuYStcIilcIn19LHtrZXk6XCJfc2V0U2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jb2xvclBpY2tlckNhbnZhcy5zdHlsZS53aWR0aD1cIjEwMCVcIix0aGlzLmNvbG9yUGlja2VyQ2FudmFzLnN0eWxlLmhlaWdodD1cIjEwMCVcIix0aGlzLmNvbG9yUGlja2VyQ2FudmFzLndpZHRoPTI4OSp0aGlzLnBpeGVsUmF0aW8sdGhpcy5jb2xvclBpY2tlckNhbnZhcy5oZWlnaHQ9Mjg5KnRoaXMucGl4ZWxSYXRpb319LHtrZXk6XCJfY3JlYXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5mcmFtZS5jbGFzc05hbWU9XCJ2aXMtY29sb3ItcGlja2VyXCIsdGhpcy5jb2xvclBpY2tlckRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5jbGFzc05hbWU9XCJ2aXMtc2VsZWN0b3JcIix0aGlzLmNvbG9yUGlja2VyRGl2LmFwcGVuZENoaWxkKHRoaXMuY29sb3JQaWNrZXJTZWxlY3RvciksdGhpcy5jb2xvclBpY2tlckNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLHRoaXMuY29sb3JQaWNrZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5jb2xvclBpY2tlckNhbnZhcyksdGhpcy5jb2xvclBpY2tlckNhbnZhcy5nZXRDb250ZXh0KXt2YXIgdD10aGlzLmNvbG9yUGlja2VyQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKVxuICAgIDt0aGlzLnBpeGVsUmF0aW89KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxKS8odC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fDEpLHRoaXMuY29sb3JQaWNrZXJDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpLnNldFRyYW5zZm9ybSh0aGlzLnBpeGVsUmF0aW8sMCwwLHRoaXMucGl4ZWxSYXRpbywwLDApfWVsc2V7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIkRJVlwiKTtlLnN0eWxlLmNvbG9yPVwicmVkXCIsZS5zdHlsZS5mb250V2VpZ2h0PVwiYm9sZFwiLGUuc3R5bGUucGFkZGluZz1cIjEwcHhcIixlLmlubmVySFRNTD1cIkVycm9yOiB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBIVE1MIGNhbnZhc1wiLHRoaXMuY29sb3JQaWNrZXJDYW52YXMuYXBwZW5kQ2hpbGQoZSl9dGhpcy5jb2xvclBpY2tlckRpdi5jbGFzc05hbWU9XCJ2aXMtY29sb3JcIix0aGlzLm9wYWNpdHlEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLm9wYWNpdHlEaXYuY2xhc3NOYW1lPVwidmlzLW9wYWNpdHlcIix0aGlzLmJyaWdodG5lc3NEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmJyaWdodG5lc3NEaXYuY2xhc3NOYW1lPVwidmlzLWJyaWdodG5lc3NcIix0aGlzLmFycm93RGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5hcnJvd0Rpdi5jbGFzc05hbWU9XCJ2aXMtYXJyb3dcIix0aGlzLm9wYWNpdHlSYW5nZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7dHJ5e3RoaXMub3BhY2l0eVJhbmdlLnR5cGU9XCJyYW5nZVwiLHRoaXMub3BhY2l0eVJhbmdlLm1pbj1cIjBcIix0aGlzLm9wYWNpdHlSYW5nZS5tYXg9XCIxMDBcIn1jYXRjaCh0KXt9dGhpcy5vcGFjaXR5UmFuZ2UudmFsdWU9XCIxMDBcIix0aGlzLm9wYWNpdHlSYW5nZS5jbGFzc05hbWU9XCJ2aXMtcmFuZ2VcIix0aGlzLmJyaWdodG5lc3NSYW5nZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7dHJ5e3RoaXMuYnJpZ2h0bmVzc1JhbmdlLnR5cGU9XCJyYW5nZVwiLHRoaXMuYnJpZ2h0bmVzc1JhbmdlLm1pbj1cIjBcIix0aGlzLmJyaWdodG5lc3NSYW5nZS5tYXg9XCIxMDBcIn1jYXRjaCh0KXt9dGhpcy5icmlnaHRuZXNzUmFuZ2UudmFsdWU9XCIxMDBcIix0aGlzLmJyaWdodG5lc3NSYW5nZS5jbGFzc05hbWU9XCJ2aXMtcmFuZ2VcIix0aGlzLm9wYWNpdHlEaXYuYXBwZW5kQ2hpbGQodGhpcy5vcGFjaXR5UmFuZ2UpLHRoaXMuYnJpZ2h0bmVzc0Rpdi5hcHBlbmRDaGlsZCh0aGlzLmJyaWdodG5lc3NSYW5nZSk7dmFyIGk9dGhpczt0aGlzLm9wYWNpdHlSYW5nZS5vbmNoYW5nZT1mdW5jdGlvbigpe2kuX3NldE9wYWNpdHkodGhpcy52YWx1ZSl9LHRoaXMub3BhY2l0eVJhbmdlLm9uaW5wdXQ9ZnVuY3Rpb24oKXtpLl9zZXRPcGFjaXR5KHRoaXMudmFsdWUpfSx0aGlzLmJyaWdodG5lc3NSYW5nZS5vbmNoYW5nZT1mdW5jdGlvbigpe2kuX3NldEJyaWdodG5lc3ModGhpcy52YWx1ZSl9LHRoaXMuYnJpZ2h0bmVzc1JhbmdlLm9uaW5wdXQ9ZnVuY3Rpb24oKXtpLl9zZXRCcmlnaHRuZXNzKHRoaXMudmFsdWUpfSx0aGlzLmJyaWdodG5lc3NMYWJlbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuYnJpZ2h0bmVzc0xhYmVsLmNsYXNzTmFtZT1cInZpcy1sYWJlbCB2aXMtYnJpZ2h0bmVzc1wiLHRoaXMuYnJpZ2h0bmVzc0xhYmVsLmlubmVySFRNTD1cImJyaWdodG5lc3M6XCIsdGhpcy5vcGFjaXR5TGFiZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLm9wYWNpdHlMYWJlbC5jbGFzc05hbWU9XCJ2aXMtbGFiZWwgdmlzLW9wYWNpdHlcIix0aGlzLm9wYWNpdHlMYWJlbC5pbm5lckhUTUw9XCJvcGFjaXR5OlwiLHRoaXMubmV3Q29sb3JEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLm5ld0NvbG9yRGl2LmNsYXNzTmFtZT1cInZpcy1uZXctY29sb3JcIix0aGlzLm5ld0NvbG9yRGl2LmlubmVySFRNTD1cIm5ld1wiLHRoaXMuaW5pdGlhbENvbG9yRGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5pbml0aWFsQ29sb3JEaXYuY2xhc3NOYW1lPVwidmlzLWluaXRpYWwtY29sb3JcIix0aGlzLmluaXRpYWxDb2xvckRpdi5pbm5lckhUTUw9XCJpbml0aWFsXCIsdGhpcy5jYW5jZWxCdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmNhbmNlbEJ1dHRvbi5jbGFzc05hbWU9XCJ2aXMtYnV0dG9uIHZpcy1jYW5jZWxcIix0aGlzLmNhbmNlbEJ1dHRvbi5pbm5lckhUTUw9XCJjYW5jZWxcIix0aGlzLmNhbmNlbEJ1dHRvbi5vbmNsaWNrPXRoaXMuX2hpZGUuYmluZCh0aGlzLCExKSx0aGlzLmFwcGx5QnV0dG9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5hcHBseUJ1dHRvbi5jbGFzc05hbWU9XCJ2aXMtYnV0dG9uIHZpcy1hcHBseVwiLHRoaXMuYXBwbHlCdXR0b24uaW5uZXJIVE1MPVwiYXBwbHlcIix0aGlzLmFwcGx5QnV0dG9uLm9uY2xpY2s9dGhpcy5fYXBwbHkuYmluZCh0aGlzKSx0aGlzLnNhdmVCdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLnNhdmVCdXR0b24uY2xhc3NOYW1lPVwidmlzLWJ1dHRvbiB2aXMtc2F2ZVwiLHRoaXMuc2F2ZUJ1dHRvbi5pbm5lckhUTUw9XCJzYXZlXCIsdGhpcy5zYXZlQnV0dG9uLm9uY2xpY2s9dGhpcy5fc2F2ZS5iaW5kKHRoaXMpLHRoaXMubG9hZEJ1dHRvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMubG9hZEJ1dHRvbi5jbGFzc05hbWU9XCJ2aXMtYnV0dG9uIHZpcy1sb2FkXCIsdGhpcy5sb2FkQnV0dG9uLmlubmVySFRNTD1cImxvYWQgbGFzdFwiLH
21167RoaXMubG9hZEJ1dHRvbi5vbmNsaWNrPXRoaXMuX2xvYWRMYXN0LmJpbmQodGhpcyksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmNvbG9yUGlja2VyRGl2KSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuYXJyb3dEaXYpLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5icmlnaHRuZXNzTGFiZWwpLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5icmlnaHRuZXNzRGl2KSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMub3BhY2l0eUxhYmVsKSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMub3BhY2l0eURpdiksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLm5ld0NvbG9yRGl2KSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuaW5pdGlhbENvbG9yRGl2KSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuY2FuY2VsQnV0dG9uKSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuYXBwbHlCdXR0b24pLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5zYXZlQnV0dG9uKSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMubG9hZEJ1dHRvbil9fSx7a2V5OlwiX2JpbmRIYW1tZXJcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5kcmFnPXt9LHRoaXMucGluY2g9e30sdGhpcy5oYW1tZXI9bmV3IGwodGhpcy5jb2xvclBpY2tlckNhbnZhcyksdGhpcy5oYW1tZXIuZ2V0KFwicGluY2hcIikuc2V0KHtlbmFibGU6ITB9KSx1Lm9uVG91Y2godGhpcy5oYW1tZXIsZnVuY3Rpb24oZSl7dC5fbW92ZVNlbGVjdG9yKGUpfSksdGhpcy5oYW1tZXIub24oXCJ0YXBcIixmdW5jdGlvbihlKXt0Ll9tb3ZlU2VsZWN0b3IoZSl9KSx0aGlzLmhhbW1lci5vbihcInBhbnN0YXJ0XCIsZnVuY3Rpb24oZSl7dC5fbW92ZVNlbGVjdG9yKGUpfSksdGhpcy5oYW1tZXIub24oXCJwYW5tb3ZlXCIsZnVuY3Rpb24oZSl7dC5fbW92ZVNlbGVjdG9yKGUpfSksdGhpcy5oYW1tZXIub24oXCJwYW5lbmRcIixmdW5jdGlvbihlKXt0Ll9tb3ZlU2VsZWN0b3IoZSl9KX19LHtrZXk6XCJfZ2VuZXJhdGVIdWVDaXJjbGVcIix2YWx1ZTpmdW5jdGlvbigpe2lmKCExPT09dGhpcy5nZW5lcmF0ZWQpe3ZhciB0PXRoaXMuY29sb3JQaWNrZXJDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO3ZvaWQgMD09PXRoaXMucGl4ZWxSYXRpb24mJih0aGlzLnBpeGVsUmF0aW89KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxKS8odC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fDEpKSx0LnNldFRyYW5zZm9ybSh0aGlzLnBpeGVsUmF0aW8sMCwwLHRoaXMucGl4ZWxSYXRpbywwLDApO3ZhciBlPXRoaXMuY29sb3JQaWNrZXJDYW52YXMuY2xpZW50V2lkdGgsaT10aGlzLmNvbG9yUGlja2VyQ2FudmFzLmNsaWVudEhlaWdodDt0LmNsZWFyUmVjdCgwLDAsZSxpKTt2YXIgbz12b2lkIDAsbj12b2lkIDAscz12b2lkIDAscj12b2lkIDA7dGhpcy5jZW50ZXJDb29yZGluYXRlcz17eDouNSplLHk6LjUqaX0sdGhpcy5yPS40OSplO3ZhciBhPTIqTWF0aC5QSS8zNjAsaD0xL3RoaXMucixkPXZvaWQgMDtmb3Iocz0wO3M8MzYwO3MrKylmb3Iocj0wO3I8dGhpcy5yO3IrKylvPXRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueCtyKk1hdGguc2luKGEqcyksbj10aGlzLmNlbnRlckNvb3JkaW5hdGVzLnkrcipNYXRoLmNvcyhhKnMpLGQ9Yy5IU1ZUb1JHQihzKigxLzM2MCkscipoLDEpLHQuZmlsbFN0eWxlPVwicmdiKFwiK2QucitcIixcIitkLmcrXCIsXCIrZC5iK1wiKVwiLHQuZmlsbFJlY3Qoby0uNSxuLS41LDIsMik7dC5zdHJva2VTdHlsZT1cInJnYmEoMCwwLDAsMSlcIix0LmNpcmNsZSh0aGlzLmNlbnRlckNvb3JkaW5hdGVzLngsdGhpcy5jZW50ZXJDb29yZGluYXRlcy55LHRoaXMuciksdC5zdHJva2UoKSx0aGlzLmh1ZUNpcmNsZT10LmdldEltYWdlRGF0YSgwLDAsZSxpKX10aGlzLmdlbmVyYXRlZD0hMH19LHtrZXk6XCJfbW92ZVNlbGVjdG9yXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb2xvclBpY2tlckRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPXQuY2VudGVyLngtZS5sZWZ0LG89dC5jZW50ZXIueS1lLnRvcCxuPS41KnRoaXMuY29sb3JQaWNrZXJEaXYuY2xpZW50SGVpZ2h0LHM9LjUqdGhpcy5jb2xvclBpY2tlckRpdi5jbGllbnRXaWR0aCxyPWktcyxhPW8tbixoPU1hdGguYXRhbjIocixhKSxkPS45OCpNYXRoLm1pbihNYXRoLnNxcnQocipyK2EqYSkscyksbD1NYXRoLmNvcyhoKSpkK24sdT1NYXRoLnNpbihoKSpkK3M7dGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLnN0eWxlLnRvcD1sLS41KnRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5jbGllbnRIZWlnaHQrXCJweFwiLHRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5zdHlsZS5sZWZ0PXUtLjUqdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLmNsaWVudFdpZHRoK1wicHhcIjt2YXIgcD1oLygyKk1hdGguUEkpO3A9cDwwP3ArMTpwO3ZhciBmPWQvdGhpcy5yLG09Yy5SR0JUb0hTVih0aGlzLmNvbG9yLnIsdGhpcy5jb2xvci5nLHRoaXMuY29sb3IuYik7bS5oPXAsbS5zPWY7dmFyIHY9Yy5IU1ZUb1JHQihtLmgsbS5zLG0udik7di5hPXRoaXMuY29sb3IuYSx0aGlzLmNvbG9yPXYsdGhpcy5pbml0aWFsQ29sb3JEaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yPVwicmdiYShcIit0aGlzLmluaXRpYWxDb2xvci5yK1wiLFwiK3RoaXMuaW5pdGlhbENvbG9yLmcrXCIsXCIrdGhpcy5pbml0aWFsQ29sb3IuYitcIixcIit0aGlzLmluaXRpYWxDb2xvci5hK1wiKVwiLHRoaXMubmV3Q29sb3JEaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yPVwicmdiYShcIit0aGlzLmNvbG9yLnIrXCIsXCIrdGhpcy5jb2xvci5nK1wiLFwiK3RoaXMuY29sb3IuYitcIixcIit0aGlzLmNvbG9yLmErXCIpXCJ9fV0pLHR9KCk7ZS5kZWZhdWx0PXB9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpLG8pe2lmKCEoQXJyYXkuaXNBcnJheShpKXx8aSBpbnN0YW5jZW9mIHJ8fGkgaW5zdGFuY2VvZiBhKSYmaSBpbnN0YW5jZW9mIE9iamVjdCl7dmFyIGQ9bztvPWksaT1kfW8mJm8udGhyb3R0bGVSZWRyYXcmJmNvbnNvbGUud2FybignR3JhcGgyZCBvcHRpb24gXCJ0aHJvdHRsZVJlZHJhd1wiIGlzIERFU
21167FJJQ0FURUQgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBNQUpPUiByZWxlYXNlLicpO3ZhciBjPXRoaXM7dGhpcy5kZWZhdWx0T3B0aW9ucz17c3RhcnQ6bnVsbCxlbmQ6bnVsbCxhdXRvUmVzaXplOiEwLG9yaWVudGF0aW9uOntheGlzOlwiYm90dG9tXCIsaXRlbTpcImJvdHRvbVwifSxtb21lbnQ6bix3aWR0aDpudWxsLGhlaWdodDpudWxsLG1heEhlaWdodDpudWxsLG1pbkhlaWdodDpudWxsfSx0aGlzLm9wdGlvbnM9cy5kZWVwRXh0ZW5kKHt9LHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuX2NyZWF0ZSh0KSx0aGlzLmNvbXBvbmVudHM9W10sdGhpcy5ib2R5PXtkb206dGhpcy5kb20sZG9tUHJvcHM6dGhpcy5wcm9wcyxlbWl0dGVyOntvbjp0aGlzLm9uLmJpbmQodGhpcyksb2ZmOnRoaXMub2ZmLmJpbmQodGhpcyksZW1pdDp0aGlzLmVtaXQuYmluZCh0aGlzKX0saGlkZGVuRGF0ZXM6W10sdXRpbDp7dG9TY3JlZW46Yy5fdG9TY3JlZW4uYmluZChjKSx0b0dsb2JhbFNjcmVlbjpjLl90b0dsb2JhbFNjcmVlbi5iaW5kKGMpLHRvVGltZTpjLl90b1RpbWUuYmluZChjKSx0b0dsb2JhbFRpbWU6Yy5fdG9HbG9iYWxUaW1lLmJpbmQoYyl9fSx0aGlzLnJhbmdlPW5ldyBoKHRoaXMuYm9keSksdGhpcy5jb21wb25lbnRzLnB1c2godGhpcy5yYW5nZSksdGhpcy5ib2R5LnJhbmdlPXRoaXMucmFuZ2UsdGhpcy50aW1lQXhpcz1uZXcgbCh0aGlzLmJvZHkpLHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMudGltZUF4aXMpLHRoaXMuY3VycmVudFRpbWU9bmV3IHUodGhpcy5ib2R5KSx0aGlzLmNvbXBvbmVudHMucHVzaCh0aGlzLmN1cnJlbnRUaW1lKSx0aGlzLmxpbmVncmFwaD1uZXcgcCh0aGlzLmJvZHkpLHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMubGluZWdyYXBoKSx0aGlzLml0ZW1zRGF0YT1udWxsLHRoaXMuZ3JvdXBzRGF0YT1udWxsLHRoaXMub24oXCJ0YXBcIixmdW5jdGlvbih0KXtjLmVtaXQoXCJjbGlja1wiLGMuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0pLHRoaXMub24oXCJkb3VibGV0YXBcIixmdW5jdGlvbih0KXtjLmVtaXQoXCJkb3VibGVDbGlja1wiLGMuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0pLHRoaXMuZG9tLnJvb3Qub25jb250ZXh0bWVudT1mdW5jdGlvbih0KXtjLmVtaXQoXCJjb250ZXh0bWVudVwiLGMuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sbyYmdGhpcy5zZXRPcHRpb25zKG8pLGkmJnRoaXMuc2V0R3JvdXBzKGkpLGUmJnRoaXMuc2V0SXRlbXMoZSksdGhpcy5fcmVkcmF3KCl9dmFyIG49aSg5KSxzPWkoMikscj1pKDExKSxhPWkoMTIpLGg9aSg2NCksZD1pKDY1KSxsPWkoNDUpLHU9aSg2NyksYz1pKDQ2KSxwPWkoMTA2KSxmPWkoMTUpLnByaW50U3R5bGUsbT1pKDExMykuYWxsT3B0aW9ucyx2PWkoMTEzKS5jb25maWd1cmVPcHRpb25zLGc9aSg3MSkuZGVmYXVsdCx5PWkoMTUpLmRlZmF1bHQ7by5wcm90b3R5cGU9bmV3IGQsby5wcm90b3R5cGUuc2V0T3B0aW9ucz1mdW5jdGlvbih0KXshMD09PXkudmFsaWRhdGUodCxtKSYmY29uc29sZS5sb2coXCIlY0Vycm9ycyBoYXZlIGJlZW4gZm91bmQgaW4gdGhlIHN1cHBsaWVkIG9wdGlvbnMgb2JqZWN0LlwiLGYpLGQucHJvdG90eXBlLnNldE9wdGlvbnMuY2FsbCh0aGlzLHQpfSxvLnByb3RvdHlwZS5zZXRJdGVtcz1mdW5jdGlvbih0KXt2YXIgZSxpPW51bGw9PXRoaXMuaXRlbXNEYXRhO2lmKGU9dD90IGluc3RhbmNlb2Ygcnx8dCBpbnN0YW5jZW9mIGE/dDpuZXcgcih0LHt0eXBlOntzdGFydDpcIkRhdGVcIixlbmQ6XCJEYXRlXCJ9fSk6bnVsbCx0aGlzLml0ZW1zRGF0YT1lLHRoaXMubGluZWdyYXBoJiZ0aGlzLmxpbmVncmFwaC5zZXRJdGVtcyhlKSxpKWlmKHZvaWQgMCE9dGhpcy5vcHRpb25zLnN0YXJ0fHx2b2lkIDAhPXRoaXMub3B0aW9ucy5lbmQpe3ZhciBvPXZvaWQgMCE9dGhpcy5vcHRpb25zLnN0YXJ0P3RoaXMub3B0aW9ucy5zdGFydDpudWxsLG49dm9pZCAwIT10aGlzLm9wdGlvbnMuZW5kP3RoaXMub3B0aW9ucy5lbmQ6bnVsbDt0aGlzLnNldFdpbmRvdyhvLG4se2FuaW1hdGlvbjohMX0pfWVsc2UgdGhpcy5maXQoe2FuaW1hdGlvbjohMX0pfSxvLnByb3RvdHlwZS5zZXRHcm91cHM9ZnVuY3Rpb24odCl7dmFyIGU7ZT10P3QgaW5zdGFuY2VvZiByfHx0IGluc3RhbmNlb2YgYT90Om5ldyByKHQpOm51bGwsdGhpcy5ncm91cHNEYXRhPWUsdGhpcy5saW5lZ3JhcGguc2V0R3JvdXBzKGUpfSxvLnByb3RvdHlwZS5nZXRMZWdlbmQ9ZnVuY3Rpb24odCxlLGkpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0xNSksdm9pZCAwPT09aSYmKGk9MTUpLHZvaWQgMCE9PXRoaXMubGluZWdyYXBoLmdyb3Vwc1t0XT90aGlzLmxpbmVncmFwaC5ncm91cHNbdF0uZ2V0TGVnZW5kKGUsaSk6XCJjYW5ub3QgZmluZCBncm91cDonXCIrdCtcIidcIn0sby5wcm90b3R5cGUuaXNHcm91cFZpc2libGU9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMubGluZWdyYXBoLmdyb3Vwc1t0XSYmKHRoaXMubGluZWdyYXBoLmdyb3Vwc1t0XS52aXNpYmxlJiYodm9pZCAwPT09dGhpcy5saW5lZ3JhcGgub3B0aW9ucy5ncm91cHMudmlzaWJpbGl0eVt0XXx8MT09dGhpcy5saW5lZ3JhcGgub3B0aW9ucy5ncm91cHMudmlzaWJpbGl0eVt0XSkpfSxvLnByb3RvdHlwZS5nZXREYXRhUmFuZ2U9ZnVuY3Rpb24oKXt2YXIgdD1udWxsLGU9bnVsbDtmb3IodmFyIGkgaW4gdGhpcy5saW5lZ3JhcGguZ3JvdXBzKWlmKHRoaXMubGluZWdyYXBoLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShpKSYmMT09dGhpcy5saW5lZ3JhcGguZ3JvdXBzW2ldLnZpc2libGUpZm9yKHZhciBvPTA7bzx0aGlzLmxpbmVncmFwaC5ncm91cHNbaV0uaXRlbXNEYXRhLmxlbmd0aDtvKyspe3ZhciBuPXRoaXMubGluZWdyYXBoLmdyb3Vwc1tpXS5pdGVtc0RhdGFbb10scj1zLmNvbnZlcnQobi54LFwiRGF0ZVwiKS52YWx1ZU9mKCk7dD1udWxsPT10P3I6dD5yP3I6dCxlPW51bGw9PWU/cjplPHI/cjplfXJldHVybnttaW46bnVsbCE9dD9uZXcgRGF0ZSh0KTpudWxsLG1heDpudWxsIT1lP25ldyBEYXRlKGUpOm51bGx9fSxvLnByb3RvdHlwZS5nZXRFdmVudFByb3BlcnRpZXM9ZnVuY3Rpb24odCl7dmFyIGU9dC5jZW50ZXI/dC5jZW50ZXIueDp0LmNsaWVudFgsaT10LmNlbnRlcj90LmNlbnRlci55OnQuY2xpZW50WSxvPWUtcy5nZXRBYnNvbHV0ZUxlZnQodGhpcy5kb20uY2VudGVyQ29udGFpbmVyKSxuPWktcy5nZXRBYnNvbHV0ZVRvcCh0aGlzLmRvbS5jZW50ZXJDb250YWluZXIpLHI9dGhpcy5fdG9UaW1lKG8pLGE9Yy5jdXN0b21UaW1lRnJvbVRhcmdldCh0KSxoPXMuZ2V0VGFyZ2V0KHQpLGQ9bnVsbDtzLmhhc1BhcmVudChoLHRoaXMudGltZUF4aXMuZG9tLmZvcmVncm91bmQpP2Q9XCJheGlzXCI6dGhpcy50aW1lQXhpczImJnMuaGFzUGFyZW50KGgsdGhpcy50aW1lQXhpczIuZG9tLmZvcmVncm91bmQpP2Q9XCJheGlzXCI6cy5oYXN
21167QYXJlbnQoaCx0aGlzLmxpbmVncmFwaC55QXhpc0xlZnQuZG9tLmZyYW1lKT9kPVwiZGF0YS1heGlzXCI6cy5oYXNQYXJlbnQoaCx0aGlzLmxpbmVncmFwaC55QXhpc1JpZ2h0LmRvbS5mcmFtZSk/ZD1cImRhdGEtYXhpc1wiOnMuaGFzUGFyZW50KGgsdGhpcy5saW5lZ3JhcGgubGVnZW5kTGVmdC5kb20uZnJhbWUpP2Q9XCJsZWdlbmRcIjpzLmhhc1BhcmVudChoLHRoaXMubGluZWdyYXBoLmxlZ2VuZFJpZ2h0LmRvbS5mcmFtZSk/ZD1cImxlZ2VuZFwiOm51bGwhPWE/ZD1cImN1c3RvbS10aW1lXCI6cy5oYXNQYXJlbnQoaCx0aGlzLmN1cnJlbnRUaW1lLmJhcik/ZD1cImN1cnJlbnQtdGltZVwiOnMuaGFzUGFyZW50KGgsdGhpcy5kb20uY2VudGVyKSYmKGQ9XCJiYWNrZ3JvdW5kXCIpO3ZhciBsPVtdLHU9dGhpcy5saW5lZ3JhcGgueUF4aXNMZWZ0LHA9dGhpcy5saW5lZ3JhcGgueUF4aXNSaWdodDtyZXR1cm4hdS5oaWRkZW4mJnRoaXMuaXRlbXNEYXRhLmxlbmd0aD4wJiZsLnB1c2godS5zY3JlZW5Ub1ZhbHVlKG4pKSwhcC5oaWRkZW4mJnRoaXMuaXRlbXNEYXRhLmxlbmd0aD4wJiZsLnB1c2gocC5zY3JlZW5Ub1ZhbHVlKG4pKSx7ZXZlbnQ6dCx3aGF0OmQscGFnZVg6dC5zcmNFdmVudD90LnNyY0V2ZW50LnBhZ2VYOnQucGFnZVgscGFnZVk6dC5zcmNFdmVudD90LnNyY0V2ZW50LnBhZ2VZOnQucGFnZVkseDpvLHk6bix0aW1lOnIsdmFsdWU6bH19LG8ucHJvdG90eXBlLl9jcmVhdGVDb25maWd1cmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGcodGhpcyx0aGlzLmRvbS5jb250YWluZXIsdil9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZS51dGlsPWkoMiksZS5ET011dGlsPWkoMTQpLGUuRGF0YVNldD1pKDExKSxlLkRhdGFWaWV3PWkoMTIpLGUuUXVldWU9aSg0MyksZS5OZXR3b3JrPWkoMTgyKSxlLm5ldHdvcms9e0ltYWdlczppKDExNiksZG90cGFyc2VyOmkoMTE0KSxnZXBoaVBhcnNlcjppKDExNSksYWxsT3B0aW9uczppKDEyMil9LGUubmV0d29yay5jb252ZXJ0RG90PWZ1bmN0aW9uKHQpe3JldHVybiBlLm5ldHdvcmsuZG90cGFyc2VyLkRPVFRvR3JhcGgodCl9LGUubmV0d29yay5jb252ZXJ0R2VwaGk9ZnVuY3Rpb24odCxpKXtyZXR1cm4gZS5uZXR3b3JrLmdlcGhpUGFyc2VyLnBhcnNlR2VwaGkodCxpKX0sZS5tb21lbnQ9aSg5KSxlLkhhbW1lcj1pKDEwKSxlLmtleWNoYXJtPWkoMzUpfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUsaSl7dmFyIG49dGhpcztpZighKHRoaXMgaW5zdGFuY2VvZiBvKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJDb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgb3BlcmF0b3JcIik7dGhpcy5vcHRpb25zPXt9LHRoaXMuZGVmYXVsdE9wdGlvbnM9e2xvY2FsZTpcImVuXCIsbG9jYWxlczpkLGNsaWNrVG9Vc2U6ITF9LHMuZXh0ZW5kKHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLmJvZHk9e2NvbnRhaW5lcjp0LG5vZGVzOnt9LG5vZGVJbmRpY2VzOltdLGVkZ2VzOnt9LGVkZ2VJbmRpY2VzOltdLGVtaXR0ZXI6e29uOnRoaXMub24uYmluZCh0aGlzKSxvZmY6dGhpcy5vZmYuYmluZCh0aGlzKSxlbWl0OnRoaXMuZW1pdC5iaW5kKHRoaXMpLG9uY2U6dGhpcy5vbmNlLmJpbmQodGhpcyl9LGV2ZW50TGlzdGVuZXJzOntvblRhcDpmdW5jdGlvbigpe30sb25Ub3VjaDpmdW5jdGlvbigpe30sb25Eb3VibGVUYXA6ZnVuY3Rpb24oKXt9LG9uSG9sZDpmdW5jdGlvbigpe30sb25EcmFnU3RhcnQ6ZnVuY3Rpb24oKXt9LG9uRHJhZzpmdW5jdGlvbigpe30sb25EcmFnRW5kOmZ1bmN0aW9uKCl7fSxvbk1vdXNlV2hlZWw6ZnVuY3Rpb24oKXt9LG9uUGluY2g6ZnVuY3Rpb24oKXt9LG9uTW91c2VNb3ZlOmZ1bmN0aW9uKCl7fSxvblJlbGVhc2U6ZnVuY3Rpb24oKXt9LG9uQ29udGV4dDpmdW5jdGlvbigpe319LGRhdGE6e25vZGVzOm51bGwsZWRnZXM6bnVsbH0sZnVuY3Rpb25zOntjcmVhdGVOb2RlOmZ1bmN0aW9uKCl7fSxjcmVhdGVFZGdlOmZ1bmN0aW9uKCl7fSxnZXRQb2ludGVyOmZ1bmN0aW9uKCl7fX0sbW9kdWxlczp7fSx2aWV3OntzY2FsZToxLHRyYW5zbGF0aW9uOnt4OjAseTowfX19LHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCksdGhpcy5pbWFnZXM9bmV3IGwoZnVuY3Rpb24oKXtyZXR1cm4gbi5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZXF1ZXN0UmVkcmF3XCIpfSksdGhpcy5ncm91cHM9bmV3IHUsdGhpcy5jYW52YXM9bmV3IGcodGhpcy5ib2R5KSx0aGlzLnNlbGVjdGlvbkhhbmRsZXI9bmV3IF8odGhpcy5ib2R5LHRoaXMuY2FudmFzKSx0aGlzLmludGVyYWN0aW9uSGFuZGxlcj1uZXcgYih0aGlzLmJvZHksdGhpcy5jYW52YXMsdGhpcy5zZWxlY3Rpb25IYW5kbGVyKSx0aGlzLnZpZXc9bmV3IHkodGhpcy5ib2R5LHRoaXMuY2FudmFzKSx0aGlzLnJlbmRlcmVyPW5ldyB2KHRoaXMuYm9keSx0aGlzLmNhbnZhcyksdGhpcy5waHlzaWNzPW5ldyBmKHRoaXMuYm9keSksdGhpcy5sYXlvdXRFbmdpbmU9bmV3IHcodGhpcy5ib2R5KSx0aGlzLmNsdXN0ZXJpbmc9bmV3IG0odGhpcy5ib2R5KSx0aGlzLm1hbmlwdWxhdGlvbj1uZXcgeCh0aGlzLmJvZHksdGhpcy5jYW52YXMsdGhpcy5zZWxlY3Rpb25IYW5kbGVyKSx0aGlzLm5vZGVzSGFuZGxlcj1uZXcgYyh0aGlzLmJvZHksdGhpcy5pbWFnZXMsdGhpcy5ncm91cHMsdGhpcy5sYXlvdXRFbmdpbmUpLHRoaXMuZWRnZXNIYW5kbGVyPW5ldyBwKHRoaXMuYm9keSx0aGlzLmltYWdlcyx0aGlzLmdyb3VwcyksdGhpcy5ib2R5Lm1vZHVsZXMua2FtYWRhS2F3YWk9bmV3IFQodGhpcy5ib2R5LDE1MCwuMDUpLHRoaXMuYm9keS5tb2R1bGVzLmNsdXN0ZXJpbmc9dGhpcy5jbHVzdGVyaW5nLHRoaXMuY2FudmFzLl9jcmVhdGUoKSx0aGlzLnNldE9wdGlvbnMoaSksdGhpcy5zZXREYXRhKGUpfWkoMTgzKTt2YXIgbj1pKDQ0KSxzPWkoMikscj1pKDExNCksYT1pKDExNSksaD1pKDk3KSxkPWkoMTg0KSxsPWkoMTE2KS5kZWZhdWx0LHU9aSgxODYpLmRlZmF1bHQsYz1pKDE4NykuZGVmYXVsdCxwPWkoMjE0KS5kZWZhdWx0LGY9aSgyMjApLmRlZmF1bHQsbT1pKDIyNykuZGVmYXVsdCx2PWkoMjI5KS5kZWZh
21167dWx0LGc9aSgyMzApLmRlZmF1bHQseT1pKDIzMSkuZGVmYXVsdCxiPWkoMjMyKS5kZWZhdWx0LF89aSgyMzQpLmRlZmF1bHQsdz1pKDIzNSkuZGVmYXVsdCx4PWkoMjM3KS5kZWZhdWx0LGs9aSg3MSkuZGVmYXVsdCxTPWkoMTUpLmRlZmF1bHQsRD1pKDE1KSxNPUQucHJpbnRTdHlsZSxDPWkoMTIyKSxPPUMuYWxsT3B0aW9ucyxFPUMuY29uZmlndXJlT3B0aW9ucyxUPWkoMjM4KS5kZWZhdWx0O24oby5wcm90b3R5cGUpLG8ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih2b2lkIDAhPT10KXshMD09PVMudmFsaWRhdGUodCxPKSYmY29uc29sZS5sb2coXCIlY0Vycm9ycyBoYXZlIGJlZW4gZm91bmQgaW4gdGhlIHN1cHBsaWVkIG9wdGlvbnMgb2JqZWN0LlwiLE0pO3ZhciBpPVtcImxvY2FsZVwiLFwibG9jYWxlc1wiLFwiY2xpY2tUb1VzZVwiXTtpZihzLnNlbGVjdGl2ZURlZXBFeHRlbmQoaSx0aGlzLm9wdGlvbnMsdCksdD10aGlzLmxheW91dEVuZ2luZS5zZXRPcHRpb25zKHQubGF5b3V0LHQpLHRoaXMuY2FudmFzLnNldE9wdGlvbnModCksdGhpcy5ncm91cHMuc2V0T3B0aW9ucyh0Lmdyb3VwcyksdGhpcy5ub2Rlc0hhbmRsZXIuc2V0T3B0aW9ucyh0Lm5vZGVzKSx0aGlzLmVkZ2VzSGFuZGxlci5zZXRPcHRpb25zKHQuZWRnZXMpLHRoaXMucGh5c2ljcy5zZXRPcHRpb25zKHQucGh5c2ljcyksdGhpcy5tYW5pcHVsYXRpb24uc2V0T3B0aW9ucyh0Lm1hbmlwdWxhdGlvbix0LHRoaXMub3B0aW9ucyksdGhpcy5pbnRlcmFjdGlvbkhhbmRsZXIuc2V0T3B0aW9ucyh0LmludGVyYWN0aW9uKSx0aGlzLnJlbmRlcmVyLnNldE9wdGlvbnModC5pbnRlcmFjdGlvbiksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnNldE9wdGlvbnModC5pbnRlcmFjdGlvbiksdm9pZCAwIT09dC5ncm91cHMmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJyZWZyZXNoTm9kZXNcIiksXCJjb25maWd1cmVcImluIHQmJih0aGlzLmNvbmZpZ3VyYXRvcnx8KHRoaXMuY29uZmlndXJhdG9yPW5ldyBrKHRoaXMsdGhpcy5ib2R5LmNvbnRhaW5lcixFLHRoaXMuY2FudmFzLnBpeGVsUmF0aW8pKSx0aGlzLmNvbmZpZ3VyYXRvci5zZXRPcHRpb25zKHQuY29uZmlndXJlKSksdGhpcy5jb25maWd1cmF0b3ImJiEwPT09dGhpcy5jb25maWd1cmF0b3Iub3B0aW9ucy5lbmFibGVkKXt2YXIgbz17bm9kZXM6e30sZWRnZXM6e30sbGF5b3V0Ont9LGludGVyYWN0aW9uOnt9LG1hbmlwdWxhdGlvbjp7fSxwaHlzaWNzOnt9LGdsb2JhbDp7fX07cy5kZWVwRXh0ZW5kKG8ubm9kZXMsdGhpcy5ub2Rlc0hhbmRsZXIub3B0aW9ucykscy5kZWVwRXh0ZW5kKG8uZWRnZXMsdGhpcy5lZGdlc0hhbmRsZXIub3B0aW9ucykscy5kZWVwRXh0ZW5kKG8ubGF5b3V0LHRoaXMubGF5b3V0RW5naW5lLm9wdGlvbnMpLHMuZGVlcEV4dGVuZChvLmludGVyYWN0aW9uLHRoaXMuc2VsZWN0aW9uSGFuZGxlci5vcHRpb25zKSxzLmRlZXBFeHRlbmQoby5pbnRlcmFjdGlvbix0aGlzLnJlbmRlcmVyLm9wdGlvbnMpLHMuZGVlcEV4dGVuZChvLmludGVyYWN0aW9uLHRoaXMuaW50ZXJhY3Rpb25IYW5kbGVyLm9wdGlvbnMpLHMuZGVlcEV4dGVuZChvLm1hbmlwdWxhdGlvbix0aGlzLm1hbmlwdWxhdGlvbi5vcHRpb25zKSxzLmRlZXBFeHRlbmQoby5waHlzaWNzLHRoaXMucGh5c2ljcy5vcHRpb25zKSxzLmRlZXBFeHRlbmQoby5nbG9iYWwsdGhpcy5jYW52YXMub3B0aW9ucykscy5kZWVwRXh0ZW5kKG8uZ2xvYmFsLHRoaXMub3B0aW9ucyksdGhpcy5jb25maWd1cmF0b3Iuc2V0TW9kdWxlT3B0aW9ucyhvKX12b2lkIDAhPT10LmNsaWNrVG9Vc2U/ITA9PT10LmNsaWNrVG9Vc2U/dm9pZCAwPT09dGhpcy5hY3RpdmF0b3ImJih0aGlzLmFjdGl2YXRvcj1uZXcgaCh0aGlzLmNhbnZhcy5mcmFtZSksdGhpcy5hY3RpdmF0b3Iub24oXCJjaGFuZ2VcIixmdW5jdGlvbigpe2UuYm9keS5lbWl0dGVyLmVtaXQoXCJhY3RpdmF0ZVwiKX0pKToodm9pZCAwIT09dGhpcy5hY3RpdmF0b3ImJih0aGlzLmFjdGl2YXRvci5kZXN0cm95KCksZGVsZXRlIHRoaXMuYWN0aXZhdG9yKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiYWN0aXZhdGVcIikpOnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJhY3RpdmF0ZVwiKSx0aGlzLmNhbnZhcy5zZXRTaXplKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInN0YXJ0U2ltdWxhdGlvblwiKX19LG8ucHJvdG90eXBlLl91cGRhdGVWaXNpYmxlSW5kaWNlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYm9keS5ub2RlcyxlPXRoaXMuYm9keS5lZGdlczt0aGlzLmJvZHkubm9kZUluZGljZXM9W10sdGhpcy5ib2R5LmVkZ2VJbmRpY2VzPVtdO2Zvcih2YXIgaSBpbiB0KXQuaGFzT3duUHJvcGVydHkoaSkmJih0aGlzLmNsdXN0ZXJpbmcuX2lzQ2x1c3RlcmVkTm9kZShpKXx8ITEhPT10W2ldLm9wdGlvbnMuaGlkZGVufHx0aGlzLmJvZHkubm9kZUluZGljZXMucHVzaCh0W2ldLmlkKSk7Zm9yKHZhciBvIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShvKSl7dmFyIG49ZVtvXSxzPXRbbi5mcm9tSWRdLHI9dFtuLnRvSWRdLGE9dm9pZCAwIT09cyYmdm9pZCAwIT09cixoPSF0aGlzLmNsdXN0ZXJpbmcuX2lzQ2x1c3RlcmVkRWRnZShvKSYmITE9PT1uLm9wdGlvbnMuaGlkZGVuJiZhJiYhMT09PXMub3B0aW9ucy5oaWRkZW4mJiExPT09ci5vcHRpb25zLmhpZGRlbjtoJiZ0aGlzLmJvZHkuZWRnZUluZGljZXMucHVzaChuLmlkKX19LG8ucHJvdG90eXBlLmJpbmRFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5ib2R5LmVtaXR0ZXIub24oXCJfZGF0YUNoYW5nZWRcIixmdW5jdGlvbigpe3QuZWRnZXNIYW5kbGVyLl91cGRhdGVTdGF0ZSgpLHQuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YVVwZGF0ZWRcIil9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIl9kYXRhVXBkYXRlZFwiLGZ1bmN0aW9uKCl7dC5jbHVzdGVyaW5nLl91cGRhdGVTdGF0ZSgpLHQuX3VwZGF0ZVZpc2libGVJbmRpY2VzKCksdC5fdXBkYXRlVmFsdWVSYW5nZSh0LmJvZHkubm9kZXMpLHQuX3VwZGF0ZVZhbHVlUmFuZ2UodC5ib2R5LmVkZ2VzKSx0LmJvZHkuZW1pdHRlci5lbWl0KFwic3RhcnRTaW11bGF0aW9uXCIpLHQuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVxdW
21167VzdFJlZHJhd1wiKX0pfSxvLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe2lmKHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJyZXNldFBoeXNpY3NcIiksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZXNldERhdGFcIiksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnVuc2VsZWN0QWxsKCksdCYmdC5kb3QmJih0Lm5vZGVzfHx0LmVkZ2VzKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0RhdGEgbXVzdCBjb250YWluIGVpdGhlciBwYXJhbWV0ZXIgXCJkb3RcIiBvciAgcGFyYW1ldGVyIHBhaXIgXCJub2Rlc1wiIGFuZCBcImVkZ2VzXCIsIGJ1dCBub3QgYm90aC4nKTtpZih0aGlzLnNldE9wdGlvbnModCYmdC5vcHRpb25zKSx0JiZ0LmRvdCl7Y29uc29sZS5sb2coXCJUaGUgZG90IHByb3BlcnR5IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIHN0YXRpYyBjb252ZXJ0RG90IG1ldGhvZCB0byBjb252ZXJ0IERPVCBpbnRvIHZpcy5uZXR3b3JrIGZvcm1hdCBhbmQgdXNlIHRoZSBub3JtYWwgZGF0YSBmb3JtYXQgd2l0aCBub2RlcyBhbmQgZWRnZXMuIFRoaXMgY29udmVydGVyIGlzIHVzZWQgbGlrZSB0aGlzOiB2YXIgZGF0YSA9IHZpcy5uZXR3b3JrLmNvbnZlcnREb3QoZG90U3RyaW5nKTtcIik7dmFyIGU9ci5ET1RUb0dyYXBoKHQuZG90KTtyZXR1cm4gdm9pZCB0aGlzLnNldERhdGEoZSl9aWYodCYmdC5nZXBoaSl7Y29uc29sZS5sb2coXCJUaGUgZ2VwaGkgcHJvcGVydHkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgc3RhdGljIGNvbnZlcnRHZXBoaSBtZXRob2QgdG8gY29udmVydCBnZXBoaSBpbnRvIHZpcy5uZXR3b3JrIGZvcm1hdCBhbmQgdXNlIHRoZSBub3JtYWwgZGF0YSBmb3JtYXQgd2l0aCBub2RlcyBhbmQgZWRnZXMuIFRoaXMgY29udmVydGVyIGlzIHVzZWQgbGlrZSB0aGlzOiB2YXIgZGF0YSA9IHZpcy5uZXR3b3JrLmNvbnZlcnRHZXBoaShnZXBoaUpzb24pO1wiKTt2YXIgaT1hLnBhcnNlR2VwaGkodC5nZXBoaSk7cmV0dXJuIHZvaWQgdGhpcy5zZXREYXRhKGkpfXRoaXMubm9kZXNIYW5kbGVyLnNldERhdGEodCYmdC5ub2RlcywhMCksdGhpcy5lZGdlc0hhbmRsZXIuc2V0RGF0YSh0JiZ0LmVkZ2VzLCEwKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2RhdGFDaGFuZ2VkXCIpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUxvYWRlZFwiKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiaW5pdFBoeXNpY3NcIil9LG8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiZGVzdHJveVwiKSx0aGlzLmJvZHkuZW1pdHRlci5vZmYoKSx0aGlzLm9mZigpLGRlbGV0ZSB0aGlzLmdyb3VwcyxkZWxldGUgdGhpcy5jYW52YXMsZGVsZXRlIHRoaXMuc2VsZWN0aW9uSGFuZGxlcixkZWxldGUgdGhpcy5pbnRlcmFjdGlvbkhhbmRsZXIsZGVsZXRlIHRoaXMudmlldyxkZWxldGUgdGhpcy5yZW5kZXJlcixkZWxldGUgdGhpcy5waHlzaWNzLGRlbGV0ZSB0aGlzLmxheW91dEVuZ2luZSxkZWxldGUgdGhpcy5jbHVzdGVyaW5nLGRlbGV0ZSB0aGlzLm1hbmlwdWxhdGlvbixkZWxldGUgdGhpcy5ub2Rlc0hhbmRsZXIsZGVsZXRlIHRoaXMuZWRnZXNIYW5kbGVyLGRlbGV0ZSB0aGlzLmNvbmZpZ3VyYXRvcixkZWxldGUgdGhpcy5pbWFnZXM7Zm9yKHZhciB0IGluIHRoaXMuYm9keS5ub2Rlcyl0aGlzLmJvZHkubm9kZXMuaGFzT3duUHJvcGVydHkodCkmJmRlbGV0ZSB0aGlzLmJvZHkubm9kZXNbdF07Zm9yKHZhciBlIGluIHRoaXMuYm9keS5lZGdlcyl0aGlzLmJvZHkuZWRnZXMuaGFzT3duUHJvcGVydHkoZSkmJmRlbGV0ZSB0aGlzLmJvZHkuZWRnZXNbZV07cy5yZWN1cnNpdmVET01EZWxldGUodGhpcy5ib2R5LmNvbnRhaW5lcil9LG8ucHJvdG90eXBlLl91cGRhdGVWYWx1ZVJhbmdlPWZ1bmN0aW9uKHQpe3ZhciBlLGk9dm9pZCAwLG89dm9pZCAwLG49MDtmb3IoZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpe3ZhciBzPXRbZV0uZ2V0VmFsdWUoKTt2b2lkIDAhPT1zJiYoaT12b2lkIDA9PT1pP3M6TWF0aC5taW4ocyxpKSxvPXZvaWQgMD09PW8/czpNYXRoLm1heChzLG8pLG4rPXMpfWlmKHZvaWQgMCE9PWkmJnZvaWQgMCE9PW8pZm9yKGUgaW4gdCl0Lmhhc093blByb3BlcnR5KGUpJiZ0W2VdLnNldFZhbHVlUmFuZ2UoaSxvLG4pfSxvLnByb3RvdHlwZS5pc0FjdGl2ZT1mdW5jdGlvbigpe3JldHVybiF0aGlzLmFjdGl2YXRvcnx8dGhpcy5hY3RpdmF0b3IuYWN0aXZlfSxvLnByb3RvdHlwZS5zZXRTaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FudmFzLnNldFNpemUuYXBwbHkodGhpcy5jYW52YXMsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuY2FudmFzVG9ET009ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW52YXMuY2FudmFzVG9ET00uYXBwbHkodGhpcy5jYW52YXMsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuRE9NdG9DYW52YXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW52YXMuRE9NdG9DYW52YXMuYXBwbHkodGhpcy5jYW52YXMsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZmluZE5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLmZpbmROb2RlLmFwcGx5KHRoaXMuY2x1c3RlcmluZyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5pc0NsdXN0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLmlzQ2x1c3Rlci5hcHBseSh0aGlzLmNsdXN0ZXJpbmcsYXJndW1lbnRzKX0sby5wcm90b3R5cGUub3BlbkNsdXN0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLm9wZW5DbHVzdGVyLmFwcGx5KHRoaXMuY2x1c3RlcmluZyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5jbHVzdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2x1c3RlcmluZy5jbHVzdGVyLmFwcGx5KHRoaXMuY2x1c3RlcmluZyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5nZXROb2Rlc0luQ2x1c3Rlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNsdXN0ZXJpbmcuZ2V0Tm9kZXNJbkNsdXN0ZXIuYXBwbHkodGhpcy5jbHVzdGVyaW5nLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmNsdXN0ZXJCeUNvbm5lY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLmNsdXN0ZXJCeUNvbm5lY3Rpb24uYXBwbHkodGhpcy5jbHVzdGVyaW5nLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmNsdXN0ZXJCeUh1YnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLmNsdXN0ZXJCeUh1YnNpemUuYXBwbHkodGhpcy5jbHVzdGVyaW5nLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmNsdXN0ZXJPdXRsaWVycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNsdXN0ZXJpbmcuY2x1c3Rlck91dGxpZXJzLmFwcGx5KHRoaXMuY2x1c3RlcmluZyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5nZXRTZWVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5b3V0RW5naW5lLmdldFNlZWQuYXBwbHkodGhpcy5sYXlvdXRFbmdpbmUsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZW5hYmxlRWRpdE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYW5pcHVsYXRpb24uZW5hYmxlRWRpdE1vZGUuYXBwbHkodGhpcy5tYW5pcHVsYXRpb24sYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZGlzYWJsZUVkaXRNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFuaXB1bGF0aW9uLmRpc2FibGVFZGl0TW9kZS5hcHBseSh0aGlzLm1hbmlwdWxhdGlvbixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5hZGROb2RlTW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hbmlwdWxhdGlvbi5hZGROb2RlTW9kZS5hcHBseSh0aGlzLm1hbmlwdWxhdGlvbixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5lZGl0Tm9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hbmlwdWxhdGlvbi5lZGl0Tm9kZS5hcHBseSh0aGlzLm1hbmlwdWxhdGlvbixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5lZGl0Tm9kZU1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS5sb2coXCJEZXByZWNhdGVkOiBQbGVhc2UgdXNlIGVkaXROb2RlIGluc3RlYWQgb2YgZWRpdE5vZGVNb2RlLlwiKSx0aGlzLm1hbmlwdWxhdGlvbi5lZGl0Tm9kZS5hcHBseSh0aGlzLm1hbmlwdWxhdGlvbixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5hZGRFZGdlTW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hbmlwdWxhdGlvbi5hZGRFZGdlTW9kZS5hcHBseSh0aGlzLm1hbmlwdWxhdGlvbixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5lZGl0RWRnZU1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYW5pcHVsYXRpb24uZWRpdEVkZ2VNb2RlLmFwcGx5KHRoaXMubWFuaXB1bGF0aW9uLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmRlbGV0ZVNlbGVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFuaXB1bGF0aW9uLmRlbGV0ZVNlbGVjdGVkLmFwcGx5KHRoaXMubWFuaXB1bGF0aW9uLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmdldFBvc2l0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVzSGFuZGxlci5nZXRQb3NpdGlvbnMuYXBwbHkodGhpcy5ub2Rlc0hhbmRsZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuc3RvcmVQb3NpdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2Rlc0hhbmRsZXIuc3RvcmVQb3NpdGlvbnMuYXBwbHkodGhpcy5ub2Rlc0hhbmRsZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUubW92ZU5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2Rlc0hhbmRsZXIubW92ZU5vZGUuYXBwbHkodGhpcy5ub2Rlc0hhbmRsZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZ2V0Qm91bmRpbmdCb3g9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2Rlc0hhbmRsZXIuZ2V0Qm91bmRpbmdCb3guYXBwbHkodGhpcy5ub2Rlc0hhbmRsZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZ2V0Q29ubmVjdGVkTm9kZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0XT90aGlzLm5vZGVzSGFuZGxlci5nZXRDb25uZWN0ZWROb2Rlcy5hcHBseSh0aGlzLm5vZGVzSGFuZGxlcixhcmd1bWVudHMpOnRoaXMuZWRnZXNIYW5kbGVyLmdldENvbm5lY3RlZE5vZGVzLmFwcGx5KHRoaXMuZWRnZXNIYW5kbGVyLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmdldENvbm5lY3RlZEVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZXNIYW5kbGVyLmdldENvbm5lY3RlZEVkZ2VzLmFwcGx5KHRoaXMubm9kZXNIYW5kbGVyLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLnN0YXJ0U2ltdWxhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBoeXNpY3Muc3RhcnRTaW11bGF0aW9uLmFwcGx5KHRoaXMucGh5c2ljcyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5zdG9wU2ltdWxhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBoeXNpY3Muc3RvcFNpbXVsYXRpb24uYXBwbHkodGhpcy5waHlzaWNzLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLnN0YWJpbGl6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBoeXNpY3Muc3RhYmlsaXplLmFwcGx5KHRoaXMucGh5c2ljcyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5nZXRTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGlvbi5hcHBseSh0aGlzLnNlbGVjdGlvbkhhbmRsZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuc2V0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uSGFuZGxlci5zZXRTZWxlY3Rpb24uYXBwbHkodGhpcy5zZWxlY3Rpb25IYW5kbGVyLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmdldFNlbGVjdGVkTm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGVkTm9kZXMuYXBwbHkodGhpcy5zZWxlY3Rpb25IYW5kbGVyLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmdldFNlbGVjdGVkRWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGVkRWRnZXMuYXBwbHkodGhpcy5zZWxlY3Rpb25IYW5kbGVyLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmdldE5vZGVBdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc2VsZWN0aW9uSGFuZGxlci5nZXROb2RlQXQuYXBwbHkodGhpcy5zZWxlY3Rpb25IYW5kbGVyLGFyZ3VtZW50cyk7cmV0dXJuIHZvaWQgMCE9PXQmJnZvaWQgMCE9PXQuaWQ/dC5pZDp0fSxvLnByb3RvdHlwZS5nZXRFZGdlQXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnNlbGVjdGlvbkhhbmRsZXIuZ2V0RWRnZUF0LmFwcGx5KHRoaXMuc2VsZWN0aW9uSGFuZGxlcixhcmd1bWVudHMpO3JldHVybiB2b2lkIDAhPT10JiZ2b2lkIDAhPT10LmlkP3QuaWQ6dH0sby5wcm90b3R5cGUuc2VsZWN0Tm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnNlbGVjdE5vZGVzLmFwcGx5KHRoaXMuc2VsZWN0aW9uSGFuZGxlcixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5zZWxlY3RFZGdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbkhhbmRsZXIuc2VsZWN0RWRnZXMuYXBwbHkodGhpcy5zZWxlY3Rpb25IYW5kbGVyLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLnVuc2VsZWN0QWxsPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb25IYW5kbGVyLnVuc2VsZWN0QWxsLmFwcGx5KHRoaXMuc2VsZWN0aW9uSGFuZGxlcixhcmd1bWVudHMpLHRoaXMucmVkcmF3KCl9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLnJlZHJhdy5hcHBseSh0aGlzLnJlbmRlcmVyLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmdldFNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlldy5nZXRTY2FsZS5hcHBseSh0aGlzLnZpZXcsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZ2V0Vmlld1Bvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlldy5nZXRWaWV3UG9zaXRpb24uY
21167XBwbHkodGhpcy52aWV3LGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmZpdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXcuZml0LmFwcGx5KHRoaXMudmlldyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5tb3ZlVG89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWV3Lm1vdmVUby5hcHBseSh0aGlzLnZpZXcsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZm9jdXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWV3LmZvY3VzLmFwcGx5KHRoaXMudmlldyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5yZWxlYXNlTm9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXcucmVsZWFzZU5vZGUuYXBwbHkodGhpcy52aWV3LGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmdldE9wdGlvbnNGcm9tQ29uZmlndXJhdG9yPWZ1bmN0aW9uKCl7dmFyIHQ9e307cmV0dXJuIHRoaXMuY29uZmlndXJhdG9yJiYodD10aGlzLmNvbmZpZ3VyYXRvci5nZXRPcHRpb25zLmFwcGx5KHRoaXMuY29uZmlndXJhdG9yKSksdH0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtcInVuZGVmaW5lZFwiIT10eXBlb2YgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEJiYoQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnByb3RvdHlwZS5jaXJjbGU9ZnVuY3Rpb24odCxlLGkpe3RoaXMuYmVnaW5QYXRoKCksdGhpcy5hcmModCxlLGksMCwyKk1hdGguUEksITEpLHRoaXMuY2xvc2VQYXRoKCl9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuc3F1YXJlPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmJlZ2luUGF0aCgpLHRoaXMucmVjdCh0LWksZS1pLDIqaSwyKmkpLHRoaXMuY2xvc2VQYXRoKCl9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUudHJpYW5nbGU9ZnVuY3Rpb24odCxlLGkpe3RoaXMuYmVnaW5QYXRoKCksaSo9MS4xNSxlKz0uMjc1Kmk7dmFyIG89MippLG49by8yLHM9TWF0aC5zcXJ0KDMpLzYqbyxyPU1hdGguc3FydChvKm8tbipuKTt0aGlzLm1vdmVUbyh0LGUtKHItcykpLHRoaXMubGluZVRvKHQrbixlK3MpLHRoaXMubGluZVRvKHQtbixlK3MpLHRoaXMubGluZVRvKHQsZS0oci1zKSksdGhpcy5jbG9zZVBhdGgoKX0sQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnByb3RvdHlwZS50cmlhbmdsZURvd249ZnVuY3Rpb24odCxlLGkpe3RoaXMuYmVnaW5QYXRoKCksaSo9MS4xNSxlLT0uMjc1Kmk7dmFyIG89MippLG49by8yLHM9TWF0aC5zcXJ0KDMpLzYqbyxyPU1hdGguc3FydChvKm8tbipuKTt0aGlzLm1vdmVUbyh0LGUrKHItcykpLHRoaXMubGluZVRvKHQrbixlLXMpLHRoaXMubGluZVRvKHQtbixlLXMpLHRoaXMubGluZVRvKHQsZSsoci1zKSksdGhpcy5jbG9zZVBhdGgoKX0sQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnByb3RvdHlwZS5zdGFyPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmJlZ2luUGF0aCgpLGkqPS44MixlKz0uMSppO2Zvcih2YXIgbz0wO288MTA7bysrKXt2YXIgbj1vJTI9PTA/MS4zKmk6LjUqaTt0aGlzLmxpbmVUbyh0K24qTWF0aC5zaW4oMipvKk1hdGguUEkvMTApLGUtbipNYXRoLmNvcygyKm8qTWF0aC5QSS8xMCkpfXRoaXMuY2xvc2VQYXRoKCl9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuZGlhbW9uZD1mdW5jdGlvbih0LGUsaSl7dGhpcy5iZWdpblBhdGgoKSx0aGlzLmxpbmVUbyh0LGUraSksdGhpcy5saW5lVG8odCtpLGUpLHRoaXMubGluZVRvKHQsZS1pKSx0aGlzLmxpbmVUbyh0LWksZSksdGhpcy5jbG9zZVBhdGgoKX0sQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnByb3RvdHlwZS5yb3VuZFJlY3Q9ZnVuY3Rpb24odCxlLGksbyxuKXt2YXIgcz1NYXRoLlBJLzE4MDtpLTIqbjwwJiYobj1pLzIpLG8tMipuPDAmJihuPW8vMiksdGhpcy5iZWdpblBhdGgoKSx0aGlzLm1vdmVUbyh0K24sZSksdGhpcy5saW5lVG8odCtpLW4sZSksdGhpcy5hcmModCtpLW4sZStuLG4sMjcwKnMsMzYwKnMsITEpLHRoaXMubGluZVRvKHQraSxlK28tbiksdGhpcy5hcmModCtpLW4sZStvLW4sbiwwLDkwKnMsITEpLHRoaXMubGluZVRvKHQrbixlK28pLHRoaXMuYXJjKHQrbixlK28tbixuLDkwKnMsMTgwKnMsITEpLHRoaXMubGluZVRvKHQsZStuKSx0aGlzLmFyYyh0K24sZStuLG4sMTgwKnMsMjcwKnMsITEpLHRoaXMuY2xvc2VQYXRoKCl9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuZWxsaXBzZV92aXM9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49aS8yKi41NTIyODQ4LHM9by8yKi41NTIyODQ4LHI9dCtpLGE9ZStvLGg9dCtpLzIsZD1lK28vMjt0aGlzLmJlZ2luUGF0aCgpLHRoaXMubW92ZVRvKHQsZCksdGhpcy5iZXppZXJDdXJ2ZVRvKHQsZC1zLGgtbixlLGgsZSksdGhpcy5iZXppZXJDdXJ2ZVRvKGgrbixlLHIsZC1zLHIsZCksdGhpcy5iZXppZXJDdXJ2ZVRvKHIsZCtzLGgrbixhLGgsYSksdGhpcy5iZXppZXJDdXJ2ZVRvKGgtbixhLHQsZCtzLHQsZCksdGhpcy5jbG9zZVBhdGgoKX0sQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnByb3RvdHlwZS5kYXRhYmFzZT1mdW5jdGlvbih0LGUsaSxvKXt2YXIgbj1pLHM9byooMS8zKSxyPW4vMiouNTUyMjg0OCxhPXMvMiouNTUyMjg0OCxoPXQrbixkPWUrcyxsPXQrbi8yLHU9ZStzLzIsYz1lKyhvLXMvMikscD1lK287dGhpcy5iZWdpblBhdGgoKSx0aGlzLm1vdmVUbyhoLHUpLHRoaXMuYmV6aWVyQ3VydmVUbyhoLHUrYSxsK3IsZCxsLGQpLHRoaXMuYmV6aWVyQ3VydmVUbyhsLXIsZCx0LHUrYSx0LHUpLHRoaXMuYmV6aWVyQ3VydmVUbyh0LHUtYSxsLXIsZSxsLGUpLHRoaXMuYmV6aWVyQ3VydmVUbyhsK3IsZSxoLHUtYSxoLHUpLHRoaXMubGluZVRvKGgsYyksdGhpcy5iZXppZXJDdXJ2ZVRvKGgsYythLGwrcixwLGwscCksdGhpcy5iZXppZXJDdXJ2ZVRvKGwtcixwLHQsYythLHQsYyksdGhpcy5saW5lVG8odCx1KX0sQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnByb3RvdHlwZS5kYXNoZWRMaW5lPWZ1bmN0aW9uKHQsZSxpLG8sbil7dGhpcy5iZWdpblBhdGgoKSx0aGlzLm1vdmVUbyh0LGUpO2Zvcih2YXIgcz1uLmxlbmd0aCxyPWktdCxhPW8tZSxoPWEvcixkPU1hdGguc3FydChyKnIrYSphKSxsPTAsdT0hMCxjPTAscD1uWzBdO2Q+PS4xOylwPW5bbCsrJXNdLHA+ZCYmKHA9ZCksYz1NYXRoLnNxcnQ
21167ocCpwLygxK2gqaCkpLGM9cjwwPy1jOmMsdCs9YyxlKz1oKmMsITA9PT11P3RoaXMubGluZVRvKHQsZSk6dGhpcy5tb3ZlVG8odCxlKSxkLT1wLHU9IXV9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuaGV4YWdvbj1mdW5jdGlvbih0LGUsaSl7dGhpcy5iZWdpblBhdGgoKTt2YXIgbz0yKk1hdGguUEkvNjt0aGlzLm1vdmVUbyh0K2ksZSk7Zm9yKHZhciBuPTE7bjw2O24rKyl0aGlzLmxpbmVUbyh0K2kqTWF0aC5jb3MobypuKSxlK2kqTWF0aC5zaW4obypuKSk7dGhpcy5jbG9zZVBhdGgoKX0pfSxmdW5jdGlvbih0LGUsaSl7ZS5lbj17ZWRpdDpcIkVkaXRcIixkZWw6XCJEZWxldGUgc2VsZWN0ZWRcIixiYWNrOlwiQmFja1wiLGFkZE5vZGU6XCJBZGQgTm9kZVwiLGFkZEVkZ2U6XCJBZGQgRWRnZVwiLGVkaXROb2RlOlwiRWRpdCBOb2RlXCIsZWRpdEVkZ2U6XCJFZGl0IEVkZ2VcIixhZGREZXNjcmlwdGlvbjpcIkNsaWNrIGluIGFuIGVtcHR5IHNwYWNlIHRvIHBsYWNlIGEgbmV3IG5vZGUuXCIsZWRnZURlc2NyaXB0aW9uOlwiQ2xpY2sgb24gYSBub2RlIGFuZCBkcmFnIHRoZSBlZGdlIHRvIGFub3RoZXIgbm9kZSB0byBjb25uZWN0IHRoZW0uXCIsZWRpdEVkZ2VEZXNjcmlwdGlvbjpcIkNsaWNrIG9uIHRoZSBjb250cm9sIHBvaW50cyBhbmQgZHJhZyB0aGVtIHRvIGEgbm9kZSB0byBjb25uZWN0IHRvIGl0LlwiLGNyZWF0ZUVkZ2VFcnJvcjpcIkNhbm5vdCBsaW5rIGVkZ2VzIHRvIGEgY2x1c3Rlci5cIixkZWxldGVDbHVzdGVyRXJyb3I6XCJDbHVzdGVycyBjYW5ub3QgYmUgZGVsZXRlZC5cIixlZGl0Q2x1c3RlckVycm9yOlwiQ2x1c3RlcnMgY2Fubm90IGJlIGVkaXRlZC5cIn0sZS5lbl9FTj1lLmVuLGUuZW5fVVM9ZS5lbixlLmRlPXtlZGl0OlwiRWRpdGllcmVuXCIsZGVsOlwiTMODwrZzY2hlIEF1c3dhaGxcIixiYWNrOlwiWnVyw4PCvGNrXCIsYWRkTm9kZTpcIktub3RlbiBoaW56dWbDg8K8Z2VuXCIsYWRkRWRnZTpcIkthbnRlIGhpbnp1ZsODwrxnZW5cIixlZGl0Tm9kZTpcIktub3RlbiBlZGl0aWVyZW5cIixlZGl0RWRnZTpcIkthbnRlIGVkaXRpZXJlblwiLGFkZERlc2NyaXB0aW9uOlwiS2xpY2tlIGF1ZiBlaW5lIGZyZWllIFN0ZWxsZSwgdW0gZWluZW4gbmV1ZW4gS25vdGVuIHp1IHBsYXppZXJlbi5cIixlZGdlRGVzY3JpcHRpb246XCJLbGlja2UgYXVmIGVpbmVuIEtub3RlbiB1bmQgemllaGUgZGllIEthbnRlIHp1IGVpbmVtIGFuZGVyZW4gS25vdGVuLCB1bSBkaWVzZSB6dSB2ZXJiaW5kZW4uXCIsZWRpdEVkZ2VEZXNjcmlwdGlvbjpcIktsaWNrZSBhdWYgZGllIFZlcmJpbmR1bmdzcHVua3RlIHVuZCB6aWVoZSBkaWVzZSBhdWYgZWluZW4gS25vdGVuLCB1bSBzaWUgenUgdmVyYmluZGVuLlwiLGNyZWF0ZUVkZ2VFcnJvcjpcIkVzIGlzdCBuaWNodCBtw4PCtmdsaWNoLCBLYW50ZW4gbWl0IENsdXN0ZXJuIHp1IHZlcmJpbmRlbi5cIixkZWxldGVDbHVzdGVyRXJyb3I6XCJDbHVzdGVyIGvDg8K2bm5lbiBuaWNodCBnZWzDg8K2c2NodCB3ZXJkZW4uXCIsZWRpdENsdXN0ZXJFcnJvcjpcIkNsdXN0ZXIga8ODwrZubmVuIG5pY2h0IGVkaXRpZXJ0IHdlcmRlbi5cIn0sZS5kZV9ERT1lLmRlLGUuZXM9e2VkaXQ6XCJFZGl0YXJcIixkZWw6XCJFbGltaW5hciBzZWxlY2Npw4PCs25cIixiYWNrOlwiw4PCgXRyYXNcIixhZGROb2RlOlwiQcODwrFhZGlyIG5vZG9cIixhZGRFZGdlOlwiQcODwrFhZGlyIGFyaXN0YVwiLGVkaXROb2RlOlwiRWRpdGFyIG5vZG9cIixlZGl0RWRnZTpcIkVkaXRhciBhcmlzdGFcIixhZGREZXNjcmlwdGlvbjpcIkhhZ2EgY2xpYyBlbiB1biBsdWdhciB2YWPDg8KtbyBwYXJhIGNvbG9jYXIgdW4gbnVldm8gbm9kby5cIixlZGdlRGVzY3JpcHRpb246XCJIYWdhIGNsaWMgZW4gdW4gbm9kbyB5IGFycmFzdHJlIGxhIGFyaXN0YSBoYWNpYSBvdHJvIG5vZG8gcGFyYSBjb25lY3Rhcmxvcy5cIixlZGl0RWRnZURlc2NyaXB0aW9uOlwiSGFnYSBjbGljIGVuIHVuIHB1bnRvIGRlIGNvbnRyb2wgeSBhcnJhc3RyZWxvIGEgdW4gbm9kbyBwYXJhIGNvbmVjdGFybG8uXCIsY3JlYXRlRWRnZUVycm9yOlwiTm8gc2UgcHVlZGUgY29uZWN0YXIgdW5hIGFyaXN0YSBhIHVuIGdydXBvLlwiLGRlbGV0ZUNsdXN0ZXJFcnJvcjpcIk5vIGVzIHBvc2libGUgZWxpbWluYXIgZ3J1cG9zLlwiLGVkaXRDbHVzdGVyRXJyb3I6XCJObyBlcyBwb3NpYmxlIGVkaXRhciBncnVwb3MuXCJ9LGUuZXNfRVM9ZS5lcyxlLml0PXtlZGl0OlwiTW9kaWZpY2FcIixkZWw6XCJDYW5jZWxsYSBsYSBzZWxlemlvbmVcIixiYWNrOlwiSW5kaWV0cm9cIixhZGROb2RlOlwiQWdnaXVuZ2kgdW4gbm9kb1wiLGFkZEVkZ2U6XCJBZ2dpdW5naSB1biB2ZXJ0aWNlXCIsZWRpdE5vZGU6XCJNb2RpZmljYSBpbCBub2RvXCIsZWRpdEVkZ2U6XCJNb2RpZmljYSBpbCB2ZXJ0aWNlXCIsYWRkRGVzY3JpcHRpb246XCJDbGljY2EgcGVyIGFnZ2l1bmdlcmUgdW4gbnVvdm8gbm9kb1wiLGVkZ2VEZXNjcmlwdGlvbjpcIkNsaWNjYSBzdSB1biBub2RvIGUgdHJhc2NpbmFsbyBhZCB1biBhbHRybyBub2RvIHBlciBjb25uZXR0ZXJsaS5cIixlZGl0RWRnZURlc2NyaXB0aW9uOlwiQ2xpY2NhIHN1aSBQdW50aSBkaSBjb250cm9sbG8gZSB0cmFzY2luYWxpIGFkIHVuIG5vZG8gcGVyIGNvbm5ldHRlcmxpLlwiLGNyZWF0ZUVkZ2VFcnJvcjpcIk5vbiBzaSBwb3Nzb25vIGNvbGxlZ2FyZSB2ZXJ0aWNpIGFkIHVuIGNsdXN0ZXJcIixkZWxldGVDbHVzdGVyRXJyb3I6XCJJIGNsdXN0ZXIgbm9uIHBvc3Nvbm8gZXNzZXJlIGNhbmNlbGxhdGlcIixlZGl0Q2x1c3RlckVycm9yOlwiSSBjbHVzdGVycyBub24gcG9zc29ubyBlc3NlcmUgbW9kaWZpY2F0aS5cIn0sZS5pdF9JVD1lLml0LGUubmw9e2VkaXQ6XCJXaWp6aWdlblwiLGRlbDpcIlNlbGVjdGllIHZlcndpamRlcmVuXCIsYmFjazpcIlRlcnVnXCIsYWRkTm9kZTpcIk5vZGUgdG9ldm9lZ2VuXCIsYWRkRWRnZTpcIkxpbmsgdG9ldm9lZ2VuXCIsZWRpdE5vZGU6XCJOb2RlIHdpanppZ2VuXCIsZWRpdEVkZ2U6XCJMaW5rIHdpanppZ2VuXCIsYWRkRGVzY3JpcHRpb246XCJLbGlrIG9wIGVlbiBsZWVnIGdlYmllZCBvbSBlZW4gbmlldXdlIG5vZGUgdGUgbWFrZW4uXCIsZWRnZURlc2NyaXB0aW9uOlwiS2xpayBvcCBlZW4gbm9kZSBlbiBzbGVlcCBkZSBsaW5rIG5hYXIgZWVuIGFuZGVyZSBub2RlIG9tIHplIHRlIHZlcmJpbmRlbi5cIixlZGl0RWRnZURlc2NyaXB0aW9uOlwiS2xpayBvcCBkZSB2ZXJiaW5kaW5nc3B1bnRlbiBlbiBzbGVlcCB6ZSBuYWFyIGVlbiBub2RlIG9tIGRhYXJtZWUgdGUgdmVyYmluZGVuLlwiLGNyZWF0ZUVkZ2VFcnJvcjpcIkthbiBnZWVuIGxpbmsgbWFrZW4gbmFhciBlZW4gY2x1c3Rlci5cIixkZWxldGVDbHVzdGVyRXJyb3I6XCJDbHVzdGVycyBrdW5uZW4gbmlldCB3b3JkZW4gdmVyd2lqZGVyZC5cIixlZGl0Q2x1c3RlckVycm9yOlwiQ2x1c3RlcnMga3VubmVuIG5pZXQgd29yZGVuIGFhbmdlcGFzdC5cIn0sZS5ubF9OTD1lLm5sLGUubmxfQkU9ZS5ubCxlW1wicHQtYnJcIl09e2VkaXQ6XCJFZGl0YXJcIixkZWw6XCJSZW1vdmVyIHNlbGVjaW9uYWRvXCIsYmFjazpcIlZvbHRhclwiLGFkZE5vZGU6XCJBZGljaW9uYXIgbsODwrNcIixhZGRFZGdlOlwiQWRpY2lvbmFyIGFyZXN0YVwiLGVkaXROb2RlOlwiRWRpdGFyIG7Dg8KzXCIsZWRpdEVkZ2U6XCJFZGl0YXIgYXJlc3RhXCIsYWRkRGVzY3JpcHRpb246XCJDbGlxdWUgZW0gdW0gZXNwYcODwqdvIGVtIGJyYW5jbyBwYXJhIGFkaWNpb25hciB1bSBub3ZvIG7Dg8KzXCIsZWRnZURlc2NyaXB0aW9uOlwiQ2xpcXVlIGVtIHVtIG7Dg8KzIGUgYXJyYXN0ZSBhIGFyZXN0YSBhdMODwqkgb3V0cm8gbsODwrMgcGFyYSBjb25lY3TDg8KhLWxvc1wiLGVkaXRFZGdlRGVzY3JpcHRpb246XCJDbGlxdWUgbm9zIHBvbnRvcyBkZSBjb250cm9sZSBlIG9zIGFycmFzdGUgcGFyYSB1bSBuw4PCsyBwYXJhIGNvbmVjdMODwqEtbG9zXCIsY3JlYXRlRWRnZUVycm9yOlwiT
21167sODwqNvIGZvaSBwb3Nzw4PCrXZlbCBsaW5rYXIgYXJlc3RhcyBhIHVtIGNsdXN0ZXIuXCIsZGVsZXRlQ2x1c3RlckVycm9yOlwiQ2x1c3RlcnMgbsODwqNvIHB1ZGVyYW0gc2VyIHJlbW92aWRvcy5cIixlZGl0Q2x1c3RlckVycm9yOlwiQ2x1c3RlcnMgbsODwqNvIHB1ZGVyYW0gc2VyIGVkaXRhZG9zLlwifSxlW1wicHQtQlJcIl09ZVtcInB0LWJyXCJdLGUucHRfQlI9ZVtcInB0LWJyXCJdLGUucHRfYnI9ZVtcInB0LWJyXCJdLGUucnU9e2VkaXQ6XCLDkCDDkMK1w5DCtMOQwrDDkMK6w5HigJrDkMK4w5HigqzDkMK+w5DCssOQwrDDkeKAmsORxZJcIixkZWw6XCLDkMKjw5DCtMOQwrDDkMK7w5DCuMOR4oCaw5HFkiDDkMKyw5HigLnDkMKxw5HigqzDkMKww5DCvcOQwr3DkMK+w5DCtVwiLGJhY2s6XCLDkMKdw5DCsMOQwrfDkMKww5DCtFwiLGFkZE5vZGU6XCLDkOKAncOQwr7DkMKxw5DCsMOQwrLDkMK4w5HigJrDkcWSIMORxpLDkMK3w5DCtcOQwrtcIixhZGRFZGdlOlwiw5DigJ3DkMK+w5DCscOQwrDDkMKyw5DCuMOR4oCaw5HFkiDDkeKCrMOQwrXDkMKxw5HigqzDkMK+XCIsZWRpdE5vZGU6XCLDkCDDkMK1w5DCtMOQwrDDkMK6w5HigJrDkMK4w5HigqzDkMK+w5DCssOQwrDDkeKAmsORxZIgw5HGksOQwrfDkMK1w5DCu1wiLGVkaXRFZGdlOlwiw5Agw5DCtcOQwrTDkMKww5DCusOR4oCaw5DCuMOR4oKsw5DCvsOQwrLDkMKww5HigJrDkcWSIMOR4oKsw5DCtcOQwrHDkeKCrMOQwr5cIixhZGREZXNjcmlwdGlvbjpcIsOQxaHDkMK7w5DCuMOQwrrDkMK9w5DCuMOR4oCaw5DCtSDDkMKyIMORwoHDkMKyw5DCvsOQwrHDkMK+w5DCtMOQwr3DkMK+w5DCtSDDkMK8w5DCtcORwoHDkeKAmsOQwr4sIMOR4oChw5HigJrDkMK+w5DCscOR4oC5IMOQwrTDkMK+w5DCscOQwrDDkMKyw5DCuMOR4oCaw5HFkiDDkMK9w5DCvsOQwrLDkeKAucOQwrkgw5HGksOQwrfDkMK1w5DCuy5cIixlZGdlRGVzY3JpcHRpb246XCLDkMWhw5DCu8OQwrjDkMK6w5DCvcOQwrjDkeKAmsOQwrUgw5DCvcOQwrAgw5HGksOQwrfDkMK1w5DCuyDDkMK4IMOQwr/DkeKCrMOQwr7DkeKAmsORwo/DkMK9w5DCuMOR4oCaw5DCtSDDkeKCrMOQwrXDkMKxw5HigqzDkMK+IMOQwrogw5DCtMOR4oKsw5HGksOQwrPDkMK+w5DCvMORxpIgw5HGksOQwrfDkMK7w5HGkiwgw5HigKHDkeKAmsOQwr7DkMKxw5HigLkgw5HCgcOQwr7DkMK1w5DCtMOQwrjDkMK9w5DCuMOR4oCaw5HFkiDDkMK4w5HigKYuXCIsZWRpdEVkZ2VEZXNjcmlwdGlvbjpcIsOQxaHDkMK7w5DCuMOQwrrDkMK9w5DCuMOR4oCaw5DCtSDDkMK9w5DCsCDDkMK6w5DCvsOQwr3DkeKAmsOR4oKsw5DCvsOQwrvDkcWSw5DCvcOR4oC5w5DCtSDDkeKAmsOQwr7DkeKAocOQwrrDkMK4IMOQwrggw5DCv8OQwrXDkeKCrMOQwrXDkeKAmsOQwrDDkeKAsMOQwrjDkeKAmsOQwrUgw5DCuMOR4oCmIMOQwrIgw5HGksOQwrfDkMK1w5DCuywgw5HigKHDkeKAmsOQwr7DkMKxw5HigLkgw5DCv8OQwr7DkMK0w5DCusOQwrvDkcW9w5HigKHDkMK4w5HigJrDkcWSw5HCgcORwo8gw5DCuiDDkMK9w5DCtcOQwrzDkcaSLlwiLGNyZWF0ZUVkZ2VFcnJvcjpcIsOQwp3DkMK1w5DCssOQwr7DkMK3w5DCvMOQwr7DkMK2w5DCvcOQwr4gw5HCgcOQwr7DkMK1w5DCtMOQwrjDkMK9w5DCuMOR4oCaw5HFkiDDkeKCrMOQwrXDkMKxw5HigqzDkMKwIMOQwrIgw5DCusOQwrvDkMKww5HCgcOR4oCaw5DCtcOR4oKsLlwiLGRlbGV0ZUNsdXN0ZXJFcnJvcjpcIsOQxaHDkMK7w5DCsMORwoHDkeKAmsOQwrXDkeKCrMOR4oC5IMOQwr3DkMK1IMOQwrzDkMK+w5DCs8ORxpLDkeKAmiDDkMKxw5HigLnDkeKAmsORxZIgw5HGksOQwrTDkMKww5DCu8OQwrXDkMK9w5HigLlcIixlZGl0Q2x1c3RlckVycm9yOlwiw5DFocOQwrvDkMKww5HCgcOR4oCaw5DCtcOR4oKsw5HigLkgw5DCvcOQwrXDkMK0w5DCvsORwoHDkeKAmsORxpLDkMK/w5DCvcOR4oC5IMOQwrTDkMK7w5HCjyDDkeKCrMOQwrXDkMK0w5DCsMOQwrrDkeKAmsOQwrjDkeKCrMOQwr7DkMKyw5DCsMOQwr3DkMK4w5HCjy5cIn0sZS5ydV9SVT1lLnJ1LGUuY249e2VkaXQ6XCLDp8K84oCTw6jCvuKAmFwiLGRlbDpcIsOly4Ygw6nihKLCpMOp4oKs4oCww6XCrsWhXCIsYmFjazpcIsOowr/igJ3DpeKAusW+XCIsYWRkTm9kZTpcIsOmwrfCu8OlxaAgw6jFoOKAmsOn4oCawrlcIixhZGRFZGdlOlwiw6bCt8K7w6XFoCDDqMK/xb7DpsW9wqXDp8K6wr9cIixlZGl0Tm9kZTpcIsOnwrzigJPDqMK+4oCYw6jFoOKAmsOn4oCawrlcIixlZGl0RWRnZTpcIsOnwrzigJPDqMK+4oCYw6jCv8W+w6bFvcKlw6fCusK/XCIsYWRkRGVzY3JpcHRpb246XCLDpcKN4oCiw6XigKHCu8OnwqnCusOn4oSiwr3DpcKk4oCew6bigJ3CvsOnwr3CrsOm4oCTwrDDqMWg4oCaw6figJrCucOj4oKs4oCaXCIsZWRnZURlc2NyaXB0aW9uOlwiw6XCjeKAosOl4oChwrvDpsW4wpDDpMK4wqrDqMWg4oCaw6figJrCucOlwrnCtsOlwrDigKDDqMKvwqXDqMK/xb7DpsW9wqXDp8K6wr/DpuKAueKAk8OlxaDCqMOly4bCsMOlwo/CpsOkwrjigqzDpMK4wqrDqMWg4oCaw6figJrCucOkwrvCpcOowr/FvsOmxb3CpcOlwq7GksOkwrvCrMOj4oKs4oCaXCIsZWRpdEVkZ2VEZXNjcmlwdGlvbjpcIsOlwo3igKLDpeKAocK7w6bFvcKnw6XLhsK2w6jFoOKAmsOn4oCawrnDpcK5wrbDpcKw4oCgw6XCrsaSw6TCu8Ksw6bigLnigJPDpcuGwrDDqMWg4oCaw6figJrCucOkwrjFoMOowr/FvsOmxb3CpcOj4oKs4oCaXCIsY3JlYXRlRWRnZUVycm9yOlwiw6bigJQgw6bCs+KAosOlwrDigKDDqMK/xb7DpsW9wqXDp8K6wr/DqMK/xb7DpsW9wqXDpcuGwrDDp8K+wqTDqeKAuuKAoMOj4oKs4oCaXCIsZGVsZXRlQ2x1c3RlckVycm9yOlwiw6bigJQgw6bCs+KAosOly4Ygw6nihKLCpMOnwr7CpMOp4oC64oCgw6PigqzigJpcIixlZGl0Q2x1c3RlckVycm9yOlwiw6bigJQgw6bCs+KAosOnwrzigJPDqMK+4oCYw6fCvsKkw6nigLrigKDDo+KCrOKAmlwifSxlLnpoX0NOPWUuY259LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDApLHM9byhuKSxyPWkoMSksYT1vKHIpLGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7KDAscy5kZWZh
21167dWx0KSh0aGlzLHQpLHRoaXMuTlVNX0lURVJBVElPTlM9NCx0aGlzLmltYWdlPW5ldyBJbWFnZSx0aGlzLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpfXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleTpcImluaXRcIix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLmluaXRpYWxpemVkKCkpe3RoaXMuc3JjPXRoaXMuaW1hZ2Uuc3JjO3ZhciB0PXRoaXMuaW1hZ2Uud2lkdGgsZT10aGlzLmltYWdlLmhlaWdodDt0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZTt2YXIgaT1NYXRoLmZsb29yKGUvMiksbz1NYXRoLmZsb29yKGUvNCksbj1NYXRoLmZsb29yKGUvOCkscz1NYXRoLmZsb29yKGUvMTYpLHI9TWF0aC5mbG9vcih0LzIpLGE9TWF0aC5mbG9vcih0LzQpLGg9TWF0aC5mbG9vcih0LzgpLGQ9TWF0aC5mbG9vcih0LzE2KTt0aGlzLmNhbnZhcy53aWR0aD0zKmEsdGhpcy5jYW52YXMuaGVpZ2h0PWksdGhpcy5jb29yZGluYXRlcz1bWzAsMCxyLGldLFtyLDAsYSxvXSxbcixvLGgsbl0sWzUqaCxvLGQsc11dLHRoaXMuX2ZpbGxNaXBNYXAoKX19fSx7a2V5OlwiaW5pdGlhbGl6ZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzLmNvb3JkaW5hdGVzfX0se2tleTpcIl9maWxsTWlwTWFwXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIiksZT10aGlzLmNvb3JkaW5hdGVzWzBdO3QuZHJhd0ltYWdlKHRoaXMuaW1hZ2UsZVswXSxlWzFdLGVbMl0sZVszXSk7Zm9yKHZhciBpPTE7aTx0aGlzLk5VTV9JVEVSQVRJT05TO2krKyl7dmFyIG89dGhpcy5jb29yZGluYXRlc1tpLTFdLG49dGhpcy5jb29yZGluYXRlc1tpXTt0LmRyYXdJbWFnZSh0aGlzLmNhbnZhcyxvWzBdLG9bMV0sb1syXSxvWzNdLG5bMF0sblsxXSxuWzJdLG5bM10pfX19LHtrZXk6XCJkcmF3SW1hZ2VBdFBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMpe2lmKHRoaXMuaW5pdGlhbGl6ZWQoKSlpZihlPjIpe2UqPS41O2Zvcih2YXIgcj0wO2U+MiYmcjx0aGlzLk5VTV9JVEVSQVRJT05TOyllKj0uNSxyKz0xO3I+PXRoaXMuTlVNX0lURVJBVElPTlMmJihyPXRoaXMuTlVNX0lURVJBVElPTlMtMSk7dmFyIGE9dGhpcy5jb29yZGluYXRlc1tyXTt0LmRyYXdJbWFnZSh0aGlzLmNhbnZhcyxhWzBdLGFbMV0sYVsyXSxhWzNdLGksbyxuLHMpfWVsc2UgdC5kcmF3SW1hZ2UodGhpcy5pbWFnZSxpLG8sbixzKX19XSksdH0oKTtlLmRlZmF1bHQ9aH0sZnVuY3Rpb24odCxlLGkpe1xuICAgIGZ1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMCkscz1vKG4pLHI9aSgxKSxhPW8ociksaD1pKDIpLGQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuY2xlYXIoKSx0aGlzLmRlZmF1bHRJbmRleD0wLHRoaXMuZ3JvdXBzQXJyYXk9W10sdGhpcy5ncm91cEluZGV4PTAsdGhpcy5kZWZhdWx0R3JvdXBzPVt7Ym9yZGVyOlwiIzJCN0NFOVwiLGJhY2tncm91bmQ6XCIjOTdDMkZDXCIsaGlnaGxpZ2h0Ontib3JkZXI6XCIjMkI3Q0U5XCIsYmFja2dyb3VuZDpcIiNEMkU1RkZcIn0saG92ZXI6e2JvcmRlcjpcIiMyQjdDRTlcIixiYWNrZ3JvdW5kOlwiI0QyRTVGRlwifX0se2JvcmRlcjpcIiNGRkE1MDBcIixiYWNrZ3JvdW5kOlwiI0ZGRkYwMFwiLGhpZ2hsaWdodDp7Ym9yZGVyOlwiI0ZGQTUwMFwiLGJhY2tncm91bmQ6XCIjRkZGRkEzXCJ9LGhvdmVyOntib3JkZXI6XCIjRkZBNTAwXCIsYmFja2dyb3VuZDpcIiNGRkZGQTNcIn19LHtib3JkZXI6XCIjRkEwQTEwXCIsYmFja2dyb3VuZDpcIiNGQjdFODFcIixoaWdobGlnaHQ6e2JvcmRlcjpcIiNGQTBBMTBcIixiYWNrZ3JvdW5kOlwiI0ZGQUZCMVwifSxob3Zlcjp7Ym9yZGVyOlwiI0ZBMEExMFwiLGJhY2tncm91bmQ6XCIjRkZBRkIxXCJ9fSx7Ym9yZGVyOlwiIzQxQTkwNlwiLGJhY2tncm91bmQ6XCIjN0JFMTQxXCIsaGlnaGxpZ2h0Ontib3JkZXI6XCIjNDFBOTA2XCIsYmFja2dyb3VuZDpcIiNBMUVDNzZcIn0saG92ZXI6e2JvcmRlcjpcIiM0MUE5MDZcIixiYWNrZ3JvdW5kOlwiI0ExRUM3NlwifX0se2JvcmRlcjpcIiNFMTI5RjBcIixiYWNrZ3JvdW5kOlwiI0VCN0RGNFwiLGhpZ2hsaWdodDp7Ym9yZGVyOlwiI0UxMjlGMFwiLGJhY2tncm91bmQ6XCIjRjBCM0Y1XCJ9LGhvdmVyOntib3JkZXI6XCIjRTEyOUYwXCIsYmFja2dyb3VuZDpcIiNGMEIzRjVcIn19LHtib3JkZXI6XCIjN0MyOUYwXCIsYmFja2dyb3VuZDpcIiNBRDg1RTRcIixoaWdobGlnaHQ6e2JvcmRlcjpcIiM3QzI5RjBcIixiYWNrZ3JvdW5kOlwiI0QzQkRGMFwifSxob3Zlcjp7Ym9yZGVyOlwiIzdDMjlGMFwiLGJhY2tncm91bmQ6XCIjRDNCREYwXCJ9fSx7Ym9yZGVyOlwiI0MzN0YwMFwiLGJhY2tncm91bmQ6XCIjRkZBODA3XCIsaGlnaGxpZ2h0Ontib3JkZXI6XCIjQzM3RjAwXCIsYmFja2dyb3VuZDpcIiNGRkNBNjZcIn0saG92ZXI6e2JvcmRlcjpcIiNDMzdGMDBcIixiYWNrZ3JvdW5kOlwiI0ZGQ0E2NlwifX0se2JvcmRlcjpcIiM0MjIwRkJcIixiYWNrZ3JvdW5kOlwiIzZFNkVGRFwiLGhpZ2hsaWdodDp7Ym9yZGVyOlwiIzQyMjBGQlwiLGJhY2tncm91bmQ6XCIjOUI5QkZEXCJ9LGhvdmVyOntib3JkZXI6XCIjNDIyMEZCXCIsYmFja2dyb3VuZDpcIiM5QjlCRkRcIn19LHtib3JkZXI6XCIjRkQ1QTc3XCIsYmFja2dyb3VuZDpcIiNGRkMwQ0JcIixoaWdobGlnaHQ6e2JvcmRlcjpcIiNGRDVBNzdcIixiYWNrZ3JvdW5kOlwiI0ZGRDFEOVwifSxob3Zlcjp7Ym9yZGVyOlwiI0ZENUE3N1wiLGJhY2tncm91bmQ6XCIjRkZEMUQ5XCJ9fSx7Ym9yZGVyOlwiIzRBRDYzQVwiLGJhY2tncm91bmQ6XCIjQzJGQUJDXCIsaGlnaGxpZ2h0Ontib3JkZXI6XCIjNEFENjNBXCIsYmFja2dyb3VuZDpcIiNFNkZGRTNcIn0saG92ZXI6e2JvcmRlcjpcIiM0QUQ2M0FcIixiYWNrZ3JvdW5kOlwiI0U2RkZFM1wifX0se2JvcmRlcjpcIiM5OTAwMDBcIixiYWNrZ3JvdW5kOlwiI0VFMDAwMFwiLGhpZ2hsaWdodDp7Ym9yZGVyOlwiI0JCMDAwMFwiLGJhY2tncm91bmQ6XCIjRkYzMzMzXCJ9LGhvdmVyOntib3JkZXI6XCIjQkIwMDAwXCIsYmFja2dyb3VuZDpcIiNGRjMzMzNcIn19LHtib3JkZXI6XCIjRkY2MDAwXCIsYmFja2dyb3VuZDpcIiNGRjYwMDBcIixoaWdobGlnaHQ6e2JvcmRlcjpcIiNGRjYwMDBcIixiYWNrZ3JvdW5kOlwiI0ZGNjAwMFwifSxob3Zlcjp7Ym9yZGVyOlwiI0ZGNjAwMFwiLGJhY2tncm91bmQ6XCIjRkY2MDAwXCJ9fSx7Ym9yZGVyOlwiIzk3QzJGQ1wiLGJhY2tncm91bmQ6XCIjMkI3Q0U5XCIsaGlnaGxpZ2h0Ontib3JkZXI6XCIjRDJFNUZGXCIsYmFja2dyb3VuZDpcIiMyQjdDRTlcIn0saG92ZXI6e2JvcmRlcjpcIiNEMkU1RkZcIixiYWNrZ3JvdW5kOlwiIzJCN0NFOVwifX0se2JvcmRlcjpcIiMzOTk2MDVcIixiYWNrZ3JvdW5kOlwiIzI1NUMwM1wiLGhpZ2hsaWdodDp7Ym9yZGVyOlwiIzM5OTYwNVwiLGJhY2tncm91bmQ6XCIjMjU1QzAzXCJ9LGhvdmVyOntib3JkZXI6XCIjMzk5NjA1XCIsYmFja2dyb3VuZDpcIiMyNTVDMDNcIn19LHtib3JkZXI6XCIjQjcwMDU0XCIsYmFja2dyb3VuZDpcIiNGRjAwN0VcIixoaWdobGlnaHQ6e2JvcmRlcjpcIiNCNzAwNTRcIixiYWNrZ3JvdW5kOlwiI0ZGMDA3RVwifSxob3Zlcjp7Ym9yZGVyOlwiI0I3MDA1NFwiLGJhY2tncm91bmQ6XCIjRkYwMDdFXCJ9fSx7Ym9yZGVyOlwiI0FEODVFNFwiLGJhY2tncm91bmQ6XCIjN0MyOUYwXCIsaGlnaGxpZ2h0Ontib3JkZXI6XCIjRDNCREYwXCIsYmFja2dyb3VuZDpcIiM3QzI5RjBcIn0saG92ZXI6e2JvcmRlcjpcIiNEM0JERjBcIixiYWNrZ3JvdW5kOlwiIzdDMjlGMFwifX0se2JvcmRlcjpcIiM0NTU3RkFcIixiYWNrZ3JvdW5kOlwiIzAwMEVBMVwiLGhpZ2hsaWdodDp7Ym9yZGVyOlwiIzZFNkVGRFwiLGJhY2tncm91bmQ6XCIjMDAwRUExXCJ9LGhvdmVyOntib3JkZXI6XCIjNkU2RUZEXCIsYmFja2dyb3VuZDpcIiMwMDBFQTFcIn19LHtib3JkZXI6XCIjRkZDMENCXCIsYmFja2dyb3VuZDpcIiNGRDVBNzdcIixoaWdobGlnaHQ6e2JvcmRlcjpcIiNGRkQxRDlcIixiYWNrZ3JvdW5kOlwiI0ZENUE3N1wifSxob3Zlcjp7Ym9yZGVyOlwiI0ZGRDFEOVwiLGJhY2tncm91bmQ6XCIjRkQ1QTc3XCJ9fSx7Ym9yZGVyOlwiI0MyRkFCQ1wiLGJhY2tncm91bmQ6XCIjNzRENjZBXCIsaGlnaGxpZ2h0Ontib3JkZXI6XCIjRTZGRkUzXCIsYmFja2dyb3VuZDpcIiM3NEQ2NkFcIn0saG92ZXI6e2JvcmRlcjpcIiNFNkZGRTNcIixiYWNrZ3JvdW5kOlwiIzc0RDY2QVwifX0se2JvcmRlcjpcIiNFRTAwMDBcIixiYWNrZ3JvdW5kOlwiIzk5MDAwMFwiLGhpZ2hsaWdodDp7Ym9yZGVyOlwiI0ZGMzMzM1wiLGJhY2tncm91bmQ6XCIjQkIwMDAwXCJ9LGhvdmVyOntib3JkZXI6XCIjRkYzMzMzXCIsYmFja2dyb3VuZDpcIiNCQjAwMDBcIn19XSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZh
21167dWx0T3B0aW9ucz17dXNlRGVmYXVsdEdyb3VwczohMH0saC5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpfXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1bXCJ1c2VEZWZhdWx0R3JvdXBzXCJdO2lmKHZvaWQgMCE9PXQpZm9yKHZhciBpIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShpKSYmLTE9PT1lLmluZGV4T2YoaSkpe3ZhciBvPXRbaV07dGhpcy5hZGQoaSxvKX19fSx7a2V5OlwiY2xlYXJcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZ3JvdXBzPXt9LHRoaXMuZ3JvdXBzQXJyYXk9W119fSx7a2V5OlwiZ2V0XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXSxpPXRoaXMuZ3JvdXBzW3RdO2lmKHZvaWQgMD09PWkmJmUpaWYoITE9PT10aGlzLm9wdGlvbnMudXNlRGVmYXVsdEdyb3VwcyYmdGhpcy5ncm91cHNBcnJheS5sZW5ndGg+MCl7dmFyIG89dGhpcy5ncm91cEluZGV4JXRoaXMuZ3JvdXBzQXJyYXkubGVuZ3RoO3RoaXMuZ3JvdXBJbmRleCsrLGk9e30saS5jb2xvcj10aGlzLmdyb3Vwc1t0aGlzLmdyb3Vwc0FycmF5W29dXSx0aGlzLmdyb3Vwc1t0XT1pfWVsc2V7dmFyIG49dGhpcy5kZWZhdWx0SW5kZXgldGhpcy5kZWZhdWx0R3JvdXBzLmxlbmd0aDt0aGlzLmRlZmF1bHRJbmRleCsrLGk9e30saS5jb2xvcj10aGlzLmRlZmF1bHRHcm91cHNbbl0sdGhpcy5ncm91cHNbdF09aX1yZXR1cm4gaX19LHtrZXk6XCJhZGRcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmdyb3Vwc1t0XT1lLHRoaXMuZ3JvdXBzQXJyYXkucHVzaCh0KSxlfX1dKSx0fSgpO2UuZGVmYXVsdD1kfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgwKSxzPW8obikscj1pKDEpLGE9byhyKSxoPWkoMiksZD1pKDExKSxsPWkoMTIpLHU9aSg0NykuZGVmYXVsdCxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyxuKXt2YXIgcj10aGlzO2lmKCgwLHMuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLmltYWdlcz1pLHRoaXMuZ3JvdXBzPW8sdGhpcy5sYXlvdXRFbmdpbmU9bix0aGlzLmJvZHkuZnVuY3Rpb25zLmNyZWF0ZU5vZGU9dGhpcy5jcmVhdGUuYmluZCh0aGlzKSx0aGlzLm5vZGVzTGlzdGVuZXJzPXthZGQ6ZnVuY3Rpb24odCxlKXtyLmFkZChlLml0ZW1zKX0sdXBkYXRlOmZ1bmN0aW9uKHQsZSl7ci51cGRhdGUoZS5pdGVtcyxlLmRhdGEsZS5vbGREYXRhKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7ci5yZW1vdmUoZS5pdGVtcyl9fSx0aGlzLmRlZmF1bHRPcHRpb25zPXtib3JkZXJXaWR0aDoxLGJvcmRlcldpZHRoU2VsZWN0ZWQ6Mixicm9rZW5JbWFnZTp2b2lkIDAsY29sb3I6e2JvcmRlcjpcIiMyQjdDRTlcIixiYWNrZ3JvdW5kOlwiIzk3QzJGQ1wiLGhpZ2hsaWdodDp7Ym9yZGVyOlwiIzJCN0NFOVwiLGJhY2tncm91bmQ6XCIjRDJFNUZGXCJ9LGhvdmVyOntib3JkZXI6XCIjMkI3Q0U5XCIsYmFja2dyb3VuZDpcIiNEMkU1RkZcIn19LGZpeGVkOnt4OiExLHk6ITF9LGZvbnQ6e2NvbG9yOlwiIzM0MzQzNFwiLHNpemU6MTQsZmFjZTpcImFyaWFsXCIsYmFja2dyb3VuZDpcIm5vbmVcIixzdHJva2VXaWR0aDowLHN0cm9rZUNvbG9yOlwiI2ZmZmZmZlwiLGFsaWduOlwiY2VudGVyXCIsdmFkanVzdDowLG11bHRpOiExLGJvbGQ6e21vZDpcImJvbGRcIn0sYm9sZGl0YWw6e21vZDpcImJvbGQgaXRhbGljXCJ9LGl0YWw6e21vZDpcIml0YWxpY1wifSxtb25vOnttb2Q6XCJcIixzaXplOjE1LGZhY2U6XCJtb25vc3BhY2VcIix2YWRqdXN0OjJ9fSxncm91cDp2b2lkIDAsaGlkZGVuOiExLGljb246e2ZhY2U6XCJGb250QXdlc29tZVwiLGNvZGU6dm9pZCAwLHNpemU6NTAsY29sb3I6XCIjMkI3Q0U5XCJ9LGltYWdlOnZvaWQgMCxsYWJlbDp2b2lkIDAsbGFiZWxIaWdobGlnaHRCb2xkOiEwLGxldmVsOnZvaWQgMCxtYXJnaW46e3RvcDo1LHJpZ2h0OjUsYm90dG9tOjUsbGVmdDo1fSxtYXNzOjEscGh5c2ljczohMCxzY2FsaW5nOnttaW46MTAsbWF4OjMwLGxhYmVsOntlbmFibGVkOiExLG1pbjoxNCxtYXg6MzAsbWF4VmlzaWJsZTozMCxkcmF3VGhyZXNob2xkOjV9LGN1c3RvbVNjYWxpbmdGdW5jdGlvbjpmdW5jdGlvbih0LGUsaSxvKXtpZihlPT09dClyZXR1cm4uNTt2YXIgbj0xLyhlLXQpO3JldHVybiBNYXRoLm1heCgwLChvLXQpKm4pfX0sc2hhZG93OntlbmFibGVkOiExLGNvbG9yOlwicmdiYSgwLDAsMCwwLjUpXCIsc2l6ZToxMCx4OjUseTo1fSxzaGFwZTpcImVsbGlwc2VcIixzaGFwZVByb3BlcnRpZXM6e2JvcmRlckRhc2hlczohMSxib3JkZXJSYWRpdXM6NixpbnRlcnBvbGF0aW9uOiEwLHVzZUltYWdlU2l6ZTohMSx1c2VCb3JkZXJXaXRoSW1hZ2U6ITF9LHNpemU6MjUsdGl0bGU6dm9pZCAwLHZhbHVlOnZvaWQgMCx4OnZvaWQgMCx5OnZvaWQgMH0sdGhpcy5kZWZhdWx0T3B0aW9ucy5tYXNzPD0wKXRocm93XCJJbnRlcm5hbCBlcnJvcjogbWFzcyBpbiBkZWZhdWx0T3B0aW9ucyBvZiBOb2Rlc0hhbmRsZXIgbWF5IG5vdCBiZSB6ZXJvIG9yIG5lZ2F0aXZlXCI7dGhpcy5vcHRpb25zPWguYnJpZGdlT2JqZWN0KHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OlwiYmluZEV2ZW50TGlzdGVuZXJzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYm9keS5lbWl0dGVyLm9uKFwicmVmcmVzaE5vZGVzXCIsdGhpcy5yZWZyZXNoLmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwicmVmcmVzaFwiLHRoaXMucmVmcmVzaC5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5vbihcImRlc3Ryb3lcIixmdW5jdGlvbigpe2guZm9yRWFjaCh0Lm5vZGVzTGlzdGVuZXJzLGZ1bmN0aW9uKGUsaSl7dC5ib2R5LmRhdGEubm9kZXMmJnQuYm9keS5kYXRhLm5vZGVzLm9mZihpLGUpfSksZGVsZXRlIHQuYm9keS5mdW5jdGlvbnMuY3JlYXRlTm9kZSxkZWxldGUgdC5ub2Rlc0xpc3RlbmVycy5hZGQsZGVsZXRlIHQubm9kZXNMaXN0ZW5lcnMudXBkYXRlLGRlbGV0ZSB0Lm5vZGVzTGlzdGVuZXJzLnJlbW92ZSxkZWxldGUgdC5ub2Rlc0xpc3RlbmVyc30pfX0se2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10KXtpZih1LnBhcnNlT3B0aW9ucyh0aGlzLm9wdGlvbnMsdCksdm9pZCAwIT09dC5zaGFwZSlmb3IodmFyIGUgaW4gdGhpcy5ib2R5Lm5vZGVzKXRoaXMuYm9keS5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShlKSYmdGhpcy5ib2R5Lm5vZGVzW2VdLnVwZGF0ZVNoYXBlKCk7aWYodm9pZCAwIT09dC5mb250KWZvcih2YXIgaSBpbiB0aGlzLmJvZHkubm9kZXMpdGhpcy5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KGkpJiYodGhpcy5ib2R5Lm5vZGVzW2ldLnVwZGF0ZUxhYmVsTW9kdWxlKCksdGhpcy5ib2R5Lm5vZGVzW2ldLm5lZWRzUmVmcmVzaCgpKTtpZih2b2lkIDAhPT10LnNpemUpZm9yKHZhciBvIGluIHRoaXMuYm9keS5ub2Rlcyl0aGlzLmJvZHkubm9kZXMuaGFzT3duUHJvcGVydHkobykmJnRoaXMuYm9keS5ub2Rlc1tvXS5uZWVkc1JlZnJlc2goKTt2b2lkIDA9PT10LmhpZGRlbiYmdm9pZCAwPT09dC5waHlzaWNzfHx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2RhdGFDaGFuZ2VkXCIpfX19LHtrZXk6XCJzZXREYXRhXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxpPXRoaXMuYm9keS5kYXRhLm5vZGVzO2lmKHQgaW5zdGFuY2VvZiBkfHx0IGluc3RhbmNlb2YgbCl0aGlzLmJvZHkuZGF0YS5ub2Rlcz10O2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl0aGlzLmJvZHkuZGF0YS5ub2Rlcz1uZXcgZCx0aGlzLmJvZHkuZGF0YS5ub2Rlcy5hZGQodCk7ZWxzZXtpZih0KXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcnJheSBvciBEYXRhU2V0IGV4cGVjdGVkXCIpO3RoaXMuYm9keS5kYXRhLm5vZGVzPW5ldyBkfWlmKGkmJmguZm9yRWFjaCh0aGlzLm5vZGVzTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7aS5vZmYoZSx0KX0pLHRoaXMuYm9keS5ub2Rlcz17fSx0aGlzLmJvZHkuZGF0YS5ub2Rlcyl7dmFyIG89dGhpcztoLmZvckVhY2godGhpcy5ub2Rlc0xpc3RlbmVycyxmdW5jdGlvbih0LGUpe28uYm9keS5kYXRhLm5vZGVzLm9uKGUsdCl9KTt2YXIgbj10aGlzLmJvZHkuZGF0YS5ub2Rlcy5nZXRJZHMoKTt0aGlzLmFkZChuLCEwKX0hMT09PWUmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIil9fSx7a2V5OlwiYWRkXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0saT12b2lkIDAsbz1bXSxuPTA7bj
21167x0Lmxlbmd0aDtuKyspe2k9dFtuXTt2YXIgcz10aGlzLmJvZHkuZGF0YS5ub2Rlcy5nZXQoaSkscj10aGlzLmNyZWF0ZShzKTtvLnB1c2gociksdGhpcy5ib2R5Lm5vZGVzW2ldPXJ9dGhpcy5sYXlvdXRFbmdpbmUucG9zaXRpb25Jbml0aWFsbHkobyksITE9PT1lJiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2RhdGFDaGFuZ2VkXCIpfX0se2tleTpcInVwZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG89dGhpcy5ib2R5Lm5vZGVzLG49ITEscz0wO3M8dC5sZW5ndGg7cysrKXt2YXIgcj10W3NdLGE9b1tyXSxoPWVbc107dm9pZCAwIT09YT9hLnNldE9wdGlvbnMoaCkmJihuPSEwKToobj0hMCxhPXRoaXMuY3JlYXRlKGgpLG9bcl09YSl9bnx8dm9pZCAwPT09aXx8KG49ZS5zb21lKGZ1bmN0aW9uKHQsZSl7dmFyIG89aVtlXTtyZXR1cm4gbyYmby5sZXZlbCE9PXQubGV2ZWx9KSksITA9PT1uP3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIik6dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9kYXRhVXBkYXRlZFwiKX19LHtrZXk6XCJyZW1vdmVcIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5ib2R5Lm5vZGVzLGk9MDtpPHQubGVuZ3RoO2krKyl7ZGVsZXRlIGVbdFtpXV19dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9kYXRhQ2hhbmdlZFwiKX19LHtrZXk6XCJjcmVhdGVcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gbmV3KGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp1KSh0LHRoaXMuYm9keSx0aGlzLmltYWdlcyx0aGlzLmdyb3Vwcyx0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyl9fSx7a2V5OlwicmVmcmVzaFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07aC5mb3JFYWNoKHRoaXMuYm9keS5ub2RlcyxmdW5jdGlvbihpLG8pe3ZhciBuPXQuYm9keS5kYXRhLm5vZGVzLmdldChvKTt2b2lkIDAhPT1uJiYoITA9PT1lJiZpLnNldE9wdGlvbnMoe3g6bnVsbCx5Om51bGx9KSxpLnNldE9wdGlvbnMoe2ZpeGVkOiExfSksaS5zZXRPcHRpb25zKG4pKX0pfX0se2tleTpcImdldFBvc2l0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXt9O2lmKHZvaWQgMCE9PXQpe2lmKCEwPT09QXJyYXkuaXNBcnJheSh0KSl7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspaWYodm9pZCAwIT09dGhpcy5ib2R5Lm5vZGVzW3RbaV1dKXt2YXIgbz10aGlzLmJvZHkubm9kZXNbdFtpXV07ZVt0W2ldXT17eDpNYXRoLnJvdW5kKG8ueCkseTpNYXRoLnJvdW5kKG8ueSl9fX1lbHNlIGlmKHZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0XSl7dmFyIG49dGhpcy5ib2R5Lm5vZGVzW3RdO2VbdF09e3g6TWF0aC5yb3VuZChuLngpLHk6TWF0aC5yb3VuZChuLnkpfX19ZWxzZSBmb3IodmFyIHM9MDtzPHRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGg7cysrKXt2YXIgcj10aGlzLmJvZHkubm9kZXNbdGhpcy5ib2R5Lm5vZGVJbmRpY2VzW3NdXTtlW3RoaXMuYm9keS5ub2RlSW5kaWNlc1tzXV09e3g6TWF0aC5yb3VuZChyLngpLHk6TWF0aC5yb3VuZChyLnkpfX1yZXR1cm4gZX19LHtrZXk6XCJzdG9yZVBvc2l0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9W10sZT10aGlzLmJvZHkuZGF0YS5ub2Rlcy5nZXREYXRhU2V0KCk7Zm9yKHZhciBpIGluIGUuX2RhdGEpaWYoZS5fZGF0YS5oYXNPd25Qcm9wZXJ0eShpKSl7dmFyIG89dGhpcy5ib2R5Lm5vZGVzW2ldO2UuX2RhdGFbaV0ueD09TWF0aC5yb3VuZChvLngpJiZlLl9kYXRhW2ldLnk9PU1hdGgucm91bmQoby55KXx8dC5wdXNoKHtpZDpvLmlkLHg6TWF0aC5yb3VuZChvLngpLHk6TWF0aC5yb3VuZChvLnkpfSl9ZS51cGRhdGUodCl9fSx7a2V5OlwiZ2V0Qm91bmRpbmdCb3hcIix2YWx1ZTpmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbdF0pcmV0dXJuIHRoaXMuYm9keS5ub2Rlc1t0XS5zaGFwZS5ib3VuZGluZ0JveH19LHtrZXk6XCJnZXRDb25uZWN0ZWROb2Rlc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9W107aWYodm9pZCAwIT09dGhpcy5ib2R5Lm5vZGVzW3RdKWZvcih2YXIgbz10aGlzLmJvZHkubm9kZXNbdF0sbj17fSxzPTA7czxvLmVkZ2VzLmxlbmd0aDtzKyspe3ZhciByPW8uZWRnZXNbc107XCJ0b1wiIT09ZSYmci50b0lkPT1vLmlkP3ZvaWQgMD09PW5bci5mcm9tSWRdJiYoaS5wdXNoKHIuZnJvbUlkKSxuW3IuZnJvbUlkXT0hMCk6XCJmcm9tXCIhPT1lJiZyLmZyb21JZD09by5pZCYmdm9pZCAwPT09bltyLnRvSWRdJiYoaS5wdXNoKHIudG9JZCksbltyLnRvSWRdPSEwKX1yZXR1cm4gaX19LHtrZXk6XCJnZXRDb25uZWN0ZWRFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO2lmKHZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0XSlmb3IodmFyIGk9dGhpcy5ib2R5Lm5vZGVzW3RdLG89MDtvPGkuZWRnZXMubGVuZ3RoO28rKyllLnB1c2goaS5lZGdlc1tvXS5pZCk7ZWxzZSBjb25zb2xlLmxvZyhcIk5vZGVJZCBwcm92aWRlZCBmb3IgZ2V0Q29ubmVjdGVkRWRnZXMgZG9lcyBub3QgZXhpc3QuIFByb3ZpZGVkOiBcIix0KTtyZXR1cm4gZX19LHtrZXk6XCJtb3ZlTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10aGlzO3ZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0XT8odGhpcy5ib2R5Lm5vZGVzW3RdLng9TnVtYmVyKGUpLHRoaXMuYm9keS5ub2Rlc1t0XS55PU51bWJlcihpKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5ib2R5LmVtaXR0ZXIuZW1pdChcInN0YXJ0U2ltdWxhdGlvblwiKX0sMCkpOmNvbnNvbGUubG9nKFwiTm9kZSBpZCBzdXBwbGllZCB0byBtb3ZlTm9kZSBkb2VzIG5vdCBleGlzdC4gUHJvdmlkZWQ6IFwiLHQpfX1dKSx0fSgpO2UuZGVmYXVsdD1jfSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPXtkZWZhdWx0OmkoMTg5KSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24odCxlLGkpe2koNDkpLGkoNjApLHQuZXhwb3J0cz1pKDE5MCl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDg2KSxuPWkoMTMpKFwiaXRlcmF0b3JcIikscz1pKDMxKTt0LmV4cG9ydHM9aSg3KS5pc0l0ZXJhYmxlPWZ1bmN0aW9uKHQpe3ZhciBlPU9iamVjdCh0KTtyZXR1cm4gdm9pZCAwIT09ZVtuXXx8XCJAQGl0ZXJhdG9yXCJpbiBlfHxzLmhhc093blByb3BlcnR5KG8oZSkpfX0s
21167ZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMCkscz1vKG4pLHI9aSgxKSxhPW8ociksaD1pKDE5MikuZGVmYXVsdCxkPWkoNDgpLmRlZmF1bHQsbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8sbil7dmFyIHI9dGhpczsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5jdHg9ZSx0aGlzLnBhcmVudD1pO3ZhciBhPWZ1bmN0aW9uKHQsaSl7aWYodm9pZCAwPT09dClyZXR1cm4gMDt2YXIgcz1yLnBhcmVudC5nZXRGb3JtYXR0aW5nVmFsdWVzKGUsbyxuLGkpLGE9MDtpZihcIlwiIT09dCl7YT1yLmN0eC5tZWFzdXJlVGV4dCh0KS53aWR0aH1yZXR1cm57d2lkdGg6YSx2YWx1ZXM6c319O3RoaXMubGluZXM9bmV3IGgoYSl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OlwicHJvY2Vzc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCFkLmlzVmFsaWRMYWJlbCh0KSlyZXR1cm4gdGhpcy5saW5lcy5maW5hbGl6ZSgpO3ZhciBlPXRoaXMucGFyZW50LmZvbnRPcHRpb25zO3Q9dC5yZXBsYWNlKC9cXHJcXG4vZyxcIlxcblwiKSx0PXQucmVwbGFjZSgvXFxyL2csXCJcXG5cIik7dmFyIGk9U3RyaW5nKHQpLnNwbGl0KFwiXFxuXCIpLG89aS5sZW5ndGg7aWYoZS5tdWx0aSlmb3IodmFyIG49MDtuPG87bisrKXt2YXIgcz10aGlzLnNwbGl0QmxvY2tzKGlbbl0sZS5tdWx0aSk7aWYodm9pZCAwIT09cylpZigwIT09cy5sZW5ndGgpe2lmKGUubWF4V2R0PjApZm9yKHZhciByPTA7cjxzLmxlbmd0aDtyKyspe3ZhciBhPXNbcl0ubW9kLGg9c1tyXS50ZXh0O3RoaXMuc3BsaXRTdHJpbmdJbnRvTGluZXMoaCxhLCEwKX1lbHNlIGZvcih2YXIgbD0wO2w8cy5sZW5ndGg7bCsrKXt2YXIgdT1zW2xdLm1vZCxjPXNbbF0udGV4dDt0aGlzLmxpbmVzLmFwcGVuZChjLHUpfXRoaXMubGluZXMubmV3TGluZSgpfWVsc2UgdGhpcy5saW5lcy5uZXdMaW5lKFwiXCIpfWVsc2UgaWYoZS5tYXhXZHQ+MClmb3IodmFyIHA9MDtwPG87cCsrKXRoaXMuc3BsaXRTdHJpbmdJbnRvTGluZXMoaVtwXSk7ZWxzZSBmb3IodmFyIGY9MDtmPG87ZisrKXRoaXMubGluZXMubmV3TGluZShpW2ZdKTtyZXR1cm4gdGhpcy5saW5lcy5maW5hbGl6ZSgpfX0se2tleTpcImRlY29kZU1hcmt1cFN5c3RlbVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPVwibm9uZVwiO3JldHVyblwibWFya2Rvd25cIj09PXR8fFwibWRcIj09PXQ/ZT1cIm1hcmtkb3duXCI6ITAhPT10JiZcImh0bWxcIiE9PXR8fChlPVwiaHRtbFwiKSxlfX0se2tleTpcInNwbGl0SHRtbEJsb2Nrc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPVtdLGk9e2JvbGQ6ITEsaXRhbDohMSxtb25vOiExLHNwYWNpbmc6ITEscG9zaXRpb246MCxidWZmZXI6XCJcIixtb2RTdGFjazpbXX07Zm9yKGkubW9kPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLm1vZFN0YWNrLmxlbmd0aD9cIm5vcm1hbFwiOnRoaXMubW9kU3RhY2tbMF19LGkubW9kTmFtZT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5tb2RTdGFjay5sZW5ndGg/XCJub3JtYWxcIjpcIm1vbm9cIj09PXRoaXMubW9kU3RhY2tbMF0/XCJtb25vXCI6aS5ib2xkJiZpLml0YWw/XCJib2xkaXRhbFwiOmkuYm9sZD9cImJvbGRcIjppLml0YWw/XCJpdGFsXCI6dm9pZCAwfSxpLmVtaXRCbG9jaz1mdW5jdGlvbigpe2FyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07dGhpcy5zcGFjaW5nJiYodGhpcy5hZGQoXCIgXCIpLHRoaXMuc3BhY2luZz0hMSksdGhpcy5idWZmZXIubGVuZ3RoPjAmJihlLnB1c2goe3RleHQ6dGhpcy5idWZmZXIsbW9kOnRoaXMubW9kTmFtZSgpfSksdGhpcy5idWZmZXI9XCJcIil9LGkuYWRkPWZ1bmN0aW9uKHQpe1wiIFwiPT09dCYmKGkuc3BhY2luZz0hMCksaS5zcGFjaW5nJiYodGhpcy5idWZmZXIrPVwiIFwiLHRoaXMuc3BhY2luZz0hMSksXCIgXCIhPXQmJih0aGlzLmJ1ZmZlcis9dCl9O2kucG9zaXRpb248dC5sZW5ndGg7KXt2YXIgbz10LmNoYXJBdChpLnBvc2l0aW9uKTsvWyBcXHRdLy50ZXN0KG8pP2kubW9ubz9pLmFkZChvKTppLnNwYWNpbmc9ITA6LzwvLnRlc3Qobyk/aS5tb25vfHxpLmJvbGR8fCEvPGI+Ly50ZXN0KHQuc3Vic3RyKGkucG9zaXRpb24sMykpP2kubW9ub3x8aS5pdGFsfHwhLzxpPi8udGVzdCh0LnN1YnN0cihpLnBvc2l0aW9uLDMpKT8haS5tb25vJiYvPGNvZGU+Ly50ZXN0KHQuc3Vic3RyKGkucG9zaXRpb24sNikpPyhpLmVtaXRCbG9jaygpLGkubW9ubz0hMCxpLm1vZFN0YWNrLnVuc2hpZnQoXCJtb25vXCIpLGkucG9zaXRpb24rPTUpOiFpLm1vbm8mJlwiYm9sZFwiPT09aS5tb2QoKSYmLzxcXC9iPi8udGVzdCh0LnN1YnN0cihpLnBvc2l0aW9uLDQpKT8oaS5lbWl0QmxvY2soKSxpLmJvbGQ9ITEsaS5tb2RTdGFjay5zaGlmdCgpLGkucG9zaXRpb24rPTMpOiFpLm1vbm8mJlwiaXRhbFwiPT09aS5tb2QoKSYmLzxcXC9pPi8udGVzdCh0LnN1YnN0cihpLnBvc2l0aW9uLDQpKT8oaS5lbWl0QmxvY2soKSxpLml0YWw9ITEsaS5tb2RTdGFjay5zaGlmdCgpLGkucG9zaXRpb24rPTMpOlwibW9ub1wiPT09aS5tb2QoKSYmLzxcXC9jb2RlPi8udGVzdCh0LnN1YnN0cihpLnBvc2l0aW9uLDcpKT8oaS5lbWl0QmxvY2soKSxpLm1vbm89ITEsaS5tb2RTdGFjay5zaGlmdCgpLGkucG9zaXRpb24rPTYpOmkuYWRkKG8pOihpLmVtaXRCbG9jaygpLGkuaXRhbD0hMCxpLm1vZFN0YWNrLnVuc2hpZnQoXCJpdGFsXCIpLGkucG9zaXRpb24rPTIpOihpLmVtaXRCbG9jaygpLGkuYm9sZD0hMCxpLm1vZFN0YWNrLnVuc2hpZnQoXCJib2xkXCIpLGkucG9zaXRpb24rPTIpOi8mLy50ZXN0KG8pPy8mbHQ7Ly50ZXN0KHQuc3Vic3RyKGkucG9zaXRpb24sNCkpPyhpLmFkZChcIjxcIiksaS5wb3NpdGlvbis9Myk6LyZhbXA7Ly50ZXN0KHQuc3Vic3RyKGkucG9zaXRpb24sNSkpPyhpLmFkZChcIiZcIiksaS5wb3NpdGlvbis9NCk6aS5hZGQoXCImXCIpOmkuYWRkKG8pLGkucG9zaXRpb24rK31yZXR1cm4gaS5lbWl0QmxvY2soKSxlfX0se2tleTpcInNwbGl0TWFya2Rvd25CbG9ja3NcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1bXSxpPXtib2xkOiExLGl0YWw6ITEsbW9ubzohMSxiZWdpbmFibGU6ITAsc3BhY2luZzohMSxwb3NpdGlvbjowLGJ1ZmZlcjpcIlwiLG1vZFN0YWNrOltdfTtmb3IoaS5tb2Q9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMubW9kU3RhY2subGVuZ3RoP1wibm9ybWFsXCI6dGhpcy5tb2RTdGFja1swXX0saS5tb2ROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLm1vZFN0YWNrLmxlbmd0aD9cIm5vcm1hbFwiOlwibW9ub1wiPT09dGhpcy5tb2RTdGFja1swXT9cIm1vbm9cIjppLmJvbGQmJmkuaXRhbD9cImJvbGRpdGFsXCI6aS5ib2xkP1wiYm9sZFwiOmkuaXRhbD9cIml0YWxcIjp2b2lkIDB9LGkuZW1pdEJsb2NrPWZ1bmN0aW9uKCl7YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTt0aGlzLnNwYWNpbmcmJih0aGlzLmFkZChcIiBcIiksdGhpcy5zcGFjaW5nPSExKSx0aGlzLmJ1ZmZlci5sZW5ndGg+MCYmKGUucHVzaCh7dGV4dDp0aGlzLmJ1ZmZlcixtb2Q6dGhpcy5tb2ROYW1lKCl9KSx0aGlzLmJ1ZmZlcj1cIlwiKX0saS5hZGQ9ZnVuY3Rpb24odCl7XCIgXCI9PT10JiYoaS5zcGFjaW5nPSEwKSxpLnNwYWNpbmcmJih0aGlzLmJ1ZmZlcis9XCIgXCIsdGhpcy5zcGFjaW5nPSExKSxcIiBcIiE9dCYmKHR
21167oaXMuYnVmZmVyKz10KX07aS5wb3NpdGlvbjx0Lmxlbmd0aDspe3ZhciBvPXQuY2hhckF0KGkucG9zaXRpb24pOy9bIFxcdF0vLnRlc3Qobyk/KGkubW9ubz9pLmFkZChvKTppLnNwYWNpbmc9ITAsaS5iZWdpbmFibGU9ITApOi9cXFxcLy50ZXN0KG8pP2kucG9zaXRpb248dC5sZW5ndGgrMSYmKGkucG9zaXRpb24rKyxvPXQuY2hhckF0KGkucG9zaXRpb24pLC8gXFx0Ly50ZXN0KG8pP2kuc3BhY2luZz0hMDooaS5hZGQobyksaS5iZWdpbmFibGU9ITEpKTppLm1vbm98fGkuYm9sZHx8IWkuYmVnaW5hYmxlJiYhaS5zcGFjaW5nfHwhL1xcKi8udGVzdChvKT9pLm1vbm98fGkuaXRhbHx8IWkuYmVnaW5hYmxlJiYhaS5zcGFjaW5nfHwhL1xcXy8udGVzdChvKT8haS5tb25vJiYoaS5iZWdpbmFibGV8fGkuc3BhY2luZykmJi9gLy50ZXN0KG8pPyhpLmVtaXRCbG9jaygpLGkubW9ubz0hMCxpLm1vZFN0YWNrLnVuc2hpZnQoXCJtb25vXCIpKTohaS5tb25vJiZcImJvbGRcIj09PWkubW9kKCkmJi9cXCovLnRlc3Qobyk/aS5wb3NpdGlvbj09PXQubGVuZ3RoLTF8fC9bLixfYCBcXHRcXG5dLy50ZXN0KHQuY2hhckF0KGkucG9zaXRpb24rMSkpPyhpLmVtaXRCbG9jaygpLGkuYm9sZD0hMSxpLm1vZFN0YWNrLnNoaWZ0KCkpOmkuYWRkKG8pOiFpLm1vbm8mJlwiaXRhbFwiPT09aS5tb2QoKSYmL1xcXy8udGVzdChvKT9pLnBvc2l0aW9uPT09dC5sZW5ndGgtMXx8L1suLCpgIFxcdFxcbl0vLnRlc3QodC5jaGFyQXQoaS5wb3NpdGlvbisxKSk/KGkuZW1pdEJsb2NrKCksaS5pdGFsPSExLGkubW9kU3RhY2suc2hpZnQoKSk6aS5hZGQobyk6aS5tb25vJiZcIm1vbm9cIj09PWkubW9kKCkmJi9gLy50ZXN0KG8pP2kucG9zaXRpb249PT10Lmxlbmd0aC0xfHwvWy4sKl8gXFx0XFxuXS8udGVzdCh0LmNoYXJBdChpLnBvc2l0aW9uKzEpKT8oaS5lbWl0QmxvY2soKSxpLm1vbm89ITEsaS5tb2RTdGFjay5zaGlmdCgpKTppLmFkZChvKTooaS5hZGQobyksaS5iZWdpbmFibGU9ITEpOihpLmVtaXRCbG9jaygpLGkuaXRhbD0hMCxpLm1vZFN0YWNrLnVuc2hpZnQoXCJpdGFsXCIpKTooaS5lbWl0QmxvY2soKSxpLmJvbGQ9ITAsaS5tb2RTdGFjay51bnNoaWZ0KFwiYm9sZFwiKSksaS5wb3NpdGlvbisrfXJldHVybiBpLmVtaXRCbG9jaygpLGV9fSx7a2V5Olwic3BsaXRCbG9ja3NcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZGVjb2RlTWFya3VwU3lzdGVtKGUpO3JldHVyblwibm9uZVwiPT09aT9be3RleHQ6dCxtb2Q6XCJub3JtYWxcIn1dOlwibWFya2Rvd25cIj09PWk/dGhpcy5zcGxpdE1hcmtkb3duQmxvY2tzKHQpOlwiaHRtbFwiPT09aT90aGlzLnNwbGl0SHRtbEJsb2Nrcyh0KTp2b2lkIDB9fSx7a2V5Olwib3Zlck1heFdpZHRoXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jdHgubWVhc3VyZVRleHQodCkud2lkdGg7cmV0dXJuIHRoaXMubGluZXMuY3VyV2lkdGgoKStlPnRoaXMucGFyZW50LmZvbnRPcHRpb25zLm1heFdkdH19LHtrZXk6XCJnZXRMb25nZXN0Rml0XCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVwiXCIsaT0wO2k8dC5sZW5ndGg7KXt2YXIgbz1cIlwiPT09ZT9cIlwiOlwiIFwiLG49ZStvK3RbaV07aWYodGhpcy5vdmVyTWF4V2lkdGgobikpYnJlYWs7ZT1uLGkrK31yZXR1cm4gaX19LHtrZXk6XCJnZXRMb25nZXN0Rml0V29yZFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGgmJiF0aGlzLm92ZXJNYXhXaWR0aCh0LnNsaWNlKDAsZSkpOyllKys7cmV0dXJuIGV9fSx7a2V5Olwic3BsaXRTdHJpbmdJbnRvTGluZXNcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06XCJub3JtYWxcIixpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07dD10LnJlcGxhY2UoL14oICspL2csXCIkMVxcclwiKSx0PXQucmVwbGFjZSgvKFteXFxyXVteIF0qKSggKykvZyxcIiQxXFxyJDJcXHJcIik7Zm9yKHZhciBvPXQuc3BsaXQoXCJcXHJcIik7by5sZW5ndGg+MDspe3ZhciBuPXRoaXMuZ2V0TG9uZ2VzdEZpdChvKTtpZigwPT09bil7dmFyIHM9b1swXSxyPXRoaXMuZ2V0TG9uZ2VzdEZpdFdvcmQocyk7dGhpcy5saW5lcy5uZXdMaW5lKHMuc2xpY2UoMCxyKSxlKSxvWzBdPXMuc2xpY2Uocil9ZWxzZXt2YXIgYT1uO1wiIFwiPT09b1tuLTFdP24tLTpcIiBcIj09PW9bYV0mJmErKzt2YXIgaD1vLnNsaWNlKDAsbikuam9pbihcIlwiKTtuPT1vLmxlbmd0aCYmaT90aGlzLmxpbmVzLmFwcGVuZChoLGUpOnRoaXMubGluZXMubmV3TGluZShoLGUpLG89by5zbGljZShhKX19fX1dKSx0fSgpO2UuZGVmYXVsdD1sfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSg5MCkscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXsoMCxhLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5tZWFzdXJlVGV4dD1lLHRoaXMuY3VycmVudD0wLHRoaXMud2lkdGg9MCx0aGlzLmhlaWdodD0wLHRoaXMubGluZXM9W119cmV0dXJuKDAsZC5kZWZhdWx0KSh0LFt7a2V5OlwiX2FkZFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOlwibm9ybWFsXCI7dm9pZCAwPT09dGhpcy5saW5lc1t0XSYmKHRoaXMubGluZXNbdF09e3dpZHRoOjAsaGVpZ2h0OjAsYmxvY2tzOltdfSk7dmFyIG89ZTt2b2lkIDAhPT1lJiZcIlwiIT09ZXx8KG89XCIgXCIpO3ZhciBuPXRoaXMubWVhc3VyZVRleHQobyxpKSxyPSgwLHMuZGVmYXVsdCkoe30sbi52YWx1ZXMpO3IudGV4dD1lLHIud2lkdGg9bi53aWR0aCxyLm1vZD1pLHZvaWQgMCE9PWUmJlwiXCIhPT1lfHwoci53aWR0aD0wKSx0aGlzLmxpbmVzW3RdLmJsb2Nrcy5wdXNoKHIpLHRoaXMubGluZXNbdF0ud2lkdGgrPXIud2lkdGh9fSx7a2V5OlwiY3VyV2lkdGhcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMubGluZXNbdGh
21167pcy5jdXJyZW50XTtyZXR1cm4gdm9pZCAwPT09dD8wOnQud2lkdGh9fSx7a2V5OlwiYXBwZW5kXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOlwibm9ybWFsXCI7dGhpcy5fYWRkKHRoaXMuY3VycmVudCx0LGUpfX0se2tleTpcIm5ld0xpbmVcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06XCJub3JtYWxcIjt0aGlzLl9hZGQodGhpcy5jdXJyZW50LHQsZSksdGhpcy5jdXJyZW50Kyt9fSx7a2V5OlwiZGV0ZXJtaW5lTGluZUhlaWdodHNcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5saW5lcy5sZW5ndGg7dCsrKXt2YXIgZT10aGlzLmxpbmVzW3RdLGk9MDtpZih2b2lkIDAhPT1lLmJsb2Nrcylmb3IodmFyIG89MDtvPGUuYmxvY2tzLmxlbmd0aDtvKyspe3ZhciBuPWUuYmxvY2tzW29dO2k8bi5oZWlnaHQmJihpPW4uaGVpZ2h0KX1lLmhlaWdodD1pfX19LHtrZXk6XCJkZXRlcm1pbmVMYWJlbFNpemVcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MCxpPTA7aTx0aGlzLmxpbmVzLmxlbmd0aDtpKyspe3ZhciBvPXRoaXMubGluZXNbaV07by53aWR0aD50JiYodD1vLndpZHRoKSxlKz1vLmhlaWdodH10aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZX19LHtrZXk6XCJyZW1vdmVFbXB0eUJsb2Nrc1wiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPHRoaXMubGluZXMubGVuZ3RoO2UrKyl7dmFyIGk9dGhpcy5saW5lc1tlXTtpZigwIT09aS5ibG9ja3MubGVuZ3RoJiYoZSE9PXRoaXMubGluZXMubGVuZ3RoLTF8fDAhPT1pLndpZHRoKSl7dmFyIG89e307KDAscy5kZWZhdWx0KShvLGkpLG8uYmxvY2tzPVtdO2Zvcih2YXIgbj12b2lkIDAscj1bXSxhPTA7YTxpLmJsb2Nrcy5sZW5ndGg7YSsrKXt2YXIgaD1pLmJsb2Nrc1thXTswIT09aC53aWR0aD9yLnB1c2goaCk6dm9pZCAwPT09biYmKG49aCl9MD09PXIubGVuZ3RoJiZ2b2lkIDAhPT1uJiZyLnB1c2gobiksby5ibG9ja3M9cix0LnB1c2gobyl9fXJldHVybiB0fX0se2tleTpcImZpbmFsaXplXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmRldGVybWluZUxpbmVIZWlnaHRzKCksdGhpcy5kZXRlcm1pbmVMYWJlbFNpemUoKTt2YXIgdD10aGlzLnJlbW92ZUVtcHR5QmxvY2tzKCk7cmV0dXJue3dpZHRoOnRoaXMud2lkdGgsaGVpZ2h0OnRoaXMuaGVpZ2h0LGxpbmVzOnR9fX1dKSx0fSgpO2UuZGVmYXVsdD1sfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoMjMpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8peygwLGEuZGVmYXVsdCkodGhpcyxlKTt2YXIgbj0oMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKTtyZXR1cm4gbi5fc2V0TWFyZ2lucyhvKSxufXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6XCJyZXNpemVcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dGhpcy5zZWxlY3RlZCxpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp0aGlzLmhvdmVyO2lmKHRoaXMubmVlZHNSZWZyZXNoKGUsaSkpe3ZhciBvPXRoaXMuZ2V0RGltZW5zaW9uc0Zyb21MYWJlbCh0LGUsaSk7dGhpcy53aWR0aD1vLndpZHRoK3RoaXMubWFyZ2luLnJpZ2h0K3RoaXMubWFyZ2luLmxlZnQsdGhpcy5oZWlnaHQ9by5oZWlnaHQrdGhpcy5tYXJnaW4udG9wK3RoaXMubWFyZ2luLmJvdHRvbSx0aGlzLnJhZGl1cz10aGlzLndpZHRoLzJ9fX0se2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dGhpcy5yZXNpemUodCxvLG4pLHRoaXMubGVmdD1lLXRoaXMud2lkdGgvMix0aGlzLnRvcD1pLXRoaXMuaGVpZ2h0LzIsdGhpcy5pbml0Q29udGV4dEZvckRyYXcodCxzKSx0LnJvdW5kUmVjdCh0aGlzLmxlZnQsdGhpcy50b3AsdGhpcy53aWR0aCx0aGlzLmhlaWdodCxzLmJvcmRlclJhZGl1cyksdGhpcy5wZXJmb3JtRmlsbCh0LHMpLHRoaXMudXBkYXRlQm91bmRpbmdCb3goZSxpLHQsbyxuKSx0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCx0aGlzLmxlZnQrdGhpcy50ZXh0U2l6ZS53aWR0aC8yK3RoaXMubWFyZ2luLmxlZnQsdGhpcy50b3ArdGhpcy50ZXh0U2l6ZS5oZWlnaHQvMit0aGlzLm1hcmdpbi50b3AsbyxuKX19LHtrZXk6XCJ1cGRhdGVCb3VuZGluZ0JveFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbil7dGhpcy5fdXBkYXRlQm91bmRpbmdCb3godCxlLGksbyxuKTt2YXIgcz10aGlzLm9wdGlvbnMuc2hhcGVQcm9wZXJ0aWVzLmJvcmRlclJhZGl1czt0aGlzLl9hZGRCb3VuZGluZ0JveE1hcmdpbihzKX19LHtrZXk6XCJkaXN0YW5jZVRvQm9yZGVyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLnJlc2l6ZSh0KTt2YXIgaT10aGlzLm9wdGlvbnMuYm9yZGVyV2lkdGg7cmV0dXJuIE1hdGgubWluKE1hdGguYWJzKHRoaXMud2lkdGgvMi9NYXRoLmNvcyhlKSksTWF0aC5hYnModGhpcy5oZWlnaHQvMi9NYXRoLnNpbihlKSkpK2l9fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtpKDE5NSksdC5leHBvcnRzPWkoNykuT2JqZWN0LmdldFByb3RvdHlwZU9mfSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSg0MSksbj1pKDg1KTtpKDg3KShcImdldFByb3RvdHlwZU9mXCIsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4obyh0KSl9fSl9LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9e2RlZmF1bHQ6aSgxOTcpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbih0LGUsaSl7aSgxOTgpLHQuZXhwb3J0cz1pKDcpLk9iamVjdC5zZXRQcm90b3R5cGVPZn0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTcpO28oby5TLFwiT2JqZWN0XCIse3NldFByb3RvdHlwZU9mOmkoMTk5KS5zZXR9KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMzIpLG49aSgyNykscz1mdW5jdGlvbih0LGUpe2lmKG4odCksIW8oZSkmJm51bGwhPT1lKXRocm93IFR5cGVFcnJvcihlK1wiOiBjYW4ndCBzZXQgYXMgcHJvdG90eXBlIVwiKX07dC5leHBvcnRzPXtzZXQ6T2JqZWN0LnNldFByb3RvdHlwZU9mfHwoXCJfX3Byb3RvX19cImlue30/ZnVuY3Rpb24odCxlLG8pe3RyeXtvPWkoODApKEZ1bmN0aW9uLmNhbGwsaSg4OSkuZihPYmplY3QucHJvdG90eXBlLFwiX19wcm90b19fXCIpLnNldCwyKSxvKHQsW10pLGU9ISh0IGluc3RhbmNlb2YgQXJyYXkpfWNhdGNoKHQpe2U9ITB9cmV0dXJuIGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHModCxpKSxlP3QuX19wcm90b19fPWk6byh0LGkpLHR9fSh7fSwhMSk6dm9pZCAwKSxjaGVjazpzfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDczKSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXso
21167MCxhLmRlZmF1bHQpKHRoaXMsZSk7dmFyIG49KDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZhdWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSk7cmV0dXJuIG4uX3NldE1hcmdpbnMobyksbn1yZXR1cm4oMCxwLmRlZmF1bHQpKGUsdCksKDAsZC5kZWZhdWx0KShlLFt7a2V5OlwicmVzaXplXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnRoaXMuc2VsZWN0ZWQsaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06dGhpcy5ob3ZlcjtpZih0aGlzLm5lZWRzUmVmcmVzaChlLGkpKXt2YXIgbz10aGlzLmdldERpbWVuc2lvbnNGcm9tTGFiZWwodCxlLGkpLG49TWF0aC5tYXgoby53aWR0aCt0aGlzLm1hcmdpbi5yaWdodCt0aGlzLm1hcmdpbi5sZWZ0LG8uaGVpZ2h0K3RoaXMubWFyZ2luLnRvcCt0aGlzLm1hcmdpbi5ib3R0b20pO3RoaXMub3B0aW9ucy5zaXplPW4vMix0aGlzLndpZHRoPW4sdGhpcy5oZWlnaHQ9bix0aGlzLnJhZGl1cz10aGlzLndpZHRoLzJ9fX0se2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dGhpcy5yZXNpemUodCxvLG4pLHRoaXMubGVmdD1lLXRoaXMud2lkdGgvMix0aGlzLnRvcD1pLXRoaXMuaGVpZ2h0LzIsdGhpcy5fZHJhd1Jhd0NpcmNsZSh0LGUsaSxzKSx0aGlzLnVwZGF0ZUJvdW5kaW5nQm94KGUsaSksdGhpcy5sYWJlbE1vZHVsZS5kcmF3KHQsdGhpcy5sZWZ0K3RoaXMudGV4dFNpemUud2lkdGgvMit0aGlzLm1hcmdpbi5sZWZ0LGksbyxuKX19LHtrZXk6XCJ1cGRhdGVCb3VuZGluZ0JveFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5ib3VuZGluZ0JveC50b3A9ZS10aGlzLm9wdGlvbnMuc2l6ZSx0aGlzLmJvdW5kaW5nQm94LmxlZnQ9dC10aGlzLm9wdGlvbnMuc2l6ZSx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PXQrdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5ib3R0b209ZSt0aGlzLm9wdGlvbnMuc2l6ZX19LHtrZXk6XCJkaXN0YW5jZVRvQm9yZGVyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZXNpemUodCksLjUqdGhpcy53aWR0aH19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDczKSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvLG4scil7KDAsYS5kZWZhdWx0KSh0aGlzLGUpO3ZhciBoPSgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpO3JldHVybiBoLnNldEltYWdlcyhuLHIpLGh9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcInJlc2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp0aGlzLnNlbGVjdGVkLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnRoaXMuaG92ZXI7aWYodm9pZCAwPT09dGhpcy5pbWFnZU9iai5zcmN8fHZvaWQgMD09PXRoaXMuaW1hZ2VPYmoud2lkdGh8fHZvaWQgMD09PXRoaXMuaW1hZ2VPYmouaGVpZ2h0KXt2YXIgbz0yKnRoaXMub3B0aW9ucy5zaXplO3JldHVybiB0aGlzLndpZHRoPW8sdGhpcy5oZWlnaHQ9byx2b2lkKHRoaXMucmFkaXVzPS41KnRoaXMud2lkdGgpfXRoaXMubmVlZHNSZWZyZXNoKGUsaSkmJnRoaXMuX3Jlc2l6ZUltYWdlKCl9fSx7a2V5OlwiZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt0aGlzLnN3aXRjaEltYWdlcyhvKSx0aGlzLnJlc2l6ZSgpLHRoaXMubGVmdD1lLXRoaXMud2lkdGgvMix0aGlzLnRvcD1pLXRoaXMuaGVpZ2h0LzIsdGhpcy5fZHJhd1Jhd0NpcmNsZSh0LGUsaSxzKSx0LnNhdmUoKSx0LmNsaXAoKSx0aGlzLl9kcmF3SW1hZ2VBdFBvc2l0aW9uKHQscyksdC5yZXN0b3JlKCksdGhpcy5fZHJhd0ltYWdlTGFiZWwodCxlLGksbyxuKSx0aGlzLnVwZGF0ZUJvdW5kaW5nQm94KGUsaSl9fSx7a2V5OlwidXBkYXRlQm91bmRpbmdCb3hcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuYm91bmRpbmdCb3gudG9wPWUtdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5sZWZ0PXQtdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5yaWdodD10K3RoaXMub3B0aW9ucy5zaXplLHRoaXMuYm91bmRpbmdCb3guYm90dG9tPWUrdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5sZWZ0PU1hdGgubWluKHRoaXMuYm91bmRpbmdCb3gubGVmdCx0aGlzLmxhYmVsTW9kdWxlLnNpemUubGVmdCksdGhpcy5ib3VuZGluZ0JveC5yaWdodD1NYXRoLm1heCh0aGlzLmJvdW5kaW5nQm94LnJpZ2h0LHRoaXMubGFiZWxNb2R1bGUuc2l6ZS5sZWZ0K3RoaXMubGFiZWxNb2R1bGUuc2l6ZS53aWR0aCksdGhpcy5ib3VuZGluZ0JveC5ib3R0b209TWF0aC5tYXgodGhpcy5ib3VuZGluZ0JveC5ib3R0b20sdGhpcy5ib3VuZGluZ0JveC5ib3R0b20rdGhpcy5sYWJlbE9mZnNldCl9fSx7a2V5OlwiZGlzdGFuY2VUb0JvcmRlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVzaXplKHQpLC41KnRoaXMud2lkdGh9fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDMpLHM9byhuKSxyPWkoMCksYT1vKHIpLGg9aSgxKSxkPW8oaCksbD1pKDQpLHU9byhsKSxjPWkoNSkscD1vKGMpLGY9aSgyMyksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7KDAsYS5kZWZhdWx0KSh0aGlzLGUpO3ZhciBuPSgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpO3JldHVybiBuLl9zZXRNYXJnaW5zKG8pLG59cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcInJlc2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtp
21167Zih0aGlzLm5lZWRzUmVmcmVzaChlLGkpKXt2YXIgbz10aGlzLmdldERpbWVuc2lvbnNGcm9tTGFiZWwodCxlLGkpLG49by53aWR0aCt0aGlzLm1hcmdpbi5yaWdodCt0aGlzLm1hcmdpbi5sZWZ0O3RoaXMud2lkdGg9bix0aGlzLmhlaWdodD1uLHRoaXMucmFkaXVzPXRoaXMud2lkdGgvMn19fSx7a2V5OlwiZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt0aGlzLnJlc2l6ZSh0LG8sbiksdGhpcy5sZWZ0PWUtdGhpcy53aWR0aC8yLHRoaXMudG9wPWktdGhpcy5oZWlnaHQvMix0aGlzLmluaXRDb250ZXh0Rm9yRHJhdyh0LHMpLHQuZGF0YWJhc2UoZS10aGlzLndpZHRoLzIsaS10aGlzLmhlaWdodC8yLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLHRoaXMucGVyZm9ybUZpbGwodCxzKSx0aGlzLnVwZGF0ZUJvdW5kaW5nQm94KGUsaSx0LG8sbiksdGhpcy5sYWJlbE1vZHVsZS5kcmF3KHQsdGhpcy5sZWZ0K3RoaXMudGV4dFNpemUud2lkdGgvMit0aGlzLm1hcmdpbi5sZWZ0LHRoaXMudG9wK3RoaXMudGV4dFNpemUuaGVpZ2h0LzIrdGhpcy5tYXJnaW4udG9wLG8sbil9fSx7a2V5OlwiZGlzdGFuY2VUb0JvcmRlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlVG9Cb3JkZXIodCxlKX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDI0KSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dGhpcy5fZHJhd1NoYXBlKHQsXCJkaWFtb25kXCIsNCxlLGksbyxuLHMpfX0se2tleTpcImRpc3RhbmNlVG9Cb3JkZXJcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kaXN0YW5jZVRvQm9yZGVyKHQsZSl9fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDMpLHM9byhuKSxyPWkoMCksYT1vKHIpLGg9aSgxKSxkPW8oaCksbD1pKDQpLHU9byhsKSxjPWkoNSkscD1vKGMpLGY9aSgyNCksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuKDAsYS5kZWZhdWx0KSh0aGlzLGUpLCgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6XCJkcmF3XCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMpe3RoaXMuX2RyYXdTaGFwZSh0LFwiY2lyY2xlXCIsMixlLGksbyxuLHMpfX0se2tleTpcImRpc3RhbmNlVG9Cb3JkZXJcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJlc2l6ZSh0KSx0aGlzLm9wdGlvbnMuc2l6ZX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDIzKSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcInJlc2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp0aGlzLnNlbGVjdGVkLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnRoaXMuaG92ZXI7aWYodGhpcy5uZWVkc1JlZnJlc2goZSxpKSl7dmFyIG89dGhpcy5nZXREaW1lbnNpb25zRnJvbUxhYmVsKHQsZSxpKTt0aGlzLmhlaWdodD0yKm8uaGVpZ2h0LHRoaXMud2lkdGg9by53aWR0aCtvLmhlaWdodCx0aGlzLnJhZGl1cz0uNSp0aGlzLndpZHRofX19LHtrZXk6XCJkcmF3XCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMpe3RoaXMucmVzaXplKHQsbyxuKSx0aGlzLmxlZnQ9ZS0uNSp0aGlzLndpZHRoLHRoaXMudG9wPWktLjUqdGhpcy5oZWlnaHQsdGhpcy5pbml0Q29udGV4dEZvckRyYXcodCxzKSx0LmVsbGlwc2VfdmlzKHRoaXMubGVmdCx0aGlzLnRvcCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSx0aGlzLnBlcmZvcm1GaWxsKHQscyksdGhpcy51cGRhdGVCb3VuZGluZ0JveChlLGksdCxvLG4pLHRoaXMubGFiZWxNb2R1bGUuZHJhdyh0LGUsaSxvLG4pfX0se2tleTpcImRpc3RhbmNlVG9Cb3JkZXJcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucmVzaXplKHQpO3ZhciBpPS41KnRoaXMud2lkdGgsbz0uNSp0aGlzLmhlaWdodCxuPU1hdGguc2luKGUpKmkscz1NYXRoLmNvcyhlKSpvO3JldHVybiBpKm8vTWF0aC5zcXJ0KG4qbitzKnMpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoMjMpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8peygwLGEuZGVmYXVsdCkodGhpcyxlKTt2YXIgbj0oMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKTtyZXR1cm4gbi5fc2V0TWFyZ2lucyhvKSxufXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6XCJyZXNpemVcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dGhpcy5uZWVkc1JlZnJlc2goZSxpKSYmKHRoaXMuaWNvblNpemU9e3dpZHRoOk51bWJlcih0aGlzLm9wdGlvbnMuaWNvbi5zaXplKSxoZWlnaHQ6TnVtYmVyKHRoaXMub3B0aW9ucy5pY29uLnNpemUpfSx0aGlzLndpZHRoPXRoaXMuaWNvblNpemUud2lkdGgrdGhpcy5tYXJnaW4ucmlnaHQrdGh
21167pcy5tYXJnaW4ubGVmdCx0aGlzLmhlaWdodD10aGlzLmljb25TaXplLmhlaWdodCt0aGlzLm1hcmdpbi50b3ArdGhpcy5tYXJnaW4uYm90dG9tLHRoaXMucmFkaXVzPS41KnRoaXMud2lkdGgpfX0se2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7aWYodGhpcy5yZXNpemUodCxvLG4pLHRoaXMub3B0aW9ucy5pY29uLnNpemU9dGhpcy5vcHRpb25zLmljb24uc2l6ZXx8NTAsdGhpcy5sZWZ0PWUtdGhpcy53aWR0aC8yLHRoaXMudG9wPWktdGhpcy5oZWlnaHQvMix0aGlzLl9pY29uKHQsZSxpLG8sbixzKSx2b2lkIDAhPT10aGlzLm9wdGlvbnMubGFiZWwpe3RoaXMubGFiZWxNb2R1bGUuZHJhdyh0LHRoaXMubGVmdCt0aGlzLmljb25TaXplLndpZHRoLzIrdGhpcy5tYXJnaW4ubGVmdCxpK3RoaXMuaGVpZ2h0LzIrNSxvKX10aGlzLnVwZGF0ZUJvdW5kaW5nQm94KGUsaSl9fSx7a2V5OlwidXBkYXRlQm91bmRpbmdCb3hcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHRoaXMuYm91bmRpbmdCb3gudG9wPWUtLjUqdGhpcy5vcHRpb25zLmljb24uc2l6ZSx0aGlzLmJvdW5kaW5nQm94LmxlZnQ9dC0uNSp0aGlzLm9wdGlvbnMuaWNvbi5zaXplLHRoaXMuYm91bmRpbmdCb3gucmlnaHQ9dCsuNSp0aGlzLm9wdGlvbnMuaWNvbi5zaXplLHRoaXMuYm91bmRpbmdCb3guYm90dG9tPWUrLjUqdGhpcy5vcHRpb25zLmljb24uc2l6ZSx2b2lkIDAhPT10aGlzLm9wdGlvbnMubGFiZWwmJnRoaXMubGFiZWxNb2R1bGUuc2l6ZS53aWR0aD4wKXt0aGlzLmJvdW5kaW5nQm94LmxlZnQ9TWF0aC5taW4odGhpcy5ib3VuZGluZ0JveC5sZWZ0LHRoaXMubGFiZWxNb2R1bGUuc2l6ZS5sZWZ0KSx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PU1hdGgubWF4KHRoaXMuYm91bmRpbmdCb3gucmlnaHQsdGhpcy5sYWJlbE1vZHVsZS5zaXplLmxlZnQrdGhpcy5sYWJlbE1vZHVsZS5zaXplLndpZHRoKSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbT1NYXRoLm1heCh0aGlzLmJvdW5kaW5nQm94LmJvdHRvbSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbSt0aGlzLmxhYmVsTW9kdWxlLnNpemUuaGVpZ2h0KzUpfX19LHtrZXk6XCJfaWNvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt2YXIgcj1OdW1iZXIodGhpcy5vcHRpb25zLmljb24uc2l6ZSk7dm9pZCAwIT09dGhpcy5vcHRpb25zLmljb24uY29kZT8odC5mb250PShvP1wiYm9sZCBcIjpcIlwiKStyK1wicHggXCIrdGh
21167pcy5vcHRpb25zLmljb24uZmFjZSx0LmZpbGxTdHlsZT10aGlzLm9wdGlvbnMuaWNvbi5jb2xvcnx8XCJibGFja1wiLHQudGV4dEFsaWduPVwiY2VudGVyXCIsdC50ZXh0QmFzZWxpbmU9XCJtaWRkbGVcIix0aGlzLmVuYWJsZVNoYWRvdyh0LHMpLHQuZmlsbFRleHQodGhpcy5vcHRpb25zLmljb24uY29kZSxlLGkpLHRoaXMuZGlzYWJsZVNoYWRvdyh0LHMpKTpjb25zb2xlLmVycm9yKFwiV2hlbiB1c2luZyB0aGUgaWNvbiBzaGFwZSwgeW91IG5lZWQgdG8gZGVmaW5lIHRoZSBjb2RlIGluIHRoZSBpY29uIG9wdGlvbnMgb2JqZWN0LiBUaGlzIGNhbiBiZSBkb25lIHBlciBub2RlIG9yIGdsb2JhbGx5LlwiKX19LHtrZXk6XCJkaXN0YW5jZVRvQm9yZGVyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2VUb0JvcmRlcih0LGUpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoNzMpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8sbixyKXsoMCxhLmRlZmF1bHQpKHRoaXMsZSk7dmFyIGg9KDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZhdWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSk7cmV0dXJuIGguc2V0SW1hZ2VzKG4sciksaH1yZXR1cm4oMCxwLmRlZmF1bHQpKGUsdCksKDAsZC5kZWZhdWx0KShlLFt7a2V5OlwicmVzaXplXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnRoaXMuc2VsZWN0ZWQsaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06dGhpcy5ob3ZlcjtpZih2b2lkIDA9PT10aGlzLmltYWdlT2JqLnNyY3x8dm9pZCAwPT09dGhpcy5pbWFnZU9iai53aWR0aHx8dm9pZCAwPT09dGhpcy5pbWFnZU9iai5oZWlnaHQpe3ZhciBvPTIqdGhpcy5vcHRpb25zLnNpemU7cmV0dXJuIHRoaXMud2lkdGg9byx2b2lkKHRoaXMuaGVpZ2h0PW8pfXRoaXMubmVlZHNSZWZyZXNoKGUsaSkmJnRoaXMuX3Jlc2l6ZUltYWdlKCl9fSx7a2V5OlwiZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXtpZih0aGlzLnN3aXRjaEltYWdlcyhvKSx0aGlzLnJlc2l6ZSgpLHRoaXMubGVmdD1lLXRoaXMud2lkdGgvMix0aGlzLnRvcD1pLXRoaXMuaGVpZ2h0LzIsITA9PT10aGlzLm9wdGlvbnMuc2hhcGVQcm9wZXJ0aWVzLnVzZUJvcmRlcldpdGhJbWFnZSl7dmFyIHI9dGhpcy5vcHRpb25zLmJvcmRlcldpZHRoLGE9dGhpcy5vcHRpb25zLmJvcmRlcldpZHRoU2VsZWN0ZWR8fDIqdGhpcy5vcHRpb25zLmJvcmRlcldpZHRoLGg9KG8/YTpyKS90aGlzLmJvZHkudmlldy5zY2FsZTt0LmxpbmVXaWR0aD1NYXRoLm1pbih0aGlzLndpZHRoLGgpLHQuYmVnaW5QYXRoKCksdC5zdHJva2VTdHlsZT1vP3RoaXMub3B0aW9ucy5jb2xvci5oaWdobGlnaHQuYm9yZGVyOm4/dGhpcy5vcHRpb25zLmNvbG9yLmhvdmVyLmJvcmRlcjp0aGlzLm9wdGlvbnMuY29sb3IuYm9yZGVyLHQuZmlsbFN0eWxlPW8/dGhpcy5vcHRpb25zLmNvbG9yLmhpZ2hsaWdodC5iYWNrZ3JvdW5kOm4/dGhpcy5vcHRpb25zLmNvbG9yLmhvdmVyLmJhY2tncm91bmQ6dGhpcy5vcHRpb25zLmNvbG9yLmJhY2tncm91bmQsdC5yZWN0KHRoaXMubGVmdC0uNSp0LmxpbmVXaWR0aCx0aGlzLnRvcC0uNSp0LmxpbmVXaWR0aCx0aGlzLndpZHRoK3QubGluZVdpZHRoLHRoaXMuaGVpZ2h0K3QubGluZVdpZHRoKSx0LmZpbGwoKSx0aGlzLnBlcmZvcm1TdHJva2UodCxzKSx0LmNsb3NlUGF0aCgpfXRoaXMuX2RyYXdJbWFnZUF0UG9zaXRpb24odCxzKSx0aGlzLl9kcmF3SW1hZ2VMYWJlbCh0LGUsaSxvLG4pLHRoaXMudXBkYXRlQm91bmRpbmdCb3goZSxpKX19LHtrZXk6XCJ1cGRhdGVCb3VuZGluZ0JveFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5yZXNpemUoKSx0aGlzLl91cGRhdGVCb3VuZGluZ0JveCh0LGUpLHZvaWQgMCE9PXRoaXMub3B0aW9ucy5sYWJlbCYmdGhpcy5sYWJlbE1vZHVsZS5zaXplLndpZHRoPjAmJih0aGlzLmJvdW5kaW5nQm94LmxlZnQ9TWF0aC5taW4odGhpcy5ib3VuZGluZ0JveC5sZWZ0LHRoaXMubGFiZWxNb2R1bGUuc2l6ZS5sZWZ0KSx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PU1hdGgubWF4KHRoaXMuYm91bmRpbmdCb3gucmlnaHQsdGhpcy5sYWJlbE1vZHVsZS5zaXplLmxlZnQrdGhpcy5sYWJlbE1vZHVsZS5zaXplLndpZHRoKSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbT1NYXRoLm1heCh0aGlzLmJvdW5kaW5nQm94LmJvdHRvbSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbSt0aGlzLmxhYmVsT2Zmc2V0KSl9fSx7a2V5OlwiZGlzdGFuY2VUb0JvcmRlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlVG9Cb3JkZXIodCxlKX1cbn1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoMjQpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8pe3JldHVybigwLGEuZGVmYXVsdCkodGhpcyxlKSwoMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKX1yZXR1cm4oMCxwLmRlZmF1bHQpKGUsdCksKDAsZC5kZWZhdWx0KShlLFt7a2V5OlwiZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt0aGlzLl9kcmF3U2hhcGUodCxcInNxdWFyZVwiLDIsZSxpLG8sbixzKX19LHtrZXk6XCJkaXN0YW5jZVRvQm9yZGVyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2VUb0JvcmRlcih0LGUpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoMjQpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8pe3JldHVybigwLGEuZGVmYXVsdCkodGhpcyxlKSwoMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKX1yZXR1cm4oMCxwLmRlZmF1bHQpKGUsdCksKDAsZC5kZWZh
21167dWx0KShlLFt7a2V5OlwiZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt0aGlzLl9kcmF3U2hhcGUodCxcImhleGFnb25cIiw0LGUsaSxvLG4scyl9fSx7a2V5OlwiZGlzdGFuY2VUb0JvcmRlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlVG9Cb3JkZXIodCxlKX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDI0KSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZhdWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dGhpcy5fZHJhd1NoYXBlKHQsXCJzdGFyXCIsNCxlLGksbyxuLHMpfX0se2tleTpcImRpc3RhbmNlVG9Cb3JkZXJcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kaXN0YW5jZVRvQm9yZGVyKHQsZSl9fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDMpLHM9byhuKSxyPWkoMCksYT1vKHIpLGg9aSgxKSxkPW8oaCksbD1pKDQpLHU9byhsKSxjPWkoNSkscD1vKGMpLGY9aSgyMyksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7KDAsYS5kZWZhdWx0KSh0aGlzLGUpO3ZhciBuPSgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpO3JldHVybiBuLl9zZXRNYXJnaW5zKG8pLG59cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcInJlc2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLm5lZWRzUmVmcmVzaChlLGkpJiYodGhpcy50ZXh0U2l6ZT10aGlzLmxhYmVsTW9kdWxlLmdldFRleHRTaXplKHQsZSxpKSx0aGlzLndpZHRoPXRoaXMudGV4dFNpemUud2lkdGgrdGhpcy5tYXJnaW4ucmlnaHQrdGh
21167pcy5tYXJnaW4ubGVmdCx0aGlzLmhlaWdodD10aGlzLnRleHRTaXplLmhlaWdodCt0aGlzLm1hcmdpbi50b3ArdGhpcy5tYXJnaW4uYm90dG9tLHRoaXMucmFkaXVzPS41KnRoaXMud2lkdGgpfX0se2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dGhpcy5yZXNpemUodCxvLG4pLHRoaXMubGVmdD1lLXRoaXMud2lkdGgvMix0aGlzLnRvcD1pLXRoaXMuaGVpZ2h0LzIsdGhpcy5lbmFibGVTaGFkb3codCxzKSx0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCx0aGlzLmxlZnQrdGhpcy50ZXh0U2l6ZS53aWR0aC8yK3RoaXMubWFyZ2luLmxlZnQsdGhpcy50b3ArdGhpcy50ZXh0U2l6ZS5oZWlnaHQvMit0aGlzLm1hcmdpbi50b3AsbyxuKSx0aGlzLmRpc2FibGVTaGFkb3codCxzKSx0aGlzLnVwZGF0ZUJvdW5kaW5nQm94KGUsaSx0LG8sbil9fSx7a2V5OlwiZGlzdGFuY2VUb0JvcmRlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlVG9Cb3JkZXIodCxlKX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDI0KSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dGhpcy5fZHJhd1NoYXBlKHQsXCJ0cmlhbmdsZVwiLDMsZSxpLG8sbixzKX19LHtrZXk6XCJkaXN0YW5jZVRvQm9yZGVyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2VUb0JvcmRlcih0LGUpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoMjQpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8pe3JldHVybigwLGEuZGVmYXVsdCkodGhpcyxlKSwoMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKX1yZXR1cm4oMCxwLmRlZmF1bHQpKGUsdCksKDAsZC5kZWZhdWx0KShlLFt7a2V5OlwiZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt0aGlzLl9kcmF3U2hhcGUodCxcInRyaWFuZ2xlRG93blwiLDMsZSxpLG8sbixzKX19LHtrZXk6XCJkaXN0YW5jZVRvQm9yZGVyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2VUb0JvcmRlcih0LGUpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgwKSxzPW8obikscj1pKDEpLGE9byhyKSxoPWkoMiksZD1pKDExKSxsPWkoMTIpLHU9aSg3NCkuZGVmYXVsdCxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7dmFyIG49dGhpczsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5pbWFnZXM9aSx0aGlzLmdyb3Vwcz1vLHRoaXMuYm9keS5mdW5jdGlvbnMuY3JlYXRlRWRnZT10aGlzLmNyZWF0ZS5iaW5kKHRoaXMpLHRoaXMuZWRnZXNMaXN0ZW5lcnM9e2FkZDpmdW5jdGlvbih0LGUpe24uYWRkKGUuaXRlbXMpfSx1cGRhdGU6ZnVuY3Rpb24odCxlKXtuLnVwZGF0ZShlLml0ZW1zKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7bi5yZW1vdmUoZS5pdGVtcyl9fSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZhdWx0T3B0aW9ucz17YXJyb3dzOnt0bzp7ZW5hYmxlZDohMSxzY2FsZUZhY3RvcjoxLHR5cGU6XCJhcnJvd1wifSxtaWRkbGU6e2VuYWJsZWQ6ITEsc2NhbGVGYWN0b3I6MSx0eXBlOlwiYXJyb3dcIn0sZnJvbTp7ZW5hYmxlZDohMSxzY2FsZUZhY3RvcjoxLHR5cGU6XCJhcnJvd1wifX0sYXJyb3dTdHJpa2V0aHJvdWdoOiEwLGNvbG9yOntjb2xvcjpcIiM4NDg0ODRcIixoaWdobGlnaHQ6XCIjODQ4NDg0XCIsaG92ZXI6XCIjODQ4NDg0XCIsaW5oZXJpdDpcImZyb21cIixvcGFjaXR5OjF9LGRhc2hlczohMSxmb250Ontjb2xvcjpcIiMzNDM0MzRcIixzaXplOjE0LGZhY2U6XCJhcmlhbFwiLGJhY2tncm91bmQ6XCJub25lXCIsc3Ryb2tlV2lkdGg6MixzdHJva2VDb2xvcjpcIiNmZmZmZmZcIixhbGlnbjpcImhvcml6b250YWxcIixtdWx0aTohMSx2YWRqdXN0OjAsYm9sZDp7bW9kOlwiYm9sZFwifSxib2xkaXRhbDp7bW9kOlwiYm9sZCBpdGFsaWNcIn0saXRhbDp7bW9kOlwiaXRhbGljXCJ9LG1vbm86e21vZDpcIlwiLHNpemU6MTUsZmFjZTpcImNvdXJpZXIgbmV3XCIsdmFkanVzdDoyfX0saGlkZGVuOiExLGhvdmVyV2lkdGg6MS41LGxhYmVsOnZvaWQgMCxsYWJlbEhpZ2hsaWdodEJvbGQ6ITAsbGVuZ3RoOnZvaWQgMCxwaHlzaWNzOiEwLHNjYWxpbmc6e21pbjoxLG1heDoxNSxsYWJlbDp7ZW5hYmxlZDohMCxtaW46MTQsbWF4OjMwLG1heFZpc2libGU6MzAsZHJhd1RocmVzaG9sZDo1fSxjdXN0b21TY2FsaW5nRnVuY3Rpb246ZnVuY3Rpb24odCxlLGksbyl7aWYoZT09PXQpcmV0dXJuLjU7dmFyIG49MS8oZS10KTtyZXR1cm4gTWF0aC5tYXgoMCwoby10KSpuKX19LHNlbGVjdGlvbldpZHRoOjEuNSxzZWxmUmVmZXJlbmNlU2l6ZToyMCxzaGFkb3c6e2VuYWJsZWQ6ITEsY29sb3I6XCJyZ2JhKDAsMCwwLDAuNSlcIixzaXplOjEwLHg6NSx5OjV9LHNtb290aDp7ZW5hYmxlZDohMCx0eXBlOlwiZHluYW1pY1wiLGZvcmNlRGlyZWN0aW9uOlwibm9uZVwiLHJvdW5kbmVzczouNX0sdGl0bGU6dm9pZCAwLHdpZHRoOjEsdmFsdWU6dm9pZCAwfSxoLmRlZXBFeHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OlwiYmluZEV2ZW50TGlzdGVuZXJzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYm9keS5lbWl0dGVyLm9uKFwiX2ZvcmNlRGlzYWJsZUR5bmFtaWNDdXJ2ZXNcIixmdW5jdGlvbihlKXt2YXIgaT0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdO1wiZHluYW1pY1wiPT09ZSYmKGU9XCJjb250aW51b3VzXCIpO3ZhciBvPSExO2Zvcih2YXIgbiBpbiB0LmJvZHkuZWRnZXMpaWYodC5ib2R5LmVkZ2VzLmhhc093blByb3BlcnR5KG4pKXt2YXIgcz10LmJvZHkuZWRnZXNbbl0scj10LmJvZHkuZGF0YS5lZGdlcy5fZGF0YVtuXTtpZih2b2lkIDAhPT1yKXt2YXIgYT1yLnNtb290aDt2b2lkIDAhPT1hJiYhMD09PWEuZW5hYmxlZCYmXCJkeW5hbWljXCI9PT1hLnR5cGUmJih2b2lkIDA9PT1lP3Muc2V0T3B0aW9ucyh7c21vb3RoOiExfSk6cy5zZXRPcHRpb25zKHtzbW9vdGg6e3R5cGU6ZX19KSxvPSEwKX19ITA9PT1pJiYhMD09PW8mJnQuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIil9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIl9kYXRhVXBkYXRlZFwiLGZ1bmN0aW9uKCl7dC5yZWNvbm5lY3RFZGdlcygpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJyZWZyZXNoRWRnZXNcIix0aGlzLnJlZnJlc2guYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJyZWZyZXNoXCIsdGhpcy5yZWZyZXNoLmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiZGVzdHJveVwiLGZ1bmN0aW9uKCl7aC5mb3JFYWNoKHQuZWRnZXNMaXN0ZW5lcnMsZnVuY3Rpb24oZSxpKXt0LmJvZHkuZGF0YS5lZGdlcyYmdC5ib2R5LmR
21167hdGEuZWRnZXMub2ZmKGksZSl9KSxkZWxldGUgdC5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVFZGdlLGRlbGV0ZSB0LmVkZ2VzTGlzdGVuZXJzLmFkZCxkZWxldGUgdC5lZGdlc0xpc3RlbmVycy51cGRhdGUsZGVsZXRlIHQuZWRnZXNMaXN0ZW5lcnMucmVtb3ZlLGRlbGV0ZSB0LmVkZ2VzTGlzdGVuZXJzfSl9fSx7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpe3UucGFyc2VPcHRpb25zKHRoaXMub3B0aW9ucyx0LCEwLHRoaXMuZGVmYXVsdE9wdGlvbnMsITApO3ZhciBlPSExO2lmKHZvaWQgMCE9PXQuc21vb3RoKWZvcih2YXIgaSBpbiB0aGlzLmJvZHkuZWRnZXMpdGhpcy5ib2R5LmVkZ2VzLmhhc093blByb3BlcnR5KGkpJiYoZT10aGlzLmJvZHkuZWRnZXNbaV0udXBkYXRlRWRnZVR5cGUoKXx8ZSk7aWYodm9pZCAwIT09dC5mb250KWZvcih2YXIgbyBpbiB0aGlzLmJvZHkuZWRnZXMpdGhpcy5ib2R5LmVkZ2VzLmhhc093blByb3BlcnR5KG8pJiZ0aGlzLmJvZHkuZWRnZXNbb10udXBkYXRlTGFiZWxNb2R1bGUoKTt2b2lkIDA9PT10LmhpZGRlbiYmdm9pZCAwPT09dC5waHlzaWNzJiYhMCE9PWV8fHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIil9fX0se2tleTpcInNldERhdGFcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxvPXRoaXMuYm9keS5kYXRhLmVkZ2VzO2lmKHQgaW5zdGFuY2VvZiBkfHx0IGluc3RhbmNlb2YgbCl0aGlzLmJvZHkuZGF0YS5lZGdlcz10O2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl0aGlzLmJvZHkuZGF0YS5lZGdlcz1uZXcgZCx0aGlzLmJvZHkuZGF0YS5lZGdlcy5hZGQodCk7ZWxzZXtpZih0KXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcnJheSBvciBEYXRhU2V0IGV4cGVjdGVkXCIpO3RoaXMuYm9keS5kYXRhLmVkZ2VzPW5ldyBkfWlmKG8mJmguZm9yRWFjaCh0aGlzLmVkZ2VzTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7by5vZmYoZSx0KX0pLHRoaXMuYm9keS5lZGdlcz17fSx0aGlzLmJvZHkuZGF0YS5lZGdlcyl7aC5mb3JFYWNoKHRoaXMuZWRnZXNMaXN0ZW5lcnMsZnVuY3Rpb24odCxpKXtlLmJvZHkuZGF0YS5lZGdlcy5vbihpLHQpfSk7dmFyIG49dGhpcy5ib2R5LmRhdGEuZWRnZXMuZ2V0SWRzKCk7dGhpcy5hZGQobiwhMCl9dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9hZGp1c3RFZGdlc0ZvckhpZXJhcmNoaWNhbExheW91dFwiKSwhMT09PWkmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIil9fSx7a2V5OlwiYWRkXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0saT10aGlzLmJvZHkuZWRnZXMsbz10aGlzLmJvZHkuZGF0YS5lZGdlcyxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBzPXRbbl0scj1pW3NdO3ImJnIuZGlzY29ubmVjdCgpO3ZhciBhPW8uZ2V0KHMse3Nob3dJbnRlcm5hbElkczohMH0pO2lbc109dGhpcy5jcmVhdGUoYSl9dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9hZGp1c3RFZGdlc0ZvckhpZXJhcmNoaWNhbExheW91dFwiKSwhMT09PWUmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIil9fSx7a2V5OlwidXBkYXRlXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuYm9keS5lZGdlcyxpPXRoaXMuYm9keS5kYXRhLmVkZ2VzLG89ITEsbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcz10W25dLHI9aS5nZXQocyksYT1lW3NdO3ZvaWQgMCE9PWE/KGEuZGlzY29ubmVjdCgpLG89YS5zZXRPcHRpb25zKHIpfHxvLGEuY29ubmVjdCgpKToodGhpcy5ib2R5LmVkZ2VzW3NdPXRoaXMuY3JlYXRlKHIpLG89ITApfSEwPT09bz8odGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9hZGp1c3RFZGdlc0ZvckhpZXJhcmNoaWNhbExheW91dFwiKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2RhdGFDaGFuZ2VkXCIpKTp0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2RhdGFVcGRhdGVkXCIpfX0se2tleTpcInJlbW92ZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV07aWYoMCE9PXQubGVuZ3RoKXt2YXIgaT10aGlzLmJvZHkuZWRnZXM7aC5mb3JFYWNoKHQsZnVuY3Rpb24odCl7dmFyIGU9aVt0XTt2b2lkIDAhPT1lJiZlLnJlbW92ZSgpfSksZSYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9kYXRhQ2hhbmdlZFwiKX19fSx7a2V5OlwicmVmcmVzaFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztoLmZvckVhY2godGhpcy5ib2R5LmVkZ2VzLGZ1bmN0aW9uKGUsaSl7dmFyIG89dC5ib2R5LmRhdGEuZWRnZXMuX2RhdGFbaV07dm9pZCAwIT09byYmZS5zZXRPcHRpb25zKG8pfSl9fSx7a2V5OlwiY3JlYXRlXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB1KHQsdGhpcy5ib2R5LHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zKX19LHtrZXk6XCJyZWNvbm5lY3RFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmJvZHkubm9kZXMsaT10aGlzLmJvZHkuZWRnZXM7Zm9yKHQgaW4gZSllLmhhc093blByb3BlcnR5KHQpJiYoZVt0XS5lZGdlcz1bXSk7Zm9yKHQgaW4gaSlpZihpLmhhc093blByb3BlcnR5KHQpKXt2YXIgbz1pW3RdO28uZnJvbT1udWxsLG8udG89bnVsbCxvLmNvbm5lY3QoKX19fSx7a2V5OlwiZ2V0Q29ubmVjdGVkTm9kZXNcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1bXTtpZih2b2lkIDAhPT10aGlzLmJvZHkuZWRnZXNbdF0pe3ZhciBpPXRoaXMuYm9keS5lZGdlc1t0XTt2b2lkIDAhPT1pLmZyb21JZCYmZS5wdXNoKGkuZnJvbUlkKSx2b2lkIDAhPT1pLnRvSWQmJmUucHVzaChpLnRvSWQpfXJldHVybiBlfX0se2tleTpcIl91cGRhdGVTdGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5fYWRkTWlzc2luZ0VkZ2VzKCksdGhpcy5fcmVtb3ZlSW52YWxpZEVkZ2VzKCl9fSx7a2V5OlwiX3JlbW92ZUludmFsaWRFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPVtdO2guZm9yRWFjaCh0aGlzLmJvZHkuZWRnZXMsZnVuY3Rpb24oaSxvKXt2YXIgbj10LmJvZHkubm9kZXNbaS50b0lkXSxzPXQuYm9keS5ub2Rlc1tpLmZyb21JZF07dm9pZCAwIT09biYmITA9PT1uLmlzQ2x1c3Rlcnx8dm9pZCAwIT09cyYmITA9PT1zLmlzQ2x1c3Rlcnx8dm9pZCAwIT09biYmdm9pZCAwIT09c3x8ZS5wdXNoKG8pfSksdGhpcy5yZW1vdmUoZSwhMSl9fSx7a2V5OlwiX2FkZE1pc3NpbmdFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ib2R5LmVkZ2VzLGU9dGhpcy5ib2R5LmR
21167hdGEuZWRnZXMsaT1bXTtlLmZvckVhY2goZnVuY3Rpb24oZSxvKXt2b2lkIDA9PT10W29dJiZpLnB1c2gobyl9KSx0aGlzLmFkZChpLCEwKX19XSksdH0oKTtlLmRlZmF1bHQ9Y30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMzApLHM9byhuKSxyPWkoMyksYT1vKHIpLGg9aSgwKSxkPW8oaCksbD1pKDEpLHU9byhsKSxjPWkoNCkscD1vKGMpLGY9aSg1KSxtPW8oZiksdj1pKDIxNiksZz1vKHYpLHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuKDAsZC5kZWZhdWx0KSh0aGlzLGUpLCgwLHAuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLGEuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybigwLG0uZGVmYXVsdCkoZSx0KSwoMCx1LmRlZmF1bHQpKGUsW3trZXk6XCJfbGluZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pWzBdLG49aVsxXTt0aGlzLl9iZXppZXJDdXJ2ZSh0LGUsbyxuKX19LHtrZXk6XCJfZ2V0VmlhQ29vcmRpbmF0ZXNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZnJvbS54LXRoaXMudG8ueCxlPXRoaXMuZnJvbS55LXRoaXMudG8ueSxpPXZvaWQgMCxvPXZvaWQgMCxuPXZvaWQgMCxzPXZvaWQgMCxyPXRoaXMub3B0aW9ucy5zbW9vdGgucm91bmRuZXNzO3JldHVybihNYXRoLmFicyh0KT5NYXRoLmFicyhlKXx8ITA9PT10aGlzLm9wdGlvbnMuc21vb3RoLmZvcmNlRGlyZWN0aW9ufHxcImhvcml6b250YWxcIj09PXRoaXMub3B0aW9ucy5zbW9vdGguZm9yY2VEaXJlY3Rpb24pJiZcInZlcnRpY2FsXCIhPT10aGlzLm9wdGlvbnMuc21vb3RoLmZvcmNlRGlyZWN0aW9uPyhvPXR
21167oaXMuZnJvbS55LHM9dGhpcy50by55LGk9dGhpcy5mcm9tLngtcip0LG49dGhpcy50by54K3IqdCk6KG89dGhpcy5mcm9tLnktciplLHM9dGhpcy50by55K3IqZSxpPXRoaXMuZnJvbS54LG49dGhpcy50by54KSxbe3g6aSx5Om99LHt4Om4seTpzfV19fSx7a2V5OlwiZ2V0VmlhTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFZpYUNvb3JkaW5hdGVzKCl9fSx7a2V5OlwiX2ZpbmRCb3JkZXJQb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2ZpbmRCb3JkZXJQb3NpdGlvbkJlemllcih0LGUpfX0se2tleTpcIl9nZXREaXN0YW5jZVRvRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixyKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjYmJnZvaWQgMCE9PWFyZ3VtZW50c1s2XT9hcmd1bWVudHNbNl06dGhpcy5fZ2V0VmlhQ29vcmRpbmF0ZXMoKSxoPSgwLHMuZGVmYXVsdCkoYSwyKSxkPWhbMF0sbD1oWzFdO3JldHVybiB0aGlzLl9nZXREaXN0YW5jZVRvQmV6aWVyRWRnZSh0LGUsaSxvLG4scixkLGwpfX0se2tleTpcImdldFBvaW50XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnRoaXMuX2dldFZpYUNvb3JkaW5hdGVzKCksaT0oMCxzLmRlZmF1bHQpKGUsMiksbz1pWzBdLG49aVsxXSxyPXQsYT1bXTtyZXR1cm4gYVswXT1NYXRoLnBvdygxLXIsMyksYVsxXT0zKnIqTWF0aC5wb3coMS1yLDIpLGFbMl09MypNYXRoLnBvdyhyLDIpKigxLXIpLGFbM109TWF0aC5wb3cociwzKSx7eDphWzBdKnRoaXMuZnJvbVBvaW50LngrYVsxXSpvLngrYVsyXSpuLngrYVszXSp0aGlzLnRvUG9pbnQueCx5OmFbMF0qdGhpcy5mcm9tUG9pbnQueSthWzFdKm8ueSthWzJdKm4ueSthWzNdKnRoaXMudG9Qb2ludC55fX19XSksZX0oZy5kZWZhdWx0KTtlLmRlZmF1bHQ9eX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDc1KSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcIl9nZXREaXN0YW5jZVRvQmV6aWVyRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzLHIsYSl7dmFyIGg9MWU5LGQ9dm9pZCAwLGw9dm9pZCAwLHU9dm9pZCAwLGM9dm9pZCAwLHA9dm9pZCAwLGY9dCxtPWUsdj1bMCwwLDAsMF07Zm9yKGw9MTtsPDEwO2wrKyl1PS4xKmwsdlswXT1NYXRoLnBvdygxLXUsMyksdlsxXT0zKnUqTWF0aC5wb3coMS11LDIpLHZbMl09MypNYXRoLnBvdyh1LDIpKigxLXUpLHZbM109TWF0aC5wb3codSwzKSxjPXZbMF0qdCt2WzFdKnIueCt2WzJdKmEueCt2WzNdKmkscD12WzBdKmUrdlsxXSpyLnkrdlsyXSphLnkrdlszXSpvLGw+MCYmKGQ9dGhpcy5fZ2V0RGlzdGFuY2VUb0xpbmUoZixtLGMscCxuLHMpLGg9ZDxoP2Q6aCksZj1jLG09cDtyZXR1cm4gaH19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMzApLHM9byhuKSxyPWkoMyksYT1vKHIpLGg9aSgwKSxkPW8oaCksbD1pKDEpLHU9byhsKSxjPWkoNCkscD1vKGMpLGY9aSg1KSxtPW8oZiksdj1pKDc1KSxnPW8odikseT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXsoMCxkLmRlZmF1bHQpKHRoaXMsZSk7dmFyIG49KDAscC5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAsYS5kZWZhdWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSk7cmV0dXJuIG4uX2JvdW5kRnVuY3Rpb249ZnVuY3Rpb24oKXtuLnBvc2l0aW9uQmV6aWVyTm9kZSgpfSxuLmJvZHkuZW1pdHRlci5vbihcIl9yZXBvc2l0aW9uQmV6aWVyTm9kZXNcIixuLl9ib3VuZEZ1bmN0aW9uKSxufXJldHVybigwLG0uZGVmYXVsdCkoZSx0KSwoMCx1LmRlZmF1bHQpKGUsW3trZXk6XCJzZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9ITE7dGhpcy5vcHRpb25zLnBoeXNpY3MhPT10LnBoeXNpY3MmJihlPSEwKSx0aGlzLm9wdGlvbnM9dCx0aGlzLmlkPXRoaXMub3B0aW9ucy5pZCx0aGlzLmZyb209dGhpcy5ib2R5Lm5vZGVzW3RoaXMub3B0aW9ucy5mcm9tXSx0aGlzLnRvPXRoaXMuYm9keS5ub2Rlc1t0aGlzLm9wdGlvbnMudG9dLHRoaXMuc2V0dXBTdXBwb3J0Tm9kZSgpLHRoaXMuY29ubmVjdCgpLCEwPT09ZSYmKHRoaXMudmlhLnNldE9wdGlvbnMoe3BoeXNpY3M6dGhpcy5vcHRpb25zLnBoeXNpY3N9KSx0aGlzLnBvc2l0aW9uQmV6aWVyTm9kZSgpKX19LHtrZXk6XCJjb25uZWN0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmZyb209dGhpcy5ib2R5Lm5vZGVzW3RoaXMub3B0aW9ucy5mcm9tXSx0aGlzLnRvPXRoaXMuYm9keS5ub2Rlc1t0aGlzLm9wdGlvbnMudG9dLHZvaWQgMD09PXRoaXMuZnJvbXx8dm9pZCAwPT09dGhpcy50b3x8ITE9PT10aGlzLm9wdGlvbnMucGh5c2ljcz90aGlzLnZpYS5zZXRPcHRpb25zKHtwaHlzaWNzOiExfSk6dGhpcy5mcm9tLmlkPT09dGhpcy50by5pZD90aGlzLnZpYS5zZXRPcHRpb25zKHtwaHlzaWNzOiExfSk6dGhpcy52aWEuc2V0T3B0aW9ucyh7cGh5c2ljczohMH0pfX0se2tleTpcImNsZWFudXBcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvZHkuZW1pdHRlci5vZmYoXCJfcmVwb3NpdGlvbkJlemllck5vZGVzXCIsdGhpcy5fYm91bmRGdW5jdGlvbiksdm9pZCAwIT09dGhpcy52aWEmJihkZWxldGUgdGhpcy5ib2R5Lm5vZGVzW3RoaXMudmlhLmlkXSx0aGlzLnZpYT12b2lkIDAsITApfX0se2tleTpcInNldHVwU3VwcG9ydE5vZGVcIix2YWx1ZTpmdW5jdGlvbigpe2lmKHZvaWQgMD09PXRoaXMudmlhKXt2YXIgdD1cImVkZ2VJZDpcIit0aGlzLmlkLGU9dGhpcy5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVOb2RlKHtpZDp0LHNoYXBlOlwiY2lyY2xlXCIscGh5c2ljczohMCxoaWRkZW46ITB9KTt0aGlzLmJvZHkubm9kZXNbdF09ZSx0aGlzLnZpYT1lLHRoaXMudmlhLnBhcmVudEVkZ2VJZD10aGlzLmlkLHRoaXMucG9zaXRpb25CZXppZXJOb2RlKCl9fX0se2tleTpcInBvc2l0aW9uQmV6aWVyTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy52aWEmJnZvaWQgMCE9PXRoaXMuZnJvbSYmdm9pZCAwIT09dGhpcy50bz8odGhpcy52aWEueD0uNSoodGhpcy5mcm9tLngrdGhpcy50by54KSx0aGlzLnZpYS55PS41Kih0aGlzLmZyb20ueSt0aGlzLnRvLnkpKTp2b2lkIDAhPT10aGlzLnZpYSYmKHRoaXMudmlhLng9MCx0aGlzLnZpYS55PTApfX0se2tleTpcIl9saW5lXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3RoaXMuX2JlemllckN1cnZlKHQsZSxpKX19LHtrZXk6XCJnZXRWaWFOb2RlXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWF9fSx7a2V5OlwiZ2V0UG9pbnRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dGhpcy52aWEsaT10LG89dm9pZCAwLG49dm9pZCAwO2lmKHRoaXMuZnJvbT09PXRoaXMudG8pe3ZhciByPXRoaXMuX2dldENpcmNsZURhdGEodGhpcy5mcm9tKSxhPSgwLHMuZGVmYXVsdCkociwzKSxoPWFbMF0sZD1hWzFdLGw9YVsyXSx1PTIqTWF0aC5QSSooMS1pKTtvPWgrbCpNYXRoLnNpbih1KSxuPWQrbC1sKigxLU1hdGguY29zKHUpKX1lbHNlIG89TWF0aC5wb3coMS1pLDIpKnRoaXMuZnJvbVBvaW50LngrMippKigxLWkpKmUueCtNYXRoLnBvdyhpLDIpKnRoaXMudG9Qb2ludC54LG49TWF0aC5wb3coMS1pLDIpKnRoaXMuZnJvbVBvaW50LnkrMippKigxLWkpKmUueStNYXRoLnBvdyhpLDIpKnRoaXMudG9Qb2ludC55O3JldHVybnt4Om8seTpufX19LHtrZXk6XCJfZmluZEJvcmRlclBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZmluZEJvcmRlclBvc2l0aW9uQmV6aWVyKHQsZSx0aGlzLnZpYSl9fSx7a2V5OlwiX2dldERpc3RhbmNlVG9FZGdlXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMpe3JldHVybiB0aGlzLl9nZXREaXN0YW5jZVRvQmV6aWVyRWRnZSh0LGUsaSxvLG4scyx0aGlzLnZpYSl9fV0pLGV9KGcuZGVmYXVsdCk7ZS5kZWZhdWx0PXl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDMpLHM9byhuKSxyPWkoMCksYT1vKHIpLGg9aSgxKSxkPW8oaCksbD1pKDQpLHU9byhsKSxjPWkoNSkscD1vKGMpLGY9aSg3NSksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuKDAsYS5kZWZhdWx0KSh0aGlzLGUpLCgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6XCJfbGluZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt0
21167aGlzLl9iZXppZXJDdXJ2ZSh0LGUsaSl9fSx7a2V5OlwiZ2V0VmlhTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFZpYUNvb3JkaW5hdGVzKCl9fSx7a2V5OlwiX2dldFZpYUNvb3JkaW5hdGVzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD12b2lkIDAsZT12b2lkIDAsaT10aGlzLm9wdGlvbnMuc21vb3RoLnJvdW5kbmVzcyxvPXRoaXMub3B0aW9ucy5zbW9vdGgudHlwZSxuPU1hdGguYWJzKHRoaXMuZnJvbS54LXRoaXMudG8ueCkscz1NYXRoLmFicyh0aGlzLmZyb20ueS10aGlzLnRvLnkpO2lmKFwiZGlzY3JldGVcIj09PW98fFwiZGlhZ29uYWxDcm9zc1wiPT09byl7dmFyIHI9dm9pZCAwLGE9dm9pZCAwO3I9YT1uPD1zP2kqczppKm4sdGhpcy5mcm9tLng+dGhpcy50by54JiYocj0tciksdGhpcy5mcm9tLnk+PXRoaXMudG8ueSYmKGE9LWEpLHQ9dGhpcy5mcm9tLngrcixlPXRoaXMuZnJvbS55K2EsXCJkaXNjcmV0ZVwiPT09byYmKG48PXM/dD1uPGkqcz90aGlzLmZyb20ueDp0OmU9czxpKm4/dGhpcy5mcm9tLnk6ZSl9ZWxzZSBpZihcInN0cmFpZ2h0Q3Jvc3NcIj09PW8pe3ZhciBoPSgxLWkpKm4sZD0oMS1pKSpzO248PXM/KGg9MCx0aGlzLmZyb20ueTx0aGlzLnRvLnkmJihkPS1kKSk6KHRoaXMuZnJvbS54PHRoaXMudG8ueCYmKGg9LWgpLGQ9MCksdD10aGlzLnRvLngraCxlPXRoaXMudG8ueStkfWVsc2UgaWYoXCJob3Jpem9udGFsXCI9PT1vKXt2YXIgbD0oMS1pKSpuO3RoaXMuZnJvbS54PHRoaXMudG8ueCYmKGw9LWwpLHQ9dGhpcy50by54K2wsZT10aGlzLmZyb20ueX1lbHNlIGlmKFwidmVydGljYWxcIj09PW8pe3ZhciB1PSgxLWkpKnM7dGhpcy5mcm9tLnk8dGhpcy50by55JiYodT0tdSksdD10aGlzLmZyb20ueCxlPXRoaXMudG8ueSt1fWVsc2UgaWYoXCJjdXJ2ZWRDV1wiPT09byl7bj10aGlzLnRvLngtdGhpcy5mcm9tLngscz10aGlzLmZyb20ueS10aGlzLnRvLnk7dmFyIGM9TWF0aC5zcXJ0KG4qbitzKnMpLHA9TWF0aC5QSSxmPU1hdGguYXRhbjIocyxuKSxtPShmKyguNSppKy41KSpwKSUoMipwKTt0PXRoaXMuZnJvbS54KyguNSppKy41KSpjKk1hdGguc2luKG0pLGU9dGhpcy5mcm9tLnkrKC41KmkrLjUpKmMqTWF0aC5jb3MobSl9ZWxzZSBpZihcImN1cnZlZENDV1wiPT09byl7bj10aGlzLnRvLngtdGhpcy5mcm9tLngscz10aGlzLmZyb20ueS10aGlzLnRvLnk7dmFyIHY9TWF0aC5zcXJ0KG4qbitzKnMpLGc9TWF0aC5QSSx5PU1hdGguYXRhbjIocyxuKSxiPSh5KyguNSotaSsuNSkqZyklKDIqZyk7dD10aGlzLmZyb20ueCsoLjUqaSsuNSkqdipNYXRoLnNpbihiKSxlPXRoaXMuZnJvbS55KyguNSppKy41KSp2Kk1hdGguY29zKGIpfWVsc2V7dmFyIF89dm9pZCAwLHc9dm9pZCAwO189dz1uPD1zP2kqczppKm4sdGhpcy5mcm9tLng+dGhpcy50by54JiYoXz0tXyksdGhpcy5mcm9tLnk+PXRoaXMudG8ueSYmKHc9LXcpLHQ9dGhpcy5mcm9tLngrXyxlPXRoaXMuZnJvbS55K3csbjw9cz90PXRoaXMuZnJvbS54PD10aGlzLnRvLng/dGhpcy50by54PHQ/dGhpcy50by54OnQ6dGhpcy50by54PnQ/dGhpcy50by54OnQ6ZT10aGlzLmZyb20ueT49dGhpcy50by55P3RoaXMudG8ueT5lP3RoaXMudG8ueTplOnRoaXMudG8ueTxlP3RoaXMudG8ueTplfXJldHVybnt4OnQseTplfX19LHtrZXk6XCJfZmluZEJvcmRlclBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e307cmV0dXJuIHRoaXMuX2ZpbmRCb3JkZXJQb3NpdGlvbkJlemllcih0LGUsaS52aWEpfX0se2tleTpcIl9nZXREaXN0YW5jZVRvRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjYmJnZvaWQgMCE9PWFyZ3VtZW50c1s2XT9hcmd1bWVudHNbNl06dGhpcy5fZ2V0VmlhQ29vcmRpbmF0ZXMoKTtyZXR1cm4gdGhpcy5fZ2V0RGlzdGFuY2VUb0JlemllckVkZ2UodCxlLGksbyxuLHMscil9fSx7a2V5OlwiZ2V0UG9pbnRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dGhpcy5fZ2V0VmlhQ29vcmRpbmF0ZXMoKSxpPXQ7cmV0dXJue3g6TWF0aC5wb3coMS1pLDIpKnRoaXMuZnJvbVBvaW50LngrMippKigxLWkpKmUueCtNYXRoLnBvdyhpLDIpKnRoaXMudG9Qb2ludC54LHk6TWF0aC5wb3coMS1pLDIpKnRoaXMuZnJvbVBvaW50LnkrMippKigxLWkpKmUueStNYXRoLnBvdyhpLDIpKnRoaXMudG9Qb2ludC55fX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDExOCksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuKDAsYS5kZWZhdWx0KSh0aGlzLGUpLCgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6XCJfbGluZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dC5iZWdpblBhdGgoKSx0Lm1vdmVUbyh0aGlzLmZyb21Qb2ludC54LHRoaXMuZnJvbVBvaW50LnkpLHQubGluZVRvKHRoaXMudG9Qb2ludC54LHRoaXMudG9Qb2ludC55KSx0aGlzLmVuYWJsZVNoYWRvdyh0LGUpLHQuc3Ryb2tlKCksdGhpcy5kaXNhYmxlU2hhZG93KHQsZSl9fSx7a2V5OlwiZ2V0VmlhTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleTpcImdldFBvaW50XCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJue3g6KDEtdCkqdGhpcy5mcm9tUG9pbnQueCt0KnRoaXMudG9Qb2ludC54LHk6KDEtdCkqdGhpcy5mcm9tUG9pbnQueSt0KnRoaXMudG9Qb2ludC55fX19LHtrZXk6XCJfZmluZEJvcmRlclBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnRvLG89dGhpcy5mcm9tO3QuaWQ9PT10aGlzLmZyb20uaWQmJihpPXRoaXMuZnJvbSxvPXRoaXMudG8pO3ZhciBuPU1hdGguYXRhbjIoaS55LW8ueSxpLngtby54KSxzPWkueC1vLngscj1pLnktby55LGE9TWF0aC5zcXJ0KHMqcytyKnIpLGg9dC5kaXN0YW5jZVRvQm9yZGVyKGUsbiksZD0oYS1oKS9hLGw9e307cmV0dXJuIGwueD0oMS1kKSpvLngrZCppLngsbC55PSgxLWQpKm8ueStkKmkueSxsfX0se2tleTpcIl9nZXREaXN0YW5jZVRvRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXtyZXR1cm4gdGhpcy5fZ2V0RGlzdGFuY2VUb0xpbmUodCxlLGksbyxuLHMpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSg4KSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSgxMjApLmRlZmF1bHQsdT1pKDIyMSkuZGVmYXVsdCxjPWkoMjIyKS5kZWZh
21167dWx0LHA9aSgyMjMpLmRlZmF1bHQsZj1pKDIyNCkuZGVmYXVsdCxtPWkoMTIxKS5kZWZhdWx0LHY9aSgyMjUpLmRlZmF1bHQsZz1pKDIyNikuZGVmYXVsdCx5PWkoMiksYj1pKDExOSkuZGVmYXVsdCxfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXsoMCxhLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5waHlzaWNzQm9keT17cGh5c2ljc05vZGVJbmRpY2VzOltdLHBoeXNpY3NFZGdlSW5kaWNlczpbXSxmb3JjZXM6e30sdmVsb2NpdGllczp7fX0sdGhpcy5waHlzaWNzRW5hYmxlZD0hMCx0aGlzLnNpbXVsYXRpb25JbnRlcnZhbD0xZTMvNjAsdGhpcy5yZXF1aXJlc1RpbWVvdXQ9ITAsdGhpcy5wcmV2aW91c1N0YXRlcz17fSx0aGlzLnJlZmVyZW5jZVN0YXRlPXt9LHRoaXMuZnJlZXplQ2FjaGU9e30sdGhpcy5yZW5kZXJUaW1lcj12b2lkIDAsdGhpcy5hZGFwdGl2ZVRpbWVzdGVwPSExLHRoaXMuYWRhcHRpdmVUaW1lc3RlcEVuYWJsZWQ9ITEsdGhpcy5hZGFwdGl2ZUNvdW50ZXI9MCx0aGlzLmFkYXB0aXZlSW50ZXJ2YWw9Myx0aGlzLnN0YWJpbGl6ZWQ9ITEsdGhpcy5zdGFydGVkU3RhYmlsaXphdGlvbj0hMSx0aGlzLnN0YWJpbGl6YXRpb25JdGVyYXRpb25zPTAsdGhpcy5yZWFkeT0hMSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZhdWx0T3B0aW9ucz17ZW5hYmxlZDohMCxiYXJuZXNIdXQ6e3RoZXRhOi41LGdyYXZpdGF0aW9uYWxDb25zdGFudDotMmUzLGNlbnRyYWxHcmF2aXR5Oi4zLHNwcmluZ0xlbmd0aDo5NSxzcHJpbmdDb25zdGFudDouMDQsZGFtcGluZzouMDksYXZvaWRPdmVybGFwOjB9LGZvcmNlQXRsYXMyQmFzZWQ6e3RoZXRhOi41LGdyYXZpdGF0aW9uYWxDb25zdGFudDotNTAsY2VudHJhbEdyYXZpdHk6LjAxLHNwcmluZ0NvbnN0YW50Oi4wOCxzcHJpbmdMZW5ndGg6MTAwLGRhbXBpbmc6LjQsYXZvaWRPdmVybGFwOjB9LHJlcHVsc2lvbjp7Y2VudHJhbEdyYXZpdHk6LjIsc3ByaW5nTGVuZ3RoOjIwMCxzcHJpbmdDb25zdGFudDouMDUsbm9kZURpc3RhbmNlOjEwMCxkYW1waW5nOi4wOSxhdm9pZE92ZXJsYXA6MH0saGllcmFyY2hpY2FsUmVwdWxzaW9uOntjZW50cmFsR3Jhdml0eTowLHNwcmluZ0xlbmd0aDoxMDAsc3ByaW5nQ29uc3RhbnQ6LjAxLG5vZGVEaXN0YW5jZToxMjAsZGFtcGluZzouMDl9LG1heFZlbG9jaXR5OjUwLG1pblZlbG9jaXR5Oi43NSxzb2x2ZXI6XCJiYXJuZXNIdXRcIixzdGFiaWxpemF0aW9uOntlbmFibGVkOiEwLGl0ZXJhdGlvbnM6MWUzLHVwZGF0ZUludGVydmFsOjUwLG9ubHlEeW5hbWljRWRnZXM6ITEsZml0OiEwfSx0aW1lc3RlcDouNSxhZGFwdGl2ZVRpbWVzdGVwOiEwfSx5LmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy50aW1lc3RlcD0uNSx0aGlzLmxheW91dEZhaWxlZD0hMSx0aGlzLmJpbmRFdmVudExpc3RlbmVycygpfXJldHVybigwLGQuZGVmYXVsdCkodCxbe2tleTpcImJpbmRFdmVudExpc3RlbmVyc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmJvZHkuZW1pdHRlci5vbihcImluaXRQaHlzaWNzXCIsZnVuY3Rpb24oKXt0LmluaXRQaHlzaWNzKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIl9sYXlvdXRGYWlsZWRcIixmdW5jdGlvbigpe3QubGF5b3V0RmFpbGVkPSEwfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJyZXNldFBoeXNpY3NcIixmdW5jdGlvbigpe3Quc3RvcFNpbXVsYXRpb24oKSx0LnJlYWR5PSExfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJkaXNhYmxlUGh5c2ljc1wiLGZ1bmN0aW9uKCl7dC5waHlzaWNzRW5hYmxlZD0hMSx0LnN0b3BTaW11bGF0aW9uKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcInJlc3RvcmVQaHlzaWNzXCIsZnVuY3Rpb24oKXt0LnNldE9wdGlvbnModC5vcHRpb25zKSwhMD09PXQucmVhZHkmJnQuc3RhcnRTaW11bGF0aW9uKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcInN0YXJ0U2ltdWxhdGlvblwiLGZ1bmN0aW9uKCl7ITA9PT10LnJlYWR5JiZ0LnN0YXJ0U2ltdWxhdGlvbigpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJzdG9wU2ltdWxhdGlvblwiLGZ1bmN0aW9uKCl7dC5zdG9wU2ltdWxhdGlvbigpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJkZXN0cm95XCIsZnVuY3Rpb24oKXt0LnN0b3BTaW11bGF0aW9uKCExKSx0LmJvZHkuZW1pdHRlci5vZmYoKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiX2RhdGFDaGFuZ2VkXCIsZnVuY3Rpb24oKXt0LnVwZGF0ZVBoeXNpY3NEYXRhKCl9KX19LHtrZXk6XCJzZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCl7dm9pZCAwIT09dCYmKCExPT09dD8odGhpcy5vcHRpb25zLmVuYWJsZWQ9ITEsdGhpcy5waHlzaWNzRW5hYmxlZD0hMSx0aGlzLnN0b3BTaW11bGF0aW9uKCkpOiEwPT09dD8odGhpcy5vcHRpb25zLmVuYWJsZWQ9ITAsdGhpcy5waHlzaWNzRW5hYmxlZD0hMCx0aGlzLnN0YXJ0U2ltdWxhdGlvbigpKToodGhpcy5waHlzaWNzRW5hYmxlZD0hMCx5LnNlbGVjdGl2ZU5vdERlZXBFeHRlbmQoW1wic3RhYmlsaXphdGlvblwiXSx0aGlzLm9wdGlvbnMsdCkseS5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsXCJzdGFiaWxpemF0aW9uXCIpLHZvaWQgMD09PXQuZW5hYmxlZCYmKHRoaXMub3B0aW9ucy5lbmFibGVkPSEwKSwhMT09PXRoaXMub3B0aW9ucy5lbmFibGVkJiYodGhpcy5waHlzaWNzRW5hYmxlZD0hMSx0aGlzLnN0b3BTaW11bGF0aW9uKCkpLHRoaXMudGltZXN0ZXA9dGhpcy5vcHRpb25zLnRpbWVzdGVwKSksdGhpcy5pbml0KCl9fSx7a2V5OlwiaW5pdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7XCJmb3JjZUF0bGFzMkJhc2VkXCI9PT10aGlzLm9wdGlvbnMuc29sdmVyPyh0PXRoaXMub3B0aW9ucy5mb3JjZUF0bGFzMkJhc2VkLHRoaXMubm9kZXNTb2x2ZXI9bmV3IHYodGhpcy5ib2R5LHRoaXMucGh5c2ljc0JvZHksdCksdGhpcy5lZGdlc1NvbHZlcj1uZXcgcCh0aGlzLmJvZHksdGhpcy5waHlzaWNzQm9keSx0KSx0aGlzLmdyYXZpdHlTb2x2ZXI9bmV3IGcodGhpcy5ib2R5LHRoaXMucGh5c2ljc0JvZHksdCkpOlwicmVwdWxzaW9uXCI9PT10aGlzLm9wdGlvbnMuc29sdmVyPyh0PXRoaXMub3B0aW9ucy5yZXB1bHNpb24sdGhpcy5ub2Rlc1NvbHZlcj1uZXcgdSh0aGlzLmJvZHksdGhpcy5waHlzaWNzQm9keSx0KSx0aGlzLmVkZ2VzU29sdmVyPW5ldyBwKHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpLHRoaXMuZ3Jhdml0eVNvbHZlcj1uZXcgbSh0aGlzLmJvZHksdGhpcy5waHlzaWNzQm9keSx0KSk6XCJoaWVyYXJjaGljYWxSZXB1bHNpb25cIj09PXRoaXMub3B0aW9ucy5zb2x2ZXI/KHQ9dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbFJlcHVsc2lvbix0aGlzLm5vZGVzU29sdmVyPW5ldyBjKHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpLHRoaXMuZWRnZXNTb2x2ZXI9bmV3IGYodGhpcy5ib2R5LHRoaXMucGh5c2ljc0JvZHksdCksdGhpcy5ncmF2aXR5U29sdmVyPW5ldyBtKHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpKToodD10aGlzLm9wdGlvbnMuYmFybmVzSHV0LHRoaXMubm9kZXNTb2x2ZXI9bmV3IGwodGhpcy5ib2R5LHRoaXMucGh5c2ljc0JvZHksdCksdGhpcy5lZGdlc1NvbHZlcj1uZXcgcCh0aGlzLmJvZHksdGhpcy5waHlzaWNzQm9keSx0KSx0aGlzLmdyYXZpdHlTb2x2ZXI9bmV3IG0odGhpcy5ib2R5LHRoaXMucGh5c2ljc0JvZHksdCkpLHRoaXMubW9kZWxPcHRpb25zPXR9fSx7a2V5OlwiaW5pdFBoeXNpY3NcIix2YWx1ZTpmdW5jdGlvbigpeyEwPT09dGhpcy5waHlzaWNzRW5hYmxlZCYmITA9PT10aGlzLm9wdGlvbnMuZW5hYmxlZD8hMD09PXRoaXMub3B0aW9ucy5zdGFiaWxpemF0aW9uLmVuYWJsZWQ/dGhpcy5zdGFiaWxpemUoKToodGhpcy5zdGFiaWxpemVkPSExLHRoaXMucmVhZHk9ITAsdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcImZpdFwiLHt9LHRoaXMubGF5b3V0RmFpbGVkKSx0aGlzLnN0YXJ0U2ltdWxhdGlvbigpKToodGhpcy5yZWFkeT0hMCx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiZml0XCIpKX19LHtrZXk6XCJzdGFydFNpbXVsYXRpb25cIix2YWx1ZTpmdW5jdGlvbigpeyEwPT09dGhpcy5waHlzaWNzRW5hYmxlZCYmITA9PT10aGlzLm9wdGlvbnMuZW5hYmxlZD8odGhpcy5zdGFiaWxpemVkPSExLHRoaXMuYWRhcHRpdmVUaW
211671lc3RlcD0hMSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3Jlc2l6ZU5vZGVzXCIpLHZvaWQgMD09PXRoaXMudmlld0Z1bmN0aW9uJiYodGhpcy52aWV3RnVuY3Rpb249dGhpcy5zaW11bGF0aW9uU3RlcC5iaW5kKHRoaXMpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiaW5pdFJlZHJhd1wiLHRoaXMudmlld0Z1bmN0aW9uKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3N0YXJ0UmVuZGVyaW5nXCIpKSk6dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZWRyYXdcIil9fSx7a2V5Olwic3RvcFNpbXVsYXRpb25cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PSEoYXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0pfHxhcmd1bWVudHNbMF07dGhpcy5zdGFiaWxpemVkPSEwLCEwPT09dCYmdGhpcy5fZW1pdFN0YWJpbGl6ZWQoKSx2b2lkIDAhPT10aGlzLnZpZXdGdW5jdGlvbiYmKHRoaXMuYm9keS5lbWl0dGVyLm9mZihcImluaXRSZWRyYXdcIix0aGlzLnZpZXdGdW5jdGlvbiksdGhpcy52aWV3RnVuY3Rpb249dm9pZCAwLCEwPT09dCYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9zdG9wUmVuZGVyaW5nXCIpKX19LHtrZXk6XCJzaW11bGF0aW9uU3RlcFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9RGF0ZS5ub3coKTt0aGlzLnBoeXNpY3NUaWNrKCksKERhdGUubm93KCktdDwuNCp0aGlzLnNpbXVsYXRpb25JbnRlcnZhbHx8ITA9PT10aGlzLnJ1bkRvdWJsZVNwZWVkKSYmITE9PT10aGlzLnN0YWJpbGl6ZWQmJih0aGlzLnBoeXNpY3NUaWNrKCksdGhpcy5ydW5Eb3VibGVTcGVlZD0hMCksITA9PT10aGlzLnN0YWJpbGl6ZWQmJnRoaXMuc3RvcFNpbXVsYXRpb24oKX19LHtrZXk6XCJfZW1pdFN0YWJpbGl6ZWRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dGhpcy5zdGFiaWxpemF0aW9uSXRlcmF0aW9uczsodGhpcy5zdGFiaWxpemF0aW9uSXRlcmF0aW9ucz4xfHwhMD09PXRoaXMuc3RhcnRlZFN0YWJpbGl6YXRpb24pJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5ib2R5LmVtaXR0ZXIuZW1pdChcInN0YWJpbGl6ZWRcIix7aXRlcmF0aW9uczplfSksdC5zdGFydGVkU3RhYmlsaXphdGlvbj0hMSx0LnN0YWJpbGl6YXRpb25JdGVyYXRpb25zPTB9LDApfX0se2tleTpcInBoeXNpY3NTdGVwXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmdyYXZpdHlTb2x2ZXIuc29sdmUoKSx0aGlzLm5vZGVzU29sdmVyLnNvbHZlKCksdGhpcy5lZGdlc1NvbHZlci5zb2x2ZSgpLHRoaXMubW92ZU5vZGVzKCl9fSx7a2V5OlwiYWRqdXN0VGltZVN0ZXBcIix2YWx1ZTpmdW5jdGlvbigpeyEwPT09dGhpcy5fZXZhbHVhdGVTdGVwUXVhbGl0eSgpP3RoaXMudGltZXN0ZXA9MS4yKnRoaXMudGltZXN0ZXA6dGhpcy50aW1lc3RlcC8xLjI8dGhpcy5vcHRpb25zLnRpbWVzdGVwP3RoaXMudGltZXN0ZXA9dGhpcy5vcHRpb25zLnRpbWVzdGVwOih0aGlzLmFkYXB0aXZlQ291bnRlcj0tMSx0aGlzLnRpbWVzdGVwPU1hdGgubWF4KHRoaXMub3B0aW9ucy50aW1lc3RlcCx0aGlzLnRpbWVzdGVwLzEuMikpfX0se2tleTpcInBoeXNpY3NUaWNrXCIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLl9zdGFydFN0YWJpbGl6aW5nKCksITAhPT10aGlzLnN0YWJpbGl6ZWQpe2lmKCEwPT09dGhpcy5hZGFwdGl2ZVRpbWVzdGVwJiYhMD09PXRoaXMuYWRhcHRpdmVUaW1lc3RlcEVuYWJsZWQpe3RoaXMuYWRhcHRpdmVDb3VudGVyJXRoaXMuYWRhcHRpdmVJbnRlcnZhbD09MD8odGhpcy50aW1lc3RlcD0yKnRoaXMudGltZXN0ZXAsdGhpcy5waHlzaWNzU3RlcCgpLHRoaXMucmV2ZXJ0KCksdGhpcy50aW1lc3RlcD0uNSp0aGlzLnRpbWVzdGVwLHRoaXMucGh5c2ljc1N0ZXAoKSx0aGlzLnBoeXNpY3NTdGVwKCksdGhpcy5hZGp1c3RUaW1lU3RlcCgpKTp0aGlzLnBoeXNpY3NTdGVwKCksdGhpcy5hZGFwdGl2ZUNvdW50ZXIrPTF9ZWxzZSB0aGlzLnRpbWVzdGVwPXRoaXMub3B0aW9ucy50aW1lc3RlcCx0aGlzLnBoeXNpY3NTdGVwKCk7ITA9PT10aGlzLnN0YWJpbGl6ZWQmJnRoaXMucmV2ZXJ0KCksdGhpcy5zdGFiaWxpemF0aW9uSXRlcmF0aW9ucysrfX19LHtrZXk6XCJ1cGRhdGVQaHlzaWNzRGF0YVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5waHlzaWNzQm9keS5mb3JjZXM9e30sdGhpcy5waHlzaWNzQm9keS5waHlzaWNzTm9kZUluZGljZXM9W10sdGhpcy5waHlzaWNzQm9keS5waHlzaWNzRWRnZUluZGljZXM9W107dmFyIHQ9dGhpcy5ib2R5Lm5vZGVzLGU9dGhpcy5ib2R5LmVkZ2VzO2Zvcih2YXIgaSBpbiB0KXQuaGFzT3duUHJvcGVydHkoaSkmJiEwPT09dFtpXS5vcHRpb25zLnBoeXNpY3MmJnRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLnB1c2godFtpXS5pZCk7Zm9yKHZhciBvIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShvKSYmITA9PT1lW29dLm9wdGlvbnMucGh5c2ljcyYmdGhpcy5waHlzaWNzQm9keS5waHlzaWNzRWRnZUluZGljZXMucHVzaChlW29dLmlkKTtmb3IodmFyIG49MDtuPHRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLmxlbmd0aDtuKyspe3ZhciBzPXRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzW25dO3RoaXMucGh5c2ljc0JvZHkuZm9yY2VzW3NdPXt4OjAseTowfSx2b2lkIDA9PT10aGlzLnBoeXNpY3NCb2R5LnZlbG9jaXRpZXNbc10mJih0aGlzLnBoeXNpY3NCb2R5LnZlbG9jaXRpZXNbc109e3g6MCx5OjB9KX1mb3IodmFyIHIgaW4gdGhpcy5waHlzaWNzQm9keS52ZWxvY2l0aWVzKXZvaWQgMD09PXRbcl0mJmRlbGV0ZSB0aGlzLnBoeXNpY3NCb2R5LnZlbG9jaXRpZXNbcl19fSx7a2V5OlwicmV2ZXJ0XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0oMCxzLmRlZmF1bHQpKHRoaXMucHJldmlvdXNTdGF0ZXMpLGU9dGhpcy5ib2R5Lm5vZGVzLGk9dGhpcy5waHlzaWNzQm9keS52ZWxvY2l0aWVzO3RoaXMucmVmZXJlbmNlU3RhdGU9e307Zm9yKHZhciBvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBuPXRbb107dm9pZCAwIT09ZVtuXT8hMD09PWVbbl0ub3B0aW9ucy5waHlzaWNzJiYodGhpcy5yZWZlcmVuY2VTdGF0ZVtuXT17cG9zaXRpb25zOnt4OmVbbl0ueCx5OmVbbl0ueX19LGlbbl0ueD10aGlzLnByZXZpb3VzU3RhdGVzW25dLnZ4LGlbbl0ueT10aGlzLnByZXZpb3VzU3RhdGVzW25dLnZ5LGVbbl0ueD10aGlzLnByZXZpb3VzU3RhdGVzW25dLngsZVtuXS55PXRoaXMucHJldmlvdXNTdGF0ZXNbbl0ueSk6ZGVsZXRlIHRoaXMucHJldmlvdXNTdGF0ZXNbbl19fX0se2tleTpcIl9ldmFsdWF0ZVN0ZXBRdWFsaXR5XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD12b2lkIDAsZT12b2lkIDAsaT10aGlzLmJvZHkubm9kZXMsbz10aGlzLnJlZmVyZW5jZVN0YXRlO2Zvcih2YXIgbiBpbiB0aGlzLnJlZmVyZW5jZVN0YXRlKWlmKHRoaXMucmVmZXJlbmNlU3RhdGUuaGFzT3duUHJvcGVydHkobikmJnZvaWQgMCE9PWlbbl0mJih0PWlbbl0ueC1vW25dLnBvc2l0aW9ucy54LGU9aVtuXS55LW9bbl0ucG9zaXRpb25zLnksTWF0aC5zcXJ0KE1hdGgucG93KHQsMikrTWF0aC5wb3coZSwyKSk+LjMpKXJldHVybiExO3JldHVybiEwfX0se2tleTpcIm1vdmVOb2Rlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLGU9MCxpPTAsbz0wO288dC5sZW5ndGg7bysrKXt2YXIgbj10W29dLHM9dGhpcy5fcGVyZm9ybVN0ZXAobik7ZT1NYXRoLm1heChlLHMpLGkrPXN9dGhpcy5hZGFwdGl2ZVRpbWVzdGVwRW5hYmxlZD1pL3QubGVuZ3RoPDUsdGhpcy5zdGFiaWxpemVkPWU8dGhpcy5vcHRpb25zLm1pblZlbG9jaXR5fX0se2tleTpcImNhbGN1bGF0ZUNvbXBvbmVudFZlbG9jaXR5XCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3QrPShlLXRoaXMubW9kZWxPcHRpb25zLmRhbXBpbmcqdCkvaSp0aGlzLnRpbWVzdGVwO3ZhciBvPXR
21167oaXMub3B0aW9ucy5tYXhWZWxvY2l0eXx8MWU5O3JldHVybiBNYXRoLmFicyh0KT5vJiYodD10PjA/bzotbyksdH19LHtrZXk6XCJfcGVyZm9ybVN0ZXBcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmJvZHkubm9kZXNbdF0saT10aGlzLnBoeXNpY3NCb2R5LmZvcmNlc1t0XSxvPXRoaXMucGh5c2ljc0JvZHkudmVsb2NpdGllc1t0XTtyZXR1cm4gdGhpcy5wcmV2aW91c1N0YXRlc1t0XT17eDplLngseTplLnksdng6by54LHZ5Om8ueX0sITE9PT1lLm9wdGlvbnMuZml4ZWQueD8oby54PXRoaXMuY2FsY3VsYXRlQ29tcG9uZW50VmVsb2NpdHkoby54LGkueCxlLm9wdGlvbnMubWFzcyksZS54Kz1vLngqdGhpcy50aW1lc3RlcCk6KGkueD0wLG8ueD0wKSwhMT09PWUub3B0aW9ucy5maXhlZC55PyhvLnk9dGhpcy5jYWxjdWxhdGVDb21wb25lbnRWZWxvY2l0eShvLnksaS55LGUub3B0aW9ucy5tYXNzKSxlLnkrPW8ueSp0aGlzLnRpbWVzdGVwKTooaS55PTAsby55PTApLE1hdGguc3FydChNYXRoLnBvdyhvLngsMikrTWF0aC5wb3coby55LDIpKX19LHtrZXk6XCJfZnJlZXplTm9kZXNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYm9keS5ub2Rlcztmb3IodmFyIGUgaW4gdClpZih0Lmhhc093blByb3BlcnR5KGUpJiZ0W2VdLngmJnRbZV0ueSl7dmFyIGk9dFtlXS5vcHRpb25zLmZpeGVkO3RoaXMuZnJlZXplQ2FjaGVbZV09e3g6aS54LHk6aS55fSxpLng9ITAsaS55PSEwfX19LHtrZXk6XCJfcmVzdG9yZUZyb3plbk5vZGVzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJvZHkubm9kZXM7Zm9yKHZhciBlIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShlKSYmdm9pZCAwIT09dGhpcy5mcmVlemVDYWNoZVtlXSYmKHRbZV0ub3B0aW9ucy5maXhlZC54PXRoaXMuZnJlZXplQ2FjaGVbZV0ueCx0W2VdLm9wdGlvbnMuZml4ZWQueT10aGlzLmZyZWV6
21167ZUNhY2hlW2VdLnkpO3RoaXMuZnJlZXplQ2FjaGU9e319fSx7a2V5Olwic3RhYmlsaXplXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnRoaXMub3B0aW9ucy5zdGFiaWxpemF0aW9uLml0ZXJhdGlvbnM7aWYoXCJudW1iZXJcIiE9dHlwZW9mIGUmJihlPXRoaXMub3B0aW9ucy5zdGFiaWxpemF0aW9uLml0ZXJhdGlvbnMsY29uc29sZS5sb2coXCJUaGUgc3RhYmlsaXplIG1ldGhvZCBuZWVkcyBhIG51bWVyaWMgYW1vdW50IG9mIGl0ZXJhdGlvbnMuIFN3aXRjaGluZyB0byBkZWZhdWx0OiBcIixlKSksMD09PXRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLmxlbmd0aClyZXR1cm4gdm9pZCh0aGlzLnJlYWR5PSEwKTt0aGlzLmFkYXB0aXZlVGltZXN0ZXA9dGhpcy5vcHRpb25zLmFkYXB0aXZlVGltZXN0ZXAsdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZXNpemVOb2Rlc1wiKSx0aGlzLnN0b3BTaW11bGF0aW9uKCksdGhpcy5zdGFiaWxpemVkPSExLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfYmxvY2tSZWRyYXdcIiksdGhpcy50YXJnZXRJdGVyYXRpb25zPWUsITA9PT10aGlzLm9wdGlvbnMuc3RhYmlsaXphdGlvbi5vbmx5RHluYW1pY0VkZ2VzJiZ0aGlzLl9mcmVlemVOb2RlcygpLHRoaXMuc3RhYmlsaXphdGlvbkl0ZXJhdGlvbnM9MCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHQuX3N0YWJpbGl6YXRpb25CYXRjaCgpfSwwKX19LHtrZXk6XCJfc3RhcnRTdGFiaWxpemluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuITAhPT10aGlzLnN0YXJ0ZWRTdGFiaWxpemF0aW9uJiYodGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInN0YXJ0U3RhYmlsaXppbmdcIiksdGhpcy5zdGFydGVkU3RhYmlsaXphdGlvbj0hMCwhMCl9fSx7a2V5OlwiX3N0YWJpbGl6YXRpb25CYXRjaFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWZ1bmN0aW9uKCl7cmV0dXJuITE9PT10LnN0YWJpbGl6ZWQmJnQuc3RhYmlsaXphdGlvbkl0ZXJhdGlvbnM8dC50YXJnZXRJdGVyYXRpb25zfSxpPWZ1bmN0aW9uKCl7dC5ib2R5LmVtaXR0ZXIuZW1pdChcInN0YWJpbGl6YXRpb25Qcm9ncmVzc1wiLHtpdGVyYXRpb25zOnQuc3RhYmlsaXphdGlvbkl0ZXJhdGlvbnMsdG90YWw6dC50YXJnZXRJdGVyYXRpb25zfSl9O3RoaXMuX3N0YXJ0U3RhYmlsaXppbmcoKSYmaSgpO2Zvcih2YXIgbz0wO2UoKSYmbzx0aGlzLm9wdGlvbnMuc3RhYmlsaXphdGlvbi51cGRhdGVJbnRlcnZhbDspdGhpcy5waHlzaWNzVGljaygpLG8rKztpKCksZSgpP3NldFRpbWVvdXQodGhpcy5fc3RhYmlsaXphdGlvbkJhdGNoLmJpbmQodGhpcyksMCk6dGhpcy5fZmluYWxpemVTdGFiaWxpemF0aW9uKCl9fSx7a2V5OlwiX2ZpbmFsaXplU3RhYmlsaXphdGlvblwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9hbGxvd1JlZHJhd1wiKSwhMD09PXRoaXMub3B0aW9ucy5zdGFiaWxpemF0aW9uLmZpdCYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcImZpdFwiKSwhMD09PXRoaXMub3B0aW9ucy5zdGFiaWxpemF0aW9uLm9ubHlEeW5hbWljRWRnZXMmJnRoaXMuX3Jlc3RvcmVGcm96ZW5Ob2RlcygpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJzdGFiaWxpemF0aW9uSXRlcmF0aW9uc0RvbmVcIiksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZXF1ZXN0UmVkcmF3XCIpLCEwPT09dGhpcy5zdGFiaWxpemVkP3RoaXMuX2VtaXRTdGFiaWxpemVkKCk6dGhpcy5zdGFydFNpbXVsYXRpb24oKSx0aGlzLnJlYWR5PSEwfX0se2tleTpcIl9kcmF3Rm9yY2VzXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlcy5sZW5ndGg7ZSsrKXt2YXIgaT10aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlc1tlXSxvPXRoaXMuYm9keS5ub2Rlc1tpXSxuPXRoaXMucGh5c2ljc0JvZHkuZm9yY2VzW2ldLHM9TWF0aC5zcXJ0KE1hdGgucG93KG4ueCwyKStNYXRoLnBvdyhuLngsMikpLHI9TWF0aC5taW4oTWF0aC5tYXgoNSxzKSwxNSksYT0zKnIsaD15LkhTVlRvSGV4KCgxODAtMTgwKk1hdGgubWluKDEsTWF0aC5tYXgoMCwuMDMqcykpKS8zNjAsMSwxKSxkPXt4Om8ueCsyMCpuLngseTpvLnkrMjAqbi55fTt0LmxpbmVXaWR0aD1yLHQuc3Ryb2tlU3R5bGU9aCx0LmJlZ2luUGF0aCgpLHQubW92ZVRvKG8ueCxvLnkpLHQubGluZVRvKGQueCxkLnkpLHQuc3Ryb2tlKCk7dmFyIGw9TWF0aC5hdGFuMihuLnksbi54KTt0LmZpbGxTdHlsZT1oLGIuZHJhdyh0LHt0eXBlOlwiYXJyb3dcIixwb2ludDpkLGFuZ2xlOmwsbGVuZ3RoOmF9KSx0LmZpbGwoKX19fV0pLHR9KCk7ZS5kZWZhdWx0PV99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDApLHM9byhuKSxyPWkoMSksYT1vKHIpLGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSxvKXsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5waHlzaWNzQm9keT1pLHRoaXMuc2V0T3B0aW9ucyhvKX1yZXR1cm4oMCxhLmRlZmF1bHQpKHQsW3trZXk6XCJzZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zPXR9fSx7a2V5Olwic29sdmVcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCxlLGksbyxuLHMscixhLGg9dGhpcy5ib2R5Lm5vZGVzLGQ9dGhpcy5waHlzaWNzQm9keS5waHlzaWNzTm9kZUluZGljZXMsbD10aGlzLnBoeXNpY3NCb2R5LmZvcmNlcyx1PXRoaXMub3B0aW9ucy5ub2RlRGlzdGFuY2UsYz0tMi8zL3UscD0wO3A8ZC5sZW5ndGgtMTtwKyspe3I9aFtkW3BdXTtmb3IodmFyIGY9cCsxO2Y8ZC5sZW5ndGg7ZisrKWE9aFtkW2ZdXSx0PWEueC1yLngsZT1hLnktci55LGk9TWF0aC5zcXJ0KHQqdCtlKmUpLDA9PT1pJiYoaT0uMSpNYXRoLnJhbmRvbSgpLHQ9aSksaTwyKnUmJihzPWk8LjUqdT8xOmMqaSs0LzMscy89aSxvPXQqcyxuPWUqcyxsW3IuaWRdLngtPW8sbFtyLmlkXS55LT1uLGxbYS5pZF0ueCs9byxsW2EuaWRdLnkrPW4pfX19XSksdH0oKTtlLmRlZmF1bHQ9aH0s
21167ZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMCkscz1vKG4pLHI9aSgxKSxhPW8ociksaD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8peygwLHMuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLnBoeXNpY3NCb2R5PWksdGhpcy5zZXRPcHRpb25zKG8pfXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dH19LHtrZXk6XCJzb2x2ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZSxpLG8sbixzLHIsYSxoLGQsbD10aGlzLmJvZHkubm9kZXMsdT10aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlcyxjPXRoaXMucGh5c2ljc0JvZHkuZm9yY2VzLHA9dGhpcy5vcHRpb25zLm5vZGVEaXN0YW5jZTtmb3IoaD0wO2g8dS5sZW5ndGgtMTtoKyspZm9yKHI9bFt1W2hdXSxkPWgrMTtkPHUubGVuZ3RoO2QrKylpZihhPWxbdVtkXV0sci5sZXZlbD09PWEubGV2ZWwpe3Q9YS54LXIueCxlPWEueS1yLnksaT1NYXRoLnNxcnQodCp0K2UqZSlcbiAgICA7cz1pPHA/LU1hdGgucG93KC4wNSppLDIpK01hdGgucG93KC4wNSpwLDIpOjAsMD09PWk/aT0uMDE6cy89aSxvPXQqcyxuPWUqcyxjW3IuaWRdLngtPW8sY1tyLmlkXS55LT1uLGNbYS5pZF0ueCs9byxjW2EuaWRdLnkrPW59fX1dKSx0fSgpO2UuZGVmYXVsdD1ofSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgwKSxzPW8obikscj1pKDEpLGE9byhyKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMucGh5c2ljc0JvZHk9aSx0aGlzLnNldE9wdGlvbnMobyl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10fX0se2tleTpcInNvbHZlXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dm9pZCAwLGU9dm9pZCAwLGk9dGhpcy5waHlzaWNzQm9keS5waHlzaWNzRWRnZUluZGljZXMsbz10aGlzLmJvZHkuZWRnZXMsbj12b2lkIDAscz12b2lkIDAscj12b2lkIDAsYT0wO2E8aS5sZW5ndGg7YSsrKWU9b1tpW2FdXSwhMD09PWUuY29ubmVjdGVkJiZlLnRvSWQhPT1lLmZyb21JZCYmdm9pZCAwIT09dGhpcy5ib2R5Lm5vZGVzW2UudG9JZF0mJnZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1tlLmZyb21JZF0mJih2b2lkIDAhPT1lLmVkZ2VUeXBlLnZpYT8odD12b2lkIDA9PT1lLm9wdGlvbnMubGVuZ3RoP3RoaXMub3B0aW9ucy5zcHJpbmdMZW5ndGg6ZS5vcHRpb25zLmxlbmd0aCxuPWUudG8scz1lLmVkZ2VUeXBlLnZpYSxyPWUuZnJvbSx0aGlzLl9jYWxjdWxhdGVTcHJpbmdGb3JjZShuLHMsLjUqdCksdGhpcy5fY2FsY3VsYXRlU3ByaW5nRm9yY2UocyxyLC41KnQpKToodD12b2lkIDA9PT1lLm9wdGlvbnMubGVuZ3RoPzEuNSp0aGlzLm9wdGlvbnMuc3ByaW5nTGVuZ3RoOmUub3B0aW9ucy5sZW5ndGgsdGhpcy5fY2FsY3VsYXRlU3ByaW5nRm9yY2UoZS5mcm9tLGUudG8sdCkpKX19LHtrZXk6XCJfY2FsY3VsYXRlU3ByaW5nRm9yY2VcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89dC54LWUueCxuPXQueS1lLnkscz1NYXRoLm1heChNYXRoLnNxcnQobypvK24qbiksLjAxKSxyPXRoaXMub3B0aW9ucy5zcHJpbmdDb25zdGFudCooaS1zKS9zLGE9bypyLGg9bipyO3ZvaWQgMCE9PXRoaXMucGh5c2ljc0JvZHkuZm9yY2VzW3QuaWRdJiYodGhpcy5waHlzaWNzQm9keS5mb3JjZXNbdC5pZF0ueCs9YSx0aGlzLnBoeXNpY3NCb2R5LmZvcmNlc1t0LmlkXS55Kz1oKSx2b2lkIDAhPT10aGlzLnBoeXNpY3NCb2R5LmZvcmNlc1tlLmlkXSYmKHRoaXMucGh5c2ljc0JvZHkuZm9yY2VzW2UuaWRdLngtPWEsdGhpcy5waHlzaWNzQm9keS5mb3JjZXNbZS5pZF0ueS09aCl9fV0pLHR9KCk7ZS5kZWZhdWx0PWh9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDApLHM9byhuKSxyPWkoMSksYT1vKHIpLGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSxvKXsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5waHlzaWNzQm9keT1pLHRoaXMuc2V0T3B0aW9ucyhvKX1yZXR1cm4oMCxhLmRlZmF1bHQpKHQsW3trZXk6XCJzZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zPXR9fSx7a2V5Olwic29sdmVcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCxlLGksbyxuLHMscixhLGg9dGhpcy5ib2R5LmVkZ2VzLGQ9dGhpcy5waHlzaWNzQm9keS5waHlzaWNzRWRnZUluZGljZXMsbD10aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlcyx1PXRoaXMucGh5c2ljc0JvZHkuZm9yY2VzLGM9MDtjPGwubGVuZ3RoO2MrKyl7dmFyIHA9bFtjXTt1W3BdLnNwcmluZ0Z4PTAsdVtwXS5zcHJpbmdGeT0wfWZvcih2YXIgZj0wO2Y8ZC5sZW5ndGg7ZisrKWU9aFtkW2ZdXSwhMD09PWUuY29ubmVjdGVkJiYodD12b2lkIDA9PT1lLm9wdGlvbnMubGVuZ3RoP3RoaXMub3B0aW9ucy5zcHJpbmdMZW5ndGg6ZS5vcHRpb25zLmxlbmd0aCxpPWUuZnJvbS54LWUudG8ueCxvPWUuZnJvbS55LWUudG8ueSxhPU1hdGguc3FydChpKmkrbypvKSxhPTA9PT1hPy4wMTphLHI9dGhpcy5vcHRpb25zLnNwcmluZ0NvbnN0YW50Kih0LWEpL2Esbj1pKnIscz1vKnIsZS50by5sZXZlbCE9ZS5mcm9tLmxldmVsPyh2b2lkIDAhPT11W2UudG9JZF0mJih1W2UudG9JZF0uc3ByaW5nRngtPW4sdVtlLnRvSWRdLnNwcmluZ0Z5LT1zKSx2b2lkIDAhPT11W2UuZnJvbUlkXSYmKHVbZS5mcm9tSWRdLnNwcmluZ0Z4Kz
211671uLHVbZS5mcm9tSWRdLnNwcmluZ0Z5Kz1zKSk6KHZvaWQgMCE9PXVbZS50b0lkXSYmKHVbZS50b0lkXS54LT0uNSpuLHVbZS50b0lkXS55LT0uNSpzKSx2b2lkIDAhPT11W2UuZnJvbUlkXSYmKHVbZS5mcm9tSWRdLngrPS41Km4sdVtlLmZyb21JZF0ueSs9LjUqcykpKTtyPTE7Zm9yKHZhciBtLHYsZz0wO2c8bC5sZW5ndGg7ZysrKXt2YXIgeT1sW2ddO209TWF0aC5taW4ocixNYXRoLm1heCgtcix1W3ldLnNwcmluZ0Z4KSksdj1NYXRoLm1pbihyLE1hdGgubWF4KC1yLHVbeV0uc3ByaW5nRnkpKSx1W3ldLngrPW0sdVt5XS55Kz12fWZvcih2YXIgYj0wLF89MCx3PTA7dzxsLmxlbmd0aDt3Kyspe3ZhciB4PWxbd107Yis9dVt4XS54LF8rPXVbeF0ueX1mb3IodmFyIGs9Yi9sLmxlbmd0aCxTPV8vbC5sZW5ndGgsRD0wO0Q8bC5sZW5ndGg7RCsrKXt2YXIgTT1sW0RdO3VbTV0ueC09ayx1W01dLnktPVN9fX1dKSx0fSgpO2UuZGVmYXVsdD1ofSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoMTIwKSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcIl9jYWxjdWxhdGVGb3JjZXNcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pezA9PT10JiYodD0uMSpNYXRoLnJhbmRvbSgpLGU9dCksdGhpcy5vdmVybGFwQXZvaWRhbmNlRmFjdG9yPDEmJm8uc2hhcGUucmFkaXVzJiYodD1NYXRoLm1heCguMSt0aGlzLm92ZXJsYXBBdm9pZGFuY2VGYWN0b3Iqby5zaGFwZS5yYWRpdXMsdC1vLnNoYXBlLnJhZGl1cykpO3ZhciBzPW8uZWRnZXMubGVuZ3RoKzEscj10aGlzLm9wdGlvbnMuZ3Jhdml0YXRpb25hbENvbnN0YW50Km4ubWFzcypvLm9wdGlvbnMubWFzcypzL01hdGgucG93KHQsMiksYT1lKnIsaD1pKnI7dGhpcy5waHlzaWNzQm9keS5mb3JjZXNbby5pZF0ueCs9YSx0aGlzLnBoeXNpY3NCb2R5LmZvcmNlc1tvLmlkXS55Kz1ofX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoMTIxKSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcIl9jYWxjdWxhdGVGb3JjZXNcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe2lmKHQ+MCl7dmFyIHM9bi5lZGdlcy5sZW5ndGgrMSxyPXRoaXMub3B0aW9ucy5jZW50cmFsR3Jhdml0eSpzKm4ub3B0aW9ucy5tYXNzO29bbi5pZF0ueD1lKnIsb1tuLmlkXS55PWkqcn19fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDgpLHM9byhuKSxyPWkoNiksYT1vKHIpLGg9aSgwKSxkPW8oaCksbD1pKDEpLHU9byhsKSxjPWkoMikscD1pKDc2KS5kZWZhdWx0LGY9aSgyMjgpLmRlZmF1bHQsbT1pKDc0KS5kZWZhdWx0LHY9aSg0NykuZGVmYXVsdCxnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgaT10aGlzOygwLGQuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLmNsdXN0ZXJlZE5vZGVzPXt9LHRoaXMuY2x1c3RlcmVkRWRnZXM9e30sdGhpcy5vcHRpb25zPXt9LHRoaXMuZGVmYXVsdE9wdGlvbnM9e30sYy5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiX3Jlc2V0RGF0YVwiLGZ1bmN0aW9uKCl7aS5jbHVzdGVyZWROb2Rlcz17fSxpLmNsdXN0ZXJlZEVkZ2VzPXt9fSl9cmV0dXJuKDAsdS5kZWZhdWx0KSh0LFt7a2V5OlwiY2x1c3RlckJ5SHVic2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09dD90PXRoaXMuX2dldEh1YlNpemUoKTpcIm9iamVjdFwiPT09KHZvaWQgMD09PXQ/XCJ1bmRlZmluZWRcIjooMCxhLmRlZmF1bHQpKHQpKSYmKGU9dGhpcy5fY2hlY2tPcHRpb25zKHQpLHQ9dGhpcy5fZ2V0SHViU2l6ZSgpKTtmb3IodmFyIGk9W10sbz0wO288dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDtvKyspe3ZhciBuPXRoaXMuYm9keS5ub2Rlc1t0aGlzLmJvZHkubm9kZUluZGljZXNbb11dO24uZWRnZXMubGVuZ3RoPj10JiZpLnB1c2gobi5pZCl9Zm9yKHZhciBzPTA7czxpLmxlbmd0aDtzKyspdGhpcy5jbHVzdGVyQnlDb25uZWN0aW9uKGlbc10sZSwhMCk7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9kYXRhQ2hhbmdlZFwiKX19LHtrZXk6XCJjbHVzdGVyXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LGk9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXTtpZih2b2lkIDA9PT1lLmpvaW5Db25kaXRpb24pdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNhbGwgY2x1c3RlckJ5Tm9kZURhdGEgd2l0aG91dCBhIGpvaW5Db25kaXRpb24gZnVuY3Rpb24gaW4gdGhlIG9wdGlvbnMuXCIpO2U9dGhpcy5fY2hlY2tPcHRpb25zKGUpO3ZhciBvPXt9LG49e307Yy5mb3JFYWNoKHRoaXMuYm9keS5ub2RlcyxmdW5jdGlvbihpLHMpe3ZhciByPXAuY2xvbmVPcHRpb25zKGkpOyEwPT09ZS5qb2luQ29uZGl0aW9uKHIpJiYob1tzXT1pLGMuZm9yRWFjaChpLmVkZ2VzLGZ1bmN0aW9uKGUpe3ZvaWQgMD09PXQuY2x1c3RlcmVkRWRnZXNbZS5pZF0mJihuW2UuaWRdPWUpfSkpfSksdGhpcy5fY2x1c3RlcihvLG4sZSxpKX19LHtrZXk6XCJjbHVzdGVyQnlFZGdlQ291bnRcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMsbz0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdO2U9dGhpcy5fY2hlY2tPcHRpb25zKGUpO2Zvcih2YXIgbj1bXSxyPXt9LGE9dm9pZCAwLGg9dm9pZCAwLGQ9dm9pZCAwLGw9MDtsPHRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGg7bCsrKXt2YXIgdSxjLGY7IWZ1bmN0aW9uKG8pe3ZhciBsPXt9LG09e30sdj1pLmJvZHkubm9kZUluZGljZXNbb10sZz1pLmJvZHkubm9kZXNbdl07aWYodm9pZCAwPT09clt2XSl7ZD0wLGg9W107Zm9yKHZhciB5PTA7eTxnLmVkZ2VzLmxlbmd0aDt5KyspYT1nLmVkZ2VzW3ldLHZvaWQgMD09PWkuY2x1c3RlcmVkRWRnZXNbYS5pZF0mJihhLnRvSWQhPT1hLmZyb21JZCYmZCsrLGgucHVzaChhKSk7aWYoZD09PXQpe3U9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09ZS5qb2luQ29uZGl0aW9ufHxudWxsPT09ZS5qb2luQ29uZGl0aW9uKXJldHVybiEwO3ZhciBpPXAuY2xvbmVPcHRpb25zKHQpO3JldHVybiBlLmpvaW5Db25kaXRpb24oaSl9O2Zvcih2YXIgYj0hMCxfPTA7XzxoLmxlbmd0aDtfKyspe2E9aFtfXTt2YXIgdz1pLl9nZXRDb25uZWN0ZWRJZChhLHYpO2lmKCF1KGcpKXtiPSExO2JyZWFrfW1bYS5pZF09YSxsW3ZdPWcsbFt3XT1pLmJvZHkubm9kZXNbd10sclt2XT0hMH1pZigoMCxzLmRlZmF1bHQpKGwpLmxlbmd0aD4wJiYoMCxzLmRlZmF1bHQpKG0pLmxlbmd0aD4wJiYhMD09PWIpaWYoYz1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8bi5sZW5ndGg7Kyt0KWZvcih2YXIgZSBpbiBsKWlmKHZvaWQgMCE9PW5bdF0ubm9kZXNbZV0pcmV0dXJuIG5bdF19LHZvaWQgMCE9PShmPWMoKSkpe2Zvcih2YXIgeCBpbiBsKXZvaWQgMD09PWYubm9kZXNbeF0mJihmLm5vZGVzW3hdPWxbeF0pO2Zvcih2YXIgayBpbiBtKXZvaWQgMD09PWYuZWRnZXNba10mJihmLmVkZ2VzW2tdPW1ba10pfWVsc2Ugbi5wdXNoKHtub2RlczpsLGVkZ2VzOm19KX19fShsKX1mb3IodmFyIGw9MDtsPG4ubGVuZ3RoO2wrKyl0aGlzLl9jbHVzdGVyKG5bbF0ubm9kZXMsbltsXS5lZGdlcyxlLCExKTshMD09PW8mJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIil9fSx7a2V5OlwiY2x1c3Rlck91dGxpZXJzXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXTt0aGlzLmNsdXN0ZXJCeUVkZ2VDb3VudCgxLHQsZSl9fSx7a2V5OlwiY2x1c3RlckJyaWRnZXNcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdO3RoaXMuY2x1c3RlckJ5RWRnZUNvdW50KDIsdCxlKX19LHtrZXk6XCJjbHVzdGVyQnlDb25uZWN0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdO2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IEVycm9yKFwiTm8gbm9kZUlkIHN1cHBsaWVkIHRvIGNsdXN0ZXJCeUNvbm5lY3Rpb24hXCIpO2lmKHZvaWQgMD09PXRoaXMuYm9keS5ub2Rlc1t0XSl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgbm9kZUlkIGdpdmVuIHRvIGNsdXN0ZXJCeUNvbm5lY3Rpb24gZG9lcyBub3QgZXhpc3QhXCIpO3ZhciBvPXR
21167oaXMuYm9keS5ub2Rlc1t0XTtlPXRoaXMuX2NoZWNrT3B0aW9ucyhlLG8pLHZvaWQgMD09PWUuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLngmJihlLmNsdXN0ZXJOb2RlUHJvcGVydGllcy54PW8ueCksdm9pZCAwPT09ZS5jbHVzdGVyTm9kZVByb3BlcnRpZXMueSYmKGUuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLnk9by55KSx2b2lkIDA9PT1lLmNsdXN0ZXJOb2RlUHJvcGVydGllcy5maXhlZCYmKGUuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLmZpeGVkPXt9LGUuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLmZpeGVkLng9by5vcHRpb25zLmZpeGVkLngsZS5jbHVzdGVyTm9kZVByb3BlcnRpZXMuZml4ZWQueT1vLm9wdGlvbnMuZml4ZWQueSk7dmFyIG49e30scj17fSxhPW8uaWQsaD1wLmNsb25lT3B0aW9ucyhvKTtuW2FdPW87Zm9yKHZhciBkPTA7ZDxvLmVkZ2VzLmxlbmd0aDtkKyspe3ZhciBsPW8uZWRnZXNbZF07aWYodm9pZCAwPT09dGhpcy5jbHVzdGVyZWRFZGdlc1tsLmlkXSl7dmFyIHU9dGhpcy5fZ2V0Q29ubmVjdGVkSWQobCxhKTtpZih2b2lkIDA9PT10aGlzLmNsdXN0ZXJlZE5vZGVzW3VdKWlmKHUhPT1hKWlmKHZvaWQgMD09PWUuam9pbkNvbmRpdGlvbilyW2wuaWRdPWwsblt1XT10aGlzLmJvZHkubm9kZXNbdV07ZWxzZXt2YXIgYz1wLmNsb25lT3B0aW9ucyh0aGlzLmJvZHkubm9kZXNbdV0pOyEwPT09ZS5qb2luQ29uZGl0aW9uKGgsYykmJihyW2wuaWRdPWwsblt1XT10aGlzLmJvZHkubm9kZXNbdV0pfWVsc2UgcltsLmlkXT1sfX12YXIgZj0oMCxzLmRlZmF1bHQpKG4pLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gblt0XS5pZH0pO2ZvcihtIGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eShtKSlmb3IodmFyIG09blttXSx2PTA7djxtLmVkZ2VzLmxlbmd0aDt2Kyspe3ZhciBnPW0uZWRnZXNbdl07Zi5pbmRleE9mKHRoaXMuX2dldENvbm5lY3RlZElkKGcsbS5pZCkpPi0xJiYocltnLmlkXT1nKX10aGlzLl9jbHVzdGVyKG4scixlLGkpfX0se2tleTpcIl9jcmVhdGVDbHVzdGVyRWRnZXNcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXtmb3IodmFyIG49dm9pZCAwLHI9dm9pZCAwLGE9dm9pZCAwLGg9dm9pZCAwLGQ9dm9pZCAwLGw9dm9pZCAwLHU9KDAscy5kZWZh
21167dWx0KSh0KSxjPVtdLHA9MDtwPHUubGVuZ3RoO3ArKyl7cj11W3BdLGE9dFtyXTtmb3IodmFyIGY9MDtmPGEuZWRnZXMubGVuZ3RoO2YrKyluPWEuZWRnZXNbZl0sdm9pZCAwPT09dGhpcy5jbHVzdGVyZWRFZGdlc1tuLmlkXSYmKG4udG9JZD09bi5mcm9tSWQ/ZVtuLmlkXT1uOm4udG9JZD09cj8oaD1pLmlkLGQ9bi5mcm9tSWQsbD1kKTooaD1uLnRvSWQsZD1pLmlkLGw9aCksdm9pZCAwPT09dFtsXSYmYy5wdXNoKHtlZGdlOm4sZnJvbUlkOmQsdG9JZDpofSkpfWZvcih2YXIgbT1bXSx2PTA7djxjLmxlbmd0aDt2Kyspe3ZhciBnPWNbdl0seT1nLmVkZ2UsYj1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPG0ubGVuZ3RoO2UrKyl7dmFyIGk9bVtlXSxvPXQuZnJvbUlkPT09aS5mcm9tSWQmJnQudG9JZD09PWkudG9JZCxuPXQuZnJvbUlkPT09aS50b0lkJiZ0LnRvSWQ9PT1pLmZyb21JZDtpZihvfHxuKXJldHVybiBpfXJldHVybiBudWxsfShnKTtudWxsPT09Yj8oYj10aGlzLl9jcmVhdGVDbHVzdGVyZWRFZGdlKGcuZnJvbUlkLGcudG9JZCx5LG8pLG0ucHVzaChiKSk6Yi5jbHVzdGVyaW5nRWRnZVJlcGxhY2luZ0lkcy5wdXNoKHkuaWQpLHRoaXMuYm9keS5lZGdlc1t5LmlkXS5lZGdlUmVwbGFjZWRCeUlkPWIuaWQsdGhpcy5fYmFja3VwRWRnZU9wdGlvbnMoeSkseS5zZXRPcHRpb25zKHtwaHlzaWNzOiExfSl9fX0se2tleTpcIl9jaGVja09wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtyZXR1cm4gdm9pZCAwPT09dC5jbHVzdGVyRWRnZVByb3BlcnRpZXMmJih0LmNsdXN0ZXJFZGdlUHJvcGVydGllcz17fSksdm9pZCAwPT09dC5jbHVzdGVyTm9kZVByb3BlcnRpZXMmJih0LmNsdXN0ZXJOb2RlUHJvcGVydGllcz17fSksdH19LHtrZXk6XCJfY2x1c3RlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz0hKGFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdKXx8YXJndW1lbnRzWzNdO2lmKDAhPSgwLHMuZGVmYXVsdCkodCkubGVuZ3RoJiYoMSE9KDAscy5kZWZh
21167dWx0KSh0KS5sZW5ndGh8fDE9PWkuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLmFsbG93U2luZ2xlTm9kZUNsdXN0ZXIpKXtmb3IodmFyIG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pJiZ2b2lkIDAhPT10aGlzLmNsdXN0ZXJlZE5vZGVzW25dKXJldHVybjt2YXIgcj1jLmRlZXBFeHRlbmQoe30saS5jbHVzdGVyTm9kZVByb3BlcnRpZXMpO2lmKHZvaWQgMCE9PWkucHJvY2Vzc1Byb3BlcnRpZXMpe3ZhciBhPVtdO2Zvcih2YXIgaCBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoaCkpe3ZhciBkPXAuY2xvbmVPcHRpb25zKHRbaF0pO2EucHVzaChkKX12YXIgbD1bXTtmb3IodmFyIHUgaW4gZSlpZihlLmhhc093blByb3BlcnR5KHUpJiZcImNsdXN0ZXJFZGdlOlwiIT09dS5zdWJzdHIoMCwxMikpe3ZhciBtPXAuY2xvbmVPcHRpb25zKGVbdV0sXCJlZGdlXCIpO2wucHVzaChtKX1pZighKHI9aS5wcm9jZXNzUHJvcGVydGllcyhyLGEsbCkpKXRocm93IG5ldyBFcnJvcihcIlRoZSBwcm9jZXNzUHJvcGVydGllcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gcHJvcGVydGllcyFcIil9dm9pZCAwPT09ci5pZCYmKHIuaWQ9XCJjbHVzdGVyOlwiK2MucmFuZG9tVVVJRCgpKTt2YXIgdj1yLmlkO3ZvaWQgMD09PXIubGFiZWwmJihyLmxhYmVsPVwiY2x1c3RlclwiKTt2YXIgZz12b2lkIDA7dm9pZCAwPT09ci54JiYoZz10aGlzLl9nZXRDbHVzdGVyUG9zaXRpb24odCksci54PWcueCksdm9pZCAwPT09ci55JiYodm9pZCAwPT09ZyYmKGc9dGhpcy5fZ2V0Q2x1c3RlclBvc2l0aW9uKHQpKSxyLnk9Zy55KSxyLmlkPXY7dmFyIHk9dGhpcy5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVOb2RlKHIsZik7eS5jb250YWluZWROb2Rlcz10LHkuY29udGFpbmVkRWRnZXM9ZSx5LmNsdXN0ZXJFZGdlUHJvcGVydGllcz1pLmNsdXN0ZXJFZGdlUHJvcGVydGllcyx0aGlzLmJvZHkubm9kZXNbci5pZF09eSx0aGlzLl9jbHVzdGVyRWRnZXModCxlLHIsaS5jbHVzdGVyRWRnZVByb3BlcnRpZXMpLHIuaWQ9dm9pZCAwLCEwPT09byYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9kYXRhQ2hhbmdlZFwiKX19fSx7a2V5OlwiX2JhY2t1cEVkZ2VPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCl7dm9pZCAwPT09dGhpcy5jbHVzdGVyZWRFZGdlc1t0LmlkXSYmKHRoaXMuY2x1c3RlcmVkRWRnZXNbdC5pZF09e3BoeXNpY3M6dC5vcHRpb25zLnBoeXNpY3N9KX19LHtrZXk6XCJfcmVzdG9yZUVkZ2VcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNsdXN0ZXJlZEVkZ2VzW3QuaWRdO3ZvaWQgMCE9PWUmJih0LnNldE9wdGlvbnMoe3BoeXNpY3M6ZS5waHlzaWNzfSksZGVsZXRlIHRoaXMuY2x1c3RlcmVkRWRnZXNbdC5pZF0pfX0se2tleTpcImlzQ2x1c3RlclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbdF0/ITA9PT10aGlzLmJvZHkubm9kZXNbdF0uaXNDbHVzdGVyOihjb25zb2xlLmxvZyhcIk5vZGUgZG9lcyBub3QgZXhpc3QuXCIpLCExKX19LHtrZXk6XCJfZ2V0Q2x1c3RlclBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSgwLHMuZGVmYXVsdCkodCksaT10W2VbMF1dLngsbz10W2VbMF1dLngsbj10W2VbMF1dLnkscj10W2VbMF1dLnksYT12b2lkIDAsaD0xO2g8ZS5sZW5ndGg7aCsrKWE9dFtlW2hdXSxpPWEueDxpP2EueDppLG89YS54Pm8/YS54Om8sbj1hLnk8bj9hLnk6bixyPWEueT5yP2EueTpyO3JldHVybnt4Oi41KihpK28pLHk6LjUqKG4rcil9fX0se2tleTpcIm9wZW5DbHVzdGVyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdO2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IEVycm9yKFwiTm8gY2x1c3Rlck5vZGVJZCBzdXBwbGllZCB0byBvcGVuQ2x1c3Rlci5cIik7dmFyIG89dGhpcy5ib2R5Lm5vZGVzW3RdO2lmKHZvaWQgMD09PW8pdGhyb3cgbmV3IEVycm9yKFwiVGhlIGNsdXN0ZXJOb2RlSWQgc3VwcGxpZWQgdG8gb3BlbkNsdXN0ZXIgZG9lcyBub3QgZXhpc3QuXCIpO2lmKCEwIT09by5pc0NsdXN0ZXJ8fHZvaWQgMD09PW8uY29udGFpbmVkTm9kZXN8fHZvaWQgMD09PW8uY29udGFpbmVkRWRnZXMpdGhyb3cgbmV3IEVycm9yKFwiVGhlIG5vZGU6XCIrdCtcIiBpcyBub3QgYSB2YWxpZCBjbHVzdGVyLlwiKTt2YXIgbj10aGlzLmZpbmROb2RlKHQpLHM9bi5pbmRleE9mKHQpLTE7aWYocz49MCl7dmFyIHI9bltzXTtyZXR1cm4gdGhpcy5ib2R5Lm5vZGVzW3JdLl9vcGVuQ2hpbGRDbHVzdGVyKHQpLGRlbGV0ZSB0aGlzLmJvZHkubm9kZXNbdF0sdm9p
21167ZCghMD09PWkmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIikpfXZhciBhPW8uY29udGFpbmVkTm9kZXMsaD1vLmNvbnRhaW5lZEVkZ2VzO2lmKHZvaWQgMCE9PWUmJnZvaWQgMCE9PWUucmVsZWFzZUZ1bmN0aW9uJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLnJlbGVhc2VGdW5jdGlvbil7dmFyIGQ9e30sbD17eDpvLngseTpvLnl9O2Zvcih2YXIgdSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkodSkpe3ZhciBwPXRoaXMuYm9keS5ub2Rlc1t1XTtkW3VdPXt4OnAueCx5OnAueX19dmFyIGY9ZS5yZWxlYXNlRnVuY3Rpb24obCxkKTtmb3IodmFyIG0gaW4gYSlpZihhLmhhc093blByb3BlcnR5KG0pKXt2YXIgdj10aGlzLmJvZHkubm9kZXNbbV07dm9pZCAwIT09ZlttXSYmKHYueD12b2lkIDA9PT1mW21dLng/by54OmZbbV0ueCx2Lnk9dm9pZCAwPT09ZlttXS55P28ueTpmW21dLnkpfX1lbHNlIGMuZm9yRWFjaChhLGZ1bmN0aW9uKHQpeyExPT09dC5vcHRpb25zLmZpeGVkLngmJih0Lng9by54KSwhMT09PXQub3B0aW9ucy5maXhlZC55JiYodC55PW8ueSl9KTtmb3IodmFyIGcgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGcpKXt2YXIgeT10aGlzLmJvZHkubm9kZXNbZ107eS52eD1vLnZ4LHkudnk9by52eSx5LnNldE9wdGlvbnMoe3BoeXNpY3M6ITB9KSxkZWxldGUgdGhpcy5jbHVzdGVyZWROb2Rlc1tnXX1mb3IodmFyIGI9W10sXz0wO188by5lZGdlcy5sZW5ndGg7XysrKWIucHVzaChvLmVkZ2VzW19dKTtmb3IodmFyIHc9MDt3PGIubGVuZ3RoO3crKyl7Zm9yKHZhciB4PWJbd10saz10aGlzLl9nZXRDb25uZWN0ZWRJZCh4LHQpLFM9dGhpcy5jbHVzdGVyZWROb2Rlc1trXSxEPTA7RDx4LmNsdXN0ZXJpbmdFZGdlUmVwbGFjaW5nSWRzLmxlbmd0aDtEKyspe3ZhciBNPXguY2x1c3RlcmluZ0VkZ2VSZXBsYWNpbmdJZHNbRF0sQz10aGlzLmJvZHkuZWRnZXNbTV07aWYodm9pZCAwIT09QylpZih2b2lkIDAhPT1TKXt2YXIgTz10aGlzLmJvZHkubm9kZXNbUy5jbHVzdGVySWRdO08uY29udGFpbmVkRWRnZXNbQy5pZF09QyxkZWxldGUgaFtDLmlkXTt2YXIgRT1DLmZyb21JZCxUPUMudG9JZDtDLnRvSWQ9PWs/VD1TLmNsdXN0ZXJJZDpFPVMuY2x1c3RlcklkLHRoaXMuX2NyZWF0ZUNsdXN0ZXJlZEVkZ2UoRSxULEMsTy5jbHVzdGVyRWRnZVByb3BlcnRpZXMse2hpZGRlbjohMSxwaHlzaWNzOiEwfSl9ZWxzZSB0aGlzLl9yZXN0b3JlRWRnZShDKX14LnJlbW92ZSgpfWZvcih2YXIgUCBpbiBoKWguaGFzT3duUHJvcGVydHkoUCkmJnRoaXMuX3Jlc3RvcmVFZGdlKGhbUF0pO2RlbGV0ZSB0aGlzLmJvZHkubm9kZXNbdF0sITA9PT1pJiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2RhdGFDaGFuZ2VkXCIpfX0se2tleTpcImdldE5vZGVzSW5DbHVzdGVyXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9W107aWYoITA9PT10aGlzLmlzQ2x1c3Rlcih0KSl7dmFyIGk9dGhpcy5ib2R5Lm5vZGVzW3RdLmNvbnRhaW5lZE5vZGVzO2Zvcih2YXIgbyBpbiBpKWkuaGFzT3duUHJvcGVydHkobykmJmUucHVzaCh0aGlzLmJvZHkubm9kZXNbb10uaWQpfXJldHVybiBlfX0se2tleTpcImZpbmROb2RlXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLGk9MCxvPXZvaWQgMDt2b2lkIDAhPT10aGlzLmNsdXN0ZXJlZE5vZGVzW3RdJiZpPDEwMDspe2lmKHZvaWQgMD09PShvPXRoaXMuYm9keS5ub2Rlc1t0XSkpcmV0dXJuW107ZS5wdXNoKG8uaWQpLHQ9dGhpcy5jbHVzdGVyZWROb2Rlc1t0XS5jbHVzdGVySWQsaSsrfXJldHVybiB2b2lkIDA9PT0obz10aGlzLmJvZHkubm9kZXNbdF0pP1tdOihlLnB1c2goby5pZCksZS5yZXZlcnNlKCksZSl9fSx7a2V5OlwidXBkYXRlQ2x1c3RlcmVkTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoXCJObyBjbHVzdGVyZWROb2RlSWQgc3VwcGxpZWQgdG8gdXBkYXRlQ2x1c3RlcmVkTm9kZS5cIik7aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgRXJyb3IoXCJObyBuZXdPcHRpb25zIHN1cHBsaWVkIHRvIHVwZGF0ZUNsdXN0ZXJlZE5vZGUuXCIpO2lmKHZvaWQgMD09PXRoaXMuYm9keS5ub2Rlc1t0XSl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgY2x1c3RlcmVkTm9kZUlkIHN1cHBsaWVkIHRvIHVwZGF0ZUNsdXN0ZXJlZE5vZGUgZG9lcyBub3QgZXhpc3QuXCIpO3RoaXMuYm9keS5ub2Rlc1t0XS5zZXRPcHRpb25zKGUpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIil9fSx7a2V5OlwidXBkYXRlRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoXCJObyBzdGFydEVkZ2VJZCBzdXBwbGllZCB0byB1cGRhdGVFZGdlLlwiKTtpZih2b2lkIDA9PT1lKXRocm93IG5ldyBFcnJvcihcIk5vIG5ld09wdGlvbnMgc3VwcGxpZWQgdG8gdXBkYXRlRWRnZS5cIik7aWYodm9pZCAwPT09dGhpcy5ib2R5LmVkZ2VzW3RdKXRocm93IG5ldyBFcnJvcihcIlRoZSBzdGFydEVkZ2VJZCBzdXBwbGllZCB0byB1cGRhdGVFZGdlIGRvZXMgbm90IGV4aXN0LlwiKTtmb3IodmFyIGk9dGhpcy5nZXRDbHVzdGVyZWRFZGdlcyh0KSxvPTA7bzxpLmxlbmd0aDtvKyspe3RoaXMuYm9keS5lZGdlc1tpW29dXS5zZXRPcHRpb25zKGUpfXRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIil9fSx7a2V5OlwiZ2V0Q2x1c3RlcmVkRWRnZXNcIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0wO3ZvaWQgMCE9PXQmJnZvaWQgMCE9PXRoaXMuYm9keS5lZGdlc1t0XSYmaTwxMDA7KWUucHVzaCh0aGlzLmJvZHkuZWRnZXNbdF0uaWQpLHQ9dGhpcy5ib2R5LmVkZ2VzW3RdLmVkZ2VSZXBsYWNlZEJ5SWQsaSsrO3JldHVybiBlLnJldmVyc2UoKSxlfX0se2tleTpcImdldEJhc2VFZGdlXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0QmFzZUVkZ2VzKHQpWzBdfX0se2tleTpcImdldEJhc2VFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bdF0saT1bXSxvPVtdLG49MDtlLmxlbmd0aD4wJiZuPDEwMDspe3ZhciBzPWUucG9wKCk7aWYodm9pZCAwIT09cyl7dmFyIHI9dGhpcy5ib2R5LmVkZ2VzW3NdO2lmKHZvaWQgMCE9PXIpe24rKzt2YXIgYT1yLmNsdXN0ZXJpbmdFZGdlUmVwbGFjaW5nSWRzO2lmKHZvaWQgMD09PWEpby5wdXNoKHMpO2Vsc2UgZm9yKHZhciBoPTA7aDxhLmxlbmd0aDsrK2gpe3ZhciBkPWFbaF07LTE9PT1lLmluZGV4T2YoYSkmJi0xPT09aS5pbmRleE9mKGEpJiZlLnB1c2goZCl9aS5wdXNoKHMpfX19cmV0dXJuIG99fSx7a2V5OlwiX2dldENvbm5lY3RlZElkXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b0lkIT1lP3QudG9JZDo
21167odC5mcm9tSWQsdC5mcm9tSWQpfX0se2tleTpcIl9nZXRIdWJTaXplXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTAsaT0wLG89MCxuPTA7bjx0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoO24rKyl7dmFyIHM9dGhpcy5ib2R5Lm5vZGVzW3RoaXMuYm9keS5ub2RlSW5kaWNlc1tuXV07cy5lZGdlcy5sZW5ndGg+byYmKG89cy5lZGdlcy5sZW5ndGgpLHQrPXMuZWRnZXMubGVuZ3RoLGUrPU1hdGgucG93KHMuZWRnZXMubGVuZ3RoLDIpLGkrPTF9dC89aSxlLz1pO3ZhciByPWUtTWF0aC5wb3codCwyKSxhPU1hdGguc3FydChyKSxoPU1hdGguZmxvb3IodCsyKmEpO3JldHVybiBoPm8mJihoPW8pLGh9fSx7a2V5OlwiX2NyZWF0ZUNsdXN0ZXJlZEVkZ2VcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3ZhciBzPXAuY2xvbmVPcHRpb25zKGksXCJlZGdlXCIpO2MuZGVlcEV4dGVuZChzLG8pLHMuZnJvbT10LHMudG89ZSxzLmlkPVwiY2x1c3RlckVkZ2U6XCIrYy5yYW5kb21VVUlEKCksdm9pZCAwIT09biYmYy5kZWVwRXh0ZW5kKHMsbik7dmFyIHI9dGhpcy5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVFZGdlKHMpO3JldHVybiByLmNsdXN0ZXJpbmdFZGdlUmVwbGFjaW5nSWRzPVtpLmlkXSxyLmNvbm5lY3QoKSx0aGlzLmJvZHkuZWRnZXNbci5pZF09cixyfX0se2tleTpcIl9jbHVzdGVyRWRnZXNcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXtpZihlIGluc3RhbmNlb2YgbSl7dmFyIG49ZSxzPXt9O3Nbbi5pZF09bixlPXN9aWYodCBpbnN0YW5jZW9mIHYpe3ZhciByPXQsYT17fTthW3IuaWRdPXIsdD1hfWlmKHZvaWQgMD09PWl8fG51bGw9PT1pKXRocm93IG5ldyBFcnJvcihcIl9jbHVzdGVyRWRnZXM6IHBhcmFtZXRlciBjbHVzdGVyTm9kZSByZXF1aXJlZFwiKTt2b2lkIDA9PT1vJiYobz1pLmNsdXN0ZXJFZGdlUHJvcGVydGllcyksdGhpcy5fY3JlYXRlQ2x1c3RlckVkZ2VzKHQsZSxpLG8pO2Zvcih2YXIgaCBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkoaCkmJnZvaWQgMCE9PXRoaXMuYm9keS5lZGdlc1toXSl7dmFyIGQ9dGhpcy5ib2R5LmVkZ2VzW2hdO3RoaXMuX2JhY2t1cEVkZ2VPcHRpb25zKGQpLGQuc2V0T3B0aW9ucyh7cGh5c2ljczohMX0pfWZvcih2YXIgbCBpbiB0KXQuaGFzT3duUHJvcGVydHkobCkmJih0aGlzLmNsdXN0ZXJlZE5vZGVzW2xdPXtjbHVzdGVySWQ6aS5pZCxub2RlOnRoaXMuYm9keS5ub2Rlc1tsXX0sdGhpcy5ib2R5Lm5vZGVzW2xdLnNldE9wdGlvbnMoe3BoeXNpY3M6ITF9KSl9fSx7a2V5OlwiX2dldENsdXN0ZXJOb2RlRm9yTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpe3ZhciBlPXRoaXMuY2x1c3RlcmVkTm9kZXNbdF07aWYodm9pZCAwIT09ZSl7dmFyIGk9ZS5jbHVzdGVySWQ7aWYodm9pZCAwIT09aSlyZXR1cm4gdGhpcy5ib2R5Lm5vZGVzW2ldfX19fSx7a2V5OlwiX2ZpbHRlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9W107cmV0dXJuIGMuZm9yRWFjaCh0LGZ1bmN0aW9uKHQpe2UodCkmJmkucHVzaCh0KX0pLGl9fSx7a2V5OlwiX3VwZGF0ZVN0YXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dm9pZCAwLGk9W10sbz1bXSxuPWZ1bmN0aW9uKGUpe2MuZm9yRWFjaCh0LmJvZHkubm9kZXMsZnVuY3Rpb24odCl7ITA9PT10LmlzQ2x1c3RlciYmZSh0KX0pfTtmb3IoZSBpbiB0aGlzLmNsdXN0ZXJlZE5vZGVzKWlmKHRoaXMuY2x1c3RlcmVkTm9kZXMuaGFzT3duUHJvcGVydHkoZSkpe3ZhciByPXRoaXMuYm9keS5ub2Rlc1tlXTt2b2lkIDA9PT1yJiZpLnB1c2goZSl9bihmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPGkubGVuZ3RoO2UrKylkZWxldGUgdC5jb250YWluZWROb2Rlc1tpW2VdXX0pO2Zvcih2YXIgYT0wO2E8aS5sZW5ndGg7YSsrKWRlbGV0ZSB0aGlzLmNsdXN0ZXJlZE5vZGVzW2lbYV1dO2MuZm9yRWFjaCh0aGlzLmNsdXN0ZXJlZEVkZ2VzLGZ1bmN0aW9uKGUpe3ZhciBpPXQuYm9keS5lZGdlc1tlXTt2b2lkIDAhPT1pJiZpLmVuZFBvaW50c1ZhbGlkKCl8fG8ucHVzaChlKX0pLG4oZnVuY3Rpb24odCl7Yy5mb3JFYWNoKHQuY29udGFpbmVkRWRnZXMsZnVuY3Rpb24odCxlKXt0LmVuZFBvaW50c1ZhbGlkKCl8fC0xIT09by5pbmRleE9mKGUpfHxvLnB1c2goZSl9KX0pLGMuZm9yRWFjaCh0aGlzLmJvZHkuZWRnZXMsZnVuY3Rpb24oZSxpKXt2YXIgbj0hMCxzPWUuY2x1c3RlcmluZ0VkZ2VSZXBsYWNpbmdJZHM7aWYodm9pZCAwIT09cyl7dmFyIHI9MDtjLmZvckVhY2gocyxmdW5jdGlvbihlKXt2YXIgaT10LmJvZHkuZWRnZXNbZV07dm9pZCAwIT09aSYmaS5lbmRQb2ludHNWYWxpZCgpJiYocis9MSl9KSxuPXI+MH1lLmVuZFBvaW50c1ZhbGlkKCkmJm58fG8ucHVzaChpKX0pLG4oZnVuY3Rpb24oZSl7Yy5mb3JFYWNoKG8sZnVuY3Rpb24oaSl7ZGVsZXRlIGUuY29udGFpbmVkRWRnZXNbaV0sYy5mb3JFYWNoKGUuZWRnZXMsZnVuY3Rpb24obixzKXtpZihuLmlkPT09aSlyZXR1cm4gdm9pZChlLmVkZ2VzW3NdPW51bGwpO24uY2x1c3RlcmluZ0VkZ2VSZXBsYWNpbmdJZHM9dC5fZmlsdGVyKG4uY2x1c3RlcmluZ0VkZ2VSZXBsYWNpbmdJZHMsZnVuY3Rpb24odCl7cmV0dXJuLTE9PT1vLmluZGV4T2YodCl9KX0pLGUuZWRnZXM9dC5fZmlsdGVyKGUuZWRnZXMsZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT10fSl9KX0pLGMuZm9yRWFjaChvLGZ1bmN0aW9uKGUpe2RlbGV0ZSB0LmNsdXN0ZXJlZEVkZ2VzW2VdfSksYy5mb3JFYWNoKG8sZnVuY3Rpb24oZSl7ZGVsZXRlIHQuYm9keS5lZGdlc1tlXX0pO3ZhciBoPSgwLHMuZGVmYXVsdCkodGhpcy5ib2R5LmVkZ2VzKTtjLmZvckVhY2goaCxmdW5jdGlvbihlKXt2YXIgaT10LmJvZHkuZWRnZXNbZV0sbz10Ll9pc0NsdXN0ZXJlZE5vZGUoaS5mcm9tSWQpfHx0Ll9pc0NsdXN0ZXJlZE5vZGUoaS50b0lkKTtpZihvIT09dC5faXNDbHVzdGVyZWRFZGdlKGkuaWQpKXtpZighbyl0aHJvdyBuZXcgRXJyb3IoXCJyZW1vdmUgZWRnZSBmcm9tIGNsdXN0ZXJpbmcgbm90IGltcGxlbWVudGVkIVwiKTt2YXIgbj10Ll9nZXRDbHVzdGVyTm9kZUZvck5vZGUoaS5mcm9tSWQpO3ZvaWQgMCE9PW4mJnQuX2NsdXN0ZXJFZGdlcyh0LmJvZHkubm9kZXNbaS5mcm9tSWRdLGksbik7dmFyIHM9dC5fZ2V0Q2x1c3Rlck5vZGVGb3JOb2RlKGkudG9JZCk7dm9pZCAwIT09cyYmdC5fY2x1c3RlckVkZ2VzKHQuYm9keS5ub2Rlc1tpLnRvSWRdLGkscyl9fSk7Zm9yKHZhciBkPSExLGw9ITA7bDspIWZ1bmN0aW9uKCl7dmFyIGU9W107bihmdW5jdGlvbih0KXt2YXIgaT0oMCxzLmRlZmF1bHQpKHQuY29udGFpbmVkTm9kZXMpLmxlbmd0aCxvPSEwPT09dC5vcHRpb25zLmFsbG93U2luZ2xlTm9kZUNsdXN0ZXI7KG8mJmk8MXx8IW8mJmk8MikmJmUucHVzaCh0LmlkKX0pO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7KytpKXQub3BlbkNsdXN0ZXIoZVtpXSx7fSwhMSk7bD1lLmxlbmd0aD4wLGQ9ZHx8bH0oKTtkJiZ0aGlzLl91cGRhdGVTdGF0ZSgpfX0se2tleTpcIl9pc0NsdXN0ZXJlZE5vZGVcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dGhpcy5jbHVzdGVyZWROb2Rlc1t0XX19LHtrZXk6XCJfaXNDbHVzdGVyZWRFZGdlXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuY2x1c3RlcmVkRWRnZXNbdF19fV0pLHR9KCk7ZS5kZWZhdWx0PWd9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDMpLHM9byhuKSxyPWkoMCksYT1vKHIpLGg9aSgxKSxkPW8oaCksbD1pKDQpLHU9byhsKSxjPWkoNSkscD1vKGMpLGY9aSgyKSxtPWkoNDcpLmRlZmF1bHQsdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvLG4scixoKXsoMCxhLmRlZmF1bHQpKHRoaXMsZSk7dmFyIGQ9KDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvLG4scixoKSk7cmV0dXJuIGQuaXNDbHVzdGVyPSEwLGQuY29udGFpbmVkTm9kZXM9e30sZC5jb250YWluZWRFZGdlcz17fSxkfXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6XCJfb3BlbkNoaWxkQ2x1c3RlclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsaT10aGlzLmJvZHkubm9kZXNbdF07aWYodm9pZCAwPT09dGhpcy5jb250YWluZWROb2Rlc1t0XSl0aHJvdyBuZXcgRXJyb3IoXCJub2RlIHdpdGggaWQ6IFwiK3QrXCIgbm90IGluIGN1cnJlbnQgY2x1c3RlclwiKTtpZighaS5pc0NsdXN0ZXIpdGhyb3cgbmV3IEVycm9yKFwibm9kZSB3aXRoIGlkOiBcIit0K1wiIGlzIG5vdCBhIGNsdXN0ZXJcIik7ZGVsZXRlIHRoaXMuY29udGFpbmVkTm9kZXNbdF0sZi5mb3JFYWNoKGkuZWRnZXMsZnVuY3Rpb24odCl7ZGVsZXRlIGUuY29udGFpbmVkRWRnZXNbdC5pZF19KSxmLmZvckVhY2goaS5jb250YWluZWROb2RlcyxmdW5jdGlvbih0LGkpe2UuY29udGFpbmVkTm9kZXNbaV09dH0pLGkuY29udGFpbmVkTm9kZXM9e30sZi5mb3JFYWNoKGkuY29udGFpbmVkRWRnZXMsZnVuY3Rpb24odCxpKXtlLmNvbnRhaW5lZEVkZ2VzW2ldPXR9KSxpLmNvbnRhaW5lZEVkZ2VzPXt9LGYuZm9yRWFjaChpLmVkZ2VzLGZ1bmN0aW9uKHQpe2YuZm9yRWFjaChlLmVkZ2VzLGZ1bmN0aW9uKGkpe3ZhciBvPWkuY2x1c3RlcmluZ0VkZ2VSZXBsYWNpbmdJZHMuaW5kZXhPZih0LmlkKTstMSE9PW8mJihmLmZvckVhY2godC5jbHVzdGVyaW5nRWRnZVJlcGxhY2luZ0lkcyxmdW5jdGlvbih0KXtpLmNsdXN0ZXJpbmdFZGdlUmVwbGFjaW5nSWRzLnB1c2godCksZS5ib2R5LmVkZ2VzW3RdLmVkZ2VSZXBsYWNlZEJ5SWQ9aS5pZH0pLGkuY2x1c3RlcmluZ0VkZ2VSZXBsYWNpbmdJZHMuc3BsaWNlKG8sMSkpfSl9KSxpLmVkZ2VzPVtdfX1dKSxlfShtKTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4oKXt2YXIgdDt2b2lkIDAhPT13aW5kb3cmJih0PXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSksd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT12b2lkIDA9PT10P2Z1bmN0aW9uKHQpe3QoKX06dH1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgcz1pKDApLHI9byhzKSxhPWkoMSksaD1vKGEpLGQ9aSgyKSxsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGkpeygwLHIuZGVmYXVsdCkodGhpcyx0KSxuKCksdGhpcy5ib2R5PWUsdGhpcy5jYW52YXM9aSx0aGlzLnJlZHJhd1JlcXVlc3RlZD0hMSx0aGlzLnJlbmRlclRpbWVyPXZvaWQgMCx0aGlzLnJlcXVpcmVzVGltZW91dD0hMCx0aGlzLnJlbmRlcmluZ0FjdGl2ZT0hMSx0aGlzLnJlbmRlclJlcXVlc3RzPTAsdGhpcy5hbGxvd1JlZHJhdz0hMCx0aGlzLmRyYWdnaW5nPSExLHRoaXMub3B0aW9ucz17fSx0aGlzLmRlZmF1bHRPcHRpb25zPXtoaWRlRWRnZXNPbkRyYWc6ITEsaGlkZU5vZGVzT25EcmFnOiExfSxkLmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5fZGV0ZXJtaW5lQnJvd3Nlck1ldGhvZCgpLHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCl9cmV0dXJuKDAsaC5kZWZhdWx0KSh0LFt7a2V5OlwiYmluZEV2ZW50TGlzdGVuZXJzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYm9keS5lbWl0dGVyLm9uKFwiZHJhZ1N0YXJ0XCIsZnVuY3Rpb24oKXt0LmRyYWdnaW5nPSEwfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJkcmFnRW5kXCIsZnVuY3Rpb24oKXt0LmRyYWdnaW5nPSExfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJfcmVzaXplTm9kZXNcIixmdW5jdGlvbigpe3QuX3Jlc2l6ZU5vZGVzKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIl9yZWRyYXdcIixmdW5jdGlvbigpeyExPT09dC5yZW5kZXJpbmdBY3RpdmUmJnQuX3JlZHJhdygpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJfYmxvY2tSZWRyYXdcIixmdW5jdGlvbigpe3QuYWxsb3dSZWRyYXc9ITF9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIl9hbGxvd1JlZHJhd1wiLGZ1bmN0aW9uKCl7dC5hbGxvd1JlZHJhdz0hMCx0LnJlZHJhd1JlcXVlc3RlZD0hMX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiX3JlcXVlc3RSZWRyYXdcIix0aGlzLl9yZXF1ZXN0UmVkcmF3LmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiX3N0YXJ0UmVuZGVyaW5nXCIsZnVuY3Rpb24oKXt0LnJlbmRlclJlcXVlc3RzKz0xLHQucmVuZGVyaW5nQWN0aXZlPSEwLHQuX3N0YXJ0UmVuZGVyaW5nKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIl9zdG9wUmVuZGVyaW5nXCIsZnVuY3Rpb24oKXt0LnJlbmRlclJlcXVlc3RzLT0xLHQucmVuZGVyaW5nQWN0aXZlPXQucmVuZGVyUmVxdWVzdHM+MCx0LnJlbmRlclRpbWVyPXZvaWQgMH0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiZGVzdHJveVwiLGZ1bmN0aW9uKCl7dC5yZW5kZXJSZXF1ZXN0cz0wLHQuYWxsb3dSZWRyYXc9ITEsdC5yZW5kZXJpbmdBY3RpdmU9ITEsITA9PT10LnJlcXVpcmVzVGltZW91dD9jbGVhclRpbWVvdXQodC5yZW5kZXJUaW1lcik6d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHQucmVuZGVyVGltZXIpLHQuYm9keS5lbWl0dGVyLm9mZigpfSl9fSx7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpe3ZhciBlPVtcImhpZGVFZGdlc09uRHJhZ1wiLFwiaGlkZU5vZGVzT25EcmFnXCJdO2Quc2VsZWN0aXZlRGVlcEV4dGVuZChlLHRoaXMub3B0aW9ucyx0KX19fSx7a2V5OlwiX3JlcXVlc3ROZXh0RnJhbWVcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cpe3ZhciBpPXZvaWQgMCxvPXdpbmRvdztyZXR1cm4hMD09PXRoaXMucmVxdWlyZXNUaW1lb3V0P2k9by5zZXRUaW
211671lb3V0KHQsZSk6by5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUmJihpPW8ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHQpKSxpfX19LHtrZXk6XCJfc3RhcnRSZW5kZXJpbmdcIix2YWx1ZTpmdW5jdGlvbigpeyEwPT09dGhpcy5yZW5kZXJpbmdBY3RpdmUmJnZvaWQgMD09PXRoaXMucmVuZGVyVGltZXImJih0aGlzLnJlbmRlclRpbWVyPXRoaXMuX3JlcXVlc3ROZXh0RnJhbWUodGhpcy5fcmVuZGVyU3RlcC5iaW5kKHRoaXMpLHRoaXMuc2ltdWxhdGlvbkludGVydmFsKSl9fSx7a2V5OlwiX3JlbmRlclN0ZXBcIix2YWx1ZTpmdW5jdGlvbigpeyEwPT09dGhpcy5yZW5kZXJpbmdBY3RpdmUmJih0aGlzLnJlbmRlclRpbWVyPXZvaWQgMCwhMD09PXRoaXMucmVxdWlyZXNUaW1lb3V0JiZ0aGlzLl9zdGFydFJlbmRlcmluZygpLHRoaXMuX3JlZHJhdygpLCExPT09dGhpcy5yZXF1aXJlc1RpbWVvdXQmJnRoaXMuX3N0YXJ0UmVuZGVyaW5nKCkpfX0se2tleTpcInJlZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInNldFNpemVcIiksdGhpcy5fcmVkcmF3KCl9fSx7a2V5OlwiX3JlcXVlc3RSZWRyYXdcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7ITAhPT10aGlzLnJlZHJhd1JlcXVlc3RlZCYmITE9PT10aGlzLnJlbmRlcmluZ0FjdGl2ZSYmITA9PT10aGlzLmFsbG93UmVkcmF3JiYodGhpcy5yZWRyYXdSZXF1ZXN0ZWQ9ITAsdGhpcy5fcmVxdWVzdE5leHRGcmFtZShmdW5jdGlvbigpe3QuX3JlZHJhdyghMSl9LDApKX19LHtrZXk6XCJfcmVkcmF3XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO2lmKCEwPT09dGhpcy5hbGxvd1JlZHJhdyl7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcImluaXRSZWRyYXdcIiksdGhpcy5yZWRyYXdSZXF1ZXN0ZWQ9ITEsMCE9PXRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy53aWR0aCYmMCE9PXRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5oZWlnaHR8fHRoaXMuY2FudmFzLnNldFNpemUoKSx0aGlzLmNhbnZhcy5zZXRUcmFuc2Zvcm0oKTt2YXIgZT10aGlzLmNhbnZhcy5nZXRDb250ZXh0KCksaT10aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgsbz10aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50SGVpZ2h0O2lmKGUuY2xlYXJSZWN0KDAsMCxpLG8pLDA9PT10aGlzLmNhbnZhcy5mcmFtZS5jbGllbnRXaWR0aClyZXR1cm47ZS5zYXZlKCksZS50cmFuc2xhdGUodGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24ueCx0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi55KSxlLnNjYWxlKHRoaXMuYm9keS52aWV3LnNjYWxlLHRoaXMuYm9keS52aWV3LnNjYWxlKSxlLmJlZ2luUGF0aCgpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJiZWZvcmVEcmF3aW5nXCIsZSksZS5jbG9zZVBhdGgoKSwhMT09PXQmJighMT09PXRoaXMuZHJhZ2dpbmd8fCEwPT09dGhpcy5kcmFnZ2luZyYmITE9PT10aGlzLm9wdGlvbnMuaGlkZUVkZ2VzT25EcmFnKSYmdGhpcy5fZHJhd0VkZ2VzKGUpLCghMT09PXRoaXMuZHJhZ2dpbmd8fCEwPT09dGhpcy5kcmFnZ2luZyYmITE9PT10aGlzLm9wdGlvbnMuaGlkZU5vZGVzT25EcmFnKSYmdGhpcy5fZHJhd05vZGVzKGUsdCksZS5iZWdpblBhdGgoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiYWZ0ZXJEcmF3aW5nXCIsZSksZS5jbG9zZVBhdGgoKSxlLnJlc3RvcmUoKSwhMD09PXQmJmUuY2xlYXJSZWN0KDAsMCxpLG8pfX19LHtrZXk6XCJfcmVzaXplTm9kZXNcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuY2FudmFzLnNldFRyYW5zZm9ybSgpO3ZhciB0PXRoaXMuY2FudmFzLmdldENvbnRleHQoKTt0LnNhdmUoKSx0LnRyYW5zbGF0ZSh0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54LHRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLnkpLHQuc2NhbGUodGhpcy5ib2R5LnZpZXcuc2NhbGUsdGhpcy5ib2R5LnZpZXcuc2NhbGUpO3ZhciBlPXRoaXMuYm9keS5ub2RlcyxpPXZvaWQgMDtmb3IodmFyIG8gaW4gZSllLmhhc093blByb3BlcnR5KG8pJiYoaT1lW29dLGkucmVzaXplKHQpLGkudXBkYXRlQm91bmRpbmdCb3godCxpLnNlbGVjdGVkKSk7dC5yZXN0b3JlKCl9fSx7a2V5OlwiX2RyYXdOb2Rlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLGk9dGhpcy5ib2R5Lm5vZGVzLG89dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLG49dm9pZCAwLHM9W10scj10aGlzLmNhbnZhcy5ET010b0NhbnZhcyh7eDotMjAseTotMjB9KSxhPXRoaXMuY2FudmFzLkRPTXRvQ2FudmFzKHt4OnRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCsyMCx5OnRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHQrMjB9KSxoPXt0b3A6ci55LGxlZnQ6ci54LGJvdHRvbTphLnkscmlnaHQ6YS54fSxkPTA7ZDxvLmxlbmd0aDtkKyspbj1pW29bZF1dLG4uaXNTZWxlY3RlZCgpP3MucHVzaChvW2RdKTohMD09PWU/bi5kcmF3KHQpOiEwPT09bi5pc0JvdW5kaW5nQm94T3ZlcmxhcHBpbmdXaXRoKGgpP24uZHJhdyh0KTpuLnVwZGF0ZUJvdW5kaW5nQm94KHQsbi5zZWxlY3RlZCk7Zm9yKHZhciBsPTA7bDxzLmxlbmd0aDtsKyspbj1pW3NbbF1dLG4uZHJhdyh0KX19LHtrZXk6XCJfZHJhd0VkZ2VzXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuYm9keS5lZGdlcyxpPXRoaXMuYm9keS5lZGdlSW5kaWNlcyxvPXZvaWQgMCxuPTA7bjxpLmxlbmd0aDtuKyspbz1lW2lbbl1dLCEwPT09by5jb25uZWN0ZWQmJm8uZHJhdyh0KX19LHtrZXk6XCJfZGV0ZXJtaW5lQnJvd3Nlck1ldGhvZFwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyl7dmFyIHQ9bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO3RoaXMucmVxdWlyZXNUaW1lb3V0PSExLC0xIT10LmluZGV4T2YoXCJtc2llIDkuMFwiKT90aGlzLnJlcXVpcmVzVGltZW91dD0hMDotMSE9dC5pbmRleE9mKFwic2FmYXJpXCIpJiZ0LmluZGV4T2YoXCJjaHJvbWVcIik8PS0xJiYodGhpcy5yZXF1aXJlc1RpbWVvdXQ9ITApfWVsc2UgdGhpcy5yZXF1aXJlc1RpbWVvdXQ9ITB9fV0pLHR9KCk7ZS5kZWZhdWx0PWx9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDApLHM9byhuKSxyPWkoMSksYT1vKHIpLGg9aSgxMCksZD1pKDM3KSxsPWkoMiksdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7KDAscy5kZWZh
21167dWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMucGl4ZWxSYXRpbz0xLHRoaXMucmVzaXplVGltZXI9dm9pZCAwLHRoaXMucmVzaXplRnVuY3Rpb249dGhpcy5fb25SZXNpemUuYmluZCh0aGlzKSx0aGlzLmNhbWVyYVN0YXRlPXt9LHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5jYW52YXNWaWV3Q2VudGVyPXt9LHRoaXMub3B0aW9ucz17fSx0aGlzLmRlZmF1bHRPcHRpb25zPXthdXRvUmVzaXplOiEwLGhlaWdodDpcIjEwMCVcIix3aWR0aDpcIjEwMCVcIn0sbC5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OlwiYmluZEV2ZW50TGlzdGVuZXJzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYm9keS5lbWl0dGVyLm9uY2UoXCJyZXNpemVcIixmdW5jdGlvbihlKXswIT09ZS53aWR0aCYmKHQuYm9keS52aWV3LnRyYW5zbGF0aW9uLng9LjUqZS53aWR0aCksMCE9PWUuaGVpZ2h0JiYodC5ib2R5LnZpZXcudHJhbnNsYXRpb24ueT0uNSplLmhlaWdodCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcInNldFNpemVcIix0aGlzLnNldFNpemUuYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJkZXN0cm95XCIsZnVuY3Rpb24oKXt0LmhhbW1lckZyYW1lLmRlc3Ryb3koKSx0LmhhbW1lci5kZXN0cm95KCksdC5fY2xlYW5VcCgpfSl9fSx7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYodm9pZCAwIT09dCl7dmFyIGk9W1wid2lkdGhcIixcImhlaWdodFwiLFwiYXV0b1Jlc2l6ZVwiXTtsLnNlbGVjdGl2ZURlZXBFeHRlbmQoaSx0aGlzLm9wdGlvbnMsdCl9ITA9PT10aGlzLm9wdGlvbnMuYXV0b1Jlc2l6ZSYmKHRoaXMuX2NsZWFuVXAoKSx0aGlzLnJlc2l6ZVRpbWVyPXNldEludGVydmFsKGZ1bmN0aW9uKCl7ITA9PT1lLnNldFNpemUoKSYmZS5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZXF1ZXN0UmVkcmF3XCIpfSwxZTMpLHRoaXMucmVzaXplRnVuY3Rpb249dGhpcy5fb25SZXNpemUuYmluZCh0aGlzKSxsLmFkZEV2ZW50TGlzdGVuZXIod2luZG93LFwicmVzaXplXCIsdGhpcy5yZXNpemVGdW5jdGlvbikpfX0se2tleTpcIl9jbGVhblVwXCIsdmFsdWU6ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLnJlc2l6ZVRpbWVyJiZjbGVhckludGVydmFsKHRoaXMucmVzaXplVGltZXIpLGwucmVtb3ZlRXZlbnRMaXN0ZW5lcih3aW5kb3csXCJyZXNpemVcIix0aGlzLnJlc2l6ZUZ1bmN0aW9uKSx0aGlzLnJlc2l6ZUZ1bmN0aW9uPXZvaWQgMH19LHtrZXk6XCJfb25SZXNpemVcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuc2V0U2l6ZSgpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVkcmF3XCIpfX0se2tleTpcIl9nZXRDYW1lcmFTdGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnRoaXMucGl4ZWxSYXRpbzshMD09PXRoaXMuaW5pdGlhbGl6ZWQmJih0aGlzLmNhbWVyYVN0YXRlLnByZXZpb3VzV2lkdGg9dGhpcy5mcmFtZS5jYW52YXMud2lkdGgvdCx0aGlzLmNhbWVyYVN0YXRlLnByZXZpb3VzSGVpZ2h0PXRoaXMuZnJhbWUuY2FudmFzLmhlaWdodC90LHRoaXMuY2FtZXJhU3RhdGUuc2NhbGU9dGhpcy5ib2R5LnZpZXcuc2NhbGUsdGhpcy5jYW1lcmFTdGF0ZS5wb3NpdGlvbj10aGlzLkRPTXRvQ2FudmFzKHt4Oi41KnRoaXMuZnJhbWUuY2FudmFzLndpZHRoL3QseTouNSp0aGlzLmZyYW1lLmNhbnZhcy5oZWlnaHQvdH0pKX19LHtrZXk6XCJfc2V0Q2FtZXJhU3RhdGVcIix2YWx1ZTpmdW5jdGlvbigpe2lmKHZvaWQgMCE9PXRoaXMuY2FtZXJhU3RhdGUuc2NhbGUmJjAhPT10aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCYmMCE9PXRoaXMuZnJhbWUuY2FudmFzLmNsaWVudEhlaWdodCYmMCE9PXRoaXMucGl4ZWxSYXRpbyYmdGhpcy5jYW1lcmFTdGF0ZS5wcmV2aW91c1dpZHRoPjApe3ZhciB0PXRoaXMuZnJhbWUuY2FudmFzLndpZHRoL3RoaXMucGl4ZWxSYXRpby90aGlzLmNhbWVyYVN0YXRlLnByZXZpb3VzV2lkdGgsZT10aGlzLmZyYW1lLmNhbnZhcy5oZWlnaHQvdGhpcy5waXhlbFJhdGlvL3RoaXMuY2FtZXJhU3RhdGUucHJldmlvdXNIZWlnaHQsaT10aGlzLmNhbWVyYVN0YXRlLnNjYWxlOzEhPXQmJjEhPWU/aT0uNSp0aGlzLmNhbWVyYVN0YXRlLnNjYWxlKih0K2UpOjEhPXQ/aT10aGlzLmNhbWVyYVN0YXRlLnNjYWxlKnQ6MSE9ZSYmKGk9dGhpcy5jYW1lcmFTdGF0ZS5zY2FsZSplKSx0aGlzLmJvZHkudmlldy5zY2FsZT1pO3ZhciBvPXRoaXMuRE9NdG9DYW52YXMoe3g6LjUqdGhpcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgseTouNSp0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHR9KSxuPXt4Om8ueC10aGlzLmNhbWVyYVN0YXRlLnBvc2l0aW9uLngseTpvLnktdGhpcy5jYW1lcmFTdGF0ZS5wb3NpdGlvbi55fTt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54Kz1uLngqdGhpcy5ib2R5LnZpZXcuc2NhbGUsdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24ueSs9bi55KnRoaXMuYm9keS52aWV3LnNjYWxlfX19LHtrZXk6XCJfcHJlcGFyZVZhbHVlXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoXCJudW1iZXJcIj09dHlwZW9mIHQpcmV0dXJuIHQrXCJweFwiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXtpZigtMSE9PXQuaW5kZXhPZihcIiVcIil8fC0xIT09dC5pbmRleE9mKFwicHhcIikpcmV0dXJuIHQ7aWYoLTE9PT10LmluZGV4T2YoXCIlXCIpKXJldHVybiB0K1wicHhcIn10aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgdXNlIHRoZSB2YWx1ZSBzdXBwbGllZCBmb3Igd2lkdGggb3IgaGVpZ2h0OlwiK3QpfX0se2tleTpcIl9jcmVhdGVcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcig7dGhpcy5ib2R5LmNvbnRhaW5lci5oYXNDaGlsZE5vZGVzKCk7KXRoaXMuYm9keS5jb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5ib2R5LmNvbnRhaW5lci5maXJzdENoaWxkKTtpZih0aGlzLmZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5mcmFtZS5jbGFzc05hbWU9XCJ2aXMtbmV0d29ya1wiLHRoaXMuZnJhbWUuc3R5bGUucG9zaXRpb249XCJyZWxhdGl2ZVwiLHRoaXMuZnJhbWUuc3R5bGUub3ZlcmZsb3c9XCJoaWRkZW5cIix0aGlzLmZyYW1lLnRhYkluZGV4PTkwMCx0aGlzLmZyYW1lLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLHRoaXMuZnJhbWUuY2FudmFzLnN0eWxlLnBvc2l0aW9uPVwicmVsYXRpdmVcIix0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUuY2FudmFzKSx0aGlzLmZyYW1lLmNhbnZhcy5nZXRDb250ZXh0KXRoaXMuX3NldFBpeGVsUmF0aW8oKSx0aGlzLnNldFRyYW5zZm9ybSgpO2Vsc2V7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIkRJVlwiKTt0LnN0eWxlLmNvbG9yPVwicmVkXCIsdC5zdHlsZS5mb250V2VpZ2h0PVwiYm9sZFwiLHQuc3R5bGUucGFkZGluZz1cIjEwcHhcIix0LmlubmVySFRNTD1cIkVycm9yOiB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBIVE1MIGNhbnZhc1wiLHRoaXMuZnJhbWUuY2FudmFzLmFwcGVuZENoaWxkKHQpfXRoaXMuYm9keS5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZSksdGhpcy5ib2R5LnZpZXcuc2NhbGU9MSx0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbj17eDouNSp0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCx5Oi41KnRoaXMuZnJhbWUuY2FudmFzLmNsaWVudE
21167hlaWdodH0sdGhpcy5fYmluZEhhbW1lcigpfX0se2tleTpcIl9iaW5kSGFtbWVyXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3ZvaWQgMCE9PXRoaXMuaGFtbWVyJiZ0aGlzLmhhbW1lci5kZXN0cm95KCksdGhpcy5kcmFnPXt9LHRoaXMucGluY2g9e30sdGhpcy5oYW1tZXI9bmV3IGgodGhpcy5mcmFtZS5jYW52YXMpLHRoaXMuaGFtbWVyLmdldChcInBpbmNoXCIpLnNldCh7ZW5hYmxlOiEwfSksdGhpcy5oYW1tZXIuZ2V0KFwicGFuXCIpLnNldCh7dGhyZXNob2xkOjUsZGlyZWN0aW9uOmguRElSRUNUSU9OX0FMTH0pLGQub25Ub3VjaCh0aGlzLmhhbW1lcixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Ub3VjaChlKX0pLHRoaXMuaGFtbWVyLm9uKFwidGFwXCIsZnVuY3Rpb24oZSl7dC5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uVGFwKGUpfSksdGhpcy5oYW1tZXIub24oXCJkb3VibGV0YXBcIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Eb3VibGVUYXAoZSl9KSx0aGlzLmhhbW1lci5vbihcInByZXNzXCIsZnVuY3Rpb24oZSl7dC5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uSG9sZChlKX0pLHRoaXMuaGFtbWVyLm9uKFwicGFuc3RhcnRcIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25EcmFnU3RhcnQoZSl9KSx0aGlzLmhhbW1lci5vbihcInBhbm1vdmVcIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25EcmFnKGUpfSksdGhpcy5oYW1tZXIub24oXCJwYW5lbmRcIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25EcmFnRW5kKGUpfSksdGhpcy5oYW1tZXIub24oXCJwaW5jaFwiLGZ1bmN0aW9uKGUpe3QuYm9keS5ldmVudExpc3RlbmVycy5vblBpbmNoKGUpfSksdGhpcy5mcmFtZS5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNld2hlZWxcIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Nb3VzZVdoZWVsKGUpfSksdGhpcy5mcmFtZS5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTU1vdXNlU2Nyb2xsXCIsZnVuY3Rpb24oZSl7dC5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uTW91c2VXaGVlbChlKX0pLHRoaXMuZnJhbWUuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Nb3VzZU1vdmUoZSl9KSx0aGlzLmZyYW1lLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Db250ZXh0KGUpfSksdGhpcy5oYW1tZXJGcmFtZT1uZXcgaCh0aGlzLmZyYW1lKSxkLm9uUmVsZWFzZSh0aGlzLmhhbW1lckZyYW1lLGZ1bmN0aW9uKGUpe3QuYm9keS5ldmVudExpc3RlbmVycy5vblJlbGVhc2UoZSl9KX19LHtrZXk6XCJzZXRTaXplXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dGhpcy5vcHRpb25zLndpZHRoLGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnRoaXMub3B0aW9ucy5oZWlnaHQ7dD10aGlzLl9wcmVwYXJlVmFsdWUodCksZT10aGlzLl9wcmVwYXJlVmFsdWUoZSk7dmFyIGk9ITEsbz10aGlzLmZyYW1lLmNhbnZhcy53aWR0aCxuPXRoaXMuZnJhbWUuY2FudmFzLmhlaWdodCxzPXRoaXMucGl4ZWxSYXRpbztpZih0aGlzLl9zZXRQaXhlbFJhdGlvKCksdCE9dGhpcy5vcHRpb25zLndpZHRofHxlIT10aGlzLm9wdGlvbnMuaGVpZ2h0fHx0aGlzLmZyYW1lLnN0eWxlLndpZHRoIT10fHx0aGlzLmZyYW1lLnN0eWxlLmhlaWdodCE9ZSl0aGlzLl9nZXRDYW1lcmFTdGF0ZShzKSx0aGlzLmZyYW1lLnN0eWxlLndpZHRoP
21167XQsdGhpcy5mcmFtZS5zdHlsZS5oZWlnaHQ9ZSx0aGlzLmZyYW1lLmNhbnZhcy5zdHlsZS53aWR0aD1cIjEwMCVcIix0aGlzLmZyYW1lLmNhbnZhcy5zdHlsZS5oZWlnaHQ9XCIxMDAlXCIsdGhpcy5mcmFtZS5jYW52YXMud2lkdGg9TWF0aC5yb3VuZCh0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCp0aGlzLnBpeGVsUmF0aW8pLHRoaXMuZnJhbWUuY2FudmFzLmhlaWdodD1NYXRoLnJvdW5kKHRoaXMuZnJhbWUuY2FudmFzLmNsaWVudEhlaWdodCp0aGlzLnBpeGVsUmF0aW8pLHRoaXMub3B0aW9ucy53aWR0aD10LHRoaXMub3B0aW9ucy5oZWlnaHQ9ZSx0aGlzLmNhbnZhc1ZpZXdDZW50ZXI9e3g6LjUqdGhpcy5mcmFtZS5jbGllbnRXaWR0aCx5Oi41KnRoaXMuZnJhbWUuY2xpZW50SGVpZ2h0fSxpPSEwO2Vsc2V7dmFyIHI9TWF0aC5yb3VuZCh0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCp0aGlzLnBpeGVsUmF0aW8pLGE9TWF0aC5yb3VuZCh0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHQqdGhpcy5waXhlbFJhdGlvKTt0aGlzLmZyYW1lLmNhbnZhcy53aWR0aD09PXImJnRoaXMuZnJhbWUuY2FudmFzLmhlaWdodD09PWF8fHRoaXMuX2dldENhbWVyYVN0YXRlKHMpLFxuICAgIHRoaXMuZnJhbWUuY2FudmFzLndpZHRoIT09ciYmKHRoaXMuZnJhbWUuY2FudmFzLndpZHRoPXIsaT0hMCksdGhpcy5mcmFtZS5jYW52YXMuaGVpZ2h0IT09YSYmKHRoaXMuZnJhbWUuY2FudmFzLmhlaWdodD1hLGk9ITApfXJldHVybiEwPT09aSYmKHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJyZXNpemVcIix7d2lkdGg6TWF0aC5yb3VuZCh0aGlzLmZyYW1lLmNhbnZhcy53aWR0aC90aGlzLnBpeGVsUmF0aW8pLGhlaWdodDpNYXRoLnJvdW5kKHRoaXMuZnJhbWUuY2FudmFzLmhlaWdodC90aGlzLnBpeGVsUmF0aW8pLG9sZFdpZHRoOk1hdGgucm91bmQoby90aGlzLnBpeGVsUmF0aW8pLG9sZEhlaWdodDpNYXRoLnJvdW5kKG4vdGhpcy5waXhlbFJhdGlvKX0pLHRoaXMuX3NldENhbWVyYVN0YXRl
21167KCkpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsaX19LHtrZXk6XCJnZXRDb250ZXh0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mcmFtZS5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpfX0se2tleTpcIl9kZXRlcm1pbmVQaXhlbFJhdGlvXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldENvbnRleHQoKTtpZih2b2lkIDA9PT10KXRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBnZXQgY2FudmF4IGNvbnRleHRcIik7dmFyIGU9MTtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiYoZT13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MSksZS8odC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fDEpfX0se2tleTpcIl9zZXRQaXhlbFJhdGlvXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnBpeGVsUmF0aW89dGhpcy5fZGV0ZXJtaW5lUGl4ZWxSYXRpbygpfX0se2tleTpcInNldFRyYW5zZm9ybVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRDb250ZXh0KCk7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZ2V0IGNhbnZheCBjb250ZXh0XCIpO3Quc2V0VHJhbnNmb3JtKHRoaXMucGl4ZWxSYXRpbywwLDAsdGhpcy5waXhlbFJhdGlvLDAsMCl9fSx7a2V5OlwiX1hjb252ZXJ0RE9NdG9DYW52YXNcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54KS90aGlzLmJvZHkudmlldy5zY2FsZX19LHtrZXk6XCJfWGNvbnZlcnRDYW52YXNUb0RPTVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuYm9keS52aWV3LnNjYWxlK3RoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLnh9fSx7a2V5OlwiX1ljb252ZXJ0RE9NdG9DYW52YXNcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi55KS90aGlzLmJvZHkudmlldy5zY2FsZX19LHtrZXk6XCJfWWNvbnZlcnRDYW52YXNUb0RPTVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuYm9keS52aWV3LnNjYWxlK3RoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLnl9fSx7a2V5OlwiY2FudmFzVG9ET01cIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm57eDp0aGlzLl9YY29udmVydENhbnZhc1RvRE9NKHQueCkseTp0aGlzLl9ZY29udmVydENhbnZhc1RvRE9NKHQueSl9fX0se2tleTpcIkRPTXRvQ2FudmFzXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJue3g6dGhpcy5fWGNvbnZlcnRET010b0NhbnZhcyh0LngpLHk6dGhpcy5fWWNvbnZlcnRET010b0NhbnZhcyh0LnkpfX19XSksdH0oKTtlLmRlZmF1bHQ9dX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMCkscz1vKG4pLHI9aSgxKSxhPW8ociksaD1pKDIpLGQ9aSg3NikuZGVmYXVsdCxsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGkpe3ZhciBvPXRoaXM7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMuY2FudmFzPWksdGhpcy5hbmltYXRpb25TcGVlZD0xL3RoaXMucmVuZGVyUmVmcmVzaFJhdGUsdGhpcy5hbmltYXRpb25FYXNpbmdGdW5jdGlvbj1cImVhc2VJbk91dFF1aW50XCIsdGhpcy5lYXNpbmdUaW1lPTAsdGhpcy5zb3VyY2VTY2FsZT0wLHRoaXMudGFyZ2V0U2NhbGU9MCx0aGlzLnNvdXJjZVRyYW5zbGF0aW9uPTAsdGhpcy50YXJnZXRUcmFuc2xhdGlvbj0wLHRoaXMubG9ja2VkT25Ob2RlSWQ9dm9pZCAwLHRoaXMubG9ja2VkT25Ob2RlT2Zmc2V0PXZvaWQgMCx0aGlzLnRvdWNoVGltZT0wLHRoaXMudmlld0Z1bmN0aW9uPXZvaWQgMCx0aGlzLmJvZHkuZW1pdHRlci5vbihcImZpdFwiLHRoaXMuZml0LmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiYW5pbWF0aW9uRmluaXNoZWRcIixmdW5jdGlvbigpe28uYm9keS5lbWl0dGVyLmVtaXQoXCJfc3RvcFJlbmRlcmluZ1wiKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwidW5sb2NrTm9kZVwiLHRoaXMucmVsZWFzZU5vZGUuYmluZCh0aGlzKSl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3RoaXMub3B0aW9ucz10fX0se2tleTpcImZpdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOntub2RlczpbXX0sZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLGk9dm9pZCAwLG89dm9pZCAwO2lmKHZvaWQgMCE9PXQubm9kZXMmJjAhPT10Lm5vZGVzLmxlbmd0aHx8KHQubm9kZXM9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzKSwhMD09PWUpe3ZhciBuPTA7Zm9yKHZhciBzIGluIHRoaXMuYm9keS5ub2RlcylpZih0aGlzLmJvZHkubm9kZXMuaGFzT3duUHJvcGVydHkocykpe3ZhciByPXRoaXMuYm9keS5ub2Rlc1tzXTshMD09PXIucHJlZGVmaW5lZFBvc2l0aW9uJiYobis9MSl9aWYobj4uNSp0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoKXJldHVybiB2b2lkIHRoaXMuZml0KHQsITEpO2k9ZC5nZXRSYW5nZSh0aGlzLmJvZHkubm9kZXMsdC5ub2Rlcyk7bz0xMi42NjIvKHRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGgrNy40MTQ3KSsuMDk2NDgyMjtvKj1NYXRoLm1pbih0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgvNjAwLHRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHQvNjAwKX1lbHNle3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVzaXplTm9kZXNcIiksaT1kLmdldFJhbmdlKHRoaXMuYm9keS5ub2Rlcyx0Lm5vZGVzKTt2YXIgYT0xLjEqTWF0aC5hYnMoaS5tYXhYLWkubWluWCksaD0xLjEqTWF0aC5hYnMoaS5tYXhZLWkubWluWSksbD10aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgvYSx1PXRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHQvaDtvPWw8PXU/bDp1fW8+MT9vPTE6MD09PW8mJihvPTEpO3ZhciBjPWQuZmluZENlbnRlcihpKSxwPXtwb3NpdGlvbjpjLHNjYWxlOm8sYW5pbWF0aW9uOnQuYW5pbWF0aW9ufTt0aGlzLm1vdmVUbyhwKX19LHtrZXk6XCJmb2N1c1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZih2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbdF0pe3ZhciBpPXt4OnRoaXMuYm9keS5ub2Rlc1t0XS54LHk6dGhpcy5ib2R5Lm5vZGVzW3RdLnl9O2UucG9zaXRpb249aSxlLmxvY2tlZE9uTm9kZT10LH
21167RoaXMubW92ZVRvKGUpfWVsc2UgY29uc29sZS5sb2coXCJOb2RlOiBcIit0K1wiIGNhbm5vdCBiZSBmb3VuZC5cIil9fSx7a2V5OlwibW92ZVRvXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gdm9pZCh0PXt9KTt2b2lkIDA9PT10Lm9mZnNldCYmKHQub2Zmc2V0PXt4OjAseTowfSksdm9pZCAwPT09dC5vZmZzZXQueCYmKHQub2Zmc2V0Lng9MCksdm9pZCAwPT09dC5vZmZzZXQueSYmKHQub2Zmc2V0Lnk9MCksdm9pZCAwPT09dC5zY2FsZSYmKHQuc2NhbGU9dGhpcy5ib2R5LnZpZXcuc2NhbGUpLHZvaWQgMD09PXQucG9zaXRpb24mJih0LnBvc2l0aW9uPXRoaXMuZ2V0Vmlld1Bvc2l0aW9uKCkpLHZvaWQgMD09PXQuYW5pbWF0aW9uJiYodC5hbmltYXRpb249e2R1cmF0aW9uOjB9KSwhMT09PXQuYW5pbWF0aW9uJiYodC5hbmltYXRpb249e2R1cmF0aW9uOjB9KSwhMD09PXQuYW5pbWF0aW9uJiYodC5hbmltYXRpb249e30pLHZvaWQgMD09PXQuYW5pbWF0aW9uLmR1cmF0aW9uJiYodC5hbmltYXRpb24uZHVyYXRpb249MWUzKSx2b2lkIDA9PT10LmFuaW1hdGlvbi5lYXNpbmdGdW5jdGlvbiYmKHQuYW5pbWF0aW9uLmVhc2luZ0Z1bmN0aW9uPVwiZWFzZUluT3V0UXVhZFwiKSx0aGlzLmFuaW1hdGVWaWV3KHQpfX0se2tleTpcImFuaW1hdGVWaWV3XCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dCl7dGhpcy5hbmltYXRpb25FYXNpbmdGdW5jdGlvbj10LmFuaW1hdGlvbi5lYXNpbmdGdW5jdGlvbix0aGlzLnJlbGVhc2VOb2RlKCksITA9PT10LmxvY2tlZCYmKHR
21167oaXMubG9ja2VkT25Ob2RlSWQ9dC5sb2NrZWRPbk5vZGUsdGhpcy5sb2NrZWRPbk5vZGVPZmZzZXQ9dC5vZmZzZXQpLDAhPXRoaXMuZWFzaW5nVGltZSYmdGhpcy5fdHJhbnNpdGlvblJlZHJhdyghMCksdGhpcy5zb3VyY2VTY2FsZT10aGlzLmJvZHkudmlldy5zY2FsZSx0aGlzLnNvdXJjZVRyYW5zbGF0aW9uPXRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLHRoaXMudGFyZ2V0U2NhbGU9dC5zY2FsZSx0aGlzLmJvZHkudmlldy5zY2FsZT10aGlzLnRhcmdldFNjYWxlO3ZhciBlPXRoaXMuY2FudmFzLkRPTXRvQ2FudmFzKHt4Oi41KnRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCx5Oi41KnRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHR9KSxpPXt4OmUueC10LnBvc2l0aW9uLngseTplLnktdC5wb3NpdGlvbi55fTt0aGlzLnRhcmdldFRyYW5zbGF0aW9uPXt4OnRoaXMuc291cmNlVHJhbnNsYXRpb24ueCtpLngqdGhpcy50YXJnZXRTY2FsZSt0Lm9mZnNldC54LHk6dGhpcy5zb3VyY2VUcmFuc2xhdGlvbi55K2kueSp0aGlzLnRhcmdldFNjYWxlK3Qub2Zmc2V0Lnl9LDA9PT10LmFuaW1hdGlvbi5kdXJhdGlvbj92b2lkIDAhPXRoaXMubG9ja2VkT25Ob2RlSWQ/KHRoaXMudmlld0Z1bmN0aW9uPXRoaXMuX2xvY2tlZFJlZHJhdy5iaW5kKHRoaXMpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiaW5pdFJlZHJhd1wiLHRoaXMudmlld0Z1bmN0aW9uKSk6KHRoaXMuYm9keS52aWV3LnNjYWxlPXRoaXMudGFyZ2V0U2NhbGUsdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249dGhpcy50YXJnZXRUcmFuc2xhdGlvbix0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3JlcXVlc3RSZWRyYXdcIikpOih0aGlzLmFuaW1hdGlvblNwZWVkPTEvKDYwKnQuYW5pbWF0aW9uLmR1cmF0aW9uKi4wMDEpfHwxLzYwLHRoaXMuYW5pbWF0aW9uRWFzaW5nRnVuY3Rpb249dC5hbmltYXRpb24uZWFzaW5nRnVuY3Rpb24sdGhpcy52aWV3RnVuY3Rpb249dGhpcy5fdHJhbnNpdGlvblJlZHJhdy5iaW5kKHRoaXMpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiaW5pdFJlZHJhd1wiLHRoaXMudmlld0Z1bmN0aW9uKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3N0YXJ0UmVuZGVyaW5nXCIpKX19fSx7a2V5OlwiX2xvY2tlZFJlZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9e3g6dGhpcy5ib2R5Lm5vZGVzW3RoaXMubG9ja2VkT25Ob2RlSWRdLngseTp0aGlzLmJvZHkubm9kZXNbdGhpcy5sb2NrZWRPbk5vZGVJZF0ueX0sZT10aGlzLmNhbnZhcy5ET010b0NhbnZhcyh7eDouNSp0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgseTouNSp0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50SGVpZ2h0fSksaT17eDplLngtdC54LHk6ZS55LXQueX0sbz10aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbixuPXt4Om8ueCtpLngqdGhpcy5ib2R5LnZpZXcuc2NhbGUrdGhpcy5sb2NrZWRPbk5vZGVPZmZzZXQueCx5Om8ueStpLnkqdGhpcy5ib2R5LnZpZXcuc2NhbGUrdGhpcy5sb2NrZWRPbk5vZGVPZmZzZXQueX07dGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249bn19LHtrZXk6XCJyZWxlYXNlTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5sb2NrZWRPbk5vZGVJZCYmdm9pZCAwIT09dGhpcy52aWV3RnVuY3Rpb24mJih0aGlzLmJvZHkuZW1pdHRlci5vZmYoXCJpbml0UmVkcmF3XCIsdGhpcy52aWV3RnVuY3Rpb24pLHRoaXMubG9ja2VkT25Ob2RlSWQ9dm9pZCAwLHRoaXMubG9ja2VkT25Ob2RlT2Zmc2V0PXZvaWQgMCl9fSx7a2V5OlwiX3RyYW5zaXRpb25SZWRyYXdcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07dGhpcy5lYXNpbmdUaW1lKz10aGlzLmFuaW1hdGlvblNwZWVkLHRoaXMuZWFzaW5nVGltZT0hMD09PXQ/MTp0aGlzLmVhc2luZ1RpbWU7dmFyIGU9aC5lYXNpbmdGdW5jdGlvbnNbdGhpcy5hbmltYXRpb25FYXNpbmdGdW5jdGlvbl0odGhpcy5lYXNpbmdUaW1lKTt0aGlzLmJvZHkudmlldy5zY2FsZT10aGlzLnNvdXJjZVNjYWxlKyh0aGlzLnRhcmdldFNjYWxlLXRoaXMuc291cmNlU2NhbGUpKmUsdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249e3g6dGhpcy5zb3VyY2VUcmFuc2xhdGlvbi54Kyh0aGlzLnRhcmdldFRyYW5zbGF0aW9uLngtdGhpcy5zb3VyY2VUcmFuc2xhdGlvbi54KSplLHk6dGhpcy5zb3VyY2VUcmFuc2xhdGlvbi55Kyh0aGlzLnRhcmdldFRyYW5zbGF0aW9uLnktdGhpcy5zb3VyY2VUcmFuc2xhdGlvbi55KSplfSx0aGlzLmVhc2luZ1RpbWU+PTEmJih0aGlzLmJvZHkuZW1pdHRlci5vZmYoXCJpbml0UmVkcmF3XCIsdGhpcy52aWV3RnVuY3Rpb24pLHRoaXMuZWFzaW5nVGltZT0wLHZvaWQgMCE9dGhpcy5sb2NrZWRPbk5vZGVJZCYmKHRoaXMudmlld0Z1bmN0aW9uPXRoaXMuX2xvY2tlZFJlZHJhdy5iaW5kKHRoaXMpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiaW5pdFJlZHJhd1wiLHRoaXMudmlld0Z1bmN0aW9uKSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcImFuaW1hdGlvbkZpbmlzaGVkXCIpKX19LHtrZXk6XCJnZXRTY2FsZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYm9keS52aWV3LnNjYWxlfX0se2tleTpcImdldFZpZXdQb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FudmFzLkRPTXRvQ2FudmFzKHt4Oi41KnRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCx5Oi41KnRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHR9KX19XSksdH0oKTtlLmRlZmF1bHQ9bH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMCkscz1vKG4pLHI9aSgxKSxhPW8ociksaD1pKDIpLGQ9aSgyMzMpLmRlZmF1bHQsbD1pKDEwNCkuZGVmYXVsdCx1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMuY2FudmFzPWksdGhpcy5zZWxlY3Rpb25IYW5kbGVyPW8sdGhpcy5uYXZpZ2F0aW9uSGFuZGxlcj1uZXcgZChlLGkpLHRoaXMuYm9keS5ldmVudExpc3RlbmVycy5vblRhcD10aGlzLm9uVGFwLmJpbmQodGhpcyksdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uVG91Y2g9dGhpcy5vblRvdWNoLmJpbmQodGhpcyksdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uRG91YmxlVGFwPXRoaXMub25Eb3VibGVUYXAuYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Ib2xkPXRoaXMub25Ib2xkLmJpbmQodGhpcyksdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uRHJhZ1N0YXJ0PXRoaXMub25EcmFnU3RhcnQuYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25EcmFnPXRoaXMub25EcmFnLmJpbmQodGhpcyksdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uRHJhZ0VuZD10aGlzLm9uRHJhZ0VuZC5iaW5kKHRoaXMpLHRoaXMuYm9keS5ldmVudExpc3RlbmVycy5vbk1vdXNlV2hlZWw9dGhpcy5vbk1vdXNlV2hlZWwuYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25QaW5jaD10aGlzLm9uUGluY2guYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Nb3VzZU1vdmU9dGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpLHRoaXMuYm9keS5ldmVudExpc3RlbmVycy5vblJlbGVhc2U9dGhpcy5vblJlbGVhc2UuYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Db250ZXh0PXRoaXMub25Db250ZXh0LmJpbmQodGhpcyksdGhpcy50b3VjaFRpbWU9MCx0aGlzLmRyYWc9e30sdGhpcy5waW5jaD17fSx0aGlzLnBvcHVwPXZvaWQgMCx0aGlzLnBvcHVwT2JqPXZvaWQgMCx0aGlzLnBvcHVwVGltZXI9dm9pZCAwLHRoaXMuYm9keS5mdW5jdGlvbnMuZ2V0UG9pbnRlcj10aGlzLmdldFBvaW50ZXIuYmluZCh0aGlzKSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZh
21167dWx0T3B0aW9ucz17ZHJhZ05vZGVzOiEwLGRyYWdWaWV3OiEwLGhvdmVyOiExLGtleWJvYXJkOntlbmFibGVkOiExLHNwZWVkOnt4OjEwLHk6MTAsem9vbTouMDJ9LGJpbmRUb1dpbmRvdzohMH0sbmF2aWdhdGlvbkJ1dHRvbnM6ITEsdG9vbHRpcERlbGF5OjMwMCx6b29tVmlldzohMH0saC5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OlwiYmluZEV2ZW50TGlzdGVuZXJzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYm9keS5lbWl0dGVyLm9uKFwiZGVzdHJveVwiLGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHQucG9wdXBUaW1lciksZGVsZXRlIHQuYm9keS5mdW5jdGlvbnMuZ2V0UG9pbnRlcn0pfX0se2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10KXt2YXIgZT1bXCJoaWRlRWRnZXNPbkRyYWdcIixcImhpZGVOb2Rlc09uRHJhZ1wiLFwia2V5Ym9hcmRcIixcIm11bHRpc2VsZWN0XCIsXCJzZWxlY3RhYmxlXCIsXCJzZWxlY3RDb25uZWN0ZWRFZGdlc1wiXTtoLnNlbGVjdGl2ZU5vdERlZXBFeHRlbmQoZSx0aGlzLm9wdGlvbnMsdCksaC5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsXCJrZXlib2FyZFwiKSx0LnRvb2x0aXAmJihoLmV4dGVuZCh0aGlzLm9wdGlvbnMudG9vbHRpcCx0LnRvb2x0aXApLHQudG9vbHRpcC5jb2xvciYmKHRoaXMub3B0aW9ucy50b29sdGlwLmNvbG9yPWgucGFyc2VDb2xvcih0LnRvb2x0aXAuY29sb3IpKSl9dGhpcy5uYXZpZ2F0aW9uSGFuZGxlci5zZXRPcHRpb25zKHRoaXMub3B0aW9ucyl9fSx7a2V5OlwiZ2V0UG9pbnRlclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybnt4OnQueC1oLmdldEFic29sdXRlTGVmdCh0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMpLHk6dC55LWguZ2V0QWJzb2x1dGVUb3AodGhpcy5jYW52YXMuZnJhbWUuY2FudmFzKX19fSx7a2V5Olwib25Ub3VjaFwiLHZhbHVlOmZ1bmN0aW9uKHQpeyhuZXcgRGF0ZSkudmFsdWVPZigpLXRoaXMudG91Y2hUaW1lPjUwJiYodGhpcy5kcmFnLnBvaW50ZXI9dGhpcy5nZXRQb2ludGVyKHQuY2VudGVyKSx0aGlzLmRyYWcucGluY2hlZD0hMSx0aGlzLnBpbmNoLnNjYWxlPXRoaXMuYm9keS52aWV3LnNjYWxlLHRoaXMudG91Y2hUaW1lPShuZXcgRGF0ZSkudmFsdWVPZigpKX19LHtrZXk6XCJvblRhcFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UG9pbnRlcih0LmNlbnRlciksaT10aGlzLnNlbGVjdGlvbkhhbmRsZXIub3B0aW9ucy5tdWx0aXNlbGVjdCYmKHQuY2hhbmdlZFBvaW50ZXJzWzBdLmN0cmxLZXl8fHQuY2hhbmdlZFBvaW50ZXJzWzBdLm1ldGFLZXkpO3RoaXMuY2hlY2tTZWxlY3Rpb25DaGFuZ2VzKGUsdCxpKSx0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcImNsaWNrXCIsdCxlKX19LHtrZXk6XCJvbkRvdWJsZVRhcFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UG9pbnRlcih0LmNlbnRlcik7dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoXCJkb3VibGVDbGlja1wiLHQsZSl9fSx7a2V5Olwib25Ib2xkXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRQb2ludGVyKHQuY2VudGVyKSxpPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5vcHRpb25zLm11bHRpc2VsZWN0O3RoaXMuY2hlY2tTZWxlY3Rpb25DaGFuZ2VzKGUsdCxpKSx0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcImNsaWNrXCIsdCxlKSx0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcImhvbGRcIix0LGUpfX0se2tleTpcIm9uUmVsZWFzZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKChuZXcgRGF0ZSkudmFsdWVPZigpLXRoaXMudG91Y2hUaW1lPjEwKXt2YXIgZT10aGlzLmdldFBvaW50ZXIodC5jZW50ZXIpO3RoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2VuZXJhdGVDbGlja0V2ZW50KFwicmVsZWFzZVwiLHQsZSksdGhpcy50b3VjaFRpbWU9KG5ldyBEYXRlKS52YWx1ZU9mKCl9fX0se2tleTpcIm9uQ29udGV4dFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UG9pbnRlcih7eDp0LmNsaWVudFgseTp0LmNsaWVudFl9KTt0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcIm9uY29udGV4dFwiLHQsZSl9fSx7a2V5OlwiY2hlY2tTZWxlY3Rpb25DaGFuZ2VzXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLG89dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGlvbigpLG49ITE7bj0hMD09PWk/dGhpcy5zZWxlY3Rpb25IYW5kbGVyLnNlbGVjdEFkZGl0aW9uYWxPblBvaW50KHQpOnRoaXMuc2VsZWN0aW9uSGFuZGxlci5zZWxlY3RPblBvaW50KHQpO3ZhciBzPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5nZXRTZWxlY3Rpb24oKSxyPXRoaXMuX2RldGVybWluZURpZmZlcmVuY2UobyxzKSxhPXRoaXMuX2RldGVybWluZURpZmZlcmVuY2UocyxvKTtyLmVkZ2VzLmxlbmd0aD4wJiYodGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoXCJkZXNlbGVjdEVkZ2VcIixlLHQsbyksbj0hMCksci5ub2Rlcy5sZW5ndGg+MCYmKHRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2VuZXJhdGVDbGlja0V2ZW50KFwiZGVzZWxlY3ROb2RlXCIsZSx0LG8pLG49ITApLGEubm9kZXMubGVuZ3RoPjAmJih0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcInNlbGVjdE5vZGVcIixlLHQpLG49ITApLGEuZWRnZXMubGVuZ3RoPjAmJih0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcInNlbGVjdEVkZ2VcIixlLHQpLG49ITApLCEwPT09biYmdGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoXCJzZWxlY3RcIixlLHQpfX0se2tleTpcIl9kZXRlcm1pbmVEaWZmZXJlbmNlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1bXSxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBuPXRbb107LTE9PT1lLmluZGV4T2YobikmJmkucHVzaChuKX1yZXR1cm4gaX07cmV0dXJue25vZGVzOmk
21167odC5ub2RlcyxlLm5vZGVzKSxlZGdlczppKHQuZWRnZXMsZS5lZGdlcyl9fX0se2tleTpcIm9uRHJhZ1N0YXJ0XCIsdmFsdWU6ZnVuY3Rpb24odCl7dm9pZCAwPT09dGhpcy5kcmFnLnBvaW50ZXImJnRoaXMub25Ub3VjaCh0KTt2YXIgZT10aGlzLnNlbGVjdGlvbkhhbmRsZXIuZ2V0Tm9kZUF0KHRoaXMuZHJhZy5wb2ludGVyKTtpZih0aGlzLmRyYWcuZHJhZ2dpbmc9ITAsdGhpcy5kcmFnLnNlbGVjdGlvbj1bXSx0aGlzLmRyYWcudHJhbnNsYXRpb249aC5leHRlbmQoe30sdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24pLHRoaXMuZHJhZy5ub2RlSWQ9dm9pZCAwLHZvaWQgMCE9PWUmJiEwPT09dGhpcy5vcHRpb25zLmRyYWdOb2Rlcyl7dGhpcy5kcmFnLm5vZGVJZD1lLmlkLCExPT09ZS5pc1NlbGVjdGVkKCkmJih0aGlzLnNlbGVjdGlvbkhhbmRsZXIudW5zZWxlY3RBbGwoKSx0aGlzLnNlbGVjdGlvbkhhbmRsZXIuc2VsZWN0T2JqZWN0KGUpKSx0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcImRyYWdTdGFydFwiLHQsdGhpcy5kcmFnLnBvaW50ZXIpO3ZhciBpPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5zZWxlY3Rpb25PYmoubm9kZXM7Zm9yKHZhciBvIGluIGkpaWYoaS5oYXNPd25Qcm9wZXJ0eShvKSl7dmFyIG49aVtvXSxzPXtpZDpuLmlkLG5vZGU6bix4Om4ueCx5Om4ueSx4Rml4ZWQ6bi5vcHRpb25zLmZpeGVkLngseUZpeGVkOm4ub3B0aW9ucy5maXhlZC55fTtuLm9wdGlvbnMuZml4ZWQueD0hMCxuLm9wdGlvbnMuZml4ZWQueT0hMCx0aGlzLmRyYWcuc2VsZWN0aW9uLnB1c2gocyl9fWVsc2UgdGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoXCJkcmFnU3RhcnRcIix0LHRoaXMuZHJhZy5wb2ludGVyLHZvaWQgMCwhMCl9fSx7a2V5Olwib25EcmFnXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZighMCE9PXRoaXMuZHJhZy5waW5jaGVkKXt0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwidW5sb2NrTm9kZVwiKTt2YXIgaT10aGlzLmdldFBvaW50ZXIodC5jZW50ZXIpLG89dGhpcy5kcmFnLnNlbGVjdGlvbjtpZihvJiZvLmxlbmd0aCYmITA9PT10aGlzLm9wdGlvbnMuZHJhZ05vZGVzKXt0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcImRyYWdnaW5nXCIsdCxpKTt2YXIgbj1pLngtdGhpcy5kcmFnLnBvaW50ZXIueCxzPWkueS10aGlzLmRyYWcucG9pbnRlci55O28uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgaT10Lm5vZGU7ITE9PT10LnhGaXhlZCYmKGkueD1lLmNhbnZhcy5fWGNvbnZlcnRET010b0NhbnZhcyhlLmNhbnZhcy5fWGNvbnZlcnRDYW52YXNUb0RPTSh0LngpK24pKSwhMT09PXQueUZpeGVkJiYoaS55PWUuY2FudmFzLl9ZY29udmVydERPTXRvQ2FudmFzKGUuY2FudmFzLl9ZY29udmVydENhbnZhc1RvRE9NKHQueSkrcykpfSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInN0YXJ0U2ltdWxhdGlvblwiKX1lbHNlIGlmKCEwPT09dGhpcy5vcHRpb25zLmRyYWdWaWV3KXtpZih0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcImRyYWdnaW5nXCIsdCxpLHZvaWQgMCwhMCksdm9pZCAwPT09dGhpcy5kcmFnLnBvaW50ZXIpcmV0dXJuIHZvaWQgdGhpcy5vbkRyYWdTdGFydCh0KTt2YXIgcj1pLngtdGhpcy5kcmFnLnBvaW50ZXIueCxhPWkueS10aGlzLmRyYWcucG9pbnRlci55O3RoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uPXt4OnRoaXMuZHJhZy50cmFuc2xhdGlvbi54K3IseTp0aGlzLmRyYWcudHJhbnNsYXRpb24ueSthfSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3JlcXVlc3RSZWRyYXdcIil9fX19LHtrZXk6XCJvbkRyYWdFbmRcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmRyYWcuZHJhZ2dpbmc9ITE7dmFyIGU9dGhpcy5kcmFnLnNlbGVjdGlvbjtlJiZlLmxlbmd0aD8oZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Qubm9kZS5vcHRpb25zLmZpeGVkLng9dC54Rml4ZWQsdC5ub2RlLm9wdGlvbnMuZml4ZWQueT10LnlGaXhlZH0pLHRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2VuZXJhdGVDbGlja0V2ZW50KFwiZHJhZ0VuZFwiLHQsdGhpcy5nZXRQb2ludGVyKHQuY2VudGVyKSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInN0YXJ0U2ltdWxhdGlvblwiKSk6KHRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2VuZXJhdGVDbGlja0V2ZW50KFwiZHJhZ0VuZFwiLHQsdGhpcy5nZXRQb2ludGVyKHQuY2VudGVyKSx2b2lkIDAsITApLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVxdWVzdFJlZHJhd1wiKSl9fSx7a2V5Olwib25QaW5jaFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UG9pbnRlcih0LmNlbnRlcik7dGhpcy5kcmFnLnBpbmNoZWQ9ITAsdm9pZCAwPT09dGhpcy5waW5jaC5zY2FsZSYmKHRoaXMucGluY2guc2NhbGU9MSk7dmFyIGk9dGhpcy5waW5jaC5zY2FsZSp0LnNjYWxlO3RoaXMuem9vbShpLGUpfX0se2tleTpcInpvb21cIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKCEwPT09dGhpcy5vcHRpb25zLnpvb21WaWV3KXt2YXIgaT10aGlzLmJvZHkudmlldy5zY2FsZTt0PDFlLTUmJih0PTFlLTUpLHQ+MTAmJih0PTEwKTt2YXIgbz12b2lkIDA7dm9pZCAwIT09dGhpcy5kcmFnJiYhMD09PXRoaXMuZHJhZy5kcmFnZ2luZyYmKG89dGhpcy5jYW52YXMuRE9NdG9DYW52YXModGhpcy5kcmFnLnBvaW50ZXIpKTt2YXIgbj10aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbixzPXQvaSxyPSgxLXMpKmUueCtuLngqcyxhPSgxLXMpKmUueStuLnkqcztpZih0aGlzLmJvZHkudmlldy5zY2FsZT10LHRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uPXt4OnIseTphfSx2b2lkIDAhPW8pe3ZhciBoPXRoaXMuY2FudmFzLmNhbnZhc1RvRE9NKG8pO3RoaXMuZHJhZy5wb2ludGVyLng9aC54LHRoaXMuZHJhZy5wb2ludGVyLnk9aC55fXRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVxdWVzdFJlZHJhd1wiKSxpPHQ/dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInpvb21cIix7ZGlyZWN0aW9uOlwiK1wiLHNjYWxlOnRoaXMuYm9keS52aWV3LnNjYWxlLHBvaW50ZXI6ZX0pOnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJ6b29tXCIse2RpcmVjdGlvbjpcIi1cIixzY2FsZTp0aGlzLmJvZHkudmlldy5zY2FsZSxwb2ludGVyOmV9KX19fSx7a2V5Olwib25Nb3VzZVdoZWVsXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoITA9PT10aGlzLm9wdGlvbnMuem9vbVZpZXcpe3ZhciBlPTA7aWYodC53aGVlbERlbHRhP2U9dC53aGVlbERlbHRhLzEyMDp0LmRldGFpbCYmKGU9LXQuZGV0YWlsLzMpLDAhPT1lKXt2YXIgaT10aGlzLmJvZHkudmlldy5zY2FsZSxvPWUvMTA7ZTwwJiYoby89MS1vKSxpKj0xK287dmFyIG49dGhpcy5nZXRQb2ludGVyKHt4OnQuY2xpZW50WCx5OnQuY2xpZW50WX0
21167pO3RoaXMuem9vbShpLG4pfXQucHJldmVudERlZmF1bHQoKX19fSx7a2V5Olwib25Nb3VzZU1vdmVcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLGk9dGhpcy5nZXRQb2ludGVyKHt4OnQuY2xpZW50WCx5OnQuY2xpZW50WX0pLG89ITE7dm9pZCAwIT09dGhpcy5wb3B1cCYmKCExPT09dGhpcy5wb3B1cC5oaWRkZW4mJnRoaXMuX2NoZWNrSGlkZVBvcHVwKGkpLCExPT09dGhpcy5wb3B1cC5oaWRkZW4mJihvPSEwLHRoaXMucG9wdXAuc2V0UG9zaXRpb24oaS54KzMsaS55LTUpLHRoaXMucG9wdXAuc2hvdygpKSksITE9PT10aGlzLm9wdGlvbnMua2V5Ym9hcmQuYmluZFRvV2luZG93JiYhMD09PXRoaXMub3B0aW9ucy5rZXlib2FyZC5lbmFibGVkJiZ0aGlzLmNhbnZhcy5mcmFtZS5mb2N1cygpLCExPT09byYmKHZvaWQgMCE9PXRoaXMucG9wdXBUaW1lciYmKGNsZWFySW50ZXJ2YWwodGhpcy5wb3B1cFRpbWVyKSx0aGlzLnBvcHVwVGltZXI9dm9pZCAwKSx0aGlzLmRyYWcuZHJhZ2dpbmd8fCh0aGlzLnBvcHVwVGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBlLl9jaGVja1Nob3dQb3B1cChpKX0sdGhpcy5vcHRpb25zLnRvb2x0aXBEZWxheSkpKSwhMD09PXRoaXMub3B0aW9ucy5ob3ZlciYmdGhpcy5zZWxlY3Rpb25IYW5kbGVyLmhvdmVyT2JqZWN0KHQsaSl9fSx7a2V5OlwiX2NoZWNrU2hvd1BvcHVwXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jYW52YXMuX1hjb252ZXJ0RE9NdG9DYW52YXModC54KSxpPXRoaXMuY2FudmFzLl9ZY29udmVydERPTXRvQ2FudmFzKHQueSksbz17bGVmdDplLHRvcDppLHJpZ2h0OmUsYm90dG9tOml9LG49dm9pZCAwPT09dGhpcy5wb3B1cE9iaj92b2lkIDA6dGhpcy5wb3B1cE9iai5pZCxzPSExLHI9XCJub2RlXCI7aWYodm9pZCAwPT09dGhpcy5wb3B1cE9iail7Zm9yKHZhciBhPXRoaXMuYm9keS5ub2RlSW5kaWNlcyxoPXRoaXMuYm9keS5ub2RlcyxkPXZvaWQgMCx1PVtdLGM9MDtjPGEubGVuZ3RoO2MrKylkPWhbYVtjXV0sITA9PT1kLmlzT3ZlcmxhcHBpbmdXaXRoKG8pJiZ2b2lkIDAhPT1kLmdldFRpdGxlKCkmJnUucHVzaChhW2NdKTt1Lmxlbmd0aD4wJiYodGhpcy5wb3B1cE9iaj1oW3VbdS5sZW5ndGgtMV1dLHM9ITApfWlmKHZvaWQgMD09PXRoaXMucG9wdXBPYmomJiExPT09cyl7Zm9yKHZhciBwPXRoaXMuYm9keS5lZGdlSW5kaWNlcyxmPXRoaXMuYm9keS5lZGdlcyxtPXZvaWQgMCx2PVtdLGc9MDtnPHAubGVuZ3RoO2crKyltPWZbcFtnXV0sITA9PT1tLmlzT3ZlcmxhcHBpbmdXaXRoKG8pJiYhMD09PW0uY29ubmVjdGVkJiZ2b2lkIDAhPT1tLmdldFRpdGxlKCkmJnYucHVzaChwW2ddKTt2Lmxlbmd0aD4wJiYodGhpcy5wb3B1cE9iaj1mW3Zbdi5sZW5ndGgtMV1dLHI9XCJlZGdlXCIpfXZvaWQgMCE9PXRoaXMucG9wdXBPYmo/dGhpcy5wb3B1cE9iai5pZCE9PW4mJih2b2lkIDA9PT10aGlzLnBvcHVwJiYodGhpcy5wb3B1cD1uZXcgbCh0aGlzLmNhbnZhcy5mcmFtZSkpLHRoaXMucG9wdXAucG9wdXBUYXJnZXRUeXBlPXIsdGhpcy5wb3B1cC5wb3B1cFRhcmdldElkPXRoaXMucG9wdXBPYmouaWQsdGhpcy5wb3B1cC5zZXRQb3NpdGlvbih0LngrMyx0LnktNSksdGhpcy5wb3B1cC5zZXRUZXh0KHRoaXMucG9wdXBPYmouZ2V0VGl0bGUoKSksdGhpcy5wb3B1cC5zaG93KCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInNob3dQb3B1cFwiLHRoaXMucG9wdXBPYmouaWQpKTp2b2lkIDAhPT10aGlzLnBvcHVwJiYodGhpcy5wb3B1cC5oaWRlKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcImhpZGVQb3B1cFwiKSl9fSx7a2V5OlwiX2NoZWNrSGlkZVBvcHVwXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9wb2ludGVyVG9Qb3NpdGlvbk9iamVjdCh0KSxpPSExO2lmKFwibm9kZVwiPT09dGhpcy5wb3B1cC5wb3B1cFRhcmdldFR5cGUpe2lmKHZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0aGlzLnBvcHVwLnBvcHVwVGFyZ2V0SWRdJiYhMD09PShpPXRoaXMuYm9keS5ub2Rlc1t0aGlzLnBvcHVwLnBvcHVwVGFyZ2V0SWRdLmlzT3ZlcmxhcHBpbmdXaXRoKGUpKSl7dmFyIG89dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldE5vZGVBdCh0KTtpPXZvaWQgMCE9PW8mJm8uaWQ9PT10aGlzLnBvcHVwLnBvcHVwVGFyZ2V0SWR9fWVsc2Ugdm9pZCAwPT09dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldE5vZGVBdCh0KSYmdm9pZCAwIT09dGhpcy5ib2R5LmVkZ2VzW3RoaXMucG9wdXAucG9wdXBUYXJnZXRJZF0mJihpPXRoaXMuYm9keS5lZGdlc1t0aGlzLnBvcHVwLnBvcHVwVGFyZ2V0SWRdLmlzT3ZlcmxhcHBpbmdXaXRoKGUpKTshMT09PWkmJih0aGlzLnBvcHVwT2JqPXZvaWQgMCx0aGlzLnBvcHVwLmhpZGUoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiaGlkZVBvcHVwXCIpKX19XSksdH0oKTtlLmRlZmF1bHQ9dX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMCkscz1vKG4pLHI9aSgxKSxhPW8ociksaD1pKDEwKSxkPWkoMzcpLGw9aSgzNSksdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpKXt2YXIgbz10aGlzOygwLHMuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLmNhbnZhcz1pLHRoaXMuaWNvbnNDcmVhdGVkPSExLHRoaXMubmF2aWdhdGlvbkhhbW1lcnM9W10sdGhpcy5ib3VuZEZ1bmN0aW9ucz17fSx0aGlzLnRvdWNoVGltZT0wLHRoaXMuYWN0aXZhdGVkPSExLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiYWN0aXZhdGVcIixmdW5jdGlvbigpe28uYWN0aXZhdGVkPSEwLG8uY29uZmlndXJlS2V5Ym9hcmRCaW5kaW5ncygpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJkZWFjdGl2YXRlXCIsZnVuY3Rpb24oKXtvLmFjdGl2YXRlZD0hMSxvLmNvbmZpZ3VyZUtleWJvYXJkQmluZGluZ3MoKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiZGVzdHJveVwiLGZ1bmN0aW9uKCl7dm9pZCAwIT09by5rZXljaGFybSYmby5rZXljaGFybS5kZXN0cm95KCl9KSx0aGlzLm9wdGlvbnM9e319cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXQmJih0aGlzLm9wdGlvbnM9dCx0aGlzLmNyZWF0ZSgpKX19LHtrZXk6XCJjcmVhdGVcIix2YWx1ZTpmdW5jdGlvbigpeyEwPT09dGhpcy5vcHRpb25zLm5hdmlnYXRpb25CdXR0b25zPyExPT09dGhpcy5pY29uc0NyZWF0ZWQmJnRoaXMubG9hZE5hdmlnYXRpb25FbGVtZW50cygpOiEwPT09dGhpcy5pY29uc0NyZWF0ZWQmJnRoaXMuY2xlYW5OYXZpZ2F0aW9uKCksdGhpcy5jb25maWd1cmVLZXlib2FyZEJpbmRpbmdzKCl9fSx7a2V5OlwiY2xlYW5OYXZpZ2F0aW9uXCIsdmFsdWU6ZnVuY3Rpb24oKXtpZigwIT10aGlzLm5hdmlnYXRpb25IYW1tZXJzLmxlbmd0aCl7Zm9yKHZhciB0PTA7dDx0aGlzLm5hdmlnYXRpb25IYW1tZXJzLmxlbmd0aDt0KyspdGhpcy5uYXZpZ2F0aW9uSGFtbWVyc1t0XS5kZXN0cm95KCk7dGhpcy5uYXZpZ2F0aW9uSGFtbWVycz1bXX10aGlzLm5hdmlnYXRpb25ET00mJnRoaXMubmF2aWdhdGlvbkRPTS53cmFwcGVyJiZ0aGlzLm5hdmlnYXRpb25ET00ud3JhcHBlci5wYXJlbnROb2RlJiZ0aGlzLm5hdmlnYXRpb25ET00ud3JhcHBlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubmF2aWdhdGlvbkRPTS53cmFwcGVyKSx0aGlzLmljb25zQ3JlYXRlZD0hMX19LHtrZXk6XCJsb2FkTmF2aWdhdGlvbkVsZW1lbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuY2xlYW5OYXZpZ2F0aW9uKCksdGhpcy5uYXZpZ2F0aW9uRE9NP
21167Xt9O3ZhciBlPVtcInVwXCIsXCJkb3duXCIsXCJsZWZ0XCIsXCJyaWdodFwiLFwiem9vbUluXCIsXCJ6b29tT3V0XCIsXCJ6b29tRXh0ZW5kc1wiXSxpPVtcIl9tb3ZlVXBcIixcIl9tb3ZlRG93blwiLFwiX21vdmVMZWZ0XCIsXCJfbW92ZVJpZ2h0XCIsXCJfem9vbUluXCIsXCJfem9vbU91dFwiLFwiX2ZpdFwiXTt0aGlzLm5hdmlnYXRpb25ET00ud3JhcHBlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMubmF2aWdhdGlvbkRPTS53cmFwcGVyLmNsYXNzTmFtZT1cInZpcy1uYXZpZ2F0aW9uXCIsdGhpcy5jYW52YXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5uYXZpZ2F0aW9uRE9NLndyYXBwZXIpO2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7bysrKXt0aGlzLm5hdmlnYXRpb25ET01bZVtvXV09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLm5hdmlnYXRpb25ET01bZVtvXV0uY2xhc3NOYW1lPVwidmlzLWJ1dHRvbiB2aXMtXCIrZVtvXSx0aGlzLm5hdmlnYXRpb25ET00ud3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLm5hdmlnYXRpb25ET01bZVtvXV0pO3ZhciBuPW5ldyBoKHRoaXMubmF2aWdhdGlvbkRPTVtlW29dXSk7XCJfZml0XCI9PT1pW29dP2Qub25Ub3VjaChuLHRoaXMuX2ZpdC5iaW5kKHRoaXMpKTpkLm9uVG91Y2gobix0aGlzLmJpbmRUb1JlZHJhdy5iaW5kKHRoaXMsaVtvXSkpLHRoaXMubmF2aWdhdGlvbkhhbW1lcnMucHVzaChuKX12YXIgcz1uZXcgaCh0aGlzLmNhbnZhcy5mcmFtZSk7ZC5vblJlbGVhc2UocyxmdW5jdGlvbigpe3QuX3N0b3BNb3ZlbWVudCgpfSksdGhpcy5uYXZpZ2F0aW9uSGFtbWVycy5wdXNoKHMpLHRoaXMuaWNvbnNDcmVhdGVkPSEwfX0se2tleTpcImJpbmRUb1JlZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZvaWQgMD09PXRoaXMuYm91bmRGdW5jdGlvbnNbdF0mJih0aGlzLmJvdW5kRnVuY3Rpb25zW3RdPXRoaXNbdF0uYmluZCh0aGlzKSx0aGlzLmJvZHkuZW1pdHRlci5vbihcImluaXRSZWRyYXdcIix0aGlzLmJvdW5kRnVuY3Rpb25zW3RdKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3N0YXJ0UmVuZGVyaW5nXCIpKX19LHtrZXk6XCJ1bmJpbmRGcm9tUmVkcmF3XCIsdmFsdWU6ZnVuY3Rpb24odCl7dm9pZCAwIT09dGhpcy5ib3VuZEZ1bmN0aW9uc1t0XSYmKHRoaXMuYm9keS5lbWl0dGVyLm9mZihcImluaXRSZWRyYXdcIix0aGlzLmJvdW5kRnVuY3Rpb25zW3RdKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3N0b3BSZW5kZXJpbmdcIiksZGVsZXRlIHRoaXMuYm91bmRGdW5jdGlvbnNbdF0pfX0se2tleTpcIl9maXRcIix2YWx1ZTpmdW5jdGlvbigpeyhuZXcgRGF0ZSkudmFsdWVPZigpLXRoaXMudG91Y2hUaW1lPjcwMCYmKHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJmaXRcIix7ZHVyYXRpb246NzAwfSksdGhpcy50b3VjaFRpbWU9KG5ldyBEYXRlKS52YWx1ZU9mKCkpfX0se2tleTpcIl9zdG9wTW92ZW1lbnRcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLmJvdW5kRnVuY3Rpb25zKXRoaXMuYm91bmRGdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodCkmJih0aGlzLmJvZHkuZW1pdHRlci5vZmYoXCJpbml0UmVkcmF3XCIsdGhpcy5ib3VuZEZ1bmN0aW9uc1t0XSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9zdG9wUmVuZGVyaW5nXCIpKTt0aGlzLmJvdW5kRnVuY3Rpb25zPXt9fX0se2tleTpcIl9tb3ZlVXBcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLnkrPXRoaXMub3B0aW9ucy5rZXlib2FyZC5zcGVlZC55fX0se2tleTpcIl9tb3ZlRG93blwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24ueS09dGhpcy5vcHRpb25zLmtleWJvYXJkLnNwZWVkLnl9fSx7a2V5OlwiX21vdmVMZWZ0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54Kz10aGlzLm9wdGlvbnMua2V5Ym9hcmQuc3BlZWQueH19LHtrZXk6XCJfbW92ZVJpZ2h0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54LT10aGlzLm9wdGlvbnMua2V5Ym9hcmQuc3BlZWQueH19LHtrZXk6XCJfem9vbUluXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJvZHkudmlldy5zY2FsZSxlPXRoaXMuYm9keS52aWV3LnNjYWxlKigxK3RoaXMub3B0aW9ucy5rZXlib2FyZC5zcGVlZC56b29tKSxpPXRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLG89ZS90LG49KDEtbykqdGhpcy5jYW52YXMuY2FudmFzVmlld0NlbnRlci54K2kueCpvLHM9KDEtbykqdGhpcy5jYW52YXMuY2FudmFzVmlld0NlbnRlci55K2kueSpvO3RoaXMuYm9keS52aWV3LnNjYWxlPWUsdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249e3g6bix5OnN9LHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJ6b29tXCIse2RpcmVjdGlvbjpcIitcIixzY2FsZTp0aGlzLmJvZHkudmlldy5zY2FsZSxwb2ludGVyOm51bGx9KX19LHtrZXk6XCJfem9vbU91dFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ib2R5LnZpZXcuc2NhbGUsZT10aGlzLmJvZHkudmlldy5zY2FsZS8oMSt0aGlzLm9wdGlvbnMua2V5Ym9hcmQuc3BlZWQuem9vbSksaT10aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbixvPWUvdCxuPSgxLW8pKnRoaXMuY2FudmFzLmNhbnZhc1ZpZXdDZW50ZXIueCtpLngqbyxzPSgxLW8pKnRoaXMuY2FudmFzLmNhbnZhc1ZpZXdDZW50ZXIueStpLnkqbzt0aGlzLmJvZHkudmlldy5zY2FsZT1lLHRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uPXt4Om4seTpzfSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiem9vbVwiLHtkaXJlY3Rpb246XCItXCIsc2NhbGU6dGhpcy5ib2R5LnZpZXcuc2NhbGUscG9pbnRlcjpudWxsfSl9fSx7a2V5OlwiY29uZmlndXJlS2V5Ym9hcmRCaW5kaW5nc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt2b2lkIDAhPT10aGlzLmtleWNoYXJtJiZ0aGlzLmtleWNoYXJtLmRlc3Ryb3koKSwhMD09PXRoaXMub3B0aW9ucy5rZXlib2FyZC5lbmFibGVkJiYoITA9PT10aGlzLm9wdGlvbnMua2V5Ym9hcmQuYmluZFRvV2luZG93P3RoaXMua2V5Y2hhcm09bCh7Y29udGFpbmVyOndpbmRvdyxwcmV2ZW50RGVmYXVsdDohMH0pOnRoaXMua2V5Y2hhcm09bCh7Y29udGFpbmVyOnRoaXMuY2FudmFzLmZyYW1lLHByZXZlbn
21167REZWZhdWx0OiEwfSksdGhpcy5rZXljaGFybS5yZXNldCgpLCEwPT09dGhpcy5hY3RpdmF0ZWQmJih0aGlzLmtleWNoYXJtLmJpbmQoXCJ1cFwiLGZ1bmN0aW9uKCl7dC5iaW5kVG9SZWRyYXcoXCJfbW92ZVVwXCIpfSxcImtleWRvd25cIiksdGhpcy5rZXljaGFybS5iaW5kKFwiZG93blwiLGZ1bmN0aW9uKCl7dC5iaW5kVG9SZWRyYXcoXCJfbW92ZURvd25cIil9LFwia2V5ZG93blwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCJsZWZ0XCIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdyhcIl9tb3ZlTGVmdFwiKX0sXCJrZXlkb3duXCIpLHRoaXMua2V5Y2hhcm0uYmluZChcInJpZ2h0XCIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdyhcIl9tb3ZlUmlnaHRcIil9LFwia2V5ZG93blwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCI9XCIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdyhcIl96b29tSW5cIil9LFwia2V5ZG93blwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCJudW0rXCIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdyhcIl96b29tSW5cIil9LFwia2V5ZG93blwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCJudW0tXCIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdyhcIl96b29tT3V0XCIpfSxcImtleWRvd25cIiksdGhpcy5rZXljaGFybS5iaW5kKFwiLVwiLGZ1bmN0aW9uKCl7dC5iaW5kVG9SZWRyYXcoXCJfem9vbU91dFwiKX0sXCJrZXlkb3duXCIpLHRoaXMua2V5Y2hhcm0uYmluZChcIltcIixmdW5jdGlvbigpe3QuYmluZFRvUmVkcmF3KFwiX3pvb21PdXRcIil9LFwia2V5ZG93blwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCJdXCIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdyhcIl96b29tSW5cIil9LFwia2V5ZG93blwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCJwYWdldXBcIixmdW5jdGlvbigpe3QuYmluZFRvUmVkcmF3KFwiX3pvb21JblwiKX0sXCJrZXlkb3duXCIpLHRoaXMua2V5Y2hhcm0uYmluZChcInBhZ2Vkb3duXCIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdyhcIl96b29tT3V0XCIpfSxcImtleWRvd25cIiksdGhpcy5rZXljaGFybS5iaW5kKFwidXBcIixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdyhcIl9tb3ZlVXBcIil9LFwia2V5dXBcIiksdGhpcy5rZXljaGFybS5iaW5kKFwiZG93blwiLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KFwiX21vdmVEb3duXCIpfSxcImtleXVwXCIpLHRoaXMua2V5Y2hhcm0uYmluZChcImxlZnRcIixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdyhcIl9tb3ZlTGVmdFwiKX0sXCJrZXl1cFwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCJyaWdodFwiLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KFwiX21vdmVSaWdodFwiKX0sXCJrZXl1cFwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCI9XCIsZnVuY3Rpb24oKXt0LnVuYmluZEZyb21SZWRyYXcoXCJfem9vbUluXCIpfSxcImtleXVwXCIpLHRoaXMua2V5Y2hhcm0uYmluZChcIm51bStcIixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdyhcIl96b29tSW5cIil9LFwia2V5dXBcIiksdGhpcy5rZXljaGFybS5iaW5kKFwibnVtLVwiLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KFwiX3pvb21PdXRcIil9LFwia2V5dXBcIiksdGhpcy5rZXljaGFybS5iaW5kKFwiLVwiLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KFwiX3pvb21PdXRcIil9LFwia2V5dXBcIiksdGhpcy5rZXljaGFybS5iaW5kKFwiW1wiLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KFwiX3pvb21PdXRcIil9LFwia2V5dXBcIiksdGhpcy5rZXljaGFybS5iaW5kKFwiXVwiLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KFwiX3pvb21JblwiKX0sXCJrZXl1cFwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCJwYWdldXBcIixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdyhcIl96b29tSW5cIil9LFwia2V5dXBcIiksdGhpcy5rZXljaGFybS5iaW5kKFwicGFnZWRvd25cIixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdyhcIl96b29tT3V0XCIpfSxcImtleXVwXCIpKSl9fV0pLHR9KCk7ZS5kZWZhdWx0PXV9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDApLHM9byhuKSxyPWkoMSksYT1vKHIpLGg9aSg0NykuZGVmYXVsdCxkPWkoNzQpLmRlZmF1bHQsbD1pKDIpLHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSl7dmFyIG89dGhpczsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5jYW52YXM9aSx0aGlzLnNlbGVjdGlvbk9iaj17bm9kZXM6W10sZWRnZXM6W119LHRoaXMuaG92ZXJPYmo9e25vZGVzOnt9LGVkZ2VzOnt9fSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZhdWx0T3B0aW9ucz17bXVsdGlzZWxlY3Q6ITEsc2VsZWN0YWJsZTohMCxzZWxlY3RDb25uZWN0ZWRFZGdlczohMCxob3ZlckNvbm5lY3RlZEVkZ2VzOiEwfSxsLmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJfZGF0YUNoYW5nZWRcIixmdW5jdGlvbigpe28udXBkYXRlU2VsZWN0aW9uKCl9KX1yZXR1cm4oMCxhLmRlZmF1bHQpKHQsW3trZXk6XCJzZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dCl7dmFyIGU9W1wibXVsdGlzZWxlY3RcIixcImhvdmVyQ29ubmVjdGVkRWRnZXNcIixcInNlbGVjdGFibGVcIixcInNlbGVjdENvbm5lY3RlZEVkZ2VzXCJdO2wuc2VsZWN0aXZlRGVlcEV4dGVuZChlLHRoaXMub3B0aW9ucyx0KX19fSx7a2V5Olwic2VsZWN0T25Qb2ludFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSExO2lmKCEwPT09dGhpcy5vcHRpb25zLnNlbGVjdGFibGUpe3ZhciBpPXRoaXMuZ2V0Tm9kZUF0KHQpfHx0aGlzLmdldEVkZ2VBdCh0KTt0aGlzLnVuc2VsZWN0QWxsKCksdm9pZCAwIT09aSYmKGU9dGhpcy5zZWxlY3RPYmplY3QoaSkpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVxdWVzdFJlZHJhd1wiKX1yZXR1cm4gZX19LHtrZXk6XCJzZWxlY3RBZGRpdGlvbmFsT25Qb2ludFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSExO2lmKCEwPT09dGhpcy5vcHRpb25zLnNlbGVjdGFibGUpe3ZhciBpPXRoaXMuZ2V0Tm9kZUF0KHQpfHx0aGlzLmdldEVkZ2VBdCh0KTt2b2lkIDAhPT1pJiYoZT0hMCwhMD09PWkuaXNTZWxlY3RlZCgpP3RoaXMuZGVzZWxlY3RPYmplY3QoaSk6dGhpcy5zZWxlY3RPYmplY3QoaSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZXF1ZXN0UmVkcmF3XCIpKX1yZXR1cm4gZX19LHtrZXk6XCJfaW5pdEJhc2VFdmVudFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9e307cmV0dXJuIGkucG9pbnRlcj17RE9NOnt4OmUueCx5OmUueX0sY2FudmFzOnRoaXMuY2FudmFzLkRPTXRvQ2FudmFzKGUpfSxpLmV2ZW50PXQsaX19LHtrZXk6XCJfZ2VuZXJhdGVDbGlja0V2ZW50XCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0mJmFyZ3VtZW50c1s0XSxzPXRoaXMuX2luaXRCYXNlRXZlbnQoZSxpKTtpZighMD09PW4pcy5ub2Rlcz1bXSxzLmVkZ2VzPVtdO2Vsc2V7dmFyIHI9dGhpcy5nZXRTZWxlY3Rpb24oKTtzLm5vZGVzPXIubm9kZXMscy5lZGdlcz1yLmVkZ2VzfXZvaWQgMCE9PW8mJihzLnByZX
21167Zpb3VzU2VsZWN0aW9uPW8pLFwiY2xpY2tcIj09dCYmKHMuaXRlbXM9dGhpcy5nZXRDbGlja2VkSXRlbXMoaSkpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQodCxzKX19LHtrZXk6XCJzZWxlY3RPYmplY3RcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dGhpcy5vcHRpb25zLnNlbGVjdENvbm5lY3RlZEVkZ2VzO3JldHVybiB2b2lkIDAhPT10JiYodCBpbnN0YW5jZW9mIGgmJiEwPT09ZSYmdGhpcy5fc2VsZWN0Q29ubmVjdGVkRWRnZXModCksdC5zZWxlY3QoKSx0aGlzLl9hZGRUb1NlbGVjdGlvbih0KSwhMCl9fSx7a2V5OlwiZGVzZWxlY3RPYmplY3RcIix2YWx1ZTpmdW5jdGlvbih0KXshMD09PXQuaXNTZWxlY3RlZCgpJiYodC5zZWxlY3RlZD0hMSx0aGlzLl9yZW1vdmVGcm9tU2VsZWN0aW9uKHQpKX19LHtrZXk6XCJfZ2V0QWxsTm9kZXNPdmVybGFwcGluZ1dpdGhcIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT10aGlzLmJvZHkubm9kZXMsbz0wO288dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDtvKyspe3ZhciBuPXRoaXMuYm9keS5ub2RlSW5kaWNlc1tvXTtpW25dLmlzT3ZlcmxhcHBpbmdXaXRoKHQpJiZlLnB1c2gobil9cmV0dXJuIGV9fSx7a2V5OlwiX3BvaW50ZXJUb1Bvc2l0aW9uT2JqZWN0XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jYW52YXMuRE9NdG9DYW52YXModCk7cmV0dXJue2xlZnQ6ZS54LTEsdG9wOmUueSsxLHJpZ2h0OmUueCsxLGJvdHRvbTplLnktMX19fSx7a2V5OlwiZ2V0Tm9kZUF0XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXSxpPXRoaXMuX3BvaW50ZXJUb1Bvc2l0aW9uT2JqZWN0KHQpLG89dGhpcy5fZ2V0QWxsTm9kZXNPdmVybGFwcGluZ1dpdGgoaSk7cmV0dXJuIG8ubGVuZ3RoPjA/ITA9PT1lP3RoaXMuYm9keS5ub2Rlc1tvW28ubGVuZ3RoLTFdXTpvW28ubGVuZ3RoLTFdOnZvaWQgMH19LHtrZXk6XCJfZ2V0RWRnZXNPdmVybGFwcGluZ1dpdGhcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10aGlzLmJvZHkuZWRnZXMsbz0wO288dGhpcy5ib2R5LmVkZ2VJbmRpY2VzLmxlbmd0aDtvKyspe3ZhciBuPXRoaXMuYm9keS5lZGdlSW5kaWNlc1tvXTtpW25dLmlzT3ZlcmxhcHBpbmdXaXRoKHQpJiZlLnB1c2gobil9fX0se2tleTpcIl9nZXRBbGxFZGdlc092ZXJsYXBwaW5nV2l0aFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB0aGlzLl9nZXRFZGdlc092ZXJsYXBwaW5nV2l0aCh0LGUpLGV9fSx7a2V5OlwiZ2V0RWRnZUF0XCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV0saT10aGlzLmNhbnZhcy5ET010b0NhbnZhcyh0KSxvPTEwLG49bnVsbCxzPXRoaXMuYm9keS5lZGdlcyxyPTA7cjx0aGlzLmJvZHkuZWRnZUluZGljZXMubGVuZ3RoO3IrKyl7dmFyIGE9dGhpcy5ib2R5LmVkZ2VJbmRpY2VzW3JdLGg9c1thXTtpZihoLmNvbm5lY3RlZCl7dmFyIGQ9aC5mcm9tLngsbD1oLmZyb20ueSx1PWgudG8ueCxjPWgudG8ueSxwPWguZWRnZVR5cGUuZ2V0RGlzdGFuY2VUb0VkZ2UoZCxsLHUsYyxpLngsaS55KTtwPG8mJihuPWEsbz1wKX19cmV0dXJuIG51bGwhPT1uPyEwPT09ZT90aGlzLmJvZHkuZWRnZXNbbl06bjp2b2lkIDB9fSx7a2V5OlwiX2FkZFRvU2VsZWN0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIGg/dGhpcy5zZWxlY3Rpb25PYmoubm9kZXNbdC5pZF09dDp0aGlzLnNlbGVjdGlvbk9iai5lZGdlc1t0LmlkXT10fX0se2tleTpcIl9hZGRUb0hvdmVyXCIsdmFsdWU6ZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIGg/dGhpcy5ob3Zlck9iai5ub2Rlc1t0LmlkXT10OnRoaXMuaG92ZXJPYmouZWRnZXNbdC5pZF09dH19LHtrZXk6XCJfcmVtb3ZlRnJvbVNlbGVjdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBoPyhkZWxldGUgdGhpcy5zZWxlY3Rpb25PYmoubm9kZXNbdC5pZF0sdGhpcy5fdW5zZWxlY3RDb25uZWN0ZWRFZGdlcyh0KSk6ZGVsZXRlIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzW3QuaWRdfX0se2tleTpcInVuc2VsZWN0QWxsXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5zZWxlY3Rpb25PYmoubm9kZXMpdGhpcy5zZWxlY3Rpb25PYmoubm9kZXMuaGFzT3duUHJvcGVydHkodCkmJnRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzW3RdLnVuc2VsZWN0KCk7Zm9yKHZhciBlIGluIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzKXRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzLmhhc093blByb3BlcnR5KGUpJiZ0aGlzLnNlbGVjdGlvbk9iai5lZGdlc1tlXS51bnNlbGVjdCgpO3RoaXMuc2VsZWN0aW9uT2JqPXtub2Rlczp7fSxlZGdlczp7fX19fSx7a2V5OlwiX2dldFNlbGVjdGVkTm9kZUNvdW50XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0wO2Zvcih2YXIgZSBpbiB0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcyl0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShlKSYmKHQrPTEpO3JldHVybiB0fX0se2tleTpcIl9nZXRTZWxlY3RlZE5vZGVcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLnNlbGVjdGlvbk9iai5ub2RlcylpZih0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcy5oYXNPd25Qcm9wZXJ0eSh0KSlyZXR1cm4gdGhpcy5zZWxlY3Rpb25PYmoubm9kZXNbdF19fSx7a2V5OlwiX2dldFNlbGVjdGVkRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzKWlmKHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzLmhhc093blByb3BlcnR5KHQpKXJldHVybiB0aGlzLnNlbGVjdGlvbk9iai5lZGdlc1t0XX19LHtrZXk6XCJfZ2V0U2VsZWN0ZWRFZGdlQ291bnRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBlIGluIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzKXRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzLmhhc093blByb3BlcnR5KGUpJiYodCs9MSk7cmV0dXJuIHR9fSx7a2V5OlwiX2dldFNlbGVjdGVkT2JqZWN0Q291bnRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBlIGluIHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzKXRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzLmhhc093blByb3BlcnR5KGUpJiYodCs9MSk7Zm9yKHZhciBpIGluIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzKXRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzLmhhc093blByb3BlcnR5KGkpJiYodCs9MSk7cmV0dXJuIHR9fSx7a2V5OlwiX3NlbGVjdGlvbklzRW1wdHlcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLnNlbGVjdGlvbk9iai5ub2RlcylpZih0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcy5oYXNPd25Qcm9wZXJ0eSh0KSlyZXR1cm4hMTtmb3IodmFyIGUgaW4gdGhpcy5zZWxlY3Rpb25PYmouZWRnZXMpaWYodGhpcy5zZWxlY3Rpb25PYmouZWRnZXMuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuITE7cmV0dXJuITB9fSx7a2V5OlwiX2NsdXN0ZXJJblNlbGVjdGlvblwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzKWlmKHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzLmhhc093blByb3BlcnR5KHQpJiZ0aGlzLnNlbGVjdGlvbk9iai5ub2Rlc1t0XS5jbHVzdGVyU2l6ZT4xKXJldHVybiEwO3JldHVybiExfX0se2tleTpcIl9zZWxlY3RDb25uZWN0ZWRFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5lZGdlcy5sZW5ndGg7ZSsrKXt2YXIgaT10LmVkZ2VzW2VdO2kuc2VsZWN0KCksdGhpcy5fYWRkVG9TZWxlY3Rpb24oaSl9fX0se2tleTpcIl9ob3ZlckNvbm5lY3RlZEVkZ2VzXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0LmVkZ2VzLmxlbmd0aDtlKyspe3ZhciBpPXQuZWRnZXNbZV07aS5ob3Zlcj0hMCx0aGlzLl9hZGRUb0hvdmVyKGkpfX19LHtrZXk6XCJfdW5zZWxlY3RDb25uZWN0ZWRFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5lZGdlcy5sZW5ndGg7ZSsrKXt2YXIgaT10LmVkZ2VzW2VdO2kudW5zZWxlY3QoKSx0aGlzLl9yZW1vdmVGcm9tU2VsZWN0aW9uKGkpfX19LHtrZXk6XCJlbWl0Qmx1ckV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPXR
21167oaXMuX2luaXRCYXNlRXZlbnQodCxlKTshMD09PWkuaG92ZXImJihpLmhvdmVyPSExLGkgaW5zdGFuY2VvZiBoPyhvLm5vZGU9aS5pZCx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiYmx1ck5vZGVcIixvKSk6KG8uZWRnZT1pLmlkLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJibHVyRWRnZVwiLG8pKSl9fSx7a2V5OlwiZW1pdEhvdmVyRXZlbnRcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89dGhpcy5faW5pdEJhc2VFdmVudCh0LGUpLG49ITE7cmV0dXJuITE9PT1pLmhvdmVyJiYoaS5ob3Zlcj0hMCx0aGlzLl9hZGRUb0hvdmVyKGkpLG49ITAsaSBpbnN0YW5jZW9mIGg/KG8ubm9kZT1pLmlkLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJob3Zlck5vZGVcIixvKSk6KG8uZWRnZT1pLmlkLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJob3ZlckVkZ2VcIixvKSkpLG59fSx7a2V5OlwiaG92ZXJPYmplY3RcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2V0Tm9kZUF0KGUpO3ZvaWQgMD09PWkmJihpPXRoaXMuZ2V0RWRnZUF0KGUpKTt2YXIgbz0hMTtmb3IodmFyIG4gaW4gdGhpcy5ob3Zlck9iai5ub2Rlcyl0aGlzLmhvdmVyT2JqLm5vZGVzLmhhc093blByb3BlcnR5KG4pJiYodm9pZCAwPT09aXx8aSBpbnN0YW5jZW9mIGgmJmkuaWQhPW58fGkgaW5zdGFuY2VvZiBkKSYmKHRoaXMuZW1pdEJsdXJFdmVudCh0LGUsdGhpcy5ob3Zlck9iai5ub2Rlc1tuXSksZGVsZXRlIHRoaXMuaG92ZXJPYmoubm9kZXNbbl0sbz0hMCk7Zm9yKHZhciBzIGluIHRoaXMuaG92ZXJPYmouZWRnZXMpdGhpcy5ob3Zlck9iai5lZGdlcy5oYXNPd25Qcm9wZXJ0eShzKSYmKCEwPT09bz8odGhpcy5ob3Zlck9iai5lZGdlc1tzXS5ob3Zlcj0hMSxkZWxldGUgdGhpcy5ob3Zlck9iai5lZGdlc1tzXSk6KHZvaWQgMD09PWl8fGkgaW5zdGFuY2VvZiBkJiZpLmlkIT1zfHxpIGluc3RhbmNlb2YgaCYmIWkuaG92ZXIpJiYodGhpcy5lbWl0Qmx1ckV2ZW50KHQsZSx0aGlzLmhvdmVyT2JqLmVkZ2VzW3NdKSxkZWxldGUgdGhpcy5ob3Zlck9iai5lZGdlc1tzXSxvPSEwKSk7dm9pZCAwIT09aSYmKG89b3x8dGhpcy5lbWl0SG92ZXJFdmVudCh0LGUsaSksaSBpbnN0YW5jZW9mIGgmJiEwPT09dGhpcy5vcHRpb25zLmhvdmVyQ29ubmVjdGVkRWRnZXMmJnRoaXMuX2hvdmVyQ29ubmVjdGVkRWRnZXMoaSkpLCEwPT09byYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZXF1ZXN0UmVkcmF3XCIpfX0se2tleTpcImdldFNlbGVjdGlvblwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue25vZGVzOnRoaXMuZ2V0U2VsZWN0ZWROb2RlcygpLGVkZ2VzOnRoaXMuZ2V0U2VsZWN0ZWRFZGdlcygpfX19LHtrZXk6XCJnZXRTZWxlY3RlZE5vZGVzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1bXTtpZighMD09PXRoaXMub3B0aW9ucy5zZWxlY3RhYmxlKWZvcih2YXIgZSBpbiB0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcyl0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShlKSYmdC5wdXNoKHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzW2VdLmlkKTtyZXR1cm4gdH19LHtrZXk6XCJnZXRTZWxlY3RlZEVkZ2VzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1bXTtpZighMD09PXRoaXMub3B0aW9ucy5zZWxlY3RhYmxlKWZvcih2YXIgZSBpbiB0aGlzLnNlbGVjdGlvbk9iai5lZGdlcyl0aGlzLnNlbGVjdGlvbk9iai5lZGdlcy5oYXNPd25Qcm9wZXJ0eShlKSYmdC5wdXNoKHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzW2VdLmlkKTtyZXR1cm4gdH19LHtrZXk6XCJzZXRTZWxlY3Rpb25cIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30saT12b2lkIDAsbz12b2lkIDA7aWYoIXR8fCF0Lm5vZGVzJiYhdC5lZGdlcyl0aHJvd1wiU2VsZWN0aW9uIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggbm9kZXMgYW5kL29yIGVkZ2VzIHByb3BlcnRpZXNcIlxuICAgICAgICA7aWYoKGUudW5zZWxlY3RBbGx8fHZvaWQgMD09PWUudW5zZWxlY3RBbGwpJiZ0aGlzLnVuc2VsZWN0QWxsKCksdC5ub2Rlcylmb3IoaT0wO2k8dC5ub2Rlcy5sZW5ndGg7aSsrKXtvPXQubm9kZXNbaV07dmFyIG49dGhpcy5ib2R5Lm5vZGVzW29dO2lmKCFuKXRocm93IG5ldyBSYW5nZUVycm9yKCdOb2RlIHdpdGggaWQgXCInK28rJ1wiIG5vdCBmb3VuZCcpO3RoaXMuc2VsZWN0T2JqZWN0KG4sZS5oaWdobGlnaHRFZGdlcyl9aWYodC5lZGdlcylmb3IoaT0wO2k8dC5lZGdlcy5sZW5ndGg7aSsrKXtvPXQuZWRnZXNbaV07dmFyIHM9dGhpcy5ib2R5LmVkZ2VzW29dO2lmKCFzKXRocm93IG5ldyBSYW5nZUVycm9yKCdFZGdlIHdpdGggaWQgXCInK28rJ1wiIG5vdCBmb3VuZCcpO3RoaXMuc2VsZWN0T2JqZWN0KHMpfXRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVxdWVzdFJlZHJhd1wiKX19LHtrZXk6XCJzZWxlY3ROb2Rlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV07aWYoIXR8fHZvaWQgMD09PXQubGVuZ3RoKXRocm93XCJTZWxlY3Rpb24gbXVzdCBiZSBhbiBhcnJheSB3aXRoIGlkc1wiO3RoaXMuc2V0U2VsZWN0aW9uKHtub2Rlczp0fSx7aGlnaGxpZ2h0RWRnZXM6ZX0pfX0se2tleTpcInNlbGVjdEVkZ2VzXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHZvaWQgMD09PXQubGVuZ3RoKXRocm93XCJTZWxlY3Rpb24gbXVzdCBiZSBhbiBhcnJheSB3aXRoIGlkc1wiO3RoaXMuc2V0U2VsZWN0aW9uKHtlZGdlczp0fSl9fSx7a2V5OlwidXBkYXRlU2VsZWN0aW9uXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5zZWxlY3Rpb25PYmoubm9kZXMpdGhpcy5zZWxlY3Rpb25PYmoubm9kZXMuaGFzT3duUHJvcGVydHkodCkmJih0aGlzLmJvZHkubm9kZXMuaGFzT3duUHJvcGVydHkodCl8fGRlbGV0ZSB0aGlzLnNlbGVjdGlvbk9iai5ub2Rlc1t0XSk7Zm9yKHZhciBlIGluIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzKXRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzLmhhc093blByb3BlcnR5KGUpJiYodGhpcy5ib2R5LmVkZ2VzLmhhc093blByb3BlcnR5KGUpfHxkZWxldGUgdGhpcy5zZWxlY3Rpb25PYmouZWRnZXNbZV0pfX0se2tleTpcImdldENsaWNrZWRJdGVtc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmNhbnZhcy5ET010b0NhbnZhcyh0KSxpPVtdLG89dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLG49dGhpcy5ib2R5Lm5vZGVzLHM9by5sZW5ndGgtMTtzPj0wO3MtLSl7dmFyIHI9bltvW3NdXSxhPXIuZ2V0SXRlbXNPblBvaW50KGUpO2kucHVzaC5hcHBseShpLGEpfWZvcih2YXIgaD10aGlzLmJvZHkuZWRnZUluZGljZXMsZD10aGlzLmJvZHkuZWRnZXMsbD1oLmxlbmd0aC0xO2w+PTA7bC0tKXt2YXIgdT1kW2hbbF1dLGM9dS5nZXRJdGVtc09uUG9pbnQoZSk7aS5wdXNoLmFwcGx5KGksYyl9cmV0dXJuIGl9fV0pLHR9KCk7ZS5kZWZhdWx0PXV9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDMwKSxzPW8obikscj1pKDYpLGE9byhyKSxoPWkoOCksZD1vKGgpLGw9aSgwKSx1PW8obCksYz1pKDEpLHA9byhjKSxmPWkoMiksbT1pKDc2KS5kZWZhdWx0LHY9aSgyMzYpLGc9di5Ib3Jpem9udGFsU3RyYXRlZ3kseT12LlZlcnRpY2FsU3RyYXRlZ3ksYj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXsoMCx1LmRlZmF1bHQpKHRoaXMsdCksdGhpcy5jaGlsZHJlblJlZmVyZW5jZT17fSx0aGlzLnBhcmVudFJlZmVyZW5jZT17fSx0aGlzLnRyZWVzPXt9LHRoaXMuZGlzdHJpYnV0aW9uT3JkZXJpbmc9e30sdGhpcy5sZXZlbHM9e30sdGhpcy5kaXN0cmlidXRpb25JbmRleD17fSx0aGlzLmlzVHJlZT0hMSx0aGlzLnRyZWVJbmRleD0tMX1yZXR1cm4oMCxwLmRlZmF1bHQpKHQsW3trZXk6XCJhZGRSZWxhdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09dGhpcy5jaGlsZHJlblJlZmVyZW5jZVt0XSYmKHRoaXMuY2hpbGRyZW5SZWZlcmVuY2VbdF09W10pLHRoaXMuY2hpbGRyZW5SZWZlcmVuY2VbdF0ucHVzaChlKSx2b2lkIDA9PT10aGlzLnBhcmVudFJlZmVyZW5jZVtlXSYmKHRoaXMucGFyZW50UmVmZXJlbmNlW2VdPVtdKSx0aGlzLnBhcmVudFJlZmVyZW5jZVtlXS5wdXNoKHQpfX0se2tleTpcImNoZWNrSWZUcmVlXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5wYXJlbnRSZWZlcmVuY2UpaWYodGhpcy5wYXJlbnRSZWZlcmVuY2VbdF0ubGVuZ3RoPjEpcmV0dXJuIHZvaWQodGhpcy5pc1RyZWU9ITEpO3RoaXMuaXNUcmVlPSEwfX0se2tleTpcIm51bVRyZWVzXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmVlSW5kZXgrMX19LHtrZXk6XCJzZXRUcmVlSW5kZXhcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZvaWQgMCE9PWUmJnZvaWQgMD09PXRoaXMudHJlZXNbdC5pZF0mJih0aGlzLnRyZWVzW3QuaWRdPWUsdGhpcy50cmVlSW5kZXg9TWF0aC5tYXgoZSx0aGlzLnRyZWVJbmRleCkpfX0se2tleTpcImVuc3VyZUxldmVsXCIsdmFsdWU6ZnVuY3Rpb24odCl7dm9pZCAwPT09dGhpcy5sZXZlbHNbdF0mJih0aGlzLmxldmVsc1t0XT0wKX19LHtrZXk6XCJnZXRNYXhMZXZlbFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXR
21167oaXMsaT17fTtyZXR1cm4gZnVuY3Rpb24gdChvKXtpZih2b2lkIDAhPT1pW29dKXJldHVybiBpW29dO3ZhciBuPWUubGV2ZWxzW29dO2lmKGUuY2hpbGRyZW5SZWZlcmVuY2Vbb10pe3ZhciBzPWUuY2hpbGRyZW5SZWZlcmVuY2Vbb107aWYocy5sZW5ndGg+MClmb3IodmFyIHI9MDtyPHMubGVuZ3RoO3IrKyluPU1hdGgubWF4KG4sdChzW3JdKSl9cmV0dXJuIGlbb109bixufSh0KX19LHtrZXk6XCJsZXZlbERvd25zdHJlYW1cIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZvaWQgMD09PXRoaXMubGV2ZWxzW2UuaWRdJiYodm9pZCAwPT09dGhpcy5sZXZlbHNbdC5pZF0mJih0aGlzLmxldmVsc1t0LmlkXT0wKSx0aGlzLmxldmVsc1tlLmlkXT10aGlzLmxldmVsc1t0LmlkXSsxKX19LHtrZXk6XCJzZXRNaW5MZXZlbFRvWmVyb1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPTFlOTtmb3IodmFyIGkgaW4gdCl0Lmhhc093blByb3BlcnR5KGkpJiZ2b2lkIDAhPT10aGlzLmxldmVsc1tpXSYmKGU9TWF0aC5taW4odGhpcy5sZXZlbHNbaV0sZSkpO2Zvcih2YXIgbyBpbiB0KXQuaGFzT3duUHJvcGVydHkobykmJnZvaWQgMCE9PXRoaXMubGV2ZWxzW29dJiYodGhpcy5sZXZlbHNbb10tPWUpfX0se2tleTpcImdldFRyZWVTaXplXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT0xZTksbz0tMWU5LG49MWU5LHM9LTFlOTtmb3IodmFyIHIgaW4gdGhpcy50cmVlcylpZih0aGlzLnRyZWVzLmhhc093blByb3BlcnR5KHIpJiZ0aGlzLnRyZWVzW3JdPT09ZSl7dmFyIGE9dFtyXTtpPU1hdGgubWluKGEueCxpKSxvPU1hdGgubWF4KGEueCxvKSxuPU1hdGgubWluKGEueSxuKSxzPU1hdGgubWF4KGEueSxzKX1yZXR1cm57bWluX3g6aSxtYXhfeDpvLG1pbl95Om4sbWF4X3k6c319fSx7a2V5OlwiaGFzU2FtZVBhcmVudFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5wYXJlbnRSZWZlcmVuY2VbdC5pZF0sbz10aGlzLnBhcmVudFJlZmVyZW5jZVtlLmlkXTtpZih2b2lkIDA9PT1pfHx2b2lkIDA9PT1vKXJldHVybiExO2Zvcih2YXIgbj0wO248aS5sZW5ndGg7bisrKWZvcih2YXIgcz0wO3M8by5sZW5ndGg7cysrKWlmKGlbbl09PW9bc10pcmV0dXJuITA7cmV0dXJuITF9fSx7a2V5OlwiaW5TYW1lU3ViTmV0d29ya1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudHJlZXNbdC5pZF09PT10aGlzLnRyZWVzW2UuaWRdfX0se2tleTpcImdldExldmVsc1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKDAsZC5kZWZhdWx0KSh0aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nKX19LHtrZXk6XCJhZGRUb09yZGVyaW5nXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT10aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW2VdJiYodGhpcy5kaXN0cmlidXRpb25PcmRlcmluZ1tlXT1bXSk7dmFyIGk9ITEsbz10aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW2VdO2Zvcih2YXIgbiBpbiBvKWlmKG9bbl09PT10KXtpPSEwO2JyZWFrfWl8fCh0aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW2VdLnB1c2godCksdGhpcy5kaXN0cmlidXRpb25JbmRleFt0LmlkXT10aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW2VdLmxlbmd0aC0xKX19XSksdH0oKSxfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXsoMCx1LmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5pbml0aWFsUmFuZG9tU2VlZD1NYXRoLnJvdW5kKDFlNipNYXRoLnJhbmRvbSgpKSx0aGlzLnJhbmRvbVNlZWQ9dGhpcy5pbml0aWFsUmFuZG9tU2VlZCx0aGlzLnNldFBoeXNpY3M9ITEsdGhpcy5vcHRpb25zPXt9LHRoaXMub3B0aW9uc0JhY2t1cD17cGh5c2ljczp7fX0sdGhpcy5kZWZhdWx0T3B0aW9ucz17cmFuZG9tU2VlZDp2b2lkIDAsaW1wcm92ZWRMYXlvdXQ6ITAsaGllcmFyY2hpY2FsOntlbmFibGVkOiExLGxldmVsU2VwYXJhdGlvbjoxNTAsbm9kZVNwYWNpbmc6MTAwLHRyZWVTcGFjaW5nOjIwMCxibG9ja1NoaWZ0aW5nOiEwLGVkZ2VNaW5pbWl6YXRpb246ITAscGFyZW50Q2VudHJhbGl6YXRpb246ITAsZGlyZWN0aW9uOlwiVURcIixzb3J0TWV0aG9kOlwiaHVic2l6ZVwifX0sZi5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCl9cmV0dXJuKDAscC5kZWZhdWx0KSh0LFt7a2V5OlwiYmluZEV2ZW50TGlzdGVuZXJzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYm9keS5lbWl0dGVyLm9uKFwiX2RhdGFDaGFuZ2VkXCIsZnVuY3Rpb24oKXt0LnNldHVwSGllcmFyY2hpY2FsTGF5b3V0KCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIl9kYXRhTG9hZGVkXCIsZnVuY3Rpb24oKXt0LmxheW91dE5ldHdvcmsoKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiX3Jlc2V0SGllcmFyY2hpY2FsTGF5b3V0XCIsZnVuY3Rpb24oKXt0LnNldHVwSGllcmFyY2hpY2FsTGF5b3V0KCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIl9hZGp1c3RFZGdlc0ZvckhpZXJhcmNoaWNhbExheW91dFwiLGZ1bmN0aW9uKCl7aWYoITA9PT10Lm9wdGlvbnMuaGllcmFyY2hpY2FsLmVuYWJsZWQpe3ZhciBlPXQuZGlyZWN0aW9uLmN1cnZlVHlwZSgpO3QuYm9keS5lbWl0dGVyLmVtaXQoXCJfZm9yY2VEaXNhYmxlRHluYW1pY0N1cnZlc1wiLGUsITEpfX0pfX0se2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PXQpe3ZhciBpPXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwsbz1pLmVuYWJsZWQ7aWYoZi5zZWxlY3RpdmVEZWVwRXh0ZW5kKFtcInJhbmRvbVNlZWRcIixcImltcHJvdmVkTGF5b3V0XCJdLHRoaXMub3B0aW9ucyx0KSxmLm1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsdCxcImhpZXJhcmNoaWNhbFwiKSx2b2lkIDAhPT10LnJhbmRvbVNlZWQmJih0aGlzLmluaXRpYWxSYW5kb21TZWVkPXQucmFuZG9tU2VlZCksITA9PT1pLmVuYWJsZWQpcmV0dXJuITA9PT1vJiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwicmVmcmVzaFwiLCEwKSxcIlJMXCI9PT1pLmRpcmVjdGlvbnx8XCJEVVwiPT09aS5kaXJlY3Rpb24/aS5sZXZlbFNlcGFyYXRpb24+MCYmKGkubGV2ZWxTZXBhcmF0aW9uKj0tMSk6aS5sZXZlbFNlcGFyYXRpb248MCYmKGkubGV2ZWxTZXBhcmF0aW9uKj0tMSksdGhpcy5zZXREaXJlY3Rpb25TdHJhdGVneSgpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVzZXRIaWVyYXJjaGljYWxMYXlvdXRcIiksdGhpcy5hZGFwdEFsbE9wdGlvbnNGb3JIaWVyYXJjaGljYWxMYXlvdXQoZSk7aWYoITA9PT1vKXJldHVybi
21167B0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwicmVmcmVzaFwiKSxmLmRlZXBFeHRlbmQoZSx0aGlzLm9wdGlvbnNCYWNrdXApfXJldHVybiBlfX0se2tleTpcImFkYXB0QWxsT3B0aW9uc0ZvckhpZXJhcmNoaWNhbExheW91dFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCEwPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5lbmFibGVkKXt2YXIgZT10aGlzLm9wdGlvbnNCYWNrdXAucGh5c2ljczt2b2lkIDA9PT10LnBoeXNpY3N8fCEwPT09dC5waHlzaWNzPyh0LnBoeXNpY3M9e2VuYWJsZWQ6dm9pZCAwPT09ZS5lbmFibGVkfHxlLmVuYWJsZWQsc29sdmVyOlwiaGllcmFyY2hpY2FsUmVwdWxzaW9uXCJ9LGUuZW5hYmxlZD12b2lkIDA9PT1lLmVuYWJsZWR8fGUuZW5hYmxlZCxlLnNvbHZlcj1lLnNvbHZlcnx8XCJiYXJuZXNIdXRcIik6XCJvYmplY3RcIj09PSgwLGEuZGVmYXVsdCkodC5waHlzaWNzKT8oZS5lbmFibGVkPXZvaWQgMD09PXQucGh5c2ljcy5lbmFibGVkfHx0LnBoeXNpY3MuZW5hYmxlZCxlLnNvbHZlcj10LnBoeXNpY3Muc29sdmVyfHxcImJhcm5lc0h1dFwiLHQucGh5c2ljcy5zb2x2ZXI9XCJoaWVyYXJjaGljYWxSZXB1bHNpb25cIik6ITEhPT10LnBoeXNpY3MmJihlLnNvbHZlcj1cImJhcm5lc0h1dFwiLHQucGh5c2ljcz17c29sdmVyOlwiaGllcmFyY2hpY2FsUmVwdWxzaW9uXCJ9KTt2YXIgaT10aGlzLmRpcmVjdGlvbi5jdXJ2ZVR5cGUoKTtpZih2b2lkIDA9PT10LmVkZ2VzKXRoaXMub3B0aW9uc0JhY2t1cC5lZGdlcz17c21vb3RoOntlbmFibGVkOiEwLHR5cGU6XCJkeW5hbWljXCJ9fSx0LmVkZ2VzPXtzbW9vdGg6ITF9O2Vsc2UgaWYodm9pZCAwPT09dC5lZGdlcy5zbW9vdGgpdGhpcy5vcHRpb25zQmFja3VwLmVkZ2VzPXtzbW9vdGg6e2VuYWJsZWQ6ITAsdHlwZTpcImR5bmFtaWNcIn19LHQuZWRnZXMuc21vb3RoPSExO2Vsc2UgaWYoXCJib29sZWFuXCI9PXR5cGVvZiB0LmVkZ2VzLnNtb290aCl0aGlzLm9wdGlvbnNCYWNrdXAuZWRnZXM9e3Ntb290aDp0LmVkZ2VzLnNtb290aH0sdC5lZGdlcy5zbW9vdGg9e2VuYWJsZWQ6dC5lZGdlcy5zbW9vdGgsdHlwZTppfTtlbHNle3ZhciBvPXQuZWRnZXMuc21vb3RoO3ZvaWQgMCE9PW8udHlwZSYmXCJkeW5hbWljXCIhPT1vLnR5cGUmJihpPW8udHlwZSksdGhpcy5vcHRpb25zQmFja3VwLmVkZ2VzPXtzbW9vdGg6dm9pZCAwPT09by5lbmFibGVkfHxvLmVuYWJsZWQsdHlwZTp2b2lkIDA9PT1vLnR5cGU/XCJkeW5hbWljXCI6by50eXBlLHJvdW5kbmVzczp2b2lkIDA9PT1vLnJvdW5kbmVzcz8uNTpvLnJvdW5kbmVzcyxmb3JjZURpcmVjdGlvbjp2b2lkIDAhPT1vLmZvcmNlRGlyZWN0aW9uJiZvLmZvcmNlRGlyZWN0aW9ufSx0LmVkZ2VzLnNtb290aD17ZW5hYmxlZDp2b2lkIDA9PT1vLmVuYWJsZWR8fG8uZW5hYmxlZCx0eXBlOmkscm91bmRuZXNzOnZvaWQgMD09PW8ucm91bmRuZXNzPy41Om8ucm91bmRuZXNzLGZvcmNlRGlyZWN0aW9uOnZvaWQgMCE9PW8uZm9yY2VEaXJlY3Rpb24mJm8uZm9yY2VEaXJlY3Rpb259fXRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZm9yY2VEaXNhYmxlRHluYW1pY0N1cnZlc1wiLGkpfXJldHVybiB0fX0se2tleTpcInNlZWRlZFJhbmRvbVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9MWU0Kk1hdGguc2luKHRoaXMucmFuZG9tU2VlZCsrKTtyZXR1cm4gdC1NYXRoLmZsb29yKHQpfX0se2tleTpcInBvc2l0aW9uSW5pdGlhbGx5XCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoITAhPT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmVuYWJsZWQpe3RoaXMucmFuZG9tU2VlZD10aGlzLmluaXRpYWxSYW5kb21TZWVkO2Zvcih2YXIgZT10Lmxlbmd0aCs1MCxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBvPXRbaV0sbj0yKk1hdGguUEkqdGhpcy5zZWVkZWRSYW5kb20oKTt2b2lkIDA9PT1vLngmJihvLng9ZSpNYXRoLmNvcyhuKSksdm9pZCAwPT09by55JiYoby55PWUqTWF0aC5zaW4obikpfX19fSx7a2V5OlwibGF5b3V0TmV0d29ya1wiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoITAhPT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmVuYWJsZWQmJiEwPT09dGhpcy5vcHRpb25zLmltcHJvdmVkTGF5b3V0KXtmb3IodmFyIHQ9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLGU9MCxpPTA7aTx0Lmxlbmd0aDtpKyspeyEwPT09dGhpcy5ib2R5Lm5vZGVzW3RbaV1dLnByZWRlZmluZWRQb3NpdGlvbiYmKGUrPTEpfWlmKGU8LjUqdC5sZW5ndGgpe3ZhciBvPTAsbj17Y2x1c3Rlck5vZGVQcm9wZXJ0aWVzOntzaGFwZTpcImVsbGlwc2VcIixsYWJlbDpcIlwiLGdyb3VwOlwiXCIsZm9udDp7bXVsdGk6ITF9fSxjbHVzdGVyRWRnZVByb3BlcnRpZXM6e2xhYmVsOlwiXCIsZm9udDp7bXVsdGk6ITF9LHNtb290aDp7ZW5hYmxlZDohMX19fTtpZih0Lmxlbmd0aD4xNTApe2Zvcih2YXIgcz10Lmxlbmd0aDt0Lmxlbmd0aD4xNTAmJm88PTEwOyl7bys9MTt2YXIgcj10Lmxlbmd0aDtvJTM9PTA/dGhpcy5ib2R5Lm1vZHVsZXMuY2x1c3RlcmluZy5jbHVzdGVyQnJpZGdlcyhuKTp0aGlzLmJvZHkubW9kdWxlcy5jbHVzdGVyaW5nLmNsdXN0ZXJPdXRsaWVycyhuKTtpZihyPT10Lmxlbmd0aCYmbyUzIT0wKXJldHVybiB0aGlzLl9kZWNsdXN0ZXJBbGwoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2xheW91dEZhaWxlZFwiKSx2b2lkIGNvbnNvbGUuaW5mbyhcIlRoaXMgbmV0d29yayBjb3VsZCBub3QgYmUgcG9zaXRpb25lZCBieSB0aGlzIHZlcnNpb24gb2YgdGhlIGltcHJvdmVkIGxheW91dCBhbGdvcml0aG0uIFBsZWFzZSBkaXNhYmxlIGltcHJvdmVkTGF5b3V0IGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuXCIpfXRoaXMuYm9keS5tb2R1bGVzLmthbWFkYUthd2FpLnNldE9wdGlvbnMoe3NwcmluZ0xlbmd0aDpNYXRoLm1heCgxNTAsMipzKX0pfW8+MTAmJmNvbnNvbGUuaW5mbyhcIlRoZSBjbHVzdGVyaW5nIGRpZG4ndCBzdWNjZWVkIHdpdGhpbiB0aGUgYW1vdW50IG9mIGludGVyYXRpb25zIGFsbG93ZWQsIHByb2dyZXNzaW5nIHdpdGggcGFydGlhbCByZXN1bHQuXCIpLHRoaXMuYm9keS5tb2R1bGVzLmthbWFkYUthd2FpLnNvbHZlKHQsdGhpcy5ib2R5LmVkZ2VJbmRpY2VzLCEwKSx0aGlzLl9zaGlmdFRvQ2VudGVyKCk7Zm9yKHZhciBhPTA7YTx0Lmxlbmd0aDthKyspe3ZhciBoPXRoaXMuYm9keS5ub2Rlc1t0W2FdXTshMT09PWgucHJlZGVmaW5lZFBvc2l0aW9uJiYoaC54Kz03MCooLjUtdGhpcy5zZWVkZWRSYW5kb20oKSksaC55Kz03MCooLjUtdGhpcy5zZWVkZWRSYW5kb20oKSkpfXRoaXMuX2RlY2x1c3RlckFsbCgpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVwb3NpdGlvbkJlemllck5vZGVzXCIpfX19fSx7a2V5OlwiX3NoaWZ0VG9DZW50ZXJcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1tLmdldFJhbmdlQ29yZSh0aGlzLmJvZHkubm9kZXMsdGhpcy5ib2R5Lm5vZGVJbmRpY2VzKSxlPW0uZmluZENlbnRlcih0KSxpPTA7aTx0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoO2krKyl7dmFyIG89dGhpcy5ib2R5Lm5vZGVzW3RoaXMuYm9keS5ub2RlSW5kaWNlc1tpXV07by54LT1lLngsby55LT1lLnl9fX0se2tleTpcIl9kZWNsdXN0ZXJBbGxcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0hMDshMD09PXQ7KXt0PSExO2Zvcih2YXIgZT0wO2U8dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDtlKyspITA9PT10aGlzLmJvZHkubm9kZXNbdGhpcy5ib2R5Lm5vZGVJbmRpY2VzW2VdXS5pc0NsdXN0ZXImJih0PSEwLHRoaXMuYm9keS5tb2R1bGVzLmNsdXN0ZXJpbmcub3BlbkNsdXN0ZXIodGhpcy5ib2R5Lm5vZGVJbmRpY2VzW2VdLHt9LCExKSk7ITA9PT10JiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2RhdGFDaGFuZ2VkXCIpfX19LHtrZXk6XCJnZXRTZWVkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbml0aWFsUmFuZG9tU2VlZH19LHtrZXk6XCJzZXR1cEhpZXJhcmNoaWNhbExheW91dFwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoITA9PT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmVuYWJsZWQmJnRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGg+MCl7dmFyIHQ9dm9pZCAwLGU9dm9pZCAwLGk9ITEsbz0hMTt0aGlzLmxhc3ROb2RlT25MZXZlbD17fSx0aGlzLmhpZXJhcmNoaWNhbD1uZXcgYjtmb3IoZSBpbiB0aGlzLmJvZHkubm9kZXMpdGhpcy5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KGUpJiYodD10aGlzLmJvZHkubm9kZXNbZV0sdm9pZCAwIT09dC5vcHRpb25zLmxldmVsPyhpPSEwLHRoaXMuaGllcmFyY2hpY2FsLmxldmVsc1tlXT10Lm9wdGlvbnMubGV2ZWwpOm89ITApO2lmKCEwPT09byYmITA9PT1pKXRocm93IG5ldyBFcnJvcihcIlRvIHVzZSB0aGUgaGllcmFyY2hpY2FsIGxheW91dCwgbm9kZXMgcmVxdWlyZSBlaXRoZXIgbm8gcHJlZGVmaW5lZCBsZXZlbHMgb3IgbGV2ZWxzIGhhdmUgdG8gYmUgZGVmaW5lZCBmb3IgYWxsIG5vZGVzLlwiKTtpZighMD09PW8pe3ZhciBuPXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuc29ydE1ldGhvZDtcImh1YnNpemVcIj09PW4/dGhpcy5fZGV0ZXJtaW5lTGV2ZWxzQnlIdWJzaXplKCk6XCJkaXJlY3RlZFwiPT09bj90aGlzLl9kZXRlcm1pbmVMZXZlbHNEaXJlY3RlZCgpOlwiY3VzdG9tXCI9PT1uJiZ0aGlzLl9kZXRlcm1pbmVMZXZlbHNDdXN0b21DYWxsYmFjaygpfWZvcih2YXIgcyBpbiB0aGlzLmJvZHkubm9kZXMpdGhpcy5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KHMpJiZ0aGlzLmhpZXJhcmNoaWNhbC5lbnN1cmVMZXZlbChzKTt2YXIgcj10aGlzLl9nZXREaXN0cmlidXRpb24oKTt0aGlzLl9nZW5lcmF0ZU1hcCgpLHRoaXMuX3BsYWNlTm9kZXNCeUhpZXJhcmNoeShyKSx0aGlzLl9jb25kZW5zZUhpZXJhcmNoeSgpLHRoaXMuX3NoaWZ0VG9DZW50ZXIoKX19fSx7a2V5OlwiX2NvbmRlbnNlSGllcmFyY2h5XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9ITEsaT17fSxvPWZ1bmN0aW9uKGUsaSl7dmFyIG89dC5oaWVyYXJjaGljYWwudHJlZXM7Zm9yKHZhciBuIGluIG8pby5oYXNPd25Qcm9wZXJ0eShuKSYmb1tuXT09PWUmJnQuZGlyZWN0aW9uLnNoaWZ0KG4saSl9LG49ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10saT0wO2k8dC5oaWVyYXJjaGljYWwubnVtVHJlZXMoKTtpKyspZS5wdXNoKHQuZGlyZWN0aW9uLmdldFRyZWVTaXplKGkpKTtyZXR1cm4gZX0scj1mdW5jdGlvbiBlKGksbyl7aWYoIW9baS5pZF0mJihvW2kuaWRdPSEwLHQuaGllcmFyY2hpY2FsLmNoaWxkcmVuUmVmZXJlbmNlW2kuaWRdKSl7dmFyIG49dC5oaWVyYXJjaGljYWwuY2hpbGRyZW5SZWZlcmVuY2VbaS5pZF07aWYobi5sZW5ndGg+MClmb3IodmFyIHM9MDtzPG4ubGVuZ3RoO3MrKyllKHQuYm9keS5ub2Rlc1tuW3NdXSxvKX19LGE9ZnVuY3Rpb24oZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjFlOSxvPTFlOSxuPTFlOSxyPTFlOSxhPS0xZTk7Zm9yKHZhciBoIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShoKSl7dmFyIGQ9dC5ib2R5Lm5vZGVzW2hdLGw9dC5oaWVyYXJjaGljYWwubGV2ZWxzW2QuaWRdLHU9dC5kaXJlY3Rpb24uZ2V0UG9zaXRpb24oZCksYz10Ll9nZXRTcGFjZUFyb3VuZE5vZGUoZCxlKSxwPSgwLHMuZGVmYXVsdCkoYywyKSxmPXBbMF0sbT1wWzFdO289TWF0aC5taW4oZixvKSxuPU1hdGgubWluKG0sbiksbDw9aSYmKH
21167I9TWF0aC5taW4odSxyKSxhPU1hdGgubWF4KHUsYSkpfXJldHVybltyLGEsbyxuXX0saD1mdW5jdGlvbihlLGkpe3ZhciBvPXQuaGllcmFyY2hpY2FsLmdldE1heExldmVsKGUuaWQpLG49dC5oaWVyYXJjaGljYWwuZ2V0TWF4TGV2ZWwoaS5pZCk7cmV0dXJuIE1hdGgubWluKG8sbil9LGQ9ZnVuY3Rpb24oZSxpLG8pe2Zvcih2YXIgbj10LmhpZXJhcmNoaWNhbCxzPTA7czxpLmxlbmd0aDtzKyspe3ZhciByPWlbc10sYT1uLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW3JdO2lmKGEubGVuZ3RoPjEpZm9yKHZhciBoPTA7aDxhLmxlbmd0aC0xO2grKyl7dmFyIGQ9YVtoXSxsPWFbaCsxXTtuLmhhc1NhbWVQYXJlbnQoZCxsKSYmbi5pblNhbWVTdWJOZXR3b3JrKGQsbCkmJmUoZCxsLG8pfX19LGw9ZnVuY3Rpb24oaSxvKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLHM9dC5kaXJlY3Rpb24uZ2V0UG9zaXRpb24oaSksZD10LmRpcmVjdGlvbi5nZXRQb3NpdGlvbihvKSxsPU1hdGguYWJzKGQtcyksdT10Lm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nO2lmKGw+dSl7dmFyIGM9e30scD17fTtyKGksYykscihvLHApO3ZhciBmPWgoaSxvKSxtPWEoYyxmKSx2PWEocCxmKSxnPW1bMV0seT12WzBdLGI9dlsyXTtpZihNYXRoLmFicyhnLXkpPnUpe3ZhciBfPWcteSt1O188LWIrdSYmKF89LWIrdSksXzwwJiYodC5fc2hpZnRCbG9jayhvLmlkLF8pLGU9ITAsITA9PT1uJiZ0Ll9jZW50ZXJQYXJlbnQobykpfX19LHU9ZnVuY3Rpb24obyxuKXtmb3IodmFyIGg9bi5pZCxkPW4uZWRnZXMsbD10LmhpZXJhcmNoaWNhbC5sZXZlbHNbbi5pZF0sdT10Lm9wdGlvbnMuaGllcmFyY2hpY2FsLmxldmVsU2VwYXJhdGlvbip0Lm9wdGlvbnMuaGllcmFyY2hpY2FsLmxldmVsU2VwYXJhdGlvbixjPXt9LHA9W10sZj0wO2Y8ZC5sZW5ndGg7ZisrKXt2YXIgbT1kW2ZdO2lmKG0udG9JZCE9bS5mcm9tSWQpe3ZhciB2PW0udG9JZD09aD9tLmZyb206bS50bztjW2RbZl0uaWRdPXYsdC5oaWVyYXJjaGljYWwubGV2ZWxzW3YuaWRdPGwmJnAucHVzaChtKX19dmFyIGc9ZnVuY3Rpb24oZSxpKXtmb3IodmFyIG89MCxuPTA7bjxpLmxlbmd0aDtuKyspaWYodm9pZCAwIT09Y1tpW25dLmlkXSl7dmFyIHM9dC5kaXJlY3Rpb24uZ2V0UG9zaXRpb24oY1tpW25dLmlkXSktZTtvKz1zL01hdGguc3FydChzKnMrdSl9cmV0dXJuIG99LHk9ZnVuY3Rpb24oZSxpKXtmb3IodmFyIG89MCxuPTA7bjxpLmxlbmd0aDtuKyspaWYodm9pZCAwIT09Y1tpW25dLmlkXSl7dmFyIHM9dC5kaXJlY3Rpb24uZ2V0UG9zaXRpb24oY1tpW25dLmlkXSktZTtvLT11Kk1hdGgucG93KHMqcyt1LC0xLjUpfXJldHVybiBvfSxiPWZ1bmN0aW9uKGUsaSl7Zm9yKHZhciBvPXQuZGlyZWN0aW9uLmdldFBvc2l0aW9uKG4pLHM9e30scj0wO3I8ZTtyKyspe3ZhciBhPWcobyxpKSxoPXkobyxpKTtpZihvLT1NYXRoLm1heCgtNDAsTWF0aC5taW4oNDAsTWF0aC5yb3VuZChhL2gpKSksdm9pZCAwIT09c1tvXSlicmVhaztzW29dPXJ9cmV0dXJuIG99LF89YihvLHApOyFmdW5jdGlvbihvKXt2YXIgcz10LmRpcmVjdGlvbi5nZXRQb3NpdGlvbihuKTtpZih2b2lkIDA9PT1pW24uaWRdKXt2YXIgaD17fTtyKG4saCksaVtuLmlkXT1ofXZhciBkPWEoaVtuLmlkXSksbD1kWzJdLHU9ZFszXSxjPW8tcyxwPTA7Yz4wP3A9TWF0aC5taW4oYyx1LXQub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmcpOmM8MCYmKHA9LU1hdGgubWluKC1jLGwtdC5vcHRpb25zLmhpZXJhcmNoaWNhbC5ub2RlU3BhY2luZykpLDAhPXAmJih0Ll9zaGlmdEJsb2NrKG4uaWQscCksZT0hMCl9KF8pLF89YihvLGQpLGZ1bmN0aW9uKGkpe3ZhciBvPXQuZGlyZWN0aW9uLmdldFBvc2l0aW9uKG4pLHI9dC5fZ2V0U3BhY2VBcm91bmROb2RlKG4pLGE9KDAscy5kZWZh
21167dWx0KShyLDIpLGg9YVswXSxkPWFbMV0sbD1pLW8sdT1vO2w+MD91PU1hdGgubWluKG8rKGQtdC5vcHRpb25zLmhpZXJhcmNoaWNhbC5ub2RlU3BhY2luZyksaSk6bDwwJiYodT1NYXRoLm1heChvLShoLXQub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmcpLGkpKSx1IT09byYmKHQuZGlyZWN0aW9uLnNldFBvc2l0aW9uKG4sdSksZT0hMCl9KF8pfTshMD09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuYmxvY2tTaGlmdGluZyYmKGZ1bmN0aW9uKGkpe3ZhciBvPXQuaGllcmFyY2hpY2FsLmdldExldmVscygpO289by5yZXZlcnNlKCk7Zm9yKHZhciBuPTA7bjxpJiYoZT0hMSxkKGwsbywhMCksITA9PT1lKTtuKyspO30oNSksZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdC5ib2R5Lm5vZGVzKXQuYm9keS5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShlKSYmdC5fY2VudGVyUGFyZW50KHQuYm9keS5ub2Rlc1tlXSl9KCkpLCEwPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5lZGdlTWluaW1pemF0aW9uJiZmdW5jdGlvbihpKXt2YXIgbz10LmhpZXJhcmNoaWNhbC5nZXRMZXZlbHMoKTtvPW8ucmV2ZXJzZSgpO2Zvcih2YXIgbj0wO248aTtuKyspe2U9ITE7Zm9yKHZhciBzPTA7czxvLmxlbmd0aDtzKyspZm9yKHZhciByPW9bc10sYT10LmhpZXJhcmNoaWNhbC5kaXN0cmlidXRpb25PcmRlcmluZ1tyXSxoPTA7aDxhLmxlbmd0aDtoKyspdSgxZTMsYVtoXSk7aWYoITAhPT1lKWJyZWFrfX0oMjApLCEwPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5wYXJlbnRDZW50cmFsaXphdGlvbiYmZnVuY3Rpb24oKXt2YXIgZT10LmhpZXJhcmNoaWNhbC5nZXRMZXZlbHMoKTtlPWUucmV2ZXJzZSgpO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKWZvcih2YXIgbz1lW2ldLG49dC5oaWVyYXJjaGljYWwuZGlzdHJpYnV0aW9uT3JkZXJpbmdbb10scz0wO3M8bi5sZW5ndGg7cysrKXQuX2NlbnRlclBhcmVudChuW3NdKX0oKSxmdW5jdGlvbigpe2Zvcih2YXIgZT1uKCksaT0wLHM9MDtzPGUubGVuZ3RoLTE7cysrKXtpKz1lW3NdLm1heC1lW3MrMV0ubWluK3Qub3B0aW9ucy5oaWVyYXJjaGljYWwudHJlZVNwYWNpbmcsbyhzKzEsaSl9fSgpfX0se2tleTpcIl9nZXRTcGFjZUFyb3VuZE5vZGVcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPSEwO3ZvaWQgMD09PWUmJihpPSExKTt2YXIgbz10aGlzLmhpZXJhcmNoaWNhbC5sZXZlbHNbdC5pZF07aWYodm9pZCAwIT09byl7dmFyIG49dGhpcy5oaWVyYXJjaGljYWwuZGlzdHJpYnV0aW9uSW5kZXhbdC5pZF0scz10aGlzLmRpcmVjdGlvbi5nZXRQb3NpdGlvbih0KSxyPXRoaXMuaGllcmFyY2hpY2FsLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW29dLGE9MWU5LGg9MWU5O2lmKDAhPT1uKXt2YXIgZD1yW24tMV07aWYoITA9PT1pJiZ2b2lkIDA9PT1lW2QuaWRdfHwhMT09PWkpe2E9cy10aGlzLmRpcmVjdGlvbi5nZXRQb3NpdGlvbihkKX19aWYobiE9ci5sZW5ndGgtMSl7dmFyIGw9cltuKzFdO2lmKCEwPT09aSYmdm9pZCAwPT09ZVtsLmlkXXx8ITE9PT1pKXt2YXIgdT10aGlzLmRpcmVjdGlvbi5nZXRQb3NpdGlvbihsKTtoPU1hdGgubWluKGgsdS1zKX19cmV0dXJuW2EsaF19cmV0dXJuWzAsMF19fSx7a2V5OlwiX2NlbnRlclBhcmVudFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHRoaXMuaGllcmFyY2hpY2FsLnBhcmVudFJlZmVyZW5jZVt0LmlkXSlmb3IodmFyIGU9dGhpcy5oaWVyYXJjaGljYWwucGFyZW50UmVmZXJlbmNlW3QuaWRdLGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXSxuPXRoaXMuYm9keS5ub2Rlc1tvXSxyPXRoaXMuaGllcmFyY2hpY2FsLmNoaWxkcmVuUmVmZXJlbmNlW29dO2lmKHZvaWQgMCE9PXIpe3ZhciBhPXRoaXMuX2dldENlbnRlclBvc2l0aW9uKHIpLGg9dGhpcy5kaXJlY3Rpb24uZ2V0UG9zaXRpb24obiksZD10aGlzLl9nZXRTcGFjZUFyb3VuZE5vZGUobiksbD0oMCxzLmRlZmF1bHQpKGQsMiksdT1sWzBdLGM9bFsxXSxwPWgtYTsocDwwJiZNYXRoLmFicyhwKTxjLXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmd8fHA+MCYmTWF0aC5hYnMocCk8dS10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nKSYmdGhpcy5kaXJlY3Rpb24uc2V0UG9zaXRpb24obixhKX19fX0se2tleTpcIl9wbGFjZU5vZGVzQnlIaWVyYXJjaHlcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLnBvc2l0aW9uZWROb2Rlcz17fTtmb3IodmFyIGUgaW4gdClpZih0Lmhhc093blByb3BlcnR5KGUpKXt2YXIgaT0oMCxkLmRlZmF1bHQpKHRbZV0pO2k9dGhpcy5faW5kZXhBcnJheVRvTm9kZXMoaSksdGhpcy5kaXJlY3Rpb24uc29ydChpKTtmb3IodmFyIG89MCxuPTA7bjxpLmxlbmd0aDtuKyspe3ZhciBzPWlbbl07aWYodm9pZCAwPT09dGhpcy5wb3NpdGlvbmVkTm9kZXNbcy5pZF0pe3ZhciByPXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmcsYT1yKm87bz4wJiYoYT10aGlzLmRpcmVjdGlvbi5nZXRQb3NpdGlvbihpW24tMV0pK3IpLHRoaXMuZGlyZWN0aW9uLnNldFBvc2l0aW9uKHMsYSxlKSx0aGlzLl92YWxpZGF0ZVBvc2l0aW9uQW5kQ29udGludWUocyxlLGEpLG8rK319fX19LHtrZXk6XCJfcGxhY2VCcmFuY2hOb2Rlc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5oaWVyYXJjaGljYWwuY2hpbGRyZW5SZWZlcmVuY2VbdF07aWYodm9pZCAwIT09aSl7Zm9yKHZhciBvPVtdLG49MDtuPGkubGVuZ3RoO24rKylvLnB1c2godGhpcy5ib2R5Lm5vZGVzW2lbbl1dKTt0aGlzLmRpcmVjdGlvbi5zb3J0KG8pO2Zvcih2YXIgcz0wO3M8by5sZW5ndGg7cysrKXt2YXIgcj1vW3NdLGE9dGhpcy5oaWVyYXJjaGljYWwubGV2ZWxzW3IuaWRdO2lmKCEoYT5lJiZ2b2lkIDA9PT10aGlzLnBvc2l0aW9uZWROb2Rlc1tyLmlkXSkpcmV0dXJuO3ZhciBoPXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmcsZD12b2lkIDA7ZD0wPT09cz90aGlzLmRpcmVjdGlvbi5nZXRQb3NpdGlvbih0aGlzLmJvZHkubm9kZXNbdF0pOnRoaXMuZGlyZWN0aW9uLmdldFBvc2l0aW9uKG9bcy0xXSkraCx0aGlzLmRpcmVjdGlvbi5zZXRQb3NpdGlvbihyLGQsYSksdGhpcy5fdmFsaWRhdGVQb3NpdGlvbkFuZENvbnRpbnVlKHIsYSxkKX12YXIgbD10aGlzLl9nZXRDZW50ZXJQb3NpdGlvbihvKTt0aGlzLmRpcmVjdGlvbi5zZXRQb3NpdGlvbih0aGlzLmJvZHkubm9kZXNbdF0sbCxlKX19fSx7a2V5OlwiX3ZhbGlkYXRlUG9zaXRpb25BbmRDb250aW51ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtp
21167Zih0aGlzLmhpZXJhcmNoaWNhbC5pc1RyZWUpe2lmKHZvaWQgMCE9PXRoaXMubGFzdE5vZGVPbkxldmVsW2VdKXt2YXIgbz10aGlzLmRpcmVjdGlvbi5nZXRQb3NpdGlvbih0aGlzLmJvZHkubm9kZXNbdGhpcy5sYXN0Tm9kZU9uTGV2ZWxbZV1dKTtpZihpLW88dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5ub2RlU3BhY2luZyl7dmFyIG49byt0aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nLWkscz10aGlzLl9maW5kQ29tbW9uUGFyZW50KHRoaXMubGFzdE5vZGVPbkxldmVsW2VdLHQuaWQpO3RoaXMuX3NoaWZ0QmxvY2socy53aXRoQ2hpbGQsbil9fXRoaXMubGFzdE5vZGVPbkxldmVsW2VdPXQuaWQsdGhpcy5wb3NpdGlvbmVkTm9kZXNbdC5pZF09ITAsdGhpcy5fcGxhY2VCcmFuY2hOb2Rlcyh0LmlkLGUpfX19LHtrZXk6XCJfaW5kZXhBcnJheVRvTm9kZXNcIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0wO2k8dC5sZW5ndGg7aSsrKWUucHVzaCh0aGlzLmJvZHkubm9kZXNbdFtpXV0pO3JldHVybiBlfX0se2tleTpcIl9nZXREaXN0cmlidXRpb25cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXt9LGU9dm9pZCAwLGk9dm9pZCAwO2ZvcihlIGluIHRoaXMuYm9keS5ub2RlcylpZih0aGlzLmJvZHkubm9kZXMuaGFzT3duUHJvcGVydHkoZSkpe2k9dGhpcy5ib2R5Lm5vZGVzW2VdO3ZhciBvPXZvaWQgMD09PXRoaXMuaGllcmFyY2hpY2FsLmxldmVsc1tlXT8wOnRoaXMuaGllcmFyY2hpY2FsLmxldmVsc1tlXTt0aGlzLmRpcmVjdGlvbi5maXgoaSxvKSx2b2lkIDA9PT10W29dJiYodFtvXT17fSksdFtvXVtlXT1pfXJldHVybiB0fX0se2tleTpcIl9nZXRBY3RpdmVFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsaT1bXTtyZXR1cm4gZi5mb3JFYWNoKHQuZWRnZXMsZnVuY3Rpb24odCl7LTEhPT1lLmJvZHkuZWRnZUluZGljZXMuaW5kZXhPZih0LmlkKSYmaS5wdXNoKHQpfSksaX19LHtrZXk6XCJfZ2V0SHViU2l6ZXNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT17fSxpPXRoaXMuYm9keS5ub2RlSW5kaWNlcztmLmZvckVhY2goaSxmdW5jdGlvbihpKXt2YXIgbz10LmJvZHkubm9kZXNbaV0sbj10Ll9nZXRBY3RpdmVFZGdlcyhvKS5sZW5ndGg7ZVtuXT0hMH0pO3ZhciBvPVtdO3JldHVybiBmLmZvckVhY2goZSxmdW5jdGlvbih0KXtvLnB1c2goTnVtYmVyKHQpKX0pLG8uc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBlLXR9KSxvfX0se2tleTpcIl9kZXRlcm1pbmVMZXZlbHNCeUh1YnNpemVcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9ZnVuY3Rpb24oZSxpKXt0LmhpZXJhcmNoaWNhbC5sZXZlbERvd25zdHJlYW0oZSxpKX0saT10aGlzLl9nZXRIdWJTaXplcygpLG89MDtvPGkubGVuZ3RoOysrbyl7aWYoXCJicmVha1wiPT09ZnVuY3Rpb24obyl7dmFyIG49aVtvXTtpZigwPT09bilyZXR1cm5cImJyZWFrXCI7Zi5mb3JFYWNoKHQuYm9keS5ub2RlSW5kaWNlcyxmdW5jdGlvbihpKXt2YXIgbz10LmJvZHkubm9kZXNbaV07bj09PXQuX2dldEFjdGl2ZUVkZ2VzKG8pLmxlbmd0aCYmdC5fY3Jhd2xOZXR3b3JrKGUsaSl9KX0obykpYnJlYWt9fX0se2tleTpcIl9kZXRlcm1pbmVMZXZlbHNDdXN0b21DYWxsYmFja1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWZ1bmN0aW9uKGUsaSxvKXt2YXIgbj10LmhpZXJhcmNoaWNhbC5sZXZlbHNbZS5pZF07dm9pZCAwPT09biYmKG49dC5oaWVyYXJjaGljYWwubGV2ZWxzW2UuaWRdPTFlNSk7dmFyIHM9KG0uY2xvbmVPcHRpb25zKGUsXCJub2RlXCIpLG0uY2xvbmVPcHRpb25zKGksXCJub2RlXCIpLHZvaWQgbS5jbG9uZU9wdGlvbnMobyxcImVkZ2VcIikpO3QuaGllcmFyY2hpY2FsLmxldmVsc1tpLmlkXT1uK3N9O3RoaXMuX2NyYXdsTmV0d29yayhlKSx0aGlzLmhpZXJhcmNoaWNhbC5zZXRNaW5MZXZlbFRvWmVybyh0aGlzLmJvZHkubm9kZXMpfX0se2tleTpcIl9kZXRlcm1pbmVMZXZlbHNEaXJlY3RlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWZ1bmN0aW9uKGUpe3JldHVybiBmLmZvckVhY2godC5ib2R5LmVkZ2VzLGZ1bmN0aW9uKHQpe2lmKHQudG9JZD09PWUuZnJvbUlkJiZ0LmZyb21JZD09PWUudG9JZClyZXR1cm4hMH0pLCExfSxpPWZ1bmN0aW9uKGksbyxuKXt2YXIgcz10LmhpZXJhcmNoaWNhbC5sZXZlbHNbaS5pZF0scj10LmhpZXJhcmNoaWNhbC5sZXZlbHNbby5pZF07ZShuKSYmdm9pZCAwIT09cyYmdm9pZCAwIT09cnx8KHZvaWQgMD09PXMmJihzPXQuaGllcmFyY2hpY2FsLmxldmVsc1tpLmlkXT0xZTQpLG4udG9JZD09by5pZD90LmhpZXJhcmNoaWNhbC5sZXZlbHNbby5pZF09cysxOnQuaGllcmFyY2hpY2FsLmxldmVsc1tvLmlkXT1zLTEpfTt0aGlzLl9jcmF3bE5ldHdvcmsoaSksdGhpcy5oaWVyYXJjaGljYWwuc2V0TWluTGV2ZWxUb1plcm8odGhpcy5ib2R5Lm5vZGVzKX19LHtrZXk6XCJfZ2VuZXJhdGVNYXBcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1mdW5jdGlvbihlLGkpe3QuaGllcmFyY2hpY2FsLmxldmVsc1tpLmlkXT50LmhpZXJhcmNoaWNhbC5sZXZlbHNbZS5pZF0mJnQuaGllcmFyY2hpY2FsLmFkZFJlbGF0aW9uKGUuaWQsaS5pZCl9O3RoaXMuX2NyYXdsTmV0d29yayhlKSx0aGlzLmhpZXJhcmNoaWNhbC5jaGVja0lmVHJlZSgpfX0se2tleTpcIl9jcmF3bE5ldHdvcmtcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06ZnVuY3Rpb24oKXt9LGk9YXJndW1lbnRzWzFdLG89e30sbj1mdW5jdGlvbiBpKG4scyl7aWYodm9pZCAwPT09b1tuLmlkXSl7dC5oaWVyYXJjaGljYWwuc2V0VHJlZUluZGV4KG4scyksb1tuLmlkXT0hMDtmb3IodmFyIHI9dm9pZCAwLGE9dC5fZ2V0QWN0aXZlRWRnZXMobiksaD0wO2g8YS5sZW5ndGg7aCsrKXt2YXIgZD1hW2hdOyEwPT09ZC5jb25uZWN0ZWQmJihyPWQudG9JZD09bi5pZD9kLmZyb206ZC50byxuLmlkIT1yLmlkJiYoZShuLHIsZCksaShyLHMpKSl9fX07aWYodm9pZCAwPT09aSlmb3IodmFyIHM9MCxyPTA7cjx0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoO3IrKyl7dmFyIGE9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzW3JdO2lmKHZvaWQgMD09PW9bYV0pe3ZhciBoPXRoaXMuYm9keS5ub2Rlc1thXTtuKGgscykscys9MX19ZWxzZXt2YXIgZD10aGlzLmJvZHkubm9kZXNbaV07aWYodm9pZCAwPT09ZClyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKFwiTm9kZSBub3QgZm91bmQ6XCIsaSk7bihkKX19fSx7a2V5OlwiX3NoaWZ0QmxvY2tcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMsbz17fTshZnVuY3Rpb24gdChuKXtpZighb1tuXSl7b1tuXT0hMCxpLmRpcmVjdGlvbi5zaGlmdChuLGUpO3ZhciBzPWkuaGllcmFyY2hpY2FsLmNoaWxkcmVuUmVmZXJlbmNlW25dO2lmKHZvaWQgMCE9PXMpZm9yKHZhciByPTA7cjxzLmxlbmd0aDtyKyspdChzW3JdKX19KHQpfX0se2tleTpcIl9maW5kQ29tbW9uUGFyZW50XCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLG89e307cmV0dXJuIGZ1bmN0aW9uIHQoZSxvKXt2YXIgbj1pLmhpZXJhcmNoaWNhbC5wYXJlbnRSZWZlcmVuY2Vbb107aWYodm9pZCAwIT09bilmb3IodmFyIHM9MDtzPG4ubGVuZ3RoO3MrKyl7dmFyIHI9bltzXTtlW3JdPSEwLHQoZSxyKX19KG8sdCksZnVuY3Rpb24gdChlLG8pe3ZhciBuPWkuaGllcmFyY2hpY2FsLnBhcmVudFJlZmVyZW5jZVtvXTtpZih2b2lkIDAhPT1uKWZvcih2YXIgcz0wO3M8bi5sZW5ndGg7cysrKXt2YXIgcj1uW3NdO2lmKHZvaWQgMCE9PWVbcl0pcmV0dXJue2ZvdW5kUGFyZW50OnIsd2l0aENoaWxkOm99O3ZhciBhPXQoZSxyKTtpZihudWxsIT09YS5mb3VuZFBhcmVudClyZXR1cm4gYX1yZXR1cm57Zm91bmRQYXJlbnQ6bnVsbCx3aXRoQ2hpbGQ6b319KG8sZSl9fSx7a2V5Olwic2V0RGlyZWN0aW9uU3RyYXRlZ3lcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PVwiVURcIj09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuZGlyZWN0aW9ufHxcIkRVXCI9PT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmRpcmVjdGlvbjt0aGlzLmRpcmVjdGlvbj10P25ldyB5KHRoaXMpOm5ldyBnKHRoaXMpfX0se2tleTpcIl9nZXRDZW50ZXJQb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xZTksaT0tMWU5LG89MDtvPHQubGVuZ3RoO28rKyl7dmFyIG49dm9pZCAwO2lmKHZvaWQgMCE9PXRbb10uaWQpbj10W29dO2Vsc2V7dmFyIHM9dFtvXTtuPXRoaXMuYm9keS5ub2Rlc1tzXX12YXIgcj10aGlzLmRpcmVjdGlvbi5nZXRQb3NpdGlvbihuKTtlPU1hdGgubWluKGUsciksaT1NYXRoLm1heChpLHIpfXJldHVybi41KihlK2kpfX1dKSx0fSgpO2UuZGVmYXVsdD1ffSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSks
21167ZS5WZXJ0aWNhbFN0cmF0ZWd5PWUuSG9yaXpvbnRhbFN0cmF0ZWd5PXZvaWQgMDt2YXIgbj1pKDMpLHM9byhuKSxyPWkoNCksYT1vKHIpLGg9aSg1KSxkPW8oaCksbD1pKDApLHU9byhsKSxjPWkoMSkscD1vKGMpLGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7KDAsdS5kZWZhdWx0KSh0aGlzLHQpfXJldHVybigwLHAuZGVmYXVsdCkodCxbe2tleTpcImFic3RyYWN0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBpbnN0YW50aWF0ZSBhYnN0cmFjdCBjbGFzcyFcIil9fSx7a2V5OlwiZmFrZV91c2VcIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6XCJjdXJ2ZVR5cGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFic3RyYWN0KCl9fSx7a2V5OlwiZ2V0UG9zaXRpb25cIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5mYWtlX3VzZSh0KSx0aGlzLmFic3RyYWN0KCl9fSx7a2V5Olwic2V0UG9zaXRpb25cIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp2b2lkIDA7dGhpcy5mYWtlX3VzZSh0LGUsaSksdGhpcy5hYnN0cmFjdCgpfX0se2tleTpcImdldFRyZWVTaXplXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmFrZV91c2UodCksdGhpcy5hYnN0cmFjdCgpfX0se2tleTpcInNvcnRcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmZha2VfdXNlKHQpLHRoaXMuYWJzdHJhY3QoKX19LHtrZXk6XCJmaXhcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuZmFrZV91c2UodCxlKSx0aGlzLmFic3RyYWN0KCl9fSx7a2V5Olwic2hpZnRcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuZmFrZV91c2UodCxlKSx0aGlzLmFic3RyYWN0KCl9fV0pLHR9KCksbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpeygwLHUuZGVmYXVsdCkodGhpcyxlKTt2YXIgaT0oMCxhLmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMpKTtyZXR1cm4gaS5sYXlvdXQ9dCxpfXJldHVybigwLGQuZGVmYXVsdCkoZSx0KSwoMCxwLmRlZmF1bHQpKGUsW3trZXk6XCJjdXJ2ZVR5cGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblwiaG9yaXpvbnRhbFwifX0se2tleTpcImdldFBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHQueH19LHtrZXk6XCJzZXRQb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnZvaWQgMDt2b2lkIDAhPT1pJiZ0aGlzLmxheW91dC5oaWVyYXJjaGljYWwuYWRkVG9PcmRlcmluZyh0LGkpLHQueD1lfX0se2tleTpcImdldFRyZWVTaXplXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sYXlvdXQuaGllcmFyY2hpY2FsLmdldFRyZWVTaXplKHRoaXMubGF5b3V0LmJvZHkubm9kZXMsdCk7cmV0dXJue21pbjplLm1pbl94LG1heDplLm1heF94fX19LHtrZXk6XCJzb3J0XCIsdmFsdWU6ZnVuY3Rpb24odCl7dC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PXQueHx8dm9pZCAwPT09ZS54PzA6dC54LWUueH0pfX0se2tleTpcImZpeFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dC55PXRoaXMubGF5b3V0Lm9wdGlvbnMuaGllcmFyY2hpY2FsLmxldmVsU2VwYXJhdGlvbiplLHQub3B0aW9ucy5maXhlZC55PSEwfX0se2tleTpcInNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLmxheW91dC5ib2R5Lm5vZGVzW3RdLngrPWV9fV0pLGV9KGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXsoMCx1LmRlZmF1bHQpKHRoaXMsZSk7dmFyIGk9KDAsYS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzKSk7cmV0dXJuIGkubGF5b3V0PXQsaX1yZXR1cm4oMCxkLmRlZmF1bHQpKGUsdCksKDAscC5kZWZhdWx0KShlLFt7a2V5OlwiY3VydmVUeXBlXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5cInZlcnRpY2FsXCJ9fSx7a2V5OlwiZ2V0UG9zaXRpb25cIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdC55fX0se2tleTpcInNldFBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06dm9pZCAwO3ZvaWQgMCE9PWkmJnRoaXMubGF5b3V0LmhpZXJhcmNoaWNhbC5hZGRUb09yZGVyaW5nKHQsaSksdC55PWV9fSx7a2V5OlwiZ2V0VHJlZVNpemVcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmxheW91dC5oaWVyYXJjaGljYWwuZ2V0VHJlZVNpemUodGhpcy5sYXlvdXQuYm9keS5ub2Rlcyx0KTtyZXR1cm57bWluOmUubWluX3ksbWF4OmUubWF4X3l9fX0se2tleTpcInNvcnRcIix2YWx1ZTpmdW5jdGlvbih0KXt0LnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09dC55fHx2b2lkIDA9PT1lLnk/MDp0LnktZS55fSl9fSx7a2V5OlwiZml4XCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0Lng9dGhpcy5sYXlvdXQub3B0aW9ucy5oaWVyYXJjaGljYWwubGV2ZWxTZXBhcmF0aW9uKmUsdC5vcHRpb25zLmZpeGVkLng9ITB9fSx7a2V5Olwic2hpZnRcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMubGF5b3V0LmJvZHkubm9kZXNbdF0ueSs9ZX19XSksZX0oZik7ZS5Ib3Jpem9udGFsU3RyYXRlZ3k9dixlLlZlcnRpY2FsU3RyYXRlZ3k9bX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoOCkscz1vKG4pLHI9aSgxOSksYT1vKHIpLGg9aSg2KSxkPW8oaCksbD1pKDApLHU9byhsKSxjPWkoMSkscD1vKGMpLGY9aSgyKSxtPWkoMTApLHY9aSgzNyksZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8pe3ZhciBuPXRoaXM7KDAsdS5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMuY2FudmFzPWksdGhpcy5zZWxlY3Rpb25IYW5kbGVyPW8sdGhpcy5lZGl0TW9kZT0hMSx0aGlzLm1hbmlwdWxhdGlvbkRpdj12b2lkIDAsdGhpcy5lZGl0TW9kZURpdj12b2lkIDAsdGhpcy5jbG9zZURpdj12b2lkIDAsdGhpcy5tYW5pcHVsYXRpb25IYW1tZXJzPVtdLHRoaXMudGVtcG9yYXJ5VUlGdW5jdGlvbnM9e30sdGhpcy50ZW1wb3JhcnlFdmVudEZ1bmN0aW9ucz1bXSx0aGlzLnRvdWNoVGltZT0wLHRoaXMudGVtcG9yYXJ5SWRzPXtub2RlczpbXSxlZGdlczpbXX0sdGhpcy5ndWlFbmFibGVkPSExLHRoaXMuaW5Nb2RlPSExLHRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZT12b2lkIDAsdGhpcy5vcHRpb25zPXt9LHRoaXMuZGVmYXVsdE9wdGlvbnM9e2VuYWJsZWQ6ITEsaW5pdGlhbGx5QWN0aXZlOiExLGFkZE5vZGU6ITAsYWRkRWRnZTohMCxlZGl0Tm9kZTp2b2lkIDAsZWRpdEVkZ2U6ITAsZGVsZXRlTm9kZTohMCxkZWxldGVFZGdlOiEwLGNvbnRyb2xOb2RlU3R5bGU6e3NoYXBlOlwiZG90XCIsc2l6ZTo2LGNvbG9yOntiYWNrZ3JvdW5kOlwiI2ZmMDAwMFwiLGJvcmRlcjpcIiMzYzNjM2NcIixoaWdobGlnaHQ6e2JhY2tncm91bmQ6XCIjMDdmOTY4XCIsYm9yZGVyOlwiIzNjM2MzY1wifX0sYm9yZGVyV2lkdGg6Mixib3JkZXJXaWR0aFNlbGVjdGVkOjJ9fSxmLmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJkZXN0cm95XCIsZnVuY3Rpb24oKXtuLl9jbGVhbigpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJfZGF0YUNoYW5nZWRcIix0aGlzLl9yZXN0b3JlLmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiX3Jlc2V0RGF0YVwiLHRoaXMuX3Jlc3RvcmUuYmluZCh0aGlzKSl9cmV0dXJuKDAscC5kZWZhdWx0KSh0LFt7a2V5OlwiX3Jlc3RvcmVcIix2YWx1ZTpmdW5jdGlvbigpeyExIT09dGhpcy5pbk1vZGUmJighMD09PXRoaXMub3B0aW9ucy5pbml0aWFsbHlBY3RpdmU/dGhpcy5lbmFibGVFZGl0TW9kZSgpOnRoaXMuZGlzYWJsZUVkaXRNb2RlKCkpfX0se2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dm9pZCAwIT09ZSYmKHZvaWQgMCE9PWUubG9jYWxlP3RoaXMub3B0aW9ucy5sb2NhbGU9ZS5sb2NhbGU6dGhpcy5vcHRpb25zLmxvY2FsZT1pLmxvY2FsZSx2b2lkIDAhPT1lLmxvY2FsZXM/dGhpcy5vcHRpb25zLmxvY2FsZXM9ZS5sb2NhbGVzOnRoaXMub3B0aW9ucy5sb2NhbGVzPWkubG9jYWxlcyksdm9pZCAwIT09dCYmKFwiYm9vbGVhblwiPT10eXBlb2YgdD90aGlzLm9wdGlvbnMuZW5hYmxlZD10Oih0aGlzLm9wdGlvbnMuZW5hYmxlZD0hMCxmLmRlZXBFeHRlbmQodGhpcy5vcHRpb25zLHQpKSwhMD09PXRoaXMub3B0aW9ucy5pbml0aWFsbHlBY3RpdmUmJih0aGlzLmVkaXRNb2RlPSEwKSx0aGlzLl9zZXR1cCgpKX19LHtrZXk6XCJ0b2dnbGVFZGl0TW9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7ITA9PT10aGlzLmVkaXRNb2RlP3RoaXMuZGlzYWJsZUVkaXRNb2RlKCk6dGhpcy5lbmFibGVFZGl0TW9kZSgpfX0se2tleTpcImVuYWJsZUVkaXRNb2RlXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmVkaXRNb2RlPSEwLHRoaXMuX2NsZWFuKCksITA9PT10aGlzLmd1aUVuYWJsZWQmJih0aGlzLm1hbmlwdWxhdGlvbkRpdi5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIix0aGlzLmNsb3NlRGl2LnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiLHRoaXMuZWRpdE1vZGVEaXYuc3R5bGUuZGlzcGxheT1cIm5vbmVcIix0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKSl9fSx7a2V5OlwiZGlzYWJsZUVkaXRNb2RlXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmVkaXRNb2RlPSExLHRoaXMuX2NsZWFuKCksITA9PT10aGlzLmd1aUVuYWJsZWQmJih0aGlzLm1hbmlwdWxhdGlvbkRpdi5zdHlsZS5kaXNwbGF5PVwibm9uZVwiLHRoaXMuY2xvc2VEaXYuc3R5bGUuZGlzcGxheT1cIm5vbmVcIix0aGlzLmVkaXRNb2RlRGl2LnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiLHRoaXMuX2NyZWF0ZUVkaXRCdXR0b24oKSl9fSx7a2V5Olwic2hvd01hbmlwdWxhdG9yVG9vbGJhclwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5fY2xlYW4oKSx0aGlzLm1hbmlwdWxhdGlvbkRPTT17fSwhMD09PXRoaXMuZ3VpRW5hYmxlZCl7dGhpcy5lZGl0TW9kZT0hMCx0aGlzLm1hbmlwdWxhdGlvbkRpdi5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIix0aGlzLmNsb3NlRGl2LnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO3ZhciB0PXRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2V0U2VsZWN0ZWROb2RlQ291bnQoKSxlPXR
21167oaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2V0U2VsZWN0ZWRFZGdlQ291bnQoKSxpPXQrZSxvPXRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdLG49ITE7ITEhPT10aGlzLm9wdGlvbnMuYWRkTm9kZSYmKHRoaXMuX2NyZWF0ZUFkZE5vZGVCdXR0b24obyksbj0hMCksITEhPT10aGlzLm9wdGlvbnMuYWRkRWRnZSYmKCEwPT09bj90aGlzLl9jcmVhdGVTZXBlcmF0b3IoMSk6bj0hMCx0aGlzLl9jcmVhdGVBZGRFZGdlQnV0dG9uKG8pKSwxPT09dCYmXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmVkaXROb2RlPyghMD09PW4/dGhpcy5fY3JlYXRlU2VwZXJhdG9yKDIpOm49ITAsdGhpcy5fY3JlYXRlRWRpdE5vZGVCdXR0b24obykpOjE9PT1lJiYwPT09dCYmITEhPT10aGlzLm9wdGlvbnMuZWRpdEVkZ2UmJighMD09PW4/dGhpcy5fY3JlYXRlU2VwZXJhdG9yKDMpOm49ITAsdGhpcy5fY3JlYXRlRWRpdEVkZ2VCdXR0b24obykpLDAhPT1pJiYodD4wJiYhMSE9PXRoaXMub3B0aW9ucy5kZWxldGVOb2RlPyghMD09PW4mJnRoaXMuX2NyZWF0ZVNlcGVyYXRvcig0KSx0aGlzLl9jcmVhdGVEZWxldGVCdXR0b24obykpOjA9PT10JiYhMSE9PXRoaXMub3B0aW9ucy5kZWxldGVFZGdlJiYoITA9PT1uJiZ0aGlzLl9jcmVhdGVTZXBlcmF0b3IoNCksdGhpcy5fY3JlYXRlRGVsZXRlQnV0dG9uKG8pKSksdGhpcy5fYmluZEhhbW1lclRvRGl2KHRoaXMuY2xvc2VEaXYsdGhpcy50b2dnbGVFZGl0TW9kZS5iaW5kKHRoaXMpKSx0aGlzLl90ZW1wb3JhcnlCaW5kRXZlbnQoXCJzZWxlY3RcIix0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIuYmluZCh0aGlzKSl9dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZWRyYXdcIil9fSx7a2V5OlwiYWRkTm9kZU1vZGVcIix2YWx1ZTpmdW5jdGlvbigpe2lmKCEwIT09dGhpcy5lZGl0TW9kZSYmdGhpcy5lbmFibGVFZGl0TW9kZSgpLHRoaXMuX2NsZWFuKCksdGhpcy5pbk1vZGU9XCJhZGROb2RlXCIsITA9PT10aGlzLmd1aUVuYWJsZWQpe3ZhciB0PXRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdO3RoaXMubWFuaXB1bGF0aW9uRE9NPXt9LHRoaXMuX2NyZWF0ZUJhY2tCdXR0b24odCksdGhpcy5fY3JlYXRlU2VwZXJhdG9yKCksdGhpcy5fY3JlYXRlRGVzY3JpcHRpb24odC5hZGREZXNjcmlwdGlvbnx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uYWRkRGVzY3JpcHRpb24pLHRoaXMuX2JpbmRIYW1tZXJUb0Rpdih0aGlzLmNsb3NlRGl2LHRoaXMudG9nZ2xlRWRpdE1vZGUuYmluZCh0aGlzKSl9dGhpcy5fdGVtcG9yYXJ5QmluZEV2ZW50KFwiY2xpY2tcIix0aGlzLl9wZXJmb3JtQWRkTm9kZS5iaW5kKHRoaXMpKX19LHtrZXk6XCJlZGl0Tm9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczshMCE9PXRoaXMuZWRpdE1vZGUmJnRoaXMuZW5hYmxlRWRpdE1vZGUoKSx0aGlzLl9jbGVhbigpO3ZhciBlPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2V0U2VsZWN0ZWROb2RlKCk7aWYodm9pZCAwIT09ZSl7aWYodGhpcy5pbk1vZGU9XCJlZGl0Tm9kZVwiLFwiZnVuY3Rpb25cIiE9dHlwZW9mIHRoaXMub3B0aW9ucy5lZGl0Tm9kZSl0aHJvdyBuZXcgRXJyb3IoXCJObyBmdW5jdGlvbiBoYXMgYmVlbiBjb25maWd1cmVkIHRvIGhhbmRsZSB0aGUgZWRpdGluZyBvZiBub2Rlcy5cIik7aWYoITAhPT1lLmlzQ2x1c3Rlcil7dmFyIGk9Zi5kZWVwRXh0ZW5kKHt9LGUub3B0aW9ucywhMSk7aWYoaS54PWUueCxpLnk9ZS55LDIhPT10aGlzLm9wdGlvbnMuZWRpdE5vZGUubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcIlRoZSBmdW5jdGlvbiBmb3IgZWRpdCBkb2VzIG5vdCBzdXBwb3J0IHR3byBhcmd1bWVudHMgKGRhdGEsIGNhbGxiYWNrKVwiKTt0aGlzLm9wdGlvbnMuZWRpdE5vZGUoaSxmdW5jdGlvbihlKXtudWxsIT09ZSYmdm9pZCAwIT09ZSYmXCJlZGl0Tm9kZVwiPT09dC5pbk1vZGUmJnQuYm9keS5kYXRhLm5vZGVzLmdldERhdGFTZXQoKS51cGRhdGUoZSksdC5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCl9KX1lbHNlIGFsZXJ0KHRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdLmVkaXRDbHVzdGVyRXJyb3J8fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmVkaXRDbHVzdGVyRXJyb3IpfWVsc2UgdGhpcy5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCl9fSx7a2V5OlwiYWRkRWRnZU1vZGVcIix2YWx1ZTpmdW5jdGlvbigpe2lmKCEwIT09dGhpcy5lZGl0TW9kZSYmdGhpcy5lbmFibGVFZGl0TW9kZSgpLHRoaXMuX2NsZWFuKCksdGhpcy5pbk1vZGU9XCJhZGRFZGdlXCIsITA9PT10aGlzLmd1aUVuYWJsZWQpe3ZhciB0PXRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdO3RoaXMubWFuaXB1bGF0aW9uRE9NPXt9LHRoaXMuX2NyZWF0ZUJhY2tCdXR0b24odCksdGhpcy5fY3JlYXRlU2VwZXJhdG9yKCksdGhpcy5fY3JlYXRlRGVzY3JpcHRpb24odC5lZGdlRGVzY3JpcHRpb258fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmVkZ2VEZXNjcmlwdGlvbiksdGhpcy5fYmluZEhhbW1lclRvRGl2KHRoaXMuY2xvc2VEaXYsdGhpcy50b2dnbGVFZGl0TW9kZS5iaW5kKHRoaXMpKX10aGlzLl90ZW1wb3JhcnlCaW5kVUkoXCJvblRvdWNoXCIsdGhpcy5faGFuZGxlQ29ubmVjdC5iaW5kKHRoaXMpKSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoXCJvbkRyYWdFbmRcIix0aGlzLl9maW5pc2hDb25uZWN0LmJpbmQodGhpcykpLHRoaXMuX3RlbXBvcmFyeUJpbmRVSShcIm9uRHJhZ1wiLHRoaXMuX2RyYWdDb250cm9sTm9kZS5iaW5kKHRoaXMpKSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoXCJvblJlbGVhc2VcIix0aGlzLl9maW5pc2hDb25uZWN0LmJpbmQodGhpcykpLHRoaXMuX3RlbXBvcmFyeUJpbmRVSShcIm9uRHJhZ1N0YXJ0XCIsdGhpcy5fZHJhZ1N0YXJ0RWRnZS5iaW5kKHRoaXMpKSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoXCJvbkhvbGRcIixmdW5jdGlvbigpe30pfX0se2tleTpcImVkaXRFZGdlTW9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoITAhPT10aGlzLmVkaXRNb2RlJiZ0aGlzLmVuYWJsZUVkaXRNb2RlKCksdGhpcy5fY2xlYW4oKSx0aGlzLmluTW9kZT1cImVkaXRFZGdlXCIsXCJvYmplY3RcIj09PSgwLGQuZGVmYXVsdCkodGhpcy5vcHRpb25zLmVkaXRFZGdlKSYmXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmVkaXRFZGdlLmVkaXRXaXRob3V0RHJhZyYmKHRoaXMuZWRnZUJlaW5nRWRpdGVkSWQ9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGVkRWRnZXMoKVswXSx2b2lkIDAhPT10aGlzLmVkZ2VCZWluZ0VkaXRlZElkKSl7dmFyIHQ9dGhpcy5ib2R5LmVkZ2VzW3RoaXMuZWRnZUJlaW5nRWRpdGVkSWRdO3JldHVybiB2b2lkIHRoaXMuX3BlcmZvcm1FZGl0RWRnZSh0LmZyb20sdC50byl9aWYoITA9PT10aGlzLmd1aUVuYWJsZWQpe3ZhciBlPXR
21167oaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdO3RoaXMubWFuaXB1bGF0aW9uRE9NPXt9LHRoaXMuX2NyZWF0ZUJhY2tCdXR0b24oZSksdGhpcy5fY3JlYXRlU2VwZXJhdG9yKCksdGhpcy5fY3JlYXRlRGVzY3JpcHRpb24oZS5lZGl0RWRnZURlc2NyaXB0aW9ufHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5lZGl0RWRnZURlc2NyaXB0aW9uKSx0aGlzLl9iaW5kSGFtbWVyVG9EaXYodGhpcy5jbG9zZURpdix0aGlzLnRvZ2dsZUVkaXRNb2RlLmJpbmQodGhpcykpfWlmKHRoaXMuZWRnZUJlaW5nRWRpdGVkSWQ9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGVkRWRnZXMoKVswXSx2b2lkIDAhPT10aGlzLmVkZ2VCZWluZ0VkaXRlZElkKXt2YXIgaT10aGlzLmJvZHkuZWRnZXNbdGhpcy5lZGdlQmVpbmdFZGl0ZWRJZF0sbz10aGlzLl9nZXROZXdUYXJnZXROb2RlKGkuZnJvbS54LGkuZnJvbS55KSxuPXRoaXMuX2dldE5ld1RhcmdldE5vZGUoaS50by54LGkudG8ueSk7dGhpcy50ZW1wb3JhcnlJZHMubm9kZXMucHVzaChvLmlkKSx0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlcy5wdXNoKG4uaWQpLHRoaXMuYm9keS5ub2Rlc1tvLmlkXT1vLHRoaXMuYm9keS5ub2RlSW5kaWNlcy5wdXNoKG8uaWQpLHRoaXMuYm9keS5ub2Rlc1tuLmlkXT1uLHRoaXMuYm9keS5ub2RlSW5kaWNlcy5wdXNoKG4uaWQpLHRoaXMuX3RlbXBvcmFyeUJpbmRVSShcIm9uVG91Y2hcIix0aGlzLl9jb250cm9sTm9kZVRvdWNoLmJpbmQodGhpcykpLHRoaXMuX3RlbXBvcmFyeUJpbmRVSShcIm9uVGFwXCIsZnVuY3Rpb24oKXt9KSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoXCJvbkhvbGRcIixmdW5jdGlvbigpe30pLHRoaXMuX3RlbXBvcmFyeUJpbmRVSShcIm9uRHJhZ1N0YXJ0XCIsdGhpcy5fY29udHJvbE5vZGVEcmFnU3RhcnQuYmluZCh0aGlzKSksdGhpcy5fdGVtcG9yYXJ5QmluZFVJKFwib25EcmFnXCIsdGhpcy5fY29udHJvbE5vZGVEcmFnLmJpbmQodGhpcykpLHRoaXMuX3RlbXBvcmFyeUJpbmRVSShcIm9uRHJhZ0VuZFwiLHRoaXMuX2NvbnRyb2xOb2RlRHJhZ0VuZC5iaW5kKHRoaXMpKSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoXCJvbk1vdXNlTW92ZVwiLGZ1bmN0aW9uKCl7fSksdGhpcy5fdGVtcG9yYXJ5QmluZEV2ZW50KFwiYmVmb3JlRHJhd2luZ1wiLGZ1bmN0aW9uKHQpe3ZhciBlPWkuZWRnZVR5cGUuZmluZEJvcmRlclBvc2l0aW9ucyh0KTshMT09PW8uc2VsZWN0ZWQmJihvLng9ZS5mcm9tLngsby55PWUuZnJvbS55KSwhMT09PW4uc2VsZWN0ZWQmJihuLng9ZS50by54LG4ueT1lLnRvLnkpfSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZWRyYXdcIil9ZWxzZSB0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKX19LHtrZXk6XCJkZWxldGVTZWxlY3RlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczshMCE9PXRoaXMuZWRpdE1vZGUmJnRoaXMuZW5hYmxlRWRpdE1vZGUoKSx0aGlzLl9jbGVhbigpLHRoaXMuaW5Nb2RlPVwiZGVsZXRlXCI7dmFyIGU9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGVkTm9kZXMoKSxpPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5nZXRTZWxlY3RlZEVkZ2VzKCksbz12b2lkIDA7aWYoZS5sZW5ndGg+MCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYoITA9PT10aGlzLmJvZHkubm9kZXNbZVtuXV0uaXNDbHVzdGVyKXJldHVybiB2b2lkIGFsZXJ0KHRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdLmRlbGV0ZUNsdXN0ZXJFcnJvcnx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uZGVsZXRlQ2x1c3RlckVycm9yKTtcImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuZGVsZXRlTm9kZSYmKG89dGhpcy5vcHRpb25zLmRlbGV0ZU5vZGUpfWVsc2UgaS5sZW5ndGg+MCYmXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmRlbGV0ZUVkZ2UmJihvPXRoaXMub3B0aW9ucy5kZWxldGVFZGdlKTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBvKXt2YXIgcz17bm9kZXM6ZSxlZGdlczppfVxuICAgIDtpZigyIT09by5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiVGhlIGZ1bmN0aW9uIGZvciBkZWxldGUgZG9lcyBub3Qgc3VwcG9ydCB0d28gYXJndW1lbnRzIChkYXRhLCBjYWxsYmFjaylcIik7byhzLGZ1bmN0aW9uKGUpe251bGwhPT1lJiZ2b2lkIDAhPT1lJiZcImRlbGV0ZVwiPT09dC5pbk1vZGU/KHQuYm9keS5kYXRhLmVkZ2VzLmdldERhdGFTZXQoKS5yZW1vdmUoZS5lZGdlcyksdC5ib2R5LmRhdGEubm9kZXMuZ2V0RGF0YVNldCgpLnJlbW92ZShlLm5vZGVzKSx0LmJvZHkuZW1pdHRlci5lbWl0KFwic3RhcnRTaW11bGF0aW9uXCIpLHQuc2hvd01hbmlwdWxhdG9yVG9vbGJhcigpKToodC5ib2R5LmVtaXR0ZXIuZW1pdChcInN0YXJ0U2ltdWxhdGlvblwiKSx0LnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKSl9KX1lbHNlIHRoaXMuYm9keS5kYXRhLmVkZ2VzLmdldERhdGFTZXQoKS5yZW1vdmUoaSksdGhpcy5ib2R5LmRhdGEubm9kZXMuZ2V0RGF0YVNldCgpLnJlbW92ZShlKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwic3RhcnRTaW11bGF0aW9uXCIpLHRoaXMuc2hvd01hbmlwdWxhdG9yVG9vbGJhcigpfX0se2tleTpcIl9zZXR1cFwiLHZhbHVlOmZ1bmN0aW9uKCl7ITA9PT10aGlzLm9wdGlvbnMuZW5hYmxlZD8odGhpcy5ndWlFbmFibGVkPSEwLHRoaXMuX2NyZWF0ZVdyYXBwZXJzKCksITE9PT10aGlzLmVkaXRNb2RlP3RoaXMuX2NyZWF0ZUVkaXRCdXR0b24oKTp0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKSk6KHRoaXMuX3JlbW92ZU1hbmlwdWxhdGlvbkRPTSgpLHRoaXMuZ3VpRW5hYmxlZD0hMSl9fSx7a2V5OlwiX2NyZWF0ZVdyYXBwZXJzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2b2lkIDA9PT10aGlzLm1hbmlwdWxhdGlvbkRpdiYmKHRoaXMubWFuaXB1bGF0aW9uRGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5tYW5pcHVsYXRpb25EaXYuY2xhc3NOYW1lPVwidmlzLW1hbmlwdWxhdGlvblwiLCEwPT09dGhpcy5lZGl0TW9kZT90aGlzLm1hbmlwdWxhdGlvbkRpdi5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjp0aGlzLm1hbmlwdWxhdGlvbkRpdi5zdHlsZS5kaXNwbGF5PVwibm9uZVwiLHRoaXMuY2FudmFzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMubWFuaXB1bGF0aW9uRGl2KSksdm9pZCAwPT09dGhpcy5lZGl0TW9kZURpdiYmKHR
21167oaXMuZWRpdE1vZGVEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmVkaXRNb2RlRGl2LmNsYXNzTmFtZT1cInZpcy1lZGl0LW1vZGVcIiwhMD09PXRoaXMuZWRpdE1vZGU/dGhpcy5lZGl0TW9kZURpdi5zdHlsZS5kaXNwbGF5PVwibm9uZVwiOnRoaXMuZWRpdE1vZGVEaXYuc3R5bGUuZGlzcGxheT1cImJsb2NrXCIsdGhpcy5jYW52YXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5lZGl0TW9kZURpdikpLHZvaWQgMD09PXRoaXMuY2xvc2VEaXYmJih0aGlzLmNsb3NlRGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5jbG9zZURpdi5jbGFzc05hbWU9XCJ2aXMtY2xvc2VcIix0aGlzLmNsb3NlRGl2LnN0eWxlLmRpc3BsYXk9dGhpcy5tYW5pcHVsYXRpb25EaXYuc3R5bGUuZGlzcGxheSx0aGlzLmNhbnZhcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmNsb3NlRGl2KSl9fSx7a2V5OlwiX2dldE5ld1RhcmdldE5vZGVcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWYuZGVlcEV4dGVuZCh7fSx0aGlzLm9wdGlvbnMuY29udHJvbE5vZGVTdHlsZSk7aS5pZD1cInRhcmdldE5vZGVcIitmLnJhbmRvbVVVSUQoKSxpLmhpZGRlbj0hMSxpLnBoeXNpY3M9ITEsaS54PXQsaS55PWU7dmFyIG89dGhpcy5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVOb2RlKGkpO3JldHVybiBvLnNoYXBlLmJvdW5kaW5nQm94PXtsZWZ0OnQscmlnaHQ6dCx0b3A6ZSxib3R0b206ZX0sb319LHtrZXk6XCJfY3JlYXRlRWRpdEJ1dHRvblwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5fY2xlYW4oKSx0aGlzLm1hbmlwdWxhdGlvbkRPTT17fSxmLnJlY3Vyc2l2ZURPTURlbGV0ZSh0aGlzLmVkaXRNb2RlRGl2KTt2YXIgdD10aGlzLm9wdGlvbnMubG9jYWxlc1t0aGlzLm9wdGlvbnMubG9jYWxlXSxlPXRoaXMuX2NyZWF0ZUJ1dHRvbihcImVkaXRNb2RlXCIsXCJ2aXMtYnV0dG9uIHZpcy1lZGl0IHZpcy1lZGl0LW1vZGVcIix0LmVkaXR8fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmVkaXQpO3RoaXMuZWRpdE1vZGVEaXYuYXBwZW5kQ2hpbGQoZSksdGhpcy5fYmluZEhhbW1lclRvRGl2KGUsdGhpcy50b2dnbGVFZGl0TW9kZS5iaW5kKHRoaXMpKX19LHtrZXk6XCJfY2xlYW5cIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuaW5Nb2RlPSExLCEwPT09dGhpcy5ndWlFbmFibGVkJiYoZi5yZWN1cnNpdmVET01EZWxldGUodGhpcy5lZGl0TW9kZURpdiksZi5yZWN1cnNpdmVET01EZWxldGUodGhpcy5tYW5pcHVsYXRpb25EaXYpLHRoaXMuX2NsZWFuTWFuaXB1bGF0b3JIYW1tZXJzKCkpLHRoaXMuX2NsZWFudXBUZW1wb3JhcnlOb2Rlc0FuZEVkZ2VzKCksdGhpcy5fdW5iaW5kVGVtcG9yYXJ5VUlzKCksdGhpcy5fdW5iaW5kVGVtcG9yYXJ5RXZlbnRzKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInJlc3RvcmVQaHlzaWNzXCIpfX0se2tleTpcIl9jbGVhbk1hbmlwdWxhdG9ySGFtbWVyc1wiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoMCE9dGhpcy5tYW5pcHVsYXRpb25IYW1tZXJzLmxlbmd0aCl7Zm9yKHZhciB0PTA7dDx0aGlzLm1hbmlwdWxhdGlvbkhhbW1lcnMubGVuZ3RoO3QrKyl0aGlzLm1hbmlwdWxhdGlvbkhhbW1lcnNbdF0uZGVzdHJveSgpO3RoaXMubWFuaXB1bGF0aW9uSGFtbWVycz1bXX19fSx7a2V5OlwiX3JlbW92ZU1hbmlwdWxhdGlvbkRPTVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5fY2xlYW4oKSxmLnJlY3Vyc2l2ZURPTURlbGV0ZSh0aGlzLm1hbmlwdWxhdGlvbkRpdiksZi5yZWN1cnNpdmVET01EZWxldGUodGhpcy5lZGl0TW9kZURpdiksZi5yZWN1cnNpdmVET01EZWxldGUodGhpcy5jbG9zZURpdiksdGhpcy5tYW5pcHVsYXRpb25EaXYmJnRoaXMuY2FudmFzLmZyYW1lLnJlbW92ZUNoaWxkKHRoaXMubWFuaXB1bGF0aW9uRGl2KSx0aGlzLmVkaXRNb2RlRGl2JiZ0aGlzLmNhbnZhcy5mcmFtZS5yZW1vdmVDaGlsZCh0aGlzLmVkaXRNb2RlRGl2KSx0aGlzLmNsb3NlRGl2JiZ0aGlzLmNhbnZhcy5mcmFtZS5yZW1vdmVDaGlsZCh0aGlzLmNsb3NlRGl2KSx0aGlzLm1hbmlwdWxhdGlvbkRpdj12b2lkIDAsdGhpcy5lZGl0TW9kZURpdj12b2lkIDAsdGhpcy5jbG9zZURpdj12b2lkIDB9fSx7a2V5OlwiX2NyZWF0ZVNlcGVyYXRvclwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjE7dGhpcy5tYW5pcHVsYXRpb25ET01bXCJzZXBlcmF0b3JMaW5lRGl2XCIrdF09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLm1hbmlwdWxhdGlvbkRPTVtcInNlcGVyYXRvckxpbmVEaXZcIit0XS5jbGFzc05hbWU9XCJ2aXMtc2VwYXJhdG9yLWxpbmVcIix0aGlzLm1hbmlwdWxhdGlvbkRpdi5hcHBlbmRDaGlsZCh0aGlzLm1hbmlwdWxhdGlvbkRPTVtcInNlcGVyYXRvckxpbmVEaXZcIit0XSl9fSx7a2V5OlwiX2NyZWF0ZUFkZE5vZGVCdXR0b25cIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jcmVhdGVCdXR0b24oXCJhZGROb2RlXCIsXCJ2aXMtYnV0dG9uIHZpcy1hZGRcIix0LmFkZE5vZGV8fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmFkZE5vZGUpO3RoaXMubWFuaXB1bGF0aW9uRGl2LmFwcGVuZENoaWxkKGUpLHRoaXMuX2JpbmRIYW1tZXJUb0RpdihlLHRoaXMuYWRkTm9kZU1vZGUuYmluZCh0aGlzKSl9fSx7a2V5OlwiX2NyZWF0ZUFkZEVkZ2VCdXR0b25cIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jcmVhdGVCdXR0b24oXCJhZGRFZGdlXCIsXCJ2aXMtYnV0dG9uIHZpcy1jb25uZWN0XCIsdC5hZGRFZGdlfHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5hZGRFZGdlKTt0aGlzLm1hbmlwdWxhdGlvbkRpdi5hcHBlbmRDaGlsZChlKSx0aGlzLl9iaW5kSGFtbWVyVG9EaXYoZSx0aGlzLmFkZEVkZ2VNb2RlLmJpbmQodGhpcykpfX0se2tleTpcIl9jcmVhdGVFZGl0Tm9kZUJ1dHRvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NyZWF0ZUJ1dHRvbihcImVkaXROb2RlXCIsXCJ2aXMtYnV0dG9uIHZpcy1lZGl0XCIsdC5lZGl0Tm9kZXx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uZWRpdE5vZGUpO3RoaXMubWFuaXB1bGF0aW9uRGl2LmFwcGVuZENoaWxkKGUpLHRoaXMuX2JpbmRIYW1tZXJUb0RpdihlLHRoaXMuZWRpdE5vZGUuYmluZCh0aGlzKSl9fSx7a2V5OlwiX2NyZWF0ZUVkaXRFZGdlQnV0dG9uXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY3JlYXRlQnV0dG9uKFwiZWRpdEVkZ2VcIixcInZpcy1idXR0b24gdmlzLWVkaXRcIix0LmVkaXRFZGdlfHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5lZGl0RWRnZSk7dGhpcy5tYW5pcHVsYXRpb25EaXYuY
21167XBwZW5kQ2hpbGQoZSksdGhpcy5fYmluZEhhbW1lclRvRGl2KGUsdGhpcy5lZGl0RWRnZU1vZGUuYmluZCh0aGlzKSl9fSx7a2V5OlwiX2NyZWF0ZURlbGV0ZUJ1dHRvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlO2U9dGhpcy5vcHRpb25zLnJ0bD9cInZpcy1idXR0b24gdmlzLWRlbGV0ZS1ydGxcIjpcInZpcy1idXR0b24gdmlzLWRlbGV0ZVwiO3ZhciBpPXRoaXMuX2NyZWF0ZUJ1dHRvbihcImRlbGV0ZVwiLGUsdC5kZWx8fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmRlbCk7dGhpcy5tYW5pcHVsYXRpb25EaXYuYXBwZW5kQ2hpbGQoaSksdGhpcy5fYmluZEhhbW1lclRvRGl2KGksdGhpcy5kZWxldGVTZWxlY3RlZC5iaW5kKHRoaXMpKX19LHtrZXk6XCJfY3JlYXRlQmFja0J1dHRvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NyZWF0ZUJ1dHRvbihcImJhY2tcIixcInZpcy1idXR0b24gdmlzLWJhY2tcIix0LmJhY2t8fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmJhY2spO3RoaXMubWFuaXB1bGF0aW9uRGl2LmFwcGVuZENoaWxkKGUpLHRoaXMuX2JpbmRIYW1tZXJUb0RpdihlLHRoaXMuc2hvd01hbmlwdWxhdG9yVG9vbGJhci5iaW5kKHRoaXMpKX19LHtrZXk6XCJfY3JlYXRlQnV0dG9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpcInZpcy1sYWJlbFwiO3JldHVybiB0aGlzLm1hbmlwdWxhdGlvbkRPTVt0K1wiRGl2XCJdPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5tYW5pcHVsYXRpb25ET01bdCtcIkRpdlwiXS5jbGFzc05hbWU9ZSx0aGlzLm1hbmlwdWxhdGlvbkRPTVt0K1wiTGFiZWxcIl09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLm1hbmlwdWxhdGlvbkRPTVt0K1wiTGFiZWxcIl0uY2xhc3NOYW1lPW8sdGhpcy5tYW5pcHVsYXRpb25ET01bdCtcIkxhYmVsXCJdLmlubmVySFRNTD1pLHRoaXMubWFuaXB1bGF0aW9uRE9NW3QrXCJEaXZcIl0uYXBwZW5kQ2hpbGQodGhpcy5tYW5pcHVsYXRpb25ET01bdCtcIkxhYmVsXCJdKSx0aGlzLm1hbmlwdWxhdGlvbkRPTVt0K1wiRGl2XCJdfX0se2tleTpcIl9jcmVhdGVEZXNjcmlwdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMubWFuaXB1bGF0aW9uRGl2LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZUJ1dHRvbihcImRlc2NyaXB0aW9uXCIsXCJ2aXMtYnV0dG9uIHZpcy1ub25lXCIsdCkpfX0se2tleTpcIl90ZW1wb3JhcnlCaW5kRXZlbnRcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMudGVtcG9yYXJ5RXZlbnRGdW5jdGlvbnMucHVzaCh7ZXZlbnQ6dCxib3VuZEZ1bmN0aW9uOmV9KSx0aGlzLmJvZHkuZW1pdHRlci5vbih0LGUpfX0se2tleTpcIl90ZW1wb3JhcnlCaW5kVUlcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHZvaWQgMD09PXRoaXMuYm9keS5ldmVudExpc3RlbmVyc1t0XSl0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIFVJIGZ1bmN0aW9uIGRvZXMgbm90IGV4aXN0LiBUeXBvPyBZb3UgdHJpZWQ6IFwiK3QrXCIgcG9zc2libGUgYXJlOiBcIisoMCxhLmRlZmF1bHQpKCgwLHMuZGVmYXVsdCkodGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzKSkpO3RoaXMudGVtcG9yYXJ5VUlGdW5jdGlvbnNbdF09dGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzW3RdLHRoaXMuYm9keS5ldmVudExpc3RlbmVyc1t0XT1lfX0se2tleTpcIl91bmJpbmRUZW1wb3JhcnlVSXNcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLnRlbXBvcmFyeVVJRnVuY3Rpb25zKXRoaXMudGVtcG9yYXJ5VUlGdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodCkmJih0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnNbdF09dGhpcy50ZW1wb3JhcnlVSUZ1bmN0aW9uc1t0XSxkZWxldGUgdGhpcy50ZW1wb3JhcnlVSUZ1bmN0aW9uc1t0XSk7dGhpcy50ZW1wb3JhcnlVSUZ1bmN0aW9ucz17fX19LHtrZXk6XCJfdW5iaW5kVGVtcG9yYXJ5RXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMudGVtcG9yYXJ5RXZlbnRGdW5jdGlvbnMubGVuZ3RoO3QrKyl7dmFyIGU9dGhpcy50ZW1wb3JhcnlFdmVudEZ1bmN0aW9uc1t0XS5ldmVudCxpPXRoaXMudGVtcG9yYXJ5RXZlbnRGdW5jdGlvbnNbdF0uYm91bmRGdW5jdGlvbjt0aGlzLmJvZHkuZW1pdHRlci5vZmYoZSxpKX10aGlzLnRlbXBvcmFyeUV2ZW50RnVuY3Rpb25zPVtdfX0se2tleTpcIl9iaW5kSGFtbWVyVG9EaXZcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPW5ldyBtKHQse30pO3Yub25Ub3VjaChpLGUpLHRoaXMubWFuaXB1bGF0aW9uSGFtbWVycy5wdXNoKGkpfX0se2tleTpcIl9jbGVhbnVwVGVtcG9yYXJ5Tm9kZXNBbmRFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnRlbXBvcmFyeUlkcy5lZGdlcy5sZW5ndGg7dCsrKXt0aGlzLmJvZHkuZWRnZXNbdGhpcy50ZW1wb3JhcnlJZHMuZWRnZXNbdF1dLmRpc2Nvbm5lY3QoKSxkZWxldGUgdGhpcy5ib2R5LmVkZ2VzW3RoaXMudGVtcG9yYXJ5SWRzLmVkZ2VzW3RdXTt2YXIgZT10aGlzLmJvZHkuZWRnZUluZGljZXMuaW5kZXhPZih0aGlzLnRlbXBvcmFyeUlkcy5lZGdlc1t0XSk7LTEhPT1lJiZ0aGlzLmJvZHkuZWRnZUluZGljZXMuc3BsaWNlKGUsMSl9Zm9yKHZhciBpPTA7aTx0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlcy5sZW5ndGg7aSsrKXtkZWxldGUgdGhpcy5ib2R5Lm5vZGVzW3RoaXMudGVtcG9yYXJ5SWRzLm5vZGVzW2ldXTt2YXIgbz10aGlzLmJvZHkubm9kZUluZGljZXMuaW5kZXhPZih0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlc1tpXSk7LTEhPT1vJiZ0aGlzLmJvZHkubm9kZUluZGljZXMuc3BsaWNlKG8sMSl9dGhpcy50ZW1wb3JhcnlJZHM9e25vZGVzOltdLGVkZ2VzOltdfX19LHtrZXk6XCJfY29udHJvbE5vZGVUb3VjaFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuc2VsZWN0aW9uSGFuZGxlci51bnNlbGVjdEFsbCgpLHRoaXMubGFzdFRvdWNoPXRoaXMuYm9keS5mdW5jdGlvbnMuZ2V0UG9pbnRlcih0LmNlbnRlciksdGhpcy5sYXN0VG91Y2gudHJhbnNsYXRpb249Zi5leHRlbmQoe30sdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24pfX0se2tleTpcIl9jb250cm9sTm9kZURyYWdTdGFydFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXR
21167oaXMubGFzdFRvdWNoLGk9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9wb2ludGVyVG9Qb3NpdGlvbk9iamVjdChlKSxvPXRoaXMuYm9keS5ub2Rlc1t0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlc1swXV0sbj10aGlzLmJvZHkubm9kZXNbdGhpcy50ZW1wb3JhcnlJZHMubm9kZXNbMV1dLHM9dGhpcy5ib2R5LmVkZ2VzW3RoaXMuZWRnZUJlaW5nRWRpdGVkSWRdO3RoaXMuc2VsZWN0ZWRDb250cm9sTm9kZT12b2lkIDA7dmFyIHI9by5pc092ZXJsYXBwaW5nV2l0aChpKSxhPW4uaXNPdmVybGFwcGluZ1dpdGgoaSk7ITA9PT1yPyh0aGlzLnNlbGVjdGVkQ29udHJvbE5vZGU9byxzLmVkZ2VUeXBlLmZyb209byk6ITA9PT1hJiYodGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlPW4scy5lZGdlVHlwZS50bz1uKSx2b2lkIDAhPT10aGlzLnNlbGVjdGVkQ29udHJvbE5vZGUmJnRoaXMuc2VsZWN0aW9uSGFuZGxlci5zZWxlY3RPYmplY3QodGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3JlZHJhd1wiKX19LHtrZXk6XCJfY29udHJvbE5vZGVEcmFnXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcImRpc2FibGVQaHlzaWNzXCIpO3ZhciBlPXRoaXMuYm9keS5mdW5jdGlvbnMuZ2V0UG9pbnRlcih0LmNlbnRlciksaT10aGlzLmNhbnZhcy5ET010b0NhbnZhcyhlKTtpZih2b2lkIDAhPT10aGlzLnNlbGVjdGVkQ29udHJvbE5vZGUpdGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlLng9aS54LHRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZS55PWkueTtlbHNle3ZhciBvPWUueC10aGlzLmxhc3RUb3VjaC54LG49ZS55LXRoaXMubGFzdFRvdWNoLnk7dGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249e3g6dGhpcy5sYXN0VG91Y2gudHJhbnNsYXRpb24ueCtvLHk6dGhpcy5sYXN0VG91Y2gudHJhbnNsYXRpb24ueStufX10aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3JlZHJhd1wiKX19LHtrZXk6XCJfY29udHJvbE5vZGVEcmFnRW5kXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ib2R5LmZ1bmN0aW9ucy5nZXRQb2ludGVyKHQuY2VudGVyKSxpPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5fcG9pbnRlclRvUG9zaXRpb25PYmplY3QoZSksbz10aGlzLmJvZHkuZWRnZXNbdGhpcy5lZGdlQmVpbmdFZGl0ZWRJZF07aWYodm9pZCAwIT09dGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlKXt0aGlzLnNlbGVjdGlvbkhhbmRsZXIudW5zZWxlY3RBbGwoKTtmb3IodmFyIG49dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZXRBbGxOb2Rlc092ZXJsYXBwaW5nV2l0aChpKSxzPXZvaWQgMCxyPW4ubGVuZ3RoLTE7cj49MDtyLS0paWYobltyXSE9PXRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZS5pZCl7cz10aGlzLmJvZHkubm9kZXNbbltyXV07YnJlYWt9aWYodm9pZCAwIT09cyYmdm9pZCAwIT09dGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlKWlmKCEwPT09cy5pc0NsdXN0ZXIpYWxlcnQodGhpcy5vcHRpb25zLmxvY2FsZXNbdGhpcy5vcHRpb25zLmxvY2FsZV0uY3JlYXRlRWRnZUVycm9yfHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5jcmVhdGVFZGdlRXJyb3IpO2Vsc2V7dmFyIGE9dGhpcy5ib2R5Lm5vZGVzW3RoaXMudGVtcG9yYXJ5SWRzLm5vZGVzWzBdXTt0aGlzLnNlbGVjdGVkQ29udHJvbE5vZGUuaWQ9PT1hLmlkP3RoaXMuX3BlcmZvcm1FZGl0RWRnZShzLmlkLG8udG8uaWQpOnRoaXMuX3BlcmZvcm1FZGl0RWRnZShvLmZyb20uaWQscy5pZCl9ZWxzZSBvLnVwZGF0ZUVkZ2VUeXBlKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInJlc3RvcmVQaHlzaWNzXCIpO3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVkcmF3XCIpfX19LHtrZXk6XCJfaGFuZGxlQ29ubmVjdFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKChuZXcgRGF0ZSkudmFsdWVPZigpLXRoaXMudG91Y2hUaW1lPjEwMCl7dGhpcy5sYXN0VG91Y2g9dGhpcy5ib2R5LmZ1bmN0aW9ucy5nZXRQb2ludGVyKHQuY2VudGVyKSx0aGlzLmxhc3RUb3VjaC50cmFuc2xhdGlvbj1mLmV4dGVuZCh7fSx0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbik7dmFyIGU9dGhpcy5sYXN0VG91Y2gsaT10aGlzLnNlbGVjdGlvbkhhbmRsZXIuZ2V0Tm9kZUF0KGUpO2lmKHZvaWQgMCE9PWkpaWYoITA9PT1pLmlzQ2x1c3RlcilhbGVydCh0aGlzLm9wdGlvbnMubG9jYWxlc1t0aGlzLm9wdGlvbnMubG9jYWxlXS5jcmVhdGVFZGdlRXJyb3J8fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmNyZWF0ZUVkZ2VFcnJvcik7ZWxzZXt2YXIgbz10aGlzLl9nZXROZXdUYXJnZXROb2RlKGkueCxpLnkpO3RoaXMuYm9keS5ub2Rlc1tvLmlkXT1vLHRoaXMuYm9keS5ub2RlSW5kaWNlcy5wdXNoKG8uaWQpO3ZhciBuPXRoaXMuYm9keS5mdW5jdGlvbnMuY3JlYXRlRWRnZSh7aWQ6XCJjb25uZWN0aW9uRWRnZVwiK2YucmFuZG9tVVVJRCgpLGZyb206aS5pZCx0bzpvLmlkLHBoeXNpY3M6ITEsc21vb3RoOntlbmFibGVkOiEwLHR5cGU6XCJjb250aW51b3VzXCIscm91bmRuZXNzOi41fX0pO3RoaXMuYm9keS5lZGdlc1tuLmlkXT1uLHRoaXMuYm9keS5lZGdlSW5kaWNlcy5wdXNoKG4uaWQpLHRoaXMudGVtcG9yYXJ5SWRzLm5vZGVzLnB1c2goby5pZCksdGhpcy50ZW1wb3JhcnlJZHMuZWRnZXMucHVzaChuLmlkKX10aGlzLnRvdWNoVGltZT0obmV3IERhdGUpLnZhbHVlT2YoKX19fSx7a2V5OlwiX2RyYWdDb250cm9sTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYm9keS5mdW5jdGlvbnMuZ2V0UG9pbnRlcih0LmNlbnRlcik7aWYodm9pZCAwIT09dGhpcy50ZW1wb3JhcnlJZHMubm9kZXNbMF0pe3ZhciBpPXRoaXMuYm9keS5ub2Rlc1t0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlc1swXV07aS54PXRoaXMuY2FudmFzLl9YY29udmVydERPTXRvQ2FudmFzKGUueCksaS55PXRoaXMuY2FudmFzLl9ZY29udmVydERPTXRvQ2FudmFzKGUueSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZWRyYXdcIil9ZWxzZXt2YXIgbz1lLngtdGhpcy5sYXN0VG91Y2gue
21167CxuPWUueS10aGlzLmxhc3RUb3VjaC55O3RoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uPXt4OnRoaXMubGFzdFRvdWNoLnRyYW5zbGF0aW9uLngrbyx5OnRoaXMubGFzdFRvdWNoLnRyYW5zbGF0aW9uLnkrbn19fX0se2tleTpcIl9maW5pc2hDb25uZWN0XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ib2R5LmZ1bmN0aW9ucy5nZXRQb2ludGVyKHQuY2VudGVyKSxpPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5fcG9pbnRlclRvUG9zaXRpb25PYmplY3QoZSksbz12b2lkIDA7dm9pZCAwIT09dGhpcy50ZW1wb3JhcnlJZHMuZWRnZXNbMF0mJihvPXRoaXMuYm9keS5lZGdlc1t0aGlzLnRlbXBvcmFyeUlkcy5lZGdlc1swXV0uZnJvbUlkKTtmb3IodmFyIG49dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZXRBbGxOb2Rlc092ZXJsYXBwaW5nV2l0aChpKSxzPXZvaWQgMCxyPW4ubGVuZ3RoLTE7cj49MDtyLS0paWYoLTE9PT10aGlzLnRlbXBvcmFyeUlkcy5ub2Rlcy5pbmRleE9mKG5bcl0pKXtzPXRoaXMuYm9keS5ub2Rlc1tuW3JdXTticmVha310aGlzLl9jbGVhbnVwVGVtcG9yYXJ5Tm9kZXNBbmRFZGdlcygpLHZvaWQgMCE9PXMmJighMD09PXMuaXNDbHVzdGVyP2FsZXJ0KHRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdLmNyZWF0ZUVkZ2VFcnJvcnx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uY3JlYXRlRWRnZUVycm9yKTp2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbb10mJnZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1tzLmlkXSYmdGhpcy5fcGVyZm9ybUFkZEVkZ2UobyxzLmlkKSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZWRyYXdcIil9fSx7a2V5OlwiX2RyYWdTdGFydEVkZ2VcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmxhc3RUb3VjaDt0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcImRyYWdTdGFydFwiLHQsZSx2b2lkIDAsITApfX0se2tleTpcIl9wZXJmb3JtQWRkTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsaT17aWQ6Zi5yYW5kb21VVUlEKCkseDp0LnBvaW50ZXIuY2FudmFzLngseTp0LnBvaW50ZXIuY2FudmFzLnksbGFiZWw6XCJuZXdcIn07aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmFkZE5vZGUpe2lmKDIhPT10aGlzLm9wdGlvbnMuYWRkTm9kZS5sZW5ndGgpdGhyb3cgdGhpcy5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCksbmV3IEVycm9yKFwiVGhlIGZ1bmN0aW9uIGZvciBhZGQgZG9lcyBub3Qgc3VwcG9ydCB0d28gYXJndW1lbnRzIChkYXRhLGNhbGxiYWNrKVwiKTt0aGlzLm9wdGlvbnMuYWRkTm9kZShpLGZ1bmN0aW9uKHQpe251bGwhPT10JiZ2b2lkIDAhPT10JiZcImFkZE5vZGVcIj09PWUuaW5Nb2RlJiYoZS5ib2R5LmRhdGEubm9kZXMuZ2V0RGF0YVNldCgpLmFkZCh0KSxlLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKSl9KX1lbHNlIHRoaXMuYm9keS5kYXRhLm5vZGVzLmdldERhdGFTZXQoKS5hZGQoaSksdGhpcy5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCl9fSx7a2V5OlwiX3BlcmZvcm1BZGRFZGdlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLG89e2Zyb206dCx0bzplfTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuYWRkRWRnZSl7aWYoMiE9PXRoaXMub3B0aW9ucy5hZGRFZGdlLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZnVuY3Rpb24gZm9yIGNvbm5lY3QgZG9lcyBub3Qgc3VwcG9ydCB0d28gYXJndW1lbnRzIChkYXRhLGNhbGxiYWNrKVwiKTt0aGlzLm9wdGlvbnMuYWRkRWRnZShvLGZ1bmN0aW9uKHQpe251bGwhPT10JiZ2b2lkIDAhPT10JiZcImFkZEVkZ2VcIj09PWkuaW5Nb2RlJiYoaS5ib2R5LmR
21167hdGEuZWRnZXMuZ2V0RGF0YVNldCgpLmFkZCh0KSxpLnNlbGVjdGlvbkhhbmRsZXIudW5zZWxlY3RBbGwoKSxpLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKSl9KX1lbHNlIHRoaXMuYm9keS5kYXRhLmVkZ2VzLmdldERhdGFTZXQoKS5hZGQobyksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnVuc2VsZWN0QWxsKCksdGhpcy5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCl9fSx7a2V5OlwiX3BlcmZvcm1FZGl0RWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcyxvPXtpZDp0aGlzLmVkZ2VCZWluZ0VkaXRlZElkLGZyb206dCx0bzplLGxhYmVsOnRoaXMuYm9keS5kYXRhLmVkZ2VzLl9kYXRhW3RoaXMuZWRnZUJlaW5nRWRpdGVkSWRdLmxhYmVsfSxuPXRoaXMub3B0aW9ucy5lZGl0RWRnZTtpZihcIm9iamVjdFwiPT09KHZvaWQgMD09PW4/XCJ1bmRlZmluZWRcIjooMCxkLmRlZmF1bHQpKG4pKSYmKG49bi5lZGl0V2l0aG91dERyYWcpLFwiZnVuY3Rpb25cIj09dHlwZW9mIG4pe2lmKDIhPT1uLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZnVuY3Rpb24gZm9yIGVkaXQgZG9lcyBub3Qgc3VwcG9ydCB0d28gYXJndW1lbnRzIChkYXRhLCBjYWxsYmFjaylcIik7bihvLGZ1bmN0aW9uKHQpe251bGw9PT10fHx2b2lkIDA9PT10fHxcImVkaXRFZGdlXCIhPT1pLmluTW9kZT8oaS5ib2R5LmVkZ2VzW28uaWRdLnVwZGF0ZUVkZ2VUeXBlKCksaS5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZWRyYXdcIiksaS5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCkpOihpLmJvZHkuZGF0YS5lZGdlcy5nZXREYXRhU2V0KCkudXBkYXRlKHQpLGkuc2VsZWN0aW9uSGFuZGxlci51bnNlbGVjdEFsbCgpLGkuc2hvd01hbmlwdWxhdG9yVG9vbGJhcigpKX0pfWVsc2UgdGhpcy5ib2R5LmRhdGEuZWRnZXMuZ2V0RGF0YVNldCgpLnVwZGF0ZShvKSx0aGlzLnNlbGVjdGlvbkhhbmRsZXIudW5zZWxlY3RBbGwoKSx0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKX19XSksdH0oKTtlLmRlZmF1bHQ9Z30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMzApLHM9byhuKSxyPWkoMCksYT1vKHIpLGg9aSgxKSxkPW8oaCksbD1pKDIzOSksdT1vKGwpLGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSxvKXsoMCxhLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5zcHJpbmdMZW5ndGg9aSx0aGlzLnNwcmluZ0NvbnN0YW50PW8sdGhpcy5kaXN0YW5jZVNvbHZlcj1uZXcgdS5kZWZhdWx0fXJldHVybigwLGQuZGVmYXVsdCkodCxbe2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXt0JiYodC5zcHJpbmdMZW5ndGgmJih0aGlzLnNwcmluZ0xlbmd0aD10LnNwcmluZ0xlbmd0aCksdC5zcHJpbmdDb25zdGFudCYmKHRoaXMuc3ByaW5nQ29uc3RhbnQ9dC5zcHJpbmdDb25zdGFudCkpfX0se2tleTpcInNvbHZlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLG89dGhpcy5kaXN0YW5jZVNvbHZlci5nZXREaXN0YW5jZXModGhpcy5ib2R5LHQsZSk7dGhpcy5fY3JlYXRlTF9tYXRyaXgobyksdGhpcy5fY3JlYXRlS19tYXRyaXgobyksdGhpcy5fY3JlYXRlRV9tYXRyaXgoKTtmb3IodmFyIG49MCxyPU1hdGgubWF4KDFlMyxNYXRoLm1pbigxMCp0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoLDZlMykpLGE9MWU5LGg9MCxkPTAsbD0wLHU9MCxjPTA7YT4uMDEmJm48cjspe24rPTE7dmFyIHA9dGhpcy5fZ2V0SGlnaGVzdEVuZXJneU5vZGUoaSksZj0oMCxzLmRlZmF1bHQpKHAsNCk7Zm9yKGg9ZlswXSxhPWZbMV0sZD1mWzJdLGw9ZlszXSx1PWEsYz0wO3U+MSYmYzw1Oyl7Yys9MSx0aGlzLl9tb3ZlTm9kZShoLGQsbCk7dmFyIG09dGhpcy5fZ2V0RW5lcmd5KGgpLHY9KDAscy5kZWZh
21167dWx0KShtLDMpO3U9dlswXSxkPXZbMV0sbD12WzJdfX19fSx7a2V5OlwiX2dldEhpZ2hlc3RFbmVyZ3lOb2RlXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuYm9keS5ub2RlSW5kaWNlcyxpPXRoaXMuYm9keS5ub2RlcyxvPTAsbj1lWzBdLHI9MCxhPTAsaD0wO2g8ZS5sZW5ndGg7aCsrKXt2YXIgZD1lW2hdO2lmKCExPT09aVtkXS5wcmVkZWZpbmVkUG9zaXRpb258fCEwPT09aVtkXS5pc0NsdXN0ZXImJiEwPT09dHx8ITA9PT1pW2RdLm9wdGlvbnMuZml4ZWQueHx8ITA9PT1pW2RdLm9wdGlvbnMuZml4ZWQueSl7dmFyIGw9dGhpcy5fZ2V0RW5lcmd5KGQpLHU9KDAscy5kZWZhdWx0KShsLDMpLGM9dVswXSxwPXVbMV0sZj11WzJdO288YyYmKG89YyxuPWQscj1wLGE9Zil9fXJldHVybltuLG8scixhXX19LHtrZXk6XCJfZ2V0RW5lcmd5XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9KDAscy5kZWZhdWx0KSh0aGlzLkVfc3Vtc1t0XSwyKSxpPWVbMF0sbz1lWzFdO3JldHVybltNYXRoLnNxcnQoTWF0aC5wb3coaSwyKStNYXRoLnBvdyhvLDIpKSxpLG9dfX0se2tleTpcIl9tb3ZlTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG89dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLG49dGhpcy5ib2R5Lm5vZGVzLHM9MCxyPTAsYT0wLGg9blt0XS54LGQ9blt0XS55LGw9dGhpcy5LX21hdHJpeFt0XSx1PXRoaXMuTF9tYXRyaXhbdF0sYz0wO2M8by5sZW5ndGg7YysrKXt2YXIgcD1vW2NdO2lmKHAhPT10KXt2YXIgZj1uW3BdLngsbT1uW3BdLnksdj1sW3BdLGc9dVtwXSx5PTEvTWF0aC5wb3coTWF0aC5wb3coaC1mLDIpK01hdGgucG93KGQtbSwyKSwxLjUpO3MrPXYqKDEtZypNYXRoLnBvdyhkLW0sMikqeSkscis9diooZyooaC1mKSooZC1tKSp5KSxhKz12KigxLWcqTWF0aC5wb3coaC1mLDIpKnkpfX12YXIgYj1zLF89cix3PWUseD1hLGs9aSxTPSh3L2Iray9fKS8oXy9iLXgvXyksRD0tKF8qUyt3KS9iO25bdF0ueCs9RCxuW3RdLnkrPVMsdGhpcy5fdXBkYXRlRV9tYXRyaXgodCl9fSx7a2V5OlwiX2NyZWF0ZUxfbWF0cml4XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLGk9dGhpcy5zcHJpbmdMZW5ndGg7dGhpcy5MX21hdHJpeD1bXTtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl7dGhpcy5MX21hdHJpeFtlW29dXT17fTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0aGlzLkxfbWF0cml4W2Vbb11dW2Vbbl1dPWkqdFtlW29dXVtlW25dXX19fSx7a2V5OlwiX2NyZWF0ZUtfbWF0cml4XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLGk9dGhpcy5zcHJpbmdDb25zdGFudDt0aGlzLktfbWF0cml4PVtdO2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7bysrKXt0aGlzLktfbWF0cml4W2Vbb11dPXt9O2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXRoaXMuS19tYXRyaXhbZVtvXV1bZVtuXV09aSpNYXRoLnBvdyh0W2Vbb11dW2Vbbl1dLC0yKX19fSx7a2V5OlwiX2NyZWF0ZUVfbWF0cml4XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJvZHkubm9kZUluZGljZXMsZT10aGlzLmJvZHkubm9kZXM7dGhpcy5FX21hdHJpeD17fSx0aGlzLkVfc3Vtcz17fTtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKyl0aGlzLkVfbWF0cml4W3RbaV1dPVtdO2Zvcih2YXIgbz0wO288dC5sZW5ndGg7bysrKXtmb3IodmFyIG49dFtvXSxzPWVbbl0ueCxyPWVbbl0ueSxhPTAsaD0wLGQ9bztkPHQubGVuZ3RoO2QrKyl7dmFyIGw9dFtkXTtpZihsIT09bil7dmFyIHU9ZVtsXS54LGM9ZVtsXS55LHA9MS9NYXRoLnNxcnQoTWF0aC5wb3cocy11LDIpK01hdGgucG93KHItYywyKSk7dGhpcy5FX21hdHJpeFtuXVtkXT1bdGhpcy5LX21hdHJpeFtuXVtsXSoocy11LXRoaXMuTF9tYXRyaXhbbl1bbF0qKHMtdSkqcCksdGhpcy5LX21hdHJpeFtuXVtsXSooci1jLXRoaXMuTF9tYXRyaXhbbl1bbF0qKHItYykqcCldLHRoaXMuRV9tYXRyaXhbbF1bb109dGhpcy5FX21hdHJpeFtuXVtkXSxhKz10aGlzLkVfbWF0cml4W25dW2RdWzBdLGgrPXRoaXMuRV9tYXRyaXhbbl1bZF1bMV19fXRoaXMuRV9zdW1zW25dPVthLGhdfX19LHtrZXk6XCJfdXBkYXRlRV9tYXRyaXhcIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLGk9dGhpcy5ib2R5Lm5vZGVzLG89dGhpcy5FX21hdHJpeFt0XSxuPXRoaXMuS19tYXRyaXhbdF0scz10aGlzLkxfbWF0cml4W3RdLHI9aVt0XS54LGE9aVt0XS55LGg9MCxkPTAsbD0wO2w8ZS5sZW5ndGg7bCsrKXt2YXIgdT1lW2xdO2lmKHUhPT10KXt2YXIgYz1vW2xdLHA9Y1swXSxmPWNbMV0sbT1pW3VdLngsdj1pW3VdLnksZz0xL01hdGguc3FydChNYXRoLnBvdyhyLW0sMikrTWF0aC5wb3coYS12LDIpKSx5PW5bdV0qKHItbS1zW3VdKihyLW0pKmcpLGI9blt1XSooYS12LXNbdV0qKGEtdikqZyk7b1tsXT1beSxiXSxoKz15LGQrPWI7dmFyIF89dGhpcy5FX3N1bXNbdV07X1swXSs9eS1wLF9bMV0rPWItZn19dGhpcy5FX3N1bXNbdF09W2gsZF19fV0pLHR9KCk7ZS5kZWZhdWx0PWN9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDApLHM9byhuKSxyPWkoMSksYT1vKHIpLGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7KDAscy5kZWZhdWx0KSh0aGlzLHQpfXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleTpcImdldERpc3RhbmNlc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG89e30sbj10LmVkZ2VzLHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHI9ZVtzXSxhPXt9O29bcl09YTtmb3IodmFyIGg9MDtoPGUubGVuZ3RoO2grKylhW2VbaF1dPXM9PWg/MDoxZTl9Zm9yKHZhciBkPTA7ZDxpLmxlbmd0aDtkKyspe3ZhciBsPW5baVtkXV07ITA9PT1sLmNvbm5lY3RlZCYmdm9pZCAwIT09b1tsLmZyb21JZF0mJnZvaWQgMCE9PW9bbC50b0lkXSYmKG9bbC5mcm9tSWRdW2wudG9JZF09MSxvW2wudG9JZF1bbC5mcm9tSWRdPTEpfWZvcih2YXIgdT1lLmxlbmd0aCxjPTA7Yzx1O2MrKylmb3IodmFyIHA9ZVtjXSxmPW9bcF0sbT0wO208dS0xO20rKylmb3IodmFyIHY9ZVttXSxnPW9bdl0seT1tKzE7eTx1O3krKyl7dmFyIGI9ZVt5XSxfPW9bYl0sdz1NYXRoLm1pbihnW2JdLGdbcF0rZltiXSk7Z1tiXT13LF9bdl09d31yZXR1cm4gb319XSksdH0oKTtlLmRlZmF1bHQ9aH1dKX0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmlzLm1hcCIsIihmdW5jdGlvbihyb290LGZhY3Rvcnkpe2lmKHR5cGVvZiBkZWZpbmU9PT1cImZ1bmN0aW9uXCImJmRlZmluZS5hbWQpe2RlZmluZShmYWN0b3J5KX1lbHNlIGlmKHR5cGVvZiBleHBvcnRzPT09XCJvYmplY3RcIil7bW9kdWxlLmV4cG9ydHM9ZmFjdG9yeSgpfWVsc2V7ZmFjdG9yeSgpKHJvb3QubHVucil9fSkodGhpcyxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsdW5yKXtsdW5yLnN0ZW1tZXJTdXBwb3J0PXtBbW9uZzpmdW5jdGlvbihzLHN1YnN0cmluZ19pLHJlc3VsdCxtZXRob2Qpe3RoaXMudG9DaGFyQXJyYXk9ZnVuY3Rpb24ocyl7dmFyIHNMZW5ndGg9cy5sZW5ndGgsY2hhckFycj1uZXcgQXJyYXkoc0xlbmd0aCk7Zm9yKHZhciBpPTA7aTxzTGVuZ3RoO2krKyljaGFyQXJyW2ldPXMuY2hhckNvZGVBdChpKTtyZXR1cm4gY2hhckFycn07aWYoIXMmJnMhPVwiXCJ8fCFzdWJzdHJpbmdfaSYmc3Vic3RyaW5nX2khPTB8fCFyZXN1bHQpdGhyb3dcIkJhZCBBbW9uZyBpbml0aWFsaXNhdGlvbjogczpcIitzK1wiLCBzdWJzdHJpbmdfaTogXCIrc3Vic3RyaW5nX2krXCIsIHJlc3VsdDogXCIrcmVzdWx0O3RoaXMuc19zaXplPX
21167MubGVuZ3RoO3RoaXMucz10aGlzLnRvQ2hhckFycmF5KHMpO3RoaXMuc3Vic3RyaW5nX2k9c3Vic3RyaW5nX2k7dGhpcy5yZXN1bHQ9cmVzdWx0O3RoaXMubWV0aG9kPW1ldGhvZH0sU25vd2JhbGxQcm9ncmFtOmZ1bmN0aW9uKCl7dmFyIGN1cnJlbnQ7cmV0dXJue2JyYTowLGtldDowLGxpbWl0OjAsY3Vyc29yOjAsbGltaXRfYmFja3dhcmQ6MCxzZXRDdXJyZW50OmZ1bmN0aW9uKHdvcmQpe2N1cnJlbnQ9d29yZDt0aGlzLmN1cnNvcj0wO3RoaXMubGltaXQ9d29yZC5sZW5ndGg7dGhpcy5saW1pdF9iYWNrd2FyZD0wO3RoaXMuYnJhPXRoaXMuY3Vyc29yO3RoaXMua2V0PXRoaXMubGltaXR9LGdldEN1cnJlbnQ6ZnVuY3Rpb24oKXt2YXIgcmVzdWx0PWN1cnJlbnQ7Y3VycmVudD1udWxsO3JldHVybiByZXN1bHR9LGluX2dyb3VwaW5nOmZ1bmN0aW9uKHMsbWluLG1heCl7aWYodGhpcy5jdXJzb3I8dGhpcy5saW1pdCl7dmFyIGNoPWN1cnJlbnQuY2hhckNvZGVBdCh0aGlzLmN1cnNvcik7aWYoY2g8PW1heCYmY2g+PW1pbil7Y2gtPW1pbjtpZihzW2NoPj4zXSYxPDwoY2gmNykpe3RoaXMuY3Vyc29yKys7cmV0dXJuIHRydWV9fX1yZXR1cm4gZmFsc2V9LGluX2dyb3VwaW5nX2I6ZnVuY3Rpb24ocyxtaW4sbWF4KXtpZih0aGlzLmN1cnNvcj50aGlzLmxpbWl0X2JhY2t3YXJkKXt2YXIgY2g9Y3VycmVudC5jaGFyQ29kZUF0KHRoaXMuY3Vyc29yLTEpO2lmKGNoPD1tYXgmJmNoPj1taW4pe2NoLT1taW47aWYoc1tjaD4+M10mMTw8KGNoJjcpKXt0aGlzLmN1cnNvci0tO3JldHVybiB0cnVlfX19cmV0dXJuIGZhbHNlfSxvdXRfZ3JvdXBpbmc6ZnVuY3Rpb24ocyxtaW4sbWF4KXtpZih0aGlzLmN1cnNvcjx0aGlzLmxpbWl0KXt2YXIgY2g9Y3VycmVudC5jaGFyQ29kZUF0KHRoaXMuY3Vyc29yKTtpZihjaD5tYXh8fGNoPG1pbil7dGhpcy5jdXJzb3IrKztyZXR1cm4gdHJ1ZX1jaC09bWluO2lmKCEoc1tjaD4+M10mMTw8KGNoJjcpKSl7dGhpcy5jdXJzb3IrKztyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfSxvdXRfZ3JvdXBpbmdfYjpmdW5jdGlvbihzLG1pbixtYXgpe2lmKHRoaXMuY3Vyc29yPnRoaXMubGltaXRfYmFja3dhcmQpe3ZhciBjaD1jdXJyZW50LmNoYXJDb2RlQXQodGhpcy5jdXJzb3ItMSk7aWYoY2g+bWF4fHxjaDxtaW4pe3RoaXMuY3Vyc29yLS07cmV0dXJuIHRydWV9Y2gtPW1pbjtpZighKHNbY2g+PjNdJjE8PChjaCY3KSkpe3RoaXMuY3Vyc29yLS07cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX0sZXFfczpmdW5jdGlvbihzX3NpemUscyl7aWYodGhpcy5saW1pdC10aGlzLmN1cnNvcjxzX3NpemUpcmV0dXJuIGZhbHNlO2Zvcih2YXIgaT0wO2k8c19zaXplO2krKylpZihjdXJyZW50LmNoYXJDb2RlQXQodGhpcy5jdXJzb3IraSkhPXMuY2hhckNvZGVBdChpKSlyZXR1cm4gZmFsc2U7dGhpcy5jdXJzb3IrPXNfc2l6ZTtyZXR1cm4gdHJ1ZX0sZXFfc19iOmZ1bmN0aW9uKHNfc2l6ZSxzKXtpZih0aGlzLmN1cnNvci10aGlzLmxpbWl0X2JhY2t3YXJkPHNfc2l6ZSlyZXR1cm4gZmFsc2U7Zm9yKHZhciBpPTA7aTxzX3NpemU7aSsrKWlmKGN1cnJlbnQuY2hhckNvZGVBdCh0aGlzLmN1cnNvci1zX3NpemUraSkhPXMuY2hhckNvZGVBdChpKSlyZXR1cm4gZmFsc2U7dGhpcy5jdXJzb3ItPXNfc2l6ZTtyZXR1cm4gdHJ1ZX0sZmluZF9hbW9uZzpmdW5jdGlvbih2LHZfc2l6ZSl7dmFyIGk9MCxqPXZfc2l6ZSxjPXRoaXMuY3Vyc29yLGw9dGhpcy5saW1pdCxjb21tb25faT0wLGNvbW1vbl9qPTAsZmlyc3Rfa2V5X2luc3BlY3RlZD1mYWxzZTt3aGlsZSh0cnVlKXt2YXIgaz1pKyhqLWk+PjEpLGRpZmY9MCxjb21tb249Y29tbW9uX2k8Y29tbW9uX2o/Y29tbW9uX2k6Y29tbW9uX2osdz12W2tdO2Zvcih2YXIgaTI9Y29tbW9uO2kyPHcuc19zaXplO2kyKyspe2lmKGMrY29tbW9uPT1sKXtkaWZmPS0xO2JyZWFrfWRpZmY9Y3VycmVudC5jaGFyQ29kZUF0KGMrY29tbW9uKS13LnNbaTJdO2lmKGRpZmYpYnJlYWs7Y29tbW9uKyt9aWYoZGlmZjwwKXtqPWs7Y29tbW9uX2o9Y29tbW9ufWVsc2V7aT1rO2NvbW1vbl9pPWNvbW1vbn1pZihqLWk8PTEpe2lmKGk+MHx8aj09aXx8Zmlyc3Rfa2V5X2luc3BlY3RlZClicmVhaztmaXJzdF9rZXlfaW5zcGVjdGVkPXRydWV9fXdoaWxlKHRydWUpe3ZhciB3PXZbaV07aWYoY29tbW9uX2k+PXcuc19zaXplKXt0aGlzLmN1cnNvcj1jK3cuc19zaXplO2lmKCF3Lm1ldGhvZClyZXR1cm4gdy5yZXN1bHQ7dmFyIHJlcz13Lm1ldGhvZCgpO3RoaXMuY3Vyc29yPWMrdy5zX3NpemU7aWYocmVzKXJldHVybiB3LnJlc3VsdH1pPXcuc3Vic3RyaW5nX2k7aWYoaTwwKXJldHVybiAwfX0sZmluZF9hbW9uZ19iOmZ1bmN0aW9uKHYsdl9zaXplKXt2YXIgaT0wLGo9dl9zaXplLGM9dGhpcy5jdXJzb3IsbGI9dGhpcy5saW1pdF9iYWNrd2FyZCxjb21tb25faT0wLGNvbW1vbl9qPTAsZmlyc3Rfa2V5X2luc3BlY3RlZD1mYWxzZTt3aGlsZSh0cnVlKXt2YXIgaz1pKyhqLWk+PjEpLGRpZmY9MCxjb21tb249Y29tbW9uX2k8Y29tbW9uX2o/Y29tbW9uX2k6Y29tbW9uX2osdz12W2tdO2Zvcih2YXIgaTI9dy5zX3NpemUtMS1jb21tb247aTI+PTA7aTItLSl7aWYoYy1jb21tb249PWxiKXtkaWZmPS0xO2JyZWFrfWRpZmY9Y3VycmVudC5jaGFyQ29kZUF0KGMtMS1jb21tb24pLXcuc1tpMl07aWYoZGlmZilicmVhaztjb21tb24rK31pZihkaWZmPDApe2o9aztjb21tb25faj1jb21tb259ZWxzZXtpPWs7Y29tbW9uX2k9Y29tbW9ufWlmKGotaTw9MSl7aWYoaT4wfHxqPT1pfHxmaXJzdF9rZXlfaW5zcGVjdGVkKWJyZWFrO2ZpcnN0X2tleV9pbnNwZWN0ZWQ9dHJ1ZX19d2hpbGUodHJ1ZSl7dmFyIHc9dltpXTtpZihjb21tb25faT49dy5zX3NpemUpe3RoaXMuY3Vyc29yPWMtdy5zX3NpemU7aWYoIXcubWV0aG9kKXJldHVybiB3LnJlc3VsdDt2YXIgcmVzPXcubWV0aG9kKCk7dGhpcy5jdXJzb3I9Yy13LnNfc2l6ZTtpZihyZXMpcmV0dXJuIHcucmVzdWx0fWk9dy5zdWJzdHJpbmdfaTtpZihpPDApcmV0dXJuIDB9fSxyZXBsYWNlX3M6ZnVuY3Rpb24oY19icmEsY19rZXQscyl7dmFyIGFkanVzdG1lbnQ9cy5sZW5ndGgtKGNfa2V0LWNfYnJhKSxsZWZ0PWN1cnJlbnQuc3Vic3RyaW5nKDAsY19icmEpLHJpZ2h0PWN1cnJlbnQuc3Vic3RyaW5nKGNfa2V0KTtjdXJyZW50PWxlZnQrcytyaWdodDt
211670aGlzLmxpbWl0Kz1hZGp1c3RtZW50O2lmKHRoaXMuY3Vyc29yPj1jX2tldCl0aGlzLmN1cnNvcis9YWRqdXN0bWVudDtlbHNlIGlmKHRoaXMuY3Vyc29yPmNfYnJhKXRoaXMuY3Vyc29yPWNfYnJhO3JldHVybiBhZGp1c3RtZW50fSxzbGljZV9jaGVjazpmdW5jdGlvbigpe2lmKHRoaXMuYnJhPDB8fHRoaXMuYnJhPnRoaXMua2V0fHx0aGlzLmtldD50aGlzLmxpbWl0fHx0aGlzLmxpbWl0PmN1cnJlbnQubGVuZ3RoKXRocm93XCJmYXVsdHkgc2xpY2Ugb3BlcmF0aW9uXCJ9LHNsaWNlX2Zyb206ZnVuY3Rpb24ocyl7dGhpcy5zbGljZV9jaGVjaygpO3RoaXMucmVwbGFjZV9zKHRoaXMuYnJhLHRoaXMua2V0LHMpfSxzbGljZV9kZWw6ZnVuY3Rpb24oKXt0aGlzLnNsaWNlX2Zyb20oXCJcIil9LGluc2VydDpmdW5jdGlvbihjX2JyYSxjX2tldCxzKXt2YXIgYWRqdXN0bWVudD10aGlzLnJlcGxhY2VfcyhjX2JyYSxjX2tldCxzKTtpZihjX2JyYTw9dGhpcy5icmEpdGhpcy5icmErPWFkanVzdG1lbnQ7aWYoY19icmE8PXRoaXMua2V0KXRoaXMua2V0Kz1hZGp1c3RtZW50fSxzbGljZV90bzpmdW5jdGlvbigpe3RoaXMuc2xpY2VfY2hlY2soKTtyZXR1cm4gY3VycmVudC5zdWJzdHJpbmcodGhpcy5icmEsdGhpcy5rZXQpfSxlcV92X2I6ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuZXFfc19iKHMubGVuZ3RoLHMpfX19fX19KTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpIDpcbiAgKGZhY3RvcnkoZ2xvYmFsLmpRdWVyeSkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gICQuZm4uZGF0ZXBpY2tlci5sYW5ndWFnZXNbJ2ZyLUZSJ10gPSB7XG4gICAgZm9ybWF0OiAnZGQvbW0veXl5eScsXG4gICAgZGF5czogWydEaW1hbmNoZScsICdMdW5kaScsICdNYXJkaScsICdNZXJjcmVkaScsICdKZXVkaScsICdWZW5kcmVkaScsICdTYW1lZGknXSxcbiAgICBkYXlzU2hvcnQ6IFsnRGltJywgJ0x1bicsICdNYXInLCAnTWVyJywgJ0pldScsICdWZW4nLCAnU2FtJ10sXG4gICAgZGF5c01pbjogWydEaScsICdMdScsICdNYScsICdNZScsICdKZScsICdWZScsICdTYSddLFxuICAgIHdlZWtTdGFydDogMSxcbiAgICBtb250aHM6IFsnSmFudmllcicsICdGw6l2cmllcicsICdNYXJzJywgJ0F2cmlsJywgJ01haScsICdKdWluJywgJ0p1aWxsZXQnLCAnQW91dCcsICdTZXB0ZW1icmUnLCAnT2N0b2JyZScsICdOb3ZlbWJyZScsICdEw6ljZW1icmUnXSxcbiAgICBtb250aHNTaG9ydDogWydKYW4nLCAnRmV2JywgJ01hcicsICdBdnInLCAnTWFpJywgJ0p1bicsICdKdWknLCAnQW91JywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddXG4gIH07XG59KSkpO1xuIiwiKGZ1bmN0aW9uKHJvb3QsZmFjdG9yeSl7aWYodHlwZW9mIGRlZmluZT09PVwiZnVuY3Rpb25cIiYmZGVmaW5lLmFtZCl7ZGVmaW5lKGZhY3RvcnkpfWVsc2UgaWYodHlwZW9mIGV4cG9ydHM9PT1cIm9iamVjdFwiKXttb2R1bGUuZXhwb3J0cz1mYWN0b3J5KCl9ZWxzZXtmYWN0b3J5KCkocm9vdC5sdW5yKX19KSh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGx1bnIpe2lmKFwidW5kZWZpbmVkXCI9PT10eXBlb2YgbHVucil7dGhyb3cgbmV3IEVycm9yKFwiTHVuciBpcyBub3QgcHJlc2VudC4gUGxlYXNlIGluY2x1ZGUgLyByZXF1aXJlIEx1bnIgYmVmb3JlIHRoaXMgc2NyaXB0LlwiKX1pZihcInVuZGVmaW5lZFwiPT09dHlwZW9mIGx1bnIuc3RlbW1lclN1cHBvcnQpe3Rocm93IG5ldyBFcnJvcihcIkx1bnIgc3RlbW1lciBzdXBwb3J0IGlzIG5vdCBwcmVzZW50LiBQbGVhc2UgaW5jbHVkZSAvIHJlcXVpcmUgTHVuciBzdGVtbWVyIHN1cHBvcnQgYmVmb3JlIHRoaXMgc2NyaXB0LlwiKX1sdW5yLmZyPWZ1bmN0aW9uKCl7dGhpcy5waXBlbGluZS5yZXNldCgpO3RoaXMucGlwZWxpbmUuYWRkKGx1bnIuZnIuc3RvcFdvcmRGaWx0ZXIsbHVuci5mci5zdGVtbWVyKX07bHVuci5mci5zdGVtbWVyPWZ1bmN0aW9uKCl7dmFyIEFtb25nPWx1bnIuc3RlbW1lclN1cHBvcnQuQW1vbmcsU25vd2JhbGxQcm9ncmFtPWx1bnIuc3RlbW1lclN1cHBvcnQuU25vd2JhbGxQcm9ncmFtLHN0PW5ldyBmdW5jdGlvbiBGcmVuY2hTdGVtbWVyKCl7dmFyIGFfMD1bbmV3IEFtb25nKFwiY29sXCIsLTEsLTEpLG5ldyBBbW9uZyhcInBhclwiLC0xLC0xKSxuZXcgQW1vbmcoXCJ0YXBcIiwtMSwtMSldLGFfMT1bbmV3IEFtb25nKFwiXCIsLTEsNCksbmV3IEFtb25nKFwiSVwiLDAsMSksbmV3IEFtb25nKFwiVVwiLDAsMiksbmV3IEFtb25nKFwiWVwiLDAsMyldLGFfMj1bbmV3IEFtb25nKFwiaXFVXCIsLTEsMyksbmV3IEFtb25nKFwiYWJsXCIsLTEsMyksbmV3IEFtb25nKFwiScOoclwiLC0xLDQpLG5ldyBBbW9uZyhcImnDqHJcIiwtMSw0KSxuZXcgQW1vbmcoXCJldXNcIiwtMSwyKSxuZXcgQW1vbmcoXCJpdlwiLC0xLDEpXSxhXzM9W25ldyBBbW9uZyhcImljXCIsLTEsMiksbmV3IEFtb25nKFwiYWJpbFwiLC0xLDEpLG5ldyBBbW9uZyhcIml2XCIsLTEsMyldLGFfND1bbmV3IEFtb25nKFwiaXFVZVwiLC0xLDEpLG5ldyBBbW9uZyhcImF0cmljZVwiLC0xLDIpLG5ldyBBbW9uZyhcImFuY2VcIiwtMSwxKSxuZXcgQW1vbmcoXCJlbmNlXCIsLTEsNSksbmV3IEFtb25nKFwibG9naWVcIiwtMSwzKSxuZXcgQW1vbmcoXCJhYmxlXCIsLTEsMSksbmV3IEFtb25nKFwiaXNtZVwiLC0xLDEpLG5ldyBBbW9uZyhcImV1c2VcIiwtMSwxMSksbmV3IEFtb25nKFwiaXN0ZVwiLC0xLDEpLG5ldyBBbW9uZyhcIml2ZVwiLC0xLDgpLG5ldyBBbW9uZyhcImlmXCIsLTEsOCksbmV3IEFtb25nKFwidXNpb25cIiwtMSw0KSxuZXcgQW1vbmcoXCJhdGlvblwiLC0xLDIpLG5ldyBBbW9uZyhcInV0aW9uXCIsLTEsNCksbmV3IEFtb25nKFwiYXRldXJcIiwtMSwyKSxuZXcgQW1vbmcoXCJpcVVlc1wiLC0xLDEpLG5ldyBBbW9uZyhcImF0cmljZXNcIiwtMSwyKSxuZXcgQW1vbmcoXCJhbmNlc1wiLC0xLDEpLG5ldyBBbW9uZyhcImVuY2VzXCIsLTEsNSksbmV3IEFtb25nKFwibG9naWVzXCIsLTEsMyksbmV3IEFtb25nKFwiYWJsZXNcIiwtMSwxKSxuZXcgQW1vbmcoXCJpc21lc1wiLC0xLDEpLG5ldyBBbW9uZyhcImV1c2VzXCIsLTEsMTEpLG5ldyBBbW9uZyhcImlzdGVzXCIsLTEsMSksbmV3IEFtb25nKFwiaXZlc1wiLC0xLDgpLG5ldyBBbW9uZyhcImlmc1wiLC0xLDgpLG5ldyBBbW9uZyhcInVzaW9uc1wiLC0xLDQpLG5ldyBBbW9uZyhcImF0aW9uc1wiLC0xLDIpLG5ldyBBbW9uZyhcInV0aW9uc1wiLC0xLDQpLG5ldyBBbW9uZyhcImF0ZXVyc1wiLC0xLDIpLG5ldyBBbW9uZyhcIm1lbnRzXCIsLTEsMTUpLG5ldyBBbW9uZyhcImVtZW50c1wiLDMwLDYpLG5ldyBBbW9uZyhcImlzc2VtZW50c1wiLDMxLDEyKSxuZXcgQW1vbmcoXCJpdMOpc1wiLC0xLDcpLG5ldyBBbW9uZyhcIm1lbnRcIiwtMSwxNSksbmV3IEFtb25nKFwiZW1lbnRcIiwzNCw2KSxuZXcgQW1vbmcoXCJpc3NlbWVudFwiLDM1LDEyKSxuZXcgQW1vbmcoXCJhbW1lbnRcIiwzNCwxMyksbmV3IEFtb25nKFwiZW1tZW50XCIsMzQsMTQpLG5ldyBBbW9uZyhcImF1eFwiLC0xLDEwKSxuZXcgQW1vbmcoXCJlYXV4XCIsMzksOSksbmV3IEFtb25nKFwiZXV4XCIsLTEsMSksbmV3IEFtb25nKFwiaXTDqVwiLC0xLDcpXSxhXzU9W25ldyBBbW9uZyhcImlyYVwiLC0xLDEpLG5ldyBBbW9uZyhcImllXCIsLTEsMSksbmV3IEFtb25nKFwiaXNzZVwiLC0xLDEpLG5ldyBBbW9uZyhcImlzc2FudGVcIiwtMSwxKSxuZXcgQW1vbmcoXCJpXCIsLTEsMSksbmV3IEFtb25nKFwiaXJhaVwiLDQsMSksbmV3IEFtb25nKFwiaXJcIiwtMSwxKSxuZXcgQW1vbmcoXCJpcmFzXCIsLTEsMSksbmV3IEFtb25nKFwiaWVzXCIsLTEsMSksbmV3IEFtb25nKFwiw65tZXNcIiwtMSwxKSxuZXcgQW1vbmcoXCJpc3Nlc1wiLC0xLDEpLG5ldyBBbW9uZyhcImlzc2FudGVzXCIsLTEsMSksbmV3IEFtb25nKFwiw650ZXNcIiwtMSwxKSxuZXcgQW1vbmcoXCJpc1wiLC0xLDEpLG5ldyBBbW9uZyhcImlyYWlzXCIsMTMsMSksbmV3IEFtb25nKFwiaXNzYWlzXCIsMTMsMSksbmV3IEFtb25nKFwiaXJpb25zXCIsLTEsMSksbmV3IEFtb25nKFwiaXNzaW9uc1wiLC0xLDEpLG5ldyBBbW9uZyhcImlyb25zXCIsLTEsMSksbmV3IEFtb25nKFwiaXNzb25zXCIsLTEsMSksbmV3IEFtb25nKFwiaXNzYW50c1wiLC0xLDEpLG5ldyBBbW9uZyhcIml0XCIsLTEsMSksbmV3IEFtb25nKFwiaXJhaXRcIiwyMSwxKSxuZXcgQW1vbmcoXCJpc3NhaXRcIiwyMSwxKSxuZXcgQW1vbmcoXCJpc3NhbnRcIiwtMSwxKSxuZXcgQW1vbmcoXCJpcmFJZW50XCIsLTEsMSksbmV3IEFtb25nKFwiaXNzYUllbnRcIiwtMSwxKSxuZXcgQW1vbmcoXCJpcmVudFwiLC0xLDEpLG5ldyBBbW9uZyhcImlzc2VudFwiLC0xLDEpLG5ldyBBbW9uZyhcImlyb250XCIsLTEsMSksbmV3IEFtb25nKFwiw650XCIsLTEsMSksbmV3IEFtb25nKFwiaXJpZXpcIiwtMSwxKSxuZXcgQW1vbmcoXCJpc3NpZXpcIiwtMSwxKSxuZXcgQW1vbmcoXCJpcmV6XCIsLTEsMSksbmV3IEFtb25nKFwiaXNzZXpcIiwtMSwxKV0sYV82PVtuZXcgQW1vbmcoXCJhXCIsLTEsMyksbmV3IEFtb25nKFwiZXJhXCIsMCwyKSxuZXcgQW1vbmcoXCJhc3NlXCIsLTEsMyksbmV3IEFtb25nKFwiYW50ZVwiLC0xLDMpLG5ldyBBbW9uZyhcIsOpZVwiLC0xLDIpLG5ldyBBbW9uZyhcImFpXCIsLTEsMyksbmV3IEFtb25nKFwiZXJhaVwiLDUsMiksbmV3IEFtb25nKFwiZXJcIiwtMSwyKSxuZXcgQW1vbmcoXCJhc1wiLC0xLDMpLG5ldyBBbW9uZyhcImVyYXNcIiw4LDIpLG5ldyBBbW9uZyhcIsOibWVzXCIsLTEsMyksbmV3IEFtb25nKFwiYXNzZXNcIiwtMSwzKSxuZXcgQW1vbmcoXCJhbnRlc1wiLC0xLDMpLG5ldyBBbW9uZyhcIsOidGVzXCIsLTEsMyksbmV3IEFtb25nKFwiw6llc1wiLC0xLDIpLG5ldyBBbW9uZyhcImFpc1wiLC0xLDMpLG5ldyBBbW9uZyhcImVyYWlzXCIsMTUsMiksbmV3IEFtb25nKFwiaW9uc1wiLC0xLDEpLG5ldyBBbW9uZyhcImVyaW9uc1wiLDE3LDIpLG5ldyBBbW9uZyhcImFzc2lvbnNcIiwxNywzKSxuZXcgQW1vbmcoXCJlcm9uc1wiLC0xLDIpLG5ldyBBbW9uZyhcImFudHNcIiwtMSwzKSxuZXcgQW1vbmcoXCLDqXNcIiwtMSwyKSxuZXcgQW1vbmcoXCJhaXRcIiwtMSwzKSxuZXcgQW1vbmcoXCJlcmFpdFwiLDIzLDIpLG5ldyBBbW9uZyhcImFudFwiLC0xLDMpLG5ldyBBbW9uZyhcImFJZW50XCIsLTEsMyksbmV3IEFtb25nKFwiZXJhSWVudFwiLDI2LDIpLG5ldyBBbW9uZyhcIsOocmVudFwiLC0xLDIpLG5ldyBBbW9uZyhcImFzc2VudFwiLC0xLDMpLG5ldyBBbW9uZyhcImVyb250XCIsLTEsMiksbmV3IEFtb25nKFwiw6J0XCIsLTEsMyksbmV3IEFtb25nKFwiZXpcIiwtMSwyKSxuZXcgQW1vbmcoXCJpZXpcIiwzMiwyKSxuZXcgQW1vbmcoXCJlcmllelwiLDMzLDIpLG5ldyBBbW9uZyhcImFzc2llelwiLDMzLDMpLG5ldyBBbW9uZyhcImVyZXpcIiwzMiwyKSxuZXcgQW1vbmcoXCLDqVwiLC0xLDIpXSxhXzc9W25ldyBBbW9uZyhcImVcIiwtMSwzKSxuZXcgQW1vbmcoXCJJw6hyZVwiLDAsMiksbmV3IEFtb25nKFwiacOocmVcIiwwLDIpLG5ldyBBbW9uZyhcImlvblwiLC0xLDEpLG5ldyBBbW9uZyhcIkllclwiLC0xLDIpLG5ldyBBbW9uZyhcImllclwiLC0xLDIpLG5ldyBBbW9uZyhcIsOrXCIsLTEsNCldLGFfOD1bbmV3IEFtb25nKFwiZWxsXCIsLTEsLTEpLG5ldyBBbW9uZyhcImVpbGxcIiwtMSwtMSksbmV3IEFtb25nKFwiZW5uXCIsLTEsLTEpLG5ldyBBbW9uZyhcIm9ublwiLC0xLC0xKSxuZXcgQW1vbmcoXCJldHRcIiwtMSwtMSldLGdfdj1bMTcsNjUsMTYsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTI4L
21167DEzMCwxMDMsOCw1XSxnX2tlZXBfd2l0aF9zPVsxLDY1LDIwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTI4XSxJX3AyLElfcDEsSV9wVixzYnA9bmV3IFNub3diYWxsUHJvZ3JhbTt0aGlzLnNldEN1cnJlbnQ9ZnVuY3Rpb24od29yZCl7c2JwLnNldEN1cnJlbnQod29yZCl9O3RoaXMuZ2V0Q3VycmVudD1mdW5jdGlvbigpe3JldHVybiBzYnAuZ2V0Q3VycmVudCgpfTtmdW5jdGlvbiBoYWJyMShjMSxjMix2XzEpe2lmKHNicC5lcV9zKDEsYzEpKXtzYnAua2V0PXNicC5jdXJzb3I7aWYoc2JwLmluX2dyb3VwaW5nKGdfdiw5NywyNTEpKXtzYnAuc2xpY2VfZnJvbShjMik7c2JwLmN1cnNvcj12XzE7cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX1mdW5jdGlvbiBoYWJyMihjMSxjMix2XzEpe2lmKHNicC5lcV9zKDEsYzEpKXtzYnAua2V0PXNicC5jdXJzb3I7c2JwLnNsaWNlX2Zyb20oYzIpO3NicC5jdXJzb3I9dl8xO3JldHVybiB0cnVlfXJldHVybiBmYWxzZX1mdW5jdGlvbiByX3ByZWx1ZGUoKXt2YXIgdl8xLHZfMjt3aGlsZSh0cnVlKXt2XzE9c2JwLmN1cnNvcjtpZihzYnAuaW5fZ3JvdXBpbmcoZ192LDk3LDI1MSkpe3NicC5icmE9c2JwLmN1cnNvcjt2XzI9c2JwLmN1cnNvcjtpZihoYWJyMShcInVcIixcIlVcIix2XzEpKWNvbnRpbnVlO3NicC5jdXJzb3I9dl8yO2lmKGhhYnIxKFwiaVwiLFwiSVwiLHZfMSkpY29udGludWU7c2JwLmN1cnNvcj12XzI7aWYoaGFicjIoXCJ5XCIsXCJZXCIsdl8xKSljb250aW51ZX1zYnAuY3Vyc29yPXZfMTtzYnAuYnJhPXZfMTtpZighaGFicjEoXCJ5XCIsXCJZXCIsdl8xKSl7c2JwLmN1cnNvcj12XzE7aWYoc2JwLmVxX3MoMSxcInFcIikpe3NicC5icmE9c2JwLmN1cnNvcjtpZihoYWJyMihcInVcIixcIlVcIix2XzEpKWNvbnRpbnVlfXNicC5jdXJzb3I9dl8xO2lmKHZfMT49c2JwLmxpbWl0KXJldHVybjtzYnAuY3Vyc29yKyt9fX1mdW5jdGlvbiBoYWJyMygpe3doaWxlKCFzYnAuaW5fZ3JvdXBpbmcoZ192LDk3LDI1MSkpe2lmKHNicC5jdXJzb3I+PXNicC5saW1pdClyZXR1cm4gdHJ1ZTtzYnAuY3Vyc29yKyt9d2hpbGUoIXNicC5vdXRfZ3JvdXBpbmcoZ192LDk3LDI1MSkpe2lmKHNicC5jdXJzb3I+PXNicC5saW1pdClyZXR1cm4gdHJ1ZTtzYnAuY3Vyc29yKyt9cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIHJfbWFya19yZWdpb25zKCl7dmFyIHZfMT1zYnAuY3Vyc29yO0lfcFY9c2JwLmxpbWl0O0lfcDE9SV9wVjtJX3AyPUlfcFY7aWYoc2JwLmluX2dyb3VwaW5nKGdfdiw5NywyNTEpJiZzYnAuaW5fZ3JvdXBpbmcoZ192LDk3LDI1MSkmJnNicC5jdXJzb3I8c2JwLmxpbWl0KXNicC5jdXJzb3IrKztlbHNle3NicC5jdXJzb3I9dl8xO2lmKCFzYnAuZmluZF9hbW9uZyhhXzAsMykpe3NicC5jdXJzb3I9dl8xO2Rve2lmKHNicC5jdXJzb3I+PXNicC5saW1pdCl7c2JwLmN1cnNvcj1JX3BWO2JyZWFrfXNicC5jdXJzb3IrK313aGlsZSghc2JwLmluX2dyb3VwaW5nKGdfdiw5NywyNTEpKX19SV9wVj1zYnAuY3Vyc29yO3NicC5jdXJzb3I9dl8xO2lmKCFoYWJyMygpKXtJX3AxPXNicC5jdXJzb3I7aWYoIWhhYnIzKCkpSV9wMj1zYnAuY3Vyc29yfX1mdW5jdGlvbiByX3Bvc3RsdWRlKCl7dmFyIGFtb25nX3Zhcix2XzE7d2hpbGUodHJ1ZSl7dl8xPXNicC5jdXJzb3I7c2JwLmJyYT12XzE7YW1vbmdfdmFyPXNicC5maW5kX2Ftb25nKGFfMSw0KTtpZighYW1vbmdfdmFyKWJyZWFrO3NicC5rZXQ9c2JwLmN1cnNvcjtzd2l0Y2goYW1vbmdfdmFyKXtjYXNlIDE6c2JwLnNsaWNlX2Zyb20oXCJpXCIpO2JyZWFrO2Nhc2UgMjpzYnAuc2xpY2VfZnJvbShcInVcIik7YnJlYWs7Y2FzZSAzOnNicC5zbGljZV9mcm9tKFwieVwiKTticmVhaztjYXNlIDQ6aWYoc2JwLmN1cnNvcj49c2JwLmxpbWl0KXJldHVybjtzYnAuY3Vyc29yKys7YnJlYWt9fX1mdW5jdGlvbiByX1JWKCl7cmV0dXJuIElfcFY8PXNicC5jdXJzb3J9ZnVuY3Rpb24gcl9SMSgpe3JldHVybiBJX3AxPD1zYnAuY3Vyc29yfWZ1bmN0aW9uIHJfUjIoKXtyZXR1cm4gSV9wMjw9c2JwLmN1cnNvcn1mdW5jdGlvbiByX3N0YW5kYXJkX3N1ZmZpeCgpe3ZhciBhbW9uZ192YXIsdl8xO3NicC5rZXQ9c2JwLmN1cnNvcjthbW9uZ192YXI9c2JwLmZpbmRfYW1vbmdfYihhXzQsNDMpO2lmKGFtb25nX3Zhcil7c2JwLmJyYT1zYnAuY3Vyc29yO3N3aXRjaC
21167hhbW9uZ192YXIpe2Nhc2UgMTppZighcl9SMigpKXJldHVybiBmYWxzZTtzYnAuc2xpY2VfZGVsKCk7YnJlYWs7Y2FzZSAyOmlmKCFyX1IyKCkpcmV0dXJuIGZhbHNlO3NicC5zbGljZV9kZWwoKTtzYnAua2V0PXNicC5jdXJzb3I7aWYoc2JwLmVxX3NfYigyLFwiaWNcIikpe3NicC5icmE9c2JwLmN1cnNvcjtpZighcl9SMigpKXNicC5zbGljZV9mcm9tKFwiaXFVXCIpO2Vsc2Ugc2JwLnNsaWNlX2RlbCgpfWJyZWFrO2Nhc2UgMzppZighcl9SMigpKXJldHVybiBmYWxzZTtzYnAuc2xpY2VfZnJvbShcImxvZ1wiKTticmVhaztjYXNlIDQ6aWYoIXJfUjIoKSlyZXR1cm4gZmFsc2U7c2JwLnNsaWNlX2Zyb20oXCJ1XCIpO2JyZWFrO2Nhc2UgNTppZighcl9SMigpKXJldHVybiBmYWxzZTtzYnAuc2xpY2VfZnJvbShcImVudFwiKTticmVhaztjYXNlIDY6aWYoIXJfUlYoKSlyZXR1cm4gZmFsc2U7c2JwLnNsaWNlX2RlbCgpO3NicC5rZXQ9c2JwLmN1cnNvcjthbW9uZ192YXI9c2JwLmZpbmRfYW1vbmdfYihhXzIsNik7aWYoYW1vbmdfdmFyKXtzYnAuYnJhPXNicC5jdXJzb3I7c3dpdGNoKGFtb25nX3Zhcil7Y2FzZSAxOmlmKHJfUjIoKSl7c2JwLnNsaWNlX2RlbCgpO3NicC5rZXQ9c2JwLmN1cnNvcjtpZihzYnAuZXFfc19iKDIsXCJhdFwiKSl7c2JwLmJyYT1zYnAuY3Vyc29yO2lmKHJfUjIoKSlzYnAuc2xpY2VfZGVsKCl9fWJyZWFrO2Nhc2UgMjppZihyX1IyKCkpc2JwLnNsaWNlX2RlbCgpO2Vsc2UgaWYocl9SMSgpKXNicC5zbGljZV9mcm9tKFwiZXV4XCIpO2JyZWFrO2Nhc2UgMzppZihyX1IyKCkpc2JwLnNsaWNlX2RlbCgpO2JyZWFrO2Nhc2UgNDppZihyX1JWKCkpc2JwLnNsaWNlX2Zyb20oXCJpXCIpO2JyZWFrfX1icmVhaztjYXNlIDc6aWYoIXJfUjIoKSlyZXR1cm4gZmFsc2U7c2JwLnNsaWNlX2RlbCgpO3NicC5rZXQ9c2JwLmN1cnNvcjthbW9uZ192YXI9c2JwLmZpbmRfYW1vbmdfYihhXzMsMyk7aWYoYW1vbmdfdmFyKXtzYnAuYnJhPXNicC5jdXJzb3I7c3dpdGNoKGFtb25nX3Zhcil7Y2FzZSAxOmlmKHJfUjIoKSlzYnAuc2xpY2VfZGVsKCk7ZWxzZSBzYnAuc2xpY2VfZnJvbShcImFibFwiKTticmVhaztjYXNlIDI6aWYocl9SMigpKXNicC5zbGljZV9kZWwoKTtlbHNlIHNicC5zbGljZV9mcm9tKFwiaXFVXCIpO2JyZWFrO2Nhc2UgMzppZihyX1IyKCkpc2JwLnNsaWNlX2RlbCgpO2JyZWFrfX1icmVhaztjYXNlIDg6aWYoIXJfUjIoKSlyZXR1cm4gZmFsc2U7c2JwLnNsaWNlX2RlbCgpO3NicC5rZXQ9c2JwLmN1cnNvcjtpZihzYnAuZXFfc19iKDIsXCJhdFwiKSl7c2JwLmJyYT1zYnAuY3Vyc29yO2lmKHJfUjIoKSl7c2JwLnNsaWNlX2RlbCgpO3NicC5rZXQ9c2JwLmN1cnNvcjtpZihzYnAuZXFfc19iKDIsXCJpY1wiKSl7c2JwLmJyYT1zYnAuY3Vyc29yO2lmKHJfUjIoKSlzYnAuc2xpY2VfZGVsKCk7ZWxzZSBzYnAuc2xpY2VfZnJvbShcImlxVVwiKTt
21167icmVha319fWJyZWFrO2Nhc2UgOTpzYnAuc2xpY2VfZnJvbShcImVhdVwiKTticmVhaztjYXNlIDEwOmlmKCFyX1IxKCkpcmV0dXJuIGZhbHNlO3NicC5zbGljZV9mcm9tKFwiYWxcIik7YnJlYWs7Y2FzZSAxMTppZihyX1IyKCkpc2JwLnNsaWNlX2RlbCgpO2Vsc2UgaWYoIXJfUjEoKSlyZXR1cm4gZmFsc2U7ZWxzZSBzYnAuc2xpY2VfZnJvbShcImV1eFwiKTticmVhaztjYXNlIDEyOmlmKCFyX1IxKCl8fCFzYnAub3V0X2dyb3VwaW5nX2IoZ192LDk3LDI1MSkpcmV0dXJuIGZhbHNlO3NicC5zbGljZV9kZWwoKTticmVhaztjYXNlIDEzOmlmKHJfUlYoKSlzYnAuc2xpY2VfZnJvbShcImFudFwiKTtyZXR1cm4gZmFsc2U7Y2FzZSAxNDppZihyX1JWKCkpc2JwLnNsaWNlX2Zyb20oXCJlbnRcIik7cmV0dXJuIGZhbHNlO2Nhc2UgMTU6dl8xPXNicC5saW1pdC1zYnAuY3Vyc29yO2lmKHNicC5pbl9ncm91cGluZ19iKGdfdiw5NywyNTEpJiZyX1JWKCkpe3NicC5jdXJzb3I9c2JwLmxpbWl0LXZfMTtzYnAuc2xpY2VfZGVsKCl9cmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfXJldHVybiBmYWxzZX1mdW5jdGlvbiByX2lfdmVyYl9zdWZmaXgoKXt2YXIgYW1vbmdfdmFyLHZfMTtpZihzYnAuY3Vyc29yPElfcFYpcmV0dXJuIGZhbHNlO3ZfMT1zYnAubGltaXRfYmFja3dhcmQ7c2JwLmxpbWl0X2JhY2t3YXJkPUlfcFY7c2JwLmtldD1zYnAuY3Vyc29yO2Ftb25nX3Zhcj1zYnAuZmluZF9hbW9uZ19iKGFfNSwzNSk7aWYoIWFtb25nX3Zhcil7c2JwLmxpbWl0X2JhY2t3YXJkPXZfMTtyZXR1cm4gZmFsc2V9c2JwLmJyYT1zYnAuY3Vyc29yO2lmKGFtb25nX3Zhcj09MSl7aWYoIXNicC5vdXRfZ3JvdXBpbmdfYihnX3YsOTcsMjUxKSl7c2JwLmxpbWl0X2JhY2t3YXJkPXZfMTtyZXR1cm4gZmFsc2V9c2JwLnNsaWNlX2RlbCgpfXNicC5saW1pdF9iYWNrd2FyZD12XzE7cmV0dXJuIHRydWV9ZnVuY3Rpb24gcl92ZXJiX3N1ZmZpeCgpe3ZhciBhbW9uZ192YXIsdl8yLHZfMztpZihzYnAuY3Vyc29yPElfcFYpcmV0dXJuIGZhbHNlO3ZfMj1zYnAubGltaXRfYmFja3dhcmQ7c2JwLmxpbWl0X2JhY2t3YXJkPUlfcFY7c2JwLmtldD1zYnAuY3Vyc29yO2Ftb25nX3Zhcj1zYnAuZmluZF9hbW9uZ19iKGFfNiwzOCk7aWYoIWFtb25nX3Zhcil7c2JwLmxpbWl0X2JhY2t3YXJkPXZfMjtyZXR1cm4gZmFsc2V9c2JwLmJyYT1zYnAuY3Vyc29yO3N3aXRjaC
21167hhbW9uZ192YXIpe2Nhc2UgMTppZighcl9SMigpKXtzYnAubGltaXRfYmFja3dhcmQ9dl8yO3JldHVybiBmYWxzZX1zYnAuc2xpY2VfZGVsKCk7YnJlYWs7Y2FzZSAyOnNicC5zbGljZV9kZWwoKTticmVhaztjYXNlIDM6c2JwLnNsaWNlX2RlbCgpO3ZfMz1zYnAubGltaXQtc2JwLmN1cnNvcjtzYnAua2V0PXNicC5jdXJzb3I7aWYoc2JwLmVxX3NfYigxLFwiZVwiKSl7c2JwLmJyYT1zYnAuY3Vyc29yO3NicC5zbGljZV9kZWwoKX1lbHNlIHNicC5jdXJzb3I9c2JwLmxpbWl0LXZfMzticmVha31zYnAubGltaXRfYmFja3dhcmQ9dl8yO3JldHVybiB0cnVlfWZ1bmN0aW9uIHJfcmVzaWR1YWxfc3VmZml4KCl7dmFyIGFtb25nX3Zhcix2XzE9c2JwLmxpbWl0LXNicC5jdXJzb3Isdl8yLHZfNCx2XzU7c2JwLmtldD1zYnAuY3Vyc29yO2lmKHNicC5lcV9zX2IoMSxcInNcIikpe3NicC5icmE9c2JwLmN1cnNvcjt2XzI9c2JwLmxpbWl0LXNicC5jdXJzb3I7aWYoc2JwLm91dF9ncm91cGluZ19iKGdfa2VlcF93aXRoX3MsOTcsMjMyKSl7c2JwLmN1cnNvcj1zYnAubGltaXQtdl8yO3NicC5zbGljZV9kZWwoKX1lbHNlIHNicC5jdXJzb3I9c2JwLmxpbWl0LXZfMX1lbHNlIHNicC5jdXJzb3I9c2JwLmxpbWl0LXZfMTtpZihzYnAuY3Vyc29yPj1JX3BWKXt2XzQ9c2JwLmxpbWl0X2JhY2t3YXJkO3NicC5saW1pdF9iYWNrd2FyZD1JX3BWO3NicC5rZXQ9c2JwLmN1cnNvcjthbW9uZ192YXI9c2JwLmZpbmRfYW1vbmdfYihhXzcsNyk7aWYoYW1vbmdfdmFyKXtzYnAuYnJhPXNicC5jdXJzb3I7c3dpdGNoKGFtb25nX3Zhcil7Y2FzZSAxOmlmKHJfUjIoKSl7dl81PXNicC5saW1pdC1zYnAuY3Vyc29yO2lmKCFzYnAuZXFfc19iKDEsXCJzXCIpKXtzYnAuY3Vyc29yPXNicC5saW1pdC12XzU7aWYoIXNicC5lcV9zX2IoMSxcInRcIikpYnJlYWt9c2JwLnNsaWNlX2RlbCgpfWJyZWFrO2Nhc2UgMjpzYnAuc2xpY2VfZnJvbShcImlcIik7YnJlYWs7Y2FzZSAzOnNicC5zbGljZV9kZWwoKTticmVhaztjYXNlIDQ6aWYoc2JwLmVxX3NfYigyLFwiZ3VcIikpc2JwLnNsaWNlX2RlbCgpO2JyZWFrfX1zYnAubGltaXRfYmFja3dhcmQ9dl80fX1mdW5jdGlvbiByX3VuX2RvdWJsZSgpe3ZhciB2XzE9c2JwLmxpbWl0LXNicC5jdXJzb3I7aWYoc2JwLmZpbmRfYW1vbmdfYihhXzgsNSkpe3NicC5jdXJzb3I9c2JwLmxpbWl0LXZfMTtzYnAua2V0PXNicC5jdXJzb3I7aWYoc2JwLmN1cnNvcj5zYnAubGltaXRfYmFja3dhcmQpe3NicC5jdXJzb3ItLTtzYnAuYnJhPXNicC5jdXJzb3I7c2JwLnNsaWNlX2RlbCgpfX19ZnVuY3Rpb24gcl91bl9hY2NlbnQoKXt2YXIgdl8xLHZfMj0xO3doaWxlKHNicC5vdXRfZ3JvdXBpbmdfYihnX3YsOTcsMjUxKSl2XzItLTtpZih2XzI8PTApe3NicC5rZXQ9c2JwLmN1cnNvcjt2XzE9c2JwLmxpbWl0LXNicC5jdXJzb3I7aWYoIXNicC5lcV9zX2IoMSxcIsOpXCIpKXtzYnAuY3Vyc29yPXNicC5saW1pdC12XzE7aWYoIXNicC5lcV9zX2IoMSxcIsOoXCIpKXJldHVybn1zYnAuYnJhPXNicC5jdXJzb3I7c2JwLnNsaWNlX2Zyb20oXCJlXCIpfX1mdW5jdGlvbiBoYWJyNSgpe2lmKCFyX3N0YW5kYXJkX3N1ZmZpeCgpKXtzYnAuY3Vyc29yPXNicC5saW1pdDtpZighcl9pX3ZlcmJfc3VmZml4KCkpe3NicC5jdXJzb3I9c2JwLmxpbWl0O2lmKCFyX3ZlcmJfc3VmZml4KCkpe3NicC5jdXJzb3I9c2JwLmxpbWl0O3JfcmVzaWR1YWxfc3VmZml4KCk7cmV0dXJufX19c2JwLmN1cnNvcj1zYnAubGltaXQ7c2JwLmtldD1zYnAuY3Vyc29yO2lmKHNicC5lcV9zX2IoMSxcIllcIikpe3NicC5icmE9c2JwLmN1cnNvcjtzYnAuc2xpY2VfZnJvbShcImlcIil9ZWxzZXtzYnAuY3Vyc29yPXNicC5saW1pdDtpZihzYnAuZXFfc19iKDEsXCLDp1wiKSl7c2JwLmJyYT1zYnAuY3Vyc29yO3NicC5zbGljZV9mcm9tKFwiY1wiKX19fXRoaXMuc3RlbT1mdW5jdGlvbigpe3ZhciB2XzE9c2JwLmN1cnNvcjtyX3ByZWx1ZGUoKTtzYnAuY3Vyc29yPXZfMTtyX21hcmtfcmVnaW9ucygpO3NicC5saW1pdF9iYWNrd2FyZD12XzE7c2JwLmN1cnNvcj1zYnAubGltaXQ7aGFicjUoKTtzYnAuY3Vyc29yPXNicC5saW1pdDtyX3VuX2RvdWJsZSgpO3NicC5jdXJzb3I9c2JwLmxpbWl0O3JfdW5fYWNjZW50KCk7c2JwLmN1cnNvcj1zYnAubGltaXRfYmFja3dhcmQ7cl9wb3N0bHVkZSgpO3JldHVybiB0cnVlfX07cmV0dXJuIGZ1bmN0aW9uKHdvcmQpe3N0LnNldEN1cnJlbnQod29yZCk7c3Quc3RlbSgpO3JldHVybiBzdC5nZXRDdXJyZW50KCl9fSgpO2x1bnIuUGlwZWxpbmUucmVnaXN0ZXJGdW5jdGlvbihsdW5yLmZyLnN0ZW1tZXIsXCJzdGVtbWVyLWZyXCIpO2x1bnIuZnIuc3RvcFdvcmRGaWx0ZXI9ZnVuY3Rpb24odG9rZW4pe2lmKGx1bnIuZnIuc3RvcFdvcmRGaWx0ZXIuc3RvcFdvcmRzLmluZGV4T2YodG9rZW4pPT09LTEpe3JldHVybiB0b2tlbn19O2x1bnIuZnIuc3RvcFdvcmRGaWx0ZXIuc3RvcFdvcmRzPW5ldyBsdW5yLlNvcnRlZFNldDtsdW5yLmZyLnN0b3BXb3JkRmlsdGVyLnN0b3BXb3Jkcy5sZW5ndGg9MTY0O2x1bnIuZnIuc3RvcFdvcmRGaWx0ZXIuc3RvcFdvcmRzLmVsZW1lbnRzPVwiIGFpIGFpZSBhaWVudCBhaWVzIGFpdCBhcyBhdSBhdXJhIGF1cmFpIGF1cmFpZW50IGF1cmFpcyBhdXJhaXQgYXVyYXMgYXVyZXogYXVyaWV6IGF1cmlvbnMgYXVyb25zIGF1cm9udCBhdXggYXZhaWVudCBhdmFpcyBhdmFpdCBhdmVjIGF2ZXogYXZpZXogYXZpb25zIGF2b25zIGF5YW50IGF5ZXogYXlvbnMgYyBjZSBjZWNpIGNlbMOgIGNlcyBjZXQgY2V0dGUgZCBkYW5zIGRlIGRlcyBkdSBlbGxlIGVuIGVzIGVzdCBldCBldSBldWUgZXVlcyBldXJlbnQgZXVzIGV1c3NlIGV1c3NlbnQgZXVzc2VzIGV1c3NpZXogZXVzc2lvbnMgZXV0IGV1eCBlw7ttZXMgZcO7dCBlw7t0ZXMgZnVyZW50IGZ1cyBmdXNzZSBmdXNzZW50IGZ1c3NlcyBmdXNzaWV6IGZ1c3Npb25zIGZ1dCBmw7ttZXMgZsO7dCBmw7t0ZXMgaWNpIGlsIGlscyBqIGplIGwgbGEgbGUgbGVzIGxldXIgbGV1cnMgbHVpIG0gbWEgbWFpcyBtZSBtZXMgbW9pIG1vbiBtw6ptZSBuIG5lIG5vcyBub3RyZSBub3VzIG9uIG9udCBvdSBwYXIgcGFzIHBvdXIgcXUgcXVlIHF1ZWwgcXVlbGxlIHF1ZWxsZXMgcXVlbHMgcXVpIHMgc2Egc2FucyBzZSBzZXJhIHNlcmFpIHNlcmFpZW50IHNlcmFpcyBzZXJhaXQgc2VyYXMgc2VyZXogc2VyaWV6IHNlcmlvbnMgc2Vyb25zIHNlcm9udCBzZXMgc29pIHNvaWVudCBzb2lzIHNvaXQgc29tbWVzIHNvbiBzb250IHNveWV6IHNveW9ucyBzdWlzIHN1ciB0IHRhIHRlIHRlcyB0b2kgdG9uIHR1IHVuIHVuZSB2b3Mgdm90cmUgdm91cyB5IMOgIMOpdGFpZW50IMOpdGFpcyDDqXRhaXQgw6l0YW50IMOpdGlleiDDqXRpb25zIMOpdMOpIMOpdMOpZSDDqXTDqWVzIMOpdMOpcyDDqnRlc1wiLnNwbGl0KFwiIFwiKTtsdW5yLlBpcGVsaW5lLnJlZ2lzdGVyRnVuY3Rpb24obHVuci5mci5zdG9wV29yZEZpbHRlcixcInN0b3BXb3JkRmlsdGVyLWZyXCIpfX0pO1xuIiwiKGZ1bmN0aW9uICgkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgd2luZG93LmRh
21167dGFMYXllciA9IHdpbmRvdy5kYXRhTGF5ZXIgfHwgW107XG4gICAgd2luZG93LmRhdGFMYXllci5wdXNoKHtcbiAgICAgICAgZXZlbnQ6ICdqUXVlcnlMb2FkZWQnXG4gICAgfSk7XG5cbiAgICAkLmZuLmNmRGF0ZXBpY2tlciA9ICQuZm4uZGF0ZXBpY2tlci5ub0NvbmZsaWN0KCk7XG5cbiAgICBpZiAod2luZG93LnN0YXRpYykge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VhcmNoYm94X19mb3JtX19pbnB1dCcpLmZvckVhY2goZnVuY3Rpb24gKHNlYXJjaEZpZWxkKSB7XG4gICAgICAgICAgICBhdXRvY29tcGxldGUoc2VhcmNoRmllbGQsIFtcbiAgICAgICAgICAgICAgICAnQXBwZWxzIMOgIHByb2pldHMgZ8OpbsOpcmlxdWUnLFxuICAgICAgICAgICAgICAgICdBcHBlbCDDoCBwcm9qZXRzIHNww6ljaWZpcXVlJyxcbiAgICAgICAgICAgICAgICAnQXBwZWxzIMOgIHByb2pldHMgJiBpbnZlc3Rpc3NlbWVudHMgZOKAmWF2ZW5pcicsXG4gICAgICAgICAgICAgICAgJ1Byb2pldHMgZmluYW5jw6lzJyxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mKE5vZGVMaXN0LnByb3RvdHlwZS5mb3JFYWNoKSE9PXR5cGVvZihhbGVydCkpIHtcbiAgICAgICAgTm9kZUxpc3QucHJvdG90eXBlLmZvckVhY2g9QXJyYXkucHJvdG90eXBlLmZvckVhY2g7XG4gICAgfVxuICAgIFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWctZG93bmxvYWQnKS5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgdGFnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZScpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGxldCAkYm9keSA9ICQoJ2JvZHknKTtcbiAgICAkYm9keS5vbignY2hhbmdlJywgJy5zaXRlcy1zZWxlY3RfX3NlbGVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbG9jYXRpb24uYXNzaWduKHRoaXMuc2VsZWN0ZWRPcHRpb25zWzBdLnZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8vIEdlc3Rpb24gZGVzIGNhdMOpZ29yaWVzIGRhbnMgbGEgRkFRXG4gICAgbGV0ICRjaGVja2JveGVzID0gJCgnLmZvcm0tY2hlY2tib3gtc3R5bGVkJyk7XG4gICAgaWYgKCRjaGVja2JveGVzLmxlbmd0aCkge1xuICAgICAgICB2Y
21167XIgY2F0ZWdvcmllcyA9IFtdO1xuICAgICAgICB2YXIgY2F0ZWdvcmllc0h0bWwgPSBbXTtcbiAgICAgICAgdmFyIGNwdCA9IDE7XG4gICAgICAgICQoJy5jYXJkIC5jYXRlZ29yaWVzIC50YWctdHlwZScpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGh0bWwgPSAnJztcbiAgICAgICAgICAgIGlmICgkLmluQXJyYXkoJCh0aGlzKS5odG1sKCksIGNhdGVnb3JpZXMpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGh0bWwgPSAnPGxhYmVsIGZvcj1cImNoZWNrYm94JyArIGNwdCArICdcIiBjbGFzcz1cInRhZy1pbnB1dC1jaGVja2JveFwiPic7XG4gICAgICAgICAgICAgICAgaHRtbCArPSAnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiY2hlY2tib3gnICsgY3B0ICsgJ1wiIG5hbWU9XCJ0eXBlMlwiPic7XG4gICAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInRhZy1pbnB1dC1jaGVja2JveF9fYmdcIj48L2Rpdj4nO1xuICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxzcGFuPicgKyAkKHRoaXMpLmh0bWwoKSArICc8L3NwYW4+JztcbiAgICAgICAgICAgICAgICBodG1sICs9ICc8L2xhYmVsPic7XG5cbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzLnB1c2goJCh0aGlzKS5odG1sKCkpO1xuICAgICAgICAgICAgICAgIGNhdGVnb3JpZXNIdG1sLnB1c2goaHRtbCk7XG4gICAgICAgICAgICAgICAgY3B0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgICRjaGVja2JveGVzLmh0bWwoY2F0ZWdvcmllc0h0bWwpO1xuXG4gICAgICAgIC8vIEdlc3Rpb24gZGUgbCdhZmZpY2hhZ2UgZGVzIHF1ZXN0aW9ucyBncsOiY2UgYXUgZmlsdHJlIGRlcyBjYXTDqWdvcmllc1xuICAgICAgICAkYm9keS5vbignY2xpY2snLCAnLnRhZy1pbnB1dC1jaGVja2JveCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICB2Y
21167XIgY2F0ZWdvcnkgPSAnJztcbiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCAkY2hlY2tib3ggPSAkKCcudGFnLWlucHV0LWNoZWNrYm94Jyk7XG4gICAgICAgICAgICAkY2hlY2tib3guZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCQodGhpcykuZmluZCgnaW5wdXQnKS5wcm9wKCdjaGVja2VkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAkY2hlY2tib3guZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gJCh0aGlzKS5maW5kKCdzcGFuJykuaHRtbCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5maW5kKCdpbnB1dCcpLnByb3AoJ2NoZWNrZWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmNhcmQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5maW5kKCcuY2F0ZWdvcmllcyAudGFnLXR5cGUnKS5odG1sKCkgPT09IGNhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmNhcmQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5maW5kKCcuY2F0ZWdvcmllcyAudGFnLXR5cGUnKS5odG1sKCkgPT09IGNhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQoJy5jYXJkJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcykuc2hvdygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59KShqUXVlcnkpO1xuIiwiZnVuY3Rpb24gYXV0b2NvbXBsZXRlKGlucHV0LCBhcnIpIHtcbiAgICBsZXQgY3VycmVudEZvY3VzLFxuICAgICAgICAkaXRlbWxpc3QgPSBbXSxcbiAgICAgICAgJHJlc3VsdHMgPSBqUXVlcnkoaW5wdXQpLmNsb3Nlc3QoJy5zZWFyY2gtZm9ybScpLnBhcmVudCgpLmZpbmQoJy5zZWFyY2gtcmVzdWx0cycpLFxuICAgICAgICAkZm9ybSA9IGpRdWVyeShpbnB1dCkuY2xvc2VzdCgnZm9ybScpLFxuICAgICAgICBjbG9zZVRpbWVvdXQgPSBudWxsO1xuXG4gICAgbGV0IGFkZEFjdGl2ZSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGlmICgheCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJlbW92ZUFjdGl2ZSh4KTtcblxuICAgICAgICBpZiAoY3VycmVudEZvY3VzID49IHgubGVuZ3RoKSBjdXJyZW50Rm9jdXMgPSAwO1xuICAgICAgICBpZiAoY3VycmVudEZvY3VzIDwgMCkgY3VycmVudEZvY3VzID0gKHgubGVuZ3RoIC0gMSk7XG5cbiAgICAgICAgeFtjdXJyZW50Rm9jdXNdLmNsYXNzTGlzdC5hZGQoJ2hvdmVyJyk7XG4gICAgfTtcblxuICAgIGxldCByZW1vdmVBY3RpdmUgPSBmdW5jdGlvbih4KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgeFtpXS5jbGFzc0xpc3QucmVtb3ZlKCdob3ZlcicpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGxldCBjbG9zZUFsbExpc3RzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChjbG9zZVRpbWVvdXQpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoY2xvc2VUaW1lb3V0KTtcbiAgICAgICAgICAgIGNsb3NlVGltZW91dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCRpdGVtbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICRpdGVtbGlzdC5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE5vZGUgJiYgdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgJGl0ZW1saXN0ID0gW107XG4gICAgICAgICRyZXN1bHRzLmhpZGUoKTtcbiAgICB9O1xuXG4gICAgaW5wdXQuc2V0Q2hvaWNlcyA9IGZ1bmN0aW9uKGNob2ljZXMpIHtcbiAgICAgICAgY3VycmVudEZvY3VzID0gLTE7XG4gICAgICAgIGNsb3NlQWxsTGlzdHMoKTtcbiAgICAgICAgaWYgKGNob2ljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1VMJyk7XG4gICAgICAgIGEuc2V0QXR0cmlidXRlKCdjbGFzcycsICdhdXRvY29tcGxldGUtaXRlbXMnKTtcbiAgICAgICAgJGl0ZW1saXN0ID0gJChhKTtcblxuICAgICAgICBsZXQgY29udGFpbmVyID0gdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgJHJlc3VsdHMuYXBwZW5kKGEpO1xuICAgICAgICAkcmVzdWx0cy5zaG93KCk7XG5cbiAgICAgICAgbGV0IHZhbCA9IGlucHV0LnZhbHVlO1xuICAgICAgICBsZXQgJHRtcCA9ICQoJzxwPjwvcD4nKTtcbiAgICAgICAgalF1ZXJ5LmVhY2goY2hvaWNlcywgZnVuY3Rpb24gKHRlcm0sIHRlcm1JbmRleCkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBwYXJzZUludCh0ZXJtLnRvVXBwZXJDYXNlKCkuaW5kZXhPZih2YWwudG9VcHBlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBpZiAoc3RhcnRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0xJJyk7XG4gICAgICAgICAgICAgICAgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0EnKTtcblxuICAgICAgICAgICAgICAgIGMuaW5uZXJIVE1MID0gJHRtcC50ZXh0KHRlcm0uc3Vic3RyKDAsIHN0YXJ0SW5kZXgpKS5odG1sKCk7XG4gICAgICAgICAgICAgICAgYy5pbm5lckhUTUwgKz0gXCI8c3Ryb25nPlwiICsgJHRtcC50ZXh0KHRlcm0uc3Vic3RyKHN0YXJ0SW5kZXgsIHZhbC5sZW5ndGgpKS5odG1sKCkgKyBcIjwvc3Ryb25nPlwiO1xuICAgICAgICAgICAgICAgIGMuaW5uZXJIVE1MICs9ICR0bXAudGV4dCh0ZXJtLnN1YnN0cihzdGFydEluZGV4ICsgdmFsLmxlbmd0aCkpLmh0bWwoKTtcbiAgICAgICAgICAgICAgICBjLmlubmVySFRNTCArPSBcIjxzcGFuIGNsYXNzPVxcXCJjb3VudFxcXCI+KFwiICsgJHRtcC50ZXh0KHRlcm1JbmRleCkuaHRtbCgpICsgXCIpPC9zcGFuPlwiO1xuICAgICAgICAgICAgICAgIGIuY2hvaWNlID0gdGVybTtcblxuICAgICAgICAgICAgICAgIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5jaG9pY2U7XG4gICAgICAgICAgICAgICAgICAgIGNsb3NlQWxsTGlzdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRmb3JtLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1bMF0uc3VibWl0KCk7XG4gICAgICAgICAgICAgICAgICAgI
21167H1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5jbGljaygpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgYi5hcHBlbmRDaGlsZChjKTtcbiAgICAgICAgICAgICAgICBhLmFwcGVuZENoaWxkKGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgaWYgKHdpbmRvdy5zdGF0aWMpIHtcbiAgICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgYSwgYiwgYywgaSwgdmFsID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgIGNsb3NlQWxsTGlzdHMoKTtcblxuICAgICAgICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2V0Q2hvaWNlcyhhcnIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgbGV0IHggPSAkaXRlbWxpc3RbMF07XG5cbiAgICAgICAgaWYgKHgpIHggPSB4LmNoaWxkTm9kZXM7XG4gICAgICAgIGVsc2UgcmV0dXJuO1xuXG4gICAgICAgIGlmIChlLmtleUNvZGUgPT09IDQwKSB7XG4gICAgICAgICAgICBjdXJyZW50Rm9jdXMrKztcbiAgICAgICAgICAgIGFkZEFjdGl2ZSh4KTtcbiAgICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IDM4KSB7XG4gICAgICAgICAgICBjdXJyZW50Rm9jdXMtLTtcbiAgICAgICAgICAgIGFkZEFjdGl2ZSh4KTtcbiAgICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEZvY3VzID4gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoeCkgeFtjdXJyZW50Rm9jdXNdLmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09PSAyNykge1xuICAgICAgICAgICAgY2xvc2VBbGxMaXN0cygpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgJGNsb3NlID0gJGZvcm0ubmV4dCgnLnNlYXJjaC1jbG9zZScpO1xuICAgIGlmICgkY2xvc2UubGVuZ3RoID4gMCkge1xuICAgICAgICAkY2xvc2Uub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIGNsb3NlQWxsTGlzdHMoKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgalF1ZXJ5KGlucHV0KS5vbignYmx1cicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNsb3NlVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGNsb3NlVGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgY2xvc2VBbGxMaXN0cygpO1xuICAgICAgICAgICAgfSwgMjAwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlucHV0LnNldENob2ljZXMoYXJyKTtcbn1cbiIsIihmdW5jdGlvbiAoJCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIGxldCBjb250YWN0Rm9ybVRvZ2dsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqc0NvbnRhY3RGb3JtVG9nZ2xlQnV0dG9uJyk7XG4gICAgaWYgKGNvbnRhY3RGb3JtVG9nZ2xlKSB7XG4gICAgICAgIGNvbnRhY3RGb3JtVG9nZ2xlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgICAgICAgdXBkYXRlQ29udGFjdEZvcm0oKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxldCAkY29udGFjdEZvcm1TZWxlY3QgPSAkKCcuanNDb250YWN0Rm9ybVRvZ2dsZVNlbGVjdCcpO1xuICAgIGlmICgkY29udGFjdEZvcm1TZWxlY3QpIHtcbiAgICAgICAgJGNvbnRhY3RGb3JtU2VsZWN0Lm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICgkKCcjanNDb250YWN0Rm9ybVRvZ2dsZUJ1dHRvbicpLnBhcmVudCgpLmhhc0NsYXNzKCdkLW5vbmUnKSkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhY3RGb3JtKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZUNvbnRhY3RGb3JtKCkge1xuICAgICAgICB2Y
21167XIgY2lkID0gJGNvbnRhY3RGb3JtU2VsZWN0LnZhbCgpLFxuICAgICAgICAgICAgbGFiZWwgPSAkY29udGFjdEZvcm1TZWxlY3QuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykudGV4dCgpO1xuXG4gICAgICAgICQoJy5qc0NvbnRhY3RGb3JtVG9nZ2xlQXJlYSA+IGRpdicpLnJlbW92ZUNsYXNzKCdzaG93Jyk7XG4gICAgICAgICQoJy5qc0NvbnRhY3RGb3JtVG9nZ2xlQXJlYScpLmZpbmQoJyNjJyArIGNpZCkuYWRkQ2xhc3MoJ3Nob3cnKTtcbiAgICAgICAgJCgnLmpzQ29udGFjdEZvcm1Ub2dnbGVBcmVhIC5zaG93IC5pbnB1dC1oaWRkZW4tc3ViamVjdCBpbnB1dCcpLnZhbChsYWJlbCk7XG4gICAgfVxuXG4gICAgJC51cmxQYXJhbSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciByZXN1bHRzID0gbmV3IFJlZ0V4cCgnWz8mXScgKyBuYW1lICsgJz0oW14mXSopJykuZXhlYyhsb2NhdGlvbi5zZWFyY2gpXG4gICAgICAgIGlmIChyZXN1bHRzID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNbMV0gfHwgMDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoJC51cmxQYXJhbSgncmVhbEZvcm1JZCcpKSB7XG4gICAgICAgIHZhciByZWFsRm9ybUlkID0gJC51cmxQYXJhbSgncmVhbEZvcm1JZCcpO1xuICAgICAgICAkY29udGFjdEZvcm1TZWxlY3QudmFsKHJlYWxGb3JtSWQpO1xuICAgICAgICAkKCcjYycgKyByZWFsRm9ybUlkKS5zaG93KCk7XG4gICAgICAgICQoJy5qc0NvbnRhY3RGb3JtVG9nZ2xlU2VsZWN0QXJlYScpLmhpZGUoKTtcbiAgICAgICAgJCgnI2pzQ29udGFjdEZvcm1Ub2dnbGVCdXR0b24nKS5oaWRlKCk7XG4gICAgfVxufSkoalF1ZXJ5KTtcbiIsIi8qZ2xvYmFsIEZhcVNlYXJjaCovXG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIG5ldyBGYXFTZWFyY2goXCJmclwiKTtcbn0pO1xuIiwiLypnbG9iYWwgbHVuciovXG5cbnZhciBGYXFTZWFyY2ggPSBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImZhcS1zZWFyY2gtZm9ybVwiKSkge1xuICAgICAgICB0aGlzLmluaXQobGFuZywgb3B0aW9ucyk7XG4gICAgfVxufTtcblxuRmFxU2VhcmNoLnByb3RvdHlwZSA9IHtcblxuICAgIGluaXQ6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5sYW5nID0gbGFuZztcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHtcInRpdGxlQm9vc3RcIjogMywgXCJ0aHJlc2hvbGRcIjogdW5kZWZpbmVkfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpdGxlQm9vc3QgPSBvcHRpb25zLnRpdGxlQm9vc3Q7XG4gICAgICAgIGlmICh0aGlzLmxhbmcgPT0gXCJmclwiKSB7XG4gICAgICAgICAgICB0aGlzLmlkeCA9IGx1bnIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlKGx1bnIuZnIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmllbGQoJ3RpdGxlJywge2Jvb3N0OiB0aGlzLnRpdGxlQm9vc3R9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkKCdib2R5Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhbmcgPT0gXCJlblwiKSB7XG4gICAgICAgICAgICB0aGlzLmlkeCA9IGx1bnIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmllbGQoJ3RpdGxlJywge2Jvb3N0OiB0aGlzLnRpdGxlQm9vc3R9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkKCdib2R5Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGhyZXNob2xkID0gb3B0aW9ucy50aHJlc2hvbGQ7XG4gICAgICAgIHRoaXMuZ3JvdXBzID0gW107XG4gICAgICAgIHRoaXMuaW5kZXgoKTtcblxuICAgICAgICAvLyBGb3JtXG4gICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICBkb2
21167N1bWVudC5nZXRFbGVtZW50QnlJZChcImZhcS1zZWFyY2gtZm9ybVwiKS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImZhcS1zZWFyY2gtaW5wdXRcIik7XG4gICAgICAgIHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChzZWxmLnRpbWVyKTtcbiAgICAgICAgICAgIHZhciB2YWwgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5yZXNldCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWw7XG4gICAgICAgICAgICAgICAgc2VsZi50aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KHNlbGYuc2VhcmNoLmJpbmQoc2VsZiksIDM1MCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgaW5kZXg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGdyb3Vwc0NvbnRlbmV1ciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJncm91cGVRdWVzdGlvbnNMdW5yXCIpO1xuICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGdyb3Vwc0NvbnRlbmV1ci5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgdmFyIGdyb3VwT2JqID0gZ3JvdXBzQ29udGVuZXVyW2NdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJpbm5lclwiKVswXTtcbiAgICAgICAgICAgIHZhciBncm91cCA9IHtcbiAgICAgICAgICAgICAgICBpZDogZ3JvdXBPYmouZ2V0QXR0cmlidXRlKFwiaWRcIiksXG4gICAgICAgICAgICAgICAgcXVlc3Rpb25zOiB7fSxcbiAgICAgICAgICAgICAgICByZXN1bHRzOiB7fSxcbiAgICAgICAgICAgICAgICBvYmo6IGdyb3VwT2JqXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIHF1ZXN0aW9ucyA9IGdyb3Vwc0NvbnRlbmV1cltjXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiUXVlc3Rpb25zTHVuclwiKVswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiaW5uZXJcIik7XG4gICAgICAgICAgICBmb3IgKHZhciBxID0gMDsgcSA8IHF1ZXN0aW9ucy5sZW5ndGg7IHErKykge1xuICAgICAgICAgICAgICAgIHZhciBxdWVzdGlvbk9iaiA9IHF1ZXN0aW9uc1txXTtcbiAgICAgICAgICAgICAgICB2Y
21167XIgcXVlc3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBxdWVzdGlvbk9iai5nZXRBdHRyaWJ1dGUoXCJpZFwiKSxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHF1ZXN0aW9uT2JqLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaDJcIilbMF0udGV4dENvbnRlbnQucmVwbGFjZSgvXCIvZywgXCJcIiksXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHF1ZXN0aW9uT2JqLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJjZS10ZXh0cGljXCIpWzBdLnRleHRDb250ZW50LnJlcGxhY2UoL1wiL2csIFwiXCIpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmlkeC5hZGQocXVlc3Rpb24pO1xuICAgICAgICAgICAgICAgIHF1ZXN0aW9uLm9iaiA9IHF1ZXN0aW9uT2JqO1xuICAgICAgICAgICAgICAgIGdyb3VwLnF1ZXN0aW9uc1txdWVzdGlvbi5pZF0gPSBxdWVzdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzLnB1c2goZ3JvdXApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNlYXJjaDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInNlYXJjaFwiLCB0aGlzLnZhbHVlKTtcbiAgICAgICAgdmFyIHJlc3VsdHMgPSB0aGlzLmlkeC5zZWFyY2godGhpcy52YWx1ZSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlc3VsdHNbaV07XG4gICAgICAgICAgICBpZiAodGhpcy50aHJlc2hvbGQgPT09IHVuZGVmaW5lZCB8fCByZXN1bHQuc2NvcmUgPiB0aGlzLnRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGcgPSAwOyBnIDwgdGhpcy5ncm91cHMubGVuZ3RoOyBnKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGdyb3VwID0gdGhpcy5ncm91cHNbZ107XG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91cC5xdWVzdGlvbnNbcmVzdWx0LnJlZl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAucmVzdWx0c1tyZXN1bHQucmVmXSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIGhpZGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCB0aGlzLmdyb3Vwcy5sZW5ndGg7IGcrKykge1xuICAgICAgICAgICAgdmFyIGdyb3VwID0gdGhpcy5ncm91cHNbZ107XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXAucmVzdWx0cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXAub2JqLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIHF1ZXN0aW9uIGluIGdyb3VwLnF1ZXN0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmIChncm91cC5yZXN1bHRzW3F1ZXN0aW9uXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLnF1ZXN0aW9uc1txdWVzdGlvbl0ub2JqLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCB0aGlzLmdyb3Vwcy5sZW5ndGg7IGcrKykge1xuICAgICAgICAgICAgdmFyIGdyb3VwID0gdGhpcy5ncm91cHNbZ107XG4gICAgICAgICAgICBncm91cC5vYmouc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgICAgIGdyb3VwLnJlc3VsdHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIHF1ZXN0aW9uIGluIGdyb3VwLnF1ZXN0aW9ucykge1xuICAgICAgICAgICAgICAgIGdyb3VwLnF1ZXN0aW9uc1txdWVzdGlvbl0ub2JqLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbn07XG4iLCIvKiBnbG9iYWwgVGltZWxpbmVTZWFyY2guLi4qL1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAkKCcudGltZWxpbmUnKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICBuZXcgVGltZWxpbmVTZWFyY2godGhpcy5fdGltZWxpbmVCaWcsIGpRdWVyeSgnaHRtbCcpLmF0dHIoJ2xhbmcnKSk7XG4gICAgfSk7XG59KTtcbiIsIi8qZ2xvYmFsIGx1bnIqL1xuXG52YXIgVGltZWxpbmVTZWFyY2ggPSBmdW5jdGlvbiAodGltZWxpbmVCaWcsIGxhbmcsIG9wdGlvbnMpIHtcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0aW1lbGluZS1zZWFyY2gtZm9ybVwiKSkge1xuICAgICAgICB0aGlzLmluaXQodGltZWxpbmVCaWcsIGxhbmcsIG9wdGlvbnMpO1xuICAgIH1cbn07XG5cblRpbWVsaW5lU2VhcmNoLnByb3RvdHlwZSA9IHtcbiAgICBpbml0OiBmdW5jdGlvbiAodGltZWxpbmVCaWcsIGxhbmcsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLnRpbWVsaW5lQmlnID0gdGltZWxpbmVCaWc7XG4gICAgICAgIHRoaXMubGFuZyA9IGxhbmc7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7XCJ0aXRsZUJvb3N0XCI6IDMsIFwidGhyZXNob2xkXCI6IHVuZGVmaW5lZH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aXRsZUJvb3N0ID0gb3B0aW9ucy50aXRsZUJvb3N0O1xuICAgICAgICBpZiAodGhpcy5sYW5nID09PSBcImZyXCIpIHtcbiAgICAgICAgICAgIHRoaXMuaWR4ID0gbHVucihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2UobHVuci5mcik7XG4gICAgICAgICAgICAgICAgdGhpcy5maWVsZCgndGl0bGUnLCB7Ym9vc3Q6IHNlbGYudGl0bGVCb29zdH0pO1xuICAgICAgICAgICAgICAgI
21167HRoaXMuZmllbGQoJ2JvZHknKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGFuZyA9PT0gXCJlblwiKSB7XG4gICAgICAgICAgICB0aGlzLmlkeCA9IGx1bnIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmllbGQoJ3RpdGxlJywge2Jvb3N0OiBzZWxmLnRpdGxlQm9vc3R9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkKCdib2R5Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGhyZXNob2xkID0gb3B0aW9ucy50aHJlc2hvbGQ7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICAgICAgdGhpcy5pbmRleCgpO1xuICAgICAgICB0aGlzLnJlc3VsdHMgPSBbXTtcblxuICAgICAgICAvLyBGb3JtXG4gICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInRpbWVsaW5lLXNlYXJjaC1pbnB1dFwiKS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInRpbWVsaW5lLXNlYXJjaC1pbnB1dFwiKTtcbiAgICAgICAgdGhpcy5pbnB1dC5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHNlbGYudGltZXIpO1xuICAgICAgICAgICAgbGV0IHZhbCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgICAgICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5yZXNldCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWw7XG4gICAgICAgICAgICAgICAgc2VsZi50aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KHNlbGYuc2VhcmNoLmJpbmQoc2VsZiksIDM1MCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgaW5kZXg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGl0ZW1zQ29udGVuZXVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGltZWxpbmVfX21vYmlsZScpO1xuICAgICAgICBsZXQgaXRlbXMgPSBpdGVtc0NvbnRlbmV1clswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0aW1lbGluZS1pdGVtJyk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGl0ZW1PYmogPSBpdGVtc1tpXTtcbiAgICAgICAgICAgIGxldCBpdGVtID0ge1xuICAgICAgICAgICAgICAgIGlkOiBpdGVtT2JqLmdldEF0dHJpYnV0ZSgnZGF0YS11aWQnKSxcbiAgICAgICAgICAgICAgICB0aXRsZTogaXRlbU9iai5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0aW1lbGluZS1pdGVtX19jb250ZW50LXRpdGxlJylbMF0udGV4dENvbnRlbnQucmVwbGFjZSgvXCIvZywgXCJcIiksXG4gICAgICAgICAgICAgICAgYm9keTogJydcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChpdGVtT2JqLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RpbWVsaW5lLWl0ZW1fX2NvbnRlbnQtZGVzYycpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGl0ZW0uYm9keSA9IGl0ZW1PYmouZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGltZWxpbmUtaXRlbV9fY29udGVudC1kZXNjJylbMF0udGV4dENvbnRlbnQucmVwbGFjZSgvXCIvZywgXCJcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaWR4LmFkZChpdGVtKTtcbiAgICAgICAgICAgIGl0ZW0ub2JqID0gaXRlbU9iajtcbiAgICAgICAgICAgIHRoaXMuaXRlbXNbaXRlbS5pZF0gPSBpdGVtO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNlYXJjaDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHRzID0gdGhpcy5pZHguc2VhcmNoKHRoaXMudmFsdWUpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXN1bHRzW2ldO1xuICAgICAgICAgICAgaWYgKHRoaXMudGhyZXNob2xkID09PSB1bmRlZmluZWQgfHwgcmVzdWx0LnNjb3JlID4gdGhpcy50aHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuaXRlbXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNbcmVzdWx0LnJlZl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzW3Jlc3VsdC5yZWZdID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgaGlkZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgZmlyc3RJZCA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGl0ZW0gaW4gdGhpcy5pdGVtcykge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzdWx0c1tpdGVtXSAhPT0gdW5kZWZpbmVkICYmIGZpcnN0SWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmaXJzdElkID0gdGhpcy5pdGVtc1tpdGVtXS5pZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMucmVzdWx0c1tpdGVtXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtc1tpdGVtXS5vYmouY2xhc3NMaXN0LmFkZCgndGV4dGZpbHRlcicpO1xuICAgICAgICAgICAgICAgI
21167HRoaXMuaXRlbXNbaXRlbV0ub2JqLmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpbWVsaW5lQmlnLnNldERhdGEoKTtcbiAgICAgICAgdGhpcy50aW1lbGluZUJpZy52YXJzLnRpbWVsaW5lLmZvY3VzKGZpcnN0SWQpO1xuICAgIH0sXG5cbiAgICByZXNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlc3VsdHMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaXRlbSBpbiB0aGlzLml0ZW1zKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zW2l0ZW1dLm9iai5jbGFzc0xpc3QucmVtb3ZlKCd0ZXh0ZmlsdGVyJyk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pdGVtc1tpdGVtXS5vYmouY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2JveGZpbHRlcicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtc1tpdGVtXS5vYmouY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudGltZWxpbmVCaWcuc2V0RGF0YSgpO1xuICAgIH1cbn07XG4iLCIoZnVuY3Rpb24gKCQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBsZXQgJGJvZHkgPSAkKCdib2R5Jyk7XG4gICAgbGV0IG1lbnUgPSB7XG4gICAgICAgIHZhcnM6IHtcbiAgICAgICAgICAgICRtYWluSGVhZGVyOiBudWxsLFxuICAgICAgICAgICAgJHByaW1hcnlNZW51OiBudWxsLFxuICAgICAgICAgICAgJHByaW1hcnlNZW51TGlua3M6IG51bGwsXG4gICAgICAgICAgICAkc3VibWVudUxpbmtzOiBudWxsLFxuICAgICAgICAgICAgJGNsb3NlTGlua3M6IG51bGwsXG4gICAgICAgICAgICAkbWVudVdyYXBwZXI6IG51bGwsXG4gICAgICAgICAgICAkc2VhcmNoYm94OiBudWxsLFxuICAgICAgICAgICAgc3VibWVudU9wZW5DbGFzczogJ2lzLW9wZW4tc3VibWVudScsXG4gICAgICAgICAgICBwcmltYXJ5QWN0aXZlQ2xhc3M6ICdpcy1hY3RpdmUtbWVudScsXG4gICAgICAgICAgICBzdWJtZW51QWN0aXZlQ2xhc3M6ICdpcy1hY3RpdmUtc3VibWVudScsXG4gICAgICAgICAgICBzZWFyY2hib3hBY3RpdmVDbGFzczogJ2lzLWFjdGl2ZS1zZWFyY2hib3gnXG4gICAgICAgIH0sXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMudmFycy4kbWFpbkhlYWRlciA9ICQoJy5tYWluLWhlYWRlcicpO1xuICAgICAgICAgICAgdGhpcy52YXJzLiRwcmltYXJ5TWVudSA9IHRoaXMudmFycy4kbWFpbkhlYWRlci5maW5kKCcucHJpbWFyeS1tZW51Jyk7XG4gICAgICAgICAgICB0aGlzLnZhcnMuJHByaW1hcnlNZW51TGlua3MgPSB0aGlzLnZhcnMuJHByaW1hcnlNZW51LmZpbmQoJy5wcmltYXJ5LW1lbnVfX2xpbmtbZGF0YS1zdWJtZW51XScpO1xuICAgICAgICAgICAgdGhpcy52YXJzLiRzdWJtZW51TGlua3MgPSB0aGlzLnZhcnMuJHByaW1hcnlNZW51LmZpbmQoJ2FbZGF0YS1zdWJtZW51XSwgYnV0dG9uW2RhdGEtc3VibWVudV0nKTtcbiAgICAgICAgICAgIHRoaXMudmFycy4kY2xvc2VMaW5rcyA9IHRoaXMudmFycy4kcHJpbWFyeU1lbnUuZmluZCgnLmNsb3NlLXN1Ym1lbnVbZGF0YS1jbG9zZS1zdWJtZW51XSwgLnN1Ym1lbnVfX2JyZWFkY3J1bWJzX19wcmV2W2RhdGEtY2xvc2Utc3VibWVudV0nKTtcbiAgICAgICAgICAgIHRoaXMudmFycy4kbWFpbm1lbnVMaW5rcyA9IHRoaXMudmFycy4kcHJpbWFyeU1lbnUuZmluZCgnW2RhdGEtbWFpbm1lbnVdJyk7XG4gICAgICAgICAgICB0aGlzLnZhcnMuJG1lbnVXcmFwcGVyID0gdGhpcy52YXJzLiRwcmltYXJ5TWVudS5jbG9zZXN0KCcubWFpbi1oZWFkZXJfX25hdicpO1xuICAgICAgICAgICAgdGhpcy52YXJzLiRtb2JpbGVXcmFwcGVyID0gdGhpcy52YXJzLiRtYWluSGVhZGVyLmZpbmQoJy5tYWluLWhlYWRlcl9fbmF2YmFyLW1vYmlsZScpO1xuXG4gICAgICAgICAgICB0aGlzLnZhcnMuJHNlYXJjaGJveCA9ICQoJy5tYWluLWhlYWRlcl9fc2VhcmNoYm94IC5zZWFyY2hib3gnKTtcblxuICAgICAgICAgICAgdGhpcy5tdWx0aWxldmVsKCk7XG4gICAgICAgICAgICB0aGlzLnNpdGVzU2VsZWN0KCk7XG4gICAgICAgICAgICB0aGlzLmhhbWJ1cmdlcigpO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hib3goKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2l0ZXNTZWxlY3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCAkc2l0ZVNlbGVjdCA9ICQoJy5zaXRlcy1zZWxlY3RfX3NlbGVjdCcpO1xuXG4gICAgICAgICAgICAkc2l0ZVNlbGVjdC5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIGhhbWJ1cmdlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICB0aGlzLnZhcnMuJG1haW5IZWFkZXIuZmluZCgnLmhhbWJ1cmdlcicpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAkYm9keS50b2dnbGVDbGFzcygnaXMtbWVudScpO1xuICAgICAgICAgICAgICAgIGlmICgkYm9keS5oYXNDbGFzcygnaXMtbWVudScpKSB7XG4gICAgICAgICAgICAgICAgICAgICQoJ2h0bWwnKS5jbGljayhmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoZS50YXJnZXQpLmNsb3Nlc3QoJy5tYWluLWhlYWRlcicpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcygnaXMtbWVudScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykudW5iaW5kKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubXVsdGlsZXZlbENsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJCgnaHRtbCcpLnVuYmluZCgpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm11bHRpbGV2ZWxDbG9zZSgpO1xuICAgICAgICAgICAgICAgI
21167H1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtdWx0aWxldmVsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgICAgIHNlbGYudmFycy4kcHJpbWFyeU1lbnVMaW5rcy5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgIGxldCAkYm9keSA9ICQoJ2JvZHknKSxcbiAgICAgICAgICAgICAgICAgICAgJHRoaXMgPSAkKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAkcGFyZW50ID0gJHRoaXMuY2xvc2VzdCgnbGkucHJpbWFyeS1tZW51X19pdGVtJyksXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFN1Ym1lbnUgPSAkdGhpcy5kYXRhKCdzdWJtZW51Jyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoJHBhcmVudC5oYXNDbGFzcyhzZWxmLnZhcnMucHJpbWFyeUFjdGl2ZUNsYXNzKSkge1xuICAgICAgICAgICAgICAgICAgICAvL2lmIGNsaWNrZWQgbWVudSBpcyBhY3RpdmUgLSBjbG9zZSBpdFxuICAgICAgICAgICAgICAgICAgICBzZWxmLm11bHRpbGV2ZWxDbG9zZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghJGJvZHkuaGFzQ2xhc3MoJ2lzLW1lbnUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGJvZHkuYWRkQ2xhc3MoJ2lzLW1lbnUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudmFycy4kcHJpbWFyeU1lbnUuZmluZCgnLicgKyBzZWxmLnZhcnMucHJpbWFyeUFjdGl2ZUNsYXNzKS5yZW1vdmVDbGFzcyhzZWxmLnZhcnMucHJpbWFyeUFjdGl2ZUNsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52YXJzLiRwcmltYXJ5TWVudS5maW5kKCcuJyArIHNlbGYudmFycy5zdWJtZW51QWN0aXZlQ2xhc3MpLnJlbW92ZUNsYXNzKHNlbGYudmFycy5zdWJtZW51QWN0aXZlQ2xhc3MpO1xuXG4gICAgICAgICAgICAgICAgICAgICRwYXJlbnQuYWRkQ2xhc3Moc2VsZi52YXJzLnByaW1hcnlBY3RpdmVDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgICRwYXJlbnQuZmluZCgnLnN1Ym1lbnVfX21lbnVbZGF0YS1zdWJtZW51PVwiJyArIHRhcmdldFN1Ym1lbnUgKyAnXCJdJykuYWRkQ2xhc3Moc2VsZi52YXJzLnN1Ym1lbnVBY3RpdmVDbGFzcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNlbGYudmFycy4kc3VibWVudUxpbmtzLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAkcGFyZW50ID0gJHRoaXMuY2xvc2VzdCgnbGkucHJpbWFyeS1tZW51X19pdGVtJyksXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFN1Ym1lbnUgPSAkdGhpcy5kYXRhKCdzdWJtZW51Jyk7XG5cbiAgICAgICAgICAgICAgICAkcGFyZW50LmZpbmQoJy4nICsgc2VsZi52YXJzLnN1Ym1lbnVBY3RpdmVDbGFzcykucmVtb3ZlQ2xhc3Moc2VsZi52YXJzLnN1Ym1lbnVBY3RpdmVDbGFzcyk7XG4gICAgICAgICAgICAgICAgJHBhcmVudC5maW5kKCcuc3VibWVudV9fbWVudVtkYXRhLXN1Ym1lbnU9XCInICsgdGFyZ2V0U3VibWVudSArICdcIl0nKS5hZGRDbGFzcyhzZWxmLnZhcnMuc3VibWVudUFjdGl2ZUNsYXNzKTtcblxuICAgICAgICAgICAgICAgIGlmICghc2VsZi52YXJzLiRtZW51V3JhcHBlci5oYXNDbGFzcyhzZWxmLnZhcnMuc3VibWVudU9wZW5DbGFzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52YXJzLiRtZW51V3JhcHBlci5hZGRDbGFzcyhzZWxmLnZhcnMuc3VibWVudU9wZW5DbGFzcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNlbGYudmFycy4kY2xvc2VMaW5rcy5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5tdWx0aWxldmVsQ2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzZWxmLnZhcnMuJG1haW5tZW51TGlua3Mub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHNlbGYudmFycy4kbWVudVdyYXBwZXIucmVtb3ZlQ2xhc3Moc2VsZi52YXJzLnN1Ym1lbnVPcGVuQ2xhc3MpO1xuICAgICAgICAgICAgICAgIHNlbGYudmFycy4kcHJpbWFyeU1lbnUuZmluZCgnLicgKyBzZWxmLnZhcnMucHJpbWFyeUFjdGl2ZUNsYXNzKS5yZW1vdmVDbGFzcyhzZWxmLnZhcnMucHJpbWFyeUFjdGl2ZUNsYXNzKTtcbiAgICAgICAgICAgICAgICBzZWxmLnZhcnMuJHByaW1hcnlNZW51LmZpbmQoJy4nICsgc2VsZi52YXJzLnN1Ym1lbnVBY3RpdmVDbGFzcykucmVtb3ZlQ2xhc3Moc2VsZi52YXJzLnN1Ym1lbnVBY3RpdmVDbGFzcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbXVsdGlsZXZlbENsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLnZhcnMuJG1lbnVXcmFwcGVyLnJlbW92ZUNsYXNzKHRoaXMudmFycy5zdWJtZW51T3BlbkNsYXNzKTtcbiAgICAgICAgICAgIHRoaXMudmFycy4kcHJpbWFyeU1lbnUuZmluZCgnLicgKyB0aGlzLnZhcnMucHJpbWFyeUFjdGl2ZUNsYXNzKS5yZW1vdmVDbGFzcyh0aGlzLnZhcnMucHJpbWFyeUFjdGl2ZUNsYXNzKTtcbiAgICAgICAgICAgIHRoaXMudmFycy4kcHJpbWFyeU1lbnUuZmluZCgnLicgKyB0aGlzLnZhcnMuc3VibWVudUFjdGl2ZUNsYXNzKS5yZW1vdmVDbGFzcyh0aGlzLnZhcnMuc3VibWVudUFjdGl2ZUNsYXNzKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMudmFycy4kbW9iaWxlV3JhcHBlci5maWx0ZXIoJzpoaWRkZW4nKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgJGJvZHkucmVtb3ZlQ2xhc3MoJ2lzLW1lbnUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2VhcmNoYm94Q2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMudmFycy4kbWFpbkhlYWRlci5yZW1vdmVDbGFzcyh0aGlzLnZhcnMuc2VhcmNoYm94QWN0aXZlQ2xhc3MpO1xuICAgICAgICAgICAgJGJvZHkucmVtb3ZlQ2xhc3MoJ2lzLXNlYXJjaGJveCcpO1xuICAgICAgICB9LFxuICAgICAgICBzZWFyY2hib3g6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICAgICAgc2VsZi52YXJzLiRtYWluSGVhZGVyLmZpbmQoJy5vcGVuLXNlYXJjaGJveCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLm11bHRpbGV2ZWxDbG9zZSgpO1xuICAgICAgICAgICAgICAgI
21167HNlbGYudmFycy4kbWFpbkhlYWRlci50b2dnbGVDbGFzcyhzZWxmLnZhcnMuc2VhcmNoYm94QWN0aXZlQ2xhc3MpO1xuICAgICAgICAgICAgICAgIHNlbGYudmFycy4kbWFpbkhlYWRlci5maW5kKCcudHgtc29sci1xJykuZm9jdXMoKTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxmLnZhcnMuJG1haW5IZWFkZXIuaGFzQ2xhc3Moc2VsZi52YXJzLnNlYXJjaGJveEFjdGl2ZUNsYXNzKSkge1xuICAgICAgICAgICAgICAgICAgICAkYm9keS5hZGRDbGFzcygnaXMtc2VhcmNoYm94Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWFyY2hib3hDbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzZWxmLnZhcnMuJG1haW5IZWFkZXIuZmluZCgnLmNsb3NlLXNlYXJjaGJveCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLnNlYXJjaGJveENsb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAkKCcub3Blbi1pbm5lci1tZW51JykuY2xpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgJHdyYXBwZXIgPSAkKHRoaXMpLmNsb3Nlc3QoJy5pbm5lci1tZW51JyksXG4gICAgICAgICAgICAkY29udGVudCA9ICR3cmFwcGVyLmZpbmQoJy5pbm5lci1tZW51X19tb3JlJyk7XG5cbiAgICAgICAgaWYgKCR3cmFwcGVyLmhhc0NsYXNzKCdpcy1hY3RpdmUnKSkge1xuICAgICAgICAgICAgJGNvbnRlbnQuY3NzKHtcIm1heC1oZWlnaHRcIjogXCJcIn0pO1xuICAgICAgICAgICAgJHdyYXBwZXIucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHdyYXBwZXIuYWRkQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgJGNvbnRlbnQuY3NzKHtcIm1heC1oZWlnaHRcIjogJGNvbnRlbnRbMF0uc2Nyb2xsSGVpZ2h0fSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCAkYXJlYVBhcmVudCA9ICQoJy5ob21lcGFnZS1hcmVhJyk7XG4gICAgaWYgKCRhcmVhUGFyZW50Lmxlbmd0aCkge1xuICAgICAgICAkKCcuaG9tZXBhZ2UtYXJlYV9fbmF2IGJ1dHRvbltkYXRhLXRhcmdldF0nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpLFxuICAgICAgICAgICAgICAgIHRhcmdldCA9ICR0aGlzLmRhdGEoJ3RhcmdldCcpO1xuXG4gICAgICAgICAgICAkYXJlYVBhcmVudC5maW5kKCcuaXMtYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgJGFyZWFQYXJlbnQuZmluZCgnIycgKyB0YXJnZXQpLmFkZENsYXNzKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgICR0aGlzLnBhcmVudCgpLmFkZENsYXNzKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVudS5pbml0KCk7XG59KShqUXVlcnkpO1xuIiwialF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XG5cbiAgICBsZXQgbWFuYWdlRGF0ZVJhbmdlRXJyb3JzID0gZnVuY3Rpb24oJGZpbHRlcikge1xuICAgICAgICBsZXQgJGNvbnRhaW5lciA9ICRmaWx0ZXIuY2xvc2VzdCgnLm5ld3NTZWFyY2hEYXRlUmFuZ2VDb250YWluZXInKTtcbiAgICAgICAgbGV0ICRhbGwgPSAkY29udGFpbmVyXG4gICAgICAgICAgICAuYWRkKCRjb250YWluZXIuZmluZCgnaW5wdXQnKSlcbiAgICAgICAgICAgIC5hZGQoJGNvbnRhaW5lci5jbG9zZXN0KCdmb3JtLWdyb3VwJykpXG4gICAgICAgICAgICAuYWRkKCRjb250YWluZXIuZmluZCgnZm9ybS1jb250cm9sJykpO1xuICAgICAgICB2Y
21167XIgZk0gPSAkY29udGFpbmVyLmZpbmQoJy5pbnB1dC1mcm9tLmlucHV0LW1vbnRoJykudmFsKCk7XG4gICAgICAgIHZhciBmWSA9ICRjb250YWluZXIuZmluZCgnLmlucHV0LWZyb20uaW5wdXQteWVhcicpLnZhbCgpO1xuICAgICAgICB2YXIgdE0gPSAkY29udGFpbmVyLmZpbmQoJy5pbnB1dC10by5pbnB1dC1tb250aCcpLnZhbCgpO1xuICAgICAgICB2YXIgdFkgPSAkY29udGFpbmVyLmZpbmQoJy5pbnB1dC10by5pbnB1dC15ZWFyJykudmFsKCk7XG4gICAgICAgIGlmICgoZk0gJiYgZlkgJiYgdE0gJiYgdFkpICYmIChcbiAgICAgICAgICAgIChmWSA9PT0gdFkpICYmIChmTSA+IHRNKVxuICAgICAgICAgICAgfHwgKGZZID4gdFkpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgICRhbGwuYWRkQ2xhc3MoJ2lzLWludmFsaWQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRhbGwucmVtb3ZlQ2xhc3MoJ2lzLWludmFsaWQnKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAkKCcubmV3c3NlYXJjaC1kYXRlLWZpbHRlcicpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgZGF0ZUZpbHRlciA9IHRoaXMsICRkYXRlRmlsdGVyID0gJCh0aGlzKTtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBmb3JtYXQ6ICdNTS1ZWVlZJyxcbiAgICAgICAgICAgIGF1dG9IaWRlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIGlmICgkKCdodG1sJylbMF0ubGFuZyA9PT0gJ2ZyJykge1xuICAgICAgICAgICAgb3B0aW9ucy5sYW5ndWFnZSA9ICdmci1GUic7XG4gICAgICAgIH1cbiAgICAgICAgJGRhdGVGaWx0ZXIuY2ZEYXRlcGlja2VyKG9wdGlvbnMpO1xuICAgICAgICBsZXQgJGlucHV0TW9udGggPSAkZGF0ZUZpbHRlci5wYXJlbnQoKS5maW5kKCcuaW5wdXQtbW9udGgnKSxcbiAgICAgICAgICAgICRpbnB1dFllYXIgPSAkZGF0ZUZpbHRlci5wYXJlbnQoKS5maW5kKCcuaW5wdXQteWVhcicpO1xuICAgICAgICBkYXRlRmlsdGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICB2Y
21167XIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zcGxpdCgnLScpO1xuICAgICAgICAgICAgJGlucHV0TW9udGgudmFsKHZhbHVlWzBdKTtcbiAgICAgICAgICAgICRpbnB1dFllYXIudmFsKHZhbHVlWzFdKTtcbiAgICAgICAgICAgIG1hbmFnZURhdGVSYW5nZUVycm9ycygkZGF0ZUZpbHRlcik7XG5cbiAgICAgICAgfSk7XG4gICAgICAgICQodGhpcykub24oJ3BpY2suZGF0ZXBpY2tlcicsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIG1vbnRoID0gKGV2ZW50LmRhdGUuZ2V0VVRDTW9udGgoKSA+IDgpID8gZXZlbnQuZGF0ZS5nZXRVVENNb250aCgpICsgMSA6IFwiMFwiICsgZXZhbChldmVudC5kYXRlLmdldFVUQ01vbnRoKCkgKyAxKTtcbiAgICAgICAgICAgICRpbnB1dE1vbnRoLnZhbChtb250aCk7XG4gICAgICAgICAgICAkaW5wdXRZZWFyLnZhbChldmVudC5kYXRlLmdldFVUQ0Z1bGxZZWFyKCkpO1xuICAgICAgICAgICAgbWFuYWdlRGF0ZVJhbmdlRXJyb3JzKCRkYXRlRmlsdGVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAkKCcuaW5wdXQtZGF0ZS1yYW5nZS1yZXNldCBhJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZXYpIHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCcuaW5wdXQtZGF0ZS1yYW5nZS1yZXNldCcpLnBhcmVudCgpLmZpbmQoJy5uZXdzc2VhcmNoLWRhdGUtZmlsdGVyJykuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICQodGhpcykuZGF0YSgnZGF0ZXBpY2tlcicpLnJlc2V0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5pbnB1dC1kYXRlLXJhbmdlLXJlc2V0JykucGFyZW50KCkuZmluZCgnLmlucHV0LW1vbnRoLC5pbnB1dC15ZWFyJykudmFsKCcnKTtcbiAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCcuaW5wdXQtZGF0ZS1yYW5nZS1yZXNldCcpLnBhcmVudCgpLmZpbmQoJy5uZXdzU2VhcmNoRGF0ZVJhbmdlQ29udGFpbmVyJykucmVtb3ZlQ2xhc3MoJ2lzLWludmFsaWQnKTtcbiAgICB9KVxufSk7XG5qUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcmVxID0gZmFsc2U7XG5cbiAgICBsZXQgbWFrZUZpbHRlcnMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgbGV0IGZpbHRlcnMgPSBbXG4gICAgICAgICAgICAgICAgJ3R5cGU6dHhfbmV3c19kb21haW5fbW9kZWxfbmV3cydcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAkcGVyaW9kID0galF1ZXJ5KCcubmV3cy1wZXJpb2QnKSxcbiAgICAgICAgICAgICRjYXRlZ29yaWVzID0galF1ZXJ5KCcubmV3cy1jYXRlZ29yeTpjaGVja2VkJyk7XG4gICAgICAgIGlmICghJHBlcmlvZC5oYXNDbGFzcygnaXMtaW52YWxpZCcpKSB7XG4gICAgICAgICAgICBsZXQgZk0gPSAkcGVyaW9kLmZpbmQoJy5pbnB1dC1mcm9tLmlucHV0LW1vbnRoJ
21167ykudmFsKCk7XG4gICAgICAgICAgICBsZXQgZlkgPSAkcGVyaW9kLmZpbmQoJy5pbnB1dC1mcm9tLmlucHV0LXllYXInKS52YWwoKTtcbiAgICAgICAgICAgIGxldCB0TSA9ICRwZXJpb2QuZmluZCgnLmlucHV0LXRvLmlucHV0LW1vbnRoJykudmFsKCk7XG4gICAgICAgICAgICBsZXQgdFkgPSAkcGVyaW9kLmZpbmQoJy5pbnB1dC10by5pbnB1dC15ZWFyJykudmFsKCk7XG4gICAgICAgICAgICBpZiAoKGZNICYmIGZZKSB8fCAodE0gJiYgdFkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlID0gWycqJywgJyonXTtcbiAgICAgICAgICAgICAgICBpZiAoZk0gJiYgZlkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2VbMF0gPSBuZXcgRGF0ZShwYXJzZUludCh0WSksIHBhcnNlSW50KHRNKSkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRNICYmIHRZKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlWzFdID0gbmV3IERhdGUocGFyc2VJbnQodFkpLCBwYXJzZUludCh0TSkgKyAxLCAxLCAwLCAwLCAwLCAtMSkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmlsdGVycy5wdXNoKCdwdWJsaWNhdGlvbl9kYXRlUzpbJyArIHJhbmdlLmpvaW4oJyBUTyAnKSArICddJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCRjYXRlZ29yaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBjYXRlZ29yaWVzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgJGNhdGVnb3JpZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKCdjYXRlZ29yeV9zdHJpbmdNOlwiJyArIGpRdWVyeSgkY2F0ZWdvcmllc1tpbmRleF0pLmRhdGEoJ3RpdGxlJykgKyAnXCInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbHRlcnMucHVzaChjYXRlZ29yaWVzLmpvaW4oJyBPUiAnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcnM7XG4gICAgfTtcblxuICAgIGxldCBzZWFyY2ggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHJlcSkge1xuICAgICAgICAgICAgcmVxLmFib3J0KCk7XG4gICAgICAgICAgICByZXEgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNldENob2ljZXMpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2hvaWNlcyhbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudmFsdWUubGVuZ3RoIDwgMykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNldENob2ljZXMpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2hvaWNlcyhbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlucHV0ID0gdGhpcztcbiAgICAgICAgbGV0ICRmb3JtID0galF1ZXJ5KCcubWFpbi1oZWFkZXJfX3NlYXJjaGJveCAuc2VhcmNoLWZvcm0nKTtcbiAgICAgICAgaWYgKCRmb3JtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBmaWx0ZXJzID0gbWFrZUZpbHRlcnMoKTtcbiAgICAgICAgICAgIGZpbHRlcnMgPSAoZmlsdGVycy5sZW5ndGggPiAwKSA/IEpTT04uc3RyaW5naWZ5KGZpbHRlcnMpIDogJyc7XG4gICAgICAgICAgICByZXEgPSBqUXVlcnkuYWpheCh7XG4gICAgICAgICAgICAgICAgdXJsOiAkZm9ybS5kYXRhKCd1cmwnKSxcbiAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyczogZmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgdGVybUxvd2VyY2FzZTogdGhpcy52YWx1ZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgICAgICB0ZXJtT3JpZ2luYWw6IHRoaXMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIEw6ICRmb3JtLmZpbmQoJ2lucHV0W25hbWU9XCJMXCJdJykudmFsKClcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChpbnB1dC5zZXRDaG9pY2VzKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZShpbnB1dCwgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZXRDaG9pY2VzKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGpRdWVyeSgnLm5ld3Mta2V5d29yZCcpLm9uKCdpbnB1dCcsIHNlYXJjaClcbiAgICAgICAgLm9uKCdrZXlkb3duJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgaWYgKChlLmtleUNvZGUgPT09IDQwKSAmJiAoalF1ZXJ5KHRoaXMpLmNsb3Nlc3QoJy5zZWFyY2gtZm9ybScpLnBhcmVudCgpLmZpbmQoJy5zZWFyY2gtcmVzdWx0czpoaWRkZW4nKS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgIHNlYXJjaC5hcHBseSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG59KTtcbiIsIihmdW5jdGlvbiAoJCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIGxldCBwb3B1cCA9ICQoJy5wb3B1cCcpO1xuICAgIGlmIChwb3B1cC5sZW5ndGgpIHtcbiAgICAgICAgbGV0IGNvb2tpZSA9IENvb2tpZXMuZ2V0SlNPTignY29va2llX2NvbnNlbnRfc2V0dGluZ3Nfc2V0Jyk7XG4gICAgICAgIGxldCBpc0Nvb2tpZSA9IGZhbHNlO1xuICAgICAgICBsZXQgaXNUdXRvcmlhbCA9IHBvcHVwLmhhc0NsYXNzKCd0dXRvcmlhbCcpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY29va2llID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcG9wdXAuYWRkQ2xhc3MoJ29uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2xvc2VQb3B1cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgI
21167HBvcHVwLmFkZENsYXNzKCdjbG9zZScpO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBwb3B1cC5yZW1vdmVDbGFzcygnb24gY2xvc2UnKTtcbiAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHNob3dQb3B1cCA9IGZ1bmN0aW9uICh0LCBuYW1lKSB7XG4gICAgICAgICAgICB0LmNsb3Nlc3QoJy5wb3B1cF9fc2xpZGUnKS5maW5kKCcucG9wdXBfX2NvbnRlbnQnKS5yZW1vdmVDbGFzcygnb24nKTtcbiAgICAgICAgICAgIHQuY2xvc2VzdCgnLnBvcHVwX19zbGlkZScpLmZpbmQoJy5wb3B1cF9fY29udGVudFtkYXRhLW5hbWU9XCInICsgbmFtZSArICdcIl0nKS5hZGRDbGFzcygnb24nKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoaXNUdXRvcmlhbCkge1xuICAgICAgICAgICAgbGV0IHBvcHVwU2xpZGVyID0gcG9wdXAuZmluZCgnLnBvcHVwX19zbGlkZXInKS5zbGljayh7XG4gICAgICAgICAgICAgICAgY2VudGVyTW9kZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjZW50ZXJQYWRkaW5nOiAnMTIwcHgnLFxuICAgICAgICAgICAgICAgIGRvdHM6IHRydWUsXG4gICAgICAgICAgICAgICAgZHJhZ2dhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpbmZpbml0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgICAgICAgICAgICAgc2xpZGVzVG9TaG93OiAxLFxuICAgICAgICAgICAgICAgIHN3aXBlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZXNwb25zaXZlOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQ6IDk5MixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyUGFkZGluZzogJzBweCdcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvb2tpZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBwb3B1cC5maW5kKCcuc2xpY2stYXJyb3cnKS5hZGRDbGFzcygnc2xpY2stZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICBwb3B1cC5maW5kKCcuc2xpY2stYXJyb3cnKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgIHBvcHVwLmZpbmQoJy5zbGljay1kb3RzJykuYWRkQ2xhc3MoJ3NsaWNrLWRpc2FibGVkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBvcHVwU2xpZGVyLm9uKCdhZnRlckNoYW5nZScsIGZ1bmN0aW9uIChlLCBzbGljaykge1xuICAgICAgICAgICAgICAgIGlmICgkKHdpbmRvdykud2lkdGgoKSA+IDgwMCkge1xuICAgICAgICAgICAgICAgICAgICBwb3B1cC5maW5kKCcucG9wdXBfX3NsaWRlciAuc2xpY2stbGlzdCcpLnJlbW92ZUNsYXNzKCdtb3ZlVXAnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc2xpY2suY3VycmVudFNsaWRlID49IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXBTbGlkZXIuc2xpY2soJ3NsaWNrU2V0T3B0aW9uJywgJ2RyYWdnYWJsZScsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXBTbGlkZXIuc2xpY2soJ3NsaWNrU2V0T3B0aW9uJywgJ3N3aXBlJywgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzbGljay5jdXJyZW50U2xpZGUgPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICAkKCcucG9wdXBfX2J0bi1jbG9zZScpLmFkZENsYXNzKCd2aXNpYmxlJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaXNDb29raWUpIHtcbiAgICAgICAgICAgICAgICAgICAgJCgnLnBvcHVwX19idG4tY2xvc2UnKS5yZW1vdmVDbGFzcygndmlzaWJsZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBwb3B1cFNsaWRlci5vbignYmVmb3JlQ2hhbmdlJywgZnVuY3Rpb24gKGUsIHNsaWNrLCBjdXJyZW50U2xpZGUsIG5leHRTbGlkZSkge1xuICAgICAgICAgICAgICAgIGlmICgkKHdpbmRvdykud2lkdGgoKSA+IDgwMCkge1xuICAgICAgICAgICAgICAgICAgICBwb3B1cC5maW5kKCcucG9wdXBfX3NsaWRlciAuc2xpY2stbGlzdCcpLmFkZENsYXNzKCdtb3ZlVXAnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc2xpY2suY3VycmVudFNsaWRlICsgMiA9PT0gc2xpY2suc2xpZGVDb3VudCAmJiBuZXh0U2xpZGUgPiBjdXJyZW50U2xpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuZmluZCgnLnBvcHVwX19zbGlkZXIgLnNsaWNrLW5leHQnKS5hZGRDbGFzcygnc2xpY2staGlkZScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcHVwLmZpbmQoJy5wb3B1cF9fc2xpZGVyIC5zbGljay1uZXh0JykucmVtb3ZlQ2xhc3MoJ3NsaWNrLWhpZGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvcHVwLmZpbmQoJ1tjbGFzcyo9XCJwb3B1cC1hY3Rpb25cIl0nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICBsZXQgY2FyZCA9ICQodGhpcykuYXR0cignZGF0YS1zaG93Jyk7XG4gICAgICAgICAgICBsZXQgdCA9ICQodGhpcyk7XG5cbiAgICAgICAgICAgIGxldCBpc0Nsb3NlQnV0dG9uID0gdC5oYXNDbGFzcygncG9wdXAtYWN0aW9uLWNsb3NlJyk7XG4gICAgICAgICAgICBsZXQgaXNTYXZlQnV0dG9uID0gdC5oYXNDbGFzcygncG9wdXAtYWN0aW9uLXNhdmUnKTtcbiAgICAgICAgICAgIGxldCBpc1NhdmVBbGxCdXR0b24gPSB0Lmhhc0NsYXNzKCdwb3B1cC1hY3Rpb24tc2F2ZS1hbGwnKTtcbiAgICAgICAgICAgIGxldCBpc1Bhc3MgPSB0Lmhhc0NsYXNzKCdwb3B1cC1hY3Rpb24tcGFzcycpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhcmQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc2hvd1BvcHVwKHQsIGNhcmQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNDbG9zZUJ1dHRvbikge1xuICAgICAgICAgICAgICAgIGNsb3NlUG9wdXAoKTtcbiAgICAgICAgICAgI
21167H1cblxuICAgICAgICAgICAgaWYgKGlzU2F2ZUJ1dHRvbiB8fCBpc1NhdmVBbGxCdXR0b24gfHwgaXNQYXNzKSB7XG4gICAgICAgICAgICAgICAgaWYoaXNQYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIENvb2tpZXMuc2V0KCdjb29raWVfY29uc2VudF9zZXR0aW5nc19zZXQnLCAxKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWlzVHV0b3JpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VQb3B1cCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcHVwLmZpbmQoJy5wb3B1cF9fc2xpZGVyJykuc2xpY2soJ3NsaWNrTmV4dCcpO1xuICAgICAgICAgICAgICAgICAgICBwb3B1cC5maW5kKCcuc2xpY2stYXJyb3cnKS5yZW1vdmVDbGFzcygnc2xpY2stZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuZmluZCgnLnNsaWNrLWFycm93JykucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuZmluZCgnLnNsaWNrLWRvdHMnKS5yZW1vdmVDbGFzcygnc2xpY2stZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAkKCcucG9wdXBfX2J0bi1jbG9zZScpLmFkZENsYXNzKCd2aXNpYmxlJyk7XG4gICAgICAgICAgICAgICAgaXNDb29raWUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNUdXRvcmlhbCkge1xuICAgICAgICAgICAgICAgIGlmIChjYXJkID09PSAnY29va2llcy1zZXR0aW5ncycpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuZmluZCgnLnNsaWNrLWFycm93JykuYWRkQ2xhc3MoJ3NsaWNrLWhpZGUnKTtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuZmluZCgnLnNsaWNrLWFycm93JykuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuZmluZCgnLnNsaWNrLWRvdHMnKS5hZGRDbGFzcygnc2xpY2staGlkZScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcHVwLmZpbmQoJy5zbGljay1hcnJvdycpLnJlbW92ZUNsYXNzKCdzbGljay1oaWRlJyk7XG4gICAgICAgICAgICAgICAgICAgIHBvcHVwLmZpbmQoJy5zbGljay1hcnJvdycpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHBvcHVwLmZpbmQoJy5zbGljay1kb3RzJykucmVtb3ZlQ2xhc3MoJ3NsaWNrLWhpZGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAod2luZG93LmRvTm90VHJhY2sgPT0gXCIxXCIgfHwgbmF2aWdhdG9yLmRvTm90VHJhY2sgPT0gXCJ5ZXNcIiB8fCBuYXZpZ2F0b3IuZG9Ob3RUcmFjayA9PSBcIjFcIiB8fCBuYXZpZ2F0b3IubXNEb05vdFRyYWNrID09IFwiMVwiKSB7XG4gICAgICAgICAgICAgICAgcG9wdXAuZmluZCgnLmJsb2NrZWQnKS5zaG93KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghd2luZG93Lmdvb2dsZV90YWdfbWFuYWdlcikge1xuICAgICAgICAgICAgICAgICAgICBwb3B1cC5maW5kKCcuYmxvY2tlZCcpLnNob3coKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwb3B1cC5maW5kKCcudW5ibG9ja2VkJykuc2hvdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZmFsc2UpO1xuICAgIH1cbn0pKGpRdWVyeSk7XG4iLCIoZnVuY3Rpb24gKCQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBsZXQgJGhlcm9TbGlkZXIgPSAkKCcuaGVyby1zbGlkZXInKSxcbiAgICAgICAgJGhlcm9TbGlkZXJJdGVtcyA9ICRoZXJvU2xpZGVyLmNoaWxkcmVuKCk7XG5cbiAgICBpZiAoJGhlcm9TbGlkZXIubGVuZ3RoICYmICRoZXJvU2xpZGVySXRlbXMubGVuZ3RoID4gMSkge1xuICAgICAgICAkaGVyb1NsaWRlci5zbGljayh7XG4gICAgICAgICAgICBhcnJvd3M6IGZhbHNlLFxuICAgICAgICAgICAgYXV0b3BsYXk6IHRydWUsXG4gICAgICAgICAgICBhdXRvcGxheVNwZWVkOiA1MDAwLFxuICAgICAgICAgICAgZG90czogdHJ1ZSxcbiAgICAgICAgICAgIGZhZGU6IHRydWUsXG4gICAgICAgICAgICBtb2JpbGVGaXJzdDogdHJ1ZSxcbiAgICAgICAgICAgIHNsaWRlc1RvU2Nyb2xsOiAxLFxuICAgICAgICAgICAgc2xpZGVzVG9TaG93OiAxLFxuICAgICAgICAgICAgc3BlZWQ6IDgwMFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgJHRpbGVTbGlkZXIgPSAkKCcubmV3cy10aWxlcywgLnBhcnRuZXJzLWdyaWQsIC5zaWRlYmFyLWJveF9faW5uZXIsIC5udW1iZXJzX19ncmlkJyk7XG4gICAgaWYgKCR0aWxlU2xpZGVyLmxlbmd0aCkge1xuICAgICAgICBsZXQgdGlsZVNsaWNrT24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkdGlsZVNsaWRlci5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCR0aGlzLmNsb3Nlc3QoJy5taW5pbWFsaXN0aWMnKS5sZW5ndGggPCAxICYmICEkdGhpcy5oYXNDbGFzcygnc2xpY2staW5pdGlhbGl6ZWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAkdGhpcy5zbGljayh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZXNUb1Nob3c6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZXNUb1Njcm9sbDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdHM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJvd3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9iaWxlRmlyc3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zaXZlOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50OiAxMDkwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQ6IDU3NixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
21167HNsaWRlc1RvU2hvdzogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlc1RvU2Nyb2xsOiAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgJHRpbGVTbGlkZXIgPSAkKCcubmV3cy10aWxlcywgLnBhcnRuZXJzLWdyaWQsIC5zaWRlYmFyLWJveF9faW5uZXIsIC5udW1iZXJzX19ncmlkJyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHRpbGVTbGlja09mZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICR0aWxlU2xpZGVyLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCAkdGhpcyA9ICQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoJHRoaXMuaGFzQ2xhc3MoJ3NsaWNrLWluaXRpYWxpemVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgJHRoaXMuc2xpY2soJ3Vuc2xpY2snKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICR0aWxlU2xpZGVyID0gJCgnLm5ld3MtdGlsZXMsIC5wYXJ0bmVycy1ncmlkLCAuc2lkZWJhci1ib3hfX2lubmVyLCAubnVtYmVyc19fZ3JpZCcpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8PSAxMDkwKSB7XG4gICAgICAgICAgICB0aWxlU2xpY2tPbigpXG4gICAgICAgIH1cblxuICAgICAgICAkKHdpbmRvdykub24oJ3Jlc2l6ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAoZS50YXJnZXQuaW5uZXJXaWR0aCA8PSAxMDkwKSB7XG4gICAgICAgICAgICAgICAgdGlsZVNsaWNrT24oKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGlsZVNsaWNrT2ZmKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCAkZmxhc2hTbGlkZXIgPSAkKCcuZmxhc2gtaW5mb19fc2xpZGVyJyk7XG4gICAgaWYgKCRmbGFzaFNsaWRlci5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCRmbGFzaFNsaWRlci5maW5kKCc+IGRpdicpLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICRmbGFzaFNsaWRlci5jbG9zZXN0KCcuZmxhc2gtaW5mb19fY29udGVudCcpLmFkZENsYXNzKCd3aXRoLWJ1dHRvbnMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRmbGFzaFNsaWRlci5zbGljayh7XG4gICAgICAgICAgICBhZGFwdGl2ZUhlaWdodDogdHJ1ZSxcbiAgICAgICAgICAgIGFycm93czogdHJ1ZSxcbiAgICAgICAgICAgIGF1dG9wbGF5OiB0cnVlLFxuICAgICAgICAgICAgYXV0b3BsYXlTcGVlZDogNTAwMCxcbiAgICAgICAgICAgIGRvdHM6IGZhbHNlLFxuICAgICAgICAgICAgbW9iaWxlRmlyc3Q6IHRydWUsXG4gICAgICAgICAgICBzbGlkZXNUb1Nob3c6IDEsXG4gICAgICAgICAgICBzbGlkZXNUb1Njcm9sbDogMVxuICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKCdzZXRQb3NpdGlvbicsIGZ1bmN0aW9uIChldmVudCwgc2xpY2spIHtcbiAgICAgICAgICAgICAgICBzbGljay4kc2xpZGVzLmNzcygnaGVpZ2h0Jywgc2xpY2suJHNsaWRlVHJhY2suaGVpZ2h0KCkgKyAncHgnKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCAkdHdpdHRlclNsaWRlciA9ICQoJy50eC1jdy10d2l0dGVyJyk7XG4gICAgaWYgKCR0d2l0dGVyU2xpZGVyLmxlbmd0aCkge1xuICAgICAgICBsZXQgdHdpdHRlclNsaWNrT24gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICR0d2l0dGVyU2xpZGVyLnNsaWNrKHtcbiAgICAgICAgICAgICAgICBzbGlkZXNUb1Nob3c6IDEsXG4gICAgICAgICAgICAgICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgICAgICAgICAgICAgZG90czogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhcnJvd3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1vYmlsZUZpcnN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGFkYXB0aXZlSGVpZ2h0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNpdmU6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludDogMTA5MFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50OiA3NjgsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlc1RvU2hvdzogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGlkZXNUb1Njcm9sbDogM1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50OiA0ODAsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlc1RvU2hvdzogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGlkZXNUb1Njcm9sbDogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGl2ZUhlaWdodDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgJHR3aXR0ZXJTbGlkZXIgPSAkKCcudHgtY3ctdHdpdHRlcicpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCB0d2l0dGVyU2xpY2tPZmYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkdHdpdHRlclNsaWRlci5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCR0aGlzLmhhc0NsYXNzKCdzbGljay1pbml0aWFsaXplZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICR0aGlzLnNsaWNrKCd1bnNsaWNrJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAkdHdpdHRlclNsaWRlciA9ICQoJy50eC1jdy10d2l0dGVyJyk7XG4gICAgICAgI
21167H07XG5cbiAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDEwOTApIHtcbiAgICAgICAgICAgIHR3aXR0ZXJTbGlja09uKClcbiAgICAgICAgfVxuXG4gICAgICAgICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmIChlLnRhcmdldC5pbm5lcldpZHRoIDw9IDEwOTApIHtcbiAgICAgICAgICAgICAgICB0d2l0dGVyU2xpY2tPbigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0d2l0dGVyU2xpY2tPZmYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgJCgnLmhlcm8tc2xpZGVyX19pdGVtJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oJCh0aGlzKS5maW5kKCcuaGVyby1zbGlkZXJfX2l0ZW1fX21vcmUgYScpLmF0dHIoJ2hyZWYnKSk7XG4gICAgfSk7XG5cbiAgICAkKCcuaGVyby1zbGlkZXJfX2l0ZW1fX2NvbnRlbnQnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbigkKHRoaXMpLmZpbmQoJy5oZXJvLXNsaWRlcl9faXRlbV9fbW9yZSBhJykuYXR0cignaHJlZicpKTtcbiAgICB9KTtcbn0pKGpRdWVyeSk7XG5cbi8qXG4gICAgQXV0byBmb250IHJlc2l6ZVxuICovXG5qUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2hhbmdlRm9udFNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICQoJy5oZXJvLWZpdC10ZXh0JykudGV4dGZpbGwoe1xuICAgICAgICAgICAgaW5uZXJUYWc6ICdwJyxcbiAgICAgICAgICAgIG1heEZvbnRQaXhlbHM6IDMwXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjaGFuZ2VGb250U2l6ZSgpO1xuICAgICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGFuZ2VGb250U2l6ZSgpO1xuICAgIH0pO1xufSk7XG4iLCJqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgkKSB7XG4gICAgbGV0ICR0aW1lbGluZVNtYWxsID0gJCgnLnRpbWVsaW5lLXNtYWxsJyk7XG5cbiAgICBpZiAoJHRpbWVsaW5lU21hbGwubGVuZ3RoKSB7XG4gICAgICAgIGxldCBjdXJyZW50RGF0ZUZ1bGwgPSBuZXcgRGF0ZSgpLnRvSlNPTigpLnNsaWNlKDAsIDEwKTtcbiAgICAgICAgbGV0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoY3VycmVudERhdGVGdWxsKTtcblxuICAgICAgICBsZXQgdGFza0luUHJvamVjdFBvc2l0aW9uID0gZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgICAgICAgIGxldCAkcHJvamVjdHMgPSB0YXNrLmNsb3Nlc3QoJy50aW1lbGluZS1zbWFsbCcpLmZpbmQoJy50aW1lbGluZS1zbWFsbC1oZWFkZXIgLnByb2plY3QnKTtcbiAgICAgICAgICAgIGxldCBwb3NpdGlvbkluQ29udGVudCA9IG51bGw7XG5cbiAgICAgICAgICAgICRwcm9qZWN0cy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgJHByb2plY3QgPSAkKHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmICgkcHJvamVjdC5hdHRyKCdkYXRhLXN0YXJ0JykgJiYgJHByb2plY3QuYXR0cignZGF0YS1lbmQnKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvamVjdFN0YXJ0ID0gbmV3IERhdGUoJHByb2plY3QuYXR0cignZGF0YS1zdGFydCcpKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb2plY3RFbmQgPSBuZXcgRGF0ZSgkcHJvamVjdC5hdHRyKCdkYXRhLWVuZCcpKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhc2tEYXRlID0gbmV3IERhdGUodGFzay5hdHRyKCdkYXRhLWRhdGUnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tEYXRlID49IHByb2plY3RTdGFydCAmJiB0YXNrRGF0ZSA8PSBwcm9qZWN0RW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3V0ZXJXaWR0aCA9ICRwcm9qZWN0Lm91dGVyV2lkdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCAkbmV4dCA9ICRwcm9qZWN0Lm5leHQoJ2RpdicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRuZXh0Lmhhc0NsYXNzKCdwcm9qZWN0LXNraXAnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuZXh0ID0gJG5leHQubmV4dCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb25TdGFydCA9ICRwcm9qZWN0LnBvc2l0aW9uKCkubGVmdCArIG91dGVyV2lkdGggLyAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uRW5kID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRuZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uRW5kID0gJG5leHQucG9zaXRpb24oKS5sZWZ0ICsgb3V0ZXJXaWR0aCAvIDI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbkluUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKCh0YXNrRGF0ZSAtIHByb2plY3RTdGFydCkgLyAocHJvamVjdEVuZCAtIHByb2plY3RTdGFydCkpICogMTAwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25JbkNvbnRlbnQgPSBwb3NpdGlvbkVuZCAhPT0gbnVsbCA/IE1hdGgucm91bmQoKHBvc2l0aW9uRW5kIC0gcG9zaXRpb25TdGFydCkgKiBwb3NpdGlvbkluUGVyY2VudGFnZSAvIDEwMCkgKyBwb3NpdGlvblN0YXJ0IDogcG9zaXRpb25TdGFydDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gcG9zaXRpb25JbkNvbnRlbnQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgJHRpbWVsaW5lU21hbGwuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgJHRpbWVsaW5lID0gJCh0aGlzKTtcblxuICAgICAgICAgICAgbGV0ICRwcm9qZWN0cyA9ICR0aW1lbGluZS5maW5kKCcudGltZWxpbmUtc21hbGwtaGVhZGVyIC5wcm9qZWN0Jyk7XG4gICAgICAgICAgICBsZXQgJHRhc2tzID0gJHRpbWVsaW5lLmZpbmQoJy50aW1lbGluZS1zbWFsbC1jb250ZW50Jyk7XG4gICAgICAgICAgICBsZXQgdGFza0hlaWdodCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgdGFza3NMaW5lcyA9IFtdO1xuXG4gICAgICAgICAgICBsZXQgdGFza1RvcFBvc2l0aW9uID0gZnVuY3Rpb24gKHRhc2tMZWZ0UG9zaXRpb24sIHRhc2tXaWR0aEVsKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5ID0gMDsga2V5IDwgdGFza3NMaW5lcy5sZW5ndGg7IGtleSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXNrc0xpbmVzW2tleV0gPCB0YXNrTGVmdFBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXNrc0xpbmVzW2tleV0gPSB0YXNrTGVmdFBvc2l0aW9uICsgdGFza1dpZHRoRWwgKyAzMDtcbiAgICAgICAgICAgICAgICAgICAgICAgI
21167HJldHVybiBrZXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbmV4dEtleSA9IHRhc2tzTGluZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRhc2tzTGluZXMucHVzaCh0YXNrTGVmdFBvc2l0aW9uICsgdGFza1dpZHRoRWwgKyAzMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHRLZXk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAkdGFza3MuZmluZCgnLnRhc2snKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgJHRhc2sgPSAkKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5ldyBEYXRlKCR0YXNrLmF0dHIoJ2RhdGEtZGF0ZScpKSA+IGN1cnJlbnREYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICR0YXNrLmFkZENsYXNzKCd0YXNrLWluY29taW5nJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJHRhc2suYWRkQ2xhc3MoJ3Rhc2stZG9uZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICR0YXNrLmNsb25lKCkuYXBwZW5kVG8oJHByb2plY3RzLmZpcnN0KCkuZmluZCgnLnRhc2tzJykpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCBpbml0VGFza3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRpbWVsaW5lV2lkdGggPSAkdGltZWxpbmUud2lkdGgoKTtcbiAgICAgICAgICAgICAgICB0YXNrc0xpbmVzID0gW107XG5cbiAgICAgICAgICAgICAgICAkdGFza3MuZmluZCgnLnRhc2snKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0ICR0YXNrID0gJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoJCh3aW5kb3cpLndpZHRoKCkgPiA3NjgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0YXNrV2lkdGhFbCA9ICR0YXNrLm91dGVyV2lkdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0YXNrTGVmdFBvc2l0aW9uID0gdGFza0luUHJvamVjdFBvc2l0aW9uKCR0YXNrKSAtICh0YXNrV2lkdGhFbCAvIDIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFza0hlaWdodCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tIZWlnaHQgPSAkdGFzay5vdXRlckhlaWdodCgpICsgMjA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGFza0xlZnRQb3NpdGlvbiArIHRhc2tXaWR0aEVsKSA+IHRpbWVsaW5lV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGFzay5maW5kKCcudGFzay1saW5lJykuY3NzKCdsZWZ0JywgKHRhc2tXaWR0aEVsIC8gMikgKyAoKHRhc2tMZWZ0UG9zaXRpb24gKyB0YXNrV2lkdGhFbCkgLSB0aW1lbGluZVdpZHRoKSArICdweCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tMZWZ0UG9zaXRpb24gPSB0aW1lbGluZVdpZHRoIC0gdGFza1dpZHRoRWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrTGVmdFBvc2l0aW9uIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0YXNrLmZpbmQoJy50YXNrLWxpbmUnKS5jc3MoJ2xlZnQnLCAodGFza1dpZHRoRWwgLyAyKSArIHRhc2tMZWZ0UG9zaXRpb24gKyAncHgnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrTGVmdFBvc2l0aW9uID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bWJlck9mTGluZSA9IHRhc2tUb3BQb3NpdGlvbih0YXNrTGVmdFBvc2l0aW9uLCB0YXNrV2lkdGhFbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICR0YXNrLmNzcygnbGVmdCcsIHRhc2tMZWZ0UG9zaXRpb24gKyAncHgnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICR0YXNrLmNzcygndG9wJywgbnVtYmVyT2ZMaW5lICogdGFza0hlaWdodCArICdweCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgJHRhc2suYXR0cignZGF0YS1saW5lJywgbnVtYmVyT2ZMaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKCQod2luZG93KS53aWR0aCgpID4gNzY4KSB7XG4gICAgICAgICAgICAgICAgICAgICR0YXNrcy5maW5kKCcudGFzaycpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jc3MoJ3pJbmRleCcsICh0YXNrc0xpbmVzLmxlbmd0aCAtIHBhcnNlSW50KCQodGhpcykuYXR0cignZGF0YS1saW5lJykpKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAkdGltZWxpbmUuZmluZCgnLnRpbWVsaW5lLXNtYWxsLWNvbnRlbnQnKS5oZWlnaHQoKE9iamVjdC5rZXlzKHRhc2tzTGluZXMpLmxlbmd0aCAqIHRhc2tIZWlnaHQpICsgMTApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGluaXRUYXNrcygpO1xuICAgICAgICAgICAgJHRpbWVsaW5lLnJlbW92ZUNsYXNzKCdsb2FkJyk7XG5cbiAgICAgICAgICAgIGxldCByZXNpemVUaW1lcjtcbiAgICAgICAgICAgICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXNpemVUaW1lcik7XG5cbiAgICAgICAgICAgICAgICByZXNpemVUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpbml0VGFza3MoKTtcbiAgICAgICAgICAgICAgICB9LCAyNTApO1xuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG4iLCIoZnVuY3Rpb24gKCQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICAkKCcudGltZWxpbmUnKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICBsZXQgJHRpbWVsaW5lQmlnID0gJCh0aGlzKTtcbiAgICAgICAgdGhpcy5fdGltZWxpbmVCaWcgPSB7XG4gICAgICAgICAgICB2Y
21167XJzOiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBlbDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Zpc3VhbGl6YXRpb24nKSxcbiAgICAgICAgICAgICAgICBoaWdobGlnaHQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRpbWVsaW5lOiBudWxsLFxuICAgICAgICAgICAgICAgIHdyYXBwZXI6ICQodGhpcylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjdXN0b21PcmRlcjogZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYS5zdGFydCAtIGIuc3RhcnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAhPT0gMCA/IHJlc3VsdCA6IChhLmVuZCAtIGIuZW5kKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmVwYXJlRGF0YTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgICAgICAgICBzZWxmLnZhcnMuaGlnaGxpZ2h0ID0gc2VsZi52YXJzLndyYXBwZXIuaGFzQ2xhc3MoJ2hpZ2hsaWdodC1nZW5lcmljJyk7XG4gICAgICAgICAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5zZXREYXRhKCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgc3RhcnREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICBzdGFydERhdGUuc2V0TW9udGgoc3RhcnREYXRlLmdldE1vbnRoKCkgLSA2KTtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlndXJlZEhlaWdodCA9IHRoaXMudmFycy5lbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtaGVpZ2h0JykgPyBwYXJzZUludCh0aGlzLnZhcnMuZWwuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oJ2RhdGEtaGVpZ2h0JykudmFsdWUpIDogMDtcbiAgICAgICAgICAgICAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLm1heChpc05hTihjb25maWd1cmVkSGVpZ2h0KSA/IDAgOiBjb25maWd1cmVkSGVpZ2h0LCA0MDApLCAvL3B4XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZTogJCgnaHRtbCcpLmF0dHIoJ2xhbmcnKSxcbiAgICAgICAgICAgICAgICAgICAgb3JkZXI6IHRoaXMuY3VzdG9tT3JkZXIsXG4gICAgICAgICAgICAgICAgICAgIHNob3dDdXJyZW50VGltZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbFNjcm9sbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxTY3JvbGw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmFuZ2UnLFxuICAgICAgICAgICAgICAgICAgICBzdGFydDogc3RhcnREYXRlLFxuICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXhpczogJ3RvcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiAndG9wJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB6b29tTWluOiAxMDAwICogNjAgKiA2MCAqIDI0ICogMzEgKiAxMiwgICAgLy8gb25lIHdlZWsgaW4gbWlsbGlzZWNvbmRzXG4gICAgICAgICAgICAgICAgICAgIHpvb21NYXg6IDEwMDAgKiA2MCAqIDYwICogMjQgKiAzMSAqIDEyLCAgICAvLyBvbmUgeWVhciBpbiBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGZ1bmN0aW9uIChpdGVtKSB7IC8vIChpdGVtLCBlbGVtZW50LCBkYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS50eXBlQ2xhc3MgPT09ICdnZW5lcmljJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSBwYXJzZUludCgkKCcudGltZWxpbmVfX21vYmlsZScpLmRhdGEoJ2dlbmVyaWMtaGVpZ2h0JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlID0gJyBzdHlsZT1cImhlaWdodDogJyArIGhlaWdodCArICdlbTtcIic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc8ZGl2IGNsYXNzPVwiaXRlbS10eXBlLScgKyBpdGVtLnR5cGVDbGFzcyArICdcIiBpZD1cIml0ZW0nICsgaXRlbS5pZCArICdcIicgKyBzdHlsZSArICc+JyArIGl0ZW0uaHRtbCArICc8L2Rpdj4nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBzID0gW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICcnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogJydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBzZWxmLnZhcnMudGltZWxpbmUgPSBzZWxmLnZhcnMuaGlnaGxpZ2h0ID8gbmV3IHZpcy5UaW1lbGluZShzZWxmLnZhcnMuZWwsIGl0ZW1zLCBncm91cHMsIG9wdGlvbnMpIDogbmV3IHZpcy5UaW1lbGluZShzZWxmLnZhcnMuZWwsIGl0ZW1zLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXREYXRhOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gW107XG5cbiAgICAgICAgICAgICAgICBzZWxmLnZhcnMud3JhcHBlci5maW5kKCcudGltZWxpbmUtaXRlbScpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICR0aGlzLmRhdGEoJ3VpZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6ICR0aGlzLmRhdGEoJ3N0YXJ0JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6ICR0aGlzLmRhdGEoJ2VuZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUNsYXNzOiAkdGhpcy5kYXRhKCd0eXBlJykgKyAoJHRoaXMuaGFzQ2xhc3MoJ3RpbWVsaW5lLWl0ZW0tZWFybHknKSA/ICcgZWFybHknIDogJycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAkdGhpcy5kYXRhKCd0eXBlJykgKyAoJHRoaXMuaGFzQ2xhc3MoJ2ZpbHRlci1zZWFyY2gtaGlkZScpID8gJyBoaWRlJyA6ICcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWw6ICR0aGlzLmZpbmQoJy50aW1lbGluZS1pdGVtX19jb250ZW50JykuaHRtbCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICR0aGlzLmZpbmQoJy50aW1lbGluZS1pdGVtX19jb250ZW50JykuaHRtbCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRTaXplOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZhcnMuaGlnaGxpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmdyb3VwID0gJHRoaXMuZGF0YSgndHlwZScpID09PSAnZ2VuZXJpYycgPyAxIDogMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZhcnMuZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLmhhc0NsYXNzKCdoaWRlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZhcnMuZGF0YS5yZW1vdmUoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGYudmFycy5kYXRhLmdldChpdGVtLmlkKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgI
vendor: 9,047 bytes, lines 21167-21317
21167HNlbGYudmFycy5kYXRhLmFkZChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYudmFycy5kYXRhID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYudmFycy5kYXRhID0gbmV3IHZpcy5EYXRhU2V0KGRhdGEsIHtmaWVsZElkOiAnaWQnLCB0eXBlOiB7c3RhcnQ6ICdJU09EYXRlJywgZW5kOiAnSVNPRGF0ZSd9fSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFycy5kYXRhO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXBhcmVEYXRhKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHRpbWVsaW5lRmlsdGVyQ2hhbmdlID0gZnVuY3Rpb24gKGVsLCBtYW51YWwpIHtcbiAgICAgICAgICAgIGxldCAkdGhpcyA9IG1hbnVhbCA9PT0gdHJ1ZSA/IGVsIDogJCh0aGlzKTtcblxuICAgICAgICAgICAgbGV0IHNlY3Rpb24gPSAkdGhpcy5jbG9zZXN0KCcuc2VjdGlvbi10aW1lbGluZScpO1xuICAgICAgICAgICAgbGV0IHNlY3Rpb25DaGVja2VkRWxlbWVudHMgPSBzZWN0aW9uLmZpbmQoJy50aW1lbGluZV9fZmlsdGVyIGlucHV0OmNoZWNrZWQnKS5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgICAgICAgICAgfSkuZ2V0KCk7XG5cbiAgICAgICAgICAgIGxldCBpdGVtcyA9IHNlY3Rpb24uZmluZCgnLnRpbWVsaW5lX19tb2JpbGUgLnRpbWVsaW5lLWl0ZW0nKTtcblxuICAgICAgICAgICAgaXRlbXMuYWRkQ2xhc3MoJ2hpZGUgY2hlY2tib3hmaWx0ZXInKTtcblxuICAgICAgICAgICAgaWYgKHNlY3Rpb25DaGVja2VkRWxlbWVudHMubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgIGl0ZW1zLnJlbW92ZUNsYXNzKCdjaGVja2JveGZpbHRlcicpO1xuICAgICAgICAgICAgICAgIGl0ZW1zLmZpbHRlcignOm5vdCgudGV4dGZpbHRlciknKS5yZW1vdmVDbGFzcygnaGlkZScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWN0aW9uQ2hlY2tlZEVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zLmZpbHRlcignW2RhdGEtdHlwZT1cIicgKyBlbCArICdcIl0nKS5yZW1vdmVDbGFzcygnY2hlY2tib3hmaWx0ZXInKTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXMuZmlsdGVyKCdbZGF0YS10eXBlPVwiJyArIGVsICsgJ1wiXTpub3QoLnRleHRmaWx0ZXIpJykucmVtb3ZlQ2xhc3MoJ2hpZGUnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJHRpbWVsaW5lQmlnWzBdLl90aW1lbGluZUJpZy5zZXREYXRhKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKGRvY3VtZW50KS5vbignY2hhbmdlJywgJy50aW1lbGluZV9fZmlsdGVyIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXScsIHRpbWVsaW5lRmlsdGVyQ2hhbmdlKTtcbiAgICAgICAgfSwgMTAwKTtcblxuICAgICAgICB0aGlzLl90aW1lbGluZUJpZy5pbml0KCk7XG4gICAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGxldCBnZW5lcmljID0gW10sIG90aGVyID0gW107XG4gICAgICAgICAgICAkdGltZWxpbmVCaWcuZmluZCgnLnRpbWVsaW5lLWl0ZW0nKS5ub3QoJy50aW1lbGluZS1pdGVtLWVhcmx5JykuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9ICQodGhpcykuZGF0YSgndHlwZScpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnZ2VuZXJpYycpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYy5wdXNoKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZXJpYy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKGdlbmVyaWMuc2hpZnQoKSkucmVtb3ZlQ2xhc3MoJ3Nob3cnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG90aGVyLnB1c2godGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvdGhlci5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKG90aGVyLnNoaWZ0KCkpLnJlbW92ZUNsYXNzKCdzaG93Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICQoZ2VuZXJpYy5jb25jYXQob3RoZXIpKS5hZGRDbGFzcygnc2hvdycpO1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljayB0b3VjaCcsICcudGltZWxpbmVfX2RhdGUtdGV4dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICQodGhpcykucHJldigpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSkoalF1ZXJ5KTtcbiJdfQ==
21168
21169/*!
21170 * Lightbox v2.9.0
21171 * by Lokesh Dhakar
21172 *
21173 * More info:
21174 * http://lokeshdhakar.com/projects/lightbox2/
21175 *
21176 * Copyright 2007, 2015 Lokesh Dhakar
21177 * Released under the MIT license
21178 * https://github.com/lokesh/lightbox2/blob/master/LICENSE
21179 *
21180 * @preserve
21181 */
21182
21183// Uses Node, AMD or browser globals to create a module.
21184(function (root, factory) {
21185    if (typeof define === 'function' && define.amd) {
21186        // AMD. Register as an anonymous module.
21187        define(['jquery'], factory);
21188    } else if (typeof exports === 'object') {
21189        // Node. Does not work with strict CommonJS, but
21190        // only CommonJS-like environments that support module.exports,
21191        // like Node.
21192        module.exports = factory(require('jquery'));
21193    } else {
21194        // Browser globals (root is window)
21195        root.lightbox = factory(root.jQuery);
21196    }
21197}(this, function ($) {
21198
21199  function Lightbox(options) {
21200    this.album = [];
21201    this.currentImageIndex = void 0;
21202    this.init();
21203
21204    // options
21205    this.options = $.extend({}, this.constructor.defaults);
21206    this.option(options);
21207  }
21208
21209  // Descriptions of all options available on the demo site:
21210  // http://lokeshdhakar.com/projects/lightbox2/index.html#options
21211  Lightbox.defaults = {
21212    albumLabel: 'Image %1 of %2',
21213    alwaysShowNavOnTouchDevices: false,
21214    fadeDuration: 600,
21215    fitImagesInViewport: true,
21216    imageFadeDuration: 600,
21217    // maxWidth: 800,
21218    // maxHeight: 600,
21219    positionFromTop: 50,
21220    resizeDuration: 700,
21221    showImageNumberLabel: true,
21222    wrapAround: false,
21223    disableScrolling: true,
21224    /*
21225    Sanitize Title
21226    If the caption data is trusted, for example you are hardcoding it in, then leave this to false.
21227    This will free you to add html tags, such as links, in the caption.
21228
21229    If the caption data is user submitted or from some other untrusted source, then set this to true
21230    to prevent xss and other injection attacks.
21231     */
21232    sanitizeTitle: false
21233  };
21234
21235  Lightbox.prototype.option = function(options) {
21236    $.extend(this.options, options);
21237  };
21238
21239  Lightbox.prototype.imageCountLabel = function(currentImageNum, totalImages) {
21240    return this.options.albumLabel.replace(/%1/g, currentImageNum).replace(/%2/g, totalImages);
21241  };
21242
21243  Lightbox.prototype.init = function() {
21244    var self = this;
21245    // Both enable and build methods require the body tag to be in the DOM.
21246    $(document).ready(function() {
21247      self.enable();
21248      self.build();
21249    });
21250  };
21251
21252  // Loop through anchors and areamaps looking for either data-lightbox attributes or rel attributes
21253  // that contain 'lightbox'. When these are clicked, start lightbox.
21254  Lightbox.prototype.enable = function() {
21255    var self = this;
21256    $('body').on('click', 'a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]', function(event) {
21257      self.start($(event.currentTarget));
21258      return false;
21259    });
21260  };
21261
21262  // Build html for the lightbox and the overlay.
21263  // Attach event handlers to the new DOM elements. click click click
21264  Lightbox.prototype.build = function() {
21265    var self = this;
21266    $('<div id="lightboxOverlay" class="lightboxOverlay"></div><div id="lightbox" class="lightbox"><div class="lb-outerContainer"><div class="lb-container"><img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" /><div class="lb-nav"><a class="lb-prev" href="" ></a><a class="lb-next" href="" ></a></div><div class="lb-loader"><a class="lb-cancel"></a></div></div></div><div class="lb-dataContainer"><div class="lb-data"><div class="lb-details"><span class="lb-caption"></span><span class="lb-number"></span></div><div class="lb-closeContainer"><a class="lb-close"></a></div></div></div></div>').appendTo($('body'));
21267
21268    // Cache jQuery objects
21269    this.$lightbox       = $('#lightbox');
21270    this.$overlay        = $('#lightboxOverlay');
21271    this.$outerContainer = this.$lightbox.find('.lb-outerContainer');
21272    this.$container      = this.$lightbox.find('.lb-container');
21273    this.$image          = this.$lightbox.find('.lb-image');
21274    this.$nav            = this.$lightbox.find('.lb-nav');
21275
21276    // Store css values for future lookup
21277    this.containerPadding = {
21278      top: parseInt(this.$container.css('padding-top'), 10),
21279      right: parseInt(this.$container.css('padding-right'), 10),
21280      bottom: parseInt(this.$container.css('padding-bottom'), 10),
21281      left: parseInt(this.$container.css('padding-left'), 10)
21282    };
21283
21284    this.imageBorderWidth = {
21285      top: parseInt(this.$image.css('border-top-width'), 10),
21286      right: parseInt(this.$image.css('border-right-width'), 10),
21287      bottom: parseInt(this.$image.css('border-bottom-width'), 10),
21288      left: parseInt(this.$image.css('border-left-width'), 10)
21289    };
21290
21291    // Attach event handlers to the newly minted DOM elements
21292    this.$overlay.hide().on('click', function() {
21293      self.end();
21294      return false;
21295    });
21296
21297    this.$lightbox.hide().on('click', function(event) {
21298      if ($(event.target).attr('id') === 'lightbox') {
21299        self.end();
21300      }
21301      return false;
21302    });
21303
21304    this.$outerContainer.on('click', function(event) {
21305      if ($(event.target).attr('id') === 'lightbox') {
21306        self.end();
21307      }
21308      return false;
21309    });
21310
21311    this.$lightbox.find('.lb-prev').on('click', function() {
21312      if (self.currentImageIndex === 0) {
21313        self.changeImage(self.album.length - 1);
21314      } else {
21315        self.changeImage(self.currentImageIndex - 1);
21316      }
21317      return false;
21318    });
21319
21320    this.$lightbox.find('.lb-next').on('click', function() {
21321      if (self.currentImageIndex === self.album.length - 1) {
21322        self.changeImage(0);
21323      } else {
21324        self.changeImage(self.currentImageIndex + 1);
21325      }
21326      return false;
21327    });
21328
21329    /*
21330      Show context menu for image on right-click
21331
21332      There is a div containing the navigation that spans the entire image and lives above of it. If
21333      you right-click, you are right clicking this div and not the image. This prevents users from
21334      saving the image or using other context menu actions with the image.
21335
21336      To fix this, when we detect the right mouse button is pressed down, but not yet clicked, we
21337      set pointer-events to none on the nav div. This is so that the upcoming right-click event on
21338      the next mouseup will bubble down to the image. Once the right-click/contextmenu event occurs
21339      we set the pointer events back to auto for the nav div so it can capture hover and left-click
21340      events as usual.
21341     */
21342    this.$nav.on('mousedown', function(event) {
21343      if (event.which === 3) {
21344        self.$nav.css('pointer-events', 'none');
21345
21346        self.$lightbox.one('contextmenu', function() {
21347          setTimeout(function() {
21348              this.$nav.css('pointer-events', 'auto');
21349          }.bind(self), 0);
21350        });
21351      }
21352    });
21353
21354
21355    this.$lightbox.find('.lb-loader, .lb-close').on('click', function() {
21356      self.end();
21357      return false;
21358    });
21359  };
21360
21361  // Show overlay and lightbox. If the image is part of a set, add siblings to album array.
21362  Lightbox.prototype.start = function($link) {
21363    var self    = this;
21364    var $window = $(window);
21365
21366    $window.on('resize', $.proxy(this.sizeOverlay, this));
21367
21368    $('select, object, embed').css({
21369      visibility: 'hidden'
21370    });
21371
21372    this.sizeOverlay();
21373
21374    this.album = [];
21375    var imageNumber = 0;
21376
21377    function addToAlbum($link) {
21378      self.album.push({
21379        link: $link.attr('href'),
21380        title: $link.attr('data-title') || $link.attr('title')
21381      });
21382    }
21383
21384    // Support both data-lightbox attribute and rel attribute implementations
21385    var dataLightboxValue = $link.attr('data-lightbox');
21386    var $links;
21387
21388    if (dataLightboxValue) {
21389      $links = $($link.prop('tagName') + '[data-lightbox="' + dataLightboxValue + '"]');
21390      for (var i = 0; i < $links.length; i = ++i) {
21391        addToAlbum($($links[i]));
21392        if ($links[i] === $link[0]) {
21393          imageNumber = i;
21394        }
21395      }
21396    } else {
21397      if ($link.attr('rel') === 'lightbox') {
21398        // If image is not part of a set
21399        addToAlbum($link);
21400      } else {
21401        // If image is part of a set
21402        $links = $($link.prop('tagName') + '[rel="' + $link.attr('rel') + '"]');
21403        for (var j = 0; j < $links.length; j = ++j) {
21404          addToAlbum($($links[j]));
21405          if ($links[j] === $link[0]) {
21406            imageNumber = j;
21407          }
21408        }
21409      }
21410    }
21411
21412    // Position Lightbox
21413    var top  = $window.scrollTop() + this.options.positionFromTop;
21414    var left = $window.scrollLeft();
21415    this.$lightbox.css({
21416      top: top + 'px',
21417      left: left + 'px'
21418    }).fadeIn(this.options.fadeDuration);
21419
21420    // Disable scrolling of the page while open
21421    if (this.options.disableScrolling) {
21422      $('body').addClass('lb-disable-scrolling');
21423    }
21424
21425    this.changeImage(imageNumber);
21426  };
21427
21428  // Hide most UI elements in preparation for the animated resizing of the lightbox.
21429  Lightbox.prototype.changeImage = function(imageNumber) {
21430    var self = this;
21431
21432    this.disableKeyboardNav();
21433    var $image = this.$lightbox.find('.lb-image');
21434
21435    this.$overlay.fadeIn(this.options.fadeDuration);
21436
21437    $('.lb-loader').fadeIn('slow');
21438    this.$lightbox.find('.lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption').hide();
21439
21440    this.$outerContainer.addClass('animating');
21441
21442    // When image to show is preloaded, we send the width and height to sizeContainer()
21443    var preloader = new Image();
21444    preloader.onload = function() {
21445      var $preloader;
21446      var imageHeight;
21447      var imageWidth;
21448      var maxImageHeight;
21449      var maxImageWidth;
21450      var windowHeight;
21451      var windowWidth;
21452
21453      $image.attr('src', self.album[imageNumber].link);
21454
21455      $preloader = $(preloader);
21456
21457      $image.width(preloader.width);
21458      $image.height(preloader.height);
21459
21460      if (self.options.fitImagesInViewport) {
21461        // Fit image inside the viewport.
21462        // Take into account the border around the image and an additional 10px gutter on each side.
21463
21464        windowWidth    = $(window).width();
21465        windowHeight   = $(window).height();
21466        maxImageWidth  = windowWidth - self.containerPadding.left - self.containerPadding.right - self.imageBorderWidth.left - self.imageBorderWidth.right - 20;
21467        maxImageHeight = windowHeight - self.containerPadding.top - self.containerPadding.bottom - self.imageBorderWidth.top - self.imageBorderWidth.bottom - 120;
21468
21469        // Check if image size is larger then maxWidth|maxHeight in settings
21470        if (self.options.maxWidth && self.options.maxWidth < maxImageWidth) {
21471          maxImageWidth = self.options.maxWidth;
21472        }
21473        if (self.options.maxHeight && self.options.maxHeight < maxImageWidth) {
21474          maxImageHeight = self.options.maxHeight;
21475        }
21476
21477        // Is the current image's width or height is greater than the maxImageWidth or maxImageHeight
21478        // option than we need to size down while maintaining the aspect ratio.
21479        if ((preloader.width > maxImageWidth) || (preloader.height > maxImageHeight)) {
21480          if ((preloader.width / maxImageWidth) > (preloader.height / maxImageHeight)) {
21481            imageWidth  = maxImageWidth;
21482            imageHeight = parseInt(preloader.height / (preloader.width / imageWidth), 10);
21483            $image.width(imageWidth);
21484            $image.height(imageHeight);
21485          } else {
21486            imageHeight = maxImageHeight;
21487            imageWidth = parseInt(preloader.width / (preloader.height / imageHeight), 10);
21488            $image.width(imageWidth);
21489            $image.height(imageHeight);
21490          }
21491        }
21492      }
21493      self.sizeContainer($image.width(), $image.height());
21494    };
21495
21496    preloader.src          = this.album[imageNumber].link;
21497    this.currentImageIndex = imageNumber;
21498  };
21499
21500  // Stretch overlay to fit the viewport
21501  Lightbox.prototype.sizeOverlay = function() {
21502    this.$overlay
21503      .width($(document).width())
21504      .height($(document).height());
21505  };
21506
21507  // Animate the size of the lightbox to fit the image we are showing
21508  Lightbox.prototype.sizeContainer = function(imageWidth, imageHeight) {
21509    var self = this;
21510
21511    var oldWidth  = this.$outerContainer.outerWidth();
21512    var oldHeight = this.$outerContainer.outerHeight();
21513    var newWidth  = imageWidth + this.containerPadding.left + this.containerPadding.right + this.imageBorderWidth.left + this.imageBorderWidth.right;
21514    var newHeight = imageHeight + this.containerPadding.top + this.containerPadding.bottom + this.imageBorderWidth.top + this.imageBorderWidth.bottom;
21515
21516    function postResize() {
21517      self.$lightbox.find('.lb-dataContainer').width(newWidth);
21518      self.$lightbox.find('.lb-prevLink').height(newHeight);
21519      self.$lightbox.find('.lb-nextLink').height(newHeight);
21520      self.showImage();
21521    }
21522
21523    if (oldWidth !== newWidth || oldHeight !== newHeight) {
21524      this.$outerContainer.animate({
21525        width: newWidth,
21526        height: newHeight
21527      }, this.options.resizeDuration, 'swing', function() {
21528        postResize();
21529      });
21530    } else {
21531      postResize();
21532    }
21533  };
21534
21535  // Display the image and its details and begin preload neighboring images.
21536  Lightbox.prototype.showImage = function() {
21537    this.$lightbox.find('.lb-loader').stop(true).hide();
21538    this.$lightbox.find('.lb-image').fadeIn(this.options.imageFadeDuration);
21539
21540    this.updateNav();
21541    this.updateDetails();
21542    this.preloadNeighboringImages();
21543    this.enableKeyboardNav();
21544  };
21545
21546  // Display previous and next navigation if appropriate.
21547  Lightbox.prototype.updateNav = function() {
21548    // Check to see if the browser supports touch events. If so, we take the conservative approach
21549    // and assume that mouse hover events are not supported and always show prev/next navigation
21550    // arrows in image sets.
21551    var alwaysShowNav = false;
21552    try {
21553      document.createEvent('TouchEvent');
21554      alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false;
21555    } catch (e) {}
21556
21557    this.$lightbox.find('.lb-nav').show();
21558
21559    if (this.album.length > 1) {
21560      if (this.options.wrapAround) {
21561        if (alwaysShowNav) {
21562          this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1');
21563        }
21564        this.$lightbox.find('.lb-prev, .lb-next').show();
21565      } else {
21566        if (this.currentImageIndex > 0) {
21567          this.$lightbox.find('.lb-prev').show();
21568          if (alwaysShowNav) {
21569            this.$lightbox.find('.lb-prev').css('opacity', '1');
21570          }
21571        }
21572        if (this.currentImageIndex < this.album.length - 1) {
21573          this.$lightbox.find('.lb-next').show();
21574          if (alwaysShowNav) {
21575            this.$lightbox.find('.lb-next').css('opacity', '1');
21576          }
21577        }
21578      }
21579    }
21580  };
21581
21582  // Display caption, image number, and closing button.
21583  Lightbox.prototype.updateDetails = function() {
21584    var self = this;
21585
21586    // Enable anchor clicks in the injected caption html.
21587    // Thanks Nate Wright for the fix. @https://github.com/NateWr
21588    if (typeof this.album[this.currentImageIndex].title !== 'undefined' &&
21589      this.album[this.currentImageIndex].title !== '') {
21590      var $caption = this.$lightbox.find('.lb-caption');
21591      if (this.options.sanitizeTitle) {
21592        $caption.text(this.album[this.currentImageIndex].title);
21593      } else {
21594        $caption.html(this.album[this.currentImageIndex].title);
21595      }
21596      $caption.fadeIn('fast')
21597        .find('a').on('click', function(event) {
21598          if ($(this).attr('target') !== undefined) {
21599            window.open($(this).attr('href'), $(this).attr('target'));
21600          } else {
21601            location.href = $(this).attr('href');
21602          }
21603        });
21604    }
21605
21606    if (this.album.length > 1 && this.options.showImageNumberLabel) {
21607      var labelText = this.imageCountLabel(this.currentImageIndex + 1, this.album.length);
21608      this.$lightbox.find('.lb-number').text(labelText).fadeIn('fast');
21609    } else {
21610      this.$lightbox.find('.lb-number').hide();
21611    }
21612
21613    this.$outerContainer.removeClass('animating');
21614
21615    this.$lightbox.find('.lb-dataContainer').fadeIn(this.options.resizeDuration, function() {
21616      return self.sizeOverlay();
21617    });
21618  };
21619
21620  // Preload previous and next images in set.
21621  Lightbox.prototype.preloadNeighboringImages = function() {
21622    if (this.album.length > this.currentImageIndex + 1) {
21623      var preloadNext = new Image();
21624      preloadNext.src = this.album[this.currentImageIndex + 1].link;
21625    }
21626    if (this.currentImageIndex > 0) {
21627      var preloadPrev = new Image();
21628      preloadPrev.src = this.album[this.currentImageIndex - 1].link;
21629    }
21630  };
21631
21632  Lightbox.prototype.enableKeyboardNav = function() {
21633    $(document).on('keyup.keyboard', $.proxy(this.keyboardAction, this));
21634  };
21635
21636  Lightbox.prototype.disableKeyboardNav = function() {
21637    $(document).off('.keyboard');
21638  };
21639
21640  Lightbox.prototype.keyboardAction = function(event) {
21641    var KEYCODE_ESC        = 27;
21642    var KEYCODE_LEFTARROW  = 37;
21643    var KEYCODE_RIGHTARROW = 39;
21644
21645    var keycode = event.keyCode;
21646    var key     = String.fromCharCode(keycode).toLowerCase();
21647    if (keycode === KEYCODE_ESC || key.match(/x|o|c/)) {
21648      this.end();
21649    } else if (key === 'p' || keycode === KEYCODE_LEFTARROW) {
21650      if (this.currentImageIndex !== 0) {
21651        this.changeImage(this.currentImageIndex - 1);
21652      } else if (this.options.wrapAround && this.album.length > 1) {
21653        this.changeImage(this.album.length - 1);
21654      }
21655    } else if (key === 'n' || keycode === KEYCODE_RIGHTARROW) {
21656      if (this.currentImageIndex !== this.album.length - 1) {
21657        this.changeImage(this.currentImageIndex + 1);
21658      } else if (this.options.wrapAround && this.album.length > 1) {
21659        this.changeImage(0);
21660      }
21661    }
21662  };
21663
21664  // Closing time. :-(
21665  Lightbox.prototype.end = function() {
21666    this.disableKeyboardNav();
21667    $(window).off('resize', this.sizeOverlay);
21668    this.$lightbox.fadeOut(this.options.fadeDuration);
21669    this.$overlay.fadeOut(this.options.fadeDuration);
21670    $('select, object, embed').css({
21671      visibility: 'visible'
21672    });
21673    if (this.options.disableScrolling) {
21674      $('body').removeClass('lb-disable-scrolling');
21675    }
21676  };
21677
21678  return new Lightbox();
21679}));
21680
21681document.addEventListener('DOMContentLoaded', () => {
21682    let swiper;
21683
21684    // Slider
21685    const initSwiper = () => {
21686        swiper = new Swiper('.swiper', {
21687            slidesPerView: 2,
21688            grid: {
21689                rows: 2,
21690            },
21691            spaceBetween: 0,
21692            navigation: {
21693                nextEl: '.swiper-button-next',
21694                prevEl: '.swiper-button-prev',
21695            },
21696            pagination: {
21697                el: '.swiper-pagination',
21698                clickable: true,
21699            },
21700            preventClicks: false,
21701            preventClicksPropagation: false,
21702            allowTouchMove: true,
21703            loop: true,
21704            noSwiping: true
21705        });
21706    }
21707
21708    initSwiper();
21709
21710    const blueskyFeed = document.querySelectorAll('section.bluesky');
21711    if (blueskyFeed.length !== 0) {
21712        blueskyFeed.forEach(section => {
21713            const allFeeds = section.querySelectorAll('.swiper-slide');
21714            const buttons = section.querySelectorAll('.swiper-navigation__tabs .btn');
21715
21716            const getSpecificSocialCounts = () => {
21717                const counts = {
21718                    bluesky: 0,
21719                    instagram: 0,
21720                    linkedin: 0
21721                };
21722
21723                allFeeds.forEach(feed => {
21724                    const social = feed.getAttribute('data-social');
21725                    if (social) {
21726                        counts[social] += 1;
21727                    }
21728                });
21729
21730                return counts;
21731            };
21732
21733            const socialCounts = getSpecificSocialCounts();
21734
21735            buttons.forEach((button) => {
21736                const social = button.getAttribute('data-social-btn');
21737
21738                if (!socialCounts[social]) {
21739                    button.classList.add("hidden");
21740                }
21741
21742                button.addEventListener('click', () => {
21743                    const buttonActive = section.querySelector('.swiper-navigation__tabs .btn.isActive');
21744                    if (buttonActive) {
21745                        buttonActive.classList.remove('isActive');
21746                    }
21747
21748                    // Reset slides
21749                    const wrapper = section.querySelector('.swiper-wrapper');
21750                    const allSlides = section.querySelectorAll('.swiper-slide');
21751
21752                    // Destroy existing Swiper
21753                    if (swiper) swiper.destroy(true, true);
21754
21755                    // Clear wrapper
21756                    wrapper.innerHTML = '';
21757
21758                    if (button === buttonActive) {
21759                        // Show all slides
21760                        if (allFeeds.length > 0) {
21761                            allFeeds.forEach(feed => wrapper.appendChild(feed));
21762                        }
21763                    } else {
21764                        button.classList.add('isActive');
21765                        if (allFeeds.length > 0) {
21766                            allFeeds.forEach(feed => {
21767                                if (feed.getAttribute('data-social') === social) {
21768                                    wrapper.appendChild(feed);
21769                                }
21770                            });
21771                        }
21772                    }
21773
21774                    // Re-init Swiper
21775                    if (allFeeds.length > 0) {
21776                        initSwiper();
21777                    }
21778                });
21779            });
21780
vendor: 33,571 bytes, lines 21781-21828
21781            // Set valid URL
21782            const feeds = document.querySelectorAll('.bluesky .swiper-slide');
21783            if (feeds.length > 0) {
21784                feeds.forEach(feed => {
21785                    const item = feed.querySelector('.bluesky-post')
21786                    if (item) {
21787                        const url = item.href;
21788                        const type = feed.getAttribute('data-social')
21789                        if (url) {
21790
21791                            if (type === 'bluesky') {
21792                                const postId = url.split('/').pop();
21793                                item.href = `https://bsky.app/profile/agencerecherche.bsky.social/post/${postId}`;
21794                            }
21795
21796                            // Check if DRAG or CLICK
21797                            let drag = false;
21798                            item.addEventListener('mousedown', (event) => {
21799                                event.preventDefault();
21800                                drag = false;
21801                            });
21802                            item.addEventListener('mousemove', (event) => {
21803                                event.preventDefault();
21804                                drag = true;
21805                            });
21806                            item.addEventListener('mouseup', (event) => {
21807                                event.preventDefault();
21808                            });
21809                        }
21810                    }
21811                });
21812            }
21813        });
21814    }
21815});
21816/**
21817 * Swiper 14.3.0
21818 * Most modern mobile touch slider and framework with hardware accelerated transitions
21819 * https://swiperjs.com
21820 *
21821 * Copyright 2014-2026 Vladimir Kharlampidi
21822 *
21823 * Released under the MIT License
21824 *
21825 * Released on: September 28, 2026
21826 */
21827
21828var Swiper=function(){"use strict";function e(e=""){return e.trim().split(" ").filter(e=>!!e.trim())}function t(e,t=0){return setTimeout(e,t)}function s(){return Date.now()}function i(e,t="x"){const s=function(e){return window.getComputedStyle(e,null)}(e),i=s.transform||s.webkitTransform;if(!i||"none"===i)return 0;const r=new DOMMatrixReadOnly(i);return"x"===t?r.m41:r.m42}function r(e){return"object"==typeof e&&null!==e&&!!e.constructor&&"Object"===Object.prototype.toString.call(e).slice(8,-1)}function a(e){return"undefined"!=typeof HTMLElement&&e instanceof HTMLElement||!!e&&"object"==typeof e&&(1===e.nodeType||11===e.nodeType)}function n(e,...t){const s=Object(e);for(let e=0;e<t.length;e+=1){const i=t[e];if(null==i||a(i))continue;const l=i,o=Object.keys(Object(l));for(let e=0,t=o.length;e<t;e+=1){const t=o[e];if("__proto__"===t||"constructor"===t||"prototype"===t)continue;const i=Object.getOwnPropertyDescriptor(l,t);if(!i||!i.enumerable)continue;const a=l[t];r(s[t])&&r(a)?a.__swiper__?s[t]=a:n(s[t],a):!r(s[t])&&r(a)?(s[t]={},a.__swiper__?s[t]=a:n(s[t],a)):s[t]=a}}return s}function l(e,t,s){e.style.setProperty(t,s)}function o(e){const t=e.querySelector(".swiper-slide-transform");if(t)return t;if(e.shadowRoot){const t=e.shadowRoot.querySelector(".swiper-slide-transform");if(t)return t}return e}function d(e,t=""){const s=[...e.children];return e instanceof HTMLSlotElement&&s.push(...e.assignedElements()),t?s.filter(e=>e.matches(t)):s}function c(e){try{console.warn(e)}catch{}}function p(t,s=[]){const i=document.createElement(t);return i.classList.add(...Array.isArray(s)?s:e(s)),i}function u(e){const t=e.getBoundingClientRect();return{top:t.top-(e.clientTop||0),left:t.left-(e.clientLeft||0)}}function m(e,t){return window.getComputedStyle(e,null).getPropertyValue(t)}function h(e){if(e&&e.parentNode)return[...e.parentNode.children].indexOf(e)}function f(e,t){const s=[];let i=e.parentElement;for(;i;)t&&!i.matches(t)||s.push(i),i=i.parentElement;return s}function g(e,t){t&&e.addEventListener("transitionend",function s(i){i.target===e&&(e.removeEventListener("transitionend",s),t.call(e,i))})}function v(e,t,s){{const s=window.getComputedStyle(e,null);return e["width"===t?"offsetWidth":"offsetHeight"]+parseFloat(s.getPropertyValue("width"===t?"margin-right":"margin-top"))+parseFloat(s.getPropertyValue("width"===t?"margin-left":"margin-bottom"))}}function w(e){return(Array.isArray(e)?e:[e]).filter(e=>!!e)}function b(e){return t=>Math.abs(t)>0&&e.browser&&e.browser.need3dFix&&Math.abs(t)%90==0?t+.001:t}function y(e,t=""){const s=globalThis.trustedTypes;e.innerHTML=void 0!==s?s.createPolicy("html",{createHTML:e=>e}).createHTML(t):t}let E,S,x;function T(){return E||(E="undefined"==typeof window?{touch:!1}:{touch:"ontouchstart"in window||navigator.maxTouchPoints>0}),E}function M(e={}){return S||(S=function({userAgent:e}={}){if("undefined"==typeof window)return{ios:!1,android:!1};const t=T(),s=navigator.platform,i=e||navigator.userAgent,r={ios:!1,android:!1},a=/(Android);?[\s/]+([\d.]+)?/.test(i),n=/(iPhone\sOS|iOS|iPod)/.test(i),l=/iPad/.test(i),o="MacIntel"===s&&t.touch&&navigator.maxTouchPoints>1,d=l||o;return a&&!("Win32"===s)&&(r.os="android",r.android=!0),(d||n)&&(r.os="ios",r.ios=!0),r}(e)),S}function C(){return x||(x=function(){if("undefined"==typeof window)return{isSafari:!1,isWebView:!1,need3dFix:!1};const e=M(),t=navigator.userAgent,s=t.toLowerCase(),i=s.includes("safari")&&!s.includes("chrome")&&!s.includes("android"),r=/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(t);return{isSafari:i,isWebView:r,need3dFix:i||r&&e.ios}}()),x}const P=(e,t)=>{if(!e||e.destroyed||!e.params||!e.params.lazyPreload)return;const s=t.closest(e.isElement?"swiper-slide":`.${e.params.slideClass}`);if(s){let t=s.querySelector(`.${e.params.lazyPreloaderClass}`);!t&&e.isElement&&(s.shadowRoot?t=s.shadowRoot.querySelector(`.${e.params.lazyPreloaderClass}`):requestAnimationFrame(()=>{if(s.shadowRoot){const t=s.shadowRoot.querySelector(`.${e.params.lazyPreloaderClass}`);t&&!t.lazyPreloaderManaged&&t.remove()}})),t&&!t.lazyPreloaderManaged&&t.remove()}},L=(e,t)=>{if(!e.slides[t])return;const s=e.slides[t].querySelector('[loading="lazy"]');s&&s.removeAttribute("loading")},A=e=>{if(!e||e.destroyed||!e.params||!e.params.lazyPreload)return;let t=e.params.lazyPreloadPrevNext;const s=e.slides.length;if(!s||!t||t<0)return;t=Math.min(t,s);const i="auto"===e.params.slidesPerView?e.slidesPerViewDynamic():Math.ceil(e.params.slidesPerView),r=e.activeIndex;if(e.params.grid&&(e.params.grid.rows??1)>1){const s=r,a=[s-t];return a.push(...Array.from({length:t}).map((e,t)=>s+i+t)),void e.slides.forEach((t,s)=>{void 0!==t.column&&a.includes(t.column)&&L(e,s)})}const a=r+i-1;if(e.params.rewind||e.params.loop)for(let i=r-t;i<=a+t;i+=1){const t=(i%s+s)%s;(t<r||t>a)&&L(e,t)}else for(let i=Math.max(r-t,0);i<=Math.min(a+t,s-1);i+=1)i!==r&&(i>a||i<r)&&L(e,i)};const I=(e,t)=>!!(e.grid&&t.grid&&t.grid.rows>1);var z={setBreakpoint:function(){const e=this,{realIndex:t,initialized:s,params:i,el:r}=e,a=i.breakpoints;if(!a||a&&0===Object.keys(a).length)return;const l="window"!==i.breakpointsBase&&i.breakpointsBase?"container":i.breakpointsBase,o=["window","container"].includes(i.breakpointsBase)||!i.breakpointsBase?e.el:document.querySelector(i.breakpointsBase),d=e.getBreakpoint(a,l,o);if(!d||e.currentBreakpoint===d)return;const c=(d in a?a[d]:void 0)||e.originalParams,p=I(e,i),u=I(e,c),m=e.params.grabCursor,h=c.grabCursor,f=i.enabled;p&&!u?(r.classList.remove(`${i.containerModifierClass}grid`,`${i.containerModifierClass}grid-column`),e.emitContainerClasses()):!p&&u&&(r.classList.add(`${i.containerModifierClass}grid`),(c.grid.fill&&"column"===c.grid.fill||!c.grid.fill&&"column"===i.grid.fill)&&r.classList.add(`${i.containerModifierClass}grid-column`),e.emitContainerClasses()),m&&!h?e.unsetGrabCursor():!m&&h&&e.setGrabCursor();const g=(e,t)=>e[t];["navigation","pagination","scrollbar"].forEach(t=>{const s=g(c,t);if(void 0===s)return;const r=g(i,t),a="object"==typeof r&&null!==r&&r.enabled,n="object"==typeof s&&null!==s&&s.enabled,l=e[t];a&&!n&&l?.disable?.(),!a&&n&&l?.enable?.()});const v=c.direction&&c.direction!==i.direction,w=i.loop&&(c.slidesPerView!==i.slidesPerView||v),b=i.loop;v&&s&&e.changeDirection(),n(e.params,c);const y=e.params.enabled,E=e.params.loop;Object.assign(e,{allowTouchMove:e.params.allowTouchMove,allowSlideNext:e.params.allowSlideNext,allowSlidePrev:e.params.allowSlidePrev}),f&&!y?e.disable():!f&&y&&e.enable(),e.currentBreakpoint=d,e.emit("_beforeBreakpoint",c),s&&(w?(e.loopDestroy(),e.updateSlides(),e.loopCreate(t)):!b&&E?(e.updateSlides(),e.loopCreate(t)):b&&!E&&e.loopDestroy()),e.emit("breakpoint",c)},getBreakpoint:function(e,t="window",s){if(!e||"container"===t&&!s)return;let i=!1;const r="window"===t?window.innerHeight:s.clientHeight,a=Object.keys(e).map(e=>{if("string"==typeof e&&0===e.indexOf("@")){const t=parseFloat(e.substr(1));return{value:r*t,point:e}}return{value:e,point:e}});a.sort((e,t)=>parseInt(String(e.value),10)-parseInt(String(t.value),10));for(let e=0;e<a.length;e+=1){const{point:r,value:n}=a[e];"window"===t?window.matchMedia(`(min-width: ${n}px)`).matches&&(i=r):n<=s.clientWidth&&(i=r)}return i||"max"}};var $={checkOverflow:function(){const e=this,{isLocked:t,params:s}=e,{slidesOffsetBefore:i}=s;if(i){const t=e.slides.length-1,s=e.slidesGrid[t]+e.slidesSizesGrid[t]+2*i;e.isLocked=e.size>s}else e.isLocked=1===e.snapGrid.length;!0===s.allowSlideNext&&(e.allowSlideNext=!e.isLocked),!0===s.allowSlidePrev&&(e.allowSlidePrev=!e.isLocked),t&&t!==e.isLocked&&(e.isEnd=!1),t!==e.isLocked&&e.emit(e.isLocked?"lock":"unlock")}};var k={addClasses:function(){const e=this,{classNames:t,params:s,rtl:i,el:r,device:a}=e,n=function(e,t){const s=[];return e.forEach(e=>{"object"==typeof e?Object.keys(e).forEach(i=>{e[i]&&s.push(t+i)}):"string"==typeof e&&s.push(t+e)}),s}(["initialized",s.direction,{"free-mode":e.params.freeMode&&s.freeMode.enabled},{autoheight:s.autoHeight},{rtl:i},{grid:s.grid&&s.grid.rows>1},{"grid-column":s.grid&&s.grid.rows>1&&"column"===s.grid.fill},{android:a.android},{ios:a.ios},{"css-mode":s.cssMode},{centered:s.cssMode&&s.centeredSlides},{"watch-progress":s.watchSlidesProgress}],s.containerModifierClass);t.push(...n),r.classList.add(...t),e.emitContainerClasses()},removeClasses:function(){const{el:e,classNames:t}=this;e&&"string"!=typeof e&&(e.classList.remove(...t),this.emitContainerClasses())}};const O={init:!0,direction:"horizontal",oneWayMovement:!1,swiperElementNodeName:"SWIPER-CONTAINER",touchEventsTarget:"wrapper",initialSlide:0,speed:300,cssMode:!1,updateOnWindowResize:!0,resizeObserver:!0,nested:!1,createElements:!1,eventsPrefix:"swiper",enabled:!0,focusableElements:"input, select, option, textarea, button, video, label",width:null,height:null,preventInteractionOnTransition:!1,userAgent:null,url:null,edgeSwipeDetection:!1,edgeSwipeThreshold:20,autoHeight:!1,setWrapperSize:!1,virtualTranslate:!1,effect:"slide",breakpoints:void 0,breakpointsBase:"window",spaceBetween:0,slidesPerView:1,slidesPerGroup:1,slidesPerGroupSkip:0,slidesPerGroupAuto:!1,centeredSlides:!1,centeredSlidesBounds:!1,slidesOffsetBefore:0,slidesOffsetAfter:0,normalizeSlideIndex:!0,centerInsufficientSlides:!1,snapToSlideEdge:!1,watchOverflow:!0,roundLengths:!1,touchRatio:1,touchAngle:45,simulateTouch:!0,shortSwipes:!0,longSwipes:!0,longSwipesRatio:.5,longSwipesMs:300,followFinger:!0,allowTouchMove:!0,threshold:5,touchMoveStopPropagation:!1,touchStartPreventDefault:!0,touchStartForcePreventDefault:!1,touchReleaseOnEdges:!1,uniqueNavElements:!0,resistance:!0,resistanceRatio:.85,watchSlidesProgress:!1,grabCursor:!1,preventClicks:!0,preventClicksPropagation:!0,slideToClickedSlide:!1,loop:!1,loopAddBlankSlides:!0,loopAdditionalSlides:0,loopPreventsSliding:!0,rewind:!1,allowSlidePrev:!0,allowSlideNext:!0,swipeHandler:null,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:null,passiveListeners:!0,maxBackfaceHiddenSlides:10,containerModifierClass:"swiper-",slideClass:"swiper-slide",slideBlankClass:"swiper-slide-blank",slideActiveClass:"swiper-slide-active",slideVisibleClass:"swiper-slide-visible",slideFullyVisibleClass:"swiper-slide-fully-visible",slideNextClass:"swiper-slide-next",slidePrevClass:"swiper-slide-prev",wrapperClass:"swiper-wrapper",lazyPreload:!0,lazyPreloaderClass:"swiper-lazy-preloader",lazyPreloadPrevNext:0,runCallbacksOnInit:!0,_emitClasses:!1};var D={on(e,t,s){const i=this;if(!i.eventsListeners||i.destroyed)return i;if("function"!=typeof t)return i;const r=s?"unshift":"push";return e.split(" ").forEach(e=>{i.eventsListeners[e]||(i.eventsListeners[e]=[]),i.eventsListeners[e][r](t)}),i},once(e,t,s){const i=this;if(!i.eventsListeners||i.destroyed)return i;if("function"!=typeof t)return i;const r=function(...s){i.off(e,r),r.__emitterProxy&&delete r.__emitterProxy,t.apply(i,s)};return r.__emitterProxy=t,i.on(e,r,s)},onAny(e,t){const s=this;if(!s.eventsListeners||s.destroyed)return s;if("function"!=typeof e)return s;const i=t?"unshift":"push";return s.eventsAnyListeners.indexOf(e)<0&&s.eventsAnyListeners[i](e),s},offAny(e){const t=this;if(!t.eventsListeners||t.destroyed)return t;if(!t.eventsAnyListeners)return t;const s=t.eventsAnyListeners.indexOf(e);return s>=0&&t.eventsAnyListeners.splice(s,1),t},off(e,t){const s=this;return!s.eventsListeners||s.destroyed?s:s.eventsListeners?(e.split(" ").forEach(e=>{void 0===t?s.eventsListeners[e]=[]:s.eventsListeners[e]&&s.eventsListeners[e].forEach((i,r)=>{(i===t||i.__emitterProxy&&i.__emitterProxy===t)&&s.eventsListeners[e].splice(r,1)})}),s):s},emit(...e){const t=this;if(!t.eventsListeners||t.destroyed)return t;if(!t.eventsListeners)return t;let s,i,r;if("string"==typeof e[0]||Array.isArray(e[0]))s=e[0],i=e.slice(1,e.length),r=t;else{const a=e[0];s=a.events,i=a.data??[],r=a.context||t}i.unshift(r);return(Array.isArray(s)?s:s.split(" ")).forEach(e=>{t.eventsAnyListeners&&t.eventsAnyListeners.length&&t.eventsAnyListeners.forEach(t=>{t.apply(r,[e,...i])}),t.eventsListeners&&t.eventsListeners[e]&&t.eventsListeners[e].forEach(e=>{e.apply(r,i)})}),t}};function G(e){const t=this;t.destroyed||t.enabled&&(t.allowClick||(t.params.preventClicks&&e.preventDefault(),t.params.preventClicksPropagation&&t.animating&&(e.stopPropagation(),e.stopImmediatePropagation())))}function X(){const e=this;e.destroyed||e.documentTouchHandlerProceeded||(e.documentTouchHandlerProceeded=!0,e.params.touchReleaseOnEdges&&(e.el.style.touchAction="auto"))}function B(e){const t=this;t.destroyed||(P(t,e.target),"error"===e.type||t.params.cssMode||"auto"!==t.params.slidesPerView&&!t.params.autoHeight||t.update())}function H(){const e=this,{params:t,el:s}=e;if(s&&0===s.offsetWidth)return;t.breakpoints&&e.setBreakpoint();const{allowSlideNext:i,allowSlidePrev:r,snapGrid:a}=e,n=e.virtual&&e.params.virtual?.enabled;e.allowSlideNext=!0,e.allowSlidePrev=!0,e.updateSize(),e.updateSlides(),e.updateSlidesClasses();const l=n&&t.loop;if(!("auto"===t.slidesPerView||t.slidesPerView>1)||!e.isEnd||e.isBeginning||e.params.centeredSlides||l)e.params.loop&&!n?e.slideToLoop(e.realIndex,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0);else{const t=n?e.virtual.slides.length:e.slides.length;e.slideTo(t-1,0,!1,!0)}if(e.autoplay&&e.autoplay.running&&e.autoplay.paused){const t=e.autoplay;clearTimeout(t.resizeTimeout),t.resizeTimeout=setTimeout(()=>{e.autoplay&&e.autoplay.running&&e.autoplay.paused&&e.autoplay.resume()},500)}e.allowSlidePrev=r,e.allowSlideNext=i,e.params.watchOverflow&&a!==e.snapGrid&&e.checkOverflow()}function Y(){const e=this;if(e.destroyed)return;const{wrapperEl:t,rtlTranslate:s,enabled:i}=e;if(!i)return;let r;e.previousTranslate=e.translate,e.isHorizontal()?e.translate=-t.scrollLeft:e.translate=-t.scrollTop,0===e.translate&&(e.translate=0),e.updateActiveIndex(),e.updateSlidesClasses();const a=e.maxTranslate()-e.minTranslate();r=0===a?0:(e.translate-e.minTranslate())/a,r!==e.progress&&e.updateProgress(s?-e.translate:e.translate),e.emit("setTranslate",e.translate,!1)}function R(e){const i=this;if(i.destroyed)return;const r=i.touchEventsData;let a=e.originalEvent??e;if("touchend"===a.type||"touchcancel"===a.type){const e=[...a.changedTouches].find(e=>e.identifier===r.touchId);if(!e||e.identifier!==r.touchId)return}else{if(null!==r.touchId)return;if(a.pointerId!==r.pointerId)return}if(["pointercancel","pointerout","pointerleave","contextmenu"].includes(a.type)){if(!(["pointercancel","contextmenu"].includes(a.type)&&(i.browser.isSafari||i.browser.isWebView)))return}r.pointerId=null,r.touchId=null,r.startEventPath=void 0,r.lastMoveEvent=void 0;const{params:n,touches:l,rtlTranslate:o,slidesGrid:d,enabled:c}=i;if(!c)return;if(!n.simulateTouch&&"mouse"===a.pointerType)return;if(r.allowTouchCallbacks&&i.emit("touchEnd",a),r.allowTouchCallbacks=!1,!r.isTouched)return r.isMoved&&n.grabCursor&&i.setGrabCursor(!1),r.isMoved=!1,void(r.startMoving=!1);n.grabCursor&&r.isMoved&&r.isTouched&&(!0===i.allowSlideNext||!0===i.allowSlidePrev)&&i.setGrabCursor(!1);const p=s(),u=p-r.touchStartTime;if(i.allowClick){const e=a.path??(a.composedPath&&a.composedPath());i.updateClickedSlide(e&&e[0],e),i.emit("tap click",a),u<300&&p-r.lastClickTime<300&&i.emit("doubleTap doubleClick",a)}if(r.lastClickTime=s(),t(()=>{i.destroyed||(i.allowClick=!0)}),!r.isTouched||!r.isMoved||!i.swipeDirection||0===l.diff&&!r.loopSwapReset||r.currentTranslate===r.startTranslate&&!r.loopSwapReset)return r.isTouched=!1,r.isMoved=!1,void(r.startMoving=!1);let m;if(r.isTouched=!1,r.isMoved=!1,r.startMoving=!1,m=n.followFinger?o?i.translate:-i.translate:-(r.currentTranslate??0),n.cssMode)return;if(n.freeMode&&n.freeMode.enabled)return void i.freeMode.onTouchEnd({currentPos:m});const h=m>=-i.maxTranslate()&&!i.params.loop;let f=0,g=i.slidesSizesGrid[0];for(let e=0;e<d.length;e+=e<n.slidesPerGroupSkip?1:n.slidesPerGroup){const t=e<n.slidesPerGroupSkip-1?1:n.slidesPerGroup;void 0!==d[e+t]?(h||m>=d[e]&&m<d[e+t])&&(f=e,g=d[e+t]-d[e]):(h||m>=d[e])&&(f=e,g=d[d.length-1]-d[d.length-2])}let v=null,w=null;n.rewind&&(i.isBeginning?w=n.virtual?.enabled&&i.virtual?i.virtual.slides.length-1:i.slides.length-1:i.isEnd&&(v=0));const b=(m-d[f])/g,y=f<n.slidesPerGroupSkip-1?1:n.slidesPerGroup;if(u>n.longSwipesMs){if(!n.longSwipes)return void i.slideTo(i.activeIndex);"next"===i.swipeDirection&&(b>=n.longSwipesRatio?i.slideTo(n.rewind&&i.isEnd?v:f+y):i.slideTo(f)),"prev"===i.swipeDirection&&(b>1-n.longSwipesRatio?i.slideTo(f+y):null!==w&&b<0&&Math.abs(b)>n.longSwipesRatio?i.slideTo(w):i.slideTo(f))}else{if(!n.shortSwipes)return void i.slideTo(i.activeIndex);i.navigation&&(a.target===i.navigation.nextEl||a.target===i.navigation.prevEl)?a.target===i.navigation.nextEl?i.slideTo(f+y):i.slideTo(f):("next"===i.swipeDirection&&i.slideTo(null!==v?v:f+y),"prev"===i.swipeDirection&&i.slideTo(null!==w?w:f))}}function _(e){const t=this;if(t.destroyed)return;const i=t.touchEventsData,{params:r,touches:a,rtlTranslate:n,enabled:l}=t;if(!l)return;if(!r.simulateTouch&&"mouse"===e.pointerType)return;const o=e,d=o.originalEvent??o;if("pointermove"===d.type){if(null!==i.touchId)return;if(d.pointerId!==i.pointerId)return}let c;if("touchmove"===d.type){const e=[...d.changedTouches].find(e=>e.identifier===i.touchId);if(!e||e.identifier!==i.touchId)return;c=e}else c=d;if(!i.isTouched)return void(i.startMoving&&i.isScrolling&&t.emit("touchMoveOpposite",d));if(i.lastMoveEvent===d)return;i.lastMoveEvent=d;for(const s of i.startEventPath??[]){if(s===t.el)break;const i=s.swiper;i&&i!==t&&!i.destroyed&&i.params.nested&&i.touchEventsData.isTouched&&i.onTouchMove(e)}const p=c.pageX,u=c.pageY;if(d.preventedByNestedSwiper)return a.startX=p,void(a.startY=u);if(!t.allowTouchMove)return d.target.matches(i.focusableElements)||(t.allowClick=!1),void(i.isTouched&&(Object.assign(a,{startX:p,startY:u,currentX:p,currentY:u}),i.touchStartTime=s()));if(r.touchReleaseOnEdges&&!r.loop)if(t.isVertical()){if(u<a.startY&&t.translate<=t.maxTranslate()||u>a.startY&&t.translate>=t.minTranslate())return i.isTouched=!1,void(i.isMoved=!1)}else{if(n&&(p>a.startX&&-t.translate<=t.maxTranslate()||p<a.startX&&-t.translate>=t.minTranslate()))return;if(!n&&(p<a.startX&&t.translate<=t.maxTranslate()||p>a.startX&&t.translate>=t.minTranslate()))return}if(document.activeElement&&document.activeElement.matches(i.focusableElements)&&document.activeElement!==d.target&&"mouse"!==d.pointerType&&document.activeElement.blur(),document.activeElement&&d.target===document.activeElement&&d.target.matches(i.focusableElements))return i.isMoved=!0,void(t.allowClick=!1);i.allowTouchCallbacks&&t.emit("touchMove",d),a.previousX=a.currentX,a.previousY=a.currentY,a.currentX=p,a.currentY=u;const m=a.currentX-a.startX,h=a.currentY-a.startY;if(t.params.threshold&&Math.sqrt(m**2+h**2)<t.params.threshold)return;if(void 0===i.isScrolling){let e;t.isHorizontal()&&a.currentY===a.startY||t.isVertical()&&a.currentX===a.startX?i.isScrolling=!1:m*m+h*h>=25&&(e=180*Math.atan2(Math.abs(h),Math.abs(m))/Math.PI,i.isScrolling=t.isHorizontal()?e>r.touchAngle:90-e>r.touchAngle)}if(i.isScrolling&&t.emit("touchMoveOpposite",d),void 0===i.startMoving&&(a.currentX===a.startX&&a.currentY===a.startY||(i.startMoving=!0)),i.isScrolling||"touchmove"===d.type&&i.preventTouchMoveFromPointerMove)return void(i.isTouched=!1);if(!i.startMoving)return;t.allowClick=!1,!r.cssMode&&d.cancelable&&d.preventDefault(),r.touchMoveStopPropagation&&!r.nested&&d.stopPropagation();let f=t.isHorizontal()?m:h,g=t.isHorizontal()?a.currentX-a.previousX:a.currentY-a.previousY;r.oneWayMovement&&(f=Math.abs(f)*(n?1:-1),g=Math.abs(g)*(n?1:-1)),a.diff=f,f*=r.touchRatio,n&&(f=-f,g=-g);const v=t.touchesDirection;t.swipeDirection=f>0?"prev":"next",t.touchesDirection=g>0?"prev":"next";const w=t.params.loop&&!r.cssMode,b="next"===t.touchesDirection&&t.allowSlideNext||"prev"===t.touchesDirection&&t.allowSlidePrev;if(!i.isMoved){if(w&&b&&t.loopFix({direction:t.swipeDirection}),i.startTranslate=t.getTranslate(),t.setTransition(0),t.animating){const e=new window.CustomEvent("transitionend",{bubbles:!0,cancelable:!0,detail:{bySwiperTouchMove:!0}});t.wrapperEl.dispatchEvent(e)}i.allowMomentumBounce=!1,!r.grabCursor||!0!==t.allowSlideNext&&!0!==t.allowSlidePrev||t.setGrabCursor(!0),t.emit("sliderFirstMove",d)}if((new Date).getTime(),!1!==r._loopSwapReset&&i.isMoved&&i.allowThresholdMove&&v!==t.touchesDirection&&w&&b&&Math.abs(f)>=1)return Object.assign(a,{startX:p,startY:u,currentX:p,currentY:u,startTranslate:i.currentTranslate}),i.loopSwapReset=!0,void(i.startTranslate=i.currentTranslate);t.emit("sliderMove",d),i.isMoved=!0;const y=i.startTranslate??0;i.currentTranslate=f+y;let E=!0,S=r.resistanceRatio;if(r.touchReleaseOnEdges&&(S=0),f>0?(w&&b&&i.allowThresholdMove&&i.currentTranslate>(r.centeredSlides?t.minTranslate()-t.slidesSizesGrid[t.activeIndex+1]-("auto"!==r.slidesPerView&&t.slides.length-r.slidesPerView>=2?t.slidesSizesGrid[t.activeIndex+1]+t.params.spaceBetween:0)-t.params.spaceBetween:t.minTranslate())&&t.loopFix({direction:"prev",setTranslate:!0,activeSlideIndex:0}),i.currentTranslate>t.minTranslate()&&(E=!1,r.resistance&&(i.currentTranslate=t.minTranslate()-1+(-t.minTranslate()+y+f)**S))):f<0&&(w&&b&&i.allowThresholdMove&&i.currentTranslate<(r.centeredSlides?t.maxTranslate()+t.slidesSizesGrid[t.slidesSizesGrid.length-1]+t.params.spaceBetween+("auto"!==r.slidesPerView&&t.slides.length-r.slidesPerView>=2?t.slidesSizesGrid[t.slidesSizesGrid.length-1]+t.params.spaceBetween:0):t.maxTranslate())&&t.loopFix({direction:"next",setTranslate:!0,activeSlideIndex:t.slides.length-("auto"===r.slidesPerView?t.slidesPerViewDynamic():Math.ceil(parseFloat(String(r.slidesPerView))))}),i.currentTranslate<t.maxTranslate()&&(E=!1,r.resistance&&(i.currentTranslate=t.maxTranslate()+1-(t.maxTranslate()-y-f)**S))),E&&(d.preventedByNestedSwiper=!0),!t.allowSlideNext&&"next"===t.swipeDirection&&(i.currentTranslate??0)<y&&(i.currentTranslate=y),!t.allowSlidePrev&&"prev"===t.swipeDirection&&(i.currentTranslate??0)>y&&(i.currentTranslate=y),t.allowSlidePrev||t.allowSlideNext||(i.currentTranslate=y),r.threshold>0){if(!(Math.abs(f)>r.threshold||i.allowThresholdMove))return void(i.currentTranslate=i.startTranslate);if(!i.allowThresholdMove)return i.allowThresholdMove=!0,a.startX=a.currentX,a.startY=a.currentY,i.currentTranslate=i.startTranslate,void(a.diff=t.isHorizontal()?a.currentX-a.startX:a.currentY-a.startY)}r.followFinger&&!r.cssMode&&((r.freeMode&&r.freeMode.enabled&&t.freeMode||r.watchSlidesProgress)&&(t.updateActiveIndex(),t.updateSlidesClasses()),r.freeMode&&r.freeMode.enabled&&t.freeMode&&t.freeMode.onTouchMove(),t.updateProgress(i.currentTranslate),t.setTranslate(i.currentTranslate??0))}function N(e,t,s){const{params:i}=e,r=i.edgeSwipeDetection,a=i.edgeSwipeThreshold;return!r||!(s<=a||s>=window.innerWidth-a)||"prevent"===r&&(t.preventDefault(),!0)}function V(e){const t=this;if(t.destroyed)return;const i=e.originalEvent??e,r=t.touchEventsData;if("pointerdown"===i.type){const e=i;if(null!==r.pointerId&&r.pointerId!==e.pointerId)return;r.pointerId=e.pointerId}else"touchstart"===i.type&&1===i.targetTouches.length&&(r.touchId=i.targetTouches[0].identifier);if("touchstart"===i.type)return void N(t,i,i.targetTouches[0].pageX);const{params:a,touches:n,enabled:l}=t;if(!l)return;if(!a.simulateTouch&&"mouse"===i.pointerType)return;if(t.animating&&a.preventInteractionOnTransition)return;!t.animating&&a.cssMode&&a.loop&&t.loopFix();let o=i.target;if("wrapper"===a.touchEventsTarget&&!function(e,t){let s=t.contains(e);!s&&t instanceof HTMLSlotElement&&(s=[...t.assignedElements()].includes(e),s||(s=function(e,t){const s=[t];for(;s.length>0;){const t=s.shift();if(e===t)return!0;s.push(...t.children,...t.shadowRoot?t.shadowRoot.children:[],...t.assignedElements?t.assignedElements():[])}return!1}(e,t)));return s}(o,t.wrapperEl))return;const d=i;if("number"==typeof d.which&&3===d.which)return;if("number"==typeof d.button&&d.button>0)return;if(r.isTouched&&r.isMoved)return;const c=!!a.noSwipingClass&&""!==a.noSwipingClass,p=i.composedPath?i.composedPath():i.path;c&&i.target&&i.target.shadowRoot&&p&&(o=p[0]);const u=a.noSwipingSelector?a.noSwipingSelector:`.${a.noSwipingClass}`,m=!(!i.target||!i.target.shadowRoot);if(a.noSwiping&&(m?(h=u,function e(t){if(!t||t===document||t===window)return null;let s=t;s.assignedSlot&&(s=s.assignedSlot);const i=s.closest(h);if(!i&&!s.getRootNode)return null;const r=s.getRootNode();return i||e(r.host)}(o)):o.closest(u)))return void(t.allowClick=!0);var h;if(a.swipeHandler&&"string"==typeof a.swipeHandler&&!o.closest(a.swipeHandler))return;const f=i;n.currentX=f.pageX,n.currentY=f.pageY;const g=n.currentX,v=n.currentY;if(!N(t,i,g))return;Object.assign(r,{isTouched:!0,isMoved:!1,allowTouchCallbacks:!0,isScrolling:void 0,startMoving:void 0}),n.startX=g,n.startY=v,r.touchStartTime=s(),r.startEventPath=p,t.allowClick=!0,t.updateSize(),t.swipeDirection=void 0,a.threshold>0&&(r.allowThresholdMove=!1);let w=!0;o.matches(r.focusableElements)&&(w=!1,"SELECT"===o.nodeName&&(r.isTouched=!1)),document.activeElement&&document.activeElement.matches(r.focusableElements)&&document.activeElement!==o&&("mouse"===f.pointerType||"mouse"!==f.pointerType&&!o.matches(r.focusableElements))&&document.activeElement.blur();const b=w&&t.allowTouchMove&&a.touchStartPreventDefault;!a.touchStartForcePreventDefault&&!b||o.isContentEditable||i.preventDefault(),a.freeMode&&a.freeMode.enabled&&t.freeMode&&t.animating&&!a.cssMode&&t.freeMode.onTouchStart(),t.emit("touchStart",i)}const q=(e,t)=>{const{params:s,el:i,wrapperEl:r,device:a}=e,n=!!s.nested,l="on"===t?"addEventListener":"removeEventListener",o=t;if(!i||"string"==typeof i)return;document[l]("touchstart",e.onDocumentTouchStart,{passive:!1,capture:n}),i[l]("touchstart",e.onTouchStart,{passive:!1}),i[l]("pointerdown",e.onTouchStart,{passive:!1}),document[l]("touchmove",e.onTouchMove,{passive:!1,capture:n}),document[l]("pointermove",e.onTouchMove,{passive:!1,capture:n}),document[l]("touchend",e.onTouchEnd,{passive:!0}),document[l]("pointerup",e.onTouchEnd,{passive:!0}),document[l]("pointercancel",e.onTouchEnd,{passive:!0}),document[l]("touchcancel",e.onTouchEnd,{passive:!0}),document[l]("pointerout",e.onTouchEnd,{passive:!0}),document[l]("pointerleave",e.onTouchEnd,{passive:!0}),document[l]("contextmenu",e.onTouchEnd,{passive:!0}),(s.preventClicks||s.preventClicksPropagation)&&i[l]("click",e.onClick,!0),s.cssMode&&r[l]("scroll",e.onScroll);const d=t=>{e[o](t,H,!0)};s.updateOnWindowResize?d(a.ios||a.android?"resize orientationchange observerUpdate":"resize observerUpdate"):d("observerUpdate"),s.lazyPreload&&(i[l]("load",e.onLoad,{capture:!0}),i[l]("error",e.onLoad,{capture:!0}))};var F={loopCreate:function(e,t){const s=this,{params:i,slidesEl:r}=s;if(!i.loop||s.virtual&&s.params.virtual?.enabled)return;const a=()=>{d(r,`.${i.slideClass}, swiper-slide`).forEach((e,t)=>{e.setAttribute("data-swiper-slide-index",String(t))})},n=s.grid&&i.grid&&i.grid.rows>1;i.loopAddBlankSlides&&(i.slidesPerGroup>1||n)&&(()=>{const e=d(r,`.${i.slideBlankClass}`);e.forEach(e=>{e.remove()}),e.length>0&&(s.recalcSlides(),s.updateSlides())})();const l=i.slidesPerGroup*(n?i.grid.rows:1),o=s.slides.length%l!==0,u=n&&s.slides.length%i.grid.rows!==0,m=e=>{for(let t=0;t<e;t+=1){const e=s.isElement?p("swiper-slide",[i.slideBlankClass]):p("div",[i.slideClass,i.slideBlankClass]);s.slidesEl.append(e)}};if(o){if(i.loopAddBlankSlides){m(l-s.slides.length%l),s.recalcSlides(),s.updateSlides()}else c("Swiper Loop Warning: The number of slides is not even to slidesPerGroup, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)");a()}else if(u){if(i.loopAddBlankSlides){m(i.grid.rows-s.slides.length%i.grid.rows),s.recalcSlides(),s.updateSlides()}else c("Swiper Loop Warning: The number of slides is not even to grid.rows, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)");a()}else a();const h=i.centeredSlides||!!i.slidesOffsetBefore||!!i.slidesOffsetAfter;s.loopFix({slideRealIndex:e,direction:h?void 0:"next",initial:t})},loopFix:function(e={}){const{slideRealIndex:t,slideTo:s=!0,direction:i,setTranslate:r,activeSlideIndex:a,initial:n,byController:l,byMousewheel:o}=e;let d=a;const p=this;if(!p.params.loop)return;if(p.params.watchOverflow&&p.isLocked)return;p.emit("beforeLoopFix"),p.__loopFixInProgress__=!0;const{slides:u,allowSlidePrev:m,allowSlideNext:h,slidesEl:f,params:g}=p,{centeredSlides:v,slidesOffsetBefore:w,slidesOffsetAfter:b,initialSlide:y}=g,E=v||!!w||!!b;if(p.allowSlidePrev=!0,p.allowSlideNext=!0,p.virtual&&g.virtual?.enabled){if(s){const e=p.virtual.slides.length,t=p.virtual.slidesBefore??0;E||0!==p.snapIndex?E&&p.snapIndex<g.slidesPerView?p.slideTo(e+p.snapIndex,0,!1,!0):p.snapIndex===p.snapGrid.length-1&&p.slideTo(t,0,!1,!0):p.slideTo(e,0,!1,!0)}return p.allowSlidePrev=m,p.allowSlideNext=h,p.__loopFixInProgress__=!1,void p.emit("loopFix")}let S=g.slidesPerView;"auto"===S?S=p.slidesPerViewDynamic():(S=Math.ceil(parseFloat(String(g.slidesPerView))),E&&S%2==0&&(S+=1));const x=g.slidesPerGroupAuto?S:g.slidesPerGroup,T=e=>("function"==typeof e?e.call(p):e)||0,M=p.slidesGrid.length>1?(p.slidesGrid[p.slidesGrid.length-1]-p.slidesGrid[0])/(p.slidesGrid.length-1):p.size,C=M>0?T(w)/M:0,P=M>0?T(b)/M:0;let L=E?Math.max(x,(v?Math.ceil(S/2):0)+Math.ceil(Math.max(C,P))):x;L%x!==0&&(L+=x-L%x),L+=g.loopAdditionalSlides,p.loopedSlides=L;const A=p.grid&&g.grid&&g.grid.rows>1;u.length<S+L||"cards"===p.params.effect&&u.length<S+2*L?c("Swiper Loop Warning: The number of slides is not enough for loop mode, it will be disabled or not function properly. You need to add more slides (or make duplicates) or lower the values of slidesPerView and slidesPerGroup parameters"):A&&"row"===g.grid.fill&&c("Swiper Loop Warning: Loop mode is not compatible with grid.fill = `row`");const I=[],z=[],$=A?Math.ceil(u.length/g.grid.rows):u.length,k=n&&$-y<S&&!E;let O=k?y:p.activeIndex;void 0===d?d=p.getSlideIndex(u.find(e=>e.classList.contains(g.slideActiveClass))):O=d;const D="next"===i||!i,G="prev"===i||!i;let X=0,B=0;const H=(A?u[d].column??0:d)+(E&&void 0===r?(v?-S/2+.5:0)-C:0);if(H<L){X=Math.max(L-H,x);for(let e=0;e<L-H;e+=1){const t=e-Math.floor(e/$)*$;if(A){const e=$-t-1;for(let t=u.length-1;t>=0;t-=1)u[t].column===e&&I.push(t)}else I.push($-t-1)}}else if(H+S>$-L){B=Math.max(H-($-2*L),x),k&&(B=Math.max(B,S-$+y+1));for(let e=0;e<B;e+=1){const t=e-Math.floor(e/$)*$;A?u.forEach((e,s)=>{e.column===t&&z.push(s)}):z.push(t)}}if(p.__preventObserver__=!0,requestAnimationFrame(()=>{p.__preventObserver__=!1}),"cards"===p.params.effect&&u.length<S+2*L&&(z.includes(d)&&z.splice(z.indexOf(d),1),I.includes(d)&&I.splice(I.indexOf(d),1)),G&&I.forEach(e=>{const t=u[e];t.swiperLoopMoveDOM=!0,f.prepend(t),t.swiperLoopMoveDOM=!1}),D&&z.forEach(e=>{const t=u[e];t.swiperLoopMoveDOM=!0,f.append(t),t.swiperLoopMoveDOM=!1}),p.recalcSlides(),"auto"===g.slidesPerView?p.updateSlides():A&&(I.length>0&&G||z.length>0&&D)&&p.slides.forEach((e,t)=>{p.grid.updateSlide(t,e,p.slides)}),g.watchSlidesProgress&&p.updateSlidesOffset(),s)if(I.length>0&&G){if(void 0===t){const e=p.slidesGrid[O],t=p.slidesGrid[O+X]-e;o?p.setTranslate(p.translate-t):(p.slideTo(O+Math.ceil(X),0,!1,!0),r&&(p.touchEventsData.startTranslate=p.touchEventsData.startTranslate-t,p.touchEventsData.currentTranslate=p.touchEventsData.currentTranslate-t))}else if(r){const e=A?I.length/g.grid.rows:I.length;p.slideTo(p.activeIndex+e,0,!1,!0),p.touchEventsData.currentTranslate=p.translate}}else if(z.length>0&&D)if(void 0===t){const e=p.slidesGrid[O],t=p.slidesGrid[O-B]-e;o?p.setTranslate(p.translate-t):(p.slideTo(O-B,0,!1,!0),r&&(p.touchEventsData.startTranslate=p.touchEventsData.startTranslate-t,p.touchEventsData.currentTranslate=p.touchEventsData.currentTranslate-t))}else{const e=A
vendor: 12,438 bytes, line 21828
21828?z.length/g.grid.rows:z.length;p.slideTo(p.activeIndex-e,0,!1,!0)}p.allowSlidePrev=m,p.allowSlideNext=h;const Y=p.controller?.control;if(Y&&!l){const e={slideRealIndex:t,direction:i,setTranslate:r,activeSlideIndex:d,byController:!0};Array.isArray(Y)?Y.forEach(t=>{!t.destroyed&&t.params.loop&&t.loopFix({...e,slideTo:t.params.slidesPerView===g.slidesPerView&&s})}):Y instanceof p.constructor&&Y.params.loop&&Y.loopFix({...e,slideTo:Y.params.slidesPerView===g.slidesPerView&&s})}p.__loopFixInProgress__=!1,p.emit("loopFix")},loopDestroy:function(){const e=this,{params:t,slidesEl:s}=e;if(!t.loop||!s||e.virtual&&e.params.virtual?.enabled)return;e.recalcSlides();const i=[];e.slides.forEach(e=>{const t=e,s=void 0===t.swiperSlideIndex?Number(e.getAttribute("data-swiper-slide-index")):t.swiperSlideIndex;i[s]=e}),e.slides.forEach(e=>{e.removeAttribute("data-swiper-slide-index")}),i.forEach(e=>{s.append(e)}),e.recalcSlides(),e.slideTo(e.realIndex,0)}};function W(e,t){return function(s={}){const i=Object.keys(s)[0],r=s[i];"object"==typeof r&&null!==r?(!0===e[i]&&(e[i]={enabled:!0}),"navigation"===i&&e[i]&&e[i].enabled&&!e[i].prevEl&&!e[i].nextEl&&(e[i].auto=!0),["pagination","scrollbar"].indexOf(i)>=0&&e[i]&&e[i].enabled&&!e[i].el&&(e[i].auto=!0),i in e&&"enabled"in r?("object"!=typeof e[i]||"enabled"in e[i]||(e[i].enabled=!0),e[i]||(e[i]={enabled:!1}),n(t,s)):n(t,s)):n(t,s)}}var j={slideTo:function(e=0,t,s=!0,i,r){"string"==typeof e&&(e=parseInt(e,10));const a=this;let n=e;n<0&&(n=0);const{params:l,snapGrid:o,slidesGrid:d,previousIndex:c,activeIndex:p,rtlTranslate:u,wrapperEl:m,enabled:h}=a;if(!h&&!i&&!r||a.destroyed||a.animating&&l.preventInteractionOnTransition)return!1;void 0===t&&(t=a.params.speed);const f=Math.min(a.params.slidesPerGroupSkip,n);let g=f+Math.floor((n-f)/a.params.slidesPerGroup);g>=o.length&&(g=o.length-1);const v=-o[g];if(l.normalizeSlideIndex)for(let e=0;e<d.length;e+=1){const t=-Math.floor(100*v),s=Math.floor(100*d[e]),i=Math.floor(100*d[e+1]);void 0!==d[e+1]?t>=s&&t<i-(i-s)/2?n=e:t>=s&&t<i&&(n=e+1):t>=s&&(n=e)}if(a.initialized&&n!==p){if(!a.allowSlideNext&&(u?v>a.translate&&v>a.minTranslate():v<a.translate&&v<a.minTranslate()))return!1;if(!a.allowSlidePrev&&v>a.translate&&v>a.maxTranslate()&&(p||0)!==n)return!1}let w;n!==(c||0)&&s&&a.emit("beforeSlideChangeStart"),a.updateProgress(v),w=n>p?"next":n<p?"prev":"reset";const b=a.virtual&&a.params.virtual?.enabled;if(!(b&&r)&&(u&&-v===a.translate||!u&&v===a.translate))return a.updateActiveIndex(n),l.autoHeight&&a.updateAutoHeight(),a.updateSlidesClasses(),"slide"!==l.effect&&a.setTranslate(v),"reset"!==w&&(a.transitionStart(s,w),a.transitionEnd(s,w)),!1;if(l.cssMode){const e=a.isHorizontal(),s=u?v:-v;return 0===t?(b&&(a.wrapperEl.style.scrollSnapType="none",a._immediateVirtual=!0),b&&!a._cssModeVirtualInitialSet&&(a.params.initialSlide??0)>0?(a._cssModeVirtualInitialSet=!0,requestAnimationFrame(()=>{m[e?"scrollLeft":"scrollTop"]=s})):m[e?"scrollLeft":"scrollTop"]=s,b&&requestAnimationFrame(()=>{a.wrapperEl.style.scrollSnapType="",a._immediateVirtual=!1})):m.scrollTo({[e?"left":"top"]:s,behavior:"smooth"}),!0}const y=C().isSafari;return b&&!r&&y&&a.isElement&&a.virtual.update(!1,!1,n),a.setTransition(t),a.setTranslate(v),a.updateActiveIndex(n),a.updateSlidesClasses(),a.emit("beforeTransitionStart",t,i),a.transitionStart(s,w),0===t?a.transitionEnd(s,w):a.animating||(a.animating=!0,a.onSlideToWrapperTransitionEnd||(a.onSlideToWrapperTransitionEnd=function(e){a&&!a.destroyed&&e.target===this&&(a.wrapperEl.removeEventListener("transitionend",a.onSlideToWrapperTransitionEnd),a.onSlideToWrapperTransitionEnd=null,delete a.onSlideToWrapperTransitionEnd,a.transitionEnd(s,w))}),a.wrapperEl.addEventListener("transitionend",a.onSlideToWrapperTransitionEnd)),!0},slideToLoop:function(e=0,t,s=!0,i){if("string"==typeof e){e=parseInt(e,10)}const r=this;if(r.destroyed)return;void 0===t&&(t=r.params.speed);const a=r.grid&&r.params.grid&&r.params.grid.rows>1;let n=e;if(r.params.loop)if(r.virtual&&r.params.virtual?.enabled)n+=r.virtual.slidesBefore??0;else{let e;if(a){const t=n*r.params.grid.rows,s=r.slides.find(e=>Number(e.getAttribute("data-swiper-slide-index"))===t);e=s?.column??0}else e=r.getSlideIndexByData(n);const t=a?Math.ceil(r.slides.length/r.params.grid.rows):r.slides.length,{centeredSlides:s,slidesOffsetBefore:l,slidesOffsetAfter:o}=r.params,d=s||!!l||!!o;let c;"auto"===r.params.slidesPerView?c=r.slidesPerViewDynamic():(c=Math.ceil(parseFloat(String(r.params.slidesPerView))),d&&c%2==0&&(c+=1));let p=t-e<c;if(d&&(p=p||e<Math.ceil(c/2)),i&&d&&"auto"!==r.params.slidesPerView&&!a&&(p=!1),p){const s=d?e<r.activeIndex?"prev":"next":e-r.activeIndex-1<r.params.slidesPerView?"next":"prev";r.loopFix({direction:s,slideTo:!0,activeSlideIndex:"next"===s?e+1:e-t+1,slideRealIndex:"next"===s?r.realIndex:void 0})}if(a){const e=n*r.params.grid.rows,t=r.slides.find(t=>Number(t.getAttribute("data-swiper-slide-index"))===e);n=t?.column??0}else n=r.getSlideIndexByData(n)}return requestAnimationFrame(()=>{r.slideTo(n,t,s,i)}),r},slideNext:function(e,t=!0,s){const i=this,{enabled:r,params:a,animating:n}=i;if(!r||i.destroyed)return i;void 0===e&&(e=i.params.speed);let l=a.slidesPerGroup;"auto"===a.slidesPerView&&1===a.slidesPerGroup&&a.slidesPerGroupAuto&&(l=Math.max(i.slidesPerViewDynamic("current",!0),1));const o=i.activeIndex<a.slidesPerGroupSkip?1:l,d=i.virtual&&a.virtual?.enabled;if(a.loop){if(n&&!d&&a.loopPreventsSliding)return!1;if(i.loopFix({direction:"next"}),i._clientLeft=i.wrapperEl.clientLeft,i.activeIndex===i.slides.length-1&&a.cssMode)return requestAnimationFrame(()=>{i.slideTo(i.activeIndex+o,e,t,s)}),!0}return a.rewind&&i.isEnd?i.slideTo(0,e,t,s):i.slideTo(i.activeIndex+o,e,t,s)},slidePrev:function(e,t=!0,s){const i=this,{params:r,snapGrid:a,slidesGrid:n,rtlTranslate:l,enabled:o,animating:d}=i;if(!o||i.destroyed)return i;void 0===e&&(e=i.params.speed);const c=i.virtual&&r.virtual?.enabled;if(r.loop){if(d&&!c&&r.loopPreventsSliding)return!1;i.loopFix({direction:"prev"}),i._clientLeft=i.wrapperEl.clientLeft}function p(e){return e<0?-Math.floor(Math.abs(e)):Math.floor(e)}const u=p(l?i.translate:-i.translate),m=a.map(e=>p(e)),h=r.freeMode&&r.freeMode.enabled;let f=a[m.indexOf(u)-1];if(void 0===f&&(r.cssMode||h)){let e;a.forEach((t,s)=>{u>=t&&(e=s)}),void 0!==e&&(f=h?a[e]:a[e>0?e-1:e])}let g=0;if(void 0!==f&&(g=n.indexOf(f),g<0&&(g=i.activeIndex-1),"auto"===r.slidesPerView&&1===r.slidesPerGroup&&r.slidesPerGroupAuto&&(g=g-i.slidesPerViewDynamic("previous",!0)+1,g=Math.max(g,0))),r.rewind&&i.isBeginning){const r=i.params.virtual?.enabled&&i.virtual?i.virtual.slides.length-1:i.slides.length-1;return i.slideTo(r,e,t,s)}return r.loop&&0===i.activeIndex&&r.cssMode?(requestAnimationFrame(()=>{i.slideTo(g,e,t,s)}),!0):i.slideTo(g,e,t,s)},slideReset:function(e,t=!0,s){const i=this;if(!i.destroyed)return void 0===e&&(e=i.params.speed),i.slideTo(i.activeIndex,e,t,s)},slideToClosest:function(e,t=!0,s,i=.5){const r=this;if(r.destroyed)return;void 0===e&&(e=r.params.speed);let a=r.activeIndex;const n=Math.min(r.params.slidesPerGroupSkip,a),l=n+Math.floor((a-n)/r.params.slidesPerGroup),o=r.rtlTranslate?r.translate:-r.translate;if(o>=r.snapGrid[l]){const e=r.snapGrid[l];o-e>(r.snapGrid[l+1]-e)*i&&(a+=r.params.slidesPerGroup)}else{const e=r.snapGrid[l-1];o-e<=(r.snapGrid[l]-e)*i&&(a-=r.params.slidesPerGroup)}return a=Math.max(a,0),a=Math.min(a,r.slidesGrid.length-1),r.slideTo(a,e,t,s)},slideToClickedSlide:function(){const e=this;if(e.destroyed)return;const{params:s,slidesEl:i,clickedSlide:r,clickedIndex:a}=e;if(void 0===r||void 0===a)return;const n="auto"===s.slidesPerView?e.slidesPerViewDynamic():s.slidesPerView;let l,o=e.getSlideIndexWhenGrid(a);const c=e.isElement?"swiper-slide":`.${s.slideClass}`,p=e.grid&&e.params.grid&&e.params.grid.rows>1;if(s.loop){if(e.animating)return;l=parseInt(r.getAttribute("data-swiper-slide-index"),10),s.centeredSlides?e.slideToLoop(l):o>(p?(e.slides.length-n)/2-(e.params.grid.rows-1):e.slides.length-n)?(e.loopFix(),o=e.getSlideIndex(d(i,`${c}[data-swiper-slide-index="${l}"]`)[0]),t(()=>{e.slideTo(o)})):e.slideTo(o)}else e.slideTo(o)}};function U({swiper:e,runCallbacks:t,direction:s,step:i}){const{activeIndex:r,previousIndex:a}=e;let n=s;n||(n=r>a?"next":r<a?"prev":"reset"),e.emit(`transition${i}`),t&&"reset"===n?e.emit(`slideResetTransition${i}`):t&&r!==a&&(e.emit(`slideChangeTransition${i}`),"next"===n?e.emit(`slideNextTransition${i}`):e.emit(`slidePrevTransition${i}`))}var K={getTranslate:function(e=(this.isHorizontal()?"x":"y")){const{params:t,rtlTranslate:s,translate:r,wrapperEl:a}=this;if(t.virtualTranslate)return s?-r:r;if(t.cssMode)return r;let n=i(a,e);return n+=this.cssOverflowAdjustment(),s&&(n=-n),n||0},setTranslate:function(e,t){const s=this,{rtlTranslate:i,params:r,wrapperEl:a,progress:n}=s;let l,o=0,d=0;s.isHorizontal()?o=i?-e:e:d=e,r.roundLengths&&(o=Math.floor(o),d=Math.floor(d)),s.previousTranslate=s.translate,s.translate=s.isHorizontal()?o:d,r.cssMode?a[s.isHorizontal()?"scrollLeft":"scrollTop"]=s.isHorizontal()?-o:-d:r.virtualTranslate||(s.isHorizontal()?o-=s.cssOverflowAdjustment():d-=s.cssOverflowAdjustment(),a.style.transform=`translate3d(${o}px, ${d}px, 0px)`);const c=s.maxTranslate()-s.minTranslate();l=0===c?0:(e-s.minTranslate())/c,l!==n&&s.updateProgress(e),s.emit("setTranslate",s.translate,t)},minTranslate:function(){return-this.snapGrid[0]},maxTranslate:function(){return-this.snapGrid[this.snapGrid.length-1]},translateTo:function(e=0,t=this.params.speed,s=!0,i=!0,r){const a=this,{params:n,wrapperEl:l}=a;if(a.animating&&n.preventInteractionOnTransition)return!1;const o=a.minTranslate(),d=a.maxTranslate();let c;if(c=i&&e>o?o:i&&e<d?d:e,a.updateProgress(c),n.cssMode){const e=a.isHorizontal();return 0===t?l[e?"scrollLeft":"scrollTop"]=-c:l.scrollTo({[e?"left":"top"]:-c,behavior:"smooth"}),!0}return 0===t?(a.setTransition(0),a.setTranslate(c),s&&(a.emit("beforeTransitionStart",t,r),a.emit("transitionEnd"))):(a.setTransition(t),a.setTranslate(c),s&&(a.emit("beforeTransitionStart",t,r),a.emit("transitionStart")),a.animating||(a.animating=!0,a.onTranslateToWrapperTransitionEnd||(a.onTranslateToWrapperTransitionEnd=function(e){a&&!a.destroyed&&e.target===this&&(a.wrapperEl.removeEventListener("transitionend",a.onTranslateToWrapperTransitionEnd),a.onTranslateToWrapperTransitionEnd=null,delete a.onTranslateToWrapperTransitionEnd,a.animating=!1,s&&a.emit("transitionEnd"))}),a.wrapperEl.addEventListener("transitionend",a.onTranslateToWrapperTransitionEnd))),!0}};const Z=(e,t,s)=>{t&&!e.classList.contains(s)?e.classList.add(s):!t&&e.classList.contains(s)&&e.classList.remove(s)};const Q=(e,t,s)=>{t&&!e.classList.contains(s)?e.classList.add(s):!t&&e.classList.contains(s)&&e.classList.remove(s)};var J={updateSize:function(){const e=this;let t,s;const i=e.el;t=void 0!==e.params.width&&null!==e.params.width?e.params.width:i.clientWidth,s=void 0!==e.params.height&&null!==e.params.height?e.params.height:i.clientHeight,0===t&&e.isHorizontal()||0===s&&e.isVertical()||(t=t-parseInt(m(i,"padding-left")||"0",10)-parseInt(m(i,"padding-right")||"0",10),s=s-parseInt(m(i,"padding-top")||"0",10)-parseInt(m(i,"padding-bottom")||"0",10),Number.isNaN(t)&&(t=0),Number.isNaN(s)&&(s=0),Object.assign(e,{width:t,height:s,size:e.isHorizontal()?t:s}))},updateSlides:function(){const e=this;function t(t,s){return parseFloat(t.getPropertyValue(e.getDirectionLabel(s))||"0")}const s=e.params,{wrapperEl:i,slidesEl:r,rtlTranslate:a,wrongRTL:n}=e,o=!(!e.virtual||!s.virtual?.enabled),c=o?e.virtual.slides.length:e.slides.length,p=d(r,`.${e.params.slideClass}, swiper-slide`),u=o?e.virtual.slides.length:p.length;let h=[];const f=[],g=[],w=t=>"function"==typeof t?t.call(e):t,b=w(s.slidesOffsetBefore),y=w(s.slidesOffsetAfter),E=e.snapGrid.length,S=e.slidesGrid.length,x=e.size-b-y;let T=s.spaceBetween,M=-b,C=0,P=0;if(void 0===x)return;"string"==typeof T&&T.indexOf("%")>=0?T=parseFloat(T.replace("%",""))/100*x:"string"==typeof T&&(T=parseFloat(T)),e.virtualSize=-T-b-y,p.forEach(e=>{a?e.style.marginLeft="":e.style.marginRight="",e.style.marginBottom="",e.style.marginTop=""}),s.centeredSlides&&s.cssMode&&(l(i,"--swiper-centered-offset-before",""),l(i,"--swiper-centered-offset-after","")),s.cssMode&&(l(i,"--swiper-slides-offset-before",`${b}px`),l(i,"--swiper-slides-offset-after",`${y}px`));const L=s.grid&&s.grid.rows>1&&e.grid;L?e.grid.initSlides(p):e.grid&&e.grid.unsetSlides();let 
vendor: 9,312 bytes, line 21828
21828A=0;const I="auto"===s.slidesPerView&&s.breakpoints&&Object.keys(s.breakpoints).filter(e=>{const t=s.breakpoints[e];return void 0!==t?.slidesPerView}).length>0;for(let i=0;i<u;i+=1){A=0;const r=p[i];if(!r||(L&&e.grid.updateSlide(i,r,p),"none"!==m(r,"display"))){if(o&&"auto"===s.slidesPerView)s.virtual?.slidesPerViewAutoSlideSize&&(A=s.virtual.slidesPerViewAutoSlideSize),A&&r&&(s.roundLengths&&(A=Math.floor(A)),r.style[e.getDirectionLabel("width")]=`${A}px`);else if("auto"===s.slidesPerView){I&&(r.style[e.getDirectionLabel("width")]="");const i=getComputedStyle(r),a=r.style.transform,n=r.style.webkitTransform;if(a&&(r.style.transform="none"),n&&(r.style.webkitTransform="none"),s.roundLengths)A=e.isHorizontal()?v(r,"width"):v(r,"height");else{const e=t(i,"width"),s=t(i,"padding-left"),a=t(i,"padding-right"),n=t(i,"margin-left"),l=t(i,"margin-right"),o=i.getPropertyValue("box-sizing");if(o&&"border-box"===o)A=e+n+l;else{const{clientWidth:t,offsetWidth:i}=r;A=e+s+a+n+l+(i-t)}}a&&(r.style.transform=a),n&&(r.style.webkitTransform=n),s.roundLengths&&(A=Math.floor(A))}else A=(x-(s.slidesPerView-1)*T)/s.slidesPerView,s.roundLengths&&(A=Math.floor(A)),r&&(r.style[e.getDirectionLabel("width")]=`${A}px`);r&&(r.swiperSlideSize=A),g.push(A),s.centeredSlides?(M=M+A/2+C/2+T,0===C&&0!==i&&(M=M-x/2-T),0===i&&(M=M-x/2-T),Math.abs(M)<.001&&(M=0),s.roundLengths&&(M=Math.floor(M)),P%s.slidesPerGroup===0&&h.push(M),f.push(M)):(s.roundLengths&&(M=Math.floor(M)),(P-Math.min(e.params.slidesPerGroupSkip,P))%e.params.slidesPerGroup===0&&h.push(M),f.push(M),M=M+A+T),e.virtualSize+=A+T,C=A,P+=1}}if(e.virtualSize=Math.max(e.virtualSize,x)+y,a&&n&&("slide"===s.effect||"coverflow"===s.effect)&&(i.style.width=`${e.virtualSize+T}px`),s.setWrapperSize&&(i.style[e.getDirectionLabel("width")]=`${e.virtualSize+T}px`),L&&e.grid.updateWrapperSize(A,h),!s.centeredSlides){const t="auto"!==s.slidesPerView&&s.slidesPerView%1!=0,i=s.snapToSlideEdge&&!s.loop&&("auto"===s.slidesPerView||t);let r=h.length;if(i){let e;if("auto"===s.slidesPerView){e=1;let t=0;for(let s=g.length-1;s>=0&&(t+=g[s]+(s<g.length-1?T:0),t<=x);s-=1)e=g.length-s}else e=Math.floor(s.slidesPerView);r=Math.max(u-e,0)}const a=[];for(let t=0;t<h.length;t+=1){let n=h[t];s.roundLengths&&(n=Math.floor(n)),i?t<=r&&a.push(n):h[t]<=e.virtualSize-x&&a.push(n)}h=a,Math.floor(e.virtualSize-x)-Math.floor(h[h.length-1])>1&&(i||h.push(e.virtualSize-x))}if(o&&s.loop){const t=g[0]+T,i=(e.virtual.slidesBefore??0)+(e.virtual.slidesAfter??0);if(s.slidesPerGroup>1){const e=Math.ceil(i/s.slidesPerGroup),r=t*s.slidesPerGroup;for(let t=0;t<e;t+=1)h.push(h[h.length-1]+r)}for(let r=0;r<i;r+=1)1===s.slidesPerGroup&&h.push(h[h.length-1]+t),f.push(f[f.length-1]+t),e.virtualSize+=t}if(0===h.length&&(h=[0]),0!==T){const t=e.isHorizontal()&&a?"marginLeft":e.getDirectionLabel("marginRight");p.filter((e,t)=>!(s.cssMode&&!s.loop)||t!==p.length-1).forEach(e=>{e.style[t]=`${T}px`})}if(s.centeredSlides&&s.centeredSlidesBounds){let e=0;g.forEach(t=>{e+=t+(T||0)}),e-=T;const t=e>x?e-x:0;h=h.map(e=>e<=0?-b:e>t?t+y:e)}if(s.centerInsufficientSlides){let e=0;if(g.forEach(t=>{e+=t+(T||0)}),e-=T,e<x){const t=(x-e)/2;h.forEach((e,s)=>{h[s]=e-t}),f.forEach((e,s)=>{f[s]=e+t})}}if(Object.assign(e,{slides:p,snapGrid:h,slidesGrid:f,slidesSizesGrid:g}),s.centeredSlides&&s.cssMode&&!s.centeredSlidesBounds){l(i,"--swiper-centered-offset-before",-h[0]+"px"),l(i,"--swiper-centered-offset-after",e.size/2-g[g.length-1]/2+"px");const t=-e.snapGrid[0],s=-e.slidesGrid[0];e.snapGrid=e.snapGrid.map(e=>e+t),e.slidesGrid=e.slidesGrid.map(e=>e+s)}if(u!==c&&e.emit("slidesLengthChange"),h.length!==E&&(e.params.watchOverflow&&e.checkOverflow(),e.emit("snapGridLengthChange")),f.length!==S&&e.emit("slidesGridLengthChange"),s.watchSlidesProgress&&e.updateSlidesOffset(),e.emit("slidesUpdated"),!(o||s.cssMode||"slide"!==s.effect&&"fade"!==s.effect)){const t=`${s.containerModifierClass}backface-hidden`,i=e.el.classList.contains(t);u<=s.maxBackfaceHiddenSlides?i||e.el.classList.add(t):i&&e.el.classList.remove(t)}},updateAutoHeight:function(e){const t=this,s=[],i=t.virtual&&t.params.virtual?.enabled;let r,a=0;"number"==typeof e?t.setTransition(e):!0===e&&t.setTransition(t.params.speed);const n=e=>i?t.slides[t.getSlideIndexByData(e)]:t.slides[e];if("auto"!==t.params.slidesPerView&&t.params.slidesPerView>1)if(t.params.centeredSlides)(t.visibleSlides||[]).forEach(e=>{s.push(e)});else for(r=0;r<Math.ceil(t.params.slidesPerView);r+=1){const e=t.activeIndex+r;if(e>t.slides.length&&!i)break;const a=n(e);a&&s.push(a)}else{const e=n(t.activeIndex);e&&s.push(e)}for(r=0;r<s.length;r+=1)if(void 0!==s[r]){const e=s[r].offsetHeight;a=e>a?e:a}(a||0===a)&&(t.wrapperEl.style.height=`${a}px`)},updateSlidesOffset:function(){const e=this,t=e.slides,s=e.isElement?e.isHorizontal()?e.wrapperEl.offsetLeft:e.wrapperEl.offsetTop:0;for(let i=0;i<t.length;i+=1)t[i].swiperSlideOffset=(e.isHorizontal()?t[i].offsetLeft:t[i].offsetTop)-s-e.cssOverflowAdjustment()},updateSlidesProgress:function(e=this&&this.translate||0){const t=this,s=t.params,{slides:i,rtlTranslate:r,snapGrid:a}=t;if(0===i.length)return;void 0===i[0].swiperSlideOffset&&t.updateSlidesOffset();let n=-e;r&&(n=e),t.visibleSlidesIndexes=[],t.visibleSlides=[];let l=s.spaceBetween;"string"==typeof l&&l.indexOf("%")>=0?l=parseFloat(l.replace("%",""))/100*t.size:"string"==typeof l&&(l=parseFloat(l));for(let e=0;e<i.length;e+=1){const o=i[e];let d=o.swiperSlideOffset??0;s.cssMode&&s.centeredSlides&&(d-=i[0].swiperSlideOffset??0);const c=o.swiperSlideSize??0,p=(n+(s.centeredSlides?t.minTranslate():0)-d)/(c+l),u=(n-a[0]+(s.centeredSlides?t.minTranslate():0)-d)/(c+l),m=-(n-d),h=m+t.slidesSizesGrid[e],f=m>=0&&m<=t.size-t.slidesSizesGrid[e],g=m>=0&&m<t.size-1||h>1&&h<=t.size||m<=0&&h>=t.size;g&&(t.visibleSlides.push(o),t.visibleSlidesIndexes.push(e)),Q(o,g,s.slideVisibleClass),Q(o,f,s.slideFullyVisibleClass),o.progress=r?-p:p,o.originalProgress=r?-u:u}},updateProgress:function(e){const t=this;if(void 0===e){const s=t.rtlTranslate?-1:1;e=t&&t.translate&&t.translate*s||0}const s=t.params,i=t.maxTranslate()-t.minTranslate();let{progress:r,isBeginning:a,isEnd:n}=t,l=t.progressLoop;const o=a,d=n;if(0===i)r=0,a=!0,n=!0;else{r=(e-t.minTranslate())/i;const s=Math.abs(e-t.minTranslate())<1,l=Math.abs(e-t.maxTranslate())<1;a=s||r<=0,n=l||r>=1,s&&(r=0),l&&(r=1)}if(s.loop){const s=t.getSlideIndexByData(0),i=t.getSlideIndexByData(t.slides.length-1),r=t.slidesGrid[s],a=t.slidesGrid[i],n=t.slidesGrid[t.slidesGrid.length-1],o=Math.abs(e);l=o>=r?(o-r)/n:(o+n-a)/n,l>1&&(l-=1)}Object.assign(t,{progress:r,progressLoop:l,isBeginning:a,isEnd:n}),(s.watchSlidesProgress||s.centeredSlides&&s.autoHeight)&&t.updateSlidesProgress(e),a&&!o&&t.emit("reachBeginning toEdge"),n&&!d&&t.emit("reachEnd toEdge"),(o&&!a||d&&!n)&&t.emit("fromEdge"),t.emit("progress",r)},updateSlidesClasses:function(){const e=this,{slides:t,params:s,slidesEl:i,activeIndex:r}=e,a=!(!e.virtual||!s.virtual?.enabled),n=e.grid&&s.grid&&s.grid.rows>1,l=e=>d(i,`.${s.slideClass}${e}, swiper-slide${e}`)[0];let o,c,p;if(a)if(s.loop){const t=e.virtual.slides;let s=r-(e.virtual.slidesBefore??0);s<0&&(s=t.length+s),s>=t.length&&(s-=t.length),o=l(`[data-swiper-slide-index="${s}"]`)}else o=l(`[data-swiper-slide-index="${r}"]`);else n?(o=t.find(e=>e.column===r),p=t.find(e=>e.column===r+1),c=t.find(e=>e.column===r-1)):o=t[r];o&&(n||(p=function(e,t){const s=[];let i=e.nextElementSibling;for(;i;)t&&!i.matches(t)||s.push(i),i=i.nextElementSibling;return s}(o,`.${s.slideClass}, swiper-slide`)[0],s.loop&&!p&&(p=t[0]),c=function(e,t){const s=[];let i=e.previousElementSibling;for(;i;)t&&!i.matches(t)||s.push(i),i=i.previousElementSibling;return s}(o,`.${s.slideClass}, swiper-slide`)[0],s.loop&&0===!c&&(c=t[t.length-1]))),t.forEach(e=>{Z(e,e===o,s.slideActiveClass),Z(e,e===p,s.slideNextClass),Z(e,e===c,s.slidePrevClass)}),e.emitSlidesClasses()},updateActiveIndex:function(e){const t=this,s=t.rtlTranslate?t.translate:-t.translate,{snapGrid:i,params:r,activeIndex:a,realIndex:n,snapIndex:l}=t;let o,d=e;const c=e=>{const s=t.virtual.slides;let i=e-(t.virtual.slidesBefore??0);return i<0&&(i=s.length+i),i>=s.length&&(i-=s.length),i};if(void 0===d&&(d=function(e){const{slidesGrid:t,params:s}=e,i=e.rtlTranslate?e.translate:-e.translate;let r;for(let e=0;e<t.length;e+=1)void 0!==t[e+1]?i>=t[e]&&i<t[e+1]-(t[e+1]-t[e])/2?r=e:i>=t[e]&&i<t[e+1]&&(r=e+1):i>=t[e]&&(r=e);return s.normalizeSlideIndex&&(r<0||void 0===r)&&(r=0),r}(t)),i.indexOf(s)>=0)o=i.indexOf(s);else{const e=Math.min(r.slidesPerGroupSkip,d);o=e+Math.floor((d-e)/r.slidesPerGroup)}if(o>=i.length&&(o=i.length-1),d===a&&!t.params.loop)return void(o!==l&&(t.snapIndex=o,t.emit("snapIndexChange")));if(d===a&&t.params.loop&&t.virtual&&t.params.virtual?.enabled)return void(t.realIndex=c(d));const p=t.grid&&r.grid&&r.grid.rows>1;let u;if(t.virtual&&r.virtual?.enabled)u=r.loop?c(d):d;else if(p){const e=t.slides.find(e=>e.column===d);let s=parseInt(e.getAttribute("data-swiper-slide-index"),10);Number.isNaN(s)&&(s=Math.max(t.slides.indexOf(e),0)),u=Math.floor(s/r.grid.rows)}else if(t.slides[d]){const e=t.slides[d].getAttribute("data-swiper-slide-index");u=e?parseInt(e,10):d}else u=d;Object.assign(t,{previousSnapIndex:l,snapIndex:o,previousRealIndex:n,realIndex:u,previousIndex:a,activeIndex:d}),t.initialized&&A
vendor: 10,737 bytes, line 21828
21828(t),t.__loopFixInProgress__||(t.emit("activeIndexChange"),t.emit("snapIndexChange"),(t.initialized||t.params.runCallbacksOnInit)&&((t.__lastEmittedRealIndex__??n)!==u&&t.emit("realIndexChange"),t.emit("slideChange")),t.__lastEmittedRealIndex__=u)},updateClickedSlide:function(e,t){const s=this,i=s.params;let r=e.closest(`.${i.slideClass}, swiper-slide`);!r&&s.isElement&&t&&t.length>1&&t.includes(e)&&[...t.slice(t.indexOf(e)+1,t.length)].forEach(e=>{!r&&e.matches&&e.matches(`.${i.slideClass}, swiper-slide`)&&(r=e)});let a,n=!1;if(r)for(let e=0;e<s.slides.length;e+=1)if(s.slides[e]===r){n=!0,a=e;break}if(!r||!n)return s.clickedSlide=void 0,void(s.clickedIndex=void 0);s.clickedSlide=r,s.virtual&&s.params.virtual?.enabled?s.clickedIndex=parseInt(r.getAttribute("data-swiper-slide-index"),10):s.clickedIndex=a,i.slideToClickedSlide&&void 0!==s.clickedIndex&&s.clickedIndex!==s.activeIndex&&s.slideToClickedSlide()}};const ee={eventsEmitter:D,update:J,translate:K,transition:{setTransition:function(e,t){const s=this;s.params.cssMode||(s.wrapperEl.style.transitionDuration=`${e}ms`,s.wrapperEl.style.transitionDelay=0===e?"0ms":""),s.emit("setTransition",e,t)},transitionStart:function(e=!0,t){const s=this,{params:i}=s;i.cssMode||(i.autoHeight&&s.updateAutoHeight(),U({swiper:s,runCallbacks:e,direction:t,step:"Start"}))},transitionEnd:function(e=!0,t){const s=this,{params:i}=s;s.animating=!1,i.cssMode||(s.setTransition(0),U({swiper:s,runCallbacks:e,direction:t,step:"End"}))}},slide:j,loop:F,grabCursor:{setGrabCursor:function(e){const t=this;if(!t.params.simulateTouch||t.params.watchOverflow&&t.isLocked||t.params.cssMode)return;const s="container"===t.params.touchEventsTarget?t.el:t.wrapperEl;t.isElement&&(t.__preventObserver__=!0),s.style.cursor="move",s.style.cursor=e?"grabbing":"grab",t.isElement&&requestAnimationFrame(()=>{t.__preventObserver__=!1})},unsetGrabCursor:function(){const e=this;e.params.watchOverflow&&e.isLocked||e.params.cssMode||(e.isElement&&(e.__preventObserver__=!0),e["container"===e.params.touchEventsTarget?"el":"wrapperEl"].style.cursor="",e.isElement&&requestAnimationFrame(()=>{e.__preventObserver__=!1}))}},events:{attachEvents:function(){const e=this,{params:t}=e;e.onTouchStart=V.bind(e),e.onTouchMove=_.bind(e),e.onTouchEnd=R.bind(e),e.onDocumentTouchStart=X.bind(e),t.cssMode&&(e.onScroll=Y.bind(e)),e.onClick=G.bind(e),e.onLoad=B.bind(e),q(e,"on")},detachEvents:function(){q(this,"off")}},breakpoints:z,checkOverflow:$,classes:k},te={};class se{static extendedDefaults;static defaults;constructor(...e){let t,s;if(1===e.length&&null!==e[0]&&"object"==typeof e[0]&&"Object"===Object.prototype.toString.call(e[0]).slice(8,-1)?s=e[0]:[t,s]=e,s||(s={}),s=n({},s),t&&!s.el&&(s.el=t),s.el&&"string"==typeof s.el&&"undefined"!=typeof document&&document.querySelectorAll(s.el).length>1){const e=[];return document.querySelectorAll(s.el).forEach(t=>{const i=n({},s,{el:t});e.push(new se(i))}),e}const i=this;i.__swiper__=!0,i.support=T(),i.device=M({userAgent:s.userAgent??void 0}),i.browser=C(),i.eventsListeners={},i.eventsAnyListeners=[],i.modules=[...i.__modules__||[]],s.modules&&Array.isArray(s.modules)&&s.modules.forEach(e=>{const t=e;"function"==typeof t&&i.modules.indexOf(t)<0&&i.modules.push(t)});const r={};i.modules.forEach(e=>{e({params:s,swiper:i,extendParams:W(s,r),on:i.on.bind(i),once:i.once.bind(i),off:i.off.bind(i),emit:i.emit.bind(i)})});const a=n({},O,r);if(i.params=n({},a,te,s),i.originalParams=n({},i.params),i.passedParams=n({},s),i.params&&i.params.on){const e=i.params.on;Object.keys(e).forEach(t=>{const s=e[t];s&&i.on(t,s)})}return i.params&&i.params.onAny&&i.onAny(i.params.onAny),Object.assign(i,{enabled:i.params.enabled,el:t,classNames:[],slides:[],slidesGrid:[],snapGrid:[],slidesSizesGrid:[],isHorizontal:()=>"horizontal"===i.params.direction,isVertical:()=>"vertical"===i.params.direction,activeIndex:0,realIndex:0,isBeginning:!0,isEnd:!1,translate:0,previousTranslate:0,progress:0,velocity:0,animating:!1,cssOverflowAdjustment(){return Math.trunc(this.translate/2**23)*2**23},allowSlideNext:i.params.allowSlideNext,allowSlidePrev:i.params.allowSlidePrev,touchEventsData:{isTouched:void 0,isMoved:void 0,allowTouchCallbacks:void 0,touchStartTime:void 0,isScrolling:void 0,currentTranslate:void 0,startTranslate:void 0,allowThresholdMove:void 0,focusableElements:i.params.focusableElements,lastClickTime:0,clickTimeout:void 0,velocities:[],allowMomentumBounce:void 0,startMoving:void 0,pointerId:null,touchId:null},allowClick:!0,allowTouchMove:i.params.allowTouchMove,touches:{startX:0,startY:0,currentX:0,currentY:0,diff:0},imagesToLoad:[],imagesLoaded:0}),i.emit("_swiper"),i.params.init&&i.init(),i}getDirectionLabel(e){return this.isHorizontal()?e:{width:"height","margin-top":"margin-left","margin-bottom ":"margin-right","margin-left":"margin-top","margin-right":"margin-bottom","padding-left":"padding-top","padding-right":"padding-bottom",marginRight:"marginBottom"}[e]}isHorizontal(){return"horizontal"===this.params.direction}isVertical(){return"vertical"===this.params.direction}cssOverflowAdjustment(){return Math.trunc(this.translate/2**23)*2**23}getSlideIndex(e){const{slidesEl:t,params:s}=this,i=h(d(t,`.${s.slideClass}, swiper-slide`)[0]);return h(e)-(i??0)}getSlideIndexByData(e){return this.getSlideIndex(this.slides.find(t=>Number(t.getAttribute("data-swiper-slide-index"))===e))}getSlideIndexWhenGrid(e){return this.grid&&this.params.grid&&this.params.grid.rows>1&&("column"===this.params.grid.fill?e=Math.floor(e/this.params.grid.rows):"row"===this.params.grid.fill&&(e%=Math.ceil(this.slides.length/this.params.grid.rows))),e}recalcSlides(){const{slidesEl:e,params:t}=this;this.slides=d(e,`.${t.slideClass}, swiper-slide`)}enable(){this.enabled||(this.enabled=!0,this.params.grabCursor&&this.setGrabCursor(),this.emit("enable"))}disable(){this.enabled&&(this.enabled=!1,this.params.grabCursor&&this.unsetGrabCursor(),this.emit("disable"))}setProgress(e,t){e=Math.min(Math.max(e,0),1);const s=this.minTranslate(),i=(this.maxTranslate()-s)*e+s;this.translateTo(i,void 0===t?0:t),this.updateActiveIndex(),this.updateSlidesClasses()}emitContainerClasses(){if(!this.params._emitClasses||!this.el)return;const e=this.el.className.split(" ").filter(e=>0===e.indexOf("swiper")||0===e.indexOf(this.params.containerModifierClass));this.emit("_containerClasses",e.join(" "))}getSlideClasses(e){return this.destroyed?"":e.className.split(" ").filter(e=>0===e.indexOf("swiper-slide")||0===e.indexOf(this.params.slideClass)).join(" ")}emitSlidesClasses(){if(!this.params._emitClasses||!this.el)return;const e=[];this.slides.forEach(t=>{const s=this.getSlideClasses(t);e.push({slideEl:t,classNames:s}),this.emit("_slideClass",t,s)}),this.emit("_slideClasses",e)}slidesPerViewDynamic(e="current",t=!1){const{params:s,slides:i,slidesGrid:r,slidesSizesGrid:a,size:n,activeIndex:l}=this;let o=1;if("number"==typeof s.slidesPerView)return s.slidesPerView;if(!n)return o;if(s.centeredSlides){let e=i[l]?Math.ceil(i[l].swiperSlideSize??0):0,t=!1;for(let s=l+1;s<i.length;s+=1)i[s]&&!t&&(e+=Math.ceil(i[s].swiperSlideSize??0),o+=1,e>n&&(t=!0));for(let s=l-1;s>=0;s-=1)i[s]&&!t&&(e+=i[s].swiperSlideSize??0,o+=1,e>n&&(t=!0))}else if("current"===e)for(let e=l+1;e<i.length;e+=1){(t?r[e]+a[e]-r[l]<n:r[e]-r[l]<n)&&(o+=1)}else for(let e=l-1;e>=0;e-=1){r[l]-r[e]<n&&(o+=1)}return o}update(){const e=this;if(!e||e.destroyed)return;const{snapGrid:t,params:s}=e;function i(){const t=e.rtlTranslate?-1*e.translate:e.translate,s=Math.min(Math.max(t,e.maxTranslate()),e.minTranslate());e.setTranslate(s),e.updateActiveIndex(),e.updateSlidesClasses()}let r;if(s.breakpoints&&e.setBreakpoint(),s.lazyPreload&&[...e.el.querySelectorAll('[loading="lazy"]')].forEach(t=>{t.complete&&P(e,t)}),e.updateSize(),e.updateSlides(),e.updateProgress(),e.updateSlidesClasses(),s.freeMode?.enabled&&!s.cssMode)i(),s.autoHeight&&e.updateAutoHeight();else{if(("auto"===s.slidesPerView||s.slidesPerView>1)&&e.isEnd&&!s.centeredSlides){const t=e.virtual&&s.virtual?.enabled?e.virtual.slides.length:e.slides.length;r=e.slideTo(t-1,0,!1,!0)}else r=e.slideTo(e.activeIndex,0,!1,!0);r||i()}s.watchOverflow&&t!==e.snapGrid&&e.checkOverflow(),e.emit("update")}changeDirection(e,t=!0){const s=this,i=s.params.direction;return e||(e="horizontal"===i?"vertical":"horizontal"),e===i||"horizontal"!==e&&"vertical"!==e||(s.el.classList.remove(`${s.params.containerModifierClass}${i}`),s.el.classList.add(`${s.params.containerModifierClass}${e}`),s.emitContainerClasses(),s.params.direction=e,s.rtlTranslate="horizontal"===e&&s.rtl,s.slides.forEach(t=>{"vertical"===e?t.style.width="":t.style.height=""}),s.emit("changeDirection"),t&&s.update()),s}changeLanguageDirection(e){const t=this;t.rtl&&"rtl"===e||!t.rtl&&"ltr"===e||(t.rtl="rtl"===e,t.rtlTranslate="horizontal"===t.params.direction&&t.rtl,t.rtl?(t.el.classList.add(`${t.params.containerModifierClass}rtl`),t.el.dir="rtl"):(t.el.classList.remove(`${t.params.containerModifierClass}rtl`),t.el.dir="ltr"),t.update())}mount(e){const t=this;if(t.mounted)return!0;if("undefined"==typeof document)return!1;const s=e??t.params.el;let i=null;if("string"==typeof s?i=document.querySelector(s):s instanceof HTMLElement&&(i=s),!i)return!1;i.swiper=t;const r=i.parentNode;r&&r.host&&r.host.nodeName===t.params.swiperElementNodeName.toUpperCase()&&(t.isElement=!0);const a=()=>`.${(t.params.wrapperClass||"").trim().split(" ").join(".")}`;let n=(()=>{if(i&&i.shadowRoot){return i.shadowRoot.querySelector(a())}return d(i,a())[0]})();!n&&t.params.createElements&&(n=p("div",t.params.wrapperClass),i.append(n),d(i,`.${t.params.slideClass}`).forEach(e=>{n.append(e)}));const l=t.isElement?i.parentNode.host:null;return Object.assign(t,{el:i,wrapperEl:n,slidesEl:t.isElement&&!l.slideSlots?l:n,hostEl:t.isElement?l:i,mounted:!0,rtl:"rtl"===i.dir.toLowerCase()||"rtl"===m(i,"direction"),rtlTranslate:"horizontal"===t.params.direction&&("rtl"===i.dir.toLowerCase()||"rtl"===m(i,"direction")),wrongRTL:"-webkit-box"===m(n,"display")}),!0}init(e){const t=this;if(t.initialized)return t;if(!1===t.mount(e))return t;if(t.emit("beforeInit"),t.params.breakpoints&&t.setBreakpoint(),t.addClasses(),t.updateSize(),t.updateSlides(),t.params.watchOverflow&&t.checkOverflow(),t.params.grabCursor&&t.enabled&&t.setGrabCursor(),t.params.loop&&t.virtual&&t.params.virtual?.enabled?t.slideTo((t.params.initialSlide??0)+(t.virtual.slidesBefore??0),0,t.params.runCallbacksOnInit,!1,!0):t.slideTo(t.params.initialSlide,0,t.params.runCallbacksOnInit,!1,!0),t.params.loop&&t.loopCreate(void 0,!0),t.attachEvents(),t.params.lazyPreload){const e=[...t.el.querySelectorAll('[loading="lazy"]')];t.isElement&&e.push(...t.hostEl.querySelectorAll('[loading="lazy"]')),e.forEach(e=>{e.complete
vendor: 7,245 bytes, line 21828
21828&&P(t,e)})}return t.initialized=!0,A(t),t.emit("init"),t.emit("afterInit"),t}destroy(e=!0,t=!0){const s=this,{params:i,el:r,wrapperEl:a,slides:n}=s;return void 0===s.params||s.destroyed||(s.emit("beforeDestroy"),s.initialized=!1,s.detachEvents(),i.loop&&s.loopDestroy(),t&&(s.removeClasses(),r&&"string"!=typeof r&&r.removeAttribute("style"),a&&a.removeAttribute("style"),n&&n.length&&n.forEach(e=>{e.classList.remove(i.slideVisibleClass,i.slideFullyVisibleClass,i.slideActiveClass,i.slideNextClass,i.slidePrevClass),e.removeAttribute("style"),e.removeAttribute("data-swiper-slide-index")})),s.emit("destroy"),Object.keys(s.eventsListeners).forEach(e=>{s.off(e)}),!1!==e&&(s.el&&"string"!=typeof s.el&&(s.el.swiper=null),l=s,Object.keys(l).forEach(e=>{try{l[e]=null}catch{}try{delete l[e]}catch{}})),s.destroyed=!0),null;var l}static extendDefaults(e){n(te,e)}static installModule(e){se.prototype.__modules__||(se.prototype.__modules__=[]);const t=se.prototype.__modules__;"function"==typeof e&&t.indexOf(e)<0&&t.push(e)}static use(e){return Array.isArray(e)?(e.forEach(e=>se.installModule(e)),se):(se.installModule(e),se)}}Object.defineProperty(se,"extendedDefaults",{get:()=>te}),Object.defineProperty(se,"defaults",{get:()=>O});const ie=ee,re=se.prototype;Object.keys(ie).forEach(e=>{const t=ie[e];Object.keys(t).forEach(e=>{re[e]=t[e]})}),se.use([({swiper:e,on:t,emit:s})=>{let i=null,r=null;const a=()=>{e&&!e.destroyed&&e.initialized&&(s("beforeResize"),s("resize"))},n=()=>{e&&!e.destroyed&&e.initialized&&s("orientationchange")};t("init",()=>{e.params.resizeObserver&&void 0!==window.ResizeObserver?(()=>{if(!e||e.destroyed||!e.initialized)return;let t=e.width,s=e.height;i=new ResizeObserver(i=>{r=window.requestAnimationFrame(()=>{let r=t,n=s;i.forEach(({contentBoxSize:t,contentRect:s,target:i})=>{if(i&&i!==e.el)return;const a=Array.isArray(t)?t[0]:t;r=s?s.width:a.inlineSize,n=s?s.height:a.blockSize}),r===t&&n===s||(t=r,s=n,a())})}),i.observe(e.el)})():(window.addEventListener("resize",a),window.addEventListener("orientationchange",n))}),t("destroy",()=>{r&&window.cancelAnimationFrame(r),i&&i.unobserve&&e.el&&(i.unobserve(e.el),i=null),window.removeEventListener("resize",a),window.removeEventListener("orientationchange",n)})},({swiper:e,extendParams:t,on:s})=>{const i=[],r=(t,s={})=>{const r=window.MutationObserver||window.WebkitMutationObserver;if(!r)return;const a=new r(t=>{if(e.__preventObserver__)return;if(1===t.length)return void e.emit("observerUpdate",t[0]);const s=function(){e.emit("observerUpdate",t[0])};window.requestAnimationFrame?window.requestAnimationFrame(s):window.setTimeout(s,0)});a.observe(t,{attributes:void 0===s.attributes||s.attributes,childList:e.isElement||void 0===s.childList||s.childList,characterData:void 0===s.characterData||s.characterData}),i.push(a)};t({observer:!1,observeParents:!1,observeSlideChildren:!1}),s("init",()=>{if(e.params.observer){if(e.params.observeParents){const t=f(e.hostEl);for(let e=0;e<t.length;e+=1)r(t[e])}r(e.hostEl,{childList:e.params.observeSlideChildren}),r(e.wrapperEl,{attributes:!1})}}),s("destroy",()=>{i.forEach(e=>{e.disconnect()}),i.splice(0,i.length)})}]);function ae(e,t,s,i){const r=s??{},a=t??{};return e.params.createElements&&Object.keys(i).forEach(t=>{if(!r[t]&&!0===r.auto){let s=d(e.el,`.${i[t]}`)[0];s||(s=p("div",i[t]),s.className=i[t],e.el.append(s)),r[t]=s,a[t]=s}}),r}const ne='<svg class="swiper-navigation-icon" width="11" height="20" viewBox="0 0 11 20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M0.38296 20.0762C0.111788 19.805 0.111788 19.3654 0.38296 19.0942L9.19758 10.2796L0.38296 1.46497C0.111788 1.19379 0.111788 0.754138 0.38296 0.482966C0.654131 0.211794 1.09379 0.211794 1.36496 0.482966L10.4341 9.55214C10.8359 9.9539 10.8359 10.6053 10.4341 11.007L1.36496 20.0762C1.09379 20.3474 0.654131 20.3474 0.38296 20.0762Z" fill="currentColor"/></svg>';function le(e=""){return`.${e.trim().replace(/([.:!+/()[\]#>~*^$|=,'"@{}\\])/g,"\\$1").replace(/ /g,".")}`}const oe=e=>{if((e=>!!e.virtual&&!!e.params.virtual?.enabled)(e))return e.virtual.slides.length;const t=e.params.grid?.rows;return e.grid&&t&&t>1?e.slides.length/Math.ceil(t):e.slides.length};class de{x;y;lastIndex;binarySearch;constructor(e,t){let s,i,r;this.binarySearch=(e,t)=>{for(i=-1,s=e.length;s-i>1;)r=s+i>>1,e[r]<=t?i=r:s=r;return s},this.x=e,this.y=t,this.lastIndex=e.length-1}interpolate(e){if(!e)return 0;const t=this.binarySearch(this.x,e),s=t-1;return(e-this.x[s])*(this.y[t]-this.y[s])/(this.x[t]-this.x[s])+this.y[s]}}const ce=e=>!!e.virtual&&!!e.params.virtual?.enabled,pe=e=>!!e.virtual&&!!e.params.virtual?.enabled;function ue(e,t){const s=this,{params:i,activeIndex:r,slidesEl:a}=s;let n=r;i.loop&&(n-=s.loopedSlides??0,s.loopDestroy(),s.recalcSlides());const l=s.slides.length;if(e<=0)return void s.prependSlide(t);if(e>=l)return void s.appendSlide(t);let o=n>e?n+1:n;const d=[];for(let t=l-1;t>=e;t-=1){const e=s.slides[t];e&&(e.remove(),d.unshift(e))}if(Array.isArray(t)){for(let e=0;e<t.length;e+=1){const s=t[e];s&&a.append(s)}o=n>e?n+t.length:n}else a.append(t);for(let e=0;e<d.length;e+=1)a.append(d[e]);s.recalcSlides(),i.loop&&s.loopCreate(),i.observer&&!s.isElement||s.update(),i.loop?s.slideTo(o+(s.loopedSlides??0),0,!1):s.slideTo(o,0,!1)}function me(e){const t=this,{params:s,slidesEl:i}=t;s.loop&&t.loopDestroy();const r=e=>{if("string"==typeof e){const t=document.createElement("div");y(t,e);const s=t.children[0];s&&i.append(s),y(t,"")}else i.append(e)};if(Array.isArray(e))for(let t=0;t<e.length;t+=1){const s=e[t];s&&r(s)}else r(e);t.recalcSlides(),s.loop&&t.loopCreate(),s.observer&&!t.isElement||t.update()}function he(e){const t=this,{params:s,activeIndex:i,slidesEl:r}=t;s.loop&&t.loopDestroy();let a=i+1;const n=e=>{if("string"==typeof e){const t=document.createElement("div");y(t,e);const s=t.children[0];s&&r.prepend(s),y(t,"")}else r.prepend(e)};if(Array.isArray(e)){for(let t=0;t<e.length;t+=1){const s=e[t];s&&n(s)}a=i+e.length}else n(e);t.recalcSlides(),s.loop&&t.loopCreate(),s.observer&&!t.isElement||t.update(),t.slideTo(a,0,!1)}function fe(){const e=this,t=[];for(let s=0;s<e.slides.length;s+=1)t.push(s);e.removeSlide(t)}function ge(e){const t=this,{params:s,activeIndex:i}=t;let r=i;s.loop&&(r-=t.loopedSlides??0,t.loopDestroy());let a=r;if(Array.isArray(e)){for(let s=0;s<e.length;s+=1){const i=e[s];t.slides[i]&&t.slides[i].remove(),i<a&&(a-=1)}a=Math.max(a,0)}else{const s=e;t.slides[s]&&t.slides[s].remove(),s<a&&(a-=1),a=Math.max(a,0)}t.recalcSlides(),s.loop&&t.loopCreate(),s.observer&&!t.isElement||t.update(),s.loop?t.slideTo(a+(t.loopedSlides??0),0,!1):t.slideTo(a,0,!1)}function ve(e){const{effect:t,swiper:s,on:i,setTranslate:r,setTransition:a,overwriteParams:n,perspective:l,recreateShadows:o,getEffectParams:d}=e;i("beforeInit",()=>{if(s.params.effect!==t)return;s.classNames.push(`${s.params.containerModifierClass}${t}`),l&&l()&&s.classNames.push(`${s.params.containerModifierClass}3d`);const e=n?n():{};Object.assign(s.params,e),Object.assign(s.originalParams,e)}),i("setTranslate _virtualUpdated",()=>{s.params.effect===t&&r()}),i("setTransition",(e,i)=>{s.params.effect===t&&a(i)}),i("transitionEnd",()=>{if(s.params.effect===t&&o){const e=d?d():void 0;if(!e||!e.slideShadows)return;
21828s.slides.forEach(e=>{e.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach(e=>e.remove())}),o()}});let c=!1;i("virtualUpdate",()=>{s.params.effect===t&&(s.slides.length||(c=!0),requestAnimationFrame(()=>{c&&s.slides&&s.slides.length&&(r(),c=!1)}))})}function we(e,t){const s=o(t);return s!==t&&(s.style.backfaceVisibility="hidden",s.style.setProperty("-webkit-backface-visibility","hidden")),s}function be({swiper:e,duration:t,transformElements:s,allSlides:i}){const{activeIndex:r}=e;if(e.params.virtualTranslate&&0!==t){let t,a=!1;t=i?s:s.filter(t=>{const s=t.classList.contains("swiper-slide-transform")?(t=>t.parentElement?t.parentElement instanceof HTMLElement?t.parentElement:void 0:e.slides.find(e=>e.shadowRoot&&e.shadowRoot===t.parentNode))(t):t;return!!s&&e.getSlideIndex(s)===r}),t.forEach(t=>{g(t,()=>{if(a)return;if(!e||e.destroyed)return;a=!0,e.animating=!1;const t=new CustomEvent("transitionend",{bubbles:!0,cancelable:!0});e.wrapperEl.dispatchEvent(t)})})}}function ye(e,t,s){const i=`swiper-slide-shadow${s?`-${s}`:""}${e?` swiper-slide-shadow-${e}`:""}`,r=o(t),a=`.${i.split(" ").join(".")}`,n=r.querySelector(a);if(n)return n;const l=p("div",i.split(" "));return r.append(l),l}const Ee=[({swiper:e,extendParams:t,on:s,emit:i})=>{let r,a;function n(){return e.params.virtual}t({virtual:{enabled:!1,slides:[],cache:!0,slidesPerViewAutoSlideSize:320,renderSlide:null,renderExternal:null,renderExternalUpdate:!0,addSlidesBefore:0,addSlidesAfter:0}}),e.virtual={cache:{},from:0,to:-1,slides:[],offset:0,slidesGrid:[]};function o(t,s){const i=n();if(i.cache&&e.virtual.cache[s])return e.virtual.cache[s];let r;if(i.renderSlide){const n=i.renderSlide.call(e,t,s);if("string"==typeof n){const e=a??=document.createElement("div");y(e,n),r=e.children[0]}else r=n}else r=e.isElement?p("swiper-slide"):p("div",e.params.slideClass);return r.setAttribute("data-swiper-slide-index",String(s)),i.renderSlide||y(r,t),i.cache&&(e.virtual.cache[s]=r),r}function c(t,s,r){const{slidesPerGroup:a,centeredSlides:l,slidesPerView:c,loop:p,initialSlide:u}=e.params;if(s&&!p&&(u??0)>0)return;const{addSlidesBefore:m,addSlidesAfter:h,slidesPerViewAutoSlideSize:f}=n(),{from:g,to:v,slides:w,slidesGrid:b,offset:y}=e.virtual;e.params.cssMode||e.updateActiveIndex();const E=void 0===r?e.activeIndex||0:r;let S,x;if(S=e.rtlTranslate?"right":e.isHorizontal()?"left":"top","auto"===c)if(f){let t=e.size;t||(t=e.isHorizontal()?e.el.getBoundingClientRect().width:e.el.getBoundingClientRect().height),x=Math.max(1,Math.ceil(t/f))}else x=1;else x=c??1;const T=a??1;let M,C;l?(M=Math.floor(x/2)+T+h,C=Math.floor(x/2)+T+m):(M=x+(T-1)+h,C=(p?x:T)+m);let P=E-C,L=E+M;p||(P=Math.max(P,0),L=Math.min(L,w.length-1));let A=(e.slidesGrid[P]||0)-(e.slidesGrid[0]||0);function I(){e.updateSlides(),e.updateProgress(),e.updateSlidesClasses(),i("virtualUpdate")}if(p&&E>=C?(P-=C,l||(A+=e.slidesGrid[0])):p&&E<C&&(P=-C,l&&(A+=e.slidesGrid[0])),Object.assign(e.virtual,{from:P,to:L,offset:A,slidesGrid:e.slidesGrid,slidesBefore:C,slidesAfter:M}),g===P&&v===L&&!t)return e.slidesGrid!==b&&A!==y&&e.slides.forEach(t=>{t.style.setProperty(S,A-Math.abs(e.cssOverflowAdjustment())+"px")}),e.updateProgress(),void i("virtualUpdate");const z=n();if(z.renderExternal){const t=[];for(let e=P;e<=L;e+=1)t.push(w[e]);return z.renderExternal.call(e,{offset:A,from:P,to:L,slides:t}),void(z.renderExternalUpdate?I():i("virtualUpdate"))}const $=[],k=[],O=e=>{let t=e;return e<0?t=w.length+e:t>=w.length&&(t-=w.length),t};if(t)e.slides.filter(t=>t.matches(`.${e.params.slideClass}, swiper-slide`)).forEach(e=>{e.remove()});else for(let t=g;t<=v;t+=1)if(t<P||t>L){const s=O(t);e.slides.filter(t=>t.matches(`.${e.params.slideClass}[data-swiper-slide-index="${s}"], swiper-slide[data-swiper-slide-index="${s}"]`)).forEach(e=>{e.remove()})}const D=p?-w.length:0,G=p?2*w.length:w.length;for(let e=D;e<G;e+=1)if(e>=P&&e<=L){const s=O(e);void 0===v||t?k.push(s):(e>v&&k.push(s),e<g&&$.push(s))}if(k.forEach(t=>{e.slidesEl.append(o(w[t],t))}),p)for(let t=$.length-1;t>=0;t-=1){const s=$[t];e.slidesEl.prepend(o(w[s],s))}else $.sort((e,t)=>
21828t-e),$.forEach(t=>{e.slidesEl.prepend(o(w[t],t))});d(e.slidesEl,".swiper-slide, swiper-slide").forEach(t=>{t.style.setProperty(S,A-Math.abs(e.cssOverflowAdjustment())+"px")}),I
vendor: 30,814 bytes, line 21828
21828()}s("beforeInit",()=>{if(!n().enabled)return;let t=!1;const s=e.passedParams.virtual;if(!s||"object"!=typeof s||void 0===s.slides){const s=[...e.slidesEl.children].filter(t=>t.matches(`.${e.params.slideClass}, swiper-slide`));s&&s.length&&(e.virtual.slides=[...s],t=!0,s.forEach((t,s)=>{t.setAttribute("data-swiper-slide-index",String(s)),e.virtual.cache[s]=t,t.remove()}))}t||(e.virtual.slides=n().slides),e.classNames.push(`${e.params.containerModifierClass}virtual`),e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0,c(!1,!0)}),s("setTranslate",()=>{n().enabled&&(e.params.cssMode&&!e._immediateVirtual?(clearTimeout(r),r=setTimeout(()=>{c()},100)):c())}),s("init update resize",()=>{n().enabled&&e.params.cssMode&&l(e.wrapperEl,"--swiper-virtual-size",`${e.virtualSize}px`)}),Object.assign(e.virtual,{appendSlide:function(t){if(null!==t&&"object"==typeof t&&"length"in t){const s=t;for(let t=0;t<s.length;t+=1)s[t]&&e.virtual.slides.push(s[t])}else e.virtual.slides.push(t);c(!0)},prependSlide:function(t){const s=e.activeIndex;let i=s+1,r=1;if(Array.isArray(t)){for(let s=0;s<t.length;s+=1)t[s]&&e.virtual.slides.unshift(t[s]);i=s+t.length,r=t.length}else e.virtual.slides.unshift(t);if(n().cache){const t=e.virtual.cache,s={};Object.keys(t).forEach(e=>{const i=t[Number(e)],a=i.getAttribute("data-swiper-slide-index");a&&i.setAttribute("data-swiper-slide-index",String(parseInt(a,10)+r)),s[parseInt(e,10)+r]=i}),e.virtual.cache=s}c(!0),e.slideTo(i,0)},removeSlide:function(t){if(null==t)return;let s=e.activeIndex;const i=t=>{Object.keys(e.virtual.cache).forEach(s=>{const i=Number(s);if(i>t){const t=e.virtual.cache[i];e.virtual.cache[i-1]=t,t.setAttribute("data-swiper-slide-index",String(i-1)),delete e.virtual.cache[i]}})};if(Array.isArray(t))for(let r=t.length-1;r>=0;r-=1)n().cache&&(delete e.virtual.cache[t[r]],i(t[r])),e.virtual.slides.splice(t[r],1),t[r]<s&&(s-=1),s=Math.max(s,0);else n().cache&&(delete e.virtual.cache[t],i(t)),e.virtual.slides.splice(t,1),t<s&&(s-=1),s=Math.max(s,0);c(!0),e.slideTo(s,0)},removeAllSlides:function(){e.virtual.slides=[],n().cache&&(e.virtual.cache={}),c(!0),e.slideTo(0,0)},update:c})},({swiper:e,extendParams:t,on:s,emit:i})=>{function r(){return e.params.keyboard}function a(t){if(!e.enabled)return;const{rtlTranslate:s}=e,a="originalEvent"in t&&t.originalEvent?t.originalEvent:t,n=a.keyCode||a.charCode,l=r(),o=!!l.pageUpDown,d=o&&33===n,c=o&&34===n,p=37===n,m=39===n,h=38===n,g=40===n;if(!e.allowSlideNext&&(e.isHorizontal()&&m||e.isVertical()&&g||c))return!1;if(!e.allowSlidePrev&&(e.isHorizontal()&&p||e.isVertical()&&h||d))return!1;if(a.shiftKey||a.altKey||a.ctrlKey||a.metaKey)return;const v=document.activeElement;if(v&&(v.isContentEditable||v.nodeName&&("input"===v.nodeName.toLowerCase()||"textarea"===v.nodeName.toLowerCase())))return;if(l.onlyInViewport&&(d||c||p||m||h||g)){let t=!1;if(f(e.el,`.${e.params.slideClass}, swiper-slide`).length>0&&0===f(e.el,`.${e.params.slideActiveClass}`).length)return;const i=e.el,r=i.clientWidth,a=i.clientHeight,n=window.innerWidth,l=window.innerHeight,o=u(i);s&&(o.left-=i.scrollLeft);const d=[[o.left,o.top],[o.left+r,o.top],[o.left,o.top+a],[o.left+r,o.top+a]];for(let e=0;e<d.length;e+=1){const s=d[e];if(s[0]>=0&&s[0]<=n&&s[1]>=0&&s[1]<=l){if(0===s[0]&&0===s[1])continue;t=!0}}if(!t)return}const w=l.speed;e.isHorizontal()?((d||c||p||m)&&a.cancelable&&a.preventDefault(),((c||m)&&!s||(d||p)&&s)&&e.slideNext(w),((d||p)&&!s||(c||m)&&s)&&e.slidePrev(w)):((d||c||h||g)&&a.cancelable&&a.preventDefault(),(c||g)&&e.slideNext(w),(d||h)&&e.slidePrev(w)),i("keyPress",n)}function n(){e.keyboard.enabled||(document.addEventListener("keydown",a),e.keyboard.enabled=!0)}function l(){e.keyboard.enabled&&(document.removeEventListener("keydown",a),e.keyboard.enabled=!1)}t({keyboard:{enabled:!1,onlyInViewport:!0,pageUpDown:!0,speed:void 0}}),e.keyboard={enabled:!1,enable:n,disable:l},s("init",()=>{r().enabled&&n()}),s("destroy",()=>{e.keyboard.enabled&&l()})},({swiper:e,extendParams:i,on:r,emit:a})=>{let n;i({mousewheel:{enabled:!1,releaseOnEdges:!1,invert:!1,forceToAxis:!1,sensitivity:1,eventsTarget:"container",thresholdDelta:null,thresholdTime:null,noMousewheelClass:"swiper-no-mousewheel"}});let l,o=s(),d=!1;const c=[];function p(){return e.params.mousewheel}function u(){e.enabled&&(d=!0)}function m(){e.enabled&&(d=!1)}function h(t){const i=p();return!(i.thresholdDelta&&t.delta<i.thresholdDelta)&&(!(i.thresholdTime&&s()-o<i.thresholdTime)&&(t.delta>=6&&s()-o<60||(t.direction<0?e.isEnd&&!e.params.loop||e.animating||(e.slideNext(),a("scroll",t.raw)):e.isBeginning&&!e.params.loop||e.animating||(e.slidePrev(),a("scroll",t.raw)),o=(new window.Date).getTime(),!1)))}function f(i){let r="originalEvent"in i&&i.originalEvent?i.originalEvent:i,o=!0;if(!e.enabled)return!1;const u=p();if(i.target.closest(`.${u.noMousewheelClass}`))return!1;e.params.cssMode&&r.preventDefault();let m=e.el;"container"!==u.eventsTarget&&(m=document.querySelector(u.eventsTarget));const f=m&&m.contains(r.target);if(!d&&!f&&!u.releaseOnEdges)return!0;let g=0;const v=e.rtlTranslate?-1:1,w=function(e){const t=e;let s=0,i=0,r=0,a=0;return void 0!==t.detail&&(i=t.detail),void 0!==t.wheelDelta&&(i=-t.wheelDelta/120),void 0!==t.wheelDeltaY&&(i=-t.wheelDeltaY/120),void 0!==t.wheelDeltaX&&(s=-t.wheelDeltaX/120),void 0!==t.axis&&void 0!==t.HORIZONTAL_AXIS&&t.axis===t.HORIZONTAL_AXIS&&(s=i,i=0),r=10*s,a=10*i,void 0!==t.deltaY&&(a=t.deltaY),void 0!==t.deltaX&&(r=t.deltaX),t.shiftKey&&!r&&(r=a,a=0),(r||a)&&t.deltaMode&&(1===t.deltaMode?(r*=40,a*=40):(r*=800,a*=800)),r&&!s&&(s=r<1?-1:1),a&&!i&&(i=a<1?-1:1),{spinX:s,spinY:i,pixelX:r,pixelY:a}}(r);if(u.forceToAxis)if(e.isHorizontal()){if(!(Math.abs(w.pixelX)>Math.abs(w.pixelY)))return!0;g=-w.pixelX*v}else{if(!(Math.abs(w.pixelY)>Math.abs(w.pixelX)))return!0;g=-w.pixelY}else g=Math.abs(w.pixelX)>Math.abs(w.pixelY)?-w.pixelX*v:-w.pixelY;if(0===g)return!0;u.invert&&(g=-g);let b=e.getTranslate()+g*(u.sensitivity??1);b>=e.minTranslate()&&(b=e.minTranslate()),b<=e.maxTranslate()&&(b=e.maxTranslate()),o=!!e.params.loop||!(b===e.minTranslate()||b===e.maxTranslate()),o&&e.params.nested&&r.stopPropagation();const y=e.params.freeMode;if(e.params.freeMode&&y?.enabled){const i={time:s(),delta:Math.abs(g),direction:Math.sign(g)},o=l&&i.time<l.time+500&&i.delta<=l.delta&&i.direction===l.direction;if(!o){l=void 0;let s=e.getTranslate()+g*(u.sensitivity??1);const d=e.isBeginning,p=e.isEnd;if(s>=e.minTranslate()&&(s=e.minTranslate()),s<=e.maxTranslate()&&(s=e.maxTranslate()),e.setTransition(0),e.setTranslate(s),e.updateProgress(),e.updateActiveIndex(),e.updateSlidesClasses(),(!d&&e.isBeginning||!p&&e.isEnd)&&e.updateSlidesClasses(),e.params.loop&&e.loopFix({direction:i.direction<0?"next":"prev",byMousewheel:!0}),y?.sticky){clearTimeout(n),n=void 0,c.length>=15&&c.shift();const s=c.length?c[c.length-1]:void 0,r=c[0];if(c.push(i),s&&(i.delta>s.delta||i.direction!==s.direction))c.splice(0);else if(c.length>=15&&r&&i.time-r.time<500&&r.delta-i.delta>=1&&i.delta<=6){const s=g>0?.8:.2;l=i,c.splice(0),n=t(()=>{!e.destroyed&&e.params&&e.slideToClosest(e.params.speed,!0,void 0,s)},0)}n||(n=t(()=>{if(e.destroyed||!e.params)return;l=i,c.splice(0),e.slideToClosest(e.params.speed,!0,void 0,.5)},500))}o||a("scroll",r);const m=e.params.autoplay;if(e.params.autoplay&&m?.disableOnInteraction&&e.autoplay.stop(),u.releaseOnEdges&&(s===e.minTranslate()||s===e.maxTranslate()))return!0}}else{const t={time:s(),delta:Math.abs(g),direction:Math.sign(g),raw:i};c.length>=2&&c.shift();const r=c.length?c[c.length-1]:void 0;if(c.push(t),r?(t.direction!==r.direction||t.delta>r.delta||t.time>r.time+150)&&h(t):h(t),function(t){const s=p();if(t.direction<0){if(e.isEnd&&!e.params.loop&&s.releaseOnEdges)return!0}else if(e.isBeginning&&!e.params.loop&&s.releaseOnEdges)return!0;return!1}(t))return!0}return r.cancelable&&r.preventDefault(),!1}function g(t){const s=p();let i=e.el;"container"!==s.eventsTarget&&(i=document.querySelector(s.eventsTarget)),i[t]("mouseenter",u),i[t]("mouseleave",m),i[t]("wheel",f)}function v(){return e.params.cssMode?(e.wrapperEl.removeEventListener("wheel",f),!0):!e.mousewheel.enabled&&(g("addEventListener"),e.mousewheel.enabled=!0,!0)}function w(){return e.params.cssMode?(e.wrapperEl.addEventListener("wheel",f),!0):!!e.mousewheel.enabled&&(g("removeEventListener"),e.mousewheel.enabled=!1,!0)}r("init",()=>{const t=p();!t.enabled&&e.params.cssMode&&w(),t.enabled&&v()}),e.mousewheel={enabled:!1,enable:v,disable:w},r("destroy",()=>{e.params.cssMode&&v(),e.mousewheel.enabled&&w()})},({swiper:e,extendParams:t,on:s,emit:i})=>{function r(){return e.params.navigation}function a(t){let s;return t&&"string"==typeof t&&e.isElement&&(s=e.el.querySelector(t)||e.hostEl.querySelector(t),s)?s:(t&&("string"==typeof t&&(s=[...document.querySelectorAll(t)]),e.params.uniqueNavElements&&"string"==typeof t&&s&&s.length>1&&1===e.el.querySelectorAll(t).length?s=e.el.querySelector(t):s&&1===s.length&&(s=s[0])),t&&!s?t:s)}function n(t,s){const i=r();w(t).forEach(t=>{t&&(t.classList[s?"add":"remove"](...i.disabledClass.split(" ")),"BUTTON"===t.tagName&&(t.disabled=s),e.params.watchOverflow&&e.enabled&&t.classList[e.isLocked?"add":"remove"](i.lockClass))})}function l(){const{nextEl:t,prevEl:s}=e.navigation;if(e.params.loop)return n(s,!1),void n(t,!1);n(s,e.isBeginning&&!e.params.rewind),n(t,e.isEnd&&!e.params.rewind)}function o(t){t.preventDefault(),(!e.isBeginning||e.params.loop||e.params.rewind)&&(e.slidePrev(),i("navigationPrev"))}function d(t){t.preventDefault(),(!e.isEnd||e.params.loop||e.params.rewind)&&(e.slideNext(),i("navigationNext"))}function c(){e.params.navigation=ae(e,e.originalParams.navigation,e.params.navigation,{nextEl:"swiper-button-next",prevEl:"swiper-button-prev"});const t=r();if(!t.nextEl&&!t.prevEl)return;const s=a(t.nextEl),i=a(t.prevEl);Object.assign(e.navigation,{nextEl:s,prevEl:i});const n=w(s),l=w(i),c=(s,i)=>{if(s){if(t.addIcons&&s.matches(".swiper-button-next,.swiper-button-prev")&&!s.querySelector("svg")){const e=document.createElement("div");y(e,ne);const t=e.querySelector("svg");t&&s.appendChild(t),e.remove()}s.addEventListener("click","next"===i?d:o)}!e.enabled&&s&&s.classList.add(...t.lockClass.split(" "))};n.forEach(e=>c(e,"next")),l.forEach(e=>c(e,"prev"))}function p(){const t=r(),{nextEl:s,prevEl:i}=e.navigation,a=w(s),n=w(i),l=(e,s)=>{e.removeEventListener("click","next"===s?d:o),e.classList.remove(...t.disabledClass.split(" "))};a.forEach(e=>l(e,"next")),n.forEach(e=>l(e,"prev"))}t({navigation:{nextEl:null,prevEl:null,addIcons:!0,hideOnClick:!1,disabledClass:"swiper-button-disabled",hiddenClass:"swiper-button-hidden",lockClass:"swiper-button-lock",navigationDisabledClass:"swiper-navigation-disabled"}}),e.navigation={nextEl:null,prevEl:null,arrowSvg:ne},s("init",()=>{!1===r().enabled?u():(c(),l())}),s("toEdge fromEdge lock unlock",()=>{l()}),s("destroy",()=>{p()}),s("enable disable",()=>{const t=r(),{nextEl:s,prevEl:i}=e.navigation,a=w(s),n=w(i);e.enabled?l():[...a,...n].filter(e=>!!e).forEach(e=>e.classList.add(t.lockClass))}),s("click",(t,s)=>{const a=r(),{nextEl:n,prevEl:l}=e.navigation,o=w(n),d=w(l),c=s.target;let p=d.includes(c)||o.includes(c);if(e.isElement&&!p){const e=s.composedPath?s.composedPath():[];e.length&&(p=e.find(e=>o.includes(e)||d.includes(e)))}if(a.hideOnClick&&!p){if(e.pagination&&e.params.pagination&&e.params.pagination.clickable&&(e.pagination.el===c||e.pagination.el.contains(c)))return;let t;o.length?t=o[0].classList.contains(a.hiddenClass):d.length&&(t=d[0].classList.contains(a.hiddenClass)),i(!0===t?"navigationShow":"navigationHide"),[...o,...d].filter(e=>!!e).forEach(e=>e.classList.toggle(a.hiddenClass))}});const u=()=>{const t=r();e.el.classList.add(...t.navigationDisabledClass.split(" ")),p()};Object.assign(e.navigation,{enable:()=>{const t=r();e.el.classList.remove(...t.navigationDisabledClass.split(" ")),c(),l()},disable:u,update:l,init:c,destroy:p})},({swiper:e,extendParams:t,on:s,emit:i})=>{const r="swiper-pagination";let a;t({pagination:{el:null,bulletElement:"span",clickable:!1,hideOnClick:!1,renderBullet:null,renderProgressbar:null,renderFraction:null,renderCustom:null,progressbarOpposite:!1,type:"bullets",dynamicBullets:!1,dynamicMainBullets:1,formatFractionCurrent:e=>e,formatFractionTotal:e=>e,bulletClass:`${r}-bullet`,bulletActiveClass:`${r}-bullet-active`,modifierClass:`${r}-`,currentClass:`${r}-current`,totalClass:`${r}-total`,hiddenClass:`${r}-hidden`,progressbarFillClass:`${r}-progressbar-fill`,progressbarOppositeClass:`${r}-progressbar-opposite`,clickableClass:`${r}-clickable`,lockClass:`${r}-lock`,horizontalClass:`${r}-horizontal`,verticalClass:`${r}-vertical`,paginationDisabledClass:`${r}-disabled`}}),e.pagination={el:null,bullets:[]};let n=0;function l(){return e.params.pagination}function o(){return!l().el||!e.pagination.el||Array.isArray(e.pagination.el)&&0===e.pagination.el.length}function d(e,t){const{bulletActiveClass:s}=l();if(!e)return;let i=e[("prev"===t?"previous":"next")+"ElementSibling"];i&&(i.classList.add(`${s}-${t}`),i=i[("prev"===t?"previous":"next")+"ElementSibling"],i&&i.classList.add(`${s}-${t}-${t}`))}function c(t){const s=t.target.closest(le(l().bulletClass));if(!s)return;t.preventDefault();const i=(h(s)??0)*(e.params.slidesPerGroup??1);if(e.params.loop){if(e.realIndex===i)return;const t=(r=e.realIndex,a=i,n=e.slides.length,(a%=n)===1+(r%=n)?"next":a===r-1?"previous":void 0);"next"===t?e.slideNext():"previous"===t?e.slidePrev():e.slideToLoop(i)}else e.slideTo(i);var r,a,n}function p(){const t=e.rtl,s=l();if(o())return;const r=w(e.pagination.el);let c,p;const u=oe(e),m=e.params.loop?Math.ceil(u/(e.params.slidesPerGroup??1)):e.snapGrid.length;if(e.params.loop?(p=e.previousRealIndex||0,c=(e.params.slidesPerGroup??1)>1?Math.floor(e.realIndex/(e.params.slidesPerGroup??1)):e.realIndex):void 0!==e.snapIndex?(c=e.snapIndex,p=e.previousSnapIndex):(p=e.previousIndex||0,c=e.activeIndex||0),"bullets"===s.type&&e.pagination.bullets&&e.pagination.bullets.length>0){const i=e.pagination.bullets;let l=0,o=0,u=0;if(s.dynamicBullets){a=v(i[0],e.isHorizontal()?"width":"height");const t=e.isHorizontal()?"width":"height";r.forEach(e=>{e.style[t]=(a??0)*(s.dynamicMainBullets+4)+"px"}),s.dynamicMainBullets>1&&void 0!==p&&(n+=c-(p||0),n>s.dynamicMainBullets-1?n=s.dynamicMainBullets-1:n<0&&(n=0)),l=Math.max(c-n,0),o=l+(Math.min(i.length,s.dynamicMainBullets)-1),u=(o+l)/2}if(i.forEach(e=>{const t=["","-next","-next-next","-prev","-prev-prev","-main"].map(e=>`${s.bulletActiveClass}${e}`).flatMap(e=>"string"==typeof e&&e.includes(" ")?e.split(" "):[e]);e.classList.remove(...t)}),r.length>1)i.forEach(t=>{const i=h(t);i===c?t.classList.add(...s.bulletActiveClass.split(" ")):e.isElement&&t.setAttribute("part","bullet"),s.dynamicBullets&&void 0!==i&&(i>=l&&i<=o&&t.classList.add(...`${s.bulletActiveClass}-main`.split(" ")),i===l&&d(t,"prev"),i===o&&d(t,"next"))});else{const t=i[c];if(t&&t.classList.add(...s.bulletActiveClass.split(" ")),e.isElement&&i.forEach((e,t)=>{e.setAttribute("part",t===c?"bullet-active":"bullet")}),s.dynamicBullets){const e=i[l],t=i[o];for(let e=l;e<=o;e+=1)i[e]&&i[e].classList.add(...`${s.bulletActiveClass}-main`.split(" "));d(e,"prev"),d(t,"next")}}if(s.dynamicBullets){const r=Math.min(i.length,s.dynamicMainBullets+4),n=((a??0)*r-(a??0))/2-u*(a??0),l=t?"right":"left",o=e.isHorizontal()?l:"top";i.forEach(e=>{e.style[o]=`${n}px`})}}r.forEach((t,r)=>{if("fraction"===s.type&&(t.querySelectorAll(le(s.currentClass)).forEach(e=>{e.textContent=String(s.formatFractionCurrent(c+1))}),t.querySelectorAll(le(s.totalClass)).forEach(e=>{e.textContent=String(s.formatFractionTotal(m))})),"progressbar"===s.type){let i;i=s.progressbarOpposite?e.isHorizontal()?"vertical":"horizontal":e.isHorizontal()?"horizontal":"vertical";const r=(c+1)/m;let a=1,n=1;"horizontal"===i?a=r:n=r,t.querySelectorAll(le(s.progressbarFillClass)).forEach(t=>{t.style.transform=`translate3d(0,0,0) scaleX(${a}) scaleY(${n})`,t.style.transitionDuration=`${e.params.speed}ms`})}"custom"===s.type&&s.renderCustom?(y(t,s.renderCustom(e,c+1,m)),0===r&&i("paginationRender",t)):(0===r&&i("paginationRender",t),i("paginationUpdate",t)),e.params.watchOverflow&&e.enabled&&t.classList[e.isLocked?"add":"remove"](s.lockClass)})}function u(){const t=l();if(o())return;const s=oe(e),r=w(e.pagination.el);let a="";if("bullets"===t.type){let i=e.params.loop?Math.ceil(s/(e.params.slidesPerGroup??1)):e.snapGrid.length;e.params.freeMode&&(e=>!!e.params.freeMode?.enabled)(e)&&i>s&&(i=s);for(let s=0;s<i;s+=1)t.renderBullet?a+=t.renderBullet.call(e,s,t.bulletClass):a+=`<${t.bulletElement} ${e.isElement?'part="bullet"':""} class="${t.bulletClass}"></${t.bulletElement}>`}"fraction"===t.type&&(a=t.renderFraction?t.renderFraction.call(e,t.currentClass,t.totalClass):`<span class="${t.currentClass}"></span> / <span class="${t.totalClass}"></span>`),"progressbar"===t.type&&(a=t.renderProgressbar?t.renderProgressbar.call(e,t.progressbarFillClass):`<span class="${t.progressbarFillClass}"></span>`),e.pagination.bullets=[],r.forEach(s=>{"custom"!==t.type&&y(s,a||""),"bullets"===t.type&&e.pagination.bullets.push(...Array.from(s.querySelectorAll(le(t.bulletClass))))}),"custom"!==t.type&&i("paginationRender",r[0])}function m(){e.params.pagination=ae(e,e.originalParams.pagination,e.params.pagination,{el:"swiper-pagination"});const t=l();if(!t.el)return;let s;if("string"==typeof t.el&&e.isElement&&(s=e.el.querySelector(t.el)),s||"string"!=typeof t.el||(s=[...document.querySelectorAll(t.el)]),s||(s=t.el),!s||Array.isArray(s)&&0===s.length)return;if(e.params.uniqueNavElements&&"string"==typeof t.el&&Array.isArray(s)&&s.length>1&&(s=[...e.el.querySelectorAll(t.el)],s.length>1)){const t=s.find(t=>f(t,".swiper")[0]===e.el);t&&(s=t)}Array.isArray(s)&&1===s.length&&(s=s[0]),Object.assign(e.pagination,{el:s});w(s).forEach(s=>{"bullets"===t.type&&t.clickable&&s.classList.add(...(t.clickableClass||"").split(" ")),s.classList.add(t.modifierClass+t.type),s.classList.add(e.isHorizontal()?t.horizontalClass:t.verticalClass),"bullets"===t.type&&t.dynamicBullets&&(s.classList.add(`${t.modifierClass}${t.type}-dynamic`),n=0,t.dynamicMainBullets<1&&(t.dynamicMainBullets=1)),"progressbar"===t.type&&t.progressbarOpposite&&s.classList.add(t.progressbarOppositeClass),t.clickable&&s.addEventListener("click",c),e.enabled||s.classList.add(t.lockClass)})}function g(){const t=l();if(o())return;const s=e.pagination.el;if(s){w(s).forEach(s=>{s.classList.remove(t.hiddenClass),s.classList.remove(t.modifierClass+t.type),s.classList.remove(e.isHorizontal()?t.horizontalClass:t.verticalClass),t.clickable&&(s.classList.remove(...(t.clickableClass||"").split(" ")),s.removeEventListener("click",c))})}e.pagination.bullets&&e.pagination.bullets.forEach(e=>e.classList.remove(...t.bulletActiveClass.split(" ")))}s("changeDirection",()=>{if(!e.pagination||!e.pagination.el)return;const t=l();w(e.pagination.el).forEach(s=>{s.classList.remove(t.horizontalClass,t.verticalClass),s.classList.add(e.isHorizontal()?t.horizontalClass:t.verticalClass)})}),s("init",()=>{!1===l().enabled?b():(m(),u(),p())}),s("activeIndexChange",()=>{void 0===e.snapIndex&&p()}),s("snapIndexChange",()=>{p()}),s("snapGridLengthChange",()=>{u(),p()}),s("destroy",()=>{g()}),s("enable disable",()=>{const{el:t}=e.pagination;if(t){const s=l();w(t).forEach(t=>t.classList[e.enabled?"remove":"add"](s.lockClass))}}),s("lock unlock",()=>{p()}),s("click",(t,s)=>{const r=s.target,a=w(e.pagination.el),n=l();if(n.el&&n.hideOnClick&&a&&a.length>0&&!r.classList.contains(n.bulletClass)){if(e.navigation&&(e.navigation.nextEl&&r===e.navigation.nextEl||e.navigation.prevEl&&r===e.navigation.prevEl))return;const t=a[0].classList.contains(n.hiddenClass);i(!0===t?"paginationShow":"paginationHide"),a.forEach(e=>e.classList.toggle(n.hiddenClass))}});const b=()=>{const t=l();e.el.classList.add(t.paginationDisabledClass);const{el:s}=e.pagination;if(s){w(s).forEach(e=>e.classList.add(t.paginationDisabledClass))}g()};Object.assign(e.pagination,{enable:()=>{const t=l();e.el.classList.remove(t.paginationDisabledClass);const{el:s}=e.pagination;if(s){w(s).forEach(e=>e.classList.remove(t.paginationDisabledClass))}m(),u(),p()},disable:b,render:u,update:p,init:m,destroy:g})},({swiper:s,extendParams:i,on:r,emit:a})=>{let n=!1,l=null,o=null,d=0,c=0,m=0,h=0;function f(){return s.params.scrollbar}function g(){const e=f();if(!e.el||!s.scrollbar.el)return;const{scrollbar:t,rtlTranslate:i}=s,{dragEl:r,el:a}=t,n=s.params.loop?s.progressLoop??0:s.progress;let o=c,d=(m-c)*n;i?(d=-d,d>0?(o=c-d,d=0):-d+c>m&&(o=m+d)):d<0?(o=c+d,d=0):d+c>m&&(o=m-d),s.isHorizontal()?(r.style.transform=`translate3d(${d}px, 0, 0)`,r.style.width=`${o}px`):(r.style.transform=`translate3d(0px, ${d}px, 0)`,r.style.height=`${o}px`),e.hide&&(l&&clearTimeout(l),a.style.opacity="1",l=setTimeout(()=>{a.style.opacity="0",a.style.transitionDuration="400ms"},1e3))}function v(){const e=f();if(!e.el||!s.scrollbar.el)return;const{scrollbar:t}=s,{dragEl:i,el:r}=t;i.style.width="",i.style.height="",m=s.isHorizontal()?r.offsetWidth:r.offsetHeight,h=s.size/(s.virtualSize+(s.params.slidesOffsetBefore??0)-(s.params.centeredSlides?s.snapGrid[0]:0)),c="auto"===e.dragSize?m*h:parseInt(String(e.dragSize),10),s.isHorizontal()?i.style.width=`${c}px`:i.style.height=`${c}px`,r.style.display=h>=1?"none":"",e.hide&&(r.style.opacity="0"),s.params.watchOverflow&&s.enabled&&t.el.classList[s.isLocked?"add":"remove"](e.lockClass)}function b(e){return s.isHorizontal()?e.clientX??e.touches?.[0]?.clientX??0:e.clientY??e.touches?.[0]?.clientY??0}function y(e){const{scrollbar:t,rtlTranslate:i}=s,{el:r}=t;let a;a=(b(e)-u(r)[s.isHorizontal()?"left":"top"]-(null!==d?d:c/2))/(m-c),a=Math.max(Math.min(a,1),0),i&&(a=1-a);const n=s.minTranslate()+(s.maxTranslate()-s.minTranslate())*a;s.updateProgress(n),s.setTranslate(n),s.updateActiveIndex(),s.updateSlidesClasses()}function E(e){const t=f(),{scrollbar:i,wrapperEl:r}=s,{el:l,dragEl:c}=i;n=!0,d=e.target===c?b(e)-e.target.getBoundingClientRect()[s.isHorizontal()?"left":"top"]:null,e.preventDefault(),e.stopPropagation(),r.style.transitionDuration="100ms",c.style.transitionDuration="100ms",y(e),o&&clearTimeout(o),l.style.transitionDuration="0ms",t.hide&&(l.style.opacity="1"),s.params.cssMode&&(s.wrapperEl.style.scrollSnapType="none"),a("scrollbarDragStart",e)}function S(e){const{scrollbar:t,wrapperEl:i}=s,{el:r,dragEl:l}=t;n&&(e.cancelable&&e.preventDefault(),y(e),i.style.transitionDuration="0ms",r.style.transitionDuration="0ms",l.style.transitionDuration="0ms",a("scrollbarDragMove",e))}function x(e){const i=f(),{scrollbar:r,wrapperEl:l}=s,{el:d}=r;n&&(n=!1,s.params.cssMode&&(s.wrapperEl.style.scrollSnapType="",l.style.transitionDuration=""),i.hide&&(o&&clearTimeout(o),o=t(()=>{d.style.opacity="0",d.style.transitionDuration="400ms"},1e3)),a("scrollbarDragEnd",e),i.snapOnRelease&&s.slideToClosest())}function T(e){const{scrollbar:t,params:i}=s,r=t.el;if(!r)return;const a=!!i.passiveListeners&&{passive:!1,capture:!1},n=!!i.passiveListeners&&{passive:!0,capture:!1},l="on"===e?"addEventListener":"removeEventListener";r[l]("pointerdown",E,a),document[l]("pointermove",S,a),document[l]("pointerup",x,n)}function M(){const{scrollbar:t,el:i}=s;s.params.scrollbar=ae(s,s.originalParams.scrollbar,s.params.scrollbar,{el:"swiper-scrollbar"});const r=f();if(!r.el)return;let a;if("string"==typeof r.el&&s.isElement&&(a=s.el.querySelector(r.el)),a||"string"!=typeof r.el)a||(a=r.el);else if(a=document.querySelectorAll(r.el),!a.length)return;s.params.uniqueNavElements&&"string"==typeof r.el&&a.length>1&&1===i.querySelectorAll(r.el).length&&(a=i.querySelector(r.el)),a.length>0&&(a=a[0]);const n=a;n.classList.add(s.isHorizontal()?r.horizontalClass:r.verticalClass);let l=null;n&&(l=n.querySelector(le(r.dragClass)),l||(l=p("div",r.dragClass),n.append(l))),Object.assign(t,{el:n,dragEl:l}),r.draggable&&f().el&&s.scrollbar.el&&T("on"),n&&n.classList[s.enabled?"remove":"add"](...e(r.lockClass))}function C(){const t=f(),i=s.scrollbar.el;i&&i.classList.remove(...e(s.isHorizontal()?t.horizontalClass:t.verticalClass)),f().el&&s.scrollbar.el&&T("off")}i({scrollbar:{el:null,dragSize:"auto",hide:!1,draggable:!1,snapOnRelease:!0,lockClass:"swiper-scrollbar-lock",dragClass:"swiper-scrollbar-drag",scrollbarDisabledClass:"swiper-scrollbar-disabled",horizontalClass:"swiper-scrollbar-horizontal",verticalClass:"swiper-scrollbar-vertical"}}),s.scrollbar={el:null,dragEl:null},r("changeDirection",()=>{if(!s.scrollbar||!s.scrollbar.el)return;const e=f();w(s.scrollbar.el).forEach(t=>{t.classList.remove(e.horizontalClass,e.verticalClass),t.classList.add(s.isHorizontal()?e.horizontalClass:e.verticalClass)})}),r("init",()=>{!1===f().enabled?P():(M(),v(),g())}),r("update resize observerUpdate lock unlock changeDirection",()=>{v()}),r("setTranslate",()=>{g()}),r("setTransition",(e,t)=>{!function(e){f().el&&s.scrollbar.el&&(s.scrollbar.dragEl.style.transitionDuration=`${e}ms`)}(t)}),r("enable disable",()=>{const{el:t}=s.scrollbar;t&&t.classList[s.enabled?"remove":"add"](...e(f().lockClass))}),r("destroy",()=>{C()});const P=()=>{const t=f();s.el.classList.add(...e(t.scrollbarDisabledClass)),s.scrollbar.el&&s.scrollbar.el.classList.add(...e(t.scrollbarDisabledClass)),C()};Object.assign(s.scrollbar,{enable:()=>{const t=f();s.el.classList.remove(...e(t.scrollbarDisabledClass)),s.scrollbar.el&&s.scrollbar.el.classList.remove(...e(t.scrollbarDisabledClass)),M(),v(),g()},disable:P,updateSize:v,setTranslate:g,init:M,destroy:C})},({swiper:e,extendParams:t,on:s})=>{function i(){return e.params.parallax}t({parallax:{enabled:!1}});const r="[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]",a=(t,s)=>{const{rtl:i}=e,r=i?-1:1,a=t.getAttribute("data-swiper-parallax")||"0";let n=t.getAttribute("data-swiper-parallax-x"),l=t.getAttribute("data-swiper-parallax-y");const o=t.getAttribute("data-swiper-parallax-scale"),d=t.getAttribute("data-swiper-parallax-opacity"),c=t.getAttribute("data-swiper-parallax-rotate");if(n||l?(n=n||"0",l=l||"0"):e.isHorizontal()?(n=a,l="0"):(l=a,n="0"),n=n.indexOf("%")>=0?parseInt(n,10)*s*r+"%":Number(n)*s*r+"px",l=l.indexOf("%")>=0?parseInt(l,10)*s+"%":Number(l)*s+"px",null!=d){const e=Number(d),i=e-(e-1)*(1-Math.abs(s));t.style.opacity=String(i)}let p=`translate3d(${n}, ${l}, 0px)`;if(null!=o){const e=Number(o);p+=` scale(${e-(e-1)*(1-Math.abs(s))})`}if(c&&null!=c){p+=` rotate(${Number(c)*s*-1}deg)`}t.style.transform=p},n=()=>{const{el:t,slides:s,progress:i,snapGrid:n}=e,l=d(t,r);e.isElement&&l.push(...d(e.hostEl,r)),l.forEach(e=>{a(e,i)}),s.forEach((t,s)=>{let l=t.progress??0;(e.params.slidesPerGroup??1)>1&&"auto"!==e.params.slidesPerView&&(l+=Math.ceil(s/2)-i*(n.length-1)),l=Math.min(Math.max(l,-1),1),t.querySelectorAll(`${r}, [data-swiper-parallax-rotate]`).forEach(e=>{a(e,l)})})};s("beforeInit",()=>{i().enabled&&(e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0)}),s("init",()=>{i().enabled&&n()}),s("setTranslate",()=>{i().enabled&&n()}),s("setTransition",(t,s)=>{i().enabled&&((t=e.params.speed??300)=>{const{el:s,hostEl:i}=e,a=[...s.querySelectorAll(r)];e.isElement&&a.push(...i.querySelectorAll(r)),a.forEach(e=>{const s=e.getAttribute("data-swiper-parallax-duration");let i=(s?parseInt(s,10):0)||t;0===t&&(i=0),e.style.transitionDuration=`${i}ms`})})(s)})},({swiper:e,extendParams:t,on:s,emit:r})=>{function a(){return e.params.zoom}t({zoom:{enabled:!1,limitToOriginalSize:!1,maxRatio:3,minRatio:1,panOnMouseMove:!1,toggle:!0,containerClass:"swiper-zoom-container",zoomedSlideClass:"swiper-slide-zoomed"}}),e.zoom={enabled:!1};let n=1,l=!1,o=!1,c={x:0,y:0};let p=!1,m=!1;const h=[],g={originX:0,originY:0,slideEl:void 0,slideWidth:void 0,slideHeight:void 0,imageEl:void 0,imageWrapEl:void 0,maxRatio:3},v={isTouched:void 0,isMoved:void 0,currentX:void 0,currentY:void 0,minX:void 0,minY:void 0,maxX:void 0,maxY:void 0,width:void 0,height:void 0,startX:void 0,startY:void 0,touchesStart:{},touchesCurrent:{}},w={x:void 0,y:void 0,prevPositionX:void 0,prevPositionY:void 0,prevTime:void 0};let b,y=1;function E(){if(h.length<2)return 1;const e=h[0].pageX,t=h[0].pageY,s=h[1].pageX,i=h[1].pageY;return Math.sqrt((s-e)**2+(i-t)**2)}function S(){const e=a(),t=g.imageWrapEl?.getAttribute("data-swiper-zoom"),s=null!=t?Number(t):e.maxRatio,i=g.imageEl;if(e.limitToOriginalSize&&i&&i.naturalWidth){const e=i.naturalWidth/i.offsetWidth;return Math.min(e,s)}return s}function x(t){const s=e.isElement?"swiper-slide":`.${e.params.slideClass}`,i=t.target;return!!i&&(!!i.matches(s)||e.slides.filter(e=>e.contains(i)).length>0)}function T(t){const s=`.${a().containerClass}`,i=t.target;return!!i&&(!!i.matches(s)||[...e.hostEl.querySelectorAll(s)].filter(e=>e.contains(i)).length>0)}function M(t){if("mouse"===t.pointerType&&h.splice(0,h.length),!x(t))return;const s=a();if(p=!1,m=!1,h.push(t),!(h.length<2)){if(p=!0,g.scaleStart=E(),!g.slideEl){const i=t.target;g.slideEl=i?.closest(`.${e.params.slideClass}, swiper-slide`)??void 0,g.slideEl||(g.slideEl=e.slides[e.activeIndex]);let r=g.slideEl?.querySelector(`.${s.containerClass}`)??null;if(r&&(r=r.querySelectorAll("picture, img, svg, canvas, .swiper-zoom-target")[0]??null),g.imageEl=r??void 0,g.imageWrapEl=r?f(r,`.${s.containerClass}`)[0]??void 0:void 0,!g.imageWrapEl)return void(g.imageEl=void 0);g.maxRatio=S()}if(g.imageEl){const[e,t]=function(){if(h.length<2||!g.imageEl)return[null,null];const e=g.imageEl.getBoundingClientRect();return[(h[0].pageX+(h[1].pageX-h[0].pageX)/2-e.x-window.scrollX)/n,(h[0].pageY+(h[1].pageY-h[0].pageY)/2-e.y-window.scrollY)/n]}();g.originX=e??0,g.originY=t??0,g.imageEl.style.transitionDuration="0ms"}l=!0}}function C(t){if(!x(t))return;const s=a(),i=e.zoom,r=h.findIndex(e=>e.pointerId===t.pointerId);r>=0&&(h[r]=t),h.length<2||(m=!0,g.scaleMove=E(),g.imageEl&&(i.scale=g.scaleMove/(g.scaleStart??1)*n,i.scale>g.maxRatio&&(i.scale=g.maxRatio-1+(i.scale-g.maxRatio+1)**.5),i.scale<s.minRatio&&(i.scale=s.minRatio+1-(s.minRatio-i.scale+1)**.5),g.imageEl.style.transform=`translate3d(0,0,0) scale(${i.scale})`))}function P(t){if(!x(t))return;if("mouse"===t.pointerType&&"pointerout"===t.type)return;const s=a(),i=e.zoom,r=h.findIndex(e=>e.pointerId===t.pointerId);r>=0&&h.splice(r,1),p&&m&&(p=!1,m=!1,g.imageEl&&(i.scale=Math.max(Math.min(i.scale,g.maxRatio),s.minRatio),g.imageEl.style.transitionDuration=`${e.params.speed}ms`,g.imageEl.style.transform=`translate3d(0,0,0) scale(${i.scale})`,n=i.scale,l=!1,i.scale>1&&g.slideEl?g.slideEl.classList.add(`${s.zoomedSlideClass}`):i.scale<=1&&g.slideEl&&g.slideEl.classList.remove(`${s.zoomedSlideClass}`),1===i.scale&&(g.originX=0,g.originY=0,g.slideEl=void 0)))}function L(){e.touchEventsData.preventTouchMoveFromPointerMove=!1}function 
21828A(t){const s="mouse"===t.pointerType&&a().panOnMouseMove;if(!x(t)||!T(t))return;const r=e.zoom;if(!g.imageEl)return;if(!v.isTouched||!g.slideEl)return void(s&&z(t));if(s)return void z(t);v.isMoved||(v.width=g.imageEl.offsetWidth||g.imageEl.clientWidth,v.height=g.imageEl.offsetHeight||g.imageEl.clientHeight,v.startX=i(g.imageWrapEl,"x")||0,v.startY=i(g.imageWrapEl,"y")||0,g.slideWidth=g.slideEl.offsetWidth,g.slideHeight=g.slideEl.offsetHeight,g.imageWrapEl.style.transitionDuration="0ms");const o=v.width*r.scale,d=v.height*r.scale;v.minX=Math.min(g.slideWidth/2-o/2,0),v.maxX=-v.minX,v.minY=Math.min(g.slideHeight/2-d/2,0),v.maxY=-v.minY,v.touchesCurrent.x=h.length>0?h[0].pageX:t.pageX,v.touchesCurrent.y=h.length>0?h[0].pageY:t.pageY;Math.max(Math.abs(v.touchesCurrent.x-(v.touchesStart.x??0)),Math.abs(v.touchesCurrent.y-(v.touchesStart.y??0)))>5&&(e.allowClick=!1);const c=v.startX??0,p=v.startY??0;if(!v.isMoved&&!l){if(e.isHorizontal()&&(Math.floor(v.minX)===Math.floor(c)&&v.touchesCurrent.x<(v.touchesStart.x??0)||Math.floor(v.maxX)===Math.floor(c)&&v.touchesCurrent.x>(v.touchesStart.x??0)))return v.isTouched=!1,void L();if(!e.isHorizontal()&&(Math.floor(v.minY)===Math.floor(p)&&v.touchesCurrent.y<(v.touchesStart.y??0)||Math.floor(v.maxY)===Math.floor(p)&&v.touchesCurrent.y>(v.touchesStart.y??0)))return v.isTouched=!1,void L()}t.cancelable&&t.preventDefault(),t.stopPropagation(),void 0!==b&&clearTimeout(b),e.touchEventsData.preventTouchMoveFromPointerMove=!0,b=setTimeout(()=>{e.destroyed||L()}),v.isMoved=!0;const u=(r.scale-n)/(g.maxRatio-a().minRatio),{originX:m,originY:f}=g;v.currentX=v.touchesCurrent.x-(v.touchesStart.x??0)+c+u*(v.width-2*m),v.currentY=v.touchesCurrent.y-(v.touchesStart.y??0)+p+u*(v.height-2*f),v.currentX<v.minX&&(v.currentX=v.minX+1-(v.minX-v.currentX+1)**.8),v.currentX>v.maxX&&(v.currentX=v.maxX-1+(v.currentX-v.maxX+1)**.8),v.currentY<v.minY&&(v.currentY=v.minY+1-(v.minY-v.currentY+1)**.8),v.currentY>v.maxY&&(v.currentY=v.maxY-1+(v.currentY-v.maxY+1)**.8),w.prevPositionX||(w.prevPositionX=v.touchesCurrent.x),w.prevPositionY||(w.prevPositionY=v.touchesCurrent.y),w.prevTime||(w.prevTime=Date.now()),w.x=(v.touchesCurrent.x-w.prevPositionX)/(Date.now()-w.prevTime)/2,w.y=(v.touchesCurrent.y-w.prevPositionY)/(Date.now()-w.prevTime)/2,Math.abs(v.touchesCurrent.x-w.prevPositionX)<2&&(w.x=0),Math.abs(v.touchesCurrent.y-w.prevPositionY)<2&&(w.y=0),w.prevPositionX=v.touchesCurrent.x,w.prevPositionY=v.touchesCurrent.y,w.prevTime=Date.now(),g.imageWrapEl.style.transform=`translate3d(${v.currentX}px, ${v.currentY}px,0)`}function I(){const t=e.zoom;g.slideEl&&e.activeIndex!==e.slides.indexOf(g.slideEl)&&(g.imageEl&&(g.imageEl.style.transform="translate3d(0,0,0) scale(1)"),g.imageWrapEl&&(g.imageWrapEl.style.transform="translate3d(0,0,0)"),g.slideEl.classList.remove(`${a().zoomedSlideClass}`),t.scale=1,n=1,g.slideEl=void 0,g.imageEl=void 0,g.imageWrapEl=void 0,g.originX=0,g.originY=0)}function z(e){if(n<=1||!g.imageWrapEl)return;if(!x(e)||!T(e))return;const t=window.getComputedStyle(g.imageWrapEl).transform,s=new window.DOMMatrix(t);if(!o)return o=!0,c.x=e.clientX,c.y=e.clientY,v.startX=s.e,v.startY=s.f,v.width=g.imageEl.offsetWidth||g.imageEl.clientWidth,v.height=g.imageEl.offsetHeight||g.imageEl.clientHeight,g.slideWidth=g.slideEl.offsetWidth,void(g.slideHeight=g.slideEl.offsetHeight);const i=-3*(e.clientX-c.x),r=-3*(e.clientY-c.y),a=v.width*n,l=v.height*n,d=g.slideWidth,p=g.slideHeight,u=Math.min(d/2-a/2,0),m=-u,h=Math.min(p/2-l/2,0),f=-h,w=Math.max(Math.min(v.startX+i,m),u),b=Math.max(Math.min(v.startY+r,f),h);g.imageWrapEl.style.transitionDuration="0ms",g.imageWrapEl.style.transform=`translate3d(${w}px, ${b}px, 0)`,c.x=e.clientX,c.y=e.clientY,v.startX=w,v.startY=b,v.currentX=w,v.currentY=b}function $(t){const s=e.zoom,i=a();if(!g.slideEl){if(t&&"number"!=typeof t&&"target"in t&&t.target&&(g.slideEl=t.target.closest(`.${e.params.slideClass}, swiper-slide`)??void 0),!g.slideEl){const t=e.params.virtual;t&&t.enabled&&e.virtual?g.slideEl=d(e.slidesEl,`.${e.params.slideActiveClass}`)[0]??void 0:g.slideEl=e.slides[e.activeIndex]}let s=g.slideEl?.querySelector(`.${i.containerClass}`)??null;s&&(s=s.querySelectorAll("picture, img, svg, canvas, .swiper-zoom-target")[0]??null),g.imageEl=s??void 0,g.imageWrapEl=s?f(s,`.${i.containerClass}`)[0]??void 0:void 0}if(!g.imageEl||!g.imageWrapEl||!g.slideEl)return;let r,l,o,c,p,m,h,w,b,y,E,x,T,M,C,P,L,A;g.maxRatio=S(),e.params.cssMode&&(e.wrapperEl.style.overflow="hidden",e.wrapperEl.style.touchAction="none"),g.slideEl.classList.add(`${i.zoomedSlideClass}`);const I=t&&"number"!=typeof t;void 0===v.touchesStart.x&&I?(r=t.pageX,l=t.pageY):(r=v.touchesStart.x,l=v.touchesStart.y);const z=n,$="number"==typeof t?t:null;1===n&&$&&(r=void 0,l=void 0,v.touchesStart.x=void 0,v.touchesStart.y=void 0);const k=S();s.scale=$||k,n=$||k,!t||1===n&&$?(h=0,w=0):(L=g.slideEl.offsetWidth,A=g.slideEl.offsetHeight,o=u(g.slideEl).left+window.scrollX,c=u(g.slideEl).top+window.scrollY,p=o+L/2-(r??0),m=c+A/2-(l??0),b=g.imageEl.offsetWidth||g.imageEl.clientWidth,y=g.imageEl.offsetHeight||g.imageEl.clientHeight,E=b*s.scale,x=y*s.scale,T=Math.min(L/2-E/2,0),M=Math.min(A/2-x/2,0),C=-T,P=-M,z>0&&$&&"number"==typeof v.currentX&&"number"==typeof v.currentY?(h=v.currentX*s.scale/z,w=v.currentY*s.scale/z):(h=p*s.scale,w=m*s.scale),h<T&&(h=T),h>C&&(h=C),w<M&&(w=M),w>P&&(w=P)),$&&1===s.scale&&(g.originX=0,g.originY=0),v.currentX=h,v.currentY=w,g.imageWrapEl.style.transitionDuration="300ms",g.imageWrapEl.style.transform=`translate3d(${h}px, ${w}px,0)`,g.imageEl.style.transitionDuration="300ms",g.imageEl.style.transform=`translate3d(0,
218280,0) scale(${s.scale})`}function k(){const t=e.zoom,s=a();if(!g.slideEl){const t=e.params.virtual;t&&t.enabled&&e.virtual?g.slideEl=d(e.slidesEl,`.${e.params.slideActiveClass}`)[0]??void 0:g.slideEl=e.slides[e.activeIndex];let i=g.slideEl?.querySelector(`.${s.containerClass}`)??null;i&&(i=i.querySelectorAll("picture, img, svg, canvas, .swiper-zoom-target")[0]??null),g.imageEl=i??void 0,g.imageWrapEl=i?f(i,`.${s.containerClass}`)[0]??void 0:void 0}g.imageEl&&g.imageWrapEl&&g.slideEl&&(g.maxRatio=S(),e.params.cssMode&&(e.wrapperEl.style.overflow="",e.wrapperEl.style.touchAction=""),t.scale=1,n=1,v.currentX=void 0,v.currentY=void 0,v.touchesStart.x=void 0,v.touchesStart.y=void 0,g.imageWrapEl.style.transitionDuration="300ms",g.imageWrapEl.style.transform="translate3d(0,0,0)",g.imageEl.style.transitionDuration="300ms",g.imageEl.style.transform="translate3d(0,0,0) scale(1)",g.slideEl.classList.remove(`${s.zoomedSlideClass}`),g.slideEl=void 0,g.originX=0,g.originY=0,s.panOnMouseMove&&(c={x:0,y:0},o&&(o=!1,v.startX=0,v.startY=0)))}function O(t){const s=e.zoom;s.scale&&1!==s.scale?k():$(t)}function D(){return{passiveListener:!!e.params.passiveListeners&&{passive:!0,capture:!1},activeListenerWithCapture:!e.params.passiveListeners||{passive:!1,capture:!0}}}function G(){const t=e.zoom;if(t.enabled)return;t.enabled=!0;const{passiveListener:s,activeListenerWithCapture:i}=D();e.wrapperEl.addEventListener("pointerdown",M,s),e.wrapperEl.addEventListener("pointermove",C,i),["pointerup","pointercancel","pointerout"].forEach(t=>{e.wrapperEl.addEventListener(t,P,s)}),e.wrapperEl.addEventListener("pointermove",A,i)}function X(){const t=e.zoom;if(!t.enabled)return;t.enabled=!1;const{passiveListener:s,activeListenerWithCapture:i}=D();e.wrapperEl.removeEventListener("pointerdown",M,s),e.wrapperEl.removeEventListener("pointermove",C,i),["pointerup","pointercancel","pointerout"].forEach(t=>{e.wrapperEl.removeEventListener(t,P,s)}),e.wrapperEl.removeEventListener("pointermove",A,i)}Object.defineProperty(e.zoom,"scale",{get:()=>y,set(e){if(y!==e){const t=g.imageEl,s=g.slideEl;r("zoomChange",e,t,s)}y=e}}),s("init",()=>{a().enabled&&G()}),s("destroy",()=>{X()}),s("touchStart",(t,s)=>{e.zoom.enabled&&function(t){const s=e.device;if(v.isTouched)return;const i=h.length>0?h[0]:t;v.touchesStart.x=i.pageX,v.touchesStart.y=i.pageY,g.imageEl&&(s.android&&t.cancelable&&t.preventDefault(),v.isTouched=!0)}(s)}),s("touchEnd",()=>{e.zoom.enabled&&function(){const t=e.zoom;if(h.length=0,!g.imageEl)return;if(!v.isTouched||!v.isMoved)return v.isTouched=!1,void(v.isMoved=!1);v.isTouched=!1,v.isMoved=!1;let s=300,i=300;const r=w.x??0,a=w.y??0,n=r*s,l=v.currentX+n,o=a*i,d=v.currentY+o;0!==r&&(s=Math.abs((l-v.currentX)/r)),0!==a&&(i=Math.abs((d-v.currentY)/a));const c=Math.max(s,i);v.currentX=l,v.currentY=d;const p=v.width*t.scale,u=v.height*t.scale;v.minX=Math.min(g.slideWidth/2-p/2,0),v.maxX=-v.minX,v.minY=Math.min(g.slideHeight/2-u/2,0),v.maxY=-v.minY,v.currentX=Math.max(Math.min(v.currentX,v.maxX),v.minX),v.currentY=Math.max(Math.min(v.currentY,v.maxY),v.minY),g.imageWrapEl.style.transitionDuration=`${c}ms`,g.imageWrapEl.style.transform=`translate3d(${v.currentX}px, ${v.currentY}px,0)`}()}),s("doubleTap",(t,s)=>{!e.animating&&a().enabled&&e.zoom.enabled&&a().toggle&&O(s)}),s("transitionEnd",()=>{e.zoom.enabled&&a().enabled&&I()}),s("slideChange",()=>{e.zoom.enabled&&a().enabled&&e.params.cssMode&&I()}),Object.assign(e.zoom,{enable:G,disable:X,in:$,out:k,toggle:O})},({swiper:e,extendParams:s,on:i})=>{function r(){return e.params.controller}function a(){e.controller.control&&e.controller.spline&&(e.controller.spline=void 0,delete e.controller.spline)}s({controller:{control:void 0,inverse:!1,by:"slide"}}),e.controller={control:void 0},i("beforeInit",()=>{const t=r().control;if("undefined"!=typeof window&&("string"==typeof t||t instanceof HTMLElement)){return void("string"==typeof t?[...document.querySelectorAll(t)]:[t]).forEach(t=>{e.controller.control||(e.controller.control=[]);const s=e.controller.control;if(t&&t.swiper)s.push(t.swiper);else if(t){const i=`${e.params.eventsPrefix}init`,r=a=>{const n=a.detail;
21828n&&n[0]&&s.push(n[0]),e.update(),t.removeEventListener(i,r)};t.addEventListener(i,r)}})}e.controller.control=t}),i("update",()=>{a()}),i("resize",()=>{a()}),i("observerUpdate",()=>{a()}),i("setTranslate",(t,s,i)=>{e.controller.control&&(!Array.isArray(e.controller.control)&&e.controller.control.destroyed||e.controller.setTranslate(s,i))}),i("setTransition",(t,s,i)=>{e.controller.control&&(!Array.isArray(e.controller.control)&&e.controller.control.destroyed||e.controller.setTransition(s,i))}),Object.assign(e.controller,{setTranslate:function(t,s){const i=e.controller.control;let a,n;const l=e.constructor;function o(t){if(t.destroyed)return;const s=e.rtlTranslate?-e.translate:e.translate,i=r();"slide"===i.by?(!function(t){e.controller.spline=e.params.loop?new de(e.slidesGrid,t.slidesGrid):new de(e.snapGrid,t.snapGrid)}(t),n=-e.controller.spline.interpolate(-s)):n=0,n&&"container"!==i.by||(a=(t.maxTranslate()-t.minTranslate())/(e.maxTranslate()-e.minTranslate()),!Number.isNaN(a)&&Number.isFinite(a)||(a=1),n=(s-e.minTranslate())*a+t.minTranslate()),i.inverse&&(n=t.maxTranslate()-n),t.updateProgress(n),t.setTranslate(n,e),t.updateActiveIndex(),t.updateSlidesClasses()}if(Array.isArray(i))for(let e=0;e<i.length;e+=1){const t=i[e];t&&t!==s&&t instanceof l&&o(t)}else i instanceof l&&s!==i&&o(i)},setTransition:function(s,i){const r=e.constructor,a=e.controller.control;function n(i){i.destroyed||(i.setTransition(s,e),0!==s&&(i.transitionStart(),i.params.autoHeight&&t(()=>{i.updateAutoHeight()}),g(i.wrapperEl,()=>{a&&i.transitionEnd()})))}if(Array.isArray(a))for(let e=0;e<a.length;e+=1){const t=a[e];t&&t!==i&&t instanceof r&&n(t)}else a instanceof r&&i!==a&&n(a)}})},({swiper:e,extendParams:t,on:s})=>{t({a11y:{enabled:!0,notificationClass:"swiper-notification",prevSlideMessage:"Previous slide",nextSlideMessage:"Next slide",firstSlideMessage:"This is the first slide",lastSlideMessage:"This is the last slide",paginationBulletMessage:"Go to slide {{index}}",slideLabelMessage:"{{index}} / {{slidesLength}}",containerMessage:null,containerRoleDescriptionMessage:null,containerRole:null,itemRoleDescriptionMessage:null,slideRole:"group",id:null,scrollOnFocus:!0,wrapperLiveRegion:!0}}),e.a11y={clicked:!1};let i,r=null,a=!1,n=(new Date).getTime();function l(){return e.params.a11y}function o(e){r&&e&&y(r,e)}function d(e){w(e).forEach(e=>{e.setAttribute("tabIndex","0")})}function c(e){w(e).forEach(e=>{e.setAttribute("tabIndex","-1")})}function u(e,t){w(e).forEach(e=>{e.setAttribute("role",t)})}function m(e,t){w(e).forEach(e=>{e.setAttribute("aria-roledescription",t)})}function f(e,t){w(e).forEach(e=>{e.setAttribute("aria-label",t)})}function g(e){w(e).forEach(e=>{e.setAttribute("aria-disabled","true")})}function v(e){w(e).forEach(e=>{e.removeAttribute("aria-disabled")})}function b(t){if(13!==t.keyCode&&32!==t.keyCode)return;const s=l(),i=e.params.pagination,r=t.target;if(!e.pagination||!e.pagination.el||r!==e.pagination.el&&!e.pagination.el.contains(r)||r.matches(le(i?.bulletClass))){if(e.navigation&&e.navigation.prevEl&&e.navigation.nextEl){const t=w(e.navigation.prevEl);w(e.navigation.nextEl).includes(r)&&(e.isEnd&&!e.params.loop||e.slideNext(),e.isEnd?o(s.lastSlideMessage):o(s.nextSlideMessage)),t.includes(r)&&(e.isBeginning&&!e.params.loop||e.slidePrev(),e.isBeginning?o(s.firstSlideMessage):o(s.prevSlideMessage))}e.pagination&&r.matches(le(i?.bulletClass))&&r.click()}}function E(){return!!(e.pagination&&e.pagination.bullets&&e.pagination.bullets.length)}function S(){const t=e.params.pagination;return E()&&!!t?.clickable}const x=(e,t,s)=>{d(e),"BUTTON"!==e.tagName&&(u(e,"button"),e.addEventListener("keydown",b)),f(e,s)},T=t=>{i&&i!==t.target&&!i.contains(t.target)&&(a=!0),e.a11y.clicked=!0},M=()=>{a=!1,requestAnimationFrame(()=>{requestAnimationFrame(()=>{e.destroyed||(e.a11y.clicked=!1)})})},C=e=>{n=(new Date).getTime()};let P=[];const L=()=>{P.forEach(e=>e.removeAttribute("inert")),P=[]},A=t=>{if("Tab"!==t.key||!e.params.loop||e.destroyed)return;const s=t.target,i=s?.closest?.(`.${e.params.slideClass}, swiper-slide`);if(!i||!e.slides.includes(i))return;const r=parseInt(i.getAttribute("data-swiper-slide-index")||"",10);if(Number.isNaN(r))return;const a=ce(e)?e.virtual.slides.length:e.slides.length;
21828(t.shiftKey?0===r:r===a-1)&&(L(),e.slides.forEach(e=>{e===i||e.hasAttribute("inert")||(e.setAttribute("inert",""),P.push(e))}),setTimeout(L,0))},I=t=>{const s=l();if(e.a11y.clicked||!s.scrollOnFocus)return;if((new Date).getTime()-n<100)return;const r=t.target.closest(`.${e.params.slideClass}, swiper-slide`);if(!r||!e.slides.includes(r))return;i=r;const o=ce(e),d=(o?parseInt(r.getAttribute("data-swiper-slide-index")||"0",10):e.slides.indexOf(r))===e.activeIndex,c=e.params.watchSlidesProgress&&e.visibleSlides&&e.visibleSlides.includes(r);if(d||c)return;const p=t.sourceCapabilities;p&&p.firesTouchEvents||(e.isHorizontal()?e.el.scrollLeft=0:e.el.scrollTop=0,requestAnimationFrame(()=>{a||(e.params.loop?e.slideToLoop(e.getSlideIndexWhenGrid(parseInt(r.getAttribute("data-swiper-slide-index")||"0",10)),0):o?e.slideTo(e.getSlideIndexWhenGrid(parseInt(r.getAttribute("data-swiper-slide-index")||"0",10)),0):e.slideTo(e.getSlideIndexWhenGrid(e.slides.indexOf(r)),0),a=!1)}))},z=()=>{const t=l();t.itemRoleDescriptionMessage&&m(e.slides,t.itemRoleDescriptionMessage),t.slideRole&&u(e.slides,t.slideRole);const s=e.slides.length,i=t.slideLabelMessage;i&&e.slides.forEach((t,r)=>{const a=e.params.loop?parseInt(t.getAttribute("data-swiper-slide-index")||"0",10):r;f(t,i.replace(/\{\{index\}\}/,String(a+1)).replace(/\{\{slidesLength\}\}/,String(s)))})},$=()=>{const t=l();r&&e.el.append(r);const s=e.el;t.containerRoleDescriptionMessage&&m(s,t.containerRoleDescriptionMessage),t.containerMessage&&f(s,t.containerMessage),t.containerRole&&u(s,t.containerRole);const i=e.wrapperEl,a=String(t.id||i.getAttribute("id")||`swiper-wrapper-${function(e=16){return"x".repeat(e).replace(/x/g,()=>Math.round(16*Math.random()).toString(16))}(16)}`);var n;if(n=a,w(i).forEach(e=>{e.setAttribute("id",n)}),t.wrapperLiveRegion){const t=e.params.autoplay;!function(e,t){w(e).forEach(e=>{e.setAttribute("aria-live",t)})}(i,e.params.autoplay&&t?.enabled?"off":"polite")}z();const o=e.navigation?e.navigation:{nextEl:void 0,prevEl:void 0},d=w(o.nextEl),c=w(o.prevEl);if(d&&d.forEach(e=>x(e,0,t.nextSlideMessage)),c&&c.forEach(e=>x(e,0,t.prevSlideMessage)),S()){w(e.pagination.el).forEach(e=>{e.addEventListener("keydown",b)})}document.addEventListener("visibilitychange",C),e.el.addEventListener("focus",I,!0),e.el.addEventListener("keydown",A,!0),e.el.addEventListener("pointerdown",T,!0),e.el.addEventListener("pointerup",M,!0)};s("beforeInit",()=>{r=p("span",l().notificationClass),r.setAttribute("aria-live","assertive"),r.setAttribute("aria-atomic","true")}),s("afterInit",()=>{l().enabled&&$()}),s("slidesLengthChange snapGridLengthChange slidesGridLengthChange",()=>{l().enabled&&z()}),s("fromEdge toEdge afterInit lock unlock",()=>{l().enabled&&function(){if(e.params.loop||e.params.rewind||!e.navigation)return;const{nextEl:t,prevEl:s}=e.navigation;s&&(e.isBeginning?(g(s),c(s)):(v(s),d(s))),t&&(e.isEnd?(g(t),c(t)):(v(t),d(t)))}()}),s("paginationUpdate",()=>{l().enabled&&function(){const t=l();if(!E())return;const s=e.params.pagination;e.pagination.bullets.forEach(e=>{s.clickable&&(d(e),s.renderBullet||(u(e,"button"),f(e,t.paginationBulletMessage.replace(/\{\{index\}\}/,String((h(e)??0)+1))))),e.matches(le(s.bulletActiveClass))?e.setAttribute("aria-current","true"):e.removeAttribute("aria-current")})}()}),s("destroy",()=>{l().enabled&&function(){r&&r.remove();const t=e.navigation?e.navigation:{nextEl:void 0,prevEl:void 0},s=w(t.nextEl),i=w(t.prevEl);s&&s.forEach(e=>e.removeEventListener("keydown",b)),i&&i.forEach(e=>e.removeEventListener("keydown",b)),S()&&w(e.pagination.el).forEach(e=>{e.removeEventListener("keydown",b)});document.removeEventListener("visibilitychange",C),e.el&&"string"!=typeof e.el&&(e.el.removeEventListener("focus",I,!0),e.el.removeEventListener("keydown",A,!0),e.el.removeEventListener("pointerdown",T,!0),e.el.removeEventListener("pointerup",M,!0)),L()}()})},({swiper:e,extendParams:t,on:s})=>{t({history:{enabled:!1,root:"",replaceState:!1,key:"slides",keepQuery:!1}});let i=!1,r={key:void 0,value:void 0};function a(){return e.params.history}const n=e=>e.toString().replace(/\s+/g,"-").replace(/[^\w-]+/g,"").replace(/--+/g,"-").replace(/^-+/,"").replace(/-+$/,""),l=e=>{let t;t=e?new URL(e):window.location;const s=t.pathname.slice(1).split("/").filter(e=>""!==e),i=s.length;return{key:s[i-2],value:s[i-1]}},o=(t,s)=>{const r=a();if(!i||!r.enabled)return;let l;l=e.params.url?new URL(e.params.url):window.location;
21828const o=!!e.params.virtual?.enabled,d=e.virtual&&o?e.slidesEl.querySelector(`[data-swiper-slide-index="${s}"]`):e.slides[s];if(!d)return;let c=n(d.getAttribute("data-history")||"");const p=r.root;if(p.length>0){c=`${"/"===p[p.length-1]?p.slice(0,p.length-1):p}/${t?`${t}/`:""}${c}`}else l.pathname.includes(t||"")||(c=`${t?`${t}/`:""}${c}`);r.keepQuery&&(c+=l.search);const u=window.history.state;u&&u.value===c||(r.replaceState?window.history.replaceState({value:c},"",c):window.history.pushState({value:c},"",c))},d=(t,s,i)=>{if(s)for(let r=0,a=e.slides.length;r<a;r+=1){const a=e.slides[r];if(n(a.getAttribute("data-history")||"")===s){const s=e.getSlideIndex(a);e.slideTo(s,t,i)}}else e.slideTo(0,t,i)},c=()=>{r=l(e.params.url),d(e.params.speed,r.value,!1)};s("init",()=>{a().enabled&&(()=>{const t=e.params.history;if(t){if(!window.history||!window.history.pushState){t.enabled=!1;const s=e.params.hashNavigation;return void(s&&(s.enabled=!0))}i=!0,r=l(e.params.url),r.key||r.value?(d(0,r.value,e.params.runCallbacksOnInit),t.replaceState||window.addEventListener("popstate",c)):t.replaceState||window.addEventListener("popstate",c)}})()}),s("destroy",()=>{a().enabled&&(a().replaceState||window.removeEventListener("popstate",c))}),s("transitionEnd _freeModeNoMomentumRelease",()=>{i&&o(a().key,e.activeIndex)}),s("slideChange",()=>{i&&e.params.cssMode&&o(a().key,e.activeIndex)})},({swiper:e,extendParams:t,emit:s,on:i})=>{let r=!1;function a(){return e.params.hashNavigation}t({hashNavigation:{enabled:!1,replaceState:!1,watchState:!1,getSlideIndex(t,s){if(pe(e)){const t=e.slides.find(e=>e.getAttribute("data-hash")===s);if(!t)return 0;return parseInt(t.getAttribute("data-swiper-slide-index")||"0",10)}const i=d(e.slidesEl,`.${e.params.slideClass}[data-hash="${s}"], swiper-slide[data-hash="${s}"]`)[0];return i?e.getSlideIndex(i):0}}});const n=()=>{s("hashChange");const t=document.location.hash.replace("#",""),i=pe(e)?e.slidesEl.querySelector(`[data-swiper-slide-index="${e.activeIndex}"]`):e.slides[e.activeIndex];if(t!==(i?i.getAttribute("data-hash"):"")){const s=a().getSlideIndex(e,t);if(void 0===s||Number.isNaN(s))return;e.slideTo(s)}},l=()=>{const t=a();if(!r||!t.enabled)return;const i=pe(e)?e.slidesEl.querySelector(`[data-swiper-slide-index="${e.activeIndex}"]`):e.slides[e.activeIndex],n=i?i.getAttribute("data-hash")||i.getAttribute("data-history"):"";t.replaceState&&window.history&&window.history.replaceState?(window.history.replaceState(null,"",`#${n}`||""),s("hashSet")):(document.location.hash=n||"",s("hashSet"))};i("init",()=>{a().enabled&&(()=>{const t=a(),s=e.params.history;if(!t.enabled||s&&s.enabled)return;r=!0;const i=document.location.hash.replace("#","");if(i){const s=0,r=t.getSlideIndex(e,i);e.slideTo(r||0,s,e.params.runCallbacksOnInit,!0)}t.watchState&&window.addEventListener("hashchange",n)})()}),i("destroy",()=>{a().enabled&&a().watchState&&window.removeEventListener("hashchange",n)}),i("transitionEnd _freeModeNoMomentumRelease",()=>{r&&l()}),i("slideChange",()=>{r&&e.params.cssMode&&l()})},({swiper:e,extendParams:t,on:s,emit:i,params:r})=>{function a(){return e.params.autoplay}e.autoplay={running:!1,paused:!1,timeLeft:0},t({autoplay:{enabled:!1,delay:3e3,waitForTransition:!0,disableOnInteraction:!1,stopOnLastSlide:!1,reverseDirection:!1,pauseOnMouseEnter:!1}});const n="object"==typeof r.autoplay&&r.autoplay&&"number"==typeof r.autoplay.delay?r.autoplay.delay:3e3;let l,o,d,c=n,p=n,u=0,m=(new Date).getTime(),h=!1,f=!1,g=!1,v=!1,w=!1;function b(t){if(!e||e.destroyed||!e.wrapperEl)return;if(t.target!==e.wrapperEl)return;e.wrapperEl.removeEventListener("transitionend",b);const s=t.detail;w||s&&s.bySwiperTouchMove||C()}const y=()=>{if(e.destroyed||!e.autoplay.running)return;e.autoplay.paused?h=!0:h&&(p=u,h=!1);const t=e.autoplay.paused?u:m+p-(new Date).getTime();e.autoplay.timeLeft=t,i("autoplayTimeLeft",t,t/c),o=requestAnimationFrame(()=>{y()})},E=()=>{let t=a().delay;const s=(()=>{let t;const s=!!e.params.virtual?.enabled;if(t=e.virtual&&s?e.slides.find(e=>e.classList.contains("swiper-slide-active")):e.slides[e.activeIndex],!t)return;const i=t.getAttribute("data-swiper-autoplay");return null!=i?parseInt(i,10):void 0})();return"number"==typeof s&&!Number.isNaN(s)&&s>0&&(t=s),t},S=t=>{if(e.destroyed||!e.autoplay.running)return 0;void 0!==o&&cancelAnimationFrame(o),y();let s=t;void 0===s&&(s=E(),c=s,p=s),u=s;const r=e.params.speed,n=()=>
21828{if(!e||e.destroyed)return;const t=a();t.reverseDirection?!e.isBeginning||e.params.loop||e.params.rewind?(e.slidePrev(r,!0,!0),i("autoplay")):t.stopOnLastSlide||(e.slideTo(e.slides.length-1,r,!0,!0),i("autoplay")):!e.isEnd||e.params.loop||e.params.rewind?(e.slideNext(r,!0,!0),i("autoplay")):t.stopOnLastSlide||(e.slideTo(0,r,!0,!0),i("autoplay")),e.params.cssMode&&(m=(new Date).getTime(),requestAnimationFrame(()=>{S()}))};return s>0?(void 0!==l&&clearTimeout(l),l=setTimeout(()=>{n()},s)):requestAnimationFrame(()=>{n()}),s},x=()=>(m=(new Date).getTime(),e.autoplay.running=!0,S(),i("autoplayStart"),!0),T=()=>(e.autoplay.running=!1,void 0!==l&&clearTimeout(l),void 0!==o&&cancelAnimationFrame(o),i("autoplayStop"),!0),M=(t,s)=>{if(e.destroyed||!e.autoplay.running)return;void 0!==l&&clearTimeout(l),t||(v=!0);const r=()=>{i("autoplayPause"),a().waitForTransition?e.wrapperEl.addEventListener("transitionend",b):C()};if(e.autoplay.paused=!0,s)return void r();const n=u||a().delay;u=n-((new Date).getTime()-m),e.isEnd&&u<0&&!e.params.loop||(u<0&&(u=0),r())},C=()=>{e.isEnd&&u<0&&!e.params.loop||e.destroyed||!e.autoplay.running||(m=(new Date).getTime(),v?(v=!1,S(u)):S(),e.autoplay.paused=!1,i("autoplayResume"))},P=()=>{!e.destroyed&&e.autoplay.running&&("hidden"===document.visibilityState&&(v=!0,M(!0)),"visible"===document.visibilityState&&C())},L=t=>{"mouse"===t.pointerType&&(v=!0,w=!0,e.animating||e.autoplay.paused||M(!0))},A=t=>{"mouse"===t.pointerType&&(w=!1,e.autoplay.paused&&C())};s("init",()=>{a().enabled&&(a().pauseOnMouseEnter&&(e.el.addEventListener("pointerenter",L),e.el.addEventListener("pointerleave",A)),document.addEventListener("visibilitychange",P),x())}),s("destroy",()=>{e.el&&"string"!=typeof e.el&&(e.el.removeEventListener("pointerenter",L),e.el.removeEventListener("pointerleave",A)),document.removeEventListener("visibilitychange",P),e.autoplay.running&&T()}),s("_freeModeStaticRelease",()=>{(g||v)&&C()}),s("_freeModeNoMomentumRelease",()=>{a().disableOnInteraction?T():M(!0,!0)}),s("beforeTransitionStart",(t,s,i)=>{!e.destroyed&&e.autoplay.running&&(i||!a().disableOnInteraction?M(!0,!0):T())}),s("sliderFirstMove",()=>{!e.destroyed&&e.autoplay.running&&(a().disableOnInteraction?T():(f=!0,g=!1,v=!1,d=setTimeout(()=>{v=!0,g=!0,M(!0)},200)))}),s("touchEnd",()=>{if(!e.destroyed&&e.autoplay.running&&f){if(void 0!==d&&clearTimeout(d),void 0!==l&&clearTimeout(l),a().disableOnInteraction)return g=!1,void(f=!1);g&&e.params.cssMode&&C(),g=!1,f=!1}}),s("slideChange",()=>{!e.destroyed&&e.autoplay.running&&e.autoplay.paused&&(u=E(),c=E())}),Object.assign(e.autoplay,{start:x,stop:T,pause:M,resume:C})},({swiper:e,extendParams:t,on:s})=>{t({thumbs:{swiper:null,multipleActiveThumbs:!0,autoScrollOffset:0,slideThumbActiveClass:"swiper-slide-thumb-active",thumbsContainerClass:"swiper-thumbs"}});let i=!1,a=!1;function n(){return e.params.thumbs}function l(){const t=e.thumbs.swiper;if(!t||t.destroyed)return!1;const s=t.params.virtual;return!!s&&!!s.enabled}function o(){const t=e.thumbs.swiper;if(!t||t.destroyed)return;const s=t.clickedIndex,i=t.clickedSlide,r=n();if(i&&i.classList.contains(r.slideThumbActiveClass))return;if(null==s)return;let a;if(t.params.loop){const e=t.clickedSlide?.getAttribute("data-swiper-slide-index");a=null==e?s:parseInt(e,10)}else a=s;e.params.loop?e.slideToLoop(a):e.slideTo(a)}function c(){const t=n();if(i)return!1;i=!0;const s=e.constructor;if(t.swiper instanceof s){if(t.swiper.destroyed)return i=!1,!1;const s=t.swiper;e.thumbs.swiper=s,Object.assign(s.originalParams,{watchSlidesProgress:!0,slideToClickedSlide:!1}),Object.assign(s.params,{watchSlidesProgress:!0,slideToClickedSlide:!1}),s.update()}else if(r(t.swiper)){const i=Object.assign({},t.swiper);Object.assign(i,{watchSlidesProgress:!0,slideToClickedSlide:!1}),e.thumbs.swiper=new s(i),a=!0}const d=e.thumbs.swiper;return!!d&&(d.el.classList.add(t.thumbsContainerClass),d.on("tap",o),l()&&d.on("virtualUpdate",()=>{p(!1,{autoScroll:!1})}),!0)}function p(t,s){const i=e.thumbs.swiper;if(!i||i.destroyed)return;let r=1;const a=n(),o=a.slideThumbActiveClass,c=e.params.slidesPerView;if("number"==typeof c&&c>1&&!e.params.centeredSlides&&(r=c),a.multipleActiveThumbs||(r=1),r=Math.floor(r),i.slides.forEac
21828h(e=>e.classList.remove(o)),i.params.loop||l())for(let t=0;t<r;t+=1)d(i.slidesEl,`[data-swiper-slide-index="${e.realIndex+t}"]`).forEach(e=>{e.classList.add(o)});else for(let t=0;t<r;t+=1){const s=i.slides[e.realIndex+t];s&&s.classList.add(o)}(s?.autoScroll??1)&&function(t){const s=e.thumbs.swiper;if(!s||s.destroyed)return;const i=s.params.slidesPerView,r="auto"===i?s.slidesPerViewDynamic():i??1,a=n().autoScrollOffset,l=a&&!s.params.loop;if(e.realIndex!==s.realIndex||l){const i=s.activeIndex;let n,o;if(s.params.loop){const t=s.slides.find(t=>t.getAttribute("data-swiper-slide-index")===`${e.realIndex}`);n=t?s.slides.indexOf(t):-1,o=e.activeIndex>e.previousIndex?"next":"prev"}else n=e.realIndex,o=n>e.previousIndex?"next":"prev";l&&(n+="next"===o?a:-1*a),s.visibleSlidesIndexes&&s.visibleSlidesIndexes.indexOf(n)<0&&(s.params.centeredSlides?n=n>i?n-Math.floor(r/2)+1:n+Math.floor(r/2)-1:n>i&&s.params.slidesPerGroup,s.slideTo(n,t))}}(t?0:void 0)}e.thumbs={swiper:null},s("beforeInit",()=>{const t=e.params.thumbs;if(t&&t.swiper)if("string"==typeof t.swiper||t.swiper instanceof HTMLElement){const s=()=>{const s="string"==typeof t.swiper?document.querySelector(t.swiper):t.swiper;if(s&&s.swiper)t.swiper=s.swiper,c(),p(!0);else if(s){const i=`${e.params.eventsPrefix}init`,r=a=>{const n=a.detail;t.swiper=n[0],s.removeEventListener(i,r),c(),p(!0),t.swiper.update(),e.update()};s.addEventListener(i,r)}return s},i=()=>{if(e.destroyed)return;s()||requestAnimationFrame(i)};requestAnimationFrame(i)}else c(),p(!0)}),s("slideChange update resize observerUpdate",()=>{p()}),s("setTransition",(t,s)=>{const i=e.thumbs.swiper;i&&!i.destroyed&&i.setTransition(s)}),s("beforeDestroy",()=>{const t=e.thumbs.swiper;t&&!t.destroyed&&a&&t.destroy()}),Object.assign(e.thumbs,{init:c,update:p})},({swiper:e,extendParams:t,emit:i,once:r})=>{t({freeMode:{enabled:!1,momentum:!0,momentumRatio:1,momentumBounce:!0,momentumBounceRatio:1,momentumVelocityRatio:1,sticky:!1,minimumVelocity:.02}}),e.freeMode={onTouchStart:function(){if(e.params.cssMode)return;const t=e.getTranslate();e.setTranslate(t),e.setTransition(0),e.touchEventsData.velocities.length=0,e.freeMode.onTouchEnd({currentPos:e.rtl?e.translate:-e.translate})},onTouchMove:function(){if(e.params.cssMode)return;const{touchEventsData:t,touches:i}=e;0===t.velocities.length&&t.velocities.push({position:i[e.isHorizontal()?"startX":"startY"],time:t.touchStartTime??s()}),t.velocities.push({position:i[e.isHorizontal()?"currentX":"currentY"],time:s()})},onTouchEnd:function({currentPos:t}){if(e.params.cssMode)return;const{wrapperEl:a,rtlTranslate:n,snapGrid:l,touchEventsData:o}=e,d=e.params,c=e.params.freeMode,p=s(),u=p-(o.touchStartTime??p);if(t<-e.minTranslate())e.slideTo(e.activeIndex);else if(t>-e.maxTranslate())e.slides.length<l.length?e.slideTo(l.length-1):e.slideTo(e.slides.length-1);else{if(c.momentum){if(o.velocities.length>1){const t=o.velocities.pop(),i=o.velocities.pop(),r=t.position-i.position,a=t.time-i.time;e.velocity=r/a,e.velocity/=2,Math.abs(e.velocity)<c.minimumVelocity&&(e.velocity=0),(a>150||s()-t.time>300)&&(e.velocity=0)}else e.velocity=0;e.velocity*=c.momentumVelocityRatio,o.velocities.length=0;let t=1e3*c.momentumRatio;const p=e.velocity*t;let u=e.translate+p;n&&(u=-u);let m,h=!1;const f=20*Math.abs(e.velocity)*c.momentumBounceRatio;let v=!1;if(u<e.maxTranslate())c.momentumBounce?(u+e.maxTranslate()<-f&&(u=e.maxTranslate()-f),m=e.maxTranslate(),h=!0,o.allowMomentumBounce=!0):u=e.maxTranslate(),d.loop&&d.centeredSlides&&(v=!0);else if(u>e.minTranslate())c.momentumBounce?(u-e.minTranslate()>f&&(u=e.minTranslate()+f),m=e.minTranslate(),h=!0,o.allowMomentumBounce=!0):u=e.minTranslate(),d.loop&&d.centeredSlides&&(v=!0);else if(c.sticky){let t=0;for(let e=0;e<l.length;e+=1)if(l[e]>-u){t=e;break}u=Math.abs(l[t]-u)<Math.abs((l[t-1]??l[t])-u)||"next"===e.swipeDirection?l[t]:l[t-1],u=-u}if(v&&r("transitionEnd",()=>{e.loopFix()}),0!==e.velocity){if(t=n?Math.abs((-u-e.translate)/e.velocity):Math.abs((u-e.translate)/e.velocity),c.sticky){const s=Math.abs((n?-u:u)-e.translate),i=e.slidesSizesGrid[e.activeIndex],r=d.speed;t=s<i?r:s<2*i?1.5*r:2.5*r}}else if(c.sticky)return void e.slideToClosest();c.momentumBounce&&h&&void 0!==m?(e.updateProgress(m),e.setTransition(t),e.setTranslate(u),e.transitionStart(!0,e.swipeDirection),e.animating=!0,g(a,()=>{e&&!e.destroyed&&o.allowMomentumBounce&&(i("momentumBounce"),e.setTransition(d.speed),setTimeout(()=>{e.setTranslate(m),g(a,()=>{e&&!e.destroyed&&e.transitionEnd()})},0))})):e.velocity?(i("_freeModeNoMomentumRelease"),e.updateProgress(u),e.setTransition(t),e.setTranslate(u),e.transitionStart(!0,e.swipeDirection),e.animating||(e.animating=!0,g(a,()=>{e&&!e.destroyed&&e.transitionEnd()}))):e.updateProgress(u),e.updateActiveIndex(),e.updateSlidesClasses()}else{if(c.sticky)return void e.slideToClosest();i("_freeModeNoMomentumRelease")}(!c.momentum||u>=d.longSwipesMs)&&(i("_freeModeStaticRelease"),e.updateProgress(),e.updateActiveIndex(),e.updateSlidesClasses())}}}},({swiper:e,extendParams:t,on:s})=>{function i(){return e.params.grid}let r,a,n,l;t({grid:{rows:1,fill:"column"}});const o=()=>{let t=e.params.spaceBetween??0;return"string"==typeof t&&t.indexOf("%")>=0?t=parseFloat(t.replace("%",""))/100*e.size:"string"==typeof t&&(t=parseFloat(t)),t},d=()=>{const t=e.params.virtual;return!!e.virtual&&"object"==typeof t&&null!==t&&!!t.enabled};s("init",()=>{const t=e.params.grid;l=!!(t&&(t.rows??1)>1)}),s("update",()=>{const{params:t,el:s}=e,i=t.grid,r=!!(i&&(i.rows??1)>1);l&&!r?(s.classList.remove(`${t.containerModifierClass}grid`,`${t.containerModifierClass}grid-column`),n=1,e.emitContainerClasses()):!l&&r&&(s.classList.add(`${t.containerModifierClass}grid`),"column"===i.fill&&s.classList.add(`${t.containerModifierClass}grid-column`),e.emitContainerClasses()),l=r}),e.grid={initSlides:t=>{const{slidesPerView:s}=e.params,{rows:l,fill:o}=i(),c=d()?e.virtual.slides.length:t.length;n=Math.floor(c/l),r=Math.floor(c/l)===c/l?c:Math.ceil(c/l)*l,"auto"!==s&&"row"===o&&(r=Math.max(r,Math.floor(s??1)*l)),a=r/l},unsetSlides:()=>
21828{e.slides&&e.slides.forEach(t=>{t.swiperSlideGridSet&&(t.style.height="",t.style.setProperty(e.getDirectionLabel("margin-top"),""))})},updateSlide:(t,s,l)=>{const{slidesPerGroup:c}=e.params,p=o(),{rows:u,fill:m}=i(),h=d()?e.virtual.slides.length:l.length;let f,g,v;if("row"===m&&(c??1)>1){const e=c??1,i=Math.floor(t/(e*u)),a=t-u*e*i,n=0===i?e:Math.min(Math.ceil((h-i*u*e)/u),e);v=Math.floor(a/n),g=a-v*n+i*e,f=g+v*r/u,s.style.order=String(f)}else"column"===m?(g=Math.floor(t/u),v=t-g*u,(g>n||g===n&&v===u-1)&&(v+=1,v>=u&&(v=0,g+=1))):(v=Math.floor(t/a),g=t-v*a);const w=s;w.row=v,w.column=g,s.style.height=`calc((100% - ${(u-1)*p}px) / ${u})`,s.style.setProperty(e.getDirectionLabel("margin-top"),0!==v&&p?`${p}px`:""),w.swiperSlideGridSet=!0},updateWrapperSize:(t,s)=>{const{centeredSlides:a,roundLengths:n}=e.params,l=o(),{rows:d}=i();if(e.virtualSize=(t+l)*r,e.virtualSize=Math.ceil(e.virtualSize/d)-l,e.params.cssMode||e.wrapperEl.style.setProperty(e.getDirectionLabel("width"),`${e.virtualSize+l}px`),a){const t=[];for(let i=0;i<s.length;i+=1){let r=s[i];n&&(r=Math.floor(r)),s[i]<e.virtualSize+s[0]&&t.push(r)}s.splice(0,s.length),s.push(...t)}}}},({swiper:e})=>{Object.assign(e,{appendSlide:me.bind(e),prependSlide:he.bind(e),addSlide:ue.bind(e),removeSlide:ge.bind(e),removeAllSlides:fe.bind(e)})},({swiper:e,extendParams:t,on:s})=>{t({fadeEffect:{crossFade:!1,mode:"default"}});let i=0;function r(){return e.params.fadeEffect}function a(){const e=r();return"default"===e.mode&&e.crossFade?"cross-fade":e.mode}ve({effect:"fade",swiper:e,on:s,setTranslate:()=>{const{slides:t}=e,s=(r(),a()),n="out-in"===s&&i>0,l=i;i=0;const o=[],d=[];let c=!1;for(let i=0;i<t.length;i+=1){const r=t[i];let a=-(r.swiperSlideOffset??0);e.params.virtualTranslate||(a-=e.translate);let l=0;e.isHorizontal()||(l=a,a=0);const p=r.progress??0;let u;u="cross-fade"===s?Math.max(1-Math.abs(p),0):"out-in"===s?Math.max(1-2*Math.abs(p),0):1+Math.min(Math.max(p,-1),0);const m=we(0,r);if(n){const e=parseFloat(m.style.opacity);0===u&&e>0&&(c=!0),u>0&&d.push(m),o.push(m)}m.style.opacity=String(u),m.style.transform=`translate3d(${a}px, ${l}px, 0px)`}n&&(o.forEach(e=>{const t=c&&d.includes(e);e.style.transitionDuration=l/2+"ms",e.style.transitionDelay=t?l/2+"ms":"0ms"}),be({swiper:e,duration:l,transformElements:d,allSlides:!0}))},setTransition:t=>{const s=a(),r=e.slides.map(e=>o(e));r.forEach(e=>{e.style.transitionDuration=`${t}ms`,"out-in"===s&&0===t&&(e.style.transitionDelay="")}),"out-in"===s&&t>0&&!e.params.cssMode?i=t:be({swiper:e,duration:t,transformElements:r,allSlides:!0})},overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!e.params.cssMode})})},({swiper:e,extendParams:t,on:s})=>{t({cubeEffect:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94}});const i=(e,t,s)=>{let i=s?e.querySelector(".swiper-slide-shadow-left"):e.querySelector(".swiper-slide-shadow-top"),r=s?e.querySelector(".swiper-slide-shadow-right"):e.querySelector(".swiper-slide-shadow-bottom");i||(i=p("div",("swiper-slide-shadow-cube swiper-slide-shadow-"+(s?"left":"top")).split(" ")),e.append(i)),r||(r=p("div",("swiper-slide-shadow-cube swiper-slide-shadow-"+(s?"right":"bottom")).split(" ")),e.append(r)),i&&(i.style.opacity=String(Math.max(-t,0))),r&&(r.style.opacity=String(Math.max(t,0)))};ve({effect:"cube",swiper:e,on:s,setTranslate:()=>{const{el:t,wrapperEl:s,slides:r,width:a,height:n,rtlTranslate:l,size:o}=e,d=b(e),c=e.params.cubeEffect,u=e.isHorizontal(),m=!(!e.virtual||!e.params.virtual?.enabled);let h=0,f=null;c.shadow&&(u?(f=e.wrapperEl.querySelector(".swiper-cube-shadow"),f||(f=p("div","swiper-cube-shadow"),e.wrapperEl.append(f)),f.style.height=`${a}px`):(f=t.querySelector(".swiper-cube-shadow"),f||(f=p("div","swiper-cube-shadow"),t.append(f))));for(let e=0;e<r.length;e+=1){const t=r[e];let s=e;m&&(s=parseInt(t.getAttribute("data-swiper-slide-index")??"0",10));let a=90*s,n=Math.floor(a/360);l&&(a=-a,n=Math.floor(-a/360));const p=Math.max(Math.min(t.progress??0,1),-1);let f=0,g=0,v=0;s%4==0?(f=4*-n*o,v=0):(s-1)%4==0?(f=0,v=4*-n*o):(s-2)%4==0?(f=o+4*n*o,v=o):(s-3)%4==0&&(f=-o,v=3*o+4*o*n),l&&(f=-f),u||(g=f,f=0);const w=`rotateX(${d(u?0:-a)}deg) rotateY(${d(u?a:0)}deg) translate3d(${f}px, ${g}px, ${v}px)`;p<=1&&p>
21828-1&&(h=90*s+90*p,l&&(h=90*-s-90*p)),t.style.transform=w,c.slideShadows&&i(t,p,u)}if(s.style.transformOrigin=`50% 50% -${o/2}px`,s.style.setProperty("-webkit-transform-origin",`50% 50% -${o/2}px`),c.shadow&&f)if(u)f.style.transform=`translate3d(0px, ${a/2+c.shadowOffset}px, ${-a/2}px) rotateX(89.99deg) rotateZ(0deg) scale(${c.shadowScale})`;else{const e=Math.abs(h)-90*Math.floor(Math.abs(h)/90),t=1.5-(Math.sin(2*e*Math.PI/360)/2+Math.cos(2*e*Math.PI/360)/2),s=c.shadowScale,i=c.shadowScale/t,r=c.shadowOffset;f.style.transform=`scale3d(${s}, 1, ${i}) translate3d(0px, ${n/2+r}px, ${-n/2/i}px) rotateX(-89.99deg)`}s.style.transform=`translate3d(0px,0,0px) rotateX(${d(e.isHorizontal()?0:h)}deg) rotateY(${d(e.isHorizontal()?-h:0)}deg)`,s.style.setProperty("--swiper-cube-translate-z","0px")},setTransition:t=>{const{el:s,slides:i}=e;if(i.forEach(e=>{e.style.transitionDuration=`${t}ms`,e.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach(e=>{e.style.transitionDuration=`${t}ms`})}),e.params.cubeEffect?.shadow&&!e.isHorizontal()){const e=s.querySelector(".swiper-cube-shadow");e&&(e.style.transitionDuration=`${t}ms`)}},recreateShadows:()=>{const t=e.isHorizontal();e.slides.forEach(e=>{const s=Math.max(Math.min(e.progress??0,1),-1);i(e,s,t)})},getEffectParams:()=>e.params.cubeEffect,perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,resistanceRatio:0,spaceBetween:0,centeredSlides:!1,virtualTranslate:!0})})},({swiper:e,extendParams:t,on:s})=>{function i(){return e.params.flipEffect}t({flipEffect:{slideShadows:!0,limitRotation:!0}});const r=(t,s)=>{let i=e.isHorizontal()?t.querySelector(".swiper-slide-shadow-left"):t.querySelector(".swiper-slide-shadow-top"),r=e.isHorizontal()?t.querySelector(".swiper-slide-shadow-right"):t.querySelector(".swiper-slide-shadow-bottom");i||(i=ye("flip",t,e.isHorizontal()?"left":"top")),r||(r=ye("flip",t,e.isHorizontal()?"right":"bottom")),i&&(i.style.opacity=String(Math.max(-s,0))),r&&(r.style.opacity=String(Math.max(s,0)))};ve({effect:"flip",swiper:e,on:s,setTranslate:()=>{const{slides:t,rtlTranslate:s}=e,a=i(),n=b(e);for(let i=0;i<t.length;i+=1){const l=t[i];let o=l.progress??0;a.limitRotation&&(o=Math.max(Math.min(o,1),-1));const d=l.swiperSlideOffset??0;let c=-180*o,p=0,u=e.params.cssMode?-d-e.translate:-d,m=0;e.isHorizontal()?s&&(c=-c):(m=u,u=0,p=-c,c=0),l.style.zIndex=String(-Math.abs(Math.round(o))+t.length),a.slideShadows&&r(l,o);const h=`translate3d(${u}px, ${m}px, 0px) rotateX(${n(p)}deg) rotateY(${n(c)}deg)`;we(0,l).style.transform=h}},setTransition:t=>{const s=e.slides.map(e=>o(e));s.forEach(e=>{e.style.transitionDuration=`${t}ms`,e.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach(e=>{e.style.transitionDuration=`${t}ms`})}),be({swiper:e,duration:t,transformElements:s})},recreateShadows:()=>{const t=i();e.slides.forEach(e=>{let s=e.progress??0;t.limitRotation&&(s=Math.max(Math.min(s,1),-1)),r(e,s)})},getEffectParams:()=>e.params.flipEffect,perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!e.params.cssMode})})},({swiper:e,extendParams:t,on:s})=>{t({coverflowEffect:{rotate:50,stretch:0,depth:100,scale:1,modifier:1,slideShadows:!0}});ve({effect:"coverflow",swiper:e,on:s,setTranslate:()=>{const{width:t,height:s,slides:i,slidesSizesGrid:r}=e,a=e.params.coverflowEffect,n=e.isHorizontal(),l=e.translate,o=n?t/2-l:s/2-l,d=n?a.rotate:-a.rotate,c=a.depth,p=b(e);for(let e=0,t=i.length;e<t;e+=1){const t=i[e],s=r[e],l=(o-(t.swiperSlideOffset??0)-s/2)/s,u="function"==typeof a.modifier?a.modifier(l):l*a.modifier;let m=n?d*u:0,h=n?0:d*u,f=-c*Math.abs(u),g="string"==typeof a.stretch&&-1!==a.stretch.indexOf("%")?parseFloat(a.stretch)/100*s:a.stretch,v=n?0:g*u,w=n?g*u:0,b=1-(1-a.scale)*Math.abs(u);Math.abs(w)<.001&&(w=0),Math.abs(v)<.001&&(v=0),Math.abs(f)<.001&&(f=0),Math.abs(m)<.001&&(m=0),Math.abs(h)<.001&&(h=0),Math.abs(b)<.001&&(b=0);const y=`translate3d(${w}px,${v}px,${f}px)  rotateX(${p(h)}deg) rotateY(${p(m)}deg) scale(${b})`;if(we(0,t).style.transform=y,t.style.zIndex=String(1-Math.abs(Math.round(u))),a.slideShadows){let e=n?t.querySelector(".swiper-slide-shadow-left"):t.querySelector(".swiper-slide-shadow-top"),s=n?t.querySelector(".swiper-slide-shadow-right"):t.querySelector(".swiper-slide-shadow-bottom");e||(e=ye("coverflow",t,n?"left":"top")),s||(s=ye("coverflow",t,n?"right":"bottom")),e&&(e.style.opacity=String(u>0?u:0)),s&&(s.style.opacity=String(-u>0?-u:0))}}},setTransition:t=>{e.slides.map(e=>
21828o(e)).forEach(e=>{e.style.transitionDuration=`${t}ms`,e.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach(e=>{e.style.transitionDuration=`${t}ms`})})},perspective:()=>!0,overwriteParams:()=>({watchSlidesProgress:!0})})},({swiper:e,extendParams:t,on:s})=>{function i(){return e.params.creativeEffect}t({creativeEffect:{limitProgress:1,shadowPerProgress:!1,progressMultiplier:1,perspective:!0,prev:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1},next:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1}}});const r=e=>"string"==typeof e?e:`${e}px`;ve({effect:"creative",swiper:e,on:s,setTranslate:()=>{const{slides:t,wrapperEl:s,slidesSizesGrid:a}=e,n=i(),{progressMultiplier:l}=n,o=e.params.centeredSlides,d=b(e);if(o){const t=a[0]/2-(e.params.slidesOffsetBefore??0);s.style.transform=`translateX(calc(50% - ${t}px))`}for(let s=0;s<t.length;s+=1){const i=t[s],a=i.progress??0,c=Math.min(Math.max(a,-n.limitProgress),n.limitProgress);let p=c;o||(p=Math.min(Math.max(i.originalProgress??0,-n.limitProgress),n.limitProgress));const u=i.swiperSlideOffset??0,m=[e.params.cssMode?-u-e.translate:-u,0,0],h=[0,0,0];let f=!1;e.isHorizontal()||(m[1]=m[0],m[0]=0);let g={translate:[0,0,0],rotate:[0,0,0],scale:1,opacity:1};c<0?(g=n.next,f=!0):c>0&&(g=n.prev,f=!0),m.forEach((e,t)=>{m[t]=`calc(${e}px + (${r(g.translate[t])} * ${Math.abs(c*l)}))`}),h.forEach((e,t)=>{h[t]=g.rotate[t]*Math.abs(c*l)}),i.style.zIndex=String(-Math.abs(Math.round(a))+t.length);const v=m.join(", "),w=`rotateX(${d(h[0])}deg) rotateY(${d(h[1])}deg) rotateZ(${d(h[2])}deg)`,b=p<0?`scale(${1+(1-g.scale)*p*l})`:`scale(${1-(1-g.scale)*p*l})`,y=p<0?1+(1-g.opacity)*p*l:1-(1-g.opacity)*p*l,E=`translate3d(${v}) ${w} ${b}`;if(f&&g.shadow||!f){let e=i.querySelector(".swiper-slide-shadow");if(!e&&g.shadow&&(e=ye("creative",i)),e){const t=n.shadowPerProgress?c*(1/n.limitProgress):c;e.style.opacity=String(Math.min(Math.max(Math.abs(t),0),1))}}const S=we(0,i);S.style.transform=E,S.style.opacity=String(y),g.origin&&(S.style.transformOrigin=g.origin)}},setTransition:t=>{const s=e.slides.map(e=>o(e));s.forEach(e=>{e.style.transitionDuration=`${t}ms`,e.querySelectorAll(".swiper-slide-shadow").forEach(e=>{e.style.transitionDuration=`${t}ms`})}),be({swiper:e,duration:t,transformElements:s,allSlides:!0})},perspective:()=>i().perspective,overwriteParams:()=>({watchSlidesProgress:!0,virtualTranslate:!e.params.cssMode})})},({swiper:e,extendParams:t,on:s})=>{function i(){return e.params.cardsEffect}t({cardsEffect:{slideShadows:!0,rotate:!0,perSlideRotate:2,perSlideOffset:8}});ve({effect:"cards",swiper:e,on:s,setTranslate:()=>{const{slides:t,activeIndex:s,rtlTranslate:r}=e,a=i(),{startTranslate:n,isTouched:l}=e.touchEventsData,o=r?-e.translate:e.translate;for(let i=0;i<t.length;i+=1){const d=t[i],c=d.progress??0,p=Math.min(Math.max(c,-4),4);let u=d.swiperSlideOffset??0;e.params.centeredSlides&&!e.params.cssMode&&(e.wrapperEl.style.transform=`translateX(${e.minTranslate()}px)`),e.params.centeredSlides&&e.params.cssMode&&(u-=t[0].swiperSlideOffset??0);let m=e.params.cssMode?-u-e.translate:-u,h=0;const f=-100*Math.abs(p);let g=1,v=-a.perSlideRotate*p,w=a.perSlideOffset-.75*Math.abs(p);const b=e.virtual&&e.params.virtual?.enabled?e.virtual.from+i:i,y=(b===s||b===s-1)&&p>0&&p<1&&(l||e.params.cssMode)&&(o??0)<(n??0),E=(b===s||b===s+1)&&p<0&&p>-1&&(l||e.params.cssMode)&&(o??0)>(n??0);if(y||E){const t=(1-Math.abs((Math.abs(p)-.5)/.5))**.5;v+=-28*p*t,g+=-.5*t,w+=96*t,h=(a.rotate||e.isHorizontal()?-25:0)*t*Math.abs(p)+"%"}if(m=p<0?`calc(${m}px ${r?"-":"+"} (${w*Math.abs(p)}%))`:p>0?`calc(${m}px ${r?"-":"+"} (${-w*Math.abs(p)}%))`:`${m}px`,!e.isHorizontal()){const e=h;h=m,m=e}const S=p<0?""+(1+(1-g)*p):""+(1-(1-g)*p),x=`\n        translate3d(${m}, ${h}, ${f}px)\n        rotateZ(${a.rotate?r?-v:v:0}deg)\n        scale(${S})\n      `;if(a.slideShadows){let e=d.querySelector(".swiper-slide-shadow");e||(e=ye("cards",d)),e&&(e.style.opacity=String(Math.min(Math.max((Math.abs(p)-.5)/.5,0),1)))}d.style.zIndex=String(-Math.abs(Math.round(c))+t.length);we(0,d).style.transform=x}},setTransition:t=>{const s=e.slides.map(e=>o(e));
21828s.forEach(e=>{e.style.transitionDuration=`${t}ms`,e.querySelectorAll(".swiper-slide-shadow").forEach(e=>{e.style.transitionDuration=`${t}ms`})}),be({swiper:e,duration:t,transformElements:s})},perspective:()=>!0,overwriteParams:()=>({_loopSwapReset:!1,watchSlidesProgress:!0,loopAdditionalSlides:i().rotate?3:2,centeredSlides:!0,virtualTranslate:!e.params.cssMode})})}];return se.use(Ee),se}();
21829//# sourceMappingURL=swiper-bundle.min.js.map
21830/*!***************************************************
21831* mark.js v9.0.0
21832* https://markjs.io/
21833* Copyright (c) 2014–2018, Julian Kühnel
21834* Released under the MIT license https://git.io/vwTVl
21835*****************************************************/
21836
21837(function (global, factory) {
21838  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
21839  typeof define === 'function' && define.amd ? define(factory) :
21840  (global.Mark = factory());
21841}(this, (function () { 'use strict';
21842
21843  function _typeof(obj) {
21844    if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
21845      _typeof = function (obj) {
21846        return typeof obj;
21847      };
21848    } else {
21849      _typeof = function (obj) {
21850        return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
21851      };
21852    }
21853
21854    return _typeof(obj);
21855  }
21856
21857  function _classCallCheck(instance, Constructor) {
21858    if (!(instance instanceof Constructor)) {
21859      throw new TypeError("Cannot call a class as a function");
21860    }
21861  }
21862
21863  function _defineProperties(target, props) {
21864    for (var i = 0; i < props.length; i++) {
21865      var descriptor = props[i];
21866      descriptor.enumerable = descriptor.enumerable || false;
21867      descriptor.configurable = true;
21868      if ("value" in descriptor) descriptor.writable = true;
21869      Object.defineProperty(target, descriptor.key, descriptor);
21870    }
21871  }
21872
21873  function _createClass(Constructor, protoProps, staticProps) {
21874    if (protoProps) _defineProperties(Constructor.prototype, protoProps);
21875    if (staticProps) _defineProperties(Constructor, staticProps);
21876    return Constructor;
21877  }
21878
21879  function _extends() {
21880    _extends = Object.assign || function (target) {
21881      for (var i = 1; i < arguments.length; i++) {
21882        var source = arguments[i];
21883
21884        for (var key in source) {
21885          if (Object.prototype.hasOwnProperty.call(source, key)) {
21886            target[key] = source[key];
21887          }
21888        }
21889      }
21890
21891      return target;
21892    };
21893
21894    return _extends.apply(this, arguments);
21895  }
21896
21897  var DOMIterator =
21898  /*#__PURE__*/
21899  function () {
21900    function DOMIterator(ctx) {
21901      var iframes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
21902      var exclude = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
21903      var iframesTimeout = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 5000;
21904
21905      _classCallCheck(this, DOMIterator);
21906
21907      this.ctx = ctx;
21908      this.iframes = iframes;
21909      this.exclude = exclude;
21910      this.iframesTimeout = iframesTimeout;
21911    }
21912
21913    _createClass(DOMIterator, [{
21914      key: "getContexts",
21915      value: function getContexts() {
21916        var ctx,
21917            filteredCtx = [];
21918
21919        if (typeof this.ctx === 'undefined' || !this.ctx) {
21920          ctx = [];
21921        } else if (NodeList.prototype.isPrototypeOf(this.ctx)) {
21922          ctx = Array.prototype.slice.call(this.ctx);
21923        } else if (Array.isArray(this.ctx)) {
21924          ctx = this.ctx;
21925        } else if (typeof this.ctx === 'string') {
21926          ctx = Array.prototype.slice.call(document.querySelectorAll(this.ctx));
21927        } else {
21928          ctx = [this.ctx];
21929        }
21930
21931        ctx.forEach(function (ctx) {
21932          var isDescendant = filteredCtx.filter(function (contexts) {
21933            return contexts.contains(ctx);
21934          }).length > 0;
21935
21936          if (filteredCtx.indexOf(ctx) === -1 && !isDescendant) {
21937            filteredCtx.push(ctx);
21938          }
21939        });
21940        return filteredCtx;
21941      }
21942    }, {
21943      key: "getIframeContents",
21944      value: function getIframeContents(ifr, successFn) {
21945        var errorFn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
21946        var doc;
21947
21948        try {
21949          var ifrWin = ifr.contentWindow;
21950          doc = ifrWin.document;
21951
21952          if (!ifrWin || !doc) {
21953            throw new Error('iframe inaccessible');
21954          }
21955        } catch (e) {
21956          errorFn();
21957        }
21958
21959        if (doc) {
21960          successFn(doc);
21961        }
21962      }
21963    }, {
vendor: 7,190 bytes, lines 21964-22226
21964      key: "isIframeBlank",
21965      value: function isIframeBlank(ifr) {
21966        var bl = 'about:blank',
21967            src = ifr.getAttribute('src').trim(),
21968            href = ifr.contentWindow.location.href;
21969        return href === bl && src !== bl && src;
21970      }
21971    }, {
21972      key: "observeIframeLoad",
21973      value: function observeIframeLoad(ifr, successFn, errorFn) {
21974        var _this = this;
21975
21976        var called = false,
21977            tout = null;
21978
21979        var listener = function listener() {
21980          if (called) {
21981            return;
21982          }
21983
21984          called = true;
21985          clearTimeout(tout);
21986
21987          try {
21988            if (!_this.isIframeBlank(ifr)) {
21989              ifr.removeEventListener('load', listener);
21990
21991              _this.getIframeContents(ifr, successFn, errorFn);
21992            }
21993          } catch (e) {
21994            errorFn();
21995          }
21996        };
21997
21998        ifr.addEventListener('load', listener);
21999        tout = setTimeout(listener, this.iframesTimeout);
22000      }
22001    }, {
22002      key: "onIframeReady",
22003      value: function onIframeReady(ifr, successFn, errorFn) {
22004        try {
22005          if (ifr.contentWindow.document.readyState === 'complete') {
22006            if (this.isIframeBlank(ifr)) {
22007              this.observeIframeLoad(ifr, successFn, errorFn);
22008            } else {
22009              this.getIframeContents(ifr, successFn, errorFn);
22010            }
22011          } else {
22012            this.observeIframeLoad(ifr, successFn, errorFn);
22013          }
22014        } catch (e) {
22015          errorFn();
22016        }
22017      }
22018    }, {
22019      key: "waitForIframes",
22020      value: function waitForIframes(ctx, done) {
22021        var _this2 = this;
22022
22023        var eachCalled = 0;
22024        this.forEachIframe(ctx, function () {
22025          return true;
22026        }, function (ifr) {
22027          eachCalled++;
22028
22029          _this2.waitForIframes(ifr.querySelector('html'), function () {
22030            if (! --eachCalled) {
22031              done();
22032            }
22033          });
22034        }, function (handled) {
22035          if (!handled) {
22036            done();
22037          }
22038        });
22039      }
22040    }, {
22041      key: "forEachIframe",
22042      value: function forEachIframe(ctx, filter, each) {
22043        var _this3 = this;
22044
22045        var end = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () {};
22046        var ifr = ctx.querySelectorAll('iframe'),
22047            open = ifr.length,
22048            handled = 0;
22049        ifr = Array.prototype.slice.call(ifr);
22050
22051        var checkEnd = function checkEnd() {
22052          if (--open <= 0) {
22053            end(handled);
22054          }
22055        };
22056
22057        if (!open) {
22058          checkEnd();
22059        }
22060
22061        ifr.forEach(function (ifr) {
22062          if (DOMIterator.matches(ifr, _this3.exclude)) {
22063            checkEnd();
22064          } else {
22065            _this3.onIframeReady(ifr, function (con) {
22066              if (filter(ifr)) {
22067                handled++;
22068                each(con);
22069              }
22070
22071              checkEnd();
22072            }, checkEnd);
22073          }
22074        });
22075      }
22076    }, {
22077      key: "createIterator",
22078      value: function createIterator(ctx, whatToShow, filter) {
22079        return document.createNodeIterator(ctx, whatToShow, filter, false);
22080      }
22081    }, {
22082      key: "createInstanceOnIframe",
22083      value: function createInstanceOnIframe(contents) {
22084        return new DOMIterator(contents.querySelector('html'), this.iframes);
22085      }
22086    }, {
22087      key: "compareNodeIframe",
22088      value: function compareNodeIframe(node, prevNode, ifr) {
22089        var compCurr = node.compareDocumentPosition(ifr),
22090            prev = Node.DOCUMENT_POSITION_PRECEDING;
22091
22092        if (compCurr & prev) {
22093          if (prevNode !== null) {
22094            var compPrev = prevNode.compareDocumentPosition(ifr),
22095                after = Node.DOCUMENT_POSITION_FOLLOWING;
22096
22097            if (compPrev & after) {
22098              return true;
22099            }
22100          } else {
22101            return true;
22102          }
22103        }
22104
22105        return false;
22106      }
22107    }, {
22108      key: "getIteratorNode",
22109      value: function getIteratorNode(itr) {
22110        var prevNode = itr.previousNode();
22111        var node;
22112
22113        if (prevNode === null) {
22114          node = itr.nextNode();
22115        } else {
22116          node = itr.nextNode() && itr.nextNode();
22117        }
22118
22119        return {
22120          prevNode: prevNode,
22121          node: node
22122        };
22123      }
22124    }, {
22125      key: "checkIframeFilter",
22126      value: function checkIframeFilter(node, prevNode, currIfr, ifr) {
22127        var key = false,
22128            handled = false;
22129        ifr.forEach(function (ifrDict, i) {
22130          if (ifrDict.val === currIfr) {
22131            key = i;
22132            handled = ifrDict.handled;
22133          }
22134        });
22135
22136        if (this.compareNodeIframe(node, prevNode, currIfr)) {
22137          if (key === false && !handled) {
22138            ifr.push({
22139              val: currIfr,
22140              handled: true
22141            });
22142          } else if (key !== false && !handled) {
22143            ifr[key].handled = true;
22144          }
22145
22146          return true;
22147        }
22148
22149        if (key === false) {
22150          ifr.push({
22151            val: currIfr,
22152            handled: false
22153          });
22154        }
22155
22156        return false;
22157      }
22158    }, {
22159      key: "handleOpenIframes",
22160      value: function handleOpenIframes(ifr, whatToShow, eCb, fCb) {
22161        var _this4 = this;
22162
22163        ifr.forEach(function (ifrDict) {
22164          if (!ifrDict.handled) {
22165            _this4.getIframeContents(ifrDict.val, function (con) {
22166              _this4.createInstanceOnIframe(con).forEachNode(whatToShow, eCb, fCb);
22167            });
22168          }
22169        });
22170      }
22171    }, {
22172      key: "iterateThroughNodes",
22173      value: function iterateThroughNodes(whatToShow, ctx, eachCb, filterCb, doneCb) {
22174        var _this5 = this;
22175
22176        var itr = this.createIterator(ctx, whatToShow, filterCb);
22177
22178        var ifr = [],
22179            elements = [],
22180            node,
22181            prevNode,
22182            retrieveNodes = function retrieveNodes() {
22183          var _this5$getIteratorNod = _this5.getIteratorNode(itr);
22184
22185          prevNode = _this5$getIteratorNod.prevNode;
22186          node = _this5$getIteratorNod.node;
22187          return node;
22188        };
22189
22190        while (retrieveNodes()) {
22191          if (this.iframes) {
22192            this.forEachIframe(ctx, function (currIfr) {
22193              return _this5.checkIframeFilter(node, prevNode, currIfr, ifr);
22194            }, function (con) {
22195              _this5.createInstanceOnIframe(con).forEachNode(whatToShow, function (ifrNode) {
22196                return elements.push(ifrNode);
22197              }, filterCb);
22198            });
22199          }
22200
22201          elements.push(node);
22202        }
22203
22204        elements.forEach(function (node) {
22205          eachCb(node);
22206        });
22207
22208        if (this.iframes) {
22209          this.handleOpenIframes(ifr, whatToShow, eachCb, filterCb);
22210        }
22211
22212        doneCb();
22213      }
22214    }, {
22215      key: "forEachNode",
22216      value: function forEachNode(whatToShow, each, filter) {
22217        var _this6 = this;
22218
22219        var done = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () {};
22220        var contexts = this.getContexts();
22221        var open = contexts.length;
22222
22223        if (!open) {
22224          done();
22225        }
22226
22227        contexts.forEach(function (ctx) {
22228          var ready = function ready() {
22229            _this6.iterateThroughNodes(whatToShow, ctx, each, filter, function () {
22230              if (--open <= 0) {
22231                done();
22232              }
22233            });
22234          };
22235
22236          if (_this6.iframes) {
22237            _this6.waitForIframes(ctx, ready);
22238          } else {
22239            ready();
22240          }
22241        });
22242      }
22243    }], [{
22244      key: "matches",
22245      value: function matches(element, selector) {
22246        var selectors = typeof selector === 'string' ? [selector] : selector,
22247            fn = element.matches || element.matchesSelector || element.msMatchesSelector || element.mozMatchesSelector || element.oMatchesSelector || element.webkitMatchesSelector;
22248
22249        if (fn) {
22250          var match = false;
22251          selectors.every(function (sel) {
22252            if (fn.call(element, sel)) {
22253              match = true;
22254              return false;
22255            }
22256
22257            return true;
22258          });
22259          return match;
22260        } else {
22261          return false;
22262        }
22263      }
22264    }]);
22265
22266    return DOMIterator;
22267  }();
22268
22269  var RegExpCreator =
22270  /*#__PURE__*/
22271  function () {
22272    function RegExpCreator(options) {
22273      _classCallCheck(this, RegExpCreator);
22274
22275      this.opt = _extends({}, {
22276        'diacritics': true,
22277        'synonyms': {},
22278        'accuracy': 'partially',
22279        'caseSensitive': false,
22280        'ignoreJoiners': false,
22281        'ignorePunctuation': [],
22282        'wildcards': 'disabled'
22283      }, options);
22284    }
22285
22286    _createClass(RegExpCreator, [{
22287      key: "create",
22288      value: function create(str) {
22289        if (this.opt.wildcards !== 'disabled') {
22290          str = this.setupWildcardsRegExp(str);
22291        }
22292
22293        str = this.escapeStr(str);
22294
22295        if (Object.keys(this.opt.synonyms).length) {
22296          str = this.createSynonymsRegExp(str);
22297        }
22298
22299        if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) {
22300          str = this.setupIgnoreJoinersRegExp(str);
22301        }
22302
22303        if (this.opt.diacritics) {
22304          str = this.createDiacriticsRegExp(str);
22305        }
22306
22307        str = this.createMergedBlanksRegExp(str);
22308
22309        if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) {
22310          str = this.createJoinersRegExp(str);
22311        }
22312
22313        if (this.opt.wildcards !== 'disabled') {
22314          str = this.createWildcardsRegExp(str);
22315        }
22316
22317        str = this.createAccuracyRegExp(str);
22318        return new RegExp(str, "gm".concat(this.opt.caseSensitive ? '' : 'i'));
22319      }
22320    }, {
22321      key: "sortByLength",
22322      value: function sortByLength(arry) {
22323        return arry.sort(function (a, b) {
22324          return a.length === b.length ? a > b ? 1 : -1 : b.length - a.length;
22325        });
22326      }
22327    }, {
22328      key: "escapeStr",
22329      value: function escapeStr(str) {
22330        return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
22331      }
22332    }, {
22333      key: "createSynonymsRegExp",
22334      value: function createSynonymsRegExp(str) {
22335        var _this = this;
22336
22337        var syn = this.opt.synonyms,
22338            sens = this.opt.caseSensitive ? '' : 'i',
22339            joinerPlaceholder = this.opt.ignoreJoiners || this.opt.ignorePunctuation.length ? "\0" : '';
22340
22341        for (var index in syn) {
22342          if (syn.hasOwnProperty(index)) {
22343            var keys = Array.isArray(syn[index]) ? syn[index] : [syn[index]];
22344            keys.unshift(index);
22345            keys = this.sortByLength(keys).map(function (key) {
22346              if (_this.opt.wildcards !== 'disabled') {
22347                key = _this.setupWildcardsRegExp(key);
22348              }
22349
22350              key = _this.escapeStr(key);
22351              return key;
22352            }).filter(function (k) {
22353              return k !== '';
22354            });
22355
22356            if (keys.length > 1) {
22357              str = str.replace(new RegExp("(".concat(keys.map(function (k) {
22358                return _this.escapeStr(k);
22359              }).join('|'), ")"), "gm".concat(sens)), joinerPlaceholder + "(".concat(keys.map(function (k) {
22360                return _this.processSynonyms(k);
22361              }).join('|'), ")") + joinerPlaceholder);
22362            }
22363          }
22364        }
22365
22366        return str;
22367      }
22368    }, {
vendor: 2,731 bytes, lines 22369-22426
22369      key: "processSynonyms",
22370      value: function processSynonyms(str) {
22371        if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) {
22372          str = this.setupIgnoreJoinersRegExp(str);
22373        }
22374
22375        return str;
22376      }
22377    }, {
22378      key: "setupWildcardsRegExp",
22379      value: function setupWildcardsRegExp(str) {
22380        str = str.replace(/(?:\\)*\?/g, function (val) {
22381          return val.charAt(0) === '\\' ? '?' : "\x01";
22382        });
22383        return str.replace(/(?:\\)*\*/g, function (val) {
22384          return val.charAt(0) === '\\' ? '*' : "\x02";
22385        });
22386      }
22387    }, {
22388      key: "createWildcardsRegExp",
22389      value: function createWildcardsRegExp(str) {
22390        var spaces = this.opt.wildcards === 'withSpaces';
22391        return str.replace(/\u0001/g, spaces ? '[\\S\\s]?' : '\\S?').replace(/\u0002/g, spaces ? '[\\S\\s]*?' : '\\S*');
22392      }
22393    }, {
22394      key: "setupIgnoreJoinersRegExp",
22395      value: function setupIgnoreJoinersRegExp(str) {
22396        return str.replace(/[^(|)\\]/g, function (val, indx, original) {
22397          var nextChar = original.charAt(indx + 1);
22398
22399          if (/[(|)\\]/.test(nextChar) || nextChar === '') {
22400            return val;
22401          } else {
22402            return val + "\0";
22403          }
22404        });
22405      }
22406    }, {
22407      key: "createJoinersRegExp",
22408      value: function createJoinersRegExp(str) {
22409        var joiner = [];
22410        var ignorePunctuation = this.opt.ignorePunctuation;
22411
22412        if (Array.isArray(ignorePunctuation) && ignorePunctuation.length) {
22413          joiner.push(this.escapeStr(ignorePunctuation.join('')));
22414        }
22415
22416        if (this.opt.ignoreJoiners) {
22417          joiner.push("\\u00ad\\u200b\\u200c\\u200d");
22418        }
22419
22420        return joiner.length ? str.split(/\u0000+/).join("[".concat(joiner.join(''), "]*")) : str;
22421      }
22422    }, {
22423      key: "createDiacriticsRegExp",
22424      value: function createDiacriticsRegExp(str) {
22425        var sens = this.opt.caseSensitive ? '' : 'i',
22426            dct = this.opt.caseSensitive ? ['aàáảãạăằắẳẵặâầấẩẫậäåāą', 'AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ', 'cçćč', 'CÇĆČ', 'dđď', 'DĐĎ', 'eèéẻẽẹêềếểễệëěēę', 'EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ', 'iìíỉĩịîïī', 'IÌÍỈĨỊÎÏĪ', 'lł', 'LŁ', 'nñňń', 'NÑŇŃ', 'oòóỏõọôồốổỗộơởỡớờợöøō', 'OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ', 'rř', 'RŘ', 'sšśșş', 'SŠŚȘŞ', 'tťțţ', 'TŤȚŢ', 'uùúủũụưừứửữựûüůū', 'UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ', 'yýỳỷỹỵÿ', 'YÝỲỶỸỴŸ', 'zžżź', 'ZŽŻŹ'] : ['aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃá
22426º Ä‚ẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ', 'cçćčCÇĆČ', 'dđďDĐĎ', 'eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ', 'iìíỉĩịîïīIÌÍỈĨỊÎÏĪ', 'lłLŁ', 'nñňńNÑŇŃ', 'oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ', 'rřRŘ', 'sšśșşSŠŚȘŞ', 'tťțţTŤȚŢ', 'uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ', 'yýỳỷỹỵÿYÝỲỶỸỴŸ', 'zžżźZŽŻŹ'];
22427        var handled = [];
22428        str.split('').forEach(function (ch) {
22429          dct.every(function (dct) {
22430            if (dct.indexOf(ch) !== -1) {
22431              if (handled.indexOf(dct) > -1) {
22432                return false;
22433              }
22434
22435              str = str.replace(new RegExp("[".concat(dct, "]"), "gm".concat(sens)), "[".concat(dct, "]"));
22436              handled.push(dct);
22437            }
22438
22439            return true;
22440          });
22441        });
22442        return str;
22443      }
22444    }, {
22445      key: "createMergedBlanksRegExp",
22446      value: function createMergedBlanksRegExp(str) {
22447        return str.replace(/[\s]+/gmi, '[\\s]+');
22448      }
22449    }, {
22450      key: "createAccuracyRegExp",
22451      value: function createAccuracyRegExp(str) {
22452        var _this2 = this;
22453
22454        var chars = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~¡¿';
22455        var acc = this.opt.accuracy,
22456            val = typeof acc === 'string' ? acc : acc.value,
22457            ls = typeof acc === 'string' ? [] : acc.limiters,
22458            lsJoin = '';
22459        ls.forEach(function (limiter) {
22460          lsJoin += "|".concat(_this2.escapeStr(limiter));
22461        });
22462
22463        switch (val) {
22464          case 'partially':
22465          default:
22466            return "()(".concat(str, ")");
22467
22468          case 'complementary':
22469            lsJoin = '\\s' + (lsJoin ? lsJoin : this.escapeStr(chars));
22470            return "()([^".concat(lsJoin, "]*").concat(str, "[^").concat(lsJoin, "]*)");
22471
22472          case 'exactly':
22473            return "(^|\\s".concat(lsJoin, ")(").concat(str, ")(?=$|\\s").concat(lsJoin, ")");
22474        }
22475      }
22476    }]);
22477
22478    return RegExpCreator;
22479  }();
22480
22481  var Mark =
22482  /*#__PURE__*/
22483  function () {
22484    function Mark(ctx) {
22485      _classCallCheck(this, Mark);
22486
22487      this.ctx = ctx;
22488      this.ie = false;
22489      var ua = window.navigator.userAgent;
22490
22491      if (ua.indexOf('MSIE') > -1 || ua.indexOf('Trident') > -1) {
22492        this.ie = true;
22493      }
22494    }
22495
22496    _createClass(Mark, [{
22497      key: "log",
22498      value: function log(msg) {
22499        var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'debug';
22500        var log = this.opt.log;
22501
22502        if (!this.opt.debug) {
22503          return;
22504        }
22505
22506        if (_typeof(log) === 'object' && typeof log[level] === 'function') {
22507          log[level]("mark.js: ".concat(msg));
22508        }
22509      }
22510    }, {
22511      key: "getSeparatedKeywords",
22512      value: function getSeparatedKeywords(sv) {
22513        var _this = this;
22514
22515        var stack = [];
22516        sv.forEach(function (kw) {
22517          if (!_this.opt.separateWordSearch) {
22518            if (kw.trim() && stack.indexOf(kw) === -1) {
22519              stack.push(kw);
22520            }
22521          } else {
22522            kw.split(' ').forEach(function (kwSplitted) {
22523              if (kwSplitted.trim() && stack.indexOf(kwSplitted) === -1) {
22524                stack.push(kwSplitted);
22525              }
22526            });
22527          }
22528        });
22529        return {
22530          'keywords': stack.sort(function (a, b) {
22531            return b.length - a.length;
22532          }),
22533          'length': stack.length
22534        };
22535      }
22536    }, {
22537      key: "isNumeric",
22538      value: function isNumeric(value) {
22539        return Number(parseFloat(value)) == value;
22540      }
22541    }, {
22542      key: "checkRanges",
22543      value: function checkRanges(array) {
22544        var _this2 = this;
22545
22546        if (!Array.isArray(array) || Object.prototype.toString.call(array[0]) !== '[object Object]') {
22547          this.log('markRanges() will only accept an array of objects');
22548          this.opt.noMatch(array);
22549          return [];
22550        }
22551
22552        var stack = [];
22553        var last = 0;
22554        array.sort(function (a, b) {
22555          return a.start - b.start;
22556        }
vendor: 4,301 bytes, lines 22556-22689
22556).forEach(function (item) {
22557          var _this2$callNoMatchOnI = _this2.callNoMatchOnInvalidRanges(item, last),
22558              start = _this2$callNoMatchOnI.start,
22559              end = _this2$callNoMatchOnI.end,
22560              valid = _this2$callNoMatchOnI.valid;
22561
22562          if (valid) {
22563            item.start = start;
22564            item.length = end - start;
22565            stack.push(item);
22566            last = end;
22567          }
22568        });
22569        return stack;
22570      }
22571    }, {
22572      key: "callNoMatchOnInvalidRanges",
22573      value: function callNoMatchOnInvalidRanges(range, last) {
22574        var start,
22575            end,
22576            valid = false;
22577
22578        if (range && typeof range.start !== 'undefined') {
22579          start = parseInt(range.start, 10);
22580          end = start + parseInt(range.length, 10);
22581
22582          if (this.isNumeric(range.start) && this.isNumeric(range.length) && end - last > 0 && end - start > 0) {
22583            valid = true;
22584          } else {
22585            this.log('Ignoring invalid or overlapping range: ' + "".concat(JSON.stringify(range)));
22586            this.opt.noMatch(range);
22587          }
22588        } else {
22589          this.log("Ignoring invalid range: ".concat(JSON.stringify(range)));
22590          this.opt.noMatch(range);
22591        }
22592
22593        return {
22594          start: start,
22595          end: end,
22596          valid: valid
22597        };
22598      }
22599    }, {
22600      key: "checkWhitespaceRanges",
22601      value: function checkWhitespaceRanges(range, originalLength, string) {
22602        var end,
22603            valid = true,
22604            max = string.length,
22605            offset = originalLength - max,
22606            start = parseInt(range.start, 10) - offset;
22607        start = start > max ? max : start;
22608        end = start + parseInt(range.length, 10);
22609
22610        if (end > max) {
22611          end = max;
22612          this.log("End range automatically set to the max value of ".concat(max));
22613        }
22614
22615        if (start < 0 || end - start < 0 || start > max || end > max) {
22616          valid = false;
22617          this.log("Invalid range: ".concat(JSON.stringify(range)));
22618          this.opt.noMatch(range);
22619        } else if (string.substring(start, end).replace(/\s+/g, '') === '') {
22620          valid = false;
22621          this.log('Skipping whitespace only range: ' + JSON.stringify(range));
22622          this.opt.noMatch(range);
22623        }
22624
22625        return {
22626          start: start,
22627          end: end,
22628          valid: valid
22629        };
22630      }
22631    }, {
22632      key: "getTextNodes",
22633      value: function getTextNodes(cb) {
22634        var _this3 = this;
22635
22636        var val = '',
22637            nodes = [];
22638        this.iterator.forEachNode(NodeFilter.SHOW_TEXT, function (node) {
22639          nodes.push({
22640            start: val.length,
22641            end: (val += node.textContent).length,
22642            node: node
22643          });
22644        }, function (node) {
22645          if (_this3.matchesExclude(node.parentNode)) {
22646            return NodeFilter.FILTER_REJECT;
22647          } else {
22648            return NodeFilter.FILTER_ACCEPT;
22649          }
22650        }, function () {
22651          cb({
22652            value: val,
22653            nodes: nodes
22654          });
22655        });
22656      }
22657    }, {
22658      key: "matchesExclude",
22659      value: function matchesExclude(el) {
22660        return DOMIterator.matches(el, this.opt.exclude.concat(['script', 'style', 'title', 'head', 'html']));
22661      }
22662    }, {
22663      key: "wrapRangeInTextNode",
22664      value: function wrapRangeInTextNode(node, start, end) {
22665        var hEl = !this.opt.element ? 'mark' : this.opt.element,
22666            startNode = node.splitText(start),
22667            ret = startNode.splitText(end - start);
22668        var repl = document.createElement(hEl);
22669        repl.setAttribute('data-markjs', 'true');
22670
22671        if (this.opt.className) {
22672          repl.setAttribute('class', this.opt.className);
22673        }
22674
22675        repl.textContent = startNode.textContent;
22676        startNode.parentNode.replaceChild(repl, startNode);
22677        return ret;
22678      }
22679    }, {
22680      key: "wrapRangeInMappedTextNode",
22681      value: function wrapRangeInMappedTextNode(dict, start, end, filterCb, eachCb) {
22682        var _this4 = this;
22683
22684        dict.nodes.every(function (n, i) {
22685          var sibl = dict.nodes[i + 1];
22686
22687          if (typeof sibl === 'undefined' || sibl.start > start) {
22688            if (!filterCb(n.node)) {
22689              return false;
22690            }
22691
22692            var s = start - n.start,
22693                e = (end > n.end ? n.end : end) - n.start,
22694                startStr = dict.value.substr(0, n.start),
22695                endStr = dict.value.substr(e + n.start);
22696            n.node = _this4.wrapRangeInTextNode(n.node, s, e);
22697            dict.value = startStr + endStr;
22698            dict.nodes.forEach(function (k, j) {
22699              if (j >= i) {
22700                if (dict.nodes[j].start > 0 && j !== i) {
22701                  dict.nodes[j].start -= e;
22702                }
22703
22704                dict.nodes[j].end -= e;
22705              }
22706            });
22707            end -= e;
22708            eachCb(n.node.previousSibling, n.start);
22709
22710            if (end > n.end) {
22711              start = n.end;
22712            } else {
22713              return false;
22714            }
22715          }
22716
22717          return true;
22718        });
22719      }
22720    }, {
22721      key: "wrapGroups",
22722      value: function wrapGroups(node, pos, len, eachCb) {
22723        node = this.wrapRangeInTextNode(node, pos, pos + len);
22724        eachCb(node.previousSibling);
22725        return node;
22726      }
22727    }, {
22728      key: "separateGroups",
22729      value: function separateGroups(node, match, matchIdx, filterCb, eachCb) {
22730        var matchLen = match.length;
22731
22732        for (var i = 1; i < matchLen; i++) {
22733          var pos = node.textContent.indexOf(match[i]);
22734
22735          if (match[i] && pos > -1 && filterCb(match[i], node)) {
22736            node = this.wrapGroups(node, pos, match[i].length, eachCb);
22737          }
22738        }
22739
22740        return node;
22741      }
22742    }, {
22743      key: "wrapMatches",
22744      value: function wrapMatches(regex, ignoreGroups, filterCb, eachCb, endCb) {
22745        var _this5 = this;
22746
22747        var matchIdx = ignoreGroups === 0 ? 0 : ignoreGroups + 1;
22748        this.getTextNodes(function (dict) {
22749          dict.nodes.forEach(function (node) {
22750            node = node.node;
22751            var match;
22752
22753            while ((match = regex.exec(node.textContent)) !== null && match[matchIdx] !== '') {
22754              if (_this5.opt.separateGroups) {
22755                node = _this5.separateGroups(node, match, matchIdx, filterCb, eachCb);
22756              } else {
22757                if (!filterCb(match[matchIdx], node)) {
22758                  continue;
22759                }
22760
22761                var pos = match.index;
22762
22763                if (matchIdx !== 0) {
22764                  for (var i = 1; i < matchIdx; i++) {
22765                    pos += match[i].length;
22766                  }
22767                }
22768
22769                node = _this5.wrapGroups(node, pos, match[matchIdx].length, eachCb);
22770              }
22771
22772              regex.lastIndex = 0;
22773            }
22774          });
22775          endCb();
22776        });
22777      }
22778    }, {
22779      key: "wrapMatchesAcrossElements",
22780      value: function wrapMatchesAcrossElements(regex, ignoreGroups, filterCb, eachCb, endCb) {
22781        var _this6 = this;
22782
22783        var matchIdx = ignoreGroups === 0 ? 0 : ignoreGroups + 1;
22784        this.getTextNodes(function (dict) {
22785          var match;
22786
22787          while ((match = regex.exec(dict.value)) !== null && match[matchIdx] !== '') {
22788            var start = match.index;
22789
22790            if (matchIdx !== 0) {
22791              for (var i = 1; i < matchIdx; i++) {
22792                start += match[i].length;
22793              }
22794            }
22795
22796            var end = start + match[matchIdx].length;
22797
22798            _this6.wrapRangeInMappedTextNode(dict, start, end, function (node) {
22799              return filterCb(match[matchIdx], node);
22800            }, function (node, lastIndex) {
22801              regex.lastIndex = lastIndex;
22802              eachCb(node);
22803            });
22804          }
22805
22806          endCb();
22807        });
22808      }
22809    }, {
22810      key: "wrapRangeFromIndex",
22811      value: function wrapRangeFromIndex(ranges, filterCb, eachCb, endCb) {
22812        var _this7 = this;
22813
22814        this.getTextNodes(function (dict) {
22815          var originalLength = dict.value.length;
22816          ranges.forEach(function (range, counter) {
22817            var _this7$checkWhitespac = _this7.checkWhitespaceRanges(range, originalLength, dict.value),
22818                start = _this7$checkWhitespac.start,
22819                end = _this7$checkWhitespac.end,
22820                valid = _this7$checkWhitespac.valid;
22821
22822            if (valid) {
22823              _this7.wrapRangeInMappedTextNode(dict, start, end, function (node) {
22824                return filterCb(node, range, dict.value.substring(start, end), counter);
22825              }, function (node) {
22826                eachCb(node, range);
22827              });
22828            }
22829          });
22830          endCb();
22831        });
22832      }
22833    }, {
vendor: 4,784 bytes, lines 22834-22998
22834      key: "unwrapMatches",
22835      value: function unwrapMatches(node) {
22836        var parent = node.parentNode;
22837        var docFrag = document.createDocumentFragment();
22838
22839        while (node.firstChild) {
22840          docFrag.appendChild(node.removeChild(node.firstChild));
22841        }
22842
22843        parent.replaceChild(docFrag, node);
22844
22845        if (!this.ie) {
22846          parent.normalize();
22847        } else {
22848          this.normalizeTextNode(parent);
22849        }
22850      }
22851    }, {
22852      key: "normalizeTextNode",
22853      value: function normalizeTextNode(node) {
22854        if (!node) {
22855          return;
22856        }
22857
22858        if (node.nodeType === 3) {
22859          while (node.nextSibling && node.nextSibling.nodeType === 3) {
22860            node.nodeValue += node.nextSibling.nodeValue;
22861            node.parentNode.removeChild(node.nextSibling);
22862          }
22863        } else {
22864          this.normalizeTextNode(node.firstChild);
22865        }
22866
22867        this.normalizeTextNode(node.nextSibling);
22868      }
22869    }, {
22870      key: "markRegExp",
22871      value: function markRegExp(regexp, opt) {
22872        var _this8 = this;
22873
22874        this.opt = opt;
22875        this.log("Searching with expression \"".concat(regexp, "\""));
22876        var totalMatches = 0,
22877            fn = 'wrapMatches';
22878
22879        var eachCb = function eachCb(element) {
22880          totalMatches++;
22881
22882          _this8.opt.each(element);
22883        };
22884
22885        if (this.opt.acrossElements) {
22886          fn = 'wrapMatchesAcrossElements';
22887        }
22888
22889        this[fn](regexp, this.opt.ignoreGroups, function (match, node) {
22890          return _this8.opt.filter(node, match, totalMatches);
22891        }, eachCb, function () {
22892          if (totalMatches === 0) {
22893            _this8.opt.noMatch(regexp);
22894          }
22895
22896          _this8.opt.done(totalMatches);
22897        });
22898      }
22899    }, {
22900      key: "mark",
22901      value: function mark(sv, opt) {
22902        var _this9 = this;
22903
22904        this.opt = opt;
22905        var totalMatches = 0,
22906            fn = 'wrapMatches';
22907
22908        var _this$getSeparatedKey = this.getSeparatedKeywords(typeof sv === 'string' ? [sv] : sv),
22909            kwArr = _this$getSeparatedKey.keywords,
22910            kwArrLen = _this$getSeparatedKey.length,
22911            handler = function handler(kw) {
22912          var regex = new RegExpCreator(_this9.opt).create(kw);
22913          var matches = 0;
22914
22915          _this9.log("Searching with expression \"".concat(regex, "\""));
22916
22917          _this9[fn](regex, 1, function (term, node) {
22918            return _this9.opt.filter(node, kw, totalMatches, matches);
22919          }, function (element) {
22920            matches++;
22921            totalMatches++;
22922
22923            _this9.opt.each(element);
22924          }, function () {
22925            if (matches === 0) {
22926              _this9.opt.noMatch(kw);
22927            }
22928
22929            if (kwArr[kwArrLen - 1] === kw) {
22930              _this9.opt.done(totalMatches);
22931            } else {
22932              handler(kwArr[kwArr.indexOf(kw) + 1]);
22933            }
22934          });
22935        };
22936
22937        if (this.opt.acrossElements) {
22938          fn = 'wrapMatchesAcrossElements';
22939        }
22940
22941        if (kwArrLen === 0) {
22942          this.opt.done(totalMatches);
22943        } else {
22944          handler(kwArr[0]);
22945        }
22946      }
22947    }, {
22948      key: "markRanges",
22949      value: function markRanges(rawRanges, opt) {
22950        var _this10 = this;
22951
22952        this.opt = opt;
22953        var totalMatches = 0,
22954            ranges = this.checkRanges(rawRanges);
22955
22956        if (ranges && ranges.length) {
22957          this.log('Starting to mark with the following ranges: ' + JSON.stringify(ranges));
22958          this.wrapRangeFromIndex(ranges, function (node, range, match, counter) {
22959            return _this10.opt.filter(node, range, match, counter);
22960          }, function (element, range) {
22961            totalMatches++;
22962
22963            _this10.opt.each(element, range);
22964          }, function () {
22965            _this10.opt.done(totalMatches);
22966          });
22967        } else {
22968          this.opt.done(totalMatches);
22969        }
22970      }
22971    }, {
22972      key: "unmark",
22973      value: function unmark(opt) {
22974        var _this11 = this;
22975
22976        this.opt = opt;
22977        var sel = this.opt.element ? this.opt.element : '*';
22978        sel += '[data-markjs]';
22979
22980        if (this.opt.className) {
22981          sel += ".".concat(this.opt.className);
22982        }
22983
22984        this.log("Removal selector \"".concat(sel, "\""));
22985        this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT, function (node) {
22986          _this11.unwrapMatches(node);
22987        }, function (node) {
22988          var matchesSel = DOMIterator.matches(node, sel),
22989              matchesExclude = _this11.matchesExclude(node);
22990
22991          if (!matchesSel || matchesExclude) {
22992            return NodeFilter.FILTER_REJECT;
22993          } else {
22994            return NodeFilter.FILTER_ACCEPT;
22995          }
22996        }, this.opt.done);
22997      }
22998    }, {
22999      key: "opt",
23000      set: function set(val) {
23001        this._opt = _extends({}, {
23002          'element': '',
23003          'className': '',
23004          'exclude': [],
23005          'iframes': false,
23006          'iframesTimeout': 5000,
23007          'separateWordSearch': true,
23008          'acrossElements': false,
23009          'ignoreGroups': 0,
23010          'each': function each() {},
23011          'noMatch': function noMatch() {},
23012          'filter': function filter() {
23013            return true;
23014          },
23015          'done': function done() {},
23016          'debug': false,
23017          'log': window.console
23018        }, val);
23019      },
23020      get: function get() {
23021        return this._opt;
23022      }
23023    }, {
23024      key: "iterator",
23025      get: function get() {
23026        return new DOMIterator(this.ctx, this.opt.iframes, this.opt.exclude, this.opt.iframesTimeout);
23027      }
23028    }]);
23029
23030    return Mark;
23031  }();
23032
23033  function Mark$1(ctx) {
23034    var _this = this;
23035
23036    var instance = new Mark(ctx);
23037
23038    this.mark = function (sv, opt) {
23039      instance.mark(sv, opt);
23040      return _this;
23041    };
23042
23043    this.markRegExp = function (sv, opt) {
23044      instance.markRegExp(sv, opt);
23045      return _this;
23046    };
23047
23048    this.markRanges = function (sv, opt) {
23049      instance.markRanges(sv, opt);
23050      return _this;
23051    };
23052
23053    this.unmark = function (opt) {
23054      instance.unmark(opt);
23055      return _this;
23056    };
23057
23058    return this;
23059  }
23060
23061  return Mark$1;
23062
23063})));
23064
23065$(function() {
23066  var $input = $("input[name='keyword']"),
23067    $context = $(".search_content details"),
23068    $clearBtn = $("button[data-search='clear']"),
23069    instance = new Mark(document.querySelector(".search_content"));
23070  
23071  $input.on("input", function() {
23072    var term = $(this).val();
23073    if (term.length > 0) 
23074		$clearBtn.css('display', 'inline-flex');
23075	else
23076		$clearBtn.hide();
23077    $context.show();
23078	instance.unmark();
23079	$(".search_content details").prop("open", false);
23080    if (term) {
23081      instance.mark(term, {
23082        done: function() {
23083         $(".search_content details").not(":has(mark)").hide();
23084		$(".search_content details").prop("open", true);
23085        }
23086      });
23087    }
23088  });
23089
23090  $clearBtn.on("click", function() {
23091	$clearBtn.hide();
23092    instance.unmark();
23093	$(".search_content details").prop("open", false);
23094	$context.show();
23095    $input.val("").focus();
23096  });
23097
23098// -- 
23099
23100  var $input_oldprojects = $("#c6821 input[name='q']"),
23101  $context_oldprojects = $("#c6821 .accordion--search p"),
23102  $clearBtn_oldprojects = $("#c6821 button[data-search='clear']"),
23103  instance_oldprojects = new Mark(document.querySelector("#c6821 .accordion"));
23104
23105$input_oldprojects.on("input", function() {
23106  var term = $(this).val();
23107
23108  if (term.length > 0) 
23109  $clearBtn_oldprojects.css('display', 'inline-flex');
23110else
23111  $clearBtn_oldprojects.hide();
23112
23113  $context_oldprojects.show();
23114  instance_oldprojects.unmark();
23115  if (term) {
23116    instance_oldprojects.mark(term, {
23117      done: function() {
23118       $("#c6821 .accordion--search p:not(:has(mark))").hide();
23119      }
23120    });
23121  }
23122});
23123
23124$clearBtn_oldprojects.on("click", function() {
23125	$clearBtn_oldprojects.hide();
23126  instance_oldprojects.unmark();
23127	  $context_oldprojects.show();
23128    $input_oldprojects.val("").focus();
23129  });
23130
23131
23132  $("input#theme66").click(function(){
23133    $("input#theme31").prop("checked", $("input#theme66").prop("checked"));
23134  });
23135
23136
23137});
23138
23139
23140
23141/*
23142 * This combined file was created by the DataTables downloader builder:
23143 *   https://datatables.net/download
23144 *
23145 * To rebuild or modify this file with the latest versions of the included
23146 * software please visit:
23147 *   https://datatables.net/download/#dt/dt-1.13.4
23148 *
23149 * Included libraries:
23150 *   DataTables 1.13.4
23151 */
23152
23153/*! DataTables 1.13.4
23154 * ©2008-2023 SpryMedia Ltd - datatables.net/license
23155 */
23156!function(n){"use strict";var a;"function"==typeof define&&define.amd?define(["jquery"],function(t){return n(t,window,document)}):"object"==typeof exports?(a=require("jquery"),"undefined"!=typeof window?module.exports=function(t,e){return t=t||window,e=e||a(t),n(e,t,t.document)}:n(a,window,window.document)):window.DataTable=n(jQuery,window,document)}(function(P,j,y,N){"use strict";function d(t){var e=parseInt(t,10);return!isNaN(e)&&isFinite(t)?e:null}function l(t,e,n){var a=typeof t,r="string"==a;return"number"==a||"bigint"==a||!!h(t)||(e&&r&&(t=G(t,e)),n&&r&&(t=t.replace(q,"")),!isNaN(parseFloat(t))&&isFinite(t))}function a(t,e,n){var a;return!!h(t)||(h(a=t)||"string"==typeof a)&&!!l(t.replace(V,""),e,n)||null}function m(t,e,n,a){var r=[],o=0,i=e.length;if(a!==N)for(;o<i;o++)t[e[o]][n]&&r.push(t[e[o]][n][a]);else for(;o<i;o++)r.push(t[e[o]][n]);return r}function f(t,e){var n,a=[];e===N?(e=0,n=t):(n=e,e=t);for(var r=e;r<n;r++)a.push(r);return a}function _(t){for(var e=[],n=0,a=t.length;n<a;n++)t[n]&&e.push(t[n]);return e}function s(t,e){return-1!==this.indexOf(t,e=e===N?0:e)}var p,e,t,w=function(t,v){if(w.factory(t,v))return w;if(this instanceof w)return P(t).DataTable(v);v=t,this.$=function(t,e){return this.api(!0).$(t,e)},this._=function(t,e){return this.api(!0).rows(t,e).data()},this.api=function(t){return new B(t?ge(this[p.iApiIndex]):this)},this.fnAddData=function(t,e){var n=this.api(!0),t=(Array.isArray(t)&&(Array.isArray(t[0])||P.isPlainObject(t[0]))?n.rows:n.row).add(t);return e!==N&&!e||n.draw(),t.flatten().toArray()}
vendor: 21,685 bytes, line 23156
23156,this.fnAdjustColumnSizing=function(t){var e=this.api(!0).columns.adjust(),n=e.settings()[0],a=n.oScroll;t===N||t?e.draw(!1):""===a.sX&&""===a.sY||Qt(n)},this.fnClearTable=function(t){var e=this.api(!0).clear();t!==N&&!t||e.draw()},this.fnClose=function(t){this.api(!0).row(t).child.hide()},this.fnDeleteRow=function(t,e,n){var a=this.api(!0),t=a.rows(t),r=t.settings()[0],o=r.aoData[t[0][0]];return t.remove(),e&&e.call(this,r,o),n!==N&&!n||a.draw(),o},this.fnDestroy=function(t){this.api(!0).destroy(t)},this.fnDraw=function(t){this.api(!0).draw(t)},this.fnFilter=function(t,e,n,a,r,o){var i=this.api(!0);(null===e||e===N?i:i.column(e)).search(t,n,a,o),i.draw()},this.fnGetData=function(t,e){var n,a=this.api(!0);return t!==N?(n=t.nodeName?t.nodeName.toLowerCase():"",e!==N||"td"==n||"th"==n?a.cell(t,e).data():a.row(t).data()||null):a.data().toArray()},this.fnGetNodes=function(t){var e=this.api(!0);return t!==N?e.row(t).node():e.rows().nodes().flatten().toArray()},this.fnGetPosition=function(t){var e=this.api(!0),n=t.nodeName.toUpperCase();return"TR"==n?e.row(t).index():"TD"==n||"TH"==n?[(n=e.cell(t).index()).row,n.columnVisible,n.column]:null},this.fnIsOpen=function(t){return this.api(!0).row(t).child.isShown()},this.fnOpen=function(t,e,n){return this.api(!0).row(t).child(e,n).show().child()[0]},this.fnPageChange=function(t,e){t=this.api(!0).page(t);e!==N&&!e||t.draw(!1)},this.fnSetColumnVis=function(t,e,n){t=this.api(!0).column(t).visible(e);n!==N&&!n||t.columns.adjust().draw()},this.fnSettings=function(){return ge(this[p.iApiIndex])},this.fnSort=function(t){this.api(!0).order(t).draw()},this.fnSortListener=function(t,e,n){this.api(!0).order.listener(t,e,n)},this.fnUpdate=function(t,e,n,a,r){var o=this.api(!0);return(n===N||null===n?o.row(e):o.cell(e,n)).data(t),r!==N&&!r||o.columns.adjust(),a!==N&&!a||o.draw(),0},this.fnVersionCheck=p.fnVersionCheck;var e,y=this,D=v===N,_=this.length;for(e in D&&(v={}),this.oApi=this.internal=p.internal,w.ext.internal)e&&(this[e]=Ge(e));return this.each(function(){var r=1<_?be({},v,!0):v,o=0,t=this.getAttribute("id"),i=!1,e=w.defaults,l=P(this);if("table"!=this.nodeName.toLowerCase())W(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{K(e),Q(e.column),C(e,e,!0),C(e.column,e.column,!0),C(e,P.extend(r,l.data()),!0);for(var n=w.settings,o=0,s=n.length;o<s;o++){var a=n[o];if(a.nTable==this||a.nTHead&&a.nTHead.parentNode==this||a.nTFoot&&a.nTFoot.parentNode==this){var u=(r.bRetrieve!==N?r:e).bRetrieve,c=(r.bDestroy!==N?r:e).bDestroy;if(D||u)return a.oInstance;if(c){a.oInstance.fnDestroy();break}return void W(a,0,"Cannot reinitialise DataTable",3)}if(a.sTableId==this.id){n.splice(o,1);break}}null!==t&&""!==t||(t="DataTables_Table_"+w.ext._unique++,this.id=t);var f,d,h=P.extend(!0,{},w.models.oSettings,{sDestroyWidth:l[0].style.width,sInstance:t,sTableId:t}),p=(h.nTable=this,h.oApi=y.internal,h.oInit=r,n.push(h),h.oInstance=1===y.length?y:l.dataTable(),K(r),Z(r.oLanguage),r.aLengthMenu&&!r.iDisplayLength&&(r.iDisplayLength=(Array.isArray(r.aLengthMenu[0])?r.aLengthMenu[0]:r.aLengthMenu)[0]),r=be(P.extend(!0,{},e),r),F(h.oFeatures,r,["bPaginate","bLengthChange","bFilter","bSort","bSortMulti","bInfo","bProcessing","bAutoWidth","bSortClasses","bServerSide","bDeferRender"]),F(h,r,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"]]),F(h.oScroll,r,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]),F(h.oLanguage,r,"fnInfoCallback"),L(h,"aoDrawCallback",r.fnDrawCallback,"user"),L(h,"aoServerParams",r.fnServerParams,"user"),L(h,"aoStateSaveParams",r.fnStateSaveParams,"user"),L(h,"aoStateLoadParams",r.fnStateLoadParams,"user"),L(h,"aoStateLoaded",r.fnStateLoaded,"user"),L(h,"aoRowCallback",r.fnRowCallback,"user"),L(h,"aoRowCreatedCallback",r.fnCreatedRow,"user"),L(h,"aoHeaderCallback",r.fnHeaderCallback,"user"),L(h,"aoFooterCallback",r.fnFooterCallback,"user"),L(h,"aoInitComplete",r.fnInitComplete,"user"),L(h,"aoPreDrawCallback",r.fnPreDrawCallback,"user"),h.rowIdFn=A(r.rowId),tt(h),h.oClasses),g=(P.extend(p,w.ext.classes,r.oClasses),l.addClass(p.sTable),h.iInitDisplayStart===N&&(h.iInitDisplayStart=r.iDisplayStart,h._iDisplayStart=r.iDisplayStart),null!==r.iDeferLoading&&(h.bDeferLoading=!0,t=Array.isArray(r.iDeferLoading),h._iRecordsDisplay=t?r.iDeferLoading[0]:r.iDeferLoading,h._iRecordsTotal=t?r.iDeferLoading[1]:r.iDeferLoading),h.oLanguage),t=(P.extend(!0,g,r.oLanguage),g.sUrl?(P.ajax({dataType:"json",url:g.sUrl,success:function(t){C(e.oLanguage,t),Z(t),P.extend(!0,g,t,h.oInit.oLanguage),R(h,null,"i18n",[h]),Jt(h)},error:function(){Jt(h)}}),i=!0):R(h,null,"i18n",[h]),null===r.asStripeClasses&&(h.asStripeClasses=[p.sStripeOdd,p.sStripeEven]),h.asStripeClasses),b=l.children("tbody").find("tr").eq(0),m=(-1!==P.inArray(!0,P.map(t,function(t,e){return b.hasClass(t)}))&&(P("tbody tr",this).removeClass(t.join(" ")),h.asDestroyStripes=t.slice()),[]),t=this.getElementsByTagName("thead");if(0!==t.length&&(wt(h.aoHeader,t[0]),m=Ct(h)),null===r.aoColumns)for(f=[],o=0,s=m.length;o<s;o++)f.push(null);else f=r.aoColumns;for(o=0,s=f.length;o<s;o++)nt(h,m?m[o]:null);st(h,r.aoColumnDefs,f,function(t,e){at(h,t,e)}),b.length&&(d=function(t,e){return null!==t.getAttribute("data-"+e)?e:null},P(b[0]).children("th, td").each(function(t,e){var n,a=h.aoColumns[t];a||W(h,0,"Incorrect column count",18),a.mData===t&&(n=d(e,"sort")||d(e,"order"),e=d(e,"filter")||d(e,"search"),null===n&&null===e||(a.mData={_:t+".display",sort:null!==n?t+".@data-"+n:N,type:null!==n?t+".@data-"+n:N,filter:null!==e?t+".@data-"+e:N},a._isArrayHost=!0,at(h,t)))}));var S=h.oFeatures,t=function(){if(r.aaSorting===N){var t=h.aaSorting;for(o=0,s=t.length;o<s;o++)t[o][1]=h.aoColumns[o].asSorting[0]}ce(h),S.bSort&&L(h,"aoDrawCallback",function(){var t,n;h.bSorted&&(t=I(h),n={},P.each(t,function(t,e){n[e.src]=e.dir}),R(h,null,"order",[h,t,n]),le(h))}),L(h,"aoDrawCallback",function(){(h.bSorted||"ssp"===E(h)||S.bDeferRender)&&ce(h)},"sc");var e=l.children("caption").each(function(){this._captionSide=P(this).css("caption-side")}),n=l.children("thead"),a=(0===n.length&&(n=P("<thead/>").appendTo(l)),h.nTHead=n[0],l.children("tbody")),n=(0===a.length&&(a=P("<tbody/>").insertAfter(n)),h.nTBody=a[0],l.children("tfoot"));if(0===(n=0===n.length&&0<e.length&&(""!==h.oScroll.sX||""!==h.oScroll.sY)?P("<tfoot/>").appendTo(l):n).length||0===n.children().length?l.addClass(p.sNoFooter):0<n.length&&(h.nTFoot=n[0],wt(h.aoFooter,h.nTFoot)),r.aaData)for(o=0;o<r.aaData.length;o++)x(h,r.aaData[o]);else!h.bDeferLoading&&"dom"!=E(h)||ut(h,P(h.nTBody).children("tr"));h.aiDisplay=h.aiDisplayMaster.slice(),!(h.bInitialised=!0)===i&&Jt(h)};L(h,"aoDrawCallback",de,"state_save"),r.bStateSave?(S.bStateSave=!0,he(h,0,t)):t()}}),y=null,this},c={},U=/[\r\n\u2028]/g,V=/<.*?>/g,X=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,J=new RegExp("(\\"+["/",".","*","+","?","|","(",")","[","]","{","}","\\","$","^","-"].join("|\\")+")","g"),q=/['\u00A0,$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,h=function(t){return!t||!0===t||"-"===t},G=function(t,e){return c[e]||(c[e]=new RegExp(Ot(e),"g")),"string"==typeof t&&"."!==e?t.replace(/\./g,"").replace(c[e],"."):t},H=function(t,e,n){var a=[],r=0,o=t.length;if(n!==N)for(;r<o;r++)t[r]&&t[r][e]&&a.push(t[r][e][n]);else for(;r<o;r++)t[r]&&a.push(t[r][e]);return a},$=function(t){if(!(t.length<2))for(var e=t.slice().sort(),n=e[0],a=1,r=e.length;a<r;a++){if(e[a]===n)return!1;n=e[a]}return!0},z=function(t){if($(t))return t.slice();var e,n,a,r=[],o=t.length,i=0;t:for(n=0;n<o;n++){for(e=t[n],a=0;a<i;a++)if(r[a]===e)continue t;r.push(e),i++}return r},Y=function(t,e){if(Array.isArray(e))for(var n=0;n<e.length;n++)Y(t,e[n]);else t.push(e);return t};function i(n){var a,r,o={};P.each(n,function(t,e){(a=t.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(a[1]+" ")&&(r=t.replace(a[0],a[2].toLowerCase()),o[r]=t,"o"===a[1])&&i(n[t])}),n._hungarianMap=o}function C(n,a,r){var o;n._hungarianMap||i(n),P.each(a,function(t,e){(o=n._hungarianMap[t])===N||!r&&a[o]!==N||("o"===o.charAt(0)?(a[o]||(a[o]={}),P.extend(!0,a[o],a[t]),C(n[o],a[o],r)):a[o]=a[t])})}function Z(t){var e,n=w.defaults.oLanguage,a=n.sDecimal;a&&Me(a),t&&(e=t.sZeroRecords,!t.sEmptyTable&&e&&"No data available in table"===n.sEmptyTable&&F(t,t,"sZeroRecords","sEmptyTable"),!t.sLoadingRecords&&e&&"Loading..."===n.sLoadingRecords&&F(t,t,"sZeroRecords","sLoadingRecords"),t.sInfoThousands&&(t.sThousands=t.sInfoThousands),e=t.sDecimal)&&a!==e&&Me(e)}Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)}),Array.prototype.includes||(Array.prototype.includes=s),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),String.prototype.includes||(String.prototype.includes=s),w.util={throttle:function(a,t){var r,o,i=t!==N?t:200;return function(){var t=this,e=+new Date,n=arguments;r&&e<r+i?(clearTimeout(o),o=setTimeout(function(){r=N,a.apply(t,n)},i)):(r=e,a.apply(t,n))}},escapeRegex:function(t){return t.replace(J,"\\$1")},set:function(a){var d;return P.isPlainObject(a)?w.util.set(a._):null===a?function(){}:"function"==typeof a?function(t,e,n){a(t,"set",e,n)}:"string"!=typeof a||-1===a.indexOf(".")&&-1===a.indexOf("[")&&-1===a.indexOf("(")?function(t,e){t[a]=e}:(d=function(t,e,n){for(var a,r,o,i,l=dt(n),n=l[l.length-1],s=0,u=l.length-1;s<u;s++){if("__proto__"===l[s]||"constructor"===l[s])throw new Error("Cannot set prototype values");if(a=l[s].match(ft),r=l[s].match(g),a){if(l[s]=l[s].replace(ft,""),t[l[s]]=[],(a=l.slice()).splice(0,s+1),i=a.join("."),Array.isArray(e))for(var c=0,f=e.length;c<f;c++)d(o={},e[c],i),t[l[s]].push(o);else t[l[s]]=e;return}r&&(l[s]=l[s].replace(g,""),t=t[l[s]](e)),null!==t[l[s]]&&t[l[s]]!==N||(t[l[s]]={}),t=t[l[s]]}n.match(g)?t[n.replace(g,"")](e):t[n.replace(ft,"")]=e},function(t,e){return d(t,e,a)})},get:function(r){var o,d;return P.isPlainObject(r)?(o={},P.each(r,function(t,e){e&&(o[t]=w.util.get(e))}),function(t,e,n,a){var r=o[e]||o._;return r!==N?r(t,e,n,a):t}):null===r?function(t){return t}:"function"==typeof r?function(t,e,n,a){return r(t,e,n,a)}:"string"!=typeof r||-1===r.indexOf(".")&&-1===r.indexOf("[")&&-1===r.indexOf("(")?function(t,e){return t[r]}:(d=function(t,e,n){var a,r,o;if(""!==n)for(var i=dt(n),l=0,s=i.length;l<s;l++){if(f=i[l].match(ft),a=i[l].match(g),f){if(i[l]=i[l].replace(ft,""),""!==i[l]&&(t=t[i[l]]),r=[],i.splice(0,l+1),o=i.join("."),Array.isArray(t))for(var u=0,c=t.length;u<c;u++)r.push(d(t[u],e,o));var f=f[0].substring(1,f[0].length-1);t=""===f?r:r.join(f);break}if(a)i[l]=i[l].replace(g,""),t=t[i[l]]();else{if(null===t||t[i[l]]===N)return N;t=t[i[l]]}}return t},function(t,e){return d(t,e,r)})}};var r=function(t,e,n){t[e]!==N&&(t[n]=t[e])};function K(t){r(t,"ordering","bSort"),r(t,"orderMulti","bSortMulti"),r(t,"orderClasses","bSortClasses"),r(t,"orderCellsTop","bSortCellsTop"),r(t,"order","aaSorting"),r(t,"orderFixed","aaSortingFixed"),r(t,"paging","bPaginate"),r(t,"pagingType","sPaginationType"),r(t,"pageLength","iDisplayLength"),r(t,"searching","bFilter"),"boolean"==typeof t.sScrollX&&(t.sScrollX=t.sScrollX?"100%":""),"boolean"==typeof t.scrollX&&(t.scrollX=t.scrollX?"100%":"");var e=t.aoSearchCols;if(e)for(var n=0,a=e.length;n<a;n++)e[n]&&C(w.models.oSearch,e[n])}function Q(t){r(t,"orderable","bSortable"),r(t,"orderData","aDataSort"),r(t,"orderSequence","asSorting"),r(t,"orderDataType","sortDataType");var e=t.aDataSort;"number"!=typeof e||Array.isArray(e)||(t.aDataSort=[e])}function tt(t){var e,n,a,r;w.__browser||(w.__browser=e={},r=(a=(n=P("<div/>").css({position:"fixed",top:0,left:-1*P(j).scrollLeft(),height:1,width:1,overflow:"hidden"}).append(P("<div/>").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(P("<div/>").css({width:"100%",height:10}))).appendTo("body")).children()).children(),e.barWidth=a[0].offsetWidth-a[0].clientWidth,e.bScrollOversize=100===r[0].offsetWidth&&100!==a[0].clientWidth,e.bScrollbarLeft=1!==Math.round(r.offset().left),e.bBounding=!!n[0].getBoundingClientRect().width,n.remove()),P.extend(t.oBrowser,w.__browser),t.oScroll.iBarWidth=w.__browser.barWidth}function et(t,e,n,a,r,o){var i,l=a,s=!1;for(n!==N&&(i=n,s=!0);l!==r;)t.hasOwnProperty(l)&&(i=s?e(i,t[l],l,t):t[l],s=!0,l+=o);return i}function nt(t,e){var n=w.defaults.column,a=t.aoColumns.length,n=P.extend({},w.models.oColumn,n,{nTh:e||y.createElement("th"),sTitle:n.sTitle||(e?e.innerHTML:""),aDataSort:n.aDataSort||[a],mData:n.mData||a,idx:a}),n=(t.aoColumns.push(n),t.aoPreSearchCols);n[a]=P.extend({},w.models.oSearch,n[a]),at(t,a,P(e).data())}function at(t,e,n){function a(t){return"string"==typeof t&&-1!==t.indexOf("@")}var e=t.aoColumns[e],r=t.oClasses,o=P(e.nTh),i=(!e.sWidthOrig&&(e.sWidthOrig=o.attr("width")||null,u=(o.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/))&&(e.sWidthOrig=u[1]),n!==N&&null!==n&&(Q(n),C(w.defaults.column,n,!0),n.mDataProp===N||n.mData||(n.mData=n.mDataProp),n.sType&&(e._sManualType=n.sType),n.className&&!n.sClass&&(n.sClass=n.className),n.sClass&&o.addClass(n.sClass),u=e.sClass,P.extend(e,n),F(e,n,"sWidth","sWidthOrig"),u!==e.sClass&&(e.sClass=u+" "+e.sClass),n.iDataSort!==N&&(e.aDataSort=[n.iDataSort]),F(e,n,"aDataSort")),e.mData),l=A(i),s=e.mRender?A(e.mRender):null,u=(e._bAttrSrc=P.isPlainObject(i)&&(a(i.sort)||a(i.type)||a(i.filter)),e._setter=null,e.fnGetData=function(t,e,n){var a=l(t,e,N,n);return s&&e?s(a,e,t,n):a},e.fnSetData=function(t,e,n){return b(i)(t,e,n)},"number"==typeof i||e._isArrayHost||(t._rowReadObject=!0),t.oFeatures.bSort||(e.bSortable=!1,o.addClass(r.sSortableNone)),-1!==P.inArray("asc",e.asSorting)),n=-1!==P.inArray("desc",e.asSorting);e.bSortable&&(u||n)?u&&!n?(e.sSortingClass=r.sSortableAsc,e.sSortingClassJUI=r.sSortJUIAscAllowed):!u&&n?(e.sSortingClass=r.sSortableDesc,e.sSortingClassJUI=r.sSortJUIDescAllowed):(e.sSortingClass=r.sSortable,e.sSortingClassJUI=r.sSortJUI):(e.sSortingClass=r.sSortableNone,e.sSortingClassJUI="")}function O(t){if(!1!==t.oFeatures.bAutoWidth){var e=t.aoColumns;ee(t);for(var n=0,a=e.length;n<a;n++)e[n].nTh.style.width=e[n].sWidth}var r=t.oScroll;""===r.sY&&""===r.sX||Qt(t),R(t,null,"column-sizing",[t])}function rt(t,e){t=it(t,"bVisible");return"number"==typeof t[e]?t[e]:null}function ot(t,e){t=it(t,"bVisible"),e=P.inArray(e,t);return-1!==e?e:null}function T(t){var n=0;return P.each(t.aoColumns,function(t,e){e.bVisible&&"none"!==P(e.nTh).css("display")&&n++}),n}function it(t,n){var a=[];return P.map(t.aoColumns,function(t,e){t[n]&&a.push(e)}),a}function lt(t){for(var e,n,a,r,o,i,l,s=t.aoColumns,u=t.aoData,c=w.ext.type.detect,f=0,d=s.length;f<d;f++)if(l=[],!(o=s[f]).sType&&o._sManualType)o.sType=o._sManualType;else if(!o.sType){for(e=0,n=c.length;e<n;e++){for(a=0,r=u.length;a<r&&(l[a]===N&&(l[a]=S(t,a,f,"type")),(i=c[e](l[a],t))||e===c.length-1)&&("html"!==i||h(l[a]));a++);if(i){o.sType=i;break}}o.sType||(o.sType="string")}}function st(t,e,n,a){var r,o,i,l,s=t.aoColumns;if(e)for(r=e.length-1;0<=r;r--)for(var u,c=(u=e[r]).target!==N?u.target:u.targets!==N?u.targets:u.aTargets,f=0,d=(c=Array.isArray(c)?c:[c]).length;f<d;f++)if("number"==typeof c[f]&&0<=c[f]){for(;s.length<=c[f];)nt(t);a(c[f],u)}else if("number"==typeof c[f]&&c[f]<0)a(s.length+c[f],u);else if("string"==typeof c[f])for(i=0,l=s.length;i<l;i++)"_all"!=c[f]&&!P(s[i].nTh).hasClass(c[f])||a(i,u);if(n)for(r=0,o=n.length;r<o;r++)a(r,n[r])}function x(t,e,n,a){for(var r=t.aoData.length,o=P.extend(!0,{},w.models.oRow,{src:n?"dom":"data",idx:r}),i=(o._aData=e,t.aoData.push(o),t.aoColumns),l=0,s=i.length;l<s;l++)i[l].sType=null;t.aiDisplayMaster.push(r);e=t.rowIdFn(e);return e!==N&&(t.aIds[e]=o),!n&&t.oFeatures.bDeferRender||St(t,r,n,a),r}function ut(n,t){var a;return(t=t instanceof P?t:P(t)).map(function(t,e){return a=mt(n,e),x(n,a.data,e,a.cells)})}function S(t,e,n,a){"search"===a?a="filter":"order"===a&&(a="sort");var r=t.iDraw,o=t.aoColumns[n],i=t.aoData[e]._aData,l=o.sDefaultContent,s=o.fnGetData(i,a,{settings:t,row:e,col:n});if(s===N)return t.iDrawError!=r&&null===l&&(W(t,0,"Requested unknown parameter "+("function"==typeof o.mData?"{function}":"'"+o.mData+"'")+" for row "+e+", column "+n,4),t.iDrawError=r),l;if(s!==i&&null!==s||null===l||a===N){if("function"==typeof s)return s.call(i)}else s=l;return null===s&&"display"===a?"":"filter"===a&&(e=w.ext.type.search)[o.sType]?e[o.sType](s):s}function ct(t,e,n,a){var r=t.aoColumns[n],o=t.aoData[e]._aData;r.fnSetData(o,a,{settings:t,row:e,col:n})}var ft=/\[.*?\]$/,g=/\(\)$/;function dt(t){return P.map(t.match(/(\\.|[^\.])+/g)||[""],function(t){return t.replace(/\\\./g,".")})}var A=w.util.get,b=w.util.set;function ht(t){return H(t.aoData,"_aData")}function pt(t){t.aoData.length=0,t.aiDisplayMaster.length=0,t.aiDisplay.length=0,t.aIds={}}function gt(t,e,n){for(var a=-1,r=0,o=t.length;r<o;r++)t[r]==e?a=r:t[r]>e&&t[r]--;-1!=a&&n===N&&t.splice(a,1)}function bt(n,a,t,e){function r(t,e){for(;t.childNodes.length;)t.removeChild(t.firstChild);t.innerHTML=S(n,a,e,"display")}var o,i,l=n.aoData[a];if("dom"!==t&&(t&&"auto"!==t||"dom"!==l.src)){var s=l.anCells;if(s)if(e!==N)r(s[e],e);else for(o=0,i=s.length;o<i;o++)r(s[o],o)}else l._aData=mt(n,l,e,e===N?N:l._aData).data;l._aSortData=null,l._aFilterData=null;var u=n.aoColumns;if(e!==N)u[e].sType=null;else{for(o=0,i=u.length;o<i;o++)u[o].sType=null;vt(n,l)}}function mt(t,e,n,a){function r(t,e){var n;"string"==typeof t&&-1!==(n=t.indexOf("@"))&&(n=t.substring(n+1),b(t)(a,e.getAttribute(n)))}function o(t){n!==N&&n!==f||(l=d[f],s=t.innerHTML.trim(),l&&l._bAttrSrc?(b(l.mData._)(a,s),r(l.mData.sort,t),r(l.mData.type,t),r(l.mData.filter,t)):h?(l._setter||(l._setter=b(l.mData)),l._setter(a,s)):a[f]=s),f++}var i,l,s,u=[],c=e.firstChild,f=0,d=t.aoColumns,h=t._rowReadObject;a=a!==N?a:h?{}:[];if(c)for(;c;)"TD"!=(i=c.nodeName.toUpperCase())&&"TH"!=i||(o(c),u.push(c)),c=c.nextSibling;else for(var p=0,g=(u=e.anCells).length;p<g;p++)o(u[p]);var e=e.firstChild?e:e.nTr;return e&&(e=e.getAttribute("id"))&&b(t.rowId)(a,e),{data:a,cells:u}}function St(t,e,n,a){var r,o,i,l,s,u,c=t.aoData[e],f=c._aData,d=[];if(null===c.nTr){for(r=n||y.createElement("tr"),c.nTr=r,c.anCells=d,r._DT_RowIndex=e,vt(t,c),l=0,s=t.aoColumns.length;l<s;l++)i=t.aoColumns[l],(o=(u=!n)?y.createElement(i.sCellType):a[l])||W(t,0,"Incorrect column count",18),o._DT_CellIndex={row:e,column:l},d.push(o),!u&&(!i.mRender&&i.mData===l||P.isPlainObject(i.mData)&&i.mData._===l+".display")||(o.innerHTML=S(t,e,l,"display")),i.sClass&&(o.className+=" "+i.sClass),i.bVisible&&!n?r.appendChild(o):!i.bVisible&&n&&o.parentNode.removeChild(o),i.fnCreatedCell&&i.fnCreatedCell.call(t.oInstance,o,S(t,e,l),f,e,l);R(t,"aoRowCreatedCallback",null,[r,f,e,d])}}function vt(t,e){var n=e.nTr,a=e._aData;n&&((t=t.rowIdFn(a))&&(n.id=t),a.DT_RowClass&&(t=a.DT_RowClass.split(" "),e.__rowc=e.__rowc?z(e.__rowc.concat(t)):t,P(n).removeClass(e.__rowc.join(" ")).addClass(a.DT_RowClass)),a.DT_RowAttr&&P(n).attr(a.DT_RowAttr),a.DT_RowData)&&P(n).data(a.DT_RowData)}function yt(t){var e,n,a,r=t.nTHead,o=t.nTFoot,i=0===P("th, td",r).length,l=t.oClasses,s=t.aoColumns;for(i&&(n=P("<tr/>").appendTo(r)),c=0,f=s.length;c<f;c++)a=s[c],e=P(a.nTh).addClass(a.sClass),i&&e.appendTo(n),t.oFeatures.bSort&&(e.addClass(a.sSortingClass),!1!==a.bSortable)&&(e.attr("tabindex",t.iTabIndex).attr("aria-controls",t.sTableId),ue(t,a.nTh,c)),a.sTitle!=e[0].innerHTML&&e.html(a.sTitle),ve(t,"header")(t,e,a,l);if(i&&wt(t.aoHeader,r),P(r).children("tr").children("th, td").addClass(l.sHeaderTH),P(o).children("tr").children("th, td").addClass(l.sFooterTH),null!==o)for(var u=t.aoFooter[0],c=0,f=u.length;c<f;c++)(a=s[c])?(a.nTf=u[c].cell,a.sClass&&P(a.nTf).addClass(a.sClass)):W(t,0,"Incorrect column count",18)}function Dt(t,e,n){var a,r,o,i,l,s,u,c,f,d=[],h=[],p=t.aoColumns.length;if(e){for(n===N&&(n=!1),a=0,r=e.length;a<r;a++){for(d[a]=e[a].slice(),d[a].nTr=e[a].nTr,o=p-1;0<=o;o--)t.aoColumns[o].bVisible||n||d[a].splice(o,1);h.push([])}for(a=0,r=d.length;a<r;a++){if(u=d[a].nTr)for(;s=u.firstChild;)u.removeChild(s);for(o=0,i=d[a].length;o<i;o++)if(f=c=1,h[a][o]===N){for(u.appendChild(d[a][o].cell),h[a][o]=1;d[a+c]!==N&&d[a][o].cell==d[a+c][o].cell;)h[a+c][o]=1,c++;for(;d[a][o+f]!==N&&d[a][o].cell==d[a][o+f].cell;){for(l=0;l<c;l++)h[a+l][o+f]=1;f++}P(d[a][o].cell).attr("rowspan",c).attr("colspan",f)}}}}function v(t,e){n="ssp"==E(s=t),(l=s.iInitDisplayStart)!==N&&-1!==l&&(s._iDisplayStart=!n&&l>=s.fnRecordsDisplay()?0:l,s.iInitDisplayStart=-1);var n=R(t,"aoPreDrawCallback","preDraw",[t]);if(-1!==P.inArray(!1,n))D(t,!1);else{var a=[],r=0,o=t.asStripeClasses,i=o.length,l=t.oLanguage,s="ssp"==E(t),u=t.aiDisplay,n=t._iDisplayStart,c=t.fnDisplayEnd();if(t.bDrawing=!0,t.bDeferLoading)t.bDeferLoading=!1,t.iDraw++,D(t,!1);else if(s){if(!t.bDestroying&&!e)return void xt(t)}else t.iDraw++;if(0!==u.length)for(var f=s?t.aoData.length:c,d=s?0:n;d<f;d++){var h,p=u[d],g=t.aoData[p],b=(null===g.nTr&&St(t,p),g.nTr);0!==i&&(h=o[r%i],g._sRowStripe!=h)&&(P(b).removeClass(g._sRowStripe).addClass(h),g._sRowStripe=h),R(t,"aoRowCallback",null,[b,g._aData,r,d,p]),a.push(b),r++}else{e=l.sZeroRecords;1==t.iDraw&&"ajax"==E(t)?e=l.sLoadingRecords:l.sEmptyTable&&0===t.fnRecordsTotal()&&(e=l.sEmptyTable),a[0]=P("<tr/>",{class:i?o[0]:""}).append(P("<td />
23156",{valign:"top",colSpan:T(t),class:t.oClasses.sRowEmpty}).html(e))[0]}R(t,"aoHeaderCallback","header",[P(t.nTHead).children("tr")[0],ht(t),n,c,u]),R(t,"aoFooterCallback","footer",[P(t.nTFoot).children("tr")[0],ht(t),n,c,u]);s=P(t.nTBody);s.children().detach(),s.append(P(a)),R(t,"aoDrawCallback","draw",[t]),t.bSorted=!1,t.bFiltered=!1,t.bDrawing=!1}}function u(t,e){var n=t.oFeatures,a=n.bSort,n=n.bFilter;a&&ie(t),n?Rt(t,t.oPreviousSearch):t.aiDisplay=t.aiDisplayMaster.slice(),!0!==e&&(t._iDisplayStart=0),t._drawHold=e,v(t),t._drawHold=!1}function _t(t){for(var e,n,a,r,o,i,l,s=t.oClasses,u=P(t.nTable),u=P("<div/>").insertBefore(u),c=t.oFeatures,f=P("<div/>",{id:t.sTableId+"_wrapper",class:s.sWrapper+(t.nTFoot?"":" "+s.sNoFooter)}),d=(t.nHolding=u[0],t.nTableWrapper=f[0],t.nTableReinsertBefore=t.nTable.nextSibling,t.sDom.split("")),h=0;h<d.length;h++){if(e=null,"<"==(n=d[h])){if(a=P("<div/>")[0],"'"==(r=d[h+1])||'"'==r){for(o="",i=2;d[h+i]!=r;)o+=d[h+i],i++;"H"==o?o=s.sJUIHeader:"F"==o&&(o=s.sJUIFooter),-1!=o.indexOf(".")?(l=o.split("."),a.id=l[0].substr(1,l[0].length-1),a.className=l[1]):"#"==o.charAt(0)?a.id=o.substr(1,o.length-1):a.className=o,h+=i}f.append(a),f=P(a)}else if(">"==n)f=f.parent();else if("l"==n&&c.bPaginate&&c.bLengthChange)e=$t(t);else if("f"==n&&c.bFilter)e=Lt(t);else if("r"==n&&c.bProcessing)e=Zt(t);else if("t"==n)e=Kt(t);else if("i"==n&&c.bInfo)e=Ut(t);else if("p"==n&&c.bPaginate)e=zt(t);else if(0!==w.ext.feature.length)for(var p=w.ext.feature,g=0,b=p.length;g<b;g++)if(n==p[g].cFeature){e=p[g].fnInit(t);break}e&&((l=t.aanFeatures)[n]||(l[n]=[]),l[n].push(e),f.append(e))}u.replaceWith(f),t.nHolding=null}function wt(t,e){var n,a,r,o,i,l,s,u,c,f,d=P(e).children("tr");for(t.splice(0,t.length),r=0,l=d.length;r<l;r++)t.push([]);for(r=0,l=d.length;r<l;r++)for(a=(n=d[r]).firstChild;a;){if("TD"==a.nodeName.toUpperCase()||"TH"==a.nodeName.toUpperCase())for(u=(u=+a.getAttribute("colspan"))&&0!=u&&1!=u?u:1,c=(c=+a.getAttribute("rowspan"))&&0!=c&&1!=c?c:1,s=function(t,e,n){for(var a=t[e];a[n];)n++;return n}(t,r,0),f=1==u,i=0;i<u;i++)for(o=0;o<c;o++)t[r+o][s+i]={cell:a,unique:f},t[r+o].nTr=n;a=a.nextSibling}}function Ct(t,e,n){var a=[];n||(n=t.aoHeader,e&&wt(n=[],e));for(var r=0,o=n.length;r<o;r++)for(var i=0,l=n[r].length;i<l;i++)!n[r][i].unique||a[i]&&t.bSortCellsTop||(a[i]=n[r][i].cell);return a}function Tt(r,t,n){function e(t){var e=r.jqXHR?r.jqXHR.status:null;(null===t||"number"==typeof e&&204==e)&&Ft(r,t={},[]),(e=t.error||t.sError)&&W(r,0,e),r.json=t,R(r,null,"xhr",[r,t,r.jqXHR]),n(t)}R(r,"aoServerParams","serverParams",[t]),t&&Array.isArray(t)&&(a={},o=/(.*?)\[\]$/,P.each(t,function(t,e){var n=e.name.match(o);n?(n=n[0],a[n]||(a[n]=[]),a[n].push(e.value)):a[e.name]=e.value}),t=a);var a,o,i,l=r.ajax,s=r.oInstance,u=(P.isPlainObject(l)&&l.data&&(u="function"==typeof(i=l.data)?i(t,r):i,t="function"==typeof i&&u?u:P.extend(!0,t,u),delete l.data),{data:t,success:e,dataType:"json",cache:!1,type:r.sServerMethod,error:function(t,e,n){var a=R(r,null,"xhr",[r,null,r.jqXHR]);-1===P.inArray(!0,a)&&("parsererror"==e?W(r,0,"Invalid JSON response",1):4===t.readyState&&W(r,0,"Ajax error",7)),D(r,!1)}});r.oAjaxData=t,R(r,null,"preXhr",[r,t]),r.fnServerData?r.fnServerData.call(s,r.sAjaxSource,P.map(t,function(t,e){return{name:e,value:t}}),e,r):r.sAjaxSource||"string"==typeof l?r.jqXHR=P.ajax(P.extend(u,{url:l||r.sAjaxSource})):"function"==typeof l?r.jqXHR=l.call(s,t,e,r):(r.jqXHR=P.ajax(P.extend(u,l)),l.data=i)}function xt(e){e.iDraw++,D(e,!0),Tt(e,At(e),function(t){It(e,t)})}function At(t){for(var e,n,a,r=t.aoColumns,o=r.length,i=t.oFeatures,l=t.oPreviousSearch,s=t.aoPreSearchCols,u=[],c=I(t),f=t._iDisplayStart,d=!1!==i.bPaginate?t._iDisplayLength:-1,h=function(t,e){u.push({name:t,value:e})},p=(h("sEcho",t.iDraw),h("iColumns",o),h("sColumns",H(r,"sName").join(",")),h("iDisplayStart",f),h("iDisplayLength",d),{draw:t.iDraw,columns:[],order:[],start:f,length:d,search:{value:l.sSearch,regex:l.bRegex}}),g=0;g<o;g++)n=r[g],a=s[g],e="function"==typeof n.mData?"function":n.mData,p.columns.push({data:e,name:n.sName,searchable:n.bSearchable,orderable:n.bSortable,search:{value:a.sSearch,regex:a.bRegex}}),h("mDataProp_"+g,e),i.bFilter&&(h("sSearch_"+g,a.sSearch),h("bRegex_"+g,a.bRegex),h("bSearchable_"+g,n.bSearchable)),i.bSort&&h("bSortable_"+g,n.bSortable);i.bFilter&&(h("sSearch",l.sSearch),h("bRegex",l.bRegex)),i.bSort&&(P.each(c,function(t,e){p.order.push({column:e.col,dir:e.dir}),h("iSortCol_"+t,e.col),h("sSortDir_"+t,e.dir)}),h("iSortingCols",c.length));f=w.ext.legacy.ajax;return null===f?t.sAjaxSource?u:p:f?u:p}function It(t,n){function e(t,e){return n[t]!==N?n[t]:n[e]}var a=Ft(t,n),r=e("sEcho","draw"),o=e("iTotalRecords","recordsTotal"),i=e("iTotalDisplayRecords","recordsFiltered");if(r!==N){if(+r<t.iDraw)return;t.iDraw=+r}a=a||[],pt(t),t._iRecordsTotal=parseInt(o,10),t._iRecordsDisplay=parseInt(i,10);for(var l=0,s=a.length;l<s;l++)x(t,a[l]);t.aiDisplay=t.aiDisplayMaster.slice(),v(t,!0),t._bInitComplete||qt(t,n),D(t,!1)}function Ft(t,e,n){t=P.isPlainObject(t.ajax)&&t.ajax.dataSrc!==N?t.ajax.dataSrc:t.sAjaxDataProp;if(!n)return"data"===t?e.aaData||e[t]:""!==t?A(t)(e):e;b(t)(e,n)}function Lt(n){function e(t){i.f;var e=this.value||"";o.return&&"Enter"!==t.key||e!=o.sSearch&&(Rt(n,{sSearch:e,bRegex:o.bRegex,bSmart:o.bSmart,bCaseInsensitive:o.bCaseInsensitive,return:o.return}),n._iDisplayStart=0,v(n))}var t=n.oClasses,a=n.sTableId,r=n.oLanguage,o=n.oPreviousSearch,i=n.aanFeatures,l='<input type="search" class="'+t.sFilterInput+'"/>',s=(s=r.sSearch).match(/_INPUT_/)?s.replace("_INPUT_",l):s+l,l=P("<div/>",{id:i.f?null:a+"_filter",class:t.sFilter}).append(P("<label/>").append(s)),t=null!==n.searchDelay?n.searchDelay:"ssp"===E(n)?400:0,u=P("input",l).val(o.sSearch).attr("placeholder",r.sSearchPlaceholder).on("keyup.DT search.DT input.DT paste.DT cut.DT",t?ne(e,t):e).on("mouseup",function(t){setTimeout(function(){e.call(u[0],t)},10)}).on("keypress.DT",function(t){if(13==t.keyCode)return!1}).attr("aria-controls",a);return P(n.nTable).on("search.dt.DT",function(t,e){if(n===e)try{u[0]!==y.activeElement&&u.val(o.sSearch)}catch(t){}}),l[0]}function Rt(t,e,n){function a(t){o.sSearch=t.sSearch,o.bRegex=t.bRegex,o.bSmart=t.bSmart,o.bCaseInsensitive=t.bCaseInsensitive,o.return=t.return}function r(t){return t.bEscapeRegex!==N?!t.bEscapeRegex:t.bRegex}var o=t.oPreviousSearch,i=t.aoPreSearchCols;
vendor: 4,357 bytes, line 23156
23156if(lt(t),"ssp"!=E(t)){Nt(t,e.sSearch,n,r(e),e.bSmart,e.bCaseInsensitive,e.return),a(e);for(var l=0;l<i.length;l++)jt(t,i[l].sSearch,l,r(i[l]),i[l].bSmart,i[l].bCaseInsensitive);Pt(t)}else a(e);t.bFiltered=!0,R(t,null,"search",[t])}function Pt(t){for(var e,n,a=w.ext.search,r=t.aiDisplay,o=0,i=a.length;o<i;o++){for(var l=[],s=0,u=r.length;s<u;s++)n=r[s],e=t.aoData[n],a[o](t,e._aFilterData,n,e._aData,s)&&l.push(n);r.length=0,P.merge(r,l)}}function jt(t,e,n,a,r,o){if(""!==e){for(var i,l=[],s=t.aiDisplay,u=Ht(e,a,r,o),c=0;c<s.length;c++)i=t.aoData[s[c]]._aFilterData[n],u.test(i)&&l.push(s[c]);t.aiDisplay=l}}function Nt(t,e,n,a,r,o){var i,l,s,u=Ht(e,a,r,o),r=t.oPreviousSearch.sSearch,o=t.aiDisplayMaster,c=[];if(0!==w.ext.search.length&&(n=!0),l=Wt(t),e.length<=0)t.aiDisplay=o.slice();else{for((l||n||a||r.length>e.length||0!==e.indexOf(r)||t.bSorted)&&(t.aiDisplay=o.slice()),i=t.aiDisplay,s=0;s<i.length;s++)u.test(t.aoData[i[s]]._sFilterRow)&&c.push(i[s]);t.aiDisplay=c}}function Ht(t,e,n,a){return t=e?t:Ot(t),n&&(t="^(?=.*?"+P.map(t.match(/"[^"]+"|[^ ]+/g)||[""],function(t){var e;return(t='"'===t.charAt(0)?(e=t.match(/^"(.*)"$/))?e[1]:t:t).replace('"',"")}).join(")(?=.*?")+").*$"),new RegExp(t,a?"i":"")}var Ot=w.util.escapeRegex,kt=P("<div>")[0],Mt=kt.textContent!==N;function Wt(t){for(var e,n,a,r,o,i=t.aoColumns,l=!1,s=0,u=t.aoData.length;s<u;s++)if(!(o=t.aoData[s])._aFilterData){for(a=[],e=0,n=i.length;e<n;e++)i[e].bSearchable?"string"!=typeof(r=null===(r=S(t,s,e,"filter"))?"":r)&&r.toString&&(r=r.toString()):r="",r.indexOf&&-1!==r.indexOf("&")&&(kt.innerHTML=r,r=Mt?kt.textContent:kt.innerText),r.replace&&(r=r.replace(/[\r\n\u2028]/g,"")),a.push(r);o._aFilterData=a,o._sFilterRow=a.join("  "),l=!0}return l}function Et(t){return{search:t.sSearch,smart:t.bSmart,regex:t.bRegex,caseInsensitive:t.bCaseInsensitive}}function Bt(t){return{sSearch:t.search,bSmart:t.smart,bRegex:t.regex,bCaseInsensitive:t.caseInsensitive}}function Ut(t){var e=t.sTableId,n=t.aanFeatures.i,a=P("<div/>",{class:t.oClasses.sInfo,id:n?null:e+"_info"});return n||(t.aoDrawCallback.push({fn:Vt,sName:"information"}),a.attr("role","status").attr("aria-live","polite"),P(t.nTable).attr("aria-describedby",e+"_info")),a[0]}function Vt(t){var e,n,a,r,o,i,l=t.aanFeatures.i;0!==l.length&&(i=t.oLanguage,e=t._iDisplayStart+1,n=t.fnDisplayEnd(),a=t.fnRecordsTotal(),o=(r=t.fnRecordsDisplay())?i.sInfo:i.sInfoEmpty,r!==a&&(o+=" "+i.sInfoFiltered),o=Xt(t,o+=i.sInfoPostFix),null!==(i=i.fnInfoCallback)&&(o=i.call(t.oInstance,t,e,n,a,r,o)),P(l).html(o))}function Xt(t,e){var n=t.fnFormatNumber,a=t._iDisplayStart+1,r=t._iDisplayLength,o=t.fnRecordsDisplay(),i=-1===r;return e.replace(/_START_/g,n.call(t,a)).replace(/_END_/g,n.call(t,t.fnDisplayEnd())).replace(/_MAX_/g,n.call(t,t.fnRecordsTotal())).replace(/_TOTAL_/g,n.call(t,o)).replace(/_PAGE_/g,n.call(t,i?1:Math.ceil(a/r))).replace(/_PAGES_/g,n.call(t,i?1:Math.ceil(o/r)))}function Jt(n){var a,t,e,r=n.iInitDisplayStart,o=n.aoColumns,i=n.oFeatures,l=n.bDeferLoading;if(n.bInitialised){for(_t(n),yt(n),Dt(n,n.aoHeader),Dt(n,n.aoFooter),D(n,!0),i.bAutoWidth&&ee(n),a=0,t=o.length;a<t;a++)(e=o[a]).sWidth&&(e.nTh.style.width=M(e.sWidth));R(n,null,"preInit",[n]),u(n);i=E(n);"ssp"==i&&!l||("ajax"==i?Tt(n,[],function(t){var e=Ft(n,t);for(a=0;a<e.length;a++)x(n,e[a]);n.iInitDisplayStart=r,u(n),D(n,!1),qt(n,t)}):(D(n,!1),qt(n)))}else setTimeout(function(){Jt(n)},200)}function qt(t,e){t._bInitComplete=!0,(e||t.oInit.aaData)&&O(t),R(t,null,"plugin-init",[t,e]),R(t,"aoInitComplete","init",[t,e])}function Gt(t,e){e=parseInt(e,10);t._iDisplayLength=e,Se(t),R(t,null,"length",[t,e])}function $t(a){for(var t=a.oClasses,e=a.sTableId,n=a.aLengthMenu,r=Array.isArray(n[0]),o=r?n[0]:n,i=r?n[1]:n,l=P("<select/>",{name:e+"_length","aria-controls":e,class:t.sLengthSelect}),s=0,u=o.length;s<u;s++)l[0][s]=new Option("number"==typeof i[s]?a.fnFormatNumber(i[s]):i[s],o[s]);var c=P("<div><label/></div>").addClass(t.sLength);return a.aanFeatures.l||(c[0].id=e+"_length"),c.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",l[0].outerHTML)),P("select",c).val(a._iDisplayLength).on("change.DT",function(t){Gt(a,P(this).val()),v(a)}),P(a.nTable).on("length.dt.DT",function(t,e,n){a===e&&P("select",c).val(n)}),c[0]}function zt(t){function c(t){v(t)}var e=t.sPaginationType,f=w.ext.pager[e],d="function"==typeof f,e=P("<div/>
23156").addClass(t.oClasses.sPaging+e)[0],h=t.aanFeatures;return d||f.fnInit(t,e,c),h.p||(e.id=t.sTableId+"_paginate",t.aoDrawCallback.push({fn:function(t){if(d)for(var e=t._iDisplayStart,n=t._iDisplayLength,a=t.fnRecordsDisplay(),r=-1===n,o=r?0:Math.ceil(e/n),i=r?1:Math.ceil(a/n),l=f(o,i),s=0,u=h.p.length;s<u;s++)ve(t,"pageButton")(t,h.p[s],s,l,o,i);else f.fnUpdate(t,c)},sName:"pagination"})),e}function Yt(t,e,n){var a=t._iDisplayStart,r=t._iDisplayLength,o=t.fnRecordsDisplay(),o=(0===o||-1===r?a=0:"number"==typeof e?o<(a=e*r)&&(a=0):"first"==e?a=0:"previous"==e?(a=0<=r?a-r:0)<0&&(a=0):"next"==e?a+r<o&&(a+=r):"last"==e?a=Math.floor((o-1)/r)*r:W(t,0,"Unknown paging action: "+e,5),t._iDisplayStart!==a);return t._iDisplayStart=a,o?(R(t,null,"page",[t]),n&&v(t)):R(t,null,"page-nc",[t]),o}function Zt(t){return P("<div/>",{id:t.aanFeatures.r?null:t.sTableId+"_processing",class:t.oClasses.sProcessing,role:"status"}).html(t.oLanguage.sProcessing).append("<div><div></div><div></div><div></div><div></div></div>").insertBefore(t.nTable)[0]}function D(t,e){t.oFeatures.bProcessing&&P(t.aanFeatures.r).css("display",e?"block":"none"),R(t,null,"processing",[t,e])}function Kt(t){var e,n,a,r,o,i,l,s,u,c,f,d,h=P(t.nTable),p=t.oScroll;return""===p.sX&&""===p.sY?t.nTable:(e=p.sX,n=p.sY,a=t.oClasses,o=(r=h.children("caption")).length?r[0]._captionSide:null,s=P(h[0].cloneNode(!1)),i=P(h[0].cloneNode(!1)),u=function(t){return t?M(t):null},(l=h.children("tfoot")).length||(l=null),s=P(f="<div/>",{class:a.sScrollWrapper}).append(P(f,{class:a.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:e?u(e):"100%"}).append(P(f,{class:a.sScrollHeadInner}).css({"box-sizing":"content-box",width:p.sXInner||"100%"}).append(s.removeAttr("id").css("margin-left",0).append("top"===o?r:null).append(h.children("thead"))))).append(P(f,{class:a.sScrollBody}).css({position:"relative",overflow:"auto",width:u(e)}).append(h)),l&&s.append(P(f,{class:a.sScrollFoot}).css({overflow:"hidden",border:0,width:e?u(e):"100%"}).append(P(f,{class:a.sScrollFootInner}).append(i.removeAttr("id").css("margin-left",0).append("bottom"===o?r:null).append(h.children("tfoot"))))),u=s.children(),c=u[0],f=u[1],d=l?u[2]:null,e&&P(f).on("scroll.DT",function(t){var e=this.scrollLeft;c.scrollLeft=e,l&&(d.scrollLeft=e)}),P(f).css("max-height",n),p.bCollapse||P(f).css("height",n),t.nScrollHead=c,t.nScrollBody=f,t.nScrollFoot=d,t.aoDrawCallback.push({fn:Qt,sName:"scrolling"}),s[0])}function Qt(n){function t(t){(t=t.style).paddingTop="0",t.paddingBottom="0",t.borderTopWidth="0",t.borderBottomWidth="0",t.height=0}var e,a,r,o,i,l=n.oScroll,s=l.sX,u=l.sXInner,c=l.sY,l=l.iBarWidth,f=P(n.nScrollHead),d=f[0].style,h=f.children("div"),p=h[0].style,h=h.children("table"),g=n.nScrollBody,b=P(g),m=g.style,S=P(n.nScrollFoot).children("div"),v=S.children("table"),y=P(n.nTHead),D=P(n.nTable),_=D[0],w=_.style,C=n.nTFoot?P(n.nTFoot):null,T=n.oBrowser,x=T.bScrollOversize,A=(H(n.aoColumns,"nTh"),[]),I=[],F=[],L=[],R=g.scrollHeight>g.clientHeight;n.scrollBarVis!==R&&n.scrollBarVis!==N?(n.scrollBarVis=R,O(n)):(n.scrollBarVis=R,D.children("thead, tfoot").remove(),C&&(R=C.clone().prependTo(D),i=C.find("tr"),a=R.find("tr"),R.find("[id]").removeAttr("id")),R=y.clone().prependTo(D),y=y.find("tr"),e=R.find("tr"),R.find("th, td").removeAttr("tabindex"),R.find("[id]").removeAttr("id"),s||(m.width="100%",f[0].style.width="100%"),P.each(Ct(n,R),function(t,e){r=rt(n,t),e.style.width=n.aoColumns[r].sWidth}),C&&k(function(t){t.style.width=""},a),f=D.outerWidth(),""===s?(w.width="100%",x&&(D.find("tbody").height()>g.offsetHeight||"scroll"==b.css("overflow-y"))&&(w.width=M(D.outerWidth()-l)),f=D.outerWidth()):""!==u&&(w.width=M(u),f=D.outerWidth()),k(t,e),k(function(t){var e=j.getComputedStyle?j.getComputedStyle(t).width:M(P(t).width());F.push(t.innerHTML),A.push(e)},e),k(function(t,e){t.style.width=A[e]},y),P(e).css("height",0),C&&(k(t,a),k(function(t){L.push(t.innerHTML),I.push(M(P(t).css("width")))},a),k(function(t,e){t.style.width=I[e]},i),P(a).height(0)),k(function(t,e){t.innerHTML='<div class="dataTables_sizing">'+F[e]+"</div>",t.childNodes[0].style.height="0",t.childNodes[0].style.overflow="hidden",t.style.width=A[e]},e),C&&k(function(t,e){t.innerHTML='<div class="dataTables_sizing">'+L[e]+"</div>",t.childNodes[0].style.height="0",t.childNodes[0].style.overflow="hidden",t.style.width=I[e]},a),Math.round(D.outerWidth())<Math.round(f)?(o=g.scrollHeight>g.offsetHeight||"scroll"==b.css("overflow-y")?f+l:f,x&&(g.scrollHeight>g.offsetHeight||"scroll"==b.css("overflow-y"))&&(w.width=M(o-l)),""!==s&&""===u||W(n,1,"Possible column misalignment",6)):o="100%",m.width=M(o),d.width=M(o),C&&(n.nScrollFoot.style.width=M(o)),c||x&&(m.height=M(_.offsetHeight+l)),R=D.outerWidth(),h[0].style.width=M(R),p.width=M(R),y=D.height()>g.clientHeight||"scroll"==b.css("overflow-y"),p[i="padding"+(T.bScrollbarLeft?"Left":"Right")]=y?l+"px":"0px",C&&(v[0].style.width=M(R),S[0].style.width=M(R),S[0].style[i]=y?l+"px":"0px"),D.children("colgroup").insertBefore(D.children("thead")),b.trigger("scroll"),!n.bSorted&&!n.bFiltered||n._drawHold||(g.scrollTop=0))}function k(t,e,n){for(var a,r,o=0,i=0,l=e.length;i<l;){for(a=e[i].firstChild,r=n?n[i].firstChild:null;a;)1===a.nodeType&&(n?t(a,r,o):t(a,o),o++),a=a.nextSibling,r=n?r.nextSibling:null;i++}}var te=/<.*?>/g;function ee(t){var e,n,a=t.nTable,r=t.aoColumns,o=t.oScroll,i=o.sY,l=o.sX,o=o.sXInner,s=r.length,u=it(t,"bVisible"),c=P("th",t.nTHead),f=a.getAttribute("width"),d=a.parentNode,h=!1,p=t.oBrowser,g=p.bScrollOversize,b=a.style.width;for(b&&-1!==b.indexOf("%")&&(f=b),D=0;D<u.length;D++)null!==(e=r[u[D]]).sWidth&&(e.sWidth=ae(e.sWidthOrig,d),h=!0);if(g||!h&&!l&&!i&&s==T(t)&&s==c.length)for(D=0;D<s;D++){var m=rt(t,D);null!==m&&(r[m].sWidth=M(c.eq(D).width()))}else{var b=P(a).clone().css("visibility","hidden").removeAttr("id"),S=(b.find("tbody tr").remove(),P("<tr/>").appendTo(b.find("tbody")));for(b.find("thead, tfoot").remove(),b.append(P(t.nTHead).clone()).append(P(t.nTFoot).clone()),b.find("tfoot th, tfoot td").css("width",""),c=Ct(t,b.find("thead")[0]),D=0;D<u.length;D++)e=r[u[D]],c[D].style.width=null!==e.sWidthOrig&&""!==e.sWidthOrig?M(e.sWidthOrig):"",e.sWidthOrig&&l&&P(c[D]).append(P("<div/>").css({width:e.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(t.aoData.length)for(D=0;D<u.length;D++)e=r[n=u[D]],P(re(t,n)).clone(!1).append(e.sContentPadding).appendTo(S);P("[name]",b).removeAttr("name");for(var v=P("<div/>").css(l||i?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(b).appendTo(d),y=(l&&o?b.width(o):l?(b.css("width","auto"),b.removeAttr("width"),b.width()<d.clientWidth&&f&&b.width(d.clientWidth)):i?b.width(d.clientWidth):f&&b.width(f),0),D=0;D<u.length;D++){var _=P(c[D]),w=_.outerWidth()-_.width(),_=p.bBounding?Math.ceil(c[D].getBoundingClientRect().width):_.outerWidth();y+=_,r[u[D]].sWidth=M(_-w)}a.style.width=M(y),v.remove()}f&&(a.style.width=M(f)),!f&&!l||t._reszEvt||(o=function(){P(j).on("resize.DT-"+t.sInstance,ne(function(){O(t)}))},g?setTimeout(o,1e3):o(),t._reszEvt=!0)}var ne=w.util.throttle;function ae(t,e){return t?(e=(t=P("<div/>").css("width",M(t)).appendTo(e||y.body))[0].offsetWidth,t.remove(),e):0}function re(t,e){var n,a=oe(t,e);return a<0?null:(n=t.aoData[a]).nTr?n.anCells[e]:P("<td/>").html(S(t,a,e,"display"))[0]}function oe(t,e){for(var n,a=-1,r=-1,o=0,i=t.aoData.length;o<i;o++)(n=(n=(n=S(t,o,e,"display")+"").replace(te,"")).replace(/&nbsp;/g," ")).length>a&&(a=n.length,r=o);return r}function M(t){return null===t?"0px":"number"==typeof t?t<0?"0px":t+"px":t.match(/\d$/)?t+"px":t}function I(t){function e(t){t.length&&!Array.isArray(t[0])?h.push(t):P.merge(h,t)}var n,a,r,o,i,l,s,u=[],c=t.aoColumns,f=t.aaSortingFixed,d=P.isPlainObject(f),h=[];for(Array.isArray(f)&&e(f),d&&f.pre&&e(f.pre),e(t.aaSorting),d&&f.post&&e(f.post),n=0;n<h.length;n++)for(r=(o=c[s=h[n][a=0]].aDataSort).length;a<r;a++)l=c[i=o[a]].sType||"string",h[n]._idx===N&&(h[n]._idx=P.inArray(h[n][1],c[i].asSorting)),u.push({src:s,col:i,dir:h[n][1],index:h[n]._idx,type:l,formatter:w.ext.type.order[l+"-pre"]});return u}function ie(t){var e,n,a,r,c,f=[],u=w.ext.type.order,d=t.aoData,o=(t.aoColumns,0),i=t.aiDisplayMaster;for(lt(t),e=0,n=(c=I(t)).length;e<n;e++)(r=c[e]).formatter&&o++,fe(t,r.col);if("ssp"!=E(t)&&0!==c.length){for(e=0,a=i.length;e<a;e++)f[i[e]]=e;o===c.length?i.sort(function(t,e){for(var n,a,r,o,i=c.length,l=d[t]._aSortData,s=d[e]._aSortData,u=0;u<i;u++)if(0!=(r=(n=l[(o=c[u]).col])<(a=s[o.col])?-1:a<n?1:0))return"asc"===o.dir?r:-r;return(n=f[t])<(a=f[e])?-1:a<n?1:0}):i.sort(function(t,e){for(var n,a,r,o=c.length,i=d[t]._aSortData,l=d[e]._aSortData,s=0;s<o;s++)if(n=i[(r=c[s]).col],a=l[r.col],0!==(r=(u[r.type+"-"+r.dir]||u["string-"+r.dir])(n,a)))return r;return(n=f[t])<(a=f[e])?-1:a<n?1:0})}t.bSorted=!0}
vendor: 40,709 bytes, line 23156
23156function le(t){for(var e=t.aoColumns,n=I(t),a=t.oLanguage.oAria,r=0,o=e.length;r<o;r++){var i=e[r],l=i.asSorting,s=i.ariaTitle||i.sTitle.replace(/<.*?>/g,""),u=i.nTh;u.removeAttribute("aria-sort"),i=i.bSortable?s+("asc"===(0<n.length&&n[0].col==r&&(u.setAttribute("aria-sort","asc"==n[0].dir?"ascending":"descending"),l[n[0].index+1])||l[0])?a.sSortAscending:a.sSortDescending):s,u.setAttribute("aria-label",i)}}function se(t,e,n,a){function r(t,e){var n=t._idx;return(n=n===N?P.inArray(t[1],s):n)+1<s.length?n+1:e?null:0}var o,i=t.aoColumns[e],l=t.aaSorting,s=i.asSorting;"number"==typeof l[0]&&(l=t.aaSorting=[l]),n&&t.oFeatures.bSortMulti?-1!==(i=P.inArray(e,H(l,"0")))?null===(o=null===(o=r(l[i],!0))&&1===l.length?0:o)?l.splice(i,1):(l[i][1]=s[o],l[i]._idx=o):(l.push([e,s[0],0]),l[l.length-1]._idx=0):l.length&&l[0][0]==e?(o=r(l[0]),l.length=1,l[0][1]=s[o],l[0]._idx=o):(l.length=0,l.push([e,s[0]]),l[0]._idx=0),u(t),"function"==typeof a&&a(t)}function ue(e,t,n,a){var r=e.aoColumns[n];me(t,{},function(t){!1!==r.bSortable&&(e.oFeatures.bProcessing?(D(e,!0),setTimeout(function(){se(e,n,t.shiftKey,a),"ssp"!==E(e)&&D(e,!1)},0)):se(e,n,t.shiftKey,a))})}function ce(t){var e,n,a,r=t.aLastSort,o=t.oClasses.sSortColumn,i=I(t),l=t.oFeatures;if(l.bSort&&l.bSortClasses){for(e=0,n=r.length;e<n;e++)a=r[e].src,P(H(t.aoData,"anCells",a)).removeClass(o+(e<2?e+1:3));for(e=0,n=i.length;e<n;e++)a=i[e].src,P(H(t.aoData,"anCells",a)).addClass(o+(e<2?e+1:3))}t.aLastSort=i}function fe(t,e){for(var n,a,r,o=t.aoColumns[e],i=w.ext.order[o.sSortDataType],l=(i&&(n=i.call(t.oInstance,t,e,ot(t,e))),w.ext.type.order[o.sType+"-pre"]),s=0,u=t.aoData.length;s<u;s++)(a=t.aoData[s])._aSortData||(a._aSortData=[]),a._aSortData[e]&&!i||(r=i?n[s]:S(t,s,e,"sort"),a._aSortData[e]=l?l(r):r)}function de(n){var t;n._bLoadingState||(t={time:+new Date,start:n._iDisplayStart,length:n._iDisplayLength,order:P.extend(!0,[],n.aaSorting),search:Et(n.oPreviousSearch),columns:P.map(n.aoColumns,function(t,e){return{visible:t.bVisible,search:Et(n.aoPreSearchCols[e])}})},n.oSavedState=t,R(n,"aoStateSaveParams","stateSaveParams",[n,t]),n.oFeatures.bStateSave&&!n.bDestroying&&n.fnStateSaveCallback.call(n.oInstance,n,t))}function he(e,t,n){var a;if(e.oFeatures.bStateSave)return(a=e.fnStateLoadCallback.call(e.oInstance,e,function(t){pe(e,t,n)}))!==N&&pe(e,a,n),!0;n()}function pe(n,t,e){var a,r,o=n.aoColumns,i=(n._bLoadingState=!0,n._bInitComplete?new w.Api(n):null);if(t&&t.time){var l=R(n,"aoStateLoadParams","stateLoadParams",[n,t]);if(-1!==P.inArray(!1,l))n._bLoadingState=!1;else{l=n.iStateDuration;if(0<l&&t.time<+new Date-1e3*l)n._bLoadingState=!1;else if(t.columns&&o.length!==t.columns.length)n._bLoadingState=!1;else{if(n.oLoadedState=P.extend(!0,{},t),t.length!==N&&(i?i.page.len(t.length):n._iDisplayLength=t.length),t.start!==N&&(null===i?(n._iDisplayStart=t.start,n.iInitDisplayStart=t.start):Yt(n,t.start/n._iDisplayLength)),t.order!==N&&(n.aaSorting=[],P.each(t.order,function(t,e){n.aaSorting.push(e[0]>=o.length?[0,e[1]]:e)})),t.search!==N&&P.extend(n.oPreviousSearch,Bt(t.search)),t.columns){for(a=0,r=t.columns.length;a<r;a++){var s=t.columns[a];s.visible!==N&&(i?i.column(a).visible(s.visible,!1):o[a].bVisible=s.visible),s.search!==N&&P.extend(n.aoPreSearchCols[a],Bt(s.search))}i&&i.columns.adjust()}n._bLoadingState=!1,R(n,"aoStateLoaded","stateLoaded",[n,t])}}}else n._bLoadingState=!1;e()}function ge(t){var e=w.settings,t=P.inArray(t,H(e,"nTable"));return-1!==t?e[t]:null}function W(t,e,n,a){if(n="DataTables warning: "+(t?"table id="+t.sTableId+" - ":"")+n,a&&(n+=". For more information about this error, please see http://datatables.net/tn/"+a),e)j.console&&console.log&&console.log(n);else{e=w.ext,e=e.sErrMode||e.errMode;if(t&&R(t,null,"error",[t,a,n]),"alert"==e)alert(n);else{if("throw"==e)throw new Error(n);"function"==typeof e&&e(t,a,n)}}}function F(n,a,t,e){Array.isArray(t)?P.each(t,function(t,e){Array.isArray(e)?F(n,a,e[0],e[1]):F(n,a,e)}):(e===N&&(e=t),a[t]!==N&&(n[e]=a[t]))}function be(t,e,n){var a,r;for(r in e)e.hasOwnProperty(r)&&(a=e[r],P.isPlainObject(a)?(P.isPlainObject(t[r])||(t[r]={}),P.extend(!0,t[r],a)):n&&"data"!==r&&"aaData"!==r&&Array.isArray(a)?t[r]=a.slice():t[r]=a);return t}function me(e,t,n){P(e).on("click.DT",t,function(t){P(e).trigger("blur"),n(t)}).on("keypress.DT",t,function(t){13===t.which&&(t.preventDefault(),n(t))}).on("selectstart.DT",function(){return!1})}function L(t,e,n,a){n&&t[e].push({fn:n,sName:a})}function R(n,t,e,a){var r=[];return t&&(r=P.map(n[t].slice().reverse(),function(t,e){return t.fn.apply(n.oInstance,a)})),null!==e&&(t=P.Event(e+".dt"),(e=P(n.nTable)).trigger(t,a),0===e.parents("body").length&&P("body").trigger(t,a),r.push(t.result)),r}function Se(t){var e=t._iDisplayStart,n=t.fnDisplayEnd(),a=t._iDisplayLength;n<=e&&(e=n-a),e-=e%a,t._iDisplayStart=e=-1===a||e<0?0:e}function ve(t,e){var t=t.renderer,n=w.ext.renderer[e];return P.isPlainObject(t)&&t[e]?n[t[e]]||n._:"string"==typeof t&&n[t]||n._}function E(t){return t.oFeatures.bServerSide?"ssp":t.ajax||t.sAjaxSource?"ajax":"dom"}function ye(t,n){var a;return Array.isArray(t)?P.map(t,function(t){return ye(t,n)}):"number"==typeof t?[n[t]]:(a=P.map(n,function(t,e){return t.nTable}),P(a).filter(t).map(function(t){var e=P.inArray(this,a);return n[e]}).toArray())}function De(r,o,t){var e,n;t&&(e=new B(r)).one("draw",function(){t(e.ajax.json())}),"ssp"==E(r)?u(r,o):(D(r,!0),(n=r.jqXHR)&&4!==n.readyState&&n.abort(),Tt(r,[],function(t){pt(r);for(var e=Ft(r,t),n=0,a=e.length;n<a;n++)x(r,e[n]);u(r,o),D(r,!1)}))}function _e(t,e,n,a,r){for(var o,i,l,s,u=[],c=typeof e,f=0,d=(e=e&&"string"!=c&&"function"!=c&&e.length!==N?e:[e]).length;f<d;f++)for(l=0,s=(i=e[f]&&e[f].split&&!e[f].match(/[\[\(:]/)?e[f].split(","):[e[f]]).length;l<s;l++)(o=n("string"==typeof i[l]?i[l].trim():i[l]))&&o.length&&(u=u.concat(o));var h=p.selector[t];if(h.length)for(f=0,d=h.length;f<d;f++)u=h[f](a,r,u);return z(u)}function we(t){return(t=t||{}).filter&&t.search===N&&(t.search=t.filter),P.extend({search:"none",order:"current",page:"all"},t)}function Ce(t){for(var e=0,n=t.length;e<n;e++)if(0<t[e].length)return t[0]=t[e],t[0].length=1,t.length=1,t.context=[t.context[e]],t;return t.length=0,t}function Te(o,t,e,n){function i(t,e){var n;if(Array.isArray(t)||t instanceof P)for(var a=0,r=t.length;a<r;a++)i(t[a],e);else t.nodeName&&"tr"===t.nodeName.toLowerCase()?l.push(t):(n=P("<tr><td></td></tr>").addClass(e),P("td",n).addClass(e).html(t)[0].colSpan=T(o),l.push(n[0]))}var l=[];i(e,n),t._details&&t._details.detach(),t._details=P(l),t._detailsShow&&t._details.insertAfter(t.nTr)}function xe(t,e){var n=t.context;if(n.length&&t.length){var a=n[0].aoData[t[0]];if(a._details){(a._detailsShow=e)?(a._details.insertAfter(a.nTr),P(a.nTr).addClass("dt-hasChild")):(a._details.detach(),P(a.nTr).removeClass("dt-hasChild")),R(n[0],null,"childRow",[e,t.row(t[0])]);var s=n[0],r=new B(s),a=".dt.DT_details",e="draw"+a,t="column-sizing"+a,a="destroy"+a,u=s.aoData;if(r.off(e+" "+t+" "+a),H(u,"_details").length>0){r.on(e,function(t,e){if(s!==e)return;r.rows({page:"current"}).eq(0).each(function(t){var e=u[t];if(e._detailsShow)e._details.insertAfter(e.nTr)})});r.on(t,function(t,e,n,a){if(s!==e)return;var r,o=T(e);for(var i=0,l=u.length;i<l;i++){r=u[i];if(r._details)r._details.children("td[colspan]").attr("colspan",o)}});r.on(a,function(t,e){if(s!==e)return;for(var n=0,a=u.length;n<a;n++)if(u[n]._details)Re(r,n)})}Le(n)}}}function Ae(t,e,n,a,r){for(var o=[],i=0,l=r.length;i<l;i++)o.push(S(t,r[i],e));return o}var Ie=[],o=Array.prototype,B=function(t,e){if(!(this instanceof B))return new B(t,e);function n(t){var e,n,a,r;t=t,a=w.settings,r=P.map(a,function(t,e){return t.nTable}),(t=t?t.nTable&&t.oApi?[t]:t.nodeName&&"table"===t.nodeName.toLowerCase()?-1!==(e=P.inArray(t,r))?[a[e]]:null:t&&"function"==typeof t.settings?t.settings().toArray():("string"==typeof t?n=P(t):t instanceof P&&(n=t),n?n.map(function(t){return-1!==(e=P.inArray(this,r))?a[e]:null}).toArray():void 0):[])&&o.push.apply(o,t)}var o=[];if(Array.isArray(t))for(var a=0,r=t.length;a<r;a++)n(t[a]);else n(t);this.context=z(o),e&&P.merge(this,e),this.selector={rows:null,cols:null,opts:null},B.extend(this,this,Ie)},Fe=(w.Api=B,P.extend(B.prototype,{any:function(){return 0!==this.count()},concat:o.concat,context:[],count:function(){return this.flatten().length},each:function(t){for(var e=0,n=this.length;e<n;e++)t.call(this,this[e],e,this);return this},eq:function(t){var e=this.context;return e.length>t?new B(e[t],this[t]):null},filter:function(t){var e=[];if(o.filter)e=o.filter.call(this,t,this);else for(var n=0,a=this.length;n<a;n++)t.call(this,this[n],n,this)&&e.push(this[n]);return new B(this.context,e)},flatten:function(){var t=[];return new B(this.context,t.concat.apply(t,this.toArray()))},join:o.join,indexOf:o.indexOf||function(t,e){for(var n=e||0,a=this.length;n<a;n++)if(this[n]===t)return n;return-1},iterator:function(t,e,n,a){var r,o,i,l,s,u,c,f,d=[],h=this.context,p=this.selector;for("string"==typeof t&&(a=n,n=e,e=t,t=!1),o=0,i=h.length;o<i;o++){var g=new B(h[o]);if("table"===e)(r=n.call(g,h[o],o))!==N&&d.push(r);else if("columns"===e||"rows"===e)(r=n.call(g,h[o],this[o],o))!==N&&d.push(r);else if("column"===e||"column-rows"===e||"row"===e||"cell"===e)for(c=this[o],"column-rows"===e&&(u=Fe(h[o],p.opts)),l=0,s=c.length;l<s;l++)f=c[l],(r="cell"===e?n.call(g,h[o],f.row,f.column,o,l):n.call(g,h[o],f,o,l,u))!==N&&d.push(r)}return d.length||a?((t=(a=new B(h,t?d.concat.apply([],d):d)).selector).rows=p.rows,t.cols=p.cols,t.opts=p.opts,a):this},lastIndexOf:o.lastIndexOf||function(t,e){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(t){var e=[];if(o.map)e=o.map.call(this,t,this);else for(var n=0,a=this.length;n<a;n++)e.push(t.call(this,this[n],n));return new B(this.context,e)},pluck:function(t){var e=w.util.get(t);return this.map(function(t){return e(t)})},pop:o.pop,push:o.push,reduce:o.reduce||function(t,e){return et(this,t,e,0,this.length,1)},reduceRight:o.reduceRight||function(t,e){return et(this,t,e,this.length-1,-1,-1)},reverse:o.reverse,selector:null,shift:o.shift,slice:function(){return new B(this.context,this)},sort:o.sort,splice:o.splice,toArray:function(){return o.slice.call(this)},to$:function(){return P(this)},toJQuery:function(){return P(this)},unique:function(){return new B(this.context,z(this))},unshift:o.unshift}),B.extend=function(t,e,n){if(n.length&&e&&(e instanceof B||e.__dt_wrapper))for(var a,r=0,o=n.length;r<o;r++)e[(a=n[r]).name]="function"===a.type?function(e,n,a){return function(){var t=n.apply(e,arguments);return B.extend(t,t,a.methodExt),t}}(t,a.val,a):"object"===a.type?{}:a.val,e[a.name].__dt_wrapper=!0,B.extend(t,e[a.name],a.propExt)},B.register=e=function(t,e){if(Array.isArray(t))for(var n=0,a=t.length;n<a;n++)B.register(t[n],e);else for(var r=t.split("."),o=Ie,i=0,l=r.length;i<l;i++){var s,u,c=function(t,e){for(var n=0,a=t.length;n<a;n++)if(t[n].name===e)return t[n];return null}(o,u=(s=-1!==r[i].indexOf("()"))?r[i].replace("()",""):r[i]);c||o.push(c={name:u,val:{},methodExt:[],propExt:[],type:"object"}),i===l-1?(c.val=e,c.type="function"==typeof e?"function":P.isPlainObject(e)?"object":"other"):o=s?c.methodExt:c.propExt}},B.registerPlural=t=function(t,e,n){B.register(t,n),B.register(e,function(){var t=n.apply(this,arguments);return t===this?this:t instanceof B?t.length?Array.isArray(t[0])?new B(t.context,t[0]):t[0]:N:t})},e("tables()",function(t){return t!==N&&null!==t?new B(ye(t,this.context)):this}),e("table()",function(t){var t=this.tables(t),e=t.context;return e.length?new B(e[0]):t}),t("tables().nodes()","table().node()",function(){return this.iterator("table",function(t){return t.nTable},1)}),t("tables().body()","table().body()",function(){return this.iterator("table",function(t){return t.nTBody},1)}),t("tables().header()","table().header()",function(){return this.iterator("table",function(t){return t.nTHead},1)}),t("tables().footer()","table().footer()",function(){return this.iterator("table",function(t){return t.nTFoot},1)}),t("tables().containers()","table().container()",function(){return this.iterator("table",function(t){return t.nTableWrapper},1)}),e("draw()",function(e){return this.iterator("table",function(t){"page"===e?v(t):u(t,!1===(e="string"==typeof e?"full-hold"!==e:e))})}),e("page()",function(e){return e===N?this.page.info().page:this.iterator("table",function(t){Yt(t,e)})}),e("page.info()",function(t){var e,n,a,r,o;return 0===this.context.length?N:(n=(e=this.context[0])._iDisplayStart,a=e.oFeatures.bPaginate?e._iDisplayLength:-1,r=e.fnRecordsDisplay(),{page:(o=-1===a)?0:Math.floor(n/a),pages:o?1:Math.ceil(r/a),start:n,end:e.fnDisplayEnd(),length:a,recordsTotal:e.fnRecordsTotal(),recordsDisplay:r,serverSide:"ssp"===E(e)})}),e("page.len()",function(e){return e===N?0!==this.context.length?this.context[0]._iDisplayLength:N:this.iterator("table",function(t){Gt(t,e)})}),e("ajax.json()",function(){var t=this.context;if(0<t.length)return t[0].json}),e("ajax.params()",function(){var t=this.context;if(0<t.length)return t[0].oAjaxData}),e("ajax.reload()",function(e,n){return this.iterator("table",function(t){De(t,!1===n,e)})}),e("ajax.url()",function(e){var t=this.context;return e===N?0===t.length?N:(t=t[0]).ajax?P.isPlainObject(t.ajax)?t.ajax.url:t.ajax:t.sAjaxSource:this.iterator("table",function(t){P.isPlainObject(t.ajax)?t.ajax.url=e:t.ajax=e})}),e("ajax.url().load()",function(e,n){return this.iterator("table",function(t){De(t,!1===n,e)})}),function(t,e){var n,a=[],r=t.aiDisplay,o=t.aiDisplayMaster,i=e.search,l=e.order,e=e.page;if("ssp"==E(t))return"removed"===i?[]:f(0,o.length);if("current"==e)for(u=t._iDisplayStart,c=t.fnDisplayEnd();u<c;u++)a.push(r[u]);else if("current"==l||"applied"==l){if("none"==i)a=o.slice();else if("applied"==i)a=r.slice();else if("removed"==i){for(var s={},u=0,c=r.length;u<c;u++)s[r[u]]=null;a=P.map(o,function(t){return s.hasOwnProperty(t)?null:t})}}else if("index"==l||"original"==l)for(u=0,c=t.aoData.length;u<c;u++)("none"==i||-1===(n=P.inArray(u,r))&&"removed"==i||0<=n&&"applied"==i)&&a.push(u);return a}),Le=(e("rows()",function(e,n){e===N?e="":P.isPlainObject(e)&&(n=e,e=""),n=we(n);var t=this.iterator("table",function(t){return _e("row",e,function(n){var t=d(n),a=r.aoData;if(null!==t&&!o)return[t];if(i=i||Fe(r,o),null!==t&&-1!==P.inArray(t,i))return[t];if(null===n||n===N||""===n)return i;if("function"==typeof n)return P.map(i,function(t){var e=a[t];return n(t,e._aData,e.nTr)?t:null});if(n.nodeName)return t=n._DT_RowIndex,e=n._DT_CellIndex,t!==N?a[t]&&a[t].nTr===n?[t]:[]:e?a[e.row]&&a[e.row].nTr===n.parentNode?[e.row]:[]:(t=P(n).closest("*[data-dt-row]")).length?[t.data("dt-row")]:[];if("string"==typeof n&&"#"===n.charAt(0)){var e=r.aIds[n.replace(/^#/,"")];if(e!==N)return[e.idx]}t=_(m(r.aoData,i,"nTr"));return P(t).filter(n).map(function(){return this._DT_RowIndex}).toArray()},r=t,o=n);var r,o,i},1);return t.selector.rows=e,t.selector.opts=n,t}),e("rows().nodes()",function(){return this.iterator("row",function(t,e){return t.aoData[e].nTr||N},1)}),e("rows().data()",function(){return this.iterator(!0,"rows",function(t,e){return m(t.aoData,e,"_aData")},1)}),t("rows().cache()","row().cache()",function(n){return this.iterator("row",function(t,e){t=t.aoData[e];return"search"===n?t._aFilterData:t._aSortData},1)}),t("rows().invalidate()","row().invalidate()",function(n){return this.iterator("row",function(t,e){bt(t,e,n)})}),t("rows().indexes()","row().index()",function(){return this.iterator("row",function(t,e){return e},1)}),t("rows().ids()","row().id()",function(t){for(var e=[],n=this.context,a=0,r=n.length;a<r;a++)for(var o=0,i=this[a].length;o<i;o++){var l=n[a].rowIdFn(n[a].aoData[this[a][o]]._aData);e.push((!0===t?"#":"")+l)}return new B(n,e)}),t("rows().remove()","row().remove()",function(){var f=this;return this.iterator("row",function(t,e,n){var a,r,o,i,l,s,u=t.aoData,c=u[e];for(u.splice(e,1),a=0,r=u.length;a<r;a++)if(s=(l=u[a]).anCells,null!==l.nTr&&(l.nTr._DT_RowIndex=a),null!==s)for(o=0,i=s.length;o<i;o++)s[o]._DT_CellIndex.row=a;gt(t.aiDisplayMaster,e),gt(t.aiDisplay,e),gt(f[n],e,!1),0<t._iRecordsDisplay&&t._iRecordsDisplay--,Se(t);n=t.rowIdFn(c._aData);n!==N&&delete t.aIds[n]}),this.iterator("table",function(t){for(var e=0,n=t.aoData.length;e<n;e++)t.aoData[e].idx=e}),this}),e("rows.add()",function(o){var t=this.iterator("table",function(t){for(var e,n=[],a=0,r=o.length;a<r;a++)(e=o[a]).nodeName&&"TR"===e.nodeName.toUpperCase()?n.push(ut(t,e)[0]):n.push(x(t,e));return n},1),e=this.rows(-1);return e.pop(),P.merge(e,t),e}),e("row()",function(t,e){return Ce(this.rows(t,e))}),e("row().data()",function(t){var e,n=this.context;return t===N?n.length&&this.length?n[0].aoData[this[0]]._aData:N:((e=n[0].aoData[this[0]])._aData=t,Array.isArray(t)&&e.nTr&&e.nTr.id&&b(n[0].rowId)(t,e.nTr.id),bt(n[0],this[0],"data"),this)}),e("row().node()",function(){var t=this.context;return t.length&&this.length&&t[0].aoData[this[0]].nTr||null}),e("row.add()",function(e){e instanceof P&&e.length&&(e=e[0]);var t=this.iterator("table",function(t){return e.nodeName&&"TR"===e.nodeName.toUpperCase()?ut(t,e)[0]:x(t,e)});return this.row(t[0])}),P(y).on("plugin-init.dt",function(t,e){var n=new B(e),a="on-plugin-init",r="stateSaveParams."+a,o="destroy. "+a,a=(n.on(r,function(t,e,n){for(var a=e.rowIdFn,r=e.aoData,o=[],i=0;i<r.length;i++)r[i]._detailsShow&&o.push("#"+a(r[i]._aData));n.childRows=o}),n.on(o,function(){n.off(r+" "+o)}),n.state.loaded());a&&a.childRows&&n.rows(P.map(a.childRows,function(t){return t.replace(/:/g,"\\:")})).every(function(){R(e,null,"requestChild",[this])})}),w.util.throttle(function(t){de(t[0])},500)),Re=function(t,e){var n=t.context;n.length&&(e=n[0].aoData[e!==N?e:t[0]])&&e._details&&(e._details.remove(),e._detailsShow=N,e._details=N,P(e.nTr).removeClass("dt-hasChild"),Le(n))},Pe="row().child",je=Pe+"()",Ne=(e(je,function(t,e){var n=this.context;return t===N?n.length&&this.length?n[0].aoData[this[0]]._details:N:(!0===t?this.child.show():!1===t?Re(this):n.length&&this.length&&Te(n[0],n[0].aoData[this[0]],t,e),this)}),e([Pe+".show()",je+".show()"],function(t){return xe(this,!0),this}),e([Pe+".hide()",je+".hide()"],function(){return xe(this,!1),this}),e([Pe+".remove()",je+".remove()"],function(){return Re(this),this}),e(Pe+".isShown()",function(){var t=this.context;return t.length&&this.length&&t[0].aoData[this[0]]._detailsShow||!1}),/^([^:]+):(name|visIdx|visible)$/),He=(e("columns()",function(n,a){n===N?n="":P.isPlainObject(n)&&(a=n,n=""),a=we(a);var t=this.iterator("table",function(t){return e=n,l=a,s=(i=t).aoColumns,u=H(s,"sName"),c=H(s,"nTh"),_e("column",e,function(n){var a,t=d(n);if(""===n)return f(s.length);if(null!==t)return[0<=t?t:s.length+t];if("function"==typeof n)return a=Fe(i,l),P.map(s,function(t,e){return n(e,Ae(i,e,0,0,a),c[e])?e:null});var r="string"==typeof n?n.match(Ne):"";if(r)switch(r[2]){case"visIdx":case"visible":var e,o=parseInt(r[1],10);return o<0?[(e=P.map(s,function(t,e){return t.bVisible?e:null}))[e.length+o]]:[rt(i,o)];case"name":return P.map(u,function(t,e){return t===r[1]?e:null});default:return[]}return n.nodeName&&n._DT_CellIndex?[n._DT_CellIndex.column]:(t=P(c).filter(n).map(function(){return P.inArray(this,c)}).toArray()).length||!n.nodeName?t:(t=P(n).closest("*[data-dt-column]")).length?[t.data("dt-column")]:[]},i,l);var i,e,l,s,u,c},1);return t.selector.cols=n,t.selector.opts=a,t}),t("columns().header()","column().header()",function(t,e){return this.iterator("column",function(t,e){return t.aoColumns[e].nTh},1)}),t("columns().footer()","column().footer()",function(t,e){return this.iterator("column",function(t,e){return t.aoColumns[e].nTf},1)}),t("columns().data()","column().data()",function(){return this.iterator("column-rows",Ae,1)}),t("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(t,e){return t.aoColumns[e].mData},1)}),t("columns().cache()","column().cache()",function(o){return this.iterator("column-rows",function(t,e,n,a,r){return m(t.aoData,r,"search"===o?"_aFilterData":"_aSortData",e)},1)}),t("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(t,e,n,a,r){return m(t.aoData,r,"anCells",e)},1)}),t("columns().visible()","column().visible()",function(f,n){var e=this,t=this.iterator("column",function(t,e){if(f===N)return t.aoColumns[e].bVisible;var n,a,r=e,e=f,o=t.aoColumns,i=o[r],l=t.aoData;if(e===N)i.bVisible;else if(i.bVisible!==e){if(e)for(var s=P.inArray(!0,H(o,"bVisible"),r+1),u=0,c=l.length;u<c;u++)a=l[u].nTr,n=l[u].anCells,a&&a.insertBefore(n[r],n[s]||null);else P(H(t.aoData,"anCells",r)).detach();i.bVisible=e}});return f!==N&&this.iterator("table",function(t){Dt(t,t.aoHeader),Dt(t,t.aoFooter),t.aiDisplay.length||P(t.nTBody).find("td[colspan]").attr("colspan",T(t)),de(t),e.iterator("column",function(t,e){R(t,null,"column-visibility",[t,e,f,n])}),n!==N&&!n||e.columns.adjust()}),t}),t("columns().indexes()","column().index()",function(n){return this.iterator("column",function(t,e){return"visible"===n?ot(t,e):e},1)}),e("columns.adjust()",function(){return this.iterator("table",function(t){O(t)},1)}),e("column.index()",function(t,e){var n;if(0!==this.context.length)return n=this.context[0],"fromVisible"===t||"toData"===t?rt(n,e):"fromData"===t||"toVisible"===t?ot(n,e):void 0}),e("column()",function(t,e){return Ce(this.columns(t,e))}),e("cells()",function(g,t,b){var a,r,o,i,l,s,e;return P.isPlainObject(g)&&(g.row===N?(b=g,g=null):(b=t,t=null)),P.isPlainObject(t)&&(b=t,t=null),null===t||t===N?this.iterator("table",function(t){return a=t,t=g,e=we(b),f=a.aoData,d=Fe(a,e),n=_(m(f,d,"anCells")),h=P(Y([],n)),p=a.aoColumns.length,_e("cell",t,function(t){var e,n="function"==typeof t;if(null===t||t===N||n){for(o=[],i=0,l=d.length;i<l;i++)for(r=d[i],s=0;s<p;s++)u={row:r,column:s},(!n||(c=f[r],t(u,S(a,r,s),c.anCells?c.anCells[s]:null)))&&o.push(u);return o}return P.isPlainObject(t)?t.column!==N&&t.row!==N&&-1!==P.inArray(t.row,d)?[t]:[]:(e=h.filter(t).map(function(t,e){return{row:e._DT_CellIndex.row,column:e._DT_CellIndex.column}}).toArray()).length||!t.nodeName?e:(c=P(t).closest("*[data-dt-row]")).length?[{row:c.data("dt-row"),column:c.data("dt-column")}]:[]},a,e);var a,e,r,o,i,l,s,u,c,f,d,n,h,p}):(e=b?{page:b.page,order:b.order,search:b.search}:{},a=this.columns(t,e),r=this.rows(g,e),e=this.iterator("table",function(t,e){var n=[];for(o=0,i=r[e].length;o<i;o++)for(l=0,s=a[e].length;l<s;l++)n.push({row:r[e][o],column:a[e][l]});return n},1),e=b&&b.selected?this.cells(e,b):e,P.extend(e.selector,{cols:t,rows:g,opts:b}),e)}),t("cells().nodes()","cell().node()",function(){return this.iterator("cell",function(t,e,n){t=t.aoData[e];return t&&t.anCells?t.anCells[n]:N},1)}),e("cells().data()",function(){return this.iterator("cell",function(t,e,n){return S(t,e,n)},1)}),t("cells().cache()","cell().cache()",function(a){return a="search"===a?"_aFilterData":"_aSortData",this.iterator("cell",function(t,e,n){return t.aoData[e][a][n]},1)}),t("cells().render()","cell().render()",function(a){return this.iterator("cell",function(t,e,n){return S(t,e,n,a)},1)}),t("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(t,e,n){return{row:e,column:n,columnVisible:ot(t,n)}},1)}),t("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(t,e,n){bt(t,e,a,n)})}),e("cell()",function(t,e,n){return Ce(this.cells(t,e,n))}),e("cell().data()",function(t){var e=this.context,n=this[0];return t===N?e.length&&n.length?S(e[0],n[0].row,n[0].column):N:(ct(e[0],n[0].row,n[0].column,t),bt(e[0],n[0].row,"data",n[0].column),this)}),e("order()",function(e,t){var n=this.context;return e===N?0!==n.length?n[0].aaSorting:N:("number"==typeof e?e=[[e,t]]:e.length&&!Array.isArray(e[0])&&(e=Array.prototype.slice.call(arguments)),this.iterator("table",function(t){t.aaSorting=e.slice()}))}),e("order.listener()",function(e,n,a){return this.iterator("table",function(t){ue(t,e,n,a)})}),e("order.fixed()",function(e){var t;return e?this.iterator("table",function(t){t.aaSortingFixed=P.extend(!0,{},e)}):(t=(t=this.context).length?t[0].aaSortingFixed:N,Array.isArray(t)?{pre:t}:t)}),e(["columns().order()","column().order()"],function(a){var r=this;return this.iterator("table",function(t,e){var n=[];P.each(r[e],function(t,e){n.push([e,a])}),t.aaSorting=n})}),e("search()",function(e,n,a,r){var t=this.context;return e===N?0!==t.length?t[0].oPreviousSearch.sSearch:N:this.iterator("table",function(t){t.oFeatures.bFilter&&Rt(t,P.extend({},t.oPreviousSearch,{sSearch:e+"",bRegex:null!==n&&n,bSmart:null===a||a,bCaseInsensitive:null===r||r}),1)})}),t("columns().search()","column().search()",function(a,r,o,i){return this.iterator("column",function(t,e){var n=t.aoPreSearchCols;if(a===N)return n[e].sSearch;t.oFeatures.bFilter&&(P.extend(n[e],{sSearch:a+"",bRegex:null!==r&&r,bSmart:null===o||o,bCaseInsensitive:null===i||i}),Rt(t,t.oPreviousSearch,1))})}),e("state()",function(){return this.context.length?this.context[0].oSavedState:null}),e("state.clear()",function(){return this.iterator("table",function(t){t.fnStateSaveCallback.call(t.oInstance,t,{})})}),e("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null}),e("state.save()",function(){return this.iterator("table",function(t){de(t)})}),w.use=function(t,e){"lib"===e||t.fn?P=t:"win"!=e&&!t.document||(y=(j=t).document)},w.factory=function(t,e){var n=!1;return t&&t.document&&(y=(j=t).document),e&&e.fn&&e.fn.jquery&&(P=e,n=!0),n},w.versionCheck=w.fnVersionCheck=function(t){for(var e,n,a=w.version.split("."),r=t.split("."),o=0,i=r.length;o<i;o++)if((e=parseInt(a[o],10)||0)!==(n=parseInt(r[o],10)||0))return n<e;return!0},w.isDataTable=w.fnIsDataTable=function(t){var r=P(t).get(0),o=!1;return t instanceof w.Api||(P.each(w.settings,function(t,e){var n=e.nScrollHead?P("table",e.nScrollHead)[0]:null,a=e.nScrollFoot?P("table",e.nScrollFoot)[0]:null;e.nTable!==r&&n!==r&&a!==r||(o=!0)}),o)},w.tables=w.fnTables=function(e){var t=!1,n=(P.isPlainObject(e)&&(t=e.api,e=e.visible),P.map(w.settings,function(t){if(!e||P(t.nTable).is(":visible"))return t.nTable}));return t?new B(n):n},w.camelToHungarian=C,e("$()",function(t,e){e=this.rows(e).nodes(),e=P(e);return P([].concat(e.filter(t).toArray(),e.find(t).toArray()))}),P.each(["on","one","off"],function(t,n){e(n+"()",function(){var t=Array.prototype.slice.call(arguments),e=(t[0]=P.map(t[0].split(/\s/),function(t){return t.match(/\.dt\b/)?t:t+".dt"}).join(" "),P(this.tables().nodes()));return e[n].apply(e,t),this})}),e("clear()",function(){return this.iterator("table",function(t){pt(t)})}),e("settings()",function(){return new B(this.context,this.context)}),e("init()",function(){var t=this.context;return t.length?t[0].oInit:null}),e("data()",function(){return this.iterator("table",function(t){return H(t.aoData,"_aData")}).flatten()}),e("destroy()",function(c){return c=c||!1,this.iterator("table",function(e){var n,t=e.oClasses,a=e.nTable,r=e.nTBody,o=e.nTHead,i=e.nTFoot,l=P(a),r=P(r),s=P(e.nTableWrapper),u=P.map(e.aoData,function(t){return t.nTr}),i=(e.bDestroying=!0,R(e,"aoDestroyCallback","destroy",[e]),c||new B(e).columns().visible(!0),s.off(".DT").find(":not(tbody *)").off(".DT"),P(j).off(".DT-"+e.sInstance),a!=o.parentNode&&(l.children("thead").detach(),l.append(o)),i&&a!=i.parentNode&&(l.children("tfoot").detach(),l.append(i)),e.aaSorting=[],e.aaSortingFixed=[],ce(e),P(u).removeClass(e.asStripeClasses.join(" ")),P("th, td",o).removeClass(t.sSortable+" "+t.sSortableAsc+" "+t.sSortableDesc+" "+t.sSortableNone),r.children().detach(),r.append(u),e.nTableWrapper.parentNode),o=c?"remove":"detach",u=(l[o](),s[o](),!c&&i&&(i.insertBefore(a,e.nTableReinsertBefore),l.css("width",e.sDestroyWidth).removeClass(t.sTable),n=e.asDestroyStripes.length)&&r.children().each(function(t){P(this).addClass(e.asDestroyStripes[t%n])}),P.inArray(e,w.settings));-1!==u&&w.settings.splice(u,1)})}),P.each(["column","row","cell"],function(t,s){e(s+"s().every()",function(o){var i=this.selector.opts,l=this;return this.iterator(s,function(t,e,n,a,r){o.call(l[s](e,"cell"===s?n:i,"cell"===s?i:N),e,n,a,r)})})}),e("i18n()",function(t,e,n){var a=this.context[0],t=A(t)(a.oLanguage);return t===N&&(t=e),(t=n!==N&&P.isPlainObject(t)?t[n]!==N?t[n]:t._:t).replace("%d",n)}),w.version="1.13.4",w.settings=[],w.models={},w.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0,return:!1},w.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1},w.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null},w.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(t){return t.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(t){try{return JSON.parse((-1===t.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+t.sInstance+"_"+location.pathname))}catch(t){return{}}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(t,e){try{(-1===t.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+t.sInstance+"_"+location.pathname,JSON.stringify(e))}catch(t){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:P.extend({},w.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"},i(w.defaults),w.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null},i(w.defaults.column),w.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,jqXHR:null,json:N,oAjaxData:N,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==E(this)?+this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==E(this)?+this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var t=this._iDisplayLength,e=this._iDisplayStart,n=e+t,a=this.aiDisplay.length,r=this.oFeatures,o=r.bPaginate;return r.bServerSide?!1===o||-1===t?e+a:Math.min(e+t,this._iRecordsDisplay):!o||a<n||-1===t?a:n},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null},w.ext=p={buttons:{},classes:{},build:"dt/dt-1.13.4",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:w.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:w.version},P.extend(p,{afnFiltering:p.search,aTypes:p.type.detect,ofnSearch:p.type.search,oSort:p.type.order,afnSortData:p.order,aoFeatures:p.feature,oApi:p.internal,oStdClasses:p.classes,oPagination:p.pager}),P.extend(w.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_desc_disabled",sSortableDesc:"sorting_asc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""}),w.ext.pager);function Oe(t,e){var n=[],a=He.numbers_length,r=Math.floor(a/2);return e<=a?n=f(0,e):t<=r?((n=f(0,a-2)).push("ellipsis"),n.push(e-1)):((e-1-r<=t?n=f(e-(a-2),e):((n=f(t-r+2,t+r-1)).push("ellipsis"),n.push(e-1),n)).splice(0,0,"ellipsis"),n.splice(0,0,0)),n.DT_el="span",n}P.extend(He,{simple:function(t,e){return["previous","next"]},full:function(t,e){return["first","previous","next","last"]},numbers:function(t,e){return[Oe(t,e)]},simple_numbers:function(t,e){return["previous",Oe(t,e),"next"]},full_numbers:function(t,e){return["first","previous",Oe(t,e),"next","last"]},first_last_numbers:function(t,e){return["first",Oe(t,e),"last"]},_numbers:Oe,numbers_length:7}),P.extend(!0,w.ext.renderer,{pageButton:{_:function(c,t,f,e,d,h){function p(t,e){for(var n,a,r,o=m.sPageButtonDisabled,i=function(t){Yt(c,t.data.action,!0)},l=0,s=e.length;l<s;l++)if(n=e[l],Array.isArray(n)){var u=P("<"+(n.DT_el||"div")+"/>").appendTo(t);p(u,n)}else{switch(g=null,b=n,a=c.iTabIndex,n){case"ellipsis":t.append('<span class="ellipsis">&#x2026;</span>');break;case"first":g=S.sFirst,0===d&&(a=-1,b+=" "+o);break;case"previous":g=S.sPrevious,0===d&&(a=-1,b+=" "+o);break;case"next":g=S.sNext,0!==h&&d!==h-1||(a=-1,b+=" "+o);break;case"last":g=S.sLast,0!==h&&d!==h-1||(a=-1,b+=" "+o);break;default:g=c.fnFormatNumber(n+1),b=d===n?m.sPageButtonActive:""}null!==g&&(u=c.oInit.pagingTag||"a",r=-1!==b.indexOf(o),me(P("<"+u+">",{class:m.sPageButton+" "+b,"aria-controls":c.sTableId,"aria-disabled":r?"true":null,"aria-label":v[n],"aria-role":"link","aria-current":b===m.sPageButtonActive?"page":null,"data-dt-idx":n,tabindex:a,id:0===f&&"string"==typeof n?c.sTableId+"_"+n:null}).html(g).appendTo(t),{action:n},i))}}var g,b,n,m=c.oClasses,S=c.oLanguage.oPaginate,v=c.oLanguage.oAria.paginate||{};try{n=P(t).find(y.activeElement).data("dt-idx")}catch(t){}p(P(t).empty(),e),n!==N&&P(t).find("[data-dt-idx="+n+"]").trigger("focus")}}}),P.extend(w.ext.type.detect,[function(t,e){e=e.oLanguage.sDecimal;return l(t,e)?"num"+e:null},function(t,e){var n;return(!t||t instanceof Date||X.test(t))&&(null!==(n=Date.parse(t))&&!isNaN(n)||h(t))?"date":null},function(t,e){e=e.oLanguage.sDecimal;return l(t,e,!0)?"num-fmt"+e:null},function(t,e){e=e.oLanguage.sDecimal;return a(t,e)?"html-num"+e:null},function(t,e){e=e.oLanguage.sDecimal;return a(t,e,!0)?"html-num-fmt"+e:null},function(t,e){return h(t)||"string"==typeof t&&-1!==t.indexOf("<")?"html":null}]),P.extend(w.ext.type.search,{html:function(t){return h(t)?t:"string"==typeof t?t.replace(U," ").replace(V,""):""},string:function(t){return!h(t)&&"string"==typeof t?t.replace(U," "):t}});function ke(t,e,n,a){var r;return 0===t||t&&"-"!==t?"number"==(r=typeof t)||"bigint"==r?t:+(t=(t=e?G(t,e):t).replace&&(n&&(t=t.replace(n,"")),a)?t.replace(a,""):t):-1/0}function Me(n){P.each({num:function(t){return ke(t,n)},"num-fmt":function(t){return ke(t,n,q)},"html-num":function(t){return ke(t,n,V)},"html-num-fmt":function(t){return ke(t,n,V,q)}},function(t,e){p.type.order[t+n+"-pre"]=e,t.match(/^html\-/)&&(p.type.search[t+n]=p.type.search.html)})}P.extend(p.type.order,{"date-pre":function(t){t=Date.parse(t);return isNaN(t)?-1/0:t},"html-pre":function(t){return h(t)?"":t.replace?t.replace(/<.*?>/g,"").toLowerCase():t+""},"string-pre":function(t){return h(t)?"":"string"==typeof t?t.toLowerCase():t.toString?t.toString():""},"string-asc":function(t,e){return t<e?-1:e<t?1:0},"string-desc":function(t,e){return t<e?1:e<t?-1:0}}),Me(""),P.extend(!0,w.ext.renderer,{header:{_:function(r,o,i,l){P(r.nTable).on("order.dt.DT",function(t,e,n,a){r===e&&(e=i.idx,o.removeClass(l.sSortAsc+" "+l.sSortDesc).addClass("asc"==a[e]?l.sSortAsc:"desc"==a[e]?l.sSortDesc:i.sSortingClass))})},jqueryui:function(r,o,i,l){P("<div/>").addClass(l.sSortJUIWrapper).append(o.contents()).append(P("<span/>").addClass(l.sSortIcon+" "+i.sSortingClassJUI)).appendTo(o),P(r.nTable).on("order.dt.DT",function(t,e,n,a){r===e&&(e=i.idx,o.removeClass(l.sSortAsc+" "+l.sSortDesc).addClass("asc"==a[e]?l.sSortAsc:"desc"==a[e]?l.sSortDesc:i.sSortingClass),o.find("span."+l.sSortIcon).removeClass(l.sSortJUIAsc+" "+l.sSortJUIDesc+" "+l.sSortJUI+" "+l.sSortJUIAscAllowed+" "+l.sSortJUIDescAllowed).addClass("asc"==a[e]?l.sSortJUIAsc:"desc"==a[e]?l.sSortJUIDesc:i.sSortingClassJUI))})}}});function We(t){return"string"==typeof(t=Array.isArray(t)?t.join(","):t)?t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):t}function Ee(t,e,n,a,r){return j.moment?t[e](r):j.luxon?t[n](r):a?t[a](r):t}var Be=!1;function Ue(t,e,n){var a;if(j.moment){if(!(a=j.moment.utc(t,e,n,!0)).isValid())return null}else if(j.luxon){if(!(a=e&&"string"==typeof t?j.luxon.DateTime.fromFormat(t,e):j.luxon.DateTime.fromISO(t)).isValid)return null;a.setLocale(n)}else e?(Be||alert("DataTables warning: Formatted date without Moment.js or Luxon - https://datatables.net/tn/17"),Be=!0):a=new Date(t);return a}function Ve(s){return function(a,r,o,i){0===arguments.length?(o="en",a=r=null):1===arguments.length?(o="en",r=a,a=null):2===arguments.length&&(o=r,r=a,a=null);var l="datetime-"+r;return w.ext.type.order[l]||(w.ext.type.detect.unshift(function(t){return t===l&&l}),w.ext.type.order[l+"-asc"]=function(t,e){t=t.valueOf(),e=e.valueOf();return t===e?0:t<e?-1:1},w.ext.type.order[l+"-desc"]=function(t,e){t=t.valueOf(),e=e.valueOf();return t===e?0:e<t?-1:1}),function(t,e){var n;return null!==t&&t!==N||(t="--now"===i?(n=new Date,new Date(Date.UTC(n.getFullYear(),n.getMonth(),n.getDate(),n.getHours(),n.getMinutes(),n.getSeconds()))):""),"type"===e?l:""===t?"sort"!==e?"":Ue("0000-01-01 00:00:00",null,o):!(null===r||a!==r||"sort"===e||"type"===e||t instanceof Date)||null===(n=Ue(t,a,o))?t:"sort"===e?n:(t=null===r?Ee(n,"toDate","toJSDate","")[s]():Ee(n,"format","toFormat","toISOString",r),"dis
23156play"===e?We(t):t)}}}var Xe=",",Je=".";if(Intl)try{for(var qe=(new Intl.NumberFormat).formatToParts(100000.1),n=0;n<qe.length;n++)"group"===qe[n].type?Xe=qe[n].value:"decimal"===qe[n].type&&(Je=qe[n].value)}catch(t){}function Ge(e){return function(){var t=[ge(this[w.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return w.ext.internal[e].apply(this,t)}}return w.datetime=function(n,a){var r="datetime-detect-"+n;a=a||"en",w.ext.type.order[r]||(w.ext.type.detect.unshift(function(t){var e=Ue(t,n,a);return!(""!==t&&!e)&&r}),w.ext.type.order[r+"-pre"]=function(t){return Ue(t,n,a)||0})},w.render={date:Ve("toLocaleDateString"),datetime:Ve("toLocaleString"),time:Ve("toLocaleTimeString"),number:function(a,r,o,i,l){return null!==a&&a!==N||(a=Xe),null!==r&&r!==N||(r=Je),{display:function(t){if("number"!=typeof t&&"string"!=typeof t)return t;if(""===t||null===t)return t;var e=t<0?"-":"",n=parseFloat(t);if(isNaN(n))return We(t);n=n.toFixed(o),t=Math.abs(n);n=parseInt(t,10),t=o?r+(t-n).toFixed(o).substring(2):"";return(e=0===n&&0===parseFloat(t)?"":e)+(i||"")+n.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+t+(l||"")}}},text:function(){return{display:We,filter:We}}},P.extend(w.ext.internal,{_fnExternApiFunc:Ge,_fnBuildAjax:Tt,_fnAjaxUpdate:xt,_fnAjaxParameters:At,_fnAjaxUpdateDraw:It,_fnAjaxDataSrc:Ft,_fnAddColumn:nt,_fnColumnOptions:at,_fnAdjustColumnSizing:O,_fnVisibleToColumnIndex:rt,_fnColumnIndexToVisible:ot,_fnVisbleColumns:T,_fnGetColumns:it,_fnColumnTypes:lt,_fnApplyColumnDefs:st,_fnHungarianMap:i,_fnCamelToHungarian:C,_fnLanguageCompat:Z,_fnBrowserDetect:tt,_fnAddData:x,_fnAddTr:ut,_fnNodeToDataIndex:function(t,e){return e._DT_RowIndex!==N?e._DT_RowIndex:null},_fnNodeToColumnIndex:function(t,e,n){return P.inArray(n,t.aoData[e].anCells)},_fnGetCellData:S,_fnSetCellData:ct,_fnSplitObjNotation:dt,_fnGetObjectDataFn:A,_fnSetObjectDataFn:b,_fnGetDataMaster:ht,_fnClearTable:pt,_fnDeleteIndex:gt,_fnInvalidate:bt,_fnGetRowElements:mt,_fnCreateTr:St,_fnBuildHead:yt,_fnDrawHead:Dt,_fnDraw:v,_fnReDraw:u,_fnAddOptionsHtml:_t,_fnDetectHeader:wt,_fnGetUniqueThs:Ct,_fnFeatureHtmlFilter:Lt,_fnFilterComplete:Rt,_fnFilterCustom:Pt,_fnFilterColumn:jt,_fnFilter:Nt,_fnFilterCreateSearch:Ht,_fnEscapeRegex:Ot,_fnFilterData:Wt,_fnFeatureHtmlInfo:Ut,_fnUpdateInfo:Vt,_fnInfoMacros:Xt,_fnInitialise:Jt,_fnInitComplete:qt,_fnLengthChange:Gt,_fnFeatureHtmlLength:$t,_fnFeatureHtmlPaginate:zt,_fnPageChange:Yt,_fnFeatureHtmlProcessing:Zt,_fnProcessingDisplay:D,_fnFeatureHtmlTable:Kt,_fnScrollDraw:Qt,_fnApplyToChildren:k,_fnCalculateColumnWidths:ee,_fnThrottle:ne,_fnConvertToWidth:ae,_fnGetWidestNode:re,_fnGetMaxLenString:oe,_fnStringToCss:M,_fnSortFlatten:I,_fnSort:ie,_fnSortAria:le,_fnSortListener:se,_fnSortAttachListener:ue,_fnSortingClasses:ce,_fnSortData:fe,_fnSaveState:de,_fnLoadState:he,_fnImplementState:pe,_fnSettingsFromNode:ge,_fnLog:W,_fnMap:F,_fnBindAction:me,_fnCallbackReg:L,_fnCallbackFire:R,_fnLengthOverflow:Se,_fnRenderer:ve,_fnDataSource:E,_fnRowAttributes:vt,_fnExtend:be,_fnCalculateEnd:function(){}}),((P.fn.dataTable=w).$=P).fn.dataTableSettings=w.settings,P.fn.dataTableExt=w.ext,P.fn.DataTable=function(t){return P(this).dataTable(t).api()},P.each(w,function(t,e){P.fn.DataTable[t]=e}),w});
23157
23158/*! DataTables styling integration
23159 * ©2018 SpryMedia Ltd - datatables.net/license
23160 */
23161!function(t){var o,d;"function"==typeof define&&define.amd?define(["jquery","datatables.net"],function(e){return t(e,window,document)}):"object"==typeof exports?(o=require("jquery"),d=function(e,n){
23161n.fn.dataTable||require("datatables.net")(e,n)},"undefined"!=typeof window?module.exports=function(e,n){return e=e||window,n=n||o(e),d(e,n),t(n,0,e.document)}:(d(window,o),module.exports=t(o,window,window.document))):t(jQuery,window,document)}(function(e,n,t,o){"use strict";return e.fn.dataTable});
23162
23163
23164(function ($) {
23165    if ($('.simplified .timeline_print_table').length) {
23166        $('.timeline_print_table').DataTable({
23167            order: [[1, 'asc']],
23168            paging: false,
23169            searching: false,
23170            info: false
23171        });
23172    }
23173
23174    let resetButton = $('.timeline__filter_search_input .reset-button button');
23175    let resetButtonWrapper = $('.timeline__filter_search_input .reset-button');
23176
23177    if (resetButton) {
23178        let searchInput = $('#timeline-search-input');
23179        let searchInputModal = $('#timeline-search-input-modal');
23180        resetButton.on('click', () => {
23181            resetButtonWrapper.hide();
23182            if (searchInput.length) {
23183                searchInput.val('');
23184                var eventKeyup = new Event('keyup');
23185                document.querySelector('#timeline-search-input').dispatchEvent(eventKeyup);
23186            }
23187
23188            if (searchInputModal.length) {
23189                searchInputModal.val('');
23190                var eventKeyup = new Event('keyup');
23191                document.querySelector('#timeline-search-input-modal').dispatchEvent(eventKeyup);
23192            }
23193        });
23194
23195        if (searchInput.length) {
23196            searchInput.on('input', () => {
23197                if (searchInput.val().length > 0) {
23198                    resetButtonWrapper.css('display', 'flex');
23199                } else {
23200                    resetButtonWrapper.css('display', 'none');
23201                }
23202            });
23203
23204            searchInput.on('keydown', (event) => {
23205                if (event.keyCode === 13) {
23206                    event.preventDefault();
23207                    $('#modal-timeline').modal('show');
23208                }
23209            });
23210        }
23211
23212        if (searchInputModal.length) {
23213            searchInputModal.on('input', () => {
23214                if (searchInputModal.val().length > 0) {
23215                    resetButtonWrapper.css('display', 'flex');
23216                } else {
23217                    resetButtonWrapper.css('display', 'none');
23218                }
23219            });
23220        }
23221    }
23222})(jQuery);
23223
23224document.addEventListener('DOMContentLoaded', function () {
23225  const pageRetrospective = document.querySelector(".section-retrospective");
23226
23227  if (pageRetrospective) {
23228
23229    // Stock si la page contient la div gabarit-press-folder
23230    const gabaritPressFolder = pageRetrospective.querySelector('.gabarit-press-folder');
23231
23232    // Créer une fausse actualités qui sert de sommaire
23233    if (gabaritPressFolder) {
23234      // Create the main container
23235      const newsItemSummary = pageRetrospective.querySelector(".news-tiles__summary");
23236      if (newsItemSummary) {
23237        const html = pageRetrospective.querySelector('.list-news-tiles-navigation .sidebar-box__header');
23238        html.insertAdjacentHTML('afterend', newsItemSummary.outerHTML);
23239      }
23240    }
23241
23242    // Sélectionne tous les éléments de news
23243    const newsItems = pageRetrospective.querySelectorAll(".news-tiles .news-tiles__item");
23244    // Convertit NodeList en Array pour plus de facilité
23245    const newsArray = Array.from(newsItems);
23246    // Stocke les éléments des actualités
23247    const newsLinks = newsArray;
23248
23249    let currentIndex = -1; // Initialise l'index actuel
23250
23251    // Fonction pour supprimer le popup et les écouteurs associés
23252    const removeModal = () => {
23253      const modal = pageRetrospective.querySelector(".news-retrospective-inner");
23254      if (modal) {
23255        // Définir un gestionnaire pour 'transitionend'
23256        const handleTransition = (event) => {
23257          // Vérifier si la propriété 'opacity' a terminé la transition
23258          if (event.propertyName === 'opacity') {
23259            modal.removeEventListener('transitionend', handleTransition);
23260          }
23261        };
23262
23263        modal.style.display = "none";
23264        // Ajouter l'écouteur 'transitionend' uniquement pour 'opacity'
23265        modal.addEventListener('transitionend', handleTransition);
23266      }
23267      document.removeEventListener("keydown", window.handleKeyDown);
23268    };
23269
23270    // Définir handleKeyDown comme une fonction globale
23271    window.handleKeyDown = function (evt) {
23272      evt = evt || window.event;
23273      const isEscape = evt.key === "Escape" || evt.key === "Esc" || evt.keyCode === 27;
23274      const isArrowLeft = evt.key === "ArrowLeft" || evt.keyCode === 37;
23275      const isArrowRight = evt.key === "ArrowRight" || evt.keyCode === 39;
23276
23277      if (isEscape) {
23278        removeModal();
23279      } else if (isArrowLeft) {
23280        // Navigue vers l'actualité précédente
23281        if (currentIndex > 0) {
23282          openPopupAtIndex(currentIndex - 1);
23283        } else {
23284          currentIndex = newsLinks.length - 1;
23285          openPopupAtIndex(currentIndex);
23286        }
23287      } else if (isArrowRight) {
23288        // Navigue vers l'actualité suivante
23289        if (currentIndex < newsLinks.length - 1) {
23290          openPopupAtIndex(currentIndex + 1);
23291        } else {
23292          currentIndex = 0;
23293          openPopupAtIndex(currentIndex);
23294        }
23295      }
23296    };
23297
23298    // Au clique sur la croix pour supprimer le popup
23299    const closeButton = pageRetrospective.querySelector(".news-retrospective-inner article .news-tile__close");
23300    if (closeButton) closeButton.addEventListener("click", removeModal);
23301
23302    // Fonction pour gérer les touches fléchées et Escape
23303    const handleKeyDown = window.handleKeyDown;
23304
23305    // Fonction pour charger les images de fond et retourner une Promise
23306    const loadBackgroundImage = (imageUrl) => {
23307      return new Promise((resolve, reject) => {
23308        const img = new Image();
23309        // Extraire l'URL de l'image depuis la propriété CSS backgroundImage
23310        const matches = imageUrl.match(/url\(['"]?(.*?)['"]?\)/);
23311        if (matches && matches[1]) {
23312          img.src = matches[1];
23313          img.onload = resolve;
23314          img.onerror = reject;
23315        } else {
23316          // Si aucune URL trouvée, résoudre immédiatement
23317          resolve();
23318        }
23319      });
23320    };
23321
23322    const navigationPosition = (modalTitle) => {
23323      let titleRect = modalTitle.getBoundingClientRect();
23324      const navigation = pageRetrospective.querySelector(".news-retrospective-inner article .news-tile__navigation");
23325      let marge = 40;
23326      if (window.innerWidth > 861 && window.innerWidth < 1024) marge = 10;
23327      navigation.style.width = `calc(${titleRect.width}px + 72px + ${marge}px)`;
23328      navigation.style.top = `${titleRect.top}px`;
23329    }
23330
23331    // Fonction pour ouvrir le popup à un index donné avec loader
23332    const openPopupAtIndex = (index) => {
23333      currentIndex = index;
23334
23335      const menuNews = pageRetrospective.querySelector(".news-retrospective-inner .list-news-tiles-navigation");
23336      if (menuNews.classList.contains("visible")) menuNews.classList.remove("visible");
23337
23338      // Supprime le filtre orange si il en existe déjà un
23339      const actif = document.querySelector(".section-retrospective .news-retrospective-inner .isActif");
23340      if (actif) actif.remove();
23341
23342      // Ajoute le filtre orange à l'item actif
23343      const div = document.createElement("div");
23344      div.classList.add("isActif");
23345      div.innerHTML = '<svg id="Calque_1" data-name="Calque 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 38.53"><defs><style>.cls-blc{fill:#fff;}</style></defs><title>Visibilite</title>
23345<path class="cls-blc" d="M12.78,28.67,9.87,25.75l2.35-2.36,2.92,2.92Zm-1.5-2.92,1.5,1.51,1-1L12.22,24.8Z"/><path class="cls-blc" d="M2.92,38.53,0,35.61l2.36-2.36,2.92,2.92ZM1.41,35.61l1.51,1.51,1-.95L2.36,34.66Z"/><path class="cls-blc" d="M21.65,29.1a12.22,12.22,0,1,1,8.65-3.57A12.22,12.22,0,0,1,21.65,29.1Zm0-23.45a11.23,11.23,0,1,0,8,3.28A11.2,11.2,0,0,0,21.65,5.65Zm0,21.07a9.85,9.85,0,1,1,7-2.88h0A9.82,9.82,0,0,1,21.65,26.72ZM21.65,8a8.85,8.85,0,1,0,6.26,2.59A8.83,8.83,0,0,0,21.65,8Z"/><path class="cls-blc" d="M5.18,37.49,1,33.35,10,24.43l4.14,4.14ZM2.45,33.35l2.73,2.73,7.51-7.51L10,25.84Z"/><rect class="cls-blc" x="4.87" y="30.74" width="1" height="4.85" transform="translate(-21.88 13.51) rotate(-45)"/><rect class="cls-blc" x="9.27" y="26.33" width="1" height="4.85" transform="translate(-17.47 15.34) rotate(-45)"/><rect class="cls-blc" x="19.3" y="16.33" width="0.96" height="1"/><rect class="cls-blc" x="23.14" y="16.33" width="0.96" height="1"/><rect class="cls-blc" x="21.2" y="18.27" width="1" height="0.96"/><rect class="cls-blc" x="21.2" y="14.43" width="1" height="0.96"/><rect class="cls-blc" x="14.66" y="34.61" width="0.96" height="1" transform="translate(-20.39 20.98) rotate(-45)"/><rect class="cls-blc" x="17.38" y="31.89" width="0.96" height="1" transform="translate(-17.67 22.11) rotate(-45)"/><rect class="cls-blc" x="17.36" y="34.63" width="1" height="0.96" transform="translate(-19.6 22.91) rotate(-45)"/><rect class="cls-blc" x="14.64" y="31.91" width="1" height="0.96" transform="translate(-18.47 20.19) rotate(-45)"/><rect class="cls-blc" x="36.11" y="18.18" width="0.96" height="1" transform="translate(-2.49 31.34) rotate(-45)"/><rect class="cls-blc" x="38.83" y="15.46" width="0.96" height="1" transform="translate(0.23 32.47) rotate(-45)"/><rect class="cls-blc" x="38.81" y="18.2" width="1" height="0.96" transform="translate(-1.7 33.26) rotate(-45)"/><rect class="cls-blc" x="36.09" y="15.48" width="1" height="0.96" transform="translate(-0.57 30.55) rotate(-45)"/><rect class="cls-blc" x="1.9" y="19.13" width="0.96" height="1" transform="translate(-13.19 7.43) rotate(-45)"/><rect class="cls-blc" x="4.62" y="16.41" width="0.96" height="1" transform="translate(-10.47 8.56) rotate(-45)"/><rect class="cls-blc" x="4.6" y="19.15" width="1" height="0.96" transform="translate(-12.39 9.35) rotate(-45)"/><rect class="cls-blc" x="1.88" y="16.43" width="1" height="0.96" transform="translate(-11.26 6.64) rotate(-45)"/><polygon class="cls-blc" points="38.48 33.66 31.55 33.66 31.55 32.66 37.49 32.66 37.49 26.73 38.48 26.73 38.48 33.66"/><polygon class="cls-blc" points="5.82 6.93 4.82 6.93 4.82 0 11.76 0 11.76 1 5.82 1 5.82 6.93"/><polygon class="cls-blc" points="38.48 6.93 37.49 6.93 37.49 1 31.55 1 31.55 0 38.48 0 38.48 6.93"/></svg>';
23346      newsLinks[currentIndex].querySelector(".news-tile").appendChild(div);
23347
23348      // Supprime l'ancien popup s'il existe
23349      removeModal();
23350
23351      const modal = pageRetrospective.querySelector(".news-retrospective-inner");
23352      if (modal) {
23353        modal.style.display = "flex"; // Afficher la modal
23354
23355        modal.querySelector("article").scrollTo(0, 0);
23356
23357        // Créer et ajouter le loader
23358        const loader = document.createElement("div");
23359        loader.classList.add("loader");
23360        loader.setAttribute("role", "status");
23361        loader.setAttribute("aria-live", "polite");
23362        modal.appendChild(loader);
23363
23364        // Forcer le reflow pour permettre la transition
23365        void modal.offsetWidth;
23366
23367        // Mettre à jour le contenu de la modal
23368        // Mettre à jour le titre
23369        const modalTitle = pageRetrospective.querySelector(".news-retrospective-inner article .news-tile__content h1");
23370        const newsTitle = newsLinks[currentIndex].querySelector(".news-tile__content h1")
23371          ? newsLinks[currentIndex].querySelector(".news-tile__content h1").innerHTML
23372          : "Aucun titre n'existe pour cet article.";
23373        if (modalTitle) modalTitle.innerHTML = newsTitle;
23374
23375        // Mettre à jour le corps
23376        const modalBody = pageRetrospective.querySelector(".news-retrospective-inner article .news-tile__body");
23377        const newsBody = newsLinks[currentIndex].querySelector(".news-tile__body")
23378          ? newsLinks[currentIndex].querySelector(".news-tile__body").innerHTML
23379          : "Aucun contenu disponible.";
23380        if (modalBody && newsBody) {
23381          modalBody.innerHTML = newsBody;
23382        }
23383
23384        // Mettre à jour l'image de fond
23385        const modalBackground = pageRetrospective.querySelector(".news-retrospective-inner article");
23386        const newsBackground = newsLinks[currentIndex].querySelector(".news-tile__bg span");
23387        let imageLoadPromise = Promise.resolve();
23388        if (newsBackground) {
23389          const image = newsBackground.style.backgroundImage;
23390          modalBackground.style.backgroundImage = image;
23391
23392          // Attendre que l'image de fond soit chargée
23393          imageLoadPromise = loadBackgroundImage(image);
23394        }
23395
23396        // Ajoute l'écouteur pour les liens du sommaire
23397        if (gabaritPressFolder) {
23398          const summaryLinks = modalBackground.querySelectorAll(".summary-news-tile__link");
23399          if (summaryLinks.length > 0) {
23400            summaryLinks.forEach((link, index) => {
23401              link.addEventListener("click", (e) => {
23402                e.preventDefault();
23403                openPopupAtIndex(index + 1);
23404                // Scroll to the news
23405                menuNews.scrollTo({ top: newsLinks[index + 1].offsetTop, behavior: 'smooth'});
23406              });
23407            });
23408          }
23409        }
23410
23411        // Après la mise à jour du contenu et le chargement de l'image, retirer le loader
23412        imageLoadPromise.then(() => {
23413          loader.remove();
23414        }).catch(() => {
23415          loader.remove();
23416          console.error("Échec du chargement de l'image de fond.");
23417        });
23418
23419        // Met à jour la position des flèches de navigation selon le titre par défaut
23420        navigationPosition(modalTitle);
23421
23422        // Ferme le popup en cliquant sur l'overlay
23423        const overlay = pageRetrospective.querySelector(".news-retrospective-inner .news-popup__overlay");
23424        if (overlay) {
23425          overlay.addEventListener("click", removeModal, { once: true });
23426        }
23427
23428        // Ajoute l'écouteur pour les touches (dans le parent)
23429        document.addEventListener("keydown", handleKeyDown);
23430
23431        // MATOMO
23432        var articleTitle = newsLinks[currentIndex].querySelector(".news-tile__content h1").innerHTML;
23433        var articleUrl = newsLinks[currentIndex].querySelector(".news-tile__url").href;
23434
23435        if (articleUrl) {
23436          // Get the current page URL to append the article as a subpage
23437          var currentPageUrl = window.location.pathname;
23438          var virtualPageUrl = currentPageUrl + '/news/' + articleUrl;
23439
23440          _paq.push(['setCustomUrl', virtualPageUrl]); // Set URL with subfolder
23441          _paq.push(['setDocumentTitle', articleTitle]); // Set title for better analytics
23442          _paq.push(['trackPageView']); // Track as a virtual pageview
23443        }
23444      }
23445    };
23446
23447    const modalTitle = pageRetrospective.querySelector(".news-retrospective-inner article .news-tile__content h1");
23448    // Met à jour la position des flèches de navigation selon le titre
23449    if (modalTitle) {
23450      window.addEventListener('resize', function (event) {
23451        navigationPosition(modalTitle);
23452      }, true);
23453    }
23454
23455    // Ajoute l'écouteur d'événement click à chaque élément de news
23456    newsArray.forEach((item, index) => {
23457      item.addEventListener("click", (e) => {
23458        e.preventDefault();
23459        if (newsLinks[index]) {
23460          openPopupAtIndex(index);
23461        }
23462      });
23463    });
23464
23465    // Au clique sur les flèches de navigation
23466    const leftButton = pageRetrospective.querySelector(".news-retrospective-inner article .navigation-left");
23467    const rightButton = pageRetrospective.querySelector(".news-retrospective-inner article .navigation-right");
23468    if (leftButton) {
23469      // Navigue vers l'actualité précédente
23470      leftButton.addEventListener("click", () => {
23471        if (currentIndex > 0) {
23472          openPopupAtIndex(currentIndex - 1);
23473        } else {
23474          currentIndex = newsLinks.length - 1;
23475          openPopupAtIndex(currentIndex);
23476        }
23477      });
23478    }
23479    if (rightButton) {
23480      // Navigue vers l'actualité suivante
23481      rightButton.addEventListener("click", () => {
23482        if (currentIndex < newsLinks.length - 1) {
23483          openPopupAtIndex(currentIndex + 1);
23484        } else {
23485          currentIndex = 0;
23486          openPopupAtIndex(currentIndex);
23487        }
23488      });
23489    }
23490
23491    // Trigger menu header
23492    const menuHeaderButton = pageRetrospective.querySelector(".toggle-news-
23492header");
23493    if (menuHeaderButton) {
23494      menuHeaderButton.addEventListener("click", () => {
23495        document.querySelector("body").classList.toggle("is-menu");
23496        const mainHeaderNav = document.querySelector(".is-menu .main-header__nav");
23497        mainHeaderNav.click();
23498        const prevs = mainHeaderNav.querySelectorAll(".submenu__breadcrumbs__prev");
23499        if (prevs.length > 0) {
23500          prevs.forEach((prev) => {
23501            prev.addEventListener("click", (e) => {
23502              e.preventDefault();
23503              const subPrevs = mainHeaderNav.querySelectorAll(".submenu__menu__links li a");
23504              if (subPrevs.length > 0) {
23505                subPrevs.forEach((subPrev) => {
23506                  subPrev.addEventListener("click", (e) => {
23507                    if (subPrev.getAttribute("data-submenu")) {
23508                      e.preventDefault();
23509                      document.querySelector("body").classList.add("is-menu");
23510                    }
23511                  });
23512                });
23513              }
23514              document.querySelector("body").classList.add("is-menu");
23515            });
23516          });
23517        }
23518      });
23519    }
23520
23521    // Menu mobile
23522    const menuNewsButton = pageRetrospective.querySelector(".toggle-news-tiles-button");
23523    if (menuNewsButton) {
23524      menuNewsButton.addEventListener("click", () => {
23525        const menuNews = pageRetrospective.querySelector(".news-retrospective-inner .list-news-tiles-navigation");
23526        if (menuNews.classList.contains("visible")) {
23527          menuNews.classList.remove("visible");
23528        } else {
23529          menuNews.classList.add("visible");
23530        }
23531      });
23532    }
23533
23534    // Change la hauteur de l'ombre de l'article au scroll
23535    const article = pageRetrospective.querySelector(".news-retrospective-inner article");
23536    if (article) {
23537      article.addEventListener("scroll", (event) => {
23538        let scroll = event.target.scrollTop;
23539        let newValue = 320 + scroll;
23540        article.style.boxShadow = `inset 0em -${newValue}px 20px rgba(0, 0, 0, .3)`;
23541      });
23542    }
23543
23544    if (!gabaritPressFolder) {
23545      // Convertir les dates et trier les éléments par date décroissante
23546      newsArray.sort((a, b) => {
23547        const dateA = new Date(a.querySelector('.news-tile__date'));
23548        const dateB = new Date(b.querySelector('.news-tile__date'));
23549        return dateB - dateA; // Décroissant
23550      });
23551
23552      // Grouper les éléments par mois
23553      const groupedNews = newsArray.reduce((groups, item) => {
23554        const date = item.querySelector('.news-tile__date').innerHTML;
23555        const monthYear = date; // Exemple : "mars 2024"
23556
23557        if (!groups[monthYear]) {
23558          groups[monthYear] = [];
23559        }
23560        groups[monthYear].push(item);
23561        return groups;
23562      }, {});
23563
23564      const newsContainer = pageRetrospective.querySelector('.list-news-tiles-navigation');
23565
23566      // Fonction pour capitaliser la première lettre du mois
23567      const capitalizeFirstLetter = (string) => {
23568        return string.charAt(0).toUpperCase() + string.slice(1);
23569      }
23570
23571      // Créer des sections pour chaque mois
23572      Object.keys(groupedNews).forEach(month => {
23573        // Créer l'en-tête du mois
23574        const header = document.createElement('h2');
23575        header.textContent = capitalizeFirstLetter(month);
23576        header.classList.add("news-group-month");
23577        newsContainer.appendChild(header);
23578
23579        // Créer un conteneur pour les articles de ce mois
23580        const groupDiv = document.createElement('div');
23581        groupDiv.classList.add('news-group');
23582
23583        // Ajouter chaque article au conteneur
23584        groupedNews[month].forEach(item => {
23585          groupDiv.appendChild(item);
23586        });
23587
23588        newsContainer.appendChild(groupDiv);
23589      });
23590    }
23591
23592    if (gabaritPressFolder) {
23593      // Cliquer sur le jumbotron
23594      const jumbotron = document.querySelector(".section-retrospective #header_jumbotron");
23595      if (jumbotron) {
23596        jumbotron.addEventListener("click", (e) => {
23597          e.preventDefault();
23598
23599          if (newsLinks[0]) newsLinks[0].click();
23600        });
23601      } else {
23602        console.warn("Aucun élément 'jumbotron' trouvé dans l'article.");
23603      }
23604
23605      // Get the full URL
23606      const url = new URL(window.location.href);
23607
23608      // Use URLSearchParams to get the "news" parameter
23609      const params = new URLSearchParams(url.search);
23610      const newsValue = params.get("news");
23611
23612      if (newsValue) {
23613        // Convert to a number (if exists)
23614        const newsNumber = newsValue ? parseInt(newsValue, 10) : null;
23615        openPopupAtIndex(newsNumber || 0);
23616      }
23617    }
23618  }
23619});
23620
23621document.addEventListener('DOMContentLoaded', () => {
23622    const isLongFormat = document.querySelector('.isLongFormat');
23623
23624    // Check if element is visible
23625    const checkVisible = (elm) => {
23626        var rect = elm.getBoundingClientRect();
23627        var viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight);
23628        return !(rect.bottom < 0 || rect.top - viewHeight >= 0);
23629    }
23630
23631    // Only for page long format
23632    if (isLongFormat) {
23633        const article = isLongFormat.querySelector(".page-grid__content");
23634        // Add reading time in news
23635        const readingTime = () => {
23636            const text = article.innerText;
23637            const wpm = 225;
23638            const words = text.trim().split(/\s+/).length;
23639            const time = Math.ceil(words / wpm);
23640            document.getElementById("time").innerText = time;
23641        }
23642
23643        if (article) {
23644            readingTime();
23645
23646            article.addEventListener("mouseenter", () => {
23647                article.addEventListener("mousemove", (e) => {
23648                    document.documentElement.style.setProperty("--borderPositionLG", e.pageY - article.offsetTop + "px");
23649                });
23650            });
23651        }
23652    }
23653
23654    // Create summary for all news
23655    const articlePage = document.querySelector(".section article.section-inner");
23656    if (articlePage) {
23657        const article = articlePage.querySelector(".page-grid__content");
23658        // Get all to Nodes
23659        const h2Nodes = article.querySelectorAll("h2");
23660        // Transform to Arr
23661        const h2Arr = Array.from(h2Nodes);
23662        // Add title into Arr
23663        const h1 = isLongFormat ? isLongFormat.querySelector(".page-grid__header h1") : article.querySelector("h1");
23664        h2Arr.unshift(h1);
23665
23666        if (h2Arr.length > 0) {
23667            const summary = articlePage.querySelector(".sidebar-summary");
23668            if (summary) {
23669                summary.style.display = "block";
23670
23671                h2Arr.forEach((value, id) => {
23672                    const li = document.createElement("li");
23673                    li.textContent = value.textContent;
23674                    summary.querySelector(".sidebar-summary__inner ul").appendChild(li);
23675
23676                    li.addEventListener("click", (e) => {
23677                        const alreadyCurrent = summary.querySelector("li.isActive");
23678                        if (alreadyCurrent) alreadyCurrent.classList.remove("isActive");
23679                        li.classList.add("isActive");
23680                        value.scrollIntoView({
23681                            behavior: "smooth",
23682                            block: "center"
23683                        });
23684                    });
23685                });
23686
23687                // Change isActive value on scroll for summary list
23688                const summaryLi = summary.querySelectorAll("li");
23689                window.addEventListener("scroll", () => {
23690                    h2Arr.forEach((value, id) => {
23691                        const isVisible = checkVisible(value);
23692                        if (isVisible) {
23693                            const alreadyCurrent = summary.querySelector("li.isActive");
23694                            if (alreadyCurrent) alreadyCurrent.classList.remove("isActive");
23695                            summaryLi[id].classList.add("isActive");
23696                        }
23697                        return;
23698                    });
23699                });
23700            }
23701        }
23702    }
23703});
23704
23705(function () {
23706    var activeYears = [];
23707
23708    window.classeurToggleYear = function (year, btn) {
23709        var idx = activeYears.indexOf(year);
23710        if (idx === -1) {
23711            activeYears.push(year);
23712            btn.classList.add('active');
23713        } else {
23714            activeYears.splice(idx, 1);
23715            btn.classList.remove('active');
23716        }
23717        classeurFilter();
23718    };
23719
23720    window.classeurFilter = function () {
23721        var search = (document.getElementById('filter-search').value || '').toLowerCase().trim();
23722        var cards  = document.querySelectorAll('#projects-grid .project-card');
23723        var visible = 0;
23724
23725        cards.forEach(function (card) {
23726            var matchYear   = activeYears.length === 0 || activeYears.indexOf(card.dataset.year) !== -1;
23727            var abstractEl  = card.querySelector('.project-card__abstract');
23728            var searchable  = (card.dataset.search || '') + (abstractEl ? ' ' + abstractEl.textContent : '');
23729            var matchSearch = !search || searchable.toLowerCase().indexOf(search) !== -1;
23730
23731            if (matchYear && matchSearch) {
23732                card.classList.remove('hidden');
23733                visible++;
23734            } else {
23735                card.classList.add('hidden');
23736            }
23737        });
23738
23739        var countEl = document.getElementById('visible-count');
23740        if (countEl) countEl.textContent = visible;
23741
23742        var emptyEl = document.getElementById('no-results');
23743        if (emptyEl) emptyEl.style.display = (visible === 0) ? 'block' : 'none';
23744    };
23745
23746    window.classeurReset = function () {
23747        document.getElementById('filter-search').value = '';
23748        activeYears = [];
23749        document.querySelectorAll('.year-chip').forEach(function (b) {
23750            b.classList.remove('active');
23751        });
23752        classeurFilter();
23753    };
23754
23755    // ── Popup résumé ─────────────────────────────────────────────────────────
23756
23757    window.classeurShowInfo = function (el) {
23758        var card      = el.closest('.project-card');
23759        var abstractEl = card.querySelector('.project-card__abstract');
23760        if (!abstractEl) return;
23761
23762        var acronym   = card.querySelector('.project-card__acronym').textContent.trim();
23763        var titleEl   = card.querySelector('.project-card__title');
23764        var title     = titleEl ? titleEl.textContent.trim() : '';
23765        var abstract  = abstractEl.innerHTML;
23766        var isF2030   = card.dataset.type === 'france-2030';
23767
23768        var modal    = document.getElementById('classeur-modal');
23769        var badge    = document.getElementById('modal-badge');
23770        var titleOut = document.getElementById('modal-title');
23771        var subtitle = document.getElementById('modal-subtitle');
23772        var abstractOut = document.getElementById('modal-abstract');
23773        var footer   = document.getElementById('modal-footer');
23774        var f2030Logo = document.getElementById('modal-f2030-logo');
23775
23776        badge.textContent    = isF2030 ? 'France 2030' : 'Projet ANR';
23777        badge.className      = 'classeur-modal__badge ' + (isF2030 ? 'badge--f2030' : 'badge--anr');
23778        titleOut.textContent = acronym;
23779        subtitle.textContent = (title !== acronym) ? title : '';
23780        abstractOut.innerHTML = abstract;
23781
23782        if (f2030Logo) {
23783            if (isF2030) { f2030Logo.removeAttribute('hidden'); }
23784            else { f2030Logo.setAttribute('hidden', ''); }
23785        }
23786
23787        var projectUrl = card.dataset.url;
23788        footer.innerHTML = '';
23789        if (projectUrl) {
23790            var a = document.createElement('a');
23791            a.href = projectUrl;
23792            a.target = '_blank';
23793            a.rel = 'noopener';
23794            a.className = 'classeur-modal__link icon-arrow-right';
23795            a.textContent = 'Consultez le résumé complet';
23796            footer.appendChild(a);
23797        }
23798
23799        modal.classList.add('is-open');
23800
23801        var body = modal.querySelector('.classeur-modal__body');
23802        if (body) body.scrollTop = 0;
23803        document.body.style.overflow = 'hidden';
23804
23805        document._classeurModalEsc = function (e) {
23806            if (e.key === 'Escape') classeurCloseModal();
23807        };
23808        document.addEventListener('keydown', document._classeurModalEsc);
23809    };
23810
23811    window.classeurCloseModal = function () {
23812        var modal = document.getElementById('classeur-modal');
23813        if (modal) modal.classList.remove('is-open');
23814        document.body.style.overflow = '';
23815        if (document._classeurModalEsc) {
23816            document.removeEventListener('keydown', document._classeurModalEsc);
23817        }
23818    };
23819
23820    // ── Fil d'ariane ─────────────────────────────────────────────────────────
23821
23822    var header = document.querySelector('.anr-classeur-show__header[data-breadcrumb-title]');
23823    if (header) {
23824        var breadcrumbActive = document.querySelector('.page-breadcrumbs li.active');
23825        if (breadcrumbActive) {
23826            breadcrumbActive.textContent = header.dataset.breadcrumbTitle;
23827        }
23828    }
23829})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.