(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["vendors~hermes_front"],{

/***/ "./node_modules/@fontsource/raleway/index.css":
/*!****************************************************!*\
  !*** ./node_modules/@fontsource/raleway/index.css ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

// extracted by mini-css-extract-plugin

/***/ }),

/***/ "./node_modules/accordion/src/accordion.js":
/*!*************************************************!*\
  !*** ./node_modules/accordion/src/accordion.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

(function(){
	"use strict";

	var touchEnabled = "ontouchstart" in document.documentElement;
	var pressEvent   = touchEnabled ? "touchend" : "click";
	var each         = [].forEach;


	// Name of the onTransitionEnd event supported by this browser
	var transitionEnd = (function(){
		for(var names = "transitionend webkitTransitionEnd oTransitionEnd otransitionend".split(" "), i = 0; i < 4; ++i)
			if("on"+names[i].toLowerCase() in window) return names[i];
		return names[0];
	}());
	
	
	
	/**
	 * Conditionally add or remove a token from a token-list.
	 *
	 * @param {DOMTokenList} list
	 * @param {String} token
	 * @param {Boolean} enabled
	 */
	function setToken(list, token, enabled){
		enabled ? list.add(token) : list.remove(token);
	}



	/**
	 * Stop a function from firing too quickly.
	 *
	 * Returns a copy of the original function that runs only after the designated
	 * number of milliseconds have elapsed. Useful for throttling onResize handlers.
	 *
	 * @param {Number} limit - Threshold to stall execution by, in milliseconds.
	 * @param {Boolean} soon - If TRUE, will call the function *before* the threshold's elapsed, rather than after.
	 * @return {Function}
	 */
	function debounce(fn, limit, soon){
		var limit = limit < 0 ? 0 : limit,
			started, context, args, timer,

			delayed = function(){

				// Get the time between now and when the function was first fired
				var timeSince = Date.now() - started;

				if(timeSince >= limit){
					if(!soon) fn.apply(context, args);
					if(timer) clearTimeout(timer);
					timer = context = args = null;
				}

				else timer = setTimeout(delayed, limit - timeSince);
			};


		// Debounced copy of the original function
		return function(){
			context = this,
			args    = arguments;

			if(!limit)
				return fn.apply(context, args);

			started = Date.now();
			if(!timer){
				if(soon) fn.apply(context, args);
				timer = setTimeout(delayed, limit);
			}
		};
	};



	var uniqueID = (function(){
		var IDs     = {};
		var indexes = {};
		
		
		/**
		 * Generate a unique ID for a DOM element.
		 *
		 * By default, minimalist IDs like "_1" or "_2" are generated using internally
		 * tracked incrementation. Uglier, more collision-proof IDs can be generated by
		 * passing a truthy value to the function's first argument.
		 *
		 * Irrespective of whether values are being generated simply or randomly, the
		 * document tree is always consulted first to ensure a duplicate ID is never
		 * returned.
		 *
		 * @param {String}  prefix - Prefix prepended to result. Default: "_"
		 * @param {Boolean} random - Generate collision-proof IDs using random symbols
		 * @param {Number}  length - Length of random passwords. Default: 6
		 * @return {String}
		 */
		function uniqueID(prefix, complex, length){
			length     = +(length || 6);
			var result =  (prefix = prefix || "_");
			
			// Simple IDs
			if(!complex){
				
				// Set this prefix's starting index if it's not been used yet
				if(!indexes[prefix])
					indexes[prefix] = 0;
				
				result += ++indexes[prefix];
			}
			
			// Uglier/safer IDs
			else{
				var chars   = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
				chars      += chars.toLowerCase();
				result     += chars[ Math.round(Math.random() * (chars.length - 1)) ];
				chars      += "0123456789";
				
				while(result.length < length)
					result += chars[ Math.round(Math.random() * (chars.length - 1))];
			}
			
			return IDs[result] || document.getElementById(result)
				? uniqueID(prefix, complex)
				: (IDs[result] = true, result);
		}
		
		
		return uniqueID;
	}());


	// Name of the CSSOM property used by this browser for CSS transforms
	var cssTransform = (function(n){
		s = document.documentElement.style;
		if((prop = n.toLowerCase()) in s) return prop;
		for(var prop, s, p = "Webkit Moz Ms O Khtml", p = (p.toLowerCase() + p).split(" "), i = 0; i < 10; ++i)
			if((prop = p[i]+n) in s) return prop;
		return "";
	}("Transform"));


	// Whether 3D transforms are supported by this browser
	var css3DSupported = (function(propName){
		var e = document.createElement("div"), s = e.style,
		v = [["translateY(", ")"], ["translate3d(0,", ",0)"]]
		try{ s[propName] = v[1].join("1px"); } catch(e){}
		return v[+!!s[propName]] === v[1];
	}(cssTransform));









	var folds = [];


	/**
	 * Represents a single panel of togglable content inside an Accordion.
	 *
	 * @param {Accordion} accordion
	 * @param {HTMLElement} el
	 * @constructor
	 */
	var Fold = function(accordion, el){
		var THIS            = this;
		var heading         = el.firstElementChild;
		var content         = el.lastElementChild;
		var elClasses       = el.classList;
		var openClass       = accordion.openClass;
		var closeClass      = accordion.closeClass;
		var keysEnabled     = !accordion.noKeys;
		var useBorders      = accordion.useBorders;
		var useTransforms   = !accordion.noTransforms && cssTransform;
		var onToggle        = accordion.onToggle;
		var _disabled       = false;
		var _open, _y, _height, _ariaEnabled;
		var scrollX, scrollY;
		var onTouchStart;
		var onKeyDown;
		var onPress;
		
		
		Object.defineProperties(THIS, {
			fit: {value: fit},
			
			
			// Add or remove relevant ARIA attributes from the fold's elements
			ariaEnabled: {
				get: function(){ return _ariaEnabled; },
				set: function(input){
					if((input = !!input) !== !!_ariaEnabled){
						_ariaEnabled = input;
						
						// Enable ARIA-attribute management
						if(input){
							heading.setAttribute("role", "tab");
							content.setAttribute("role", "tabpanel");
							checkIDs();
							
							// Update the attributes that're controlled by .open's setter
							heading.setAttribute("aria-selected", !!_open);
							heading.setAttribute("aria-expanded", !!_open);
							content.setAttribute("aria-hidden",   !_open);
						}
						
						// Disabling; remove all relevant attributes
						else{
							heading.removeAttribute("role");
							heading.removeAttribute("aria-controls");
							heading.removeAttribute("aria-selected");
							heading.removeAttribute("aria-expanded");
							
							content.removeAttribute("role");
							content.removeAttribute("aria-labelledby");
							content.removeAttribute("aria-hidden");
						}
					}
				}
			},

			
			
			// Whether or not the fold's currently opened
			open: {
				
				get: function(){
					
					// Derive the fold's opened state from the DOM if it's not been determined yet
					if(undefined === _open){
						_open = elClasses.contains(openClass);
						setToken(elClasses, closeClass, !_open);
					}
					
					return _open;
				},
				
				
				set: function(input){
					if((input = !!input) !== _open){
						
						// If an onToggle callback was specified, run it. Avoid doing anything if it returns false.
						if("function" === typeof onToggle && false === onToggle.call(null, THIS, input))
							return;
						
						setToken(elClasses, openClass,   input);
						setToken(elClasses, closeClass, !input);
						_open = input;
						
						// Update ARIA attributes
						if(_ariaEnabled){
							heading.setAttribute("aria-selected",  input);
							heading.setAttribute("aria-expanded",  input);
							content.setAttribute("aria-hidden",   !input);
						}
						
						// If this fold was closed when the screen resized, run a full update in case its contents were juggled around
						if(THIS.needsRefresh){
							delete THIS.needsRefresh;
							accordion.refresh();
						}
						else accordion.update();
						
						// Close other folds if accordion is modal
						if(accordion.modal && _open){
							for(var fold, i = 0, l = accordion.folds.length; i < l; ++i){
								if(THIS !== (fold = accordion.folds[i]))
									fold.open = false;
							}
						}
					}
				}
			},
			
			
			// Whether the fold's been deactivated
			disabled: {
				get: function(){ return _disabled },
				set: function(input){
					if((input = !!input) !== _disabled){
						var style = el.style;
						
						// Deactivated
						if(_disabled = input){
							style.height = null;
							useTransforms
								? (style[cssTransform] = null)
								: (style.top = null);
							
							touchEnabled && heading.removeEventListener("touchstart", onTouchStart);
							heading.removeEventListener(pressEvent, onPress);
							elClasses.remove(openClass, closeClass);
							if(onKeyDown){
								heading.removeEventListener("keydown", onKeyDown);
								heading.removeAttribute("tabindex");
							}
							
							if(_ariaEnabled){
								THIS.ariaEnabled = false;
								_ariaEnabled     = true;
							}
						}
						
						// Reactivated
						else{
							style.height = _height + "px";
							useTransforms
								? style[cssTransform] =
									css3DSupported
										? ("translate3D(0," + _y + "px,0)")
										: ("translateY("    + _y + "px)")
								: (style.top = _y + "px");
							
							touchEnabled && heading.addEventListener("touchstart", onTouchStart);
							heading.addEventListener(pressEvent, onPress);
							
							if(onKeyDown){
								heading.addEventListener("keydown", onKeyDown);
								heading.tabIndex = 0;
							}
						}
					}
				}
			},
			
			
			// Vertical position of the fold within an accordion's container
			y: {
				get: function(){
					if(undefined === _y)
						return (_y = parseInt(el.style.top) || 0);
					return _y;
				},
				
				set: function(input){
					if((input = +input) !== _y){
						_y = input;
						useTransforms
							? el.style[cssTransform] =
								css3DSupported
									? ("translate3D(0," + input + "px,0)")
									: ("translateY("    + input + "px)")
							: (el.style.top = input + "px");
					}
				}
			},
			
			
			// Height of the fold's outermost container
			height: {
				
				get: function(){
					if(undefined === _height){
						_height = THIS.headingHeight + content.scrollHeight;
						el.style.height = _height + "px";
					}
					return _height;
				},
				
				set: function(input){
					if(input && (input = +input) !== _height){
						el.style.height = input + "px"
						_height         = input;
					}
				}
			},
			

			// Current height of the fold's heading
			headingHeight: {
				get: function(){
					return heading.scrollHeight
						+ THIS.heightOffset
						+ (useBorders ? THIS.headingBorder : 0)
				}
			},
			
			// Total height consumed by the heading element's CSS borders, if any
			headingBorder: {
				get: function(){
					return (heading.offsetHeight || 0) - (heading.clientHeight || 0);
				}
			},
			
			
			
			// Total height of the fold's container element
			elHeight: {
				get: function(){
					return el.scrollHeight + (useBorders ? THIS.elBorder : 0);
				}
			},
			
			// Total height consumed by container element's CSS borders, if any
			elBorder: {
				get: function(){
					return (el.offsetHeight || 0) - (el.clientHeight || 0);
				}
			},
			
			
			// Whether the fold's container has been resized incorrectly
			wrongSize: {
				get: function(){
					return THIS.headingHeight + content.scrollHeight !== el.scrollHeight;
				}
			}
		});
		
		
		
		THIS.index        = folds.push(THIS) - 1;
		THIS.accordion    = accordion;
		THIS.el           = el;
		THIS.heading      = heading;
		THIS.content      = content;
		THIS.ariaEnabled  = !accordion.noAria;
		THIS.heightOffset = accordion.heightOffset;
		el.accordionFold  = THIS.index;
		useBorders        = "auto" === useBorders ? (0 !== THIS.elBorder + THIS.headingBorder) : useBorders;
		
		
		
		function checkIDs(){
			var headingSuffix = "-heading";
			var contentSuffix = "-content";
			var elID            = el.id;
			var id;
			
			// Neither of the fold's elements have an ID attribute
			if(!heading.id && !content.id){
				id             = elID || uniqueID("a");
				heading.id     = id + headingSuffix;
				content.id     = id + contentSuffix;
			}
			
			// Either the heading or element lack an ID
			else if(!content.id) content.id   = (elID || heading.id) + contentSuffix;
			else if(!heading.id) heading.id   = (elID || content.id) + headingSuffix;
			
			// Finally, double-check each element's ID is really unique
			var $ = function(s){return document.querySelectorAll("#"+s)};
			while($(content.id).length > 1 || $(heading.id).length > 1){
				id         = uniqueID("a");
				content.id = id + contentSuffix;
				heading.id = id + headingSuffix;
			}
			
			// Update ARIA attributes
			heading.setAttribute("aria-controls",    content.id);
			content.setAttribute("aria-labelledby",  heading.id);
		}
		
		
		
		// Keyboard navigation
		if(keysEnabled){
			heading.tabIndex = 0;
			heading.addEventListener("keydown", onKeyDown = function(e){
				var key = e.keyCode;
				var fold;
				
				switch(key){

					// Spacebar: Toggle
					case 32:
						e.preventDefault(); // Fall-through
					
					
					// Enter: Toggle
					case 13:
						THIS.open = !THIS.open;
						if("A" === e.target.tagName)
							e.preventDefault();
						break;
					
					
					// Escape: Clear focus
					case 27:
						e.target.blur();
						break;
					
					
					// Up arrow: Previous section
					case 38:{
						
						// Is there a previous sibling to navigate up to?
						if(fold = THIS.previousFold){
							var children = fold.childAccordions;
							
							// Is it open, and does it have nested accordions?
							if(fold.open && children){
								var lastAcc;
								var lastFold;
								
								// Locate the deepest/nearest accordion that's currently exposed
								while(children){
									lastAcc  = children[children.length - 1];
									lastFold = lastAcc.folds[lastAcc.folds.length - 1];
									if(!lastFold.open) break;
									children = lastFold.childAccordions;
								}
								
								lastFold.heading.focus();
							}
							
							// Nope
							else fold.heading.focus();
						}
						
						// Is there a higher level we can jump back up to?
						else if(accordion.parent)
							accordion.parentFold.heading.focus();
						
						// There's nothing to move back to, so just let the browser run its usual behaviour
						else return true;
						
						e.preventDefault();
						return false;
					}
					
					
					
					// Down arrow: Next section
					case 40:{
						var children = THIS.childAccordions;
						
						// Is there a nested accordion to jump into?
						if(THIS.open && children)
							children[0].folds[0].heading.focus();
						
						// No, there isn't. Is there another sibling to move down to?
						else if(fold = THIS.nextFold)
							fold.heading.focus();
						
						// Is there a containing accordion we can navigate back up to?
						else if(THIS.accordion.parent){
							var parent = THIS;
							while(parent = parent.accordion.parentFold)
								if(fold = parent.nextFold){
									fold.heading.focus();
									break;
								}
							
							// Nowhere left to go...
							if(!parent) return true;
						}
						
						// Nah. Just scroll the window normally, as per browser default
						else return true;
						
						e.preventDefault();
						return false;
					}
					
					
					// Left arrow
					case 37:{
						
						// Close an opened section
						if(THIS.open) THIS.open = false;
						
						// Switch focus back to parent
						else if(accordion.parent)
							accordion.parentFold.heading.focus();
						
						break;
					}
					
					// Right arrow
					case 39:{
						var children = THIS.childAccordions;
						
						// Open a closed section
						if(!THIS.open) THIS.open = true;
						
						// Switch focus to a nested accordion
						else if(children)
							children[0].folds[0].heading.focus();
						
						break;
					}
				}
			});
		}
		
		
		// Listener to record the viewport's scroll offsets at the beginning of a touch
		touchEnabled && heading.addEventListener("touchstart", onTouchStart = function(e){
			scrollX = window.pageXOffset;
			scrollY = window.pageYOffset;
		}, {passive: true});
		
		
		heading.addEventListener(pressEvent, onPress = function(e){
			
			// Pressed on something inside the header
			if(e.target !== heading && heading.contains(e.target)){
				
				// Cancel fold-toggle if user clicked on an anchor-link
				if("A" === e.target.tagName && e.target.href)
					return true;
			}
			
			if(e.type !== "touchend" || (e.cancelable && window.pageXOffset === scrollX && window.pageYOffset === scrollY)){
				THIS.open = !THIS.open;
				e.preventDefault();
			}
			return false;
		});
		
		
		
		
		/**
		 * Adjust a fold's container to fit its content.
		 */
		function fit(){
			var height = THIS.headingHeight;
			if(THIS.open)   height += content.scrollHeight;
			if(useBorders)  height += THIS.elBorder;
			THIS.height = height;
		}
	}







	var accordions       = [];
	var activeAccordions = 0;
	var lastResizeRate;


	/**
	 * Represents a column of collapsible content regions.
	 *
	 * @param {HTMLElement} el                    - Container wrapped around each immediate fold
	 * @param {Object}      options               - Optional hash of settings
	 * @param {String}      options.openClass     - CSS class controlling each fold's "open" state
	 * @param {String}      options.closeClass    - CSS class used to mark a fold as closed
	 * @param {String}      options.edgeClass     - CSS class toggled based on whether the bottom-edge is visible
	 * @param {String}      options.snapClass     - CSS class for disabling transitions between window resizes
	 * @param {String}      options.enabledClass  - CSS class marking an accordion as enabled
	 * @param {String}      options.disabledClass - CSS class marking an accordion as disabled
	 * @param {Boolean}     options.disabled      - Whether to disable the accordion on creation
	 * @param {Boolean}     options.modal         - Whether to close the current fold when opening another
	 * @param {Boolean}     options.noAria        - Disable the addition and management of ARIA attributes
	 * @param {Boolean}     options.noKeys        - Disable keyboard navigation
	 * @param {Boolean}     options.noTransforms  - Disable CSS transforms; positioning will be used instead
	 * @param {Number}      options.heightOffset  - Distance to offset each fold by
	 * @param {Boolean}     options.useBorders    - Consider borders when calculating fold heights
	 * @param {Function}    options.onToggle      - Callback executed when opening or closing a fold
	 * @constructor
	 */
	var Accordion = function(el, options){
		var THIS          = this;
		var elClasses     = el.classList;
		var options       = options || {};
		var edgeClass     = (undefined === options.edgeClass    ? "edge-visible" : options.edgeClass);
		var snapClass     = (undefined === options.snapClass    ? "snap"         : options.snapClass);
		var enabledClass  = (undefined === options.enabledClass ? "accordion"    : options.enabledClass);
		var disabledClass = options.disabledClass;
		var _height, _disabled, _parent, _parentFold, _modal;


		Object.defineProperties(THIS, {
			update:     {value: update},
			updateFold: {value: updateFold},
			refresh:    {value: refresh},
			
			// Whether the accordion's been deactivated
			disabled: {
				get: function(){ return _disabled; },
				set: function(input){
					if((input = !!input) !== _disabled){
						var style   = el.style;
						var folds   = THIS.folds;
						
						enabledClass  && setToken(elClasses, enabledClass,  !input);
						disabledClass && setToken(elClasses, disabledClass,  input);
						
						
						// Deactivating
						if(_disabled = input){
							style.height = null;
							snapClass && elClasses.remove(snapClass);
							if(edgeClass){
								el.removeEventListener(transitionEnd, THIS.onTransitionEnd);
								elClasses.remove(edgeClass);
							}
							
							for(var i = 0, l = folds.length; i < l; ++i)
								folds[i].disabled = true;
							
							THIS.noAria || el.removeAttribute("role");
							--activeAccordions;
						}
						
						
						// Reactivating
						else{
							for(var i = 0, l = folds.length; i < l; ++i)
								folds[i].disabled = false;
							
							THIS.noAria || el.setAttribute("role", "tablist");
							++activeAccordions;
							update();
						}
						

						
						// If there're no more active accordions, disable the onResize handler
						if(activeAccordions <= 0){
							activeAccordions = 0;
							Accordion.setResizeRate(false);
						}
						
						// Otherwise, reactivate the onResize handler, assuming it was previously active
						else if(lastResizeRate)
							Accordion.setResizeRate(lastResizeRate);
					}
				}
			},
			
			// Get or set the accordion enclosing this one
			parent: {
				set: function(input){ _parent = input; },
				get: function(){
					var result = _parent;
					if(!result) return null;
					
					// Search for the first ancestor that *isn't* disabled
					while(result){
						if(!result.disabled) return result;
						result = result.parent;
					}
					return null;
				}
			},
			
			// Get or set the fold of the accordion enclosing this one
			parentFold: {
				set: function(input){ _parentFold = input; },
				get: function(){
					var fold = _parentFold;
					if(!fold) return null;
					
					var accordion = fold.accordion;
					
					// Search for the first ancestor that *isn't* disabled
					while(fold && accordion){
						if(!accordion.disabled) return fold;
						if(accordion = accordion.parent)
							fold = accordion.parentFold;
					}
					return null;
				}
			},
			
			// Height of the accordion's container element
			height: {
				get: function(){ return _height; },
				set: function(input){
					if(input && (input = +input) !== _height){
						el.style.height = input + "px";
						_height         = input;
					}
				}
			},
			
			// Whether one of the Accordion's folds has been resized incorrectly
			wrongSize: {
				get: function(){
					var a = this.folds;
					var l = a.length;
					var i = 0;
					for(; i < l; ++i) if(a[i].wrongSize) return true;
					if(a = this.childAccordions)
					for(; i < l; ++i) if(a[i].wrongSize) return true;
					return false;
				}
			},
			
			// Top-level ancestor this accordion's nested inside
			root: {
				get: function(){
					var result = this;
					while(result){
						if(!result.parent) return result;
						result = result.parent;
					}
				}
			}
		});

		
		// Assign options as properties
		THIS.openClass    = options.openClass  || "open";
		THIS.closeClass   = options.closeClass || "closed";
		THIS.modal        = !!options.modal;
		THIS.noAria       = !!options.noAria;
		THIS.noKeys       = !!options.noKeys;
		THIS.noTransforms = !!options.noTransforms;
		THIS.index        = accordions.push(THIS) - 1;
		THIS.heightOffset = +options.heightOffset || 0;
		THIS.useBorders   = undefined === options.useBorders ? "auto" : options.useBorders;
		THIS.onToggle     = options.onToggle;
		
		
		// Create a fold for each immediate descendant of the Accordion's container
		var folds = [];
		each.call(el.children, function(i){
			var fold = new Fold(THIS, i);
			folds.push(fold);
			
			// Connect the fold to its previous sibling, if it's not the first to be added
			var prev = folds[folds.length - 2];
			if(prev){
				prev.nextFold     = fold;
				fold.previousFold = prev;
			}
		});
		
		
		el.accordion    = THIS.index;
		THIS.noAria || el.setAttribute("role", "tablist");
		THIS.el         = el;
		THIS.folds      = folds;
		
		// Add .enabledClass early - it might affect the heights of each fold
		if(!options.disabled && enabledClass)
			elClasses.add(enabledClass);
		
		update();
		
		
		// Find out if this accordion's nested inside another
		var next = el;
		while((next = next.parentNode) && 1 === next.nodeType){
			var fold = Accordion.getFold(next);
			if(fold){
				var accordion   = fold.accordion;
				THIS.parent     = accordion;
				THIS.parentFold = fold;
				edgeClass && elClasses.remove(edgeClass);
				(accordion.childAccordions = accordion.childAccordions || []).push(THIS);
				(fold.childAccordions      = fold.childAccordions      || []).push(THIS);

				// Adjust the height of the containing fold's element
				if(fold.open){
					var scrollHeight = fold.el.scrollHeight;
					var distance     = (fold.headingHeight + fold.content.scrollHeight) - scrollHeight || (scrollHeight - fold.el.clientHeight);
					accordion.updateFold(fold, distance);
				}
				break;
			}
		}
		
		
		edgeClass && el.addEventListener(transitionEnd, this.onTransitionEnd = function(e){
			if(!THIS.parent && e.target === el && "height" === e.propertyName && el.getBoundingClientRect().bottom > window.innerHeight)
				elClasses.remove(edgeClass);
		});
		
		this.disabled = !!options.disabled;
		
		
		
		/**
		 * Internal method to check if an accordion's bottom-edge is visible to the user (or about to be).
		 *
		 * @param {Number} offset
		 * @private
		 */
		function edgeCheck(offset){
			if(edgeClass){
				var box         = el.getBoundingClientRect();
				var windowEdge  = window.innerHeight;
				
				// If the bottom-edge is visible (or about to be), enable height animation
				if(box.bottom + (offset || 0) < windowEdge)
					elClasses.add(edgeClass)
				
				// If the bottom-edge isn't visible anyway, disable height animation immediately
				else if(box.bottom > windowEdge)
					elClasses.remove(edgeClass);
			}
		}
		
		
		
		/**
		 * Update the vertical ordinate of each sibling for a particular fold.
		 *
		 * @param {Fold} fold
		 * @param {Number} offset - Pixel distance to adjust by
		 */
		function updateFold(fold, offset){
			var next = fold;
			var parentFold = THIS.parentFold;
			
			while(next = next.nextFold)
				next.y  += offset;
			parentFold || edgeCheck(offset);
			fold.height += offset;
			THIS.height += offset;
			
			parentFold && parentFold.open && THIS.parent.updateFold(parentFold, offset);
		}
		
		
		/**
		 * Update the height of each fold to fit its content.
		 */
		function update(){
			var y      = 0;
			var height = 0;
			var i      = 0;
			var l      = folds.length;
			var parentFold = THIS.parentFold;
			var fold, diff;
			
			for(; i < l; ++i){
				fold   = folds[i];
				fold.y = y;
				fold.fit();
				y      += fold.height;
				height += fold.height;
			}
			
			diff = height - _height;
			parentFold
				? (parentFold.open && THIS.parent.updateFold(parentFold, diff))
				: edgeCheck(diff);
			
			THIS.height = height;
		}
		
		
		
		/**
		 * Recalculate the boundaries of an Accordion and its descendants.
		 *
		 * This method should only be called if the width of a container changes,
		 * or a fold's contents have resized unexpectedly (such as when images load).
		 *
		 * @param {Boolean} allowSnap - Snap folds instantly into place without transitioning
		 */
		function refresh(allowSnap){
			var snap = allowSnap ? snapClass : false;
			snap && elClasses.add(snap);
			
			THIS.update();
			THIS.childAccordions && THIS.childAccordions.forEach(function(a){
				a.parentFold.open
					? a.refresh(allowSnap)
					: (a.parentFold.needsRefresh = true);
			});
			
			snap && setTimeout(function(e){elClasses.remove(snap)}, 20);
		}
	}

	// If IE8PP exists, it means the author wants/needs IE8 support. See also: tinyurl.com/fixIE8-9
	if("function" === typeof IE8PP)
		Accordion = IE8PP(Accordion),
		Fold      = IE8PP(Fold);



	/**
	 * Alter the rate at which screen-resize events update accordion widths.
	 *
	 * @param {Number} delay - Rate expressed in milliseconds
	 */
	Accordion.setResizeRate = function(delay){
		var fn = function(e){
			for(var a, i = 0, l = accordions.length; i < l; ++i){
				a = accordions[i];
				a.parent || a.disabled || a.refresh(true);
			}
		};
		
		var THIS = Accordion;
		THIS.onResize && window.removeEventListener("resize", THIS.onResize);
		
		// Make sure we weren't passed an explicit value of FALSE, or a negative value
		if(false !== delay && (delay = +delay || 0) >= 0){
			THIS.onResize = delay ? debounce(fn, delay) : fn;
			window.addEventListener("resize", THIS.onResize);
			if(delay) lastResizeRate = delay;
		}
	}
	
	
	
	/**
	 * Return the closest (most deeply-nested) accordion enclosing an element.
	 *
	 * @param {Node} node
	 * @return {Accordion}
	 */
	Accordion.getAccordion = function(node){
		while(node){
			if("accordion" in node)
				return accordions[node.accordion];
			
			node = node.parentNode;
			if(!node || node.nodeType !== 1) return null;
		}
	}
	
	
	/**
	 * Return the closest (most deeply-nested) fold enclosing an element.
	 *
	 * @param {Node} node
	 * @return {Fold}
	 */
	Accordion.getFold = function(node){
		while(node){
			if("accordionFold" in node)
				return folds[node.accordionFold];
			
			node = node.parentNode;
			if(!node || node.nodeType !== 1) return null;
		}
	}
	

	
	Accordion.setResizeRate(25);
	
	
	// Browser export
	window.Accordion = Accordion;
	
	// CommonJS/Node.js
	if( true && "object" === typeof module.exports)
		module.exports.Accordion = Accordion;
	
	// AMD/UMD-like systems
	return Accordion;
}());


/***/ }),

/***/ "./node_modules/bootstrap/dist/css/bootstrap.min.css":
/*!***********************************************************!*\
  !*** ./node_modules/bootstrap/dist/css/bootstrap.min.css ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

// extracted by mini-css-extract-plugin

/***/ }),

/***/ "./node_modules/bootstrap/dist/js/bootstrap.bundle.min.js":
/*!****************************************************************!*\
  !*** ./node_modules/bootstrap/dist/js/bootstrap.bundle.min.js ***!
  \****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(__webpack_provided_window_dot_jQuery) {/*!
  * Bootstrap v5.2.3 (https://getbootstrap.com/)
  * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  */
!function(t,e){ true?module.exports=e():undefined}(this,(function(){"use strict";const t="transitionend",e=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e},i=t=>{const i=e(t);return i&&document.querySelector(i)?i:null},n=t=>{const i=e(t);return i?document.querySelector(i):null},s=e=>{e.dispatchEvent(new Event(t))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>__webpack_provided_window_dot_jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?__webpack_provided_window_dot_jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,g=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},m=t=>{"function"==typeof t&&t()},_=(e,i,n=!0)=>{if(!n)return void m(e);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(i)+5;let r=!1;const a=({target:n})=>{n===i&&(r=!0,i.removeEventListener(t,a),m(e))};i.addEventListener(t,a),setTimeout((()=>{r||s(i)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=N(t);return C.has(o)||(o=t),[n,s,o]}function D(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return j(s,{delegateTarget:r}),n.oneOff&&P.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return j(n,{delegateTarget:t}),i.oneOff&&P.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function S(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function I(t,e,i,n){const s=e[i]||{};for(const o of Object.keys(s))if(o.includes(n)){const n=s[o];S(t,e,i,n.callable,n.delegationSelector)}}function N(t){return t=t.replace(y,""),T[t]||t}const P={on(t,e,i,n){D(t,e,i,n,!1)},one(t,e,i,n){D(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))I(t,l,i,e.slice(1));for(const i of Object.keys(c)){const n=i.replace(w,"");if(!a||e.includes(n)){const e=c[i];S(t,l,r,e.callable,e.delegationSelector)}}}else{if(!Object.keys(c).length)return;S(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==N(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());let l=new Event(e,{bubbles:o,cancelable:!0});return l=j(l,i),a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function j(t,e){for(const[i,n]of Object.entries(e||{}))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}const M=new Map,H={set(t,e,i){M.has(t)||M.set(t,new Map);const n=M.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>M.has(t)&&M.get(t).get(e)||null,remove(t,e){if(!M.has(t))return;const i=M.get(t);i.delete(e),0===i.size&&M.delete(t)}};function $(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function W(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const B={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${W(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${W(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=$(t.dataset[n])}return e},getDataAttribute:(t,e)=>$(t.getAttribute(`data-bs-${W(e)}`))};class F{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?B.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?B.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const n of Object.keys(e)){const s=e[n],r=t[n],a=o(r)?"element":null==(i=r)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(a))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${s}".`)}var i}}class z extends F{constructor(t,e){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(e),H.set(this._element,this.constructor.DATA_KEY,this))}dispose(){H.remove(this._element,this.constructor.DATA_KEY),P.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return H.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.2.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const q=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,s=t.NAME;P.on(document,i,`[data-bs-dismiss="${s}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const o=n(this)||this.closest(`.${s}`);t.getOrCreateInstance(o)[e]()}))};class R extends z{static get NAME(){return"alert"}close(){if(P.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),P.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=R.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}q(R,"close"),g(R);const V='[data-bs-toggle="button"]';class K extends z{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=K.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}P.on(document,"click.bs.button.data-api",V,(t=>{t.preventDefault();const e=t.target.closest(V);K.getOrCreateInstance(e).toggle()})),g(K);const Q={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))}},X={endCallback:null,leftCallback:null,rightCallback:null},Y={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class U extends F{constructor(t,e){super(),this._element=t,t&&U.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return X}static get DefaultType(){return Y}static get NAME(){return"swipe"}dispose(){P.off(this._element,".bs.swipe")}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),m(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&m(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(P.on(this._element,"pointerdown.bs.swipe",(t=>this._start(t))),P.on(this._element,"pointerup.bs.swipe",(t=>this._end(t))),this._element.classList.add("pointer-event")):(P.on(this._element,"touchstart.bs.swipe",(t=>this._start(t))),P.on(this._element,"touchmove.bs.swipe",(t=>this._move(t))),P.on(this._element,"touchend.bs.swipe",(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const G="next",J="prev",Z="left",tt="right",et="slid.bs.carousel",it="carousel",nt="active",st={ArrowLeft:tt,ArrowRight:Z},ot={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},rt={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class at extends z{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=Q.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===it&&this.cycle()}static get Default(){return ot}static get DefaultType(){return rt}static get NAME(){return"carousel"}next(){this._slide(G)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(J)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?P.one(this._element,et,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void P.one(this._element,et,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?G:J;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&P.on(this._element,"keydown.bs.carousel",(t=>this._keydown(t))),"hover"===this._config.pause&&(P.on(this._element,"mouseenter.bs.carousel",(()=>this.pause())),P.on(this._element,"mouseleave.bs.carousel",(()=>this._maybeEnableCycle()))),this._config.touch&&U.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of Q.find(".carousel-item img",this._element))P.on(t,"dragstart.bs.carousel",(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(Z)),rightCallback:()=>this._slide(this._directionToOrder(tt)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new U(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=st[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=Q.findOne(".active",this._indicatorsElement);e.classList.remove(nt),e.removeAttribute("aria-current");const i=Q.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(nt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===G,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>P.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r("slide.bs.carousel").defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(nt),i.classList.remove(nt,c,l),this._isSliding=!1,r(et)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return Q.findOne(".active.carousel-item",this._element)}_getItems(){return Q.find(".carousel-item",this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===Z?J:G:t===Z?G:J}_orderToDirection(t){return p()?t===J?Z:tt:t===J?tt:Z}static jQueryInterface(t){return this.each((function(){const e=at.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}P.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",(function(t){const e=n(this);if(!e||!e.classList.contains(it))return;t.preventDefault();const i=at.getOrCreateInstance(e),s=this.getAttribute("data-bs-slide-to");return s?(i.to(s),void i._maybeEnableCycle()):"next"===B.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),P.on(window,"load.bs.carousel.data-api",(()=>{const t=Q.find('[data-bs-ride="carousel"]');for(const e of t)at.getOrCreateInstance(e)})),g(at);const lt="show",ct="collapse",ht="collapsing",dt='[data-bs-toggle="collapse"]',ut={parent:null,toggle:!0},ft={parent:"(null|element)",toggle:"boolean"};class pt extends z{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const n=Q.find(dt);for(const t of n){const e=i(t),n=Q.find(e).filter((t=>t===this._element));null!==e&&n.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return ut}static get DefaultType(){return ft}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>pt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(P.trigger(this._element,"show.bs.collapse").defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(ct),this._element.classList.add(ht),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct,lt),this._element.style[e]="",P.trigger(this._element,"shown.bs.collapse")}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(P.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(ht),this._element.classList.remove(ct,lt);for(const t of this._triggerArray){const e=n(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ht),this._element.classList.add(ct),P.trigger(this._element,"hidden.bs.collapse")}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(lt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(dt);for(const e of t){const t=n(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=Q.find(":scope .collapse .collapse",this._config.parent);return Q.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=pt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}P.on(document,"click.bs.collapse.data-api",dt,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=i(this),n=Q.find(e);for(const t of n)pt.getOrCreateInstance(t,{toggle:!1}).toggle()})),g(pt);var gt="top",mt="bottom",_t="right",bt="left",vt="auto",yt=[gt,mt,_t,bt],wt="start",At="end",Et="clippingParents",Tt="viewport",Ct="popper",Ot="reference",xt=yt.reduce((function(t,e){return t.concat([e+"-"+wt,e+"-"+At])}),[]),kt=[].concat(yt,[vt]).reduce((function(t,e){return t.concat([e,e+"-"+wt,e+"-"+At])}),[]),Lt="beforeRead",Dt="read",St="afterRead",It="beforeMain",Nt="main",Pt="afterMain",jt="beforeWrite",Mt="write",Ht="afterWrite",$t=[Lt,Dt,St,It,Nt,Pt,jt,Mt,Ht];function Wt(t){return t?(t.nodeName||"").toLowerCase():null}function Bt(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function Ft(t){return t instanceof Bt(t).Element||t instanceof Element}function zt(t){return t instanceof Bt(t).HTMLElement||t instanceof HTMLElement}function qt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof Bt(t).ShadowRoot||t instanceof ShadowRoot)}const Rt={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];zt(s)&&Wt(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});zt(n)&&Wt(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function Vt(t){return t.split("-")[0]}var Kt=Math.max,Qt=Math.min,Xt=Math.round;function Yt(){var t=navigator.userAgentData;return null!=t&&t.brands?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ut(){return!/^((?!chrome|android).)*safari/i.test(Yt())}function Gt(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&zt(t)&&(s=t.offsetWidth>0&&Xt(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&Xt(n.height)/t.offsetHeight||1);var r=(Ft(t)?Bt(t):window).visualViewport,a=!Ut()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Jt(t){var e=Gt(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Zt(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&qt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function te(t){return Bt(t).getComputedStyle(t)}function ee(t){return["table","td","th"].indexOf(Wt(t))>=0}function ie(t){return((Ft(t)?t.ownerDocument:t.document)||window.document).documentElement}function ne(t){return"html"===Wt(t)?t:t.assignedSlot||t.parentNode||(qt(t)?t.host:null)||ie(t)}function se(t){return zt(t)&&"fixed"!==te(t).position?t.offsetParent:null}function oe(t){for(var e=Bt(t),i=se(t);i&&ee(i)&&"static"===te(i).position;)i=se(i);return i&&("html"===Wt(i)||"body"===Wt(i)&&"static"===te(i).position)?e:i||function(t){var e=/firefox/i.test(Yt());if(/Trident/i.test(Yt())&&zt(t)&&"fixed"===te(t).position)return null;var i=ne(t);for(qt(i)&&(i=i.host);zt(i)&&["html","body"].indexOf(Wt(i))<0;){var n=te(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function re(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function ae(t,e,i){return Kt(t,Qt(e,i))}function le(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function ce(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const he={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=Vt(i.placement),l=re(a),c=[bt,_t].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return le("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:ce(t,yt))}(s.padding,i),d=Jt(o),u="y"===l?gt:bt,f="y"===l?mt:_t,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],g=r[l]-i.rects.reference[l],m=oe(o),_=m?"y"===l?m.clientHeight||0:m.clientWidth||0:0,b=p/2-g/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=ae(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Zt(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function de(t){return t.split("-")[1]}var ue={top:"auto",right:"auto",bottom:"auto",left:"auto"};function fe(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,g=void 0===p?0:p,m="function"==typeof h?h({x:f,y:g}):{x:f,y:g};f=m.x,g=m.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=bt,y=gt,w=window;if(c){var A=oe(i),E="clientHeight",T="clientWidth";A===Bt(i)&&"static"!==te(A=ie(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===gt||(s===bt||s===_t)&&o===At)&&(y=mt,g-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,g*=l?1:-1),s!==bt&&(s!==gt&&s!==mt||o!==At)||(v=_t,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&ue),x=!0===h?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:Xt(e*n)/n||0,y:Xt(i*n)/n||0}}({x:f,y:g}):{x:f,y:g};return f=x.x,g=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+g+"px)":"translate3d("+f+"px, "+g+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?g+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const pe={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:Vt(e.placement),variation:de(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,fe(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,fe(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ge={passive:!0};const me={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=Bt(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ge)})),a&&l.addEventListener("resize",i.update,ge),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ge)})),a&&l.removeEventListener("resize",i.update,ge)}},data:{}};var _e={left:"right",right:"left",bottom:"top",top:"bottom"};function be(t){return t.replace(/left|right|bottom|top/g,(function(t){return _e[t]}))}var ve={start:"end",end:"start"};function ye(t){return t.replace(/start|end/g,(function(t){return ve[t]}))}function we(t){var e=Bt(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ae(t){return Gt(ie(t)).left+we(t).scrollLeft}function Ee(t){var e=te(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Te(t){return["html","body","#document"].indexOf(Wt(t))>=0?t.ownerDocument.body:zt(t)&&Ee(t)?t:Te(ne(t))}function Ce(t,e){var i;void 0===e&&(e=[]);var n=Te(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=Bt(n),r=s?[o].concat(o.visualViewport||[],Ee(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Ce(ne(r)))}function Oe(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function xe(t,e,i){return e===Tt?Oe(function(t,e){var i=Bt(t),n=ie(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ut();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ae(t),y:l}}(t,i)):Ft(e)?function(t,e){var i=Gt(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Oe(function(t){var e,i=ie(t),n=we(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=Kt(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=Kt(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ae(t),l=-n.scrollTop;return"rtl"===te(s||i).direction&&(a+=Kt(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(ie(t)))}function ke(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?Vt(s):null,r=s?de(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case gt:e={x:a,y:i.y-n.height};break;case mt:e={x:a,y:i.y+i.height};break;case _t:e={x:i.x+i.width,y:l};break;case bt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?re(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case wt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case At:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function Le(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Et:a,c=i.rootBoundary,h=void 0===c?Tt:c,d=i.elementContext,u=void 0===d?Ct:d,f=i.altBoundary,p=void 0!==f&&f,g=i.padding,m=void 0===g?0:g,_=le("number"!=typeof m?m:ce(m,yt)),b=u===Ct?Ot:Ct,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Ce(ne(t)),i=["absolute","fixed"].indexOf(te(t).position)>=0&&zt(t)?oe(t):t;return Ft(i)?e.filter((function(t){return Ft(t)&&Zt(t,i)&&"body"!==Wt(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=xe(t,i,n);return e.top=Kt(s.top,e.top),e.right=Qt(s.right,e.right),e.bottom=Qt(s.bottom,e.bottom),e.left=Kt(s.left,e.left),e}),xe(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(Ft(y)?y:y.contextElement||ie(t.elements.popper),l,h,r),A=Gt(t.elements.reference),E=ke({reference:A,element:v,strategy:"absolute",placement:s}),T=Oe(Object.assign({},v,E)),C=u===Ct?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Ct&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[_t,mt].indexOf(t)>=0?1:-1,i=[gt,mt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function De(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?kt:l,h=de(n),d=h?a?xt:xt.filter((function(t){return de(t)===h})):yt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=Le(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[Vt(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const Se={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,g=i.allowedAutoPlacements,m=e.options.placement,_=Vt(m),b=l||(_!==m&&p?function(t){if(Vt(t)===vt)return[];var e=be(t);return[ye(t),e,ye(e)]}(m):[be(m)]),v=[m].concat(b).reduce((function(t,i){return t.concat(Vt(i)===vt?De(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:g}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C<v.length;C++){var O=v[C],x=Vt(O),k=de(O)===wt,L=[gt,mt].indexOf(x)>=0,D=L?"width":"height",S=Le(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),I=L?k?_t:bt:k?mt:gt;y[D]>w[D]&&(I=be(I));var N=be(I),P=[];if(o&&P.push(S[x]<=0),a&&P.push(S[I]<=0,S[N]<=0),P.every((function(t){return t}))){T=O,E=!1;break}A.set(O,P)}if(E)for(var j=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==j(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function Ie(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Ne(t){return[gt,_t,mt,bt].some((function(e){return t[e]>=0}))}const Pe={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=Le(e,{elementContext:"reference"}),a=Le(e,{altBoundary:!0}),l=Ie(r,n),c=Ie(a,s,o),h=Ne(l),d=Ne(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},je={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=kt.reduce((function(t,i){return t[i]=function(t,e,i){var n=Vt(t),s=[bt,gt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[bt,_t].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},Me={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ke({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},He={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,g=void 0===p?0:p,m=Le(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=Vt(e.placement),b=de(e.placement),v=!b,y=re(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof g?g(Object.assign({},e.rects,{placement:e.placement})):g,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,D="y"===y?gt:bt,S="y"===y?mt:_t,I="y"===y?"height":"width",N=A[y],P=N+m[D],j=N-m[S],M=f?-T[I]/2:0,H=b===wt?E[I]:T[I],$=b===wt?-T[I]:-E[I],W=e.elements.arrow,B=f&&W?Jt(W):{width:0,height:0},F=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=F[D],q=F[S],R=ae(0,E[I],B[I]),V=v?E[I]/2-M-R-z-O.mainAxis:H-R-z-O.mainAxis,K=v?-E[I]/2+M+R+q+O.mainAxis:$+R+q+O.mainAxis,Q=e.elements.arrow&&oe(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=N+K-Y,G=ae(f?Qt(P,N+V-Y-X):P,N,f?Kt(j,U):j);A[y]=G,k[y]=G-N}if(a){var J,Z="x"===y?gt:bt,tt="x"===y?mt:_t,et=A[w],it="y"===w?"height":"width",nt=et+m[Z],st=et-m[tt],ot=-1!==[gt,bt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=ae(t,e,i);return n>i?i:n}(at,et,lt):ae(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function $e(t,e,i){void 0===i&&(i=!1);var n,s,o=zt(e),r=zt(e)&&function(t){var e=t.getBoundingClientRect(),i=Xt(e.width)/t.offsetWidth||1,n=Xt(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=ie(e),l=Gt(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==Wt(e)||Ee(a))&&(c=(n=e)!==Bt(n)&&zt(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:we(n)),zt(e)?((h=Gt(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ae(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function We(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var Be={placement:"bottom",modifiers:[],strategy:"absolute"};function Fe(){for(var t=arguments.length,e=new Array(t),i=0;i<t;i++)e[i]=arguments[i];return!e.some((function(t){return!(t&&"function"==typeof t.getBoundingClientRect)}))}function ze(t){void 0===t&&(t={});var e=t,i=e.defaultModifiers,n=void 0===i?[]:i,s=e.defaultOptions,o=void 0===s?Be:s;return function(t,e,i){void 0===i&&(i=o);var s,r,a={placement:"bottom",orderedModifiers:[],options:Object.assign({},Be,o),modifiersData:{},elements:{reference:t,popper:e},attributes:{},styles:{}},l=[],c=!1,h={state:a,setOptions:function(i){var s="function"==typeof i?i(a.options):i;d(),a.options=Object.assign({},o,a.options,s),a.scrollParents={reference:Ft(t)?Ce(t):t.contextElement?Ce(t.contextElement):[],popper:Ce(e)};var r,c,u=function(t){var e=We(t);return $t.reduce((function(t,i){return t.concat(e.filter((function(t){return t.phase===i})))}),[])}((r=[].concat(n,a.options.modifiers),c=r.reduce((function(t,e){var i=t[e.name];return t[e.name]=i?Object.assign({},i,e,{options:Object.assign({},i.options,e.options),data:Object.assign({},i.data,e.data)}):e,t}),{}),Object.keys(c).map((function(t){return c[t]}))));return a.orderedModifiers=u.filter((function(t){return t.enabled})),a.orderedModifiers.forEach((function(t){var e=t.name,i=t.options,n=void 0===i?{}:i,s=t.effect;if("function"==typeof s){var o=s({state:a,name:e,instance:h,options:n});l.push(o||function(){})}})),h.update()},forceUpdate:function(){if(!c){var t=a.elements,e=t.reference,i=t.popper;if(Fe(e,i)){a.rects={reference:$e(e,oe(i),"fixed"===a.options.strategy),popper:Jt(i)},a.reset=!1,a.placement=a.options.placement,a.orderedModifiers.forEach((function(t){return a.modifiersData[t.name]=Object.assign({},t.data)}));for(var n=0;n<a.orderedModifiers.length;n++)if(!0!==a.reset){var s=a.orderedModifiers[n],o=s.fn,r=s.options,l=void 0===r?{}:r,d=s.name;"function"==typeof o&&(a=o({state:a,options:l,name:d,instance:h})||a)}else a.reset=!1,n=-1}}},update:(s=function(){return new Promise((function(t){h.forceUpdate(),t(a)}))},function(){return r||(r=new Promise((function(t){Promise.resolve().then((function(){r=void 0,t(s())}))}))),r}),destroy:function(){d(),c=!0}};if(!Fe(t,e))return h;function d(){l.forEach((function(t){return t()})),l=[]}return h.setOptions(i).then((function(t){!c&&i.onFirstUpdate&&i.onFirstUpdate(t)})),h}}var qe=ze(),Re=ze({defaultModifiers:[me,Me,pe,Rt]}),Ve=ze({defaultModifiers:[me,Me,pe,Rt,je,Se,He,he,Pe]});const Ke=Object.freeze(Object.defineProperty({__proto__:null,popperGenerator:ze,detectOverflow:Le,createPopperBase:qe,createPopper:Ve,createPopperLite:Re,top:gt,bottom:mt,right:_t,left:bt,auto:vt,basePlacements:yt,start:wt,end:At,clippingParents:Et,viewport:Tt,popper:Ct,reference:Ot,variationPlacements:xt,placements:kt,beforeRead:Lt,read:Dt,afterRead:St,beforeMain:It,main:Nt,afterMain:Pt,beforeWrite:jt,write:Mt,afterWrite:Ht,modifierPhases:$t,applyStyles:Rt,arrow:he,computeStyles:pe,eventListeners:me,flip:Se,hide:Pe,offset:je,popperOffsets:Me,preventOverflow:He},Symbol.toStringTag,{value:"Module"})),Qe="dropdown",Xe="ArrowUp",Ye="ArrowDown",Ue="click.bs.dropdown.data-api",Ge="keydown.bs.dropdown.data-api",Je="show",Ze='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',ti=`${Ze}.show`,ei=".dropdown-menu",ii=p()?"top-end":"top-start",ni=p()?"top-start":"top-end",si=p()?"bottom-end":"bottom-start",oi=p()?"bottom-start":"bottom-end",ri=p()?"left-start":"right-start",ai=p()?"right-start":"left-start",li={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},ci={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class hi extends z{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=Q.next(this._element,ei)[0]||Q.prev(this._element,ei)[0]||Q.findOne(ei,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return li}static get DefaultType(){return ci}static get NAME(){return Qe}toggle(){return this._isShown()?this.hide():this.show()}show(){if(l(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!P.trigger(this._element,"show.bs.dropdown",t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))P.on(t,"mouseover",h);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Je),this._element.classList.add(Je),P.trigger(this._element,"shown.bs.dropdown",t)}}hide(){if(l(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!P.trigger(this._element,"hide.bs.dropdown",t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.off(t,"mouseover",h);this._popper&&this._popper.destroy(),this._menu.classList.remove(Je),this._element.classList.remove(Je),this._element.setAttribute("aria-expanded","false"),B.removeDataAttribute(this._menu,"popper"),P.trigger(this._element,"hidden.bs.dropdown",t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!o(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Qe.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===Ke)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:o(this._config.reference)?t=r(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const e=this._getPopperConfig();this._popper=Ve(t,this._menu,e)}_isShown(){return this._menu.classList.contains(Je)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return ri;if(t.classList.contains("dropstart"))return ai;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?ni:ii:e?oi:si}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(B.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const i=Q.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ye,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=hi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=Q.find(ti);for(const i of e){const e=hi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Xe,Ye].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ze)?this:Q.prev(this,Ze)[0]||Q.next(this,Ze)[0]||Q.findOne(Ze,t.delegateTarget.parentNode),o=hi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}P.on(document,Ge,Ze,hi.dataApiKeydownHandler),P.on(document,Ge,ei,hi.dataApiKeydownHandler),P.on(document,Ue,hi.clearMenus),P.on(document,"keyup.bs.dropdown.data-api",hi.clearMenus),P.on(document,Ue,Ze,(function(t){t.preventDefault(),hi.getOrCreateInstance(this).toggle()})),g(hi);const di=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",ui=".sticky-top",fi="padding-right",pi="margin-right";class gi{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,fi,(e=>e+t)),this._setElementAttributes(di,fi,(e=>e+t)),this._setElementAttributes(ui,pi,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,fi),this._resetElementAttributes(di,fi),this._resetElementAttributes(ui,pi)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&B.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=B.getDataAttribute(t,e);null!==i?(B.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of Q.find(t,this._element))e(i)}}const mi="show",_i="mousedown.bs.backdrop",bi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},vi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class yi extends F{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return bi}static get DefaultType(){return vi}static get NAME(){return"backdrop"}show(t){if(!this._config.isVisible)return void m(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(mi),this._emulateAnimation((()=>{m(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(mi),this._emulateAnimation((()=>{this.dispose(),m(t)}))):m(t)}dispose(){this._isAppended&&(P.off(this._element,_i),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),P.on(t,_i,(()=>{m(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const wi=".bs.focustrap",Ai="backward",Ei={autofocus:!0,trapElement:null},Ti={autofocus:"boolean",trapElement:"element"};class Ci extends F{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Ei}static get DefaultType(){return Ti}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),P.off(document,wi),P.on(document,"focusin.bs.focustrap",(t=>this._handleFocusin(t))),P.on(document,"keydown.tab.bs.focustrap",(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,P.off(document,wi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=Q.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===Ai?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?Ai:"forward")}}const Oi="hidden.bs.modal",xi="show.bs.modal",ki="modal-open",Li="show",Di="modal-static",Si={backdrop:!0,focus:!0,keyboard:!0},Ii={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ni extends z{constructor(t,e){super(t,e),this._dialog=Q.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new gi,this._addEventListeners()}static get Default(){return Si}static get DefaultType(){return Ii}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||P.trigger(this._element,xi,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(ki),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(P.trigger(this._element,"hide.bs.modal").defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Li),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){for(const t of[window,this._dialog])P.off(t,".bs.modal");this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new yi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Ci({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=Q.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(Li),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,P.trigger(this._element,"shown.bs.modal",{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.modal",(t=>{if("Escape"===t.key)return this._config.keyboard?(t.preventDefault(),void this.hide()):void this._triggerBackdropTransition()})),P.on(window,"resize.bs.modal",(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),P.on(this._element,"mousedown.dismiss.bs.modal",(t=>{P.one(this._element,"click.dismiss.bs.modal",(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(ki),this._resetAdjustments(),this._scrollBar.reset(),P.trigger(this._element,Oi)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(P.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(Di)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(Di),this._queueCallback((()=>{this._element.classList.remove(Di),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Ni.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}P.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=n(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),P.one(e,xi,(t=>{t.defaultPrevented||P.one(e,Oi,(()=>{a(this)&&this.focus()}))}));const i=Q.findOne(".modal.show");i&&Ni.getInstance(i).hide(),Ni.getOrCreateInstance(e).toggle(this)})),q(Ni),g(Ni);const Pi="show",ji="showing",Mi="hiding",Hi=".offcanvas.show",$i="hidePrevented.bs.offcanvas",Wi="hidden.bs.offcanvas",Bi={backdrop:!0,keyboard:!0,scroll:!1},Fi={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class zi extends z{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Bi}static get DefaultType(){return Fi}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||P.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new gi).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(ji),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Pi),this._element.classList.remove(ji),P.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(P.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Mi),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Pi,Mi),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new gi).reset(),P.trigger(this._element,Wi)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new yi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():P.trigger(this._element,$i)}:null})}_initializeFocusTrap(){return new Ci({trapElement:this._element})}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.offcanvas",(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():P.trigger(this._element,$i))}))}static jQueryInterface(t){return this.each((function(){const e=zi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}P.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=n(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;P.one(e,Wi,(()=>{a(this)&&this.focus()}));const i=Q.findOne(Hi);i&&i!==e&&zi.getInstance(i).hide(),zi.getOrCreateInstance(e).toggle(this)})),P.on(window,"load.bs.offcanvas.data-api",(()=>{for(const t of Q.find(Hi))zi.getOrCreateInstance(t).show()})),P.on(window,"resize.bs.offcanvas",(()=>{for(const t of Q.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&zi.getOrCreateInstance(t).hide()})),q(zi),g(zi);const qi=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Ri=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,Vi=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Ki=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!qi.has(i)||Boolean(Ri.test(t.nodeValue)||Vi.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Qi={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Xi={allowList:Qi,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"<div></div>"},Yi={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Ui={entry:"(string|element|function|null)",selector:"(string|element)"};class Gi extends F{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Ui)}_setContent(t,e,i){const n=Q.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Ki(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return"function"==typeof t?t(this):t}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Ji=new Set(["sanitize","allowList","sanitizeFn"]),Zi="fade",tn="show",en=".modal",nn="hide.bs.modal",sn="hover",on="focus",rn={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},an={allowList:Qi,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,0],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',title:"",trigger:"hover focus"},ln={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cn extends z{constructor(t,e){if(void 0===Ke)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return an}static get DefaultType(){return ln}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),P.off(this._element.closest(en),nn,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=P.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),P.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(tn),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.on(t,"mouseover",h);this._queueCallback((()=>{P.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!P.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(tn),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),P.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(Zi,tn),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(Zi),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Gi({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Zi)}_isShown(){return this.tip&&this.tip.classList.contains(tn)}_createPopper(t){const e="function"==typeof this._config.placement?this._config.placement.call(this,t,this._element):this._config.placement,i=rn[e.toUpperCase()];return Ve(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)P.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===sn?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===sn?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");P.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?on:sn]=!0,e._enter()})),P.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?on:sn]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},P.on(this._element.closest(en),nn,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=B.getDataAttributes(this._element);for(const t of Object.keys(e))Ji.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(cn);const hn={...cn.Default,content:"",offset:[0,8],placement:"right",template:'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',trigger:"click"},dn={...cn.DefaultType,content:"(null|string|element|function)"};class un extends cn{static get Default(){return hn}static get DefaultType(){return dn}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=un.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}g(un);const fn="click.bs.scrollspy",pn="active",gn="[href]",mn={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},_n={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class bn extends z{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return mn}static get DefaultType(){return _n}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(P.off(this._config.target,fn),P.on(this._config.target,fn,gn,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=Q.find(gn,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=Q.findOne(e.hash,this._element);a(t)&&(this._targetLinks.set(e.hash,e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(pn),this._activateParents(t),P.trigger(this._element,"activate.bs.scrollspy",{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))Q.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(pn);else for(const e of Q.parents(t,".nav, .list-group"))for(const t of Q.prev(e,".nav-link, .nav-item > .nav-link, .list-group-item"))t.classList.add(pn)}_clearActiveClass(t){t.classList.remove(pn);const e=Q.find("[href].active",t);for(const t of e)t.classList.remove(pn)}static jQueryInterface(t){return this.each((function(){const e=bn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(window,"load.bs.scrollspy.data-api",(()=>{for(const t of Q.find('[data-bs-spy="scroll"]'))bn.getOrCreateInstance(t)})),g(bn);const vn="ArrowLeft",yn="ArrowRight",wn="ArrowUp",An="ArrowDown",En="active",Tn="fade",Cn="show",On='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',xn=`.nav-link:not(.dropdown-toggle), .list-group-item:not(.dropdown-toggle), [role="tab"]:not(.dropdown-toggle), ${On}`;class kn extends z{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),P.on(this._element,"keydown.bs.tab",(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?P.trigger(e,"hide.bs.tab",{relatedTarget:t}):null;P.trigger(t,"show.bs.tab",{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(En),this._activate(n(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),P.trigger(t,"shown.bs.tab",{relatedTarget:e})):t.classList.add(Cn)}),t,t.classList.contains(Tn)))}_deactivate(t,e){t&&(t.classList.remove(En),t.blur(),this._deactivate(n(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),P.trigger(t,"hidden.bs.tab",{relatedTarget:e})):t.classList.remove(Cn)}),t,t.classList.contains(Tn)))}_keydown(t){if(![vn,yn,wn,An].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=[yn,An].includes(t.key),i=b(this._getChildren().filter((t=>!l(t))),t.target,e,!0);i&&(i.focus({preventScroll:!0}),kn.getOrCreateInstance(i).show())}_getChildren(){return Q.find(xn,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=n(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`#${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=Q.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",En),n(".dropdown-menu",Cn),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(En)}_getInnerElement(t){return t.matches(xn)?t:Q.findOne(xn,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=kn.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(document,"click.bs.tab",On,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||kn.getOrCreateInstance(this).show()})),P.on(window,"load.bs.tab",(()=>{for(const t of Q.find('.active[data-bs-toggle="tab"], .active[data-bs-toggle="pill"], .active[data-bs-toggle="list"]'))kn.getOrCreateInstance(t)})),g(kn);const Ln="hide",Dn="show",Sn="showing",In={animation:"boolean",autohide:"boolean",delay:"number"},Nn={animation:!0,autohide:!0,delay:5e3};class Pn extends z{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Nn}static get DefaultType(){return In}static get NAME(){return"toast"}show(){P.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(Ln),d(this._element),this._element.classList.add(Dn,Sn),this._queueCallback((()=>{this._element.classList.remove(Sn),P.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(P.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(Sn),this._queueCallback((()=>{this._element.classList.add(Ln),this._element.classList.remove(Sn,Dn),P.trigger(this._element,"hidden.bs.toast")}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(Dn),super.dispose()}isShown(){return this._element.classList.contains(Dn)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){P.on(this._element,"mouseover.bs.toast",(t=>this._onInteraction(t,!0))),P.on(this._element,"mouseout.bs.toast",(t=>this._onInteraction(t,!1))),P.on(this._element,"focusin.bs.toast",(t=>this._onInteraction(t,!0))),P.on(this._element,"focusout.bs.toast",(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Pn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return q(Pn),g(Pn),{Alert:R,Button:K,Carousel:at,Collapse:pt,Dropdown:hi,Modal:Ni,Offcanvas:zi,Popover:un,ScrollSpy:bn,Tab:kn,Toast:Pn,Tooltip:cn}}));
//# sourceMappingURL=bootstrap.bundle.min.js.map
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))

/***/ }),

/***/ "./node_modules/carousel/index.js":
/*!****************************************!*\
  !*** ./node_modules/carousel/index.js ***!
  \****************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/* WEBPACK VAR INJECTION */(function(jQuery, $) {(function() {
  var Carousel, domready;

  domready = __webpack_require__(/*! domready */ "./node_modules/domready/ready.js");

  module.exports = Carousel = (function() {
    function Carousel(selector) {
      var _this = this;
      this.selector = selector;
      if (!this.selector) {
        console.error("Please specify a CSS selector when creating a new Carousel,        e.g. new Carousel('#my-carousel')");
      }
      domready(function() {
        _this.slide_count = document.querySelectorAll("" + _this.selector + " > *").length;
        document.body.addEventListener('keydown', function(event) {
          var _ref, _ref1;
          if ((_ref = event.keyCode) === 39 || _ref === 40) {
            _this.next();
          }
          if ((_ref1 = event.keyCode) === 37 || _ref1 === 38) {
            return _this.prev();
          }
        });
        return _this.getOffset();
      });
    }

    Carousel.prototype.getOffset = function() {
      this.offset = parseInt(document.body.scrollTop / window.innerHeight);
      if ((document.body.scrollTop % window.innerHeight) > window.innerHeight / 2) {
        return this.offset++;
      }
    };

    Carousel.prototype.next = function() {
      this.getOffset();
      if (this.offset !== this.slide_count - 1) {
        this.offset++;
      }
      return this.animate();
    };

    Carousel.prototype.prev = function() {
      this.getOffset();
      if (this.offset !== 0) {
        this.offset--;
      }
      return this.animate();
    };

    Carousel.prototype.animate = function() {
      if (typeof jQuery !== "undefined") {
        return $("html, body").animate({
          scrollTop: window.innerHeight * this.offset
        });
      } else {
        return document.body.scrollTop = window.innerHeight * this.offset;
      }
    };

    return Carousel;

  })();

}).call(this);

/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"), __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js")))

/***/ }),

/***/ "./node_modules/collapse/index.js":
/*!****************************************!*\
  !*** ./node_modules/collapse/index.js ***!
  \****************************************/
/*! no static exports found */
/***/ (function(module, exports) {

function collapse(o, dir) {
  if (o instanceof Selection) {
    var r = o.getRangeAt(0);
    r.collapse(dir);
    o.removeAllRanges();
    o.addRange(r);
  } else if (o instanceof Range) {
    o.collapse(dir);
  } else {
    throw new Error('Unsupported argument type.');
  }
}

collapse.toEnd = function(o) {
  collapse(o, false);
}

collapse.toStart = function(o) {
  collapse(o, true);
}

module.exports = collapse;


/***/ }),

/***/ "./node_modules/core-js/internals/number-parse-int.js":
/*!************************************************************!*\
  !*** ./node_modules/core-js/internals/number-parse-int.js ***!
  \************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

var global = __webpack_require__(/*! ../internals/global */ "./node_modules/core-js/internals/global.js");
var fails = __webpack_require__(/*! ../internals/fails */ "./node_modules/core-js/internals/fails.js");
var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js");
var toString = __webpack_require__(/*! ../internals/to-string */ "./node_modules/core-js/internals/to-string.js");
var trim = __webpack_require__(/*! ../internals/string-trim */ "./node_modules/core-js/internals/string-trim.js").trim;
var whitespaces = __webpack_require__(/*! ../internals/whitespaces */ "./node_modules/core-js/internals/whitespaces.js");

var $parseInt = global.parseInt;
var Symbol = global.Symbol;
var ITERATOR = Symbol && Symbol.iterator;
var hex = /^[+-]?0x/i;
var exec = uncurryThis(hex.exec);
var FORCED = $parseInt(whitespaces + '08') !== 8 || $parseInt(whitespaces + '0x16') !== 22
  // MS Edge 18- broken with boxed symbols
  || (ITERATOR && !fails(function () { $parseInt(Object(ITERATOR)); }));

// `parseInt` method
// https://tc39.es/ecma262/#sec-parseint-string-radix
module.exports = FORCED ? function parseInt(string, radix) {
  var S = trim(toString(string));
  return $parseInt(S, (radix >>> 0) || (exec(hex, S) ? 16 : 10));
} : $parseInt;


/***/ }),

/***/ "./node_modules/core-js/modules/es.array.is-array.js":
/*!***********************************************************!*\
  !*** ./node_modules/core-js/modules/es.array.is-array.js ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
var isArray = __webpack_require__(/*! ../internals/is-array */ "./node_modules/core-js/internals/is-array.js");

// `Array.isArray` method
// https://tc39.es/ecma262/#sec-array.isarray
$({ target: 'Array', stat: true }, {
  isArray: isArray
});


/***/ }),

/***/ "./node_modules/core-js/modules/es.function.name.js":
/*!**********************************************************!*\
  !*** ./node_modules/core-js/modules/es.function.name.js ***!
  \**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

var DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ "./node_modules/core-js/internals/descriptors.js");
var FUNCTION_NAME_EXISTS = __webpack_require__(/*! ../internals/function-name */ "./node_modules/core-js/internals/function-name.js").EXISTS;
var uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ "./node_modules/core-js/internals/function-uncurry-this.js");
var defineBuiltInAccessor = __webpack_require__(/*! ../internals/define-built-in-accessor */ "./node_modules/core-js/internals/define-built-in-accessor.js");

var FunctionPrototype = Function.prototype;
var functionToString = uncurryThis(FunctionPrototype.toString);
var nameRE = /function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/;
var regExpExec = uncurryThis(nameRE.exec);
var NAME = 'name';

// Function instances `.name` property
// https://tc39.es/ecma262/#sec-function-instances-name
if (DESCRIPTORS && !FUNCTION_NAME_EXISTS) {
  defineBuiltInAccessor(FunctionPrototype, NAME, {
    configurable: true,
    get: function () {
      try {
        return regExpExec(nameRE, functionToString(this))[1];
      } catch (error) {
        return '';
      }
    }
  });
}


/***/ }),

/***/ "./node_modules/core-js/modules/es.parse-int.js":
/*!******************************************************!*\
  !*** ./node_modules/core-js/modules/es.parse-int.js ***!
  \******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

var $ = __webpack_require__(/*! ../internals/export */ "./node_modules/core-js/internals/export.js");
var $parseInt = __webpack_require__(/*! ../internals/number-parse-int */ "./node_modules/core-js/internals/number-parse-int.js");

// `parseInt` method
// https://tc39.es/ecma262/#sec-parseint-string-radix
$({ global: true, forced: parseInt != $parseInt }, {
  parseInt: $parseInt
});


/***/ }),

/***/ "./node_modules/domready/ready.js":
/*!****************************************!*\
  !*** ./node_modules/domready/ready.js ***!
  \****************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/*!
  * domready (c) Dustin Diaz 2012 - License MIT
  */
!function (name, definition) {
  if (true) module.exports = definition()
  else {}
}('domready', function (ready) {

  var fns = [], fn, f = false
    , doc = document
    , testEl = doc.documentElement
    , hack = testEl.doScroll
    , domContentLoaded = 'DOMContentLoaded'
    , addEventListener = 'addEventListener'
    , onreadystatechange = 'onreadystatechange'
    , readyState = 'readyState'
    , loadedRgx = hack ? /^loaded|^c/ : /^loaded|c/
    , loaded = loadedRgx.test(doc[readyState])

  function flush(f) {
    loaded = 1
    while (f = fns.shift()) f()
  }

  doc[addEventListener] && doc[addEventListener](domContentLoaded, fn = function () {
    doc.removeEventListener(domContentLoaded, fn, f)
    flush()
  }, f)


  hack && doc.attachEvent(onreadystatechange, fn = function () {
    if (/^c/.test(doc[readyState])) {
      doc.detachEvent(onreadystatechange, fn)
      flush()
    }
  })

  return (ready = hack ?
    function (fn) {
      self != top ?
        loaded ? fn() : fns.push(fn) :
        function () {
          try {
            testEl.doScroll('left')
          } catch (e) {
            return setTimeout(function() { ready(fn) }, 50)
          }
          fn()
        }()
    } :
    function (fn) {
      loaded ? fn() : fns.push(fn)
    })
})


/***/ }),

/***/ "./node_modules/fontsource-alfa-slab-one/index.css":
/*!*********************************************************!*\
  !*** ./node_modules/fontsource-alfa-slab-one/index.css ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

// extracted by mini-css-extract-plugin

/***/ }),

/***/ "./node_modules/fontsource-bai-jamjuree/index.css":
/*!********************************************************!*\
  !*** ./node_modules/fontsource-bai-jamjuree/index.css ***!
  \********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

// extracted by mini-css-extract-plugin

/***/ }),

/***/ "./node_modules/fontsource-lato/index.css":
/*!************************************************!*\
  !*** ./node_modules/fontsource-lato/index.css ***!
  \************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

// extracted by mini-css-extract-plugin

/***/ }),

/***/ "./node_modules/fontsource-oswald/index.css":
/*!**************************************************!*\
  !*** ./node_modules/fontsource-oswald/index.css ***!
  \**************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

// extracted by mini-css-extract-plugin

/***/ }),

/***/ "./node_modules/fontsource-snowburst-one/index.css":
/*!*********************************************************!*\
  !*** ./node_modules/fontsource-snowburst-one/index.css ***!
  \*********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

// extracted by mini-css-extract-plugin

/***/ }),

/***/ "./node_modules/fontsource-sofia/index.css":
/*!*************************************************!*\
  !*** ./node_modules/fontsource-sofia/index.css ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

// extracted by mini-css-extract-plugin

/***/ })

}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGZvbnRzb3VyY2UvcmFsZXdheS9pbmRleC5jc3MiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FjY29yZGlvbi9zcmMvYWNjb3JkaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ib290c3RyYXAvZGlzdC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9kaXN0L2pzL2Jvb3RzdHJhcC5idW5kbGUubWluLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jYXJvdXNlbC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29sbGFwc2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1pbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RvbXJlYWR5L3JlYWR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9mb250c291cmNlLWFsZmEtc2xhYi1vbmUvaW5kZXguY3NzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9mb250c291cmNlLWJhaS1qYW1qdXJlZS9pbmRleC5jc3MiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ZvbnRzb3VyY2UtbGF0by9pbmRleC5jc3MiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ZvbnRzb3VyY2Utb3N3YWxkL2luZGV4LmNzcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZm9udHNvdXJjZS1zbm93YnVyc3Qtb25lL2luZGV4LmNzcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZm9udHNvdXJjZS1zb2ZpYS9pbmRleC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsdUM7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxzR0FBc0csT0FBTztBQUM3RztBQUNBO0FBQ0EsRUFBRTs7OztBQUlGO0FBQ0E7QUFDQTtBQUNBLFlBQVksYUFBYTtBQUN6QixZQUFZLE9BQU87QUFDbkIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CLFlBQVksUUFBUTtBQUNwQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsT0FBTztBQUNwQixjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGLFFBQVE7QUFDcEc7QUFDQTtBQUNBLEVBQUU7OztBQUdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxnQ0FBZ0MsRUFBRTtBQUN4QztBQUNBLEVBQUU7Ozs7Ozs7Ozs7QUFVRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxVQUFVO0FBQ3RCLFlBQVksWUFBWTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSxTQUFTLFdBQVc7OztBQUdwQjtBQUNBO0FBQ0Esb0JBQW9CLHFCQUFxQixFQUFFO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7OztBQUlKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQsT0FBTztBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0Esb0JBQW9CLG1CQUFtQjtBQUN2QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7O0FBSUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7Ozs7QUFJSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXlCOzs7QUFHekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7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QUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUM7Ozs7Ozs7Ozs7OztBQ3RERCx1Qzs7Ozs7Ozs7Ozs7QUNBQSx1Qzs7Ozs7Ozs7Ozs7QUNBQSx1Qzs7Ozs7Ozs7Ozs7QUNBQSx1Qzs7Ozs7Ozs7Ozs7QUNBQSx1Qzs7Ozs7Ozs7Ozs7QUNBQSx1QyIsImZpbGUiOiJ2ZW5kb3Jzfmhlcm1lc19mcm9udC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbiIsIihmdW5jdGlvbigpe1xuXHRcInVzZSBzdHJpY3RcIjtcblxuXHR2YXIgdG91Y2hFbmFibGVkID0gXCJvbnRvdWNoc3RhcnRcIiBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cdHZhciBwcmVzc0V2ZW50ICAgPSB0b3VjaEVuYWJsZWQgPyBcInRvdWNoZW5kXCIgOiBcImNsaWNrXCI7XG5cdHZhciBlYWNoICAgICAgICAgPSBbXS5mb3JFYWNoO1xuXG5cblx0Ly8gTmFtZSBvZiB0aGUgb25UcmFuc2l0aW9uRW5kIGV2ZW50IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXJcblx0dmFyIHRyYW5zaXRpb25FbmQgPSAoZnVuY3Rpb24oKXtcblx0XHRmb3IodmFyIG5hbWVzID0gXCJ0cmFuc2l0aW9uZW5kIHdlYmtpdFRyYW5zaXRpb25FbmQgb1RyYW5zaXRpb25FbmQgb3RyYW5zaXRpb25lbmRcIi5zcGxpdChcIiBcIiksIGkgPSAwOyBpIDwgNDsgKytpKVxuXHRcdFx0aWYoXCJvblwiK25hbWVzW2ldLnRvTG93ZXJDYXNlKCkgaW4gd2luZG93KSByZXR1cm4gbmFtZXNbaV07XG5cdFx0cmV0dXJuIG5hbWVzWzBdO1xuXHR9KCkpO1xuXHRcblx0XG5cdFxuXHQvKipcblx0ICogQ29uZGl0aW9uYWxseSBhZGQgb3IgcmVtb3ZlIGEgdG9rZW4gZnJvbSBhIHRva2VuLWxpc3QuXG5cdCAqXG5cdCAqIEBwYXJhbSB7RE9NVG9rZW5MaXN0fSBsaXN0XG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0b2tlblxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWRcblx0ICovXG5cdGZ1bmN0aW9uIHNldFRva2VuKGxpc3QsIHRva2VuLCBlbmFibGVkKXtcblx0XHRlbmFibGVkID8gbGlzdC5hZGQodG9rZW4pIDogbGlzdC5yZW1vdmUodG9rZW4pO1xuXHR9XG5cblxuXG5cdC8qKlxuXHQgKiBTdG9wIGEgZnVuY3Rpb24gZnJvbSBmaXJpbmcgdG9vIHF1aWNrbHkuXG5cdCAqXG5cdCAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiB0aGF0IHJ1bnMgb25seSBhZnRlciB0aGUgZGVzaWduYXRlZFxuXHQgKiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZC4gVXNlZnVsIGZvciB0aHJvdHRsaW5nIG9uUmVzaXplIGhhbmRsZXJzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge051bWJlcn0gbGltaXQgLSBUaHJlc2hvbGQgdG8gc3RhbGwgZXhlY3V0aW9uIGJ5LCBpbiBtaWxsaXNlY29uZHMuXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gc29vbiAtIElmIFRSVUUsIHdpbGwgY2FsbCB0aGUgZnVuY3Rpb24gKmJlZm9yZSogdGhlIHRocmVzaG9sZCdzIGVsYXBzZWQsIHJhdGhlciB0aGFuIGFmdGVyLlxuXHQgKiBAcmV0dXJuIHtGdW5jdGlvbn1cblx0ICovXG5cdGZ1bmN0aW9uIGRlYm91bmNlKGZuLCBsaW1pdCwgc29vbil7XG5cdFx0dmFyIGxpbWl0ID0gbGltaXQgPCAwID8gMCA6IGxpbWl0LFxuXHRcdFx0c3RhcnRlZCwgY29udGV4dCwgYXJncywgdGltZXIsXG5cblx0XHRcdGRlbGF5ZWQgPSBmdW5jdGlvbigpe1xuXG5cdFx0XHRcdC8vIEdldCB0aGUgdGltZSBiZXR3ZWVuIG5vdyBhbmQgd2hlbiB0aGUgZnVuY3Rpb24gd2FzIGZpcnN0IGZpcmVkXG5cdFx0XHRcdHZhciB0aW1lU2luY2UgPSBEYXRlLm5vdygpIC0gc3RhcnRlZDtcblxuXHRcdFx0XHRpZih0aW1lU2luY2UgPj0gbGltaXQpe1xuXHRcdFx0XHRcdGlmKCFzb29uKSBmbi5hcHBseShjb250ZXh0LCBhcmdzKTtcblx0XHRcdFx0XHRpZih0aW1lcikgY2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHRcdFx0XHR0aW1lciA9IGNvbnRleHQgPSBhcmdzID0gbnVsbDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGVsc2UgdGltZXIgPSBzZXRUaW1lb3V0KGRlbGF5ZWQsIGxpbWl0IC0gdGltZVNpbmNlKTtcblx0XHRcdH07XG5cblxuXHRcdC8vIERlYm91bmNlZCBjb3B5IG9mIHRoZSBvcmlnaW5hbCBmdW5jdGlvblxuXHRcdHJldHVybiBmdW5jdGlvbigpe1xuXHRcdFx0Y29udGV4dCA9IHRoaXMsXG5cdFx0XHRhcmdzICAgID0gYXJndW1lbnRzO1xuXG5cdFx0XHRpZighbGltaXQpXG5cdFx0XHRcdHJldHVybiBmbi5hcHBseShjb250ZXh0LCBhcmdzKTtcblxuXHRcdFx0c3RhcnRlZCA9IERhdGUubm93KCk7XG5cdFx0XHRpZighdGltZXIpe1xuXHRcdFx0XHRpZihzb29uKSBmbi5hcHBseShjb250ZXh0LCBhcmdzKTtcblx0XHRcdFx0dGltZXIgPSBzZXRUaW1lb3V0KGRlbGF5ZWQsIGxpbWl0KTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXG5cblxuXHR2YXIgdW5pcXVlSUQgPSAoZnVuY3Rpb24oKXtcblx0XHR2YXIgSURzICAgICA9IHt9O1xuXHRcdHZhciBpbmRleGVzID0ge307XG5cdFx0XG5cdFx0XG5cdFx0LyoqXG5cdFx0ICogR2VuZXJhdGUgYSB1bmlxdWUgSUQgZm9yIGEgRE9NIGVsZW1lbnQuXG5cdFx0ICpcblx0XHQgKiBCeSBkZWZhdWx0LCBtaW5pbWFsaXN0IElEcyBsaWtlIFwiXzFcIiBvciBcIl8yXCIgYXJlIGdlbmVyYXRlZCB1c2luZyBpbnRlcm5hbGx5XG5cdFx0ICogdHJhY2tlZCBpbmNyZW1lbnRhdGlvbi4gVWdsaWVyLCBtb3JlIGNvbGxpc2lvbi1wcm9vZiBJRHMgY2FuIGJlIGdlbmVyYXRlZCBieVxuXHRcdCAqIHBhc3NpbmcgYSB0cnV0aHkgdmFsdWUgdG8gdGhlIGZ1bmN0aW9uJ3MgZmlyc3QgYXJndW1lbnQuXG5cdFx0ICpcblx0XHQgKiBJcnJlc3BlY3RpdmUgb2Ygd2hldGhlciB2YWx1ZXMgYXJlIGJlaW5nIGdlbmVyYXRlZCBzaW1wbHkgb3IgcmFuZG9tbHksIHRoZVxuXHRcdCAqIGRvY3VtZW50IHRyZWUgaXMgYWx3YXlzIGNvbnN1bHRlZCBmaXJzdCB0byBlbnN1cmUgYSBkdXBsaWNhdGUgSUQgaXMgbmV2ZXJcblx0XHQgKiByZXR1cm5lZC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSAgcHJlZml4IC0gUHJlZml4IHByZXBlbmRlZCB0byByZXN1bHQuIERlZmF1bHQ6IFwiX1wiXG5cdFx0ICogQHBhcmFtIHtCb29sZWFufSByYW5kb20gLSBHZW5lcmF0ZSBjb2xsaXNpb24tcHJvb2YgSURzIHVzaW5nIHJhbmRvbSBzeW1ib2xzXG5cdFx0ICogQHBhcmFtIHtOdW1iZXJ9ICBsZW5ndGggLSBMZW5ndGggb2YgcmFuZG9tIHBhc3N3b3Jkcy4gRGVmYXVsdDogNlxuXHRcdCAqIEByZXR1cm4ge1N0cmluZ31cblx0XHQgKi9cblx0XHRmdW5jdGlvbiB1bmlxdWVJRChwcmVmaXgsIGNvbXBsZXgsIGxlbmd0aCl7XG5cdFx0XHRsZW5ndGggICAgID0gKyhsZW5ndGggfHwgNik7XG5cdFx0XHR2YXIgcmVzdWx0ID0gIChwcmVmaXggPSBwcmVmaXggfHwgXCJfXCIpO1xuXHRcdFx0XG5cdFx0XHQvLyBTaW1wbGUgSURzXG5cdFx0XHRpZighY29tcGxleCl7XG5cdFx0XHRcdFxuXHRcdFx0XHQvLyBTZXQgdGhpcyBwcmVmaXgncyBzdGFydGluZyBpbmRleCBpZiBpdCdzIG5vdCBiZWVuIHVzZWQgeWV0XG5cdFx0XHRcdGlmKCFpbmRleGVzW3ByZWZpeF0pXG5cdFx0XHRcdFx0aW5kZXhlc1twcmVmaXhdID0gMDtcblx0XHRcdFx0XG5cdFx0XHRcdHJlc3VsdCArPSArK2luZGV4ZXNbcHJlZml4XTtcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0Ly8gVWdsaWVyL3NhZmVyIElEc1xuXHRcdFx0ZWxzZXtcblx0XHRcdFx0dmFyIGNoYXJzICAgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXCI7XG5cdFx0XHRcdGNoYXJzICAgICAgKz0gY2hhcnMudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0cmVzdWx0ICAgICArPSBjaGFyc1sgTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogKGNoYXJzLmxlbmd0aCAtIDEpKSBdO1xuXHRcdFx0XHRjaGFycyAgICAgICs9IFwiMDEyMzQ1Njc4OVwiO1xuXHRcdFx0XHRcblx0XHRcdFx0d2hpbGUocmVzdWx0Lmxlbmd0aCA8IGxlbmd0aClcblx0XHRcdFx0XHRyZXN1bHQgKz0gY2hhcnNbIE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIChjaGFycy5sZW5ndGggLSAxKSldO1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRyZXR1cm4gSURzW3Jlc3VsdF0gfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocmVzdWx0KVxuXHRcdFx0XHQ/IHVuaXF1ZUlEKHByZWZpeCwgY29tcGxleClcblx0XHRcdFx0OiAoSURzW3Jlc3VsdF0gPSB0cnVlLCByZXN1bHQpO1xuXHRcdH1cblx0XHRcblx0XHRcblx0XHRyZXR1cm4gdW5pcXVlSUQ7XG5cdH0oKSk7XG5cblxuXHQvLyBOYW1lIG9mIHRoZSBDU1NPTSBwcm9wZXJ0eSB1c2VkIGJ5IHRoaXMgYnJvd3NlciBmb3IgQ1NTIHRyYW5zZm9ybXNcblx0dmFyIGNzc1RyYW5zZm9ybSA9IChmdW5jdGlvbihuKXtcblx0XHRzID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuXHRcdGlmKChwcm9wID0gbi50b0xvd2VyQ2FzZSgpKSBpbiBzKSByZXR1cm4gcHJvcDtcblx0XHRmb3IodmFyIHByb3AsIHMsIHAgPSBcIldlYmtpdCBNb3ogTXMgTyBLaHRtbFwiLCBwID0gKHAudG9Mb3dlckNhc2UoKSArIHApLnNwbGl0KFwiIFwiKSwgaSA9IDA7IGkgPCAxMDsgKytpKVxuXHRcdFx0aWYoKHByb3AgPSBwW2ldK24pIGluIHMpIHJldHVybiBwcm9wO1xuXHRcdHJldHVybiBcIlwiO1xuXHR9KFwiVHJhbnNmb3JtXCIpKTtcblxuXG5cdC8vIFdoZXRoZXIgM0QgdHJhbnNmb3JtcyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgYnJvd3NlclxuXHR2YXIgY3NzM0RTdXBwb3J0ZWQgPSAoZnVuY3Rpb24ocHJvcE5hbWUpe1xuXHRcdHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSwgcyA9IGUuc3R5bGUsXG5cdFx0diA9IFtbXCJ0cmFuc2xhdGVZKFwiLCBcIilcIl0sIFtcInRyYW5zbGF0ZTNkKDAsXCIsIFwiLDApXCJdXVxuXHRcdHRyeXsgc1twcm9wTmFtZV0gPSB2WzFdLmpvaW4oXCIxcHhcIik7IH0gY2F0Y2goZSl7fVxuXHRcdHJldHVybiB2WyshIXNbcHJvcE5hbWVdXSA9PT0gdlsxXTtcblx0fShjc3NUcmFuc2Zvcm0pKTtcblxuXG5cblxuXG5cblxuXG5cblx0dmFyIGZvbGRzID0gW107XG5cblxuXHQvKipcblx0ICogUmVwcmVzZW50cyBhIHNpbmdsZSBwYW5lbCBvZiB0b2dnbGFibGUgY29udGVudCBpbnNpZGUgYW4gQWNjb3JkaW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FjY29yZGlvbn0gYWNjb3JkaW9uXG5cdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0dmFyIEZvbGQgPSBmdW5jdGlvbihhY2NvcmRpb24sIGVsKXtcblx0XHR2YXIgVEhJUyAgICAgICAgICAgID0gdGhpcztcblx0XHR2YXIgaGVhZGluZyAgICAgICAgID0gZWwuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0dmFyIGNvbnRlbnQgICAgICAgICA9IGVsLmxhc3RFbGVtZW50Q2hpbGQ7XG5cdFx0dmFyIGVsQ2xhc3NlcyAgICAgICA9IGVsLmNsYXNzTGlzdDtcblx0XHR2YXIgb3BlbkNsYXNzICAgICAgID0gYWNjb3JkaW9uLm9wZW5DbGFzcztcblx0XHR2YXIgY2xvc2VDbGFzcyAgICAgID0gYWNjb3JkaW9uLmNsb3NlQ2xhc3M7XG5cdFx0dmFyIGtleXNFbmFibGVkICAgICA9ICFhY2NvcmRpb24ubm9LZXlzO1xuXHRcdHZhciB1c2VCb3JkZXJzICAgICAgPSBhY2NvcmRpb24udXNlQm9yZGVycztcblx0XHR2YXIgdXNlVHJhbnNmb3JtcyAgID0gIWFjY29yZGlvbi5ub1RyYW5zZm9ybXMgJiYgY3NzVHJhbnNmb3JtO1xuXHRcdHZhciBvblRvZ2dsZSAgICAgICAgPSBhY2NvcmRpb24ub25Ub2dnbGU7XG5cdFx0dmFyIF9kaXNhYmxlZCAgICAgICA9IGZhbHNlO1xuXHRcdHZhciBfb3BlbiwgX3ksIF9oZWlnaHQsIF9hcmlhRW5hYmxlZDtcblx0XHR2YXIgc2Nyb2xsWCwgc2Nyb2xsWTtcblx0XHR2YXIgb25Ub3VjaFN0YXJ0O1xuXHRcdHZhciBvbktleURvd247XG5cdFx0dmFyIG9uUHJlc3M7XG5cdFx0XG5cdFx0XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVEhJUywge1xuXHRcdFx0Zml0OiB7dmFsdWU6IGZpdH0sXG5cdFx0XHRcblx0XHRcdFxuXHRcdFx0Ly8gQWRkIG9yIHJlbW92ZSByZWxldmFudCBBUklBIGF0dHJpYnV0ZXMgZnJvbSB0aGUgZm9sZCdzIGVsZW1lbnRzXG5cdFx0XHRhcmlhRW5hYmxlZDoge1xuXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBfYXJpYUVuYWJsZWQ7IH0sXG5cdFx0XHRcdHNldDogZnVuY3Rpb24oaW5wdXQpe1xuXHRcdFx0XHRcdGlmKChpbnB1dCA9ICEhaW5wdXQpICE9PSAhIV9hcmlhRW5hYmxlZCl7XG5cdFx0XHRcdFx0XHRfYXJpYUVuYWJsZWQgPSBpbnB1dDtcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0Ly8gRW5hYmxlIEFSSUEtYXR0cmlidXRlIG1hbmFnZW1lbnRcblx0XHRcdFx0XHRcdGlmKGlucHV0KXtcblx0XHRcdFx0XHRcdFx0aGVhZGluZy5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwidGFiXCIpO1xuXHRcdFx0XHRcdFx0XHRjb250ZW50LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJ0YWJwYW5lbFwiKTtcblx0XHRcdFx0XHRcdFx0Y2hlY2tJRHMoKTtcblx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdC8vIFVwZGF0ZSB0aGUgYXR0cmlidXRlcyB0aGF0J3JlIGNvbnRyb2xsZWQgYnkgLm9wZW4ncyBzZXR0ZXJcblx0XHRcdFx0XHRcdFx0aGVhZGluZy5zZXRBdHRyaWJ1dGUoXCJhcmlhLXNlbGVjdGVkXCIsICEhX29wZW4pO1xuXHRcdFx0XHRcdFx0XHRoZWFkaW5nLnNldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIiwgISFfb3Blbik7XG5cdFx0XHRcdFx0XHRcdGNvbnRlbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwgICAhX29wZW4pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHQvLyBEaXNhYmxpbmc7IHJlbW92ZSBhbGwgcmVsZXZhbnQgYXR0cmlidXRlc1xuXHRcdFx0XHRcdFx0ZWxzZXtcblx0XHRcdFx0XHRcdFx0aGVhZGluZy5yZW1vdmVBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuXHRcdFx0XHRcdFx0XHRoZWFkaW5nLnJlbW92ZUF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIik7XG5cdFx0XHRcdFx0XHRcdGhlYWRpbmcucmVtb3ZlQXR0cmlidXRlKFwiYXJpYS1zZWxlY3RlZFwiKTtcblx0XHRcdFx0XHRcdFx0aGVhZGluZy5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpO1xuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0Y29udGVudC5yZW1vdmVBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuXHRcdFx0XHRcdFx0XHRjb250ZW50LnJlbW92ZUF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcblx0XHRcdFx0XHRcdFx0Y29udGVudC5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdFxuXHRcdFx0XG5cdFx0XHQvLyBXaGV0aGVyIG9yIG5vdCB0aGUgZm9sZCdzIGN1cnJlbnRseSBvcGVuZWRcblx0XHRcdG9wZW46IHtcblx0XHRcdFx0XG5cdFx0XHRcdGdldDogZnVuY3Rpb24oKXtcblx0XHRcdFx0XHRcblx0XHRcdFx0XHQvLyBEZXJpdmUgdGhlIGZvbGQncyBvcGVuZWQgc3RhdGUgZnJvbSB0aGUgRE9NIGlmIGl0J3Mgbm90IGJlZW4gZGV0ZXJtaW5lZCB5ZXRcblx0XHRcdFx0XHRpZih1bmRlZmluZWQgPT09IF9vcGVuKXtcblx0XHRcdFx0XHRcdF9vcGVuID0gZWxDbGFzc2VzLmNvbnRhaW5zKG9wZW5DbGFzcyk7XG5cdFx0XHRcdFx0XHRzZXRUb2tlbihlbENsYXNzZXMsIGNsb3NlQ2xhc3MsICFfb3Blbik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdHJldHVybiBfb3Blbjtcblx0XHRcdFx0fSxcblx0XHRcdFx0XG5cdFx0XHRcdFxuXHRcdFx0XHRzZXQ6IGZ1bmN0aW9uKGlucHV0KXtcblx0XHRcdFx0XHRpZigoaW5wdXQgPSAhIWlucHV0KSAhPT0gX29wZW4pe1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHQvLyBJZiBhbiBvblRvZ2dsZSBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCBydW4gaXQuIEF2b2lkIGRvaW5nIGFueXRoaW5nIGlmIGl0IHJldHVybnMgZmFsc2UuXG5cdFx0XHRcdFx0XHRpZihcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBvblRvZ2dsZSAmJiBmYWxzZSA9PT0gb25Ub2dnbGUuY2FsbChudWxsLCBUSElTLCBpbnB1dCkpXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0c2V0VG9rZW4oZWxDbGFzc2VzLCBvcGVuQ2xhc3MsICAgaW5wdXQpO1xuXHRcdFx0XHRcdFx0c2V0VG9rZW4oZWxDbGFzc2VzLCBjbG9zZUNsYXNzLCAhaW5wdXQpO1xuXHRcdFx0XHRcdFx0X29wZW4gPSBpbnB1dDtcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0Ly8gVXBkYXRlIEFSSUEgYXR0cmlidXRlc1xuXHRcdFx0XHRcdFx0aWYoX2FyaWFFbmFibGVkKXtcblx0XHRcdFx0XHRcdFx0aGVhZGluZy5zZXRBdHRyaWJ1dGUoXCJhcmlhLXNlbGVjdGVkXCIsICBpbnB1dCk7XG5cdFx0XHRcdFx0XHRcdGhlYWRpbmcuc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLCAgaW5wdXQpO1xuXHRcdFx0XHRcdFx0XHRjb250ZW50LnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsICAgIWlucHV0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhpcyBmb2xkIHdhcyBjbG9zZWQgd2hlbiB0aGUgc2NyZWVuIHJlc2l6ZWQsIHJ1biBhIGZ1bGwgdXBkYXRlIGluIGNhc2UgaXRzIGNvbnRlbnRzIHdlcmUganVnZ2xlZCBhcm91bmRcblx0XHRcdFx0XHRcdGlmKFRISVMubmVlZHNSZWZyZXNoKXtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIFRISVMubmVlZHNSZWZyZXNoO1xuXHRcdFx0XHRcdFx0XHRhY2NvcmRpb24ucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSBhY2NvcmRpb24udXBkYXRlKCk7XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdC8vIENsb3NlIG90aGVyIGZvbGRzIGlmIGFjY29yZGlvbiBpcyBtb2RhbFxuXHRcdFx0XHRcdFx0aWYoYWNjb3JkaW9uLm1vZGFsICYmIF9vcGVuKXtcblx0XHRcdFx0XHRcdFx0Zm9yKHZhciBmb2xkLCBpID0gMCwgbCA9IGFjY29yZGlvbi5mb2xkcy5sZW5ndGg7IGkgPCBsOyArK2kpe1xuXHRcdFx0XHRcdFx0XHRcdGlmKFRISVMgIT09IChmb2xkID0gYWNjb3JkaW9uLmZvbGRzW2ldKSlcblx0XHRcdFx0XHRcdFx0XHRcdGZvbGQub3BlbiA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0XG5cdFx0XHRcblx0XHRcdC8vIFdoZXRoZXIgdGhlIGZvbGQncyBiZWVuIGRlYWN0aXZhdGVkXG5cdFx0XHRkaXNhYmxlZDoge1xuXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBfZGlzYWJsZWQgfSxcblx0XHRcdFx0c2V0OiBmdW5jdGlvbihpbnB1dCl7XG5cdFx0XHRcdFx0aWYoKGlucHV0ID0gISFpbnB1dCkgIT09IF9kaXNhYmxlZCl7XG5cdFx0XHRcdFx0XHR2YXIgc3R5bGUgPSBlbC5zdHlsZTtcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0Ly8gRGVhY3RpdmF0ZWRcblx0XHRcdFx0XHRcdGlmKF9kaXNhYmxlZCA9IGlucHV0KXtcblx0XHRcdFx0XHRcdFx0c3R5bGUuaGVpZ2h0ID0gbnVsbDtcblx0XHRcdFx0XHRcdFx0dXNlVHJhbnNmb3Jtc1xuXHRcdFx0XHRcdFx0XHRcdD8gKHN0eWxlW2Nzc1RyYW5zZm9ybV0gPSBudWxsKVxuXHRcdFx0XHRcdFx0XHRcdDogKHN0eWxlLnRvcCA9IG51bGwpO1xuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0dG91Y2hFbmFibGVkICYmIGhlYWRpbmcucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgb25Ub3VjaFN0YXJ0KTtcblx0XHRcdFx0XHRcdFx0aGVhZGluZy5yZW1vdmVFdmVudExpc3RlbmVyKHByZXNzRXZlbnQsIG9uUHJlc3MpO1xuXHRcdFx0XHRcdFx0XHRlbENsYXNzZXMucmVtb3ZlKG9wZW5DbGFzcywgY2xvc2VDbGFzcyk7XG5cdFx0XHRcdFx0XHRcdGlmKG9uS2V5RG93bil7XG5cdFx0XHRcdFx0XHRcdFx0aGVhZGluZy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBvbktleURvd24pO1xuXHRcdFx0XHRcdFx0XHRcdGhlYWRpbmcucmVtb3ZlQXR0cmlidXRlKFwidGFiaW5kZXhcIik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdGlmKF9hcmlhRW5hYmxlZCl7XG5cdFx0XHRcdFx0XHRcdFx0VEhJUy5hcmlhRW5hYmxlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdF9hcmlhRW5hYmxlZCAgICAgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdC8vIFJlYWN0aXZhdGVkXG5cdFx0XHRcdFx0XHRlbHNle1xuXHRcdFx0XHRcdFx0XHRzdHlsZS5oZWlnaHQgPSBfaGVpZ2h0ICsgXCJweFwiO1xuXHRcdFx0XHRcdFx0XHR1c2VUcmFuc2Zvcm1zXG5cdFx0XHRcdFx0XHRcdFx0PyBzdHlsZVtjc3NUcmFuc2Zvcm1dID1cblx0XHRcdFx0XHRcdFx0XHRcdGNzczNEU3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD8gKFwidHJhbnNsYXRlM0QoMCxcIiArIF95ICsgXCJweCwwKVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ6IChcInRyYW5zbGF0ZVkoXCIgICAgKyBfeSArIFwicHgpXCIpXG5cdFx0XHRcdFx0XHRcdFx0OiAoc3R5bGUudG9wID0gX3kgKyBcInB4XCIpO1xuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0dG91Y2hFbmFibGVkICYmIGhlYWRpbmcuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgb25Ub3VjaFN0YXJ0KTtcblx0XHRcdFx0XHRcdFx0aGVhZGluZy5hZGRFdmVudExpc3RlbmVyKHByZXNzRXZlbnQsIG9uUHJlc3MpO1xuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0aWYob25LZXlEb3duKXtcblx0XHRcdFx0XHRcdFx0XHRoZWFkaW5nLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIG9uS2V5RG93bik7XG5cdFx0XHRcdFx0XHRcdFx0aGVhZGluZy50YWJJbmRleCA9IDA7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRcblx0XHRcdFxuXHRcdFx0Ly8gVmVydGljYWwgcG9zaXRpb24gb2YgdGhlIGZvbGQgd2l0aGluIGFuIGFjY29yZGlvbidzIGNvbnRhaW5lclxuXHRcdFx0eToge1xuXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uKCl7XG5cdFx0XHRcdFx0aWYodW5kZWZpbmVkID09PSBfeSlcblx0XHRcdFx0XHRcdHJldHVybiAoX3kgPSBwYXJzZUludChlbC5zdHlsZS50b3ApIHx8IDApO1xuXHRcdFx0XHRcdHJldHVybiBfeTtcblx0XHRcdFx0fSxcblx0XHRcdFx0XG5cdFx0XHRcdHNldDogZnVuY3Rpb24oaW5wdXQpe1xuXHRcdFx0XHRcdGlmKChpbnB1dCA9ICtpbnB1dCkgIT09IF95KXtcblx0XHRcdFx0XHRcdF95ID0gaW5wdXQ7XG5cdFx0XHRcdFx0XHR1c2VUcmFuc2Zvcm1zXG5cdFx0XHRcdFx0XHRcdD8gZWwuc3R5bGVbY3NzVHJhbnNmb3JtXSA9XG5cdFx0XHRcdFx0XHRcdFx0Y3NzM0RTdXBwb3J0ZWRcblx0XHRcdFx0XHRcdFx0XHRcdD8gKFwidHJhbnNsYXRlM0QoMCxcIiArIGlucHV0ICsgXCJweCwwKVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0OiAoXCJ0cmFuc2xhdGVZKFwiICAgICsgaW5wdXQgKyBcInB4KVwiKVxuXHRcdFx0XHRcdFx0XHQ6IChlbC5zdHlsZS50b3AgPSBpbnB1dCArIFwicHhcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0XG5cdFx0XHRcblx0XHRcdC8vIEhlaWdodCBvZiB0aGUgZm9sZCdzIG91dGVybW9zdCBjb250YWluZXJcblx0XHRcdGhlaWdodDoge1xuXHRcdFx0XHRcblx0XHRcdFx0Z2V0OiBmdW5jdGlvbigpe1xuXHRcdFx0XHRcdGlmKHVuZGVmaW5lZCA9PT0gX2hlaWdodCl7XG5cdFx0XHRcdFx0XHRfaGVpZ2h0ID0gVEhJUy5oZWFkaW5nSGVpZ2h0ICsgY29udGVudC5zY3JvbGxIZWlnaHQ7XG5cdFx0XHRcdFx0XHRlbC5zdHlsZS5oZWlnaHQgPSBfaGVpZ2h0ICsgXCJweFwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gX2hlaWdodDtcblx0XHRcdFx0fSxcblx0XHRcdFx0XG5cdFx0XHRcdHNldDogZnVuY3Rpb24oaW5wdXQpe1xuXHRcdFx0XHRcdGlmKGlucHV0ICYmIChpbnB1dCA9ICtpbnB1dCkgIT09IF9oZWlnaHQpe1xuXHRcdFx0XHRcdFx0ZWwuc3R5bGUuaGVpZ2h0ID0gaW5wdXQgKyBcInB4XCJcblx0XHRcdFx0XHRcdF9oZWlnaHQgICAgICAgICA9IGlucHV0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdFxuXG5cdFx0XHQvLyBDdXJyZW50IGhlaWdodCBvZiB0aGUgZm9sZCdzIGhlYWRpbmdcblx0XHRcdGhlYWRpbmdIZWlnaHQ6IHtcblx0XHRcdFx0Z2V0OiBmdW5jdGlvbigpe1xuXHRcdFx0XHRcdHJldHVybiBoZWFkaW5nLnNjcm9sbEhlaWdodFxuXHRcdFx0XHRcdFx0KyBUSElTLmhlaWdodE9mZnNldFxuXHRcdFx0XHRcdFx0KyAodXNlQm9yZGVycyA/IFRISVMuaGVhZGluZ0JvcmRlciA6IDApXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRcblx0XHRcdC8vIFRvdGFsIGhlaWdodCBjb25zdW1lZCBieSB0aGUgaGVhZGluZyBlbGVtZW50J3MgQ1NTIGJvcmRlcnMsIGlmIGFueVxuXHRcdFx0aGVhZGluZ0JvcmRlcjoge1xuXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uKCl7XG5cdFx0XHRcdFx0cmV0dXJuIChoZWFkaW5nLm9mZnNldEhlaWdodCB8fCAwKSAtIChoZWFkaW5nLmNsaWVudEhlaWdodCB8fCAwKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdFxuXHRcdFx0XG5cdFx0XHRcblx0XHRcdC8vIFRvdGFsIGhlaWdodCBvZiB0aGUgZm9sZCdzIGNvbnRhaW5lciBlbGVtZW50XG5cdFx0XHRlbEhlaWdodDoge1xuXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uKCl7XG5cdFx0XHRcdFx0cmV0dXJuIGVsLnNjcm9sbEhlaWdodCArICh1c2VCb3JkZXJzID8gVEhJUy5lbEJvcmRlciA6IDApO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0XG5cdFx0XHQvLyBUb3RhbCBoZWlnaHQgY29uc3VtZWQgYnkgY29udGFpbmVyIGVsZW1lbnQncyBDU1MgYm9yZGVycywgaWYgYW55XG5cdFx0XHRlbEJvcmRlcjoge1xuXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uKCl7XG5cdFx0XHRcdFx0cmV0dXJuIChlbC5vZmZzZXRIZWlnaHQgfHwgMCkgLSAoZWwuY2xpZW50SGVpZ2h0IHx8IDApO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0XG5cdFx0XHRcblx0XHRcdC8vIFdoZXRoZXIgdGhlIGZvbGQncyBjb250YWluZXIgaGFzIGJlZW4gcmVzaXplZCBpbmNvcnJlY3RseVxuXHRcdFx0d3JvbmdTaXplOiB7XG5cdFx0XHRcdGdldDogZnVuY3Rpb24oKXtcblx0XHRcdFx0XHRyZXR1cm4gVEhJUy5oZWFkaW5nSGVpZ2h0ICsgY29udGVudC5zY3JvbGxIZWlnaHQgIT09IGVsLnNjcm9sbEhlaWdodDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdFxuXHRcdFxuXHRcdFxuXHRcdFRISVMuaW5kZXggICAgICAgID0gZm9sZHMucHVzaChUSElTKSAtIDE7XG5cdFx0VEhJUy5hY2NvcmRpb24gICAgPSBhY2NvcmRpb247XG5cdFx0VEhJUy5lbCAgICAgICAgICAgPSBlbDtcblx0XHRUSElTLmhlYWRpbmcgICAgICA9IGhlYWRpbmc7XG5cdFx0VEhJUy5jb250ZW50ICAgICAgPSBjb250ZW50O1xuXHRcdFRISVMuYXJpYUVuYWJsZWQgID0gIWFjY29yZGlvbi5ub0FyaWE7XG5cdFx0VEhJUy5oZWlnaHRPZmZzZXQgPSBhY2NvcmRpb24uaGVpZ2h0T2Zmc2V0O1xuXHRcdGVsLmFjY29yZGlvbkZvbGQgID0gVEhJUy5pbmRleDtcblx0XHR1c2VCb3JkZXJzICAgICAgICA9IFwiYXV0b1wiID09PSB1c2VCb3JkZXJzID8gKDAgIT09IFRISVMuZWxCb3JkZXIgKyBUSElTLmhlYWRpbmdCb3JkZXIpIDogdXNlQm9yZGVycztcblx0XHRcblx0XHRcblx0XHRcblx0XHRmdW5jdGlvbiBjaGVja0lEcygpe1xuXHRcdFx0dmFyIGhlYWRpbmdTdWZmaXggPSBcIi1oZWFkaW5nXCI7XG5cdFx0XHR2YXIgY29udGVudFN1ZmZpeCA9IFwiLWNvbnRlbnRcIjtcblx0XHRcdHZhciBlbElEICAgICAgICAgICAgPSBlbC5pZDtcblx0XHRcdHZhciBpZDtcblx0XHRcdFxuXHRcdFx0Ly8gTmVpdGhlciBvZiB0aGUgZm9sZCdzIGVsZW1lbnRzIGhhdmUgYW4gSUQgYXR0cmlidXRlXG5cdFx0XHRpZighaGVhZGluZy5pZCAmJiAhY29udGVudC5pZCl7XG5cdFx0XHRcdGlkICAgICAgICAgICAgID0gZWxJRCB8fCB1bmlxdWVJRChcImFcIik7XG5cdFx0XHRcdGhlYWRpbmcuaWQgICAgID0gaWQgKyBoZWFkaW5nU3VmZml4O1xuXHRcdFx0XHRjb250ZW50LmlkICAgICA9IGlkICsgY29udGVudFN1ZmZpeDtcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0Ly8gRWl0aGVyIHRoZSBoZWFkaW5nIG9yIGVsZW1lbnQgbGFjayBhbiBJRFxuXHRcdFx0ZWxzZSBpZighY29udGVudC5pZCkgY29udGVudC5pZCAgID0gKGVsSUQgfHwgaGVhZGluZy5pZCkgKyBjb250ZW50U3VmZml4O1xuXHRcdFx0ZWxzZSBpZighaGVhZGluZy5pZCkgaGVhZGluZy5pZCAgID0gKGVsSUQgfHwgY29udGVudC5pZCkgKyBoZWFkaW5nU3VmZml4O1xuXHRcdFx0XG5cdFx0XHQvLyBGaW5hbGx5LCBkb3VibGUtY2hlY2sgZWFjaCBlbGVtZW50J3MgSUQgaXMgcmVhbGx5IHVuaXF1ZVxuXHRcdFx0dmFyICQgPSBmdW5jdGlvbihzKXtyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIiNcIitzKX07XG5cdFx0XHR3aGlsZSgkKGNvbnRlbnQuaWQpLmxlbmd0aCA+IDEgfHwgJChoZWFkaW5nLmlkKS5sZW5ndGggPiAxKXtcblx0XHRcdFx0aWQgICAgICAgICA9IHVuaXF1ZUlEKFwiYVwiKTtcblx0XHRcdFx0Y29udGVudC5pZCA9IGlkICsgY29udGVudFN1ZmZpeDtcblx0XHRcdFx0aGVhZGluZy5pZCA9IGlkICsgaGVhZGluZ1N1ZmZpeDtcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0Ly8gVXBkYXRlIEFSSUEgYXR0cmlidXRlc1xuXHRcdFx0aGVhZGluZy5zZXRBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIsICAgIGNvbnRlbnQuaWQpO1xuXHRcdFx0Y29udGVudC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIiwgIGhlYWRpbmcuaWQpO1xuXHRcdH1cblx0XHRcblx0XHRcblx0XHRcblx0XHQvLyBLZXlib2FyZCBuYXZpZ2F0aW9uXG5cdFx0aWYoa2V5c0VuYWJsZWQpe1xuXHRcdFx0aGVhZGluZy50YWJJbmRleCA9IDA7XG5cdFx0XHRoZWFkaW5nLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIG9uS2V5RG93biA9IGZ1bmN0aW9uKGUpe1xuXHRcdFx0XHR2YXIga2V5ID0gZS5rZXlDb2RlO1xuXHRcdFx0XHR2YXIgZm9sZDtcblx0XHRcdFx0XG5cdFx0XHRcdHN3aXRjaChrZXkpe1xuXG5cdFx0XHRcdFx0Ly8gU3BhY2ViYXI6IFRvZ2dsZVxuXHRcdFx0XHRcdGNhc2UgMzI6XG5cdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7IC8vIEZhbGwtdGhyb3VnaFxuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdC8vIEVudGVyOiBUb2dnbGVcblx0XHRcdFx0XHRjYXNlIDEzOlxuXHRcdFx0XHRcdFx0VEhJUy5vcGVuID0gIVRISVMub3Blbjtcblx0XHRcdFx0XHRcdGlmKFwiQVwiID09PSBlLnRhcmdldC50YWdOYW1lKVxuXHRcdFx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcblx0XHRcdFx0XHRcblx0XHRcdFx0XHQvLyBFc2NhcGU6IENsZWFyIGZvY3VzXG5cdFx0XHRcdFx0Y2FzZSAyNzpcblx0XHRcdFx0XHRcdGUudGFyZ2V0LmJsdXIoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdC8vIFVwIGFycm93OiBQcmV2aW91cyBzZWN0aW9uXG5cdFx0XHRcdFx0Y2FzZSAzODp7XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdC8vIElzIHRoZXJlIGEgcHJldmlvdXMgc2libGluZyB0byBuYXZpZ2F0ZSB1cCB0bz9cblx0XHRcdFx0XHRcdGlmKGZvbGQgPSBUSElTLnByZXZpb3VzRm9sZCl7XG5cdFx0XHRcdFx0XHRcdHZhciBjaGlsZHJlbiA9IGZvbGQuY2hpbGRBY2NvcmRpb25zO1xuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0Ly8gSXMgaXQgb3BlbiwgYW5kIGRvZXMgaXQgaGF2ZSBuZXN0ZWQgYWNjb3JkaW9ucz9cblx0XHRcdFx0XHRcdFx0aWYoZm9sZC5vcGVuICYmIGNoaWxkcmVuKXtcblx0XHRcdFx0XHRcdFx0XHR2YXIgbGFzdEFjYztcblx0XHRcdFx0XHRcdFx0XHR2YXIgbGFzdEZvbGQ7XG5cdFx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0Ly8gTG9jYXRlIHRoZSBkZWVwZXN0L25lYXJlc3QgYWNjb3JkaW9uIHRoYXQncyBjdXJyZW50bHkgZXhwb3NlZFxuXHRcdFx0XHRcdFx0XHRcdHdoaWxlKGNoaWxkcmVuKXtcblx0XHRcdFx0XHRcdFx0XHRcdGxhc3RBY2MgID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG5cdFx0XHRcdFx0XHRcdFx0XHRsYXN0Rm9sZCA9IGxhc3RBY2MuZm9sZHNbbGFzdEFjYy5mb2xkcy5sZW5ndGggLSAxXTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmKCFsYXN0Rm9sZC5vcGVuKSBicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdGNoaWxkcmVuID0gbGFzdEZvbGQuY2hpbGRBY2NvcmRpb25zO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRsYXN0Rm9sZC5oZWFkaW5nLmZvY3VzKCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdC8vIE5vcGVcblx0XHRcdFx0XHRcdFx0ZWxzZSBmb2xkLmhlYWRpbmcuZm9jdXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0Ly8gSXMgdGhlcmUgYSBoaWdoZXIgbGV2ZWwgd2UgY2FuIGp1bXAgYmFjayB1cCB0bz9cblx0XHRcdFx0XHRcdGVsc2UgaWYoYWNjb3JkaW9uLnBhcmVudClcblx0XHRcdFx0XHRcdFx0YWNjb3JkaW9uLnBhcmVudEZvbGQuaGVhZGluZy5mb2N1cygpO1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHQvLyBUaGVyZSdzIG5vdGhpbmcgdG8gbW92ZSBiYWNrIHRvLCBzbyBqdXN0IGxldCB0aGUgYnJvd3NlciBydW4gaXRzIHVzdWFsIGJlaGF2aW91clxuXHRcdFx0XHRcdFx0ZWxzZSByZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcblx0XHRcdFx0XHRcblx0XHRcdFx0XHRcblx0XHRcdFx0XHQvLyBEb3duIGFycm93OiBOZXh0IHNlY3Rpb25cblx0XHRcdFx0XHRjYXNlIDQwOntcblx0XHRcdFx0XHRcdHZhciBjaGlsZHJlbiA9IFRISVMuY2hpbGRBY2NvcmRpb25zO1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHQvLyBJcyB0aGVyZSBhIG5lc3RlZCBhY2NvcmRpb24gdG8ganVtcCBpbnRvP1xuXHRcdFx0XHRcdFx0aWYoVEhJUy5vcGVuICYmIGNoaWxkcmVuKVxuXHRcdFx0XHRcdFx0XHRjaGlsZHJlblswXS5mb2xkc1swXS5oZWFkaW5nLmZvY3VzKCk7XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdC8vIE5vLCB0aGVyZSBpc24ndC4gSXMgdGhlcmUgYW5vdGhlciBzaWJsaW5nIHRvIG1vdmUgZG93biB0bz9cblx0XHRcdFx0XHRcdGVsc2UgaWYoZm9sZCA9IFRISVMubmV4dEZvbGQpXG5cdFx0XHRcdFx0XHRcdGZvbGQuaGVhZGluZy5mb2N1cygpO1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHQvLyBJcyB0aGVyZSBhIGNvbnRhaW5pbmcgYWNjb3JkaW9uIHdlIGNhbiBuYXZpZ2F0ZSBiYWNrIHVwIHRvP1xuXHRcdFx0XHRcdFx0ZWxzZSBpZihUSElTLmFjY29yZGlvbi5wYXJlbnQpe1xuXHRcdFx0XHRcdFx0XHR2YXIgcGFyZW50ID0gVEhJUztcblx0XHRcdFx0XHRcdFx0d2hpbGUocGFyZW50ID0gcGFyZW50LmFjY29yZGlvbi5wYXJlbnRGb2xkKVxuXHRcdFx0XHRcdFx0XHRcdGlmKGZvbGQgPSBwYXJlbnQubmV4dEZvbGQpe1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm9sZC5oZWFkaW5nLmZvY3VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0XHQvLyBOb3doZXJlIGxlZnQgdG8gZ28uLi5cblx0XHRcdFx0XHRcdFx0aWYoIXBhcmVudCkgcmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdC8vIE5haC4gSnVzdCBzY3JvbGwgdGhlIHdpbmRvdyBub3JtYWxseSwgYXMgcGVyIGJyb3dzZXIgZGVmYXVsdFxuXHRcdFx0XHRcdFx0ZWxzZSByZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcblx0XHRcdFx0XHRcblx0XHRcdFx0XHQvLyBMZWZ0IGFycm93XG5cdFx0XHRcdFx0Y2FzZSAzNzp7XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdC8vIENsb3NlIGFuIG9wZW5lZCBzZWN0aW9uXG5cdFx0XHRcdFx0XHRpZihUSElTLm9wZW4pIFRISVMub3BlbiA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHQvLyBTd2l0Y2ggZm9jdXMgYmFjayB0byBwYXJlbnRcblx0XHRcdFx0XHRcdGVsc2UgaWYoYWNjb3JkaW9uLnBhcmVudClcblx0XHRcdFx0XHRcdFx0YWNjb3JkaW9uLnBhcmVudEZvbGQuaGVhZGluZy5mb2N1cygpO1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0Ly8gUmlnaHQgYXJyb3dcblx0XHRcdFx0XHRjYXNlIDM5Ontcblx0XHRcdFx0XHRcdHZhciBjaGlsZHJlbiA9IFRISVMuY2hpbGRBY2NvcmRpb25zO1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHQvLyBPcGVuIGEgY2xvc2VkIHNlY3Rpb25cblx0XHRcdFx0XHRcdGlmKCFUSElTLm9wZW4pIFRISVMub3BlbiA9IHRydWU7XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdC8vIFN3aXRjaCBmb2N1cyB0byBhIG5lc3RlZCBhY2NvcmRpb25cblx0XHRcdFx0XHRcdGVsc2UgaWYoY2hpbGRyZW4pXG5cdFx0XHRcdFx0XHRcdGNoaWxkcmVuWzBdLmZvbGRzWzBdLmhlYWRpbmcuZm9jdXMoKTtcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0XG5cdFx0XG5cdFx0Ly8gTGlzdGVuZXIgdG8gcmVjb3JkIHRoZSB2aWV3cG9ydCdzIHNjcm9sbCBvZmZzZXRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSB0b3VjaFxuXHRcdHRvdWNoRW5hYmxlZCAmJiBoZWFkaW5nLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIG9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uKGUpe1xuXHRcdFx0c2Nyb2xsWCA9IHdpbmRvdy5wYWdlWE9mZnNldDtcblx0XHRcdHNjcm9sbFkgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cdFx0fSwge3Bhc3NpdmU6IHRydWV9KTtcblx0XHRcblx0XHRcblx0XHRoZWFkaW5nLmFkZEV2ZW50TGlzdGVuZXIocHJlc3NFdmVudCwgb25QcmVzcyA9IGZ1bmN0aW9uKGUpe1xuXHRcdFx0XG5cdFx0XHQvLyBQcmVzc2VkIG9uIHNvbWV0aGluZyBpbnNpZGUgdGhlIGhlYWRlclxuXHRcdFx0aWYoZS50YXJnZXQgIT09IGhlYWRpbmcgJiYgaGVhZGluZy5jb250YWlucyhlLnRhcmdldCkpe1xuXHRcdFx0XHRcblx0XHRcdFx0Ly8gQ2FuY2VsIGZvbGQtdG9nZ2xlIGlmIHVzZXIgY2xpY2tlZCBvbiBhbiBhbmNob3ItbGlua1xuXHRcdFx0XHRpZihcIkFcIiA9PT0gZS50YXJnZXQudGFnTmFtZSAmJiBlLnRhcmdldC5ocmVmKVxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRpZihlLnR5cGUgIT09IFwidG91Y2hlbmRcIiB8fCAoZS5jYW5jZWxhYmxlICYmIHdpbmRvdy5wYWdlWE9mZnNldCA9PT0gc2Nyb2xsWCAmJiB3aW5kb3cucGFnZVlPZmZzZXQgPT09IHNjcm9sbFkpKXtcblx0XHRcdFx0VEhJUy5vcGVuID0gIVRISVMub3Blbjtcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0pO1xuXHRcdFxuXHRcdFxuXHRcdFxuXHRcdFxuXHRcdC8qKlxuXHRcdCAqIEFkanVzdCBhIGZvbGQncyBjb250YWluZXIgdG8gZml0IGl0cyBjb250ZW50LlxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGZpdCgpe1xuXHRcdFx0dmFyIGhlaWdodCA9IFRISVMuaGVhZGluZ0hlaWdodDtcblx0XHRcdGlmKFRISVMub3BlbikgICBoZWlnaHQgKz0gY29udGVudC5zY3JvbGxIZWlnaHQ7XG5cdFx0XHRpZih1c2VCb3JkZXJzKSAgaGVpZ2h0ICs9IFRISVMuZWxCb3JkZXI7XG5cdFx0XHRUSElTLmhlaWdodCA9IGhlaWdodDtcblx0XHR9XG5cdH1cblxuXG5cblxuXG5cblxuXHR2YXIgYWNjb3JkaW9ucyAgICAgICA9IFtdO1xuXHR2YXIgYWN0aXZlQWNjb3JkaW9ucyA9IDA7XG5cdHZhciBsYXN0UmVzaXplUmF0ZTtcblxuXG5cdC8qKlxuXHQgKiBSZXByZXNlbnRzIGEgY29sdW1uIG9mIGNvbGxhcHNpYmxlIGNvbnRlbnQgcmVnaW9ucy5cblx0ICpcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgICAgICAgICAgICAgICAgICAgIC0gQ29udGFpbmVyIHdyYXBwZWQgYXJvdW5kIGVhY2ggaW1tZWRpYXRlIGZvbGRcblx0ICogQHBhcmFtIHtPYmplY3R9ICAgICAgb3B0aW9ucyAgICAgICAgICAgICAgIC0gT3B0aW9uYWwgaGFzaCBvZiBzZXR0aW5nc1xuXHQgKiBAcGFyYW0ge1N0cmluZ30gICAgICBvcHRpb25zLm9wZW5DbGFzcyAgICAgLSBDU1MgY2xhc3MgY29udHJvbGxpbmcgZWFjaCBmb2xkJ3MgXCJvcGVuXCIgc3RhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9ICAgICAgb3B0aW9ucy5jbG9zZUNsYXNzICAgIC0gQ1NTIGNsYXNzIHVzZWQgdG8gbWFyayBhIGZvbGQgYXMgY2xvc2VkXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSAgICAgIG9wdGlvbnMuZWRnZUNsYXNzICAgICAtIENTUyBjbGFzcyB0b2dnbGVkIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGJvdHRvbS1lZGdlIGlzIHZpc2libGVcblx0ICogQHBhcmFtIHtTdHJpbmd9ICAgICAgb3B0aW9ucy5zbmFwQ2xhc3MgICAgIC0gQ1NTIGNsYXNzIGZvciBkaXNhYmxpbmcgdHJhbnNpdGlvbnMgYmV0d2VlbiB3aW5kb3cgcmVzaXplc1xuXHQgKiBAcGFyYW0ge1N0cmluZ30gICAgICBvcHRpb25zLmVuYWJsZWRDbGFzcyAgLSBDU1MgY2xhc3MgbWFya2luZyBhbiBhY2NvcmRpb24gYXMgZW5hYmxlZFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gICAgICBvcHRpb25zLmRpc2FibGVkQ2xhc3MgLSBDU1MgY2xhc3MgbWFya2luZyBhbiBhY2NvcmRpb24gYXMgZGlzYWJsZWRcblx0ICogQHBhcmFtIHtCb29sZWFufSAgICAgb3B0aW9ucy5kaXNhYmxlZCAgICAgIC0gV2hldGhlciB0byBkaXNhYmxlIHRoZSBhY2NvcmRpb24gb24gY3JlYXRpb25cblx0ICogQHBhcmFtIHtCb29sZWFufSAgICAgb3B0aW9ucy5tb2RhbCAgICAgICAgIC0gV2hldGhlciB0byBjbG9zZSB0aGUgY3VycmVudCBmb2xkIHdoZW4gb3BlbmluZyBhbm90aGVyXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gICAgIG9wdGlvbnMubm9BcmlhICAgICAgICAtIERpc2FibGUgdGhlIGFkZGl0aW9uIGFuZCBtYW5hZ2VtZW50IG9mIEFSSUEgYXR0cmlidXRlc1xuXHQgKiBAcGFyYW0ge0Jvb2xlYW59ICAgICBvcHRpb25zLm5vS2V5cyAgICAgICAgLSBEaXNhYmxlIGtleWJvYXJkIG5hdmlnYXRpb25cblx0ICogQHBhcmFtIHtCb29sZWFufSAgICAgb3B0aW9ucy5ub1RyYW5zZm9ybXMgIC0gRGlzYWJsZSBDU1MgdHJhbnNmb3JtczsgcG9zaXRpb25pbmcgd2lsbCBiZSB1c2VkIGluc3RlYWRcblx0ICogQHBhcmFtIHtOdW1iZXJ9ICAgICAgb3B0aW9ucy5oZWlnaHRPZmZzZXQgIC0gRGlzdGFuY2UgdG8gb2Zmc2V0IGVhY2ggZm9sZCBieVxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59ICAgICBvcHRpb25zLnVzZUJvcmRlcnMgICAgLSBDb25zaWRlciBib3JkZXJzIHdoZW4gY2FsY3VsYXRpbmcgZm9sZCBoZWlnaHRzXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259ICAgIG9wdGlvbnMub25Ub2dnbGUgICAgICAtIENhbGxiYWNrIGV4ZWN1dGVkIHdoZW4gb3BlbmluZyBvciBjbG9zaW5nIGEgZm9sZFxuXHQgKiBAY29uc3RydWN0b3Jcblx0ICovXG5cdHZhciBBY2NvcmRpb24gPSBmdW5jdGlvbihlbCwgb3B0aW9ucyl7XG5cdFx0dmFyIFRISVMgICAgICAgICAgPSB0aGlzO1xuXHRcdHZhciBlbENsYXNzZXMgICAgID0gZWwuY2xhc3NMaXN0O1xuXHRcdHZhciBvcHRpb25zICAgICAgID0gb3B0aW9ucyB8fCB7fTtcblx0XHR2YXIgZWRnZUNsYXNzICAgICA9ICh1bmRlZmluZWQgPT09IG9wdGlvbnMuZWRnZUNsYXNzICAgID8gXCJlZGdlLXZpc2libGVcIiA6IG9wdGlvbnMuZWRnZUNsYXNzKTtcblx0XHR2YXIgc25hcENsYXNzICAgICA9ICh1bmRlZmluZWQgPT09IG9wdGlvbnMuc25hcENsYXNzICAgID8gXCJzbmFwXCIgICAgICAgICA6IG9wdGlvbnMuc25hcENsYXNzKTtcblx0XHR2YXIgZW5hYmxlZENsYXNzICA9ICh1bmRlZmluZWQgPT09IG9wdGlvbnMuZW5hYmxlZENsYXNzID8gXCJhY2NvcmRpb25cIiAgICA6IG9wdGlvbnMuZW5hYmxlZENsYXNzKTtcblx0XHR2YXIgZGlzYWJsZWRDbGFzcyA9IG9wdGlvbnMuZGlzYWJsZWRDbGFzcztcblx0XHR2YXIgX2hlaWdodCwgX2Rpc2FibGVkLCBfcGFyZW50LCBfcGFyZW50Rm9sZCwgX21vZGFsO1xuXG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyhUSElTLCB7XG5cdFx0XHR1cGRhdGU6ICAgICB7dmFsdWU6IHVwZGF0ZX0sXG5cdFx0XHR1cGRhdGVGb2xkOiB7dmFsdWU6IHVwZGF0ZUZvbGR9LFxuXHRcdFx0cmVmcmVzaDogICAge3ZhbHVlOiByZWZyZXNofSxcblx0XHRcdFxuXHRcdFx0Ly8gV2hldGhlciB0aGUgYWNjb3JkaW9uJ3MgYmVlbiBkZWFjdGl2YXRlZFxuXHRcdFx0ZGlzYWJsZWQ6IHtcblx0XHRcdFx0Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gX2Rpc2FibGVkOyB9LFxuXHRcdFx0XHRzZXQ6IGZ1bmN0aW9uKGlucHV0KXtcblx0XHRcdFx0XHRpZigoaW5wdXQgPSAhIWlucHV0KSAhPT0gX2Rpc2FibGVkKXtcblx0XHRcdFx0XHRcdHZhciBzdHlsZSAgID0gZWwuc3R5bGU7XG5cdFx0XHRcdFx0XHR2YXIgZm9sZHMgICA9IFRISVMuZm9sZHM7XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdGVuYWJsZWRDbGFzcyAgJiYgc2V0VG9rZW4oZWxDbGFzc2VzLCBlbmFibGVkQ2xhc3MsICAhaW5wdXQpO1xuXHRcdFx0XHRcdFx0ZGlzYWJsZWRDbGFzcyAmJiBzZXRUb2tlbihlbENsYXNzZXMsIGRpc2FibGVkQ2xhc3MsICBpbnB1dCk7XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0Ly8gRGVhY3RpdmF0aW5nXG5cdFx0XHRcdFx0XHRpZihfZGlzYWJsZWQgPSBpbnB1dCl7XG5cdFx0XHRcdFx0XHRcdHN0eWxlLmhlaWdodCA9IG51bGw7XG5cdFx0XHRcdFx0XHRcdHNuYXBDbGFzcyAmJiBlbENsYXNzZXMucmVtb3ZlKHNuYXBDbGFzcyk7XG5cdFx0XHRcdFx0XHRcdGlmKGVkZ2VDbGFzcyl7XG5cdFx0XHRcdFx0XHRcdFx0ZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmFuc2l0aW9uRW5kLCBUSElTLm9uVHJhbnNpdGlvbkVuZCk7XG5cdFx0XHRcdFx0XHRcdFx0ZWxDbGFzc2VzLnJlbW92ZShlZGdlQ2xhc3MpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0XHRmb3IodmFyIGkgPSAwLCBsID0gZm9sZHMubGVuZ3RoOyBpIDwgbDsgKytpKVxuXHRcdFx0XHRcdFx0XHRcdGZvbGRzW2ldLmRpc2FibGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdFRISVMubm9BcmlhIHx8IGVsLnJlbW92ZUF0dHJpYnV0ZShcInJvbGVcIik7XG5cdFx0XHRcdFx0XHRcdC0tYWN0aXZlQWNjb3JkaW9ucztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHQvLyBSZWFjdGl2YXRpbmdcblx0XHRcdFx0XHRcdGVsc2V7XG5cdFx0XHRcdFx0XHRcdGZvcih2YXIgaSA9IDAsIGwgPSBmb2xkcy5sZW5ndGg7IGkgPCBsOyArK2kpXG5cdFx0XHRcdFx0XHRcdFx0Zm9sZHNbaV0uZGlzYWJsZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdFRISVMubm9BcmlhIHx8IGVsLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJ0YWJsaXN0XCIpO1xuXHRcdFx0XHRcdFx0XHQrK2FjdGl2ZUFjY29yZGlvbnM7XG5cdFx0XHRcdFx0XHRcdHVwZGF0ZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XG5cblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUncmUgbm8gbW9yZSBhY3RpdmUgYWNjb3JkaW9ucywgZGlzYWJsZSB0aGUgb25SZXNpemUgaGFuZGxlclxuXHRcdFx0XHRcdFx0aWYoYWN0aXZlQWNjb3JkaW9ucyA8PSAwKXtcblx0XHRcdFx0XHRcdFx0YWN0aXZlQWNjb3JkaW9ucyA9IDA7XG5cdFx0XHRcdFx0XHRcdEFjY29yZGlvbi5zZXRSZXNpemVSYXRlKGZhbHNlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCByZWFjdGl2YXRlIHRoZSBvblJlc2l6ZSBoYW5kbGVyLCBhc3N1bWluZyBpdCB3YXMgcHJldmlvdXNseSBhY3RpdmVcblx0XHRcdFx0XHRcdGVsc2UgaWYobGFzdFJlc2l6ZVJhdGUpXG5cdFx0XHRcdFx0XHRcdEFjY29yZGlvbi5zZXRSZXNpemVSYXRlKGxhc3RSZXNpemVSYXRlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRcblx0XHRcdC8vIEdldCBvciBzZXQgdGhlIGFjY29yZGlvbiBlbmNsb3NpbmcgdGhpcyBvbmVcblx0XHRcdHBhcmVudDoge1xuXHRcdFx0XHRzZXQ6IGZ1bmN0aW9uKGlucHV0KXsgX3BhcmVudCA9IGlucHV0OyB9LFxuXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uKCl7XG5cdFx0XHRcdFx0dmFyIHJlc3VsdCA9IF9wYXJlbnQ7XG5cdFx0XHRcdFx0aWYoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0Ly8gU2VhcmNoIGZvciB0aGUgZmlyc3QgYW5jZXN0b3IgdGhhdCAqaXNuJ3QqIGRpc2FibGVkXG5cdFx0XHRcdFx0d2hpbGUocmVzdWx0KXtcblx0XHRcdFx0XHRcdGlmKCFyZXN1bHQuZGlzYWJsZWQpIHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdFx0XHRyZXN1bHQgPSByZXN1bHQucGFyZW50O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdFxuXHRcdFx0Ly8gR2V0IG9yIHNldCB0aGUgZm9sZCBvZiB0aGUgYWNjb3JkaW9uIGVuY2xvc2luZyB0aGlzIG9uZVxuXHRcdFx0cGFyZW50Rm9sZDoge1xuXHRcdFx0XHRzZXQ6IGZ1bmN0aW9uKGlucHV0KXsgX3BhcmVudEZvbGQgPSBpbnB1dDsgfSxcblx0XHRcdFx0Z2V0OiBmdW5jdGlvbigpe1xuXHRcdFx0XHRcdHZhciBmb2xkID0gX3BhcmVudEZvbGQ7XG5cdFx0XHRcdFx0aWYoIWZvbGQpIHJldHVybiBudWxsO1xuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdHZhciBhY2NvcmRpb24gPSBmb2xkLmFjY29yZGlvbjtcblx0XHRcdFx0XHRcblx0XHRcdFx0XHQvLyBTZWFyY2ggZm9yIHRoZSBmaXJzdCBhbmNlc3RvciB0aGF0ICppc24ndCogZGlzYWJsZWRcblx0XHRcdFx0XHR3aGlsZShmb2xkICYmIGFjY29yZGlvbil7XG5cdFx0XHRcdFx0XHRpZighYWNjb3JkaW9uLmRpc2FibGVkKSByZXR1cm4gZm9sZDtcblx0XHRcdFx0XHRcdGlmKGFjY29yZGlvbiA9IGFjY29yZGlvbi5wYXJlbnQpXG5cdFx0XHRcdFx0XHRcdGZvbGQgPSBhY2NvcmRpb24ucGFyZW50Rm9sZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRcblx0XHRcdC8vIEhlaWdodCBvZiB0aGUgYWNjb3JkaW9uJ3MgY29udGFpbmVyIGVsZW1lbnRcblx0XHRcdGhlaWdodDoge1xuXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBfaGVpZ2h0OyB9LFxuXHRcdFx0XHRzZXQ6IGZ1bmN0aW9uKGlucHV0KXtcblx0XHRcdFx0XHRpZihpbnB1dCAmJiAoaW5wdXQgPSAraW5wdXQpICE9PSBfaGVpZ2h0KXtcblx0XHRcdFx0XHRcdGVsLnN0eWxlLmhlaWdodCA9IGlucHV0ICsgXCJweFwiO1xuXHRcdFx0XHRcdFx0X2hlaWdodCAgICAgICAgID0gaW5wdXQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0XG5cdFx0XHQvLyBXaGV0aGVyIG9uZSBvZiB0aGUgQWNjb3JkaW9uJ3MgZm9sZHMgaGFzIGJlZW4gcmVzaXplZCBpbmNvcnJlY3RseVxuXHRcdFx0d3JvbmdTaXplOiB7XG5cdFx0XHRcdGdldDogZnVuY3Rpb24oKXtcblx0XHRcdFx0XHR2YXIgYSA9IHRoaXMuZm9sZHM7XG5cdFx0XHRcdFx0dmFyIGwgPSBhLmxlbmd0aDtcblx0XHRcdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRcdFx0Zm9yKDsgaSA8IGw7ICsraSkgaWYoYVtpXS53cm9uZ1NpemUpIHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdGlmKGEgPSB0aGlzLmNoaWxkQWNjb3JkaW9ucylcblx0XHRcdFx0XHRmb3IoOyBpIDwgbDsgKytpKSBpZihhW2ldLndyb25nU2l6ZSkgcmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0XG5cdFx0XHQvLyBUb3AtbGV2ZWwgYW5jZXN0b3IgdGhpcyBhY2NvcmRpb24ncyBuZXN0ZWQgaW5zaWRlXG5cdFx0XHRyb290OiB7XG5cdFx0XHRcdGdldDogZnVuY3Rpb24oKXtcblx0XHRcdFx0XHR2YXIgcmVzdWx0ID0gdGhpcztcblx0XHRcdFx0XHR3aGlsZShyZXN1bHQpe1xuXHRcdFx0XHRcdFx0aWYoIXJlc3VsdC5wYXJlbnQpIHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdFx0XHRyZXN1bHQgPSByZXN1bHQucGFyZW50O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0XG5cdFx0Ly8gQXNzaWduIG9wdGlvbnMgYXMgcHJvcGVydGllc1xuXHRcdFRISVMub3BlbkNsYXNzICAgID0gb3B0aW9ucy5vcGVuQ2xhc3MgIHx8IFwib3BlblwiO1xuXHRcdFRISVMuY2xvc2VDbGFzcyAgID0gb3B0aW9ucy5jbG9zZUNsYXNzIHx8IFwiY2xvc2VkXCI7XG5cdFx0VEhJUy5tb2RhbCAgICAgICAgPSAhIW9wdGlvbnMubW9kYWw7XG5cdFx0VEhJUy5ub0FyaWEgICAgICAgPSAhIW9wdGlvbnMubm9BcmlhO1xuXHRcdFRISVMubm9LZXlzICAgICAgID0gISFvcHRpb25zLm5vS2V5cztcblx0XHRUSElTLm5vVHJhbnNmb3JtcyA9ICEhb3B0aW9ucy5ub1RyYW5zZm9ybXM7XG5cdFx0VEhJUy5pbmRleCAgICAgICAgPSBhY2NvcmRpb25zLnB1c2goVEhJUykgLSAxO1xuXHRcdFRISVMuaGVpZ2h0T2Zmc2V0ID0gK29wdGlvbnMuaGVpZ2h0T2Zmc2V0IHx8IDA7XG5cdFx0VEhJUy51c2VCb3JkZXJzICAgPSB1bmRlZmluZWQgPT09IG9wdGlvbnMudXNlQm9yZGVycyA/IFwiYXV0b1wiIDogb3B0aW9ucy51c2VCb3JkZXJzO1xuXHRcdFRISVMub25Ub2dnbGUgICAgID0gb3B0aW9ucy5vblRvZ2dsZTtcblx0XHRcblx0XHRcblx0XHQvLyBDcmVhdGUgYSBmb2xkIGZvciBlYWNoIGltbWVkaWF0ZSBkZXNjZW5kYW50IG9mIHRoZSBBY2NvcmRpb24ncyBjb250YWluZXJcblx0XHR2YXIgZm9sZHMgPSBbXTtcblx0XHRlYWNoLmNhbGwoZWwuY2hpbGRyZW4sIGZ1bmN0aW9uKGkpe1xuXHRcdFx0dmFyIGZvbGQgPSBuZXcgRm9sZChUSElTLCBpKTtcblx0XHRcdGZvbGRzLnB1c2goZm9sZCk7XG5cdFx0XHRcblx0XHRcdC8vIENvbm5lY3QgdGhlIGZvbGQgdG8gaXRzIHByZXZpb3VzIHNpYmxpbmcsIGlmIGl0J3Mgbm90IHRoZSBmaXJzdCB0byBiZSBhZGRlZFxuXHRcdFx0dmFyIHByZXYgPSBmb2xkc1tmb2xkcy5sZW5ndGggLSAyXTtcblx0XHRcdGlmKHByZXYpe1xuXHRcdFx0XHRwcmV2Lm5leHRGb2xkICAgICA9IGZvbGQ7XG5cdFx0XHRcdGZvbGQucHJldmlvdXNGb2xkID0gcHJldjtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRcblx0XHRcblx0XHRlbC5hY2NvcmRpb24gICAgPSBUSElTLmluZGV4O1xuXHRcdFRISVMubm9BcmlhIHx8IGVsLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJ0YWJsaXN0XCIpO1xuXHRcdFRISVMuZWwgICAgICAgICA9IGVsO1xuXHRcdFRISVMuZm9sZHMgICAgICA9IGZvbGRzO1xuXHRcdFxuXHRcdC8vIEFkZCAuZW5hYmxlZENsYXNzIGVhcmx5IC0gaXQgbWlnaHQgYWZmZWN0IHRoZSBoZWlnaHRzIG9mIGVhY2ggZm9sZFxuXHRcdGlmKCFvcHRpb25zLmRpc2FibGVkICYmIGVuYWJsZWRDbGFzcylcblx0XHRcdGVsQ2xhc3Nlcy5hZGQoZW5hYmxlZENsYXNzKTtcblx0XHRcblx0XHR1cGRhdGUoKTtcblx0XHRcblx0XHRcblx0XHQvLyBGaW5kIG91dCBpZiB0aGlzIGFjY29yZGlvbidzIG5lc3RlZCBpbnNpZGUgYW5vdGhlclxuXHRcdHZhciBuZXh0ID0gZWw7XG5cdFx0d2hpbGUoKG5leHQgPSBuZXh0LnBhcmVudE5vZGUpICYmIDEgPT09IG5leHQubm9kZVR5cGUpe1xuXHRcdFx0dmFyIGZvbGQgPSBBY2NvcmRpb24uZ2V0Rm9sZChuZXh0KTtcblx0XHRcdGlmKGZvbGQpe1xuXHRcdFx0XHR2YXIgYWNjb3JkaW9uICAgPSBmb2xkLmFjY29yZGlvbjtcblx0XHRcdFx0VEhJUy5wYXJlbnQgICAgID0gYWNjb3JkaW9uO1xuXHRcdFx0XHRUSElTLnBhcmVudEZvbGQgPSBmb2xkO1xuXHRcdFx0XHRlZGdlQ2xhc3MgJiYgZWxDbGFzc2VzLnJlbW92ZShlZGdlQ2xhc3MpO1xuXHRcdFx0XHQoYWNjb3JkaW9uLmNoaWxkQWNjb3JkaW9ucyA9IGFjY29yZGlvbi5jaGlsZEFjY29yZGlvbnMgfHwgW10pLnB1c2goVEhJUyk7XG5cdFx0XHRcdChmb2xkLmNoaWxkQWNjb3JkaW9ucyAgICAgID0gZm9sZC5jaGlsZEFjY29yZGlvbnMgICAgICB8fCBbXSkucHVzaChUSElTKTtcblxuXHRcdFx0XHQvLyBBZGp1c3QgdGhlIGhlaWdodCBvZiB0aGUgY29udGFpbmluZyBmb2xkJ3MgZWxlbWVudFxuXHRcdFx0XHRpZihmb2xkLm9wZW4pe1xuXHRcdFx0XHRcdHZhciBzY3JvbGxIZWlnaHQgPSBmb2xkLmVsLnNjcm9sbEhlaWdodDtcblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgICAgID0gKGZvbGQuaGVhZGluZ0hlaWdodCArIGZvbGQuY29udGVudC5zY3JvbGxIZWlnaHQpIC0gc2Nyb2xsSGVpZ2h0IHx8IChzY3JvbGxIZWlnaHQgLSBmb2xkLmVsLmNsaWVudEhlaWdodCk7XG5cdFx0XHRcdFx0YWNjb3JkaW9uLnVwZGF0ZUZvbGQoZm9sZCwgZGlzdGFuY2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRcblx0XHRcblx0XHRlZGdlQ2xhc3MgJiYgZWwuYWRkRXZlbnRMaXN0ZW5lcih0cmFuc2l0aW9uRW5kLCB0aGlzLm9uVHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uKGUpe1xuXHRcdFx0aWYoIVRISVMucGFyZW50ICYmIGUudGFyZ2V0ID09PSBlbCAmJiBcImhlaWdodFwiID09PSBlLnByb3BlcnR5TmFtZSAmJiBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gPiB3aW5kb3cuaW5uZXJIZWlnaHQpXG5cdFx0XHRcdGVsQ2xhc3Nlcy5yZW1vdmUoZWRnZUNsYXNzKTtcblx0XHR9KTtcblx0XHRcblx0XHR0aGlzLmRpc2FibGVkID0gISFvcHRpb25zLmRpc2FibGVkO1xuXHRcdFxuXHRcdFxuXHRcdFxuXHRcdC8qKlxuXHRcdCAqIEludGVybmFsIG1ldGhvZCB0byBjaGVjayBpZiBhbiBhY2NvcmRpb24ncyBib3R0b20tZWRnZSBpcyB2aXNpYmxlIHRvIHRoZSB1c2VyIChvciBhYm91dCB0byBiZSkuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0XG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRmdW5jdGlvbiBlZGdlQ2hlY2sob2Zmc2V0KXtcblx0XHRcdGlmKGVkZ2VDbGFzcyl7XG5cdFx0XHRcdHZhciBib3ggICAgICAgICA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0XHR2YXIgd2luZG93RWRnZSAgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cdFx0XHRcdFxuXHRcdFx0XHQvLyBJZiB0aGUgYm90dG9tLWVkZ2UgaXMgdmlzaWJsZSAob3IgYWJvdXQgdG8gYmUpLCBlbmFibGUgaGVpZ2h0IGFuaW1hdGlvblxuXHRcdFx0XHRpZihib3guYm90dG9tICsgKG9mZnNldCB8fCAwKSA8IHdpbmRvd0VkZ2UpXG5cdFx0XHRcdFx0ZWxDbGFzc2VzLmFkZChlZGdlQ2xhc3MpXG5cdFx0XHRcdFxuXHRcdFx0XHQvLyBJZiB0aGUgYm90dG9tLWVkZ2UgaXNuJ3QgdmlzaWJsZSBhbnl3YXksIGRpc2FibGUgaGVpZ2h0IGFuaW1hdGlvbiBpbW1lZGlhdGVseVxuXHRcdFx0XHRlbHNlIGlmKGJveC5ib3R0b20gPiB3aW5kb3dFZGdlKVxuXHRcdFx0XHRcdGVsQ2xhc3Nlcy5yZW1vdmUoZWRnZUNsYXNzKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0XG5cdFx0XG5cdFx0LyoqXG5cdFx0ICogVXBkYXRlIHRoZSB2ZXJ0aWNhbCBvcmRpbmF0ZSBvZiBlYWNoIHNpYmxpbmcgZm9yIGEgcGFydGljdWxhciBmb2xkLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtGb2xkfSBmb2xkXG5cdFx0ICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCAtIFBpeGVsIGRpc3RhbmNlIHRvIGFkanVzdCBieVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIHVwZGF0ZUZvbGQoZm9sZCwgb2Zmc2V0KXtcblx0XHRcdHZhciBuZXh0ID0gZm9sZDtcblx0XHRcdHZhciBwYXJlbnRGb2xkID0gVEhJUy5wYXJlbnRGb2xkO1xuXHRcdFx0XG5cdFx0XHR3aGlsZShuZXh0ID0gbmV4dC5uZXh0Rm9sZClcblx0XHRcdFx0bmV4dC55ICArPSBvZmZzZXQ7XG5cdFx0XHRwYXJlbnRGb2xkIHx8IGVkZ2VDaGVjayhvZmZzZXQpO1xuXHRcdFx0Zm9sZC5oZWlnaHQgKz0gb2Zmc2V0O1xuXHRcdFx0VEhJUy5oZWlnaHQgKz0gb2Zmc2V0O1xuXHRcdFx0XG5cdFx0XHRwYXJlbnRGb2xkICYmIHBhcmVudEZvbGQub3BlbiAmJiBUSElTLnBhcmVudC51cGRhdGVGb2xkKHBhcmVudEZvbGQsIG9mZnNldCk7XG5cdFx0fVxuXHRcdFxuXHRcdFxuXHRcdC8qKlxuXHRcdCAqIFVwZGF0ZSB0aGUgaGVpZ2h0IG9mIGVhY2ggZm9sZCB0byBmaXQgaXRzIGNvbnRlbnQuXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gdXBkYXRlKCl7XG5cdFx0XHR2YXIgeSAgICAgID0gMDtcblx0XHRcdHZhciBoZWlnaHQgPSAwO1xuXHRcdFx0dmFyIGkgICAgICA9IDA7XG5cdFx0XHR2YXIgbCAgICAgID0gZm9sZHMubGVuZ3RoO1xuXHRcdFx0dmFyIHBhcmVudEZvbGQgPSBUSElTLnBhcmVudEZvbGQ7XG5cdFx0XHR2YXIgZm9sZCwgZGlmZjtcblx0XHRcdFxuXHRcdFx0Zm9yKDsgaSA8IGw7ICsraSl7XG5cdFx0XHRcdGZvbGQgICA9IGZvbGRzW2ldO1xuXHRcdFx0XHRmb2xkLnkgPSB5O1xuXHRcdFx0XHRmb2xkLmZpdCgpO1xuXHRcdFx0XHR5ICAgICAgKz0gZm9sZC5oZWlnaHQ7XG5cdFx0XHRcdGhlaWdodCArPSBmb2xkLmhlaWdodDtcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0ZGlmZiA9IGhlaWdodCAtIF9oZWlnaHQ7XG5cdFx0XHRwYXJlbnRGb2xkXG5cdFx0XHRcdD8gKHBhcmVudEZvbGQub3BlbiAmJiBUSElTLnBhcmVudC51cGRhdGVGb2xkKHBhcmVudEZvbGQsIGRpZmYpKVxuXHRcdFx0XHQ6IGVkZ2VDaGVjayhkaWZmKTtcblx0XHRcdFxuXHRcdFx0VEhJUy5oZWlnaHQgPSBoZWlnaHQ7XG5cdFx0fVxuXHRcdFxuXHRcdFxuXHRcdFxuXHRcdC8qKlxuXHRcdCAqIFJlY2FsY3VsYXRlIHRoZSBib3VuZGFyaWVzIG9mIGFuIEFjY29yZGlvbiBhbmQgaXRzIGRlc2NlbmRhbnRzLlxuXHRcdCAqXG5cdFx0ICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSB3aWR0aCBvZiBhIGNvbnRhaW5lciBjaGFuZ2VzLFxuXHRcdCAqIG9yIGEgZm9sZCdzIGNvbnRlbnRzIGhhdmUgcmVzaXplZCB1bmV4cGVjdGVkbHkgKHN1Y2ggYXMgd2hlbiBpbWFnZXMgbG9hZCkuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0Jvb2xlYW59IGFsbG93U25hcCAtIFNuYXAgZm9sZHMgaW5zdGFudGx5IGludG8gcGxhY2Ugd2l0aG91dCB0cmFuc2l0aW9uaW5nXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gcmVmcmVzaChhbGxvd1NuYXApe1xuXHRcdFx0dmFyIHNuYXAgPSBhbGxvd1NuYXAgPyBzbmFwQ2xhc3MgOiBmYWxzZTtcblx0XHRcdHNuYXAgJiYgZWxDbGFzc2VzLmFkZChzbmFwKTtcblx0XHRcdFxuXHRcdFx0VEhJUy51cGRhdGUoKTtcblx0XHRcdFRISVMuY2hpbGRBY2NvcmRpb25zICYmIFRISVMuY2hpbGRBY2NvcmRpb25zLmZvckVhY2goZnVuY3Rpb24oYSl7XG5cdFx0XHRcdGEucGFyZW50Rm9sZC5vcGVuXG5cdFx0XHRcdFx0PyBhLnJlZnJlc2goYWxsb3dTbmFwKVxuXHRcdFx0XHRcdDogKGEucGFyZW50Rm9sZC5uZWVkc1JlZnJlc2ggPSB0cnVlKTtcblx0XHRcdH0pO1xuXHRcdFx0XG5cdFx0XHRzbmFwICYmIHNldFRpbWVvdXQoZnVuY3Rpb24oZSl7ZWxDbGFzc2VzLnJlbW92ZShzbmFwKX0sIDIwKTtcblx0XHR9XG5cdH1cblxuXHQvLyBJZiBJRThQUCBleGlzdHMsIGl0IG1lYW5zIHRoZSBhdXRob3Igd2FudHMvbmVlZHMgSUU4IHN1cHBvcnQuIFNlZSBhbHNvOiB0aW55dXJsLmNvbS9maXhJRTgtOVxuXHRpZihcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBJRThQUClcblx0XHRBY2NvcmRpb24gPSBJRThQUChBY2NvcmRpb24pLFxuXHRcdEZvbGQgICAgICA9IElFOFBQKEZvbGQpO1xuXG5cblxuXHQvKipcblx0ICogQWx0ZXIgdGhlIHJhdGUgYXQgd2hpY2ggc2NyZWVuLXJlc2l6ZSBldmVudHMgdXBkYXRlIGFjY29yZGlvbiB3aWR0aHMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBkZWxheSAtIFJhdGUgZXhwcmVzc2VkIGluIG1pbGxpc2Vjb25kc1xuXHQgKi9cblx0QWNjb3JkaW9uLnNldFJlc2l6ZVJhdGUgPSBmdW5jdGlvbihkZWxheSl7XG5cdFx0dmFyIGZuID0gZnVuY3Rpb24oZSl7XG5cdFx0XHRmb3IodmFyIGEsIGkgPSAwLCBsID0gYWNjb3JkaW9ucy5sZW5ndGg7IGkgPCBsOyArK2kpe1xuXHRcdFx0XHRhID0gYWNjb3JkaW9uc1tpXTtcblx0XHRcdFx0YS5wYXJlbnQgfHwgYS5kaXNhYmxlZCB8fCBhLnJlZnJlc2godHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRcblx0XHR2YXIgVEhJUyA9IEFjY29yZGlvbjtcblx0XHRUSElTLm9uUmVzaXplICYmIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIFRISVMub25SZXNpemUpO1xuXHRcdFxuXHRcdC8vIE1ha2Ugc3VyZSB3ZSB3ZXJlbid0IHBhc3NlZCBhbiBleHBsaWNpdCB2YWx1ZSBvZiBGQUxTRSwgb3IgYSBuZWdhdGl2ZSB2YWx1ZVxuXHRcdGlmKGZhbHNlICE9PSBkZWxheSAmJiAoZGVsYXkgPSArZGVsYXkgfHwgMCkgPj0gMCl7XG5cdFx0XHRUSElTLm9uUmVzaXplID0gZGVsYXkgPyBkZWJvdW5jZShmbiwgZGVsYXkpIDogZm47XG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCBUSElTLm9uUmVzaXplKTtcblx0XHRcdGlmKGRlbGF5KSBsYXN0UmVzaXplUmF0ZSA9IGRlbGF5O1xuXHRcdH1cblx0fVxuXHRcblx0XG5cdFxuXHQvKipcblx0ICogUmV0dXJuIHRoZSBjbG9zZXN0IChtb3N0IGRlZXBseS1uZXN0ZWQpIGFjY29yZGlvbiBlbmNsb3NpbmcgYW4gZWxlbWVudC5cblx0ICpcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdCAqIEByZXR1cm4ge0FjY29yZGlvbn1cblx0ICovXG5cdEFjY29yZGlvbi5nZXRBY2NvcmRpb24gPSBmdW5jdGlvbihub2RlKXtcblx0XHR3aGlsZShub2RlKXtcblx0XHRcdGlmKFwiYWNjb3JkaW9uXCIgaW4gbm9kZSlcblx0XHRcdFx0cmV0dXJuIGFjY29yZGlvbnNbbm9kZS5hY2NvcmRpb25dO1xuXHRcdFx0XG5cdFx0XHRub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXHRcdFx0aWYoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIG51bGw7XG5cdFx0fVxuXHR9XG5cdFxuXHRcblx0LyoqXG5cdCAqIFJldHVybiB0aGUgY2xvc2VzdCAobW9zdCBkZWVwbHktbmVzdGVkKSBmb2xkIGVuY2xvc2luZyBhbiBlbGVtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0ge05vZGV9IG5vZGVcblx0ICogQHJldHVybiB7Rm9sZH1cblx0ICovXG5cdEFjY29yZGlvbi5nZXRGb2xkID0gZnVuY3Rpb24obm9kZSl7XG5cdFx0d2hpbGUobm9kZSl7XG5cdFx0XHRpZihcImFjY29yZGlvbkZvbGRcIiBpbiBub2RlKVxuXHRcdFx0XHRyZXR1cm4gZm9sZHNbbm9kZS5hY2NvcmRpb25Gb2xkXTtcblx0XHRcdFxuXHRcdFx0bm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcblx0XHRcdGlmKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgIT09IDEpIHJldHVybiBudWxsO1xuXHRcdH1cblx0fVxuXHRcblxuXHRcblx0QWNjb3JkaW9uLnNldFJlc2l6ZVJhdGUoMjUpO1xuXHRcblx0XG5cdC8vIEJyb3dzZXIgZXhwb3J0XG5cdHdpbmRvdy5BY2NvcmRpb24gPSBBY2NvcmRpb247XG5cdFxuXHQvLyBDb21tb25KUy9Ob2RlLmpzXG5cdGlmKFwib2JqZWN0XCIgPT09IHR5cGVvZiBtb2R1bGUgJiYgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG1vZHVsZS5leHBvcnRzKVxuXHRcdG1vZHVsZS5leHBvcnRzLkFjY29yZGlvbiA9IEFjY29yZGlvbjtcblx0XG5cdC8vIEFNRC9VTUQtbGlrZSBzeXN0ZW1zXG5cdHJldHVybiBBY2NvcmRpb247XG59KCkpO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiLyohXG4gICogQm9vdHN0cmFwIHY1LjIuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDIyIFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4hZnVuY3Rpb24odCxlKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShlKToodD1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOnR8fHNlbGYpLmJvb3RzdHJhcD1lKCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7Y29uc3QgdD1cInRyYW5zaXRpb25lbmRcIixlPXQ9PntsZXQgZT10LmdldEF0dHJpYnV0ZShcImRhdGEtYnMtdGFyZ2V0XCIpO2lmKCFlfHxcIiNcIj09PWUpe2xldCBpPXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtpZighaXx8IWkuaW5jbHVkZXMoXCIjXCIpJiYhaS5zdGFydHNXaXRoKFwiLlwiKSlyZXR1cm4gbnVsbDtpLmluY2x1ZGVzKFwiI1wiKSYmIWkuc3RhcnRzV2l0aChcIiNcIikmJihpPWAjJHtpLnNwbGl0KFwiI1wiKVsxXX1gKSxlPWkmJlwiI1wiIT09aT9pLnRyaW0oKTpudWxsfXJldHVybiBlfSxpPXQ9Pntjb25zdCBpPWUodCk7cmV0dXJuIGkmJmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaSk/aTpudWxsfSxuPXQ9Pntjb25zdCBpPWUodCk7cmV0dXJuIGk/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpKTpudWxsfSxzPWU9PntlLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KHQpKX0sbz10PT4hKCF0fHxcIm9iamVjdFwiIT10eXBlb2YgdCkmJih2b2lkIDAhPT10LmpxdWVyeSYmKHQ9dFswXSksdm9pZCAwIT09dC5ub2RlVHlwZSkscj10PT5vKHQpP3QuanF1ZXJ5P3RbMF06dDpcInN0cmluZ1wiPT10eXBlb2YgdCYmdC5sZW5ndGg+MD9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpOm51bGwsYT10PT57aWYoIW8odCl8fDA9PT10LmdldENsaWVudFJlY3RzKCkubGVuZ3RoKXJldHVybiExO2NvbnN0IGU9XCJ2aXNpYmxlXCI9PT1nZXRDb21wdXRlZFN0eWxlKHQpLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmlsaXR5XCIpLGk9dC5jbG9zZXN0KFwiZGV0YWlsczpub3QoW29wZW5dKVwiKTtpZighaSlyZXR1cm4gZTtpZihpIT09dCl7Y29uc3QgZT10LmNsb3Nlc3QoXCJzdW1tYXJ5XCIpO2lmKGUmJmUucGFyZW50Tm9kZSE9PWkpcmV0dXJuITE7aWYobnVsbD09PWUpcmV0dXJuITF9cmV0dXJuIGV9LGw9dD0+IXR8fHQubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERXx8ISF0LmNsYXNzTGlzdC5jb250YWlucyhcImRpc2FibGVkXCIpfHwodm9pZCAwIT09dC5kaXNhYmxlZD90LmRpc2FibGVkOnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikmJlwiZmFsc2VcIiE9PXQuZ2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIikpLGM9dD0+e2lmKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KXJldHVybiBudWxsO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHQuZ2V0Um9vdE5vZGUpe2NvbnN0IGU9dC5nZXRSb290Tm9kZSgpO3JldHVybiBlIGluc3RhbmNlb2YgU2hhZG93Um9vdD9lOm51bGx9cmV0dXJuIHQgaW5zdGFuY2VvZiBTaGFkb3dSb290P3Q6dC5wYXJlbnROb2RlP2ModC5wYXJlbnROb2RlKTpudWxsfSxoPSgpPT57fSxkPXQ9Pnt0Lm9mZnNldEhlaWdodH0sdT0oKT0+d2luZG93LmpRdWVyeSYmIWRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKFwiZGF0YS1icy1uby1qcXVlcnlcIik/d2luZG93LmpRdWVyeTpudWxsLGY9W10scD0oKT0+XCJydGxcIj09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kaXIsZz10PT57dmFyIGU7ZT0oKT0+e2NvbnN0IGU9dSgpO2lmKGUpe2NvbnN0IGk9dC5OQU1FLG49ZS5mbltpXTtlLmZuW2ldPXQualF1ZXJ5SW50ZXJmYWNlLGUuZm5baV0uQ29uc3RydWN0b3I9dCxlLmZuW2ldLm5vQ29uZmxpY3Q9KCk9PihlLmZuW2ldPW4sdC5qUXVlcnlJbnRlcmZhY2UpfX0sXCJsb2FkaW5nXCI9PT1kb2N1bWVudC5yZWFkeVN0YXRlPyhmLmxlbmd0aHx8ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwoKCk9Pntmb3IoY29uc3QgdCBvZiBmKXQoKX0pKSxmLnB1c2goZSkpOmUoKX0sbT10PT57XCJmdW5jdGlvblwiPT10eXBlb2YgdCYmdCgpfSxfPShlLGksbj0hMCk9PntpZighbilyZXR1cm4gdm9pZCBtKGUpO2NvbnN0IG89KHQ9PntpZighdClyZXR1cm4gMDtsZXR7dHJhbnNpdGlvbkR1cmF0aW9uOmUsdHJhbnNpdGlvbkRlbGF5Oml9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpO2NvbnN0IG49TnVtYmVyLnBhcnNlRmxvYXQoZSkscz1OdW1iZXIucGFyc2VGbG9hdChpKTtyZXR1cm4gbnx8cz8oZT1lLnNwbGl0KFwiLFwiKVswXSxpPWkuc3BsaXQoXCIsXCIpWzBdLDFlMyooTnVtYmVyLnBhcnNlRmxvYXQoZSkrTnVtYmVyLnBhcnNlRmxvYXQoaSkpKTowfSkoaSkrNTtsZXQgcj0hMTtjb25zdCBhPSh7dGFyZ2V0Om59KT0+e249PT1pJiYocj0hMCxpLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxhKSxtKGUpKX07aS5hZGRFdmVudExpc3RlbmVyKHQsYSksc2V0VGltZW91dCgoKCk9PntyfHxzKGkpfSksbyl9LGI9KHQsZSxpLG4pPT57Y29uc3Qgcz10Lmxlbmd0aDtsZXQgbz10LmluZGV4T2YoZSk7cmV0dXJuLTE9PT1vPyFpJiZuP3Rbcy0xXTp0WzBdOihvKz1pPzE6LTEsbiYmKG89KG8rcyklcyksdFtNYXRoLm1heCgwLE1hdGgubWluKG8scy0xKSldKX0sdj0vW14uXSooPz1cXC4uKilcXC58LiovLHk9L1xcLi4qLyx3PS86OlxcZCskLyxBPXt9O2xldCBFPTE7Y29uc3QgVD17bW91c2VlbnRlcjpcIm1vdXNlb3ZlclwiLG1vdXNlbGVhdmU6XCJtb3VzZW91dFwifSxDPW5ldyBTZXQoW1wiY2xpY2tcIixcImRibGNsaWNrXCIsXCJtb3VzZXVwXCIsXCJtb3VzZWRvd25cIixcImNvbnRleHRtZW51XCIsXCJtb3VzZXdoZWVsXCIsXCJET01Nb3VzZVNjcm9sbFwiLFwibW91c2VvdmVyXCIsXCJtb3VzZW91dFwiLFwibW91c2Vtb3ZlXCIsXCJzZWxlY3RzdGFydFwiLFwic2VsZWN0ZW5kXCIsXCJrZXlkb3duXCIsXCJrZXlwcmVzc1wiLFwia2V5dXBcIixcIm9yaWVudGF0aW9uY2hhbmdlXCIsXCJ0b3VjaHN0YXJ0XCIsXCJ0b3VjaG1vdmVcIixcInRvdWNoZW5kXCIsXCJ0b3VjaGNhbmNlbFwiLFwicG9pbnRlcmRvd25cIixcInBvaW50ZXJtb3ZlXCIsXCJwb2ludGVydXBcIixcInBvaW50ZXJsZWF2ZVwiLFwicG9pbnRlcmNhbmNlbFwiLFwiZ2VzdHVyZXN0YXJ0XCIsXCJnZXN0dXJlY2hhbmdlXCIsXCJnZXN0dXJlZW5kXCIsXCJmb2N1c1wiLFwiYmx1clwiLFwiY2hhbmdlXCIsXCJyZXNldFwiLFwic2VsZWN0XCIsXCJzdWJtaXRcIixcImZvY3VzaW5cIixcImZvY3Vzb3V0XCIsXCJsb2FkXCIsXCJ1bmxvYWRcIixcImJlZm9yZXVubG9hZFwiLFwicmVzaXplXCIsXCJtb3ZlXCIsXCJET01Db250ZW50TG9hZGVkXCIsXCJyZWFkeXN0YXRlY2hhbmdlXCIsXCJlcnJvclwiLFwiYWJvcnRcIixcInNjcm9sbFwiXSk7ZnVuY3Rpb24gTyh0LGUpe3JldHVybiBlJiZgJHtlfTo6JHtFKyt9YHx8dC51aWRFdmVudHx8RSsrfWZ1bmN0aW9uIHgodCl7Y29uc3QgZT1PKHQpO3JldHVybiB0LnVpZEV2ZW50PWUsQVtlXT1BW2VdfHx7fSxBW2VdfWZ1bmN0aW9uIGsodCxlLGk9bnVsbCl7cmV0dXJuIE9iamVjdC52YWx1ZXModCkuZmluZCgodD0+dC5jYWxsYWJsZT09PWUmJnQuZGVsZWdhdGlvblNlbGVjdG9yPT09aSkpfWZ1bmN0aW9uIEwodCxlLGkpe2NvbnN0IG49XCJzdHJpbmdcIj09dHlwZW9mIGUscz1uP2k6ZXx8aTtsZXQgbz1OKHQpO3JldHVybiBDLmhhcyhvKXx8KG89dCksW24scyxvXX1mdW5jdGlvbiBEKHQsZSxpLG4scyl7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIGV8fCF0KXJldHVybjtsZXRbbyxyLGFdPUwoZSxpLG4pO2lmKGUgaW4gVCl7Y29uc3QgdD10PT5mdW5jdGlvbihlKXtpZighZS5yZWxhdGVkVGFyZ2V0fHxlLnJlbGF0ZWRUYXJnZXQhPT1lLmRlbGVnYXRlVGFyZ2V0JiYhZS5kZWxlZ2F0ZVRhcmdldC5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKXJldHVybiB0LmNhbGwodGhpcyxlKX07cj10KHIpfWNvbnN0IGw9eCh0KSxjPWxbYV18fChsW2FdPXt9KSxoPWsoYyxyLG8/aTpudWxsKTtpZihoKXJldHVybiB2b2lkKGgub25lT2ZmPWgub25lT2ZmJiZzKTtjb25zdCBkPU8ocixlLnJlcGxhY2UodixcIlwiKSksdT1vP2Z1bmN0aW9uKHQsZSxpKXtyZXR1cm4gZnVuY3Rpb24gbihzKXtjb25zdCBvPXQucXVlcnlTZWxlY3RvckFsbChlKTtmb3IobGV0e3RhcmdldDpyfT1zO3ImJnIhPT10aGlzO3I9ci5wYXJlbnROb2RlKWZvcihjb25zdCBhIG9mIG8paWYoYT09PXIpcmV0dXJuIGoocyx7ZGVsZWdhdGVUYXJnZXQ6cn0pLG4ub25lT2ZmJiZQLm9mZih0LHMudHlwZSxlLGkpLGkuYXBwbHkocixbc10pfX0odCxpLHIpOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uIGkobil7cmV0dXJuIGoobix7ZGVsZWdhdGVUYXJnZXQ6dH0pLGkub25lT2ZmJiZQLm9mZih0LG4udHlwZSxlKSxlLmFwcGx5KHQsW25dKX19KHQscik7dS5kZWxlZ2F0aW9uU2VsZWN0b3I9bz9pOm51bGwsdS5jYWxsYWJsZT1yLHUub25lT2ZmPXMsdS51aWRFdmVudD1kLGNbZF09dSx0LmFkZEV2ZW50TGlzdGVuZXIoYSx1LG8pfWZ1bmN0aW9uIFModCxlLGksbixzKXtjb25zdCBvPWsoZVtpXSxuLHMpO28mJih0LnJlbW92ZUV2ZW50TGlzdGVuZXIoaSxvLEJvb2xlYW4ocykpLGRlbGV0ZSBlW2ldW28udWlkRXZlbnRdKX1mdW5jdGlvbiBJKHQsZSxpLG4pe2NvbnN0IHM9ZVtpXXx8e307Zm9yKGNvbnN0IG8gb2YgT2JqZWN0LmtleXMocykpaWYoby5pbmNsdWRlcyhuKSl7Y29uc3Qgbj1zW29dO1ModCxlLGksbi5jYWxsYWJsZSxuLmRlbGVnYXRpb25TZWxlY3Rvcil9fWZ1bmN0aW9uIE4odCl7cmV0dXJuIHQ9dC5yZXBsYWNlKHksXCJcIiksVFt0XXx8dH1jb25zdCBQPXtvbih0LGUsaSxuKXtEKHQsZSxpLG4sITEpfSxvbmUodCxlLGksbil7RCh0LGUsaSxuLCEwKX0sb2ZmKHQsZSxpLG4pe2lmKFwic3RyaW5nXCIhPXR5cGVvZiBlfHwhdClyZXR1cm47Y29uc3RbcyxvLHJdPUwoZSxpLG4pLGE9ciE9PWUsbD14KHQpLGM9bFtyXXx8e30saD1lLnN0YXJ0c1dpdGgoXCIuXCIpO2lmKHZvaWQgMD09PW8pe2lmKGgpZm9yKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMobCkpSSh0LGwsaSxlLnNsaWNlKDEpKTtmb3IoY29uc3QgaSBvZiBPYmplY3Qua2V5cyhjKSl7Y29uc3Qgbj1pLnJlcGxhY2UodyxcIlwiKTtpZighYXx8ZS5pbmNsdWRlcyhuKSl7Y29uc3QgZT1jW2ldO1ModCxsLHIsZS5jYWxsYWJsZSxlLmRlbGVnYXRpb25TZWxlY3Rvcil9fX1lbHNle2lmKCFPYmplY3Qua2V5cyhjKS5sZW5ndGgpcmV0dXJuO1ModCxsLHIsbyxzP2k6bnVsbCl9fSx0cmlnZ2VyKHQsZSxpKXtpZihcInN0cmluZ1wiIT10eXBlb2YgZXx8IXQpcmV0dXJuIG51bGw7Y29uc3Qgbj11KCk7bGV0IHM9bnVsbCxvPSEwLHI9ITAsYT0hMTtlIT09TihlKSYmbiYmKHM9bi5FdmVudChlLGkpLG4odCkudHJpZ2dlcihzKSxvPSFzLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkscj0hcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpLGE9cy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSk7bGV0IGw9bmV3IEV2ZW50KGUse2J1YmJsZXM6byxjYW5jZWxhYmxlOiEwfSk7cmV0dXJuIGw9aihsLGkpLGEmJmwucHJldmVudERlZmF1bHQoKSxyJiZ0LmRpc3BhdGNoRXZlbnQobCksbC5kZWZhdWx0UHJldmVudGVkJiZzJiZzLnByZXZlbnREZWZhdWx0KCksbH19O2Z1bmN0aW9uIGoodCxlKXtmb3IoY29uc3RbaSxuXW9mIE9iamVjdC5lbnRyaWVzKGV8fHt9KSl0cnl7dFtpXT1ufWNhdGNoKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGkse2NvbmZpZ3VyYWJsZTohMCxnZXQ6KCk9Pm59KX1yZXR1cm4gdH1jb25zdCBNPW5ldyBNYXAsSD17c2V0KHQsZSxpKXtNLmhhcyh0KXx8TS5zZXQodCxuZXcgTWFwKTtjb25zdCBuPU0uZ2V0KHQpO24uaGFzKGUpfHwwPT09bi5zaXplP24uc2V0KGUsaSk6Y29uc29sZS5lcnJvcihgQm9vdHN0cmFwIGRvZXNuJ3QgYWxsb3cgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBwZXIgZWxlbWVudC4gQm91bmQgaW5zdGFuY2U6ICR7QXJyYXkuZnJvbShuLmtleXMoKSlbMF19LmApfSxnZXQ6KHQsZSk9Pk0uaGFzKHQpJiZNLmdldCh0KS5nZXQoZSl8fG51bGwscmVtb3ZlKHQsZSl7aWYoIU0uaGFzKHQpKXJldHVybjtjb25zdCBpPU0uZ2V0KHQpO2kuZGVsZXRlKGUpLDA9PT1pLnNpemUmJk0uZGVsZXRlKHQpfX07ZnVuY3Rpb24gJCh0KXtpZihcInRydWVcIj09PXQpcmV0dXJuITA7aWYoXCJmYWxzZVwiPT09dClyZXR1cm4hMTtpZih0PT09TnVtYmVyKHQpLnRvU3RyaW5nKCkpcmV0dXJuIE51bWJlcih0KTtpZihcIlwiPT09dHx8XCJudWxsXCI9PT10KXJldHVybiBudWxsO2lmKFwic3RyaW5nXCIhPXR5cGVvZiB0KXJldHVybiB0O3RyeXtyZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQodCkpfWNhdGNoKGUpe3JldHVybiB0fX1mdW5jdGlvbiBXKHQpe3JldHVybiB0LnJlcGxhY2UoL1tBLVpdL2csKHQ9PmAtJHt0LnRvTG93ZXJDYXNlKCl9YCkpfWNvbnN0IEI9e3NldERhdGFBdHRyaWJ1dGUodCxlLGkpe3Quc2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7VyhlKX1gLGkpfSxyZW1vdmVEYXRhQXR0cmlidXRlKHQsZSl7dC5yZW1vdmVBdHRyaWJ1dGUoYGRhdGEtYnMtJHtXKGUpfWApfSxnZXREYXRhQXR0cmlidXRlcyh0KXtpZighdClyZXR1cm57fTtjb25zdCBlPXt9LGk9T2JqZWN0LmtleXModC5kYXRhc2V0KS5maWx0ZXIoKHQ9PnQuc3RhcnRzV2l0aChcImJzXCIpJiYhdC5zdGFydHNXaXRoKFwiYnNDb25maWdcIikpKTtmb3IoY29uc3QgbiBvZiBpKXtsZXQgaT1uLnJlcGxhY2UoL15icy8sXCJcIik7aT1pLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpK2kuc2xpY2UoMSxpLmxlbmd0aCksZVtpXT0kKHQuZGF0YXNldFtuXSl9cmV0dXJuIGV9LGdldERhdGFBdHRyaWJ1dGU6KHQsZSk9PiQodC5nZXRBdHRyaWJ1dGUoYGRhdGEtYnMtJHtXKGUpfWApKX07Y2xhc3MgRntzdGF0aWMgZ2V0IERlZmF1bHQoKXtyZXR1cm57fX1zdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCl7cmV0dXJue319c3RhdGljIGdldCBOQU1FKCl7dGhyb3cgbmV3IEVycm9yKCdZb3UgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIHN0YXRpYyBtZXRob2QgXCJOQU1FXCIsIGZvciBlYWNoIGNvbXBvbmVudCEnKX1fZ2V0Q29uZmlnKHQpe3JldHVybiB0PXRoaXMuX21lcmdlQ29uZmlnT2JqKHQpLHQ9dGhpcy5fY29uZmlnQWZ0ZXJNZXJnZSh0KSx0aGlzLl90eXBlQ2hlY2tDb25maWcodCksdH1fY29uZmlnQWZ0ZXJNZXJnZSh0KXtyZXR1cm4gdH1fbWVyZ2VDb25maWdPYmoodCxlKXtjb25zdCBpPW8oZSk/Qi5nZXREYXRhQXR0cmlidXRlKGUsXCJjb25maWdcIik6e307cmV0dXJuey4uLnRoaXMuY29uc3RydWN0b3IuRGVmYXVsdCwuLi5cIm9iamVjdFwiPT10eXBlb2YgaT9pOnt9LC4uLm8oZSk/Qi5nZXREYXRhQXR0cmlidXRlcyhlKTp7fSwuLi5cIm9iamVjdFwiPT10eXBlb2YgdD90Ont9fX1fdHlwZUNoZWNrQ29uZmlnKHQsZT10aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKXtmb3IoY29uc3QgbiBvZiBPYmplY3Qua2V5cyhlKSl7Y29uc3Qgcz1lW25dLHI9dFtuXSxhPW8ocik/XCJlbGVtZW50XCI6bnVsbD09KGk9cik/YCR7aX1gOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpKS5tYXRjaCgvXFxzKFthLXpdKykvaSlbMV0udG9Mb3dlckNhc2UoKTtpZighbmV3IFJlZ0V4cChzKS50ZXN0KGEpKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FLnRvVXBwZXJDYXNlKCl9OiBPcHRpb24gXCIke259XCIgcHJvdmlkZWQgdHlwZSBcIiR7YX1cIiBidXQgZXhwZWN0ZWQgdHlwZSBcIiR7c31cIi5gKX12YXIgaX19Y2xhc3MgeiBleHRlbmRzIEZ7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLCh0PXIodCkpJiYodGhpcy5fZWxlbWVudD10LHRoaXMuX2NvbmZpZz10aGlzLl9nZXRDb25maWcoZSksSC5zZXQodGhpcy5fZWxlbWVudCx0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZLHRoaXMpKX1kaXNwb3NlKCl7SC5yZW1vdmUodGhpcy5fZWxlbWVudCx0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZKSxQLm9mZih0aGlzLl9lbGVtZW50LHRoaXMuY29uc3RydWN0b3IuRVZFTlRfS0VZKTtmb3IoY29uc3QgdCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSl0aGlzW3RdPW51bGx9X3F1ZXVlQ2FsbGJhY2sodCxlLGk9ITApe18odCxlLGkpfV9nZXRDb25maWcodCl7cmV0dXJuIHQ9dGhpcy5fbWVyZ2VDb25maWdPYmoodCx0aGlzLl9lbGVtZW50KSx0PXRoaXMuX2NvbmZpZ0FmdGVyTWVyZ2UodCksdGhpcy5fdHlwZUNoZWNrQ29uZmlnKHQpLHR9c3RhdGljIGdldEluc3RhbmNlKHQpe3JldHVybiBILmdldChyKHQpLHRoaXMuREFUQV9LRVkpfXN0YXRpYyBnZXRPckNyZWF0ZUluc3RhbmNlKHQsZT17fSl7cmV0dXJuIHRoaXMuZ2V0SW5zdGFuY2UodCl8fG5ldyB0aGlzKHQsXCJvYmplY3RcIj09dHlwZW9mIGU/ZTpudWxsKX1zdGF0aWMgZ2V0IFZFUlNJT04oKXtyZXR1cm5cIjUuMi4zXCJ9c3RhdGljIGdldCBEQVRBX0tFWSgpe3JldHVybmBicy4ke3RoaXMuTkFNRX1gfXN0YXRpYyBnZXQgRVZFTlRfS0VZKCl7cmV0dXJuYC4ke3RoaXMuREFUQV9LRVl9YH1zdGF0aWMgZXZlbnROYW1lKHQpe3JldHVybmAke3R9JHt0aGlzLkVWRU5UX0tFWX1gfX1jb25zdCBxPSh0LGU9XCJoaWRlXCIpPT57Y29uc3QgaT1gY2xpY2suZGlzbWlzcyR7dC5FVkVOVF9LRVl9YCxzPXQuTkFNRTtQLm9uKGRvY3VtZW50LGksYFtkYXRhLWJzLWRpc21pc3M9XCIke3N9XCJdYCwoZnVuY3Rpb24oaSl7aWYoW1wiQVwiLFwiQVJFQVwiXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpJiZpLnByZXZlbnREZWZhdWx0KCksbCh0aGlzKSlyZXR1cm47Y29uc3Qgbz1uKHRoaXMpfHx0aGlzLmNsb3Nlc3QoYC4ke3N9YCk7dC5nZXRPckNyZWF0ZUluc3RhbmNlKG8pW2VdKCl9KSl9O2NsYXNzIFIgZXh0ZW5kcyB6e3N0YXRpYyBnZXQgTkFNRSgpe3JldHVyblwiYWxlcnRcIn1jbG9zZSgpe2lmKFAudHJpZ2dlcih0aGlzLl9lbGVtZW50LFwiY2xvc2UuYnMuYWxlcnRcIikuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwic2hvd1wiKTtjb25zdCB0PXRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZmFkZVwiKTt0aGlzLl9xdWV1ZUNhbGxiYWNrKCgoKT0+dGhpcy5fZGVzdHJveUVsZW1lbnQoKSksdGhpcy5fZWxlbWVudCx0KX1fZGVzdHJveUVsZW1lbnQoKXt0aGlzLl9lbGVtZW50LnJlbW92ZSgpLFAudHJpZ2dlcih0aGlzLl9lbGVtZW50LFwiY2xvc2VkLmJzLmFsZXJ0XCIpLHRoaXMuZGlzcG9zZSgpfXN0YXRpYyBqUXVlcnlJbnRlcmZhY2UodCl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXtjb25zdCBlPVIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKTtpZihcInN0cmluZ1wiPT10eXBlb2YgdCl7aWYodm9pZCAwPT09ZVt0XXx8dC5zdGFydHNXaXRoKFwiX1wiKXx8XCJjb25zdHJ1Y3RvclwiPT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke3R9XCJgKTtlW3RdKHRoaXMpfX0pKX19cShSLFwiY2xvc2VcIiksZyhSKTtjb25zdCBWPSdbZGF0YS1icy10b2dnbGU9XCJidXR0b25cIl0nO2NsYXNzIEsgZXh0ZW5kcyB6e3N0YXRpYyBnZXQgTkFNRSgpe3JldHVyblwiYnV0dG9uXCJ9dG9nZ2xlKCl7dGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJhcmlhLXByZXNzZWRcIix0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoXCJhY3RpdmVcIikpfXN0YXRpYyBqUXVlcnlJbnRlcmZhY2UodCl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXtjb25zdCBlPUsuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKTtcInRvZ2dsZVwiPT09dCYmZVt0XSgpfSkpfX1QLm9uKGRvY3VtZW50LFwiY2xpY2suYnMuYnV0dG9uLmRhdGEtYXBpXCIsViwodD0+e3QucHJldmVudERlZmF1bHQoKTtjb25zdCBlPXQudGFyZ2V0LmNsb3Nlc3QoVik7Sy5nZXRPckNyZWF0ZUluc3RhbmNlKGUpLnRvZ2dsZSgpfSkpLGcoSyk7Y29uc3QgUT17ZmluZDoodCxlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk9PltdLmNvbmNhdCguLi5FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZSx0KSksZmluZE9uZToodCxlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk9PkVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3IuY2FsbChlLHQpLGNoaWxkcmVuOih0LGUpPT5bXS5jb25jYXQoLi4udC5jaGlsZHJlbikuZmlsdGVyKCh0PT50Lm1hdGNoZXMoZSkpKSxwYXJlbnRzKHQsZSl7Y29uc3QgaT1bXTtsZXQgbj10LnBhcmVudE5vZGUuY2xvc2VzdChlKTtmb3IoO247KWkucHVzaChuKSxuPW4ucGFyZW50Tm9kZS5jbG9zZXN0KGUpO3JldHVybiBpfSxwcmV2KHQsZSl7bGV0IGk9dC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO2Zvcig7aTspe2lmKGkubWF0Y2hlcyhlKSlyZXR1cm5baV07aT1pLnByZXZpb3VzRWxlbWVudFNpYmxpbmd9cmV0dXJuW119LG5leHQodCxlKXtsZXQgaT10Lm5leHRFbGVtZW50U2libGluZztmb3IoO2k7KXtpZihpLm1hdGNoZXMoZSkpcmV0dXJuW2ldO2k9aS5uZXh0RWxlbWVudFNpYmxpbmd9cmV0dXJuW119LGZvY3VzYWJsZUNoaWxkcmVuKHQpe2NvbnN0IGU9W1wiYVwiLFwiYnV0dG9uXCIsXCJpbnB1dFwiLFwidGV4dGFyZWFcIixcInNlbGVjdFwiLFwiZGV0YWlsc1wiLFwiW3RhYmluZGV4XVwiLCdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSddLm1hcCgodD0+YCR7dH06bm90KFt0YWJpbmRleF49XCItXCJdKWApKS5qb2luKFwiLFwiKTtyZXR1cm4gdGhpcy5maW5kKGUsdCkuZmlsdGVyKCh0PT4hbCh0KSYmYSh0KSkpfX0sWD17ZW5kQ2FsbGJhY2s6bnVsbCxsZWZ0Q2FsbGJhY2s6bnVsbCxyaWdodENhbGxiYWNrOm51bGx9LFk9e2VuZENhbGxiYWNrOlwiKGZ1bmN0aW9ufG51bGwpXCIsbGVmdENhbGxiYWNrOlwiKGZ1bmN0aW9ufG51bGwpXCIscmlnaHRDYWxsYmFjazpcIihmdW5jdGlvbnxudWxsKVwifTtjbGFzcyBVIGV4dGVuZHMgRntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5fZWxlbWVudD10LHQmJlUuaXNTdXBwb3J0ZWQoKSYmKHRoaXMuX2NvbmZpZz10aGlzLl9nZXRDb25maWcoZSksdGhpcy5fZGVsdGFYPTAsdGhpcy5fc3VwcG9ydFBvaW50ZXJFdmVudHM9Qm9vbGVhbih3aW5kb3cuUG9pbnRlckV2ZW50KSx0aGlzLl9pbml0RXZlbnRzKCkpfXN0YXRpYyBnZXQgRGVmYXVsdCgpe3JldHVybiBYfXN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKXtyZXR1cm4gWX1zdGF0aWMgZ2V0IE5BTUUoKXtyZXR1cm5cInN3aXBlXCJ9ZGlzcG9zZSgpe1Aub2ZmKHRoaXMuX2VsZW1lbnQsXCIuYnMuc3dpcGVcIil9X3N0YXJ0KHQpe3RoaXMuX3N1cHBvcnRQb2ludGVyRXZlbnRzP3RoaXMuX2V2ZW50SXNQb2ludGVyUGVuVG91Y2godCkmJih0aGlzLl9kZWx0YVg9dC5jbGllbnRYKTp0aGlzLl9kZWx0YVg9dC50b3VjaGVzWzBdLmNsaWVudFh9X2VuZCh0KXt0aGlzLl9ldmVudElzUG9pbnRlclBlblRvdWNoKHQpJiYodGhpcy5fZGVsdGFYPXQuY2xpZW50WC10aGlzLl9kZWx0YVgpLHRoaXMuX2hhbmRsZVN3aXBlKCksbSh0aGlzLl9jb25maWcuZW5kQ2FsbGJhY2spfV9tb3ZlKHQpe3RoaXMuX2RlbHRhWD10LnRvdWNoZXMmJnQudG91Y2hlcy5sZW5ndGg+MT8wOnQudG91Y2hlc1swXS5jbGllbnRYLXRoaXMuX2RlbHRhWH1faGFuZGxlU3dpcGUoKXtjb25zdCB0PU1hdGguYWJzKHRoaXMuX2RlbHRhWCk7aWYodDw9NDApcmV0dXJuO2NvbnN0IGU9dC90aGlzLl9kZWx0YVg7dGhpcy5fZGVsdGFYPTAsZSYmbShlPjA/dGhpcy5fY29uZmlnLnJpZ2h0Q2FsbGJhY2s6dGhpcy5fY29uZmlnLmxlZnRDYWxsYmFjayl9X2luaXRFdmVudHMoKXt0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cz8oUC5vbih0aGlzLl9lbGVtZW50LFwicG9pbnRlcmRvd24uYnMuc3dpcGVcIiwodD0+dGhpcy5fc3RhcnQodCkpKSxQLm9uKHRoaXMuX2VsZW1lbnQsXCJwb2ludGVydXAuYnMuc3dpcGVcIiwodD0+dGhpcy5fZW5kKHQpKSksdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwicG9pbnRlci1ldmVudFwiKSk6KFAub24odGhpcy5fZWxlbWVudCxcInRvdWNoc3RhcnQuYnMuc3dpcGVcIiwodD0+dGhpcy5fc3RhcnQodCkpKSxQLm9uKHRoaXMuX2VsZW1lbnQsXCJ0b3VjaG1vdmUuYnMuc3dpcGVcIiwodD0+dGhpcy5fbW92ZSh0KSkpLFAub24odGhpcy5fZWxlbWVudCxcInRvdWNoZW5kLmJzLnN3aXBlXCIsKHQ9PnRoaXMuX2VuZCh0KSkpKX1fZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaCh0KXtyZXR1cm4gdGhpcy5fc3VwcG9ydFBvaW50ZXJFdmVudHMmJihcInBlblwiPT09dC5wb2ludGVyVHlwZXx8XCJ0b3VjaFwiPT09dC5wb2ludGVyVHlwZSl9c3RhdGljIGlzU3VwcG9ydGVkKCl7cmV0dXJuXCJvbnRvdWNoc3RhcnRcImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8bmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzPjB9fWNvbnN0IEc9XCJuZXh0XCIsSj1cInByZXZcIixaPVwibGVmdFwiLHR0PVwicmlnaHRcIixldD1cInNsaWQuYnMuY2Fyb3VzZWxcIixpdD1cImNhcm91c2VsXCIsbnQ9XCJhY3RpdmVcIixzdD17QXJyb3dMZWZ0OnR0LEFycm93UmlnaHQ6Wn0sb3Q9e2ludGVydmFsOjVlMyxrZXlib2FyZDohMCxwYXVzZTpcImhvdmVyXCIscmlkZTohMSx0b3VjaDohMCx3cmFwOiEwfSxydD17aW50ZXJ2YWw6XCIobnVtYmVyfGJvb2xlYW4pXCIsa2V5Ym9hcmQ6XCJib29sZWFuXCIscGF1c2U6XCIoc3RyaW5nfGJvb2xlYW4pXCIscmlkZTpcIihib29sZWFufHN0cmluZylcIix0b3VjaDpcImJvb2xlYW5cIix3cmFwOlwiYm9vbGVhblwifTtjbGFzcyBhdCBleHRlbmRzIHp7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMuX2ludGVydmFsPW51bGwsdGhpcy5fYWN0aXZlRWxlbWVudD1udWxsLHRoaXMuX2lzU2xpZGluZz0hMSx0aGlzLnRvdWNoVGltZW91dD1udWxsLHRoaXMuX3N3aXBlSGVscGVyPW51bGwsdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQ9US5maW5kT25lKFwiLmNhcm91c2VsLWluZGljYXRvcnNcIix0aGlzLl9lbGVtZW50KSx0aGlzLl9hZGRFdmVudExpc3RlbmVycygpLHRoaXMuX2NvbmZpZy5yaWRlPT09aXQmJnRoaXMuY3ljbGUoKX1zdGF0aWMgZ2V0IERlZmF1bHQoKXtyZXR1cm4gb3R9c3RhdGljIGdldCBEZWZhdWx0VHlwZSgpe3JldHVybiBydH1zdGF0aWMgZ2V0IE5BTUUoKXtyZXR1cm5cImNhcm91c2VsXCJ9bmV4dCgpe3RoaXMuX3NsaWRlKEcpfW5leHRXaGVuVmlzaWJsZSgpeyFkb2N1bWVudC5oaWRkZW4mJmEodGhpcy5fZWxlbWVudCkmJnRoaXMubmV4dCgpfXByZXYoKXt0aGlzLl9zbGlkZShKKX1wYXVzZSgpe3RoaXMuX2lzU2xpZGluZyYmcyh0aGlzLl9lbGVtZW50KSx0aGlzLl9jbGVhckludGVydmFsKCl9Y3ljbGUoKXt0aGlzLl9jbGVhckludGVydmFsKCksdGhpcy5fdXBkYXRlSW50ZXJ2YWwoKSx0aGlzLl9pbnRlcnZhbD1zZXRJbnRlcnZhbCgoKCk9PnRoaXMubmV4dFdoZW5WaXNpYmxlKCkpLHRoaXMuX2NvbmZpZy5pbnRlcnZhbCl9X21heWJlRW5hYmxlQ3ljbGUoKXt0aGlzLl9jb25maWcucmlkZSYmKHRoaXMuX2lzU2xpZGluZz9QLm9uZSh0aGlzLl9lbGVtZW50LGV0LCgoKT0+dGhpcy5jeWNsZSgpKSk6dGhpcy5jeWNsZSgpKX10byh0KXtjb25zdCBlPXRoaXMuX2dldEl0ZW1zKCk7aWYodD5lLmxlbmd0aC0xfHx0PDApcmV0dXJuO2lmKHRoaXMuX2lzU2xpZGluZylyZXR1cm4gdm9pZCBQLm9uZSh0aGlzLl9lbGVtZW50LGV0LCgoKT0+dGhpcy50byh0KSkpO2NvbnN0IGk9dGhpcy5fZ2V0SXRlbUluZGV4KHRoaXMuX2dldEFjdGl2ZSgpKTtpZihpPT09dClyZXR1cm47Y29uc3Qgbj10Pmk/RzpKO3RoaXMuX3NsaWRlKG4sZVt0XSl9ZGlzcG9zZSgpe3RoaXMuX3N3aXBlSGVscGVyJiZ0aGlzLl9zd2lwZUhlbHBlci5kaXNwb3NlKCksc3VwZXIuZGlzcG9zZSgpfV9jb25maWdBZnRlck1lcmdlKHQpe3JldHVybiB0LmRlZmF1bHRJbnRlcnZhbD10LmludGVydmFsLHR9X2FkZEV2ZW50TGlzdGVuZXJzKCl7dGhpcy5fY29uZmlnLmtleWJvYXJkJiZQLm9uKHRoaXMuX2VsZW1lbnQsXCJrZXlkb3duLmJzLmNhcm91c2VsXCIsKHQ9PnRoaXMuX2tleWRvd24odCkpKSxcImhvdmVyXCI9PT10aGlzLl9jb25maWcucGF1c2UmJihQLm9uKHRoaXMuX2VsZW1lbnQsXCJtb3VzZWVudGVyLmJzLmNhcm91c2VsXCIsKCgpPT50aGlzLnBhdXNlKCkpKSxQLm9uKHRoaXMuX2VsZW1lbnQsXCJtb3VzZWxlYXZlLmJzLmNhcm91c2VsXCIsKCgpPT50aGlzLl9tYXliZUVuYWJsZUN5Y2xlKCkpKSksdGhpcy5fY29uZmlnLnRvdWNoJiZVLmlzU3VwcG9ydGVkKCkmJnRoaXMuX2FkZFRvdWNoRXZlbnRMaXN0ZW5lcnMoKX1fYWRkVG91Y2hFdmVudExpc3RlbmVycygpe2Zvcihjb25zdCB0IG9mIFEuZmluZChcIi5jYXJvdXNlbC1pdGVtIGltZ1wiLHRoaXMuX2VsZW1lbnQpKVAub24odCxcImRyYWdzdGFydC5icy5jYXJvdXNlbFwiLCh0PT50LnByZXZlbnREZWZhdWx0KCkpKTtjb25zdCB0PXtsZWZ0Q2FsbGJhY2s6KCk9PnRoaXMuX3NsaWRlKHRoaXMuX2RpcmVjdGlvblRvT3JkZXIoWikpLHJpZ2h0Q2FsbGJhY2s6KCk9PnRoaXMuX3NsaWRlKHRoaXMuX2RpcmVjdGlvblRvT3JkZXIodHQpKSxlbmRDYWxsYmFjazooKT0+e1wiaG92ZXJcIj09PXRoaXMuX2NvbmZpZy5wYXVzZSYmKHRoaXMucGF1c2UoKSx0aGlzLnRvdWNoVGltZW91dCYmY2xlYXJUaW1lb3V0KHRoaXMudG91Y2hUaW1lb3V0KSx0aGlzLnRvdWNoVGltZW91dD1zZXRUaW1lb3V0KCgoKT0+dGhpcy5fbWF5YmVFbmFibGVDeWNsZSgpKSw1MDArdGhpcy5fY29uZmlnLmludGVydmFsKSl9fTt0aGlzLl9zd2lwZUhlbHBlcj1uZXcgVSh0aGlzLl9lbGVtZW50LHQpfV9rZXlkb3duKHQpe2lmKC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QodC50YXJnZXQudGFnTmFtZSkpcmV0dXJuO2NvbnN0IGU9c3RbdC5rZXldO2UmJih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihlKSkpfV9nZXRJdGVtSW5kZXgodCl7cmV0dXJuIHRoaXMuX2dldEl0ZW1zKCkuaW5kZXhPZih0KX1fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudCh0KXtpZighdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpcmV0dXJuO2NvbnN0IGU9US5maW5kT25lKFwiLmFjdGl2ZVwiLHRoaXMuX2luZGljYXRvcnNFbGVtZW50KTtlLmNsYXNzTGlzdC5yZW1vdmUobnQpLGUucmVtb3ZlQXR0cmlidXRlKFwiYXJpYS1jdXJyZW50XCIpO2NvbnN0IGk9US5maW5kT25lKGBbZGF0YS1icy1zbGlkZS10bz1cIiR7dH1cIl1gLHRoaXMuX2luZGljYXRvcnNFbGVtZW50KTtpJiYoaS5jbGFzc0xpc3QuYWRkKG50KSxpLnNldEF0dHJpYnV0ZShcImFyaWEtY3VycmVudFwiLFwidHJ1ZVwiKSl9X3VwZGF0ZUludGVydmFsKCl7Y29uc3QgdD10aGlzLl9hY3RpdmVFbGVtZW50fHx0aGlzLl9nZXRBY3RpdmUoKTtpZighdClyZXR1cm47Y29uc3QgZT1OdW1iZXIucGFyc2VJbnQodC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWJzLWludGVydmFsXCIpLDEwKTt0aGlzLl9jb25maWcuaW50ZXJ2YWw9ZXx8dGhpcy5fY29uZmlnLmRlZmF1bHRJbnRlcnZhbH1fc2xpZGUodCxlPW51bGwpe2lmKHRoaXMuX2lzU2xpZGluZylyZXR1cm47Y29uc3QgaT10aGlzLl9nZXRBY3RpdmUoKSxuPXQ9PT1HLHM9ZXx8Yih0aGlzLl9nZXRJdGVtcygpLGksbix0aGlzLl9jb25maWcud3JhcCk7aWYocz09PWkpcmV0dXJuO2NvbnN0IG89dGhpcy5fZ2V0SXRlbUluZGV4KHMpLHI9ZT0+UC50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsZSx7cmVsYXRlZFRhcmdldDpzLGRpcmVjdGlvbjp0aGlzLl9vcmRlclRvRGlyZWN0aW9uKHQpLGZyb206dGhpcy5fZ2V0SXRlbUluZGV4KGkpLHRvOm99KTtpZihyKFwic2xpZGUuYnMuY2Fyb3VzZWxcIikuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47aWYoIWl8fCFzKXJldHVybjtjb25zdCBhPUJvb2xlYW4odGhpcy5faW50ZXJ2YWwpO3RoaXMucGF1c2UoKSx0aGlzLl9pc1NsaWRpbmc9ITAsdGhpcy5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChvKSx0aGlzLl9hY3RpdmVFbGVtZW50PXM7Y29uc3QgbD1uP1wiY2Fyb3VzZWwtaXRlbS1zdGFydFwiOlwiY2Fyb3VzZWwtaXRlbS1lbmRcIixjPW4/XCJjYXJvdXNlbC1pdGVtLW5leHRcIjpcImNhcm91c2VsLWl0ZW0tcHJldlwiO3MuY2xhc3NMaXN0LmFkZChjKSxkKHMpLGkuY2xhc3NMaXN0LmFkZChsKSxzLmNsYXNzTGlzdC5hZGQobCksdGhpcy5fcXVldWVDYWxsYmFjaygoKCk9PntzLmNsYXNzTGlzdC5yZW1vdmUobCxjKSxzLmNsYXNzTGlzdC5hZGQobnQpLGkuY2xhc3NMaXN0LnJlbW92ZShudCxjLGwpLHRoaXMuX2lzU2xpZGluZz0hMSxyKGV0KX0pLGksdGhpcy5faXNBbmltYXRlZCgpKSxhJiZ0aGlzLmN5Y2xlKCl9X2lzQW5pbWF0ZWQoKXtyZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJzbGlkZVwiKX1fZ2V0QWN0aXZlKCl7cmV0dXJuIFEuZmluZE9uZShcIi5hY3RpdmUuY2Fyb3VzZWwtaXRlbVwiLHRoaXMuX2VsZW1lbnQpfV9nZXRJdGVtcygpe3JldHVybiBRLmZpbmQoXCIuY2Fyb3VzZWwtaXRlbVwiLHRoaXMuX2VsZW1lbnQpfV9jbGVhckludGVydmFsKCl7dGhpcy5faW50ZXJ2YWwmJihjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKSx0aGlzLl9pbnRlcnZhbD1udWxsKX1fZGlyZWN0aW9uVG9PcmRlcih0KXtyZXR1cm4gcCgpP3Q9PT1aP0o6Rzp0PT09Wj9HOkp9X29yZGVyVG9EaXJlY3Rpb24odCl7cmV0dXJuIHAoKT90PT09Sj9aOnR0OnQ9PT1KP3R0Olp9c3RhdGljIGpRdWVyeUludGVyZmFjZSh0KXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe2NvbnN0IGU9YXQuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLHQpO2lmKFwibnVtYmVyXCIhPXR5cGVvZiB0KXtpZihcInN0cmluZ1wiPT10eXBlb2YgdCl7aWYodm9pZCAwPT09ZVt0XXx8dC5zdGFydHNXaXRoKFwiX1wiKXx8XCJjb25zdHJ1Y3RvclwiPT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke3R9XCJgKTtlW3RdKCl9fWVsc2UgZS50byh0KX0pKX19UC5vbihkb2N1bWVudCxcImNsaWNrLmJzLmNhcm91c2VsLmRhdGEtYXBpXCIsXCJbZGF0YS1icy1zbGlkZV0sIFtkYXRhLWJzLXNsaWRlLXRvXVwiLChmdW5jdGlvbih0KXtjb25zdCBlPW4odGhpcyk7aWYoIWV8fCFlLmNsYXNzTGlzdC5jb250YWlucyhpdCkpcmV0dXJuO3QucHJldmVudERlZmF1bHQoKTtjb25zdCBpPWF0LmdldE9yQ3JlYXRlSW5zdGFuY2UoZSkscz10aGlzLmdldEF0dHJpYnV0ZShcImRhdGEtYnMtc2xpZGUtdG9cIik7cmV0dXJuIHM/KGkudG8ocyksdm9pZCBpLl9tYXliZUVuYWJsZUN5Y2xlKCkpOlwibmV4dFwiPT09Qi5nZXREYXRhQXR0cmlidXRlKHRoaXMsXCJzbGlkZVwiKT8oaS5uZXh0KCksdm9pZCBpLl9tYXliZUVuYWJsZUN5Y2xlKCkpOihpLnByZXYoKSx2b2lkIGkuX21heWJlRW5hYmxlQ3ljbGUoKSl9KSksUC5vbih3aW5kb3csXCJsb2FkLmJzLmNhcm91c2VsLmRhdGEtYXBpXCIsKCgpPT57Y29uc3QgdD1RLmZpbmQoJ1tkYXRhLWJzLXJpZGU9XCJjYXJvdXNlbFwiXScpO2Zvcihjb25zdCBlIG9mIHQpYXQuZ2V0T3JDcmVhdGVJbnN0YW5jZShlKX0pKSxnKGF0KTtjb25zdCBsdD1cInNob3dcIixjdD1cImNvbGxhcHNlXCIsaHQ9XCJjb2xsYXBzaW5nXCIsZHQ9J1tkYXRhLWJzLXRvZ2dsZT1cImNvbGxhcHNlXCJdJyx1dD17cGFyZW50Om51bGwsdG9nZ2xlOiEwfSxmdD17cGFyZW50OlwiKG51bGx8ZWxlbWVudClcIix0b2dnbGU6XCJib29sZWFuXCJ9O2NsYXNzIHB0IGV4dGVuZHMgentjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5faXNUcmFuc2l0aW9uaW5nPSExLHRoaXMuX3RyaWdnZXJBcnJheT1bXTtjb25zdCBuPVEuZmluZChkdCk7Zm9yKGNvbnN0IHQgb2Ygbil7Y29uc3QgZT1pKHQpLG49US5maW5kKGUpLmZpbHRlcigodD0+dD09PXRoaXMuX2VsZW1lbnQpKTtudWxsIT09ZSYmbi5sZW5ndGgmJnRoaXMuX3RyaWdnZXJBcnJheS5wdXNoKHQpfXRoaXMuX2luaXRpYWxpemVDaGlsZHJlbigpLHRoaXMuX2NvbmZpZy5wYXJlbnR8fHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLl90cmlnZ2VyQXJyYXksdGhpcy5faXNTaG93bigpKSx0aGlzLl9jb25maWcudG9nZ2xlJiZ0aGlzLnRvZ2dsZSgpfXN0YXRpYyBnZXQgRGVmYXVsdCgpe3JldHVybiB1dH1zdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCl7cmV0dXJuIGZ0fXN0YXRpYyBnZXQgTkFNRSgpe3JldHVyblwiY29sbGFwc2VcIn10b2dnbGUoKXt0aGlzLl9pc1Nob3duKCk/dGhpcy5oaWRlKCk6dGhpcy5zaG93KCl9c2hvdygpe2lmKHRoaXMuX2lzVHJhbnNpdGlvbmluZ3x8dGhpcy5faXNTaG93bigpKXJldHVybjtsZXQgdD1bXTtpZih0aGlzLl9jb25maWcucGFyZW50JiYodD10aGlzLl9nZXRGaXJzdExldmVsQ2hpbGRyZW4oXCIuY29sbGFwc2Uuc2hvdywgLmNvbGxhcHNlLmNvbGxhcHNpbmdcIikuZmlsdGVyKCh0PT50IT09dGhpcy5fZWxlbWVudCkpLm1hcCgodD0+cHQuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0LHt0b2dnbGU6ITF9KSkpKSx0Lmxlbmd0aCYmdFswXS5faXNUcmFuc2l0aW9uaW5nKXJldHVybjtpZihQLnRyaWdnZXIodGhpcy5fZWxlbWVudCxcInNob3cuYnMuY29sbGFwc2VcIikuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47Zm9yKGNvbnN0IGUgb2YgdCllLmhpZGUoKTtjb25zdCBlPXRoaXMuX2dldERpbWVuc2lvbigpO3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjdCksdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKGh0KSx0aGlzLl9lbGVtZW50LnN0eWxlW2VdPTAsdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX3RyaWdnZXJBcnJheSwhMCksdGhpcy5faXNUcmFuc2l0aW9uaW5nPSEwO2NvbnN0IGk9YHNjcm9sbCR7ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSl9YDt0aGlzLl9xdWV1ZUNhbGxiYWNrKCgoKT0+e3RoaXMuX2lzVHJhbnNpdGlvbmluZz0hMSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoaHQpLHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChjdCxsdCksdGhpcy5fZWxlbWVudC5zdHlsZVtlXT1cIlwiLFAudHJpZ2dlcih0aGlzLl9lbGVtZW50LFwic2hvd24uYnMuY29sbGFwc2VcIil9KSx0aGlzLl9lbGVtZW50LCEwKSx0aGlzLl9lbGVtZW50LnN0eWxlW2VdPWAke3RoaXMuX2VsZW1lbnRbaV19cHhgfWhpZGUoKXtpZih0aGlzLl9pc1RyYW5zaXRpb25pbmd8fCF0aGlzLl9pc1Nob3duKCkpcmV0dXJuO2lmKFAudHJpZ2dlcih0aGlzLl9lbGVtZW50LFwiaGlkZS5icy5jb2xsYXBzZVwiKS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtjb25zdCB0PXRoaXMuX2dldERpbWVuc2lvbigpO3RoaXMuX2VsZW1lbnQuc3R5bGVbdF09YCR7dGhpcy5fZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVt0XX1weGAsZCh0aGlzLl9lbGVtZW50KSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoaHQpLHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjdCxsdCk7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fdHJpZ2dlckFycmF5KXtjb25zdCBlPW4odCk7ZSYmIXRoaXMuX2lzU2hvd24oZSkmJnRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhbdF0sITEpfXRoaXMuX2lzVHJhbnNpdGlvbmluZz0hMCx0aGlzLl9lbGVtZW50LnN0eWxlW3RdPVwiXCIsdGhpcy5fcXVldWVDYWxsYmFjaygoKCk9Pnt0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITEsdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGh0KSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoY3QpLFAudHJpZ2dlcih0aGlzLl9lbGVtZW50LFwiaGlkZGVuLmJzLmNvbGxhcHNlXCIpfSksdGhpcy5fZWxlbWVudCwhMCl9X2lzU2hvd24odD10aGlzLl9lbGVtZW50KXtyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMobHQpfV9jb25maWdBZnRlck1lcmdlKHQpe3JldHVybiB0LnRvZ2dsZT1Cb29sZWFuKHQudG9nZ2xlKSx0LnBhcmVudD1yKHQucGFyZW50KSx0fV9nZXREaW1lbnNpb24oKXtyZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJjb2xsYXBzZS1ob3Jpem9udGFsXCIpP1wid2lkdGhcIjpcImhlaWdodFwifV9pbml0aWFsaXplQ2hpbGRyZW4oKXtpZighdGhpcy5fY29uZmlnLnBhcmVudClyZXR1cm47Y29uc3QgdD10aGlzLl9nZXRGaXJzdExldmVsQ2hpbGRyZW4oZHQpO2Zvcihjb25zdCBlIG9mIHQpe2NvbnN0IHQ9bihlKTt0JiZ0aGlzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoW2VdLHRoaXMuX2lzU2hvd24odCkpfX1fZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKHQpe2NvbnN0IGU9US5maW5kKFwiOnNjb3BlIC5jb2xsYXBzZSAuY29sbGFwc2VcIix0aGlzLl9jb25maWcucGFyZW50KTtyZXR1cm4gUS5maW5kKHQsdGhpcy5fY29uZmlnLnBhcmVudCkuZmlsdGVyKCh0PT4hZS5pbmNsdWRlcyh0KSkpfV9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModCxlKXtpZih0Lmxlbmd0aClmb3IoY29uc3QgaSBvZiB0KWkuY2xhc3NMaXN0LnRvZ2dsZShcImNvbGxhcHNlZFwiLCFlKSxpLnNldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIixlKX1zdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKHQpe2NvbnN0IGU9e307cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHQmJi9zaG93fGhpZGUvLnRlc3QodCkmJihlLnRvZ2dsZT0hMSksdGhpcy5lYWNoKChmdW5jdGlvbigpe2NvbnN0IGk9cHQuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLGUpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXtpZih2b2lkIDA9PT1pW3RdKXRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7dH1cImApO2lbdF0oKX19KSl9fVAub24oZG9jdW1lbnQsXCJjbGljay5icy5jb2xsYXBzZS5kYXRhLWFwaVwiLGR0LChmdW5jdGlvbih0KXsoXCJBXCI9PT10LnRhcmdldC50YWdOYW1lfHx0LmRlbGVnYXRlVGFyZ2V0JiZcIkFcIj09PXQuZGVsZWdhdGVUYXJnZXQudGFnTmFtZSkmJnQucHJldmVudERlZmF1bHQoKTtjb25zdCBlPWkodGhpcyksbj1RLmZpbmQoZSk7Zm9yKGNvbnN0IHQgb2YgbilwdC5nZXRPckNyZWF0ZUluc3RhbmNlKHQse3RvZ2dsZTohMX0pLnRvZ2dsZSgpfSkpLGcocHQpO3ZhciBndD1cInRvcFwiLG10PVwiYm90dG9tXCIsX3Q9XCJyaWdodFwiLGJ0PVwibGVmdFwiLHZ0PVwiYXV0b1wiLHl0PVtndCxtdCxfdCxidF0sd3Q9XCJzdGFydFwiLEF0PVwiZW5kXCIsRXQ9XCJjbGlwcGluZ1BhcmVudHNcIixUdD1cInZpZXdwb3J0XCIsQ3Q9XCJwb3BwZXJcIixPdD1cInJlZmVyZW5jZVwiLHh0PXl0LnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb25jYXQoW2UrXCItXCIrd3QsZStcIi1cIitBdF0pfSksW10pLGt0PVtdLmNvbmNhdCh5dCxbdnRdKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuY29uY2F0KFtlLGUrXCItXCIrd3QsZStcIi1cIitBdF0pfSksW10pLEx0PVwiYmVmb3JlUmVhZFwiLER0PVwicmVhZFwiLFN0PVwiYWZ0ZXJSZWFkXCIsSXQ9XCJiZWZvcmVNYWluXCIsTnQ9XCJtYWluXCIsUHQ9XCJhZnRlck1haW5cIixqdD1cImJlZm9yZVdyaXRlXCIsTXQ9XCJ3cml0ZVwiLEh0PVwiYWZ0ZXJXcml0ZVwiLCR0PVtMdCxEdCxTdCxJdCxOdCxQdCxqdCxNdCxIdF07ZnVuY3Rpb24gV3QodCl7cmV0dXJuIHQ/KHQubm9kZU5hbWV8fFwiXCIpLnRvTG93ZXJDYXNlKCk6bnVsbH1mdW5jdGlvbiBCdCh0KXtpZihudWxsPT10KXJldHVybiB3aW5kb3c7aWYoXCJbb2JqZWN0IFdpbmRvd11cIiE9PXQudG9TdHJpbmcoKSl7dmFyIGU9dC5vd25lckRvY3VtZW50O3JldHVybiBlJiZlLmRlZmF1bHRWaWV3fHx3aW5kb3d9cmV0dXJuIHR9ZnVuY3Rpb24gRnQodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBCdCh0KS5FbGVtZW50fHx0IGluc3RhbmNlb2YgRWxlbWVudH1mdW5jdGlvbiB6dCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEJ0KHQpLkhUTUxFbGVtZW50fHx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnR9ZnVuY3Rpb24gcXQodCl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFNoYWRvd1Jvb3QmJih0IGluc3RhbmNlb2YgQnQodCkuU2hhZG93Um9vdHx8dCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpfWNvbnN0IFJ0PXtuYW1lOlwiYXBwbHlTdHlsZXNcIixlbmFibGVkOiEwLHBoYXNlOlwid3JpdGVcIixmbjpmdW5jdGlvbih0KXt2YXIgZT10LnN0YXRlO09iamVjdC5rZXlzKGUuZWxlbWVudHMpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBpPWUuc3R5bGVzW3RdfHx7fSxuPWUuYXR0cmlidXRlc1t0XXx8e30scz1lLmVsZW1lbnRzW3RdO3p0KHMpJiZXdChzKSYmKE9iamVjdC5hc3NpZ24ocy5zdHlsZSxpKSxPYmplY3Qua2V5cyhuKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1uW3RdOyExPT09ZT9zLnJlbW92ZUF0dHJpYnV0ZSh0KTpzLnNldEF0dHJpYnV0ZSh0LCEwPT09ZT9cIlwiOmUpfSkpKX0pKX0sZWZmZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuc3RhdGUsaT17cG9wcGVyOntwb3NpdGlvbjplLm9wdGlvbnMuc3RyYXRlZ3ksbGVmdDpcIjBcIix0b3A6XCIwXCIsbWFyZ2luOlwiMFwifSxhcnJvdzp7cG9zaXRpb246XCJhYnNvbHV0ZVwifSxyZWZlcmVuY2U6e319O3JldHVybiBPYmplY3QuYXNzaWduKGUuZWxlbWVudHMucG9wcGVyLnN0eWxlLGkucG9wcGVyKSxlLnN0eWxlcz1pLGUuZWxlbWVudHMuYXJyb3cmJk9iamVjdC5hc3NpZ24oZS5lbGVtZW50cy5hcnJvdy5zdHlsZSxpLmFycm93KSxmdW5jdGlvbigpe09iamVjdC5rZXlzKGUuZWxlbWVudHMpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPWUuZWxlbWVudHNbdF0scz1lLmF0dHJpYnV0ZXNbdF18fHt9LG89T2JqZWN0LmtleXMoZS5zdHlsZXMuaGFzT3duUHJvcGVydHkodCk/ZS5zdHlsZXNbdF06aVt0XSkucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiB0W2VdPVwiXCIsdH0pLHt9KTt6dChuKSYmV3QobikmJihPYmplY3QuYXNzaWduKG4uc3R5bGUsbyksT2JqZWN0LmtleXMocykuZm9yRWFjaCgoZnVuY3Rpb24odCl7bi5yZW1vdmVBdHRyaWJ1dGUodCl9KSkpfSkpfX0scmVxdWlyZXM6W1wiY29tcHV0ZVN0eWxlc1wiXX07ZnVuY3Rpb24gVnQodCl7cmV0dXJuIHQuc3BsaXQoXCItXCIpWzBdfXZhciBLdD1NYXRoLm1heCxRdD1NYXRoLm1pbixYdD1NYXRoLnJvdW5kO2Z1bmN0aW9uIFl0KCl7dmFyIHQ9bmF2aWdhdG9yLnVzZXJBZ2VudERhdGE7cmV0dXJuIG51bGwhPXQmJnQuYnJhbmRzP3QuYnJhbmRzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuYnJhbmQrXCIvXCIrdC52ZXJzaW9ufSkpLmpvaW4oXCIgXCIpOm5hdmlnYXRvci51c2VyQWdlbnR9ZnVuY3Rpb24gVXQoKXtyZXR1cm4hL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChZdCgpKX1mdW5jdGlvbiBHdCh0LGUsaSl7dm9pZCAwPT09ZSYmKGU9ITEpLHZvaWQgMD09PWkmJihpPSExKTt2YXIgbj10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHM9MSxvPTE7ZSYmenQodCkmJihzPXQub2Zmc2V0V2lkdGg+MCYmWHQobi53aWR0aCkvdC5vZmZzZXRXaWR0aHx8MSxvPXQub2Zmc2V0SGVpZ2h0PjAmJlh0KG4uaGVpZ2h0KS90Lm9mZnNldEhlaWdodHx8MSk7dmFyIHI9KEZ0KHQpP0J0KHQpOndpbmRvdykudmlzdWFsVmlld3BvcnQsYT0hVXQoKSYmaSxsPShuLmxlZnQrKGEmJnI/ci5vZmZzZXRMZWZ0OjApKS9zLGM9KG4udG9wKyhhJiZyP3Iub2Zmc2V0VG9wOjApKS9vLGg9bi53aWR0aC9zLGQ9bi5oZWlnaHQvbztyZXR1cm57d2lkdGg6aCxoZWlnaHQ6ZCx0b3A6YyxyaWdodDpsK2gsYm90dG9tOmMrZCxsZWZ0OmwseDpsLHk6Y319ZnVuY3Rpb24gSnQodCl7dmFyIGU9R3QodCksaT10Lm9mZnNldFdpZHRoLG49dC5vZmZzZXRIZWlnaHQ7cmV0dXJuIE1hdGguYWJzKGUud2lkdGgtaSk8PTEmJihpPWUud2lkdGgpLE1hdGguYWJzKGUuaGVpZ2h0LW4pPD0xJiYobj1lLmhlaWdodCkse3g6dC5vZmZzZXRMZWZ0LHk6dC5vZmZzZXRUb3Asd2lkdGg6aSxoZWlnaHQ6bn19ZnVuY3Rpb24gWnQodCxlKXt2YXIgaT1lLmdldFJvb3ROb2RlJiZlLmdldFJvb3ROb2RlKCk7aWYodC5jb250YWlucyhlKSlyZXR1cm4hMDtpZihpJiZxdChpKSl7dmFyIG49ZTtkb3tpZihuJiZ0LmlzU2FtZU5vZGUobikpcmV0dXJuITA7bj1uLnBhcmVudE5vZGV8fG4uaG9zdH13aGlsZShuKX1yZXR1cm4hMX1mdW5jdGlvbiB0ZSh0KXtyZXR1cm4gQnQodCkuZ2V0Q29tcHV0ZWRTdHlsZSh0KX1mdW5jdGlvbiBlZSh0KXtyZXR1cm5bXCJ0YWJsZVwiLFwidGRcIixcInRoXCJdLmluZGV4T2YoV3QodCkpPj0wfWZ1bmN0aW9uIGllKHQpe3JldHVybigoRnQodCk/dC5vd25lckRvY3VtZW50OnQuZG9jdW1lbnQpfHx3aW5kb3cuZG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudH1mdW5jdGlvbiBuZSh0KXtyZXR1cm5cImh0bWxcIj09PVd0KHQpP3Q6dC5hc3NpZ25lZFNsb3R8fHQucGFyZW50Tm9kZXx8KHF0KHQpP3QuaG9zdDpudWxsKXx8aWUodCl9ZnVuY3Rpb24gc2UodCl7cmV0dXJuIHp0KHQpJiZcImZpeGVkXCIhPT10ZSh0KS5wb3NpdGlvbj90Lm9mZnNldFBhcmVudDpudWxsfWZ1bmN0aW9uIG9lKHQpe2Zvcih2YXIgZT1CdCh0KSxpPXNlKHQpO2kmJmVlKGkpJiZcInN0YXRpY1wiPT09dGUoaSkucG9zaXRpb247KWk9c2UoaSk7cmV0dXJuIGkmJihcImh0bWxcIj09PVd0KGkpfHxcImJvZHlcIj09PVd0KGkpJiZcInN0YXRpY1wiPT09dGUoaSkucG9zaXRpb24pP2U6aXx8ZnVuY3Rpb24odCl7dmFyIGU9L2ZpcmVmb3gvaS50ZXN0KFl0KCkpO2lmKC9UcmlkZW50L2kudGVzdChZdCgpKSYmenQodCkmJlwiZml4ZWRcIj09PXRlKHQpLnBvc2l0aW9uKXJldHVybiBudWxsO3ZhciBpPW5lKHQpO2ZvcihxdChpKSYmKGk9aS5ob3N0KTt6dChpKSYmW1wiaHRtbFwiLFwiYm9keVwiXS5pbmRleE9mKFd0KGkpKTwwOyl7dmFyIG49dGUoaSk7aWYoXCJub25lXCIhPT1uLnRyYW5zZm9ybXx8XCJub25lXCIhPT1uLnBlcnNwZWN0aXZlfHxcInBhaW50XCI9PT1uLmNvbnRhaW58fC0xIT09W1widHJhbnNmb3JtXCIsXCJwZXJzcGVjdGl2ZVwiXS5pbmRleE9mKG4ud2lsbENoYW5nZSl8fGUmJlwiZmlsdGVyXCI9PT1uLndpbGxDaGFuZ2V8fGUmJm4uZmlsdGVyJiZcIm5vbmVcIiE9PW4uZmlsdGVyKXJldHVybiBpO2k9aS5wYXJlbnROb2RlfXJldHVybiBudWxsfSh0KXx8ZX1mdW5jdGlvbiByZSh0KXtyZXR1cm5bXCJ0b3BcIixcImJvdHRvbVwiXS5pbmRleE9mKHQpPj0wP1wieFwiOlwieVwifWZ1bmN0aW9uIGFlKHQsZSxpKXtyZXR1cm4gS3QodCxRdChlLGkpKX1mdW5jdGlvbiBsZSh0KXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSx7dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9LHQpfWZ1bmN0aW9uIGNlKHQsZSl7cmV0dXJuIGUucmVkdWNlKChmdW5jdGlvbihlLGkpe3JldHVybiBlW2ldPXQsZX0pLHt9KX1jb25zdCBoZT17bmFtZTpcImFycm93XCIsZW5hYmxlZDohMCxwaGFzZTpcIm1haW5cIixmbjpmdW5jdGlvbih0KXt2YXIgZSxpPXQuc3RhdGUsbj10Lm5hbWUscz10Lm9wdGlvbnMsbz1pLmVsZW1lbnRzLmFycm93LHI9aS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMsYT1WdChpLnBsYWNlbWVudCksbD1yZShhKSxjPVtidCxfdF0uaW5kZXhPZihhKT49MD9cImhlaWdodFwiOlwid2lkdGhcIjtpZihvJiZyKXt2YXIgaD1mdW5jdGlvbih0LGUpe3JldHVybiBsZShcIm51bWJlclwiIT10eXBlb2YodD1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3QoT2JqZWN0LmFzc2lnbih7fSxlLnJlY3RzLHtwbGFjZW1lbnQ6ZS5wbGFjZW1lbnR9KSk6dCk/dDpjZSh0LHl0KSl9KHMucGFkZGluZyxpKSxkPUp0KG8pLHU9XCJ5XCI9PT1sP2d0OmJ0LGY9XCJ5XCI9PT1sP210Ol90LHA9aS5yZWN0cy5yZWZlcmVuY2VbY10raS5yZWN0cy5yZWZlcmVuY2VbbF0tcltsXS1pLnJlY3RzLnBvcHBlcltjXSxnPXJbbF0taS5yZWN0cy5yZWZlcmVuY2VbbF0sbT1vZShvKSxfPW0/XCJ5XCI9PT1sP20uY2xpZW50SGVpZ2h0fHwwOm0uY2xpZW50V2lkdGh8fDA6MCxiPXAvMi1nLzIsdj1oW3VdLHk9Xy1kW2NdLWhbZl0sdz1fLzItZFtjXS8yK2IsQT1hZSh2LHcseSksRT1sO2kubW9kaWZpZXJzRGF0YVtuXT0oKGU9e30pW0VdPUEsZS5jZW50ZXJPZmZzZXQ9QS13LGUpfX0sZWZmZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuc3RhdGUsaT10Lm9wdGlvbnMuZWxlbWVudCxuPXZvaWQgMD09PWk/XCJbZGF0YS1wb3BwZXItYXJyb3ddXCI6aTtudWxsIT1uJiYoXCJzdHJpbmdcIiE9dHlwZW9mIG58fChuPWUuZWxlbWVudHMucG9wcGVyLnF1ZXJ5U2VsZWN0b3IobikpKSYmWnQoZS5lbGVtZW50cy5wb3BwZXIsbikmJihlLmVsZW1lbnRzLmFycm93PW4pfSxyZXF1aXJlczpbXCJwb3BwZXJPZmZzZXRzXCJdLHJlcXVpcmVzSWZFeGlzdHM6W1wicHJldmVudE92ZXJmbG93XCJdfTtmdW5jdGlvbiBkZSh0KXtyZXR1cm4gdC5zcGxpdChcIi1cIilbMV19dmFyIHVlPXt0b3A6XCJhdXRvXCIscmlnaHQ6XCJhdXRvXCIsYm90dG9tOlwiYXV0b1wiLGxlZnQ6XCJhdXRvXCJ9O2Z1bmN0aW9uIGZlKHQpe3ZhciBlLGk9dC5wb3BwZXIsbj10LnBvcHBlclJlY3Qscz10LnBsYWNlbWVudCxvPXQudmFyaWF0aW9uLHI9dC5vZmZzZXRzLGE9dC5wb3NpdGlvbixsPXQuZ3B1QWNjZWxlcmF0aW9uLGM9dC5hZGFwdGl2ZSxoPXQucm91bmRPZmZzZXRzLGQ9dC5pc0ZpeGVkLHU9ci54LGY9dm9pZCAwPT09dT8wOnUscD1yLnksZz12b2lkIDA9PT1wPzA6cCxtPVwiZnVuY3Rpb25cIj09dHlwZW9mIGg/aCh7eDpmLHk6Z30pOnt4OmYseTpnfTtmPW0ueCxnPW0ueTt2YXIgXz1yLmhhc093blByb3BlcnR5KFwieFwiKSxiPXIuaGFzT3duUHJvcGVydHkoXCJ5XCIpLHY9YnQseT1ndCx3PXdpbmRvdztpZihjKXt2YXIgQT1vZShpKSxFPVwiY2xpZW50SGVpZ2h0XCIsVD1cImNsaWVudFdpZHRoXCI7QT09PUJ0KGkpJiZcInN0YXRpY1wiIT09dGUoQT1pZShpKSkucG9zaXRpb24mJlwiYWJzb2x1dGVcIj09PWEmJihFPVwic2Nyb2xsSGVpZ2h0XCIsVD1cInNjcm9sbFdpZHRoXCIpLChzPT09Z3R8fChzPT09YnR8fHM9PT1fdCkmJm89PT1BdCkmJih5PW10LGctPShkJiZBPT09dyYmdy52aXN1YWxWaWV3cG9ydD93LnZpc3VhbFZpZXdwb3J0LmhlaWdodDpBW0VdKS1uLmhlaWdodCxnKj1sPzE6LTEpLHMhPT1idCYmKHMhPT1ndCYmcyE9PW10fHxvIT09QXQpfHwodj1fdCxmLT0oZCYmQT09PXcmJncudmlzdWFsVmlld3BvcnQ/dy52aXN1YWxWaWV3cG9ydC53aWR0aDpBW1RdKS1uLndpZHRoLGYqPWw/MTotMSl9dmFyIEMsTz1PYmplY3QuYXNzaWduKHtwb3NpdGlvbjphfSxjJiZ1ZSkseD0hMD09PWg/ZnVuY3Rpb24odCl7dmFyIGU9dC54LGk9dC55LG49d2luZG93LmRldmljZVBpeGVsUmF0aW98fDE7cmV0dXJue3g6WHQoZSpuKS9ufHwwLHk6WHQoaSpuKS9ufHwwfX0oe3g6Zix5Omd9KTp7eDpmLHk6Z307cmV0dXJuIGY9eC54LGc9eC55LGw/T2JqZWN0LmFzc2lnbih7fSxPLCgoQz17fSlbeV09Yj9cIjBcIjpcIlwiLENbdl09Xz9cIjBcIjpcIlwiLEMudHJhbnNmb3JtPSh3LmRldmljZVBpeGVsUmF0aW98fDEpPD0xP1widHJhbnNsYXRlKFwiK2YrXCJweCwgXCIrZytcInB4KVwiOlwidHJhbnNsYXRlM2QoXCIrZitcInB4LCBcIitnK1wicHgsIDApXCIsQykpOk9iamVjdC5hc3NpZ24oe30sTywoKGU9e30pW3ldPWI/ZytcInB4XCI6XCJcIixlW3ZdPV8/ZitcInB4XCI6XCJcIixlLnRyYW5zZm9ybT1cIlwiLGUpKX1jb25zdCBwZT17bmFtZTpcImNvbXB1dGVTdHlsZXNcIixlbmFibGVkOiEwLHBoYXNlOlwiYmVmb3JlV3JpdGVcIixmbjpmdW5jdGlvbih0KXt2YXIgZT10LnN0YXRlLGk9dC5vcHRpb25zLG49aS5ncHVBY2NlbGVyYXRpb24scz12b2lkIDA9PT1ufHxuLG89aS5hZGFwdGl2ZSxyPXZvaWQgMD09PW98fG8sYT1pLnJvdW5kT2Zmc2V0cyxsPXZvaWQgMD09PWF8fGEsYz17cGxhY2VtZW50OlZ0KGUucGxhY2VtZW50KSx2YXJpYXRpb246ZGUoZS5wbGFjZW1lbnQpLHBvcHBlcjplLmVsZW1lbnRzLnBvcHBlcixwb3BwZXJSZWN0OmUucmVjdHMucG9wcGVyLGdwdUFjY2VsZXJhdGlvbjpzLGlzRml4ZWQ6XCJmaXhlZFwiPT09ZS5vcHRpb25zLnN0cmF0ZWd5fTtudWxsIT1lLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyYmKGUuc3R5bGVzLnBvcHBlcj1PYmplY3QuYXNzaWduKHt9LGUuc3R5bGVzLnBvcHBlcixmZShPYmplY3QuYXNzaWduKHt9LGMse29mZnNldHM6ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMscG9zaXRpb246ZS5vcHRpb25zLnN0cmF0ZWd5LGFkYXB0aXZlOnIscm91bmRPZmZzZXRzOmx9KSkpKSxudWxsIT1lLm1vZGlmaWVyc0RhdGEuYXJyb3cmJihlLnN0eWxlcy5hcnJvdz1PYmplY3QuYXNzaWduKHt9LGUuc3R5bGVzLmFycm93LGZlKE9iamVjdC5hc3NpZ24oe30sYyx7b2Zmc2V0czplLm1vZGlmaWVyc0RhdGEuYXJyb3cscG9zaXRpb246XCJhYnNvbHV0ZVwiLGFkYXB0aXZlOiExLHJvdW5kT2Zmc2V0czpsfSkpKSksZS5hdHRyaWJ1dGVzLnBvcHBlcj1PYmplY3QuYXNzaWduKHt9LGUuYXR0cmlidXRlcy5wb3BwZXIse1wiZGF0YS1wb3BwZXItcGxhY2VtZW50XCI6ZS5wbGFjZW1lbnR9KX0sZGF0YTp7fX07dmFyIGdlPXtwYXNzaXZlOiEwfTtjb25zdCBtZT17bmFtZTpcImV2ZW50TGlzdGVuZXJzXCIsZW5hYmxlZDohMCxwaGFzZTpcIndyaXRlXCIsZm46ZnVuY3Rpb24oKXt9LGVmZmVjdDpmdW5jdGlvbih0KXt2YXIgZT10LnN0YXRlLGk9dC5pbnN0YW5jZSxuPXQub3B0aW9ucyxzPW4uc2Nyb2xsLG89dm9pZCAwPT09c3x8cyxyPW4ucmVzaXplLGE9dm9pZCAwPT09cnx8cixsPUJ0KGUuZWxlbWVudHMucG9wcGVyKSxjPVtdLmNvbmNhdChlLnNjcm9sbFBhcmVudHMucmVmZXJlbmNlLGUuc2Nyb2xsUGFyZW50cy5wb3BwZXIpO3JldHVybiBvJiZjLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLGkudXBkYXRlLGdlKX0pKSxhJiZsLmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIixpLnVwZGF0ZSxnZSksZnVuY3Rpb24oKXtvJiZjLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLGkudXBkYXRlLGdlKX0pKSxhJiZsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIixpLnVwZGF0ZSxnZSl9fSxkYXRhOnt9fTt2YXIgX2U9e2xlZnQ6XCJyaWdodFwiLHJpZ2h0OlwibGVmdFwiLGJvdHRvbTpcInRvcFwiLHRvcDpcImJvdHRvbVwifTtmdW5jdGlvbiBiZSh0KXtyZXR1cm4gdC5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZywoZnVuY3Rpb24odCl7cmV0dXJuIF9lW3RdfSkpfXZhciB2ZT17c3RhcnQ6XCJlbmRcIixlbmQ6XCJzdGFydFwifTtmdW5jdGlvbiB5ZSh0KXtyZXR1cm4gdC5yZXBsYWNlKC9zdGFydHxlbmQvZywoZnVuY3Rpb24odCl7cmV0dXJuIHZlW3RdfSkpfWZ1bmN0aW9uIHdlKHQpe3ZhciBlPUJ0KHQpO3JldHVybntzY3JvbGxMZWZ0OmUucGFnZVhPZmZzZXQsc2Nyb2xsVG9wOmUucGFnZVlPZmZzZXR9fWZ1bmN0aW9uIEFlKHQpe3JldHVybiBHdChpZSh0KSkubGVmdCt3ZSh0KS5zY3JvbGxMZWZ0fWZ1bmN0aW9uIEVlKHQpe3ZhciBlPXRlKHQpLGk9ZS5vdmVyZmxvdyxuPWUub3ZlcmZsb3dYLHM9ZS5vdmVyZmxvd1k7cmV0dXJuL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVuLy50ZXN0KGkrcytuKX1mdW5jdGlvbiBUZSh0KXtyZXR1cm5bXCJodG1sXCIsXCJib2R5XCIsXCIjZG9jdW1lbnRcIl0uaW5kZXhPZihXdCh0KSk+PTA/dC5vd25lckRvY3VtZW50LmJvZHk6enQodCkmJkVlKHQpP3Q6VGUobmUodCkpfWZ1bmN0aW9uIENlKHQsZSl7dmFyIGk7dm9pZCAwPT09ZSYmKGU9W10pO3ZhciBuPVRlKHQpLHM9bj09PShudWxsPT0oaT10Lm93bmVyRG9jdW1lbnQpP3ZvaWQgMDppLmJvZHkpLG89QnQobikscj1zP1tvXS5jb25jYXQoby52aXN1YWxWaWV3cG9ydHx8W10sRWUobik/bjpbXSk6bixhPWUuY29uY2F0KHIpO3JldHVybiBzP2E6YS5jb25jYXQoQ2UobmUocikpKX1mdW5jdGlvbiBPZSh0KXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSx0LHtsZWZ0OnQueCx0b3A6dC55LHJpZ2h0OnQueCt0LndpZHRoLGJvdHRvbTp0LnkrdC5oZWlnaHR9KX1mdW5jdGlvbiB4ZSh0LGUsaSl7cmV0dXJuIGU9PT1UdD9PZShmdW5jdGlvbih0LGUpe3ZhciBpPUJ0KHQpLG49aWUodCkscz1pLnZpc3VhbFZpZXdwb3J0LG89bi5jbGllbnRXaWR0aCxyPW4uY2xpZW50SGVpZ2h0LGE9MCxsPTA7aWYocyl7bz1zLndpZHRoLHI9cy5oZWlnaHQ7dmFyIGM9VXQoKTsoY3x8IWMmJlwiZml4ZWRcIj09PWUpJiYoYT1zLm9mZnNldExlZnQsbD1zLm9mZnNldFRvcCl9cmV0dXJue3dpZHRoOm8saGVpZ2h0OnIseDphK0FlKHQpLHk6bH19KHQsaSkpOkZ0KGUpP2Z1bmN0aW9uKHQsZSl7dmFyIGk9R3QodCwhMSxcImZpeGVkXCI9PT1lKTtyZXR1cm4gaS50b3A9aS50b3ArdC5jbGllbnRUb3AsaS5sZWZ0PWkubGVmdCt0LmNsaWVudExlZnQsaS5ib3R0b209aS50b3ArdC5jbGllbnRIZWlnaHQsaS5yaWdodD1pLmxlZnQrdC5jbGllbnRXaWR0aCxpLndpZHRoPXQuY2xpZW50V2lkdGgsaS5oZWlnaHQ9dC5jbGllbnRIZWlnaHQsaS54PWkubGVmdCxpLnk9aS50b3AsaX0oZSxpKTpPZShmdW5jdGlvbih0KXt2YXIgZSxpPWllKHQpLG49d2UodCkscz1udWxsPT0oZT10Lm93bmVyRG9jdW1lbnQpP3ZvaWQgMDplLmJvZHksbz1LdChpLnNjcm9sbFdpZHRoLGkuY2xpZW50V2lkdGgscz9zLnNjcm9sbFdpZHRoOjAscz9zLmNsaWVudFdpZHRoOjApLHI9S3QoaS5zY3JvbGxIZWlnaHQsaS5jbGllbnRIZWlnaHQscz9zLnNjcm9sbEhlaWdodDowLHM/cy5jbGllbnRIZWlnaHQ6MCksYT0tbi5zY3JvbGxMZWZ0K0FlKHQpLGw9LW4uc2Nyb2xsVG9wO3JldHVyblwicnRsXCI9PT10ZShzfHxpKS5kaXJlY3Rpb24mJihhKz1LdChpLmNsaWVudFdpZHRoLHM/cy5jbGllbnRXaWR0aDowKS1vKSx7d2lkdGg6byxoZWlnaHQ6cix4OmEseTpsfX0oaWUodCkpKX1mdW5jdGlvbiBrZSh0KXt2YXIgZSxpPXQucmVmZXJlbmNlLG49dC5lbGVtZW50LHM9dC5wbGFjZW1lbnQsbz1zP1Z0KHMpOm51bGwscj1zP2RlKHMpOm51bGwsYT1pLngraS53aWR0aC8yLW4ud2lkdGgvMixsPWkueStpLmhlaWdodC8yLW4uaGVpZ2h0LzI7c3dpdGNoKG8pe2Nhc2UgZ3Q6ZT17eDphLHk6aS55LW4uaGVpZ2h0fTticmVhaztjYXNlIG10OmU9e3g6YSx5OmkueStpLmhlaWdodH07YnJlYWs7Y2FzZSBfdDplPXt4OmkueCtpLndpZHRoLHk6bH07YnJlYWs7Y2FzZSBidDplPXt4OmkueC1uLndpZHRoLHk6bH07YnJlYWs7ZGVmYXVsdDplPXt4OmkueCx5OmkueX19dmFyIGM9bz9yZShvKTpudWxsO2lmKG51bGwhPWMpe3ZhciBoPVwieVwiPT09Yz9cImhlaWdodFwiOlwid2lkdGhcIjtzd2l0Y2gocil7Y2FzZSB3dDplW2NdPWVbY10tKGlbaF0vMi1uW2hdLzIpO2JyZWFrO2Nhc2UgQXQ6ZVtjXT1lW2NdKyhpW2hdLzItbltoXS8yKX19cmV0dXJuIGV9ZnVuY3Rpb24gTGUodCxlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIGk9ZSxuPWkucGxhY2VtZW50LHM9dm9pZCAwPT09bj90LnBsYWNlbWVudDpuLG89aS5zdHJhdGVneSxyPXZvaWQgMD09PW8/dC5zdHJhdGVneTpvLGE9aS5ib3VuZGFyeSxsPXZvaWQgMD09PWE/RXQ6YSxjPWkucm9vdEJvdW5kYXJ5LGg9dm9pZCAwPT09Yz9UdDpjLGQ9aS5lbGVtZW50Q29udGV4dCx1PXZvaWQgMD09PWQ/Q3Q6ZCxmPWkuYWx0Qm91bmRhcnkscD12b2lkIDAhPT1mJiZmLGc9aS5wYWRkaW5nLG09dm9pZCAwPT09Zz8wOmcsXz1sZShcIm51bWJlclwiIT10eXBlb2YgbT9tOmNlKG0seXQpKSxiPXU9PT1DdD9PdDpDdCx2PXQucmVjdHMucG9wcGVyLHk9dC5lbGVtZW50c1twP2I6dV0sdz1mdW5jdGlvbih0LGUsaSxuKXt2YXIgcz1cImNsaXBwaW5nUGFyZW50c1wiPT09ZT9mdW5jdGlvbih0KXt2YXIgZT1DZShuZSh0KSksaT1bXCJhYnNvbHV0ZVwiLFwiZml4ZWRcIl0uaW5kZXhPZih0ZSh0KS5wb3NpdGlvbik+PTAmJnp0KHQpP29lKHQpOnQ7cmV0dXJuIEZ0KGkpP2UuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gRnQodCkmJlp0KHQsaSkmJlwiYm9keVwiIT09V3QodCl9KSk6W119KHQpOltdLmNvbmNhdChlKSxvPVtdLmNvbmNhdChzLFtpXSkscj1vWzBdLGE9by5yZWR1Y2UoKGZ1bmN0aW9uKGUsaSl7dmFyIHM9eGUodCxpLG4pO3JldHVybiBlLnRvcD1LdChzLnRvcCxlLnRvcCksZS5yaWdodD1RdChzLnJpZ2h0LGUucmlnaHQpLGUuYm90dG9tPVF0KHMuYm90dG9tLGUuYm90dG9tKSxlLmxlZnQ9S3Qocy5sZWZ0LGUubGVmdCksZX0pLHhlKHQscixuKSk7cmV0dXJuIGEud2lkdGg9YS5yaWdodC1hLmxlZnQsYS5oZWlnaHQ9YS5ib3R0b20tYS50b3AsYS54PWEubGVmdCxhLnk9YS50b3AsYX0oRnQoeSk/eTp5LmNvbnRleHRFbGVtZW50fHxpZSh0LmVsZW1lbnRzLnBvcHBlciksbCxoLHIpLEE9R3QodC5lbGVtZW50cy5yZWZlcmVuY2UpLEU9a2Uoe3JlZmVyZW5jZTpBLGVsZW1lbnQ6dixzdHJhdGVneTpcImFic29sdXRlXCIscGxhY2VtZW50OnN9KSxUPU9lKE9iamVjdC5hc3NpZ24oe30sdixFKSksQz11PT09Q3Q/VDpBLE89e3RvcDp3LnRvcC1DLnRvcCtfLnRvcCxib3R0b206Qy5ib3R0b20tdy5ib3R0b20rXy5ib3R0b20sbGVmdDp3LmxlZnQtQy5sZWZ0K18ubGVmdCxyaWdodDpDLnJpZ2h0LXcucmlnaHQrXy5yaWdodH0seD10Lm1vZGlmaWVyc0RhdGEub2Zmc2V0O2lmKHU9PT1DdCYmeCl7dmFyIGs9eFtzXTtPYmplY3Qua2V5cyhPKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1bX3QsbXRdLmluZGV4T2YodCk+PTA/MTotMSxpPVtndCxtdF0uaW5kZXhPZih0KT49MD9cInlcIjpcInhcIjtPW3RdKz1rW2ldKmV9KSl9cmV0dXJuIE99ZnVuY3Rpb24gRGUodCxlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIGk9ZSxuPWkucGxhY2VtZW50LHM9aS5ib3VuZGFyeSxvPWkucm9vdEJvdW5kYXJ5LHI9aS5wYWRkaW5nLGE9aS5mbGlwVmFyaWF0aW9ucyxsPWkuYWxsb3dlZEF1dG9QbGFjZW1lbnRzLGM9dm9pZCAwPT09bD9rdDpsLGg9ZGUobiksZD1oP2E/eHQ6eHQuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gZGUodCk9PT1ofSkpOnl0LHU9ZC5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBjLmluZGV4T2YodCk+PTB9KSk7MD09PXUubGVuZ3RoJiYodT1kKTt2YXIgZj11LnJlZHVjZSgoZnVuY3Rpb24oZSxpKXtyZXR1cm4gZVtpXT1MZSh0LHtwbGFjZW1lbnQ6aSxib3VuZGFyeTpzLHJvb3RCb3VuZGFyeTpvLHBhZGRpbmc6cn0pW1Z0KGkpXSxlfSkse30pO3JldHVybiBPYmplY3Qua2V5cyhmKS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBmW3RdLWZbZV19KSl9Y29uc3QgU2U9e25hbWU6XCJmbGlwXCIsZW5hYmxlZDohMCxwaGFzZTpcIm1haW5cIixmbjpmdW5jdGlvbih0KXt2YXIgZT10LnN0YXRlLGk9dC5vcHRpb25zLG49dC5uYW1lO2lmKCFlLm1vZGlmaWVyc0RhdGFbbl0uX3NraXApe2Zvcih2YXIgcz1pLm1haW5BeGlzLG89dm9pZCAwPT09c3x8cyxyPWkuYWx0QXhpcyxhPXZvaWQgMD09PXJ8fHIsbD1pLmZhbGxiYWNrUGxhY2VtZW50cyxjPWkucGFkZGluZyxoPWkuYm91bmRhcnksZD1pLnJvb3RCb3VuZGFyeSx1PWkuYWx0Qm91bmRhcnksZj1pLmZsaXBWYXJpYXRpb25zLHA9dm9pZCAwPT09Znx8ZixnPWkuYWxsb3dlZEF1dG9QbGFjZW1lbnRzLG09ZS5vcHRpb25zLnBsYWNlbWVudCxfPVZ0KG0pLGI9bHx8KF8hPT1tJiZwP2Z1bmN0aW9uKHQpe2lmKFZ0KHQpPT09dnQpcmV0dXJuW107dmFyIGU9YmUodCk7cmV0dXJuW3llKHQpLGUseWUoZSldfShtKTpbYmUobSldKSx2PVttXS5jb25jYXQoYikucmVkdWNlKChmdW5jdGlvbih0LGkpe3JldHVybiB0LmNvbmNhdChWdChpKT09PXZ0P0RlKGUse3BsYWNlbWVudDppLGJvdW5kYXJ5Omgscm9vdEJvdW5kYXJ5OmQscGFkZGluZzpjLGZsaXBWYXJpYXRpb25zOnAsYWxsb3dlZEF1dG9QbGFjZW1lbnRzOmd9KTppKX0pLFtdKSx5PWUucmVjdHMucmVmZXJlbmNlLHc9ZS5yZWN0cy5wb3BwZXIsQT1uZXcgTWFwLEU9ITAsVD12WzBdLEM9MDtDPHYubGVuZ3RoO0MrKyl7dmFyIE89dltDXSx4PVZ0KE8pLGs9ZGUoTyk9PT13dCxMPVtndCxtdF0uaW5kZXhPZih4KT49MCxEPUw/XCJ3aWR0aFwiOlwiaGVpZ2h0XCIsUz1MZShlLHtwbGFjZW1lbnQ6Tyxib3VuZGFyeTpoLHJvb3RCb3VuZGFyeTpkLGFsdEJvdW5kYXJ5OnUscGFkZGluZzpjfSksST1MP2s/X3Q6YnQ6az9tdDpndDt5W0RdPndbRF0mJihJPWJlKEkpKTt2YXIgTj1iZShJKSxQPVtdO2lmKG8mJlAucHVzaChTW3hdPD0wKSxhJiZQLnB1c2goU1tJXTw9MCxTW05dPD0wKSxQLmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKSl7VD1PLEU9ITE7YnJlYWt9QS5zZXQoTyxQKX1pZihFKWZvcih2YXIgaj1mdW5jdGlvbih0KXt2YXIgZT12LmZpbmQoKGZ1bmN0aW9uKGUpe3ZhciBpPUEuZ2V0KGUpO2lmKGkpcmV0dXJuIGkuc2xpY2UoMCx0KS5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSl9KSk7aWYoZSlyZXR1cm4gVD1lLFwiYnJlYWtcIn0sTT1wPzM6MTtNPjAmJlwiYnJlYWtcIiE9PWooTSk7TS0tKTtlLnBsYWNlbWVudCE9PVQmJihlLm1vZGlmaWVyc0RhdGFbbl0uX3NraXA9ITAsZS5wbGFjZW1lbnQ9VCxlLnJlc2V0PSEwKX19LHJlcXVpcmVzSWZFeGlzdHM6W1wib2Zmc2V0XCJdLGRhdGE6e19za2lwOiExfX07ZnVuY3Rpb24gSWUodCxlLGkpe3JldHVybiB2b2lkIDA9PT1pJiYoaT17eDowLHk6MH0pLHt0b3A6dC50b3AtZS5oZWlnaHQtaS55LHJpZ2h0OnQucmlnaHQtZS53aWR0aCtpLngsYm90dG9tOnQuYm90dG9tLWUuaGVpZ2h0K2kueSxsZWZ0OnQubGVmdC1lLndpZHRoLWkueH19ZnVuY3Rpb24gTmUodCl7cmV0dXJuW2d0LF90LG10LGJ0XS5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXT49MH0pKX1jb25zdCBQZT17bmFtZTpcImhpZGVcIixlbmFibGVkOiEwLHBoYXNlOlwibWFpblwiLHJlcXVpcmVzSWZFeGlzdHM6W1wicHJldmVudE92ZXJmbG93XCJdLGZuOmZ1bmN0aW9uKHQpe3ZhciBlPXQuc3RhdGUsaT10Lm5hbWUsbj1lLnJlY3RzLnJlZmVyZW5jZSxzPWUucmVjdHMucG9wcGVyLG89ZS5tb2RpZmllcnNEYXRhLnByZXZlbnRPdmVyZmxvdyxyPUxlKGUse2VsZW1lbnRDb250ZXh0OlwicmVmZXJlbmNlXCJ9KSxhPUxlKGUse2FsdEJvdW5kYXJ5OiEwfSksbD1JZShyLG4pLGM9SWUoYSxzLG8pLGg9TmUobCksZD1OZShjKTtlLm1vZGlmaWVyc0RhdGFbaV09e3JlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0czpsLHBvcHBlckVzY2FwZU9mZnNldHM6Yyxpc1JlZmVyZW5jZUhpZGRlbjpoLGhhc1BvcHBlckVzY2FwZWQ6ZH0sZS5hdHRyaWJ1dGVzLnBvcHBlcj1PYmplY3QuYXNzaWduKHt9LGUuYXR0cmlidXRlcy5wb3BwZXIse1wiZGF0YS1wb3BwZXItcmVmZXJlbmNlLWhpZGRlblwiOmgsXCJkYXRhLXBvcHBlci1lc2NhcGVkXCI6ZH0pfX0samU9e25hbWU6XCJvZmZzZXRcIixlbmFibGVkOiEwLHBoYXNlOlwibWFpblwiLHJlcXVpcmVzOltcInBvcHBlck9mZnNldHNcIl0sZm46ZnVuY3Rpb24odCl7dmFyIGU9dC5zdGF0ZSxpPXQub3B0aW9ucyxuPXQubmFtZSxzPWkub2Zmc2V0LG89dm9pZCAwPT09cz9bMCwwXTpzLHI9a3QucmVkdWNlKChmdW5jdGlvbih0LGkpe3JldHVybiB0W2ldPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbj1WdCh0KSxzPVtidCxndF0uaW5kZXhPZihuKT49MD8tMToxLG89XCJmdW5jdGlvblwiPT10eXBlb2YgaT9pKE9iamVjdC5hc3NpZ24oe30sZSx7cGxhY2VtZW50OnR9KSk6aSxyPW9bMF0sYT1vWzFdO3JldHVybiByPXJ8fDAsYT0oYXx8MCkqcyxbYnQsX3RdLmluZGV4T2Yobik+PTA/e3g6YSx5OnJ9Ont4OnIseTphfX0oaSxlLnJlY3RzLG8pLHR9KSx7fSksYT1yW2UucGxhY2VtZW50XSxsPWEueCxjPWEueTtudWxsIT1lLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyYmKGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLngrPWwsZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueSs9YyksZS5tb2RpZmllcnNEYXRhW25dPXJ9fSxNZT17bmFtZTpcInBvcHBlck9mZnNldHNcIixlbmFibGVkOiEwLHBoYXNlOlwicmVhZFwiLGZuOmZ1bmN0aW9uKHQpe3ZhciBlPXQuc3RhdGUsaT10Lm5hbWU7ZS5tb2RpZmllcnNEYXRhW2ldPWtlKHtyZWZlcmVuY2U6ZS5yZWN0cy5yZWZlcmVuY2UsZWxlbWVudDplLnJlY3RzLnBvcHBlcixzdHJhdGVneTpcImFic29sdXRlXCIscGxhY2VtZW50OmUucGxhY2VtZW50fSl9LGRhdGE6e319LEhlPXtuYW1lOlwicHJldmVudE92ZXJmbG93XCIsZW5hYmxlZDohMCxwaGFzZTpcIm1haW5cIixmbjpmdW5jdGlvbih0KXt2YXIgZT10LnN0YXRlLGk9dC5vcHRpb25zLG49dC5uYW1lLHM9aS5tYWluQXhpcyxvPXZvaWQgMD09PXN8fHMscj1pLmFsdEF4aXMsYT12b2lkIDAhPT1yJiZyLGw9aS5ib3VuZGFyeSxjPWkucm9vdEJvdW5kYXJ5LGg9aS5hbHRCb3VuZGFyeSxkPWkucGFkZGluZyx1PWkudGV0aGVyLGY9dm9pZCAwPT09dXx8dSxwPWkudGV0aGVyT2Zmc2V0LGc9dm9pZCAwPT09cD8wOnAsbT1MZShlLHtib3VuZGFyeTpsLHJvb3RCb3VuZGFyeTpjLHBhZGRpbmc6ZCxhbHRCb3VuZGFyeTpofSksXz1WdChlLnBsYWNlbWVudCksYj1kZShlLnBsYWNlbWVudCksdj0hYix5PXJlKF8pLHc9XCJ4XCI9PT15P1wieVwiOlwieFwiLEE9ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMsRT1lLnJlY3RzLnJlZmVyZW5jZSxUPWUucmVjdHMucG9wcGVyLEM9XCJmdW5jdGlvblwiPT10eXBlb2YgZz9nKE9iamVjdC5hc3NpZ24oe30sZS5yZWN0cyx7cGxhY2VtZW50OmUucGxhY2VtZW50fSkpOmcsTz1cIm51bWJlclwiPT10eXBlb2YgQz97bWFpbkF4aXM6QyxhbHRBeGlzOkN9Ok9iamVjdC5hc3NpZ24oe21haW5BeGlzOjAsYWx0QXhpczowfSxDKSx4PWUubW9kaWZpZXJzRGF0YS5vZmZzZXQ/ZS5tb2RpZmllcnNEYXRhLm9mZnNldFtlLnBsYWNlbWVudF06bnVsbCxrPXt4OjAseTowfTtpZihBKXtpZihvKXt2YXIgTCxEPVwieVwiPT09eT9ndDpidCxTPVwieVwiPT09eT9tdDpfdCxJPVwieVwiPT09eT9cImhlaWdodFwiOlwid2lkdGhcIixOPUFbeV0sUD1OK21bRF0saj1OLW1bU10sTT1mPy1UW0ldLzI6MCxIPWI9PT13dD9FW0ldOlRbSV0sJD1iPT09d3Q/LVRbSV06LUVbSV0sVz1lLmVsZW1lbnRzLmFycm93LEI9ZiYmVz9KdChXKTp7d2lkdGg6MCxoZWlnaHQ6MH0sRj1lLm1vZGlmaWVyc0RhdGFbXCJhcnJvdyNwZXJzaXN0ZW50XCJdP2UubW9kaWZpZXJzRGF0YVtcImFycm93I3BlcnNpc3RlbnRcIl0ucGFkZGluZzp7dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9LHo9RltEXSxxPUZbU10sUj1hZSgwLEVbSV0sQltJXSksVj12P0VbSV0vMi1NLVItei1PLm1haW5BeGlzOkgtUi16LU8ubWFpbkF4aXMsSz12Py1FW0ldLzIrTStSK3ErTy5tYWluQXhpczokK1IrcStPLm1haW5BeGlzLFE9ZS5lbGVtZW50cy5hcnJvdyYmb2UoZS5lbGVtZW50cy5hcnJvdyksWD1RP1wieVwiPT09eT9RLmNsaWVudFRvcHx8MDpRLmNsaWVudExlZnR8fDA6MCxZPW51bGwhPShMPW51bGw9PXg/dm9pZCAwOnhbeV0pP0w6MCxVPU4rSy1ZLEc9YWUoZj9RdChQLE4rVi1ZLVgpOlAsTixmP0t0KGosVSk6aik7QVt5XT1HLGtbeV09Ry1OfWlmKGEpe3ZhciBKLFo9XCJ4XCI9PT15P2d0OmJ0LHR0PVwieFwiPT09eT9tdDpfdCxldD1BW3ddLGl0PVwieVwiPT09dz9cImhlaWdodFwiOlwid2lkdGhcIixudD1ldCttW1pdLHN0PWV0LW1bdHRdLG90PS0xIT09W2d0LGJ0XS5pbmRleE9mKF8pLHJ0PW51bGwhPShKPW51bGw9PXg/dm9pZCAwOnhbd10pP0o6MCxhdD1vdD9udDpldC1FW2l0XS1UW2l0XS1ydCtPLmFsdEF4aXMsbHQ9b3Q/ZXQrRVtpdF0rVFtpdF0tcnQtTy5hbHRBeGlzOnN0LGN0PWYmJm90P2Z1bmN0aW9uKHQsZSxpKXt2YXIgbj1hZSh0LGUsaSk7cmV0dXJuIG4+aT9pOm59KGF0LGV0LGx0KTphZShmP2F0Om50LGV0LGY/bHQ6c3QpO0Fbd109Y3Qsa1t3XT1jdC1ldH1lLm1vZGlmaWVyc0RhdGFbbl09a319LHJlcXVpcmVzSWZFeGlzdHM6W1wib2Zmc2V0XCJdfTtmdW5jdGlvbiAkZSh0LGUsaSl7dm9pZCAwPT09aSYmKGk9ITEpO3ZhciBuLHMsbz16dChlKSxyPXp0KGUpJiZmdW5jdGlvbih0KXt2YXIgZT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGk9WHQoZS53aWR0aCkvdC5vZmZzZXRXaWR0aHx8MSxuPVh0KGUuaGVpZ2h0KS90Lm9mZnNldEhlaWdodHx8MTtyZXR1cm4gMSE9PWl8fDEhPT1ufShlKSxhPWllKGUpLGw9R3QodCxyLGkpLGM9e3Njcm9sbExlZnQ6MCxzY3JvbGxUb3A6MH0saD17eDowLHk6MH07cmV0dXJuKG98fCFvJiYhaSkmJigoXCJib2R5XCIhPT1XdChlKXx8RWUoYSkpJiYoYz0obj1lKSE9PUJ0KG4pJiZ6dChuKT97c2Nyb2xsTGVmdDoocz1uKS5zY3JvbGxMZWZ0LHNjcm9sbFRvcDpzLnNjcm9sbFRvcH06d2UobikpLHp0KGUpPygoaD1HdChlLCEwKSkueCs9ZS5jbGllbnRMZWZ0LGgueSs9ZS5jbGllbnRUb3ApOmEmJihoLng9QWUoYSkpKSx7eDpsLmxlZnQrYy5zY3JvbGxMZWZ0LWgueCx5OmwudG9wK2Muc2Nyb2xsVG9wLWgueSx3aWR0aDpsLndpZHRoLGhlaWdodDpsLmhlaWdodH19ZnVuY3Rpb24gV2UodCl7dmFyIGU9bmV3IE1hcCxpPW5ldyBTZXQsbj1bXTtmdW5jdGlvbiBzKHQpe2kuYWRkKHQubmFtZSksW10uY29uY2F0KHQucmVxdWlyZXN8fFtdLHQucmVxdWlyZXNJZkV4aXN0c3x8W10pLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCFpLmhhcyh0KSl7dmFyIG49ZS5nZXQodCk7biYmcyhuKX19KSksbi5wdXNoKHQpfXJldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2Uuc2V0KHQubmFtZSx0KX0pKSx0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuaGFzKHQubmFtZSl8fHModCl9KSksbn12YXIgQmU9e3BsYWNlbWVudDpcImJvdHRvbVwiLG1vZGlmaWVyczpbXSxzdHJhdGVneTpcImFic29sdXRlXCJ9O2Z1bmN0aW9uIEZlKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksaT0wO2k8dDtpKyspZVtpXT1hcmd1bWVudHNbaV07cmV0dXJuIWUuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuISh0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCl9KSl9ZnVuY3Rpb24gemUodCl7dm9pZCAwPT09dCYmKHQ9e30pO3ZhciBlPXQsaT1lLmRlZmF1bHRNb2RpZmllcnMsbj12b2lkIDA9PT1pP1tdOmkscz1lLmRlZmF1bHRPcHRpb25zLG89dm9pZCAwPT09cz9CZTpzO3JldHVybiBmdW5jdGlvbih0LGUsaSl7dm9pZCAwPT09aSYmKGk9byk7dmFyIHMscixhPXtwbGFjZW1lbnQ6XCJib3R0b21cIixvcmRlcmVkTW9kaWZpZXJzOltdLG9wdGlvbnM6T2JqZWN0LmFzc2lnbih7fSxCZSxvKSxtb2RpZmllcnNEYXRhOnt9LGVsZW1lbnRzOntyZWZlcmVuY2U6dCxwb3BwZXI6ZX0sYXR0cmlidXRlczp7fSxzdHlsZXM6e319LGw9W10sYz0hMSxoPXtzdGF0ZTphLHNldE9wdGlvbnM6ZnVuY3Rpb24oaSl7dmFyIHM9XCJmdW5jdGlvblwiPT10eXBlb2YgaT9pKGEub3B0aW9ucyk6aTtkKCksYS5vcHRpb25zPU9iamVjdC5hc3NpZ24oe30sbyxhLm9wdGlvbnMscyksYS5zY3JvbGxQYXJlbnRzPXtyZWZlcmVuY2U6RnQodCk/Q2UodCk6dC5jb250ZXh0RWxlbWVudD9DZSh0LmNvbnRleHRFbGVtZW50KTpbXSxwb3BwZXI6Q2UoZSl9O3ZhciByLGMsdT1mdW5jdGlvbih0KXt2YXIgZT1XZSh0KTtyZXR1cm4gJHQucmVkdWNlKChmdW5jdGlvbih0LGkpe3JldHVybiB0LmNvbmNhdChlLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQucGhhc2U9PT1pfSkpKX0pLFtdKX0oKHI9W10uY29uY2F0KG4sYS5vcHRpb25zLm1vZGlmaWVycyksYz1yLnJlZHVjZSgoZnVuY3Rpb24odCxlKXt2YXIgaT10W2UubmFtZV07cmV0dXJuIHRbZS5uYW1lXT1pP09iamVjdC5hc3NpZ24oe30saSxlLHtvcHRpb25zOk9iamVjdC5hc3NpZ24oe30saS5vcHRpb25zLGUub3B0aW9ucyksZGF0YTpPYmplY3QuYXNzaWduKHt9LGkuZGF0YSxlLmRhdGEpfSk6ZSx0fSkse30pLE9iamVjdC5rZXlzKGMpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGNbdF19KSkpKTtyZXR1cm4gYS5vcmRlcmVkTW9kaWZpZXJzPXUuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5lbmFibGVkfSkpLGEub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10Lm5hbWUsaT10Lm9wdGlvbnMsbj12b2lkIDA9PT1pP3t9Omkscz10LmVmZmVjdDtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBzKXt2YXIgbz1zKHtzdGF0ZTphLG5hbWU6ZSxpbnN0YW5jZTpoLG9wdGlvbnM6bn0pO2wucHVzaChvfHxmdW5jdGlvbigpe30pfX0pKSxoLnVwZGF0ZSgpfSxmb3JjZVVwZGF0ZTpmdW5jdGlvbigpe2lmKCFjKXt2YXIgdD1hLmVsZW1lbnRzLGU9dC5yZWZlcmVuY2UsaT10LnBvcHBlcjtpZihGZShlLGkpKXthLnJlY3RzPXtyZWZlcmVuY2U6JGUoZSxvZShpKSxcImZpeGVkXCI9PT1hLm9wdGlvbnMuc3RyYXRlZ3kpLHBvcHBlcjpKdChpKX0sYS5yZXNldD0hMSxhLnBsYWNlbWVudD1hLm9wdGlvbnMucGxhY2VtZW50LGEub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gYS5tb2RpZmllcnNEYXRhW3QubmFtZV09T2JqZWN0LmFzc2lnbih7fSx0LmRhdGEpfSkpO2Zvcih2YXIgbj0wO248YS5vcmRlcmVkTW9kaWZpZXJzLmxlbmd0aDtuKyspaWYoITAhPT1hLnJlc2V0KXt2YXIgcz1hLm9yZGVyZWRNb2RpZmllcnNbbl0sbz1zLmZuLHI9cy5vcHRpb25zLGw9dm9pZCAwPT09cj97fTpyLGQ9cy5uYW1lO1wiZnVuY3Rpb25cIj09dHlwZW9mIG8mJihhPW8oe3N0YXRlOmEsb3B0aW9uczpsLG5hbWU6ZCxpbnN0YW5jZTpofSl8fGEpfWVsc2UgYS5yZXNldD0hMSxuPS0xfX19LHVwZGF0ZToocz1mdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCl7aC5mb3JjZVVwZGF0ZSgpLHQoYSl9KSl9LGZ1bmN0aW9uKCl7cmV0dXJuIHJ8fChyPW5ldyBQcm9taXNlKChmdW5jdGlvbih0KXtQcm9taXNlLnJlc29sdmUoKS50aGVuKChmdW5jdGlvbigpe3I9dm9pZCAwLHQocygpKX0pKX0pKSkscn0pLGRlc3Ryb3k6ZnVuY3Rpb24oKXtkKCksYz0hMH19O2lmKCFGZSh0LGUpKXJldHVybiBoO2Z1bmN0aW9uIGQoKXtsLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0KCl9KSksbD1bXX1yZXR1cm4gaC5zZXRPcHRpb25zKGkpLnRoZW4oKGZ1bmN0aW9uKHQpeyFjJiZpLm9uRmlyc3RVcGRhdGUmJmkub25GaXJzdFVwZGF0ZSh0KX0pKSxofX12YXIgcWU9emUoKSxSZT16ZSh7ZGVmYXVsdE1vZGlmaWVyczpbbWUsTWUscGUsUnRdfSksVmU9emUoe2RlZmF1bHRNb2RpZmllcnM6W21lLE1lLHBlLFJ0LGplLFNlLEhlLGhlLFBlXX0pO2NvbnN0IEtlPU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbCxwb3BwZXJHZW5lcmF0b3I6emUsZGV0ZWN0T3ZlcmZsb3c6TGUsY3JlYXRlUG9wcGVyQmFzZTpxZSxjcmVhdGVQb3BwZXI6VmUsY3JlYXRlUG9wcGVyTGl0ZTpSZSx0b3A6Z3QsYm90dG9tOm10LHJpZ2h0Ol90LGxlZnQ6YnQsYXV0bzp2dCxiYXNlUGxhY2VtZW50czp5dCxzdGFydDp3dCxlbmQ6QXQsY2xpcHBpbmdQYXJlbnRzOkV0LHZpZXdwb3J0OlR0LHBvcHBlcjpDdCxyZWZlcmVuY2U6T3QsdmFyaWF0aW9uUGxhY2VtZW50czp4dCxwbGFjZW1lbnRzOmt0LGJlZm9yZVJlYWQ6THQscmVhZDpEdCxhZnRlclJlYWQ6U3QsYmVmb3JlTWFpbjpJdCxtYWluOk50LGFmdGVyTWFpbjpQdCxiZWZvcmVXcml0ZTpqdCx3cml0ZTpNdCxhZnRlcldyaXRlOkh0LG1vZGlmaWVyUGhhc2VzOiR0LGFwcGx5U3R5bGVzOlJ0LGFycm93OmhlLGNvbXB1dGVTdHlsZXM6cGUsZXZlbnRMaXN0ZW5lcnM6bWUsZmxpcDpTZSxoaWRlOlBlLG9mZnNldDpqZSxwb3BwZXJPZmZzZXRzOk1lLHByZXZlbnRPdmVyZmxvdzpIZX0sU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTpcIk1vZHVsZVwifSkpLFFlPVwiZHJvcGRvd25cIixYZT1cIkFycm93VXBcIixZZT1cIkFycm93RG93blwiLFVlPVwiY2xpY2suYnMuZHJvcGRvd24uZGF0YS1hcGlcIixHZT1cImtleWRvd24uYnMuZHJvcGRvd24uZGF0YS1hcGlcIixKZT1cInNob3dcIixaZT0nW2RhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIl06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCknLHRpPWAke1plfS5zaG93YCxlaT1cIi5kcm9wZG93bi1tZW51XCIsaWk9cCgpP1widG9wLWVuZFwiOlwidG9wLXN0YXJ0XCIsbmk9cCgpP1widG9wLXN0YXJ0XCI6XCJ0b3AtZW5kXCIsc2k9cCgpP1wiYm90dG9tLWVuZFwiOlwiYm90dG9tLXN0YXJ0XCIsb2k9cCgpP1wiYm90dG9tLXN0YXJ0XCI6XCJib3R0b20tZW5kXCIscmk9cCgpP1wibGVmdC1zdGFydFwiOlwicmlnaHQtc3RhcnRcIixhaT1wKCk/XCJyaWdodC1zdGFydFwiOlwibGVmdC1zdGFydFwiLGxpPXthdXRvQ2xvc2U6ITAsYm91bmRhcnk6XCJjbGlwcGluZ1BhcmVudHNcIixkaXNwbGF5OlwiZHluYW1pY1wiLG9mZnNldDpbMCwyXSxwb3BwZXJDb25maWc6bnVsbCxyZWZlcmVuY2U6XCJ0b2dnbGVcIn0sY2k9e2F1dG9DbG9zZTpcIihib29sZWFufHN0cmluZylcIixib3VuZGFyeTpcIihzdHJpbmd8ZWxlbWVudClcIixkaXNwbGF5Olwic3RyaW5nXCIsb2Zmc2V0OlwiKGFycmF5fHN0cmluZ3xmdW5jdGlvbilcIixwb3BwZXJDb25maWc6XCIobnVsbHxvYmplY3R8ZnVuY3Rpb24pXCIscmVmZXJlbmNlOlwiKHN0cmluZ3xlbGVtZW50fG9iamVjdClcIn07Y2xhc3MgaGkgZXh0ZW5kcyB6e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLl9wb3BwZXI9bnVsbCx0aGlzLl9wYXJlbnQ9dGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLHRoaXMuX21lbnU9US5uZXh0KHRoaXMuX2VsZW1lbnQsZWkpWzBdfHxRLnByZXYodGhpcy5fZWxlbWVudCxlaSlbMF18fFEuZmluZE9uZShlaSx0aGlzLl9wYXJlbnQpLHRoaXMuX2luTmF2YmFyPXRoaXMuX2RldGVjdE5hdmJhcigpfXN0YXRpYyBnZXQgRGVmYXVsdCgpe3JldHVybiBsaX1zdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCl7cmV0dXJuIGNpfXN0YXRpYyBnZXQgTkFNRSgpe3JldHVybiBRZX10b2dnbGUoKXtyZXR1cm4gdGhpcy5faXNTaG93bigpP3RoaXMuaGlkZSgpOnRoaXMuc2hvdygpfXNob3coKXtpZihsKHRoaXMuX2VsZW1lbnQpfHx0aGlzLl9pc1Nob3duKCkpcmV0dXJuO2NvbnN0IHQ9e3JlbGF0ZWRUYXJnZXQ6dGhpcy5fZWxlbWVudH07aWYoIVAudHJpZ2dlcih0aGlzLl9lbGVtZW50LFwic2hvdy5icy5kcm9wZG93blwiLHQpLmRlZmF1bHRQcmV2ZW50ZWQpe2lmKHRoaXMuX2NyZWF0ZVBvcHBlcigpLFwib250b3VjaHN0YXJ0XCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJiF0aGlzLl9wYXJlbnQuY2xvc2VzdChcIi5uYXZiYXItbmF2XCIpKWZvcihjb25zdCB0IG9mW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKVAub24odCxcIm1vdXNlb3ZlclwiLGgpO3RoaXMuX2VsZW1lbnQuZm9jdXMoKSx0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIiwhMCksdGhpcy5fbWVudS5jbGFzc0xpc3QuYWRkKEplKSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoSmUpLFAudHJpZ2dlcih0aGlzLl9lbGVtZW50LFwic2hvd24uYnMuZHJvcGRvd25cIix0KX19aGlkZSgpe2lmKGwodGhpcy5fZWxlbWVudCl8fCF0aGlzLl9pc1Nob3duKCkpcmV0dXJuO2NvbnN0IHQ9e3JlbGF0ZWRUYXJnZXQ6dGhpcy5fZWxlbWVudH07dGhpcy5fY29tcGxldGVIaWRlKHQpfWRpc3Bvc2UoKXt0aGlzLl9wb3BwZXImJnRoaXMuX3BvcHBlci5kZXN0cm95KCksc3VwZXIuZGlzcG9zZSgpfXVwZGF0ZSgpe3RoaXMuX2luTmF2YmFyPXRoaXMuX2RldGVjdE5hdmJhcigpLHRoaXMuX3BvcHBlciYmdGhpcy5fcG9wcGVyLnVwZGF0ZSgpfV9jb21wbGV0ZUhpZGUodCl7aWYoIVAudHJpZ2dlcih0aGlzLl9lbGVtZW50LFwiaGlkZS5icy5kcm9wZG93blwiLHQpLmRlZmF1bHRQcmV2ZW50ZWQpe2lmKFwib250b3VjaHN0YXJ0XCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpZm9yKGNvbnN0IHQgb2ZbXS5jb25jYXQoLi4uZG9jdW1lbnQuYm9keS5jaGlsZHJlbikpUC5vZmYodCxcIm1vdXNlb3ZlclwiLGgpO3RoaXMuX3BvcHBlciYmdGhpcy5fcG9wcGVyLmRlc3Ryb3koKSx0aGlzLl9tZW51LmNsYXNzTGlzdC5yZW1vdmUoSmUpLHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShKZSksdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIsXCJmYWxzZVwiKSxCLnJlbW92ZURhdGFBdHRyaWJ1dGUodGhpcy5fbWVudSxcInBvcHBlclwiKSxQLnRyaWdnZXIodGhpcy5fZWxlbWVudCxcImhpZGRlbi5icy5kcm9wZG93blwiLHQpfX1fZ2V0Q29uZmlnKHQpe2lmKFwib2JqZWN0XCI9PXR5cGVvZih0PXN1cGVyLl9nZXRDb25maWcodCkpLnJlZmVyZW5jZSYmIW8odC5yZWZlcmVuY2UpJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiB0LnJlZmVyZW5jZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtRZS50b1VwcGVyQ2FzZSgpfTogT3B0aW9uIFwicmVmZXJlbmNlXCIgcHJvdmlkZWQgdHlwZSBcIm9iamVjdFwiIHdpdGhvdXQgYSByZXF1aXJlZCBcImdldEJvdW5kaW5nQ2xpZW50UmVjdFwiIG1ldGhvZC5gKTtyZXR1cm4gdH1fY3JlYXRlUG9wcGVyKCl7aWYodm9pZCAwPT09S2UpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkJvb3RzdHJhcCdzIGRyb3Bkb3ducyByZXF1aXJlIFBvcHBlciAoaHR0cHM6Ly9wb3BwZXIuanMub3JnKVwiKTtsZXQgdD10aGlzLl9lbGVtZW50O1wicGFyZW50XCI9PT10aGlzLl9jb25maWcucmVmZXJlbmNlP3Q9dGhpcy5fcGFyZW50Om8odGhpcy5fY29uZmlnLnJlZmVyZW5jZSk/dD1yKHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UpOlwib2JqZWN0XCI9PXR5cGVvZiB0aGlzLl9jb25maWcucmVmZXJlbmNlJiYodD10aGlzLl9jb25maWcucmVmZXJlbmNlKTtjb25zdCBlPXRoaXMuX2dldFBvcHBlckNvbmZpZygpO3RoaXMuX3BvcHBlcj1WZSh0LHRoaXMuX21lbnUsZSl9X2lzU2hvd24oKXtyZXR1cm4gdGhpcy5fbWVudS5jbGFzc0xpc3QuY29udGFpbnMoSmUpfV9nZXRQbGFjZW1lbnQoKXtjb25zdCB0PXRoaXMuX3BhcmVudDtpZih0LmNsYXNzTGlzdC5jb250YWlucyhcImRyb3BlbmRcIikpcmV0dXJuIHJpO2lmKHQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZHJvcHN0YXJ0XCIpKXJldHVybiBhaTtpZih0LmNsYXNzTGlzdC5jb250YWlucyhcImRyb3B1cC1jZW50ZXJcIikpcmV0dXJuXCJ0b3BcIjtpZih0LmNsYXNzTGlzdC5jb250YWlucyhcImRyb3Bkb3duLWNlbnRlclwiKSlyZXR1cm5cImJvdHRvbVwiO2NvbnN0IGU9XCJlbmRcIj09PWdldENvbXB1dGVkU3R5bGUodGhpcy5fbWVudSkuZ2V0UHJvcGVydHlWYWx1ZShcIi0tYnMtcG9zaXRpb25cIikudHJpbSgpO3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucyhcImRyb3B1cFwiKT9lP25pOmlpOmU/b2k6c2l9X2RldGVjdE5hdmJhcigpe3JldHVybiBudWxsIT09dGhpcy5fZWxlbWVudC5jbG9zZXN0KFwiLm5hdmJhclwiKX1fZ2V0T2Zmc2V0KCl7Y29uc3R7b2Zmc2V0OnR9PXRoaXMuX2NvbmZpZztyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdD90LnNwbGl0KFwiLFwiKS5tYXAoKHQ9Pk51bWJlci5wYXJzZUludCh0LDEwKSkpOlwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/ZT0+dChlLHRoaXMuX2VsZW1lbnQpOnR9X2dldFBvcHBlckNvbmZpZygpe2NvbnN0IHQ9e3BsYWNlbWVudDp0aGlzLl9nZXRQbGFjZW1lbnQoKSxtb2RpZmllcnM6W3tuYW1lOlwicHJldmVudE92ZXJmbG93XCIsb3B0aW9uczp7Ym91bmRhcnk6dGhpcy5fY29uZmlnLmJvdW5kYXJ5fX0se25hbWU6XCJvZmZzZXRcIixvcHRpb25zOntvZmZzZXQ6dGhpcy5fZ2V0T2Zmc2V0KCl9fV19O3JldHVybih0aGlzLl9pbk5hdmJhcnx8XCJzdGF0aWNcIj09PXRoaXMuX2NvbmZpZy5kaXNwbGF5KSYmKEIuc2V0RGF0YUF0dHJpYnV0ZSh0aGlzLl9tZW51LFwicG9wcGVyXCIsXCJzdGF0aWNcIiksdC5tb2RpZmllcnM9W3tuYW1lOlwiYXBwbHlTdHlsZXNcIixlbmFibGVkOiExfV0pLHsuLi50LC4uLlwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWc/dGhpcy5fY29uZmlnLnBvcHBlckNvbmZpZyh0KTp0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnfX1fc2VsZWN0TWVudUl0ZW0oe2tleTp0LHRhcmdldDplfSl7Y29uc3QgaT1RLmZpbmQoXCIuZHJvcGRvd24tbWVudSAuZHJvcGRvd24taXRlbTpub3QoLmRpc2FibGVkKTpub3QoOmRpc2FibGVkKVwiLHRoaXMuX21lbnUpLmZpbHRlcigodD0+YSh0KSkpO2kubGVuZ3RoJiZiKGksZSx0PT09WWUsIWkuaW5jbHVkZXMoZSkpLmZvY3VzKCl9c3RhdGljIGpRdWVyeUludGVyZmFjZSh0KXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe2NvbnN0IGU9aGkuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLHQpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXtpZih2b2lkIDA9PT1lW3RdKXRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7dH1cImApO2VbdF0oKX19KSl9c3RhdGljIGNsZWFyTWVudXModCl7aWYoMj09PXQuYnV0dG9ufHxcImtleXVwXCI9PT10LnR5cGUmJlwiVGFiXCIhPT10LmtleSlyZXR1cm47Y29uc3QgZT1RLmZpbmQodGkpO2Zvcihjb25zdCBpIG9mIGUpe2NvbnN0IGU9aGkuZ2V0SW5zdGFuY2UoaSk7aWYoIWV8fCExPT09ZS5fY29uZmlnLmF1dG9DbG9zZSljb250aW51ZTtjb25zdCBuPXQuY29tcG9zZWRQYXRoKCkscz1uLmluY2x1ZGVzKGUuX21lbnUpO2lmKG4uaW5jbHVkZXMoZS5fZWxlbWVudCl8fFwiaW5zaWRlXCI9PT1lLl9jb25maWcuYXV0b0Nsb3NlJiYhc3x8XCJvdXRzaWRlXCI9PT1lLl9jb25maWcuYXV0b0Nsb3NlJiZzKWNvbnRpbnVlO2lmKGUuX21lbnUuY29udGFpbnModC50YXJnZXQpJiYoXCJrZXl1cFwiPT09dC50eXBlJiZcIlRhYlwiPT09dC5rZXl8fC9pbnB1dHxzZWxlY3R8b3B0aW9ufHRleHRhcmVhfGZvcm0vaS50ZXN0KHQudGFyZ2V0LnRhZ05hbWUpKSljb250aW51ZTtjb25zdCBvPXtyZWxhdGVkVGFyZ2V0OmUuX2VsZW1lbnR9O1wiY2xpY2tcIj09PXQudHlwZSYmKG8uY2xpY2tFdmVudD10KSxlLl9jb21wbGV0ZUhpZGUobyl9fXN0YXRpYyBkYXRhQXBpS2V5ZG93bkhhbmRsZXIodCl7Y29uc3QgZT0vaW5wdXR8dGV4dGFyZWEvaS50ZXN0KHQudGFyZ2V0LnRhZ05hbWUpLGk9XCJFc2NhcGVcIj09PXQua2V5LG49W1hlLFllXS5pbmNsdWRlcyh0LmtleSk7aWYoIW4mJiFpKXJldHVybjtpZihlJiYhaSlyZXR1cm47dC5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IHM9dGhpcy5tYXRjaGVzKFplKT90aGlzOlEucHJldih0aGlzLFplKVswXXx8US5uZXh0KHRoaXMsWmUpWzBdfHxRLmZpbmRPbmUoWmUsdC5kZWxlZ2F0ZVRhcmdldC5wYXJlbnROb2RlKSxvPWhpLmdldE9yQ3JlYXRlSW5zdGFuY2Uocyk7aWYobilyZXR1cm4gdC5zdG9wUHJvcGFnYXRpb24oKSxvLnNob3coKSx2b2lkIG8uX3NlbGVjdE1lbnVJdGVtKHQpO28uX2lzU2hvd24oKSYmKHQuc3RvcFByb3BhZ2F0aW9uKCksby5oaWRlKCkscy5mb2N1cygpKX19UC5vbihkb2N1bWVudCxHZSxaZSxoaS5kYXRhQXBpS2V5ZG93bkhhbmRsZXIpLFAub24oZG9jdW1lbnQsR2UsZWksaGkuZGF0YUFwaUtleWRvd25IYW5kbGVyKSxQLm9uKGRvY3VtZW50LFVlLGhpLmNsZWFyTWVudXMpLFAub24oZG9jdW1lbnQsXCJrZXl1cC5icy5kcm9wZG93bi5kYXRhLWFwaVwiLGhpLmNsZWFyTWVudXMpLFAub24oZG9jdW1lbnQsVWUsWmUsKGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSxoaS5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpLnRvZ2dsZSgpfSkpLGcoaGkpO2NvbnN0IGRpPVwiLmZpeGVkLXRvcCwgLmZpeGVkLWJvdHRvbSwgLmlzLWZpeGVkLCAuc3RpY2t5LXRvcFwiLHVpPVwiLnN0aWNreS10b3BcIixmaT1cInBhZGRpbmctcmlnaHRcIixwaT1cIm1hcmdpbi1yaWdodFwiO2NsYXNzIGdpe2NvbnN0cnVjdG9yKCl7dGhpcy5fZWxlbWVudD1kb2N1bWVudC5ib2R5fWdldFdpZHRoKCl7Y29uc3QgdD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7cmV0dXJuIE1hdGguYWJzKHdpbmRvdy5pbm5lcldpZHRoLXQpfWhpZGUoKXtjb25zdCB0PXRoaXMuZ2V0V2lkdGgoKTt0aGlzLl9kaXNhYmxlT3ZlckZsb3coKSx0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LGZpLChlPT5lK3QpKSx0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyhkaSxmaSwoZT0+ZSt0KSksdGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXModWkscGksKGU9PmUtdCkpfXJlc2V0KCl7dGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LFwib3ZlcmZsb3dcIiksdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LGZpKSx0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKGRpLGZpKSx0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHVpLHBpKX1pc092ZXJmbG93aW5nKCl7cmV0dXJuIHRoaXMuZ2V0V2lkdGgoKT4wfV9kaXNhYmxlT3ZlckZsb3coKXt0aGlzLl9zYXZlSW5pdGlhbEF0dHJpYnV0ZSh0aGlzLl9lbGVtZW50LFwib3ZlcmZsb3dcIiksdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvdz1cImhpZGRlblwifV9zZXRFbGVtZW50QXR0cmlidXRlcyh0LGUsaSl7Y29uc3Qgbj10aGlzLmdldFdpZHRoKCk7dGhpcy5fYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayh0LCh0PT57aWYodCE9PXRoaXMuX2VsZW1lbnQmJndpbmRvdy5pbm5lcldpZHRoPnQuY2xpZW50V2lkdGgrbilyZXR1cm47dGhpcy5fc2F2ZUluaXRpYWxBdHRyaWJ1dGUodCxlKTtjb25zdCBzPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLmdldFByb3BlcnR5VmFsdWUoZSk7dC5zdHlsZS5zZXRQcm9wZXJ0eShlLGAke2koTnVtYmVyLnBhcnNlRmxvYXQocykpfXB4YCl9KSl9X3NhdmVJbml0aWFsQXR0cmlidXRlKHQsZSl7Y29uc3QgaT10LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoZSk7aSYmQi5zZXREYXRhQXR0cmlidXRlKHQsZSxpKX1fcmVzZXRFbGVtZW50QXR0cmlidXRlcyh0LGUpe3RoaXMuX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2sodCwodD0+e2NvbnN0IGk9Qi5nZXREYXRhQXR0cmlidXRlKHQsZSk7bnVsbCE9PWk/KEIucmVtb3ZlRGF0YUF0dHJpYnV0ZSh0LGUpLHQuc3R5bGUuc2V0UHJvcGVydHkoZSxpKSk6dC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShlKX0pKX1fYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayh0LGUpe2lmKG8odCkpZSh0KTtlbHNlIGZvcihjb25zdCBpIG9mIFEuZmluZCh0LHRoaXMuX2VsZW1lbnQpKWUoaSl9fWNvbnN0IG1pPVwic2hvd1wiLF9pPVwibW91c2Vkb3duLmJzLmJhY2tkcm9wXCIsYmk9e2NsYXNzTmFtZTpcIm1vZGFsLWJhY2tkcm9wXCIsY2xpY2tDYWxsYmFjazpudWxsLGlzQW5pbWF0ZWQ6ITEsaXNWaXNpYmxlOiEwLHJvb3RFbGVtZW50OlwiYm9keVwifSx2aT17Y2xhc3NOYW1lOlwic3RyaW5nXCIsY2xpY2tDYWxsYmFjazpcIihmdW5jdGlvbnxudWxsKVwiLGlzQW5pbWF0ZWQ6XCJib29sZWFuXCIsaXNWaXNpYmxlOlwiYm9vbGVhblwiLHJvb3RFbGVtZW50OlwiKGVsZW1lbnR8c3RyaW5nKVwifTtjbGFzcyB5aSBleHRlbmRzIEZ7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKHQpLHRoaXMuX2lzQXBwZW5kZWQ9ITEsdGhpcy5fZWxlbWVudD1udWxsfXN0YXRpYyBnZXQgRGVmYXVsdCgpe3JldHVybiBiaX1zdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCl7cmV0dXJuIHZpfXN0YXRpYyBnZXQgTkFNRSgpe3JldHVyblwiYmFja2Ryb3BcIn1zaG93KHQpe2lmKCF0aGlzLl9jb25maWcuaXNWaXNpYmxlKXJldHVybiB2b2lkIG0odCk7dGhpcy5fYXBwZW5kKCk7Y29uc3QgZT10aGlzLl9nZXRFbGVtZW50KCk7dGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQmJmQoZSksZS5jbGFzc0xpc3QuYWRkKG1pKSx0aGlzLl9lbXVsYXRlQW5pbWF0aW9uKCgoKT0+e20odCl9KSl9aGlkZSh0KXt0aGlzLl9jb25maWcuaXNWaXNpYmxlPyh0aGlzLl9nZXRFbGVtZW50KCkuY2xhc3NMaXN0LnJlbW92ZShtaSksdGhpcy5fZW11bGF0ZUFuaW1hdGlvbigoKCk9Pnt0aGlzLmRpc3Bvc2UoKSxtKHQpfSkpKTptKHQpfWRpc3Bvc2UoKXt0aGlzLl9pc0FwcGVuZGVkJiYoUC5vZmYodGhpcy5fZWxlbWVudCxfaSksdGhpcy5fZWxlbWVudC5yZW1vdmUoKSx0aGlzLl9pc0FwcGVuZGVkPSExKX1fZ2V0RWxlbWVudCgpe2lmKCF0aGlzLl9lbGVtZW50KXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dC5jbGFzc05hbWU9dGhpcy5fY29uZmlnLmNsYXNzTmFtZSx0aGlzLl9jb25maWcuaXNBbmltYXRlZCYmdC5jbGFzc0xpc3QuYWRkKFwiZmFkZVwiKSx0aGlzLl9lbGVtZW50PXR9cmV0dXJuIHRoaXMuX2VsZW1lbnR9X2NvbmZpZ0FmdGVyTWVyZ2UodCl7cmV0dXJuIHQucm9vdEVsZW1lbnQ9cih0LnJvb3RFbGVtZW50KSx0fV9hcHBlbmQoKXtpZih0aGlzLl9pc0FwcGVuZGVkKXJldHVybjtjb25zdCB0PXRoaXMuX2dldEVsZW1lbnQoKTt0aGlzLl9jb25maWcucm9vdEVsZW1lbnQuYXBwZW5kKHQpLFAub24odCxfaSwoKCk9PnttKHRoaXMuX2NvbmZpZy5jbGlja0NhbGxiYWNrKX0pKSx0aGlzLl9pc0FwcGVuZGVkPSEwfV9lbXVsYXRlQW5pbWF0aW9uKHQpe18odCx0aGlzLl9nZXRFbGVtZW50KCksdGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpfX1jb25zdCB3aT1cIi5icy5mb2N1c3RyYXBcIixBaT1cImJhY2t3YXJkXCIsRWk9e2F1dG9mb2N1czohMCx0cmFwRWxlbWVudDpudWxsfSxUaT17YXV0b2ZvY3VzOlwiYm9vbGVhblwiLHRyYXBFbGVtZW50OlwiZWxlbWVudFwifTtjbGFzcyBDaSBleHRlbmRzIEZ7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKHQpLHRoaXMuX2lzQWN0aXZlPSExLHRoaXMuX2xhc3RUYWJOYXZEaXJlY3Rpb249bnVsbH1zdGF0aWMgZ2V0IERlZmF1bHQoKXtyZXR1cm4gRWl9c3RhdGljIGdldCBEZWZhdWx0VHlwZSgpe3JldHVybiBUaX1zdGF0aWMgZ2V0IE5BTUUoKXtyZXR1cm5cImZvY3VzdHJhcFwifWFjdGl2YXRlKCl7dGhpcy5faXNBY3RpdmV8fCh0aGlzLl9jb25maWcuYXV0b2ZvY3VzJiZ0aGlzLl9jb25maWcudHJhcEVsZW1lbnQuZm9jdXMoKSxQLm9mZihkb2N1bWVudCx3aSksUC5vbihkb2N1bWVudCxcImZvY3VzaW4uYnMuZm9jdXN0cmFwXCIsKHQ9PnRoaXMuX2hhbmRsZUZvY3VzaW4odCkpKSxQLm9uKGRvY3VtZW50LFwia2V5ZG93bi50YWIuYnMuZm9jdXN0cmFwXCIsKHQ9PnRoaXMuX2hhbmRsZUtleWRvd24odCkpKSx0aGlzLl9pc0FjdGl2ZT0hMCl9ZGVhY3RpdmF0ZSgpe3RoaXMuX2lzQWN0aXZlJiYodGhpcy5faXNBY3RpdmU9ITEsUC5vZmYoZG9jdW1lbnQsd2kpKX1faGFuZGxlRm9jdXNpbih0KXtjb25zdHt0cmFwRWxlbWVudDplfT10aGlzLl9jb25maWc7aWYodC50YXJnZXQ9PT1kb2N1bWVudHx8dC50YXJnZXQ9PT1lfHxlLmNvbnRhaW5zKHQudGFyZ2V0KSlyZXR1cm47Y29uc3QgaT1RLmZvY3VzYWJsZUNoaWxkcmVuKGUpOzA9PT1pLmxlbmd0aD9lLmZvY3VzKCk6dGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbj09PUFpP2lbaS5sZW5ndGgtMV0uZm9jdXMoKTppWzBdLmZvY3VzKCl9X2hhbmRsZUtleWRvd24odCl7XCJUYWJcIj09PXQua2V5JiYodGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbj10LnNoaWZ0S2V5P0FpOlwiZm9yd2FyZFwiKX19Y29uc3QgT2k9XCJoaWRkZW4uYnMubW9kYWxcIix4aT1cInNob3cuYnMubW9kYWxcIixraT1cIm1vZGFsLW9wZW5cIixMaT1cInNob3dcIixEaT1cIm1vZGFsLXN0YXRpY1wiLFNpPXtiYWNrZHJvcDohMCxmb2N1czohMCxrZXlib2FyZDohMH0sSWk9e2JhY2tkcm9wOlwiKGJvb2xlYW58c3RyaW5nKVwiLGZvY3VzOlwiYm9vbGVhblwiLGtleWJvYXJkOlwiYm9vbGVhblwifTtjbGFzcyBOaSBleHRlbmRzIHp7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMuX2RpYWxvZz1RLmZpbmRPbmUoXCIubW9kYWwtZGlhbG9nXCIsdGhpcy5fZWxlbWVudCksdGhpcy5fYmFja2Ryb3A9dGhpcy5faW5pdGlhbGl6ZUJhY2tEcm9wKCksdGhpcy5fZm9jdXN0cmFwPXRoaXMuX2luaXRpYWxpemVGb2N1c1RyYXAoKSx0aGlzLl9pc1Nob3duPSExLHRoaXMuX2lzVHJhbnNpdGlvbmluZz0hMSx0aGlzLl9zY3JvbGxCYXI9bmV3IGdpLHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCl9c3RhdGljIGdldCBEZWZhdWx0KCl7cmV0dXJuIFNpfXN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKXtyZXR1cm4gSWl9c3RhdGljIGdldCBOQU1FKCl7cmV0dXJuXCJtb2RhbFwifXRvZ2dsZSh0KXtyZXR1cm4gdGhpcy5faXNTaG93bj90aGlzLmhpZGUoKTp0aGlzLnNob3codCl9c2hvdyh0KXt0aGlzLl9pc1Nob3dufHx0aGlzLl9pc1RyYW5zaXRpb25pbmd8fFAudHJpZ2dlcih0aGlzLl9lbGVtZW50LHhpLHtyZWxhdGVkVGFyZ2V0OnR9KS5kZWZhdWx0UHJldmVudGVkfHwodGhpcy5faXNTaG93bj0hMCx0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITAsdGhpcy5fc2Nyb2xsQmFyLmhpZGUoKSxkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoa2kpLHRoaXMuX2FkanVzdERpYWxvZygpLHRoaXMuX2JhY2tkcm9wLnNob3coKCgpPT50aGlzLl9zaG93RWxlbWVudCh0KSkpKX1oaWRlKCl7dGhpcy5faXNTaG93biYmIXRoaXMuX2lzVHJhbnNpdGlvbmluZyYmKFAudHJpZ2dlcih0aGlzLl9lbGVtZW50LFwiaGlkZS5icy5tb2RhbFwiKS5kZWZhdWx0UHJldmVudGVkfHwodGhpcy5faXNTaG93bj0hMSx0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITAsdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoTGkpLHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCgpPT50aGlzLl9oaWRlTW9kYWwoKSksdGhpcy5fZWxlbWVudCx0aGlzLl9pc0FuaW1hdGVkKCkpKSl9ZGlzcG9zZSgpe2Zvcihjb25zdCB0IG9mW3dpbmRvdyx0aGlzLl9kaWFsb2ddKVAub2ZmKHQsXCIuYnMubW9kYWxcIik7dGhpcy5fYmFja2Ryb3AuZGlzcG9zZSgpLHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKCksc3VwZXIuZGlzcG9zZSgpfWhhbmRsZVVwZGF0ZSgpe3RoaXMuX2FkanVzdERpYWxvZygpfV9pbml0aWFsaXplQmFja0Ryb3AoKXtyZXR1cm4gbmV3IHlpKHtpc1Zpc2libGU6Qm9vbGVhbih0aGlzLl9jb25maWcuYmFja2Ryb3ApLGlzQW5pbWF0ZWQ6dGhpcy5faXNBbmltYXRlZCgpfSl9X2luaXRpYWxpemVGb2N1c1RyYXAoKXtyZXR1cm4gbmV3IENpKHt0cmFwRWxlbWVudDp0aGlzLl9lbGVtZW50fSl9X3Nob3dFbGVtZW50KHQpe2RvY3VtZW50LmJvZHkuY29udGFpbnModGhpcy5fZWxlbWVudCl8fGRvY3VtZW50LmJvZHkuYXBwZW5kKHRoaXMuX2VsZW1lbnQpLHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheT1cImJsb2NrXCIsdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSx0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZShcImFyaWEtbW9kYWxcIiwhMCksdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsXCJkaWFsb2dcIiksdGhpcy5fZWxlbWVudC5zY3JvbGxUb3A9MDtjb25zdCBlPVEuZmluZE9uZShcIi5tb2RhbC1ib2R5XCIsdGhpcy5fZGlhbG9nKTtlJiYoZS5zY3JvbGxUb3A9MCksZCh0aGlzLl9lbGVtZW50KSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoTGkpLHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCgpPT57dGhpcy5fY29uZmlnLmZvY3VzJiZ0aGlzLl9mb2N1c3RyYXAuYWN0aXZhdGUoKSx0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITEsUC50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsXCJzaG93bi5icy5tb2RhbFwiLHtyZWxhdGVkVGFyZ2V0OnR9KX0pLHRoaXMuX2RpYWxvZyx0aGlzLl9pc0FuaW1hdGVkKCkpfV9hZGRFdmVudExpc3RlbmVycygpe1Aub24odGhpcy5fZWxlbWVudCxcImtleWRvd24uZGlzbWlzcy5icy5tb2RhbFwiLCh0PT57aWYoXCJFc2NhcGVcIj09PXQua2V5KXJldHVybiB0aGlzLl9jb25maWcua2V5Ym9hcmQ/KHQucHJldmVudERlZmF1bHQoKSx2b2lkIHRoaXMuaGlkZSgpKTp2b2lkIHRoaXMuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKX0pKSxQLm9uKHdpbmRvdyxcInJlc2l6ZS5icy5tb2RhbFwiLCgoKT0+e3RoaXMuX2lzU2hvd24mJiF0aGlzLl9pc1RyYW5zaXRpb25pbmcmJnRoaXMuX2FkanVzdERpYWxvZygpfSkpLFAub24odGhpcy5fZWxlbWVudCxcIm1vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsXCIsKHQ9PntQLm9uZSh0aGlzLl9lbGVtZW50LFwiY2xpY2suZGlzbWlzcy5icy5tb2RhbFwiLChlPT57dGhpcy5fZWxlbWVudD09PXQudGFyZ2V0JiZ0aGlzLl9lbGVtZW50PT09ZS50YXJnZXQmJihcInN0YXRpY1wiIT09dGhpcy5fY29uZmlnLmJhY2tkcm9wP3RoaXMuX2NvbmZpZy5iYWNrZHJvcCYmdGhpcy5oaWRlKCk6dGhpcy5fdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpKX0pKX0pKX1faGlkZU1vZGFsKCl7dGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5PVwibm9uZVwiLHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIiwhMCksdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLW1vZGFsXCIpLHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwicm9sZVwiKSx0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITEsdGhpcy5fYmFja2Ryb3AuaGlkZSgoKCk9Pntkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoa2kpLHRoaXMuX3Jlc2V0QWRqdXN0bWVudHMoKSx0aGlzLl9zY3JvbGxCYXIucmVzZXQoKSxQLnRyaWdnZXIodGhpcy5fZWxlbWVudCxPaSl9KSl9X2lzQW5pbWF0ZWQoKXtyZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJmYWRlXCIpfV90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCl7aWYoUC50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsXCJoaWRlUHJldmVudGVkLmJzLm1vZGFsXCIpLmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuO2NvbnN0IHQ9dGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQ+ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxlPXRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZO1wiaGlkZGVuXCI9PT1lfHx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhEaSl8fCh0fHwodGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvd1k9XCJoaWRkZW5cIiksdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERpKSx0aGlzLl9xdWV1ZUNhbGxiYWNrKCgoKT0+e3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEaSksdGhpcy5fcXVldWVDYWxsYmFjaygoKCk9Pnt0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93WT1lfSksdGhpcy5fZGlhbG9nKX0pLHRoaXMuX2RpYWxvZyksdGhpcy5fZWxlbWVudC5mb2N1cygpKX1fYWRqdXN0RGlhbG9nKCl7Y29uc3QgdD10aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodD5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LGU9dGhpcy5fc2Nyb2xsQmFyLmdldFdpZHRoKCksaT1lPjA7aWYoaSYmIXQpe2NvbnN0IHQ9cCgpP1wicGFkZGluZ0xlZnRcIjpcInBhZGRpbmdSaWdodFwiO3RoaXMuX2VsZW1lbnQuc3R5bGVbdF09YCR7ZX1weGB9aWYoIWkmJnQpe2NvbnN0IHQ9cCgpP1wicGFkZGluZ1JpZ2h0XCI6XCJwYWRkaW5nTGVmdFwiO3RoaXMuX2VsZW1lbnQuc3R5bGVbdF09YCR7ZX1weGB9fV9yZXNldEFkanVzdG1lbnRzKCl7dGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdD1cIlwiLHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0PVwiXCJ9c3RhdGljIGpRdWVyeUludGVyZmFjZSh0LGUpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7Y29uc3QgaT1OaS5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsdCk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe2lmKHZvaWQgMD09PWlbdF0pdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHt0fVwiYCk7aVt0XShlKX19KSl9fVAub24oZG9jdW1lbnQsXCJjbGljay5icy5tb2RhbC5kYXRhLWFwaVwiLCdbZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiXScsKGZ1bmN0aW9uKHQpe2NvbnN0IGU9bih0aGlzKTtbXCJBXCIsXCJBUkVBXCJdLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkmJnQucHJldmVudERlZmF1bHQoKSxQLm9uZShlLHhpLCh0PT57dC5kZWZhdWx0UHJldmVudGVkfHxQLm9uZShlLE9pLCgoKT0+e2EodGhpcykmJnRoaXMuZm9jdXMoKX0pKX0pKTtjb25zdCBpPVEuZmluZE9uZShcIi5tb2RhbC5zaG93XCIpO2kmJk5pLmdldEluc3RhbmNlKGkpLmhpZGUoKSxOaS5nZXRPckNyZWF0ZUluc3RhbmNlKGUpLnRvZ2dsZSh0aGlzKX0pKSxxKE5pKSxnKE5pKTtjb25zdCBQaT1cInNob3dcIixqaT1cInNob3dpbmdcIixNaT1cImhpZGluZ1wiLEhpPVwiLm9mZmNhbnZhcy5zaG93XCIsJGk9XCJoaWRlUHJldmVudGVkLmJzLm9mZmNhbnZhc1wiLFdpPVwiaGlkZGVuLmJzLm9mZmNhbnZhc1wiLEJpPXtiYWNrZHJvcDohMCxrZXlib2FyZDohMCxzY3JvbGw6ITF9LEZpPXtiYWNrZHJvcDpcIihib29sZWFufHN0cmluZylcIixrZXlib2FyZDpcImJvb2xlYW5cIixzY3JvbGw6XCJib29sZWFuXCJ9O2NsYXNzIHppIGV4dGVuZHMgentjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5faXNTaG93bj0hMSx0aGlzLl9iYWNrZHJvcD10aGlzLl9pbml0aWFsaXplQmFja0Ryb3AoKSx0aGlzLl9mb2N1c3RyYXA9dGhpcy5faW5pdGlhbGl6ZUZvY3VzVHJhcCgpLHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCl9c3RhdGljIGdldCBEZWZhdWx0KCl7cmV0dXJuIEJpfXN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKXtyZXR1cm4gRml9c3RhdGljIGdldCBOQU1FKCl7cmV0dXJuXCJvZmZjYW52YXNcIn10b2dnbGUodCl7cmV0dXJuIHRoaXMuX2lzU2hvd24/dGhpcy5oaWRlKCk6dGhpcy5zaG93KHQpfXNob3codCl7dGhpcy5faXNTaG93bnx8UC50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsXCJzaG93LmJzLm9mZmNhbnZhc1wiLHtyZWxhdGVkVGFyZ2V0OnR9KS5kZWZhdWx0UHJldmVudGVkfHwodGhpcy5faXNTaG93bj0hMCx0aGlzLl9iYWNrZHJvcC5zaG93KCksdGhpcy5fY29uZmlnLnNjcm9sbHx8KG5ldyBnaSkuaGlkZSgpLHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1tb2RhbFwiLCEwKSx0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZShcInJvbGVcIixcImRpYWxvZ1wiKSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoamkpLHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCgpPT57dGhpcy5fY29uZmlnLnNjcm9sbCYmIXRoaXMuX2NvbmZpZy5iYWNrZHJvcHx8dGhpcy5fZm9jdXN0cmFwLmFjdGl2YXRlKCksdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKFBpKSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoamkpLFAudHJpZ2dlcih0aGlzLl9lbGVtZW50LFwic2hvd24uYnMub2ZmY2FudmFzXCIse3JlbGF0ZWRUYXJnZXQ6dH0pfSksdGhpcy5fZWxlbWVudCwhMCkpfWhpZGUoKXt0aGlzLl9pc1Nob3duJiYoUC50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsXCJoaWRlLmJzLm9mZmNhbnZhc1wiKS5kZWZhdWx0UHJldmVudGVkfHwodGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKSx0aGlzLl9lbGVtZW50LmJsdXIoKSx0aGlzLl9pc1Nob3duPSExLHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChNaSksdGhpcy5fYmFja2Ryb3AuaGlkZSgpLHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCgpPT57dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFBpLE1pKSx0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcImFyaWEtbW9kYWxcIiksdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJyb2xlXCIpLHRoaXMuX2NvbmZpZy5zY3JvbGx8fChuZXcgZ2kpLnJlc2V0KCksUC50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsV2kpfSksdGhpcy5fZWxlbWVudCwhMCkpKX1kaXNwb3NlKCl7dGhpcy5fYmFja2Ryb3AuZGlzcG9zZSgpLHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKCksc3VwZXIuZGlzcG9zZSgpfV9pbml0aWFsaXplQmFja0Ryb3AoKXtjb25zdCB0PUJvb2xlYW4odGhpcy5fY29uZmlnLmJhY2tkcm9wKTtyZXR1cm4gbmV3IHlpKHtjbGFzc05hbWU6XCJvZmZjYW52YXMtYmFja2Ryb3BcIixpc1Zpc2libGU6dCxpc0FuaW1hdGVkOiEwLHJvb3RFbGVtZW50OnRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZSxjbGlja0NhbGxiYWNrOnQ/KCk9PntcInN0YXRpY1wiIT09dGhpcy5fY29uZmlnLmJhY2tkcm9wP3RoaXMuaGlkZSgpOlAudHJpZ2dlcih0aGlzLl9lbGVtZW50LCRpKX06bnVsbH0pfV9pbml0aWFsaXplRm9jdXNUcmFwKCl7cmV0dXJuIG5ldyBDaSh7dHJhcEVsZW1lbnQ6dGhpcy5fZWxlbWVudH0pfV9hZGRFdmVudExpc3RlbmVycygpe1Aub24odGhpcy5fZWxlbWVudCxcImtleWRvd24uZGlzbWlzcy5icy5vZmZjYW52YXNcIiwodD0+e1wiRXNjYXBlXCI9PT10LmtleSYmKHRoaXMuX2NvbmZpZy5rZXlib2FyZD90aGlzLmhpZGUoKTpQLnRyaWdnZXIodGhpcy5fZWxlbWVudCwkaSkpfSkpfXN0YXRpYyBqUXVlcnlJbnRlcmZhY2UodCl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXtjb25zdCBlPXppLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcyx0KTtpZihcInN0cmluZ1wiPT10eXBlb2YgdCl7aWYodm9pZCAwPT09ZVt0XXx8dC5zdGFydHNXaXRoKFwiX1wiKXx8XCJjb25zdHJ1Y3RvclwiPT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke3R9XCJgKTtlW3RdKHRoaXMpfX0pKX19UC5vbihkb2N1bWVudCxcImNsaWNrLmJzLm9mZmNhbnZhcy5kYXRhLWFwaVwiLCdbZGF0YS1icy10b2dnbGU9XCJvZmZjYW52YXNcIl0nLChmdW5jdGlvbih0KXtjb25zdCBlPW4odGhpcyk7aWYoW1wiQVwiLFwiQVJFQVwiXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpJiZ0LnByZXZlbnREZWZhdWx0KCksbCh0aGlzKSlyZXR1cm47UC5vbmUoZSxXaSwoKCk9PnthKHRoaXMpJiZ0aGlzLmZvY3VzKCl9KSk7Y29uc3QgaT1RLmZpbmRPbmUoSGkpO2kmJmkhPT1lJiZ6aS5nZXRJbnN0YW5jZShpKS5oaWRlKCksemkuZ2V0T3JDcmVhdGVJbnN0YW5jZShlKS50b2dnbGUodGhpcyl9KSksUC5vbih3aW5kb3csXCJsb2FkLmJzLm9mZmNhbnZhcy5kYXRhLWFwaVwiLCgoKT0+e2Zvcihjb25zdCB0IG9mIFEuZmluZChIaSkpemkuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0KS5zaG93KCl9KSksUC5vbih3aW5kb3csXCJyZXNpemUuYnMub2ZmY2FudmFzXCIsKCgpPT57Zm9yKGNvbnN0IHQgb2YgUS5maW5kKFwiW2FyaWEtbW9kYWxdW2NsYXNzKj1zaG93XVtjbGFzcyo9b2ZmY2FudmFzLV1cIikpXCJmaXhlZFwiIT09Z2V0Q29tcHV0ZWRTdHlsZSh0KS5wb3NpdGlvbiYmemkuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0KS5oaWRlKCl9KSkscSh6aSksZyh6aSk7Y29uc3QgcWk9bmV3IFNldChbXCJiYWNrZ3JvdW5kXCIsXCJjaXRlXCIsXCJocmVmXCIsXCJpdGVtdHlwZVwiLFwibG9uZ2Rlc2NcIixcInBvc3RlclwiLFwic3JjXCIsXCJ4bGluazpocmVmXCJdKSxSaT0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwfHRlbHxmaWxlfHNtcyk6fFteIyYvOj9dKig/OlsjLz9dfCQpKS9pLFZpPS9eZGF0YTooPzppbWFnZVxcLyg/OmJtcHxnaWZ8anBlZ3xqcGd8cG5nfHRpZmZ8d2VicCl8dmlkZW9cXC8oPzptcGVnfG1wNHxvZ2d8d2VibSl8YXVkaW9cXC8oPzptcDN8b2dhfG9nZ3xvcHVzKSk7YmFzZTY0LFtcXGQrL2Etel0rPSokL2ksS2k9KHQsZSk9Pntjb25zdCBpPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS5pbmNsdWRlcyhpKT8hcWkuaGFzKGkpfHxCb29sZWFuKFJpLnRlc3QodC5ub2RlVmFsdWUpfHxWaS50ZXN0KHQubm9kZVZhbHVlKSk6ZS5maWx0ZXIoKHQ9PnQgaW5zdGFuY2VvZiBSZWdFeHApKS5zb21lKCh0PT50LnRlc3QoaSkpKX0sUWk9e1wiKlwiOltcImNsYXNzXCIsXCJkaXJcIixcImlkXCIsXCJsYW5nXCIsXCJyb2xlXCIsL15hcmlhLVtcXHctXSokL2ldLGE6W1widGFyZ2V0XCIsXCJocmVmXCIsXCJ0aXRsZVwiLFwicmVsXCJdLGFyZWE6W10sYjpbXSxicjpbXSxjb2w6W10sY29kZTpbXSxkaXY6W10sZW06W10saHI6W10saDE6W10saDI6W10saDM6W10saDQ6W10saDU6W10saDY6W10saTpbXSxpbWc6W1wic3JjXCIsXCJzcmNzZXRcIixcImFsdFwiLFwidGl0bGVcIixcIndpZHRoXCIsXCJoZWlnaHRcIl0sbGk6W10sb2w6W10scDpbXSxwcmU6W10sczpbXSxzbWFsbDpbXSxzcGFuOltdLHN1YjpbXSxzdXA6W10sc3Ryb25nOltdLHU6W10sdWw6W119LFhpPXthbGxvd0xpc3Q6UWksY29udGVudDp7fSxleHRyYUNsYXNzOlwiXCIsaHRtbDohMSxzYW5pdGl6ZTohMCxzYW5pdGl6ZUZuOm51bGwsdGVtcGxhdGU6XCI8ZGl2PjwvZGl2PlwifSxZaT17YWxsb3dMaXN0Olwib2JqZWN0XCIsY29udGVudDpcIm9iamVjdFwiLGV4dHJhQ2xhc3M6XCIoc3RyaW5nfGZ1bmN0aW9uKVwiLGh0bWw6XCJib29sZWFuXCIsc2FuaXRpemU6XCJib29sZWFuXCIsc2FuaXRpemVGbjpcIihudWxsfGZ1bmN0aW9uKVwiLHRlbXBsYXRlOlwic3RyaW5nXCJ9LFVpPXtlbnRyeTpcIihzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbnxudWxsKVwiLHNlbGVjdG9yOlwiKHN0cmluZ3xlbGVtZW50KVwifTtjbGFzcyBHaSBleHRlbmRzIEZ7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKHQpfXN0YXRpYyBnZXQgRGVmYXVsdCgpe3JldHVybiBYaX1zdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCl7cmV0dXJuIFlpfXN0YXRpYyBnZXQgTkFNRSgpe3JldHVyblwiVGVtcGxhdGVGYWN0b3J5XCJ9Z2V0Q29udGVudCgpe3JldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX2NvbmZpZy5jb250ZW50KS5tYXAoKHQ9PnRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHQpKSkuZmlsdGVyKEJvb2xlYW4pfWhhc0NvbnRlbnQoKXtyZXR1cm4gdGhpcy5nZXRDb250ZW50KCkubGVuZ3RoPjB9Y2hhbmdlQ29udGVudCh0KXtyZXR1cm4gdGhpcy5fY2hlY2tDb250ZW50KHQpLHRoaXMuX2NvbmZpZy5jb250ZW50PXsuLi50aGlzLl9jb25maWcuY29udGVudCwuLi50fSx0aGlzfXRvSHRtbCgpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt0LmlubmVySFRNTD10aGlzLl9tYXliZVNhbml0aXplKHRoaXMuX2NvbmZpZy50ZW1wbGF0ZSk7Zm9yKGNvbnN0W2UsaV1vZiBPYmplY3QuZW50cmllcyh0aGlzLl9jb25maWcuY29udGVudCkpdGhpcy5fc2V0Q29udGVudCh0LGksZSk7Y29uc3QgZT10LmNoaWxkcmVuWzBdLGk9dGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odGhpcy5fY29uZmlnLmV4dHJhQ2xhc3MpO3JldHVybiBpJiZlLmNsYXNzTGlzdC5hZGQoLi4uaS5zcGxpdChcIiBcIikpLGV9X3R5cGVDaGVja0NvbmZpZyh0KXtzdXBlci5fdHlwZUNoZWNrQ29uZmlnKHQpLHRoaXMuX2NoZWNrQ29udGVudCh0LmNvbnRlbnQpfV9jaGVja0NvbnRlbnQodCl7Zm9yKGNvbnN0W2UsaV1vZiBPYmplY3QuZW50cmllcyh0KSlzdXBlci5fdHlwZUNoZWNrQ29uZmlnKHtzZWxlY3RvcjplLGVudHJ5Oml9LFVpKX1fc2V0Q29udGVudCh0LGUsaSl7Y29uc3Qgbj1RLmZpbmRPbmUoaSx0KTtuJiYoKGU9dGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oZSkpP28oZSk/dGhpcy5fcHV0RWxlbWVudEluVGVtcGxhdGUocihlKSxuKTp0aGlzLl9jb25maWcuaHRtbD9uLmlubmVySFRNTD10aGlzLl9tYXliZVNhbml0aXplKGUpOm4udGV4dENvbnRlbnQ9ZTpuLnJlbW92ZSgpKX1fbWF5YmVTYW5pdGl6ZSh0KXtyZXR1cm4gdGhpcy5fY29uZmlnLnNhbml0aXplP2Z1bmN0aW9uKHQsZSxpKXtpZighdC5sZW5ndGgpcmV0dXJuIHQ7aWYoaSYmXCJmdW5jdGlvblwiPT10eXBlb2YgaSlyZXR1cm4gaSh0KTtjb25zdCBuPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsXCJ0ZXh0L2h0bWxcIikscz1bXS5jb25jYXQoLi4ubi5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqXCIpKTtmb3IoY29uc3QgdCBvZiBzKXtjb25zdCBpPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZighT2JqZWN0LmtleXMoZSkuaW5jbHVkZXMoaSkpe3QucmVtb3ZlKCk7Y29udGludWV9Y29uc3Qgbj1bXS5jb25jYXQoLi4udC5hdHRyaWJ1dGVzKSxzPVtdLmNvbmNhdChlW1wiKlwiXXx8W10sZVtpXXx8W10pO2Zvcihjb25zdCBlIG9mIG4pS2koZSxzKXx8dC5yZW1vdmVBdHRyaWJ1dGUoZS5ub2RlTmFtZSl9cmV0dXJuIG4uYm9keS5pbm5lckhUTUx9KHQsdGhpcy5fY29uZmlnLmFsbG93TGlzdCx0aGlzLl9jb25maWcuc2FuaXRpemVGbik6dH1fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odCl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdD90KHRoaXMpOnR9X3B1dEVsZW1lbnRJblRlbXBsYXRlKHQsZSl7aWYodGhpcy5fY29uZmlnLmh0bWwpcmV0dXJuIGUuaW5uZXJIVE1MPVwiXCIsdm9pZCBlLmFwcGVuZCh0KTtlLnRleHRDb250ZW50PXQudGV4dENvbnRlbnR9fWNvbnN0IEppPW5ldyBTZXQoW1wic2FuaXRpemVcIixcImFsbG93TGlzdFwiLFwic2FuaXRpemVGblwiXSksWmk9XCJmYWRlXCIsdG49XCJzaG93XCIsZW49XCIubW9kYWxcIixubj1cImhpZGUuYnMubW9kYWxcIixzbj1cImhvdmVyXCIsb249XCJmb2N1c1wiLHJuPXtBVVRPOlwiYXV0b1wiLFRPUDpcInRvcFwiLFJJR0hUOnAoKT9cImxlZnRcIjpcInJpZ2h0XCIsQk9UVE9NOlwiYm90dG9tXCIsTEVGVDpwKCk/XCJyaWdodFwiOlwibGVmdFwifSxhbj17YWxsb3dMaXN0OlFpLGFuaW1hdGlvbjohMCxib3VuZGFyeTpcImNsaXBwaW5nUGFyZW50c1wiLGNvbnRhaW5lcjohMSxjdXN0b21DbGFzczpcIlwiLGRlbGF5OjAsZmFsbGJhY2tQbGFjZW1lbnRzOltcInRvcFwiLFwicmlnaHRcIixcImJvdHRvbVwiLFwibGVmdFwiXSxodG1sOiExLG9mZnNldDpbMCwwXSxwbGFjZW1lbnQ6XCJ0b3BcIixwb3BwZXJDb25maWc6bnVsbCxzYW5pdGl6ZTohMCxzYW5pdGl6ZUZuOm51bGwsc2VsZWN0b3I6ITEsdGVtcGxhdGU6JzxkaXYgY2xhc3M9XCJ0b29sdGlwXCIgcm9sZT1cInRvb2x0aXBcIj48ZGl2IGNsYXNzPVwidG9vbHRpcC1hcnJvd1wiPjwvZGl2PjxkaXYgY2xhc3M9XCJ0b29sdGlwLWlubmVyXCI+PC9kaXY+PC9kaXY+Jyx0aXRsZTpcIlwiLHRyaWdnZXI6XCJob3ZlciBmb2N1c1wifSxsbj17YWxsb3dMaXN0Olwib2JqZWN0XCIsYW5pbWF0aW9uOlwiYm9vbGVhblwiLGJvdW5kYXJ5OlwiKHN0cmluZ3xlbGVtZW50KVwiLGNvbnRhaW5lcjpcIihzdHJpbmd8ZWxlbWVudHxib29sZWFuKVwiLGN1c3RvbUNsYXNzOlwiKHN0cmluZ3xmdW5jdGlvbilcIixkZWxheTpcIihudW1iZXJ8b2JqZWN0KVwiLGZhbGxiYWNrUGxhY2VtZW50czpcImFycmF5XCIsaHRtbDpcImJvb2xlYW5cIixvZmZzZXQ6XCIoYXJyYXl8c3RyaW5nfGZ1bmN0aW9uKVwiLHBsYWNlbWVudDpcIihzdHJpbmd8ZnVuY3Rpb24pXCIscG9wcGVyQ29uZmlnOlwiKG51bGx8b2JqZWN0fGZ1bmN0aW9uKVwiLHNhbml0aXplOlwiYm9vbGVhblwiLHNhbml0aXplRm46XCIobnVsbHxmdW5jdGlvbilcIixzZWxlY3RvcjpcIihzdHJpbmd8Ym9vbGVhbilcIix0ZW1wbGF0ZTpcInN0cmluZ1wiLHRpdGxlOlwiKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKVwiLHRyaWdnZXI6XCJzdHJpbmdcIn07Y2xhc3MgY24gZXh0ZW5kcyB6e2NvbnN0cnVjdG9yKHQsZSl7aWYodm9pZCAwPT09S2UpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkJvb3RzdHJhcCdzIHRvb2x0aXBzIHJlcXVpcmUgUG9wcGVyIChodHRwczovL3BvcHBlci5qcy5vcmcpXCIpO3N1cGVyKHQsZSksdGhpcy5faXNFbmFibGVkPSEwLHRoaXMuX3RpbWVvdXQ9MCx0aGlzLl9pc0hvdmVyZWQ9bnVsbCx0aGlzLl9hY3RpdmVUcmlnZ2VyPXt9LHRoaXMuX3BvcHBlcj1udWxsLHRoaXMuX3RlbXBsYXRlRmFjdG9yeT1udWxsLHRoaXMuX25ld0NvbnRlbnQ9bnVsbCx0aGlzLnRpcD1udWxsLHRoaXMuX3NldExpc3RlbmVycygpLHRoaXMuX2NvbmZpZy5zZWxlY3Rvcnx8dGhpcy5fZml4VGl0bGUoKX1zdGF0aWMgZ2V0IERlZmF1bHQoKXtyZXR1cm4gYW59c3RhdGljIGdldCBEZWZhdWx0VHlwZSgpe3JldHVybiBsbn1zdGF0aWMgZ2V0IE5BTUUoKXtyZXR1cm5cInRvb2x0aXBcIn1lbmFibGUoKXt0aGlzLl9pc0VuYWJsZWQ9ITB9ZGlzYWJsZSgpe3RoaXMuX2lzRW5hYmxlZD0hMX10b2dnbGVFbmFibGVkKCl7dGhpcy5faXNFbmFibGVkPSF0aGlzLl9pc0VuYWJsZWR9dG9nZ2xlKCl7dGhpcy5faXNFbmFibGVkJiYodGhpcy5fYWN0aXZlVHJpZ2dlci5jbGljaz0hdGhpcy5fYWN0aXZlVHJpZ2dlci5jbGljayx0aGlzLl9pc1Nob3duKCk/dGhpcy5fbGVhdmUoKTp0aGlzLl9lbnRlcigpKX1kaXNwb3NlKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpLFAub2ZmKHRoaXMuX2VsZW1lbnQuY2xvc2VzdChlbiksbm4sdGhpcy5faGlkZU1vZGFsSGFuZGxlciksdGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWJzLW9yaWdpbmFsLXRpdGxlXCIpJiZ0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZShcInRpdGxlXCIsdGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWJzLW9yaWdpbmFsLXRpdGxlXCIpKSx0aGlzLl9kaXNwb3NlUG9wcGVyKCksc3VwZXIuZGlzcG9zZSgpfXNob3coKXtpZihcIm5vbmVcIj09PXRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSl0aHJvdyBuZXcgRXJyb3IoXCJQbGVhc2UgdXNlIHNob3cgb24gdmlzaWJsZSBlbGVtZW50c1wiKTtpZighdGhpcy5faXNXaXRoQ29udGVudCgpfHwhdGhpcy5faXNFbmFibGVkKXJldHVybjtjb25zdCB0PVAudHJpZ2dlcih0aGlzLl9lbGVtZW50LHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKFwic2hvd1wiKSksZT0oYyh0aGlzLl9lbGVtZW50KXx8dGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuY29udGFpbnModGhpcy5fZWxlbWVudCk7aWYodC5kZWZhdWx0UHJldmVudGVkfHwhZSlyZXR1cm47dGhpcy5fZGlzcG9zZVBvcHBlcigpO2NvbnN0IGk9dGhpcy5fZ2V0VGlwRWxlbWVudCgpO3RoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1kZXNjcmliZWRieVwiLGkuZ2V0QXR0cmlidXRlKFwiaWRcIikpO2NvbnN0e2NvbnRhaW5lcjpufT10aGlzLl9jb25maWc7aWYodGhpcy5fZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyh0aGlzLnRpcCl8fChuLmFwcGVuZChpKSxQLnRyaWdnZXIodGhpcy5fZWxlbWVudCx0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShcImluc2VydGVkXCIpKSksdGhpcy5fcG9wcGVyPXRoaXMuX2NyZWF0ZVBvcHBlcihpKSxpLmNsYXNzTGlzdC5hZGQodG4pLFwib250b3VjaHN0YXJ0XCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpZm9yKGNvbnN0IHQgb2ZbXS5jb25jYXQoLi4uZG9jdW1lbnQuYm9keS5jaGlsZHJlbikpUC5vbih0LFwibW91c2VvdmVyXCIsaCk7dGhpcy5fcXVldWVDYWxsYmFjaygoKCk9PntQLnRyaWdnZXIodGhpcy5fZWxlbWVudCx0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShcInNob3duXCIpKSwhMT09PXRoaXMuX2lzSG92ZXJlZCYmdGhpcy5fbGVhdmUoKSx0aGlzLl9pc0hvdmVyZWQ9ITF9KSx0aGlzLnRpcCx0aGlzLl9pc0FuaW1hdGVkKCkpfWhpZGUoKXtpZih0aGlzLl9pc1Nob3duKCkmJiFQLnRyaWdnZXIodGhpcy5fZWxlbWVudCx0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShcImhpZGVcIikpLmRlZmF1bHRQcmV2ZW50ZWQpe2lmKHRoaXMuX2dldFRpcEVsZW1lbnQoKS5jbGFzc0xpc3QucmVtb3ZlKHRuKSxcIm9udG91Y2hzdGFydFwiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KWZvcihjb25zdCB0IG9mW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKVAub2ZmKHQsXCJtb3VzZW92ZXJcIixoKTt0aGlzLl9hY3RpdmVUcmlnZ2VyLmNsaWNrPSExLHRoaXMuX2FjdGl2ZVRyaWdnZXIuZm9jdXM9ITEsdGhpcy5fYWN0aXZlVHJpZ2dlci5ob3Zlcj0hMSx0aGlzLl9pc0hvdmVyZWQ9bnVsbCx0aGlzLl9xdWV1ZUNhbGxiYWNrKCgoKT0+e3RoaXMuX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKXx8KHRoaXMuX2lzSG92ZXJlZHx8dGhpcy5fZGlzcG9zZVBvcHBlcigpLHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwiYXJpYS1kZXNjcmliZWRieVwiKSxQLnRyaWdnZXIodGhpcy5fZWxlbWVudCx0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShcImhpZGRlblwiKSkpfSksdGhpcy50aXAsdGhpcy5faXNBbmltYXRlZCgpKX19dXBkYXRlKCl7dGhpcy5fcG9wcGVyJiZ0aGlzLl9wb3BwZXIudXBkYXRlKCl9X2lzV2l0aENvbnRlbnQoKXtyZXR1cm4gQm9vbGVhbih0aGlzLl9nZXRUaXRsZSgpKX1fZ2V0VGlwRWxlbWVudCgpe3JldHVybiB0aGlzLnRpcHx8KHRoaXMudGlwPXRoaXMuX2NyZWF0ZVRpcEVsZW1lbnQodGhpcy5fbmV3Q29udGVudHx8dGhpcy5fZ2V0Q29udGVudEZvclRlbXBsYXRlKCkpKSx0aGlzLnRpcH1fY3JlYXRlVGlwRWxlbWVudCh0KXtjb25zdCBlPXRoaXMuX2dldFRlbXBsYXRlRmFjdG9yeSh0KS50b0h0bWwoKTtpZighZSlyZXR1cm4gbnVsbDtlLmNsYXNzTGlzdC5yZW1vdmUoWmksdG4pLGUuY2xhc3NMaXN0LmFkZChgYnMtJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9LWF1dG9gKTtjb25zdCBpPSh0PT57ZG97dCs9TWF0aC5mbG9vcigxZTYqTWF0aC5yYW5kb20oKSl9d2hpbGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCkpO3JldHVybiB0fSkodGhpcy5jb25zdHJ1Y3Rvci5OQU1FKS50b1N0cmluZygpO3JldHVybiBlLnNldEF0dHJpYnV0ZShcImlkXCIsaSksdGhpcy5faXNBbmltYXRlZCgpJiZlLmNsYXNzTGlzdC5hZGQoWmkpLGV9c2V0Q29udGVudCh0KXt0aGlzLl9uZXdDb250ZW50PXQsdGhpcy5faXNTaG93bigpJiYodGhpcy5fZGlzcG9zZVBvcHBlcigpLHRoaXMuc2hvdygpKX1fZ2V0VGVtcGxhdGVGYWN0b3J5KHQpe3JldHVybiB0aGlzLl90ZW1wbGF0ZUZhY3Rvcnk/dGhpcy5fdGVtcGxhdGVGYWN0b3J5LmNoYW5nZUNvbnRlbnQodCk6dGhpcy5fdGVtcGxhdGVGYWN0b3J5PW5ldyBHaSh7Li4udGhpcy5fY29uZmlnLGNvbnRlbnQ6dCxleHRyYUNsYXNzOnRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy5jdXN0b21DbGFzcyl9KSx0aGlzLl90ZW1wbGF0ZUZhY3Rvcnl9X2dldENvbnRlbnRGb3JUZW1wbGF0ZSgpe3JldHVybntcIi50b29sdGlwLWlubmVyXCI6dGhpcy5fZ2V0VGl0bGUoKX19X2dldFRpdGxlKCl7cmV0dXJuIHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy50aXRsZSl8fHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1icy1vcmlnaW5hbC10aXRsZVwiKX1faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KHQpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLmdldE9yQ3JlYXRlSW5zdGFuY2UodC5kZWxlZ2F0ZVRhcmdldCx0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKX1faXNBbmltYXRlZCgpe3JldHVybiB0aGlzLl9jb25maWcuYW5pbWF0aW9ufHx0aGlzLnRpcCYmdGhpcy50aXAuY2xhc3NMaXN0LmNvbnRhaW5zKFppKX1faXNTaG93bigpe3JldHVybiB0aGlzLnRpcCYmdGhpcy50aXAuY2xhc3NMaXN0LmNvbnRhaW5zKHRuKX1fY3JlYXRlUG9wcGVyKHQpe2NvbnN0IGU9XCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5fY29uZmlnLnBsYWNlbWVudD90aGlzLl9jb25maWcucGxhY2VtZW50LmNhbGwodGhpcyx0LHRoaXMuX2VsZW1lbnQpOnRoaXMuX2NvbmZpZy5wbGFjZW1lbnQsaT1ybltlLnRvVXBwZXJDYXNlKCldO3JldHVybiBWZSh0aGlzLl9lbGVtZW50LHQsdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKGkpKX1fZ2V0T2Zmc2V0KCl7Y29uc3R7b2Zmc2V0OnR9PXRoaXMuX2NvbmZpZztyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdD90LnNwbGl0KFwiLFwiKS5tYXAoKHQ9Pk51bWJlci5wYXJzZUludCh0LDEwKSkpOlwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/ZT0+dChlLHRoaXMuX2VsZW1lbnQpOnR9X3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHQpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dC5jYWxsKHRoaXMuX2VsZW1lbnQpOnR9X2dldFBvcHBlckNvbmZpZyh0KXtjb25zdCBlPXtwbGFjZW1lbnQ6dCxtb2RpZmllcnM6W3tuYW1lOlwiZmxpcFwiLG9wdGlvbnM6e2ZhbGxiYWNrUGxhY2VtZW50czp0aGlzLl9jb25maWcuZmFsbGJhY2tQbGFjZW1lbnRzfX0se25hbWU6XCJvZmZzZXRcIixvcHRpb25zOntvZmZzZXQ6dGhpcy5fZ2V0T2Zmc2V0KCl9fSx7bmFtZTpcInByZXZlbnRPdmVyZmxvd1wiLG9wdGlvbnM6e2JvdW5kYXJ5OnRoaXMuX2NvbmZpZy5ib3VuZGFyeX19LHtuYW1lOlwiYXJyb3dcIixvcHRpb25zOntlbGVtZW50OmAuJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9LWFycm93YH19LHtuYW1lOlwicHJlU2V0UGxhY2VtZW50XCIsZW5hYmxlZDohMCxwaGFzZTpcImJlZm9yZU1haW5cIixmbjp0PT57dGhpcy5fZ2V0VGlwRWxlbWVudCgpLnNldEF0dHJpYnV0ZShcImRhdGEtcG9wcGVyLXBsYWNlbWVudFwiLHQuc3RhdGUucGxhY2VtZW50KX19XX07cmV0dXJuey4uLmUsLi4uXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5fY29uZmlnLnBvcHBlckNvbmZpZz90aGlzLl9jb25maWcucG9wcGVyQ29uZmlnKGUpOnRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWd9fV9zZXRMaXN0ZW5lcnMoKXtjb25zdCB0PXRoaXMuX2NvbmZpZy50cmlnZ2VyLnNwbGl0KFwiIFwiKTtmb3IoY29uc3QgZSBvZiB0KWlmKFwiY2xpY2tcIj09PWUpUC5vbih0aGlzLl9lbGVtZW50LHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKFwiY2xpY2tcIiksdGhpcy5fY29uZmlnLnNlbGVjdG9yLCh0PT57dGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KHQpLnRvZ2dsZSgpfSkpO2Vsc2UgaWYoXCJtYW51YWxcIiE9PWUpe2NvbnN0IHQ9ZT09PXNuP3RoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKFwibW91c2VlbnRlclwiKTp0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShcImZvY3VzaW5cIiksaT1lPT09c24/dGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoXCJtb3VzZWxlYXZlXCIpOnRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKFwiZm9jdXNvdXRcIik7UC5vbih0aGlzLl9lbGVtZW50LHQsdGhpcy5fY29uZmlnLnNlbGVjdG9yLCh0PT57Y29uc3QgZT10aGlzLl9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQodCk7ZS5fYWN0aXZlVHJpZ2dlcltcImZvY3VzaW5cIj09PXQudHlwZT9vbjpzbl09ITAsZS5fZW50ZXIoKX0pKSxQLm9uKHRoaXMuX2VsZW1lbnQsaSx0aGlzLl9jb25maWcuc2VsZWN0b3IsKHQ9Pntjb25zdCBlPXRoaXMuX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldCh0KTtlLl9hY3RpdmVUcmlnZ2VyW1wiZm9jdXNvdXRcIj09PXQudHlwZT9vbjpzbl09ZS5fZWxlbWVudC5jb250YWlucyh0LnJlbGF0ZWRUYXJnZXQpLGUuX2xlYXZlKCl9KSl9dGhpcy5faGlkZU1vZGFsSGFuZGxlcj0oKT0+e3RoaXMuX2VsZW1lbnQmJnRoaXMuaGlkZSgpfSxQLm9uKHRoaXMuX2VsZW1lbnQuY2xvc2VzdChlbiksbm4sdGhpcy5faGlkZU1vZGFsSGFuZGxlcil9X2ZpeFRpdGxlKCl7Y29uc3QgdD10aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO3QmJih0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIil8fHRoaXMuX2VsZW1lbnQudGV4dENvbnRlbnQudHJpbSgpfHx0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIix0KSx0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtYnMtb3JpZ2luYWwtdGl0bGVcIix0KSx0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcInRpdGxlXCIpKX1fZW50ZXIoKXt0aGlzLl9pc1Nob3duKCl8fHRoaXMuX2lzSG92ZXJlZD90aGlzLl9pc0hvdmVyZWQ9ITA6KHRoaXMuX2lzSG92ZXJlZD0hMCx0aGlzLl9zZXRUaW1lb3V0KCgoKT0+e3RoaXMuX2lzSG92ZXJlZCYmdGhpcy5zaG93KCl9KSx0aGlzLl9jb25maWcuZGVsYXkuc2hvdykpfV9sZWF2ZSgpe3RoaXMuX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKXx8KHRoaXMuX2lzSG92ZXJlZD0hMSx0aGlzLl9zZXRUaW1lb3V0KCgoKT0+e3RoaXMuX2lzSG92ZXJlZHx8dGhpcy5oaWRlKCl9KSx0aGlzLl9jb25maWcuZGVsYXkuaGlkZSkpfV9zZXRUaW1lb3V0KHQsZSl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpLHRoaXMuX3RpbWVvdXQ9c2V0VGltZW91dCh0LGUpfV9pc1dpdGhBY3RpdmVUcmlnZ2VyKCl7cmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fYWN0aXZlVHJpZ2dlcikuaW5jbHVkZXMoITApfV9nZXRDb25maWcodCl7Y29uc3QgZT1CLmdldERhdGFBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQpO2Zvcihjb25zdCB0IG9mIE9iamVjdC5rZXlzKGUpKUppLmhhcyh0KSYmZGVsZXRlIGVbdF07cmV0dXJuIHQ9ey4uLmUsLi4uXCJvYmplY3RcIj09dHlwZW9mIHQmJnQ/dDp7fX0sdD10aGlzLl9tZXJnZUNvbmZpZ09iaih0KSx0PXRoaXMuX2NvbmZpZ0FmdGVyTWVyZ2UodCksdGhpcy5fdHlwZUNoZWNrQ29uZmlnKHQpLHR9X2NvbmZpZ0FmdGVyTWVyZ2UodCl7cmV0dXJuIHQuY29udGFpbmVyPSExPT09dC5jb250YWluZXI/ZG9jdW1lbnQuYm9keTpyKHQuY29udGFpbmVyKSxcIm51bWJlclwiPT10eXBlb2YgdC5kZWxheSYmKHQuZGVsYXk9e3Nob3c6dC5kZWxheSxoaWRlOnQuZGVsYXl9KSxcIm51bWJlclwiPT10eXBlb2YgdC50aXRsZSYmKHQudGl0bGU9dC50aXRsZS50b1N0cmluZygpKSxcIm51bWJlclwiPT10eXBlb2YgdC5jb250ZW50JiYodC5jb250ZW50PXQuY29udGVudC50b1N0cmluZygpKSx0fV9nZXREZWxlZ2F0ZUNvbmZpZygpe2NvbnN0IHQ9e307Zm9yKGNvbnN0IGUgaW4gdGhpcy5fY29uZmlnKXRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtlXSE9PXRoaXMuX2NvbmZpZ1tlXSYmKHRbZV09dGhpcy5fY29uZmlnW2VdKTtyZXR1cm4gdC5zZWxlY3Rvcj0hMSx0LnRyaWdnZXI9XCJtYW51YWxcIix0fV9kaXNwb3NlUG9wcGVyKCl7dGhpcy5fcG9wcGVyJiYodGhpcy5fcG9wcGVyLmRlc3Ryb3koKSx0aGlzLl9wb3BwZXI9bnVsbCksdGhpcy50aXAmJih0aGlzLnRpcC5yZW1vdmUoKSx0aGlzLnRpcD1udWxsKX1zdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7Y29uc3QgZT1jbi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsdCk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe2lmKHZvaWQgMD09PWVbdF0pdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHt0fVwiYCk7ZVt0XSgpfX0pKX19Zyhjbik7Y29uc3QgaG49ey4uLmNuLkRlZmF1bHQsY29udGVudDpcIlwiLG9mZnNldDpbMCw4XSxwbGFjZW1lbnQ6XCJyaWdodFwiLHRlbXBsYXRlOic8ZGl2IGNsYXNzPVwicG9wb3ZlclwiIHJvbGU9XCJ0b29sdGlwXCI+PGRpdiBjbGFzcz1cInBvcG92ZXItYXJyb3dcIj48L2Rpdj48aDMgY2xhc3M9XCJwb3BvdmVyLWhlYWRlclwiPjwvaDM+PGRpdiBjbGFzcz1cInBvcG92ZXItYm9keVwiPjwvZGl2PjwvZGl2PicsdHJpZ2dlcjpcImNsaWNrXCJ9LGRuPXsuLi5jbi5EZWZhdWx0VHlwZSxjb250ZW50OlwiKG51bGx8c3RyaW5nfGVsZW1lbnR8ZnVuY3Rpb24pXCJ9O2NsYXNzIHVuIGV4dGVuZHMgY257c3RhdGljIGdldCBEZWZhdWx0KCl7cmV0dXJuIGhufXN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKXtyZXR1cm4gZG59c3RhdGljIGdldCBOQU1FKCl7cmV0dXJuXCJwb3BvdmVyXCJ9X2lzV2l0aENvbnRlbnQoKXtyZXR1cm4gdGhpcy5fZ2V0VGl0bGUoKXx8dGhpcy5fZ2V0Q29udGVudCgpfV9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKXtyZXR1cm57XCIucG9wb3Zlci1oZWFkZXJcIjp0aGlzLl9nZXRUaXRsZSgpLFwiLnBvcG92ZXItYm9keVwiOnRoaXMuX2dldENvbnRlbnQoKX19X2dldENvbnRlbnQoKXtyZXR1cm4gdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odGhpcy5fY29uZmlnLmNvbnRlbnQpfXN0YXRpYyBqUXVlcnlJbnRlcmZhY2UodCl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXtjb25zdCBlPXVuLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcyx0KTtpZihcInN0cmluZ1wiPT10eXBlb2YgdCl7aWYodm9pZCAwPT09ZVt0XSl0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke3R9XCJgKTtlW3RdKCl9fSkpfX1nKHVuKTtjb25zdCBmbj1cImNsaWNrLmJzLnNjcm9sbHNweVwiLHBuPVwiYWN0aXZlXCIsZ249XCJbaHJlZl1cIixtbj17b2Zmc2V0Om51bGwscm9vdE1hcmdpbjpcIjBweCAwcHggLTI1JVwiLHNtb290aFNjcm9sbDohMSx0YXJnZXQ6bnVsbCx0aHJlc2hvbGQ6Wy4xLC41LDFdfSxfbj17b2Zmc2V0OlwiKG51bWJlcnxudWxsKVwiLHJvb3RNYXJnaW46XCJzdHJpbmdcIixzbW9vdGhTY3JvbGw6XCJib29sZWFuXCIsdGFyZ2V0OlwiZWxlbWVudFwiLHRocmVzaG9sZDpcImFycmF5XCJ9O2NsYXNzIGJuIGV4dGVuZHMgentjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5fdGFyZ2V0TGlua3M9bmV3IE1hcCx0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnM9bmV3IE1hcCx0aGlzLl9yb290RWxlbWVudD1cInZpc2libGVcIj09PWdldENvbXB1dGVkU3R5bGUodGhpcy5fZWxlbWVudCkub3ZlcmZsb3dZP251bGw6dGhpcy5fZWxlbWVudCx0aGlzLl9hY3RpdmVUYXJnZXQ9bnVsbCx0aGlzLl9vYnNlcnZlcj1udWxsLHRoaXMuX3ByZXZpb3VzU2Nyb2xsRGF0YT17dmlzaWJsZUVudHJ5VG9wOjAscGFyZW50U2Nyb2xsVG9wOjB9LHRoaXMucmVmcmVzaCgpfXN0YXRpYyBnZXQgRGVmYXVsdCgpe3JldHVybiBtbn1zdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCl7cmV0dXJuIF9ufXN0YXRpYyBnZXQgTkFNRSgpe3JldHVyblwic2Nyb2xsc3B5XCJ9cmVmcmVzaCgpe3RoaXMuX2luaXRpYWxpemVUYXJnZXRzQW5kT2JzZXJ2YWJsZXMoKSx0aGlzLl9tYXliZUVuYWJsZVNtb290aFNjcm9sbCgpLHRoaXMuX29ic2VydmVyP3RoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKTp0aGlzLl9vYnNlcnZlcj10aGlzLl9nZXROZXdPYnNlcnZlcigpO2Zvcihjb25zdCB0IG9mIHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy52YWx1ZXMoKSl0aGlzLl9vYnNlcnZlci5vYnNlcnZlKHQpfWRpc3Bvc2UoKXt0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCksc3VwZXIuZGlzcG9zZSgpfV9jb25maWdBZnRlck1lcmdlKHQpe3JldHVybiB0LnRhcmdldD1yKHQudGFyZ2V0KXx8ZG9jdW1lbnQuYm9keSx0LnJvb3RNYXJnaW49dC5vZmZzZXQ/YCR7dC5vZmZzZXR9cHggMHB4IC0zMCVgOnQucm9vdE1hcmdpbixcInN0cmluZ1wiPT10eXBlb2YgdC50aHJlc2hvbGQmJih0LnRocmVzaG9sZD10LnRocmVzaG9sZC5zcGxpdChcIixcIikubWFwKCh0PT5OdW1iZXIucGFyc2VGbG9hdCh0KSkpKSx0fV9tYXliZUVuYWJsZVNtb290aFNjcm9sbCgpe3RoaXMuX2NvbmZpZy5zbW9vdGhTY3JvbGwmJihQLm9mZih0aGlzLl9jb25maWcudGFyZ2V0LGZuKSxQLm9uKHRoaXMuX2NvbmZpZy50YXJnZXQsZm4sZ24sKHQ9Pntjb25zdCBlPXRoaXMuX29ic2VydmFibGVTZWN0aW9ucy5nZXQodC50YXJnZXQuaGFzaCk7aWYoZSl7dC5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IGk9dGhpcy5fcm9vdEVsZW1lbnR8fHdpbmRvdyxuPWUub2Zmc2V0VG9wLXRoaXMuX2VsZW1lbnQub2Zmc2V0VG9wO2lmKGkuc2Nyb2xsVG8pcmV0dXJuIHZvaWQgaS5zY3JvbGxUbyh7dG9wOm4sYmVoYXZpb3I6XCJzbW9vdGhcIn0pO2kuc2Nyb2xsVG9wPW59fSkpKX1fZ2V0TmV3T2JzZXJ2ZXIoKXtjb25zdCB0PXtyb290OnRoaXMuX3Jvb3RFbGVtZW50LHRocmVzaG9sZDp0aGlzLl9jb25maWcudGhyZXNob2xkLHJvb3RNYXJnaW46dGhpcy5fY29uZmlnLnJvb3RNYXJnaW59O3JldHVybiBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKHQ9PnRoaXMuX29ic2VydmVyQ2FsbGJhY2sodCkpLHQpfV9vYnNlcnZlckNhbGxiYWNrKHQpe2NvbnN0IGU9dD0+dGhpcy5fdGFyZ2V0TGlua3MuZ2V0KGAjJHt0LnRhcmdldC5pZH1gKSxpPXQ9Pnt0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEudmlzaWJsZUVudHJ5VG9wPXQudGFyZ2V0Lm9mZnNldFRvcCx0aGlzLl9wcm9jZXNzKGUodCkpfSxuPSh0aGlzLl9yb290RWxlbWVudHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5zY3JvbGxUb3Ascz1uPj10aGlzLl9wcmV2aW91c1Njcm9sbERhdGEucGFyZW50U2Nyb2xsVG9wO3RoaXMuX3ByZXZpb3VzU2Nyb2xsRGF0YS5wYXJlbnRTY3JvbGxUb3A9bjtmb3IoY29uc3QgbyBvZiB0KXtpZighby5pc0ludGVyc2VjdGluZyl7dGhpcy5fYWN0aXZlVGFyZ2V0PW51bGwsdGhpcy5fY2xlYXJBY3RpdmVDbGFzcyhlKG8pKTtjb250aW51ZX1jb25zdCB0PW8udGFyZ2V0Lm9mZnNldFRvcD49dGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnZpc2libGVFbnRyeVRvcDtpZihzJiZ0KXtpZihpKG8pLCFuKXJldHVybn1lbHNlIHN8fHR8fGkobyl9fV9pbml0aWFsaXplVGFyZ2V0c0FuZE9ic2VydmFibGVzKCl7dGhpcy5fdGFyZ2V0TGlua3M9bmV3IE1hcCx0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnM9bmV3IE1hcDtjb25zdCB0PVEuZmluZChnbix0aGlzLl9jb25maWcudGFyZ2V0KTtmb3IoY29uc3QgZSBvZiB0KXtpZighZS5oYXNofHxsKGUpKWNvbnRpbnVlO2NvbnN0IHQ9US5maW5kT25lKGUuaGFzaCx0aGlzLl9lbGVtZW50KTthKHQpJiYodGhpcy5fdGFyZ2V0TGlua3Muc2V0KGUuaGFzaCxlKSx0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMuc2V0KGUuaGFzaCx0KSl9fV9wcm9jZXNzKHQpe3RoaXMuX2FjdGl2ZVRhcmdldCE9PXQmJih0aGlzLl9jbGVhckFjdGl2ZUNsYXNzKHRoaXMuX2NvbmZpZy50YXJnZXQpLHRoaXMuX2FjdGl2ZVRhcmdldD10LHQuY2xhc3NMaXN0LmFkZChwbiksdGhpcy5fYWN0aXZhdGVQYXJlbnRzKHQpLFAudHJpZ2dlcih0aGlzLl9lbGVtZW50LFwiYWN0aXZhdGUuYnMuc2Nyb2xsc3B5XCIse3JlbGF0ZWRUYXJnZXQ6dH0pKX1fYWN0aXZhdGVQYXJlbnRzKHQpe2lmKHQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZHJvcGRvd24taXRlbVwiKSlRLmZpbmRPbmUoXCIuZHJvcGRvd24tdG9nZ2xlXCIsdC5jbG9zZXN0KFwiLmRyb3Bkb3duXCIpKS5jbGFzc0xpc3QuYWRkKHBuKTtlbHNlIGZvcihjb25zdCBlIG9mIFEucGFyZW50cyh0LFwiLm5hdiwgLmxpc3QtZ3JvdXBcIikpZm9yKGNvbnN0IHQgb2YgUS5wcmV2KGUsXCIubmF2LWxpbmssIC5uYXYtaXRlbSA+IC5uYXYtbGluaywgLmxpc3QtZ3JvdXAtaXRlbVwiKSl0LmNsYXNzTGlzdC5hZGQocG4pfV9jbGVhckFjdGl2ZUNsYXNzKHQpe3QuY2xhc3NMaXN0LnJlbW92ZShwbik7Y29uc3QgZT1RLmZpbmQoXCJbaHJlZl0uYWN0aXZlXCIsdCk7Zm9yKGNvbnN0IHQgb2YgZSl0LmNsYXNzTGlzdC5yZW1vdmUocG4pfXN0YXRpYyBqUXVlcnlJbnRlcmZhY2UodCl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXtjb25zdCBlPWJuLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcyx0KTtpZihcInN0cmluZ1wiPT10eXBlb2YgdCl7aWYodm9pZCAwPT09ZVt0XXx8dC5zdGFydHNXaXRoKFwiX1wiKXx8XCJjb25zdHJ1Y3RvclwiPT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke3R9XCJgKTtlW3RdKCl9fSkpfX1QLm9uKHdpbmRvdyxcImxvYWQuYnMuc2Nyb2xsc3B5LmRhdGEtYXBpXCIsKCgpPT57Zm9yKGNvbnN0IHQgb2YgUS5maW5kKCdbZGF0YS1icy1zcHk9XCJzY3JvbGxcIl0nKSlibi5nZXRPckNyZWF0ZUluc3RhbmNlKHQpfSkpLGcoYm4pO2NvbnN0IHZuPVwiQXJyb3dMZWZ0XCIseW49XCJBcnJvd1JpZ2h0XCIsd249XCJBcnJvd1VwXCIsQW49XCJBcnJvd0Rvd25cIixFbj1cImFjdGl2ZVwiLFRuPVwiZmFkZVwiLENuPVwic2hvd1wiLE9uPSdbZGF0YS1icy10b2dnbGU9XCJ0YWJcIl0sIFtkYXRhLWJzLXRvZ2dsZT1cInBpbGxcIl0sIFtkYXRhLWJzLXRvZ2dsZT1cImxpc3RcIl0nLHhuPWAubmF2LWxpbms6bm90KC5kcm9wZG93bi10b2dnbGUpLCAubGlzdC1ncm91cC1pdGVtOm5vdCguZHJvcGRvd24tdG9nZ2xlKSwgW3JvbGU9XCJ0YWJcIl06bm90KC5kcm9wZG93bi10b2dnbGUpLCAke09ufWA7Y2xhc3Mga24gZXh0ZW5kcyB6e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuX3BhcmVudD10aGlzLl9lbGVtZW50LmNsb3Nlc3QoJy5saXN0LWdyb3VwLCAubmF2LCBbcm9sZT1cInRhYmxpc3RcIl0nKSx0aGlzLl9wYXJlbnQmJih0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlcyh0aGlzLl9wYXJlbnQsdGhpcy5fZ2V0Q2hpbGRyZW4oKSksUC5vbih0aGlzLl9lbGVtZW50LFwia2V5ZG93bi5icy50YWJcIiwodD0+dGhpcy5fa2V5ZG93bih0KSkpKX1zdGF0aWMgZ2V0IE5BTUUoKXtyZXR1cm5cInRhYlwifXNob3coKXtjb25zdCB0PXRoaXMuX2VsZW1lbnQ7aWYodGhpcy5fZWxlbUlzQWN0aXZlKHQpKXJldHVybjtjb25zdCBlPXRoaXMuX2dldEFjdGl2ZUVsZW0oKSxpPWU/UC50cmlnZ2VyKGUsXCJoaWRlLmJzLnRhYlwiLHtyZWxhdGVkVGFyZ2V0OnR9KTpudWxsO1AudHJpZ2dlcih0LFwic2hvdy5icy50YWJcIix7cmVsYXRlZFRhcmdldDplfSkuZGVmYXVsdFByZXZlbnRlZHx8aSYmaS5kZWZhdWx0UHJldmVudGVkfHwodGhpcy5fZGVhY3RpdmF0ZShlLHQpLHRoaXMuX2FjdGl2YXRlKHQsZSkpfV9hY3RpdmF0ZSh0LGUpe3QmJih0LmNsYXNzTGlzdC5hZGQoRW4pLHRoaXMuX2FjdGl2YXRlKG4odCkpLHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCgpPT57XCJ0YWJcIj09PXQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKT8odC5yZW1vdmVBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSx0LnNldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIiwhMCksdGhpcy5fdG9nZ2xlRHJvcERvd24odCwhMCksUC50cmlnZ2VyKHQsXCJzaG93bi5icy50YWJcIix7cmVsYXRlZFRhcmdldDplfSkpOnQuY2xhc3NMaXN0LmFkZChDbil9KSx0LHQuY2xhc3NMaXN0LmNvbnRhaW5zKFRuKSkpfV9kZWFjdGl2YXRlKHQsZSl7dCYmKHQuY2xhc3NMaXN0LnJlbW92ZShFbiksdC5ibHVyKCksdGhpcy5fZGVhY3RpdmF0ZShuKHQpKSx0aGlzLl9xdWV1ZUNhbGxiYWNrKCgoKT0+e1widGFiXCI9PT10LmdldEF0dHJpYnV0ZShcInJvbGVcIik/KHQuc2V0QXR0cmlidXRlKFwiYXJpYS1zZWxlY3RlZFwiLCExKSx0LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsXCItMVwiKSx0aGlzLl90b2dnbGVEcm9wRG93bih0LCExKSxQLnRyaWdnZXIodCxcImhpZGRlbi5icy50YWJcIix7cmVsYXRlZFRhcmdldDplfSkpOnQuY2xhc3NMaXN0LnJlbW92ZShDbil9KSx0LHQuY2xhc3NMaXN0LmNvbnRhaW5zKFRuKSkpfV9rZXlkb3duKHQpe2lmKCFbdm4seW4sd24sQW5dLmluY2x1ZGVzKHQua2V5KSlyZXR1cm47dC5zdG9wUHJvcGFnYXRpb24oKSx0LnByZXZlbnREZWZhdWx0KCk7Y29uc3QgZT1beW4sQW5dLmluY2x1ZGVzKHQua2V5KSxpPWIodGhpcy5fZ2V0Q2hpbGRyZW4oKS5maWx0ZXIoKHQ9PiFsKHQpKSksdC50YXJnZXQsZSwhMCk7aSYmKGkuZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KSxrbi5nZXRPckNyZWF0ZUluc3RhbmNlKGkpLnNob3coKSl9X2dldENoaWxkcmVuKCl7cmV0dXJuIFEuZmluZCh4bix0aGlzLl9wYXJlbnQpfV9nZXRBY3RpdmVFbGVtKCl7cmV0dXJuIHRoaXMuX2dldENoaWxkcmVuKCkuZmluZCgodD0+dGhpcy5fZWxlbUlzQWN0aXZlKHQpKSl8fG51bGx9X3NldEluaXRpYWxBdHRyaWJ1dGVzKHQsZSl7dGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHModCxcInJvbGVcIixcInRhYmxpc3RcIik7Zm9yKGNvbnN0IHQgb2YgZSl0aGlzLl9zZXRJbml0aWFsQXR0cmlidXRlc09uQ2hpbGQodCl9X3NldEluaXRpYWxBdHRyaWJ1dGVzT25DaGlsZCh0KXt0PXRoaXMuX2dldElubmVyRWxlbWVudCh0KTtjb25zdCBlPXRoaXMuX2VsZW1Jc0FjdGl2ZSh0KSxpPXRoaXMuX2dldE91dGVyRWxlbWVudCh0KTt0LnNldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIixlKSxpIT09dCYmdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMoaSxcInJvbGVcIixcInByZXNlbnRhdGlvblwiKSxlfHx0LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsXCItMVwiKSx0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyh0LFwicm9sZVwiLFwidGFiXCIpLHRoaXMuX3NldEluaXRpYWxBdHRyaWJ1dGVzT25UYXJnZXRQYW5lbCh0KX1fc2V0SW5pdGlhbEF0dHJpYnV0ZXNPblRhcmdldFBhbmVsKHQpe2NvbnN0IGU9bih0KTtlJiYodGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMoZSxcInJvbGVcIixcInRhYnBhbmVsXCIpLHQuaWQmJnRoaXMuX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKGUsXCJhcmlhLWxhYmVsbGVkYnlcIixgIyR7dC5pZH1gKSl9X3RvZ2dsZURyb3BEb3duKHQsZSl7Y29uc3QgaT10aGlzLl9nZXRPdXRlckVsZW1lbnQodCk7aWYoIWkuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZHJvcGRvd25cIikpcmV0dXJuO2NvbnN0IG49KHQsbik9Pntjb25zdCBzPVEuZmluZE9uZSh0LGkpO3MmJnMuY2xhc3NMaXN0LnRvZ2dsZShuLGUpfTtuKFwiLmRyb3Bkb3duLXRvZ2dsZVwiLEVuKSxuKFwiLmRyb3Bkb3duLW1lbnVcIixDbiksaS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIsZSl9X3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKHQsZSxpKXt0Lmhhc0F0dHJpYnV0ZShlKXx8dC5zZXRBdHRyaWJ1dGUoZSxpKX1fZWxlbUlzQWN0aXZlKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucyhFbil9X2dldElubmVyRWxlbWVudCh0KXtyZXR1cm4gdC5tYXRjaGVzKHhuKT90OlEuZmluZE9uZSh4bix0KX1fZ2V0T3V0ZXJFbGVtZW50KHQpe3JldHVybiB0LmNsb3Nlc3QoXCIubmF2LWl0ZW0sIC5saXN0LWdyb3VwLWl0ZW1cIil8fHR9c3RhdGljIGpRdWVyeUludGVyZmFjZSh0KXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe2NvbnN0IGU9a24uZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKTtpZihcInN0cmluZ1wiPT10eXBlb2YgdCl7aWYodm9pZCAwPT09ZVt0XXx8dC5zdGFydHNXaXRoKFwiX1wiKXx8XCJjb25zdHJ1Y3RvclwiPT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke3R9XCJgKTtlW3RdKCl9fSkpfX1QLm9uKGRvY3VtZW50LFwiY2xpY2suYnMudGFiXCIsT24sKGZ1bmN0aW9uKHQpe1tcIkFcIixcIkFSRUFcIl0uaW5jbHVkZXModGhpcy50YWdOYW1lKSYmdC5wcmV2ZW50RGVmYXVsdCgpLGwodGhpcyl8fGtuLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykuc2hvdygpfSkpLFAub24od2luZG93LFwibG9hZC5icy50YWJcIiwoKCk9Pntmb3IoY29uc3QgdCBvZiBRLmZpbmQoJy5hY3RpdmVbZGF0YS1icy10b2dnbGU9XCJ0YWJcIl0sIC5hY3RpdmVbZGF0YS1icy10b2dnbGU9XCJwaWxsXCJdLCAuYWN0aXZlW2RhdGEtYnMtdG9nZ2xlPVwibGlzdFwiXScpKWtuLmdldE9yQ3JlYXRlSW5zdGFuY2UodCl9KSksZyhrbik7Y29uc3QgTG49XCJoaWRlXCIsRG49XCJzaG93XCIsU249XCJzaG93aW5nXCIsSW49e2FuaW1hdGlvbjpcImJvb2xlYW5cIixhdXRvaGlkZTpcImJvb2xlYW5cIixkZWxheTpcIm51bWJlclwifSxObj17YW5pbWF0aW9uOiEwLGF1dG9oaWRlOiEwLGRlbGF5OjVlM307Y2xhc3MgUG4gZXh0ZW5kcyB6e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLl90aW1lb3V0PW51bGwsdGhpcy5faGFzTW91c2VJbnRlcmFjdGlvbj0hMSx0aGlzLl9oYXNLZXlib2FyZEludGVyYWN0aW9uPSExLHRoaXMuX3NldExpc3RlbmVycygpfXN0YXRpYyBnZXQgRGVmYXVsdCgpe3JldHVybiBObn1zdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCl7cmV0dXJuIElufXN0YXRpYyBnZXQgTkFNRSgpe3JldHVyblwidG9hc3RcIn1zaG93KCl7UC50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsXCJzaG93LmJzLnRvYXN0XCIpLmRlZmF1bHRQcmV2ZW50ZWR8fCh0aGlzLl9jbGVhclRpbWVvdXQoKSx0aGlzLl9jb25maWcuYW5pbWF0aW9uJiZ0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJmYWRlXCIpLHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShMbiksZCh0aGlzLl9lbGVtZW50KSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG4sU24pLHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCgpPT57dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFNuKSxQLnRyaWdnZXIodGhpcy5fZWxlbWVudCxcInNob3duLmJzLnRvYXN0XCIpLHRoaXMuX21heWJlU2NoZWR1bGVIaWRlKCl9KSx0aGlzLl9lbGVtZW50LHRoaXMuX2NvbmZpZy5hbmltYXRpb24pKX1oaWRlKCl7dGhpcy5pc1Nob3duKCkmJihQLnRyaWdnZXIodGhpcy5fZWxlbWVudCxcImhpZGUuYnMudG9hc3RcIikuZGVmYXVsdFByZXZlbnRlZHx8KHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChTbiksdGhpcy5fcXVldWVDYWxsYmFjaygoKCk9Pnt0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoTG4pLHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShTbixEbiksUC50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsXCJoaWRkZW4uYnMudG9hc3RcIil9KSx0aGlzLl9lbGVtZW50LHRoaXMuX2NvbmZpZy5hbmltYXRpb24pKSl9ZGlzcG9zZSgpe3RoaXMuX2NsZWFyVGltZW91dCgpLHRoaXMuaXNTaG93bigpJiZ0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoRG4pLHN1cGVyLmRpc3Bvc2UoKX1pc1Nob3duKCl7cmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKERuKX1fbWF5YmVTY2hlZHVsZUhpZGUoKXt0aGlzLl9jb25maWcuYXV0b2hpZGUmJih0aGlzLl9oYXNNb3VzZUludGVyYWN0aW9ufHx0aGlzLl9oYXNLZXlib2FyZEludGVyYWN0aW9ufHwodGhpcy5fdGltZW91dD1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuaGlkZSgpfSksdGhpcy5fY29uZmlnLmRlbGF5KSkpfV9vbkludGVyYWN0aW9uKHQsZSl7c3dpdGNoKHQudHlwZSl7Y2FzZVwibW91c2VvdmVyXCI6Y2FzZVwibW91c2VvdXRcIjp0aGlzLl9oYXNNb3VzZUludGVyYWN0aW9uPWU7YnJlYWs7Y2FzZVwiZm9jdXNpblwiOmNhc2VcImZvY3Vzb3V0XCI6dGhpcy5faGFzS2V5Ym9hcmRJbnRlcmFjdGlvbj1lfWlmKGUpcmV0dXJuIHZvaWQgdGhpcy5fY2xlYXJUaW1lb3V0KCk7Y29uc3QgaT10LnJlbGF0ZWRUYXJnZXQ7dGhpcy5fZWxlbWVudD09PWl8fHRoaXMuX2VsZW1lbnQuY29udGFpbnMoaSl8fHRoaXMuX21heWJlU2NoZWR1bGVIaWRlKCl9X3NldExpc3RlbmVycygpe1Aub24odGhpcy5fZWxlbWVudCxcIm1vdXNlb3Zlci5icy50b2FzdFwiLCh0PT50aGlzLl9vbkludGVyYWN0aW9uKHQsITApKSksUC5vbih0aGlzLl9lbGVtZW50LFwibW91c2VvdXQuYnMudG9hc3RcIiwodD0+dGhpcy5fb25JbnRlcmFjdGlvbih0LCExKSkpLFAub24odGhpcy5fZWxlbWVudCxcImZvY3VzaW4uYnMudG9hc3RcIiwodD0+dGhpcy5fb25JbnRlcmFjdGlvbih0LCEwKSkpLFAub24odGhpcy5fZWxlbWVudCxcImZvY3Vzb3V0LmJzLnRvYXN0XCIsKHQ9PnRoaXMuX29uSW50ZXJhY3Rpb24odCwhMSkpKX1fY2xlYXJUaW1lb3V0KCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpLHRoaXMuX3RpbWVvdXQ9bnVsbH1zdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7Y29uc3QgZT1Qbi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsdCk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe2lmKHZvaWQgMD09PWVbdF0pdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHt0fVwiYCk7ZVt0XSh0aGlzKX19KSl9fXJldHVybiBxKFBuKSxnKFBuKSx7QWxlcnQ6UixCdXR0b246SyxDYXJvdXNlbDphdCxDb2xsYXBzZTpwdCxEcm9wZG93bjpoaSxNb2RhbDpOaSxPZmZjYW52YXM6emksUG9wb3Zlcjp1bixTY3JvbGxTcHk6Ym4sVGFiOmtuLFRvYXN0OlBuLFRvb2x0aXA6Y259fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Ym9vdHN0cmFwLmJ1bmRsZS5taW4uanMubWFwIiwiKGZ1bmN0aW9uKCkge1xuICB2YXIgQ2Fyb3VzZWwsIGRvbXJlYWR5O1xuXG4gIGRvbXJlYWR5ID0gcmVxdWlyZSgnZG9tcmVhZHknKTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IENhcm91c2VsID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIENhcm91c2VsKHNlbGVjdG9yKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgICAgaWYgKCF0aGlzLnNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJQbGVhc2Ugc3BlY2lmeSBhIENTUyBzZWxlY3RvciB3aGVuIGNyZWF0aW5nIGEgbmV3IENhcm91c2VsLCAgICAgICAgZS5nLiBuZXcgQ2Fyb3VzZWwoJyNteS1jYXJvdXNlbCcpXCIpO1xuICAgICAgfVxuICAgICAgZG9tcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICAgIF90aGlzLnNsaWRlX2NvdW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIlwiICsgX3RoaXMuc2VsZWN0b3IgKyBcIiA+ICpcIikubGVuZ3RoO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIHZhciBfcmVmLCBfcmVmMTtcbiAgICAgICAgICBpZiAoKF9yZWYgPSBldmVudC5rZXlDb2RlKSA9PT0gMzkgfHwgX3JlZiA9PT0gNDApIHtcbiAgICAgICAgICAgIF90aGlzLm5leHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKChfcmVmMSA9IGV2ZW50LmtleUNvZGUpID09PSAzNyB8fCBfcmVmMSA9PT0gMzgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5wcmV2KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIF90aGlzLmdldE9mZnNldCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgQ2Fyb3VzZWwucHJvdG90eXBlLmdldE9mZnNldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5vZmZzZXQgPSBwYXJzZUludChkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCAvIHdpbmRvdy5pbm5lckhlaWdodCk7XG4gICAgICBpZiAoKGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wICUgd2luZG93LmlubmVySGVpZ2h0KSA+IHdpbmRvdy5pbm5lckhlaWdodCAvIDIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0Kys7XG4gICAgICB9XG4gICAgfTtcblxuICAgIENhcm91c2VsLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmdldE9mZnNldCgpO1xuICAgICAgaWYgKHRoaXMub2Zmc2V0ICE9PSB0aGlzLnNsaWRlX2NvdW50IC0gMSkge1xuICAgICAgICB0aGlzLm9mZnNldCsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0ZSgpO1xuICAgIH07XG5cbiAgICBDYXJvdXNlbC5wcm90b3R5cGUucHJldiA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5nZXRPZmZzZXQoKTtcbiAgICAgIGlmICh0aGlzLm9mZnNldCAhPT0gMCkge1xuICAgICAgICB0aGlzLm9mZnNldC0tO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0ZSgpO1xuICAgIH07XG5cbiAgICBDYXJvdXNlbC5wcm90b3R5cGUuYW5pbWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHR5cGVvZiBqUXVlcnkgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcmV0dXJuICQoXCJodG1sLCBib2R5XCIpLmFuaW1hdGUoe1xuICAgICAgICAgIHNjcm9sbFRvcDogd2luZG93LmlubmVySGVpZ2h0ICogdGhpcy5vZmZzZXRcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSB3aW5kb3cuaW5uZXJIZWlnaHQgKiB0aGlzLm9mZnNldDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIENhcm91c2VsO1xuXG4gIH0pKCk7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCJmdW5jdGlvbiBjb2xsYXBzZShvLCBkaXIpIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBTZWxlY3Rpb24pIHtcbiAgICB2YXIgciA9IG8uZ2V0UmFuZ2VBdCgwKTtcbiAgICByLmNvbGxhcHNlKGRpcik7XG4gICAgby5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBvLmFkZFJhbmdlKHIpO1xuICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSYW5nZSkge1xuICAgIG8uY29sbGFwc2UoZGlyKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGFyZ3VtZW50IHR5cGUuJyk7XG4gIH1cbn1cblxuY29sbGFwc2UudG9FbmQgPSBmdW5jdGlvbihvKSB7XG4gIGNvbGxhcHNlKG8sIGZhbHNlKTtcbn1cblxuY29sbGFwc2UudG9TdGFydCA9IGZ1bmN0aW9uKG8pIHtcbiAgY29sbGFwc2UobywgdHJ1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29sbGFwc2U7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgdW5jdXJyeVRoaXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tc3RyaW5nJyk7XG52YXIgdHJpbSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctdHJpbScpLnRyaW07XG52YXIgd2hpdGVzcGFjZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMnKTtcblxudmFyICRwYXJzZUludCA9IGdsb2JhbC5wYXJzZUludDtcbnZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIElURVJBVE9SID0gU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBoZXggPSAvXlsrLV0/MHgvaTtcbnZhciBleGVjID0gdW5jdXJyeVRoaXMoaGV4LmV4ZWMpO1xudmFyIEZPUkNFRCA9ICRwYXJzZUludCh3aGl0ZXNwYWNlcyArICcwOCcpICE9PSA4IHx8ICRwYXJzZUludCh3aGl0ZXNwYWNlcyArICcweDE2JykgIT09IDIyXG4gIC8vIE1TIEVkZ2UgMTgtIGJyb2tlbiB3aXRoIGJveGVkIHN5bWJvbHNcbiAgfHwgKElURVJBVE9SICYmICFmYWlscyhmdW5jdGlvbiAoKSB7ICRwYXJzZUludChPYmplY3QoSVRFUkFUT1IpKTsgfSkpO1xuXG4vLyBgcGFyc2VJbnRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wYXJzZWludC1zdHJpbmctcmFkaXhcbm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEID8gZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLCByYWRpeCkge1xuICB2YXIgUyA9IHRyaW0odG9TdHJpbmcoc3RyaW5nKSk7XG4gIHJldHVybiAkcGFyc2VJbnQoUywgKHJhZGl4ID4+PiAwKSB8fCAoZXhlYyhoZXgsIFMpID8gMTYgOiAxMCkpO1xufSA6ICRwYXJzZUludDtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcblxuLy8gYEFycmF5LmlzQXJyYXlgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5pc2FycmF5XG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBzdGF0OiB0cnVlIH0sIHtcbiAgaXNBcnJheTogaXNBcnJheVxufSk7XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBGVU5DVElPTl9OQU1FX0VYSVNUUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1uYW1lJykuRVhJU1RTO1xudmFyIHVuY3VycnlUaGlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcycpO1xudmFyIGRlZmluZUJ1aWx0SW5BY2Nlc3NvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3InKTtcblxudmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyhGdW5jdGlvblByb3RvdHlwZS50b1N0cmluZyk7XG52YXIgbmFtZVJFID0gL2Z1bmN0aW9uXFxiKD86XFxzfFxcL1xcKltcXFNcXHNdKj9cXCpcXC98XFwvXFwvW15cXG5cXHJdKltcXG5cXHJdKykqKFteXFxzKC9dKikvO1xudmFyIHJlZ0V4cEV4ZWMgPSB1bmN1cnJ5VGhpcyhuYW1lUkUuZXhlYyk7XG52YXIgTkFNRSA9ICduYW1lJztcblxuLy8gRnVuY3Rpb24gaW5zdGFuY2VzIGAubmFtZWAgcHJvcGVydHlcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZnVuY3Rpb24taW5zdGFuY2VzLW5hbWVcbmlmIChERVNDUklQVE9SUyAmJiAhRlVOQ1RJT05fTkFNRV9FWElTVFMpIHtcbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKEZ1bmN0aW9uUHJvdG90eXBlLCBOQU1FLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlZ0V4cEV4ZWMobmFtZVJFLCBmdW5jdGlvblRvU3RyaW5nKHRoaXMpKVsxXTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIiwidmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL251bWJlci1wYXJzZS1pbnQnKTtcblxuLy8gYHBhcnNlSW50YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VpbnQtc3RyaW5nLXJhZGl4XG4kKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IHBhcnNlSW50ICE9ICRwYXJzZUludCB9LCB7XG4gIHBhcnNlSW50OiAkcGFyc2VJbnRcbn0pO1xuIiwiLyohXG4gICogZG9tcmVhZHkgKGMpIER1c3RpbiBEaWF6IDIwMTIgLSBMaWNlbnNlIE1JVFxuICAqL1xuIWZ1bmN0aW9uIChuYW1lLCBkZWZpbml0aW9uKSB7XG4gIGlmICh0eXBlb2YgbW9kdWxlICE9ICd1bmRlZmluZWQnKSBtb2R1bGUuZXhwb3J0cyA9IGRlZmluaXRpb24oKVxuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcpIGRlZmluZShkZWZpbml0aW9uKVxuICBlbHNlIHRoaXNbbmFtZV0gPSBkZWZpbml0aW9uKClcbn0oJ2RvbXJlYWR5JywgZnVuY3Rpb24gKHJlYWR5KSB7XG5cbiAgdmFyIGZucyA9IFtdLCBmbiwgZiA9IGZhbHNlXG4gICAgLCBkb2MgPSBkb2N1bWVudFxuICAgICwgdGVzdEVsID0gZG9jLmRvY3VtZW50RWxlbWVudFxuICAgICwgaGFjayA9IHRlc3RFbC5kb1Njcm9sbFxuICAgICwgZG9tQ29udGVudExvYWRlZCA9ICdET01Db250ZW50TG9hZGVkJ1xuICAgICwgYWRkRXZlbnRMaXN0ZW5lciA9ICdhZGRFdmVudExpc3RlbmVyJ1xuICAgICwgb25yZWFkeXN0YXRlY2hhbmdlID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSdcbiAgICAsIHJlYWR5U3RhdGUgPSAncmVhZHlTdGF0ZSdcbiAgICAsIGxvYWRlZFJneCA9IGhhY2sgPyAvXmxvYWRlZHxeYy8gOiAvXmxvYWRlZHxjL1xuICAgICwgbG9hZGVkID0gbG9hZGVkUmd4LnRlc3QoZG9jW3JlYWR5U3RhdGVdKVxuXG4gIGZ1bmN0aW9uIGZsdXNoKGYpIHtcbiAgICBsb2FkZWQgPSAxXG4gICAgd2hpbGUgKGYgPSBmbnMuc2hpZnQoKSkgZigpXG4gIH1cblxuICBkb2NbYWRkRXZlbnRMaXN0ZW5lcl0gJiYgZG9jW2FkZEV2ZW50TGlzdGVuZXJdKGRvbUNvbnRlbnRMb2FkZWQsIGZuID0gZnVuY3Rpb24gKCkge1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKGRvbUNvbnRlbnRMb2FkZWQsIGZuLCBmKVxuICAgIGZsdXNoKClcbiAgfSwgZilcblxuXG4gIGhhY2sgJiYgZG9jLmF0dGFjaEV2ZW50KG9ucmVhZHlzdGF0ZWNoYW5nZSwgZm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKC9eYy8udGVzdChkb2NbcmVhZHlTdGF0ZV0pKSB7XG4gICAgICBkb2MuZGV0YWNoRXZlbnQob25yZWFkeXN0YXRlY2hhbmdlLCBmbilcbiAgICAgIGZsdXNoKClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIChyZWFkeSA9IGhhY2sgP1xuICAgIGZ1bmN0aW9uIChmbikge1xuICAgICAgc2VsZiAhPSB0b3AgP1xuICAgICAgICBsb2FkZWQgPyBmbigpIDogZm5zLnB1c2goZm4pIDpcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0ZXN0RWwuZG9TY3JvbGwoJ2xlZnQnKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyByZWFkeShmbikgfSwgNTApXG4gICAgICAgICAgfVxuICAgICAgICAgIGZuKClcbiAgICAgICAgfSgpXG4gICAgfSA6XG4gICAgZnVuY3Rpb24gKGZuKSB7XG4gICAgICBsb2FkZWQgPyBmbigpIDogZm5zLnB1c2goZm4pXG4gICAgfSlcbn0pXG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iXSwic291cmNlUm9vdCI6IiJ9